diff options
author | 2018-02-23 14:56:36 -0500 | |
---|---|---|
committer | 2018-02-23 14:56:36 -0500 | |
commit | cfdd67d316e3436fb8054e07f883eceeff5bd08c (patch) | |
tree | c8cfff66970b3029a12b9fefe789dddf7342d9b7 | |
parent | d1a814370eb3e45368af9d6a76f8ded77cca5c82 (diff) |
store policies into consul-kv as <scn>:policies/
- now storing policies into consul-kv under folder
<service_cmponent_name>:policies/ as
items/<policy_id>=<policy_body> and
event={"action": "gathered", "policies_count": 30,
"timestamp": "2018-02-12T10:20:30.777Z",
"update_id": "0e79edc0-6c64-425e-a618-cc13ef50cd56"}}
- this data is going to be retrieved by config-binding service thru
a new API http GET
<CBS>/service_component_all/<service_component_name>
- passing policy_body objects to plugins that consume the Policies
decorators to pass to component
- new decorator to delete the <service_cmponent_name>:policies/
folder in consul-kv upon uninstalling the component
- sorting and merge of policy configs into application config
is not removed yet - to be done later
- fixed unit tests - coverage is 83%
Change-Id: Ie55be9298ac7889d516a5b884a2e24ac05c65a01
Signed-off-by: Alex Shatov <alexs@att.com>
Issue-ID: DCAEGEN2-347
-rw-r--r-- | onap-dcae-dcaepolicy-lib/README.md | 44 | ||||
-rw-r--r-- | onap-dcae-dcaepolicy-lib/onap_dcae_dcaepolicy_lib/__init__.py | 2 | ||||
-rw-r--r-- | onap-dcae-dcaepolicy-lib/onap_dcae_dcaepolicy_lib/dcae_policy.py | 138 | ||||
-rw-r--r-- | onap-dcae-dcaepolicy-lib/onap_dcae_dcaepolicy_lib/policies_output.py | 131 | ||||
-rw-r--r-- | onap-dcae-dcaepolicy-lib/pom.xml | 2 | ||||
-rw-r--r-- | onap-dcae-dcaepolicy-lib/setup.py | 3 | ||||
-rw-r--r-- | onap-dcae-dcaepolicy-lib/tests/test_dcae_policy.py | 98 |
7 files changed, 315 insertions, 103 deletions
diff --git a/onap-dcae-dcaepolicy-lib/README.md b/onap-dcae-dcaepolicy-lib/README.md index ff37256..221cc24 100644 --- a/onap-dcae-dcaepolicy-lib/README.md +++ b/onap-dcae-dcaepolicy-lib/README.md @@ -1,4 +1,5 @@ # onap-dcae-dcaepolicy-lib - policy in dcae controller + - python-package to be used in cloudify plugins to maintain the policies lifecycle ## upload the python package to pypi server @@ -8,23 +9,26 @@ python setup.py sdist upload ``` --- -# usage in plugins -**requirements.txt** +## usage in plugins + +### **requirements.txt** + ```python onap-dcae-dcaepolicy-lib==1.0.0 ``` -**tasks.py** -- import +### **tasks.py** + +import ```python from onap_dcae_dcaepolicy_lib import Policies ``` -# examples of **@operation** with **@Policies.<>** decorator +### examples of **@operation** with **@Policies.<>** decorator -## Usage +### Usage: import the dcaepolicy-node-type.yaml into your blueprint to use the dcae.nodes.type node @@ -46,9 +50,12 @@ node_templates: Then the dcaepolicyplugin will bring the latest policy to the dcae.nodes.policy node during the install workflow of cloudify. ------- -## cloudify.interfaces.lifecycle.**configure** +--- + +### cloudify.interfaces.lifecycle.**configure** + - gather policy data into runtime_properties of policy consumer node + ```yaml cloudify.interfaces.lifecycle: configure: @@ -105,8 +112,10 @@ def node_configure(**kwargs): demo_app.get_logs() ``` ------- -## execute-operation **policy-update** +--- + +### execute-operation **policy-update** + ```yaml dcae.interfaces.policy: policy_update: @@ -114,6 +123,7 @@ dcae.interfaces.policy: ``` execute-operation **policy-update** that gets a list of changed policy-configs + ```python from .discovery import DiscoveryClient @@ -156,17 +166,21 @@ def policy_update(updated_policies, **kwargs): ``` example of the **changed\_policies** with **configs_only=True** + - list of config objects (preparsed from json string) + - manual mess produced by mock_policy_updater + ```json [{ - "policy_updated_from_ver": "2", - "policy_updated_to_ver": "3", - "updated_policy_id": "DCAE_alex.Config_db_client_policy_id_value", - "policy_hello": "world!", - "policy_updated_ts": "2017-08-17T21:49:39.279187Z" + "policy_updated_from_ver": "2", + "policy_updated_to_ver": "3", + "updated_policy_id": "DCAE_alex.Config_db_client_policy_id_value", + "policy_hello": "world!", + "policy_updated_ts": "2017-08-17T21:49:39.279187Z" }] ``` + --- example of **policies** in runtime_properties **before policy-update** diff --git a/onap-dcae-dcaepolicy-lib/onap_dcae_dcaepolicy_lib/__init__.py b/onap-dcae-dcaepolicy-lib/onap_dcae_dcaepolicy_lib/__init__.py index 18b1b0c..547b16f 100644 --- a/onap-dcae-dcaepolicy-lib/onap_dcae_dcaepolicy_lib/__init__.py +++ b/onap-dcae-dcaepolicy-lib/onap_dcae_dcaepolicy_lib/__init__.py @@ -19,4 +19,4 @@ """expose the Policies class on the package level""" -from .dcae_policy import Policies, POLICIES, POLICY_MESSAGE_TYPE +from .dcae_policy import Policies diff --git a/onap-dcae-dcaepolicy-lib/onap_dcae_dcaepolicy_lib/dcae_policy.py b/onap-dcae-dcaepolicy-lib/onap_dcae_dcaepolicy_lib/dcae_policy.py index e4c5cea..b064157 100644 --- a/onap-dcae-dcaepolicy-lib/onap_dcae_dcaepolicy_lib/dcae_policy.py +++ b/onap-dcae-dcaepolicy-lib/onap_dcae_dcaepolicy_lib/dcae_policy.py @@ -20,14 +20,15 @@ """dcae_policy contains decorators for the policy lifecycle in cloudify""" import json +import traceback from copy import deepcopy from functools import wraps -import traceback from cloudify import ctx from cloudify.context import NODE_INSTANCE from cloudify.exceptions import NonRecoverableError +from .policies_output import PoliciesOutput from .utils import Utils POLICIES = 'policies' @@ -47,12 +48,14 @@ POLICY_FILTER = 'policy_filter' POLICY_FILTER_ID = 'policy_filter_id' POLICY_TYPE = 'policyType' POLICY_TYPE_MICROSERVICE = 'MicroService' -POLICY_CONFIG_MS = "Config_MS" +POLICY_CONFIG_MS = "Config_MS_" POLICY_PERSISTENT = 'policy_persistent' DCAE_POLICY_TYPE = 'dcae.nodes.policy' DCAE_POLICIES_TYPE = 'dcae.nodes.policies' -POLICY_MESSAGE_TYPE = 'policy' + +ACTION_GATHERED = "gathered" +ACTION_UPDATED = "updated" class Policies(object): """static class for policy operations""" @@ -195,15 +198,15 @@ class Policies(object): """ policy_defaulted_fields = ctx.instance.runtime_properties.get(POLICY_DEFAULTED_FIELDS, {}) policy_defaulted_fields.update( - (k, True) + (field_name, True) for policy in Policies._removed_policies.itervalues() - for k in Policies._get_config_from_policy(policy) or {} + for field_name in Policies._get_config_from_policy(policy) or {} ) if policies: for policy in policies.itervalues(): - for k in Policies._get_config_from_policy(policy) or {}: - if k in policy_defaulted_fields: - del policy_defaulted_fields[k] + for field_name in Policies._get_config_from_policy(policy) or {}: + if field_name in policy_defaulted_fields: + del policy_defaulted_fields[field_name] ctx.instance.runtime_properties[POLICY_DEFAULTED_FIELDS] = policy_defaulted_fields @@ -230,13 +233,25 @@ class Policies(object): Policies._set_policy_apply_order(policies) @staticmethod + def _get_policy_bodies_dict(policies): + """returns a dict of policy_id -> policy_body if policy_body exists""" + if not policies: + return {} + + return dict((policy_id, policy.get(POLICY_BODY)) + for policy_id, policy in policies.iteritems() if policy.get(POLICY_BODY) + ) + + @staticmethod def gather_policies_to_node(policy_apply_order_path=None): """ - decorate with @Policies.gather_policies_to_node to + 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"]. + Stores <scn>:policies data in consul-kv + Call Policies.calc_latest_application_config() to apply policies onto application_config. """ def gather_policies_decorator(func): @@ -301,6 +316,8 @@ class Policies(object): if ctx.type != NODE_INSTANCE: raise NonRecoverableError("can only invoke gather_policies_to_node on node") + policies_outputted = False + policy_bodies = [] try: Policies._store_policy_apply_order_clause(policy_apply_order_path) @@ -313,12 +330,21 @@ class Policies(object): Policies._set_policies(policies) if policy_filters: ctx.instance.runtime_properties[POLICY_FILTERS] = policy_filters + + policy_bodies = Policies._get_policy_bodies_dict(policies) + if policy_bodies: + policies_outputted = PoliciesOutput.store_policies(ACTION_GATHERED, policy_bodies) except Exception as ex: error = "Failed to set the policies {0}".format(str(ex)) ctx.logger.error("{0}: {1}".format(error, traceback.format_exc())) raise NonRecoverableError(error) - return func(*args, **kwargs) + func_result = func(*args, **kwargs) + + if not policies_outputted and policy_bodies: + PoliciesOutput.store_policies(ACTION_GATHERED, policy_bodies) + + return func_result return wrapper return gather_policies_decorator @@ -349,19 +375,17 @@ class Policies(object): for policy_id in removed_policies: removed_policy = policies.get(policy_id) - if removed_policy: + if removed_policy and POLICY_BODY in removed_policy: Policies._removed_policies[policy_id] = deepcopy(removed_policy) - if not removed_policy.get(POLICY_PERSISTENT): - del policies[policy_id] - elif POLICY_BODY in removed_policy: + if removed_policy.get(POLICY_PERSISTENT): del policies[policy_id][POLICY_BODY] + else: + del policies[policy_id] - new_policies = dict((p_id, policy) + new_policies = dict((policy_id, policy) for policy_filter_id in policy_filters - for (p_id, policy) in added_policies - .get(policy_filter_id, {}) - .get(POLICIES, {}) - .iteritems()) + for (policy_id, policy) in added_policies.get(policy_filter_id, {}) + .get(POLICIES, {}).iteritems()) ctx.logger.info("new_policies: {0}".format(json.dumps(new_policies))) @@ -373,13 +397,17 @@ class Policies(object): continue updated_policies.append(policy) - skipped = {"ignored" : [], "unexpected" : [], "same" : []} + skipped = {"ignored": [], "unexpected": [], "same": [], "duplicate": []} for policy in updated_policies: policy_id = policy.get(POLICY_ID) if not policy_id or policy_id not in policies: skipped["ignored"].append(policy) continue + if policy_id in Policies._updated_policies: + skipped["duplicate"].append(policy) + continue + updated_policy_body = policy.get(POLICY_BODY, {}) updated_policy_version = updated_policy_body.get(POLICY_VERSION) if not updated_policy_version or POLICY_CONFIG not in updated_policy_body: @@ -395,20 +423,25 @@ class Policies(object): policies[policy_id][POLICY_BODY] = updated_policy_body Policies._updated_policies[policy_id] = policy - if skipped["same"] or skipped["ignored"] or skipped["unexpected"]: - ctx.logger.info("skipped policies: {0}".format(json.dumps(skipped))) + if skipped["same"] or skipped["ignored"] or skipped["unexpected"] or skipped["duplicate"]: + ctx.logger.info("skipped updates on policies: {0}".format(json.dumps(skipped))) if Policies._updated_policies or Policies._removed_policies: Policies._set_policies(policies) + policy_bodies = Policies._get_policy_bodies_dict(policies) + PoliciesOutput.store_policies(ACTION_UPDATED, policy_bodies) @staticmethod - def update_policies_on_node(configs_only=True): - """decorate each policy_update operation with @Policies.update_policies_on_node to + def update_policies_on_node(configs_only=False): + """ + 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"] + updates <scn>:policies data in consul-kv + :configs_only: - set to True if expect to see only the config in updated_policies - instead of the whole policy object (False) + instead of the whole policy_body object (False) Passes through the filtered list of updated_policies that apply to the current node instance @@ -439,10 +472,16 @@ class Policies(object): if configs_only: updated_policies = Utils.remove_empties( [Policies._get_config_from_policy(policy) - for policy in updated_policies or []] + for policy in updated_policies] ) removed_policies = [Policies._get_config_from_policy(policy) - for policy in removed_policies or []] + for policy in removed_policies] + else: + updated_policies = Utils.remove_empties( + [policy.get(POLICY_BODY) for policy in updated_policies] + ) + removed_policies = [policy.get(POLICY_BODY) + for policy in removed_policies] except Exception as ex: error = "Failed to update the policies {0}".format(str(ex)) @@ -450,16 +489,41 @@ class Policies(object): raise NonRecoverableError(error) if updated_policies or removed_policies: - return func(updated_policies, removed_policies=removed_policies, **kwargs) + return func( + updated_policies, + removed_policies=removed_policies, + policies=Policies.get_policy_bodies(), + **kwargs) return wrapper return update_policies_decorator @staticmethod - def _get_ordered_policies(selected_policies=None): + def cleanup_policies_on_node(func): """ - returns the ordered list of selected policies from the runtime policies - ordered by policy_id values + decorate each policy_update operation with @Policies.cleanup_policies_on_node to + remove <scn>:policies data in consul-kv """ + if not func: + return + + @wraps(func) + def wrapper(**kwargs): + """cleanup policies in consul-kv""" + if ctx.type != NODE_INSTANCE: + raise NonRecoverableError("can only invoke cleanup_policies_on_node on node") + + try: + PoliciesOutput.delete_policies() + except Exception as ex: + error = "Failed to cleanup policies in consul-kv {0}".format(str(ex)) + ctx.logger.error("{0}: {1}".format(error, traceback.format_exc())) + + return func(**kwargs) + return wrapper + + @staticmethod + def _get_ordered_policies(selected_policies=None): + """returns the ordered list of selected policies from the runtime policies""" policies = ctx.instance.runtime_properties.get(POLICIES) apply_order = ctx.instance.runtime_properties.get(POLICY_APPLY_ORDER) if not policies or not apply_order: @@ -475,10 +539,7 @@ class Policies(object): @staticmethod def get_policy_configs(): - """ - returns the list of policy configs from the runtime policies - ordered by policy_id values - """ + """returns the ordered list of policy configs from the runtime policies""" if ctx.type != NODE_INSTANCE: return [] @@ -489,6 +550,13 @@ class Policies(object): ) @staticmethod + def get_policy_bodies(): + """returns the ordered list of policy_body objects if policy_body exists""" + return [policy.get(POLICY_BODY) + for policy in Policies._get_ordered_policies() + if policy.get(POLICY_BODY)] + + @staticmethod def shallow_merge_policies_into(config, default_config=None): """ shallow merge the :policy configs: (dict) into :config: that is expected to be a dict. diff --git a/onap-dcae-dcaepolicy-lib/onap_dcae_dcaepolicy_lib/policies_output.py b/onap-dcae-dcaepolicy-lib/onap_dcae_dcaepolicy_lib/policies_output.py new file mode 100644 index 0000000..7a1a8e8 --- /dev/null +++ b/onap-dcae-dcaepolicy-lib/onap_dcae_dcaepolicy_lib/policies_output.py @@ -0,0 +1,131 @@ +# org.onap.dcae +# ================================================================================ +# Copyright (c) 2018 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. +"""client to talk to consul at the standard port 8500 on localhost""" + +import base64 +import json +import urllib +import uuid +from datetime import datetime + +import requests +from cloudify import ctx + + +class PoliciesOutput(object): + """static class for store-delete policies in consul kv""" + # it is safe to assume that consul agent is at localhost:8500 along with cloudify manager + CONSUL_TRANSACTION_URL = "http://localhost:8500/v1/txn" + + POLICIES_EVENT = 'policies_event' + + POLICIES_FOLDER_MASK = "{0}:policies/{1}" + MAX_OPS_PER_TXN = 64 + # MAX_VALUE_LEN = 512 * 1000 + + OPERATION_SET = "set" + OPERATION_DELETE = "delete" + OPERATION_DELETE_FOLDER = "delete-tree" + SERVICE_COMPONENT_NAME = "service_component_name" + + @staticmethod + def _gen_txn_operation(verb, service_component_name, key=None, value=None): + """returns the properly formatted operation to be used inside transaction""" + key = PoliciesOutput.POLICIES_FOLDER_MASK.format(service_component_name, urllib.quote(key or "")) + if value: + return {"KV": {"Verb": verb, "Key": key, "Value": base64.b64encode(value)}} + return {"KV": {"Verb": verb, "Key": key}} + + @staticmethod + def _run_transaction(operation_name, txn): + """run a single transaction of several operations at consul /txn""" + if not txn: + return + + response = None + try: + response = requests.put(PoliciesOutput.CONSUL_TRANSACTION_URL, json=txn) + except requests.exceptions.RequestException as ex: + ctx.logger.error("failed to {0} at {1}: {2} on txn={3}" + .format(operation_name, PoliciesOutput.CONSUL_TRANSACTION_URL, + str(ex), json.dumps(txn))) + return + + if response.status_code != requests.codes.ok: + ctx.logger.error("failed {0} {1}: {2} text={3} txn={4} headers={5}" + .format(operation_name, PoliciesOutput.CONSUL_TRANSACTION_URL, response.status_code, + response.text, json.dumps(txn), + json.dumps(dict(response.request.headers.items())))) + return + ctx.logger.info("response for {0} {1}: {2} text={3} txn={4} headers={5}" + .format(operation_name, PoliciesOutput.CONSUL_TRANSACTION_URL, response.status_code, + response.text, json.dumps(txn), + json.dumps(dict(response.request.headers.items())))) + return True + + @staticmethod + def store_policies(action, policy_bodies): + """put the policy_bodies for service_component_name into consul-kv""" + service_component_name = ctx.instance.runtime_properties.get(PoliciesOutput.SERVICE_COMPONENT_NAME) + if not service_component_name: + ctx.logger.warn("failed to find service_component_name to store_policies in consul-kv") + return False + + event = { + "action": action, + "timestamp": (datetime.utcnow().isoformat()[:-3] + 'Z'), + "update_id": str(uuid.uuid4()), + "policies_count": len(policy_bodies) + } + ctx.instance.runtime_properties[PoliciesOutput.POLICIES_EVENT] = event + + store_policies = [ + PoliciesOutput._gen_txn_operation(PoliciesOutput.OPERATION_SET, service_component_name, + "items/" + policy_id, json.dumps(policy_body)) + for policy_id, policy_body in policy_bodies.iteritems() + ] + txn = [ + PoliciesOutput._gen_txn_operation(PoliciesOutput.OPERATION_DELETE_FOLDER, service_component_name), + PoliciesOutput._gen_txn_operation(PoliciesOutput.OPERATION_SET, service_component_name, "event", json.dumps(event)) + ] + idx_step = PoliciesOutput.MAX_OPS_PER_TXN - len(txn) + for idx in xrange(0, len(store_policies), idx_step): + txn += store_policies[idx : idx + idx_step] + if not PoliciesOutput._run_transaction("store_policies", txn): + return False + txn = [] + + PoliciesOutput._run_transaction("store_policies", txn) + return True + + @staticmethod + def delete_policies(): + """delete policies for service_component_name in consul-kv""" + if PoliciesOutput.POLICIES_EVENT not in ctx.instance.runtime_properties: + return + + service_component_name = ctx.instance.runtime_properties.get(PoliciesOutput.SERVICE_COMPONENT_NAME) + if not service_component_name: + ctx.logger.warn("failed to find service_component_name to delete_policies in consul-kv") + return + + delete_policies = [ + PoliciesOutput._gen_txn_operation(PoliciesOutput.OPERATION_DELETE_FOLDER, service_component_name) + ] + PoliciesOutput._run_transaction("delete_policies", delete_policies) diff --git a/onap-dcae-dcaepolicy-lib/pom.xml b/onap-dcae-dcaepolicy-lib/pom.xml index 03ceb8f..f89b157 100644 --- a/onap-dcae-dcaepolicy-lib/pom.xml +++ b/onap-dcae-dcaepolicy-lib/pom.xml @@ -28,7 +28,7 @@ ECOMP is a trademark and service mark of AT&T Intellectual Property. <groupId>org.onap.dcaegen2.utils</groupId> <artifactId>onap-dcae-dcaepolicy-lib</artifactId> <name>dcaegen2-utils-onap-dcae-dcaepolicy-lib</name> - <version>2.0.0-SNAPSHOT</version> + <version>2.1.0-SNAPSHOT</version> <url>http://maven.apache.org</url> <properties> diff --git a/onap-dcae-dcaepolicy-lib/setup.py b/onap-dcae-dcaepolicy-lib/setup.py index 0e5b2ef..8a82d16 100644 --- a/onap-dcae-dcaepolicy-lib/setup.py +++ b/onap-dcae-dcaepolicy-lib/setup.py @@ -24,7 +24,7 @@ from setuptools import setup, find_packages setup( name='onap-dcae-dcaepolicy-lib', description='lib of policy decorators to be used by cloudify plugins of dcae controller', - version="2.0.0", + version="2.1.0", author='Alex Shatov', author_email="alexs@att.com", license='Apache 2', @@ -33,7 +33,6 @@ setup( ], keywords='onap policy dcae controller cloudify plugin', classifiers=[ - 'Development Status :: 4 - Beta', 'Intended Audience :: Telecommunications Industry', 'Programming Language :: Python :: 2.7' ] diff --git a/onap-dcae-dcaepolicy-lib/tests/test_dcae_policy.py b/onap-dcae-dcaepolicy-lib/tests/test_dcae_policy.py index dca1e82..4af4855 100644 --- a/onap-dcae-dcaepolicy-lib/tests/test_dcae_policy.py +++ b/onap-dcae-dcaepolicy-lib/tests/test_dcae_policy.py @@ -31,7 +31,7 @@ from cloudify import ctx from cloudify.exceptions import NonRecoverableError from cloudify.state import current_ctx -from onap_dcae_dcaepolicy_lib import POLICIES, dcae_policy +from onap_dcae_dcaepolicy_lib import dcae_policy from onap_dcae_dcaepolicy_lib.dcae_policy import Policies from onap_dcae_dcaepolicy_lib.utils import Utils from tests.log_ctx import CtxLogger @@ -566,8 +566,8 @@ def test_gather_policies_to_node(): runtime_properties = ctx.instance.runtime_properties ctx.logger.info("runtime_properties: {0}".format(json.dumps(runtime_properties))) - assert POLICIES in runtime_properties - policies = runtime_properties[POLICIES] + assert dcae_policy.POLICIES in runtime_properties + policies = runtime_properties[dcae_policy.POLICIES] ctx.logger.info("policies: {0}".format(json.dumps(policies))) assert dcae_policy.POLICY_APPLY_ORDER in runtime_properties @@ -584,8 +584,8 @@ def test_policies_wrong_order(): runtime_properties = ctx.instance.runtime_properties ctx.logger.info("runtime_properties: {0}".format(json.dumps(runtime_properties))) - assert POLICIES in runtime_properties - policies = runtime_properties[POLICIES] + assert dcae_policy.POLICIES in runtime_properties + policies = runtime_properties[dcae_policy.POLICIES] ctx.logger.info("policies: {0}".format(json.dumps(policies))) assert dcae_policy.POLICY_APPLY_ORDER in runtime_properties @@ -602,8 +602,8 @@ def test_policies_empty_order(): runtime_properties = ctx.instance.runtime_properties ctx.logger.info("runtime_properties: {0}".format(json.dumps(runtime_properties))) - assert POLICIES in runtime_properties - policies = runtime_properties[POLICIES] + assert dcae_policy.POLICIES in runtime_properties + policies = runtime_properties[dcae_policy.POLICIES] ctx.logger.info("policies: {0}".format(json.dumps(policies))) assert dcae_policy.POLICY_APPLY_ORDER in runtime_properties @@ -624,8 +624,8 @@ def test_policies_damaged_order(): ctx.logger.info("runtime_properties: {0}".format(json.dumps(runtime_properties))) - assert POLICIES in runtime_properties - policies = runtime_properties[POLICIES] + assert dcae_policy.POLICIES in runtime_properties + policies = runtime_properties[dcae_policy.POLICIES] ctx.logger.info("policies: {0}".format(json.dumps(policies))) assert dcae_policy.POLICY_APPLY_ORDER in runtime_properties @@ -646,8 +646,8 @@ def test_policies_bad_order(): ctx.logger.info("runtime_properties: {0}".format(json.dumps(runtime_properties))) - assert POLICIES in runtime_properties - policies = runtime_properties[POLICIES] + assert dcae_policy.POLICIES in runtime_properties + policies = runtime_properties[dcae_policy.POLICIES] ctx.logger.info("policies: {0}".format(json.dumps(policies))) assert dcae_policy.POLICY_APPLY_ORDER in runtime_properties @@ -664,8 +664,8 @@ def test_policies_to_node(): runtime_properties = ctx.instance.runtime_properties ctx.logger.info("runtime_properties: {0}".format(json.dumps(runtime_properties))) - assert POLICIES in runtime_properties - policies = runtime_properties[POLICIES] + assert dcae_policy.POLICIES in runtime_properties + policies = runtime_properties[dcae_policy.POLICIES] ctx.logger.info("policies: {0}".format(json.dumps(policies))) assert dcae_policy.POLICY_APPLY_ORDER in runtime_properties @@ -714,8 +714,8 @@ def test_update_policies(): runtime_properties = ctx.instance.runtime_properties ctx.logger.info("runtime_properties: {0}".format(json.dumps(runtime_properties))) - assert POLICIES in runtime_properties - policies = runtime_properties[POLICIES] + assert dcae_policy.POLICIES in runtime_properties + policies = runtime_properties[dcae_policy.POLICIES] ctx.logger.info("policies: {0}".format(json.dumps(policies))) assert dcae_policy.POLICY_APPLY_ORDER in runtime_properties @@ -737,7 +737,7 @@ def test_update_policies(): policy_update(updated_policies=[updated_policy], added_policies={ policy_filter_ids[0]: { - POLICIES: {MONKEYED_POLICY_ID_M_2: added_policy}} + dcae_policy.POLICIES: {MONKEYED_POLICY_ID_M_2: added_policy}} }, removed_policies=[MONKEYED_POLICY_ID_M]) @@ -787,8 +787,8 @@ def test_update_not_only_config(): runtime_properties = ctx.instance.runtime_properties ctx.logger.info("runtime_properties: {0}".format(json.dumps(runtime_properties))) - assert POLICIES in runtime_properties - policies = runtime_properties[POLICIES] + assert dcae_policy.POLICIES in runtime_properties + policies = runtime_properties[dcae_policy.POLICIES] ctx.logger.info("policies: {0}".format(json.dumps(policies))) assert dcae_policy.POLICY_APPLY_ORDER in runtime_properties @@ -810,7 +810,7 @@ def test_update_not_only_config(): policy_update_not_only_config(updated_policies=[updated_policy], added_policies={ policy_filter_ids[0]: { - POLICIES: {MONKEYED_POLICY_ID_M_2: added_policy}} + dcae_policy.POLICIES: {MONKEYED_POLICY_ID_M_2: added_policy}} }, removed_policies=[MONKEYED_POLICY_ID_M]) @@ -860,9 +860,9 @@ def test_update_policies_not(): runtime_properties = ctx.instance.runtime_properties ctx.logger.info("runtime_properties: {0}".format(json.dumps(runtime_properties))) - assert POLICIES in runtime_properties + assert dcae_policy.POLICIES in runtime_properties assert APPLICATION_CONFIG in runtime_properties - policies = runtime_properties[POLICIES] + policies = runtime_properties[dcae_policy.POLICIES] app_config = runtime_properties[APPLICATION_CONFIG] ctx.logger.info("policies: {0}".format(json.dumps(policies))) ctx.logger.info("app_config: {0}".format(json.dumps(app_config))) @@ -898,9 +898,9 @@ def test_update_policies_not(): policy_update(updated_policies=[existing_policy, damaged_policy, updated_policy], added_policies={ junk_policy_filter_id: { - POLICIES: {MONKEYED_POLICY_ID_M_2: added_policy}}, + dcae_policy.POLICIES: {MONKEYED_POLICY_ID_M_2: added_policy}}, policy_filter_ids[0]: { - POLICIES: {MONKEYED_POLICY_ID_2: damaged_policy}} + dcae_policy.POLICIES: {MONKEYED_POLICY_ID_2: damaged_policy}} }, removed_policies=[unexpected_removed_policy_id]) @@ -927,8 +927,8 @@ def test_update_many_calcs(): runtime_properties = ctx.instance.runtime_properties ctx.logger.info("runtime_properties: {0}".format(json.dumps(runtime_properties))) - assert POLICIES in runtime_properties - policies = runtime_properties[POLICIES] + assert dcae_policy.POLICIES in runtime_properties + policies = runtime_properties[dcae_policy.POLICIES] ctx.logger.info("policies: {0}".format(json.dumps(policies))) assert dcae_policy.POLICY_APPLY_ORDER in runtime_properties @@ -950,7 +950,7 @@ def test_update_many_calcs(): policy_update_many_calcs(updated_policies=[updated_policy], added_policies={ policy_filter_ids[0]: { - POLICIES: {MONKEYED_POLICY_ID_M_2: added_policy}} + dcae_policy.POLICIES: {MONKEYED_POLICY_ID_M_2: added_policy}} }, removed_policies=[MONKEYED_POLICY_ID_M]) @@ -1000,8 +1000,8 @@ def test_remove_all_policies(): runtime_properties = ctx.instance.runtime_properties ctx.logger.info("runtime_properties: {0}".format(json.dumps(runtime_properties))) - assert POLICIES in runtime_properties - policies = runtime_properties[POLICIES] + assert dcae_policy.POLICIES in runtime_properties + policies = runtime_properties[dcae_policy.POLICIES] ctx.logger.info("policies: {0}".format(json.dumps(policies))) remove_policy_ids = policies.keys() @@ -1010,7 +1010,7 @@ def test_remove_all_policies(): ctx.logger.info("removed: {0}".format(remove_policy_ids)) ctx.logger.info("runtime_properties: {0}".format(json.dumps(runtime_properties))) - assert POLICIES in runtime_properties + assert dcae_policy.POLICIES in runtime_properties assert dcae_policy.POLICY_APPLY_ORDER in runtime_properties assert runtime_properties[dcae_policy.POLICY_APPLY_ORDER] == [] assert dcae_policy.POLICY_DEFAULTED_FIELDS in runtime_properties @@ -1040,8 +1040,8 @@ def test_remove_all_policies_twice(): runtime_properties = ctx.instance.runtime_properties ctx.logger.info("runtime_properties: {0}".format(json.dumps(runtime_properties))) - assert POLICIES in runtime_properties - policies = runtime_properties[POLICIES] + assert dcae_policy.POLICIES in runtime_properties + policies = runtime_properties[dcae_policy.POLICIES] ctx.logger.info("policies: {0}".format(json.dumps(policies))) remove_policy_ids = policies.keys() @@ -1051,7 +1051,7 @@ def test_remove_all_policies_twice(): ctx.logger.info("removed: {0}".format(remove_policy_ids)) ctx.logger.info("runtime_properties: {0}".format(json.dumps(runtime_properties))) - assert POLICIES in runtime_properties + assert dcae_policy.POLICIES in runtime_properties assert dcae_policy.POLICY_APPLY_ORDER in runtime_properties assert runtime_properties[dcae_policy.POLICY_APPLY_ORDER] == [] assert dcae_policy.POLICY_DEFAULTED_FIELDS in runtime_properties @@ -1081,8 +1081,8 @@ def test_remove_then_update(): runtime_properties = ctx.instance.runtime_properties ctx.logger.info("runtime_properties: {0}".format(json.dumps(runtime_properties))) - assert POLICIES in runtime_properties - policies = runtime_properties[POLICIES] + assert dcae_policy.POLICIES in runtime_properties + policies = runtime_properties[dcae_policy.POLICIES] ctx.logger.info("policies: {0}".format(json.dumps(policies))) assert dcae_policy.POLICY_APPLY_ORDER in runtime_properties @@ -1107,7 +1107,7 @@ def test_remove_then_update(): policy_update(updated_policies=[updated_policy], added_policies={ policy_filter_ids[0]: { - POLICIES: {MONKEYED_POLICY_ID_M_2: added_policy}} + dcae_policy.POLICIES: {MONKEYED_POLICY_ID_M_2: added_policy}} }, removed_policies=[MONKEYED_POLICY_ID_M]) @@ -1145,8 +1145,8 @@ def test_remove_update_many_calcs(): runtime_properties = ctx.instance.runtime_properties ctx.logger.info("runtime_properties: {0}".format(json.dumps(runtime_properties))) - assert POLICIES in runtime_properties - policies = runtime_properties[POLICIES] + assert dcae_policy.POLICIES in runtime_properties + policies = runtime_properties[dcae_policy.POLICIES] ctx.logger.info("policies: {0}".format(json.dumps(policies))) assert dcae_policy.POLICY_APPLY_ORDER in runtime_properties @@ -1160,8 +1160,8 @@ def test_remove_update_many_calcs(): added_policies=None, removed_policies=remove_policy_ids) - assert POLICIES in runtime_properties - policies = runtime_properties[POLICIES] + assert dcae_policy.POLICIES in runtime_properties + policies = runtime_properties[dcae_policy.POLICIES] ctx.logger.info("policies: {0}".format(json.dumps(policies))) assert dcae_policy.POLICY_APPLY_ORDER in runtime_properties @@ -1193,7 +1193,7 @@ def test_remove_update_many_calcs(): policy_update_many_calcs(updated_policies=[updated_policy], added_policies={ policy_filter_ids[0]: { - POLICIES: {MONKEYED_POLICY_ID_M_2: added_policy}} + dcae_policy.POLICIES: {MONKEYED_POLICY_ID_M_2: added_policy}} }, removed_policies=[MONKEYED_POLICY_ID_M]) @@ -1231,8 +1231,8 @@ def test_bad_update_many_calcs(): runtime_properties = ctx.instance.runtime_properties ctx.logger.info("runtime_properties: {0}".format(json.dumps(runtime_properties))) - assert POLICIES in runtime_properties - policies = runtime_properties[POLICIES] + assert dcae_policy.POLICIES in runtime_properties + policies = runtime_properties[dcae_policy.POLICIES] ctx.logger.info("policies: {0}".format(json.dumps(policies))) assert dcae_policy.POLICY_APPLY_ORDER in runtime_properties @@ -1258,7 +1258,7 @@ def test_bad_update_many_calcs(): policy_update_many_calcs(updated_policies=[damaged_policy], added_policies={ policy_filter_ids[0]: { - POLICIES: {MONKEYED_POLICY_ID_M_2: added_policy}} + dcae_policy.POLICIES: {MONKEYED_POLICY_ID_M_2: added_policy}} }, removed_policies=[MONKEYED_POLICY_ID_M]) @@ -1307,8 +1307,8 @@ def test_bad_policies(): runtime_properties = ctx.instance.runtime_properties ctx.logger.info("runtime_properties: {0}".format(json.dumps(runtime_properties))) - assert POLICIES in runtime_properties - policies = runtime_properties[POLICIES] + assert dcae_policy.POLICIES in runtime_properties + policies = runtime_properties[dcae_policy.POLICIES] ctx.logger.info("policies: {0}".format(json.dumps(policies))) assert dcae_policy.POLICY_APPLY_ORDER in runtime_properties @@ -1410,8 +1410,8 @@ def test_defenses_on_set_policies(): runtime_properties = ctx.instance.runtime_properties ctx.logger.info("runtime_properties: {0}".format(json.dumps(runtime_properties))) - assert POLICIES in runtime_properties - policies = runtime_properties[POLICIES] + assert dcae_policy.POLICIES in runtime_properties + policies = runtime_properties[dcae_policy.POLICIES] ctx.logger.info("policies: {0}".format(json.dumps(policies))) assert dcae_policy.POLICY_APPLY_ORDER in runtime_properties @@ -1420,10 +1420,10 @@ def test_defenses_on_set_policies(): Policies._set_policies({}) - assert POLICIES not in runtime_properties + assert dcae_policy.POLICIES not in runtime_properties assert dcae_policy.POLICY_APPLY_ORDER not in runtime_properties Policies._set_policies({}) - assert POLICIES not in runtime_properties + assert dcae_policy.POLICIES not in runtime_properties assert dcae_policy.POLICY_APPLY_ORDER not in runtime_properties |