diff options
author | rameshiyer27 <ramesh.murugan.iyer@est.tech> | 2023-03-23 12:00:48 +0000 |
---|---|---|
committer | rameshiyer27 <ramesh.murugan.iyer@est.tech> | 2023-03-23 14:58:58 +0000 |
commit | 22edfed7179b803c1a91b63ef0c2bf7490d24a0b (patch) | |
tree | fda6e780460d11fb7b29b8e1d5d48a3d3d8ec107 | |
parent | 4d895ef8eb9f5ab0948c045fceff231c6787c383 (diff) |
Remove clamp robot tests from Jakarta
Clamp ACM tests in Jakarta are not relevant anymore
Added dummy script to generate result files for k8s CSIT
Issue-ID: POLICY-4541
Signed-off-by: zrrmmua <ramesh.murugan.iyer@est.tech>
Change-Id: I45f9651a505cbee38805ea94724a570afc8ff8a8
-rwxr-xr-x | csit/clamp/plans/setup.sh | 56 | ||||
-rwxr-xr-x | csit/clamp/plans/teardown.sh | 3 | ||||
-rw-r--r-- | csit/clamp/tests/data/InstantiateAC.json | 54 | ||||
-rw-r--r-- | csit/clamp/tests/data/PMSHMultipleACTosca.yaml | 867 | ||||
-rw-r--r-- | csit/clamp/tests/data/PassivateAC.json | 9 | ||||
-rw-r--r-- | csit/clamp/tests/data/StateChangeRunningAC.json | 9 | ||||
-rw-r--r-- | csit/clamp/tests/policy-clamp-test.robot | 83 | ||||
-rw-r--r-- | csit/config/clamp/AcRuntimeParameters.yaml | 71 | ||||
-rw-r--r-- | csit/config/clamp/HttpParticipantParameters.yaml | 42 | ||||
-rw-r--r-- | csit/config/clamp/KubernetesParticipantParameters.yaml | 63 | ||||
-rw-r--r-- | csit/config/clamp/PolicyParticipantParameters.yaml | 61 | ||||
-rw-r--r-- | csit/config/clamp/groups.json | 137 | ||||
-rw-r--r-- | csit/config/clamp/logback.xml | 206 | ||||
-rwxr-xr-x | csit/run-k8s-csit.sh | 442 |
14 files changed, 446 insertions, 1657 deletions
diff --git a/csit/clamp/plans/setup.sh b/csit/clamp/plans/setup.sh index 6b11f9e0..6e94322e 100755 --- a/csit/clamp/plans/setup.sh +++ b/csit/clamp/plans/setup.sh @@ -1,6 +1,6 @@ #!/bin/bash # ============LICENSE_START======================================================= -# Copyright (C) 2021-2022 Nordix Foundation. +# Copyright (C) 2021-2023 Nordix Foundation. # ================================================================================ # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -17,57 +17,3 @@ # SPDX-License-Identifier: Apache-2.0 # ============LICENSE_END========================================================= -echo "Uninstall docker-py and reinstall docker." -pip uninstall -y docker-py -pip uninstall -y docker -pip install -U docker==2.7.0 - -sudo apt-get -y install libxml2-utils - -source "${SCRIPTS}"/get-versions.sh - -# Bringup ACM runtime containers -docker-compose -f "${SCRIPTS}"/docker-compose-all.yml up -d policy-clamp-runtime-acm - -sleep 10 -unset http_proxy https_proxy - -POLICY_RUNTIME_ACM_IP=$(get-instance-ip.sh policy-clamp-runtime-acm) -MARIADB_IP=$(get-instance-ip.sh mariadb) -DMAAP_IP=$(get-instance-ip.sh simulator) - -echo MARIADB IP IS "${MARIADB_IP}" -echo DMAAP_IP IS "${DMAAP_IP}" -echo POLICY RUNTIME ACM IP IS "${POLICY_RUNTIME_ACM_IP}" - -# wait for the app to start up -"${SCRIPTS}"/wait_for_port.sh "${POLICY_RUNTIME_ACM_IP}" 6969 - -# Bringup ACM participant containers -docker-compose -f "${SCRIPTS}"/docker-compose-all.yml up -d policy-clamp-ac-k8s-ppnt -docker-compose -f "${SCRIPTS}"/docker-compose-all.yml up -d policy-clamp-ac-http-ppnt -docker-compose -f "${SCRIPTS}"/docker-compose-all.yml up -d policy-clamp-ac-pf-ppnt - -sleep 10 -unset http_proxy https_proxy - -POLICY_PARTICIPANT_IP=$(get-instance-ip.sh policy-clamp-ac-pf-ppnt) -POLICY_API_IP=$(get-instance-ip.sh policy-api) -K8S_PARTICIPANT_IP=$(get-instance-ip.sh policy-clamp-ac-k8s-ppnt) -HTTP_PARTICIPANT_IP=$(get-instance-ip.sh policy-clamp-ac-http-ppnt) - -echo POLICY PARTICIPANT IP IS "${POLICY_PARTICIPANT_IP}" -echo API IP IS "${POLICY_API_IP}" -echo K8S PARTICIPANT IP IS "${K8S_PARTICIPANT_IP}" -echo HTTP PARTICIPANT IP IS "${HTTP_PARTICIPANT_IP}" - -# wait for the app to start up -"${SCRIPTS}"/wait_for_port.sh "${POLICY_PARTICIPANT_IP}" 6969 - -ROBOT_VARIABLES="" -ROBOT_VARIABLES="${ROBOT_VARIABLES} -v POLICY_RUNTIME_ACM_IP:${POLICY_RUNTIME_ACM_IP}" -ROBOT_VARIABLES="${ROBOT_VARIABLES} -v POLICY_PARTICIPANT_IP:${POLICY_PARTICIPANT_IP}" -ROBOT_VARIABLES="${ROBOT_VARIABLES} -v K8S_PARTICIPANT_IP:${K8S_PARTICIPANT_IP}" -ROBOT_VARIABLES="${ROBOT_VARIABLES} -v HTTP_PARTICIPANT_IP:${HTTP_PARTICIPANT_IP}" -ROBOT_VARIABLES="${ROBOT_VARIABLES} -v POLICY_API_IP:${POLICY_API_IP}" - diff --git a/csit/clamp/plans/teardown.sh b/csit/clamp/plans/teardown.sh index e0fc58ed..1bc4204a 100755 --- a/csit/clamp/plans/teardown.sh +++ b/csit/clamp/plans/teardown.sh @@ -1,6 +1,6 @@ #!/bin/bash # ============LICENSE_START======================================================= -# Copyright (C) 2021 Nordix Foundation. +# Copyright (C) 2021,2023 Nordix Foundation. # ================================================================================ # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -17,4 +17,3 @@ # SPDX-License-Identifier: Apache-2.0 # ============LICENSE_END========================================================= -docker-compose -f ${SCRIPTS}/docker-compose-all.yml down -v diff --git a/csit/clamp/tests/data/InstantiateAC.json b/csit/clamp/tests/data/InstantiateAC.json deleted file mode 100644 index 5de6c95c..00000000 --- a/csit/clamp/tests/data/InstantiateAC.json +++ /dev/null @@ -1,54 +0,0 @@ -{ - "automationCompositionList": [ - { - "name": "PMSHInstance0", - "version": "1.0.1", - "definition": { - "name": "org.onap.domain.sample.GenericK8s_AutomationCompositionDefinition", - "version": "1.2.3" - }, - "state": "UNINITIALISED", - "orderedState": "UNINITIALISED", - "description": "PMSH automation composition instance 0", - "elements": { - "709c62b3-8918-41b9-a747-d21eb79c6c21": { - "id": "709c62b3-8918-41b9-a747-d21eb79c6c21", - "definition": { - "name": "org.onap.domain.pmsh.PMSH_MonitoringPolicyAutomationCompositionElement", - "version": "1.2.3" - }, - "participantId": { - "name": "org.onap.PM_Policy", - "version": "1.0.0" - }, - "participantType": { - "name": "org.onap.policy.clamp.acm.PolicyParticipant", - "version": "2.3.1" - }, - "state": "UNINITIALISED", - "orderedState": "UNINITIALISED", - "description": "Monitoring Policy Automation Composition Element for the PMSH instance 0 automation composition" - }, - "709c62b3-8918-41b9-a747-d21eb79c6c22": { - "id": "709c62b3-8918-41b9-a747-d21eb79c6c22", - "definition": { - "name": "org.onap.domain.pmsh.PMSH_OperationalPolicyAutomationCompositionElement", - "version": "1.2.3" - }, - "participantId": { - "name": "org.onap.PM_Policy", - "version": "1.0.0" - }, - "participantType": { - "name": "org.onap.policy.clamp.acm.PolicyParticipant", - "version": "2.3.1" - }, - "state": "UNINITIALISED", - "orderedState": "UNINITIALISED", - "description": "Operational Policy Automation Composition Element for the PMSH instance 0 automation composition" - } - } - } - ] -} - diff --git a/csit/clamp/tests/data/PMSHMultipleACTosca.yaml b/csit/clamp/tests/data/PMSHMultipleACTosca.yaml deleted file mode 100644 index fc4ac732..00000000 --- a/csit/clamp/tests/data/PMSHMultipleACTosca.yaml +++ /dev/null @@ -1,867 +0,0 @@ -tosca_definitions_version: tosca_simple_yaml_1_3 -data_types: - onap.datatypes.ToscaConceptIdentifier: - derived_from: tosca.datatypes.Root - properties: - name: - type: string - required: true - version: - type: string - required: true - onap.datatype.acm.Target: - derived_from: tosca.datatypes.Root - description: >- - Definition for a entity in A&AI to perform an Automation Composition - 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.acm.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. - metadata: - clamp_possible_values: 'Dictionary:DefaultOperations,ClampExecution:CDS/operation' - required: true - target: - type: onap.datatype.acm.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.acm.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.acm.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 - onap.datatypes.monitoring.managedObjectDNsBasic: - constraints: [] - properties: - DN: - name: DN - type: string - typeVersion: 0.0.0 - description: Managed object distinguished name - required: true - constraints: [] - metadata: {} - name: onap.datatypes.monitoring.managedObjectDNsBasic - version: 0.0.0 - derived_from: tosca.datatypes.Root - metadata: {} - onap.datatypes.monitoring.managedObjectDNsBasics: - constraints: [] - properties: - managedObjectDNsBasic: - name: managedObjectDNsBasic - type: map - typeVersion: 0.0.0 - description: Managed object distinguished name object - required: true - constraints: [] - entry_schema: - type: onap.datatypes.monitoring.managedObjectDNsBasic - typeVersion: 0.0.0 - constraints: [] - metadata: {} - name: onap.datatypes.monitoring.managedObjectDNsBasics - version: 0.0.0 - derived_from: tosca.datatypes.Root - metadata: {} - onap.datatypes.monitoring.measurementGroup: - constraints: [] - properties: - measurementTypes: - name: measurementTypes - type: list - typeVersion: 0.0.0 - description: List of measurement types - required: true - constraints: [] - entry_schema: - type: onap.datatypes.monitoring.measurementTypes - typeVersion: 0.0.0 - constraints: [] - metadata: {} - managedObjectDNsBasic: - name: managedObjectDNsBasic - type: list - typeVersion: 0.0.0 - description: List of managed object distinguished names - required: true - constraints: [] - entry_schema: - type: onap.datatypes.monitoring.managedObjectDNsBasics - typeVersion: 0.0.0 - constraints: [] - metadata: {} - name: onap.datatypes.monitoring.measurementGroup - version: 0.0.0 - derived_from: tosca.datatypes.Root - metadata: {} - onap.datatypes.monitoring.measurementGroups: - constraints: [] - properties: - measurementGroup: - name: measurementGroup - type: map - typeVersion: 0.0.0 - description: Measurement Group - required: true - constraints: [] - entry_schema: - type: onap.datatypes.monitoring.measurementGroup - typeVersion: 0.0.0 - constraints: [] - metadata: {} - name: onap.datatypes.monitoring.measurementGroups - version: 0.0.0 - derived_from: tosca.datatypes.Root - metadata: {} - onap.datatypes.monitoring.measurementType: - constraints: [] - properties: - measurementType: - name: measurementType - type: string - typeVersion: 0.0.0 - description: Measurement type - required: true - constraints: [] - metadata: {} - name: onap.datatypes.monitoring.measurementType - version: 0.0.0 - derived_from: tosca.datatypes.Root - metadata: {} - onap.datatypes.monitoring.measurementTypes: - constraints: [] - properties: - measurementType: - name: measurementType - type: map - typeVersion: 0.0.0 - description: Measurement type object - required: true - constraints: [] - entry_schema: - type: onap.datatypes.monitoring.measurementType - typeVersion: 0.0.0 - constraints: [] - metadata: {} - name: onap.datatypes.monitoring.measurementTypes - version: 0.0.0 - derived_from: tosca.datatypes.Root - metadata: {} - onap.datatypes.monitoring.nfFilter: - constraints: [] - properties: - modelNames: - name: modelNames - type: list - typeVersion: 0.0.0 - description: List of model names - required: true - constraints: [] - entry_schema: - type: string - typeVersion: 0.0.0 - constraints: [] - metadata: {} - modelInvariantIDs: - name: modelInvariantIDs - type: list - typeVersion: 0.0.0 - description: List of model invariant IDs - required: true - constraints: [] - entry_schema: - type: string - typeVersion: 0.0.0 - constraints: [] - metadata: {} - modelVersionIDs: - name: modelVersionIDs - type: list - typeVersion: 0.0.0 - description: List of model version IDs - required: true - constraints: [] - entry_schema: - type: string - typeVersion: 0.0.0 - constraints: [] - metadata: {} - nfNames: - name: nfNames - type: list - typeVersion: 0.0.0 - description: List of network functions - required: true - constraints: [] - entry_schema: - type: string - typeVersion: 0.0.0 - constraints: [] - metadata: {} - name: onap.datatypes.monitoring.nfFilter - version: 0.0.0 - derived_from: tosca.datatypes.Root - metadata: {} - onap.datatypes.monitoring.subscription: - constraints: [] - properties: - measurementGroups: - name: measurementGroups - type: list - typeVersion: 0.0.0 - description: Measurement Groups - required: true - constraints: [] - entry_schema: - type: onap.datatypes.monitoring.measurementGroups - typeVersion: 0.0.0 - constraints: [] - metadata: {} - fileBasedGP: - name: fileBasedGP - type: integer - typeVersion: 0.0.0 - description: File based granularity period - required: true - constraints: [] - metadata: {} - fileLocation: - name: fileLocation - type: string - typeVersion: 0.0.0 - description: ROP file location - required: true - constraints: [] - metadata: {} - subscriptionName: - name: subscriptionName - type: string - typeVersion: 0.0.0 - description: Name of the subscription - required: true - constraints: [] - metadata: {} - administrativeState: - name: administrativeState - type: string - typeVersion: 0.0.0 - description: State of the subscription - required: true - constraints: - - valid_values: - - LOCKED - - UNLOCKED - metadata: {} - nfFilter: - name: nfFilter - type: map - typeVersion: 0.0.0 - description: Network function filter - required: true - constraints: [] - entry_schema: - type: onap.datatypes.monitoring.nfFilter - typeVersion: 0.0.0 - constraints: [] - metadata: {} - name: onap.datatypes.monitoring.subscription - version: 0.0.0 - derived_from: tosca.datatypes.Root - metadata: {} - org.onap.datatypes.policy.clamp.acm.httpAutomationCompositionElement.RestRequest: - version: 1.0.0 - derived_from: tosca.datatypes.Root - properties: - restRequestId: - type: onap.datatypes.ToscaConceptIdentifier - typeVersion: 1.0.0 - required: true - description: The name and version of a REST request to be sent to a REST endpoint - httpMethod: - type: string - required: true - constraints: - - valid_values: - - POST - - PUT - - GET - - DELETE - description: The REST method to use - path: - type: string - required: true - description: The path of the REST request relative to the base URL - body: - type: string - required: false - description: The body of the REST request for PUT and POST requests - expectedResponse: - type: integer - required: true - constraints: [] - description: THe expected HTTP status code for the REST request - org.onap.datatypes.policy.clamp.acm.httpAutomationCompositionElement.ConfigurationEntity: - version: 1.0.0 - derived_from: tosca.datatypes.Root - properties: - configurationEntityId: - type: onap.datatypes.ToscaConceptIdentifier - typeVersion: 1.0.0 - required: true - description: >- - The name and version of a Configuration Entity to be handled by the - HTTP Automation Composition Element - restSequence: - type: list - entry_schema: - type: >- - org.onap.datatypes.policy.clamp.acm.httpAutomationCompositionElement.RestRequest - typeVersion: 1.0.0 - description: A sequence of REST commands to send to the REST endpoint -policy_types: - onap.policies.Monitoring: - derived_from: tosca.policies.Root - description: a base policy type for all policies that govern monitoring provisioning - version: 1.0.0 - name: onap.policies.Monitoring - onap.policies.Sirisha: - derived_from: tosca.policies.Root - description: a base policy type for all policies that govern monitoring provisioning - version: 1.0.0 - name: onap.policies.Sirisha - onap.policies.monitoring.dcae-pm-subscription-handler: - properties: - pmsh_policy: - name: pmsh_policy - type: onap.datatypes.monitoring.subscription - typeVersion: 0.0.0 - description: PMSH Policy JSON - required: false - constraints: [] - metadata: {} - name: onap.policies.monitoring.dcae-pm-subscription-handler - version: 1.0.0 - derived_from: onap.policies.Monitoring - metadata: {} - onap.policies.acm.operational.Common: - derived_from: tosca.policies.Root - version: 1.0.0 - name: onap.policies.acm.operational.Common - description: > - Operational Policy for Automation Composition 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 Automation Composition 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 Automation - Composition from DCAE. - required: true - default: false - trigger: - type: string - description: >- - Initial operation to execute upon receiving an Onset event message for - the Automation Composition. - required: true - operations: - type: list - description: >- - List of operations to be performed when Automation Composition is - triggered. - required: true - entry_schema: - type: onap.datatype.acm.Operation - onap.policies.acm.operational.common.Apex: - derived_from: onap.policies.acm.operational.Common - type_version: 1.0.0 - version: 1.0.0 - name: onap.policies.acm.operational.common.Apex - description: Operational policies for Apex PDP - properties: - engineServiceParameters: - type: string - description: >- - The engine parameters like name, instanceCount, policy implementation, - parameters etc. - required: true - eventInputParameters: - type: string - description: The event input parameters. - required: true - eventOutputParameters: - type: string - description: The event output parameters. - required: true - javaProperties: - type: string - description: Name/value pairs of properties to be set for APEX if needed. - required: false -node_types: - org.onap.policy.clamp.acm.Participant: - version: 1.0.1 - derived_from: tosca.nodetypes.Root - properties: - provider: - type: string - requred: false - org.onap.policy.clamp.acm.AutomationCompositionElement: - version: 1.0.1 - derived_from: tosca.nodetypes.Root - properties: - provider: - type: string - required: false - metadata: - common: true - description: >- - Specifies the organization that provides the automation composition - element - participant_id: - type: onap.datatypes.ToscaConceptIdentifier - requred: true - metadata: - common: true - participantType: - type: onap.datatypes.ToscaConceptIdentifier - required: true - metadata: - common: true - description: >- - The identity of the participant type that hosts this type of - Automation Composition Element - startPhase: - type: integer - required: false - constraints: - - greater_or_equal: 0 - metadata: - common: true - description: >- - A value indicating the start phase in which this automation - composition element will be started, the first start phase is zero. - Automation Composition Elements are started in their start_phase order - and stopped in reverse start phase order. Automation Composition - Elements with the same start phase are started and stopped - simultaneously - uninitializedToPassiveTimeout: - type: integer - required: false - constraints: - - greater_or_equal: 0 - default: 60 - metadata: - common: true - description: >- - The maximum time in seconds to wait for a state chage from - uninitialized to passive - passiveToRunningTimeout: - type: integer - required: false - constraints: - - greater_or_equal: 0 - default: 60 - metadata: - common: true - description: >- - The maximum time in seconds to wait for a state chage from passive to - running - runningToPassiveTimeout: - type: integer - required: false - constraints: - - greater_or_equal: 0 - default: 60 - metadata: - common: true - description: >- - The maximum time in seconds to wait for a state chage from running to - passive - passiveToUninitializedTimeout: - type: integer - required: false - constraints: - - greater_or_equal: 0 - default: 60 - metadata: - common: true - description: >- - The maximum time in seconds to wait for a state chage from passive to - uninitialized - org.onap.policy.clamp.acm.AutomationComposition: - version: 1.0.1 - derived_from: tosca.nodetypes.Root - properties: - provider: - type: string - required: false - metadata: - common: true - description: >- - Specifies the organization that provides the automation composition - element - elements: - type: list - required: true - metadata: - common: true - entry_schema: - type: onap.datatypes.ToscaConceptIdentifier - description: >- - Specifies a list of automation composition element definitions that - make up this automation composition definition - org.onap.policy.clamp.acm.PolicyAutomationCompositionElement: - version: 1.0.1 - derived_from: org.onap.policy.clamp.acm.AutomationCompositionElement - properties: - policy_type_id: - type: onap.datatypes.ToscaConceptIdentifier - requred: true - policy_id: - type: onap.datatypes.ToscaConceptIdentifier - requred: false - org.onap.policy.clamp.acm.CDSAutomationCompositionElement: - version: 1.0.1 - derived_from: org.onap.policy.clamp.acm.AutomationCompositionElement - properties: - cds_blueprint_id: - type: onap.datatypes.ToscaConceptIdentifier - requred: true - org.onap.policy.clamp.acm.K8SMicroserviceAutomationCompositionElement: - version: 1.0.1 - derived_from: org.onap.policy.clamp.acm.AutomationCompositionElement - properties: - chart: - type: string - required: true - configs: - type: list - required: false - requirements: - type: string - requred: false - templates: - type: list - required: false - entry_schema: null - values: - type: string - requred: true - org.onap.policy.clamp.acm.HttpAutomationCompositionElement: - version: 1.0.1 - derived_from: org.onap.policy.clamp.acm.AutomationCompositionElement - properties: - baseUrl: - type: string - required: true - description: >- - The base URL to be prepended to each path, identifies the host for the - REST endpoints. - httpHeaders: - type: map - required: false - entry_schema: - type: string - description: HTTP headers to send on REST requests - configurationEntities: - type: map - required: true - entry_schema: - type: >- - org.onap.datatypes.policy.clamp.acm.httpAutomationCompositionElement.ConfigurationEntity - typeVersion: 1.0.0 - description: >- - The connfiguration entities the Automation Composition Element is - managing and their associated REST requests -topology_template: - inputs: - pmsh_monitoring_policy: - type: onap.datatypes.ToscaConceptIdentifier - description: The ID of the PMSH monitoring policy to use - default: - name: >- - MICROSERVICE_vLoadBalancerMS_v1_0_dcae-pm-subscription-handler_1_0_0test - version: 1.0.0 - pmsh_operational_policy: - type: onap.datatypes.ToscaConceptIdentifier - description: The ID of the PMSH operational policy to use - default: - name: operational.apex.pmcontrol - version: 1.0.0 - node_templates: - org.onap.policy.clamp.acm.PolicyParticipant: - version: 2.3.1 - type: org.onap.policy.clamp.acm.Participant - type_version: 1.0.1 - description: Participant for DCAE microservices - properties: - provider: ONAP - org.onap.domain.pmsh.PMSH_MonitoringPolicyAutomationCompositionElement: - version: 1.2.3 - type: org.onap.policy.clamp.acm.PolicyAutomationCompositionElement - type_version: 1.0.0 - description: >- - Automation composition element for the monitoring policy for Performance - Management Subscription Handling - properties: - provider: Ericsson - participant_id: - name: org.onap.PM_Policy - version: 1.0.0 - participantType: - name: org.onap.policy.clamp.acm.PolicyParticipant - version: 2.3.1 - policy_type_id: - name: onap.policies.monitoring.pm-subscription-handler - version: 1.0.0 - policy_id: - get_input: pmsh_monitoring_policy - org.onap.domain.pmsh.PMSH_OperationalPolicyAutomationCompositionElement: - version: 1.2.3 - type: org.onap.policy.clamp.acm.PolicyAutomationCompositionElement - type_version: 1.0.0 - description: >- - Automation composition element for the operational policy for - Performance Management Subscription Handling - properties: - provider: Ericsson - participant_id: - name: org.onap.PM_Policy - version: 1.0.0 - participantType: - name: org.onap.policy.clamp.acm.PolicyParticipant - version: 2.3.1 - policy_type_id: - name: onap.policies.operational.pm-subscription-handler - version: 1.0.0 - policy_id: - get_input: pmsh_operational_policy - org.onap.policy.clamp.acm.KubernetesParticipant: - version: 2.3.4 - type: org.onap.policy.clamp.acm.Participant - type_version: 1.0.1 - description: Participant for K8S - properties: - provider: ONAP - org.onap.domain.database.PMSH_K8SMicroserviceAutomationCompositionElement: - version: 1.2.3 - type: org.onap.policy.clamp.acm.K8SMicroserviceAutomationCompositionElement - type_version: 1.0.0 - description: Automation composition element for the K8S microservice for PMSH - properties: - provider: ONAP - participant_id: - name: K8sParticipant0 - version: 1.0.0 - participantType: - name: org.onap.policy.clamp.acm.KubernetesParticipant - version: 2.3.4 - chart: - chartId: - name: dcae-pmsh - version: 10.0.0 - namespace: onap - releaseName: onap-dcae-pmsh - repository: - repoName: chartmuseum - address: 'http://chart-museum:80' - userName: onapinitializer - password: demo123456! - overrideParams: - global.masterPassword: test - org.onap.policy.clamp.acm.HttpParticipant: - version: 2.3.4 - type: org.onap.policy.clamp.acm.Participant - type_version: 1.0.1 - description: Participant for Http requests - properties: - provider: ONAP - org.onap.domain.database.Http_PMSHMicroserviceAutomationCompositionElement: - version: 1.2.3 - type: org.onap.policy.clamp.acm.HttpAutomationCompositionElement - type_version: 1.0.1 - description: >- - Automation composition element for the http requests of PMSH - microservice - properties: - provider: ONAP - participant_id: - name: HttpParticipant0 - version: 1.0.0 - participantType: - name: org.onap.policy.clamp.acm.HttpParticipant - version: 2.3.4 - uninitializedToPassiveTimeout: 180 - startPhase: 1 - baseUrl: 'https://dcae-pmsh:8443' - httpHeaders: - Content-Type: application/json - configurationEntities: - - configurationEntityId: - name: entity1 - version: 1.0.1 - restSequence: - - restRequestId: - name: request1 - version: 1.0.1 - httpMethod: POST - path: subscription - body: >- - { "subscription":{ "subscriptionName":"new_sub_01", - "operationalPolicyName":"pmsh-operational-policy", - "controlLoopName":"controlLoop-name", "nfFilter":{ "nfNames":[ - "^pnf*" ], "modelInvariantIDs":[ - "7129e420-d396-4efb-af02-6b83499b12f5" ], "modelVersionIDs":[ - "e80a6ae3-cafd-4d24-850d-e14c084a5ca7" ], "modelNames":[ - "pnf_134" ] }, "measurementGroups":[ { "measurementGroup":{ - "measurementGroupName":"msgroup_01", - "administrativeState":"UNLOCKED", "fileBasedGP":15, - "fileLocation":"/pm/pm.xml", "measurementTypes":[ { - "measurementType":"EutranCell.*" }, { - "measurementType":"EutranCellRelation.pmCounter1" }, { - "measurementType":"EutranCellRelation.pmCounter2" } ], - "managedObjectDNsBasic":[ { - "DN":"ManagedElement=1,ENodeBFunction=1,EUtranCell=CityCenter1" - }, { - "DN":"ManagedElement=1,ENodeBFunction=1,EUtranCell=CityCenter1, - EUtranCellRelation=CityCenter2" }, { - "DN":"ManagedElement=1,ENodeBFunction=1,EUtranCell=CityCenter1, - EUtranCellRelation=CityCenter3" } ] } } ] } } - expectedResponse: 201 - org.onap.domain.sample.GenericK8s_AutomationCompositionDefinition: - version: 1.2.3 - type: org.onap.policy.clamp.acm.AutomationComposition - type_version: 1.0.0 - description: Automation composition for Hello World - properties: - provider: ONAP - elements: - - name: >- - org.onap.domain.database.PMSH_K8SMicroserviceAutomationCompositionElement - version: 1.2.3 - - name: >- - org.onap.domain.database.Http_PMSHMicroserviceAutomationCompositionElement - version: 1.2.3 - - name: >- - org.onap.domain.pmsh.PMSH_MonitoringPolicyAutomationCompositionElement - version: 1.2.3 - - name: >- - org.onap.domain.pmsh.PMSH_OperationalPolicyAutomationCompositionElement - version: 1.2.3 diff --git a/csit/clamp/tests/data/PassivateAC.json b/csit/clamp/tests/data/PassivateAC.json deleted file mode 100644 index bd4c4a21..00000000 --- a/csit/clamp/tests/data/PassivateAC.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "orderedState": "PASSIVE", - "automationCompositionIdentifierList": [ - { - "name": "PMSHInstance0", - "version": "1.0.1" - } - ] -} diff --git a/csit/clamp/tests/data/StateChangeRunningAC.json b/csit/clamp/tests/data/StateChangeRunningAC.json deleted file mode 100644 index 494f6fd7..00000000 --- a/csit/clamp/tests/data/StateChangeRunningAC.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "orderedState": "RUNNING", - "automationCompositionIdentifierList": [ - { - "name": "PMSHInstance0", - "version": "1.0.1" - } - ] -} diff --git a/csit/clamp/tests/policy-clamp-test.robot b/csit/clamp/tests/policy-clamp-test.robot index f819d2d2..bb219836 100644 --- a/csit/clamp/tests/policy-clamp-test.robot +++ b/csit/clamp/tests/policy-clamp-test.robot @@ -1,82 +1,3 @@ -*** Settings *** -Library Collections -Library RequestsLibrary -Library OperatingSystem -Library json - *** Test Cases *** - -CommissionAutomationCompositionV1 - [Documentation] Commission automation composition. - ${auth}= Create List runtimeUser zb!XztG34 - Log Creating session http://${POLICY_RUNTIME_ACM_IP}:6969 - ${postyaml}= Get file ${CURDIR}/data/PMSHMultipleACTosca.yaml - ${session}= Create Session policy http://${POLICY_RUNTIME_ACM_IP}:6969 auth=${auth} - ${headers}= Create Dictionary Accept=application/yaml Content-Type=application/yaml - ${resp}= POST On Session policy /onap/policy/clamp/acm/v2/commission data=${postyaml} headers=${headers} - Log Received response from runtime acm ${resp.text} - Should Be Equal As Strings ${resp.status_code} 200 - -InstantiateAutomationCompositionV1 - [Documentation] Instantiate automation composition. - ${auth}= Create List runtimeUser zb!XztG34 - Log Creating session http://${POLICY_RUNTIME_ACM_IP}:6969 - ${postjson}= Get file ${CURDIR}/data/InstantiateAC.json - ${session}= Create Session policy http://${POLICY_RUNTIME_ACM_IP}:6969 auth=${auth} - ${headers}= Create Dictionary Accept=application/json Content-Type=application/json - ${resp}= POST On Session policy /onap/policy/clamp/acm/v2/instantiation data=${postjson} headers=${headers} - Log Received response from runtime acm ${resp.text} - Should Be Equal As Strings ${resp.status_code} 200 - -PassivateAutomationComposition - [Documentation] Passivate automation composition. - ${auth}= Create List runtimeUser zb!XztG34 - Log Creating session http://${POLICY_RUNTIME_ACM_IP}:6969 - ${postjson}= Get file ${CURDIR}/data/PassivateAC.json - ${session}= Create Session policy http://${POLICY_RUNTIME_ACM_IP}:6969 auth=${auth} - ${headers}= Create Dictionary Accept=application/json Content-Type=application/json - ${resp}= PUT On Session policy /onap/policy/clamp/acm/v2/instantiation/command data=${postjson} headers=${headers} - Log Received response from runtime acm ${resp.text} - Should Be Equal As Strings ${resp.status_code} 202 - -QueryPolicies - [Documentation] Runs Policy Participant Query New Policies - ${auth}= Create List policyadmin zb!XztG34 - Log Creating session http://${POLICY_API_IP}:6969 - ${session}= Create Session policy http://${POLICY_API_IP}:6969 auth=${auth} - ${headers}= Create Dictionary Accept=application/json Content-Type=application/json - ${resp}= GET On Session policy /policy/api/v1/policies headers=${headers} - Log Received response from policy-api {resp.text} - Should Be Equal As Strings ${resp.status_code} 200 - -QueryPolicyTypes - [Documentation] Runs Policy Participant Query New Policy Types - ${auth}= Create List policyadmin zb!XztG34 - Log Creating session http://${POLICY_API_IP}:6969 - ${session}= Create Session policy http://${POLICY_API_IP}:6969 auth=${auth} - ${headers}= Create Dictionary Accept=application/json Content-Type=application/json - ${resp}= GET On Session policy /policy/api/v1/policytypes headers=${headers} - Log Received response from policy-api ${resp.text} - Should Be Equal As Strings ${resp.status_code} 200 - -StateChangeRunningAutomationComposition - [Documentation] AutomationComposition State Change to RUNNING. - ${auth}= Create List runtimeUser zb!XztG34 - Log Creating session http://${POLICY_RUNTIME_ACM_IP}:6969 - ${postjson}= Get file ${CURDIR}/data/StateChangeRunningAC.json - ${session}= Create Session policy http://${POLICY_RUNTIME_ACM_IP}:6969 auth=${auth} - ${headers}= Create Dictionary Accept=application/json Content-Type=application/json - ${resp}= PUT On Session policy /onap/policy/clamp/acm/v2/instantiation/command data=${postjson} headers=${headers} expected_status=406 - Log Received response from runtime acm ${resp.text} - -QueryInstantiatedACs - [Documentation] Get Instantiated AutomationCompositions - ${auth}= Create List runtimeUser zb!XztG34 - Log Creating session http://${POLICY_RUNTIME_ACM_IP}:6969 - ${session}= Create Session policy http://${POLICY_RUNTIME_ACM_IP}:6969 auth=${auth} - ${headers}= Create Dictionary Accept=application/json Content-Type=application/json - ${resp}= GET On Session policy /onap/policy/clamp/acm/v2/instantiation headers=${headers} - Log Received response from runtime acm ${resp.text} - Should Be Equal As Strings ${resp.status_code} 200 - Should Be Equal As Strings ${resp.json()['automationCompositionList'][0]['state']} UNINITIALISED2PASSIVE - Should Be Equal As Strings ${resp.json()['automationCompositionList'][0]['orderedState']} RUNNING +Dummy CLAMP Jakarta Robot Test + Log To Console Dummy CLAMP Robot tests for Jakarta diff --git a/csit/config/clamp/AcRuntimeParameters.yaml b/csit/config/clamp/AcRuntimeParameters.yaml deleted file mode 100644 index ef686cf7..00000000 --- a/csit/config/clamp/AcRuntimeParameters.yaml +++ /dev/null @@ -1,71 +0,0 @@ -spring: - security: - user: - name: runtimeUser - password: zb!XztG34 - http: - converters: - preferred-json-mapper: gson - datasource: - url: jdbc:mariadb://${mariadb.host:mariadb}:${mariadb.port:3306}/clampacm - driverClassName: org.mariadb.jdbc.Driver - username: policy_user - password: policy_user - hikari: - connectionTimeout: 30000 - idleTimeout: 600000 - maxLifetime: 1800000 - maximumPoolSize: 10 - jpa: - hibernate: - ddl-auto: update - naming: - physical-strategy: org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl - implicit-strategy: org.onap.policy.common.spring.utils.CustomImplicitNamingStrategy - properties: - hibernate: - dialect: org.hibernate.dialect.MariaDB103Dialect - format_sql: true - -security: - enable-csrf: false - -server: - port: 6969 - ssl: - enabled: false - servlet: - context-path: /onap/policy/clamp/acm - error: - path: /error - -runtime: - participantParameters: - heartBeatMs: 20000 - maxStatusWaitMs: 100000 - updateParameters: - maxRetryCount: 3 - maxWaitMs: 20000 - topicParameterGroup: - topicSources: - - - topic: POLICY-ACRUNTIME-PARTICIPANT - servers: - - ${topicServer:message-router} - topicCommInfrastructure: dmaap - fetchTimeout: 15000 - useHttps: false - topicSinks: - - - topic: POLICY-ACRUNTIME-PARTICIPANT - servers: - - ${topicServer:message-router} - topicCommInfrastructure: dmaap - useHttps: false - -management: - endpoints: - web: - base-path: / - exposure: - include: health, metrics, prometheus diff --git a/csit/config/clamp/HttpParticipantParameters.yaml b/csit/config/clamp/HttpParticipantParameters.yaml deleted file mode 100644 index 15768882..00000000 --- a/csit/config/clamp/HttpParticipantParameters.yaml +++ /dev/null @@ -1,42 +0,0 @@ -spring: - security: - user: - name: participantUser - password: zb!XztG34 -security: - enable-csrf: false -participant: - intermediaryParameters: - reportingTimeIntervalMs: 120000 - description: Participant Description - participantId: - name: HttpParticipant0 - version: 1.0.0 - participantType: - name: org.onap.policy.clamp.acm.HttpParticipant - version: 2.3.4 - clampAutomationCompositionTopics: - topicSources: - - topic: POLICY-ACRUNTIME-PARTICIPANT - servers: - - ${topicServer:message-router} - topicCommInfrastructure: dmaap - fetchTimeout: 15000 - useHttps: false - topicSinks: - - topic: POLICY-ACRUNTIME-PARTICIPANT - servers: - - ${topicServer:message-router} - topicCommInfrastructure: dmaap - useHttps: false -management: - endpoints: - web: - exposure: - include: health, metrics, prometheus -server: - port: 6969 - ssl: - enabled: false - servlet: - context-path: /onap/policy/clamp/acm/httpparticipant diff --git a/csit/config/clamp/KubernetesParticipantParameters.yaml b/csit/config/clamp/KubernetesParticipantParameters.yaml deleted file mode 100644 index c13f8151..00000000 --- a/csit/config/clamp/KubernetesParticipantParameters.yaml +++ /dev/null @@ -1,63 +0,0 @@ -spring: - security: - user: - name: participantUser - password: zb!XztG34 -security: - enable-csrf: false - -participant: - localChartDirectory: /home/policy/local-charts - infoFileName: CHART_INFO.json - intermediaryParameters: - reportingTimeIntervalMs: 120000 - description: Participant Description - participantId: - name: K8sParticipant0 - version: 1.0.0 - participantType: - name: org.onap.policy.clamp.acm.KubernetesParticipant - version: 2.3.4 - clampAutomationCompositionTopics: - topicSources: - - - topic: POLICY-ACRUNTIME-PARTICIPANT - servers: - - ${topicServer:message-router} - topicCommInfrastructure: dmaap - fetchTimeout: 15000 - useHttps: false - topicSinks: - - - topic: POLICY-ACRUNTIME-PARTICIPANT - servers: - - ${topicServer:message-router} - topicCommInfrastructure: dmaap - useHttps: false - -management: - endpoints: - web: - exposure: - include: health, metrics, prometheus -server: - port: 6969 - ssl: - enabled: false - servlet: - context-path: /onap/policy/clamp/acm/k8sparticipant - -logging: - # Configuration of logging - level: - ROOT: ERROR - org.springframework: ERROR - org.springframework.data: ERROR - org.springframework.web.reactive.function.client.ExchangeFunctions: ERROR - org.onap.policy.clamp.acm.participant.kubernetes: INFO - file: - name: /var/log/onap/policy/clamp/application.log - -chart: - api: - enabled: false diff --git a/csit/config/clamp/PolicyParticipantParameters.yaml b/csit/config/clamp/PolicyParticipantParameters.yaml deleted file mode 100644 index acaaebbe..00000000 --- a/csit/config/clamp/PolicyParticipantParameters.yaml +++ /dev/null @@ -1,61 +0,0 @@ -spring: - security: - user: - name: participantUser - password: zb!XztG34 - -participant: - pdpGroup: defaultGroup - pdpType: apex - policyApiParameters: - clientName: api - hostname: policy-api - port: 6969 - userName: policyadmin - password: zb!XztG34 - useHttps: false - allowSelfSignedCerts: true - policyPapParameters: - clientName: pap - hostname: policy-pap - port: 6969 - userName: policyadmin - password: zb!XztG34 - useHttps: false - allowSelfSignedCerts: true - intermediaryParameters: - reportingTimeIntervalMs: 120000 - description: Participant Description - participantId: - name: org.onap.PM_Policy - version: 1.0.0 - participantType: - name: org.onap.policy.clamp.acm.PolicyParticipant - version: 2.3.1 - clampAutomationCompositionTopics: - topicSources: - - - topic: POLICY-ACRUNTIME-PARTICIPANT - servers: - - ${topicServer:message-router} - topicCommInfrastructure: dmaap - fetchTimeout: 15000 - useHttps: false - topicSinks: - - - topic: POLICY-ACRUNTIME-PARTICIPANT - servers: - - ${topicServer:message-router} - topicCommInfrastructure: dmaap - useHttps: false -management: - endpoints: - web: - exposure: - include: health, metrics, prometheus -server: - port: 6969 - ssl: - enabled: false - servlet: - context-path: /onap/policy/clamp/acm/policyparticipant diff --git a/csit/config/clamp/groups.json b/csit/config/clamp/groups.json deleted file mode 100644 index 6ee30e1c..00000000 --- a/csit/config/clamp/groups.json +++ /dev/null @@ -1,137 +0,0 @@ -{ - "groups": [ - { - "name": "defaultGroup", - "version": "1.0.0", - "description": "The default group that registers all supported policy types and pdps.", - "pdpGroupState": "ACTIVE", - "pdpSubgroups": [ - { - "pdpType": "xacml", - "supportedPolicyTypes": [ - { - "name": "onap.policies.controlloop.guard.common.FrequencyLimiter", - "version": "1.0.0" - }, - { - "name": "onap.policies.controlloop.guard.common.MinMax", - "version": "1.0.0" - }, - { - "name": "onap.policies.controlloop.guard.common.Blacklist", - "version": "1.0.0" - }, - { - "name": "onap.policies.controlloop.guard.common.Filter", - "version": "1.0.0" - }, - { - "name": "onap.policies.controlloop.guard.coordination.FirstBlocksSecond", - "version": "1.0.0" - }, - { - "name": "onap.policies.monitoring.*", - "version": "1.0.0" - }, - { - "name": "onap.policies.optimization.*", - "version": "1.0.0" - }, - { - "name": "onap.policies.optimization.resource.AffinityPolicy", - "version": "1.0.0" - }, - { - "name": "onap.policies.optimization.resource.DistancePolicy", - "version": "1.0.0" - }, - { - "name": "onap.policies.optimization.resource.HpaPolicy", - "version": "1.0.0" - }, - { - "name": "onap.policies.optimization.resource.OptimizationPolicy", - "version": "1.0.0" - }, - { - "name": "onap.policies.optimization.resource.PciPolicy", - "version": "1.0.0" - }, - { - "name": "onap.policies.optimization.service.QueryPolicy", - "version": "1.0.0" - }, - { - "name": "onap.policies.optimization.service.SubscriberPolicy", - "version": "1.0.0" - }, - { - "name": "onap.policies.optimization.resource.Vim_fit", - "version": "1.0.0" - }, - { - "name": "onap.policies.optimization.resource.VnfPolicy", - "version": "1.0.0" - }, - { - "name": "onap.policies.native.Xacml", - "version": "1.0.0" - }, - { - "name": "onap.policies.Naming", - "version": "1.0.0" - }, - { - "name": "onap.policies.match.*", - "version": "1.0.0" - } - ], - "currentInstanceCount": 0, - "desiredInstanceCount": 1, - "policies": [ - { - "name": "SDNC_Policy.ONAP_NF_NAMING_TIMESTAMP", - "version": "1.0.0" - } - ] - }, - { - "pdpType": "drools", - "supportedPolicyTypes": [ - { - "name": "onap.policies.controlloop.operational.common.Drools", - "version": "1.0.0" - }, - { - "name": "onap.policies.native.drools.Controller", - "version": "1.0.0" - }, - { - "name": "onap.policies.native.drools.Artifact", - "version": "1.0.0" - } - ], - "currentInstanceCount": 0, - "desiredInstanceCount": 1, - "policies": [] - }, - { - "pdpType": "apex", - "supportedPolicyTypes": [ - { - "name": "onap.policies.controlloop.operational.common.Apex", - "version": "1.0.0" - }, - { - "name": "onap.policies.native.Apex", - "version": "1.0.0" - } - ], - "currentInstanceCount": 0, - "desiredInstanceCount": 1, - "policies": [] - } - ] - } - ] -} diff --git a/csit/config/clamp/logback.xml b/csit/config/clamp/logback.xml deleted file mode 100644 index c316e179..00000000 --- a/csit/config/clamp/logback.xml +++ /dev/null @@ -1,206 +0,0 @@ -<!-- - ============LICENSE_START======================================================= - policy-clamp - ================================================================================ - Copyright (C) 2021 Nordix Foundation. - ================================================================================ - 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========================================================= - --> - -<configuration scan="true" scanPeriod="30 seconds" debug="false"> - - <property name="logDir" value="${POLICY_LOGS}" /> - - <property name="errorLog" value="error" /> - <property name="debugLog" value="debug" /> - <property name="networkLog" value="network" /> - - <property name="metricLog" value="metric" /> - <property name="transactionLog" value="audit" /> - - <property name="debugPattern" - value="[%d{yyyy-MM-dd'T'HH:mm:ss.SSS+00:00, UTC}|%level|%logger{0}|%thread] %msg%n" /> - <property name="errorPattern" value="${debugPattern}" /> - <property name="networkPattern" - value="[%d{yyyy-MM-dd'T'HH:mm:ss.SSS+00:00, UTC}|%t]%m%n" /> - - <property - name="mpPreamble" - value="%X{RequestID}|%X{InvocationID}|%X{ServiceName}|%X{PartnerName}" /> - - <property - name="mpTime" - value="%X{BeginTimestamp}|%X{EndTimestamp}|%X{ElapsedTime}" /> - - <property - name="mpLine1" - value="%X{ServiceInstanceID}|%X{VirtualServerName}|%X{StatusCode}|%X{ResponseCode}|%X{ResponseDescription}" /> - - <property - name="mpLine2" - value="%X{InstanceUUID}|%X{Severity}|%X{TargetEntity}|%X{TargetServiceName}|%X{Server}|%X{ServerIPAddress}" /> - - <property - name="mpLine3" - value="%X{ServerFQDN}|%X{ClientIPAddress}|%X{ProcessKey}|%X{RemoteHost}|%X{AlertSeverity}" /> - - <property - name="mpLine4" - value="%X{TargetVirtualEntity}|%level|%thread| %msg%n" /> - - - <property name="metricPattern" - value="{$mpPreamble}|{$mpTime}|{$mpLine1}|{$mpLine2}|{$mpLine3}|$mpLine4" /> - - <property name="transactionPattern" value="${metricPattern}" /> - - <appender name="ErrorOut" - class="ch.qos.logback.core.rolling.RollingFileAppender"> - <file>${logDir}/${errorLog}.log</file> - <rollingPolicy - class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"> - <fileNamePattern>${logDir}/${errorLog}.%d{yyyy-MM-dd}.%i.log.zip - </fileNamePattern> - <maxFileSize>50MB</maxFileSize> - <maxHistory>30</maxHistory> - <totalSizeCap>10GB</totalSizeCap> - </rollingPolicy> - <filter class="ch.qos.logback.classic.filter.ThresholdFilter"> - <level>WARN</level> - </filter> - <encoder> - <pattern>${errorPattern}</pattern> - </encoder> - </appender> - - <appender name="AsyncErrorOut" - class="ch.qos.logback.classic.AsyncAppender"> - <appender-ref ref="ErrorOut" /> - </appender> - - <appender name="DebugOut" - class="ch.qos.logback.core.rolling.RollingFileAppender"> - <file>${logDir}/${debugLog}.log</file> - <rollingPolicy - class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"> - <fileNamePattern>${logDir}/${debugLog}.%d{yyyy-MM-dd}.%i.log.zip - </fileNamePattern> - <maxFileSize>50MB</maxFileSize> - <maxHistory>30</maxHistory> - <totalSizeCap>10GB</totalSizeCap> - </rollingPolicy> - <encoder> - <pattern>${debugPattern}</pattern> - </encoder> - </appender> - - <appender name="AsyncDebugOut" - class="ch.qos.logback.classic.AsyncAppender"> - <appender-ref ref="DebugOut" /> - </appender> - - <appender name="NetworkOut" - class="ch.qos.logback.core.rolling.RollingFileAppender"> - <file>${logDir}/${networkLog}.log</file> - <rollingPolicy - class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"> - <fileNamePattern>${logDir}/${networkLog}.%d{yyyy-MM-dd}.%i.log.zip - </fileNamePattern> - <maxFileSize>50MB</maxFileSize> - <maxHistory>30</maxHistory> - <totalSizeCap>10GB</totalSizeCap> - </rollingPolicy> - <encoder> - <pattern>${networkPattern}</pattern> - </encoder> - </appender> - - <appender name="AsyncNetworkOut" - class="ch.qos.logback.classic.AsyncAppender"> - <appender-ref ref="NetworkOut" /> - </appender> - - <appender name="MetricOut" - class="ch.qos.logback.core.rolling.RollingFileAppender"> - <file>${logDir}/${metricLog}.log</file> - <rollingPolicy - class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"> - <fileNamePattern>${logDir}/${metricLog}.%d{yyyy-MM-dd}.%i.log.zip - </fileNamePattern> - <maxFileSize>50MB</maxFileSize> - <maxHistory>30</maxHistory> - <totalSizeCap>10GB</totalSizeCap> - </rollingPolicy> - <encoder> - <pattern>${metricPattern}</pattern> - </encoder> - </appender> - - <appender name="AsyncMetricOut" - class="ch.qos.logback.classic.AsyncAppender"> - <appender-ref ref="MetricOut" /> - </appender> - - <appender name="TransactionOut" - class="ch.qos.logback.core.rolling.RollingFileAppender"> - <file>${logDir}/${transactionLog}.log</file> - <rollingPolicy - class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"> - <fileNamePattern>${logDir}/${transactionLog}.%d{yyyy-MM-dd}.%i.log.zip - </fileNamePattern> - <maxFileSize>50MB</maxFileSize> - <maxHistory>30</maxHistory> - <totalSizeCap>10GB</totalSizeCap> - </rollingPolicy> - <encoder> - <pattern>${transactionPattern}</pattern> - </encoder> - </appender> - - <appender name="AsyncTransactionOut" - class="ch.qos.logback.classic.AsyncAppender"> - <appender-ref ref="TransactionOut" /> - </appender> - - <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> - <encoder> - <Pattern>[%d{yyyy-MM-dd'T'HH:mm:ss.SSS+00:00, UTC}|%level|%logger{0}|%thread] %msg%n</Pattern> - </encoder> - </appender> - - <appender name="AsyncStdOut" class="ch.qos.logback.classic.AsyncAppender"> - <appender-ref ref="STDOUT" /> - </appender> - - <logger name="network" level="INFO" additivity="false"> - <appender-ref ref="AsyncNetworkOut" /> - <appender-ref ref="AsyncStdOut" /> - </logger> - - <logger name="org.eclipse.jetty.server.RequestLog" level="info" additivity="false"> - <appender-ref ref="AsyncNetworkOut" /> - <appender-ref ref="AsyncStdOut" /> - </logger> - - <logger name="org.eclipse.jetty" level="ERROR" /> - - <root level="INFO"> - <appender-ref ref="AsyncDebugOut" /> - <appender-ref ref="AsyncErrorOut" /> - <appender-ref ref="AsyncMetricOut" /> - <appender-ref ref="AsyncTransactionOut" /> - <appender-ref ref="AsyncStdOut" /> - </root> - -</configuration> diff --git a/csit/run-k8s-csit.sh b/csit/run-k8s-csit.sh new file mode 100755 index 00000000..79da27c6 --- /dev/null +++ b/csit/run-k8s-csit.sh @@ -0,0 +1,442 @@ +#!/bin/bash +# +# ============LICENSE_START==================================================== +# Copyright (C) 2023 Nordix Foundation. +# ============================================================================= +# 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. +# +# SPDX-License-Identifier: Apache-2.0 +# ============LICENSE_END====================================================== + +# This script generates dummy robot result files for jenkins since k8s CSIT is not supported. + +if [ -z "${WORKSPACE}" ]; then + WORKSPACE=$(git rev-parse --show-toplevel) + export WORKSPACE +fi + +export ROBOT_LOG_DIR=${WORKSPACE}/csit/archives/$2 + +mkdir -p $ROBOT_LOG_DIR + +echo "This version of policy does not support CSIT in kubernetes. Generating dummy results..." + +cat >${ROBOT_LOG_DIR}/output.xml <<EOF +<robot generator="Robot 6.1a1 (Python 3.11.2 on linux)" rpa="false" schemaversion="4"> +<statistics> +<total> +<stat pass="1" fail="0" skip="0">All Tests</stat> +</total> +<tag> +</tag> +<suite> +<stat pass="1" fail="0" skip="0" id="s1" name="Dummy-Test">Dummy-Test</stat> +</suite> +</statistics> +<errors></errors> +</robot> +EOF + +cat >${ROBOT_LOG_DIR}/log.html <<EOF +<!DOCTYPE html> +<head> + <style media="all" type="text/css"> + /* Generic and misc styles */ + body { + font-family: Helvetica, sans-serif; + font-size: 0.8em; + color: black; + padding: 6px; + background: white; + } + table { + table-layout: fixed; + word-wrap: break-word; + empty-cells: show; + font-size: 1em; + } + th, td { + vertical-align: top; + } + br { + mso-data-placement: same-cell; /* maintain line breaks in Excel */ + } + hr { + background: #ccc; + height: 1px; + border: 0; + } + a, a:link, a:visited { + text-decoration: none; + color: #15c; + } + a > img { + border: 1px solid #15c !important; + } + a:hover, a:active { + text-decoration: underline; + color: #61c; + } + .parent-name { + font-size: 0.7em; + letter-spacing: -0.07em; + } + .message { + white-space: pre-wrap; + } + /* Headers */ + #header { + width: 65em; + height: 3em; + margin: 6px 0; + } + h1 { + float: left; + margin: 0 0 0.5em 0; + width: 75%; + } + h2 { + clear: left; + } + #generated { + float: right; + text-align: right; + font-size: 0.9em; + white-space: nowrap; + } + /* Documentation headers */ + .doc > h2 { + font-size: 1.2em; + } + .doc > h3 { + font-size: 1.1em; + } + .doc > h4 { + font-size: 1.0em; + } + /* Status text colors -- !important allows using them in links */ + .fail { + color: #ce3e01 !important; + font-weight: bold; + } + .pass { + color: #098a09 !important; + } + .skip { + color: #927201 !important; + font-weight: bold; + } + .label { + padding: 2px 5px; + font-size: 0.75em; + letter-spacing: 1px; + white-space: nowrap; + color: black; + background-color: #ddd; + border-radius: 3px; + } + .label.debug, .label.trace, .label.error, .label.keyword { + letter-spacing: 0; + } + .label.pass, .label.fail, .label.error, .label.skip, .label.warn { + font-weight: bold; + } + .label.pass { + background-color: #97bd61; + color: #000 !important; + } + .label.fail, .label.error { + background-color: #ce3e01; + color: #fff !important; + } + .label.skip, .label.warn { + background-color: #fed84f; + color: #000 !important; + } + /* Top right header */ + #top-right-header { + position: fixed; + top: 0; + right: 0; + z-index: 1000; + width: 12em; + text-align: center; + } + #report-or-log-link a { + display: block; + background: black; + color: white; + text-decoration: none; + font-weight: bold; + letter-spacing: 0.1em; + padding: 0.3em 0; + border-bottom-left-radius: 4px; + } + #report-or-log-link a:hover { + color: #ddd; + } + #log-level-selector { + padding: 0.3em 0; + font-size: 0.9em; + border-bottom-left-radius: 4px; + background: #ddd; + } + /* Statistics table */ + .statistics { + width: 65em; + border-collapse: collapse; + empty-cells: show; + margin-bottom: 1em; + } + .statistics tr:hover { + background: #f4f4f4; + cursor: pointer; + } + .statistics th, .statistics td { + border: 1px solid #ccc; + padding: 0.1em 0.3em; + } + .statistics th { + background-color: #ddd; + padding: 0.2em 0.3em; + } + .statistics td { + vertical-align: middle; + } + .stats-col-stat { + width: 4.5em; + text-align: center; + } + .stats-col-elapsed { + width: 5.5em; + text-align: center; + } + .stats-col-graph { + width: 9em; + } + th.stats-col-graph:hover { + cursor: default; + } + .stat-name { + float: left; + } + .stat-name a, .stat-name span { + font-weight: bold; + } + .tag-links { + font-size: 0.9em; + float: right; + margin-top: 0.05em; + } + .tag-links span { + margin-left: 0.2em; + } + /* Statistics graph */ + .graph, .empty-graph { + border: 1px solid #ccc; + width: auto; + height: 7px; + padding: 0; + background: #aaa; + } + .empty-graph { + background: #eee; + } + .pass-bar, .fail-bar, .skip-bar { + float: left; + height: 100%; + } + .fail-bar { + background: #ce3e01; + } + .pass-bar { + background: #97bd61; + } + .skip-bar { + background: #fed84f; + } + /* Tablesorter - adapted from provided Blue Skin */ + .tablesorter-header { + background-image: url(data:image/gif;base64,R0lGODlhCwAJAIAAAH9/fwAAACH5BAEAAAEALAAAAAALAAkAAAIRjAOnBr3cnIr0WUjTrC9e9BQAOw==); + background-repeat: no-repeat; + background-position: center right; + cursor: pointer; + } + .tablesorter-header:hover { + background-color: #ccc; + } + .tablesorter-headerAsc { + background-image: url(data:image/gif;base64,R0lGODlhCwAJAKEAAAAAAH9/fwAAAAAAACH5BAEAAAIALAAAAAALAAkAAAIUlBWnFr3cnIr0WQOyBmvzp13CpxQAOw==); + background-color: #ccc !important; + } + .tablesorter-headerDesc { + background-image: url(data:image/gif;base64,R0lGODlhCwAJAKEAAAAAAH9/fwAAAAAAACH5BAEAAAIALAAAAAALAAkAAAIUlAWnBr3cnIr0WROyDmvzp13CpxQAOw==); + background-color: #ccc !important; + } + .sorter-false { + background-image: none; + cursor: default; + } + .sorter-false:hover { + background-color: #ddd; + } + </style> + + +</head> +<body> + <div id="statistics-container"> + <h2>Test Statistics</h2> + <table class="statistics tablesorter tablesorter-default tablesorter2e2fe879cc465" id="total-stats" role="grid"> + <thead> + <tr role="row" class="tablesorter-headerRow"> + <th class="stats-col-name tablesorter-header tablesorter-headerUnSorted" data-column="0" tabindex="0" scope="col" role="columnheader" aria-disabled="false" aria-controls="total-stats" unselectable="on" aria-sort="none" aria-label="Total Statistics: No sort applied, activate to apply an ascending sort" style="user-select: none;"> + <div class="tablesorter-header-inner">Total Statistics</div> + </th> + <th class="stats-col-stat tablesorter-header tablesorter-headerUnSorted" data-column="1" tabindex="0" scope="col" role="columnheader" aria-disabled="false" aria-controls="total-stats" unselectable="on" aria-sort="none" aria-label="Total: No sort applied, activate to apply a descending sort" style="user-select: none;"> + <div class="tablesorter-header-inner">Total</div> + </th> + <th class="stats-col-stat tablesorter-header tablesorter-headerUnSorted" data-column="2" tabindex="0" scope="col" role="columnheader" aria-disabled="false" aria-controls="total-stats" unselectable="on" aria-sort="none" aria-label="Pass: No sort applied, activate to apply a descending sort" style="user-select: none;"> + <div class="tablesorter-header-inner">Pass</div> + </th> + <th class="stats-col-stat tablesorter-header tablesorter-headerUnSorted" data-column="3" tabindex="0" scope="col" role="columnheader" aria-disabled="false" aria-controls="total-stats" unselectable="on" aria-sort="none" aria-label="Fail: No sort applied, activate to apply a descending sort" style="user-select: none;"> + <div class="tablesorter-header-inner">Fail</div> + </th> + <th class="stats-col-stat tablesorter-header tablesorter-headerUnSorted" data-column="4" tabindex="0" scope="col" role="columnheader" aria-disabled="false" aria-controls="total-stats" unselectable="on" aria-sort="none" aria-label="Skip: No sort applied, activate to apply a descending sort" style="user-select: none;"> + <div class="tablesorter-header-inner">Skip</div> + </th> + <th class="stats-col-elapsed tablesorter-header tablesorter-headerUnSorted" title="Total execution time of these tests. Excludes suite setups and teardowns." data-column="5" tabindex="0" scope="col" role="columnheader" aria-disabled="false" aria-controls="total-stats" unselectable="on" aria-sort="none" aria-label="Elapsed: No sort applied, activate to apply a descending sort" style="user-select: none;"> + <div class="tablesorter-header-inner">Elapsed</div> + </th> + <th class="stats-col-graph tablesorter-header sorter-false tablesorter-headerUnSorted" data-column="6" scope="col" role="columnheader" aria-disabled="true" unselectable="on" aria-sort="none" aria-label="Pass / Fail / Skip: No sort applied, sorting is disabled" style="user-select: none;"> + <div class="tablesorter-header-inner">Pass / Fail / Skip</div> + </th> + </tr> + </thead> + <tbody aria-live="polite" aria-relevant="all"> + <tr class="row-0" role="row"> + <td class="stats-col-name"> + <div class="stat-name"> + <span>All Tests</span> + </div> + </td> + <td class="stats-col-stat">1</td> + <td class="stats-col-stat">1</td> + <td class="stats-col-stat">0</td> + <td class="stats-col-stat">0</td> + <td class="stats-col-elapsed" title="Total execution time of these tests. Excludes suite setups and teardowns.">00:00:00</td> + <td class="stats-col-graph"> + <div class="graph"> + <div class="pass-bar" style="width: 100%" title="100%"></div> + <div class="fail-bar" style="width: 0%" title="0%"></div> + <div class="skip-bar" style="width: 0%" title="0%"></div> + </div> + </td> + </tr> + </tbody> + </table> + <table class="statistics tablesorter tablesorter-default tablesorter8e8ffd77a824a" id="tag-stats" role="grid"> + <thead> + <tr role="row" class="tablesorter-headerRow"> + <th class="stats-col-name tablesorter-header tablesorter-headerUnSorted" data-column="0" tabindex="0" scope="col" role="columnheader" aria-disabled="false" aria-controls="tag-stats" unselectable="on" aria-sort="none" aria-label="Statistics by Tag: No sort applied, activate to apply an ascending sort" style="user-select: none;"> + <div class="tablesorter-header-inner">Statistics by Tag</div> + </th> + <th class="stats-col-stat tablesorter-header tablesorter-headerUnSorted" data-column="1" tabindex="0" scope="col" role="columnheader" aria-disabled="false" aria-controls="tag-stats" unselectable="on" aria-sort="none" aria-label="Total: No sort applied, activate to apply a descending sort" style="user-select: none;"> + <div class="tablesorter-header-inner">Total</div> + </th> + <th class="stats-col-stat tablesorter-header tablesorter-headerUnSorted" data-column="2" tabindex="0" scope="col" role="columnheader" aria-disabled="false" aria-controls="tag-stats" unselectable="on" aria-sort="none" aria-label="Pass: No sort applied, activate to apply a descending sort" style="user-select: none;"> + <div class="tablesorter-header-inner">Pass</div> + </th> + <th class="stats-col-stat tablesorter-header tablesorter-headerUnSorted" data-column="3" tabindex="0" scope="col" role="columnheader" aria-disabled="false" aria-controls="tag-stats" unselectable="on" aria-sort="none" aria-label="Fail: No sort applied, activate to apply a descending sort" style="user-select: none;"> + <div class="tablesorter-header-inner">Fail</div> + </th> + <th class="stats-col-stat tablesorter-header tablesorter-headerUnSorted" data-column="4" tabindex="0" scope="col" role="columnheader" aria-disabled="false" aria-controls="tag-stats" unselectable="on" aria-sort="none" aria-label="Skip: No sort applied, activate to apply a descending sort" style="user-select: none;"> + <div class="tablesorter-header-inner">Skip</div> + </th> + <th class="stats-col-elapsed tablesorter-header tablesorter-headerUnSorted" title="Total execution time of these tests. Excludes suite setups and teardowns." data-column="5" tabindex="0" scope="col" role="columnheader" aria-disabled="false" aria-controls="tag-stats" unselectable="on" aria-sort="none" aria-label="Elapsed: No sort applied, activate to apply a descending sort" style="user-select: none;"> + <div class="tablesorter-header-inner">Elapsed</div> + </th> + <th class="stats-col-graph tablesorter-header sorter-false tablesorter-headerUnSorted" data-column="6" scope="col" role="columnheader" aria-disabled="true" unselectable="on" aria-sort="none" aria-label="Pass / Fail / Skip: No sort applied, sorting is disabled" style="user-select: none;"> + <div class="tablesorter-header-inner">Pass / Fail / Skip</div> + </th> + </tr> + </thead> + <tbody aria-live="polite" aria-relevant="all"> + <tr class="row-0" role="row"> + <td class="stats-col-name">No Tags</td> + <td class="stats-col-stat"></td> + <td class="stats-col-stat"></td> + <td class="stats-col-stat"></td> + <td class="stats-col-stat"></td> + <td class="stats-col-elapsed" title="Total execution time of these tests. Excludes suite setups and teardowns."></td> + <td class="stats-col-graph"> + <div class="empty-graph"></div> + </td> + </tr> + </tbody> + </table> + <table class="statistics tablesorter tablesorter-default tablesorter06030fd685e0f" id="suite-stats" role="grid"> + <thead> + <tr role="row" class="tablesorter-headerRow"> + <th class="stats-col-name tablesorter-header tablesorter-headerUnSorted" data-column="0" tabindex="0" scope="col" role="columnheader" aria-disabled="false" aria-controls="suite-stats" unselectable="on" aria-sort="none" aria-label="Statistics by Suite: No sort applied, activate to apply an ascending sort" style="user-select: none;"> + <div class="tablesorter-header-inner">Statistics by Suite</div> + </th> + <th class="stats-col-stat tablesorter-header tablesorter-headerUnSorted" data-column="1" tabindex="0" scope="col" role="columnheader" aria-disabled="false" aria-controls="suite-stats" unselectable="on" aria-sort="none" aria-label="Total: No sort applied, activate to apply a descending sort" style="user-select: none;"> + <div class="tablesorter-header-inner">Total</div> + </th> + <th class="stats-col-stat tablesorter-header tablesorter-headerUnSorted" data-column="2" tabindex="0" scope="col" role="columnheader" aria-disabled="false" aria-controls="suite-stats" unselectable="on" aria-sort="none" aria-label="Pass: No sort applied, activate to apply a descending sort" style="user-select: none;"> + <div class="tablesorter-header-inner">Pass</div> + </th> + <th class="stats-col-stat tablesorter-header tablesorter-headerUnSorted" data-column="3" tabindex="0" scope="col" role="columnheader" aria-disabled="false" aria-controls="suite-stats" unselectable="on" aria-sort="none" aria-label="Fail: No sort applied, activate to apply a descending sort" style="user-select: none;"> + <div class="tablesorter-header-inner">Fail</div> + </th> + <th class="stats-col-stat tablesorter-header tablesorter-headerUnSorted" data-column="4" tabindex="0" scope="col" role="columnheader" aria-disabled="false" aria-controls="suite-stats" unselectable="on" aria-sort="none" aria-label="Skip: No sort applied, activate to apply a descending sort" style="user-select: none;"> + <div class="tablesorter-header-inner">Skip</div> + </th> + <th class="stats-col-elapsed tablesorter-header tablesorter-headerUnSorted" title="Total execution time of this suite." data-column="5" tabindex="0" scope="col" role="columnheader" aria-disabled="false" aria-controls="suite-stats" unselectable="on" aria-sort="none" aria-label="Elapsed: No sort applied, activate to apply a descending sort" style="user-select: none;"> + <div class="tablesorter-header-inner">Elapsed</div> + </th> + <th class="stats-col-graph tablesorter-header sorter-false tablesorter-headerUnSorted" data-column="6" scope="col" role="columnheader" aria-disabled="true" unselectable="on" aria-sort="none" aria-label="Pass / Fail / Skip: No sort applied, sorting is disabled" style="user-select: none;"> + <div class="tablesorter-header-inner">Pass / Fail / Skip</div> + </th> + </tr> + </thead> + <tbody aria-live="polite" aria-relevant="all"> + <tr onclick="makeElementVisible('s1')" class="row-0" role="row"> + <td class="stats-col-name" title="pap"> + <div class="stat-name"> + <span href="#s1"> + <span class="parent-name"></span>Dummy Test</span> + </div> + </td> + <td class="stats-col-stat">1</td> + <td class="stats-col-stat">1</td> + <td class="stats-col-stat">0</td> + <td class="stats-col-stat">0</td> + <td class="stats-col-elapsed" title="Total execution time of this suite.">00:00:00</td> + <td class="stats-col-graph"> + <div class="graph"> + <div class="pass-bar" style="width: 100%" title="100%"></div> + <div class="fail-bar" style="width: 0%" title="0%"></div> + <div class="skip-bar" style="width: 0%" title="0%"></div> + </div> + </td> + </tr> + </tbody> + </table> + </div> +</body> +</html> +EOF + +cp ${ROBOT_LOG_DIR}/log.html ${ROBOT_LOG_DIR}/report.html |