def testAddUpdateLabelsFlags(self): parser = argparse.ArgumentParser() labels_util.AddUpdateLabelsFlags(parser) args = parser.parse_args([ '--update-labels=key1=value1,key2=value2', '--remove-labels=key3,key4', ]) self.assertFalse(hasattr(args, 'labels')) self.assertTrue(hasattr(args, 'update_labels')) self.assertTrue(hasattr(args, 'remove_labels')) expected_update = { 'key1': 'value1', 'key2': 'value2', } actual_update = labels_util.GetUpdateLabelsDictFromArgs(args) self.assertEqual(expected_update, actual_update) expected_remove = [ 'key3', 'key4', ] actual_remove = labels_util.GetRemoveLabelsListFromArgs(args) self.assertEqual(expected_remove, actual_remove)
def Run(self, args): holder = base_classes.ComputeApiHolder(self.ReleaseTrack()) client = holder.client.apitools_client messages = holder.client.messages snapshot_ref = SnapshotsAddLabels.SnapshotArg.ResolveAsResource( args, holder.resources) add_labels = labels_util.GetUpdateLabelsDictFromArgs(args) snapshot = client.snapshots.Get( messages.ComputeSnapshotsGetRequest(**snapshot_ref.AsDict())) labels_update = labels_util.Diff(additions=add_labels).Apply( messages.GlobalSetLabelsRequest.LabelsValue, snapshot.labels) if not labels_update.needs_update: return snapshot request = messages.ComputeSnapshotsSetLabelsRequest( project=snapshot_ref.project, resource=snapshot_ref.snapshot, globalSetLabelsRequest=messages.GlobalSetLabelsRequest( labelFingerprint=snapshot.labelFingerprint, labels=labels_update.labels)) operation = client.snapshots.SetLabels(request) operation_ref = holder.resources.Parse( operation.selfLink, collection='compute.globalOperations') operation_poller = poller.Poller(client.snapshots) return waiter.WaitFor( operation_poller, operation_ref, 'Updating labels of snapshot [{0}]'.format(snapshot_ref.Name()))
def Run(self, args): """Run 'types create'. Args: args: argparse.Namespace, The arguments that this command was invoked with. Raises: HttpException: An http error response was received while executing api request. """ composite_type_ref = composite_types.GetReference( self.resources, args.name) update_labels_dict = labels_util.GetUpdateLabelsDictFromArgs(args) labels = dm_labels.UpdateLabels([], self.messages.CompositeTypeLabelEntry, update_labels=update_labels_dict) template_contents = composite_types.TemplateContentsFor( self.messages, args.template) composite_type = self.messages.CompositeType( name=args.name, description=args.description, status=args.status, templateContents=template_contents, labels=labels) request = self.messages.DeploymentmanagerCompositeTypesInsertRequest( project=composite_type_ref.project, compositeType=composite_type) dm_write.Execute(self.client, self.messages, self.resources, request, args. async, self.client.compositeTypes.Insert, LogResource)
def Run(self, args): holder = base_classes.ComputeApiHolder(self.ReleaseTrack()) client = holder.client.apitools_client messages = holder.client.messages ips_ref = self.IPS_ARG.ResolveAsResource( args, holder.resources, scope_lister=flags.GetDefaultScopeLister(holder.client)) add_labels = labels_util.GetUpdateLabelsDictFromArgs(args) ips_info = api_util.GetInPlaceSnapshotInfo(ips_ref, client, messages) ips = ips_info.GetInPlaceSnapshotResource() set_label_req = ips_info.GetSetLabelsRequestMessage() labels_update = labels_util.Diff(additions=add_labels).Apply( set_label_req.LabelsValue, ips.labels) request = ips_info.GetSetInPlaceSnapshotLabelsRequestMessage( ips, labels_update.GetOrNone()) if not labels_update.needs_update: return ips service = ips_info.GetService() operation = service.SetLabels(request) operation_ref = holder.resources.Parse( operation.selfLink, collection=ips_info.GetOperationCollection()) operation_poller = poller.Poller(service) return waiter.WaitFor( operation_poller, operation_ref, 'Updating labels of in-place snapshot [{0}]'.format( ips_ref.Name()))
def Run(self, args): """Run the deploy command.""" identifiers = args.CONCEPTS.environment.Parse().AsDict() labels_arg = labels_util.GetUpdateLabelsDictFromArgs(args) local_dir_archive = None try: local_dir_archive = cmd_lib.LocalDirectoryArchive(args.source) if args.bundle_file: local_dir_archive.ValidateZipFilePath(args.bundle_file) zip_file_path = args.bundle_file else: zip_file_path = local_dir_archive.Zip() upload_url = self._GetUploadUrl(identifiers) self._UploadArchive(upload_url, zip_file_path) operation = self._DeployArchive(identifiers, upload_url, labels_arg) if "organization" not in operation or "uuid" not in operation: raise waiter.OperationError( "Unknown operation response: {}".format(operation)) if "warnings" in operation["metadata"]: for warning in operation["metadata"]["warnings"]: log.warning(warning) log.info("Started archives deploy operation %s", operation["name"]) if args.async_: return operation waiter.WaitFor( apigee.LROPoller(operation["organization"]), operation["uuid"], message="Waiting for operation [{}] to complete".format( operation["uuid"]), wait_ceiling_ms=5000, ) finally: if local_dir_archive and hasattr(local_dir_archive, "Close"): local_dir_archive.Close()
def Run(self, args): """Run 'type-providers create'. Args: args: argparse.Namespace, The arguments that this command was invoked with. Raises: HttpException: An http error response was received while executing api request. """ type_provider_ref = self.resources.Parse( args.provider_name, params={'project': properties.VALUES.core.project.GetOrFail}, collection='deploymentmanager.typeProviders') update_labels_dict = labels_util.GetUpdateLabelsDictFromArgs(args) labels = dm_labels.UpdateLabels([], self.messages.TypeProviderLabelEntry, update_labels=update_labels_dict) type_provider = self.messages.TypeProvider( name=type_provider_ref.typeProvider, description=args.description, descriptorUrl=args.descriptor_url, labels=labels) type_providers.AddOptions(self.messages, args.api_options_file, type_provider) request = self.messages.DeploymentmanagerTypeProvidersInsertRequest( project=type_provider_ref.project, typeProvider=type_provider) dm_write.Execute(self.client, self.messages, self.resources, request, args. async, self.client.typeProviders.Insert, LogResource)
def Run(self, args): holder = base_classes.ComputeApiHolder(self.ReleaseTrack()) client = holder.client.apitools_client messages = holder.client.messages disk_ref = self.DISK_ARG.ResolveAsResource( args, holder.resources, scope_lister=flags.GetDefaultScopeLister(holder.client)) add_labels = labels_util.GetUpdateLabelsDictFromArgs(args) if disk_ref.Collection() == 'compute.disks': service = client.disks request_type = messages.ComputeDisksGetRequest elif disk_ref.Collection() == 'compute.regionDisks': service = client.regionDisks request_type = messages.ComputeRegionDisksGetRequest else: raise ValueError('Unexpected resource argument of {}'.format( disk_ref.Collection())) disk = service.Get(request_type(**disk_ref.AsDict())) if disk_ref.Collection() == 'compute.disks': operation_collection = 'compute.zoneOperations' labels_update = labels_util.Diff(additions=add_labels).Apply( messages.ZoneSetLabelsRequest.LabelsValue, disk.labels) request = messages.ComputeDisksSetLabelsRequest( project=disk_ref.project, resource=disk_ref.disk, zone=disk_ref.zone, zoneSetLabelsRequest=messages.ZoneSetLabelsRequest( labelFingerprint=disk.labelFingerprint, labels=labels_update.GetOrNone())) else: operation_collection = 'compute.regionOperations' labels_update = labels_util.Diff(additions=add_labels).Apply( messages.RegionSetLabelsRequest.LabelsValue, disk.labels) request = messages.ComputeRegionDisksSetLabelsRequest( project=disk_ref.project, resource=disk_ref.disk, region=disk_ref.region, regionSetLabelsRequest=messages.RegionSetLabelsRequest( labelFingerprint=disk.labelFingerprint, labels=labels_update.GetOrNone())) if not labels_update.needs_update: return disk operation = service.SetLabels(request) operation_ref = holder.resources.Parse(operation.selfLink, collection=operation_collection) operation_poller = poller.Poller(service) return waiter.WaitFor( operation_poller, operation_ref, 'Updating labels of disk [{0}]'.format(disk_ref.Name()))
def _SetMetadata(self, args, deployment): if args.description: deployment.description = args.description label_dict = labels_util.GetUpdateLabelsDictFromArgs(args) if label_dict: deployment.labels = [ self.messages.DeploymentLabelEntry(key=k, value=v) for k, v in sorted(six.iteritems(label_dict)) ]
def _UpdateLabels(self, connection_profile, args): """Updates labels of the connection profile.""" add_labels = labels_util.GetUpdateLabelsDictFromArgs(args) remove_labels = labels_util.GetRemoveLabelsListFromArgs(args) value_type = self._messages.ConnectionProfile.LabelsValue update_result = labels_util.Diff(additions=add_labels, subtractions=remove_labels, clear=args.clear_labels).Apply( value_type, connection_profile.labels) if update_result.needs_update: connection_profile.labels = update_result.labels
def _UpdateLabels(self, stream, args): """Updates labels of the stream.""" add_labels = labels_util.GetUpdateLabelsDictFromArgs(args) remove_labels = labels_util.GetRemoveLabelsListFromArgs(args) value_type = self._messages.Stream.LabelsValue update_result = labels_util.Diff( additions=add_labels, subtractions=remove_labels, clear=args.clear_labels ).Apply(value_type, stream.labels) if update_result.needs_update: stream.labels = update_result.labels
def _UpdateLabels(self, args, migration_job, update_fields): """Updates labels of the migration job.""" add_labels = labels_util.GetUpdateLabelsDictFromArgs(args) remove_labels = labels_util.GetRemoveLabelsListFromArgs(args) value_type = self.messages.MigrationJob.LabelsValue update_result = labels_util.Diff( additions=add_labels, subtractions=remove_labels, clear=args.clear_labels).Apply(value_type) if update_result.needs_update: migration_job.labels = update_result.labels update_fields.append('labels')
def Run(self, args): labels = labels_util.GetUpdateLabelsDictFromArgs(args) restore_ref = args.CONCEPTS.restore.Parse() if args.IsSpecified('async'): return api_util.CreateRestore(restore_ref, backup=args.backup, description=args.description, labels=labels) api_util.CreateRestoreAndWaitForLRO(restore_ref, backup=args.backup, description=args.description, labels=labels) if not args.IsSpecified('wait_for_completion'): return [] return api_util.WaitForRestoreToFinish(restore_ref.RelativeName())
def Run(self, args): """Run 'type-providers update'. Args: args: argparse.Namespace, The arguments that this command was invoked with. Raises: HttpException: An http error response was received while executing api request. """ type_provider_ref = type_providers.GetReference(self.resources, args.provider_name) project = type_provider_ref.project name = type_provider_ref.typeProvider get_request = self.messages.DeploymentmanagerTypeProvidersGetRequest( project=project, typeProvider=name) existing_tp = self.client.typeProviders.Get(get_request) labels = dm_labels.UpdateLabels( existing_tp.labels, self.messages.TypeProviderLabelEntry, labels_util.GetUpdateLabelsDictFromArgs(args), labels_util.GetRemoveLabelsListFromArgs(args)) type_provider = self.messages.TypeProvider(name=name, description=args.description, descriptorUrl=(args. descriptor_url), labels=labels) type_providers.AddOptions(self.messages, args.api_options_file, type_provider) update_request = self.messages.DeploymentmanagerTypeProvidersUpdateRequest( project=project, typeProvider=args.provider_name, typeProviderResource=type_provider) dm_write.Execute(self.client, self.messages, self.resources, update_request, args.async_, self.client.typeProviders.Update, LogResource)
def Run(self, args): holder = base_classes.ComputeApiHolder(self.ReleaseTrack()) client = holder.client.apitools_client messages = holder.client.messages instance_ref = flags.INSTANCE_ARG.ResolveAsResource( args, holder.resources, scope_lister=flags.GetInstanceZoneScopeLister(holder.client)) remove_labels = labels_util.GetUpdateLabelsDictFromArgs(args) instance = client.instances.Get( messages.ComputeInstancesGetRequest(**instance_ref.AsDict())) if args.all: # removing all existing labels from the instance. remove_labels = {} if instance.labels: for label in instance.labels.additionalProperties: remove_labels[label.key] = label.value labels_update = labels_util.Diff(subtractions=remove_labels).Apply( messages.InstancesSetLabelsRequest.LabelsValue, instance.labels) if not labels_update.needs_update: return instance request = messages.ComputeInstancesSetLabelsRequest( project=instance_ref.project, instance=instance_ref.instance, zone=instance_ref.zone, instancesSetLabelsRequest= messages.InstancesSetLabelsRequest( labelFingerprint=instance.labelFingerprint, labels=labels_update.labels)) operation = client.instances.SetLabels(request) operation_ref = holder.resources.Parse( operation.selfLink, collection='compute.zoneOperations') operation_poller = poller.Poller(client.instances) return waiter.WaitFor( operation_poller, operation_ref, 'Changing labels of instance [{0}]'.format( instance_ref.Name()))
def Run(self, args): labels = labels_util.GetUpdateLabelsDictFromArgs(args) backup_ref = args.CONCEPTS.backup.Parse() if args.IsSpecified('async'): return api_util.CreateBackup( backup_ref, description=args.description, labels=labels, retain_days=args.retain_days, delete_lock_days=args.delete_lock_days) api_util.CreateBackupAndWaitForLRO( backup_ref, description=args.description, labels=labels, retain_days=args.retain_days, delete_lock_days=args.delete_lock_days) if not args.IsSpecified('wait_for_completion'): return [] return api_util.WaitForBackupToFinish(backup_ref.RelativeName())
def Run(self, args): holder = base_classes.ComputeApiHolder(self.ReleaseTrack()) client = holder.client.apitools_client messages = holder.client.messages image_ref = self.DISK_IMAGE_ARG.ResolveAsResource( args, holder.resources) remove_labels = labels_util.GetUpdateLabelsDictFromArgs(args) image = client.images.Get( messages.ComputeImagesGetRequest(**image_ref.AsDict())) if args.all: # removing all existing labels from the image. remove_labels = {} if image.labels: for label in image.labels.additionalProperties: remove_labels[label.key] = label.value labels_update = labels_util.Diff(subtractions=remove_labels).Apply( messages.GlobalSetLabelsRequest.LabelsValue, image.labels) if not labels_update.needs_update: return image request = messages.ComputeImagesSetLabelsRequest( project=image_ref.project, resource=image_ref.image, globalSetLabelsRequest= messages.GlobalSetLabelsRequest( labelFingerprint=image.labelFingerprint, labels=labels_update.labels)) operation = client.images.SetLabels(request) operation_ref = holder.resources.Parse( operation.selfLink, collection='compute.globalOperations') operation_poller = poller.Poller(client.images) return waiter.WaitFor( operation_poller, operation_ref, 'Updating labels of image [{0}]'.format( image_ref.Name()))
def Run(self, args): """Run 'types update'. Args: args: argparse.Namespace, The arguments that this command was invoked with. Raises: HttpException: An http error response was received while executing api request. """ composite_type_ref = composite_types.GetReference(self.resources, args.name) get_request = self.messages.DeploymentmanagerCompositeTypesGetRequest( project=composite_type_ref.project, compositeType=args.name) existing_ct = self.client.compositeTypes.Get(get_request) labels = dm_labels.UpdateLabels( existing_ct.labels, self.messages.CompositeTypeLabelEntry, labels_util.GetUpdateLabelsDictFromArgs(args), labels_util.GetRemoveLabelsListFromArgs(args)) composite_type = self.messages.CompositeType( name=args.name, description=args.description, status=args.status, templateContents=existing_ct.templateContents, labels=labels) update_request = self.messages.DeploymentmanagerCompositeTypesUpdateRequest( project=composite_type_ref.project, compositeType=args.name, compositeTypeResource=composite_type) dm_write.Execute(self.client, self.messages, self.resources, update_request, args.async_, self.client.compositeTypes.Update, LogResource)
def Run(self, args): """Run the deploy command.""" identifiers = args.CONCEPTS.environment.Parse().AsDict() labels_arg = labels_util.GetUpdateLabelsDictFromArgs(args) # Using as a context manager automatically cleans up the temp file on exit. with cmd_lib.LocalDirectoryArchive(args.source) as local_dir_archive: zip_file_path = local_dir_archive.Zip() upload_url = self._GetUploadUrl(identifiers) self._UploadArchive(upload_url, zip_file_path) operation = self._DeployArchive(identifiers, upload_url, labels_arg) if "organization" not in operation or "uuid" not in operation: raise waiter.OperationError( "Unknown operation response: {}".format(operation)) if args.async_: return operation log.info("Started archives deploy operation %s", operation["name"]) waiter.WaitFor( apigee.LROPoller(operation["organization"]), operation["uuid"], message="Waiting for operation [{}] to complete".format( operation["uuid"]))
def Run(self, args): holder = base_classes.ComputeApiHolder(self.ReleaseTrack()) client = holder.client.apitools_client messages = holder.client.messages image_ref = self.DISK_IMAGE_ARG.ResolveAsResource( args, holder.resources, scope_lister=flags.GetDefaultScopeLister(holder.client)) add_labels = labels_util.GetUpdateLabelsDictFromArgs(args) image = client.images.Get( messages.ComputeImagesGetRequest(**image_ref.AsDict())) labels_update = labels_util.Diff(additions=add_labels).Apply( messages.GlobalSetLabelsRequest.LabelsValue, image.labels) if not labels_update.needs_update: return image request = messages.ComputeImagesSetLabelsRequest( project=image_ref.project, resource=image_ref.image, globalSetLabelsRequest= messages.GlobalSetLabelsRequest( labelFingerprint=image.labelFingerprint, labels=labels_update.labels)) operation = client.images.SetLabels(request) operation_ref = holder.resources.Parse( operation.selfLink, collection='compute.globalOperations') operation_poller = poller.Poller(client.images) return waiter.WaitFor( operation_poller, operation_ref, 'Updating labels of image [{0}]'.format( image_ref.Name()))
def Run(self, args): holder = base_classes.ComputeApiHolder(self.ReleaseTrack()) client = holder.client.apitools_client messages = holder.client.messages disk_ref = self.DISK_ARG.ResolveAsResource( args, holder.resources, scope_lister=flags.GetDefaultScopeLister(holder.client)) remove_labels = labels_util.GetUpdateLabelsDictFromArgs(args) disk_info = api_util.GetDiskInfo(disk_ref, client, messages) disk = disk_info.GetDiskResource() if args.all: # removing all existing labels from the disk. remove_labels = {} if disk.labels: for label in disk.labels.additionalProperties: remove_labels[label.key] = label.value labels_diff = labels_util.Diff(subtractions=remove_labels) set_label_req = disk_info.GetSetLabelsRequestMessage() labels_update = labels_diff.Apply(set_label_req.LabelsValue, disk.labels) request = disk_info.GetSetDiskLabelsRequestMessage( disk, labels_update.GetOrNone()) if not labels_update.needs_update: return disk service = disk_info.GetService() operation = service.SetLabels(request) operation_ref = holder.resources.Parse( operation.selfLink, collection=disk_info.GetOperationCollection()) operation_poller = poller.Poller(service) return waiter.WaitFor( operation_poller, operation_ref, 'Updating labels of disk [{0}]'.format(disk_ref.Name()))
def _GetUpdatedDeploymentLabels(self, args, deployment): update_labels = labels_util.GetUpdateLabelsDictFromArgs(args) remove_labels = labels_util.GetRemoveLabelsListFromArgs(args) return dm_labels.UpdateLabels(deployment.labels, self.messages.DeploymentLabelEntry, update_labels, remove_labels)