aboutsummaryrefslogtreecommitdiffstats
path: root/src/test/resources/http-cache
diff options
context:
space:
mode:
authorSirisha_Manchikanti <sirisha.manchikanti@est.tech>2021-05-07 15:17:52 +0100
committerSirisha_Manchikanti <sirisha.manchikanti@est.tech>2021-05-13 09:00:52 +0100
commitf83411a86e2277adae69e780e8511913d61a0f17 (patch)
treed75f197e703270cda608c9bd0d236f7ce8c12e13 /src/test/resources/http-cache
parentcac5cc982413ab9593186d308eda8936e9603ad9 (diff)
Modular structure of clamp including controlloop
This commit is the first commit that puts in multi module structure while changing the existing CLAMP code as little as possible. It adds a structure where common, models, participant and runtime are direct children under clamp, and current clamp code is moved under runtime. This runtime directory will host controlloop runtime code in later commits. Issue-ID: POLICY-3215 Signed-off-by: Sirisha_Manchikanti <sirisha.manchikanti@est.tech> Change-Id: I15bc8be92ed020343bff4024c4718fec462c40d7 Signed-off-by: liamfallon <liam.fallon@est.tech>
Diffstat (limited to 'src/test/resources/http-cache')
-rw-r--r--src/test/resources/http-cache/example/api/v1/blueprint-model/workflow-spec/.file96
-rw-r--r--src/test/resources/http-cache/example/api/v1/blueprint-model/workflow-spec/.header1
-rw-r--r--src/test/resources/http-cache/example/api/v1/blueprint-model/workflows/blueprint-name/baseconfiguration/version/1.0.0/.file12
-rw-r--r--src/test/resources/http-cache/example/api/v1/blueprint-model/workflows/blueprint-name/baseconfiguration/version/1.0.0/.header1
-rw-r--r--src/test/resources/http-cache/example/policy/api/v1/policies/.file197
-rw-r--r--src/test/resources/http-cache/example/policy/api/v1/policies/.header1
-rw-r--r--src/test/resources/http-cache/example/policy/api/v1/policytypes/.file53
-rw-r--r--src/test/resources/http-cache/example/policy/api/v1/policytypes/.header1
-rw-r--r--src/test/resources/http-cache/example/policy/api/v1/policytypes/onap.policies.Naming/versions/1.0.0/.file101
-rw-r--r--src/test/resources/http-cache/example/policy/api/v1/policytypes/onap.policies.Naming/versions/1.0.0/.header1
-rw-r--r--src/test/resources/http-cache/example/policy/api/v1/policytypes/onap.policies.controlloop.guard.common.Blacklist/versions/1.0.0/.file38
-rw-r--r--src/test/resources/http-cache/example/policy/api/v1/policytypes/onap.policies.controlloop.guard.common.Blacklist/versions/1.0.0/.header1
-rw-r--r--src/test/resources/http-cache/example/policy/api/v1/policytypes/onap.policies.controlloop.guard.common.FrequencyLimiter/versions/1.0.0/.file47
-rw-r--r--src/test/resources/http-cache/example/policy/api/v1/policytypes/onap.policies.controlloop.guard.common.FrequencyLimiter/versions/1.0.0/.header1
-rw-r--r--src/test/resources/http-cache/example/policy/api/v1/policytypes/onap.policies.controlloop.guard.common.MinMax/versions/1.0.0/.file80
-rw-r--r--src/test/resources/http-cache/example/policy/api/v1/policytypes/onap.policies.controlloop.guard.common.MinMax/versions/1.0.0/.header1
-rw-r--r--src/test/resources/http-cache/example/policy/api/v1/policytypes/onap.policies.controlloop.guard.common.MinMax/versions/2.0.0/.file40
-rw-r--r--src/test/resources/http-cache/example/policy/api/v1/policytypes/onap.policies.controlloop.guard.common.MinMax/versions/2.0.0/.header1
-rw-r--r--src/test/resources/http-cache/example/policy/api/v1/policytypes/onap.policies.controlloop.operational.common.Apex/versions/1.0.0/.file360
-rw-r--r--src/test/resources/http-cache/example/policy/api/v1/policytypes/onap.policies.controlloop.operational.common.Apex/versions/1.0.0/.header1
-rw-r--r--src/test/resources/http-cache/example/policy/api/v1/policytypes/onap.policies.controlloop.operational.common.Drools/versions/1.0.0/.file150
-rw-r--r--src/test/resources/http-cache/example/policy/api/v1/policytypes/onap.policies.controlloop.operational.common.Drools/versions/1.0.0/.header1
-rw-r--r--src/test/resources/http-cache/example/policy/api/v1/policytypes/onap.policies.monitoring.cdap.tca.hi.lo.app/versions/1.0.0/.file158
-rw-r--r--src/test/resources/http-cache/example/policy/api/v1/policytypes/onap.policies.monitoring.cdap.tca.hi.lo.app/versions/1.0.0/.header1
-rw-r--r--src/test/resources/http-cache/example/policy/api/v1/policytypes/onap.policies.monitoring.tcagen2/versions/1.0.0/.file160
-rw-r--r--src/test/resources/http-cache/example/policy/api/v1/policytypes/onap.policies.monitoring.tcagen2/versions/1.0.0/.header1
-rw-r--r--src/test/resources/http-cache/example/policy/pap/v1/pdps/.file104
-rw-r--r--src/test/resources/http-cache/example/policy/pap/v1/pdps/.header1
-rwxr-xr-xsrc/test/resources/http-cache/start_http_cache.sh52
-rwxr-xr-xsrc/test/resources/http-cache/third_party_proxy.py497
30 files changed, 0 insertions, 2159 deletions
diff --git a/src/test/resources/http-cache/example/api/v1/blueprint-model/workflow-spec/.file b/src/test/resources/http-cache/example/api/v1/blueprint-model/workflow-spec/.file
deleted file mode 100644
index 9e616dfea..000000000
--- a/src/test/resources/http-cache/example/api/v1/blueprint-model/workflow-spec/.file
+++ /dev/null
@@ -1,96 +0,0 @@
-{
- "blueprintName": "baseconfiguration",
- "version": "1.0.0",
- "workFlowData": {
- "workFlowName": "resource-assignment",
- "inputs": {
- "resource-assignment-properties": {
- "required": true,
- "type": "dt-resource-assignment-properties"
- }
- },
- "outputs": {
- "response-property": {
- "type": "string",
- "value": "executed"
- },
- "template-properties": {
- "type": "json",
- "value": {
- "get_attribute": [
- "resource-assignment",
- "assignment-params"
- ]
- }
- }
- }
- },
- "dataTypes": {
- "dt-resource-assignment-properties": {
- "description": "This is Dynamically generated data type for workflow activate",
- "version": "1.0.0",
- "metadata": null,
- "attributes": null,
- "properties": {
- "request-id": {
- "required": true,
- "type": "string",
- "input-param": true
- },
- "service-instance-id": {
- "required": true,
- "type": "string",
- "input-param": true
- },
- "vnf-id": {
- "required": true,
- "type": "string"
- },
- "action-name": {
- "required": true,
- "type": "string"
- },
- "scope-type": {
- "required": true,
- "type": "string"
- },
- "hostname": {
- "required": true,
- "type": "string",
- "input-param": true
- },
- "request-info": {
- "required": true,
- "type": "dt-request-info-properties",
- "input-param": true
- },
- "vnf_name": {
- "required": true,
- "type": "string"
- }
- },
- "constraints": null,
- "derived_from": "tosca.datatypes.Dynamic"
- },
- "dt-request-info-properties": {
- "description": "This is Dynamically generated data type for workflow activate",
- "version": "1.0.0",
- "metadata": null,
- "attributes": null,
- "properties": {
- "prop1": {
- "required": true,
- "type": "string",
- "input-param": true
- },
- "prop2": {
- "required": true,
- "type": "string",
- "input-param": true
- }
- },
- "constraints": null,
- "derived_from": "tosca.datatypes.Dynamic"
- }
- }
-} \ No newline at end of file
diff --git a/src/test/resources/http-cache/example/api/v1/blueprint-model/workflow-spec/.header b/src/test/resources/http-cache/example/api/v1/blueprint-model/workflow-spec/.header
deleted file mode 100644
index 5464a754d..000000000
--- a/src/test/resources/http-cache/example/api/v1/blueprint-model/workflow-spec/.header
+++ /dev/null
@@ -1 +0,0 @@
-{"Transfer-Encoding": "chunked", "Server": "Jetty(9.3.21.v20170918)", "Content-Type": "application/json", "X-ECOMP-RequestID": "e2ddb3c8-994f-47df-b4dc-097d4fb55c08"} \ No newline at end of file
diff --git a/src/test/resources/http-cache/example/api/v1/blueprint-model/workflows/blueprint-name/baseconfiguration/version/1.0.0/.file b/src/test/resources/http-cache/example/api/v1/blueprint-model/workflows/blueprint-name/baseconfiguration/version/1.0.0/.file
deleted file mode 100644
index 58975d86a..000000000
--- a/src/test/resources/http-cache/example/api/v1/blueprint-model/workflows/blueprint-name/baseconfiguration/version/1.0.0/.file
+++ /dev/null
@@ -1,12 +0,0 @@
-{
- "blueprintName": "baseconfiguration",
- "version": "1.0.0",
- "workflows": [
- "resource-assignment",
- "activate",
- "activate-restconf",
- "activate-cli",
- "assign-activate",
- "imperative-test-wf"
- ]
-} \ No newline at end of file
diff --git a/src/test/resources/http-cache/example/api/v1/blueprint-model/workflows/blueprint-name/baseconfiguration/version/1.0.0/.header b/src/test/resources/http-cache/example/api/v1/blueprint-model/workflows/blueprint-name/baseconfiguration/version/1.0.0/.header
deleted file mode 100644
index b11784a21..000000000
--- a/src/test/resources/http-cache/example/api/v1/blueprint-model/workflows/blueprint-name/baseconfiguration/version/1.0.0/.header
+++ /dev/null
@@ -1 +0,0 @@
-{"Transfer-Encoding": "chunked", "Server": "Jetty(9.3.21.v20170918)", "Content-Type": "application/json", "X-ECOMP-RequestID": "e2ddb3c8-994f-47df-b4dc-097d4fb55c08"} \ No newline at end of file
diff --git a/src/test/resources/http-cache/example/policy/api/v1/policies/.file b/src/test/resources/http-cache/example/policy/api/v1/policies/.file
deleted file mode 100644
index 91c3c87de..000000000
--- a/src/test/resources/http-cache/example/policy/api/v1/policies/.file
+++ /dev/null
@@ -1,197 +0,0 @@
-{
- "tosca_definitions_version": "tosca_simple_yaml_1_1_0",
- "topology_template": {
- "policies": [
- {
- "MICROSERVICE_vLoadBalancerMS_v1_0_tcagen2_1_0_0_AV0": {
- "type": "onap.policies.monitoring.tcagen2",
- "type_version": "1.0.0",
- "properties": {
- "tca.policy": {
- "domain": "measurementsForVfScaling",
- "metricsPerEventName": [
- {
- "policyScope": "DCAE",
- "thresholds": [
- {
- "version": "1.0.2",
- "severity": "MAJOR",
- "thresholdValue": 200,
- "closedLoopEventStatus": "ONSET",
- "closedLoopControlName": "LOOP_test",
- "direction": "LESS_OR_EQUAL",
- "fieldPath": "$.event.measurementsForVfScalingFields.vNicPerformanceArray[*].receivedTotalPacketsDelta"
- }
- ],
- "eventName": "vLoadBalancer",
- "policyVersion": "v0.0.1",
- "controlLoopSchemaType": "VM",
- "policyName": "DCAE.Config_tca-hi-lo"
- }
- ]
- }
- },
- "name": "MICROSERVICE_vLoadBalancerMS_v1_0_tcagen2_1_0_0_AV0",
- "version": "1.0.0",
- "metadata": {
- "policy-id": "MICROSERVICE_vLoadBalancerMS_v1_0_tcagen2_1_0_0_AV0",
- "policy-version": "1.0.0"
- }
- }
- },
- {
- "OPERATIONAL_vLoadBalancerMS_v1_0_Drools_1_0_0_7xd": {
- "type": "onap.policies.controlloop.operational.common.Drools",
- "type_version": "1.0.0",
- "properties": {
- "abatement": false,
- "operations": [
- {
- "failure_retries": "final_failure_retries",
- "id": "test1",
- "failure_timeout": "final_failure_timeout",
- "failure": "final_failure",
- "operation": {
- "payload": {
- "artifact_name": "baseconfiguration",
- "artifact_version": "1.0.0",
- "mode": "async",
- "data": "{\"resource-assignment-properties\":{\"request-id\":\"\",\"service-instance-id\":\"\",\"hostname\":\"\",\"request-info\":{\"prop1\":\"\",\"prop2\":\"\"}}}"
- },
- "target": {
- "entityIds": {
- "resourceID": "Vloadbalancerms..vdns..module-3",
- "modelInvariantId": "4c10ba9b-f88f-415e-9de3-5d33336047fa",
- "modelVersionId": "4fa73b49-8a6c-493e-816b-eb401567b720",
- "modelName": "Vloadbalancerms..vdns..module-3",
- "modelVersion": "1",
- "modelCustomizationId": "bafcdab0-801d-4d81-9ead-f464640a38b1"
- },
- "targetType": "VNF"
- },
- "actor": "SDNR",
- "operation": "BandwidthOnDemand"
- },
- "failure_guard": "final_failure_guard",
- "retries": 0,
- "timeout": 0,
- "failure_exception": "final_failure_exception",
- "description": "test",
- "success": "final_success"
- }
- ],
- "trigger": "test1",
- "timeout": 0,
- "id": "LOOP_test"
- },
- "name": "OPERATIONAL_vLoadBalancerMS_v1_0_Drools_1_0_0_7xd",
- "version": "1.0.0",
- "metadata": {
- "policy-id": "OPERATIONAL_vLoadBalancerMS_v1_0_Drools_1_0_0_7xd",
- "policy-version": "1.0.0"
- }
- }
- },
- {
- "SDNC_Policy.ONAP_NF_NAMING_TIMESTAMP": {
- "type": "onap.policies.Naming",
- "type_version": "1.0.0",
- "properties": {
- "naming-models": [
- {
- "naming-type": "VNF",
- "naming-recipe": "AIC_CLOUD_REGION|DELIMITER|CONSTANT|DELIMITER|TIMESTAMP",
- "name-operation": "to_lower_case()",
- "naming-properties": [
- {
- "property-name": "AIC_CLOUD_REGION"
- },
- {
- "property-name": "CONSTANT",
- "property-value": "onap-nf"
- },
- {
- "property-name": "TIMESTAMP"
- },
- {
- "property-value": "-",
- "property-name": "DELIMITER"
- }
- ]
- },
- {
- "naming-type": "VNFC",
- "naming-recipe": "VNF_NAME|DELIMITER|NFC_NAMING_CODE|DELIMITER|SEQUENCE",
- "name-operation": "to_lower_case()",
- "naming-properties": [
- {
- "property-name": "VNF_NAME"
- },
- {
- "property-name": "SEQUENCE",
- "increment-sequence": {
- "max": "zzz",
- "scope": "ENTIRETY",
- "start-value": "1",
- "length": "3",
- "increment": "1",
- "sequence-type": "alpha-numeric"
- }
- },
- {
- "property-name": "NFC_NAMING_CODE"
- },
- {
- "property-value": "-",
- "property-name": "DELIMITER"
- }
- ]
- },
- {
- "naming-type": "VF-MODULE",
- "naming-recipe": "VNF_NAME|DELIMITER|VF_MODULE_LABEL|DELIMITER|VF_MODULE_TYPE|DELIMITER|SEQUENCE",
- "name-operation": "to_lower_case()",
- "naming-properties": [
- {
- "property-name": "VNF_NAME"
- },
- {
- "property-value": "-",
- "property-name": "DELIMITER"
- },
- {
- "property-name": "VF_MODULE_LABEL"
- },
- {
- "property-name": "VF_MODULE_TYPE"
- },
- {
- "property-name": "SEQUENCE",
- "increment-sequence": {
- "max": "zzz",
- "scope": "PRECEEDING",
- "start-value": "1",
- "length": "3",
- "increment": "1",
- "sequence-type": "alpha-numeric"
- }
- }
- ]
- }
- ],
- "policy-instance-name": "ONAP_NF_NAMING_TIMESTAMP"
- },
- "name": "SDNC_Policy.ONAP_NF_NAMING_TIMESTAMP",
- "version": "1.0.0",
- "metadata": {
- "policy-id": "SDNC_Policy.ONAP_NF_NAMING_TIMESTAMP",
- "policy-version": "1.0.0"
- }
- }
- }
- ]
- },
- "name": "ToscaServiceTemplateSimple",
- "version": "1.0.0",
- "metadata": {}
-} \ No newline at end of file
diff --git a/src/test/resources/http-cache/example/policy/api/v1/policies/.header b/src/test/resources/http-cache/example/policy/api/v1/policies/.header
deleted file mode 100644
index b11784a21..000000000
--- a/src/test/resources/http-cache/example/policy/api/v1/policies/.header
+++ /dev/null
@@ -1 +0,0 @@
-{"Transfer-Encoding": "chunked", "Server": "Jetty(9.3.21.v20170918)", "Content-Type": "application/json", "X-ECOMP-RequestID": "e2ddb3c8-994f-47df-b4dc-097d4fb55c08"} \ No newline at end of file
diff --git a/src/test/resources/http-cache/example/policy/api/v1/policytypes/.file b/src/test/resources/http-cache/example/policy/api/v1/policytypes/.file
deleted file mode 100644
index 50fcf9135..000000000
--- a/src/test/resources/http-cache/example/policy/api/v1/policytypes/.file
+++ /dev/null
@@ -1,53 +0,0 @@
-tosca_definitions_version: tosca_simple_yaml_1_1_0
-policy_types:
- onap.policies.controlloop.operational.common.Drools:
- version: 1.0.0
- description: Operational Policy for Control Loops using the Drools PDP
- derived_from: onapy.policies.controlloop.Operational
- properties:
- # Omitted for brevity, see Section 1
-
- onap.policies.controlloop.operational.common.Apex:
- version: 1.0.0
- description: Operational Policy for Control Loops using the APEX PDP
- derived_from: onap.policies.controlloop.Operational
- properties:
- # Omitted for brevity, see Section 1
-
- onap.policies.controlloop.guard.common.FrequencyLimiter:
- version: 1.0.0
- description: Supports limiting the frequency of actions being taken by a Actor.
- derived_from: onap.policies.controlloop.Guard
- properties:
- # Omitted for brevity, see Section 1
-
- onap.policies.controlloop.guard.common.Blacklist:
- version: 1.0.0
- description: Supports blacklist of VNF's from performing control loop actions on.
- derived_from: onap.policies.controlloop.Guard
- properties:
- # Omitted for brevity, see Section 1
-
- onap.policies.Naming:
- version: 1.0.0
- description: Supports blacklist of VNF's from performing control loop actions on.
- derived_from: tosca.policies.Root
- properties:
- # Omitted for brevity, see Section 1
-
- onap.policies.controlloop.guard.common.MinMax:
- version: 1.0.0
- description: Supports Min/Max number of VF Modules
- derived_from: onap.policies.controlloop.Guard
- properties:
- # Omitted for brevity, see Section 1
-
- onap.policies.controlloop.guard.common.MinMax:
- version: 2.0.0
- description: Supports Min/Max number of VF Modules
- derived_from: onap.policies.controlloop.Guard
- properties:
- # Omitted for brevity, see Section 1
-
-data_types:
- # Any bespoke data types referenced by policy type definitions[]
diff --git a/src/test/resources/http-cache/example/policy/api/v1/policytypes/.header b/src/test/resources/http-cache/example/policy/api/v1/policytypes/.header
deleted file mode 100644
index b11784a21..000000000
--- a/src/test/resources/http-cache/example/policy/api/v1/policytypes/.header
+++ /dev/null
@@ -1 +0,0 @@
-{"Transfer-Encoding": "chunked", "Server": "Jetty(9.3.21.v20170918)", "Content-Type": "application/json", "X-ECOMP-RequestID": "e2ddb3c8-994f-47df-b4dc-097d4fb55c08"} \ No newline at end of file
diff --git a/src/test/resources/http-cache/example/policy/api/v1/policytypes/onap.policies.Naming/versions/1.0.0/.file b/src/test/resources/http-cache/example/policy/api/v1/policytypes/onap.policies.Naming/versions/1.0.0/.file
deleted file mode 100644
index a00692971..000000000
--- a/src/test/resources/http-cache/example/policy/api/v1/policytypes/onap.policies.Naming/versions/1.0.0/.file
+++ /dev/null
@@ -1,101 +0,0 @@
-tosca_definitions_version: tosca_simple_yaml_1_1_0
-policy_types:
- onap.policies.Naming:
- derived_from: tosca.policies.Root
- version: 1.0.0
- name: onap.policies.Naming
- description: Virtual policy node for naming
- properties:
- policy-instance-name:
- type: string
- naming-models:
- type: list
- entry_schema:
- type: policy.data.naming-model-entity
-data_types:
- policy.data.naming-model-entity:
- derived_from: tosca.datatypes.Root
- properties:
- nfRole:
- type: string
- required: false
- metadata:
- matchable: true
- naming-type:
- type: string
- required: true
- metadata:
- matchable: true
- naming-recipe:
- type: string
- required: true
- name-operation:
- type: string
- required: false
- naming-properties:
- type: list
- required: true
- entry_schema:
- type: policy.data.naming-property
- policy.data.naming-property:
- derived_from: tosca.datatypes.Root
- properties:
- property-name:
- type: string
- required: true
- metadata:
- matchable: true
- property-value:
- type: string
- required: false
- property-operation:
- type: string
- required: false
- source-system:
- type: string
- required: false
- source-endpoint:
- type: string
- required: false
- increment-sequence:
- type: policy.data.increment-sequence
- required: false
- policy.data.increment-sequence:
- derived_from: tosca.datatypes.Root
- properties:
- scope:
- type: list
- required: true
- entry_schema:
- type: string
- constraints:
- - valid_values:
- - CLOUD_REGION_ID
- - LOCATION_CLLI
- - VNF
- - VM
- - VFMODULE
- - PRECEEDING
- - TRAILING
- - ENTIRETY
- sequence-type:
- type: string
- require: true
- entry_schema:
- type: string
- constraints:
- - valid_values:
- - numeric
- - alpha-numeric
- start-value:
- type: string
- required: true
- max:
- type: string
- required: false
- increment:
- type: string
- required: true
- length:
- type: string
- required: true \ No newline at end of file
diff --git a/src/test/resources/http-cache/example/policy/api/v1/policytypes/onap.policies.Naming/versions/1.0.0/.header b/src/test/resources/http-cache/example/policy/api/v1/policytypes/onap.policies.Naming/versions/1.0.0/.header
deleted file mode 100644
index b11784a21..000000000
--- a/src/test/resources/http-cache/example/policy/api/v1/policytypes/onap.policies.Naming/versions/1.0.0/.header
+++ /dev/null
@@ -1 +0,0 @@
-{"Transfer-Encoding": "chunked", "Server": "Jetty(9.3.21.v20170918)", "Content-Type": "application/json", "X-ECOMP-RequestID": "e2ddb3c8-994f-47df-b4dc-097d4fb55c08"} \ No newline at end of file
diff --git a/src/test/resources/http-cache/example/policy/api/v1/policytypes/onap.policies.controlloop.guard.common.Blacklist/versions/1.0.0/.file b/src/test/resources/http-cache/example/policy/api/v1/policytypes/onap.policies.controlloop.guard.common.Blacklist/versions/1.0.0/.file
deleted file mode 100644
index 79e79f0fe..000000000
--- a/src/test/resources/http-cache/example/policy/api/v1/policytypes/onap.policies.controlloop.guard.common.Blacklist/versions/1.0.0/.file
+++ /dev/null
@@ -1,38 +0,0 @@
-tosca_definitions_version: tosca_simple_yaml_1_1_0
-policy_types:
- onap.policies.controlloop.guard.Common:
- derived_from: tosca.policies.Root
- version: 1.0.0
- description: |
- This is the base Policy Type for Guard policies that guard the execution of Operational
- Policies.
- properties:
- actor:
- type: string
- description: Specifies the Actor the guard applies to.
- required: true
- operation:
- type: string
- description: Specified the operation that the actor is performing the guard applies to.
- required: true
- timeRange:
- type: tosca.datatypes.TimeInterval
- description: |
- An optional range of time during the day the guard policy is valid for.
- required: false
- id:
- type: string
- description: The Control Loop id this applies to.
- required: false
- onap.policies.controlloop.guard.common.Blacklist:
- derived_from: onap.policies.controlloop.guard.Common
- type_version: 1.0.0
- version: 1.0.0
- description: Supports blacklist of entity id's from performing control loop actions on.
- properties:
- blacklist:
- type: list
- description: List of entity id's
- required: true
- entry_schema:
- type: string \ No newline at end of file
diff --git a/src/test/resources/http-cache/example/policy/api/v1/policytypes/onap.policies.controlloop.guard.common.Blacklist/versions/1.0.0/.header b/src/test/resources/http-cache/example/policy/api/v1/policytypes/onap.policies.controlloop.guard.common.Blacklist/versions/1.0.0/.header
deleted file mode 100644
index b11784a21..000000000
--- a/src/test/resources/http-cache/example/policy/api/v1/policytypes/onap.policies.controlloop.guard.common.Blacklist/versions/1.0.0/.header
+++ /dev/null
@@ -1 +0,0 @@
-{"Transfer-Encoding": "chunked", "Server": "Jetty(9.3.21.v20170918)", "Content-Type": "application/json", "X-ECOMP-RequestID": "e2ddb3c8-994f-47df-b4dc-097d4fb55c08"} \ No newline at end of file
diff --git a/src/test/resources/http-cache/example/policy/api/v1/policytypes/onap.policies.controlloop.guard.common.FrequencyLimiter/versions/1.0.0/.file b/src/test/resources/http-cache/example/policy/api/v1/policytypes/onap.policies.controlloop.guard.common.FrequencyLimiter/versions/1.0.0/.file
deleted file mode 100644
index 163027e46..000000000
--- a/src/test/resources/http-cache/example/policy/api/v1/policytypes/onap.policies.controlloop.guard.common.FrequencyLimiter/versions/1.0.0/.file
+++ /dev/null
@@ -1,47 +0,0 @@
-tosca_definitions_version: tosca_simple_yaml_1_1_0
-policy_types:
- onap.policies.controlloop.guard.Common:
- derived_from: tosca.policies.Root
- version: 1.0.0
- description: |
- This is the base Policy Type for Guard policies that guard the execution of Operational
- Policies.
- properties:
- actor:
- type: string
- description: Specifies the Actor the guard applies to.
- required: true
- operation:
- type: string
- description: Specified the operation that the actor is performing the guard applies to.
- required: true
- timeRange:
- type: tosca.datatypes.TimeInterval
- description: |
- An optional range of time during the day the guard policy is valid for.
- required: false
- id:
- type: string
- description: The Control Loop id this applies to.
- required: false
- onap.policies.controlloop.guard.common.FrequencyLimiter:
- derived_from: onap.policies.controlloop.guard.Common
- type_version: 1.0.0
- version: 1.0.0
- description: Supports limiting the frequency of actions being taken by a Actor.
- properties:
- timeWindow:
- type: integer
- description: The time window to count the actions against.
- required: true
- timeUnits:
- type: string
- description: The units of time the window is counting.
- constraints:
- - valid_values: ["second", "minute", "hour", "day", "week", "month", "year"]
- limit:
- type: integer
- description: The limit
- required: true
- constraints:
- - greater_than: 0 \ No newline at end of file
diff --git a/src/test/resources/http-cache/example/policy/api/v1/policytypes/onap.policies.controlloop.guard.common.FrequencyLimiter/versions/1.0.0/.header b/src/test/resources/http-cache/example/policy/api/v1/policytypes/onap.policies.controlloop.guard.common.FrequencyLimiter/versions/1.0.0/.header
deleted file mode 100644
index b11784a21..000000000
--- a/src/test/resources/http-cache/example/policy/api/v1/policytypes/onap.policies.controlloop.guard.common.FrequencyLimiter/versions/1.0.0/.header
+++ /dev/null
@@ -1 +0,0 @@
-{"Transfer-Encoding": "chunked", "Server": "Jetty(9.3.21.v20170918)", "Content-Type": "application/json", "X-ECOMP-RequestID": "e2ddb3c8-994f-47df-b4dc-097d4fb55c08"} \ No newline at end of file
diff --git a/src/test/resources/http-cache/example/policy/api/v1/policytypes/onap.policies.controlloop.guard.common.MinMax/versions/1.0.0/.file b/src/test/resources/http-cache/example/policy/api/v1/policytypes/onap.policies.controlloop.guard.common.MinMax/versions/1.0.0/.file
deleted file mode 100644
index 778efae9e..000000000
--- a/src/test/resources/http-cache/example/policy/api/v1/policytypes/onap.policies.controlloop.guard.common.MinMax/versions/1.0.0/.file
+++ /dev/null
@@ -1,80 +0,0 @@
-{
- "tosca_definitions_version": "tosca_simple_yaml_1_1_0",
- "policy_types": {
- "onap.policies.controlloop.guard.Common": {
- "properties": {
- "id": {
- "name": "id",
- "type": "string",
- "typeVersion": "0.0.0",
- "description": "The Control Loop id this applies to.",
- "required": false,
- "constraints": [],
- "metadata": {}
- },
- "actor": {
- "name": "actor",
- "type": "string",
- "typeVersion": "0.0.0",
- "description": "Specifies the Actor the guard applies to.",
- "required": true,
- "constraints": [],
- "metadata": {}
- },
- "operation": {
- "name": "operation",
- "type": "string",
- "typeVersion": "0.0.0",
- "description": "Specified the operation that the actor is performing the guard applies to.",
- "required": true,
- "constraints": [],
- "metadata": {}
- },
- "timeRange": {
- "name": "timeRange",
- "type": "tosca.datatypes.TimeInterval",
- "typeVersion": "0.0.0",
- "description": "An optional range of time during the day the guard policy is valid for.\n",
- "required": false,
- "constraints": [],
- "metadata": {}
- }
- },
- "name": "onap.policies.controlloop.guard.Common",
- "version": "1.0.0",
- "derived_from": "tosca.policies.Root",
- "metadata": {},
- "description": "This is the base Policy Type for Guard policies that guard the execution of Operational\nPolicies.\n"
- },
- "onap.policies.controlloop.guard.common.MinMax": {
- "properties": {
- "min": {
- "name": "min",
- "type": "integer",
- "typeVersion": "0.0.0",
- "description": "The minimum instances of this entity",
- "required": true,
- "constraints": [],
- "metadata": {}
- },
- "max": {
- "name": "max",
- "type": "integer",
- "typeVersion": "0.0.0",
- "description": "The maximum instances of this entity",
- "required": false,
- "constraints": [],
- "metadata": {}
- }
- },
- "name": "onap.policies.controlloop.guard.common.MinMax",
- "version": "1.0.0",
- "derived_from": "onap.policies.controlloop.guard.Common",
- "metadata": {},
- "description": "Supports Min/Max number of entity for scaling operations"
- }
- },
- "name": "ToscaServiceTemplateSimple",
- "version": "1.0.0",
- "metadata": {}
-} \ No newline at end of file
diff --git a/src/test/resources/http-cache/example/policy/api/v1/policytypes/onap.policies.controlloop.guard.common.MinMax/versions/1.0.0/.header b/src/test/resources/http-cache/example/policy/api/v1/policytypes/onap.policies.controlloop.guard.common.MinMax/versions/1.0.0/.header
deleted file mode 100644
index b11784a21..000000000
--- a/src/test/resources/http-cache/example/policy/api/v1/policytypes/onap.policies.controlloop.guard.common.MinMax/versions/1.0.0/.header
+++ /dev/null
@@ -1 +0,0 @@
-{"Transfer-Encoding": "chunked", "Server": "Jetty(9.3.21.v20170918)", "Content-Type": "application/json", "X-ECOMP-RequestID": "e2ddb3c8-994f-47df-b4dc-097d4fb55c08"} \ No newline at end of file
diff --git a/src/test/resources/http-cache/example/policy/api/v1/policytypes/onap.policies.controlloop.guard.common.MinMax/versions/2.0.0/.file b/src/test/resources/http-cache/example/policy/api/v1/policytypes/onap.policies.controlloop.guard.common.MinMax/versions/2.0.0/.file
deleted file mode 100644
index 78bdde746..000000000
--- a/src/test/resources/http-cache/example/policy/api/v1/policytypes/onap.policies.controlloop.guard.common.MinMax/versions/2.0.0/.file
+++ /dev/null
@@ -1,40 +0,0 @@
-tosca_definitions_version: tosca_simple_yaml_1_1_0
-policy_types:
- onap.policies.controlloop.guard.Common:
- derived_from: tosca.policies.Root
- version: 1.0.0
- description: |
- This is the base Policy Type for Guard policies that guard the execution of Operational
- Policies.
- properties:
- actor:
- type: string
- description: Specifies the Actor the guard applies to.
- required: true
- operation:
- type: string
- description: Specified the operation that the actor is performing the guard applies to.
- required: true
- timeRange:
- type: tosca.datatypes.TimeInterval
- description: |
- An optional range of time during the day the guard policy is valid for.
- required: false
- id:
- type: string
- description: The Control Loop id this applies to.
- required: false
- onap.policies.controlloop.guard.common.MinMax:
- derived_from: onap.policies.controlloop.guard.Common
- type_version: 1.0.0
- version: 1.0.0
- description: Supports Min/Max number of entity for scaling operations
- properties:
- min:
- type: integer
- required: true
- description: The minimum instances of this entity
- max:
- type: integer
- required: false
- description: The maximum instances of this entity \ No newline at end of file
diff --git a/src/test/resources/http-cache/example/policy/api/v1/policytypes/onap.policies.controlloop.guard.common.MinMax/versions/2.0.0/.header b/src/test/resources/http-cache/example/policy/api/v1/policytypes/onap.policies.controlloop.guard.common.MinMax/versions/2.0.0/.header
deleted file mode 100644
index 5464a754d..000000000
--- a/src/test/resources/http-cache/example/policy/api/v1/policytypes/onap.policies.controlloop.guard.common.MinMax/versions/2.0.0/.header
+++ /dev/null
@@ -1 +0,0 @@
-{"Transfer-Encoding": "chunked", "Server": "Jetty(9.3.21.v20170918)", "Content-Type": "application/json", "X-ECOMP-RequestID": "e2ddb3c8-994f-47df-b4dc-097d4fb55c08"} \ No newline at end of file
diff --git a/src/test/resources/http-cache/example/policy/api/v1/policytypes/onap.policies.controlloop.operational.common.Apex/versions/1.0.0/.file b/src/test/resources/http-cache/example/policy/api/v1/policytypes/onap.policies.controlloop.operational.common.Apex/versions/1.0.0/.file
deleted file mode 100644
index 14ae7acd8..000000000
--- a/src/test/resources/http-cache/example/policy/api/v1/policytypes/onap.policies.controlloop.operational.common.Apex/versions/1.0.0/.file
+++ /dev/null
@@ -1,360 +0,0 @@
-tosca_definitions_version: tosca_simple_yaml_1_1_0
-policy_types:
- onap.policies.controlloop.operational.Common:
- properties:
- abatement:
- name: abatement
- type: boolean
- typeVersion: 0.0.0
- description: Whether an abatement event message will be expected for
- the control loop from DCAE.
- default: 'false'
- required: true
- constraints: [
- ]
- metadata: {
- }
- operations:
- name: operations
- type: list
- typeVersion: 0.0.0
- description: List of operations to be performed when Control Loop
- is triggered.
- required: true
- constraints: [
- ]
- entry_schema:
- type: onap.datatype.controlloop.Operation
- typeVersion: 0.0.0
- constraints: [
- ]
- metadata: {
- }
- trigger:
- name: trigger
- type: string
- typeVersion: 0.0.0
- description: Initial operation to execute upon receiving an Onset
- event message for the Control Loop.
- required: true
- constraints: [
- ]
- metadata: {
- }
- timeout:
- name: timeout
- type: integer
- typeVersion: 0.0.0
- description: |
- Overall timeout for executing all the operations. This timeout should equal or exceed the total
- timeout for each operation listed.
- required: true
- constraints: [
- ]
- metadata: {
- }
- id:
- name: id
- type: string
- typeVersion: 0.0.0
- description: The unique control loop id.
- required: true
- constraints: [
- ]
- metadata: {
- }
- name: onap.policies.controlloop.operational.Common
- version: 1.0.0
- derived_from: tosca.policies.Root
- metadata: {
- }
- description: |
- Operational Policy for Control Loop execution. Originated in Frankfurt to support TOSCA Compliant
- Policy Types. This does NOT support the legacy Policy YAML policy type.
- onap.policies.controlloop.operational.common.Apex:
- properties:
- engineServiceParameters:
- name: engineServiceParameters
- type: string
- typeVersion: 0.0.0
- description: The engine parameters like name, instanceCount, policy
- implementation, parameters etc.
- required: true
- constraints: [
- ]
- metadata: {
- }
- eventOutputParameters:
- name: eventOutputParameters
- type: string
- typeVersion: 0.0.0
- description: The event output parameters.
- required: true
- constraints: [
- ]
- metadata: {
- }
- javaProperties:
- name: javaProperties
- type: string
- typeVersion: 0.0.0
- description: Name/value pairs of properties to be set for APEX if
- needed.
- required: false
- constraints: [
- ]
- metadata: {
- }
- eventInputParameters:
- name: eventInputParameters
- type: string
- typeVersion: 0.0.0
- description: The event input parameters.
- required: true
- constraints: [
- ]
- metadata: {
- }
- name: onap.policies.controlloop.operational.common.Apex
- version: 1.0.0
- derived_from: onap.policies.controlloop.operational.Common
- metadata: {
- }
- description: Operational policies for Apex PDP
-data_types:
- onap.datatype.controlloop.Actor:
- constraints: [
- ]
- properties:
- payload:
- name: payload
- type: map
- typeVersion: 0.0.0
- description: Name/value pairs of payload information passed by Policy
- to the actor
- required: false
- constraints: [
- ]
- entry_schema:
- type: string
- typeVersion: 0.0.0
- constraints: [
- ]
- metadata:
- clamp_possible_values: ClampExecution:CDS/payload
- target:
- name: target
- type: onap.datatype.controlloop.Target
- typeVersion: 0.0.0
- description: The resource the operation should be performed on.
- required: true
- constraints: [
- ]
- metadata: {
- }
- actor:
- name: actor
- type: string
- typeVersion: 0.0.0
- description: The actor performing the operation.
- required: true
- constraints: [
- ]
- metadata:
- clamp_possible_values: Dictionary:DefaultActors,ClampExecution:CDS/actor
- operation:
- name: operation
- type: string
- typeVersion: 0.0.0
- description: The operation the actor is performing.
- required: true
- constraints: [
- ]
- metadata:
- clamp_possible_values: Dictionary:DefaultOperations, ClampExecution:CDS/operation
- name: onap.datatype.controlloop.Actor
- version: 0.0.0
- derived_from: tosca.datatypes.Root
- metadata: {
- }
- description: An actor/operation/target definition
- onap.datatype.controlloop.Operation:
- constraints: [
- ]
- properties:
- failure_retries:
- name: failure_retries
- type: string
- typeVersion: 0.0.0
- description: Points to the operation to invoke when the current operation
- has exceeded its max retries.
- default: final_failure_retries
- required: false
- constraints: [
- ]
- metadata: {
- }
- id:
- name: id
- type: string
- typeVersion: 0.0.0
- description: Unique identifier for the operation
- required: true
- constraints: [
- ]
- metadata: {
- }
- failure_timeout:
- name: failure_timeout
- type: string
- typeVersion: 0.0.0
- description: Points to the operation to invoke when the time out for
- the operation occurs.
- default: final_failure_timeout
- required: false
- constraints: [
- ]
- metadata: {
- }
- failure:
- name: failure
- type: string
- typeVersion: 0.0.0
- description: Points to the operation to invoke on Actor operation
- failure.
- default: final_failure
- required: false
- constraints: [
- ]
- metadata: {
- }
- operation:
- name: operation
- type: onap.datatype.controlloop.Actor
- typeVersion: 0.0.0
- description: The definition of the operation to be performed.
- required: true
- constraints: [
- ]
- metadata: {
- }
- failure_guard:
- name: failure_guard
- type: string
- typeVersion: 0.0.0
- description: Points to the operation to invoke when the current operation
- is blocked due to guard policy enforcement.
- default: final_failure_guard
- required: false
- constraints: [
- ]
- metadata: {
- }
- retries:
- name: retries
- type: integer
- typeVersion: 0.0.0
- description: The number of retries the actor should attempt to perform
- the operation.
- default: '0'
- required: true
- constraints: [
- ]
- metadata: {
- }
- timeout:
- name: timeout
- type: integer
- typeVersion: 0.0.0
- description: The amount of time for the actor to perform the operation.
- required: true
- constraints: [
- ]
- metadata: {
- }
- failure_exception:
- name: failure_exception
- type: string
- typeVersion: 0.0.0
- description: Points to the operation to invoke when the current operation
- causes an exception.
- default: final_failure_exception
- required: false
- constraints: [
- ]
- metadata: {
- }
- description:
- name: description
- type: string
- typeVersion: 0.0.0
- description: A user-friendly description of the intent for the operation
- required: false
- constraints: [
- ]
- metadata: {
- }
- success:
- name: success
- type: string
- typeVersion: 0.0.0
- description: Points to the operation to invoke on success. A value
- of "final_success" indicates and end to the operation.
- default: final_success
- required: false
- constraints: [
- ]
- metadata: {
- }
- name: onap.datatype.controlloop.Operation
- version: 0.0.0
- derived_from: tosca.datatypes.Root
- metadata: {
- }
- description: An operation supported by an actor
- onap.datatype.controlloop.Target:
- constraints: [
- ]
- properties:
- entityIds:
- name: entityIds
- type: map
- typeVersion: 0.0.0
- description: |
- Map of values that identify the resource. If none are provided, it is assumed that the
- entity that generated the ONSET event will be the target.
- required: false
- constraints: [
- ]
- entry_schema:
- type: string
- typeVersion: 0.0.0
- constraints: [
- ]
- metadata:
- clamp_possible_values: ClampExecution:CSAR_RESOURCES
- targetType:
- name: targetType
- type: string
- typeVersion: 0.0.0
- description: Category for the target type
- required: true
- constraints:
- - valid_values:
- - VNF
- - VM
- - VFMODULE
- - PNF
- metadata: {
- }
- name: onap.datatype.controlloop.Target
- version: 0.0.0
- derived_from: tosca.datatypes.Root
- metadata: {
- }
- description: Definition for a entity in A&AI to perform a control loop operation
- on
-name: ToscaServiceTemplateSimple
-version: 1.0.0
-metadata: {
- }
diff --git a/src/test/resources/http-cache/example/policy/api/v1/policytypes/onap.policies.controlloop.operational.common.Apex/versions/1.0.0/.header b/src/test/resources/http-cache/example/policy/api/v1/policytypes/onap.policies.controlloop.operational.common.Apex/versions/1.0.0/.header
deleted file mode 100644
index b11784a21..000000000
--- a/src/test/resources/http-cache/example/policy/api/v1/policytypes/onap.policies.controlloop.operational.common.Apex/versions/1.0.0/.header
+++ /dev/null
@@ -1 +0,0 @@
-{"Transfer-Encoding": "chunked", "Server": "Jetty(9.3.21.v20170918)", "Content-Type": "application/json", "X-ECOMP-RequestID": "e2ddb3c8-994f-47df-b4dc-097d4fb55c08"} \ No newline at end of file
diff --git a/src/test/resources/http-cache/example/policy/api/v1/policytypes/onap.policies.controlloop.operational.common.Drools/versions/1.0.0/.file b/src/test/resources/http-cache/example/policy/api/v1/policytypes/onap.policies.controlloop.operational.common.Drools/versions/1.0.0/.file
deleted file mode 100644
index af7a61ef7..000000000
--- a/src/test/resources/http-cache/example/policy/api/v1/policytypes/onap.policies.controlloop.operational.common.Drools/versions/1.0.0/.file
+++ /dev/null
@@ -1,150 +0,0 @@
-tosca_definitions_version: tosca_simple_yaml_1_1_0
-policy_types:
- onap.policies.controlloop.operational.common.Drools:
- derived_from: onap.policies.controlloop.operational.Common
- type_version: 1.0.0
- version: 1.0.0
- description: Operational policies for Drools PDP
- properties:
- controllerName:
- type: string
- description: Drools controller properties
- required: false
- onap.policies.controlloop.operational.Common:
- derived_from: tosca.policies.Root
- version: 1.0.0
- description: |
- Operational Policy for Control Loop execution. Originated in Frankfurt to support TOSCA Compliant
- Policy Types. This does NOT support the legacy Policy YAML policy type.
- properties:
- id:
- type: string
- description: The unique control loop id.
- required: true
- timeout:
- type: integer
- description: |
- Overall timeout for executing all the operations. This timeout should equal or exceed the total
- timeout for each operation listed.
- required: true
- abatement:
- type: boolean
- description: Whether an abatement event message will be expected for the control loop from DCAE.
- required: true
- default: false
- trigger:
- type: string
- description: Initial operation to execute upon receiving an Onset event message for the Control Loop.
- required: true
- operations:
- type: list
- description: List of operations to be performed when Control Loop is triggered.
- required: true
- entry_schema:
- type: onap.datatype.controlloop.Operation
-data_types:
- onap.datatype.controlloop.Target:
- derived_from: tosca.datatypes.Root
- description: Definition for a entity in A&AI to perform a control loop operation on
- properties:
- targetType:
- type: string
- description: Category for the target type
- required: true
- constraints:
- - valid_values: [VNF, VM, VFMODULE, PNF]
- entityIds:
- type: map
- description: |
- Map of values that identify the resource. If none are provided, it is assumed that the
- entity that generated the ONSET event will be the target.
- required: false
- metadata:
- clamp_possible_values: ClampExecution:CSAR_RESOURCES
- entry_schema:
- type: string
-
- onap.datatype.controlloop.Actor:
- derived_from: tosca.datatypes.Root
- description: An actor/operation/target definition
- properties:
- actor:
- type: string
- description: The actor performing the operation.
- required: true
- metadata:
- clamp_possible_values: Dictionary:DefaultActors,ClampExecution:CDS/actor
- operation:
- type: string
- description: The operation the actor is performing.
- required: true
- metadata:
- clamp_possible_values: Dictionary:DefaultOperations, ClampExecution:CDS/operations
- target:
- type: onap.datatype.controlloop.Target
- description: The resource the operation should be performed on.
- required: true
- payload:
- type: map
- description: Name/value pairs of payload information passed by Policy to the actor
- required: false
- metadata:
- clamp_possible_values: ClampExecution:CDS/payload
- entry_schema:
- type: string
-
- onap.datatype.controlloop.Operation:
- derived_from: tosca.datatypes.Root
- description: An operation supported by an actor
- properties:
- id:
- type: string
- description: Unique identifier for the operation
- required: true
- description:
- type: string
- description: A user-friendly description of the intent for the operation
- required: false
- operation:
- type: onap.datatype.controlloop.Actor
- description: The definition of the operation to be performed.
- required: true
- timeout:
- type: integer
- description: The amount of time for the actor to perform the operation.
- required: true
- retries:
- type: integer
- description: The number of retries the actor should attempt to perform the operation.
- required: true
- default: 0
- success:
- type: string
- description: Points to the operation to invoke on success. A value of "final_success" indicates and end to the operation.
- required: false
- default: final_success
- failure:
- type: string
- description: Points to the operation to invoke on Actor operation failure.
- required: false
- default: final_failure
- failure_timeout:
- type: string
- description: Points to the operation to invoke when the time out for the operation occurs.
- required: false
- default: final_failure_timeout
- failure_retries:
- type: string
- description: Points to the operation to invoke when the current operation has exceeded its max retries.
- required: false
- default: final_failure_retries
- failure_exception:
- type: string
- description: Points to the operation to invoke when the current operation causes an exception.
- required: false
- default: final_failure_exception
- failure_guard:
- type: string
- description: Points to the operation to invoke when the current operation is blocked due to guard policy enforcement.
- required: false
- default: final_failure_guard \ No newline at end of file
diff --git a/src/test/resources/http-cache/example/policy/api/v1/policytypes/onap.policies.controlloop.operational.common.Drools/versions/1.0.0/.header b/src/test/resources/http-cache/example/policy/api/v1/policytypes/onap.policies.controlloop.operational.common.Drools/versions/1.0.0/.header
deleted file mode 100644
index b11784a21..000000000
--- a/src/test/resources/http-cache/example/policy/api/v1/policytypes/onap.policies.controlloop.operational.common.Drools/versions/1.0.0/.header
+++ /dev/null
@@ -1 +0,0 @@
-{"Transfer-Encoding": "chunked", "Server": "Jetty(9.3.21.v20170918)", "Content-Type": "application/json", "X-ECOMP-RequestID": "e2ddb3c8-994f-47df-b4dc-097d4fb55c08"} \ No newline at end of file
diff --git a/src/test/resources/http-cache/example/policy/api/v1/policytypes/onap.policies.monitoring.cdap.tca.hi.lo.app/versions/1.0.0/.file b/src/test/resources/http-cache/example/policy/api/v1/policytypes/onap.policies.monitoring.cdap.tca.hi.lo.app/versions/1.0.0/.file
deleted file mode 100644
index 3c17c9004..000000000
--- a/src/test/resources/http-cache/example/policy/api/v1/policytypes/onap.policies.monitoring.cdap.tca.hi.lo.app/versions/1.0.0/.file
+++ /dev/null
@@ -1,158 +0,0 @@
-tosca_definitions_version: tosca_simple_yaml_1_1_0
-policy_types:
- onap.policies.Monitoring:
- derived_from: tosca.policies.Root
- version: 1.0.0
- description: a base policy type for all policies that govern monitoring provisioning
- onap.policies.monitoring.cdap.tca.hi.lo.app:
- derived_from: onap.policies.Monitoring
- version: 1.0.0
- properties:
- tca_policy:
- type: onap.datatypes.monitoring.tca_policy
- description: TCA Policy JSON
- required: true
-data_types:
- onap.datatypes.monitoring.metricsPerEventName:
- derived_from: tosca.datatypes.Root
- properties:
- controlLoopSchemaType:
- type: string
- required: true
- description: Specifies Control Loop Schema Type for the event Name e.g. VNF, VM
- constraints:
- - valid_values:
- - VM
- - VNF
- eventName:
- type: string
- required: true
- description: Event name to which thresholds need to be applied
- policyName:
- type: string
- required: true
- description: TCA Policy Scope Name
- policyScope:
- type: string
- required: true
- description: TCA Policy Scope
- policyVersion:
- type: string
- required: true
- description: TCA Policy Scope Version
- thresholds:
- type: list
- required: true
- description: Thresholds associated with eventName
- entry_schema:
- type: onap.datatypes.monitoring.thresholds
- onap.datatypes.monitoring.tca_policy:
- derived_from: tosca.datatypes.Root
- properties:
- domain:
- type: string
- required: true
- description: Domain name to which TCA needs to be applied
- default: measurementsForVfScaling
- constraints:
- - equal: measurementsForVfScaling
- metricsPerEventName:
- type: list
- required: true
- description: Contains eventName and threshold details that need to be applied to given eventName
- entry_schema:
- type: onap.datatypes.monitoring.metricsPerEventName
- onap.datatypes.monitoring.thresholds:
- derived_from: tosca.datatypes.Root
- properties:
- closedLoopControlName:
- type: string
- required: true
- description: Closed Loop Control Name associated with the threshold
- closedLoopEventStatus:
- type: string
- required: true
- description: Closed Loop Event Status of the threshold
- constraints:
- - valid_values:
- - ONSET
- - ABATED
- direction:
- type: string
- required: true
- description: Direction of the threshold
- constraints:
- - valid_values:
- - LESS
- - LESS_OR_EQUAL
- - GREATER
- - GREATER_OR_EQUAL
- - EQUAL
- fieldPath:
- type: string
- required: true
- description: Json field Path as per CEF message which needs to be analyzed for TCA
- constraints:
- - valid_values:
- - $.event.measurementsForVfScalingFields.vNicPerformanceArray[*].receivedTotalPacketsDelta
- - $.event.measurementsForVfScalingFields.vNicPerformanceArray[*].receivedOctetsDelta
- - $.event.measurementsForVfScalingFields.vNicPerformanceArray[*].receivedUnicastPacketsDelta
- - $.event.measurementsForVfScalingFields.vNicPerformanceArray[*].receivedMulticastPacketsDelta
- - $.event.measurementsForVfScalingFields.vNicPerformanceArray[*].receivedBroadcastPacketsDelta
- - $.event.measurementsForVfScalingFields.vNicPerformanceArray[*].receivedDiscardedPacketsDelta
- - $.event.measurementsForVfScalingFields.vNicPerformanceArray[*].receivedErrorPacketsDelta
- - $.event.measurementsForVfScalingFields.vNicPerformanceArray[*].receivedTotalPacketsAccumulated
- - $.event.measurementsForVfScalingFields.vNicPerformanceArray[*].receivedOctetsAccumulated
- - $.event.measurementsForVfScalingFields.vNicPerformanceArray[*].receivedUnicastPacketsAccumulated
- - $.event.measurementsForVfScalingFields.vNicPerformanceArray[*].receivedMulticastPacketsAccumulated
- - $.event.measurementsForVfScalingFields.vNicPerformanceArray[*].receivedBroadcastPacketsAccumulated
- - $.event.measurementsForVfScalingFields.vNicPerformanceArray[*].receivedDiscardedPacketsAccumulated
- - $.event.measurementsForVfScalingFields.vNicPerformanceArray[*].receivedErrorPacketsAccumulated
- - $.event.measurementsForVfScalingFields.vNicPerformanceArray[*].transmittedTotalPacketsDelta
- - $.event.measurementsForVfScalingFields.vNicPerformanceArray[*].transmittedOctetsDelta
- - $.event.measurementsForVfScalingFields.vNicPerformanceArray[*].transmittedUnicastPacketsDelta
- - $.event.measurementsForVfScalingFields.vNicPerformanceArray[*].transmittedMulticastPacketsDelta
- - $.event.measurementsForVfScalingFields.vNicPerformanceArray[*].transmittedBroadcastPacketsDelta
- - $.event.measurementsForVfScalingFields.vNicPerformanceArray[*].transmittedDiscardedPacketsDelta
- - $.event.measurementsForVfScalingFields.vNicPerformanceArray[*].transmittedErrorPacketsDelta
- - $.event.measurementsForVfScalingFields.vNicPerformanceArray[*].transmittedTotalPacketsAccumulated
- - $.event.measurementsForVfScalingFields.vNicPerformanceArray[*].transmittedOctetsAccumulated
- - $.event.measurementsForVfScalingFields.vNicPerformanceArray[*].transmittedUnicastPacketsAccumulated
- - $.event.measurementsForVfScalingFields.vNicPerformanceArray[*].transmittedMulticastPacketsAccumulated
- - $.event.measurementsForVfScalingFields.vNicPerformanceArray[*].transmittedBroadcastPacketsAccumulated
- - $.event.measurementsForVfScalingFields.vNicPerformanceArray[*].transmittedDiscardedPacketsAccumulated
- - $.event.measurementsForVfScalingFields.vNicPerformanceArray[*].transmittedErrorPacketsAccumulated
- - $.event.measurementsForVfScalingFields.cpuUsageArray[*].cpuIdle
- - $.event.measurementsForVfScalingFields.cpuUsageArray[*].cpuUsageInterrupt
- - $.event.measurementsForVfScalingFields.cpuUsageArray[*].cpuUsageNice
- - $.event.measurementsForVfScalingFields.cpuUsageArray[*].cpuUsageSoftIrq
- - $.event.measurementsForVfScalingFields.cpuUsageArray[*].cpuUsageSteal
- - $.event.measurementsForVfScalingFields.cpuUsageArray[*].cpuUsageSystem
- - $.event.measurementsForVfScalingFields.cpuUsageArray[*].cpuWait
- - $.event.measurementsForVfScalingFields.cpuUsageArray[*].percentUsage
- - $.event.measurementsForVfScalingFields.meanRequestLatency
- - $.event.measurementsForVfScalingFields.memoryUsageArray[*].memoryBuffered
- - $.event.measurementsForVfScalingFields.memoryUsageArray[*].memoryCached
- - $.event.measurementsForVfScalingFields.memoryUsageArray[*].memoryConfigured
- - $.event.measurementsForVfScalingFields.memoryUsageArray[*].memoryFree
- - $.event.measurementsForVfScalingFields.memoryUsageArray[*].memoryUsed
- - $.event.measurementsForVfScalingFields.additionalMeasurements[*].arrayOfFields[0].value
- severity:
- type: string
- required: true
- description: Threshold Event Severity
- constraints:
- - valid_values:
- - CRITICAL
- - MAJOR
- - MINOR
- - WARNING
- - NORMAL
- thresholdValue:
- type: integer
- required: true
- description: Threshold value for the field Path inside CEF message
- version:
- type: string
- required: true
- description: Version number associated with the threshold \ No newline at end of file
diff --git a/src/test/resources/http-cache/example/policy/api/v1/policytypes/onap.policies.monitoring.cdap.tca.hi.lo.app/versions/1.0.0/.header b/src/test/resources/http-cache/example/policy/api/v1/policytypes/onap.policies.monitoring.cdap.tca.hi.lo.app/versions/1.0.0/.header
deleted file mode 100644
index b11784a21..000000000
--- a/src/test/resources/http-cache/example/policy/api/v1/policytypes/onap.policies.monitoring.cdap.tca.hi.lo.app/versions/1.0.0/.header
+++ /dev/null
@@ -1 +0,0 @@
-{"Transfer-Encoding": "chunked", "Server": "Jetty(9.3.21.v20170918)", "Content-Type": "application/json", "X-ECOMP-RequestID": "e2ddb3c8-994f-47df-b4dc-097d4fb55c08"} \ No newline at end of file
diff --git a/src/test/resources/http-cache/example/policy/api/v1/policytypes/onap.policies.monitoring.tcagen2/versions/1.0.0/.file b/src/test/resources/http-cache/example/policy/api/v1/policytypes/onap.policies.monitoring.tcagen2/versions/1.0.0/.file
deleted file mode 100644
index 367d2b5a4..000000000
--- a/src/test/resources/http-cache/example/policy/api/v1/policytypes/onap.policies.monitoring.tcagen2/versions/1.0.0/.file
+++ /dev/null
@@ -1,160 +0,0 @@
-tosca_definitions_version: tosca_simple_yaml_1_1_0
-policy_types:
- onap.policies.Monitoring:
- derived_from: tosca.policies.Root
- version: 1.0.0
- name: onap.policies.Monitoring
- description: a base policy type for all policies that govern monitoring provisioning
- onap.policies.monitoring.tcagen2:
- derived_from: onap.policies.Monitoring
- version: 1.0.0
- name: onap.policies.monitoring.tcagen2
- properties:
- tca.policy:
- type: onap.datatypes.monitoring.tca_policy
- description: TCA Policy JSON
- required: true
-data_types:
- onap.datatypes.monitoring.metricsPerEventName:
- derived_from: tosca.datatypes.Root
- properties:
- controlLoopSchemaType:
- type: string
- required: true
- description: Specifies Control Loop Schema Type for the event Name e.g. VNF, VM
- constraints:
- - valid_values:
- - VM
- - VNF
- eventName:
- type: string
- required: true
- description: Event name to which thresholds need to be applied
- policyName:
- type: string
- required: true
- description: TCA Policy Scope Name
- policyScope:
- type: string
- required: true
- description: TCA Policy Scope
- policyVersion:
- type: string
- required: true
- description: TCA Policy Scope Version
- thresholds:
- type: list
- required: true
- description: Thresholds associated with eventName
- entry_schema:
- type: onap.datatypes.monitoring.thresholds
- onap.datatypes.monitoring.tca_policy:
- derived_from: tosca.datatypes.Root
- properties:
- domain:
- type: string
- required: true
- description: Domain name to which TCA needs to be applied
- default: measurementsForVfScaling
- constraints:
- - equal: measurementsForVfScaling
- metricsPerEventName:
- type: list
- required: true
- description: Contains eventName and threshold details that need to be applied to given eventName
- entry_schema:
- type: onap.datatypes.monitoring.metricsPerEventName
- onap.datatypes.monitoring.thresholds:
- derived_from: tosca.datatypes.Root
- properties:
- closedLoopControlName:
- type: string
- required: true
- description: Closed Loop Control Name associated with the threshold
- closedLoopEventStatus:
- type: string
- required: true
- description: Closed Loop Event Status of the threshold
- constraints:
- - valid_values:
- - ONSET
- - ABATED
- direction:
- type: string
- required: true
- description: Direction of the threshold
- constraints:
- - valid_values:
- - LESS
- - LESS_OR_EQUAL
- - GREATER
- - GREATER_OR_EQUAL
- - EQUAL
- fieldPath:
- type: string
- required: true
- description: Json field Path as per CEF message which needs to be analyzed for TCA
- constraints:
- - valid_values:
- - $.event.measurementsForVfScalingFields.vNicPerformanceArray[*].receivedTotalPacketsDelta
- - $.event.measurementsForVfScalingFields.vNicPerformanceArray[*].receivedOctetsDelta
- - $.event.measurementsForVfScalingFields.vNicPerformanceArray[*].receivedUnicastPacketsDelta
- - $.event.measurementsForVfScalingFields.vNicPerformanceArray[*].receivedMulticastPacketsDelta
- - $.event.measurementsForVfScalingFields.vNicPerformanceArray[*].receivedBroadcastPacketsDelta
- - $.event.measurementsForVfScalingFields.vNicPerformanceArray[*].receivedDiscardedPacketsDelta
- - $.event.measurementsForVfScalingFields.vNicPerformanceArray[*].receivedErrorPacketsDelta
- - $.event.measurementsForVfScalingFields.vNicPerformanceArray[*].receivedTotalPacketsAccumulated
- - $.event.measurementsForVfScalingFields.vNicPerformanceArray[*].receivedOctetsAccumulated
- - $.event.measurementsForVfScalingFields.vNicPerformanceArray[*].receivedUnicastPacketsAccumulated
- - $.event.measurementsForVfScalingFields.vNicPerformanceArray[*].receivedMulticastPacketsAccumulated
- - $.event.measurementsForVfScalingFields.vNicPerformanceArray[*].receivedBroadcastPacketsAccumulated
- - $.event.measurementsForVfScalingFields.vNicPerformanceArray[*].receivedDiscardedPacketsAccumulated
- - $.event.measurementsForVfScalingFields.vNicPerformanceArray[*].receivedErrorPacketsAccumulated
- - $.event.measurementsForVfScalingFields.vNicPerformanceArray[*].transmittedTotalPacketsDelta
- - $.event.measurementsForVfScalingFields.vNicPerformanceArray[*].transmittedOctetsDelta
- - $.event.measurementsForVfScalingFields.vNicPerformanceArray[*].transmittedUnicastPacketsDelta
- - $.event.measurementsForVfScalingFields.vNicPerformanceArray[*].transmittedMulticastPacketsDelta
- - $.event.measurementsForVfScalingFields.vNicPerformanceArray[*].transmittedBroadcastPacketsDelta
- - $.event.measurementsForVfScalingFields.vNicPerformanceArray[*].transmittedDiscardedPacketsDelta
- - $.event.measurementsForVfScalingFields.vNicPerformanceArray[*].transmittedErrorPacketsDelta
- - $.event.measurementsForVfScalingFields.vNicPerformanceArray[*].transmittedTotalPacketsAccumulated
- - $.event.measurementsForVfScalingFields.vNicPerformanceArray[*].transmittedOctetsAccumulated
- - $.event.measurementsForVfScalingFields.vNicPerformanceArray[*].transmittedUnicastPacketsAccumulated
- - $.event.measurementsForVfScalingFields.vNicPerformanceArray[*].transmittedMulticastPacketsAccumulated
- - $.event.measurementsForVfScalingFields.vNicPerformanceArray[*].transmittedBroadcastPacketsAccumulated
- - $.event.measurementsForVfScalingFields.vNicPerformanceArray[*].transmittedDiscardedPacketsAccumulated
- - $.event.measurementsForVfScalingFields.vNicPerformanceArray[*].transmittedErrorPacketsAccumulated
- - $.event.measurementsForVfScalingFields.cpuUsageArray[*].cpuIdle
- - $.event.measurementsForVfScalingFields.cpuUsageArray[*].cpuUsageInterrupt
- - $.event.measurementsForVfScalingFields.cpuUsageArray[*].cpuUsageNice
- - $.event.measurementsForVfScalingFields.cpuUsageArray[*].cpuUsageSoftIrq
- - $.event.measurementsForVfScalingFields.cpuUsageArray[*].cpuUsageSteal
- - $.event.measurementsForVfScalingFields.cpuUsageArray[*].cpuUsageSystem
- - $.event.measurementsForVfScalingFields.cpuUsageArray[*].cpuWait
- - $.event.measurementsForVfScalingFields.cpuUsageArray[*].percentUsage
- - $.event.measurementsForVfScalingFields.meanRequestLatency
- - $.event.measurementsForVfScalingFields.memoryUsageArray[*].memoryBuffered
- - $.event.measurementsForVfScalingFields.memoryUsageArray[*].memoryCached
- - $.event.measurementsForVfScalingFields.memoryUsageArray[*].memoryConfigured
- - $.event.measurementsForVfScalingFields.memoryUsageArray[*].memoryFree
- - $.event.measurementsForVfScalingFields.memoryUsageArray[*].memoryUsed
- - $.event.measurementsForVfScalingFields.additionalMeasurements[*].arrayOfFields[0].value
- severity:
- type: string
- required: true
- description: Threshold Event Severity
- constraints:
- - valid_values:
- - CRITICAL
- - MAJOR
- - MINOR
- - WARNING
- - NORMAL
- thresholdValue:
- type: integer
- required: true
- description: Threshold value for the field Path inside CEF message
- version:
- type: string
- required: true
- description: Version number associated with the threshold \ No newline at end of file
diff --git a/src/test/resources/http-cache/example/policy/api/v1/policytypes/onap.policies.monitoring.tcagen2/versions/1.0.0/.header b/src/test/resources/http-cache/example/policy/api/v1/policytypes/onap.policies.monitoring.tcagen2/versions/1.0.0/.header
deleted file mode 100644
index b11784a21..000000000
--- a/src/test/resources/http-cache/example/policy/api/v1/policytypes/onap.policies.monitoring.tcagen2/versions/1.0.0/.header
+++ /dev/null
@@ -1 +0,0 @@
-{"Transfer-Encoding": "chunked", "Server": "Jetty(9.3.21.v20170918)", "Content-Type": "application/json", "X-ECOMP-RequestID": "e2ddb3c8-994f-47df-b4dc-097d4fb55c08"} \ No newline at end of file
diff --git a/src/test/resources/http-cache/example/policy/pap/v1/pdps/.file b/src/test/resources/http-cache/example/policy/pap/v1/pdps/.file
deleted file mode 100644
index 467409f47..000000000
--- a/src/test/resources/http-cache/example/policy/pap/v1/pdps/.file
+++ /dev/null
@@ -1,104 +0,0 @@
-{
- "groups": [
- {
- "description": "This group should be used for managing all control loop related policies and pdps",
- "name": "controlloop",
- "pdpGroupState": "ACTIVE",
- "pdpSubgroups": [
- {
- "currentInstanceCount": 0,
- "desiredInstanceCount": 1,
- "pdpInstances": [],
- "pdpType": "apex",
- "policies": [
- {
- "name": "OPERATIONAL_vLoadBalancerMS_v1_0_Drools_1_0_0_7xd",
- "version": "1.0.0"
- }
- ],
- "properties": {},
- "supportedPolicyTypes": [
- {
- "name": "onap.policies.controlloop.Operational",
- "version": "1.0.0"
- },
- {
- "name": "onap.policies.controlloop.operational.common.*",
- "version": "1.0.0"
- }
- ]
- },
- {
- "currentInstanceCount": 0,
- "desiredInstanceCount": 1,
- "pdpInstances": [],
- "pdpType": "drools",
- "policies": [
- {
- "name": "OPERATIONAL_vLoadBalancerMS_v1_0_Drools_1_0_0_7xd",
- "version": "1.0.0"
- }
- ],
- "properties": {},
- "supportedPolicyTypes": [
- {
- "name": "onap.policies.controlloop.operational.common.*",
- "version": "1.0.0"
- },
- {
- "name": "onap.policies.controlloop.Operational",
- "version": "1.0.0"
- }
- ]
- },
- {
- "currentInstanceCount": 0,
- "desiredInstanceCount": 1,
- "pdpInstances": [],
- "pdpType": "xacml",
- "policies": [],
- "properties": {},
- "supportedPolicyTypes": [
- {
- "name": "onap.policies.controlloop.guard.common.*",
- "version": "1.0.0"
- }
- ]
- }
- ],
- "properties": {}
- },
- {
- "description": "This group should be used for managing all monitoring related policies and pdps",
- "name": "monitoring",
- "pdpGroupState": "ACTIVE",
- "pdpSubgroups": [
- {
- "currentInstanceCount": 0,
- "desiredInstanceCount": 1,
- "pdpInstances": [],
- "pdpType": "xacml",
- "policies": [
- {
- "name": "MICROSERVICE_vLoadBalancerMS_v1_0_tcagen2_1_0_0_AV0",
- "version": "1.0.0"
- }
- ],
- "properties": {},
- "supportedPolicyTypes": [
- {
- "name": "onap.policies.monitoring.*",
- "version": "1.0.0"
- },
- {
- "name": "onap.policies.Naming",
- "version": "1.0.0"
- }
-
- ]
- }
- ],
- "properties": {}
- }
- ]
-}
diff --git a/src/test/resources/http-cache/example/policy/pap/v1/pdps/.header b/src/test/resources/http-cache/example/policy/pap/v1/pdps/.header
deleted file mode 100644
index b11784a21..000000000
--- a/src/test/resources/http-cache/example/policy/pap/v1/pdps/.header
+++ /dev/null
@@ -1 +0,0 @@
-{"Transfer-Encoding": "chunked", "Server": "Jetty(9.3.21.v20170918)", "Content-Type": "application/json", "X-ECOMP-RequestID": "e2ddb3c8-994f-47df-b4dc-097d4fb55c08"} \ No newline at end of file
diff --git a/src/test/resources/http-cache/start_http_cache.sh b/src/test/resources/http-cache/start_http_cache.sh
deleted file mode 100755
index 1f84b56f5..000000000
--- a/src/test/resources/http-cache/start_http_cache.sh
+++ /dev/null
@@ -1,52 +0,0 @@
-#!/bin/bash
-###
-# ============LICENSE_START=======================================================
-# ONAP CLAMP
-# ================================================================================
-# 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============================================
-# ===================================================================
-#
-###
-
-echo "Starting HTTP CACHE python script"
-for i in "$@"
-do
-case $i in
- --python_proxyaddress=*)
- python_proxyaddress="--proxyaddress ${i#*=}"
- echo "- Using python_proxyaddress and set it to: $python_proxyaddress"
- shift # past argument=value
- ;;
- --http_proxyaddress=*)
- export http_proxy="${i#*=}"
- export https_proxy="${i#*=}"
- echo "- Defining http_proxy/https_proxy env variables to: $http_proxy"
- shift # past argument=value
- ;;
- -?|--help|-help)
- echo "Usage: $(basename $0) [--http_proxyaddress=<http://proxy_address:port>] [--python_proxyaddress=<python_simulator_address:port>]"
- echo "--http_proxyaddress Set the http_proxy/https_proxy in the script before running python"
- echo "--python_proxyaddress <python_simulator_address:port>, like localhost:8080 and will be set as --proxyaddress, this is the adress returned by DCAE simulator response"
- exit 2
- ;;
-esac
-done
-
-echo 'Installing requests packages for Python'
-pip install --no-cache-dir requests
-echo 'Executing the Http proxy in Cache mode only'
-python -u third_party_proxy.py --port 8080 --root /usr/src/http-cache-app/data-cache $python_proxyaddress
diff --git a/src/test/resources/http-cache/third_party_proxy.py b/src/test/resources/http-cache/third_party_proxy.py
deleted file mode 100755
index 7fe316852..000000000
--- a/src/test/resources/http-cache/third_party_proxy.py
+++ /dev/null
@@ -1,497 +0,0 @@
-#!/usr/bin/env python2
-###
-# ============LICENSE_START=======================================================
-# ONAP CLAMP
-# ================================================================================
-# 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============================================
-# ===================================================================
-#
-###
-
-import json
-import requests
-import os
-import errno
-import sys
-import SimpleHTTPServer
-import SocketServer
-import argparse
-import tempfile
-import signal
-import uuid
-import shutil
-
-parser = argparse.ArgumentParser(description="3rd party Cache & Replay")
-parser.add_argument("--username", "-u", type=str, help="Set the username for contacting 3rd party - only used for GET")
-parser.add_argument("--password", "-p", type=str, help="Set the password for contacting 3rd party - only used for GET")
-parser.add_argument("--root", "-r", default=tempfile.mkdtemp(), type=str, help="Root folder for the proxy cache")
-parser.add_argument("--temp", "-t", default=tempfile.mkdtemp(), type=str, help="Temp folder for the generated content")
-parser.add_argument("--proxy" , type=str, help="Url of the Act as a proxy. If not set, this script only uses the cache and will return a 404 if files aren't found")
-parser.add_argument("--port", "-P", type=int, default="8081", help="Port on which the proxy should listen to")
-parser.add_argument("--verbose", "-v", type=bool, help="Print more information in case of error")
-parser.add_argument("--proxyaddress","-a", type=str, help="Address of this proxy, generally either third-party-proxy:8085 or localhost:8085 depending if started with docker-compose or not")
-options = parser.parse_args()
-
-
-PORT = options.port
-HOST = options.proxy
-AUTH = (options.username, options.password)
-HEADERS = {'X-ECOMP-InstanceID':'CLAMP'}
-CACHE_ROOT = str(options.root)
-TMP_ROOT = str(options.temp)
-PROXY_ADDRESS=str(options.proxyaddress)
-
-def signal_handler(signal_sent, frame):
- global httpd
- if signal_sent == signal.SIGINT:
- print('Got Ctrl-C (SIGINT)')
- httpd.socket.close()
- httpd.shutdown()
- httpd.server_close()
-
-class Proxy(SimpleHTTPServer.SimpleHTTPRequestHandler):
- def print_headers(self):
- for header,value in self.headers.items():
- print("header: %s : %s" % (header, value))
-
- def check_credentials(self):
- pass
-
- def _send_content(self, header_file, content_file):
- self.send_response(200)
- with open(header_file, 'rb') as f:
- headers = json.load(f)
- for key,value in headers.items():
- if key in ('Transfer-Encoding',):
- continue
- self.send_header(key, value)
- self.end_headers()
- with open(content_file,'rb') as f:
- fc = f.read()
- self.wfile.write(fc)
-
- def _write_cache(self,cached_file_folder, header_file, content_file, response):
- os.makedirs(cached_file_folder, 0777)
- with open(content_file, 'w') as f:
- f.write(response.raw.read())
- with open(header_file, 'w') as f:
- json.dump(dict(response.raw.headers), f)
- # Entry point of the code
- def _get_cached_file_folder_name(self,folder):
- cached_file_folder = '%s/%s' % (folder, self.path,)
- print("Cached file name before escaping : %s" % cached_file_folder)
- cached_file_folder = cached_file_folder.replace('<','&#60;').replace('>','&#62;').replace('?','&#63;').replace('*','&#42;').replace('\\','&#42;').replace(':','&#58;').replace('|','&#124;')
- print("Cached file name after escaping (used for cache storage) : %s" % cached_file_folder)
- return cached_file_folder
-
- def _get_cached_content_file_name(self,cached_file_folder):
- return "%s/.file" % (cached_file_folder,)
-
- def _get_cached_header_file_name(self,cached_file_folder):
- return "%s/.header" % (cached_file_folder,)
-
- def _execute_content_generated_cases(self,http_type):
- print("Testing special cases, cache files will be sent to :" +TMP_ROOT)
- cached_file_folder = self._get_cached_file_folder_name(TMP_ROOT)
- cached_file_content = self._get_cached_content_file_name(cached_file_folder)
- cached_file_header = self._get_cached_header_file_name(cached_file_folder)
- _file_available = os.path.exists(cached_file_content)
-
- if self.path.startswith("/dcae-service-types?asdcResourceId=") and http_type == "GET":
- if not _file_available:
- print "self.path start with /dcae-service-types?asdcResourceId=, generating response json..."
- uuidGenerated = str(uuid.uuid4())
- typeId = "typeId-" + uuidGenerated
- typeName = "typeName-" + uuidGenerated
- print "typeId generated: " + typeName + " and typeName: "+ typeId
- jsonGenerated = "{\"totalCount\":1, \"items\":[{\"typeId\":\"" + typeId + "\", \"typeName\":\"" + typeName +"\"}]}"
- print "jsonGenerated: " + jsonGenerated
-
- os.makedirs(cached_file_folder, 0777)
- with open(cached_file_header, 'w') as f:
- f.write("{\"Content-Length\": \"" + str(len(jsonGenerated)) + "\", \"Content-Type\": \"application/json\"}")
- with open(cached_file_content, 'w') as f:
- f.write(jsonGenerated)
- return True
- elif self.path.startswith("/dcae-operationstatus/install") and http_type == "GET":
- if not _file_available:
- print "self.path start with /dcae-operationstatus/install, generating response json..."
- jsonGenerated = "{\"operationType\": \"install\", \"status\": \"succeeded\"}"
- print "jsonGenerated: " + jsonGenerated
-
- try:
- os.makedirs(cached_file_folder, 0777)
- except OSError as e:
- if e.errno != errno.EEXIST:
- raise
- print(cached_file_folder+" already exists")
-
- with open(cached_file_header, 'w') as f:
- f.write("{\"Content-Length\": \"" + str(len(jsonGenerated)) + "\", \"Content-Type\": \"application/json\"}")
- with open(cached_file_content, 'w') as f:
- f.write(jsonGenerated)
- return True
- elif self.path.startswith("/dcae-operationstatus/uninstall") and http_type == "GET":
- if not _file_available:
- print "self.path start with /dcae-operationstatus/uninstall, generating response json..."
- jsonGenerated = "{\"operationType\": \"uninstall\", \"status\": \"succeeded\"}"
- print "jsonGenerated: " + jsonGenerated
-
- try:
- os.makedirs(cached_file_folder, 0777)
- except OSError as e:
- if e.errno != errno.EEXIST:
- raise
- print(cached_file_folder+" already exists")
-
- with open(cached_file_header, 'w') as f:
- f.write("{\"Content-Length\": \"" + str(len(jsonGenerated)) + "\", \"Content-Type\": \"application/json\"}")
- with open(cached_file_content, 'w') as f:
- f.write(jsonGenerated)
- return True
- elif self.path.startswith("/sdc/v1/catalog/services/") and http_type == "POST":
- if not _file_available:
- print "self.path start with /sdc/v1/catalog/services/, generating response json..."
- jsondata = json.loads(self.data_string)
- jsonGenerated = "{\"artifactName\":\"" + jsondata['artifactName'] + "\",\"artifactType\":\"" + jsondata['artifactType'] + "\",\"artifactURL\":\"" + self.path + "\",\"artifactDescription\":\"" + jsondata['description'] + "\",\"artifactChecksum\":\"ZjJlMjVmMWE2M2M1OTM2MDZlODlmNTVmZmYzNjViYzM=\",\"artifactUUID\":\"" + str(uuid.uuid4()) + "\",\"artifactVersion\":\"1\"}"
- print "jsonGenerated: " + jsonGenerated
-
- os.makedirs(cached_file_folder, 0777)
- with open(cached_file_header, 'w') as f:
- f.write("{\"Content-Length\": \"" + str(len(jsonGenerated)) + "\", \"Content-Type\": \"application/json\"}")
- with open(cached_file_content, 'w') as f:
- f.write(jsonGenerated)
- return True
- elif self.path.startswith("/dcae-deployments/") and http_type == "PUT":
- print "self.path start with /dcae-deployments/ DEPLOY, generating response json..."
- #jsondata = json.loads(self.data_string)
- jsonGenerated = "{\"operationType\":\"install\",\"status\":\"processing\",\"links\":{\"status\":\"http:\/\/" + PROXY_ADDRESS + "\/dcae-operationstatus/install?test=test\"}}"
- print "jsonGenerated: " + jsonGenerated
- if not os.path.exists(cached_file_folder):
- os.makedirs(cached_file_folder, 0777)
- with open(cached_file_header, 'w+') as f:
- f.write("{\"Content-Length\": \"" + str(len(jsonGenerated)) + "\", \"Content-Type\": \"application/json\"}")
- with open(cached_file_content, 'w+') as f:
- f.write(jsonGenerated)
- return True
- elif self.path.startswith("/dcae-deployments/") and http_type == "DELETE":
- print "self.path start with /dcae-deployments/ UNDEPLOY, generating response json..."
- #jsondata = json.loads(self.data_string)
- jsonGenerated = "{\"operationType\":\"uninstall\",\"status\":\"processing\",\"links\":{\"status\":\"http:\/\/" + PROXY_ADDRESS + "\/dcae-operationstatus/uninstall?test=test\"}}"
- print "jsonGenerated: " + jsonGenerated
- if not os.path.exists(cached_file_folder):
- os.makedirs(cached_file_folder, 0777)
- with open(cached_file_header, 'w+') as f:
- f.write("{\"Content-Length\": \"" + str(len(jsonGenerated)) + "\", \"Content-Type\": \"application/json\"}")
- with open(cached_file_content, 'w+') as f:
- f.write(jsonGenerated)
- return True
- elif (self.path.startswith("/pdp/api/") and (http_type == "PUT" or http_type == "DELETE")) or (self.path.startswith("/pdp/api/policyEngineImport") and http_type == "POST"):
- print "self.path start with /pdp/api/, copying body to response ..."
- if not os.path.exists(cached_file_folder):
- os.makedirs(cached_file_folder, 0777)
- with open(cached_file_header, 'w+') as f:
- f.write("{\"Content-Length\": \"" + str(len(self.data_string)) + "\", \"Content-Type\": \""+str(self.headers['Content-Type'])+"\"}")
- with open(cached_file_content, 'w+') as f:
- f.write(self.data_string)
- return True
- elif self.path.startswith("/policy/api/v1/policytypes/") and http_type == "POST":
- print "self.path start with POST new policy API /pdp/api/, copying body to response ..."
- if not os.path.exists(cached_file_folder):
- os.makedirs(cached_file_folder, 0777)
- with open(cached_file_header, 'w+') as f:
- f.write("{\"Content-Length\": \"" + str(len(self.data_string)) + "\", \"Content-Type\": \""+str(self.headers['Content-Type'])+"\"}")
- with open(cached_file_content, 'w+') as f:
- f.write(self.data_string)
- return True
- elif self.path.startswith("/policy/api/v1/policytypes/") and http_type == "DELETE":
- print "self.path start with DELETE new policy API /policy/api/v1/policytypes/ ..."
- if not os.path.exists(cached_file_folder):
- os.makedirs(cached_file_folder, 0777)
-
- with open(cached_file_header, 'w+') as f:
- f.write("{\"Content-Length\": \"" + str(len("")) + "\", \"Content-Type\": \""+str("")+"\"}")
- with open(cached_file_content, 'w+') as f:
- f.write(self.data_string)
- return True
- elif self.path.startswith("/policy/pap/v1/pdps/policies") and http_type == "POST":
- print "self.path start with POST new policy API /policy/pap/v1/pdps/ ..."
- if not os.path.exists(cached_file_folder):
- os.makedirs(cached_file_folder, 0777)
- with open(cached_file_header, 'w+') as f:
- f.write("{\"Content-Length\": \"" + str(len("")) + "\", \"Content-Type\": \""+str("")+"\"}")
- with open(cached_file_content, 'w+') as f:
- f.write(self.data_string)
- return True
- elif (self.path.startswith("/policy/pap/v1/policies/deployed/")) and http_type == "GET":
- print "self.path start with /policy/api/v1/policytypes/, generating response json..."
- jsonGenerated = "{\"policyTypeId\": \"onap.policies.controlloop.operational\",\"policyTypeVersion\": \"1.0.0\",\"policyId\": \"OPERATIONAL_z711F_v1_0_ResourceInstanceName1_tca\"}"
- print "jsonGenerated: " + jsonGenerated
- if not os.path.exists(cached_file_folder):
- os.makedirs(cached_file_folder, 0777)
-
- with open(cached_file_header, 'w') as f:
- f.write("{\"Content-Length\": \"" + str(len(jsonGenerated)) + "\", \"Content-Type\": \"application/json\"}")
- with open(cached_file_content, 'w') as f:
- f.write(jsonGenerated)
- return True
- elif self.path.startswith("/dcae-service-types") and http_type == "GET":
- if not _file_available:
- self.path = "/dcae-service-types"
- cached_file_folder = '%s/%s' % (TMP_ROOT, self.path)
- cached_file_content = self._get_cached_content_file_name(cached_file_folder)
- cached_file_header = self._get_cached_header_file_name(cached_file_folder)
- print "self.path start with /dcae-service-types, generating response json..."
- response = "{\"links\": {\"previousLink\": {\"title\": \"string\",\"rel\": \"string\",\"uri\": \"string\",\"uriBuilder\": {},\"rels\": [\"string\"],\"params\": {\"additionalProp1\": \"string\",\"additionalProp2\": \"string\",\"additionalProp3\": \"string\"},\"type\": \"string\"},\"nextLink\": {\"title\": \"string\",\"rel\": \"string\",\"uri\": \"string\",\"uriBuilder\": {},\"rels\": [\"string\"],\"params\": {\"additionalProp1\": \"string\",\"additionalProp2\": \"string\",\"additionalProp3\": \"string\"},\"type\": \"string\"}},\"totalCount\": 1,\"items\": [{\"owner\": \"testOwner\",\"application\": \"testApplication\",\"component\": \"testComponent\",\"typeName\": \"testTypeName\",\"typeVersion\": 0,\"blueprintTemplate\": \"testBlueprintTemplate\",\"serviceIds\": [\"serviceId1\", \"serviceId2\"],\"vnfTypes\": [\"vnfType1\", \"vnfType2\"],\"serviceLocations\": [\"serviceLocation1\", \"serviceLocation2\"],\"asdcServiceId\": \"testAsdcServiceId\",\"asdcResourceId\": \"0\",\"asdcServiceURL\": \"testAsdcServiceURL\",\"typeId\": \"testtypeId\",\"selfLink\": {\"title\": \"selfLinkTitle\",\"rel\": \"selfLinkRel\",\"uri\": \"selfLinkUri\",\"uriBuilder\": {},\"rels\": [\"string\"],\"params\": {\"additionalProp1\": \"string\",\"additionalProp2\": \"string\",\"additionalProp3\": \"string\"},\"type\": \"string\"},\"created\": \"2020-01-22T09:38:15.436Z\",\"deactivated\": \"2020-01-22T09:38:15.437Z\"},{\"owner\": \"testOwner2\",\"application\": \"testApplication1\",\"component\": \"testComponent2\",\"typeName\": \"testTypeName2\",\"typeVersion\": 0,\"blueprintTemplate\": \"testBlueprintTemplate2\",\"serviceIds\": [\"serviceId3\", \"serviceId4\"],\"vnfTypes\": [\"vnfType13\", \"vnfType4\"],\"serviceLocations\": [\"serviceLocation3\", \"serviceLocation4\"],\"asdcServiceId\": \"testAsdcServiceId\",\"asdcResourceId\": \"1\",\"asdcServiceURL\": \"testAsdcServiceURL2\",\"typeId\": \"testtypeId2\",\"selfLink\": {\"title\": \"selfLinkTitle\",\"rel\": \"selfLinkRel\",\"uri\": \"selfLinkUri\",\"uriBuilder\": {},\"rels\": [\"string\"],\"params\": {\"additionalProp1\": \"string\",\"additionalProp2\": \"string\",\"additionalProp3\": \"string\"},\"type\": \"string\"},\"created\": \"2020-01-22T09:38:15.436Z\",\"deactivated\": \"2020-01-22T09:38:15.437Z\"}]}"
- print "jsonGenerated: " + response
-
- os.makedirs(cached_file_folder, 0777)
- with open(cached_file_header, 'w') as f:
- f.write("{\"Content-Length\": \"" + str(len(response)) + "\", \"Content-Type\": \"application/json\"}")
- with open(cached_file_content, 'w') as f:
- f.write(response)
- return True
- else:
- return False
-
-
- def do_GET(self):
- cached_file_folder = ""
- cached_file_content =""
- cached_file_header=""
- print("\n\n\nGot a GET request for %s " % self.path)
-
- self.print_headers()
- self.check_credentials()
- # Verify if it's a special case
- is_special = self._execute_content_generated_cases("GET")
- if is_special:
- cached_file_folder = self._get_cached_file_folder_name(TMP_ROOT)
- cached_file_content = self._get_cached_content_file_name(cached_file_folder)
- cached_file_header = self._get_cached_header_file_name(cached_file_folder)
- else:
- cached_file_folder = self._get_cached_file_folder_name(CACHE_ROOT)
- cached_file_content = self._get_cached_content_file_name(cached_file_folder)
- cached_file_header = self._get_cached_header_file_name(cached_file_folder)
-
- _file_available = os.path.exists(cached_file_content)
-
- if not _file_available:
- print("Request for data currently not present in cache: %s" % (cached_file_folder,))
-
- if not HOST:
- self.send_response(404)
- self.end_headers()
- self.wfile.write('404 Not found, no remote HOST specified on the emulator !!!')
- print("HOST value is: %s " % (options.proxy))
- return "404 Not found, no remote HOST specified on the emulator !!!"
-
- url = '%s%s' % (HOST, self.path)
- response = requests.get(url, auth=AUTH, headers=HEADERS, stream=True)
-
- if response.status_code == 200:
- self._write_cache(cached_file_folder, cached_file_header, cached_file_content, response)
- else:
- print('Error when requesting file :')
- print('Requested url : %s' % (url,))
- print('Status code : %s' % (response.status_code,))
- print('Content : %s' % (response.content,))
- self.send_response(response.status_code)
- self.end_headers()
- self.wfile.write('404 Not found, nothing found on the remote server !!!')
- return response.content
- else:
- print("Request for data currently present in cache: %s" % (cached_file_folder,))
- print("HOST value is: %s " % (HOST))
-
- self._send_content(cached_file_header, cached_file_content)
-
- if self.path.startswith("/dcae-service-types?asdcResourceId="):
- print "DCAE case deleting folder created " + cached_file_folder
- shutil.rmtree(cached_file_folder, ignore_errors=False, onerror=None)
- elif self.path.startswith("/dcae-service-types"):
- print "DCAE case deleting folder created " + cached_file_folder
- shutil.rmtree(cached_file_folder, ignore_errors=False, onerror=None)
- else:
- print "NOT in DCAE case deleting folder created " + cached_file_folder
-
- def do_POST(self):
- cached_file_folder = ""
- cached_file_content =""
- cached_file_header=""
- print("\n\n\nGot a POST for %s" % self.path)
- self.check_credentials()
- self.data_string = self.rfile.read(int(self.headers['Content-Length']))
- print("data-string:\n %s" % self.data_string)
- print("self.headers:\n %s" % self.headers)
-
- is_special = self._execute_content_generated_cases("POST")
- if is_special:
- cached_file_folder = self._get_cached_file_folder_name(TMP_ROOT)
- cached_file_content = self._get_cached_content_file_name(cached_file_folder)
- cached_file_header = self._get_cached_header_file_name(cached_file_folder)
- else:
- cached_file_folder = self._get_cached_file_folder_name(CACHE_ROOT)
- cached_file_content = self._get_cached_content_file_name(cached_file_folder)
- cached_file_header = self._get_cached_header_file_name(cached_file_folder)
-
- _file_available = os.path.exists(cached_file_content)
-
- if not _file_available:
-
- if not HOST:
- self.send_response(404)
- self.end_headers()
- self.wfile.write('404 Not found, no remote HOST specified on the emulator !!!')
- return "404 Not found, no remote HOST specified on the emulator !!!"
-
- print("Request for data currently not present in cache: %s" % (cached_file_folder,))
-
- url = '%s%s' % (HOST, self.path)
- print("url: %s" % (url,))
- response = requests.post(url, data=self.data_string, headers=self.headers, stream=True)
-
- if response.status_code == 200:
- self._write_cache(cached_file_folder, cached_file_header, cached_file_content, response)
- else:
- print('Error when requesting file :')
- print('Requested url : %s' % (url,))
- print('Status code : %s' % (response.status_code,))
- print('Content : %s' % (response.content,))
- self.send_response(response.status_code)
- self.end_headers()
- self.wfile.write('404 Not found, nothing found on the remote server !!!')
- return response.content
- else:
- print("Request for data present in cache: %s" % (cached_file_folder,))
-
- self._send_content(cached_file_header, cached_file_content)
-
- def do_PUT(self):
- cached_file_folder = ""
- cached_file_content =""
- cached_file_header=""
- print("\n\n\nGot a PUT for %s " % self.path)
- self.check_credentials()
- self.data_string = self.rfile.read(int(self.headers['Content-Length']))
- print("data-string:\n %s" % self.data_string)
- print("self.headers:\n %s" % self.headers)
-
- is_special = self._execute_content_generated_cases("PUT")
- if is_special:
- cached_file_folder = self._get_cached_file_folder_name(TMP_ROOT)
- cached_file_content = self._get_cached_content_file_name(cached_file_folder)
- cached_file_header = self._get_cached_header_file_name(cached_file_folder)
- else:
- cached_file_folder = self._get_cached_file_folder_name(CACHE_ROOT)
- cached_file_content = self._get_cached_content_file_name(cached_file_folder)
- cached_file_header = self._get_cached_header_file_name(cached_file_folder)
-
- _file_available = os.path.exists(cached_file_content)
-
- if not _file_available:
- if not HOST:
- self.send_response(404)
- self.end_headers()
- self.wfile.write('404 Not found, no remote HOST specified on the emulator !!!')
- return "404 Not found, no remote HOST specified on the emulator !!!"
-
- print("Request for data currently not present in cache: %s" % (cached_file_folder,))
-
- url = '%s%s' % (HOST, self.path)
- print("url: %s" % (url,))
- response = requests.put(url, data=self.data_string, headers=self.headers, stream=True)
-
- if response.status_code == 200:
- self._write_cache(cached_file_folder, cached_file_header, cached_file_content, response)
- else:
- print('Error when requesting file :')
- print('Requested url : %s' % (url,))
- print('Status code : %s' % (response.status_code,))
- print('Content : %s' % (response.content,))
- self.send_response(response.status_code)
- self.end_headers()
- self.wfile.write('404 Not found, nothing found on the remote server !!!')
- return response.content
- else:
- print("Request for data present in cache: %s" % (cached_file_folder,))
-
- self._send_content(cached_file_header, cached_file_content)
-
-
- def do_DELETE(self):
- cached_file_folder = ""
- cached_file_content =""
- cached_file_header=""
- print("\n\n\nGot a DELETE for %s " % self.path)
- self.check_credentials()
- if self.headers.get('Content-Length') is not None:
- self.data_string = self.rfile.read(int(self.headers['Content-Length']))
- else:
- self.data_string = "empty generated"
- print("self.headers:\n %s" % self.headers)
-
- is_special = self._execute_content_generated_cases("DELETE")
- if is_special:
- cached_file_folder = self._get_cached_file_folder_name(TMP_ROOT)
- cached_file_content = self._get_cached_content_file_name(cached_file_folder)
- cached_file_header = self._get_cached_header_file_name(cached_file_folder)
- else:
- cached_file_folder = self._get_cached_file_folder_name(CACHE_ROOT)
- cached_file_content = self._get_cached_content_file_name(cached_file_folder)
- cached_file_header = self._get_cached_header_file_name(cached_file_folder)
-
- _file_available = os.path.exists(cached_file_content)
-
- if not _file_available:
- if not HOST:
- self.send_response(404)
- self.end_headers()
- self.wfile.write('404 Not found, no remote HOST specified on the emulator !!!')
- return "404 Not found, no remote HOST specified on the emulator !!!"
-
- print("Request for data currently not present in cache: %s" % (cached_file_folder,))
-
- url = '%s%s' % (HOST, self.path)
- print("url: %s" % (url,))
- response = requests.put(url, data=self.data_string, headers=self.headers, stream=True)
-
- if response.status_code == 200:
- self._write_cache(cached_file_folder, cached_file_header, cached_file_content, response)
- else:
- print('Error when requesting file :')
- print('Requested url : %s' % (url,))
- print('Status code : %s' % (response.status_code,))
- print('Content : %s' % (response.content,))
- self.send_response(response.status_code)
- self.end_headers()
- self.wfile.write('404 Not found, nothing found on the remote server !!!')
- return response.content
- else:
- print("Request for data present in cache: %s" % (cached_file_folder,))
-
- self._send_content(cached_file_header, cached_file_content)
-
-
-
-# Main code that start the HTTP server
-httpd = SocketServer.ForkingTCPServer(('', PORT), Proxy)
-httpd.allow_reuse_address = True
-print "Listening on port "+ str(PORT) + "(Press Ctrl+C/Ctrl+Z to stop HTTPD Caching script)"
-print "Caching folder " + CACHE_ROOT + ", Tmp folder for generated files " + TMP_ROOT
-signal.signal(signal.SIGINT, signal_handler)
-httpd.serve_forever() \ No newline at end of file