From 0075b038f59f46bbfb65cd2263d183b7e82e74d5 Mon Sep 17 00:00:00 2001
From: Jacob Kershaw <jacob.kershaw@sigmadefense.com>
Date: Tue, 16 Jul 2024 16:31:24 +0000
Subject: [PATCH] Resolve "Add ESO Charts to BB main repo"

---
 .../external-secrets/git-credentials.yaml     |  7 ++
 .../external-secrets/gitrepository.yaml       | 24 ++++++
 .../external-secrets/helmrelease.yaml         | 73 +++++++++++++++++++
 .../external-secrets/imagepullsecret.yaml     | 12 +++
 .../templates/external-secrets/namespace.yaml | 13 ++++
 chart/templates/external-secrets/values.yaml  | 26 +++++++
 chart/templates/kyverno-policies/values.yaml  |  7 ++
 chart/values.yaml                             | 27 +++++++
 tests/package-mapping.yaml                    |  4 +
 tests/test-values.yaml                        |  9 +++
 10 files changed, 202 insertions(+)
 create mode 100644 chart/templates/external-secrets/git-credentials.yaml
 create mode 100644 chart/templates/external-secrets/gitrepository.yaml
 create mode 100644 chart/templates/external-secrets/helmrelease.yaml
 create mode 100644 chart/templates/external-secrets/imagepullsecret.yaml
 create mode 100644 chart/templates/external-secrets/namespace.yaml
 create mode 100644 chart/templates/external-secrets/values.yaml

