diff --git a/deployment/usecase-5genesis/Dockerfile b/deployment/usecase-5genesis/apex-build/Dockerfile similarity index 100% rename from deployment/usecase-5genesis/Dockerfile rename to deployment/usecase-5genesis/apex-build/Dockerfile diff --git a/deployment/usecase-5genesis/config/config.json b/deployment/usecase-5genesis/apex-build/config/config.json similarity index 100% rename from deployment/usecase-5genesis/config/config.json rename to deployment/usecase-5genesis/apex-build/config/config.json diff --git a/deployment/usecase-5genesis/events/Example_Event.json b/deployment/usecase-5genesis/apex-build/events/Example_Event.json similarity index 100% rename from deployment/usecase-5genesis/events/Example_Event.json rename to deployment/usecase-5genesis/apex-build/events/Example_Event.json diff --git a/deployment/usecase-5genesis/events/trigger-event.json b/deployment/usecase-5genesis/apex-build/events/trigger-event.json similarity index 100% rename from deployment/usecase-5genesis/events/trigger-event.json rename to deployment/usecase-5genesis/apex-build/events/trigger-event.json diff --git a/deployment/usecase-5genesis/apex-build/logic/Always_Serve_TL.js b/deployment/usecase-5genesis/apex-build/logic/Always_Serve_TL.js new file mode 100644 index 0000000000000000000000000000000000000000..9c88b9e26f4d2e02f9e9fe599bd2fc35b3a35a34 --- /dev/null +++ b/deployment/usecase-5genesis/apex-build/logic/Always_Serve_TL.js @@ -0,0 +1,75 @@ +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 workload_cpu = executor.inFields.get("workload_cpu"); +logger.info("~~workload_cpu: " + workload_cpu); +var threshold = executor.inFields.get("threshold"); +logger.info("~~threshold: " + threshold); +var time = executor.inFields.get("time"); +logger.info("~~time: " + time); + +// ------------ Start of logic --------------- + +var counter_up=0; +var counter_down=0; + +if (workload_cpu>(threshold*0.8) && workload_cpu<threshold) { + //counter_up++; + if (counter_up=localStorage.getItem('val_up')){ + if (counter_up<5){ + counter_up++; + localStorage.setItem('val_up',counter_up); + localStorage.setItem('val_down',0); + } else { //more than 5 times, increase replica and reset the counters + replica++; + localStorage.setItem('val_up',0); + localStorage.setItem('val_down',0); + } + } else { // First time use without cached value + localStorage.setItem('val_up',1); + localStorage.setItem('val_down',0); + } + +} else if (workload_cpu>threshold) { + replica++; + counter_up = 0; + localStorage.setItem('val_up',0); + localStorage.setItem('val_down',0); +} else if (workload_cpu<(threshold*0.2) && replica>1) { + if (counter_down=localStorage.getItem('val_down')){ + if (counter_down<5) { + counter_down++; + localStorage.setItem('val_down',counter_down); + localStorage.setItem('val_up',0); + } else { + localStorage.setItem('val_down',0); + localStorage.setItem('val_up',0); + replica--; + } + }else{ + localStorage.setItem('val_down',1); + localStorage.setItem('val_up',0); + } +} else { + replica = 0; + counter_up=localStorage.getItem('val_up'); + counter_down=localStorage.getItem('val_down'); + document.write("No action taken <br>"); +} +var result = "Update the number of replica to: "+replica.toString() +//var result = "Update the number of replica to "+(replica).toString()+"<br>"+"counter_up: "+counter_up.toString()+"<br>"+"counter_down: "+counter_down.toString(); + +// ------------ End of logic --------------- + +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/apex-build/logic/Example_TL.js similarity index 100% rename from deployment/usecase-5genesis/logic/Example_TL.js rename to deployment/usecase-5genesis/apex-build/logic/Example_TL.js diff --git a/deployment/usecase-5genesis/apex-build/logic/logic_test.php b/deployment/usecase-5genesis/apex-build/logic/logic_test.php new file mode 100644 index 0000000000000000000000000000000000000000..7623f56eb215e1e8011d55287bddb07e2d6c0871 --- /dev/null +++ b/deployment/usecase-5genesis/apex-build/logic/logic_test.php @@ -0,0 +1,70 @@ +<?php +/* -------------------------------------- + * Use the following format to test from a browser + * + * http://<Host-IP>:<external-port>/?workload=102&threshold=200&replica=1 + * + * */ + echo "JS Test"; + echo "<br>"; + $w=$_GET['workload']; + $t=$_GET['threshold']; + $r=$_GET['replica']; + echo "w=$w, t=$t, r=$r"; + echo "<br>"; +?> + +<script type="text/JavaScript"> +var workload_cpu = <?php echo $w ?>; +var threshold = <?php echo $t ?>; +var replica = <?php echo $r ?>; +var counter_up=0; +var counter_down=0; + +if (workload_cpu>(threshold*0.8) && workload_cpu<threshold) { + if (counter_up=localStorage.getItem('val_up')){ + if (counter_up<5){ + counter_up++; + localStorage.setItem('val_up',counter_up); + localStorage.setItem('val_down',0); + } else { //more than 5 times, increase replica and reset the counters + replica++; + localStorage.setItem('val_up',0); + localStorage.setItem('val_down',0); + } + } else { // First time use without cached value + localStorage.setItem('val_up',1); + localStorage.setItem('val_down',0); + } + +} else if (workload_cpu>threshold) { + replica++; + counter_up = 0; + localStorage.setItem('val_up',0); + localStorage.setItem('val_down',0); +} else if (workload_cpu<(threshold*0.2) && replica>1) { + if (counter_down=localStorage.getItem('val_down')){ + if (counter_down<5) { + counter_down++; + localStorage.setItem('val_down',counter_down); + localStorage.setItem('val_up',0); + } else { + localStorage.setItem('val_down',0); + localStorage.setItem('val_up',0); + replica--; + } + }else{ + localStorage.setItem('val_down',1); + localStorage.setItem('val_up',0); + } +} else { + replica = -1; + counter_up=localStorage.getItem('val_up'); + counter_down=localStorage.getItem('val_down'); + document.write("No action taken <br>"); +} + +var result = "Update the number of replica to "+(replica).toString()+"<br>"+"counter_up: "+counter_up.toString()+"<br>"+"counter_down: "+counter_down.toString(); +document.write(result); +</script> + diff --git a/deployment/usecase-5genesis/logs/logback.xml b/deployment/usecase-5genesis/apex-build/logs/logback.xml similarity index 100% rename from deployment/usecase-5genesis/logs/logback.xml rename to deployment/usecase-5genesis/apex-build/logs/logback.xml diff --git a/deployment/usecase-5genesis/apex-build/policy-apex/Policy.apex b/deployment/usecase-5genesis/apex-build/policy-apex/Policy.apex new file mode 100644 index 0000000000000000000000000000000000000000..1960e53d9959f053433e030e17df0e998c52cb57 --- /dev/null +++ b/deployment/usecase-5genesis/apex-build/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=workload_cpu 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=workload_cpu 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/policy-apex/Policy.apex b/deployment/usecase-5genesis/apex-build/policy-apex/bkp_Policy.apex similarity index 100% rename from deployment/usecase-5genesis/policy-apex/Policy.apex rename to deployment/usecase-5genesis/apex-build/policy-apex/bkp_Policy.apex diff --git a/deployment/usecase-5genesis/run.bat b/deployment/usecase-5genesis/apex-build/run.bat similarity index 100% rename from deployment/usecase-5genesis/run.bat rename to deployment/usecase-5genesis/apex-build/run.bat diff --git a/deployment/usecase-5genesis/scripts/REST_Tester.py b/deployment/usecase-5genesis/apex-build/scripts/REST_Tester.py similarity index 100% rename from deployment/usecase-5genesis/scripts/REST_Tester.py rename to deployment/usecase-5genesis/apex-build/scripts/REST_Tester.py diff --git a/deployment/usecase-5genesis/scripts/start.sh b/deployment/usecase-5genesis/apex-build/scripts/start.sh similarity index 100% rename from deployment/usecase-5genesis/scripts/start.sh rename to deployment/usecase-5genesis/apex-build/scripts/start.sh diff --git a/deployment/usecase-5genesis/scripts/startTest.sh b/deployment/usecase-5genesis/apex-build/scripts/startTest.sh similarity index 100% rename from deployment/usecase-5genesis/scripts/startTest.sh rename to deployment/usecase-5genesis/apex-build/scripts/startTest.sh diff --git a/deployment/usecase-5genesis/tosca-template/ToscaTemplate.json b/deployment/usecase-5genesis/apex-build/tosca-template/ToscaTemplate.json similarity index 100% rename from deployment/usecase-5genesis/tosca-template/ToscaTemplate.json rename to deployment/usecase-5genesis/apex-build/tosca-template/ToscaTemplate.json diff --git a/deployment/usecase-5genesis/apex-build/traffic-chart/.helmignore b/deployment/usecase-5genesis/apex-build/traffic-chart/.helmignore new file mode 100644 index 0000000000000000000000000000000000000000..0e8a0eb36f4ca2c939201c0d54b5d82a1ea34778 --- /dev/null +++ b/deployment/usecase-5genesis/apex-build/traffic-chart/.helmignore @@ -0,0 +1,23 @@ +# Patterns to ignore when building packages. +# This supports shell glob matching, relative path matching, and +# negation (prefixed with !). Only one pattern per line. +.DS_Store +# Common VCS dirs +.git/ +.gitignore +.bzr/ +.bzrignore +.hg/ +.hgignore +.svn/ +# Common backup files +*.swp +*.bak +*.tmp +*.orig +*~ +# Various IDEs +.project +.idea/ +*.tmproj +.vscode/ diff --git a/deployment/usecase-5genesis/apex-build/traffic-chart/Chart.yaml b/deployment/usecase-5genesis/apex-build/traffic-chart/Chart.yaml new file mode 100644 index 0000000000000000000000000000000000000000..536f13c9898fc4d5c452971a4365d6961d8a5edd --- /dev/null +++ b/deployment/usecase-5genesis/apex-build/traffic-chart/Chart.yaml @@ -0,0 +1,24 @@ +apiVersion: v2 +name: traffic-chart +description: A Helm chart for Kubernetes + +# A chart can be either an 'application' or a 'library' chart. +# +# Application charts are a collection of templates that can be packaged into versioned archives +# to be deployed. +# +# Library charts provide useful utilities or functions for the chart developer. They're included as +# a dependency of application charts to inject those utilities and functions into the rendering +# pipeline. Library charts do not define any templates and therefore cannot be deployed. +type: application + +# This is the chart version. This version number should be incremented each time you make changes +# to the chart and its templates, including the app version. +# Versions are expected to follow Semantic Versioning (https://semver.org/) +version: 0.1.0 + +# This is the version number of the application being deployed. This version number should be +# incremented each time you make changes to the application. Versions are not expected to +# follow Semantic Versioning. They should reflect the version the application is using. +# It is recommended to use it with quotes. +appVersion: "1.16.0" diff --git a/deployment/usecase-5genesis/apex-build/traffic-chart/templates/receiver.yaml b/deployment/usecase-5genesis/apex-build/traffic-chart/templates/receiver.yaml new file mode 100644 index 0000000000000000000000000000000000000000..00fc88a4fb600c6df57c31a7e5fb6e58655385c1 --- /dev/null +++ b/deployment/usecase-5genesis/apex-build/traffic-chart/templates/receiver.yaml @@ -0,0 +1,49 @@ +kind: Service +apiVersion: v1 +metadata: + name: traffic-receiver +spec: + selector: + app: rcv + ports: + - name: rcv + protocol: "TCP" + # Port accessible inside cluster + port: 29500 + # Port to forward to inside the pod + targetPort: 29500 + # Port accessible outside cluster + nodePort: 29500 + #{{/* type: LoadBalancer*/}} + type: NodePort + + + +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: traffic-receiver +spec: + selector: + matchLabels: + app: rcv + replicas: 1 + template: + metadata: + labels: + app: rcv + allow-all-ingress: "true" + spec: + containers: + - name: server + image: gitlab-registry.eps.surrey.ac.uk/noc/ubuntu:iperf3 + #command: ["sh", "-c", "while true; do sleep 3600; done"] + command: ["sh", "-c", "iperf3 -s -p 29500"] + ports: + - name: rcv-port + containerPort: 29500 + + imagePullPolicy: IfNotPresent + restartPolicy: Always + diff --git a/deployment/usecase-5genesis/apex-build/traffic-chart/templates/transmitter.yaml b/deployment/usecase-5genesis/apex-build/traffic-chart/templates/transmitter.yaml new file mode 100644 index 0000000000000000000000000000000000000000..33148739d3e3de13fbebabb94fc06f1d60a4d4bf --- /dev/null +++ b/deployment/usecase-5genesis/apex-build/traffic-chart/templates/transmitter.yaml @@ -0,0 +1,47 @@ +kind: Service +apiVersion: v1 +metadata: + name: traffic-transmitter +spec: + selector: + app: transmitter + ports: + - name: trans + protocol: "TCP" + # Port accessible inside cluster + port: 29400 + # Port to forward to inside the pod + targetPort: 29400 + # Port accessible outside cluster + nodePort: 29400 + type: NodePort + + + +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: traffic-transmitter +spec: + selector: + matchLabels: + app: transmitter + replicas: 1 + template: + metadata: + labels: + app: transmitter + allow-all-ingress: "true" + spec: + containers: + - name: transmitter + image: gitlab-registry.eps.surrey.ac.uk/noc/ubuntu:iperf3 + #command: ["sh", "-c", "while true; do sleep 3600; done"] + command: ["sh", "-c", "sleep 5; while true; do iperf3 -t10 -c traffic-receiver -p 29500 -b 50m; sleep 5; done"] + ports: + - name: ran-port + containerPort: 29400 + + imagePullPolicy: IfNotPresent + restartPolicy: Always diff --git a/deployment/usecase-5genesis/apex-build/traffic-chart/values.yaml b/deployment/usecase-5genesis/apex-build/traffic-chart/values.yaml new file mode 100644 index 0000000000000000000000000000000000000000..703983995657ec8d91897da5f2080b76b5e7ffa0 --- /dev/null +++ b/deployment/usecase-5genesis/apex-build/traffic-chart/values.yaml @@ -0,0 +1,82 @@ +# Default values for traffic-chart. +# This is a YAML-formatted file. +# Declare variables to be passed into your templates. + +replicaCount: 1 + +image: + repository: nginx + pullPolicy: IfNotPresent + # Overrides the image tag whose default is the chart appVersion. + tag: "" + +imagePullSecrets: [] +nameOverride: "" +fullnameOverride: "" + +serviceAccount: + # Specifies whether a service account should be created + create: true + # Annotations to add to the service account + annotations: {} + # The name of the service account to use. + # If not set and create is true, a name is generated using the fullname template + name: "" + +podAnnotations: {} + +podSecurityContext: {} + # fsGroup: 2000 + +securityContext: {} + # capabilities: + # drop: + # - ALL + # readOnlyRootFilesystem: true + # runAsNonRoot: true + # runAsUser: 1000 + +service: + type: ClusterIP + port: 80 + +ingress: + enabled: false + className: "" + annotations: {} + # kubernetes.io/ingress.class: nginx + # kubernetes.io/tls-acme: "true" + hosts: + - host: chart-example.local + paths: + - path: / + pathType: ImplementationSpecific + tls: [] + # - secretName: chart-example-tls + # hosts: + # - chart-example.local + +resources: {} + # We usually recommend not to specify default resources and to leave this as a conscious + # choice for the user. This also increases chances charts run on environments with little + # resources, such as Minikube. If you do want to specify resources, uncomment the following + # lines, adjust them as necessary, and remove the curly braces after 'resources:'. + # limits: + # cpu: 100m + # memory: 128Mi + # requests: + # cpu: 100m + # memory: 128Mi + +autoscaling: + enabled: false + minReplicas: 1 + maxReplicas: 100 + targetCPUUtilizationPercentage: 80 + # targetMemoryUtilizationPercentage: 80 + +nodeSelector: {} + +tolerations: [] + +affinity: {} diff --git a/deployment/usecase-5genesis/logic/Always_Serve_TL.js b/deployment/usecase-5genesis/logic/Always_Serve_TL.js deleted file mode 100644 index 04492223db4ffc87fd2f9844f2e4d315ca87b586..0000000000000000000000000000000000000000 --- a/deployment/usecase-5genesis/logic/Always_Serve_TL.js +++ /dev/null @@ -1,26 +0,0 @@ -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/workload-generator/Dockerfile b/deployment/usecase-5genesis/workload-generator/Dockerfile new file mode 100644 index 0000000000000000000000000000000000000000..3ed32f4930c140f13dad594987e29e51d7328ce9 --- /dev/null +++ b/deployment/usecase-5genesis/workload-generator/Dockerfile @@ -0,0 +1,16 @@ +FROM php:7.3-apache + +RUN apt-get clean +RUN apt-get update +RUN DEBIAN_FRONTEND=noninteractive apt-get install -yq \ + git \ + tree \ + vim \ + wget \ + nano + +COPY workload_job.php /var/www/html/index.php +RUN chmod a+rx index.php +RUN export JOB_LOOP=1000000 +RUN export JOB_VAR=0.0002 +#RUN apt-get install nano diff --git a/deployment/usecase-5genesis/workload-generator/workload-app.yaml b/deployment/usecase-5genesis/workload-generator/workload-app.yaml new file mode 100644 index 0000000000000000000000000000000000000000..89fb92885728c343396f38a93cd405b16a039381 --- /dev/null +++ b/deployment/usecase-5genesis/workload-generator/workload-app.yaml @@ -0,0 +1,47 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: php-workload-5genesis +spec: + selector: + matchLabels: + run: php-app + replicas: 1 + template: + metadata: + labels: + run: php-app + spec: + containers: + - name: php-apache + image: gitlab-registry.eps.surrey.ac.uk/noc/php-workload:gen7.3 + env: + - name: JOB_VAR + value: "0.0002" + - name: JOB_LOOP + value: "1000000" + ports: + - name: http + containerPort: 80 + resources: + limits: + cpu: 300m + requests: + cpu: 200m + imagePullPolicy: Always +--- +apiVersion: v1 +kind: Service +metadata: + name: php-workload-5genesis + labels: + run: php-workload +spec: + selector: + run: php-app + ports: + - port: 80 + targetPort: http + nodePort: 30080 + type: NodePort + diff --git a/deployment/usecase-5genesis/workload-generator/workload_job.php b/deployment/usecase-5genesis/workload-generator/workload_job.php new file mode 100644 index 0000000000000000000000000000000000000000..8c34eefc06c6b4e39cc9828ac0fe70a1b895cd21 --- /dev/null +++ b/deployment/usecase-5genesis/workload-generator/workload_job.php @@ -0,0 +1,19 @@ +<?php + //$x = (float)getenv("JOB_VAR"); + //$loop = (int)getenv("JOB_LOOP"); + $x = (float)$_GET['factor']; + $loops = (int)$_GET['loops']; + echo "JOB_VAR: $x\r\n"; + echo "<br>"; + echo "JOB_LOOP: $loops\r\n"; + echo "<br>"; + + for ($i = 0; $i <= $loops; $i++) { + $x += sqrt($x); + } + + echo "Result: $x\r\n"; + echo "<br>"; + echo "Done!\r\n"; +?> +