From 6ea29d2ac1c5c9d35ceebb233c25c05c40c168c7 Mon Sep 17 00:00:00 2001
From: Ling Zhu <lz0002@surrey.ac.uk>
Date: Wed, 1 Dec 2021 14:05:38 +0000
Subject: [PATCH] Add 5Genesis usecase

---
 deployment/apex-2.2.0.yaml                    |  36 ++++++
 deployment/{apex.yaml => apex-2.5.3.yaml}     |   6 +-
 deployment/apex-5genesis-2.2.0.yaml           |  36 ++++++
 deployment/customisation/Dockerfile           |  21 ++--
 deployment/customisation/v253_Dockerfile      |  33 ++++++
 deployment/noc-apex.yaml                      |  77 -------------
 deployment/onap-apex.yaml                     |  77 -------------
 deployment/usecase-5genesis/Dockerfile        |  32 ++++++
 .../usecase-5genesis/config/config.json       |  61 +++++++++++
 .../events/Example_Event.json                 |   8 ++
 .../events/trigger-event.json                 |   9 ++
 .../usecase-5genesis/logic/Always_Serve_TL.js |  26 +++++
 .../usecase-5genesis/logic/Example_TL.js      |  20 ++++
 deployment/usecase-5genesis/logs/logback.xml  | 103 ++++++++++++++++++
 .../usecase-5genesis/policy-apex/Policy.apex  |  63 +++++++++++
 deployment/usecase-5genesis/run.bat           |   5 +
 .../usecase-5genesis/scripts/REST_Tester.py   |  74 +++++++++++++
 deployment/usecase-5genesis/scripts/start.sh  |   2 +
 .../usecase-5genesis/scripts/startTest.sh     |   2 +
 .../tosca-template/ToscaTemplate.json         |  17 +++
 20 files changed, 541 insertions(+), 167 deletions(-)
 create mode 100644 deployment/apex-2.2.0.yaml
 rename deployment/{apex.yaml => apex-2.5.3.yaml} (93%)
 create mode 100644 deployment/apex-5genesis-2.2.0.yaml
 create mode 100644 deployment/customisation/v253_Dockerfile
 delete mode 100644 deployment/noc-apex.yaml
 delete mode 100644 deployment/onap-apex.yaml
 create mode 100644 deployment/usecase-5genesis/Dockerfile
 create mode 100644 deployment/usecase-5genesis/config/config.json
 create mode 100644 deployment/usecase-5genesis/events/Example_Event.json
 create mode 100644 deployment/usecase-5genesis/events/trigger-event.json
 create mode 100644 deployment/usecase-5genesis/logic/Always_Serve_TL.js
 create mode 100644 deployment/usecase-5genesis/logic/Example_TL.js
 create mode 100644 deployment/usecase-5genesis/logs/logback.xml
 create mode 100644 deployment/usecase-5genesis/policy-apex/Policy.apex
 create mode 100644 deployment/usecase-5genesis/run.bat
 create mode 100644 deployment/usecase-5genesis/scripts/REST_Tester.py
 create mode 100755 deployment/usecase-5genesis/scripts/start.sh
 create mode 100644 deployment/usecase-5genesis/scripts/startTest.sh
 create mode 100644 deployment/usecase-5genesis/tosca-template/ToscaTemplate.json

diff --git a/deployment/apex-2.2.0.yaml b/deployment/apex-2.2.0.yaml
new file mode 100644
index 0000000..fae5f82
--- /dev/null
+++ b/deployment/apex-2.2.0.yaml
@@ -0,0 +1,36 @@
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+  name: apex-220
+  labels:
+    app: apex-220
+spec:
+  selector:
+    matchLabels:
+      app: apex-220
+  replicas: 1
+  template:
+    metadata:
+      labels:
+        app: apex-220
+    spec:
+      hostNetwork: true
+      containers:
+      - name: apex-220
+        #image: onap/policy-apex-pdp:2.2.0
+        image: gitlab-registry.eps.surrey.ac.uk/noc/apex:2.2.0a
+        command: ["sh", "-c", "while true; do sleep 3600; done"]
+        #command: ["sh", "-c", "apexApps.sh engine -c examples/config/SampleDomain/Stdin2StdoutJsonEventJavascript.json"]
+        #command: ["sh", "-c", "apexApps.sh engine -c examples/config/MyFirstPolicy/1/MyFirstPolicyConfig"]
+        ports:
+        - name: http
+          containerPort: 8080
+        - name: ui-deploy
+          containerPort: 12345
+        - name: ui-web
+          containerPort: 18989
+        - name: event-in
+          containerPort: 23324
+        imagePullPolicy: IfNotPresent
+      restartPolicy: Always
+
diff --git a/deployment/apex.yaml b/deployment/apex-2.5.3.yaml
similarity index 93%
rename from deployment/apex.yaml
rename to deployment/apex-2.5.3.yaml
index c3f69aa..cffeac1 100644
--- a/deployment/apex.yaml
+++ b/deployment/apex-2.5.3.yaml
@@ -2,7 +2,7 @@
 kind: Service
 apiVersion: v1
 metadata:
