def testBatchList(self): lister_patcher = mock.patch( 'googlecloudsdk.api_lib.compute.lister.GetGlobalResourcesDicts', autospec=True) self.addCleanup(lister_patcher.stop) self.mock_get_global_resources = lister_patcher.start() self.mock_get_global_resources.return_value = [1, 2, 3] self.api_mock = utils.ComputeApiMock('v1').Start() self.addCleanup(self.api_mock.Stop) resource_registry = resources.REGISTRY.Clone() resource_registry.RegisterApiByName('compute', 'v1') project = resource_registry.Parse( self.Project(), collection='compute.projects') frontend = lister._Frontend('filter', 123, lister.GlobalScope([project])) global_lister = lister.GlobalLister(self.api_mock.adapter, 'service') result = list(global_lister(frontend)) self.assertListEqual(result, [1, 2, 3]) self.mock_get_global_resources.assert_called_once_with( service='service', project=self.Project(), filter_expr='filter', http=self.api_mock.adapter.apitools_client.http, batch_url=self.api_mock.adapter.batch_url, errors=[])
def testAggregatedList(self): lister_patcher = mock.patch( 'googlecloudsdk.api_lib.compute.lister.GetRegionalResourcesDicts', autospec=True) self.addCleanup(lister_patcher.stop) self.mock_get_regional_resources = lister_patcher.start() self.mock_get_regional_resources.return_value = [1, 2, 3] self.api_mock = utils.ComputeApiMock('v1').Start() self.addCleanup(self.api_mock.Stop) resource_registry = resources.REGISTRY.Clone() resource_registry.RegisterApiByName('compute', 'v1') project = resource_registry.Parse( 'https://compute.googleapis.com/compute/v1/projects/lister-project') frontend = lister._Frontend('filter', 123, lister.AllScopes([project], False, True)) regional_lister = lister.RegionalLister(self.api_mock.adapter, 'service') result = list(regional_lister(frontend)) self.assertListEqual(result, [1, 2, 3]) self.mock_get_regional_resources.assert_called_once_with( service='service', project=self.Project(), requested_regions=[], filter_expr='filter', http=self.api_mock.adapter.apitools_client.http, batch_url=self.api_mock.adapter.batch_url, errors=[])
def testNoExplicitZoneList(self): # In this tests zonal wildcard is used, zones have to be fetched by # implementation self.api_mock = utils.ComputeApiMock('v1').Start() self.addCleanup(self.api_mock.Stop) resource_registry = resources.REGISTRY.Clone() resource_registry.RegisterApiByName('compute', 'v1') frontend = lister._Frontend('filter', 123, self.MakeAllScopes(zonal=True)) zonal_lister = lister.ZonalParallelLister( self.api_mock.adapter, self.api_mock.adapter.apitools_client.instances, resource_registry) zone_set = self.MakeZoneSet(['zone-1', 'zone-2']) # This is for zones listing self.ExpectListerInvoke( scope_set=self.MakeGlobalScope(), result=[{ 'selfLink': z.SelfLink() } for z in zone_set]) # This is for "instances" listing self.ExpectListerInvoke( scope_set=zone_set, filter_expr=frontend.filter, max_results=frontend.max_results, result=[1, 2, 3]) result = list(zonal_lister(frontend)) self.assertListEqual(result, [1, 2, 3])
def WarnIfSettingNonExistentRegionZone(prop, zonal=True): """Warn if setting 'compute/region' or 'compute/zone' to wrong value.""" zonal_msg = ('{} is not a valid zone. Run `gcloud compute zones list` to ' 'get all zones.'.format(prop)) regional_msg = ( '{} is not a valid region. Run `gcloud compute regions list`' 'to get all regions.'.format(prop)) holder = base_classes.ComputeApiHolder(base.ReleaseTrack.GA) client = holder.client # pylint: disable=protected-access request_data = lister._Frontend( None, None, lister.GlobalScope([ holder.resources.Parse(properties.VALUES.core.project.GetOrFail(), collection='compute.projects') ])) list_implementation = lister.GlobalLister( client, client.apitools_client.zones if zonal else client.apitools_client.regions) try: response = lister.Invoke(request_data, list_implementation) zones = [i['name'] for i in list(response)] if prop not in zones: log.warning(zonal_msg if zonal else regional_msg) except (lister.ListException, apitools_exceptions.HttpError, c_store.NoCredentialsForAccountException, api_lib_util_exceptions.HttpException): log.warning('Property validation for compute/{} was skipped.'.format( 'zone' if zonal else 'region'))
def testWithPartialError(self): def make_server_responses(*_, **kwargs): for num in range(5): if num == 2: kwargs['errors'].append((400, 'Invalid field name')) else: yield num lister_patcher = mock.patch( 'googlecloudsdk.api_lib.compute.request_helper.ListJson', autospec=True) self.addCleanup(lister_patcher.stop) self.list_json = lister_patcher.start() self.list_json.side_effect = make_server_responses self.api_mock = utils.ComputeApiMock('v1').Start() self.addCleanup(self.api_mock.Stop) resource_registry = resources.REGISTRY.Clone() resource_registry.RegisterApiByName('compute', 'v1') project = resource_registry.Parse( 'https://www.googleapis.com/compute/v1/projects/lister-project') frontend = lister._Frontend('filter', 123, lister.GlobalScope([project])) zones_lister = lister.MultiScopeLister( self.api_mock.adapter, global_service=self.api_mock.adapter.apitools_client.zones) result = list(zones_lister(frontend)) self.assertListEqual(result, [0, 1, 3, 4]) errors = [(400, u'Invalid field name')] self.list_json.assert_called_once_with( requests=[(self.api_mock.adapter.apitools_client.zones, 'List', self.api_mock.adapter.messages.ComputeZonesListRequest( filter='filter', maxResults=123, project='lister-project')), ], http=self.api_mock.adapter.apitools_client.http, batch_url=self.api_mock.adapter.batch_url, errors=errors)
def testAggregatedListPartialSuccess(self): lister_patcher = mock.patch( 'googlecloudsdk.api_lib.compute.request_helper.ListJson', autospec=True) self.addCleanup(lister_patcher.stop) self.list_json = lister_patcher.start() self.list_json.return_value = [1, 2, 3] self.api_mock = utils.ComputeApiMock('alpha').Start() self.addCleanup(self.api_mock.Stop) resource_registry = resources.REGISTRY.Clone() resource_registry.RegisterApiByName('compute', 'v1') project = resource_registry.Parse( 'https://compute.googleapis.com/compute/alpha/projects/lister-project') frontend = lister._Frontend('filter', 123, lister.AllScopes([project], True, True)) instances_lister = lister.MultiScopeLister( self.api_mock.adapter, aggregation_service=self.api_mock.adapter.apitools_client.instances, return_partial_success=True) result = list(instances_lister(frontend)) self.assertListEqual(result, [1, 2, 3]) self.list_json.assert_called_once_with( requests=[ (self.api_mock.adapter.apitools_client.instances, 'AggregatedList', self.api_mock.adapter.messages .ComputeInstancesAggregatedListRequest( filter='filter', maxResults=123, project='lister-project', includeAllScopes=True, returnPartialSuccess=True)) ], http=self.api_mock.adapter.apitools_client.http, batch_url=self.api_mock.adapter.batch_url, errors=[])
def testExplicitZoneList(self): # In this test fronted is provided with precise set of zones self.api_mock = utils.ComputeApiMock('v1').Start() self.addCleanup(self.api_mock.Stop) frontend = lister._Frontend('filter', 123, self.MakeZoneSet(['zone-1', 'zone-2'])) zonal_lister = lister.ZonalParallelLister( self.api_mock.adapter, self.api_mock.adapter.apitools_client.instances, 'registry') self.ExpectListerInvoke( scope_set=frontend.scope_set, filter_expr=frontend.filter, max_results=frontend.max_results, result=[1, 2, 3]) result = list(zonal_lister(frontend)) self.assertListEqual(result, [1, 2, 3])
def testBatchList(self): lister_patcher = mock.patch( 'googlecloudsdk.api_lib.compute.lister.GetZonalResourcesDicts', autospec=True) self.addCleanup(lister_patcher.stop) self.mock_get_zonal_resources = lister_patcher.start() self.mock_get_zonal_resources.return_value = [1, 2, 3] self.api_mock = utils.ComputeApiMock('v1').Start() self.addCleanup(self.api_mock.Stop) resource_registry = resources.REGISTRY.Clone() resource_registry.RegisterApiByName('compute', 'v1') zone1 = resource_registry.Parse( 'https://compute.googleapis.com/compute/v1/projects/' 'lister-project/zones/my-zone-1') zone2 = resource_registry.Parse( 'https://compute.googleapis.com/compute/v1/projects/' 'lister-project/zones/my-zone-2') frontend = lister._Frontend('filter', 123, lister.ZoneSet([zone1, zone2])) zonal_lister = lister.ZonalLister(self.api_mock.adapter, 'service') result = list(zonal_lister(frontend)) self.assertListEqual(result, [1, 2, 3]) self.mock_get_zonal_resources.assert_called_once_with( service='service', project=self.Project(), requested_zones=['my-zone-1', 'my-zone-2'], filter_expr='filter', http=self.api_mock.adapter.apitools_client.http, batch_url=self.api_mock.adapter.batch_url, errors=[])
def testGlobalList(self): lister_patcher = mock.patch( 'googlecloudsdk.api_lib.compute.request_helper.ListJson', autospec=True) self.addCleanup(lister_patcher.stop) self.list_json = lister_patcher.start() self.list_json.return_value = [1, 2, 3] self.api_mock = utils.ComputeApiMock('v1').Start() self.addCleanup(self.api_mock.Stop) resource_registry = resources.REGISTRY.Clone() resource_registry.RegisterApiByName('compute', 'v1') project = resource_registry.Parse( 'https://compute.googleapis.com/compute/v1/projects/lister-project') frontend = lister._Frontend('filter', 123, lister.GlobalScope([project])) zones_lister = lister.MultiScopeLister( self.api_mock.adapter, global_service=self.api_mock.adapter.apitools_client.zones) result = list(zones_lister(frontend)) self.assertListEqual(result, [1, 2, 3]) self.list_json.assert_called_once_with( requests=[(self.api_mock.adapter.apitools_client.zones, 'List', self.api_mock.adapter.messages.ComputeZonesListRequest( filter='filter', maxResults=123, project='lister-project'))], http=self.api_mock.adapter.apitools_client.http, batch_url=self.api_mock.adapter.batch_url, errors=[])