diff options
48 files changed, 4910 insertions, 1338 deletions
diff --git a/LICENSE.txt b/LICENSE.txt index c6c6e24..80a0d71 100644 --- a/LICENSE.txt +++ b/LICENSE.txt @@ -1,7 +1,7 @@ /* * ============LICENSE_START========================================== * =================================================================== -* Copyright (c) 2017-2019 AT&T Intellectual Property. All rights reserved. +* Copyright (c) 2017-2020 AT&T Intellectual Property. All rights reserved. * =================================================================== * * Unless otherwise specified, all software contained herein is licensed @@ -143,9 +143,9 @@ make sure that both of the following settings are set properly } ``` -#### point the discovarable config of the policy-handler to point to the **new PDP API** +#### the discovarable config of the policy-handler to point to the **new PDP API** -In short: keep the consul-kv record for he policy-handler as before R4 Dublin. +In short: keep the consul-kv record for the policy-handler as before R4 Dublin. Here is a sample config from consul-kv. Please replace the {{ ... }} with real setup values @@ -201,6 +201,19 @@ Here is a sample config from consul-kv. Please replace the {{ ... }} with real "tls_ca_mode": "cert_directory", "timeout_in_secs": 60 }, + "dmaap_mr" : { + "url" : "http://{{ YOUR_DMAAP_MR_URL }}/events/{{ POLICY_UPDATE_TOPICNAME }}/{{ POLICY_UPDATE_CONSUMEGROUP }}/{{ POLICY_UPDATE_CONSUMERID }}", + "query": { + "timeout": 15000 + }, + "headers" : { + "Content-Type" : "application/json", + "Authorization": "Basic {{ YOUR_DMAAP_MR_SUBSCRIBER_AUTHORIZATION }}" + }, + "target_entity" : "dmaap_mr", + "tls_ca_mode" : "cert_directory", + "timeout_in_secs": 60 + }, "deploy_handler": { "target_entity": "deployment_handler", "url": "http://deployment_handler:8188", @@ -272,9 +285,16 @@ Here is a sample config from consul-kv. Please replace the {{ ... }} with real Accept : "application/json" "Content-Type" : "application/json" ClientAuth : "Basic {{ YOUR_POLICY_ENGINE_CLIENT_AUTH }}" + + # to override the Authorization value, + # set the environment vars $PDP_USER and $PDP_PWD in policy-handler Authorization : "Basic {{ YOUR_POLICY_ENGINE_AUTHORIZATION }}" + Environment : "{{ YOUR_POLICY_ENGINE_ENVIRONMENT }}" + + # target_entity name that is used for logging target_entity : "policy_engine" + # optional tls_ca_mode specifies where to find the cacert.pem for tls # can be one of these: # "cert_directory" - use the cacert.pem stored locally in cert_directory. @@ -288,6 +308,43 @@ Here is a sample config from consul-kv. Please replace the {{ ... }} with real # optional timeout_in_secs specifies the timeout for the http requests timeout_in_secs: 60 + + # DMaaP MR subscriber config + # These are the url of and the auth for the external system, namely the policy-engine (PDP). + # We obtain that info manually from PDP and DMaaP folks at the moment. + dmaap_mr : + url: "http://{{ YOUR_DMAAP_MR_URL }}/events/{{ POLICY_UPDATE_TOPICNAME }}/{{ POLICY_UPDATE_CONSUMEGROUP }}/{{ POLICY_UPDATE_CONSUMERID }}" + + query: + # The number of milliseconds for DMaaP MR to wait for messages if none are immediately available. + # This should normally be used, and set at 15000 or higher. + # This is referred to as long-polling timeout + # ?timeout=15000 passed to DMaaP MR in the query + timeout: 15000 + + headers: + "Content-Type": "application/json" + # provide Authorization for the subscriber if using https and user-password authentication + # to override the Authorization value, + # set the environment vars $DMAAP_MR_USER and $DMAAP_MR_PWD in policy-handler + Authorization: "Basic {{ YOUR_DMAAP_MR_SUBSCRIBER_AUTHORIZATION }}" + + # target_entity name that is used for logging + target_entity: "dmaap_mr" + # optional tls_ca_mode specifies where to find the cacert.pem for tls + # can be one of these: + # "cert_directory" - use the cacert.pem stored locally in cert_directory. + # this is the default if cacert.pem file is found + # + # "os_ca_bundle" - use the public ca_bundle provided by linux system. + # this is the default if cacert.pem file not found + # + # "do_not_verify" - special hack to turn off the verification by cacert and hostname + tls_ca_mode: "cert_directory" + # optional timeout_in_secs specifies the timeout for the http requests + timeout_in_secs: 60 + + # deploy_handler config # changed from string "deployment_handler" in 2.3.1 to structure in 2.4.0 deploy_handler : diff --git a/README_pdp_api_v0.md b/README_pdp_api_v0.md index 9fd822a..a909ca9 100644 --- a/README_pdp_api_v0.md +++ b/README_pdp_api_v0.md @@ -182,6 +182,8 @@ Here is a sample config from consul-kv. Please replace the {{ ... }} with real Accept : "application/json" "Content-Type" : "application/json" ClientAuth : "Basic {{ YOUR_POLICY_ENGINE_CLIENT_AUTH }}" + # to override the Authorization value, + # set the environment vars $PDP_USER and $PDP_PWD in policy-handler Authorization : "Basic {{ YOUR_POLICY_ENGINE_AUTHORIZATION }}" Environment : "{{ YOUR_POLICY_ENGINE_ENVIRONMENT }}" target_entity : "policy_engine" diff --git a/policyhandler/config.py b/policyhandler/config.py index f8c425a..25ae3a5 100644 --- a/policyhandler/config.py +++ b/policyhandler/config.py @@ -1,5 +1,5 @@ # ================================================================================ -# Copyright (c) 2017-2019 AT&T Intellectual Property. All rights reserved. +# Copyright (c) 2017-2020 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. @@ -17,6 +17,7 @@ """read and use the config""" +import base64 import copy import json import logging @@ -137,6 +138,7 @@ class Config(object): FIELD_WSERVICE_PORT = "wservice_port" FIELD_TLS = "tls" FIELD_POLICY_ENGINE = "policy_engine" + DMAAP_MR = "dmaap_mr" POOL_CONNECTIONS = "pool_connections" DEPLOY_HANDLER = "deploy_handler" THREAD_POOL_SIZE = "thread_pool_size" @@ -155,6 +157,11 @@ class Config(object): SERVICE_ACTIVATOR = "service_activator" MODE_OF_OPERATION = "mode_of_operation" PDP_API_VERSION = "PDP_API_VERSION" + QUERY_TIMEOUT = "timeout" + PDP_USER = "PDP_USER" + PDP_PWD = "PDP_PWD" + DMAAP_MR_USER = "DMAAP_MR_USER" + DMAAP_MR_PWD = "DMAAP_MR_PWD" system_name = SERVICE_NAME_POLICY_HANDLER wservice_port = 25577 @@ -165,6 +172,8 @@ class Config(object): tls_server_cert_file = None tls_private_key_file = None tls_server_ca_chain_file = None + _pdp_authorization = None + _dmaap_mr_authorization = None _local_config = Settings() discovered_config = Settings() @@ -254,6 +263,18 @@ class Config(object): Config._pdp_api_version = os.environ.get( Config.PDP_API_VERSION, loaded_config.get(Config.PDP_API_VERSION.lower())) + pdp_user = os.environ.get(Config.PDP_USER) + pdp_pwd = os.environ.get(Config.PDP_PWD) + if pdp_user and pdp_pwd: + Config._pdp_authorization = "Basic {}".format(base64.b64encode( + ("{}:{}".format(pdp_user, pdp_pwd)).encode()).decode("utf-8")) + + dmaap_mr_user = os.environ.get(Config.DMAAP_MR_USER) + dmaap_mr_pwd = os.environ.get(Config.DMAAP_MR_PWD) + if dmaap_mr_user and dmaap_mr_pwd: + Config._dmaap_mr_authorization = "Basic {}".format(base64.b64encode( + ("{}:{}".format(dmaap_mr_user, dmaap_mr_pwd)).encode()).decode("utf-8")) + local_config = loaded_config.get(Config.SERVICE_NAME_POLICY_HANDLER, {}) Config.system_name = local_config.get(Config.FIELD_SYSTEM, Config.system_name) @@ -262,6 +283,26 @@ class Config(object): Config._local_config.set_config(local_config, auto_commit=True) @staticmethod + def _overwrite_discovered_config(audit, discovered_config): + """replace the secrets in discovered_config with data from environment""" + changes = [] + if Config._pdp_authorization: + pdp_cfg = discovered_config.get("policy_engine", {}) + if pdp_cfg.get("url", "").lower().startswith("https:"): + pdp_cfg.get("headers", {})["Authorization"] = Config._pdp_authorization + changes.append("pdp_authorization") + + if Config._dmaap_mr_authorization: + dmaap_mr_cfg = discovered_config.get("dmaap_mr", {}) + if dmaap_mr_cfg.get("url", "").lower().startswith("https:"): + dmaap_mr_cfg.get("headers", {})["Authorization"] = Config._dmaap_mr_authorization + changes.append("dmaap_mr_authorization") + + if changes: + _LOGGER.info(audit.info("overwritten discovered config: {}".format(", ".join(changes)))) + + + @staticmethod def discover(audit): """bring the config settings from the discovery service""" discovery_key = Config.system_name @@ -269,14 +310,17 @@ class Config(object): new_config = DiscoveryClient.get_value(audit, discovery_key) if not new_config or not isinstance(new_config, dict): - _LOGGER.warning("unexpected config from discovery: %s", new_config) + _LOGGER.warning(audit.warn("unexpected config from discovery: {}".format(new_config))) return - _LOGGER.debug("loaded config from discovery(%s): %s", - discovery_key, Audit.json_dumps(new_config)) + _LOGGER.debug(audit.debug("loaded config from discovery({}): {}".format( + discovery_key, Audit.json_dumps(new_config)))) + discovered_config = new_config.get(Config.SERVICE_NAME_POLICY_HANDLER) + + Config._overwrite_discovered_config(audit, discovered_config) - Config.discovered_config.set_config(new_config.get(Config.SERVICE_NAME_POLICY_HANDLER)) - _LOGGER.info("config from discovery: %s", Config.discovered_config) + Config.discovered_config.set_config(discovered_config) + _LOGGER.info(audit.info("config from discovery: {}".format(Config.discovered_config))) @staticmethod diff --git a/policyhandler/deploy_handler.py b/policyhandler/deploy_handler.py index a127e54..997ec3e 100644 --- a/policyhandler/deploy_handler.py +++ b/policyhandler/deploy_handler.py @@ -1,5 +1,5 @@ # ================================================================================ -# Copyright (c) 2017-2019 AT&T Intellectual Property. All rights reserved. +# Copyright (c) 2017-2020 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. @@ -25,8 +25,7 @@ import requests from .config import Config, Settings from .discovery import DiscoveryClient -from .onap.audit import (REQUEST_X_ECOMP_REQUESTID, AuditHttpCode, - AuditResponseCode, Metrics) +from .onap.audit import AuditHttpCode, AuditResponseCode, Metrics from .policy_consts import (CATCH_UP, LATEST_POLICIES, POLICIES, POLICY_FILTER_MATCHES, POLICY_FILTERS, REMOVED_POLICIES, TARGET_ENTITY) @@ -172,10 +171,10 @@ class DeployHandler(object): changed, pool_size = DeployHandler._settings.get_by_key(Config.POOL_CONNECTIONS, 10) if changed: DeployHandler._requests_session.mount( - 'https://', requests.adapters.HTTPAdapter(pool_connections=pool_size, + 'https://', requests.adapters.HTTPAdapter(pool_connections=1, pool_maxsize=pool_size)) DeployHandler._requests_session.mount( - 'http://', requests.adapters.HTTPAdapter(pool_connections=pool_size, + 'http://', requests.adapters.HTTPAdapter(pool_connections=1, pool_maxsize=pool_size)) _, config_dh = DeployHandler._settings.get_by_key(Config.DEPLOY_HANDLER) @@ -301,7 +300,8 @@ class DeployHandler(object): metrics = Metrics(aud_parent=audit, targetEntity="{} policy_update".format(target_entity), targetServiceName=url) - headers = {REQUEST_X_ECOMP_REQUESTID : metrics.request_id} + + headers = metrics.put_request_id_into_headers() log_action = "put to {} at {}".format(target_entity, url) log_data = "msg={} headers={}, params={}, timeout_in_secs={}, custom_kwargs({})".format( @@ -330,7 +330,7 @@ class DeployHandler(object): else AuditHttpCode.SERVER_INTERNAL_ERROR.value) error_msg = "failed to {} {}: {} {}".format( log_action, type(ex).__name__, str(ex), log_data) - _LOGGER.exception(error_msg) + _LOGGER.exception(metrics.fatal(error_msg)) metrics.set_http_status_code(error_code) audit.set_http_status_code(error_code) metrics.metrics(error_msg) @@ -371,7 +371,7 @@ class DeployHandler(object): metrics = Metrics(aud_parent=audit, targetEntity="{} get_deployed_policies".format(target_entity), targetServiceName=url) - headers = {REQUEST_X_ECOMP_REQUESTID : metrics.request_id} + headers = metrics.put_request_id_into_headers() log_action = "get from {} at {}".format(target_entity, url) log_data = "headers={}, params={}, timeout_in_secs={}, custom_kwargs({})".format( @@ -387,7 +387,7 @@ class DeployHandler(object): metrics.set_http_status_code(AuditHttpCode.SERVICE_UNAVAILABLE_ERROR.value) audit.set_http_status_code(AuditHttpCode.SERVICE_UNAVAILABLE_ERROR.value) metrics.metrics(error_msg) - return None, None + return {"error": "failed to retrieve policies from deployment-handler"}, None, None res = None try: @@ -399,11 +399,11 @@ class DeployHandler(object): else AuditHttpCode.SERVER_INTERNAL_ERROR.value) error_msg = "failed to {} {}: {} {}".format( log_action, type(ex).__name__, str(ex), log_data) - _LOGGER.exception(error_msg) + _LOGGER.exception(metrics.fatal(error_msg)) metrics.set_http_status_code(error_code) audit.set_http_status_code(error_code) metrics.metrics(error_msg) - return None, None + return {"error": "failed to retrieve policies from deployment-handler"}, None, None metrics.set_http_status_code(res.status_code) audit.set_http_status_code(res.status_code) @@ -414,7 +414,7 @@ class DeployHandler(object): if res.status_code != requests.codes.ok: _LOGGER.error(log_line) - return None, None + return {"error": "failed to retrieve policies from deployment-handler"}, None, None result = res.json() or {} DeployHandler._server_instance_changed(result, metrics) @@ -426,10 +426,10 @@ class DeployHandler(object): _LOGGER.warning(audit.warn( "found no deployed policies or policy-filters: {}".format(log_line), error_code=AuditResponseCode.DATA_ERROR)) - return policies, policy_filters + return {"warning": "got no deployed policies"}, None, None _LOGGER.info(log_line) - return policies, policy_filters + return None, policies, policy_filters @staticmethod def _server_instance_changed(result, metrics): diff --git a/policyhandler/discovery.py b/policyhandler/discovery.py index 83f54ac..b6b6bbd 100644 --- a/policyhandler/discovery.py +++ b/policyhandler/discovery.py @@ -1,5 +1,5 @@ # ================================================================================ -# Copyright (c) 2017-2019 AT&T Intellectual Property. All rights reserved. +# Copyright (c) 2017-2020 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. @@ -85,7 +85,7 @@ class DiscoveryClient(object): else AuditHttpCode.SERVER_INTERNAL_ERROR.value) error_msg = ("failed {}/{} to {} {}: {}".format(status_code, error_code, log_line, type(ex).__name__, str(ex))) - _LOGGER.exception(error_msg) + _LOGGER.exception(metrics.fatal(error_msg)) metrics.set_http_status_code(error_code) audit.set_http_status_code(error_code) metrics.metrics(error_msg) @@ -136,7 +136,7 @@ class DiscoveryClient(object): else AuditHttpCode.SERVER_INTERNAL_ERROR.value) error_msg = ("failed {}/{} to {} {}: {}".format(status_code, error_code, log_line, type(ex).__name__, str(ex))) - _LOGGER.exception(error_msg) + _LOGGER.exception(metrics.fatal(error_msg)) metrics.set_http_status_code(error_code) audit.set_http_status_code(error_code) metrics.metrics(error_msg) diff --git a/policyhandler/onap/audit.py b/policyhandler/onap/audit.py index 3c09c16..269dfd8 100644 --- a/policyhandler/onap/audit.py +++ b/policyhandler/onap/audit.py @@ -1,5 +1,5 @@ # ================================================================================ -# Copyright (c) 2017-2019 AT&T Intellectual Property. All rights reserved. +# Copyright (c) 2017-2020 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. @@ -25,6 +25,7 @@ """ import copy +import hashlib import json import os import re @@ -41,6 +42,7 @@ from .health import Health from .process_info import ProcessInfo REQUEST_X_ECOMP_REQUESTID = "X-ECOMP-RequestID" +REQUEST_X_ONAP_REQUESTID = "X-ONAP-RequestID" REQUEST_REMOTE_ADDR = "Remote-Addr" REQUEST_HOST = "Host" HOSTNAME = "HOSTNAME" @@ -118,7 +120,7 @@ class AuditResponseCode(Enum): class _Audit(object): """put the audit object on stack per each initiating request in the system - :request_id: is the X-ECOMP-RequestID for tracing + :request_id: is the X-ONAP-RequestID or X-ECOMP-RequestID for tracing :req_message: is the request message string for logging @@ -172,7 +174,7 @@ class _Audit(object): """create audit object per each request in the system :job_name: is the name of the audit job for health stats - :request_id: is the X-ECOMP-RequestID for tracing + :request_id: is the X-ONAP-RequestID or X-ECOMP-RequestID for tracing :req_message: is the request message string for logging :kwargs: - put any request related params into kwargs """ @@ -184,6 +186,12 @@ class _Audit(object): self.max_http_status_code = 0 self._lock = threading.Lock() + def put_request_id_into_headers(self, headers=None): + """when sending message out - put the request_id into headers""" + headers = headers or {} + headers[REQUEST_X_ONAP_REQUESTID] = self.request_id + headers[REQUEST_X_ECOMP_REQUESTID] = self.request_id + return headers @staticmethod def register_item_health(health_name, health_getter=None): @@ -241,6 +249,8 @@ class _Audit(object): def set_http_status_code(self, http_status_code): """accumulate the highest(worst) http status code""" + if http_status_code is None: + http_status_code = AuditHttpCode.SERVER_INTERNAL_ERROR.value with self._lock: if self.max_http_status_code < AuditHttpCode.SERVER_INTERNAL_ERROR.value: self.max_http_status_code = max(http_status_code, self.max_http_status_code) @@ -308,9 +318,7 @@ class _Audit(object): """debug+error - the warn level of logging""" all_kwargs = self.merge_all_kwargs(**kwargs) - if error_code and isinstance(error_code, AuditResponseCode): - all_kwargs[ERROR_CODE] = error_code.value - all_kwargs[ERROR_DESCRIPTION] = AuditResponseCode.get_human_text(error_code) + self._set_error_code_in_kwargs(error_code, all_kwargs) _Audit._logger_debug.warn(log_line, **all_kwargs) _Audit._logger_error.warn(log_line, **all_kwargs) @@ -320,9 +328,7 @@ class _Audit(object): """debug+error - the error level of logging""" all_kwargs = self.merge_all_kwargs(**kwargs) - if error_code and isinstance(error_code, AuditResponseCode): - all_kwargs[ERROR_CODE] = error_code.value - all_kwargs[ERROR_DESCRIPTION] = AuditResponseCode.get_human_text(error_code) + self._set_error_code_in_kwargs(error_code, all_kwargs) _Audit._logger_debug.error(log_line, **all_kwargs) _Audit._logger_error.error(log_line, **all_kwargs) @@ -332,25 +338,32 @@ class _Audit(object): """debug+error - the fatal level of logging""" all_kwargs = self.merge_all_kwargs(**kwargs) - if error_code and isinstance(error_code, AuditResponseCode): - all_kwargs[ERROR_CODE] = error_code.value - all_kwargs[ERROR_DESCRIPTION] = AuditResponseCode.get_human_text(error_code) + self._set_error_code_in_kwargs(error_code, all_kwargs) _Audit._logger_debug.fatal(log_line, **all_kwargs) _Audit._logger_error.fatal(log_line, **all_kwargs) return log_line + def _set_error_code_in_kwargs(self, error_code, all_kwargs): + """set the error code and description in kwargs for logging""" + if not error_code or not isinstance(error_code, AuditResponseCode): + error_code = AuditResponseCode.UNKNOWN_ERROR + all_kwargs[ERROR_CODE] = error_code.value + all_kwargs[ERROR_DESCRIPTION] = AuditResponseCode.get_human_text(error_code) + @staticmethod def hide_secrets(obj): """hides the known secret field values of the dictionary""" if not isinstance(obj, dict): return obj - for key in obj: + for key, val in obj.items(): if key.lower() in [HEADER_CLIENTAUTH, HEADER_AUTHORIZATION]: - obj[key] = "*" - elif isinstance(obj[key], dict): - obj[key] = _Audit.hide_secrets(obj[key]) + hval = hashlib.sha256() + hval.update(val.encode()) + obj[key] = "***({})***".format(hval.hexdigest()) + elif isinstance(val, dict): + obj[key] = _Audit.hide_secrets(val) return obj @@ -375,7 +388,7 @@ class Audit(_Audit): """create audit object per each request in the system :job_name: is the name of the audit job for health stats - :request_id: is the X-ECOMP-RequestID for tracing + :request_id: is the X-ONAP-RequestID or X-ECOMP-RequestID for tracing :req_message: is the request message string for logging :aud_parent: is the parent Audit - used for sub-query metrics to other systems :kwargs: - put any request related params into kwargs @@ -388,7 +401,9 @@ class Audit(_Audit): headers = self.kwargs.get("headers", {}) if headers: if not self.request_id: - self.request_id = headers.get(REQUEST_X_ECOMP_REQUESTID) + self.request_id = headers.get(REQUEST_X_ONAP_REQUESTID, + headers.get(REQUEST_X_ECOMP_REQUESTID)) + self.kwargs.setdefault(AUDIT_IPADDRESS, headers.get(REQUEST_REMOTE_ADDR)) self.kwargs.setdefault(AUDIT_SERVER, headers.get(REQUEST_HOST)) diff --git a/policyhandler/pdp_api/dmaap_mr.py b/policyhandler/pdp_api/dmaap_mr.py new file mode 100644 index 0000000..2d4d468 --- /dev/null +++ b/policyhandler/pdp_api/dmaap_mr.py @@ -0,0 +1,202 @@ +# ================================================================================ +# Copyright (c) 2019 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========================================================= +# + +"""policy-client communicates with policy-engine thru REST API""" + +import copy +import json +from threading import Lock + +import requests + +from ..config import Config, Settings +from ..onap.audit import AuditHttpCode, AuditResponseCode, Metrics +from ..utils import Utils + +_LOGGER = Utils.get_logger(__file__) + +class DmaapMr(object): + """using the http API to policy-engine""" + _lazy_inited = False + DEFAULT_TIMEOUT_IN_SECS = 60 + + _lock = Lock() + _settings = Settings(Config.DMAAP_MR) + + _requests_session = None + _long_polling = False + _target_entity = None + _url = None + _query = {} + _headers = None + _custom_kwargs = {} + _timeout_in_secs = DEFAULT_TIMEOUT_IN_SECS + + @staticmethod + def _init(audit): + """init static config""" + DmaapMr._custom_kwargs = {} + tls_ca_mode = None + + if not DmaapMr._requests_session: + DmaapMr._requests_session = requests.Session() + DmaapMr._requests_session.mount( + 'https://', requests.adapters.HTTPAdapter(pool_connections=1, pool_maxsize=1, + pool_block=True)) + DmaapMr._requests_session.mount( + 'http://', requests.adapters.HTTPAdapter(pool_connections=1, pool_maxsize=1, + pool_block=True)) + + + _, config = DmaapMr._settings.get_by_key(Config.DMAAP_MR) + if config: + DmaapMr._url = config.get("url") + DmaapMr._headers = config.get("headers", {}) + DmaapMr._query = copy.deepcopy(config.get("query", {})) + if DmaapMr._query.get(Config.QUERY_TIMEOUT, 0) < 1000: + DmaapMr._query[Config.QUERY_TIMEOUT] = 15000 + + DmaapMr._target_entity = config.get("target_entity", Config.DMAAP_MR) + + tls_ca_mode = config.get(Config.TLS_CA_MODE) + DmaapMr._custom_kwargs = Config.get_requests_kwargs(tls_ca_mode) + DmaapMr._timeout_in_secs = config.get(Config.TIMEOUT_IN_SECS) + if not DmaapMr._timeout_in_secs or DmaapMr._timeout_in_secs < 1: + DmaapMr._timeout_in_secs = DmaapMr.DEFAULT_TIMEOUT_IN_SECS + + _LOGGER.info( + audit.info(("config DMaaP MR({}) url({}) query({}) headers({}) " + "tls_ca_mode({}) custom_kwargs({}) timeout_in_secs({}): {}").format( + DmaapMr._target_entity, DmaapMr._url, + Metrics.json_dumps(DmaapMr._query), + Metrics.json_dumps(DmaapMr._headers), tls_ca_mode, + json.dumps(DmaapMr._custom_kwargs), DmaapMr._timeout_in_secs, + DmaapMr._settings))) + + DmaapMr._settings.commit_change() + DmaapMr._lazy_inited = True + + @staticmethod + def reconfigure(audit): + """reconfigure""" + with DmaapMr._lock: + DmaapMr._settings.set_config(Config.discovered_config) + if not DmaapMr._settings.is_changed(): + DmaapMr._settings.commit_change() + return False + + DmaapMr._lazy_inited = False + DmaapMr._long_polling = False + DmaapMr._init(audit) + return True + + @staticmethod + def _lazy_init(audit): + """init static config""" + if DmaapMr._lazy_inited: + return + + with DmaapMr._lock: + if DmaapMr._lazy_inited: + return + + DmaapMr._settings.set_config(Config.discovered_config) + DmaapMr._long_polling = False + DmaapMr._init(audit) + + @staticmethod + def get_policy_updates(audit): + """ + get from DMaaP MR - returns json list of stringified messages + + example [ + "{\"deployed-policies\":[ + {\"policy-type\":\"onap.policies.monitoring.cdap.tca.hi.lo.app\", + \"policy-type-version\":\"1.0.0\", + \"policy-id\":\"onap.scaleout.tca\", + \"policy-version\":\"2.2.2\", + \"success-count\":3, + \"failure-count\":0 + }], + \"undeployed-policies\":[ + {\"policy-type\":\"onap.policies.monitoring.cdap.tca.hi.lo.app\", + \"policy-type-version\":\"1.0.0\", + \"policy-id\":\"onap.scaleout.tca\", + \"policy-version\":\"1.0.0\", + \"success-count\":3, + \"failure-count\":0 + }]}" + ] + """ + DmaapMr._lazy_init(audit) + + if not DmaapMr._url: + _LOGGER.error( + audit.error("no url for DMaaP MR", error_code=AuditResponseCode.AVAILABILITY_ERROR)) + audit.set_http_status_code(AuditHttpCode.SERVER_INTERNAL_ERROR.value) + return None + + with DmaapMr._lock: + target_entity = DmaapMr._target_entity + url = DmaapMr._url + params = copy.deepcopy(DmaapMr._query) if DmaapMr._long_polling else None + headers = copy.deepcopy(DmaapMr._headers) + timeout_in_secs = DmaapMr._timeout_in_secs + custom_kwargs = copy.deepcopy(DmaapMr._custom_kwargs) + DmaapMr._long_polling = True + + metrics = Metrics(aud_parent=audit, targetEntity=target_entity, targetServiceName=url) + + headers = metrics.put_request_id_into_headers(headers) + + log_line = ( + "get from {} at {} with params={}, headers={}, custom_kwargs({}) timeout_in_secs({})" + .format(target_entity, url, json.dumps(params), Metrics.json_dumps(headers), + json.dumps(custom_kwargs), timeout_in_secs)) + + _LOGGER.info(metrics.metrics_start(log_line)) + + res = None + try: + res = DmaapMr._requests_session.get(url, params=params, headers=headers, + timeout=timeout_in_secs, **custom_kwargs) + + except Exception as ex: + error_code = (AuditHttpCode.SERVICE_UNAVAILABLE_ERROR.value + if isinstance(ex, requests.exceptions.RequestException) + else AuditHttpCode.SERVER_INTERNAL_ERROR.value) + error_msg = ("failed {}: {} to {}".format(type(ex).__name__, str(ex), log_line)) + + _LOGGER.exception(metrics.fatal(error_msg)) + metrics.set_http_status_code(error_code) + audit.set_http_status_code(error_code) + metrics.metrics(error_msg) + return None + + log_line = "response {} from {}: text={} headers={}".format( + res.status_code, log_line, res.text, Metrics.json_dumps(dict(res.headers.items()))) + _LOGGER.info(log_line) + + metrics.set_http_status_code(res.status_code) + audit.set_http_status_code(res.status_code) + metrics.metrics(log_line) + + policy_updates = None + if res.status_code == requests.codes.ok: + policy_updates = res.json() + + return policy_updates diff --git a/policyhandler/pdp_api/pdp_consts.py b/policyhandler/pdp_api/pdp_consts.py index 2337456..32f80f3 100644 --- a/policyhandler/pdp_api/pdp_consts.py +++ b/policyhandler/pdp_api/pdp_consts.py @@ -1,5 +1,5 @@ # ================================================================================ -# Copyright (c) 2019 AT&T Intellectual Property. All rights reserved. +# Copyright (c) 2019-2020 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. @@ -33,3 +33,7 @@ PDP_REQ_ONAP_NAME = "ONAPName" # always "DCAE" PDP_REQ_ONAP_COMPONENT = "ONAPComponent" PDP_REQ_ONAP_INSTANCE = "ONAPInstance" PDP_REQ_RESOURCE = "resource" + +# fields from policy-update notification +DEPLOYED_POLICIES = "deployed-policies" +UNDEPLOYED_POLICIES = "undeployed-policies" diff --git a/policyhandler/pdp_api/policy_listener.py b/policyhandler/pdp_api/policy_listener.py index 9fa4695..0d33785 100644 --- a/policyhandler/pdp_api/policy_listener.py +++ b/policyhandler/pdp_api/policy_listener.py @@ -1,5 +1,5 @@ # ================================================================================ -# Copyright (c) 2019 AT&T Intellectual Property. All rights reserved. +# Copyright (c) 2019-2020 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. @@ -17,39 +17,173 @@ """ policy-listener communicates with policy-engine -to receive push notifications +to receive push notifications through DMaaP MR on updates and removal of policies. -on receiving the policy-notifications, the policy-receiver +on receiving the policy-notifications, the policy-listener passes the notifications to policy-updater """ +import json import os +from threading import Event, Lock, Thread -from ..utils import ToBeImplementedException, Utils +from ..onap.audit import Audit, AuditResponseCode +from ..utils import Utils +from .dmaap_mr import DmaapMr +from .pdp_consts import (DEPLOYED_POLICIES, PDP_METADATA, PDP_POLICY_ID, + PDP_POLICY_VERSION, UNDEPLOYED_POLICIES) _LOGGER = Utils.get_logger(__file__) -class PolicyListener(object): - """listener to PolicyEngine""" +class PolicyListener(Thread): + """listener to DMaaP MR""" PDP_API_FOLDER = os.path.basename(os.path.dirname(os.path.realpath(__file__))) + SLEEP_BEFORE_RESTARTING = 30 - def __init__(self, *_): + def __init__(self, audit, policy_updater): """listener to receive the policy notifications from PolicyEngine""" - _LOGGER.info("to_be_implemented") - raise ToBeImplementedException() + Thread.__init__(self, name="policy_listener", daemon=True) - def reconfigure(self, _): - """configure and reconfigure the listener""" - _LOGGER.info("to_be_implemented") - raise ToBeImplementedException() + self._policy_updater = policy_updater + self._lock = Lock() + self._run_event = Event() + self._keep_running = True + self._first_loop = True + + self._dmaap_mr = None + self.reconfigure(audit) + + def reconfigure(self, audit): + """configure and reconfigure the DMaaP MR""" + reconfigured = DmaapMr.reconfigure(audit) + if reconfigured and not self._first_loop: + with self._lock: + self._first_loop = True + return reconfigured def run(self): - """listen on web-socket and pass the policy notifications to policy-updater""" - _LOGGER.info("to_be_implemented") - raise ToBeImplementedException() - - def shutdown(self, _): - """Shutdown the policy-listener""" - _LOGGER.info("to_be_implemented") - raise ToBeImplementedException() + """listen on DMaaP MR and pass the policy notifications to policy-updater""" + _LOGGER.info("starting policy_listener...") + delayed_restarting = False + while True: + if not self._get_keep_running(): + break + + if delayed_restarting: + _LOGGER.info( + "going to sleep for %s secs before restarting policy-notifications", + PolicyListener.SLEEP_BEFORE_RESTARTING) + + self._run_event.clear() + self._run_event.wait(PolicyListener.SLEEP_BEFORE_RESTARTING) + if not self._get_keep_running(): + break + + audit = Audit(job_name="policy_update", + req_message="waiting for policy-notifications...", + retry_get_config=True) + + policy_updates = DmaapMr.get_policy_updates(audit) + + if not self._get_keep_running(): + audit.audit_done(result="exiting policy_listener") + break + + delayed_restarting = not audit.is_success() + if self._first_loop: + policy_updater = None + with self._lock: + if self._first_loop: + self._first_loop = False + policy_updater = self._policy_updater + if policy_updater is not None: + audit.req_message = "first catch_up" + _LOGGER.info(audit.info("first catch_up - ignoring policy-updates: {}" + .format(json.dumps(policy_updates)))) + policy_updater.catch_up(audit) + elif not policy_updates: + _LOGGER.info(audit.info( + "no policy-updates: {}".format(json.dumps(policy_updates)))) + audit.audit_done(result="no policy-updates") + else: + self._on_policy_update_message(audit, policy_updates) + + _LOGGER.info("exit policy_listener") + + def _get_keep_running(self): + """thread-safe check whether to continue running""" + with self._lock: + keep_running = self._keep_running + return keep_running + + def _on_policy_update_message(self, audit, policy_updates): + """received the notification from PDP""" + try: + _LOGGER.info("Received notification message: %s", json.dumps(policy_updates)) + if not policy_updates: + return + + policies_updated = [] + + for idx, pdp_update_msg in enumerate(policy_updates): + pdp_update_msg = Utils.safe_json_parse(pdp_update_msg) + + if not pdp_update_msg or not isinstance(pdp_update_msg, dict): + _LOGGER.warning(audit.warn( + "unexpected message from PDP: {}".format(json.dumps(pdp_update_msg)), + error_code=AuditResponseCode.DATA_ERROR)) + continue + + _LOGGER.debug("raw policy_update[%s]: %s", idx, json.dumps(pdp_update_msg)) + + deployed_policies = [ + {PDP_METADATA: {PDP_POLICY_ID: p_deployed.get(PDP_POLICY_ID), + PDP_POLICY_VERSION: p_deployed.get(PDP_POLICY_VERSION)}} + for p_deployed in pdp_update_msg.get(DEPLOYED_POLICIES, []) + if (p_deployed.get(PDP_POLICY_ID) is not None + and p_deployed.get(PDP_POLICY_VERSION) is not None)] + + undeployed_policies = [ + {PDP_METADATA: {PDP_POLICY_ID: p_undeployed.get(PDP_POLICY_ID), + PDP_POLICY_VERSION: p_undeployed.get(PDP_POLICY_VERSION)}} + for p_undeployed in pdp_update_msg.get(UNDEPLOYED_POLICIES, []) + if (p_undeployed.get(PDP_POLICY_ID) is not None + and p_undeployed.get(PDP_POLICY_VERSION) is not None)] + + if not deployed_policies and not undeployed_policies: + _LOGGER.warning(audit.warn( + "no policy deployed or undeployed: {}".format(json.dumps(pdp_update_msg)), + error_code=AuditResponseCode.DATA_ERROR)) + continue + + policy_update = {DEPLOYED_POLICIES: deployed_policies, + UNDEPLOYED_POLICIES: undeployed_policies} + _LOGGER.info(audit.info("policy_update[{}]: {}" + .format(idx, json.dumps(policy_update)))) + + policies_updated.append(policy_update) + + if not policies_updated: + _LOGGER.warning(audit.warn( + "erroneous notification from PDP: {}".format(json.dumps(policy_updates)), + error_code=AuditResponseCode.DATA_ERROR)) + return + + with self._lock: + policy_updater = self._policy_updater + if policy_updater is not None: + policy_updater.policy_update(audit, policies_updated) + except Exception as ex: + error_msg = "crash {} {} at {}: {}".format(type(ex).__name__, str(ex), + "on_policy_update_message", + json.dumps(policy_updates)) + _LOGGER.exception(audit.fatal(error_msg)) + + def shutdown(self, audit): + """Shutdown the policy_listener""" + _LOGGER.info(audit.info("shutdown policy_listener - no waiting...")) + with self._lock: + self._keep_running = False + self._policy_updater = None + self._run_event.set() diff --git a/policyhandler/pdp_api/policy_matcher.py b/policyhandler/pdp_api/policy_matcher.py index 57258c3..2972fb8 100644 --- a/policyhandler/pdp_api/policy_matcher.py +++ b/policyhandler/pdp_api/policy_matcher.py @@ -1,5 +1,5 @@ # ================================================================================ -# Copyright (c) 2019 AT&T Intellectual Property. All rights reserved. +# Copyright (c) 2019-2020 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. @@ -19,7 +19,98 @@ import os +from ..deploy_handler import DeployHandler, PolicyUpdateMessage +from ..policy_consts import (ERRORED_POLICIES, LATEST_POLICIES, POLICY_BODY, + POLICY_VERSIONS) +from ..utils import Utils +from .pdp_consts import POLICY_VERSION +from .policy_rest import PolicyRest + +_LOGGER = Utils.get_logger(__file__) class PolicyMatcher(object): """policy-matcher - static class""" + PENDING_UPDATE = "pending_update" PDP_API_FOLDER = os.path.basename(os.path.dirname(os.path.realpath(__file__))) + + @staticmethod + def build_catch_up_message(audit, deployed_policies, _=None): + """find the latest policies from policy-engine for the deployed policies""" + + if not deployed_policies: + error_txt = "no deployed policies" + _LOGGER.warning(error_txt) + return {"error": error_txt}, None + + pdp_response = PolicyRest.get_latest_policies(audit, policy_ids=list(deployed_policies)) + + if not audit.is_success(): + error_txt = "failed to retrieve policies from policy-engine" + _LOGGER.warning(error_txt) + return {"error": error_txt}, None + + latest_policies = pdp_response.get(LATEST_POLICIES, {}) + errored_policies = pdp_response.get(ERRORED_POLICIES, {}) + + latest_policies, changed_policies = PolicyMatcher._match_policies( + latest_policies, deployed_policies) + + errored_policies = dict((policy_id, policy) + for (policy_id, policy) in errored_policies.items() + if deployed_policies.get(policy_id, {}).get(POLICY_VERSIONS)) + + removed_policies = dict( + (policy_id, True) + for (policy_id, deployed_policy) in deployed_policies.items() + if deployed_policy.get(POLICY_VERSIONS) + and policy_id not in latest_policies + and policy_id not in errored_policies + ) + + return ({LATEST_POLICIES: latest_policies, ERRORED_POLICIES: errored_policies}, + PolicyUpdateMessage(changed_policies, removed_policies)) + + @staticmethod + def match_to_deployed_policies(audit, policies_updated, policies_removed): + """match the policies_updated, policies_removed versus deployed policies""" + _, deployed_policies, _ = DeployHandler.get_deployed_policies(audit) + if not audit.is_success(): + return {}, {}, {} + + _, changed_policies = PolicyMatcher._match_policies(policies_updated, deployed_policies) + + policies_removed = dict((policy_id, policy) + for (policy_id, policy) in policies_removed.items() + if deployed_policies.get(policy_id, {}).get(POLICY_VERSIONS)) + + return changed_policies, policies_removed, {} + + + @staticmethod + def _match_policies(policies, deployed_policies): + """ + Match policies to deployed policies by policy_id. + + Also calculates the policies that changed in comparison to deployed policies + """ + matching_policies = {} + changed_policies = {} + + policies = policies or {} + deployed_policies = deployed_policies or {} + + for (policy_id, policy) in policies.items(): + new_version = policy.get(POLICY_BODY, {}).get(POLICY_VERSION) + deployed_policy = deployed_policies.get(policy_id) + + if deployed_policy: + matching_policies[policy_id] = policy + + policy_changed = (deployed_policy and new_version + and (deployed_policy.get(PolicyMatcher.PENDING_UPDATE) + or {new_version} ^ + deployed_policy.get(POLICY_VERSIONS, {}).keys())) + if policy_changed: + changed_policies[policy_id] = policy + + return matching_policies, changed_policies diff --git a/policyhandler/pdp_api/policy_rest.py b/policyhandler/pdp_api/policy_rest.py index 14d9296..0b33ccd 100644 --- a/policyhandler/pdp_api/policy_rest.py +++ b/policyhandler/pdp_api/policy_rest.py @@ -1,5 +1,5 @@ # ================================================================================ -# Copyright (c) 2019 AT&T Intellectual Property. All rights reserved. +# Copyright (c) 2019-2020 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. @@ -20,16 +20,19 @@ import copy import json import os +import time import urllib.parse +from multiprocessing.dummy import Pool as ThreadPool from threading import Lock import requests from ..config import Config, Settings -from ..onap.audit import (REQUEST_X_ECOMP_REQUESTID, AuditHttpCode, - AuditResponseCode, Metrics) +from ..onap.audit import AuditHttpCode, AuditResponseCode, Metrics +from ..policy_consts import (ERRORED_POLICIES, LATEST_POLICIES, POLICY_BODY, + POLICY_ID, POLICY_NAMES) from ..utils import Utils -from .pdp_consts import PDP_POLICIES +from .pdp_consts import PDP_POLICIES, POLICY_NAME, POLICY_VERSION from .policy_utils import PolicyUtils _LOGGER = Utils.get_logger(__file__) @@ -37,11 +40,15 @@ _LOGGER = Utils.get_logger(__file__) class PolicyRest(object): """using the http API to policy-engine""" PDP_API_FOLDER = os.path.basename(os.path.dirname(os.path.realpath(__file__))) - _lazy_inited = False + EXPECTED_VERSIONS = "expected_versions" + IGNORE_POLICY_NAMES = "ignore_policy_names" DEFAULT_TIMEOUT_IN_SECS = 60 + _lazy_inited = False _lock = Lock() - _settings = Settings(Config.FIELD_POLICY_ENGINE, Config.POOL_CONNECTIONS) + _settings = Settings(Config.FIELD_POLICY_ENGINE, Config.POOL_CONNECTIONS, + Config.THREAD_POOL_SIZE, + Config.POLICY_RETRY_COUNT, Config.POLICY_RETRY_SLEEP) _target_entity = None _requests_session = None @@ -49,6 +56,9 @@ class PolicyRest(object): _url_pdp_decision = None _headers = None _custom_kwargs = {} + _thread_pool_size = 4 + _policy_retry_count = 1 + _policy_retry_sleep = 0 _timeout_in_secs = DEFAULT_TIMEOUT_IN_SECS @staticmethod @@ -63,10 +73,10 @@ class PolicyRest(object): changed, pool_size = PolicyRest._settings.get_by_key(Config.POOL_CONNECTIONS, 20) if changed: PolicyRest._requests_session.mount( - 'https://', requests.adapters.HTTPAdapter(pool_connections=pool_size, + 'https://', requests.adapters.HTTPAdapter(pool_connections=1, pool_maxsize=pool_size)) PolicyRest._requests_session.mount( - 'http://', requests.adapters.HTTPAdapter(pool_connections=pool_size, + 'http://', requests.adapters.HTTPAdapter(pool_connections=1, pool_maxsize=pool_size)) _, config = PolicyRest._settings.get_by_key(Config.FIELD_POLICY_ENGINE) @@ -77,6 +87,15 @@ class PolicyRest(object): PolicyRest._url, config.get("path_decision", "/decision/v1/")) PolicyRest._headers = config.get("headers", {}) PolicyRest._target_entity = config.get("target_entity", Config.FIELD_POLICY_ENGINE) + _, PolicyRest._thread_pool_size = PolicyRest._settings.get_by_key( + Config.THREAD_POOL_SIZE, 4) + if PolicyRest._thread_pool_size < 2: + PolicyRest._thread_pool_size = 2 + + _, PolicyRest._policy_retry_count = PolicyRest._settings.get_by_key( + Config.POLICY_RETRY_COUNT, 1) + _, PolicyRest._policy_retry_sleep = PolicyRest._settings.get_by_key( + Config.POLICY_RETRY_SLEEP, 0) tls_ca_mode = config.get(Config.TLS_CA_MODE) PolicyRest._custom_kwargs = Config.get_requests_kwargs(tls_ca_mode) @@ -121,13 +140,13 @@ class PolicyRest(object): PolicyRest._init() @staticmethod - def _pdp_get_decision(audit, pdp_req): - """Communication with the policy-engine""" + def _pdp_get_decision(audit, policy_ids): + """get policies from the policy-engine by policy-ids""" if not PolicyRest._url: _LOGGER.error( audit.error("no url for PDP", error_code=AuditResponseCode.AVAILABILITY_ERROR)) audit.set_http_status_code(AuditHttpCode.SERVER_INTERNAL_ERROR.value) - return None + return None, None with PolicyRest._lock: session = PolicyRest._requests_session @@ -137,9 +156,11 @@ class PolicyRest(object): headers = copy.deepcopy(PolicyRest._headers) custom_kwargs = copy.deepcopy(PolicyRest._custom_kwargs) + pdp_req = PolicyUtils.gen_req_to_pdp(policy_ids) + metrics = Metrics(aud_parent=audit, targetEntity=target_entity, targetServiceName=url) - headers[REQUEST_X_ECOMP_REQUESTID] = metrics.request_id + headers = metrics.put_request_id_into_headers(headers) log_action = "post to {} at {}".format(target_entity, url) log_data = "msg={} headers={}, custom_kwargs({}) timeout_in_secs({})".format( @@ -159,11 +180,11 @@ class PolicyRest(object): else AuditHttpCode.SERVER_INTERNAL_ERROR.value) error_msg = ("failed {}: {} to {}".format(type(ex).__name__, str(ex), log_line)) - _LOGGER.exception(error_msg) + _LOGGER.exception(metrics.fatal(error_msg)) metrics.set_http_status_code(error_code) audit.set_http_status_code(error_code) metrics.metrics(error_msg) - return None + return (error_code, None) log_line = "response {} from {}: text={} headers={}".format( res.status_code, log_line, res.text, @@ -174,40 +195,282 @@ class PolicyRest(object): audit.set_http_status_code(res.status_code) metrics.metrics(log_line) - policy_bodies = None + latest_policies = None if res.status_code == requests.codes.ok: - policy_bodies = res.json().get(PDP_POLICIES) + policy_bodies = res.json().get(PDP_POLICIES, {}) + latest_policies = dict((policy_id, PolicyUtils.convert_to_policy(policy)) + for (policy_id, policy) in policy_bodies.items()) + + return res.status_code, latest_policies - return policy_bodies @staticmethod def get_latest_policy(aud_policy_id): """safely try retrieving the latest policy for the policy_id from the policy-engine""" - audit, policy_id, _, _ = aud_policy_id + audit, policy_id, expected_versions, ignore_policy_names = aud_policy_id + str_metrics = "policy_id({0}), expected_versions({1}) ignore_policy_names({2})".format( + policy_id, json.dumps(expected_versions), json.dumps(ignore_policy_names)) + try: - PolicyRest._lazy_init() + return PolicyRest._get_latest_policy( + audit, policy_id, expected_versions, ignore_policy_names, str_metrics) + + except Exception as ex: + error_msg = ("{0}: crash {1} {2} at {3}: {4}" + .format(audit.request_id, type(ex).__name__, str(ex), + "get_latest_policy", str_metrics)) + + _LOGGER.exception(error_msg) + audit.fatal(error_msg, error_code=AuditResponseCode.BUSINESS_PROCESS_ERROR) + audit.set_http_status_code(AuditHttpCode.SERVER_INTERNAL_ERROR.value) + return None - pdp_req = PolicyUtils.gen_req_to_pdp(policy_id) - policy_bodies = PolicyRest._pdp_get_decision(audit, pdp_req) - log_line = "looking for policy_id({}) in policy_bodies: {}".format( - policy_id, json.dumps(policy_bodies)) - _LOGGER.info(log_line) + @staticmethod + def _get_latest_policy(audit, policy_id, + expected_versions, ignore_policy_names, str_metrics): + """retry several times getting the latest policy for the policy_id from the policy-engine""" + PolicyRest._lazy_init() + latest_policy = None + status_code = 0 + retry_get_config = audit.kwargs.get("retry_get_config") - latest_policy = None - if policy_bodies and policy_id in policy_bodies: - latest_policy = PolicyUtils.convert_to_policy(policy_bodies[policy_id]) + for retry in range(1, PolicyRest._policy_retry_count + 1): + _LOGGER.debug("try(%s) retry_get_config(%s): %s", retry, retry_get_config, str_metrics) + + done, removed, latest_policy, status_code = PolicyRest._get_latest_policy_once( + audit, policy_id, expected_versions, ignore_policy_names) - if not PolicyUtils.validate_policy(latest_policy): + if removed: audit.set_http_status_code(AuditHttpCode.DATA_NOT_FOUND_OK.value) - _LOGGER.error(audit.error( - "received invalid policy from PDP: {}".format(json.dumps(latest_policy)), - error_code=AuditResponseCode.DATA_ERROR)) + return None + + if done or not retry_get_config or not PolicyRest._policy_retry_sleep: + break + + if retry == PolicyRest._policy_retry_count: + _LOGGER.error( + audit.error("gave up retrying after #{} for policy_id({}) from PDP {}" + .format(retry, policy_id, PolicyRest._url_pdp_decision), + error_code=AuditResponseCode.DATA_ERROR)) + break + + _LOGGER.warning(audit.warn( + "will retry({}) for policy_id({}) in {} secs from PDP {}".format( + retry, policy_id, PolicyRest._policy_retry_sleep, PolicyRest._url_pdp_decision), + error_code=AuditResponseCode.DATA_ERROR)) + time.sleep(PolicyRest._policy_retry_sleep) + + audit.set_http_status_code(status_code) + if not PolicyUtils.validate_policy(latest_policy): + audit.set_http_status_code(AuditHttpCode.DATA_NOT_FOUND_OK.value) + _LOGGER.error(audit.error( + "received invalid policy from PDP: {}".format(json.dumps(latest_policy)), + error_code=AuditResponseCode.DATA_ERROR)) + + return latest_policy + + @staticmethod + def _get_latest_policy_once(audit, policy_id, expected_versions, ignore_policy_names): + """single attempt to get the latest policy for the policy_id from the policy-engine""" + + status_code, latest_policies = PolicyRest._pdp_get_decision(audit, policy_id) + + if (ignore_policy_names and not expected_versions and not latest_policies + and AuditHttpCode.HTTP_OK.value == status_code): + return True, True, None, status_code + + log_line = "{} looking for policy_id({}) in latest_policies: {}".format( + status_code, policy_id, json.dumps(latest_policies)) + _LOGGER.info(log_line) + + latest_policy = (latest_policies or {}).get(policy_id) + + log_error = "" + if latest_policy: + policy_body = latest_policy.get(POLICY_BODY, {}) + policy_version = policy_body.get(POLICY_VERSION) + policy_name = policy_body.get(POLICY_NAME) + if expected_versions and policy_version not in expected_versions: + log_error = ("received unexpected policy version({}) instead of ({})" + " from PDP for policy_id={}: {}" + .format(policy_version, json.dumps(expected_versions), + policy_id, json.dumps(latest_policy))) + elif ignore_policy_names and policy_name in ignore_policy_names: + log_error = ("unexpectedly received policy version({}) from PDP" + " for policy_id={}: {}. to ignore-policy-names {}" + .format(policy_version, policy_id, + json.dumps(latest_policy), + json.dumps(ignore_policy_names))) + + if not latest_policy or log_error: + _LOGGER.error(audit.error( + log_error or "received unexpected policy data({}) from PDP for policy_id={}: {}" + .format(json.dumps(latest_policy), policy_id, json.dumps(latest_policies)), + error_code=AuditResponseCode.DATA_ERROR)) + latest_policy = None + + done = bool(latest_policy or audit.is_serious_error(status_code)) + return done, False, latest_policy, status_code + + @staticmethod + def get_latest_updated_policies(audit, updated_policies, removed_policies): + """safely try retrieving the latest policies for the list of policy_names""" + if not updated_policies and not removed_policies: + return None, None + + policies_updated = [(policy_id, policy.get(POLICY_BODY, {}).get(POLICY_VERSION)) + for policy_id, policy in updated_policies.items()] + policies_removed = [(policy_id, policy.get(POLICY_NAMES, {})) + for policy_id, policy in removed_policies.items()] + + if not policies_updated and not policies_removed: + return None, None + + str_metrics = "policies_updated[{0}]: {1} policies_removed[{2}]: {3}".format( + len(policies_updated), json.dumps(policies_updated), + len(policies_removed), json.dumps(policies_removed)) + + try: + return PolicyRest._get_latest_updated_policies( + audit, str_metrics, policies_updated, policies_removed) + + except Exception as ex: + error_msg = ("{0}: crash {1} {2} at {3}: {4}" + .format(audit.request_id, type(ex).__name__, str(ex), + "get_latest_updated_policies", str_metrics)) + + _LOGGER.exception(error_msg) + audit.fatal(error_msg, error_code=AuditResponseCode.BUSINESS_PROCESS_ERROR) + audit.set_http_status_code(AuditHttpCode.SERVER_INTERNAL_ERROR.value) + return None, None + + @staticmethod + def _get_latest_updated_policies(audit, str_metrics, policies_updated, policies_removed): + """Get the latest policies of the list of policy_names from the policy-engine""" + PolicyRest._lazy_init() + metrics_total = Metrics( + aud_parent=audit, + targetEntity="{0} total get_latest_updated_policies".format(PolicyRest._target_entity), + targetServiceName=PolicyRest._url_pdp_decision) + + metrics_total.metrics_start("get_latest_updated_policies {0}".format(str_metrics)) + _LOGGER.debug(str_metrics) + + policies_to_find = {} + for (policy_id, policy_version) in policies_updated: + if not policy_id or policy_version is None: + continue + policy = policies_to_find.get(policy_id) + if not policy: + policies_to_find[policy_id] = { + POLICY_ID: policy_id, + PolicyRest.EXPECTED_VERSIONS: {policy_version: True}, + PolicyRest.IGNORE_POLICY_NAMES: {} + } + continue + policy[PolicyRest.EXPECTED_VERSIONS][policy_version] = True + + for (policy_id, policy_names) in policies_removed: + if not policy_id: + continue + policy = policies_to_find.get(policy_id) + if not policy: + policies_to_find[policy_id] = { + POLICY_ID: policy_id, + PolicyRest.IGNORE_POLICY_NAMES: policy_names + } + continue + policy[PolicyRest.IGNORE_POLICY_NAMES].update(policy_names) + + apns = [(audit, policy_id, + policy_to_find.get(PolicyRest.EXPECTED_VERSIONS), + policy_to_find.get(PolicyRest.IGNORE_POLICY_NAMES)) + for (policy_id, policy_to_find) in policies_to_find.items()] + + policies = None + apns_length = len(apns) + _LOGGER.debug("apns_length(%s) policies_to_find %s", apns_length, + json.dumps(policies_to_find)) + + if apns_length == 1: + policies = [PolicyRest.get_latest_policy(apns[0])] + else: + pool = ThreadPool(min(PolicyRest._thread_pool_size, apns_length)) + policies = pool.map(PolicyRest.get_latest_policy, apns) + pool.close() + pool.join() + + metrics_total.metrics("result({}) get_latest_updated_policies {}: {} {}" + .format(apns_length, str_metrics, + len(policies), json.dumps(policies))) + + updated_policies = dict((policy[POLICY_ID], policy) + for policy in policies + if policy and policy.get(POLICY_ID)) + + removed_policies = dict((policy_id, True) + for (policy_id, policy_to_find) in policies_to_find.items() + if not policy_to_find.get(PolicyRest.EXPECTED_VERSIONS) + and policy_to_find.get(PolicyRest.IGNORE_POLICY_NAMES) + and policy_id not in updated_policies) + + errored_policies = dict((policy_id, policy_to_find) + for (policy_id, policy_to_find) in policies_to_find.items() + if policy_id not in updated_policies + and policy_id not in removed_policies) + + _LOGGER.debug( + "result(%s) updated_policies %s, removed_policies %s, errored_policies %s", + apns_length, json.dumps(updated_policies), json.dumps(removed_policies), + json.dumps(errored_policies)) + + if errored_policies: + audit.set_http_status_code(AuditHttpCode.DATA_ERROR.value) + audit.error( + "errored_policies in PDP: {}".format(json.dumps(errored_policies)), + error_code=AuditResponseCode.DATA_ERROR) + + return updated_policies, removed_policies + + + @staticmethod + def get_latest_policies(audit, policy_ids=None): + """Get the latest policies by policy-ids from the policy-engine""" + result = {} + str_policy_ids = json.dumps(policy_ids or []) + + try: + PolicyRest._lazy_init() + if policy_ids: + _, latest_policies = PolicyRest._pdp_get_decision(audit, policy_ids) + + if not latest_policies: + audit.set_http_status_code(AuditHttpCode.DATA_NOT_FOUND_OK.value) + _LOGGER.warning(audit.warn( + "received no policies from PDP for policy_ids {}" + .format(str_policy_ids), error_code=AuditResponseCode.DATA_ERROR)) + return latest_policies + + valid_policies = {} + errored_policies = {} + for (policy_id, policy) in latest_policies.items(): + if PolicyUtils.validate_policy(policy): + valid_policies[policy_id] = policy + else: + errored_policies[policy_id] = policy + + result[LATEST_POLICIES] = valid_policies + result[ERRORED_POLICIES] = errored_policies + + _LOGGER.debug("got policies for policy_ids: %s. result: %s", + str_policy_ids, json.dumps(result)) + return result - return latest_policy except Exception as ex: - error_msg = ("{}: get_latest_policy({}) crash {}: {}" - .format(audit.request_id, policy_id, type(ex).__name__, str(ex))) + error_msg = ("{}: crash {} {} at {}: {}" + .format(audit.request_id, type(ex).__name__, str(ex), + "get_latest_policies", str_policy_ids)) _LOGGER.exception(error_msg) audit.fatal(error_msg, error_code=AuditResponseCode.BUSINESS_PROCESS_ERROR) diff --git a/policyhandler/pdp_api/policy_updates.py b/policyhandler/pdp_api/policy_updates.py index eb3c3d1..15f5b0a 100644 --- a/policyhandler/pdp_api/policy_updates.py +++ b/policyhandler/pdp_api/policy_updates.py @@ -1,5 +1,5 @@ # ================================================================================ -# Copyright (c) 2019 AT&T Intellectual Property. All rights reserved. +# Copyright (c) 2019-2020 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. @@ -17,10 +17,13 @@ """policy-updates accumulates the policy-update notifications from PDP""" +import json import os -from ..utils import Utils, ToBeImplementedException - +from ..policy_consts import POLICY_BODY, POLICY_ID, POLICY_NAMES +from ..utils import Utils +from .pdp_consts import DEPLOYED_POLICIES, POLICY_NAME, UNDEPLOYED_POLICIES +from .policy_utils import PolicyUtils _LOGGER = Utils.get_logger(__file__) @@ -30,9 +33,12 @@ class PolicyUpdates(object): def __init__(self): """init and reset""" + self._audit = None + self._policies_updated = {} + self._policies_removed = {} def reset(self): - """resets the state""" + """resets the state - removes the pending policy-updates""" self.__init__() def pop_policy_updates(self): @@ -40,10 +46,71 @@ class PolicyUpdates(object): Returns the consolidated (audit, policies_updated, policies_removed) and resets the state """ - _LOGGER.info("to_be_implemented") - return None, None, None + if not self._audit: + return None, None, None + + audit = self._audit + policies_updated = self._policies_updated + policies_removed = self._policies_removed + + self.reset() + + return audit, policies_updated, policies_removed + + + def push_policy_updates(self, audit, multi_policies_updated): + """ + consolidate the new policies_updated, policies_removed to existing ones + + receives + :multi_policies_updated: as [ + {DEPLOYED_POLICIES: [{PDP_METADATA: {POLICY_ID: <policy_id>, + POLICY_VERSION: <policy_version>}}, ...], + UNDEPLOYED_POLICIES: [{PDP_METADATA: {POLICY_ID: <policy_id>, + POLICY_VERSION: <policy_version>}}, ...] + }, ...] + """ + for p_single_updated in multi_policies_updated: + for p_undeployed in p_single_updated.get(UNDEPLOYED_POLICIES, []): + policy = PolicyUtils.convert_to_policy(p_undeployed) + if not policy: + continue + policy_id = policy.get(POLICY_ID) + policy_name = policy.get(POLICY_BODY, {}).get(POLICY_NAME) + + if policy_id in self._policies_removed: + policy = self._policies_removed[policy_id] + + if POLICY_NAMES not in policy: + policy[POLICY_NAMES] = {} + policy[POLICY_NAMES][policy_name] = True + self._policies_removed[policy_id] = policy + + for p_deployed in p_single_updated.get(DEPLOYED_POLICIES, []): + policy = PolicyUtils.convert_to_policy(p_deployed) + if not policy: + continue + policy_id = policy.get(POLICY_ID) + policy_name = policy.get(POLICY_BODY, {}).get(POLICY_NAME) + + self._policies_updated[policy_id] = policy + + rm_policy_names = self._policies_removed.get(policy_id, {}).get(POLICY_NAMES) + if rm_policy_names and policy_name in rm_policy_names: + del rm_policy_names[policy_name] + + req_message = ("policy-update notification - updated[{}], removed[{}]" + .format(len(self._policies_updated), + len(self._policies_removed))) + + if not self._audit: + self._audit = audit + else: + audit.audit_done(result="policy-updates queued to request_id({})" + .format(self._audit.request_id)) + self._audit.req_message = req_message - def push_policy_updates(self, *_): - """consolidate the new policies_updated, policies_removed to existing ones""" - _LOGGER.info("to_be_implemented") - raise ToBeImplementedException() + _LOGGER.info( + "pending(%s) for %s policies_updated %s policies_removed %s", + self._audit.request_id, req_message, + json.dumps(self._policies_updated), json.dumps(self._policies_removed)) diff --git a/policyhandler/pdp_api/policy_utils.py b/policyhandler/pdp_api/policy_utils.py index 1d06d14..f2ed522 100644 --- a/policyhandler/pdp_api/policy_utils.py +++ b/policyhandler/pdp_api/policy_utils.py @@ -1,5 +1,5 @@ # ================================================================================ -# Copyright (c) 2019 AT&T Intellectual Property. All rights reserved. +# Copyright (c) 2019-2020 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. @@ -30,14 +30,19 @@ class PolicyUtils(object): """policy-client utils""" @staticmethod - def gen_req_to_pdp(policy_id): - """request to get a single policy from pdp by policy_id""" + def gen_req_to_pdp(policy_ids): + """request to get policies from pdp by policy_id list or a single value""" + if not policy_ids: + policy_ids = [] + elif not isinstance(policy_ids, list): + policy_ids = [policy_ids] + return { PDP_REQ_ONAP_NAME: "DCAE", PDP_REQ_ONAP_COMPONENT: Audit.service_name, PDP_REQ_ONAP_INSTANCE: Audit.SERVICE_INSTANCE_UUID, "action": "configure", - PDP_REQ_RESOURCE: {PDP_POLICY_ID: [policy_id]} + PDP_REQ_RESOURCE: {PDP_POLICY_ID: policy_ids} } @staticmethod @@ -52,7 +57,7 @@ class PolicyUtils(object): "version": "1.0.0", "metadata": { "policy-id": "onap.scaleout.tca", - "policy-version": 1, + "policy-version": "1.2.3", "description": "The scaleout policy for vDNS" }, "properties": { @@ -73,13 +78,13 @@ class PolicyUtils(object): { "policy_id": "onap.scaleout.tca", "policy_body": { - "policyName": "onap.scaleout.tca.1.xml", - "policyVersion": 1, + "policyName": "onap.scaleout.tca.1-2-3.xml", + "policyVersion": "1.2.3", "type": "onap.policies.monitoring.cdap.tca.hi.lo.app", "version": "1.0.0", "metadata": { "policy-id": "onap.scaleout.tca", - "policy-version": 1, + "policy-version": "1.2.3", "description": "The scaleout policy for vDNS" }, "config": { @@ -97,19 +102,20 @@ class PolicyUtils(object): } } """ - if not policy_body or not policy_body.get(PDP_PROPERTIES): + if not policy_body: return None pdp_metadata = policy_body.get(PDP_METADATA, {}) policy_id = pdp_metadata.get(PDP_POLICY_ID) policy_version = pdp_metadata.get(PDP_POLICY_VERSION) - if not policy_id or not policy_version: + if not policy_id or policy_version is None: return None - policy_body[POLICY_NAME] = "{}.{}.xml".format(policy_id, policy_version) + policy_body[POLICY_NAME] = "{}.{}.xml".format(policy_id, policy_version.replace(".", "-")) policy_body[POLICY_VERSION] = str(policy_version) - policy_body[POLICY_CONFIG] = policy_body[PDP_PROPERTIES] - del policy_body[PDP_PROPERTIES] + if PDP_PROPERTIES in policy_body: + policy_body[POLICY_CONFIG] = policy_body[PDP_PROPERTIES] + del policy_body[PDP_PROPERTIES] return {POLICY_ID:policy_id, POLICY_BODY:policy_body} diff --git a/policyhandler/pdp_api_v0/policy_listener.py b/policyhandler/pdp_api_v0/policy_listener.py index 67e4c49..7525e4d 100644 --- a/policyhandler/pdp_api_v0/policy_listener.py +++ b/policyhandler/pdp_api_v0/policy_listener.py @@ -1,5 +1,5 @@ # ================================================================================ -# Copyright (c) 2018-2019 AT&T Intellectual Property. All rights reserved. +# Copyright (c) 2018-2020 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. @@ -16,7 +16,7 @@ # """ -policy-listener communicates with policy-engine +policy_listener communicates with policy-engine thru web-socket to receive push notifications on updates and removal of policies. @@ -298,8 +298,8 @@ class PolicyListener(Thread): def shutdown(self, audit): - """Shutdown the policy-listener""" - _LOGGER.info(audit.info("shutdown policy-listener")) + """Shutdown the policy_listener""" + _LOGGER.info(audit.info("shutdown policy_listener")) with self._lock: self._keep_running = False diff --git a/policyhandler/pdp_api_v0/policy_matcher.py b/policyhandler/pdp_api_v0/policy_matcher.py index 357af49..deb6619 100644 --- a/policyhandler/pdp_api_v0/policy_matcher.py +++ b/policyhandler/pdp_api_v0/policy_matcher.py @@ -1,5 +1,5 @@ # ================================================================================ -# Copyright (c) 2018-2019 AT&T Intellectual Property. All rights reserved. +# Copyright (c) 2018-2020 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. @@ -38,24 +38,6 @@ class PolicyMatcher(object): PDP_API_FOLDER = os.path.basename(os.path.dirname(os.path.realpath(__file__))) @staticmethod - def get_deployed_policies(audit): - """get the deployed policies and policy-filters""" - deployed_policies, deployed_policy_filters = DeployHandler.get_deployed_policies(audit) - - if audit.is_not_found(): - warning_txt = "got no deployed policies or policy-filters" - _LOGGER.warning(warning_txt) - return {"warning": warning_txt}, None, None - - if not audit.is_success() or (not deployed_policies and not deployed_policy_filters): - error_txt = "failed to retrieve policies from deployment-handler" - _LOGGER.error(error_txt) - return {"error": error_txt}, None, None - - return None, deployed_policies, deployed_policy_filters - - - @staticmethod def build_catch_up_message(audit, deployed_policies, deployed_policy_filters): """ find the latest policies from policy-engine for the deployed policies and policy-filters @@ -135,7 +117,7 @@ class PolicyMatcher(object): @staticmethod def match_to_deployed_policies(audit, policies_updated, policies_removed): """match the policies_updated, policies_removed versus deployed policies""" - deployed_policies, deployed_policy_filters = DeployHandler.get_deployed_policies(audit) + _, deployed_policies, deployed_policy_filters = DeployHandler.get_deployed_policies(audit) if not audit.is_success(): return {}, {}, {} diff --git a/policyhandler/pdp_api_v0/policy_rest.py b/policyhandler/pdp_api_v0/policy_rest.py index c59625e..30fc043 100644 --- a/policyhandler/pdp_api_v0/policy_rest.py +++ b/policyhandler/pdp_api_v0/policy_rest.py @@ -1,5 +1,5 @@ # ================================================================================ -# Copyright (c) 2017-2019 AT&T Intellectual Property. All rights reserved. +# Copyright (c) 2017-2020 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. @@ -28,8 +28,7 @@ from threading import Lock import requests from ..config import Config, Settings -from ..onap.audit import (REQUEST_X_ECOMP_REQUESTID, AuditHttpCode, - AuditResponseCode, Metrics) +from ..onap.audit import AuditHttpCode, AuditResponseCode, Metrics from ..policy_consts import (ERRORED_POLICIES, LATEST_POLICIES, POLICY_BODY, POLICY_FILTER, POLICY_FILTERS, POLICY_ID, POLICY_NAMES) @@ -84,10 +83,10 @@ class PolicyRest(object): changed, pool_size = PolicyRest._settings.get_by_key(Config.POOL_CONNECTIONS, 20) if changed: PolicyRest._requests_session.mount( - 'https://', requests.adapters.HTTPAdapter(pool_connections=pool_size, + 'https://', requests.adapters.HTTPAdapter(pool_connections=1, pool_maxsize=pool_size)) PolicyRest._requests_session.mount( - 'http://', requests.adapters.HTTPAdapter(pool_connections=pool_size, + 'http://', requests.adapters.HTTPAdapter(pool_connections=1, pool_maxsize=pool_size)) _, config = PolicyRest._settings.get_by_key(Config.FIELD_POLICY_ENGINE) @@ -159,7 +158,7 @@ class PolicyRest(object): _LOGGER.error( audit.error("no url for PDP", error_code=AuditResponseCode.AVAILABILITY_ERROR)) audit.set_http_status_code(AuditHttpCode.SERVER_INTERNAL_ERROR.value) - return None + return None, None with PolicyRest._lock: session = PolicyRest._requests_session @@ -171,7 +170,7 @@ class PolicyRest(object): metrics = Metrics(aud_parent=audit, targetEntity=target_entity, targetServiceName=url) - headers[REQUEST_X_ECOMP_REQUESTID] = metrics.request_id + headers = metrics.put_request_id_into_headers(headers) log_action = "post to {} at {}".format(target_entity, url) log_data = "msg={} headers={}, custom_kwargs({}) timeout_in_secs({})".format( @@ -191,7 +190,7 @@ class PolicyRest(object): else AuditHttpCode.SERVER_INTERNAL_ERROR.value) error_msg = ("failed {}: {} to {}".format(type(ex).__name__, str(ex), log_line)) - _LOGGER.exception(error_msg) + _LOGGER.exception(metrics.fatal(error_msg)) metrics.set_http_status_code(error_code) audit.set_http_status_code(error_code) metrics.metrics(error_msg) @@ -412,7 +411,7 @@ class PolicyRest(object): policies_to_find = {} for (policy_id, policy_version) in policies_updated: - if not policy_id or not policy_version or not policy_version.isdigit(): + if not policy_id or policy_version is None or not policy_version.isdigit(): continue policy = policies_to_find.get(policy_id) if not policy: diff --git a/policyhandler/pdp_api_v0/policy_updates.py b/policyhandler/pdp_api_v0/policy_updates.py index eafdca2..ac68f4a 100644 --- a/policyhandler/pdp_api_v0/policy_updates.py +++ b/policyhandler/pdp_api_v0/policy_updates.py @@ -1,5 +1,5 @@ # ================================================================================ -# Copyright (c) 2018-2019 AT&T Intellectual Property. All rights reserved. +# Copyright (c) 2018-2020 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. @@ -40,7 +40,7 @@ class PolicyUpdates(object): self._policies_removed = {} def reset(self): - """resets the state""" + """resets the state - removes the pending policy-updates""" self.__init__() def pop_policy_updates(self): @@ -62,25 +62,12 @@ class PolicyUpdates(object): def push_policy_updates(self, policies_updated, policies_removed): """consolidate the new policies_updated, policies_removed to existing ones""" - for policy_body in policies_updated: - policy_name = policy_body.get(POLICY_NAME) - policy = PolicyUtils.convert_to_policy(policy_body) - if not policy: - continue - policy_id = policy.get(POLICY_ID) - - self._policies_updated[policy_id] = policy - - rm_policy_names = self._policies_removed.get(policy_id, {}).get(POLICY_NAMES) - if rm_policy_names and policy_name in rm_policy_names: - del rm_policy_names[policy_name] - for policy_body in policies_removed: - policy_name = policy_body.get(POLICY_NAME) policy = PolicyUtils.convert_to_policy(policy_body) if not policy: continue policy_id = policy.get(POLICY_ID) + policy_name = policy_body.get(POLICY_NAME) if policy_id in self._policies_removed: policy = self._policies_removed[policy_id] @@ -90,16 +77,27 @@ class PolicyUpdates(object): policy[POLICY_NAMES][policy_name] = True self._policies_removed[policy_id] = policy + for policy_body in policies_updated: + policy = PolicyUtils.convert_to_policy(policy_body) + if not policy: + continue + policy_id = policy.get(POLICY_ID) + policy_name = policy_body.get(POLICY_NAME) + + self._policies_updated[policy_id] = policy + + rm_policy_names = self._policies_removed.get(policy_id, {}).get(POLICY_NAMES) + if rm_policy_names and policy_name in rm_policy_names: + del rm_policy_names[policy_name] + req_message = ("policy-update notification - updated[{0}], removed[{1}]" .format(len(self._policies_updated), len(self._policies_removed))) if not self._audit: - self._audit = Audit(job_name="policy_update", - req_message=req_message, + self._audit = Audit(job_name="policy_update", req_message=req_message, retry_get_config=True) - else: - self._audit.req_message = req_message + self._audit.req_message = req_message _LOGGER.info( "pending(%s) for %s policies_updated %s policies_removed %s", diff --git a/policyhandler/pdp_api_v0/policy_utils.py b/policyhandler/pdp_api_v0/policy_utils.py index d337665..2cbb22c 100644 --- a/policyhandler/pdp_api_v0/policy_utils.py +++ b/policyhandler/pdp_api_v0/policy_utils.py @@ -1,5 +1,5 @@ # ================================================================================ -# Copyright (c) 2018-2019 AT&T Intellectual Property. All rights reserved. +# Copyright (c) 2018-2020 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. @@ -63,7 +63,7 @@ class PolicyUtils(object): return None policy_name = policy_body.get(POLICY_NAME) policy_version = policy_body.get(POLICY_VERSION) - if not policy_name or not policy_version: + if not policy_name or policy_version is None: return None policy_id = PolicyUtils.extract_policy_id(policy_name) if not policy_id: @@ -81,7 +81,7 @@ class PolicyUtils(object): for policy_body in policy_bodies: policy_name = policy_body.get(POLICY_NAME) policy_version = policy_body.get(POLICY_VERSION) - if not policy_name or not policy_version or not policy_version.isdigit(): + if not policy_name or policy_version is None or not policy_version.isdigit(): continue if expected_versions and policy_version not in expected_versions: continue @@ -108,7 +108,7 @@ class PolicyUtils(object): continue policy_id = policy.get(POLICY_ID) policy_version = policy.get(POLICY_BODY, {}).get(POLICY_VERSION) - if not policy_id or not policy_version or not policy_version.isdigit(): + if not policy_id or policy_version is None or not policy_version.isdigit(): continue if (policy_id not in policies or int(policy_version) > int(policies[policy_id][POLICY_BODY][POLICY_VERSION])): diff --git a/policyhandler/policy_receiver.py b/policyhandler/policy_receiver.py index d949c4b..091c2c3 100644 --- a/policyhandler/policy_receiver.py +++ b/policyhandler/policy_receiver.py @@ -1,5 +1,5 @@ # ================================================================================ -# Copyright (c) 2018-2019 AT&T Intellectual Property. All rights reserved. +# Copyright (c) 2018-2020 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. @@ -24,13 +24,15 @@ on receiving the policy-notifications, the policy-receiver passes the notifications to policy-updater """ +from .config import Config from .service_activator import ServiceActivator + class PolicyReceiver(object): """ policy-receiver - static singleton wrapper around two threads policy_updater - master thread for all scheduled actions - policy_listener - listens to policy-engine through web-socket + policy_listener - listens to policy-engine through DMaaP MR or web-socket """ _policy_updater = None _policy_listener = None @@ -47,9 +49,9 @@ class PolicyReceiver(object): def _close_listener(audit): """stop the notification-handler""" if PolicyReceiver._policy_listener: - policy_receiver = PolicyReceiver._policy_listener + policy_listener = PolicyReceiver._policy_listener PolicyReceiver._policy_listener = None - policy_receiver.shutdown(audit) + policy_listener.shutdown(audit) @staticmethod def shutdown(audit): @@ -98,4 +100,7 @@ class PolicyReceiver(object): PolicyReceiver._policy_updater.start() - PolicyReceiver.catch_up(audit) + if Config.is_pdp_api_default(): + audit.audit_done(result="will catch_up after draining the policy-update queue") + else: + PolicyReceiver.catch_up(audit) diff --git a/policyhandler/policy_updater.py b/policyhandler/policy_updater.py index 3fcde40..42c5ee6 100644 --- a/policyhandler/policy_updater.py +++ b/policyhandler/policy_updater.py @@ -1,5 +1,5 @@ # ================================================================================ -# Copyright (c) 2017-2019 AT&T Intellectual Property. All rights reserved. +# Copyright (c) 2017-2020 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. @@ -40,7 +40,7 @@ class PolicyUpdater(Thread): self._reconfigure_receiver = on_reconfigure_receiver self._lock = Lock() - self._run = Event() + self._run_event = Event() self._settings = Settings(CATCH_UP, Config.RECONFIGURE) self._catch_up_timer = None @@ -74,11 +74,11 @@ class PolicyUpdater(Thread): self._settings.commit_change() return True - def policy_update(self, policies_updated, policies_removed): + def policy_update(self, *args): """enqueue the policy-updates""" with self._lock: - self._policy_updates.push_policy_updates(policies_updated, policies_removed) - self._run.set() + self._policy_updates.push_policy_updates(*args) + self._run_event.set() def catch_up(self, audit=None): """need to bring the latest policies to DCAE-Controller""" @@ -89,7 +89,7 @@ class PolicyUpdater(Thread): "catch_up %s request_id %s", self._aud_catch_up.req_message, self._aud_catch_up.request_id ) - self._run.set() + self._run_event.set() def reconfigure(self, audit=None): """job to check for and bring in the updated config for policy-handler""" @@ -100,7 +100,7 @@ class PolicyUpdater(Thread): "%s request_id %s", self._aud_reconfigure.req_message, self._aud_reconfigure.request_id ) - self._run.set() + self._run_event.set() def run(self): """wait and run the policy-update in thread""" @@ -108,10 +108,10 @@ class PolicyUpdater(Thread): self._run_reconfigure_timer() while True: _LOGGER.info("waiting for policy-updates...") - self._run.wait() + self._run_event.wait() with self._lock: - self._run.clear() + self._run_event.clear() if not self._keep_running(): break @@ -126,7 +126,7 @@ class PolicyUpdater(Thread): self._on_policy_update() - _LOGGER.info("exit policy-updater") + _LOGGER.info("exit policy_updater") def _keep_running(self): """thread-safe check whether to continue running""" @@ -235,7 +235,7 @@ class PolicyUpdater(Thread): if self._reconfigure_receiver(aud_reconfigure): need_to_catch_up = True - changed_configs.append("web-socket") + changed_configs.append("policy-receiver") reconfigure_result = " -- config changed on {} changes: {}".format( json.dumps(changed_configs), Config.discovered_config) @@ -246,7 +246,7 @@ class PolicyUpdater(Thread): Config.discovered_config.commit_change() aud_reconfigure.audit_done(result=reconfigure_result) - _LOGGER.info(log_line + reconfigure_result) + _LOGGER.info("%s%s", log_line, reconfigure_result) if need_to_catch_up: self._pause_catch_up_timer() @@ -300,8 +300,7 @@ class PolicyUpdater(Thread): _LOGGER.info(log_line) self._pause_catch_up_timer() - (_, policies, - policy_filters) = pdp_client.PolicyMatcher.get_deployed_policies(aud_catch_up) + (_, policies, policy_filters) = DeployHandler.get_deployed_policies(aud_catch_up) catch_up_message = None if aud_catch_up.is_not_found(): @@ -422,11 +421,11 @@ class PolicyUpdater(Thread): def shutdown(self, audit): - """Shutdown the policy-updater""" - _LOGGER.info("shutdown policy-updater") + """Shutdown the policy_updater""" + _LOGGER.info("shutdown policy_updater") with self._lock: self._aud_shutdown = audit - self._run.set() + self._run_event.set() self._stop_timers() diff --git a/policyhandler/service_activator.py b/policyhandler/service_activator.py index c1e5b8c..1fab5c6 100644 --- a/policyhandler/service_activator.py +++ b/policyhandler/service_activator.py @@ -1,5 +1,5 @@ # ================================================================================ -# Copyright (c) 2019 AT&T Intellectual Property. All rights reserved. +# Copyright (c) 2019-2020 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. @@ -36,8 +36,7 @@ import requests from .config import Config, Settings from .discovery import DiscoveryClient -from .onap.audit import (REQUEST_X_ECOMP_REQUESTID, Audit, AuditHttpCode, - Metrics) +from .onap.audit import Audit, AuditHttpCode, Metrics from .policy_consts import TARGET_ENTITY from .utils import Utils @@ -153,16 +152,11 @@ class ServiceActivator(object): mode_of_operation - whether the service is active == True or passive == False based on the current value of the mode_of_operation - - temporary for R4 Dublin - passive for new PDP API """ active = (ServiceActivator._mode_of_operation is None or ServiceActivator._mode_of_operation == ServiceActivator.MODE_OF_OPERATION_ACTIVE) - if active and Config.is_pdp_api_default(): - active = False - if audit: _LOGGER.info(audit.info("mode_of_operation = {} active = {}".format( ServiceActivator._mode_of_operation, active))) @@ -188,7 +182,7 @@ class ServiceActivator(object): metrics = Metrics(aud_parent=audit, targetEntity="{} determine_mode_of_operation".format(target_entity), targetServiceName=url) - headers = {REQUEST_X_ECOMP_REQUESTID : metrics.request_id} + headers = metrics.put_request_id_into_headers() log_action = "post to {} at {}".format(target_entity, url) log_data = "headers={}, json_body={}, timeout_in_secs={}, custom_kwargs({})".format( @@ -209,7 +203,7 @@ class ServiceActivator(object): else AuditHttpCode.SERVER_INTERNAL_ERROR.value) error_msg = "failed to {} {}: {} {}".format( log_action, type(ex).__name__, str(ex), log_data) - _LOGGER.exception(error_msg) + _LOGGER.exception(metrics.fatal(error_msg)) metrics.set_http_status_code(error_code) audit.set_http_status_code(error_code) metrics.metrics(error_msg) diff --git a/policyhandler/utils.py b/policyhandler/utils.py index d728e48..685d7d8 100644 --- a/policyhandler/utils.py +++ b/policyhandler/utils.py @@ -1,5 +1,5 @@ # ================================================================================ -# Copyright (c) 2018-2019 AT&T Intellectual Property. All rights reserved. +# Copyright (c) 2018-2020 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. @@ -23,11 +23,6 @@ import os from copy import deepcopy from typing import Pattern -class ToBeImplementedException(Exception): - """exception for to be implemented features of policy-handler""" - pass - - class Utils(object): """general purpose utils""" _logger = logging.getLogger("policy_handler.utils") @@ -91,6 +86,14 @@ class Utils(object): return False for key, val_1 in body_1.items(): + val_2 = body_2[key] + if isinstance(val_1, str) or isinstance(val_2, str): + if val_1 != val_2: + Utils._logger.debug("key-values %s != %s", + json_dumps({key: val_1}), json_dumps({key: val_2})) + return False + continue + if not Utils.are_the_same(val_1, body_2[key], json_dumps): return False return True diff --git a/policyhandler/web_server.py b/policyhandler/web_server.py index 9c2656e..f52f18e 100644 --- a/policyhandler/web_server.py +++ b/policyhandler/web_server.py @@ -1,5 +1,5 @@ # ================================================================================ -# Copyright (c) 2017-2019 AT&T Intellectual Property. All rights reserved. +# Copyright (c) 2017-2020 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. @@ -18,15 +18,15 @@ """web-server for policy_handler""" import json -from datetime import datetime import os import time +from datetime import datetime import cherrypy from . import pdp_client from .config import Config -from .deploy_handler import PolicyUpdateMessage +from .deploy_handler import DeployHandler, PolicyUpdateMessage from .onap.audit import Audit, AuditHttpCode from .policy_receiver import PolicyReceiver from .utils import Utils @@ -120,7 +120,7 @@ class _PolicyWeb(object): PolicyWeb.logger.info("%s", req_info) - result, policies, policy_filters = pdp_client.PolicyMatcher.get_deployed_policies(audit) + result, policies, policy_filters = DeployHandler.get_deployed_policies(audit) if not result: result, policy_update = pdp_client.PolicyMatcher.build_catch_up_message( audit, policies, policy_filters) @@ -184,12 +184,12 @@ class _PolicyWeb(object): } } """ - if Config.is_pdp_api_default(): - raise cherrypy.HTTPError(404, "temporarily unsupported due to the new pdp API") - if cherrypy.request.method == "GET": return self._get_all_policies_latest() + if Config.is_pdp_api_default(): + raise cherrypy.HTTPError(404, "temporarily unsupported due to the new pdp API") + if cherrypy.request.method != "POST": raise cherrypy.HTTPError(404, "unexpected method {0}".format(cherrypy.request.method)) @@ -29,7 +29,7 @@ limitations under the License. <groupId>org.onap.dcaegen2.platform</groupId> <artifactId>policy-handler</artifactId> <name>dcaegen2-platform-policy-handler</name> - <version>5.0.1-SNAPSHOT</version> + <version>5.1.0-SNAPSHOT</version> <url>http://maven.apache.org</url> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> @@ -1,5 +1,5 @@ # ================================================================================
-# Copyright (c) 2017-2019 AT&T Intellectual Property. All rights reserved.
+# Copyright (c) 2017-2020 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.
@@ -22,7 +22,7 @@ from setuptools import setup setup(
name='policyhandler',
description='DCAE-Controller policy-handler to communicate with policy-engine',
- version="5.0.1",
+ version="5.1.0",
author='Alex Shatov',
packages=['policyhandler'],
zip_safe=False,
diff --git a/tests/conftest.py b/tests/conftest.py index c3f4100..cbd6264 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -1,5 +1,5 @@ # ============LICENSE_START======================================================= -# Copyright (c) 2018-2019 AT&T Intellectual Property. All rights reserved. +# Copyright (c) 2018-2020 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. @@ -15,30 +15,27 @@ # ============LICENSE_END========================================================= # """ -startdard pytest file that contains the shared fixtures +standard pytest file that contains the shared fixtures https://docs.pytest.org/en/latest/fixture.html """ import base64 import copy import json +import os import pytest from policyhandler.config import Config -from policyhandler.deploy_handler import DeployHandler from policyhandler.discovery import DiscoveryClient -from policyhandler.onap.audit import Audit from policyhandler.policy_consts import CATCH_UP, TARGET_ENTITY from policyhandler.utils import Utils -from .mock_deploy_handler import MockDeploymentHandler from .mock_settings import MockSettings from .mock_tracker import MockHttpResponse, Tracker _LOGGER = Utils.get_logger(__file__) -_LOGGER.info("init MockSettings") -MockSettings.init() +MockSettings.init_mock_config() @pytest.fixture(scope="session", autouse=True) def _auto_setup__global(): @@ -50,9 +47,19 @@ def _auto_setup__global(): _LOGGER.info("teardown _auto_setup__global") +@pytest.fixture(autouse=True, scope="module") +def _auto_module_cycle(request): + """log all the test starts and ends""" + module_name = request.module.__name__.replace(".", "/") + + _LOGGER.info("start_module: %s %s", module_name, "->"*25) + yield _auto_module_cycle + _LOGGER.info("end_module: %s %s", module_name, "<-"*25) + @pytest.fixture(autouse=True) def _auto_test_cycle(request): """log all the test starts and ends""" + _LOGGER.info("-"*75) module_name = request.module.__name__.replace(".", "/") if request.cls: test_name = "%s.py::%s::%s" % (module_name, request.cls.__name__, @@ -61,7 +68,6 @@ def _auto_test_cycle(request): test_name = "%s.py::%s" % (module_name, request.function.__name__) Tracker.reset(test_name) - _LOGGER.info("-"*75) _LOGGER.info(">>>>>>> start [%s]: %s", len(Tracker.test_names), test_name) yield _auto_test_cycle _LOGGER.info(">>>>>>> tracked messages: %s", Tracker.to_string()) @@ -84,35 +90,6 @@ def fix_cherrypy_engine_exit(monkeypatch): _LOGGER.info("teardown fix_cherrypy_engine_exit") -@pytest.fixture() -def fix_deploy_handler(monkeypatch): - """monkeyed requests to deployment-handler""" - def monkeyed_deploy_handler_put(uri, **kwargs): - """monkeypatch for policy-update request.put to deploy_handler""" - return MockHttpResponse("put", uri, MockDeploymentHandler.default_response(), - **kwargs) - - def monkeyed_deploy_handler_get(uri, **kwargs): - """monkeypatch policy-update request.get to deploy_handler""" - return MockHttpResponse("get", uri, MockDeploymentHandler.get_deployed_policies(), - **kwargs) - - _LOGGER.info("setup fix_deploy_handler") - audit = None - if DeployHandler._lazy_inited is False: - audit = Audit(req_message="fix_deploy_handler") - DeployHandler._lazy_init(audit) - - monkeypatch.setattr('policyhandler.deploy_handler.DeployHandler._requests_session.put', - monkeyed_deploy_handler_put) - monkeypatch.setattr('policyhandler.deploy_handler.DeployHandler._requests_session.get', - monkeyed_deploy_handler_get) - - yield fix_deploy_handler - if audit: - audit.audit_done("teardown") - _LOGGER.info("teardown fix_deploy_handler") - @pytest.fixture() def fix_discovery(monkeypatch): @@ -134,7 +111,7 @@ def fix_discovery(monkeypatch): Config.consul_url, Config.system_name): res_json = [{"Value": base64.b64encode( json.dumps(MockSettings.mock_config).encode()).decode("utf-8")}] - return MockHttpResponse("get", uri, res_json) + return MockHttpResponse("get", uri, res_json=res_json) _LOGGER.info("setup fix_discovery") monkeypatch.setattr('policyhandler.discovery.requests.get', monkeyed_discovery) @@ -156,65 +133,42 @@ def fix_auto_catch_up(): MockSettings.rediscover_config(prev_config) _LOGGER.info("teardown fix_auto_catch_up") +@pytest.fixture(scope="module") +def fix_pdp_authorization(): + """set env vars that overwrite the headers.Authorization on pdp and dmaap_mr clients""" + _LOGGER.info("setup fix_pdp_authorization %s", json.dumps(MockSettings.mock_config)) + prev_config = copy.deepcopy(MockSettings.mock_config) + + os.environ.update({ + Config.PDP_USER: "alex-PDP_USER", + Config.PDP_PWD: "alex-PDP_PWD", + Config.DMAAP_MR_USER: "alex-DMAAP_MR_USER", + Config.DMAAP_MR_PWD: "alex-DMAAP_MR_PWD" + }) + Config._local_config._config = None + Config._pdp_authorization = None + Config._dmaap_mr_authorization = None + MockSettings.reinit_mock_config() + MockSettings.rediscover_config() -@pytest.fixture() -def fix_deploy_handler_413(monkeypatch): - """monkeyed failed discovery request.get""" - def monkeyed_deploy_handler_put(uri, **kwargs): - """monkeypatch for deploy_handler""" - return MockHttpResponse( - "put", uri, - {"server_instance_uuid": MockSettings.deploy_handler_instance_uuid}, - status_code=413, **kwargs - ) - - def monkeyed_deploy_handler_get(uri, **kwargs): - """monkeypatch policy-update request.get to deploy_handler""" - return MockHttpResponse("get", uri, MockDeploymentHandler.get_deployed_policies(), - **kwargs) - - _LOGGER.info("setup fix_deploy_handler_413") - audit = None - if DeployHandler._lazy_inited is False: - audit = Audit(req_message="fix_deploy_handler_413") - DeployHandler._lazy_init(audit) - - monkeypatch.setattr('policyhandler.deploy_handler.DeployHandler._requests_session.put', - monkeyed_deploy_handler_put) - monkeypatch.setattr('policyhandler.deploy_handler.DeployHandler._requests_session.get', - monkeyed_deploy_handler_get) - - yield fix_deploy_handler_413 - if audit: - audit.audit_done("teardown") - _LOGGER.info("teardown fix_deploy_handler_413") + _LOGGER.info("fix_pdp_authorization %s, %s: %s:%s %s:%s", + json.dumps(Config._pdp_authorization), json.dumps(Config._dmaap_mr_authorization), + os.environ.get(Config.PDP_USER), os.environ.get(Config.PDP_PWD), + os.environ.get(Config.DMAAP_MR_USER), os.environ.get(Config.DMAAP_MR_PWD)) + yield fix_pdp_authorization -@pytest.fixture() -def fix_deploy_handler_404(monkeypatch): - """monkeyed failed discovery request.get""" - def monkeyed_deploy_handler_put(uri, **kwargs): - """monkeypatch for deploy_handler""" - return MockHttpResponse("put", uri, MockDeploymentHandler.default_response(), - **kwargs) - - def monkeyed_deploy_handler_get(uri, **kwargs): - """monkeypatch policy-update request.get to deploy_handler""" - return MockHttpResponse("get", uri, MockDeploymentHandler.default_response(), - **kwargs) - - _LOGGER.info("setup fix_deploy_handler_404") - audit = None - if DeployHandler._lazy_inited is False: - audit = Audit(req_message="fix_deploy_handler_404") - DeployHandler._lazy_init(audit) - - monkeypatch.setattr('policyhandler.deploy_handler.DeployHandler._requests_session.put', - monkeyed_deploy_handler_put) - monkeypatch.setattr('policyhandler.deploy_handler.DeployHandler._requests_session.get', - monkeyed_deploy_handler_get) - - yield fix_deploy_handler_404 - if audit: - audit.audit_done("teardown") - _LOGGER.info("teardown fix_deploy_handler_404") + del os.environ[Config.PDP_USER] + del os.environ[Config.PDP_PWD] + del os.environ[Config.DMAAP_MR_USER] + del os.environ[Config.DMAAP_MR_PWD] + + Config._local_config._config = None + Config._pdp_authorization = None + Config._dmaap_mr_authorization = None + MockSettings.reinit_mock_config() + MockSettings.rediscover_config(prev_config) + _LOGGER.info("teardown fix_pdp_authorization %s, %s: %s:%s %s:%s", + json.dumps(Config._pdp_authorization), json.dumps(Config._dmaap_mr_authorization), + os.environ.get(Config.PDP_USER), os.environ.get(Config.PDP_PWD), + os.environ.get(Config.DMAAP_MR_USER), os.environ.get(Config.DMAAP_MR_PWD)) diff --git a/tests/etc_config.json b/tests/etc_config.json index d7715b2..c5df55c 100644 --- a/tests/etc_config.json +++ b/tests/etc_config.json @@ -7,7 +7,7 @@ "system" : "policy_handler", "tls" : { "cert_directory" : "etc/tls/certs/", - "cacert" : "att_internal_root.crt", + "cacert" : "cacert.crt", "private_key" : "key.pem", "server_cert" : "cert.pem", "server_ca_chain" : "ca_chain.pem" diff --git a/tests/main/conftest.py b/tests/main/conftest.py index c985380..11f5d0b 100644 --- a/tests/main/conftest.py +++ b/tests/main/conftest.py @@ -1,5 +1,5 @@ # ============LICENSE_START======================================================= -# Copyright (c) 2019 AT&T Intellectual Property. All rights reserved. +# Copyright (c) 2019-2020 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. @@ -15,42 +15,87 @@ # ============LICENSE_END========================================================= # """ -startdard pytest file that contains the shared fixtures +standard pytest file that contains the shared fixtures https://docs.pytest.org/en/latest/fixture.html """ -import pytest +import time +import pytest from policyhandler import pdp_client -from policyhandler.pdp_api.pdp_consts import PDP_POLICY_ID, PDP_REQ_RESOURCE +from policyhandler.deploy_handler import DeployHandler +from policyhandler.onap.audit import Audit +from policyhandler.pdp_api.dmaap_mr import DmaapMr from policyhandler.utils import Utils from ..mock_tracker import MockHttpResponse -from .mock_policy_engine import MockPolicyEngine _LOGGER = Utils.get_logger(__file__) -@pytest.fixture(scope="session", autouse=True) -def _auto_setup_policy_engine(): - """initialize the mock-policy-engine per the whole test session""" - _LOGGER.info("create _auto_setup_policy_engine") - MockPolicyEngine.init() - yield _auto_setup_policy_engine - _LOGGER.info("teardown _auto_setup_policy_engine") - @pytest.fixture() def fix_pdp_post(monkeypatch): """monkeyed request /decision/v1 to PDP""" def monkeyed_policy_rest_post(uri, json=None, **kwargs): """monkeypatch for the POST to policy-engine""" - policy_ids = json.get(PDP_REQ_RESOURCE, {}).get(PDP_POLICY_ID) - policy_id = policy_ids and policy_ids[0] - res_json = MockPolicyEngine.get_policy(policy_id) - return MockHttpResponse("post", uri, res_json, json=json, **kwargs) + return MockHttpResponse("post", uri, json=json, **kwargs) _LOGGER.info("setup fix_pdp_post") + pdp_client.PolicyRest._lazy_inited = False pdp_client.PolicyRest._lazy_init() monkeypatch.setattr('policyhandler.pdp_client.PolicyRest._requests_session.post', monkeyed_policy_rest_post) yield fix_pdp_post _LOGGER.info("teardown fix_pdp_post") + +@pytest.fixture() +def fix_deploy_handler(monkeypatch): + """monkeyed requests to deployment-handler""" + def monkeyed_deploy_handler_put(uri, **kwargs): + """monkeypatch for policy-update request.put to deploy_handler""" + return MockHttpResponse("put", uri, **kwargs) + + def monkeyed_deploy_handler_get(uri, **kwargs): + """monkeypatch policy-update request.get to deploy_handler""" + return MockHttpResponse("get", uri, **kwargs) + + _LOGGER.info("setup fix_deploy_handler") + audit = None + if DeployHandler._lazy_inited is False: + audit = Audit(req_message="fix_deploy_handler") + DeployHandler._lazy_init(audit) + + monkeypatch.setattr('policyhandler.deploy_handler.DeployHandler._requests_session.put', + monkeyed_deploy_handler_put) + monkeypatch.setattr('policyhandler.deploy_handler.DeployHandler._requests_session.get', + monkeyed_deploy_handler_get) + + yield fix_deploy_handler + if audit: + audit.audit_done("teardown") + _LOGGER.info("teardown fix_deploy_handler") + +@pytest.fixture() +def fix_dmaap_mr(monkeypatch): + """monkeyed requests to dmaap_mr""" + def monkeyed_dmaap_mr_get(uri, **kwargs): + """monkeypatch policy-update request.get to dmaap_mr""" + if kwargs.get("params"): + _LOGGER.info("--- fix_dmaap_mr --- sleeping 3 secs...") + time.sleep(3) + else: + _LOGGER.info("--- fix_dmaap_mr --- sleeping 0.5 secs...") + time.sleep(0.5) + _LOGGER.info("--- fix_dmaap_mr --- send back the response") + return MockHttpResponse("get", uri, **kwargs) + + _LOGGER.info("setup fix_dmaap_mr") + audit = Audit(req_message="fix_dmaap_mr") + DmaapMr._lazy_inited = False + DmaapMr._lazy_init(audit) + + monkeypatch.setattr('policyhandler.pdp_api.dmaap_mr.DmaapMr._requests_session.get', + monkeyed_dmaap_mr_get) + + yield fix_dmaap_mr + audit.audit_done("teardown") + _LOGGER.info("teardown fix_dmaap_mr") diff --git a/tests/main/expectations.json b/tests/main/expectations.json new file mode 100644 index 0000000..4f93930 --- /dev/null +++ b/tests/main/expectations.json @@ -0,0 +1,2839 @@ +{ + "tests/main/test_policyhandler.py::WebServerTest::test_web_all_policies_latest": [ + { + "request": { + "headers": { + "X-ONAP-RequestID": "*", + "X-ECOMP-RequestID": "*" + }, + "json": null, + "method": "get", + "params": { + "cfy_tenant_name": "default_tenant" + }, + "uri": "http://unit-test-deployment_handler:8188000/policy" + }, + "res": { + "policies": { + "test_scope_prefix.pdp_decision_Lorem": { + "pending_update": false, + "policy_id": "test_scope_prefix.pdp_decision_Lorem", + "policy_versions": { + "0": true + } + }, + "test_scope_prefix.pdp_decision_amet": { + "pending_update": false, + "policy_id": "test_scope_prefix.pdp_decision_amet", + "policy_versions": { + "5.5.5": true + } + }, + "test_scope_prefix.pdp_decision_ametist": { + "pending_update": false, + "policy_id": "test_scope_prefix.pdp_decision_ametist", + "policy_versions": { + "6": true + } + }, + "test_scope_prefix.pdp_decision_consectetur": { + "pending_update": false, + "policy_id": "test_scope_prefix.pdp_decision_consectetur", + "policy_versions": { + "5": true + } + }, + "test_scope_prefix.pdp_decision_dolor": { + "pending_update": false, + "policy_id": "test_scope_prefix.pdp_decision_dolor", + "policy_versions": { + "2": true + } + }, + "test_scope_prefix.pdp_decision_ipsum": { + "pending_update": false, + "policy_id": "test_scope_prefix.pdp_decision_ipsum", + "policy_versions": { + "1": true + } + }, + "test_scope_prefix.pdp_decision_sit": { + "pending_update": false, + "policy_id": "test_scope_prefix.pdp_decision_sit", + "policy_versions": { + "3": true + } + } + }, + "server_instance_uuid": "e17fc584-7b06-4777-81c5-5da4337d6d16" + }, + "status_code": 200 + }, + { + "request": { + "headers": { + "Accept": "application/json", + "Authorization": "Basic auth", + "ClientAuth": "Basic user", + "Content-Type": "application/json", + "Environment": "TEST", + "X-ONAP-RequestID": "*", + "X-ECOMP-RequestID": "*" + }, + "json": { + "ONAPComponent": "policy_handler", + "ONAPInstance": "*", + "ONAPName": "DCAE", + "action": "configure", + "resource": { + "policy-id": [ + "test_scope_prefix.pdp_decision_Lorem", + "test_scope_prefix.pdp_decision_amet", + "test_scope_prefix.pdp_decision_ametist", + "test_scope_prefix.pdp_decision_consectetur", + "test_scope_prefix.pdp_decision_dolor", + "test_scope_prefix.pdp_decision_ipsum", + "test_scope_prefix.pdp_decision_sit" + ] + } + }, + "method": "post", + "params": null, + "uri": "https://unit-test-pdp-server:8081000/decision/v1/" + }, + "res": { + "policies": { + "test_scope_prefix.pdp_decision_Lorem": { + "metadata": { + "description": "description for test_scope_prefix.pdp_decision_Lorem", + "policy-id": "test_scope_prefix.pdp_decision_Lorem", + "policy-version": "1.1.1" + }, + "properties": { + "policy_hello": "world!", + "policy_updated_from_ver": 0, + "policy_updated_to_ver": 1, + "updated_policy_id": "test_scope_prefix.pdp_decision_Lorem" + }, + "type": "unit.test.type.policies", + "version": "1.0.0" + }, + "test_scope_prefix.pdp_decision_amet": { + "metadata": { + "description": "description for test_scope_prefix.pdp_decision_amet", + "policy-id": "test_scope_prefix.pdp_decision_amet", + "policy-version": "5.5.5" + }, + "properties": { + "policy_hello": "world!", + "policy_updated_from_ver": 4, + "policy_updated_to_ver": 5, + "updated_policy_id": "test_scope_prefix.pdp_decision_amet" + }, + "type": "unit.test.type.policies", + "version": "1.0.0" + }, + "test_scope_prefix.pdp_decision_ametist": { + "metadata": { + "description": "description for test_scope_prefix.pdp_decision_ametist", + "policy-id": "test_scope_prefix.pdp_decision_ametist", + "policy-version": "7.7.7" + }, + "properties": { + "policy_hello": "world!", + "policy_updated_from_ver": 6, + "policy_updated_to_ver": 7, + "updated_policy_id": "test_scope_prefix.pdp_decision_ametist" + }, + "type": "unit.test.type.policies", + "version": "1.0.0" + }, + "test_scope_prefix.pdp_decision_consectetur": { + "metadata": { + "description": "description for test_scope_prefix.pdp_decision_consectetur", + "policy-id": "test_scope_prefix.pdp_decision_consectetur", + "policy-version": "6.6.6" + }, + "properties": { + "policy_hello": "world!", + "policy_updated_from_ver": 5, + "policy_updated_to_ver": 6, + "updated_policy_id": "test_scope_prefix.pdp_decision_consectetur" + }, + "type": "unit.test.type.policies", + "version": "1.0.0" + }, + "test_scope_prefix.pdp_decision_dolor": { + "metadata": { + "description": "description for test_scope_prefix.pdp_decision_dolor", + "policy-id": "test_scope_prefix.pdp_decision_dolor", + "policy-version": "3.3.3" + }, + "properties": { + "policy_hello": "world!", + "policy_updated_from_ver": 2, + "policy_updated_to_ver": 3, + "updated_policy_id": "test_scope_prefix.pdp_decision_dolor" + }, + "type": "unit.test.type.policies", + "version": "1.0.0" + }, + "test_scope_prefix.pdp_decision_ipsum": { + "metadata": { + "description": "description for test_scope_prefix.pdp_decision_ipsum", + "policy-id": "test_scope_prefix.pdp_decision_ipsum", + "policy-version": "2.2.2" + }, + "properties": { + "policy_hello": "world!", + "policy_updated_from_ver": 1, + "policy_updated_to_ver": 2, + "updated_policy_id": "test_scope_prefix.pdp_decision_ipsum" + }, + "type": "unit.test.type.policies", + "version": "1.0.0" + }, + "test_scope_prefix.pdp_decision_sit": { + "metadata": { + "description": "description for test_scope_prefix.pdp_decision_sit", + "policy-id": "test_scope_prefix.pdp_decision_sit", + "policy-version": "4.4.4" + }, + "properties": { + "policy_hello": "world!", + "policy_updated_from_ver": 3, + "policy_updated_to_ver": 4, + "updated_policy_id": "test_scope_prefix.pdp_decision_sit" + }, + "type": "unit.test.type.policies", + "version": "1.0.0" + } + } + }, + "status_code": 200 + } + ], + "tests/main/test_policyhandler.py::WebServerTest::test_web_policies_latest": [ + { + "request": { + "headers": { + "Accept": "application/json", + "Authorization": "Basic auth", + "ClientAuth": "Basic user", + "Content-Type": "application/json", + "Environment": "TEST", + "X-ONAP-RequestID": "*", + "X-ECOMP-RequestID": "*" + }, + "json": { + "policyName": "test_scope_prefix.Config_amet.*" + }, + "method": "post", + "params": null, + "uri": "https://unit-test-pdp-server:8081000/decision/v1/" + }, + "res": "*", + "status_code": 200 + } + ], + "tests/main/test_policyhandler.py::WebServerTest::test_web_policy_latest": [ + { + "request": { + "headers": { + "Accept": "application/json", + "Authorization": "Basic auth", + "ClientAuth": "Basic user", + "Content-Type": "application/json", + "Environment": "TEST", + "X-ONAP-RequestID": "*", + "X-ECOMP-RequestID": "*" + }, + "json": { + "ONAPComponent": "policy_handler", + "ONAPInstance": "*", + "ONAPName": "DCAE", + "action": "configure", + "resource": { + "policy-id": [ + "test_scope_prefix.pdp_decision_sit" + ] + } + }, + "method": "post", + "params": null, + "uri": "https://unit-test-pdp-server:8081000/decision/v1/" + }, + "res": { + "policies": { + "test_scope_prefix.pdp_decision_sit": { + "metadata": { + "description": "description for test_scope_prefix.pdp_decision_sit", + "policy-id": "test_scope_prefix.pdp_decision_sit", + "policy-version": "4.4.4" + }, + "properties": { + "policy_hello": "world!", + "policy_updated_from_ver": 3, + "policy_updated_to_ver": 4, + "updated_policy_id": "test_scope_prefix.pdp_decision_sit" + }, + "type": "unit.test.type.policies", + "version": "1.0.0" + } + } + }, + "status_code": 200 + } + ], + "tests/main/test_policyhandler.py::WebServerTest::test_zzzzz_shutdown": [ + { + "request": { + "headers": { + "Authorization": "Basic auth", + "Content-Type": "application/json", + "X-ONAP-RequestID": "*", + "X-ECOMP-RequestID": "*" + }, + "json": null, + "method": "get", + "params": null, + "uri": "https://unit-test-dmaap-mr:280800000/events/unit-test-topicname/unit-test-consumegroup/unit-test-consumerid" + }, + "res": ["garbage-to-be-ignored"], + "status_code": 200 + }, + { + "request": { + "headers": { + "X-ONAP-RequestID": "*", + "X-ECOMP-RequestID": "*" + }, + "json": null, + "method": "get", + "params": { + "cfy_tenant_name": "default_tenant" + }, + "uri": "http://unit-test-deployment_handler:8188000/policy" + }, + "res": { + "policies": { + "test_scope_prefix.pdp_decision_Lorem": { + "pending_update": false, + "policy_id": "test_scope_prefix.pdp_decision_Lorem", + "policy_versions": { + "0": true + } + }, + "test_scope_prefix.pdp_decision_amet": { + "pending_update": false, + "policy_id": "test_scope_prefix.pdp_decision_amet", + "policy_versions": { + "5.5.5": true + } + }, + "test_scope_prefix.pdp_decision_ametist": { + "pending_update": false, + "policy_id": "test_scope_prefix.pdp_decision_ametist", + "policy_versions": { + "6": true + } + }, + "test_scope_prefix.pdp_decision_consectetur": { + "pending_update": false, + "policy_id": "test_scope_prefix.pdp_decision_consectetur", + "policy_versions": { + "5": true + } + }, + "test_scope_prefix.pdp_decision_dolor": { + "pending_update": false, + "policy_id": "test_scope_prefix.pdp_decision_dolor", + "policy_versions": { + "2": true + } + }, + "test_scope_prefix.pdp_decision_ipsum": { + "pending_update": false, + "policy_id": "test_scope_prefix.pdp_decision_ipsum", + "policy_versions": { + "1": true + } + }, + "test_scope_prefix.pdp_decision_sit": { + "pending_update": false, + "policy_id": "test_scope_prefix.pdp_decision_sit", + "policy_versions": { + "3": true + } + } + }, + "server_instance_uuid": "e17fc584-7b06-4777-81c5-5da4337d6d16" + }, + "status_code": 200 + }, + { + "request": { + "headers": { + "Accept": "application/json", + "Authorization": "Basic auth", + "ClientAuth": "Basic user", + "Content-Type": "application/json", + "Environment": "TEST", + "X-ECOMP-RequestID": "*", + "X-ONAP-RequestID": "*" + }, + "json": { + "ONAPComponent": "policy_handler", + "ONAPInstance": "*", + "ONAPName": "DCAE", + "action": "configure", + "resource": { + "policy-id": [ + "test_scope_prefix.pdp_decision_Lorem", + "test_scope_prefix.pdp_decision_amet", + "test_scope_prefix.pdp_decision_ametist", + "test_scope_prefix.pdp_decision_consectetur", + "test_scope_prefix.pdp_decision_dolor", + "test_scope_prefix.pdp_decision_ipsum", + "test_scope_prefix.pdp_decision_sit" + ] + } + }, + "method": "post", + "params": null, + "uri": "https://unit-test-pdp-server:8081000/decision/v1/" + }, + "res": { + "policies": { + "test_scope_prefix.pdp_decision_Lorem": { + "metadata": { + "description": "description for test_scope_prefix.pdp_decision_Lorem", + "policy-id": "test_scope_prefix.pdp_decision_Lorem", + "policy-version": "1.1.1" + }, + "properties": { + "policy_hello": "world!", + "policy_updated_from_ver": 0, + "policy_updated_to_ver": 1, + "updated_policy_id": "test_scope_prefix.pdp_decision_Lorem" + }, + "type": "unit.test.type.policies", + "version": "1.0.0" + }, + "test_scope_prefix.pdp_decision_amet": { + "metadata": { + "description": "description for test_scope_prefix.pdp_decision_amet", + "policy-id": "test_scope_prefix.pdp_decision_amet", + "policy-version": "5.5.5" + }, + "properties": { + "policy_hello": "world!", + "policy_updated_from_ver": 4, + "policy_updated_to_ver": 5, + "updated_policy_id": "test_scope_prefix.pdp_decision_amet" + }, + "type": "unit.test.type.policies", + "version": "1.0.0" + }, + "test_scope_prefix.pdp_decision_ametist": { + "metadata": { + "description": "description for test_scope_prefix.pdp_decision_ametist", + "policy-id": "test_scope_prefix.pdp_decision_ametist", + "policy-version": "7.7.7" + }, + "properties": { + "policy_hello": "world!", + "policy_updated_from_ver": 6, + "policy_updated_to_ver": 7, + "updated_policy_id": "test_scope_prefix.pdp_decision_ametist" + }, + "type": "unit.test.type.policies", + "version": "1.0.0" + }, + "test_scope_prefix.pdp_decision_consectetur": { + "metadata": { + "description": "description for test_scope_prefix.pdp_decision_consectetur", + "policy-id": "test_scope_prefix.pdp_decision_consectetur", + "policy-version": "6.6.6" + }, + "properties": { + "policy_hello": "world!", + "policy_updated_from_ver": 5, + "policy_updated_to_ver": 6, + "updated_policy_id": "test_scope_prefix.pdp_decision_consectetur" + }, + "type": "unit.test.type.policies", + "version": "1.0.0" + }, + "test_scope_prefix.pdp_decision_dolor": { + "metadata": { + "description": "description for test_scope_prefix.pdp_decision_dolor", + "policy-id": "test_scope_prefix.pdp_decision_dolor", + "policy-version": "3.3.3" + }, + "properties": { + "policy_hello": "world!", + "policy_updated_from_ver": 2, + "policy_updated_to_ver": 3, + "updated_policy_id": "test_scope_prefix.pdp_decision_dolor" + }, + "type": "unit.test.type.policies", + "version": "1.0.0" + }, + "test_scope_prefix.pdp_decision_ipsum": { + "metadata": { + "description": "description for test_scope_prefix.pdp_decision_ipsum", + "policy-id": "test_scope_prefix.pdp_decision_ipsum", + "policy-version": "2.2.2" + }, + "properties": { + "policy_hello": "world!", + "policy_updated_from_ver": 1, + "policy_updated_to_ver": 2, + "updated_policy_id": "test_scope_prefix.pdp_decision_ipsum" + }, + "type": "unit.test.type.policies", + "version": "1.0.0" + }, + "test_scope_prefix.pdp_decision_sit": { + "metadata": { + "description": "description for test_scope_prefix.pdp_decision_sit", + "policy-id": "test_scope_prefix.pdp_decision_sit", + "policy-version": "4.4.4" + }, + "properties": { + "policy_hello": "world!", + "policy_updated_from_ver": 3, + "policy_updated_to_ver": 4, + "updated_policy_id": "test_scope_prefix.pdp_decision_sit" + }, + "type": "unit.test.type.policies", + "version": "1.0.0" + } + } + }, + "status_code": 200 + }, + { + "request": { + "headers": { + "X-ECOMP-RequestID": "*", + "X-ONAP-RequestID": "*" + }, + "json": { + "catch_up": true, + "latest_policies": { + "test_scope_prefix.pdp_decision_Lorem": { + "policy_body": { + "config": { + "policy_hello": "world!", + "policy_updated_from_ver": 0, + "policy_updated_to_ver": 1, + "updated_policy_id": "test_scope_prefix.pdp_decision_Lorem" + }, + "metadata": { + "description": "description for test_scope_prefix.pdp_decision_Lorem", + "policy-id": "test_scope_prefix.pdp_decision_Lorem", + "policy-version": "1.1.1" + }, + "policyName": "test_scope_prefix.pdp_decision_Lorem.1-1-1.xml", + "policyVersion": "1.1.1", + "type": "unit.test.type.policies", + "version": "1.0.0" + }, + "policy_id": "test_scope_prefix.pdp_decision_Lorem" + }, + "test_scope_prefix.pdp_decision_ametist": { + "policy_body": { + "config": { + "policy_hello": "world!", + "policy_updated_from_ver": 6, + "policy_updated_to_ver": 7, + "updated_policy_id": "test_scope_prefix.pdp_decision_ametist" + }, + "metadata": { + "description": "description for test_scope_prefix.pdp_decision_ametist", + "policy-id": "test_scope_prefix.pdp_decision_ametist", + "policy-version": "7.7.7" + }, + "policyName": "test_scope_prefix.pdp_decision_ametist.7-7-7.xml", + "policyVersion": "7.7.7", + "type": "unit.test.type.policies", + "version": "1.0.0" + }, + "policy_id": "test_scope_prefix.pdp_decision_ametist" + }, + "test_scope_prefix.pdp_decision_consectetur": { + "policy_body": { + "config": { + "policy_hello": "world!", + "policy_updated_from_ver": 5, + "policy_updated_to_ver": 6, + "updated_policy_id": "test_scope_prefix.pdp_decision_consectetur" + }, + "metadata": { + "description": "description for test_scope_prefix.pdp_decision_consectetur", + "policy-id": "test_scope_prefix.pdp_decision_consectetur", + "policy-version": "6.6.6" + }, + "policyName": "test_scope_prefix.pdp_decision_consectetur.6-6-6.xml", + "policyVersion": "6.6.6", + "type": "unit.test.type.policies", + "version": "1.0.0" + }, + "policy_id": "test_scope_prefix.pdp_decision_consectetur" + }, + "test_scope_prefix.pdp_decision_dolor": { + "policy_body": { + "config": { + "policy_hello": "world!", + "policy_updated_from_ver": 2, + "policy_updated_to_ver": 3, + "updated_policy_id": "test_scope_prefix.pdp_decision_dolor" + }, + "metadata": { + "description": "description for test_scope_prefix.pdp_decision_dolor", + "policy-id": "test_scope_prefix.pdp_decision_dolor", + "policy-version": "3.3.3" + }, + "policyName": "test_scope_prefix.pdp_decision_dolor.3-3-3.xml", + "policyVersion": "3.3.3", + "type": "unit.test.type.policies", + "version": "1.0.0" + }, + "policy_id": "test_scope_prefix.pdp_decision_dolor" + }, + "test_scope_prefix.pdp_decision_ipsum": { + "policy_body": { + "config": { + "policy_hello": "world!", + "policy_updated_from_ver": 1, + "policy_updated_to_ver": 2, + "updated_policy_id": "test_scope_prefix.pdp_decision_ipsum" + }, + "metadata": { + "description": "description for test_scope_prefix.pdp_decision_ipsum", + "policy-id": "test_scope_prefix.pdp_decision_ipsum", + "policy-version": "2.2.2" + }, + "policyName": "test_scope_prefix.pdp_decision_ipsum.2-2-2.xml", + "policyVersion": "2.2.2", + "type": "unit.test.type.policies", + "version": "1.0.0" + }, + "policy_id": "test_scope_prefix.pdp_decision_ipsum" + }, + "test_scope_prefix.pdp_decision_sit": { + "policy_body": { + "config": { + "policy_hello": "world!", + "policy_updated_from_ver": 3, + "policy_updated_to_ver": 4, + "updated_policy_id": "test_scope_prefix.pdp_decision_sit" + }, + "metadata": { + "description": "description for test_scope_prefix.pdp_decision_sit", + "policy-id": "test_scope_prefix.pdp_decision_sit", + "policy-version": "4.4.4" + }, + "policyName": "test_scope_prefix.pdp_decision_sit.4-4-4.xml", + "policyVersion": "4.4.4", + "type": "unit.test.type.policies", + "version": "1.0.0" + }, + "policy_id": "test_scope_prefix.pdp_decision_sit" + } + }, + "policy_filter_matches": {}, + "removed_policies": {} + }, + "method": "put", + "params": { + "cfy_tenant_name": "default_tenant" + }, + "uri": "http://unit-test-deployment_handler:8188000/policy" + }, + "res": { + "server_instance_uuid": "e17fc584-7b06-4777-81c5-5da4337d6d16" + }, + "status_code": 200 + }, + { + "request": { + "headers": { + "Authorization": "Basic auth", + "Content-Type": "application/json", + "X-ONAP-RequestID": "*", + "X-ECOMP-RequestID": "*" + }, + "json": null, + "method": "get", + "params": { + "timeout": 15000 + }, + "uri": "https://unit-test-dmaap-mr:280800000/events/unit-test-topicname/unit-test-consumegroup/unit-test-consumerid" + }, + "res": [], + "status_code": 200 + } + ], + "tests/main/test_policyhandler.py::WebServerTest::test_zzz_policy_updates_and_catch_ups": [ + { + "request": { + "headers": { + "Authorization": "Basic auth", + "Content-Type": "application/json", + "X-ONAP-RequestID": "*", + "X-ECOMP-RequestID": "*" + }, + "json": null, + "method": "get", + "params": null, + "uri": "https://unit-test-dmaap-mr:280800000/events/unit-test-topicname/unit-test-consumegroup/unit-test-consumerid" + }, + "res": ["garbage-to-be-ignored"], + "status_code": 200 + }, + { + "request": { + "headers": { + "X-ONAP-RequestID": "*", + "X-ECOMP-RequestID": "*" + }, + "json": null, + "method": "get", + "params": { + "cfy_tenant_name": "default_tenant" + }, + "uri": "http://unit-test-deployment_handler:8188000/policy" + }, + "res": { + "policies": { + "test_scope_prefix.pdp_decision_Lorem": { + "pending_update": false, + "policy_id": "test_scope_prefix.pdp_decision_Lorem", + "policy_versions": { + "0": true + } + }, + "test_scope_prefix.pdp_decision_amet": { + "pending_update": false, + "policy_id": "test_scope_prefix.pdp_decision_amet", + "policy_versions": { + "5.5.5": true + } + }, + "test_scope_prefix.pdp_decision_ametist": { + "pending_update": false, + "policy_id": "test_scope_prefix.pdp_decision_ametist", + "policy_versions": { + "6": true + } + }, + "test_scope_prefix.pdp_decision_consectetur": { + "pending_update": false, + "policy_id": "test_scope_prefix.pdp_decision_consectetur", + "policy_versions": { + "5": true + } + }, + "test_scope_prefix.pdp_decision_dolor": { + "pending_update": false, + "policy_id": "test_scope_prefix.pdp_decision_dolor", + "policy_versions": { + "2": true + } + }, + "test_scope_prefix.pdp_decision_ipsum": { + "pending_update": false, + "policy_id": "test_scope_prefix.pdp_decision_ipsum", + "policy_versions": { + "1": true + } + }, + "test_scope_prefix.pdp_decision_sit": { + "pending_update": false, + "policy_id": "test_scope_prefix.pdp_decision_sit", + "policy_versions": { + "3": true + } + } + }, + "server_instance_uuid": "e17fc584-7b06-4777-81c5-5da4337d6d16" + }, + "status_code": 200 + }, + { + "request": { + "headers": { + "Accept": "application/json", + "Authorization": "Basic auth", + "ClientAuth": "Basic user", + "Content-Type": "application/json", + "Environment": "TEST", + "X-ECOMP-RequestID": "*", + "X-ONAP-RequestID": "*" + }, + "json": { + "ONAPComponent": "policy_handler", + "ONAPInstance": "*", + "ONAPName": "DCAE", + "action": "configure", + "resource": { + "policy-id": [ + "test_scope_prefix.pdp_decision_Lorem", + "test_scope_prefix.pdp_decision_amet", + "test_scope_prefix.pdp_decision_ametist", + "test_scope_prefix.pdp_decision_consectetur", + "test_scope_prefix.pdp_decision_dolor", + "test_scope_prefix.pdp_decision_ipsum", + "test_scope_prefix.pdp_decision_sit" + ] + } + }, + "method": "post", + "params": null, + "uri": "https://unit-test-pdp-server:8081000/decision/v1/" + }, + "res": { + "policies": { + "test_scope_prefix.pdp_decision_Lorem": { + "metadata": { + "description": "description for test_scope_prefix.pdp_decision_Lorem", + "policy-id": "test_scope_prefix.pdp_decision_Lorem", + "policy-version": "1.1.1" + }, + "properties": { + "policy_hello": "world!", + "policy_updated_from_ver": 0, + "policy_updated_to_ver": 1, + "updated_policy_id": "test_scope_prefix.pdp_decision_Lorem" + }, + "type": "unit.test.type.policies", + "version": "1.0.0" + }, + "test_scope_prefix.pdp_decision_amet": { + "metadata": { + "description": "description for test_scope_prefix.pdp_decision_amet", + "policy-id": "test_scope_prefix.pdp_decision_amet", + "policy-version": "5.5.5" + }, + "properties": { + "policy_hello": "world!", + "policy_updated_from_ver": 4, + "policy_updated_to_ver": 5, + "updated_policy_id": "test_scope_prefix.pdp_decision_amet" + }, + "type": "unit.test.type.policies", + "version": "1.0.0" + }, + "test_scope_prefix.pdp_decision_ametist": { + "metadata": { + "description": "description for test_scope_prefix.pdp_decision_ametist", + "policy-id": "test_scope_prefix.pdp_decision_ametist", + "policy-version": "7.7.7" + }, + "properties": { + "policy_hello": "world!", + "policy_updated_from_ver": 6, + "policy_updated_to_ver": 7, + "updated_policy_id": "test_scope_prefix.pdp_decision_ametist" + }, + "type": "unit.test.type.policies", + "version": "1.0.0" + }, + "test_scope_prefix.pdp_decision_consectetur": { + "metadata": { + "description": "description for test_scope_prefix.pdp_decision_consectetur", + "policy-id": "test_scope_prefix.pdp_decision_consectetur", + "policy-version": "6.6.6" + }, + "properties": { + "policy_hello": "world!", + "policy_updated_from_ver": 5, + "policy_updated_to_ver": 6, + "updated_policy_id": "test_scope_prefix.pdp_decision_consectetur" + }, + "type": "unit.test.type.policies", + "version": "1.0.0" + }, + "test_scope_prefix.pdp_decision_dolor": { + "metadata": { + "description": "description for test_scope_prefix.pdp_decision_dolor", + "policy-id": "test_scope_prefix.pdp_decision_dolor", + "policy-version": "3.3.3" + }, + "properties": { + "policy_hello": "world!", + "policy_updated_from_ver": 2, + "policy_updated_to_ver": 3, + "updated_policy_id": "test_scope_prefix.pdp_decision_dolor" + }, + "type": "unit.test.type.policies", + "version": "1.0.0" + }, + "test_scope_prefix.pdp_decision_ipsum": { + "metadata": { + "description": "description for test_scope_prefix.pdp_decision_ipsum", + "policy-id": "test_scope_prefix.pdp_decision_ipsum", + "policy-version": "2.2.2" + }, + "properties": { + "policy_hello": "world!", + "policy_updated_from_ver": 1, + "policy_updated_to_ver": 2, + "updated_policy_id": "test_scope_prefix.pdp_decision_ipsum" + }, + "type": "unit.test.type.policies", + "version": "1.0.0" + }, + "test_scope_prefix.pdp_decision_sit": { + "metadata": { + "description": "description for test_scope_prefix.pdp_decision_sit", + "policy-id": "test_scope_prefix.pdp_decision_sit", + "policy-version": "4.4.4" + }, + "properties": { + "policy_hello": "world!", + "policy_updated_from_ver": 3, + "policy_updated_to_ver": 4, + "updated_policy_id": "test_scope_prefix.pdp_decision_sit" + }, + "type": "unit.test.type.policies", + "version": "1.0.0" + } + } + }, + "status_code": 200 + }, + { + "request": { + "headers": { + "X-ECOMP-RequestID": "*", + "X-ONAP-RequestID": "*" + }, + "json": { + "catch_up": true, + "latest_policies": { + "test_scope_prefix.pdp_decision_Lorem": { + "policy_body": { + "config": { + "policy_hello": "world!", + "policy_updated_from_ver": 0, + "policy_updated_to_ver": 1, + "updated_policy_id": "test_scope_prefix.pdp_decision_Lorem" + }, + "metadata": { + "description": "description for test_scope_prefix.pdp_decision_Lorem", + "policy-id": "test_scope_prefix.pdp_decision_Lorem", + "policy-version": "1.1.1" + }, + "policyName": "test_scope_prefix.pdp_decision_Lorem.1-1-1.xml", + "policyVersion": "1.1.1", + "type": "unit.test.type.policies", + "version": "1.0.0" + }, + "policy_id": "test_scope_prefix.pdp_decision_Lorem" + }, + "test_scope_prefix.pdp_decision_ametist": { + "policy_body": { + "config": { + "policy_hello": "world!", + "policy_updated_from_ver": 6, + "policy_updated_to_ver": 7, + "updated_policy_id": "test_scope_prefix.pdp_decision_ametist" + }, + "metadata": { + "description": "description for test_scope_prefix.pdp_decision_ametist", + "policy-id": "test_scope_prefix.pdp_decision_ametist", + "policy-version": "7.7.7" + }, + "policyName": "test_scope_prefix.pdp_decision_ametist.7-7-7.xml", + "policyVersion": "7.7.7", + "type": "unit.test.type.policies", + "version": "1.0.0" + }, + "policy_id": "test_scope_prefix.pdp_decision_ametist" + }, + "test_scope_prefix.pdp_decision_consectetur": { + "policy_body": { + "config": { + "policy_hello": "world!", + "policy_updated_from_ver": 5, + "policy_updated_to_ver": 6, + "updated_policy_id": "test_scope_prefix.pdp_decision_consectetur" + }, + "metadata": { + "description": "description for test_scope_prefix.pdp_decision_consectetur", + "policy-id": "test_scope_prefix.pdp_decision_consectetur", + "policy-version": "6.6.6" + }, + "policyName": "test_scope_prefix.pdp_decision_consectetur.6-6-6.xml", + "policyVersion": "6.6.6", + "type": "unit.test.type.policies", + "version": "1.0.0" + }, + "policy_id": "test_scope_prefix.pdp_decision_consectetur" + }, + "test_scope_prefix.pdp_decision_dolor": { + "policy_body": { + "config": { + "policy_hello": "world!", + "policy_updated_from_ver": 2, + "policy_updated_to_ver": 3, + "updated_policy_id": "test_scope_prefix.pdp_decision_dolor" + }, + "metadata": { + "description": "description for test_scope_prefix.pdp_decision_dolor", + "policy-id": "test_scope_prefix.pdp_decision_dolor", + "policy-version": "3.3.3" + }, + "policyName": "test_scope_prefix.pdp_decision_dolor.3-3-3.xml", + "policyVersion": "3.3.3", + "type": "unit.test.type.policies", + "version": "1.0.0" + }, + "policy_id": "test_scope_prefix.pdp_decision_dolor" + }, + "test_scope_prefix.pdp_decision_ipsum": { + "policy_body": { + "config": { + "policy_hello": "world!", + "policy_updated_from_ver": 1, + "policy_updated_to_ver": 2, + "updated_policy_id": "test_scope_prefix.pdp_decision_ipsum" + }, + "metadata": { + "description": "description for test_scope_prefix.pdp_decision_ipsum", + "policy-id": "test_scope_prefix.pdp_decision_ipsum", + "policy-version": "2.2.2" + }, + "policyName": "test_scope_prefix.pdp_decision_ipsum.2-2-2.xml", + "policyVersion": "2.2.2", + "type": "unit.test.type.policies", + "version": "1.0.0" + }, + "policy_id": "test_scope_prefix.pdp_decision_ipsum" + }, + "test_scope_prefix.pdp_decision_sit": { + "policy_body": { + "config": { + "policy_hello": "world!", + "policy_updated_from_ver": 3, + "policy_updated_to_ver": 4, + "updated_policy_id": "test_scope_prefix.pdp_decision_sit" + }, + "metadata": { + "description": "description for test_scope_prefix.pdp_decision_sit", + "policy-id": "test_scope_prefix.pdp_decision_sit", + "policy-version": "4.4.4" + }, + "policyName": "test_scope_prefix.pdp_decision_sit.4-4-4.xml", + "policyVersion": "4.4.4", + "type": "unit.test.type.policies", + "version": "1.0.0" + }, + "policy_id": "test_scope_prefix.pdp_decision_sit" + } + }, + "policy_filter_matches": {}, + "removed_policies": {} + }, + "method": "put", + "params": { + "cfy_tenant_name": "default_tenant" + }, + "uri": "http://unit-test-deployment_handler:8188000/policy" + }, + "res": { + "server_instance_uuid": "e17fc584-7b06-4777-81c5-5da4337d6d16" + }, + "status_code": 200 + }, + { + "request": { + "headers": { + "Authorization": "Basic auth", + "Content-Type": "application/json", + "X-ONAP-RequestID": "*", + "X-ECOMP-RequestID": "*" + }, + "json": null, + "method": "get", + "params": { + "timeout": 15000 + }, + "uri": "https://unit-test-dmaap-mr:280800000/events/unit-test-topicname/unit-test-consumegroup/unit-test-consumerid" + }, + "res": [ + "{\"deployed-policies\":[{\"policy-type\":\"onap.policies.monitoring.cdap.tca.hi.lo.app\",\"policy-type-version\":\"1.0.0\",\"policy-id\":\"test_scope_prefix.pdp_decision_Lorem\",\"policy-version\":\"1.1.1-update1\",\"success-count\":3,\"failure-count\":0}],\"undeployed-policies\":[{\"policy-type\":\"onap.policies.monitoring.cdap.tca.hi.lo.app\",\"policy-type-version\":\"1.0.0\",\"policy-id\":\"test_scope_prefix.pdp_decision_Lorem\",\"policy-version\":\"1.1.1\",\"success-count\":3,\"failure-count\":0}]}" + ], + "status_code": 200 + }, + { + "request": { + "headers": { + "X-ONAP-RequestID": "*", + "X-ECOMP-RequestID": "*" + }, + "json": null, + "method": "get", + "params": { + "cfy_tenant_name": "default_tenant" + }, + "uri": "http://unit-test-deployment_handler:8188000/policy" + }, + "res": { + "policies": { + "test_scope_prefix.pdp_decision_Lorem": { + "pending_update": false, + "policy_id": "test_scope_prefix.pdp_decision_Lorem", + "policy_versions": { + "1.1.1": true + } + }, + "test_scope_prefix.pdp_decision_amet": { + "pending_update": false, + "policy_id": "test_scope_prefix.pdp_decision_amet", + "policy_versions": { + "5.5.5": true + } + }, + "test_scope_prefix.pdp_decision_ametist": { + "pending_update": false, + "policy_id": "test_scope_prefix.pdp_decision_ametist", + "policy_versions": { + "7.7.7": true + } + }, + "test_scope_prefix.pdp_decision_consectetur": { + "pending_update": false, + "policy_id": "test_scope_prefix.pdp_decision_consectetur", + "policy_versions": { + "6.6.6": true + } + }, + "test_scope_prefix.pdp_decision_dolor": { + "pending_update": false, + "policy_id": "test_scope_prefix.pdp_decision_dolor", + "policy_versions": { + "3.3.3": true + } + }, + "test_scope_prefix.pdp_decision_ipsum": { + "pending_update": false, + "policy_id": "test_scope_prefix.pdp_decision_ipsum", + "policy_versions": { + "2.2.2": true + } + }, + "test_scope_prefix.pdp_decision_sit": { + "pending_update": false, + "policy_id": "test_scope_prefix.pdp_decision_sit", + "policy_versions": { + "4.4.4": true + } + } + }, + "server_instance_uuid": "e17fc584-7b06-4777-81c5-5da4337d6d16" + }, + "status_code": 200 + }, + { + "request": { + "headers": { + "Accept": "application/json", + "Authorization": "Basic auth", + "ClientAuth": "Basic user", + "Content-Type": "application/json", + "Environment": "TEST", + "X-ECOMP-RequestID": "*", + "X-ONAP-RequestID": "*" + }, + "json": { + "ONAPComponent": "policy_handler", + "ONAPInstance": "*", + "ONAPName": "DCAE", + "action": "configure", + "resource": { + "policy-id": [ + "test_scope_prefix.pdp_decision_Lorem" + ] + } + }, + "method": "post", + "params": null, + "uri": "https://unit-test-pdp-server:8081000/decision/v1/" + }, + "res": { + "policies": { + "test_scope_prefix.pdp_decision_Lorem": { + "metadata": { + "description": "description for test_scope_prefix.pdp_decision_Lorem", + "policy-id": "test_scope_prefix.pdp_decision_Lorem", + "policy-version": "1.1.1" + }, + "properties": { + "policy_hello": "world!", + "policy_updated_from_ver": 0, + "policy_updated_to_ver": 1, + "updated_policy_id": "test_scope_prefix.pdp_decision_Lorem" + }, + "type": "unit.test.type.policies", + "version": "1.0.0" + } + } + }, + "status_code": 200 + }, + { + "request": { + "headers": { + "Authorization": "Basic auth", + "Content-Type": "application/json", + "X-ONAP-RequestID": "*", + "X-ECOMP-RequestID": "*" + }, + "json": null, + "method": "get", + "params": { + "timeout": 15000 + }, + "uri": "https://unit-test-dmaap-mr:280800000/events/unit-test-topicname/unit-test-consumegroup/unit-test-consumerid" + }, + "res": [], + "status_code": 200 + }, + { + "request": { + "headers": { + "Accept": "application/json", + "Authorization": "Basic auth", + "ClientAuth": "Basic user", + "Content-Type": "application/json", + "Environment": "TEST", + "X-ECOMP-RequestID": "*", + "X-ONAP-RequestID": "*" + }, + "json": { + "ONAPComponent": "policy_handler", + "ONAPInstance": "*", + "ONAPName": "DCAE", + "action": "configure", + "resource": { + "policy-id": [ + "test_scope_prefix.pdp_decision_Lorem" + ] + } + }, + "method": "post", + "params": null, + "uri": "https://unit-test-pdp-server:8081000/decision/v1/" + }, + "res": { + "policies": { + "test_scope_prefix.pdp_decision_Lorem": { + "metadata": { + "description": "description for test_scope_prefix.pdp_decision_Lorem", + "policy-id": "test_scope_prefix.pdp_decision_Lorem", + "policy-version": "1.1.1-update1" + }, + "properties": { + "policy_hello": "world! - updated 1", + "policy_updated_from_ver": "1.1.1", + "policy_updated_to_ver": "1.1.1-update1", + "updated_policy_id": "test_scope_prefix.pdp_decision_Lorem" + }, + "type": "unit.test.type.policies", + "version": "1.0.0" + } + } + }, + "status_code": 200 + }, + { + "request": { + "headers": { + "X-ECOMP-RequestID": "*", + "X-ONAP-RequestID": "*" + }, + "json": { + "catch_up": false, + "latest_policies": { + "test_scope_prefix.pdp_decision_Lorem": { + "policy_body": { + "config": { + "policy_hello": "world! - updated 1", + "policy_updated_from_ver": "1.1.1", + "policy_updated_to_ver": "1.1.1-update1", + "updated_policy_id": "test_scope_prefix.pdp_decision_Lorem" + }, + "metadata": { + "description": "description for test_scope_prefix.pdp_decision_Lorem", + "policy-id": "test_scope_prefix.pdp_decision_Lorem", + "policy-version": "1.1.1-update1" + }, + "policyName": "test_scope_prefix.pdp_decision_Lorem.1-1-1-update1.xml", + "policyVersion": "1.1.1-update1", + "type": "unit.test.type.policies", + "version": "1.0.0" + }, + "policy_id": "test_scope_prefix.pdp_decision_Lorem" + } + }, + "policy_filter_matches": {}, + "removed_policies": {} + }, + "method": "put", + "params": { + "cfy_tenant_name": "default_tenant" + }, + "uri": "http://unit-test-deployment_handler:8188000/policy" + }, + "res": { + "server_instance_uuid": "e17fc584-7b06-4777-81c5-5da4337d6d16" + }, + "status_code": 200 + }, + { + "request": { + "headers": { + "Authorization": "Basic auth", + "Content-Type": "application/json", + "X-ONAP-RequestID": "*", + "X-ECOMP-RequestID": "*" + }, + "json": null, + "method": "get", + "params": { + "timeout": 15000 + }, + "uri": "https://unit-test-dmaap-mr:280800000/events/unit-test-topicname/unit-test-consumegroup/unit-test-consumerid" + }, + "res": [ + "{\"deployed-policies\":[{\"policy-type\":\"onap.policies.testing\",\"policy-type-version\":\"99.0.0\",\"policy-id\":\"not-dcae.expect-be-ignored-55\",\"policy-version\":\"522.522.522\",\"success-count\":3,\"failure-count\":0}],\"undeployed-policies\":[{\"policy-type\":\"onap.policies.testing\",\"policy-type-version\":\"9.0.0\",\"policy-id\":\"test_scope_prefix.pdp_decision_ipsum\",\"policy-version\":\"2.2.2\",\"success-count\":3,\"failure-count\":0},{\"policy-type\":\"onap.policies.testing\",\"policy-type-version\":\"9.0.0\",\"policy-id\":\"not-dcae.expect-be-ignored\",\"policy-version\":\"22.22.22\",\"success-count\":3,\"failure-count\":0}]}", + "{\"deployed-policies\":[{\"policy-type\":\"onap.policies.testing\",\"policy-type-version\":\"99.9.9\",\"policy-id\":\"not-dcae.expect-be-ignored-55\",\"policy-version\":\"5522.5522.522\",\"success-count\":3,\"failure-count\":0}],\"undeployed-policies\":[{\"policy-type\":\"onap.policies.testing\",\"policy-type-version\":\"9.0.0\",\"policy-id\":\"not-dcae.expect-be-ignored\",\"policy-version\":\"22.22.22\",\"success-count\":3,\"failure-count\":0}]}" + ], + "status_code": 200 + }, + { + "request": { + "headers": { + "X-ONAP-RequestID": "*", + "X-ECOMP-RequestID": "*" + }, + "json": null, + "method": "get", + "params": { + "cfy_tenant_name": "default_tenant" + }, + "uri": "http://unit-test-deployment_handler:8188000/policy" + }, + "res": { + "policies": { + "test_scope_prefix.pdp_decision_Lorem": { + "pending_update": false, + "policy_id": "test_scope_prefix.pdp_decision_Lorem", + "policy_versions": { + "1.1.1-update1": true + } + }, + "test_scope_prefix.pdp_decision_amet": { + "pending_update": false, + "policy_id": "test_scope_prefix.pdp_decision_amet", + "policy_versions": { + "5.5.5": true + } + }, + "test_scope_prefix.pdp_decision_ametist": { + "pending_update": false, + "policy_id": "test_scope_prefix.pdp_decision_ametist", + "policy_versions": { + "7.7.7": true + } + }, + "test_scope_prefix.pdp_decision_consectetur": { + "pending_update": false, + "policy_id": "test_scope_prefix.pdp_decision_consectetur", + "policy_versions": { + "6.6.6": true + } + }, + "test_scope_prefix.pdp_decision_dolor": { + "pending_update": false, + "policy_id": "test_scope_prefix.pdp_decision_dolor", + "policy_versions": { + "3.3.3": true + } + }, + "test_scope_prefix.pdp_decision_ipsum": { + "pending_update": false, + "policy_id": "test_scope_prefix.pdp_decision_ipsum", + "policy_versions": { + "2.2.2": true + } + }, + "test_scope_prefix.pdp_decision_sit": { + "pending_update": false, + "policy_id": "test_scope_prefix.pdp_decision_sit", + "policy_versions": { + "4.4.4": true + } + } + }, + "server_instance_uuid": "e17fc584-7b06-4777-81c5-5da4337d6d16" + }, + "status_code": 200 + }, + { + "request": { + "headers": { + "Accept": "application/json", + "Authorization": "Basic auth", + "ClientAuth": "Basic user", + "Content-Type": "application/json", + "Environment": "TEST", + "X-ECOMP-RequestID": "*", + "X-ONAP-RequestID": "*" + }, + "json": { + "ONAPComponent": "policy_handler", + "ONAPInstance": "*", + "ONAPName": "DCAE", + "action": "configure", + "resource": { + "policy-id": [ + "test_scope_prefix.pdp_decision_ipsum" + ] + } + }, + "method": "post", + "params": null, + "uri": "https://unit-test-pdp-server:8081000/decision/v1/" + }, + "res": { + "policies": {} + }, + "status_code": 200 + }, + { + "request": { + "headers": { + "X-ECOMP-RequestID": "*", + "X-ONAP-RequestID": "*" + }, + "json": { + "catch_up": false, + "latest_policies": {}, + "policy_filter_matches": {}, + "removed_policies": { + "test_scope_prefix.pdp_decision_ipsum": true + } + }, + "method": "put", + "params": { + "cfy_tenant_name": "default_tenant" + }, + "uri": "http://unit-test-deployment_handler:8188000/policy" + }, + "res": { + "server_instance_uuid": "e17fc584-7b06-4777-81c5-5da4337d6d16" + }, + "status_code": 200 + }, + { + "request": { + "headers": { + "Authorization": "Basic auth", + "Content-Type": "application/json", + "X-ONAP-RequestID": "*", + "X-ECOMP-RequestID": "*" + }, + "json": null, + "method": "get", + "params": { + "timeout": 15000 + }, + "uri": "https://unit-test-dmaap-mr:280800000/events/unit-test-topicname/unit-test-consumegroup/unit-test-consumerid" + }, + "res": [ + "{\"deployed-policies\":[{\"policy-type\":\"onap.policies.monitoring.cdap.tca.hi.lo.app\",\"policy-type-version\":\"1.0.0\",\"policy-id\":\"test_scope_prefix.pdp_decision_Lorem\",\"policy-version\":\"1.1.1-update1\",\"success-count\":3,\"failure-count\":0}],\"undeployed-policies\":[{\"policy-type\":\"onap.policies.monitoring.cdap.tca.hi.lo.app\",\"policy-type-version\":\"1.0.0\",\"policy-id\":\"test_scope_prefix.pdp_decision_Lorem\",\"policy-version\":\"1.1.1\",\"success-count\":3,\"failure-count\":0}]}", + "{\"deployed-policies\":[{\"policy-type\":\"onap.policies.monitoring.cdap.tca.hi.lo.app\",\"policy-type-version\":\"1.0.0\",\"policy-id\":\"test_scope_prefix.pdp_decision_Lorem\",\"policy-version\":\"1.1.1-update2\",\"success-count\":3,\"failure-count\":0}],\"undeployed-policies\":[{\"policy-type\":\"onap.policies.monitoring.cdap.tca.hi.lo.app\",\"policy-type-version\":\"1.0.0\",\"policy-id\":\"test_scope_prefix.pdp_decision_Lorem\",\"policy-version\":\"1.1.1-update1\",\"success-count\":3,\"failure-count\":0}]}", + "{\"deployed-policies\":[{\"policy-type\":\"onap.policies.monitoring.cdap.tca.hi.lo.app\",\"policy-type-version\":\"1.0.0\",\"policy-id\":\"test_scope_prefix.pdp_decision_Lorem\",\"policy-version\":\"1.1.1-update3\",\"success-count\":3,\"failure-count\":0}],\"undeployed-policies\":[{\"policy-type\":\"onap.policies.monitoring.cdap.tca.hi.lo.app\",\"policy-type-version\":\"1.0.0\",\"policy-id\":\"test_scope_prefix.pdp_decision_Lorem\",\"policy-version\":\"1.1.1-update2\",\"success-count\":3,\"failure-count\":0}]}" + ], + "status_code": 200 + }, + { + "request": { + "headers": { + "X-ONAP-RequestID": "*", + "X-ECOMP-RequestID": "*" + }, + "json": null, + "method": "get", + "params": { + "cfy_tenant_name": "default_tenant" + }, + "uri": "http://unit-test-deployment_handler:8188000/policy" + }, + "res": { + "policies": { + "test_scope_prefix.pdp_decision_Lorem": { + "pending_update": false, + "policy_id": "test_scope_prefix.pdp_decision_Lorem", + "policy_versions": { + "1.1.1": true + } + }, + "test_scope_prefix.pdp_decision_amet": { + "pending_update": false, + "policy_id": "test_scope_prefix.pdp_decision_amet", + "policy_versions": { + "5.5.5": true + } + }, + "test_scope_prefix.pdp_decision_ametist": { + "pending_update": false, + "policy_id": "test_scope_prefix.pdp_decision_ametist", + "policy_versions": { + "7.7.7": true + } + }, + "test_scope_prefix.pdp_decision_consectetur": { + "pending_update": false, + "policy_id": "test_scope_prefix.pdp_decision_consectetur", + "policy_versions": { + "6.6.6": true + } + }, + "test_scope_prefix.pdp_decision_dolor": { + "pending_update": false, + "policy_id": "test_scope_prefix.pdp_decision_dolor", + "policy_versions": { + "3.3.3": true + } + }, + "test_scope_prefix.pdp_decision_ipsum": { + "pending_update": false, + "policy_id": "test_scope_prefix.pdp_decision_ipsum", + "policy_versions": { + "2.2.2": true + } + }, + "test_scope_prefix.pdp_decision_sit": { + "pending_update": false, + "policy_id": "test_scope_prefix.pdp_decision_sit", + "policy_versions": { + "4.4.4": true + } + } + }, + "server_instance_uuid": "e17fc584-7b06-4777-81c5-5da4337d6d16" + }, + "status_code": 200 + }, + { + "request": { + "headers": { + "Accept": "application/json", + "Authorization": "Basic auth", + "ClientAuth": "Basic user", + "Content-Type": "application/json", + "Environment": "TEST", + "X-ECOMP-RequestID": "*", + "X-ONAP-RequestID": "*" + }, + "json": { + "ONAPComponent": "policy_handler", + "ONAPInstance": "*", + "ONAPName": "DCAE", + "action": "configure", + "resource": { + "policy-id": [ + "test_scope_prefix.pdp_decision_Lorem" + ] + } + }, + "method": "post", + "params": null, + "uri": "https://unit-test-pdp-server:8081000/decision/v1/" + }, + "res": { + "policies": { + "test_scope_prefix.pdp_decision_Lorem": { + "metadata": { + "description": "description for test_scope_prefix.pdp_decision_Lorem", + "policy-id": "test_scope_prefix.pdp_decision_Lorem", + "policy-version": "1.1.1-update3" + }, + "properties": { + "policy_hello": "world! - updated 3", + "policy_updated_from_ver": "1.1.1-update2", + "policy_updated_to_ver": "1.1.1-update3", + "updated_policy_id": "test_scope_prefix.pdp_decision_Lorem" + }, + "type": "unit.test.type.policies", + "version": "1.0.0" + } + } + }, + "status_code": 200 + }, + { + "request": { + "headers": { + "X-ECOMP-RequestID": "*", + "X-ONAP-RequestID": "*" + }, + "json": { + "catch_up": false, + "latest_policies": { + "test_scope_prefix.pdp_decision_Lorem": { + "policy_body": { + "config": { + "policy_hello": "world! - updated 3", + "policy_updated_from_ver": "1.1.1-update2", + "policy_updated_to_ver": "1.1.1-update3", + "updated_policy_id": "test_scope_prefix.pdp_decision_Lorem" + }, + "metadata": { + "description": "description for test_scope_prefix.pdp_decision_Lorem", + "policy-id": "test_scope_prefix.pdp_decision_Lorem", + "policy-version": "1.1.1-update3" + }, + "policyName": "test_scope_prefix.pdp_decision_Lorem.1-1-1-update3.xml", + "policyVersion": "1.1.1-update3", + "type": "unit.test.type.policies", + "version": "1.0.0" + }, + "policy_id": "test_scope_prefix.pdp_decision_Lorem" + } + }, + "policy_filter_matches": {}, + "removed_policies": {} + }, + "method": "put", + "params": { + "cfy_tenant_name": "default_tenant" + }, + "uri": "http://unit-test-deployment_handler:8188000/policy" + }, + "res": { + "server_instance_uuid": "e17fc584-7b06-4777-81c5-5da4337d6d16" + }, + "status_code": 200 + }, + { + "request": { + "headers": { + "Authorization": "Basic auth", + "Content-Type": "application/json", + "X-ONAP-RequestID": "*", + "X-ECOMP-RequestID": "*" + }, + "json": null, + "method": "get", + "params": { + "timeout": 15000 + }, + "uri": "https://unit-test-dmaap-mr:280800000/events/unit-test-topicname/unit-test-consumegroup/unit-test-consumerid" + }, + "res": [], + "status_code": 200 + }, + { + "request": { + "headers": { + "Authorization": "Basic auth", + "Content-Type": "application/json", + "X-ONAP-RequestID": "*", + "X-ECOMP-RequestID": "*" + }, + "json": null, + "method": "get", + "params": { + "timeout": 15000 + }, + "uri": "https://unit-test-dmaap-mr:280800000/events/unit-test-topicname/unit-test-consumegroup/unit-test-consumerid" + }, + "res": [], + "status_code": 200 + }, + { + "request": { + "headers": { + "Authorization": "Basic auth", + "Content-Type": "application/json", + "X-ONAP-RequestID": "*", + "X-ECOMP-RequestID": "*" + }, + "json": null, + "method": "get", + "params": { + "timeout": 15000 + }, + "uri": "https://unit-test-dmaap-mr:280800000/events/unit-test-topicname/unit-test-consumegroup/unit-test-consumerid" + }, + "res": [], + "status_code": 200 + } + ], + "tests/main/test_pz_catch_up.py::test_catch_up": [ + { + "request": { + "headers": { + "Authorization": "Basic YWxleC1ETUFBUF9NUl9VU0VSOmFsZXgtRE1BQVBfTVJfUFdE", + "Content-Type": "application/json", + "X-ONAP-RequestID": "*", + "X-ECOMP-RequestID": "*" + }, + "json": null, + "method": "get", + "params": null, + "uri": "https://unit-test-dmaap-mr:280800000/events/unit-test-topicname/unit-test-consumegroup/unit-test-consumerid" + }, + "res": ["garbage-to-be-ignored"], + "status_code": 200 + }, + { + "request": { + "headers": { + "X-ONAP-RequestID": "*", + "X-ECOMP-RequestID": "*" + }, + "json": null, + "method": "get", + "params": { + "cfy_tenant_name": "default_tenant" + }, + "uri": "http://unit-test-deployment_handler:8188000/policy" + }, + "res": { + "policies": { + "test_scope_prefix.pdp_decision_Lorem": { + "pending_update": false, + "policy_id": "test_scope_prefix.pdp_decision_Lorem", + "policy_versions": { + "0": true + } + }, + "test_scope_prefix.pdp_decision_amet": { + "pending_update": false, + "policy_id": "test_scope_prefix.pdp_decision_amet", + "policy_versions": { + "5.5.5": true + } + }, + "test_scope_prefix.pdp_decision_ametist": { + "pending_update": false, + "policy_id": "test_scope_prefix.pdp_decision_ametist", + "policy_versions": { + "6": true + } + }, + "test_scope_prefix.pdp_decision_consectetur": { + "pending_update": false, + "policy_id": "test_scope_prefix.pdp_decision_consectetur", + "policy_versions": { + "5": true + } + }, + "test_scope_prefix.pdp_decision_dolor": { + "pending_update": false, + "policy_id": "test_scope_prefix.pdp_decision_dolor", + "policy_versions": { + "2": true + } + }, + "test_scope_prefix.pdp_decision_ipsum": { + "pending_update": false, + "policy_id": "test_scope_prefix.pdp_decision_ipsum", + "policy_versions": { + "1": true + } + }, + "test_scope_prefix.pdp_decision_sit": { + "pending_update": false, + "policy_id": "test_scope_prefix.pdp_decision_sit", + "policy_versions": { + "3": true + } + } + }, + "server_instance_uuid": "e17fc584-7b06-4777-81c5-5da4337d6d16" + }, + "status_code": 200 + }, + { + "request": { + "headers": { + "Accept": "application/json", + "Authorization": "Basic YWxleC1QRFBfVVNFUjphbGV4LVBEUF9QV0Q=", + "ClientAuth": "Basic user", + "Content-Type": "application/json", + "Environment": "TEST", + "X-ECOMP-RequestID": "*", + "X-ONAP-RequestID": "*" + }, + "json": { + "ONAPComponent": "policy_handler", + "ONAPInstance": "*", + "ONAPName": "DCAE", + "action": "configure", + "resource": { + "policy-id": [ + "test_scope_prefix.pdp_decision_Lorem", + "test_scope_prefix.pdp_decision_amet", + "test_scope_prefix.pdp_decision_ametist", + "test_scope_prefix.pdp_decision_consectetur", + "test_scope_prefix.pdp_decision_dolor", + "test_scope_prefix.pdp_decision_ipsum", + "test_scope_prefix.pdp_decision_sit" + ] + } + }, + "method": "post", + "params": null, + "uri": "https://unit-test-pdp-server:8081000/decision/v1/" + }, + "res": { + "policies": { + "test_scope_prefix.pdp_decision_Lorem": { + "metadata": { + "description": "description for test_scope_prefix.pdp_decision_Lorem", + "policy-id": "test_scope_prefix.pdp_decision_Lorem", + "policy-version": "1.1.1" + }, + "properties": { + "policy_hello": "world!", + "policy_updated_from_ver": 0, + "policy_updated_to_ver": 1, + "updated_policy_id": "test_scope_prefix.pdp_decision_Lorem" + }, + "type": "unit.test.type.policies", + "version": "1.0.0" + }, + "test_scope_prefix.pdp_decision_amet": { + "metadata": { + "description": "description for test_scope_prefix.pdp_decision_amet", + "policy-id": "test_scope_prefix.pdp_decision_amet", + "policy-version": "5.5.5" + }, + "properties": { + "policy_hello": "world!", + "policy_updated_from_ver": 4, + "policy_updated_to_ver": 5, + "updated_policy_id": "test_scope_prefix.pdp_decision_amet" + }, + "type": "unit.test.type.policies", + "version": "1.0.0" + }, + "test_scope_prefix.pdp_decision_ametist": { + "metadata": { + "description": "description for test_scope_prefix.pdp_decision_ametist", + "policy-id": "test_scope_prefix.pdp_decision_ametist", + "policy-version": "7.7.7" + }, + "properties": { + "policy_hello": "world!", + "policy_updated_from_ver": 6, + "policy_updated_to_ver": 7, + "updated_policy_id": "test_scope_prefix.pdp_decision_ametist" + }, + "type": "unit.test.type.policies", + "version": "1.0.0" + }, + "test_scope_prefix.pdp_decision_consectetur": { + "metadata": { + "description": "description for test_scope_prefix.pdp_decision_consectetur", + "policy-id": "test_scope_prefix.pdp_decision_consectetur", + "policy-version": "6.6.6" + }, + "properties": { + "policy_hello": "world!", + "policy_updated_from_ver": 5, + "policy_updated_to_ver": 6, + "updated_policy_id": "test_scope_prefix.pdp_decision_consectetur" + }, + "type": "unit.test.type.policies", + "version": "1.0.0" + }, + "test_scope_prefix.pdp_decision_dolor": { + "metadata": { + "description": "description for test_scope_prefix.pdp_decision_dolor", + "policy-id": "test_scope_prefix.pdp_decision_dolor", + "policy-version": "3.3.3" + }, + "properties": { + "policy_hello": "world!", + "policy_updated_from_ver": 2, + "policy_updated_to_ver": 3, + "updated_policy_id": "test_scope_prefix.pdp_decision_dolor" + }, + "type": "unit.test.type.policies", + "version": "1.0.0" + }, + "test_scope_prefix.pdp_decision_ipsum": { + "metadata": { + "description": "description for test_scope_prefix.pdp_decision_ipsum", + "policy-id": "test_scope_prefix.pdp_decision_ipsum", + "policy-version": "2.2.2" + }, + "properties": { + "policy_hello": "world!", + "policy_updated_from_ver": 1, + "policy_updated_to_ver": 2, + "updated_policy_id": "test_scope_prefix.pdp_decision_ipsum" + }, + "type": "unit.test.type.policies", + "version": "1.0.0" + }, + "test_scope_prefix.pdp_decision_sit": { + "metadata": { + "description": "description for test_scope_prefix.pdp_decision_sit", + "policy-id": "test_scope_prefix.pdp_decision_sit", + "policy-version": "4.4.4" + }, + "properties": { + "policy_hello": "world!", + "policy_updated_from_ver": 3, + "policy_updated_to_ver": 4, + "updated_policy_id": "test_scope_prefix.pdp_decision_sit" + }, + "type": "unit.test.type.policies", + "version": "1.0.0" + } + } + }, + "status_code": 200 + }, + { + "request": { + "headers": { + "X-ECOMP-RequestID": "*", + "X-ONAP-RequestID": "*" + }, + "json": { + "catch_up": true, + "latest_policies": { + "test_scope_prefix.pdp_decision_Lorem": { + "policy_body": { + "config": { + "policy_hello": "world!", + "policy_updated_from_ver": 0, + "policy_updated_to_ver": 1, + "updated_policy_id": "test_scope_prefix.pdp_decision_Lorem" + }, + "metadata": { + "description": "description for test_scope_prefix.pdp_decision_Lorem", + "policy-id": "test_scope_prefix.pdp_decision_Lorem", + "policy-version": "1.1.1" + }, + "policyName": "test_scope_prefix.pdp_decision_Lorem.1-1-1.xml", + "policyVersion": "1.1.1", + "type": "unit.test.type.policies", + "version": "1.0.0" + }, + "policy_id": "test_scope_prefix.pdp_decision_Lorem" + }, + "test_scope_prefix.pdp_decision_ametist": { + "policy_body": { + "config": { + "policy_hello": "world!", + "policy_updated_from_ver": 6, + "policy_updated_to_ver": 7, + "updated_policy_id": "test_scope_prefix.pdp_decision_ametist" + }, + "metadata": { + "description": "description for test_scope_prefix.pdp_decision_ametist", + "policy-id": "test_scope_prefix.pdp_decision_ametist", + "policy-version": "7.7.7" + }, + "policyName": "test_scope_prefix.pdp_decision_ametist.7-7-7.xml", + "policyVersion": "7.7.7", + "type": "unit.test.type.policies", + "version": "1.0.0" + }, + "policy_id": "test_scope_prefix.pdp_decision_ametist" + }, + "test_scope_prefix.pdp_decision_consectetur": { + "policy_body": { + "config": { + "policy_hello": "world!", + "policy_updated_from_ver": 5, + "policy_updated_to_ver": 6, + "updated_policy_id": "test_scope_prefix.pdp_decision_consectetur" + }, + "metadata": { + "description": "description for test_scope_prefix.pdp_decision_consectetur", + "policy-id": "test_scope_prefix.pdp_decision_consectetur", + "policy-version": "6.6.6" + }, + "policyName": "test_scope_prefix.pdp_decision_consectetur.6-6-6.xml", + "policyVersion": "6.6.6", + "type": "unit.test.type.policies", + "version": "1.0.0" + }, + "policy_id": "test_scope_prefix.pdp_decision_consectetur" + }, + "test_scope_prefix.pdp_decision_dolor": { + "policy_body": { + "config": { + "policy_hello": "world!", + "policy_updated_from_ver": 2, + "policy_updated_to_ver": 3, + "updated_policy_id": "test_scope_prefix.pdp_decision_dolor" + }, + "metadata": { + "description": "description for test_scope_prefix.pdp_decision_dolor", + "policy-id": "test_scope_prefix.pdp_decision_dolor", + "policy-version": "3.3.3" + }, + "policyName": "test_scope_prefix.pdp_decision_dolor.3-3-3.xml", + "policyVersion": "3.3.3", + "type": "unit.test.type.policies", + "version": "1.0.0" + }, + "policy_id": "test_scope_prefix.pdp_decision_dolor" + }, + "test_scope_prefix.pdp_decision_ipsum": { + "policy_body": { + "config": { + "policy_hello": "world!", + "policy_updated_from_ver": 1, + "policy_updated_to_ver": 2, + "updated_policy_id": "test_scope_prefix.pdp_decision_ipsum" + }, + "metadata": { + "description": "description for test_scope_prefix.pdp_decision_ipsum", + "policy-id": "test_scope_prefix.pdp_decision_ipsum", + "policy-version": "2.2.2" + }, + "policyName": "test_scope_prefix.pdp_decision_ipsum.2-2-2.xml", + "policyVersion": "2.2.2", + "type": "unit.test.type.policies", + "version": "1.0.0" + }, + "policy_id": "test_scope_prefix.pdp_decision_ipsum" + }, + "test_scope_prefix.pdp_decision_sit": { + "policy_body": { + "config": { + "policy_hello": "world!", + "policy_updated_from_ver": 3, + "policy_updated_to_ver": 4, + "updated_policy_id": "test_scope_prefix.pdp_decision_sit" + }, + "metadata": { + "description": "description for test_scope_prefix.pdp_decision_sit", + "policy-id": "test_scope_prefix.pdp_decision_sit", + "policy-version": "4.4.4" + }, + "policyName": "test_scope_prefix.pdp_decision_sit.4-4-4.xml", + "policyVersion": "4.4.4", + "type": "unit.test.type.policies", + "version": "1.0.0" + }, + "policy_id": "test_scope_prefix.pdp_decision_sit" + } + }, + "policy_filter_matches": {}, + "removed_policies": {} + }, + "method": "put", + "params": { + "cfy_tenant_name": "default_tenant" + }, + "uri": "http://unit-test-deployment_handler:8188000/policy" + }, + "res": { + "server_instance_uuid": "e17fc584-7b06-4777-81c5-5da4337d6d16" + }, + "status_code": 200 + }, + { + "request": { + "headers": { + "Authorization": "Basic YWxleC1ETUFBUF9NUl9VU0VSOmFsZXgtRE1BQVBfTVJfUFdE", + "Content-Type": "application/json", + "X-ONAP-RequestID": "*", + "X-ECOMP-RequestID": "*" + }, + "json": null, + "method": "get", + "params": { + "timeout": 15000 + }, + "uri": "https://unit-test-dmaap-mr:280800000/events/unit-test-topicname/unit-test-consumegroup/unit-test-consumerid" + }, + "res": [], + "status_code": 200 + }, + { + "request": { + "headers": { + "X-ONAP-RequestID": "*", + "X-ECOMP-RequestID": "*" + }, + "json": null, + "method": "get", + "params": { + "cfy_tenant_name": "default_tenant" + }, + "uri": "http://unit-test-deployment_handler:8188000/policy" + }, + "res": { + "policies": { + "test_scope_prefix.pdp_decision_Lorem": { + "pending_update": false, + "policy_id": "test_scope_prefix.pdp_decision_Lorem", + "policy_versions": { + "0": true + } + }, + "test_scope_prefix.pdp_decision_amet": { + "pending_update": false, + "policy_id": "test_scope_prefix.pdp_decision_amet", + "policy_versions": { + "5.5.5": true + } + }, + "test_scope_prefix.pdp_decision_ametist": { + "pending_update": false, + "policy_id": "test_scope_prefix.pdp_decision_ametist", + "policy_versions": { + "6": true + } + }, + "test_scope_prefix.pdp_decision_consectetur": { + "pending_update": false, + "policy_id": "test_scope_prefix.pdp_decision_consectetur", + "policy_versions": { + "5": true + } + }, + "test_scope_prefix.pdp_decision_dolor": { + "pending_update": false, + "policy_id": "test_scope_prefix.pdp_decision_dolor", + "policy_versions": { + "2": true + } + }, + "test_scope_prefix.pdp_decision_ipsum": { + "pending_update": false, + "policy_id": "test_scope_prefix.pdp_decision_ipsum", + "policy_versions": { + "1": true + } + }, + "test_scope_prefix.pdp_decision_sit": { + "pending_update": false, + "policy_id": "test_scope_prefix.pdp_decision_sit", + "policy_versions": { + "3": true + } + } + }, + "server_instance_uuid": "e17fc584-7b06-4777-81c5-5da4337d6d16" + }, + "status_code": 200 + }, + { + "request": { + "headers": { + "Accept": "application/json", + "Authorization": "Basic YWxleC1QRFBfVVNFUjphbGV4LVBEUF9QV0Q=", + "ClientAuth": "Basic user", + "Content-Type": "application/json", + "Environment": "TEST", + "X-ECOMP-RequestID": "*", + "X-ONAP-RequestID": "*" + }, + "json": { + "ONAPComponent": "policy_handler", + "ONAPInstance": "*", + "ONAPName": "DCAE", + "action": "configure", + "resource": { + "policy-id": [ + "test_scope_prefix.pdp_decision_Lorem", + "test_scope_prefix.pdp_decision_amet", + "test_scope_prefix.pdp_decision_ametist", + "test_scope_prefix.pdp_decision_consectetur", + "test_scope_prefix.pdp_decision_dolor", + "test_scope_prefix.pdp_decision_ipsum", + "test_scope_prefix.pdp_decision_sit" + ] + } + }, + "method": "post", + "params": null, + "uri": "https://unit-test-pdp-server:8081000/decision/v1/" + }, + "res": { + "policies": { + "test_scope_prefix.pdp_decision_Lorem": { + "metadata": { + "description": "description for test_scope_prefix.pdp_decision_Lorem", + "policy-id": "test_scope_prefix.pdp_decision_Lorem", + "policy-version": "1.1.1" + }, + "properties": { + "policy_hello": "world!", + "policy_updated_from_ver": 0, + "policy_updated_to_ver": 1, + "updated_policy_id": "test_scope_prefix.pdp_decision_Lorem" + }, + "type": "unit.test.type.policies", + "version": "1.0.0" + }, + "test_scope_prefix.pdp_decision_amet": { + "metadata": { + "description": "description for test_scope_prefix.pdp_decision_amet", + "policy-id": "test_scope_prefix.pdp_decision_amet", + "policy-version": "5.5.5" + }, + "properties": { + "policy_hello": "world!", + "policy_updated_from_ver": 4, + "policy_updated_to_ver": 5, + "updated_policy_id": "test_scope_prefix.pdp_decision_amet" + }, + "type": "unit.test.type.policies", + "version": "1.0.0" + }, + "test_scope_prefix.pdp_decision_ametist": { + "metadata": { + "description": "description for test_scope_prefix.pdp_decision_ametist", + "policy-id": "test_scope_prefix.pdp_decision_ametist", + "policy-version": "7.7.7" + }, + "properties": { + "policy_hello": "world!", + "policy_updated_from_ver": 6, + "policy_updated_to_ver": 7, + "updated_policy_id": "test_scope_prefix.pdp_decision_ametist" + }, + "type": "unit.test.type.policies", + "version": "1.0.0" + }, + "test_scope_prefix.pdp_decision_consectetur": { + "metadata": { + "description": "description for test_scope_prefix.pdp_decision_consectetur", + "policy-id": "test_scope_prefix.pdp_decision_consectetur", + "policy-version": "6.6.6" + }, + "properties": { + "policy_hello": "world!", + "policy_updated_from_ver": 5, + "policy_updated_to_ver": 6, + "updated_policy_id": "test_scope_prefix.pdp_decision_consectetur" + }, + "type": "unit.test.type.policies", + "version": "1.0.0" + }, + "test_scope_prefix.pdp_decision_dolor": { + "metadata": { + "description": "description for test_scope_prefix.pdp_decision_dolor", + "policy-id": "test_scope_prefix.pdp_decision_dolor", + "policy-version": "3.3.3" + }, + "properties": { + "policy_hello": "world!", + "policy_updated_from_ver": 2, + "policy_updated_to_ver": 3, + "updated_policy_id": "test_scope_prefix.pdp_decision_dolor" + }, + "type": "unit.test.type.policies", + "version": "1.0.0" + }, + "test_scope_prefix.pdp_decision_ipsum": { + "metadata": { + "description": "description for test_scope_prefix.pdp_decision_ipsum", + "policy-id": "test_scope_prefix.pdp_decision_ipsum", + "policy-version": "2.2.2" + }, + "properties": { + "policy_hello": "world!", + "policy_updated_from_ver": 1, + "policy_updated_to_ver": 2, + "updated_policy_id": "test_scope_prefix.pdp_decision_ipsum" + }, + "type": "unit.test.type.policies", + "version": "1.0.0" + }, + "test_scope_prefix.pdp_decision_sit": { + "metadata": { + "description": "description for test_scope_prefix.pdp_decision_sit", + "policy-id": "test_scope_prefix.pdp_decision_sit", + "policy-version": "4.4.4" + }, + "properties": { + "policy_hello": "world!", + "policy_updated_from_ver": 3, + "policy_updated_to_ver": 4, + "updated_policy_id": "test_scope_prefix.pdp_decision_sit" + }, + "type": "unit.test.type.policies", + "version": "1.0.0" + } + } + }, + "status_code": 200 + }, + { + "request": { + "headers": { + "X-ECOMP-RequestID": "*", + "X-ONAP-RequestID": "*" + }, + "json": { + "catch_up": true, + "latest_policies": { + "test_scope_prefix.pdp_decision_Lorem": { + "policy_body": { + "config": { + "policy_hello": "world!", + "policy_updated_from_ver": 0, + "policy_updated_to_ver": 1, + "updated_policy_id": "test_scope_prefix.pdp_decision_Lorem" + }, + "metadata": { + "description": "description for test_scope_prefix.pdp_decision_Lorem", + "policy-id": "test_scope_prefix.pdp_decision_Lorem", + "policy-version": "1.1.1" + }, + "policyName": "test_scope_prefix.pdp_decision_Lorem.1-1-1.xml", + "policyVersion": "1.1.1", + "type": "unit.test.type.policies", + "version": "1.0.0" + }, + "policy_id": "test_scope_prefix.pdp_decision_Lorem" + }, + "test_scope_prefix.pdp_decision_ametist": { + "policy_body": { + "config": { + "policy_hello": "world!", + "policy_updated_from_ver": 6, + "policy_updated_to_ver": 7, + "updated_policy_id": "test_scope_prefix.pdp_decision_ametist" + }, + "metadata": { + "description": "description for test_scope_prefix.pdp_decision_ametist", + "policy-id": "test_scope_prefix.pdp_decision_ametist", + "policy-version": "7.7.7" + }, + "policyName": "test_scope_prefix.pdp_decision_ametist.7-7-7.xml", + "policyVersion": "7.7.7", + "type": "unit.test.type.policies", + "version": "1.0.0" + }, + "policy_id": "test_scope_prefix.pdp_decision_ametist" + }, + "test_scope_prefix.pdp_decision_consectetur": { + "policy_body": { + "config": { + "policy_hello": "world!", + "policy_updated_from_ver": 5, + "policy_updated_to_ver": 6, + "updated_policy_id": "test_scope_prefix.pdp_decision_consectetur" + }, + "metadata": { + "description": "description for test_scope_prefix.pdp_decision_consectetur", + "policy-id": "test_scope_prefix.pdp_decision_consectetur", + "policy-version": "6.6.6" + }, + "policyName": "test_scope_prefix.pdp_decision_consectetur.6-6-6.xml", + "policyVersion": "6.6.6", + "type": "unit.test.type.policies", + "version": "1.0.0" + }, + "policy_id": "test_scope_prefix.pdp_decision_consectetur" + }, + "test_scope_prefix.pdp_decision_dolor": { + "policy_body": { + "config": { + "policy_hello": "world!", + "policy_updated_from_ver": 2, + "policy_updated_to_ver": 3, + "updated_policy_id": "test_scope_prefix.pdp_decision_dolor" + }, + "metadata": { + "description": "description for test_scope_prefix.pdp_decision_dolor", + "policy-id": "test_scope_prefix.pdp_decision_dolor", + "policy-version": "3.3.3" + }, + "policyName": "test_scope_prefix.pdp_decision_dolor.3-3-3.xml", + "policyVersion": "3.3.3", + "type": "unit.test.type.policies", + "version": "1.0.0" + }, + "policy_id": "test_scope_prefix.pdp_decision_dolor" + }, + "test_scope_prefix.pdp_decision_ipsum": { + "policy_body": { + "config": { + "policy_hello": "world!", + "policy_updated_from_ver": 1, + "policy_updated_to_ver": 2, + "updated_policy_id": "test_scope_prefix.pdp_decision_ipsum" + }, + "metadata": { + "description": "description for test_scope_prefix.pdp_decision_ipsum", + "policy-id": "test_scope_prefix.pdp_decision_ipsum", + "policy-version": "2.2.2" + }, + "policyName": "test_scope_prefix.pdp_decision_ipsum.2-2-2.xml", + "policyVersion": "2.2.2", + "type": "unit.test.type.policies", + "version": "1.0.0" + }, + "policy_id": "test_scope_prefix.pdp_decision_ipsum" + }, + "test_scope_prefix.pdp_decision_sit": { + "policy_body": { + "config": { + "policy_hello": "world!", + "policy_updated_from_ver": 3, + "policy_updated_to_ver": 4, + "updated_policy_id": "test_scope_prefix.pdp_decision_sit" + }, + "metadata": { + "description": "description for test_scope_prefix.pdp_decision_sit", + "policy-id": "test_scope_prefix.pdp_decision_sit", + "policy-version": "4.4.4" + }, + "policyName": "test_scope_prefix.pdp_decision_sit.4-4-4.xml", + "policyVersion": "4.4.4", + "type": "unit.test.type.policies", + "version": "1.0.0" + }, + "policy_id": "test_scope_prefix.pdp_decision_sit" + } + }, + "policy_filter_matches": {}, + "removed_policies": {} + }, + "method": "put", + "params": { + "cfy_tenant_name": "default_tenant" + }, + "uri": "http://unit-test-deployment_handler:8188000/policy" + }, + "res": { + "server_instance_uuid": "e17fc584-7b06-4777-81c5-5da4337d6d16" + }, + "status_code": 200 + }, + { + "request": { + "headers": { + "Authorization": "Basic YWxleC1ETUFBUF9NUl9VU0VSOmFsZXgtRE1BQVBfTVJfUFdE", + "Content-Type": "application/json", + "X-ONAP-RequestID": "*", + "X-ECOMP-RequestID": "*" + }, + "json": null, + "method": "get", + "params": { + "timeout": 15000 + }, + "uri": "https://unit-test-dmaap-mr:280800000/events/unit-test-topicname/unit-test-consumegroup/unit-test-consumerid" + }, + "res": ["garbage-to-be-ignored", "garbage-to-be-ignored"], + "status_code": 200 + }, + { + "request": { + "headers": { + "Authorization": "Basic YWxleC1ETUFBUF9NUl9VU0VSOmFsZXgtRE1BQVBfTVJfUFdE", + "Content-Type": "application/json", + "X-ONAP-RequestID": "*", + "X-ECOMP-RequestID": "*" + }, + "json": null, + "method": "get", + "params": { + "timeout": 15000 + }, + "uri": "https://unit-test-dmaap-mr:280800000/events/unit-test-topicname/unit-test-consumegroup/unit-test-consumerid" + }, + "res": [], + "status_code": 200 + }, + { + "request": { + "headers": { + "X-ONAP-RequestID": "*", + "X-ECOMP-RequestID": "*" + }, + "json": null, + "method": "get", + "params": { + "cfy_tenant_name": "default_tenant" + }, + "uri": "http://unit-test-deployment_handler:8188000/policy" + }, + "res": { + "policies": { + "test_scope_prefix.pdp_decision_Lorem": { + "pending_update": false, + "policy_id": "test_scope_prefix.pdp_decision_Lorem", + "policy_versions": { + "0": true + } + }, + "test_scope_prefix.pdp_decision_amet": { + "pending_update": false, + "policy_id": "test_scope_prefix.pdp_decision_amet", + "policy_versions": { + "5.5.5": true + } + }, + "test_scope_prefix.pdp_decision_ametist": { + "pending_update": false, + "policy_id": "test_scope_prefix.pdp_decision_ametist", + "policy_versions": { + "6": true + } + }, + "test_scope_prefix.pdp_decision_consectetur": { + "pending_update": false, + "policy_id": "test_scope_prefix.pdp_decision_consectetur", + "policy_versions": { + "5": true + } + }, + "test_scope_prefix.pdp_decision_dolor": { + "pending_update": false, + "policy_id": "test_scope_prefix.pdp_decision_dolor", + "policy_versions": { + "2": true + } + }, + "test_scope_prefix.pdp_decision_ipsum": { + "pending_update": false, + "policy_id": "test_scope_prefix.pdp_decision_ipsum", + "policy_versions": { + "1": true + } + }, + "test_scope_prefix.pdp_decision_sit": { + "pending_update": false, + "policy_id": "test_scope_prefix.pdp_decision_sit", + "policy_versions": { + "3": true + } + } + }, + "server_instance_uuid": "e17fc584-7b06-4777-81c5-5da4337d6d16" + }, + "status_code": 200 + }, + { + "request": { + "headers": { + "Accept": "application/json", + "Authorization": "Basic YWxleC1QRFBfVVNFUjphbGV4LVBEUF9QV0Q=", + "ClientAuth": "Basic user", + "Content-Type": "application/json", + "Environment": "TEST", + "X-ECOMP-RequestID": "*", + "X-ONAP-RequestID": "*" + }, + "json": { + "ONAPComponent": "policy_handler", + "ONAPInstance": "*", + "ONAPName": "DCAE", + "action": "configure", + "resource": { + "policy-id": [ + "test_scope_prefix.pdp_decision_Lorem", + "test_scope_prefix.pdp_decision_amet", + "test_scope_prefix.pdp_decision_ametist", + "test_scope_prefix.pdp_decision_consectetur", + "test_scope_prefix.pdp_decision_dolor", + "test_scope_prefix.pdp_decision_ipsum", + "test_scope_prefix.pdp_decision_sit" + ] + } + }, + "method": "post", + "params": null, + "uri": "https://unit-test-pdp-server:8081000/decision/v1/" + }, + "res": { + "policies": { + "test_scope_prefix.pdp_decision_Lorem": { + "metadata": { + "description": "description for test_scope_prefix.pdp_decision_Lorem", + "policy-id": "test_scope_prefix.pdp_decision_Lorem", + "policy-version": "1.1.1" + }, + "properties": { + "policy_hello": "world!", + "policy_updated_from_ver": 0, + "policy_updated_to_ver": 1, + "updated_policy_id": "test_scope_prefix.pdp_decision_Lorem" + }, + "type": "unit.test.type.policies", + "version": "1.0.0" + }, + "test_scope_prefix.pdp_decision_amet": { + "metadata": { + "description": "description for test_scope_prefix.pdp_decision_amet", + "policy-id": "test_scope_prefix.pdp_decision_amet", + "policy-version": "5.5.5" + }, + "properties": { + "policy_hello": "world!", + "policy_updated_from_ver": 4, + "policy_updated_to_ver": 5, + "updated_policy_id": "test_scope_prefix.pdp_decision_amet" + }, + "type": "unit.test.type.policies", + "version": "1.0.0" + }, + "test_scope_prefix.pdp_decision_ametist": { + "metadata": { + "description": "description for test_scope_prefix.pdp_decision_ametist", + "policy-id": "test_scope_prefix.pdp_decision_ametist", + "policy-version": "7.7.7" + }, + "properties": { + "policy_hello": "world!", + "policy_updated_from_ver": 6, + "policy_updated_to_ver": 7, + "updated_policy_id": "test_scope_prefix.pdp_decision_ametist" + }, + "type": "unit.test.type.policies", + "version": "1.0.0" + }, + "test_scope_prefix.pdp_decision_consectetur": { + "metadata": { + "description": "description for test_scope_prefix.pdp_decision_consectetur", + "policy-id": "test_scope_prefix.pdp_decision_consectetur", + "policy-version": "6.6.6" + }, + "properties": { + "policy_hello": "world!", + "policy_updated_from_ver": 5, + "policy_updated_to_ver": 6, + "updated_policy_id": "test_scope_prefix.pdp_decision_consectetur" + }, + "type": "unit.test.type.policies", + "version": "1.0.0" + }, + "test_scope_prefix.pdp_decision_dolor": { + "metadata": { + "description": "description for test_scope_prefix.pdp_decision_dolor", + "policy-id": "test_scope_prefix.pdp_decision_dolor", + "policy-version": "3.3.3" + }, + "properties": { + "policy_hello": "world!", + "policy_updated_from_ver": 2, + "policy_updated_to_ver": 3, + "updated_policy_id": "test_scope_prefix.pdp_decision_dolor" + }, + "type": "unit.test.type.policies", + "version": "1.0.0" + }, + "test_scope_prefix.pdp_decision_ipsum": { + "metadata": { + "description": "description for test_scope_prefix.pdp_decision_ipsum", + "policy-id": "test_scope_prefix.pdp_decision_ipsum", + "policy-version": "2.2.2" + }, + "properties": { + "policy_hello": "world!", + "policy_updated_from_ver": 1, + "policy_updated_to_ver": 2, + "updated_policy_id": "test_scope_prefix.pdp_decision_ipsum" + }, + "type": "unit.test.type.policies", + "version": "1.0.0" + }, + "test_scope_prefix.pdp_decision_sit": { + "metadata": { + "description": "description for test_scope_prefix.pdp_decision_sit", + "policy-id": "test_scope_prefix.pdp_decision_sit", + "policy-version": "4.4.4" + }, + "properties": { + "policy_hello": "world!", + "policy_updated_from_ver": 3, + "policy_updated_to_ver": 4, + "updated_policy_id": "test_scope_prefix.pdp_decision_sit" + }, + "type": "unit.test.type.policies", + "version": "1.0.0" + } + } + }, + "status_code": 200 + }, + { + "request": { + "headers": { + "X-ECOMP-RequestID": "*", + "X-ONAP-RequestID": "*" + }, + "json": { + "catch_up": true, + "latest_policies": { + "test_scope_prefix.pdp_decision_Lorem": { + "policy_body": { + "config": { + "policy_hello": "world!", + "policy_updated_from_ver": 0, + "policy_updated_to_ver": 1, + "updated_policy_id": "test_scope_prefix.pdp_decision_Lorem" + }, + "metadata": { + "description": "description for test_scope_prefix.pdp_decision_Lorem", + "policy-id": "test_scope_prefix.pdp_decision_Lorem", + "policy-version": "1.1.1" + }, + "policyName": "test_scope_prefix.pdp_decision_Lorem.1-1-1.xml", + "policyVersion": "1.1.1", + "type": "unit.test.type.policies", + "version": "1.0.0" + }, + "policy_id": "test_scope_prefix.pdp_decision_Lorem" + }, + "test_scope_prefix.pdp_decision_ametist": { + "policy_body": { + "config": { + "policy_hello": "world!", + "policy_updated_from_ver": 6, + "policy_updated_to_ver": 7, + "updated_policy_id": "test_scope_prefix.pdp_decision_ametist" + }, + "metadata": { + "description": "description for test_scope_prefix.pdp_decision_ametist", + "policy-id": "test_scope_prefix.pdp_decision_ametist", + "policy-version": "7.7.7" + }, + "policyName": "test_scope_prefix.pdp_decision_ametist.7-7-7.xml", + "policyVersion": "7.7.7", + "type": "unit.test.type.policies", + "version": "1.0.0" + }, + "policy_id": "test_scope_prefix.pdp_decision_ametist" + }, + "test_scope_prefix.pdp_decision_consectetur": { + "policy_body": { + "config": { + "policy_hello": "world!", + "policy_updated_from_ver": 5, + "policy_updated_to_ver": 6, + "updated_policy_id": "test_scope_prefix.pdp_decision_consectetur" + }, + "metadata": { + "description": "description for test_scope_prefix.pdp_decision_consectetur", + "policy-id": "test_scope_prefix.pdp_decision_consectetur", + "policy-version": "6.6.6" + }, + "policyName": "test_scope_prefix.pdp_decision_consectetur.6-6-6.xml", + "policyVersion": "6.6.6", + "type": "unit.test.type.policies", + "version": "1.0.0" + }, + "policy_id": "test_scope_prefix.pdp_decision_consectetur" + }, + "test_scope_prefix.pdp_decision_dolor": { + "policy_body": { + "config": { + "policy_hello": "world!", + "policy_updated_from_ver": 2, + "policy_updated_to_ver": 3, + "updated_policy_id": "test_scope_prefix.pdp_decision_dolor" + }, + "metadata": { + "description": "description for test_scope_prefix.pdp_decision_dolor", + "policy-id": "test_scope_prefix.pdp_decision_dolor", + "policy-version": "3.3.3" + }, + "policyName": "test_scope_prefix.pdp_decision_dolor.3-3-3.xml", + "policyVersion": "3.3.3", + "type": "unit.test.type.policies", + "version": "1.0.0" + }, + "policy_id": "test_scope_prefix.pdp_decision_dolor" + }, + "test_scope_prefix.pdp_decision_ipsum": { + "policy_body": { + "config": { + "policy_hello": "world!", + "policy_updated_from_ver": 1, + "policy_updated_to_ver": 2, + "updated_policy_id": "test_scope_prefix.pdp_decision_ipsum" + }, + "metadata": { + "description": "description for test_scope_prefix.pdp_decision_ipsum", + "policy-id": "test_scope_prefix.pdp_decision_ipsum", + "policy-version": "2.2.2" + }, + "policyName": "test_scope_prefix.pdp_decision_ipsum.2-2-2.xml", + "policyVersion": "2.2.2", + "type": "unit.test.type.policies", + "version": "1.0.0" + }, + "policy_id": "test_scope_prefix.pdp_decision_ipsum" + }, + "test_scope_prefix.pdp_decision_sit": { + "policy_body": { + "config": { + "policy_hello": "world!", + "policy_updated_from_ver": 3, + "policy_updated_to_ver": 4, + "updated_policy_id": "test_scope_prefix.pdp_decision_sit" + }, + "metadata": { + "description": "description for test_scope_prefix.pdp_decision_sit", + "policy-id": "test_scope_prefix.pdp_decision_sit", + "policy-version": "4.4.4" + }, + "policyName": "test_scope_prefix.pdp_decision_sit.4-4-4.xml", + "policyVersion": "4.4.4", + "type": "unit.test.type.policies", + "version": "1.0.0" + }, + "policy_id": "test_scope_prefix.pdp_decision_sit" + } + }, + "policy_filter_matches": {}, + "removed_policies": {} + }, + "method": "put", + "params": { + "cfy_tenant_name": "default_tenant" + }, + "uri": "http://unit-test-deployment_handler:8188000/policy" + }, + "res": { + "server_instance_uuid": "e17fc584-7b06-4777-81c5-5da4337d6d16" + }, + "status_code": 200 + }, + { + "request": { + "headers": { + "Authorization": "Basic YWxleC1ETUFBUF9NUl9VU0VSOmFsZXgtRE1BQVBfTVJfUFdE", + "Content-Type": "application/json", + "X-ONAP-RequestID": "*", + "X-ECOMP-RequestID": "*" + }, + "json": null, + "method": "get", + "params": { + "timeout": 15000 + }, + "uri": "https://unit-test-dmaap-mr:280800000/events/unit-test-topicname/unit-test-consumegroup/unit-test-consumerid" + }, + "res": [], + "status_code": 200 + } + ] +}
\ No newline at end of file diff --git a/tests/main/mock_expected.py b/tests/main/mock_expected.py deleted file mode 100644 index 450394c..0000000 --- a/tests/main/mock_expected.py +++ /dev/null @@ -1,526 +0,0 @@ -# ============LICENSE_START======================================================= -# Copyright (c) 2018-2019 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========================================================= -# -"""expected message history per test for pdp API 2019 and after""" - - -HISTORY_EXPECTED = { - "tests/main/test_policy_rest.py::test_get_policy_latest" : [ - { - "request": { - "headers": { - "Accept": "application/json", - "Authorization": "Basic auth", - "ClientAuth": "Basic user", - "Content-Type": "application/json", - "Environment": "TEST", - "X-ECOMP-RequestID": "*" - }, - "json": { - "ONAPComponent": "policy_handler", - "ONAPInstance": "*", - "ONAPName": "DCAE", - "action": "configure", - "resource": { - "policy-id": [ - "test_scope_prefix.pdp_desition_sit" - ] - } - }, - "method": "post", - "params": None, - "uri": "https://unit-test-pdp-server:8081000/decision/v1/" - }, - "res": "*", - "status_code": 200 - } - ], - "tests/main/test_policyhandler.py::WebServerTest::test_web_all_policies_latest": [ - { - "request": { - "headers": { - "X-ECOMP-RequestID": "*" - }, - "json": None, - "method": "get", - "params": { - "cfy_tenant_name": "default_tenant" - }, - "uri": "http://unit-test-deployment_handler:8188000/policy" - }, - "res": "*", - "status_code": 200 - }, - { - "request": { - "headers": { - "Accept": "application/json", - "Authorization": "Basic auth", - "ClientAuth": "Basic user", - "Content-Type": "application/json", - "Environment": "TEST", - "X-ECOMP-RequestID": "*" - }, - "json": { - "policyName": "test_scope_prefix.Config_.*" - }, - "method": "post", - "params": None, - "uri": "https://unit-test-pdp-server:8081000/pdp/api/getConfig" - }, - "res": "*", - "status_code": 200 - } - ], - "tests/main/test_policyhandler.py::WebServerTest::test_web_policies_latest": [ - { - "request": { - "headers": { - "Accept": "application/json", - "Authorization": "Basic auth", - "ClientAuth": "Basic user", - "Content-Type": "application/json", - "Environment": "TEST", - "X-ECOMP-RequestID": "*" - }, - "json": { - "policyName": "test_scope_prefix.Config_amet.*" - }, - "method": "post", - "params": None, - "uri": "https://unit-test-pdp-server:8081000/pdp/api/getConfig" - }, - "res": "*", - "status_code": 200 - } - ], - "tests/main/test_policyhandler.py::WebServerTest::test_web_policy_latest": [ - { - "request": { - "headers": { - "Accept": "application/json", - "Authorization": "Basic auth", - "ClientAuth": "Basic user", - "Content-Type": "application/json", - "Environment": "TEST", - "X-ECOMP-RequestID": "*" - }, - "json": { - "ONAPComponent": "policy_handler", - "ONAPInstance": "*", - "ONAPName": "DCAE", - "action": "configure", - "resource": { - "policy-id": [ - "test_scope_prefix.pdp_desition_sit" - ] - } - }, - "method": "post", - "params": None, - "uri": "https://unit-test-pdp-server:8081000/decision/v1/" - }, - "res": "*", - "status_code": 200 - } - ], - "tests/main/test_policyhandler.py::WebServerTest::test_zzzzz_shutdown": [ - { - "request": { - "headers": { - "X-ECOMP-RequestID": "*" - }, - "json": None, - "method": "get", - "params": { - "cfy_tenant_name": "default_tenant" - }, - "uri": "http://unit-test-deployment_handler:8188000/policy" - }, - "res": "*", - "status_code": 200 - }, - { - "request": { - "headers": { - "Accept": "application/json", - "Authorization": "Basic auth", - "ClientAuth": "Basic user", - "Content-Type": "application/json", - "Environment": "TEST", - "X-ECOMP-RequestID": "*" - }, - "json": { - "policyName": "test_scope_prefix.Config_.*" - }, - "method": "post", - "params": None, - "uri": "https://unit-test-pdp-server:8081000/pdp/api/getConfig" - }, - "res": "*", - "status_code": 200 - }, - { - "request": { - "headers": { - "X-ECOMP-RequestID": "*" - }, - "json": { - "catch_up": True, - "latest_policies": { - "test_scope_prefix.Config_Lorem": { - "policy_body": { - "config": { - "policy_hello": "world!", - "policy_updated_from_ver": "0", - "policy_updated_to_ver": "1", - "updated_policy_id": "test_scope_prefix.Config_Lorem" - }, - "matchingConditions": { - "ConfigName": "alex_config_name", - "ONAPName": "DCAE" - }, - "policyConfigMessage": "Config Retrieved! ", - "policyConfigStatus": "CONFIG_RETRIEVED", - "policyName": "test_scope_prefix.Config_Lorem.1.xml", - "policyVersion": "1", - "property": None, - "responseAttributes": {}, - "type": "JSON" - }, - "policy_id": "test_scope_prefix.Config_Lorem" - }, - "test_scope_prefix.Config_amet": { - "policy_body": { - "config": { - "policy_hello": "world!", - "policy_updated_from_ver": "4", - "policy_updated_to_ver": "5", - "updated_policy_id": "test_scope_prefix.Config_amet" - }, - "matchingConditions": { - "ConfigName": "alex_config_name", - "ONAPName": "DCAE" - }, - "policyConfigMessage": "Config Retrieved! ", - "policyConfigStatus": "CONFIG_RETRIEVED", - "policyName": "test_scope_prefix.Config_amet.5.xml", - "policyVersion": "5", - "property": None, - "responseAttributes": {}, - "type": "JSON" - }, - "policy_id": "test_scope_prefix.Config_amet" - }, - "test_scope_prefix.Config_ametist": { - "policy_body": { - "config": { - "policy_hello": "world!", - "policy_updated_from_ver": "6", - "policy_updated_to_ver": "7", - "updated_policy_id": "test_scope_prefix.Config_ametist" - }, - "matchingConditions": { - "ConfigName": "alex_config_name", - "ONAPName": "DCAE" - }, - "policyConfigMessage": "Config Retrieved! ", - "policyConfigStatus": "CONFIG_RETRIEVED", - "policyName": "test_scope_prefix.Config_ametist.7.xml", - "policyVersion": "7", - "property": None, - "responseAttributes": {}, - "type": "JSON" - }, - "policy_id": "test_scope_prefix.Config_ametist" - }, - "test_scope_prefix.Config_consectetur": { - "policy_body": { - "config": { - "policy_hello": "world!", - "policy_updated_from_ver": "5", - "policy_updated_to_ver": "6", - "updated_policy_id": "test_scope_prefix.Config_consectetur" - }, - "matchingConditions": { - "ConfigName": "alex_config_name", - "ONAPName": "DCAE" - }, - "policyConfigMessage": "Config Retrieved! ", - "policyConfigStatus": "CONFIG_RETRIEVED", - "policyName": "test_scope_prefix.Config_consectetur.6.xml", - "policyVersion": "6", - "property": None, - "responseAttributes": {}, - "type": "JSON" - }, - "policy_id": "test_scope_prefix.Config_consectetur" - }, - "test_scope_prefix.Config_dolor": { - "policy_body": { - "config": { - "policy_hello": "world!", - "policy_updated_from_ver": "2", - "policy_updated_to_ver": "3", - "updated_policy_id": "test_scope_prefix.Config_dolor" - }, - "matchingConditions": { - "ConfigName": "alex_config_name", - "ONAPName": "DCAE" - }, - "policyConfigMessage": "Config Retrieved! ", - "policyConfigStatus": "CONFIG_RETRIEVED", - "policyName": "test_scope_prefix.Config_dolor.3.xml", - "policyVersion": "3", - "property": None, - "responseAttributes": {}, - "type": "JSON" - }, - "policy_id": "test_scope_prefix.Config_dolor" - }, - "test_scope_prefix.Config_ipsum": { - "policy_body": { - "config": { - "policy_hello": "world!", - "policy_updated_from_ver": "1", - "policy_updated_to_ver": "2", - "updated_policy_id": "test_scope_prefix.Config_ipsum" - }, - "matchingConditions": { - "ConfigName": "alex_config_name", - "ONAPName": "DCAE" - }, - "policyConfigMessage": "Config Retrieved! ", - "policyConfigStatus": "CONFIG_RETRIEVED", - "policyName": "test_scope_prefix.Config_ipsum.2.xml", - "policyVersion": "2", - "property": None, - "responseAttributes": {}, - "type": "JSON" - }, - "policy_id": "test_scope_prefix.Config_ipsum" - }, - "test_scope_prefix.Config_sit": { - "policy_body": { - "config": { - "policy_hello": "world!", - "policy_updated_from_ver": "3", - "policy_updated_to_ver": "4", - "updated_policy_id": "test_scope_prefix.Config_sit" - }, - "matchingConditions": { - "ConfigName": "alex_config_name", - "ONAPName": "DCAE" - }, - "policyConfigMessage": "Config Retrieved! ", - "policyConfigStatus": "CONFIG_RETRIEVED", - "policyName": "test_scope_prefix.Config_sit.4.xml", - "policyVersion": "4", - "property": None, - "responseAttributes": {}, - "type": "JSON" - }, - "policy_id": "test_scope_prefix.Config_sit" - } - }, - "policy_filter_matches": { - "test_scope_prefix.Config_Lorem": {}, - "test_scope_prefix.Config_amet": {}, - "test_scope_prefix.Config_ametist": {}, - "test_scope_prefix.Config_consectetur": {}, - "test_scope_prefix.Config_dolor": {}, - "test_scope_prefix.Config_ipsum": {}, - "test_scope_prefix.Config_sit": {} - }, - "removed_policies": {} - }, - "method": "put", - "params": { - "cfy_tenant_name": "default_tenant" - }, - "uri": "http://unit-test-deployment_handler:8188000/policy" - }, - "res": "*", - "status_code": 200 - }, - { - "request": { - "headers": { - "X-ECOMP-RequestID": "*" - }, - "json": None, - "method": "get", - "params": { - "cfy_tenant_name": "default_tenant" - }, - "uri": "http://unit-test-deployment_handler:8188000/policy" - }, - "res": "*", - "status_code": 200 - }, - { - "request": { - "headers": { - "Accept": "application/json", - "Authorization": "Basic auth", - "ClientAuth": "Basic user", - "Content-Type": "application/json", - "Environment": "TEST", - "X-ECOMP-RequestID": "*" - }, - "json": { - "policyName": "test_scope_prefix.Config_ipsum" - }, - "method": "post", - "params": None, - "uri": "https://unit-test-pdp-server:8081000/pdp/api/getConfig" - }, - "res": "*", - "status_code": 200 - }, - { - "request": { - "headers": { - "Accept": "application/json", - "Authorization": "Basic auth", - "ClientAuth": "Basic user", - "Content-Type": "application/json", - "Environment": "TEST", - "X-ECOMP-RequestID": "*" - }, - "json": { - "policyName": "test_scope_prefix.Config_sit" - }, - "method": "post", - "params": None, - "uri": "https://unit-test-pdp-server:8081000/pdp/api/getConfig" - }, - "res": "*", - "status_code": 200 - }, - { - "request": { - "headers": { - "Accept": "application/json", - "Authorization": "Basic auth", - "ClientAuth": "Basic user", - "Content-Type": "application/json", - "Environment": "TEST", - "X-ECOMP-RequestID": "*" - }, - "json": { - "policyName": "test_scope_prefix.Config_consectetur" - }, - "method": "post", - "params": None, - "uri": "https://unit-test-pdp-server:8081000/pdp/api/getConfig" - }, - "res": "*", - "status_code": 200 - }, - { - "request": { - "headers": { - "X-ECOMP-RequestID": "*" - }, - "json": { - "catch_up": False, - "latest_policies": { - "test_scope_prefix.Config_consectetur": { - "policy_body": { - "config": { - "policy_hello": "world!", - "policy_updated_from_ver": "5", - "policy_updated_to_ver": "6", - "updated_policy_id": "test_scope_prefix.Config_consectetur" - }, - "matchingConditions": { - "ConfigName": "alex_config_name", - "ONAPName": "DCAE" - }, - "policyConfigMessage": "Config Retrieved! ", - "policyConfigStatus": "CONFIG_RETRIEVED", - "policyName": "test_scope_prefix.Config_consectetur.6.xml", - "policyVersion": "6", - "property": None, - "responseAttributes": {}, - "type": "JSON" - }, - "policy_id": "test_scope_prefix.Config_consectetur" - }, - "test_scope_prefix.Config_ipsum": { - "policy_body": { - "config": { - "policy_hello": "world!", - "policy_updated_from_ver": "1", - "policy_updated_to_ver": "2", - "updated_policy_id": "test_scope_prefix.Config_ipsum" - }, - "matchingConditions": { - "ConfigName": "alex_config_name", - "ONAPName": "DCAE" - }, - "policyConfigMessage": "Config Retrieved! ", - "policyConfigStatus": "CONFIG_RETRIEVED", - "policyName": "test_scope_prefix.Config_ipsum.2.xml", - "policyVersion": "2", - "property": None, - "responseAttributes": {}, - "type": "JSON" - }, - "policy_id": "test_scope_prefix.Config_ipsum" - }, - "test_scope_prefix.Config_sit": { - "policy_body": { - "config": { - "policy_hello": "world!", - "policy_updated_from_ver": "3", - "policy_updated_to_ver": "4", - "updated_policy_id": "test_scope_prefix.Config_sit" - }, - "matchingConditions": { - "ConfigName": "alex_config_name", - "ONAPName": "DCAE" - }, - "policyConfigMessage": "Config Retrieved! ", - "policyConfigStatus": "CONFIG_RETRIEVED", - "policyName": "test_scope_prefix.Config_sit.4.xml", - "policyVersion": "4", - "property": None, - "responseAttributes": {}, - "type": "JSON" - }, - "policy_id": "test_scope_prefix.Config_sit" - } - }, - "policy_filter_matches": { - "test_scope_prefix.Config_consectetur": {}, - "test_scope_prefix.Config_ipsum": {}, - "test_scope_prefix.Config_sit": {} - }, - "removed_policies": {} - }, - "method": "put", - "params": { - "cfy_tenant_name": "default_tenant" - }, - "uri": "http://unit-test-deployment_handler:8188000/policy" - }, - "res": "*", - "status_code": 200 - } - ] -} diff --git a/tests/main/mock_policy_engine.py b/tests/main/mock_policy_engine.py deleted file mode 100644 index 1bac045..0000000 --- a/tests/main/mock_policy_engine.py +++ /dev/null @@ -1,96 +0,0 @@ -# ============LICENSE_START======================================================= -# Copyright (c) 2018-2019 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========================================================= -# -"""mocking for the policy-engine - shared by many tests""" - -import copy -import json - -from policyhandler.pdp_api.pdp_consts import (PDP_METADATA, - PDP_POLICY_ID, - PDP_POLICY_VERSION, - PDP_POLICIES, PDP_PROPERTIES) -from policyhandler.pdp_api.policy_utils import PolicyUtils -from policyhandler.utils import Utils - -_LOGGER = Utils.get_logger(__file__) - - -class MockPolicyEngine(object): - """pretend this is the policy-engine""" - scope_prefix = "test_scope_prefix.pdp_desition_" - LOREM_IPSUM = """Lorem ipsum dolor sit amet consectetur ametist""".split() - LONG_TEXT = "0123456789" * 100 - _policies = {} - - _inited = False - - @staticmethod - def init(): - """init collection of policies: policy_version = policy_index + 1""" - if MockPolicyEngine._inited: - return - MockPolicyEngine._inited = True - - MockPolicyEngine._policies = dict( - (policy_id, MockPolicyEngine._create_policy_body(policy_id, policy_version)) - for policy_id, policy_version in - [(MockPolicyEngine.get_policy_id(policy_index), policy_index + 1) - for policy_index in range(1 + len(MockPolicyEngine.LOREM_IPSUM))] - ) - _LOGGER.info("_policies: %s", json.dumps(MockPolicyEngine._policies)) - - @staticmethod - def get_policy_id(policy_index): - """get the policy_id by policy_index""" - return (MockPolicyEngine.scope_prefix - + MockPolicyEngine.LOREM_IPSUM[ - policy_index % len(MockPolicyEngine.LOREM_IPSUM)]) - - @staticmethod - def get_policy(policy_id): - """find policy the way the policy-engine finds""" - if policy_id not in MockPolicyEngine._policies: - return {} - return {PDP_POLICIES: {policy_id: copy.deepcopy(MockPolicyEngine._policies[policy_id])}} - - @staticmethod - def gen_policy_latest(policy_index, version_offset=0): - """generate the policy response from policy-handler by policy_index = version - 1""" - policy_id = MockPolicyEngine.get_policy_id(policy_index) - policy = PolicyUtils.convert_to_policy( - MockPolicyEngine._create_policy_body(policy_id, policy_index + 1 - version_offset) - ) - return policy_id, policy - - @staticmethod - def _create_policy_body(policy_id, policy_version=1): - """returns a fake policy-body""" - return { - "type": "unit.test.type.policies", - "version": "1.0.0", - PDP_METADATA: { - PDP_POLICY_ID: policy_id, - PDP_POLICY_VERSION: policy_version, - "description": "description for {}".format(policy_id) - }, - PDP_PROPERTIES: { - "policy_updated_from_ver": (policy_version - 1), - "policy_updated_to_ver": policy_version, - "policy_hello": "world!", - "updated_policy_id": policy_id - } - } diff --git a/tests/main/pdp_policies.json b/tests/main/pdp_policies.json deleted file mode 100644 index b7d0d9e..0000000 --- a/tests/main/pdp_policies.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "policies": { - "onap.scaleout.tca": { - "type": "onap.policies.monitoring.cdap.tca.hi.lo.app", - "version": "1.0.0", - "metadata": { - "policy-id": "onap.scaleout.tca", - "policy-version": 1, - "description": "The scaleout policy for vDNS" - }, - "properties": { - "tca_policy": { - "domain": "measurementsForVfScaling", - "metricsPerEventName": [ - { - "eventName": "vLoadBalancer", - "controlLoopSchemaType": "VNF", - "policyScope": "type=configuration" - } - ] - } - } - } - } -}
\ No newline at end of file diff --git a/tests/main/test_policyhandler.py b/tests/main/test_policyhandler.py index 73ab9ca..c474e29 100644 --- a/tests/main/test_policyhandler.py +++ b/tests/main/test_policyhandler.py @@ -1,5 +1,5 @@ # ============LICENSE_START======================================================= -# Copyright (c) 2017-2019 AT&T Intellectual Property. All rights reserved. +# Copyright (c) 2017-2020 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. @@ -21,20 +21,17 @@ import json import time import uuid -import cherrypy import pytest -from cherrypy.test.helper import CPWebCase +import cherrypy -from policyhandler.config import Config -from policyhandler.onap.audit import REQUEST_X_ECOMP_REQUESTID, Audit -from policyhandler.pdp_api.pdp_consts import POLICY_NAME -from policyhandler.policy_consts import LATEST_POLICIES +from cherrypy.test.helper import CPWebCase +from policyhandler.onap.audit import (REQUEST_X_ECOMP_REQUESTID, + REQUEST_X_ONAP_REQUESTID, Audit) from policyhandler.policy_receiver import PolicyReceiver from policyhandler.utils import Utils from policyhandler.web_server import _PolicyWeb from ..mock_tracker import Tracker -from .mock_policy_engine import MockPolicyEngine _LOGGER = Utils.get_logger(__file__) @@ -59,7 +56,27 @@ class WebServerTest(CPWebCase): def test_web_policy_latest(self): """test /policy_latest/<policy-id>""" - policy_id, expected_policy = MockPolicyEngine.gen_policy_latest(3) + policy_id = "test_scope_prefix.pdp_decision_sit" + expected_policy = { + "policy_id": "test_scope_prefix.pdp_decision_sit", + "policy_body": { + "type": "unit.test.type.policies", + "version": "1.0.0", + "metadata": { + "policy-id": "test_scope_prefix.pdp_decision_sit", + "policy-version": "4.4.4", + "description": "description for test_scope_prefix.pdp_decision_sit" + }, + "policyName": "test_scope_prefix.pdp_decision_sit.4-4-4.xml", + "policyVersion": "4.4.4", + "config": { + "policy_updated_from_ver": 3, + "policy_updated_to_ver": 4, + "policy_hello": "world!", + "updated_policy_id": "test_scope_prefix.pdp_decision_sit" + } + } + } self.getPage("/policy_latest/{0}".format(policy_id or "")) self.assertStatus('200 OK') @@ -83,15 +100,17 @@ class WebServerTest(CPWebCase): _LOGGER.info("result: %s", result) _LOGGER.info("body: %s", self.body) - self.assertStatus('404 Not Found') + self.assertStatus('200 OK') def test_web_policies_latest(self): """test POST /policies_latest with policyName""" body = json.dumps({"junk": "to-be-developed"}) + request_id = str(uuid.uuid4()) result = self.getPage("/policies_latest", method='POST', body=body, headers=[ - (REQUEST_X_ECOMP_REQUESTID, str(uuid.uuid4())), + (REQUEST_X_ECOMP_REQUESTID, request_id), + (REQUEST_X_ONAP_REQUESTID, request_id), ("Content-Type", "application/json"), ('Content-Length', str(len(body))) ]) @@ -102,17 +121,20 @@ class WebServerTest(CPWebCase): @pytest.mark.usefixtures( "fix_deploy_handler", + "fix_dmaap_mr", "fix_cherrypy_engine_exit") def test_zzzzz_shutdown(self): """test shutdown""" - _LOGGER.info("start shutdown") + _LOGGER.info("testing the shutdown") assert not PolicyReceiver.is_running() - audit = Audit(job_name="test_zzzzz_shutdown", req_message="start shutdown") + audit = Audit(job_name="test_zzzzz_shutdown", req_message="testing the shutdown") PolicyReceiver.run(audit) result = self.getPage("/healthcheck") _LOGGER.info("healthcheck result: %s", result) + time.sleep(1) + WebServerTest.do_gc_test = False _LOGGER.info("shutdown...") audit.audit_done("shutdown") @@ -120,11 +142,32 @@ class WebServerTest(CPWebCase): _LOGGER.info("shutdown result: %s", result) self.assertStatus('200 OK') _LOGGER.info("got shutdown: %s", self.body) - time.sleep(1) + time.sleep(5) assert not PolicyReceiver.is_running() - if Config.is_pdp_api_default(): - _LOGGER.info("passive for new PDP API") - return + Tracker.validate() + + @pytest.mark.usefixtures( + "fix_deploy_handler", + "fix_dmaap_mr", + "fix_cherrypy_engine_exit") + def test_zzz_policy_updates_and_catch_ups(self): + """test run policy handler with policy updates and catchups""" + _LOGGER.info("start policy_updates_and_catch_ups") + assert not PolicyReceiver.is_running() + + audit = Audit(job_name="test_zzz_policy_updates_and_catch_ups", + req_message="start policy_updates_and_catch_ups") + PolicyReceiver.run(audit) + + _LOGGER.info("sleep 20 before shutdown...") + time.sleep(20) + + result = self.getPage("/healthcheck") + _LOGGER.info("healthcheck result: %s", result) + + PolicyReceiver.shutdown(audit) + time.sleep(5) + assert not PolicyReceiver.is_running() Tracker.validate() diff --git a/tests/main/test_pz_catch_up.py b/tests/main/test_pz_catch_up.py new file mode 100644 index 0000000..03f5957 --- /dev/null +++ b/tests/main/test_pz_catch_up.py @@ -0,0 +1,63 @@ +# ============LICENSE_START======================================================= +# Copyright (c) 2020 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========================================================= +# +"""test policy catch_up methods directly""" + +import json +import time + +import pytest + +from policyhandler.onap.audit import Audit +from policyhandler.policy_receiver import PolicyReceiver +from policyhandler.utils import Utils + +from ..mock_tracker import Tracker + +_LOGGER = Utils.get_logger(__file__) + +@pytest.mark.usefixtures( + "fix_pdp_authorization", + "fix_discovery", + "fix_pdp_post", + "fix_deploy_handler", + "fix_dmaap_mr", + "fix_auto_catch_up" +) +def test_catch_up(): + """test run policy handler with catchups and failed deployment-handler""" + _LOGGER.info("start test_catch_up") + assert not PolicyReceiver.is_running() + audit = Audit(job_name="test_catch_up", req_message="start test_catch_up") + PolicyReceiver.run(audit) + + _LOGGER.info("sleep 12 before shutdown...") + time.sleep(12) + + health = audit.health(full=True) + audit.audit_done(result=json.dumps(health)) + + _LOGGER.info("healthcheck: %s", json.dumps(health)) + assert bool(health) + + PolicyReceiver.shutdown(audit) + time.sleep(5) + assert not PolicyReceiver.is_running() + + health = audit.health(full=True) + _LOGGER.info("healthcheck: %s", json.dumps(health)) + + Tracker.validate() diff --git a/tests/mock_config.json b/tests/mock_config.json index 30e3251..50e8862 100644 --- a/tests/mock_config.json +++ b/tests/mock_config.json @@ -29,6 +29,19 @@ "timeout_in_secs": 1, "ws_ping_interval_in_secs": 1800 }, + "dmaap_mr" : { + "url" : "https://unit-test-dmaap-mr:280800000/events/unit-test-topicname/unit-test-consumegroup/unit-test-consumerid", + "query": { + "timeout": 15000 + }, + "headers" : { + "Content-Type" : "application/json", + "Authorization" : "Basic auth" + }, + "target_entity" : "dmaap_mr", + "tls_ca_mode" : "cert_directory", + "timeout_in_secs": 60 + }, "deploy_handler" : { "target_entity" : "deployment_handler", "url" : "http://unit-test-deployment_handler:8188000", diff --git a/tests/mock_settings.py b/tests/mock_settings.py index 9e99561..dcfebcb 100644 --- a/tests/mock_settings.py +++ b/tests/mock_settings.py @@ -1,5 +1,5 @@ # ============LICENSE_START======================================================= -# Copyright (c) 2018-2019 AT&T Intellectual Property. All rights reserved. +# Copyright (c) 2018-2020 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. @@ -65,14 +65,16 @@ class MockSettings(object): deploy_handler_instance_uuid = str(uuid.uuid4()) @staticmethod - def init(): + def init_mock_config(): """init configs""" if MockSettings._loaded: _LOGGER.info("testing policy_handler with config: %s", Config.discovered_config) return MockSettings._loaded = True - Config.init_config("tests/etc_config.json") + _LOGGER.info("init MockSettings") + + MockSettings.reinit_mock_config() with open("tests/mock_config.json", 'r') as config_json: MockSettings.mock_config = json.load(config_json) @@ -118,3 +120,8 @@ class MockSettings(object): importlib.reload(importlib.import_module("policyhandler.pdp_client")) _LOGGER.info("done setup_pdp_api %s", Config._pdp_api_version) + + @staticmethod + def reinit_mock_config(): + """reload the init configs""" + Config.init_config("tests/etc_config.json") diff --git a/tests/mock_tracker.py b/tests/mock_tracker.py index a5fffd5..2b51983 100644 --- a/tests/mock_tracker.py +++ b/tests/mock_tracker.py @@ -1,5 +1,5 @@ # ============LICENSE_START======================================================= -# Copyright (c) 2018-2019 AT&T Intellectual Property. All rights reserved. +# Copyright (c) 2018-2020 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. @@ -20,9 +20,12 @@ import copy import json from policyhandler.config import Config -from policyhandler.onap.audit import REQUEST_X_ECOMP_REQUESTID +from policyhandler.onap.audit import (REQUEST_X_ECOMP_REQUESTID, + REQUEST_X_ONAP_REQUESTID) from policyhandler.utils import Utils +REQUEST = "request" +STATUS_CODE = "status_code" RESPONSE = "res" PEP_INSTANCE = "ONAPInstance" _LOGGER = Utils.get_logger(__file__) @@ -49,15 +52,21 @@ class _MockHttpRequestInResponse(object): class MockHttpResponse(object): """Mock http response based on request""" - def __init__(self, method, uri, res_json, **kwargs): + def __init__(self, method, uri, res_json=None, **kwargs): """create response based on request""" self.request = _MockHttpRequestInResponse(method, uri, **kwargs) - - self.status_code = kwargs.get("status_code", 200) - self.res = copy.deepcopy(res_json) + self.headers = {} + + self.status_code, self.res = Tracker.get_response(self.request.to_json()) + if self.status_code is None and res_json: + self.status_code = kwargs.get(STATUS_CODE, 200) + if res_json: + self.res = copy.deepcopy(res_json) + if self.status_code is None: + self.status_code = 500 self.text = json.dumps(self.res) - self._track() + _LOGGER.info("MockHttpResponse: %s", self) def json(self): """returns json of response""" @@ -70,15 +79,11 @@ class MockHttpResponse(object): def to_json(self): """create json of the message""" return { - "request": self.request.to_json(), - "status_code": self.status_code, + REQUEST: self.request.to_json(), + STATUS_CODE: self.status_code, RESPONSE: self.res } - def _track(self): - """append the message to tracker's history""" - Tracker.track(self.to_json()) - def __str__(self): """stringify for logging""" return json.dumps(self.to_json(), sort_keys=True) @@ -87,30 +92,88 @@ class MockHttpResponse(object): class Tracker(object): """record all the messages going outside policy-handler during testing""" test_name = None - messages = [] test_names = [] + + requests = [] + expected = [] + validated_tests = {} valid_tests = {} + main_history = {} + pdp_api_v0_history = {} + + @staticmethod + def _init(): + """load expected data from json files""" + try: + with open("tests/main/expectations.json", 'r') as expectations: + Tracker.main_history = json.load(expectations) + except Exception: + Tracker.main_history = {} + + try: + with open("tests/pdp_api_v0/expectations.json", 'r') as expectations: + Tracker.pdp_api_v0_history = json.load(expectations) + except Exception: + Tracker.pdp_api_v0_history = {} + @staticmethod def reset(test_name=None): """remove all the messages from history""" + if not Tracker.test_names: + Tracker._init() + Tracker.test_name = test_name - Tracker.messages.clear() + Tracker.requests.clear() Tracker.test_names.append(test_name) + if Config.is_pdp_api_default(): + Tracker.expected = Tracker.main_history.get(Tracker.test_name, []) + else: + Tracker.expected = Tracker.pdp_api_v0_history.get(Tracker.test_name, []) + + @staticmethod - def track(message): - """append the tracked message to the history""" - message = copy.deepcopy(message) - Tracker.messages.append(message) - if _LOGGER: - _LOGGER.info("tracked_message: %s", json.dumps(message, sort_keys=True)) + def get_response(request): + """ + track the request to the history of requests + and return the response with the status_code from the expected history queue + """ + request_idx = len(Tracker.requests) + request = copy.deepcopy(request) + Tracker.requests.append(request) + + if request_idx < len(Tracker.expected): + expected = Tracker.expected[request_idx] or {} + masked_request = Tracker._hide_volatiles(copy.deepcopy(request)) + expected_request = Tracker._hide_volatiles(copy.deepcopy(expected.get(REQUEST))) + if Utils.are_the_same(masked_request, expected_request): + _LOGGER.info("as expected[%s]: %s", request_idx, + json.dumps(expected, sort_keys=True)) + return expected.get(STATUS_CODE), expected.get(RESPONSE) + + unexpected_request = {"unit-test-tracker": { + "request_idx": request_idx, + "received_request": copy.deepcopy(request), + "expected": copy.deepcopy(expected.get(REQUEST)) + }} + _LOGGER.error("unexpected_request[%s]: %s", request_idx, + json.dumps(unexpected_request, sort_keys=True)) + return None, unexpected_request + + unexpected_request = {"unit-test-tracker":{ + "request_idx": request_idx, "out-of-range": len(Tracker.expected), + "received_request": copy.deepcopy(request) + }} + _LOGGER.error("unexpected_request[%s]: %s", request_idx, + json.dumps(unexpected_request, sort_keys=True)) + return None, unexpected_request @staticmethod def to_string(): """stringify message history for logging""" - return json.dumps(Tracker.messages, sort_keys=True) + return json.dumps(Tracker.requests, sort_keys=True) @staticmethod def get_status(test_name=None): @@ -131,15 +194,14 @@ class Tracker(object): for idx, test_name in enumerate(Tracker.test_names): _LOGGER.info("%s[%s]: %s", Tracker.get_status(test_name), (idx + 1), test_name) - _LOGGER.info("not tracked test_names listed in main.mock_expected") - from .main.mock_expected import HISTORY_EXPECTED as main_history - for test_name in main_history: + _LOGGER.info("not tracked test_names listed in main.expectations") + + for test_name in Tracker.main_history: if test_name not in Tracker.test_names: _LOGGER.info("untracked: %s", test_name) - _LOGGER.info("not tracked test_names listed in pdp_api_v0.mock_expected") - from .pdp_api_v0.mock_expected import HISTORY_EXPECTED as pdp_api_v0_history - for test_name in pdp_api_v0_history: + _LOGGER.info("not tracked test_names listed in pdp_api_v0.expectations") + for test_name in Tracker.pdp_api_v0_history: if test_name not in Tracker.test_names: _LOGGER.info("untracked: %s", test_name) @@ -150,7 +212,7 @@ class Tracker(object): return obj for key, value in obj.items(): - if key in [REQUEST_X_ECOMP_REQUESTID, RESPONSE, PEP_INSTANCE]: + if key in [REQUEST_X_ONAP_REQUESTID, REQUEST_X_ECOMP_REQUESTID, RESPONSE, PEP_INSTANCE]: obj[key] = "*" elif isinstance(value, dict): obj[key] = Tracker._hide_volatiles(value) @@ -161,20 +223,15 @@ class Tracker(object): def validate(): """validate that the message history is as expected""" _LOGGER.info("Tracker.validate(%s)", Tracker.test_name) - messages = [Tracker._hide_volatiles(copy.deepcopy(message)) - for message in Tracker.messages] Tracker.validated_tests[Tracker.test_name] = True - - if Config.is_pdp_api_default(): - from .main.mock_expected import HISTORY_EXPECTED as main_history - expected = main_history.get(Tracker.test_name, []) - else: - from .pdp_api_v0.mock_expected import HISTORY_EXPECTED as pdp_api_v0_history - expected = pdp_api_v0_history.get(Tracker.test_name, []) - - _LOGGER.info("messages: %s", json.dumps(messages, sort_keys=True)) - _LOGGER.info("expected: %s", json.dumps(expected, sort_keys=True)) - assert Utils.are_the_same(messages, expected) + requests = [Tracker._hide_volatiles(copy.deepcopy(request)) + for request in Tracker.requests] + expected_reqs = [Tracker._hide_volatiles(copy.deepcopy(expected.get(REQUEST))) + for expected in Tracker.expected] + + _LOGGER.info("requests: %s", json.dumps(requests, sort_keys=True)) + _LOGGER.info("expected: %s", json.dumps(expected_reqs, sort_keys=True)) + assert Utils.are_the_same(requests, expected_reqs) _LOGGER.info("history valid for Tracker.validate(%s)", Tracker.test_name) Tracker.valid_tests[Tracker.test_name] = True diff --git a/tests/pdp_api_v0/conftest.py b/tests/pdp_api_v0/conftest.py index 07e566f..8220778 100644 --- a/tests/pdp_api_v0/conftest.py +++ b/tests/pdp_api_v0/conftest.py @@ -1,5 +1,5 @@ # ============LICENSE_START======================================================= -# Copyright (c) 2018-2019 AT&T Intellectual Property. All rights reserved. +# Copyright (c) 2018-2020 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. @@ -22,11 +22,14 @@ https://docs.pytest.org/en/latest/fixture.html import pytest from policyhandler import pdp_client +from policyhandler.deploy_handler import DeployHandler +from policyhandler.onap.audit import Audit from policyhandler.pdp_api_v0.pdp_consts import POLICY_NAME from policyhandler.utils import Utils from ..mock_settings import MockSettings from ..mock_tracker import MockHttpResponse +from .mock_deploy_handler import MockDeploymentHandler from .mock_policy_engine import MockPolicyEngine2018 from .mock_websocket import MockWebSocket @@ -57,9 +60,10 @@ def fix_pdp_post(monkeypatch): def monkeyed_policy_rest_post(uri, json=None, **kwargs): """monkeypatch for the POST to policy-engine""" res_json = MockPolicyEngine2018.get_config(json.get(POLICY_NAME)) - return MockHttpResponse("post", uri, res_json, json=json, **kwargs) + return MockHttpResponse("post", uri, res_json=res_json, json=json, **kwargs) _LOGGER.info("setup fix_pdp_post") + pdp_client.PolicyRest._lazy_inited = False pdp_client.PolicyRest._lazy_init() monkeypatch.setattr('policyhandler.pdp_client.PolicyRest._requests_session.post', monkeyed_policy_rest_post) @@ -72,9 +76,10 @@ def fix_pdp_post_big(monkeypatch): def monkeyed_policy_rest_post(uri, **kwargs): """monkeypatch for the POST to policy-engine""" res_json = MockPolicyEngine2018.get_configs_all() - return MockHttpResponse("post", uri, res_json, **kwargs) + return MockHttpResponse("post", uri, res_json=res_json, **kwargs) _LOGGER.info("setup fix_pdp_post_big") + pdp_client.PolicyRest._lazy_inited = False pdp_client.PolicyRest._lazy_init() monkeypatch.setattr('policyhandler.pdp_client.PolicyRest._requests_session.post', monkeyed_policy_rest_post) @@ -94,6 +99,7 @@ def fix_pdp_post_boom(monkeypatch): raise MockException("fix_pdp_post_boom {}".format(uri)) _LOGGER.info("setup fix_pdp_post_boom") + pdp_client.PolicyRest._lazy_inited = False pdp_client.PolicyRest._lazy_init() monkeypatch.setattr('policyhandler.pdp_client.PolicyRest._requests_session.post', monkeyed_policy_rest_post_boom) @@ -131,3 +137,96 @@ def fix_select_latest_policies_boom(monkeypatch): yield fix_select_latest_policies_boom _LOGGER.info("teardown fix_select_latest_policies_boom at %s", policy_utils_path) + +@pytest.fixture() +def fix_deploy_handler(monkeypatch): + """monkeyed requests to deployment-handler""" + def monkeyed_deploy_handler_put(uri, **kwargs): + """monkeypatch for policy-update request.put to deploy_handler""" + return MockHttpResponse("put", uri, res_json=MockDeploymentHandler.default_response(), + **kwargs) + + def monkeyed_deploy_handler_get(uri, **kwargs): + """monkeypatch policy-update request.get to deploy_handler""" + return MockHttpResponse("get", uri, + res_json=MockDeploymentHandler.get_deployed_policies(), + **kwargs) + + _LOGGER.info("setup fix_deploy_handler") + audit = None + if DeployHandler._lazy_inited is False: + audit = Audit(req_message="fix_deploy_handler") + DeployHandler._lazy_init(audit) + + monkeypatch.setattr('policyhandler.deploy_handler.DeployHandler._requests_session.put', + monkeyed_deploy_handler_put) + monkeypatch.setattr('policyhandler.deploy_handler.DeployHandler._requests_session.get', + monkeyed_deploy_handler_get) + + yield fix_deploy_handler + if audit: + audit.audit_done("teardown") + _LOGGER.info("teardown fix_deploy_handler") + + +@pytest.fixture() +def fix_deploy_handler_413(monkeypatch): + """monkeyed failed discovery request.get""" + def monkeyed_deploy_handler_put(uri, **kwargs): + """monkeypatch for deploy_handler""" + return MockHttpResponse( + "put", uri, + res_json={"server_instance_uuid": MockSettings.deploy_handler_instance_uuid}, + status_code=413, **kwargs + ) + + def monkeyed_deploy_handler_get(uri, **kwargs): + """monkeypatch policy-update request.get to deploy_handler""" + return MockHttpResponse("get", uri, res_json=MockDeploymentHandler.get_deployed_policies(), + **kwargs) + + _LOGGER.info("setup fix_deploy_handler_413") + audit = None + if DeployHandler._lazy_inited is False: + audit = Audit(req_message="fix_deploy_handler_413") + DeployHandler._lazy_init(audit) + + monkeypatch.setattr('policyhandler.deploy_handler.DeployHandler._requests_session.put', + monkeyed_deploy_handler_put) + monkeypatch.setattr('policyhandler.deploy_handler.DeployHandler._requests_session.get', + monkeyed_deploy_handler_get) + + yield fix_deploy_handler_413 + if audit: + audit.audit_done("teardown") + _LOGGER.info("teardown fix_deploy_handler_413") + + +@pytest.fixture() +def fix_deploy_handler_404(monkeypatch): + """monkeyed failed discovery request.get""" + def monkeyed_deploy_handler_put(uri, **kwargs): + """monkeypatch for deploy_handler""" + return MockHttpResponse("put", uri, res_json=MockDeploymentHandler.default_response(), + **kwargs) + + def monkeyed_deploy_handler_get(uri, **kwargs): + """monkeypatch policy-update request.get to deploy_handler""" + return MockHttpResponse("get", uri, res_json=MockDeploymentHandler.default_response(), + **kwargs) + + _LOGGER.info("setup fix_deploy_handler_404") + audit = None + if DeployHandler._lazy_inited is False: + audit = Audit(req_message="fix_deploy_handler_404") + DeployHandler._lazy_init(audit) + + monkeypatch.setattr('policyhandler.deploy_handler.DeployHandler._requests_session.put', + monkeyed_deploy_handler_put) + monkeypatch.setattr('policyhandler.deploy_handler.DeployHandler._requests_session.get', + monkeyed_deploy_handler_get) + + yield fix_deploy_handler_404 + if audit: + audit.audit_done("teardown") + _LOGGER.info("teardown fix_deploy_handler_404") diff --git a/tests/pdp_api_v0/mock_expected.py b/tests/pdp_api_v0/expectations.json index 6210e10..9c7a285 100644 --- a/tests/pdp_api_v0/mock_expected.py +++ b/tests/pdp_api_v0/expectations.json @@ -1,24 +1,5 @@ -# ============LICENSE_START======================================================= -# Copyright (c) 2018-2019 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========================================================= -# -"""expected message history per test for pdp API 2018 and before""" - - -HISTORY_EXPECTED = { - "tests/pdp_api_v0/test_policy_rest.py::test_get_policy_latest" : [ +{ + "tests/pdp_api_v0/test_policy_rest.py::test_get_policy_latest": [ { "request": { "headers": { @@ -27,13 +8,37 @@ HISTORY_EXPECTED = { "ClientAuth": "Basic user", "Content-Type": "application/json", "Environment": "TEST", + "X-ONAP-RequestID": "*", "X-ECOMP-RequestID": "*" }, "json": { "policyName": "test_scope_prefix.Config_sit" }, "method": "post", - "params": None, + "params": null, + "uri": "https://unit-test-pdp-server:8081000/pdp/api/getConfig" + }, + "res": "*", + "status_code": 200 + } + ], + "tests/pdp_api_v0/test_policy_rest_auth.py::test_get_policy_latest": [ + { + "request": { + "headers": { + "Accept": "application/json", + "Authorization": "Basic YWxleC1QRFBfVVNFUjphbGV4LVBEUF9QV0Q=", + "ClientAuth": "Basic user", + "Content-Type": "application/json", + "Environment": "TEST", + "X-ONAP-RequestID": "*", + "X-ECOMP-RequestID": "*" + }, + "json": { + "policyName": "test_scope_prefix.Config_sit" + }, + "method": "post", + "params": null, "uri": "https://unit-test-pdp-server:8081000/pdp/api/getConfig" }, "res": "*", @@ -44,9 +49,10 @@ HISTORY_EXPECTED = { { "request": { "headers": { + "X-ONAP-RequestID": "*", "X-ECOMP-RequestID": "*" }, - "json": None, + "json": null, "method": "get", "params": { "cfy_tenant_name": "default_tenant" @@ -64,13 +70,14 @@ HISTORY_EXPECTED = { "ClientAuth": "Basic user", "Content-Type": "application/json", "Environment": "TEST", + "X-ONAP-RequestID": "*", "X-ECOMP-RequestID": "*" }, "json": { "policyName": "test_scope_prefix.Config_.*" }, "method": "post", - "params": None, + "params": null, "uri": "https://unit-test-pdp-server:8081000/pdp/api/getConfig" }, "res": "*", @@ -86,13 +93,14 @@ HISTORY_EXPECTED = { "ClientAuth": "Basic user", "Content-Type": "application/json", "Environment": "TEST", + "X-ONAP-RequestID": "*", "X-ECOMP-RequestID": "*" }, "json": { "policyName": "test_scope_prefix.Config_amet.*" }, "method": "post", - "params": None, + "params": null, "uri": "https://unit-test-pdp-server:8081000/pdp/api/getConfig" }, "res": "*", @@ -108,13 +116,14 @@ HISTORY_EXPECTED = { "ClientAuth": "Basic user", "Content-Type": "application/json", "Environment": "TEST", + "X-ONAP-RequestID": "*", "X-ECOMP-RequestID": "*" }, "json": { "policyName": "test_scope_prefix.Config_sit" }, "method": "post", - "params": None, + "params": null, "uri": "https://unit-test-pdp-server:8081000/pdp/api/getConfig" }, "res": "*", @@ -125,9 +134,10 @@ HISTORY_EXPECTED = { { "request": { "headers": { + "X-ONAP-RequestID": "*", "X-ECOMP-RequestID": "*" }, - "json": None, + "json": null, "method": "get", "params": { "cfy_tenant_name": "default_tenant" @@ -145,13 +155,14 @@ HISTORY_EXPECTED = { "ClientAuth": "Basic user", "Content-Type": "application/json", "Environment": "TEST", + "X-ONAP-RequestID": "*", "X-ECOMP-RequestID": "*" }, "json": { "policyName": "test_scope_prefix.Config_.*" }, "method": "post", - "params": None, + "params": null, "uri": "https://unit-test-pdp-server:8081000/pdp/api/getConfig" }, "res": "*", @@ -160,10 +171,11 @@ HISTORY_EXPECTED = { { "request": { "headers": { + "X-ONAP-RequestID": "*", "X-ECOMP-RequestID": "*" }, "json": { - "catch_up": True, + "catch_up": true, "latest_policies": { "test_scope_prefix.Config_Lorem": { "policy_body": { @@ -181,7 +193,7 @@ HISTORY_EXPECTED = { "policyConfigStatus": "CONFIG_RETRIEVED", "policyName": "test_scope_prefix.Config_Lorem.1.xml", "policyVersion": "1", - "property": None, + "property": null, "responseAttributes": {}, "type": "JSON" }, @@ -203,7 +215,7 @@ HISTORY_EXPECTED = { "policyConfigStatus": "CONFIG_RETRIEVED", "policyName": "test_scope_prefix.Config_amet.5.xml", "policyVersion": "5", - "property": None, + "property": null, "responseAttributes": {}, "type": "JSON" }, @@ -225,7 +237,7 @@ HISTORY_EXPECTED = { "policyConfigStatus": "CONFIG_RETRIEVED", "policyName": "test_scope_prefix.Config_ametist.7.xml", "policyVersion": "7", - "property": None, + "property": null, "responseAttributes": {}, "type": "JSON" }, @@ -247,7 +259,7 @@ HISTORY_EXPECTED = { "policyConfigStatus": "CONFIG_RETRIEVED", "policyName": "test_scope_prefix.Config_consectetur.6.xml", "policyVersion": "6", - "property": None, + "property": null, "responseAttributes": {}, "type": "JSON" }, @@ -269,7 +281,7 @@ HISTORY_EXPECTED = { "policyConfigStatus": "CONFIG_RETRIEVED", "policyName": "test_scope_prefix.Config_dolor.3.xml", "policyVersion": "3", - "property": None, + "property": null, "responseAttributes": {}, "type": "JSON" }, @@ -291,7 +303,7 @@ HISTORY_EXPECTED = { "policyConfigStatus": "CONFIG_RETRIEVED", "policyName": "test_scope_prefix.Config_ipsum.2.xml", "policyVersion": "2", - "property": None, + "property": null, "responseAttributes": {}, "type": "JSON" }, @@ -313,7 +325,7 @@ HISTORY_EXPECTED = { "policyConfigStatus": "CONFIG_RETRIEVED", "policyName": "test_scope_prefix.Config_sit.4.xml", "policyVersion": "4", - "property": None, + "property": null, "responseAttributes": {}, "type": "JSON" }, @@ -343,9 +355,10 @@ HISTORY_EXPECTED = { { "request": { "headers": { + "X-ONAP-RequestID": "*", "X-ECOMP-RequestID": "*" }, - "json": None, + "json": null, "method": "get", "params": { "cfy_tenant_name": "default_tenant" @@ -363,13 +376,14 @@ HISTORY_EXPECTED = { "ClientAuth": "Basic user", "Content-Type": "application/json", "Environment": "TEST", + "X-ONAP-RequestID": "*", "X-ECOMP-RequestID": "*" }, "json": { "policyName": "test_scope_prefix.Config_.*" }, "method": "post", - "params": None, + "params": null, "uri": "https://unit-test-pdp-server:8081000/pdp/api/getConfig" }, "res": "*", @@ -378,10 +392,11 @@ HISTORY_EXPECTED = { { "request": { "headers": { + "X-ONAP-RequestID": "*", "X-ECOMP-RequestID": "*" }, "json": { - "catch_up": True, + "catch_up": true, "latest_policies": { "test_scope_prefix.Config_Lorem": { "policy_body": { @@ -399,7 +414,7 @@ HISTORY_EXPECTED = { "policyConfigStatus": "CONFIG_RETRIEVED", "policyName": "test_scope_prefix.Config_Lorem.1.xml", "policyVersion": "1", - "property": None, + "property": null, "responseAttributes": {}, "type": "JSON" }, @@ -421,7 +436,7 @@ HISTORY_EXPECTED = { "policyConfigStatus": "CONFIG_RETRIEVED", "policyName": "test_scope_prefix.Config_amet.5.xml", "policyVersion": "5", - "property": None, + "property": null, "responseAttributes": {}, "type": "JSON" }, @@ -443,7 +458,7 @@ HISTORY_EXPECTED = { "policyConfigStatus": "CONFIG_RETRIEVED", "policyName": "test_scope_prefix.Config_ametist.7.xml", "policyVersion": "7", - "property": None, + "property": null, "responseAttributes": {}, "type": "JSON" }, @@ -465,7 +480,7 @@ HISTORY_EXPECTED = { "policyConfigStatus": "CONFIG_RETRIEVED", "policyName": "test_scope_prefix.Config_consectetur.6.xml", "policyVersion": "6", - "property": None, + "property": null, "responseAttributes": {}, "type": "JSON" }, @@ -487,7 +502,7 @@ HISTORY_EXPECTED = { "policyConfigStatus": "CONFIG_RETRIEVED", "policyName": "test_scope_prefix.Config_dolor.3.xml", "policyVersion": "3", - "property": None, + "property": null, "responseAttributes": {}, "type": "JSON" }, @@ -509,7 +524,7 @@ HISTORY_EXPECTED = { "policyConfigStatus": "CONFIG_RETRIEVED", "policyName": "test_scope_prefix.Config_ipsum.2.xml", "policyVersion": "2", - "property": None, + "property": null, "responseAttributes": {}, "type": "JSON" }, @@ -531,7 +546,7 @@ HISTORY_EXPECTED = { "policyConfigStatus": "CONFIG_RETRIEVED", "policyName": "test_scope_prefix.Config_sit.4.xml", "policyVersion": "4", - "property": None, + "property": null, "responseAttributes": {}, "type": "JSON" }, @@ -563,9 +578,10 @@ HISTORY_EXPECTED = { { "request": { "headers": { + "X-ONAP-RequestID": "*", "X-ECOMP-RequestID": "*" }, - "json": None, + "json": null, "method": "get", "params": { "cfy_tenant_name": "default_tenant" @@ -583,13 +599,14 @@ HISTORY_EXPECTED = { "ClientAuth": "Basic user", "Content-Type": "application/json", "Environment": "TEST", + "X-ONAP-RequestID": "*", "X-ECOMP-RequestID": "*" }, "json": { "policyName": "test_scope_prefix.Config_.*" }, "method": "post", - "params": None, + "params": null, "uri": "https://unit-test-pdp-server:8081000/pdp/api/getConfig" }, "res": "*", @@ -598,10 +615,11 @@ HISTORY_EXPECTED = { { "request": { "headers": { + "X-ONAP-RequestID": "*", "X-ECOMP-RequestID": "*" }, "json": { - "catch_up": True, + "catch_up": true, "latest_policies": { "test_scope_prefix.Config_Lorem": { "policy_body": { @@ -619,7 +637,7 @@ HISTORY_EXPECTED = { "policyConfigStatus": "CONFIG_RETRIEVED", "policyName": "test_scope_prefix.Config_Lorem.1.xml", "policyVersion": "1", - "property": None, + "property": null, "responseAttributes": {}, "type": "JSON" }, @@ -641,7 +659,7 @@ HISTORY_EXPECTED = { "policyConfigStatus": "CONFIG_RETRIEVED", "policyName": "test_scope_prefix.Config_amet.5.xml", "policyVersion": "5", - "property": None, + "property": null, "responseAttributes": {}, "type": "JSON" }, @@ -663,7 +681,7 @@ HISTORY_EXPECTED = { "policyConfigStatus": "CONFIG_RETRIEVED", "policyName": "test_scope_prefix.Config_ametist.7.xml", "policyVersion": "7", - "property": None, + "property": null, "responseAttributes": {}, "type": "JSON" }, @@ -685,7 +703,7 @@ HISTORY_EXPECTED = { "policyConfigStatus": "CONFIG_RETRIEVED", "policyName": "test_scope_prefix.Config_consectetur.6.xml", "policyVersion": "6", - "property": None, + "property": null, "responseAttributes": {}, "type": "JSON" }, @@ -707,7 +725,7 @@ HISTORY_EXPECTED = { "policyConfigStatus": "CONFIG_RETRIEVED", "policyName": "test_scope_prefix.Config_dolor.3.xml", "policyVersion": "3", - "property": None, + "property": null, "responseAttributes": {}, "type": "JSON" }, @@ -729,7 +747,7 @@ HISTORY_EXPECTED = { "policyConfigStatus": "CONFIG_RETRIEVED", "policyName": "test_scope_prefix.Config_ipsum.2.xml", "policyVersion": "2", - "property": None, + "property": null, "responseAttributes": {}, "type": "JSON" }, @@ -751,7 +769,7 @@ HISTORY_EXPECTED = { "policyConfigStatus": "CONFIG_RETRIEVED", "policyName": "test_scope_prefix.Config_sit.4.xml", "policyVersion": "4", - "property": None, + "property": null, "responseAttributes": {}, "type": "JSON" }, @@ -781,9 +799,10 @@ HISTORY_EXPECTED = { { "request": { "headers": { + "X-ONAP-RequestID": "*", "X-ECOMP-RequestID": "*" }, - "json": None, + "json": null, "method": "get", "params": { "cfy_tenant_name": "default_tenant" @@ -801,13 +820,14 @@ HISTORY_EXPECTED = { "ClientAuth": "Basic user", "Content-Type": "application/json", "Environment": "TEST", + "X-ONAP-RequestID": "*", "X-ECOMP-RequestID": "*" }, "json": { "policyName": "test_scope_prefix.Config_ipsum" }, "method": "post", - "params": None, + "params": null, "uri": "https://unit-test-pdp-server:8081000/pdp/api/getConfig" }, "res": "*", @@ -821,13 +841,14 @@ HISTORY_EXPECTED = { "ClientAuth": "Basic user", "Content-Type": "application/json", "Environment": "TEST", + "X-ONAP-RequestID": "*", "X-ECOMP-RequestID": "*" }, "json": { "policyName": "test_scope_prefix.Config_sit" }, "method": "post", - "params": None, + "params": null, "uri": "https://unit-test-pdp-server:8081000/pdp/api/getConfig" }, "res": "*", @@ -841,13 +862,14 @@ HISTORY_EXPECTED = { "ClientAuth": "Basic user", "Content-Type": "application/json", "Environment": "TEST", + "X-ONAP-RequestID": "*", "X-ECOMP-RequestID": "*" }, "json": { "policyName": "test_scope_prefix.Config_consectetur" }, "method": "post", - "params": None, + "params": null, "uri": "https://unit-test-pdp-server:8081000/pdp/api/getConfig" }, "res": "*", @@ -856,10 +878,11 @@ HISTORY_EXPECTED = { { "request": { "headers": { + "X-ONAP-RequestID": "*", "X-ECOMP-RequestID": "*" }, "json": { - "catch_up": False, + "catch_up": false, "latest_policies": { "test_scope_prefix.Config_consectetur": { "policy_body": { @@ -877,7 +900,7 @@ HISTORY_EXPECTED = { "policyConfigStatus": "CONFIG_RETRIEVED", "policyName": "test_scope_prefix.Config_consectetur.6.xml", "policyVersion": "6", - "property": None, + "property": null, "responseAttributes": {}, "type": "JSON" }, @@ -899,7 +922,7 @@ HISTORY_EXPECTED = { "policyConfigStatus": "CONFIG_RETRIEVED", "policyName": "test_scope_prefix.Config_ipsum.2.xml", "policyVersion": "2", - "property": None, + "property": null, "responseAttributes": {}, "type": "JSON" }, @@ -921,7 +944,7 @@ HISTORY_EXPECTED = { "policyConfigStatus": "CONFIG_RETRIEVED", "policyName": "test_scope_prefix.Config_sit.4.xml", "policyVersion": "4", - "property": None, + "property": null, "responseAttributes": {}, "type": "JSON" }, @@ -949,9 +972,10 @@ HISTORY_EXPECTED = { { "request": { "headers": { + "X-ONAP-RequestID": "*", "X-ECOMP-RequestID": "*" }, - "json": None, + "json": null, "method": "get", "params": { "cfy_tenant_name": "default_tenant" @@ -969,13 +993,14 @@ HISTORY_EXPECTED = { "ClientAuth": "Basic user", "Content-Type": "application/json", "Environment": "TEST", + "X-ONAP-RequestID": "*", "X-ECOMP-RequestID": "*" }, "json": { "policyName": "test_scope_prefix.Config_.*" }, "method": "post", - "params": None, + "params": null, "uri": "https://unit-test-pdp-server:8081000/pdp/api/getConfig" }, "res": "*", @@ -984,10 +1009,11 @@ HISTORY_EXPECTED = { { "request": { "headers": { + "X-ONAP-RequestID": "*", "X-ECOMP-RequestID": "*" }, "json": { - "catch_up": True, + "catch_up": true, "latest_policies": { "test_scope_prefix.Config_Lorem": { "policy_body": { @@ -1005,7 +1031,7 @@ HISTORY_EXPECTED = { "policyConfigStatus": "CONFIG_RETRIEVED", "policyName": "test_scope_prefix.Config_Lorem.1.xml", "policyVersion": "1", - "property": None, + "property": null, "responseAttributes": {}, "type": "JSON" }, @@ -1027,7 +1053,7 @@ HISTORY_EXPECTED = { "policyConfigStatus": "CONFIG_RETRIEVED", "policyName": "test_scope_prefix.Config_amet.5.xml", "policyVersion": "5", - "property": None, + "property": null, "responseAttributes": {}, "type": "JSON" }, @@ -1049,7 +1075,7 @@ HISTORY_EXPECTED = { "policyConfigStatus": "CONFIG_RETRIEVED", "policyName": "test_scope_prefix.Config_ametist.7.xml", "policyVersion": "7", - "property": None, + "property": null, "responseAttributes": {}, "type": "JSON" }, @@ -1071,7 +1097,7 @@ HISTORY_EXPECTED = { "policyConfigStatus": "CONFIG_RETRIEVED", "policyName": "test_scope_prefix.Config_consectetur.6.xml", "policyVersion": "6", - "property": None, + "property": null, "responseAttributes": {}, "type": "JSON" }, @@ -1093,7 +1119,7 @@ HISTORY_EXPECTED = { "policyConfigStatus": "CONFIG_RETRIEVED", "policyName": "test_scope_prefix.Config_dolor.3.xml", "policyVersion": "3", - "property": None, + "property": null, "responseAttributes": {}, "type": "JSON" }, @@ -1115,7 +1141,7 @@ HISTORY_EXPECTED = { "policyConfigStatus": "CONFIG_RETRIEVED", "policyName": "test_scope_prefix.Config_ipsum.2.xml", "policyVersion": "2", - "property": None, + "property": null, "responseAttributes": {}, "type": "JSON" }, @@ -1137,7 +1163,7 @@ HISTORY_EXPECTED = { "policyConfigStatus": "CONFIG_RETRIEVED", "policyName": "test_scope_prefix.Config_sit.4.xml", "policyVersion": "4", - "property": None, + "property": null, "responseAttributes": {}, "type": "JSON" }, @@ -1167,9 +1193,10 @@ HISTORY_EXPECTED = { { "request": { "headers": { + "X-ONAP-RequestID": "*", "X-ECOMP-RequestID": "*" }, - "json": None, + "json": null, "method": "get", "params": { "cfy_tenant_name": "default_tenant" @@ -1187,13 +1214,14 @@ HISTORY_EXPECTED = { "ClientAuth": "Basic user", "Content-Type": "application/json", "Environment": "TEST", + "X-ONAP-RequestID": "*", "X-ECOMP-RequestID": "*" }, "json": { "policyName": "test_scope_prefix.Config_ipsum" }, "method": "post", - "params": None, + "params": null, "uri": "https://unit-test-pdp-server:8081000/pdp/api/getConfig" }, "res": "*", @@ -1207,13 +1235,14 @@ HISTORY_EXPECTED = { "ClientAuth": "Basic user", "Content-Type": "application/json", "Environment": "TEST", + "X-ONAP-RequestID": "*", "X-ECOMP-RequestID": "*" }, "json": { "policyName": "test_scope_prefix.Config_sit" }, "method": "post", - "params": None, + "params": null, "uri": "https://unit-test-pdp-server:8081000/pdp/api/getConfig" }, "res": "*", @@ -1227,13 +1256,14 @@ HISTORY_EXPECTED = { "ClientAuth": "Basic user", "Content-Type": "application/json", "Environment": "TEST", + "X-ONAP-RequestID": "*", "X-ECOMP-RequestID": "*" }, "json": { "policyName": "test_scope_prefix.Config_consectetur" }, "method": "post", - "params": None, + "params": null, "uri": "https://unit-test-pdp-server:8081000/pdp/api/getConfig" }, "res": "*", @@ -1242,10 +1272,11 @@ HISTORY_EXPECTED = { { "request": { "headers": { + "X-ONAP-RequestID": "*", "X-ECOMP-RequestID": "*" }, "json": { - "catch_up": False, + "catch_up": false, "latest_policies": { "test_scope_prefix.Config_consectetur": { "policy_body": { @@ -1263,7 +1294,7 @@ HISTORY_EXPECTED = { "policyConfigStatus": "CONFIG_RETRIEVED", "policyName": "test_scope_prefix.Config_consectetur.6.xml", "policyVersion": "6", - "property": None, + "property": null, "responseAttributes": {}, "type": "JSON" }, @@ -1285,7 +1316,7 @@ HISTORY_EXPECTED = { "policyConfigStatus": "CONFIG_RETRIEVED", "policyName": "test_scope_prefix.Config_ipsum.2.xml", "policyVersion": "2", - "property": None, + "property": null, "responseAttributes": {}, "type": "JSON" }, @@ -1307,7 +1338,7 @@ HISTORY_EXPECTED = { "policyConfigStatus": "CONFIG_RETRIEVED", "policyName": "test_scope_prefix.Config_sit.4.xml", "policyVersion": "4", - "property": None, + "property": null, "responseAttributes": {}, "type": "JSON" }, @@ -1335,9 +1366,10 @@ HISTORY_EXPECTED = { { "request": { "headers": { + "X-ONAP-RequestID": "*", "X-ECOMP-RequestID": "*" }, - "json": None, + "json": null, "method": "get", "params": { "cfy_tenant_name": "default_tenant" @@ -1355,13 +1387,14 @@ HISTORY_EXPECTED = { "ClientAuth": "Basic user", "Content-Type": "application/json", "Environment": "TEST", + "X-ONAP-RequestID": "*", "X-ECOMP-RequestID": "*" }, "json": { "policyName": "test_scope_prefix.Config_.*" }, "method": "post", - "params": None, + "params": null, "uri": "https://unit-test-pdp-server:8081000/pdp/api/getConfig" }, "res": "*", @@ -1370,10 +1403,11 @@ HISTORY_EXPECTED = { { "request": { "headers": { + "X-ONAP-RequestID": "*", "X-ECOMP-RequestID": "*" }, "json": { - "catch_up": True, + "catch_up": true, "latest_policies": { "test_scope_prefix.Config_Lorem": { "policy_body": { @@ -1391,7 +1425,7 @@ HISTORY_EXPECTED = { "policyConfigStatus": "CONFIG_RETRIEVED", "policyName": "test_scope_prefix.Config_Lorem.1.xml", "policyVersion": "1", - "property": None, + "property": null, "responseAttributes": {}, "type": "JSON" }, @@ -1413,7 +1447,7 @@ HISTORY_EXPECTED = { "policyConfigStatus": "CONFIG_RETRIEVED", "policyName": "test_scope_prefix.Config_amet.5.xml", "policyVersion": "5", - "property": None, + "property": null, "responseAttributes": {}, "type": "JSON" }, @@ -1435,7 +1469,7 @@ HISTORY_EXPECTED = { "policyConfigStatus": "CONFIG_RETRIEVED", "policyName": "test_scope_prefix.Config_ametist.7.xml", "policyVersion": "7", - "property": None, + "property": null, "responseAttributes": {}, "type": "JSON" }, @@ -1457,7 +1491,7 @@ HISTORY_EXPECTED = { "policyConfigStatus": "CONFIG_RETRIEVED", "policyName": "test_scope_prefix.Config_consectetur.6.xml", "policyVersion": "6", - "property": None, + "property": null, "responseAttributes": {}, "type": "JSON" }, @@ -1479,7 +1513,7 @@ HISTORY_EXPECTED = { "policyConfigStatus": "CONFIG_RETRIEVED", "policyName": "test_scope_prefix.Config_dolor.3.xml", "policyVersion": "3", - "property": None, + "property": null, "responseAttributes": {}, "type": "JSON" }, @@ -1501,7 +1535,7 @@ HISTORY_EXPECTED = { "policyConfigStatus": "CONFIG_RETRIEVED", "policyName": "test_scope_prefix.Config_ipsum.2.xml", "policyVersion": "2", - "property": None, + "property": null, "responseAttributes": {}, "type": "JSON" }, @@ -1523,7 +1557,7 @@ HISTORY_EXPECTED = { "policyConfigStatus": "CONFIG_RETRIEVED", "policyName": "test_scope_prefix.Config_sit.4.xml", "policyVersion": "4", - "property": None, + "property": null, "responseAttributes": {}, "type": "JSON" }, @@ -1553,9 +1587,10 @@ HISTORY_EXPECTED = { { "request": { "headers": { + "X-ONAP-RequestID": "*", "X-ECOMP-RequestID": "*" }, - "json": None, + "json": null, "method": "get", "params": { "cfy_tenant_name": "default_tenant" @@ -1573,13 +1608,14 @@ HISTORY_EXPECTED = { "ClientAuth": "Basic user", "Content-Type": "application/json", "Environment": "TEST", + "X-ONAP-RequestID": "*", "X-ECOMP-RequestID": "*" }, "json": { "policyName": "test_scope_prefix.Config_ipsum" }, "method": "post", - "params": None, + "params": null, "uri": "https://unit-test-pdp-server:8081000/pdp/api/getConfig" }, "res": "*", @@ -1588,10 +1624,11 @@ HISTORY_EXPECTED = { { "request": { "headers": { + "X-ONAP-RequestID": "*", "X-ECOMP-RequestID": "*" }, "json": { - "catch_up": False, + "catch_up": false, "latest_policies": { "test_scope_prefix.Config_ipsum": { "policy_body": { @@ -1609,7 +1646,7 @@ HISTORY_EXPECTED = { "policyConfigStatus": "CONFIG_RETRIEVED", "policyName": "test_scope_prefix.Config_ipsum.2.xml", "policyVersion": "2", - "property": None, + "property": null, "responseAttributes": {}, "type": "JSON" }, @@ -1633,9 +1670,231 @@ HISTORY_EXPECTED = { { "request": { "headers": { + "X-ONAP-RequestID": "*", + "X-ECOMP-RequestID": "*" + }, + "json": null, + "method": "get", + "params": { + "cfy_tenant_name": "default_tenant" + }, + "uri": "http://unit-test-deployment_handler:8188000/policy" + }, + "res": "*", + "status_code": 200 + }, + { + "request": { + "headers": { + "Accept": "application/json", + "Authorization": "Basic auth", + "ClientAuth": "Basic user", + "Content-Type": "application/json", + "Environment": "TEST", + "X-ONAP-RequestID": "*", + "X-ECOMP-RequestID": "*" + }, + "json": { + "policyName": "test_scope_prefix.Config_.*" + }, + "method": "post", + "params": null, + "uri": "https://unit-test-pdp-server:8081000/pdp/api/getConfig" + }, + "res": "*", + "status_code": 200 + }, + { + "request": { + "headers": { + "X-ONAP-RequestID": "*", + "X-ECOMP-RequestID": "*" + }, + "json": { + "catch_up": true, + "latest_policies": { + "test_scope_prefix.Config_Lorem": { + "policy_body": { + "config": { + "policy_hello": "world!", + "policy_updated_from_ver": "0", + "policy_updated_to_ver": "1", + "updated_policy_id": "test_scope_prefix.Config_Lorem" + }, + "matchingConditions": { + "ConfigName": "alex_config_name", + "ONAPName": "DCAE" + }, + "policyConfigMessage": "Config Retrieved! ", + "policyConfigStatus": "CONFIG_RETRIEVED", + "policyName": "test_scope_prefix.Config_Lorem.1.xml", + "policyVersion": "1", + "property": null, + "responseAttributes": {}, + "type": "JSON" + }, + "policy_id": "test_scope_prefix.Config_Lorem" + }, + "test_scope_prefix.Config_amet": { + "policy_body": { + "config": { + "policy_hello": "world!", + "policy_updated_from_ver": "4", + "policy_updated_to_ver": "5", + "updated_policy_id": "test_scope_prefix.Config_amet" + }, + "matchingConditions": { + "ConfigName": "alex_config_name", + "ONAPName": "DCAE" + }, + "policyConfigMessage": "Config Retrieved! ", + "policyConfigStatus": "CONFIG_RETRIEVED", + "policyName": "test_scope_prefix.Config_amet.5.xml", + "policyVersion": "5", + "property": null, + "responseAttributes": {}, + "type": "JSON" + }, + "policy_id": "test_scope_prefix.Config_amet" + }, + "test_scope_prefix.Config_ametist": { + "policy_body": { + "config": { + "policy_hello": "world!", + "policy_updated_from_ver": "6", + "policy_updated_to_ver": "7", + "updated_policy_id": "test_scope_prefix.Config_ametist" + }, + "matchingConditions": { + "ConfigName": "alex_config_name", + "ONAPName": "DCAE" + }, + "policyConfigMessage": "Config Retrieved! ", + "policyConfigStatus": "CONFIG_RETRIEVED", + "policyName": "test_scope_prefix.Config_ametist.7.xml", + "policyVersion": "7", + "property": null, + "responseAttributes": {}, + "type": "JSON" + }, + "policy_id": "test_scope_prefix.Config_ametist" + }, + "test_scope_prefix.Config_consectetur": { + "policy_body": { + "config": { + "policy_hello": "world!", + "policy_updated_from_ver": "5", + "policy_updated_to_ver": "6", + "updated_policy_id": "test_scope_prefix.Config_consectetur" + }, + "matchingConditions": { + "ConfigName": "alex_config_name", + "ONAPName": "DCAE" + }, + "policyConfigMessage": "Config Retrieved! ", + "policyConfigStatus": "CONFIG_RETRIEVED", + "policyName": "test_scope_prefix.Config_consectetur.6.xml", + "policyVersion": "6", + "property": null, + "responseAttributes": {}, + "type": "JSON" + }, + "policy_id": "test_scope_prefix.Config_consectetur" + }, + "test_scope_prefix.Config_dolor": { + "policy_body": { + "config": { + "policy_hello": "world!", + "policy_updated_from_ver": "2", + "policy_updated_to_ver": "3", + "updated_policy_id": "test_scope_prefix.Config_dolor" + }, + "matchingConditions": { + "ConfigName": "alex_config_name", + "ONAPName": "DCAE" + }, + "policyConfigMessage": "Config Retrieved! ", + "policyConfigStatus": "CONFIG_RETRIEVED", + "policyName": "test_scope_prefix.Config_dolor.3.xml", + "policyVersion": "3", + "property": null, + "responseAttributes": {}, + "type": "JSON" + }, + "policy_id": "test_scope_prefix.Config_dolor" + }, + "test_scope_prefix.Config_ipsum": { + "policy_body": { + "config": { + "policy_hello": "world!", + "policy_updated_from_ver": "1", + "policy_updated_to_ver": "2", + "updated_policy_id": "test_scope_prefix.Config_ipsum" + }, + "matchingConditions": { + "ConfigName": "alex_config_name", + "ONAPName": "DCAE" + }, + "policyConfigMessage": "Config Retrieved! ", + "policyConfigStatus": "CONFIG_RETRIEVED", + "policyName": "test_scope_prefix.Config_ipsum.2.xml", + "policyVersion": "2", + "property": null, + "responseAttributes": {}, + "type": "JSON" + }, + "policy_id": "test_scope_prefix.Config_ipsum" + }, + "test_scope_prefix.Config_sit": { + "policy_body": { + "config": { + "policy_hello": "world!", + "policy_updated_from_ver": "3", + "policy_updated_to_ver": "4", + "updated_policy_id": "test_scope_prefix.Config_sit" + }, + "matchingConditions": { + "ConfigName": "alex_config_name", + "ONAPName": "DCAE" + }, + "policyConfigMessage": "Config Retrieved! ", + "policyConfigStatus": "CONFIG_RETRIEVED", + "policyName": "test_scope_prefix.Config_sit.4.xml", + "policyVersion": "4", + "property": null, + "responseAttributes": {}, + "type": "JSON" + }, + "policy_id": "test_scope_prefix.Config_sit" + } + }, + "policy_filter_matches": { + "test_scope_prefix.Config_Lorem": {}, + "test_scope_prefix.Config_amet": {}, + "test_scope_prefix.Config_ametist": {}, + "test_scope_prefix.Config_consectetur": {}, + "test_scope_prefix.Config_dolor": {}, + "test_scope_prefix.Config_ipsum": {}, + "test_scope_prefix.Config_sit": {} + }, + "removed_policies": {} + }, + "method": "put", + "params": { + "cfy_tenant_name": "default_tenant" + }, + "uri": "http://unit-test-deployment_handler:8188000/policy" + }, + "res": "*", + "status_code": 200 + }, + { + "request": { + "headers": { + "X-ONAP-RequestID": "*", "X-ECOMP-RequestID": "*" }, - "json": None, + "json": null, "method": "get", "params": { "cfy_tenant_name": "default_tenant" @@ -1653,13 +1912,14 @@ HISTORY_EXPECTED = { "ClientAuth": "Basic user", "Content-Type": "application/json", "Environment": "TEST", + "X-ONAP-RequestID": "*", "X-ECOMP-RequestID": "*" }, "json": { "policyName": "test_scope_prefix.Config_dolor" }, "method": "post", - "params": None, + "params": null, "uri": "https://unit-test-pdp-server:8081000/pdp/api/getConfig" }, "res": "*", @@ -1673,13 +1933,14 @@ HISTORY_EXPECTED = { "ClientAuth": "Basic user", "Content-Type": "application/json", "Environment": "TEST", + "X-ONAP-RequestID": "*", "X-ECOMP-RequestID": "*" }, "json": { "policyName": "test_scope_prefix.Config_amet" }, "method": "post", - "params": None, + "params": null, "uri": "https://unit-test-pdp-server:8081000/pdp/api/getConfig" }, "res": "*", @@ -1688,10 +1949,11 @@ HISTORY_EXPECTED = { { "request": { "headers": { + "X-ONAP-RequestID": "*", "X-ECOMP-RequestID": "*" }, "json": { - "catch_up": False, + "catch_up": false, "latest_policies": { "test_scope_prefix.Config_amet": { "policy_body": { @@ -1709,7 +1971,7 @@ HISTORY_EXPECTED = { "policyConfigStatus": "CONFIG_RETRIEVED", "policyName": "test_scope_prefix.Config_amet.5.xml", "policyVersion": "5", - "property": None, + "property": null, "responseAttributes": {}, "type": "JSON" }, @@ -1731,7 +1993,7 @@ HISTORY_EXPECTED = { "policyConfigStatus": "CONFIG_RETRIEVED", "policyName": "test_scope_prefix.Config_dolor.3.xml", "policyVersion": "3", - "property": None, + "property": null, "responseAttributes": {}, "type": "JSON" }, @@ -1756,9 +2018,10 @@ HISTORY_EXPECTED = { { "request": { "headers": { + "X-ONAP-RequestID": "*", "X-ECOMP-RequestID": "*" }, - "json": None, + "json": null, "method": "get", "params": { "cfy_tenant_name": "default_tenant" @@ -1776,13 +2039,14 @@ HISTORY_EXPECTED = { "ClientAuth": "Basic user", "Content-Type": "application/json", "Environment": "TEST", + "X-ONAP-RequestID": "*", "X-ECOMP-RequestID": "*" }, "json": { "policyName": "test_scope_prefix.Config_.*" }, "method": "post", - "params": None, + "params": null, "uri": "https://unit-test-pdp-server:8081000/pdp/api/getConfig" }, "res": "*", @@ -1791,10 +2055,11 @@ HISTORY_EXPECTED = { { "request": { "headers": { + "X-ONAP-RequestID": "*", "X-ECOMP-RequestID": "*" }, "json": { - "catch_up": True, + "catch_up": true, "latest_policies": { "test_scope_prefix.Config_Lorem": { "policy_body": { @@ -1812,7 +2077,7 @@ HISTORY_EXPECTED = { "policyConfigStatus": "CONFIG_RETRIEVED", "policyName": "test_scope_prefix.Config_Lorem.1.xml", "policyVersion": "1", - "property": None, + "property": null, "responseAttributes": {}, "type": "JSON" }, @@ -1834,7 +2099,7 @@ HISTORY_EXPECTED = { "policyConfigStatus": "CONFIG_RETRIEVED", "policyName": "test_scope_prefix.Config_amet.5.xml", "policyVersion": "5", - "property": None, + "property": null, "responseAttributes": {}, "type": "JSON" }, @@ -1856,7 +2121,7 @@ HISTORY_EXPECTED = { "policyConfigStatus": "CONFIG_RETRIEVED", "policyName": "test_scope_prefix.Config_ametist.7.xml", "policyVersion": "7", - "property": None, + "property": null, "responseAttributes": {}, "type": "JSON" }, @@ -1878,7 +2143,7 @@ HISTORY_EXPECTED = { "policyConfigStatus": "CONFIG_RETRIEVED", "policyName": "test_scope_prefix.Config_consectetur.6.xml", "policyVersion": "6", - "property": None, + "property": null, "responseAttributes": {}, "type": "JSON" }, @@ -1900,7 +2165,7 @@ HISTORY_EXPECTED = { "policyConfigStatus": "CONFIG_RETRIEVED", "policyName": "test_scope_prefix.Config_dolor.3.xml", "policyVersion": "3", - "property": None, + "property": null, "responseAttributes": {}, "type": "JSON" }, @@ -1922,7 +2187,7 @@ HISTORY_EXPECTED = { "policyConfigStatus": "CONFIG_RETRIEVED", "policyName": "test_scope_prefix.Config_ipsum.2.xml", "policyVersion": "2", - "property": None, + "property": null, "responseAttributes": {}, "type": "JSON" }, @@ -1944,7 +2209,7 @@ HISTORY_EXPECTED = { "policyConfigStatus": "CONFIG_RETRIEVED", "policyName": "test_scope_prefix.Config_sit.4.xml", "policyVersion": "4", - "property": None, + "property": null, "responseAttributes": {}, "type": "JSON" }, @@ -1976,9 +2241,10 @@ HISTORY_EXPECTED = { { "request": { "headers": { + "X-ONAP-RequestID": "*", "X-ECOMP-RequestID": "*" }, - "json": None, + "json": null, "method": "get", "params": { "cfy_tenant_name": "default_tenant" @@ -1996,13 +2262,14 @@ HISTORY_EXPECTED = { "ClientAuth": "Basic user", "Content-Type": "application/json", "Environment": "TEST", + "X-ONAP-RequestID": "*", "X-ECOMP-RequestID": "*" }, "json": { "policyName": "test_scope_prefix.Config_.*" }, "method": "post", - "params": None, + "params": null, "uri": "https://unit-test-pdp-server:8081000/pdp/api/getConfig" }, "res": "*", @@ -2011,10 +2278,11 @@ HISTORY_EXPECTED = { { "request": { "headers": { + "X-ONAP-RequestID": "*", "X-ECOMP-RequestID": "*" }, "json": { - "catch_up": True, + "catch_up": true, "latest_policies": { "test_scope_prefix.Config_Lorem": { "policy_body": { @@ -2027,7 +2295,7 @@ HISTORY_EXPECTED = { "policyConfigStatus": "CONFIG_RETRIEVED", "policyName": "test_scope_prefix.Config_Lorem.1.xml", "policyVersion": "1", - "property": None, + "property": null, "responseAttributes": {}, "type": "JSON" }, @@ -2044,7 +2312,7 @@ HISTORY_EXPECTED = { "policyConfigStatus": "CONFIG_RETRIEVED", "policyName": "test_scope_prefix.Config_amet.5.xml", "policyVersion": "5", - "property": None, + "property": null, "responseAttributes": {}, "type": "JSON" }, @@ -2061,7 +2329,7 @@ HISTORY_EXPECTED = { "policyConfigStatus": "CONFIG_RETRIEVED", "policyName": "test_scope_prefix.Config_ametist.7.xml", "policyVersion": "7", - "property": None, + "property": null, "responseAttributes": {}, "type": "JSON" }, @@ -2078,7 +2346,7 @@ HISTORY_EXPECTED = { "policyConfigStatus": "CONFIG_RETRIEVED", "policyName": "test_scope_prefix.Config_consectetur.6.xml", "policyVersion": "6", - "property": None, + "property": null, "responseAttributes": {}, "type": "JSON" }, @@ -2095,7 +2363,7 @@ HISTORY_EXPECTED = { "policyConfigStatus": "CONFIG_RETRIEVED", "policyName": "test_scope_prefix.Config_dolor.3.xml", "policyVersion": "3", - "property": None, + "property": null, "responseAttributes": {}, "type": "JSON" }, @@ -2112,7 +2380,7 @@ HISTORY_EXPECTED = { "policyConfigStatus": "CONFIG_RETRIEVED", "policyName": "test_scope_prefix.Config_ipsum.2.xml", "policyVersion": "2", - "property": None, + "property": null, "responseAttributes": {}, "type": "JSON" }, @@ -2129,7 +2397,7 @@ HISTORY_EXPECTED = { "policyConfigStatus": "CONFIG_RETRIEVED", "policyName": "test_scope_prefix.Config_sit.4.xml", "policyVersion": "4", - "property": None, + "property": null, "responseAttributes": {}, "type": "JSON" }, @@ -2159,9 +2427,10 @@ HISTORY_EXPECTED = { { "request": { "headers": { + "X-ONAP-RequestID": "*", "X-ECOMP-RequestID": "*" }, - "json": None, + "json": null, "method": "get", "params": { "cfy_tenant_name": "default_tenant" @@ -2179,13 +2448,14 @@ HISTORY_EXPECTED = { "ClientAuth": "Basic user", "Content-Type": "application/json", "Environment": "TEST", + "X-ONAP-RequestID": "*", "X-ECOMP-RequestID": "*" }, "json": { "policyName": "test_scope_prefix.Config_.*" }, "method": "post", - "params": None, + "params": null, "uri": "https://unit-test-pdp-server:8081000/pdp/api/getConfig" }, "res": "*", @@ -2194,10 +2464,11 @@ HISTORY_EXPECTED = { { "request": { "headers": { + "X-ONAP-RequestID": "*", "X-ECOMP-RequestID": "*" }, "json": { - "catch_up": True, + "catch_up": true, "latest_policies": { "test_scope_prefix.Config_Lorem": { "policy_body": { @@ -2210,7 +2481,7 @@ HISTORY_EXPECTED = { "policyConfigStatus": "CONFIG_RETRIEVED", "policyName": "test_scope_prefix.Config_Lorem.1.xml", "policyVersion": "1", - "property": None, + "property": null, "responseAttributes": {}, "type": "JSON" }, @@ -2227,7 +2498,7 @@ HISTORY_EXPECTED = { "policyConfigStatus": "CONFIG_RETRIEVED", "policyName": "test_scope_prefix.Config_amet.5.xml", "policyVersion": "5", - "property": None, + "property": null, "responseAttributes": {}, "type": "JSON" }, @@ -2244,7 +2515,7 @@ HISTORY_EXPECTED = { "policyConfigStatus": "CONFIG_RETRIEVED", "policyName": "test_scope_prefix.Config_ametist.7.xml", "policyVersion": "7", - "property": None, + "property": null, "responseAttributes": {}, "type": "JSON" }, @@ -2261,7 +2532,7 @@ HISTORY_EXPECTED = { "policyConfigStatus": "CONFIG_RETRIEVED", "policyName": "test_scope_prefix.Config_consectetur.6.xml", "policyVersion": "6", - "property": None, + "property": null, "responseAttributes": {}, "type": "JSON" }, @@ -2278,7 +2549,7 @@ HISTORY_EXPECTED = { "policyConfigStatus": "CONFIG_RETRIEVED", "policyName": "test_scope_prefix.Config_dolor.3.xml", "policyVersion": "3", - "property": None, + "property": null, "responseAttributes": {}, "type": "JSON" }, @@ -2295,7 +2566,7 @@ HISTORY_EXPECTED = { "policyConfigStatus": "CONFIG_RETRIEVED", "policyName": "test_scope_prefix.Config_ipsum.2.xml", "policyVersion": "2", - "property": None, + "property": null, "responseAttributes": {}, "type": "JSON" }, @@ -2312,7 +2583,7 @@ HISTORY_EXPECTED = { "policyConfigStatus": "CONFIG_RETRIEVED", "policyName": "test_scope_prefix.Config_sit.4.xml", "policyVersion": "4", - "property": None, + "property": null, "responseAttributes": {}, "type": "JSON" }, @@ -2342,9 +2613,10 @@ HISTORY_EXPECTED = { { "request": { "headers": { + "X-ONAP-RequestID": "*", "X-ECOMP-RequestID": "*" }, - "json": None, + "json": null, "method": "get", "params": { "cfy_tenant_name": "default_tenant" @@ -2362,13 +2634,14 @@ HISTORY_EXPECTED = { "ClientAuth": "Basic user", "Content-Type": "application/json", "Environment": "TEST", + "X-ONAP-RequestID": "*", "X-ECOMP-RequestID": "*" }, "json": { "policyName": "test_scope_prefix.Config_.*" }, "method": "post", - "params": None, + "params": null, "uri": "https://unit-test-pdp-server:8081000/pdp/api/getConfig" }, "res": "*", @@ -2377,10 +2650,11 @@ HISTORY_EXPECTED = { { "request": { "headers": { + "X-ONAP-RequestID": "*", "X-ECOMP-RequestID": "*" }, "json": { - "catch_up": True, + "catch_up": true, "latest_policies": { "test_scope_prefix.Config_Lorem": { "policy_body": { @@ -2393,7 +2667,7 @@ HISTORY_EXPECTED = { "policyConfigStatus": "CONFIG_RETRIEVED", "policyName": "test_scope_prefix.Config_Lorem.1.xml", "policyVersion": "1", - "property": None, + "property": null, "responseAttributes": {}, "type": "JSON" }, @@ -2410,7 +2684,7 @@ HISTORY_EXPECTED = { "policyConfigStatus": "CONFIG_RETRIEVED", "policyName": "test_scope_prefix.Config_amet.5.xml", "policyVersion": "5", - "property": None, + "property": null, "responseAttributes": {}, "type": "JSON" }, @@ -2427,7 +2701,7 @@ HISTORY_EXPECTED = { "policyConfigStatus": "CONFIG_RETRIEVED", "policyName": "test_scope_prefix.Config_ametist.7.xml", "policyVersion": "7", - "property": None, + "property": null, "responseAttributes": {}, "type": "JSON" }, @@ -2444,7 +2718,7 @@ HISTORY_EXPECTED = { "policyConfigStatus": "CONFIG_RETRIEVED", "policyName": "test_scope_prefix.Config_consectetur.6.xml", "policyVersion": "6", - "property": None, + "property": null, "responseAttributes": {}, "type": "JSON" }, @@ -2461,7 +2735,7 @@ HISTORY_EXPECTED = { "policyConfigStatus": "CONFIG_RETRIEVED", "policyName": "test_scope_prefix.Config_dolor.3.xml", "policyVersion": "3", - "property": None, + "property": null, "responseAttributes": {}, "type": "JSON" }, @@ -2478,7 +2752,7 @@ HISTORY_EXPECTED = { "policyConfigStatus": "CONFIG_RETRIEVED", "policyName": "test_scope_prefix.Config_ipsum.2.xml", "policyVersion": "2", - "property": None, + "property": null, "responseAttributes": {}, "type": "JSON" }, @@ -2495,7 +2769,7 @@ HISTORY_EXPECTED = { "policyConfigStatus": "CONFIG_RETRIEVED", "policyName": "test_scope_prefix.Config_sit.4.xml", "policyVersion": "4", - "property": None, + "property": null, "responseAttributes": {}, "type": "JSON" }, @@ -2527,9 +2801,10 @@ HISTORY_EXPECTED = { { "request": { "headers": { + "X-ONAP-RequestID": "*", "X-ECOMP-RequestID": "*" }, - "json": None, + "json": null, "method": "get", "params": { "cfy_tenant_name": "default_tenant" @@ -2542,9 +2817,10 @@ HISTORY_EXPECTED = { { "request": { "headers": { + "X-ONAP-RequestID": "*", "X-ECOMP-RequestID": "*" }, - "json": None, + "json": null, "method": "get", "params": { "cfy_tenant_name": "default_tenant" @@ -2557,9 +2833,10 @@ HISTORY_EXPECTED = { { "request": { "headers": { + "X-ONAP-RequestID": "*", "X-ECOMP-RequestID": "*" }, - "json": None, + "json": null, "method": "get", "params": { "cfy_tenant_name": "default_tenant" @@ -2574,9 +2851,10 @@ HISTORY_EXPECTED = { { "request": { "headers": { + "X-ONAP-RequestID": "*", "X-ECOMP-RequestID": "*" }, - "json": None, + "json": null, "method": "get", "params": { "cfy_tenant_name": "default_tenant" @@ -2591,9 +2869,10 @@ HISTORY_EXPECTED = { { "request": { "headers": { + "X-ONAP-RequestID": "*", "X-ECOMP-RequestID": "*" }, - "json": None, + "json": null, "method": "get", "params": { "cfy_tenant_name": "default_tenant" @@ -2606,9 +2885,10 @@ HISTORY_EXPECTED = { { "request": { "headers": { + "X-ONAP-RequestID": "*", "X-ECOMP-RequestID": "*" }, - "json": None, + "json": null, "method": "get", "params": { "cfy_tenant_name": "default_tenant" @@ -2621,9 +2901,10 @@ HISTORY_EXPECTED = { { "request": { "headers": { + "X-ONAP-RequestID": "*", "X-ECOMP-RequestID": "*" }, - "json": None, + "json": null, "method": "get", "params": { "cfy_tenant_name": "default_tenant" @@ -2636,9 +2917,10 @@ HISTORY_EXPECTED = { { "request": { "headers": { + "X-ONAP-RequestID": "*", "X-ECOMP-RequestID": "*" }, - "json": None, + "json": null, "method": "get", "params": { "cfy_tenant_name": "default_tenant" @@ -2653,9 +2935,10 @@ HISTORY_EXPECTED = { { "request": { "headers": { + "X-ONAP-RequestID": "*", "X-ECOMP-RequestID": "*" }, - "json": None, + "json": null, "method": "get", "params": { "cfy_tenant_name": "default_tenant" @@ -2668,9 +2951,10 @@ HISTORY_EXPECTED = { { "request": { "headers": { + "X-ONAP-RequestID": "*", "X-ECOMP-RequestID": "*" }, - "json": None, + "json": null, "method": "get", "params": { "cfy_tenant_name": "default_tenant" @@ -2685,9 +2969,10 @@ HISTORY_EXPECTED = { { "request": { "headers": { + "X-ONAP-RequestID": "*", "X-ECOMP-RequestID": "*" }, - "json": None, + "json": null, "method": "get", "params": { "cfy_tenant_name": "default_tenant" @@ -2700,9 +2985,10 @@ HISTORY_EXPECTED = { { "request": { "headers": { + "X-ONAP-RequestID": "*", "X-ECOMP-RequestID": "*" }, - "json": None, + "json": null, "method": "get", "params": { "cfy_tenant_name": "default_tenant" @@ -2717,9 +3003,10 @@ HISTORY_EXPECTED = { { "request": { "headers": { + "X-ONAP-RequestID": "*", "X-ECOMP-RequestID": "*" }, - "json": None, + "json": null, "method": "get", "params": { "cfy_tenant_name": "default_tenant" @@ -2732,9 +3019,10 @@ HISTORY_EXPECTED = { { "request": { "headers": { + "X-ONAP-RequestID": "*", "X-ECOMP-RequestID": "*" }, - "json": None, + "json": null, "method": "get", "params": { "cfy_tenant_name": "default_tenant" @@ -2749,9 +3037,10 @@ HISTORY_EXPECTED = { { "request": { "headers": { + "X-ONAP-RequestID": "*", "X-ECOMP-RequestID": "*" }, - "json": None, + "json": null, "method": "get", "params": { "cfy_tenant_name": "default_tenant" @@ -2769,13 +3058,14 @@ HISTORY_EXPECTED = { "ClientAuth": "Basic user", "Content-Type": "application/json", "Environment": "TEST", + "X-ONAP-RequestID": "*", "X-ECOMP-RequestID": "*" }, "json": { "policyName": "test_scope_prefix.Config_.*" }, "method": "post", - "params": None, + "params": null, "uri": "https://unit-test-pdp-server:8081000/pdp/api/getConfig" }, "res": "*", @@ -2791,13 +3081,14 @@ HISTORY_EXPECTED = { "ClientAuth": "Basic user", "Content-Type": "application/json", "Environment": "TEST", + "X-ONAP-RequestID": "*", "X-ECOMP-RequestID": "*" }, "json": { "policyName": "test_scope_prefix.Config_amet.*" }, "method": "post", - "params": None, + "params": null, "uri": "https://unit-test-pdp-server:8081000/pdp/api/getConfig" }, "res": "*", @@ -2813,13 +3104,14 @@ HISTORY_EXPECTED = { "ClientAuth": "Basic user", "Content-Type": "application/json", "Environment": "TEST", + "X-ONAP-RequestID": "*", "X-ECOMP-RequestID": "*" }, "json": { "policyName": "test_scope_prefix.Config_sit" }, "method": "post", - "params": None, + "params": null, "uri": "https://unit-test-pdp-server:8081000/pdp/api/getConfig" }, "res": "*", @@ -2830,9 +3122,10 @@ HISTORY_EXPECTED = { { "request": { "headers": { + "X-ONAP-RequestID": "*", "X-ECOMP-RequestID": "*" }, - "json": None, + "json": null, "method": "get", "params": { "cfy_tenant_name": "default_tenant" @@ -2850,13 +3143,14 @@ HISTORY_EXPECTED = { "ClientAuth": "Basic user", "Content-Type": "application/json", "Environment": "TEST", + "X-ONAP-RequestID": "*", "X-ECOMP-RequestID": "*" }, "json": { "policyName": "test_scope_prefix.Config_.*" }, "method": "post", - "params": None, + "params": null, "uri": "https://unit-test-pdp-server:8081000/pdp/api/getConfig" }, "res": "*", @@ -2867,9 +3161,10 @@ HISTORY_EXPECTED = { { "request": { "headers": { + "X-ONAP-RequestID": "*", "X-ECOMP-RequestID": "*" }, - "json": None, + "json": null, "method": "get", "params": { "cfy_tenant_name": "default_tenant" @@ -2887,13 +3182,14 @@ HISTORY_EXPECTED = { "ClientAuth": "Basic user", "Content-Type": "application/json", "Environment": "TEST", + "X-ONAP-RequestID": "*", "X-ECOMP-RequestID": "*" }, "json": { "policyName": "test_scope_prefix.Config_.*" }, "method": "post", - "params": None, + "params": null, "uri": "https://unit-test-pdp-server:8081000/pdp/api/getConfig" }, "res": "*", @@ -2902,9 +3198,10 @@ HISTORY_EXPECTED = { { "request": { "headers": { + "X-ONAP-RequestID": "*", "X-ECOMP-RequestID": "*" }, - "json": None, + "json": null, "method": "get", "params": { "cfy_tenant_name": "default_tenant" @@ -2922,13 +3219,14 @@ HISTORY_EXPECTED = { "ClientAuth": "Basic user", "Content-Type": "application/json", "Environment": "TEST", + "X-ONAP-RequestID": "*", "X-ECOMP-RequestID": "*" }, "json": { "policyName": "test_scope_prefix.Config_.*" }, "method": "post", - "params": None, + "params": null, "uri": "https://unit-test-pdp-server:8081000/pdp/api/getConfig" }, "res": "*", @@ -2939,9 +3237,10 @@ HISTORY_EXPECTED = { { "request": { "headers": { + "X-ONAP-RequestID": "*", "X-ECOMP-RequestID": "*" }, - "json": None, + "json": null, "method": "get", "params": { "cfy_tenant_name": "default_tenant" @@ -2959,13 +3258,14 @@ HISTORY_EXPECTED = { "ClientAuth": "Basic user", "Content-Type": "application/json", "Environment": "TEST", + "X-ONAP-RequestID": "*", "X-ECOMP-RequestID": "*" }, "json": { "policyName": "test_scope_prefix.Config_.*" }, "method": "post", - "params": None, + "params": null, "uri": "https://unit-test-pdp-server:8081000/pdp/api/getConfig" }, "res": "*", @@ -2976,9 +3276,10 @@ HISTORY_EXPECTED = { { "request": { "headers": { + "X-ONAP-RequestID": "*", "X-ECOMP-RequestID": "*" }, - "json": None, + "json": null, "method": "get", "params": { "cfy_tenant_name": "default_tenant" @@ -2996,17 +3297,18 @@ HISTORY_EXPECTED = { "ClientAuth": "Basic user", "Content-Type": "application/json", "Environment": "TEST", + "X-ONAP-RequestID": "*", "X-ECOMP-RequestID": "*" }, "json": { "policyName": "test_scope_prefix.Config_.*" }, "method": "post", - "params": None, + "params": null, "uri": "https://unit-test-pdp-server:8081000/pdp/api/getConfig" }, "res": "*", "status_code": 200 } ] -} +}
\ No newline at end of file diff --git a/tests/mock_deploy_handler.py b/tests/pdp_api_v0/mock_deploy_handler.py index cd8e791..5446070 100644 --- a/tests/mock_deploy_handler.py +++ b/tests/pdp_api_v0/mock_deploy_handler.py @@ -1,5 +1,5 @@ # ============LICENSE_START======================================================= -# Copyright (c) 2018-2019 AT&T Intellectual Property. All rights reserved. +# Copyright (c) 2018-2020 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. @@ -16,12 +16,16 @@ # """mocking for the deployment-handler - shared by many tests""" +import json + from policyhandler.pdp_api_v0.pdp_consts import POLICY_VERSION from policyhandler.policy_consts import POLICY_BODY, POLICY_ID, POLICY_VERSIONS +from policyhandler.utils import Utils -from .mock_settings import MockSettings -from .pdp_api_v0.mock_policy_engine import MockPolicyEngine2018 +from ..mock_settings import MockSettings +from .mock_policy_engine import MockPolicyEngine2018 +_LOGGER = Utils.get_logger(__file__) class MockDeploymentHandler(object): """pretend this is the deployment-handler""" @@ -34,14 +38,16 @@ class MockDeploymentHandler(object): @staticmethod def get_deployed_policies(): """generate the deployed policies message""" + all_policies = MockPolicyEngine2018.gen_all_policies_latest(version_offset=1) + _LOGGER.info("all_policies: %s", json.dumps(all_policies)) + response = MockDeploymentHandler.default_response() policies = dict( (policy_id, { POLICY_ID: policy_id, POLICY_VERSIONS: {policy.get(POLICY_BODY, {}).get(POLICY_VERSION, "999"): True}, "pending_update": False}) - for policy_id, policy in ( - MockPolicyEngine2018.gen_all_policies_latest(version_offset=1).items())) + for policy_id, policy in all_policies.items()) response["policies"] = policies return response diff --git a/tests/pdp_api_v0/mock_websocket.py b/tests/pdp_api_v0/mock_websocket.py index 17f3bbe..3e3e63b 100644 --- a/tests/pdp_api_v0/mock_websocket.py +++ b/tests/pdp_api_v0/mock_websocket.py @@ -1,5 +1,5 @@ # ============LICENSE_START======================================================= -# Copyright (c) 2018-2019 AT&T Intellectual Property. All rights reserved. +# Copyright (c) 2018-2020 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. @@ -21,8 +21,8 @@ import time from policyhandler.pdp_api_v0.pdp_consts import POLICY_NAME from policyhandler.pdp_api_v0.policy_listener import (LOADED_POLICIES, - POLICY_VER, - REMOVED_POLICIES) + POLICY_VER, + REMOVED_POLICIES) from policyhandler.utils import Utils from .mock_policy_engine import MockPolicyEngine2018 diff --git a/tests/main/test_policy_rest.py b/tests/pdp_api_v0/test_policy_rest_auth.py index 964a21d..dd8dc83 100644 --- a/tests/main/test_policy_rest.py +++ b/tests/pdp_api_v0/test_policy_rest_auth.py @@ -1,5 +1,5 @@ # ============LICENSE_START======================================================= -# Copyright (c) 2018-2019 AT&T Intellectual Property. All rights reserved. +# Copyright (c) 2020 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. @@ -25,14 +25,14 @@ from policyhandler.onap.audit import Audit from policyhandler.utils import Utils from ..mock_tracker import Tracker -from .mock_policy_engine import MockPolicyEngine +from .mock_policy_engine import MockPolicyEngine2018 _LOGGER = Utils.get_logger(__file__) -@pytest.mark.usefixtures("fix_pdp_post") +@pytest.mark.usefixtures("fix_pdp_authorization", "fix_pdp_api_v0", "fix_pdp_post") def test_get_policy_latest(): """test /policy_latest/<policy-id>""" - policy_id, expected_policy = MockPolicyEngine.gen_policy_latest(3) + policy_id, expected_policy = MockPolicyEngine2018.gen_policy_latest(3) audit = Audit(job_name="test_get_policy_latest", req_message="get /policy_latest/{}".format(policy_id or "")) diff --git a/tests/pdp_api_v0/test_policyhandler.py b/tests/pdp_api_v0/test_policyhandler.py index 2b2629b..06de265 100644 --- a/tests/pdp_api_v0/test_policyhandler.py +++ b/tests/pdp_api_v0/test_policyhandler.py @@ -1,5 +1,5 @@ # ============LICENSE_START======================================================= -# Copyright (c) 2017-2019 AT&T Intellectual Property. All rights reserved. +# Copyright (c) 2017-2020 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. @@ -21,12 +21,13 @@ import json import time import uuid -import cherrypy import pytest -from cherrypy.test.helper import CPWebCase +import cherrypy +from cherrypy.test.helper import CPWebCase from policyhandler.config import Config -from policyhandler.onap.audit import REQUEST_X_ECOMP_REQUESTID, Audit +from policyhandler.onap.audit import (REQUEST_X_ECOMP_REQUESTID, + REQUEST_X_ONAP_REQUESTID, Audit) from policyhandler.pdp_api_v0.pdp_consts import POLICY_NAME from policyhandler.policy_consts import LATEST_POLICIES from policyhandler.policy_receiver import PolicyReceiver @@ -89,10 +90,6 @@ class WebServer2018Test(CPWebCase): _LOGGER.info("result: %s", result) _LOGGER.info("body: %s", self.body) - if Config.is_pdp_api_default(): - self.assertStatus('404 Not Found') - return - self.assertStatus('200 OK') policies_latest = json.loads(self.body) @@ -114,20 +111,18 @@ class WebServer2018Test(CPWebCase): expected_policies = MockPolicyEngine2018.gen_policies_latest(match_to_policy_name) body = json.dumps({POLICY_NAME: match_to_policy_name}) + request_id = str(uuid.uuid4()) result = self.getPage("/policies_latest", method='POST', body=body, headers=[ - (REQUEST_X_ECOMP_REQUESTID, str(uuid.uuid4())), + (REQUEST_X_ECOMP_REQUESTID, request_id), + (REQUEST_X_ONAP_REQUESTID, request_id), ("Content-Type", "application/json"), ('Content-Length', str(len(body))) ]) _LOGGER.info("result: %s", result) _LOGGER.info("body: %s", self.body) - if Config.is_pdp_api_default(): - self.assertStatus('404 Not Found') - return - self.assertStatus('200 OK') policies_latest = json.loads(self.body)[LATEST_POLICIES] @@ -144,10 +139,6 @@ class WebServer2018Test(CPWebCase): @pytest.mark.usefixtures("fix_deploy_handler", "fix_policy_receiver_websocket") def test_zzz_policy_updates_and_catch_ups(self): """test run policy handler with policy updates and catchups""" - if Config.is_pdp_api_default(): - _LOGGER.info("passive for new PDP API") - return - _LOGGER.info("start policy_updates_and_catch_ups") assert not PolicyReceiver.is_running() @@ -177,10 +168,6 @@ class WebServer2018Test(CPWebCase): @pytest.mark.usefixtures("fix_deploy_handler", "fix_policy_receiver_websocket") def test_zzz_catch_up_on_deploy_handler_changed(self): """test run policy handler with deployment-handler changed underneath""" - if Config.is_pdp_api_default(): - _LOGGER.info("passive for new PDP API") - return - _LOGGER.info("start zzz_catch_up_on_deploy_handler_changed") assert not PolicyReceiver.is_running() audit = Audit(job_name="test_zzz_catch_up_on_deploy_handler_changed", @@ -201,8 +188,8 @@ class WebServer2018Test(CPWebCase): _LOGGER.info("sleep after send_notification...") time.sleep(3) - _LOGGER.info("sleep 5 before shutdown...") - time.sleep(5) + _LOGGER.info("sleep 3 before shutdown...") + time.sleep(3) result = self.getPage("/healthcheck") _LOGGER.info("healthcheck result: %s", result) @@ -216,10 +203,6 @@ class WebServer2018Test(CPWebCase): @pytest.mark.usefixtures("fix_deploy_handler", "fix_policy_receiver_websocket") def test_zzz_get_catch_up(self): """test /catch_up""" - if Config.is_pdp_api_default(): - _LOGGER.info("passive for new PDP API") - return - _LOGGER.info("start /catch_up") assert not PolicyReceiver.is_running() audit = Audit(job_name="test_zzz_get_catch_up", req_message="start /catch_up") @@ -273,8 +256,4 @@ class WebServer2018Test(CPWebCase): time.sleep(1) assert not PolicyReceiver.is_running() - if Config.is_pdp_api_default(): - _LOGGER.info("passive for new PDP API") - return - Tracker.validate() diff --git a/tests/pdp_api_v0/test_pz_catch_up.py b/tests/pdp_api_v0/test_pz_catch_up.py index 3b37af5..8d461e8 100644 --- a/tests/pdp_api_v0/test_pz_catch_up.py +++ b/tests/pdp_api_v0/test_pz_catch_up.py @@ -1,5 +1,5 @@ # ============LICENSE_START======================================================= -# Copyright (c) 2018-2019 AT&T Intellectual Property. All rights reserved. +# Copyright (c) 2018-2020 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. @@ -21,7 +21,6 @@ import time import pytest -from policyhandler.config import Config from policyhandler.onap.audit import Audit from policyhandler.policy_receiver import PolicyReceiver from policyhandler.utils import Utils @@ -40,10 +39,6 @@ _LOGGER = Utils.get_logger(__file__) ) def test_catch_up_failed_dh(): """test run policy handler with catchups and failed deployment-handler""" - if Config.is_pdp_api_default(): - _LOGGER.info("passive for new PDP API") - return - _LOGGER.info("start test_catch_up_failed_dh") assert not PolicyReceiver.is_running() audit = Audit(job_name="test_catch_up_failed_dh", @@ -78,10 +73,6 @@ def test_catch_up_failed_dh(): ) def test_catch_up_dh_404(): """test run policy handler with catchups and failed deployment-handler""" - if Config.is_pdp_api_default(): - _LOGGER.info("passive for new PDP API") - return - _LOGGER.info("start test_catch_up_dh_404") assert not PolicyReceiver.is_running() audit = Audit(job_name="test_catch_up_dh_404", diff --git a/tests/pdp_api_v0/test_pz_pdp_boom.py b/tests/pdp_api_v0/test_pz_pdp_boom.py index effadc2..8ce42a7 100644 --- a/tests/pdp_api_v0/test_pz_pdp_boom.py +++ b/tests/pdp_api_v0/test_pz_pdp_boom.py @@ -1,5 +1,5 @@ # ============LICENSE_START======================================================= -# Copyright (c) 2018-2019 AT&T Intellectual Property. All rights reserved. +# Copyright (c) 2018-2020 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. @@ -23,9 +23,9 @@ import uuid import cherrypy import pytest from cherrypy.test.helper import CPWebCase - from policyhandler.config import Config -from policyhandler.onap.audit import (REQUEST_X_ECOMP_REQUESTID, Audit, +from policyhandler.onap.audit import (REQUEST_X_ECOMP_REQUESTID, + REQUEST_X_ONAP_REQUESTID, Audit, AuditHttpCode) from policyhandler.pdp_api_v0.pdp_consts import POLICY_NAME from policyhandler.policy_receiver import PolicyReceiver @@ -80,10 +80,6 @@ class WebServerPDPBoom2018Test(CPWebCase): _LOGGER.info("result: %s", result) _LOGGER.info("body: %s", self.body) - if Config.is_pdp_api_default(): - self.assertStatus('404 Not Found') - return - self.assertStatus(AuditHttpCode.SERVER_INTERNAL_ERROR.value) result = self.getPage("/healthcheck") @@ -96,20 +92,18 @@ class WebServerPDPBoom2018Test(CPWebCase): match_to_policy_name = MockPolicyEngine2018.scope_prefix + "amet.*" body = json.dumps({POLICY_NAME: match_to_policy_name}) + request_id = str(uuid.uuid4()) result = self.getPage("/policies_latest", method='POST', body=body, headers=[ - (REQUEST_X_ECOMP_REQUESTID, str(uuid.uuid4())), + (REQUEST_X_ECOMP_REQUESTID, request_id), + (REQUEST_X_ONAP_REQUESTID, request_id), ("Content-Type", "application/json"), ('Content-Length', str(len(body))) ]) _LOGGER.info("result: %s", result) _LOGGER.info("body: %s", self.body) - if Config.is_pdp_api_default(): - self.assertStatus('404 Not Found') - return - self.assertStatus(AuditHttpCode.SERVER_INTERNAL_ERROR.value) result = self.getPage("/healthcheck") @@ -120,10 +114,6 @@ class WebServerPDPBoom2018Test(CPWebCase): @pytest.mark.usefixtures("fix_deploy_handler", "fix_policy_receiver_websocket") def test_zzz_policy_updates_and_catch_ups(self): """test run policy handler with policy updates and catchups""" - if Config.is_pdp_api_default(): - _LOGGER.info("passive for new PDP API") - return - _LOGGER.info("start policy_updates_and_catch_ups") assert not PolicyReceiver.is_running() audit = Audit(job_name="test_zzz_policy_updates_and_catch_ups", @@ -152,10 +142,6 @@ class WebServerPDPBoom2018Test(CPWebCase): @pytest.mark.usefixtures("fix_deploy_handler", "fix_policy_receiver_websocket") def test_zzz_catch_up_on_deploy_handler_changed(self): """test run policy handler with deployment-handler changed underneath""" - if Config.is_pdp_api_default(): - _LOGGER.info("passive for new PDP API") - return - _LOGGER.info("start zzz_catch_up_on_deploy_handler_changed") assert not PolicyReceiver.is_running() audit = Audit(job_name="test_zzz_catch_up_on_deploy_handler_changed", @@ -191,10 +177,6 @@ class WebServerPDPBoom2018Test(CPWebCase): @pytest.mark.usefixtures("fix_deploy_handler", "fix_policy_receiver_websocket") def test_zzz_get_catch_up(self): """test /catch_up""" - if Config.is_pdp_api_default(): - _LOGGER.info("passive for new PDP API") - return - _LOGGER.info("start /catch_up") assert not PolicyReceiver.is_running() audit = Audit(job_name="test_zzz_get_catch_up", req_message="start /catch_up") @@ -248,8 +230,4 @@ class WebServerPDPBoom2018Test(CPWebCase): time.sleep(1) assert not PolicyReceiver.is_running() - if Config.is_pdp_api_default(): - _LOGGER.info("passive for new PDP API") - return - Tracker.validate() diff --git a/tests/pdp_api_v0/test_pz_ph_boom.py b/tests/pdp_api_v0/test_pz_ph_boom.py index 4203110..432450c 100644 --- a/tests/pdp_api_v0/test_pz_ph_boom.py +++ b/tests/pdp_api_v0/test_pz_ph_boom.py @@ -1,5 +1,5 @@ # ============LICENSE_START======================================================= -# Copyright (c) 2018-2019 AT&T Intellectual Property. All rights reserved. +# Copyright (c) 2018-2020 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. @@ -23,9 +23,9 @@ import uuid import cherrypy import pytest from cherrypy.test.helper import CPWebCase - from policyhandler.config import Config -from policyhandler.onap.audit import (REQUEST_X_ECOMP_REQUESTID, Audit, +from policyhandler.onap.audit import (REQUEST_X_ECOMP_REQUESTID, + REQUEST_X_ONAP_REQUESTID, Audit, AuditHttpCode) from policyhandler.pdp_api_v0.pdp_consts import POLICY_NAME from policyhandler.policy_receiver import PolicyReceiver @@ -81,10 +81,6 @@ class WebServerInternalBoom2018Test(CPWebCase): _LOGGER.info("result: %s", result) _LOGGER.info("body: %s", self.body) - if Config.is_pdp_api_default(): - self.assertStatus('404 Not Found') - return - self.assertStatus(AuditHttpCode.SERVER_INTERNAL_ERROR.value) result = self.getPage("/healthcheck") @@ -97,20 +93,18 @@ class WebServerInternalBoom2018Test(CPWebCase): match_to_policy_name = MockPolicyEngine2018.scope_prefix + "amet.*" body = json.dumps({POLICY_NAME: match_to_policy_name}) + request_id = str(uuid.uuid4()) result = self.getPage("/policies_latest", method='POST', body=body, headers=[ - (REQUEST_X_ECOMP_REQUESTID, str(uuid.uuid4())), + (REQUEST_X_ECOMP_REQUESTID, request_id), + (REQUEST_X_ONAP_REQUESTID, request_id), ("Content-Type", "application/json"), ('Content-Length', str(len(body))) ]) _LOGGER.info("result: %s", result) _LOGGER.info("body: %s", self.body) - if Config.is_pdp_api_default(): - self.assertStatus('404 Not Found') - return - self.assertStatus(AuditHttpCode.SERVER_INTERNAL_ERROR.value) result = self.getPage("/healthcheck") @@ -121,10 +115,6 @@ class WebServerInternalBoom2018Test(CPWebCase): @pytest.mark.usefixtures("fix_deploy_handler", "fix_policy_receiver_websocket") def test_zzz_policy_updates_and_catch_ups(self): """test run policy handler with policy updates and catchups""" - if Config.is_pdp_api_default(): - _LOGGER.info("passive for new PDP API") - return - _LOGGER.info("start policy_updates_and_catch_ups") assert not PolicyReceiver.is_running() audit = Audit(job_name="test_zzz_policy_updates_and_catch_ups", @@ -153,10 +143,6 @@ class WebServerInternalBoom2018Test(CPWebCase): @pytest.mark.usefixtures("fix_deploy_handler", "fix_policy_receiver_websocket") def test_zzz_catch_up_on_deploy_handler_changed(self): """test run policy handler with deployment-handler changed underneath""" - if Config.is_pdp_api_default(): - _LOGGER.info("passive for new PDP API") - return - _LOGGER.info("start zzz_catch_up_on_deploy_handler_changed") assert not PolicyReceiver.is_running() audit = Audit(job_name="test_zzz_catch_up_on_deploy_handler_changed", @@ -192,10 +178,6 @@ class WebServerInternalBoom2018Test(CPWebCase): @pytest.mark.usefixtures("fix_deploy_handler", "fix_policy_receiver_websocket") def test_zzz_get_catch_up(self): """test /catch_up""" - if Config.is_pdp_api_default(): - _LOGGER.info("passive for new PDP API") - return - _LOGGER.info("start /catch_up") assert not PolicyReceiver.is_running() audit = Audit(job_name="test_zzz_get_catch_up", req_message="start /catch_up") @@ -249,8 +231,4 @@ class WebServerInternalBoom2018Test(CPWebCase): time.sleep(1) assert not PolicyReceiver.is_running() - if Config.is_pdp_api_default(): - _LOGGER.info("passive for new PDP API") - return - Tracker.validate() diff --git a/version.properties b/version.properties index d49fe4b..cf34660 100644 --- a/version.properties +++ b/version.properties @@ -1,6 +1,6 @@ major=5
-minor=0
-patch=1
+minor=1
+patch=0
base_version=${major}.${minor}.${patch}
release_version=${base_version}
snapshot_version=${base_version}-SNAPSHOT
|