# -*- coding: utf-8 -*- # # Copyright 2020 Google LLC. All Rights Reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """Command for importing machine images in OVF format into GCE.""" from __future__ import absolute_import from __future__ import division from __future__ import unicode_literals import io from googlecloudsdk.api_lib.compute import base_classes from googlecloudsdk.api_lib.compute import daisy_utils from googlecloudsdk.api_lib.compute import utils from googlecloudsdk.calliope import base from googlecloudsdk.command_lib.compute import exceptions as compute_exceptions from googlecloudsdk.command_lib.compute.instances import flags as instances_flags from googlecloudsdk.command_lib.compute.os_config import flags from googlecloudsdk.core import log from googlecloudsdk.core.console import console_io from googlecloudsdk.core.resource import resource_printer _OUTPUT_FILTER = [] _OS_UPGRADE_OPERATION_TYPE = 'os-upgrade' _OS_CHOICES_SOURCE = [ 'windows-2008r2', ] _OS_CHOICES_TARGET = [ 'windows-2012r2', ] _OS_UPGRADE_PROMPT = 'The following instance will be upgraded.' @base.ReleaseTracks(base.ReleaseTrack.ALPHA, base.ReleaseTrack.BETA) class OsUpgrade(base.Command): """Upgrade a instance's OS version.""" @classmethod def Args(cls, parser): parser.add_argument( '--source-os', required=True, choices=sorted(_OS_CHOICES_SOURCE), help='OS version of the source instance to upgrade.') parser.add_argument( '--target-os', required=True, choices=sorted(_OS_CHOICES_TARGET), help='Version of the OS after upgrade.') parser.add_argument( '--create-machine-backup', required=False, action='store_true', default=True, help='When enabled, a machine image is created that backs up the ' 'original state of your instance.') parser.add_argument( '--auto-rollback', required=False, action='store_true', help='When auto rollback is enabled, the instance and its resources ' 'are restored to their original state. Otherwise, the instance ' 'and any temporary resources are left in the intermediate state ' 'of the time of failure. This is useful for debugging.') parser.add_argument( '--use-staging-install-media', required=False, action='store_true', help='Use staging install media. This flag is for testing only. Set to ' 'true to upgrade with staging windows install media.', hidden=True) daisy_utils.AddCommonDaisyArgs(parser, operation='an upgrade') daisy_utils.AddExtraCommonDaisyArgs(parser) flags.INSTANCES_ARG_FOR_OS_UPGRADE.AddArgument( parser, operation_type=_OS_UPGRADE_OPERATION_TYPE) def _ValidateArgs(self, args, compute_client): daisy_utils.ValidateZone(args, compute_client) def Run(self, args): holder = base_classes.ComputeApiHolder(self.ReleaseTrack()) client = holder.client self._ValidateArgs(args, client) ref = flags.INSTANCES_ARG_FOR_OS_UPGRADE.ResolveAsResource( args, holder.resources, scope_lister=instances_flags.GetInstanceZoneScopeLister(client)) instance_uri = 'projects/{0}/zones/{1}/instances/{2}'.format( ref.project, ref.zone, ref.Name()) _PromptForUpgrade(ref, args) args.zone = ref.zone log.warning('Upgrading OS. This usually takes around 40 minutes but may ' 'take up to 90 minutes.') return daisy_utils.RunOsUpgradeBuild( args=args, output_filter=_OUTPUT_FILTER, instance_uri=instance_uri, release_track=self.ReleaseTrack().id.lower() if self.ReleaseTrack() else None ) OsUpgrade.detailed_help = { 'brief': 'Upgrade the instance''s OS version.', 'DESCRIPTION': """\ *{command}* upgrades the instance's OS version. OS Upgrade involves: * Create a snapshot and/or machine image for the instance. * Create an install media disk and attach it to the instance. * Upgrade the OS version. * Cleanup install media disk after upgrade. Virtual instances, snapshots, machine images, and disks in Compute Engine and files stored on Cloud Storage incur charges. See [](https://cloud.google.com/compute/docs/images/importing-virtual-disks#resource_cleanup). """, 'EXAMPLES': """\ To upgrade a instance named `my-instance` from windows-2008r2 to windows-2012r2, run: $ {command} my-instance --source-os=windows-2008r2 --target-os=windows-2012r2 """, } def _PromptForUpgrade(ref, args): """Prompts the user to confirm upgrade of instance.""" scope_name = 'zone' resource_type = utils.CollectionToResourceType(ref.Collection()) resource_name = utils.CamelCaseToOutputFriendly(resource_type) prompt_item = '[{0}] in [{1}]'.format(ref.Name(), getattr(ref, scope_name)) prompt_title = 'The following {0} will be upgraded from {1} to {2}:'.format( resource_name, args.source_os, args.target_os) buf = io.StringIO() fmt = 'list[title="{title}",always-display-title]'.format(title=prompt_title) resource_printer.Print(prompt_item, fmt, out=buf) prompt_message = buf.getvalue() if not console_io.PromptContinue(message=prompt_message): raise compute_exceptions.AbortedError('Upgrade aborted by user.')