initial sdcore-helm-charts update
Change-Id: I91788de083b0f906ce4b32ac226f616fb2647ef9
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..41c8995
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,14 @@
+# Copyright 2020-present Open Networking Foundation
+#
+# SPDX-License-Identifier: Apache-2.0
+# SPDX-License-Identifier: LicenseRef-ONF-Member-Only-1.0
+
+# lockfiles for requirements.yaml for dependent charts
+requirements.lock
+
+# ignore dependent chart dirs
+charts
+Chart.lock
+
+# ignore MacOS DS_Store
+*.DS_Store
diff --git a/.gitreview b/.gitreview
new file mode 100644
index 0000000..a48bcc6
--- /dev/null
+++ b/.gitreview
@@ -0,0 +1,9 @@
+# SPDX-FileCopyrightText: 2020 Open Networking Foundation <info@opennetworking.org>
+#
+# SPDX-License-Identifier: LicenseRef-ONF-Member-Only-1.0
+
+[gerrit]
+host=gerrit.opencord.org
+port=29418
+project=sdcore-helm-charts.git
+defaultremote=origin
diff --git a/.reuse/dep5 b/.reuse/dep5
new file mode 100644
index 0000000..a1c0a43
--- /dev/null
+++ b/.reuse/dep5
@@ -0,0 +1,8 @@
+Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
+Upstream-Name: aether-helm-charts
+Upstream-Contact: Open Networking Foundation <info@opennetworking.org>
+Source: https://gerrit.opencord.org/aether-helm-charts
+
+Files: VERSION .gitreview
+Copyright: 2021 Open Networking Foundation
+License: Apache-2.0
diff --git a/5g-control-plane/.gitignore b/5g-control-plane/.gitignore
new file mode 100644
index 0000000..ed7d37a
--- /dev/null
+++ b/5g-control-plane/.gitignore
@@ -0,0 +1,7 @@
+# SPDX-FileCopyrightText: 2020-present Open Networking Foundation <info@opennetworking.org>
+#
+# SPDX-License-Identifier: LicenseRef-ONF-Member-Only-1.0
+
+charts/
+requirements.lock
+Chart.lock
diff --git a/5g-control-plane/Chart.yaml b/5g-control-plane/Chart.yaml
new file mode 100644
index 0000000..8cfff9d
--- /dev/null
+++ b/5g-control-plane/Chart.yaml
@@ -0,0 +1,17 @@
+---
+# Copyright 2020-present Open Networking Foundation
+#
+# SPDX-License-Identifier: LicenseRef-ONF-Member-Only-1.0
+
+apiVersion: v2
+description: Free5G control plane services
+name: 5g-control-plane
+icon: https://guide.opencord.org/logos/cord.svg
+
+version: 0.3.14
+
+dependencies:
+ - name: mongodb
+ version: 10.7.1
+ repository: https://charts.bitnami.com/bitnami
+ condition: mongodb.deploy
diff --git a/5g-control-plane/templates/NOTES.txt b/5g-control-plane/templates/NOTES.txt
new file mode 100644
index 0000000..fb2a925
--- /dev/null
+++ b/5g-control-plane/templates/NOTES.txt
@@ -0,0 +1,9 @@
+{{- /*
+
+# Copyright 2020-present Open Networking Foundation
+#
+# SPDX-License-Identifier: LicenseRef-ONF-Member-Only-1.0
+
+*/ -}}
+
+Notes - Instructions to use 5g helm charts
diff --git a/5g-control-plane/templates/_helpers.tpl b/5g-control-plane/templates/_helpers.tpl
new file mode 100644
index 0000000..87f1ec6
--- /dev/null
+++ b/5g-control-plane/templates/_helpers.tpl
@@ -0,0 +1,115 @@
+{{- /*
+
+# Copyright 2020-present Open Networking Foundation
+#
+# SPDX-License-Identifier: LicenseRef-ONF-Member-Only-1.0
+
+*/ -}}
+
+{{/*
+Renders a set of standardised labels
+*/}}
+{{- define "5g-control-plane.metadata_labels" -}}
+{{- $application := index . 0 -}}
+{{- $context := index . 1 -}}
+release: {{ $context.Release.Name }}
+app: {{ $application }}
+{{- end -}}
+
+{{/*
+Render the given template.
+*/}}
+{{- define "5g-control-plane.template" -}}
+{{- $name := index . 0 -}}
+{{- $context := index . 1 -}}
+{{- $last := base $context.Template.Name }}
+{{- $wtf := $context.Template.Name | replace $last $name -}}
+{{ include $wtf $context }}
+{{- end -}}
+
+{{/*
+Render ServiceAccount, Role, and RoleBinding required for kubernetes-entrypoint.
+*/}}
+{{- define "5g-control-plane.service_account" -}}
+{{- $context := index . 1 -}}
+{{- $saName := index . 0 -}}
+{{- $saNamespace := $context.Release.Namespace }}
+---
+apiVersion: v1
+kind: ServiceAccount
+metadata:
+ name: {{ $saName }}
+ namespace: {{ $saNamespace }}
+ labels:
+{{ tuple $saName $context | include "5g-control-plane.metadata_labels" | indent 4 }}
+---
+{{- if semverCompare ">=1.16-0" $context.Capabilities.KubeVersion.GitVersion }}
+apiVersion: rbac.authorization.k8s.io/v1
+{{- else }}
+apiVersion: rbac.authorization.k8s.io/v1beta1
+{{- end }}
+kind: RoleBinding
+metadata:
+ name: {{ $saName }}
+ namespace: {{ $saNamespace }}
+ labels:
+{{ tuple $saName $context | include "5g-control-plane.metadata_labels" | indent 4 }}
+roleRef:
+ apiGroup: rbac.authorization.k8s.io
+ kind: Role
+ name: {{ $saName }}
+subjects:
+ - kind: ServiceAccount
+ name: {{ $saName }}
+ namespace: {{ $saNamespace }}
+---
+{{- if semverCompare ">=1.16-0" $context.Capabilities.KubeVersion.GitVersion }}
+apiVersion: rbac.authorization.k8s.io/v1
+{{- else }}
+apiVersion: rbac.authorization.k8s.io/v1beta1
+{{- end }}
+kind: Role
+metadata:
+ name: {{ $saName }}
+ namespace: {{ $saNamespace }}
+ labels:
+{{ tuple $saName $context | include "5g-control-plane.metadata_labels" | indent 4 }}
+rules:
+ - apiGroups:
+ - ""
+ - extensions
+ - batch
+ - apps
+ verbs:
+ - get
+ - list
+ - patch
+ resources:
+ - statefulsets
+ - daemonsets
+ - jobs
+ - pods
+ - services
+ - endpoints
+ - configmaps
+{{- end -}}
+
+{{/*
+Render init container for coredump.
+*/}}
+{{- define "5g-control-plane.coredump_init" -}}
+{{- $pod := index . 0 -}}
+{{- $context := index . 1 -}}
+- name: {{ $pod }}-coredump-init
+ image: {{ $context.Values.images.tags.init | quote }}
+ imagePullPolicy: {{ $context.Values.images.pullPolicy }}
+ securityContext:
+ privileged: true
+ runAsUser: 0
+ command: ["bash", "-xc"]
+ args:
+ - echo '/tmp/coredump/core.%h.%e.%t' > /mnt/host-rootfs/proc/sys/kernel/core_pattern
+ volumeMounts:
+ - name: host-rootfs
+ mountPath: /mnt/host-rootfs
+{{- end -}}
diff --git a/5g-control-plane/templates/bin/_amf-run.sh.tpl b/5g-control-plane/templates/bin/_amf-run.sh.tpl
new file mode 100644
index 0000000..2a9d174
--- /dev/null
+++ b/5g-control-plane/templates/bin/_amf-run.sh.tpl
@@ -0,0 +1,16 @@
+#!/bin/sh
+
+# Copyright 2020-present Open Networking Foundation
+#
+# SPDX-License-Identifier: LicenseRef-ONF-Member-Only-1.0
+
+set -xe
+
+{{- if .Values.config.coreDump.enabled }}
+cp /free5gc/amf/amf /tmp/coredump/
+{{- end }}
+
+cd /free5gc
+cat config/amfcfg.conf
+
+GOTRACEBACK=crash ./amf/amf -amfcfg config/amfcfg.conf
diff --git a/5g-control-plane/templates/bin/_ausf-run.sh.tpl b/5g-control-plane/templates/bin/_ausf-run.sh.tpl
new file mode 100644
index 0000000..0307aed
--- /dev/null
+++ b/5g-control-plane/templates/bin/_ausf-run.sh.tpl
@@ -0,0 +1,16 @@
+#!/bin/sh
+
+# Copyright 2020-present Open Networking Foundation
+#
+# SPDX-License-Identifier: LicenseRef-ONF-Member-Only-1.0
+
+set -xe
+
+{{- if .Values.config.coreDump.enabled }}
+cp /free5gc/ausf/ausf /tmp/coredump/
+{{- end }}
+
+cd /free5gc
+cat config/ausfcfg.conf
+
+GOTRACEBACK=crash ./ausf/ausf -ausfcfg config/ausfcfg.conf
diff --git a/5g-control-plane/templates/bin/_nrf-run.sh.tpl b/5g-control-plane/templates/bin/_nrf-run.sh.tpl
new file mode 100644
index 0000000..7caa2e9
--- /dev/null
+++ b/5g-control-plane/templates/bin/_nrf-run.sh.tpl
@@ -0,0 +1,17 @@
+#!/bin/sh
+
+# Copyright 2020-present Open Networking Foundation
+#
+# SPDX-License-Identifier: LicenseRef-ONF-Member-Only-1.0
+
+set -xe
+
+{{- if .Values.config.coreDump.enabled }}
+cp /free5gc/nrf/nrf /tmp/coredump/
+{{- end }}
+
+cd /free5gc
+
+cat config/nrfcfg.conf
+
+GOTRACEBACK=crash ./nrf/nrf -nrfcfg config/nrfcfg.conf
diff --git a/5g-control-plane/templates/bin/_nssf-run.sh.tpl b/5g-control-plane/templates/bin/_nssf-run.sh.tpl
new file mode 100644
index 0000000..2aae4a0
--- /dev/null
+++ b/5g-control-plane/templates/bin/_nssf-run.sh.tpl
@@ -0,0 +1,17 @@
+#!/bin/sh
+
+# Copyright 2020-present Open Networking Foundation
+#
+# SPDX-License-Identifier: LicenseRef-ONF-Member-Only-1.0
+
+set -xe
+
+{{- if .Values.config.coreDump.enabled }}
+cp /free5gc/nssf/nssf /tmp/coredump/
+{{- end }}
+
+cd /free5gc
+
+cat config/nssfcfg.conf
+
+GOTRACEBACK=crash ./nssf/nssf -nssfcfg config/nssfcfg.conf
diff --git a/5g-control-plane/templates/bin/_pcf-run.sh.tpl b/5g-control-plane/templates/bin/_pcf-run.sh.tpl
new file mode 100644
index 0000000..9dfee3f
--- /dev/null
+++ b/5g-control-plane/templates/bin/_pcf-run.sh.tpl
@@ -0,0 +1,17 @@
+#!/bin/sh
+
+# Copyright 2020-present Open Networking Foundation
+#
+# SPDX-License-Identifier: LicenseRef-ONF-Member-Only-1.0
+
+set -xe
+
+{{- if .Values.config.coreDump.enabled }}
+cp /free5gc/pcf/pcf /tmp/coredump/
+{{- end }}
+
+cd /free5gc
+
+cat config/pcfcfg.conf
+
+GOTRACEBACK=crash ./pcf/pcf -pcfcfg config/pcfcfg.conf
diff --git a/5g-control-plane/templates/bin/_smf-run.sh.tpl b/5g-control-plane/templates/bin/_smf-run.sh.tpl
new file mode 100644
index 0000000..aafc97c
--- /dev/null
+++ b/5g-control-plane/templates/bin/_smf-run.sh.tpl
@@ -0,0 +1,18 @@
+#!/bin/sh
+
+# Copyright 2020-present Open Networking Foundation
+#
+# SPDX-License-Identifier: LicenseRef-ONF-Member-Only-1.0
+
+set -xe
+
+{{- if .Values.config.coreDump.enabled }}
+cp /free5gc/smf/smf /tmp/coredump/
+{{- end }}
+
+cd /free5gc
+
+cat config/smfcfg.conf
+cat uerouting/uerouting.conf
+
+GOTRACEBACK=crash ./smf/smf -smfcfg config/smfcfg.conf -uerouting uerouting/uerouting.conf
diff --git a/5g-control-plane/templates/bin/_udm-run.sh.tpl b/5g-control-plane/templates/bin/_udm-run.sh.tpl
new file mode 100644
index 0000000..a171cea
--- /dev/null
+++ b/5g-control-plane/templates/bin/_udm-run.sh.tpl
@@ -0,0 +1,17 @@
+#!/bin/sh
+
+# Copyright 2020-present Open Networking Foundation
+#
+# SPDX-License-Identifier: LicenseRef-ONF-Member-Only-1.0
+
+set -xe
+
+{{- if .Values.config.coreDump.enabled }}
+cp /free5gc/udm/udm /tmp/coredump/
+{{- end }}
+
+cd /free5gc
+
+cat config/udmcfg.conf
+
+GOTRACEBACK=crash ./udm/udm -udmcfg config/udmcfg.conf
diff --git a/5g-control-plane/templates/bin/_udr-run.sh.tpl b/5g-control-plane/templates/bin/_udr-run.sh.tpl
new file mode 100644
index 0000000..900f72a
--- /dev/null
+++ b/5g-control-plane/templates/bin/_udr-run.sh.tpl
@@ -0,0 +1,17 @@
+#!/bin/sh
+
+# Copyright 2020-present Open Networking Foundation
+#
+# SPDX-License-Identifier: LicenseRef-ONF-Member-Only-1.0
+
+set -xe
+
+{{- if .Values.config.coreDump.enabled }}
+cp /free5gc/udr/udr /tmp/coredump/
+{{- end }}
+
+cd /free5gc
+
+cat config/udrcfg.conf
+
+GOTRACEBACK=crash ./udr/udr -udrcfg config/udrcfg.conf
diff --git a/5g-control-plane/templates/bin/_webui-run.sh.tpl b/5g-control-plane/templates/bin/_webui-run.sh.tpl
new file mode 100644
index 0000000..5e91d50
--- /dev/null
+++ b/5g-control-plane/templates/bin/_webui-run.sh.tpl
@@ -0,0 +1,17 @@
+#!/bin/sh
+
+# Copyright 2020-present Open Networking Foundation
+#
+# SPDX-License-Identifier: LicenseRef-ONF-Member-Only-1.0
+
+set -xe
+
+{{- if .Values.config.coreDump.enabled }}
+cp /free5gc/webconsole/webconsole /tmp/coredump/
+{{- end }}
+
+cd /free5gc
+
+cat config/webuicfg.conf
+
+GOTRACEBACK=crash ./webconsole/webconsole -webuicfg config/webuicfg.conf
diff --git a/5g-control-plane/templates/configmap-amf.yaml b/5g-control-plane/templates/configmap-amf.yaml
new file mode 100644
index 0000000..5747fed
--- /dev/null
+++ b/5g-control-plane/templates/configmap-amf.yaml
@@ -0,0 +1,40 @@
+{{/*
+# Copyright 2020-present Open Networking Foundation
+
+# SPDX-License-Identifier: LicenseRef-ONF-Member-Only-1.0
+*/}}
+
+{{- if .Values.config.amf.deploy }}
+
+{{- if not .Values.config.useExistingConfigMap -}}
+{{- $amfcfg := index .Values.config.amf.cfgFiles "amfcfg.conf" }}
+{{- $sbi := index $amfcfg.configuration "sbi" }}
+
+{{- if not (hasKey $sbi "port") -}}
+{{- $_ := .Values.config.amf.sbi.port | set $sbi "port" -}}
+{{- end }}
+
+{{- if not (hasKey $amfcfg "logger") -}}
+{{- $_ := .Values.config.logger | set $amfcfg "logger" -}}
+{{- end }}
+
+{{- end }}
+
+
+---
+apiVersion: v1
+kind: ConfigMap
+metadata:
+ name: amf
+ labels:
+{{ tuple "amf" . | include "5g-control-plane.metadata_labels" | indent 4 }}
+data:
+ amf-run.sh: |
+{{ tuple "bin/_amf-run.sh.tpl" . | include "5g-control-plane.template" | indent 4 }}
+{{- if not .Values.config.useExistingConfigMap -}}
+{{- range $key, $value := .Values.config.amf.cfgFiles }}
+ {{ $key }}: |-
+{{ toYaml $value | indent 4 }}
+{{- end }}
+{{- end }}
+{{- end }}
diff --git a/5g-control-plane/templates/configmap-ausf.yaml b/5g-control-plane/templates/configmap-ausf.yaml
new file mode 100644
index 0000000..2a8a2b1
--- /dev/null
+++ b/5g-control-plane/templates/configmap-ausf.yaml
@@ -0,0 +1,39 @@
+{{/*
+# Copyright 2020-present Open Networking Foundation
+
+# SPDX-License-Identifier: LicenseRef-ONF-Member-Only-1.0
+*/}}
+
+{{- if .Values.config.ausf.deploy }}
+
+{{- if not .Values.config.useExistingConfigMap -}}
+{{- $ausfcfg := index .Values.config.ausf.cfgFiles "ausfcfg.conf" }}
+{{- $sbi := index $ausfcfg.configuration "sbi" }}
+
+{{- if not (hasKey $ausfcfg "logger") -}}
+{{- $_ := .Values.config.logger | set $ausfcfg "logger" -}}
+{{- end }}
+
+
+{{- if not (hasKey $sbi "port") -}}
+{{- $_ := .Values.config.ausf.sbi.port | set $sbi "port" -}}
+{{- end }}
+{{- end }}
+
+---
+apiVersion: v1
+kind: ConfigMap
+metadata:
+ name: ausf
+ labels:
+{{ tuple "ausf" . | include "5g-control-plane.metadata_labels" | indent 4 }}
+data:
+ ausf-run.sh: |
+{{ tuple "bin/_ausf-run.sh.tpl" . | include "5g-control-plane.template" | indent 4 }}
+{{- if not .Values.config.useExistingConfigMap -}}
+{{- range $key, $value := .Values.config.ausf.cfgFiles }}
+ {{ $key }}: |-
+{{ toYaml $value | indent 4 }}
+{{- end }}
+{{- end }}
+{{- end }}
diff --git a/5g-control-plane/templates/configmap-nrf.yaml b/5g-control-plane/templates/configmap-nrf.yaml
new file mode 100644
index 0000000..ccb236b
--- /dev/null
+++ b/5g-control-plane/templates/configmap-nrf.yaml
@@ -0,0 +1,47 @@
+{{/*
+# Copyright 2020-present Open Networking Foundation
+
+# SPDX-License-Identifier: LicenseRef-ONF-Member-Only-1.0
+*/}}
+
+{{- if .Values.config.nrf.deploy }}
+
+{{- if not .Values.config.useExistingConfigMap -}}
+{{- $nrfcfg := index .Values.config.nrf.cfgFiles "nrfcfg.conf" }}
+{{- $config := index $nrfcfg "configuration" }}
+{{- $sbi := index $config "sbi" }}
+
+{{- if not (hasKey $config "MongoDBName") -}}
+{{- $_ := .Values.config.mongodb.name | set $config "MongoDBName" -}}
+{{- end }}
+
+{{- if not (hasKey $config "MongoDBUrl") -}}
+{{- $_ := .Values.config.mongodb.url | set $config "MongoDBUrl" -}}
+{{- end }}
+
+{{- if not (hasKey $nrfcfg "logger") -}}
+{{- $_ := .Values.config.logger | set $nrfcfg "logger" -}}
+{{- end }}
+
+{{- if not (hasKey $sbi "port") -}}
+{{- $_ := .Values.config.nrf.sbi.port | set $sbi "port" -}}
+{{- end }}
+{{- end }}
+
+---
+apiVersion: v1
+kind: ConfigMap
+metadata:
+ name: nrf
+ labels:
+{{ tuple "nrf" . | include "5g-control-plane.metadata_labels" | indent 4 }}
+data:
+ nrf-run.sh: |
+{{ tuple "bin/_nrf-run.sh.tpl" . | include "5g-control-plane.template" | indent 4 }}
+{{- if not .Values.config.useExistingConfigMap -}}
+{{- range $key, $value := .Values.config.nrf.cfgFiles }}
+ {{ $key }}: |-
+{{ toYaml $value | indent 4 }}
+{{- end }}
+{{- end }}
+{{- end }}
diff --git a/5g-control-plane/templates/configmap-nssf.yaml b/5g-control-plane/templates/configmap-nssf.yaml
new file mode 100644
index 0000000..f6a8808
--- /dev/null
+++ b/5g-control-plane/templates/configmap-nssf.yaml
@@ -0,0 +1,38 @@
+{{/*
+# Copyright 2020-present Open Networking Foundation
+
+# SPDX-License-Identifier: LicenseRef-ONF-Member-Only-1.0
+*/}}
+
+{{- if .Values.config.nssf.deploy }}
+
+{{- if not .Values.config.useExistingConfigMap -}}
+{{- $nssfcfg := index .Values.config.nssf.cfgFiles "nssfcfg.conf" }}
+{{- $sbi := index $nssfcfg.configuration "sbi" }}
+
+{{- if not (hasKey $nssfcfg "logger") -}}
+{{- $_ := .Values.config.logger | set $nssfcfg "logger" -}}
+{{- end }}
+
+{{- if not (hasKey $sbi "port") -}}
+{{- $_ := .Values.config.nssf.sbi.port | set $sbi "port" -}}
+{{- end }}
+{{- end }}
+
+---
+apiVersion: v1
+kind: ConfigMap
+metadata:
+ name: nssf
+ labels:
+{{ tuple "nssf" . | include "5g-control-plane.metadata_labels" | indent 4 }}
+data:
+ nssf-run.sh: |
+{{ tuple "bin/_nssf-run.sh.tpl" . | include "5g-control-plane.template" | indent 4 }}
+{{- if not .Values.config.useExistingConfigMap -}}
+{{- range $key, $value := .Values.config.nssf.cfgFiles }}
+ {{ $key }}: |-
+{{ toYaml $value | indent 4 }}
+{{- end }}
+{{- end }}
+{{- end }}
diff --git a/5g-control-plane/templates/configmap-pcf.yaml b/5g-control-plane/templates/configmap-pcf.yaml
new file mode 100644
index 0000000..dcb9bfe
--- /dev/null
+++ b/5g-control-plane/templates/configmap-pcf.yaml
@@ -0,0 +1,43 @@
+{{/*
+# Copyright 2020-present Open Networking Foundation
+
+# SPDX-License-Identifier: LicenseRef-ONF-Member-Only-1.0
+*/}}
+
+{{- if .Values.config.pcf.deploy }}
+
+{{- if not .Values.config.useExistingConfigMap -}}
+{{- $pcfcfg := index .Values.config.pcf.cfgFiles "pcfcfg.conf" }}
+{{- $sbi := index $pcfcfg.configuration "sbi" }}
+{{- $config := index $pcfcfg "configuration" }}
+
+{{- if not (hasKey $pcfcfg "logger") -}}
+{{- $_ := .Values.config.logger | set $pcfcfg "logger" -}}
+{{- end }}
+
+{{- if not (hasKey $sbi "port") -}}
+{{- $_ := .Values.config.pcf.sbi.port | set $sbi "port" -}}
+{{- end }}
+
+{{- if not (hasKey $config "mongodb") -}}
+{{- $_ := dict "name" .Values.config.mongodb.name "url" .Values.config.mongodb.url | set $config "mongodb" -}}
+{{- end }}
+{{- end }}
+
+---
+apiVersion: v1
+kind: ConfigMap
+metadata:
+ name: pcf
+ labels:
+{{ tuple "pcf" . | include "5g-control-plane.metadata_labels" | indent 4 }}
+data:
+ pcf-run.sh: |
+{{ tuple "bin/_pcf-run.sh.tpl" . | include "5g-control-plane.template" | indent 4 }}
+{{- if not .Values.config.useExistingConfigMap -}}
+{{- range $key, $value := .Values.config.pcf.cfgFiles }}
+ {{ $key }}: |-
+{{ toYaml $value | indent 4 }}
+{{- end }}
+{{- end }}
+{{- end }}
diff --git a/5g-control-plane/templates/configmap-smf.yaml b/5g-control-plane/templates/configmap-smf.yaml
new file mode 100644
index 0000000..429499c
--- /dev/null
+++ b/5g-control-plane/templates/configmap-smf.yaml
@@ -0,0 +1,37 @@
+{{/*
+# Copyright 2020-present Open Networking Foundation
+
+# SPDX-License-Identifier: LicenseRef-ONF-Member-Only-1.0
+*/}}
+
+{{- if .Values.config.smf.deploy }}
+
+{{- if not .Values.config.useExistingConfigMap -}}
+{{- $smfcfg := index .Values.config.smf.cfgFiles "smfcfg.conf" }}
+{{- $sbi := index $smfcfg.configuration "sbi" }}
+
+{{- if not (hasKey $smfcfg "logger") -}}
+{{- $_ := .Values.config.logger | set $smfcfg "logger" -}}
+{{- end }}
+{{- if not (hasKey $sbi "port") -}}
+{{- $_ := .Values.config.smf.sbi.port | set $sbi "port" -}}
+{{- end }}
+{{- end }}
+
+---
+apiVersion: v1
+kind: ConfigMap
+metadata:
+ name: smf
+ labels:
+{{ tuple "smf" . | include "5g-control-plane.metadata_labels" | indent 4 }}
+data:
+ smf-run.sh: |
+{{ tuple "bin/_smf-run.sh.tpl" . | include "5g-control-plane.template" | indent 4 }}
+{{- if not .Values.config.useExistingConfigMap -}}
+{{- range $key, $value := .Values.config.smf.cfgFiles }}
+ {{ $key }}: |-
+{{ toYaml $value | indent 4 }}
+{{- end }}
+{{- end }}
+{{- end }}
diff --git a/5g-control-plane/templates/configmap-udm.yaml b/5g-control-plane/templates/configmap-udm.yaml
new file mode 100644
index 0000000..79f98c6
--- /dev/null
+++ b/5g-control-plane/templates/configmap-udm.yaml
@@ -0,0 +1,38 @@
+{{/*
+# Copyright 2020-present Open Networking Foundation
+
+# SPDX-License-Identifier: LicenseRef-ONF-Member-Only-1.0
+*/}}
+
+{{- if .Values.config.udm.deploy }}
+
+{{- if not .Values.config.useExistingConfigMap -}}
+{{- $udmcfg := index .Values.config.udm.cfgFiles "udmcfg.conf" }}
+{{- $sbi := index $udmcfg.configuration "sbi" }}
+
+{{- if not (hasKey $udmcfg "logger") -}}
+{{- $_ := .Values.config.logger | set $udmcfg "logger" -}}
+{{- end }}
+
+{{- if not (hasKey $sbi "port") -}}
+{{- $_ := .Values.config.udm.sbi.port | set $sbi "port" -}}
+{{- end }}
+{{- end }}
+
+---
+apiVersion: v1
+kind: ConfigMap
+metadata:
+ name: udm
+ labels:
+{{ tuple "udm" . | include "5g-control-plane.metadata_labels" | indent 4 }}
+data:
+ udm-run.sh: |
+{{ tuple "bin/_udm-run.sh.tpl" . | include "5g-control-plane.template" | indent 4 }}
+{{- if not .Values.config.useExistingConfigMap -}}
+{{- range $key, $value := .Values.config.udm.cfgFiles }}
+ {{ $key }}: |-
+{{ toYaml $value | indent 4 }}
+{{- end }}
+{{- end }}
+{{- end }}
diff --git a/5g-control-plane/templates/configmap-udr.yaml b/5g-control-plane/templates/configmap-udr.yaml
new file mode 100644
index 0000000..8bbac77
--- /dev/null
+++ b/5g-control-plane/templates/configmap-udr.yaml
@@ -0,0 +1,43 @@
+{{/*
+# Copyright 2020-present Open Networking Foundation
+
+# SPDX-License-Identifier: LicenseRef-ONF-Member-Only-1.0
+*/}}
+
+{{- if .Values.config.udr.deploy }}
+
+{{- if not .Values.config.useExistingConfigMap -}}
+{{- $udrcfg := index .Values.config.udr.cfgFiles "udrcfg.conf" }}
+{{- $config := index $udrcfg "configuration" }}
+{{- $sbi := index $config "sbi" }}
+
+{{- if not (hasKey $config "mongodb") -}}
+{{- $_ := dict "name" .Values.config.mongodb.name "url" .Values.config.mongodb.url | set $config "mongodb" -}}
+{{- end }}
+
+{{- if not (hasKey $udrcfg "logger") -}}
+{{- $_ := .Values.config.logger | set $udrcfg "logger" -}}
+{{- end }}
+
+{{- if not (hasKey $sbi "port") -}}
+{{- $_ := .Values.config.udr.sbi.port | set $sbi "port" -}}
+{{- end }}
+{{- end }}
+
+---
+apiVersion: v1
+kind: ConfigMap
+metadata:
+ name: udr
+ labels:
+{{ tuple "udr" . | include "5g-control-plane.metadata_labels" | indent 4 }}
+data:
+ udr-run.sh: |
+{{ tuple "bin/_udr-run.sh.tpl" . | include "5g-control-plane.template" | indent 4 }}
+{{- if not .Values.config.useExistingConfigMap -}}
+{{- range $key, $value := .Values.config.udr.cfgFiles }}
+ {{ $key }}: |-
+{{ toYaml $value | indent 4 }}
+{{- end }}
+{{- end }}
+{{- end }}
diff --git a/5g-control-plane/templates/configmap-webui.yaml b/5g-control-plane/templates/configmap-webui.yaml
new file mode 100644
index 0000000..07435ea
--- /dev/null
+++ b/5g-control-plane/templates/configmap-webui.yaml
@@ -0,0 +1,43 @@
+{{/*
+# Copyright 2020-present Open Networking Foundation
+
+# SPDX-License-Identifier: LicenseRef-ONF-Member-Only-1.0
+*/}}
+
+{{- if .Values.config.webui.deploy }}
+
+{{- if not .Values.config.useExistingConfigMap -}}
+{{- $webuicfg := index .Values.config.webui.cfgFiles "webuicfg.conf" }}
+{{- $config := index $webuicfg "configuration" }}
+
+{{- if not (hasKey $webuicfg "logger") -}}
+{{- $_ := .Values.config.logger | set $webuicfg "logger" -}}
+{{- end }}
+
+{{- if not (hasKey $config "managedByConfigPod") -}}
+{{- $_ := .Values.config.managedByConfigPod | set $config "managedByConfigPod" -}}
+{{- end }}
+
+{{- if not (hasKey $config "mongodb") -}}
+{{- $_ := dict "name" .Values.config.mongodb.name "url" .Values.config.mongodb.url | set $config "mongodb" -}}
+{{- end }}
+
+{{- end }}
+
+---
+apiVersion: v1
+kind: ConfigMap
+metadata:
+ name: webui
+ labels:
+{{ tuple "webui" . | include "5g-control-plane.metadata_labels" | indent 4 }}
+data:
+ webui-run.sh: |
+{{ tuple "bin/_webui-run.sh.tpl" . | include "5g-control-plane.template" | indent 4 }}
+{{- if not .Values.config.useExistingConfigMap -}}
+{{- range $key, $value := .Values.config.webui.cfgFiles }}
+ {{ $key }}: |-
+{{ toYaml $value | indent 4 }}
+{{- end }}
+{{- end }}
+{{- end }}
diff --git a/5g-control-plane/templates/deployment-amf.yaml b/5g-control-plane/templates/deployment-amf.yaml
new file mode 100644
index 0000000..05aa29c
--- /dev/null
+++ b/5g-control-plane/templates/deployment-amf.yaml
@@ -0,0 +1,103 @@
+{{/*
+# Copyright 2020-present Open Networking Foundation
+
+# SPDX-License-Identifier: LicenseRef-ONF-Member-Only-1.0
+*/}}
+
+{{- if .Values.config.amf.deploy }}
+{{ tuple "amf" . | include "5g-control-plane.service_account" }}
+---
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+ name: amf
+ labels:
+{{ tuple "amf" . | include "5g-control-plane.metadata_labels" | indent 4 }}
+spec:
+ replicas: 1
+ #serviceName: amf-headless
+ selector:
+ matchLabels:
+{{ tuple "amf" . | include "5g-control-plane.metadata_labels" | indent 6 }}
+ template:
+ metadata:
+ labels:
+{{ tuple "amf" . | include "5g-control-plane.metadata_labels" | indent 8 }}
+ {{- with .Values.config.amf.podAnnotations }}
+ annotations:
+ {{- toYaml . | nindent 8 }}
+ {{- end }}
+ spec:
+ serviceAccountName: amf
+ {{- if hasKey .Values.images "pullSecrets" }}
+ imagePullSecrets:
+{{ toYaml .Values.images.pullSecrets | indent 8 }}
+ {{- end }}
+ initContainers:
+ - name: wait-nrf-module
+ image: {{ .Values.images.tags.init | quote }}
+ imagePullPolicy: {{ .Values.images.pullPolicy }}
+ command: ['sh', '-c', 'until nslookup nrf; do echo waiting for nrf; sleep 4; done;']
+ {{- if .Values.config.coreDump.enabled }}
+{{ tuple "amf" . | include "5g-control-plane.coredump_init" | indent 6 }}
+ {{- end }}
+ containers:
+ - name: amf
+ image: {{ .Values.images.tags.amf }}
+ imagePullPolicy: {{ .Values.images.pullPolicy }}
+ {{- if .Values.config.coreDump.enabled }}
+ securityContext:
+ runAsUser: 0
+ {{- end }}
+ stdin: true
+ tty: true
+ command: ["/free5gc/script/amf-run.sh"]
+ env:
+ - name: GRPC_GO_LOG_VERBOSITY_LEVEL
+ value: {{ .Values.config.grpc.golog_verbosity | quote }}
+ - name: GRPC_GO_LOG_SEVERITY_LEVEL
+ value: {{ .Values.config.grpc.severity | quote }}
+ - name: GRPC_TRACE
+ value: {{ .Values.config.grpc.trace | quote }}
+ - name: GRPC_VERBOSITY
+ value: {{ .Values.config.grpc.verbosity | quote }}
+ - name: POD_IP
+ valueFrom:
+ fieldRef:
+ fieldPath: status.podIP
+ {{- if .Values.config.managedByConfigPod.enabled }}
+ - name: MANAGED_BY_CONFIG_POD
+ value: "true"
+ {{- end }}
+ {{- if .Values.resources.enabled }}
+ resources:
+{{ toYaml .Values.resources.amf | indent 10 }}
+ {{- end }}
+ volumeMounts:
+ - name: run-script
+ mountPath: /free5gc/script/amf-run.sh
+ subPath: amf-run.sh
+ - name: amf-config
+ mountPath: /free5gc/config
+ {{- if .Values.config.coreDump.enabled }}
+ - name: coredump
+ mountPath: /tmp/coredump
+ {{- end }}
+ volumes:
+ - name: run-script
+ configMap:
+ name: amf
+ defaultMode: 493
+ - name: amf-config
+ configMap:
+ name: amf
+ defaultMode: 493
+ {{- if .Values.config.coreDump.enabled }}
+ - name: host-rootfs
+ hostPath:
+ path: /
+ - name: coredump
+ hostPath:
+ path: {{ .Values.config.coreDump.path }}
+ {{- end }}
+{{- end }}
diff --git a/5g-control-plane/templates/deployment-ausf.yaml b/5g-control-plane/templates/deployment-ausf.yaml
new file mode 100644
index 0000000..295e198
--- /dev/null
+++ b/5g-control-plane/templates/deployment-ausf.yaml
@@ -0,0 +1,105 @@
+{{/*
+# Copyright 2020-present Open Networking Foundation
+
+# SPDX-License-Identifier: LicenseRef-ONF-Member-Only-1.0
+*/}}
+
+{{- if .Values.config.ausf.deploy }}
+{{ tuple "ausf" . | include "5g-control-plane.service_account" }}
+---
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+ name: ausf
+ labels:
+{{ tuple "ausf" . | include "5g-control-plane.metadata_labels" | indent 4 }}
+spec:
+ replicas: 1
+ #serviceName: ausf-headless
+ selector:
+ matchLabels:
+{{ tuple "ausf" . | include "5g-control-plane.metadata_labels" | indent 6 }}
+ template:
+ metadata:
+ labels:
+{{ tuple "ausf" . | include "5g-control-plane.metadata_labels" | indent 8 }}
+ {{- with .Values.config.ausf.podAnnotations }}
+ annotations:
+ helm.sh/hook: pre-install
+ helm.sh/hook-weight: "5"
+ {{- toYaml . | nindent 8 }}
+ {{- end }}
+ spec:
+ serviceAccountName: ausf
+ {{- if hasKey .Values.images "pullSecrets" }}
+ imagePullSecrets:
+{{ toYaml .Values.images.pullSecrets | indent 8 }}
+ {{- end }}
+ initContainers:
+ - name: wait-ausf-module2
+ image: {{ .Values.images.tags.init | quote }}
+ imagePullPolicy: {{ .Values.images.pullPolicy }}
+ command: ['sh', '-c', 'until nslookup ausf; do echo waiting for ausf; sleep 4; done;']
+ {{- if .Values.config.coreDump.enabled }}
+{{ tuple "ausf" . | include "5g-control-plane.coredump_init" | indent 6 }}
+ {{- end }}
+ containers:
+ - name: ausf
+ image: {{ .Values.images.tags.ausf }}
+ imagePullPolicy: {{ .Values.images.pullPolicy }}
+ {{- if .Values.config.coreDump.enabled }}
+ securityContext:
+ runAsUser: 0
+ {{- end }}
+ stdin: true
+ tty: true
+ command: ["/free5gc/script/ausf-run.sh"]
+ env:
+ - name: GRPC_GO_LOG_VERBOSITY_LEVEL
+ value: {{ .Values.config.grpc.golog_verbosity | quote }}
+ - name: GRPC_GO_LOG_SEVERITY_LEVEL
+ value: {{ .Values.config.grpc.severity | quote }}
+ - name: GRPC_TRACE
+ value: {{ .Values.config.grpc.trace | quote }}
+ - name: GRPC_VERBOSITY
+ value: {{ .Values.config.grpc.verbosity | quote }}
+ - name: POD_IP
+ valueFrom:
+ fieldRef:
+ fieldPath: status.podIP
+ {{- if .Values.config.managedByConfigPod.enabled }}
+ - name: MANAGED_BY_CONFIG_POD
+ value: "true"
+ {{- end }}
+ {{- if .Values.resources.enabled }}
+ resources:
+{{ toYaml .Values.resources.ausf | indent 10 }}
+ {{- end }}
+ volumeMounts:
+ - name: run-script
+ mountPath: /free5gc/script/ausf-run.sh
+ subPath: ausf-run.sh
+ - name: nf-config
+ mountPath: /free5gc/config
+ {{- if .Values.config.coreDump.enabled }}
+ - name: coredump
+ mountPath: /tmp/coredump
+ {{- end }}
+ volumes:
+ - name: run-script
+ configMap:
+ name: ausf
+ defaultMode: 493
+ - name: nf-config
+ configMap:
+ name: ausf
+ defaultMode: 493
+ {{- if .Values.config.coreDump.enabled }}
+ - name: host-rootfs
+ hostPath:
+ path: /
+ - name: coredump
+ hostPath:
+ path: {{ .Values.config.coreDump.path }}
+ {{- end }}
+{{- end }}
diff --git a/5g-control-plane/templates/deployment-nrf.yaml b/5g-control-plane/templates/deployment-nrf.yaml
new file mode 100644
index 0000000..80075f8
--- /dev/null
+++ b/5g-control-plane/templates/deployment-nrf.yaml
@@ -0,0 +1,101 @@
+{{/*
+# Copyright 2020-present Open Networking Foundation
+
+# SPDX-License-Identifier: LicenseRef-ONF-Member-Only-1.0
+*/}}
+
+{{- if .Values.config.nrf.deploy }}
+{{ tuple "nrf" . | include "5g-control-plane.service_account" }}
+---
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+ name: nrf
+ labels:
+{{ tuple "nrf" . | include "5g-control-plane.metadata_labels" | indent 4 }}
+spec:
+ replicas: 1
+ #serviceName: nrf-headless
+ selector:
+ matchLabels:
+{{ tuple "nrf" . | include "5g-control-plane.metadata_labels" | indent 6 }}
+ template:
+ metadata:
+ labels:
+{{ tuple "nrf" . | include "5g-control-plane.metadata_labels" | indent 8 }}
+ {{- with .Values.config.nrf.podAnnotations }}
+ annotations:
+ helm.sh/hook: pre-install
+ helm.sh/hook-weight: "2"
+ {{- toYaml . | nindent 8 }}
+ {{- end }}
+ spec:
+ serviceAccountName: nrf
+ {{- if hasKey .Values.images "pullSecrets" }}
+ imagePullSecrets:
+{{ toYaml .Values.images.pullSecrets | indent 8 }}
+ {{- end }}
+ {{- if .Values.config.coreDump.enabled }}
+ initContainers:
+{{ tuple "nrf" . | include "5g-control-plane.coredump_init" | indent 6 }}
+ {{- end }}
+ containers:
+ - name: nrf
+ image: {{ .Values.images.tags.nrf }}
+ imagePullPolicy: {{ .Values.images.pullPolicy }}
+ {{- if .Values.config.coreDump.enabled }}
+ securityContext:
+ runAsUser: 0
+ {{- end }}
+ stdin: true
+ tty: true
+ command: ["/free5gc/script/nrf-run.sh"]
+ env:
+ - name: GRPC_GO_LOG_VERBOSITY_LEVEL
+ value: {{ .Values.config.grpc.golog_verbosity | quote }}
+ - name: GRPC_GO_LOG_SEVERITY_LEVEL
+ value: {{ .Values.config.grpc.severity | quote }}
+ - name: GRPC_TRACE
+ value: {{ .Values.config.grpc.trace | quote }}
+ - name: GRPC_VERBOSITY
+ value: {{ .Values.config.grpc.verbosity | quote }}
+ - name: POD_IP
+ valueFrom:
+ fieldRef:
+ fieldPath: status.podIP
+ {{- if .Values.config.managedByConfigPod.enabled }}
+ - name: MANAGED_BY_CONFIG_POD
+ value: "true"
+ {{- end }}
+ {{- if .Values.resources.enabled }}
+ resources:
+{{ toYaml .Values.resources.nrf | indent 10 }}
+ {{- end }}
+ volumeMounts:
+ - name: run-script
+ mountPath: /free5gc/script/nrf-run.sh
+ subPath: nrf-run.sh
+ - name: nf-config
+ mountPath: /free5gc/config
+ {{- if .Values.config.coreDump.enabled }}
+ - name: coredump
+ mountPath: /tmp/coredump
+ {{- end }}
+ volumes:
+ - name: run-script
+ configMap:
+ name: nrf
+ defaultMode: 493
+ - name: nf-config
+ configMap:
+ name: nrf
+ defaultMode: 493
+ {{- if .Values.config.coreDump.enabled }}
+ - name: host-rootfs
+ hostPath:
+ path: /
+ - name: coredump
+ hostPath:
+ path: {{ .Values.config.coreDump.path }}
+ {{- end }}
+{{- end }}
diff --git a/5g-control-plane/templates/deployment-nssf.yaml b/5g-control-plane/templates/deployment-nssf.yaml
new file mode 100644
index 0000000..2cce254
--- /dev/null
+++ b/5g-control-plane/templates/deployment-nssf.yaml
@@ -0,0 +1,103 @@
+{{/*
+# Copyright 2020-present Open Networking Foundation
+
+# SPDX-License-Identifier: LicenseRef-ONF-Member-Only-1.0
+*/}}
+
+{{- if .Values.config.nssf.deploy }}
+{{ tuple "nssf" . | include "5g-control-plane.service_account" }}
+---
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+ name: nssf
+ labels:
+{{ tuple "nssf" . | include "5g-control-plane.metadata_labels" | indent 4 }}
+spec:
+ replicas: 1
+ #serviceName: nssf-headless
+ selector:
+ matchLabels:
+{{ tuple "nssf" . | include "5g-control-plane.metadata_labels" | indent 6 }}
+ template:
+ metadata:
+ labels:
+{{ tuple "nssf" . | include "5g-control-plane.metadata_labels" | indent 8 }}
+ {{- with .Values.config.nssf.podAnnotations }}
+ annotations:
+ {{- toYaml . | nindent 8 }}
+ {{- end }}
+ spec:
+ serviceAccountName: nssf
+ {{- if hasKey .Values.images "pullSecrets" }}
+ imagePullSecrets:
+{{ toYaml .Values.images.pullSecrets | indent 8 }}
+ {{- end }}
+ initContainers:
+ - name: wait-nssf-module
+ image: {{ .Values.images.tags.init | quote }}
+ imagePullPolicy: {{ .Values.images.pullPolicy }}
+ command: ['sh', '-c', 'until nslookup nssf; do echo waiting for nssf; sleep 4; done;']
+ {{- if .Values.config.coreDump.enabled }}
+{{ tuple "nssf" . | include "5g-control-plane.coredump_init" | indent 6 }}
+ {{- end }}
+ containers:
+ - name: nssf
+ image: {{ .Values.images.tags.nssf }}
+ imagePullPolicy: {{ .Values.images.pullPolicy }}
+ {{- if .Values.config.coreDump.enabled }}
+ securityContext:
+ runAsUser: 0
+ {{- end }}
+ stdin: true
+ tty: true
+ command: ["/free5gc/script/nssf-run.sh"]
+ env:
+ - name: GRPC_GO_LOG_VERBOSITY_LEVEL
+ value: {{ .Values.config.grpc.golog_verbosity | quote }}
+ - name: GRPC_GO_LOG_SEVERITY_LEVEL
+ value: {{ .Values.config.grpc.severity | quote }}
+ - name: GRPC_TRACE
+ value: {{ .Values.config.grpc.trace | quote }}
+ - name: GRPC_VERBOSITY
+ value: {{ .Values.config.grpc.verbosity | quote }}
+ - name: POD_IP
+ valueFrom:
+ fieldRef:
+ fieldPath: status.podIP
+ {{- if .Values.config.managedByConfigPod.enabled }}
+ - name: MANAGED_BY_CONFIG_POD
+ value: "true"
+ {{- end }}
+ {{- if .Values.resources.enabled }}
+ resources:
+{{ toYaml .Values.resources.nssf | indent 10 }}
+ {{- end }}
+ volumeMounts:
+ - name: run-script
+ mountPath: /free5gc/script/nssf-run.sh
+ subPath: nssf-run.sh
+ - name: nf-config
+ mountPath: /free5gc/config
+ {{- if .Values.config.coreDump.enabled }}
+ - name: coredump
+ mountPath: /tmp/coredump
+ {{- end }}
+ volumes:
+ - name: run-script
+ configMap:
+ name: nssf
+ defaultMode: 493
+ - name: nf-config
+ configMap:
+ name: nssf
+ defaultMode: 493
+ {{- if .Values.config.coreDump.enabled }}
+ - name: host-rootfs
+ hostPath:
+ path: /
+ - name: coredump
+ hostPath:
+ path: {{ .Values.config.coreDump.path }}
+ {{- end }}
+{{- end }}
diff --git a/5g-control-plane/templates/deployment-pcf.yaml b/5g-control-plane/templates/deployment-pcf.yaml
new file mode 100644
index 0000000..6829ffe
--- /dev/null
+++ b/5g-control-plane/templates/deployment-pcf.yaml
@@ -0,0 +1,103 @@
+{{/*
+# Copyright 2020-present Open Networking Foundation
+
+# SPDX-License-Identifier: LicenseRef-ONF-Member-Only-1.0
+*/}}
+
+{{- if .Values.config.pcf.deploy }}
+{{ tuple "pcf" . | include "5g-control-plane.service_account" }}
+---
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+ name: pcf
+ labels:
+{{ tuple "pcf" . | include "5g-control-plane.metadata_labels" | indent 4 }}
+spec:
+ replicas: 1
+ #serviceName: pcf-headless
+ selector:
+ matchLabels:
+{{ tuple "pcf" . | include "5g-control-plane.metadata_labels" | indent 6 }}
+ template:
+ metadata:
+ labels:
+{{ tuple "pcf" . | include "5g-control-plane.metadata_labels" | indent 8 }}
+ {{- with .Values.config.pcf.podAnnotations }}
+ annotations:
+ {{- toYaml . | nindent 8 }}
+ {{- end }}
+ spec:
+ serviceAccountName: pcf
+ {{- if hasKey .Values.images "pullSecrets" }}
+ imagePullSecrets:
+{{ toYaml .Values.images.pullSecrets | indent 8 }}
+ {{- end }}
+ initContainers:
+ - name: wait-pcf-module
+ image: {{ .Values.images.tags.init | quote }}
+ imagePullPolicy: {{ .Values.images.pullPolicy }}
+ command: ['sh', '-c', 'until nslookup pcf; do echo waiting for pcf; sleep 4; done;']
+ {{- if .Values.config.coreDump.enabled }}
+{{ tuple "pcf" . | include "5g-control-plane.coredump_init" | indent 6 }}
+ {{- end }}
+ containers:
+ - name: pcf
+ image: {{ .Values.images.tags.pcf }}
+ imagePullPolicy: {{ .Values.images.pullPolicy }}
+ {{- if .Values.config.coreDump.enabled }}
+ securityContext:
+ runAsUser: 0
+ {{- end }}
+ stdin: true
+ tty: true
+ command: ["/free5gc/script/pcf-run.sh"]
+ env:
+ - name: GRPC_GO_LOG_VERBOSITY_LEVEL
+ value: {{ .Values.config.grpc.golog_verbosity | quote }}
+ - name: GRPC_GO_LOG_SEVERITY_LEVEL
+ value: {{ .Values.config.grpc.severity | quote }}
+ - name: GRPC_TRACE
+ value: {{ .Values.config.grpc.trace | quote }}
+ - name: GRPC_VERBOSITY
+ value: {{ .Values.config.grpc.verbosity | quote }}
+ - name: POD_IP
+ valueFrom:
+ fieldRef:
+ fieldPath: status.podIP
+ {{- if .Values.config.managedByConfigPod.enabled }}
+ - name: MANAGED_BY_CONFIG_POD
+ value: "true"
+ {{- end }}
+ {{- if .Values.resources.enabled }}
+ resources:
+{{ toYaml .Values.resources.pcf | indent 10 }}
+ {{- end }}
+ volumeMounts:
+ - name: run-script
+ mountPath: /free5gc/script/pcf-run.sh
+ subPath: pcf-run.sh
+ - name: nf-config
+ mountPath: /free5gc/config
+ {{- if .Values.config.coreDump.enabled }}
+ - name: coredump
+ mountPath: /tmp/coredump
+ {{- end }}
+ volumes:
+ - name: run-script
+ configMap:
+ name: pcf
+ defaultMode: 493
+ - name: nf-config
+ configMap:
+ name: pcf
+ defaultMode: 493
+ {{- if .Values.config.coreDump.enabled }}
+ - name: host-rootfs
+ hostPath:
+ path: /
+ - name: coredump
+ hostPath:
+ path: {{ .Values.config.coreDump.path }}
+ {{- end }}
+{{- end }}
diff --git a/5g-control-plane/templates/deployment-smf.yaml b/5g-control-plane/templates/deployment-smf.yaml
new file mode 100644
index 0000000..296bc50
--- /dev/null
+++ b/5g-control-plane/templates/deployment-smf.yaml
@@ -0,0 +1,107 @@
+{{/*
+# Copyright 2020-present Open Networking Foundation
+
+# SPDX-License-Identifier: LicenseRef-ONF-Member-Only-1.0
+*/}}
+
+{{- if .Values.config.smf.deploy }}
+{{ tuple "smf" . | include "5g-control-plane.service_account" }}
+---
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+ name: smf
+ labels:
+{{ tuple "smf" . | include "5g-control-plane.metadata_labels" | indent 4 }}
+spec:
+ replicas: 1
+ #serviceName: smf-headless
+ selector:
+ matchLabels:
+{{ tuple "smf" . | include "5g-control-plane.metadata_labels" | indent 6 }}
+ template:
+ metadata:
+ labels:
+{{ tuple "smf" . | include "5g-control-plane.metadata_labels" | indent 8 }}
+ {{- with .Values.config.smf.podAnnotations }}
+ annotations:
+ helm.sh/hook: pre-install
+ helm.sh/hook-weight: "5"
+ {{- toYaml . | nindent 8 }}
+ {{- end }}
+ spec:
+ serviceAccountName: smf
+ {{- if hasKey .Values.images "pullSecrets" }}
+ imagePullSecrets:
+{{ toYaml .Values.images.pullSecrets | indent 8 }}
+ {{- end }}
+ initContainers:
+ - name: wait-smf-module
+ image: {{ .Values.images.tags.init | quote }}
+ imagePullPolicy: {{ .Values.images.pullPolicy }}
+ command: ['sh', '-c', 'until nslookup smf; do echo waiting for smf; sleep 4; done;']
+ {{- if .Values.config.coreDump.enabled }}
+{{ tuple "smf" . | include "5g-control-plane.coredump_init" | indent 6 }}
+ {{- end }}
+ containers:
+ - name: smf
+ image: {{ .Values.images.tags.smf }}
+ imagePullPolicy: {{ .Values.images.pullPolicy }}
+ {{- if .Values.config.coreDump.enabled }}
+ securityContext:
+ runAsUser: 0
+ {{- end }}
+ stdin: true
+ tty: true
+ command: ["/free5gc/script/smf-run.sh"]
+ env:
+ - name: GRPC_GO_LOG_VERBOSITY_LEVEL
+ value: {{ .Values.config.grpc.golog_verbosity | quote }}
+ - name: GRPC_GO_LOG_SEVERITY_LEVEL
+ value: {{ .Values.config.grpc.severity | quote }}
+ - name: GRPC_TRACE
+ value: {{ .Values.config.grpc.trace | quote }}
+ - name: GRPC_VERBOSITY
+ value: {{ .Values.config.grpc.verbosity | quote }}
+ - name: POD_IP
+ valueFrom:
+ fieldRef:
+ fieldPath: status.podIP
+ {{- if .Values.config.managedByConfigPod.enabled }}
+ - name: MANAGED_BY_CONFIG_POD
+ value: "true"
+ {{- end }}
+ {{- if .Values.resources.enabled }}
+ resources:
+{{ toYaml .Values.resources.smf | indent 10 }}
+ {{- end }}
+ volumeMounts:
+ - name: run-script
+ mountPath: /free5gc/script/smf-run.sh
+ subPath: smf-run.sh
+ - name: nf-config
+ mountPath: /free5gc/uerouting
+ - name: nf-config
+ mountPath: /free5gc/config
+ {{- if .Values.config.coreDump.enabled }}
+ - name: coredump
+ mountPath: /tmp/coredump
+ {{- end }}
+ volumes:
+ - name: run-script
+ configMap:
+ name: smf
+ defaultMode: 493
+ - name: nf-config
+ configMap:
+ name: smf
+ defaultMode: 493
+ {{- if .Values.config.coreDump.enabled }}
+ - name: host-rootfs
+ hostPath:
+ path: /
+ - name: coredump
+ hostPath:
+ path: {{ .Values.config.coreDump.path }}
+ {{- end }}
+{{- end }}
diff --git a/5g-control-plane/templates/deployment-udm.yaml b/5g-control-plane/templates/deployment-udm.yaml
new file mode 100644
index 0000000..2714ef0
--- /dev/null
+++ b/5g-control-plane/templates/deployment-udm.yaml
@@ -0,0 +1,109 @@
+{{/*
+# Copyright 2020-present Open Networking Foundation
+
+# SPDX-License-Identifier: LicenseRef-ONF-Member-Only-1.0
+*/}}
+
+{{- if .Values.config.udm.deploy }}
+{{ tuple "udm" . | include "5g-control-plane.service_account" }}
+---
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+ name: udm
+ labels:
+{{ tuple "udm" . | include "5g-control-plane.metadata_labels" | indent 4 }}
+spec:
+ replicas: 1
+ #serviceName: udm-headless
+ selector:
+ matchLabels:
+{{ tuple "udm" . | include "5g-control-plane.metadata_labels" | indent 6 }}
+ template:
+ metadata:
+ labels:
+{{ tuple "udm" . | include "5g-control-plane.metadata_labels" | indent 8 }}
+ {{- with .Values.config.udm.podAnnotations }}
+ annotations:
+ {{- toYaml . | nindent 8 }}
+ {{- end }}
+ spec:
+ serviceAccountName: udm
+ {{- if hasKey .Values.images "pullSecrets" }}
+ imagePullSecrets:
+{{ toYaml .Values.images.pullSecrets | indent 8 }}
+ {{- end }}
+ initContainers:
+ - name: wait-udm-module
+ image: {{ .Values.images.tags.init | quote }}
+ imagePullPolicy: {{ .Values.images.pullPolicy }}
+ command: ['sh', '-c', 'until nslookup udm; do echo waiting for udm; sleep 4; done;']
+ - name: wait-udr-module
+ image: {{ .Values.images.tags.init | quote }}
+ imagePullPolicy: {{ .Values.images.pullPolicy }}
+ command: ['sh', '-c', 'until nslookup udr; do echo waiting for udr; sleep 4; done;']
+ {{- if .Values.config.coreDump.enabled }}
+{{ tuple "udm" . | include "5g-control-plane.coredump_init" | indent 6 }}
+ {{- end }}
+ containers:
+ - name: udm
+ image: {{ .Values.images.tags.udm }}
+ imagePullPolicy: {{ .Values.images.pullPolicy }}
+ {{- if .Values.config.coreDump.enabled }}
+ securityContext:
+ runAsUser: 0
+ {{- end }}
+ stdin: true
+ tty: true
+ command: ["/free5gc/script/udm-run.sh"]
+ env:
+ - name: GRPC_GO_LOG_VERBOSITY_LEVEL
+ value: {{ .Values.config.grpc.golog_verbosity | quote }}
+ - name: GRPC_GO_LOG_SEVERITY_LEVEL
+ value: {{ .Values.config.grpc.severity | quote }}
+ - name: GRPC_TRACE
+ value: {{ .Values.config.grpc.trace | quote }}
+ - name: GRPC_VERBOSITY
+ value: {{ .Values.config.grpc.verbosity | quote }}
+ - name: POD_IP
+ valueFrom:
+ fieldRef:
+ fieldPath: status.podIP
+ {{- if .Values.config.managedByConfigPod.enabled }}
+ - name: MANAGED_BY_CONFIG_POD
+ value: "true"
+ {{- end }}
+ {{- if .Values.resources.enabled }}
+ resources:
+{{ toYaml .Values.resources.udm | indent 10 }}
+ {{- end }}
+ volumeMounts:
+ - name: run-script
+ mountPath: /free5gc/script/udm-run.sh
+ subPath: udm-run.sh
+ - name: nf-config
+ mountPath: /free5gc/config
+ {{- if .Values.config.coreDump.enabled }}
+ - name: coredump
+ mountPath: /tmp/coredump
+ {{- end }}
+ volumes:
+ - name: run-script
+ configMap:
+ name: udm
+ defaultMode: 493
+ - name: nf-config
+ configMap:
+ name: udm
+ defaultMode: 493
+ - name: config-dir
+ emptyDir: {}
+ {{- if .Values.config.coreDump.enabled }}
+ - name: host-rootfs
+ hostPath:
+ path: /
+ - name: coredump
+ hostPath:
+ path: {{ .Values.config.coreDump.path }}
+ {{- end }}
+{{- end }}
diff --git a/5g-control-plane/templates/deployment-udr.yaml b/5g-control-plane/templates/deployment-udr.yaml
new file mode 100644
index 0000000..abe6e64
--- /dev/null
+++ b/5g-control-plane/templates/deployment-udr.yaml
@@ -0,0 +1,103 @@
+{{/*
+# Copyright 2020-present Open Networking Foundation
+
+# SPDX-License-Identifier: LicenseRef-ONF-Member-Only-1.0
+*/}}
+
+{{- if .Values.config.udr.deploy }}
+{{ tuple "udr" . | include "5g-control-plane.service_account" }}
+---
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+ name: udr
+ labels:
+{{ tuple "udr" . | include "5g-control-plane.metadata_labels" | indent 4 }}
+spec:
+ replicas: 1
+ #serviceName: udr-headless
+ selector:
+ matchLabels:
+{{ tuple "udr" . | include "5g-control-plane.metadata_labels" | indent 6 }}
+ template:
+ metadata:
+ labels:
+{{ tuple "udr" . | include "5g-control-plane.metadata_labels" | indent 8 }}
+ {{- with .Values.config.udr.podAnnotations }}
+ annotations:
+ {{- toYaml . | nindent 8 }}
+ {{- end }}
+ spec:
+ serviceAccountName: udr
+ {{- if hasKey .Values.images "pullSecrets" }}
+ imagePullSecrets:
+{{ toYaml .Values.images.pullSecrets | indent 8 }}
+ {{- end }}
+ initContainers:
+ - name: wait-udr-module
+ image: {{ .Values.images.tags.init | quote }}
+ imagePullPolicy: {{ .Values.images.pullPolicy }}
+ command: ['sh', '-c', 'until nslookup udr; do echo waiting for udr; sleep 4; done;']
+ {{- if .Values.config.coreDump.enabled }}
+{{ tuple "udr" . | include "5g-control-plane.coredump_init" | indent 6 }}
+ {{- end }}
+ containers:
+ - name: udr
+ image: {{ .Values.images.tags.udr }}
+ imagePullPolicy: {{ .Values.images.pullPolicy }}
+ {{- if .Values.config.coreDump.enabled }}
+ securityContext:
+ runAsUser: 0
+ {{- end }}
+ stdin: true
+ tty: true
+ command: ["/free5gc/script/udr-run.sh"]
+ env:
+ - name: GRPC_GO_LOG_VERBOSITY_LEVEL
+ value: {{ .Values.config.grpc.golog_verbosity | quote }}
+ - name: GRPC_GO_LOG_SEVERITY_LEVEL
+ value: {{ .Values.config.grpc.severity | quote }}
+ - name: GRPC_TRACE
+ value: {{ .Values.config.grpc.trace | quote }}
+ - name: GRPC_VERBOSITY
+ value: {{ .Values.config.grpc.verbosity | quote }}
+ - name: POD_IP
+ valueFrom:
+ fieldRef:
+ fieldPath: status.podIP
+ {{- if .Values.config.managedByConfigPod.enabled }}
+ - name: MANAGED_BY_CONFIG_POD
+ value: "true"
+ {{- end }}
+ {{- if .Values.resources.enabled }}
+ resources:
+{{ toYaml .Values.resources.udr | indent 10 }}
+ {{- end }}
+ volumeMounts:
+ - name: run-script
+ mountPath: /free5gc/script/udr-run.sh
+ subPath: udr-run.sh
+ - name: nf-config
+ mountPath: /free5gc/config
+ {{- if .Values.config.coreDump.enabled }}
+ - name: coredump
+ mountPath: /tmp/coredump
+ {{- end }}
+ volumes:
+ - name: run-script
+ configMap:
+ name: udr
+ defaultMode: 493
+ - name: nf-config
+ configMap:
+ name: udr
+ defaultMode: 493
+ {{- if .Values.config.coreDump.enabled }}
+ - name: host-rootfs
+ hostPath:
+ path: /
+ - name: coredump
+ hostPath:
+ path: {{ .Values.config.coreDump.path }}
+ {{- end }}
+{{- end }}
diff --git a/5g-control-plane/templates/deployment-webui.yaml b/5g-control-plane/templates/deployment-webui.yaml
new file mode 100644
index 0000000..c71becb
--- /dev/null
+++ b/5g-control-plane/templates/deployment-webui.yaml
@@ -0,0 +1,96 @@
+{{/*
+# Copyright 2020-present Open Networking Foundation
+
+# SPDX-License-Identifier: LicenseRef-ONF-Member-Only-1.0
+*/}}
+
+{{- if .Values.config.webui.deploy }}
+{{ tuple "webui" . | include "5g-control-plane.service_account" }}
+---
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+ name: webui
+ labels:
+{{ tuple "webui" . | include "5g-control-plane.metadata_labels" | indent 4 }}
+spec:
+ replicas: 1
+ selector:
+ matchLabels:
+{{ tuple "webui" . | include "5g-control-plane.metadata_labels" | indent 6 }}
+ template:
+ metadata:
+ labels:
+{{ tuple "webui" . | include "5g-control-plane.metadata_labels" | indent 8 }}
+ {{- with .Values.config.webui.podAnnotations }}
+ annotations:
+ {{- toYaml . | nindent 8 }}
+ {{- end }}
+ spec:
+ serviceAccountName: webui
+ {{- if hasKey .Values.images "pullSecrets" }}
+ imagePullSecrets:
+{{ toYaml .Values.images.pullSecrets | indent 8 }}
+ {{- end }}
+ initContainers:
+ - name: wait-webui-module
+ image: {{ .Values.images.tags.init | quote }}
+ imagePullPolicy: {{ .Values.images.pullPolicy }}
+ command: ['sh', '-c', 'until nslookup webui; do echo waiting for webui; sleep 4; done;']
+ {{- if .Values.config.coreDump.enabled }}
+{{ tuple "webui" . | include "5g-control-plane.coredump_init" | indent 6 }}
+ {{- end }}
+ containers:
+ - name: webui
+ image: {{ .Values.images.tags.webui }}
+ env:
+ - name: GRPC_GO_LOG_VERBOSITY_LEVEL
+ value: {{ .Values.config.grpc.golog_verbosity | quote }}
+ - name: GRPC_GO_LOG_SEVERITY_LEVEL
+ value: {{ .Values.config.grpc.severity | quote }}
+ - name: GRPC_TRACE
+ value: {{ .Values.config.grpc.trace | quote }}
+ - name: GRPC_VERBOSITY
+ value: {{ .Values.config.grpc.verbosity | quote }}
+ - name: CONFIGPOD_DEPLOYMENT
+ value: "5G"
+ imagePullPolicy: {{ .Values.images.pullPolicy }}
+ {{- if .Values.config.coreDump.enabled }}
+ securityContext:
+ runAsUser: 0
+ {{- end }}
+ stdin: true
+ tty: true
+ command: ["/free5gc/script/webui-run.sh"]
+ {{- if .Values.resources.enabled }}
+ resources:
+{{ toYaml .Values.resources.webui | indent 10 }}
+ {{- end }}
+ volumeMounts:
+ - name: run-script
+ mountPath: /free5gc/script/webui-run.sh
+ subPath: webui-run.sh
+ - name: nf-config
+ mountPath: /free5gc/config
+ {{- if .Values.config.coreDump.enabled }}
+ - name: coredump
+ mountPath: /tmp/coredump
+ {{- end }}
+ volumes:
+ - name: run-script
+ configMap:
+ name: webui
+ defaultMode: 493
+ - name: nf-config
+ configMap:
+ name: webui
+ defaultMode: 493
+ {{- if .Values.config.coreDump.enabled }}
+ - name: host-rootfs
+ hostPath:
+ path: /
+ - name: coredump
+ hostPath:
+ path: {{ .Values.config.coreDump.path }}
+ {{- end }}
+{{- end }}
diff --git a/5g-control-plane/templates/ingress-webui.yaml b/5g-control-plane/templates/ingress-webui.yaml
new file mode 100644
index 0000000..b41c736
--- /dev/null
+++ b/5g-control-plane/templates/ingress-webui.yaml
@@ -0,0 +1,26 @@
+{{/*
+# Copyright 2020-present Open Networking Foundation
+
+# SPDX-License-Identifier: LicenseRef-ONF-Member-Only-1.0
+*/}}
+
+{{- if .Values.config.webui.ingress.enabled }}
+apiVersion: networking.k8s.io/v1
+kind: Ingress
+metadata:
+ name: webui
+ labels:
+{{ tuple "webui" . | include "5g-control-plane.metadata_labels" | indent 4 }}
+spec:
+ rules:
+ - host: {{ .Values.config.webui.ingress.hostname }}
+ http:
+ paths:
+ - path: {{ .Values.config.webui.ingress.path }}
+ pathType: {{ .Values.config.webui.ingress.pathType }}
+ backend:
+ service:
+ name: webui
+ port:
+ number: {{ .Values.config.webui.urlport.port }}
+{{- end }}
\ No newline at end of file
diff --git a/5g-control-plane/templates/service-amf.yaml b/5g-control-plane/templates/service-amf.yaml
new file mode 100644
index 0000000..d02f57f
--- /dev/null
+++ b/5g-control-plane/templates/service-amf.yaml
@@ -0,0 +1,48 @@
+{{/*
+# Copyright 2020-present Open Networking Foundation
+
+# SPDX-License-Identifier: LicenseRef-ONF-Member-Only-1.0
+*/}}
+
+{{- if .Values.config.amf.deploy }}
+---
+apiVersion: v1
+kind: Service
+metadata:
+ name: amf
+ labels:
+{{ tuple "amf" . | include "5g-control-plane.metadata_labels" | indent 4 }}
+spec:
+ type: {{ .Values.config.amf.serviceType }}
+{{- if .Values.config.amf.ngapp.externalIp }}
+ externalIPs:
+ - {{ .Values.config.amf.ngapp.externalIp }}
+{{- end }}
+ selector:
+{{ tuple "amf" . | include "5g-control-plane.metadata_labels" | indent 4 }}
+ ports:
+ - name: prometheus-exporter
+ port: {{ .Values.config.amf.prometheus.port }}
+ protocol: TCP
+{{- if eq .Values.config.amf.serviceType "NodePort" }}
+{{- if .Values.config.amf.prometheus.nodePort }}
+ nodePort: {{ .Values.config.amf.prometheus.nodePort }}
+{{- end }}
+{{- end }}
+ - name: sbi
+ port: {{ .Values.config.amf.sbi.port }}
+ protocol: TCP
+{{- if eq .Values.config.amf.serviceType "NodePort" }}
+{{- if .Values.config.amf.sbi.nodePort }}
+ nodePort: {{ .Values.config.amf.sbi.nodePort }}
+{{- end }}
+{{- end }}
+ - name: ngapp
+ port: {{ .Values.config.amf.ngapp.port }}
+ protocol: SCTP
+{{- if eq .Values.config.amf.serviceType "NodePort" }}
+{{- if .Values.config.amf.ngapp.nodePort }}
+ nodePort: {{ .Values.config.amf.ngapp.nodePort }}
+{{- end }}
+{{- end }}
+{{- end }}
diff --git a/5g-control-plane/templates/service-ausf.yaml b/5g-control-plane/templates/service-ausf.yaml
new file mode 100644
index 0000000..a7c815d
--- /dev/null
+++ b/5g-control-plane/templates/service-ausf.yaml
@@ -0,0 +1,28 @@
+{{/*
+# Copyright 2020-present Open Networking Foundation
+
+# SPDX-License-Identifier: LicenseRef-ONF-Member-Only-1.0
+*/}}
+
+{{- if .Values.config.ausf.deploy }}
+---
+apiVersion: v1
+kind: Service
+metadata:
+ name: ausf
+ labels:
+{{ tuple "ausf" . | include "5g-control-plane.metadata_labels" | indent 4 }}
+spec:
+ type: {{ .Values.config.ausf.serviceType }}
+ selector:
+{{ tuple "ausf" . | include "5g-control-plane.metadata_labels" | indent 4 }}
+ ports:
+ - name: sbi
+ port: {{ .Values.config.ausf.sbi.port }}
+ protocol: TCP
+{{- if eq .Values.config.ausf.serviceType "NodePort" }}
+{{- if .Values.config.ausf.sbi.nodePort }}
+ nodePort: {{ .Values.config.ausf.sbi.nodePort }}
+{{- end }}
+{{- end }}
+{{- end }}
diff --git a/5g-control-plane/templates/service-nrf.yaml b/5g-control-plane/templates/service-nrf.yaml
new file mode 100644
index 0000000..07fcfe3
--- /dev/null
+++ b/5g-control-plane/templates/service-nrf.yaml
@@ -0,0 +1,28 @@
+{{/*
+# Copyright 2020-present Open Networking Foundation
+
+# SPDX-License-Identifier: LicenseRef-ONF-Member-Only-1.0
+*/}}
+
+{{- if .Values.config.nrf.deploy }}
+---
+apiVersion: v1
+kind: Service
+metadata:
+ name: nrf
+ labels:
+{{ tuple "nrf" . | include "5g-control-plane.metadata_labels" | indent 4 }}
+spec:
+ type: {{ .Values.config.nrf.serviceType }}
+ selector:
+{{ tuple "nrf" . | include "5g-control-plane.metadata_labels" | indent 4 }}
+ ports:
+ - name: sbi
+ port: {{ .Values.config.nrf.sbi.port }}
+ protocol: TCP
+{{- if eq .Values.config.nrf.serviceType "NodePort" }}
+{{- if .Values.config.nrf.sbi.nodePort }}
+ nodePort: {{ .Values.config.nrf.sbi.nodePort }}
+{{- end }}
+{{- end }}
+{{- end }}
diff --git a/5g-control-plane/templates/service-nssf.yaml b/5g-control-plane/templates/service-nssf.yaml
new file mode 100644
index 0000000..4bcfcde
--- /dev/null
+++ b/5g-control-plane/templates/service-nssf.yaml
@@ -0,0 +1,28 @@
+{{/*
+# Copyright 2020-present Open Networking Foundation
+
+# SPDX-License-Identifier: LicenseRef-ONF-Member-Only-1.0
+*/}}
+
+{{- if .Values.config.nssf.deploy }}
+---
+apiVersion: v1
+kind: Service
+metadata:
+ name: nssf
+ labels:
+{{ tuple "nssf" . | include "5g-control-plane.metadata_labels" | indent 4 }}
+spec:
+ type: {{ .Values.config.nssf.serviceType }}
+ selector:
+{{ tuple "nssf" . | include "5g-control-plane.metadata_labels" | indent 4 }}
+ ports:
+ - name: sbi
+ port: {{ .Values.config.nssf.sbi.port }}
+ protocol: TCP
+{{- if eq .Values.config.nssf.serviceType "NodePort" }}
+{{- if .Values.config.nssf.sbi.nodePort }}
+ nodePort: {{ .Values.config.nssf.sbi.nodePort }}
+{{- end }}
+{{- end }}
+{{- end }}
diff --git a/5g-control-plane/templates/service-pcf.yaml b/5g-control-plane/templates/service-pcf.yaml
new file mode 100644
index 0000000..1f9f7c4
--- /dev/null
+++ b/5g-control-plane/templates/service-pcf.yaml
@@ -0,0 +1,28 @@
+{{/*
+# Copyright 2020-present Open Networking Foundation
+
+# SPDX-License-Identifier: LicenseRef-ONF-Member-Only-1.0
+*/}}
+
+{{- if .Values.config.pcf.deploy }}
+---
+apiVersion: v1
+kind: Service
+metadata:
+ name: pcf
+ labels:
+{{ tuple "pcf" . | include "5g-control-plane.metadata_labels" | indent 4 }}
+spec:
+ type: {{ .Values.config.pcf.serviceType }}
+ selector:
+{{ tuple "pcf" . | include "5g-control-plane.metadata_labels" | indent 4 }}
+ ports:
+ - name: sbi
+ port: {{ .Values.config.pcf.sbi.port }}
+ protocol: TCP
+{{- if eq .Values.config.pcf.serviceType "NodePort" }}
+{{- if .Values.config.pcf.sbi.nodePort }}
+ nodePort: {{ .Values.config.pcf.sbi.nodePort }}
+{{- end }}
+{{- end }}
+{{- end }}
diff --git a/5g-control-plane/templates/service-smf.yaml b/5g-control-plane/templates/service-smf.yaml
new file mode 100644
index 0000000..6141455
--- /dev/null
+++ b/5g-control-plane/templates/service-smf.yaml
@@ -0,0 +1,44 @@
+{{/*
+# Copyright 2020-present Open Networking Foundation
+
+# SPDX-License-Identifier: LicenseRef-ONF-Member-Only-1.0
+*/}}
+
+{{- if .Values.config.smf.deploy }}
+---
+apiVersion: v1
+kind: Service
+metadata:
+ name: smf
+ labels:
+{{ tuple "smf" . | include "5g-control-plane.metadata_labels" | indent 4 }}
+spec:
+ type: {{ .Values.config.smf.serviceType }}
+ selector:
+{{ tuple "smf" . | include "5g-control-plane.metadata_labels" | indent 4 }}
+ ports:
+ - name: pfcp
+ port: {{ .Values.config.smf.n4.port }}
+ protocol: UDP
+{{- if eq .Values.config.smf.serviceType "NodePort" }}
+{{- if .Values.config.smf.n4.nodePort }}
+ nodePort: {{ .Values.config.smf.n4.nodePort }}
+{{- end }}
+{{- end }}
+ - name: prometheus-exporter
+ port: {{ .Values.config.smf.prometheus.port }}
+ protocol: TCP
+{{- if eq .Values.config.smf.serviceType "NodePort" }}
+{{- if .Values.config.smf.prometheus.nodePort }}
+ nodePort: {{ .Values.config.smf.prometheus.nodePort }}
+{{- end }}
+{{- end }}
+ - name: sbi
+ port: {{ .Values.config.smf.sbi.port }}
+ protocol: TCP
+{{- if eq .Values.config.smf.serviceType "NodePort" }}
+{{- if .Values.config.smf.sbi.nodePort }}
+ nodePort: {{ .Values.config.smf.sbi.nodePort }}
+{{- end }}
+{{- end }}
+{{- end }}
diff --git a/5g-control-plane/templates/service-udm.yaml b/5g-control-plane/templates/service-udm.yaml
new file mode 100644
index 0000000..fe6fdd9
--- /dev/null
+++ b/5g-control-plane/templates/service-udm.yaml
@@ -0,0 +1,28 @@
+{{/*
+# Copyright 2020-present Open Networking Foundation
+
+# SPDX-License-Identifier: LicenseRef-ONF-Member-Only-1.0
+*/}}
+
+{{- if .Values.config.udm.deploy }}
+---
+apiVersion: v1
+kind: Service
+metadata:
+ name: udm
+ labels:
+{{ tuple "udm" . | include "5g-control-plane.metadata_labels" | indent 4 }}
+spec:
+ type: {{ .Values.config.udm.serviceType }}
+ selector:
+{{ tuple "udm" . | include "5g-control-plane.metadata_labels" | indent 4 }}
+ ports:
+ - name: sbi
+ port: {{ .Values.config.udm.sbi.port }}
+ protocol: TCP
+{{- if eq .Values.config.udm.serviceType "NodePort" }}
+{{- if .Values.config.udm.sbi.nodePort }}
+ nodePort: {{ .Values.config.udm.sbi.nodePort }}
+{{- end }}
+{{- end }}
+{{- end }}
diff --git a/5g-control-plane/templates/service-udr.yaml b/5g-control-plane/templates/service-udr.yaml
new file mode 100644
index 0000000..3c13170
--- /dev/null
+++ b/5g-control-plane/templates/service-udr.yaml
@@ -0,0 +1,28 @@
+{{/*
+# Copyright 2020-present Open Networking Foundation
+
+# SPDX-License-Identifier: LicenseRef-ONF-Member-Only-1.0
+*/}}
+
+{{- if .Values.config.udr.deploy }}
+---
+apiVersion: v1
+kind: Service
+metadata:
+ name: udr
+ labels:
+{{ tuple "udr" . | include "5g-control-plane.metadata_labels" | indent 4 }}
+spec:
+ type: {{ .Values.config.udr.serviceType }}
+ selector:
+{{ tuple "udr" . | include "5g-control-plane.metadata_labels" | indent 4 }}
+ ports:
+ - name: sbi
+ port: {{ .Values.config.udr.sbi.port }}
+ protocol: TCP
+{{- if eq .Values.config.udr.serviceType "NodePort" }}
+{{- if .Values.config.udr.sbi.nodePort }}
+ nodePort: {{ .Values.config.udr.sbi.nodePort }}
+{{- end }}
+{{- end }}
+{{- end }}
diff --git a/5g-control-plane/templates/service-webui.yaml b/5g-control-plane/templates/service-webui.yaml
new file mode 100644
index 0000000..b91e094
--- /dev/null
+++ b/5g-control-plane/templates/service-webui.yaml
@@ -0,0 +1,36 @@
+{{/*
+# Copyright 2020-present Open Networking Foundation
+
+# SPDX-License-Identifier: LicenseRef-ONF-Member-Only-1.0
+*/}}
+
+{{- if .Values.config.webui.deploy }}
+---
+apiVersion: v1
+kind: Service
+metadata:
+ name: webui
+ labels:
+{{ tuple "webui" . | include "5g-control-plane.metadata_labels" | indent 4 }}
+spec:
+ type: {{ .Values.config.webui.serviceType }}
+ selector:
+{{ tuple "webui" . | include "5g-control-plane.metadata_labels" | indent 4 }}
+ ports:
+ - name: urlport-http
+ port: {{ .Values.config.webui.urlport.port }}
+ protocol: TCP
+{{- if eq .Values.config.webui.serviceType "NodePort" }}
+{{- if .Values.config.webui.urlport.nodePort }}
+ nodePort: {{ .Values.config.webui.urlport.nodePort }}
+{{- end }}
+{{- end }}
+ - name: grpc
+ port: {{ .Values.config.webui.grpc.port }}
+ protocol: TCP
+{{- if eq .Values.config.webui.serviceType "NodePort" }}
+{{- if .Values.config.webui.grpc.nodePort }}
+ nodePort: {{ .Values.config.webui.grpc.nodePort }}
+{{- end }}
+{{- end }}
+{{- end }}
diff --git a/5g-control-plane/values.yaml b/5g-control-plane/values.yaml
new file mode 100644
index 0000000..4d5f602
--- /dev/null
+++ b/5g-control-plane/values.yaml
@@ -0,0 +1,595 @@
+# Copyright 2020-present Open Networking Foundation
+#
+# SPDX-License-Identifier: LicenseRef-ONF-Member-Only-1.0
+
+images:
+ tags:
+ init: docker.io/omecproject/pod-init:1.0.0
+ amf: registry.aetherproject.org/omecproject/5gc-amf:onf-release3.0.5-03d3c6d
+ nrf: registry.aetherproject.org/omecproject/5gc-nrf:onf-release3.0.5-13304e8
+ smf: registry.aetherproject.org/omecproject/5gc-smf:onf-release3.0.5-bcbcd33
+ ausf: registry.aetherproject.org/omecproject/5gc-ausf:onf-release3.0.5-be7d4ac
+ nssf: registry.aetherproject.org/omecproject/5gc-nssf:onf-release3.0.5-aa3a60b
+ pcf: registry.aetherproject.org/omecproject/5gc-pcf:onf-release3.0.5-9f7734b
+ udr: registry.aetherproject.org/omecproject/5gc-udr:onf-release3.0.5-deef506
+ udm: registry.aetherproject.org/omecproject/5gc-udm:onf-release3.0.5-c28433a
+ webui: registry.aetherproject.org/omecproject/5gc-webui:onf-release3.0.5-0534804
+ pullPolicy: IfNotPresent
+ # Optionally specify an array of imagePullSecrets.
+ # Secrets must be manually created in the namespace.
+ pullSecrets:
+ - name: aether.registry
+
+resources:
+ enabled: false
+ amf:
+ requests:
+ cpu: 2
+ memory: 1Gi
+ limits:
+ cpu: 2
+ memory: 1Gi
+ nrf:
+ requests:
+ cpu: 2
+ memory: 1Gi
+ limits:
+ cpu: 2
+ memory: 1Gi
+ smf:
+ requests:
+ cpu: 2
+ memory: 1Gi
+ limits:
+ cpu: 2
+ memory: 1Gi
+ ausf:
+ requests:
+ cpu: 2
+ memory: 1Gi
+ limits:
+ cpu: 2
+ memory: 1Gi
+ nssf:
+ requests:
+ cpu: 2
+ memory: 1Gi
+ limits:
+ cpu: 2
+ memory: 1Gi
+ pcf:
+ requests:
+ cpu: 2
+ memory: 1Gi
+ limits:
+ cpu: 2
+ memory: 1Gi
+ udr:
+ requests:
+ cpu: 2
+ memory: 1Gi
+ limits:
+ cpu: 2
+ memory: 1Gi
+ udm:
+ requests:
+ cpu: 2
+ memory: 1Gi
+ limits:
+ cpu: 2
+ memory: 1Gi
+ webui:
+ requests:
+ cpu: 1
+ memory: 1Gi
+ limits:
+ cpu: 1
+ memory: 1Gi
+
+mongodb:
+ deploy: true
+ fullnameOverride: mongodb
+ persistence:
+ enabled: false
+ auth:
+ enabled: false
+ serviceAccount:
+ create: false
+ #clusterDomain: cluster.local
+ #architecture: replicaset
+ #replicaCount: 3
+
+config:
+ managedByConfigPod: # config comes from helm by default, if enabled true, then discard
+ enabled: false # helm chart config and use the config from config Pod
+ syncUrl: "" # Get the config from adapater in case control plane is down
+ useExistingConfigMap: false
+ coreDump:
+ enabled: false
+ path: /tmp/coredump
+ mongodb:
+ name: free5gc
+ url: mongodb://mongodb
+ grpc:
+ golog_verbosity: "99"
+ severity: "info"
+ trace: "all"
+ verbosity: "debug"
+ logger:
+ # network function
+ AMF:
+ debugLevel: info
+ ReportCaller: false
+ SMF:
+ debugLevel: info
+ ReportCaller: false
+ UDR:
+ debugLevel: info
+ ReportCaller: false
+ UDM:
+ debugLevel: info
+ ReportCaller: false
+ NRF:
+ debugLevel: info
+ ReportCaller: false
+ PCF:
+ debugLevel: info
+ ReportCaller: false
+ AUSF:
+ debugLevel: info
+ ReportCaller: false
+ N3IWF:
+ debugLevel: info
+ ReportCaller: false
+ # library
+ NAS:
+ debugLevel: info
+ ReportCaller: false
+ FSM:
+ debugLevel: info
+ ReportCaller: false
+ NGAP:
+ debugLevel: info
+ ReportCaller: false
+ NamfComm:
+ debugLevel: info
+ ReportCaller: false
+ NamfEventExposure:
+ debugLevel: info
+ ReportCaller: false
+ NsmfPDUSession:
+ debugLevel: info
+ ReportCaller: false
+ NudrDataRepository:
+ debugLevel: info
+ ReportCaller: false
+ OpenApi:
+ debugLevel: info
+ ReportCaller: false
+ Aper:
+ debugLevel: info
+ ReportCaller: false
+ CommonConsumerTest:
+ debugLevel: info
+ ReportCaller: false
+ PFCP:
+ debugLevel: info
+ ReportCaller: false
+ MongoDBLibrary:
+ debugLevel: info
+ ReportCaller: false
+ PathUtil:
+ debugLevel: info
+ ReportCaller: false
+ # webui
+ WEBUI:
+ debugLevel: info
+ ReportCaller: false
+ webui:
+ deploy: true
+ #podAnnotations:
+ serviceType: ClusterIP
+ urlport:
+ port: 5000
+ # Provide nodePort when serviceType is NodePort
+ #nodePort: 35000
+ grpc:
+ port: 9876
+ ingress:
+ enabled: false
+ hostname: free5gc.local
+ path: /
+ pathType: Prefix
+ # extraHosts:
+ # - host: free5gc.local
+ # path: /
+ cfgFiles:
+ # https://github.com/free5gc/free5gc/blob/main/config/webuicfg.yaml
+ webuicfg.conf:
+ info:
+ version: 1.0.0
+ description: WebUI initial local configuration
+ configuration: {}
+ udm:
+ deploy: true
+ #podAnnotations:
+ serviceType: ClusterIP
+ sbi:
+ port: 29503
+ # Provide nodePort when serviceType is NodePort
+ #nodePort: 30074
+ cfgFiles:
+ # https://github.com/free5gc/free5gc/blob/main/config/udmcfg.yaml
+ udmcfg.conf:
+ info:
+ version: 1.0.0
+ description: UDM initial local configuration
+ configuration:
+ nrfUri: http://nrf:29510
+ plmnList:
+ - plmnId:
+ mcc: 208
+ mnc: 93
+ - plmnId:
+ mcc: 222
+ mnc: 88
+ serviceNameList:
+ - nudm-sdm
+ - nudm-uecm
+ - nudm-ueau
+ - nudm-ee
+ - nudm-pp
+ sbi:
+ scheme: http
+ bindingIPv4: "0.0.0.0"
+ registerIPv4: udm
+ tls:
+ log: free5gc/udmsslkey.log
+ pem: free5gc/support/TLS/udm.pem
+ key: free5gc/support/TLS/udm.key
+ keys:
+ udmProfileAHNPublicKey: 5a8d38864820197c3394b92613b20b91633cbd897119273bf8e4a6f4eec0a650
+ udmProfileAHNPrivateKey: c53c22208b61860b06c62e5406a7b330c2b577aa5558981510d128247d38bd1d
+ udmProfileBHNPublicKey: 0472DA71976234CE833A6907425867B82E074D44EF907DFB4B3E21C1C2256EBCD15A7DED52FCBB097A4ED250E036C7B9C8C7004C4EEDC4F068CD7BF8D3F900E3B4
+ udmProfileBHNPrivateKey: F1AB1074477EBCC7F554EA1C5FC368B1616730155E0041AC447D6301975FECDA
+ udr:
+ deploy: true
+ #podAnnotations:
+ serviceType: ClusterIP
+ sbi:
+ port: 29504
+ # Provide nodePort when serviceType is NodePort
+ #nodePort: 30074
+ cfgFiles:
+ # https://github.com/free5gc/free5gc/blob/main/config/udrcfg.yaml
+ udrcfg.conf:
+ info:
+ version: 1.0.0
+ description: UDR initial local configuration
+ configuration:
+ nrfUri: http://nrf:29510
+ plmnSupportList:
+ - plmnId:
+ mcc: 208
+ mnc: 93
+ - plmnId:
+ mcc: 333
+ mnc: 88
+ sbi:
+ scheme: http
+ bindingIPv4: "0.0.0.0"
+ registerIPv4: udr
+ pcf:
+ deploy: true
+ #podAnnotations:
+ serviceType: ClusterIP
+ sbi:
+ port: 29507
+ # Provide nodePort when serviceType is NodePort
+ #nodePort: 30077
+ cfgFiles:
+ # https://github.com/free5gc/free5gc/blob/main/config/pcfcfg.yaml
+ pcfcfg.conf:
+ info:
+ version: 1.0.0
+ description: PCF initial local configuration
+ configuration:
+ pcfName: PCF
+ nrfUri: http://nrf:29510
+ sbi:
+ scheme: http
+ bindingIPv4: "0.0.0.0"
+ registerIPv4: pcf
+ defaultBdtRefId: BdtPolicyId-
+ plmnList:
+ - plmnId:
+ mcc: 208
+ mnc: 93
+ - plmnId:
+ mcc: 333
+ mnc: 88
+ serviceList:
+ - serviceName: npcf-am-policy-control
+ - serviceName: npcf-smpolicycontrol
+ suppFeat: 3fff
+ - serviceName: npcf-bdtpolicycontrol
+ - serviceName: npcf-policyauthorization
+ suppFeat: 3
+ - serviceName: npcf-eventexposure
+ - serviceName: npcf-ue-policy-control
+ nssf:
+ deploy: true
+ #podAnnotations:
+ serviceType: ClusterIP
+ sbi:
+ port: 29531
+ # Provide nodePort when serviceType is NodePort
+ #nodePort: 30081
+ cfgFiles:
+ # https://github.com/free5gc/free5gc/blob/main/config/nssfcfg.yaml
+ nssfcfg.conf:
+ info:
+ version: 1.0.0
+ description: NSSF initial local configuration
+ configuration:
+ nssfName: NSSF
+ nrfUri: http://nrf:29510
+ sbi:
+ scheme: http
+ bindingIPv4: "0.0.0.0"
+ registerIPv4: nssf
+ serviceNameList:
+ - nnssf-nsselection
+ - nnssf-nssaiavailability
+ supportedPlmnList:
+ - mcc: 208
+ mnc: 93
+ supportedNssaiInPlmnList:
+ - plmnId:
+ mcc: 208
+ mnc: 93
+ supportedSnssaiList:
+ - sst: 1
+ sd: "010203"
+ nsiList:
+ - snssai:
+ sst: 1
+ sd: "010203"
+ nsiInformationList:
+ - nrfId: http://nrf:29510/nnrf-nfm/v1/nf-instances
+ nsiId: 22
+ amf:
+ deploy: true
+ podAnnotations:
+ field.cattle.io/workloadMetrics: '[{"path":"/metrics","port":9089,"schema":"HTTP"}]'
+ serviceType: ClusterIP
+ prometheus:
+ port: 9089
+ # Provide nodePort when serviceType is NodePort
+ #nodePort: 30084
+ sbi:
+ port: 29518
+ #nodePort: 30088
+ ngapp:
+ #externalIp:
+ port: 38412
+ #nodePort: 30071
+ cfgFiles:
+ # https://github.com/free5gc/free5gc/blob/main/config/amfcfg.yaml
+ amfcfg.conf:
+ info:
+ version: 1.0.0
+ description: AMF initial local configuration
+ configuration:
+ ngapIpList:
+ - "0.0.0.0"
+ amfName: AMF
+ nrfUri: http://nrf:29510
+ sbi:
+ scheme: http
+ bindingIPv4: "0.0.0.0"
+ registerIPv4: amf
+ serviceNameList:
+ - namf-comm
+ - namf-evts
+ - namf-mt
+ - namf-loc
+ - namf-oam
+ servedGuamiList:
+ - plmnId:
+ mcc: 208
+ mnc: 93
+ amfId: cafe00
+ supportTaiList:
+ - plmnId:
+ mcc: 208
+ mnc: 93
+ tac: 1
+ plmnSupportList:
+ - plmnId:
+ mcc: 208
+ mnc: 93
+ snssaiList:
+ - sst: 1
+ sd: "010203"
+ supportDnnList:
+ - internet
+ security:
+ integrityOrder:
+ - NIA2
+ cipheringOrder:
+ - NEA0
+ networkName:
+ full: Aether5G
+ short: Aether
+ networkFeatureSupport5GS: # 5gs Network Feature Support IE, refer to TS 24.501
+ enable: true # append this IE in Registration accept or not
+ imsVoPS: 0 # IMS voice over PS session indicator (uinteger, range: 0~1)
+ emc: 0 # Emergency service support indicator for 3GPP access (uinteger, range: 0~3)
+ emf: 0 # Emergency service fallback indicator for 3GPP access (uinteger, range: 0~3)
+ iwkN26: 0 # Interworking without N26 interface indicator (uinteger, range: 0~1)
+ mpsi: 0 # MPS indicator (uinteger, range: 0~1)
+ emcN3: 0 # Emergency service support indicator for Non-3GPP access (uinteger, range: 0~1)
+ mcsi: 0 # MCS indicator (uinteger, range: 0~1)
+ t3502Value: 720 # timer value (seconds) at UE side
+ t3512Value: 3600 # timer value (seconds) at UE side
+ non3gppDeregistrationTimerValue: 3240 # timer value (seconds) at UE side
+ # retransmission timer for paging message
+ t3513:
+ enable: true # true or false
+ expireTime: 6s # default is 6 seconds
+ maxRetryTimes: 4 # the max number of retransmission
+ # retransmission timer for NAS Deregistration Request message
+ t3522:
+ enable: true # true or false
+ expireTime: 6s # default is 6 seconds
+ maxRetryTimes: 4 # the max number of retransmission
+ # retransmission timer for NAS Registration Accept message
+ t3550:
+ enable: true # true or false
+ expireTime: 6s # default is 6 seconds
+ maxRetryTimes: 4 # the max number of retransmission
+ # retransmission timer for NAS Authentication Request/Security Mode Command message
+ t3560:
+ enable: true # true or false
+ expireTime: 6s # default is 6 seconds
+ maxRetryTimes: 4 # the max number of retransmission
+ # retransmission timer for NAS Notification message
+ t3565:
+ enable: true # true or false
+ expireTime: 6s # default is 6 seconds
+ maxRetryTimes: 4 # the max number of retransmission
+ nrf:
+ deploy: true
+ #podAnnotations:
+ serviceType: ClusterIP
+ sbi:
+ port: 29510
+ # Provide nodePort when serviceType is NodePort
+ #nodePort: 30070
+ cfgFiles:
+ # https://github.com/free5gc/free5gc/blob/main/config/nrfcfg.yaml
+ nrfcfg.conf:
+ info:
+ version: 1.0.0
+ description: NRF initial local configuration
+ configuration:
+ sbi:
+ scheme: http
+ bindingIPv4: "0.0.0.0"
+ registerIPv4: nrf
+ DefaultPlmnId:
+ mcc: 208
+ mnc: 93
+ serviceNameList:
+ - nnrf-nfm
+ - nnrf-disc
+ smf:
+ deploy: true
+ podAnnotations:
+ field.cattle.io/workloadMetrics: '[{"path":"/metrics","port":9089,"schema":"HTTP"}]'
+ serviceType: ClusterIP
+ n4:
+ port: 8805
+ # Provide nodePort when serviceType is NodePort
+ #nodePort: 30021
+ prometheus:
+ port: 9089
+ #nodePort: 30084
+ sbi:
+ port: 29502
+ #nodePort: 30080
+ cfgFiles:
+ uerouting.conf:
+ info:
+ version: 1.0.0
+ description: Routing information for UE
+ # https://github.com/free5gc/free5gc/blob/main/config/smfcfg.yaml
+ smfcfg.conf:
+ info:
+ version: 1.0.0
+ description: SMF initial local configuration
+ configuration:
+ pfcp:
+ addr: "POD_IP"
+ smfName: SMF
+ nrfUri: http://nrf:29510
+ sbi:
+ scheme: http
+ bindingIPv4: "0.0.0.0"
+ registerIPv4: smf
+ tls:
+ key: gofree5gc/support/TLS/smf.key
+ pem: gofree5gc/support/TLS/smf.pem
+ serviceNameList:
+ - nsmf-pdusession
+ - nsmf-event-exposure
+ snssaiInfos:
+ - dnnInfos:
+ - dnn: internet
+ dns: # the IP address of DNS
+ ipv4: 8.8.8.8
+ ipv6: 2001:4860:4860::8888
+ ueSubnet: 172.250.0.0/16 # should be CIDR type
+ sNssai:
+ sd: "010203"
+ sst: 1
+ userplane_information:
+ up_nodes:
+ gNB1:
+ type: AN
+ UPF:
+ type: UPF
+ node_id: upf
+ sNssaiUpfInfos: # S-NSSAI information list for this UPF
+ - sNssai: # S-NSSAI (Single Network Slice Selection Assistance Information)
+ sst: 1 # Slice/Service Type (uinteger, range: 0~255)
+ sd: "010203" # Slice Differentiator (3 bytes hex string, range: 000000~FFFFFF)
+ dnnUpfInfoList: # DNN information list for this S-NSSAI
+ - dnn: internet
+ plmnId:
+ mcc: "208"
+ mnc: "93"
+ - sNssai: # S-NSSAI (Single Network Slice Selection Assistance Information)
+ sst: 1 # Slice/Service Type (uinteger, range: 0~255)
+ sd: "112233" # Slice Differentiator (3 bytes hex string, range: 000000~FFFFFF)
+ dnnUpfInfoList: # DNN information list for this S-NSSAI
+ - dnn: internet
+ plmnId:
+ mcc: "208"
+ mnc: "93"
+ interfaces: # Interface list for this UPF
+ - interfaceType: N3 # the type of the interface (N3 or N9)
+ endpoints: # the IP address of this N3/N9 interface on this UPF
+ - upf
+ networkInstance: internet # Data Network Name (DNN)
+
+ links:
+ - A: gNB1
+ B: UPF
+ ausf:
+ deploy: true
+ #podAnnotations:
+ serviceType: ClusterIP
+ sbi:
+ port: 29509
+ # Provide nodePort when serviceType is NodePort
+ #nodePort: 30082
+ cfgFiles:
+ # https://github.com/free5gc/free5gc/blob/main/config/ausfcfg.yaml
+ ausfcfg.conf:
+ info:
+ version: 1.0.0
+ description: AUSF initial local configuration
+ configuration:
+ nrfUri: http://nrf:29510
+ sbi:
+ scheme: http
+ bindingIPv4: "0.0.0.0"
+ registerIPv4: ausf
+ serviceNameList:
+ - nausf-auth
+ plmnSupportList:
+ - mcc: 208
+ mnc: 93
+ groupId: ausfGroup001
diff --git a/5g-ran-sim/Chart.yaml b/5g-ran-sim/Chart.yaml
new file mode 100644
index 0000000..d8ab119
--- /dev/null
+++ b/5g-ran-sim/Chart.yaml
@@ -0,0 +1,11 @@
+---
+# Copyright 2020-present Open Networking Foundation
+#
+# SPDX-License-Identifier: LicenseRef-ONF-Member-Only-1.0
+
+apiVersion: v1
+description: 5G RAN Simulator Service
+name: 5g-ran-sim
+icon: https://guide.opencord.org/logos/cord.svg
+
+version: 0.1.2
diff --git a/5g-ran-sim/templates/NOTES.txt b/5g-ran-sim/templates/NOTES.txt
new file mode 100644
index 0000000..fe31845
--- /dev/null
+++ b/5g-ran-sim/templates/NOTES.txt
@@ -0,0 +1,9 @@
+{{- /*
+
+# Copyright 2020-present Open Networking Foundation
+#
+# SPDX-License-Identifier: LicenseRef-ONF-Member-Only-1.0
+
+*/ -}}
+
+Notes - Instructions to use 5g ran simulator helm charts
diff --git a/5g-ran-sim/templates/_helpers.tpl b/5g-ran-sim/templates/_helpers.tpl
new file mode 100644
index 0000000..700d36c
--- /dev/null
+++ b/5g-ran-sim/templates/_helpers.tpl
@@ -0,0 +1,115 @@
+{{- /*
+
+# Copyright 2020-present Open Networking Foundation
+#
+# SPDX-License-Identifier: LicenseRef-ONF-Member-Only-1.0
+
+*/ -}}
+
+{{/*
+Renders a set of standardised labels
+*/}}
+{{- define "5g-ransim-plane.metadata_labels" -}}
+{{- $application := index . 0 -}}
+{{- $context := index . 1 -}}
+release: {{ $context.Release.Name }}
+app: {{ $application }}
+{{- end -}}
+
+{{/*
+Render the given template.
+*/}}
+{{- define "5g-ransim-plane.template" -}}
+{{- $name := index . 0 -}}
+{{- $context := index . 1 -}}
+{{- $last := base $context.Template.Name }}
+{{- $wtf := $context.Template.Name | replace $last $name -}}
+{{ include $wtf $context }}
+{{- end -}}
+
+{{/*
+Render ServiceAccount, Role, and RoleBinding required for kubernetes-entrypoint.
+*/}}
+{{- define "5g-ransim-plane.service_account" -}}
+{{- $context := index . 1 -}}
+{{- $saName := index . 0 -}}
+{{- $saNamespace := $context.Release.Namespace }}
+---
+apiVersion: v1
+kind: ServiceAccount
+metadata:
+ name: {{ $saName }}
+ namespace: {{ $saNamespace }}
+ labels:
+{{ tuple $saName $context | include "5g-ransim-plane.metadata_labels" | indent 4 }}
+---
+{{- if semverCompare ">=1.16-0" $context.Capabilities.KubeVersion.GitVersion }}
+apiVersion: rbac.authorization.k8s.io/v1
+{{- else }}
+apiVersion: rbac.authorization.k8s.io/v1beta1
+{{- end }}
+kind: RoleBinding
+metadata:
+ name: {{ $saName }}
+ namespace: {{ $saNamespace }}
+ labels:
+{{ tuple $saName $context | include "5g-ransim-plane.metadata_labels" | indent 4 }}
+roleRef:
+ apiGroup: rbac.authorization.k8s.io
+ kind: Role
+ name: {{ $saName }}
+subjects:
+ - kind: ServiceAccount
+ name: {{ $saName }}
+ namespace: {{ $saNamespace }}
+---
+{{- if semverCompare ">=1.16-0" $context.Capabilities.KubeVersion.GitVersion }}
+apiVersion: rbac.authorization.k8s.io/v1
+{{- else }}
+apiVersion: rbac.authorization.k8s.io/v1beta1
+{{- end }}
+kind: Role
+metadata:
+ name: {{ $saName }}
+ namespace: {{ $saNamespace }}
+ labels:
+{{ tuple $saName $context | include "5g-ransim-plane.metadata_labels" | indent 4 }}
+rules:
+ - apiGroups:
+ - ""
+ - extensions
+ - batch
+ - apps
+ verbs:
+ - get
+ - list
+ - patch
+ resources:
+ - statefulsets
+ - daemonsets
+ - jobs
+ - pods
+ - services
+ - endpoints
+ - configmaps
+{{- end -}}
+
+{{/*
+Render init container for coredump.
+*/}}
+{{- define "5g-ransim-plane.coredump_init" -}}
+{{- $pod := index . 0 -}}
+{{- $context := index . 1 -}}
+- name: {{ $pod }}-coredump-init
+ image: {{ $context.Values.images.tags.init | quote }}
+ imagePullPolicy: {{ $context.Values.images.pullPolicy }}
+ securityContext:
+ privileged: true
+ runAsUser: 0
+ command: ["bash", "-xc"]
+ args:
+ - echo '/tmp/coredump/core.%h.%e.%t' > /mnt/host-rootfs/proc/sys/kernel/core_pattern
+ volumeMounts:
+ - name: host-rootfs
+ mountPath: /mnt/host-rootfs
+{{- end -}}
diff --git a/5g-ran-sim/templates/bin/_gnbsim-run.sh.tpl b/5g-ran-sim/templates/bin/_gnbsim-run.sh.tpl
new file mode 100644
index 0000000..42e47bc
--- /dev/null
+++ b/5g-ran-sim/templates/bin/_gnbsim-run.sh.tpl
@@ -0,0 +1,20 @@
+#!/bin/sh
+
+# Copyright 2020-present Open Networking Foundation
+#
+# SPDX-License-Identifier: LicenseRef-ONF-Member-Only-1.0
+
+set -xe
+
+{{- if .Values.config.coreDump.enabled }}
+cp /free5gc/amf/amf /tmp/coredump/
+{{- end }}
+
+#cat config files
+cd /free5gc
+cat ./config/gnb.conf
+cat /etc/hosts
+ip route add 192.168.252.0/24 via 192.168.251.1
+# Disabling checksum offloading to hardware
+ethtool -K enb tx off
+sleep infinity
diff --git a/5g-ran-sim/templates/configmap-gnbsim.yaml b/5g-ran-sim/templates/configmap-gnbsim.yaml
new file mode 100644
index 0000000..c7d5b14
--- /dev/null
+++ b/5g-ran-sim/templates/configmap-gnbsim.yaml
@@ -0,0 +1,22 @@
+{{/*
+# Copyright 2020-present Open Networking Foundation
+
+# SPDX-License-Identifier: LicenseRef-ONF-Member-Only-1.0
+*/}}
+
+{{- if .Values.config.gnbsim.deploy }}
+---
+apiVersion: v1
+kind: ConfigMap
+metadata:
+ name: gnbsim
+ labels:
+{{ tuple "gnbsim" . | include "5g-ransim-plane.metadata_labels" | indent 4 }}
+data:
+ gnbsim-run.sh: |
+{{ tuple "bin/_gnbsim-run.sh.tpl" . | include "5g-ransim-plane.template" | indent 4 }}
+{{- range $key, $value := .Values.config.gnbsim.yamlCfgFiles }}
+ {{ $key }}: |
+{{ $value | indent 4 }}
+{{- end }}
+{{- end }}
diff --git a/5g-ran-sim/templates/networks.yaml b/5g-ran-sim/templates/networks.yaml
new file mode 100644
index 0000000..e716f03
--- /dev/null
+++ b/5g-ran-sim/templates/networks.yaml
@@ -0,0 +1,26 @@
+{{/*
+# Copyright 2020-present Open Networking Foundation
+
+ # SPDX-License-Identifier: LicenseRef-ONF-Member-Only-1.0
+*/}}
+
+---
+apiVersion: "k8s.cni.cncf.io/v1"
+kind: NetworkAttachmentDefinition
+metadata:
+ name: enb-net
+{{- if $.Values.config.gnbsim.sriov.enabled }}
+ annotations:
+ k8s.v1.cni.cncf.io/resourceName: intel.com/sriov_vfio_access_net
+{{- end }}
+spec:
+ config: '{
+{{- if semverCompare ">=1.16-0" .Capabilities.KubeVersion.GitVersion }}
+ "cniVersion": "0.3.1",
+{{- end }}
+ "type": {{ .Values.config.gnbsim.cniPlugin | quote }},
+ "ipam": {
+ "type": {{ .Values.config.gnbsim.ipam | quote }}
+ }
+ }'
+---
diff --git a/5g-ran-sim/templates/service-gnbsim.yaml b/5g-ran-sim/templates/service-gnbsim.yaml
new file mode 100644
index 0000000..003b625
--- /dev/null
+++ b/5g-ran-sim/templates/service-gnbsim.yaml
@@ -0,0 +1,23 @@
+{{/*
+# Copyright 2020-present Open Networking Foundation
+
+# SPDX-License-Identifier: LicenseRef-ONF-Member-Only-1.0
+*/}}
+
+{{- if .Values.config.gnbsim.deploy }}
+---
+apiVersion: v1
+kind: Service
+metadata:
+ name: gnbsim
+ labels:
+{{ tuple "gnbsim" . | include "5g-ransim-plane.metadata_labels" | indent 4 }}
+spec:
+ type: ClusterIP
+ selector:
+{{ tuple "gnbsim" . | include "5g-ransim-plane.metadata_labels" | indent 4 }}
+ ports:
+ - name: ngapp
+ port: {{ .Values.config.gnbsim.ngapp.port }}
+ protocol: SCTP
+{{- end }}
diff --git a/5g-ran-sim/templates/statefulset-gnbsim.yaml b/5g-ran-sim/templates/statefulset-gnbsim.yaml
new file mode 100644
index 0000000..d62293b
--- /dev/null
+++ b/5g-ran-sim/templates/statefulset-gnbsim.yaml
@@ -0,0 +1,109 @@
+{{/*
+# Copyright 2020-present Open Networking Foundation
+
+# SPDX-License-Identifier: LicenseRef-ONF-Member-Only-1.0
+*/}}
+
+{{- if .Values.config.gnbsim.deploy }}
+{{ tuple "gnbsim" . | include "5g-ransim-plane.service_account" }}
+---
+apiVersion: apps/v1
+kind: StatefulSet
+metadata:
+ name: gnbsim
+ labels:
+{{ tuple "gnbsim" . | include "5g-ransim-plane.metadata_labels" | indent 4 }}
+spec:
+ replicas: 1
+ serviceName: gnbsim-headless
+ selector:
+ matchLabels:
+{{ tuple "gnbsim" . | include "5g-ransim-plane.metadata_labels" | indent 6 }}
+ template:
+ metadata:
+ labels:
+{{ tuple "gnbsim" . | include "5g-ransim-plane.metadata_labels" | indent 8 }}
+ annotations:
+ k8s.v1.cni.cncf.io/networks: '[
+ {
+ "name": "enb-net",
+ "interface": "enb",
+{{- if semverCompare ">=1.16-0" .Capabilities.KubeVersion.GitVersion }}
+ "ips": [{{ .Values.config.gnbsim.gnb.ip | quote }}]
+{{- else }}
+ "ips": {{ .Values.config.gnbsim.gnb.ip | quote }}
+{{- end }}
+ }
+ ]'
+ spec:
+ {{- if .Values.nodeSelectors.enabled }}
+ nodeSelector:
+ {{ .Values.nodeSelectors.gnbsim.label }}: {{ .Values.nodeSelectors.gnbsim.value }}
+ {{- end }}
+ serviceAccountName: gnbsim
+ {{- if hasKey .Values.images "pullSecrets" }}
+ imagePullSecrets:
+{{ toYaml .Values.images.pullSecrets | indent 8 }}
+ {{- end }}
+
+ initContainers:
+ - name: wait-amf-module
+ image: {{ .Values.images.tags.init | quote }}
+ imagePullPolicy: {{ .Values.images.pullPolicy }}
+ command: ['sh', '-c', 'until nslookup amf; do echo waiting for nrf; sleep 4; done;']
+ {{- if .Values.config.coreDump.enabled }}
+{{ tuple "gnbsim" . | include "5g-ransim-plane.coredump_init" | indent 6 }}
+ {{- end }}
+ containers:
+ - name: gnbsim
+ image: {{ .Values.images.tags.gnbsim }}
+ imagePullPolicy: {{ .Values.images.pullPolicy }}
+ securityContext:
+ privileged: true
+ runAsUser: 0
+ stdin: true
+ tty: true
+ command: ["/opt/cp/scripts/gnbsim-run.sh"]
+ env:
+ - name: MEM_LIMIT
+ valueFrom:
+ resourceFieldRef:
+ containerName: gnbsim
+ resource: limits.memory
+ divisor: 1Mi
+ - name: POD_IP
+ valueFrom:
+ fieldRef:
+ fieldPath: status.podIP
+ {{- if .Values.resources.enabled }}
+ resources:
+{{ toYaml .Values.resources.gnbsim | indent 10 }}
+ {{- end }}
+ volumeMounts:
+ - name: cp-script
+ mountPath: /opt/cp/scripts/gnbsim-run.sh
+ subPath: gnbsim-run.sh
+ - name: cp-config
+ mountPath: /free5gc/config
+ {{- if .Values.config.coreDump.enabled }}
+ - name: coredump
+ mountPath: /tmp/coredump
+ {{- end }}
+ volumes:
+ - name: cp-script
+ configMap:
+ name: gnbsim
+ defaultMode: 493
+ - name: cp-config
+ configMap:
+ name: gnbsim
+ defaultMode: 420
+ {{- if .Values.config.coreDump.enabled }}
+ - name: host-rootfs
+ hostPath:
+ path: /
+ - name: coredump
+ hostPath:
+ path: {{ .Values.config.coreDump.path }}
+ {{- end }}
+{{- end }}
diff --git a/5g-ran-sim/values.yaml b/5g-ran-sim/values.yaml
new file mode 100644
index 0000000..42c61e5
--- /dev/null
+++ b/5g-ran-sim/values.yaml
@@ -0,0 +1,98 @@
+# Copyright 2020-present Open Networking Foundation
+#
+# SPDX-License-Identifier: LicenseRef-ONF-Member-Only-1.0
+
+images:
+ tags:
+ init: docker.io/omecproject/pod-init:1.0.0
+ gnbsim: registry.aetherproject.org/omecproject/5gc-gnbsim:dev-new-gnbsim-5f0cac4
+ depCheck: quay.io/stackanetes/kubernetes-entrypoint:v0.3.1
+ pullPolicy: IfNotPresent
+ # Secrets must be manually created in the namespace.
+ pullSecrets:
+ - name: aether.registry
+
+nodeSelectors:
+ enabled: false
+ gnbsim:
+ label: omec-cp
+ value: enabled
+
+resources:
+ enabled: true
+ gnbsim:
+ requests:
+ cpu: 2
+ memory: 1Gi
+ limits:
+ cpu: 2
+ memory: 1Gi
+
+config:
+ clusterDomain: cluster.local
+ coreDump:
+ enabled: false
+ path: /tmp/coredump
+ gnbsim:
+ deploy: true
+ sriov:
+ enabled: disabled
+ ipam: static
+ cniPlugin: simpleovs #need override value
+ gnb:
+ ip: 192.168.251.5/24
+ ngapp:
+ port: 38412
+ nodePort:
+ enabled: false
+ port: 30071
+ yamlCfgFiles:
+ gnb.conf: |
+ info:
+ version: 1.0.0
+ description: gNodeB sim initial configuration
+ configuration:
+ gnbs: # pool of gNodeBs
+ gnb1:
+ n2IpAddr: # gNB N2 interface IP address used to connect to AMF
+ n2Port: 9487 # gNB N2 Port used to connect to AMF
+ n3IpAddr: 192.168.251.5 # gNB N3 interface IP address used to connect to UPF
+ n3Port: 2152 # gNB N3 Port used to connect to UPF
+ name: gnb1 # gNB name that uniquely identify a gNB within application
+ gnbId: 000102 # gNB identifier (3 bytes hex string, range: 000000~FFFFFF)
+ tac: 000001 # Tracking Area Code (3 bytes hex string, range: 000000~FFFFFF)
+ defaultAmf:
+ hostName: amf # Host name of AMF
+ ipAddr: # AMF IP address
+ port: 38412 # AMF port
+ profiles: # profile information
+ - profileType: register # profile type
+ profileName: profile1 # uniqely identifies a profile within application
+ enable: false # Set true to execute the profile, false otherwise.
+ gnbName: gnb1 # gNB to be used for this profile
+ startImsi: 2089300007487 #First IMSI. Subsequent values will be used if ueCount is mo re than 1
+ ueCount: 5 # Number of UEs for for which the profile will be executed
+ plmnId: # Public Land Mobile Network ID, <PLMN ID> = <MCC><MNC>
+ mcc: 208 # Mobile Country Code (3 digits string, digit: 0~9)
+ mnc: 93 # Mobile Network Code (2 or 3 digits string, digit: 0~9)
+ - profileType: pdusessest
+ profileName: profile2
+ enable: true
+ gnbName: gnb1
+ startImsi: 2089300007492
+ ueCount: 5
+ plmnId:
+ mcc: 208
+ mnc: 93
+ dataPktCount: 5 # Number of UL user data packets to be transmitted. Common for all UEs
+ - profileType: deregister
+ profileName: profile3
+ enable: false
+ gnbName: gnb1
+ startImsi: 2089300007497
+ ueCount: 5
+ plmnId:
+ mcc: 208
+ mnc: 93
+ logger:
+ logLevel: info # how detailed the log will be, values: trace, debug, info, warn, error, fatal, panic
diff --git a/LICENSES/Apache-2.0.txt b/LICENSES/Apache-2.0.txt
new file mode 100644
index 0000000..4ed90b9
--- /dev/null
+++ b/LICENSES/Apache-2.0.txt
@@ -0,0 +1,208 @@
+Apache License
+
+Version 2.0, January 2004
+
+http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION,
+AND DISTRIBUTION
+
+ 1. Definitions.
+
+
+
+"License" shall mean the terms and conditions for use, reproduction, and distribution
+as defined by Sections 1 through 9 of this document.
+
+
+
+"Licensor" shall mean the copyright owner or entity authorized by the copyright
+owner that is granting the License.
+
+
+
+"Legal Entity" shall mean the union of the acting entity and all other entities
+that control, are controlled by, or are under common control with that entity.
+For the purposes of this definition, "control" means (i) the power, direct
+or indirect, to cause the direction or management of such entity, whether
+by contract or otherwise, or (ii) ownership of fifty percent (50%) or more
+of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+
+
+"You" (or "Your") shall mean an individual or Legal Entity exercising permissions
+granted by this License.
+
+
+
+"Source" form shall mean the preferred form for making modifications, including
+but not limited to software source code, documentation source, and configuration
+files.
+
+
+
+"Object" form shall mean any form resulting from mechanical transformation
+or translation of a Source form, including but not limited to compiled object
+code, generated documentation, and conversions to other media types.
+
+
+
+"Work" shall mean the work of authorship, whether in Source or Object form,
+made available under the License, as indicated by a copyright notice that
+is included in or attached to the work (an example is provided in the Appendix
+below).
+
+
+
+"Derivative Works" shall mean any work, whether in Source or Object form,
+that is based on (or derived from) the Work and for which the editorial revisions,
+annotations, elaborations, or other modifications represent, as a whole, an
+original work of authorship. For the purposes of this License, Derivative
+Works shall not include works that remain separable from, or merely link (or
+bind by name) to the interfaces of, the Work and Derivative Works thereof.
+
+
+
+"Contribution" shall mean any work of authorship, including the original version
+of the Work and any modifications or additions to that Work or Derivative
+Works thereof, that is intentionally submitted to Licensor for inclusion in
+the Work by the copyright owner or by an individual or Legal Entity authorized
+to submit on behalf of the copyright owner. For the purposes of this definition,
+"submitted" means any form of electronic, verbal, or written communication
+sent to the Licensor or its representatives, including but not limited to
+communication on electronic mailing lists, source code control systems, and
+issue tracking systems that are managed by, or on behalf of, the Licensor
+for the purpose of discussing and improving the Work, but excluding communication
+that is conspicuously marked or otherwise designated in writing by the copyright
+owner as "Not a Contribution."
+
+
+
+"Contributor" shall mean Licensor and any individual or Legal Entity on behalf
+of whom a Contribution has been received by Licensor and subsequently incorporated
+within the Work.
+
+2. Grant of Copyright License. Subject to the terms and conditions of this
+License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive,
+no-charge, royalty-free, irrevocable copyright license to reproduce, prepare
+Derivative Works of, publicly display, publicly perform, sublicense, and distribute
+the Work and such Derivative Works in Source or Object form.
+
+3. Grant of Patent License. Subject to the terms and conditions of this License,
+each Contributor hereby grants to You a perpetual, worldwide, non-exclusive,
+no-charge, royalty-free, irrevocable (except as stated in this section) patent
+license to make, have made, use, offer to sell, sell, import, and otherwise
+transfer the Work, where such license applies only to those patent claims
+licensable by such Contributor that are necessarily infringed by their Contribution(s)
+alone or by combination of their Contribution(s) with the Work to which such
+Contribution(s) was submitted. If You institute patent litigation against
+any entity (including a cross-claim or counterclaim in a lawsuit) alleging
+that the Work or a Contribution incorporated within the Work constitutes direct
+or contributory patent infringement, then any patent licenses granted to You
+under this License for that Work shall terminate as of the date such litigation
+is filed.
+
+4. Redistribution. You may reproduce and distribute copies of the Work or
+Derivative Works thereof in any medium, with or without modifications, and
+in Source or Object form, provided that You meet the following conditions:
+
+(a) You must give any other recipients of the Work or Derivative Works a copy
+of this License; and
+
+(b) You must cause any modified files to carry prominent notices stating that
+You changed the files; and
+
+(c) You must retain, in the Source form of any Derivative Works that You distribute,
+all copyright, patent, trademark, and attribution notices from the Source
+form of the Work, excluding those notices that do not pertain to any part
+of the Derivative Works; and
+
+(d) If the Work includes a "NOTICE" text file as part of its distribution,
+then any Derivative Works that You distribute must include a readable copy
+of the attribution notices contained within such NOTICE file, excluding those
+notices that do not pertain to any part of the Derivative Works, in at least
+one of the following places: within a NOTICE text file distributed as part
+of the Derivative Works; within the Source form or documentation, if provided
+along with the Derivative Works; or, within a display generated by the Derivative
+Works, if and wherever such third-party notices normally appear. The contents
+of the NOTICE file are for informational purposes only and do not modify the
+License. You may add Your own attribution notices within Derivative Works
+that You distribute, alongside or as an addendum to the NOTICE text from the
+Work, provided that such additional attribution notices cannot be construed
+as modifying the License.
+
+You may add Your own copyright statement to Your modifications and may provide
+additional or different license terms and conditions for use, reproduction,
+or distribution of Your modifications, or for any such Derivative Works as
+a whole, provided Your use, reproduction, and distribution of the Work otherwise
+complies with the conditions stated in this License.
+
+5. Submission of Contributions. Unless You explicitly state otherwise, any
+Contribution intentionally submitted for inclusion in the Work by You to the
+Licensor shall be under the terms and conditions of this License, without
+any additional terms or conditions. Notwithstanding the above, nothing herein
+shall supersede or modify the terms of any separate license agreement you
+may have executed with Licensor regarding such Contributions.
+
+6. Trademarks. This License does not grant permission to use the trade names,
+trademarks, service marks, or product names of the Licensor, except as required
+for reasonable and customary use in describing the origin of the Work and
+reproducing the content of the NOTICE file.
+
+7. Disclaimer of Warranty. Unless required by applicable law or agreed to
+in writing, Licensor provides the Work (and each Contributor provides its
+Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied, including, without limitation, any warranties
+or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR
+A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness
+of using or redistributing the Work and assume any risks associated with Your
+exercise of permissions under this License.
+
+8. Limitation of Liability. In no event and under no legal theory, whether
+in tort (including negligence), contract, or otherwise, unless required by
+applicable law (such as deliberate and grossly negligent acts) or agreed to
+in writing, shall any Contributor be liable to You for damages, including
+any direct, indirect, special, incidental, or consequential damages of any
+character arising as a result of this License or out of the use or inability
+to use the Work (including but not limited to damages for loss of goodwill,
+work stoppage, computer failure or malfunction, or any and all other commercial
+damages or losses), even if such Contributor has been advised of the possibility
+of such damages.
+
+9. Accepting Warranty or Additional Liability. While redistributing the Work
+or Derivative Works thereof, You may choose to offer, and charge a fee for,
+acceptance of support, warranty, indemnity, or other liability obligations
+and/or rights consistent with this License. However, in accepting such obligations,
+You may act only on Your own behalf and on Your sole responsibility, not on
+behalf of any other Contributor, and only if You agree to indemnify, defend,
+and hold each Contributor harmless for any liability incurred by, or claims
+asserted against, such Contributor by reason of your accepting any such warranty
+or additional liability. END OF TERMS AND CONDITIONS
+
+APPENDIX: How to apply the Apache License to your work.
+
+To apply the Apache License to your work, attach the following boilerplate
+notice, with the fields enclosed by brackets "[]" replaced with your own identifying
+information. (Don't include the brackets!) The text should be enclosed in
+the appropriate comment syntax for the file format. We also recommend that
+a file or class name and description of purpose be included on the same "printed
+page" as the copyright notice for easier identification within third-party
+archives.
+
+Copyright [yyyy] [name of copyright owner]
+
+Licensed under the Apache License, Version 2.0 (the "License");
+
+you may not use this file except in compliance with the License.
+
+You may obtain a copy of the License at
+
+http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+
+distributed under the License is distributed on an "AS IS" BASIS,
+
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+
+See the License for the specific language governing permissions and
+
+limitations under the License.
diff --git a/LICENSES/LicenseRef-ONF-Member-Only-1.0.txt b/LICENSES/LicenseRef-ONF-Member-Only-1.0.txt
new file mode 100644
index 0000000..399d958
--- /dev/null
+++ b/LICENSES/LicenseRef-ONF-Member-Only-1.0.txt
@@ -0,0 +1,294 @@
+ONF Member-Only Software License
+Version 1.0
+Nov 2021
+
+This ONF Member-Only Software License (this "License") is entered into by and
+between Open Networking Foundation ("ONF") and you and/or the entity on whose
+behalf you are accessing the Works (as defined in Section 1 below) ("you").
+This License forms a legally binding contract between you and ONF in relation
+to your access to and use of the Works. You may not access or use the Works if
+you do not accept this License.
+
+By accessing or using the Works, you hereby agree to the terms of this License.
+You may not use the Works and may not accept this License if you are a person
+barred from receiving the Works under the laws of the United States or other
+countries, including the country from which you access or use the Works. If you
+are agreeing to be bound by this License on behalf of your employer or other
+entity, you represent and warrant that you have full legal authority to bind
+your employer or such entity to this License. If you do not have the requisite
+authority, you may not accept this License or access or use the Works on behalf
+of your employer or any other entity. You and ONF acknowledge and agree as
+follows:
+
+1. DEFINITIONS.
+
+"Source" form shall mean the preferred form for making modifications, including
+but not limited to software source code, documentation source, and
+configuration files.
+
+"Object" form shall mean any form resulting from mechanical transformation or
+translation of a Source form, including but not limited to compiled object
+code, generated documentation, and conversions to other media types.
+
+"Works" shall mean the works of authorship, whether in Source or Object form,
+made available under this License, as indicated by a copyright notice/header
+file that is included in or attached to the Works.
+
+2. BACKGROUND.
+
+The purpose of this License is to provide ONF member companies in good standing
+("Members") with early access to software projects currently in development by
+ONF prior to their public release, to allow Members to review and test the
+Works internally for the purpose of making further contributions to the
+applicable project. Members who are Partner-level Members at the time they
+first access the Works are additionally permitted under this License to use the
+Works internally for the purpose of building and developing products and
+services for commercial purposes as defined in Section 4. However, this
+License does not permit any Member, regardless of Member level, to redistribute
+all or any portion of the Works, except as part of a contribution back to the
+applicable project, in accordance with Section 8 below, or in binary form as
+provided for Partner-level Members in Section 4 below. You understand and
+agree that ONF has the sole right to sublicense and distribute a public version
+of the final code base for the applicable project to third parties under the
+2.0 version of the Apache License, or other permissive license terms selected
+by ONF in its sole discretion.
+
+The Purpose of this License is to incubate the development of new software
+projects by providing a framework for ONF Members to access and contribute to
+the projects while minimizing the potential for forking or misuse of the
+projects. Nothing in this Background paragraph, however, shall require ONF to
+take any particular course of action regarding any Works covered by this
+License.
+
+3. LIMITED LICENSE TO ALL MEMBERS IN GOOD STANDING.
+
+Subject to your complete and ongoing compliance with all the terms and
+conditions set forth in this License, including without limitation all license
+limitations and restrictions set forth herein, ONF grants you the following
+limited, non-exclusive, non-transferable, non-sublicensable, revocable license
+to use, and (where applicable) authorize your employees and contractors
+performing work on your behalf (but only if such contractors are themselves
+Members of ONF and accept the terms of this License) to use the Works
+internally solely in connection with (a) reviewing, testing, modifying and
+creating derivatives of the Works for the sole purpose of making contributions
+by you to the code repository for the applicable project maintained by ONF; and
+(b) building, developing and testing your own applications or components that
+may interoperate with or incorporate the Works ("Applications") for the
+purposes of internal evaluation only.
+
+4. ADDITIONAL LICENSE TO PARTNER-LEVEL MEMBERS IN GOOD STANDING.
+
+Each project subject to this License shall be declared by ONF to be in one of
+two phases: a) Incubation Phase, or b) Partner Commercialization Phase. Each
+project shall start in the Incubation Phase, and ONF, at its sole discretion,
+shall determine when each project moves into the Partner Commercialization
+Phase. Each project shall be documented to be in one of these two phases in
+the Project's README documentation and can be confirmed by contacting ONF.
+
+Once any project moves into the Partner Commercialization Phase, if you are a
+Partner-level ONF Member in good standing at the time you first access the
+Works and for the entire period during which you access and use the Works, in
+addition to the rights granted in Section 3, and subject to your complete and
+ongoing compliance with all the terms and conditions set forth in this License,
+including without limitation all license limitations and restrictions set forth
+herein, ONF grants you the limited, non-exclusive, non-transferable,
+non-sublicensable, revocable license to use, and (where applicable) authorize
+your employees and contractors performing work on your behalf (but only if such
+contractors are themselves Members of ONF and accept the terms of this License)
+to use, test, modify and create derivatives of the Works internally for the
+purpose of building, developing, testing, marketing, offering for sale and
+selling commercial products and services to third parties. Wherever possible,
+you will take reasonable precautions to ensure Works remain accessible only to
+ONF Members, and any commercial product or service requiring redistribution of
+the Works, of modifications of the Works or of derivatives of the Works must be
+made solely in binary machine code form where possible to further this aim.
+
+Partners-level Members gaining additional insights as a result of accessing and
+using the Works for commercial products and services are expected to provide
+feedback to and to make contributions to the project for the benefit of both
+the project and the general membership.
+
+You may verify your company's Partner-level membership status on the ONF
+website at: https://www.opennetworking.org/member-listing/.
+
+4.1 GRACE PERIOD FOR NON-PARTNER-LEVEL MEMBERS
+
+If you are not a Partner-level Member and you wish to benefit from the rights
+granted to ONF Partners in Section 4, you have a 90-day grace period from the
+day you first access the Works to upgrade to a Partner-Level ONF Membership.
+Should you upgrade within this grace period, you will be recognized as if you
+had been a Partner on the day you first accessed the Works for the purpose of
+interpreting your rights under Section 4.
+
+5. RESTRICTIONS.
+
+By accessing or using the Works, you represent, warrant, and covenant that you
+and/or the entity on whose behalf you are accessing the Works is a Member in
+good standing of ONF.
+
+You acknowledge that, except for the limited rights expressly set forth above,
+the foregoing licenses do not include any right to, and you agree not to (i)
+redistribute, sell, lease, license, modify or otherwise create any derivative
+works of any portion of the Works, or (ii) distribute, deploy, or otherwise
+utilize the Works or Applications for any public, production, commercial, or
+other similar purpose other than internal use for evaluation and development of
+contributions to the code repository for the applicable project maintained by
+ONF and non-public, experimental Applications.
+
+Except as expressly provided herein, you may not (w) reproduce, distribute,
+publicly display, or publicly perform any part of the Works, (x) decompile,
+reverse engineer, or otherwise access or attempt to access source code not made
+available to you in source code form, (y) make or attempt to make any
+modification to, or otherwise create any derivative works of, the Works; or (z)
+remove, obscure, interfere with or circumvent any feature of the Works,
+including without limitation any copyright or other intellectual property
+notices, security, or access control mechanism. You agree that you will not use
+the Works to do anything illegal, including facilitating, promoting, or
+otherwise encouraging any illegal activities.
+
+You represent and warrant that the Works will not be shipped, transferred or
+exported into any country or used in any manner prohibited by the United States
+Export Administration Act or any other export laws, restrictions or regulations
+(collectively the "Export Laws"). In addition, if the Works are identified as
+an export controlled item under the Export Laws, you represent and warrant that
+you are not a citizen, or otherwise located within, an embargoed nation
+(including without limitation Crimea, Cuba, Iran, North Korea, Sudan, or Syria)
+and that you are not otherwise prohibited under the Export Laws from receiving
+the Works.
+
+ANY USE IN VIOLATION OF THE FOREGOING LIMITATIONS AND RESTRICTIONS IS STRICTLY
+PROHIBITED, AND UNLICENSED.
+
+6. RESERVATION OF RIGHTS.
+
+The Works are owned by ONF and/or its licensors, and are licensed, not sold, to
+you. The Works are protected by copyright, trade dress, patent, and trademark
+laws of the United States and other jurisdictions, international conventions,
+and all other relevant intellectual property and proprietary rights, and
+applicable laws (collectively, the "Intellectual Property Rights"). You agree
+that ONF or its subsidiaries or affiliated companies and/or its licensors own
+all legal right, title and interest in and to the Works, including any and all
+Intellectual Property Rights. ONF reserves all rights not expressly granted in
+this License. You do not acquire any right, title or interest to the Works,
+whether by implication, estoppel, or otherwise, except for the limited rights
+set forth in this License.
+
+You agree that the form and nature of the Works that ONF provides may change
+without prior notice to you and that future versions of the Works may be
+incompatible with applications developed using previous versions of the Works.
+You agree that ONF may stop (permanently or temporarily) providing the Works
+(or any features within the Works) to you or to users generally at ONF's sole
+discretion, without prior notice to you. Nothing in this License gives you a
+right to use any of ONF's trade names, trademarks, service marks, logos, domain
+names, or other distinctive brand features.
+
+7. PURPOSE AND USE.
+
+You agree that you will not engage in any activity with the Works, including
+the development or distribution of an Application that interferes with,
+disrupts, damages, or accesses in an unauthorized manner the servers, networks,
+or other properties or services of any third party. You agree that you are
+solely responsible for (and that ONF has no responsibility to you or to any
+third party for) any data, content, or resources that you create, transmit or
+display. You agree that you are solely responsible for (and that ONF has no
+responsibility to you or to any third party for) any breach of your obligations
+under this License, any applicable third party contract or terms of service, or
+any applicable law or regulation, and for the consequences (including any loss
+or damage which ONF or any third party may suffer) of any such breach.
+
+8. FEEDBACK; CONTRIBUTIONS.
+
+If you provide ONF with any comments, bug reports, feedback, enhancements, or
+modifications proposed or suggested by you for the Works ("Feedback"), such
+Feedback will be submitted as a Contribution to the applicable project
+maintained by ONF under the terms and conditions of a Contributor License
+Agreement between you and ONF, is provided on a non-confidential basis
+(notwithstanding any notice to the contrary you may include in any accompanying
+communication), and ONF shall have the right to use such Feedback at its
+discretion, including, but not limited to the incorporation of such Feedback
+into the Works and any final code base that may be derived from the Works.
+
+9. TERMINATION OF THIS LICENSE.
+
+This License will continue to apply until terminated by either you or ONF as
+set out below. If you want to terminate this License, you may do so by ceasing
+your use of the Works. If you cease being a Member in good standing of ONF,
+this License will terminate automatically and without further notice to you.
+ONF may at any time terminate this License: (a) if you have breached any
+provision of this License; or (b) at ONF's convenience. When this License
+comes to an end, except as otherwise set forth in this paragraph 9, all of the
+legal rights, obligations and liabilities that you and ONF have benefited from,
+been subject to (or which have accrued over time while this License has been in
+force) or which are expressed to continue indefinitely, shall be unaffected by
+this cessation, and paragraphs 1, 2 and 5 through 14 shall continue to apply to
+such rights, obligations and liabilities indefinitely. In addition, unless
+this License is terminated by ONF as a result of your breach of any provision
+of this License, Partner-level Members entitled to the benefits of Section 4 of
+this License shall also retain all rights granted by Section 4 so as long as
+you remain a Partner-level Member in good standing.
+
+10. DISCLAIMER OF WARRANTIES.
+
+YOU EXPRESSLY UNDERSTAND AND AGREE THAT YOUR USE OF THE WORKS IS AT YOUR SOLE
+RISK AND THAT THE WORKS ARE PROVIDED "AS IS" AND "AS AVAILABLE" WITHOUT
+WARRANTY OF ANY KIND FROM ONF. YOUR USE OF THE WORKS IS AT YOUR OWN DISCRETION
+AND RISK AND YOU ARE SOLELY RESPONSIBLE FOR ANY DAMAGE TO YOUR COMPUTER SYSTEM
+OR OTHER DEVICE OR LOSS OF DATA THAT RESULTS FROM SUCH USE. ONF FURTHER
+EXPRESSLY DISCLAIMS ALL WARRANTIES AND CONDITIONS OF ANY KIND, WHETHER EXPRESS
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO THE IMPLIED WARRANTIES AND CONDITIONS
+OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. ONF
+EXPRESSLY DISCLAIMS ANY WARRANTIES OF ANY KIND WITH RESPECT TO THE ACCURACY OR
+FUNCTIONALITY OF THE WORKS, AND WITH RESPECT TO THE ACCURACY, VALIDITY, OR
+COMPLETENESS OF ANY INFORMATION OR FEATURES AVAILABLE THROUGH THE WORKS, OR THE
+QUALITY OR CONSISTENCY OF THE WORKS OR RESULTS OBTAINED THROUGH THEIR USE.
+
+11. LIMITATION OF LIABILITY.
+
+YOU EXPRESSLY UNDERSTAND AND AGREE THAT ONF, ITS SUBSIDIARIES AND AFFILIATES,
+AND ITS LICENSORS SHALL NOT BE LIABLE TO YOU UNDER ANY THEORY OF LIABILITY FOR
+ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, CONSEQUENTIAL OR EXEMPLARY DAMAGES
+THAT MAY BE INCURRED BY YOU, INCLUDING ANY LOSS OF DATA, WHETHER OR NOT ONF OR
+ITS REPRESENTATIVES HAVE BEEN ADVISED OF OR SHOULD HAVE BEEN AWARE OF THE
+POSSIBILITY OF ANY SUCH LOSSES. IN NO EVENT WILL ONF'S AGGREGATE LIABILITY FOR
+DAMAGES ARISING OUT OF THIS LICENSE OR YOUR USE OF THE WORKS EXCEED THE GREATER
+OF AMOUNTS PAID BY YOU FOR THE WORKS, IF ANY.
+
+12. INDEMNIFICATION.
+
+To the maximum extent permitted by law, you agree to defend, indemnify and hold
+harmless ONF, its affiliates and their respective directors, officers,
+employees and agents from and against any and all claims, actions, suits or
+proceedings, as well as any and all losses, liabilities, damages, costs and
+expenses (including reasonable attorneys' fees) arising out of or accruing from
+(a) your use of the Works, (b) any Application or (for Partner-level Members)
+commercial product or service you develop using the Works that infringes any
+copyright, trademark, trade secret, trade dress, patent or other intellectual
+property right of any person, and (c) any non-compliance by you with this
+License or any applicable law or regulation.
+
+13. CHANGES TO THIS LICENSE.
+
+ONF may make changes to this License as it distributes new versions of the
+Works. When these changes are made, ONF will make a new version of this License
+available on the ONF website.
+
+14. MISCELLANEOUS TERMS.
+
+This License constitutes the entire legal agreement between you and ONF with
+regard to your access and use of the Works, and governs your access and use of
+the Works and completely supersedes any prior agreements between you and ONF in
+relation to the Works, except for any Contributor License Agreement you may
+have executed with ONF. You agree that if ONF does not exercise or enforce any
+legal right or remedy which is contained in this License (or which ONF has the
+benefit of under any applicable law), this will not be taken to be a formal
+waiver of ONF's rights and that those rights or remedies will still be
+available to ONF. If any court of law, having the jurisdiction to decide on
+this matter, rules that any provision of this License is invalid, then that
+provision will be removed from this License without affecting the rest of this
+License. The remaining provisions of this License will continue to be valid and
+enforceable so long as this License, as so modified, does not substantially
+impair the respective expectations or reciprocal obligations of the parties.
+The rights granted in this License may not be assigned or transferred by you
+without the prior written approval of ONF. You shall not be permitted to
+delegate your responsibilities or obligations under this License without the
+prior written approval of ONF.
diff --git a/LICENSES/MIT.txt b/LICENSES/MIT.txt
new file mode 100644
index 0000000..204b93d
--- /dev/null
+++ b/LICENSES/MIT.txt
@@ -0,0 +1,19 @@
+MIT License Copyright (c) <year> <copyright holders>
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is furnished
+to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice (including the next
+paragraph) shall be included in all copies or substantial portions of the
+Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS
+OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF
+OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/Makefile b/Makefile
new file mode 100644
index 0000000..b240541
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,21 @@
+# SPDX-FileCopyrightText: 2021-present Open Networking Foundation <info@opennetworking.org>
+#
+# SPDX-License-Identifier: LicenseRef-ONF-Member-Only-1.0
+.PHONY: all test clean
+
+all:
+ test
+
+clean: # @HELP clean up temporary files for omec-control-plane
+ rm -rf omec-control-plane/charts omec-control-plane/requirements.lock
+
+test: # @HELP run the acceptance tests
+ helm dep update omec-control-plane
+
+help:
+ @grep -E '^.*: *# *@HELP' $(MAKEFILE_LIST) \
+ | sort \
+ | awk ' \
+ BEGIN {FS = ": *# *@HELP"}; \
+ {printf "\033[36m%-30s\033[0m %s\n", $$1, $$2}; \
+ '
diff --git a/VERSION b/VERSION
new file mode 100644
index 0000000..0d4d124
--- /dev/null
+++ b/VERSION
@@ -0,0 +1 @@
+0.1.0-dev
diff --git a/omec-control-plane/.gitignore b/omec-control-plane/.gitignore
new file mode 100644
index 0000000..894f7fe
--- /dev/null
+++ b/omec-control-plane/.gitignore
@@ -0,0 +1,5 @@
+# SPDX-FileCopyrightText: 2020-present Open Networking Foundation <info@opennetworking.org>
+#
+# SPDX-License-Identifier: LicenseRef-ONF-Member-Only-1.0
+
+charts/
diff --git a/omec-control-plane/.helmignore b/omec-control-plane/.helmignore
new file mode 100644
index 0000000..0d5155a
--- /dev/null
+++ b/omec-control-plane/.helmignore
@@ -0,0 +1,25 @@
+# SPDX-FileCopyrightText: 2020-present Open Networking Foundation <info@opennetworking.org>
+#
+# SPDX-License-Identifier: LicenseRef-ONF-Member-Only-1.0
+
+# Patterns to ignore when building packages.
+# This supports shell glob matching, relative path matching, and
+# negation (prefixed with !). Only one pattern per line.
+.DS_Store
+# Common VCS dirs
+.git/
+.gitignore
+.bzr/
+.bzrignore
+.hg/
+.hgignore
+.svn/
+# Common backup files
+*.swp
+*.bak
+*.tmp
+*~
+# Various IDEs
+.project
+.idea/
+*.tmproj
diff --git a/omec-control-plane/Chart.yaml b/omec-control-plane/Chart.yaml
new file mode 100644
index 0000000..f1aa0b3
--- /dev/null
+++ b/omec-control-plane/Chart.yaml
@@ -0,0 +1,13 @@
+---
+# Copyright 2018 Intel Corporation
+# Copyright 2018-present Open Networking Foundation
+#
+# SPDX-License-Identifier: Apache-2.0
+# SPDX-License-Identifier: LicenseRef-ONF-Member-Only-1.0
+
+apiVersion: v1
+description: OMEC control plane services
+name: omec-control-plane
+icon: https://guide.opencord.org/logos/cord.svg
+
+version: 0.7.14
diff --git a/omec-control-plane/requirements.yaml b/omec-control-plane/requirements.yaml
new file mode 100644
index 0000000..49146fd
--- /dev/null
+++ b/omec-control-plane/requirements.yaml
@@ -0,0 +1,9 @@
+# Copyright 2019-present Open Networking Foundation
+#
+# SPDX-License-Identifier: LicenseRef-ONF-Member-Only-1.0
+
+dependencies:
+ - name: cassandra
+ version: 0.13.1
+ repository: https://charts.helm.sh/incubator
+ condition: cassandra.deploy
diff --git a/omec-control-plane/templates/NOTES.txt b/omec-control-plane/templates/NOTES.txt
new file mode 100644
index 0000000..78c519b
--- /dev/null
+++ b/omec-control-plane/templates/NOTES.txt
@@ -0,0 +1,21 @@
+{{- /*
+
+# Copyright 2018 Intel Corporation
+# Copyright 2018-present Open Networking Foundation
+#
+# SPDX-License-Identifier: Apache-2.0
+# SPDX-License-Identifier: LicenseRef-ONF-Member-Only-1.0
+
+*/ -}}
+
+This is the instruction to configure your eNodeB to work with ONF M-CORD. You can find architecture illustration in assets/mcord-architecture.png.
+
+1. Configure eNodeB with the correct MME information.
+ export MMEIP=[node IP]
+ export MMEPORT="36412"
+
+ You can change MMEPORT by overriding "Values.config.mme.s1ap.sctp_port_external".
+
+2. Make sure UE's SIM card information is configured in hss.yaml.
+
+3. Attach UE to OMEC.
diff --git a/omec-control-plane/templates/_helpers.tpl b/omec-control-plane/templates/_helpers.tpl
new file mode 100644
index 0000000..be7fc5f
--- /dev/null
+++ b/omec-control-plane/templates/_helpers.tpl
@@ -0,0 +1,133 @@
+{{- /*
+
+# Copyright 2018 Intel Corporation
+# Copyright 2018-present Open Networking Foundation
+#
+# SPDX-License-Identifier: Apache-2.0
+# SPDX-License-Identifier: LicenseRef-ONF-Member-Only-1.0
+
+*/ -}}
+
+{{/*
+Renders a set of standardised labels
+*/}}
+{{- define "omec-control-plane.metadata_labels" -}}
+{{- $application := index . 0 -}}
+{{- $context := index . 1 -}}
+release: {{ $context.Release.Name }}
+app: {{ $application }}
+{{- end -}}
+
+{{/*
+Render the given template.
+*/}}
+{{- define "omec-control-plane.template" -}}
+{{- $name := index . 0 -}}
+{{- $context := index . 1 -}}
+{{- $last := base $context.Template.Name }}
+{{- $wtf := $context.Template.Name | replace $last $name -}}
+{{ include $wtf $context }}
+{{- end -}}
+
+{{/*
+Return domain name for Diameter identity, realm, and hostname for a given application.
+*/}}
+{{- define "omec-control-plane.diameter_endpoint" -}}
+{{- $service := index . 0 -}}
+{{- $type := index . 1 -}}
+{{- $context := index . 2 -}}
+{{- if eq $type "identity" -}}
+{{- printf "%s.%s.svc.%s" $service $context.Release.Namespace $context.Values.config.clusterDomain -}}
+{{- else if eq $type "realm" -}}
+{{- printf "%s.svc.%s" $context.Release.Namespace $context.Values.config.clusterDomain -}}
+{{- else if eq $type "host" -}}
+{{- printf "%s" $service -}}
+{{- end -}}
+{{- end -}}
+
+{{/*
+Render ServiceAccount, Role, and RoleBinding required for kubernetes-entrypoint.
+*/}}
+{{- define "omec-control-plane.service_account" -}}
+{{- $context := index . 1 -}}
+{{- $saName := index . 0 -}}
+{{- $saNamespace := $context.Release.Namespace }}
+---
+apiVersion: v1
+kind: ServiceAccount
+metadata:
+ name: {{ $saName }}
+ namespace: {{ $saNamespace }}
+ labels:
+{{ tuple $saName $context | include "omec-control-plane.metadata_labels" | indent 4 }}
+---
+{{- if semverCompare ">=1.16-0" $context.Capabilities.KubeVersion.GitVersion }}
+apiVersion: rbac.authorization.k8s.io/v1
+{{- else }}
+apiVersion: rbac.authorization.k8s.io/v1beta1
+{{- end }}
+kind: RoleBinding
+metadata:
+ name: {{ $saName }}
+ namespace: {{ $saNamespace }}
+ labels:
+{{ tuple $saName $context | include "omec-control-plane.metadata_labels" | indent 4 }}
+roleRef:
+ apiGroup: rbac.authorization.k8s.io
+ kind: Role
+ name: {{ $saName }}
+subjects:
+ - kind: ServiceAccount
+ name: {{ $saName }}
+ namespace: {{ $saNamespace }}
+---
+{{- if semverCompare ">=1.16-0" $context.Capabilities.KubeVersion.GitVersion }}
+apiVersion: rbac.authorization.k8s.io/v1
+{{- else }}
+apiVersion: rbac.authorization.k8s.io/v1beta1
+{{- end }}
+kind: Role
+metadata:
+ name: {{ $saName }}
+ namespace: {{ $saNamespace }}
+ labels:
+{{ tuple $saName $context | include "omec-control-plane.metadata_labels" | indent 4 }}
+rules:
+ - apiGroups:
+ - ""
+ - extensions
+ - batch
+ - apps
+ verbs:
+ - get
+ - list
+ - patch
+ resources:
+ - statefulsets
+ - daemonsets
+ - jobs
+ - pods
+ - services
+ - endpoints
+ - configmaps
+{{- end -}}
+
+{{/*
+Render init container for coredump.
+*/}}
+{{- define "omec-control-plane.coredump_init" -}}
+{{- $pod := index . 0 -}}
+{{- $context := index . 1 -}}
+- name: {{ $pod }}-coredump-init
+ image: {{ $context.Values.images.tags.init | quote }}
+ imagePullPolicy: {{ $context.Values.images.pullPolicy }}
+ securityContext:
+ privileged: true
+ runAsUser: 0
+ command: ["sh", "-xc"]
+ args:
+ - echo '/tmp/coredump/core.%h.%e.%t' > /mnt/host-rootfs/proc/sys/kernel/core_pattern
+ volumeMounts:
+ - name: host-rootfs
+ mountPath: /mnt/host-rootfs
+{{- end -}}
diff --git a/omec-control-plane/templates/bin/_config4g-run.sh.tpl b/omec-control-plane/templates/bin/_config4g-run.sh.tpl
new file mode 100644
index 0000000..b568195
--- /dev/null
+++ b/omec-control-plane/templates/bin/_config4g-run.sh.tpl
@@ -0,0 +1,17 @@
+#!/bin/sh
+
+# Copyright 2020-present Open Networking Foundation
+#
+# SPDX-License-Identifier: LicenseRef-ONF-Member-Only-1.0
+
+set -xe
+
+{{- if .Values.config.coreDump.enabled }}
+cp /free5gc/webconsole/webconsole /tmp/coredump/
+{{- end }}
+
+cd /free5gc
+
+cat config/webuicfg.conf
+
+./webconsole/webconsole -webuicfg config/webuicfg.conf
diff --git a/omec-control-plane/templates/bin/_hss-bootstrap.sh.tpl b/omec-control-plane/templates/bin/_hss-bootstrap.sh.tpl
new file mode 100644
index 0000000..b6d8fda
--- /dev/null
+++ b/omec-control-plane/templates/bin/_hss-bootstrap.sh.tpl
@@ -0,0 +1,132 @@
+#!/bin/bash
+
+# Copyright 2018 Intel Corporation
+# Copyright 2019-present Open Networking Foundation
+#
+# SPDX-License-Identifier: Apache-2.0
+# SPDX-License-Identifier: LicenseRef-ONF-Member-Only-1.0
+
+set -ex
+
+function provision_users() {
+ count=${1}
+ imsi=${2}
+ msisdn=${3}
+ apn=${4}
+ key=${5}
+ opc=${6}
+ sqn=${7}
+ cassandra_ip=${8}
+ mmeidentity=${9}
+ mmerealm=${10}
+
+ for (( i=1; i<=$count; i++ ))
+ do
+ echo "IMSI=$imsi MSISDN=$msisdn"
+ cqlsh $cassandra_ip -e "INSERT INTO vhss.users_imsi (imsi, msisdn, access_restriction, key, opc, mmehost, mmeidentity_idmmeidentity, mmerealm, rand, sqn, subscription_data, supported_features) VALUES ('$imsi', $msisdn, 41, '$key', '$opc','$mmeidentity', 3, '$mmerealm', '2683b376d1056746de3b254012908e0e', $sqn, '{\"Subscription-Data\":{\"Access-Restriction-Data\":41,\"Subscriber-Status\":0,\"Network-Access-Mode\":2,\"Regional-Subscription-Zone-Code\":[\"0x0123\",\"0x4567\",\"0x89AB\",\"0xCDEF\",\"0x1234\",\"0x5678\",\"0x9ABC\",\"0xDEF0\",\"0x2345\",\"0x6789\"],\"MSISDN\":\"0x$msisdn\",\"AMBR\":{\"Max-Requested-Bandwidth-UL\":50000000,\"Max-Requested-Bandwidth-DL\":100000000},\"APN-Configuration-Profile\":{\"Context-Identifier\":0,\"All-APN-Configurations-Included-Indicator\":0,\"APN-Configuration\":{\"Context-Identifier\":0,\"PDN-Type\":0,\"Served-Party-IP-Address\":[\"0.0.0.0\"],\"Service-Selection\":\"$apn\",\"EPS-Subscribed-QoS-Profile\":{\"QoS-Class-Identifier\":9,\"Allocation-Retention-Priority\":{\"Priority-Level\":15,\"Pre-emption-Capability\":0,\"Pre-emption-Vulnerability\":0}},\"AMBR\":{\"Max-Requested-Bandwidth-UL\":50000000,\"Max-Requested-Bandwidth-DL\":100000000},\"PDN-GW-Allocation-Type\":0,\"MIP6-Agent-Info\":{\"MIP-Home-Agent-Address\":[\"172.26.17.183\"]}}},\"Subscribed-Periodic-RAU-TAU-Timer\":0}}', '{\"Supported-Features\":{\"Vendor-Id\": 10415, \"Feature-List-ID\": 2, \"Feature-List\": 134217728}}');"
+
+ if [ $? -ne 0 ];then
+ echo -e "oops! Something went wrong adding $imsi to vhss.users_imsi!\n"
+ exit 1
+ fi
+
+ cqlsh $cassandra_ip -e "INSERT INTO vhss.msisdn_imsi (msisdn, imsi) VALUES ($msisdn, '$imsi');"
+ if [ $? -ne 0 ];then
+ echo -e "oops! Something went wrong adding $imsi to vhss.msisdn_imsi!\n"
+ exit 1
+ fi
+
+ echo -e "Added $imsi\n"
+
+ imsi=`expr $imsi + 1`;
+ msisdn=`expr $msisdn + 1`
+ done
+}
+
+function provision_staticusers() {
+ imsi=${1}
+ msisdn=${2}
+ apn=${3}
+ key=${4}
+ opc=${5}
+ sqn=${6}
+ cassandra_ip=${7}
+ mmeidentity=${8}
+ mmerealm=${9}
+ staticAddr=${10}
+
+ echo "IMSI=$imsi MSISDN=$msisdn"
+ cqlsh $cassandra_ip -e "INSERT INTO vhss.users_imsi (imsi, msisdn, access_restriction, key, opc, mmehost, mmeidentity_idmmeidentity, mmerealm, rand, sqn, subscription_data, supported_features) VALUES ('$imsi', $msisdn, 41, '$key', '$opc','$mmeidentity', 3, '$mmerealm', '2683b376d1056746de3b254012908e0e', $sqn, '{\"Subscription-Data\":{\"Access-Restriction-Data\":41,\"Subscriber-Status\":0,\"Network-Access-Mode\":2,\"Regional-Subscription-Zone-Code\":[\"0x0123\",\"0x4567\",\"0x89AB\",\"0xCDEF\",\"0x1234\",\"0x5678\",\"0x9ABC\",\"0xDEF0\",\"0x2345\",\"0x6789\"],\"MSISDN\":\"0x$msisdn\",\"AMBR\":{\"Max-Requested-Bandwidth-UL\":50000000,\"Max-Requested-Bandwidth-DL\":100000000},\"APN-Configuration-Profile\":{\"Context-Identifier\":0,\"All-APN-Configurations-Included-Indicator\":0,\"APN-Configuration\":{\"Context-Identifier\":0,\"PDN-Type\":0,\"Served-Party-IP-Address\":[\"$staticAddr\"],\"Service-Selection\":\"$apn\",\"EPS-Subscribed-QoS-Profile\":{\"QoS-Class-Identifier\":9,\"Allocation-Retention-Priority\":{\"Priority-Level\":15,\"Pre-emption-Capability\":0,\"Pre-emption-Vulnerability\":0}},\"AMBR\":{\"Max-Requested-Bandwidth-UL\":50000000,\"Max-Requested-Bandwidth-DL\":100000000},\"PDN-GW-Allocation-Type\":0,\"MIP6-Agent-Info\":{\"MIP-Home-Agent-Address\":[\"172.26.17.183\"]}}},\"Subscribed-Periodic-RAU-TAU-Timer\":0}}', '{\"Supported-Features\":{\"Vendor-Id\": 10415, \"Feature-List-ID\": 2, \"Feature-List\": 134217728}}');"
+
+ cqlsh $cassandra_ip -e "INSERT INTO vhss.msisdn_imsi (msisdn, imsi) VALUES ($msisdn, '$imsi');"
+ echo -e "Added $imsi\n"
+}
+
+function provision_mme() {
+ id=$1
+ isdn=$2
+ host=$3
+ realm=$4
+ uereachability=$5
+ cassandra_ip=$6
+
+ cqlsh $cassandra_ip -e "INSERT INTO vhss.mmeidentity (idmmeidentity, mmeisdn, mmehost, mmerealm, ue_reachability) VALUES ($id, '$isdn', '$host', '$realm', $uereachability);"
+ if [ $? -ne 0 ];then
+ echo -e "oops! Something went wrong adding to vhss.mmeidentity!\n"
+ exit 1
+ fi
+
+ cqlsh $cassandra_ip -e "INSERT INTO vhss.mmeidentity_host (idmmeidentity, mmeisdn, mmehost, mmerealm, ue_reachability) VALUES ($id, '$isdn', '$host', '$realm', $uereachability);"
+ if [ $? -ne 0 ];then
+ echo -e "oops! Something went wrong adding to vhss.mmeidentity_host!\n"
+ exit 1
+ fi
+
+ echo -e "Added mme $id\n"
+}
+
+until cqlsh --file /opt/c3po/hssdb/oai_db.cql {{ .Values.config.hss.hssdb }};
+ do echo "Provisioning HSSDB";
+ sleep 2;
+done
+
+{{- if .Values.config.hss.bootstrap.enabled }}
+{{- range .Values.config.hss.bootstrap.users }}
+provision_users \
+ {{ .count }} \
+ {{ .imsiStart }} \
+ {{ .msisdnStart }} \
+ {{ .apn }} \
+ {{ .key }} \
+ {{ .opc }} \
+ {{ .sqn }} \
+ {{ $.Values.config.hss.hssdb }} \
+ {{ .mme_identity }} \
+ {{ .mme_realm }}
+{{- end }}
+
+{{- range .Values.config.hss.bootstrap.staticusers }}
+provision_staticusers \
+ {{ .imsi }} \
+ {{ .msisdn }} \
+ {{ .apn }} \
+ {{ .key }} \
+ {{ .opc }} \
+ {{ .sqn }} \
+ {{ $.Values.config.hss.hssdb }} \
+ {{ .mme_identity }} \
+ {{ .mme_realm }} \
+ {{ .staticAddr }}
+{{- end }}
+
+{{- range .Values.config.hss.bootstrap.mmes }}
+provision_mme \
+ {{ .id }} \
+ {{ .isdn }} \
+ {{ .mme_identity }} \
+ {{ .mme_realm }} \
+ {{ .unreachability }} \
+ {{ $.Values.config.hss.hssdb }}
+{{- end }}
+{{- end }}
+
diff --git a/omec-control-plane/templates/bin/_hss-run.sh.tpl b/omec-control-plane/templates/bin/_hss-run.sh.tpl
new file mode 100644
index 0000000..6f2d8e9
--- /dev/null
+++ b/omec-control-plane/templates/bin/_hss-run.sh.tpl
@@ -0,0 +1,24 @@
+#!/bin/bash
+
+# Copyright 2019-present Open Networking Foundation
+#
+# SPDX-License-Identifier: LicenseRef-ONF-Member-Only-1.0
+
+set -ex
+
+{{- if .Values.config.coreDump.enabled }}
+cp /bin/hss /tmp/coredump/
+{{- end }}
+
+CONF_DIR="/opt/c3po/hss/conf"
+LOGS_DIR="/opt/c3po/hss/logs"
+mkdir -p $CONF_DIR $LOGS_DIR
+
+cp /etc/hss/conf/{acl.conf,hss.json,hss.conf,oss.json} $CONF_DIR
+cat $CONF_DIR/{hss.json,hss.conf}
+
+cd $CONF_DIR
+make_certs.sh {{ tuple "hss" "host" . | include "omec-control-plane.diameter_endpoint" }} {{ tuple "hss" "realm" . | include "omec-control-plane.diameter_endpoint" }}
+
+cd ..
+hss -j $CONF_DIR/hss.json
diff --git a/omec-control-plane/templates/bin/_mme-init.sh.tpl b/omec-control-plane/templates/bin/_mme-init.sh.tpl
new file mode 100644
index 0000000..256da0d
--- /dev/null
+++ b/omec-control-plane/templates/bin/_mme-init.sh.tpl
@@ -0,0 +1,48 @@
+#!/bin/sh
+
+# Copyright 2019-present Open Networking Foundation
+#
+# SPDX-License-Identifier: LicenseRef-ONF-Member-Only-1.0
+
+set -ex
+
+cp /opt/mme/config/config.json /opt/mme/config/shared/config.json
+cd /opt/mme/config/shared
+
+# Set local IP address for s1ap and s11 networks to the config
+jq --arg MME_LOCAL_IP "$POD_IP" '.mme.ip_addr=$MME_LOCAL_IP' config.json > config.tmp && mv config.tmp config.json
+jq --arg MME_LOCAL_IP "$POD_IP" '.s1ap.s1ap_local_addr=$MME_LOCAL_IP' config.json > config.tmp && mv config.tmp config.json
+jq --arg MME_LOCAL_IP "$POD_IP" '.s11.egtp_local_addr=$MME_LOCAL_IP' config.json > config.tmp && mv config.tmp config.json
+
+# Set SPGWC address to the config
+# We need to convert service domain name to actual IP address
+# because mme apps does not take domain address - should be fixed in openmme
+SPGWC_ADDR=$(dig +short +search {{ .Values.config.mme.spgwAddr }})
+jq --arg SPGWC_ADDR "$SPGWC_ADDR" '.s11.sgw_addr //= $SPGWC_ADDR' config.json > config.tmp && mv config.tmp config.json
+jq --arg SPGWC_ADDR "$SPGWC_ADDR" '.s11.pgw_addr //= $SPGWC_ADDR' config.json > config.tmp && mv config.tmp config.json
+
+# Add additional redundant keys - should be fixed in openmme
+HSS_TYPE=$(jq -r '.s6a.host_type' config.json)
+HSS_HOST=$(jq -r '.s6a.host' config.json)
+jq --arg HSS_TYPE "$HSS_TYPE" '.s6a.hss_type=$HSS_TYPE' config.json > config.tmp && mv config.tmp config.json
+jq --arg HSS_HOST "$HSS_HOST" '.s6a.host_name=$HSS_HOST' config.json > config.tmp && mv config.tmp config.json
+
+# Copy the final configs for each applications
+cp /opt/mme/config/shared/config.json /opt/mme/config/shared/mme.json
+cp /opt/mme/config/shared/config.json /opt/mme/config/shared/s11.json
+cp /opt/mme/config/shared/config.json /opt/mme/config/shared/s1ap.json
+cp /opt/mme/config/shared/config.json /opt/mme/config/shared/s6a.json
+cp /opt/mme/config/s6a_fd.conf /opt/mme/config/shared/s6a_fd.conf
+
+#This multiple copies of config needs some cleanup. For now I want
+#that after running mme_init config to be present in the target directory
+cp /opt/mme/config/shared/* /openmme/target/conf/
+
+# Generate certs
+MME_IDENTITY={{ tuple "mme" "identity" . | include "omec-control-plane.diameter_endpoint" | quote }};
+DIAMETER_HOST=$(echo $MME_IDENTITY | cut -d'.' -f1)
+DIAMETER_REALM={{ tuple "mme" "realm" . | include "omec-control-plane.diameter_endpoint" | quote }};
+
+cp /openmme/target/conf/make_certs.sh /opt/mme/config/shared/make_certs.sh
+cd /opt/mme/config/shared
+./make_certs.sh $DIAMETER_HOST $DIAMETER_REALM
diff --git a/omec-control-plane/templates/bin/_mme-run.sh.tpl b/omec-control-plane/templates/bin/_mme-run.sh.tpl
new file mode 100644
index 0000000..c739aa6
--- /dev/null
+++ b/omec-control-plane/templates/bin/_mme-run.sh.tpl
@@ -0,0 +1,49 @@
+#!/bin/bash
+
+# Copyright 2019-present Open Networking Foundation
+#
+# SPDX-License-Identifier: LicenseRef-ONF-Member-Only-1.0
+
+APPLICATION=$1
+
+{{- if .Values.config.coreDump.enabled }}
+cp /openmme/target/bin/$APPLICATION /tmp/coredump/
+{{- end }}
+
+# copy config files to openmme target directly
+cp /opt/mme/config/shared/* /openmme/target/conf/
+
+cd /openmme/target
+export LD_LIBRARY_PATH=/usr/local/lib:./lib
+
+case $APPLICATION in
+ "mme-app")
+ echo "Starting mme-app"
+ echo "conf/mme.json"
+ cat conf/mme.json
+ ./bin/mme-app
+ ;;
+ "s1ap-app")
+ echo "Starting s1ap-app"
+ echo "conf/s1ap.json"
+ cat conf/s1ap.json
+ ./bin/s1ap-app
+ ;;
+ "s6a-app")
+ echo "Starting s6a-app"
+ echo "conf/s6a.json"
+ cat conf/s6a.json
+ echo "conf/s6a_fd.conf"
+ cat conf/s6a_fd.conf
+ ./bin/s6a-app
+ ;;
+ "s11-app")
+ echo "Starting s11-app"
+ echo "conf/s11.json"
+ cat conf/s11.json
+ ./bin/s11-app
+ ;;
+ *)
+ echo "invalid app $APPLICATION"
+ ;;
+esac
diff --git a/omec-control-plane/templates/bin/_pcrf-bootstrap.sh.tpl b/omec-control-plane/templates/bin/_pcrf-bootstrap.sh.tpl
new file mode 100644
index 0000000..4afc210
--- /dev/null
+++ b/omec-control-plane/templates/bin/_pcrf-bootstrap.sh.tpl
@@ -0,0 +1,14 @@
+#!/bin/bash
+
+# Copyright 2020-present Open Networking Foundation
+#
+# SPDX-License-Identifier: Apache-2.0
+# SPDX-License-Identifier: LicenseRef-ONF-Member-Only-1.0
+
+set -ex
+
+until cqlsh --file /opt/c3po/pcrfdb/pcrf_cassandra.cql {{ .Values.config.pcrf.pcrfdb }};
+ do echo "Provisioning PCRFDB";
+ sleep 2;
+done
+
diff --git a/omec-control-plane/templates/bin/_pcrf-run.sh.tpl b/omec-control-plane/templates/bin/_pcrf-run.sh.tpl
new file mode 100644
index 0000000..7be50a6
--- /dev/null
+++ b/omec-control-plane/templates/bin/_pcrf-run.sh.tpl
@@ -0,0 +1,25 @@
+#!/bin/bash
+
+# Copyright 2020-present Open Networking Foundation
+#
+# SPDX-License-Identifier: LicenseRef-ONF-Member-Only-1.0
+
+set -ex
+
+{{- if .Values.config.coreDump.enabled }}
+cp /bin/pcrf /tmp/coredump/
+{{- end }}
+
+CONF_DIR="/opt/c3po/pcrf/conf"
+LOGS_DIR="/opt/c3po/pcrf/logs"
+#TODO - Need to remove logs directory
+mkdir -p $CONF_DIR $LOGS_DIR
+
+cp /etc/pcrf/conf/{acl.conf,pcrf.json,pcrf.conf,oss.json,subscriber_mapping.json} $CONF_DIR
+cat $CONF_DIR/{pcrf.json,pcrf.conf}
+
+cd $CONF_DIR
+make_certs.sh {{ tuple "pcrf" "host" . | include "omec-control-plane.diameter_endpoint" }} {{ tuple "pcrf" "realm" . | include "omec-control-plane.diameter_endpoint" }}
+
+cd ..
+pcrf -j $CONF_DIR/pcrf.json
diff --git a/omec-control-plane/templates/bin/_spgwc-init.sh.tpl b/omec-control-plane/templates/bin/_spgwc-init.sh.tpl
new file mode 100644
index 0000000..82ca533
--- /dev/null
+++ b/omec-control-plane/templates/bin/_spgwc-init.sh.tpl
@@ -0,0 +1,26 @@
+#!/bin/sh
+
+# Copyright 2021-present Open Networking Foundation
+#
+# SPDX-License-Identifier: LicenseRef-ONF-Member-Only-1.0
+
+while ! curl -f --connect-timeout 5 http://spgwc:8080/startup
+do
+ echo Waiting for SPGWC to be ready
+ sleep 5
+done
+echo SPGWC is ready
+
+echo Posting to sync URL {{ .Values.config.spgwc.managedByRoc.syncUrl }}
+while ! curl --connect-timeout 5 -f -X POST {{ .Values.config.spgwc.managedByRoc.syncUrl }}
+do
+ echo Failed posting to sync URL
+ sleep 5
+done
+echo
+
+echo Sleeping forever
+while true
+do
+ sleep 86400
+done
\ No newline at end of file
diff --git a/omec-control-plane/templates/bin/_spgwc-run.sh.tpl b/omec-control-plane/templates/bin/_spgwc-run.sh.tpl
new file mode 100644
index 0000000..fd1096d
--- /dev/null
+++ b/omec-control-plane/templates/bin/_spgwc-run.sh.tpl
@@ -0,0 +1,44 @@
+#!/bin/bash
+
+# Copyright 2019-present Open Networking Foundation
+#
+# SPDX-License-Identifier: LicenseRef-ONF-Member-Only-1.0
+
+APPLICATION=$1
+set -xe
+
+mkdir -p /opt/cp/config
+cd /opt/cp/config
+cp /etc/cp/config/{*.json,*.conf} .
+
+case $APPLICATION in
+ "ngic_controlplane")
+ echo "Starting ngic controlplane app"
+ cat /opt/cp/config/cp.json
+ cat /opt/cp/config/subscriber_mapping.json
+ {{- if .Values.config.coreDump.enabled }}
+ cp /bin/ngic_controlplane /tmp/coredump/
+ {{- end }}
+
+ ngic_controlplane -f /etc/cp/config/
+ ;;
+
+ "gx-app")
+ echo "Starting gx-app"
+ SPGWC_IDENTITY={{ tuple "spgwc" "identity" . | include "omec-control-plane.diameter_endpoint" | quote }};
+ DIAMETER_HOST=$(echo $SPGWC_IDENTITY| cut -d'.' -f1)
+ DIAMETER_REALM={{ tuple "spgwc" "realm" . | include "omec-control-plane.diameter_endpoint" | quote }};
+ chmod +x /bin/make_certs.sh
+ cp /bin/make_certs.sh /opt/cp/config
+ /bin/make_certs.sh $DIAMETER_HOST $DIAMETER_REALM
+ {{- if .Values.config.coreDump.enabled }}
+ cp /bin/gx_app /tmp/coredump/
+ {{- end }}
+ cd /opt/cp/
+ gx_app
+ ;;
+
+ *)
+ echo "invalid app $APPLICATION"
+ ;;
+esac
diff --git a/omec-control-plane/templates/configmap-config4g.yaml b/omec-control-plane/templates/configmap-config4g.yaml
new file mode 100644
index 0000000..7a0b722
--- /dev/null
+++ b/omec-control-plane/templates/configmap-config4g.yaml
@@ -0,0 +1,40 @@
+{{/*
+# Copyright 2020-present Open Networking Foundation
+
+# SPDX-License-Identifier: LicenseRef-ONF-Member-Only-1.0
+*/}}
+
+{{- if .Values.config.config4g.deploy }}
+
+{{- if not .Values.config.useExistingConfigMap -}}
+{{- $config4gcfg := index .Values.config.config4g.cfgFiles "webuicfg.conf" }}
+{{- $config := index $config4gcfg "configuration" }}
+
+{{- if not (hasKey $config4gcfg "logger") -}}
+{{- $_ := .Values.config.logger | set $config4gcfg "logger" -}}
+{{- end }}
+
+{{- if not (hasKey $config "managedByConfigPod") -}}
+{{- $_ := .Values.config.managedByConfigPod | set $config "managedByConfigPod" -}}
+{{- end }}
+
+
+{{- end }}
+
+---
+apiVersion: v1
+kind: ConfigMap
+metadata:
+ name: config4g
+ labels:
+{{ tuple "config4g" . | include "omec-control-plane.metadata_labels" | indent 4 }}
+data:
+ config4g-run.sh: |
+{{ tuple "bin/_config4g-run.sh.tpl" . | include "omec-control-plane.template" | indent 4 }}
+{{- if not .Values.config.useExistingConfigMap -}}
+{{- range $key, $value := .Values.config.config4g.cfgFiles }}
+ {{ $key }}: |-
+{{ toYaml $value | indent 4 }}
+{{- end }}
+{{- end }}
+{{- end }}
diff --git a/omec-control-plane/templates/configmap-hss.yaml b/omec-control-plane/templates/configmap-hss.yaml
new file mode 100644
index 0000000..029a8b6
--- /dev/null
+++ b/omec-control-plane/templates/configmap-hss.yaml
@@ -0,0 +1,117 @@
+{{/*
+# Copyright 2019-present Open Networking Foundation
+
+# SPDX-License-Identifier: LicenseRef-ONF-Member-Only-1.0
+
+Default values for mcord-vepc-helm.
+This is a YAML-formatted file.
+Declare variables to be passed into your templates.
+*/}}
+
+{{- if .Values.config.hss.deploy }}
+{{- if not .Values.config.useExistingConfigMap }}
+{{- $hssJson := index .Values.config.hss.cfgFiles "hss.json" }}
+{{- $hssJsonCommon := index $hssJson "common" }}
+{{- $hssJsonHss := index $hssJson "hss" }}
+
+{{- $_ := .Values.config.hss.prometheus.port | set $hssJsonCommon "prom_port" -}}
+{{- if not (hasKey $hssJsonCommon "originhost") -}}
+{{- $_ := tuple "hss" "identity" . | include "omec-control-plane.diameter_endpoint" | set $hssJsonCommon "originhost" -}}
+{{- end }}
+{{- if not (hasKey $hssJsonCommon "originrealm") -}}
+{{- $_ := tuple "hss" "realm" . | include "omec-control-plane.diameter_endpoint" | set $hssJsonCommon "originrealm" -}}
+{{- end }}
+{{- if not (hasKey $hssJsonHss "casssrv") -}}
+{{- $_ := .Values.cassandra.fullnameOverride | set $hssJsonHss "casssrv" -}}
+{{- end }}
+{{- if not (hasKey $hssJsonHss "restport") -}}
+{{- $_ := .Values.config.hss.configPort.port | set $hssJsonHss "restport" -}}
+{{- end }}
+---
+apiVersion: v1
+kind: ConfigMap
+metadata:
+ name: hss-configs
+ labels:
+{{ tuple "hss" . | include "omec-control-plane.metadata_labels" | indent 4 }}
+data:
+ acl.conf: |
+ {{- if hasKey .Values.config.hss.acl "oldTls" }}
+ ALLOW_OLD_TLS {{ .Values.config.hss.acl.oldTls }}
+ {{- end }}
+ {{- if hasKey .Values.config.hss.acl "ipSec" }}
+ ALLOW_IPSEC {{ .Values.config.hss.acl.ipSec }}
+ {{- end }}
+ hss.conf: |
+ Identity = {{ tuple "hss" "identity" . | include "omec-control-plane.diameter_endpoint" | quote }};
+ Realm = {{ tuple "hss" "realm" . | include "omec-control-plane.diameter_endpoint" | quote }};
+ TLS_Cred = "/opt/c3po/hss/conf/{{ tuple "hss" "host" . | include "omec-control-plane.diameter_endpoint" }}.cert.pem",
+ "/opt/c3po/hss/conf/{{ tuple "hss" "host" . | include "omec-control-plane.diameter_endpoint" }}.key.pem";
+ TLS_CA = "/opt/c3po/hss/conf/cacert.pem";
+ No_SCTP;
+ Prefer_TCP;
+ No_IPv6;
+ SCTP_streams = 3;
+ NoRelay;
+ AppServThreads = 4;
+ Port = 3868;
+ SecPort = 5868;
+ LoadExtension = "/usr/local/lib/freeDiameter/acl_wl.fdx" : "/opt/c3po/hss/conf/acl.conf";
+ LoadExtension = "/usr/local/lib/freeDiameter/dict_3gpp2_avps.fdx";
+ LoadExtension = "/usr/local/lib/freeDiameter/dict_draftload_avps.fdx";
+ LoadExtension = "/usr/local/lib/freeDiameter/dict_etsi283034_avps.fdx";
+ LoadExtension = "/usr/local/lib/freeDiameter/dict_rfc4004_avps.fdx";
+ LoadExtension = "/usr/local/lib/freeDiameter/dict_rfc4006bis_avps.fdx";
+ LoadExtension = "/usr/local/lib/freeDiameter/dict_rfc4072_avps.fdx";
+ LoadExtension = "/usr/local/lib/freeDiameter/dict_rfc4590_avps.fdx";
+ LoadExtension = "/usr/local/lib/freeDiameter/dict_rfc5447_avps.fdx";
+ LoadExtension = "/usr/local/lib/freeDiameter/dict_rfc5580_avps.fdx";
+ LoadExtension = "/usr/local/lib/freeDiameter/dict_rfc5777_avps.fdx";
+ LoadExtension = "/usr/local/lib/freeDiameter/dict_rfc5778_avps.fdx";
+ LoadExtension = "/usr/local/lib/freeDiameter/dict_rfc6734_avps.fdx";
+ LoadExtension = "/usr/local/lib/freeDiameter/dict_rfc6942_avps.fdx";
+ LoadExtension = "/usr/local/lib/freeDiameter/dict_rfc7155_avps.fdx";
+ LoadExtension = "/usr/local/lib/freeDiameter/dict_rfc7683_avps.fdx";
+ LoadExtension = "/usr/local/lib/freeDiameter/dict_rfc7944_avps.fdx";
+ LoadExtension = "/usr/local/lib/freeDiameter/dict_ts29061_avps.fdx";
+ LoadExtension = "/usr/local/lib/freeDiameter/dict_ts29128_avps.fdx";
+ LoadExtension = "/usr/local/lib/freeDiameter/dict_ts29154_avps.fdx";
+ LoadExtension = "/usr/local/lib/freeDiameter/dict_ts29173_avps.fdx";
+ LoadExtension = "/usr/local/lib/freeDiameter/dict_ts29212_avps.fdx";
+ LoadExtension = "/usr/local/lib/freeDiameter/dict_ts29214_avps.fdx";
+ LoadExtension = "/usr/local/lib/freeDiameter/dict_ts29215_avps.fdx";
+ LoadExtension = "/usr/local/lib/freeDiameter/dict_ts29217_avps.fdx";
+ LoadExtension = "/usr/local/lib/freeDiameter/dict_ts29229_avps.fdx";
+ LoadExtension = "/usr/local/lib/freeDiameter/dict_ts29272_avps.fdx";
+ LoadExtension = "/usr/local/lib/freeDiameter/dict_ts29273_avps.fdx";
+ LoadExtension = "/usr/local/lib/freeDiameter/dict_ts29329_avps.fdx";
+ LoadExtension = "/usr/local/lib/freeDiameter/dict_ts29336_avps.fdx";
+ LoadExtension = "/usr/local/lib/freeDiameter/dict_ts29337_avps.fdx";
+ LoadExtension = "/usr/local/lib/freeDiameter/dict_ts29338_avps.fdx";
+ LoadExtension = "/usr/local/lib/freeDiameter/dict_ts29343_avps.fdx";
+ LoadExtension = "/usr/local/lib/freeDiameter/dict_ts29344_avps.fdx";
+ LoadExtension = "/usr/local/lib/freeDiameter/dict_ts29345_avps.fdx";
+ LoadExtension = "/usr/local/lib/freeDiameter/dict_ts29368_avps.fdx";
+ LoadExtension = "/usr/local/lib/freeDiameter/dict_ts29468_avps.fdx";
+ LoadExtension = "/usr/local/lib/freeDiameter/dict_ts32299_avps.fdx";
+ LoadExtension = "/usr/local/lib/freeDiameter/dict_S6as6d.fdx";
+ LoadExtension = "/usr/local/lib/freeDiameter/dict_S6t.fdx";
+ LoadExtension = "/usr/local/lib/freeDiameter/dict_S6c.fdx";
+{{- range $key, $value := .Values.config.hss.cfgFiles }}
+ {{ $key }}: |-
+{{ toPrettyJson $value | indent 4 }}
+{{- end }}
+{{- end }}
+---
+apiVersion: v1
+kind: ConfigMap
+metadata:
+ name: hss-scripts
+ labels:
+{{ tuple "hss" . | include "omec-control-plane.metadata_labels" | indent 4 }}
+data:
+ hss-run.sh: |
+{{ tuple "bin/_hss-run.sh.tpl" . | include "omec-control-plane.template" | indent 4 }}
+ hss-bootstrap.sh: |
+{{ tuple "bin/_hss-bootstrap.sh.tpl" . | include "omec-control-plane.template" | indent 4 }}
+{{- end }}
diff --git a/omec-control-plane/templates/configmap-mme.yaml b/omec-control-plane/templates/configmap-mme.yaml
new file mode 100644
index 0000000..f45f6ed
--- /dev/null
+++ b/omec-control-plane/templates/configmap-mme.yaml
@@ -0,0 +1,102 @@
+{{/*
+# Copyright 2019-present Open Networking Foundation
+
+# SPDX-License-Identifier: LicenseRef-ONF-Member-Only-1.0
+*/}}
+
+{{- if .Values.config.mme.deploy }}
+{{- if not .Values.config.useExistingConfigMap }}
+{{- $configJson := index .Values.config.mme.cfgFiles "config.json" }}
+{{- $configJsonMme := index $configJson "mme" }}
+{{- $configJsonS6a := index $configJson "s6a" }}
+
+{{- $_ := .Values.config.mme.prometheus.port | set $configJsonMme "prom_port" -}}
+{{- if not (hasKey $configJsonS6a "host") -}}
+{{- $_ := tuple "hss" "identity" . | include "omec-control-plane.diameter_endpoint" | set $configJsonS6a "host" -}}
+{{- end }}
+{{- if not (hasKey $configJsonS6a "realm") -}}
+{{- $_ := tuple "hss" "realm" . | include "omec-control-plane.diameter_endpoint" | set $configJsonS6a "realm" -}}
+{{- end }}
+---
+apiVersion: v1
+kind: ConfigMap
+metadata:
+ name: mme-configs
+ labels:
+{{ tuple "mme" . | include "omec-control-plane.metadata_labels" | indent 4 }}
+data:
+ s6a_fd.conf: |
+ Identity = {{ tuple "mme" "identity" . | include "omec-control-plane.diameter_endpoint" | quote }};
+ Realm = {{ tuple "mme" "realm" . | include "omec-control-plane.diameter_endpoint" | quote }};
+ TLS_Cred = "conf/{{ tuple "mme" "host" . | include "omec-control-plane.diameter_endpoint" }}.cert.pem",
+ "conf/{{ tuple "mme" "host" . | include "omec-control-plane.diameter_endpoint" }}.key.pem";
+ TLS_CA = "conf/cacert.pem";
+ AppServThreads = 40;
+ SCTP_streams = 3;
+ NoRelay;
+ No_IPv6;
+ #Port = 3868;
+ #SecPort = 3869;
+
+ ConnectPeer = {{ tuple "hss" "identity" . | include "omec-control-plane.diameter_endpoint" | quote }} { No_TLS; port = 3868; };
+
+ LoadExtension = "/usr/local/lib/freeDiameter/dict_3gpp2_avps.fdx";
+ LoadExtension = "/usr/local/lib/freeDiameter/dict_draftload_avps.fdx";
+ LoadExtension = "/usr/local/lib/freeDiameter/dict_etsi283034_avps.fdx";
+ LoadExtension = "/usr/local/lib/freeDiameter/dict_rfc4004_avps.fdx";
+ LoadExtension = "/usr/local/lib/freeDiameter/dict_rfc4006bis_avps.fdx";
+ LoadExtension = "/usr/local/lib/freeDiameter/dict_rfc4072_avps.fdx";
+ LoadExtension = "/usr/local/lib/freeDiameter/dict_rfc4590_avps.fdx";
+ LoadExtension = "/usr/local/lib/freeDiameter/dict_rfc5447_avps.fdx";
+ LoadExtension = "/usr/local/lib/freeDiameter/dict_rfc5580_avps.fdx";
+ LoadExtension = "/usr/local/lib/freeDiameter/dict_rfc5777_avps.fdx";
+ LoadExtension = "/usr/local/lib/freeDiameter/dict_rfc5778_avps.fdx";
+ LoadExtension = "/usr/local/lib/freeDiameter/dict_rfc6734_avps.fdx";
+ LoadExtension = "/usr/local/lib/freeDiameter/dict_rfc6942_avps.fdx";
+ LoadExtension = "/usr/local/lib/freeDiameter/dict_rfc7155_avps.fdx";
+ LoadExtension = "/usr/local/lib/freeDiameter/dict_rfc7683_avps.fdx";
+ LoadExtension = "/usr/local/lib/freeDiameter/dict_rfc7944_avps.fdx";
+ LoadExtension = "/usr/local/lib/freeDiameter/dict_ts29061_avps.fdx";
+ LoadExtension = "/usr/local/lib/freeDiameter/dict_ts29128_avps.fdx";
+ LoadExtension = "/usr/local/lib/freeDiameter/dict_ts29154_avps.fdx";
+ LoadExtension = "/usr/local/lib/freeDiameter/dict_ts29173_avps.fdx";
+ LoadExtension = "/usr/local/lib/freeDiameter/dict_ts29212_avps.fdx";
+ LoadExtension = "/usr/local/lib/freeDiameter/dict_ts29214_avps.fdx";
+ LoadExtension = "/usr/local/lib/freeDiameter/dict_ts29215_avps.fdx";
+ LoadExtension = "/usr/local/lib/freeDiameter/dict_ts29217_avps.fdx";
+ LoadExtension = "/usr/local/lib/freeDiameter/dict_ts29229_avps.fdx";
+ LoadExtension = "/usr/local/lib/freeDiameter/dict_ts29272_avps.fdx";
+ LoadExtension = "/usr/local/lib/freeDiameter/dict_ts29273_avps.fdx";
+ LoadExtension = "/usr/local/lib/freeDiameter/dict_ts29329_avps.fdx";
+ LoadExtension = "/usr/local/lib/freeDiameter/dict_ts29336_avps.fdx";
+ LoadExtension = "/usr/local/lib/freeDiameter/dict_ts29337_avps.fdx";
+ LoadExtension = "/usr/local/lib/freeDiameter/dict_ts29338_avps.fdx";
+ LoadExtension = "/usr/local/lib/freeDiameter/dict_ts29343_avps.fdx";
+ LoadExtension = "/usr/local/lib/freeDiameter/dict_ts29344_avps.fdx";
+ LoadExtension = "/usr/local/lib/freeDiameter/dict_ts29345_avps.fdx";
+ LoadExtension = "/usr/local/lib/freeDiameter/dict_ts29368_avps.fdx";
+ LoadExtension = "/usr/local/lib/freeDiameter/dict_ts29468_avps.fdx";
+ LoadExtension = "/usr/local/lib/freeDiameter/dict_ts32299_avps.fdx";
+ LoadExtension = "/usr/local/lib/freeDiameter/dict_S6as6d.fdx";
+ LoadExtension = "/usr/local/lib/freeDiameter/dict_S6c.fdx";
+ LoadExtension = "/usr/local/lib/freeDiameter/dict_S6t.fdx";
+ LoadExtension = "/usr/local/lib/freeDiameter/dict_SGd.fdx";
+ LoadExtension = "/usr/local/lib/freeDiameter/dict_T6aT6bT7.fdx";
+{{- range $key, $value := .Values.config.mme.cfgFiles }}
+ {{ $key }}: |-
+{{ toPrettyJson $value | indent 4 }}
+{{- end }}
+{{- end }}
+---
+apiVersion: v1
+kind: ConfigMap
+metadata:
+ name: mme-scripts
+ labels:
+{{ tuple "mme" . | include "omec-control-plane.metadata_labels" | indent 4 }}
+data:
+ mme-init.sh: |
+{{ tuple "bin/_mme-init.sh.tpl" . | include "omec-control-plane.template" | indent 4 }}
+ mme-run.sh: |
+{{ tuple "bin/_mme-run.sh.tpl" . | include "omec-control-plane.template" | indent 4 }}
+{{- end }}
diff --git a/omec-control-plane/templates/configmap-pcrf.yaml b/omec-control-plane/templates/configmap-pcrf.yaml
new file mode 100644
index 0000000..d5ad7cc
--- /dev/null
+++ b/omec-control-plane/templates/configmap-pcrf.yaml
@@ -0,0 +1,120 @@
+{{/*
+# Copyright 2020-present Open Networking Foundation
+
+# SPDX-License-Identifier: LicenseRef-ONF-Member-Only-1.0
+
+Default values for mcord-vepc-helm.
+This is a YAML-formatted file.
+Declare variables to be passed into your templates.
+*/}}
+
+{{- if .Values.config.pcrf.deploy }}
+{{- if not .Values.config.useExistingConfigMap }}
+{{- $pcrfJson := index .Values.config.pcrf.cfgFiles "pcrf.json" }}
+{{- $pcrfJsonCommon := index $pcrfJson "common" }}
+{{- $pcrfJsonHss := index $pcrfJson "pcrf" }}
+
+{{- $_ := .Values.config.pcrf.prometheus.port | set $pcrfJsonCommon "prom_port" -}}
+{{- if not (hasKey $pcrfJsonCommon "originhost") -}}
+{{- $_ := tuple "pcrf" "identity" . | include "omec-control-plane.diameter_endpoint" | set $pcrfJsonCommon "originhost" -}}
+{{- end }}
+{{- if not (hasKey $pcrfJsonCommon "originrealm") -}}
+{{- $_ := tuple "pcrf" "realm" . | include "omec-control-plane.diameter_endpoint" | set $pcrfJsonCommon "originrealm" -}}
+{{- end }}
+{{- if not (hasKey $pcrfJsonHss "casssrv") -}}
+{{- $_ := .Values.cassandra.fullnameOverride | set $pcrfJsonHss "casssrv" -}}
+{{- end }}
+{{- if not (hasKey $pcrfJsonHss "restport") -}}
+{{- $_ := .Values.config.pcrf.configPort.port | set $pcrfJsonHss "restport" -}}
+{{- end }}
+---
+apiVersion: v1
+kind: ConfigMap
+metadata:
+ name: pcrf-configs
+ labels:
+{{ tuple "pcrf" . | include "omec-control-plane.metadata_labels" | indent 4 }}
+data:
+ acl.conf: |
+ {{- if hasKey .Values.config.pcrf.acl "oldTls" }}
+ ALLOW_OLD_TLS {{ .Values.config.pcrf.acl.oldTls }}
+ {{- end }}
+ {{- if hasKey .Values.config.pcrf.acl "ipSec" }}
+ ALLOW_IPSEC {{ .Values.config.pcrf.acl.ipSec }}
+ {{- end }}
+ pcrf.conf: |
+ Identity = {{ tuple "pcrf" "identity" . | include "omec-control-plane.diameter_endpoint" | quote }};
+ Realm = {{ tuple "pcrf" "realm" . | include "omec-control-plane.diameter_endpoint" | quote }};
+ TLS_Cred = "/opt/c3po/pcrf/conf/{{ tuple "pcrf" "host" . | include "omec-control-plane.diameter_endpoint" }}.cert.pem",
+ "/opt/c3po/pcrf/conf/{{ tuple "pcrf" "host" . | include "omec-control-plane.diameter_endpoint" }}.key.pem";
+ TLS_CA = "/opt/c3po/pcrf/conf/cacert.pem";
+ No_SCTP;
+ Prefer_TCP;
+ No_IPv6;
+ SCTP_streams = 3;
+ NoRelay;
+ AppServThreads = 4;
+ Port = 3868;
+ SecPort = 5868;
+ LoadExtension = "/usr/local/lib/freeDiameter/acl_wl.fdx" : "/opt/c3po/pcrf/conf/acl.conf";
+ LoadExtension = "/usr/local/lib/freeDiameter/dict_3gpp2_avps.fdx";
+ LoadExtension = "/usr/local/lib/freeDiameter/dict_draftload_avps.fdx";
+ LoadExtension = "/usr/local/lib/freeDiameter/dict_etsi283034_avps.fdx";
+ LoadExtension = "/usr/local/lib/freeDiameter/dict_rfc4004_avps.fdx";
+ LoadExtension = "/usr/local/lib/freeDiameter/dict_rfc4006bis_avps.fdx";
+ LoadExtension = "/usr/local/lib/freeDiameter/dict_rfc4072_avps.fdx";
+ LoadExtension = "/usr/local/lib/freeDiameter/dict_rfc4590_avps.fdx";
+ LoadExtension = "/usr/local/lib/freeDiameter/dict_rfc5447_avps.fdx";
+ LoadExtension = "/usr/local/lib/freeDiameter/dict_rfc5580_avps.fdx";
+ LoadExtension = "/usr/local/lib/freeDiameter/dict_rfc5777_avps.fdx";
+ LoadExtension = "/usr/local/lib/freeDiameter/dict_rfc5778_avps.fdx";
+ LoadExtension = "/usr/local/lib/freeDiameter/dict_rfc6734_avps.fdx";
+ LoadExtension = "/usr/local/lib/freeDiameter/dict_rfc6942_avps.fdx";
+ LoadExtension = "/usr/local/lib/freeDiameter/dict_rfc7155_avps.fdx";
+ LoadExtension = "/usr/local/lib/freeDiameter/dict_rfc7683_avps.fdx";
+ LoadExtension = "/usr/local/lib/freeDiameter/dict_rfc7944_avps.fdx";
+ LoadExtension = "/usr/local/lib/freeDiameter/dict_ts29061_avps.fdx";
+ LoadExtension = "/usr/local/lib/freeDiameter/dict_ts29128_avps.fdx";
+ LoadExtension = "/usr/local/lib/freeDiameter/dict_ts29154_avps.fdx";
+ LoadExtension = "/usr/local/lib/freeDiameter/dict_ts29173_avps.fdx";
+ LoadExtension = "/usr/local/lib/freeDiameter/dict_ts29212_avps.fdx";
+ LoadExtension = "/usr/local/lib/freeDiameter/dict_ts29214_avps.fdx";
+ LoadExtension = "/usr/local/lib/freeDiameter/dict_ts29215_avps.fdx";
+ LoadExtension = "/usr/local/lib/freeDiameter/dict_ts29217_avps.fdx";
+ LoadExtension = "/usr/local/lib/freeDiameter/dict_ts29229_avps.fdx";
+ LoadExtension = "/usr/local/lib/freeDiameter/dict_ts29272_avps.fdx";
+ LoadExtension = "/usr/local/lib/freeDiameter/dict_ts29273_avps.fdx";
+ LoadExtension = "/usr/local/lib/freeDiameter/dict_ts29329_avps.fdx";
+ LoadExtension = "/usr/local/lib/freeDiameter/dict_ts29336_avps.fdx";
+ LoadExtension = "/usr/local/lib/freeDiameter/dict_ts29337_avps.fdx";
+ LoadExtension = "/usr/local/lib/freeDiameter/dict_ts29338_avps.fdx";
+ LoadExtension = "/usr/local/lib/freeDiameter/dict_ts29343_avps.fdx";
+ LoadExtension = "/usr/local/lib/freeDiameter/dict_ts29344_avps.fdx";
+ LoadExtension = "/usr/local/lib/freeDiameter/dict_ts29345_avps.fdx";
+ LoadExtension = "/usr/local/lib/freeDiameter/dict_ts29368_avps.fdx";
+ LoadExtension = "/usr/local/lib/freeDiameter/dict_ts29468_avps.fdx";
+ LoadExtension = "/usr/local/lib/freeDiameter/dict_ts32299_avps.fdx";
+ LoadExtension = "/usr/local/lib/freeDiameter/dict_CreditControl.fdx";
+ LoadExtension = "/usr/local/lib/freeDiameter/dict_Gx.fdx";
+ LoadExtension = "/usr/local/lib/freeDiameter/dict_NAS.fdx";
+ LoadExtension = "/usr/local/lib/freeDiameter/dict_Rx.fdx";
+ LoadExtension = "/usr/local/lib/freeDiameter/dict_Sd.fdx";
+ LoadExtension = "/usr/local/lib/freeDiameter/dict_St.fdx";
+{{- range $key, $value := .Values.config.pcrf.cfgFiles }}
+ {{ $key }}: |-
+{{ toPrettyJson $value | indent 4 }}
+{{- end }}
+{{- end }}
+---
+apiVersion: v1
+kind: ConfigMap
+metadata:
+ name: pcrf-scripts
+ labels:
+{{ tuple "pcrf" . | include "omec-control-plane.metadata_labels" | indent 4 }}
+data:
+ pcrf-run.sh: |
+{{ tuple "bin/_pcrf-run.sh.tpl" . | include "omec-control-plane.template" | indent 4 }}
+ pcrf-bootstrap.sh: |
+{{ tuple "bin/_pcrf-bootstrap.sh.tpl" . | include "omec-control-plane.template" | indent 4 }}
+{{- end }}
diff --git a/omec-control-plane/templates/configmap-spgwc.yaml b/omec-control-plane/templates/configmap-spgwc.yaml
new file mode 100644
index 0000000..6616998
--- /dev/null
+++ b/omec-control-plane/templates/configmap-spgwc.yaml
@@ -0,0 +1,112 @@
+{{/*
+# Copyright 2019-present Open Networking Foundation
+
+# SPDX-License-Identifier: LicenseRef-ONF-Member-Only-1.0
+*/}}
+
+{{- if .Values.config.spgwc.deploy }}
+{{- if not .Values.config.useExistingConfigMap }}
+{{- $cpJson := index .Values.config.spgwc.cfgFiles "cp.json" }}
+{{- $global := index $cpJson "global" }}
+{{- $configJson := index .Values.config.spgwc.cfgFiles "config.json" }}
+{{- $configJsonSpgwc := index $configJson "spgwc" }}
+{{- $configJsonGx := index $configJson "gx" }}
+
+{{- if not (hasKey $configJsonGx "host") -}}
+{{- $_ := tuple "pcrf" "identity" . | include "omec-control-plane.diameter_endpoint" | set $configJsonGx "host" -}}
+{{- end }}
+{{- if not (hasKey $configJsonGx "realm") -}}
+{{- $_ := tuple "pcrf" "realm" . | include "omec-control-plane.diameter_endpoint" | set $configJsonGx "realm" -}}
+{{- end }}
+{{- if not (hasKey $global "httpPort") -}}
+{{- $_ := .Values.config.spgwc.rest.port | set $global "httpPort" -}}
+{{- end }}
+{{- if not (hasKey $global "pfcpPort") -}}
+{{- $_ := .Values.config.spgwc.n4.port | set $global "pfcpPort" -}}
+{{- end }}
+{{- if not (hasKey $global "s11Port") -}}
+{{- $_ := .Values.config.spgwc.s11.port | set $global "s11Port" -}}
+{{- end }}
+{{- if not (hasKey $global "prometheusPort") -}}
+{{- $_ := .Values.config.spgwc.prometheus.port | set $global "prometheusPort" -}}
+{{- end }}
+---
+apiVersion: v1
+kind: ConfigMap
+metadata:
+ name: spgwc-configs
+ labels:
+{{ tuple "spgwc" . | include "omec-control-plane.metadata_labels" | indent 4 }}
+data:
+ gx.conf: |
+ Identity = {{ tuple "spgwc" "identity" . | include "omec-control-plane.diameter_endpoint" | quote }};
+ Realm = {{ tuple "spgwc" "realm" . | include "omec-control-plane.diameter_endpoint" | quote }};
+ TLS_Cred = "config/{{ tuple "spgwc" "host" . | include "omec-control-plane.diameter_endpoint" }}.cert.pem",
+ "config/{{ tuple "spgwc" "host" . | include "omec-control-plane.diameter_endpoint" }}.key.pem";
+ TLS_CA = "config/cacert.pem";
+ AppServThreads = 40;
+ SCTP_streams = 3;
+ NoRelay;
+ No_IPv6;
+ #Port = 3868;
+ #SecPort = 3869;
+
+ ConnectPeer = {{ tuple "pcrf" "identity" . | include "omec-control-plane.diameter_endpoint" | quote }} { No_TLS; port = 3868; };
+
+ LoadExtension = "/usr/local/lib/freeDiameter/dict_3gpp2_avps.fdx";
+ LoadExtension = "/usr/local/lib/freeDiameter/dict_draftload_avps.fdx";
+ LoadExtension = "/usr/local/lib/freeDiameter/dict_etsi283034_avps.fdx";
+ LoadExtension = "/usr/local/lib/freeDiameter/dict_rfc4004_avps.fdx";
+ LoadExtension = "/usr/local/lib/freeDiameter/dict_rfc4006bis_avps.fdx";
+ LoadExtension = "/usr/local/lib/freeDiameter/dict_rfc4072_avps.fdx";
+ LoadExtension = "/usr/local/lib/freeDiameter/dict_rfc4590_avps.fdx";
+ LoadExtension = "/usr/local/lib/freeDiameter/dict_rfc5447_avps.fdx";
+ LoadExtension = "/usr/local/lib/freeDiameter/dict_rfc5580_avps.fdx";
+ LoadExtension = "/usr/local/lib/freeDiameter/dict_rfc5777_avps.fdx";
+ LoadExtension = "/usr/local/lib/freeDiameter/dict_rfc5778_avps.fdx";
+ LoadExtension = "/usr/local/lib/freeDiameter/dict_rfc6734_avps.fdx";
+ LoadExtension = "/usr/local/lib/freeDiameter/dict_rfc6942_avps.fdx";
+ LoadExtension = "/usr/local/lib/freeDiameter/dict_rfc7155_avps.fdx";
+ LoadExtension = "/usr/local/lib/freeDiameter/dict_rfc7683_avps.fdx";
+ LoadExtension = "/usr/local/lib/freeDiameter/dict_rfc7944_avps.fdx";
+ LoadExtension = "/usr/local/lib/freeDiameter/dict_ts29061_avps.fdx";
+ LoadExtension = "/usr/local/lib/freeDiameter/dict_ts29128_avps.fdx";
+ LoadExtension = "/usr/local/lib/freeDiameter/dict_ts29154_avps.fdx";
+ LoadExtension = "/usr/local/lib/freeDiameter/dict_ts29173_avps.fdx";
+ LoadExtension = "/usr/local/lib/freeDiameter/dict_ts29212_avps.fdx";
+ LoadExtension = "/usr/local/lib/freeDiameter/dict_ts29214_avps.fdx";
+ LoadExtension = "/usr/local/lib/freeDiameter/dict_ts29215_avps.fdx";
+ LoadExtension = "/usr/local/lib/freeDiameter/dict_ts29217_avps.fdx";
+ LoadExtension = "/usr/local/lib/freeDiameter/dict_ts29229_avps.fdx";
+ LoadExtension = "/usr/local/lib/freeDiameter/dict_ts29272_avps.fdx";
+ LoadExtension = "/usr/local/lib/freeDiameter/dict_ts29273_avps.fdx";
+ LoadExtension = "/usr/local/lib/freeDiameter/dict_ts29329_avps.fdx";
+ LoadExtension = "/usr/local/lib/freeDiameter/dict_ts29336_avps.fdx";
+ LoadExtension = "/usr/local/lib/freeDiameter/dict_ts29337_avps.fdx";
+ LoadExtension = "/usr/local/lib/freeDiameter/dict_ts29338_avps.fdx";
+ LoadExtension = "/usr/local/lib/freeDiameter/dict_ts29343_avps.fdx";
+ LoadExtension = "/usr/local/lib/freeDiameter/dict_ts29344_avps.fdx";
+ LoadExtension = "/usr/local/lib/freeDiameter/dict_ts29345_avps.fdx";
+ LoadExtension = "/usr/local/lib/freeDiameter/dict_ts29368_avps.fdx";
+ LoadExtension = "/usr/local/lib/freeDiameter/dict_ts29468_avps.fdx";
+ LoadExtension = "/usr/local/lib/freeDiameter/dict_ts32299_avps.fdx";
+ LoadExtension = "/usr/local/lib/freeDiameter/dict_CreditControl.fdx";
+ LoadExtension = "/usr/local/lib/freeDiameter/dict_Gx.fdx";
+{{- range $key, $value := .Values.config.spgwc.cfgFiles }}
+ {{ $key }}: |-
+{{ toPrettyJson $value | indent 4 }}
+{{- end }}
+{{- end }}
+---
+apiVersion: v1
+kind: ConfigMap
+metadata:
+ name: spgwc-scripts
+ labels:
+{{ tuple "spgwc" . | include "omec-control-plane.metadata_labels" | indent 4 }}
+data:
+ spgwc-run.sh: |
+{{ tuple "bin/_spgwc-run.sh.tpl" . | include "omec-control-plane.template" | indent 4 }}
+ spgwc-init.sh: |
+{{ tuple "bin/_spgwc-init.sh.tpl" . | include "omec-control-plane.template" | indent 4 }}
+{{- end }}
diff --git a/omec-control-plane/templates/service-config4g.yaml b/omec-control-plane/templates/service-config4g.yaml
new file mode 100644
index 0000000..ab01c6c
--- /dev/null
+++ b/omec-control-plane/templates/service-config4g.yaml
@@ -0,0 +1,52 @@
+{{/*
+# Copyright 2020-present Open Networking Foundation
+
+# SPDX-License-Identifier: LicenseRef-ONF-Member-Only-1.0
+*/}}
+
+{{- if .Values.config.config4g.deploy }}
+---
+apiVersion: v1
+kind: Service
+metadata:
+ name: config4g
+ labels:
+{{ tuple "config4g" . | include "omec-control-plane.metadata_labels" | indent 4 }}
+spec:
+ type: ClusterIP
+ selector:
+{{ tuple "config4g" . | include "omec-control-plane.metadata_labels" | indent 4 }}
+ ports:
+ - name: prometheus-exporter
+ port: {{ .Values.config.config4g.prometheus.port }}
+ protocol: TCP
+ - name: urlport-http
+ port: {{ .Values.config.config4g.urlport.port }}
+ protocol: TCP
+{{- if or .Values.config.config4g.urlport.nodePort.enabled .Values.config.config4g.prometheus.nodePort.enabled }}
+---
+apiVersion: v1
+kind: Service
+metadata:
+ name: config4g-external
+ labels:
+{{ tuple "config4g" . | include "omec-control-plane.metadata_labels" | indent 4 }}
+spec:
+ type: NodePort
+ selector:
+{{ tuple "config4g" . | include "omec-control-plane.metadata_labels" | indent 4 }}
+ ports:
+{{- if .Values.config.config4g.prometheus.nodePort.enabled }}
+ - name: prometheus-exporter
+ port: {{ .Values.config.config4g.prometheus.port }}
+ protocol: TCP
+ nodePort: {{ .Values.config.config4g.prometheus.nodePort.port }}
+{{- end }}
+{{- if .Values.config.config4g.urlport.nodePort.enabled }}
+ - name: urlport-http
+ port: {{ .Values.config.config4g.urlport.port }}
+ protocol: TCP
+ nodePort: {{ .Values.config.config4g.urlport.nodePort.port }}
+{{- end }}
+{{- end }}
+{{- end }}
diff --git a/omec-control-plane/templates/service-hss.yaml b/omec-control-plane/templates/service-hss.yaml
new file mode 100644
index 0000000..371b363
--- /dev/null
+++ b/omec-control-plane/templates/service-hss.yaml
@@ -0,0 +1,76 @@
+{{/*
+# Copyright 2019-present Open Networking Foundation
+
+# SPDX-License-Identifier: LicenseRef-ONF-Member-Only-1.0
+*/}}
+
+{{- if .Values.config.hss.deploy }}
+---
+apiVersion: v1
+kind: Service
+metadata:
+ name: hss
+ labels:
+{{ tuple "hss" . | include "omec-control-plane.metadata_labels" | indent 4 }}
+spec:
+ selector:
+{{ tuple "hss" . | include "omec-control-plane.metadata_labels" | indent 4 }}
+ ports:
+ - name: s6a
+ port: 3868
+ protocol: TCP
+ - name: config-port
+ port: {{ .Values.config.hss.configPort.port }}
+ protocol: TCP
+ - name: prometheus-exporter
+ port: {{ .Values.config.hss.prometheus.port }}
+ protocol: TCP
+---
+apiVersion: v1
+kind: Service
+metadata:
+ name: hss-headless
+ labels:
+{{ tuple "hss" . | include "omec-control-plane.metadata_labels" | indent 4 }}
+spec:
+ selector:
+{{ tuple "hss" . | include "omec-control-plane.metadata_labels" | indent 4 }}
+ clusterIP: None
+ ports:
+ - name: s6a
+ port: 3868
+ protocol: TCP
+ - name: config-port
+ port: {{ .Values.config.hss.configPort.port }}
+ protocol: TCP
+{{- if or .Values.config.hss.s6a.nodePort.enabled .Values.config.hss.configPort.nodePort.enabled}}
+---
+apiVersion: v1
+kind: Service
+metadata:
+ name: hss-external
+ labels:
+{{ tuple "hss" . | include "omec-control-plane.metadata_labels" | indent 4 }}
+spec:
+ selector:
+{{ tuple "hss" . | include "omec-control-plane.metadata_labels" | indent 4 }}
+ type: NodePort
+ ports:
+ {{- if .Values.config.hss.prometheus.nodePort.enabled }}
+ - name: prometheus-exporter
+ port: {{ .Values.config.hss.prometheus.port }}
+ protocol: TCP
+ nodePort: {{ .Values.config.hss.prometheus.nodePort.port }}
+ {{- end }}
+ - name: s6a
+ port: 3868
+ protocol: TCP
+ nodePort: {{ .Values.config.hss.s6a.nodePort.port }}
+ {{- if .Values.config.hss.configPort.nodePort.enabled }}
+ - name: config-port
+ port: {{ .Values.config.hss.configPort.port }}
+ protocol: TCP
+ nodePort: {{ .Values.config.hss.configPort.nodePort.port }}
+ {{- end }}
+{{- end }}
+{{- end }}
diff --git a/omec-control-plane/templates/service-mme.yaml b/omec-control-plane/templates/service-mme.yaml
new file mode 100644
index 0000000..8ae95b9
--- /dev/null
+++ b/omec-control-plane/templates/service-mme.yaml
@@ -0,0 +1,96 @@
+{{/*
+# Copyright 2019-present Open Networking Foundation
+
+# SPDX-License-Identifier: LicenseRef-ONF-Member-Only-1.0
+*/}}
+
+{{- if .Values.config.mme.deploy }}
+{{- $configJson := index .Values.config.mme.cfgFiles "config.json" }}
+{{- $configJsonS11 := index $configJson "s11" }}
+{{- $configJsonS1ap := index $configJson "s1ap" }}
+---
+apiVersion: v1
+kind: Service
+metadata:
+ name: mme
+ labels:
+{{ tuple "mme" . | include "omec-control-plane.metadata_labels" | indent 4 }}
+spec:
+ selector:
+{{ tuple "mme" . | include "omec-control-plane.metadata_labels" | indent 4 }}
+ type: ClusterIP
+ ports:
+ - name: s11
+ port: {{ index $configJsonS11 "egtp_default_port" }}
+ protocol: UDP
+ - name: s6a
+ port: 3868
+ protocol: TCP
+ - name: s1ap
+ port: {{ index $configJsonS1ap "sctp_port" }}
+ protocol: SCTP
+ - name: prometheus-exporter
+ port: {{ .Values.config.mme.prometheus.port }}
+ protocol: TCP
+ - name: mme-app-config
+ port: 8080
+ protocol: TCP
+ - name: mme-s1ap-config
+ port: 8081
+ protocol: TCP
+---
+apiVersion: v1
+kind: Service
+metadata:
+ name: mme-headless
+ labels:
+{{ tuple "mme" . | include "omec-control-plane.metadata_labels" | indent 4 }}
+spec:
+ selector:
+{{ tuple "mme" . | include "omec-control-plane.metadata_labels" | indent 4 }}
+ clusterIP: None
+ ports:
+ - name: s11
+ port: {{ index $configJsonS11 "egtp_default_port" }}
+ protocol: UDP
+ - name: s6a
+ port: 3868
+ protocol: TCP
+ - name: s1ap
+ port: {{ index $configJsonS1ap "sctp_port" }}
+ protocol: SCTP
+---
+apiVersion: v1
+kind: Service
+metadata:
+ name: mme-external
+ labels:
+{{ tuple "mme" . | include "omec-control-plane.metadata_labels" | indent 4 }}
+spec:
+ selector:
+{{ tuple "mme" . | include "omec-control-plane.metadata_labels" | indent 4 }}
+ type: NodePort
+ ports:
+ {{- if .Values.config.mme.prometheus.nodePort.enabled }}
+ - name: prometheus-exporter
+ port: {{ .Values.config.mme.prometheus.port }}
+ protocol: TCP
+ nodePort: {{ .Values.config.mme.prometheus.nodePort.port }}
+ {{- end }}
+ {{- if .Values.config.mme.s11.nodePort.enabled }}
+ - name: s11
+ port: {{ index $configJsonS11 "egtp_default_port" }}
+ protocol: UDP
+ nodePort: {{ .Values.config.mme.s11.nodePort.port }}
+ {{- end }}
+ {{- if .Values.config.mme.s6a.nodePort.enabled }}
+ - name: s6a
+ port: 3868
+ protocol: TCP
+ nodePort: {{ .Values.config.mme.s6a.nodePort.port }}
+ {{- end }}
+ - name: s1ap
+ port: {{ index $configJsonS1ap "sctp_port" }}
+ nodePort: {{ index $configJsonS1ap "sctp_port_external" }}
+ protocol: SCTP
+{{- end }}
diff --git a/omec-control-plane/templates/service-pcrf.yaml b/omec-control-plane/templates/service-pcrf.yaml
new file mode 100644
index 0000000..116f930
--- /dev/null
+++ b/omec-control-plane/templates/service-pcrf.yaml
@@ -0,0 +1,81 @@
+{{/*
+# Copyright 2020-present Open Networking Foundation
+
+# SPDX-License-Identifier: LicenseRef-ONF-Member-Only-1.0
+*/}}
+
+{{- if .Values.config.pcrf.deploy }}
+---
+apiVersion: v1
+kind: Service
+metadata:
+ name: pcrf
+ labels:
+{{ tuple "pcrf" . | include "omec-control-plane.metadata_labels" | indent 4 }}
+spec:
+ selector:
+{{ tuple "pcrf" . | include "omec-control-plane.metadata_labels" | indent 4 }}
+ ports:
+ - name: gx
+ port: 3868
+ protocol: TCP
+ - name: prometheus-exporter
+ port: {{ .Values.config.pcrf.prometheus.port }}
+ protocol: TCP
+ - name: config-port
+ port: {{ .Values.config.pcrf.configPort.port }}
+ protocol: TCP
+---
+apiVersion: v1
+kind: Service
+metadata:
+ name: pcrf-headless
+ labels:
+{{ tuple "pcrf" . | include "omec-control-plane.metadata_labels" | indent 4 }}
+spec:
+ selector:
+{{ tuple "pcrf" . | include "omec-control-plane.metadata_labels" | indent 4 }}
+ clusterIP: None
+ ports:
+ - name: gx
+ port: 3868
+ protocol: TCP
+ - name: prometheus-exporter
+ port: {{ .Values.config.pcrf.prometheus.port }}
+ protocol: TCP
+ - name: config-port
+ port: {{ .Values.config.pcrf.configPort.port }}
+ protocol: TCP
+{{- if or (.Values.config.pcrf.prometheus.nodePort.enabled) (.Values.config.pcrf.gx.nodePort.enabled) }}
+---
+apiVersion: v1
+kind: Service
+metadata:
+ name: pcrf-external
+ labels:
+{{ tuple "pcrf" . | include "omec-control-plane.metadata_labels" | indent 4 }}
+spec:
+ selector:
+{{ tuple "pcrf" . | include "omec-control-plane.metadata_labels" | indent 4 }}
+ type: NodePort
+ ports:
+ {{- if .Values.config.pcrf.prometheus.nodePort.enabled }}
+ - name: prometheus-exporter
+ port: {{ .Values.config.pcrf.prometheus.port }}
+ protocol: TCP
+ nodePort: {{ .Values.config.pcrf.prometheus.nodePort.port }}
+ {{- end }}
+ {{- if .Values.config.pcrf.gx.nodePort.enabled }}
+ - name: gx
+ port: 3868
+ protocol: TCP
+ nodePort: {{ .Values.config.pcrf.gx.nodePort.port }}
+ {{- end }}
+ {{- if .Values.config.pcrf.configPort.nodePort.enabled }}
+ - name: config-port
+ port: {{ .Values.config.pcrf.configPort.port }}
+ protocol: TCP
+ nodePort: {{ .Values.config.pcrf.configPort.nodePort.port }}
+ {{- end }}
+{{- end }}
+{{- end }}
diff --git a/omec-control-plane/templates/service-spgwc.yaml b/omec-control-plane/templates/service-spgwc.yaml
new file mode 100644
index 0000000..c97689a
--- /dev/null
+++ b/omec-control-plane/templates/service-spgwc.yaml
@@ -0,0 +1,81 @@
+{{/*
+# Copyright 2019-present Open Networking Foundation
+
+# SPDX-License-Identifier: LicenseRef-ONF-Member-Only-1.0
+*/}}
+
+{{- if .Values.config.spgwc.deploy }}
+---
+apiVersion: v1
+kind: Service
+metadata:
+ name: spgwc
+ labels:
+{{ tuple "spgwc" . | include "omec-control-plane.metadata_labels" | indent 4 }}
+spec:
+ type: ClusterIP
+ selector:
+{{ tuple "spgwc" . | include "omec-control-plane.metadata_labels" | indent 4 }}
+ ports:
+ - name: s11
+ port: {{ .Values.config.spgwc.s11.port }}
+ protocol: UDP
+ - name: pfcp
+ port: {{ .Values.config.spgwc.n4.port }}
+ protocol: UDP
+ - name: prometheus-exporter
+ port: {{ .Values.config.spgwc.prometheus.port }}
+ protocol: TCP
+ - name: rest
+ port: {{ .Values.config.spgwc.rest.port }}
+ protocol: TCP
+---
+apiVersion: v1
+kind: Service
+metadata:
+ name: spgwc-headless
+ labels:
+{{ tuple "spgwc" . | include "omec-control-plane.metadata_labels" | indent 4 }}
+spec:
+ clusterIP: None
+ selector:
+{{ tuple "spgwc" . | include "omec-control-plane.metadata_labels" | indent 4 }}
+{{- if or .Values.config.spgwc.s11.nodePort.enabled .Values.config.spgwc.n4.nodePort.enabled .Values.config.spgwc.prometheus.nodePort.enabled .Values.config.spgwc.rest.nodePort.enabled }}
+---
+apiVersion: v1
+kind: Service
+metadata:
+ name: spgwc-external
+ labels:
+{{ tuple "spgwc" . | include "omec-control-plane.metadata_labels" | indent 4 }}
+spec:
+ type: NodePort
+ selector:
+{{ tuple "spgwc" . | include "omec-control-plane.metadata_labels" | indent 4 }}
+ ports:
+{{- if .Values.config.spgwc.s11.nodePort.enabled }}
+ - name: s11
+ port: {{ .Values.config.spgwc.s11.port }}
+ protocol: UDP
+ nodePort: {{ .Values.config.spgwc.s11.nodePort.port }}
+{{- end }}
+{{- if .Values.config.spgwc.n4.nodePort.enabled }}
+ - name: pfcp
+ port: {{ .Values.config.spgwc.n4.port }}
+ protocol: UDP
+ nodePort: {{ .Values.config.spgwc.n4.nodePort.port }}
+{{- end }}
+{{- if .Values.config.spgwc.prometheus.nodePort.enabled }}
+ - name: prometheus-exporter
+ port: {{ .Values.config.spgwc.prometheus.port }}
+ protocol: TCP
+ nodePort: {{ .Values.config.spgwc.prometheus.nodePort.port }}
+{{- end }}
+{{- if .Values.config.spgwc.rest.nodePort.enabled }}
+ - name: rest
+ port: {{ .Values.config.spgwc.rest.port }}
+ protocol: TCP
+ nodePort: {{ .Values.config.spgwc.rest.nodePort.port }}
+{{- end }}
+{{- end }}
+{{- end }}
diff --git a/omec-control-plane/templates/statefulset-config4g.yaml b/omec-control-plane/templates/statefulset-config4g.yaml
new file mode 100644
index 0000000..2a20980
--- /dev/null
+++ b/omec-control-plane/templates/statefulset-config4g.yaml
@@ -0,0 +1,85 @@
+{{/*
+# Copyright 2020-present Open Networking Foundation
+
+# SPDX-License-Identifier: LicenseRef-ONF-Member-Only-1.0
+*/}}
+
+{{- if .Values.config.config4g.deploy }}
+{{ tuple "config4g" . | include "omec-control-plane.service_account" }}
+---
+apiVersion: apps/v1
+kind: StatefulSet
+metadata:
+ name: config4g
+ labels:
+{{ tuple "config4g" . | include "omec-control-plane.metadata_labels" | indent 4 }}
+spec:
+ replicas: 1
+ serviceName: config4g-headless
+ selector:
+ matchLabels:
+{{ tuple "config4g" . | include "omec-control-plane.metadata_labels" | indent 6 }}
+ template:
+ metadata:
+ labels:
+{{ tuple "config4g" . | include "omec-control-plane.metadata_labels" | indent 8 }}
+ {{- with .Values.config.config4g.podAnnotations }}
+ annotations:
+ {{- toYaml . | nindent 8 }}
+ {{- end }}
+ spec:
+ serviceAccountName: config4g
+ {{- if hasKey .Values.images "pullSecrets" }}
+ imagePullSecrets:
+{{ toYaml .Values.images.pullSecrets | indent 8 }}
+ {{- end }}
+ containers:
+ - name: config-4g
+ image: {{ .Values.images.tags.config4g }}
+ imagePullPolicy: {{ .Values.images.pullPolicy }}
+ {{- if .Values.config.coreDump.enabled }}
+ securityContext:
+ runAsUser: 0
+ {{- end }}
+ stdin: true
+ tty: true
+ command: ["/free5gc/script/config4g-run.sh"]
+ env:
+ - name: CONFIGPOD_DEPLOYMENT
+ value: "4G"
+ {{- if .Values.config.managedByConfigPod.enabled }}
+ - name: MANAGED_BY_CONFIG_POD
+ value: "true"
+ {{- end }}
+ {{- if .Values.resources.enabled }}
+ resources:
+{{ toYaml .Values.resources.config4g | indent 10 }}
+ {{- end }}
+ volumeMounts:
+ - name: run-script
+ mountPath: /free5gc/script/config4g-run.sh
+ subPath: config4g-run.sh
+ - name: nf-config
+ mountPath: /free5gc/config
+ {{- if .Values.config.coreDump.enabled }}
+ - name: coredump
+ mountPath: /tmp/coredump
+ {{- end }}
+ volumes:
+ - name: run-script
+ configMap:
+ name: config4g
+ defaultMode: 493
+ - name: nf-config
+ configMap:
+ name: config4g
+ defaultMode: 493
+ {{- if .Values.config.coreDump.enabled }}
+ - name: host-rootfs
+ hostPath:
+ path: /
+ - name: coredump
+ hostPath:
+ path: {{ .Values.config.coreDump.path }}
+ {{- end }}
+{{- end }}
diff --git a/omec-control-plane/templates/statefulset-hss.yaml b/omec-control-plane/templates/statefulset-hss.yaml
new file mode 100644
index 0000000..a69b4ac
--- /dev/null
+++ b/omec-control-plane/templates/statefulset-hss.yaml
@@ -0,0 +1,97 @@
+{{/*
+# Copyright 2019-present Open Networking Foundation
+
+# SPDX-License-Identifier: LicenseRef-ONF-Member-Only-1.0
+
+Default values for mcord-vepc-helm.
+This is a YAML-formatted file.
+Declare variables to be passed into your templates.
+*/}}
+
+{{- if .Values.config.hss.deploy }}
+{{ tuple "hss" . | include "omec-control-plane.service_account" }}
+---
+apiVersion: apps/v1
+kind: StatefulSet
+metadata:
+ name: hss
+ labels:
+{{ tuple "hss" . | include "omec-control-plane.metadata_labels" | indent 4 }}
+spec:
+ replicas: 1
+ serviceName: hss-headless
+ selector:
+ matchLabels:
+{{ tuple "hss" . | include "omec-control-plane.metadata_labels" | indent 6 }}
+ template:
+ metadata:
+ labels:
+{{ tuple "hss" . | include "omec-control-plane.metadata_labels" | indent 8 }}
+ {{- with .Values.config.hss.podAnnotations }}
+ annotations:
+ {{- toYaml . | nindent 8 }}
+ {{- end }}
+ spec:
+ {{- if .Values.nodeSelectors.enabled }}
+ nodeSelector:
+ {{ .Values.nodeSelectors.hss.label }}: {{ .Values.nodeSelectors.hss.value }}
+ {{- end }}
+ serviceAccountName: hss
+ {{- if hasKey .Values.images "pullSecrets" }}
+ imagePullSecrets:
+{{ toYaml .Values.images.pullSecrets | indent 8 }}
+ {{- end }}
+ initContainers:
+ - name: hss-bootstrap
+ image: {{ .Values.images.tags.hssdb }}
+ imagePullPolicy: {{ .Values.images.pullPolicy }}
+ command: ["/opt/c3po/hss/scripts/hss-bootstrap.sh"]
+ volumeMounts:
+ - name: scripts
+ mountPath: /opt/c3po/hss/scripts
+ {{- if .Values.config.coreDump.enabled }}
+{{ tuple "hss" . | include "omec-control-plane.coredump_init" | indent 6 }}
+ {{- end }}
+ containers:
+ - name: hss
+ image: {{ .Values.images.tags.hss }}
+ imagePullPolicy: {{ .Values.images.pullPolicy }}
+ {{- if .Values.config.coreDump.enabled }}
+ securityContext:
+ privileged: true
+ runAsUser: 0
+ {{- end }}
+ stdin: true
+ tty: true
+ command: ["bash", "-c", "/opt/c3po/hss/scripts/hss-run.sh; sleep 3600"]
+ {{- if .Values.resources.enabled }}
+ resources:
+{{ toYaml .Values.resources.hss | indent 10 }}
+ {{- end }}
+ volumeMounts:
+ - name: scripts
+ mountPath: /opt/c3po/hss/scripts
+ - name: configs
+ mountPath: /etc/hss/conf
+ {{- if .Values.config.coreDump.enabled }}
+ - name: coredump
+ mountPath: /tmp/coredump
+ {{- end }}
+ volumes:
+ - name: scripts
+ configMap:
+ name: hss-scripts
+ defaultMode: 493
+ - name: configs
+ configMap:
+ name: hss-configs
+ defaultMode: 420
+ {{- if .Values.config.coreDump.enabled }}
+ - name: host-rootfs
+ hostPath:
+ path: /
+ - name: coredump
+ hostPath:
+ path: {{ .Values.config.coreDump.path }}
+ {{- end }}
+{{- end }}
diff --git a/omec-control-plane/templates/statefulset-mme.yaml b/omec-control-plane/templates/statefulset-mme.yaml
new file mode 100644
index 0000000..d690bb5
--- /dev/null
+++ b/omec-control-plane/templates/statefulset-mme.yaml
@@ -0,0 +1,269 @@
+{{/*
+# Copyright 2019-present Open Networking Foundation
+
+# SPDX-License-Identifier: LicenseRef-ONF-Member-Only-1.0
+*/}}
+
+{{- if .Values.config.mme.deploy }}
+{{ tuple "mme" . | include "omec-control-plane.service_account" }}
+---
+apiVersion: apps/v1
+kind: StatefulSet
+metadata:
+ name: mme
+ labels:
+{{ tuple "mme" . | include "omec-control-plane.metadata_labels" | indent 4 }}
+spec:
+ replicas: 1
+ serviceName: mme-headless
+ selector:
+ matchLabels:
+{{ tuple "mme" . | include "omec-control-plane.metadata_labels" | indent 6 }}
+ template:
+ metadata:
+ labels:
+{{ tuple "mme" . | include "omec-control-plane.metadata_labels" | indent 8 }}
+ {{- with .Values.config.mme.podAnnotations }}
+ annotations:
+ {{- toYaml . | nindent 8 }}
+ {{- end }}
+ spec:
+ {{- if .Values.nodeSelectors.enabled }}
+ nodeSelector:
+ {{ .Values.nodeSelectors.mme.label }}: {{ .Values.nodeSelectors.mme.value }}
+ {{- end }}
+ serviceAccountName: mme
+ {{- if hasKey .Values.images "pullSecrets" }}
+ imagePullSecrets:
+{{ toYaml .Values.images.pullSecrets | indent 8 }}
+ {{- end }}
+ initContainers:
+ - name: mme-load-sctp-module
+ image: {{ .Values.images.tags.init | quote }}
+ imagePullPolicy: {{ .Values.images.pullPolicy }}
+ securityContext:
+ privileged: true
+ runAsUser: 0
+ command: ["sh", "-xc"]
+ args:
+ - |
+ if chroot /mnt/host-rootfs modinfo nf_conntrack_proto_sctp > /dev/null 2>&1; then \
+ chroot /mnt/host-rootfs modprobe nf_conntrack_proto_sctp; \
+ fi;
+ chroot /mnt/host-rootfs modprobe tipc
+ volumeMounts:
+ - name: host-rootfs
+ mountPath: /mnt/host-rootfs
+ {{- if .Values.config.hss.deploy }}
+ - name: mme-dep-check
+ image: {{ .Values.images.tags.depCheck | quote }}
+ imagePullPolicy: {{ .Values.images.pullPolicy }}
+ securityContext:
+ allowPrivilegeEscalation: false
+ readOnlyRootFilesystem: false
+ runAsUser: 0
+ env:
+ - name: POD_NAME
+ valueFrom:
+ fieldRef:
+ apiVersion: v1
+ fieldPath: metadata.name
+ - name: NAMESPACE
+ valueFrom:
+ fieldRef:
+ apiVersion: v1
+ fieldPath: metadata.namespace
+ - name: PATH
+ value: /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/
+ - name: COMMAND
+ value: "echo done"
+ - name: DEPENDENCY_POD_JSON
+ value: '[{"labels": {"app": "hss"}, "requireSameNode": false}]'
+ # add dependency job for make_certs.sh
+ command:
+ - kubernetes-entrypoint
+ volumeMounts:
+ []
+ {{- end }}
+ - name: mme-init
+ image: {{ .Values.images.tags.mme | quote }}
+ imagePullPolicy: {{ .Values.images.pullPolicy }}
+ command: ["/opt/mme/scripts/mme-init.sh"]
+ env:
+ - name: POD_IP
+ valueFrom:
+ fieldRef:
+ fieldPath: status.podIP
+ volumeMounts:
+ - name: scripts
+ mountPath: /opt/mme/scripts
+ - name: configs
+ mountPath: /opt/mme/config
+ - name: shared-data
+ mountPath: /opt/mme/config/shared
+ {{- if .Values.config.coreDump.enabled }}
+{{ tuple "mme" . | include "omec-control-plane.coredump_init" | indent 6 }}
+ {{- end }}
+ containers:
+ - name: mme-app
+ image: {{ .Values.images.tags.mme | quote }}
+ imagePullPolicy: {{ .Values.images.pullPolicy }}
+ {{- if .Values.config.coreDump.enabled }}
+ securityContext:
+ privileged: true
+ runAsUser: 0
+ {{- end }}
+ command: ["bash", "-xc"]
+ args:
+ - /opt/mme/scripts/mme-run.sh mme-app
+ {{- if .Values.resources.enabled }}
+ resources:
+{{ toYaml .Values.resources.mme | indent 10 }}
+ {{- end }}
+ env:
+ - name: POD_IP
+ valueFrom:
+ fieldRef:
+ fieldPath: status.podIP
+ - name: MMERUNENV
+ value: "container"
+ {{- if .Values.config.managedByConfigPod.enabled }}
+ - name: MANAGED_BY_CONFIG_POD
+ value: "true"
+ {{- end }}
+ volumeMounts:
+ - name: scripts
+ mountPath: /opt/mme/scripts
+ - name: shared-data
+ mountPath: /opt/mme/config/shared
+ - name: shared-app
+ mountPath: /tmp
+ - name: configs
+ mountPath: /opt/mme/config
+ {{- if .Values.config.coreDump.enabled }}
+ - name: coredump
+ mountPath: /tmp/coredump
+ {{- end }}
+ - name: s1ap-app
+ image: {{ .Values.images.tags.mme | quote }}
+ imagePullPolicy: {{ .Values.images.pullPolicy }}
+ {{- if .Values.config.coreDump.enabled }}
+ securityContext:
+ privileged: true
+ runAsUser: 0
+ {{- end }}
+ command: ["bash", "-xc"]
+ args:
+ - /opt/mme/scripts/mme-run.sh s1ap-app
+ {{- if .Values.resources.enabled }}
+ resources:
+{{ toYaml .Values.resources.mme | indent 10 }}
+ {{- end }}
+ env:
+ - name: MMERUNENV
+ value: "container"
+ {{- if .Values.config.managedByConfigPod.enabled }}
+ - name: MANAGED_BY_CONFIG_POD
+ value: "true"
+ {{- end }}
+ volumeMounts:
+ - name: scripts
+ mountPath: /opt/mme/scripts
+ - name: shared-data
+ mountPath: /opt/mme/config/shared
+ - name: shared-app
+ mountPath: /tmp
+ - name: configs
+ mountPath: /opt/mme/config
+ {{- if .Values.config.coreDump.enabled }}
+ - name: coredump
+ mountPath: /tmp/coredump
+ {{- end }}
+ - name: s6a-app
+ image: {{ .Values.images.tags.mme | quote }}
+ imagePullPolicy: {{ .Values.images.pullPolicy }}
+ {{- if .Values.config.coreDump.enabled }}
+ securityContext:
+ privileged: true
+ runAsUser: 0
+ {{- end }}
+ command: ["bash", "-xc"]
+ args:
+ - /opt/mme/scripts/mme-run.sh s6a-app
+ {{- if .Values.resources.enabled }}
+ resources:
+{{ toYaml .Values.resources.mme | indent 10 }}
+ {{- end }}
+ env:
+ - name: MMERUNENV
+ value: "container"
+ {{- if .Values.config.managedByConfigPod.enabled }}
+ - name: MANAGED_BY_CONFIG_POD
+ value: "true"
+ {{- end }}
+ volumeMounts:
+ - name: scripts
+ mountPath: /opt/mme/scripts
+ - name: shared-data
+ mountPath: /opt/mme/config/shared
+ - name: shared-app
+ mountPath: /tmp
+ {{- if .Values.config.coreDump.enabled }}
+ - name: coredump
+ mountPath: /tmp/coredump
+ {{- end }}
+ - name: s11-app
+ image: {{ .Values.images.tags.mme | quote }}
+ imagePullPolicy: {{ .Values.images.pullPolicy }}
+ {{- if .Values.config.coreDump.enabled }}
+ securityContext:
+ privileged: true
+ runAsUser: 0
+ {{- end }}
+ command: ["bash", "-xc"]
+ args:
+ - /opt/mme/scripts/mme-run.sh s11-app
+ {{- if .Values.resources.enabled }}
+ resources:
+{{ toYaml .Values.resources.mme | indent 10 }}
+ {{- end }}
+ env:
+ - name: MMERUNENV
+ value: "container"
+ {{- if .Values.config.managedByConfigPod.enabled }}
+ - name: MANAGED_BY_CONFIG_POD
+ value: "true"
+ {{- end }}
+ volumeMounts:
+ - name: scripts
+ mountPath: /opt/mme/scripts
+ - name: shared-data
+ mountPath: /opt/mme/config/shared
+ - name: shared-app
+ mountPath: /tmp
+ {{- if .Values.config.coreDump.enabled }}
+ - name: coredump
+ mountPath: /tmp/coredump
+ {{- end }}
+ volumes:
+ - name: scripts
+ configMap:
+ name: mme-scripts
+ defaultMode: 493
+ - name: configs
+ configMap:
+ name: mme-configs
+ defaultMode: 420
+ - name: shared-data
+ emptyDir: {}
+ - name: shared-app
+ emptyDir: {}
+ - name: host-rootfs
+ hostPath:
+ path: /
+ {{- if .Values.config.coreDump.enabled }}
+ - name: coredump
+ hostPath:
+ path: {{ .Values.config.coreDump.path }}
+ {{- end }}
+{{- end }}
diff --git a/omec-control-plane/templates/statefulset-pcrf.yaml b/omec-control-plane/templates/statefulset-pcrf.yaml
new file mode 100644
index 0000000..a7eb327
--- /dev/null
+++ b/omec-control-plane/templates/statefulset-pcrf.yaml
@@ -0,0 +1,93 @@
+{{/*
+# Copyright 2020-present Open Networking Foundation
+
+# SPDX-License-Identifier: LicenseRef-ONF-Member-Only-1.0
+
+Default values for mcord-vepc-helm.
+This is a YAML-formatted file.
+Declare variables to be passed into your templates.
+*/}}
+
+{{- if .Values.config.pcrf.deploy }}
+{{ tuple "pcrf" . | include "omec-control-plane.service_account" }}
+---
+apiVersion: apps/v1
+kind: StatefulSet
+metadata:
+ name: pcrf
+ labels:
+{{ tuple "pcrf" . | include "omec-control-plane.metadata_labels" | indent 4 }}
+spec:
+ replicas: 1
+ serviceName: pcrf-headless
+ selector:
+ matchLabels:
+{{ tuple "pcrf" . | include "omec-control-plane.metadata_labels" | indent 6 }}
+ template:
+ metadata:
+ labels:
+{{ tuple "pcrf" . | include "omec-control-plane.metadata_labels" | indent 8 }}
+ spec:
+ {{- if .Values.nodeSelectors.enabled }}
+ nodeSelector:
+ {{ .Values.nodeSelectors.pcrf.label }}: {{ .Values.nodeSelectors.pcrf.value }}
+ {{- end }}
+ {{- if hasKey .Values.images "pullSecrets" }}
+ imagePullSecrets:
+{{ toYaml .Values.images.pullSecrets | indent 8 }}
+ {{- end }}
+ serviceAccountName: pcrf
+ initContainers:
+ - name: pcrf-bootstrap
+ image: {{ .Values.images.tags.pcrfdb }}
+ imagePullPolicy: {{ .Values.images.pullPolicy }}
+ command: ["/opt/c3po/pcrf/pcrf-bootstrap.sh"]
+ volumeMounts:
+ - name: scripts
+ mountPath: /opt/c3po/pcrf
+ {{- if .Values.config.coreDump.enabled }}
+{{ tuple "pcrf" . | include "omec-control-plane.coredump_init" | indent 6 }}
+ {{- end }}
+ containers:
+ - name: pcrf
+ image: {{ .Values.images.tags.pcrf }}
+ imagePullPolicy: {{ .Values.images.pullPolicy }}
+ {{- if .Values.config.coreDump.enabled }}
+ securityContext:
+ privileged: true
+ runAsUser: 0
+ {{- end }}
+ stdin: true
+ tty: true
+ command: ["bash", "-c", "/opt/c3po/pcrf/scripts/pcrf-run.sh"]
+ {{- if .Values.resources.enabled }}
+ resources:
+{{ toYaml .Values.resources.pcrf | indent 10 }}
+ {{- end }}
+ volumeMounts:
+ - name: scripts
+ mountPath: /opt/c3po/pcrf/scripts
+ - name: configs
+ mountPath: /etc/pcrf/conf
+ {{- if .Values.config.coreDump.enabled }}
+ - name: coredump
+ mountPath: /tmp/coredump
+ {{- end }}
+ volumes:
+ - name: scripts
+ configMap:
+ name: pcrf-scripts
+ defaultMode: 493
+ - name: configs
+ configMap:
+ name: pcrf-configs
+ defaultMode: 420
+ {{- if .Values.config.coreDump.enabled }}
+ - name: host-rootfs
+ hostPath:
+ path: /
+ - name: coredump
+ hostPath:
+ path: {{ .Values.config.coreDump.path }}
+ {{- end }}
+{{- end }}
diff --git a/omec-control-plane/templates/statefulset-spgwc.yaml b/omec-control-plane/templates/statefulset-spgwc.yaml
new file mode 100644
index 0000000..7d9d943
--- /dev/null
+++ b/omec-control-plane/templates/statefulset-spgwc.yaml
@@ -0,0 +1,178 @@
+{{/*
+# Copyright 2019-present Open Networking Foundation
+
+# SPDX-License-Identifier: LicenseRef-ONF-Member-Only-1.0
+*/}}
+
+{{- if .Values.config.spgwc.deploy }}
+{{ tuple "spgwc" . | include "omec-control-plane.service_account" }}
+---
+apiVersion: apps/v1
+kind: StatefulSet
+metadata:
+ name: spgwc
+ labels:
+{{ tuple "spgwc" . | include "omec-control-plane.metadata_labels" | indent 4 }}
+spec:
+ replicas: 1
+ serviceName: spgwc-headless
+ selector:
+ matchLabels:
+{{ tuple "spgwc" . | include "omec-control-plane.metadata_labels" | indent 6 }}
+ template:
+ metadata:
+ labels:
+{{ tuple "spgwc" . | include "omec-control-plane.metadata_labels" | indent 8 }}
+ {{- with .Values.config.spgwc.podAnnotations }}
+ annotations:
+ {{- toYaml . | nindent 8 }}
+ {{- end }}
+ spec:
+ {{- if .Values.nodeSelectors.enabled }}
+ nodeSelector:
+ {{ .Values.nodeSelectors.spgwc.label }}: {{ .Values.nodeSelectors.spgwc.value }}
+ {{- end }}
+ serviceAccountName: spgwc
+ {{- if hasKey .Values.images "pullSecrets" }}
+ imagePullSecrets:
+{{ toYaml .Values.images.pullSecrets | indent 8 }}
+ {{- end }}
+ {{- if .Values.config.coreDump.enabled }}
+ initContainers:
+{{ tuple "spgwc" . | include "omec-control-plane.coredump_init" | indent 6 }}
+ {{- end }}
+ containers:
+ - name: spgwc
+ image: {{ .Values.images.tags.spgwc }}
+ imagePullPolicy: {{ .Values.images.pullPolicy }}
+ {{- if .Values.config.coreDump.enabled }}
+ securityContext:
+ privileged: true
+ runAsUser: 0
+ {{- end }}
+ stdin: true
+ tty: true
+ command: ["bash", "-xc"]
+ args:
+ - /opt/cp/scripts/spgwc-run.sh ngic_controlplane
+ livenessProbe:
+ httpGet:
+ path: /liveness
+ port: {{ .Values.config.spgwc.rest.port }}
+ initialDelaySeconds: 10
+ periodSeconds: 3
+ readinessProbe:
+ httpGet:
+ path: /readiness
+ port: {{ .Values.config.spgwc.rest.port }}
+ initialDelaySeconds: 10
+ periodSeconds: 3
+{{- if semverCompare ">=1.16-0" .Capabilities.KubeVersion.GitVersion }}
+ startupProbe:
+ #looks like available only in 1.16 K8s version and above
+ httpGet:
+ path: /startup
+ port: {{ .Values.config.spgwc.rest.port }}
+ failureThreshold: 30
+ periodSeconds: 10
+{{- end }}
+ env:
+ - name: MEM_LIMIT
+ valueFrom:
+ resourceFieldRef:
+ containerName: spgwc
+ resource: limits.memory
+ divisor: 1Mi
+ - name: POD_IP
+ valueFrom:
+ fieldRef:
+ fieldPath: status.podIP
+ {{- if .Values.config.managedByConfigPod.enabled }}
+ - name: MANAGED_BY_CONFIG_POD
+ value: "true"
+ {{- end }}
+ {{- if .Values.config.spgwc.managedByRoc.enabled }}
+ - name: DISABLE_CONFIG_WATCHER # If the variable has a value then changes
+ value: "true" # to subscriber_mapping.json are ignored
+ {{- end }}
+ {{- if .Values.resources.enabled }}
+ resources:
+{{ toYaml .Values.resources.spgwc | indent 10 }}
+ {{- end }}
+ volumeMounts:
+ - name: scripts
+ mountPath: /opt/cp/scripts
+ - name: configs
+ mountPath: /etc/cp/config
+ - name: shared-app
+ mountPath: /tmp
+ {{- if .Values.config.coreDump.enabled }}
+ - name: coredump
+ mountPath: /tmp/coredump
+ {{- end }}
+ - name: gx-app
+ image: {{ .Values.images.tags.spgwc }}
+ imagePullPolicy: {{ .Values.images.pullPolicy }}
+ {{- if .Values.config.coreDump.enabled }}
+ securityContext:
+ privileged: true
+ runAsUser: 0
+ {{- end }}
+ stdin: true
+ tty: true
+ command: ["bash", "-xc"]
+ args:
+ - /opt/cp/scripts/spgwc-run.sh gx-app
+ {{- if .Values.resources.enabled }}
+ resources:
+{{ toYaml .Values.resources.spgwc | indent 10 }}
+ {{- end }}
+ volumeMounts:
+ - name: scripts
+ mountPath: /opt/cp/scripts
+ - name: configs
+ mountPath: /etc/cp/config
+ - name: shared-app
+ mountPath: /tmp
+ {{- if .Values.config.coreDump.enabled }}
+ - name: coredump
+ mountPath: /tmp/coredump
+ {{- end }}
+ {{- if .Values.config.spgwc.managedByRoc.enabled }}
+ - name: init-sync
+ image: curlimages/curl:7.77.0
+ imagePullPolicy: IfNotPresent
+ stdin: true
+ tty: true
+ command: ["sh", "-c"]
+ args:
+ - /opt/cp/scripts/spgwc-init.sh
+ volumeMounts:
+ - name: scripts
+ mountPath: /opt/cp/scripts
+ volumes:
+ - name: scripts
+ configMap:
+ name: spgwc-scripts
+ defaultMode: 493
+ {{- end }}
+ volumes:
+ - name: scripts
+ configMap:
+ name: spgwc-scripts
+ defaultMode: 493
+ - name: configs
+ configMap:
+ name: spgwc-configs
+ defaultMode: 420
+ - name: shared-app
+ emptyDir: {}
+ - name: host-rootfs
+ hostPath:
+ path: /
+ {{- if .Values.config.coreDump.enabled }}
+ - name: coredump
+ hostPath:
+ path: {{ .Values.config.coreDump.path }}
+ {{- end }}
+{{- end }}
diff --git a/omec-control-plane/values.yaml b/omec-control-plane/values.yaml
new file mode 100644
index 0000000..4474228
--- /dev/null
+++ b/omec-control-plane/values.yaml
@@ -0,0 +1,594 @@
+# Copyright 2018 Intel Corporation
+# Copyright 2018-present Open Networking Foundation
+#
+# SPDX-License-Identifier: Apache-2.0
+# SPDX-License-Identifier: LicenseRef-ONF-Member-Only-1.0
+
+images:
+ tags:
+ init: registry.aetherproject.org/tools/busybox:stable
+ depCheck: quay.io/stackanetes/kubernetes-entrypoint:v0.3.1
+ hssdb: registry.aetherproject.org/proxy/omecproject/c3po-hssdb:master-771c0c3
+ hss: registry.aetherproject.org/proxy/omecproject/c3po-hss:master-771c0c3
+ mme: registry.aetherproject.org/proxy/omecproject/nucleus:master-5f0a821
+ spgwc: registry.aetherproject.org/omecproject/spgw:master-86f31e4
+ pcrf: registry.aetherproject.org/proxy/omecproject/c3po-pcrf:pcrf-b29af70
+ pcrfdb: registry.aetherproject.org/proxy/omecproject/c3po-pcrfdb:pcrf-b29af70
+ config4g: registry.aetherproject.org/omecproject/5gc-webui:onf-release3.0.5-0534804
+ pullPolicy: IfNotPresent
+ # Secrets must be manually created in the namespace.
+ pullSecrets:
+ - name: aether.registry
+
+nodeSelectors:
+ enabled: false
+ hss:
+ label: omec-cp
+ value: enabled
+ pcrf:
+ label: omec-cp
+ value: enabled
+ mme:
+ label: omec-cp
+ value: enabled
+ spgwc:
+ label: omec-cp
+ value: enabled
+ config4g:
+ label: omec-cp
+ value: enabled
+
+resources:
+ enabled: true
+ pcrf:
+ requests:
+ cpu: 2
+ memory: 1Gi
+ limits:
+ cpu: 2
+ memory: 1Gi
+ hss:
+ requests:
+ cpu: 2
+ memory: 1Gi
+ limits:
+ cpu: 2
+ memory: 1Gi
+ mme:
+ # Note that MME pod is composed of 4 containers
+ # Provide resources for a container, not a pod total
+ requests:
+ cpu: 0.5
+ memory: 1Gi
+ limits:
+ cpu: 0.5
+ memory: 1Gi
+ spgwc:
+ requests:
+ cpu: 2
+ memory: 5Gi
+ limits:
+ cpu: 2
+ memory: 5Gi
+ config4g:
+ requests:
+ cpu: 1
+ memory: 1Gi
+ limits:
+ cpu: 1
+ memory: 1Gi
+
+cassandra:
+ deploy: true
+ fullnameOverride: cassandra
+ image:
+ tag: 2.1.20
+ #selector:
+ # nodeSelector:
+ # cassandra: enabled
+ persistence:
+ enabled: false
+ config:
+ #cluster_size: 1
+ #seed_size: 1
+ endpoint_snitch: GossipingPropertyFileSnitch
+ readinessProbe:
+ initialDelaySeconds: 10
+ resources: {}
+ #requests:
+ # memory: 4Gi
+ # cpu: 2
+ #limits:
+ # memory: 4Gi
+ # cpu: 2
+
+config:
+ clusterDomain: cluster.local
+ coreDump:
+ enabled: true
+ path: /tmp/coredump
+ managedByConfigPod: # config comes from helm by default, if enabled true, then discard
+ enabled: false # helm chart config and use the config from config Pod
+ useExistingConfigMap: false
+ logger:
+ WEBUI:
+ debugLevel: info
+ ReportCaller: false
+ config4g:
+ deploy: false
+ podAnnotations:
+ field.cattle.io/workloadMetrics: '[{"path":"/metrics","port":9089,"schema":"HTTP"}]'
+ prometheus:
+ port: 9089
+ nodePort:
+ enabled: false
+ port: 30084
+ urlport:
+ port: 5000
+ nodePort:
+ enabled: false
+ port: 35000
+ ingress:
+ enabled: false
+ hostname: free5gc.local
+ path: /
+ pathType: Prefix
+ cfgFiles:
+ webuicfg.conf:
+ info:
+ version: 1.0.0
+ description: WebUI initial local configuration
+ configuration:
+ endpoints:
+ - type: spgw
+ configPushUrl: "http://spgwc:8080/v1/config"
+ configCheckUrl: "http://spgwc:8080/v1/config-check"
+ #- type: mmeapp
+ # configPushUrl: "http://mme-app-config:8080/v1/config/slice"
+ # configCheckUrl: "http://mme-app-config:8080/v1/config-check"
+ - type: mme-s1ap
+ configPushUrl: "http://mme:8081/v1/config/slice"
+ configCheckUrl: "http://mme:8081/v1/config-check"
+ - type: hss
+ configPushUrl: "http://hss:8080/v2/config/imsis"
+ configCheckUrl: "http://hss:8080/v2/config-check"
+ - type: pcrf
+ configPushUrl: "http://pcrf:8080/v1/config/policies"
+ configCheckUrl: "http://pcrf:8080/v1/config-check"
+ pcrf:
+ deploy: true
+ podAnnotations:
+ fluentbit.io/parser: pcrf
+ field.cattle.io/workloadMetrics: '[{"path":"/metrics","port":9089,"schema":"HTTP"}]'
+ pcrfdb: cassandra
+ configPort:
+ port: 8080
+ nodePort:
+ enabled: false
+ port: 30081
+ gx:
+ nodePort:
+ enabled: false
+ port: 33868
+ prometheus:
+ port: 9089
+ nodePort:
+ enabled: false
+ port: 30086
+ # Provide the peer whitelist extension
+ # The peer name must be a fqdn. We allow also a special "*" character as the
+ # first label of the fqdn, to allow all fqdn with the same domain name.
+ # Example: *.example.net will allow host1.example.net and host2.example.net
+ acl:
+ oldTls: "*.cluster.local"
+ #ipSec:
+ bootstrap:
+ enabled: false
+ # See https://github.com/omec-project/c3po for details of config options
+ cfgFiles:
+ subscriber_mapping.json:
+ Policies:
+ service-groups:
+ internet:
+ default-activate-service:
+ - be-internet-access
+ services:
+ be-internet-access:
+ qci: 9
+ arp: 1
+ AMBR_UL: 1024000
+ AMBR_DL: 10240000
+ service-activation-rules:
+ - best-effort-internet-access
+ #activate-conditions:
+ # timer: 50
+ #deactivate-conditions:
+ # timer: 60
+ rules:
+ best-effort-internet-access:
+ definition:
+ Charging-Rule-Name: "best-effort-internet-access"
+ Flow-Status: 2
+ QoS-Information:
+ QoS-Class-Identifier: 9
+ Max-Requested-Bandwidth-UL: 512000
+ Max-Requested-Bandwidth-DL: 5120000
+ Guaranteed-Bitrate-UL: 0
+ Guaranteed-Bitrate-DL: 0
+ Allocation-Retention-Priority:
+ Priority-Level: 1
+ Pre-emption-Capability: 1
+ Pre-emption-Vulnerability: 1
+ Flow-Information:
+ Flow-Direction: 3
+ Flow-Description: "permit out ip from 0.0.0.0/0 to assigned"
+ pcrf.json:
+ common:
+ fdcfg: conf/pcrf.conf
+ # Origin host and realm will be set automatically if unset
+ #originhost: ""
+ #originrealm: ""
+ pcrf:
+ gtwhost: "*"
+ gtwport: 9080
+ #restport will be set by configmap
+ #restport: ""
+ ossport: 9082
+ # casssrv will be set to cassandra in the same cluster if unset
+ #casssrv: ""
+ casskeyspace: vpcrf
+ casshost: "cassandra"
+ cassusr: root
+ casspwd: root
+ cassdb: vpcrf
+ casscoreconnections: 2
+ cassmaxconnections: 8
+ cassioqueuesize: 32768
+ cassiothreads: 2
+ randv: true
+ optkey: "63bfa50ee6523365ff14c1f45f88737d"
+ reloadkey: false
+ logsize: 20
+ lognumber: 5
+ logname: logs/pcrf.log
+ logqsize: 8192
+ statlogsize: 20
+ statlognumber: 5
+ statlogname: logs/pcrf_stat.log
+ auditlogsize: 20
+ auditlognumber: 5
+ auditlogname: logs/pcrf_audit.log
+ statfreq: 2000
+ numworkers: 4
+ concurrent: 10
+ ossfile: conf/oss.json
+ verifyroamingsubscribers: false
+ rulesfile: conf/subscriber_mapping.json
+ oss.json:
+ option:
+ id: url
+ type: string
+ services:
+ - id: logger
+ commands:
+ - id: describe_loggers
+ - id: set_logger_level
+ options:
+ - id: name
+ type: string
+ - id: level
+ type: integer
+ - id: stats
+ commands:
+ - id: describe_stats_frequency
+ - id: describe_stats_live
+ - id: set_stats_frequency
+ options:
+ - id: frequency
+ type: integer
+ hss:
+ deploy: true
+ podAnnotations:
+ fluentbit.io/parser: hss
+ field.cattle.io/workloadMetrics: '[{"path":"/metrics","port":9089,"schema":"HTTP"}]'
+ hssdb: cassandra
+ s6a:
+ nodePort:
+ enabled: false
+ port: 33868
+ configPort:
+ port: 8080
+ nodePort:
+ enabled: false
+ port: 30081
+ prometheus:
+ port: 9089
+ nodePort:
+ enabled: false
+ port: 30086
+ # Provide the peer whitelist extension
+ # The peer name must be a fqdn. We allow also a special "*" character as the
+ # first label of the fqdn, to allow all fqdn with the same domain name.
+ # Example: *.example.net will allow host1.example.net and host2.example.net
+ acl:
+ oldTls: "*.cluster.local"
+ #ipSec:
+ bootstrap:
+ enabled: true
+ users:
+ - apn: internet
+ key: "465b5ce8b199b49faa5f0a2ee238a6bc"
+ opc: "d4416644f6154936193433dd20a0ace0"
+ sqn: 96
+ imsiStart: "208014567891200"
+ msisdnStart: "1122334455"
+ mme_identity: mme.omec.svc.cluster.local
+ mme_realm: omec.svc.cluster.local
+ count: 10
+ staticusers:
+ - apn: internet
+ key: "465b5ce8b199b49faa5f0a2ee238a6bc"
+ opc: "d4416644f6154936193433dd20a0ace0"
+ sqn: 96
+ imsi: "208014567891200"
+ msisdn: "1122334455"
+ staticAddr: 0.0.0.0
+ mme_identity: mme.omec.svc.cluster.local
+ mme_realm: omec.svc.cluster.local
+ mmes:
+ - id: 1
+ mme_identity: mme.omec.svc.cluster.local
+ mme_realm: omec.svc.cluster.local
+ isdn: "19136246000"
+ unreachability: 1
+ # See https://github.com/omec-project/c3po for details of config options
+ cfgFiles:
+ hss.json:
+ common:
+ fdcfg: conf/hss.conf
+ # Origin host and realm will be set automatically if unset
+ #originhost: ""
+ #originrealm: ""
+ hss:
+ gtwhost: "*"
+ gtwport: 9080
+ #restport will be set by configmap
+ #restport: ""
+ ossport: 9082
+ # casssrv will be set to cassandra in the same cluster if unset
+ #casssrv: ""
+ cassusr: root
+ casspwd: root
+ cassdb: vhss
+ casscoreconnections: 2
+ cassmaxconnections: 8
+ cassioqueuesize: 32768
+ cassiothreads: 2
+ randv: true
+ optkey: "63bfa50ee6523365ff14c1f45f88737d"
+ reloadkey: false
+ logsize: 20
+ lognumber: 5
+ logname: logs/hss.log
+ logqsize: 8192
+ statlogsize: 20
+ statlognumber: 5
+ statlogname: logs/hss_stat.log
+ auditlogsize: 20
+ auditlognumber: 5
+ auditlogname: logs/hss_audit.log
+ statfreq: 2000
+ numworkers: 4
+ concurrent: 10
+ ossfile: conf/oss.json
+ verifyroamingsubscribers: false
+ oss.json:
+ option:
+ id: url
+ type: string
+ services:
+ - id: logger
+ commands:
+ - id: describe_loggers
+ - id: set_logger_level
+ options:
+ - id: name
+ type: string
+ - id: level
+ type: integer
+ - id: stats
+ commands:
+ - id: describe_stats_frequency
+ - id: describe_stats_live
+ - id: set_stats_frequency
+ options:
+ - id: frequency
+ type: integer
+ mme:
+ deploy: true
+ podAnnotations:
+ fluentbit.io/parser: mme
+ field.cattle.io/workloadMetrics: '[{"path":"/metrics","port":3081,"schema":"HTTP"}]'
+ spgwAddr: spgwc
+ s11:
+ nodePort:
+ enabled: false
+ port: 32124
+ s6a:
+ nodePort:
+ enabled: false
+ port: 33869
+ prometheus:
+ port: 3081
+ nodePort:
+ enabled: false
+ port: 30085
+ # See https://github.com/omec-project/openmme/blob/master/README.txt for more config options
+ cfgFiles:
+ config.json:
+ mme:
+ name: vmmestandalone
+ group_id: 1
+ code: 1
+ logging: debug
+ plmnlist:
+ #plmn1 is aether common plmn, plmn2 is for aether-in-a-box
+ plmn1: "mcc=315,mnc=010"
+ plmn2: "mcc=208,mnc=01"
+ apnlist:
+ internet: "spgwc"
+ default: "spgwc" #default spgwc to be used
+ feature_list:
+ dcnr_support: "disabled"
+ security:
+ #int_alg_list: "[EIA0]"
+ int_alg_list: "[EIA1, EIA2, EIA0]"
+ sec_alg_list: "[EEA0, EEA1, EEA2]"
+ s1ap:
+ sctp_port: 36412
+ sctp_port_external: 36412
+ s11:
+ egtp_default_port: 2123
+ # sgw_addr and pgw_addr will be set dynamically if unset
+ #sgw_addr:
+ #pgw_addr:
+ s6a:
+ host_type: freediameter
+ # host and realm will be set dynamically if unset
+ #host:
+ #realm:
+ spgwc:
+ deploy: true
+ managedByRoc:
+ enabled: false
+ syncUrl: ""
+ podAnnotations:
+ fluentbit.io/parser: spgwc
+ field.cattle.io/workloadMetrics: '[{"path":"/metrics","port":9089,"schema":"HTTP"}]'
+ s11:
+ port: 2123
+ nodePort:
+ enabled: false
+ port: 32123
+ n4:
+ port: 8805
+ nodePort:
+ enabled: false
+ port: 30021
+ prometheus:
+ port: 9089
+ nodePort:
+ enabled: false
+ port: 30084
+ rest:
+ port: 8080
+ nodePort:
+ enabled: false
+ port: 30080
+ cfgFiles:
+ cp.json:
+ global:
+ transmitTimerSec: 2
+ periodicTimerSec: 10
+ transmitCount: 5
+ requestTimeoutMilliSec: 5000
+ requestTries: 3
+ gxConfig: 0
+ urrConfig: 0
+ loggingLevel: "LOG_DEBUG"
+ heartbeatFailure: false
+ #DNS Server - 3gpp compliant DNS server
+ dns:
+ cache:
+ concurrent: 25
+ percentage: 80
+ intervalSec: 60
+ queryTimeoutMilliSec: 1000
+ queryTries: 1
+ app:
+ frequencySec: 3
+ filename: "appqueries.json"
+ nameserver: "127.0.0.1"
+ ops:
+ frequencySec: 3
+ filename: "opsqueries.json"
+ nameserver: "127.0.0.1"
+ ip_pool_config:
+ ueIpPool:
+ ip: "10.250.0.0"
+ mask: "255.255.0.0"
+ staticUeIpPool:
+ ip: "10.249.1.0"
+ mask: "255.255.255.0"
+ config.json:
+ gx:
+ host_type: freediameter
+ # host and realm will be set dynamically if unset
+ #host:
+ #realm:
+ subscriber_mapping.json:
+ subscriber-selection-rules:
+ - priority: 5
+ keys:
+ serving-plmn:
+ mcc: 208
+ mnc: 10
+ tac: 1
+ imsi-range:
+ from: 200000000000000
+ to: 299999999999999
+ selected-apn-profile: apn-profile1
+ selected-qos-profile: qos-profile1
+ selected-access-profile:
+ - access-all
+ selected-user-plane-profile: user-plane1
+ - priority: 10
+ keys:
+ match-all: true
+ selected-apn-profile: apn-profile1
+ selected-qos-profile: qos-profile1
+ selected-access-profile:
+ - access-all
+ selected-user-plane-profile: user-plane1
+ apn-profiles:
+ apn-profile1:
+ apn-name: internet
+ usage: 1
+ network: lbo
+ gx_enabled: true
+ dns_primary: 8.8.8.4
+ dns_secondary: 8.8.8.8
+ mtu: 1460
+ user-plane-profiles:
+ user-plane1:
+ user-plane: upf
+ global-address: true
+ qos-tags:
+ tag1: BW
+ access-tags:
+ tag1: ACC
+ qos-profiles:
+ mobile:
+ qci: 9
+ arp: 1
+ apn-ambr:
+ - 12345678
+ - 12345678
+ access-profiles:
+ access-all:
+ type: allow-all
+ internet-only:
+ type: internet-only
+ filter: No_private_network
+ intranet-only:
+ type: intranet-only
+ filter: only_private_network
+ apps-only:
+ type: specific-network
+ filter: only_apps_network
+ specific-app:
+ type: specific-destination-only
+ filter: allow-app-name
+ excluding-app:
+ type: excluding-this-app
+ filter: exclude-app-name
diff --git a/omec-sub-provision/Chart.yaml b/omec-sub-provision/Chart.yaml
new file mode 100644
index 0000000..1cbc22f
--- /dev/null
+++ b/omec-sub-provision/Chart.yaml
@@ -0,0 +1,11 @@
+---
+# Copyright 2020-present Open Networking Foundation
+#
+# SPDX-License-Identifier: LicenseRef-ONF-Member-Only-1.0
+
+apiVersion: v2
+description: Mobile Sim Provisioning services
+name: omec-sub-provision
+icon: https://guide.opencord.org/logos/cord.svg
+
+version: 0.1.4
diff --git a/omec-sub-provision/templates/NOTES.txt b/omec-sub-provision/templates/NOTES.txt
new file mode 100644
index 0000000..b7e5000
--- /dev/null
+++ b/omec-sub-provision/templates/NOTES.txt
@@ -0,0 +1,9 @@
+{{- /*
+
+# Copyright 2020-present Open Networking Foundation
+#
+# SPDX-License-Identifier: LicenseRef-ONF-Member-Only-1.0
+
+*/ -}}
+
+Notes - Instructions to use SIM provision application helm charts
diff --git a/omec-sub-provision/templates/_helpers.tpl b/omec-sub-provision/templates/_helpers.tpl
new file mode 100644
index 0000000..706fcce
--- /dev/null
+++ b/omec-sub-provision/templates/_helpers.tpl
@@ -0,0 +1,115 @@
+{{- /*
+
+# Copyright 2020-present Open Networking Foundation
+#
+# SPDX-License-Identifier: LicenseRef-ONF-Member-Only-1.0
+
+*/ -}}
+
+{{/*
+Renders a set of standardised labels
+*/}}
+{{- define "omec-sub-provision.metadata_labels" -}}
+{{- $application := index . 0 -}}
+{{- $context := index . 1 -}}
+release: {{ $context.Release.Name }}
+app: {{ $application }}
+{{- end -}}
+
+{{/*
+Render the given template.
+*/}}
+{{- define "omec-sub-provision.template" -}}
+{{- $name := index . 0 -}}
+{{- $context := index . 1 -}}
+{{- $last := base $context.Template.Name }}
+{{- $wtf := $context.Template.Name | replace $last $name -}}
+{{ include $wtf $context }}
+{{- end -}}
+
+{{/*
+Render ServiceAccount, Role, and RoleBinding required for kubernetes-entrypoint.
+*/}}
+{{- define "omec-sub-provision.service_account" -}}
+{{- $context := index . 1 -}}
+{{- $saName := index . 0 -}}
+{{- $saNamespace := $context.Release.Namespace }}
+---
+apiVersion: v1
+kind: ServiceAccount
+metadata:
+ name: {{ $saName }}
+ namespace: {{ $saNamespace }}
+ labels:
+{{ tuple $saName $context | include "omec-sub-provision.metadata_labels" | indent 4 }}
+---
+{{- if semverCompare ">=1.16-0" $context.Capabilities.KubeVersion.GitVersion }}
+apiVersion: rbac.authorization.k8s.io/v1
+{{- else }}
+apiVersion: rbac.authorization.k8s.io/v1beta1
+{{- end }}
+kind: RoleBinding
+metadata:
+ name: {{ $saName }}
+ namespace: {{ $saNamespace }}
+ labels:
+{{ tuple $saName $context | include "omec-sub-provision.metadata_labels" | indent 4 }}
+roleRef:
+ apiGroup: rbac.authorization.k8s.io
+ kind: Role
+ name: {{ $saName }}
+subjects:
+ - kind: ServiceAccount
+ name: {{ $saName }}
+ namespace: {{ $saNamespace }}
+---
+{{- if semverCompare ">=1.16-0" $context.Capabilities.KubeVersion.GitVersion }}
+apiVersion: rbac.authorization.k8s.io/v1
+{{- else }}
+apiVersion: rbac.authorization.k8s.io/v1beta1
+{{- end }}
+kind: Role
+metadata:
+ name: {{ $saName }}
+ namespace: {{ $saNamespace }}
+ labels:
+{{ tuple $saName $context | include "omec-sub-provision.metadata_labels" | indent 4 }}
+rules:
+ - apiGroups:
+ - ""
+ - extensions
+ - batch
+ - apps
+ verbs:
+ - get
+ - list
+ - patch
+ resources:
+ - statefulsets
+ - daemonsets
+ - jobs
+ - pods
+ - services
+ - endpoints
+ - configmaps
+{{- end -}}
+
+{{/*
+Render init container for coredump.
+*/}}
+{{- define "omec-sub-provision.coredump_init" -}}
+{{- $pod := index . 0 -}}
+{{- $context := index . 1 -}}
+- name: {{ $pod }}-coredump-init
+ image: {{ $context.Values.images.tags.init | quote }}
+ imagePullPolicy: {{ $context.Values.images.pullPolicy }}
+ securityContext:
+ privileged: true
+ runAsUser: 0
+ command: ["bash", "-xc"]
+ args:
+ - echo '/tmp/coredump/core.%h.%e.%t' > /mnt/host-rootfs/proc/sys/kernel/core_pattern
+ volumeMounts:
+ - name: host-rootfs
+ mountPath: /mnt/host-rootfs
+{{- end -}}
diff --git a/omec-sub-provision/templates/bin/_simapp-run.sh.tpl b/omec-sub-provision/templates/bin/_simapp-run.sh.tpl
new file mode 100644
index 0000000..1f6ec76
--- /dev/null
+++ b/omec-sub-provision/templates/bin/_simapp-run.sh.tpl
@@ -0,0 +1,16 @@
+#!/bin/sh
+
+# Copyright 2020-present Open Networking Foundation
+#
+# SPDX-License-Identifier: LicenseRef-ONF-Member-Only-1.0
+
+set -xe
+
+{{- if .Values.config.coreDump.enabled }}
+cp /simapp/bin/simapp /tmp/coredump/
+{{- end }}
+
+cd /simapp
+cat config/simapp.yaml
+
+./bin/simapp -simapp config/simapp.yaml
diff --git a/omec-sub-provision/templates/configmap-simapp.yaml b/omec-sub-provision/templates/configmap-simapp.yaml
new file mode 100644
index 0000000..50229a3
--- /dev/null
+++ b/omec-sub-provision/templates/configmap-simapp.yaml
@@ -0,0 +1,24 @@
+{{/*
+# Copyright 2020-present Open Networking Foundation
+
+# SPDX-License-Identifier: LicenseRef-ONF-Member-Only-1.0
+*/}}
+
+{{- if .Values.config.simapp.deploy }}
+
+apiVersion: v1
+kind: ConfigMap
+metadata:
+ name: simapp
+ labels:
+{{ tuple "simapp" . | include "omec-sub-provision.metadata_labels" | indent 4 }}
+data:
+ simapp-run.sh: |
+{{ tuple "bin/_simapp-run.sh.tpl" . | include "omec-sub-provision.template" | indent 4 }}
+{{- if not .Values.config.useExistingConfigMap -}}
+{{- range $key, $value := .Values.config.simapp.cfgFiles }}
+ {{ $key }}: |-
+{{ toYaml $value | indent 4 }}
+{{- end }}
+{{- end }}
+{{- end }}
diff --git a/omec-sub-provision/templates/deployment-simapp.yaml b/omec-sub-provision/templates/deployment-simapp.yaml
new file mode 100644
index 0000000..5732f75
--- /dev/null
+++ b/omec-sub-provision/templates/deployment-simapp.yaml
@@ -0,0 +1,93 @@
+{{/*
+# Copyright 2020-present Open Networking Foundation
+
+# SPDX-License-Identifier: LicenseRef-ONF-Member-Only-1.0
+*/}}
+
+{{- if .Values.config.simapp.deploy }}
+{{ tuple "simapp" . | include "omec-sub-provision.service_account" }}
+---
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+ name: simapp
+ labels:
+{{ tuple "simapp" . | include "omec-sub-provision.metadata_labels" | indent 4 }}
+spec:
+ replicas: 1
+ #serviceName: simapp-headless
+ selector:
+ matchLabels:
+{{ tuple "simapp" . | include "omec-sub-provision.metadata_labels" | indent 6 }}
+ template:
+ metadata:
+ labels:
+{{ tuple "simapp" . | include "omec-sub-provision.metadata_labels" | indent 8 }}
+ {{- with .Values.config.simapp.podAnnotations }}
+ annotations:
+ helm.sh/hook: pre-install
+ helm.sh/hook-weight: "5"
+ {{- toYaml . | nindent 8 }}
+ {{- end }}
+ spec:
+ serviceAccountName: simapp
+ {{- if hasKey .Values.images "pullSecrets" }}
+ imagePullSecrets:
+{{ toYaml .Values.images.pullSecrets | indent 8 }}
+ {{- end }}
+ initContainers:
+ - name: wait-simapp-module2
+ image: {{ .Values.images.tags.init | quote }}
+ imagePullPolicy: {{ .Values.images.pullPolicy }}
+ command: ['sh', '-c', 'until nslookup simapp; do echo waiting for simapp; sleep 4; done;']
+ {{- if .Values.config.coreDump.enabled }}
+{{ tuple "simapp" . | include "omec-sub-provision.coredump_init" | indent 6 }}
+ {{- end }}
+ containers:
+ - name: simapp
+ image: {{ .Values.images.tags.simapp }}
+ imagePullPolicy: {{ .Values.images.pullPolicy }}
+ {{- if .Values.config.coreDump.enabled }}
+ securityContext:
+ runAsUser: 0
+ {{- end }}
+ stdin: true
+ tty: true
+ command: ["/simapp/script/simapp-run.sh"]
+ env:
+ - name: POD_IP
+ valueFrom:
+ fieldRef:
+ fieldPath: status.podIP
+ {{- if .Values.resources.enabled }}
+ resources:
+{{ toYaml .Values.resources.simapp | indent 10 }}
+ {{- end }}
+ volumeMounts:
+ - name: run-script
+ mountPath: /simapp/script/simapp-run.sh
+ subPath: simapp-run.sh
+ - name: nf-config
+ mountPath: /simapp/config
+ {{- if .Values.config.coreDump.enabled }}
+ - name: coredump
+ mountPath: /tmp/coredump
+ {{- end }}
+ volumes:
+ - name: run-script
+ configMap:
+ name: simapp
+ defaultMode: 493
+ - name: nf-config
+ configMap:
+ name: simapp
+ defaultMode: 493
+ {{- if .Values.config.coreDump.enabled }}
+ - name: host-rootfs
+ hostPath:
+ path: /
+ - name: coredump
+ hostPath:
+ path: {{ .Values.config.coreDump.path }}
+ {{- end }}
+{{- end }}
diff --git a/omec-sub-provision/templates/service-simapp.yaml b/omec-sub-provision/templates/service-simapp.yaml
new file mode 100644
index 0000000..74ef8a8
--- /dev/null
+++ b/omec-sub-provision/templates/service-simapp.yaml
@@ -0,0 +1,52 @@
+{{/*
+# Copyright 2020-present Open Networking Foundation
+
+# SPDX-License-Identifier: LicenseRef-ONF-Member-Only-1.0
+*/}}
+
+{{- if .Values.config.simapp.deploy }}
+---
+apiVersion: v1
+kind: Service
+metadata:
+ name: simapp
+ labels:
+{{ tuple "simapp" . | include "omec-sub-provision.metadata_labels" | indent 4 }}
+spec:
+ type: ClusterIP
+ selector:
+{{ tuple "simapp" . | include "omec-sub-provision.metadata_labels" | indent 4 }}
+ ports:
+ - name: prometheus-exporter
+ port: {{ .Values.config.simapp.prometheus.port }}
+ protocol: TCP
+ - name: config-exporter
+ port: {{ .Values.config.simapp.config.port }}
+ protocol: TCP
+{{- if .Values.config.simapp.prometheus.nodePort.enabled }}
+---
+apiVersion: v1
+kind: Service
+metadata:
+ name: simapp-external
+ labels:
+{{ tuple "simapp" . | include "omec-sub-provision.metadata_labels" | indent 4 }}
+spec:
+ type: NodePort
+ selector:
+{{ tuple "simapp" . | include "omec-sub-provision.metadata_labels" | indent 4 }}
+ ports:
+{{- if .Values.config.simapp.prometheus.nodePort.enabled }}
+ - name: prometheus-exporter
+ port: {{ .Values.config.simapp.prometheus.port }}
+ protocol: TCP
+ nodePort: {{ .Values.config.simapp.prometheus.nodePort.port }}
+{{- end }}
+{{- if .Values.config.simapp.config.nodePort.enabled }}
+ - name: config-exporter
+ port: {{ .Values.config.simapp.config.port }}
+ protocol: TCP
+ nodePort: {{ .Values.config.simapp.config.nodePort.port }}
+{{- end }}
+{{- end }}
+{{- end }}
diff --git a/omec-sub-provision/values.yaml b/omec-sub-provision/values.yaml
new file mode 100644
index 0000000..f4aca8e
--- /dev/null
+++ b/omec-sub-provision/values.yaml
@@ -0,0 +1,124 @@
+# Copyright 2020-present Open Networking Foundation
+#
+# SPDX-License-Identifier: LicenseRef-ONF-Member-Only-1.0
+
+images:
+ tags:
+ init: docker.io/omecproject/pod-init:1.0.0
+ simapp: "registry.aetherproject.org/omecproject/simapp:main-bff796a"
+ pullPolicy: IfNotPresent
+ # Optionally specify an array of imagePullSecrets.
+ # Secrets must be manually created in the namespace.
+ pullSecrets:
+ - name: aether.registry
+
+resources:
+ enabled: false
+ simapp:
+ requests:
+ cpu: 1
+ memory: 1Gi
+ limits:
+ cpu: 1
+ memory: 1Gi
+
+config:
+ coreDump:
+ enabled: false
+ path: /tmp/coredump
+ simapp:
+ deploy: true
+ podAnnotations:
+ field.cattle.io/workloadMetrics: '[{"path":"/metrics","port":9089,"schema":"HTTP"}]'
+ prometheus:
+ port: 9089
+ nodePort:
+ enabled: false
+ port: 30080
+ config:
+ port: 8080
+ nodePort:
+ enabled: false
+ port: 30081
+ cfgFiles:
+ simapp.yaml:
+ info:
+ version: 1.0.0
+ description: SIMAPP initial local configuration
+ logger:
+ # network function
+ APP:
+ debugLevel: info
+ ReportCaller: false
+ configuration:
+ provision-network-slice: false
+ subscribers:
+ - ueId-start: 208014567891201 #4G User for aiab setup
+ ueId-end: 208014567891201
+ plmnId: 20893
+ opc: d4416644f6154936193433dd20a0ace0
+ key: 465b5ce8b199b49faa5f0a2ee238a6bc
+ sequenceNumber: 96
+ - ueId-start: 123456789123458
+ ueId-end: 123456789123458
+ plmnId: 20893
+ opc: 8e27b6af0e692e750f32667a3b14605d
+ key: 8baf473f2f8fd09487cccbd7097c6862
+ sequenceNumber: 16f3b3f70fc2
+ - ueId-start: 123456789123460
+ ueId-end: 123456789123465
+ plmnId: 20893
+ opc: 8e27b6af0e692e750f32667a3b14605d
+ key: 8baf473f2f8fd09487cccbd7097c6862
+ sequenceNumber: 16f3b3f70fc2
+ sub-provision-endpt:
+ addr: webui
+ port: 5000
+ device-groups:
+ - name: "iot-camera"
+ imsis:
+ - "123456789123458"
+ - "208014567891201"
+ ip-domain-name: "pool1"
+ ip-domain-expanded:
+ dnn: internet
+ dns-primary: "8.8.8.8"
+ mtu: 1460
+ ue-ip-pool: "10.91.0.0/16"
+ ue-dnn-qos:
+ uplink: 2000000
+ downlink: 8000000
+ traffic-class:
+ name: "gold"
+ qci: 9
+ arp: 6
+ site-info: "menlo"
+ network-slices:
+ - name: "slice1"
+ slice-id:
+ sd: 65565
+ sst: 255
+ site-device-group:
+ - "iot-camera"
+ applications-information:
+ - app-name: "iot-app"
+ end-port: 40000
+ endpoint: "1.1.1.1/32"
+ protocol: 17
+ start-port: 40000
+ deny-applications:
+ - "iot-app-deny"
+ permit-applications:
+ - "iot-app1-permit"
+ - "iot-app2-permit"
+ site-info:
+ gNodeBs:
+ - name: "menlo-gnb1"
+ tac: 1
+ plmn:
+ mcc: "315"
+ mnc: "010"
+ site-name: "menlo"
+ upf:
+ upf-name: "upf"
+ upf-port: 8805