-  name: apex-svc
+  name: apex-253-svc
 spec:
   selector:
     app: apex
@@ -45,7 +45,7 @@ spec:
 apiVersion: apps/v1
 kind: Deployment
 metadata:
-  name: apex
+  name: apex-253
   labels:
     app: apex
 spec:
@@ -60,7 +60,7 @@ spec:
     spec:
       containers:
       - name: apex
-        image: gitlab-registry.eps.surrey.ac.uk/noc/apex:example
+        image: gitlab-registry.eps.surrey.ac.uk/noc/apex:2.5.3b-noc
         #command: ["sh", "-c", "while true; do sleep 3600; done"]
         command: ["sh", "-c", "/apex/start.sh"]
         ports:
diff --git a/deployment/apex-5genesis-2.2.0.yaml b/deployment/apex-5genesis-2.2.0.yaml
new file mode 100644
index 0000000..844cee3
--- /dev/null
+++ b/deployment/apex-5genesis-2.2.0.yaml
@@ -0,0 +1,36 @@
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+  name: apex-220
+  labels:
+    app: apex-220
+spec:
+  selector:
+    matchLabels:
+      app: apex-220
+  replicas: 1
+  template:
+    metadata:
+      labels:
+        app: apex-220
+    spec:
+      hostNetwork: true
+      containers:
+      - name: apex-220
+        #image: onap/policy-apex-pdp:2.2.0
+        image: gitlab-registry.eps.surrey.ac.uk/noc/apex:5genesis
+        command: ["sh", "-c", "while true; do sleep 3600; done"]
+        #command: ["sh", "-c", "apexApps.sh engine -c examples/config/SampleDomain/Stdin2StdoutJsonEventJavascript.json"]
+        #command: ["sh", "-c", "apexApps.sh engine -c examples/config/MyFirstPolicy/1/MyFirstPolicyConfig"]
+        ports:
+        - name: http
+          containerPort: 8080
+        - name: ui-deploy
+          containerPort: 12345
+        - name: ui-web
+          containerPort: 18989
+        - name: event-in
+          containerPort: 23324
+        imagePullPolicy: Always
+      restartPolicy: Always
+
diff --git a/deployment/customisation/Dockerfile b/deployment/customisation/Dockerfile
index b1a8d64..ab8aebc 100644
--- a/deployment/customisation/Dockerfile
+++ b/deployment/customisation/Dockerfile
@@ -1,7 +1,7 @@
-FROM gitlab-registry.eps.surrey.ac.uk/noc/apex:2.5.3
-WORKDIR /apex
+FROM onap/policy-apex-pdp:2.2.0
+WORKDIR /home/apexuser
 
