194 lines
5.9 KiB
Python
194 lines
5.9 KiB
Python
# -*- coding: utf-8 -*- #
|
|
# Copyright 2022 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.
|
|
"""Base class for gkemulticloud API clients."""
|
|
|
|
from __future__ import absolute_import
|
|
from __future__ import division
|
|
from __future__ import unicode_literals
|
|
|
|
import itertools
|
|
|
|
from apitools.base.py import list_pager
|
|
from googlecloudsdk.api_lib.container.gkemulticloud import util
|
|
from googlecloudsdk.command_lib.container.gkemulticloud import flags
|
|
|
|
|
|
class ClientBase(object):
|
|
"""Base class for gkemulticloud API clients."""
|
|
|
|
def __init__(self, service=None, list_result_field=None):
|
|
self._client = util.GetClientInstance()
|
|
self._messages = util.GetMessagesModule()
|
|
self._service = service
|
|
self._list_result_field = list_result_field
|
|
|
|
def _Fleet(self, args):
|
|
kwargs = {
|
|
'project': flags.GetFleetProject(args),
|
|
}
|
|
return (
|
|
self._messages.GoogleCloudGkemulticloudV1Fleet(**kwargs)
|
|
if any(kwargs.values())
|
|
else None
|
|
)
|
|
|
|
def _MaxPodsConstraint(self, args):
|
|
kwargs = {'maxPodsPerNode': flags.GetMaxPodsPerNode(args)}
|
|
return (
|
|
self._messages.GoogleCloudGkemulticloudV1MaxPodsConstraint(**kwargs)
|
|
if any(kwargs.values())
|
|
else None
|
|
)
|
|
|
|
def _Labels(self, args, parent_type):
|
|
labels = flags.GetNodeLabels(args)
|
|
if not labels:
|
|
return None
|
|
label_type = parent_type.LabelsValue.AdditionalProperty
|
|
return parent_type.LabelsValue(
|
|
additionalProperties=[
|
|
label_type(key=k, value=v) for k, v in labels.items()
|
|
]
|
|
)
|
|
|
|
def _Tags(self, args, parent_type):
|
|
tags = flags.GetTags(args)
|
|
if not tags:
|
|
return None
|
|
tag_type = parent_type.TagsValue.AdditionalProperty
|
|
return parent_type.TagsValue(
|
|
additionalProperties=[tag_type(key=k, value=v) for k, v in tags.items()]
|
|
)
|
|
|
|
def _Annotations(self, args, parent_type):
|
|
"""Parses the annotations from the args.
|
|
|
|
Args:
|
|
args: Arguments to be parsed.
|
|
parent_type: Type of the parent object.
|
|
|
|
Returns:
|
|
Returns the parsed annotations.
|
|
"""
|
|
annotations = flags.GetAnnotations(args)
|
|
if not annotations:
|
|
return None
|
|
annotation_type = parent_type.AnnotationsValue.AdditionalProperty
|
|
return parent_type.AnnotationsValue(
|
|
additionalProperties=[
|
|
annotation_type(key=k, value=v) for k, v in annotations.items()
|
|
]
|
|
)
|
|
|
|
def _TagBindings(self, args, parent_type):
|
|
"""Parses the tag bindings from the args.
|
|
|
|
Args:
|
|
args: Arguments to be parsed.
|
|
parent_type: Type of the parent object.
|
|
|
|
Returns:
|
|
Returns the parsed tag bindings.
|
|
"""
|
|
tag_bindings = flags.GetResourceManagerTags(args)
|
|
if not tag_bindings:
|
|
return None
|
|
tag_binding_type = parent_type.TagsValue.AdditionalProperty
|
|
return parent_type.TagsValue(
|
|
additionalProperties=[
|
|
tag_binding_type(key=k, value=v) for k, v in tag_bindings.items()
|
|
]
|
|
)
|
|
|
|
def _BinaryAuthorization(self, args):
|
|
evaluation_mode = flags.GetBinauthzEvaluationMode(args)
|
|
if not evaluation_mode:
|
|
return None
|
|
return self._messages.GoogleCloudGkemulticloudV1BinaryAuthorization(
|
|
evaluationMode=evaluation_mode
|
|
)
|
|
|
|
def _SecurityPosture(self, args):
|
|
vulnerability_mode = flags.GetWorkloadVulnerabilityScanning(args)
|
|
if not vulnerability_mode:
|
|
return None
|
|
return self._messages.GoogleCloudGkemulticloudV1SecurityPostureConfig(
|
|
vulnerabilityMode=vulnerability_mode
|
|
)
|
|
|
|
def List(self, parent_ref, page_size=None, limit=None, parent_field='parent'):
|
|
"""Lists gkemulticloud API resources.
|
|
|
|
Args:
|
|
parent_ref: Reference to the parent field to list resources.
|
|
page_size: Page size for listing resources.
|
|
limit: Limit for listing resources.
|
|
parent_field: Name of the parent field.
|
|
|
|
Returns:
|
|
iterator: List of resources returned from the server.
|
|
bool: True if empty. False, otherwise.
|
|
"""
|
|
kwargs = {parent_field: parent_ref.RelativeName()}
|
|
req = self._service.GetRequestType('List')(**kwargs)
|
|
kwargs = {
|
|
'field': self._list_result_field,
|
|
'batch_size_attribute': 'pageSize',
|
|
}
|
|
if limit:
|
|
kwargs['limit'] = limit
|
|
if page_size:
|
|
kwargs['batch_size'] = page_size
|
|
items = list_pager.YieldFromList(self._service, req, **kwargs)
|
|
try:
|
|
first_item = next(items)
|
|
items = itertools.chain([first_item], items)
|
|
return items, False
|
|
except StopIteration:
|
|
return items, True
|
|
|
|
def Get(self, resource_ref):
|
|
"""Gets a gkemulticloud API resource."""
|
|
req = self._service.GetRequestType('Get')(name=resource_ref.RelativeName())
|
|
return self._service.Get(req)
|
|
|
|
def Delete(
|
|
self,
|
|
resource_ref,
|
|
validate_only=None,
|
|
allow_missing=None,
|
|
ignore_errors=None,
|
|
):
|
|
"""Deletes a gkemulticloud API resource."""
|
|
req = self._service.GetRequestType('Delete')(
|
|
name=resource_ref.RelativeName()
|
|
)
|
|
if validate_only:
|
|
req.validateOnly = True
|
|
if allow_missing:
|
|
req.allowMissing = True
|
|
if ignore_errors:
|
|
req.ignoreErrors = True
|
|
return self._service.Delete(req)
|
|
|
|
def HasNodePools(self, cluster_ref):
|
|
"""Checks if the cluster has a node pool."""
|
|
req = self._service.GetRequestType('List')(
|
|
parent=cluster_ref.RelativeName(), pageSize=1
|
|
)
|
|
res = self._service.List(req)
|
|
node_pools = getattr(res, self._list_result_field, None)
|
|
return True if node_pools else False
|