Skip to content
Snippets Groups Projects
Commit 582bde82 authored by trantzas's avatar trantzas
Browse files

Merging develop (merged from 2024Q2_RC) into main creating for 2024Q2 Release

parents e9264a1a e74572d8
No related branches found
No related tags found
1 merge request!34Merging develop (merged from 2024Q2_RC) into main creating for 2024Q2 Release
Pipeline #7227 passed
Showing
with 388 additions and 1488 deletions
include:
- ci-templates/default.yml
- local: ci-templates/build.yml
rules:
- if: '$CI_COMMIT_REF_NAME == "main" || $CI_COMMIT_REF_NAME == "develop" || $CI_COMMIT_REF_PROTECTED'
- local: ci-templates/build_unprotected.yml
rules:
- if: '$CI_COMMIT_REF_NAME != "main" && $CI_COMMIT_REF_NAME != "develop" && !$CI_COMMIT_REF_PROTECTED'
maven_build:
extends: .maven_build
Q3 2023 1.2.0-SNAPSHOT
Upgraded to java17 and SpingBoot3
Upgraded from ActiveMQ to Artemis
Upgrade Keycloak to 16
backup your previous database if necessary:
sudo docker exec amysql /usr/bin/mysqldump -u root --password=letmein ostmfdb > backup_ostmfdb.sql
restore your previous database:
cat backup_ostmfdb.sql | docker exec -i amysql /usr/bin/mysql -u root --password=letmein ostmfdb
Q3 2021
- There have been some minor changes in the databases. THerefore some older artifacts might be deleted. Especially RFS relationships
- The CONFIG attribute of RFSs must be renamed to OSM_CONFIG. OSM_CONFIG includes now the json configuration to pass to OSM when creating NSDs
- Edit your docker-compose.yaml and add oasapi section. Edit the oasapi section according to your needs (db password, keycloak etc)
- Edit your /openslice/org.etsi.osl.tmf.web/dist/io-openslice-portal-web/assets/config/config.prod.json with the new API endpoints. Please consult the config.prod.default.json
- Edit nginx.conf to add the new oas-api
.maven_build:
extends: .default
stage: build
image: maven:3.9.5-ibm-semeru-17-focal
script:
- mvn deploy -s ci_settings.xml -Dversion=$APP_VERSION
artifacts:
paths:
- target/
.docker_build:
extends: .default
stage: build
image:
name: gcr.io/kaniko-project/executor:debug
entrypoint: [""]
script:
- /kaniko/executor --context "${CI_PROJECT_DIR}" --dockerfile "${CI_PROJECT_DIR}/Dockerfile" --destination "${CI_REGISTRY_IMAGE}:$APP_VERSION"
- |
if [ "$CI_COMMIT_REF_NAME" = "main" ]; then
echo "Pushing Docker image with tag 'latest'"
/kaniko/executor --context "${CI_PROJECT_DIR}" --dockerfile "${CI_PROJECT_DIR}/Dockerfile" --destination "${CI_REGISTRY_IMAGE}:latest"
fi
.angular_build:
extends: .default
stage: build
image: trion/ng-cli:14.2.6
script:
- |
if [ ! -f "./src/assets/config/theming.scss" ]; then
cp ./src/assets/config/theming.default.scss ./src/assets/config/theming.scss
fi
if [ ! -f "./src/assets/config/config.prod.json" ]; then
cp ./src/assets/config/config.prod.default.json ./src/assets/config/config.prod.json
fi
- npm install
- ng build --configuration production --deleteOutputPath=false
artifacts:
paths:
- dist/
.maven_build:
extends: .default
stage: build
image: maven:3.9.5-ibm-semeru-17-focal
script:
- mvn install -s ci_settings.xml
artifacts:
paths:
- target/
.docker_build:
extends: .default
stage: build
image:
name: gcr.io/kaniko-project/executor:debug
entrypoint: [""]
script:
- /kaniko/executor --context "${CI_PROJECT_DIR}" --dockerfile "${CI_PROJECT_DIR}/Dockerfile" --destination "${CI_REGISTRY_IMAGE}:$APP_VERSION" --no-push
.angular_build:
extends: .default
stage: build
image: trion/ng-cli:14.2.6
script:
- |
if [ ! -f "./src/assets/config/theming.scss" ]; then
cp ./src/assets/config/theming.default.scss ./src/assets/config/theming.scss
fi
if [ ! -f "./src/assets/config/config.prod.json" ]; then
cp ./src/assets/config/config.prod.default.json ./src/assets/config/config.prod.json
fi
- npm install
- ng build --configuration production --deleteOutputPath=false
artifacts:
paths:
- dist/
stages:
- .pre
- build
- test
- post
- security
.default:
before_script:
- |
if [ "$CI_COMMIT_REF_NAME" = "main" ] && [ -n "$CI_COMMIT_TAG" ]; then
export APP_VERSION=$CI_COMMIT_TAG
elif [ "$CI_COMMIT_REF_NAME" = "develop" ]; then
export APP_VERSION="develop"
else
export APP_VERSION=$CI_COMMIT_REF_NAME
fi
<settings xmlns="http://maven.apache.org/SETTINGS/1.1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.1.0 http://maven.apache.org/xsd/settings-1.1.0.xsd">
<servers>
<server>
<id>gitlab-maven</id>
<configuration>
<httpHeaders>
<property>
<name>Job-Token</name>
<value>${CI_JOB_TOKEN}</value>
</property>
</httpHeaders>
</configuration>
</server>
</servers>
</settings>
...@@ -20,28 +20,35 @@ updaterepo(){ ...@@ -20,28 +20,35 @@ updaterepo(){
cd $1/ cd $1/
git checkout $branch git checkout $branch
git pull git pull
# Build maven project if .pom file is present
if [ -f "./pom.xml" ]; then
docker run -it --rm -v "/home/ubuntu/.m2":/root/.m2 -v "$(pwd)":/opt/maven -w /opt/maven maven:3.9.5-ibm-semeru-17-focal mvn clean verify -DskipTests
fi
} }
updaterepo org.etsi.osl.main updaterepo org.etsi.osl.main
updaterepo org.etsi.osl.sol005nbi.osm #updaterepo org.etsi.osl.sol005nbi.osm
updaterepo org.etsi.osl.sol005nbi.osm10 #updaterepo org.etsi.osl.sol005nbi.osm10
updaterepo org.etsi.osl.centrallog.client #updaterepo org.etsi.osl.centrallog.client
updaterepo org.etsi.osl.centrallog.service updaterepo org.etsi.osl.centrallog.service
updaterepo org.etsi.osl.model #updaterepo org.etsi.osl.model.nfv
#updaterepo org.etsi.osl.model.tmf
#updaterepo org.etsi.osl.model.k8s
updaterepo org.etsi.osl.portal.api updaterepo org.etsi.osl.portal.api
updaterepo org.etsi.osl.mano updaterepo org.etsi.osl.mano
updaterepo org.etsi.osl.bugzilla updaterepo org.etsi.osl.bugzilla
updaterepo org.etsi.osl.osom updaterepo org.etsi.osl.osom
updaterepo org.etsi.osl.oas updaterepo org.etsi.osl.oas
updaterepo org.etsi.osl.portal.web
updaterepo org.etsi.osl.tmf.api updaterepo org.etsi.osl.tmf.api
updaterepo org.etsi.osl.tmf.web updaterepo org.etsi.osl.cridge
cd $dirlocation updaterepo org.etsi.osl.tmf.web
docker run -it --rm -v "/home/ubuntu/.m2":/root/.m2 -v "$(pwd)":/opt/maven -w /opt/maven/org.etsi.osl.main maven:3.9.3-ibm-semeru-17-focal mvn clean verify -DskipTests updaterepo org.etsi.osl.portal.web
echo "Build org.etsi.osl.tmf.web"
cd $dirlocation/org.etsi.osl.tmf.web cd $dirlocation/org.etsi.osl.tmf.web
...@@ -52,5 +59,7 @@ if [ ! -f "./src/assets/config/config.prod.json" ]; then ...@@ -52,5 +59,7 @@ if [ ! -f "./src/assets/config/config.prod.json" ]; then
cp ./src/assets/config/config.prod.default.json ./src/assets/config/config.prod.json cp ./src/assets/config/config.prod.default.json ./src/assets/config/config.prod.json
fi fi
docker run -u 0 --rm -v "$PWD":/app trion/ng-cli:14.2.6 npm install echo "Installing npm packages..."
docker run -u 0 --rm -v "$PWD":/app trion/ng-cli:14.2.6 ng build --configuration production --deleteOutputPath=false
docker run -u 0 --rm -v "$PWD":/app trion/ng-cli:13.3.7 npm install
docker run -u 0 --rm -v "$PWD":/app trion/ng-cli:13.3.7 ng build --configuration production --deleteOutputPath=false
...@@ -85,10 +85,11 @@ services: ...@@ -85,10 +85,11 @@ services:
profiles: ["prod"] profiles: ["prod"]
build: build:
context: ../../org.etsi.osl.portal.api/ context: ../../org.etsi.osl.portal.api/
dockerfile: Dockerfile.portalapi dockerfile: Dockerfile
image: org.etsi.osl.portal.api:latest image: labs.etsi.org:5050/osl/code/org.etsi.osl.portal.api:latest
environment: environment:
SPRING_APPLICATION_JSON: '{ SPRING_APPLICATION_JSON: '{
"origins": "http://localhost",
"spring.datasource.url": "jdbc:mysql://amysql/osdb?createDatabaseIfNotExist=true", "spring.datasource.url": "jdbc:mysql://amysql/osdb?createDatabaseIfNotExist=true",
"spring.datasource.username":"root", "spring.datasource.username":"root",
"spring.datasource.password":"letmein", "spring.datasource.password":"letmein",
...@@ -105,9 +106,11 @@ services: ...@@ -105,9 +106,11 @@ services:
"spring.activemq.user": "artemis", "spring.activemq.user": "artemis",
"spring.activemq.password": "artemis", "spring.activemq.password": "artemis",
"logging.level.org.springframework" : "INFO", "logging.level.org.springframework" : "INFO",
"logging.level.org.etsi.osl.portal.api": "INFO",
"spring.portal.main.domain": "http://localhost", "spring.portal.main.domain": "http://localhost",
"spring.portal.portal.title": "Openslice" "spring.portal.portal.title": "Openslice",
}' "server.forward-headers-strategy":"FRAMEWORK"
}'
logging: logging:
driver: "json-file" driver: "json-file"
options: options:
...@@ -130,15 +133,15 @@ services: ...@@ -130,15 +133,15 @@ services:
profiles: ["prod"] profiles: ["prod"]
build: build:
context: ../../org.etsi.osl.mano/ context: ../../org.etsi.osl.mano/
dockerfile: Dockerfile.mano dockerfile: Dockerfile
image: org.etsi.osl.mano:latest image: labs.etsi.org:5050/osl/code/org.etsi.osl.mano:latest
environment: environment:
SPRING_APPLICATION_JSON: '{ SPRING_APPLICATION_JSON: '{
"spring.activemq.brokerUrl": "tcp://anartemis:61616?jms.watchTopicAdvisories=false", "spring.activemq.brokerUrl": "tcp://anartemis:61616?jms.watchTopicAdvisories=false",
"spring.activemq.user": "artemis", "spring.activemq.user": "artemis",
"spring.activemq.password": "artemis", "spring.activemq.password": "artemis",
"logging.level.org.springframework" : "INFO" "logging.level.org.springframework" : "INFO"
}' }'
logging: logging:
driver: "json-file" driver: "json-file"
options: options:
...@@ -156,8 +159,8 @@ services: ...@@ -156,8 +159,8 @@ services:
profiles: ["prod"] profiles: ["prod"]
build: build:
context: ../../org.etsi.osl.bugzilla/ context: ../../org.etsi.osl.bugzilla/
dockerfile: Dockerfile.bugzilla dockerfile: Dockerfile
image: org.etsi.osl.bugzilla:latest image: labs.etsi.org:5050/osl/code/org.etsi.osl.bugzilla:latest
environment: environment:
SPRING_APPLICATION_JSON: '{ SPRING_APPLICATION_JSON: '{
"spring.activemq.brokerUrl": "tcp://anartemis:61616?jms.watchTopicAdvisories=false", "spring.activemq.brokerUrl": "tcp://anartemis:61616?jms.watchTopicAdvisories=false",
...@@ -166,7 +169,7 @@ services: ...@@ -166,7 +169,7 @@ services:
"bugzillaurl":"", "bugzillaurl":"",
"bugzillakey":"", "bugzillakey":"",
"main_operations_product":"" "main_operations_product":""
}' }'
ports: ports:
- 13010:13010 - 13010:13010
networks: networks:
...@@ -182,10 +185,11 @@ services: ...@@ -182,10 +185,11 @@ services:
profiles: ["prod"] profiles: ["prod"]
build: build:
context: ../../org.etsi.osl.tmf.api/ context: ../../org.etsi.osl.tmf.api/
dockerfile: Dockerfile.tmfapi dockerfile: Dockerfile
image: org.etsi.osl.tmf.api:latest image: labs.etsi.org:5050/osl/code/org.etsi.osl.tmf.api:latest
environment: environment:
SPRING_APPLICATION_JSON: '{ SPRING_APPLICATION_JSON: '{
"origins": "http://localhost",
"spring.datasource.url": "jdbc:mysql://amysql/ostmfdb?createDatabaseIfNotExist=true&useUnicode=true&characterEncoding=utf8&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC", "spring.datasource.url": "jdbc:mysql://amysql/ostmfdb?createDatabaseIfNotExist=true&useUnicode=true&characterEncoding=utf8&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC",
"spring.datasource.username":"root", "spring.datasource.username":"root",
"spring.datasource.password":"letmein", "spring.datasource.password":"letmein",
...@@ -201,9 +205,16 @@ services: ...@@ -201,9 +205,16 @@ services:
"spring.activemq.brokerUrl": "tcp://anartemis:61616?jms.watchTopicAdvisories=false", "spring.activemq.brokerUrl": "tcp://anartemis:61616?jms.watchTopicAdvisories=false",
"spring.activemq.user": "artemis", "spring.activemq.user": "artemis",
"spring.activemq.password": "artemis", "spring.activemq.password": "artemis",
"logging.level.org.springframework" : "INFO", "logging.level.org.springframework" : "INFO",
"kroki.serverurl" : "http://localhost/kroki" "logging.level.org.etsi.osl.tmf.api" : "INFO",
}' "kroki.serverurl" : "http://localhost/kroki",
"server.forward-headers-strategy":"FRAMEWORK"
}'
logging:
driver: "json-file"
options:
max-size: "1g"
max-file: "3"
volumes: volumes:
- ./repo:/root - ./repo:/root
ports: ports:
...@@ -221,17 +232,17 @@ services: ...@@ -221,17 +232,17 @@ services:
profiles: ["prod"] profiles: ["prod"]
build: build:
context: ../../org.etsi.osl.osom/ context: ../../org.etsi.osl.osom/
dockerfile: Dockerfile.osom dockerfile: Dockerfile
image: org.etsi.osl.osom:latest image: labs.etsi.org:5050/osl/code/org.etsi.osl.osom:latest
environment: environment:
SPRING_APPLICATION_JSON: '{ SPRING_APPLICATION_JSON: '{
"spring.datasource.url" : "jdbc:h2:/tmp/tempdb;DB_CLOSE_DELAY=-1",
"spring.activemq.brokerUrl": "tcp://anartemis:61616?jms.watchTopicAdvisories=false", "spring.activemq.brokerUrl": "tcp://anartemis:61616?jms.watchTopicAdvisories=false",
"spring.activemq.user": "artemis", "spring.activemq.user": "artemis",
"spring.activemq.password": "artemis", "spring.activemq.password": "artemis",
"logging.level.org.springframework" : "INFO" "logging.level.org.springframework" : "INFO",
}' "logging.level.org.etsi.osl.osom" : "INFO"
volumes: }'
- ./repo:/root
ports: ports:
- 13100:13100 - 13100:13100
networks: networks:
...@@ -247,10 +258,11 @@ services: ...@@ -247,10 +258,11 @@ services:
profiles: ["prod"] profiles: ["prod"]
build: build:
context: ../../org.etsi.osl.oas/ context: ../../org.etsi.osl.oas/
dockerfile: Dockerfile.oasapi dockerfile: Dockerfile
image: org.etsi.osl.oas:latest image: labs.etsi.org:5050/osl/code/org.etsi.osl.oas:latest
environment: environment:
SPRING_APPLICATION_JSON: '{ SPRING_APPLICATION_JSON: '{
"origins": "http://localhost",
"spring.datasource.url": "jdbc:mysql://amysql/ostmfdb?createDatabaseIfNotExist=true&useUnicode=true&nullCatalogMeansCurrent=true&characterEncoding=utf8&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC", "spring.datasource.url": "jdbc:mysql://amysql/ostmfdb?createDatabaseIfNotExist=true&useUnicode=true&nullCatalogMeansCurrent=true&characterEncoding=utf8&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC",
"spring.datasource.username":"root", "spring.datasource.username":"root",
"spring.datasource.password":"letmein", "spring.datasource.password":"letmein",
...@@ -266,8 +278,14 @@ services: ...@@ -266,8 +278,14 @@ services:
"spring.activemq.brokerUrl": "tcp://anartemis:61616?jms.watchTopicAdvisories=false", "spring.activemq.brokerUrl": "tcp://anartemis:61616?jms.watchTopicAdvisories=false",
"spring.activemq.user": "artemis", "spring.activemq.user": "artemis",
"spring.activemq.password": "artemis", "spring.activemq.password": "artemis",
"logging.level.org.springframework" : "INFO" "logging.level.org.springframework" : "INFO",
}' "server.forward-headers-strategy":"FRAMEWORK"
}'
logging:
driver: "json-file"
options:
max-size: "500m"
max-file: "3"
volumes: volumes:
- ./repo:/root - ./repo:/root
ports: ports:
...@@ -276,6 +294,35 @@ services: ...@@ -276,6 +294,35 @@ services:
- front - front
- back - back
cridge:
container_name: openslice-cridge
restart: always
profiles: [ "prod"]
build:
context: ../../org.etsi.osl.cridge/
dockerfile: Dockerfile
image: labs.etsi.org:5050/osl/code/org.etsi.osl.cridge:latest
environment:
SPRING_APPLICATION_JSON: '{
"spring.activemq.brokerUrl": "tcp://anartemis:61616?jms.watchTopicAdvisories=false",
"spring.activemq.user": "artemis",
"spring.activemq.password": "artemis",
"logging.level.org.springframework" : "INFO",
"logging.level.org.etsi.osl.cridge" : "INFO"
}'
logging:
driver: "json-file"
options:
max-size: "800m"
max-file: "3"
networks:
- front
- back
volumes:
- ./kubedir/:/root/.kube
depends_on:
- osscapi
portainer: portainer:
...@@ -297,15 +344,16 @@ services: ...@@ -297,15 +344,16 @@ services:
profiles: ["prod"] profiles: ["prod"]
build: build:
context: ../../org.etsi.osl.centrallog.service/ context: ../../org.etsi.osl.centrallog.service/
dockerfile: Dockerfile.centrallog dockerfile: Dockerfile
image: org.etsi.osl.centrallog.service:latest image: labs.etsi.org:5050/osl/code/org.etsi.osl.centrallog.service:latest
environment: environment:
SPRING_APPLICATION_JSON: '{ SPRING_APPLICATION_JSON: '{
"spring.activemq.brokerUrl": "tcp://anartemis:61616?jms.watchTopicAdvisories=false", "spring.activemq.brokerUrl": "tcp://anartemis:61616?jms.watchTopicAdvisories=false",
"spring.activemq.user": "artemis", "spring.activemq.user": "artemis",
"spring.activemq.password": "artemis", "spring.activemq.password": "artemis",
"centrallogurl":"http://elk_ip:elk_port/index_name/_doc" "centrallogurl":"http://elk_ip:elk_port/index_name/_doc",
}' "logging.level.org.springframework" : "INFO"
}'
ports: ports:
- 13013:13013 - 13013:13013
networks: networks:
......
...@@ -5,9 +5,9 @@ ...@@ -5,9 +5,9 @@
"notBefore": 1586721661, "notBefore": 1586721661,
"revokeRefreshToken": false, "revokeRefreshToken": false,
"refreshTokenMaxReuse": 0, "refreshTokenMaxReuse": 0,
"accessTokenLifespan": 300, "accessTokenLifespan": 3600,
"accessTokenLifespanForImplicitFlow": 900, "accessTokenLifespanForImplicitFlow": 3600,
"ssoSessionIdleTimeout": 1800, "ssoSessionIdleTimeout": 7200,
"ssoSessionMaxLifespan": 36000, "ssoSessionMaxLifespan": 36000,
"ssoSessionIdleTimeoutRememberMe": 0, "ssoSessionIdleTimeoutRememberMe": 0,
"ssoSessionMaxLifespanRememberMe": 0, "ssoSessionMaxLifespanRememberMe": 0,
......
...@@ -30,39 +30,30 @@ http { ...@@ -30,39 +30,30 @@ http {
#include /etc/nginx/conf.d/*.conf; #include /etc/nginx/conf.d/*.conf;
server { server {
listen 80; listen 80;
listen [::]:80; listen [::]:80;
server_name localhost; server_name localhost;
location / { location / {
root /webstatic/services/; root /webstatic/services/;
index index.html; index index.html;
try_files $uri $uri/ /index.html; try_files $uri $uri/ /index.html;
}
# location / {
# root /webstatic/nfvportal/openslicehome;
# index index.html;
# }
location /nfvportal {
root /webstatic;
index index.html;
autoindex off;
try_files $uri $uri/ /nfvportal/index.html;
} }
location /nfvportal {
root /webstatic;
index index.html;
autoindex off;
try_files $uri $uri/ /nfvportal/index.html;
}
location /osapi { location /osapi {
proxy_pass http://osportalapi:13000/osapi; proxy_pass http://osportalapi:13000/osapi;
proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host; proxy_set_header Host $http_host;
proxy_set_header X-Forwarded-Proto $scheme;
} }
location /tmf-api { location /tmf-api {
...@@ -70,6 +61,7 @@ http { ...@@ -70,6 +61,7 @@ http {
proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host; proxy_set_header Host $http_host;
proxy_set_header X-Forwarded-Proto $scheme;
} }
location /oas-api { location /oas-api {
...@@ -77,46 +69,37 @@ http { ...@@ -77,46 +69,37 @@ http {
proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host; proxy_set_header Host $http_host;
proxy_set_header X-Forwarded-Proto $scheme;
} }
# For http
location /auth { location /auth {
proxy_pass http://keycloak:8080/auth; proxy_pass http://keycloak:8080/auth;
proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host; proxy_set_header Host $http_host;
} }
location /kroki { location /kroki {
rewrite /kroki/(.*) /$1 break; rewrite /kroki/(.*) /$1 break;
proxy_pass http://kroki:8000; proxy_pass http://kroki:8000;
proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host; proxy_set_header Host $http_host;
} }
# For https
# location /auth { # location /auth {
# proxy_pass https://keycloak:8443/auth; # proxy_pass https://keycloak:8443/auth;
# proxy_set_header X-Real-IP $remote_addr; # proxy_set_header X-Real-IP $remote_addr;
# proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# proxy_set_header Host $http_host; # proxy_set_header Host $http_host;
# proxy_set_header X-Forwarded-Server $host; # proxy_set_header X-Forwarded-Server $host;
# proxy_set_header X-Forwarded-Proto $scheme; # proxy_set_header X-Forwarded-Proto $scheme;
# proxy_set_header X-Forwarded-Port 443; # proxy_set_header X-Forwarded-Port 443;
# } # }
}
}
} }
backend API Development
nginx.conf:
- comment location /osapi
- comment location /tmf-api
- comment location /oas-api
fix auth location in nginx.conf as follows:
location /auth {
proxy_pass http://keycloak:8080/auth;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
}
docker-compose --profile dev down;docker-compose --profile dev up -d
Keycloak for development
Add 127.0.0.1 keycloak in your hosts file and replace http://localhost/auth/ with http://keycloak:8080/auth/ in your Keycloak config for TypeScript/Angular.
Hosts File Location:
In Linux/Unix, its location is at: /etc/hosts In windows, its location is at c:\Windows\System32\Drivers\etc\hosts.
Explanation:
The Nginx uses the http://keycloak:8080 URL which is the network inside the docker system.
The front-end (TS/Angular) uses the http://keycloak:8080
You will not get the invalid token error, as you are getting the token from http://keycloak:8080 and as well verifying with the same URL.
nginx serves already the frontend from the project org.etsi.osl.tmf.web
If you would like to use the frontend to test your backend config.prod.json should look similar to the following example
{
"TITLE": "Openslice demo",
"PORTALVERSION":"1.1.0-SNAPSHOT",
"WIKI": "http://wiki.localhost",
"BUGZILLA": "{BASEURL}/bugzilla/",
"STATUS": "http://status.localhost/",
"WEBURL": "{BASEURL}",
"PORTAL_REPO_APIURL": "{BASEURL}/osapi",
"ASSURANCE_SERVICE_MGMT_APIURL": "{BASEURL}/oas-api",
"APITMFURL": "http://localhost:13082/tmf-api",
"OAUTH_CONFIG" : {
"issuer": "http://keycloak:8080/auth/realms/openslice/protocol/openid-connect/auth",
"loginUrl": "http://keycloak:8080/auth/realms/openslice/protocol/openid-connect/auth",
"tokenEndpoint": "http://keycloak:8080/auth/realms/openslice/protocol/openid-connect/token",
"redirectUri": "{BASEURL}/redirect",
"logoutUrl": "{BASEURL}/auth/realms/openslice/protocol/openid-connect/logout",
"postLogoutRedirectUri": "{BASEURL}/services/services_marketplace",
"responseType": "code",
"oidc": false,
"clientId": "osapiWebClientId",
"dummyClientSecret": "secret",
"requireHttps": false,
"useHttpBasicAuth": true,
"clearHashAfterLogin": false,
"showDebugInformation": true
}
}
for the NFV frontend, config.js should be like the following:
var appConfig = angular.module('portalwebapp.config',[]);
appConfig.factory('APIEndPointService', function() {
return {
TITLE: "Openslice",
WIKI: "ROOTURL",
BUGZILLA: "ROOTURL/bugzilla/",
STATUS: "ROOTURL/status/",
APIURL: "http://localhost:13000",
WEBURL: "ROOTURL/nfvportal",
APIOAUTHURL: "http://keycloak:8080/auth/realms/openslice",
APITMFURL: "http://localhost:13082/tmf-api/serviceCatalogManagement/v4"
};
});
---
Run openslice on host
Build first
docker-compose --profile prod down;docker-compose --profile prod up -d --build
\ No newline at end of file
# Alarms
In Openslice parts of TMF642 Alarm Management API are currently implemented. Alarms can be managed through the TMF API endpoint as well as the UI.
## Alarms and Actions
Note: Actions is an experimental feature. We expect to have a more mature solution in future. The component in the architecture is the Openslcie Assurance Services
Alarms can be automatically resolved by specific actions. Today only the following actions are offered.
* execDay2
* scaleServiceEqually
## execDay2
Usually used to perform a Day2 configuration (towards OSM). To use it, Create a New Action Specification Name=execDay2 as following
[![Openslice usage](./images/alarms_actions/day2actionspec.png)](./images/alarms_actions/day2actionspec.png)
Now make a Service Order for your service. In this example ςε used a cirros NSD
Create a New Action Rule for the running services as the following example:
[![Openslice usage](./images/alarms_actions/action_rule_exampleday2.png)](./images/alarms_actions/action_rule_exampleday2.png)
The scope is the running cirros service.
Params should be paramname=value;paramname2=value2;paramname3=value3 (must exist in the VNF otherwise OSM will raise an error).
In this case should be filename=test.txt
Primitive=touch
ServiceId = select the service which will accept the Day2. In this case is the same
To test it:
Go to the Service Inventory and select the active Service.
Note the UUID of the service (e.g. c4e7990a-e174-4cd2-9133-b10e56721e08 copy from address bar), DeploymentRequestID and NSDID from characteristics
You can either use the UUID of the service or the DeploymentRequestID and POST to the Alarms endpoint ( /tmf-api/alarmManagement/v4/alarm)
If the DeploymentRequestID is used then POST:
```
{
"alarmRaisedTime": "2021-06-29T12:30:24.675Z",
"alarmReportingTime": "2021-06-29T12:30:54.675Z",
"state": "raised",
"alarmType": "qualityOfServiceAlarm",
"probableCause": "thresholdCrossed",
"ackState": "unacknowledged",
"perceivedSeverity": "major",
"sourceSystemId": "mano-client-service",
"alarmDetails": "NSID=3;DeploymentRequestID=1",
"specificProblem": "myalram raised"
}
```
If the UUID is used then POST:
```
{
"alarmRaisedTime": "2021-06-29T12:30:24.675Z",
"alarmReportingTime": "2021-06-29T12:30:54.675Z",
"state": "raised",
"alarmType": "qualityOfServiceAlarm",
"probableCause": "thresholdCrossed",
"ackState": "unacknowledged",
"perceivedSeverity": "major",
"sourceSystemId": "mano-client-service",
"alarmDetails": "analarm",
"specificProblem": "myalram raised",
"affectedService": [
{
"id": "c4e7990a-e174-4cd2-9133-b10e56721e08"
}
]
}
```
The Alarm to be created must have the affected Service ID equal to the running service from the scope (the cirros_ns)
Go to service inventory you will see the notes and also the service characteristics for any EXEC_ACTION updates
You can also adjust the alarm conditions. They must match true so the alarm to be acknowledged
So if another external service raises an Alarm (with POST) for the running service, a Day2 will be performed on another Service
## scaleServiceEqually
This action is used from getting a scaling event from OSM. Please see the next demo for details on how it works
### Prototype demo
You can watch how we used the prototype on the following ETSI ZMS PoC #2
* ETSI ZMS PoC #2: <https://www.etsi.org/events/1905-webinar-zsm-poc-2-showcase-automated-network-slice-scaling-in-multi-site-environments/>
# Architecture
Openslice offers the following main functionalities:
* Service Catalog Management: A CSP will have the ability to manage the Service Catalog Items, their attributes , organize in categories and decide what to make available to Customers
* Services Specifications: A CSP will be able to manage Service Specifications
* Service Catalog Exposure: A CSP will be able to expose catalog to customers and related parties
* Service Catalog to Service Catalog: Openslice able to consume and provide Service Catalog items to other catalogs
* Service Order: The Customer will be able to place a Service Order
* Service Inventory: The Customer and Provider will be able to view deployed Services status
The following figure displays the overall architecture of Openslice.
[![Openslice architecture](../images/architecture.png)](../images/architecture.png)
Openslice allows Vertical Customers browsing the available offered service specifications. It consists of:
* Web frontend UIs that consist of mainly two portals: i) a NFV portal allowing users self-service management and onboarding VNFDs/NSDs to facility’s NFVO ii) a Services Portal, which allows users to browse the Service Catalog, Service Blueprints specifications and the Service Inventory
* An API gateway that proxies the internal APIs and used by the web front end as well as any other 3rd party service
* A Message Bus where all microservices use it to exchange messages either via message queues or via publish/subscribe topics
* An authentication server implementing Oauth2 authentication scheme
* A microservice offering TMF compliant API services (eg Service Catalog API, Service Ordering APIetc)
* A microservice offering NFV API services (eg VNF/NSD onboarding etc) and allows to store VNFDs and NSDs in a catalog
* A microservice that is capable to interface to an issue management system. For example it raises an issue to all related stakeholders (CSP, NOP, CSC) that a new Service Order is requested
* Central logging microservice that is capable to log all distributed actions in to an Elasticsearch cluster
* A Service Orchestrator solution that will propagate Service Ordering requests to the equivalent SOs and NFVOs
The following figure depicts how Openslice microservices are deployed
[![Openslice microservices network deployment](../images/microservices_network_deployment.png)](../images/microservices_network_deployment.png)
## Deploying Openslice in multi domain scenarios
A typical deployment across domains, involves today some typical components: i) an OSS/BSS to allow customers access the service catalog and perform service orders, ii) a Service Orchestrator (SO) component for executing the service order workflow, as well as iii) a Network Functions Virtualization Orchestrator (NFVO) for configuring the iv) network resources.
TMF Open APIs are introduced not only for exposing catalogues and accepting service orders, but also implementing the East-West interfaces between the domains, fulfilling also the LSO requirements as introduced by MEF.
The following figure shows how openslice could be used in such scenarios:
[![Openslice multi-domain-architecture](../images/multi-domain-architecture.png)](../images/multi-domain-architecture.png)
See more [Consuming Services From External Partner Organizations](./consumingServicesFromExternalPartners.md)
# Central Logging
Openslice follows the centralized log management concept, i.e. a type of logging solution system that consolidates the log data from different services and pushes it to a central, accessible and easy-to-use interface.
For that reason, Elasticsearch is elected as an open-source centralized logging solution for collecting, parsing and storing logs towards a real-time data analytics tool that provides insights from any type of structured and unstructured data source.
\ No newline at end of file
# Consuming Services From External Partner Organizations
A typical deployment across domains, involves today some typical components: i) an OSS/BSS to allow customers access the service catalog and perform service orders, ii) a Service Orchestrator (SO) component for executing the service order workflow, as well as iii) a Network Functions Virtualization Orchestrator (NFVO) for configuring the iv) network resources.
TMF Open APIs are introduced not only for exposing catalogues and accepting service orders, but also implementing the East-West interfaces between the domains, fulfilling also the LSO requirements as introduced by MEF.
The following figure shows how openslice could be used in such scenarios:
[![Openslice multi-domain-architecture](../images/multi-domain-architecture.png)](../images/multi-domain-architecture.png)
In Openslice we can consume services from 3rd parties via Open APIs.
We use the TMF 632 Party Management model to specify Organizations that we can exchange items and other information such as:
- Import Service Specifications
- Create a Service Order
- Use the Service Inventory to query the status of the service ordered to the external partner organization
## Define an Organization as 3rd party to consume services East-West
An organization must have the following characteristics in openslice catalog, like for example:
"EXTERNAL_TMFAPI_BASEURL", "http://portal.openslice.io"
"EXTERNAL_TMFAPI_CLIENTREGISTRATIONID", "authOpensliceProvider"
"EXTERNAL_TMFAPI_OAUTH2CLIENTID", "osapiWebClientId"
"EXTERNAL_TMFAPI_OAUTH2CLIENTSECRET", "secret"
"EXTERNAL_TMFAPI_OAUTH2SCOPES", scopes
"EXTERNAL_TMFAPI_OAUTH2TOKENURI", "http://portal.openslice.io/osapi-oauth-server/oauth/token"
"EXTERNAL_TMFAPI_USERNAME", "admin"
"EXTERNAL_TMFAPI_PASSWORD", "openslice"
"EXTERNAL_TMFAPI_SERVICE_CATALOG_URLS" = "/tmf-api/serviceCatalogManagement/v4/serviceSpecification?type=CustomerFacingServiceSpecification" (this is optional, fetch a list of service specs it will be relative with the BASEURL. If the url is empty then no specs will be fetched, the EXTERNAL_TMFAPI_SERVICE_CATEGORY_URLS might be used)
"EXTERNAL_TMFAPI_SERVICE_CATEGORY_URLS" = "/tmf-api/serviceCatalogManagement/v4/serviceCategory/{categoryid}" (this example will fetch all specs in a category. You may define comma separated URLs of categories API URL . This will fetch specifications of every defined category. If you want only one specific category put for example the uuid only of one category: "/tmf-api/serviceCatalogManagement/v4/serviceCategory/bda02821-bc4d-4bd6-b64b-d9c2aa5f8e6d". multiple urls should be "/tmf-api/serviceCatalogManagement/v4/serviceCategory/bda02821-bc4d-4bd6-b64b-d9c2aa5f8e6d,/tmf-api/serviceCatalogManagement/v4/serviceCategory/9b6d8bf3-abd2-43c4-8154-c8c6fe5545b2")
"EXTERNAL_TMFAPI_SERVICE_SPEC" = "/tmf-api/serviceCatalogManagement/v4/serviceSpecification"
"EXTERNAL_TMFAPI_SERVICE_ORDER_URLS"= "/test/v1/serviceorder" (this is optional)
An example Organization defined example in json:
```
{
"uuid": "1a09a8b5-6bd5-444b-b0b9-a73c69eb42ae",
"@baseType": "BaseEntity",
"@schemaLocation": null,
"@type": null,
"href": null,
"name": "Openslice.io",
"id": "1a09a8b5-6bd5-444b-b0b9-a73c69eb42ae",
"isHeadOffice": null,
"isLegalEntity": null,
"nameType": null,
"organizationType": null,
"tradingName": null,
"contactMedium": [],
"creditRating": [],
"existsDuring": null,
"externalReference": [],
"organizationChildRelationship": [],
"organizationIdentification": [],
"organizationParentRelationship": null,
"otherName": [],
"partyCharacteristic": [
{
"uuid": "3a2f7221-e0a2-4a6b-88d1-534c8e1963f6",
"@baseType": "BaseEntity",
"@schemaLocation": null,
"@type": null,
"href": null,
"name": "EXTERNAL_TMFAPI_CLIENTREGISTRATIONID",
"valueType": null,
"value": {
"value": "authOpensliceProvider",
"alias": null
}
},
{
"uuid": "c24bb527-f178-4d38-9b93-2027c1732876",
"@baseType": "BaseEntity",
"@schemaLocation": null,
"@type": null,
"href": null,
"name": "EXTERNAL_TMFAPI_USERNAME",
"valueType": null,
"value": {
"value": "admin",
"alias": null
}
},
{
"uuid": "27e45df8-414b-44c6-a5d5-3f064e2cfd3b",
"@baseType": "BaseEntity",
"@schemaLocation": null,
"@type": null,
"href": null,
"name": "EXTERNAL_TMFAPI_PASSWORD",
"valueType": null,
"value": {
"value": "openslice",
"alias": null
}
},
{
"uuid": "e0e470b8-6024-4014-8a18-2333e5465ce1",
"@baseType": "BaseEntity",
"@schemaLocation": null,
"@type": null,
"href": null,
"name": "EXTERNAL_TMFAPI_OAUTH2CLIENTSECRET",
"valueType": null,
"value": {
"value": "secret",
"alias": null
}
},
{
"uuid": "3e0de762-ac80-4c1e-a0a1-f265ff0899b4",
"@baseType": "BaseEntity",
"@schemaLocation": null,
"@type": null,
"href": null,
"name": "EXTERNAL_TMFAPI_OAUTH2SCOPES",
"valueType": null,
"value": {
"value": "admin;read",
"alias": null
}
},
{
"uuid": "0bbb8314-f7f2-420d-9fed-ba054b15f886",
"@baseType": "BaseEntity",
"@schemaLocation": null,
"@type": null,
"href": null,
"name": "EXTERNAL_TMFAPI_OAUTH2TOKENURI",
"valueType": null,
"value": {
"value": "http://portal.openslice.io/osapi-oauth-server/oauth/token",
"alias": null
}
},
{
"uuid": "3a567de4-79eb-4006-a500-3e5229b44175",
"@baseType": "BaseEntity",
"@schemaLocation": null,
"@type": null,
"href": null,
"name": "EXTERNAL_TMFAPI_OAUTH2CLIENTID",
"valueType": null,
"value": {
"value": "osapiWebClientId",
"alias": null
}
},
{
"uuid": "6dca729f-dbe1-46b7-89f1-5c4f9fe89d4e",
"@baseType": "BaseEntity",
"@schemaLocation": null,
"@type": null,
"href": null,
"name": "EXTERNAL_TMFAPI_BASEURL",
"valueType": null,
"value": {
"value": "http://portal.openslice.io",
"alias": null
}
}
],
"relatedParty": [],
"status": null,
"taxExemptionCertificate": []
}
```
\ No newline at end of file
# Issue Management
For issue management support, Openslice relies on Bugzilla. Bugzilla is a ticketing tool that allows issue reporting and tracking via tickets to all relevant stakeholders.
The figure below displays the overall issue management service architecture integrating Bugzilla as its core and how this tool interacts with other Openslice services presenting some distinctive scenarios. It should be noted that Bugzilla tickets will not only be used for bugs/errors, but also for general requests, e.g. Service Order procedure.
[![Issue management system](../images/issue_management.png)](../images/issue_management.png)
\ No newline at end of file
This diff is collapsed.
# API interaction
## OAuth token
See [oauth](./oauth.md)
## Request a protected API resource
Example: Get all vxfs (check the `Authorization:Bearer` to be correct)
```
curl -H "Authorization:Bearer eybGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX25hbWUiOiJhZG1pbiIsInNjb3BlIjpbIm9wZW5hcGkiLCJhZG1pbiIsInJlYWQiLCJ3cml0ZSJdLCJvcmdhbml6YXRpb24iOiJteW9yZ2FuaXp0aW9uIiwiZXhwIjoxNTcxOTI0MjU2LCJhdXRob3JpdGllcyI6WyJST0xFX01FTlRPUiIsIlJPTEVfQURNSU4iXSwianRpIjoiNzNkZmIxODEtNTMwOS00MmExLThkOWUtOGM3YmQ0YTE1YmU0IiwiY2xpZW50X2lkIjoib3NhcGlXZWJDbGllbnRJZE91dCJ9.Pj_hxnyMGhFhN8avU_DiAw1-LlcaIz5Hp9HNqalw-X4" http://localhost:13000/osapi/admin/vxfs
```
Example response:
```
[
{
"id": 1,
"owner": {
"id": 1,
"organization": "ee",
"name": "Portal Administrator",
"email": "",
"username": "admin",
"createdAt": null
},
"uuid": "a954daf2-16da-4b7e-ae42-4825936d453c",
"name": "cirros_vnfd",
"iconsrc": "/osapi/images/a954daf2-16da-4b7e-ae42-4825936d453c/cirros-64.png",
"shortDescription": "cirros_vnfd",
"longDescription": "Simple VNF example with a cirros",
"version": "1.0",
"packageLocation": "/osapi/packages/a954daf2-16da-4b7e-ae42-4825936d453c/cirros_vnf.tar.gz",
"dateCreated": 1568971426000,
"dateUpdated": 1568981107000,
"categories": [
{
"id": 3,
"name": "Service",
"productsCount": 1,
"appscount": 0,
"vxFscount": 1
},
{
"id": 2,
"name": "Networking",
"productsCount": 1,
"appscount": 0,
"vxFscount": 1
}
],
"extensions": [],
"validationJobs": [],
"screenshots": "",
"vendor": "OSM",
"published": false,
"termsOfUse": null,
"descriptor": "vnfd-catalog:\n vnfd:\n - connection-point:\n - name: eth0\n type: VPORT\n description: Simple VNF example with a cirros\n id: cirros_vnfd\n logo: cirros-64.png\n mgmt-interface:\n cp: eth0\n name: cirros_vnfd\n short-name: cirros_vnfd\n vdu:\n - count: 1\n description: cirros_vnfd-VM\n id: cirros_vnfd-VM\n image: cirros034\n interface:\n - external-connection-point-ref: eth0\n name: eth0\n position: '1'\n type: EXTERNAL\n virtual-interface:\n bandwidth: '0'\n type: VIRTIO\n vpci: 0000:00:0a.0\n name: cirros_vnfd-VM\n vm-flavor:\n memory-mb: 512\n storage-gb: 1\n vcpu-count: 1\n vendor: OSM\n version: '1.0'\n",
"descriptorHTML": "<h3>cirros_vnfd</h3><br><b>Vendor: </b>OSM<br><b>Version: </b>1.0<br><b>Description: </b>Simple VNF example with a cirros<br><b>VM Count: </b>1<br><b>vCPU Count: </b>1<br><b>Memory: </b>512 MB<br><b>Storage: </b>1 GB<br>",
"certified": false,
"certifiedBy": null,
"validationStatus": "UNDER_REVIEW",
"packagingFormat": "OSMvFIVE",
"supportedMANOPlatforms": [
{
"id": 1,
"name": "osm fivee",
"version": "osm fivee",
"description": "osm five"
}
],
"vxfOnBoardedDescriptors": [],
"vfimagesVDU": [
{
"id": 1,
"name": "cirros034",
"uuid": "d4549610-8abd-42ad-97f4-0a64e1c93977",
"shortDescription": "Automatically created during vxf cirros_vnfd submission. Owner must update.",
"packageLocation": null,
"publicURL": null,
"dateCreated": 1568971426000,
"dateUpdated": null,
"refVxFs": [
{
"id": 1,
"name": "cirros_vnfd"
}
],
"owner": {
"id": 1,
"organization": "ee",
"name": "Portal Administrator",
"email": "",
"username": "admin",
"active": true,
"currentSessionID": null,
"apikey": "e41c1cc4-aa56-4b7e-9f4d-64589549d768",
"createdAt": 1568711859000,
"roles": [
"ADMIN",
"MENTOR"
]
},
"published": false,
"termsOfUse": null,
"deployedInfrastructures": []
}
]
},
{
"id": 2,
"owner": {
"id": 1,
"organization": "ee",
"name": "Portal Administrator",
"email": "",
"username": "admin",
"createdAt": null
},
"uuid": "4ab80095-a63e-4fe7-8598-e1c7e880706e",
"name": "cirros_sriov_vnfd",
"iconsrc": null,
"shortDescription": "cirros_sriov_vnf",
"longDescription": "Simple VNF example with a cirros SRIOV interface",
"version": "1.0",
"packageLocation": "/osapi/packages/4ab80095-a63e-4fe7-8598-e1c7e880706e/cirros_sriov.tar.gz",
"dateCreated": 1568971740000,
"dateUpdated": 1568981100000,
"categories": [
{
"id": 4,
"name": "tyu",
"productsCount": 1,
"appscount": 0,
"vxFscount": 1
},
{
"id": 5,
"name": "tyi",
"productsCount": 1,
"appscount": 0,
"vxFscount": 1
}
],
"extensions": [],
"validationJobs": [],
"screenshots": "",
"vendor": "OSM",
"published": false,
"termsOfUse": null,
"descriptor": "vnfd:vnfd-catalog:\n vnfd:\n - connection-point:\n - name: eth0\n type: VPORT\n - name: eth1\n type: VPORT\n description: Simple VNF example with a cirros SRIOV interface\n id: cirros_sriov_vnfd\n logo: cirros-64.png\n mgmt-interface:\n cp: eth0\n name: cirros_sriov_vnf\n short-name: cirros_sriov_vnf\n vdu:\n - count: 1\n description: cirros_sriov_vnfd-VM\n guest-epa:\n cpu-pinning-policy: DEDICATED\n cpu-thread-pinning-policy: PREFER\n mempage-size: SMALL\n numa-node-policy:\n mem-policy: STRICT\n node:\n - id: '1'\n node-cnt: '1'\n id: cirros_sriov_vnfd-VM\n image: cirros-0.3.6-x86_64\n interface:\n - external-connection-point-ref: eth0\n name: eth0\n position: '1'\n type: EXTERNAL\n virtual-interface:\n bandwidth: '0'\n type: VIRTIO\n vpci: 0000:00:0a.0\n - external-connection-point-ref: eth1\n name: eth1\n position: '2'\n type: EXTERNAL\n virtual-interface:\n type: SR-IOV\n name: cirros_sriov_vnfd-VM\n vm-flavor:\n memory-mb: 4096\n storage-gb: 10\n vcpu-count: 4\n vendor: OSM\n version: '1.0'\n",
"descriptorHTML": "<h3>cirros_sriov_vnf</h3><br><b>Vendor: </b>OSM<br><b>Version: </b>1.0<br><b>Description: </b>Simple VNF example with a cirros SRIOV interface<br><b>VM Count: </b>1<br><b>vCPU Count: </b>1<br><b>Memory: </b>4096 MB<br><b>Storage: </b>10 GB<br>",
"certified": false,
"certifiedBy": null,
"validationStatus": "UNDER_REVIEW",
"packagingFormat": "OSMvFIVE",
"supportedMANOPlatforms": [
{
"id": 1,
"name": "osm fivee",
"version": "osm fivee",
"description": "osm five"
}
],
"vxfOnBoardedDescriptors": [],
"vfimagesVDU": [
{
"id": 2,
"name": "cirros-0.3.6-x86_64",
"uuid": "be121176-1d62-4a1b-a3c1-7dce2e069d22",
"shortDescription": "Automatically created during vxf cirros_sriov_vnfd submission. Owner must update.",
"packageLocation": null,
"publicURL": null,
"dateCreated": 1568971740000,
"dateUpdated": null,
"refVxFs": [
{
"id": 2,
"name": "cirros_sriov_vnfd"
}
],
"owner": {
"id": 1,
"organization": "ee",
"name": "Portal Administrator",
"email": "",
"username": "admin",
"active": true,
"currentSessionID": null,
"apikey": "e41c1cc4-aa56-4b7e-9f4d-64589549d768",
"createdAt": 1568711859000,
"roles": [
"ROLE_ADMIN",
"ROLE_MENTOR"
]
},
"published": false,
"termsOfUse": null,
"deployedInfrastructures": []
}
]
}
]
```
# Openslice NFV Web Portal
The [NFV Web Portal](http://portal.openslice.io/nfvportal) offers a domain-specific UI to manage NFV Services.
Indicatively, the portal can be used to:
- Register new a new MANO provider (e.g. OSM)
- Synchronize the onboarded VNF/NS packages, and the VIMs of the registered MANO provider
- Onboard/Delete VNF/NS packages on specific MANO provider
- Deploy a NS to a target MANO provider
More information can be found at [NFV Services](../nfvcatalogs.md).
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment