Example #1
0
    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)
Example #2
0
    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)
Example #3
0
 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()))
Example #4
0
    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)
Example #5
0
    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)
Example #6
0
    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)
Example #7
0
    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)
Example #8
0
    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))
Example #10
0
 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
Example #11
0
 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
Example #13
0
 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')
Example #14
0
    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)
Example #15
0
 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))
Example #16
0
    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)
Example #17
0
    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)
Example #18
0
    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)
Example #19
0
    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)
Example #20
0
    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)
Example #21
0
    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)