Updated tests PMS persistency

Replaced kubeproxy with more efficient proxy

Issue-ID: NONRTRIC-486
Signed-off-by: BjornMagnussonXA <bjorn.magnusson@est.tech>
Change-Id: Ib976cc2b2ef4856ba4c2665c90cf6b6525972f14
diff --git a/test/auto-test/FTC805.sh b/test/auto-test/FTC805.sh
index 13f534e..c563bb0 100755
--- a/test/auto-test/FTC805.sh
+++ b/test/auto-test/FTC805.sh
@@ -208,7 +208,6 @@
 
         start_timer "Restore $((NUM_POLICIES_PER_RIC*$NUM_RICS)) polices after restart over $interface using "$__httpx
 
-
         api_equal json:policies $INSTANCES 500
 
         for ((i=1; i<=$NUM_RICS; i++))
@@ -253,7 +252,6 @@
             sim_equal ricsim_g1_$i num_instances 0
         done
 
-
         for ((i=1; i<=$NUM_RICS; i++))
         do
             if [ $interface == "REST+SDNC" ]; then
diff --git a/test/auto-test/FTC_HELM-RECIPE.sh b/test/auto-test/FTC_HELM_RECIPE_CHERRY.sh
similarity index 98%
rename from test/auto-test/FTC_HELM-RECIPE.sh
rename to test/auto-test/FTC_HELM_RECIPE_CHERRY.sh
index cbebf60..7465b40 100755
--- a/test/auto-test/FTC_HELM-RECIPE.sh
+++ b/test/auto-test/FTC_HELM_RECIPE_CHERRY.sh
@@ -17,7 +17,7 @@
 #  ============LICENSE_END=================================================
 #
 
-TC_ONELINE_DESCR="Sanity test of Non-RT RIC Helm recepie - all components"
+TC_ONELINE_DESCR="Sanity test of Non-RT RIC Helm recepie - all components - CHERRY release"
 
 #App names to include in the test when running docker, space separated list
 DOCKER_INCLUDED_IMAGES="" # Not used -  KUBE only test script
@@ -28,7 +28,7 @@
 KUBE_PRESTARTED_IMAGES=" PA RICSIM CP ECS RC SDNC"
 
 #Supported test environment profiles
-SUPPORTED_PROFILES="ORAN-CHERRY ORAN-DAWN"
+SUPPORTED_PROFILES="ORAN-CHERRY"
 #Supported run modes
 SUPPORTED_RUNMODES="KUBE"
 
diff --git a/test/auto-test/FTC_HELM-RECIPE.sh b/test/auto-test/FTC_HELM_RECIPE_DAWN.sh
similarity index 80%
copy from test/auto-test/FTC_HELM-RECIPE.sh
copy to test/auto-test/FTC_HELM_RECIPE_DAWN.sh
index cbebf60..7d8f079 100755
--- a/test/auto-test/FTC_HELM-RECIPE.sh
+++ b/test/auto-test/FTC_HELM_RECIPE_DAWN.sh
@@ -17,7 +17,7 @@
 #  ============LICENSE_END=================================================
 #
 
-TC_ONELINE_DESCR="Sanity test of Non-RT RIC Helm recepie - all components"
+TC_ONELINE_DESCR="Sanity test of Non-RT RIC Helm recepie - all components - DAWN release"
 
 #App names to include in the test when running docker, space separated list
 DOCKER_INCLUDED_IMAGES="" # Not used -  KUBE only test script
@@ -28,7 +28,7 @@
 KUBE_PRESTARTED_IMAGES=" PA RICSIM CP ECS RC SDNC"
 
 #Supported test environment profiles
-SUPPORTED_PROFILES="ORAN-CHERRY ORAN-DAWN"
+SUPPORTED_PROFILES="ORAN-DAWN"
 #Supported run modes
 SUPPORTED_RUNMODES="KUBE"
 
@@ -58,12 +58,14 @@
 if [ $ECS_VERSION == "V1-1" ]; then
     use_rapp_catalogue_http # https not yet supported
 else
-    use_rapp_catalogue_https
+    ########################################use_rapp_catalogue_https
+    use_rapp_catalogue_http
 fi
 
 echo -e "$RED CHECK WHY RC HTTPS DOES NOT WORK $ERED"
 
-use_control_panel_https
+###############################use_control_panel_https
+use_control_panel_http
 
 if [ "$PMS_VERSION" == "V1" ]; then
    echo "PMS VERSION 2 (V2) is required"
@@ -72,9 +74,11 @@
 
 clean_environment
 
-if [ $RUNMODE == "KUBE" ]; then
-    start_kube_proxy
-fi
+pms_kube_pvc_reset
+
+ecs_kube_pvc_reset
+
+start_kube_proxy
 
 STD_NUM_RICS=2
 OSC_NUM_RICS=2
@@ -144,7 +148,6 @@
     sim_print "a1-sim-osc-"$i interface
 done
 
-
 # Load the polictypes in STD 2
 for ((i=0; i<$STD_NUM_RICS; i++))
 do
@@ -198,6 +201,24 @@
     api_get_policy_type 200 2 testdata/OSC/2-agent-modified.json
 done
 
+if [ "$PMS_VERSION" == "V2" ]; then
+
+    api_equal json:policy-types 5 120
+
+    api_equal json:policies 0
+
+    api_equal json:policy-instances 0
+else
+
+    api_equal json:policy_schemas 5 120
+
+    api_equal json:policy_types 5
+
+    api_equal json:policies 0
+
+    api_equal json:policy_ids 0
+fi
+
 api_put_service 201 "Emergency-response-app" 0 "$CR_SERVICE_PATH/ER-app"
 
 # Create policies in STD
@@ -244,6 +265,46 @@
     sim_equal "a1-sim-osc-"$i num_instances 2
 done
 
+stop_policy_agent
+
+start_stopped_policy_agent
+
+# Check PMS state after restart
+
+sleep_wait 200
+
+if [ "$PMS_VERSION" == "V2" ]; then
+
+    api_equal json:policy-types 5 120
+
+    api_equal json:policies 12
+
+    api_equal json:policy-instances 12
+else
+
+    api_equal json:policy_schemas 5 120
+
+    api_equal json:policy_types 5
+
+    api_equal json:policies 12
+
+    api_equal json:policy_ids 12
+fi
+
+# Check the number of policies in STD and STD2
+for ((i=0; i<$STD_NUM_RICS; i++))
+do
+    sim_equal "a1-sim-std-"$i num_instances 2
+    sim_equal "a1-sim-std2-"$i num_instances 2
+done
+
+# Check the number of policies in OSC
+for ((i=0; i<$STD_NUM_RICS; i++))
+do
+    sim_equal "a1-sim-osc-"$i num_instances 2
+done
+
+
 echo "ADD EVENT/STATUS CHECK"
 echo "ADD MR CHECK"
 
@@ -269,9 +330,18 @@
 ecs_api_service_status 200
 
 ## Setup prod-a
-ecs_api_edp_put_producer 201 prod-a $CB_JOB/prod-a $CB_SV/prod-a type1 testdata/ecs/ei-type-1.json
+if [ $ECS_VERSION == "V1-1" ]; then
+    ecs_api_edp_put_producer 201 prod-a $CB_JOB/prod-a $CB_SV/prod-a type1 testdata/ecs/ei-type-1.json
 
