From 705d4f08d71b077acde1453a33ef36120ea93fc9 Mon Sep 17 00:00:00 2001
From: Laskaratos Dimitris <dlaskaratos@intracomtel.com>
Date: Fri, 14 Mar 2025 13:08:43 +0200
Subject: [PATCH] Migrating from previous repo
---
.idea/.gitignore | 8 +
.idea/deployment.xml | 15 +
.idea/edge-implementation.iml | 8 +
.../inspectionProfiles/profiles_settings.xml | 6 +
.idea/misc.xml | 4 +
.idea/modules.xml | 8 +
.idea/vcs.xml | 6 +
...edge_encoder.deploy_service_function(body) | 7 +
.../.dockerignore | 72 +++
.../.gitignore | 64 +++
.../.swagger-codegen-ignore | 23 +
.../.swagger-codegen/VERSION | 1 +
.../.travis.yml | 13 +
.../Dockerfile | 46 ++
.../README.md | 68 +++
.../deployment_files/grafana-service.yaml | 76 +++
.../piedge_deploy_generic.yaml | 274 ++++++++++
.../deployment_files/piedge_gui.yaml | 39 ++
.../piedge_simple_controller.yaml | 75 +++
.../deployment_files/piedgek8s.yaml | 253 +++++++++
.../piedgek8s_withoutmongo.yaml | 159 ++++++
.../deployment_files/policyk8s.yaml | 73 +++
.../deployment_files/postgres_resources.yaml | 84 +++
.../deployment_files/prometheus-service.yaml | 102 ++++
.../export_env_par.txt | 18 +
.../git_push.sh | 52 ++
.../postgres/postgres-config.yaml | 10 +
.../postgres/postgres-deployment.yaml | 35 ++
.../postgres/postgres-pvc-pv.yaml | 29 +
.../postgres/postgres-service.yaml | 12 +
.../postgres/postgres_connector.py | 102 ++++
.../postgres/text | 496 ++++++++++++++++++
.../requirements.txt | 13 +
.../setup.py | 37 ++
.../swagger_server/__init__.py | 0
.../swagger_server/__main__.py | 24 +
.../adapters/artifact/clients/skopeo/.gitkeep | 0
.../artifact/clients/skopeo/__init__.py | 0
.../adapters/artifact/core/.gitkeep | 0
.../swagger_server/adapters/edgecloud/.env | 7 +
.../edgecloud/clients/aeros/__init__.py | 0
.../edgecloud/clients/aeros/client.py | 29 +
.../clients/eurecom_platform/__init__.py | 0
.../clients/eurecom_platform/client.py | 29 +
.../edgecloud/clients/i2edge/__init__.py | 0
.../edgecloud/clients/i2edge/client.py | 29 +
.../clients/isi_platform/__init__.py | 0
.../edgecloud/clients/isi_platform/client.py | 29 +
.../edgecloud/clients/piedge/__init__.py | 0
.../edgecloud/clients/piedge/client.py | 47 ++
.../edgecloud/core/edgecloud_interface.py | 103 ++++
.../adapters/edgecloud/core/schemas.py | 1 +
.../edgecloud/doc/workflows/get_av_zones.md | 20 +
.../adapters/network/clients/oai/.gitkeep | 0
.../adapters/network/clients/oai/__init__.py | 0
.../adapters/network/clients/open5gs/.gitkeep | 0
.../network/clients/open5gs/__init__.py | 0
.../adapters/network/core/.gitkeep | 0
.../swagger_server/config.py | 13 +
.../swagger_server/controllers/__init__.py | 2 +
.../controllers/app_instance_controller.py | 44 ++
.../app_registration_controller.py | 5 +
.../controllers/artifact_controller.py | 38 ++
.../network_functions_controller.py | 5 +
.../controllers/nodes_controller.py | 18 +
.../swagger_server/core/__init__.py | 0
.../swagger_server/encoder.py | 20 +
.../swagger_server/models/__init__.py | 4 +
.../models/artifact_exists_model.py | 139 +++++
.../swagger_server/models/base_model_.py | 69 +++
.../models/copy_artifact_model.py | 250 +++++++++
.../swagger_server/properties.conf | 5 +
.../services/artifact_service.py | 20 +
.../services/edge_cloud_service.py | 58 ++
.../services/network_function_service.py | 0
.../swagger_server/swagger/swagger.yaml | 159 ++++++
.../swagger_server/type_util.py | 32 ++
.../swagger_server/util.py | 142 +++++
.../swagger_server/utils/__init__.py | 0
.../swagger_server/utils/connector_db.py | 172 ++++++
service-resource-manager-implementation/test | 0
.../tox.ini | 17 +
srm-deployment.yaml | 181 +++++++
83 files changed, 3999 insertions(+)
create mode 100644 .idea/.gitignore
create mode 100644 .idea/deployment.xml
create mode 100644 .idea/edge-implementation.iml
create mode 100644 .idea/inspectionProfiles/profiles_settings.xml
create mode 100644 .idea/misc.xml
create mode 100644 .idea/modules.xml
create mode 100644 .idea/vcs.xml
create mode 100644 ponse = piedge_encoder.deploy_service_function(body)
create mode 100644 service-resource-manager-implementation/.dockerignore
create mode 100644 service-resource-manager-implementation/.gitignore
create mode 100644 service-resource-manager-implementation/.swagger-codegen-ignore
create mode 100644 service-resource-manager-implementation/.swagger-codegen/VERSION
create mode 100644 service-resource-manager-implementation/.travis.yml
create mode 100644 service-resource-manager-implementation/Dockerfile
create mode 100644 service-resource-manager-implementation/README.md
create mode 100644 service-resource-manager-implementation/deployment_files/grafana-service.yaml
create mode 100644 service-resource-manager-implementation/deployment_files/piedge_deploy_generic.yaml
create mode 100644 service-resource-manager-implementation/deployment_files/piedge_gui.yaml
create mode 100644 service-resource-manager-implementation/deployment_files/piedge_simple_controller.yaml
create mode 100644 service-resource-manager-implementation/deployment_files/piedgek8s.yaml
create mode 100644 service-resource-manager-implementation/deployment_files/piedgek8s_withoutmongo.yaml
create mode 100644 service-resource-manager-implementation/deployment_files/policyk8s.yaml
create mode 100644 service-resource-manager-implementation/deployment_files/postgres_resources.yaml
create mode 100644 service-resource-manager-implementation/deployment_files/prometheus-service.yaml
create mode 100644 service-resource-manager-implementation/export_env_par.txt
create mode 100644 service-resource-manager-implementation/git_push.sh
create mode 100644 service-resource-manager-implementation/postgres/postgres-config.yaml
create mode 100644 service-resource-manager-implementation/postgres/postgres-deployment.yaml
create mode 100644 service-resource-manager-implementation/postgres/postgres-pvc-pv.yaml
create mode 100644 service-resource-manager-implementation/postgres/postgres-service.yaml
create mode 100644 service-resource-manager-implementation/postgres/postgres_connector.py
create mode 100644 service-resource-manager-implementation/postgres/text
create mode 100644 service-resource-manager-implementation/requirements.txt
create mode 100644 service-resource-manager-implementation/setup.py
create mode 100644 service-resource-manager-implementation/swagger_server/__init__.py
create mode 100644 service-resource-manager-implementation/swagger_server/__main__.py
create mode 100644 service-resource-manager-implementation/swagger_server/adapters/artifact/clients/skopeo/.gitkeep
create mode 100644 service-resource-manager-implementation/swagger_server/adapters/artifact/clients/skopeo/__init__.py
create mode 100644 service-resource-manager-implementation/swagger_server/adapters/artifact/core/.gitkeep
create mode 100644 service-resource-manager-implementation/swagger_server/adapters/edgecloud/.env
create mode 100644 service-resource-manager-implementation/swagger_server/adapters/edgecloud/clients/aeros/__init__.py
create mode 100644 service-resource-manager-implementation/swagger_server/adapters/edgecloud/clients/aeros/client.py
create mode 100644 service-resource-manager-implementation/swagger_server/adapters/edgecloud/clients/eurecom_platform/__init__.py
create mode 100644 service-resource-manager-implementation/swagger_server/adapters/edgecloud/clients/eurecom_platform/client.py
create mode 100644 service-resource-manager-implementation/swagger_server/adapters/edgecloud/clients/i2edge/__init__.py
create mode 100644 service-resource-manager-implementation/swagger_server/adapters/edgecloud/clients/i2edge/client.py
create mode 100644 service-resource-manager-implementation/swagger_server/adapters/edgecloud/clients/isi_platform/__init__.py
create mode 100644 service-resource-manager-implementation/swagger_server/adapters/edgecloud/clients/isi_platform/client.py
create mode 100644 service-resource-manager-implementation/swagger_server/adapters/edgecloud/clients/piedge/__init__.py
create mode 100644 service-resource-manager-implementation/swagger_server/adapters/edgecloud/clients/piedge/client.py
create mode 100644 service-resource-manager-implementation/swagger_server/adapters/edgecloud/core/edgecloud_interface.py
create mode 100644 service-resource-manager-implementation/swagger_server/adapters/edgecloud/core/schemas.py
create mode 100644 service-resource-manager-implementation/swagger_server/adapters/edgecloud/doc/workflows/get_av_zones.md
create mode 100644 service-resource-manager-implementation/swagger_server/adapters/network/clients/oai/.gitkeep
create mode 100644 service-resource-manager-implementation/swagger_server/adapters/network/clients/oai/__init__.py
create mode 100644 service-resource-manager-implementation/swagger_server/adapters/network/clients/open5gs/.gitkeep
create mode 100644 service-resource-manager-implementation/swagger_server/adapters/network/clients/open5gs/__init__.py
create mode 100644 service-resource-manager-implementation/swagger_server/adapters/network/core/.gitkeep
create mode 100644 service-resource-manager-implementation/swagger_server/config.py
create mode 100644 service-resource-manager-implementation/swagger_server/controllers/__init__.py
create mode 100644 service-resource-manager-implementation/swagger_server/controllers/app_instance_controller.py
create mode 100644 service-resource-manager-implementation/swagger_server/controllers/app_registration_controller.py
create mode 100644 service-resource-manager-implementation/swagger_server/controllers/artifact_controller.py
create mode 100644 service-resource-manager-implementation/swagger_server/controllers/network_functions_controller.py
create mode 100644 service-resource-manager-implementation/swagger_server/controllers/nodes_controller.py
create mode 100644 service-resource-manager-implementation/swagger_server/core/__init__.py
create mode 100644 service-resource-manager-implementation/swagger_server/encoder.py
create mode 100644 service-resource-manager-implementation/swagger_server/models/__init__.py
create mode 100644 service-resource-manager-implementation/swagger_server/models/artifact_exists_model.py
create mode 100644 service-resource-manager-implementation/swagger_server/models/base_model_.py
create mode 100644 service-resource-manager-implementation/swagger_server/models/copy_artifact_model.py
create mode 100644 service-resource-manager-implementation/swagger_server/properties.conf
create mode 100644 service-resource-manager-implementation/swagger_server/services/artifact_service.py
create mode 100644 service-resource-manager-implementation/swagger_server/services/edge_cloud_service.py
create mode 100644 service-resource-manager-implementation/swagger_server/services/network_function_service.py
create mode 100644 service-resource-manager-implementation/swagger_server/swagger/swagger.yaml
create mode 100644 service-resource-manager-implementation/swagger_server/type_util.py
create mode 100644 service-resource-manager-implementation/swagger_server/util.py
create mode 100644 service-resource-manager-implementation/swagger_server/utils/__init__.py
create mode 100644 service-resource-manager-implementation/swagger_server/utils/connector_db.py
create mode 100644 service-resource-manager-implementation/test
create mode 100644 service-resource-manager-implementation/tox.ini
create mode 100644 srm-deployment.yaml
diff --git a/.idea/.gitignore b/.idea/.gitignore
new file mode 100644
index 0000000..73f69e0
--- /dev/null
+++ b/.idea/.gitignore
@@ -0,0 +1,8 @@
+# Default ignored files
+/shelf/
+/workspace.xml
+# Datasource local storage ignored files
+/dataSources/
+/dataSources.local.xml
+# Editor-based HTTP Client requests
+/httpRequests/
diff --git a/.idea/deployment.xml b/.idea/deployment.xml
new file mode 100644
index 0000000..9e0c942
--- /dev/null
+++ b/.idea/deployment.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+ <component name="PublishConfigData" autoUpload="Always" serverName="root@146.124.106.179:22 password (4)" remoteFilesAllowedToDisappearOnAutoupload="false">
+ <serverData>
+ <paths name="root@146.124.106.179:22 password (4)">
+ <serverdata>
+ <mappings>
+ <mapping deploy="/root/NIKPSAROM_WORKDIR" local="$PROJECT_DIR$" />
+ </mappings>
+ </serverdata>
+ </paths>
+ </serverData>
+ <option name="myAutoUpload" value="ALWAYS" />
+ </component>
+</project>
\ No newline at end of file
diff --git a/.idea/edge-implementation.iml b/.idea/edge-implementation.iml
new file mode 100644
index 0000000..856ca00
--- /dev/null
+++ b/.idea/edge-implementation.iml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<module type="PYTHON_MODULE" version="4">
+ <component name="NewModuleRootManager">
+ <content url="file://$MODULE_DIR$" />
+ <orderEntry type="jdk" jdkName="Remote Python 3.5.2 (/usr/bin/python3.5) (2)" jdkType="Python SDK" />
+ <orderEntry type="sourceFolder" forTests="false" />
+ </component>
+</module>
\ No newline at end of file
diff --git a/.idea/inspectionProfiles/profiles_settings.xml b/.idea/inspectionProfiles/profiles_settings.xml
new file mode 100644
index 0000000..105ce2d
--- /dev/null
+++ b/.idea/inspectionProfiles/profiles_settings.xml
@@ -0,0 +1,6 @@
+<component name="InspectionProjectProfileManager">
+ <settings>
+ <option name="USE_PROJECT_PROFILE" value="false" />
+ <version value="1.0" />
+ </settings>
+</component>
\ No newline at end of file
diff --git a/.idea/misc.xml b/.idea/misc.xml
new file mode 100644
index 0000000..512431b
--- /dev/null
+++ b/.idea/misc.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+ <component name="ProjectRootManager" version="2" project-jdk-name="Remote Python 3.5.2 (/usr/bin/python3.5) (2)" project-jdk-type="Python SDK" />
+</project>
\ No newline at end of file
diff --git a/.idea/modules.xml b/.idea/modules.xml
new file mode 100644
index 0000000..26a7349
--- /dev/null
+++ b/.idea/modules.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+ <component name="ProjectModuleManager">
+ <modules>
+ <module fileurl="file://$PROJECT_DIR$/.idea/edge-implementation.iml" filepath="$PROJECT_DIR$/.idea/edge-implementation.iml" />
+ </modules>
+ </component>
+</project>
\ No newline at end of file
diff --git a/.idea/vcs.xml b/.idea/vcs.xml
new file mode 100644
index 0000000..94a25f7
--- /dev/null
+++ b/.idea/vcs.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+ <component name="VcsDirectoryMappings">
+ <mapping directory="$PROJECT_DIR$" vcs="Git" />
+ </component>
+</project>
\ No newline at end of file
diff --git a/ponse = piedge_encoder.deploy_service_function(body) b/ponse = piedge_encoder.deploy_service_function(body)
new file mode 100644
index 0000000..4a1e286
--- /dev/null
+++ b/ponse = piedge_encoder.deploy_service_function(body)
@@ -0,0 +1,7 @@
+* [32mdev_new_version[m
+ main[m
+ [31mremotes/origin/HEAD[m -> origin/main
+ [31mremotes/origin/dev[m
+ [31mremotes/origin/dev_new_version[m
+ [31mremotes/origin/k8s-extension[m
+ [31mremotes/origin/main[m
diff --git a/service-resource-manager-implementation/.dockerignore b/service-resource-manager-implementation/.dockerignore
new file mode 100644
index 0000000..cdd823e
--- /dev/null
+++ b/service-resource-manager-implementation/.dockerignore
@@ -0,0 +1,72 @@
+.travis.yaml
+.swagger-codegen-ignore
+README.md
+tox.ini
+git_push.sh
+test-requirements.txt
+setup.py
+
+# Byte-compiled / optimized / DLL files
+__pycache__/
+*.py[cod]
+*$py.class
+
+# C extensions
+*.so
+
+# Distribution / packaging
+.Python
+env/
+build/
+develop-eggs/
+dist/
+downloads/
+eggs/
+.eggs/
+lib/
+lib64/
+parts/
+sdist/
+var/
+*.egg-info/
+.installed.cfg
+*.egg
+
+# PyInstaller
+# Usually these files are written by a python script from a template
+# before PyInstaller builds the exe, so as to inject date/other infos into it.
+*.manifest
+*.spec
+
+# Installer logs
+pip-log.txt
+pip-delete-this-directory.txt
+
+# Unit test / coverage reports
+htmlcov/
+.tox/
+.coverage
+.coverage.*
+.cache
+nosetests.xml
+coverage.xml
+*,cover
+.hypothesis/
+venv/
+.python-version
+
+# Translations
+*.mo
+*.pot
+
+# Django stuff:
+*.log
+
+# Sphinx documentation
+docs/_build/
+
+# PyBuilder
+target/
+
+#Ipython Notebook
+.ipynb_checkpoints
diff --git a/service-resource-manager-implementation/.gitignore b/service-resource-manager-implementation/.gitignore
new file mode 100644
index 0000000..a655050
--- /dev/null
+++ b/service-resource-manager-implementation/.gitignore
@@ -0,0 +1,64 @@
+# Byte-compiled / optimized / DLL files
+__pycache__/
+*.py[cod]
+*$py.class
+
+# C extensions
+*.so
+
+# Distribution / packaging
+.Python
+env/
+build/
+develop-eggs/
+dist/
+downloads/
+eggs/
+.eggs/
+lib/
+lib64/
+parts/
+sdist/
+var/
+*.egg-info/
+.installed.cfg
+*.egg
+
+# PyInstaller
+# Usually these files are written by a python script from a template
+# before PyInstaller builds the exe, so as to inject date/other infos into it.
+*.manifest
+*.spec
+
+# Installer logs
+pip-log.txt
+pip-delete-this-directory.txt
+
+# Unit test / coverage reports
+htmlcov/
+.tox/
+.coverage
+.coverage.*
+.cache
+nosetests.xml
+coverage.xml
+*,cover
+.hypothesis/
+venv/
+.python-version
+
+# Translations
+*.mo
+*.pot
+
+# Django stuff:
+*.log
+
+# Sphinx documentation
+docs/_build/
+
+# PyBuilder
+target/
+
+#Ipython Notebook
+.ipynb_checkpoints
diff --git a/service-resource-manager-implementation/.swagger-codegen-ignore b/service-resource-manager-implementation/.swagger-codegen-ignore
new file mode 100644
index 0000000..c5fa491
--- /dev/null
+++ b/service-resource-manager-implementation/.swagger-codegen-ignore
@@ -0,0 +1,23 @@
+# Swagger Codegen Ignore
+# Generated by swagger-codegen https://github.com/swagger-api/swagger-codegen
+
+# Use this file to prevent files from being overwritten by the generator.
+# The patterns follow closely to .gitignore or .dockerignore.
+
+# As an example, the C# client generator defines ApiClient.cs.
+# You can make changes and tell Swagger Codgen to ignore just this file by uncommenting the following line:
+#ApiClient.cs
+
+# You can match any string of characters against a directory, file or extension with a single asterisk (*):
+#foo/*/qux
+# The above matches foo/bar/qux and foo/baz/qux, but not foo/bar/baz/qux
+
+# You can recursively match patterns against a directory, file or extension with a double asterisk (**):
+#foo/**/qux
+# This matches foo/bar/qux, foo/baz/qux, and foo/bar/baz/qux
+
+# You can also negate patterns with an exclamation (!).
+# For example, you can ignore all files in a docs folder with the file extension .md:
+#docs/*.md
+# Then explicitly reverse the ignore rule for a single file:
+#!docs/README.md
diff --git a/service-resource-manager-implementation/.swagger-codegen/VERSION b/service-resource-manager-implementation/.swagger-codegen/VERSION
new file mode 100644
index 0000000..10bbf27
--- /dev/null
+++ b/service-resource-manager-implementation/.swagger-codegen/VERSION
@@ -0,0 +1 @@
+3.0.34
\ No newline at end of file
diff --git a/service-resource-manager-implementation/.travis.yml b/service-resource-manager-implementation/.travis.yml
new file mode 100644
index 0000000..dd6c445
--- /dev/null
+++ b/service-resource-manager-implementation/.travis.yml
@@ -0,0 +1,13 @@
+# ref: https://docs.travis-ci.com/user/languages/python
+language: python
+python:
+ - "3.2"
+ - "3.3"
+ - "3.4"
+ - "3.5"
+ #- "3.5-dev" # 3.5 development branch
+ #- "nightly" # points to the latest development branch e.g. 3.6-dev
+# command to install dependencies
+install: "pip install -r requirements.txt"
+# command to run tests
+script: nosetests
diff --git a/service-resource-manager-implementation/Dockerfile b/service-resource-manager-implementation/Dockerfile
new file mode 100644
index 0000000..3777116
--- /dev/null
+++ b/service-resource-manager-implementation/Dockerfile
@@ -0,0 +1,46 @@
+FROM python:3.9-alpine
+
+#RUN apk add git
+
+RUN mkdir -p /usr/src/app
+WORKDIR /usr/src/app
+
+#RUN apk add --no-cache --virtual .build-deps gcc musl-dev
+
+#RUN apk update && apk add python3-dev \
+# gcc \
+# libc-dev
+
+
+#THIS SOLVED THE ISSUE WITH CFFI: building wheel for cffi (setup.py) finished with status 'error'!
+RUN apk add --no-cache libffi-dev build-base
+#
+COPY requirements.txt /usr/src/app/
+#RUN pip3 install connexion
+
+#ENV EMP_STORAGE_DRIVER mongo
+#ENV EMP_STORAGE_URI mongodb://203.0.113.8:27017
+#
+#ENV PIP_ROOT_USER_ACTION=ignore
+#
+ENV PYTHONUNBUFFERED=1
+#RUN apk add --update --no-cache python3 && ln -sf python3 /usr/bin/python
+#RUN python3 -m ensurepip
+
+#RUN pip3 install --no-cache --upgrade pip setuptools
+
+RUN pip3 install --upgrade pip
+
+RUN pip3 install wheel
+
+#RUN pip3 install --no-cache --upgrade setuptools
+RUN pip install --trusted-host pypi.org --trusted-host files.pythonhosted.org --no-cache-dir -r requirements.txt
+
+COPY . /usr/src/app
+
+EXPOSE 8080
+
+ENTRYPOINT ["python3"]
+
+CMD ["-m", "swagger_server"]
+
diff --git a/service-resource-manager-implementation/README.md b/service-resource-manager-implementation/README.md
new file mode 100644
index 0000000..c92482e
--- /dev/null
+++ b/service-resource-manager-implementation/README.md
@@ -0,0 +1,68 @@
+# Swagger generated server
+
+## Overview
+This server was generated by the [swagger-codegen](https://github.com/swagger-api/swagger-codegen) project. By using the
+[OpenAPI-Spec](https://github.com/swagger-api/swagger-core/wiki) from a remote server, you can easily generate a server stub. This
+is an example of building a swagger-enabled Flask server.
+
+This example uses the [Connexion](https://github.com/zalando/connexion) library on top of Flask.
+
+## Requirements
+Python 3.5.2+
+
+## Usage
+To run the server, please execute the following from the root directory:
+
+```
+pip3 install -r requirements.txt
+```
+then replace the values in export_env_par.txt (pi-edge requires mongodb and postgres instances)
+and execute:
+
+
+```
+source export_env_par.txt
+python3 -m swagger_server
+```
+
+and open your browser to here:
+
+```
+http://localhost:8080/piedge-connector/2.0.0
+```
+
+Your Swagger definition lives here:
+
+```
+http://localhost:8080/piedge-connector/2.0.0/swagger.json
+```
+
+To launch the integration tests, use tox:
+```
+sudo pip install tox
+tox
+```
+
+## Running with Docker
+
+To run the server on a Docker container, please execute the following from the root directory:
+
+```bash
+# building the image
+docker build -t swagger_server .
+
+# starting up a container
+docker run -p 8080:8080 swagger_server
+```
+
+
+## Running with K8S
+
+Go to deployment_files folder, replace ENV parameters in piedge_deploy_generic.yaml file and execute:
+```
+kubectl create namespace pi-edge-system
+kubectl apply -f piedge_deploy_tandem.yaml -n pi-edge-system
+```
+Note:
+Prometheus and Grafana should be available in monitoring namespace, if not please deploy them using the following url:
+https://devopscube.com/setup-prometheus-monitoring-on-kubernetes/
\ No newline at end of file
diff --git a/service-resource-manager-implementation/deployment_files/grafana-service.yaml b/service-resource-manager-implementation/deployment_files/grafana-service.yaml
new file mode 100644
index 0000000..25056a7
--- /dev/null
+++ b/service-resource-manager-implementation/deployment_files/grafana-service.yaml
@@ -0,0 +1,76 @@
+apiVersion: v1
+kind: Service
+metadata:
+ creationTimestamp: "2022-10-14T09:17:41Z"
+ labels:
+ app.kubernetes.io/component: grafana
+ app.kubernetes.io/name: grafana
+ app.kubernetes.io/part-of: kube-prometheus
+ app.kubernetes.io/version: 8.1.3
+ managedFields:
+ - apiVersion: v1
+ fieldsType: FieldsV1
+ fieldsV1:
+ f:status:
+ f:loadBalancer:
+ f:ingress: {}
+ manager: controller
+ operation: Update
+ subresource: status
+ time: "2022-10-14T09:48:15Z"
+ - apiVersion: v1
+ fieldsType: FieldsV1
+ fieldsV1:
+ f:metadata:
+ f:labels:
+ .: {}
+ f:app.kubernetes.io/component: {}
+ f:app.kubernetes.io/name: {}
+ f:app.kubernetes.io/part-of: {}
+ f:app.kubernetes.io/version: {}
+ f:spec:
+ f:allocateLoadBalancerNodePorts: {}
+ f:externalTrafficPolicy: {}
+ f:internalTrafficPolicy: {}
+ f:ports:
+ .: {}
+ k:{"port":3000,"protocol":"TCP"}:
+ .: {}
+ f:name: {}
+ f:port: {}
+ f:protocol: {}
+ f:targetPort: {}
+ f:selector: {}
+ f:sessionAffinity: {}
+ f:type: {}
+ manager: kubectl
+ operation: Update
+ time: "2022-10-14T09:48:15Z"
+ name: grafana
+ namespace: monitoring
+ resourceVersion: "30269813"
+ selfLink: /api/v1/namespaces/monitoring/services/grafana
+ uid: 847f8077-58bb-45fa-8327-755fbf0a70c4
+spec:
+ allocateLoadBalancerNodePorts: true
+ externalTrafficPolicy: Cluster
+ internalTrafficPolicy: Cluster
+ ipFamilies:
+ - IPv4
+ ipFamilyPolicy: SingleStack
+ ports:
+ - name: http
+ nodePort: 30488
+ port: 3000
+ protocol: TCP
+ targetPort: http
+ selector:
+ app.kubernetes.io/component: grafana
+ app.kubernetes.io/name: grafana
+ app.kubernetes.io/part-of: kube-prometheus
+ sessionAffinity: None
+ type: LoadBalancer
+status:
+ loadBalancer:
+ ingress:
+ - ip: 203.0.113.172
diff --git a/service-resource-manager-implementation/deployment_files/piedge_deploy_generic.yaml b/service-resource-manager-implementation/deployment_files/piedge_deploy_generic.yaml
new file mode 100644
index 0000000..e0f5ca6
--- /dev/null
+++ b/service-resource-manager-implementation/deployment_files/piedge_deploy_generic.yaml
@@ -0,0 +1,274 @@
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+ annotations:
+ kompose.cmd: kompose convert
+ kompose.version: 1.26.0 (40646f47)
+ creationTimestamp: null
+ labels:
+ io.kompose.service: piedgecontroller
+ name: piedgecontroller
+spec:
+ replicas: 1
+ selector:
+ matchLabels:
+ io.kompose.service: piedgecontroller
+ strategy: {}
+ template:
+ metadata:
+ annotations:
+ kompose.cmd: kompose convert
+ kompose.version: 1.26.0 (40646f47)
+ creationTimestamp: null
+ labels:
+ #io.kompose.network/netEMPkub: "true"
+ io.kompose.service: piedgecontroller
+ spec:
+ containers:
+ - env:
+ - name: KUBERNETES_MASTER_HOSTNAME
+ #example value
+ value: "tanmaster"
+ - name: KUBERNETES_MASTER_PASSWORD
+ #example value
+ value: "T@nd3m164"
+ - name: KUBERNETES_MASTER_IP
+ #example value
+ value: "146.124.106.209"
+ - name: KUBERNETES_MASTER_TOKEN
+ #example value
+ value: TVVGV1FJb3l0alNUOUdEeVRvbnZKdGhZS3FXUXg2aG5mMGVxekRqRnZhWT0K
+ - name: EMP_STORAGE_URI
+ value: mongodb://mongopiedge:27017
+ #value: mongodb://mongoemp:27017
+ - name: MONITORING_IP
+ value: "146.124.106.209"
+ - name: MONITORING_NODE_PORT
+ value: "443"
+ - name: SYSTEM_DATABASE_PASSWORD
+ value: "pslicom"
+ - name: SYSTEM_DATABASE_HOST
+ value: "postgres"
+ - name: MONITORING_SERVICE_PASSWORD
+ value: "tandem"
+ - name: MEC_PLATFORM_IP
+ value: "146.124.106.209"
+ - name: MEC_PLATFORM_PORT
+ value: "32500"
+ - name: MONITORING_IP_PROXY
+ value: "146.124.106.220"
+ - name: MONITORING_PORT_PROXY
+ value: "31000"
+
+ image: papadchar/pi_edge:3.1.20
+ name: piedgecontroller
+ ports:
+ - containerPort: 8080
+ resources: {}
+ imagePullPolicy: Always
+ restartPolicy: Always
+status: {}
+---
+apiVersion: v1
+kind: Service
+metadata:
+ annotations:
+ kompose.cmd: kompose convert
+ kompose.version: 1.26.0 (40646f47)
+ creationTimestamp: null
+ labels:
+ io.kompose.service: piedgecontroller
+ name: piedgecontroller
+spec:
+ type: NodePort
+ ports:
+ - name: "8080"
+ nodePort: 32415
+ port: 8080
+ targetPort: 8080
+ selector:
+ io.kompose.service: piedgecontroller
+status:
+ loadBalancer: {}
+---
+apiVersion: v1
+kind: PersistentVolumeClaim
+metadata:
+ creationTimestamp: null
+ labels:
+ io.kompose.service: mongo-db
+ name: mongo-db
+spec:
+ accessModes:
+ - ReadWriteOnce
+ resources:
+ requests:
+ storage: 100Mi
+status: {}
+---
+
+
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+ annotations:
+ kompose.cmd: kompose convert
+ kompose.version: 1.26.0 (40646f47)
+ creationTimestamp: null
+ labels:
+ io.kompose.service: mongopiedge
+ name: mongopiedge
+spec:
+ replicas: 1
+ selector:
+ matchLabels:
+ io.kompose.service: mongopiedge
+ strategy:
+ type: Recreate
+ template:
+ metadata:
+ annotations:
+ kompose.cmd: kompose convert
+ kompose.version: 1.26.0 (40646f47)
+ creationTimestamp: null
+ labels:
+ #io.kompose.network/netEMPkub: "true"
+ io.kompose.service: mongopiedge
+ spec:
+ containers:
+ - image: mongo
+ name: mongopiedge
+ ports:
+ - containerPort: 27017
+ resources: {}
+ volumeMounts:
+ - mountPath: /data/db
+ name: mongo-db
+ restartPolicy: Always
+ volumes:
+ - name: mongo-db
+ persistentVolumeClaim:
+ claimName: mongo-db
+status: {}
+---
+apiVersion: v1
+kind: Service
+metadata:
+ annotations:
+ kompose.cmd: kompose convert
+ kompose.version: 1.26.0 (40646f47)
+ creationTimestamp: null
+ labels:
+ io.kompose.service: mongopiedge
+ name: mongopiedge
+spec:
+ type: NodePort
+ ports:
+ - name: "27017"
+ nodePort: 32411
+ port: 27017
+ targetPort: 27017
+ selector:
+ io.kompose.service: mongopiedge
+status:
+ loadBalancer: {}
+---
+# apiVersion: networking.k8s.io/v1
+# kind: NetworkPolicy
+# metadata:
+# creationTimestamp: null
+# name: netEMPkub
+# spec:
+# ingress:
+# - from:
+# - podSelector:
+# matchLabels:
+# io.kompose.network/netEMPkub: "true"
+# podSelector:
+# matchLabels:
+# io.kompose.network/netEMPkub: "true"
+#---
+apiVersion: v1
+kind: ConfigMap
+metadata:
+ name: postgres-config
+ labels:
+ app: postgres
+data:
+ POSTGRES_DB: postgresdb
+ POSTGRES_USER: admin
+ POSTGRES_PASSWORD: pslicom
+---
+kind: PersistentVolume
+apiVersion: v1
+metadata:
+ name: postgres-pv-volume-pi-edge # Sets PV's name
+ labels:
+ type: local # Sets PV's type to local
+ app: postgres
+spec:
+ storageClassName: manual
+ capacity:
+ storage: 200Mi # Sets PV Volume
+ accessModes:
+ - ReadWriteMany
+ hostPath:
+ path: "/mnt/data/data"
+---
+kind: PersistentVolumeClaim
+apiVersion: v1
+metadata:
+ name: postgres-pv-claim-pi-edge # Sets name of PVC
+ labels:
+ app: postgres
+spec:
+ storageClassName: manual
+ accessModes:
+ - ReadWriteMany # Sets read and write access
+ resources:
+ requests:
+ storage: 200Mi # Sets volume size
+---
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+ name: postgres # Sets Deployment name
+spec:
+ replicas: 1
+ selector:
+ matchLabels:
+ app: postgres
+ template:
+ metadata:
+ labels:
+ app: postgres
+ spec:
+ containers:
+ - name: postgres
+ image: postgres:10.1 # Sets Image
+ imagePullPolicy: "IfNotPresent"
+ ports:
+ - containerPort: 5432 # Exposes container port
+ envFrom:
+ - configMapRef:
+ name: postgres-config
+ volumeMounts:
+ - mountPath: /var/lib/postgresql/data
+ name: postgredb
+ volumes:
+ - name: postgredb
+ persistentVolumeClaim:
+ claimName: postgres-pv-claim-pi-edge
+---
+apiVersion: v1
+kind: Service
+metadata:
+ name: postgres # Sets service name
+ labels:
+ app: postgres # Labels and Selectors
+spec:
+ type: NodePort # Sets service type
+ ports:
+ - port: 5432 # Sets port to run the postgres application
+ selector:
+ app: postgres
\ No newline at end of file
diff --git a/service-resource-manager-implementation/deployment_files/piedge_gui.yaml b/service-resource-manager-implementation/deployment_files/piedge_gui.yaml
new file mode 100644
index 0000000..826e2e4
--- /dev/null
+++ b/service-resource-manager-implementation/deployment_files/piedge_gui.yaml
@@ -0,0 +1,39 @@
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+ name: piedge-gui
+ namespace: pi-edge-system
+spec:
+ replicas: 1
+ selector:
+ matchLabels:
+ app: piedge-gui
+ template:
+ metadata:
+ labels:
+ app: piedge-gui
+ spec:
+ containers:
+ - name: gui
+ image: piedge/gui:1.0.9
+ imagePullPolicy: Always
+ ports:
+ - containerPort: 5173
+ nodeSelector:
+ kubernetes.io/hostname: zorro-solutions
+
+---
+
+apiVersion: v1
+kind: Service
+metadata:
+ name: gui-svc
+ namespace: pi-edge-system
+spec:
+ selector:
+ app: piedge-gui
+ ports:
+ - port: 80
+ protocol: TCP
+ targetPort: 5173
+ type: NodePort
\ No newline at end of file
diff --git a/service-resource-manager-implementation/deployment_files/piedge_simple_controller.yaml b/service-resource-manager-implementation/deployment_files/piedge_simple_controller.yaml
new file mode 100644
index 0000000..c7d755c
--- /dev/null
+++ b/service-resource-manager-implementation/deployment_files/piedge_simple_controller.yaml
@@ -0,0 +1,75 @@
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+ annotations:
+ kompose.cmd: kompose convert
+ kompose.version: 1.26.0 (40646f47)
+ creationTimestamp: null
+ labels:
+ io.kompose.service: piedgecontroller
+ name: piedgecontroller
+spec:
+ replicas: 1
+ selector:
+ matchLabels:
+ io.kompose.service: piedgecontroller
+ strategy: {}
+ template:
+ metadata:
+ annotations:
+ kompose.cmd: kompose convert
+ kompose.version: 1.26.0 (40646f47)
+ creationTimestamp: null
+ labels:
+ #io.kompose.network/netEMPkub: "true"
+ io.kompose.service: piedgecontroller
+ spec:
+ containers:
+ - env:
+ - name: KUBERNETES_MASTER_HOST
+ #example value
+ value: https://146.124.106.179:16443
+ - name: KUBERNETES_MASTER_TOKEN
+ #example value
+ value: b3lIOWFQM3NUTWJpSUVBMDNGNmlmVG4wQkd5dXFmWTdFUlFWQVo3UnEycz0K
+ - name: EMP_STORAGE_URI
+ #value: mongodb://mongopiedge:27017
+ value: mongodb://mongoemp:27017
+ - name: MONITORING_IP
+ value: "203.0.113.130"
+ - name: MONITORING_NODE_PORT
+ value: "3000"
+ - name: SYSTEM_DATABASE_PASSWORD
+ value: "pslicom"
+ - name: MONITORING_SERVICE_PASSWORD
+ value: "tandem"
+ image: nikospsar/pi_edge:3.0.2
+ name: piedgecontroller
+ ports:
+ - containerPort: 8080
+ resources: {}
+ imagePullPolicy: Always
+ restartPolicy: Always
+status: {}
+---
+apiVersion: v1
+kind: Service
+metadata:
+ annotations:
+ kompose.cmd: kompose convert
+ kompose.version: 1.26.0 (40646f47)
+ creationTimestamp: null
+ labels:
+ io.kompose.service: piedgecontroller
+ name: piedgecontroller
+spec:
+ type: NodePort
+ ports:
+ - name: "8080"
+ nodePort: 32415
+ port: 8080
+ targetPort: 8080
+ selector:
+ io.kompose.service: piedgecontroller
+status:
+ loadBalancer: {}
\ No newline at end of file
diff --git a/service-resource-manager-implementation/deployment_files/piedgek8s.yaml b/service-resource-manager-implementation/deployment_files/piedgek8s.yaml
new file mode 100644
index 0000000..14f21e8
--- /dev/null
+++ b/service-resource-manager-implementation/deployment_files/piedgek8s.yaml
@@ -0,0 +1,253 @@
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+ annotations:
+ kompose.cmd: kompose convert
+ kompose.version: 1.26.0 (40646f47)
+ creationTimestamp: null
+ labels:
+ io.kompose.service: piedgecontroller
+ name: piedgecontroller
+spec:
+ replicas: 1
+ selector:
+ matchLabels:
+ io.kompose.service: piedgecontroller
+ strategy: {}
+ template:
+ metadata:
+ annotations:
+ kompose.cmd: kompose convert
+ kompose.version: 1.26.0 (40646f47)
+ creationTimestamp: null
+ labels:
+ #io.kompose.network/netEMPkub: "true"
+ io.kompose.service: piedgecontroller
+ spec:
+ containers:
+ - env:
+ - name: KUBERNETES_MASTER_HOST
+ #example value
+ value: https://146.124.106.179:16443
+ - name: KUBERNETES_MASTER_TOKEN
+ #example value
+ value: b3lIOWFQM3NUTWJpSUVBMDNGNmlmVG4wQkd5dXFmWTdFUlFWQVo3UnEycz0K
+ - name: EMP_STORAGE_URI
+ #value: mongodb://mongopiedge:27017
+ value: mongodb://mongoemp:27017
+ - name: MONITORING_IP
+ value: "203.0.113.130"
+ - name: MONITORING_NODE_PORT
+ value: "3000"
+ - name: SYSTEM_DATABASE_PASSWORD
+ value: "pslicom"
+ image: nikospsar/pi_edge:3.0.2
+ name: piedgecontroller
+ ports:
+ - containerPort: 8080
+ resources: {}
+ imagePullPolicy: Always
+ restartPolicy: Always
+status: {}
+---
+apiVersion: v1
+kind: Service
+metadata:
+ annotations:
+ kompose.cmd: kompose convert
+ kompose.version: 1.26.0 (40646f47)
+ creationTimestamp: null
+ labels:
+ io.kompose.service: piedgecontroller
+ name: piedgecontroller
+spec:
+ type: NodePort
+ ports:
+ - name: "8080"
+ nodePort: 32415
+ port: 8080
+ targetPort: 8080
+ selector:
+ io.kompose.service: piedgecontroller
+status:
+ loadBalancer: {}
+---
+#apiVersion: v1
+#kind: PersistentVolumeClaim
+#metadata:
+# creationTimestamp: null
+# labels:
+# io.kompose.service: mongo-db
+# name: mongo-db
+#spec:
+# accessModes:
+# - ReadWriteOnce
+# resources:
+# requests:
+# storage: 100Mi
+#status: {}
+#---
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+ annotations:
+ kompose.cmd: kompose convert
+ kompose.version: 1.26.0 (40646f47)
+ creationTimestamp: null
+ labels:
+ io.kompose.service: mongopiedge
+ name: mongopiedge
+spec:
+ replicas: 1
+ selector:
+ matchLabels:
+ io.kompose.service: mongopiedge
+ strategy:
+ type: Recreate
+ template:
+ metadata:
+ annotations:
+ kompose.cmd: kompose convert
+ kompose.version: 1.26.0 (40646f47)
+ creationTimestamp: null
+ labels:
+ #io.kompose.network/netEMPkub: "true"
+ io.kompose.service: mongopiedge
+ spec:
+ containers:
+ - image: mongo
+ name: mongopiedge
+ ports:
+ - containerPort: 27017
+ resources: {}
+ volumeMounts:
+ - mountPath: /data/db
+ name: mongo-db
+ restartPolicy: Always
+ volumes:
+ - name: mongo-db
+ persistentVolumeClaim:
+ claimName: mongo-db
+status: {}
+---
+apiVersion: v1
+kind: Service
+metadata:
+ annotations:
+ kompose.cmd: kompose convert
+ kompose.version: 1.26.0 (40646f47)
+ creationTimestamp: null
+ labels:
+ io.kompose.service: mongopiedge
+ name: mongopiedge
+spec:
+ type: NodePort
+ ports:
+ - name: "27017"
+ nodePort: 32411
+ port: 27017
+ targetPort: 27017
+ selector:
+ io.kompose.service: mongopiedge
+status:
+ loadBalancer: {}
+---
+ apiVersion: networking.k8s.io/v1
+ kind: NetworkPolicy
+ metadata:
+ creationTimestamp: null
+ name: netEMPkub
+ spec:
+ ingress:
+ - from:
+ - podSelector:
+ matchLabels:
+ io.kompose.network/netEMPkub: "true"
+ podSelector:
+ matchLabels:
+ io.kompose.network/netEMPkub: "true"
+---
+apiVersion: v1
+kind: ConfigMap
+metadata:
+ name: postgres-config
+ labels:
+ app: postgres
+data:
+ POSTGRES_DB: postgresdb
+ POSTGRES_USER: admin
+ POSTGRES_PASSWORD: pslicom
+---
+kind: PersistentVolume
+apiVersion: v1
+metadata:
+ name: postgres-pv-volume-pi-edge # Sets PV's name
+ labels:
+ type: local # Sets PV's type to local
+ app: postgres
+spec:
+ storageClassName: manual
+ capacity:
+ storage: 200Mi # Sets PV Volume
+ accessModes:
+ - ReadWriteMany
+ hostPath:
+ path: "/mnt/data/data"
+---
+kind: PersistentVolumeClaim
+apiVersion: v1
+metadata:
+ name: postgres-pv-claim-pi-edge # Sets name of PVC
+ labels:
+ app: postgres
+spec:
+ storageClassName: manual
+ accessModes:
+ - ReadWriteMany # Sets read and write access
+ resources:
+ requests:
+ storage: 200Mi # Sets volume size
+---
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+ name: postgres # Sets Deployment name
+spec:
+ replicas: 1
+ selector:
+ matchLabels:
+ app: postgres
+ template:
+ metadata:
+ labels:
+ app: postgres
+ spec:
+ containers:
+ - name: postgres
+ image: postgres:10.1 # Sets Image
+ imagePullPolicy: "IfNotPresent"
+ ports:
+ - containerPort: 5432 # Exposes container port
+ envFrom:
+ - configMapRef:
+ name: postgres-config
+ volumeMounts:
+ - mountPath: /var/lib/postgresql/data
+ name: postgredb
+ volumes:
+ - name: postgredb
+ persistentVolumeClaim:
+ claimName: postgres-pv-claim-pi-edge
+---
+apiVersion: v1
+kind: Service
+metadata:
+ name: postgres # Sets service name
+ labels:
+ app: postgres # Labels and Selectors
+spec:
+ type: NodePort # Sets service type
+ ports:
+ - port: 5432 # Sets port to run the postgres application
+ selector:
+ app: postgres
\ No newline at end of file
diff --git a/service-resource-manager-implementation/deployment_files/piedgek8s_withoutmongo.yaml b/service-resource-manager-implementation/deployment_files/piedgek8s_withoutmongo.yaml
new file mode 100644
index 0000000..eca96f1
--- /dev/null
+++ b/service-resource-manager-implementation/deployment_files/piedgek8s_withoutmongo.yaml
@@ -0,0 +1,159 @@
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+ annotations:
+ kompose.cmd: kompose convert
+ kompose.version: 1.26.0 (40646f47)
+ creationTimestamp: null
+ labels:
+ io.kompose.service: piedgecontroller
+ name: piedgecontroller
+spec:
+ replicas: 1
+ selector:
+ matchLabels:
+ io.kompose.service: piedgecontroller
+ strategy: {}
+ template:
+ metadata:
+ annotations:
+ kompose.cmd: kompose convert
+ kompose.version: 1.26.0 (40646f47)
+ creationTimestamp: null
+ labels:
+ #io.kompose.network/netEMPkub: "true"
+ io.kompose.service: piedgecontroller
+ spec:
+ containers:
+ - env:
+ - name: KUBERNETES_MASTER_HOST
+ value: https://146.124.106.179:16443
+ - name: KUBERNETES_MASTER_TOKEN
+ value: b3lIOWFQM3NUTWJpSUVBMDNGNmlmVG4wQkd5dXFmWTdFUlFWQVo3UnEycz0K
+ - name: EMP_STORAGE_URI
+ value: mongodb://146.124.106.179:32411
+ image: nikospsar/pi_edge_controller:1.1.0
+ name: piedgecontroller
+ ports:
+ - containerPort: 8082
+ resources: {}
+ imagePullPolicy: Always
+ restartPolicy: Always
+status: {}
+---
+apiVersion: v1
+kind: Service
+metadata:
+ annotations:
+ kompose.cmd: kompose convert
+ kompose.version: 1.26.0 (40646f47)
+ creationTimestamp: null
+ labels:
+ io.kompose.service: piedgecontroller
+ name: piedgecontroller
+spec:
+ type: NodePort
+ ports:
+ - name: "8080"
+ nodePort: 32415
+ port: 8080
+ targetPort: 8080
+ selector:
+ io.kompose.service: piedgecontroller
+status:
+ loadBalancer: {}
+---
+#apiVersion: v1
+#kind: PersistentVolumeClaim
+#metadata:
+# creationTimestamp: null
+# labels:
+# io.kompose.service: mongo-db
+# name: mongo-db
+#spec:
+# accessModes:
+# - ReadWriteOnce
+# resources:
+# requests:
+# storage: 100Mi
+#status: {}
+#---
+#apiVersion: apps/v1
+#kind: Deployment
+#metadata:
+# annotations:
+# kompose.cmd: kompose convert
+# kompose.version: 1.26.0 (40646f47)
+# creationTimestamp: null
+# labels:
+# io.kompose.service: mongoemp
+# name: mongoemp
+#spec:
+# replicas: 1
+# selector:
+# matchLabels:
+# io.kompose.service: mongoemp
+# strategy:
+# type: Recreate
+# template:
+# metadata:
+# annotations:
+# kompose.cmd: kompose convert
+# kompose.version: 1.26.0 (40646f47)
+# creationTimestamp: null
+# labels:
+# #io.kompose.network/netEMPkub: "true"
+# io.kompose.service: mongoemp
+# spec:
+# containers:
+# - image: mongo
+# name: mongoemp
+# ports:
+# - containerPort: 27017
+# resources: {}
+# volumeMounts:
+# - mountPath: /data/db
+# name: mongo-db
+# restartPolicy: Always
+# volumes:
+# - name: mongo-db
+# persistentVolumeClaim:
+# claimName: mongo-db
+#status: {}
+#---
+#apiVersion: v1
+#kind: Service
+#metadata:
+# annotations:
+# kompose.cmd: kompose convert
+# kompose.version: 1.26.0 (40646f47)
+# creationTimestamp: null
+# labels:
+# io.kompose.service: mongoemp
+# name: mongoemp
+#spec:
+# type: NodePort
+# ports:
+# - name: "27017"
+# nodePort: 32411
+# port: 27017
+# targetPort: 27017
+# selector:
+# io.kompose.service: mongoemp
+#status:
+# loadBalancer: {}
+#---
+## apiVersion: networking.k8s.io/v1
+## kind: NetworkPolicy
+## metadata:
+## creationTimestamp: null
+## name: netEMPkub
+## spec:
+## ingress:
+## - from:
+## - podSelector:
+## matchLabels:
+## io.kompose.network/netEMPkub: "true"
+## podSelector:
+## matchLabels:
+## io.kompose.network/netEMPkub: "true"
diff --git a/service-resource-manager-implementation/deployment_files/policyk8s.yaml b/service-resource-manager-implementation/deployment_files/policyk8s.yaml
new file mode 100644
index 0000000..ca86b81
--- /dev/null
+++ b/service-resource-manager-implementation/deployment_files/policyk8s.yaml
@@ -0,0 +1,73 @@
+#apiVersion: networking.k8s.io/v1
+#kind: NetworkPolicy
+#metadata:
+# name: test-network-policy
+# namespace: default
+#spec:
+# podSelector:
+# matchLabels:
+# role: db
+# policyTypes:
+# - Ingress
+# - Egress
+# ingress:
+# - from:
+# - ipBlock:
+# cidr: 172.17.0.0/16
+# except:
+# - 172.17.1.0/24
+# - namespaceSelector:
+# matchLabels:
+# project: myproject
+# - podSelector:
+# matchLabels:
+# role: frontend
+# ports:
+# - protocol: TCP
+# port: 6379
+# egress:
+# - to:
+# - ipBlock:
+# cidr: 10.0.0.0/24
+# ports:
+# - protocol: TCP
+# port: 5978
+
+#---
+#kind: NetworkPolicy
+#apiVersion: networking.k8s.io/v1
+#metadata:
+# name: allow-same-namespace and localhost
+# namespace: emp
+#spec:
+# podSelector:
+# matchLabels:
+# emp: demoosmeco
+# ingress:
+# - from:
+# - namespaceSelector:
+# matchLabels:
+# project: emp
+# - podSelector:
+# matchLabels:
+# emp: demo
+# ports:
+# - port: 80
+---
+kind: NetworkPolicy
+apiVersion: networking.k8s.io/v1
+metadata:
+ name: localhostandnamespace
+ namespace: piedge-system
+spec:
+ podSelector:
+ matchLabels:
+ io.kompose.service: kubempcontr
+ ingress:
+ - from:
+ - ipBlock: #windows_server
+ cidr: 203.0.113.90/24
+ - ipBlock: #localhost
+ cidr: 146.124.106.179/24
+
+
diff --git a/service-resource-manager-implementation/deployment_files/postgres_resources.yaml b/service-resource-manager-implementation/deployment_files/postgres_resources.yaml
new file mode 100644
index 0000000..2812657
--- /dev/null
+++ b/service-resource-manager-implementation/deployment_files/postgres_resources.yaml
@@ -0,0 +1,84 @@
+apiVersion: v1
+kind: ConfigMap
+metadata:
+ name: postgres-config
+ labels:
+ app: postgres
+data:
+ POSTGRES_DB: postgresdb
+ POSTGRES_USER: admin
+ POSTGRES_PASSWORD: pslicom
+---
+kind: PersistentVolume
+apiVersion: v1
+metadata:
+ name: postgres-pv-volume-pi-edge # Sets PV's name
+ labels:
+ type: local # Sets PV's type to local
+ app: postgres
+spec:
+ storageClassName: manual
+ capacity:
+ storage: 200Mi # Sets PV Volume
+ accessModes:
+ - ReadWriteMany
+ hostPath:
+ path: "/mnt/data/data"
+---
+kind: PersistentVolumeClaim
+apiVersion: v1
+metadata:
+ name: postgres-pv-claim-pi-edge # Sets name of PVC
+ labels:
+ app: postgres
+spec:
+ storageClassName: manual
+ accessModes:
+ - ReadWriteMany # Sets read and write access
+ resources:
+ requests:
+ storage: 200Mi # Sets volume size
+---
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+ name: postgres # Sets Deployment name
+spec:
+ replicas: 1
+ selector:
+ matchLabels:
+ app: postgres
+ template:
+ metadata:
+ labels:
+ app: postgres
+ spec:
+ containers:
+ - name: postgres
+ image: postgres:10.1 # Sets Image
+ imagePullPolicy: "IfNotPresent"
+ ports:
+ - containerPort: 5432 # Exposes container port
+ envFrom:
+ - configMapRef:
+ name: postgres-config
+ volumeMounts:
+ - mountPath: /var/lib/postgresql/data
+ name: postgredb
+ volumes:
+ - name: postgredb
+ persistentVolumeClaim:
+ claimName: postgres-pv-claim-pi-edge
+---
+apiVersion: v1
+kind: Service
+metadata:
+ name: postgres # Sets service name
+ labels:
+ app: postgres # Labels and Selectors
+spec:
+ type: NodePort # Sets service type
+ ports:
+ - port: 5432 # Sets port to run the postgres application
+ selector:
+ app: postgres
\ No newline at end of file
diff --git a/service-resource-manager-implementation/deployment_files/prometheus-service.yaml b/service-resource-manager-implementation/deployment_files/prometheus-service.yaml
new file mode 100644
index 0000000..03667f4
--- /dev/null
+++ b/service-resource-manager-implementation/deployment_files/prometheus-service.yaml
@@ -0,0 +1,102 @@
+apiVersion: v1
+kind: Service
+metadata:
+ creationTimestamp: "2022-10-14T09:17:57Z"
+ labels:
+ app.kubernetes.io/component: prometheus
+ app.kubernetes.io/name: prometheus
+ app.kubernetes.io/part-of: kube-prometheus
+ app.kubernetes.io/version: 2.30.0
+ prometheus: k8s
+ managedFields:
+ - apiVersion: v1
+ fieldsType: FieldsV1
+ fieldsV1:
+ f:status:
+ f:loadBalancer:
+ f:ingress: {}
+ manager: controller
+ operation: Update
+ subresource: status
+ time: "2022-10-14T09:48:08Z"
+ - apiVersion: v1
+ fieldsType: FieldsV1
+ fieldsV1:
+ f:metadata:
+ f:labels:
+ .: {}
+ f:app.kubernetes.io/component: {}
+ f:app.kubernetes.io/name: {}
+ f:app.kubernetes.io/part-of: {}
+ f:app.kubernetes.io/version: {}
+ f:prometheus: {}
+ f:spec:
+ f:allocateLoadBalancerNodePorts: {}
+ f:externalTrafficPolicy: {}
+ f:internalTrafficPolicy: {}
+ f:ports:
+ .: {}
+ k:{"port":8080,"protocol":"TCP"}:
+ .: {}
+ f:name: {}
+ f:port: {}
+ f:protocol: {}
+ f:targetPort: {}
+ k:{"port":9090,"protocol":"TCP"}:
+ .: {}
+ f:name: {}
+ f:port: {}
+ f:protocol: {}
+ f:targetPort: {}
+ f:selector: {}
+ f:sessionAffinity: {}
+ f:sessionAffinityConfig:
+ .: {}
+ f:clientIP:
+ .: {}
+ f:timeoutSeconds: {}
+ f:type: {}
+ manager: kubectl
+ operation: Update
+ time: "2022-10-14T09:48:08Z"
+ name: prometheus-k8s
+ namespace: monitoring
+ resourceVersion: "30269799"
+ selfLink: /api/v1/namespaces/monitoring/services/prometheus-k8s
+ uid: 1f3a5527-f254-4433-a3ee-6d9b4ee16329
+spec:
+ allocateLoadBalancerNodePorts: true
+ clusterIP: 10.152.183.155
+ clusterIPs:
+ - 10.152.183.155
+ externalTrafficPolicy: Cluster
+ internalTrafficPolicy: Cluster
+ ipFamilies:
+ - IPv4
+ ipFamilyPolicy: SingleStack
+ ports:
+ - name: web
+ nodePort: 31892
+ port: 9090
+ protocol: TCP
+ targetPort: web
+ - name: reloader-web
+ nodePort: 32281
+ port: 8080
+ protocol: TCP
+ targetPort: reloader-web
+ selector:
+ app: prometheus
+ app.kubernetes.io/component: prometheus
+ app.kubernetes.io/name: prometheus
+ app.kubernetes.io/part-of: kube-prometheus
+ prometheus: k8s
+ sessionAffinity: ClientIP
+ sessionAffinityConfig:
+ clientIP:
+ timeoutSeconds: 10800
+ type: LoadBalancer
+status:
+ loadBalancer:
+ ingress:
+ - ip: 203.0.113.171
diff --git a/service-resource-manager-implementation/export_env_par.txt b/service-resource-manager-implementation/export_env_par.txt
new file mode 100644
index 0000000..5ceecab
--- /dev/null
+++ b/service-resource-manager-implementation/export_env_par.txt
@@ -0,0 +1,18 @@
+#Choose docker or k8s
+export DRIVER="kubernetes"
+
+#k8s
+export KUBERNETES_MASTER_HOSTNAME="gzorro"
+export KUBERNETES_MASTER_PASSWORD="5gz@rr0200"
+export KUBERNETES_MASTER_IP="146.124.106.200"
+export KUBERNETES_MASTER_TOKEN="T3FRNnNVK25FY3I5ZHlNYmxrSEFpd2VPcW5WTlliTnRVNVo3bitNY1B3az0K"
+
+export EMP_STORAGE_URI="mongodb://146.124.106.200:32411"
+export SYSTEM_DATABASE_PASSWORD="pslicom"
+export SYSTEM_DATABASE_HOST="10.152.183.200"
+
+#docker
+export DOCKER_HOST="146.124.106.177"
+export DOCKER_PORT="2377"
+export INTRA_NODE_PORT="2377"
+export DOCKER_MON_PORT="9323"
diff --git a/service-resource-manager-implementation/git_push.sh b/service-resource-manager-implementation/git_push.sh
new file mode 100644
index 0000000..160f6f2
--- /dev/null
+++ b/service-resource-manager-implementation/git_push.sh
@@ -0,0 +1,52 @@
+#!/bin/sh
+# ref: https://help.github.com/articles/adding-an-existing-project-to-github-using-the-command-line/
+#
+# Usage example: /bin/sh ./git_push.sh wing328 swagger-petstore-perl "minor update"
+
+git_user_id=$1
+git_repo_id=$2
+release_note=$3
+
+if [ "$git_user_id" = "" ]; then
+ git_user_id="GIT_USER_ID"
+ echo "[INFO] No command line input provided. Set \$git_user_id to $git_user_id"
+fi
+
+if [ "$git_repo_id" = "" ]; then
+ git_repo_id="GIT_REPO_ID"
+ echo "[INFO] No command line input provided. Set \$git_repo_id to $git_repo_id"
+fi
+
+if [ "$release_note" = "" ]; then
+ release_note="Minor update"
+ echo "[INFO] No command line input provided. Set \$release_note to $release_note"
+fi
+
+# Initialize the local directory as a Git repository
+git init
+
+# Adds the files in the local repository and stages them for commit.
+git add .
+
+# Commits the tracked changes and prepares them to be pushed to a remote repository.
+git commit -m "$release_note"
+
+# Sets the new remote
+git_remote=`git remote`
+if [ "$git_remote" = "" ]; then # git remote not defined
+
+ if [ "$GIT_TOKEN" = "" ]; then
+ echo "[INFO] \$GIT_TOKEN (environment variable) is not set. Using the git credential in your environment."
+ git remote add origin https://github.com/${git_user_id}/${git_repo_id}.git
+ else
+ git remote add origin https://${git_user_id}:${GIT_TOKEN}@github.com/${git_user_id}/${git_repo_id}.git
+ fi
+
+fi
+
+git pull origin master
+
+# Pushes (Forces) the changes in the local repository up to the remote repository
+echo "Git pushing to https://github.com/${git_user_id}/${git_repo_id}.git"
+git push origin master 2>&1 | grep -v 'To https'
+
diff --git a/service-resource-manager-implementation/postgres/postgres-config.yaml b/service-resource-manager-implementation/postgres/postgres-config.yaml
new file mode 100644
index 0000000..562f326
--- /dev/null
+++ b/service-resource-manager-implementation/postgres/postgres-config.yaml
@@ -0,0 +1,10 @@
+apiVersion: v1
+kind: ConfigMap
+metadata:
+ name: postgres-config
+ labels:
+ app: postgres
+data:
+ POSTGRES_DB: postgresdb
+ POSTGRES_USER: admin
+ POSTGRES_PASSWORD: pslicom
\ No newline at end of file
diff --git a/service-resource-manager-implementation/postgres/postgres-deployment.yaml b/service-resource-manager-implementation/postgres/postgres-deployment.yaml
new file mode 100644
index 0000000..3d3a13b
--- /dev/null
+++ b/service-resource-manager-implementation/postgres/postgres-deployment.yaml
@@ -0,0 +1,35 @@
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+ name: postgres # Sets Deployment name
+spec:
+ replicas: 1
+ selector:
+ matchLabels:
+ app: postgres
+ template:
+ metadata:
+ labels:
+ app: postgres
+ spec:
+ containers:
+ - name: postgres
+ image: postgres:10.1 # Sets Image
+ imagePullPolicy: "IfNotPresent"
+ lifecycle:
+ postStart:
+ exec:
+ command: [ "/bin/sh","-c","sleep 20 && PGPASSWORD=$POSTGRES_PASSWORD psql -w -d $POSTGRES_DB -U $POSTGRES_USER -c 'CREATE TABLE IF NOT EXISTS users( id SERIAL PRIMARY KEY, role TEXT NOT NULL, username TEXT NOT NULL UNIQUE, email TEXT UNIQUE, password TEXT NOT NULL, token TEXT, created_on TIMESTAMP);'" ]
+ #command: [ "/bin/sh","-c","sleep 20 && PGPASSWORD=$POSTGRES_PASSWORD psql -w -d $POSTGRES_DB -U $POSTGRES_USER -c 'CREATE TABLE IF NOT EXISTS users( id SERIAL PRIMARY KEY, role TEXT NOT NULL, username TEXT NOT NULL UNIQUE, email TEXT UNIQUE, password TEXT NOT NULL, created_on TIMESTAMP);'" ]
+ ports:
+ - containerPort: 5432 # Exposes container port
+ envFrom:
+ - configMapRef:
+ name: postgres-config
+ volumeMounts:
+ - mountPath: /var/lib/postgresql/data
+ name: postgredb
+ volumes:
+ - name: postgredb
+ persistentVolumeClaim:
+ claimName: postgres-pv-claim-pi-edge
\ No newline at end of file
diff --git a/service-resource-manager-implementation/postgres/postgres-pvc-pv.yaml b/service-resource-manager-implementation/postgres/postgres-pvc-pv.yaml
new file mode 100644
index 0000000..d43a6a5
--- /dev/null
+++ b/service-resource-manager-implementation/postgres/postgres-pvc-pv.yaml
@@ -0,0 +1,29 @@
+kind: PersistentVolume
+apiVersion: v1
+metadata:
+ name: postgres-pv-volume-pi-edge # Sets PV's name
+ labels:
+ type: local # Sets PV's type to local
+ app: postgres
+spec:
+ storageClassName: manual
+ capacity:
+ storage: 200Mi # Sets PV Volume
+ accessModes:
+ - ReadWriteMany
+ hostPath:
+ path: "/mnt/data/data"
+---
+kind: PersistentVolumeClaim
+apiVersion: v1
+metadata:
+ name: postgres-pv-claim-pi-edge # Sets name of PVC
+ labels:
+ app: postgres
+spec:
+ storageClassName: manual
+ accessModes:
+ - ReadWriteMany # Sets read and write access
+ resources:
+ requests:
+ storage: 200Mi # Sets volume size
\ No newline at end of file
diff --git a/service-resource-manager-implementation/postgres/postgres-service.yaml b/service-resource-manager-implementation/postgres/postgres-service.yaml
new file mode 100644
index 0000000..edcca54
--- /dev/null
+++ b/service-resource-manager-implementation/postgres/postgres-service.yaml
@@ -0,0 +1,12 @@
+apiVersion: v1
+kind: Service
+metadata:
+ name: postgres # Sets service name
+ labels:
+ app: postgres # Labels and Selectors
+spec:
+ type: NodePort # Sets service type
+ ports:
+ - port: 5432 # Sets port to run the postgres application
+ selector:
+ app: postgres
\ No newline at end of file
diff --git a/service-resource-manager-implementation/postgres/postgres_connector.py b/service-resource-manager-implementation/postgres/postgres_connector.py
new file mode 100644
index 0000000..d342b93
--- /dev/null
+++ b/service-resource-manager-implementation/postgres/postgres_connector.py
@@ -0,0 +1,102 @@
+import psycopg2
+import bcrypt
+#!!!!!!!!!!!!!!!!!!!!
+#storage_url=environ.get("EMP_STORAGE_URI")
+
+def connect():
+ """ Connect to the PostgreSQL database server """
+ conn = None
+ try:
+ # read connection parameters
+ # params = config()
+
+ # connect to the PostgreSQL server
+ print('Connecting to the PostgreSQL database...')
+ conn = psycopg2.conn = psycopg2.connect(host="10.152.183.23",
+ database="postgresdb",
+ user="admin",
+ password="pslicom")
+
+ # create a cursor
+ cur = conn.cursor()
+
+ # execute a statement
+ #print('PostgreSQL database version:')
+
+ # sql = """INSERT INTO users (username, password, created_on )
+ # VALUES(%s) RETURNING id;"""
+ # command= "INSERT INTO users (username, password, created_on ) VALUES ( 'icom_nikos2', crypt('icom_nikos_!', gen_salt('bf')), current_timestamp);"
+ # cur.execute(command)
+ #
+ # id = cur.fetchone()[0]
+ # # commit the changes to the database
+ # conn.commit()
+ #
+
+
+ #query!!!
+ # postgreSQL_select_Query= "SELECT id FROM users WHERE username = 'icom_nikos' AND password = crypt('icom_nikos_!', password);"
+ _username='###'
+ _password='####!'
+ postgreSQL_select_Query= "SELECT id FROM users WHERE username = '" +_username + "' AND password = crypt('"+_password+"', password);"
+ cur.execute(postgreSQL_select_Query)
+ print("CHECK IF USER EXISTS")
+ users = cur.fetchall()
+ if not users:
+ print("User not authorized")
+ else:
+ print("User authorized")
+
+ # display the PostgreSQL database server version
+ # db_version = cur.fetchone()
+ # print(db_version)
+
+ # insert user
+ cur.execute('SELECT version()')
+ # close the communication with the PostgreSQL
+ cur.close()
+ except (Exception, psycopg2.DatabaseError) as error:
+ print(error)
+ finally:
+ if conn is not None:
+ conn.close()
+ print('Database connection closed.')
+
+
+# def insert_users(username, passowrd):
+# try:
+# print(a)
+# except Exception as ce_:
+# raise Exception("An exception occurred :", ce_)
+#
+
+
+if __name__ == '__main__':
+ connect()
+
+
+
+#how to create table
+#CREATE TABLE users( id SERIAL PRIMARY KEY, role TEXT NOT NULL, username TEXT NOT NULL UNIQUE, email TEXT UNIQUE, password TEXT NOT NULL, token TEXT, created_on TIMESTAMP);
+
+
+#how to insert user:
+# INSERT INTO users (username, password, created_on ) VALUES (
+# 'icom_nikos',
+# crypt('testp@assword', gen_salt('bf'), current_timestamp)
+# );
+
+
+# INSERT INTO users (role, username, password, created_on ) VALUES ( 'user', 'icom_user', crypt('icom_user_!@', gen_salt('bf')), current_timestamp);
+
+
+#UPDATE
+
+#sql_update_query = """Update mobile set price = %s where id = %s"""
+#cursor.execute(sql_update_query, (price, mobileId))
+#how to check validate user
+# SELECT id FROM users WHERE username = 'icom_nikos' AND password = crypt('icom_nikos_1', password);
+
+
+#how to connect (deployed using k8s)
+#kubectl exec -it postgres-7dd79fb55c-rkpd7 -n piedge-system -- psql -h localhost -U admin --password -p 5432 postgresdb
\ No newline at end of file
diff --git a/service-resource-manager-implementation/postgres/text b/service-resource-manager-implementation/postgres/text
new file mode 100644
index 0000000..8c99b90
--- /dev/null
+++ b/service-resource-manager-implementation/postgres/text
@@ -0,0 +1,496 @@
+{'api_version': 'apps/v1',
+ 'items': [{'api_version': None,
+ 'kind': None,
+ 'metadata': {'annotations': {'deployment.kubernetes.io/revision': '1'},
+ 'cluster_name': None,
+ 'creation_timestamp': datetime.datetime(2022, 11, 16, 11, 6, 16, tzinfo=tzutc()),
+ 'deletion_grace_period_seconds': None,
+ 'deletion_timestamp': None,
+ 'finalizers': None,
+ 'generate_name': None,
+ 'generation': 1,
+ 'labels': None,
+ 'managed_fields': [{'api_version': 'apps/v1',
+ 'fields_type': 'FieldsV1',
+ 'fields_v1': {'f:spec': {'f:progressDeadlineSeconds': {},
+ 'f:replicas': {},
+ 'f:revisionHistoryLimit': {},
+ 'f:selector': {},
+ 'f:strategy': {'f:rollingUpdate': {'.': {},
+ 'f:maxSurge': {},
+ 'f:maxUnavailable': {}},
+ 'f:type': {}},
+ 'f:template': {'f:metadata': {'f:labels': {'.': {},
+ 'f:pi-edge': {}}},
+ 'f:spec': {'f:containers': {'k:{"name":"newtest-demopaastwoportsthreeenv"}': {'.': {},
+ 'f:env': {'.': {},
+ 'k:{"name":"FIRST_ENV"}': {'.': {},
+ 'f:name': {},
+ 'f:value': {}},
+ 'k:{"name":"SECOND_ENV"}': {'.': {},
+ 'f:name': {},
+ 'f:value': {}},
+ 'k:{"name":"THIRD_ENV"}': {'.': {},
+ 'f:name': {},
+ 'f:value': {}}},
+ 'f:image': {},
+ 'f:imagePullPolicy': {},
+ 'f:name': {},
+ 'f:ports': {'.': {},
+ 'k:{"containerPort":80,"protocol":"TCP"}': {'.': {},
+ 'f:containerPort': {},
+ 'f:protocol': {}},
+ 'k:{"containerPort":81,"protocol":"TCP"}': {'.': {},
+ 'f:containerPort': {},
+ 'f:protocol': {}}},
+ 'f:resources': {'.': {},
+ 'f:limits': {'.': {},
+ 'f:cpu': {}},
+ 'f:requests': {'.': {},
+ 'f:cpu': {}}},
+ 'f:terminationMessagePath': {},
+ 'f:terminationMessagePolicy': {}}},
+ 'f:dnsPolicy': {},
+ 'f:hostname': {},
+ 'f:nodeSelector': {},
+ 'f:restartPolicy': {},
+ 'f:schedulerName': {},
+ 'f:securityContext': {},
+ 'f:terminationGracePeriodSeconds': {}}}}},
+ 'manager': 'OpenAPI-Generator',
+ 'operation': 'Update',
+ 'time': datetime.datetime(2022, 11, 16, 11, 6, 16, tzinfo=tzutc())},
+ {'api_version': 'apps/v1',
+ 'fields_type': 'FieldsV1',
+ 'fields_v1': {'f:metadata': {'f:annotations': {'.': {},
+ 'f:deployment.kubernetes.io/revision': {}}},
+ 'f:status': {'f:availableReplicas': {},
+ 'f:conditions': {'.': {},
+ 'k:{"type":"Available"}': {'.': {},
+ 'f:lastTransitionTime': {},
+ 'f:lastUpdateTime': {},
+ 'f:message': {},
+ 'f:reason': {},
+ 'f:status': {},
+ 'f:type': {}},
+ 'k:{"type":"Progressing"}': {'.': {},
+ 'f:lastTransitionTime': {},
+ 'f:lastUpdateTime': {},
+ 'f:message': {},
+ 'f:reason': {},
+ 'f:status': {},
+ 'f:type': {}}},
+ 'f:observedGeneration': {},
+ 'f:readyReplicas': {},
+ 'f:replicas': {},
+ 'f:updatedReplicas': {}}},
+ 'manager': 'kubelite',
+ 'operation': 'Update',
+ 'time': datetime.datetime(2022, 11, 16, 11, 6, 21, tzinfo=tzutc())}],
+ 'name': 'newtest-demopaastwoportsthreeenv',
+ 'namespace': 'pi-edge',
+ 'owner_references': None,
+ 'resource_version': '33621659',
+ 'self_link': '/apis/apps/v1/namespaces/pi-edge/deployments/newtest-demopaastwoportsthreeenv',
+ 'uid': '31734ba0-05cf-4ed6-95a3-489ef6635879'},
+ 'spec': {'min_ready_seconds': None,
+ 'paused': None,
+ 'progress_deadline_seconds': 600,
+ 'replicas': 1,
+ 'revision_history_limit': 10,
+ 'selector': {'match_expressions': None,
+ 'match_labels': {'pi-edge': 'newtest-demopaastwoportsthreeenv'}},
+ 'strategy': {'rolling_update': {'max_surge': '25%',
+ 'max_unavailable': '25%'},
+ 'type': 'RollingUpdate'},
+ 'template': {'metadata': {'annotations': None,
+ 'cluster_name': None,
+ 'creation_timestamp': None,
+ 'deletion_grace_period_seconds': None,
+ 'deletion_timestamp': None,
+ 'finalizers': None,
+ 'generate_name': None,
+ 'generation': None,
+ 'labels': {'pi-edge': 'newtest-demopaastwoportsthreeenv'},
+ 'managed_fields': None,
+ 'name': None,
+ 'namespace': None,
+ 'owner_references': None,
+ 'resource_version': None,
+ 'self_link': None,
+ 'uid': None},
+ 'spec': {'active_deadline_seconds': None,
+ 'affinity': None,
+ 'automount_service_account_token': None,
+ 'containers': [{'args': None,
+ 'command': None,
+ 'env': [{'name': 'FIRST_ENV',
+ 'value': 'newtest-demo-paastwovolumes',
+ 'value_from': None},
+ {'name': 'SECOND_ENV',
+ 'value': 'edgextest2',
+ 'value_from': None},
+ {'name': 'THIRD_ENV',
+ 'value': 'test3',
+ 'value_from': None}],
+ 'env_from': None,
+ 'image': 'k8s.gcr.io/hpa-example',
+ 'image_pull_policy': 'Always',
+ 'lifecycle': None,
+ 'liveness_probe': None,
+ 'name': 'newtest-demopaastwoportsthreeenv',
+ 'ports': [{'container_port': 80,
+ 'host_ip': None,
+ 'host_port': None,
+ 'name': None,
+ 'protocol': 'TCP'},
+ {'container_port': 81,
+ 'host_ip': None,
+ 'host_port': None,
+ 'name': None,
+ 'protocol': 'TCP'}],
+ 'readiness_probe': None,
+ 'resources': {'limits': {'cpu': '500m'},
+ 'requests': {'cpu': '150m'}},
+ 'security_context': None,
+ 'startup_probe': None,
+ 'stdin': None,
+ 'stdin_once': None,
+ 'termination_message_path': '/dev/termination-log',
+ 'termination_message_policy': 'File',
+ 'tty': None,
+ 'volume_devices': None,
+ 'volume_mounts': None,
+ 'working_dir': None}],
+ 'dns_config': None,
+ 'dns_policy': 'ClusterFirst',
+ 'enable_service_links': None,
+ 'ephemeral_containers': None,
+ 'host_aliases': None,
+ 'host_ipc': None,
+ 'host_network': None,
+ 'host_pid': None,
+ 'hostname': 'newtest-demopaastwoportsthreeenv',
+ 'image_pull_secrets': None,
+ 'init_containers': None,
+ 'node_name': None,
+ 'node_selector': {'location': 'Peania_19002_Athens'},
+ 'overhead': None,
+ 'preemption_policy': None,
+ 'priority': None,
+ 'priority_class_name': None,
+ 'readiness_gates': None,
+ 'restart_policy': 'Always',
+ 'runtime_class_name': None,
+ 'scheduler_name': 'default-scheduler',
+ 'security_context': {'fs_group': None,
+ 'run_as_group': None,
+ 'run_as_non_root': None,
+ 'run_as_user': None,
+ 'se_linux_options': None,
+ 'supplemental_groups': None,
+ 'sysctls': None,
+ 'windows_options': None},
+ 'service_account': None,
+ 'service_account_name': None,
+ 'share_process_namespace': None,
+ 'subdomain': None,
+ 'termination_grace_period_seconds': 30,
+ 'tolerations': None,
+ 'topology_spread_constraints': None,
+ 'volumes': None}}},
+ 'status': {'available_replicas': 1,
+ 'collision_count': None,
+ 'conditions': [{'last_transition_time': datetime.datetime(2022, 11, 16, 11, 6, 21, tzinfo=tzutc()),
+ 'last_update_time': datetime.datetime(2022, 11, 16, 11, 6, 21, tzinfo=tzutc()),
+ 'message': 'Deployment has minimum '
+ 'availability.',
+ 'reason': 'MinimumReplicasAvailable',
+ 'status': 'True',
+ 'type': 'Available'},
+ {'last_transition_time': datetime.datetime(2022, 11, 16, 11, 6, 16, tzinfo=tzutc()),
+ 'last_update_time': datetime.datetime(2022, 11, 16, 11, 6, 21, tzinfo=tzutc()),
+ 'message': 'ReplicaSet '
+ '"newtest-demopaastwoportsthreeenv-5cdbfcfd86" '
+ 'has successfully '
+ 'progressed.',
+ 'reason': 'NewReplicaSetAvailable',
+ 'status': 'True',
+ 'type': 'Progressing'}],
+ 'observed_generation': 1,
+ 'ready_replicas': 1,
+ 'replicas': 1,
+ 'unavailable_replicas': None,
+ 'updated_replicas': 1}},
+ {'api_version': None,
+ 'kind': None,
+ 'metadata': {'annotations': {'deployment.kubernetes.io/revision': '1'},
+ 'cluster_name': None,
+ 'creation_timestamp': datetime.datetime(2022, 11, 16, 11, 6, 17, tzinfo=tzutc()),
+ 'deletion_grace_period_seconds': None,
+ 'deletion_timestamp': None,
+ 'finalizers': None,
+ 'generate_name': None,
+ 'generation': 1,
+ 'labels': None,
+ 'managed_fields': [{'api_version': 'apps/v1',
+ 'fields_type': 'FieldsV1',
+ 'fields_v1': {'f:spec': {'f:progressDeadlineSeconds': {},
+ 'f:replicas': {},
+ 'f:revisionHistoryLimit': {},
+ 'f:selector': {},
+ 'f:strategy': {'f:rollingUpdate': {'.': {},
+ 'f:maxSurge': {},
+ 'f:maxUnavailable': {}},
+ 'f:type': {}},
+ 'f:template': {'f:metadata': {'f:labels': {'.': {},
+ 'f:pi-edge': {}}},
+ 'f:spec': {'f:containers': {'k:{"name":"newtest-demo-paastwovolumes"}': {'.': {},
+ 'f:env': {'.': {},
+ 'k:{"name":"MONDOD"}': {'.': {},
+ 'f:name': {},
+ 'f:value': {}},
+ 'k:{"name":"TEST2"}': {'.': {},
+ 'f:name': {},
+ 'f:value': {}}},
+ 'f:image': {},
+ 'f:imagePullPolicy': {},
+ 'f:name': {},
+ 'f:ports': {'.': {},
+ 'k:{"containerPort":80,"protocol":"TCP"}': {'.': {},
+ 'f:containerPort': {},
+ 'f:protocol': {}}},
+ 'f:resources': {'.': {},
+ 'f:limits': {'.': {},
+ 'f:cpu': {}},
+ 'f:requests': {'.': {},
+ 'f:cpu': {}}},
+ 'f:terminationMessagePath': {},
+ 'f:terminationMessagePolicy': {},
+ 'f:volumeMounts': {'.': {},
+ 'k:{"mountPath":"/opt/config"}': {'.': {},
+ 'f:mountPath': {},
+ 'f:name': {}},
+ 'k:{"mountPath":"/opt/data"}': {'.': {},
+ 'f:mountPath': {},
+ 'f:name': {}}}}},
+ 'f:dnsPolicy': {},
+ 'f:hostname': {},
+ 'f:nodeSelector': {},
+ 'f:restartPolicy': {},
+ 'f:schedulerName': {},
+ 'f:securityContext': {},
+ 'f:terminationGracePeriodSeconds': {},
+ 'f:volumes': {'.': {},
+ 'k:{"name":"newtest-demo-paastwovolumes-volume1"}': {'.': {},
+ 'f:name': {},
+ 'f:persistentVolumeClaim': {'.': {},
+ 'f:claimName': {}}},
+ 'k:{"name":"newtest-demo-paastwovolumes-volume2"}': {'.': {},
+ 'f:name': {},
+ 'f:persistentVolumeClaim': {'.': {},
+ 'f:claimName': {}}}}}}}},
+ 'manager': 'OpenAPI-Generator',
+ 'operation': 'Update',
+ 'time': datetime.datetime(2022, 11, 16, 11, 6, 17, tzinfo=tzutc())},
+ {'api_version': 'apps/v1',
+ 'fields_type': 'FieldsV1',
+ 'fields_v1': {'f:metadata': {'f:annotations': {'.': {},
+ 'f:deployment.kubernetes.io/revision': {}}},
+ 'f:status': {'f:availableReplicas': {},
+ 'f:conditions': {'.': {},
+ 'k:{"type":"Available"}': {'.': {},
+ 'f:lastTransitionTime': {},
+ 'f:lastUpdateTime': {},
+ 'f:message': {},
+ 'f:reason': {},
+ 'f:status': {},
+ 'f:type': {}},
+ 'k:{"type":"Progressing"}': {'.': {},
+ 'f:lastTransitionTime': {},
+ 'f:lastUpdateTime': {},
+ 'f:message': {},
+ 'f:reason': {},
+ 'f:status': {},
+ 'f:type': {}}},
+ 'f:observedGeneration': {},
+ 'f:readyReplicas': {},
+ 'f:replicas': {},
+ 'f:updatedReplicas': {}}},
+ 'manager': 'kubelite',
+ 'operation': 'Update',
+ 'time': datetime.datetime(2022, 11, 16, 11, 6, 25, tzinfo=tzutc())}],
+ 'name': 'newtest-demo-paastwovolumes',
+ 'namespace': 'pi-edge',
+ 'owner_references': None,
+ 'resource_version': '33621686',
+ 'self_link': '/apis/apps/v1/namespaces/pi-edge/deployments/newtest-demo-paastwovolumes',
+ 'uid': '9eea69dc-d8da-405e-9fc6-72a16290c717'},
+ 'spec': {'min_ready_seconds': None,
+ 'paused': None,
+ 'progress_deadline_seconds': 600,
+ 'replicas': 1,
+ 'revision_history_limit': 10,
+ 'selector': {'match_expressions': None,
+ 'match_labels': {'pi-edge': 'newtest-demo-paastwovolumes'}},
+ 'strategy': {'rolling_update': {'max_surge': '25%',
+ 'max_unavailable': '25%'},
+ 'type': 'RollingUpdate'},
+ 'template': {'metadata': {'annotations': None,
+ 'cluster_name': None,
+ 'creation_timestamp': None,
+ 'deletion_grace_period_seconds': None,
+ 'deletion_timestamp': None,
+ 'finalizers': None,
+ 'generate_name': None,
+ 'generation': None,
+ 'labels': {'pi-edge': 'newtest-demo-paastwovolumes'},
+ 'managed_fields': None,
+ 'name': None,
+ 'namespace': None,
+ 'owner_references': None,
+ 'resource_version': None,
+ 'self_link': None,
+ 'uid': None},
+ 'spec': {'active_deadline_seconds': None,
+ 'affinity': None,
+ 'automount_service_account_token': None,
+ 'containers': [{'args': None,
+ 'command': None,
+ 'env': [{'name': 'MONDOD',
+ 'value': '192.159.32.12:9019',
+ 'value_from': None},
+ {'name': 'TEST2',
+ 'value': 'test2',
+ 'value_from': None}],
+ 'env_from': None,
+ 'image': 'k8s.gcr.io/hpa-example',
+ 'image_pull_policy': 'Always',
+ 'lifecycle': None,
+ 'liveness_probe': None,
+ 'name': 'newtest-demo-paastwovolumes',
+ 'ports': [{'container_port': 80,
+ 'host_ip': None,
+ 'host_port': None,
+ 'name': None,
+ 'protocol': 'TCP'}],
+ 'readiness_probe': None,
+ 'resources': {'limits': {'cpu': '500m'},
+ 'requests': {'cpu': '150m'}},
+ 'security_context': None,
+ 'startup_probe': None,
+ 'stdin': None,
+ 'stdin_once': None,
+ 'termination_message_path': '/dev/termination-log',
+ 'termination_message_policy': 'File',
+ 'tty': None,
+ 'volume_devices': None,
+ 'volume_mounts': [{'mount_path': '/opt/data',
+ 'mount_propagation': None,
+ 'name': 'newtest-demo-paastwovolumes-volume1',
+ 'read_only': None,
+ 'sub_path': None,
+ 'sub_path_expr': None},
+ {'mount_path': '/opt/config',
+ 'mount_propagation': None,
+ 'name': 'newtest-demo-paastwovolumes-volume2',
+ 'read_only': None,
+ 'sub_path': None,
+ 'sub_path_expr': None}],
+ 'working_dir': None}],
+ 'dns_config': None,
+ 'dns_policy': 'ClusterFirst',
+ 'enable_service_links': None,
+ 'ephemeral_containers': None,
+ 'host_aliases': None,
+ 'host_ipc': None,
+ 'host_network': None,
+ 'host_pid': None,
+ 'hostname': 'newtest-demo-paastwovolumes',
+ 'image_pull_secrets': None,
+ 'init_containers': None,
+ 'node_name': None,
+ 'node_selector': {'location': 'Peania_19002_Athens'},
+ 'overhead': None,
+ 'preemption_policy': None,
+ 'priority': None,
+ 'priority_class_name': None,
+ 'readiness_gates': None,
+ 'restart_policy': 'Always',
+ 'runtime_class_name': None,
+ 'scheduler_name': 'default-scheduler',
+ 'security_context': {'fs_group': None,
+ 'run_as_group': None,
+ 'run_as_non_root': None,
+ 'run_as_user': None,
+ 'se_linux_options': None,
+ 'supplemental_groups': None,
+ 'sysctls': None,
+ 'windows_options': None},
+ 'service_account': None,
+ 'service_account_name': None,
+ 'share_process_namespace': None,
+ 'subdomain': None,
+ 'termination_grace_period_seconds': 30,
+ 'tolerations': None,
+ 'topology_spread_constraints': None,
+ 'volumes': [{'aws_elastic_block_store': None,
+ 'azure_disk': None,
+ 'azure_file': None,
+ 'cephfs': None,
+ 'cinder': None,
+ 'config_map': None,
+ 'csi': None,
+ 'downward_api': None,
+ 'empty_dir': None,
+ 'fc': None,
+ 'flex_volume': None,
+ 'flocker': None,
+ 'gce_persistent_disk': None,
+ 'git_repo': None,
+ 'glusterfs': None,
+ 'host_path': None,
+ 'iscsi': None,
+ 'name': 'newtest-demo-paastwovolumes-volume1',
+ 'nfs': None,
+ 'persistent_volume_claim': {'claim_name': 'newtest-demo-paastwovolumes-volume1',
+ 'read_only': None},
+ 'photon_persistent_disk': None,
+ 'portworx_volume': None,
+ 'projected': None,
+ 'quobyte': None,
+ 'rbd': None,
+ 'scale_io': None,
+ 'secret': None,
+ 'storageos': None,
+ 'vsphere_volume': None},
+ {'aws_elastic_block_store': None,
+ 'azure_disk': None,
+ 'azure_file': None,
+ 'cephfs': None,
+ 'cinder': None,
+ 'config_map': None,
+ 'csi': None,
+ 'downward_api': None,
+ 'empty_dir': None,
+ 'fc': None,
+ 'flex_volume': None,
+ 'flocker': None,
+ 'gce_persistent_disk': None,
+ 'git_repo': None,
+ 'glusterfs': None,
+ 'host_path': None,
+ 'iscsi': None,
+ 'name': 'newtest-demo-paastwovolumes-volume2',
+ 'nfs': None,
+ 'persistent_volume_claim': {'claim_name': 'newtest-demo-paastwovolumes-volume2',
+ 'read_only': None},
+ 'photon_persistent_disk': None,
+ 'portworx_volume': None,
+ 'projected': None,
+ 'quobyte': None,
+ 'rbd': None,
+ 'scale_io': None,
+ 'secret': None,
+ 'storageos': None,
+ 'vsphere_volume': None}]}}},
diff --git a/service-resource-manager-implementation/requirements.txt b/service-resource-manager-implementation/requirements.txt
new file mode 100644
index 0000000..ea1354c
--- /dev/null
+++ b/service-resource-manager-implementation/requirements.txt
@@ -0,0 +1,13 @@
+#connexion >= 2.6.0
+connexion[swagger-ui]
+python_dateutil == 2.6.0
+setuptools >= 21.0.0
+swagger-ui-bundle >= 0.0.2
+python-dotenv == 1.0.1
+pymongo==3.12.0
+#git+https://github.com/kubernetes-client/python.git
+requests==2.25.1
+
+psycopg2-binary
+
+urllib3
diff --git a/service-resource-manager-implementation/setup.py b/service-resource-manager-implementation/setup.py
new file mode 100644
index 0000000..93bcc07
--- /dev/null
+++ b/service-resource-manager-implementation/setup.py
@@ -0,0 +1,37 @@
+# coding: utf-8
+
+import sys
+from setuptools import setup, find_packages
+
+NAME = "swagger_server"
+VERSION = "1.0.0"
+# To install the library, run the following
+#
+# python setup.py install
+#
+# prerequisite: setuptools
+# http://pypi.python.org/pypi/setuptools
+
+REQUIRES = [
+ "connexion"
+ # "swagger-ui-bundle>=0.0.2",
+ # "requests"
+]
+
+setup(
+ name=NAME,
+ version=VERSION,
+ description="Service Resource Manager Controller API",
+ author_email="dlaskaratos@intracom-telecom.com",
+ url="",
+ keywords=["Swagger", "service resource manager API"],
+ install_requires=REQUIRES,
+ packages=find_packages(),
+ package_data={'': ['swagger/swagger.yaml']},
+ include_package_data=True,
+ entry_points={
+ 'console_scripts': ['swagger_server=swagger_server.__main__:main']},
+ long_description="""\
+ API exposed by π-edge for \"PaaS & Service Function\" - based interaction with NFV MANO.
+ """
+)
diff --git a/service-resource-manager-implementation/swagger_server/__init__.py b/service-resource-manager-implementation/swagger_server/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/service-resource-manager-implementation/swagger_server/__main__.py b/service-resource-manager-implementation/swagger_server/__main__.py
new file mode 100644
index 0000000..27c08e6
--- /dev/null
+++ b/service-resource-manager-implementation/swagger_server/__main__.py
@@ -0,0 +1,24 @@
+#!/usr/bin/env python3
+
+import connexion
+
+import logging
+import sys
+import os
+
+from swagger_server import encoder
+
+import urllib3
+urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
+
+def main():
+ global driver
+ logging.basicConfig(level=logging.INFO)
+ app = connexion.App(__name__, specification_dir='./swagger/')
+ app.app.json_encoder = encoder.JSONEncoder
+ app.add_api('swagger.yaml', strict_validation=True, arguments={'title': 'Service Resource Manager API'}, pythonic_params=True)
+ app.run(port=8080)
+
+
+if __name__ == '__main__':
+ main()
diff --git a/service-resource-manager-implementation/swagger_server/adapters/artifact/clients/skopeo/.gitkeep b/service-resource-manager-implementation/swagger_server/adapters/artifact/clients/skopeo/.gitkeep
new file mode 100644
index 0000000..e69de29
diff --git a/service-resource-manager-implementation/swagger_server/adapters/artifact/clients/skopeo/__init__.py b/service-resource-manager-implementation/swagger_server/adapters/artifact/clients/skopeo/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/service-resource-manager-implementation/swagger_server/adapters/artifact/core/.gitkeep b/service-resource-manager-implementation/swagger_server/adapters/artifact/core/.gitkeep
new file mode 100644
index 0000000..e69de29
diff --git a/service-resource-manager-implementation/swagger_server/adapters/edgecloud/.env b/service-resource-manager-implementation/swagger_server/adapters/edgecloud/.env
new file mode 100644
index 0000000..8bcda46
--- /dev/null
+++ b/service-resource-manager-implementation/swagger_server/adapters/edgecloud/.env
@@ -0,0 +1,7 @@
+# #### Logging ####
+# LOG_LEVEL="debug"
+# LOG_FILE="edgecloud.log"
+
+#### EdgeCloud ####
+# EDGE_CLOUD="i2edge"
+EDGE_CLOUD_URL=http://192.168.123.86:30769
diff --git a/service-resource-manager-implementation/swagger_server/adapters/edgecloud/clients/aeros/__init__.py b/service-resource-manager-implementation/swagger_server/adapters/edgecloud/clients/aeros/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/service-resource-manager-implementation/swagger_server/adapters/edgecloud/clients/aeros/client.py b/service-resource-manager-implementation/swagger_server/adapters/edgecloud/clients/aeros/client.py
new file mode 100644
index 0000000..2d47c44
--- /dev/null
+++ b/service-resource-manager-implementation/swagger_server/adapters/edgecloud/clients/aeros/client.py
@@ -0,0 +1,29 @@
+# Mocked API for testing purposes
+from typing import Dict, List, Optional
+from edgecloud.core.edgecloud_interface import EdgeCloudManagementInterface
+
+class EdgeApplicationManager(EdgeCloudManagementInterface):
+ def onboard_app(self, app_manifest: Dict) -> Dict:
+ print(f"Submitting application: {app_manifest}")
+ return {"appId": "1234-5678"}
+
+ def get_all_onboarded_apps(self) -> List[Dict]:
+ return [{"appId": "1234-5678", "name": "TestApp"}]
+
+ def get_onboarded_app(self, app_id: str) -> Dict:
+ return {"appId": app_id, "name": "TestApp"}
+
+ def delete_onboarded_app(self, app_id: str) -> None:
+ print(f"Deleting application: {app_id}")
+
+ def deploy_app(self, app_id: str, app_zones: List[Dict]) -> Dict:
+ return {"appInstanceId": "abcd-efgh"}
+
+ def get_all_deployed_apps(self, app_id: Optional[str] = None, app_instance_id: Optional[str] = None, region: Optional[str] = None) -> List[Dict]:
+ return [{"appInstanceId": "abcd-efgh", "status": "ready"}]
+
+ def undeploy_app(self, app_instance_id: str) -> None:
+ print(f"Deleting app instance: {app_instance_id}")
+
+ def get_edge_cloud_zones(self, region: Optional[str] = None, status: Optional[str] = None) -> List[Dict]:
+ return [{"edgeCloudZoneId": "zone-1", "status": "active"}]
diff --git a/service-resource-manager-implementation/swagger_server/adapters/edgecloud/clients/eurecom_platform/__init__.py b/service-resource-manager-implementation/swagger_server/adapters/edgecloud/clients/eurecom_platform/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/service-resource-manager-implementation/swagger_server/adapters/edgecloud/clients/eurecom_platform/client.py b/service-resource-manager-implementation/swagger_server/adapters/edgecloud/clients/eurecom_platform/client.py
new file mode 100644
index 0000000..2d47c44
--- /dev/null
+++ b/service-resource-manager-implementation/swagger_server/adapters/edgecloud/clients/eurecom_platform/client.py
@@ -0,0 +1,29 @@
+# Mocked API for testing purposes
+from typing import Dict, List, Optional
+from edgecloud.core.edgecloud_interface import EdgeCloudManagementInterface
+
+class EdgeApplicationManager(EdgeCloudManagementInterface):
+ def onboard_app(self, app_manifest: Dict) -> Dict:
+ print(f"Submitting application: {app_manifest}")
+ return {"appId": "1234-5678"}
+
+ def get_all_onboarded_apps(self) -> List[Dict]:
+ return [{"appId": "1234-5678", "name": "TestApp"}]
+
+ def get_onboarded_app(self, app_id: str) -> Dict:
+ return {"appId": app_id, "name": "TestApp"}
+
+ def delete_onboarded_app(self, app_id: str) -> None:
+ print(f"Deleting application: {app_id}")
+
+ def deploy_app(self, app_id: str, app_zones: List[Dict]) -> Dict:
+ return {"appInstanceId": "abcd-efgh"}
+
+ def get_all_deployed_apps(self, app_id: Optional[str] = None, app_instance_id: Optional[str] = None, region: Optional[str] = None) -> List[Dict]:
+ return [{"appInstanceId": "abcd-efgh", "status": "ready"}]
+
+ def undeploy_app(self, app_instance_id: str) -> None:
+ print(f"Deleting app instance: {app_instance_id}")
+
+ def get_edge_cloud_zones(self, region: Optional[str] = None, status: Optional[str] = None) -> List[Dict]:
+ return [{"edgeCloudZoneId": "zone-1", "status": "active"}]
diff --git a/service-resource-manager-implementation/swagger_server/adapters/edgecloud/clients/i2edge/__init__.py b/service-resource-manager-implementation/swagger_server/adapters/edgecloud/clients/i2edge/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/service-resource-manager-implementation/swagger_server/adapters/edgecloud/clients/i2edge/client.py b/service-resource-manager-implementation/swagger_server/adapters/edgecloud/clients/i2edge/client.py
new file mode 100644
index 0000000..2d47c44
--- /dev/null
+++ b/service-resource-manager-implementation/swagger_server/adapters/edgecloud/clients/i2edge/client.py
@@ -0,0 +1,29 @@
+# Mocked API for testing purposes
+from typing import Dict, List, Optional
+from edgecloud.core.edgecloud_interface import EdgeCloudManagementInterface
+
+class EdgeApplicationManager(EdgeCloudManagementInterface):
+ def onboard_app(self, app_manifest: Dict) -> Dict:
+ print(f"Submitting application: {app_manifest}")
+ return {"appId": "1234-5678"}
+
+ def get_all_onboarded_apps(self) -> List[Dict]:
+ return [{"appId": "1234-5678", "name": "TestApp"}]
+
+ def get_onboarded_app(self, app_id: str) -> Dict:
+ return {"appId": app_id, "name": "TestApp"}
+
+ def delete_onboarded_app(self, app_id: str) -> None:
+ print(f"Deleting application: {app_id}")
+
+ def deploy_app(self, app_id: str, app_zones: List[Dict]) -> Dict:
+ return {"appInstanceId": "abcd-efgh"}
+
+ def get_all_deployed_apps(self, app_id: Optional[str] = None, app_instance_id: Optional[str] = None, region: Optional[str] = None) -> List[Dict]:
+ return [{"appInstanceId": "abcd-efgh", "status": "ready"}]
+
+ def undeploy_app(self, app_instance_id: str) -> None:
+ print(f"Deleting app instance: {app_instance_id}")
+
+ def get_edge_cloud_zones(self, region: Optional[str] = None, status: Optional[str] = None) -> List[Dict]:
+ return [{"edgeCloudZoneId": "zone-1", "status": "active"}]
diff --git a/service-resource-manager-implementation/swagger_server/adapters/edgecloud/clients/isi_platform/__init__.py b/service-resource-manager-implementation/swagger_server/adapters/edgecloud/clients/isi_platform/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/service-resource-manager-implementation/swagger_server/adapters/edgecloud/clients/isi_platform/client.py b/service-resource-manager-implementation/swagger_server/adapters/edgecloud/clients/isi_platform/client.py
new file mode 100644
index 0000000..2d47c44
--- /dev/null
+++ b/service-resource-manager-implementation/swagger_server/adapters/edgecloud/clients/isi_platform/client.py
@@ -0,0 +1,29 @@
+# Mocked API for testing purposes
+from typing import Dict, List, Optional
+from edgecloud.core.edgecloud_interface import EdgeCloudManagementInterface
+
+class EdgeApplicationManager(EdgeCloudManagementInterface):
+ def onboard_app(self, app_manifest: Dict) -> Dict:
+ print(f"Submitting application: {app_manifest}")
+ return {"appId": "1234-5678"}
+
+ def get_all_onboarded_apps(self) -> List[Dict]:
+ return [{"appId": "1234-5678", "name": "TestApp"}]
+
+ def get_onboarded_app(self, app_id: str) -> Dict:
+ return {"appId": app_id, "name": "TestApp"}
+
+ def delete_onboarded_app(self, app_id: str) -> None:
+ print(f"Deleting application: {app_id}")
+
+ def deploy_app(self, app_id: str, app_zones: List[Dict]) -> Dict:
+ return {"appInstanceId": "abcd-efgh"}
+
+ def get_all_deployed_apps(self, app_id: Optional[str] = None, app_instance_id: Optional[str] = None, region: Optional[str] = None) -> List[Dict]:
+ return [{"appInstanceId": "abcd-efgh", "status": "ready"}]
+
+ def undeploy_app(self, app_instance_id: str) -> None:
+ print(f"Deleting app instance: {app_instance_id}")
+
+ def get_edge_cloud_zones(self, region: Optional[str] = None, status: Optional[str] = None) -> List[Dict]:
+ return [{"edgeCloudZoneId": "zone-1", "status": "active"}]
diff --git a/service-resource-manager-implementation/swagger_server/adapters/edgecloud/clients/piedge/__init__.py b/service-resource-manager-implementation/swagger_server/adapters/edgecloud/clients/piedge/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/service-resource-manager-implementation/swagger_server/adapters/edgecloud/clients/piedge/client.py b/service-resource-manager-implementation/swagger_server/adapters/edgecloud/clients/piedge/client.py
new file mode 100644
index 0000000..d0f26a5
--- /dev/null
+++ b/service-resource-manager-implementation/swagger_server/adapters/edgecloud/clients/piedge/client.py
@@ -0,0 +1,47 @@
+# Mocked API for testing purposes
+from typing import Dict, List, Optional
+import os
+import logging
+import requests
+from edgecloud.core.edgecloud_interface import EdgeCloudManagementInterface
+
+piedge_ip = os.environ['EDGE_CLOUD_ADAPTER']
+edge_cloud_provider = os.environ['PLATFORM_PROVIDER']
+
+class EdgeApplicationManager(EdgeCloudManagementInterface):
+ def onboard_app(self, app_manifest: Dict) -> Dict:
+ print(f"Submitting application: {app_manifest}")
+ return {"appId": "1234-5678"}
+
+ def get_all_onboarded_apps(self) -> List[Dict]:
+ return [{"appId": "1234-5678", "name": "TestApp"}]
+
+ def get_onboarded_app(self, app_id: str) -> Dict:
+ return {"appId": app_id, "name": "TestApp"}
+
+ def delete_onboarded_app(self, app_id: str) -> None:
+ print(f"Deleting application: {app_id}")
+
+ def deploy_app(self, app_id: str, app_zones: List[Dict]) -> Dict:
+ return {"appInstanceId": "abcd-efgh"}
+
+ def get_all_deployed_apps(self, app_id: Optional[str] = None, app_instance_id: Optional[str] = None, region: Optional[str] = None) -> List[Dict]:
+ return [{"appInstanceId": "abcd-efgh", "status": "ready"}]
+
+ def undeploy_app(self, app_instance_id: str) -> None:
+ print(f"Deleting app instance: {app_instance_id}")
+
+ def get_edge_cloud_zones(self, region: Optional[str] = None, status: Optional[str] = None) -> List[Dict]:
+ logging.info('Contacting π-Edge...')
+ nodes_response = requests.get('http://'+piedge_ip+'/piedge-connector/2.0.0/node')
+ zone_list =[]
+ if nodes_response.status_code==200:
+ for node in nodes_response.json().get('nodes'):
+ zone = {}
+ zone['edgeCloudZoneId'] = node.get('uid')
+ zone['edgeCloudZoneName'] = node.get('name')
+ zone['edgeCloudZoneStatus'] = node.get('status')
+ zone['edgeCloudProvider'] = edge_cloud_provider
+ zone['edgeCloudRegion'] = node.get('location')
+ zone_list.append(zone)
+ return zone_list
diff --git a/service-resource-manager-implementation/swagger_server/adapters/edgecloud/core/edgecloud_interface.py b/service-resource-manager-implementation/swagger_server/adapters/edgecloud/core/edgecloud_interface.py
new file mode 100644
index 0000000..9e53723
--- /dev/null
+++ b/service-resource-manager-implementation/swagger_server/adapters/edgecloud/core/edgecloud_interface.py
@@ -0,0 +1,103 @@
+#!/usr/bin/env python3
+# -*- coding: utf-8 -*-
+##
+# Copyright 2025-present by Software Networks Area, i2CAT.
+# All rights reserved.
+#
+# This file is part of the Federation SDK
+# Unauthorized copying of this file, via any medium is strictly prohibited.
+#
+# Contributors:
+# - Adrián Pino (adrian.pino@i2cat.net)
+##
+
+from abc import ABC, abstractmethod
+from typing import List, Dict, Optional
+
+class EdgeCloudManagementInterface(ABC):
+ """
+ Abstract Base Class for Edge Application Management.
+ """
+
+ @abstractmethod
+ def onboard_app(self, app_manifest: Dict) -> Dict:
+ """
+ Onboards an app, submitting application metadata to the Edge Cloud Provider.
+
+ :param app_manifest: Application metadata in dictionary format.
+ :return: Dictionary containing created application details.
+ """
+ pass
+
+ @abstractmethod
+ def get_all_onboarded_apps(self) -> List[Dict]:
+ """
+ Retrieves a list of onboarded applications.
+
+ :return: List of application metadata dictionaries.
+ """
+ pass
+
+ @abstractmethod
+ def get_onboarded_app(self, app_id: str) -> Dict:
+ """
+ Retrieves information of a specific onboarded application.
+
+ :param app_id: Unique identifier of the application.
+ :return: Dictionary with application details.
+ """
+ pass
+
+ @abstractmethod
+ def delete_onboarded_app(self, app_id: str) -> None:
+ """
+ Deletes an application onboarded from the Edge Cloud Provider.
+
+ :param app_id: Unique identifier of the application.
+ """
+ pass
+
+ @abstractmethod
+ def deploy_app(self, app_id: str, app_zones: List[Dict]) -> Dict:
+ """
+ Requests the instantiation of an application instance.
+
+ :param app_id: Unique identifier of the application.
+ :param app_zones: List of Edge Cloud Zones where the app should be instantiated.
+ :return: Dictionary with instance details.
+ """
+ pass
+
+ @abstractmethod
+ def get_all_deployed_apps(
+ self, app_id: Optional[str] = None, app_instance_id: Optional[str] = None, region: Optional[str] = None
+ ) -> List[Dict]:
+ """
+ Retrieves information of application instances.
+
+ :param app_id: Filter by application ID.
+ :param app_instance_id: Filter by instance ID.
+ :param region: Filter by Edge Cloud region.
+ :return: List of application instance details.
+ """
+ pass
+
+ @abstractmethod
+ def undeploy_app(self, app_instance_id: str) -> None:
+ """
+ Terminates a specific application instance.
+
+ :param app_instance_id: Unique identifier of the application instance.
+ """
+ pass
+
+ @abstractmethod
+ def get_edge_cloud_zones(self, region: Optional[str] = None, status: Optional[str] = None) -> List[Dict]:
+ """
+ Retrieves a list of available Edge Cloud Zones.
+
+ :param region: Filter by geographical region.
+ :param status: Filter by status (active, inactive, unknown).
+ :return: List of Edge Cloud Zones.
+ """
+ pass
diff --git a/service-resource-manager-implementation/swagger_server/adapters/edgecloud/core/schemas.py b/service-resource-manager-implementation/swagger_server/adapters/edgecloud/core/schemas.py
new file mode 100644
index 0000000..f87f5c1
--- /dev/null
+++ b/service-resource-manager-implementation/swagger_server/adapters/edgecloud/core/schemas.py
@@ -0,0 +1 @@
+# TODO
\ No newline at end of file
diff --git a/service-resource-manager-implementation/swagger_server/adapters/edgecloud/doc/workflows/get_av_zones.md b/service-resource-manager-implementation/swagger_server/adapters/edgecloud/doc/workflows/get_av_zones.md
new file mode 100644
index 0000000..68cd9f7
--- /dev/null
+++ b/service-resource-manager-implementation/swagger_server/adapters/edgecloud/doc/workflows/get_av_zones.md
@@ -0,0 +1,20 @@
+```mermaid
+sequenceDiagram
+title Retrieve Edge Cloud Zones
+actor AP as App Vertical Provider
+participant CE as Capabilities Exposure
+box Service Resource Manager
+ participant API
+ participant SDK as EdgeCloudSDK
+end
+participant i2Edge
+participant PiEdge
+
+note over AP,CE: CAMARA EdgeCloud API
+AP ->> CE: GET /edge-cloud-zones
+CE ->> API: GET /av. zones
+API ->> SDK: sdk.i2edge.get_zones()
+SDK ->> i2Edge: GET /zones/list
+API ->> SDK: sdk.piedge.get_zones()
+SDK ->> PiEdge: GET /nodes
+```
\ No newline at end of file
diff --git a/service-resource-manager-implementation/swagger_server/adapters/network/clients/oai/.gitkeep b/service-resource-manager-implementation/swagger_server/adapters/network/clients/oai/.gitkeep
new file mode 100644
index 0000000..e69de29
diff --git a/service-resource-manager-implementation/swagger_server/adapters/network/clients/oai/__init__.py b/service-resource-manager-implementation/swagger_server/adapters/network/clients/oai/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/service-resource-manager-implementation/swagger_server/adapters/network/clients/open5gs/.gitkeep b/service-resource-manager-implementation/swagger_server/adapters/network/clients/open5gs/.gitkeep
new file mode 100644
index 0000000..e69de29
diff --git a/service-resource-manager-implementation/swagger_server/adapters/network/clients/open5gs/__init__.py b/service-resource-manager-implementation/swagger_server/adapters/network/clients/open5gs/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/service-resource-manager-implementation/swagger_server/adapters/network/core/.gitkeep b/service-resource-manager-implementation/swagger_server/adapters/network/core/.gitkeep
new file mode 100644
index 0000000..e69de29
diff --git a/service-resource-manager-implementation/swagger_server/config.py b/service-resource-manager-implementation/swagger_server/config.py
new file mode 100644
index 0000000..95c4fb1
--- /dev/null
+++ b/service-resource-manager-implementation/swagger_server/config.py
@@ -0,0 +1,13 @@
+from configparser import ConfigParser
+
+class Config:
+ __conf = None
+
+ def load_configuration():
+ global __conf
+ __conf = ConfigParser()
+ __conf.read('properties.conf')
+
+ def get(key: str):
+ global __conf
+ return __conf[key]
\ No newline at end of file
diff --git a/service-resource-manager-implementation/swagger_server/controllers/__init__.py b/service-resource-manager-implementation/swagger_server/controllers/__init__.py
new file mode 100644
index 0000000..0791ded
--- /dev/null
+++ b/service-resource-manager-implementation/swagger_server/controllers/__init__.py
@@ -0,0 +1,2 @@
+import urllib3
+urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
\ No newline at end of file
diff --git a/service-resource-manager-implementation/swagger_server/controllers/app_instance_controller.py b/service-resource-manager-implementation/swagger_server/controllers/app_instance_controller.py
new file mode 100644
index 0000000..62f27f2
--- /dev/null
+++ b/service-resource-manager-implementation/swagger_server/controllers/app_instance_controller.py
@@ -0,0 +1,44 @@
+from os import environ
+import logging
+from swagger_server.adapters.kubernetes_adapter import submit_helm_chart, app_deploy
+import connexion
+
+logger = logging.getLogger(__name__)
+logging.basicConfig(level=logging.DEBUG)
+
+def deploy_app(helm_request_body=None):
+ '''
+ Retrieves the nodes of the edge cloud platform supported by the testbed
+ '''
+ logger.info('Submitting request to edge cloud transformation function')
+ if connexion.request.is_json:
+ helm_request_body = connexion.request.get_json()
+ else:
+ return 'Wrong request schema', 400
+ try:
+ if helm_request_body.get('uri') is None:
+ return 'Helm chart uri is missing', 400
+ if helm_request_body.get('deployment_name') is None:
+ return 'Helm chart deployment name is missing', 400
+
+ helm_submit_response = submit_helm_chart(helm_request_body)
+ return helm_submit_response
+ except Exception as e:
+ logger.info(e)
+ return 'Error submitting helm chart: '+e.__cause__
+
+def get_app_instances(body):
+ '''
+ Instantiates app on the edge cloud platform
+ '''
+ logger.info('Deploying app instance')
+ if connexion.request.is_json:
+ helm_request_body = connexion.request.get_json()
+ else:
+ return 'Wrong request schema', 400
+ try:
+ app_response = app_deploy(body)
+ except Exception as e:
+ logger.info(e)
+ return 'Error instantiating app: '+e.__cause__
+
\ No newline at end of file
diff --git a/service-resource-manager-implementation/swagger_server/controllers/app_registration_controller.py b/service-resource-manager-implementation/swagger_server/controllers/app_registration_controller.py
new file mode 100644
index 0000000..3447b16
--- /dev/null
+++ b/service-resource-manager-implementation/swagger_server/controllers/app_registration_controller.py
@@ -0,0 +1,5 @@
+from os import environ
+import logging
+
+logger = logging.getLogger(__name__)
+logging.basicConfig(level=logging.DEBUG)
\ No newline at end of file
diff --git a/service-resource-manager-implementation/swagger_server/controllers/artifact_controller.py b/service-resource-manager-implementation/swagger_server/controllers/artifact_controller.py
new file mode 100644
index 0000000..9e86081
--- /dev/null
+++ b/service-resource-manager-implementation/swagger_server/controllers/artifact_controller.py
@@ -0,0 +1,38 @@
+import logging
+import json
+import connexion
+from swagger_server.models.copy_artifact_model import CopyArtifactModel
+from swagger_server.models.artifact_exists_model import ArtifactExistsModel
+from swagger_server.services import artifact_service
+
+def artifact_exists(body):
+ if connexion.request.is_json:
+ try:
+ artifact = ArtifactExistsModel.from_dict(body)
+ if artifact.registry_url is None:
+ return 'The registyr url must be provided', 400
+ if artifact.image_name is None:
+ return 'Image name must be provided', 400
+ response = artifact_service.artifact_exists(artifact)
+ return response
+ except Exception as e:
+ logging.error(e.args)
+ return e.args, 500
+ else:
+ return 'Request format must be JSON', 400
+
+def copy_artifact(body):
+ if connexion.request.is_json:
+ try:
+ artifact = CopyArtifactModel.from_dict(body)
+ if artifact.dst_registry is None or artifact.src_registry is None:
+ return 'The source and destination registries must be provided', 400
+ if artifact.src_image_name is None:
+ return 'The image name must be provided', 400
+ response = artifact_service.copy_artifact(artifact)
+ return response
+ except Exception as e:
+ logging.error(e.args)
+ return e.args
+ else:
+ return 'Request format must be JSON', 400
\ No newline at end of file
diff --git a/service-resource-manager-implementation/swagger_server/controllers/network_functions_controller.py b/service-resource-manager-implementation/swagger_server/controllers/network_functions_controller.py
new file mode 100644
index 0000000..3447b16
--- /dev/null
+++ b/service-resource-manager-implementation/swagger_server/controllers/network_functions_controller.py
@@ -0,0 +1,5 @@
+from os import environ
+import logging
+
+logger = logging.getLogger(__name__)
+logging.basicConfig(level=logging.DEBUG)
\ No newline at end of file
diff --git a/service-resource-manager-implementation/swagger_server/controllers/nodes_controller.py b/service-resource-manager-implementation/swagger_server/controllers/nodes_controller.py
new file mode 100644
index 0000000..41c7630
--- /dev/null
+++ b/service-resource-manager-implementation/swagger_server/controllers/nodes_controller.py
@@ -0,0 +1,18 @@
+import logging
+from swagger_server.services import kubernetes_adapter
+
+
+logger = logging.getLogger(__name__)
+logging.basicConfig(level=logging.DEBUG)
+
+def get_edge_platform_nodes():
+ '''
+ Retrieves the nodes of the edge cloud platform supported by the testbed
+ '''
+ logger.info('Acquiring testbed nodes')
+ try:
+ nodes_list = kubernetes_adapter.get_nodes()
+ return nodes_list
+ except Exception as e:
+ logger.info(e)
+ return 'Error getting node list: '+e.args
diff --git a/service-resource-manager-implementation/swagger_server/core/__init__.py b/service-resource-manager-implementation/swagger_server/core/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/service-resource-manager-implementation/swagger_server/encoder.py b/service-resource-manager-implementation/swagger_server/encoder.py
new file mode 100644
index 0000000..61ba472
--- /dev/null
+++ b/service-resource-manager-implementation/swagger_server/encoder.py
@@ -0,0 +1,20 @@
+from connexion.apps.flask_app import FlaskJSONEncoder
+import six
+
+from swagger_server.models.base_model_ import Model
+
+
+class JSONEncoder(FlaskJSONEncoder):
+ include_nulls = False
+
+ def default(self, o):
+ if isinstance(o, Model):
+ dikt = {}
+ for attr, _ in six.iteritems(o.swagger_types):
+ value = getattr(o, attr)
+ if value is None and not self.include_nulls:
+ continue
+ attr = o.attribute_map[attr]
+ dikt[attr] = value
+ return dikt
+ return FlaskJSONEncoder.default(self, o)
diff --git a/service-resource-manager-implementation/swagger_server/models/__init__.py b/service-resource-manager-implementation/swagger_server/models/__init__.py
new file mode 100644
index 0000000..9bba2f8
--- /dev/null
+++ b/service-resource-manager-implementation/swagger_server/models/__init__.py
@@ -0,0 +1,4 @@
+# coding: utf-8
+
+# flake8: noqa
+from __future__ import absolute_import
diff --git a/service-resource-manager-implementation/swagger_server/models/artifact_exists_model.py b/service-resource-manager-implementation/swagger_server/models/artifact_exists_model.py
new file mode 100644
index 0000000..2ba0a1d
--- /dev/null
+++ b/service-resource-manager-implementation/swagger_server/models/artifact_exists_model.py
@@ -0,0 +1,139 @@
+from __future__ import absolute_import
+from datetime import date, datetime # noqa: F401
+from typing import List, Dict
+
+from swagger_server.models.base_model_ import Model
+from swagger_server import util
+
+class ArtifactExistsModel(Model):
+
+ def __init__(self, registry_url : str, image_name: str, image_tag: str=None, username: str=None, password: str=None):
+
+ self.swagger_types = {
+ 'registry_url': str,
+ 'image_name': str,
+ 'image_tag': str,
+ 'username': str,
+ 'password': str
+ }
+
+ self.attribute_map = {
+ 'registry_url': 'registry_url',
+ 'image_name': 'image_name',
+ 'image_tag': 'image_tag',
+ 'username': 'username',
+ 'password': 'password'
+ }
+ self._registry_url = registry_url
+ self._image_name = image_name
+ self._image_tag = image_tag
+ self._username = username
+ self._password = password
+
+
+ @classmethod
+ def from_dict(cls, dikt) -> 'ArtifactExistsModel':
+ """Returns the dict as a model
+
+ :param dikt: A dict.
+ :type: dict
+ :return: The CopyArtifactModel. # noqa: E501
+ :rtype: CopyArtifactModel
+ """
+ return util.deserialize_model(dikt, cls)
+
+ @property
+ def registry_url(self) -> str:
+ """Gets the registry_url of this ArtifactExistsModel.
+
+ :return: The registry_url of this ArtifactExistsModel.
+ :rtype: str
+ """
+ return self._registry_url
+
+ @registry_url.setter
+ def registry_url(self, registry_url: str):
+ """Sets the registry_url of this ArtifactExistsModel.
+
+ :param name: The registry_url of this ArtifactExistsModel.
+ :type name: str
+ """
+
+ self._registry_url = registry_url
+
+
+ @property
+ def image_name(self) -> str:
+ """Gets the image_name of this ArtifactExistsModel.
+
+ :return: The image_name of this ArtifactExistsModel.
+ :rtype: str
+ """
+ return self._image_name
+
+ @image_name.setter
+ def image_name(self, image_name: str):
+ """Sets the image_name of this ArtifactExistsModel.
+
+ :param name: The image_name of this ArtifactExistsModel.
+ :type name: str
+ """
+
+ self._image_name = image_name
+
+ @property
+ def image_tag(self) -> str:
+ """Gets the image_tag of this ArtifactExistsModel.
+
+ :return: The image_tag of this ArtifactExistsModel.
+ :rtype: str
+ """
+ return self._image_tag
+
+ @image_tag.setter
+ def image_tag(self, image_tag: str):
+ """Sets the image_tag of this ArtifactExistsModel.
+
+ :param name: The image_tag of this ArtifactExistsModel.
+ :type name: str
+ """
+
+ self._image_tag = image_tag
+
+ @property
+ def username(self) -> str:
+ """Gets the username of this ArtifactExistsModel.
+
+ :return: The username of this ArtifactExistsModel.
+ :rtype: str
+ """
+ return self._username
+
+ @username.setter
+ def username(self, username: str):
+ """Sets the username of this ArtifactExistsModel.
+
+ :param name: The username of this ArtifactExistsModel.
+ :type name: str
+ """
+
+ self._username = username
+
+ @property
+ def password(self) -> str:
+ """Gets the password of this ArtifactExistsModel.
+
+ :return: The password of this ArtifactExistsModel.
+ :rtype: str
+ """
+ return self._password
+
+ @password.setter
+ def password(self, password: str):
+ """Sets the password of this ArtifactExistsModel.
+
+ :param name: The password of this ArtifactExistsModel.
+ :type name: str
+ """
+
+ self._password = password
\ No newline at end of file
diff --git a/service-resource-manager-implementation/swagger_server/models/base_model_.py b/service-resource-manager-implementation/swagger_server/models/base_model_.py
new file mode 100644
index 0000000..97999c3
--- /dev/null
+++ b/service-resource-manager-implementation/swagger_server/models/base_model_.py
@@ -0,0 +1,69 @@
+import pprint
+
+import six
+import typing
+
+from swagger_server import util
+
+T = typing.TypeVar('T')
+
+
+class Model(object):
+ # swaggerTypes: The key is attribute name and the
+ # value is attribute type.
+ swagger_types = {}
+
+ # attributeMap: The key is attribute name and the
+ # value is json key in definition.
+ attribute_map = {}
+
+ @classmethod
+ def from_dict(cls: typing.Type[T], dikt) -> T:
+ """Returns the dict as a model"""
+ return util.deserialize_model(dikt, cls)
+
+ def to_dict(self):
+ """Returns the model properties as a dict
+
+ :rtype: dict
+ """
+ result = {}
+
+ for attr, _ in six.iteritems(self.swagger_types):
+ value = getattr(self, attr)
+ if isinstance(value, list):
+ result[attr] = list(map(
+ lambda x: x.to_dict() if hasattr(x, "to_dict") else x,
+ value
+ ))
+ elif hasattr(value, "to_dict"):
+ result[attr] = value.to_dict()
+ elif isinstance(value, dict):
+ result[attr] = dict(map(
+ lambda item: (item[0], item[1].to_dict())
+ if hasattr(item[1], "to_dict") else item,
+ value.items()
+ ))
+ else:
+ result[attr] = value
+
+ return result
+
+ def to_str(self):
+ """Returns the string representation of the model
+
+ :rtype: str
+ """
+ return pprint.pformat(self.to_dict())
+
+ def __repr__(self):
+ """For `print` and `pprint`"""
+ return self.to_str()
+
+ def __eq__(self, other):
+ """Returns true if both objects are equal"""
+ return self.__dict__ == other.__dict__
+
+ def __ne__(self, other):
+ """Returns true if both objects are not equal"""
+ return not self == other
diff --git a/service-resource-manager-implementation/swagger_server/models/copy_artifact_model.py b/service-resource-manager-implementation/swagger_server/models/copy_artifact_model.py
new file mode 100644
index 0000000..df40708
--- /dev/null
+++ b/service-resource-manager-implementation/swagger_server/models/copy_artifact_model.py
@@ -0,0 +1,250 @@
+from __future__ import absolute_import
+from datetime import date, datetime # noqa: F401
+from typing import List, Dict
+
+from swagger_server.models.base_model_ import Model
+from swagger_server import util
+
+class CopyArtifactModel(Model):
+
+ def __init__(self, src_registry: str, src_image_name: str, src_image_tag: str, dst_registry: str, dst_image_name: str=None, dst_image_tag: str=None, src_username: str=None,
+ src_password: str=None, dst_username:str=None, dst_password: str=None):
+
+ self.swagger_types = {
+ 'src_registry': str,
+ 'src_image_name': str,
+ 'src_image_tag': str,
+ 'dst_registry': str,
+ 'dst_image_name': str,
+ 'dst_image_tag': str,
+ 'src_username': str,
+ 'src_password': str,
+ 'dst_username': str,
+ 'dst_password': str
+ }
+
+ self.attribute_map = {
+ 'src_registry': 'src_registry',
+ 'src_image_name': 'src_image_name',
+ 'src_image_tag': 'src_image_tag',
+ 'dst_registry': 'dst_registry',
+ 'dst_image_name': 'dst_image_name',
+ 'dst_image_tag': 'dst_image_tag',
+ 'src_username': 'src_username',
+ 'src_password': 'src_password',
+ 'dst_username': 'dst_username',
+ 'dst_password': 'dst_password'
+ }
+ self._src_registry = src_registry
+ self._src_image_name = src_image_name
+ self._src_image_tag = src_image_tag
+ self._dst_registry = dst_registry
+ self._dst_image_name = dst_image_name
+ self._dst_image_tag = dst_image_tag
+ self._src_username=src_username
+ self._src_password=src_password
+ self._dst_username=dst_username
+ self._dst_password=dst_password
+
+ @classmethod
+ def from_dict(cls, dikt) -> 'CopyArtifactModel':
+ """Returns the dict as a model
+
+ :param dikt: A dict.
+ :type: dict
+ :return: The CopyArtifactModel. # noqa: E501
+ :rtype: CopyArtifactModel
+ """
+ return util.deserialize_model(dikt, cls)
+
+ @property
+ def src_registry(self) -> str:
+ """Gets the src_registry of this CopyArtifactModel.
+
+ :return: The src_registry of this CopyArtifactModel.
+ :rtype: str
+ """
+ return self._src_registry
+
+ @src_registry.setter
+ def src_registry(self, src_registry: str):
+ """Sets the src_registry of this CopyArtifactModel.
+
+ :param name: The src_registry of this CopyArtifactModel.
+ :type name: str
+ """
+
+ self._src_registry = src_registry
+
+
+ @property
+ def src_image_name(self) -> str:
+ """Gets the _src_image_name of this CopyArtifactModel.
+
+ :return: The _src_image_name of this CopyArtifactModel.
+ :rtype: str
+ """
+ return self._src_image_name
+
+ @src_image_name.setter
+ def src_image_name(self, src_image_name: str):
+ """Sets the src_image_name of this CopyArtifactModel.
+
+ :param name: The src_image_name of this CopyArtifactModel.
+ :type name: str
+ """
+
+ self._src_image_name = src_image_name
+
+ @property
+ def src_image_tag(self) -> str:
+ """Gets the src_image_tag of this CopyArtifactModel.
+
+ :return: The src_image_tag of this CopyArtifactModel.
+ :rtype: str
+ """
+ return self._src_image_tag
+
+ @src_image_tag.setter
+ def src_image_tag(self, src_image_tag: str):
+ """Sets the src_image_tag of this CopyArtifactModel.
+
+ :param name: The src_image_tag of this CopyArtifactModel.
+ :type name: str
+ """
+
+ self._src_image_tag = src_image_tag
+
+ @property
+ def dst_registry(self) -> str:
+ """Gets the dst_registry of this CopyArtifactModel.
+
+ :return: The dst_registry of this CopyArtifactModel.
+ :rtype: str
+ """
+ return self._dst_registry
+
+ @dst_registry.setter
+ def dst_registry(self, dst_registry: str):
+ """Sets the dst_registry of this CopyArtifactModel.
+
+ :param name: The dst_registry of this CopyArtifactModel.
+ :type name: str
+ """
+
+ self._dst_registry = dst_registry
+
+ @property
+ def dst_image_name(self) -> str:
+ """Gets the dst_image_name of this CopyArtifactModel.
+
+ :return: The dst_image_name of this CopyArtifactModel.
+ :rtype: str
+ """
+ return self._dst_image_name
+
+ @dst_image_name.setter
+ def dst_image_name(self, dst_image_name: str):
+ """Sets the dst_image_name of this CopyArtifactModel.
+
+ :param name: The dst_image_name of this CopyArtifactModel.
+ :type name: str
+ """
+
+ self._dst_image_name = dst_image_name
+
+
+ @property
+ def dst_image_tag(self) -> str:
+ """Gets the dst_image_tag of this CopyArtifactModel.
+
+ :return: The dst_image_tag of this CopyArtifactModel.
+ :rtype: str
+ """
+ return self._dst_image_tag
+
+ @dst_image_tag.setter
+ def dst_image_tag(self, dst_image_tag: str):
+ """Sets the dst_image_tag of this CopyArtifactModel.
+
+ :param name: The dst_image_tag of this CopyArtifactModel.
+ :type name: str
+ """
+
+ self._dst_image_tag = dst_image_tag
+
+ @property
+ def src_username(self) -> str:
+ """Gets the src_username of this CopyArtifactModel.
+
+ :return: The src_username of this CopyArtifactModel.
+ :rtype: str
+ """
+ return self._src_username
+
+ @src_username.setter
+ def src_username(self, src_username: str):
+ """Sets the src_username of this CopyArtifactModel.
+
+ :param name: The src_username of this CopyArtifactModel.
+ :type name: str
+ """
+
+ self._src_username = src_username
+
+ @property
+ def src_password(self) -> str:
+ """Gets the src_password of this CopyArtifactModel.
+
+ :return: The src_password of this CopyArtifactModel.
+ :rtype: str
+ """
+ return self._src_password
+
+ @src_password.setter
+ def src_password(self, src_password: str):
+ """Sets the src_password of this CopyArtifactModel.
+
+ :param name: The src_password of this CopyArtifactModel.
+ :type name: str
+ """
+
+ self._src_password = src_password
+
+ @property
+ def dst_username(self) -> str:
+ """Gets the dst_username of this CopyArtifactModel.
+
+ :return: The dst_username of this CopyArtifactModel.
+ :rtype: str
+ """
+ return self._dst_username
+
+ @dst_username.setter
+ def dst_username(self, dst_username: str):
+ """Sets the dst_username of this CopyArtifactModel.
+
+ :param name: The dst_username of this CopyArtifactModel.
+ :type name: str
+ """
+
+ self._dst_username = dst_username
+
+ @property
+ def dst_password(self) -> str:
+ """Gets the dst_password of this CopyArtifactModel.
+
+ :return: The dst_password of this CopyArtifactModel.
+ :rtype: str
+ """
+ return self._dst_password
+
+ @dst_password.setter
+ def dst_password(self, dst_password: str):
+ """Sets the dst_password of this CopyArtifactModel.
+
+ :param name: The dst_password of this CopyArtifactModel.
+ :type name: str
+ """
+
+ self._dst_password = dst_password
\ No newline at end of file
diff --git a/service-resource-manager-implementation/swagger_server/properties.conf b/service-resource-manager-implementation/swagger_server/properties.conf
new file mode 100644
index 0000000..cf9e4dc
--- /dev/null
+++ b/service-resource-manager-implementation/swagger_server/properties.conf
@@ -0,0 +1,5 @@
+driver=docker
+
+#docker
+DOCKER_HOST=146.124.106.177
+DOCKER_PORT=2377
\ No newline at end of file
diff --git a/service-resource-manager-implementation/swagger_server/services/artifact_service.py b/service-resource-manager-implementation/swagger_server/services/artifact_service.py
new file mode 100644
index 0000000..406dbbf
--- /dev/null
+++ b/service-resource-manager-implementation/swagger_server/services/artifact_service.py
@@ -0,0 +1,20 @@
+import logging
+import requests
+import os
+import json
+
+artifact_manager_ip = os.environ['ARTIFACT_MANAGER_ADDRESS']
+
+def artifact_exists(body):
+ logging.info('Contacting Artifact Manager')
+ body = json.dumps(body)
+ headers = {'Content-Type': 'application/json'}
+ response = requests.post('http://'+artifact_manager_ip+'/artefact-exists/', headers=headers, json=body)
+ return response
+
+def copy_artifact(body):
+ logging.info('Submitting artifact to Artifact Manager')
+ body = json.dumps(body)
+ headers = {'Content-Type': 'application/json'}
+ response = requests.post('http://'+artifact_manager_ip+'/copy-artefact', headers=headers, json=body)
+ return response
\ No newline at end of file
diff --git a/service-resource-manager-implementation/swagger_server/services/edge_cloud_service.py b/service-resource-manager-implementation/swagger_server/services/edge_cloud_service.py
new file mode 100644
index 0000000..75d01ce
--- /dev/null
+++ b/service-resource-manager-implementation/swagger_server/services/edge_cloud_service.py
@@ -0,0 +1,58 @@
+from __future__ import absolute_import
+import logging
+from os import environ
+import requests
+import json
+from adapters.edgecloud.clients import aeros, i2edge, eurecom_platform, piedge, isi_platform
+
+
+logger = logging.getLogger(__name__)
+logging.basicConfig(level=logging.DEBUG)
+
+adapter_name = environ['ADAPTER_NAME']
+adapter_ip = environ['K8S_ADAPTER_ADDRESS']
+edge_cloud_provider = environ['PLATFORM_PROVIDER']
+adapter = None
+
+if adapter_name=='aeros':
+ from adapters.edgecloud.clients.aeros.client import EdgeApplicationManager
+ adapter = EdgeApplicationManager()
+elif adapter_name=='i2edge':
+ from adapters.edgecloud.clients.i2edge.client import EdgeApplicationManager
+ adapter = EdgeApplicationManager()
+elif adapter_name=='eurecom_platform':
+ from adapters.edgecloud.clients.eurecom_platform.client import EdgeApplicationManager
+ adapter = EdgeApplicationManager()
+elif adapter_name=='piedge':
+ from adapters.edgecloud.clients.piedge.client import EdgeApplicationManager
+ adapter = EdgeApplicationManager()
+
+
+def get_nodes():
+ zone_list = None
+ return zone_list
+
+def submit_helm_chart(body):
+ logger.info('Contacting Kubernetes adapter at '+adapter_ip)
+ headers = {'Content-type': 'application/json'}
+ data = json.dumps(body)
+ helm_response = requests.post('http://'+adapter_ip+'/piedge-connector/2.0.0/helm', data=data, headers=headers)
+ return helm_response
+
+# def app_instance_deploy(body):
+# logger.info('Contacting Kubernetes adapter at '+adapter_ip)
+# headers = {'Content-type': 'application/json'}
+# data = json.dumps(body)
+# app_response = requests.post('http://'+adapter_ip+'/piedge-connector/2.0.0/deployedServiceFunction', json=body)
+# return app_response
+
+def app_instance_info(id: str):
+ logger.info('Contacting Kubernetes adapter at '+adapter_ip)
+ headers = {'Content-type': 'application/json'}
+ app_info_response = requests.get('http://'+adapter_ip+'/piedge-connector/2.0.0/deployedServiceFunction/'+id)
+ return app_info_response
+
+def delete_app_instance(id: str):
+ logger.info('Deleting app with instance id: ['+id+']')
+ delete_app_response = requests.delete('http://'+adapter_ip+'/piedge-connector/2.0.0/deployedServiceFunction/'+id)
+ return delete_app_response
\ No newline at end of file
diff --git a/service-resource-manager-implementation/swagger_server/services/network_function_service.py b/service-resource-manager-implementation/swagger_server/services/network_function_service.py
new file mode 100644
index 0000000..e69de29
diff --git a/service-resource-manager-implementation/swagger_server/swagger/swagger.yaml b/service-resource-manager-implementation/swagger_server/swagger/swagger.yaml
new file mode 100644
index 0000000..cf33394
--- /dev/null
+++ b/service-resource-manager-implementation/swagger_server/swagger/swagger.yaml
@@ -0,0 +1,159 @@
+openapi: 3.0.0
+info:
+ title: Service Resource Manager
+ description: |
+ API exposed by SRM for testbed resource acquisition
+ termsOfService: http://swagger.io/terms/
+ contact:
+ email: dlaskaratos@intracom-telecom.com
+ license:
+ name: Apache 2.0
+ url: http://www.apache.org/licenses/LICENSE-2.0.html
+ version: 2.0.0
+externalDocs:
+ description: Find out more about Swagger
+ url: http://swagger.io
+servers:
+- url: http://virtualserver:8080/0.0.1
+paths:
+ /edge-nodes:
+ get:
+ tags:
+ - Availability zones
+ summary: Retrieve Edge Platform nodes
+ operationId: get_edge_platform_nodes
+ responses:
+ "200":
+ description: List of nodes
+ x-openapi-router-controller: swagger_server.controllers.nodes_controller
+ /appinstances:
+ post:
+ tags:
+ - App Instances
+ summary: Installs a helm chart on the edge cloud platform
+ operationId: deploy_app
+ requestBody:
+ description: Request to install a helm chart
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/HelmChartInstall'
+ responses:
+ "200":
+ description: Helm chart sucessfully installed
+ "400":
+ description: Necessary fields missing
+ x-openapi-router-controller: swagger_server.controllers.app_instance_controller
+ get:
+ tags:
+ - App Instances
+ summary: Instantiates an application specification
+ operationId: get_app_instances
+ responses:
+ "200":
+ description: App instances successfully retrieved
+ x-openapi-router-controller: swagger_server.controllers.app_instance_controller
+ /copy-artifact:
+ post:
+ tags:
+ - Artifact Management
+ summary: Copies artifact from source repository to destination repository
+ requestBody:
+ description: Artifact details including image name, tag, source repository username and password tec
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/CopyArtifactModel'
+ responses:
+ "200":
+ description: Artifact successfully copied
+ "400":
+ description: Mandatory fields missing
+ x-openapi-router-controller: swagger_server.controllers.artifact_controller
+ /artifact-exists:
+ post:
+ tags:
+ - Artifact Management
+ summary: Check if artifact exists in given repository
+ requestBody:
+ description: Artifact details including image name, tag, source repository username and password tec
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/ArtifactExistsModel'
+ responses:
+ "200":
+ description: Artifact exists
+ "404":
+ description: Artifact does not exist
+ "400":
+ description: Mandatory fields missing
+ x-openapi-router-controller: swagger_server.controllers.artifact_controller
+components:
+ schemas:
+ HelmChartInstall:
+ type: object
+ properties:
+ uri:
+ type: string
+ example: http://helm.chart.net/helm.yaml
+ deployment_name:
+ type: string
+ example: test_helm
+ repo_username:
+ type: string
+ example: test1
+ repo_password:
+ type: string
+ example: test1
+ CopyArtifactModel:
+ type: object
+ properties:
+ src_registry:
+ type: string
+ example: http://dockerhub.io
+ src_image_name:
+ type: string
+ example: mongodb
+ src_image_tag:
+ type: string
+ example: latest
+ dst_registry:
+ type: string
+ example: http://dockerhub.io
+ dst_image_name:
+ type: string
+ example: mongodb
+ dst_image_tag:
+ type: string
+ example: latest
+ src_username:
+ type: string
+ example: user123
+ src_password:
+ type: string
+ example: 1234
+ dst_username:
+ type: string
+ example: user123
+ dst_password:
+ type: string
+ example: 1234
+ ArtifactExistsModel:
+ type: object
+ properties:
+ registry_url:
+ type: string
+ example: http://dockerhub.io
+ image_name:
+ type: string
+ example: mongodb
+ image_tag:
+ type: string
+ example: latest
+ username:
+ type: string
+ example: user123
+ password:
+ type: string
+ example: 1234
\ No newline at end of file
diff --git a/service-resource-manager-implementation/swagger_server/type_util.py b/service-resource-manager-implementation/swagger_server/type_util.py
new file mode 100644
index 0000000..0563f81
--- /dev/null
+++ b/service-resource-manager-implementation/swagger_server/type_util.py
@@ -0,0 +1,32 @@
+# coding: utf-8
+
+import sys
+
+if sys.version_info < (3, 7):
+ import typing
+
+ def is_generic(klass):
+ """ Determine whether klass is a generic class """
+ return type(klass) == typing.GenericMeta
+
+ def is_dict(klass):
+ """ Determine whether klass is a Dict """
+ return klass.__extra__ == dict
+
+ def is_list(klass):
+ """ Determine whether klass is a List """
+ return klass.__extra__ == list
+
+else:
+
+ def is_generic(klass):
+ """ Determine whether klass is a generic class """
+ return hasattr(klass, '__origin__')
+
+ def is_dict(klass):
+ """ Determine whether klass is a Dict """
+ return klass.__origin__ == dict
+
+ def is_list(klass):
+ """ Determine whether klass is a List """
+ return klass.__origin__ == list
diff --git a/service-resource-manager-implementation/swagger_server/util.py b/service-resource-manager-implementation/swagger_server/util.py
new file mode 100644
index 0000000..812b2ad
--- /dev/null
+++ b/service-resource-manager-implementation/swagger_server/util.py
@@ -0,0 +1,142 @@
+import datetime
+
+import six
+import typing
+from swagger_server import type_util
+
+
+def _deserialize(data, klass):
+ """Deserializes dict, list, str into an object.
+
+ :param data: dict, list or str.
+ :param klass: class literal, or string of class name.
+
+ :return: object.
+ """
+ if data is None:
+ return None
+
+ if klass in six.integer_types or klass in (float, str, bool, bytearray):
+ return _deserialize_primitive(data, klass)
+ elif klass == object:
+ return _deserialize_object(data)
+ elif klass == datetime.date:
+ return deserialize_date(data)
+ elif klass == datetime.datetime:
+ return deserialize_datetime(data)
+ elif type_util.is_generic(klass):
+ if type_util.is_list(klass):
+ return _deserialize_list(data, klass.__args__[0])
+ if type_util.is_dict(klass):
+ return _deserialize_dict(data, klass.__args__[1])
+ else:
+ return deserialize_model(data, klass)
+
+
+def _deserialize_primitive(data, klass):
+ """Deserializes to primitive type.
+
+ :param data: data to deserialize.
+ :param klass: class literal.
+
+ :return: int, long, float, str, bool.
+ :rtype: int | long | float | str | bool
+ """
+ try:
+ value = klass(data)
+ except UnicodeEncodeError:
+ value = six.u(data)
+ except TypeError:
+ value = data
+ return value
+
+
+def _deserialize_object(value):
+ """Return an original value.
+
+ :return: object.
+ """
+ return value
+
+
+def deserialize_date(string):
+ """Deserializes string to date.
+
+ :param string: str.
+ :type string: str
+ :return: date.
+ :rtype: date
+ """
+ try:
+ from dateutil.parser import parse
+ return parse(string).date()
+ except ImportError:
+ return string
+
+
+def deserialize_datetime(string):
+ """Deserializes string to datetime.
+
+ The string should be in iso8601 datetime format.
+
+ :param string: str.
+ :type string: str
+ :return: datetime.
+ :rtype: datetime
+ """
+ try:
+ from dateutil.parser import parse
+ return parse(string)
+ except ImportError:
+ return string
+
+
+def deserialize_model(data, klass):
+ """Deserializes list or dict to model.
+
+ :param data: dict, list.
+ :type data: dict | list
+ :param klass: class literal.
+ :return: model object.
+ """
+ instance = klass()
+
+ if not instance.swagger_types:
+ return data
+
+ for attr, attr_type in six.iteritems(instance.swagger_types):
+ if data is not None \
+ and instance.attribute_map[attr] in data \
+ and isinstance(data, (list, dict)):
+ value = data[instance.attribute_map[attr]]
+ setattr(instance, attr, _deserialize(value, attr_type))
+
+ return instance
+
+
+def _deserialize_list(data, boxed_type):
+ """Deserializes a list and its elements.
+
+ :param data: list to deserialize.
+ :type data: list
+ :param boxed_type: class literal.
+
+ :return: deserialized list.
+ :rtype: list
+ """
+ return [_deserialize(sub_data, boxed_type)
+ for sub_data in data]
+
+
+def _deserialize_dict(data, boxed_type):
+ """Deserializes a dict and its elements.
+
+ :param data: dict to deserialize.
+ :type data: dict
+ :param boxed_type: class literal.
+
+ :return: deserialized dict.
+ :rtype: dict
+ """
+ return {k: _deserialize(v, boxed_type)
+ for k, v in six.iteritems(data)}
diff --git a/service-resource-manager-implementation/swagger_server/utils/__init__.py b/service-resource-manager-implementation/swagger_server/utils/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/service-resource-manager-implementation/swagger_server/utils/connector_db.py b/service-resource-manager-implementation/swagger_server/utils/connector_db.py
new file mode 100644
index 0000000..a500a41
--- /dev/null
+++ b/service-resource-manager-implementation/swagger_server/utils/connector_db.py
@@ -0,0 +1,172 @@
+import json
+import string
+
+import yaml
+import pymongo
+import logging
+from bson import json_util
+from typing import List
+
+from os import environ
+
+storage_url=environ.get("EMP_STORAGE_URI").strip()
+
+mydb_mongo='pi-edge'
+
+def insert_document_k8s_platform(document=None, _id=None):
+ collection = "kubernetes_platforms"
+ myclient = pymongo.MongoClient(storage_url)
+ mydbmongo = myclient[mydb_mongo]
+ mycol = mydbmongo[collection]
+
+ myquery = {"name": document["kubernetes_platform_name"]}
+ mydoc = mycol.find_one(myquery)
+ # keeps the last record (contains registrationStatus)
+ if mydoc is not None:
+ raise Exception("Already Registered: Platform name", document["kubernetes_platform_name"])
+ try:
+ insert_doc={}
+ insert_doc["name"]=document["kubernetes_platform_name"]
+ insert_doc["auth_credentials"]=document["kubernetes_auth_credentials"]
+ mycol.insert_one(insert_doc)
+ except Exception as ce_:
+ raise Exception("An exception occurred :", ce_)
+
+def insert_document_deployed_service_function(document=None, _id=None):
+
+ collection = "deployed_service_functions"
+ myclient = pymongo.MongoClient(storage_url)
+ mydbmongo = myclient[mydb_mongo]
+ mycol = mydbmongo[collection]
+
+ myquery = {"name": document["service_function_name"], "location": document["location"], "instance_name":document["instance_name"]}
+ mydoc = mycol.find_one(myquery)
+ # keeps the last record (contains registrationStatus)
+ if mydoc is not None:
+ return "Requested service function (with this name) already deployed and exists in deployed_apps database"
+ #raise Exception("Already Registered: PaaS name", document["paas_name"])
+ try:
+ insert_doc = {}
+
+ insert_doc["name"] = document["service_function_name"]
+ #insert_doc["type"] = document["paas_type"]
+ insert_doc["location"] = document["location"]
+ insert_doc["instance_name"] = document["instance_name"]
+
+ # if "env_parameters" in document:
+ # insert_doc["env_parameters"] = document["env_parameters"]
+
+ mycol.insert_one(insert_doc)
+ return "Deployed service function registered successfully"
+ except Exception as ce_:
+ raise Exception("An exception occurred :", ce_)
+
+
+def delete_document_deployed_service_functions(document=None, _id=None):
+ collection = "deployed_service_functions"
+ myclient = pymongo.MongoClient(storage_url)
+ mydbmongo = myclient[mydb_mongo]
+ mycol = mydbmongo[collection]
+
+ myquery = {"instance_name": document["instance_name"]}
+ mydoc = mycol.find_one(myquery)
+
+ # keeps the last record (contains registrationStatus)
+ if mydoc is None:
+ return "Deployed Service function not found in the database"
+ #raise Exception("Not found: PaaS name", document["paas_name"])
+ try:
+ delete_doc = {}
+ delete_doc["instance_name"] = document["instance_name"]
+ mycol.delete_one(delete_doc)
+ return "Deployed Service function deleted successfully"
+ except Exception as ce_:
+ raise Exception("An exception occurred :", ce_)
+
+
+def insert_document_service_function(document=None, _id=None):
+ #print(document)
+ collection = "service_functions"
+ myclient = pymongo.MongoClient(storage_url)
+ mydbmongo = myclient[mydb_mongo]
+ mycol = mydbmongo[collection]
+
+ myquery = {"name": document["service_function_name"]}
+ mydoc = mycol.find_one(myquery)
+
+ if mydoc is not None:
+ return "Service function already exists in the catalogue"
+
+ insert_doc = {}
+ insert_doc["name"] = document["service_function_name"]
+ insert_doc["type"] = document["service_function_type"]
+ insert_doc["image"] = document["service_function_image"]
+ insert_doc["application_ports"] = document["application_ports"]
+
+ if "required_volumes" in document:
+ insert_doc["required_volumes"] = document["required_volumes"]
+
+ insert_doc["required_env_parameters"] = document["required_env_parameters"]
+ mycol.insert_one(insert_doc)
+ return "Service function registered successfully"
+
+
+def insert_document_paas(document=None, _id=None):
+
+ collection = "paas_services"
+ myclient = pymongo.MongoClient(storage_url)
+ mydbmongo = myclient[mydb_mongo]
+ mycol = mydbmongo[collection]
+
+ myquery = {"name": document["name"]}
+ mydoc = mycol.find_one(myquery)
+
+ if mydoc is not None:
+ return "PaaS Service already exists in the catalogue"
+ try:
+ mycol.insert_one(document)
+ return "PaaS Service registered successfully"
+ except Exception as ce_:
+ raise Exception("An exception occurred :", ce_)
+
+def delete_document_service_function(service_function_input_name=None, _id=None):
+
+
+ collection = "service_functions"
+ myclient = pymongo.MongoClient(storage_url)
+ mydbmongo = myclient[mydb_mongo]
+ mycol = mydbmongo[collection]
+
+ myquery = {"name": service_function_input_name}
+ mydoc = mycol.find_one(myquery)
+
+ if mydoc is None:
+ return "Service function not found in the database"
+ try:
+ delete_doc = {}
+ delete_doc["name"] = service_function_input_name
+ mycol.delete_one(delete_doc)
+ return "Service function deregistered successfully"
+ except Exception as ce_:
+ raise Exception("An exception occurred :", ce_)
+
+def get_documents_from_collection(collection_input, input_type=None, input_value=None) -> List[dict]:
+ collection = collection_input
+ myclient = pymongo.MongoClient(storage_url)
+ mydbmongo = myclient[mydb_mongo]
+ mycol = mydbmongo[collection]
+
+ try:
+ mydoc_=[]
+ for x in mycol.find():
+ x['_id']=str(x['_id'])
+ if input_type is not None:
+ if input_value==x[input_type]:
+ mydoc_.append(x)
+ break
+ else:
+ mydoc_.append(x)
+
+ return mydoc_
+ except Exception as ce_:
+ raise Exception("An exception occurred :", ce_)
diff --git a/service-resource-manager-implementation/test b/service-resource-manager-implementation/test
new file mode 100644
index 0000000..e69de29
diff --git a/service-resource-manager-implementation/tox.ini b/service-resource-manager-implementation/tox.ini
new file mode 100644
index 0000000..41ab7b0
--- /dev/null
+++ b/service-resource-manager-implementation/tox.ini
@@ -0,0 +1,17 @@
+[tox]
+envlist = py35
+
+[testenv]
+deps=-r{toxinidir}/requirements.txt
+ -r{toxinidir}/test-requirements.txt
+changedir = tests
+
+;
+;commands=
+; nosetests \
+; []
+
+
+commands=
+ nosetests \
+ []
\ No newline at end of file
diff --git a/srm-deployment.yaml b/srm-deployment.yaml
new file mode 100644
index 0000000..d2c9682
--- /dev/null
+++ b/srm-deployment.yaml
@@ -0,0 +1,181 @@
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+ annotations:
+ kompose.cmd: kompose convert
+ kompose.version: 1.26.0 (40646f47)
+ creationTimestamp: null
+ labels:
+ io.kompose.service: piedgecontroller
+ name: piedgecontroller
+spec:
+ replicas: 1
+ selector:
+ matchLabels:
+ io.kompose.service: piedgecontroller
+ strategy: {}
+ template:
+ metadata:
+ annotations:
+ kompose.cmd: kompose convert
+ kompose.version: 1.26.0 (40646f47)
+ creationTimestamp: null
+ labels:
+ #io.kompose.network/netEMPkub: "true"
+ io.kompose.service: piedgecontroller
+ spec:
+ containers:
+ - env:
+ - name: KUBERNETES_MASTER_HOSTNAME
+ value: "sunrise6gsrv"
+ - name: KUBERNETES_MASTER_PASSWORD
+ value: "dLask"
+ - name: KUBERNETES_MASTER_IP
+ value: "146.124.106.229"
+ - name: KUBERNETES_MASTER_PORT
+ value: "16443"
+ - name: KUBE_CONFIG_PATH
+ value: "kubeconfig/config.yaml"
+ - name: EMP_STORAGE_URI
+ value: mongodb://mongopiedge:27017
+ - name: KUBERNETES_MASTER_TOKEN
+ value: TVVGV1FJb3l0alNUOUdEeVRvbnZKdGhZS3FXUXg2aG5mMGVxekRqRnZhWT0K
+ - name: MONITORING_SERVICE_PASSWORD
+ value: "tandem"
+ - name: MEC_PLATFORM_IP
+ value: "146.124.106.209"
+ - name: MEC_PLATFORM_PORT
+ value: "32500"
+ - name: MONITORING_IP_PROXY
+ value: "146.124.106.220"
+ - name: MONITORING_PORT_PROXY
+ value: "31000"
+ - name: MONITORING_IP
+ value: "146.124.106.209"
+ - name: MONITORING_NODE_PORT
+ value: "443"
+ - name: DRIVER
+ value: "kubernetes"
+ - name: ARTIFACT_MANAGER_ADDRESS
+ value: "artifact-manager"
+
+ image: piedge/pi_edge:ectf
+ name: piedgecontroller
+ ports:
+ - containerPort: 8080
+ resources: {}
+ imagePullPolicy: Always
+ restartPolicy: Always
+status: {}
+---
+apiVersion: v1
+kind: Service
+metadata:
+ annotations:
+ kompose.cmd: kompose convert
+ kompose.version: 1.26.0 (40646f47)
+ creationTimestamp: null
+ labels:
+ io.kompose.service: piedgecontroller
+ name: piedgecontroller
+spec:
+ type: NodePort
+ ports:
+ - name: "8080"
+ nodePort: 32415
+ port: 8080
+ targetPort: 8080
+ selector:
+ io.kompose.service: piedgecontroller
+status:
+ loadBalancer: {}
+
+---
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+ annotations:
+ kompose.cmd: kompose convert
+ kompose.version: 1.26.0 (40646f47)
+ creationTimestamp: null
+ labels:
+ io.kompose.service: service-resource-manager
+ name: service-resource-manager
+spec:
+ replicas: 1
+ selector:
+ matchLabels:
+ io.kompose.service: service-resource-manager
+ strategy: {}
+ template:
+ metadata:
+ annotations:
+ kompose.cmd: kompose convert
+ kompose.version: 1.26.0 (40646f47)
+ creationTimestamp: null
+ labels:
+ #io.kompose.network/netEMPkub: "true"
+ io.kompose.service: service-resource-manager
+ spec:
+ containers:
+ - env:
+ - name: K8S_ADAPTER_ADDRESS
+ value: "piedgecontroller:8080"
+ - name: PLATFORM_PROVIDER
+ value: "ICOM"
+
+ image: piedge/pi_edge:srm
+ name: service-resource-manager
+ ports:
+ - containerPort: 8080
+ resources: {}
+ imagePullPolicy: Always
+ restartPolicy: Always
+status: {}
+---
+apiVersion: v1
+kind: Service
+metadata:
+ annotations:
+ kompose.cmd: kompose convert
+ kompose.version: 1.26.0 (40646f47)
+ creationTimestamp: null
+ labels:
+ io.kompose.service: service-resource-manager
+ name: srm
+spec:
+ type: NodePort
+ ports:
+ - name: "8080"
+ nodePort: 32000
+ port: 8080
+ targetPort: 8080
+ selector:
+ io.kompose.service: service-resource-manager
+status:
+ loadBalancer: {}
+---
+apiVersion: networking.k8s.io/v1
+kind: Ingress
+metadata:
+ name: srm-ingress
+ namespace: sunrise
+ annotations:
+ #nginx.ingress.kubernetes.io/use-regex: "true"
+ nginx.ingress.kubernetes.io/rewrite-target: /$2
+ managedFields:
+ - manager: nginx-ingress-controller
+ operation: Update
+ apiVersion: networking.k8s.io/v1
+spec:
+ ingressClassName: nginx
+ rules:
+ - http:
+ paths:
+ - path: /srm(/|$)(.*)
+ pathType: Prefix
+ backend:
+ service:
+ name: srm
+ port:
+ number: 8080
\ No newline at end of file
--
GitLab