From 8b28e65a1d692b524717749523d9cf8270c12d94 Mon Sep 17 00:00:00 2001 From: Alex Shatov Date: Wed, 20 Sep 2017 17:27:25 -0400 Subject: renamed package to onap_dcae_dcaepolicy_lib Change-Id: I692c45488fc84270ab02eca5730a3dd9b6f100ca Issue-Id: DCAEGEN2-62 Signed-off-by: Alex Shatov --- python-dcae-policy/dcaepolicy/__init__.py | 22 --- python-dcae-policy/dcaepolicy/dcae_policy.py | 200 --------------------------- 2 files changed, 222 deletions(-) delete mode 100644 python-dcae-policy/dcaepolicy/__init__.py delete mode 100644 python-dcae-policy/dcaepolicy/dcae_policy.py (limited to 'python-dcae-policy/dcaepolicy') diff --git a/python-dcae-policy/dcaepolicy/__init__.py b/python-dcae-policy/dcaepolicy/__init__.py deleted file mode 100644 index b3658b1..0000000 --- a/python-dcae-policy/dcaepolicy/__init__.py +++ /dev/null @@ -1,22 +0,0 @@ -"""expose the Policies class on the package level""" - -# org.onap.dcae -# ================================================================================ -# Copyright (c) 2017 AT&T Intellectual Property. 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. -# ============LICENSE_END========================================================= -# -# ECOMP is a trademark and service mark of AT&T Intellectual Property. - -from .dcae_policy import Policies, POLICIES, POLICY_MESSAGE_TYPE diff --git a/python-dcae-policy/dcaepolicy/dcae_policy.py b/python-dcae-policy/dcaepolicy/dcae_policy.py deleted file mode 100644 index d64d50f..0000000 --- a/python-dcae-policy/dcaepolicy/dcae_policy.py +++ /dev/null @@ -1,200 +0,0 @@ -"""dcae_policy contains decorators for the policy lifecycle in cloudify""" - -# org.onap.dcae -# ================================================================================ -# Copyright (c) 2017 AT&T Intellectual Property. 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. -# ============LICENSE_END========================================================= -# -# ECOMP is a trademark and service mark of AT&T Intellectual Property. - -import json -import copy -from functools import wraps - -from cloudify import ctx -from cloudify.context import NODE_INSTANCE -from cloudify.exceptions import NonRecoverableError - -POLICIES = 'policies' - -POLICY_ID = 'policy_id' -POLICY_APPLY_MODE = 'policy_apply_mode' -POLICY_BODY = 'policy_body' -POLICY_VERSION = "policyVersion" -POLICY_CONFIG = 'config' -DCAE_POLICY_TYPE = 'dcae.nodes.policy' -POLICY_MESSAGE_TYPE = 'policy' - -class Policies(object): - """static class for policy operations""" - - @staticmethod - def gather_policies_to_node(func): - """decorate with @Policies.gather_policies_to_node to - gather the policies from dcae.nodes.policy nodes this node depends on. - - Places the policies into runtime_properties["policies"]. - - Call Policies.shallow_merge_policies_into(config) to merge the policies into config. - """ - def _merge_policy_with_node(target): - """get all properties of the policy node and add the actual policy""" - policy = dict(target.node.properties) - if POLICY_BODY in target.instance.runtime_properties: - policy[POLICY_BODY] = target.instance.runtime_properties[POLICY_BODY] - return policy - - if not func: - return - - @wraps(func) - def wrapper(*args, **kwargs): - """gather and save the policies from dcae.nodes.policy nodes this node related to""" - try: - if ctx.type == NODE_INSTANCE: - policies = dict([(rel.target.node.properties[POLICY_ID], \ - _merge_policy_with_node(rel.target)) \ - for rel in ctx.instance.relationships \ - if DCAE_POLICY_TYPE in rel.target.node.type_hierarchy \ - and POLICY_ID in rel.target.node.properties \ - and rel.target.node.properties[POLICY_ID] \ - ]) - if policies: - ctx.instance.runtime_properties[POLICIES] = policies - except Exception as ex: - error = "Failed to set the policies {0}".format(str(ex)) - ctx.logger.error(error) - raise NonRecoverableError(error) - - return func(*args, **kwargs) - return wrapper - - @staticmethod - def _update_policies_on_ctx(updated_policies): - """update policies in runtime_properties and return changed_policies""" - if POLICIES not in ctx.instance.runtime_properties: - return - if not updated_policies: - ctx.logger.error("update_policies_on_ctx - no updated_policies provided in arguments") - return - - policies = ctx.instance.runtime_properties[POLICIES] - ctx.logger.info("update_policies_on_ctx: {0}".format(json.dumps(updated_policies))) - changed_policies = [] - ignored_policies = [] - unexpected_policies = [] - same_policies = [] - for policy in updated_policies: - if POLICY_ID not in policy or policy[POLICY_ID] not in policies: - ignored_policies.append(policy) - continue - if POLICY_BODY not in policy or POLICY_VERSION not in policy[POLICY_BODY] \ - or not policy[POLICY_BODY][POLICY_VERSION]: - unexpected_policies.append(policy) - continue - - deployed_policy = policies[policy[POLICY_ID]].get(POLICY_BODY, {}) - new_policy_body = policy[POLICY_BODY] - if not deployed_policy or POLICY_VERSION not in deployed_policy \ - or not deployed_policy[POLICY_VERSION] \ - or deployed_policy[POLICY_VERSION] != new_policy_body[POLICY_VERSION]: - policies[policy[POLICY_ID]][POLICY_BODY] = new_policy_body - changed_policies.append(dict(policies[policy[POLICY_ID]])) - else: - same_policies.append(policy) - - if same_policies: - ctx.logger.info("same policies: {0}".format(json.dumps(same_policies))) - if ignored_policies: - ctx.logger.info("ignored policies: {0}".format(json.dumps(ignored_policies))) - if unexpected_policies: - ctx.logger.warn("unexpected policies: {0}".format(json.dumps(unexpected_policies))) - - if changed_policies: - ctx.instance.runtime_properties[POLICIES] = policies - return changed_policies - - @staticmethod - def update_policies_on_node(configs_only=True): - """decorate each policy_update operation with @Policies.update_policies_on_node to - filter out the updated_policies to only what applies to the current node instance, - update runtime_properties["policies"] - - :configs_only: - set to True if expect to see only the config in updated_policies - instead of the whole policy object (False) - - Passes through the filtered list of updated_policies that apply to the current node instance - - :updated_policies: contains the list of changed policy-configs when configs_only=True. - """ - def update_policies_decorator(func): - """actual decorator""" - if not func: - return - - @wraps(func) - def wrapper(updated_policies, **kwargs): - """update matching policies on context""" - if ctx.type != NODE_INSTANCE: - return - - updated_policies = Policies._update_policies_on_ctx(updated_policies) - if updated_policies: - if configs_only: - updated_policies = [policy[POLICY_BODY][POLICY_CONFIG] \ - for policy in updated_policies \ - if POLICY_BODY in policy \ - and POLICY_CONFIG in policy[POLICY_BODY] \ - ] - return func(updated_policies, **kwargs) - return wrapper - return update_policies_decorator - - - @staticmethod - def get_policy_configs(): - """returns the list of policy configs from the runtime policies""" - if ctx.type != NODE_INSTANCE \ - or POLICIES not in ctx.instance.runtime_properties: - return - policies = ctx.instance.runtime_properties[POLICIES] - if not policies: - return - policy_configs = [policies[policy_id][POLICY_BODY][POLICY_CONFIG] \ - for policy_id in policies \ - if POLICY_BODY in policies[policy_id] \ - and POLICY_CONFIG in policies[policy_id][POLICY_BODY] \ - ] - return policy_configs - - @staticmethod - def shallow_merge_policies_into(config): - """shallow merge the policy configs (dict) into config that is expected to be a dict""" - if config is None: - config = {} - policy_configs = Policies.get_policy_configs() - if not policy_configs or not isinstance(config, dict): - return config - - for policy_config in copy.deepcopy(policy_configs): - if not isinstance(policy_config, dict): - continue - - config.update(policy_config) - for cfg_item in policy_config: - if policy_config[cfg_item] is None: - config.pop(cfg_item, None) - - return config -- cgit 1.2.3-korg