-ecs_api_edp_get_producer 200 prod-a $CB_JOB/prod-a $CB_SV/prod-a type1 testdata/ecs/ei-type-1.json
+    ecs_api_edp_get_producer 200 prod-a $CB_JOB/prod-a $CB_SV/prod-a type1 testdata/ecs/ei-type-1.json
+else
+    ecs_api_edp_put_type_2 201 type1 testdata/ecs/ei-type-1.json
+    ecs_api_edp_get_type_2 200 type1
+    ecs_api_edp_get_type_ids 200 type1
+
+    ecs_api_edp_put_producer_2 201 prod-a $CB_JOB/prod-a $CB_SV/prod-a type1
+    ecs_api_edp_put_producer_2 200 prod-a $CB_JOB/prod-a $CB_SV/prod-a type1
+fi
 
 ecs_api_edp_get_producer_status 200 prod-a ENABLED
 
@@ -306,7 +376,19 @@
     prodstub_check_jobdata_2 200 prod-a job2 type1 $TARGET2 ricsim_g3_2 testdata/ecs/job-template.json
 fi
 
-echo "ADD EVENT/STATUS CHECK"
+stop_ecs
+
+start_stopped_ecs
+
+# Check ECS status after restart
+
+if [  -z "$FLAT_A1_EI" ]; then
+    ecs_api_a1_get_job_status 200 type1 job1 DISABLED
+    ecs_api_a1_get_job_status 200 type1 job2 DISABLED
+else
+    ecs_api_a1_get_job_status 200 job1 DISABLED
+    ecs_api_a1_get_job_status 200 job2 DISABLED
+fi
 
 check_policy_agent_logs
 check_ecs_logs
diff --git a/test/common/agent_api_functions.sh b/test/common/agent_api_functions.sh
index cb48d78..82dde44 100644
--- a/test/common/agent_api_functions.sh
+++ b/test/common/agent_api_functions.sh
@@ -270,9 +270,13 @@
 		fi
 
 		# Keep the initial worker node in case the pod need to be "restarted" - must be made to the same node due to a volume mounted on the host
-		__PA_WORKER_NODE=$(kubectl get pod -l "autotest=PA" -n $KUBE_NONRTRIC_NAMESPACE -o jsonpath='{.items[*].spec.nodeName}')
-		if [ -z "$__PA_WORKER_NODE" ]; then
-			echo -e $YELLOW" Cannot find worker node for pod for $POLICY_AGENT_APP_NAME, persistency may not work"$EYELLOW
+		if [ $retcode_i -eq 0 ]; then
+			__PA_WORKER_NODE=$(kubectl get pod -l "autotest=PA" -n $KUBE_NONRTRIC_NAMESPACE -o jsonpath='{.items[*].spec.nodeName}')
+			if [ -z "$__PA_WORKER_NODE" ]; then
+				echo -e $YELLOW" Cannot find worker node for pod for $POLICY_AGENT_APP_NAME, persistency may not work"$EYELLOW
+			fi
+		else
+			echo -e $YELLOW" Persistency may not work for app $POLICY_AGENT_APP_NAME in multi-worker node config when running it as a prestarted app"$EYELLOW
 		fi
 
 		echo " Retrieving host and ports for service..."
@@ -374,6 +378,13 @@
 	echo -e $BOLD"Stopping $POLICY_AGENT_DISPLAY_NAME"$EBOLD
 
 	if [ $RUNMODE == "KUBE" ]; then
+
+		__check_prestarted_image "PA"
+		if [ $? -eq 0 ]; then
+			echo -e $YELLOW" Persistency may not work for app $POLICY_AGENT_APP_NAME in multi-worker node config when running it as a prestarted app"$EYELLOW
+			__kube_scale deployment $POLICY_AGENT_APP_NAME $KUBE_NONRTRIC_NAMESPACE 0
+			return 0
+		fi
 		__kube_scale_all_resources $KUBE_NONRTRIC_NAMESPACE autotest PA
 		echo "  Deleting the replica set - a new will be started when the app is started"
 		tmp=$(kubectl delete rs -n $KUBE_NONRTRIC_NAMESPACE -l "autotest=PA")
@@ -404,6 +415,14 @@
 
 	if [ $RUNMODE == "KUBE" ]; then
 
+		__check_prestarted_image "PA"
+		if [ $? -eq 0 ]; then
+			echo -e $YELLOW" Persistency may not work for app $POLICY_AGENT_APP_NAME in multi-worker node config when running it as a prestarted app"$EYELLOW
+			__kube_scale deployment $POLICY_AGENT_APP_NAME $KUBE_NONRTRIC_NAMESPACE 1
+			__check_service_start $POLICY_AGENT_APP_NAME $PA_PATH$POLICY_AGENT_ALIVE_URL
+			return 0
+		fi
+
 		# Tie the PMS to the same worker node it was initially started on
 		# A PVC of type hostPath is mounted to PMS, for persistent storage, so the PMS must always be on the node which mounted the volume
 		if [ -z "$__PA_WORKER_NODE" ]; then
@@ -419,7 +438,6 @@
 			fi
 			__kube_scale deployment $POLICY_AGENT_APP_NAME $KUBE_NONRTRIC_NAMESPACE 1
 		fi
-
 	else
 		docker start $POLICY_AGENT_APP_NAME &> ./tmp/.dockererr
 		if [ $? -ne 0 ]; then
@@ -2172,4 +2190,23 @@
 
 	__log_test_pass
 	return 0
+}
+
+##########################################
+####     Reset types and instances    ####
+##########################################
+
+# Admin reset to remove all policies and services
+# All types and instances etc are removed - types and instances in a1 sims need to be removed separately
+# NOTE - only works in kubernetes and the pod should not be running
+# args: -
+# (Function for test scripts)
+
+pms_kube_pvc_reset() {
+	__log_test_start $@
+
+	__kube_clean_pvc $POLICY_AGENT_APP_NAME nonrtric policymanagementservice-vardata-pvc /var/policy-management-service/database
+
+	__log_test_pass
+	return 0
 }
\ No newline at end of file
diff --git a/test/common/create_policies_process.py b/test/common/create_policies_process.py
index b97904b..480d5cb 100644
--- a/test/common/create_policies_process.py
+++ b/test/common/create_policies_process.py
@@ -89,7 +89,8 @@
         start=start
         stop=count*num_rics+start
 
-        total_retry_count=0
+        http_retry_count=0
+        connect_retry_count=0
 
         for i in range(start,stop):
             if (i%pids == (pid_id-1)):
@@ -97,6 +98,7 @@
                 ric_id=(i%num_rics)+1
                 ric=ric_base+str(ric_id)
 
+                connect_ok=False
                 retry_cnt=5
                 while(retry_cnt>0):
                     try:
@@ -128,31 +130,35 @@
                             resp=requests.put(url, data_out, headers=headers, verify=False, timeout=90)
                         else:
                             resp=requests.put(url, data_out, headers=headers, verify=False, timeout=90, proxies=proxydict)
+                        connect_ok=True
                     except Exception as e1:
-                        print("1Put failed for id:"+uuid+str(i)+ ", "+str(e1) + " "+traceback.format_exc())
-                        sys.exit()
-
-                    if (resp.status_code == None):
-                        print("1Put failed for id:"+uuid+str(i)+ ", expected response code: "+str(responsecode)+", got: None")
-                        sys.exit()
-
-                    if (resp.status_code != responsecode):
-                        if (resp.status_code == 503 ) and (retry_cnt > 1):
+                        if (retry_cnt > 1):
                             sleep(0.1)
                             retry_cnt -= 1
-                            total_retry_count += 1
+                            connect_retry_count += 1
                         else:
-                            print("1Put failed for id:"+uuid+str(i)+ ", expected response code: "+str(responsecode)+", got: "+str(resp.status_code))
-                            print(url_out)
-                            print(str(data_out))
+                            print("1Put failed for id:"+uuid+str(i)+ ", "+str(e1) + " "+traceback.format_exc())
                             sys.exit()
