def _ValidateInstancesFlags( args, support_kms=False, support_max_run_duration=False ): """Validate flags for instance template that affects instance creation. Args: args: argparse.Namespace, An object that contains the values for the arguments specified in the .Args() method. support_kms: If KMS is supported. support_max_run_duration: max-run-durrations is supported in instance scheduling. """ instances_flags.ValidateDiskCommonFlags(args) instances_flags.ValidateDiskBootFlags(args, enable_kms=support_kms) instances_flags.ValidateCreateDiskFlags(args) instances_flags.ValidateLocalSsdFlags(args) instances_flags.ValidateNicFlags(args) instances_flags.ValidateServiceAccountAndScopeArgs(args) instances_flags.ValidateAcceleratorArgs(args) instances_flags.ValidateReservationAffinityGroup(args) instances_flags.ValidateNetworkPerformanceConfigsArgs(args) instances_flags.ValidateInstanceScheduling( args, support_max_run_duration=support_max_run_duration)
def Run(self, args): instances_flags.ValidateBulkDiskFlags( args, enable_snapshots=True, enable_source_snapshot_csek=self._support_source_snapshot_csek, enable_image_csek=self._support_image_csek) instances_flags.ValidateImageFlags(args) instances_flags.ValidateLocalSsdFlags(args) instances_flags.ValidateNicFlags(args) instances_flags.ValidateServiceAccountAndScopeArgs(args) instances_flags.ValidateAcceleratorArgs(args) instances_flags.ValidateNetworkTierArgs(args) instances_flags.ValidateReservationAffinityGroup(args) holder = base_classes.ComputeApiHolder(self.ReleaseTrack()) compute_client = holder.client resource_parser = holder.resources project = properties.VALUES.core.project.GetOrFail() location = None scope = None if args.IsSpecified('zone'): location = args.zone scope = compute_scopes.ScopeEnum.ZONE elif args.IsSpecified('region'): location = args.region scope = compute_scopes.ScopeEnum.REGION instances_service, request = self._CreateRequests( args, holder, compute_client, resource_parser, project, location, scope) self._errors = [] self._log_async = False self._status_message = None if args.async_: self._log_async = True try: response = instances_service.BulkInsert(request) self._operation_selflink = response.selfLink return except exceptions.HttpError as error: raise error errors_to_collect = [] response = compute_client.MakeRequests( [(instances_service, 'BulkInsert', request)], errors_to_collect=errors_to_collect, log_result=False, always_return_operation=True, no_followup=True) self._errors = errors_to_collect if response: self._status_message = response[0].statusMessage return
def _ValidateInstancesFlags(args, support_kms=False,): """Validate flags for instance template that affects instance creation. Args: args: argparse.Namespace, An object that contains the values for the arguments specified in the .Args() method. support_kms: If KMS is supported. """ instances_flags.ValidateDiskCommonFlags(args) instances_flags.ValidateDiskBootFlags(args, enable_kms=support_kms) instances_flags.ValidateCreateDiskFlags(args) instances_flags.ValidateLocalSsdFlags(args) instances_flags.ValidateNicFlags(args) instances_flags.ValidateServiceAccountAndScopeArgs(args) instances_flags.ValidateAcceleratorArgs(args) instances_flags.ValidateReservationAffinityGroup(args)
def Run(self, args): instances_flags.ValidateDiskFlags( args, enable_kms=self._support_kms, enable_snapshots=True, enable_source_snapshot_csek=self._support_source_snapshot_csek, enable_image_csek=self._support_image_csek) instances_flags.ValidateImageFlags(args) instances_flags.ValidateLocalSsdFlags(args) instances_flags.ValidateNicFlags(args) instances_flags.ValidateServiceAccountAndScopeArgs(args) instances_flags.ValidateAcceleratorArgs(args) instances_flags.ValidateNetworkTierArgs(args) instances_flags.ValidateReservationAffinityGroup(args) holder = base_classes.ComputeApiHolder(self.ReleaseTrack()) compute_client = holder.client resource_parser = holder.resources instance_refs = instance_utils.GetInstanceRefs(args, compute_client, holder) requests = self._CreateRequests( args, instance_refs, compute_client, resource_parser, holder) if not args.async_: # TODO(b/63664449): Replace this with poller + progress tracker. try: # Using legacy MakeRequests (which also does polling) here until # replaced by api_lib.utils.waiter. return compute_client.MakeRequests(requests) except exceptions.ToolException as e: invalid_machine_type_message_regex = ( r'Invalid value for field \'resource.machineType\': .+. ' r'Machine type with name \'.+\' does not exist in zone \'.+\'\.') if re.search(invalid_machine_type_message_regex, six.text_type(e)): raise exceptions.ToolException( six.text_type(e) + '\nUse `gcloud compute machine-types list --zones` to see the ' 'available machine types.') raise errors_to_collect = [] responses = compute_client.BatchRequests(requests, errors_to_collect) for r in responses: err = getattr(r, 'error', None) if err: errors_to_collect.append(poller.OperationErrors(err.errors)) if errors_to_collect: raise core_exceptions.MultiError(errors_to_collect) operation_refs = [holder.resources.Parse(r.selfLink) for r in responses] log.status.Print('NOTE: The users will be charged for public IPs when VMs ' 'are created.') for instance_ref, operation_ref in zip(instance_refs, operation_refs): log.status.Print('Instance creation in progress for [{}]: {}' .format(instance_ref.instance, operation_ref.SelfLink())) log.status.Print('Use [gcloud compute operations describe URI] command ' 'to check the status of the operation(s).') if not args.IsSpecified('format'): # For async output we need a separate format. Since we already printed in # the status messages information about operations there is nothing else # needs to be printed. args.format = 'disable' return responses
def Run(self, args): """Runs bulk create command. Args: args: argparse.Namespace, An object that contains the values for the arguments specified in the .Args() method. Returns: A resource object dispatched by display.Displayer(). """ instances_flags.ValidateBulkCreateArgs(args) if self._support_enable_target_shape: instances_flags.ValidateBulkTargetShapeArgs(args) instances_flags.ValidateLocationPolicyArgs(args) instances_flags.ValidateBulkDiskFlags( args, enable_source_snapshot_csek=self._support_source_snapshot_csek, enable_image_csek=self._support_image_csek) instances_flags.ValidateImageFlags(args) instances_flags.ValidateLocalSsdFlags(args) instances_flags.ValidateNicFlags(args) instances_flags.ValidateServiceAccountAndScopeArgs(args) instances_flags.ValidateAcceleratorArgs(args) instances_flags.ValidateNetworkTierArgs(args) instances_flags.ValidateReservationAffinityGroup(args) instances_flags.ValidateNetworkPerformanceConfigsArgs(args) instances_flags.ValidateInstanceScheduling( args, support_max_run_duration=self._support_max_run_duration) holder = base_classes.ComputeApiHolder(self.ReleaseTrack()) compute_client = holder.client resource_parser = holder.resources project = properties.VALUES.core.project.GetOrFail() location = None scope = None if args.IsSpecified('zone'): location = args.zone scope = compute_scopes.ScopeEnum.ZONE elif args.IsSpecified('region'): location = args.region scope = compute_scopes.ScopeEnum.REGION instances_service, request = self._CreateRequests( args, holder, compute_client, resource_parser, project, location, scope) self._errors = [] self._log_async = False self._status_message = None if args.async_: self._log_async = True try: response = instances_service.BulkInsert(request) self._operation_selflink = response.selfLink return {'operationGroupId': response.operationGroupId} except exceptions.HttpException as error: raise error errors_to_collect = [] response = compute_client.MakeRequests( [(instances_service, 'BulkInsert', request)], errors_to_collect=errors_to_collect, log_result=False, always_return_operation=True, no_followup=True) self._errors = errors_to_collect if response: operation_group_id = response[0].operationGroupId result = _GetResult(compute_client, request, operation_group_id) if result['createdInstanceCount'] is not None and result[ 'failedInstanceCount'] is not None: self._status_message = 'VM instances created: {}, failed: {}.'.format( result['createdInstanceCount'], result['failedInstanceCount']) return result return