diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml
index 561ed70c6..bc7778163 100644
--- a/.github/workflows/release.yaml
+++ b/.github/workflows/release.yaml
@@ -76,12 +76,18 @@ jobs:
command: npm run cypress:run:e2e
- name: Karma Service Tests
command: npm run lib-build && npm run lib-test -- --no-watch --browsers=GitlabHeadlessChrome
+ - name: Helm Lint
+ command: helm lint helm/
+ - name: Helm Template
+ command: helm template data-dashboard helm/
steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
- uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0
+ if: ${{ matrix.name != 'Helm Lint' && matrix.name != 'Helm Template' }}
with:
node-version: "24"
- run: npm ci
+ if: ${{ matrix.name != 'Helm Lint' && matrix.name != 'Helm Template' }}
- name: ${{ matrix.name }}
run: ${{ matrix.command }}
@@ -104,12 +110,23 @@ jobs:
- run: npm ci
# --- Version bump ---
- - name: Bump version in package.json files
+ - name: Bump version in package.json files and helm chart
if: ${{ inputs.bump-version }}
run: |
npm version "${{ inputs.version }}" --no-git-tag-version
cd projects/dashboard-core
npm version "${{ inputs.version }}" --no-git-tag-version
+ cd ../..
+ sed -i "s/^version: .*/version: ${{ inputs.version }}/" helm/Chart.yaml
+ sed -i "s/^appVersion: .*/appVersion: \"${{ inputs.version }}\"/" helm/Chart.yaml
+ sed -i "s/^ tag: .*/ tag: ${{ inputs.version }}/" helm/values.yaml
+
+ - name: Regenerate Helm docs
+ if: ${{ inputs.bump-version }}
+ uses: losisin/helm-docs-github-action@3a4528e97c49a5e83de6b78c50c61c8ee5c9f944 # v2.0.0
+ with:
+ chart-search-root: helm
+ template-files: README.md.gotmpl
# --- Build library ---
- name: Build library
@@ -169,6 +186,22 @@ jobs:
if: ${{ (!inputs.dry-run) && (inputs.docker-publish) }}
run: cosign sign --yes ghcr.io/eclipse-edc/data-dashboard@${{ steps.build-and-push.outputs.digest }}
+ # --- Helm chart ---
+ - name: Package and push Helm chart
+ id: helm-push
+ if: ${{ (!inputs.dry-run) && (inputs.docker-publish) }}
+ run: |
+ helm package helm/
+ echo "${{ secrets.GITHUB_TOKEN }}" | helm registry login ghcr.io -u ${{ github.actor }} --password-stdin
+ push_output=$(helm push data-dashboard-${{ inputs.version }}.tgz oci://ghcr.io/eclipse-edc/charts 2>&1)
+ echo "$push_output"
+ digest=$(echo "$push_output" | grep -oP 'sha256:[a-f0-9]+')
+ echo "digest=$digest" >> "$GITHUB_OUTPUT"
+
+ - name: Sign Helm chart
+ if: ${{ (!inputs.dry-run) && (inputs.docker-publish) }}
+ run: cosign sign --yes ghcr.io/eclipse-edc/charts/data-dashboard@${{ steps.helm-push.outputs.digest }}
+
# --- GitHub Release ---
- name: Configure git
run: |
@@ -178,7 +211,7 @@ jobs:
- name: Commit version bump
if: ${{ (!inputs.dry-run) && (inputs.bump-version) }}
run: |
- git add package.json projects/dashboard-core/package.json
+ git add package.json projects/dashboard-core/package.json helm/Chart.yaml helm/values.yaml helm/README.md
git commit -m "chore(release): v${{ inputs.version }}"
- name: Create GitHub Release
diff --git a/.github/workflows/verify.yaml b/.github/workflows/verify.yaml
index 85d54509f..4a31bf58c 100644
--- a/.github/workflows/verify.yaml
+++ b/.github/workflows/verify.yaml
@@ -77,3 +77,11 @@ jobs:
load: true
tags: edc-dashboard:test
+ helm-checks:
+ name: Helm Lint & Template
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
+ - run: helm lint helm/
+ - run: helm template data-dashboard helm/
+
diff --git a/README.md b/README.md
index 25af290cc..53e4cc16c 100644
--- a/README.md
+++ b/README.md
@@ -8,7 +8,7 @@ EDC Data Dashboard is a dev frontend application for [EDC Management API](https:
1. [Overview](#overview)
2. [Configuration](#configuration)
-3. [Run the dashboard](#run-the-dashboard)
+3. [Run/Deploy the dashboard](#rundeploy-the-dashboard)
4. [Create a custom dashboard (How to use the library)](#create-a-custom-dashboard-how-to-use-the-library)
5. [Contributing](#contributing)
@@ -92,12 +92,23 @@ To configure a base path, add a file to the deployment environment at `public/co
For more details how this works, have a look at the [app.config.ts](src/app/app.config.ts) and the angular docs about [APP_BASE_HREF](https://angular.dev/api/common/APP_BASE_HREF).
-# Run the dashboard
+# Run/Deploy the dashboard
+## Helm
+The dashboard can be installed via Helm from the OCI registry.
+The dashboard will be available depending on your ingress/service configuration.
+
+```shell
+helm install data-dashboard oci://ghcr.io/eclipse-edc/charts/data-dashboard
+```
+
+For available configuration options, see the [Helm chart documentation](helm/README.md).
+
## Docker
The dashboard will be available at `http://localhost:8080`
-1. `docker build -t eclipse-edc/data-dashboard .`
-2. `docker run -p 8080:8080 -v $PWD/public/config/:/app/config -v $PWD/nginx.conf:/etc/nginx/conf.d/default.conf eclipse-edc/data-dashboard`
+```shell
+docker run -p 8080:8080 -v $PWD/public/config/:/app/config -v $PWD/nginx.conf:/etc/nginx/conf.d/default.conf ghcr.io/eclipse-edc/data-dashboard:latest
+```
## Angular dev server
To run the data dashboard, you have to execute the following commands.
diff --git a/helm/.helmignore b/helm/.helmignore
new file mode 100644
index 000000000..0e8a0eb36
--- /dev/null
+++ b/helm/.helmignore
@@ -0,0 +1,23 @@
+# Patterns to ignore when building packages.
+# This supports shell glob matching, relative path matching, and
+# negation (prefixed with !). Only one pattern per line.
+.DS_Store
+# Common VCS dirs
+.git/
+.gitignore
+.bzr/
+.bzrignore
+.hg/
+.hgignore
+.svn/
+# Common backup files
+*.swp
+*.bak
+*.tmp
+*.orig
+*~
+# Various IDEs
+.project
+.idea/
+*.tmproj
+.vscode/
diff --git a/helm/Chart.yaml b/helm/Chart.yaml
new file mode 100644
index 000000000..d9909640b
--- /dev/null
+++ b/helm/Chart.yaml
@@ -0,0 +1,25 @@
+apiVersion: v2
+name: data-dashboard
+description: Deploys the EDC Data Dashboard.
+icon: https://avatars.githubusercontent.com/u/87998832
+
+# A chart can be either an 'application' or a 'library' chart.
+#
+# Application charts are a collection of templates that can be packaged into versioned archives
+# to be deployed.
+#
+# Library charts provide useful utilities or functions for the chart developer. They're included as
+# a dependency of application charts to inject those utilities and functions into the rendering
+# pipeline. Library charts do not define any templates and therefore cannot be deployed.
+type: application
+
+# This is the chart version. This version number should be incremented each time you make changes
+# to the chart and its templates, including the app version.
+# Versions are expected to follow Semantic Versioning (https://semver.org/)
+version: 0.3.1
+
+# This is the version number of the application being deployed. This version number should be
+# incremented each time you make changes to the application. Versions are not expected to
+# follow Semantic Versioning. They should reflect the version the application is using.
+# It is recommended to use it with quotes.
+appVersion: "0.3.1"
diff --git a/helm/README.md b/helm/README.md
new file mode 100644
index 000000000..fb220197d
--- /dev/null
+++ b/helm/README.md
@@ -0,0 +1,53 @@
+# data-dashboard
+
+Deploys the EDC Data Dashboard.
+
+  
+
+## Installing the Chart
+
+To install the chart with the release name 'my-release':
+
+```console
+$ helm install my-release oci://ghcr.io/eclipse-edc/charts/data-dashboard --version 0.3.1
+```
+
+## Values
+
+| Key | Type | Default | Description |
+|-----|------|---------|-------------|
+| affinity | object | `{}` | |
+| autoscaling | object | `{"enabled":false,"maxReplicas":10,"minReplicas":1,"targetCPUUtilizationPercentage":80}` | This section is for setting up autoscaling more information can be found here: https://kubernetes.io/docs/concepts/workloads/autoscaling/ |
+| basicAuth.enabled | bool | `false` | If enabled: Basic username/password also need to be configured for dashboard access. |
+| basicAuth.password | string | `nil` | The password to set for auth |
+| basicAuth.username | string | `nil` | The username to set for auth |
+| config.appTitle | string | `"EDC Dashboard"` | Change the application title displayed in the header |
+| config.enableUserConfig | bool | `false` | If enabled, the user can add new connectors to the dashboard, that are stored in the local storage. |
+| config.healthCheckIntervalSeconds | int | `30` | Health check interval for the currently selected connector in the dashboard. |
+| config.initialTheme | string | `nil` | Set the initial theme (for available values, see theme switcher in top right) |
+| config.menuItems | list | `[{"divider":true,"materialSymbol":"home_app_logo","routerPath":"home","text":"Home"},{"materialSymbol":"book_ribbon","routerPath":"catalog","text":"Catalog","viewDescription":"In the catalog view you can browse datasets of other connectors. For each dataset you can run contract negotiations to consume the data afterwards. If the selected connector has a federated catalog, the available datasets of other participants will be displayed automatically. Otherwise, you can request the catalog of other connectors configured in the dashboard. At any time you can request the catalog of unknown connectors by requesting it manually."},{"materialSymbol":"deployed_code_update","routerPath":"assets","text":"Assets","viewDescription":"The asset view allows you to create, edit and delete the assets (datasets) in your connector. An asset represents any data that can be shared, for example static files, streaming data or API access. The dashboard only allows you to create assets with data types that your data plane(s) support."},{"materialSymbol":"policy","routerPath":"policies","text":"Policy Definitions","viewDescription":"The policy definitions view allows you to create, edit and delete policies. Policies are a generic way of defining a set of duties, rights, or obligations. EDC and DSP express policies with ODRL."},{"divider":true,"materialSymbol":"contract_edit","routerPath":"contract-definitions","text":"Contract Definitions","viewDescription":"The contract definitions view allows you to create, edit and delete contract definitions. Contract definitions link assets and policies by declaring which policies apply to a set of assets. Contract definitions contain two types of policies: an access policy (who can see or discover the data contract offer) and a contract policy (the actual terms and conditions of data use once a contract has been agreed upon)."},{"materialSymbol":"handshake","routerPath":"contracts","text":"Contracts","viewDescription":"The contract view allows you to browse all contract negotiations that have been finished with an agreement. You can switch between providing and consuming contracts of the selected connector. For consuming contracts a transfer process can be started to receive the asset."},{"materialSymbol":"schedule_send","routerPath":"transfer-history","text":"Transfer History","viewDescription":"The transfer history view lets you browse and deprovision finished and ongoing transfer processes. You can switch between providing and consuming transfer processes of the selected connector."}]` | Configure the menu of the dashboard. 'routerPath' must match the path configured for this view in the angular router. 'divider' adds a dividing line below the menu item. Menu items with 'viewDescription' will appear in the home view with this description. Available material symbols can be found here: https://marella.github.io/material-symbols/demo/#rounded |
+| fullnameOverride | string | `""` | |
+| image | object | `{"pullPolicy":"IfNotPresent","repository":"ghcr.io/eclipse-edc/data-dashboard","tag":"0.3.1"}` | This sets the container image more information can be found here: https://kubernetes.io/docs/concepts/containers/images/ |
+| imagePullSecrets | string | `nil` | This is for setting pull secrets if private images are used. |
+| ingress | object | `{"annotations":{},"className":"","enabled":false,"hosts":[{"host":"chart-example.local","paths":[{"path":"/","pathType":"Prefix"}]}],"tls":[]}` | This block is for setting up the ingress for more information can be found here: https://kubernetes.io/docs/concepts/services-networking/ingress/ |
+| ingress.enabled | bool | `false` | If enabled, an ingress resource is created. |
+| ingress.hosts[0].paths | list | `[{"path":"/","pathType":"Prefix"}]` | The value of the first path is used to determine the base path of the dashboard. |
+| livenessProbe | object | `{}` | This is to setup a liveness probe. More information can be found here: https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/ |
+| nameOverride | string | `""` | This is to override the chart name. |
+| nodeSelector | object | `{}` | |
+| podAnnotations | object | `{}` | This is for setting Kubernetes Annotations to a Pod. For more information checkout: https://kubernetes.io/docs/concepts/overview/working-with-objects/annotations/ |
+| podLabels | object | `{}` | This is for setting Kubernetes Labels to a Pod. For more information checkout: https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/ |
+| podSecurityContext | object | `{}` | |
+| readinessProbe | object | `{}` | This is to setup a readiness probe. More information can be found here: https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/ |
+| replicaCount | int | `1` | This will set the replicaset count more information can be found here: https://kubernetes.io/docs/concepts/workloads/controllers/replicaset/ |
+| resources | object | `{"limits":{"cpu":"150m","ephemeral-storage":"10Mi","memory":"100Mi"},"requests":{"cpu":null,"ephemeral-storage":"10Mi","memory":null}}` | Default resource requests and limits |
+| securityContext | object | `{}` | |
+| service | object | `{"port":8080,"type":"ClusterIP"}` | This is for setting up a service more information can be found here: https://kubernetes.io/docs/concepts/services-networking/service/ |
+| service.port | int | `8080` | This sets the ports more information can be found here: https://kubernetes.io/docs/concepts/services-networking/service/#field-spec-ports |
+| service.type | string | `"ClusterIP"` | This sets the service type more information can be found here: https://kubernetes.io/docs/concepts/services-networking/service/#publishing-services-service-types |
+| tolerations | list | `[]` | |
+| volumeMounts | list | `[]` | Additional volumeMounts on the output Deployment definition. Should be used to mount the connector configuration at '/app/config/edc-connector-config.json'. |
+| volumes | list | `[]` | Additional volumes on the output Deployment definition. Should be used for pre-configuring connectors in the dashboard. |
+
+----------------------------------------------
+Autogenerated from chart metadata using [helm-docs v1.14.2](https://github.com/norwoodj/helm-docs/releases/v1.14.2)
diff --git a/helm/README.md.gotmpl b/helm/README.md.gotmpl
new file mode 100644
index 000000000..89d9728ee
--- /dev/null
+++ b/helm/README.md.gotmpl
@@ -0,0 +1,34 @@
+{{ template "chart.header" . }}
+{{ template "chart.description" . }}
+
+{{ template "chart.versionBadge" . }}{{ template "chart.typeBadge" . }}{{ template "chart.appVersionBadge" . }}
+
+{{ template "chart.requirementsSection" . }}
+
+## Installing the Chart
+
+To install the chart with the release name 'my-release':
+
+```console
+$ helm install my-release oci://ghcr.io/eclipse-edc/charts/{{ template "chart.name" . }} --version {{ template "chart.version" . }}
+```
+
+{{/*
+## Changelog
+This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
+
+
+ Show changelog
+
+---
+
+{{ .Files.Get "CHANGELOG.md" }}
+
+---
+
+
+*/}}
+
+{{ template "chart.valuesSection" . }}
+
+{{ template "helm-docs.versionFooter" . }}
diff --git a/helm/templates/NOTES.txt b/helm/templates/NOTES.txt
new file mode 100644
index 000000000..c6d1439d9
--- /dev/null
+++ b/helm/templates/NOTES.txt
@@ -0,0 +1,22 @@
+1. Reach your application here:
+{{- if .Values.ingress.enabled }}
+{{- range $host := .Values.ingress.hosts }}
+ {{- range .paths }}
+ http{{ if $.Values.ingress.tls }}s{{ end }}://{{ $host.host }}{{ .path }}
+ {{- end }}
+{{- end }}
+{{- else if contains "NodePort" .Values.service.type }}
+ export NODE_PORT=$(kubectl get --namespace {{ .Release.Namespace }} -o jsonpath="{.spec.ports[0].nodePort}" services {{ include "data-dashboard.fullname" . }})
+ export NODE_IP=$(kubectl get nodes --namespace {{ .Release.Namespace }} -o jsonpath="{.items[0].status.addresses[0].address}")
+ echo http://$NODE_IP:$NODE_PORT
+{{- else if contains "LoadBalancer" .Values.service.type }}
+ NOTE: It may take a few minutes for the LoadBalancer IP to be available.
+ You can watch its status by running 'kubectl get --namespace {{ .Release.Namespace }} svc -w {{ include "data-dashboard.fullname" . }}'
+ export SERVICE_IP=$(kubectl get svc --namespace {{ .Release.Namespace }} {{ include "data-dashboard.fullname" . }} --template "{{"{{ range (index .status.loadBalancer.ingress 0) }}{{.}}{{ end }}"}}")
+ echo http://$SERVICE_IP:{{ .Values.service.port }}
+{{- else if contains "ClusterIP" .Values.service.type }}
+ export POD_NAME=$(kubectl get pods --namespace {{ .Release.Namespace }} -l "app.kubernetes.io/name={{ include "data-dashboard.name" . }},app.kubernetes.io/instance={{ .Release.Name }}" -o jsonpath="{.items[0].metadata.name}")
+ export CONTAINER_PORT=$(kubectl get pod --namespace {{ .Release.Namespace }} $POD_NAME -o jsonpath="{.spec.containers[0].ports[0].containerPort}")
+ echo "Visit http://127.0.0.1:8080 to use your application"
+ kubectl --namespace {{ .Release.Namespace }} port-forward $POD_NAME 8080:$CONTAINER_PORT
+{{- end }}
diff --git a/helm/templates/_helpers.tpl b/helm/templates/_helpers.tpl
new file mode 100644
index 000000000..d0fbfa9f3
--- /dev/null
+++ b/helm/templates/_helpers.tpl
@@ -0,0 +1,62 @@
+{{/*
+Expand the name of the chart.
+*/}}
+{{- define "data-dashboard.name" -}}
+{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" }}
+{{- end }}
+
+{{/*
+Create a default fully qualified app name.
+We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec).
+If release name contains chart name it will be used as a full name.
+*/}}
+{{- define "data-dashboard.fullname" -}}
+{{- if .Values.fullnameOverride }}
+{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" }}
+{{- else }}
+{{- $name := default .Chart.Name .Values.nameOverride }}
+{{- if contains $name .Release.Name }}
+{{- .Release.Name | trunc 63 | trimSuffix "-" }}
+{{- else }}
+{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" }}
+{{- end }}
+{{- end }}
+{{- end }}
+
+{{/*
+Create chart name and version as used by the chart label.
+*/}}
+{{- define "data-dashboard.chart" -}}
+{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" }}
+{{- end }}
+
+{{/*
+Common labels
+*/}}
+{{- define "data-dashboard.labels" -}}
+helm.sh/chart: {{ include "data-dashboard.chart" . }}
+{{ include "data-dashboard.selectorLabels" . }}
+{{- if .Chart.AppVersion }}
+app.kubernetes.io/version: {{ .Chart.AppVersion | quote }}
+{{- end }}
+app.kubernetes.io/managed-by: {{ .Release.Service }}
+{{- end }}
+
+{{/*
+Selector labels
+*/}}
+{{- define "data-dashboard.selectorLabels" -}}
+app.kubernetes.io/name: {{ include "data-dashboard.name" . }}
+app.kubernetes.io/instance: {{ .Release.Name }}
+{{- end }}
+
+{{/*
+Create the name of the service account to use
+*/}}
+{{- define "data-dashboard.serviceAccountName" -}}
+{{- if .Values.serviceAccount.create }}
+{{- default (include "data-dashboard.fullname" .) .Values.serviceAccount.name }}
+{{- else }}
+{{- default "default" .Values.serviceAccount.name }}
+{{- end }}
+{{- end }}
diff --git a/helm/templates/configmap.yaml b/helm/templates/configmap.yaml
new file mode 100644
index 000000000..9f0d5e1b5
--- /dev/null
+++ b/helm/templates/configmap.yaml
@@ -0,0 +1,43 @@
+---
+apiVersion: v1
+kind: ConfigMap
+metadata:
+ name: {{ include "data-dashboard.fullname" . }}-app-config
+ labels:
+ {{- include "data-dashboard.labels" . | nindent 4 }}
+data:
+ app-config.json: |-
+ {{- .Values.config | toJson | nindent 4 }}
+{{- if .Values.ingress.enabled }}
+{{- with (first (first .Values.ingress.hosts).paths).path }}
+ nginx.conf: |-
+ server {
+ listen 8080;
+ port_in_redirect off;
+ root /app;
+ location {{ . | trimSuffix "/" }}/config {
+ alias /app/config/;
+ try_files $uri$args $uri$args/ =404;
+ {{- if $.Values.basicAuth.enabled }}
+ auth_basic "Dashboard Config";
+ auth_basic_user_file /etc/nginx/.htpasswd;
+ {{- end }}
+ }
+ location {{ . }} {
+ alias /app/;
+ index index.html;
+ try_files $uri$args $uri$args/ /index.html;
+ {{- if $.Values.basicAuth.enabled }}
+ auth_basic "Dashboard";
+ auth_basic_user_file /etc/nginx/.htpasswd;
+ {{- end }}
+ }
+ }
+ APP_BASE_HREF.txt: |-
+ {{ . }}
+{{- end }}
+{{- end }}
+{{- if .Values.basicAuth.enabled }}
+ .htpasswd: |-
+ {{ htpasswd (required "Missing 'basicAuth.username'" .Values.basicAuth.username) (required "Missing 'basicAuth.password'" .Values.basicAuth.password) }}
+{{- end }}
diff --git a/helm/templates/deployment.yaml b/helm/templates/deployment.yaml
new file mode 100644
index 000000000..49e6264b8
--- /dev/null
+++ b/helm/templates/deployment.yaml
@@ -0,0 +1,101 @@
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+ name: {{ include "data-dashboard.fullname" . }}
+ labels:
+ {{- include "data-dashboard.labels" . | nindent 4 }}
+spec:
+ {{- if not .Values.autoscaling.enabled }}
+ replicas: {{ .Values.replicaCount }}
+ {{- end }}
+ selector:
+ matchLabels:
+ {{- include "data-dashboard.selectorLabels" . | nindent 6 }}
+ template:
+ metadata:
+ {{- with .Values.podAnnotations }}
+ annotations:
+ {{- toYaml . | nindent 8 }}
+ {{- end }}
+ labels:
+ {{- include "data-dashboard.labels" . | nindent 8 }}
+ {{- with .Values.podLabels }}
+ {{- toYaml . | nindent 8 }}
+ {{- end }}
+ spec:
+ {{- with $.Values.imagePullSecrets }}
+ imagePullSecrets:
+ {{- toYaml . | nindent 8 }}
+ {{- end }}
+ automountServiceAccountToken: false
+ {{- with .Values.podSecurityContext }}
+ securityContext:
+ {{- toYaml . | nindent 8 }}
+ {{- end }}
+ containers:
+ - name: {{ .Chart.Name }}
+ {{- with .Values.securityContext }}
+ securityContext:
+ {{- toYaml . | nindent 12 }}
+ {{- end }}
+ image: "{{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }}"
+ imagePullPolicy: {{ .Values.image.pullPolicy }}
+ ports:
+ - name: http
+ containerPort: {{ .Values.service.port }}
+ protocol: TCP
+ {{- with .Values.livenessProbe }}
+ livenessProbe:
+ {{- toYaml . | nindent 12 }}
+ {{- end }}
+ {{- with .Values.readinessProbe }}
+ readinessProbe:
+ {{- toYaml . | nindent 12 }}
+ {{- end }}
+ {{- with .Values.resources }}
+ resources:
+ {{- toYaml . | nindent 12 }}
+ {{- end }}
+ volumeMounts:
+ - name: {{ include "data-dashboard.fullname" . }}-app-config
+ mountPath: "/app/config/app-config.json"
+ subPath: "app-config.json"
+ readOnly: true
+ {{- if .Values.ingress.enabled }}
+ - name: {{ include "data-dashboard.fullname" . }}-app-config
+ mountPath: "/app/config/APP_BASE_HREF.txt"
+ subPath: "APP_BASE_HREF.txt"
+ readOnly: true
+ - name: {{ include "data-dashboard.fullname" . }}-app-config
+ mountPath: "/etc/nginx/conf.d/default.conf"
+ subPath: "nginx.conf"
+ readOnly: true
+ {{- end }}
+ {{- if .Values.basicAuth.enabled }}
+ - name: {{ include "data-dashboard.fullname" . }}-app-config
+ mountPath: "/etc/nginx/.htpasswd"
+ subPath: ".htpasswd"
+ readOnly: true
+ {{- end }}
+ {{- with .Values.volumeMounts }}
+ {{- toYaml . | nindent 12 }}
+ {{- end }}
+ volumes:
+ - name: {{ include "data-dashboard.fullname" . }}-app-config
+ configMap:
+ name: {{ include "data-dashboard.fullname" . }}-app-config
+ {{- with .Values.volumes }}
+ {{- toYaml . | nindent 8 }}
+ {{- end }}
+ {{- with .Values.nodeSelector }}
+ nodeSelector:
+ {{- toYaml . | nindent 8 }}
+ {{- end }}
+ {{- with .Values.affinity }}
+ affinity:
+ {{- toYaml . | nindent 8 }}
+ {{- end }}
+ {{- with .Values.tolerations }}
+ tolerations:
+ {{- toYaml . | nindent 8 }}
+ {{- end }}
diff --git a/helm/templates/hpa.yaml b/helm/templates/hpa.yaml
new file mode 100644
index 000000000..0c7e3b52e
--- /dev/null
+++ b/helm/templates/hpa.yaml
@@ -0,0 +1,32 @@
+{{- if .Values.autoscaling.enabled }}
+apiVersion: autoscaling/v2
+kind: HorizontalPodAutoscaler
+metadata:
+ name: {{ include "data-dashboard.fullname" . }}
+ labels:
+ {{- include "data-dashboard.labels" . | nindent 4 }}
+spec:
+ scaleTargetRef:
+ apiVersion: apps/v1
+ kind: Deployment
+ name: {{ include "data-dashboard.fullname" . }}
+ minReplicas: {{ .Values.autoscaling.minReplicas }}
+ maxReplicas: {{ .Values.autoscaling.maxReplicas }}
+ metrics:
+ {{- if .Values.autoscaling.targetCPUUtilizationPercentage }}
+ - type: Resource
+ resource:
+ name: cpu
+ target:
+ type: Utilization
+ averageUtilization: {{ .Values.autoscaling.targetCPUUtilizationPercentage }}
+ {{- end }}
+ {{- if .Values.autoscaling.targetMemoryUtilizationPercentage }}
+ - type: Resource
+ resource:
+ name: memory
+ target:
+ type: Utilization
+ averageUtilization: {{ .Values.autoscaling.targetMemoryUtilizationPercentage }}
+ {{- end }}
+{{- end }}
diff --git a/helm/templates/ingress.yaml b/helm/templates/ingress.yaml
new file mode 100644
index 000000000..718ebd9a4
--- /dev/null
+++ b/helm/templates/ingress.yaml
@@ -0,0 +1,43 @@
+{{- if .Values.ingress.enabled -}}
+apiVersion: networking.k8s.io/v1
+kind: Ingress
+metadata:
+ name: {{ include "data-dashboard.fullname" . }}
+ labels:
+ {{- include "data-dashboard.labels" . | nindent 4 }}
+ {{- with .Values.ingress.annotations }}
+ annotations:
+ {{- toYaml . | nindent 4 }}
+ {{- end }}
+spec:
+ {{- with .Values.ingress.className }}
+ ingressClassName: {{ . }}
+ {{- end }}
+ {{- if .Values.ingress.tls }}
+ tls:
+ {{- range .Values.ingress.tls }}
+ - hosts:
+ {{- range .hosts }}
+ - {{ . | quote }}
+ {{- end }}
+ secretName: {{ .secretName }}
+ {{- end }}
+ {{- end }}
+ rules:
+ {{- range .Values.ingress.hosts }}
+ - host: {{ .host | quote }}
+ http:
+ paths:
+ {{- range .paths }}
+ - path: {{ .path }}
+ {{- with .pathType }}
+ pathType: {{ . }}
+ {{- end }}
+ backend:
+ service:
+ name: {{ include "data-dashboard.fullname" $ }}
+ port:
+ number: {{ $.Values.service.port }}
+ {{- end }}
+ {{- end }}
+{{- end }}
diff --git a/helm/templates/secret.yaml b/helm/templates/secret.yaml
new file mode 100644
index 000000000..6a71e83d1
--- /dev/null
+++ b/helm/templates/secret.yaml
@@ -0,0 +1,10 @@
+{{- if .Values.imagePullSecret }}
+---
+apiVersion: v1
+kind: Secret
+metadata:
+ name: {{ .Values.imagePullSecret.name }}
+type: kubernetes.io/dockerconfigjson
+data:
+ .dockerconfigjson: {{ .Values.imagePullSecret.dockerConfigJson }}
+{{- end }}
diff --git a/helm/templates/service.yaml b/helm/templates/service.yaml
new file mode 100644
index 000000000..5d8472e9a
--- /dev/null
+++ b/helm/templates/service.yaml
@@ -0,0 +1,15 @@
+apiVersion: v1
+kind: Service
+metadata:
+ name: {{ include "data-dashboard.fullname" . }}
+ labels:
+ {{- include "data-dashboard.labels" . | nindent 4 }}
+spec:
+ type: {{ .Values.service.type }}
+ ports:
+ - port: {{ .Values.service.port }}
+ targetPort: http
+ protocol: TCP
+ name: http
+ selector:
+ {{- include "data-dashboard.selectorLabels" . | nindent 4 }}
diff --git a/helm/values.yaml b/helm/values.yaml
new file mode 100644
index 000000000..492889277
--- /dev/null
+++ b/helm/values.yaml
@@ -0,0 +1,159 @@
+# Default values for data-dashboard.
+# This is a YAML-formatted file.
+# Declare variables to be passed into your templates.
+
+# -- This will set the replicaset count more information can be found here: https://kubernetes.io/docs/concepts/workloads/controllers/replicaset/
+replicaCount: 1
+
+# -- This sets the container image more information can be found here: https://kubernetes.io/docs/concepts/containers/images/
+image:
+ repository: ghcr.io/eclipse-edc/data-dashboard
+ tag: 0.3.1
+ pullPolicy: IfNotPresent
+
+# -- This is for setting pull secrets if private images are used.
+imagePullSecrets:
+
+# -- This is to override the chart name.
+nameOverride: ""
+fullnameOverride: ""
+
+# -- This is for setting Kubernetes Annotations to a Pod.
+# For more information checkout: https://kubernetes.io/docs/concepts/overview/working-with-objects/annotations/
+podAnnotations: {}
+# -- This is for setting Kubernetes Labels to a Pod.
+# For more information checkout: https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/
+podLabels: {}
+
+podSecurityContext: {}
+ # fsGroup: 2000
+
+securityContext: {}
+ # capabilities:
+ # drop:
+ # - ALL
+ # readOnlyRootFilesystem: true
+ # runAsNonRoot: true
+ # runAsUser: 1000
+
+# -- This is for setting up a service more information can be found here: https://kubernetes.io/docs/concepts/services-networking/service/
+service:
+ # -- This sets the service type more information can be found here: https://kubernetes.io/docs/concepts/services-networking/service/#publishing-services-service-types
+ type: ClusterIP
+ # -- This sets the ports more information can be found here: https://kubernetes.io/docs/concepts/services-networking/service/#field-spec-ports
+ port: 8080
+
+# -- This block is for setting up the ingress for more information can be found here: https://kubernetes.io/docs/concepts/services-networking/ingress/
+ingress:
+ # -- If enabled, an ingress resource is created.
+ enabled: false
+ className: ""
+ annotations: {}
+ # kubernetes.io/ingress.class: nginx
+ # kubernetes.io/tls-acme: "true"
+ hosts:
+ - host: chart-example.local
+ # -- The value of the first path is used to determine the base path of the dashboard.
+ paths:
+ - path: /
+ pathType: Prefix
+ tls: []
+ # - secretName: chart-example-tls
+ # hosts:
+ # - chart-example.local
+
+basicAuth:
+ # -- If enabled: Basic username/password also need to be configured for dashboard access.
+ enabled: false
+ # -- (string) The username to set for auth
+ username:
+ # -- (string) The password to set for auth
+ password:
+
+config:
+ # -- (string) Change the application title displayed in the header
+ appTitle: EDC Dashboard
+ # -- If enabled, the user can add new connectors to the dashboard, that are stored in the local storage.
+ enableUserConfig: false
+ # -- Health check interval for the currently selected connector in the dashboard.
+ healthCheckIntervalSeconds: 30
+ # -- Set the initial theme (for available values, see theme switcher in top right)
+ initialTheme:
+ # -- Configure the menu of the dashboard.
+ # 'routerPath' must match the path configured for this view in the angular router.
+ # 'divider' adds a dividing line below the menu item.
+ # Menu items with 'viewDescription' will appear in the home view with this description.
+ # Available material symbols can be found here: https://marella.github.io/material-symbols/demo/#rounded
+ menuItems:
+ - text: Home
+ materialSymbol: home_app_logo
+ routerPath: home
+ divider: true
+ - text: Catalog
+ materialSymbol: book_ribbon
+ routerPath: catalog
+ viewDescription: "In the catalog view you can browse datasets of other connectors. For each dataset you can run contract negotiations to consume the data afterwards. If the selected connector has a federated catalog, the available datasets of other participants will be displayed automatically. Otherwise, you can request the catalog of other connectors configured in the dashboard. At any time you can request the catalog of unknown connectors by requesting it manually."
+ - text: Assets
+ materialSymbol: deployed_code_update
+ routerPath: assets
+ viewDescription: "The asset view allows you to create, edit and delete the assets (datasets) in your connector. An asset represents any data that can be shared, for example static files, streaming data or API access. The dashboard only allows you to create assets with data types that your data plane(s) support."
+ - text: Policy Definitions
+ materialSymbol: policy
+ routerPath: policies
+ viewDescription: "The policy definitions view allows you to create, edit and delete policies. Policies are a generic way of defining a set of duties, rights, or obligations. EDC and DSP express policies with ODRL."
+ - text: Contract Definitions
+ materialSymbol: contract_edit
+ routerPath: contract-definitions
+ divider: true
+ viewDescription: "The contract definitions view allows you to create, edit and delete contract definitions. Contract definitions link assets and policies by declaring which policies apply to a set of assets. Contract definitions contain two types of policies: an access policy (who can see or discover the data contract offer) and a contract policy (the actual terms and conditions of data use once a contract has been agreed upon)."
+ - text: Contracts
+ materialSymbol: handshake
+ routerPath: contracts
+ viewDescription: "The contract view allows you to browse all contract negotiations that have been finished with an agreement. You can switch between providing and consuming contracts of the selected connector. For consuming contracts a transfer process can be started to receive the asset."
+ - text: Transfer History
+ materialSymbol: schedule_send
+ routerPath: transfer-history
+ viewDescription: "The transfer history view lets you browse and deprovision finished and ongoing transfer processes. You can switch between providing and consuming transfer processes of the selected connector."
+
+# -- Default resource requests and limits
+resources:
+ limits:
+ cpu: 150m
+ memory: 100Mi
+ ephemeral-storage: 10Mi
+ requests:
+ cpu:
+ memory:
+ ephemeral-storage: 10Mi
+
+# -- This is to setup a liveness probe. More information can be found here: https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/
+livenessProbe: {}
+# -- This is to setup a readiness probe. More information can be found here: https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/
+readinessProbe: {}
+
+# -- This section is for setting up autoscaling more information can be found here: https://kubernetes.io/docs/concepts/workloads/autoscaling/
+autoscaling:
+ enabled: false
+ minReplicas: 1
+ maxReplicas: 10
+ targetCPUUtilizationPercentage: 80
+ # targetMemoryUtilizationPercentage: 80
+
+# -- Additional volumes on the output Deployment definition. Should be used for pre-configuring connectors in the dashboard.
+volumes: []
+# - name: foo
+# secret:
+# secretName: mysecret
+# optional: false
+
+# -- Additional volumeMounts on the output Deployment definition. Should be used to mount the connector configuration at '/app/config/edc-connector-config.json'.
+volumeMounts: []
+# - name: foo
+# mountPath: "/etc/foo"
+# readOnly: true
+
+nodeSelector: {}
+
+tolerations: []
+
+affinity: {}