diff --git a/chart/templates/external-secrets/git-credentials.yaml b/chart/templates/external-secrets/git-credentials.yaml
new file mode 100644
index 0000000000..1d97643d65
--- /dev/null
+++ b/chart/templates/external-secrets/git-credentials.yaml
@@ -0,0 +1,7 @@
+{{- $gitCredsSecretDict := dict
+  "name" "externalSecrets"
+  "targetScope" .Values.addons.externalSecrets
+  "releaseName" .Release.Name
+  "releaseNamespace" .Release.Namespace
+}}
+{{- include "gitCredsSecret" $gitCredsSecretDict | nindent 0 -}}
diff --git a/chart/templates/external-secrets/gitrepository.yaml b/chart/templates/external-secrets/gitrepository.yaml
new file mode 100644
index 0000000000..82014b9d85
--- /dev/null
+++ b/chart/templates/external-secrets/gitrepository.yaml
@@ -0,0 +1,24 @@
+{{- if and (eq .Values.addons.externalSecrets.sourceType "git") .Values.addons.externalSecrets.enabled  }}
+{{- $gitCredsDict := dict
+  "name" "externalSecrets"
+  "packageGitScope" .Values.addons.externalSecrets.git
+  "rootScope" .
+  "releaseName" .Release.Name
+}}
+apiVersion: source.toolkit.fluxcd.io/v1
+kind: GitRepository
+metadata:
+  name: external-secrets
+  namespace: {{ .Release.Namespace }}
+  labels:
+    app.kubernetes.io/name: external-secrets
+    app.kubernetes.io/component: "core"
+    {{- include "commonLabels" . | nindent 4}}
+spec:
+  interval: {{ .Values.flux.interval }}
+  url: {{ .Values.addons.externalSecrets.git.repo }}
+  ref:
+    {{- include "validRef" .Values.addons.externalSecrets.git | nindent 4 }}
+  {{ include "gitIgnore" . }}
+  {{- include "gitCredsExtended" $gitCredsDict | nindent 2 }}
+{{- end }}
diff --git a/chart/templates/external-secrets/helmrelease.yaml b/chart/templates/external-secrets/helmrelease.yaml
new file mode 100644
index 0000000000..1ff84d188e
--- /dev/null
+++ b/chart/templates/external-secrets/helmrelease.yaml
@@ -0,0 +1,73 @@
+{{- $fluxSettings := merge .Values.addons.externalSecrets.flux .Values.flux -}}
+{{- if .Values.addons.externalSecrets.enabled }}
+apiVersion: helm.toolkit.fluxcd.io/v2
+kind: HelmRelease
+metadata:
+  name: external-secrets
+  namespace: {{ .Release.Namespace }}
+  labels:
+    app.kubernetes.io/name: external-secrets
+    app.kubernetes.io/component: "core"
+    {{- include "commonLabels" . | nindent 4}}
+  annotations:
+    checksum/bigbang-values: {{ include (print $.Template.BasePath "/external-secrets/values.yaml") . | sha256sum }}
+spec:
+  targetNamespace: external-secrets
+  chart:
+    spec:
+      {{- if eq .Values.addons.externalSecrets.sourceType "git" }}
+      chart: {{ .Values.addons.externalSecrets.git.path }}
+      sourceRef:
+        kind: GitRepository
+        name: external-secrets
+        namespace: {{ .Release.Namespace }}
+      {{- else }}
+      chart: {{ .Values.addons.externalSecrets.helmRepo.chartName }}
+      version: {{ .Values.addons.externalSecrets.helmRepo.tag }}
+      sourceRef:
+        kind: HelmRepository
+        name: {{ .Values.addons.externalSecrets.helmRepo.repoName }}
+        namespace: {{ .Release.Namespace }}
+      {{- $repoType := include "getRepoType" (dict "repoName" .Values.addons.externalSecrets.helmRepo.repoName "allRepos" .Values.helmRepositories) -}}
+      {{- if (and .Values.addons.externalSecrets.helmRepo.cosignVerify (eq $repoType "oci")) }} # Needs to be an OCI repo
+      verify:
+        provider: cosign
+        secretRef:
+          name: {{ printf "%s-cosign-pub" .Values.addons.externalSecrets.helmRepo.repoName }}
+      {{- end }}
+      {{- end }}
+      interval: 5m
+
+  {{- toYaml $fluxSettings | nindent 2 }}
+
+  {{- if .Values.addons.externalSecrets.postRenderers }}
+  postRenderers:
+  {{- toYaml .Values.addons.externalSecrets.postRenderers | nindent 2 }}
+  {{- end }}
+  valuesFrom:
+    - name: {{ .Release.Name }}-external-secrets-values
+      kind: Secret
+      valuesKey: "common"
+    - name: {{ .Release.Name }}-external-secrets-values
+      kind: Secret
+      valuesKey: "defaults"
+    - name: {{ .Release.Name }}-external-secrets-values
+      kind: Secret
+      valuesKey: "overlays"
+
+  {{- if or .Values.istio.enabled .Values.kyvernoPolicies.enabled .Values.monitoring.enabled }}
+  dependsOn:
+  {{- if .Values.istio.enabled }}
+    - name: istio
+      namespace: {{ .Release.Namespace }}
+  {{- end }}
+  {{- if .Values.kyvernoPolicies.enabled }}
+    - name: kyverno-policies
+      namespace: {{ .Release.Namespace }}
+  {{- end }}
+  {{- if .Values.monitoring.enabled }}
+    - name: monitoring
+      namespace: {{ .Release.Namespace }}
+  {{- end }}
+  {{- end }}
+{{- end }}
\ No newline at end of file
diff --git a/chart/templates/external-secrets/imagepullsecret.yaml b/chart/templates/external-secrets/imagepullsecret.yaml
new file mode 100644
index 0000000000..8c01b2b78d
--- /dev/null
+++ b/chart/templates/external-secrets/imagepullsecret.yaml
@@ -0,0 +1,12 @@
+{{- if .Values.addons.externalSecrets.enabled }}
+{{- if ( include "imagePullSecret" . ) }}
+apiVersion: v1
+kind: Secret
+metadata:
+  name: private-registry
+  namespace: external-secrets
+type: kubernetes.io/dockerconfigjson
+data:
+  .dockerconfigjson: {{ template "imagePullSecret" . }}
+{{- end }}
+{{- end }}
diff --git a/chart/templates/external-secrets/namespace.yaml b/chart/templates/external-secrets/namespace.yaml
new file mode 100644
index 0000000000..8a997f657b
--- /dev/null
+++ b/chart/templates/external-secrets/namespace.yaml
@@ -0,0 +1,13 @@
+{{- if .Values.addons.externalSecrets.enabled }}
+apiVersion: v1
+kind: Namespace
+metadata:
+  labels:
+    meta.helm.sh/release-namespace: bigbang
+    meta.helm.sh/release-name: bigbang
+    app.kubernetes.io/name: external-secrets
+    app.kubernetes.io/component: "core"
+    {{- include "commonLabels" . | nindent 4}}
+    istio-injection: enabled
+  name: external-secrets
+{{- end }}
diff --git a/chart/templates/external-secrets/values.yaml b/chart/templates/external-secrets/values.yaml
new file mode 100644
index 0000000000..3c979f079d
--- /dev/null
+++ b/chart/templates/external-secrets/values.yaml
@@ -0,0 +1,26 @@
+{{- if .Values.addons.externalSecrets.enabled }}
+{{- include "values-secret" (dict "root" $ "package" .Values.addons.externalSecrets "name" "external-secrets" "defaults" (include "bigbang.defaults.external-secrets" .)) }}
+{{- end }}
+
+{{- define "bigbang.defaults.external-secrets" -}}
+
+image:
+  imagePullPolicy: {{ .Values.imagePullPolicy }}
+
+monitoring:
+  enabled: {{ .Values.monitoring.enabled }}
+
+networkPolicies:
+  enabled: {{ .Values.networkPolicies.enabled }}
+  controlPlaneCidr: {{ .Values.networkPolicies.controlPlaneCidr }}
+
+{{- if .Values.istio.enabled }}
+annotations:
+  {{ include "istioAnnotation" . }}
+{{- end }}
+
+istio:
+  enabled: {{ .Values.istio.enabled }}
+
+openshift: {{ .Values.openshift }}
+{{- end -}}
diff --git a/chart/templates/kyverno-policies/values.yaml b/chart/templates/kyverno-policies/values.yaml
index ad1b805b9d..fc0c17ab57 100644
--- a/chart/templates/kyverno-policies/values.yaml
+++ b/chart/templates/kyverno-policies/values.yaml
@@ -144,6 +144,13 @@ policies:
           - source-controller*
           - kustomize-controller*
       {{- end }}
