Skip to content

When multiple platforms with Meraki in their name exists the signals.py throws an error during Nautobot startup. #1159

@swanandtambe

Description

@swanandtambe

Environment

  • Python version: 3.12
  • Nautobot version: 3.0.6
  • nautobot-ssot version: 4.1.0/latest

Expected Behavior

Nautobot deploys initializes without error

Observed Behavior

Nautobot during initialization when running signals.py for Meraki integration gives the following traceback. The instance has multiple platforms with Meraki in their name

Traceback (most recent call last):                                                                                                                                    │
│   File "/usr/local/bin/nautobot-server", line 8, in <module>                                                                                                          │
│     sys.exit(main())                                                                                                                                                  │
│              ~~~~^^                                                                                                                                                   │
│   File "/usr/local/lib/python3.13/site-packages/nautobot/core/cli/__init__.py", line 346, in main                                                                     │
│     execute_from_command_line([sys.argv[0], *unparsed_args])                                                                                                          │
│     ~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^                                                                                                          │
│   File "/usr/local/lib/python3.13/site-packages/django/core/management/__init__.py", line 442, in execute_from_command_line                                           │
│     utility.execute()                                                                                                                                                 │
│     ~~~~~~~~~~~~~~~^^                                                                                                                                                 │
│   File "/usr/local/lib/python3.13/site-packages/django/core/management/__init__.py", line 436, in execute                                                             │
│     self.fetch_command(subcommand).run_from_argv(self.argv)                                                                                                           │
│     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^                                                                                                           │
│   File "/usr/local/lib/python3.13/site-packages/django/core/management/base.py", line 412, in run_from_argv                                                           │
│     self.execute(*args, **cmd_options)                                                                                                                                │
│     ~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^                                                                                                                                │
│   File "/usr/local/lib/python3.13/site-packages/django/core/management/base.py", line 458, in execute                                                                 │
│     output = self.handle(*args, **options)                                                                                                                            │
│   File "/usr/local/lib/python3.13/site-packages/nautobot/core/management/commands/post_upgrade.py", line 91, in handle                                                │
│     call_command(                                                                                                                                                     │
│     ~~~~~~~~~~~~^                                                                                                                                                     │
│         "migrate",                                                                                                                                                    │
│         ^^^^^^^^^^                                                                                                                                                    │
│     ...<3 lines>...              

verbosity=options["verbosity"],                                                                                                                               │
│         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^                                                                                                                               │
│     )                                                                                                                                                                 │
│     ^                                                                                                                                                                 │
│   File "/usr/local/lib/python3.13/site-packages/django/core/management/__init__.py", line 194, in call_command                                                        │
│     return command.execute(*args, **defaults)                                                                                                                         │
│            ~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^                                                                                                                         │
│   File "/usr/local/lib/python3.13/site-packages/django/core/management/base.py", line 458, in execute                                                                 │
│     output = self.handle(*args, **options)                                                                                                                            │
│   File "/usr/local/lib/python3.13/site-packages/django/core/management/base.py", line 106, in wrapper                                                                 │
│     res = handle_func(*args, **kwargs)                                                                                                                                │
│   File "/usr/local/lib/python3.13/site-packages/django/core/management/commands/migrate.py", line 383, in handle                                                      │
│     emit_post_migrate_signal(                                                                                                                                         │
│     ~~~~~~~~~~~~~~~~~~~~~~~~^                                                                                                                                         │
│         self.verbosity,                                                                                                                                               │
│         ^^^^^^^^^^^^^^^                                                                                                                                               │
│     ...<4 lines>...                                                                                                                                                   │
│         plan=plan,                                                                                                                                                    │
│         ^^^^^^^^^^                                                                                                                                                    │
│     )                                                                                                                                                                 │
│     ^                                                                                                                                                                 │
│   File "/usr/local/lib/python3.13/site-packages/django/core/management/sql.py", line 52, in emit_post_migrate_signal                                                  │
│     models.signals.post_migrate.send(                                                                                                                                 │
│     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^                                                                                                                                 │
│         sender=app_config,                                                                                                                                            │
│         ^^^^^^^^^^^^^^^^^^                                                                                                                                            │
│     ...<4 lines>...                                                                                                                                                   │
│         **kwargs,                                                                                                                                                     │
│         ^^^^^^^^^                                                                                                                                                     │
│     )                                                                                                                                                                 │
│     ^                           
File "/usr/local/lib/python3.13/site-packages/django/dispatch/dispatcher.py", line 177, in send                                                                     │
│     (receiver, receiver(signal=self, sender=sender, **named))                                                                                                         │
│                ~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^                                                                                                          │
│   File "/usr/local/lib/python3.13/site-packages/nautobot/core/apps/__init__.py", line 310, in post_migrate_send_nautobot_database_ready                               │
│     nautobot_database_ready.send(sender=app_conf, app_config=app_conf, **kwargs)                                                                                      │
│     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^                                                                                      │
│   File "/usr/local/lib/python3.13/site-packages/django/dispatch/dispatcher.py", line 177, in send                                                                     │
│     (receiver, receiver(signal=self, sender=sender, **named))                                                                                                         │
│                ~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^                                                                                                          │
│   File "/usr/local/lib/python3.13/site-packages/nautobot_ssot/integrations/meraki/signals.py", line 33, in nautobot_database_ready_callback                           │
│     Platform.objects.update_or_create(name__icontains="Meraki", defaults=plat_dict)                                                                                   │
│     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^                                                                                   │
│   File "/usr/local/lib/python3.13/site-packages/django/db/models/manager.py", line 87, in manager_method                                                              │
│     return getattr(self.get_queryset(), name)(*args, **kwargs)                                                                                                        │
│            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^                                                                                                        │
│   File "/usr/local/lib/python3.13/site-packages/django/db/models/query.py", line 951, in update_or_create                                                             │
│     obj, created = self.select_for_update().get_or_create(defaults, **kwargs)                                                                                         │
│                    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^                                                                                         │
│   File "/usr/local/lib/python3.13/site-packages/django/db/models/query.py", line 918, in get_or_create                                                                │
│     return self.get(**kwargs), False                                                                                                                                  │
│            ~~~~~~~~^^^^^^^^^^                                                                                                                                         │
│   File "/usr/local/lib/python3.13/site-packages/django/db/models/query.py", line 642, in get                                                                          │
│     raise self.model.MultipleObjectsReturned(                                                                                                                         │
│     ...<5 lines>...                                                                                                                                                   │
│     )                                                                                                                                                                 │
│ __fake__.Platform.MultipleObjectsReturned: get() returned more than one Platform -- it returned 5!

Steps to Reproduce

  1. Create multiple platforms with Meraki in the name field.
  2. Redeploy Nautobot so that the signals.py for Meraki integration is triggered.

Metadata

Metadata

Assignees

No one assigned

    Labels

    type: bugIssues/PRs addressing a bug.

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions