def _get_nautobot_record(
         cls,
         diffsync_model: DiffSyncModel,
         diffsync_value: Any,
         fail_quiet: bool = False) -> Optional[models.Model]:
     """Given a diffsync model and identifier (natural key or primary key) look up the Nautobot record."""
     try:
         if isinstance(diffsync_value, dict):
             # Handle nested natural key references (e.g. Group -> Permission -> ContentType)
             for key, value in diffsync_value.items():
                 if isinstance(value, dict):
                     diffsync_value[key] = getattr(
                         diffsync_model.nautobot_model(),
                         key).get_queryset().get(**value)
             return diffsync_model.nautobot_model().objects.get(
                 **diffsync_value)
         # Else, assume it's a primary key value
         return diffsync_model.nautobot_model().objects.get(
             pk=diffsync_value)
     except ObjectDoesNotExist:
         log = logger.debug if fail_quiet else logger.error
         log(
             "Expected but did not find an existing Nautobot record",
             source=cls.get_type(),
             target=diffsync_model.get_type(),
             unique_id=diffsync_value,
         )
     return None
Пример #2
0
def test_diffsync_get_with_generic_model(generic_diffsync,
                                         generic_diffsync_model):
    generic_diffsync.add(generic_diffsync_model)
    # The generic_diffsync_model has an empty identifier/unique-id
    assert generic_diffsync.get(DiffSyncModel, "") == generic_diffsync_model
    assert generic_diffsync.get(DiffSyncModel.get_type(),
                                "") == generic_diffsync_model
    # DiffSync doesn't know how to construct a uid str for a "diffsyncmodel" (it needs the class or instance, not a str)
    with pytest.raises(ValueError):
        generic_diffsync.get(DiffSyncModel.get_type(), {})
    # Wrong object-type - no match
    with pytest.raises(ObjectNotFound):
        generic_diffsync.get("", "")
    # Wrong unique-id - no match
    with pytest.raises(ObjectNotFound):
        generic_diffsync.get(DiffSyncModel, "myname")
Пример #3
0
 def add(self, obj: DiffSyncModel):
     """Add a DiffSync model to the store, as well as registering it by PK for fast later retrieval."""
     # Store it by PK *before* we attempt to add it to the parent datastore,
     # in case we have duplicate objects with the same unique_id but different PKs.
     modelname = obj.get_type()
     if obj.pk in self._data_by_pk[modelname]:
         raise ObjectAlreadyExists(f"Object {modelname} with pk {obj.pk} already loaded")
     self._data_by_pk[modelname][obj.pk] = obj
     super().add(obj)
Пример #4
0
def test_diffsync_get_all_with_generic_model(generic_diffsync,
                                             generic_diffsync_model):
    generic_diffsync.add(generic_diffsync_model)
    assert list(
        generic_diffsync.get_all(DiffSyncModel)) == [generic_diffsync_model]
    assert list(generic_diffsync.get_all(
        DiffSyncModel.get_type())) == [generic_diffsync_model]
    # Wrong object-type - no match
    assert list(generic_diffsync.get_all("anything")) == []
Пример #5
0
def test_diffsync_get_by_uids_with_generic_model(generic_diffsync,
                                                 generic_diffsync_model):
    generic_diffsync.add(generic_diffsync_model)
    assert generic_diffsync.get_by_uids(
        [""], DiffSyncModel) == [generic_diffsync_model]
    assert generic_diffsync.get_by_uids(
        [""], DiffSyncModel.get_type()) == [generic_diffsync_model]
    # Wrong unique-id - no match
    with pytest.raises(ObjectNotFound):
        generic_diffsync.get_by_uids(["myname"], DiffSyncModel)
    # Valid unique-id mixed in with unknown ones
    with pytest.raises(ObjectNotFound):
        generic_diffsync.get_by_uids(["aname", "", "anothername"],
                                     DiffSyncModel)
Пример #6
0
def generic_diffsync_model():
    """Provide a generic DiffSyncModel instance."""
    return DiffSyncModel()