def get_collection(self): resource_defs = {'Frob': {'identifiers': []}} # Build up a resource def identifier list based on what # the collection is expecting to be required from its # definition. This saves a bunch of repetitive typing # and lets you just define a collection in the tests # below. Any identifiers you expect to be availabe in # the resource definition will automatically be there. resource_def = self.collection_def.get('resource', {}) for identifier in resource_def.get('identifiers', []): resource_defs['Frob']['identifiers'].append( {'name': identifier['target']}) collection_model = Collection('test', self.collection_def, resource_defs) collection = CollectionManager( collection_model=collection_model, parent=self.parent, factory=self.factory, service_context=ServiceContext( service_name='test', service_model=self.service_model, resource_json_definitions=resource_defs, service_waiter_model=None)) return collection
def retrieve_sub_resources( session, resource) -> Generator[Boto3ServiceResource, None, None]: loader = session._session.get_component('data_loader') json_resource_model = loader.load_service_model(resource.meta.service_name, 'resources-1') service_model = resource.meta.client.meta.service_model try: service_waiter_model = session._session.get_waiter_model( service_model.service_name) except UnknownServiceError: service_waiter_model = None for name in json_resource_model['resources']: resource_model = json_resource_model['resources'][name] cls = session.resource_factory.load_from_definition( resource_name=name, single_resource_json_definition=resource_model, service_context=ServiceContext( service_name=resource.meta.service_name, resource_json_definitions=json_resource_model['resources'], service_model=service_model, service_waiter_model=service_waiter_model)) identifiers = cls.meta.resource_model.identifiers args = [] for _ in identifiers: args.append('foo') yield cls(*args, client=boto3.client(resource.meta.service_name))
def _document_resources(self, section): temp_identifier_value = 'foo' loader = self._session.get_component('data_loader') json_resource_model = loader.load_service_model( self._service_name, 'resources-1') service_model = self._service_resource.meta.client.meta.service_model for resource_name in json_resource_model['resources']: resource_model = json_resource_model['resources'][resource_name] resource_cls = self._boto3_session.resource_factory.\ load_from_definition( resource_name=resource_name, single_resource_json_definition=resource_model, service_context=ServiceContext( service_name=self._service_name, resource_json_definitions=json_resource_model[ 'resources'], service_model=service_model, service_waiter_model=None ) ) identifiers = resource_cls.meta.resource_model.identifiers args = [] for _ in identifiers: args.append(temp_identifier_value) resource = resource_cls(*args, client=self._client) ResourceDocumenter(resource, self._session).document_resource( section.add_new_section(resource.meta.resource_model.name))
def retrieve_sub_resources( session: Session, service_name: ServiceName, resource: Boto3ResourceMeta ) -> Generator[Boto3ServiceResource, None, None]: session_session = session._session # pylint: disable=protected-access loader = session_session.get_component("data_loader") assert resource.meta.service_name == service_name.boto3_name json_resource_model = loader.load_service_model(service_name.boto3_name, "resources-1") service_model = resource.meta.client.meta.service_model assert service_model.service_name == service_name.boto3_name try: service_waiter_model = session_session.get_waiter_model( service_name.boto3_name) except UnknownServiceError: service_waiter_model = None for name in json_resource_model["resources"]: resource_model = json_resource_model["resources"][name] cls = session.resource_factory.load_from_definition( resource_name=name, single_resource_json_definition=resource_model, service_context=ServiceContext( service_name=service_name.boto3_name, resource_json_definitions=json_resource_model["resources"], service_model=service_model, service_waiter_model=service_waiter_model, ), ) identifiers = cls.meta.resource_model.identifiers args = [] for _ in identifiers: args.append("foo") yield cls(*args, client=session.client(service_name.boto3_name))
def get_resource(self, search_path, response): request_resource_def = { 'type': 'Frob', 'identifiers': [ { 'target': 'Id', 'source': 'response', 'path': self.identifier_path }, ] } resource_model = ResponseResource(request_resource_def, self.resource_defs) handler = ResourceHandler( search_path=search_path, factory=self.factory, resource_model=resource_model, service_context=ServiceContext( service_name='myservice', resource_json_definitions=self.resource_defs, service_model=self.service_model, service_waiter_model=None), operation_name='GetFrobs') return handler(self.parent, self.params, response)
def test_service_action_calls_resource_handler(self, handler_mock, params_mock): self.action_def['resource'] = {'type': 'Frob', 'path': 'Container'} resource = mock.Mock() resource.meta = ResourceMeta('test', client=mock.Mock()) operation = resource.meta.client.get_frobs operation.return_value = 'response' factory = mock.Mock() resource_defs = {} service_model = mock.Mock() action_model = self.action service_context = ServiceContext( service_name='test', service_model=service_model, resource_json_definitions=resource_defs, service_waiter_model=None) action = ServiceAction(action_model=action_model, factory=factory, service_context=service_context) handler_mock.return_value.return_value = 'response' action(resource) handler_mock.assert_called_with(search_path='Container', factory=factory, resource_model=action_model.resource, service_context=service_context, operation_name='GetFrobs')
def test_create_batch_actions(self, action_mock): resource_defs = { 'Frob': { 'batchActions': { 'Delete': { 'request': { 'operation': 'DeleteFrobs' } } } }, 'Chain': { 'hasMany': { 'Frobs': { 'request': { 'operation': 'GetFrobs' }, 'resource': { 'type': 'Frob' }, } } }, } collection_model = Collection( 'Frobs', resource_defs['Chain']['hasMany']['Frobs'], resource_defs) service_context = ServiceContext( service_name='test', resource_json_definitions=resource_defs, service_model=self.service_model, service_waiter_model=None, ) collection_cls = self.load( resource_name='Chain', collection_model=collection_model, service_context=service_context, event_emitter=self.event_emitter, ) collection = collection_cls( collection_model=collection_model, parent=self.parent, factory=self.resource_factory, service_context=service_context, ) assert hasattr(collection, 'delete') collection.delete() action_mock.return_value.assert_called_with(collection)
def test_create_subclasses(self): resource_defs = { 'Frob': {}, 'Chain': { 'hasMany': { 'Frobs': { 'request': { 'operation': 'GetFrobs' }, 'resource': { 'type': 'Frob' }, } } }, } collection_model = Collection( 'Frobs', resource_defs['Chain']['hasMany']['Frobs'], resource_defs) service_context = ServiceContext( service_name='test', resource_json_definitions=resource_defs, service_model=self.service_model, service_waiter_model=None, ) collection_cls = self.load( resource_name='Chain', collection_model=collection_model, service_context=service_context, event_emitter=self.event_emitter, ) collection = collection_cls( collection_model=collection_model, parent=self.parent, factory=self.resource_factory, service_context=service_context, ) assert collection_cls.__name__ == 'test.Chain.FrobsCollectionManager' assert isinstance(collection, CollectionManager) # Make sure that collection manager created from the factory # returns a ResourceCollection. assert isinstance(collection.all(), ResourceCollection) # Make sure that the collection returned from the collection # manager can be chained and return a ResourceCollection as well. assert isinstance(collection.all().all(), ResourceCollection)
def get_sub_resources( session: Session, service_name: ServiceName, resource: Boto3ServiceResource) -> List[Boto3ServiceResource]: """ Initialize ServiceResource sub-resources with fake data. Arguments: session -- boto3 session. service_name -- Target service name. resource -- Parent ServiceResource. Returns: A list of initialized `Boto3ServiceResource`. """ result: List[Boto3ServiceResource] = [] session_session = session._session loader = session_session.get_component("data_loader") assert resource.meta.service_name == service_name.boto3_name json_resource_model = loader.load_service_model(service_name.boto3_name, "resources-1") service_model = resource.meta.client.meta.service_model assert service_model.service_name == service_name.boto3_name service_waiter_model: Optional[WaiterModel] try: service_waiter_model = session_session.get_waiter_model( service_name.boto3_name) except UnknownServiceError: service_waiter_model = None for name in json_resource_model["resources"]: resource_model = json_resource_model["resources"][name] resource_class = session.resource_factory.load_from_definition( resource_name=name, single_resource_json_definition=resource_model, service_context=ServiceContext( service_name=service_name.boto3_name, resource_json_definitions=json_resource_model["resources"], service_model=service_model, service_waiter_model=service_waiter_model, ), ) identifiers = resource_class.meta.resource_model.identifiers # type: ignore args = ["foo"] * len(identifiers) result.append( resource_class(*args, client=get_boto3_client(session, service_name))) return result
def load(self, resource_name, resource_json_definition=None, resource_json_definitions=None, service_model=None): if resource_json_definition is None: resource_json_definition = {} if resource_json_definitions is None: resource_json_definitions = {} service_context=ServiceContext( service_name='test', resource_json_definitions=resource_json_definitions, service_model=service_model, service_waiter_model=None ) return self.factory.load_from_definition( resource_name=resource_name, single_resource_json_definition=resource_json_definition, service_context=service_context )