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
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")
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)
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")) == []
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)
def generic_diffsync_model(): """Provide a generic DiffSyncModel instance.""" return DiffSyncModel()