-USER root
+USER apexuser
 COPY ./policy-apex/* ./policy-apex/
 RUN mkdir -p policy-json
 #COPY ./policy-json/* ./policy-json/
@@ -10,9 +10,14 @@ COPY ./config/* ./config/
 COPY ./logs/logback.xml /opt/app/policy/apex-pdp/etc/
 COPY ./tosca-template/* ./tosca-template/
 
-COPY ./scripts/* ./
-RUN chmod +x ./start.sh
+# Customise PS1
+RUN touch /home/apexuser/.bashrc
+RUN echo "[ -z \"\$PS1\" ] && return">> /home/apexuser/.bashrc
+RUN echo "PS1=\"\\[\\033[35m\\][\\u@\\h \\w]:\\[\\033[37m\\]\"">>/home/apexuser/.bashrc
+#COPY ./scripts/* ./
+#RUN chmod +x ./start.sh
 # Add bash shell
+USER root
 RUN apk update
 RUN apk upgrade
 RUN apk add bash
@@ -20,14 +25,10 @@ RUN apk add bash-completion
 RUN apk add nano
 RUN apk add yajl-tools
 
-# Customise PS1
-RUN touch /root/.bashrc
-RUN echo "[ -z \"\$PS1\" ] && return">> /root/.bashrc
-RUN echo "PS1=\"\\[\\033[35m\\][\\u@\\h \\w]:\\[\\033[37m\\]\"">>/root/.bashrc
 
 EXPOSE 12345 18989 23324 8080
 
-RUN apexCLIToscaEditor.sh -c policy-apex/Policy.apex -ot policy-json/Policy.json -l ./test.log -ac config/config.json -t ./tosca-template/ToscaTemplate.json
+#RUN apexCLIToscaEditor.sh -c policy-apex/Policy.apex -ot policy-json/Policy.json -l ./test.log -ac config/config.json -t ./tosca-template/ToscaTemplate.json
 CMD ["./start.sh"]
 
 #CMD ["./startTest.sh"]
diff --git a/deployment/customisation/v253_Dockerfile b/deployment/customisation/v253_Dockerfile
new file mode 100644
index 0000000..b1a8d64
--- /dev/null
+++ b/deployment/customisation/v253_Dockerfile
@@ -0,0 +1,33 @@
+FROM gitlab-registry.eps.surrey.ac.uk/noc/apex:2.5.3
+WORKDIR /apex
+
+USER root
+COPY ./policy-apex/* ./policy-apex/
+RUN mkdir -p policy-json
+#COPY ./policy-json/* ./policy-json/
+COPY ./logic/* ./logic/
+COPY ./config/* ./config/
+COPY ./logs/logback.xml /opt/app/policy/apex-pdp/etc/
+COPY ./tosca-template/* ./tosca-template/
+
+COPY ./scripts/* ./
+RUN chmod +x ./start.sh
+# Add bash shell
+RUN apk update
+RUN apk upgrade
+RUN apk add bash
+RUN apk add bash-completion
+RUN apk add nano
+RUN apk add yajl-tools
+
+# Customise PS1
+RUN touch /root/.bashrc
+RUN echo "[ -z \"\$PS1\" ] && return">> /root/.bashrc
+RUN echo "PS1=\"\\[\\033[35m\\][\\u@\\h \\w]:\\[\\033[37m\\]\"">>/root/.bashrc
+
+EXPOSE 12345 18989 23324 8080
+
+RUN apexCLIToscaEditor.sh -c policy-apex/Policy.apex -ot policy-json/Policy.json -l ./test.log -ac config/config.json -t ./tosca-template/ToscaTemplate.json
+CMD ["./start.sh"]
+
+#CMD ["./startTest.sh"]
diff --git a/deployment/noc-apex.yaml b/deployment/noc-apex.yaml
deleted file mode 100644
index 3c3ea5d..0000000
--- a/deployment/noc-apex.yaml
+++ /dev/null
@@ -1,77 +0,0 @@
----
-kind: Service
-apiVersion: v1
-metadata:
-  name: noc-apex-svc
-spec:
-  selector:
-    app: noc-apex
-  ports:
-    - name: ui
-      protocol: "TCP"
-      # Port accessible inside cluster
-      port: 8080
-      # Port to forward to inside the pod
-      targetPort: http
-      # Port accessible outside cluster
-      nodePort: 30080
-    - name: tcp-1
-      protocol: "TCP"
-      # Port accessible inside cluster
-      port: 12345
-      # Port to forward to inside the pod
-      targetPort: tcp1
-      # Port accessible outside cluster
-      nodePort: 32345
-    - name: tcp-2
-      protocol: "TCP"
-      # Port accessible inside cluster
-      port: 18989
-      # Port to forward to inside the pod
-      targetPort: tcp2
-      # Port accessible outside cluster
-      nodePort: 28989
-    - name: tcp-3
-      protocol: "TCP"
-      # Port accessible inside cluster
-      port: 23324
-      # Port to forward to inside the pod
-      targetPort: tcp3
-      # Port accessible outside cluster
-      nodePort: 23324
-  type: NodePort  #LoadBalancer
----
-
-apiVersion: apps/v1
-kind: Deployment
-metadata:
-  name: noc-apex
-  labels:
-    app: noc-apex
-spec:
-  selector:
-    matchLabels:
-      app: noc-apex
-  replicas: 1
-  template:
-    metadata:
-      labels:
-        app: noc-apex
-    spec:
-      containers:
-      - name: noc-apex
-        image: gitlab-registry.eps.surrey.ac.uk/noc/apex:2.5.3b-noc
-        #command: ["sh", "-c", "while true; do sleep 3600; done"]
-        command: ["sh", "-c", "/apex/start.sh"]
-        ports:
-        - name: http
-          containerPort: 8080
-        - name: tcp1
-          containerPort: 12345
-        - name: tcp2
-          containerPort: 18989
-        - name: tcp3
-          containerPort: 23324
-        imagePullPolicy: IfNotPresent
-      restartPolicy: Always
-
diff --git a/deployment/onap-apex.yaml b/deployment/onap-apex.yaml
deleted file mode 100644
index 0b78843..0000000
--- a/deployment/onap-apex.yaml
+++ /dev/null
@@ -1,77 +0,0 @@
----
-kind: Service
-apiVersion: v1
-metadata:
-  name: onap-apex-svc
-spec:
-  selector:
-    app: onap-apex
-  ports:
-    - name: ui
-      protocol: "TCP"
-      # Port accessible inside cluster
-      port: 8080
-      # Port to forward to inside the pod
-      targetPort: http
-      # Port accessible outside cluster
-      nodePort: 30080
-    - name: tcp-1
-      protocol: "TCP"
-      # Port accessible inside cluster
-      port: 12345
-      # Port to forward to inside the pod
-      targetPort: tcp1
-      # Port accessible outside cluster
-      nodePort: 32345
-    - name: tcp-2
-      protocol: "TCP"
-      # Port accessible inside cluster
-      port: 18989
-      # Port to forward to inside the pod
-      targetPort: tcp2
-      # Port accessible outside cluster
-      nodePort: 28989
-    - name: tcp-3
-      protocol: "TCP"
-      # Port accessible inside cluster
-      port: 23324
-      # Port to forward to inside the pod
-      targetPort: tcp3
-      # Port accessible outside cluster
-      nodePort: 23324
-  type: NodePort  #LoadBalancer
----
-
-apiVersion: apps/v1
-kind: Deployment
-metadata:
-  name: onap-apex
-  labels:
-    app: onap-apex
-spec:
-  selector:
-    matchLabels:
-      app: onap-apex
-  replicas: 1
-  template:
-    metadata:
-      labels:
-        app: onap-apex
-    spec:
-      containers:
-      - name: onap-apex
-        image: onap/policy-apex-pdp:2.2.0
-        #command: ["sh", "-c", "while true; do sleep 3600; done"]
-        command: ["sh", "-c", "apexApps.sh engine -c examples/config/SampleDomain/Stdin2StdoutJsonEventJavascript.json"]
-        ports:
-        - name: http
-          containerPort: 8080
-        - name: tcp1
-          containerPort: 12345
-        - name: tcp2
-          containerPort: 18989
-        - name: tcp3
-          containerPort: 23324
-        imagePullPolicy: IfNotPresent
-      restartPolicy: Always
-
diff --git a/deployment/usecase-5genesis/Dockerfile b/deployment/usecase-5genesis/Dockerfile
new file mode 100644
index 0000000..bf40fb2
--- /dev/null
+++ b/deployment/usecase-5genesis/Dockerfile
@@ -0,0 +1,32 @@
+FROM onap/policy-apex-pdp:2.2.0
+WORKDIR /home/apexuser
+
+USER root
+RUN apk update
+RUN apk upgrade
+RUN apk add bash
+RUN apk add bash-completion
+RUN apk add nano
+RUN apk add yajl-tools
+
+USER apexuser
+COPY --chown=apexuser:apexuser ./policy-apex/* ./policy-apex/
+RUN mkdir -p ./policy-json
+#COPY ./policy-json/* ./policy-json/
+COPY --chown=apexuser:apexuser ./logic/* ./logic/
+COPY --chown=apexuser:apexuser ./config/* ./config/
+COPY --chown=apexuser:apexuser ./logs/logback.xml /opt/app/policy/apex-pdp/etc/
+COPY --chown=apexuser:apexuser ./tosca-template/* ./tosca-template/
+
+COPY --chown=apexuser:apexuser ./scripts/* ./
+
+RUN echo "[ -z \"\$PS1\" ] && return">> /home/apexuser/.bashrc
+RUN echo "PS1=\"\\[\\033[35m\\][\\u@\\h \\w]:\\[\\033[37m\\]\"">>/home/apexuser/.bashrc
+
+EXPOSE 12345 18989 23324 8080 5000
+
+RUN apexCLIEditor.sh -c policy-apex/Policy.apex -o policy-json/Policy.json
+CMD ["./start.sh"]
+
+#CMD ["./startTest.sh"]
+#CMD ["bash"]
diff --git a/deployment/usecase-5genesis/config/config.json b/deployment/usecase-5genesis/config/config.json
new file mode 100644
index 0000000..b15a84f
--- /dev/null
+++ b/deployment/usecase-5genesis/config/config.json
@@ -0,0 +1,61 @@
+{
+    "engineServiceParameters": {
+        "name": "MyApexEngine",
+        "version": "0.0.1",
+        "id": 45,
+        "instanceCount": 4,
+        "deploymentPort": 12345,
+        "policyModelFileName": "policy-json/Policy.json",
+        "engineParameters": {
+            "executorParameters": {
+                "JAVASCRIPT": {
+                    "parameterClassName": "org.onap.policy.apex.plugins.executor.javascript.JavascriptExecutorParameters"
+                }
+            }
+        }
+    },
+    "eventInputParameters": {
+        "FirstConsumer": {
+            "carrierTechnologyParameters": {
+                "carrierTechnology": "RESTSERVER",
+                "parameterClassName": "org.onap.policy.apex.plugins.event.carrier.restserver.RestServerCarrierTechnologyParameters",
+                "parameters": {
+                    "standalone": true,
+                    "host": "0.0.0.0",
+                    "port": 23324
+                }
+            },
+            "eventProtocolParameters": {
+                "eventProtocol": "JSON"
+            },
+            "synchronousMode": true,
+            "synchronousPeer": "FirstProducer",
+            "synchronousTimeout": 2000
+        }
+    },
+    "eventOutputParameters": {
+        "FirstProducer": {
+            "carrierTechnologyParameters": {
+                "carrierTechnology": "RESTSERVER",
+                "parameterClassName": "org.onap.policy.apex.plugins.event.carrier.restserver.RestServerCarrierTechnologyParameters"
+            },
+            "eventProtocolParameters": {
+                "eventProtocol": "JSON"
+            },
+            "synchronousMode": true,
+            "synchronousPeer": "FirstConsumer",
+            "synchronousTimeout": 2000
+        },
+        "standardIOProducer": {
+            "carrierTechnologyParameters": {
+                "carrierTechnology": "FILE",
+                "parameters": {
+                    "standardIo": true
+                }
+            },
+            "eventProtocolParameters": {
+                "eventProtocol": "JSON"
+            }
+        }
+    }
+}
\ No newline at end of file
diff --git a/deployment/usecase-5genesis/events/Example_Event.json b/deployment/usecase-5genesis/events/Example_Event.json
new file mode 100644
index 0000000..ef38f0f
--- /dev/null
+++ b/deployment/usecase-5genesis/events/Example_Event.json
@@ -0,0 +1,8 @@
+{
+  "name": "Example_Event_Input",
+  "version": "0.0.1",
+  "nameSpace": "example.apex.event",
+  "source": "external",
+  "target": "apex",
+  "input": "Hello World"
+}
\ No newline at end of file
diff --git a/deployment/usecase-5genesis/events/trigger-event.json b/deployment/usecase-5genesis/events/trigger-event.json
new file mode 100644
index 0000000..7098b59
--- /dev/null
+++ b/deployment/usecase-5genesis/events/trigger-event.json
@@ -0,0 +1,9 @@
+{
+    "name" : "Always_Serve",
+    "version" : "1.0",
+    "deployment_name" : "iperf_avr",
+    "replica" : 3,
+    "average_throughput" : 300,
+    "threshold": 100,
+    "time": 1638281567105
+}
diff --git a/deployment/usecase-5genesis/logic/Always_Serve_TL.js b/deployment/usecase-5genesis/logic/Always_Serve_TL.js
new file mode 100644
index 0000000..0449222
--- /dev/null
+++ b/deployment/usecase-5genesis/logic/Always_Serve_TL.js
@@ -0,0 +1,26 @@
+var logger = executor.logger;
+var time = new Date();
+
+logger.info("##START## Always_Serve_TL");
+
+var deployment_name = executor.inFields.get("deployment_name");
+logger.info("~~deployment_name: " + deployment_name);
+var replica = executor.inFields.get("replica");
+logger.info("~~replica: " + replica);
+var average_throughput = executor.inFields.get("average_throughput");
+logger.info("~~average_throughput: " + average_throughput);
+var threshold = executor.inFields.get("threshold");
+logger.info("~~threshold: " + threshold);
+var time = executor.inFields.get("time");
+logger.info("~~time: " + time);
+
+// Do something here
+
+var result = "Increase the number of replica by 2";
+
+executor.outFields.put("action", result);
+
+logger.info("##END## Always_Serve_TL");
+
+var returnValue = true;
+returnValue;
diff --git a/deployment/usecase-5genesis/logic/Example_TL.js b/deployment/usecase-5genesis/logic/Example_TL.js
new file mode 100644
index 0000000..201fdb0
--- /dev/null
+++ b/deployment/usecase-5genesis/logic/Example_TL.js
@@ -0,0 +1,20 @@
+var logger = executor.logger;
+var time = new Date();
+
+logger.info("##START## Example_TL");
+
+var input = executor.inFields.get("input");
+logger.info("~~input: " + input);
+
+executor.getContextAlbum("Context_Album").put(input, time.toString());
+logger.info("~~Time of input stored: " + time + " in Context_Album");
+
+var contextAlbumData = executor.getContextAlbum("Context_Album").get(input);
+logger.info("~~Grab time from Context Album");
+
+executor.outFields.put("output", contextAlbumData);
+
+logger.info("##END## Example_TL");
+
+var returnValue = true;
+returnValue;
diff --git a/deployment/usecase-5genesis/logs/logback.xml b/deployment/usecase-5genesis/logs/logback.xml
new file mode 100644
index 0000000..8326122
--- /dev/null
+++ b/deployment/usecase-5genesis/logs/logback.xml
@@ -0,0 +1,103 @@
+<!--
+  ============LICENSE_START=======================================================
+   Copyright (C) 2020 Bell Canada. 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.
+  SPDX-License-Identifier: Apache-2.0
+  ============LICENSE_END=========================================================
+-->
+
+<configuration scan="true" scanPeriod="30 seconds" debug="false">
+
+    <appender name="ErrorOut" class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <file>/var/log/onap/policy/apex-pdp/error.log</file>
+        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
+            <fileNamePattern>/var/log/onap/policy/apex-pdp/error.%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>[%d{yyyy-MM-dd'T'HH:mm:ss.SSS+00:00, UTC}|%level|%logger{0}|%thread] %msg%n</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>/var/log/onap/policy/apex-pdp/debug.log</file>
+        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
+            <fileNamePattern>/var/log/onap/policy/apex-pdp/debug.%d{yyyy-MM-dd}.%i.log.zip
+            </fileNamePattern>
+            <maxFileSize>50MB</maxFileSize>
+            <maxHistory>30</maxHistory>
+            <totalSizeCap>10GB</totalSizeCap>
+        </rollingPolicy>
+        <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="AsyncDebugOut" class="ch.qos.logback.classic.AsyncAppender">
+        <appender-ref ref="DebugOut" />
+    </appender>
+
+    <appender name="NetworkOut" class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <file>/var/log/onap/policy/apex-pdp/network.log</file>
+        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
+            <fileNamePattern>/var/log/onap/policy/apex-pdp/network.%d{yyyy-MM-dd}.%i.log.zip
+            </fileNamePattern>
+            <maxFileSize>50MB</maxFileSize>
+            <maxHistory>30</maxHistory>
+            <totalSizeCap>10GB</totalSizeCap>
+        </rollingPolicy>
+        <encoder>
+            <pattern>[%d{yyyy-MM-dd'T'HH:mm:ss.SSS+00:00, UTC}|%t]%m%n</pattern>
+        </encoder>
+    </appender>
+
+    <appender name="AsyncNetworkOut" class="ch.qos.logback.classic.AsyncAppender">
+        <appender-ref ref="NetworkOut" />
+    </appender>
+
+    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
+        <encoder>
+            <Pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %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>
+
+    <root level="INFO">
+        <appender-ref ref="AsyncDebugOut" />
+        <appender-ref ref="AsyncErrorOut" />
+        <appender-ref ref="AsyncStdOut" />
+    </root>
+
+</configuration>
\ No newline at end of file
diff --git a/deployment/usecase-5genesis/policy-apex/Policy.apex b/deployment/usecase-5genesis/policy-apex/Policy.apex
new file mode 100644
index 0000000..4dcb5b3
--- /dev/null
+++ b/deployment/usecase-5genesis/policy-apex/Policy.apex
@@ -0,0 +1,63 @@
+
+#----------------------------------------------------------------------------------------------------------------------------------------------------------------
+
+model create name=5GENESIS_SURREY_POLICY_MODEL
+
+#----------------------------------------------------------------------------------------------------------------------------------------------------------------
+
+##-- Primitive Types --##
+
+schema create		name=String_Type			flavour=Java		schema=java.lang.String
+schema create 		name=Integer_Type			flavour=Java		schema=java.lang.Integer
+schema create 		name=Long_Type				flavour=Java		schema=java.lang.Long
+
+#----------------------------------------------------------------------------------------------------------------------------------------------------------------
+
+##-- Events --##
+
+event create 				name=Always_Serve			version="1.0"
+event parameter create 		name=Always_Serve			parName=deployment_name			schemaName=String_Type
+event parameter create 		name=Always_Serve			parName=replica					schemaName=Integer_Type
+event parameter create 		name=Always_Serve			parName=average_throughput		schemaName=Integer_Type
+event parameter create 		name=Always_Serve			parName=threshold				schemaName=Integer_Type
+event parameter create 		name=Always_Serve			parName=time					schemaName=Long_Type
+
+event create 				name=Always_Serve_Output			version="1.0"
+event parameter create 		name=Always_Serve_Output			parName=action			schemaName=String_Type
+
+#----------------------------------------------------------------------------------------------------------------------------------------------------------------
+
+##-- Albums --##
+
+album create				name=Example_Album					scope=GLOBAL			writable=true		schemaName=String_Type
+
+#----------------------------------------------------------------------------------------------------------------------------------------------------------------
+
+##-- TASKS --##
+
+task create					name=Always_Serve_Task
+task inputfield create		name=Always_Serve_Task				fieldName=deployment_name			schemaName=String_Type
+task inputfield create		name=Always_Serve_Task				fieldName=replica					schemaName=Integer_Type
+task inputfield create		name=Always_Serve_Task				fieldName=average_throughput		schemaName=Integer_Type
+task inputfield create		name=Always_Serve_Task				fieldName=threshold					schemaName=Integer_Type
+task inputfield create		name=Always_Serve_Task				fieldName=time						schemaName=Long_Type
+
+task outputfield create		name=Always_Serve_Task				fieldName=action					schemaName=String_Type
+
+task contextref create		name=Always_Serve_Task				albumName=Example_Album
+
+task logic create			name=Always_Serve_Task				logicFlavour=JAVASCRIPT					logic=LS
+#MACROFILE:"logic/Always_Serve_TL.js"
+LE
+
+#----------------------------------------------------------------------------------------------------------------------------------------------------------------
+
+##-- POLICIES --##
+
+policy create						name=Always_Serve_Policy		template=FREEFORM				firstState=Trigger_State
+
+policy state create					name=Always_Serve_Policy		stateName=Trigger_State			triggerName=Always_Serve		defaultTaskName=Always_Serve_Task
+policy state output	create			name=Always_Serve_Policy		stateName=Trigger_State			outputName=action 				eventName=Always_Serve_Output
+policy state taskref create			name=Always_Serve_Policy		stateName=Trigger_State			taskName=Always_Serve_Task		outputType=DIRECT			outputName=action
+
+#-------------------------------------------------------------------------------------------------------------------------------------------------
diff --git a/deployment/usecase-5genesis/run.bat b/deployment/usecase-5genesis/run.bat
new file mode 100644
index 0000000..0da9293
--- /dev/null
+++ b/deployment/usecase-5genesis/run.bat
@@ -0,0 +1,5 @@
+docker build --no-cache -t 5genesis-surrey-apex .
+
+docker run -it -p 23324:23324 -p 5000:5000 --name apex-engine --rm  5genesis-surrey-apex
+
+pause
diff --git a/deployment/usecase-5genesis/scripts/REST_Tester.py b/deployment/usecase-5genesis/scripts/REST_Tester.py
new file mode 100644
index 0000000..ea5ce69
--- /dev/null
+++ b/deployment/usecase-5genesis/scripts/REST_Tester.py
@@ -0,0 +1,74 @@
+#!/usr/bin/env python
+# encoding: utf-8
+import json
+import time
+import requests
+
+from flask import Flask
+from flask import request
+from flask import jsonify
+
+app = Flask(__name__)
+@app.route('/')
+def index():
+    time.sleep(5)
+    return json.dumps({
+                        "nameSpace": "apex.event.context",
+                        "name": "Context_Trigger",
+                        "version": "0.0.1",
+                        "source": "External",
+                        "target": "APEX",
+                        "report": "This is a Context Event"
+                        }
+)
+    
+@app.route('/api/slice/1234', methods=['PUT'])
+def testStateOne():
+    time.sleep(5)
+    print("State One has been Triggered")
+    return json.dumps({"response" : "State One success"})
+
+@app.route('/api/slice/1234/restart', methods=['POST'])
+def testStateTwo():
+    time.sleep(5)
+    print("State Two has been Triggered")
+    return json.dumps({"response" : "State Two success"})
+    
+@app.route('/api/slice/1234', methods=['POST'])
+def testStateThree():
+    time.sleep(5)
+    print("State Three has been Triggered")
+    return json.dumps({"response" : "State Three success"})
+  
+@app.route('/RESTIssuer', methods=['GET', 'POST', 'PUT', 'DELETE']) 
+def RESTIssuer():
+    message = request.get_json()
+    
+    path = "http://" + message["path"]
+    method = message["method"]
+    body = message["body"]
+    
+    print("Path = " , path)
+    print("Method = " , method)
+    print("Body = " , body)
+    headers = {'Content-Type': 'application/json'}
+    
+    if(method == "get"):
+        response = requests.get(path, data=json.dumps(body))
+        print("GET Called")
+    if(method == "post"):
+        response = requests.post(path, data=json.dumps(body))
+        print("POST Called")
+    if(method == "put"):
+        response = requests.put(path, body)
+        print("PUT Called")
+    if(method == "delete"):
+        response = requests.post(path)
+        print("DELETE Called")
+
+    print("Response = " , response)
+    print("Response = " , response.text)
+
+    return 'POST RECEIVED'
+
+app.run(debug=True,host="0.0.0.0")
diff --git a/deployment/usecase-5genesis/scripts/start.sh b/deployment/usecase-5genesis/scripts/start.sh
new file mode 100755
index 0000000..c8fa0e9
--- /dev/null
+++ b/deployment/usecase-5genesis/scripts/start.sh
@@ -0,0 +1,2 @@
+#!/bin/bash
+apexApps.sh engine -c config/config.json
\ No newline at end of file
diff --git a/deployment/usecase-5genesis/scripts/startTest.sh b/deployment/usecase-5genesis/scripts/startTest.sh
new file mode 100644
index 0000000..12a7347
--- /dev/null
+++ b/deployment/usecase-5genesis/scripts/startTest.sh
@@ -0,0 +1,2 @@
+ #!/bin/bash
+apexCLIEditor.sh -c policy-apex/Policy.apex -o policy-json/Policy.json
\ No newline at end of file
diff --git a/deployment/usecase-5genesis/tosca-template/ToscaTemplate.json b/deployment/usecase-5genesis/tosca-template/ToscaTemplate.json
new file mode 100644
index 0000000..87f0047
--- /dev/null
+++ b/deployment/usecase-5genesis/tosca-template/ToscaTemplate.json
@@ -0,0 +1,17 @@
+{
+  "tosca_definitions_version": "tosca_simple_yaml_1_1_0",
+  "topology_template": {
+    "policies": [
+      {
+        "native.sampledomain": {
+          "type": "onap.policies.native.Apex",
+          "type_version": "1.0.0",
+          "name": "native.sampledomain",
+          "version": "1.0.0",
+          "properties": {
+          }
+        }
+      }
+    ]
+  }
+}
\ No newline at end of file
-- 
GitLab