From 80f199c60874325c2330e8c1c8804ce9b70e43c4 Mon Sep 17 00:00:00 2001 From: Alex Shatov Date: Thu, 12 Apr 2018 17:15:52 -0400 Subject: 2.4.0 onap-dcae-dcaepolicy-lib - discovering consul at consul:8500 instead of localhost:8500 - added and refactored unit tests for discovery -- coverage 94% Change-Id: Id9f52cf95ab3dca0b2759021b408925a1dc87264 Signed-off-by: Alex Shatov Issue-ID: DCAEGEN2-438 --- onap-dcae-dcaepolicy-lib/tests/test_dcae_policy.py | 203 +++++++++++++++++++-- 1 file changed, 191 insertions(+), 12 deletions(-) (limited to 'onap-dcae-dcaepolicy-lib/tests') diff --git a/onap-dcae-dcaepolicy-lib/tests/test_dcae_policy.py b/onap-dcae-dcaepolicy-lib/tests/test_dcae_policy.py index 37ab9f6..4b3e39c 100644 --- a/onap-dcae-dcaepolicy-lib/tests/test_dcae_policy.py +++ b/onap-dcae-dcaepolicy-lib/tests/test_dcae_policy.py @@ -25,12 +25,14 @@ from datetime import datetime, timedelta from functools import wraps import pytest +import requests from cloudify import ctx from cloudify.exceptions import NonRecoverableError from cloudify.state import current_ctx from onap_dcae_dcaepolicy_lib import dcae_policy from onap_dcae_dcaepolicy_lib.dcae_policy import Policies +from onap_dcae_dcaepolicy_lib.policies_output import PoliciesOutput from tests.log_ctx import CtxLogger from tests.mock_cloudify_ctx import (TARGET_NODE_ID, TARGET_NODE_NAME, MockCloudifyContextFull) @@ -167,6 +169,23 @@ class MonkeyedNode(object): runtime_properties=runtime_properties ) +class MonkeyedResponse(object): + """Monkey response""" + def __init__(self, full_path, headers=None, resp_json=None): + self.full_path = full_path + self.status_code = 200 + self.headers = headers or {} + self.resp_json = resp_json + self.text = json.dumps(resp_json or {}) + + def json(self): + """returns json of response""" + return self.resp_json + + def raise_for_status(self): + """always happy""" + pass + def get_app_config(): """just get the config""" config = copy.deepcopy(dict(ctx.instance.runtime_properties.get(APPLICATION_CONFIG, {}))) @@ -180,6 +199,7 @@ def operation_node_configure(**kwargs): app_config = get_app_config() ctx.instance.runtime_properties[APPLICATION_CONFIG] = app_config + ctx.instance.runtime_properties[PoliciesOutput.SERVICE_COMPONENT_NAME] = "unit_test_scn" ctx.logger.info("property app_config: {0}".format(json.dumps(app_config))) @CtxLogger.log_ctx(pre_log=True, after_log=True, exe_task='exe_task') @@ -190,18 +210,6 @@ def node_configure(**kwargs): """ operation_node_configure(**kwargs) -@CtxLogger.log_ctx(pre_log=True, after_log=True, exe_task='exe_task') -@Policies.gather_policies_to_node() -def node_configure_wrong_order_path(**kwargs): - """wrong data in param policy_apply_order_path""" - operation_node_configure(**kwargs) - -@CtxLogger.log_ctx(pre_log=True, after_log=True, exe_task='exe_task') -@Policies.gather_policies_to_node() -def node_configure_empty_order_path(**kwargs): - """wrong data in param policy_apply_order_path""" - operation_node_configure(**kwargs) - @CtxLogger.log_ctx(pre_log=True, after_log=True, exe_task='execute_operation') @Policies.update_policies_on_node() def policy_update(updated_policies, removed_policies=None, **kwargs): @@ -242,6 +250,14 @@ def policy_update_many_calcs(updated_policies, removed_policies=None, policies=N ctx.instance.runtime_properties[APPLICATION_CONFIG] = app_config + +@CtxLogger.log_ctx(pre_log=True, after_log=True, exe_task='exe_task') +@Policies.cleanup_policies_on_node +def node_delete(**kwargs): + """delete records in consul-kv""" + operation_node_configure(**kwargs) + + class CurrentCtx(object): """cloudify context""" _node_ms = None @@ -445,6 +461,35 @@ class CurrentCtx(object): """reset context""" current_ctx.set(CurrentCtx._node_ms.ctx) + +def monkeyed_consul_boom(full_path, json): + """boom on monkeypatch for the put to consul""" + raise requests.ConnectionError("monkey-boom") + + +@pytest.fixture() +def fix_consul_boom(monkeypatch): + """monkeyed discovery request.put""" + PoliciesOutput._lazy_inited = False + monkeypatch.setattr('requests.put', monkeyed_consul_boom) + yield fix_consul_boom + PoliciesOutput._lazy_inited = False + + +def monkeyed_consul_put(full_path, json): + """monkeypatch for the put to consul""" + return MonkeyedResponse(full_path) + + +@pytest.fixture() +def fix_consul(monkeypatch): + """monkeyed discovery request.put""" + PoliciesOutput._lazy_inited = False + monkeypatch.setattr('requests.put', monkeyed_consul_put) + yield fix_consul + PoliciesOutput._lazy_inited = False + + def cfy_ctx(include_bad=True, include_good=True): """test and safely clean up""" def cfy_ctx_decorator(func): @@ -468,6 +513,7 @@ def cfy_ctx(include_bad=True, include_good=True): return ctx_wrapper return cfy_ctx_decorator +@pytest.mark.usefixtures("fix_consul") @cfy_ctx(include_bad=True) def test_gather_policies_to_node(): """test gather_policies_to_node""" @@ -480,6 +526,7 @@ def test_gather_policies_to_node(): policies = runtime_properties[dcae_policy.POLICIES] ctx.logger.info("policies: {0}".format(json.dumps(policies))) +@pytest.mark.usefixtures("fix_consul") @cfy_ctx(include_bad=True) def test_policies_to_node(): """test gather_policies_to_node""" @@ -524,6 +571,7 @@ def test_policies_to_node(): assert MonkeyedPolicyBody.is_the_same_dict(policy, expected_m) assert MonkeyedPolicyBody.is_the_same_dict(expected_m, policy) +@pytest.mark.usefixtures("fix_consul") @cfy_ctx(include_bad=True) def test_update_policies(): """test policy_update""" @@ -584,6 +632,7 @@ def test_update_policies(): assert MonkeyedPolicyBody.is_the_same_dict(policy, expected_b) assert MonkeyedPolicyBody.is_the_same_dict(expected_b, policy) +@pytest.mark.usefixtures("fix_consul") @cfy_ctx(include_bad=True) def test_update_not_only_config(): """test policy_update""" @@ -644,6 +693,7 @@ def test_update_not_only_config(): assert MonkeyedPolicyBody.is_the_same_dict(policy, expected_b) assert MonkeyedPolicyBody.is_the_same_dict(expected_b, policy) +@pytest.mark.usefixtures("fix_consul") @cfy_ctx(include_bad=True) def test_update_policies_not(): """test policy_update - ignore all policies with junk params""" @@ -699,6 +749,7 @@ def test_update_policies_not(): assert MonkeyedPolicyBody.is_the_same_dict(app_config, expected_app_config) assert MonkeyedPolicyBody.is_the_same_dict(expected_app_config, app_config) +@pytest.mark.usefixtures("fix_consul") @cfy_ctx(include_bad=True) def test_update_many_calcs(): """test policy_update""" @@ -759,6 +810,7 @@ def test_update_many_calcs(): assert MonkeyedPolicyBody.is_the_same_dict(policy, expected_b) assert MonkeyedPolicyBody.is_the_same_dict(expected_b, policy) +@pytest.mark.usefixtures("fix_consul") @cfy_ctx(include_bad=True) def test_remove_all_policies(): """test policy_update - remove all policies""" @@ -788,6 +840,7 @@ def test_remove_all_policies(): assert MonkeyedPolicyBody.is_the_same_dict(app_config, expected_config) assert MonkeyedPolicyBody.is_the_same_dict(expected_config, app_config) +@pytest.mark.usefixtures("fix_consul") @cfy_ctx(include_bad=True) def test_remove_all_policies_twice(): """test policy_update - remove all policies twice""" @@ -818,6 +871,7 @@ def test_remove_all_policies_twice(): assert MonkeyedPolicyBody.is_the_same_dict(app_config, expected_config) assert MonkeyedPolicyBody.is_the_same_dict(expected_config, app_config) +@pytest.mark.usefixtures("fix_consul") @cfy_ctx(include_bad=True) def test_remove_then_update(): """test policy_update""" @@ -868,6 +922,7 @@ def test_remove_then_update(): assert MONKEYED_POLICY_ID in policies assert MONKEYED_POLICY_ID_B in policies +@pytest.mark.usefixtures("fix_consul") @cfy_ctx(include_bad=True) def test_remove_update_many_calcs(): """test policy_update""" @@ -924,6 +979,7 @@ def test_remove_update_many_calcs(): assert MONKEYED_POLICY_ID in policies assert MONKEYED_POLICY_ID_B in policies +@pytest.mark.usefixtures("fix_consul") @cfy_ctx(include_bad=True) def test_bad_update_many_calcs(): """test policy_update""" @@ -988,6 +1044,7 @@ def test_bad_update_many_calcs(): assert MonkeyedPolicyBody.is_the_same_dict(policy, expected_b) assert MonkeyedPolicyBody.is_the_same_dict(expected_b, policy) +@pytest.mark.usefixtures("fix_consul") @cfy_ctx(include_bad=True, include_good=False) def test_bad_policies(): """test bad policy nodes""" @@ -1000,6 +1057,7 @@ def test_bad_policies(): policies = runtime_properties[dcae_policy.POLICIES] ctx.logger.info("policies: {0}".format(json.dumps(policies))) +@pytest.mark.usefixtures("fix_consul") @cfy_ctx(include_bad=True, include_good=False) def test_wrong_ctx_node_configure(): """test wrong ctx""" @@ -1014,6 +1072,7 @@ def test_wrong_ctx_node_configure(): assert ctx_type == 'cloudify.relationships.depends_on' assert str(excinfo.value) == "can only invoke gather_policies_to_node on node" +@pytest.mark.usefixtures("fix_consul") @cfy_ctx(include_bad=True, include_good=False) def test_wrong_ctx_policy_update(): """test wrong ctx""" @@ -1105,3 +1164,123 @@ def test_defenses_on_set_policies(): Policies._set_policies({}) assert dcae_policy.POLICIES not in runtime_properties + +@pytest.mark.usefixtures("fix_consul") +@cfy_ctx(include_bad=True) +def test_delete_node(): + """test delete""" + node_configure() + + runtime_properties = ctx.instance.runtime_properties + ctx.logger.info("runtime_properties: {0}".format(json.dumps(runtime_properties))) + + assert dcae_policy.POLICIES in runtime_properties + policies = runtime_properties[dcae_policy.POLICIES] + ctx.logger.info("policies: {0}".format(json.dumps(policies))) + + node_delete() + + +@pytest.mark.usefixtures("fix_consul_boom") +@cfy_ctx(include_bad=True) +def test_delete_node_no_consul(): + """test delete without consul""" + node_configure() + + runtime_properties = ctx.instance.runtime_properties + ctx.logger.info("runtime_properties: {0}".format(json.dumps(runtime_properties))) + + assert dcae_policy.POLICIES in runtime_properties + policies = runtime_properties[dcae_policy.POLICIES] + ctx.logger.info("policies: {0}".format(json.dumps(policies))) + + node_delete() + + +@pytest.mark.usefixtures("fix_consul_boom") +@cfy_ctx(include_bad=True) +def test_delete_node_no_policies(): + """test delete without consul and setup""" + + ctx.instance.runtime_properties[PoliciesOutput.POLICIES_EVENT] = {} + ctx.instance.runtime_properties[PoliciesOutput.SERVICE_COMPONENT_NAME] = "delete_node_empty" + + runtime_properties = ctx.instance.runtime_properties + ctx.logger.info("runtime_properties: {0}".format(json.dumps(runtime_properties))) + + assert dcae_policy.POLICIES not in runtime_properties + + node_delete() + + +@pytest.mark.usefixtures("fix_consul_boom") +@cfy_ctx(include_bad=True) +def test_delete_node_empty(): + """test delete without consul and setup""" + runtime_properties = ctx.instance.runtime_properties + ctx.logger.info("runtime_properties: {0}".format(json.dumps(runtime_properties))) + + assert dcae_policy.POLICIES not in runtime_properties + + node_delete() + +@pytest.mark.usefixtures("fix_consul_boom") +@cfy_ctx(include_bad=True) +def test_delete_node_lost_scn(): + """test delete without consul and setup""" + ctx.instance.runtime_properties[PoliciesOutput.POLICIES_EVENT] = {} + + runtime_properties = ctx.instance.runtime_properties + ctx.logger.info("runtime_properties: {0}".format(json.dumps(runtime_properties))) + + assert dcae_policy.POLICIES not in runtime_properties + + node_delete() + + +@pytest.mark.usefixtures("fix_consul_boom") +@cfy_ctx(include_bad=True) +def test_delete_node_empty_config(): + """test delete without consul and setup""" + + ctx.instance.runtime_properties[PoliciesOutput.POLICIES_EVENT] = {} + ctx.instance.runtime_properties[PoliciesOutput.SERVICE_COMPONENT_NAME] = "delete_node_empty" + + runtime_properties = ctx.instance.runtime_properties + ctx.logger.info("runtime_properties: {0}".format(json.dumps(runtime_properties))) + + assert dcae_policy.POLICIES not in runtime_properties + + node_delete() + +@pytest.mark.usefixtures("fix_consul_boom") +@cfy_ctx(include_bad=True) +def test_delete_ms_no_consul_addr(): + """test delete without consul and setup""" + + ctx.instance.runtime_properties[PoliciesOutput.POLICIES_EVENT] = {} + ctx.instance.runtime_properties[PoliciesOutput.SERVICE_COMPONENT_NAME] = "delete_node_empty" + + runtime_properties = ctx.instance.runtime_properties + ctx.logger.info("runtime_properties: {0}".format(json.dumps(runtime_properties))) + + assert dcae_policy.POLICIES not in runtime_properties + + node_delete() + + +@pytest.mark.usefixtures("fix_consul_boom") +@cfy_ctx(include_bad=True) +def test_delete_bad_config(): + """test delete without consul and setup""" + + ctx.instance.runtime_properties[PoliciesOutput.POLICIES_EVENT] = {} + ctx.instance.runtime_properties[PoliciesOutput.SERVICE_COMPONENT_NAME] = "delete_node_empty" + + runtime_properties = ctx.instance.runtime_properties + ctx.logger.info("runtime_properties: {0}".format(json.dumps(runtime_properties))) + + assert dcae_policy.POLICIES not in runtime_properties + + node_delete() + -- cgit 1.2.3-korg