def CreateRequest(args, client, resources, minimal_action, max_surge=None): """Create request helper for compute instance-groups managed rolling-action. Args: args: argparse namespace client: The compute client resources: The compute resources minimal_action: MinimalActionValueValuesEnum value max_surge: InstanceGroupManagerUpdatePolicy.maxSurge value Returns: ComputeInstanceGroupManagersPatchRequest or ComputeRegionInstanceGroupManagersPatchRequest instance Raises: ValueError: if instance group manager collection path is unknown """ resource_arg = instance_groups_flags.MULTISCOPE_INSTANCE_GROUP_MANAGER_ARG default_scope = compute_scope.ScopeEnum.ZONE scope_lister = flags.GetDefaultScopeLister(client) igm_ref = resource_arg.ResolveAsResource( args, resources, default_scope=default_scope, scope_lister=scope_lister) if igm_ref.Collection() not in [ 'compute.instanceGroupManagers', 'compute.regionInstanceGroupManagers' ]: raise ValueError('Unknown reference type {0}'.format(igm_ref.Collection())) update_policy_type = (client.messages.InstanceGroupManagerUpdatePolicy. TypeValueValuesEnum.PROACTIVE) max_unavailable = update_instances_utils.ParseFixedOrPercent( '--max-unavailable', 'max-unavailable', args.max_unavailable, client.messages) igm_info = managed_instance_groups_utils.GetInstanceGroupManagerOrThrow( igm_ref, client) versions = (igm_info.versions or [ client.messages.InstanceGroupManagerVersion( instanceTemplate=igm_info.instanceTemplate) ]) current_time_str = str(times.Now(times.UTC)) for i, version in enumerate(versions): version.name = '%d/%s' % (i, current_time_str) update_policy = client.messages.InstanceGroupManagerUpdatePolicy( maxSurge=max_surge, maxUnavailable=max_unavailable, minimalAction=minimal_action, type=update_policy_type) # min_ready is available in alpha and beta APIs only if hasattr(args, 'min_ready'): update_policy.minReadySec = args.min_ready # replacement_method is available in alpha API only if hasattr(args, 'replacement_method'): replacement_method = update_instances_utils.ParseReplacementMethod( args.replacement_method, client.messages) update_policy.replacementMethod = replacement_method igm_resource = client.messages.InstanceGroupManager( instanceTemplate=None, updatePolicy=update_policy, versions=versions) if igm_ref.Collection() == 'compute.instanceGroupManagers': service = client.apitools_client.instanceGroupManagers request = client.messages.ComputeInstanceGroupManagersPatchRequest( instanceGroupManager=igm_ref.Name(), instanceGroupManagerResource=igm_resource, project=igm_ref.project, zone=igm_ref.zone) else: service = client.apitools_client.regionInstanceGroupManagers request = client.messages.ComputeRegionInstanceGroupManagersPatchRequest( instanceGroupManager=igm_ref.Name(), instanceGroupManagerResource=igm_resource, project=igm_ref.project, region=igm_ref.region) return (service, 'Patch', request)
def CreateRequest(self, args, client, resources): resource_arg = instance_groups_flags.MULTISCOPE_INSTANCE_GROUP_MANAGER_ARG default_scope = compute_scope.ScopeEnum.ZONE scope_lister = flags.GetDefaultScopeLister(client) igm_ref = resource_arg.ResolveAsResource( args, resources, default_scope=default_scope, scope_lister=scope_lister) if igm_ref.Collection() not in [ 'compute.instanceGroupManagers', 'compute.regionInstanceGroupManagers' ]: raise ValueError('Unknown reference type {0}'.format( igm_ref.Collection())) update_policy_type = update_instances_utils.ParseUpdatePolicyType( '--type', args.type, client.messages) max_surge = update_instances_utils.ParseFixedOrPercent( '--max-surge', 'max-surge', args.max_surge, client.messages) max_unavailable = update_instances_utils.ParseFixedOrPercent( '--max-unavailable', 'max-unavailable', args.max_unavailable, client.messages) igm_info = managed_instance_groups_utils.GetInstanceGroupManagerOrThrow( igm_ref, client) versions = [] versions.append( update_instances_utils.ParseVersion(igm_ref.project, '--version', args.version, resources, client.messages)) if args.canary_version: versions.append( update_instances_utils.ParseVersion(igm_ref.project, '--canary-version', args.canary_version, resources, client.messages)) managed_instance_groups_utils.ValidateVersions(igm_info, versions, resources, args.force) # TODO(b/36049787): Decide what we should do when two versions have the same # instance template (this can happen with canary restart # performed using tags). igm_version_names = { version.instanceTemplate: version.name for version in igm_info.versions } for version in versions: if not version.name: version.name = igm_version_names.get(version.instanceTemplate) minimal_action = (client.messages.InstanceGroupManagerUpdatePolicy. MinimalActionValueValuesEnum.REPLACE) update_policy = client.messages.InstanceGroupManagerUpdatePolicy( maxSurge=max_surge, maxUnavailable=max_unavailable, minimalAction=minimal_action, type=update_policy_type) # min_ready is available in alpha and beta APIs only if hasattr(args, 'min_ready'): update_policy.minReadySec = args.min_ready # replacement_method is available in alpha API only if hasattr(args, 'replacement_method'): replacement_method = update_instances_utils.ParseReplacementMethod( args.replacement_method, client.messages) update_policy.replacementMethod = replacement_method rolling_action.ValidateAndFixUpdaterAgainstStateful(update_policy, igm_ref, igm_info, client, args) igm_resource = client.messages.InstanceGroupManager( instanceTemplate=None, updatePolicy=update_policy, versions=versions) if hasattr(igm_ref, 'zone'): service = client.apitools_client.instanceGroupManagers request = (client.messages.ComputeInstanceGroupManagersPatchRequest( instanceGroupManager=igm_ref.Name(), instanceGroupManagerResource=igm_resource, project=igm_ref.project, zone=igm_ref.zone)) elif hasattr(igm_ref, 'region'): service = client.apitools_client.regionInstanceGroupManagers request = (client.messages.ComputeRegionInstanceGroupManagersPatchRequest( instanceGroupManager=igm_ref.Name(), instanceGroupManagerResource=igm_resource, project=igm_ref.project, region=igm_ref.region)) return service, 'Patch', request