186 lines
6.9 KiB
Python
186 lines
6.9 KiB
Python
# -*- coding: utf-8 -*- #
|
|
# Copyright 2023 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.
|
|
"""Support library to handle the deploy subcommands."""
|
|
|
|
from __future__ import absolute_import
|
|
from __future__ import division
|
|
from __future__ import unicode_literals
|
|
|
|
from googlecloudsdk.api_lib.clouddeploy import client_util
|
|
from googlecloudsdk.command_lib.deploy import automation_util
|
|
from googlecloudsdk.command_lib.deploy import custom_target_type_util
|
|
from googlecloudsdk.command_lib.deploy import deploy_policy_util
|
|
from googlecloudsdk.command_lib.deploy import manifest_util
|
|
from googlecloudsdk.command_lib.deploy import target_util
|
|
from googlecloudsdk.core import log
|
|
|
|
|
|
class DeployClient(object):
|
|
"""Client for managing Cloud Deploy delivery pipeline and target resources."""
|
|
|
|
def __init__(self, client=None, messages=None):
|
|
"""Initialize a deploy.DeployClient.
|
|
|
|
Args:
|
|
client: base_api.BaseApiClient, the client class for Cloud Deploy.
|
|
messages: module containing the definitions of messages for Cloud Deploy.
|
|
"""
|
|
self.client = client or client_util.GetClientInstance()
|
|
self.operation_client = client_util.OperationsClient()
|
|
self.messages = messages or client_util.GetMessagesModule(client)
|
|
self._pipeline_service = self.client.projects_locations_deliveryPipelines
|
|
|
|
def CreateResources(self, manifests, region):
|
|
"""Creates Cloud Deploy resources.
|
|
|
|
Asynchronously calls the API then iterate the operations
|
|
to check the status.
|
|
|
|
Args:
|
|
manifests: the list of parsed resource yaml definitions.
|
|
region: location ID.
|
|
"""
|
|
resource_dict = manifest_util.ParseDeployConfig(
|
|
self.messages, manifests, region
|
|
)
|
|
msg_template = 'Created Cloud Deploy resource: {}.'
|
|
operation_dict = {
|
|
resource.name: self.CreateDeliveryPipeline(resource)
|
|
for resource in resource_dict[
|
|
manifest_util.ResourceKind.DELIVERY_PIPELINE
|
|
]
|
|
}
|
|
self.operation_client.CheckOperationStatus(operation_dict, msg_template)
|
|
|
|
operation_dict = {
|
|
resource.name: target_util.PatchTarget(resource)
|
|
for resource in resource_dict[manifest_util.ResourceKind.TARGET]
|
|
}
|
|
self.operation_client.CheckOperationStatus(operation_dict, msg_template)
|
|
|
|
# Create automation resource.
|
|
operation_dict = {
|
|
resource.name: automation_util.PatchAutomation(resource)
|
|
for resource in resource_dict[manifest_util.ResourceKind.AUTOMATION]
|
|
}
|
|
self.operation_client.CheckOperationStatus(operation_dict, msg_template)
|
|
|
|
# Create custom target type resource.
|
|
operation_dict = {
|
|
resource.name: custom_target_type_util.PatchCustomTargetType(resource)
|
|
for resource in resource_dict[
|
|
manifest_util.ResourceKind.CUSTOM_TARGET_TYPE
|
|
]
|
|
}
|
|
self.operation_client.CheckOperationStatus(operation_dict, msg_template)
|
|
|
|
# Create deploy policy resource.
|
|
operation_dict = {
|
|
resource.name: deploy_policy_util.PatchDeployPolicy(resource)
|
|
for resource in resource_dict[manifest_util.ResourceKind.DEPLOY_POLICY]
|
|
}
|
|
self.operation_client.CheckOperationStatus(operation_dict, msg_template)
|
|
|
|
def DeleteResources(self, manifests, region, force):
|
|
"""Delete Cloud Deploy resources.
|
|
|
|
Asynchronously calls the API then iterate the operations
|
|
to check the status.
|
|
|
|
Args:
|
|
manifests: [str], the list of parsed resource yaml definitions.
|
|
region: str, location ID.
|
|
force: bool, if true, the delivery pipeline with sub-resources will be
|
|
deleted and its sub-resources will also be deleted.
|
|
"""
|
|
resource_dict = manifest_util.ParseDeployConfig(
|
|
self.messages, manifests, region
|
|
)
|
|
msg_template = 'Deleted Cloud Deploy resource: {}.'
|
|
operation_dict = {
|
|
resource.name: target_util.DeleteTarget(resource.name)
|
|
for resource in resource_dict[manifest_util.ResourceKind.TARGET]
|
|
}
|
|
self.operation_client.CheckOperationStatus(operation_dict, msg_template)
|
|
|
|
operation_dict = {
|
|
resource.name: custom_target_type_util.DeleteCustomTargetType(
|
|
resource.name
|
|
)
|
|
for resource in resource_dict[
|
|
manifest_util.ResourceKind.CUSTOM_TARGET_TYPE
|
|
]
|
|
}
|
|
self.operation_client.CheckOperationStatus(operation_dict, msg_template)
|
|
|
|
operation_dict = {
|
|
resource.name: automation_util.DeleteAutomation(resource.name)
|
|
for resource in resource_dict[manifest_util.ResourceKind.AUTOMATION]
|
|
}
|
|
self.operation_client.CheckOperationStatus(operation_dict, msg_template)
|
|
|
|
operation_dict = {
|
|
resource.name: self.DeleteDeliveryPipeline(resource, force)
|
|
for resource in resource_dict[
|
|
manifest_util.ResourceKind.DELIVERY_PIPELINE
|
|
]
|
|
}
|
|
self.operation_client.CheckOperationStatus(operation_dict, msg_template)
|
|
|
|
operation_dict = {
|
|
resource.name: deploy_policy_util.DeleteDeployPolicy(resource.name)
|
|
for resource in resource_dict[manifest_util.ResourceKind.DEPLOY_POLICY]
|
|
}
|
|
self.operation_client.CheckOperationStatus(operation_dict, msg_template)
|
|
|
|
def CreateDeliveryPipeline(self, pipeline_config):
|
|
"""Creates a delivery pipeline resource.
|
|
|
|
Args:
|
|
pipeline_config: apitools.base.protorpclite.messages.Message, delivery
|
|
pipeline message.
|
|
|
|
Returns:
|
|
The operation message.
|
|
"""
|
|
log.debug('Creating delivery pipeline: ' + repr(pipeline_config))
|
|
return self._pipeline_service.Patch(
|
|
self.messages.ClouddeployProjectsLocationsDeliveryPipelinesPatchRequest(
|
|
deliveryPipeline=pipeline_config,
|
|
allowMissing=True,
|
|
name=pipeline_config.name,
|
|
updateMask=manifest_util.PIPELINE_UPDATE_MASK,
|
|
)
|
|
)
|
|
|
|
def DeleteDeliveryPipeline(self, pipeline_config, force):
|
|
"""Deletes a delivery pipeline resource.
|
|
|
|
Args:
|
|
pipeline_config: apitools.base.protorpclite.messages.Message, delivery
|
|
pipeline message.
|
|
force: if true, the delivery pipeline with sub-resources will be deleted
|
|
and its sub-resources will also be deleted.
|
|
|
|
Returns:
|
|
The operation message. It could be none if the resource doesn't exist.
|
|
"""
|
|
log.debug('Deleting delivery pipeline: ' + repr(pipeline_config))
|
|
return self._pipeline_service.Delete(
|
|
self.messages.ClouddeployProjectsLocationsDeliveryPipelinesDeleteRequest(
|
|
allowMissing=True, name=pipeline_config.name, force=force
|
|
)
|
|
)
|