def testGenerateList(self, is_atomic): self.MockCRUDMethods(('foo.locations.instances', is_atomic)) method = registry.GetMethod('foo.locations.instances', 'list') # Make sure positional override works. gen = arg_marshalling.DeclarativeArgumentGenerator( method, [], MakeResource(collection='foo.locations', attributes=['location'], is_positional=True)) (_, args) = CheckArgs(gen.GenerateArgs()) self.assertEqual(['location'], sorted(args.keys())) self.assertEqual(args['location'].name, 'location') # Make sure list commands are non-positional by default. gen = arg_marshalling.DeclarativeArgumentGenerator( method, [], MakeResource(collection='foo.locations', attributes=['location'])) (parser, args) = CheckArgs(gen.GenerateArgs()) self.assertEqual(['--location'], sorted(args.keys())) self.assertEqual(args['--location'].name, '--location') self.assertEqual( args['--location'].kwargs['help'], 'ID of the location or fully qualified identifier for the location.' ) self.assertEqual(args['--location'].kwargs['required'], True) namespace = parser.parse_args(['--location=l']) req = gen.CreateRequest(namespace) if is_atomic: self.assertEqual('locations/l', req.parent) else: self.assertEqual('l', req.locationsId)
def testGenerateGetWithArgNameOverride(self, is_atomic): self.MockCRUDMethods(('foo.projects.instances', is_atomic)) method = registry.GetMethod('foo.projects.instances', 'get') gen = arg_marshalling.DeclarativeArgumentGenerator( method, [], MakeResource(arg_name='new_instance')) (_, args) = CheckArgs(gen.GenerateArgs()) six.assertCountEqual(self, ('new_instance', ), args) self.assertEqual( args['new_instance'].kwargs['help'], 'ID of the new_instance or fully qualified identifier for the ' 'new_instance.') # Make sure positional override works. gen = arg_marshalling.DeclarativeArgumentGenerator( method, [], MakeResource(is_positional=False)) (parser, args) = CheckArgs(gen.GenerateArgs()) self.assertEqual(['--instance'], sorted(args.keys())) self.assertEqual( args['--instance'].kwargs['help'], 'ID of the instance or fully qualified identifier for the instance.' ) namespace = parser.parse_args(['--instance=i']) properties.VALUES.core.project.Set('p') req = gen.CreateRequest(namespace) if is_atomic: self.assertEqual('projects/p/instances/i', req.name) else: self.assertEqual('p', req.projectsId) self.assertEqual('i', req.instancesId)
def testResourceArgRemoved(self, is_atomic): self.MockCRUDMethods(('foo.projects.instances', False)) method = registry.GetMethod('foo.projects.instances', 'get') gen = arg_marshalling.DeclarativeArgumentGenerator( method, [], MakeResource(removed_flags=['instance'])) (_, args) = CheckArgs(gen.GenerateArgs()) self.assertEqual([], sorted(args.keys()))
def testCreateRequestWithParamOverride(self, is_atomic): self.MockCRUDMethods(('foo.instances', is_atomic)) method = registry.GetMethod('foo.instances', 'get') method.params = ['foo'] mock_field = mock.MagicMock() mock_field.name = 'foo' mock_field.repeated = False method.GetRequestType().all_fields.return_value = [mock_field] message = method.GetRequestType()() message.field_by_name = mock.Mock(return_value=mock_field) gen = arg_marshalling.DeclarativeArgumentGenerator( method, [], MakeResource(collection='foo.instances')) (parser, args) = CheckArgs(gen.GenerateArgs()) self.assertEqual(['instance'], sorted(args.keys())) self.assertEqual( args['instance'].kwargs['help'], 'ID of the instance or fully qualified identifier for the instance.' ) namespace = parser.parse_args(['i']) properties.VALUES.core.project.Set('p') req = gen.CreateRequest(namespace, resource_method_params={'foo': 'instancesId'}) self.assertEqual('i', req.foo)
def testCommandFallbackResourceArg(self, is_atomic): self.MockCRUDMethods(('foo.projects.parents.instances', is_atomic)) method = registry.GetMethod('foo.projects.parents.instances', 'get') resource_arg = MakeResource( collection='foo.projects.parents.instances', attributes=['parent', 'instance']) resource_arg.command_level_fallthroughs = {'parent': ['--just-a-flag']} gen = arg_marshalling.DeclarativeArgumentGenerator( method, [yaml_command_schema.Argument(None, 'just-a-flag', 'help!')], resource_arg) (parser, _) = CheckArgs(gen.GenerateArgs()) properties.VALUES.core.project.Set('p') namespace = parser.parse_args(['i', '--just-a-flag', '!']) req = gen.CreateRequest(namespace) if is_atomic: self.assertEqual('projects/p/parents/!/instances/i', req.name) else: self.assertEqual('i', req.instancesId) self.assertEqual('!', req.parentsId) # Make sure fallback doesn't get called if the information is provided in # the resource name (parser, _) = CheckArgs(gen.GenerateArgs()) namespace = parser.parse_args( ['projects/p/parents/parent/instances/i', '--just-a-flag', '!']) req = gen.CreateRequest(namespace) if is_atomic: self.assertEqual('projects/p/parents/parent/instances/i', req.name) else: self.assertEqual('i', req.instancesId) self.assertEqual('parent', req.parentsId)
def testCreateRequestForUpdate(self, is_atomic): self.MockCRUDMethods(('foo.projects.instances', is_atomic)) method = registry.GetMethod('foo.projects.instances', 'patch') arg_info = [ yaml_command_schema.Argument('description', 'display-name', 'dn') ] gen = arg_marshalling.DeclarativeArgumentGenerator( method, arg_info, MakeResource()) (parser, args) = CheckArgs(gen.GenerateArgs()) self.assertEqual(['--display-name', 'instance'], sorted(args.keys())) self.assertEqual( args['instance'].kwargs['help'], 'ID of the instance or fully qualified identifier for the instance.' ) self.assertEqual(args['--display-name'].kwargs['help'], 'dn') namespace = parser.parse_args(['i', '--display-name', 'dis']) properties.VALUES.core.project.Set('p') req = gen.CreateRequest(namespace) self.assertEqual('dis', req.description) if is_atomic: self.assertEqual('projects/p/instances/i', req.name) else: self.assertEqual('p', req.projectsId) self.assertEqual('i', req.instancesId)
def testGenerateCreate(self, is_atomic): self.MockCRUDMethods(('foo.projects.instances', is_atomic)) method = registry.GetMethod('foo.projects.instances', 'create') instance_type = self.CreateRequestType(['name']) request_type = method.GetRequestType() method._service.GetRequestType.return_value = self.CreateRequestType( [f.name for f in request_type.all_fields()] + ['instance']) request_type = method.GetRequestType() request_type.field_by_name['instance'].type = instance_type gen = arg_marshalling.DeclarativeArgumentGenerator( method, [], MakeResource()) (parser, args) = CheckArgs(gen.GenerateArgs()) self.assertEqual(['instance'], sorted(args.keys())) self.assertEqual( args['instance'].kwargs['help'], 'ID of the instance or fully qualified identifier for the instance.' ) namespace = parser.parse_args(['i']) properties.VALUES.core.project.Set('p') req = gen.CreateRequest(namespace) if is_atomic: self.assertEqual('projects/p', req.parent) self.assertEqual('i', req.instance.name) else: self.assertEqual('p', req.projectsId) self.assertEqual('i', req.instance.name)
def testFieldFallbackResourceArg(self, is_atomic): self.MockCRUDMethods(('foo.projects.parents.instances', is_atomic)) method = registry.GetMethod('foo.projects.parents.instances', 'get') resource_arg = MakeResource( collection='foo.projects.parents.instances', attributes=['parent', 'instance']) resource_arg._attribute_data[0]['fallthroughs'] = [{ 'hook': DeclarativeTests.__module__ + ':Fallthrough', 'hint': 'If the fallthrough works' }] gen = arg_marshalling.DeclarativeArgumentGenerator( method, [], resource_arg) (parser, _) = CheckArgs(gen.GenerateArgs()) properties.VALUES.core.project.Set('p') namespace = parser.parse_args(['i']) req = gen.CreateRequest(namespace) if is_atomic: self.assertEqual('projects/p/parents/!/instances/i', req.name) else: self.assertEqual('i', req.instancesId) self.assertEqual('!', req.parentsId) # Make sure fallback doesn't get called if the information is provided in # the resource name (parser, _) = CheckArgs(gen.GenerateArgs()) namespace = parser.parse_args( ['projects/p/parents/parent/instances/i']) req = gen.CreateRequest(namespace) if is_atomic: self.assertEqual('projects/p/parents/parent/instances/i', req.name) else: self.assertEqual('i', req.instancesId) self.assertEqual('parent', req.parentsId)
def _GetExistingResource(self, args): get_method = registry.GetMethod(self.spec.request.collection, 'get', self.spec.request.api_version) get_arg_generator = arg_marshalling.DeclarativeArgumentGenerator( get_method, [], self.spec.arguments.resource) # TODO(b/111069150): Add error handling when get fails. return get_method.Call(get_arg_generator.CreateRequest(args))
def __init__(self, spec): self.spec = spec self.method = registry.GetMethod(self.spec.request.collection, self.spec.request.method, self.spec.request.api_version) resource_arg = self.spec.arguments.resource self.arg_generator = arg_marshalling.DeclarativeArgumentGenerator( self.method, self.spec.arguments.params, resource_arg) self.resource_type = resource_arg.name if resource_arg else None
def __init__(self, spec): self.spec = spec self.method = registry.GetMethod(self.spec.request.collection, self.spec.request.method, self.spec.request.api_version) resource_args = (self.spec.arguments.resource.params if self.spec.arguments.resource else []) self.arg_generator = arg_marshalling.DeclarativeArgumentGenerator( self.method, self.spec.arguments.params + self.spec.arguments.mutex_group_params, resource_args) self.resource_type = self.arg_generator.resource_arg_name
def __init__(self, spec, path): self.spec = spec self.path = path self.method = registry.GetMethod(self.spec.request.collection, self.spec.request.method, self.spec.request.api_version) resource_arg = self.spec.arguments.resource self.arg_generator = arg_marshalling.DeclarativeArgumentGenerator( self.method, self.spec.arguments.params, resource_arg) self.display_resource_type = self.spec.request.display_resource_type if (not self.display_resource_type and resource_arg and not resource_arg.is_parent_resource): self.display_resource_type = resource_arg.name if resource_arg else None
def testResponseRef(self, is_atomic): self.MockCRUDMethods(('foo.projects.instances', is_atomic)) method = registry.GetMethod('foo.projects.instances', 'list') gen = arg_marshalling.DeclarativeArgumentGenerator( method, [], MakeResource(collection='foo.projects', attributes=[])) (parser, args) = CheckArgs(gen.GenerateArgs()) self.assertEqual([], sorted(args.keys())) # Test parsing the response reference. properties.VALUES.core.project.Set('p') namespace = parser.parse_args([]) ref = gen.GetResponseResourceRef('foo', namespace) self.assertEqual(ref.instancesId, 'foo') self.assertEqual(ref.projectsId, 'p') self.assertEqual(ref.Collection(), 'foo.projects.instances')
def testGenerateListWithTopLevelDefault(self, is_atomic): self.MockCRUDMethods(('foo.projects.instances', is_atomic)) method = registry.GetMethod('foo.projects.instances', 'list') gen = arg_marshalling.DeclarativeArgumentGenerator( method, [], MakeResource(collection='foo.projects', attributes=[])) (parser, args) = CheckArgs(gen.GenerateArgs()) self.assertEqual({}, args) namespace = parser.parse_args([]) properties.VALUES.core.project.Set('p') req = gen.CreateRequest(namespace) if is_atomic: self.assertEqual('projects/p', req.parent) else: self.assertEqual('p', req.projectsId)
def testGenerateGroups(self, is_atomic, is_required): self.MockCRUDMethods(('foo.projects.instances', is_atomic)) method = registry.GetMethod('foo.projects.instances', 'list') group_args = [ yaml_command_schema.Argument('pageSize', 'page-size', 'ph'), yaml_command_schema.Argument('pageToken', 'page-token', 'th') ] group = yaml_command_schema.ArgumentGroup(arguments=group_args, mutex=True, required=is_required) gen = arg_marshalling.DeclarativeArgumentGenerator( method, [group], MakeResource(collection='foo.projects', attributes=[])) (_, args) = CheckArgs(gen.GenerateArgs()) self.assertEqual(2, len(args)) self.assertEqual(['--page-size', '--page-token'], sorted(args))
def testCreateRequestIgnoreResource(self): self.MockCRUDMethods(('foo.instances', True)) method = registry.GetMethod('foo.instances', 'get') gen = arg_marshalling.DeclarativeArgumentGenerator( method, [], MakeResource(collection='foo.instances')) (parser, args) = CheckArgs(gen.GenerateArgs()) self.assertEqual(['instance'], sorted(args.keys())) self.assertEqual( args['instance'].kwargs['help'], 'ID of the instance or fully qualified identifier for the instance.' ) namespace = parser.parse_args(['i']) properties.VALUES.core.project.Set('p') req = gen.CreateRequest(namespace, parse_resource_into_request=False) self.assertIsNone(req.name)
def testFieldProcessing(self, is_atomic): def P(value): return '!' + value self.MockCRUDMethods(('foo.projects.instances', is_atomic)) method = registry.GetMethod('foo.projects.instances', 'list') arg_info = [ yaml_command_schema.Argument('pageSize', 'page-size', 'ph', processor=P) ] gen = arg_marshalling.DeclarativeArgumentGenerator( method, arg_info, MakeResource(collection='foo.projects', attributes=[])) req = gen.CreateRequest(mock.MagicMock(project='p', page_size='a')) self.assertEqual('!a', req.pageSize)
def testCreateRequestWithStaticFields(self, is_atomic): self.MockCRUDMethods(('foo.projects.instances', is_atomic)) method = registry.GetMethod('foo.projects.instances', 'list') arg_info = [ yaml_command_schema.Argument('pageSize', 'page-size', 'ph') ] gen = arg_marshalling.DeclarativeArgumentGenerator( method, arg_info, MakeResource(collection='foo.projects', attributes=[])) (_, args) = CheckArgs(gen.GenerateArgs()) self.assertEqual(['--page-size'], sorted(args.keys())) self.assertEqual(args['--page-size'].kwargs['help'], 'ph') req = gen.CreateRequest(mock.MagicMock(project='p', page_size=None), static_fields={'pageSize': 1}) self.assertEqual(1, req.pageSize) req = gen.CreateRequest(mock.MagicMock(project='p', page_size=2), static_fields={'pageSize': 1}) self.assertEqual(2, req.pageSize)
def testFieldFallback(self, is_atomic): def Fallback(): return '!' self.MockCRUDMethods(('foo.projects.instances', is_atomic)) method = registry.GetMethod('foo.projects.instances', 'list') arg_info = [ yaml_command_schema.Argument('pageSize', 'page-size', 'ph', fallback=Fallback) ] gen = arg_marshalling.DeclarativeArgumentGenerator( method, arg_info, MakeResource(collection='foo.projects', attributes=[])) (parser, _) = CheckArgs(gen.GenerateArgs()) properties.VALUES.core.project.Set('p') namespace = parser.parse_args([]) req = gen.CreateRequest(namespace) self.assertEqual('!', req.pageSize)
def testCreateRequestExistingMessage(self): self.MockCRUDMethods(('foo.projects.instances', True)) method = registry.GetMethod('foo.projects.instances', 'patch') arg_info = [ yaml_command_schema.Argument('description', 'display-name', 'dn') ] gen = arg_marshalling.DeclarativeArgumentGenerator( method, arg_info, MakeResource()) (parser, _) = CheckArgs(gen.GenerateArgs()) namespace = parser.parse_args(['i', '--display-name', 'dis']) properties.VALUES.core.project.Set('p') original_message = list( method.GetRequestType().all_fields.return_value) mock_field = mock.MagicMock() mock_field.name = 'foo' mock_field.repeated = False existing_message = original_message.append(mock_field) req = gen.CreateRequest(namespace, existing_message=existing_message) self.assertEqual('projects/p/instances/i', req.name) self.assertEqual('dis', req.description) self.assertIsNotNone(req.foo)
def testGenerateFields(self, is_atomic): self.MockCRUDMethods(('foo.projects.instances', is_atomic)) method = registry.GetMethod('foo.projects.instances', 'list') arg_info = [ yaml_command_schema.Argument('pageSize', 'page-size', 'ph'), yaml_command_schema.Argument(None, 'just-a-flag', 'help!') ] gen = arg_marshalling.DeclarativeArgumentGenerator( method, arg_info, MakeResource(collection='foo.projects', attributes=[])) (parser, args) = CheckArgs(gen.GenerateArgs()) self.assertEqual(['--just-a-flag', '--page-size'], sorted(args.keys())) self.assertEqual(args['--page-size'].kwargs['help'], 'ph') self.assertEqual(args['--just-a-flag'].kwargs['help'], 'help!') namespace = parser.parse_args(['--page-size', '1']) properties.VALUES.core.project.Set('p') req = gen.CreateRequest(namespace) self.assertEqual('1', req.pageSize) if is_atomic: self.assertEqual('projects/p', req.parent) else: self.assertEqual('p', req.projectsId)