+      {{- if .Values.addons.externalSecrets.enabled }}
+      - resources:
+          namespaces:
+          - external-secrets 
+          names:
+          - external-secrets*
+      {{- end }}
 
   {{- if or .Values.fluentbit.enabled .Values.monitoring.enabled .Values.twistlock.enabled }}
   disallow-tolerations:
diff --git a/chart/values.yaml b/chart/values.yaml
index 6c3231e88a..71d0b5a947 100644
--- a/chart/values.yaml
+++ b/chart/values.yaml
@@ -2076,6 +2076,33 @@ addons:
 
     postRenderers: []
 
+  externalSecrets:
+    # -- Toggle deployment of external secrets
+    enabled: false
+
+    # -- Choose source type of "git" or "helmRepo"
+    sourceType: "git"
+
+    git:
+      repo: https://repo1.dso.mil/big-bang/product/packages/external-secrets.git
+      tag: "0.9.18-bb.7"
+      path: "./chart"
+    helmRepo:
+      repoName: "registry1"
+      chartName: "external-secrets"
+      tag: "0.9.18-bb.7"
+
+    # -- Override flux settings for this package
+    flux: {}
+
+    # -- Redirect the package ingress to a specific Istio Gateway (listed in `istio.gateways`).  The default is "public".
+    ingress:
+      gateway: ""
+
+    values: {}
+
+    postRenderers: []
+
 # -- Wrapper chart for integrating Big Bang components alongside a package
 wrapper:
   # -- Choose source type of "git" or "helmRepo"
diff --git a/tests/package-mapping.yaml b/tests/package-mapping.yaml
index 61f39b2923..b98854f260 100644
--- a/tests/package-mapping.yaml
+++ b/tests/package-mapping.yaml
@@ -87,3 +87,7 @@ metricsServer:
   repoName: "metrics-server"
   hrName: "metrics-server"
   filePath: "metrics-server"
+externalSecrets:
+  repoName: "external-secrets"
+  hrName: "external-secrets"
+  filePath: "external-secrets"
\ No newline at end of file
diff --git a/tests/test-values.yaml b/tests/test-values.yaml
index 824856bbb7..1ad1032515 100644
--- a/tests/test-values.yaml
+++ b/tests/test-values.yaml
@@ -2864,3 +2864,12 @@ addons:
                   name: https
               resolution: DNS
 
+  externalSecrets:
+    values:
+      istio:
+        hardened:
+          enabled: true
+      bbtests:
+        enabled: true
+        cypress:
+          artifacts: true
-- 
GitLab