-                    else:
-                        retry_cnt=-1
 
-    if (total_retry_count > 0):
-        print("0 retries:"+str(total_retry_count))
-    else:
-        print("0")
+                    if (connect_ok == True):
+                        if (resp.status_code == None):
+                            print("1Put failed for id:"+uuid+str(i)+ ", expected response code: "+str(responsecode)+", got: None")
+                            sys.exit()
+
+                        if (resp.status_code != responsecode):
+                            if (resp.status_code >= 500) and (http_retry_count < 600 ) and (retry_cnt > 1):
+                                sleep(0.1)
+                                retry_cnt -= 1
+                                http_retry_count += 1
+                            else:
+                                print("1Put failed for id:"+uuid+str(i)+ ", expected response code: "+str(responsecode)+", got: "+str(resp.status_code))
+                                print(url_out)
+                                print(str(data_out))
+                                sys.exit()
+                        else:
+                            retry_cnt=-1
+
+    print("0 http retries:"+str(http_retry_count) + ", connect retries: "+str(connect_retry_count))
     sys.exit()
 
 except Exception as e:
diff --git a/test/common/delete_policies_process.py b/test/common/delete_policies_process.py
index ec69e13..530e877 100644
--- a/test/common/delete_policies_process.py
+++ b/test/common/delete_policies_process.py
@@ -56,11 +56,13 @@
     if uuid == "NOUUID":
         uuid=""
 
-    total_retry_count=0
+    http_retry_count=0
+    connect_retry_count=0
 
     stop=count*num_rics+start
     for i in range(start,stop):
         if (i%pids == (pid_id-1)):
+            connect_ok=False
             retry_cnt=5
             while(retry_cnt>0):
                 if ("/v2/policies/" in baseurl):
@@ -72,27 +74,32 @@
                         resp=requests.delete(url, verify=False, timeout=90)
                     else:
                         resp=requests.delete(url, verify=False, timeout=90, proxies=proxydict)
+                    cconnect_ok=True
                 except Exception as e1:
-                    print("1Delete failed for id:"+uuid+str(i)+ ", "+str(e1) + " "+traceback.format_exc())
-                    sys.exit()
-                if (resp.status_code == None):
-                    print("1Delete failed for id:"+uuid+str(i)+ ", expected response code: "+str(responsecode)+", got: None")
-                    sys.exit()
-                if (resp.status_code != responsecode):
-                    if (resp.status_code == 503 ) and (retry_cnt > 1):
+                    if (retry_cnt > 1):
                         sleep(0.1)
                         retry_cnt -= 1
-                        total_retry_count += 1
+                        connect_retry_count += 1
                     else:
-                        print("1Delete failed for id:"+uuid+str(i)+ ", expected response code: "+str(responsecode)+", got: "+str(resp.status_code)+str(resp.raw))
+                        print("1Delete failed for id:"+uuid+str(i)+ ", "+str(e1) + " "+traceback.format_exc())
                         sys.exit()
-                else:
-                    retry_cnt=-1
 
-    if (total_retry_count > 0):
-        print("0 retries:"+str(total_retry_count))
-    else:
-        print("0")
+                if (cconnect_ok == True):
+                    if (resp.status_code == None):
+                        print("1Delete failed for id:"+uuid+str(i)+ ", expected response code: "+str(responsecode)+", got: None")
+                        sys.exit()
+                    if (resp.status_code != responsecode):
+                        if (resp.status_code >= 500) and (http_retry_count < 600 ) and (retry_cnt > 1):
+                            sleep(0.1)
+                            retry_cnt -= 1
+                            http_retry_count += 1
+                        else:
+                            print("1Delete failed for id:"+uuid+str(i)+ ", expected response code: "+str(responsecode)+", got: "+str(resp.status_code)+str(resp.raw))
+                            sys.exit()
+                    else:
+                        retry_cnt=-1
+
+    print("0 http retries:"+str(http_retry_count) + ", connect retries: "+str(connect_retry_count))
     sys.exit()
 
 except Exception as e:
diff --git a/test/common/ecs_api_functions.sh b/test/common/ecs_api_functions.sh
index ba6af92..cf5f580 100644
--- a/test/common/ecs_api_functions.sh
+++ b/test/common/ecs_api_functions.sh
@@ -259,9 +259,13 @@
 		# A PVC of type hostPath is mounted to ECS, for persistent storage, so the ECS must always be on the node which mounted the volume
 
 		# Keep the initial worker node in case the pod need to be "restarted" - must be made to the same node due to a volume mounted on the host
-		__ECS_WORKER_NODE=$(kubectl get pod -l "autotest=ECS" -n $KUBE_NONRTRIC_NAMESPACE -o jsonpath='{.items[*].spec.nodeName}')
-		if [ -z "$__ECS_WORKER_NODE" ]; then
-			echo -e $YELLOW" Cannot find worker node for pod for $ECS_APP_NAME, persistency may not work"$EYELLOW
+		if [ $retcode_i -eq 0 ]; then
+			__ECS_WORKER_NODE=$(kubectl get pod -l "autotest=ECS" -n $KUBE_NONRTRIC_NAMESPACE -o jsonpath='{.items[*].spec.nodeName}')
+			if [ -z "$__ECS_WORKER_NODE" ]; then
+				echo -e $YELLOW" Cannot find worker node for pod for $ECS_APP_NAME, persistency may not work"$EYELLOW
+			fi
+		else
+			echo -e $YELLOW" Persistency may not work for app $ECS_APP_NAME in multi-worker node config when running it as a prestarted app"$EYELLOW
 		fi
 
 		echo " Retrieving host and ports for service..."
@@ -358,6 +362,14 @@
 	echo -e $BOLD"Stopping $ECS_DISPLAY_NAME"$EBOLD
 
 	if [ $RUNMODE == "KUBE" ]; then
+
+		__check_prestarted_image "ECS"
+		if [ $? -eq 0 ]; then
+			echo -e $YELLOW" Persistency may not work for app $ECS_APP_NAME in multi-worker node config when running it as a prestarted app"$EYELLOW
+			__kube_scale deployment $ECS_APP_NAME $KUBE_NONRTRIC_NAMESPACE 0
+			return 0
+		fi
+
 		__kube_scale_all_resources $KUBE_NONRTRIC_NAMESPACE autotest ECS
 		echo "  Deleting the replica set - a new will be started when the app is started"
 		tmp=$(kubectl delete rs -n $KUBE_NONRTRIC_NAMESPACE -l "autotest=ECS")
@@ -388,6 +400,14 @@
 
 	if [ $RUNMODE == "KUBE" ]; then
 
+		__check_prestarted_image "ECS"
+		if [ $? -eq 0 ]; then
+			echo -e $YELLOW" Persistency may not work for app $ECS_APP_NAME in multi-worker node config when running it as a prestarted app"$EYELLOW
+			__kube_scale deployment $ECS_APP_NAME $KUBE_NONRTRIC_NAMESPACE 1
+			__check_service_start $ECS_APP_NAME $ECS_PATH$ECS_ALIVE_URL
+			return 0
+		fi
+
 		# Tie the PMS to the same worker node it was initially started on
 		# A PVC of type hostPath is mounted to PMS, for persistent storage, so the PMS must always be on the node which mounted the volume
 		if [ -z "$__ECS_WORKER_NODE" ]; then
@@ -403,7 +423,6 @@
 			fi
 			__kube_scale deployment $ECS_APP_NAME $KUBE_NONRTRIC_NAMESPACE 1
 		fi
-
 	else
 		docker start $ECS_APP_NAME &> ./tmp/.dockererr
 		if [ $? -ne 0 ]; then
@@ -1754,4 +1773,23 @@
 
 	__log_test_pass
 	return 0
