syndicate/core/resources/dax_resource.py (92 lines of code) (raw):

""" Copyright 2018 EPAM Systems, Inc. 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. """ from time import time from syndicate.commons import deep_get from syndicate.commons.log_helper import get_logger, get_user_logger from syndicate.connection.helper import retry from syndicate.core.helper import unpack_kwargs from syndicate.core.resources.base_resource import BaseResource from syndicate.core.resources.helper import build_description_obj _LOG = get_logger(__name__) USER_LOG = get_user_logger() class DaxResource(BaseResource): def __init__(self, dax_conn, iam_conn): self.dax_conn = dax_conn self.iam_conn = iam_conn def create_cluster(self, args): return self.create_pool(self._create_cluster_from_meta, args) @unpack_kwargs def _create_cluster_from_meta(self, name, meta): role_name = meta['iam_role_name'] role_arn = self.iam_conn.check_if_role_exists(role_name) if not role_arn: message = f'Role {role_name} does not exist; ' \ f'Dax cluster {name} failed to be created.' _LOG.error(message) raise AssertionError(message) subnet_group_name = meta.get('subnet_group_name') subnet_ids = meta.get('subnet_ids') or [] if subnet_ids: _LOG.info(f'Subnet_ids \'{subnet_ids}\' were given. ' f'Creating Dax subnet group \'{subnet_group_name}\'') self.dax_conn.create_subnet_group( subnet_group_name=subnet_group_name, subnet_ids=subnet_ids ) _LOG.info(f'Dax subnet group with name {subnet_group_name} ' f'was created.') elif subnet_group_name: _LOG.info(f'Subnet_ids were not given. Assuming that subnet ' f'group \'{subnet_group_name}\' already exists') response = self.dax_conn.create_cluster( cluster_name=name, node_type=meta['node_type'], replication_factor=meta['replication_factor'], iam_role_arn=role_arn, subnet_group_name=subnet_group_name, cluster_endpoint_encryption_type=meta.get('cluster_endpoint_encryption_type'), security_group_ids=meta.get('security_group_ids') or [], parameter_group_name=meta.get('parameter_group_name'), availability_zones=meta.get('availability_zones') or [], tags=meta.get('tags') ) if response: _LOG.info(f'Dax cluster \'{name}\' was successfully created') return self.describe_cluster(name, meta, response['Cluster']) else: _LOG.warning(f'Dax cluster \'{name}\' was not created because ' f'it already exists') return self.describe_cluster(name, meta) def describe_cluster(self, name, meta, response=None): if not response: response = self.dax_conn.describe_cluster(name) if response: arn = response['ClusterArn'] del response['ClusterArn'] return { arn: build_description_obj(response, name, meta) } return {} def remove_cluster(self, args): return self.create_pool(self._remove_cluster, args) @unpack_kwargs def _remove_cluster(self, arn, config): cluster_name = config['resource_name'] subnet_group_name = deep_get(config, ['resource_meta', 'subnet_group_name']) \ if deep_get(config, ['resource_meta', 'subnet_ids']) else None try: self.dax_conn.delete_cluster(cluster_name, log_not_found_error=False) return {arn: config} except self.dax_conn.client.exceptions.InvalidClusterStateFault as e: USER_LOG.warning(e.response['Error']['Message'] + ' Remove it manually!') except self.dax_conn.client.exceptions.ClusterNotFoundFault: _LOG.warning(f'Dax cluster with name \'{cluster_name}\' not found') return {arn: config} if subnet_group_name: self._remove_subnet_group(subnet_group_name) def _remove_subnet_group(self, subnet_group_name): USER_LOG.info(f"Deleting subnet group '{subnet_group_name}'. " f"Please wait it may take up to 10 minutes.") self.dax_conn.delete_subnet_group(subnet_group_name) _LOG.info(f"Subnet group '{subnet_group_name}' removed successfully.")