def _ComputeInstanceGroupSize(items, client, resources): """Add information about Instance Group size.""" errors = [] zone_refs = [ resources.Parse( mig['zone'], params={'project': properties.VALUES.core.project.GetOrFail}, collection='compute.zones') for mig in items if 'zone' in mig ] region_refs = [ resources.Parse( mig['region'], params={'project': properties.VALUES.core.project.GetOrFail}, collection='compute.regions') for mig in items if 'region' in mig ] zonal_instance_groups = [] for project, zone_refs in GroupByProject(zone_refs).iteritems(): zonal_instance_groups.extend( lister.GetZonalResources( service=client.apitools_client.instanceGroups, project=project, requested_zones=set([zone.zone for zone in zone_refs]), filter_expr=None, http=client.apitools_client.http, batch_url=client.batch_url, errors=errors)) regional_instance_groups = [] if getattr(client.apitools_client, 'regionInstanceGroups', None): for project, region_refs in GroupByProject(region_refs).iteritems(): regional_instance_groups.extend( lister.GetRegionalResources( service=client.apitools_client.regionInstanceGroups, project=project, requested_regions=set( [region.region for region in region_refs]), filter_expr=None, http=client.apitools_client.http, batch_url=client.batch_url, errors=errors)) instance_groups = zonal_instance_groups + regional_instance_groups instance_group_uri_to_size = { ig.selfLink: ig.size for ig in instance_groups } if errors: utils.RaiseToolException(errors) for item in items: self_link = item['selfLink'] gm_self_link = self_link.replace('/instanceGroupManagers/', '/instanceGroups/') item['size'] = str(instance_group_uri_to_size.get(gm_self_link, '')) yield item
def GetRegionalResources(self, **kwargs): args = dict( service=self.compute.targetPools, project='my-project', requested_regions=[], filter_expr=None, http=self.mock_http, batch_url=self.batch_url, errors=[]) args.update(kwargs) return lister.GetRegionalResources(**args)
def GetResources(self, args, errors): region_names = [ self.CreateGlobalReference(region, resource_type='regions').Name() for region in args.regions ] return lister.GetRegionalResources( service=self.service, project=self.project, requested_regions=region_names, filter_expr=self.GetFilterExpr(args), http=self.http, batch_url=self.batch_url, errors=errors)
def ComputeInstanceGroupManagerMembership( compute, resources, http, batch_url, items, filter_mode=(InstanceGroupFilteringMode.ALL_GROUPS)): """Add information if instance group is managed. Args: compute: GCE Compute API client, resources: resource registry, http: http client, batch_url: str, batch url items: list of instance group messages, filter_mode: InstanceGroupFilteringMode, managed/unmanaged filtering options Returns: list of instance groups with computed dynamic properties """ errors = [] items = list(items) zone_links = set([ig['zone'] for ig in items if 'zone' in ig]) project_to_zones = {} for zone in zone_links: zone_ref = resources.Parse( zone, params={ 'project': properties.VALUES.core.project.GetOrFail, }, collection='compute.zones') if zone_ref.project not in project_to_zones: project_to_zones[zone_ref.project] = set() project_to_zones[zone_ref.project].add(zone_ref.zone) zonal_instance_group_managers = [] for project, zones in project_to_zones.iteritems(): zonal_instance_group_managers.extend( lister.GetZonalResources(service=compute.instanceGroupManagers, project=project, requested_zones=zones, filter_expr=None, http=http, batch_url=batch_url, errors=errors)) regional_instance_group_managers = [] if hasattr(compute, 'regionInstanceGroups'): # regional instance groups are just in 'alpha' API region_links = set([ig['region'] for ig in items if 'region' in ig]) project_to_regions = {} for region in region_links: region_ref = resources.Parse(region, collection='compute.regions') if region_ref.project not in project_to_regions: project_to_regions[region_ref.project] = set() project_to_regions[region_ref.project].add(region_ref.region) for project, regions in project_to_regions.iteritems(): regional_instance_group_managers.extend( lister.GetRegionalResources( service=compute.regionInstanceGroupManagers, project=project, requested_regions=regions, filter_expr=None, http=http, batch_url=batch_url, errors=errors)) instance_group_managers = (list(zonal_instance_group_managers) + list(regional_instance_group_managers)) instance_group_managers_refs = set([ path_simplifier.ScopedSuffix(igm.selfLink) for igm in instance_group_managers ]) if errors: utils.RaiseToolException(errors) results = [] for item in items: self_link = item['selfLink'] igm_self_link = self_link.replace('/instanceGroups/', '/instanceGroupManagers/') scoped_suffix = path_simplifier.ScopedSuffix(igm_self_link) is_managed = scoped_suffix in instance_group_managers_refs if (is_managed and filter_mode == InstanceGroupFilteringMode.ONLY_UNMANAGED_GROUPS): continue elif (not is_managed and filter_mode == InstanceGroupFilteringMode.ONLY_MANAGED_GROUPS): continue item['isManaged'] = ('Yes' if is_managed else 'No') if is_managed: item['instanceGroupManagerUri'] = igm_self_link results.append(item) return results
def ComputeInstanceGroupManagerMembership( compute, project, http, batch_url, items, filter_mode=(InstanceGroupFilteringMode.ALL_GROUPS)): """Add information if instance group is managed. Args: compute: GCE Compute API client, project: str, project name http: http client, batch_url: str, batch url items: list of instance group messages, filter_mode: InstanceGroupFilteringMode, managed/unmanaged filtering options Returns: list of instance groups with computed dynamic properties """ errors = [] items = list(items) zone_names = set( [path_simplifier.Name(ig['zone']) for ig in items if 'zone' in ig]) region_names = set( [path_simplifier.Name(ig['region']) for ig in items if 'region' in ig]) if zone_names: zonal_instance_group_managers = lister.GetZonalResources( service=compute.instanceGroupManagers, project=project, requested_zones=zone_names, filter_expr=None, http=http, batch_url=batch_url, errors=errors) else: zonal_instance_group_managers = [] if region_names and hasattr(compute, 'regionInstanceGroups'): # regional instance groups are just in 'alpha' API regional_instance_group_managers = lister.GetRegionalResources( service=compute.regionInstanceGroupManagers, project=project, requested_regions=region_names, filter_expr=None, http=http, batch_url=batch_url, errors=errors) else: regional_instance_group_managers = [] instance_group_managers = (list(zonal_instance_group_managers) + list(regional_instance_group_managers)) instance_group_managers_refs = set([ path_simplifier.ScopedSuffix(igm.selfLink) for igm in instance_group_managers ]) if errors: utils.RaiseToolException(errors) results = [] for item in items: self_link = item['selfLink'] igm_self_link = self_link.replace('/instanceGroups/', '/instanceGroupManagers/') scoped_suffix = path_simplifier.ScopedSuffix(igm_self_link) is_managed = scoped_suffix in instance_group_managers_refs if (is_managed and filter_mode == InstanceGroupFilteringMode.ONLY_UNMANAGED_GROUPS): continue elif (not is_managed and filter_mode == InstanceGroupFilteringMode.ONLY_MANAGED_GROUPS): continue item['isManaged'] = ('Yes' if is_managed else 'No') if is_managed: item['instanceGroupManagerUri'] = igm_self_link results.append(item) return results