+}
+
+##########################################
+####     Reset jobs and producers     ####
+##########################################
+
+
+# Admin reset to remove all data in ecs; jobs, producers etc
+# NOTE - only works in kubernetes and the pod should not be running
+# args: -
+# (Function for test scripts)
+
+ecs_kube_pvc_reset() {
+	__log_test_start $@
+
+	__kube_clean_pvc $ECS_APP_NAME nonrtric enrichmentservice-pvc /var/enrichment-coordinator-service/database
+
+	__log_test_pass
+	return 0
 }
\ No newline at end of file
diff --git a/test/common/kube_proxy_api_functions.sh b/test/common/kube_proxy_api_functions.sh
index 5cac74c..c352ff1 100644
--- a/test/common/kube_proxy_api_functions.sh
+++ b/test/common/kube_proxy_api_functions.sh
@@ -26,7 +26,7 @@
 # arg: <image-tag-suffix> (selects staging, snapshot, release etc)
 # <image-tag-suffix> is present only for images with staging, snapshot,release tags
 __KUBEPROXY_imagesetup() {
-	__check_and_create_image_var KUBEPROXY "KUBE_PROXY_IMAGE" "KUBE_PROXY_IMAGE_BASE" "KUBE_PROXY_IMAGE_TAG" REMOTE_PROXY "$KUBE_PROXY_DISPLAY_NAME"
+	__check_and_create_image_var KUBEPROXY "KUBE_PROXY_IMAGE" "KUBE_PROXY_IMAGE_BASE" "KUBE_PROXY_IMAGE_TAG" LOCAL "$KUBE_PROXY_DISPLAY_NAME"
 }
 
 # Pull image from remote repo or use locally built image
@@ -35,14 +35,29 @@
 # <pull-policy-original> Shall be used for images that does not allow overriding
 # Both var may contain: 'remote', 'remote-remove' or 'local'
 __KUBEPROXY_imagepull() {
-	__check_and_pull_image $2 "$KUBE_PROXY_DISPLAY_NAME" $KUBE_PROXY_APP_NAME KUBE_PROXY_IMAGE
+	echo -e $RED"Image for app KUBEPROXY shall never be pulled from remote repo"$ERED
 }
 
 # Build image (only for simulator or interfaces stubs owned by the test environment)
 # arg: <image-tag-suffix> (selects staging, snapshot, release etc)
 # <image-tag-suffix> is present only for images with staging, snapshot,release tags
 __KUBEPROXY_imagebuild() {
-	echo -e $RED"Image for app KUBEPROXY shall never be built"$ERED
+	cd ../http-https-proxy
+	echo " Building KUBEPROXY - $KUBE_PROXY_DISPLAY_NAME - image: $KUBE_PROXY_IMAGE"
+	docker build  --build-arg NEXUS_PROXY_REPO=$NEXUS_PROXY_REPO -t $KUBE_PROXY_IMAGE . &> .dockererr
+	if [ $? -eq 0 ]; then
+		echo -e  $GREEN"  Build Ok"$EGREEN
+		__retag_and_push_image KUBE_PROXY_IMAGE
+		if [ $? -ne 0 ]; then
+			exit 1
+		fi
+	else
+		echo -e $RED"  Build Failed"$ERED
+		((RES_CONF_FAIL++))
+		cat .dockererr
+		echo -e $RED"Exiting...."$ERED
+		exit 1
+	fi
 }
 
 # Generate a string for each included image using the app display name and a docker images format string
@@ -65,7 +80,7 @@
 # Scale kubernetes resources to zero and wait until this has been accomplished, if relevant. If not relevant to scale, then do no action.
 # This function is called for prestarted apps not managed by the test script.
 __KUBEPROXY_kube_scale_zero_and_wait() {
-	echo -e $RED" Http proxy replicas kept as is"$ERED
+	echo -e $RED" KUBEPROXY app is not scaled in this state"$ERED
 }
 
 # Delete all kube resouces for the app
@@ -157,7 +172,7 @@
 
 		if [ "$CLUSTER_KUBE_PROXY_HOST" == "localhost" ]; then
 			#Local host found
-			echo -e $YELLOW" The test environment svc $KUBE_PROXY_APP_NAME host is: $CLUSTER_KUBE_PROXY_HOST. The proxy (mitmproxy) used by test script requires an ip so the ip is assumed and set to 127.0.0.1"$EYELLOW
+			echo -e $YELLOW" The test environment svc $KUBE_PROXY_APP_NAME host is: $CLUSTER_KUBE_PROXY_HOST"$EYELLOW
 			CLUSTER_KUBE_PROXY_HOST="127.0.0.1"
 		else
 			if [ -z "$CLUSTER_KUBE_PROXY_HOST" ]; then
