File: //snap/google-cloud-cli/current/lib/surface/compute/instance_groups/managed/stop_autoscaling.py
# -*- coding: utf-8 -*- #
# Copyright 2015 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 stopping autoscaling of a managed instance group."""
from __future__ import absolute_import
from __future__ import division
from __future__ import unicode_literals
from googlecloudsdk.api_lib.compute import base_classes
from googlecloudsdk.api_lib.compute import managed_instance_groups_utils
from googlecloudsdk.calliope import base
from googlecloudsdk.command_lib.compute import flags
from googlecloudsdk.command_lib.compute import scope as compute_scope
from googlecloudsdk.command_lib.compute.instance_groups import flags as instance_groups_flags
def _IsZonalGroup(ref):
"""Checks if reference to instance group is zonal."""
return ref.Collection() == 'compute.instanceGroupManagers'
class StopAutoscaling(base.Command):
"""Stop autoscaling a managed instance group.
*{command}* stops autoscaling a managed instance group and deletes the
autoscaler configuration. If autoscaling is not enabled for the managed
instance group, this command does nothing and will report an error.
If you need to keep the autoscaler configuration, you can temporarily disable
an autoscaler by setting its `mode` to `off` using the ``update-autoscaling''
command instead.
"""
@staticmethod
def Args(parser):
instance_groups_flags.MULTISCOPE_INSTANCE_GROUP_MANAGER_ARG.AddArgument(
parser)
def CreateGroupReference(self, client, resources, args):
resource_arg = instance_groups_flags.MULTISCOPE_INSTANCE_GROUP_MANAGER_ARG
default_scope = compute_scope.ScopeEnum.ZONE
scope_lister = flags.GetDefaultScopeLister(client)
return resource_arg.ResolveAsResource(
args, resources, default_scope=default_scope,
scope_lister=scope_lister)
def GetAutoscalerServiceForGroup(self, client, group_ref):
if _IsZonalGroup(group_ref):
return client.apitools_client.autoscalers
else:
return client.apitools_client.regionAutoscalers
def ScopeRequest(self, request, igm_ref):
if _IsZonalGroup(igm_ref):
request.zone = igm_ref.zone
else:
request.region = igm_ref.region
def GetAutoscalerResource(self, client, resources, igm_ref, args):
if _IsZonalGroup(igm_ref):
scope_type = 'zone'
location = managed_instance_groups_utils.CreateZoneRef(
resources, igm_ref)
zones, regions = [location], None
else:
scope_type = 'region'
location = managed_instance_groups_utils.CreateRegionRef(
resources, igm_ref)
zones, regions = None, [location]
autoscaler = managed_instance_groups_utils.AutoscalerForMig(
mig_name=args.name,
autoscalers=managed_instance_groups_utils.AutoscalersForLocations(
regions=regions,
zones=zones,
client=client),
location=location,
scope_type=scope_type)
if autoscaler is None:
raise managed_instance_groups_utils.ResourceNotFoundException(
'The managed instance group is not autoscaled.')
return autoscaler
def Run(self, args):
holder = base_classes.ComputeApiHolder(self.ReleaseTrack())
client = holder.client
igm_ref = self.CreateGroupReference(client, holder.resources, args)
service = self.GetAutoscalerServiceForGroup(client, igm_ref)
# Assert that Instance Group Manager exists.
managed_instance_groups_utils.GetInstanceGroupManagerOrThrow(
igm_ref, client)
autoscaler = self.GetAutoscalerResource(client, holder.resources, igm_ref,
args)
request = service.GetRequestType('Delete')(
project=igm_ref.project,
autoscaler=autoscaler.name)
self.ScopeRequest(request, igm_ref)
return client.MakeRequests([(service, 'Delete', request)])