shipyard/src/bin/shipyard_airflow/shipyard_airflow/control/validators/validate_deployment_strateg...

108 lines
4.0 KiB
Python

# Copyright 2018 AT&T Intellectual Property. All other 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.
"""Classes and functions to support Shipyard specific document validation
Only validates that which is not already covered by schema validation, which
is performed by Deckhand on Shipyard's behalf.
"""
import logging
from shipyard_airflow.common.deployment_group.deployment_group_manager import (
DeploymentGroupManager
)
from shipyard_airflow.common.deployment_group.errors import (
DeploymentGroupCycleError,
InvalidDeploymentGroupError,
InvalidDeploymentGroupNodeLookupError
)
from shipyard_airflow.common.deployment_group.node_lookup import NodeLookup
from shipyard_airflow.common.document_validators.document_validator import (
DocumentValidator
)
from shipyard_airflow.control import service_clients
from shipyard_airflow.control.helpers.design_reference_helper import (
DesignRefHelper
)
LOG = logging.getLogger(__name__)
def _get_node_lookup(revision_id):
# get a Drydock node_lookup function using the supplied revision_id
return NodeLookup(
service_clients.drydock_client(),
DesignRefHelper().get_design_reference_dict(revision_id)
).lookup
def _get_deployment_group_manager(groups, revision_id):
"""Retrieves the deployment group manager"""
return DeploymentGroupManager(groups, _get_node_lookup(revision_id))
class ValidateDeploymentStrategy(DocumentValidator):
"""Validates the deployment strategy"""
def __init__(self, **kwargs):
super().__init__(**kwargs)
schema = "shipyard/DeploymentStrategy/v1"
missing_severity = "Error"
def do_validate(self):
groups = self.doc_dict['groups']
try:
_get_deployment_group_manager(groups, self.revision)
except DeploymentGroupCycleError as dgce:
self.val_msg_list.append(self.val_msg(
name=dgce.__class__.__name__,
error=True,
level="Error",
message=("The deployment groups specified in the Deployment "
"Strategy have groups that form a "
"cycle."),
diagnostic=str(dgce)
))
self.error_status = True
except InvalidDeploymentGroupError as idge:
self.val_msg_list.append(self.val_msg(
name=idge.__class__.__name__,
error=True,
level="Error",
message=("A deployment group specified in the Deployment "
"Strategy is invalid"),
diagnostic=str(idge)
))
self.error_status = True
except InvalidDeploymentGroupNodeLookupError as idgnle:
self.val_msg_list.append(self.val_msg(
name=idgnle.__class__.__name__,
error=True,
level="Error",
message=("Shipyard does not have a valid node lookup to "
"validate the deployment strategy"),
diagnostic=str(idgnle)
))
self.error_status = True
except Exception as ex:
# all other exceptions are an error
self.val_msg_list.append(self.val_msg(
name="DocumentValidationProcessingError",
error=True,
level="Error",
message=("Shipyard has encountered an unexpected error "
"while processing document validations"),
diagnostic=str(ex)
))
self.error_status = True