diff --git a/test/common/ricsimulator_api_functions.sh b/test/common/ricsimulator_api_functions.sh
index 785ff9a..a835218 100644
--- a/test/common/ricsimulator_api_functions.sh
+++ b/test/common/ricsimulator_api_functions.sh
@@ -475,7 +475,7 @@
 # (Function for test scripts)
 sim_post_delete_all() {
 	__log_conf_start $@
-	if [ $# -ne 3 ]; then
+	if [ $# -ne 2 ]; then
 		__print_err "<response-code> <numericic-id>" $@
 		return 1
 	fi
diff --git a/test/common/test_env-onap-guilin.sh b/test/common/test_env-onap-guilin.sh
index 59a1a0c..8dd205d 100755
--- a/test/common/test_env-onap-guilin.sh
+++ b/test/common/test_env-onap-guilin.sh
@@ -134,9 +134,9 @@
 #No local image for ONAP DMAAP-MR, remote image always used
 
 #Kube proxy remote image and tag
-KUBE_PROXY_IMAGE_BASE="mitmproxy/mitmproxy"
-KUBE_PROXY_IMAGE_TAG_REMOTE_PROXY="6.0.2"
-#No local image for http proxy, remote image always used
+KUBE_PROXY_IMAGE_BASE="nodejs-http-proxy"
+KUBE_PROXY_IMAGE_TAG_LOCAL="latest"
+#No remote image for kube proxy, local image always used
 
 
 # List of app short names produced by the project
diff --git a/test/common/test_env-onap-honolulu.sh b/test/common/test_env-onap-honolulu.sh
index 337d3e1..62dfab8 100755
--- a/test/common/test_env-onap-honolulu.sh
+++ b/test/common/test_env-onap-honolulu.sh
@@ -157,9 +157,9 @@
 #No local image for ONAP DMAAP-MR, remote image always used
 
 #Kube proxy remote image and tag
-KUBE_PROXY_IMAGE_BASE="mitmproxy/mitmproxy"
-KUBE_PROXY_IMAGE_TAG_REMOTE_PROXY="6.0.2"
-#No local image for http proxy, remote image always used
+KUBE_PROXY_IMAGE_BASE="nodejs-http-proxy"
+KUBE_PROXY_IMAGE_TAG_LOCAL="latest"
+#No remote image for kube proxy, local image always used
 
 # List of app short names produced by the project
 PROJECT_IMAGES_APP_NAMES="PA SDNC"
diff --git a/test/common/test_env-onap-istanbul.sh b/test/common/test_env-onap-istanbul.sh
index 0c06813..423d3ef 100644
--- a/test/common/test_env-onap-istanbul.sh
+++ b/test/common/test_env-onap-istanbul.sh
@@ -157,9 +157,9 @@
 #No local image for ONAP DMAAP-MR, remote image always used
 
 #Kube proxy remote image and tag
-KUBE_PROXY_IMAGE_BASE="mitmproxy/mitmproxy"
-KUBE_PROXY_IMAGE_TAG_REMOTE_PROXY="6.0.2"
-#No local image for http proxy, remote image always used
+KUBE_PROXY_IMAGE_BASE="nodejs-http-proxy"
+KUBE_PROXY_IMAGE_TAG_LOCAL="latest"
+#No remote image for kube proxy, local image always used
 
 # List of app short names produced by the project
 PROJECT_IMAGES_APP_NAMES="PA SDNC"
diff --git a/test/common/test_env-oran-cherry.sh b/test/common/test_env-oran-cherry.sh
index ca994aa..f75ff1d 100755
--- a/test/common/test_env-oran-cherry.sh
+++ b/test/common/test_env-oran-cherry.sh
@@ -161,9 +161,9 @@
 #No local image for ONAP DMAAP-MR, remote image always used
 
 #Kube proxy remote image and tag
-KUBE_PROXY_IMAGE_BASE="mitmproxy/mitmproxy"
-KUBE_PROXY_IMAGE_TAG_REMOTE_PROXY="6.0.2"
-#No local image for http proxy, remote image always used
+KUBE_PROXY_IMAGE_BASE="nodejs-http-proxy"
+KUBE_PROXY_IMAGE_TAG_LOCAL="latest"
+#No remote image for kube proxy, local image always used
 
 # List of app short names produced by the project
 PROJECT_IMAGES_APP_NAMES="PA ECS CP SDNC RC RICSIM"
diff --git a/test/common/test_env-oran-dawn.sh b/test/common/test_env-oran-dawn.sh
index 211e068..f83b7b0 100755
--- a/test/common/test_env-oran-dawn.sh
+++ b/test/common/test_env-oran-dawn.sh
@@ -180,9 +180,9 @@
 #No local image for ONAP DMAAP-MR, remote image always used
 
 #Kube proxy remote image and tag
-KUBE_PROXY_IMAGE_BASE="mitmproxy/mitmproxy"
-KUBE_PROXY_IMAGE_TAG_REMOTE_PROXY="6.0.2"
-#No local image for http proxy, remote image always used
+KUBE_PROXY_IMAGE_BASE="nodejs-http-proxy"
+KUBE_PROXY_IMAGE_TAG_LOCAL="latest"
+#No remote image for kube proxy, local image always used
 
 # List of app short names produced by the project
 PROJECT_IMAGES_APP_NAMES="PA ECS CP RC RICSIM NGW"  # Add SDNC here if oran image is used
diff --git a/test/common/testcase_common.sh b/test/common/testcase_common.sh
index 1f6d135..b4ed9b4 100755
--- a/test/common/testcase_common.sh
+++ b/test/common/testcase_common.sh
@@ -1894,7 +1894,7 @@
 
 # This function runs a kubectl cmd where a single output value is expected, for example get ip with jsonpath filter.
 # The function retries up to the timeout given in the cmd flag '--cluster-timeout'
-# args: <full kubectl cmd with parameters
+# args: <full kubectl cmd with parameters>
 # (Not for test scripts)
 __kube_cmd_with_timeout() {
 	TS_TMP=$(($SECONDS+$CLUSTER_TIME_OUT))
@@ -1912,6 +1912,39 @@
 	done
 }
 
+# This function starts a pod that cleans a the contents of a path mounted as a pvc
+# After this action the pod should terminate
+# This should only be executed when the pod owning the pvc is not running
+# args: <appname> <namespace> <pvc-name> <path-to remove>
+# (Not for test scripts)
+__kube_clean_pvc() {
+
+	export PVC_CLEANER_NAMESPACE=$2
+	export PVC_CLEANER_CLAIMNAME=$3
+	export PVC_CLEANER_RM_PATH=$4
+	input_yaml=$SIM_GROUP"/pvc-cleaner/"pvc-cleaner.yaml
+	output_yaml=$PWD/tmp/$2-pvc-cleaner.yaml
+
+	envsubst < $input_yaml > $output_yaml
+
+	kubectl delete -f $output_yaml #> /dev/null 2>&1    # Delete the previous terminated pod - if existing
+
+	__kube_create_instance pod pvc-cleaner $input_yaml $output_yaml
+	if [ $? -ne 0 ]; then
+		echo $YELLOW" Could not clean pvc for app: $1 - persistent storage not clean - tests may not work"
+		return 1
+	fi
+
+	term_ts=$(($SECONDS+30))
+	while [ $term_ts -gt $SECONDS ]; do
+		pod_status=$(kubectl get pod pvc-cleaner -n $PVC_CLEANER_NAMESPACE --no-headers -o custom-columns=":status.phase")
+		if [ "$pod_status" == "Succeeded" ]; then
+			return 0
+		fi
+	done
+	return 1
+}
+
 # This function scales or deletes all resources for app selected by the testcase.
 # args: -
 # (Not for test scripts)
@@ -1920,22 +1953,26 @@
 
 	# Scale prestarted or managed apps
 	for imagename in $APP_SHORT_NAMES; do
-		__check_included_image $imagename
+		# A function name is created from the app short name
+		# for example app short name 'RICMSIM' -> produce the function
+		# name __RICSIM_kube_scale_zero or __RICSIM_kube_scale_zero_and_wait
+		# This function is called and is expected to exist in the imported
+		# file for the ricsim test functions
+		# The resulting function impl shall scale the resources to 0
+		# For prestarted apps, the function waits until the resources are 0
+		# For included (not prestated) apps, the scaling is just ordered
+		__check_prestarted_image $imagename
 		if [ $? -eq 0 ]; then
-			# A function name is created from the app short name
-			# for example app short name 'RICMSIM' -> produce the function
-			# name __RICSIM_kube_scale_zero or __RICSIM_kube_scale_zero_and_wait
-			# This function is called and is expected to exist in the imported
-			# file for the ricsim test functions
-			# The resulting function impl shall scale the resources to 0
-			__check_prestarted_image $imagename
-			if [ $? -eq 0 ]; then
-				function_pointer="__"$imagename"_kube_scale_zero_and_wait"
-			else
-				function_pointer="__"$imagename"_kube_scale_zero"
-			fi
+			function_pointer="__"$imagename"_kube_scale_zero_and_wait"
 			echo -e " Scaling all kube resources for app $BOLD $imagename $EBOLD to 0"
 			$function_pointer
+		else
+			__check_included_image $imagename
+			if [ $? -eq 0 ]; then
+				function_pointer="__"$imagename"_kube_scale_zero"
+				echo -e " Scaling all kube resources for app $BOLD $imagename $EBOLD to 0"
+				$function_pointer
+			fi
 		fi
 	done
 
diff --git a/test/common/testengine_config.sh b/test/common/testengine_config.sh
index fd23617..311c2f5 100644
--- a/test/common/testengine_config.sh
+++ b/test/common/testengine_config.sh
@@ -27,7 +27,7 @@
 AVAILABLE_IMAGES_OVERRIDE="PA ECS SDNC CP NGW RICSIM RC"
 
 # List of available apps where the image is built by the test environment
-LOCAL_IMAGE_BUILD="MR CR PRODSTUB"
+LOCAL_IMAGE_BUILD="MR CR PRODSTUB KUBEPROXY"
 
 
 #Integrate a new app into the test environment
diff --git a/test/http-https-proxy/.gitignore b/test/http-https-proxy/.gitignore
new file mode 100644
index 0000000..3384196
--- /dev/null
+++ b/test/http-https-proxy/.gitignore
@@ -0,0 +1 @@
+.dockererr
\ No newline at end of file
diff --git a/test/http-https-proxy/Dockerfile b/test/http-https-proxy/Dockerfile
new file mode 100644
index 0000000..e961500
--- /dev/null
+++ b/test/http-https-proxy/Dockerfile
@@ -0,0 +1,14 @@
+ARG NEXUS_PROXY_REPO
+
+FROM ${NEXUS_PROXY_REPO}node:16-alpine3.12
+
+ENV NODE_ENV=production
+
+WORKDIR /usr/src/app/cert
+COPY cert/*.crt .
+COPY cert/pass .
+
+WORKDIR /usr/src/app
+COPY http_proxy.js .
+
+CMD [ "node", "http_proxy.js" ]
\ No newline at end of file
diff --git a/test/http-https-proxy/README.md b/test/http-https-proxy/README.md
new file mode 100644
index 0000000..271db4d
--- /dev/null
+++ b/test/http-https-proxy/README.md
@@ -0,0 +1,63 @@
+## http proxy ##
+
+The http proxy is a generic http proxy which is able to proxy both http and https destination calls.
+The call to the proxy (to control the proxy call) also supports both http and https (https is using a self signed cert).
+The main usage for the proxy is as a gateway to all services and pod inside a kubernetest cluster.
+However, it can be used a basic standard http proxy as well.
+
+# Ports and certificates
+
+The proxy opens the http and https port according to the table below.
+
+| Port     | Proxy protocol | Usage |
+| -------- | ------ |----- |
+| 8080     | http   | Proxy call for http, can proxy both http and https |
+| 8433     | https  | Proxy call for https, can proxy both http and https |
+| 8081     | http   | Http port for alive check, returns json with basic statistics |
+| 8434     | https  | Https port for alive check, returns json with basic statistics |
+
+The dir cert contains a self-signed cert. Use the script generate_cert_and_key.sh to generate a new certificate and key before building the container, the certs need to be re-generated. If another cert is used, all three files (cert.crt, key.crt and pass) in the cert dir should be mounted to the dir '/usr/src/app/cert' in the container.
+
+
+### Proxy usage ###
+
+| Operation | curl example |
+| --------- | ------------ |
+| proxy http call via http | curl --proxy localhost:8080 http://pms:1234 |
+| proxy https call via http | curl --proxy localhost:8080 https://pms:5678 |
+| proxy http call via https | curl --proxy-insecure localhost:8433 http://pms:1234 |
+| proxy https call via https |  curl --proxy-insecure localhost:8433 https://pms:5678 |
+| alive check and get stats | curl localhost:8081 |
+| alive check and get stats via proxy |  curl --proxy localhost:8080 http://localhost:8081 |
+
+### Build and start ###
+
+>Build image<br>
+```docker build --build-arg NEXUS_PROXY_REPO=nexus3.onap.org:10001/ -t nodejs-http-proxy:latest .```
+
+>Start the image on both http and https<br>
+```docker run --rm -it -p 8080:8080 -p 8081:8081 -p 8433:8433 -p 8434:8434 nodejs-http-proxy:latest```
+
+It will listen to http ports 8080/8081 and https ports 8433/8434 (using default certificates) at the same time.
+
+The script ```proxy-build-start.sh``` do the above two steps in one go. This starts the container in stand-alone mode for basic test.<br>
+
+
+### Basic test ###
+
+Basic test is made with the script ```basic_test.sh``` which tests proxy. Use the script ```proxy-build-start.sh``` to start the proxy in a container first.
+
+## License
+
+Copyright (C) 2021 Nordix Foundation. 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.
\ No newline at end of file
diff --git a/test/http-https-proxy/basic_test.sh b/test/http-https-proxy/basic_test.sh
new file mode 100755
index 0000000..085e17f
--- /dev/null
+++ b/test/http-https-proxy/basic_test.sh
@@ -0,0 +1,71 @@
+#!/bin/bash
+
+#  ============LICENSE_START===============================================
+#  Copyright (C) 2021 Nordix Foundation. 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=================================================
+#
+
+# Automated test script for callback receiver container
+
+
+echo "NOTE - No automatic response check - check manually"
+echo "All call shall return a json struct"
+echo ""
+
+CMD="curl --proxy localhost:8080 localhost:8081"
+echo "Running cmd: "$CMD
+$CMD
+echo ""
+if [ $? -eq 0 ]; then
+    echo "CMD OK"
+else
+    echo "CMD FAIL"
+fi
+echo ""
+
+CMD="curl --proxy localhost:8080 -k https://localhost:8434"
+echo "Running cmd: "$CMD
+$CMD
+echo ""
+if [ $? -eq 0 ]; then
+    echo "CMD OK"
+else
+    echo "CMD FAIL"
+fi
+echo ""
+
+CMD="curl --proxy-insecure localhost:8433 localhost:8081"
+echo "Running cmd: "$CMD
+$CMD
+echo ""
+if [ $? -eq 0 ]; then
+    echo "CMD OK"
+else
+    echo "CMD FAIL"
+fi
+echo ""
+
+CMD="curl --proxy-insecure localhost:8433 -k https://localhost:8434"
+echo "Running cmd: "$CMD
+$CMD
+echo ""
+if [ $? -eq 0 ]; then
+    echo "CMD OK"
+else
+    echo "CMD FAIL"
+fi
+echo ""
+
+echo "DONE"
diff --git a/test/http-https-proxy/cert/cert.crt b/test/http-https-proxy/cert/cert.crt
new file mode 100644
index 0000000..97a2c3b
--- /dev/null
+++ b/test/http-https-proxy/cert/cert.crt
@@ -0,0 +1,18 @@
+-----BEGIN CERTIFICATE-----
+MIIC2jCCAcICCQCoykk37ggbnjANBgkqhkiG9w0BAQsFADAvMQswCQYDVQQGEwJT
+RTESMBAGA1UEBwwJTGlua29waW5nMQwwCgYDVQQKDANFU1QwHhcNMjEwNTAzMTIw
+MjU1WhcNNDgwOTE3MTIwMjU1WjAvMQswCQYDVQQGEwJTRTESMBAGA1UEBwwJTGlu
+a29waW5nMQwwCgYDVQQKDANFU1QwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK
+AoIBAQDKIgyIH3MRpXNGpPpjmlCgt+kmFvOq33AF4wu+zDHvBZL5zPiqHpacDjhl
+Q1gq+8Cxmu5awwMwlz8cWFqrCjkVE1wlUYKIBi/NU7B7hbPMiDSN8fw1bA+sf7Ke
+Fr3BdQ9rEHalUY/BLueNERaOeM79wiHCW+08+T2oixchaeWT/v1KINc/rfpAFVQZ
+9aBSiFecbmZhcL9YKNb3TOaPivrrXgFvrSUkoGCKvIPf9mx/xYMkEbwAHAUSVlAn
+MOWBWf+pQGl/sjuD5mBKS3uL1Gon4R4hXNGNafS/C0HmEbJB6r+OzdnqjumMhmtt
+WGFxYvxS6ChSAa6ni4Ae7tBtlqJPAgMBAAEwDQYJKoZIhvcNAQELBQADggEBAIRk
+bicQn1gUALHz2YTGffBN6BCbIKKIzW9NJ/xIYBYUkMwyxpqq0GMRsqIaBIa9R1dr
+rcG27B8BTwUfeHH8Fjp1YR18axK5uh/RRHgIU5YixaMbdlxwfYDIxV9rf8xuQ/KR
+wQkYqxke5CyTZnqVXR08i3eYsa8XpUq7keqA1ecJBfG5d8g0RJg3/nK81V5PWMXL
+so9xq/dCUS4ulLu7XqXxBUK8pNjnP7fgg6C2+n39eZVv/LHdt05QIjFkEErBUbmz
+zJ9rCN5y70KGgr7HZioAE5buQJZaYWoekbZ/D7r5+j+25IWcWr7vy7Qq9IJA0ZIz
+879adxAkeJTzpdZkfkA=
+-----END CERTIFICATE-----
diff --git a/test/http-https-proxy/cert/generate_cert_and_key.sh b/test/http-https-proxy/cert/generate_cert_and_key.sh
new file mode 100755
index 0000000..0f79bbf
--- /dev/null
+++ b/test/http-https-proxy/cert/generate_cert_and_key.sh
@@ -0,0 +1,21 @@
+#!/bin/bash
+
+#  ============LICENSE_START===============================================
+#  Copyright (C) 2020 Nordix Foundation. 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=================================================
+#
+
+# This will generate a self-signed certificate with password 'test'
+openssl req -x509 -passout pass:"test" -newkey rsa:2048 -keyout key.crt -out cert.crt -days 9999
diff --git a/test/http-https-proxy/cert/key.crt b/test/http-https-proxy/cert/key.crt
new file mode 100644
index 0000000..286f5bb
--- /dev/null
+++ b/test/http-https-proxy/cert/key.crt
@@ -0,0 +1,30 @@
+-----BEGIN ENCRYPTED PRIVATE KEY-----
+MIIFHzBJBgkqhkiG9w0BBQ0wPDAbBgkqhkiG9w0BBQwwDgQI6ID1Pm413GQCAggA
+MB0GCWCGSAFlAwQBKgQQxUi4NiTRO3ZtBXwkBMI/zwSCBNCPGAktH49M9OUptPqK
+ie6rIyhvdNMfj7OJL+/SYwTwK0unwsp1CgyZou7SUtfMPVzpSRtY+WuKVhtHSTIR
+4qrY20O5UNrRdIMnlm5daEld+drD5/ql2iTidAHY4idGum0KMpUMdG8G/pdFcD8m
+uJ/b4ogO30gtCra7R4yvrjaSji7yuGMms1p0BWgx8nURivy6zBvFew58WCC63RGe
+aouzavsu+7Xd8t4JXAvcH93zcfXr2uminiZ8d7CvwTfvrtunc0FyTfVl1u7vPB/z
+FzN952KlYK3ugHgSg5ZsqJ2FES2iBNX1I55BHTOIcXkNemcaszRAomrNXqyqk9X2
+36ojasw2fCLt+hluwD3VMH2gKs4XvUbxuYnz7Gfeq9AA9L0iBtZs0+aMG6fgQ7NC
+KvXty0XzupIW615vWmwd5UBubCslXmZKOfF/zyOfd+N59a54VoA/F9q1hfqiNz6L
+QbGbaFhLHO36P9q/i95IZpzZbRTakwF6ICLLdI6i2S9m/AqOUJeP+LKTTZ6pPgvu
+r/fxUIk3ByVzNa9BtqAwwHlqeAUmwj2r2pEF2wV7c4gaEvK/fEx5PsHE0IFbYtmN
+tCNTpj5irFaHfTAmddoaq2On9qo6iZHlxr7fu6cjCjKiF54j4nifF1OcNN1KV/u1
+MNEz8dcMdmiNb69Cr4jOFU9xhyTmZ7sQ6yicUVa8R4pZTThBPRfSLBpsSur/t+n6
+7XCYVC7RyN5Dd8sqK2QVL+dqUCEumiQoV+9ogaxbfo35Z7+LTJDcyHMNieJ8C01S
+Mt5H6TdsCPLtzmbF9Pgw3fYwC2U7pAZYppOMkgiWeg7pH9gyWKah0GfAK0VrCYWz
+9dR2QAkb5u39NAyQKv7nOJ4hQ7TFYiBxM5j1WtnVKuQ5WpDzweP+NcnTMBYnbYDA
+AbMp0VCKTyN5pRbC1JF7RPeFkiEAC1sMLfhxS9kB6UKgWO2jnl70QtUfxMsOkaon
+iDVpsdB0QtfWOayC53GeLTS2uG/wXd3mzq3+QmNd7MVYCtwU7TeZpPboaRkfLX03
+d/sLU2zxcQH1Xp7JWufiN0P1VpsytxGPVGQa4BZsNjX+SOJwU7wRydEqDBhJxSJP
+OrzAojG3K0sB/av7UBK+LsALI36lNso7H9ZzAHx1keYjDGBKRcsMsvtF9kwOW85v
+kYkseYvcedv5CHXOlTIC/GFXOVg7Ot+InCgKI3rj0EojzI7r+M1XlvSrJNzM++iX
+AgD/mBmiKovLPjW4JVkT4zZYDMoTa12QtFc0YPg4yb6rJkqqci7TW8Huy/HFAOST
+LX+j54vY1YflRE1aqcILmkrBZGRT7luQICFjcwUKRRpw1UuP4RRf7Zg6ZwXcshIN
+J1Vmrjo48Gqr4xotCvpgflOXqdZSXNbqyfvIxhnJqShWuVINDQ4CkdLjb+IQP+NF
+8BvfjsaVgEBbu/K5K87ltpuyvqWNSIWojMLJYin5sh1T1nqhCJViwZhCXWFbuPfj
+k12Iww/mFtPQmUlsWnonHNn3CHr0XbEWy7TvCK2VkjysteBmAdTROCv2r8LXTg/i
+63pIL055pqXLZMPxuIx8+rf/gAseXyl2/YfuO45oVVNbZz/d8fbFaxnU/K0zwzvr
+tr/T+QKZMBP0EC8BZ6Tsge6ZZA==
+-----END ENCRYPTED PRIVATE KEY-----
diff --git a/test/http-https-proxy/cert/pass b/test/http-https-proxy/cert/pass
new file mode 100644
index 0000000..30d74d2
--- /dev/null
+++ b/test/http-https-proxy/cert/pass
@@ -0,0 +1 @@
+test
\ No newline at end of file
diff --git a/test/http-https-proxy/http_proxy.js b/test/http-https-proxy/http_proxy.js
new file mode 100644
index 0000000..714548a
--- /dev/null
+++ b/test/http-https-proxy/http_proxy.js
@@ -0,0 +1,214 @@
+//  ============LICENSE_START===============================================
+//  Copyright (C) 2021 Nordix Foundation. 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=================================================
+
+// Basic http/https proxy
+// Call the the proxy on 8080/8433 for http/https
+// The destination (proxied) protocol may be http or https
+// Proxy healthcheck on 8081/8434 for http/https - answers with statistics in json
+
+const http = require('http');
+const net = require('net');
+const urlp = require('url');
+const process = require('process')
+const https = require('https');
+const fs = require('fs');
+
+// Proxy server port for http
+const proxyport = 8080;
+// Proxy server port for https
+const proxyporthttps = 8433;
+// Proyx server alive check, port for http
+const aliveport = 8081;
+// Proyx server alive check,  port for https
+const aliveporthttps = 8434;
+
+// Default https destination port
+const defaulthttpsport = "443";
+
+// Certs etc for https
+const httpsoptions = {
+  key: fs.readFileSync('cert/key.crt'),
+  cert: fs.readFileSync('cert/cert.crt'),
+  passphrase: fs.readFileSync('cert/pass', 'utf8')
+};
+
+const stats = {
+  'http-requests-initiated': 0,
+  'http-requests-failed': 0,
+  'https-requests-initiated': 0,
+  'https-requests-failed': 0
+};
+
+// handle a http proxy request
+function httpclientrequest(clientrequest, clientresponse) {
+  stats['http-requests-initiated']++;
+
+  if (clientrequest.url == "/" ) {
+    console.log("Catch bad url in http request: "+clientrequest.url)
+    clientresponse.end();
+    return;
+  }
+  // Extract destination information
+  const clientrequesturl = new URL(clientrequest.url);
+
+  var proxyrequestoptions = {
+    'host': clientrequesturl.hostname,
+    'port': clientrequesturl.port,
+    'method': clientrequest.method,
+    'path': clientrequesturl.pathname+clientrequesturl.search,
+    'agent': clientrequest.agent,
+    'auth': clientrequest.auth,
+    'headers': clientrequest.headers
+  };
+
+  // Setup connection to destination
+  var proxyrequest = http.request(
+    proxyrequestoptions,
+    function (proxyresponse) {
+      clientresponse.writeHead(proxyresponse.statusCode, proxyresponse.headers);
+      proxyresponse.on('data', function (chunk) {
+        clientresponse.write(chunk);
+      });
+      proxyresponse.on('end', function () {
+        clientresponse.end();
+      });
+
+    }
+  );
+
+  // Handle the connection and data transfer between source and desitnation
+  proxyrequest.on('error', function (error) {
+    clientresponse.writeHead(500);
+    stats['http-requests-failed']++;
+    console.log(error);
+    clientresponse.write("<h1>500 Error</h1>\r\n" + "<p>Error was <pre>" + error + "</pre></p>\r\n" + "</body></html>\r\n");
+    clientresponse.end();
+  });
+  clientrequest.addListener('data', function (chunk) {
+    proxyrequest.write(chunk);
+  });
+  clientrequest.addListener('end', function () {
+    proxyrequest.end();
+  });
+}
+
+function main() {
+
+  // -------------------- Alive server ----------------------------------
+  // Responde with '200' and statistics for any path on the alive address
+  const alivelistener = function (req, res) {
+    console.log(stats)
+    res.writeHead(200, { 'Content-Type': 'application/json' });
+    res.write(JSON.stringify(stats))
+    res.end();
+  };
+
+  // The alive server - for healthckeck
+  const aliveserver = http.createServer(alivelistener);
+
+  // The alive server - for healthckeck
+  const aliveserverhttps = https.createServer(httpsoptions, alivelistener);
+
+  //Handle heatlhcheck requests
+  aliveserver.listen(aliveport, () => {
+    console.log('alive server on: '+aliveport);
+    console.log(' example: curl localhost: '+aliveport)
+  });
+
+  //Handle heatlhcheck requests
+  aliveserverhttps.listen(aliveporthttps, () => {
+    console.log('alive server on: '+aliveporthttps);
+    console.log(' example: curl -k https://localhost: '+aliveporthttps)
+  });
+
+  // -------------------- Proxy server ---------------------------------
+
+  // The proxy server
+  const proxyserver  = http.createServer(httpclientrequest).listen(proxyport);
+  console.log('http/https proxy for http proxy calls on port ' + proxyport);
+  console.log(' example: curl --proxy localhost:8080 http://pms:1234')
+  console.log(' example: curl -k --proxy localhost:8080 https://pms:5678')
+
+  const proxyserverhttps = https.createServer(httpsoptions, httpclientrequest).listen(proxyporthttps);
+  console.log('http/https proxy for https proxy calls on port ' + proxyporthttps);
+  console.log(' example: curl --proxy-insecure localhost:8433 http://pms:1234')
+  console.log(' example: curl --proxy-insecure localhost:8433 https://pms:5678')
+  console.log(' note: proxy shall not specify https')
+
+  // handle a http proxy request - https listener
+  proxyserver.addListener(
+    'connect',
+    function (request, socketrequest, bodyhead) {
+
+
+      stats['https-requests-initiated']++;
+      // Extract destination information
+      var res = request['url'].split(":")
+      var hostname = res[0]
+      var port = defaulthttpsport;
+      if (res[1] != null) {
+        port = res[1]
+      }
+
+      // Setup connection to destination
+      var httpversion = request['httpVersion'];
+      var proxysocket = new net.Socket();
+
+      proxysocket.connect(
+        parseInt(port), hostname,
+        function () {
+          proxysocket.write(bodyhead);
+          socketrequest.write("HTTP/" + httpversion + " 200 Connection established\r\n\r\n");
+        }
+      );
+
+      // Handle the connection and data transfer between source and desitnation
+      proxysocket.on('data', function (chunk) {
+        socketrequest.write(chunk);
+      });
+      proxysocket.on('end', function () {
+        socketrequest.end();
+      });
+
+      socketrequest.on('data', function (chunk) {
+        proxysocket.write(chunk);
+      });
+      socketrequest.on('end', function () {
+        proxysocket.end();
+      });
+
+      proxysocket.on('error', function (err) {
+        stats['https-requests-failed']++;
+        console.log(err);
+        socketrequest.write("HTTP/" + httpversion + " 500 Connection error\r\n\r\n");
+        socketrequest.end();
+      });
+      socketrequest.on('error', function (err) {
+        stats['https-requests-failed']++;
+        console.log(err);
+        proxysocket.end();
+      });
+    }
+  );
+}
+
+//Handle ctrl c when running in interactive mode
+process.on('SIGINT', () => {
+  console.info("Interrupted")
+  process.exit(0)
+})
+
+main();
diff --git a/test/http-https-proxy/proxy-build-start.sh b/test/http-https-proxy/proxy-build-start.sh
new file mode 100755
index 0000000..553de51
--- /dev/null
+++ b/test/http-https-proxy/proxy-build-start.sh
@@ -0,0 +1,24 @@
+#!/bin/bash
+
+#  ============LICENSE_START===============================================
+#  Copyright (C) 2021 Nordix Foundation. 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=================================================
+#
+
+#Builds the callback receiver container and starts it in interactive mode
+
+docker build --build-arg NEXUS_PROXY_REPO=nexus3.onap.org:10001/ -t nodejs-http-proxy:latest .
+
+docker run --rm -it -p 8080:8080 -p 8081:8081 -p 8433:8433 -p 8434:8434 nodejs-http-proxy:latest
diff --git a/test/simulator-group/kubeproxy/app.yaml b/test/simulator-group/kubeproxy/app.yaml
index 3e6636b..b9f6115 100644
--- a/test/simulator-group/kubeproxy/app.yaml
+++ b/test/simulator-group/kubeproxy/app.yaml
@@ -26,5 +26,3 @@
           containerPort: $KUBE_PROXY_INTERNAL_PORT
         - name: web
           containerPort: $KUBE_PROXY_WEB_INTERNAL_PORT
-        command: ["mitmweb"]
-        args: ["--web-host", "0.0.0.0", "--no-web-open-browser", "-p", "$KUBE_PROXY_INTERNAL_PORT", "--set", "ssl_insecure"]
diff --git a/test/simulator-group/pvc-cleaner/pvc-cleaner.yaml b/test/simulator-group/pvc-cleaner/pvc-cleaner.yaml
new file mode 100644
index 0000000..790ee87
--- /dev/null
+++ b/test/simulator-group/pvc-cleaner/pvc-cleaner.yaml
@@ -0,0 +1,19 @@
+apiVersion: v1
+kind: Pod
+metadata:
+  name: pvc-cleaner
+  namespace: $PVC_CLEANER_NAMESPACE
+spec:
+  restartPolicy: Never
+  containers:
+  - name: pvc-cleaner
+    image: "ubuntu:20.10"
+    command: ["/bin/sh","-c"]
+    args: ["rm -rf $PVC_CLEANER_RM_PATH/*"]
+    volumeMounts:
+    - mountPath: $PVC_CLEANER_RM_PATH
+      name: pvc-cleaner-m-vol
+  volumes:
+  - name: pvc-cleaner-m-vol
+    persistentVolumeClaim:
+      claimName: $PVC_CLEANER_CLAIMNAME
\ No newline at end of file