def CreateRequest(self, args, cleared_fields): resource_arg = instance_groups_flags.MULTISCOPE_INSTANCE_GROUP_MANAGER_ARG default_scope = compute_scope.ScopeEnum.ZONE scope_lister = flags.GetDefaultScopeLister(self.compute_client, self.project) igm_ref = resource_arg.ResolveAsResource(args, self.resources, default_scope=default_scope, scope_lister=scope_lister) update_instances_utils.ValidateUpdateInstancesArgs(args) update_policy_type = update_instances_utils.ParseUpdatePolicyType( '--type', args.type, self.messages) max_surge = update_instances_utils.ParseFixedOrPercent( '--max-surge', 'max-surge', args.max_surge, self.messages) max_unavailable = update_instances_utils.ParseFixedOrPercent( '--max-unavailable', 'max-unavailable', args.max_unavailable, self.messages) igm_info = managed_instance_groups_utils.GetInstanceGroupManagerOrThrow( igm_ref, self.compute_client) if args.action == 'replace': versions = [] if args.version_original: versions.append( update_instances_utils.ParseVersion( '--version-original', args.version_original, self.resources, self.messages)) versions.append( update_instances_utils.ParseVersion('--version-new', args.version_new, self.resources, self.messages)) managed_instance_groups_utils.ValidateVersions( igm_info, versions, args.force) # TODO(b/36056457): 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: version.name = igm_version_names.get(version.instanceTemplate) version.tag = version.name minimal_action = (self.messages.InstanceGroupManagerUpdatePolicy. MinimalActionValueValuesEnum.REPLACE) elif args.action == 'restart' and igm_info.versions is not None: versions = (igm_info.versions or [ self.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) version.tag = version.name minimal_action = (self.messages.InstanceGroupManagerUpdatePolicy. MinimalActionValueValuesEnum.RESTART) else: raise exceptions.InvalidArgumentException('--action', 'unknown action type.') update_policy = self.messages.InstanceGroupManagerUpdatePolicy( maxSurge=max_surge, maxUnavailable=max_unavailable, minReadySec=args.min_ready, minimalAction=minimal_action, type=update_policy_type) igm_resource = self.messages.InstanceGroupManager( instanceTemplate=None, updatePolicy=update_policy, versions=versions) if hasattr(igm_ref, 'zone'): service = self.compute.instanceGroupManagers request = (self.messages.ComputeInstanceGroupManagersPatchRequest( instanceGroupManager=igm_ref.Name(), instanceGroupManagerResource=igm_resource, project=self.project, zone=igm_ref.zone)) elif hasattr(igm_ref, 'region'): service = self.compute.regionInstanceGroupManagers request = ( self.messages.ComputeRegionInstanceGroupManagersPatchRequest( instanceGroupManager=igm_ref.Name(), instanceGroupManagerResource=igm_resource, project=self.project, region=igm_ref.region)) # Due to 'Patch' semantics, we have to clear either 'fixed' or 'percent'. # Otherwise, we'll get an error that both 'fixed' and 'percent' are set. if max_surge is not None: cleared_fields.append( 'updatePolicy.maxSurge.fixed' if max_surge.fixed is None else 'updatePolicy.maxSurge.percent') if max_unavailable is not None: cleared_fields.append( 'updatePolicy.maxUnavailable.fixed' if max_unavailable. fixed is None else 'updatePolicy.maxUnavailable.percent') return (service, 'Patch', request)
def CreateRequests(self, args): resource_arg = instance_groups_flags.ZONAL_INSTANCE_GROUP_MANAGER_ARG default_scope = flags.ScopeEnum.ZONE scope_lister = flags.GetDefaultScopeLister(self.compute_client, self.project) igm_ref = resource_arg.ResolveAsResource(args, self.resources, default_scope=default_scope, scope_lister=scope_lister) update_instances_utils.ValidateUpdateInstancesArgs(args) update_policy_type = update_instances_utils.ParseUpdatePolicyType( '--type', args.type, self.messages) max_surge = update_instances_utils.ParseFixedOrPercent( '--max-surge', 'max-surge', args.max_surge, self.messages) max_unavailable = update_instances_utils.ParseFixedOrPercent( '--max-unavailable', 'max-unavailable', args.max_unavailable, self.messages) igm_info = managed_instance_groups_utils.GetInstanceGroupManagerOrThrow( igm_ref, self.project, self.compute, self.http, self.batch_url) if args.action == 'replace': versions = [] if args.version_original: versions.append( update_instances_utils.ParseVersion( '--version-original', args.version_original, self.resources, self.messages)) versions.append( update_instances_utils.ParseVersion('--version-new', args.version_new, self.resources, self.messages)) managed_instance_groups_utils.ValidateVersions( igm_info, versions, args.force) igm_tags = dict((version.instanceTemplate, version.tag) for version in igm_info.versions) for version in versions: version.tag = igm_tags.get(version.instanceTemplate) minimal_action = (self.messages.InstanceGroupManagerUpdatePolicy. MinimalActionValueValuesEnum.REPLACE) elif args.action == 'restart' and igm_info.versions is not None: versions = (igm_info.versions or [ self.messages.InstanceGroupManagerVersion( instanceTemplate=igm_info.instanceTemplate) ]) for version in versions: version.tag = str(times.Now(times.UTC)) minimal_action = (self.messages.InstanceGroupManagerUpdatePolicy. MinimalActionValueValuesEnum.RESTART) else: raise exceptions.InvalidArgumentException('--action', 'unknown action type.') update_policy = self.messages.InstanceGroupManagerUpdatePolicy( maxSurge=max_surge, maxUnavailable=max_unavailable, minReadySec=args.min_ready, minimalAction=minimal_action, type=update_policy_type, ) service = self.compute.instanceGroupManagers request = (self.messages.ComputeInstanceGroupManagersPatchRequest( instanceGroupManager=igm_ref.Name(), instanceGroupManagerResource=(self.messages.InstanceGroupManager( instanceTemplate=None, updatePolicy=update_policy, versions=versions)), project=self.project, zone=igm_ref.zone)) return [(service, self.method, request)]