4.5.0 policy-handler - multi change
DCAEGEN2-853:
- stop reporting the absence of policies or updates
as error - this is an expected result == INFO or WARNING
DCAEGEN2-903: preparation for TLS on the web-server of policy-handler
DCAEGEN2-930:
- configurable timeouts for http requests from policy-handler
- added configurable pinging on the web-socket to PDP
- added healthcheck info on the web-socket
- upgraded websocket-client lib to 0.53.0
DCAEGEN2-1017: fixed a bug on policy-filter matching
by filter_config_name
- refactored and enhanced the unit-tests
Change-Id: I111ddc57bb978554ef376cbf916965b6667dad9b
Signed-off-by: Alex Shatov <alexs@att.com>
Issue-ID: DCAEGEN2-853
Issue-ID: DCAEGEN2-903
Issue-ID: DCAEGEN2-930
Issue-ID: DCAEGEN2-1017
diff --git a/README.md b/README.md
index 15c9002..65c2eba 100644
--- a/README.md
+++ b/README.md
@@ -1,19 +1,40 @@
-# policy_handler
+# ONAP DCAE policy-handler
+
+See [wiki for DCAE gen2 architecture of policy-handling by DCAE-controller](https://wiki.onap.org/display/DW/DCAE+gen2+architecture+of+policy-handling+by+DCAE-controller)
## web-service for policies to be used by DCAE-Controller
-- GET **/policy\_latest/***\<policy-id>* -- get the latest policy from policy-engine
-- receives the **push notifications** from policy-engine through the web-socket, filters and gets the full policy-configs, and delivers that to deploy-handler
+- GET `/policy_latest/<policy_id>` -- get the latest policy from policy-engine that is identified by `policy_id`
+- POST `/policies_latest` -- gets the latest policies that match to the **policy-filter** provided in the body of the request. The policy-filter mimics the body of the /getConfig on policy-engine.
+
+ sample request - policy-filter
+
+```json
+{
+ "configAttributes": { "key1":"value1" },
+ "configName": "alex_config_name",
+ "onapName": "DCAE",
+ "policyName": "DCAE_alex.Config_alex_.*",
+ "unique": false
+}
+```
+
+- GET `/healthcheck` - returns 200 OK and current run stats
+- **web-socket** to **policy-engine**
+ - receives the **push notifications** of the changed and removed policies from the policy-engine,
+ - matches the policy-updates to policies and policy-filters found in deployment-handler,
+ - retrieves the full policy-bodies of the matched policies,
+ - delivers the policy-updates to deployment-handler
## manual http API
-- GET **/catch_up** -- catch up with the latest state of the policy-engine
-- GET **/policies_latest** -- get all the latest policies in policy-engine through web-service API
-- GET **/shutdown** -- shutdown the server
+- GET `/policies_latest` -- get all the latest policies from policy-engine that either have the policy_id or match to the policy-filter found in deployment-handler deployments
+- GET `/catch_up` -- catch up with the latest state of the policy-engine
+- GET `/shutdown` -- shutdown the server
----------
-## installation
+## standalone installation
`virtualenv policy_venv`
@@ -37,18 +58,41 @@
----------
-## configure
+## local configure
-in folder `policy_handler`:
+local config file `policy_handler/etc/config.json` contains:
- - `config.json` contains
- - `"policy_engine"` - the http connect info to ONAP **policy-engine**
- - headers.ClientAuth : base64(<mech-id with namespace>:<password>)
- - headers.Authorization : base64(<policy-engine server auth>)
- - `"deploy_handler"` - the http connect info to _policy part_ of the **deploy-handler**
- - `policy_engine.properties` contains config info for the client lib of ONAP **policy-engine** that receives push notifications from the ONAP **policy-engine** server
- - CLIENT_ID is the mech-id with the namespace - need to register with policy-engine team thru email
- - CLIENT_KEY is the base64 of the mech-id password - separate passwords for TEST versus PROD
+```json
+{
+ "wservice_port" : 25577,
+ "consul_url" : "http://consul:8500",
+ "policy_handler" : {
+ "system" : "policy_handler",
+ "tls" : {
+ "cert_directory" : "etc/tls/certs/",
+ "cacert" : "cacert.pem",
+ "private_key" : "key.pem",
+ "server_cert" : "cert.pem",
+ "server_ca_chain" : "ca_chain.pem"
+ }
+ },
+ "logging" : {...}
+}
+```
+
+Field descriptions
+
+- `wservice_port` - port of the policy-hanlder web-service
+- `consul_url` - optional url for the consul agent
+- `policy_handler` - local config for policy-handler application
+ - `system` - general system name of the policy-handler
+ - `tls` - tls settings for the https clients and server - required to enable tls
+ - `cert_directory` - relative path pointing to the folder with certificates
+ - `cacert` - file name for the ca-cert or ca-bundle file in pem format in cert_directory -- used by https clients
+ - `private_key` - file name for the private key in cert_directory -- used by https server
+ - `server_cert` - file name for the https server certificate file in pem format in cert_directory
+ - `server_ca_chain` - file name for the optional https server ca-chain certificates file in pem format in cert_directory -- used when the ca-chain is not included in the server_cert file
+- `logging` - logging config for general logging
----------
@@ -72,24 +116,24 @@
### ```policyhandler/customize/``` folder
-contains ```CustomizeBase``` and ```Customize``` classes
+contains ```CustomizerBase``` and ```Customizer``` classes
-- ```CustomizeBase``` defines the interface and the default=ONAP behavior
+- ```CustomizerBase``` defines the interface and the default=ONAP behavior
-- ```CustomizeBase``` is owned by ONAP and should not be changed by the company
+- ```CustomizerBase``` is owned by ONAP and should not be changed by the company
-- ```Customize``` inherits ```CustomizeBase```
+- ```Customizer``` inherits ```CustomizerBase```
-- policy-handler instantiates ```Customize``` to get the customized behavior
+- policy-handler instantiates ```Customizer``` to get the customized behavior
-- ```Customize``` is owned by the company and should be changed by the company
-- ONAP is not going to change ```Customize```
+- ```Customizer``` is owned by the company and should be changed by the company
+- ONAP is not going to change ```Customizer```
-- the methods of ```Customize``` are expected to be overridden by the company to change the behavior of the policy-handler
+- the methods of ```Customizer``` are expected to be overridden by the company to change the behavior of the policy-handler
-- samples are provided for methods in ```Customize``` class as the commented out lines
+- samples are provided for methods in ```Customizer``` class as the commented out lines
-- Company is allowed to add more files to customize/ folder if that is required for better structuring of their code as soon as it is invoked by the methods of ```Customize```
+- Company is allowed to add more files to customize/ folder if that is required for better structuring of their code as soon as it is invoked by the methods of ```Customizer```
here is an example of ```customizer.py```
diff --git a/etc/config.json b/etc/config.json
index de7f6cc..ae5aa51 100644
--- a/etc/config.json
+++ b/etc/config.json
@@ -1,6 +1,7 @@
{
"wservice_port" : 25577,
"consul_url" : "http://consul:8500",
+ "consul_timeout_in_secs" : 60,
"policy_handler" : {
"system" : "policy_handler",
"tls" : {
diff --git a/policyhandler/config.py b/policyhandler/config.py
index d94ed79..5184f7f 100644
--- a/policyhandler/config.py
+++ b/policyhandler/config.py
@@ -148,24 +148,43 @@
TLS_CA_MODE = "tls_ca_mode"
TLS_WSS_CA_MODE = "tls_wss_ca_mode"
TLS_CA_MODE_DO_NOT_VERIFY = "do_not_verify"
+ TIMEOUT_IN_SECS = "timeout_in_secs"
+ CONSUL_TIMEOUT_IN_SECS = "consul_timeout_in_secs"
+ WS_PING_INTERVAL_IN_SECS = "ws_ping_interval_in_secs"
+ DEFAULT_TIMEOUT_IN_SECS = 60
system_name = SERVICE_NAME_POLICY_HANDLER
wservice_port = 25577
consul_url = "http://consul:8500"
+ consul_timeout_in_secs = DEFAULT_TIMEOUT_IN_SECS
tls_cacert_file = None
tls_server_cert_file = None
tls_private_key_file = None
+ tls_server_ca_chain_file = None
_local_config = Settings()
discovered_config = Settings()
@staticmethod
+ def _get_tls_file_path(tls_config, cert_directory, tls_name):
+ """calc file path and verify its existance"""
+ file_name = tls_config.get(tls_name)
+ if not file_name:
+ return None
+ tls_file_path = os.path.join(cert_directory, file_name)
+ if not os.path.isfile(tls_file_path) or not os.access(tls_file_path, os.R_OK):
+ Config._logger.error("invalid %s: %s", tls_name, tls_file_path)
+ return None
+ return tls_file_path
+
+ @staticmethod
def _set_tls_config(tls_config):
"""verify and set tls certs in config"""
try:
Config.tls_cacert_file = None
Config.tls_server_cert_file = None
Config.tls_private_key_file = None
+ Config.tls_server_ca_chain_file = None
if not (tls_config and isinstance(tls_config, dict)):
Config._logger.info("no tls in config: %s", json.dumps(tls_config))
@@ -174,43 +193,28 @@
cert_directory = tls_config.get("cert_directory")
if not (cert_directory and isinstance(cert_directory, str)):
- Config._logger.info("unexpected tls.cert_directory: %r", cert_directory)
+ Config._logger.warning("unexpected tls.cert_directory: %r", cert_directory)
return
cert_directory = os.path.join(
os.path.dirname(os.path.dirname(os.path.realpath(__file__))), cert_directory)
if not (cert_directory and os.path.isdir(cert_directory)):
- Config._logger.info("ignoring invalid cert_directory: %s", cert_directory)
+ Config._logger.warning("ignoring invalid cert_directory: %s", cert_directory)
return
- cacert = tls_config.get("cacert")
- if cacert:
- tls_cacert_file = os.path.join(cert_directory, cacert)
- if not os.path.isfile(tls_cacert_file):
- Config._logger.error("invalid tls_cacert_file: %s", tls_cacert_file)
- else:
- Config.tls_cacert_file = tls_cacert_file
-
- server_cert = tls_config.get("server_cert")
- if server_cert:
- tls_server_cert_file = os.path.join(cert_directory, server_cert)
- if not os.path.isfile(tls_server_cert_file):
- Config._logger.error("invalid tls_server_cert_file: %s", tls_server_cert_file)
- else:
- Config.tls_server_cert_file = tls_server_cert_file
-
- private_key = tls_config.get("private_key")
- if private_key:
- tls_private_key_file = os.path.join(cert_directory, private_key)
- if not os.path.isfile(tls_private_key_file):
- Config._logger.error("invalid tls_private_key_file: %s", tls_private_key_file)
- else:
- Config.tls_private_key_file = tls_private_key_file
+ Config.tls_cacert_file = Config._get_tls_file_path(tls_config, cert_directory, "cacert")
+ Config.tls_server_cert_file = Config._get_tls_file_path(tls_config, cert_directory,
+ "server_cert")
+ Config.tls_private_key_file = Config._get_tls_file_path(tls_config, cert_directory,
+ "private_key")
+ Config.tls_server_ca_chain_file = Config._get_tls_file_path(tls_config, cert_directory,
+ "server_ca_chain")
finally:
Config._logger.info("tls_cacert_file = %s", Config.tls_cacert_file)
Config._logger.info("tls_server_cert_file = %s", Config.tls_server_cert_file)
Config._logger.info("tls_private_key_file = %s", Config.tls_private_key_file)
+ Config._logger.info("tls_server_ca_chain_file = %s", Config.tls_server_ca_chain_file)
@staticmethod
def init_config(file_path=None):
@@ -239,6 +243,9 @@
Config.wservice_port = loaded_config.get(Config.FIELD_WSERVICE_PORT, Config.wservice_port)
Config.consul_url = os.environ.get(
"CONSUL_URL", loaded_config.get(Config.FIELD_CONSUL_URL, Config.consul_url)).rstrip("/")
+ Config.consul_timeout_in_secs = loaded_config.get(Config.CONSUL_TIMEOUT_IN_SECS)
+ if not Config.consul_timeout_in_secs or Config.consul_timeout_in_secs < 1:
+ Config.consul_timeout_in_secs = Config.DEFAULT_TIMEOUT_IN_SECS
local_config = loaded_config.get(Config.SERVICE_NAME_POLICY_HANDLER, {})
Config.system_name = local_config.get(Config.FIELD_SYSTEM, Config.system_name)
@@ -250,7 +257,7 @@
@staticmethod
def discover(audit):
- """bring and merge the config settings from the discovery service"""
+ """bring the config settings from the discovery service"""
discovery_key = Config.system_name
from .discovery import DiscoveryClient
new_config = DiscoveryClient.get_value(audit, discovery_key)
diff --git a/policyhandler/deploy_handler.py b/policyhandler/deploy_handler.py
index b4b2468..0ffacba 100644
--- a/policyhandler/deploy_handler.py
+++ b/policyhandler/deploy_handler.py
@@ -145,6 +145,7 @@
"""calling the deployment-handler web apis"""
_logger = logging.getLogger("policy_handler.deploy_handler")
DEFAULT_TARGET_ENTITY = "deployment_handler"
+ DEFAULT_TIMEOUT_IN_SECS = 60
_lazy_inited = False
_lock = Lock()
@@ -158,6 +159,7 @@
_target_entity = None
_custom_kwargs = {}
_server_instance_uuid = None
+ _timeout_in_secs = DEFAULT_TIMEOUT_IN_SECS
server_instance_changed = False
@staticmethod
@@ -188,7 +190,8 @@
# "query" : {
# "cfy_tenant_name" : "default_tenant"
# },
- # "tls_ca_mode" : "cert_directory"
+ # "tls_ca_mode" : "cert_directory",
+ # "timeout_in_secs": 60
# }
DeployHandler._target_entity = config_dh.get(TARGET_ENTITY,
DeployHandler.DEFAULT_TARGET_ENTITY)
@@ -204,6 +207,10 @@
DeployHandler._target_entity, DeployHandler._url,
tls_ca_mode, json.dumps(DeployHandler._custom_kwargs))
+ DeployHandler._timeout_in_secs = config_dh.get(Config.TIMEOUT_IN_SECS)
+ if not DeployHandler._timeout_in_secs or DeployHandler._timeout_in_secs < 1:
+ DeployHandler._timeout_in_secs = DeployHandler.DEFAULT_TIMEOUT_IN_SECS
+
if not DeployHandler._url:
# discover routing to deployment-handler at consul-services
if not isinstance(config_dh, dict):
@@ -290,6 +297,7 @@
target_entity = DeployHandler._target_entity
url = DeployHandler._url_policy
params = deepcopy(DeployHandler._query)
+ timeout_in_secs = DeployHandler._timeout_in_secs
custom_kwargs = deepcopy(DeployHandler._custom_kwargs)
metrics = Metrics(aud_parent=audit, targetEntity="{} policy_update".format(target_entity),
@@ -297,9 +305,9 @@
headers = {REQUEST_X_ECOMP_REQUESTID : metrics.request_id}
log_action = "put to {} at {}".format(target_entity, url)
- log_data = "msg={} headers={}, params={} custom_kwargs({})".format(
+ log_data = "msg={} headers={}, params={}, timeout_in_secs={}, custom_kwargs({})".format(
json.dumps(message), json.dumps(headers),
- json.dumps(params), json.dumps(custom_kwargs))
+ json.dumps(params), timeout_in_secs, json.dumps(custom_kwargs))
log_line = log_action + " " + log_data
DeployHandler._logger.info(log_line)
@@ -315,7 +323,8 @@
res = None
try:
- res = session.put(url, json=message, headers=headers, params=params, **custom_kwargs)
+ res = session.put(url, json=message, headers=headers, params=params,
+ timeout=timeout_in_secs, **custom_kwargs)
except Exception as ex:
error_code = (AuditHttpCode.SERVICE_UNAVAILABLE_ERROR.value
if isinstance(ex, requests.exceptions.RequestException)
@@ -357,6 +366,7 @@
target_entity = DeployHandler._target_entity
url = DeployHandler._url_policy
params = deepcopy(DeployHandler._query)
+ timeout_in_secs = DeployHandler._timeout_in_secs
custom_kwargs = deepcopy(DeployHandler._custom_kwargs)
metrics = Metrics(aud_parent=audit,
@@ -365,8 +375,8 @@
headers = {REQUEST_X_ECOMP_REQUESTID : metrics.request_id}
log_action = "get from {} at {}".format(target_entity, url)
- log_data = "headers={}, params={} custom_kwargs({})".format(
- json.dumps(headers), json.dumps(params), json.dumps(custom_kwargs))
+ log_data = "headers={}, params={}, timeout_in_secs={}, custom_kwargs({})".format(
+ json.dumps(headers), json.dumps(params), timeout_in_secs, json.dumps(custom_kwargs))
log_line = log_action + " " + log_data
DeployHandler._logger.info(log_line)
@@ -382,7 +392,8 @@
res = None
try:
- res = session.get(url, headers=headers, params=params, **custom_kwargs)
+ res = session.get(url, headers=headers, params=params, timeout=timeout_in_secs,
+ **custom_kwargs)
except Exception as ex:
error_code = (AuditHttpCode.SERVICE_UNAVAILABLE_ERROR.value
if isinstance(ex, requests.exceptions.RequestException)
@@ -412,7 +423,7 @@
policies = result.get(POLICIES, {})
policy_filters = result.get(POLICY_FILTERS, {})
if not policies and not policy_filters:
- audit.set_http_status_code(AuditHttpCode.DATA_NOT_FOUND_ERROR.value)
+ audit.set_http_status_code(AuditHttpCode.DATA_NOT_FOUND_OK.value)
DeployHandler._logger.warning(audit.warn(
"found no deployed policies or policy-filters: {}".format(log_line),
error_code=AuditResponseCode.DATA_ERROR))
diff --git a/policyhandler/discovery.py b/policyhandler/discovery.py
index 5a35525..4c5b64e 100644
--- a/policyhandler/discovery.py
+++ b/policyhandler/discovery.py
@@ -56,7 +56,7 @@
@staticmethod
def _discover_service(audit, service_name, service_path):
"""find the service record in consul"""
- response = requests.get(service_path)
+ response = requests.get(service_path, timeout=Config.consul_timeout_in_secs)
DiscoveryClient._logger.info(audit.info("response {} from {}: {}".format(
response.status_code, service_path, response.text)))
@@ -113,7 +113,7 @@
@staticmethod
def _get_value_from_kv(url):
"""get the value from consul-kv at discovery url"""
- response = requests.get(url)
+ response = requests.get(url, timeout=Config.consul_timeout_in_secs)
response.raise_for_status()
data = response.json()
value = base64.b64decode(data[0]["Value"]).decode("utf-8")
@@ -129,6 +129,7 @@
log_line = "get from {} at {}".format(DiscoveryClient.CONSUL_ENTITY, discovery_url)
DiscoveryClient._logger.info(metrics.metrics_start(log_line))
+ status_code = None
try:
status_code, value = DiscoveryClient._get_value_from_kv(discovery_url)
except Exception as ex:
diff --git a/policyhandler/onap/audit.py b/policyhandler/onap/audit.py
index 1bee4a7..d63d0b2 100644
--- a/policyhandler/onap/audit.py
+++ b/policyhandler/onap/audit.py
@@ -64,10 +64,10 @@
class AuditHttpCode(Enum):
"""audit http codes"""
HTTP_OK = 200
+ DATA_NOT_FOUND_OK = 204
PERMISSION_UNAUTHORIZED_ERROR = 401
PERMISSION_FORBIDDEN_ERROR = 403
RESPONSE_ERROR = 400
- DATA_NOT_FOUND_ERROR = 404
SERVER_INTERNAL_ERROR = 500
SERVICE_UNAVAILABLE_ERROR = 503
DATA_ERROR = 1030
@@ -88,7 +88,7 @@
def get_response_code(http_status_code):
"""calculates the response_code from max_http_status_code"""
response_code = AuditResponseCode.UNKNOWN_ERROR
- if http_status_code <= AuditHttpCode.HTTP_OK.value:
+ if http_status_code <= AuditHttpCode.DATA_NOT_FOUND_OK.value:
response_code = AuditResponseCode.SUCCESS
elif http_status_code in [AuditHttpCode.PERMISSION_UNAUTHORIZED_ERROR.value,
@@ -99,8 +99,7 @@
elif http_status_code == AuditHttpCode.SERVER_INTERNAL_ERROR.value:
response_code = AuditResponseCode.BUSINESS_PROCESS_ERROR
elif http_status_code in [AuditHttpCode.DATA_ERROR.value,
- AuditHttpCode.RESPONSE_ERROR.value,
- AuditHttpCode.DATA_NOT_FOUND_ERROR.value]:
+ AuditHttpCode.RESPONSE_ERROR.value]:
response_code = AuditResponseCode.DATA_ERROR
elif http_status_code == AuditHttpCode.SCHEMA_ERROR.value:
response_code = AuditResponseCode.SCHEMA_ERROR
@@ -138,6 +137,7 @@
_hostname = os.environ.get(HOSTNAME)
_health = Health()
+ _health_checkers = {}
_py_ver = sys.version.replace("\n", "")
_packages = []
@@ -167,6 +167,31 @@
pass
+ def __init__(self, job_name=None, request_id=None, req_message=None, **kwargs):
+ """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
+ :req_message: is the request message string for logging
+ :kwargs: - put any request related params into kwargs
+ """
+ self.job_name = _Audit._key_format.sub('_', job_name or req_message or _Audit._service_name)
+ self.request_id = request_id
+ self.req_message = req_message or ""
+ self.kwargs = kwargs or {}
+
+ self.max_http_status_code = 0
+ self._lock = threading.Lock()
+
+
+ @staticmethod
+ def register_item_health(health_name, health_getter):
+ """
+ register the health-checker for the additional item
+ by its health_name and the function health_getter that returns its health status as json
+ """
+ _Audit._health_checkers[health_name] = health_getter
+
def health(self, full=False):
"""returns json for health check"""
utcnow = datetime.utcnow()
@@ -186,33 +211,21 @@
"process_memory" : ProcessInfo.process_memory()
},
"stats" : _Audit._health.dump(),
+ "items" : dict((health_name, health_getter())
+ for health_name, health_getter in _Audit._health_checkers.items()),
"soft" : {"python" : _Audit._py_ver, "packages" : _Audit._packages}
}
- self.info("{} health: {}".format(_Audit._service_name, json.dumps(health)))
+ self.info("{} health: {}".format(_Audit._service_name,
+ json.dumps(health, sort_keys=True)))
return health
+
def process_info(self):
"""get the debug info on all the threads and memory"""
process_info = ProcessInfo.get_all()
self.info("{} process_info: {}".format(_Audit._service_name, json.dumps(process_info)))
return process_info
- def __init__(self, job_name=None, request_id=None, req_message=None, **kwargs):
- """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
- :req_message: is the request message string for logging
- :kwargs: - put any request related params into kwargs
- """
- self.job_name = _Audit._key_format.sub('_', job_name or req_message or _Audit._service_name)
- self.request_id = request_id
- self.req_message = req_message or ""
- self.kwargs = kwargs or {}
-
- self.max_http_status_code = 0
- self._lock = threading.Lock()
-
def merge_all_kwargs(self, **kwargs):
"""returns the merge of copy of self.kwargs with the param kwargs"""
@@ -230,7 +243,7 @@
def reset_http_status_not_found(self):
"""resets the highest(worst) http status code if data not found"""
with self._lock:
- if self.max_http_status_code == AuditHttpCode.DATA_NOT_FOUND_ERROR.value:
+ if self.max_http_status_code == AuditHttpCode.DATA_NOT_FOUND_OK.value:
self.max_http_status_code = 0
def get_max_http_status_code(self):
@@ -252,25 +265,23 @@
== AuditResponseCode.get_response_code(status_code).value
or self.get_max_http_status_code() >= AuditHttpCode.SERVER_INTERNAL_ERROR.value)
- def _get_response_status(self, not_found_ok=None):
+ def _get_response_status(self):
"""calculates the response status fields from max_http_status_code"""
max_http_status_code = self.get_max_http_status_code()
response_code = AuditResponseCode.get_response_code(max_http_status_code)
- success = ((response_code.value == AuditResponseCode.SUCCESS.value)
- or (not_found_ok
- and max_http_status_code == AuditHttpCode.DATA_NOT_FOUND_ERROR.value))
+ success = (response_code.value == AuditResponseCode.SUCCESS.value)
response_description = AuditResponseCode.get_human_text(response_code)
return success, max_http_status_code, response_code, response_description
def is_success(self):
- """returns whether the response_code is success"""
+ """returns whether the response_code is success or 204 - not found"""
success, _, _, _ = self._get_response_status()
return success
- def is_success_or_not_found(self):
- """returns whether the response_code is success or 404 - not found"""
- success, _, _, _ = self._get_response_status(not_found_ok=True)
- return success
+ def is_not_found(self):
+ """returns whether the response_code is 204 - not found"""
+ max_http_status_code = self.get_max_http_status_code()
+ return max_http_status_code == AuditHttpCode.DATA_NOT_FOUND_OK.value
def debug(self, log_line, **kwargs):
"""debug - the debug=lowest level of logging"""
@@ -397,8 +408,8 @@
def audit_done(self, result=None, **kwargs):
"""debug+audit - the audit=top level of logging"""
all_kwargs = self.merge_all_kwargs(**kwargs)
- success, max_http_status_code, response_code, response_description = \
- self._get_response_status()
+ (success, max_http_status_code,
+ response_code, response_description) = self._get_response_status()
log_line = "{0} {1}".format(self.req_message, result or "").strip()
audit_func = None
timer = _Audit.get_elapsed_time(self._started)
@@ -461,8 +472,8 @@
def metrics(self, log_line, **kwargs):
"""debug+metrics - the metrics=sub-audit level of logging"""
all_kwargs = self.merge_all_kwargs(**kwargs)
- success, max_http_status_code, response_code, response_description = \
- self._get_response_status()
+ (success, max_http_status_code,
+ response_code, response_description) = self._get_response_status()
metrics_func = None
timer = _Audit.get_elapsed_time(self._metrics_started)
if success:
diff --git a/policyhandler/policy_matcher.py b/policyhandler/policy_matcher.py
index 71b5ce8..d0786ba 100644
--- a/policyhandler/policy_matcher.py
+++ b/policyhandler/policy_matcher.py
@@ -23,6 +23,7 @@
import re
from .deploy_handler import DeployHandler, PolicyUpdateMessage
+from .onap.audit import AuditHttpCode, AuditResponseCode
from .policy_consts import (ERRORED_POLICIES, LATEST_POLICIES,
MATCHING_CONDITIONS, POLICY_BODY, POLICY_FILTER,
POLICY_NAME, POLICY_VERSION, POLICY_VERSIONS)
@@ -36,15 +37,32 @@
PENDING_UPDATE = "pending_update"
@staticmethod
- def get_latest_policies(audit):
- """
- find the latest policies from policy-engine for the deployed policies and policy-filters
- """
+ 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"
+ PolicyMatcher._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"
PolicyMatcher._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
+ """
+
+ if not (deployed_policies or deployed_policy_filters):
+ error_txt = "no deployed policies or policy-filters"
+ PolicyMatcher._logger.warning(error_txt)
return {"error": error_txt}, None
coarse_regex_patterns = PolicyMatcher.calc_coarse_patterns(
@@ -54,7 +72,9 @@
error_txt = ("failed to construct the coarse_regex_patterns from " +
"deployed_policies: {} and deployed_policy_filters: {}"
.format(deployed_policies, deployed_policy_filters))
- PolicyMatcher._logger.error(error_txt)
+ PolicyMatcher._logger.error(audit.error(
+ error_txt, error_code=AuditResponseCode.DATA_ERROR))
+ audit.set_http_status_code(AuditHttpCode.DATA_ERROR.value)
return {"error": error_txt}, None
pdp_response = PolicyRest.get_latest_policies(
@@ -62,9 +82,9 @@
for policy_name_pattern in coarse_regex_patterns]
)
- if not audit.is_success_or_not_found():
+ if not audit.is_success():
error_txt = "failed to retrieve policies from policy-engine"
- PolicyMatcher._logger.error(error_txt)
+ PolicyMatcher._logger.warning(error_txt)
return {"error": error_txt}, None
latest_policies = pdp_response.get(LATEST_POLICIES, {})
@@ -90,6 +110,7 @@
removed_policies,
policy_filter_matches))
+
@staticmethod
def calc_coarse_patterns(audit, deployed_policies, deployed_policy_filters):
"""calculate the coarsed patterns on policy-names in policies and policy-filters"""
@@ -109,6 +130,7 @@
coarse_regex.patterns)))
return coarse_regex_patterns
+
@staticmethod
def match_to_deployed_policies(audit, policies_updated, policies_removed):
"""match the policies_updated, policies_removed versus deployed policies"""
@@ -125,6 +147,7 @@
return changed_policies, policies_removed, policy_filter_matches
+
@staticmethod
def _match_policies(audit, policies, deployed_policies, deployed_policy_filters):
"""
@@ -174,6 +197,7 @@
return matching_policies, changed_policies, policy_filter_matches
+
@staticmethod
def _match_policy_to_filter(audit, policy_id, policy, policy_filter_id, policy_filter):
"""Match the policy to the policy-filter"""
@@ -218,7 +242,7 @@
filter_config_name = policy_filter.get("configName")
policy_config_name = matching_conditions.get("ConfigName")
- if filter_onap_name and filter_config_name != policy_config_name:
+ if filter_config_name and filter_config_name != policy_config_name:
PolicyMatcher._logger.debug(
audit.debug("not match by configName: {} != {}: {}"
.format(policy_config_name, filter_config_name, log_line)))
diff --git a/policyhandler/policy_receiver.py b/policyhandler/policy_receiver.py
index 3ae25fc..249c1f7 100644
--- a/policyhandler/policy_receiver.py
+++ b/policyhandler/policy_receiver.py
@@ -28,14 +28,16 @@
import copy
import json
import logging
-import os
import ssl
import time
+import urllib.parse
+from datetime import datetime
from threading import Lock, Thread
import websocket
from .config import Config, Settings
+from .onap.audit import Audit
from .policy_consts import MATCHING_CONDITIONS, POLICY_NAME, POLICY_VERSION
from .policy_updater import PolicyUpdater
from .policy_utils import Utils
@@ -48,8 +50,17 @@
class _PolicyReceiver(Thread):
"""web-socket to PolicyEngine"""
_logger = logging.getLogger("policy_handler.policy_receiver")
+ WS_STARTED = "started"
+ WS_START_COUNT = "start_count"
+ WS_CLOSE_COUNT = "close_count"
+ WS_ERROR_COUNT = "error_count"
+ WS_PONG_COUNT = "pong_count"
+ WS_MESSAGE_COUNT = "message_count"
+ WS_MESSAGE_TIMESTAMP = "message_timestamp"
+ WS_STATUS = "status"
+ WS_PING_INTERVAL_DEFAULT = 180
- def __init__(self):
+ def __init__(self, audit):
"""web-socket inside the thread to receive policy notifications from PolicyEngine"""
Thread.__init__(self, name="policy_receiver", daemon=True)
@@ -62,14 +73,26 @@
self._web_socket_sslopt = None
self._tls_wss_ca_mode = None
self._web_socket = None
- self.reconfigure()
+ self._ws_ping_interval_in_secs = _PolicyReceiver.WS_PING_INTERVAL_DEFAULT
+ self._web_socket_health = {
+ _PolicyReceiver.WS_START_COUNT: 0,
+ _PolicyReceiver.WS_CLOSE_COUNT: 0,
+ _PolicyReceiver.WS_ERROR_COUNT: 0,
+ _PolicyReceiver.WS_PONG_COUNT: 0,
+ _PolicyReceiver.WS_MESSAGE_COUNT: 0,
+ _PolicyReceiver.WS_STATUS: "created"
+ }
- self._policy_updater = PolicyUpdater(self.reconfigure)
- self._policy_updater.start()
+ Audit.register_item_health("web_socket_health", self._get_health)
+ self._reconfigure(audit)
- def reconfigure(self):
+ self._policy_updater = PolicyUpdater(self._reconfigure)
+
+ def _reconfigure(self, audit):
"""configure and reconfigure the web-socket"""
with self._lock:
+ _PolicyReceiver._logger.info(audit.info("web_socket_health {}".format(
+ json.dumps(self._get_health(), sort_keys=True))))
self._sleep_before_restarting = 5
self._settings.set_config(Config.discovered_config)
changed, config = self._settings.get_by_key(Config.FIELD_POLICY_ENGINE)
@@ -80,13 +103,19 @@
prev_web_socket_url = self._web_socket_url
prev_web_socket_sslopt = self._web_socket_sslopt
+ prev_ws_ping_interval_in_secs = self._ws_ping_interval_in_secs
+
self._web_socket_sslopt = None
- resturl = (config.get("url", "").lower()
- + config.get("path_notifications", "/pdp/notifications"))
+ resturl = urllib.parse.urljoin(config.get("url", "").lower().rstrip("/") + "/",
+ config.get("path_notifications", "/pdp/notifications"))
self._tls_wss_ca_mode = config.get(Config.TLS_WSS_CA_MODE)
+ self._ws_ping_interval_in_secs = config.get(Config.WS_PING_INTERVAL_IN_SECS)
+ if not self._ws_ping_interval_in_secs or self._ws_ping_interval_in_secs < 60:
+ self._ws_ping_interval_in_secs = _PolicyReceiver.WS_PING_INTERVAL_DEFAULT
+
if resturl.startswith("https:"):
self._web_socket_url = resturl.replace("https:", "wss:")
@@ -101,17 +130,19 @@
else:
self._web_socket_url = resturl.replace("http:", "ws:")
+ log_changed = (
+ "changed web_socket_url(%s) or tls_wss_ca_mode(%s)"
+ " or ws_ping_interval_in_secs(%s): %s" %
+ (self._web_socket_url, self._tls_wss_ca_mode, self._ws_ping_interval_in_secs,
+ self._settings))
if (self._web_socket_url == prev_web_socket_url
- and Utils.are_the_same(prev_web_socket_sslopt, self._web_socket_sslopt)):
- _PolicyReceiver._logger.info(
- "not changed web_socket_url(%s) or tls_wss_ca_mode(%s): %s",
- self._web_socket_url, self._tls_wss_ca_mode, self._settings)
+ and Utils.are_the_same(prev_web_socket_sslopt, self._web_socket_sslopt)
+ and prev_ws_ping_interval_in_secs == self._ws_ping_interval_in_secs):
+ _PolicyReceiver._logger.info(audit.info("not {}".format(log_changed)))
self._settings.commit_change()
return False
- _PolicyReceiver._logger.info("changed web_socket_url(%s) or tls_wss_ca_mode(%s): %s",
- self._web_socket_url, self._tls_wss_ca_mode,
- self._settings)
+ _PolicyReceiver._logger.info(audit.info(log_changed))
self._settings.commit_change()
self._stop_notifications()
@@ -119,6 +150,8 @@
def run(self):
"""listen on web-socket and pass the policy notifications to policy-updater"""
+ self._policy_updater.start()
+ _PolicyReceiver._logger.info("starting policy_receiver...")
websocket.enableTrace(True)
restarting = False
while True:
@@ -142,6 +175,7 @@
web_socket_url = self._web_socket_url
sslopt = copy.deepcopy(self._web_socket_sslopt)
tls_wss_ca_mode = self._tls_wss_ca_mode
+ ws_ping_interval_in_secs = self._ws_ping_interval_in_secs
_PolicyReceiver._logger.info(
"connecting to policy-notifications at %s with sslopt(%s) tls_wss_ca_mode(%s)",
@@ -149,13 +183,15 @@
self._web_socket = websocket.WebSocketApp(
web_socket_url,
+ on_open=self._on_ws_open,
on_message=self._on_pdp_message,
on_close=self._on_ws_close,
- on_error=self._on_ws_error
+ on_error=self._on_ws_error,
+ on_pong=self._on_ws_pong
)
_PolicyReceiver._logger.info("waiting for policy-notifications...")
- self._web_socket.run_forever(sslopt=sslopt)
+ self._web_socket.run_forever(sslopt=sslopt, ping_interval=ws_ping_interval_in_secs)
restarting = True
_PolicyReceiver._logger.info("exit policy-receiver")
@@ -175,9 +211,13 @@
def _on_pdp_message(self, *args):
"""received the notification from PDP"""
+ self._web_socket_health[_PolicyReceiver.WS_MESSAGE_COUNT] += 1
+ self._web_socket_health[_PolicyReceiver.WS_MESSAGE_TIMESTAMP] = str(datetime.utcnow())
try:
message = args and args[-1]
_PolicyReceiver._logger.info("Received notification message: %s", message)
+ _PolicyReceiver._logger.info("web_socket_health %s",
+ json.dumps(self._get_health(), sort_keys=True))
if not message:
return
message = json.loads(message)
@@ -216,9 +256,47 @@
_PolicyReceiver._logger.exception("policy-notification error %s", str(error))
self._sleep_before_restarting = 60 if isinstance(error, ssl.SSLError) else 5
+ self._web_socket_health[_PolicyReceiver.WS_STATUS] = "error"
+ self._web_socket_health[_PolicyReceiver.WS_ERROR_COUNT] += 1
+ self._web_socket_health["last_error"] = {
+ "error": str(error), "timestamp": str(datetime.utcnow())
+ }
+ _PolicyReceiver._logger.info("web_socket_health %s",
+ json.dumps(self._get_health(), sort_keys=True))
+
def _on_ws_close(self, code, reason):
"""restart web-socket on close"""
- _PolicyReceiver._logger.info("lost connection(%s, %s) to PDP - restarting...", code, reason)
+ self._web_socket_health["last_closed"] = str(datetime.utcnow())
+ self._web_socket_health[_PolicyReceiver.WS_STATUS] = "closed"
+ self._web_socket_health[_PolicyReceiver.WS_CLOSE_COUNT] += 1
+ _PolicyReceiver._logger.info(
+ "lost connection(%s, %s) to PDP - restarting... web_socket_health %s",
+ code, reason, json.dumps(self._get_health(), sort_keys=True))
+
+ def _on_ws_open(self):
+ """started web-socket"""
+ self._web_socket_health[_PolicyReceiver.WS_STATUS] = _PolicyReceiver.WS_STARTED
+ self._web_socket_health[_PolicyReceiver.WS_START_COUNT] += 1
+ self._web_socket_health[_PolicyReceiver.WS_STARTED] = datetime.utcnow()
+ _PolicyReceiver._logger.info("opened connection to PDP web_socket_health %s",
+ json.dumps(self._get_health(), sort_keys=True))
+
+ def _on_ws_pong(self, pong):
+ """pong = response to pinging the server of the web-socket"""
+ self._web_socket_health[_PolicyReceiver.WS_PONG_COUNT] += 1
+ _PolicyReceiver._logger.info(
+ "pong(%s) from connection to PDP web_socket_health %s",
+ pong, json.dumps(self._get_health(), sort_keys=True))
+
+ def _get_health(self):
+ """returns the healthcheck of the web-socket as json"""
+ web_socket_health = copy.deepcopy(self._web_socket_health)
+ started = web_socket_health.get(_PolicyReceiver.WS_STARTED)
+ if started:
+ web_socket_health[_PolicyReceiver.WS_STARTED] = str(started)
+ web_socket_health["uptime"] = str(datetime.utcnow() - started)
+ return web_socket_health
+
def shutdown(self, audit):
"""Shutdown the policy-receiver"""
@@ -237,11 +315,20 @@
"""need to bring the latest policies to DCAE-Controller"""
self._policy_updater.catch_up(audit)
+ def is_running(self):
+ """check whether the policy-receiver and policy-updater are running"""
+ return self.is_alive() and self._policy_updater.is_alive()
+
class PolicyReceiver(object):
"""policy-receiver - static singleton wrapper"""
_policy_receiver = None
@staticmethod
+ def is_running():
+ """check whether the policy-receiver runs"""
+ return PolicyReceiver._policy_receiver and PolicyReceiver._policy_receiver.is_running()
+
+ @staticmethod
def shutdown(audit):
"""Shutdown the notification-handler"""
PolicyReceiver._policy_receiver.shutdown(audit)
@@ -254,7 +341,7 @@
@staticmethod
def run(audit):
"""Using policy-engine client to talk to policy engine"""
- PolicyReceiver._policy_receiver = _PolicyReceiver()
+ PolicyReceiver._policy_receiver = _PolicyReceiver(audit)
PolicyReceiver._policy_receiver.start()
PolicyReceiver.catch_up(audit)
diff --git a/policyhandler/policy_rest.py b/policyhandler/policy_rest.py
index 0713b38..85dd914 100644
--- a/policyhandler/policy_rest.py
+++ b/policyhandler/policy_rest.py
@@ -22,6 +22,7 @@
import json
import logging
import time
+import urllib.parse
from multiprocessing.dummy import Pool as ThreadPool
from threading import Lock
@@ -51,6 +52,7 @@
EXPECTED_VERSIONS = "expected_versions"
IGNORE_POLICY_NAMES = "ignore_policy_names"
+ DEFAULT_TIMEOUT_IN_SECS = 60
_lock = Lock()
_settings = Settings(Config.FIELD_POLICY_ENGINE, Config.POOL_CONNECTIONS,
@@ -65,6 +67,7 @@
_thread_pool_size = 4
_policy_retry_count = 1
_policy_retry_sleep = 0
+ _timeout_in_secs = DEFAULT_TIMEOUT_IN_SECS
@staticmethod
def _init():
@@ -85,8 +88,9 @@
'http://', requests.adapters.HTTPAdapter(pool_connections=pool_size,
pool_maxsize=pool_size))
- PolicyRest._url_get_config = (config.get("url", "") + config.get("path_api", "")
- + PolicyRest.POLICY_GET_CONFIG)
+ get_config_path = urllib.parse.urljoin(
+ config.get("path_api", "pdp/api").strip("/") + "/", PolicyRest.POLICY_GET_CONFIG)
+ PolicyRest._url_get_config = urllib.parse.urljoin(config.get("url", ""), get_config_path)
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(
@@ -101,12 +105,16 @@
tls_ca_mode = config.get(Config.TLS_CA_MODE)
PolicyRest._custom_kwargs = Config.get_requests_kwargs(tls_ca_mode)
+ PolicyRest._timeout_in_secs = config.get(Config.TIMEOUT_IN_SECS)
+ if not PolicyRest._timeout_in_secs or PolicyRest._timeout_in_secs < 1:
+ PolicyRest._timeout_in_secs = PolicyRest.DEFAULT_TIMEOUT_IN_SECS
- PolicyRest._logger.info("PDP(%s) url(%s) headers(%s) tls_ca_mode(%s) custom_kwargs(%s): %s",
- PolicyRest._target_entity, PolicyRest._url_get_config,
- Metrics.json_dumps(PolicyRest._headers),
- tls_ca_mode, json.dumps(PolicyRest._custom_kwargs),
- PolicyRest._settings)
+ PolicyRest._logger.info(
+ "PDP(%s) url(%s) headers(%s) tls_ca_mode(%s) timeout_in_secs(%s) custom_kwargs(%s): %s",
+ PolicyRest._target_entity, PolicyRest._url_get_config,
+ Metrics.json_dumps(PolicyRest._headers), tls_ca_mode,
+ PolicyRest._timeout_in_secs, json.dumps(PolicyRest._custom_kwargs),
+ PolicyRest._settings)
PolicyRest._settings.commit_change()
PolicyRest._lazy_inited = True
@@ -144,6 +152,7 @@
session = PolicyRest._requests_session
target_entity = PolicyRest._target_entity
url = PolicyRest._url_get_config
+ timeout_in_secs = PolicyRest._timeout_in_secs
headers = copy.deepcopy(PolicyRest._headers)
custom_kwargs = copy.deepcopy(PolicyRest._custom_kwargs)
@@ -152,15 +161,17 @@
headers[REQUEST_X_ECOMP_REQUESTID] = metrics.request_id
log_action = "post to {} at {}".format(target_entity, url)
- log_data = "msg={} headers={}, custom_kwargs({})".format(
- json.dumps(json_body), Metrics.json_dumps(headers), json.dumps(custom_kwargs))
+ log_data = "msg={} headers={}, custom_kwargs({}) timeout_in_secs({})".format(
+ json.dumps(json_body), Metrics.json_dumps(headers), json.dumps(custom_kwargs),
+ timeout_in_secs)
log_line = log_action + " " + log_data
PolicyRest._logger.info(metrics.metrics_start(log_line))
res = None
try:
- res = session.post(url, json=json_body, headers=headers, **custom_kwargs)
+ res = session.post(url, json=json_body, 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)
@@ -195,12 +206,12 @@
res_data = res.json()
if res_data and isinstance(res_data, list) and len(res_data) == 1:
- rslt = res_data[0]
- if rslt and not rslt.get(POLICY_NAME):
+ rslt = res_data[0] or {}
+ if not rslt.get(POLICY_NAME):
res_data = None
if rslt.get(PolicyRest.PDP_CONFIG_MESSAGE) == PolicyRest.PDP_NO_RESPONSE_RECEIVED:
error_code = AuditHttpCode.SERVICE_UNAVAILABLE_ERROR.value
- error_msg = "unexpected {0}".format(log_line)
+ error_msg = "{} unexpected {}".format(error_code, log_line)
PolicyRest._logger.error(error_msg)
metrics.set_http_status_code(error_code)
@@ -222,8 +233,8 @@
if (rslt and not rslt.get(POLICY_NAME)
and rslt.get(PolicyRest.PDP_CONFIG_STATUS) == PolicyRest.PDP_CONFIG_NOT_FOUND
and rslt.get(PolicyRest.PDP_CONFIG_MESSAGE) == PolicyRest.PDP_DATA_NOT_FOUND):
- status_code = AuditHttpCode.DATA_NOT_FOUND_ERROR.value
- info_msg = "not found {0}".format(log_line)
+ status_code = AuditHttpCode.DATA_NOT_FOUND_OK.value
+ info_msg = "{} not found {}".format(status_code, log_line)
PolicyRest._logger.info(info_msg)
metrics.set_http_status_code(status_code)
@@ -279,7 +290,8 @@
expect_policy_removed = (ignore_policy_names and not expected_versions)
for retry in range(1, PolicyRest._policy_retry_count + 1):
- PolicyRest._logger.debug(str_metrics)
+ PolicyRest._logger.debug("try(%s) retry_get_config(%s): %s",
+ retry, retry_get_config, str_metrics)
done, latest_policy, status_code = PolicyRest._get_latest_policy_once(
audit, policy_id, expected_versions, ignore_policy_names,
@@ -289,16 +301,16 @@
break
if retry == PolicyRest._policy_retry_count:
- audit.warn("gave up retrying {} from PDP after #{} for policy_id={}"
- .format(PolicyRest._url_get_config, retry, policy_id),
- error_code=AuditResponseCode.DATA_ERROR)
+ PolicyRest._logger.error(
+ audit.error("gave up retrying after #{} for policy_id({}) from PDP {}"
+ .format(retry, policy_id, PolicyRest._url_get_config),
+ error_code=AuditResponseCode.DATA_ERROR))
break
- audit.warn(
- "retry #{} {} from PDP in {} secs for policy_id={}".format(
- retry, PolicyRest._url_get_config,
- PolicyRest._policy_retry_sleep, policy_id),
- error_code=AuditResponseCode.DATA_ERROR)
+ PolicyRest._logger.warning(audit.warn(
+ "will retry({}) for policy_id({}) in {} secs from PDP {}".format(
+ retry, policy_id, PolicyRest._policy_retry_sleep, PolicyRest._url_get_config),
+ error_code=AuditResponseCode.DATA_ERROR))
time.sleep(PolicyRest._policy_retry_sleep)
if (expect_policy_removed and not latest_policy
@@ -308,10 +320,10 @@
audit.set_http_status_code(status_code)
if not PolicyRest._validate_policy(latest_policy):
- audit.set_http_status_code(AuditHttpCode.DATA_NOT_FOUND_ERROR.value)
- audit.error(
+ audit.set_http_status_code(AuditHttpCode.DATA_NOT_FOUND_OK.value)
+ PolicyRest._logger.error(audit.error(
"received invalid policy from PDP: {}".format(json.dumps(latest_policy)),
- error_code=AuditResponseCode.DATA_ERROR)
+ error_code=AuditResponseCode.DATA_ERROR))
return latest_policy
@@ -331,9 +343,10 @@
)
if not latest_policy and not expect_policy_removed:
- audit.error("received unexpected policy data from PDP for policy_id={}: {}"
- .format(policy_id, json.dumps(policy_bodies or [])),
- error_code=AuditResponseCode.DATA_ERROR)
+ PolicyRest._logger.error(
+ audit.error("received unexpected policy data from PDP for policy_id={}: {}"
+ .format(policy_id, json.dumps(policy_bodies or [])),
+ error_code=AuditResponseCode.DATA_ERROR))
done = bool(latest_policy
or (expect_policy_removed and not policy_bodies)
@@ -411,6 +424,9 @@
policies = None
apns_length = len(apns)
+ PolicyRest._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:
@@ -419,8 +435,9 @@
pool.close()
pool.join()
- metrics_total.metrics("result get_latest_updated_policies {0}: {1} {2}"
- .format(str_metrics, len(policies), json.dumps(policies)))
+ 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
@@ -438,12 +455,12 @@
and policy_id not in removed_policies)
PolicyRest._logger.debug(
- "result updated_policies %s, removed_policies %s, errored_policies %s",
- json.dumps(updated_policies), json.dumps(removed_policies),
+ "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_NOT_FOUND_ERROR.value)
+ 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)
@@ -460,6 +477,7 @@
PolicyRest._logger.debug("%s", str_policy_filter)
status_code, policy_bodies = PolicyRest._pdp_get_config(audit, policy_filter)
+ audit.set_http_status_code(status_code)
PolicyRest._logger.debug("%s policy_bodies: %s %s", status_code,
str_policy_filter, json.dumps(policy_bodies or []))
@@ -467,14 +485,13 @@
latest_policies = PolicyUtils.select_latest_policies(policy_bodies)
if not latest_policies:
- audit.set_http_status_code(AuditHttpCode.DATA_NOT_FOUND_ERROR.value)
- audit.warn(
+ audit.set_http_status_code(AuditHttpCode.DATA_NOT_FOUND_OK.value)
+ PolicyRest._logger.warning(audit.warn(
"received no policies from PDP for policy_filter {}: {}"
.format(str_policy_filter, json.dumps(policy_bodies or [])),
- error_code=AuditResponseCode.DATA_ERROR)
+ error_code=AuditResponseCode.DATA_ERROR))
return None, latest_policies
- audit.set_http_status_code(status_code)
valid_policies = {}
errored_policies = {}
for (policy_id, policy) in latest_policies.items():
diff --git a/policyhandler/policy_updater.py b/policyhandler/policy_updater.py
index 235e2b6..fb6c8b6 100644
--- a/policyhandler/policy_updater.py
+++ b/policyhandler/policy_updater.py
@@ -106,9 +106,9 @@
self._audit.req_message = req_message
self._logger.info(
- "pending request_id %s for %s policies_updated %s policies_removed %s",
+ "pending(%s) for %s policies_updated %s policies_removed %s",
self._audit.request_id, req_message,
- json.dumps(policies_updated), json.dumps(policies_removed))
+ json.dumps(self._policies_updated), json.dumps(self._policies_removed))
class PolicyUpdater(Thread):
@@ -178,13 +178,14 @@
if not self._aud_reconfigure:
self._aud_reconfigure = Audit(req_message=Config.RECONFIGURE)
PolicyUpdater._logger.info(
- "reconfigure %s request_id %s",
+ "%s request_id %s",
self._aud_reconfigure.req_message, self._aud_reconfigure.request_id
)
self._run.set()
def run(self):
"""wait and run the policy-update in thread"""
+ PolicyUpdater._logger.info("starting policy_updater...")
self._run_reconfigure_timer()
while True:
PolicyUpdater._logger.info("waiting for policy-updates...")
@@ -307,7 +308,7 @@
if DeployHandler.reconfigure(aud_reconfigure):
reconfigure_result += " " + Config.DEPLOY_HANDLER
- if self._reconfigure_receiver():
+ if self._reconfigure_receiver(aud_reconfigure):
reconfigure_result += " web-socket"
reconfigure_result += " -- change: {}".format(Config.discovered_config)
@@ -348,12 +349,24 @@
)
catch_up_result = ""
try:
+ not_found_ok = None
PolicyUpdater._logger.info(log_line)
self._pause_catch_up_timer()
- _, catch_up_message = PolicyMatcher.get_latest_policies(aud_catch_up)
+ _, policies, policy_filters = PolicyMatcher.get_deployed_policies(aud_catch_up)
- if not catch_up_message or not aud_catch_up.is_success_or_not_found():
+ catch_up_message = None
+ if aud_catch_up.is_not_found():
+ not_found_ok = True
+ else:
+ _, catch_up_message = PolicyMatcher.build_catch_up_message(
+ aud_catch_up, policies, policy_filters)
+
+ if not_found_ok:
+ catch_up_result = ("- not sending catch-up "
+ "- no deployed policies or policy-filters")
+ PolicyUpdater._logger.warning(catch_up_result)
+ elif not (catch_up_message and aud_catch_up.is_success()):
catch_up_result = "- not sending catch-up to deployment-handler due to errors"
PolicyUpdater._logger.warning(catch_up_result)
elif catch_up_message.empty():
@@ -402,11 +415,14 @@
PolicyUpdater._logger.info(log_line)
try:
+ not_found_ok = None
(updated_policies, removed_policies,
policy_filter_matches) = PolicyMatcher.match_to_deployed_policies(
audit, policies_updated, policies_removed)
- if updated_policies or removed_policies:
+ if audit.is_not_found():
+ not_found_ok = True
+ elif updated_policies or removed_policies:
updated_policies, removed_policies = PolicyRest.get_latest_updated_policies(
(audit,
[(policy_id, policy.get(POLICY_BODY, {}).get(POLICY_VERSION))
@@ -415,7 +431,11 @@
for policy_id, policy in removed_policies.items()]
))
- if not audit.is_success_or_not_found():
+ if not_found_ok:
+ result = ("- not sending policy-updates to deployment-handler "
+ "- no deployed policies or policy-filters")
+ PolicyUpdater._logger.warning(result)
+ elif not audit.is_success():
result = "- not sending policy-updates to deployment-handler due to errors"
PolicyUpdater._logger.warning(result)
elif not updated_policies and not removed_policies:
diff --git a/policyhandler/web_server.py b/policyhandler/web_server.py
index 24db468..73e7fbc 100644
--- a/policyhandler/web_server.py
+++ b/policyhandler/web_server.py
@@ -26,7 +26,7 @@
from .config import Config
from .deploy_handler import PolicyUpdateMessage
-from .onap.audit import Audit
+from .onap.audit import Audit, AuditHttpCode
from .policy_matcher import PolicyMatcher
from .policy_receiver import PolicyReceiver
from .policy_rest import PolicyRest
@@ -34,21 +34,35 @@
class PolicyWeb(object):
"""run http API of policy-handler on 0.0.0.0:wservice_port - any incoming address"""
+ DATA_NOT_FOUND_ERROR = 404
HOST_INADDR_ANY = ".".join("0"*4)
logger = logging.getLogger("policy_handler.policy_web")
@staticmethod
def run_forever(audit):
"""run the web-server of the policy-handler forever"""
- PolicyWeb.logger.info("policy_handler web-server on port(%d)...", Config.wservice_port)
cherrypy.config.update({"server.socket_host": PolicyWeb.HOST_INADDR_ANY,
"server.socket_port": Config.wservice_port})
+
+ protocol = "http"
+ tls_info = ""
+ # if Config.tls_server_cert_file and Config.tls_private_key_file:
+ # cherrypy.server.ssl_module = 'builtin'
+ # cherrypy.server.ssl_certificate = Config.tls_server_cert_file
+ # cherrypy.server.ssl_private_key = Config.tls_private_key_file
+ # if Config.tls_server_ca_chain_file:
+ # cherrypy.server.ssl_certificate_chain = Config.tls_server_ca_chain_file
+ # protocol = "https"
+ # tls_info = "cert: {} {} {}".format(Config.tls_server_cert_file,
+ # Config.tls_private_key_file,
+ # Config.tls_server_ca_chain_file)
+
cherrypy.tree.mount(_PolicyWeb(), '/')
- audit.info("running policy_handler web-server as {0}:{1}".format(
- cherrypy.server.socket_host, cherrypy.server.socket_port))
- PolicyWeb.logger.info("running policy_handler web-server as %s:%d with config: %s",
- cherrypy.server.socket_host, cherrypy.server.socket_port,
- json.dumps(cherrypy.config))
+
+ PolicyWeb.logger.info(
+ "%s with config: %s", audit.info("running policy_handler as {}://{}:{} {}".format(
+ protocol, cherrypy.server.socket_host, cherrypy.server.socket_port, tls_info)),
+ json.dumps(cherrypy.config))
cherrypy.engine.start()
class _PolicyWeb(object):
@@ -67,17 +81,18 @@
req_info = _PolicyWeb._get_request_info(cherrypy.request)
audit = Audit(job_name="get_latest_policy",
req_message=req_info, headers=cherrypy.request.headers)
- PolicyWeb.logger.info("%s policy_id=%s headers=%s", \
- req_info, policy_id, json.dumps(cherrypy.request.headers))
+ PolicyWeb.logger.info("%s policy_id=%s headers=%s",
+ req_info, policy_id, json.dumps(cherrypy.request.headers))
latest_policy = PolicyRest.get_latest_policy((audit, policy_id, None, None)) or {}
PolicyWeb.logger.info("res %s policy_id=%s latest_policy=%s",
req_info, policy_id, json.dumps(latest_policy))
- success, http_status_code, _ = audit.audit_done(result=json.dumps(latest_policy))
- if not success:
- cherrypy.response.status = http_status_code
+ _, http_status_code, _ = audit.audit_done(result=json.dumps(latest_policy))
+ if http_status_code == AuditHttpCode.DATA_NOT_FOUND_OK.value:
+ http_status_code = PolicyWeb.DATA_NOT_FOUND_ERROR
+ cherrypy.response.status = http_status_code
return latest_policy
@@ -89,15 +104,20 @@
PolicyWeb.logger.info("%s", req_info)
- result, policy_update = PolicyMatcher.get_latest_policies(audit)
- if policy_update and isinstance(policy_update, PolicyUpdateMessage):
- result["policy_update"] = policy_update.get_message()
+ result, policies, policy_filters = PolicyMatcher.get_deployed_policies(audit)
+ if not result:
+ result, policy_update = PolicyMatcher.build_catch_up_message(
+ audit, policies, policy_filters)
+ if policy_update and isinstance(policy_update, PolicyUpdateMessage):
+ result["policy_update"] = policy_update.get_message()
- PolicyWeb.logger.info("result %s: %s", req_info, json.dumps(result))
+ result_str = json.dumps(result, sort_keys=True)
+ PolicyWeb.logger.info("result %s: %s", req_info, result_str)
- success, http_status_code, _ = audit.audit_done(result=json.dumps(result))
- if not success:
- cherrypy.response.status = http_status_code
+ _, http_status_code, _ = audit.audit_done(result=result_str)
+ if http_status_code == AuditHttpCode.DATA_NOT_FOUND_OK.value:
+ http_status_code = PolicyWeb.DATA_NOT_FOUND_ERROR
+ cherrypy.response.status = http_status_code
return result
@@ -159,19 +179,21 @@
req_info = _PolicyWeb._get_request_info(cherrypy.request)
audit = Audit(job_name="get_latest_policies",
- req_message="{0}: {1}".format(req_info, str_policy_filter), \
- headers=cherrypy.request.headers)
- PolicyWeb.logger.info("%s: policy_filter=%s headers=%s", \
- req_info, str_policy_filter, json.dumps(cherrypy.request.headers))
+ req_message="{0}: {1}".format(req_info, str_policy_filter),
+ headers=cherrypy.request.headers)
+ PolicyWeb.logger.info("%s: policy_filter=%s headers=%s",
+ req_info, str_policy_filter, json.dumps(cherrypy.request.headers))
result = PolicyRest.get_latest_policies(audit, policy_filter=policy_filter) or {}
+ result_str = json.dumps(result, sort_keys=True)
- PolicyWeb.logger.info("result %s: policy_filter=%s result=%s", \
- req_info, str_policy_filter, json.dumps(result))
+ PolicyWeb.logger.info("result %s: policy_filter=%s result=%s",
+ req_info, str_policy_filter, result_str)
- success, http_status_code, _ = audit.audit_done(result=json.dumps(result))
- if not success:
- cherrypy.response.status = http_status_code
+ _, http_status_code, _ = audit.audit_done(result=result_str)
+ if http_status_code == AuditHttpCode.DATA_NOT_FOUND_OK.value:
+ http_status_code = PolicyWeb.DATA_NOT_FOUND_ERROR
+ cherrypy.response.status = http_status_code
return result
diff --git a/pom.xml b/pom.xml
index ed106ac..97fc4e4 100644
--- a/pom.xml
+++ b/pom.xml
@@ -30,7 +30,7 @@
<groupId>org.onap.dcaegen2.platform</groupId>
<artifactId>policy-handler</artifactId>
<name>dcaegen2-platform-policy-handler</name>
- <version>4.4.0-SNAPSHOT</version>
+ <version>4.5.0-SNAPSHOT</version>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
diff --git a/requirements.txt b/requirements.txt
index df9b56d..632dfe5 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -1,4 +1,4 @@
CherryPy>=15.0.0,<16.0.0
psutil>=5.4.5,<6.0.0
requests>=2.18.4,<3.0.0
-websocket-client==0.49.0
+websocket-client==0.53.0
diff --git a/setup.py b/setup.py
index 16d1885..ff1aa4e 100644
--- a/setup.py
+++ b/setup.py
@@ -23,7 +23,7 @@
setup(
name='policyhandler',
description='DCAE-Controller policy-handler to communicate with policy-engine',
- version="4.4.0",
+ version="4.5.0",
author='Alex Shatov',
packages=['policyhandler'],
zip_safe=False,
@@ -31,7 +31,7 @@
"CherryPy>=15.0.0,<16.0.0",
"psutil>=5.4.5,<6.0.0",
"requests>=2.18.4,<3.0.0",
- "websocket-client==0.49.0"
+ "websocket-client==0.53.0"
],
keywords='policy dcae controller',
classifiers=[
diff --git a/tests/conftest.py b/tests/conftest.py
new file mode 100644
index 0000000..0dcb2bb
--- /dev/null
+++ b/tests/conftest.py
@@ -0,0 +1,299 @@
+# ============LICENSE_START=======================================================
+# Copyright (c) 2018 AT&T Intellectual Property. All rights reserved.
+# ================================================================================
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+# ============LICENSE_END=========================================================
+#
+# ECOMP is a trademark and service mark of AT&T Intellectual Property.
+"""
+startdard pytest file that contains the shared fixtures
+https://docs.pytest.org/en/latest/fixture.html
+"""
+import base64
+import copy
+import json
+
+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, POLICY_NAME, TARGET_ENTITY
+from policyhandler.policy_receiver import PolicyReceiver
+from policyhandler.policy_rest import PolicyRest
+
+from .mock_deploy_handler import MockDeploymentHandler
+from .mock_policy_engine import MockPolicyEngine
+from .mock_settings import Settings
+from .mock_tracker import MockHttpResponse, Tracker
+from .mock_websocket import MockWebSocket
+
+
+@pytest.fixture(autouse=True)
+def _auto_test_cycle(request):
+ """log all the test starts and ends"""
+ if request.cls:
+ test_name = "%s::%s::%s" % (request.module.__name__,
+ request.cls.__name__,
+ request.function.__name__)
+ else:
+ test_name = "%s::%s" % (request.module.__name__, request.function.__name__)
+
+ Tracker.reset(test_name)
+ if Settings.logger:
+ Settings.logger.info(">>>>>>> start %s", test_name)
+ yield _auto_test_cycle
+ if Settings.logger:
+ Settings.logger.info(">>>>>>> tracked messages: %s", Tracker.to_string())
+ Settings.logger.info(">>>>>>> ended %s", test_name)
+
+
+@pytest.fixture(scope="session", autouse=True)
+def _auto_setup_policy_engine():
+ """initialize the mock-policy-engine per the whole test session"""
+ Settings.init()
+
+ Settings.logger.info("create _auto_setup_policy_engine")
+ MockPolicyEngine.init()
+ yield _auto_setup_policy_engine
+ Settings.logger.info("teardown _auto_setup_policy_engine")
+
+
+@pytest.fixture()
+def fix_pdp_post(monkeypatch):
+ """monkeyed request /getConfig to PDP"""
+ def monkeyed_policy_rest_post(uri, json=None, **kwargs):
+ """monkeypatch for the POST to policy-engine"""
+ res_json = MockPolicyEngine.get_config(json.get(POLICY_NAME))
+ return MockHttpResponse("post", uri, res_json, json=json, **kwargs)
+
+ Settings.logger.info("setup fix_pdp_post")
+ PolicyRest._lazy_init()
+ monkeypatch.setattr('policyhandler.policy_rest.PolicyRest._requests_session.post',
+ monkeyed_policy_rest_post)
+ yield fix_pdp_post
+ Settings.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, 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)
+
+ Settings.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")
+ Settings.logger.info("teardown fix_deploy_handler")
+
+
+@pytest.fixture()
+def fix_cherrypy_engine_exit(monkeypatch):
+ """monkeyed cherrypy.engine.exit()"""
+ Settings.logger.info("setup fix_cherrypy_engine_exit")
+
+ def monkeyed_cherrypy_engine_exit():
+ """monkeypatch for deploy_handler"""
+ Settings.logger.info("cherrypy_engine_exit()")
+
+ monkeypatch.setattr('policyhandler.web_server.cherrypy.engine.exit',
+ monkeyed_cherrypy_engine_exit)
+ yield fix_cherrypy_engine_exit
+ Settings.logger.info("teardown fix_cherrypy_engine_exit")
+
+
+@pytest.fixture()
+def fix_pdp_post_big(monkeypatch):
+ """monkeyed request /getConfig to PDP"""
+ def monkeyed_policy_rest_post(uri, **kwargs):
+ """monkeypatch for the POST to policy-engine"""
+ res_json = MockPolicyEngine.get_configs_all()
+ return MockHttpResponse("post", uri, res_json, **kwargs)
+
+ Settings.logger.info("setup fix_pdp_post_big")
+ PolicyRest._lazy_init()
+ monkeypatch.setattr('policyhandler.policy_rest.PolicyRest._requests_session.post',
+ monkeyed_policy_rest_post)
+ yield fix_pdp_post_big
+ Settings.logger.info("teardown fix_pdp_post_big")
+
+
+class MockException(Exception):
+ """mock exception"""
+ pass
+
+
+@pytest.fixture()
+def fix_pdp_post_boom(monkeypatch):
+ """monkeyed request /getConfig to PDP - exception"""
+ def monkeyed_policy_rest_post_boom(uri, **_):
+ """monkeypatch for the POST to policy-engine"""
+ raise MockException("fix_pdp_post_boom {}".format(uri))
+
+ Settings.logger.info("setup fix_pdp_post_boom")
+ PolicyRest._lazy_init()
+ monkeypatch.setattr('policyhandler.policy_rest.PolicyRest._requests_session.post',
+ monkeyed_policy_rest_post_boom)
+ yield fix_pdp_post_boom
+ Settings.logger.info("teardown fix_pdp_post_boom")
+
+
+@pytest.fixture()
+def fix_select_latest_policies_boom(monkeypatch):
+ """monkeyed exception"""
+ def monkeyed_boom(*args, **kwargs):
+ """monkeypatch for the select_latest_policies"""
+ raise MockException("monkeyed_boom")
+
+ Settings.logger.info("setup fix_select_latest_policies_boom")
+ monkeypatch.setattr('policyhandler.policy_utils.PolicyUtils.select_latest_policies',
+ monkeyed_boom)
+ monkeypatch.setattr('policyhandler.policy_utils.PolicyUtils.select_latest_policy',
+ monkeyed_boom)
+ monkeypatch.setattr('policyhandler.policy_utils.PolicyUtils.extract_policy_id',
+ monkeyed_boom)
+
+ yield fix_select_latest_policies_boom
+ Settings.logger.info("teardown fix_select_latest_policies_boom")
+
+@pytest.fixture()
+def fix_discovery(monkeypatch):
+ """monkeyed discovery request.get"""
+ def monkeyed_discovery(uri):
+ """monkeypatch for get from consul"""
+ res_json = {}
+ dh_service = None
+ if Config.discovered_config:
+ _, dh_config = Config.discovered_config.get_by_key(Config.DEPLOY_HANDLER)
+ dh_config = dh_config and dh_config.get(TARGET_ENTITY)
+ if dh_service and uri == DiscoveryClient.CONSUL_SERVICE_MASK.format(
+ Config.consul_url, dh_service):
+ res_json = [{
+ "ServiceAddress": "1.1.1.1",
+ "ServicePort": "123"
+ }]
+ elif uri == DiscoveryClient.CONSUL_KV_MASK.format(
+ Config.consul_url, Config.system_name):
+ res_json = [{"Value": base64.b64encode(
+ json.dumps(Settings.mock_config).encode()).decode("utf-8")}]
+ return MockHttpResponse("get", uri, res_json)
+
+ Settings.logger.info("setup fix_discovery")
+ monkeypatch.setattr('policyhandler.discovery.requests.get', monkeyed_discovery)
+ yield fix_discovery
+ Settings.logger.info("teardown fix_discovery")
+
+
+@pytest.fixture(scope="module")
+def fix_auto_catch_up():
+ """increase the frequency of auto catch_up"""
+
+ Settings.logger.info("setup fix_auto_catch_up %s", json.dumps(Settings.mock_config))
+ prev_config = copy.deepcopy(Settings.mock_config)
+ Settings.mock_config.get(Config.SERVICE_NAME_POLICY_HANDLER, {}) \
+ .get(CATCH_UP, {})[Config.TIMER_INTERVAL] = 5
+ Settings.logger.info("fix_auto_catch_up %s", json.dumps(Settings.mock_config))
+ Settings.rediscover_config()
+
+ yield fix_auto_catch_up
+ Settings.rediscover_config(prev_config)
+ Settings.logger.info("teardown fix_auto_catch_up")
+
+
+@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": Settings.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)
+
+ Settings.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")
+ Settings.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, 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)
+
+ Settings.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")
+ Settings.logger.info("teardown fix_deploy_handler_404")
+
+@pytest.fixture()
+def fix_policy_receiver_websocket(monkeypatch):
+ """monkeyed websocket for policy_receiver"""
+ Settings.logger.info("setup fix_policy_receiver_websocket")
+ monkeypatch.setattr('policyhandler.policy_receiver.websocket', MockWebSocket)
+ yield fix_policy_receiver_websocket
+ Settings.logger.info("teardown fix_policy_receiver_websocket")
diff --git a/tests/mock_config.json b/tests/mock_config.json
index 7ec0ac6..ef02a15 100644
--- a/tests/mock_config.json
+++ b/tests/mock_config.json
@@ -6,13 +6,13 @@
"policy_retry_count" : 5,
"policy_retry_sleep" : 5,
"catch_up" : {
- "interval" : 10
+ "interval" : 3600
},
"reconfigure" : {
- "interval" : 10
+ "interval" : 3600
},
"policy_engine" : {
- "url" : "https://pdp-server:8081",
+ "url" : "https://unit-test-pdp-server:8081000",
"path_notifications" : "/pdp/notifications",
"path_api" : "/pdp/api/",
"headers" : {
@@ -24,16 +24,19 @@
},
"target_entity" : "policy_engine",
"tls_ca_mode" : "cert_directory",
- "tls_wss_ca_mode" : "cert_directory"
+ "tls_wss_ca_mode" : "cert_directory",
+ "timeout_in_secs": 1,
+ "ws_ping_interval_in_secs": 1800
},
"deploy_handler" : {
"target_entity" : "deployment_handler",
- "url" : "http://deployment_handler:8188",
+ "url" : "http://unit-test-deployment_handler:8188000",
"max_msg_length_mb" : 5,
"query" : {
"cfy_tenant_name" : "default_tenant"
},
- "tls_ca_mode" : "cert_directory"
+ "tls_ca_mode" : "cert_directory",
+ "timeout_in_secs": 1
}
}
}
diff --git a/tests/mock_deploy_handler.py b/tests/mock_deploy_handler.py
new file mode 100644
index 0000000..ebbbfc7
--- /dev/null
+++ b/tests/mock_deploy_handler.py
@@ -0,0 +1,48 @@
+# ============LICENSE_START=======================================================
+# Copyright (c) 2018 AT&T Intellectual Property. All rights reserved.
+# ================================================================================
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+# ============LICENSE_END=========================================================
+#
+# ECOMP is a trademark and service mark of AT&T Intellectual Property.
+"""mocking for the deployment-handler - shared by many tests"""
+
+from policyhandler.policy_consts import (POLICY_BODY, POLICY_ID,
+ POLICY_VERSION, POLICY_VERSIONS)
+
+from .mock_policy_engine import MockPolicyEngine
+from .mock_settings import Settings
+
+
+class MockDeploymentHandler(object):
+ """pretend this is the deployment-handler"""
+
+ @staticmethod
+ def default_response():
+ """generate the deployed policies message"""
+ return {"server_instance_uuid": Settings.deploy_handler_instance_uuid}
+
+ @staticmethod
+ def get_deployed_policies():
+ """generate the deployed policies message"""
+ 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 (
+ MockPolicyEngine.gen_all_policies_latest(version_offset=1).items()))
+ response["policies"] = policies
+
+ return response
diff --git a/tests/mock_expected.py b/tests/mock_expected.py
new file mode 100644
index 0000000..c10215d
--- /dev/null
+++ b/tests/mock_expected.py
@@ -0,0 +1,3013 @@
+# ============LICENSE_START=======================================================
+# Copyright (c) 2018 AT&T Intellectual Property. All rights reserved.
+# ================================================================================
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+# ============LICENSE_END=========================================================
+#
+# ECOMP is a trademark and service mark of AT&T Intellectual Property.
+"""expected message history per test"""
+
+
+HISTORY_EXPECTED = {
+ "tests.test_policy_rest::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": {
+ "policyName": "test_scope_prefix.Config_sit"
+ },
+ "method": "post",
+ "params": None,
+ "uri": "https://unit-test-pdp-server:8081000/pdp/api/getConfig"
+ },
+ "res": "*",
+ "status_code": 200
+ }
+ ],
+ "tests.test_policyhandler::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.test_policyhandler::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.test_policyhandler::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": {
+ "policyName": "test_scope_prefix.Config_sit"
+ },
+ "method": "post",
+ "params": None,
+ "uri": "https://unit-test-pdp-server:8081000/pdp/api/getConfig"
+ },
+ "res": "*",
+ "status_code": 200
+ }
+ ],
+ "tests.test_policyhandler::WebServerTest::test_zzz_get_catch_up": [
+ {
+ "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_.*"
+ },
+ "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
+ }
+ ],
+ "tests.test_policyhandler::WebServerTest::test_zzz_policy_updates_and_catch_ups": [
+ {
+ "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
+ }
+ ],
+ "tests.test_policyhandler::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
+ }
+ ],
+ "tests.test_policyhandler::WebServerTest::test_zzz_catch_up_on_deploy_handler_changed": [
+ {
+ "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": {
+ "X-ECOMP-RequestID": "*"
+ },
+ "json": {
+ "catch_up": False,
+ "latest_policies": {
+ "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"
+ }
+ },
+ "policy_filter_matches": {
+ "test_scope_prefix.Config_ipsum": {}
+ },
+ "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_dolor"
+ },
+ "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_amet"
+ },
+ "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_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_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"
+ }
+ },
+ "policy_filter_matches": {
+ "test_scope_prefix.Config_amet": {},
+ "test_scope_prefix.Config_dolor": {}
+ },
+ "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_.*"
+ },
+ "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
+ }
+ ],
+ "tests.test_pz_catch_up::test_catch_up_failed_dh": [
+ {
+ "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": "0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789",
+ "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": "0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789",
+ "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": "0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789",
+ "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": "0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789",
+ "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": "0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789",
+ "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": "0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789",
+ "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": "0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789",
+ "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": 413
+ },
+ {
+ "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": "0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789",
+ "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": "0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789",
+ "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": "0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789",
+ "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": "0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789",
+ "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": "0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789",
+ "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": "0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789",
+ "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": "0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789",
+ "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": 413
+ },
+ {
+ "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": "0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789",
+ "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": "0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789",
+ "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": "0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789",
+ "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": "0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789",
+ "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": "0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789",
+ "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": "0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789",
+ "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": "0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789",
+ "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": 413
+ }
+ ],
+ "tests.test_pz_catch_up::test_catch_up_dh_404": [
+ {
+ "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": {
+ "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": {
+ "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
+ }
+ ],
+ "tests.test_pz_pdp_boom::WebServerPDPBoomTest::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
+ }
+ ],
+ "tests.test_pz_pdp_boom::WebServerPDPBoomTest::test_zzz_catch_up_on_deploy_handler_changed": [
+ {
+ "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": {
+ "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": {
+ "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": {
+ "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
+ }
+ ],
+ "tests.test_pz_pdp_boom::WebServerPDPBoomTest::test_zzz_get_catch_up": [
+ {
+ "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": {
+ "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
+ }
+ ],
+ "tests.test_pz_pdp_boom::WebServerPDPBoomTest::test_zzz_policy_updates_and_catch_ups": [
+ {
+ "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": {
+ "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
+ }
+ ],
+ "tests.test_pz_pdp_boom::WebServerPDPBoomTest::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": {
+ "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
+ }
+ ],
+ "tests.test_pz_ph_boom::WebServerInternalBoomTest::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.test_pz_ph_boom::WebServerInternalBoomTest::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.test_pz_ph_boom::WebServerInternalBoomTest::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": {
+ "policyName": "test_scope_prefix.Config_sit"
+ },
+ "method": "post",
+ "params": None,
+ "uri": "https://unit-test-pdp-server:8081000/pdp/api/getConfig"
+ },
+ "res": "*",
+ "status_code": 200
+ }
+ ],
+ "tests.test_pz_ph_boom::WebServerInternalBoomTest::test_zzz_catch_up_on_deploy_handler_changed": [
+ {
+ "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.test_pz_ph_boom::WebServerInternalBoomTest::test_zzz_get_catch_up": [
+ {
+ "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": 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.test_pz_ph_boom::WebServerInternalBoomTest::test_zzz_policy_updates_and_catch_ups": [
+ {
+ "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.test_pz_ph_boom::WebServerInternalBoomTest::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
+ }
+ ]
+}
diff --git a/tests/mock_policy_engine.py b/tests/mock_policy_engine.py
new file mode 100644
index 0000000..d57d613
--- /dev/null
+++ b/tests/mock_policy_engine.py
@@ -0,0 +1,131 @@
+# ============LICENSE_START=======================================================
+# Copyright (c) 2018 AT&T Intellectual Property. All rights reserved.
+# ================================================================================
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+# ============LICENSE_END=========================================================
+#
+# ECOMP is a trademark and service mark of AT&T Intellectual Property.
+"""mocking for the policy-engine - shared by many tests"""
+
+import copy
+import json
+import re
+
+from policyhandler.policy_consts import (POLICY_BODY, POLICY_CONFIG, POLICY_ID,
+ POLICY_NAME, POLICY_VERSION)
+from policyhandler.policy_utils import PolicyUtils
+
+from .mock_settings import Settings
+
+
+class MonkeyPolicyBody(object):
+ """policy body that policy-engine returns"""
+ @staticmethod
+ def create_policy_body(policy_id, policy_version=1):
+ """returns a fake policy-body"""
+ prev_ver = str(policy_version - 1)
+ this_ver = str(policy_version)
+ config = {
+ "policy_updated_from_ver": prev_ver,
+ "policy_updated_to_ver": this_ver,
+ "policy_hello": "world!",
+ "updated_policy_id": policy_id
+ }
+ return {
+ "policyConfigMessage": "Config Retrieved! ",
+ "policyConfigStatus": "CONFIG_RETRIEVED",
+ "type": "JSON",
+ POLICY_NAME: "{0}.{1}.xml".format(policy_id, this_ver),
+ POLICY_VERSION: this_ver,
+ POLICY_CONFIG: json.dumps(config, sort_keys=True),
+ "matchingConditions": {
+ "ONAPName": "DCAE",
+ "ConfigName": "alex_config_name"
+ },
+ "responseAttributes": {},
+ "property": None
+ }
+
+
+class MockPolicyEngine(object):
+ """pretend this is the policy-engine"""
+ scope_prefix = "test_scope_prefix.Config_"
+ LOREM_IPSUM = """Lorem ipsum dolor sit amet consectetur ametist""".split()
+ LONG_TEXT = "0123456789" * 100
+ _policies = []
+
+ _inited = False
+
+ @staticmethod
+ def init():
+ """init static vars"""
+ if MockPolicyEngine._inited:
+ return
+ MockPolicyEngine._inited = True
+
+ MockPolicyEngine._policies = [
+ MonkeyPolicyBody.create_policy_body(
+ MockPolicyEngine.scope_prefix + policy_id, policy_index + 1)
+ for policy_id in MockPolicyEngine.LOREM_IPSUM
+ for policy_index in range(1 + MockPolicyEngine.LOREM_IPSUM.index(policy_id))]
+ Settings.logger.info("MockPolicyEngine._policies: %s",
+ json.dumps(MockPolicyEngine._policies))
+
+ @staticmethod
+ def get_config(policy_name):
+ """find policy the way the policy-engine finds"""
+ if not policy_name:
+ return []
+ return [copy.deepcopy(policy)
+ for policy in MockPolicyEngine._policies
+ if re.match(policy_name, policy[POLICY_NAME])]
+
+ @staticmethod
+ def get_configs_all():
+ """get all policies the way the policy-engine finds"""
+ policies = [copy.deepcopy(policy)
+ for policy in MockPolicyEngine._policies]
+ for policy in policies:
+ policy["config"] = MockPolicyEngine.LONG_TEXT
+ return policies
+
+ @staticmethod
+ def get_policy_id(policy_index):
+ """get the policy_id by index"""
+ return (MockPolicyEngine.scope_prefix
+ + MockPolicyEngine.LOREM_IPSUM[
+ policy_index % len(MockPolicyEngine.LOREM_IPSUM)])
+
+ @staticmethod
+ def gen_policy_latest(policy_index, version_offset=0):
+ """generate the policy response by policy_index = version - 1"""
+ policy_id = MockPolicyEngine.get_policy_id(policy_index)
+ policy = {
+ POLICY_ID: policy_id,
+ POLICY_BODY: MonkeyPolicyBody.create_policy_body(
+ policy_id, policy_index + 1 - version_offset)
+ }
+ return policy_id, PolicyUtils.parse_policy_config(policy)
+
+ @staticmethod
+ def gen_all_policies_latest(version_offset=0):
+ """generate all latest policies"""
+ return dict(MockPolicyEngine.gen_policy_latest(policy_index, version_offset=version_offset)
+ for policy_index in range(len(MockPolicyEngine.LOREM_IPSUM)))
+
+ @staticmethod
+ def gen_policies_latest(match_to_policy_name):
+ """generate all latest policies"""
+ return dict((k, v)
+ for k, v in MockPolicyEngine.gen_all_policies_latest().items()
+ if re.match(match_to_policy_name, k))
diff --git a/tests/mock_settings.py b/tests/mock_settings.py
index 7e05ecf..80a003e 100644
--- a/tests/mock_settings.py
+++ b/tests/mock_settings.py
@@ -31,31 +31,6 @@
from policyhandler.onap.audit import Audit
-class MonkeyHttpResponse(object):
- """Monkey http reposne"""
- def __init__(self, headers):
- self.headers = headers or {}
-
-
-class MonkeyedResponse(object):
- """Monkey response"""
- def __init__(self, full_path, res_json, json_body=None, headers=None):
- self.full_path = full_path
- self.req_json = json_body or {}
- self.status_code = 200
- self.request = MonkeyHttpResponse(headers)
- self.res = res_json
- self.text = json.dumps(self.res)
-
- def json(self):
- """returns json of response"""
- return self.res
-
- def raise_for_status(self):
- """ignoring"""
- pass
-
-
def _fix_discover_config(func):
"""the decorator"""
if not func:
@@ -83,20 +58,21 @@
"""init all locals"""
_loaded = False
logger = None
- RUN_TS = datetime.utcnow().isoformat()[:-3] + 'Z'
mock_config = None
deploy_handler_instance_uuid = str(uuid.uuid4())
@staticmethod
- @_fix_discover_config
def init():
"""init configs"""
if Settings._loaded:
+ Settings.logger.info("testing policy_handler with config: %s", Config.discovered_config)
return
Settings._loaded = True
Config.init_config()
+ Config.consul_url = "http://unit-test-consul:850000"
+
with open("tests/mock_config.json", 'r') as config_json:
Settings.mock_config = json.load(config_json)
@@ -107,7 +83,16 @@
print("print is expected to be in the log")
Settings.logger.info("========== run_policy_handler ==========")
Audit.init(Config.system_name, Config.LOGGER_CONFIG_FILE_PATH)
- audit = Audit(req_message="start testing policy handler")
+ Settings.rediscover_config()
+
+ @staticmethod
+ @_fix_discover_config
+ def rediscover_config(updated_config=None):
+ """rediscover the config"""
+ if updated_config is not None:
+ Settings.mock_config = copy.deepcopy(updated_config)
+
+ audit = Audit(req_message="rediscover_config")
Config.discover(audit)
diff --git a/tests/mock_tracker.py b/tests/mock_tracker.py
new file mode 100644
index 0000000..4e69afd
--- /dev/null
+++ b/tests/mock_tracker.py
@@ -0,0 +1,138 @@
+# ============LICENSE_START=======================================================
+# Copyright (c) 2018 AT&T Intellectual Property. All rights reserved.
+# ================================================================================
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+# ============LICENSE_END=========================================================
+#
+# ECOMP is a trademark and service mark of AT&T Intellectual Property.
+"""record all the messages going outside policy-handler during testing"""
+
+import copy
+import json
+
+from policyhandler.onap.audit import REQUEST_X_ECOMP_REQUESTID
+from policyhandler.policy_utils import Utils
+
+from .mock_expected import HISTORY_EXPECTED
+from .mock_settings import Settings
+
+RESPONSE = "res"
+
+class _MockHttpRequestInResponse(object):
+ """Mock http request in reponse object"""
+ def __init__(self, method, uri, **kwargs):
+ self.method = method
+ self.uri = uri
+ self.params = copy.deepcopy(kwargs.get("params"))
+ self.req_json = copy.deepcopy(kwargs.get("json"))
+ self.headers = copy.deepcopy(kwargs.get("headers"))
+
+ def to_json(self):
+ """create json of the request"""
+ return {
+ "method": self.method,
+ "uri": self.uri,
+ "params": self.params,
+ "json": self.req_json,
+ "headers": self.headers
+ }
+
+
+class MockHttpResponse(object):
+ """Mock http response based on request"""
+ def __init__(self, method, uri, res_json, **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.text = json.dumps(self.res)
+
+ self._track()
+
+ def json(self):
+ """returns json of response"""
+ return self.res
+
+ def raise_for_status(self):
+ """ignoring"""
+ pass
+
+ def to_json(self):
+ """create json of the message"""
+ return {
+ "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)
+
+
+class Tracker(object):
+ """record all the messages going outside policy-handler during testing"""
+ test_name = None
+ messages = []
+
+ @staticmethod
+ def reset(test_name):
+ """remove all the messages from history"""
+ Tracker.test_name = test_name
+ Tracker.messages.clear()
+
+ @staticmethod
+ def track(message):
+ """append the tracked message to the history"""
+ message = copy.deepcopy(message)
+ Tracker.messages.append(message)
+ if Settings.logger:
+ Settings.logger.info("tracked_message: %s", json.dumps(message, sort_keys=True))
+
+ @staticmethod
+ def to_string():
+ """stringify message history for logging"""
+ return json.dumps(Tracker.messages, sort_keys=True)
+
+ @staticmethod
+ def _hide_volatiles(obj):
+ """hides the volatile field values"""
+ if not isinstance(obj, dict):
+ return obj
+
+ for key, value in obj.items():
+ if key in [REQUEST_X_ECOMP_REQUESTID, RESPONSE]:
+ obj[key] = "*"
+ elif isinstance(value, dict):
+ obj[key] = Tracker._hide_volatiles(value)
+
+ return obj
+
+ @staticmethod
+ def validate():
+ """validate that the message history is as expected"""
+ Settings.logger.info("Tracker.validate(%s)", Tracker.test_name)
+ messages = [Tracker._hide_volatiles(copy.deepcopy(message))
+ for message in Tracker.messages]
+ expected = HISTORY_EXPECTED.get(Tracker.test_name, [])
+
+ Settings.logger.info("messages: %s", json.dumps(messages, sort_keys=True))
+ Settings.logger.info("expected: %s", json.dumps(expected, sort_keys=True))
+ assert Utils.are_the_same(messages, expected)
+
+ Settings.logger.info("history valid for Tracker.validate(%s)", Tracker.test_name)
diff --git a/tests/mock_websocket.py b/tests/mock_websocket.py
new file mode 100644
index 0000000..ac64ed8
--- /dev/null
+++ b/tests/mock_websocket.py
@@ -0,0 +1,89 @@
+# ============LICENSE_START=======================================================
+# Copyright (c) 2018 AT&T Intellectual Property. All rights reserved.
+# ================================================================================
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+# ============LICENSE_END=========================================================
+#
+# ECOMP is a trademark and service mark of AT&T Intellectual Property.
+"""mocking for the websocket - for testing of policy-engine"""
+
+import json
+import time
+
+from policyhandler.policy_consts import POLICY_NAME
+from policyhandler.policy_receiver import (LOADED_POLICIES, POLICY_VER,
+ REMOVED_POLICIES)
+
+from .mock_policy_engine import MockPolicyEngine
+from .mock_settings import Settings
+
+
+class MockWebSocket(object):
+ """Mock websocket"""
+ on_message = None
+
+ @staticmethod
+ def send_notification(updated_indexes):
+ """fake notification through the web-socket"""
+ if not MockWebSocket.on_message:
+ return
+ message = {
+ LOADED_POLICIES: [
+ {POLICY_NAME: "{0}.{1}.xml".format(
+ MockPolicyEngine.get_policy_id(policy_index), policy_index + 1),
+ POLICY_VER: str(policy_index + 1)}
+ for policy_index in updated_indexes or []
+ ],
+ REMOVED_POLICIES : []
+ }
+ message = json.dumps(message)
+ Settings.logger.info("send_notification: %s", message)
+ MockWebSocket.on_message(None, message)
+
+ @staticmethod
+ def enableTrace(yes_no):
+ """ignore"""
+ pass
+
+ class MockSocket(object):
+ """Mock websocket"""
+ def __init__(self):
+ self.connected = True
+
+ class WebSocketApp(object):
+ """Mocked WebSocketApp"""
+ def __init__(self, web_socket_url,
+ on_open=None, on_message=None, on_close=None, on_error=None, on_pong=None):
+ self.web_socket_url = web_socket_url
+ self.on_open = on_open
+ self.on_message = MockWebSocket.on_message = on_message
+ self.on_close = on_close
+ self.on_error = on_error
+ self.on_pong = on_pong
+ self.sock = MockWebSocket.MockSocket()
+ Settings.logger.info("MockWebSocket for: %s", self.web_socket_url)
+
+ def run_forever(self, sslopt=None):
+ """forever in the loop"""
+ Settings.logger.info("MockWebSocket run_forever with sslopt=%s...",
+ json.dumps(sslopt))
+ counter = 0
+ while self.sock.connected:
+ counter += 1
+ Settings.logger.info("MockWebSocket sleep %s...", counter)
+ time.sleep(5)
+ Settings.logger.info("MockWebSocket exit %s", counter)
+
+ def close(self):
+ """close socket"""
+ self.sock.connected = False
diff --git a/tests/test_policy_rest.py b/tests/test_policy_rest.py
new file mode 100644
index 0000000..ac2529a
--- /dev/null
+++ b/tests/test_policy_rest.py
@@ -0,0 +1,47 @@
+# ============LICENSE_START=======================================================
+# Copyright (c) 2018 AT&T Intellectual Property. All rights reserved.
+# ================================================================================
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+# ============LICENSE_END=========================================================
+#
+# ECOMP is a trademark and service mark of AT&T Intellectual Property.
+"""test policy_rest methods directly"""
+
+import json
+
+import pytest
+
+from policyhandler.onap.audit import Audit
+from policyhandler.policy_rest import PolicyRest
+from policyhandler.policy_utils import Utils
+
+from .mock_policy_engine import MockPolicyEngine
+from .mock_settings import Settings
+from .mock_tracker import Tracker
+
+
+@pytest.mark.usefixtures("fix_pdp_post")
+def test_get_policy_latest():
+ """test /policy_latest/<policy-id>"""
+ policy_id, expected_policy = MockPolicyEngine.gen_policy_latest(3)
+
+ audit = Audit(job_name="test_get_policy_latest",
+ req_message="get /policy_latest/{}".format(policy_id or ""))
+ policy_latest = PolicyRest.get_latest_policy((audit, policy_id, None, None)) or {}
+ audit.audit_done(result=json.dumps(policy_latest))
+
+ Settings.logger.info("expected_policy: %s", json.dumps(expected_policy))
+ Settings.logger.info("policy_latest: %s", json.dumps(policy_latest))
+ assert Utils.are_the_same(policy_latest, expected_policy)
+
+ Tracker.validate()
diff --git a/tests/test_policyhandler.py b/tests/test_policyhandler.py
index c501c12..4743a6e 100644
--- a/tests/test_policyhandler.py
+++ b/tests/test_policyhandler.py
@@ -18,418 +18,24 @@
"""test of the package for policy-handler of DCAE-Controller"""
-import base64
-import copy
import json
-import re
import time
import uuid
+import pytest
import cherrypy
from cherrypy.test.helper import CPWebCase
-import pytest
-
-from policyhandler.config import Config
-from policyhandler.deploy_handler import DeployHandler
-from policyhandler.discovery import DiscoveryClient
-from policyhandler.onap.audit import (REQUEST_X_ECOMP_REQUESTID, Audit,
- AuditHttpCode)
-from policyhandler.policy_consts import (LATEST_POLICIES, POLICY_BODY,
- POLICY_CONFIG, POLICY_ID, POLICY_NAME,
- POLICY_VERSION, POLICY_VERSIONS)
-from policyhandler.policy_receiver import (LOADED_POLICIES, POLICY_VER,
- REMOVED_POLICIES, PolicyReceiver)
-from policyhandler.policy_rest import PolicyRest
-from policyhandler.policy_utils import PolicyUtils, Utils
+from policyhandler.onap.audit import REQUEST_X_ECOMP_REQUESTID, Audit
+from policyhandler.policy_consts import LATEST_POLICIES, POLICY_NAME
+from policyhandler.policy_receiver import PolicyReceiver
+from policyhandler.policy_utils import Utils
from policyhandler.web_server import _PolicyWeb
-from .mock_settings import MonkeyedResponse, Settings
-
-Settings.init()
-
-class MonkeyPolicyBody(object):
- """policy body that policy-engine returns"""
- @staticmethod
- def create_policy_body(policy_id, policy_version=1):
- """returns a fake policy-body"""
- prev_ver = str(policy_version - 1)
- this_ver = str(policy_version)
- config = {
- "policy_updated_from_ver": prev_ver,
- "policy_updated_to_ver": this_ver,
- "policy_hello": "world!",
- "policy_updated_ts": Settings.RUN_TS,
- "updated_policy_id": policy_id
- }
- return {
- "policyConfigMessage": "Config Retrieved! ",
- "policyConfigStatus": "CONFIG_RETRIEVED",
- "type": "JSON",
- POLICY_NAME: "{0}.{1}.xml".format(policy_id, this_ver),
- POLICY_VERSION: this_ver,
- POLICY_CONFIG: json.dumps(config),
- "matchingConditions": {
- "ONAPName": "DCAE",
- "ConfigName": "alex_config_name"
- },
- "responseAttributes": {},
- "property": None
- }
-
-
-class MockPolicyEngine(object):
- """pretend this is the policy-engine"""
- scope_prefix = "test_scope_prefix.Config_"
- LOREM_IPSUM = """Lorem ipsum dolor sit amet consectetur ametist""".split()
- LONG_TEXT = "0123456789" * 100
- _policies = []
-
- @staticmethod
- def init():
- """init static vars"""
- MockPolicyEngine._policies = [
- MonkeyPolicyBody.create_policy_body(
- MockPolicyEngine.scope_prefix + policy_id, policy_index + 1)
- for policy_id in MockPolicyEngine.LOREM_IPSUM
- for policy_index in range(1 + MockPolicyEngine.LOREM_IPSUM.index(policy_id))]
- Settings.logger.info("MockPolicyEngine._policies: %s",
- json.dumps(MockPolicyEngine._policies))
-
- @staticmethod
- def get_config(policy_name):
- """find policy the way the policy-engine finds"""
- if not policy_name:
- return []
- return [copy.deepcopy(policy)
- for policy in MockPolicyEngine._policies
- if re.match(policy_name, policy[POLICY_NAME])]
-
- @staticmethod
- def get_configs_all():
- """get all policies the way the policy-engine finds"""
- policies = [copy.deepcopy(policy)
- for policy in MockPolicyEngine._policies]
- for policy in policies:
- policy["config"] = MockPolicyEngine.LONG_TEXT
- return policies
-
- @staticmethod
- def get_policy_id(policy_index):
- """get the policy_id by index"""
- return (MockPolicyEngine.scope_prefix
- + MockPolicyEngine.LOREM_IPSUM[
- policy_index % len(MockPolicyEngine.LOREM_IPSUM)])
-
- @staticmethod
- def gen_policy_latest(policy_index, version_offset=0):
- """generate the policy response by policy_index = version - 1"""
- policy_id = MockPolicyEngine.get_policy_id(policy_index)
- policy = {
- POLICY_ID: policy_id,
- POLICY_BODY: MonkeyPolicyBody.create_policy_body(
- policy_id, policy_index + 1 - version_offset)
- }
- return policy_id, PolicyUtils.parse_policy_config(policy)
-
- @staticmethod
- def gen_all_policies_latest(version_offset=0):
- """generate all latest policies"""
- return dict(MockPolicyEngine.gen_policy_latest(policy_index, version_offset=version_offset)
- for policy_index in range(len(MockPolicyEngine.LOREM_IPSUM)))
-
- @staticmethod
- def gen_policies_latest(match_to_policy_name):
- """generate all latest policies"""
- return dict((k, v)
- for k, v in MockPolicyEngine.gen_all_policies_latest().items()
- if re.match(match_to_policy_name, k))
-
-MockPolicyEngine.init()
-
-
-class MockDeploymentHandler(object):
- """pretend this is the deployment-handler"""
-
- @staticmethod
- def default_response():
- """generate the deployed policies message"""
- return {"server_instance_uuid": Settings.deploy_handler_instance_uuid}
-
- @staticmethod
- def get_deployed_policies():
- """generate the deployed policies message"""
- 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 (MockPolicyEngine.gen_all_policies_latest(version_offset=1)
- .items()))
- response["policies"] = policies
-
- return response
-
-
-@pytest.fixture()
-def fix_pdp_post(monkeypatch):
- """monkeyed request /getConfig to PDP"""
- def monkeyed_policy_rest_post(full_path, json=None, headers=None, **custom_kwargs):
- """monkeypatch for the POST to policy-engine"""
- res_json = MockPolicyEngine.get_config(json.get(POLICY_NAME))
- return MonkeyedResponse(full_path, res_json, json, headers)
-
- Settings.logger.info("setup fix_pdp_post")
- PolicyRest._lazy_init()
- monkeypatch.setattr('policyhandler.policy_rest.PolicyRest._requests_session.post',
- monkeyed_policy_rest_post)
- yield fix_pdp_post # provide the fixture value
- Settings.logger.info("teardown fix_pdp_post")
-
-
-@pytest.fixture()
-def fix_pdp_post_big(monkeypatch):
- """monkeyed request /getConfig to PDP"""
- def monkeyed_policy_rest_post(full_path, json=None, headers=None, **custom_kwargs):
- """monkeypatch for the POST to policy-engine"""
- res_json = MockPolicyEngine.get_configs_all()
- return MonkeyedResponse(full_path, res_json, json, headers)
-
- Settings.logger.info("setup fix_pdp_post_big")
- PolicyRest._lazy_init()
- monkeypatch.setattr('policyhandler.policy_rest.PolicyRest._requests_session.post',
- monkeyed_policy_rest_post)
- yield fix_pdp_post_big # provide the fixture value
- Settings.logger.info("teardown fix_pdp_post_big")
-
-
-class MockException(Exception):
- """mock exception"""
- pass
-
-
-@pytest.fixture()
-def fix_pdp_post_boom(monkeypatch):
- """monkeyed request /getConfig to PDP - exception"""
- def monkeyed_policy_rest_post_boom(full_path, json=None, headers=None, **custom_kwargs):
- """monkeypatch for the POST to policy-engine"""
- raise MockException("fix_pdp_post_boom")
-
- Settings.logger.info("setup fix_pdp_post_boom")
- PolicyRest._lazy_init()
- monkeypatch.setattr('policyhandler.policy_rest.PolicyRest._requests_session.post',
- monkeyed_policy_rest_post_boom)
- yield fix_pdp_post_boom
- Settings.logger.info("teardown fix_pdp_post_boom")
-
-@staticmethod
-def monkeyed_boom(*args, **kwargs):
- """monkeypatch for the select_latest_policies"""
- raise MockException("monkeyed_boom")
-
-@pytest.fixture()
-def fix_select_latest_policies_boom(monkeypatch):
- """monkeyed exception"""
-
- Settings.logger.info("setup fix_select_latest_policies_boom")
- monkeypatch.setattr('policyhandler.policy_utils.PolicyUtils.select_latest_policies',
- monkeyed_boom)
- monkeypatch.setattr('policyhandler.policy_utils.PolicyUtils.select_latest_policy',
- monkeyed_boom)
- monkeypatch.setattr('policyhandler.policy_utils.PolicyUtils.extract_policy_id',
- monkeyed_boom)
-
- yield fix_select_latest_policies_boom
- Settings.logger.info("teardown fix_select_latest_policies_boom")
-
-@pytest.fixture()
-def fix_discovery(monkeypatch):
- """monkeyed discovery request.get"""
- def monkeyed_discovery(full_path):
- """monkeypatch for get from consul"""
- res_json = {}
- if full_path == DiscoveryClient.CONSUL_SERVICE_MASK.format(
- Config.discovered_config.get_by_key(Config.DEPLOY_HANDLER)):
- res_json = [{
- "ServiceAddress": "1.1.1.1",
- "ServicePort": "123"
- }]
- elif full_path == DiscoveryClient.CONSUL_KV_MASK.format(Config.system_name):
- res_json = [{"Value": base64.b64encode(
- json.dumps(Settings.mock_config).encode()).decode("utf-8")}]
- return MonkeyedResponse(full_path, res_json)
-
- Settings.logger.info("setup fix_discovery")
- monkeypatch.setattr('policyhandler.discovery.requests.get', monkeyed_discovery)
- yield fix_discovery # provide the fixture value
- Settings.logger.info("teardown fix_discovery")
-
-@pytest.fixture()
-def fix_deploy_handler(monkeypatch):
- """monkeyed requests to deployment-handler"""
- def monkeyed_deploy_handler_put(full_path, json=None, headers=None,
- params=None, **custom_kwargs):
- """monkeypatch for policy-update request.put to deploy_handler"""
- return MonkeyedResponse(full_path, MockDeploymentHandler.default_response(),
- json, headers)
-
- def monkeyed_deploy_handler_get(full_path, headers=None, params=None, **custom_kwargs):
- """monkeypatch policy-update request.get to deploy_handler"""
- return MonkeyedResponse(full_path, MockDeploymentHandler.get_deployed_policies(),
- None, headers)
-
- Settings.logger.info("setup fix_deploy_handler")
- 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 # provide the fixture value
- audit.audit_done("teardown")
- Settings.logger.info("teardown fix_deploy_handler")
-
-
-@pytest.fixture()
-def fix_deploy_handler_fail(monkeypatch):
- """monkeyed failed discovery request.get"""
- def monkeyed_deploy_handler_put(full_path, json=None, headers=None,
- params=None, **custom_kwargs):
- """monkeypatch for deploy_handler"""
- res = MonkeyedResponse(
- full_path,
- {"server_instance_uuid": Settings.deploy_handler_instance_uuid},
- json, headers
- )
- res.status_code = 413
- return res
-
- def monkeyed_deploy_handler_get(full_path, headers=None, params=None, **custom_kwargs):
- """monkeypatch policy-update request.get to deploy_handler"""
- return MonkeyedResponse(full_path, MockDeploymentHandler.default_response(),
- None, headers)
-
- @staticmethod
- def monkeyed_deploy_handler_init(audit_ignore):
- """monkeypatch for deploy_handler init"""
- DeployHandler._url = None
-
- Settings.logger.info("setup fix_deploy_handler_fail")
- config_catch_up = Config.discovered_config.get_by_key("catch_up")
- Config.discovered_config.update("catch_up", {"interval": 1})
-
- audit = Audit(req_message="fix_deploy_handler_fail")
- DeployHandler._lazy_init(audit)
-
- monkeypatch.setattr('policyhandler.deploy_handler.DeployHandler._lazy_init',
- monkeyed_deploy_handler_init)
- 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_fail
- audit.audit_done("teardown")
- Settings.logger.info("teardown fix_deploy_handler_fail")
- Config.discovered_config.update("catch_up", config_catch_up)
-
-
-@pytest.fixture()
-def fix_cherrypy_engine_exit(monkeypatch):
- """monkeyed cherrypy.engine.exit()"""
- Settings.logger.info("setup fix_cherrypy_engine_exit")
-
- def monkeyed_cherrypy_engine_exit():
- """monkeypatch for deploy_handler"""
- Settings.logger.info("cherrypy_engine_exit()")
-
- monkeypatch.setattr('policyhandler.web_server.cherrypy.engine.exit',
- monkeyed_cherrypy_engine_exit)
- yield fix_cherrypy_engine_exit # provide the fixture value
- Settings.logger.info("teardown fix_cherrypy_engine_exit")
-
-
-class MonkeyedWebSocket(object):
- """Monkey websocket"""
- on_message = None
-
- @staticmethod
- def send_notification(updated_indexes):
- """fake notification through the web-socket"""
- if not MonkeyedWebSocket.on_message:
- return
- message = {
- LOADED_POLICIES: [
- {POLICY_NAME: "{0}.{1}.xml".format(
- MockPolicyEngine.get_policy_id(policy_index), policy_index + 1),
- POLICY_VER: str(policy_index + 1)}
- for policy_index in updated_indexes or []
- ],
- REMOVED_POLICIES : []
- }
- message = json.dumps(message)
- Settings.logger.info("send_notification: %s", message)
- MonkeyedWebSocket.on_message(None, message)
-
- @staticmethod
- def enableTrace(yes_no):
- """ignore"""
- pass
-
- class MonkeyedSocket(object):
- """Monkey websocket"""
- def __init__(self):
- self.connected = True
-
- class WebSocketApp(object):
- """Monkeyed WebSocketApp"""
- def __init__(self, web_socket_url, on_message=None, on_close=None, on_error=None):
- self.web_socket_url = web_socket_url
- self.on_message = MonkeyedWebSocket.on_message = on_message
- self.on_close = on_close
- self.on_error = on_error
- self.sock = MonkeyedWebSocket.MonkeyedSocket()
- Settings.logger.info("MonkeyedWebSocket for: %s", self.web_socket_url)
-
- def run_forever(self):
- """forever in the loop"""
- counter = 0
- while self.sock.connected:
- counter += 1
- Settings.logger.info("MonkeyedWebSocket sleep %s...", counter)
- time.sleep(5)
- Settings.logger.info("MonkeyedWebSocket exit %s", counter)
-
- def close(self):
- """close socket"""
- self.sock.connected = False
-
-
-@pytest.fixture()
-def fix_policy_receiver_websocket(monkeypatch):
- """monkeyed websocket for policy_receiver"""
- Settings.logger.info("setup fix_policy_receiver_websocket")
- monkeypatch.setattr('policyhandler.policy_receiver.websocket', MonkeyedWebSocket)
- yield fix_policy_receiver_websocket # provide the fixture value
- Settings.logger.info("teardown fix_policy_receiver_websocket")
-
-
-def test_get_policy_latest(fix_pdp_post, fix_discovery):
- """test /policy_latest/<policy-id>"""
- policy_id, expected_policy = MockPolicyEngine.gen_policy_latest(3)
-
- audit = Audit(job_name="test_get_policy_latest",
- req_message="get /policy_latest/{0}".format(policy_id or ""))
- policy_latest = PolicyRest.get_latest_policy((audit, policy_id, None, None)) or {}
- audit.audit_done(result=json.dumps(policy_latest))
-
- Settings.logger.info("expected_policy: %s", json.dumps(expected_policy))
- Settings.logger.info("policy_latest: %s", json.dumps(policy_latest))
- assert Utils.are_the_same(policy_latest, expected_policy)
-
+from .mock_policy_engine import MockPolicyEngine
+from .mock_settings import Settings
+from .mock_tracker import Tracker
+from .mock_websocket import MockWebSocket
@pytest.mark.usefixtures("fix_pdp_post", "fix_discovery")
@@ -448,6 +54,8 @@
Settings.logger.info("got healthcheck: %s", self.body)
self.assertStatus('200 OK')
+ Tracker.validate()
+
def test_web_policy_latest(self):
"""test /policy_latest/<policy-id>"""
policy_id, expected_policy = MockPolicyEngine.gen_policy_latest(3)
@@ -464,6 +72,8 @@
result = self.getPage("/healthcheck")
Settings.logger.info("healthcheck result: %s", result)
+ Tracker.validate()
+
@pytest.mark.usefixtures("fix_deploy_handler")
def test_web_all_policies_latest(self):
"""test GET /policies_latest"""
@@ -485,6 +95,8 @@
result = self.getPage("/healthcheck")
Settings.logger.info("healthcheck result: %s", result)
+ Tracker.validate()
+
def test_web_policies_latest(self):
"""test POST /policies_latest with policyName"""
match_to_policy_name = MockPolicyEngine.scope_prefix + "amet.*"
@@ -511,10 +123,14 @@
result = self.getPage("/healthcheck")
Settings.logger.info("healthcheck result: %s", result)
+ Tracker.validate()
+
@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"""
Settings.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)
@@ -522,23 +138,27 @@
Settings.logger.info("sleep before send_notification...")
time.sleep(2)
- MonkeyedWebSocket.send_notification([1, 3, 5])
+ MockWebSocket.send_notification([1, 3, 5])
Settings.logger.info("sleep after send_notification...")
time.sleep(3)
- Settings.logger.info("sleep 30 before shutdown...")
- time.sleep(30)
+ Settings.logger.info("sleep 10 before shutdown...")
+ time.sleep(10)
result = self.getPage("/healthcheck")
Settings.logger.info("healthcheck result: %s", result)
PolicyReceiver.shutdown(audit)
time.sleep(1)
+ assert not PolicyReceiver.is_running()
+
+ Tracker.validate()
@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"""
Settings.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",
req_message="start zzz_catch_up_on_deploy_handler_changed")
PolicyReceiver.run(audit)
@@ -546,14 +166,14 @@
Settings.logger.info("sleep before send_notification...")
time.sleep(2)
- MonkeyedWebSocket.send_notification([1])
+ MockWebSocket.send_notification([1])
Settings.logger.info("sleep after send_notification...")
time.sleep(3)
Settings.deploy_handler_instance_uuid = str(uuid.uuid4())
Settings.logger.info("new deploy-handler uuid=%s", Settings.deploy_handler_instance_uuid)
- MonkeyedWebSocket.send_notification([2, 4])
+ MockWebSocket.send_notification([2, 4])
Settings.logger.info("sleep after send_notification...")
time.sleep(3)
@@ -565,11 +185,15 @@
PolicyReceiver.shutdown(audit)
time.sleep(1)
+ assert not PolicyReceiver.is_running()
+
+ Tracker.validate()
@pytest.mark.usefixtures("fix_deploy_handler", "fix_policy_receiver_websocket")
def test_zzz_get_catch_up(self):
"""test /catch_up"""
Settings.logger.info("start /catch_up")
+ assert not PolicyReceiver.is_running()
audit = Audit(job_name="test_zzz_get_catch_up", req_message="start /catch_up")
PolicyReceiver.run(audit)
time.sleep(5)
@@ -586,6 +210,9 @@
PolicyReceiver.shutdown(audit)
time.sleep(1)
+ assert not PolicyReceiver.is_running()
+
+ Tracker.validate()
@pytest.mark.usefixtures(
"fix_deploy_handler",
@@ -594,13 +221,14 @@
def test_zzzzz_shutdown(self):
"""test shutdown"""
Settings.logger.info("start shutdown")
+ assert not PolicyReceiver.is_running()
audit = Audit(job_name="test_zzzzz_shutdown", req_message="start shutdown")
PolicyReceiver.run(audit)
Settings.logger.info("sleep before send_notification...")
time.sleep(2)
- MonkeyedWebSocket.send_notification([1, 3, 5])
+ MockWebSocket.send_notification([1, 3, 5])
Settings.logger.info("sleep after send_notification...")
time.sleep(3)
@@ -615,356 +243,6 @@
self.assertStatus('200 OK')
Settings.logger.info("got shutdown: %s", self.body)
time.sleep(1)
+ assert not PolicyReceiver.is_running()
-
-@pytest.mark.usefixtures("fix_pdp_post_boom", "fix_discovery")
-class WebServerPDPBoomTest(CPWebCase):
- """testing the web-server - runs tests in alphabetical order of method names"""
- def setup_server():
- """setup the web-server"""
- cherrypy.tree.mount(_PolicyWeb(), '/')
-
- setup_server = staticmethod(setup_server)
-
- def test_web_healthcheck(self):
- """test /healthcheck"""
- result = self.getPage("/healthcheck")
- Settings.logger.info("healthcheck result: %s", result)
- Settings.logger.info("got healthcheck: %s", self.body)
- self.assertStatus('200 OK')
-
- def test_web_policy_latest(self):
- """test /policy_latest/<policy-id>"""
- policy_id, _ = MockPolicyEngine.gen_policy_latest(3)
-
- self.getPage("/policy_latest/{0}".format(policy_id or ""))
- self.assertStatus(AuditHttpCode.SERVER_INTERNAL_ERROR.value)
-
- result = self.getPage("/healthcheck")
- Settings.logger.info("healthcheck result: %s", result)
-
- @pytest.mark.usefixtures("fix_deploy_handler")
- def test_web_all_policies_latest(self):
- """test GET /policies_latest"""
- result = self.getPage("/policies_latest")
- Settings.logger.info("result: %s", result)
- Settings.logger.info("body: %s", self.body)
- self.assertStatus(AuditHttpCode.SERVER_INTERNAL_ERROR.value)
-
- result = self.getPage("/healthcheck")
- Settings.logger.info("healthcheck result: %s", result)
-
- def test_web_policies_latest(self):
- """test POST /policies_latest with policyName"""
- match_to_policy_name = MockPolicyEngine.scope_prefix + "amet.*"
-
- body = json.dumps({POLICY_NAME: match_to_policy_name})
- result = self.getPage("/policies_latest", method='POST',
- body=body,
- headers=[
- (REQUEST_X_ECOMP_REQUESTID, str(uuid.uuid4())),
- ("Content-Type", "application/json"),
- ('Content-Length', str(len(body)))
- ])
- Settings.logger.info("result: %s", result)
- Settings.logger.info("body: %s", self.body)
- self.assertStatus(AuditHttpCode.SERVER_INTERNAL_ERROR.value)
-
- result = self.getPage("/healthcheck")
- Settings.logger.info("healthcheck result: %s", result)
-
- @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"""
- Settings.logger.info("start policy_updates_and_catch_ups")
- audit = Audit(job_name="test_zzz_policy_updates_and_catch_ups",
- req_message="start policy_updates_and_catch_ups")
- PolicyReceiver.run(audit)
-
- Settings.logger.info("sleep before send_notification...")
- time.sleep(2)
-
- MonkeyedWebSocket.send_notification([1, 3, 5])
- Settings.logger.info("sleep after send_notification...")
- time.sleep(3)
-
- Settings.logger.info("sleep 30 before shutdown...")
- time.sleep(30)
-
- result = self.getPage("/healthcheck")
- Settings.logger.info("healthcheck result: %s", result)
-
- PolicyReceiver.shutdown(audit)
- time.sleep(1)
-
- @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"""
- Settings.logger.info("start zzz_catch_up_on_deploy_handler_changed")
- audit = Audit(job_name="test_zzz_catch_up_on_deploy_handler_changed",
- req_message="start zzz_catch_up_on_deploy_handler_changed")
- PolicyReceiver.run(audit)
-
- Settings.logger.info("sleep before send_notification...")
- time.sleep(2)
-
- MonkeyedWebSocket.send_notification([1])
- Settings.logger.info("sleep after send_notification...")
- time.sleep(3)
-
- Settings.deploy_handler_instance_uuid = str(uuid.uuid4())
- Settings.logger.info("new deploy-handler uuid=%s", Settings.deploy_handler_instance_uuid)
-
- MonkeyedWebSocket.send_notification([2, 4])
- Settings.logger.info("sleep after send_notification...")
- time.sleep(3)
-
- Settings.logger.info("sleep 5 before shutdown...")
- time.sleep(5)
-
- result = self.getPage("/healthcheck")
- Settings.logger.info("healthcheck result: %s", result)
-
- PolicyReceiver.shutdown(audit)
- time.sleep(1)
-
- @pytest.mark.usefixtures("fix_deploy_handler", "fix_policy_receiver_websocket")
- def test_zzz_get_catch_up(self):
- """test /catch_up"""
- Settings.logger.info("start /catch_up")
- audit = Audit(job_name="test_zzz_get_catch_up", req_message="start /catch_up")
- PolicyReceiver.run(audit)
- time.sleep(5)
- result = self.getPage("/catch_up")
- Settings.logger.info("catch_up result: %s", result)
- self.assertStatus('200 OK')
- Settings.logger.info("got catch_up: %s", self.body)
-
- Settings.logger.info("sleep 5 before shutdown...")
- time.sleep(5)
-
- result = self.getPage("/healthcheck")
- Settings.logger.info("healthcheck result: %s", result)
-
- PolicyReceiver.shutdown(audit)
- time.sleep(1)
-
- @pytest.mark.usefixtures(
- "fix_deploy_handler",
- "fix_policy_receiver_websocket",
- "fix_cherrypy_engine_exit")
- def test_zzzzz_shutdown(self):
- """test shutdown"""
- Settings.logger.info("start shutdown")
- audit = Audit(job_name="test_zzzzz_shutdown", req_message="start shutdown")
- PolicyReceiver.run(audit)
-
- Settings.logger.info("sleep before send_notification...")
- time.sleep(2)
-
- MonkeyedWebSocket.send_notification([1, 3, 5])
- Settings.logger.info("sleep after send_notification...")
- time.sleep(3)
-
- result = self.getPage("/healthcheck")
- Settings.logger.info("healthcheck result: %s", result)
-
- WebServerPDPBoomTest.do_gc_test = False
- Settings.logger.info("shutdown...")
- audit.audit_done("shutdown")
- result = self.getPage("/shutdown")
- Settings.logger.info("shutdown result: %s", result)
- self.assertStatus('200 OK')
- Settings.logger.info("got shutdown: %s", self.body)
- time.sleep(1)
-
-
-@pytest.mark.usefixtures("fix_pdp_post", "fix_select_latest_policies_boom", "fix_discovery")
-class WebServerInternalBoomTest(CPWebCase):
- """testing the web-server - runs tests in alphabetical order of method names"""
- def setup_server():
- """setup the web-server"""
- cherrypy.tree.mount(_PolicyWeb(), '/')
-
- setup_server = staticmethod(setup_server)
-
- def test_web_healthcheck(self):
- """test /healthcheck"""
- result = self.getPage("/healthcheck")
- Settings.logger.info("healthcheck result: %s", result)
- Settings.logger.info("got healthcheck: %s", self.body)
- self.assertStatus('200 OK')
-
- def test_web_policy_latest(self):
- """test /policy_latest/<policy-id>"""
- policy_id, _ = MockPolicyEngine.gen_policy_latest(3)
-
- self.getPage("/policy_latest/{0}".format(policy_id or ""))
- self.assertStatus(AuditHttpCode.SERVER_INTERNAL_ERROR.value)
-
- result = self.getPage("/healthcheck")
- Settings.logger.info("healthcheck result: %s", result)
-
- @pytest.mark.usefixtures("fix_deploy_handler")
- def test_web_all_policies_latest(self):
- """test GET /policies_latest"""
- result = self.getPage("/policies_latest")
- Settings.logger.info("result: %s", result)
- Settings.logger.info("body: %s", self.body)
- self.assertStatus(AuditHttpCode.SERVER_INTERNAL_ERROR.value)
-
- result = self.getPage("/healthcheck")
- Settings.logger.info("healthcheck result: %s", result)
-
- def test_web_policies_latest(self):
- """test POST /policies_latest with policyName"""
- match_to_policy_name = MockPolicyEngine.scope_prefix + "amet.*"
-
- body = json.dumps({POLICY_NAME: match_to_policy_name})
- result = self.getPage("/policies_latest", method='POST',
- body=body,
- headers=[
- (REQUEST_X_ECOMP_REQUESTID, str(uuid.uuid4())),
- ("Content-Type", "application/json"),
- ('Content-Length', str(len(body)))
- ])
- Settings.logger.info("result: %s", result)
- Settings.logger.info("body: %s", self.body)
- self.assertStatus(AuditHttpCode.SERVER_INTERNAL_ERROR.value)
-
- result = self.getPage("/healthcheck")
- Settings.logger.info("healthcheck result: %s", result)
-
- @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"""
- Settings.logger.info("start policy_updates_and_catch_ups")
- audit = Audit(job_name="test_zzz_policy_updates_and_catch_ups",
- req_message="start policy_updates_and_catch_ups")
- PolicyReceiver.run(audit)
-
- Settings.logger.info("sleep before send_notification...")
- time.sleep(2)
-
- MonkeyedWebSocket.send_notification([1, 3, 5])
- Settings.logger.info("sleep after send_notification...")
- time.sleep(3)
-
- Settings.logger.info("sleep 30 before shutdown...")
- time.sleep(30)
-
- result = self.getPage("/healthcheck")
- Settings.logger.info("healthcheck result: %s", result)
-
- PolicyReceiver.shutdown(audit)
- time.sleep(1)
-
- @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"""
- Settings.logger.info("start zzz_catch_up_on_deploy_handler_changed")
- audit = Audit(job_name="test_zzz_catch_up_on_deploy_handler_changed",
- req_message="start zzz_catch_up_on_deploy_handler_changed")
- PolicyReceiver.run(audit)
-
- Settings.logger.info("sleep before send_notification...")
- time.sleep(2)
-
- MonkeyedWebSocket.send_notification([1])
- Settings.logger.info("sleep after send_notification...")
- time.sleep(3)
-
- Settings.deploy_handler_instance_uuid = str(uuid.uuid4())
- Settings.logger.info("new deploy-handler uuid=%s", Settings.deploy_handler_instance_uuid)
-
- MonkeyedWebSocket.send_notification([2, 4])
- Settings.logger.info("sleep after send_notification...")
- time.sleep(3)
-
- Settings.logger.info("sleep 5 before shutdown...")
- time.sleep(5)
-
- result = self.getPage("/healthcheck")
- Settings.logger.info("healthcheck result: %s", result)
-
- PolicyReceiver.shutdown(audit)
- time.sleep(1)
-
- @pytest.mark.usefixtures("fix_deploy_handler", "fix_policy_receiver_websocket")
- def test_zzz_get_catch_up(self):
- """test /catch_up"""
- Settings.logger.info("start /catch_up")
- audit = Audit(job_name="test_zzz_get_catch_up", req_message="start /catch_up")
- PolicyReceiver.run(audit)
- time.sleep(5)
- result = self.getPage("/catch_up")
- Settings.logger.info("catch_up result: %s", result)
- self.assertStatus('200 OK')
- Settings.logger.info("got catch_up: %s", self.body)
-
- Settings.logger.info("sleep 5 before shutdown...")
- time.sleep(5)
-
- result = self.getPage("/healthcheck")
- Settings.logger.info("healthcheck result: %s", result)
-
- PolicyReceiver.shutdown(audit)
- time.sleep(1)
-
- @pytest.mark.usefixtures(
- "fix_deploy_handler",
- "fix_policy_receiver_websocket",
- "fix_cherrypy_engine_exit")
- def test_zzzzz_shutdown(self):
- """test shutdown"""
- Settings.logger.info("start shutdown")
- audit = Audit(job_name="test_zzzzz_shutdown", req_message="start shutdown")
- PolicyReceiver.run(audit)
-
- Settings.logger.info("sleep before send_notification...")
- time.sleep(2)
-
- MonkeyedWebSocket.send_notification([1, 3, 5])
- Settings.logger.info("sleep after send_notification...")
- time.sleep(3)
-
- result = self.getPage("/healthcheck")
- Settings.logger.info("healthcheck result: %s", result)
-
- WebServerInternalBoomTest.do_gc_test = False
- Settings.logger.info("shutdown...")
- audit.audit_done("shutdown")
- result = self.getPage("/shutdown")
- Settings.logger.info("shutdown result: %s", result)
- self.assertStatus('200 OK')
- Settings.logger.info("got shutdown: %s", self.body)
- time.sleep(1)
-
-
-@pytest.mark.usefixtures(
- "fix_pdp_post_big",
- "fix_deploy_handler_fail",
- "fix_policy_receiver_websocket",
- "fix_discovery"
-)
-def test_catch_ups_failed_dh():
- """test run policy handler with catchups and failed deployment-handler"""
- Settings.logger.info("start test_catch_ups_failed_dh")
- audit = Audit(job_name="test_catch_ups_failed_dh",
- req_message="start test_catch_ups_failed_dh")
- PolicyReceiver.run(audit)
-
- Settings.logger.info("sleep 50 before shutdown...")
- time.sleep(50)
-
- health = audit.health(full=True)
- audit.audit_done(result=json.dumps(health))
-
- Settings.logger.info("healthcheck: %s", json.dumps(health))
- assert bool(health)
-
- PolicyReceiver.shutdown(audit)
- time.sleep(1)
-
- health = audit.health(full=True)
- Settings.logger.info("healthcheck: %s", json.dumps(health))
+ Tracker.validate()
diff --git a/tests/test_pz_catch_up.py b/tests/test_pz_catch_up.py
new file mode 100644
index 0000000..89be9bb
--- /dev/null
+++ b/tests/test_pz_catch_up.py
@@ -0,0 +1,96 @@
+# ============LICENSE_START=======================================================
+# Copyright (c) 2018 AT&T Intellectual Property. All rights reserved.
+# ================================================================================
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+# ============LICENSE_END=========================================================
+#
+# ECOMP is a trademark and service mark of AT&T Intellectual Property.
+"""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 .mock_settings import Settings
+from .mock_tracker import Tracker
+
+
+@pytest.mark.usefixtures(
+ "fix_auto_catch_up",
+ "fix_discovery",
+ "fix_pdp_post_big",
+ "fix_deploy_handler_413",
+ "fix_policy_receiver_websocket"
+)
+def test_catch_up_failed_dh():
+ """test run policy handler with catchups and failed deployment-handler"""
+ Settings.logger.info("start test_catch_up_failed_dh")
+ assert not PolicyReceiver.is_running()
+ audit = Audit(job_name="test_catch_up_failed_dh",
+ req_message="start test_catch_up_failed_dh")
+ PolicyReceiver.run(audit)
+
+ Settings.logger.info("sleep 12 before shutdown...")
+ time.sleep(12)
+
+ health = audit.health(full=True)
+ audit.audit_done(result=json.dumps(health))
+
+ Settings.logger.info("healthcheck: %s", json.dumps(health))
+ assert bool(health)
+
+ PolicyReceiver.shutdown(audit)
+ time.sleep(1)
+ assert not PolicyReceiver.is_running()
+
+ health = audit.health(full=True)
+ Settings.logger.info("healthcheck: %s", json.dumps(health))
+
+ Tracker.validate()
+
+@pytest.mark.usefixtures(
+ "fix_auto_catch_up",
+ "fix_discovery",
+ "fix_pdp_post",
+ "fix_deploy_handler_404",
+ "fix_policy_receiver_websocket"
+)
+def test_catch_up_dh_404():
+ """test run policy handler with catchups and failed deployment-handler"""
+ Settings.logger.info("start test_catch_up_dh_404")
+ assert not PolicyReceiver.is_running()
+ audit = Audit(job_name="test_catch_up_dh_404",
+ req_message="start test_catch_up_dh_404")
+ PolicyReceiver.run(audit)
+
+ Settings.logger.info("sleep 12 before shutdown...")
+ time.sleep(12)
+
+ health = audit.health(full=True)
+ audit.audit_done(result=json.dumps(health))
+
+ Settings.logger.info("healthcheck: %s", json.dumps(health))
+ assert bool(health)
+
+ PolicyReceiver.shutdown(audit)
+ time.sleep(1)
+ assert not PolicyReceiver.is_running()
+
+ health = audit.health(full=True)
+ Settings.logger.info("healthcheck: %s", json.dumps(health))
+
+ Tracker.validate()
diff --git a/tests/test_pz_pdp_boom.py b/tests/test_pz_pdp_boom.py
new file mode 100644
index 0000000..1b6f150
--- /dev/null
+++ b/tests/test_pz_pdp_boom.py
@@ -0,0 +1,226 @@
+# ============LICENSE_START=======================================================
+# Copyright (c) 2018 AT&T Intellectual Property. All rights reserved.
+# ================================================================================
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+# ============LICENSE_END=========================================================
+#
+# ECOMP is a trademark and service mark of AT&T Intellectual Property.
+"""test policyhandler web-server when pdp booms = fails"""
+
+import json
+import time
+import uuid
+
+import pytest
+import cherrypy
+from cherrypy.test.helper import CPWebCase
+
+from policyhandler.onap.audit import (REQUEST_X_ECOMP_REQUESTID, Audit,
+ AuditHttpCode)
+from policyhandler.policy_consts import POLICY_NAME
+from policyhandler.policy_receiver import PolicyReceiver
+from policyhandler.web_server import _PolicyWeb
+
+from .mock_policy_engine import MockPolicyEngine
+from .mock_settings import Settings
+from .mock_tracker import Tracker
+from .mock_websocket import MockWebSocket
+
+
+@pytest.mark.usefixtures(
+ "fix_discovery",
+ "fix_pdp_post_boom"
+)
+class WebServerPDPBoomTest(CPWebCase):
+ """testing the web-server - runs tests in alphabetical order of method names"""
+ def setup_server():
+ """setup the web-server"""
+ cherrypy.tree.mount(_PolicyWeb(), '/')
+
+ setup_server = staticmethod(setup_server)
+
+ def test_web_healthcheck(self):
+ """test /healthcheck"""
+ result = self.getPage("/healthcheck")
+ Settings.logger.info("healthcheck result: %s", result)
+ Settings.logger.info("got healthcheck: %s", self.body)
+ self.assertStatus('200 OK')
+
+ Tracker.validate()
+
+ def test_web_policy_latest(self):
+ """test /policy_latest/<policy-id>"""
+ policy_id, _ = MockPolicyEngine.gen_policy_latest(3)
+
+ self.getPage("/policy_latest/{0}".format(policy_id or ""))
+ self.assertStatus(AuditHttpCode.SERVER_INTERNAL_ERROR.value)
+
+ result = self.getPage("/healthcheck")
+ Settings.logger.info("healthcheck result: %s", result)
+
+ Tracker.validate()
+
+ @pytest.mark.usefixtures("fix_deploy_handler")
+ def test_web_all_policies_latest(self):
+ """test GET /policies_latest"""
+ result = self.getPage("/policies_latest")
+ Settings.logger.info("result: %s", result)
+ Settings.logger.info("body: %s", self.body)
+ self.assertStatus(AuditHttpCode.SERVER_INTERNAL_ERROR.value)
+
+ result = self.getPage("/healthcheck")
+ Settings.logger.info("healthcheck result: %s", result)
+
+ Tracker.validate()
+
+ def test_web_policies_latest(self):
+ """test POST /policies_latest with policyName"""
+ match_to_policy_name = MockPolicyEngine.scope_prefix + "amet.*"
+
+ body = json.dumps({POLICY_NAME: match_to_policy_name})
+ result = self.getPage("/policies_latest", method='POST',
+ body=body,
+ headers=[
+ (REQUEST_X_ECOMP_REQUESTID, str(uuid.uuid4())),
+ ("Content-Type", "application/json"),
+ ('Content-Length', str(len(body)))
+ ])
+ Settings.logger.info("result: %s", result)
+ Settings.logger.info("body: %s", self.body)
+ self.assertStatus(AuditHttpCode.SERVER_INTERNAL_ERROR.value)
+
+ result = self.getPage("/healthcheck")
+ Settings.logger.info("healthcheck result: %s", result)
+
+ Tracker.validate()
+
+ @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"""
+ Settings.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)
+
+ Settings.logger.info("sleep before send_notification...")
+ time.sleep(2)
+
+ MockWebSocket.send_notification([1, 3, 5])
+ Settings.logger.info("sleep after send_notification...")
+ time.sleep(3)
+
+ Settings.logger.info("sleep 10 before shutdown...")
+ time.sleep(10)
+
+ result = self.getPage("/healthcheck")
+ Settings.logger.info("healthcheck result: %s", result)
+
+ PolicyReceiver.shutdown(audit)
+ time.sleep(1)
+ assert not PolicyReceiver.is_running()
+
+ Tracker.validate()
+
+ @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"""
+ Settings.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",
+ req_message="start zzz_catch_up_on_deploy_handler_changed")
+ PolicyReceiver.run(audit)
+
+ Settings.logger.info("sleep before send_notification...")
+ time.sleep(2)
+
+ MockWebSocket.send_notification([1])
+ Settings.logger.info("sleep after send_notification...")
+ time.sleep(3)
+
+ Settings.deploy_handler_instance_uuid = str(uuid.uuid4())
+ Settings.logger.info("new deploy-handler uuid=%s", Settings.deploy_handler_instance_uuid)
+
+ MockWebSocket.send_notification([2, 4])
+ Settings.logger.info("sleep after send_notification...")
+ time.sleep(3)
+
+ Settings.logger.info("sleep 5 before shutdown...")
+ time.sleep(5)
+
+ result = self.getPage("/healthcheck")
+ Settings.logger.info("healthcheck result: %s", result)
+
+ PolicyReceiver.shutdown(audit)
+ time.sleep(1)
+ assert not PolicyReceiver.is_running()
+
+ Tracker.validate()
+
+ @pytest.mark.usefixtures("fix_deploy_handler", "fix_policy_receiver_websocket")
+ def test_zzz_get_catch_up(self):
+ """test /catch_up"""
+ Settings.logger.info("start /catch_up")
+ assert not PolicyReceiver.is_running()
+ audit = Audit(job_name="test_zzz_get_catch_up", req_message="start /catch_up")
+ PolicyReceiver.run(audit)
+ time.sleep(5)
+ result = self.getPage("/catch_up")
+ Settings.logger.info("catch_up result: %s", result)
+ self.assertStatus('200 OK')
+ Settings.logger.info("got catch_up: %s", self.body)
+
+ Settings.logger.info("sleep 5 before shutdown...")
+ time.sleep(5)
+
+ result = self.getPage("/healthcheck")
+ Settings.logger.info("healthcheck result: %s", result)
+
+ PolicyReceiver.shutdown(audit)
+ time.sleep(1)
+ assert not PolicyReceiver.is_running()
+
+ Tracker.validate()
+
+ @pytest.mark.usefixtures(
+ "fix_deploy_handler",
+ "fix_policy_receiver_websocket",
+ "fix_cherrypy_engine_exit")
+ def test_zzzzz_shutdown(self):
+ """test shutdown"""
+ Settings.logger.info("start shutdown")
+ assert not PolicyReceiver.is_running()
+ audit = Audit(job_name="test_zzzzz_shutdown", req_message="start shutdown")
+ PolicyReceiver.run(audit)
+
+ Settings.logger.info("sleep before send_notification...")
+ time.sleep(2)
+
+ MockWebSocket.send_notification([1, 3, 5])
+ Settings.logger.info("sleep after send_notification...")
+ time.sleep(3)
+
+ result = self.getPage("/healthcheck")
+ Settings.logger.info("healthcheck result: %s", result)
+
+ WebServerPDPBoomTest.do_gc_test = False
+ Settings.logger.info("shutdown...")
+ audit.audit_done("shutdown")
+ result = self.getPage("/shutdown")
+ Settings.logger.info("shutdown result: %s", result)
+ self.assertStatus('200 OK')
+ Settings.logger.info("got shutdown: %s", self.body)
+ time.sleep(1)
+ assert not PolicyReceiver.is_running()
+
+ Tracker.validate()
diff --git a/tests/test_pz_ph_boom.py b/tests/test_pz_ph_boom.py
new file mode 100644
index 0000000..c392b3a
--- /dev/null
+++ b/tests/test_pz_ph_boom.py
@@ -0,0 +1,228 @@
+# ============LICENSE_START=======================================================
+# Copyright (c) 2018 AT&T Intellectual Property. All rights reserved.
+# ================================================================================
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+# ============LICENSE_END=========================================================
+#
+# ECOMP is a trademark and service mark of AT&T Intellectual Property.
+"""test policyhandler web-server when the policy-handler booms = fails"""
+
+import json
+import time
+import uuid
+
+
+import pytest
+import cherrypy
+from cherrypy.test.helper import CPWebCase
+
+from policyhandler.onap.audit import (REQUEST_X_ECOMP_REQUESTID, Audit,
+ AuditHttpCode)
+from policyhandler.policy_consts import POLICY_NAME
+from policyhandler.policy_receiver import PolicyReceiver
+from policyhandler.web_server import _PolicyWeb
+
+from .mock_policy_engine import MockPolicyEngine
+from .mock_settings import Settings
+from .mock_tracker import Tracker
+from .mock_websocket import MockWebSocket
+
+
+@pytest.mark.usefixtures(
+ "fix_discovery",
+ "fix_pdp_post",
+ "fix_select_latest_policies_boom"
+)
+class WebServerInternalBoomTest(CPWebCase):
+ """testing the web-server - runs tests in alphabetical order of method names"""
+ def setup_server():
+ """setup the web-server"""
+ cherrypy.tree.mount(_PolicyWeb(), '/')
+
+ setup_server = staticmethod(setup_server)
+
+ def test_web_healthcheck(self):
+ """test /healthcheck"""
+ result = self.getPage("/healthcheck")
+ Settings.logger.info("healthcheck result: %s", result)
+ Settings.logger.info("got healthcheck: %s", self.body)
+ self.assertStatus('200 OK')
+
+ Tracker.validate()
+
+ def test_web_policy_latest(self):
+ """test /policy_latest/<policy-id>"""
+ policy_id, _ = MockPolicyEngine.gen_policy_latest(3)
+
+ self.getPage("/policy_latest/{0}".format(policy_id or ""))
+ self.assertStatus(AuditHttpCode.SERVER_INTERNAL_ERROR.value)
+
+ result = self.getPage("/healthcheck")
+ Settings.logger.info("healthcheck result: %s", result)
+
+ Tracker.validate()
+
+ @pytest.mark.usefixtures("fix_deploy_handler")
+ def test_web_all_policies_latest(self):
+ """test GET /policies_latest"""
+ result = self.getPage("/policies_latest")
+ Settings.logger.info("result: %s", result)
+ Settings.logger.info("body: %s", self.body)
+ self.assertStatus(AuditHttpCode.SERVER_INTERNAL_ERROR.value)
+
+ result = self.getPage("/healthcheck")
+ Settings.logger.info("healthcheck result: %s", result)
+
+ Tracker.validate()
+
+ def test_web_policies_latest(self):
+ """test POST /policies_latest with policyName"""
+ match_to_policy_name = MockPolicyEngine.scope_prefix + "amet.*"
+
+ body = json.dumps({POLICY_NAME: match_to_policy_name})
+ result = self.getPage("/policies_latest", method='POST',
+ body=body,
+ headers=[
+ (REQUEST_X_ECOMP_REQUESTID, str(uuid.uuid4())),
+ ("Content-Type", "application/json"),
+ ('Content-Length', str(len(body)))
+ ])
+ Settings.logger.info("result: %s", result)
+ Settings.logger.info("body: %s", self.body)
+ self.assertStatus(AuditHttpCode.SERVER_INTERNAL_ERROR.value)
+
+ result = self.getPage("/healthcheck")
+ Settings.logger.info("healthcheck result: %s", result)
+
+ Tracker.validate()
+
+ @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"""
+ Settings.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)
+
+ Settings.logger.info("sleep before send_notification...")
+ time.sleep(2)
+
+ MockWebSocket.send_notification([1, 3, 5])
+ Settings.logger.info("sleep after send_notification...")
+ time.sleep(3)
+
+ Settings.logger.info("sleep 10 before shutdown...")
+ time.sleep(10)
+
+ result = self.getPage("/healthcheck")
+ Settings.logger.info("healthcheck result: %s", result)
+
+ PolicyReceiver.shutdown(audit)
+ time.sleep(1)
+ assert not PolicyReceiver.is_running()
+
+ Tracker.validate()
+
+ @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"""
+ Settings.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",
+ req_message="start zzz_catch_up_on_deploy_handler_changed")
+ PolicyReceiver.run(audit)
+
+ Settings.logger.info("sleep before send_notification...")
+ time.sleep(2)
+
+ MockWebSocket.send_notification([1])
+ Settings.logger.info("sleep after send_notification...")
+ time.sleep(3)
+
+ Settings.deploy_handler_instance_uuid = str(uuid.uuid4())
+ Settings.logger.info("new deploy-handler uuid=%s", Settings.deploy_handler_instance_uuid)
+
+ MockWebSocket.send_notification([2, 4])
+ Settings.logger.info("sleep after send_notification...")
+ time.sleep(3)
+
+ Settings.logger.info("sleep 5 before shutdown...")
+ time.sleep(5)
+
+ result = self.getPage("/healthcheck")
+ Settings.logger.info("healthcheck result: %s", result)
+
+ PolicyReceiver.shutdown(audit)
+ time.sleep(1)
+ assert not PolicyReceiver.is_running()
+
+ Tracker.validate()
+
+ @pytest.mark.usefixtures("fix_deploy_handler", "fix_policy_receiver_websocket")
+ def test_zzz_get_catch_up(self):
+ """test /catch_up"""
+ Settings.logger.info("start /catch_up")
+ assert not PolicyReceiver.is_running()
+ audit = Audit(job_name="test_zzz_get_catch_up", req_message="start /catch_up")
+ PolicyReceiver.run(audit)
+ time.sleep(5)
+ result = self.getPage("/catch_up")
+ Settings.logger.info("catch_up result: %s", result)
+ self.assertStatus('200 OK')
+ Settings.logger.info("got catch_up: %s", self.body)
+
+ Settings.logger.info("sleep 5 before shutdown...")
+ time.sleep(5)
+
+ result = self.getPage("/healthcheck")
+ Settings.logger.info("healthcheck result: %s", result)
+
+ PolicyReceiver.shutdown(audit)
+ time.sleep(1)
+ assert not PolicyReceiver.is_running()
+
+ Tracker.validate()
+
+ @pytest.mark.usefixtures(
+ "fix_deploy_handler",
+ "fix_policy_receiver_websocket",
+ "fix_cherrypy_engine_exit")
+ def test_zzzzz_shutdown(self):
+ """test shutdown"""
+ Settings.logger.info("start shutdown")
+ assert not PolicyReceiver.is_running()
+ audit = Audit(job_name="test_zzzzz_shutdown", req_message="start shutdown")
+ PolicyReceiver.run(audit)
+
+ Settings.logger.info("sleep before send_notification...")
+ time.sleep(2)
+
+ MockWebSocket.send_notification([1, 3, 5])
+ Settings.logger.info("sleep after send_notification...")
+ time.sleep(3)
+
+ result = self.getPage("/healthcheck")
+ Settings.logger.info("healthcheck result: %s", result)
+
+ WebServerInternalBoomTest.do_gc_test = False
+ Settings.logger.info("shutdown...")
+ audit.audit_done("shutdown")
+ result = self.getPage("/shutdown")
+ Settings.logger.info("shutdown result: %s", result)
+ self.assertStatus('200 OK')
+ Settings.logger.info("got shutdown: %s", self.body)
+ time.sleep(1)
+ assert not PolicyReceiver.is_running()
+
+ Tracker.validate()
diff --git a/tests/test_zzz_memory.py b/tests/test_zzz_memory.py
index e70cf59..e1b5af3 100644
--- a/tests/test_zzz_memory.py
+++ b/tests/test_zzz_memory.py
@@ -22,11 +22,12 @@
import json
import time
+import pytest
+
from policyhandler.onap.audit import Audit, AuditHttpCode, Metrics
from .mock_settings import Settings
-Settings.init()
class Node(object):
"""making the cycled objects"""
@@ -66,7 +67,7 @@
audit.warn("debug from test_healthcheck_with_error")
audit.info_requested("debug from test_healthcheck_with_error")
if audit.is_success():
- audit.set_http_status_code(AuditHttpCode.DATA_NOT_FOUND_ERROR.value)
+ audit.set_http_status_code(AuditHttpCode.DATA_NOT_FOUND_OK.value)
audit.set_http_status_code(AuditHttpCode.SERVER_INTERNAL_ERROR.value)
metrics.metrics("test /healthcheck")
diff --git a/version.properties b/version.properties
index c162183..aae9468 100644
--- a/version.properties
+++ b/version.properties
@@ -1,5 +1,5 @@
major=4
-minor=4
+minor=5
patch=0
base_version=${major}.${minor}.${patch}
release_version=${base_version}