128 lines
4.4 KiB
Python
128 lines
4.4 KiB
Python
# -*- coding: utf-8 -*- #
|
|
# Copyright 2014 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.
|
|
"""Common classes and functions for zones."""
|
|
|
|
from __future__ import absolute_import
|
|
from __future__ import division
|
|
from __future__ import unicode_literals
|
|
|
|
from googlecloudsdk.api_lib.compute import request_helper
|
|
from googlecloudsdk.api_lib.compute import utils
|
|
from googlecloudsdk.command_lib.compute import exceptions
|
|
from googlecloudsdk.core.console import console_io
|
|
|
|
|
|
class ZoneResourceFetcher(object):
|
|
"""A (small) collection of utils for working with zones."""
|
|
|
|
def __init__(self, compute_client):
|
|
"""Instantiate ZoneResourceFetcher and embed all required data into it.
|
|
|
|
ZoneResourceFetcher is a class depending on "base_classes"
|
|
class layout (properties side-derived from one of base_class class). This
|
|
function can be used to avoid unfeasible inheritance and use composition
|
|
instead when refactoring away from base_classes into stateless style.
|
|
|
|
This constructor embeds following properties into ZoneResourceFetcher
|
|
instance:
|
|
- compute
|
|
- messages
|
|
- http
|
|
- batch_url
|
|
|
|
Example:
|
|
compute_holder = base_classes.ComputeApiHolder(self.ReleaseTrack())
|
|
client = compute_holder.client
|
|
|
|
zone_resource_fetcher = ZoneResourceFetcher(client)
|
|
or
|
|
zone_resource_fetcher = ZoneResourceFetcher(self.compute_client)
|
|
to use in a class derived from some of base_classes
|
|
|
|
zone_resource_fetcher.WarnForZonalCreation(...)
|
|
|
|
Args:
|
|
compute_client: compute_holder.client
|
|
"""
|
|
self._compute = compute_client.apitools_client
|
|
self._messages = compute_client.messages
|
|
self._http = compute_client.apitools_client.http
|
|
self._batch_url = compute_client.batch_url
|
|
|
|
def GetZones(self, resource_refs):
|
|
"""Fetches zone resources."""
|
|
errors = []
|
|
requests = []
|
|
zone_names = set()
|
|
for resource_ref in resource_refs:
|
|
if resource_ref.zone not in zone_names:
|
|
zone_names.add(resource_ref.zone)
|
|
requests.append((
|
|
self._compute.zones,
|
|
'Get',
|
|
self._messages.ComputeZonesGetRequest(
|
|
project=resource_ref.project,
|
|
zone=resource_ref.zone)))
|
|
|
|
res = list(request_helper.MakeRequests(
|
|
requests=requests,
|
|
http=self._http,
|
|
batch_url=self._batch_url,
|
|
errors=errors))
|
|
|
|
if errors:
|
|
return None
|
|
else:
|
|
return res
|
|
|
|
def WarnForZonalCreation(self, resource_refs):
|
|
"""Warns the user if a zone has upcoming deprecation."""
|
|
zones = self.GetZones(resource_refs)
|
|
if not zones:
|
|
return
|
|
|
|
prompts = []
|
|
zones_with_deprecated = []
|
|
for zone in zones:
|
|
if zone.deprecated:
|
|
zones_with_deprecated.append(zone)
|
|
|
|
if not zones_with_deprecated:
|
|
return
|
|
|
|
if zones_with_deprecated:
|
|
phrases = []
|
|
if len(zones_with_deprecated) == 1:
|
|
phrases = ('zone is', 'this zone', 'the')
|
|
else:
|
|
phrases = ('zones are', 'these zones', 'their')
|
|
title = ('\n'
|
|
'WARNING: The following selected {0} deprecated.'
|
|
' All resources in {1} will be deleted after'
|
|
' {2} turndown date.'.format(phrases[0], phrases[1], phrases[2]))
|
|
printable_deprecated_zones = []
|
|
for zone in zones_with_deprecated:
|
|
if zone.deprecated.deleted:
|
|
printable_deprecated_zones.append(('[{0}] {1}').format(zone.name,
|
|
zone.deprecated
|
|
.deleted))
|
|
else:
|
|
printable_deprecated_zones.append('[{0}]'.format(zone.name))
|
|
prompts.append(utils.ConstructList(title, printable_deprecated_zones))
|
|
|
|
final_message = ' '.join(prompts)
|
|
if not console_io.PromptContinue(message=final_message):
|
|
raise exceptions.AbortedError('Creation aborted by user.')
|