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])
Exemple #4
0
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=[])