From 48d1d80794680dc5b126ddc4d5604c1198718810 Mon Sep 17 00:00:00 2001 From: Jeff McCoy Date: Thu, 20 Jan 2022 17:42:40 -0600 Subject: [PATCH 01/88] Multi-distro support - add arm64/generic arch support - adds in-memory embedded registry to serve registry image from "seed" config spec - add local-distro image injection support - handles helm charts install/upgrade/rollback/uninstall via helm directly - manages raw manifests as zarf-generated helm charts for helm-native management - add tunnel capability to access zarf endpoints without ingress config - flattens image collection to single tarball - remove root / linux requirements for zarf deployments - add K8s distro-detection and distro-specific seed image behaviors - document local registry per https://github.com/kubernetes/enhancements/tree/master/keps/sig-cluster-lifecycle/generic/1755-communicating-a-local-registry - reorganize logging, remove logrus, replace with pterm, add progress cli feedback - add support for stacking helm values files - normalize log levels: info, warn, debug, trace - update go mod deps - move zarf state to a k8s secret in the zarf namespace - support zarf destroy for 3rd-party clusters - move crane image cache to sub folder under home - add support for multiple users with htpasswd - add path key for git-based helm charts - remove need for PKI prompts on default init - add storage class tracking in zarf state for multi-distro compatibility - reduce code for init/deploy to the same function call --- .gitignore | 4 +- .vscode/launch.json | 6 +- assets/charts/gitea-values.yaml | 39 + assets/charts/pgl-values.yaml | 41 + assets/charts/registry-values-seed.yaml | 2 + assets/charts/registry-values.yaml | 22 + assets/charts/traefik-values.yaml | 12 + assets/manifests/gitops/gitea.yaml | 74 -- assets/manifests/logging/pgl-stack.yaml | 68 -- assets/manifests/registry/configmap.yaml | 10 + assets/manifests/registry/registry.yaml | 49 -- assets/manifests/traefik/traefik.yaml | 36 - assets/misc/registries.yaml | 19 - assets/scripts/k3s.service | 2 +- cli/cmd/connect.go | 36 + cli/cmd/destroy.go | 39 +- cli/cmd/initialize.go | 165 +--- cli/cmd/package.go | 19 +- cli/cmd/pki.go | 30 +- cli/cmd/prepare.go | 14 +- cli/cmd/root.go | 66 +- cli/cmd/tools.go | 15 +- cli/config/config.go | 96 ++- cli/config/secret.go | 74 ++ cli/config/types.go | 79 +- cli/internal/git/checkout.go | 47 +- cli/internal/git/fetch.go | 33 +- cli/internal/git/pull.go | 36 +- cli/internal/git/push.go | 71 +- cli/internal/git/utils.go | 155 +--- cli/internal/helm/chart.go | 315 +++++++ cli/internal/helm/{charts.go => repo.go} | 58 +- cli/internal/helm/utils.go | 72 ++ cli/internal/images/common.go | 13 + cli/internal/images/copy.go | 13 + cli/internal/images/pull.go | 106 ++- cli/internal/images/push.go | 44 +- cli/internal/k8s/common.go | 142 ++- cli/internal/k8s/distro.go | 69 ++ cli/internal/k8s/namespace.go | 64 ++ cli/internal/k8s/nodes.go | 15 + cli/internal/k8s/pods.go | 39 +- cli/internal/k8s/sa.go | 15 + cli/internal/k8s/secrets.go | 161 +++- cli/internal/k8s/services.go | 14 + cli/internal/k8s/state.go | 88 ++ cli/internal/k8s/tunnel.go | 269 ++++++ cli/internal/message/message.go | 135 +++ cli/internal/message/spinner.go | 72 ++ cli/internal/message/tls/prompts.go | 137 +++ cli/internal/packager/common.go | 142 +-- cli/internal/packager/create.go | 104 ++- cli/internal/packager/deploy.go | 297 ++++--- cli/internal/packager/initialize.go | 48 -- cli/internal/packager/inspect.go | 12 +- cli/internal/packager/seed.go | 223 +++++ cli/internal/pki/pki.go | 41 +- cli/internal/template/template.go | 87 ++ cli/internal/utils/bytes.go | 46 + cli/internal/utils/image.go | 12 + cli/internal/utils/io.go | 77 +- cli/internal/utils/network.go | 87 +- cli/internal/utils/preflight.go | 35 +- cli/internal/utils/random.go | 5 +- cli/internal/utils/shasum.go | 10 +- cli/internal/utils/yaml.go | 12 +- cli/zarf.yaml | 11 + .../manifests/big-bang/manifests.yaml | 2 +- .../manifests/flux/regcred-secret.yaml | 28 +- .../template/bigbang/kustomization.yaml | 2 +- .../big-bang/template/bigbang/values.yaml | 24 +- examples/big-bang/zarf.yaml | 12 +- .../manifests/data-injection.yaml | 2 +- .../manifests/image-pull-secret.yaml | 27 - examples/data-injection/zarf.yaml | 5 +- examples/game/manifests/game.yaml | 5 +- .../game/manifests/image-pull-secret.yaml | 27 - examples/game/zarf.yaml | 6 +- examples/gitops-data/zarf.yaml | 2 +- .../manifests/000-namespaces.yaml | 9 - .../manifests/image-pull-secret.yaml | 61 -- .../manifests/minio-instance.yaml | 50 -- .../manifests/minio-operator.yaml | 24 - .../postgres-operator/manifests/pgadmin.yaml | 31 - .../manifests/postgres-operator-ui.yaml | 49 -- .../manifests/postgres-operator.yaml | 58 -- .../values/minio-instance.yaml | 41 + .../values/minio-operator.yaml | 14 + .../postgres-operator/values/pgadmin.yaml | 20 + .../values/postgres-operator-ui.yaml | 38 + .../values/postgres-operator.yaml | 46 + examples/postgres-operator/zarf.yaml | 26 +- .../manifests/image-pull-secret.yaml | 27 - .../manifests/twistlock.yaml | 37 - .../twistlock-values.yaml | 2 + examples/single-big-bang-package/zarf.yaml | 7 +- examples/software-factory/Makefile | 58 -- examples/software-factory/README.md | 72 -- .../software-factory/manifests/.gitignore | 1 - .../atlassian/atlassian-manifests.yaml | 117 --- .../manifests/bigbang/bigbang-manifests.yaml | 37 - .../manifests/flux/flux-manifests.yaml | 27 - .../manifests/jenkins/jenkins-manifests.yaml | 111 --- .../template/bigbang/kustomization.yaml | 21 - .../template/bigbang/values.yaml | 805 ------------------ .../template/flux/kustomization.yaml | 2 - examples/software-factory/zarf.yaml | 208 ----- .../tiny-kafka/charts/strimzi-values.yaml | 6 + .../manifests/image-pull-secret.yaml | 55 -- examples/tiny-kafka/manifests/kafka.yaml | 5 - examples/tiny-kafka/manifests/operator.yaml | 20 - examples/tiny-kafka/zarf.yaml | 11 +- go.mod | 55 +- go.sum | 312 ++++--- kind.yaml | 7 + zarf.schema.json | 72 +- zarf.yaml | 103 ++- 117 files changed, 3698 insertions(+), 3538 deletions(-) create mode 100644 assets/charts/gitea-values.yaml create mode 100644 assets/charts/pgl-values.yaml create mode 100644 assets/charts/registry-values-seed.yaml create mode 100644 assets/charts/registry-values.yaml create mode 100644 assets/charts/traefik-values.yaml delete mode 100644 assets/manifests/gitops/gitea.yaml delete mode 100644 assets/manifests/logging/pgl-stack.yaml create mode 100644 assets/manifests/registry/configmap.yaml delete mode 100644 assets/manifests/registry/registry.yaml delete mode 100644 assets/manifests/traefik/traefik.yaml delete mode 100644 assets/misc/registries.yaml create mode 100644 cli/cmd/connect.go create mode 100644 cli/config/secret.go create mode 100644 cli/internal/helm/chart.go rename cli/internal/helm/{charts.go => repo.go} (50%) create mode 100644 cli/internal/helm/utils.go create mode 100644 cli/internal/images/common.go create mode 100644 cli/internal/images/copy.go create mode 100644 cli/internal/k8s/distro.go create mode 100644 cli/internal/k8s/namespace.go create mode 100644 cli/internal/k8s/nodes.go create mode 100644 cli/internal/k8s/sa.go create mode 100644 cli/internal/k8s/services.go create mode 100644 cli/internal/k8s/state.go create mode 100644 cli/internal/k8s/tunnel.go create mode 100644 cli/internal/message/message.go create mode 100644 cli/internal/message/spinner.go create mode 100644 cli/internal/message/tls/prompts.go delete mode 100644 cli/internal/packager/initialize.go create mode 100644 cli/internal/packager/seed.go create mode 100644 cli/internal/template/template.go create mode 100644 cli/internal/utils/bytes.go create mode 100644 cli/internal/utils/image.go delete mode 100644 examples/data-injection/manifests/image-pull-secret.yaml delete mode 100644 examples/game/manifests/image-pull-secret.yaml delete mode 100644 examples/postgres-operator/manifests/000-namespaces.yaml delete mode 100644 examples/postgres-operator/manifests/image-pull-secret.yaml delete mode 100644 examples/postgres-operator/manifests/minio-operator.yaml create mode 100644 examples/postgres-operator/values/minio-instance.yaml create mode 100644 examples/postgres-operator/values/minio-operator.yaml create mode 100644 examples/postgres-operator/values/pgadmin.yaml create mode 100644 examples/postgres-operator/values/postgres-operator-ui.yaml create mode 100644 examples/postgres-operator/values/postgres-operator.yaml delete mode 100644 examples/single-big-bang-package/manifests/image-pull-secret.yaml delete mode 100644 examples/single-big-bang-package/manifests/twistlock.yaml create mode 100644 examples/single-big-bang-package/twistlock-values.yaml delete mode 100755 examples/software-factory/Makefile delete mode 100644 examples/software-factory/README.md delete mode 100644 examples/software-factory/manifests/.gitignore delete mode 100644 examples/software-factory/manifests/atlassian/atlassian-manifests.yaml delete mode 100644 examples/software-factory/manifests/bigbang/bigbang-manifests.yaml delete mode 100644 examples/software-factory/manifests/flux/flux-manifests.yaml delete mode 100644 examples/software-factory/manifests/jenkins/jenkins-manifests.yaml delete mode 100644 examples/software-factory/template/bigbang/kustomization.yaml delete mode 100644 examples/software-factory/template/bigbang/values.yaml delete mode 100644 examples/software-factory/template/flux/kustomization.yaml delete mode 100644 examples/software-factory/zarf.yaml create mode 100644 examples/tiny-kafka/charts/strimzi-values.yaml delete mode 100644 examples/tiny-kafka/manifests/image-pull-secret.yaml delete mode 100644 examples/tiny-kafka/manifests/operator.yaml create mode 100644 kind.yaml diff --git a/.gitignore b/.gitignore index edf9e25b3f..61e478f916 100644 --- a/.gitignore +++ b/.gitignore @@ -14,7 +14,6 @@ rpms/ data/ *.vbox bundle/ -charts/ .idea/ .tool-versions test/tf/public-ec2-instance/.test-data @@ -22,3 +21,6 @@ test/tf/public-ec2-instance/.terraform terraform.tfstate terraform.tfstate.backup .terraform.lock.hcl + +.zarf* +zarf-pki \ No newline at end of file diff --git a/.vscode/launch.json b/.vscode/launch.json index 6908e48e57..7220cf858a 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -12,9 +12,9 @@ "program": "${workspaceFolder}/cli", "env": {}, "args": [ - "package", - "create", - "--confirm" + "init", + "--confirm", + "--components=gitops-service" ] }, diff --git a/assets/charts/gitea-values.yaml b/assets/charts/gitea-values.yaml new file mode 100644 index 0000000000..7fcd4c526c --- /dev/null +++ b/assets/charts/gitea-values.yaml @@ -0,0 +1,39 @@ +persistence: + storageClass: "###ZARF_STORAGE_CLASS###" +imagePullSecrets: + - name: "zarf-registry" +gitea: + admin: + username: "zarf-git-user" + password: "###ZARF_GIT_AUTH_PUSH###" + email: "zarf@localhost" + cache: + builtIn: + enabled: false + config: + APP_NAME: "Zarf Gitops Service" + server: + DISABLE_SSH: true + OFFLINE_MODE: true + database: + DB_TYPE: sqlite3 + # Note that the init script checks to see if the IP & port of the database service is accessible, so make sure you set those to something that resolves as successful (since sqlite uses files on disk setting the port & ip won't affect the running of gitea). + HOST: docker-registry.zarf.svc.cluster.local:5000 + security: + INSTALL_LOCK: true + service: + DISABLE_REGISTRATION: true + repository: + ENABLE_PUSH_CREATE_USER: true + FORCE_PRIVATE: true + database: + builtIn: + postgresql: + enabled: false +resources: + requests: + cpu: "200m" + memory: "512Mi" + limits: + cpu: "1" + memory: "2Gi" diff --git a/assets/charts/pgl-values.yaml b/assets/charts/pgl-values.yaml new file mode 100644 index 0000000000..ece2f8ed3a --- /dev/null +++ b/assets/charts/pgl-values.yaml @@ -0,0 +1,41 @@ +loki: + image: + pullSecrets: + - "zarf-registry" +grafana: + enabled: true + adminUser: "zarf-admin" + adminPassword: "###ZARF_SECRET###" + image: + pullSecrets: + - "zarf-registry" + grafana.ini: + server: + root_url: "%(protocol)s://%(domain)s/monitor" + serve_from_sub_path: true +promtail: + image: + pullSecrets: + - "zarf-registry" + extraScrapeConfigs: + - job_name: journal + journal: + max_age: 12h + labels: + job: systemd-journal + relabel_configs: + - source_labels: ["__journal__systemd_unit"] + target_label: "unit" + - source_labels: ["__journal__hostname"] + target_label: "hostname" + + # Mount journal directory into promtail pods + extraVolumes: + - name: journal + hostPath: + path: /var/log/journal + + extraVolumeMounts: + - name: journal + mountPath: /var/log/journal + readOnly: true diff --git a/assets/charts/registry-values-seed.yaml b/assets/charts/registry-values-seed.yaml new file mode 100644 index 0000000000..88c6586c46 --- /dev/null +++ b/assets/charts/registry-values-seed.yaml @@ -0,0 +1,2 @@ +image: + repository: "###ZARF_SEED_REGISTRY###/library/registry" diff --git a/assets/charts/registry-values.yaml b/assets/charts/registry-values.yaml new file mode 100644 index 0000000000..d3982e3bf5 --- /dev/null +++ b/assets/charts/registry-values.yaml @@ -0,0 +1,22 @@ +persistence: + enabled: true + storageClass: "###ZARF_STORAGE_CLASS###" +image: + repository: "###ZARF_REGISTRY###/library/registry" +imagePullSecrets: + - name: zarf-registry +secrets: + htpasswd: "###ZARF_HTPASSWD###" +# https://github.com/containerd/containerd/blob/v1.5.8/pkg/cri/server/image_pull.go#L412 +# thx containerd *magic* :-D +# tlsSecretName: tls-pem +service: + type: NodePort + nodePort: "###ZARF_REGISTRY_NODEPORT###" +resources: + requests: + cpu: "100m" + memory: "512Mi" + limits: + cpu: "1" + memory: "2Gi" diff --git a/assets/charts/traefik-values.yaml b/assets/charts/traefik-values.yaml new file mode 100644 index 0000000000..5f5dab8e6d --- /dev/null +++ b/assets/charts/traefik-values.yaml @@ -0,0 +1,12 @@ +ports: + websecure: + tls: + enabled: true +providers: + kubernetesIngress: + publishedService: + enabled: true +priorityClassName: "system-cluster-critical" +deployment: + imagePullSecrets: + - name: zarf-registry diff --git a/assets/manifests/gitops/gitea.yaml b/assets/manifests/gitops/gitea.yaml deleted file mode 100644 index c941038107..0000000000 --- a/assets/manifests/gitops/gitea.yaml +++ /dev/null @@ -1,74 +0,0 @@ ---- -apiVersion: v1 -kind: Namespace -metadata: - name: git ---- -apiVersion: networking.k8s.io/v1 -kind: Ingress -metadata: - name: git-ingress - namespace: git - annotations: - kubernetes.io/ingress.class: "traefik" - traefik.ingress.kubernetes.io/router.middlewares: kube-system-ssl-redirect@kubernetescrd -spec: - rules: - - http: - paths: - - path: / - pathType: Prefix - backend: - service: - name: stuart-gitea-http - port: - number: 3000 ---- -apiVersion: helm.cattle.io/v1 -kind: HelmChart -metadata: - name: stuart - namespace: git -spec: - chart: https://%{KUBERNETES_API}%/static/charts/gitea-2.2.5.tgz - targetNamespace: git - valuesContent: |- - persistence: - storageClass: local-path - image: - pullPolicy: Never - gitea: - admin: - username: "zarf-git-user" - password: "###ZARF_SECRET###" - email: "zarf@localhost" - cache: - builtIn: - enabled: false - config: - APP_NAME: "Zarf Gitops Service" - server: - DISABLE_SSH: true - OFFLINE_MODE: true - database: - DB_TYPE: sqlite3 - # Note that the init script checks to see if the IP & port of the database service is accessible, so make sure you set those to something that resolves as successful (since sqlite uses files on disk setting the port & ip won't affect the running of gitea). - HOST: kevin-docker-registry.registry.svc.cluster.local:5000 - security: - INSTALL_LOCK: true - service: - DISABLE_REGISTRATION: true - repository: - ENABLE_PUSH_CREATE_USER: true - FORCE_PRIVATE: true - database: - builtIn: - postgresql: - enabled: false - resources: - requests: - cpu: "200m" - memory: "512Mi" - limits: - cpu: "1" - memory: "2Gi" diff --git a/assets/manifests/logging/pgl-stack.yaml b/assets/manifests/logging/pgl-stack.yaml deleted file mode 100644 index 82409d7ad3..0000000000 --- a/assets/manifests/logging/pgl-stack.yaml +++ /dev/null @@ -1,68 +0,0 @@ ---- -apiVersion: v1 -kind: Namespace -metadata: - name: logging ---- -apiVersion: networking.k8s.io/v1 -kind: Ingress -metadata: - name: grafana-ingress - namespace: logging - annotations: - kubernetes.io/ingress.class: "traefik" - traefik.ingress.kubernetes.io/router.middlewares: kube-system-ssl-redirect@kubernetescrd -spec: - rules: - - http: - paths: - - path: /monitor - pathType: Prefix - backend: - service: - name: loki-grafana - port: - number: 80 ---- -apiVersion: helm.cattle.io/v1 -kind: HelmChart -metadata: - name: loki - namespace: logging -spec: - chart: https://%{KUBERNETES_API}%/static/charts/loki-stack-2.4.1.tgz - targetNamespace: logging - valuesContent: |- - grafana: - enabled: true - adminUser: "zarf-admin" - adminPassword: "###ZARF_SECRET###" - grafana.ini: - server: - root_url: "%(protocol)s://%(domain)s/monitor" - serve_from_sub_path: true - promtail: - extraScrapeConfigs: - - job_name: journal - journal: - max_age: 12h - labels: - job: systemd-journal - relabel_configs: - - source_labels: ['__journal__systemd_unit'] - target_label: 'unit' - - source_labels: ['__journal__hostname'] - target_label: 'hostname' - - # Mount journal directory into promtail pods - extraVolumes: - - name: journal - hostPath: - path: /var/log/journal - - extraVolumeMounts: - - name: journal - mountPath: /var/log/journal - readOnly: true - image: - pullPolicy: Never diff --git a/assets/manifests/registry/configmap.yaml b/assets/manifests/registry/configmap.yaml new file mode 100644 index 0000000000..02c9b9bb0b --- /dev/null +++ b/assets/manifests/registry/configmap.yaml @@ -0,0 +1,10 @@ +# https://github.com/kubernetes/enhancements/tree/master/keps/sig-cluster-lifecycle/generic/1755-communicating-a-local-registry +apiVersion: v1 +kind: ConfigMap +metadata: + name: local-registry-hosting + namespace: kube-public +data: + localRegistryHosting.v1: | + host: "###ZARF_REGISTRY###" + help: "https://github.com/defenseunicorns/zarf" diff --git a/assets/manifests/registry/registry.yaml b/assets/manifests/registry/registry.yaml deleted file mode 100644 index f76c5ed748..0000000000 --- a/assets/manifests/registry/registry.yaml +++ /dev/null @@ -1,49 +0,0 @@ ---- -apiVersion: v1 -kind: Namespace -metadata: - name: registry ---- -apiVersion: networking.k8s.io/v1 -kind: Ingress -metadata: - name: registry-ingress - namespace: registry - annotations: - kubernetes.io/ingress.class: "traefik" - traefik.ingress.kubernetes.io/router.middlewares: kube-system-ssl-redirect@kubernetescrd -spec: - rules: - - http: - paths: - - path: /v2/ - pathType: Prefix - backend: - service: - name: kevin-docker-registry - port: - number: 5000 ---- -apiVersion: helm.cattle.io/v1 -kind: HelmChart -metadata: - name: kevin - namespace: registry -spec: - chart: https://%{KUBERNETES_API}%/static/charts/docker-registry-1.10.1.tgz - targetNamespace: registry - valuesContent: |- - persistence: - enabled: true - image: - repository: registry1.dso.mil/ironbank/opensource/docker/registry-v2 - pullPolicy: Never - secrets: - htpasswd: ###ZARF_HTPASSWD### - resources: - requests: - cpu: "100m" - memory: "512Mi" - limits: - cpu: "1" - memory: "2Gi" diff --git a/assets/manifests/traefik/traefik.yaml b/assets/manifests/traefik/traefik.yaml deleted file mode 100644 index cebf7f9089..0000000000 --- a/assets/manifests/traefik/traefik.yaml +++ /dev/null @@ -1,36 +0,0 @@ ---- -apiVersion: helm.cattle.io/v1 -kind: HelmChart -metadata: - name: traefik - namespace: kube-system -spec: - chart: https://%{KUBERNETES_API}%/static/charts/traefik-9.18.2.tgz - targetNamespace: kube-system - valuesContent: |- - rbac: - enabled: true - ports: - websecure: - tls: - enabled: true - podAnnotations: - prometheus.io/port: "8082" - prometheus.io/scrape: "true" - providers: - kubernetesIngress: - publishedService: - enabled: true - priorityClassName: "system-cluster-critical" - image: - name: "rancher/library-traefik" - tolerations: - - key: "CriticalAddonsOnly" - operator: "Exists" - - key: "node-role.kubernetes.io/control-plane" - operator: "Exists" - effect: "NoSchedule" - - key: "node-role.kubernetes.io/master" - operator: "Exists" - effect: "NoSchedule" - diff --git a/assets/misc/registries.yaml b/assets/misc/registries.yaml deleted file mode 100644 index 16840c3507..0000000000 --- a/assets/misc/registries.yaml +++ /dev/null @@ -1,19 +0,0 @@ -mirrors: - registry.dso.mil: - endpoint: - - "https://###ZARF_TARGET_ENDPOINT###" - registry1.dso.mil: - endpoint: - - "https://###ZARF_TARGET_ENDPOINT###" - docker.io: - endpoint: - - "https://###ZARF_TARGET_ENDPOINT###" - registry-1.docker.io: - endpoint: - - "https://###ZARF_TARGET_ENDPOINT###" - ghcr.io: - endpoint: - - "https://###ZARF_TARGET_ENDPOINT###" - registry.opensource.zalan.do: - endpoint: - - "https://###ZARF_TARGET_ENDPOINT###" diff --git a/assets/scripts/k3s.service b/assets/scripts/k3s.service index a27ba9da0f..ddbf47b8c3 100644 --- a/assets/scripts/k3s.service +++ b/assets/scripts/k3s.service @@ -24,4 +24,4 @@ RestartSec=5s ExecStartPre=/bin/sh -xc '! /usr/bin/systemctl is-enabled --quiet nm-cloud-setup.service' ExecStartPre=-/sbin/modprobe br_netfilter ExecStartPre=-/sbin/modprobe overlay -ExecStart=/usr/local/bin/k3s server --write-kubeconfig-mode=700 +ExecStart=/usr/local/bin/k3s server --write-kubeconfig-mode=700 --disable traefik diff --git a/cli/cmd/connect.go b/cli/cmd/connect.go new file mode 100644 index 0000000000..ba352865c3 --- /dev/null +++ b/cli/cmd/connect.go @@ -0,0 +1,36 @@ +package cmd + +import ( + "github.com/defenseunicorns/zarf/cli/internal/k8s" + "github.com/spf13/cobra" +) + +var ( + connectResourceName string + connectNamespace string + connectResourceType string + connectLocalPort int + connectRemotePort int + + connectCmd = &cobra.Command{ + Use: "connect ", + Short: "Access services or pods deployed in the cluster.", + Run: func(cmd *cobra.Command, args []string) { + var target string + if len(args) > 0 { + target = args[0] + } + tunnel := k8s.NewTunnel(connectNamespace, connectResourceType, connectResourceName, connectLocalPort, connectRemotePort) + tunnel.Connect(target, true) + }, + } +) + +func init() { + rootCmd.AddCommand(connectCmd) + connectCmd.Flags().StringVar(&connectResourceName, "name", "docker-registry", "Specify the resource name. E.g. name=unicorns or name=unicorn-pod-7448499f4d-b5bk6") + connectCmd.Flags().StringVar(&connectNamespace, "namespace", k8s.ZarfNamespace, "Specify the namespace. E.g. namespace=default") + connectCmd.Flags().StringVar(&connectResourceType, "type", k8s.SvcResource, "Specify the resource type. E.g. type=svc or type=pod") + connectCmd.Flags().IntVar(&connectLocalPort, "local-port", 0, "(Optional, autogenerated if not provided) Specify the local port to bind to. E.g. local-port=42000") + connectCmd.Flags().IntVar(&connectRemotePort, "remote-port", 0, "Specify the remote port of the resource to bind to. E.g. remote-port=8080") +} diff --git a/cli/cmd/destroy.go b/cli/cmd/destroy.go index be38b9374c..2738fc1075 100644 --- a/cli/cmd/destroy.go +++ b/cli/cmd/destroy.go @@ -1,11 +1,10 @@ package cmd import ( - "fmt" "os" "regexp" - "github.com/defenseunicorns/zarf/cli/config" + "github.com/defenseunicorns/zarf/cli/internal/k8s" "github.com/defenseunicorns/zarf/cli/internal/utils" "github.com/spf13/cobra" @@ -17,29 +16,27 @@ var destroyCmd = &cobra.Command{ Use: "destroy", Short: "Tear it all down, we'll miss you Zarf...", Run: func(cmd *cobra.Command, args []string) { - burn() - _ = os.Remove(config.ZarfStatePath) - pattern := regexp.MustCompile(`(?mi)zarf-clean-.+\.sh$`) - scripts := utils.RecursiveFileList("/usr/local/bin", pattern) - // Iterate over al matching zarf-clean scripts and exec them - for _, script := range scripts { - // Run the matched script - _, _ = utils.ExecCommand(true, nil, script) - // Try to remove the script, but ignore any errors - _ = os.Remove(script) + state := k8s.LoadZarfState() + _ = os.Remove(".zarf-registry") + + if state.ZarfAppliance { + // If Zarf deployed the cluster, burn it all down + pattern := regexp.MustCompile(`(?mi)zarf-clean-.+\.sh$`) + scripts := utils.RecursiveFileList("/usr/local/bin", pattern) + // Iterate over al matching zarf-clean scripts and exec them + for _, script := range scripts { + // Run the matched script + _, _ = utils.ExecCommand(true, nil, script) + // Try to remove the script, but ignore any errors + _ = os.Remove(script) + } + } else { + // If Zarf didn't deploy the cluster, only delete the ZarfNamespace + k8s.DeleteZarfNamespace() } - burn() }, } -func burn() { - fmt.Println("") - for count := 0; count < 40; count++ { - fmt.Print("🔥") - } - fmt.Println("") -} - func init() { rootCmd.AddCommand(destroyCmd) diff --git a/cli/cmd/initialize.go b/cli/cmd/initialize.go index 40a147930c..62066cf339 100644 --- a/cli/cmd/initialize.go +++ b/cli/cmd/initialize.go @@ -1,40 +1,35 @@ package cmd import ( - "net" + "fmt" "os" - "path/filepath" "github.com/defenseunicorns/zarf/cli/config" + "github.com/defenseunicorns/zarf/cli/internal/message" "github.com/defenseunicorns/zarf/cli/internal/packager" - "github.com/defenseunicorns/zarf/cli/internal/pki" - "github.com/defenseunicorns/zarf/cli/internal/utils" - "github.com/AlecAivazis/survey/v2" - "github.com/sirupsen/logrus" "github.com/spf13/cobra" ) -const invalidHostMessage = "The hostname provided (%v) was not a valid hostname. The hostname can only contain: 'a-z', 'A-Z', '0-9', '-', and '.' characters as defined by RFC-1035. If using localhost, you must use the 127.0.0.1.\n" - -var initOptions = packager.InstallOptions{} -var state = config.ZarfState{ - Kind: "ZarfState", -} - // initCmd represents the init command var initCmd = &cobra.Command{ Use: "init", Short: "Deploys the gitops service or appliance cluster on a clean linux box", Long: "Flags are only required if running via automation, otherwise the init command will prompt you for your configuration choices", Run: func(cmd *cobra.Command, args []string) { + zarfLogo := getLogo() + _, _ = fmt.Fprintln(os.Stderr, zarfLogo) - if !initOptions.Confirmed { + if !config.DeployOptions.Confirm { var confirm bool - prompt := &survey.Confirm{ - Message: "⚠️ This will initialize a new Zarf deployment on this machine which will make changes to your filesystem. You should not run zarf init more than once without first running zarf destroy. Do you want to continue?", - } + + message.Question(` + You are about to initialize a new Zarf deployment on this machine which will make + changes to your filesystem. You should not run zarf init more than once without first + running zarf destroy.`) + + prompt := &survey.Confirm{Message: "Do you want to continue?"} _ = survey.AskOne(prompt, &confirm) if !confirm { // Gracefully exit because they didn't want to play after all :-/ @@ -42,135 +37,19 @@ var initCmd = &cobra.Command{ } } - handleTLSOptions() - pki.HandlePKI() - packager.Install(&initOptions) - }, -} - -// Check for cert paths provided via automation (both required) -func hasCertPaths() bool { - return state.TLS.CertPrivatePath != "" && state.TLS.CertPublicPath != "" -} - -// Ask user if they will be importing or generating certs, return true if importing certs -func promptIsImportCerts() bool { - var mode int - - if hasCertPaths() { - return true - } - - if initOptions.Confirmed { - // Assume generate on confirmed without cert paths - return false - } - - // Determine flow for generate or import - modePrompt := &survey.Select{ - Message: "Will Zarf be generating a TLS chain or importing an existing ingress cert?", - Options: []string{ - "Generate TLS chain with an ephemeral CA", - "Import user-provided cert keypair", - }, - } - _ = survey.AskOne(modePrompt, &mode) - - return mode == 1 -} - -// Ask user for the public and private key paths to import into the cluster -func promptCertPaths() { - prompt := &survey.Input{ - Message: "Enter a file path to the ingress public key", - Suggest: func(toComplete string) []string { - // Give some suggestions to users - files, _ := filepath.Glob(toComplete + "*") - return files - }, - } - _ = survey.AskOne(prompt, &state.TLS.CertPublicPath, survey.WithValidator(survey.Required)) - - prompt.Message = "Enter a file path to the ingress private key" - _ = survey.AskOne(prompt, &state.TLS.CertPrivatePath, survey.WithValidator(survey.Required)) -} - -// Ask user for the hostname or ip if not provided via automation and validate the input -func promptAndValidateHost() { - if state.TLS.Host == "" { - if initOptions.Confirmed { - // Fail if host is not provided on confirm - logrus.Fatalf(invalidHostMessage, state.TLS.Host) - } - - // If not provided, always ask for a host entry to avoid having to guess which entry in a cert if provided - prompt := &survey.Input{ - Message: "Enter a host DNS entry or IP Address for the cluster ingress. If using localhost, use 127.0.0.1", - Suggest: func(toComplete string) []string { - var suggestions []string - // Create a list of IPs to add to the suggestion box - interfaces, err := net.InterfaceAddrs() - if err == nil { - for _, iface := range interfaces { - // Conver the CIRD to the IP string if valid - ip, _, _ := net.ParseCIDR(iface.String()) - if utils.ValidHostname(ip.String()) { - suggestions = append(suggestions, ip.String()) - } - } - } - // Add the localhost hostname as well - hostname, _ := os.Hostname() - if hostname != "" { - suggestions = append(suggestions, hostname) - } - - return suggestions - }, - } - err := survey.AskOne(prompt, &state.TLS.Host, survey.WithValidator(survey.Required)) - if err != nil && err.Error() == os.Interrupt.String() { - // Handle CTRL+C - os.Exit(0) - } - } + // Continue running package deploy for all components like any other package + config.DeployOptions.PackagePath = config.PackageInitName - if !utils.ValidHostname(state.TLS.Host) { - // When hitting an invalid hostname... - if initOptions.Confirmed { - // ...if using automation end it all - logrus.Fatalf(invalidHostMessage, state.TLS.Host) - } - // ...otherwise, warn user, reset the field, and cycle the function - logrus.Warnf(invalidHostMessage, state.TLS.Host) - state.TLS.Host = "" - promptAndValidateHost() - } -} - -func handleTLSOptions() { - - // Get and validate host - promptAndValidateHost() - - // Get the cert path if this is an import - if promptIsImportCerts() && !hasCertPaths() { - promptCertPaths() - } - - // Persist the config the ZarfState - if err := config.WriteState(state); err != nil { - logrus.Debug(err) - logrus.Fatal("Unable to save the zarf state file.") - } + // Run everything + packager.Deploy() + }, } func init() { - rootCmd.AddCommand(initCmd) - initCmd.Flags().BoolVar(&initOptions.Confirmed, "confirm", false, "Confirm the install without prompting") - initCmd.Flags().StringVar(&state.TLS.Host, "host", "", "Specify the host or IP for the gitops service ingress. E.g. host=10.10.10.5 or host=gitops.domain.com") - initCmd.Flags().StringVar(&state.TLS.CertPublicPath, "server-crt", "", "Path to the server public key if not generating unique PKI") - initCmd.Flags().StringVar(&state.TLS.CertPrivatePath, "server-key", "", "Path to the server private key if not generating unique PKI") - initCmd.Flags().StringVar(&initOptions.Components, "components", "", "Comma-separated list of components to install. Adding this flag will skip the init prompts for which components to install") + initCmd.Flags().BoolVar(&config.DeployOptions.Confirm, "confirm", false, "Confirm the install without prompting") + initCmd.Flags().StringVar(&config.TLS.Host, "host", "", "Specify the host or IP for the gitops service ingress. E.g. host=10.10.10.5 or host=gitops.domain.com") + initCmd.Flags().StringVar(&config.TLS.CertPublicPath, "server-crt", "", "Path to the server public key if not generating unique PKI") + initCmd.Flags().StringVar(&config.TLS.CertPrivatePath, "server-key", "", "Path to the server private key if not generating unique PKI") + initCmd.Flags().StringVar(&config.DeployOptions.Components, "components", "", "Comma-separated list of components to install. Adding this flag will skip the init prompts for which components to install") } diff --git a/cli/cmd/package.go b/cli/cmd/package.go index 7f8bec8193..5ff6779047 100644 --- a/cli/cmd/package.go +++ b/cli/cmd/package.go @@ -9,9 +9,6 @@ import ( "github.com/spf13/cobra" ) -var confirmCreate bool -var confirmDeploy bool -var deployComponents string var insecureDeploy bool var shasum string @@ -24,23 +21,23 @@ var packageCreateCmd = &cobra.Command{ Use: "create", Short: "Create an update package to push to the gitops server (runs online)", Run: func(cmd *cobra.Command, args []string) { - packager.Create(confirmCreate) + packager.Create() }, } var packageDeployCmd = &cobra.Command{ - Use: "deploy PACKAGE", + Use: "deploy [PACKAGE]", Short: "Deploys an update package from a local file or URL (runs offline)", Args: cobra.MaximumNArgs(1), Run: func(cmd *cobra.Command, args []string) { packageName := choosePackage(args) - localPackagePath := packager.HandleIfURL(packageName, shasum, insecureDeploy) - packager.Deploy(localPackagePath, confirmDeploy, deployComponents) + config.DeployOptions.PackagePath = packager.HandleIfURL(packageName, shasum, insecureDeploy) + packager.Deploy() }, } var packageInspectCmd = &cobra.Command{ - Use: "inspect PACKAGE", + Use: "inspect [PACKAGE]", Short: "lists the payload of an update package file (runs offline)", Args: cobra.MaximumNArgs(1), Run: func(cmd *cobra.Command, args []string) { @@ -71,9 +68,9 @@ func init() { packageCmd.AddCommand(packageDeployCmd) packageCmd.AddCommand(packageInspectCmd) - packageCreateCmd.Flags().BoolVar(&confirmCreate, "confirm", false, "Confirm package creation without prompting") - packageDeployCmd.Flags().BoolVar(&confirmDeploy, "confirm", false, "Confirm package deployment without prompting") - packageDeployCmd.Flags().StringVar(&deployComponents, "components", "", "Comma-separated list of components to install. Adding this flag will skip the init prompts for which components to install") + packageCreateCmd.Flags().BoolVar(&config.DeployOptions.Confirm, "confirm", false, "Confirm package creation without prompting") + packageDeployCmd.Flags().BoolVar(&config.DeployOptions.Confirm, "confirm", false, "Confirm package deployment without prompting") + packageDeployCmd.Flags().StringVar(&config.DeployOptions.Components, "components", "", "Comma-separated list of components to install. Adding this flag will skip the init prompts for which components to install") packageDeployCmd.Flags().BoolVar(&insecureDeploy, "insecure", false, "Skip shasum validation of remote package. Required if deploying a remote package and `--shasum` is not provided") packageDeployCmd.Flags().StringVar(&shasum, "shasum", "", "Shasum of the package to deploy. Required if deploying a remote package and `--insecure` is not provided") } diff --git a/cli/cmd/pki.go b/cli/cmd/pki.go index 0b8018898d..32176bacd4 100644 --- a/cli/cmd/pki.go +++ b/cli/cmd/pki.go @@ -3,14 +3,13 @@ package cmd import ( "github.com/AlecAivazis/survey/v2" "github.com/defenseunicorns/zarf/cli/config" + "github.com/defenseunicorns/zarf/cli/internal/message" + "github.com/defenseunicorns/zarf/cli/internal/message/tls" "github.com/defenseunicorns/zarf/cli/internal/pki" "github.com/defenseunicorns/zarf/cli/internal/utils" - "github.com/sirupsen/logrus" "github.com/spf13/cobra" ) -var tempState config.ZarfState - var pkiCmd = &cobra.Command{ Use: "pki", Short: "PKI-related commands", @@ -21,23 +20,19 @@ var pkiRegenerate = &cobra.Command{ Short: "Regenerate the pki certs for the cluster ingress", Run: func(cmd *cobra.Command, args []string) { // Prompt for a hostname if it wasn't provided as a command flag - if tempState.TLS.Host == "" { + if config.TLS.Host == "" { prompt := &survey.Input{ - Message: "Enter a host DNS entry or IP Address for the gitops service ingress. If using localhost, use 127.0.0.1", + Message: "Enter a host DNS entry or IP Address for the gitops service ingress. If using localhost, use " + config.IPV4Localhost, } - _ = survey.AskOne(prompt, &tempState.TLS.Host, survey.WithValidator(survey.Required)) + _ = survey.AskOne(prompt, &config.TLS.Host, survey.WithValidator(survey.Required)) } // Verify the hostname provided is valid - if !utils.ValidHostname(tempState.TLS.Host) { - logrus.Fatalf(invalidHostMessage, tempState.TLS.Host) + if !utils.ValidHostname(config.TLS.Host) { + message.Fatalf(nil, tls.InvalidHostMessage, config.TLS.Host) } pki.GeneratePKI() - if err := config.WriteState(state); err != nil { - logrus.Debug(err) - logrus.Fatal("Unable to save the zarf state file.") - } }, } @@ -46,10 +41,6 @@ var pkiImport = &cobra.Command{ Short: "Import an existing key pair for the cluster ingress", Run: func(cmd *cobra.Command, args []string) { pki.HandlePKI() - if err := config.WriteState(state); err != nil { - logrus.Debug(err) - logrus.Fatal("Unable to save the zarf state file.") - } }, } @@ -58,8 +49,7 @@ func init() { pkiCmd.AddCommand(pkiRegenerate) pkiCmd.AddCommand(pkiImport) - pkiRegenerate.Flags().StringVar(&tempState.TLS.Host, "host", "", "Specify the host or IP for the gitops service ingress") - - pkiImport.Flags().StringVar(&tempState.TLS.CertPublicPath, "server-crt", "", "Path to the server public key if not generating unique PKI") - pkiImport.Flags().StringVar(&tempState.TLS.CertPrivatePath, "server-key", "", "Path to the server private key if not generating unique PKI") + pkiRegenerate.Flags().StringVar(&config.TLS.Host, "host", "", "Specify the host or IP for the gitops service ingress") + pkiImport.Flags().StringVar(&config.TLS.CertPublicPath, "server-crt", "", "Path to the server public key if not generating unique PKI") + pkiImport.Flags().StringVar(&config.TLS.CertPrivatePath, "server-key", "", "Path to the server private key if not generating unique PKI") } diff --git a/cli/cmd/prepare.go b/cli/cmd/prepare.go index 96a798a927..797b10945a 100644 --- a/cli/cmd/prepare.go +++ b/cli/cmd/prepare.go @@ -6,8 +6,8 @@ import ( "github.com/AlecAivazis/survey/v2" "github.com/defenseunicorns/zarf/cli/internal/git" + "github.com/defenseunicorns/zarf/cli/internal/message" "github.com/defenseunicorns/zarf/cli/internal/utils" - "github.com/sirupsen/logrus" "github.com/spf13/cobra" ) @@ -17,7 +17,7 @@ var prepareCmd = &cobra.Command{ } var prepareTransformGitLinks = &cobra.Command{ - Use: "patch-git HOST FILE", + Use: "patch-git [HOST] [FILE]", Short: "Converts all .git URLs to the specified Zarf HOST and with the Zarf URL pattern in a given FILE", Args: cobra.ExactArgs(2), Run: func(cmd *cobra.Command, args []string) { @@ -26,7 +26,7 @@ var prepareTransformGitLinks = &cobra.Command{ // Read the contents of the given file content, err := ioutil.ReadFile(fileName) if err != nil { - logrus.Fatal(err) + message.Fatalf(err, "Unable to read the file %s", fileName) } // Perform git url transformation via regex @@ -44,8 +44,7 @@ var prepareTransformGitLinks = &cobra.Command{ // Overwrite the file err = ioutil.WriteFile(fileName, []byte(processedText), 0640) if err != nil { - logrus.Debug(err) - logrus.Fatal("Unable to write the changes back to the file") + message.Fatal(err, "Unable to write the changes back to the file") } } @@ -53,15 +52,14 @@ var prepareTransformGitLinks = &cobra.Command{ } var prepareComputeFileSha256sum = &cobra.Command{ - Use: "sha256sum FILE|URL", + Use: "sha256sum [FILE|URL]", Short: "Generate a SHA256SUM for the given file", Args: cobra.ExactArgs(1), Run: func(cmd *cobra.Command, args []string) { fileName := args[0] hash, err := utils.GetSha256Sum(fileName) if err != nil { - logrus.Debug(err) - logrus.Fatal("Unable to compute the hash") + message.Fatal(err, "Unable to compute the hash") } else { fmt.Println(hash) } diff --git a/cli/cmd/root.go b/cli/cmd/root.go index 4edf70fbdb..63d08da88f 100644 --- a/cli/cmd/root.go +++ b/cli/cmd/root.go @@ -3,34 +3,42 @@ package cmd import ( "fmt" "os" + "runtime" "strings" + "github.com/defenseunicorns/zarf/cli/config" + "github.com/defenseunicorns/zarf/cli/internal/message" "github.com/defenseunicorns/zarf/cli/internal/packager" - "github.com/sirupsen/logrus" "github.com/spf13/cobra" ) var zarfLogLevel = "" +var arch string var rootCmd = &cobra.Command{ - Use: "zarf COMMAND|ZARF-PACKAGE|ZARF-YAML", + Use: "zarf [COMMAND]|[ZARF-PACKAGE]|[ZARF-YAML]", PersistentPreRun: func(cmd *cobra.Command, args []string) { - setLogLevel(zarfLogLevel) - if logrus.GetLevel() != logrus.InfoLevel { - fmt.Printf("The log level has been changed to: %s\n", logrus.GetLevel()) + if zarfLogLevel != "" { + setLogLevel(zarfLogLevel) } + if arch == "" { + // Default to the current running arch for images + arch = runtime.GOARCH + } + config.SetAcrch(arch) }, - Short: "Small tool to bundle dependencies with K3s for airgapped deployments", + Short: "Small tool to bundle dependencies with K3s for air-gaped deployments", Args: cobra.MaximumNArgs(1), Run: func(cmd *cobra.Command, args []string) { if len(args) > 0 { if strings.Contains(args[0], "zarf-package-") { - packager.Deploy(args[0], confirmDeploy, "") + config.DeployOptions.PackagePath = args[0] + packager.Deploy() return } if args[0] == "zarf.yaml" { - packager.Create(confirmCreate) + packager.Create() return } } @@ -39,31 +47,37 @@ var rootCmd = &cobra.Command{ } func Execute() { - zarfLogo := getLogo() - fmt.Fprintln(os.Stderr, zarfLogo) cobra.CheckErr(rootCmd.Execute()) } func init() { + // Store the original cobra help func + originalHelp := rootCmd.HelpFunc() + rootCmd.SetHelpFunc(func(c *cobra.Command, s []string) { + // Don't show the zarf logo constantly + zarfLogo := getLogo() + _, _ = fmt.Fprintln(os.Stderr, zarfLogo) + // Re-add the original help function + originalHelp(c, s) + }) + rootCmd.Flags().BoolP("toggle", "t", false, "Help message for toggle") - rootCmd.PersistentFlags().StringVarP(&zarfLogLevel, "log-level", "l", "info", "Log level when running Zarf. Valid options are: debug, info, warn, error, fatal") + rootCmd.PersistentFlags().StringVarP(&zarfLogLevel, "log-level", "l", "", "Log level when running Zarf. Valid options are: warn, info, debug, trace") + rootCmd.PersistentFlags().StringVarP(&arch, "architecture", "a", "", "Architecture for OCI images") } func setLogLevel(logLevel string) { - switch logLevel { - case "debug": - logrus.SetLevel(logrus.DebugLevel) - case "info": - logrus.SetLevel(logrus.InfoLevel) - case "warn": - logrus.SetLevel(logrus.WarnLevel) - case "error": - logrus.SetLevel(logrus.ErrorLevel) - case "fatal": - logrus.SetLevel(logrus.FatalLevel) - case "panic": - logrus.SetLevel(logrus.PanicLevel) - default: - logrus.Fatalf("Unrecognized log level entry: %s", logLevel) + match := map[string]message.LogLevel{ + "warn": message.WarnLevel, + "info": message.InfoLevel, + "debug": message.DebugLevel, + "trace": message.TraceLevel, + } + + if lvl, ok := match[logLevel]; ok { + message.SetLogLevel(lvl) + message.Note("Log level set to " + logLevel) + } else { + message.Warn("invalid log level setting") } } diff --git a/cli/cmd/tools.go b/cli/cmd/tools.go index c194d9016e..4e4ad6fdac 100644 --- a/cli/cmd/tools.go +++ b/cli/cmd/tools.go @@ -2,17 +2,16 @@ package cmd import ( "encoding/json" - "fmt" - "github.com/alecthomas/jsonschema" + "github.com/alecthomas/jsonschema" "github.com/defenseunicorns/zarf/cli/config" "github.com/defenseunicorns/zarf/cli/internal/git" + "github.com/defenseunicorns/zarf/cli/internal/message" craneCmd "github.com/google/go-containerregistry/cmd/crane/cmd" "github.com/google/go-containerregistry/pkg/crane" v1 "github.com/google/go-containerregistry/pkg/v1" "github.com/mholt/archiver/v3" - "github.com/sirupsen/logrus" "github.com/spf13/cobra" ) @@ -35,7 +34,7 @@ var archiverCompressCmd = &cobra.Command{ sourceFiles, destinationArchive := args[:len(args)-1], args[len(args)-1] err := archiver.Archive(sourceFiles, destinationArchive) if err != nil { - logrus.Fatal(err) + message.Fatal(err, "Unable to perform compression") } }, } @@ -48,7 +47,7 @@ var archiverDecompressCmd = &cobra.Command{ sourceArchive, destinationPath := args[0], args[1] err := archiver.Unarchive(sourceArchive, destinationPath) if err != nil { - logrus.Fatal(err) + message.Fatal(err, "Unable to perform decompression") } }, } @@ -62,7 +61,7 @@ var readCredsCmd = &cobra.Command{ Use: "get-admin-password", Short: "Returns the Zarf admin password read from ~/.git-credentials", Run: func(cmd *cobra.Command, args []string) { - authInfo := git.FindAuthForHost(config.GetTargetEndpoint()) + authInfo := git.FindAuthForHost(config.TLS.Host) fmt.Println(authInfo.Auth.Password) }, } @@ -74,8 +73,7 @@ var configSchemaCmd = &cobra.Command{ schema := jsonschema.Reflect(&config.ZarfPackage{}) output, err := json.MarshalIndent(schema, "", " ") if err != nil { - logrus.Debug(err) - logrus.Fatal("Unable to generate the zarf config schema") + message.Fatal(err, "Unable to generate the zarf config schema") } fmt.Print(string(output)) }, @@ -93,6 +91,7 @@ func init() { toolsCmd.AddCommand(registryCmd) cranePlatformOptions := []crane.Option{ crane.WithPlatform(&v1.Platform{OS: "linux", Architecture: "amd64"}), + crane.WithPlatform(&v1.Platform{OS: "linux", Architecture: "arm64"}), } registryCmd.AddCommand(craneCmd.NewCmdAuthLogin()) registryCmd.AddCommand(craneCmd.NewCmdPull(&cranePlatformOptions)) diff --git a/cli/config/config.go b/cli/config/config.go index 8acbdcc469..2c96927a02 100644 --- a/cli/config/config.go +++ b/cli/config/config.go @@ -1,38 +1,75 @@ package config import ( + "fmt" "os" "os/user" "strings" "time" + "github.com/defenseunicorns/zarf/cli/internal/message" "github.com/defenseunicorns/zarf/cli/internal/utils" - "github.com/sirupsen/logrus" + "github.com/google/go-containerregistry/pkg/crane" + v1 "github.com/google/go-containerregistry/pkg/v1" ) -const K3sBinary = "/usr/local/bin/k3s" -const K3sChartPath = "/var/lib/rancher/k3s/server/static/charts" -const K3sManifestPath = "/var/lib/rancher/k3s/server/manifests" -const K3sImagePath = "/var/lib/rancher/k3s/agent/images" -const PackageInitName = "zarf-init.tar.zst" -const PackagePrefix = "zarf-package-" -const ZarfGitUser = "zarf-git-user" -const ZarfStatePath = ".zarf-state.yaml" - -var CLIVersion = "unset" -var config ZarfPackage -var state ZarfState - -func init() { - if err := utils.ReadYaml(ZarfStatePath, &state); err != nil { - state.Kind = "ZarfState" - } -} +const ( + IPV4Localhost = "127.0.0.1" + + K3sBinary = "/usr/local/bin/k3s" + PackageInitName = "zarf-init.tar.zst" + PackagePrefix = "zarf-package-" + + ZarfGitPushUser = "zarf-git-user" + ZarfRegistryPushUser = "zarf-push" + ZarfRegistryPullUser = "zarf-pull" + ZarfSeedPort = "45000" + ZarfRegistry = IPV4Localhost + ":45001" + ZarfLocalSeedRegistry = IPV4Localhost + ":" + ZarfSeedPort + + ZarfSeedTypeCLIInject = "cli-inject" + ZarfSeedTypeRuntimeRegistry = "runtime-registry" + ZarfSeedTypeInClusterRegistry = "in-cluster-registry" +) + +var ( + // CLIVersion track the version of the CLI + CLIVersion = "unset" + + // TLS options used for cert creation + TLS TLSConfig + + // DeployOptions tracks user-defined values for the active deployment + DeployOptions ZarfDeployOptions + + ActiveCranePlatform crane.Option + + // Private vars + config ZarfPackage + state ZarfState +) func IsZarfInitConfig() bool { + message.Debug("config.IsZarfInitConfig") return strings.ToLower(config.Kind) == "zarfinitconfig" } +func SetAcrch(arch string) { + message.Debugf("config.SetArch(%s)", arch) + ActiveCranePlatform = crane.WithPlatform(&v1.Platform{OS: "linux", Architecture: arch}) +} + +// GetSeedImages returns a list of image strings specified in the package, but only for init packages +func GetSeedImages() []string { + message.Debugf("config.GetSeedImages()") + // Only allow seed images for init config + if IsZarfInitConfig() { + return config.Seed + } else { + return []string{} + } +} + func GetPackageName() string { metadata := GetMetaData() if metadata.Uncompressed { @@ -62,18 +99,26 @@ func GetValidPackageExtensions() [3]string { return [...]string{".tar.zst", ".tar", ".zip"} } +func InitState(tmpState ZarfState) { + message.Debugf("config.InitState(%v)", tmpState) + state = tmpState + initSecrets() +} + func GetState() ZarfState { return state } -func GetTargetEndpoint() string { - return state.TLS.Host +func GetRegistry() string { + return fmt.Sprintf("%s:%s", IPV4Localhost, state.Registry.NodePort) } -func WriteState(incomingState ZarfState) error { - logrus.Debug(incomingState) - state = incomingState - return utils.WriteYaml(ZarfStatePath, state, 0600) +func GetSeedRegistry() string { + if state.Registry.SeedType == ZarfSeedTypeCLIInject { + return "docker.io" + } else { + return fmt.Sprintf("%s:%s", TLS.Host, ZarfSeedPort) + } } func LoadConfig(path string) error { @@ -81,6 +126,7 @@ func LoadConfig(path string) error { } func BuildConfig(path string) error { + message.Debugf("config.BuildConfig(%v)", path) now := time.Now() currentUser, userErr := user.Current() hostname, hostErr := os.Hostname() diff --git a/cli/config/secret.go b/cli/config/secret.go new file mode 100644 index 0000000000..b978fcde2a --- /dev/null +++ b/cli/config/secret.go @@ -0,0 +1,74 @@ +package config + +import ( + "crypto/sha256" + "encoding/hex" + "fmt" + + "github.com/defenseunicorns/zarf/cli/internal/message" +) + +type SecretSelector = string + +type SecretMap struct { + length int + computed string + valid bool +} + +const ( + StateRegistryPush SecretSelector = "registry-push" + StateRegistryPull SecretSelector = "registry-pull" + StateRegistrySecret SecretSelector = "registry-secret" + StateGitPush SecretSelector = "git-push" + StateGitPull SecretSelector = "git-pull" + StateLogging SecretSelector = "logging" +) + +var selectors = map[SecretSelector]SecretMap{ + StateRegistryPush: {length: 48}, + StateRegistryPull: {length: 48}, + StateRegistrySecret: {length: 48}, + StateGitPush: {length: 24}, + StateGitPull: {length: 24}, + StateLogging: {length: 24}, +} + +func GetSecret(selector SecretSelector) string { + message.Debugf("config.GetSecret(%v)", selector) + if match, ok := selectors[selector]; ok { + return match.computed + } + return "" +} + +func initSecrets() { + message.Debug("config.initSecrets()") + for filter, selector := range selectors { + output, err := loadSecret(filter, selector.length) + if err != nil { + message.Debug(err) + } else { + selector.valid = true + selector.computed = output + selectors[filter] = selector + } + } +} + +func loadSecret(filter SecretSelector, length int) (string, error) { + message.Debugf("config.loadSecret(%v, %v)", filter, length) + if state.Secret == "" { + return "", fmt.Errorf("invalid root secret in the ZarfState") + } + hash := sha256.New() + text := fmt.Sprintf("%s:%s", filter, state.Secret) + hash.Write([]byte(text)) + output := hex.EncodeToString(hash.Sum(nil))[:length] + + if output != "" { + return output, nil + } else { + return "", fmt.Errorf("unable to generate secret for %s", filter) + } +} diff --git a/cli/config/types.go b/cli/config/types.go index 6c172d5d5e..722ab95b74 100644 --- a/cli/config/types.go +++ b/cli/config/types.go @@ -1,46 +1,63 @@ package config +// ZarfFile defines a file to deploy type ZarfFile struct { Source string `yaml:"source"` Shasum string `yaml:"shasum,omitempty"` Target string `yaml:"target"` Executable bool `yaml:"executable,omitempty"` Symlinks []string `yaml:"symlinks,omitempty"` - Template bool `yaml:"template,omitempty"` } +// ZarfChart defines a helm chart to be deployed type ZarfChart struct { - Name string `yaml:"name"` - Url string `yaml:"url"` - Version string `yaml:"version"` + Name string `yaml:"name"` + Url string `yaml:"url"` + Version string `yaml:"version"` + Namespace string `yaml:"namespace"` + ValuesFiles []string `yaml:"valuesFiles,omitempty"` + GitPath string `yaml:"gitPath,omitempty"` } +// ZarfComponent is the primary functional grouping of assets to deploy by zarf type ZarfComponent struct { - Name string `yaml:"name"` - Description string `yaml:"description,omitempty"` - Default bool `yaml:"default,omitempty"` - Required bool `yaml:"required,omitempty"` - Files []ZarfFile `yaml:"files,omitempty"` - ManifestsPath string `yaml:"manifests,omitempty"` - Images []string `yaml:"images,omitempty"` - Charts []ZarfChart `yaml:"charts,omitempty"` - Repos []string `yaml:"repos,omitempty"` - Scripts ZarfComponentScripts `yaml:"scripts,omitempty"` + Name string `yaml:"name"` + Description string `yaml:"description,omitempty"` + Default bool `yaml:"default,omitempty"` + Required bool `yaml:"required,omitempty"` + Files []ZarfFile `yaml:"files,omitempty"` + Charts []ZarfChart `yaml:"charts,omitempty"` + Manifests []ZarfManifest `yaml:"manifests,omitempty"` + Images []string `yaml:"images,omitempty"` + Repos []string `yaml:"repos,omitempty"` + Scripts ZarfComponentScripts `yaml:"scripts,omitempty"` } +// ZarfManifest defines raw manifests Zarf will deploy as a helm chart +type ZarfManifest struct { + Name string `yaml:"name"` + DefaultNamespace string `yaml:"namespace,omitempty"` + Files []string `yaml:"files"` +} + +// ZarfComponentScripts are scripts that run before or after a component is deployed type ZarfComponentScripts struct { Retry bool `yaml:"retry,omitempty"` Before []string `yaml:"before,omitempty"` After []string `yaml:"after,omitempty"` } +// ZarfMetadata lists information about the current ZarfPackage type ZarfMetadata struct { Name string `yaml:"name,omitempty"` Description string `yaml:"description,omitempty"` Version string `yaml:"version,omitempty"` + Url string `yaml:"url:omitempty"` + Image string `yaml:"image:omitempty"` Uncompressed bool `yaml:"uncompressed,omitempty"` } +// ZarfContainerTarget defines the destination info for a ZarfData target type ZarfContainerTarget struct { Namespace string `yaml:"namespace"` Selector string `yaml:"selector"` @@ -48,11 +65,13 @@ type ZarfContainerTarget struct { Path string `yaml:"path"` } +// ZarfData is a data-injection definition type ZarfData struct { Source string `yaml:"source"` Target ZarfContainerTarget `yaml:"target"` } +// ZarfBuildData is written during the packager.Create() operation to track details of the created package type ZarfBuildData struct { Terminal string `yaml:"terminal"` User string `yaml:"user"` @@ -60,19 +79,39 @@ type ZarfBuildData struct { Version string `yaml:"string"` } +// ZarfPackage the top-level structure of a Zarf config file type ZarfPackage struct { Kind string `yaml:"kind,omitempty"` Metadata ZarfMetadata `yaml:"metadata,omitempty"` Build ZarfBuildData `yaml:"build,omitempty"` Data []ZarfData `yaml:"data,omitempty"` Components []ZarfComponent `yaml:"components,omitempty"` + Seed []string `yaml:"seed,omitempty"` } +// ZarfState is maintained as a secret in the Zarf namespace to track Zarf init data type ZarfState struct { - Kind string `yaml:"kind"` - TLS struct { - CertPublicPath string `yaml:"certPublicPath"` - CertPrivatePath string `yaml:"certPrivatePath"` - Host string `yaml:"host"` - } `yaml:"tls"` + ZarfAppliance bool `json:"zarfAppliance"` + Distro string `json:"distro"` + StorageClass string `json:"storageClass"` + Secret string `json:"secret"` + Registry struct { + SeedType string `json:"seedType"` + NodePort string `json:"nodePort"` + } `json:"registry"` +} + +// TLSConfig tracks the user-defined options for TLS cert generation +type TLSConfig struct { + CertPublicPath string `yaml:"certPublicPath"` + CertPrivatePath string `yaml:"certPrivatePath"` + Host string `yaml:"host"` +} + +// ZarfDeployOptions tracks the user-defined preferences during a package deployment +type ZarfDeployOptions struct { + PackagePath string + Confirm bool + Components string + ApplianceMode bool } diff --git a/cli/internal/git/checkout.go b/cli/internal/git/checkout.go index 0bfd597116..3fe9ab0294 100644 --- a/cli/internal/git/checkout.go +++ b/cli/internal/git/checkout.go @@ -1,10 +1,10 @@ package git import ( + "github.com/defenseunicorns/zarf/cli/internal/message" "github.com/go-git/go-git/v5" "github.com/go-git/go-git/v5/plumbing" "github.com/go-git/go-git/v5/plumbing/object" - "github.com/sirupsen/logrus" ) // CheckoutTag performs a `git checkout` of the provided tag to a detached HEAD @@ -16,25 +16,18 @@ func CheckoutTag(path string, tag string) { } // CheckoutTagAsBranch performs a `git checkout` of the provided tag but rather -// than checking out to a detatched head, checks out to the provided branch ref +// than checking out to a detached head, checks out to the provided branch ref // It will delete the branch provided if it exists func CheckoutTagAsBranch(path string, tag string, branch plumbing.ReferenceName) { - logContext := logrus.WithFields(logrus.Fields{ - "Path": path, - "Tag": tag, - "Branch": branch.String(), - }) - + message.Debugf("Checkout tag %s as branch %s for %s", tag, branch.String(), path) repo, err := git.PlainOpen(path) if err != nil { - logContext.Debug(err) - logContext.Fatal("Not a valid git repo or unable to open") + message.Fatal(err, "Not a valid git repo or unable to open") } tagRef, err := repo.Tag(tag) if err != nil { - logContext.Debug(err) - logContext.Fatal("Failed to locate tag in repository.") + message.Fatal(err, "Failed to locate tag in repository.") } checkoutHashAsBranch(path, tagRef.Hash(), branch) } @@ -43,24 +36,18 @@ func CheckoutTagAsBranch(path string, tag string, branch plumbing.ReferenceName) // with the provided hash // It will delete the branch provided if it exists func checkoutHashAsBranch(path string, hash plumbing.Hash, branch plumbing.ReferenceName) { - logContext := logrus.WithFields(logrus.Fields{ - "Path": path, - "Hash": hash.String(), - "Branch": branch.String(), - }) + message.Debugf("Checkout hash %s as branch %s for %s", hash.String(), branch.String(), path) - DeleteBranchIfExists(path, branch) + _ = deleteBranchIfExists(path, branch) repo, err := git.PlainOpen(path) if err != nil { - logContext.Debug(err) - logContext.Fatal("Not a valid git repo or unable to open") + message.Fatal(err, "Not a valid git repo or unable to open") } objRef, err := repo.Object(plumbing.AnyObject, hash) if err != nil { - logContext.Debug(err) - logContext.Fatal("An error occurred when getting the repo's object reference") + message.Fatal(err, "An error occurred when getting the repo's object reference") } var commitHash plumbing.Hash @@ -72,8 +59,7 @@ func checkoutHashAsBranch(path string, hash plumbing.Hash, branch plumbing.Refer default: // This shouldn't ever hit, but we should at least log it if someday it // does get hit - logContext.Debug("Unsupported tag hash type: " + objRef.Type().String()) - logContext.Fatal("Checkout failed. Hash type not supported.") + message.Fatalf(err, "Checkout failed. Hash type %s not supported.", objRef.Type().String()) } options := &git.CheckoutOptions{ @@ -87,28 +73,23 @@ func checkoutHashAsBranch(path string, hash plumbing.Hash, branch plumbing.Refer // checkout performs a `git checkout` on the path provided using the options provided // It assumes the caller knows what to do and does not perform any safety checks func checkout(path string, checkoutOptions *git.CheckoutOptions) { - logContext := logrus.WithFields(logrus.Fields{ - "Path": path, - }) + message.Debugf("Git checkout %s", path) // Open the given repo repo, err := git.PlainOpen(path) if err != nil { - logContext.Debug(err) - logContext.Fatal("Not a valid git repo or unable to open") + message.Fatal(err, "Not a valid git repo or unable to open") } // Get the working tree so we can change refs tree, err := repo.Worktree() if err != nil { - logContext.Debug(err) - logContext.Fatal("Unable to load the git repo") + message.Fatal(err, "Unable to load the git repo") } // Perform the checkout err = tree.Checkout(checkoutOptions) if err != nil { - logContext.Debug(err) - logContext.Fatal("Unable to perform checkout") + message.Fatal(err, "Unable to perform checkout") } } diff --git a/cli/internal/git/fetch.go b/cli/internal/git/fetch.go index 322c8207de..ec883506b2 100644 --- a/cli/internal/git/fetch.go +++ b/cli/internal/git/fetch.go @@ -3,44 +3,32 @@ package git import ( "path" + "github.com/defenseunicorns/zarf/cli/internal/message" "github.com/go-git/go-git/v5" goConfig "github.com/go-git/go-git/v5/config" - "github.com/sirupsen/logrus" ) -// FetchTag performs a `git fetch` of _only_ the provided tag -func FetchTag(gitDirectory string, tag string) { - logContext := logrus.WithFields(logrus.Fields{ - // Base should be similar to the repo name - "Repo": path.Base(gitDirectory), - }) +// fetchTag performs a `git fetch` of _only_ the provided tag +func fetchTag(gitDirectory string, tag string) { + message.Debugf("Fetch git tag %s from repo %s", tag, path.Base(gitDirectory)) repo, err := git.PlainOpen(gitDirectory) if err != nil { - logContext.Fatal(err) + message.Fatal(err, "Unable to load the git repo") } remotes, err := repo.Remotes() // There should never be no remotes, but it's easier to account for than // let be a bug later if err != nil || len(remotes) == 0 { - if err != nil { - logContext.Debug(err) - } - logContext.Fatal("Failed to identify remotes.") + message.Fatal(err, "Failed to identify remotes.") } gitUrl := remotes[0].Config().URLs[0] - // Now that we have an exact match, we may as well update the logger, - // especially since nothing has been logged to this point that hasn't been - // fatal. - logContext = logrus.WithFields(logrus.Fields{ - "Remote": gitUrl, - }) + message.Debugf("Attempting to find tag: %s for %s", tag, gitUrl) gitCred := FindAuthForHost(gitUrl) - logContext.Debug("Attempting to find tag: " + tag) fetchOptions := &git.FetchOptions{ RemoteName: onlineRemoteName, RefSpecs: []goConfig.RefSpec{ @@ -55,11 +43,8 @@ func FetchTag(gitDirectory string, tag string) { err = repo.Fetch(fetchOptions) if err == git.ErrTagExists { - logContext.Info("Tag already fetched") + message.Debug("Tag already fetched") } else if err != nil { - logContext.Debug(err) - logContext.Fatal("Not a valid tag or unable to fetch") + message.Fatal(err, "Not a valid tag or unable to fetch") } - - logContext.Info("Git tag fetched") } diff --git a/cli/internal/git/pull.go b/cli/internal/git/pull.go index 15bd743abd..5e56137ce2 100644 --- a/cli/internal/git/pull.go +++ b/cli/internal/git/pull.go @@ -1,12 +1,10 @@ package git import ( - "os" - + "github.com/defenseunicorns/zarf/cli/internal/message" "github.com/defenseunicorns/zarf/cli/internal/utils" "github.com/go-git/go-git/v5" "github.com/go-git/go-git/v5/plumbing" - "github.com/sirupsen/logrus" "strings" ) @@ -14,9 +12,9 @@ import ( const onlineRemoteName = "online-upstream" func DownloadRepoToTemp(gitUrl string) string { - path := utils.MakeTempDir() + path, _ := utils.MakeTempDir() // If downloading to temp, grab all tags since the repo isn't being - // packaged anyways and it saves us from having to fetch the tags + // packaged anyway, and it saves us from having to fetch the tags // later if we need them pull(gitUrl, path) return path @@ -29,10 +27,8 @@ func Pull(gitUrl string, targetFolder string) string { } func pull(gitUrl string, targetFolder string) { - logContext := logrus.WithFields(logrus.Fields{ - "Remote": gitUrl, - }) - logContext.Info("Processing git repo") + spinner := message.NewProgressSpinner("Processing git repo %s", gitUrl) + defer spinner.Stop() gitCred := FindAuthForHost(gitUrl) @@ -40,7 +36,7 @@ func pull(gitUrl string, targetFolder string) { fetchAllTags := len(matches) == 1 cloneOptions := &git.CloneOptions{ URL: matches[0], - Progress: os.Stdout, + Progress: spinner, RemoteName: onlineRemoteName, } @@ -57,10 +53,9 @@ func pull(gitUrl string, targetFolder string) { repo, err := git.PlainClone(targetFolder, false, cloneOptions) if err == git.ErrRepositoryAlreadyExists { - logContext.Info("Repo already cloned") + spinner.Debugf("Repo already cloned") } else if err != nil { - logContext.Debug(err) - logContext.Fatal("Not a valid git repo or unable to clone") + spinner.Fatalf(err, "Not a valid git repo or unable to clone") } if !fetchAllTags { @@ -72,22 +67,21 @@ func pull(gitUrl string, targetFolder string) { if err != nil { // No repo head available - logContext.Debug(err) - logContext.Warn("Failed to identify repo head. Tag will be pushed to 'master'.") + spinner.Errorf(err, "Failed to identify repo head. Tag will be pushed to 'master'.") } else if head.Name().IsBranch() { // Valid repo head and it is a branch trunkBranchName = head.Name() } else { // Valid repo head but not a branch - logContext.Warn("No branch found for this repo head. Tag will be pushed to 'master'.") + spinner.Errorf(nil, "No branch found for this repo head. Tag will be pushed to 'master'.") } - RemoveLocalBranchRefs(targetFolder) - RemoveOnlineRemoteRefs(targetFolder) + removeLocalBranchRefs(targetFolder) + removeOnlineRemoteRefs(targetFolder) - FetchTag(targetFolder, tag) + fetchTag(targetFolder, tag) CheckoutTagAsBranch(targetFolder, tag, trunkBranchName) - } - logContext.Info("Git repo synced") + } + spinner.Success() } diff --git a/cli/internal/git/push.go b/cli/internal/git/push.go index 9b29f0c977..f16db5f8d7 100644 --- a/cli/internal/git/push.go +++ b/cli/internal/git/push.go @@ -1,44 +1,61 @@ package git import ( - "os" + "fmt" "github.com/defenseunicorns/zarf/cli/config" + "github.com/defenseunicorns/zarf/cli/internal/k8s" + "github.com/defenseunicorns/zarf/cli/internal/message" "github.com/defenseunicorns/zarf/cli/internal/utils" "github.com/go-git/go-git/v5" goConfig "github.com/go-git/go-git/v5/config" - "github.com/sirupsen/logrus" + "github.com/go-git/go-git/v5/plumbing/transport/http" ) const offlineRemoteName = "offline-downstream" const onlineRemoteRefPrefix = "refs/remotes/" + onlineRemoteName + "/" func PushAllDirectories(localPath string) { - paths := utils.ListDirectories(localPath) + // Establish a git tunnel to send the repos + tunnel := k8s.NewZarfTunnel() + tunnel.Connect(k8s.ZarfGit, false) + + paths, err := utils.ListDirectories(localPath) + if err != nil { + message.Fatalf(err, "unable to list the %s directory", localPath) + } + + spinner := message.NewProgressSpinner("Processing %d git repos", len(paths)) + defer spinner.Stop() + for _, path := range paths { - push(path) + spinner.Updatef("Pushing git repo %s", localPath) + if err := push(path, spinner); err != nil { + spinner.Fatalf(err, "Unable to push the git repo %s", localPath) + } } -} -func push(localPath string) { + spinner.Success() + tunnel.Close() +} - logContext := logrus.WithField("repo", localPath) - logContext.Info("Processing git repo") +func push(localPath string, spinner *message.Spinner) error { // Open the given repo repo, err := git.PlainOpen(localPath) if err != nil { - logContext.Fatal("Not a valid git repo or unable to open") + return fmt.Errorf("not a valid git repo or unable to open: %w", err) } // Get the upstream URL remote, err := repo.Remote(onlineRemoteName) if err != nil { - logContext.Warn("Unable to find the git remote") - return + return fmt.Errorf("unable to find the git remote: %w", err) + } remoteUrl := remote.Config().URLs[0] - targetUrl := transformURL("https://"+config.GetTargetEndpoint(), remoteUrl) + targetHost := fmt.Sprintf("http://%s:%d", config.IPV4Localhost, k8s.PortGit) + targetUrl := transformURL(targetHost, remoteUrl) _, err = repo.CreateRemote(&goConfig.RemoteConfig{ Name: offlineRemoteName, @@ -46,23 +63,26 @@ func push(localPath string) { }) if err != nil { - logContext.Debug(err) - logContext.Fatal("Failed to create offline remote") + return fmt.Errorf("failed to create offline remote: %w", err) } - gitCred := FindAuthForHost(config.GetTargetEndpoint()) - - pushContext := logContext.WithField("target", targetUrl) + gitCred := http.BasicAuth{ + Username: config.ZarfGitPushUser, + Password: config.GetSecret(config.StateGitPush), + } // Since we are pushing HEAD:refs/heads/master on deployment, leaving // duplicates of the HEAD ref (ex. refs/heads/master, // refs/remotes/online-upstream/master, will cause the push to fail) - removedRefs := RemoveHeadCopies(localPath) + removedRefs, err := removeHeadCopies(localPath) + if err != nil { + return fmt.Errorf("unable to remove unused git refs from the repo: %w", err) + } err = repo.Push(&git.PushOptions{ RemoteName: offlineRemoteName, - Auth: &gitCred.Auth, - Progress: os.Stdout, + Auth: &gitCred, + Progress: spinner, // If a provided refspec doesn't push anything, it is just ignored RefSpecs: []goConfig.RefSpec{ "refs/heads/*:refs/heads/*", @@ -72,15 +92,14 @@ func push(localPath string) { }) if err == git.NoErrAlreadyUpToDate { - pushContext.Info("Repo already up-to-date") + spinner.Debugf("Repo already up-to-date") } else if err != nil { - pushContext.Debug(err) - pushContext.Warn("Unable to push repo to the gitops service") - } else { - pushContext.Info("Repo updated") + return fmt.Errorf("unable to push repo to the gitops service: %w", err) } // Add back the refs we removed just incase this push isn't the last thing // being run and a later task needs to reference them. - AddRefs(localPath, removedRefs) + addRefs(localPath, removedRefs) + + return nil } diff --git a/cli/internal/git/utils.go b/cli/internal/git/utils.go index ce07bdb2ac..a2853e36a1 100644 --- a/cli/internal/git/utils.go +++ b/cli/internal/git/utils.go @@ -2,17 +2,16 @@ package git import ( "bufio" + "fmt" "net/url" "os" "regexp" "strings" - "github.com/defenseunicorns/zarf/cli/config" - "github.com/defenseunicorns/zarf/cli/internal/utils" + "github.com/defenseunicorns/zarf/cli/internal/message" "github.com/go-git/go-git/v5" "github.com/go-git/go-git/v5/plumbing" "github.com/go-git/go-git/v5/plumbing/transport/http" - "github.com/sirupsen/logrus" ) type Credential struct { @@ -24,7 +23,7 @@ func MutateGitUrlsInText(host string, text string) string { extractPathRegex := regexp.MustCompilePOSIX(`https?://[^/]+/(.*\.git)`) output := extractPathRegex.ReplaceAllStringFunc(text, func(match string) string { if strings.Contains(match, "/zarf-git-user/") { - logrus.WithField("Match", match).Warn("This url seems to have been previously patched.") + message.Warnf("%s seems to have been previously patched.", match) return match } return transformURL(host, match) @@ -40,10 +39,7 @@ func transformURLtoRepoName(url string) string { func transformURL(baseUrl string, url string) string { replaced := transformURLtoRepoName(url) output := baseUrl + "/zarf-git-user/" + replaced - logrus.WithFields(logrus.Fields{ - "Old": url, - "New": output, - }).Info("Transformed Git URL") + message.Debugf("Rewrite git URL: %s -> %s", url, output) return output } @@ -57,7 +53,12 @@ func credentialParser() []Credential { var credentials []Credential credentialsFile, _ := os.Open(credentialsPath) - defer credentialsFile.Close() + defer func(credentialsFile *os.File) { + err := credentialsFile.Close() + if err != nil { + message.Debugf("Unable to load an existing git credentials file: %w", err) + } + }(credentialsFile) scanner := bufio.NewScanner(credentialsFile) for scanner.Scan() { @@ -98,71 +99,9 @@ func FindAuthForHost(baseUrl string) Credential { return matchedCred } -func GetOrCreateZarfSecret() string { - var gitSecret string - - credentials := FindAuthForHost(config.GetTargetEndpoint()) - - if (credentials == Credential{}) { - gitSecret = CredentialsGenerator() - } else { - gitSecret = credentials.Auth.Password - } - - return gitSecret -} - -func CredentialsGenerator() string { - - // Get a random secret for use in the cluster - gitSecret := utils.RandomString(28) - credentialsPath := credentialFilePath() - - // Prevent duplicates by purging the git creds file~ - _ = os.Remove(credentialsPath) - - credentialsFile, err := os.OpenFile(credentialsPath, os.O_CREATE|os.O_WRONLY, 0600) - if err != nil { - logrus.Debug(err) - logrus.Fatal("Unable to access the git credentials file") - } - defer credentialsFile.Close() - - // Needed by zarf to do repo pushes - zarfUrl := url.URL{ - Scheme: "https", - User: url.UserPassword(config.ZarfGitUser, gitSecret), - Host: config.GetTargetEndpoint(), - } - - credentialsText := zarfUrl.String() + "\n" - - // Write the entry to the file - _, err = credentialsFile.WriteString(credentialsText) - if err != nil { - logrus.Debug(err) - logrus.Fatal("Unable to update the git credentials file") - } - - // Save the change - err = credentialsFile.Sync() - if err != nil { - logrus.Debug(err) - logrus.Fatal("Unable to update the git credentials file") - } - - return gitSecret -} - -// GetTaggedUrl builds a URL of the repo@tag format -// It returns a string of format repo@tag -func GetTaggedUrl(gitUrl string, gitTag string) string { - return gitUrl + "@" + gitTag -} - -// RemoveLocalBranchRefs removes all refs that are local branches +// removeLocalBranchRefs removes all refs that are local branches // It returns a slice of references deleted -func RemoveLocalBranchRefs(gitDirectory string) []*plumbing.Reference { +func removeLocalBranchRefs(gitDirectory string) ([]*plumbing.Reference, error) { return removeReferences( gitDirectory, func(ref *plumbing.Reference) bool { @@ -171,9 +110,9 @@ func RemoveLocalBranchRefs(gitDirectory string) []*plumbing.Reference { ) } -// RemoveOnlineRemoteRefs removes all refs pointing to the online-upstream +// removeOnlineRemoteRefs removes all refs pointing to the online-upstream // It returns a slice of references deleted -func RemoveOnlineRemoteRefs(gitDirectory string) []*plumbing.Reference { +func removeOnlineRemoteRefs(gitDirectory string) ([]*plumbing.Reference, error) { return removeReferences( gitDirectory, func(ref *plumbing.Reference) bool { @@ -182,20 +121,18 @@ func RemoveOnlineRemoteRefs(gitDirectory string) []*plumbing.Reference { ) } -// RemoveHeadCopies removes any refs that aren't HEAD but have the same hash +// removeHeadCopies removes any refs that aren't HEAD but have the same hash // It returns a slice of references deleted -func RemoveHeadCopies(gitDirectory string) []*plumbing.Reference { - logContext := logrus.WithField("Repo", gitDirectory) +func removeHeadCopies(gitDirectory string) ([]*plumbing.Reference, error) { + message.Debugf("Remove head copies for %s", gitDirectory) repo, err := git.PlainOpen(gitDirectory) if err != nil { - logContext.Debug(err) - logContext.Fatal("Not a valid git repo or unable to open") + return nil, fmt.Errorf("not a valid git repo or unable to open: %w", err) } head, err := repo.Head() if err != nil { - logContext.Debug(err) - logContext.Fatal("Failed to identify references when getting the repo's head") + return nil, fmt.Errorf("failed to identify references when getting the repo's head: %w", err) } headHash := head.Hash().String() @@ -214,27 +151,24 @@ func RemoveHeadCopies(gitDirectory string) []*plumbing.Reference { func removeReferences( gitDirectory string, shouldRemove func(*plumbing.Reference) bool, -) []*plumbing.Reference { - logContext := logrus.WithField("Repo", gitDirectory) +) ([]*plumbing.Reference, error) { + message.Debugf("Remove git references %s", gitDirectory) repo, err := git.PlainOpen(gitDirectory) if err != nil { - logContext.Debug(err) - logContext.Fatal("Not a valid git repo or unable to open") + return nil, fmt.Errorf("not a valid git repo or unable to open: %w", err) } references, err := repo.References() if err != nil { - logContext.Debug(err) - logContext.Fatal("Failed to identify references when getting the repo's references") + return nil, fmt.Errorf("failed to identify references when getting the repo's references: %w", err) } head, err := repo.Head() if err != nil { - logContext.Debug(err) - logContext.Fatal("Failed to identify head") + return nil, fmt.Errorf("failed to identify head: %w", err) } - removedRefs := []*plumbing.Reference{} + var removedRefs []*plumbing.Reference err = references.ForEach(func(ref *plumbing.Reference) error { refIsNotHeadOrHeadTarget := ref.Name() != plumbing.HEAD && ref.Name() != head.Name() // Run shouldRemove inline here to take advantage of short circuit @@ -250,58 +184,51 @@ func removeReferences( }) if err != nil { - logContext.Debug(err) - logContext.Fatal("Failed to remove references") + return nil, fmt.Errorf("failed to remove references: %w", err) } - return removedRefs + return removedRefs, nil } -// AddRefs adds a provided arbitrary list of references to a repo +// addRefs adds a provided arbitrary list of references to a repo // It is intended to be used with references returned by a Remove function -func AddRefs(gitDirectory string, refs []*plumbing.Reference) { - logContext := logrus.WithField("Repo", gitDirectory) +func addRefs(gitDirectory string, refs []*plumbing.Reference) error { + message.Debugf("Add git refs %s", gitDirectory) repo, err := git.PlainOpen(gitDirectory) if err != nil { - logContext.Debug(err) - logContext.Fatal("Not a valid git repo or unable to open") + return fmt.Errorf("not a valid git repo or unable to open: %w", err) } for _, ref := range refs { err = repo.Storer.SetReference(ref) if err != nil { - logContext.Debug(err) - logContext.Fatal("Failed to add references") + return fmt.Errorf("failed to add references: %w", err) } } + + return nil } -// DeleteBranchIfExists ensures the provided branch name does not exist -func DeleteBranchIfExists(gitDirectory string, branchName plumbing.ReferenceName) { - logContext := logrus.WithFields(logrus.Fields{ - "Repo": gitDirectory, - "Branch": branchName.String, - }) +// deleteBranchIfExists ensures the provided branch name does not exist +func deleteBranchIfExists(gitDirectory string, branchName plumbing.ReferenceName) error { + message.Debugf("Delete branch %s for %s if it exists", branchName.String(), gitDirectory) repo, err := git.PlainOpen(gitDirectory) if err != nil { - logContext.Debug(err) - logContext.Fatal("Not a valid git repo or unable to open") + return fmt.Errorf("not a valid git repo or unable to open: %w", err) } // Deletes the branch by name err = repo.DeleteBranch(branchName.Short()) if err != nil && err != git.ErrBranchNotFound { - logContext.Debug(err) - logContext.Fatal("Failed to delete branch") + return fmt.Errorf("failed to delete branch: %w", err) } // Delete reference too err = repo.Storer.RemoveReference(branchName) if err != nil && err != git.ErrInvalidReference { - logContext.Debug(err) - logContext.Fatal("Failed to delete branch reference") + return fmt.Errorf("failed to delete branch reference: %w", err) } - logContext.Info("Branch deleted") + return nil } diff --git a/cli/internal/helm/chart.go b/cli/internal/helm/chart.go new file mode 100644 index 0000000000..88ebca1b72 --- /dev/null +++ b/cli/internal/helm/chart.go @@ -0,0 +1,315 @@ +package helm + +import ( + "bytes" + "fmt" + "io/ioutil" + "os" + "time" + + "github.com/defenseunicorns/zarf/cli/config" + "github.com/defenseunicorns/zarf/cli/internal/k8s" + "github.com/defenseunicorns/zarf/cli/internal/message" + "github.com/defenseunicorns/zarf/cli/internal/utils" + "helm.sh/helm/v3/pkg/action" + "helm.sh/helm/v3/pkg/chart" + "helm.sh/helm/v3/pkg/release" + "helm.sh/helm/v3/pkg/storage/driver" +) + +type ChartOptions struct { + BasePath string + Chart config.ZarfChart + ChartOverride *chart.Chart + ValueOverride map[string]interface{} + Images []string +} + +type renderer struct { + images []string + namespaces []string +} + +// InstallOrUpgradeChart performs a helm install of the given chart +func InstallOrUpgradeChart(options ChartOptions) { + spinner := message.NewProgressSpinner("Processing helm chart %s:%s from %s", + options.Chart.Name, + options.Chart.Version, + options.Chart.Url) + defer spinner.Stop() + + var output *release.Release + + actionConfig, err := createActionConfig(options.Chart.Namespace) + + // Setup K8s connection + if err != nil { + spinner.Fatalf(err, "Unable to initialize the K8s client") + } + + attempt := 0 + for { + attempt++ + + spinner.Updatef("Attempt %d of 3 to install chart", attempt) + histClient := action.NewHistory(actionConfig) + histClient.Max = 1 + + if attempt > 2 { + // On total failure try to rollback or uninstall + if histClient.Version > 1 { + spinner.Updatef("Performing chart rollback") + _ = rollbackChart(actionConfig, options.Chart.Name) + } else { + spinner.Updatef("Performing chart uninstall") + _, _ = uninstallChart(actionConfig, options.Chart.Name) + } + spinner.Errorf(nil, "Unable to complete helm chart install/upgrade") + break + } + + spinner.Updatef("Checking for existing helm deployment") + if _, histErr := histClient.Run(options.Chart.Name); histErr == driver.ErrReleaseNotFound { + // No prior release, try to install it + spinner.Updatef("Attempting chart installation") + output, err = installChart(actionConfig, options) + } else if err != nil { + // Something broke + spinner.Fatalf(err, "Unable to verify the chart installation status") + } else { + // Otherwise, there is a prior release so upgrade it + spinner.Updatef("Attempting chart upgrade") + output, err = upgradeChart(actionConfig, options) + } + + if err != nil { + spinner.Debugf(err.Error()) + // Simply wait for dust to settle and try again + time.Sleep(10 * time.Second) + } else { + spinner.Debugf(output.Info.Description) + spinner.Success() + break + } + + } +} + +func GenerateChart(basePath string, manifest config.ZarfManifest, images []string) { + spinner := message.NewProgressSpinner("Starting helm chart generation %s", manifest.Name) + defer spinner.Stop() + + // Use timestamp to help make a valid semver + now := time.Now() + + // Generate a new chart + tmpChart := new(chart.Chart) + tmpChart.Metadata = new(chart.Metadata) + tmpChart.Metadata.Name = fmt.Sprintf("zarf-%s", manifest.Name) + // This is fun, increment forward in a semver-way using epoch so helm doesn't cry + tmpChart.Metadata.Version = fmt.Sprintf("0.1.%d", now.Unix()) + tmpChart.Metadata.APIVersion = chart.APIVersionV1 + + // Add the manifest files so helm does its thing + for _, file := range manifest.Files { + spinner.Updatef("Processing %s", file) + manifest := fmt.Sprintf("%s/%s", basePath, file) + data, err := ioutil.ReadFile(manifest) + if err != nil { + spinner.Fatalf(err, "Unable to read the manifest file contents") + } + tmpChart.Templates = append(tmpChart.Templates, &chart.File{Name: manifest, Data: data}) + } + + if manifest.DefaultNamespace == "" { + // Helm gets sad when you don't provide a namespace even though we aren't using helm templating + manifest.DefaultNamespace = "zarf" + } + + // Generate the struct to pass to InstallOrUpgradeChart() + options := ChartOptions{ + BasePath: basePath, + Chart: config.ZarfChart{ + Name: tmpChart.Metadata.Name, + Version: tmpChart.Metadata.Version, + Namespace: manifest.DefaultNamespace, + }, + ChartOverride: tmpChart, + // We don't have any values because we do not expose them in the zarf.yaml currently + ValueOverride: map[string]interface{}{}, + // Images needed for eventual post-render templating + Images: images, + } + + spinner.Success() + + InstallOrUpgradeChart(options) +} + +func installChart(actionConfig *action.Configuration, options ChartOptions) (*release.Release, error) { + // Bind the helm action + client := action.NewInstall(actionConfig) + + // Let each chart run for 5 minutes + client.Timeout = 15 * time.Minute + + client.Wait = true + + // We need to include CRDs or operator installations will fail spectacularly + client.SkipCRDs = false + + // Must be unique per-namespace and < 53 characters. @todo: restrict helm loadedChart name to this + client.ReleaseName = options.Chart.Name + + // Namespace must be specified + client.Namespace = options.Chart.Namespace + + // Post-processing our manifests for reasons.... + client.PostRenderer = NewRenderer(options.Images, options.Chart.Namespace) + + loadedChart, chartValues, err := loadChartData(options) + if err != nil { + return nil, fmt.Errorf("unable to load chart data: %w", err) + } + + // Perform the loadedChart installation + return client.Run(loadedChart, chartValues) +} + +func upgradeChart(actionConfig *action.Configuration, options ChartOptions) (*release.Release, error) { + client := action.NewUpgrade(actionConfig) + + // Let each chart run for 5 minutes + client.Timeout = 10 * time.Minute + + client.Wait = true + + client.SkipCRDs = true + + // Namespace must be specified + client.Namespace = options.Chart.Namespace + + // Post-processing our manifests for reasons.... + client.PostRenderer = NewRenderer(options.Images, options.Chart.Namespace) + + loadedChart, chartValues, err := loadChartData(options) + if err != nil { + return nil, fmt.Errorf("unable to load chart data: %w", err) + } + + // Perform the loadedChart upgrade + return client.Run(options.Chart.Name, loadedChart, chartValues) +} + +func rollbackChart(actionConfig *action.Configuration, name string) error { + client := action.NewRollback(actionConfig) + client.CleanupOnFail = true + client.Force = true + client.Wait = true + client.Timeout = 1 * time.Minute + return client.Run(name) +} + +func uninstallChart(actionConfig *action.Configuration, name string) (*release.UninstallReleaseResponse, error) { + client := action.NewUninstall(actionConfig) + client.KeepHistory = false + client.Timeout = 3 * time.Minute + client.Wait = true + return client.Run(name) +} + +func loadChartData(options ChartOptions) (*chart.Chart, map[string]interface{}, error) { + var ( + loadedChart *chart.Chart + chartValues map[string]interface{} + err error + ) + + if options.ChartOverride == nil || options.ValueOverride == nil { + // If there is no override, get the chart and values info + loadedChart, err = loadChartFromTarball(options) + if err != nil { + return nil, nil, fmt.Errorf("unable to load chart tarball: %w", err) + } + + chartValues, err = parseChartValues(options) + if err != nil { + return loadedChart, nil, fmt.Errorf("unable to parse chart values: %w", err) + } + message.Debug(chartValues) + } else { + // Otherwise, use the overrides instead + loadedChart = options.ChartOverride + chartValues = options.ValueOverride + } + + return loadedChart, chartValues, nil +} + +func NewRenderer(images []string, namespace string) *renderer { + return &renderer{ + images: images, + namespaces: []string{namespace}, + } +} + +func (r *renderer) Run(renderedManifests *bytes.Buffer) (*bytes.Buffer, error) { + message.Debug("Post-rendering helm chart") + // This is very low cost and consistent for how we replace elsewhere, also good for debugging + tempDir, _ := utils.MakeTempDir() + path := tempDir + "/chart.yaml" + + if err := utils.WriteFile(path, renderedManifests.Bytes()); err != nil { + return nil, fmt.Errorf("unable to write the post-render file for the helm chart") + } + + // Run the template engine against the chart output + k8s.ProcessYamlFilesInPath(tempDir, r.images) + + // Read back the final file contents + buff, err := os.ReadFile(path) + if err != nil { + return nil, fmt.Errorf("error reading temporary post-rendered helm chart: %w", err) + } + + message.Debug(string(buff)) + + // Try to parse the yaml into unstructured data + resources, err := k8s.SplitYAML(buff) + if err != nil { + // On error only drop a warning + message.Errorf(err, "Problem parsing post-render manifest data") + } else { + // Otherwise, loop over the resources, + for _, resource := range resources { + // grab the namespace, + namespace := resource.GetNamespace() + message.Debugf("Found namespace %s", namespace) + // and append to the list if it's unique + if namespace != "" && !contains(r.namespaces, namespace) { + r.namespaces = append(r.namespaces, namespace) + } + } + } + + for _, namespace := range r.namespaces { + if err := k8s.ReplaceRegistrySecret(namespace); err != nil { + message.Error(err, "Unable to update the registry secret") + } + } + + // Cleanup the temp file + _ = os.RemoveAll(tempDir) + + // Send the bytes back to helm + return bytes.NewBuffer(buff), nil +} + +func contains(haystack []string, needle string) bool { + for _, hay := range haystack { + if hay == needle { + return true + } + } + return false +} diff --git a/cli/internal/helm/charts.go b/cli/internal/helm/repo.go similarity index 50% rename from cli/internal/helm/charts.go rename to cli/internal/helm/repo.go index 42b9e37afc..49b8f4fdbc 100644 --- a/cli/internal/helm/charts.go +++ b/cli/internal/helm/repo.go @@ -5,25 +5,20 @@ import ( "github.com/defenseunicorns/zarf/cli/config" "github.com/defenseunicorns/zarf/cli/internal/git" - "github.com/sirupsen/logrus" + "github.com/defenseunicorns/zarf/cli/internal/message" "helm.sh/helm/v3/pkg/action" "helm.sh/helm/v3/pkg/cli" - "strings" - "helm.sh/helm/v3/pkg/downloader" "helm.sh/helm/v3/pkg/getter" "helm.sh/helm/v3/pkg/repo" ) +// DownloadChartFromGit is a special implementation of chart downloads that support the https://p1.dso.mil/#/products/big-bang/ model func DownloadChartFromGit(chart config.ZarfChart, destination string) { - logContext := logrus.WithFields(logrus.Fields{ - "Chart": chart.Name, - "URL": chart.Url, - "Version": chart.Version, - }) + spinner := message.NewProgressSpinner("Processing helm chart %s:%s from git url %s", chart.Name, chart.Version, chart.Url) + defer spinner.Stop() - logContext.Info("Processing git-based helm chart") client := action.NewPackage() // Get the git repo @@ -34,34 +29,28 @@ func DownloadChartFromGit(chart config.ZarfChart, destination string) { // Tell helm where to save the archive and create the package client.Destination = destination - name, err := client.Run(tempPath+"/chart", nil) + name, err := client.Run(tempPath+"/"+chart.GitPath, nil) if err != nil { - logContext.Debug(err) - logContext.Fatal("Helm is unable to save the archive and create the package:", name) + spinner.Fatalf(err, "Helm is unable to save the archive and create the package %s", name) } _ = os.RemoveAll(tempPath) + spinner.Success() } +// DownloadPublishedChart loads a specific chart version from a remote repo func DownloadPublishedChart(chart config.ZarfChart, destination string) { - logContext := logrus.WithFields(logrus.Fields{ - "Chart": chart.Name, - "URL": chart.Url, - "Version": chart.Version, - }) - - logContext.Info("Processing published helm chart") - - var out strings.Builder + spinner := message.NewProgressSpinner("Processing helm chart %s:%s from repo %s", chart.Name, chart.Version, chart.Url) + defer spinner.Stop() - // Setup the helm pull config + // Set up the helm pull config pull := action.NewPull() pull.Settings = cli.New() - // Setup the chart downloader - downloader := downloader.ChartDownloader{ - Out: &out, + // Set up the chart chartDownloader + chartDownloader := downloader.ChartDownloader{ + Out: spinner, Verify: downloader.VerifyNever, Getters: getter.All(pull.Settings), } @@ -71,28 +60,21 @@ func DownloadPublishedChart(chart config.ZarfChart, destination string) { // Perform simple chart download chartURL, err := repo.FindChartInRepoURL(chart.Url, chart.Name, chart.Version, pull.CertFile, pull.KeyFile, pull.CaFile, getter.All(pull.Settings)) if err != nil { - logContext.Debug(err) - logContext.Fatal("Unable to pull the helm chart") + spinner.Fatalf(err, "Unable to pull the helm chart") } // Download the file (we don't control what name helm creates here) - saved, _, err := downloader.DownloadTo(chartURL, pull.Version, destination) + saved, _, err := chartDownloader.DownloadTo(chartURL, pull.Version, destination) if err != nil { - logContext.Debug(err) - logContext.Fatal("Unable to download the helm chart") + spinner.Fatalf(err, "Unable to download the helm chart") } // Ensure the name is consistent for deployments - destinationTarball := StandardName(destination, chart) + destinationTarball := StandardName(destination, chart) + ".tgz" err = os.Rename(saved, destinationTarball) - if err != nil { - logContext.Debug(err) - logContext.Fatal("Unable to rename tarball") + spinner.Fatalf(err, "Unable to save the chart tarball") } -} -// StandardName generates a predictable full path for a helm chart for Zarf -func StandardName(destintation string, chart config.ZarfChart) string { - return destintation + "/" + chart.Name + "-" + chart.Version + ".tgz" + spinner.Success() } diff --git a/cli/internal/helm/utils.go b/cli/internal/helm/utils.go new file mode 100644 index 0000000000..3ca58bf91e --- /dev/null +++ b/cli/internal/helm/utils.go @@ -0,0 +1,72 @@ +package helm + +import ( + "fmt" + "os" + "strconv" + + "github.com/defenseunicorns/zarf/cli/config" + "github.com/defenseunicorns/zarf/cli/internal/message" + "helm.sh/helm/v3/pkg/action" + "helm.sh/helm/v3/pkg/chart" + "helm.sh/helm/v3/pkg/cli" + "helm.sh/helm/v3/pkg/cli/values" + "helm.sh/helm/v3/pkg/getter" + + "helm.sh/helm/v3/pkg/chart/loader" +) + +// StandardName generates a predictable full path for a helm chart for Zarf +func StandardName(destination string, chart config.ZarfChart) string { + return destination + "/" + chart.Name + "-" + chart.Version +} + +// loadChartFromTarball returns a helm chart from a tarball +func loadChartFromTarball(options ChartOptions) (*chart.Chart, error) { + // Get the path the temporary helm chart tarball + sourceTarball := StandardName(options.BasePath+"/charts", options.Chart) + ".tgz" + + // Load the loadedChart tarball + loadedChart, err := loader.Load(sourceTarball) + if err != nil { + return nil, fmt.Errorf("unable to load helm chart archive: %w", err) + } + + if err = loadedChart.Validate(); err != nil { + return nil, fmt.Errorf("unable to validate loaded helm chart: %w", err) + } + + return loadedChart, nil +} + +// parseChartValues reads the context of the chart values into an interface if it exists +func parseChartValues(options ChartOptions) (map[string]interface{}, error) { + valueOpts := &values.Options{} + + for idx := range options.Chart.ValuesFiles { + path := StandardName(options.BasePath+"/values", options.Chart) + "-" + strconv.Itoa(idx) + valueOpts.ValueFiles = append(valueOpts.ValueFiles, path) + } + + httpProvider := getter.Provider{ + Schemes: []string{"http", "https"}, + New: getter.NewHTTPGetter, + } + + providers := getter.Providers{httpProvider} + return valueOpts.MergeValues(providers) +} + +func createActionConfig(namespace string) (*action.Configuration, error) { + // OMG THIS IS SOOOO GROSS PPL... https://github.com/helm/helm/issues/8780 + _ = os.Setenv("HELM_NAMESPACE", namespace) + + // Initialize helm SDK + actionConfig := new(action.Configuration) + settings := cli.New() + + // Setup K8s connection + err := actionConfig.Init(settings.RESTClientGetter(), namespace, "", message.Debugf) + + return actionConfig, err +} diff --git a/cli/internal/images/common.go b/cli/internal/images/common.go new file mode 100644 index 0000000000..9a9e665c6b --- /dev/null +++ b/cli/internal/images/common.go @@ -0,0 +1,13 @@ +package images + +import ( + "fmt" + "os" +) + +var cachePath = ".zarf-image-cache" + +func init() { + homePath, _ := os.UserHomeDir() + cachePath = fmt.Sprintf("%s/%s", homePath, cachePath) +} diff --git a/cli/internal/images/copy.go b/cli/internal/images/copy.go new file mode 100644 index 0000000000..88b992f143 --- /dev/null +++ b/cli/internal/images/copy.go @@ -0,0 +1,13 @@ +package images + +import ( + "github.com/defenseunicorns/zarf/cli/config" + "github.com/defenseunicorns/zarf/cli/internal/message" + "github.com/google/go-containerregistry/pkg/crane" +) + +func Copy(src string, dest string) { + if err := crane.Copy(src, dest, config.ActiveCranePlatform); err != nil { + message.Fatal(err, "Unable to copy the image") + } +} diff --git a/cli/internal/images/pull.go b/cli/internal/images/pull.go index 5e9b29d5d9..716b2aa763 100644 --- a/cli/internal/images/pull.go +++ b/cli/internal/images/pull.go @@ -1,33 +1,111 @@ package images import ( + "errors" + "fmt" + "io" + + "github.com/defenseunicorns/zarf/cli/config" + "github.com/defenseunicorns/zarf/cli/internal/message" + "github.com/defenseunicorns/zarf/cli/internal/utils" "github.com/google/go-containerregistry/pkg/crane" + "github.com/google/go-containerregistry/pkg/logs" + "github.com/google/go-containerregistry/pkg/name" v1 "github.com/google/go-containerregistry/pkg/v1" "github.com/google/go-containerregistry/pkg/v1/cache" - "github.com/sirupsen/logrus" + "github.com/google/go-containerregistry/pkg/v1/tarball" + "github.com/pterm/pterm" ) -const cachePath = ".image-cache" - func PullAll(buildImageList []string, imageTarballPath string) { - logrus.Info("Loading images") - cranePlatformOptions := crane.WithPlatform(&v1.Platform{OS: "linux", Architecture: "amd64"}) + var ( + longer string + imageCount = len(buildImageList) + ) + + // Give some additional user feedback on larger image sets + if imageCount > 15 { + longer = "This step may take a couple of minutes to complete." + } else if imageCount > 5 { + longer = "This step may take several seconds to complete." + } + + spinner := message.NewProgressSpinner("Loading metadata for %d images. %s", imageCount, longer) + defer spinner.Stop() + imageMap := map[string]v1.Image{} - for _, src := range buildImageList { - logContext := logrus.WithField("image", src) - logContext.Info("Fetching image metadata") - img, err := crane.Pull(src, cranePlatformOptions) + if message.GetLogLevel() >= message.DebugLevel { + logs.Warn.SetOutput(spinner) + logs.Progress.SetOutput(spinner) + } + + for idx, src := range buildImageList { + spinner.Updatef("Fetching image metadata (%d of %d): %s", idx+1, imageCount, src) + img, err := crane.Pull(src, config.ActiveCranePlatform) if err != nil { - logContext.Warn("Unable to pull the image") + spinner.Fatalf(err, "Unable to pull the image %s", src) } img = cache.Image(img, cache.NewFilesystemCache(cachePath)) imageMap[src] = img } - logrus.Info("Creating image tarball (this will take a while)") - if err := crane.MultiSave(imageMap, imageTarballPath); err != nil { - logrus.Debug(err) - logrus.Fatal("Unable to save the tarball") + spinner.Updatef("Creating image tarball (this will take a while)") + + tagToImage := map[name.Tag]v1.Image{} + + for src, img := range imageMap { + ref, err := name.ParseReference(src) + if err != nil { + spinner.Fatalf(err, "parsing ref %q", src) + } + + tag, ok := ref.(name.Tag) + if !ok { + d, ok := ref.(name.Digest) + if !ok { + spinner.Fatalf(nil, "image reference %s wasn't a tag or digest", src) + } + tag = d.Repository.Tag("digest-only") + } + tagToImage[tag] = img + } + spinner.Success() + + progress := make(chan v1.Update, 200) + + go func() { + _ = tarball.MultiWriteToFile(imageTarballPath, tagToImage, tarball.WithProgress(progress)) + }() + + var progressBar *pterm.ProgressbarPrinter + var title string + + for update := range progress { + switch { + case update.Error != nil && errors.Is(update.Error, io.EOF): + _, _ = progressBar.Stop() + title = fmt.Sprintf("Pulling %v images (%s)", len(imageMap), utils.ByteFormat(float64(update.Total), 2)) + pterm.Success.Println(title) + return + case update.Error != nil: + message.Fatal(update.Error, "error writing image tarball") + default: + title = fmt.Sprintf("Pulling %v images (%s of %s)", len(imageMap), + utils.ByteFormat(float64(update.Complete), 2), + utils.ByteFormat(float64(update.Total), 2), + ) + if progressBar == nil { + progressBar, _ = pterm.DefaultProgressbar. + WithTotal(int(update.Total)). + WithShowCount(false). + WithTitle(title). + WithRemoveWhenDone(true). + Start() + } + progressBar.UpdateTitle(title) + chunk := int(update.Complete) - progressBar.Current + progressBar.Add(chunk) + } } } diff --git a/cli/internal/images/push.go b/cli/internal/images/push.go index b744fa71bb..19fe3160b6 100644 --- a/cli/internal/images/push.go +++ b/cli/internal/images/push.go @@ -1,43 +1,35 @@ package images import ( - "regexp" - + "github.com/defenseunicorns/zarf/cli/config" + "github.com/defenseunicorns/zarf/cli/internal/k8s" + "github.com/defenseunicorns/zarf/cli/internal/message" + "github.com/defenseunicorns/zarf/cli/internal/utils" "github.com/google/go-containerregistry/pkg/crane" - v1 "github.com/google/go-containerregistry/pkg/v1" - "github.com/sirupsen/logrus" ) -func PushAll(imageTarballPath string, buildImageList []string, targetHost string) { - cranePlatformOptions := crane.WithPlatform(&v1.Platform{OS: "linux", Architecture: "amd64"}) +func PushToZarfRegistry(imageTarballPath string, buildImageList []string, target string) { + + // Establish a registry tunnel to send the images if pushing to the zarf registry + if target == config.ZarfRegistry { + tunnel := k8s.NewZarfTunnel() + tunnel.Connect(k8s.ZarfRegistry, false) + defer tunnel.Close() + } for _, src := range buildImageList { - logContext := logrus.WithFields(logrus.Fields{ - "source": src, - "target": targetHost, - }) - logContext.Info("Updating image") - img, err := crane.LoadTag(imageTarballPath, src, cranePlatformOptions) + message.Infof("Updating image %s -> %s", src, target) + img, err := crane.LoadTag(imageTarballPath, src, config.ActiveCranePlatform) if err != nil { - logContext.Debug(err) - logContext.Warn("Unable to load the image from the update package") + message.Error(err, "Unable to load the image from the update package") return } - offlineName := SwapHost(src, targetHost) + offlineName := utils.SwapHost(src, target) - err = crane.Push(img, offlineName, cranePlatformOptions) + err = crane.Push(img, offlineName, config.ActiveCranePlatform) if err != nil { - logContext.Debug(err) - logContext.Warn("Unable to push the image to the registry") + message.Error(err, "Unable to push the image to the registry") } } } - -// SwapHost Perform base url replacment without the docker libs -func SwapHost(src string, targetHost string) string { - // For further explanation see https://regex101.com/library/PiL191 and https://regex101.com/r/PiL191/1 - var parser = regexp.MustCompile(`(?im)^([a-z0-9\-.]+\.[a-z0-9\-]+:?[0-9]*)?/?(.+)$`) - var substitution = targetHost + "/$2" - return parser.ReplaceAllString(src, substitution) -} diff --git a/cli/internal/k8s/common.go b/cli/internal/k8s/common.go index 37148f0030..26503f3cfd 100644 --- a/cli/internal/k8s/common.go +++ b/cli/internal/k8s/common.go @@ -1,27 +1,58 @@ package k8s import ( + "bytes" "fmt" + "github.com/go-logr/logr" + "io" "io/ioutil" + "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" + "k8s.io/apimachinery/pkg/runtime" + "k8s.io/klog/v2" + "os" + "regexp" - "github.com/sirupsen/logrus" + "github.com/defenseunicorns/zarf/cli/internal/message" + "github.com/defenseunicorns/zarf/cli/internal/template" + "github.com/defenseunicorns/zarf/cli/internal/utils" + "github.com/go-logr/logr/funcr" + kubeyaml "k8s.io/apimachinery/pkg/util/yaml" "k8s.io/client-go/kubernetes" + "k8s.io/client-go/rest" "k8s.io/client-go/tools/clientcmd" + "sigs.k8s.io/yaml" ) -func connect() *kubernetes.Clientset { - kubeconfig := "/root/.kube/config" +// ImageSwap Pre-compute all the replacements for the embedded registry +type ImageSwap struct { + find string + replace string +} + +func init() { + klog.SetLogger(generateLogShim()) +} + +func getRestConfig() *rest.Config { + homePath, err := os.UserHomeDir() + if err != nil { + message.Fatal(nil, "Unable to load the current user's home directory") + } // use the current context in kubeconfig - config, err := clientcmd.BuildConfigFromFlags("", kubeconfig) + config, err := clientcmd.BuildConfigFromFlags("", homePath+"/.kube/config") if err != nil { - logrus.Fatal("Unable to connect to the K8s cluster", err.Error()) + message.Fatalf(err, "Unable to connect to the K8s cluster") } + return config +} +func getClientset() *kubernetes.Clientset { + config := getRestConfig() // create the clientset clientset, err := kubernetes.NewForConfig(config) if err != nil { - logrus.Fatal("Unable to connect to the K8s cluster", err.Error()) + message.Fatal(err, "Unable to connect to the K8s cluster") } return clientset @@ -31,8 +62,105 @@ func connect() *kubernetes.Clientset { func readFile(file string) ([]byte, error) { b, err := ioutil.ReadFile(file) if err != nil { - logrus.Debug(err) + message.Debug(err) return []byte{}, fmt.Errorf("cannot read file %v, %v", file, err) } return b, nil } + +func GetContext() (string, error) { + kubeconfig := clientcmd.NewNonInteractiveDeferredLoadingClientConfig( + clientcmd.NewDefaultClientConfigLoadingRules(), + &clientcmd.ConfigOverrides{}, + ) + kubeconfig.ConfigAccess().GetLoadingPrecedence() + kubeConf, err := kubeconfig.ConfigAccess().GetStartingConfig() + if err != nil { + return "", fmt.Errorf("unable to load the default kube config") + } + + return kubeConf.CurrentContext, nil +} + +// ProcessYamlFilesInPath iterates over all yaml files in a given path and performs Zarf templating + image swapping +func ProcessYamlFilesInPath(path string, componentImages []string) []string { + message.Debugf("k8s.ProcessYamlFilesInPath(%s, %v)", path, componentImages) + + // Only pull in yml and yaml files + pattern := regexp.MustCompile(`(?mi)\.ya?ml$`) + manifests := utils.RecursiveFileList(path, pattern) + valueTemplate := template.Generate() + + // Match images in the given list and replace if found in the given files + var imageSwap []ImageSwap + for _, image := range componentImages { + imageSwap = append(imageSwap, ImageSwap{ + find: image, + replace: utils.SwapHost(image, valueTemplate.GetRegistry()), + }) + } + + for _, manifest := range manifests { + message.Debugf("Processing k8s manifest files %s", manifest) + // Iterate over each image swap to see if it exists in the manifest + for _, swap := range imageSwap { + utils.ReplaceText(manifest, swap.find, swap.replace) + } + valueTemplate.Apply(manifest) + } + + return manifests +} + +func generateLogShim() logr.Logger { + message.Debug("k8s.generateLogShim()") + return funcr.New(func(prefix, args string) { + message.Debug(args) + }, funcr.Options{}) +} + +// SplitYAML splits a YAML file into unstructured objects. Returns list of all unstructured objects +// found in the yaml. If an error occurs, returns objects that have been parsed so far too. +// Source: https://github.com/argoproj/gitops-engine/blob/v0.5.2/pkg/utils/kube/kube.go#L286 +func SplitYAML(yamlData []byte) ([]*unstructured.Unstructured, error) { + var objs []*unstructured.Unstructured + ymls, err := splitYAMLToString(yamlData) + if err != nil { + return nil, err + } + for _, yml := range ymls { + u := &unstructured.Unstructured{} + if err := yaml.Unmarshal([]byte(yml), u); err != nil { + return objs, fmt.Errorf("failed to unmarshal manifest: %v", err) + } + objs = append(objs, u) + } + return objs, nil +} + +// splitYAMLToString splits a YAML file into strings. Returns list of yamls +// found in the yaml. If an error occurs, returns objects that have been parsed so far too. +// Source: https://github.com/argoproj/gitops-engine/blob/v0.5.2/pkg/utils/kube/kube.go#L304 +func splitYAMLToString(yamlData []byte) ([]string, error) { + // Similar way to what kubectl does + // https://github.com/kubernetes/cli-runtime/blob/master/pkg/resource/visitor.go#L573-L600 + // Ideally k8s.io/cli-runtime/pkg/resource.Builder should be used instead of this method. + // E.g. Builder does list unpacking and flattening and this code does not. + d := kubeyaml.NewYAMLOrJSONDecoder(bytes.NewReader(yamlData), 4096) + var objs []string + for { + ext := runtime.RawExtension{} + if err := d.Decode(&ext); err != nil { + if err == io.EOF { + break + } + return objs, fmt.Errorf("failed to unmarshal manifest: %v", err) + } + ext.Raw = bytes.TrimSpace(ext.Raw) + if len(ext.Raw) == 0 || bytes.Equal(ext.Raw, []byte("null")) { + continue + } + objs = append(objs, string(ext.Raw)) + } + return objs, nil +} diff --git a/cli/internal/k8s/distro.go b/cli/internal/k8s/distro.go new file mode 100644 index 0000000000..e505442c75 --- /dev/null +++ b/cli/internal/k8s/distro.go @@ -0,0 +1,69 @@ +package k8s + +import ( + "fmt" + "regexp" +) + +const ( + DistroIsUnknown = "unknown" + DistroIsK3s = "k3s" + DistroIsK3d = "k3d" + DistroIsKind = "kind" + DistroIsMicroK8s = "microk8s" + DistroIsEKSAnywhere = "eksanywhere" + + // todo: more distros +) + +func DetectDistro() (string, error) { + kindNodeRegex := regexp.MustCompile(`^kind://`) + k3dNodeRegex := regexp.MustCompile(`^k3s://k3d-`) + + nodes, err := GetNodes() + if err != nil { + return DistroIsUnknown, fmt.Errorf("error getting cluster nodes") + } + + // Iterate over the nodes looking for label matches + for _, node := range nodes.Items { + // Regex explanation: https://regex101.com/r/TIUQVe/1 + // https://github.com/rancher/k3d/blob/v5.2.2/cmd/node/nodeCreate.go#L187 + if k3dNodeRegex.MatchString(node.Spec.ProviderID) { + return DistroIsK3d, nil + } + + // Regex explanation: https://regex101.com/r/le7PRB/1 + // https://github.com/kubernetes-sigs/kind/pull/1805 + if kindNodeRegex.MatchString(node.Spec.ProviderID) { + return DistroIsKind, nil + } + + labels := node.GetLabels() + for _, label := range labels { + // kubectl get nodes --selector node.kubernetes.io/instance-type=k3s for K3s + if label == "node.kubernetes.io/instance-type=k3s" { + return DistroIsK3s, nil + } + // kubectl get nodes --selector microk8s.io/cluster=true for MicroK8s + if label == "microk8s.io/cluster=true" { + return DistroIsMicroK8s, nil + } + } + + } + + namespaces, err := GetNamespaces() + if err != nil { + return DistroIsUnknown, fmt.Errorf("error getting namesapce list") + } + + // kubectl get ns eksa-system for EKS Anywhere + for _, namespace := range namespaces.Items { + if namespace.Name == "eksa-system" { + return DistroIsEKSAnywhere, nil + } + } + + return DistroIsUnknown, nil +} diff --git a/cli/internal/k8s/namespace.go b/cli/internal/k8s/namespace.go new file mode 100644 index 0000000000..49b95c35ba --- /dev/null +++ b/cli/internal/k8s/namespace.go @@ -0,0 +1,64 @@ +package k8s + +import ( + "context" + "github.com/defenseunicorns/zarf/cli/internal/message" + corev1 "k8s.io/api/core/v1" + "k8s.io/apimachinery/pkg/api/errors" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "os" + "time" +) + +func GetNamespaces() (*corev1.NamespaceList, error) { + clientset := getClientset() + + metaOptions := metav1.ListOptions{} + return clientset.CoreV1().Namespaces().List(context.TODO(), metaOptions) +} + +func CreateNamespace(name string) (*corev1.Namespace, error) { + message.Debugf("k8s.CreateNamespace(%s)", name) + + clientset := getClientset() + + namespace := &corev1.Namespace{ + TypeMeta: metav1.TypeMeta{APIVersion: corev1.SchemeGroupVersion.String(), Kind: "Namespace"}, + ObjectMeta: metav1.ObjectMeta{Name: name}, + } + + metaOptions := metav1.GetOptions{} + createOptions := metav1.CreateOptions{} + + match, err := clientset.CoreV1().Namespaces().Get(context.TODO(), name, metaOptions) + + message.Debug(match) + + if err != nil || match.Name != name { + return clientset.CoreV1().Namespaces().Create(context.TODO(), namespace, createOptions) + } + + return match, err +} + +func DeleteZarfNamespace() { + spinner := message.NewProgressSpinner("Deleting the zarf namespace from this cluster") + defer spinner.Stop() + + clientset := getClientset() + err := clientset.CoreV1().Namespaces().Delete(context.TODO(), ZarfNamespace, metav1.DeleteOptions{}) + + if err != nil && !errors.IsNotFound(err) { + spinner.Fatalf(err, "the Zarf namespace could not be deleted") + } + + for { + spinner.Updatef("Zarf namespace deletion scheduled, waiting for all resources to be removed") + _, err := clientset.CoreV1().Namespaces().Get(context.TODO(), ZarfNamespace, metav1.GetOptions{}) + if errors.IsNotFound(err) { + spinner.Successf("Zarf removed from this cluster") + os.Exit(0) + } + time.Sleep(1 * time.Second) + } +} diff --git a/cli/internal/k8s/nodes.go b/cli/internal/k8s/nodes.go new file mode 100644 index 0000000000..ba95256626 --- /dev/null +++ b/cli/internal/k8s/nodes.go @@ -0,0 +1,15 @@ +package k8s + +import ( + "context" + + corev1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" +) + +func GetNodes() (*corev1.NodeList, error) { + clientset := getClientset() + + metaOptions := metav1.ListOptions{} + return clientset.CoreV1().Nodes().List(context.TODO(), metaOptions) +} diff --git a/cli/internal/k8s/pods.go b/cli/internal/k8s/pods.go index 70bcca1938..b548aa2fa3 100644 --- a/cli/internal/k8s/pods.go +++ b/cli/internal/k8s/pods.go @@ -2,43 +2,47 @@ package k8s import ( "context" + "sort" "time" "github.com/defenseunicorns/zarf/cli/config" - "github.com/sirupsen/logrus" - v1 "k8s.io/api/core/v1" + "github.com/defenseunicorns/zarf/cli/internal/message" + corev1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" ) const waitLimit = 30 -func WaitForPodsAndContainers(target config.ZarfContainerTarget) []string { +// WaitForPodsAndContainers holds execution up to 30 seconds waiting for health pods and containers (if specified) +func WaitForPodsAndContainers(target config.ZarfContainerTarget, waitForAllPods bool) []string { - clientSet := connect() - logContext := logrus.WithFields(logrus.Fields{ - "Namespace": target.Namespace, - "Selector": target.Selector, - "Container": target.Container, - }) + clientSet := getClientset() + message.Debugf("Waiting for ready pod %s/%s", target.Namespace, target.Selector) for count := 0; count < waitLimit; count++ { - logContext.Info("Looking up K8s pod") pods, err := clientSet.CoreV1().Pods(target.Namespace).List(context.TODO(), metav1.ListOptions{ LabelSelector: target.Selector, }) if err != nil { - logContext.Warn("Unable to find matching pods", err.Error()) + message.Error(err, "Unable to find matching pods") break } var readyPods []string + // Reverse sort by creation time + sort.Slice(pods.Items, func(i, j int) bool { + return pods.Items[i].CreationTimestamp.After(pods.Items[j].CreationTimestamp.Time) + }) + if len(pods.Items) > 0 { for _, pod := range pods.Items { + message.Debugf("Testing pod %s", pod.Name) // Handle container targetting if target.Container != "" { + message.Debugf("Testing for container") var matchesInitContainer bool // Check the status of initContainers for a running match @@ -66,22 +70,29 @@ func WaitForPodsAndContainers(target config.ZarfContainerTarget) []string { } } else { + status := pod.Status.Phase + message.Debugf("Testing for pod only, phase: %s", status) // Regular status checking without a container - if pod.Status.Phase == v1.PodRunning { + if status == corev1.PodRunning { readyPods = append(readyPods, pod.Name) } } } - if len(pods.Items) == len(readyPods) { + message.Debug("Ready pods", readyPods) + somePodsReady := len(readyPods) > 0 + allPodsReady := len(pods.Items) == len(readyPods) + + if allPodsReady || somePodsReady && !waitForAllPods { return readyPods } + } time.Sleep(3 * time.Second) } - logContext.Warn("Pod lookup timeout exceeded") + message.Warn("Pod lookup timeout exceeded") return []string{} } diff --git a/cli/internal/k8s/sa.go b/cli/internal/k8s/sa.go new file mode 100644 index 0000000000..6d804285dd --- /dev/null +++ b/cli/internal/k8s/sa.go @@ -0,0 +1,15 @@ +package k8s + +import ( + "context" + + corev1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" +) + +func GetServiceAccounts() (*corev1.ServiceAccountList, error) { + clientset := getClientset() + + metaOptions := metav1.ListOptions{} + return clientset.CoreV1().ServiceAccounts(corev1.NamespaceAll).List(context.TODO(), metaOptions) +} diff --git a/cli/internal/k8s/secrets.go b/cli/internal/k8s/secrets.go index 79c8fc6455..75fe0f9ab3 100644 --- a/cli/internal/k8s/secrets.go +++ b/cli/internal/k8s/secrets.go @@ -3,46 +3,90 @@ package k8s import ( "context" "crypto/tls" + "encoding/base64" + "encoding/json" + "fmt" "github.com/defenseunicorns/zarf/cli/config" - "github.com/sirupsen/logrus" + "github.com/defenseunicorns/zarf/cli/internal/message" corev1 "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" ) -func ReplaceTLSSecret(namespace string, name string) { +type DockerConfig struct { + Auths DockerConfigEntry `json:"auths"` +} - state := config.GetState() - clientSet := connect() - logContext := logrus.WithFields(logrus.Fields{ - "Namespace": namespace, - "Name": name, - "Cert": state.TLS.CertPublicPath, - }) - namespaceSecrets := clientSet.CoreV1().Secrets(namespace) +type DockerConfigEntry map[string]DockerConfigEntryWithAuth - logContext.Info("Loading secret") +type DockerConfigEntryWithAuth struct { + Auth string `json:"auth"` +} - err := namespaceSecrets.Delete(context.TODO(), name, metav1.DeleteOptions{}) - if err != nil && !errors.IsNotFound(err) { - logContext.Debug(err) - logContext.Warn("Error deleting the secret") +func GenerateRegistryPullCreds(namespace string) *corev1.Secret { + message.Debugf("k8s.GenerateRegistryPullCreds(%s)", namespace) + name := "zarf-registry" + + spinner := message.NewProgressSpinner("Generating private registry credentials %s/%s", namespace, name) + defer spinner.Success() + + secretDockerConfig := &corev1.Secret{ + TypeMeta: metav1.TypeMeta{ + APIVersion: corev1.SchemeGroupVersion.String(), + Kind: "Secret", + }, + ObjectMeta: metav1.ObjectMeta{ + Name: name, + Namespace: namespace, + }, + Type: corev1.SecretTypeDockerConfigJson, + Data: map[string][]byte{}, + } + + // Auth field must be username:password and base64 encoded + credential := config.GetSecret(config.StateRegistryPull) + if credential == "" { + spinner.Fatalf(nil, "Generate pull cred failed") } + fieldValue := config.ZarfRegistryPullUser + ":" + credential + authEncodedValue := base64.StdEncoding.EncodeToString([]byte(fieldValue)) - tlsCert, err := readFile(state.TLS.CertPublicPath) + registry := config.GetRegistry() + // Create the expected structure for the dockerconfigjson + dockerConfigJSON := DockerConfig{ + Auths: DockerConfigEntry{ + registry: DockerConfigEntryWithAuth{ + Auth: authEncodedValue, + }, + }, + } + + // Convert to JSON + dockerConfigData, err := json.Marshal(dockerConfigJSON) + if err != nil { + spinner.Fatalf(err, "Unable to create the embedded registry secret") + } + + // Add to the secret data + secretDockerConfig.Data[".dockerconfigjson"] = dockerConfigData + + return secretDockerConfig +} + +func GenerateTLSSecret(namespace string, name string, certPath string, keyPath string) *corev1.Secret { + message.Debugf("k8s.GenerateTLSSecret(%s, %s, %s, %s", namespace, name, certPath, keyPath) + + tlsCert, err := readFile(certPath) if err != nil { - logContext.Debug(err) - logContext.Fatal("Unable to read the TLS public certificate") + message.Fatal(err, "Unable to read the TLS public certificate") } - tlsKey, err := readFile(state.TLS.CertPrivatePath) + tlsKey, err := readFile(keyPath) if err != nil { - logContext.Debug(err) - logContext.Fatal("Unable to read the TLS private key") + message.Fatal(err, "Unable to read the TLS private key") } if _, err := tls.X509KeyPair(tlsCert, tlsKey); err != nil { - logContext.Debug(err) - logContext.Fatal("Unable to create the TLS keypair") + message.Fatal(err, "Unable to create the TLS keypair") } secretTLS := &corev1.Secret{ @@ -58,12 +102,73 @@ func ReplaceTLSSecret(namespace string, name string) { Data: map[string][]byte{}, } - secretTLS.Data[corev1.TLSCertKey] = []byte(tlsCert) - secretTLS.Data[corev1.TLSPrivateKeyKey] = []byte(tlsKey) + secretTLS.Data[corev1.TLSCertKey] = tlsCert + secretTLS.Data[corev1.TLSPrivateKeyKey] = tlsKey + + return secretTLS +} + +func ReplaceRegistrySecret(namespace string) error { + secret := GenerateRegistryPullCreds(namespace) + return replaceSecret(secret) +} + +func ReplaceTLSSecret(namespace string, name string) { + message.Debugf("k8s.ReplaceTLSSecret(%s, %s)", namespace, name) - _, err = namespaceSecrets.Create(context.TODO(), secretTLS, metav1.CreateOptions{}) + tlsCert, err := readFile(config.TLS.CertPublicPath) if err != nil { - logContext.Debug(err) - logContext.Fatal("Unable to create the secret", err) + message.Fatalf(err, "Unable to read the TLS public certificate") } + tlsKey, err := readFile(config.TLS.CertPrivatePath) + if err != nil { + message.Fatalf(err, "Unable to read the TLS private key") + } + if _, err := tls.X509KeyPair(tlsCert, tlsKey); err != nil { + message.Fatalf(err, "Unable to create the TLS keypair") + } + + secret := &corev1.Secret{ + TypeMeta: metav1.TypeMeta{ + APIVersion: corev1.SchemeGroupVersion.String(), + Kind: "Secret", + }, + ObjectMeta: metav1.ObjectMeta{ + Name: name, + Namespace: namespace, + }, + Type: corev1.SecretTypeTLS, + Data: map[string][]byte{}, + } + + secret.Data[corev1.TLSCertKey] = tlsCert + secret.Data[corev1.TLSPrivateKeyKey] = tlsKey + + if err := replaceSecret(secret); err != nil { + message.Fatalf(err, "Unable to create the secret") + } +} + +func replaceSecret(secret *corev1.Secret) error { + message.Debugf("k8s.replaceSecret(%v)", secret) + clientSet := getClientset() + + _, err := CreateNamespace(secret.Namespace) + if err != nil { + return fmt.Errorf("unable to create or read the namespace: %w", err) + } + + namespaceSecrets := clientSet.CoreV1().Secrets(secret.Namespace) + + err = namespaceSecrets.Delete(context.TODO(), secret.Name, metav1.DeleteOptions{}) + if err != nil && !errors.IsNotFound(err) { + return fmt.Errorf("error deleting the secret: %w", err) + } + + _, err = namespaceSecrets.Create(context.TODO(), secret, metav1.CreateOptions{}) + if err != nil { + return fmt.Errorf("unable to create the secret: %w", err) + } + + return nil } diff --git a/cli/internal/k8s/services.go b/cli/internal/k8s/services.go new file mode 100644 index 0000000000..174389a98b --- /dev/null +++ b/cli/internal/k8s/services.go @@ -0,0 +1,14 @@ +package k8s + +import ( + "context" + + corev1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" +) + +// GetService returns a Kubernetes service resource in the provided namespace with the given name. +func GetService(namespace string, serviceName string) (*corev1.Service, error) { + clientset := getClientset() + return clientset.CoreV1().Services(namespace).Get(context.Background(), serviceName, metav1.GetOptions{}) +} diff --git a/cli/internal/k8s/state.go b/cli/internal/k8s/state.go new file mode 100644 index 0000000000..2bd3b247df --- /dev/null +++ b/cli/internal/k8s/state.go @@ -0,0 +1,88 @@ +package k8s + +import ( + "context" + "encoding/json" + "fmt" + + "github.com/defenseunicorns/zarf/cli/config" + "github.com/defenseunicorns/zarf/cli/internal/message" + corev1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + v1 "k8s.io/client-go/kubernetes/typed/core/v1" +) + +const ( + ZarfNamespace = "zarf" + ZarfStateSecretName = "zarf-state" + ZarfStateDataKey = "state" +) + +// getZarfStateInterface returns a secret interface for the zarf namespace +func getZarfStateInterface() v1.SecretInterface { + message.Debug("k8s.getZarfStateInterface()") + clientSet := getClientset() + + // Get interface for all secrets in the zarf namespace + return clientSet.CoreV1().Secrets(ZarfNamespace) +} + +// LoadZarfState returns the current zarf/zarf-state secret data or an empty ZarfState +func LoadZarfState() config.ZarfState { + message.Debug("k8s.LoadZarfState()") + + // The empty state that we will try to fill + state := config.ZarfState{ + Distro: DistroIsUnknown, + } + + // Set up the API connection + secretInterface := getZarfStateInterface() + + // Try to get the zarf-state secret + if match, err := secretInterface.Get(context.TODO(), ZarfStateSecretName, metav1.GetOptions{}); err == nil { + _ = json.Unmarshal(match.Data[ZarfStateDataKey], &state) + } + + message.Debug(state) + + return state +} + +// SaveZarfState takes a given state and makepersists it to the zarf/zarf-state secret +func SaveZarfState(state config.ZarfState) error { + message.Debugf("k8s.SaveZarfState(%v)", state) + + // Convert the data back to JSON + data, err := json.Marshal(state) + if err != nil { + return fmt.Errorf("unable to json-encode the zarf state") + } + + // Set up the data wrapper + dataWrapper := make(map[string][]byte) + dataWrapper[ZarfStateDataKey] = data + + // The secret object + secret := &corev1.Secret{ + TypeMeta: metav1.TypeMeta{ + APIVersion: corev1.SchemeGroupVersion.String(), + Kind: "Secret", + }, + ObjectMeta: metav1.ObjectMeta{ + Name: ZarfStateSecretName, + Namespace: ZarfNamespace, + }, + Type: corev1.SecretTypeOpaque, + Data: dataWrapper, + } + + message.Debug(secret) + + // Attempt to create or replace the secret and return + if err := replaceSecret(secret); err != nil { + return fmt.Errorf("unable to create the zarf state secret") + } + + return nil +} diff --git a/cli/internal/k8s/tunnel.go b/cli/internal/k8s/tunnel.go new file mode 100644 index 0000000000..a24f01135e --- /dev/null +++ b/cli/internal/k8s/tunnel.go @@ -0,0 +1,269 @@ +package k8s + +// Forked from https://github.com/gruntwork-io/terratest/blob/v0.38.8/modules/k8s/tunnel.go + +import ( + "fmt" + "io" + "io/ioutil" + "net" + "net/http" + "os" + "os/signal" + "runtime" + "strconv" + "strings" + "sync" + "syscall" + + "github.com/defenseunicorns/zarf/cli/config" + "github.com/defenseunicorns/zarf/cli/internal/message" + "k8s.io/client-go/tools/portforward" + "k8s.io/client-go/transport/spdy" +) + +// Global lock to synchronize port selections +var globalMutex sync.Mutex + +const ( + PodResource = "pod" + SvcResource = "svc" + ZarfRegistry = "REGISTRY" + ZarfLogging = "LOGGING" + ZarfGit = "GIT" +) + +const ( + PortRegistry = iota + 45001 + PortLogging + PortGit +) + +// makeLabels is a helper to format a map of label key and value pairs into a single string for use as a selector. +func makeLabels(labels map[string]string) string { + var out []string + for key, value := range labels { + out = append(out, fmt.Sprintf("%s=%s", key, value)) + } + return strings.Join(out, ",") +} + +// Tunnel is the main struct that configures and manages port forwading tunnels to Kubernetes resources. +type Tunnel struct { + out io.Writer + localPort int + remotePort int + namespace string + resourceType string + resourceName string + stopChan chan struct{} + readyChan chan struct{} +} + +// NewTunnel will create a new Tunnel struct +// Note that if you use 0 for the local port, an open port on the host system +// will be selected automatically, and the Tunnel struct will be updated with the selected port. +func NewTunnel(namespace string, resourceType string, resourceName string, local int, remote int) *Tunnel { + return &Tunnel{ + out: ioutil.Discard, + localPort: local, + remotePort: remote, + namespace: namespace, + resourceType: resourceType, + resourceName: resourceName, + stopChan: make(chan struct{}, 1), + readyChan: make(chan struct{}, 1), + } +} + +func NewZarfTunnel() *Tunnel { + return NewTunnel(ZarfNamespace, SvcResource, "", 0, 0) +} + +func (tunnel *Tunnel) Connect(target string, blocking bool) { + switch strings.ToUpper(target) { + case ZarfRegistry: + tunnel.resourceName = "docker-registry" + tunnel.localPort = PortRegistry + tunnel.remotePort = 5000 + case ZarfLogging: + tunnel.resourceName = "loki-stack-grafana" + tunnel.localPort = PortLogging + tunnel.remotePort = 3000 + case ZarfGit: + tunnel.resourceName = "gitea-http" + tunnel.localPort = PortGit + tunnel.remotePort = 3000 + default: + if tunnel.resourceName == "" { + message.Fatalf(nil, "Ensure a resource name is provided") + } + if tunnel.remotePort < 1 { + message.Fatal(nil, "A remote port must be specified to connect to.") + } + } + + if err := tunnel.Establish(); err != nil { + message.Fatal(err, "Unable to establish the tunnel") + } + + if blocking { + defer tunnel.Close() + // Keep this open until an interrupt signal is received + c := make(chan os.Signal) + signal.Notify(c, os.Interrupt, syscall.SIGTERM) + go func() { + <-c + os.Exit(0) + }() + + for { + runtime.Gosched() + } + } +} + +// Endpoint returns the tunnel endpoint +func (tunnel *Tunnel) Endpoint() string { + return fmt.Sprintf("localhost:%d", tunnel.localPort) +} + +// Close disconnects a tunnel connection by closing the StopChan, thereby stopping the goroutine. +func (tunnel *Tunnel) Close() { + close(tunnel.stopChan) +} + +// getAttachablePodForResource will find a pod that can be port forwarded to the provided resource type and return +// the name. +func (tunnel *Tunnel) getAttachablePodForResource() (string, error) { + switch tunnel.resourceType { + case PodResource: + return tunnel.resourceName, nil + case SvcResource: + return tunnel.getAttachablePodForService() + default: + return "", fmt.Errorf("unknown resource type: %s", tunnel.resourceType) + } +} + +// getAttachablePodForServiceE will find an active pod associated with the Service and return the pod name. +func (tunnel *Tunnel) getAttachablePodForService() (string, error) { + service, err := GetService(tunnel.namespace, tunnel.resourceName) + if err != nil { + return "", fmt.Errorf("unable to find the service: %w", err) + } + selectorLabelsOfPods := makeLabels(service.Spec.Selector) + + servicePods := WaitForPodsAndContainers(config.ZarfContainerTarget{ + Namespace: tunnel.namespace, + Selector: selectorLabelsOfPods, + }, false) + + return servicePods[0], nil +} + +// Establish opens a tunnel to a kubernetes resource, as specified by the provided tunnel struct. +func (tunnel *Tunnel) Establish() error { + spinner := message.NewProgressSpinner("Creating a port forwarding tunnel for resource %s/%s in namespace %s routing local port %d to remote port %d", + tunnel.resourceType, + tunnel.resourceName, + tunnel.namespace, + tunnel.localPort, + tunnel.remotePort, + ) + defer spinner.Stop() + + // Find the pod to port forward to + podName, err := tunnel.getAttachablePodForResource() + if err != nil { + return fmt.Errorf("unable to find pod attached to given resource: %w", err) + } + spinner.Debugf("Selected pod %s to open port forward to", podName) + + clientset := getClientset() + + // Build url to the port forward endpoint + // example: http://localhost:8080/api/v1/namespaces/helm/pods/tiller-deploy-9itlq/portforward + postEndpoint := clientset.CoreV1().RESTClient().Post() + namespace := tunnel.namespace + portForwardCreateURL := postEndpoint. + Resource("pods"). + Namespace(namespace). + Name(podName). + SubResource("portforward"). + URL() + + spinner.Debugf("Using URL %s to create portforward", portForwardCreateURL) + + restConfig := getRestConfig() + + // Construct the spdy client required by the client-go portforward library + transport, upgrader, err := spdy.RoundTripperFor(restConfig) + if err != nil { + return fmt.Errorf("unable to create the spdy client %w", err) + } + dialer := spdy.NewDialer(upgrader, &http.Client{Transport: transport}, "POST", portForwardCreateURL) + + // If the local-port is 0, get an available port before continuing. We do this here instead of relying on the + // underlying port-forwarder library, because the port-forwarder library does not expose the selected local port in a + // machine-readable manner. + // Synchronize on the global lock to avoid race conditions with concurrently selecting the same available port, + // since there is a brief moment between `GetAvailablePort` and `forwarder.ForwardPorts` where the selected port + // is available for selection again. + if tunnel.localPort == 0 { + spinner.Debugf("Requested local port is 0. Selecting an open port on host system") + tunnel.localPort, err = GetAvailablePort() + if err != nil { + return fmt.Errorf("unable to find an available port: %w", err) + } + spinner.Debugf("Selected port %d", tunnel.localPort) + globalMutex.Lock() + defer globalMutex.Unlock() + } + + // Construct a new PortForwarder struct that manages the instructed port forward tunnel + ports := []string{fmt.Sprintf("%d:%d", tunnel.localPort, tunnel.remotePort)} + portforwarder, err := portforward.New(dialer, ports, tunnel.stopChan, tunnel.readyChan, tunnel.out, tunnel.out) + if err != nil { + return fmt.Errorf("unable to create the port forward: %w", err) + } + + // Open the tunnel in a goroutine so that it is available in the background. Report errors to the main goroutine via + // a new channel. + errChan := make(chan error) + go func() { + errChan <- portforwarder.ForwardPorts() + }() + + // Wait for an error or the tunnel to be ready + select { + case err = <-errChan: + return fmt.Errorf("unable to start the tunnel: %w", err) + case <-portforwarder.Ready: + spinner.Successf("Creating port forwarding tunnel available at http://%s:%v", config.IPV4Localhost, tunnel.localPort) + return nil + } +} + +// GetAvailablePort retrieves an available port on the host machine. This delegates the port selection to the golang net +// library by starting a server and then checking the port that the server is using. +func GetAvailablePort() (int, error) { + l, err := net.Listen("tcp", ":0") + if err != nil { + return 0, err + } + defer func(l net.Listener) { + // ignore this error because it won't help us to tell the user + _ = l.Close() + }(l) + + _, p, err := net.SplitHostPort(l.Addr().String()) + if err != nil { + return 0, err + } + port, err := strconv.Atoi(p) + if err != nil { + return 0, err + } + return port, err +} diff --git a/cli/internal/message/message.go b/cli/internal/message/message.go new file mode 100644 index 0000000000..5dea9c6612 --- /dev/null +++ b/cli/internal/message/message.go @@ -0,0 +1,135 @@ +package message + +import ( + "fmt" + "os" + "strings" + + "github.com/pterm/pterm" +) + +type LogLevel int + +const ( + // WarnLevel level. Non-critical entries that deserve eyes. + WarnLevel LogLevel = iota + // InfoLevel level. General operational entries about what's going on inside the + // application. + InfoLevel + // DebugLevel level. Usually only enabled when debugging. Very verbose logging. + DebugLevel + // TraceLevel level. Designates finer-grained informational events than the Debug. + TraceLevel +) + +var logLevel = InfoLevel + +func init() { + pterm.ThemeDefault.SuccessMessageStyle = *pterm.NewStyle(pterm.FgLightGreen) + // Customize default error. + pterm.Success.Prefix = pterm.Prefix{ + Text: " ✔", + Style: pterm.NewStyle(pterm.FgLightGreen), + } + pterm.Error.Prefix = pterm.Prefix{ + Text: " Error:", + Style: pterm.NewStyle(pterm.FgLightRed), + } +} + +func debugPrinter() *pterm.PrefixPrinter { + return pterm.Debug.WithShowLineNumber(logLevel > 2).WithLineNumberOffset(2) +} + +func errorPrinter() *pterm.PrefixPrinter { + return pterm.Error.WithShowLineNumber(logLevel > 2).WithLineNumberOffset(2) +} + +func SetLogLevel(lvl LogLevel) { + logLevel = lvl + if logLevel >= DebugLevel { + pterm.EnableDebugMessages() + } +} + +func GetLogLevel() LogLevel { + return logLevel +} + +func Debug(payload ...interface{}) { + debugPrinter().Println(payload...) +} + +func Debugf(format string, a ...interface{}) { + debugPrinter().Printfln(format, a...) +} + +func Error(err interface{}, message string) { + Errorf(err, message) +} + +func Errorf(err interface{}, format string, a ...interface{}) { + Debug(err) + Warnf(format, a...) +} + +func Warn(message string) { + Warnf(message) +} + +func Warnf(format string, a ...interface{}) { + message := paragraph(format, a...) + pterm.Warning.Println(message) +} + +func Fatal(err interface{}, message string) { + Debug(err) + errorPrinter().Println(message) + os.Exit(1) +} + +func Fatalf(err interface{}, format string, a ...interface{}) { + Debug(err) + message := paragraph(format, a...) + errorPrinter().Println(message) + os.Exit(1) +} + +func Info(message string) { + Infof(message) +} + +func Infof(format string, a ...interface{}) { + if logLevel > 0 { + message := paragraph(format, a...) + pterm.Info.Println(message) + } +} + +func Question(text string) { + pterm.Println() + message := paragraph(text) + pterm.FgMagenta.Println(message) +} + +func Note(text string) { + pterm.Println() + message := paragraph(text) + pterm.FgYellow.Println(message) +} + +func HeaderInfof(format string, a ...interface{}) { + message := fmt.Sprintf(format, a...) + // Ensure the text is consistent for the header width + padding := 85 - len(message) + pterm.Println() + pterm.DefaultHeader. + WithBackgroundStyle(pterm.NewStyle(pterm.BgDarkGray)). + WithTextStyle(pterm.NewStyle(pterm.FgLightWhite)). + WithMargin(2). + Printfln(message + strings.Repeat(" ", padding)) +} + +func paragraph(format string, a ...interface{}) string { + return pterm.DefaultParagraph.WithMaxWidth(100).Sprintf(format, a...) +} diff --git a/cli/internal/message/spinner.go b/cli/internal/message/spinner.go new file mode 100644 index 0000000000..41a784ec42 --- /dev/null +++ b/cli/internal/message/spinner.go @@ -0,0 +1,72 @@ +package message + +import ( + "fmt" + "github.com/pterm/pterm" +) + +type Spinner struct { + spinner *pterm.SpinnerPrinter + startText string +} + +func NewProgressSpinner(format string, a ...interface{}) *Spinner { + text := fmt.Sprintf(format, a...) + spinner, _ := pterm.DefaultSpinner. + WithRemoveWhenDone(false). + Start(text) + + return &Spinner{ + spinner: spinner, + startText: text, + } +} + +func (p *Spinner) Write(text []byte) (int, error) { + Debug(string(text)) + return len(text), nil +} + +func (p *Spinner) Updatef(format string, a ...interface{}) { + text := fmt.Sprintf(format, a...) + p.spinner.UpdateText(text) +} + +func (p *Spinner) Debugf(format string, a ...interface{}) { + if logLevel >= DebugLevel { + text := fmt.Sprintf("Debug: "+format, a...) + p.spinner.UpdateText(text) + } +} + +func (p *Spinner) Stop() { + if p.spinner.IsActive { + // Only stop if not stopped to avoid extra line break injections in the CLI + _ = p.spinner.Stop() + Debug("Possible spinner leak detected") + } +} + +func (p *Spinner) Success() { + p.Successf(p.startText) +} + +func (p *Spinner) Successf(format string, a ...interface{}) { + text := fmt.Sprintf(format, a...) + p.spinner.Success(text) +} + +func (p *Spinner) Warnf(format string, a ...interface{}) { + text := fmt.Sprintf(format, a...) + p.spinner.Warning(text) +} + +func (p *Spinner) Errorf(err error, format string, a ...interface{}) { + p.Warnf(format, a...) + Debug(err) +} + +func (p *Spinner) Fatalf(err error, format string, a ...interface{}) { + p.spinner.Fail(p.startText) + Fatalf(err, format, a...) +} diff --git a/cli/internal/message/tls/prompts.go b/cli/internal/message/tls/prompts.go new file mode 100644 index 0000000000..180b844ab2 --- /dev/null +++ b/cli/internal/message/tls/prompts.go @@ -0,0 +1,137 @@ +package tls + +import ( + "net" + "os" + "path/filepath" + + "github.com/AlecAivazis/survey/v2" + "github.com/defenseunicorns/zarf/cli/config" + "github.com/defenseunicorns/zarf/cli/internal/message" + "github.com/defenseunicorns/zarf/cli/internal/utils" +) + +const InvalidHostMessage = "The hostname provided (%s) was not a valid hostname. The hostname can only contain: 'a-z', 'A-Z', '0-9', '-', and '.' characters as defined by RFC-1035. If using localhost, you must use the 127.0.0.1.\n" + +// HasCertPaths Check for cert paths provided via automation (both required) +func HasCertPaths() bool { + return config.TLS.CertPrivatePath != "" && config.TLS.CertPublicPath != "" +} + +// PromptIsImportCerts Ask user if they will be importing or generating certs, return true if importing certs +func PromptIsImportCerts(confirmed bool) bool { + var mode int + + if HasCertPaths() { + return true + } + + if confirmed { + // Assume generate on confirmed without cert paths + return false + } + + message.Question(` + Zarf needs a valid TLS certificate and key to serve content. This can be automatically generated + for you, but will require you to provide the generated certificate authority public key to any + systems that will connect to this cluster. Failure to do so may generating a warning for users or + fail to connect to the cluster. You can also provide your own X509 certificates instead.`) + + // Determine flow for generate or import + modePrompt := &survey.Select{ + Message: "Will Zarf be generating a TLS chain or importing an existing ingress cert?", + Options: []string{ + "Generate TLS chain with an ephemeral CA", + "Import user-provided cert keypair", + }, + } + _ = survey.AskOne(modePrompt, &mode) + + return mode == 1 +} + +// PromptCertPaths Ask user for the public and private key paths to import into the cluster +func PromptCertPaths() { + prompt := &survey.Input{ + Message: "Enter a file path to the ingress public key", + Suggest: func(toComplete string) []string { + // Give some suggestions to users + files, _ := filepath.Glob(toComplete + "*") + return files + }, + } + _ = survey.AskOne(prompt, &config.TLS.CertPublicPath, survey.WithValidator(survey.Required)) + + prompt.Message = "Enter a file path to the ingress private key" + _ = survey.AskOne(prompt, &config.TLS.CertPrivatePath, survey.WithValidator(survey.Required)) +} + +// PromptAndValidateHost Ask user for the hostname or ip if not provided via automation and validate the input +func PromptAndValidateHost(confirmed bool) { + if config.TLS.Host == "" { + if confirmed { + // Fail if host is not provided on confirm + message.Fatalf(nil, InvalidHostMessage, config.TLS.Host) + } + + message.Question(` + Zarf needs to know what static IP address or DNS name will be exposed for traffic + routed into the cluster. This will be how you connect to the cluster and if importing a + certificate should match the Subject Alternate Name specified in that certificate.`) + + message.Note(" Note: if using localhost, be sure to choose " + config.IPV4Localhost) + + // If not provided, always ask for a host entry to avoid having to guess which entry in a cert if provided + prompt := &survey.Input{ + Message: "What IP address or DNS name do you want to use?", + Suggest: func(toComplete string) []string { + var suggestions []string + // Create a list of IPs to add to the suggestion box + interfaces, err := net.InterfaceAddrs() + if err == nil { + for _, iface := range interfaces { + // Convert the CIDR to the IP string if valid + ip, _, _ := net.ParseCIDR(iface.String()) + if utils.ValidHostname(ip.String()) { + suggestions = append(suggestions, ip.String()) + } + } + } + // Add the localhost hostname as well + hostname, _ := os.Hostname() + if hostname != "" { + suggestions = append(suggestions, hostname) + } + + return suggestions + }, + } + err := survey.AskOne(prompt, &config.TLS.Host, survey.WithValidator(survey.Required)) + if err != nil && err.Error() == os.Interrupt.String() { + // Handle CTRL+C + os.Exit(0) + } + } + + if !utils.ValidHostname(config.TLS.Host) { + // When hitting an invalid hostname... + if confirmed { + // ...if using automation end it all + message.Fatalf(nil, InvalidHostMessage, config.TLS.Host) + } + // ...otherwise, warn user, reset the field, and cycle the function + message.Fatalf(nil, InvalidHostMessage, config.TLS.Host) + config.TLS.Host = "" + PromptAndValidateHost(confirmed) + } +} + +func HandleTLSOptions(confirmed bool) { + // Get and validate host + PromptAndValidateHost(confirmed) + + // Get the cert path if this is an import + if PromptIsImportCerts(confirmed) && !HasCertPaths() { + PromptCertPaths() + } +} diff --git a/cli/internal/packager/common.go b/cli/internal/packager/common.go index 2b3e4b9836..3a48ddf0f4 100644 --- a/cli/internal/packager/common.go +++ b/cli/internal/packager/common.go @@ -3,6 +3,7 @@ package packager import ( "crypto/sha256" "encoding/hex" + "fmt" "io" "io/ioutil" "net/http" @@ -11,30 +12,36 @@ import ( "strings" "time" + "github.com/goccy/go-yaml" + "github.com/AlecAivazis/survey/v2" "github.com/defenseunicorns/zarf/cli/config" + "github.com/defenseunicorns/zarf/cli/internal/message" "github.com/defenseunicorns/zarf/cli/internal/utils" - "github.com/sirupsen/logrus" ) type componentPaths struct { base string files string charts string - images string + values string repos string manifests string } type tempPaths struct { base string + seedImages string + images string dataInjections string components string } func createPaths() tempPaths { - basePath := utils.MakeTempDir() + basePath, _ := utils.MakeTempDir() return tempPaths{ base: basePath, + seedImages: basePath + "/seed-images.tar", + images: basePath + "/images.tar", dataInjections: basePath + "/data", components: basePath + "/components", } @@ -47,21 +54,21 @@ func createComponentPaths(basePath string, component config.ZarfComponent) compo base: basePath, files: basePath + "/files", charts: basePath + "/charts", - images: basePath + "/images-component-" + component.Name + ".tar", repos: basePath + "/repos", manifests: basePath + "/manifests", + values: basePath + "/values", } } func cleanup(tempPath tempPaths) { - logrus.Info("Cleaning up temp files") + message.Debug("Cleaning up temp files") _ = os.RemoveAll(tempPath.base) } -func confirmAction(configPath string, confirm bool, message string) bool { +func confirmAction(configPath string, userMessage string) bool { content, err := ioutil.ReadFile(configPath) if err != nil { - logrus.Fatal(err) + message.Fatal(err, "Unable to open the package config file") } // Convert []byte to string and print to screen @@ -70,16 +77,16 @@ func confirmAction(configPath string, confirm bool, message string) bool { utils.ColorPrintYAML(text) // Display prompt if not auto-confirmed - if confirm { - logrus.Info(message + " Zarf package confirmed") + if config.DeployOptions.Confirm { + message.Infof("%s Zarf package confirmed", userMessage) } else { prompt := &survey.Confirm{ - Message: message + " this Zarf package?", + Message: userMessage + " this Zarf package?", } - _ = survey.AskOne(prompt, &confirm) + _ = survey.AskOne(prompt, &config.DeployOptions.Confirm) } - return confirm + return config.DeployOptions.Confirm } func getValidComponents(allComponents []config.ZarfComponent, requestedComponentNames []string) []config.ZarfComponent { @@ -99,11 +106,17 @@ func getValidComponents(allComponents []config.ZarfComponent, requestedComponent } } } else { + // Present the users with the component details one more time + displayComponent := component + displayComponent.Description = "" + content, _ := yaml.Marshal(displayComponent) + utils.ColorPrintYAML(string(content)) + message.Question(fmt.Sprintf("%s: %s", component.Name, component.Description)) + // Since no requested components were provided, prompt the user prompt := &survey.Confirm{ - Message: "Deploy the " + component.Name + " component?", + Message: "Deploy this component?", Default: component.Default, - Help: component.Description, } _ = survey.AskOne(prompt, &confirmComponent) } @@ -111,10 +124,14 @@ func getValidComponents(allComponents []config.ZarfComponent, requestedComponent if confirmComponent { validComponentsList = append(validComponentsList, component) + // Make it easier to know we are running k3s + if config.IsZarfInitConfig() && component.Name == "k3s" { + config.DeployOptions.ApplianceMode = true + } } } - // Verify that we were able to successfully identify all of the requested components + // Verify that we were able to successfully identify all the requested components var nonMatchedComponents []string for requestedComponentIndex, componentMatched := range confirmedComponents { if !componentMatched { @@ -123,7 +140,7 @@ func getValidComponents(allComponents []config.ZarfComponent, requestedComponent } if len(nonMatchedComponents) > 0 { - logrus.Fatalf("Unable to find these components to deploy: %v.", nonMatchedComponents) + message.Fatalf(nil, "Unable to find these components to deploy: %v.", nonMatchedComponents) } return validComponentsList @@ -134,35 +151,33 @@ func HandleIfURL(packagePath string, shasum string, insecureDeploy bool) string // Check if the user gave us a remote package providedURL, err := url.Parse(packagePath) if err != nil || providedURL.Scheme == "" || providedURL.Host == "" { - logrus.WithField("archive", packagePath).Debug("The package provided is not a remote package.") return packagePath } if !insecureDeploy && shasum == "" { - logrus.Fatal("When deploying a remote package you must provide either a `--shasum` or the `--insecure` flag. Neither were provided.") + message.Fatal(nil, "When deploying a remote package you must provide either a `--shasum` or the `--insecure` flag. Neither were provided.") } // Check the extension on the package is what we expect if !isValidFileExtension(providedURL.Path) { - logrus.Fatalf("Only %s file extensions are permitted.\n", config.GetValidPackageExtensions()) + message.Fatalf(nil, "Only %s file extensions are permitted.\n", config.GetValidPackageExtensions()) } // Download the package resp, err := http.Get(packagePath) if err != nil { - logrus.Fatal("Unable to download the package: ", err) + message.Fatal(err, "Unable to download the package") } defer resp.Body.Close() // Write the package to a local file tempPath := createPaths() localPackagePath := tempPath.base + providedURL.Path - logrus.Debug("Creating local package with the path: ", localPackagePath) + message.Debugf("Creating local package with the path: %s", localPackagePath) packageFile, _ := os.Create(localPackagePath) _, err = io.Copy(packageFile, resp.Body) if err != nil { - logrus.Debug(err) - logrus.Fatal("Unable to copy the contents of the provided URL into a local file.") + message.Fatal(err, "Unable to copy the contents of the provided URL into a local file.") } // Check the shasum if necessary @@ -170,14 +185,13 @@ func HandleIfURL(packagePath string, shasum string, insecureDeploy bool) string hasher := sha256.New() _, err = io.Copy(hasher, packageFile) if err != nil { - logrus.Debug(err) - logrus.Fatal("Unable to calculate the sha256 of the provided remote package.") + message.Fatal(err, "Unable to calculate the sha256 of the provided remote package.") } value := hex.EncodeToString(hasher.Sum(nil)) if value != shasum { _ = os.Remove(localPackagePath) - logrus.Fatalf("Provided shasum (%s) of the package did not match what was downloaded (%s)\n", shasum, value) + message.Fatalf(nil, "Provided shasum (%s) of the package did not match what was downloaded (%s)\n", shasum, value) } } @@ -187,7 +201,7 @@ func HandleIfURL(packagePath string, shasum string, insecureDeploy bool) string func isValidFileExtension(filename string) bool { for _, extension := range config.GetValidPackageExtensions() { if strings.HasSuffix(filename, extension) { - logrus.WithField("packagePath", filename).Warn("Package extension is valid.") + message.Warnf("Extension for %s is invalid", filename) return true } } @@ -196,54 +210,66 @@ func isValidFileExtension(filename string) bool { } func loopScriptUntilSuccess(script string, retry bool) { - logContext := logrus.WithField("script", script) - logContext.Info("Waiting for script to complete successfully") - - var output string - var err error + spinner := message.NewProgressSpinner("Waiting for command \"%s\"", script) + defer spinner.Stop() // Try to patch the zarf binary path in case the name isn't exactly "./zarf" binaryPath, err := os.Executable() if err != nil { - logContext.Debug(err) - logContext.Warn("Unable to determine the current zarf binary path") + spinner.Errorf(err, "Unable to determine the current zarf binary path") } else { script = strings.ReplaceAll(script, "./zarf ", binaryPath+" ") - // Update since we may have a new parsed script - logContext = logrus.WithField("script", script) } // 2 minutes per script (60 * 2 second waits) tries := 60 for { - tries-- - // If there are no more tries left, drop a warning and continue - if tries < 1 { - logContext.Warn("Script failed or timed out") - logContext.Print(output) - break - } scriptEnvVars := []string{ - "ZARF_TARGET_ENDPOINT=" + config.GetTargetEndpoint(), + "ZARF_REGISTRY=" + config.ZarfRegistry, + "ZARF_SEED_REGISTRY=" + config.ZarfLocalSeedRegistry, } // Try to silently run the script - output, err = utils.ExecCommand(false, scriptEnvVars, "sh", "-c", script) + output, err := utils.ExecCommand(false, scriptEnvVars, "sh", "-c", script) + if err != nil { - logrus.Debug(err) + message.Debug(err, output) + if retry { - // if retry is enabled, on error wait 2 seconds and try again - time.Sleep(time.Second * 2) - } else { - // No retry, abort - tries = 0 - } - continue - } else { - // Script successful, output results and continue - if output != "" { - logContext.Print(output) + tries-- + + // If there are no more tries left, we have failed + if tries < 1 { + spinner.Fatalf(nil, "Script timed out after 2 minutes") + } else { + // if retry is enabled, on error wait 2 seconds and try again + time.Sleep(time.Second * 2) + continue + } } - break + + spinner.Fatalf(nil, "Script failed") } + + // Script successful,continue + message.Debug(output) + spinner.Success() + break + } +} + +// removeDuplicates reduces a string slice to unique values only, https://www.dotnetperls.com/duplicates-go +func removeDuplicates(elements []string) []string { + seen := map[string]bool{} + + // Create a map of all unique elements. + for v := range elements { + seen[elements[v]] = true + } + + // Place all keys from the map into a slice. + var result []string + for key := range seen { + result = append(result, key) } + return result } diff --git a/cli/internal/packager/create.go b/cli/internal/packager/create.go index fd4aaf1c65..b0141e8565 100644 --- a/cli/internal/packager/create.go +++ b/cli/internal/packager/create.go @@ -1,49 +1,60 @@ package packager import ( + "fmt" "os" "path/filepath" "regexp" "strconv" + "strings" "github.com/defenseunicorns/zarf/cli/config" "github.com/defenseunicorns/zarf/cli/internal/git" "github.com/defenseunicorns/zarf/cli/internal/helm" "github.com/defenseunicorns/zarf/cli/internal/images" + "github.com/defenseunicorns/zarf/cli/internal/message" "github.com/defenseunicorns/zarf/cli/internal/utils" "github.com/mholt/archiver/v3" - "github.com/sirupsen/logrus" ) -func Create(confirm bool) { +func Create() { if err := config.LoadConfig("zarf.yaml"); err != nil { - logrus.Debug(err) - logrus.Fatal("Unable to read the zarf.yaml file") + message.Fatal(err, "Unable to read the zarf.yaml file") } tempPath := createPaths() packageName := config.GetPackageName() dataInjections := config.GetDataInjections() + seedImages := config.GetSeedImages() components := config.GetComponents() configFile := tempPath.base + "/zarf.yaml" // Save the transformed config if err := config.BuildConfig(configFile); err != nil { - logrus.Debug(err) - logrus.WithField("path", configFile).Fatal("Unable to write the zarf.yaml file") + message.Fatalf(err, "Unable to write the %s file", configFile) } - confirm = confirmAction(configFile, confirm, "Create") - - if !confirm { + if !confirmAction(configFile, "Create") { os.Exit(0) } + if len(seedImages) > 0 { + // Load seed images into their own happy little tarball for ease of import on init + images.PullAll(seedImages, tempPath.seedImages) + } + + var combinedImageList []string for _, component := range components { - logrus.WithField("component", component.Name).Info("Loading component assets") - componentPath := createComponentPaths(tempPath.components, component) - addLocalAssets(componentPath, component) + addComponent(tempPath, component) + // Combine all component images into a single entry for efficient layer reuse + combinedImageList = append(combinedImageList, component.Images...) + } + + // Images are handled separately from other component assets + if len(combinedImageList) > 0 { + uniqueList := removeDuplicates(combinedImageList) + images.PullAll(uniqueList, tempPath.images) } if config.IsZarfInitConfig() { @@ -52,7 +63,6 @@ func Create(confirm bool) { } else { // Init packages do not use data or utilityCluster keys if len(dataInjections) > 0 { - logrus.Info("Loading data injections") for _, data := range dataInjections { destinationFile := tempPath.dataInjections + "/" + filepath.Base(data.Target.Path) utils.CreatePathAndCopy(data.Source, destinationFile) @@ -62,35 +72,39 @@ func Create(confirm bool) { _ = os.RemoveAll(packageName) err := archiver.Archive([]string{tempPath.base + "/"}, packageName) if err != nil { - logrus.Debug(err) - logrus.Fatal("Unable to create the package archive") + message.Fatal(err, "Unable to create the package archive") } - logrus.WithField("name", packageName).Info("Package creation complete") - cleanup(tempPath) } -func addLocalAssets(tempPath componentPaths, assets config.ZarfComponent) { - if len(assets.Charts) > 0 { - logrus.Info("Loading static helm charts") - _ = utils.CreateDirectory(tempPath.charts, 0700) +func addComponent(tempPath tempPaths, component config.ZarfComponent) { + message.HeaderInfof("📦 %s COMPONENT", strings.ToUpper(component.Name)) + componentPath := createComponentPaths(tempPath.components, component) + + if len(component.Charts) > 0 { + _ = utils.CreateDirectory(componentPath.charts, 0700) + _ = utils.CreateDirectory(componentPath.values, 0700) re := regexp.MustCompile(`\.git$`) - for _, chart := range assets.Charts { - matched := re.MatchString(chart.Url) - if matched { - helm.DownloadChartFromGit(chart, tempPath.charts) + for _, chart := range component.Charts { + isGitURL := re.MatchString(chart.Url) + if isGitURL { + helm.DownloadChartFromGit(chart, componentPath.charts) } else { - helm.DownloadPublishedChart(chart, tempPath.charts) + helm.DownloadPublishedChart(chart, componentPath.charts) + } + for idx, path := range chart.ValuesFiles { + chartValueName := helm.StandardName(componentPath.values, chart) + "-" + strconv.Itoa(idx) + utils.CreatePathAndCopy(path, chartValueName) } } } - if len(assets.Files) > 0 { - logrus.Info("Downloading files for local install") - _ = utils.CreateDirectory(tempPath.files, 0700) - for index, file := range assets.Files { - destinationFile := tempPath.files + "/" + strconv.Itoa(index) + if len(component.Files) > 0 { + _ = utils.CreateDirectory(componentPath.files, 0700) + for index, file := range component.Files { + message.Debugf("Loading %v", file) + destinationFile := componentPath.files + "/" + strconv.Itoa(index) if utils.IsUrl(file.Source) { utils.DownloadToFile(file.Source, destinationFile) } else { @@ -102,7 +116,9 @@ func addLocalAssets(tempPath componentPaths, assets config.ZarfComponent) { utils.ValidateSha256Sum(file.Shasum, destinationFile) } - if file.Executable { + info, _ := os.Stat(destinationFile) + + if file.Executable || info.IsDir() { _ = os.Chmod(destinationFile, 0700) } else { _ = os.Chmod(destinationFile, 0600) @@ -110,22 +126,16 @@ func addLocalAssets(tempPath componentPaths, assets config.ZarfComponent) { } } - if len(assets.Images) > 0 { - logrus.Info("Loading container images") - images.PullAll(assets.Images, tempPath.images) - } - - if assets.ManifestsPath != "" { - logrus.WithField("path", assets.ManifestsPath).Info("Loading manifests for local install") - utils.CreatePathAndCopy(assets.ManifestsPath, tempPath.manifests) + for _, manifest := range component.Manifests { + for _, file := range manifest.Files { + destination := fmt.Sprintf("%s/%s", componentPath.manifests, file) + utils.CreatePathAndCopy(file, destination) + } } - if len(assets.Repos) > 0 { - logrus.Info("loading git repos for gitops service transfer") - // Load all specified git repos - for _, url := range assets.Repos { - // Pull all of the references if there is no `@` in the string - git.Pull(url, tempPath.repos) - } + // Load all specified git repos + for _, url := range component.Repos { + // Pull all the references if there is no `@` in the string + git.Pull(url, componentPath.repos) } } diff --git a/cli/internal/packager/deploy.go b/cli/internal/packager/deploy.go index 375ac103a7..d05a9aa1ab 100644 --- a/cli/internal/packager/deploy.go +++ b/cli/internal/packager/deploy.go @@ -1,11 +1,8 @@ package packager import ( - "encoding/base64" - "fmt" "os" "path/filepath" - "regexp" "strconv" "strings" @@ -14,246 +11,240 @@ import ( "github.com/defenseunicorns/zarf/cli/internal/helm" "github.com/defenseunicorns/zarf/cli/internal/images" "github.com/defenseunicorns/zarf/cli/internal/k8s" - "github.com/defenseunicorns/zarf/cli/internal/pki" + "github.com/defenseunicorns/zarf/cli/internal/message" + "github.com/defenseunicorns/zarf/cli/internal/template" "github.com/defenseunicorns/zarf/cli/internal/utils" "github.com/mholt/archiver/v3" "github.com/otiai10/copy" - "github.com/sirupsen/logrus" + "github.com/pterm/pterm" ) -func Deploy(packagePath string, confirm bool, componentRequest string) { +var valueTemplate template.Values + +func Deploy() { + message.Debug("packager.Deploy()") // Prevent disk pressure on smaller systems due to leaking temp files _ = os.RemoveAll("/tmp/zarf*") tempPath := createPaths() - logContext := logrus.WithFields(logrus.Fields{ - "path": packagePath, - "confirm": confirm, - "components": componentRequest, - }) - // Make sure the user gave us a package we can work with - if utils.InvalidPath(packagePath) { - logContext.Fatal("Was not able to find the package on the local system") + if utils.InvalidPath(config.DeployOptions.PackagePath) { + message.Fatalf(nil, "Unable to find the package on the local system, expected package at %s", config.DeployOptions.PackagePath) } // Extract the archive - logContext.Info("Extracting the package, this may take a few moments") - err := archiver.Unarchive(packagePath, tempPath.base) + message.Info("Extracting the package, this may take a few moments") + err := archiver.Unarchive(config.DeployOptions.PackagePath, tempPath.base) if err != nil { - logContext.Debug(err) - logContext.Fatal("Unable to extract the package contents") - } - - configPath := tempPath.base + "/zarf.yaml" - confirm = confirmAction(configPath, confirm, "Deploy") - - // Don't continue unless the user says so - if !confirm { - cleanup(tempPath) - os.Exit(0) + message.Fatal(err, "Unable to extract the package contents") } // Load the config from the extracted archive zarf.yaml if err := config.LoadConfig(tempPath.base + "/zarf.yaml"); err != nil { - logContext.Debug(err) - logContext.Fatalf("Unable to read the zarf.yaml file from %s", tempPath.base) + message.Fatalf(err, "Invalid or unreadable zarf.yaml file in %s", tempPath.base) } - dataInjectionList := config.GetDataInjections() + if config.IsZarfInitConfig() { + // If init config, make sure things are ready + utils.RunPreflightChecks() + } else { + // Otherwise, skip duplicate user approval + configPath := tempPath.base + "/zarf.yaml" + confirm := confirmAction(configPath, "Deploy") + + // Don't continue unless the user says so + if !confirm { + cleanup(tempPath) + os.Exit(0) + } + } // Verify the components requested all exist components := config.GetComponents() var requestedComponents []string - if componentRequest != "" { - requestedComponents = strings.Split(componentRequest, ",") + if config.DeployOptions.Components != "" { + requestedComponents = strings.Split(config.DeployOptions.Components, ",") } componentsToDeploy := getValidComponents(components, requestedComponents) - // Deploy all of the components + // Deploy all the components for _, component := range componentsToDeploy { - componentPath := createComponentPaths(tempPath.components, component) - deployComponents(componentPath, component) + deployComponents(tempPath, component) } - if !config.IsZarfInitConfig() { + if config.IsZarfInitConfig() { + // If this is the end of an initconfig, cleanup and tell the user we're ready to roll + _ = os.Remove(".zarf-registry") + + _ = pterm.DefaultTable.WithHasHeader().WithData(pterm.TableData{ + {"Application", "Username", "Password", "Connect"}, + {"Logging", "zarf-admin", config.GetSecret(config.StateLogging), "zarf connect logging"}, + {"Git", config.ZarfGitPushUser, config.GetSecret(config.StateGitPush), "zarf connect git"}, + {"Registry", "zarf-push-user", config.GetSecret(config.StateRegistryPush), "zarf connect registry"}, + }).Render() + } else { + // Otherwise, look for any datainjections to run after the components + dataInjectionList := config.GetDataInjections() if len(dataInjectionList) > 0 { - logContext.Info("Loading data injections") - injectionCompletionMarker := tempPath.dataInjections + "/.zarf-sync-complete" - utils.WriteFile(injectionCompletionMarker, []byte("🦄")) - for _, data := range dataInjectionList { - sourceFile := tempPath.dataInjections + "/" + filepath.Base(data.Target.Path) - pods := k8s.WaitForPodsAndContainers(data.Target) - - for _, pod := range pods { - destination := data.Target.Path - if destination == "/"+filepath.Base(destination) { - // Handle top-level directory targets - destination = "/" - } - cpPodExecArgs := []string{"kubectl", "-n", data.Target.Namespace, "cp", sourceFile, pod + ":" + destination} - - if data.Target.Container != "" { - // Append the container args if they are specified - cpPodExecArgs = append(cpPodExecArgs, "-c", data.Target.Container) - } - - _, err = utils.ExecCommand(true, nil, config.K3sBinary, cpPodExecArgs...) - if err != nil { - logrus.Warn("Error copying data into the pod") - } else { - // Leave a marker in the target container for pods to track the sync action - cpPodExecArgs[4] = injectionCompletionMarker - cpPodExecArgs[5] = pod + ":" + data.Target.Path - _, err = utils.ExecCommand(true, nil, config.K3sBinary, cpPodExecArgs...) - if err != nil { - logrus.Warn("Error saving the zarf sync completion file") - } - } - } - // Cleanup now to reduce disk pressure - _ = os.RemoveAll(sourceFile) - } + message.Info("Loading data injections") + handleDataInjection(dataInjectionList, tempPath) } - } cleanup(tempPath) + + // All done + os.Exit(0) } -func deployComponents(tempPath componentPaths, component config.ZarfComponent) { - values := generateTemplateValues() +func deployComponents(tempPath tempPaths, component config.ZarfComponent) { + message.Debugf("packager.deployComponents(%v, %v", tempPath, component) + componentPath := createComponentPaths(tempPath.components, component) + isSeedRegistry := config.IsZarfInitConfig() && component.Name == "container-registry-seed" + hasImages := len(component.Images) > 0 + hasCharts := len(component.Charts) > 0 + hasManifests := len(component.Manifests) > 0 + hasRepos := len(component.Repos) > 0 - if component.Name != "" { - // Only log this for named components - logrus.WithField("name", component.Name).Info("Deploying Zarf component") - } else { - component.Name = "core" - } + // All components now require a name + message.HeaderInfof("📦 %s COMPONENT", strings.ToUpper(component.Name)) for _, script := range component.Scripts.Before { loopScriptUntilSuccess(script, component.Scripts.Retry) } + spinner := message.NewProgressSpinner("Copying %v files", len(component.Files)) + defer spinner.Stop() + for index, file := range component.Files { - sourceFile := tempPath.files + "/" + strconv.Itoa(index) + spinner.Updatef("Loading %s", file.Target) + sourceFile := componentPath.files + "/" + strconv.Itoa(index) // If a shasum is specified check it again on deployment as well if file.Shasum != "" { + spinner.Updatef("Validating SHASUM for %s", file.Target) utils.ValidateSha256Sum(file.Shasum, sourceFile) } - // Perform secret injection if the file is marked as template - if file.Template { - templateFile(sourceFile, values) - } - // Copy the file to the destination + spinner.Updatef("Saving %s", file.Target) err := copy.Copy(sourceFile, file.Target) if err != nil { - logrus.Debug(err) - logrus.WithField("file", file.Target).Fatal("Unable to copy the contents of the asset") + spinner.Fatalf(err, "Unable to copy the contents of %s", file.Target) } + // Loop over all symlinks and create them for _, link := range file.Symlinks { + spinner.Updatef("Adding symlink %s->%s", link, file.Target) // Try to remove the filepath if it exists _ = os.RemoveAll(link) // Make sure the parent directory exists - utils.CreateFilePath(link) + _ = utils.CreateFilePath(link) // Create the symlink err := os.Symlink(file.Target, link) if err != nil { - logrus.Debug(err) - logrus.WithField("target", link).Fatal("Unable to create the symbolic link") + spinner.Fatalf(err, "Unable to create the symbolic link %s -> %s", link, file.Target) } } // Cleanup now to reduce disk pressure _ = os.RemoveAll(sourceFile) } + spinner.Success() - if len(component.Charts) > 0 { - logrus.Info("Loading charts for local install") - for _, chart := range component.Charts { - sourceTarball := helm.StandardName(tempPath.charts, chart) - destinationTarball := helm.StandardName(config.K3sChartPath, chart) - utils.CreatePathAndCopy(sourceTarball, destinationTarball) - } + if isSeedRegistry { + preSeedRegistry(tempPath) + valueTemplate = template.Generate() } - if len(component.Images) > 0 { - logrus.Info("Loading images for local install") - if config.IsZarfInitConfig() { - _, err := utils.ExecCommand(true, nil, config.K3sBinary, "ctr", "images", "import", tempPath.images) - if err != nil { - logrus.Fatal("Unable to import the images into containerd") - } - } else { - logrus.Info("Loading images for gitops service transfer") - // Push all images the images.tar file based on the zarf.yaml list - images.PushAll(tempPath.images, component.Images, config.GetTargetEndpoint()) - // Cleanup now to reduce disk pressure - _ = os.RemoveAll(tempPath.images) + if !valueTemplate.Ready() && (hasImages || hasCharts || hasManifests || hasRepos) { + spinner := message.NewProgressSpinner("Loading the Zarf State from the Kubernetes cluster") + defer spinner.Stop() + + state := k8s.LoadZarfState() + config.InitState(state) + valueTemplate = template.Generate() + if state.Distro == "" { + spinner.Fatalf(nil, "Unable to load the zarf/zarf-state secret") } + spinner.Success() } - if component.ManifestsPath != "" { - logrus.Info("Loading manifests for local install, this may take a minute or so to reflect in k3s") - - // Only pull in yml and yaml files - pattern := regexp.MustCompile(`(?mi)\.ya?ml$`) - manifests := utils.RecursiveFileList(tempPath.manifests, pattern) + if hasImages { + images.PushToZarfRegistry(tempPath.images, component.Images, config.ZarfRegistry) + } - // Iterate through all the manifests and replace any ZARF_SECRET, ZARF_HTPASSWD, or ZARF_DOCKERAUTH values - for _, manifest := range manifests { - templateFile(manifest, values) + for _, chart := range component.Charts { + // zarf magic for the value file + for idx := range chart.ValuesFiles { + chartValueName := helm.StandardName(componentPath.values, chart) + "-" + strconv.Itoa(idx) + valueTemplate.Apply(chartValueName) } - utils.CreatePathAndCopy(tempPath.manifests, config.K3sManifestPath) + // Generate helm templates to pass to gitops engine + helm.InstallOrUpgradeChart(helm.ChartOptions{ + BasePath: componentPath.base, + Chart: chart, + Images: component.Images, + }) } - if len(component.Repos) > 0 { - logrus.Info("Loading git repos for gitops service transfer") + for _, manifest := range component.Manifests { + helm.GenerateChart(componentPath.manifests, manifest, component.Images) + } + + if hasRepos { // Push all the repos from the extracted archive - git.PushAllDirectories(tempPath.repos) + git.PushAllDirectories(componentPath.repos) } for _, script := range component.Scripts.After { loopScriptUntilSuccess(script, component.Scripts.Retry) } - if config.IsZarfInitConfig() && component.Name == "k3s" { - pki.InjectServerCert() + if isSeedRegistry { + postSeedRegistry(tempPath) } - } -type templateValues struct { - secret string - htpasswd string - dockerAuth string - endpoint string -} +// handleDataInjection performs data-copy operations into a pod +// todo: this currently requires kubectl but we should have enough k8s work to make this native now +func handleDataInjection(dataInjectionList []config.ZarfData, tempPath tempPaths) { + injectionCompletionMarker := tempPath.dataInjections + "/.zarf-sync-complete" + if err := utils.WriteFile(injectionCompletionMarker, []byte("🦄")); err != nil { + return + } + for _, data := range dataInjectionList { + sourceFile := tempPath.dataInjections + "/" + filepath.Base(data.Target.Path) + pods := k8s.WaitForPodsAndContainers(data.Target, true) + + for _, pod := range pods { + destination := data.Target.Path + if destination == "/"+filepath.Base(destination) { + // Handle top-level directory targets + destination = "/" + } + cpPodExecArgs := []string{"kubectl", "-n", data.Target.Namespace, "cp", sourceFile, pod + ":" + destination} -func generateTemplateValues() templateValues { - var generated templateValues - var err error + if data.Target.Container != "" { + // Append the container args if they are specified + cpPodExecArgs = append(cpPodExecArgs, "-c", data.Target.Container) + } - generated.secret = git.GetOrCreateZarfSecret() - generated.htpasswd, err = utils.GetHtpasswdString(config.ZarfGitUser, generated.secret) - if err != nil { - logrus.Debug(err) - logrus.Fatal("Unable to define `htpasswd` string for the Zarf user") + _, err := utils.ExecCommand(true, nil, config.K3sBinary, cpPodExecArgs...) + if err != nil { + message.Warn("Error copying data into the pod") + } else { + // Leave a marker in the target container for pods to track the sync action + cpPodExecArgs[4] = injectionCompletionMarker + cpPodExecArgs[5] = pod + ":" + data.Target.Path + _, err = utils.ExecCommand(true, nil, config.K3sBinary, cpPodExecArgs...) + if err != nil { + message.Warn("Error saving the zarf sync completion file") + } + } + } + // Cleanup now to reduce disk pressure + _ = os.RemoveAll(sourceFile) } - generated.dockerAuth = base64.StdEncoding.EncodeToString([]byte(fmt.Sprintf("%s:%s", config.ZarfGitUser, generated.secret))) - generated.endpoint = config.GetTargetEndpoint() - return generated -} - -func templateFile(path string, values templateValues) { - logrus.WithField("path", path).Info("Processing file for templating") - utils.ReplaceText(path, "###ZARF_TARGET_ENDPOINT###", values.endpoint) - utils.ReplaceText(path, "###ZARF_SECRET###", values.secret) - utils.ReplaceText(path, "###ZARF_HTPASSWD###", values.htpasswd) - utils.ReplaceText(path, "###ZARF_DOCKERAUTH###", values.dockerAuth) } diff --git a/cli/internal/packager/initialize.go b/cli/internal/packager/initialize.go deleted file mode 100644 index 2ff96d2976..0000000000 --- a/cli/internal/packager/initialize.go +++ /dev/null @@ -1,48 +0,0 @@ -package packager - -import ( - "github.com/defenseunicorns/zarf/cli/config" - "github.com/defenseunicorns/zarf/cli/internal/git" - "github.com/defenseunicorns/zarf/cli/internal/utils" - "github.com/sirupsen/logrus" -) - -type InstallOptions struct { - Confirmed bool - Components string -} - -func Install(options *InstallOptions) { - utils.RunPreflightChecks() - - logrus.Info("Initializing a new zarf cluster") - - // Generate or create the zarf secret - gitSecret := git.GetOrCreateZarfSecret() - logrus.Debug("gitSecret", gitSecret) - - // Now that we have what the password will be, we should add the login entry to the system's registry config - if err := utils.Login(config.GetTargetEndpoint(), config.ZarfGitUser, gitSecret); err != nil { - logrus.Debug(err) - logrus.Fatal("Unable to add login credentials for the gitops registry") - } - - // We really need to make sure this is still necessary.... - if utils.IsRHEL() { - // @todo: k3s docs recommend disabling this, but we should look at just tuning it appropriately - if _, err := utils.ExecCommand(true, nil, "systemctl", "disable", "firewalld", "--now"); err != nil { - logrus.Debug(err) - logrus.Warn("Unable to disable the firewall") - } - } - - // Continue running package deploy for all components like any other package - Deploy(config.PackageInitName, options.Confirmed, options.Components) - - logrus.Info("Installation complete. You can run \"/usr/local/bin/k9s\" to monitor the status of the deployment.") - logrus.WithFields(logrus.Fields{ - "Gitea Username (if installed)": config.ZarfGitUser, - "Grafana Username": "zarf-admin", - "Password (all)": gitSecret, - }).Warn("Credentials stored in ~/.git-credentials") -} diff --git a/cli/internal/packager/inspect.go b/cli/internal/packager/inspect.go index f9bddbb71d..a7f0914b91 100644 --- a/cli/internal/packager/inspect.go +++ b/cli/internal/packager/inspect.go @@ -1,13 +1,12 @@ package packager import ( - "fmt" "io/ioutil" "github.com/defenseunicorns/zarf/cli/config" + "github.com/defenseunicorns/zarf/cli/internal/message" "github.com/defenseunicorns/zarf/cli/internal/utils" "github.com/mholt/archiver/v3" - "github.com/sirupsen/logrus" ) // Inspect list the contents of a package @@ -15,7 +14,7 @@ func Inspect(packageName string) { tempPath := createPaths() if utils.InvalidPath(packageName) { - logrus.WithField("archive", packageName).Fatal("The package archive seems to be missing or unreadable.") + message.Fatalf(nil, "The package archive %s seems to be missing or unreadable.", packageName) } // Extract the archive @@ -23,7 +22,7 @@ func Inspect(packageName string) { content, err := ioutil.ReadFile(tempPath.base + "/zarf.yaml") if err != nil { - logrus.Fatal(err) + message.Fatal(err, "Unable to read the config file in the package") } // Convert []byte to string and print to screen @@ -33,11 +32,10 @@ func Inspect(packageName string) { // Load the config to get the build version if err := config.LoadConfig(tempPath.base + "/zarf.yaml"); err != nil { - logrus.Fatal(err) - logrus.Fatalf("Unable to read the zarf.yaml file from %s", tempPath.base) + message.Fatalf(err, "Unable to read %s", tempPath.base) } - fmt.Printf("The package was built with Zarf CLI version %s\n", config.GetBuildData().Version) + message.Infof("The package was built with Zarf CLI version %s\n", config.GetBuildData().Version) cleanup(tempPath) } diff --git a/cli/internal/packager/seed.go b/cli/internal/packager/seed.go new file mode 100644 index 0000000000..939858c4e3 --- /dev/null +++ b/cli/internal/packager/seed.go @@ -0,0 +1,223 @@ +package packager + +import ( + "context" + "fmt" + "strings" + "time" + + "github.com/defenseunicorns/zarf/cli/config" + "github.com/defenseunicorns/zarf/cli/internal/images" + "github.com/defenseunicorns/zarf/cli/internal/k8s" + "github.com/defenseunicorns/zarf/cli/internal/message" + "github.com/defenseunicorns/zarf/cli/internal/message/tls" + "github.com/defenseunicorns/zarf/cli/internal/pki" + "github.com/defenseunicorns/zarf/cli/internal/utils" + "github.com/distribution/distribution/v3/configuration" + "github.com/distribution/distribution/v3/registry" + _ "github.com/distribution/distribution/v3/registry/auth/htpasswd" // used for embedded registry + _ "github.com/distribution/distribution/v3/registry/storage/driver/filesystem" // used for embedded registry +) + +var stopSeedRegistry context.CancelFunc + +func startSeedRegistry(host string, readOnly bool) { + message.Debugf("packager.startSeedRegistry(%v)", readOnly) + useTLS := host != config.IPV4Localhost + registryConfig := &configuration.Configuration{} + + if message.GetLogLevel() >= message.DebugLevel { + registryConfig.Log.Level = "debug" + } else { + registryConfig.Log.AccessLog.Disabled = true + registryConfig.Log.Formatter = "text" + registryConfig.Log.Level = "error" + } + + registryConfig.HTTP.DrainTimeout = 5 * time.Second + registryConfig.HTTP.Secret = utils.RandomString(20) + + if useTLS { + registryConfig.HTTP.TLS.Certificate = config.TLS.CertPublicPath + registryConfig.HTTP.TLS.Key = config.TLS.CertPrivatePath + } + + fileStorage := configuration.Parameters{ + "rootdirectory": ".zarf-registry", + } + + if readOnly { + if useTLS { + // Bind to any if using tls + registryConfig.HTTP.Addr = ":" + config.ZarfSeedPort + } else { + // otherwise, force localhost + registryConfig.HTTP.Addr = fmt.Sprintf("%s:%s", config.IPV4Localhost, config.ZarfSeedPort) + } + registryConfig.Storage = configuration.Storage{ + "filesystem": fileStorage, + "maintenance": configuration.Parameters{ + "readonly": map[interface{}]interface{}{ + "enabled": true, + }, + }, + } + } else { + // Read-write only listen on localhost + registryConfig.HTTP.Addr = config.ZarfLocalSeedRegistry + registryConfig.Storage = configuration.Storage{ + "filesystem": fileStorage, + } + } + + ctx, done := context.WithCancel(context.Background()) + + embeddedRegistry, err := registry.NewRegistry(ctx, registryConfig) + if err != nil { + message.Fatal(err, "Unable to start the embedded registry") + } + + //go func() { + if err := embeddedRegistry.ListenAndServe(); err != nil { + message.Fatal(err, "Unable to start the embedded registry") + } + //}() + + stopSeedRegistry = done +} + +func preSeedRegistry(tempPath tempPaths) { + message.Debugf("package.preSeedRegistry(%v)", tempPath) + + var ( + distro string + err error + inject struct { + command string + args []string + } + ) + + // Attempt to load an existing state prior to init + state := k8s.LoadZarfState() + + if state.Secret == "" || state.Distro == k8s.DistroIsUnknown { + // If the state is invalid, assume this is a new cluster + message.Debug("New cluster, no zarf state found") + + if config.DeployOptions.ApplianceMode { + // If the K3s component is being deployed, skip distro detection + distro = k8s.DistroIsK3s + state.ZarfAppliance = true + } else { + // Otherwise, trying to detect the K8s distro type + distro, err = k8s.DetectDistro() + if err != nil { + // This is a basic failure right now but likely could be polished to provide user guidance to resolve + message.Fatal(err, "Unable to connect to the k8s cluster to verify the distro") + } + } + + message.Debugf("Detected K8s distro %v", distro) + + // Defaults + state.Registry.NodePort = "31999" + state.Secret = utils.RandomString(120) + state.Distro = distro + } + + switch state.Distro { + case k8s.DistroIsK3s: + state.StorageClass = "local-path" + state.Registry.SeedType = config.ZarfSeedTypeCLIInject + inject.command = "k3s" + inject.args = []string{"ctr", "images", "import", tempPath.seedImages} + + case k8s.DistroIsK3d: + state.StorageClass = "local-path" + clusterName := getClusterName("k3d") + state.Registry.SeedType = config.ZarfSeedTypeCLIInject + inject.command = "k3d" + inject.args = []string{"image", "import", tempPath.seedImages, "--cluster", clusterName} + + case k8s.DistroIsKind: + state.StorageClass = "standard" + // See https://github.com/kubernetes-sigs/kind/blob/v0.11.1/pkg/cluster/internal/kubeconfig/internal/kubeconfig/helpers.go#L24 + clusterName := getClusterName("kind") + state.Registry.SeedType = config.ZarfSeedTypeCLIInject + inject.command = "kind" + inject.args = []string{"load", "image-archive", tempPath.seedImages, "--name", clusterName} + + default: + state.Registry.SeedType = config.ZarfSeedTypeRuntimeRegistry + } + + switch state.Registry.SeedType { + case config.ZarfSeedTypeCLIInject: + // If this is a seed image injection, attempt to run it and warn if there is an error + if _, err = utils.ExecCommand(true, nil, inject.command, inject.args...); err != nil { + message.Errorf(err, "Unable to inject the seed image from the %s archive", tempPath.seedImages) + } + // Set TLS host so that the seed template isn't broken + config.TLS.Host = config.IPV4Localhost + + case config.ZarfSeedTypeRuntimeRegistry: + // Otherwise, start embedded registry read/write (only on localhost) + startSeedRegistry(config.IPV4Localhost, false) + + // Populate the seed registry + images.PushToZarfRegistry(tempPath.seedImages, config.GetSeedImages(), config.ZarfLocalSeedRegistry) + + // Close this registry now + stopSeedRegistry() + + if config.TLS.Host == "" { + // Get user to choose/enter host info for the read-only seed registry + tls.HandleTLSOptions(config.DeployOptions.Confirm) + pki.HandlePKI() + } + + // Start the registry again read-only now + startSeedRegistry(config.TLS.Host, true) + + default: + message.Fatalf(nil, "Unknown seed registry status") + } + + // Save the state back to K8s + if err := k8s.SaveZarfState(state); err != nil { + message.Fatal(err, "Unable to save the Zarf state data back to the cluster") + } + + // Load state for the rest of the operations + config.InitState(state) + + registrySecret := config.GetSecret(config.StateRegistryPush) + // Now that we have what the password will be, we should add the login entry to the system's registry config + if err := utils.Login(config.ZarfRegistry, config.ZarfRegistryPushUser, registrySecret); err != nil { + message.Fatal(err, "Unable to add login credentials for the gitops registry") + } +} + +func postSeedRegistry(tempPath tempPaths) { + message.Debug("packager.postSeedRegistry(%v)", tempPath) + + if stopSeedRegistry != nil { + // Close the seed registry, no longer needed + stopSeedRegistry() + } + + // Push the seed images into to Zarf registry + images.PushToZarfRegistry(tempPath.seedImages, config.GetSeedImages(), config.ZarfRegistry) +} + +func getClusterName(prefix string) string { + message.Debugf("packager.getClusterName(%v)", prefix) + + if ctx, err := k8s.GetContext(); err != nil { + message.Error(err, "Unable to auto-inject the registry image into KIND") + return "" + } else { + return strings.Replace(ctx, prefix+"-", "", 1) + } +} diff --git a/cli/internal/pki/pki.go b/cli/internal/pki/pki.go index 2f19680ad0..82c1f71159 100644 --- a/cli/internal/pki/pki.go +++ b/cli/internal/pki/pki.go @@ -14,9 +14,8 @@ import ( "time" "github.com/defenseunicorns/zarf/cli/config" - "github.com/defenseunicorns/zarf/cli/internal/k8s" + "github.com/defenseunicorns/zarf/cli/internal/message" "github.com/defenseunicorns/zarf/cli/internal/utils" - "github.com/sirupsen/logrus" ) // Based off of https://github.com/dmcgowan/quicktls/blob/master/main.go @@ -29,29 +28,29 @@ const org = "Zarf Cluster" const validFor = time.Hour * 24 * 375 func HandlePKI() { - pkiConfig := config.GetState().TLS + pkiConfig := config.TLS if pkiConfig.CertPublicPath == "" || pkiConfig.CertPrivatePath == "" { // No certs provided, so generate them with an ephemeral CA GeneratePKI() + pkiConfig = config.TLS } } // GeneratePKI create a CA and signed server keypair func GeneratePKI() { - state := config.GetState() directory := "zarf-pki" _ = utils.CreateDirectory(directory, 0700) caFile := filepath.Join(directory, "zarf-ca.crt") ca, caKey, err := generateCA(caFile, validFor) if err != nil { - logrus.Fatal(err) + message.Fatal(err, "Unable to generate the ephemeral CA") } hostCert := filepath.Join(directory, "zarf-server.crt") hostKey := filepath.Join(directory, "zarf-server.key") - if err := generateCert(state.TLS.Host, hostCert, hostKey, ca, caKey, validFor); err != nil { - logrus.Fatal(err) + if err := generateCert(config.TLS.Host, hostCert, hostKey, ca, caKey, validFor); err != nil { + message.Fatalf(err, "Unable to generate the cert for %s", config.TLS.Host) } publicKeyBlock := pem.Block{ @@ -61,26 +60,17 @@ func GeneratePKI() { publicKeyPem := string(pem.EncodeToMemory(&publicKeyBlock)) - state.TLS.CertPublicPath = directory + "/zarf-server.crt" - state.TLS.CertPrivatePath = directory + "/zarf-server.key" + config.TLS.CertPublicPath = directory + "/zarf-server.crt" + config.TLS.CertPrivatePath = directory + "/zarf-server.key" addCAToTrustStore(caFile) fmt.Println("Ephemeral CA below and saved to " + caFile + "\n") fmt.Println(publicKeyPem) - - if err := config.WriteState(state); err != nil { - logrus.Debug(err) - logrus.Fatal("Unable to save the zarf state file.") - } -} - -func InjectServerCert() { - k8s.ReplaceTLSSecret("kube-system", "tls-pem") } func addCAToTrustStore(caFilePath string) { - logrus.Info("Adding Ephemeral CA to the host root trust store") + message.Info("Adding Ephemeral CA to the host root trust store") rhelBinary := "update-ca-trust" debianBinary := "update-ca-certificates" @@ -89,15 +79,13 @@ func addCAToTrustStore(caFilePath string) { utils.CreatePathAndCopy(caFilePath, "/etc/pki/ca-trust/source/anchors/zarf-ca.crt") _, err := utils.ExecCommand(true, nil, rhelBinary, "extract") if err != nil { - logrus.Debug(err) - logrus.Warn("Error adding the ephemeral CA to the RHEL root trust") + message.Error(err, "Error adding the ephemeral CA to the RHEL root trust") } } else if utils.VerifyBinary(debianBinary) { utils.CreatePathAndCopy(caFilePath, "/usr/local/share/ca-certificates/extra/zarf-ca.crt") _, err := utils.ExecCommand(true, nil, debianBinary) if err != nil { - logrus.Debug(err) - logrus.Warn("Error adding the ephemeral CA to the trust store") + message.Error(err, "Error adding the ephemeral CA to the trust store") } } } @@ -110,7 +98,7 @@ func newCertificate(validFor time.Duration) *x509.Certificate { serialNumberLimit := new(big.Int).Lsh(big.NewInt(1), 128) serialNumber, err := rand.Int(rand.Reader, serialNumberLimit) if err != nil { - logrus.Fatalf("failed to generate serial number: %s", err) + message.Fatalf(err, "failed to generate the certificate serial number") } return &x509.Certificate{ @@ -169,11 +157,14 @@ func generateCA(caFile string, validFor time.Duration) (*x509.Certificate, *rsa. } // generateCert generates a new certificate for the given host using the -// provided certificate authority. The cert and key files are stored in the +// provided certificate authority. The cert and key files are stored in // the provided files. func generateCert(host string, certFile string, keyFile string, ca *x509.Certificate, caKey *rsa.PrivateKey, validFor time.Duration) error { template := newCertificate(validFor) + template.IPAddresses = append(template.IPAddresses, net.ParseIP(config.IPV4Localhost)) + template.DNSNames = append(template.DNSNames, "docker-registry.zarf.svc.cluster.local", "git.zarf.svc.cluster.local") + // Only use SANs to keep golang happy, https://go-review.googlesource.com/c/go/+/231379 if ip := net.ParseIP(host); ip != nil { template.IPAddresses = append(template.IPAddresses, ip) diff --git a/cli/internal/template/template.go b/cli/internal/template/template.go new file mode 100644 index 0000000000..8db982a8c8 --- /dev/null +++ b/cli/internal/template/template.go @@ -0,0 +1,87 @@ +package template + +import ( + "fmt" + + "github.com/defenseunicorns/zarf/cli/config" + "github.com/defenseunicorns/zarf/cli/internal/message" + "github.com/defenseunicorns/zarf/cli/internal/utils" +) + +type Values struct { + state config.ZarfState + htpasswd string + seedRegistry string + registry string + registryPush string + registryPull string + registrySecret string + gitPush string + gitPull string +} + +func Generate() Values { + message.Debug("template.Generate()") + var generated Values + state := config.GetState() + + generated.state = state + pushUser, errPush := utils.GetHtpasswdString(config.ZarfRegistryPushUser, config.GetSecret(config.StateRegistryPush)) + pullUser, errPull := utils.GetHtpasswdString(config.ZarfRegistryPullUser, config.GetSecret(config.StateRegistryPull)) + if errPush != nil || errPull != nil { + message.Debug(errPush, errPull) + message.Fatal(nil, "Unable to define `htpasswd` string for the Zarf user") + } + generated.htpasswd = fmt.Sprintf("%s\\n%s", pushUser, pullUser) + + generated.registry = config.GetRegistry() + generated.seedRegistry = config.GetSeedRegistry() + + generated.registryPush = config.GetSecret(config.StateRegistryPush) + generated.registryPull = config.GetSecret(config.StateRegistryPull) + generated.registrySecret = config.GetSecret(config.StateRegistrySecret) + + generated.gitPush = config.GetSecret(config.StateGitPush) + generated.gitPull = config.GetSecret(config.StateGitPull) + + message.Debugf("Template values: %v", generated) + return generated +} + +func (values Values) Ready() bool { + return values.htpasswd != "" +} + +func (values Values) GetRegistry() string { + message.Debug("template.GetRegistry()") + return values.registry +} + +func (values Values) Apply(path string) { + message.Debugf("template.Apply(%s)", path) + + if !values.Ready() { + // This should only occur if the state couldn't be pulled or on init if a template is attempted before the pre-seed stage + message.Fatalf(nil, "template.Apply() called bofore template.Generate()") + } + + mappings := map[string]string{ + "STORAGE_CLASS": values.state.StorageClass, + "SEED_REGISTRY": values.seedRegistry, + "REGISTRY": values.registry, + "REGISTRY_NODEPORT": values.state.Registry.NodePort, + "REGISTRY_SECRET": values.registrySecret, + "REGISTRY_AUTH_PUSH": values.registryPush, + "REGISTRY_AUTH_PULL": values.registryPull, + "GIT_AUTH_PUSH": values.gitPush, + "GIT_AUTH_PULL": values.gitPull, + "HTPASSWD": values.htpasswd, + } + + message.Debug(mappings) + + for template, value := range mappings { + template = fmt.Sprintf("###ZARF_%s###", template) + utils.ReplaceText(path, template, value) + } +} diff --git a/cli/internal/utils/bytes.go b/cli/internal/utils/bytes.go new file mode 100644 index 0000000000..3ef9a3db5e --- /dev/null +++ b/cli/internal/utils/bytes.go @@ -0,0 +1,46 @@ +package utils + +import ( + "math" + "strconv" +) + +// forked from https://www.socketloop.com/tutorials/golang-byte-format-example + +func RoundUp(input float64, places int) (newVal float64) { + var round float64 + pow := math.Pow(10, float64(places)) + digit := pow * input + round = math.Ceil(digit) + newVal = round / pow + return +} + +func ByteFormat(inputNum float64, precision int) string { + if precision <= 0 { + precision = 1 + } + + var unit string + var returnVal float64 + + if inputNum >= 1000000000 { + returnVal = RoundUp(inputNum/1073741824, precision) + unit = " GB" // gigabyte + } else if inputNum >= 1000000 { + returnVal = RoundUp(inputNum/1048576, precision) + unit = " MB" // megabyte + } else if inputNum >= 1000 { + returnVal = RoundUp(inputNum/1024, precision) + unit = " KB" // kilobyte + } else { + returnVal = inputNum + unit = " Byte" // byte + } + + if returnVal > 1 { + unit += "s" + } + + return strconv.FormatFloat(returnVal, 'f', precision, 64) + unit +} diff --git a/cli/internal/utils/image.go b/cli/internal/utils/image.go new file mode 100644 index 0000000000..729fd41ffd --- /dev/null +++ b/cli/internal/utils/image.go @@ -0,0 +1,12 @@ +package utils + +import "regexp" + +// For further explanation see https://regex101.com/library/PiL191 and https://regex101.com/r/PiL191/1 +var hostParser = regexp.MustCompile(`(?im)^([a-z0-9\-.]+\.[a-z0-9\-]+:?[0-9]*)?/?(.+)$`) + +// SwapHost Perform base url replacment without the docker libs +func SwapHost(src string, targetHost string) string { + var substitution = targetHost + "/$2" + return hostParser.ReplaceAllString(src, substitution) +} diff --git a/cli/internal/utils/io.go b/cli/internal/utils/io.go index 719a23a7d1..d2ee72d616 100644 --- a/cli/internal/utils/io.go +++ b/cli/internal/utils/io.go @@ -2,6 +2,7 @@ package utils import ( "bytes" + "fmt" "io/ioutil" "os" "os/exec" @@ -9,22 +10,17 @@ import ( "path/filepath" "regexp" + "github.com/defenseunicorns/zarf/cli/internal/message" "github.com/otiai10/copy" - "github.com/sirupsen/logrus" + "github.com/pterm/pterm" ) var TempPathPrefix = "zarf-" -func MakeTempDir() string { +func MakeTempDir() (string, error) { tmp, err := ioutil.TempDir("", TempPathPrefix) - logContext := logrus.WithField("path", tmp) - logContext.Info("Creating temp path") - - if err != nil { - logContext.Debug(err) - logContext.Fatal("Unable to create temp directory") - } - return tmp + message.Debugf("Creating temp path %s", tmp) + return tmp, err } // VerifyBinary returns true if binary is available @@ -33,12 +29,11 @@ func VerifyBinary(binary string) bool { return err == nil } -// CreateDirectory +// CreateDirectory creates a directory for the given path and file mode func CreateDirectory(path string, mode os.FileMode) error { if InvalidPath(path) { return os.MkdirAll(path, mode) } - return nil } @@ -48,12 +43,11 @@ func InvalidPath(path string) bool { return os.IsNotExist(err) } -func ListDirectories(directory string) []string { +func ListDirectories(directory string) ([]string, error) { var directories []string paths, err := os.ReadDir(directory) if err != nil { - logrus.Debug(err) - logrus.WithField("path", directory).Fatal("Unable to load the directory") + return directories, fmt.Errorf("unable to load the directory %s: %w", directory, err) } for _, entry := range paths { @@ -62,47 +56,39 @@ func ListDirectories(directory string) []string { } } - return directories + return directories, nil } -func WriteFile(path string, data []byte) { - - logContext := logrus.WithField("path", path) - +func WriteFile(path string, data []byte) error { f, err := os.Create(path) if err != nil { - logContext.Debug(err) - logContext.Fatal("Unable to create the file to write the contents") + return fmt.Errorf("unable to create the file at %s to write the contents: %w", path, err) } _, err = f.Write(data) if err != nil { _ = f.Close() - logContext.Debug(err) - logContext.Fatal("Unable to write the file contents") + return fmt.Errorf("unable to write the file at %s contents:%w", path, err) } err = f.Close() if err != nil { - logContext.Debug(err) - logContext.Fatal("Error saving file") + return fmt.Errorf("error saving file %s: %w", path, err) } + return nil } func ReplaceText(path string, old string, new string) { - logContext := logrus.WithField("path", path) input, err := ioutil.ReadFile(path) if err != nil { - logContext.Debug(err) - logContext.Fatal("Unable to load the given file") + message.Fatalf(err, "Unable to load %s", path) } output := bytes.Replace(input, []byte(old), []byte(new), -1) if err = ioutil.WriteFile(path, output, 0600); err != nil { - logContext.Debug(err) - logContext.Fatal("Unable to update the given file") + message.Fatalf(err, "Unable to update %s", path) } } @@ -128,36 +114,25 @@ func RecursiveFileList(root string, pattern *regexp.Regexp) []string { }) if err != nil { - logrus.Debug(err) - logrus.WithField("path", root).Fatal("Unable to complete directory walking") + message.Fatalf(err, "Unable to walk the directory %s", root) } return files } -func CreateFilePath(destination string) { +func CreateFilePath(destination string) error { parentDest := path.Dir(destination) - err := CreateDirectory(parentDest, 0700) - if err != nil { - logrus.Debug(err) - logrus.WithField("path", parentDest).Fatal("Unable to create the destination path") - } + return CreateDirectory(parentDest, 0700) } func CreatePathAndCopy(source string, destination string) { - logContext := logrus.WithFields(logrus.Fields{ - "Source": source, - "Destination": destination, - }) - - logContext.Info("Copying file") - - CreateFilePath(destination) + if err := CreateFilePath(destination); err != nil { + message.Fatalf(err, "unable to copy the file %s", source) + } // Copy the asset - err := copy.Copy(source, destination) - if err != nil { - logContext.Debug(err) - logContext.Fatal("Unable to copy the contents of the asset") + if err := copy.Copy(source, destination); err != nil { + message.Fatalf(err, "unable to copy the file %s", source) } + pterm.Success.Printfln("Copying %s", source) } diff --git a/cli/internal/utils/network.go b/cli/internal/utils/network.go index f7e1ecea0b..bb34361075 100644 --- a/cli/internal/utils/network.go +++ b/cli/internal/utils/network.go @@ -1,13 +1,15 @@ package utils import ( + "fmt" "io" - "io/ioutil" "net/http" "net/url" "os" + "path" - "github.com/sirupsen/logrus" + "github.com/defenseunicorns/zarf/cli/internal/message" + "github.com/pterm/pterm" ) func IsUrl(source string) bool { @@ -16,74 +18,79 @@ func IsUrl(source string) bool { } func Fetch(url string) io.ReadCloser { - logContext := logrus.WithFields(logrus.Fields{ - "url": url, - }) - // Get the data resp, err := http.Get(url) if err != nil { - logContext.Fatal("Unable to download the file", err) + message.Fatal(err, "Unable to download the file") } // Check server response if resp.StatusCode != http.StatusOK { - logContext.Fatalf("Bad HTTP status: %s", resp.Status) + message.Fatalf(nil, "Bad HTTP status: %s", resp.Status) } return resp.Body } -func Download(url string) []byte { - logContext := logrus.WithFields(logrus.Fields{ - "url": url, - }) - - data := Fetch(url) - - defer data.Close() - - body, err := ioutil.ReadAll(data) - if err != nil { - logContext.Fatal("Unable to download the remote file", err) - } - return body -} - func DownloadToFile(url string, target string) { - logContext := logrus.WithFields(logrus.Fields{ - "url": url, - "destination": target, - }) - - logContext.Info("Downloading file") - // Create the file destinationFile, err := os.Create(target) if err != nil { - logContext.Debug(err) - logContext.Fatal("Unable to create the destination file") + message.Fatal(err, "Unable to create the destination file") } defer destinationFile.Close() // Get the data resp, err := http.Get(url) if err != nil { - logContext.Debug(err) - logContext.Fatal("Unable to download the file", err) + message.Fatal(err, "Unable to download the file") } defer resp.Body.Close() // Check server response if resp.StatusCode != http.StatusOK { - logContext.Fatalf("Bad HTTP status: %s", resp.Status) + message.Fatalf(nil, "Bad HTTP status: %s", resp.Status) } // Writer the body to file - _, err = io.Copy(destinationFile, resp.Body) - if err != nil { - logContext.Debug(err) - logContext.Fatal("Unable to save the file", err) + text := fmt.Sprintf("Downloading %s", url) + counter := NewWriteCounter(url, int(resp.ContentLength)) + + if _, err = io.Copy(destinationFile, io.TeeReader(resp.Body, counter)); err != nil { + _, _ = counter.progress.Stop() + message.Fatalf(err, "Unable to save the file %s", target) + } + + _, _ = counter.progress.Stop() + pterm.Success.Println(text) +} + +type WriteCounter struct { + Total int + progress *pterm.ProgressbarPrinter +} + +func NewWriteCounter(url string, total int) *WriteCounter { + // keep it brief to avoid a panic on smaller windows + title := fmt.Sprintf("Downloading %s", path.Base(url)) + if total < 1 { + message.Debugf("invalid content length detected: %v", total) + } + progressBar, _ := pterm.DefaultProgressbar. + WithTotal(total). + WithShowCount(false). + WithTitle(title). + WithRemoveWhenDone(true). + Start() + return &WriteCounter{ + Total: total, + progress: progressBar, } } + +func (wc *WriteCounter) Write(p []byte) (int, error) { + n := len(p) + wc.progress.Add(n) + return n, nil +} diff --git a/cli/internal/utils/preflight.go b/cli/internal/utils/preflight.go index 4fd5010158..5808bb3a24 100644 --- a/cli/internal/utils/preflight.go +++ b/cli/internal/utils/preflight.go @@ -1,11 +1,9 @@ package utils import ( + "github.com/defenseunicorns/zarf/cli/internal/message" "os" "regexp" - "runtime" - - "github.com/sirupsen/logrus" ) func ValidHostname(hostname string) bool { @@ -21,7 +19,7 @@ func ValidHostname(hostname string) bool { } func IsValidHostName() bool { - logrus.Debug("Preflight check: validating hostname") + message.Debug("Preflight check: validating hostname") // Quick & dirty character validation instead of a complete RFC validation since the OS is already allowing it hostname, err := os.Hostname() @@ -32,39 +30,12 @@ func IsValidHostName() bool { return ValidHostname(hostname) } -func IsUserRoot() bool { - logrus.Debug("Preflight check: validating user is root") - return os.Getuid() == 0 -} - -func IsAMD64() bool { - logrus.Debug("Preflight check: validating AMD64 arch") - return runtime.GOARCH == "amd64" -} - -func IsLinux() bool { - logrus.Info("Preflight check: validating os type") - return runtime.GOOS == "linux" -} - func IsRHEL() bool { return !InvalidPath("/etc/redhat-release") } func RunPreflightChecks() { - if !IsLinux() { - logrus.Fatal("This program requires a Linux OS") - } - - if !IsAMD64() { - logrus.Fatal("This program currently only runs on AMD64 architectures") - } - - if !IsUserRoot() { - logrus.Fatal("You must run this program as root.") - } - if !IsValidHostName() { - logrus.Fatal("Please ensure this hostname is valid according to https://www.ietf.org/rfc/rfc1123.txt.") + message.Fatal(nil, "Please ensure this hostname is valid according to https://www.ietf.org/rfc/rfc1123.txt.") } } diff --git a/cli/internal/utils/random.go b/cli/internal/utils/random.go index d6e7135ecb..892c29eb65 100644 --- a/cli/internal/utils/random.go +++ b/cli/internal/utils/random.go @@ -3,7 +3,7 @@ package utils import ( "crypto/rand" - "github.com/sirupsen/logrus" + "github.com/defenseunicorns/zarf/cli/internal/message" ) // Very limited special chars for git / basic auth @@ -14,8 +14,7 @@ func RandomString(length int) string { bytes := make([]byte, length) if _, err := rand.Read(bytes); err != nil { - logrus.Debug(err) - logrus.Fatal("unable to generate a random secret") + message.Fatal(err, "unable to generate a random secret") } for i, b := range bytes { diff --git a/cli/internal/utils/shasum.go b/cli/internal/utils/shasum.go index 4ff1686df5..535f969d5f 100644 --- a/cli/internal/utils/shasum.go +++ b/cli/internal/utils/shasum.go @@ -6,17 +6,13 @@ import ( "io" "os" - "github.com/sirupsen/logrus" + "github.com/defenseunicorns/zarf/cli/internal/message" ) func ValidateSha256Sum(expectedChecksum string, path string) { actualChecksum, _ := GetSha256Sum(path) if expectedChecksum != actualChecksum { - logrus.WithFields(logrus.Fields{ - "Source": path, - "Expected": expectedChecksum, - "Actual": actualChecksum, - }).Fatal("Invalid or mismatched file checksum") + message.Fatalf("Invalid or mismatched file checksum for %s. Expected %s, computed %s", path, expectedChecksum, actualChecksum) } } @@ -27,7 +23,7 @@ func GetSha256Sum(path string) (string, error) { if IsUrl(path) { // Handle download from URL - logrus.Warn("This is a remote source. If a published checksum is available you should use that rather than calculating it directly from the remote link.") + message.Warn("This is a remote source. If a published checksum is available you should use that rather than calculating it directly from the remote link.") data = Fetch(path) } else { // Handle local file diff --git a/cli/internal/utils/yaml.go b/cli/internal/utils/yaml.go index e72f0e1ce7..a554014812 100644 --- a/cli/internal/utils/yaml.go +++ b/cli/internal/utils/yaml.go @@ -1,18 +1,18 @@ package utils -// shamelessly stolen from https://github.com/goccy/go-yaml/blob/master/cmd/ycat/ycat.go +// fork from https://github.com/goccy/go-yaml/blob/master/cmd/ycat/ycat.go import ( "fmt" "io/fs" "io/ioutil" + "github.com/defenseunicorns/zarf/cli/internal/message" "github.com/fatih/color" "github.com/goccy/go-yaml" "github.com/goccy/go-yaml/lexer" "github.com/goccy/go-yaml/printer" "github.com/mattn/go-colorable" - "github.com/sirupsen/logrus" ) const yamlEscape = "\x1b" @@ -22,7 +22,6 @@ func yamlFormat(attr color.Attribute) string { } func ColorPrintYAML(text string) { - tokens := lexer.Tokenize(text) var p printer.Printer @@ -63,15 +62,14 @@ func ColorPrintYAML(text string) { } } writer := colorable.NewColorableStdout() - _, err := writer.Write([]byte("\n\n" + p.PrintTokens(tokens) + "\n\n\n")) + _, err := writer.Write([]byte("\n" + p.PrintTokens(tokens) + "\n")) if err != nil { - logrus.Warn("Unable to print the config yaml contents") + message.Error(err, "Unable to print the config yaml contents") } } func ReadYaml(path string, destConfig interface{}) error { - logContext := logrus.WithField("path", path) - logContext.Info("Loading dynamic config") + message.Debugf("Loading zarf config %s", path) file, err := ioutil.ReadFile(path) if err != nil { diff --git a/cli/zarf.yaml b/cli/zarf.yaml index a0c00cd5f4..171731f27e 100644 --- a/cli/zarf.yaml +++ b/cli/zarf.yaml @@ -11,9 +11,20 @@ components: - name: docker-registry url: https://helm.twun.io version: 1.10.1 + namespace: registry - name: gatekeeper url: https://repo1.dso.mil/platform-one/big-bang/apps/core/policy.git version: 3.5.1-bb.10 + gitPath: chart + namespace: gatekeeper + files: + - source: ../assets/manifests + target: manifests + manifests: + - name: test-manifests + files: + - ../assets/manifests/regsitry/configmap.yaml + - ../assets/manifests/traefik/traefik-tls.yaml images: - registry1.dso.mil/ironbank/kiwigrid/k8s-sidecar:1.3.0 repos: diff --git a/examples/big-bang/manifests/big-bang/manifests.yaml b/examples/big-bang/manifests/big-bang/manifests.yaml index 19bf3088ec..9dbfce6290 100644 --- a/examples/big-bang/manifests/big-bang/manifests.yaml +++ b/examples/big-bang/manifests/big-bang/manifests.yaml @@ -27,7 +27,7 @@ spec: /**/*.txt /**/*.sh interval: 5m - url: http://stuart-gitea-http.git.svc.cluster.local:3000/zarf-git-user/mirror__github.com__defenseunicorns__zarf.git + url: http://stuart-gitea-http.zarf.svc.cluster.local:3000/zarf-git-user/mirror__github.com__defenseunicorns__zarf.git secretRef: name: zarf-git-secret ref: diff --git a/examples/big-bang/manifests/flux/regcred-secret.yaml b/examples/big-bang/manifests/flux/regcred-secret.yaml index 5c36c6c3de..0ea7bd4879 100644 --- a/examples/big-bang/manifests/flux/regcred-secret.yaml +++ b/examples/big-bang/manifests/flux/regcred-secret.yaml @@ -1,27 +1,9 @@ apiVersion: v1 kind: Secret -type: kubernetes.io/dockerconfigjson +type: Opaque metadata: - name: private-registry - namespace: flux-system + name: zarf-git-secret + namespace: bigbang stringData: - .dockerconfigjson: | - { - "auths": { - "registry.dso.mil": { - "auth":"###ZARF_DOCKERAUTH###" - }, - "registry1.dso.mil": { - "auth":"###ZARF_DOCKERAUTH###" - }, - "docker.io": { - "auth":"###ZARF_DOCKERAUTH###" - }, - "registry-1.docker.io": { - "auth":"###ZARF_DOCKERAUTH###" - }, - "ghcr.io": { - "auth":"###ZARF_DOCKERAUTH###" - } - } - } + username: "zarf-git-user" + password: "###ZARF_SECRET###" diff --git a/examples/big-bang/template/bigbang/kustomization.yaml b/examples/big-bang/template/bigbang/kustomization.yaml index d89c69d3f3..1a14673a35 100644 --- a/examples/big-bang/template/bigbang/kustomization.yaml +++ b/examples/big-bang/template/bigbang/kustomization.yaml @@ -16,6 +16,6 @@ patchesStrategicMerge: name: bigbang namespace: bigbang spec: - url: http://stuart-gitea-http.git.svc.cluster.local:3000/zarf-git-user/mirror__repo1.dso.mil__platform-one__big-bang__bigbang.git + url: http://stuart-gitea-http.zarf.svc.cluster.local:3000/zarf-git-user/mirror__repo1.dso.mil__platform-one__big-bang__bigbang.git secretRef: name: zarf-git-secret diff --git a/examples/big-bang/template/bigbang/values.yaml b/examples/big-bang/template/bigbang/values.yaml index f41d84b88d..4a5d3c090b 100644 --- a/examples/big-bang/template/bigbang/values.yaml +++ b/examples/big-bang/template/bigbang/values.yaml @@ -1,7 +1,7 @@ domain: bigbang.dev registryCredentials: - registry: "registry1.dso.mil" + registry: "###ZARF_REGISTRY###" username: "zarf-git-user" password: "${zarf_secret}" @@ -22,7 +22,7 @@ networkPolicies: istio: enabled: true git: - repo: http://stuart-gitea-http.git.svc.cluster.local:3000/zarf-git-user/mirror__repo1.dso.mil__platform-one__big-bang__apps__core__istio-controlplane.git + repo: http://stuart-gitea-http.zarf.svc.cluster.local:3000/zarf-git-user/mirror__repo1.dso.mil__platform-one__big-bang__apps__core__istio-controlplane.git ingressGateways: public-ingressgateway: type: "LoadBalancer" @@ -197,7 +197,7 @@ istio: istiooperator: enabled: true git: - repo: http://stuart-gitea-http.git.svc.cluster.local:3000/zarf-git-user/mirror__repo1.dso.mil__platform-one__big-bang__apps__core__istio-operator.git + repo: http://stuart-gitea-http.zarf.svc.cluster.local:3000/zarf-git-user/mirror__repo1.dso.mil__platform-one__big-bang__apps__core__istio-operator.git values: operator: resources: @@ -211,7 +211,7 @@ istiooperator: jaeger: enabled: true git: - repo: http://stuart-gitea-http.git.svc.cluster.local:3000/zarf-git-user/mirror__repo1.dso.mil__platform-one__big-bang__apps__core__jaeger.git + repo: http://stuart-gitea-http.zarf.svc.cluster.local:3000/zarf-git-user/mirror__repo1.dso.mil__platform-one__big-bang__apps__core__jaeger.git values: resources: requests: @@ -245,7 +245,7 @@ jaeger: kiali: enabled: true git: - repo: http://stuart-gitea-http.git.svc.cluster.local:3000/zarf-git-user/mirror__repo1.dso.mil__platform-one__big-bang__apps__core__kiali.git + repo: http://stuart-gitea-http.zarf.svc.cluster.local:3000/zarf-git-user/mirror__repo1.dso.mil__platform-one__big-bang__apps__core__kiali.git values: resources: requests: @@ -268,7 +268,7 @@ kiali: clusterAuditor: enabled: true git: - repo: http://stuart-gitea-http.git.svc.cluster.local:3000/zarf-git-user/mirror__repo1.dso.mil__platform-one__big-bang__apps__core__cluster-auditor.git + repo: http://stuart-gitea-http.zarf.svc.cluster.local:3000/zarf-git-user/mirror__repo1.dso.mil__platform-one__big-bang__apps__core__cluster-auditor.git values: resources: requests: @@ -281,7 +281,7 @@ clusterAuditor: gatekeeper: enabled: true git: - repo: http://stuart-gitea-http.git.svc.cluster.local:3000/zarf-git-user/mirror__repo1.dso.mil__platform-one__big-bang__apps__core__policy.git + repo: http://stuart-gitea-http.zarf.svc.cluster.local:3000/zarf-git-user/mirror__repo1.dso.mil__platform-one__big-bang__apps__core__policy.git values: replicas: 1 controllerManager: @@ -336,7 +336,7 @@ gatekeeper: logging: enabled: true git: - repo: http://stuart-gitea-http.git.svc.cluster.local:3000/zarf-git-user/mirror__repo1.dso.mil__platform-one__big-bang__apps__core__elasticsearch-kibana.git + repo: http://stuart-gitea-http.zarf.svc.cluster.local:3000/zarf-git-user/mirror__repo1.dso.mil__platform-one__big-bang__apps__core__elasticsearch-kibana.git values: elasticsearch: master: @@ -374,12 +374,12 @@ logging: eckoperator: enabled: true git: - repo: http://stuart-gitea-http.git.svc.cluster.local:3000/zarf-git-user/mirror__repo1.dso.mil__platform-one__big-bang__apps__core__eck-operator.git + repo: http://stuart-gitea-http.zarf.svc.cluster.local:3000/zarf-git-user/mirror__repo1.dso.mil__platform-one__big-bang__apps__core__eck-operator.git fluentbit: enabled: true git: - repo: http://stuart-gitea-http.git.svc.cluster.local:3000/zarf-git-user/mirror__repo1.dso.mil__platform-one__big-bang__apps__core__fluentbit.git + repo: http://stuart-gitea-http.zarf.svc.cluster.local:3000/zarf-git-user/mirror__repo1.dso.mil__platform-one__big-bang__apps__core__fluentbit.git values: securityContext: privileged: true @@ -394,7 +394,7 @@ fluentbit: monitoring: enabled: true git: - repo: http://stuart-gitea-http.git.svc.cluster.local:3000/zarf-git-user/mirror__repo1.dso.mil__platform-one__big-bang__apps__core__monitoring.git + repo: http://stuart-gitea-http.zarf.svc.cluster.local:3000/zarf-git-user/mirror__repo1.dso.mil__platform-one__big-bang__apps__core__monitoring.git values: alertmanager: alertmanagerSpec: @@ -458,7 +458,7 @@ monitoring: twistlock: enabled: true git: - repo: http://stuart-gitea-http.git.svc.cluster.local:3000/zarf-git-user/mirror__repo1.dso.mil__platform-one__big-bang__apps__security-tools__twistlock.git + repo: http://stuart-gitea-http.zarf.svc.cluster.local:3000/zarf-git-user/mirror__repo1.dso.mil__platform-one__big-bang__apps__security-tools__twistlock.git values: console: persistence: diff --git a/examples/big-bang/zarf.yaml b/examples/big-bang/zarf.yaml index aa0e914853..58dd4c5090 100644 --- a/examples/big-bang/zarf.yaml +++ b/examples/big-bang/zarf.yaml @@ -4,9 +4,12 @@ metadata: description: "Demo Zarf basic deployment of Big Bang core" components: - - name: baseline + - name: flux required: true - manifests: manifests/flux + manifests: + - name: flux-config + files: + - manifests/flux/regcred-secret.yaml images: # Flux images - registry1.dso.mil/ironbank/fluxcd/helm-controller:v0.11.0 @@ -29,10 +32,13 @@ components: - name: bb-core required: true + manifests: + - name: bb-core-config + files: + - manifests/big-bang/manifests.yaml # 1. helm template bigbang ./chart | yq e '. | select(.kind == "GitRepository") | "- " + .spec.url + "@" + .spec.ref.tag' - # 2. Add the actual bigbang repo as well # https://repo1.dso.mil/platform-one/big-bang/bigbang/-/tags/1.17.0 - manifests: manifests/big-bang repos: - https://github.com/defenseunicorns/zarf.git - https://repo1.dso.mil/platform-one/big-bang/bigbang.git@1.17.0 diff --git a/examples/data-injection/manifests/data-injection.yaml b/examples/data-injection/manifests/data-injection.yaml index acad2fcf15..2c92f59814 100644 --- a/examples/data-injection/manifests/data-injection.yaml +++ b/examples/data-injection/manifests/data-injection.yaml @@ -17,4 +17,4 @@ spec: image: registry1.dso.mil/ironbank/redhat/ubi/ubi8:8.4 command: ["/bin/sh", "-ec", "mkdir -p /test && while :; do ls -lah /test; sleep 5 ; done"] imagePullSecrets: - - name: private-registry + - name: zarf-registry diff --git a/examples/data-injection/manifests/image-pull-secret.yaml b/examples/data-injection/manifests/image-pull-secret.yaml deleted file mode 100644 index 89c000de16..0000000000 --- a/examples/data-injection/manifests/image-pull-secret.yaml +++ /dev/null @@ -1,27 +0,0 @@ -apiVersion: v1 -kind: Secret -type: kubernetes.io/dockerconfigjson -metadata: - name: private-registry - namespace: demo -stringData: - .dockerconfigjson: | - { - "auths": { - "registry.dso.mil": { - "auth":"###ZARF_DOCKERAUTH###" - }, - "registry1.dso.mil": { - "auth":"###ZARF_DOCKERAUTH###" - }, - "docker.io": { - "auth":"###ZARF_DOCKERAUTH###" - }, - "registry-1.docker.io": { - "auth":"###ZARF_DOCKERAUTH###" - }, - "ghcr.io": { - "auth":"###ZARF_DOCKERAUTH###" - } - } - } diff --git a/examples/data-injection/zarf.yaml b/examples/data-injection/zarf.yaml index 73e0f7d022..8945b8c0e7 100644 --- a/examples/data-injection/zarf.yaml +++ b/examples/data-injection/zarf.yaml @@ -22,6 +22,9 @@ data: components: - name: baseline required: true - manifests: manifests + manifests: + - name: example-data-injection-pod + files: + - manifests/data-injection.yaml images: - registry1.dso.mil/ironbank/redhat/ubi/ubi8:8.4 diff --git a/examples/game/manifests/game.yaml b/examples/game/manifests/game.yaml index 431dadb803..ca76b81605 100644 --- a/examples/game/manifests/game.yaml +++ b/examples/game/manifests/game.yaml @@ -34,13 +34,13 @@ spec: spec: containers: - name: game - image: registry.dso.mil/platform-one/big-bang/apps/product-tools/zarf/game:doom + image: "registry.dso.mil/platform-one/big-bang/apps/product-tools/zarf/game:doom" ports: - name: http containerPort: 8000 protocol: TCP imagePullSecrets: - - name: private-registry + - name: zarf-registry --- apiVersion: v1 kind: Service @@ -48,7 +48,6 @@ metadata: name: game namespace: default spec: - type: ClusterIP selector: app: game ports: diff --git a/examples/game/manifests/image-pull-secret.yaml b/examples/game/manifests/image-pull-secret.yaml deleted file mode 100644 index 38ffb35c9c..0000000000 --- a/examples/game/manifests/image-pull-secret.yaml +++ /dev/null @@ -1,27 +0,0 @@ -apiVersion: v1 -kind: Secret -type: kubernetes.io/dockerconfigjson -metadata: - name: private-registry - namespace: default -stringData: - .dockerconfigjson: | - { - "auths": { - "registry.dso.mil": { - "auth":"###ZARF_DOCKERAUTH###" - }, - "registry1.dso.mil": { - "auth":"###ZARF_DOCKERAUTH###" - }, - "docker.io": { - "auth":"###ZARF_DOCKERAUTH###" - }, - "registry-1.docker.io": { - "auth":"###ZARF_DOCKERAUTH###" - }, - "ghcr.io": { - "auth":"###ZARF_DOCKERAUTH###" - } - } - } diff --git a/examples/game/zarf.yaml b/examples/game/zarf.yaml index 85c7bcdc72..01b249d553 100644 --- a/examples/game/zarf.yaml +++ b/examples/game/zarf.yaml @@ -6,7 +6,9 @@ metadata: components: - name: baseline required: true - manifests: manifests - + manifests: + - name: doom + files: + - manifests/game.yaml images: - registry.dso.mil/platform-one/big-bang/apps/product-tools/zarf/game:doom diff --git a/examples/gitops-data/zarf.yaml b/examples/gitops-data/zarf.yaml index 4753f3fe3a..c0687a1a6b 100644 --- a/examples/gitops-data/zarf.yaml +++ b/examples/gitops-data/zarf.yaml @@ -9,7 +9,7 @@ components: images: - ghcr.io/stefanprodan/podinfo:6.0.0 repos: - # Do a tag-provided Git Repo mirror + # Do a tag-provided Git Repo mirror - https://github.com/defenseunicorns/zarf.git@v0.12.0 # Do a tag-provided Git Repo mirror with the default branch of main - https://repo1.dso.mil/platform-one/big-bang/apps/security-tools/twistlock.git@0.0.9-bb.0 diff --git a/examples/postgres-operator/manifests/000-namespaces.yaml b/examples/postgres-operator/manifests/000-namespaces.yaml deleted file mode 100644 index cfaefb1018..0000000000 --- a/examples/postgres-operator/manifests/000-namespaces.yaml +++ /dev/null @@ -1,9 +0,0 @@ -apiVersion: v1 -kind: Namespace -metadata: - name: postgres-operator ---- -apiVersion: v1 -kind: Namespace -metadata: - name: minio-operator diff --git a/examples/postgres-operator/manifests/image-pull-secret.yaml b/examples/postgres-operator/manifests/image-pull-secret.yaml deleted file mode 100644 index 291d51c9d0..0000000000 --- a/examples/postgres-operator/manifests/image-pull-secret.yaml +++ /dev/null @@ -1,61 +0,0 @@ -apiVersion: v1 -kind: Secret -type: kubernetes.io/dockerconfigjson -metadata: - name: private-registry - namespace: minio-operator -stringData: - .dockerconfigjson: | - { - "auths": { - "registry.dso.mil": { - "auth":"###ZARF_DOCKERAUTH###" - }, - "registry1.dso.mil": { - "auth":"###ZARF_DOCKERAUTH###" - }, - "docker.io": { - "auth":"###ZARF_DOCKERAUTH###" - }, - "registry-1.docker.io": { - "auth":"###ZARF_DOCKERAUTH###" - }, - "ghcr.io": { - "auth":"###ZARF_DOCKERAUTH###" - }, - "registry.opensource.zalan.do": { - "auth":"###ZARF_DOCKERAUTH###" - } - } - } ---- -apiVersion: v1 -kind: Secret -type: kubernetes.io/dockerconfigjson -metadata: - name: private-registry - namespace: postgres-operator -stringData: - .dockerconfigjson: | - { - "auths": { - "registry.dso.mil": { - "auth":"###ZARF_DOCKERAUTH###" - }, - "registry1.dso.mil": { - "auth":"###ZARF_DOCKERAUTH###" - }, - "docker.io": { - "auth":"###ZARF_DOCKERAUTH###" - }, - "registry-1.docker.io": { - "auth":"###ZARF_DOCKERAUTH###" - }, - "ghcr.io": { - "auth":"###ZARF_DOCKERAUTH###" - }, - "registry.opensource.zalan.do": { - "auth":"###ZARF_DOCKERAUTH###" - } - } - } diff --git a/examples/postgres-operator/manifests/minio-instance.yaml b/examples/postgres-operator/manifests/minio-instance.yaml index d161b5cb86..11ead3c666 100644 --- a/examples/postgres-operator/manifests/minio-instance.yaml +++ b/examples/postgres-operator/manifests/minio-instance.yaml @@ -1,53 +1,3 @@ -apiVersion: helm.cattle.io/v1 -kind: HelmChart -metadata: - name: minio-instance - namespace: minio-operator -spec: - chart: https://%{KUBERNETES_API}%/static/charts/minio-instance-4.2.3-bb.1.tgz - targetNamespace: minio-operator - # https://repo1.dso.mil/platform-one/big-bang/apps/application-utilities/minio/-/blob/4.2.3-bb.1/chart/values.yaml - valuesContent: |- - hostname: minio.localhost - tenants: - pools: - ## Servers specifies the number of MinIO Tenant Pods / Servers in this pool. - ## For standalone mode, supply 1. For distributed mode, supply 4 or more. - ## Note that the operator does not support upgrading from standalone to distributed mode. - - servers: 1 - ## volumesPerServer specifies the number of volumes attached per MinIO Tenant Pod / Server. - volumesPerServer: 4 - ## size specifies the capacity per volume - size: 1Gi - ## storageClass specifies the storage class name to be used for this pool - storageClassName: local-path - ## Used to specify a toleration for a pod - tolerations: {} - ## nodeSelector parameters for MinIO Pods. It specifies a map of key-value pairs. For the pod to be - ## eligible to run on a node, the node must have each of the - ## indicated key-value pairs as labels. - ## Read more here: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/ - nodeSelector: {} - ## Affinity settings for MinIO pods. Read more about affinity - ## here: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#affinity-and-anti-affinity. - affinity: {} - ## Configure resource requests and limits for MinIO containers - resources: - requests: - cpu: "250m" - memory: "1Gi" - limits: - cpu: "500m" - memory: "1Gi" - ## Configure security context - ## BB Note: Defaults for Ironbank image are 1001 for user, group, and fsGroup - securityContext: - runAsUser: 1001 - runAsGroup: 1001 - fsGroup: 1001 - console: - enabled: true ---- apiVersion: traefik.containo.us/v1alpha1 kind: IngressRoute metadata: diff --git a/examples/postgres-operator/manifests/minio-operator.yaml b/examples/postgres-operator/manifests/minio-operator.yaml deleted file mode 100644 index 8736dbe7fa..0000000000 --- a/examples/postgres-operator/manifests/minio-operator.yaml +++ /dev/null @@ -1,24 +0,0 @@ -apiVersion: helm.cattle.io/v1 -kind: HelmChart -metadata: - name: minio-operator - namespace: minio-operator -spec: - chart: https://%{KUBERNETES_API}%/static/charts/minio-operator-4.2.3-bb.1.tgz - targetNamespace: minio-operator - # https://repo1.dso.mil/platform-one/big-bang/apps/application-utilities/minio-operator/-/blob/4.2.3-bb.1/chart/values.yaml - valuesContent: |- - imagePullSecrets: - - name: private-registry - operator: - image: - repository: registry1.dso.mil/ironbank/opensource/minio/operator - tag: v4.2.3 - resources: - requests: - cpu: 200m - memory: 256Mi - ephemeral-storage: 500Mi - limits: - cpu: 200m - memory: 256Mi diff --git a/examples/postgres-operator/manifests/pgadmin.yaml b/examples/postgres-operator/manifests/pgadmin.yaml index 24d7a29982..139ed89e58 100644 --- a/examples/postgres-operator/manifests/pgadmin.yaml +++ b/examples/postgres-operator/manifests/pgadmin.yaml @@ -1,34 +1,3 @@ -apiVersion: helm.cattle.io/v1 -kind: HelmChart -metadata: - name: pgadmin4 - namespace: postgres-operator -spec: - chart: https://%{KUBERNETES_API}%/static/charts/pgadmin4-1.7.2.tgz - targetNamespace: postgres-operator - # https://github.com/rowanruseler/helm-charts/blob/master/charts/pgadmin4/values.yaml - valuesContent: |- - # image: - # registry: registry1.dso.mil - # repository: ?? - # tag: ?? - imagePullSecrets: - - name: private-registry - serviceAccount: - create: true - persistentVolume: - size: 2Gi - resources: - requests: - cpu: "100m" - memory: "256Mi" - limits: - cpu: "500m" - memory: "512Mi" - env: - email: "zarf@example.local" - password: "###ZARF_SECRET###" ---- apiVersion: traefik.containo.us/v1alpha1 kind: IngressRoute metadata: diff --git a/examples/postgres-operator/manifests/postgres-operator-ui.yaml b/examples/postgres-operator/manifests/postgres-operator-ui.yaml index c17b220b49..1e1c111057 100644 --- a/examples/postgres-operator/manifests/postgres-operator-ui.yaml +++ b/examples/postgres-operator/manifests/postgres-operator-ui.yaml @@ -1,52 +1,3 @@ -apiVersion: helm.cattle.io/v1 -kind: HelmChart -metadata: - name: postgres-operator-ui - namespace: postgres-operator -spec: - chart: https://%{KUBERNETES_API}%/static/charts/postgres-operator-ui-1.7.0.tgz - targetNamespace: postgres-operator - # https://github.com/zalando/postgres-operator/blob/v1.7.0/charts/postgres-operator-ui/values.yaml - valuesContent: |- - # image: - # registry: registry1.dso.mil - # repository: ?? - # tag: ?? - imagePullSecrets: - - name: private-registry - resources: - requests: - cpu: "100m" - memory: "100Mi" - limits: - cpu: "200m" - memory: "200Mi" - envs: - # IMPORTANT: While operator chart and UI chart are idendependent, this is the interface between - # UI and operator API. Insert the service name of the operator API here! - operatorApiUrl: "http://postgres-operator:8080" - operatorClusterNameLabel: "cluster-name" - resourcesVisible: "False" - targetNamespace: "postgres-operator" - teams: - - "acid" - extraEnvs: - - name: WALE_S3_ENDPOINT - value: "http+path://minio.minio-operator.svc.cluster.local:80" - - name: AWS_ENDPOINT - value: "http://minio.minio-operator.svc.cluster.local" - - name: SPILO_S3_BACKUP_PREFIX - value: "spilo/" - - name: AWS_ACCESS_KEY_ID - value: "minio" - - name: AWS_SECRET_ACCESS_KEY - value: "minio123" - - name: SPILO_S3_BACKUP_BUCKET - value: "postgres-operator-backups" - # We are defining our own Ingress manifest - ingress: - enabled: false ---- apiVersion: traefik.containo.us/v1alpha1 kind: IngressRoute metadata: diff --git a/examples/postgres-operator/manifests/postgres-operator.yaml b/examples/postgres-operator/manifests/postgres-operator.yaml index 1b3a7a9271..63da455657 100644 --- a/examples/postgres-operator/manifests/postgres-operator.yaml +++ b/examples/postgres-operator/manifests/postgres-operator.yaml @@ -1,62 +1,4 @@ -apiVersion: helm.cattle.io/v1 -kind: HelmChart -metadata: - name: postgres-operator - namespace: postgres-operator -spec: - chart: https://%{KUBERNETES_API}%/static/charts/postgres-operator-1.7.0.tgz - targetNamespace: postgres-operator - # https://github.com/zalando/postgres-operator/blob/v1.7.0/charts/postgres-operator/values.yaml - valuesContent: |- - # image: - # Eventually we'll need this to come from Iron Bank - # registry: registry1.dso.mil # repository: ?? - # tag: ?? - # configGeneral: - # docker_image: registry1.dso.mil/.../spilo-13:2.1-p1 - imagePullSecrets: - - name: private-registry - configPostgresPodResources: - default_cpu_request: "100m" - default_memory_request: "100Mi" - default_cpu_limit: "500m" - default_memory_limit: "500Mi" - min_cpu_limit: "250m" - min_memory_limit: "250Mi" - configAwsOrGcp: - wal_s3_bucket: "postgres-operator-backups" - configLogicalBackup: - # logical_backup_docker_image: "registry1.dso.mil/.../logical-backup:v1.7.0" - logical_backup_s3_endpoint: "http://minio.minio-operator.svc.cluster.local" - logical_backup_s3_access_key_id: "minio" - logical_backup_s3_bucket: "postgres-operator-backups" - logical_backup_s3_secret_access_key : "minio123" - logical_backup_s3_sse: "" - logical_backup_schedule: "*/2 * * * *" - configKubernetes: - pod_environment_configmap: "postgres-operator/postgres-pod-config" - configConnectionPooler: - # connection_pooler_image: "registry1.dso.mil/.../pgbouncer:master-18" - connection_pooler_default_cpu_request: "100m" - connection_pooler_default_cpu_limit: "500m" - connection_pooler_default_memory_request: "100Mi" - connection_pooler_default_memory_limit: "100Mi" - resources: - requests: - cpu: "100m" - memory: "250Mi" - limits: - cpu: "500m" - memory: "500Mi" - securityContext: - runAsUser: 1000 - runAsNonRoot: true - readOnlyRootFilesystem: true - allowPrivilegeEscalation: false - podServiceAccount: - name: "zalando-postgres-operator" ---- apiVersion: v1 kind: ConfigMap metadata: diff --git a/examples/postgres-operator/values/minio-instance.yaml b/examples/postgres-operator/values/minio-instance.yaml new file mode 100644 index 0000000000..06e4c6c176 --- /dev/null +++ b/examples/postgres-operator/values/minio-instance.yaml @@ -0,0 +1,41 @@ +hostname: minio.localhost +tenants: + imagePullSecret: + name: zarf-registry + pools: + ## Servers specifies the number of MinIO Tenant Pods / Servers in this pool. + ## For standalone mode, supply 1. For distributed mode, supply 4 or more. + ## Note that the operator does not support upgrading from standalone to distributed mode. + - servers: 1 + ## volumesPerServer specifies the number of volumes attached per MinIO Tenant Pod / Server. + volumesPerServer: 4 + ## size specifies the capacity per volume + size: 1Gi + ## storageClass specifies the storage class name to be used for this pool + storageClassName: local-path + ## Used to specify a toleration for a pod + tolerations: {} + ## nodeSelector parameters for MinIO Pods. It specifies a map of key-value pairs. For the pod to be + ## eligible to run on a node, the node must have each of the + ## indicated key-value pairs as labels. + ## Read more here: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/ + nodeSelector: {} + ## Affinity settings for MinIO pods. Read more about affinity + ## here: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#affinity-and-anti-affinity. + affinity: {} + ## Configure resource requests and limits for MinIO containers + resources: + requests: + cpu: "250m" + memory: "1Gi" + limits: + cpu: "500m" + memory: "1Gi" + ## Configure security context + ## BB Note: Defaults for Ironbank image are 1001 for user, group, and fsGroup + securityContext: + runAsUser: 1001 + runAsGroup: 1001 + fsGroup: 1001 +console: + enabled: true diff --git a/examples/postgres-operator/values/minio-operator.yaml b/examples/postgres-operator/values/minio-operator.yaml new file mode 100644 index 0000000000..73b306d852 --- /dev/null +++ b/examples/postgres-operator/values/minio-operator.yaml @@ -0,0 +1,14 @@ +imagePullSecrets: + - name: zarf-registry +operator: + image: + repository: registry1.dso.mil/ironbank/opensource/minio/operator + tag: v4.2.3 + resources: + requests: + cpu: 200m + memory: 256Mi + ephemeral-storage: 500Mi + limits: + cpu: 200m + memory: 256Mi diff --git a/examples/postgres-operator/values/pgadmin.yaml b/examples/postgres-operator/values/pgadmin.yaml new file mode 100644 index 0000000000..0d4f7e47c7 --- /dev/null +++ b/examples/postgres-operator/values/pgadmin.yaml @@ -0,0 +1,20 @@ +# image: + # registry: registry1.dso.mil + # repository: ?? + # tag: ?? +imagePullSecrets: + - name: zarf-registry +serviceAccount: + create: true +persistentVolume: + size: 2Gi +resources: + requests: + cpu: "100m" + memory: "256Mi" + limits: + cpu: "500m" + memory: "512Mi" +env: + email: "zarf@example.local" + password: "###ZARF_SECRET###" diff --git a/examples/postgres-operator/values/postgres-operator-ui.yaml b/examples/postgres-operator/values/postgres-operator-ui.yaml new file mode 100644 index 0000000000..67e94c0974 --- /dev/null +++ b/examples/postgres-operator/values/postgres-operator-ui.yaml @@ -0,0 +1,38 @@ +# image: + # registry: registry1.dso.mil + # repository: ?? + # tag: ?? +imagePullSecrets: + - name: zarf-registry +resources: + requests: + cpu: "100m" + memory: "100Mi" + limits: + cpu: "200m" + memory: "200Mi" +envs: + # IMPORTANT: While operator chart and UI chart are idendependent, this is the interface between + # UI and operator API. Insert the service name of the operator API here! + operatorApiUrl: "http://postgres-operator:8080" + operatorClusterNameLabel: "cluster-name" + resourcesVisible: "False" + targetNamespace: "postgres-operator" + teams: + - "acid" +extraEnvs: + - name: WALE_S3_ENDPOINT + value: "http+path://minio.minio-operator.svc.cluster.local:80" + - name: AWS_ENDPOINT + value: "http://minio.minio-operator.svc.cluster.local" + - name: SPILO_S3_BACKUP_PREFIX + value: "spilo/" + - name: AWS_ACCESS_KEY_ID + value: "minio" + - name: AWS_SECRET_ACCESS_KEY + value: "minio123" + - name: SPILO_S3_BACKUP_BUCKET + value: "postgres-operator-backups" +# We are defining our own Ingress manifest +ingress: + enabled: false diff --git a/examples/postgres-operator/values/postgres-operator.yaml b/examples/postgres-operator/values/postgres-operator.yaml new file mode 100644 index 0000000000..1bc27ff202 --- /dev/null +++ b/examples/postgres-operator/values/postgres-operator.yaml @@ -0,0 +1,46 @@ +# image: + # Eventually we'll need this to come from Iron Bank + # registry: registry1.dso.mil + # repository: ?? + # tag: ?? +# configGeneral: + # docker_image: registry1.dso.mil/.../spilo-13:2.1-p1 +imagePullSecrets: + - name: zarf-registry +configPostgresPodResources: + default_cpu_request: "100m" + default_memory_request: "100Mi" + default_cpu_limit: "500m" + default_memory_limit: "500Mi" + min_cpu_limit: "250m" + min_memory_limit: "250Mi" +configAwsOrGcp: + wal_s3_bucket: "postgres-operator-backups" +configLogicalBackup: + # logical_backup_docker_image: "registry1.dso.mil/.../logical-backup:v1.7.0" + logical_backup_s3_endpoint: "http://minio.minio-operator.svc.cluster.local" + logical_backup_s3_access_key_id: "minio" + logical_backup_s3_bucket: "postgres-operator-backups" + logical_backup_s3_secret_access_key : "minio123" + logical_backup_s3_sse: "" + logical_backup_schedule: "*/2 * * * *" +configKubernetes: + pod_environment_configmap: "postgres-operator/postgres-pod-config" +configConnectionPooler: + # connection_pooler_image: "registry1.dso.mil/.../pgbouncer:master-18" + connection_pooler_default_cpu_request: "100m" + connection_pooler_default_cpu_limit: "500m" + connection_pooler_default_memory_request: "100Mi" + connection_pooler_default_memory_limit: "100Mi" +resources: + requests: + cpu: "100m" + memory: "250Mi" + limits: + cpu: "500m" + memory: "500Mi" +securityContext: + runAsUser: 1000 + runAsNonRoot: true + readOnlyRootFilesystem: true + allowPrivilegeEscalation: false diff --git a/examples/postgres-operator/zarf.yaml b/examples/postgres-operator/zarf.yaml index 7a4e5b519a..1ad8f23d53 100644 --- a/examples/postgres-operator/zarf.yaml +++ b/examples/postgres-operator/zarf.yaml @@ -2,34 +2,56 @@ kind: ZarfPackageConfig metadata: name: postgres-operator-demo description: "Demo of prod-like Postgres database(s) on an edge cluster" -# uncompressed: true components: - name: baseline required: true - manifests: manifests scripts: retry: true after: - "kubectl patch serviceaccount default -p '{\"imagePullSecrets\": [{\"name\": \"private-registry\"}]}' -n postgres-operator" + manifests: + - name: postgres-example-config + files: + - manifests/minio-instance.yaml + - manifests/pgadmin.yaml + - manifests/postgres-operator.yaml + - manifests/postgres-operator-ui.yaml charts: - name: postgres-operator url: https://opensource.zalando.com/postgres-operator/charts/postgres-operator version: 1.7.0 + namespace: postgres-operator + valuesFiles: + - values/postgres-operator.yaml - name: postgres-operator-ui url: https://opensource.zalando.com/postgres-operator/charts/postgres-operator-ui version: 1.7.0 + namespace: postgres-operator + valuesFiles: + - values/postgres-operator-ui.yaml - name: pgadmin4 url: https://helm.runix.net version: 1.7.2 + namespace: postgres-operator + valuesFiles: + - values/pgadmin.yaml - name: minio-operator url: https://repo1.dso.mil/platform-one/big-bang/apps/application-utilities/minio-operator.git version: 4.2.3-bb.1 + namespace: minio-operator + gitPath: chart + valuesFiles: + - values/minio-operator.yaml - name: minio-instance url: https://repo1.dso.mil/platform-one/big-bang/apps/application-utilities/minio.git version: 4.2.3-bb.1 + namespace: minio-operator + gitPath: chart + valuesFiles: + - values/minio-instance.yaml images: diff --git a/examples/single-big-bang-package/manifests/image-pull-secret.yaml b/examples/single-big-bang-package/manifests/image-pull-secret.yaml deleted file mode 100644 index 2b723c3f32..0000000000 --- a/examples/single-big-bang-package/manifests/image-pull-secret.yaml +++ /dev/null @@ -1,27 +0,0 @@ -apiVersion: v1 -kind: Secret -type: kubernetes.io/dockerconfigjson -metadata: - name: private-registry - namespace: twistlock -stringData: - .dockerconfigjson: | - { - "auths": { - "registry.dso.mil": { - "auth":"###ZARF_DOCKERAUTH###" - }, - "registry1.dso.mil": { - "auth":"###ZARF_DOCKERAUTH###" - }, - "docker.io": { - "auth":"###ZARF_DOCKERAUTH###" - }, - "registry-1.docker.io": { - "auth":"###ZARF_DOCKERAUTH###" - }, - "ghcr.io": { - "auth":"###ZARF_DOCKERAUTH###" - } - } - } diff --git a/examples/single-big-bang-package/manifests/twistlock.yaml b/examples/single-big-bang-package/manifests/twistlock.yaml deleted file mode 100644 index f75ac7a3c5..0000000000 --- a/examples/single-big-bang-package/manifests/twistlock.yaml +++ /dev/null @@ -1,37 +0,0 @@ ---- -apiVersion: v1 -kind: Namespace -metadata: - name: twistlock ---- -apiVersion: helm.cattle.io/v1 -kind: HelmChart -metadata: - name: twistlock - namespace: twistlock -spec: - chart: https://%{KUBERNETES_API}%/static/charts/twistlock-0.0.6-bb.1.tgz - targetNamespace: twistlock - valuesContent: |- - imagePullSecrets: - - name: private-registry ---- -apiVersion: networking.k8s.io/v1 -kind: Ingress -metadata: - name: twistlock-ingress - namespace: twistlock - annotations: - kubernetes.io/ingress.class: "traefik" - traefik.ingress.kubernetes.io/router.middlewares: kube-system-ssl-redirect@kubernetescrd -spec: - rules: - - http: - paths: - - path: / - pathType: Prefix - backend: - service: - name: twistlock-console - port: - number: 8081 diff --git a/examples/single-big-bang-package/twistlock-values.yaml b/examples/single-big-bang-package/twistlock-values.yaml new file mode 100644 index 0000000000..1c394c5ed1 --- /dev/null +++ b/examples/single-big-bang-package/twistlock-values.yaml @@ -0,0 +1,2 @@ +imagePullSecrets: + - name: zarf-registry \ No newline at end of file diff --git a/examples/single-big-bang-package/zarf.yaml b/examples/single-big-bang-package/zarf.yaml index 172b416278..162beeae54 100644 --- a/examples/single-big-bang-package/zarf.yaml +++ b/examples/single-big-bang-package/zarf.yaml @@ -6,13 +6,14 @@ metadata: components: - name: baseline required: true - manifests: manifests - charts: - name: twistlock url: https://repo1.dso.mil/platform-one/big-bang/apps/security-tools/twistlock.git version: 0.0.6-bb.1 - + namespace: twistlock + gitPath: chart + valuesFiles: + - twistlock-values.yaml # https://umbrella-bigbang-releases.s3-us-gov-west-1.amazonaws.com/umbrella/1.14.0/images.txt images: - registry1.dso.mil/ironbank/twistlock/defender/defender:20.12.531 diff --git a/examples/software-factory/Makefile b/examples/software-factory/Makefile deleted file mode 100755 index 127b3355af..0000000000 --- a/examples/software-factory/Makefile +++ /dev/null @@ -1,58 +0,0 @@ -# Figure out which Zarf binary we should use based on the operating system we are on -ZARF_BIN := ../sync/zarf -UNAME_S := $(shell uname -s) -UNAME_P := $(shell uname -p) -ifneq ($(UNAME_S),Linux) - ifeq ($(UNAME_S),Darwin) - ZARF_BIN := $(addsuffix -mac,$(ZARF_BIN)) - endif - ifeq ($(UNAME_P),i386) - ZARF_BIN := $(addsuffix -intel,$(ZARF_BIN)) - endif - ifeq ($(UNAME_P),arm64) - ZARF_BIN := $(addsuffix -apple,$(ZARF_BIN)) - endif -endif - -.DEFAULT_GOAL := help - - -.PHONY: help -help: ## Show a list of all targets - @grep -E '^[a-zA-Z0-9_-]+:.*?## .*$$' $(MAKEFILE_LIST) \ - | sed -n 's/^\(.*\): \(.*\)##\(.*\)/\1:\3/p' \ - | column -t -s ":" - -.PHONY: all -all: clean fetch-release package-example-software-factory vm-init ## Download zarf, build all packages and launch a basic VM with the assets - -.PHONY: all-dev -all-dev: clean build-release package-example-software-factory vm-init ## Same as target 'all', but build the binaries using the current codebase rather than downloading the latest version from the internet - -.PHONY: clean -clean: ## Clean the sync dir - @cd .. && $(MAKE) clean - -.PHONY: fetch-release -fetch-release: ## Grab the latest release as an alternative to needing to build the binaries - @cd .. && $(MAKE) fetch-release - -.PHONY: build-release -build-release: ## Build the binaries as an alternative to downloading the latest release - @cd .. && $(MAKE) build-release - -.PHONY: vm-init -vm-init: vm-destroy ## Stripped-down vagrant box to reduce friction for basic user testing. Note the need to perform disk resizing for some examples - @cd .. && $(MAKE) vm-init - -.PHONY: vm-destroy -vm-destroy: ## Cleanup plz - @cd .. && $(MAKE) vm-destroy - -.PHONY: package-example-software-factory -package-example-software-factory: ## Create the software factory deploy package - @kustomize build template/bigbang > manifests/bigbang/bigbang-generated.yaml && kustomize build template/flux > manifests/flux/flux-generated.yaml && $(ZARF_BIN) package create --confirm && mv zarf-package-* ../sync/ - -.PHONY: ssh -ssh: ## SSH into the Vagrant VM - @cd .. && vagrant ssh diff --git a/examples/software-factory/README.md b/examples/software-factory/README.md deleted file mode 100644 index 489cca130b..0000000000 --- a/examples/software-factory/README.md +++ /dev/null @@ -1,72 +0,0 @@ -# Example: Software Factory - -This example deploys the components of a software factory with the following services, all running on top of Big Bang Core: - -- SonarQube* -- GitLab* -- GitLab Runner* -- Minio Operator* -- Mattermost Operator* -- Mattermost* -- Nexus* -- Keycloak* -- Jira -- Confluence -- Jenkins - -**Deployed using Big Bang Umbrella* - -This package is huge. We recommend not trying to run it on a developer laptop without disabling lots of stuff first. - -> Note: Right now the intention is to show that all of these services can be deployed easily using a single Zarf package. They are not configured (yet). You can't take this demo and deploy it expecting to have a fully operational software factory at the push of a button, though that is the end goal. There's a lot of work to do between what is here now and that end goal, some of which might just not make very much sense in the context of a demo/example. - -## Prerequisites - -- Logged into registry1.dso.mil -- `make` -- `kustomize` -- `sha256sum` -- TONS of CPU and RAM. Our testing shows the EC2 instance type m6i.8xlarge works pretty well at about $1.50/hour, which can be reduced further if you do a spot instance. -- [Vagrant](https://www.vagrantup.com/) and [VirtualBox](https://www.virtualbox.org/), only if you are going to use a Vagrant VM, which is incompatible when using an EC2 instance. - -Note: Vagrant and VirtualBox aren't required for Zarf to function, but this example's Makefile uses them to create a VM which everything will run in. In production you'll likely just run Zarf on the machine itself. - -## Instructions - -1. `cd examples/software-factory` -1. Run one of these two commands: - - `make all` - Download the latest version of Zarf, build the deploy package, and start a VM with Vagrant - - `make all-dev` - Build Zarf locally, build the deploy package, and start a VM with Vagrant. Requires Golang. - - > Note: If you are in an EC2 instance you should skip the `vm-init` make target, so run `make clean fetch-release package-example-software-factory && cd ../sync && sudo su` instead, then move on to the next step. -1. Run: `./zarf init --confirm --components management,gitops-service --host 127.0.0.1` - Initialize Zarf, telling it to install the management component and gitops service and skip logging component (since BB has logging already) and tells Zarf to use `127.0.0.1` as the cluster's address. If you want to use interactive mode instead just run `./zarf init`. -1. Wait a bit, run `k9s` to see pods come up. Don't move on until everything is running -1. Run: `./zarf package deploy zarf-package-software-factory-demo.tar.zst --confirm` - Deploy the software factory package. If you want interactive mode instead just run `./zarf package deploy`, it will give you a picker to choose the package. -1. Wait several minutes. Run `k9s` to watch progress -1. :warning: `kubectl delete -n istio-system envoyfilter/misdirected-request` (due to [this bug](https://repo1.dso.mil/platform-one/big-bang/bigbang/-/issues/802)) -1. Use a browser to visit the various services, available at https://*.bigbang.dev:9443 -1. When you're done, run `exit` to leave the VM then `make vm-destroy` to bring everything down - -## Notes - -- If you are not running in a Vagrant box created with the Vagrantfile in ./examples you will have to run `sysctl -w vm.max_map_count=262144` to get ElasticSearch to start correctly. -- If you want to turn off certain services to help the package run on smaller machines go into `template/bigbang/values.yaml` and change `enabled: true` to `enabled: false` for each service you want to disable. You can disable the Atlassian stack or Jenkins from `zarf.yaml`. Change `required: true` to `required:false` then press `N` when asked whether you want to deploy them. - -## Services - -| URL | Username | Password | Notes | -| ----------------------------------------------------- | --------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | --------------- | -| [AlertManager](https://alertmanager.bigbang.dev:9443) | n/a | n/a | Unauthenticated | -| [Grafana](https://grafana.bigbang.dev:9443) | `admin` | `prom-operator` | | -| [Kiali](https://kiali.bigbang.dev:9443) | n/a | `kubectl get secret -n kiali -o=json \| jq -r '.items[] \| select(.metadata.annotations."kubernetes.io/service-account.name"=="kiali-service-account") \| .data.token' \| base64 -d; echo` | | -| [Kibana](https://kibana.bigbang.dev:9443) | `elastic` | `kubectl get secret -n logging logging-ek-es-elastic-user -o=jsonpath='{.data.elastic}' \| base64 -d; echo` | | -| [Prometheus](https://prometheus.bigbang.dev:9443) | n/a | n/a | Unauthenticated | -| [Jaeger](https://tracing.bigbang.dev:9443) | n/a | n/a | Unauthenticated | -| [Twistlock](https://twistlock.bigbang.dev:9443) | n/a | n/a | | -| [Jira](https://jira.bigbang.dev:9443) | n/a | n/a | | -| [Confluence](https://confluence.bigbang.dev:9443) | n/a | n/a | | -| [GitLab](https://gitlab.bigbang.dev:9443) | n/a | n/a | | -| [Nexus](https://nexus.bigbang.dev:9443) | n/a | n/a | | -| [Mattermost](https://chat.bigbang.dev:9443) | n/a | n/a | | -| [Sonarqube](https://sonarqube.bigbang.dev:9443) | n/a | n/a | | -| [Jenkins](https://jenkins.bigbang.dev:9443) | `admin` | `admin` | | diff --git a/examples/software-factory/manifests/.gitignore b/examples/software-factory/manifests/.gitignore deleted file mode 100644 index 0c6553f63e..0000000000 --- a/examples/software-factory/manifests/.gitignore +++ /dev/null @@ -1 +0,0 @@ -*-generated.yaml diff --git a/examples/software-factory/manifests/atlassian/atlassian-manifests.yaml b/examples/software-factory/manifests/atlassian/atlassian-manifests.yaml deleted file mode 100644 index 577290ead9..0000000000 --- a/examples/software-factory/manifests/atlassian/atlassian-manifests.yaml +++ /dev/null @@ -1,117 +0,0 @@ -apiVersion: v1 -kind: Namespace -metadata: - name: helm-install-atlassian - labels: - istio-injection: "disabled" ---- -apiVersion: v1 -kind: Namespace -metadata: - name: jira - labels: - istio-injection: "enabled" ---- -apiVersion: helm.cattle.io/v1 -kind: HelmChart -metadata: - name: jira - namespace: helm-install-atlassian -spec: - chart: https://%{KUBERNETES_API}%/static/charts/jira-0.1.0-bb.7.tgz - targetNamespace: jira - valuesContent: |- - imagePullSecrets: - - name: private-registry - ingress: - nginx: false - istio: - enabled: true - gateways: - - istio-system/public - ---- -apiVersion: v1 -kind: Secret -type: kubernetes.io/dockerconfigjson -metadata: - name: private-registry - namespace: jira -stringData: - .dockerconfigjson: | - { - "auths": { - "registry.dso.mil": { - "auth":"###ZARF_DOCKERAUTH###" - }, - "registry1.dso.mil": { - "auth":"###ZARF_DOCKERAUTH###" - }, - "docker.io": { - "auth":"###ZARF_DOCKERAUTH###" - }, - "registry-1.docker.io": { - "auth":"###ZARF_DOCKERAUTH###" - }, - "ghcr.io": { - "auth":"###ZARF_DOCKERAUTH###" - } - } - } ---- -apiVersion: v1 -kind: Namespace -metadata: - name: confluence - labels: - istio-injection: "enabled" ---- -apiVersion: helm.cattle.io/v1 -kind: HelmChart -metadata: - name: confluence - namespace: helm-install-atlassian -spec: - chart: https://%{KUBERNETES_API}%/static/charts/confluence-0.1.0-bb.9.tgz - targetNamespace: confluence - valuesContent: |- - image: - repository: registry1.dso.mil/ironbank/atlassian/confluence-data-center/confluence-node:7.13.0 - tag: "7.13.0" - imagePullSecrets: - - name: private-registry - ingress: - nginx: false - istio: - enabled: true - gateways: - - istio-system/public - ---- -apiVersion: v1 -kind: Secret -type: kubernetes.io/dockerconfigjson -metadata: - name: private-registry - namespace: confluence -stringData: - .dockerconfigjson: | - { - "auths": { - "registry.dso.mil": { - "auth":"###ZARF_DOCKERAUTH###" - }, - "registry1.dso.mil": { - "auth":"###ZARF_DOCKERAUTH###" - }, - "docker.io": { - "auth":"###ZARF_DOCKERAUTH###" - }, - "registry-1.docker.io": { - "auth":"###ZARF_DOCKERAUTH###" - }, - "ghcr.io": { - "auth":"###ZARF_DOCKERAUTH###" - } - } - } diff --git a/examples/software-factory/manifests/bigbang/bigbang-manifests.yaml b/examples/software-factory/manifests/bigbang/bigbang-manifests.yaml deleted file mode 100644 index 1004902169..0000000000 --- a/examples/software-factory/manifests/bigbang/bigbang-manifests.yaml +++ /dev/null @@ -1,37 +0,0 @@ -apiVersion: v1 -kind: Secret -type: Opaque -metadata: - name: zarf-git-secret - namespace: bigbang -stringData: - username: "zarf-git-user" - password: "###ZARF_SECRET###" ---- -apiVersion: v1 -kind: Secret -type: kubernetes.io/dockerconfigjson -metadata: - name: private-registry - namespace: gitlab -stringData: - .dockerconfigjson: | - { - "auths": { - "registry.dso.mil": { - "auth":"###ZARF_DOCKERAUTH###" - }, - "registry1.dso.mil": { - "auth":"###ZARF_DOCKERAUTH###" - }, - "docker.io": { - "auth":"###ZARF_DOCKERAUTH###" - }, - "registry-1.docker.io": { - "auth":"###ZARF_DOCKERAUTH###" - }, - "ghcr.io": { - "auth":"###ZARF_DOCKERAUTH###" - } - } - } diff --git a/examples/software-factory/manifests/flux/flux-manifests.yaml b/examples/software-factory/manifests/flux/flux-manifests.yaml deleted file mode 100644 index 5c36c6c3de..0000000000 --- a/examples/software-factory/manifests/flux/flux-manifests.yaml +++ /dev/null @@ -1,27 +0,0 @@ -apiVersion: v1 -kind: Secret -type: kubernetes.io/dockerconfigjson -metadata: - name: private-registry - namespace: flux-system -stringData: - .dockerconfigjson: | - { - "auths": { - "registry.dso.mil": { - "auth":"###ZARF_DOCKERAUTH###" - }, - "registry1.dso.mil": { - "auth":"###ZARF_DOCKERAUTH###" - }, - "docker.io": { - "auth":"###ZARF_DOCKERAUTH###" - }, - "registry-1.docker.io": { - "auth":"###ZARF_DOCKERAUTH###" - }, - "ghcr.io": { - "auth":"###ZARF_DOCKERAUTH###" - } - } - } diff --git a/examples/software-factory/manifests/jenkins/jenkins-manifests.yaml b/examples/software-factory/manifests/jenkins/jenkins-manifests.yaml deleted file mode 100644 index e1276d9859..0000000000 --- a/examples/software-factory/manifests/jenkins/jenkins-manifests.yaml +++ /dev/null @@ -1,111 +0,0 @@ -apiVersion: v1 -kind: Namespace -metadata: - name: helm-install-jenkins -labels: - istio-injection: "disabled" ---- -apiVersion: v1 -kind: Namespace -metadata: - name: jenkins -labels: - istio-injection: "enabled" ---- -apiVersion: v1 -kind: Secret -type: kubernetes.io/dockerconfigjson -metadata: - name: private-registry - namespace: jenkins -stringData: - .dockerconfigjson: | - { - "auths": { - "registry.dso.mil": { - "auth":"###ZARF_DOCKERAUTH###" - }, - "registry1.dso.mil": { - "auth":"###ZARF_DOCKERAUTH###" - }, - "docker.io": { - "auth":"###ZARF_DOCKERAUTH###" - }, - "registry-1.docker.io": { - "auth":"###ZARF_DOCKERAUTH###" - }, - "ghcr.io": { - "auth":"###ZARF_DOCKERAUTH###" - } - } - } ---- -apiVersion: helm.cattle.io/v1 -kind: HelmChart -metadata: - name: jenkins - namespace: helm-install-jenkins -spec: - chart: https://%{KUBERNETES_API}%/static/charts/jenkins-3.9.4.tgz - targetNamespace: jenkins - valuesContent: |- - controller: - image: "jenkins/jenkins" - tag: "2.319.1-jdk11" - imagePullSecretName: "private-registry" - adminUser: "admin" - adminPassword: "admin" - resources: - requests: - cpu: "50m" - memory: "256Mi" - limits: - cpu: "2000m" - memory: "4096Mi" - initContainerResources: - requests: - cpu: "50m" - memory: "256Mi" - limits: - cpu: "2000m" - memory: "4096Mi" - installPlugins: - - kubernetes:1.31.1 - - workflow-aggregator:2.6 - - git:4.10.1 - - configuration-as-code:1.55 - jenkinsUrlProtocol: "https" - jenkinsUrl: "jenkins.bigbang.dev:9443" - agent: - enabled: true - image: "jenkins/inbound-agent" - tag: "4.11-1" - imagePullSecretName: "private-registry" - resources: - requests: - cpu: "512m" - memory: "512Mi" - limits: - cpu: "512m" - memory: "512Mi" - alwaysPullImage: true - persistence: - enabled: true - storageClass: "local-path" ---- -apiVersion: networking.istio.io/v1beta1 -kind: VirtualService -metadata: - name: jenkins - namespace: jenkins -spec: - gateways: - - istio-system/public - hosts: - - jenkins.bigbang.dev - http: - - route: - - destination: - host: jenkins.jenkins.svc.cluster.local - port: - number: 8080 diff --git a/examples/software-factory/template/bigbang/kustomization.yaml b/examples/software-factory/template/bigbang/kustomization.yaml deleted file mode 100644 index 318682a4a7..0000000000 --- a/examples/software-factory/template/bigbang/kustomization.yaml +++ /dev/null @@ -1,21 +0,0 @@ -bases: - - git::https://repo1.dso.mil/platform-one/big-bang/bigbang.git/base?ref=1.17.0 - -configMapGenerator: - - name: common - namespace: bigbang - behavior: merge - files: - - values.yaml - -patchesStrategicMerge: -- |- - apiVersion: source.toolkit.fluxcd.io/v1beta1 - kind: GitRepository - metadata: - name: bigbang - namespace: bigbang - spec: - url: http://stuart-gitea-http.git.svc.cluster.local:3000/zarf-git-user/mirror__repo1.dso.mil__platform-one__big-bang__bigbang.git - secretRef: - name: zarf-git-secret diff --git a/examples/software-factory/template/bigbang/values.yaml b/examples/software-factory/template/bigbang/values.yaml deleted file mode 100644 index bba477ca6d..0000000000 --- a/examples/software-factory/template/bigbang/values.yaml +++ /dev/null @@ -1,805 +0,0 @@ -domain: bigbang.dev - -registryCredentials: - - registry: "registry1.dso.mil" - username: "zarf-git-user" - password: "###ZARF_SECRET###" - - registry: "docker.io" - username: "zarf-git-user" - password: "###ZARF_SECRET###" - - registry: "registry.dso.mil" - username: "zarf-git-user" - password: "###ZARF_SECRET###" - -git: - existingSecret: "zarf-git-secret" - -flux: - interval: 1m - rollback: - cleanupOnFail: false - -networkPolicies: - enabled: false - # When in prod use a real CIDR. Don't do this, it isn't secure. This is done here since it is a demo and the CIDR changes based on which Linux distro you are running on. - controlPlaneCidr: "0.0.0.0/0" - nodeCidr: "0.0.0.0/0" - -istio: - enabled: true - git: - repo: http://stuart-gitea-http.git.svc.cluster.local:3000/zarf-git-user/mirror__repo1.dso.mil__platform-one__big-bang__apps__core__istio-controlplane.git - ingressGateways: - public-ingressgateway: - type: "LoadBalancer" - kubernetesResourceSpec: - resources: - requests: - cpu: "100m" - memory: "512Mi" - limits: - cpu: "500m" - memory: "512Mi" - service: - ports: - - name: status-port - port: 15021 - protocol: TCP - targetPort: 15021 - - name: http2 - port: 9080 - protocol: TCP - targetPort: 8080 - - name: https - port: 9443 - protocol: TCP - targetPort: 8443 - - name: tls - port: 15443 - protocol: TCP - targetPort: 15443 - passthrough-ingressgateway: - type: "LoadBalancer" # or "LoadBalancer" - kubernetesResourceSpec: - resources: - requests: - cpu: "100m" - memory: "512Mi" - limits: - cpu: "500m" - memory: "512Mi" - service: - ports: - - name: status-port - port: 15022 - protocol: TCP - targetPort: 15021 - - name: http2 - port: 19080 - protocol: TCP - targetPort: 8080 - - name: https - port: 19443 - protocol: TCP - targetPort: 8443 - - name: tls - port: 15444 - protocol: TCP - targetPort: 15443 - - gateways: - public: - tls: - key: | - -----BEGIN PRIVATE KEY----- - MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDbaLWaC86eG74Z - D5JxLJ0X4DpOTZgGeP3oY+oS5S1pE+nZq30LrC6YMQeBLSvJDWpBtvV5x9F88gMz - yhU94HgrWH26LBUQIBti+ip6IbS0sAKc6bicw6NBtR2F4BnLGw+mrUniVT8WNrRL - C1NkN5shexmTE6XAY9Ak6UpApHVmTiB8xz6hypr4JwqnqQfxDO0+AfaGSHheKo5h - xTSgUYULhyA9UaImHU+S/SekwGLRLX1KfcTpnz1+TZiQqShG9vqUB4dAge+imwAs - ZTCnI9H3tmz6jWekXQYRUraJUwjEaqqLoSQT5VQmEl518ueeRKKNB/8mi1pylWqN - UjedV4A5AgMBAAECggEBAM56xORaljBO9WAKOotNK+1rNBO6jAYTWQeY95CeolSP - y/PvobcZa6QICAL16o3DlSqQroTTmf7WllLnq4PWueA43+ETWSMaxAsqWE0laTTd - qyfV/8lvhzTv5/+z/TIZnmoCDFT2Wm9iPdudpfXbKp+ghFnYFJVwmVITRbB91InX - 38LaEvLWFnJ3/DPYursaXerwwrm50d0PCdpa/ceqBCVHlpT3Zc0lT0rYpDVtc9BG - 3gjbvKwhVUQBDfD3FGEobxhbc5eEH6JEf0PUWKnsU5F0qRKjQnfM19XKbczP+9gY - 71BDL1sALSZxxJXW865+7GeXKCtxObkcCwYbf8UrS30CgYEA+HSH4ZpuHZ8IKIbs - vFaAjsEMkRfZPao8b/g4/JCg4TuOpAdFZUTSPWmdUq3i/J8o9b+e8/bznn9HLHIT - qyreSyiRUQRtcniSL1ZUHSzzW9QefYKzPghGYHXQLIBAWt50PDaMfPQ6Sj1NaEPH - h3hq4YNYNMQP/QVmfFdiT4xVA6cCgYEA4hJgSc17hh/u84uYAKhg2zSlFG5LlYKc - Yb2aFQJhFz2QqGxMeOXyIVDFD6btGcOLtPt4RdsBuCLZZzFBDUlWL7rY9qlL+/+P - ERStyHE9gFBDa0KWfvQxHSXIuxN2mkokktiVfaTisi8SWEKRJYp+B8HCa5lSDBti - eXcGBK3hWR8CgYBJ+aBPmsR4i1ZJgsrP1M2YM4CDXt9uzdYK3JRTFtjf1vTEf+m4 - mkIiyORvrphr8ROn//La3sdwhKLzZ8/VYgEnzZ9eyPuxXpbgA0suGKkoyUJ+ykCG - Er6pj8p4xYLjy2I+X1t7BNiqLBB1H+Ezw7XHCW1k4I+GHWqDUR1TZAwX9wKBgFhy - KAm3wqPuymWuL4HSXlJkflFH9XpA5z22GBowHBwjkfzSofiKvfgayX4eKJTz1Cyy - VZO+4yVPPQ8KThEMqBN0Xn3iLkAg87ATDwpkg1M4E6hbHNX+Y1ir96R5MOWcLELn - SVUmtSpREDRHltHBJR2TyKSgD2F9NUGgN1KNVKSxAoGARyx7VceWlpdmnr+i26UH - B4h6/rL/nY7M2oWgUaj7FeygcfemtO6cV+R1Bl876Q9Dx797hZ4ddGAgxmDFsv8J - f6SSzTJBB6IGxt+1ZcxD4uFXUrOVFv00br/Re14bsXQcMwi9kEJF2idbR5E7O2qc - qbLlPssjuZS5pDnRa05bEIQ= - -----END PRIVATE KEY----- - cert: | - -----BEGIN CERTIFICATE----- - MIIFHzCCBAegAwIBAgISA9KlIFfDVyxZ1/qZXl4HMuIOMA0GCSqGSIb3DQEBCwUA - MDIxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBFbmNyeXB0MQswCQYDVQQD - EwJSMzAeFw0yMTA5MjcxNDU1MDdaFw0yMTEyMjYxNDU1MDZaMBgxFjAUBgNVBAMM - DSouYmlnYmFuZy5kZXYwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDb - aLWaC86eG74ZD5JxLJ0X4DpOTZgGeP3oY+oS5S1pE+nZq30LrC6YMQeBLSvJDWpB - tvV5x9F88gMzyhU94HgrWH26LBUQIBti+ip6IbS0sAKc6bicw6NBtR2F4BnLGw+m - rUniVT8WNrRLC1NkN5shexmTE6XAY9Ak6UpApHVmTiB8xz6hypr4JwqnqQfxDO0+ - AfaGSHheKo5hxTSgUYULhyA9UaImHU+S/SekwGLRLX1KfcTpnz1+TZiQqShG9vqU - B4dAge+imwAsZTCnI9H3tmz6jWekXQYRUraJUwjEaqqLoSQT5VQmEl518ueeRKKN - B/8mi1pylWqNUjedV4A5AgMBAAGjggJHMIICQzAOBgNVHQ8BAf8EBAMCBaAwHQYD - VR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMAwGA1UdEwEB/wQCMAAwHQYDVR0O - BBYEFLUbMi65bMLlINPzTplLjtCHZfa0MB8GA1UdIwQYMBaAFBQusxe3WFbLrlAJ - QOYfr52LFMLGMFUGCCsGAQUFBwEBBEkwRzAhBggrBgEFBQcwAYYVaHR0cDovL3Iz - Lm8ubGVuY3Iub3JnMCIGCCsGAQUFBzAChhZodHRwOi8vcjMuaS5sZW5jci5vcmcv - MBgGA1UdEQQRMA+CDSouYmlnYmFuZy5kZXYwTAYDVR0gBEUwQzAIBgZngQwBAgEw - NwYLKwYBBAGC3xMBAQEwKDAmBggrBgEFBQcCARYaaHR0cDovL2Nwcy5sZXRzZW5j - cnlwdC5vcmcwggEDBgorBgEEAdZ5AgQCBIH0BIHxAO8AdQBElGUusO7Or8RAB9io - /ijA2uaCvtjLMbU/0zOWtbaBqAAAAXwn948JAAAEAwBGMEQCIBkkdKr6WRtmZYO8 - kuchAYDxGPaCnU9FYU3BZBpsbJvLAiButEYn4AvTFiZMILymyuuqct/eFjIR9MEE - pNotyaD+bQB2AH0+8viP/4hVaCTCwMqeUol5K8UOeAl/LmqXaJl+IvDXAAABfCf3 - kGUAAAQDAEcwRQIhAOOOX0qpI8xjqARUfU4ErGe8icHORlNHHzP/a6b3XE4ZAiBp - fMNh3oihXS1e6EM9Xs8m+9nuCi7rqLNSkCNuwisK7zANBgkqhkiG9w0BAQsFAAOC - AQEABMjkLKKxYyL4ZT6BPuOyqC4hnczDYUmZdCCysLu7psCjrZIAlSRxLIWXdWir - ogi/Vf+wdPKk38NDar0T9+rfAehuvQjQKCzIKVzr+MGauW0Wytwt63EgLIl2znvX - jWEIUwDQkqeFzPMbov8BK8hdLibBSz9nLrT0Zyw9mgRIzslemsi62+AjSNERTCTv - qyhinnBHLd3dGLOAXexwXu7ic2ZwCgnSgcli+MWC30QOh6ePJJqgw6OpwvOC9DAV - fkvGYFXlgYXnhQeLr0/4tzw3koclRWe/qgjAdAjB03yp1e53b+j9NoOfyobo1MFe - nMqEgcgAiA2VuE62Q4HE0Rs5wA== - -----END CERTIFICATE----- - -----BEGIN CERTIFICATE----- - MIIFFjCCAv6gAwIBAgIRAJErCErPDBinU/bWLiWnX1owDQYJKoZIhvcNAQELBQAw - TzELMAkGA1UEBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2Vh - cmNoIEdyb3VwMRUwEwYDVQQDEwxJU1JHIFJvb3QgWDEwHhcNMjAwOTA0MDAwMDAw - WhcNMjUwOTE1MTYwMDAwWjAyMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNTGV0J3Mg - RW5jcnlwdDELMAkGA1UEAxMCUjMwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK - AoIBAQC7AhUozPaglNMPEuyNVZLD+ILxmaZ6QoinXSaqtSu5xUyxr45r+XXIo9cP - R5QUVTVXjJ6oojkZ9YI8QqlObvU7wy7bjcCwXPNZOOftz2nwWgsbvsCUJCWH+jdx - sxPnHKzhm+/b5DtFUkWWqcFTzjTIUu61ru2P3mBw4qVUq7ZtDpelQDRrK9O8Zutm - NHz6a4uPVymZ+DAXXbpyb/uBxa3Shlg9F8fnCbvxK/eG3MHacV3URuPMrSXBiLxg - Z3Vms/EY96Jc5lP/Ooi2R6X/ExjqmAl3P51T+c8B5fWmcBcUr2Ok/5mzk53cU6cG - /kiFHaFpriV1uxPMUgP17VGhi9sVAgMBAAGjggEIMIIBBDAOBgNVHQ8BAf8EBAMC - AYYwHQYDVR0lBBYwFAYIKwYBBQUHAwIGCCsGAQUFBwMBMBIGA1UdEwEB/wQIMAYB - Af8CAQAwHQYDVR0OBBYEFBQusxe3WFbLrlAJQOYfr52LFMLGMB8GA1UdIwQYMBaA - FHm0WeZ7tuXkAXOACIjIGlj26ZtuMDIGCCsGAQUFBwEBBCYwJDAiBggrBgEFBQcw - AoYWaHR0cDovL3gxLmkubGVuY3Iub3JnLzAnBgNVHR8EIDAeMBygGqAYhhZodHRw - Oi8veDEuYy5sZW5jci5vcmcvMCIGA1UdIAQbMBkwCAYGZ4EMAQIBMA0GCysGAQQB - gt8TAQEBMA0GCSqGSIb3DQEBCwUAA4ICAQCFyk5HPqP3hUSFvNVneLKYY611TR6W - PTNlclQtgaDqw+34IL9fzLdwALduO/ZelN7kIJ+m74uyA+eitRY8kc607TkC53wl - ikfmZW4/RvTZ8M6UK+5UzhK8jCdLuMGYL6KvzXGRSgi3yLgjewQtCPkIVz6D2QQz - CkcheAmCJ8MqyJu5zlzyZMjAvnnAT45tRAxekrsu94sQ4egdRCnbWSDtY7kh+BIm - lJNXoB1lBMEKIq4QDUOXoRgffuDghje1WrG9ML+Hbisq/yFOGwXD9RiX8F6sw6W4 - avAuvDszue5L3sz85K+EC4Y/wFVDNvZo4TYXao6Z0f+lQKc0t8DQYzk1OXVu8rp2 - yJMC6alLbBfODALZvYH7n7do1AZls4I9d1P4jnkDrQoxB3UqQ9hVl3LEKQ73xF1O - yK5GhDDX8oVfGKF5u+decIsH4YaTw7mP3GFxJSqv3+0lUFJoi5Lc5da149p90Ids - hCExroL1+7mryIkXPeFM5TgO9r0rvZaBFOvV2z0gp35Z0+L4WPlbuEjN/lxPFin+ - HlUjr8gRsI3qfJOQFy/9rKIJR0Y/8Omwt/8oTWgy1mdeHmmjk7j1nYsvC9JSQ6Zv - MldlTTKB3zhThV1+XWYp6rjd5JW1zbVWEkLNxE7GJThEUG3szgBVGP7pSWTUTsqX - nLRbwHOoq7hHwg== - -----END CERTIFICATE----- - -----BEGIN CERTIFICATE----- - MIIFYDCCBEigAwIBAgIQQAF3ITfU6UK47naqPGQKtzANBgkqhkiG9w0BAQsFADA/ - MSQwIgYDVQQKExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMT - DkRTVCBSb290IENBIFgzMB4XDTIxMDEyMDE5MTQwM1oXDTI0MDkzMDE4MTQwM1ow - TzELMAkGA1UEBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2Vh - cmNoIEdyb3VwMRUwEwYDVQQDEwxJU1JHIFJvb3QgWDEwggIiMA0GCSqGSIb3DQEB - AQUAA4ICDwAwggIKAoICAQCt6CRz9BQ385ueK1coHIe+3LffOJCMbjzmV6B493XC - ov71am72AE8o295ohmxEk7axY/0UEmu/H9LqMZshftEzPLpI9d1537O4/xLxIZpL - wYqGcWlKZmZsj348cL+tKSIG8+TA5oCu4kuPt5l+lAOf00eXfJlII1PoOK5PCm+D - LtFJV4yAdLbaL9A4jXsDcCEbdfIwPPqPrt3aY6vrFk/CjhFLfs8L6P+1dy70sntK - 4EwSJQxwjQMpoOFTJOwT2e4ZvxCzSow/iaNhUd6shweU9GNx7C7ib1uYgeGJXDR5 - bHbvO5BieebbpJovJsXQEOEO3tkQjhb7t/eo98flAgeYjzYIlefiN5YNNnWe+w5y - sR2bvAP5SQXYgd0FtCrWQemsAXaVCg/Y39W9Eh81LygXbNKYwagJZHduRze6zqxZ - Xmidf3LWicUGQSk+WT7dJvUkyRGnWqNMQB9GoZm1pzpRboY7nn1ypxIFeFntPlF4 - FQsDj43QLwWyPntKHEtzBRL8xurgUBN8Q5N0s8p0544fAQjQMNRbcTa0B7rBMDBc - SLeCO5imfWCKoqMpgsy6vYMEG6KDA0Gh1gXxG8K28Kh8hjtGqEgqiNx2mna/H2ql - PRmP6zjzZN7IKw0KKP/32+IVQtQi0Cdd4Xn+GOdwiK1O5tmLOsbdJ1Fu/7xk9TND - TwIDAQABo4IBRjCCAUIwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYw - SwYIKwYBBQUHAQEEPzA9MDsGCCsGAQUFBzAChi9odHRwOi8vYXBwcy5pZGVudHJ1 - c3QuY29tL3Jvb3RzL2RzdHJvb3RjYXgzLnA3YzAfBgNVHSMEGDAWgBTEp7Gkeyxx - +tvhS5B1/8QVYIWJEDBUBgNVHSAETTBLMAgGBmeBDAECATA/BgsrBgEEAYLfEwEB - ATAwMC4GCCsGAQUFBwIBFiJodHRwOi8vY3BzLnJvb3QteDEubGV0c2VuY3J5cHQu - b3JnMDwGA1UdHwQ1MDMwMaAvoC2GK2h0dHA6Ly9jcmwuaWRlbnRydXN0LmNvbS9E - U1RST09UQ0FYM0NSTC5jcmwwHQYDVR0OBBYEFHm0WeZ7tuXkAXOACIjIGlj26Ztu - MA0GCSqGSIb3DQEBCwUAA4IBAQAKcwBslm7/DlLQrt2M51oGrS+o44+/yQoDFVDC - 5WxCu2+b9LRPwkSICHXM6webFGJueN7sJ7o5XPWioW5WlHAQU7G75K/QosMrAdSW - 9MUgNTP52GE24HGNtLi1qoJFlcDyqSMo59ahy2cI2qBDLKobkx/J3vWraV0T9VuG - WCLKTVXkcGdtwlfFRjlBz4pYg1htmf5X6DYO8A4jqv2Il9DjXA6USbW1FzXSLr9O - he8Y4IWS6wY7bCkjCWDcRQJMEhg76fsO3txE+FiYruq9RUWhiF1myv4Q6W+CyBFC - Dfvp7OOGAN6dEOM4+qR9sdjoSYKEBpsr6GtPAQw4dy753ec5 - -----END CERTIFICATE----- - passthrough: - ingressGateway: "passthrough-ingressgateway" - hosts: - - "*.{{ .Values.domain }}" - tls: - mode: "PASSTHROUGH" - - values: - istiod: - hpaSpec: - maxReplicas: 1 - minReplicas: 1 - resources: - requests: - cpu: "100m" - memory: "1Gi" - limits: - cpu: "500m" - memory: "1Gi" - kiali: - dashboard: - auth: - strategy: "anonymous" - -istiooperator: - enabled: true - git: - repo: http://stuart-gitea-http.git.svc.cluster.local:3000/zarf-git-user/mirror__repo1.dso.mil__platform-one__big-bang__apps__core__istio-operator.git - values: - operator: - resources: - requests: - cpu: "100m" - memory: "256Mi" - limits: - cpu: "500m" - memory: "256Mi" - -jaeger: - enabled: true - git: - repo: http://stuart-gitea-http.git.svc.cluster.local:3000/zarf-git-user/mirror__repo1.dso.mil__platform-one__big-bang__apps__core__jaeger.git - values: - resources: - requests: - cpu: "100m" - memory: "128Mi" - limits: - cpu: "500m" - memory: "128Mi" - jaeger: - spec: - allInOne: - resources: - requests: - cpu: "100m" - memory: "128Mi" - limits: - cpu: "500m" - memory: "128Mi" - collector: - resources: - requests: - cpu: "100m" - memory: "128Mi" - limits: - cpu: "500m" - memory: "128Mi" - ingester: - # TODO: Remove this once the upstream bug is fixed (https://repo1.dso.mil/platform-one/big-bang/apps/core/jaeger/-/issues/15) - image: registry1.dso.mil/ironbank/opensource/jaegertracing/jaeger-ingester:1.24.0 - -kiali: - enabled: true - git: - repo: http://stuart-gitea-http.git.svc.cluster.local:3000/zarf-git-user/mirror__repo1.dso.mil__platform-one__big-bang__apps__core__kiali.git - values: - resources: - requests: - cpu: "100m" - memory: "256Mi" - limits: - cpu: "500m" - memory: "256Mi" - cr: - spec: - deployment: - resources: - requests: - cpu: "100m" - memory: "368Mi" - limits: - cpu: "500m" - memory: "368Mi" - -clusterAuditor: - enabled: true - git: - repo: http://stuart-gitea-http.git.svc.cluster.local:3000/zarf-git-user/mirror__repo1.dso.mil__platform-one__big-bang__apps__core__cluster-auditor.git - values: - resources: - requests: - cpu: "100m" - memory: "512Mi" - limits: - cpu: "500m" - memory: "512Mi" - -gatekeeper: - enabled: true - git: - repo: http://stuart-gitea-http.git.svc.cluster.local:3000/zarf-git-user/mirror__repo1.dso.mil__platform-one__big-bang__apps__core__policy.git - values: - replicas: 1 - controllerManager: - resources: - requests: - cpu: "175m" - memory: "512Mi" - limits: - cpu: "1" - memory: "2Gi" - audit: - resources: - requests: - cpu: "200m" - memory: "768Mi" - limits: - cpu: "1.2" - memory: "2Gi" - violations: - allowedDockerRegistries: - parameters: - excludedResources: - # K3s kube-system stuff, better than excluding the whole namespace - - "kube-system/coredns-.*" - - "kube-system/local-path-provisioner-.*" - - "kube-system/metrics-server-.*" - - "kube-system/svclb-.*" - - "kube-system/traefik-.*" - # K3s needs these due to how it creates services of type "LoadBalancer" - - "istio-system/lb-port-.*" - - "istio-system/svclb-.*" - # K3s needs this if you are doing K3s-specific "HelmRelease"-type CRDs - - ".*/helm-install-.*" - - ".*/helm" - # TODO: Get Gitea in Iron Bank - - "git/stuart-gitea-.*" - - "git/gitea" - - "git/init" - hostNetworking: - parameters: - excludedResources: - # K3s needs these due to how it creates services of type "LoadBalancer" - - "istio-system/svclb-.*" - - "istio-system/lb-port-.*" - httpsOnly: - parameters: - excludedResources: - # TODO: Fix these ingresses so they don't need to be excluded - - "git/git-ingress" - - "registry/registry-ingress" - -logging: - enabled: true - git: - repo: http://stuart-gitea-http.git.svc.cluster.local:3000/zarf-git-user/mirror__repo1.dso.mil__platform-one__big-bang__apps__core__elasticsearch-kibana.git - values: - elasticsearch: - master: - count: 1 - persistence: - size: "5Gi" - resources: - requests: - cpu: "100m" - memory: "3Gi" - limits: - cpu: "500m" - memory: "3Gi" - data: - count: 1 - persistence: - size: 5Gi - resources: - requests: - cpu: "100m" - memory: "3Gi" - limits: - cpu: "500m" - memory: "3Gi" - kibana: - count: 1 - resources: - requests: - memory: "1Gi" - cpu: "100m" - limits: - memory: "1Gi" - cpu: "500m" - -eckoperator: - enabled: true - git: - repo: http://stuart-gitea-http.git.svc.cluster.local:3000/zarf-git-user/mirror__repo1.dso.mil__platform-one__big-bang__apps__core__eck-operator.git - -fluentbit: - enabled: true - git: - repo: http://stuart-gitea-http.git.svc.cluster.local:3000/zarf-git-user/mirror__repo1.dso.mil__platform-one__big-bang__apps__core__fluentbit.git - values: - securityContext: - privileged: true - resources: - requests: - cpu: "100m" - memory: "128Mi" - limits: - cpu: "500m" - memory: "128Mi" - -monitoring: - enabled: true - git: - repo: http://stuart-gitea-http.git.svc.cluster.local:3000/zarf-git-user/mirror__repo1.dso.mil__platform-one__big-bang__apps__core__monitoring.git - values: - alertmanager: - alertmanagerSpec: - resources: - requests: - cpu: "100m" - memory: "256Mi" - limits: - cpu: "500m" - memory: "256Mi" - prometheusOperator: - resources: - requests: - cpu: "100m" - memory: "512Mi" - limits: - cpu: "500m" - memory: "512Mi" - prometheus: - prometheusSpec: - resources: - requests: - cpu: "100m" - memory: "512Mi" - limits: - cpu: "500m" - memory: "2Gi" - grafana: - sidecar: - resources: - requests: - cpu: "50m" - memory: "50Mi" - limits: - cpu: "500m" - memory: "100Mi" - resources: - requests: - cpu: "100m" - memory: "128Mi" - limits: - cpu: "500m" - memory: "128Mi" - kube-state-metrics: - resources: - requests: - cpu: "10m" - memory: "128Mi" - limits: - cpu: "500m" - memory: "128Mi" - prometheus-node-exporter: - resources: - requests: - cpu: "100m" - memory: "128Mi" - limits: - cpu: "500m" - memory: "128Mi" - -twistlock: - enabled: true - git: - repo: http://stuart-gitea-http.git.svc.cluster.local:3000/zarf-git-user/mirror__repo1.dso.mil__platform-one__big-bang__apps__security-tools__twistlock.git - values: - console: - persistence: - size: 5Gi - resources: - requests: - cpu: "100m" - memory: "1Gi" - limits: - cpu: "500m" - memory: "2Gi" - - -addons: - # Addons for bb-umbrella - sonarqube: - enabled: true - git: - repo: http://stuart-gitea-http.git.svc.cluster.local:3000/zarf-git-user/mirror__repo1.dso.mil__platform-one__big-bang__apps__developer-tools__sonarqube.git - values: - istio: - enabled: true - sonarqube: - gateways: - - istio-system/public - postgresql: - global: - imagePullSecrets: - - "private-registry" - gitlab: - enabled: true - git: - repo: http://stuart-gitea-http.git.svc.cluster.local:3000/zarf-git-user/mirror__repo1.dso.mil__platform-one__big-bang__apps__developer-tools__gitlab.git - values: - global: - istio: - enabled: true - imagePullSecrets: - - "private-registry" - istio: - enabled: true - injection: enabled - gitlab: - gateways: - - istio-system/public - gitlabRunner: - enabled: true - git: - repo: http://stuart-gitea-http.git.svc.cluster.local:3000/zarf-git-user/mirror__repo1.dso.mil__platform-one__big-bang__apps__developer-tools__gitlab-runner.git - minioOperator: - enabled: true - git: - repo: http://stuart-gitea-http.git.svc.cluster.local:3000/zarf-git-user/mirror__repo1.dso.mil__platform-one__big-bang__apps__application-utilities__minio-operator.git - values: - istio: - enabled: true - mattermostoperator: - enabled: true - git: - repo: http://stuart-gitea-http.git.svc.cluster.local:3000/zarf-git-user/mirror__repo1.dso.mil__platform-one__big-bang__apps__collaboration-tools__mattermost-operator.git - tag: "1.16.0-bb.0" - values: - istio: - enabled: true - mattermost: - enabled: true - git: - repo: http://stuart-gitea-http.git.svc.cluster.local:3000/zarf-git-user/mirror__repo1.dso.mil__platform-one__big-bang__apps__collaboration-tools__mattermost.git - tag: 0.2.4-bb.0 - values: - istio: - enabled: true - chat: - gateways: - - istio-system/public - minio: - install: true - bucketCreationImage: "registry1.dso.mil/ironbank/opensource/minio/minio:RELEASE.2021-08-31T05-46-54Z" - nexus: - enabled: true - git: - repo: http://stuart-gitea-http.git.svc.cluster.local:3000/zarf-git-user/mirror__repo1.dso.mil__platform-one__big-bang__apps__developer-tools__nexus.git - tag: 36.0.0-bb.0 - values: - istio: - enabled: true - nexus: - gateways: - - istio-system/public - keycloak: - enabled: false - git: - repo: http://stuart-gitea-http.git.svc.cluster.local:3000/zarf-git-user/mirror__repo1.dso.mil__platform-one__big-bang__apps__security-tools__keycloak.git - tag: "11.0.1-bb.6" - ingress: - key: | - -----BEGIN PRIVATE KEY----- - MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDbaLWaC86eG74Z - D5JxLJ0X4DpOTZgGeP3oY+oS5S1pE+nZq30LrC6YMQeBLSvJDWpBtvV5x9F88gMz - yhU94HgrWH26LBUQIBti+ip6IbS0sAKc6bicw6NBtR2F4BnLGw+mrUniVT8WNrRL - C1NkN5shexmTE6XAY9Ak6UpApHVmTiB8xz6hypr4JwqnqQfxDO0+AfaGSHheKo5h - xTSgUYULhyA9UaImHU+S/SekwGLRLX1KfcTpnz1+TZiQqShG9vqUB4dAge+imwAs - ZTCnI9H3tmz6jWekXQYRUraJUwjEaqqLoSQT5VQmEl518ueeRKKNB/8mi1pylWqN - UjedV4A5AgMBAAECggEBAM56xORaljBO9WAKOotNK+1rNBO6jAYTWQeY95CeolSP - y/PvobcZa6QICAL16o3DlSqQroTTmf7WllLnq4PWueA43+ETWSMaxAsqWE0laTTd - qyfV/8lvhzTv5/+z/TIZnmoCDFT2Wm9iPdudpfXbKp+ghFnYFJVwmVITRbB91InX - 38LaEvLWFnJ3/DPYursaXerwwrm50d0PCdpa/ceqBCVHlpT3Zc0lT0rYpDVtc9BG - 3gjbvKwhVUQBDfD3FGEobxhbc5eEH6JEf0PUWKnsU5F0qRKjQnfM19XKbczP+9gY - 71BDL1sALSZxxJXW865+7GeXKCtxObkcCwYbf8UrS30CgYEA+HSH4ZpuHZ8IKIbs - vFaAjsEMkRfZPao8b/g4/JCg4TuOpAdFZUTSPWmdUq3i/J8o9b+e8/bznn9HLHIT - qyreSyiRUQRtcniSL1ZUHSzzW9QefYKzPghGYHXQLIBAWt50PDaMfPQ6Sj1NaEPH - h3hq4YNYNMQP/QVmfFdiT4xVA6cCgYEA4hJgSc17hh/u84uYAKhg2zSlFG5LlYKc - Yb2aFQJhFz2QqGxMeOXyIVDFD6btGcOLtPt4RdsBuCLZZzFBDUlWL7rY9qlL+/+P - ERStyHE9gFBDa0KWfvQxHSXIuxN2mkokktiVfaTisi8SWEKRJYp+B8HCa5lSDBti - eXcGBK3hWR8CgYBJ+aBPmsR4i1ZJgsrP1M2YM4CDXt9uzdYK3JRTFtjf1vTEf+m4 - mkIiyORvrphr8ROn//La3sdwhKLzZ8/VYgEnzZ9eyPuxXpbgA0suGKkoyUJ+ykCG - Er6pj8p4xYLjy2I+X1t7BNiqLBB1H+Ezw7XHCW1k4I+GHWqDUR1TZAwX9wKBgFhy - KAm3wqPuymWuL4HSXlJkflFH9XpA5z22GBowHBwjkfzSofiKvfgayX4eKJTz1Cyy - VZO+4yVPPQ8KThEMqBN0Xn3iLkAg87ATDwpkg1M4E6hbHNX+Y1ir96R5MOWcLELn - SVUmtSpREDRHltHBJR2TyKSgD2F9NUGgN1KNVKSxAoGARyx7VceWlpdmnr+i26UH - B4h6/rL/nY7M2oWgUaj7FeygcfemtO6cV+R1Bl876Q9Dx797hZ4ddGAgxmDFsv8J - f6SSzTJBB6IGxt+1ZcxD4uFXUrOVFv00br/Re14bsXQcMwi9kEJF2idbR5E7O2qc - qbLlPssjuZS5pDnRa05bEIQ= - -----END PRIVATE KEY----- - cert: | - -----BEGIN CERTIFICATE----- - MIIFHzCCBAegAwIBAgISA9KlIFfDVyxZ1/qZXl4HMuIOMA0GCSqGSIb3DQEBCwUA - MDIxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBFbmNyeXB0MQswCQYDVQQD - EwJSMzAeFw0yMTA5MjcxNDU1MDdaFw0yMTEyMjYxNDU1MDZaMBgxFjAUBgNVBAMM - DSouYmlnYmFuZy5kZXYwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDb - aLWaC86eG74ZD5JxLJ0X4DpOTZgGeP3oY+oS5S1pE+nZq30LrC6YMQeBLSvJDWpB - tvV5x9F88gMzyhU94HgrWH26LBUQIBti+ip6IbS0sAKc6bicw6NBtR2F4BnLGw+m - rUniVT8WNrRLC1NkN5shexmTE6XAY9Ak6UpApHVmTiB8xz6hypr4JwqnqQfxDO0+ - AfaGSHheKo5hxTSgUYULhyA9UaImHU+S/SekwGLRLX1KfcTpnz1+TZiQqShG9vqU - B4dAge+imwAsZTCnI9H3tmz6jWekXQYRUraJUwjEaqqLoSQT5VQmEl518ueeRKKN - B/8mi1pylWqNUjedV4A5AgMBAAGjggJHMIICQzAOBgNVHQ8BAf8EBAMCBaAwHQYD - VR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMAwGA1UdEwEB/wQCMAAwHQYDVR0O - BBYEFLUbMi65bMLlINPzTplLjtCHZfa0MB8GA1UdIwQYMBaAFBQusxe3WFbLrlAJ - QOYfr52LFMLGMFUGCCsGAQUFBwEBBEkwRzAhBggrBgEFBQcwAYYVaHR0cDovL3Iz - Lm8ubGVuY3Iub3JnMCIGCCsGAQUFBzAChhZodHRwOi8vcjMuaS5sZW5jci5vcmcv - MBgGA1UdEQQRMA+CDSouYmlnYmFuZy5kZXYwTAYDVR0gBEUwQzAIBgZngQwBAgEw - NwYLKwYBBAGC3xMBAQEwKDAmBggrBgEFBQcCARYaaHR0cDovL2Nwcy5sZXRzZW5j - cnlwdC5vcmcwggEDBgorBgEEAdZ5AgQCBIH0BIHxAO8AdQBElGUusO7Or8RAB9io - /ijA2uaCvtjLMbU/0zOWtbaBqAAAAXwn948JAAAEAwBGMEQCIBkkdKr6WRtmZYO8 - kuchAYDxGPaCnU9FYU3BZBpsbJvLAiButEYn4AvTFiZMILymyuuqct/eFjIR9MEE - pNotyaD+bQB2AH0+8viP/4hVaCTCwMqeUol5K8UOeAl/LmqXaJl+IvDXAAABfCf3 - kGUAAAQDAEcwRQIhAOOOX0qpI8xjqARUfU4ErGe8icHORlNHHzP/a6b3XE4ZAiBp - fMNh3oihXS1e6EM9Xs8m+9nuCi7rqLNSkCNuwisK7zANBgkqhkiG9w0BAQsFAAOC - AQEABMjkLKKxYyL4ZT6BPuOyqC4hnczDYUmZdCCysLu7psCjrZIAlSRxLIWXdWir - ogi/Vf+wdPKk38NDar0T9+rfAehuvQjQKCzIKVzr+MGauW0Wytwt63EgLIl2znvX - jWEIUwDQkqeFzPMbov8BK8hdLibBSz9nLrT0Zyw9mgRIzslemsi62+AjSNERTCTv - qyhinnBHLd3dGLOAXexwXu7ic2ZwCgnSgcli+MWC30QOh6ePJJqgw6OpwvOC9DAV - fkvGYFXlgYXnhQeLr0/4tzw3koclRWe/qgjAdAjB03yp1e53b+j9NoOfyobo1MFe - nMqEgcgAiA2VuE62Q4HE0Rs5wA== - -----END CERTIFICATE----- - -----BEGIN CERTIFICATE----- - MIIFFjCCAv6gAwIBAgIRAJErCErPDBinU/bWLiWnX1owDQYJKoZIhvcNAQELBQAw - TzELMAkGA1UEBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2Vh - cmNoIEdyb3VwMRUwEwYDVQQDEwxJU1JHIFJvb3QgWDEwHhcNMjAwOTA0MDAwMDAw - WhcNMjUwOTE1MTYwMDAwWjAyMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNTGV0J3Mg - RW5jcnlwdDELMAkGA1UEAxMCUjMwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK - AoIBAQC7AhUozPaglNMPEuyNVZLD+ILxmaZ6QoinXSaqtSu5xUyxr45r+XXIo9cP - R5QUVTVXjJ6oojkZ9YI8QqlObvU7wy7bjcCwXPNZOOftz2nwWgsbvsCUJCWH+jdx - sxPnHKzhm+/b5DtFUkWWqcFTzjTIUu61ru2P3mBw4qVUq7ZtDpelQDRrK9O8Zutm - NHz6a4uPVymZ+DAXXbpyb/uBxa3Shlg9F8fnCbvxK/eG3MHacV3URuPMrSXBiLxg - Z3Vms/EY96Jc5lP/Ooi2R6X/ExjqmAl3P51T+c8B5fWmcBcUr2Ok/5mzk53cU6cG - /kiFHaFpriV1uxPMUgP17VGhi9sVAgMBAAGjggEIMIIBBDAOBgNVHQ8BAf8EBAMC - AYYwHQYDVR0lBBYwFAYIKwYBBQUHAwIGCCsGAQUFBwMBMBIGA1UdEwEB/wQIMAYB - Af8CAQAwHQYDVR0OBBYEFBQusxe3WFbLrlAJQOYfr52LFMLGMB8GA1UdIwQYMBaA - FHm0WeZ7tuXkAXOACIjIGlj26ZtuMDIGCCsGAQUFBwEBBCYwJDAiBggrBgEFBQcw - AoYWaHR0cDovL3gxLmkubGVuY3Iub3JnLzAnBgNVHR8EIDAeMBygGqAYhhZodHRw - Oi8veDEuYy5sZW5jci5vcmcvMCIGA1UdIAQbMBkwCAYGZ4EMAQIBMA0GCysGAQQB - gt8TAQEBMA0GCSqGSIb3DQEBCwUAA4ICAQCFyk5HPqP3hUSFvNVneLKYY611TR6W - PTNlclQtgaDqw+34IL9fzLdwALduO/ZelN7kIJ+m74uyA+eitRY8kc607TkC53wl - ikfmZW4/RvTZ8M6UK+5UzhK8jCdLuMGYL6KvzXGRSgi3yLgjewQtCPkIVz6D2QQz - CkcheAmCJ8MqyJu5zlzyZMjAvnnAT45tRAxekrsu94sQ4egdRCnbWSDtY7kh+BIm - lJNXoB1lBMEKIq4QDUOXoRgffuDghje1WrG9ML+Hbisq/yFOGwXD9RiX8F6sw6W4 - avAuvDszue5L3sz85K+EC4Y/wFVDNvZo4TYXao6Z0f+lQKc0t8DQYzk1OXVu8rp2 - yJMC6alLbBfODALZvYH7n7do1AZls4I9d1P4jnkDrQoxB3UqQ9hVl3LEKQ73xF1O - yK5GhDDX8oVfGKF5u+decIsH4YaTw7mP3GFxJSqv3+0lUFJoi5Lc5da149p90Ids - hCExroL1+7mryIkXPeFM5TgO9r0rvZaBFOvV2z0gp35Z0+L4WPlbuEjN/lxPFin+ - HlUjr8gRsI3qfJOQFy/9rKIJR0Y/8Omwt/8oTWgy1mdeHmmjk7j1nYsvC9JSQ6Zv - MldlTTKB3zhThV1+XWYp6rjd5JW1zbVWEkLNxE7GJThEUG3szgBVGP7pSWTUTsqX - nLRbwHOoq7hHwg== - -----END CERTIFICATE----- - -----BEGIN CERTIFICATE----- - MIIFYDCCBEigAwIBAgIQQAF3ITfU6UK47naqPGQKtzANBgkqhkiG9w0BAQsFADA/ - MSQwIgYDVQQKExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMT - DkRTVCBSb290IENBIFgzMB4XDTIxMDEyMDE5MTQwM1oXDTI0MDkzMDE4MTQwM1ow - TzELMAkGA1UEBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2Vh - cmNoIEdyb3VwMRUwEwYDVQQDEwxJU1JHIFJvb3QgWDEwggIiMA0GCSqGSIb3DQEB - AQUAA4ICDwAwggIKAoICAQCt6CRz9BQ385ueK1coHIe+3LffOJCMbjzmV6B493XC - ov71am72AE8o295ohmxEk7axY/0UEmu/H9LqMZshftEzPLpI9d1537O4/xLxIZpL - wYqGcWlKZmZsj348cL+tKSIG8+TA5oCu4kuPt5l+lAOf00eXfJlII1PoOK5PCm+D - LtFJV4yAdLbaL9A4jXsDcCEbdfIwPPqPrt3aY6vrFk/CjhFLfs8L6P+1dy70sntK - 4EwSJQxwjQMpoOFTJOwT2e4ZvxCzSow/iaNhUd6shweU9GNx7C7ib1uYgeGJXDR5 - bHbvO5BieebbpJovJsXQEOEO3tkQjhb7t/eo98flAgeYjzYIlefiN5YNNnWe+w5y - sR2bvAP5SQXYgd0FtCrWQemsAXaVCg/Y39W9Eh81LygXbNKYwagJZHduRze6zqxZ - Xmidf3LWicUGQSk+WT7dJvUkyRGnWqNMQB9GoZm1pzpRboY7nn1ypxIFeFntPlF4 - FQsDj43QLwWyPntKHEtzBRL8xurgUBN8Q5N0s8p0544fAQjQMNRbcTa0B7rBMDBc - SLeCO5imfWCKoqMpgsy6vYMEG6KDA0Gh1gXxG8K28Kh8hjtGqEgqiNx2mna/H2ql - PRmP6zjzZN7IKw0KKP/32+IVQtQi0Cdd4Xn+GOdwiK1O5tmLOsbdJ1Fu/7xk9TND - TwIDAQABo4IBRjCCAUIwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYw - SwYIKwYBBQUHAQEEPzA9MDsGCCsGAQUFBzAChi9odHRwOi8vYXBwcy5pZGVudHJ1 - c3QuY29tL3Jvb3RzL2RzdHJvb3RjYXgzLnA3YzAfBgNVHSMEGDAWgBTEp7Gkeyxx - +tvhS5B1/8QVYIWJEDBUBgNVHSAETTBLMAgGBmeBDAECATA/BgsrBgEEAYLfEwEB - ATAwMC4GCCsGAQUFBwIBFiJodHRwOi8vY3BzLnJvb3QteDEubGV0c2VuY3J5cHQu - b3JnMDwGA1UdHwQ1MDMwMaAvoC2GK2h0dHA6Ly9jcmwuaWRlbnRydXN0LmNvbS9E - U1RST09UQ0FYM0NSTC5jcmwwHQYDVR0OBBYEFHm0WeZ7tuXkAXOACIjIGlj26Ztu - MA0GCSqGSIb3DQEBCwUAA4IBAQAKcwBslm7/DlLQrt2M51oGrS+o44+/yQoDFVDC - 5WxCu2+b9LRPwkSICHXM6webFGJueN7sJ7o5XPWioW5WlHAQU7G75K/QosMrAdSW - 9MUgNTP52GE24HGNtLi1qoJFlcDyqSMo59ahy2cI2qBDLKobkx/J3vWraV0T9VuG - WCLKTVXkcGdtwlfFRjlBz4pYg1htmf5X6DYO8A4jqv2Il9DjXA6USbW1FzXSLr9O - he8Y4IWS6wY7bCkjCWDcRQJMEhg76fsO3txE+FiYruq9RUWhiF1myv4Q6W+CyBFC - Dfvp7OOGAN6dEOM4+qR9sdjoSYKEBpsr6GtPAQw4dy753ec5 - -----END CERTIFICATE----- - values: - replicas: 1 - imagePullSecrets: - - name: "private-registry" - postgresql: - image: - pullSecrets: - - "private-registry" - istio: - enabled: true - keycloak: - enabled: true - resources: - requests: - cpu: "750m" - memory: "1024Mi" - limits: - cpu: "750m" - memory: "1024Mi" - startupProbe: | - httpGet: - path: /auth/realms/master - port: http - initialDelaySeconds: 600 - timeoutSeconds: 10 - failureThreshold: 60 - periodSeconds: 10 - secrets: - env: - stringData: - CUSTOM_REGISTRATION_CONFIG: /opt/jboss/keycloak/customreg.yaml - KEYCLOAK_IMPORT: /opt/jboss/keycloak/realm.json - X509_CA_BUNDLE: /etc/x509/https/cas.pem - certauthority: - stringData: - cas.pem: '{{ .Files.Get "resources/dev/dod_cas.pem" }}' - customreg: - stringData: - customreg.yaml: '{{ .Files.Get "resources/dev/baby-yoda.yaml" }}' - realm: - stringData: - realm.json: '{{ .Files.Get "resources/dev/baby-yoda.json" }}' - extraVolumes: |- - - name: certauthority - secret: - secretName: {{ include "keycloak.fullname" . }}-certauthority - - name: customreg - secret: - secretName: {{ include "keycloak.fullname" . }}-customreg - - name: realm - secret: - secretName: {{ include "keycloak.fullname" . }}-realm - extraVolumeMounts: |- - - name: certauthority - mountPath: /etc/x509/https/cas.pem - subPath: cas.pem - readOnly: true - - name: customreg - mountPath: /opt/jboss/keycloak/customreg.yaml - subPath: customreg.yaml - readOnly: true - - name: realm - mountPath: /opt/jboss/keycloak/realm.json - subPath: realm.json - readOnly: true - - - - # All the other add-ons that we aren't using - argocd: - enabled: false - authservice: - enabled: false - anchore: - enabled: false - minio: - enabled: false - git: - repo: http://stuart-gitea-http.git.svc.cluster.local:3000/zarf-git-user/mirror__repo1.dso.mil__platform-one__big-bang__apps__application-utilities__minio.git - tag: "4.2.3-bb.1" - values: - istio: - enabled: true - gateways: - - istio-system/public - velero: - enabled: false diff --git a/examples/software-factory/template/flux/kustomization.yaml b/examples/software-factory/template/flux/kustomization.yaml deleted file mode 100644 index 9bd3ca5a7a..0000000000 --- a/examples/software-factory/template/flux/kustomization.yaml +++ /dev/null @@ -1,2 +0,0 @@ -bases: - - git::https://repo1.dso.mil/platform-one/big-bang/bigbang.git/base/flux?ref=tags/1.17.0 diff --git a/examples/software-factory/zarf.yaml b/examples/software-factory/zarf.yaml deleted file mode 100644 index 2572aee733..0000000000 --- a/examples/software-factory/zarf.yaml +++ /dev/null @@ -1,208 +0,0 @@ -kind: ZarfPackageConfig -metadata: - name: software-factory-demo - description: "Demo Zarf deployment of a software factory" - -components: - - name: flux - required: true - manifests: manifests/flux - images: - # Flux images - - registry1.dso.mil/ironbank/fluxcd/helm-controller:v0.11.0 - - registry1.dso.mil/ironbank/fluxcd/kustomize-controller:v0.13.0 - - registry1.dso.mil/ironbank/fluxcd/notification-controller:v0.15.0 - - registry1.dso.mil/ironbank/fluxcd/source-controller:v0.14.0 - - - name: bb-umbrella - required: true - manifests: manifests/bigbang - # 1. helm template bigbang ./chart | yq e '. | select(.kind == "GitRepository") | "- " + .spec.url + "@" + .spec.ref.tag' - - # 2. Add the actual bigbang repo as well - # https://repo1.dso.mil/platform-one/big-bang/bigbang/-/tags/1.17.0 - repos: - - https://repo1.dso.mil/platform-one/big-bang/bigbang.git@1.17.0 - - https://repo1.dso.mil/platform-one/big-bang/apps/core/cluster-auditor.git@0.3.0-bb.7 - - https://repo1.dso.mil/platform-one/big-bang/apps/core/policy.git@3.5.2-bb.1 - - https://repo1.dso.mil/platform-one/big-bang/apps/core/istio-controlplane.git@1.10.4-bb.3 - - https://repo1.dso.mil/platform-one/big-bang/apps/core/istio-operator.git@1.10.4-bb.1 - - https://repo1.dso.mil/platform-one/big-bang/apps/core/jaeger.git@2.23.0-bb.2 - - https://repo1.dso.mil/platform-one/big-bang/apps/core/kiali.git@1.39.0-bb.2 - - https://repo1.dso.mil/platform-one/big-bang/apps/core/eck-operator.git@1.6.0-bb.2 - - https://repo1.dso.mil/platform-one/big-bang/apps/core/elasticsearch-kibana.git@0.1.21-bb.0 - - https://repo1.dso.mil/platform-one/big-bang/apps/core/fluentbit.git@0.16.6-bb.0 - - https://repo1.dso.mil/platform-one/big-bang/apps/core/monitoring.git@14.0.0-bb.10 - - https://repo1.dso.mil/platform-one/big-bang/apps/security-tools/twistlock.git@0.0.9-bb.0 - - https://repo1.dso.mil/platform-one/big-bang/apps/developer-tools/sonarqube.git@9.6.3-bb.2 - - https://repo1.dso.mil/platform-one/big-bang/apps/developer-tools/gitlab.git@4.12.9-bb.6 - - https://repo1.dso.mil/platform-one/big-bang/apps/developer-tools/gitlab-runner.git@0.29.0-bb.1 - - https://repo1.dso.mil/platform-one/big-bang/apps/collaboration-tools/mattermost.git@0.2.4-bb.0 - - https://repo1.dso.mil/platform-one/big-bang/apps/collaboration-tools/mattermost-operator.git@1.16.0-bb.0 - - https://repo1.dso.mil/platform-one/big-bang/apps/developer-tools/nexus.git@36.0.0-bb.0 - - https://repo1.dso.mil/platform-one/big-bang/apps/application-utilities/minio-operator.git@4.1.2-bb.3 - - https://repo1.dso.mil/platform-one/big-bang/apps/application-utilities/minio.git@4.1.2-bb.6 - - https://repo1.dso.mil/platform-one/big-bang/apps/application-utilities/minio.git@4.2.3-bb.1 - - https://repo1.dso.mil/platform-one/big-bang/apps/application-utilities/minio-operator.git@4.2.3-bb.1 - # - https://repo1.dso.mil/platform-one/big-bang/apps/security-tools/keycloak.git@11.0.1-bb.6 - - images: - # TODO: Figure out a better way to derive this list. - # 1. Deploy Big Bang Core using some other method like https://repo1.dso.mil/platform-one/quick-start/big-bang - # 2. kubectl get pods --all-namespaces -o json | jq '.items[].spec.containers[].image' | jq -s 'unique' | yq e -P - # 3. Move all 'registry1.dso.mil/ironbank/fluxcd' images to the 'local.images' section - # 4. Add 'docker.io/' to any images that aren't fully qualified (example: rancher/metrics-server -> docker.io/rancher/metrics-server - # OR go through each values.yaml file in each git repo specified above and pull out all the images - - # common - - registry1.dso.mil/ironbank/big-bang/base:8.4 - - # cluster-auditor - - registry1.dso.mil/ironbank/cluster-auditor/opa-collector:0.3.2 - - # policy - - registry1.dso.mil/ironbank/opensource/kubernetes-1.21/kubectl:v1.21.1 - - registry1.dso.mil/ironbank/opensource/openpolicyagent/gatekeeper:v3.5.2 - - # istio-controlplane - - registry1.dso.mil/ironbank/opensource/istio/istioctl:1.10.4 - - registry1.dso.mil/ironbank/opensource/istio/install-cni:1.10.4 - - registry1.dso.mil/ironbank/opensource/istio/proxyv2:1.10.4 - - registry1.dso.mil/ironbank/opensource/istio/pilot:1.10.4 - - # istio-operator - - registry1.dso.mil/ironbank/opensource/istio/operator:1.10.4 - - # # Keycloak - # - registry.dso.mil/platform-one/big-bang/apps/security-tools/keycloak/keycloak-ib:14.0.0-1.0.6-1 - # - registry.dso.mil/platform-one/big-bang/apps/security-tools/keycloak/postgresql:11.8.0-debian-10-r61 - # - registry.dso.mil/platform-one/big-bang/apps/security-tools/keycloak/busybox:1.32 - - # jaeger - - registry1.dso.mil/ironbank/opensource/jaegertracing/jaeger-operator:1.24.0 - - registry1.dso.mil/ironbank/opensource/jaegertracing/jaeger-es-index-cleaner:1.24.0 - - registry1.dso.mil/ironbank/opensource/jaegertracing/all-in-one:1.24.0 - - registry1.dso.mil/ironbank/opensource/jaegertracing/jaeger-agent:1.24.0 - - registry1.dso.mil/ironbank/opensource/jaegertracing/jaeger-ingester:1.24.0 - - registry1.dso.mil/ironbank/opensource/jaegertracing/jaeger-query:1.24.0 - - registry1.dso.mil/ironbank/opensource/jaegertracing/jaeger-collector:1.24.0 - - # kiali - - registry1.dso.mil/ironbank/opensource/kiali/kiali-operator:v1.39.0 - - registry1.dso.mil/ironbank/opensource/kiali/kiali:v1.39.0 - - # eck-operator - - registry1.dso.mil/ironbank/elastic/eck-operator/eck-operator:1.6.0 - - # elasticsearch-kibana - - registry1.dso.mil/ironbank/elastic/kibana/kibana:7.12.0 - - registry1.dso.mil/ironbank/elastic/elasticsearch/elasticsearch:7.13.4 - - # fluentbit - - registry1.dso.mil/ironbank/opensource/fluent/fluent-bit:1.8.6 - - # monitoring - - registry1.dso.mil/ironbank/opensource/prometheus/alertmanager:v0.21.0 - - registry1.dso.mil/ironbank/opensource/grafana/grafana:7.5.2 - - registry1.dso.mil/ironbank/opensource/bats/bats:1.2.1 - - registry1.dso.mil/ironbank/kiwigrid/k8s-sidecar:1.10.6 - - registry1.dso.mil/ironbank/opensource/coreos/kube-state-metrics:v1.9.8 - - registry1.dso.mil/ironbank/opensource/prometheus/node-exporter:v1.0.1 - - registry1.dso.mil/ironbank/opensource/jet/kube-webhook-certgen:v1.5.1 - - registry1.dso.mil/ironbank/opensource/prometheus-operator/prometheus-operator:v0.46.0 - - registry1.dso.mil/ironbank/opensource/jimmidyson/configmap-reload:v0.5.0 - - registry1.dso.mil/ironbank/opensource/prometheus-operator/prometheus-config-reloader:v0.46.0 - - registry1.dso.mil/ironbank/opensource/kubernetes-1.20/kubectl-1.20:v1.20.8 - - registry1.dso.mil/ironbank/opensource/prometheus/prometheus:v2.25.0 - - # twistlock - - registry1.dso.mil/ironbank/twistlock/console/console:21.04.439 - - # sonarqube - - registry1.dso.mil/ironbank/big-bang/sonarqube:8.9-community - - registry1.dso.mil/ironbank/opensource/postgres/postgresql96:9.6.20 - - registry.dso.mil/platform-one/big-bang/apps/developer-tools/sonarqube/postgresql:11.7.0-debian-10-r26 - - # gitlab - - registry1.dso.mil/ironbank/gitlab/gitlab/alpine-certificates:13.12.9 - - registry1.dso.mil/ironbank/gitlab/gitlab-runner/gitlab-runner:v13.12.0 - - registry1.dso.mil/ironbank/gitlab/gitlab/kubectl:13.12.9 - - registry1.dso.mil/ironbank/redhat/ubi/ubi8:8.4 - - registry1.dso.mil/ironbank/bitnami/analytics/redis-exporter:1.18.0 - - registry1.dso.mil/ironbank/opensource/redis/redis5:5.0.9 - - registry.dso.mil/platform-one/big-bang/apps/developer-tools/gitlab/postgresql:11.9.0 - - registry1.dso.mil/ironbank/gitlab/gitlab/gitlab-container-registry:13.12.9 - - registry1.dso.mil/ironbank/gitlab/gitlab/cfssl-self-sign:1.4.1 - - registry1.dso.mil/ironbank/gitlab/gitlab/gitlab-task-runner:13.12.9 - - registry1.dso.mil/ironbank/gitlab/gitlab/gitlab-exporter:13.12.9 - - registry1.dso.mil/ironbank/gitlab/gitlab/gitlab-webservice:13.12.9 - - registry1.dso.mil/ironbank/gitlab/gitlab/gitlab-workhorse:13.12.9 - - registry1.dso.mil/ironbank/gitlab/gitlab/gitlab-sidekiq:13.12.9 - - registry1.dso.mil/ironbank/gitlab/gitlab/gitaly:13.12.9 - - registry1.dso.mil/ironbank/gitlab/gitlab/gitlab-shell:13.12.9 - - registry1.dso.mil/ironbank/opensource/minio/minio:RELEASE.2021-04-06T23-11-00Z - - registry1.dso.mil/ironbank/opensource/minio/mc:RELEASE.2021-03-23T05-46-11Z - - docker.io/rancher/pause:3.1 - - # minio & minio-operator - - registry1.dso.mil/ironbank/opensource/minio/operator:v4.1.2 - - registry1.dso.mil/ironbank/opensource/minio/minio:RELEASE.2021-08-31T05-46-54Z - - registry1.dso.mil/ironbank/opensource/minio/mc:RELEASE.2021-09-02T09-21-27Z - - # mattermost & mattermost-operator - - registry1.dso.mil/ironbank/opensource/mattermost/mattermost:5.39.0 - - registry1.dso.mil/ironbank/opensource/mattermost/mattermost-operator:v1.16.0 - - registry1.dso.mil/ironbank/opensource/postgres/postgresql11:11.10 - - registry1.dso.mil/ironbank/opensource/postgres/postgresql12:12.8 - - - # nexus - - registry1.dso.mil/ironbank/redhat/ubi/ubi8-minimal:8.4 - - registry1.dso.mil/ironbank/sonatype/nexus/nexus:3.36.0-01 - - - name: atlassian - required: true - manifests: manifests/atlassian - charts: - - name: jira - url: https://repo1.dso.mil/platform-one/big-bang/apps/third-party/jira.git - version: 0.1.0-bb.7 - - name: confluence - url: https://repo1.dso.mil/platform-one/big-bang/apps/third-party/confluence.git - version: 0.1.0-bb.9 - files: - # We need jq because the script uses it to check whether Istio is running yet - - source: https://github.com/stedolan/jq/releases/download/jq-1.6/jq-linux64 - shasum: af986793a515d500ab2d35f8d2aecd656e764504b789b66d7e1a0b727a124c44 - target: ./jq - executable: true - images: - # jira - - registry1.dso.mil/ironbank/atlassian/jira-data-center/jira-node:8.18.1 - # confluence - - registry1.dso.mil/ironbank/atlassian/confluence-data-center/confluence-node:7.13.0 - - registry1.dso.mil/ironbank/redhat/ubi/ubi7-minimal:7.9 - scripts: - retry: true - before: - # Check to see if istiod is running before trying to deploy. If Istio is running then so is Gatekeeper. This is a poor man's version of "DependsOn" since we aren't doing real gitops yet - - | - test $(/usr/local/bin/kubectl get pods -n istio-system -l app=istiod --field-selector=status.phase=Running -o json | ./jq -r '.items | length') -gt 0 - - - name: jenkins - required: true - manifests: manifests/jenkins - charts: - - name: jenkins - url: https://charts.jenkins.io - version: 3.9.4 - images: - - jenkins/jenkins:2.319.1-jdk11 - - kiwigrid/k8s-sidecar:1.14.2 - - jenkins/inbound-agent:4.11-1 - - maorfr/kube-tasks:0.2.0 - scripts: - retry: true - before: - # Check to see if istiod is running before trying to deploy. If Istio is running then so is Gatekeeper. This is a poor man's version of "DependsOn" since we aren't doing real gitops yet - - | - test $(/usr/local/bin/kubectl get pods -n istio-system -l app=istiod --field-selector=status.phase=Running -o json | ./jq -r '.items | length') -gt 0 diff --git a/examples/tiny-kafka/charts/strimzi-values.yaml b/examples/tiny-kafka/charts/strimzi-values.yaml new file mode 100644 index 0000000000..3416edb04a --- /dev/null +++ b/examples/tiny-kafka/charts/strimzi-values.yaml @@ -0,0 +1,6 @@ +image: + imagePullSecrets: zarf-registry +imageRegistryOverride: registry1.dso.mil +imageRepositoryOverride: ironbank/opensource/strimzi +watchNamespaces: + - kafka-demo \ No newline at end of file diff --git a/examples/tiny-kafka/manifests/image-pull-secret.yaml b/examples/tiny-kafka/manifests/image-pull-secret.yaml deleted file mode 100644 index 52685465ee..0000000000 --- a/examples/tiny-kafka/manifests/image-pull-secret.yaml +++ /dev/null @@ -1,55 +0,0 @@ -apiVersion: v1 -kind: Secret -type: kubernetes.io/dockerconfigjson -metadata: - name: private-registry - namespace: kafka-operator -stringData: - .dockerconfigjson: | - { - "auths": { - "registry.dso.mil": { - "auth":"###ZARF_DOCKERAUTH###" - }, - "registry1.dso.mil": { - "auth":"###ZARF_DOCKERAUTH###" - }, - "docker.io": { - "auth":"###ZARF_DOCKERAUTH###" - }, - "registry-1.docker.io": { - "auth":"###ZARF_DOCKERAUTH###" - }, - "ghcr.io": { - "auth":"###ZARF_DOCKERAUTH###" - } - } - } ---- -apiVersion: v1 -kind: Secret -type: kubernetes.io/dockerconfigjson -metadata: - name: private-registry - namespace: kafka-demo -stringData: - .dockerconfigjson: | - { - "auths": { - "registry.dso.mil": { - "auth":"###ZARF_DOCKERAUTH###" - }, - "registry1.dso.mil": { - "auth":"###ZARF_DOCKERAUTH###" - }, - "docker.io": { - "auth":"###ZARF_DOCKERAUTH###" - }, - "registry-1.docker.io": { - "auth":"###ZARF_DOCKERAUTH###" - }, - "ghcr.io": { - "auth":"###ZARF_DOCKERAUTH###" - } - } - } diff --git a/examples/tiny-kafka/manifests/kafka.yaml b/examples/tiny-kafka/manifests/kafka.yaml index 6f8d27a971..caa33fc95f 100644 --- a/examples/tiny-kafka/manifests/kafka.yaml +++ b/examples/tiny-kafka/manifests/kafka.yaml @@ -1,8 +1,3 @@ -apiVersion: v1 -kind: Namespace -metadata: - name: kafka-demo ---- apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka metadata: diff --git a/examples/tiny-kafka/manifests/operator.yaml b/examples/tiny-kafka/manifests/operator.yaml deleted file mode 100644 index 10fc6f861c..0000000000 --- a/examples/tiny-kafka/manifests/operator.yaml +++ /dev/null @@ -1,20 +0,0 @@ -apiVersion: v1 -kind: Namespace -metadata: - name: kafka-operator ---- -apiVersion: helm.cattle.io/v1 -kind: HelmChart -metadata: - name: strimzi - namespace: kafka-operator -spec: - chart: https://%{KUBERNETES_API}%/static/charts/strimzi-kafka-operator-0.24.0.tgz - targetNamespace: kafka-operator - valuesContent: |- - image: - imagePullSecrets: private-registry - imageRegistryOverride: registry1.dso.mil - imageRepositoryOverride: ironbank/opensource/strimzi - watchNamespaces: - - kafka-demo diff --git a/examples/tiny-kafka/zarf.yaml b/examples/tiny-kafka/zarf.yaml index 4d907fa742..55c5214519 100644 --- a/examples/tiny-kafka/zarf.yaml +++ b/examples/tiny-kafka/zarf.yaml @@ -6,13 +6,18 @@ metadata: components: - name: baseline required: true - manifests: manifests - + manifests: + - name: kafka-config + files: + - manifests/kafka.yaml + - manifests/kafka-topic.yaml charts: - name: strimzi-kafka-operator url: https://strimzi.io/charts/ version: 0.24.0 - + namespace: kafka-demo + valuesFiles: + - charts/strimzi-values.yaml images: - registry1.dso.mil/ironbank/opensource/strimzi/operator:0.24.0 - registry1.dso.mil/ironbank/opensource/strimzi/kafka:0.24.0-kafka-2.8.0 diff --git a/go.mod b/go.mod index fcdd7fbc23..acffec5818 100644 --- a/go.mod +++ b/go.mod @@ -4,22 +4,55 @@ go 1.16 require ( github.com/AlecAivazis/survey/v2 v2.3.2 - github.com/alecthomas/jsonschema v0.0.0-20211022214203-8b29eab41725 - github.com/docker/cli v20.10.10+incompatible + github.com/alecthomas/jsonschema v0.0.0-20211228220459-151e3c21f49d + github.com/distribution/distribution/v3 v3.0.0-20210804104954-38ab4c606ee3 + github.com/docker/cli v20.10.12+incompatible github.com/fatih/color v1.13.0 github.com/go-git/go-git/v5 v5.4.2 - github.com/goccy/go-yaml v1.9.4 - github.com/google/go-containerregistry v0.7.0 + github.com/go-logr/logr v1.2.2 + github.com/goccy/go-yaml v1.9.5 + github.com/google/go-containerregistry v0.8.0 github.com/gruntwork-io/terratest v0.38.2 - github.com/mattn/go-colorable v0.1.11 + github.com/mattn/go-colorable v0.1.12 github.com/mholt/archiver/v3 v3.5.1 github.com/otiai10/copy v1.7.0 - github.com/sirupsen/logrus v1.8.1 - github.com/spf13/cobra v1.2.1 + github.com/pterm/pterm v0.12.33 + github.com/spf13/cobra v1.3.0 github.com/stretchr/testify v1.7.0 - golang.org/x/crypto v0.0.0-20211202192323-5770296d904e + golang.org/x/crypto v0.0.0-20211215165025-cf75a172585e helm.sh/helm/v3 v3.7.2 - k8s.io/api v0.22.4 - k8s.io/apimachinery v0.22.4 - k8s.io/client-go v0.22.4 + k8s.io/api v0.22.5 + k8s.io/apimachinery v0.22.5 + k8s.io/client-go v0.22.5 + k8s.io/klog/v2 v2.40.1 + sigs.k8s.io/yaml v1.2.0 +) + +replace ( + // https://github.com/kubernetes/kubernetes/issues/79384#issuecomment-505627280 + k8s.io/api => k8s.io/api v0.22.5 + k8s.io/apiextensions-apiserver => k8s.io/apiextensions-apiserver v0.22.5 // indirect + k8s.io/apimachinery => k8s.io/apimachinery v0.22.5 // indirect + k8s.io/apiserver => k8s.io/apiserver v0.22.5 + k8s.io/cli-runtime => k8s.io/cli-runtime v0.22.5 + k8s.io/client-go => k8s.io/client-go v0.22.5 + k8s.io/cloud-provider => k8s.io/cloud-provider v0.22.5 + k8s.io/cluster-bootstrap => k8s.io/cluster-bootstrap v0.22.5 + k8s.io/code-generator => k8s.io/code-generator v0.22.5 + k8s.io/component-base => k8s.io/component-base v0.22.5 + k8s.io/component-helpers => k8s.io/component-helpers v0.22.5 + k8s.io/controller-manager => k8s.io/controller-manager v0.22.5 + k8s.io/cri-api => k8s.io/cri-api v0.22.5 + k8s.io/csi-translation-lib => k8s.io/csi-translation-lib v0.22.5 + k8s.io/kube-aggregator => k8s.io/kube-aggregator v0.22.5 + k8s.io/kube-controller-manager => k8s.io/kube-controller-manager v0.22.5 + k8s.io/kube-proxy => k8s.io/kube-proxy v0.22.5 + k8s.io/kube-scheduler => k8s.io/kube-scheduler v0.22.5 + k8s.io/kubectl => k8s.io/kubectl v0.22.5 + k8s.io/kubelet => k8s.io/kubelet v0.22.5 + k8s.io/legacy-cloud-providers => k8s.io/legacy-cloud-providers v0.22.5 + k8s.io/metrics => k8s.io/metrics v0.22.5 + k8s.io/mount-utils => k8s.io/mount-utils v0.22.5 + k8s.io/pod-security-admission => k8s.io/pod-security-admission v0.22.5 + k8s.io/sample-apiserver => k8s.io/sample-apiserver v0.22.5 ) diff --git a/go.sum b/go.sum index 7a3218d014..e507351c62 100644 --- a/go.sum +++ b/go.sum @@ -25,8 +25,10 @@ cloud.google.com/go v0.87.0/go.mod h1:TpDYlFy7vuLzZMMZ+B6iRiELaY7z/gJPaqbMx6mlWc cloud.google.com/go v0.90.0/go.mod h1:kRX0mNRHe0e2rC6oNakvwQqzyDmg57xJ+SZU1eT2aDQ= cloud.google.com/go v0.93.3/go.mod h1:8utlLll2EF5XMAV15woO4lSbWQlk8rer9aLOfLh7+YI= cloud.google.com/go v0.94.1/go.mod h1:qAlAugsXlC+JWO+Bke5vCtc9ONxjQT3drlTTnAplMW4= -cloud.google.com/go v0.97.0 h1:3DXvAyifywvq64LfkKaMOmkWPS1CikIQdMe2lY9vxU8= cloud.google.com/go v0.97.0/go.mod h1:GF7l59pYBVlXQIBLx3a761cZ41F9bBH3JUlihCt2Udc= +cloud.google.com/go v0.98.0/go.mod h1:ua6Ush4NALrHk5QXDWnjvZHN93OuF0HfuEPq9I1X0cM= +cloud.google.com/go v0.99.0 h1:y/cM2iqGgGi5D5DQZl6D9STN/3dR/Vx5Mp8s752oJTY= +cloud.google.com/go v0.99.0/go.mod h1:w0Xx2nLzqWJPuozYQX+hFfCSI8WioryfRDzkoI/Y2ZA= cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= @@ -36,6 +38,7 @@ cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM7 cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= cloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqClKRT5SZwBmk= +cloud.google.com/go/firestore v1.6.1/go.mod h1:asNXNOzBdyVQmEU+ggO8UPodTkEVFW5Qx+rwHnAz+EY= cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= @@ -56,18 +59,15 @@ github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 h1:UQHMgLO+TxOEl github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= github.com/Azure/go-autorest v10.8.1+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= -github.com/Azure/go-autorest/autorest v0.11.1/go.mod h1:JFgpikqFJ/MleTTxwepExTKnFUKKszPS8UavbQYUMuw= github.com/Azure/go-autorest/autorest v0.11.17/go.mod h1:eipySxLmqSyC5s5k1CLupqet0PSENBEDP93LQ9a8QYw= github.com/Azure/go-autorest/autorest v0.11.18/go.mod h1:dSiJPy22c3u0OtOKDNttNgqpNFY/GeWa7GH/Pz56QRA= github.com/Azure/go-autorest/autorest v0.11.20/go.mod h1:o3tqFY+QR40VOlk+pV4d77mORO64jOXSgEnPQgLK6JY= -github.com/Azure/go-autorest/autorest/adal v0.9.0/go.mod h1:/c022QCutn2P7uY+/oQWWNcK9YU+MH96NgK+jErpbcg= github.com/Azure/go-autorest/autorest/adal v0.9.5/go.mod h1:B7KF7jKIeC9Mct5spmyCB/A8CG/sEz1vwIRGv/bbw7A= github.com/Azure/go-autorest/autorest/adal v0.9.11/go.mod h1:nBKAnTomx8gDtl+3ZCJv2v0KACFHWTB2drffI1B68Pk= github.com/Azure/go-autorest/autorest/adal v0.9.13/go.mod h1:W/MM4U6nLxnIskrw4UwWzlHfGjwUS50aOsc/I3yuU8M= github.com/Azure/go-autorest/autorest/azure/auth v0.5.8/go.mod h1:kxyKZTSfKh8OVFWPAgOgQ/frrJgeYQJPyR5fLFmXko4= github.com/Azure/go-autorest/autorest/azure/cli v0.4.2/go.mod h1:7qkJkT+j6b+hIpzMOwPChJhTqS8VbsqqgULzMNRugoM= github.com/Azure/go-autorest/autorest/date v0.3.0/go.mod h1:BI0uouVdmngYNUzGWeSYnokU+TrmwEsOqdt8Y6sso74= -github.com/Azure/go-autorest/autorest/mocks v0.4.0/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= github.com/Azure/go-autorest/autorest/mocks v0.4.1/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= github.com/Azure/go-autorest/autorest/to v0.4.0/go.mod h1:fE8iZBn7LQR7zH/9XU2NcPR4o9jEImooCeWJcYV/zLE= github.com/Azure/go-autorest/autorest/validation v0.3.1/go.mod h1:yhLgjC0Wda5DYXl6JAsWyUe4KVNffhoDhG0zVzUMo3E= @@ -79,8 +79,14 @@ github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03 github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/DATA-DOG/go-sqlmock v1.5.0 h1:Shsta01QNfFxHCfpW6YH2STWB0MudeXXEWMr20OEh60= github.com/DATA-DOG/go-sqlmock v1.5.0/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM= +github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= github.com/MakeNowJust/heredoc v0.0.0-20170808103936-bb23615498cd h1:sjQovDkwrZp8u+gxLtPgKGjk5hCxuy2hrRejBTA9xFU= github.com/MakeNowJust/heredoc v0.0.0-20170808103936-bb23615498cd/go.mod h1:64YHyfSL2R96J44Nlwm39UHepQbyR5q10x7iYa1ks2E= +github.com/MarvinJWendt/testza v0.1.0/go.mod h1:7AxNvlfeHP7Z/hDQ5JtE3OKYT3XFUeLCDE2DQninSqs= +github.com/MarvinJWendt/testza v0.2.1/go.mod h1:God7bhG8n6uQxwdScay+gjm9/LnO4D3kkcZX4hv9Rp8= +github.com/MarvinJWendt/testza v0.2.8/go.mod h1:nwIcjmr0Zz+Rcwfh3/4UhBp7ePKVhuBExvZqnKYWlII= +github.com/MarvinJWendt/testza v0.2.10 h1:cX4zE9TofXxe72a6EPIYAxC+8cVWTsmmgsXTZIT+5bQ= +github.com/MarvinJWendt/testza v0.2.10/go.mod h1:pd+VWsoGUiFtq+hRKSU1Bktnn+DMCSrDrXDpX2bG66k= github.com/Masterminds/goutils v1.1.0/go.mod h1:8cTjp+g8YejhMuvIA5y2vz3BpJxksy863GQaJW2MFNU= github.com/Masterminds/goutils v1.1.1 h1:5nUrii3FMTL5diU80unEVvNevw1nH4+ZV4DSLVJLSYI= github.com/Masterminds/goutils v1.1.1/go.mod h1:8cTjp+g8YejhMuvIA5y2vz3BpJxksy863GQaJW2MFNU= @@ -113,8 +119,9 @@ github.com/Microsoft/hcsshim v0.8.9/go.mod h1:5692vkUqntj1idxauYlpoINNKeqCiG6Sg3 github.com/Microsoft/hcsshim v0.8.14/go.mod h1:NtVKoYxQuTLx6gEq0L96c9Ju4JbRJ4nY2ow3VK6a9Lg= github.com/Microsoft/hcsshim v0.8.15/go.mod h1:x38A4YbHbdxJtc0sF6oIz+RG0npwSCAvn69iY6URG00= github.com/Microsoft/hcsshim v0.8.16/go.mod h1:o5/SZqmR7x9JNKsW3pu+nqHm0MF8vbA+VxGOoXdC600= -github.com/Microsoft/hcsshim v0.8.21 h1:btRfUDThBE5IKcvI8O8jOiIkujUsAMBSRsYDYmEi6oM= github.com/Microsoft/hcsshim v0.8.21/go.mod h1:+w2gRZ5ReXQhFOrvSQeNfhrYB/dg3oDwTOcER2fw4I4= +github.com/Microsoft/hcsshim v0.8.23 h1:47MSwtKGXet80aIn+7h4YI6fwPmwIghAnsx2aOUrG2M= +github.com/Microsoft/hcsshim v0.8.23/go.mod h1:4zegtUJth7lAvFyc6cH2gGQ5B3OFQim01nnU2M8jKDg= github.com/Microsoft/hcsshim/test v0.0.0-20201218223536-d3e5debf77da/go.mod h1:5hlzMzRKMLyo42nCZ9oml8AdTlq/0cvIaBv6tK1RehU= github.com/Microsoft/hcsshim/test v0.0.0-20210227013316-43a75bb4edd3/go.mod h1:mw7qgWloBUl75W/gVH3cQszUg1+gUITj7D6NY7ywVnY= github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ= @@ -135,8 +142,8 @@ github.com/acomagu/bufpipe v1.0.3/go.mod h1:mxdxdup/WdsKVreO5GpW4+M/1CE2sMG4jeGJ github.com/agext/levenshtein v1.2.1/go.mod h1:JEDfjyjHDjOF/1e4FlBE/PkbqA9OfWu2ki2W0IB5558= github.com/agext/levenshtein v1.2.3 h1:YB2fHEn0UJagG8T1rrWknE3ZQzWM06O8AMAatNn7lmo= github.com/agext/levenshtein v1.2.3/go.mod h1:JEDfjyjHDjOF/1e4FlBE/PkbqA9OfWu2ki2W0IB5558= -github.com/alecthomas/jsonschema v0.0.0-20211022214203-8b29eab41725 h1:NjwIgLQlD46o79bheVG4SCdRnnOz4XtgUN1WABX5DLA= -github.com/alecthomas/jsonschema v0.0.0-20211022214203-8b29eab41725/go.mod h1:/n6+1/DWPltRLWL/VKyUxg6tzsl5kHUCcraimt4vr60= +github.com/alecthomas/jsonschema v0.0.0-20211228220459-151e3c21f49d h1:4BQNwS4T13UU3Yee4GfzZH3Q9SNpKeJvLigfw8fDjX0= +github.com/alecthomas/jsonschema v0.0.0-20211228220459-151e3c21f49d/go.mod h1:/n6+1/DWPltRLWL/VKyUxg6tzsl5kHUCcraimt4vr60= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= @@ -156,12 +163,16 @@ github.com/apparentlymart/go-textseg/v13 v13.0.0/go.mod h1:ZK2fH7c4NqDTLtiYLvIkE github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= +github.com/armon/go-metrics v0.3.10/go.mod h1:4O98XIr/9W0sxpJ8UaYkvjk10Iff7SnFrb4QAOwNTFc= github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= +github.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPdPJAN/hZIm0C4OItdklCFmMRWYpio= github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= github.com/asaskevich/govalidator v0.0.0-20200428143746-21a406dcc535 h1:4daAzAu0S6Vi7/lbWECcX0j45yZReDZ56BQsrVBOEEY= github.com/asaskevich/govalidator v0.0.0-20200428143746-21a406dcc535/go.mod h1:oGkLhpf+kjZl6xBf758TQhh5XrAeiJv/7FRz/2spLIg= +github.com/atomicgo/cursor v0.0.1 h1:xdogsqa6YYlLfM+GyClC/Lchf7aiMerFiZQn7soTOoU= +github.com/atomicgo/cursor v0.0.1/go.mod h1:cBON2QmmrysudxNBFthvMtN32r3jxVRIvzkUiF/RuIk= github.com/aws/aws-lambda-go v1.13.3/go.mod h1:4UKl9IzQMoD+QF79YdCuzCwp8VbmG4VAQwij/eHl5CU= github.com/aws/aws-sdk-go v1.15.11/go.mod h1:mFuSZ37Z9YOHbQEwBWztmVzqXrEkub65tZoCYDt7FT0= github.com/aws/aws-sdk-go v1.34.9/go.mod h1:5zCpMtNQVjRREroY7sYe8lOMRSxkhG6MZveU8YkpAk0= @@ -174,6 +185,7 @@ github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+Ce github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= +github.com/bitly/go-simplejson v0.5.0 h1:6IH+V8/tVMab511d5bn4M7EwGXZf9Hj6i2xSwkNEM+Y= github.com/bitly/go-simplejson v0.5.0/go.mod h1:cXHtHw4XUPsvGaxgjIAn8PhEWG9NfngEKAMDJEczWVA= github.com/bits-and-blooms/bitset v1.2.0/go.mod h1:gIdJ4wp64HaoK2YrL1Q5/N7Y16edYb8uY+O0FJTyyDA= github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84= @@ -193,13 +205,16 @@ github.com/bugsnag/osext v0.0.0-20130617224835-0dd3f918b21b h1:otBG+dV+YK+Soembj github.com/bugsnag/osext v0.0.0-20130617224835-0dd3f918b21b/go.mod h1:obH5gd0BsqsP2LwDJ9aOkm/6J86V6lyAXCoQWGw3K50= github.com/bugsnag/panicwrap v0.0.0-20151223152923-e2c28503fcd0 h1:nvj0OLI3YqYXer/kZD8Ri1aaunCxIEsOst1BVJswV0o= github.com/bugsnag/panicwrap v0.0.0-20151223152923-e2c28503fcd0/go.mod h1:D/8v3kj0zr8ZAKg1AQ6crr+5VwKN5eIywRkfhyM/+dE= +github.com/cenkalti/backoff/v4 v4.1.1/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/census-instrumentation/opencensus-proto v0.3.0/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/certifi/gocertifi v0.0.0-20191021191039-0944d244cd40/go.mod h1:sGbDF6GwGcLpkNXPUTkMRoywsNa/ol15pxFe6ERfguA= github.com/certifi/gocertifi v0.0.0-20200922220541-2c3bb06c6054/go.mod h1:sGbDF6GwGcLpkNXPUTkMRoywsNa/ol15pxFe6ERfguA= github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= -github.com/cespare/xxhash/v2 v2.1.1 h1:6MnRN8NT7+YBpUIWxHtefFZOKTAPgGjpQSxqLNn0+qY= github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cespare/xxhash/v2 v2.1.2 h1:YRXhKfTDauu4ajMg1TPgFO5jnlC2HCbmLXMcTG5cbYE= +github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/chai2010/gettext-go v0.0.0-20160711120539-c6fed771bfd5/go.mod h1:/iP1qXHoty45bqomnu2LM+VVyAEdWN+vtSHGlQgyxbw= github.com/checkpoint-restore/go-criu/v4 v4.1.0/go.mod h1:xUQBLp4RLc5zJtWY++yjOoMoB5lihDt7fai+75m+rGw= github.com/checkpoint-restore/go-criu/v5 v5.0.0/go.mod h1:cfwC0EG7HMUenopBsUf9d89JlCLQIfgVcNsNN0t6T2M= @@ -211,6 +226,8 @@ github.com/cilium/ebpf v0.0.0-20200702112145-1c8d4c9ef775/go.mod h1:7cR51M8ViRLI github.com/cilium/ebpf v0.2.0/go.mod h1:To2CFviqOWL/M0gIMsvSMlqe7em/l1ALkX1PyjrX2Qs= github.com/cilium/ebpf v0.4.0/go.mod h1:4tRaxcgiL706VnOzHOdBlY8IEAIdxINsQBcU4xJJXRs= github.com/cilium/ebpf v0.6.2/go.mod h1:4tRaxcgiL706VnOzHOdBlY8IEAIdxINsQBcU4xJJXRs= +github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag= +github.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= @@ -219,8 +236,9 @@ github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XP github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20211001041855-01bcc9b48dfe/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= +github.com/cncf/xds/go v0.0.0-20211130200136-a8f946100490/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cockroachdb/datadriven v0.0.0-20200714090401-bf6692d28da5/go.mod h1:h6jFvWxBdQXxjopDMZyH2UVceIRfR84bdzbkoKrsWNo= github.com/cockroachdb/errors v1.2.4/go.mod h1:rQD95gz6FARkaKkQXUksEje/d9a6wBJoCr5oaCLELYA= github.com/cockroachdb/logtags v0.0.0-20190617123548-eb05cc24525f/go.mod h1:i/u985jwjWRlyHXQbwatDASoW0RMlZ/3i9yJHE2xLkI= @@ -252,14 +270,16 @@ github.com/containerd/containerd v1.3.2/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMX github.com/containerd/containerd v1.4.0-beta.2.0.20200729163537-40b22ef07410/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= github.com/containerd/containerd v1.4.1/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= github.com/containerd/containerd v1.4.3/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= +github.com/containerd/containerd v1.4.9/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= github.com/containerd/containerd v1.5.0-beta.1/go.mod h1:5HfvG1V2FsKesEGQ17k5/T7V960Tmcumvqn8Mc+pCYQ= github.com/containerd/containerd v1.5.0-beta.3/go.mod h1:/wr9AVtEM7x9c+n0+stptlo/uBBoBORwEx6ardVcmKU= github.com/containerd/containerd v1.5.0-beta.4/go.mod h1:GmdgZd2zA2GYIBZ0w09ZvgqEq8EfBp/m3lcVZIvPHhI= github.com/containerd/containerd v1.5.0-rc.0/go.mod h1:V/IXoMqNGgBlabz3tHD2TWDoTJseu1FGOKuoA4nNb2s= github.com/containerd/containerd v1.5.1/go.mod h1:0DOxVqwDy2iZvrZp2JUx/E+hS0UNTVn7dJnIOwtYR4g= github.com/containerd/containerd v1.5.2/go.mod h1:0DOxVqwDy2iZvrZp2JUx/E+hS0UNTVn7dJnIOwtYR4g= -github.com/containerd/containerd v1.5.7 h1:rQyoYtj4KddB3bxG6SAqd4+08gePNyJjRqvOIfV3rkM= github.com/containerd/containerd v1.5.7/go.mod h1:gyvv6+ugqY25TiXxcZC3L5yOeYgEw0QMhscqVp1AR9c= +github.com/containerd/containerd v1.5.8 h1:NmkCC1/QxyZFBny8JogwLpOy2f+VEbO/f6bV2Mqtwuw= +github.com/containerd/containerd v1.5.8/go.mod h1:YdFSv5bTFLpG2HIYmfqDpSYYTDX+mc5qtSuYx1YUb/s= github.com/containerd/continuity v0.0.0-20190426062206-aaeac12a7ffc/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y= github.com/containerd/continuity v0.0.0-20190815185530-f2a389ac0a02/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y= github.com/containerd/continuity v0.0.0-20191127005431-f65d91d395eb/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y= @@ -288,13 +308,14 @@ github.com/containerd/nri v0.0.0-20201007170849-eb1350a75164/go.mod h1:+2wGSDGFY github.com/containerd/nri v0.0.0-20210316161719-dbaa18c31c14/go.mod h1:lmxnXF6oMkbqs39FiCt1s0R2HSMhcLel9vNL3m4AaeY= github.com/containerd/nri v0.1.0/go.mod h1:lmxnXF6oMkbqs39FiCt1s0R2HSMhcLel9vNL3m4AaeY= github.com/containerd/stargz-snapshotter/estargz v0.7.0/go.mod h1:83VWDqHnurTKliEB0YvWMiCfLDwv4Cjj1X9Vk98GJZw= -github.com/containerd/stargz-snapshotter/estargz v0.10.0 h1:glqzafvxBBAMo+x2w2sdDjUDZeTqqLJmqZPY05qehCU= -github.com/containerd/stargz-snapshotter/estargz v0.10.0/go.mod h1:aE5PCyhFMwR8sbrErO5eM2GcvkyXTTJremG883D4qF0= +github.com/containerd/stargz-snapshotter/estargz v0.10.1 h1:hd1EoVjI2Ax8Cr64tdYqnJ4i4pZU49FkEf5kU8KxQng= +github.com/containerd/stargz-snapshotter/estargz v0.10.1/go.mod h1:aE5PCyhFMwR8sbrErO5eM2GcvkyXTTJremG883D4qF0= github.com/containerd/ttrpc v0.0.0-20190828154514-0e0f228740de/go.mod h1:PvCDdDGpgqzQIzDW1TphrGLssLDZp2GuS+X5DkEJB8o= github.com/containerd/ttrpc v0.0.0-20190828172938-92c8520ef9f8/go.mod h1:PvCDdDGpgqzQIzDW1TphrGLssLDZp2GuS+X5DkEJB8o= github.com/containerd/ttrpc v0.0.0-20191028202541-4f1b8fe65a5c/go.mod h1:LPm1u0xBw8r8NOKoOdNMeVHSawSsltak+Ihv+etqsE8= github.com/containerd/ttrpc v1.0.1/go.mod h1:UAxOpgT9ziI0gJrmKvgcZivgxOp8iFPSk8httJEt98Y= github.com/containerd/ttrpc v1.0.2/go.mod h1:UAxOpgT9ziI0gJrmKvgcZivgxOp8iFPSk8httJEt98Y= +github.com/containerd/ttrpc v1.1.0/go.mod h1:XX4ZTnoOId4HklF4edwc4DcqskFZuvXB1Evzy5KFQpQ= github.com/containerd/typeurl v0.0.0-20180627222232-a93fcdb778cd/go.mod h1:Cm3kwCdlkCfMSHURc+r6fwoGH6/F1hH3S4sg0rLFWPc= github.com/containerd/typeurl v0.0.0-20190911142611-5eb25027c9fd/go.mod h1:GeKYzf2pQcqv7tJ0AoCuuhtnqhva5LNU3U+OyKxxJpk= github.com/containerd/typeurl v1.0.1/go.mod h1:TB1hUtrpaiO88KEK56ijojHS1+NeF0izUACaJW2mdXg= @@ -326,13 +347,11 @@ github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7 github.com/coreos/go-systemd/v22 v22.0.0/go.mod h1:xO0FLkIi5MaZafQlIrOotqXZ90ih+1atmu1JpKERPPk= github.com/coreos/go-systemd/v22 v22.1.0/go.mod h1:xO0FLkIi5MaZafQlIrOotqXZ90ih+1atmu1JpKERPPk= github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= -github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= github.com/cpuguy83/go-md2man/v2 v2.0.1 h1:r/myEWzV9lfsM1tFLgDyu0atFtJ1fXn261LKYj/3DxU= github.com/cpuguy83/go-md2man/v2 v2.0.1/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= -github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/creack/pty v1.1.11 h1:07n33Z8lZxZ2qwegKbObQohDhXDQxiMMz1NOUGYlesw= github.com/creack/pty v1.1.11/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= @@ -358,16 +377,16 @@ github.com/distribution/distribution/v3 v3.0.0-20210804104954-38ab4c606ee3 h1:rE github.com/distribution/distribution/v3 v3.0.0-20210804104954-38ab4c606ee3/go.mod h1:gt38b7cvVKazi5XkHvINNytZXgTEntyhtyM3HQz46Nk= github.com/dnaeon/go-vcr v1.0.1/go.mod h1:aBB1+wY4s93YsC3HHjMBMrwTj2R9FHDzUr9KyGc8n1E= github.com/docker/cli v20.10.7+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= -github.com/docker/cli v20.10.10+incompatible h1:kcbwdgWbrBOH8QwQzaJmyriHwF7XIl4HT1qh0HTRys4= -github.com/docker/cli v20.10.10+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= +github.com/docker/cli v20.10.12+incompatible h1:lZlz0uzG+GH+c0plStMUdF/qk3ppmgnswpR5EbqzVGA= +github.com/docker/cli v20.10.12+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= github.com/docker/distribution v0.0.0-20190905152932-14b96e55d84c/go.mod h1:0+TTO4EOBfRPhZXAeF1Vu+W3hHZ8eLp8PgKVZlcvtFY= github.com/docker/distribution v2.7.1-0.20190205005809-0d3efadf0154+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= github.com/docker/distribution v2.7.1+incompatible h1:a5mlkVzth6W5A4fOsS3D2EO5BUmsJpcB+cRlLU7cSug= github.com/docker/distribution v2.7.1+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= github.com/docker/docker v17.12.0-ce-rc1.0.20200618181300-9dc6525e6118+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= github.com/docker/docker v20.10.7+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= -github.com/docker/docker v20.10.10+incompatible h1:GKkP0T7U4ks6X3lmmHKC2QDprnpRJor2Z5a8m62R9ZM= -github.com/docker/docker v20.10.10+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/docker v20.10.12+incompatible h1:CEeNmFM0QZIsJCZKMkZx0ZcahTiewkrgiwfYD+dfl1U= +github.com/docker/docker v20.10.12+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= github.com/docker/docker-credential-helpers v0.6.3/go.mod h1:WRaJzqw3CTB9bk10avuGsjVBZsD05qeibJ1/TYlvc0Y= github.com/docker/docker-credential-helpers v0.6.4 h1:axCks+yV+2MR3/kZhAmy07yC56WZ2Pwu/fKWtKuZB0o= github.com/docker/docker-credential-helpers v0.6.4/go.mod h1:ofX3UI0Gz1TteYBjtgs07O36Pyasyp66D2uKT7H8W1c= @@ -383,7 +402,6 @@ github.com/docker/go-units v0.4.0 h1:3uh0PgVws3nIA0Q+MwDC8yjEPf9zjRfZZWXZYDct3Tw github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= github.com/docker/libtrust v0.0.0-20150114040149-fa567046d9b1 h1:ZClxb8laGDf5arXfYcAtECDFgAgHklGI8CxgjHnXKJ4= github.com/docker/libtrust v0.0.0-20150114040149-fa567046d9b1/go.mod h1:cyGadeNEkKy96OOhEzfZl+yxihPEzKnqJwvfuSUqbZE= -github.com/docker/spdystream v0.0.0-20160310174837-449fdfce4d96/go.mod h1:Qh8CwZgvJUkLughtfhJv5dyTYa91l1fOUCrgjqmcifM= github.com/docker/spdystream v0.0.0-20181023171402-6480d4af844c/go.mod h1:Qh8CwZgvJUkLughtfhJv5dyTYa91l1fOUCrgjqmcifM= github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE= github.com/dsnet/compress v0.0.2-0.20210315054119-f66993602bf5 h1:iFaUwBSo5Svw6L7HYpRu/0lE3e0BaElwnNO1qkNQxBY= @@ -407,8 +425,9 @@ github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.m github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0= +github.com/envoyproxy/go-control-plane v0.10.1/go.mod h1:AY7fTTXNdv/aJ2O5jwpxAPOWUZ7hQAEvzN5Pf27BkQQ= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/evanphx/json-patch v4.9.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= +github.com/envoyproxy/protoc-gen-validate v0.6.2/go.mod h1:2t7qjJNvHPx8IjnBOzl9E9/baC+qXE/TeeyBRzgJDws= github.com/evanphx/json-patch v4.11.0+incompatible h1:glyUF9yIYtMHzn8xaKw5rMhdWcwsYV8dZHIq5567/xs= github.com/evanphx/json-patch v4.11.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= github.com/exponent-io/jsonpath v0.0.0-20151013193312-d6023ce2651d h1:105gxyaGwCFad8crR9dcMQWvV9Hvulu6hwUh4tWPJnM= @@ -426,14 +445,14 @@ github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoD github.com/form3tech-oss/jwt-go v3.2.3+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= github.com/frankban/quicktest v1.11.3/go.mod h1:wRf/ReqHper53s+kmmSZizM8NamnL3IM0I9ntUbOk+k= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= -github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= +github.com/fsnotify/fsnotify v1.5.1 h1:mZcQUHVQUQWoPXXtuf9yuEXKudkV2sx1E06UadKWpgI= +github.com/fsnotify/fsnotify v1.5.1/go.mod h1:T3375wBYaZdLLcVNkcVbzGHY7f1l/uK5T5Ai1i3InKU= github.com/fullsailor/pkcs7 v0.0.0-20190404230743-d7302db945fa/go.mod h1:KnogPXtdwXqoenmZCw6S+25EAm2MkxbG0deNDu4cbSA= github.com/fvbommel/sortorder v1.0.1/go.mod h1:uk88iVf1ovNn1iLfgUVU2F9o5eO30ui720w+kxuqRs0= github.com/garyburd/redigo v0.0.0-20150301180006-535138d7bcd7 h1:LofdAjjjqCSXMwLGgOgnE+rdPuvX9DxCqaHwKy7i/ko= github.com/garyburd/redigo v0.0.0-20150301180006-535138d7bcd7/go.mod h1:NR3MbYisc3/PwhQ00EMzDiPmrwpPxAn5GI05/YaO1SY= github.com/getsentry/raven-go v0.2.0/go.mod h1:KungGk8q33+aIAZUIVWZDr2OfAEBsO49PX4NzFV5kcQ= -github.com/ghodss/yaml v0.0.0-20150909031657-73d445a93680/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/gliderlabs/ssh v0.2.2 h1:6zsha5zo/TWhRhwqCD3+EarCAgZ2yN28ipRnGPnwkI0= github.com/gliderlabs/ssh v0.2.2/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0= @@ -461,18 +480,16 @@ github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas= github.com/go-logr/logr v0.2.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= -github.com/go-logr/logr v0.4.0 h1:K7/B1jt6fIBQVd4Owv2MqGQClcgf0R266+7C/QjRcLc= github.com/go-logr/logr v0.4.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= -github.com/go-openapi/jsonpointer v0.19.2/go.mod h1:3akKfEdA7DF1sugOqz1dVQHBcuDBPKZGEoHC/NkiQRg= +github.com/go-logr/logr v1.2.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.2.2 h1:ahHml/yUpnlb96Rp8HCvtYVPY8ZYpxq3g7UYchIYwbs= +github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= github.com/go-openapi/jsonpointer v0.19.5 h1:gZr+CIYByUqjcgeLXnQu2gHYQC9o73G2XUeOFYEICuY= github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= -github.com/go-openapi/jsonreference v0.19.2/go.mod h1:jMjeRr2HHw6nAVajTXJ4eiUwohSTlpa0o73RUL1owJc= github.com/go-openapi/jsonreference v0.19.3/go.mod h1:rjx6GuL8TTa9VaixXglHmQmIL98+wF9xc8zWvFonSJ8= github.com/go-openapi/jsonreference v0.19.5 h1:1WJP/wi4OjB4iV8KVbH73rQaoialJrqv8gitZLxGLtM= github.com/go-openapi/jsonreference v0.19.5/go.mod h1:RdybgQwPxbL4UEjuAruzK1x3nE69AqPYEJeo/TWfEeg= -github.com/go-openapi/spec v0.19.3/go.mod h1:FpwSN1ksY1eteniUU7X0N/BgJ7a4WvBFVA8Lj9mJglo= -github.com/go-openapi/swag v0.19.2/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= github.com/go-openapi/swag v0.19.14 h1:gm3vOOXfiuw5i9p5N9xJvfjvuofpyvLA9Wr6QfK5Fng= github.com/go-openapi/swag v0.19.14/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= @@ -498,8 +515,8 @@ github.com/gobuffalo/packr/v2 v2.8.1 h1:tkQpju6i3EtMXJ9uoF5GT6kB+LMTimDWD8Xvbz6z github.com/gobuffalo/packr/v2 v2.8.1/go.mod h1:c/PLlOuTU+p3SybaJATW3H6lX/iK7xEz5OeMf+NnJpg= github.com/gobwas/glob v0.2.3 h1:A4xDbljILXROh+kObIiy5kIaPYD8e96x1tgBhUI5J+Y= github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8= -github.com/goccy/go-yaml v1.9.4 h1:S0GCYjwHKVI6IHqio7QWNKNThUl6NLzFd/g8Z65Axw8= -github.com/goccy/go-yaml v1.9.4/go.mod h1:U/jl18uSupI5rdI2jmuCswEA2htH9eXfferR3KfscvA= +github.com/goccy/go-yaml v1.9.5 h1:Eh/+3uk9kLxG4koCX6lRMAPS1OaMSAi+FJcya0INdB0= +github.com/goccy/go-yaml v1.9.5/go.mod h1:U/jl18uSupI5rdI2jmuCswEA2htH9eXfferR3KfscvA= github.com/godbus/dbus v0.0.0-20151105175453-c7fdd8b5cd55/go.mod h1:/YcGZj5zSblfDWMMoOzV4fas9FZnQYTkDnsGvmh2Grw= github.com/godbus/dbus v0.0.0-20180201030542-885f9cc04c9c/go.mod h1:/YcGZj5zSblfDWMMoOzV4fas9FZnQYTkDnsGvmh2Grw= github.com/godbus/dbus v0.0.0-20190422162347-ade71ed3457e/go.mod h1:bBOAhwG1umN6/6ZUMtDFBMQR8jRg9O75tm9K00oMsK4= @@ -511,14 +528,12 @@ github.com/gogo/googleapis v1.2.0/go.mod h1:Njal3psf3qN6dwBtQfUmBZh2ybovJ0tlu3o/ github.com/gogo/googleapis v1.4.0/go.mod h1:5YRNX2z1oM5gXdAkurHa942MDgEJyk02w4OecKY87+c= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= -github.com/gogo/protobuf v1.2.2-0.20190723190241-65acae22fc9d/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= github.com/gogo/protobuf v1.3.0/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= @@ -577,8 +592,8 @@ github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.6 h1:BKbKCqvP6I+rmFHt06ZmyQtvB8xAkWdhFyr0ZUNZcxQ= github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-containerregistry v0.6.0/go.mod h1:euCCtNbZ6tKqi1E72vwDj2xZcN5ttKpZLfa/wSo5iLw= -github.com/google/go-containerregistry v0.7.0 h1:u0onUUOcyoCDHEiJoyR1R1gx5er1+r06V5DBhUU5ndk= -github.com/google/go-containerregistry v0.7.0/go.mod h1:2zaoelrL0d08gGbpdP3LqyUuBmhWbpD6IOe2s9nLS2k= +github.com/google/go-containerregistry v0.8.0 h1:mtR24eN6rapCN+shds82qFEIWWmg64NPMuyCNT7/Ogc= +github.com/google/go-containerregistry v0.8.0/go.mod h1:wW5v71NHGnQyb4k+gSshjxidrC7lN33MdWEn+Mz9TsI= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/gofuzz v1.1.0 h1:Hsa8mG0dQ46ij8Sl2AYJDUv1oA9/d6Vk+3LG99Oe02g= github.com/google/gofuzz v1.1.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= @@ -603,7 +618,6 @@ github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLe github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 h1:El6M4kTTCOh6aBiKaUGG7oYTSPP8MxqL4YI3kZKwcP4= github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ= -github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.2.0 h1:qJYtXnJRWmpe7m/3XlyhrsLrEURqHRM2kxzoxXqyUDs= @@ -611,10 +625,12 @@ github.com/google/uuid v1.2.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+ github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= github.com/googleapis/gax-go/v2 v2.1.0/go.mod h1:Q3nei7sK6ybPYH7twZdmQpAd1MKb7pfu6SK+H1/DsU0= -github.com/googleapis/gnostic v0.4.1/go.mod h1:LRhVm6pbyptWbWbuZ38d1eyptfvIytN3ir6b65WBswg= +github.com/googleapis/gax-go/v2 v2.1.1/go.mod h1:hddJymUZASv3XPyGkUpKj8pPO47Rmb0eJc8R6ouapiM= github.com/googleapis/gnostic v0.5.1/go.mod h1:6U4PtQXGIEt/Z3h5MAT7FNofLnw9vXk2cUuW7uA/OeU= github.com/googleapis/gnostic v0.5.5 h1:9fHAtK0uDfpveeqqo1hkEZJcFvYXAiCN3UutL8F9xHw= github.com/googleapis/gnostic v0.5.5/go.mod h1:7+EbHbldMins07ALC74bsA81Ovc97DwqyJO1AENw9kA= +github.com/gookit/color v1.4.2 h1:tXy44JFSFkKnELV6WaMo/lLfu/meqITX3iAV52do7lk= +github.com/gookit/color v1.4.2/go.mod h1:fqRyamkC1W8uxl+lxCQxOT09l/vYfZ+QeiX3rKQHCoQ= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gorilla/handlers v0.0.0-20150720190736-60c7bfde3e33/go.mod h1:Qkdc/uu4tH4g6mTK6auzZ766c4CA0Ng8+o/OAirnOIQ= github.com/gorilla/handlers v1.5.1 h1:9lRY6j8DEeeBT10CvO9hGW0gmky0BprnvDI5vfhUHH4= @@ -623,7 +639,6 @@ github.com/gorilla/mux v1.7.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2z github.com/gorilla/mux v1.7.3/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI= github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= -github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/gosuri/uitable v0.0.4 h1:IG2xLKRvErL3uhY6e1BylFzG+aJiwQviDDTfOKeKTpY= @@ -631,29 +646,36 @@ github.com/gosuri/uitable v0.0.4/go.mod h1:tKR86bXuXPZazfOTG1FIzvjIdXzd0mo4Vtn16 github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7 h1:pdN6V1QBWetyv/0+wjACpqVH+eVULgEjkurDLq3goeM= github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= -github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de4/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= github.com/grpc-ecosystem/go-grpc-middleware v1.3.0/go.mod h1:z0ButlSOZa5vEBq9m2m2hlwIgKw+rp3sdCBRoJY+30Y= github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= -github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= github.com/gruntwork-io/go-commons v0.8.0 h1:k/yypwrPqSeYHevLlEDmvmgQzcyTwrlZGRaxEM6G0ro= github.com/gruntwork-io/go-commons v0.8.0/go.mod h1:gtp0yTtIBExIZp7vyIV9I0XQkVwiQZze678hvDXof78= github.com/gruntwork-io/terratest v0.38.2 h1:XgDGMxX+dE8Aw96wI8QH6oIzveej01Yk4bTjt6dtzIU= github.com/gruntwork-io/terratest v0.38.2/go.mod h1:XzW8PL9pAGbLyiBdQ5OiAeWSNpZ/9ycItjYstSS2PV8= github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q= +github.com/hashicorp/consul/api v1.11.0/go.mod h1:XjsvQN+RJGWI2TWy1/kqaE16HrR2J/FWgkYjdZQsX9M= github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= +github.com/hashicorp/consul/sdk v0.8.0/go.mod h1:GBvyrGALthsZObzUGsfgHZQDXjg4lOjagTIwIR1vPms= github.com/hashicorp/errwrap v0.0.0-20141028054710-7554cd9344ce/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= github.com/hashicorp/errwrap v1.0.0 h1:hLrqtEDnRye3+sgx6z4qVLNuviH3MR5aQ0ykNJa/UYA= github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= +github.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= +github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48= +github.com/hashicorp/go-hclog v0.12.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= +github.com/hashicorp/go-hclog v1.0.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= +github.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= github.com/hashicorp/go-multierror v0.0.0-20161216184304-ed905158d874/go.mod h1:JMRHfdO9jKNzS/+BTlxCjKNQHg/jZAft8U7LloJvN7I= github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= github.com/hashicorp/go-multierror v1.1.0 h1:B9UzwGQJehnUY1yNrnwREHc3fGbC2xefo8g4TbElacI= github.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA= +github.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs= github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= +github.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8= github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= @@ -663,14 +685,21 @@ github.com/hashicorp/go-version v1.3.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09 github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90= github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= github.com/hashicorp/hcl/v2 v2.9.1 h1:eOy4gREY0/ZQHNItlfuEZqtcQbXIxzojlP301hDpnac= github.com/hashicorp/hcl/v2 v2.9.1/go.mod h1:FwWsfWEjyV/CMj8s/gqAuiviY72rJ1/oayI9WftqcKg= github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= +github.com/hashicorp/mdns v1.0.1/go.mod h1:4gW7WsVCke5TE7EPeYliwHlRUyBtfCwuFwuMg2DmyNY= +github.com/hashicorp/mdns v1.0.4/go.mod h1:mtBihi+LeNXGtG8L9dX59gAEa12BDtBQSp4v/YAJqrc= github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= +github.com/hashicorp/memberlist v0.2.2/go.mod h1:MS2lj3INKhZjWNqd3N0m3J+Jxf3DAOnAH9VT3Sh9MUE= +github.com/hashicorp/memberlist v0.3.0/go.mod h1:MS2lj3INKhZjWNqd3N0m3J+Jxf3DAOnAH9VT3Sh9MUE= github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= +github.com/hashicorp/serf v0.9.5/go.mod h1:UWDWwZeL5cuWDJdl0C6wrvrUwEqtQ4ZKBKKENpqIUyk= +github.com/hashicorp/serf v0.9.6/go.mod h1:TXZNMjZQijwlDvp+r0b63xZ45H7JmCmgg4gpTwn9UV4= github.com/hashicorp/terraform-json v0.12.0 h1:8czPgEEWWPROStjkWPUnTQDXmpmZPlkQAwYYLETaTvw= github.com/hashicorp/terraform-json v0.12.0/go.mod h1:pmbq9o4EuL43db5+0ogX10Yofv1nozM+wskr/bGFJpI= github.com/hinshun/vt10x v0.0.0-20180616224451-1954e6464174 h1:WlZsjVhE8Af9IcZDGgJGQpNflI3+MJSBhsgT5PCtzBQ= @@ -681,6 +710,7 @@ github.com/huandu/xstrings v1.3.2 h1:L18LIDzqlW6xN2rEkpdV8+oL/IXWJ1APd+vsdYy4Wdw github.com/huandu/xstrings v1.3.2/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE= github.com/iancoleman/orderedmap v0.0.0-20190318233801-ac98e3ecb4b0 h1:i462o439ZjprVSFSZLZxcsoAe592sZB1rci2Z8j4wdk= github.com/iancoleman/orderedmap v0.0.0-20190318233801-ac98e3ecb4b0/go.mod h1:N0Wam8K1arqPXNWjMo21EXnBPOPp36vB07FNRdD2geA= +github.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= @@ -713,9 +743,11 @@ github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFF github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.11 h1:uVUAXhF2To8cbw/3xN3pxj6kk7TYKs98NIrTqPlMWAQ= github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= @@ -753,9 +785,8 @@ github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfn github.com/kr/pretty v0.2.1 h1:Fmg33tUaq4/8ym9TJN1x7sLJnHVwhP33CNkpYV/7rwI= github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/pty v1.1.4 h1:5Myjjh3JY/NaAi4IsUbHADytDyl1VE1Y9PXDlL+P/VQ= github.com/kr/pty v1.1.4/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/kr/pty v1.1.5 h1:hyz3dwM5QLc1Rfoz4FuWJQG5BN7tc6K1MndAUnGpQr4= -github.com/kr/pty v1.1.5/go.mod h1:9r2w37qlBe7rQ6e1fg1S/9xpWHSnaqNdHD3WcMdbPDA= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= @@ -774,6 +805,7 @@ github.com/lib/pq v1.10.0/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= github.com/liggitt/tabwriter v0.0.0-20181228230101-89fcab3d43de h1:9TO3cAIGXtEhnIaL+V+BEER86oLrvS+kWobKpbJuye0= github.com/liggitt/tabwriter v0.0.0-20181228230101-89fcab3d43de/go.mod h1:zAbeS9B/r2mtpb6U+EI2rYA5OAXxsYw6wTamcNW+zcE= github.com/lithammer/dedent v1.1.0/go.mod h1:jrXYCQtgg0nJiN+StA2KgR7w6CiQNv9Fd/Z9BP0jIOc= +github.com/lyft/protoc-gen-star v0.5.3/go.mod h1:V0xaHgaf5oCCqmcxYcWiDfTiKsZsRc87/1qhoTACD8w= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/magiconair/properties v1.8.5/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= @@ -794,22 +826,23 @@ github.com/matryer/is v1.2.0/go.mod h1:2fLPjFQM9rhQ15aVEtbuwhJinnOqrmgXPNdZsdwlW github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= +github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= -github.com/mattn/go-colorable v0.1.11 h1:nQ+aFkoE2TMGc0b68U2OKSexC+eq46+XwZzWXHRmPYs= -github.com/mattn/go-colorable v0.1.11/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= +github.com/mattn/go-colorable v0.1.12 h1:jF+Du6AlPIjs2BiUiQlKOX0rt3SujHxPnksPKZbaA40= +github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= -github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= +github.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84= github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE= github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= github.com/mattn/go-isatty v0.0.14 h1:yVuAays6BHfxijgZPzw+3Zlu5yQgKGP2/hcQbHb7S9Y= github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= github.com/mattn/go-oci8 v0.1.1/go.mod h1:wjDx6Xm9q7dFtHJvIlrI99JytznLw5wQ4R+9mNXJwGI= -github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= github.com/mattn/go-runewidth v0.0.7/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= -github.com/mattn/go-runewidth v0.0.9 h1:Lm995f3rfxdpd6TSmuVCHVb/QhupuXlYr8sCI/QdE+0= github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= +github.com/mattn/go-runewidth v0.0.13 h1:lTGmDsbAYt5DmK6OnoV7EuIF1wEIFAcxld6ypU4OSgU= +github.com/mattn/go-runewidth v0.0.13/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= github.com/mattn/go-shellwords v1.0.3/go.mod h1:3xCvwCdWdlDJUrvuMn7Wuy9eWs4pE8vqg+NOMyg4B2o= github.com/mattn/go-shellwords v1.0.11/go.mod h1:EZzvwXDESEeg03EKmM+RmDnNOPKG4lLtQsUlTZDWQ8Y= github.com/mattn/go-sqlite3 v1.14.6 h1:dNPt6NO46WmLVt2DLNpwczCmdV5boIZ6g/tlDrlRUbg= @@ -825,10 +858,13 @@ github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b/go.mod h1:01TrycV0kFyex github.com/mholt/archiver/v3 v3.5.1 h1:rDjOBX9JSF5BvoJGvjqK479aL70qh9DIpZCl+k7Clwo= github.com/mholt/archiver/v3 v3.5.1/go.mod h1:e3dqJ7H78uzsRSEACH1joayhuSyhnonssnDhppzS1L4= github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= +github.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso= github.com/miekg/dns v1.1.31/go.mod h1:KNUDUusw/aVsxyTYZM1oqvCicbwhgbNgztCETuNZ7xM= +github.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI= github.com/miekg/pkcs11 v1.0.3/go.mod h1:XsNlhZGX73bx86s2hdc/FuaLm2CPZJemRLMA+WTFxgs= github.com/mistifyio/go-zfs v2.1.2-0.20190413222219-f784269be439+incompatible/go.mod h1:8AuVvqP/mXw1px98n46wfvcGfQ4ci2FwoAjKYxuo3Z4= github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= +github.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI= github.com/mitchellh/cli v1.1.2/go.mod h1:6iaV0fGdElS6dPBx0EApTxHrcWvmJphyh2n8YBLPPZ4= github.com/mitchellh/copystructure v1.0.0/go.mod h1:SNtv71yrdKgLRyLFxmLdkAbkKEFWgYaq1OVrnRcwhnw= github.com/mitchellh/copystructure v1.1.1/go.mod h1:EBArHfARyrSWO/+Wyr9zwEkc6XMFB9XyNgFNmRkZZU4= @@ -847,6 +883,8 @@ github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0Qu github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/mitchellh/mapstructure v1.4.3/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/mitchellh/osext v0.0.0-20151018003038-5e2d6d41470f h1:2+myh5ml7lgEU/51gbeLHfKGNfgEQQIWrlbdaOsidbQ= github.com/mitchellh/osext v0.0.0-20151018003038-5e2d6d41470f/go.mod h1:OkQIRizQZAeMln+1tSwduZz7+Af5oFlKirV/MSYes2A= github.com/mitchellh/reflectwalk v1.0.0/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= github.com/mitchellh/reflectwalk v1.0.1/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= @@ -860,15 +898,16 @@ github.com/moby/sys/mountinfo v0.4.0/go.mod h1:rEr8tzG/lsIZHBtN/JjGG+LMYx9eXgW2J github.com/moby/sys/mountinfo v0.4.1 h1:1O+1cHA1aujwEwwVMa2Xm2l+gIpUHyd3+D+d7LZh1kM= github.com/moby/sys/mountinfo v0.4.1/go.mod h1:rEr8tzG/lsIZHBtN/JjGG+LMYx9eXgW2JI+6q0qou+A= github.com/moby/sys/symlink v0.1.0/go.mod h1:GGDODQmbFOjFsXvfLVn3+ZRxkch54RkSiGqsZeMYowQ= -github.com/moby/term v0.0.0-20200312100748-672ec06f55cd/go.mod h1:DdlQx2hp0Ss5/fLikoLlEeIYiATotOjgB//nb973jeo= +github.com/moby/term v0.0.0-20201216013528-df9cb8a40635/go.mod h1:FBS0z0QWA44HXygs7VXDUOGoN/1TV3RuWkLO04am3wc= github.com/moby/term v0.0.0-20210610120745-9d4ed1856297 h1:yH0SvLzcbZxcJXho2yh7CqdENGMQe73Cw3woZBpPli0= github.com/moby/term v0.0.0-20210610120745-9d4ed1856297/go.mod h1:vgPCkQMyxTZ7IDy8SXRufE172gr8+K/JE/7hHFxHW3A= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/modern-go/reflect2 v1.0.1 h1:9f412s+6RmYXLWZSEzVVgPGK7C2PphHj5RJrvfx9AWI= github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= github.com/monochromegane/go-gitignore v0.0.0-20200626010858-205db1a8cc00 h1:n6/2gBQ3RWajuToeY6ZtZTIKv2v7ThUy5KKusIT0yc0= github.com/monochromegane/go-gitignore v0.0.0-20200626010858-205db1a8cc00/go.mod h1:Pm3mSP3c5uWn86xMLZ5Sa7JB9GsEZySvHYXCTK4E9q4= github.com/morikuni/aec v1.0.0 h1:nP9CBfwrvYnBRgY6qfDQkygYDmYwOilePFkwzv4dU8A= @@ -886,7 +925,6 @@ github.com/nwaples/rardecode v1.1.0/go.mod h1:5DzqNKiOdpKKBH87u8VlvAnPZMXcGRhxWk github.com/nxadm/tail v1.4.4 h1:DQuhQpB1tVlglWS2hLQ5OV6B5r8aGxSrPc5Qo6uTN78= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= -github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= github.com/olekukonko/tablewriter v0.0.4/go.mod h1:zq6QwlOf5SlnkVbMSr5EoBv3636FWnp+qbPhuoO21uA= github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= github.com/onsi/ginkgo v0.0.0-20151202141238-7f8ab55aaf3b/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= @@ -894,7 +932,6 @@ github.com/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.10.1/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.10.3/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.11.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= github.com/onsi/ginkgo v1.14.0 h1:2mOpI4JVVPBN+WQRa0WKH2eXR+Ey+uK4n7Zj0aYpIQA= github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= @@ -913,8 +950,8 @@ github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8 github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= github.com/opencontainers/image-spec v1.0.0/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= github.com/opencontainers/image-spec v1.0.1/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= -github.com/opencontainers/image-spec v1.0.2-0.20210730191737-8e42a01fb1b7 h1:axgApq2XShTLwQii2zAnIkMPlhGVHbAXHUcHezu5G/k= -github.com/opencontainers/image-spec v1.0.2-0.20210730191737-8e42a01fb1b7/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= +github.com/opencontainers/image-spec v1.0.2-0.20211117181255-693428a734f5 h1:q37d91F6BO4Jp1UqWiun0dUFYaqv6WsKTLTCaWv+8LY= +github.com/opencontainers/image-spec v1.0.2-0.20211117181255-693428a734f5/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= github.com/opencontainers/runc v0.0.0-20190115041553-12f6a991201f/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= github.com/opencontainers/runc v0.1.1/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= github.com/opencontainers/runc v1.0.0-rc8.0.20190926000215-3e425f80a8c9/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= @@ -941,9 +978,11 @@ github.com/otiai10/mint v1.3.0/go.mod h1:F5AjcsTsWUqX+Na9fpHb52P8pcRX2CI6A3ctIT9 github.com/otiai10/mint v1.3.3 h1:7JgpsBaN0uMkyju4tbYHu0mnM55hNKVYLsXmwr15NQI= github.com/otiai10/mint v1.3.3/go.mod h1:/yxELlJQ0ufhjUwhshSj+wFjZ78CnZ48/1wtmBH1OTc= github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= +github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= github.com/pelletier/go-toml v1.8.1/go.mod h1:T2/BmBdy8dvIRq1a/8aqjN41wvWlN4lrapLU/GW4pbc= github.com/pelletier/go-toml v1.9.3/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= +github.com/pelletier/go-toml v1.9.4/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= github.com/peterbourgon/diskv v2.0.1+incompatible h1:UBdAOUP5p4RWqPBg048CAvpKN+vxiaj6gdUUzhl4XmI= github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= github.com/phayes/freeport v0.0.0-20180830031419-95f893ade6f2 h1:JhzVVoYvbOACxoUmOs6V/G4D5nPVUW73rKvXxP4XUJc= @@ -959,6 +998,7 @@ github.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZ github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= +github.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s= github.com/pquerna/cachecontrol v0.0.0-20171018203845-0dec1b30a021/go.mod h1:prYjPmNq4d1NPVmpShWobRqXY3q7Vp+80DqgxxUrUIA= github.com/pquerna/otp v1.2.0 h1:/A3+Jn+cagqayeR3iHs/L62m5ue7710D35zl1zJ1kok= github.com/pquerna/otp v1.2.0/go.mod h1:dkJfzwRKNiegxyNb54X/3fLwhCynbMspSyWKnvi1AEg= @@ -967,6 +1007,7 @@ github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXP github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= github.com/prometheus/client_golang v1.1.0/go.mod h1:I1FGZT9+L76gKKOs5djB6ezCbFQP1xR9D75/vuwEF3g= +github.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU= github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= github.com/prometheus/client_golang v1.11.0 h1:HNkLOAEQMIDv/K+04rukrLx6ch7msSRwf3/SASFAGtQ= github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= @@ -981,6 +1022,7 @@ github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7q github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.6.0/go.mod h1:eBmuwkDJBwy6iBfxCBob6t6dR6ENT/y+J+Zk0j9GMYc= +github.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4= github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= github.com/prometheus/common v0.26.0 h1:iMAkS2TDoNWnKM+Kopnx/8tnEStIfpYA0ur0xQzzhMQ= github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= @@ -993,10 +1035,17 @@ github.com/prometheus/procfs v0.0.3/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDa github.com/prometheus/procfs v0.0.5/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ= github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= -github.com/prometheus/procfs v0.2.0/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= github.com/prometheus/procfs v0.6.0 h1:mxy4L2jP6qMonqmq+aTtOx1ifVWUgG/TAmntgbh3xv4= github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= +github.com/pterm/pterm v0.12.27/go.mod h1:PhQ89w4i95rhgE+xedAoqous6K9X+r6aSOI2eFF7DZI= +github.com/pterm/pterm v0.12.29/go.mod h1:WI3qxgvoQFFGKGjGnJR849gU0TsEOvKn5Q8LlY1U7lg= +github.com/pterm/pterm v0.12.30/go.mod h1:MOqLIyMOgmTDz9yorcYbcw+HsgoZo3BQfg2wtl3HEFE= +github.com/pterm/pterm v0.12.31/go.mod h1:32ZAWZVXD7ZfG0s8qqHXePte42kdz8ECtRyEejaWgXU= +github.com/pterm/pterm v0.12.33 h1:XiT50Pvdqn5O8FAiIqZMpXP6NkVEcmlUa+mkA1yWVCg= +github.com/pterm/pterm v0.12.33/go.mod h1:x+h2uL+n7CP/rel9+bImHD5lF3nM9vJj80k9ybiiTTE= +github.com/rivo/uniseg v0.2.0 h1:S1pD9weZBuJdFmowNwbpi7BJ8TNftyUImj/0WQi72jY= +github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= github.com/rogpeppe/go-charset v0.0.0-20180617210344-2471d30d28b4/go.mod h1:qgYeAmZ5ZIpBWTGllZSQnw97Dj+woV0toclVaRGI8pc= @@ -1011,6 +1060,7 @@ github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= github.com/safchain/ethtool v0.0.0-20190326074333-42ed695e3de8/go.mod h1:Z0q5wiBQGYcxhMZ6gUqHn6pYNLypFAvaL3UvgZLR0U4= +github.com/sagikazarmark/crypt v0.3.0/go.mod h1:uD/D+6UF4SrIR1uGEv7bBNkNqLGqUr43MRiaGWX1Nig= github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= github.com/sebdah/goldie v1.0.0/go.mod h1:jXP4hmWywNEwZzhMuv2ccnqTSFpuq8iyQhtQdkkZBH4= @@ -1038,22 +1088,24 @@ github.com/soheilhy/cmux v0.1.5/go.mod h1:T7TcVDs9LWfQgPlPsdngu6I6QIoyIFZDDC6sNE github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= +github.com/spf13/afero v1.3.3/go.mod h1:5KUK8ByomD5Ti5Artl0RtHeI5pTF7MIDuXL3yY520V4= github.com/spf13/afero v1.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I= github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= -github.com/spf13/cast v1.3.1 h1:nFm6S0SMdyzrzcmThSipiEubIDy8WEXKNZ0UOgiRpng= github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= +github.com/spf13/cast v1.4.1 h1:s0hze+J0196ZfEMTs80N7UlFt0BDuQ7Q+JDnHiMWKdA= +github.com/spf13/cast v1.4.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= github.com/spf13/cobra v0.0.2-0.20171109065643-2da4a54c5cee/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= github.com/spf13/cobra v0.0.6/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE= github.com/spf13/cobra v1.0.0/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE= github.com/spf13/cobra v1.1.3/go.mod h1:pGADOWyqRD/YMrPZigI/zbliZ2wVD/23d+is3pSWzOo= -github.com/spf13/cobra v1.2.1 h1:+KmjbUw1hriSNMF55oPrkZcb27aECyrj8V2ytv7kWDw= github.com/spf13/cobra v1.2.1/go.mod h1:ExllRjgxM/piMAM+3tAZvg8fsklGAf3tPfi+i8t68Nk= +github.com/spf13/cobra v1.3.0 h1:R7cSvGu+Vv+qX0gW5R/85dx2kmmJT5z5NM8ifdYjdn0= +github.com/spf13/cobra v1.3.0/go.mod h1:BrRVncBjOJa/eUcVVm9CE+oC6as8k+VYr4NY7WCi9V4= github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= github.com/spf13/pflag v0.0.0-20170130214245-9ff6c6923cff/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.1-0.20171106142849-4c012f6dcd95/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -github.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.2/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= @@ -1061,6 +1113,7 @@ github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE= github.com/spf13/viper v1.7.0/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= github.com/spf13/viper v1.8.1/go.mod h1:o0Pch8wJ9BVSWGQMbra6iw0oQ5oktSIBaujf1rJH9Ns= +github.com/spf13/viper v1.10.0/go.mod h1:SoyBPwAtKDzypXNDFKN5kzH7ppppbGZtls1UpIy5AsM= github.com/stefanberger/go-pkcs11uri v0.0.0-20201008174630-78d3cae3a980/go.mod h1:AO3tvPzVZ/ayst6UlUKUv6rcPQInYe3IknH3jYhAKu8= github.com/stoewer/go-strcase v1.2.0/go.mod h1:IBiWB2sKIp3wVVQ3Y035++gc+knqhUQag1KpM8ahLw8= github.com/stretchr/objx v0.0.0-20180129172003-8a3f7159479f/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= @@ -1083,17 +1136,16 @@ github.com/syndtr/gocapability v0.0.0-20170704070218-db04d3cc01c8/go.mod h1:hkRG github.com/syndtr/gocapability v0.0.0-20180916011248-d98352740cb2/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= github.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= github.com/tchap/go-patricia v2.2.6+incompatible/go.mod h1:bmLyhP68RS6kStMGxByiQ23RP/odRBOTVjwp2cDyi6I= -github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= github.com/tmc/grpc-websocket-proxy v0.0.0-20201229170055-e5319fda7802/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= github.com/tmccombs/hcl2json v0.3.3 h1:+DLNYqpWE0CsOQiEZu+OZm5ZBImake3wtITYxQ8uLFQ= github.com/tmccombs/hcl2json v0.3.3/go.mod h1:Y2chtz2x9bAeRTvSibVRVgbLJhLJXKlUeIvjeVdnm4w= +github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM= github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= github.com/ulikunitz/xz v0.5.8/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14= github.com/ulikunitz/xz v0.5.9 h1:RsKRIA2MO8x56wkkcd3LbtcE/uMszhb6DpRf+3uwa3I= github.com/ulikunitz/xz v0.5.9/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14= github.com/urfave/cli v0.0.0-20171014202726-7bc6a0acffa5/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= -github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= github.com/urfave/cli v1.22.2/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= github.com/urfave/cli v1.22.4 h1:u7tSpNPPswAFymm8IehJhy4uJMlUuU/GmqSkvJ1InXA= @@ -1125,12 +1177,15 @@ github.com/xi2/xz v0.0.0-20171230120015-48954b6210f8/go.mod h1:HUYIGzjTL3rfEspMx github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= github.com/xlab/treeprint v0.0.0-20181112141820-a009c3971eca h1:1CFlNzQhALwjS9mBAUkycX616GzgsuYUOCHA5+HSlXI= github.com/xlab/treeprint v0.0.0-20181112141820-a009c3971eca/go.mod h1:ce1O1j6UtZfjr22oyGxGLbauSBp2YVXpARAosm7dHBg= +github.com/xo/terminfo v0.0.0-20210125001918-ca9a967f8778 h1:QldyIu/L63oPpyvQmHgvgickp1Yw510KJOqX7H24mg8= +github.com/xo/terminfo v0.0.0-20210125001918-ca9a967f8778/go.mod h1:2MuV+tbUrU1zIOPMxZ5EncGwgmMJsa+9ucAQZXxsObs= github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= github.com/yvasiyarov/go-metrics v0.0.0-20140926110328-57bccd1ccd43 h1:+lm10QQTNSBd8DVTNGHx7o/IKu9HYDvLMffDhbyLccI= github.com/yvasiyarov/go-metrics v0.0.0-20140926110328-57bccd1ccd43/go.mod h1:aX5oPXxHm3bOH+xeAttToC8pqch2ScQN/JoXYupl6xs= github.com/yvasiyarov/gorelic v0.0.0-20141212073537-a9bba5b9ab50 h1:hlE8//ciYMztlGpl/VA+Zm1AcTPHYkHJPbHqE6WJUXE= @@ -1149,10 +1204,12 @@ go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= go.etcd.io/bbolt v1.3.5/go.mod h1:G5EMThwa9y8QZGBClrRx5EY+Yw9kAhnjy3bSjsnlVTQ= go.etcd.io/bbolt v1.3.6/go.mod h1:qXsaaIqmgQH0T+OPdb99Bf+PKfBBQVAdyD6TY9G8XM4= -go.etcd.io/etcd v0.5.0-alpha.5.0.20200910180754-dd1b699fc489/go.mod h1:yVHk9ub3CSBatqGNg7GRmsnfLWtoW60w4eDYfh7vHDg= go.etcd.io/etcd/api/v3 v3.5.0/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs= +go.etcd.io/etcd/api/v3 v3.5.1/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs= go.etcd.io/etcd/client/pkg/v3 v3.5.0/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= +go.etcd.io/etcd/client/pkg/v3 v3.5.1/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= go.etcd.io/etcd/client/v2 v2.305.0/go.mod h1:h9puh54ZTgAKtEbut2oe9P4L/oqKCVB6xsXlzd7alYQ= +go.etcd.io/etcd/client/v2 v2.305.1/go.mod h1:pMEacxZW7o8pg4CrFE7pquyCJJzZvkvdD2RibOCCCGs= go.etcd.io/etcd/client/v3 v3.5.0/go.mod h1:AIKXXVX/DQXtfTEqBryiLTUXwON+GuvO6Z7lLS/oTh0= go.etcd.io/etcd/pkg/v3 v3.5.0/go.mod h1:UzJGatBQ1lXChBkQF0AuAtkRQMYnHubxAEYIrC3MSsE= go.etcd.io/etcd/raft/v3 v3.5.0/go.mod h1:UFOHSIvO/nKwd4lhkwabrTD3cqW5yVyYYf/KlD00Szc= @@ -1180,7 +1237,6 @@ go.opentelemetry.io/otel/trace v0.20.0/go.mod h1:6GjCW8zgDjwGHGa6GkyeB8+/5vjT16g go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= go.starlark.net v0.0.0-20200306205701-8dd3e2ee1dd5 h1:+FNtrFTmVw0YZGpBGX56XDee331t6JAXeK2bcyhLOOc= go.starlark.net v0.0.0-20200306205701-8dd3e2ee1dd5/go.mod h1:nmDLcffg48OtT/PSW0Hg7FvpRQsQh5OSqIylirxKC7o= -go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= @@ -1199,9 +1255,9 @@ golang.org/x/crypto v0.0.0-20190426145343-a29dc8fdc734/go.mod h1:yigFU9vqHzYiE8U golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190530122614-20be4c3c3ed5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191122220453-ac88ee75c92c/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200128174031-69ecbb4d6d5d/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= @@ -1214,8 +1270,9 @@ golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83/go.mod h1:jdWPYTVW3xRLrWP golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20210513164829-c07d793c2f9a/go.mod h1:P+XmwS30IXTQdn5tA2iutPOUgjI07+tq3H3K9MVA1s8= -golang.org/x/crypto v0.0.0-20211202192323-5770296d904e h1:MUP6MR3rJ7Gk9LEia0LP2ytiH6MuCfs7qYz+47jGdD8= -golang.org/x/crypto v0.0.0-20211202192323-5770296d904e/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.0.0-20210817164053-32db794688a5/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20211215165025-cf75a172585e h1:1SzTfNOXwIS2oWiMF+6qu0OUDKb0dauo6MoDUQyu+yU= +golang.org/x/crypto v0.0.0-20211215165025-cf75a172585e/go.mod h1:P+XmwS30IXTQdn5tA2iutPOUgjI07+tq3H3K9MVA1s8= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= @@ -1251,6 +1308,8 @@ golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.5.0/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= +golang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180811021610-c39426892332/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -1273,7 +1332,6 @@ golang.org/x/net v0.0.0-20190619014844-b5b0513f8c1b/go.mod h1:z5CRVTTTmAJ677TzLL golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20191004110552-13f9640d40b9/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= @@ -1304,13 +1362,15 @@ golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= golang.org/x/net v0.0.0-20210326060303-6b1517762897/go.mod h1:uSPa2vr4CLtc/ILN5odXGNXS6mhrKVzTaCXzk9m6W3k= golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= +golang.org/x/net v0.0.0-20210410081132-afb366fc7cd1/go.mod h1:9tjilg8BloeKEkVJvy7fQ90B1CfIiPueXVOjqfkSzI8= golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20210520170846-37e1c6afe023/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210614182718-04defd469f4e/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211111160137-58aab5ef257a/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2 h1:CIJ76btIcR3eFI5EgSo6k1qKw9KJexJuRLI9G7Hp5wE= -golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20210813160813-60bc85c4be6d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20211209124913-491a49abca63/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20211216030914-fe4d6282115f h1:hEYJvxw1lSnWIl8X9ofsYMklzaDs90JI2az5YMd4fPM= +golang.org/x/net v0.0.0-20211216030914-fe4d6282115f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -1327,6 +1387,7 @@ golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ golang.org/x/oauth2 v0.0.0-20210628180205-a41e5a781914/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210805134026-6f1e6394065a/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20211005180243-6b3c2da341f1/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8 h1:RerP+noqYHUQ8CMRcPlC2nvTa4dcBIjegkuWdcUDuqg= golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -1366,13 +1427,14 @@ golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190801041406-cbf593c0f2f3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190812073006-9eafafc0a87e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191002063906-3421d5a6bb1c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191022100944-742c48ecaeb7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191115151921-52ab43148777/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -1411,7 +1473,6 @@ golang.org/x/sys v0.0.0-20200916030750-2334cc1a136f/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200922070232-aee5d888a860/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200923182605-d9f96fdee20d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201112073958-5cba982894dd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201117170446-d9b008d0a637/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -1420,6 +1481,7 @@ golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -1437,16 +1499,24 @@ golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210816183151-1e6c022a8912/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210908233432-aa78b53d3365/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211110154304-99a53858aa08 h1:WecRHqgE09JBkh/584XIE6PMz5KKE/vER4izNUi30AQ= -golang.org/x/sys v0.0.0-20211110154304-99a53858aa08/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211013075003-97ac67df715c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211124211545-fe61309f8881/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211205182925-97ca703d548d/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e h1:fLOSk5Q00efkSvAm+4xcoXD+RRmLmmulPn5I3Y9F2EM= +golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210220032956-6a3ed077a48d/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/term v0.0.0-20210503060354-a79de5458b56 h1:b8jxX3zqjpqb2LklXPzKSGJhzyxCOZSz8ncv8Nv+y7w= golang.org/x/term v0.0.0-20210503060354-a79de5458b56/go.mod h1:tfny5GFUkzUvx4ps4ajbZsCe5lw1metzhBm9T3x7oIY= +golang.org/x/term v0.0.0-20210615171337-6886f2dfbf5b/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.0.0-20210927222741-03fcf44c2211 h1:JGgROgKl9N8DuW20oFS5gxc+lE67/N3FcwmBPMe7ArY= +golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -1454,13 +1524,12 @@ golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.6 h1:aRYxNxv6iGQlyVaZmk6ZgYEDa+Jg18DxebPSrd6bg1M= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk= +golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20200630173020-3af7569d3a1e/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20210723032227-1f47c861a9ac h1:7zkz7BUtwNFFqcowJ+RIgu2MaV/MapERkDIy+mwPyjs= golang.org/x/time v0.0.0-20210723032227-1f47c861a9ac/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= @@ -1477,11 +1546,11 @@ golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBn golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190614205625-5aca471b1d59/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190624222133-a101b041ded4/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191108193012-7d206e10da11/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= @@ -1527,6 +1596,7 @@ golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.8/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -1561,7 +1631,11 @@ google.golang.org/api v0.50.0/go.mod h1:4bNT5pAuq5ji4SRZm+5QIkjny9JAyVD/3gaSihNe google.golang.org/api v0.51.0/go.mod h1:t4HdrdoNgyN5cbEfm7Lum0lcLDLiise1F8qDKX00sOU= google.golang.org/api v0.54.0/go.mod h1:7C4bFFOvVDGXjfDTAsgGwDgAxRDeQ4X8NvUedIt6z3k= google.golang.org/api v0.55.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= +google.golang.org/api v0.56.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= google.golang.org/api v0.57.0/go.mod h1:dVPlbZyBo2/OjBpmvNdpn2GRm6rPy75jyU7bmhdrMgI= +google.golang.org/api v0.59.0/go.mod h1:sT2boj7M9YJxZzgeZqXogmhfmRWDtPzT31xkieUbuZU= +google.golang.org/api v0.61.0/go.mod h1:xQRti5UdCmoCEqFxcz93fTl338AVqDgyaDRuOZ3hg9I= +google.golang.org/api v0.62.0/go.mod h1:dKmwPCydfsad4qCH08MSdgWjfHOyfpd4VtDGgRFdavw= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= @@ -1607,7 +1681,6 @@ google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6D google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20201019141844-1ed22bb0c154/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201110150050-8816d57aaa9a/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= @@ -1630,9 +1703,16 @@ google.golang.org/genproto v0.0.0-20210821163610-241b8fcbd6c8/go.mod h1:eFjDcFEc google.golang.org/genproto v0.0.0-20210828152312-66f60bf46e71/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= google.golang.org/genproto v0.0.0-20210831024726-fe130286e0e2/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= google.golang.org/genproto v0.0.0-20210903162649-d08c68adba83/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210909211513-a8c4777a87af/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= google.golang.org/genproto v0.0.0-20210924002016-3dee208752a0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211111162719-482062a4217b h1:qvEQEwKjZRAg6rjY/jqfJ7T8/w/D7jTIFJGcaSka96k= -google.golang.org/genproto v0.0.0-20211111162719-482062a4217b/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211008145708-270636b82663/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211028162531-8db9c33dc351/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211118181313-81c1377c94b1/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211129164237-f09f9a12af12/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211203200212-54befc351ae9/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211206160659-862468c7d6e0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211208223120-3a66f561d7aa h1:I0YcKz0I7OAhddo7ya8kMnvprhcWM045PmkBdMO9zN0= +google.golang.org/genproto v0.0.0-20211208223120-3a66f561d7aa/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= google.golang.org/grpc v0.0.0-20160317175043-d3ddb4469d5a/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= @@ -1662,8 +1742,10 @@ google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQ google.golang.org/grpc v1.39.0/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= google.golang.org/grpc v1.39.1/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= -google.golang.org/grpc v1.42.0 h1:XT2/MFpuPFsEX2fWh3YQtHkZ+WYZFQRfaUgLZYj/p6A= +google.golang.org/grpc v1.40.1/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= google.golang.org/grpc v1.42.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= +google.golang.org/grpc v1.43.0 h1:Eeu7bZtDZ2DpRCsLhUlcrLnvYaMK1Gz86a+hMVvELmM= +google.golang.org/grpc v1.43.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= @@ -1688,7 +1770,6 @@ gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8 gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= -gopkg.in/cheggaaa/pb.v1 v1.0.25/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= gopkg.in/gemnasium/logrus-airbrake-hook.v2 v2.1.2/go.mod h1:Xk6kEKp8OKb+X14hQBKWaSkCsqBpgog8nAV2xsGOxlo= @@ -1698,6 +1779,7 @@ gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/ini.v1 v1.62.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/ini.v1 v1.66.2/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k= gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= gopkg.in/square/go-jose.v2 v2.2.2/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= @@ -1735,56 +1817,38 @@ honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWh honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -k8s.io/api v0.20.1/go.mod h1:KqwcCVogGxQY3nBlRpwt+wpAMF/KjaCc7RpywacvqUo= -k8s.io/api v0.20.4/go.mod h1:++lNL1AJMkDymriNniQsWRkMDzRaX2Y/POTUi8yvqYQ= -k8s.io/api v0.20.6/go.mod h1:X9e8Qag6JV/bL5G6bU8sdVRltWKmdHsFUGS3eVndqE8= -k8s.io/api v0.22.4 h1:UvyHW0ezB2oIgHAxlYoo6UJQObYXU7awuNarwoHEOjw= -k8s.io/api v0.22.4/go.mod h1:Rgs+9gIGYC5laXQSZZ9JqT5NevNgoGiOdVWi1BAB3qk= -k8s.io/apiextensions-apiserver v0.22.4 h1:2iGpcVyw4MnAyyXVJU2Xg6ZsbIxAOfRHo0LF5A5J0RA= -k8s.io/apiextensions-apiserver v0.22.4/go.mod h1:kH9lxD8dbJ+k0ZizGET55lFgdGjO8t45fgZnCVdZEpw= -k8s.io/apimachinery v0.20.1/go.mod h1:WlLqWAHZGg07AeltaI0MV5uk1Omp8xaN0JGLY6gkRpU= -k8s.io/apimachinery v0.20.4/go.mod h1:WlLqWAHZGg07AeltaI0MV5uk1Omp8xaN0JGLY6gkRpU= -k8s.io/apimachinery v0.20.6/go.mod h1:ejZXtW1Ra6V1O5H8xPBGz+T3+4gfkTCeExAHKU57MAc= -k8s.io/apimachinery v0.22.4 h1:9uwcvPpukBw/Ri0EUmWz+49cnFtaoiyEhQTK+xOe7Ck= -k8s.io/apimachinery v0.22.4/go.mod h1:yU6oA6Gnax9RrxGzVvPFFJ+mpnW6PBSqp0sx0I0HHW0= -k8s.io/apiserver v0.20.1/go.mod h1:ro5QHeQkgMS7ZGpvf4tSMx6bBOgPfE+f52KwvXfScaU= -k8s.io/apiserver v0.20.4/go.mod h1:Mc80thBKOyy7tbvFtB4kJv1kbdD0eIH8k8vianJcbFM= -k8s.io/apiserver v0.20.6/go.mod h1:QIJXNt6i6JB+0YQRNcS0hdRHJlMhflFmsBDeSgT1r8Q= -k8s.io/apiserver v0.22.4 h1:L+220cy+94UWmyBl1kiVTklBXrBtKsbjlPV60eL2u6s= -k8s.io/apiserver v0.22.4/go.mod h1:38WmcUZiiy41A7Aty8/VorWRa8vDGqoUzDf2XYlku0E= -k8s.io/cli-runtime v0.22.4 h1:uFSVSdW14JP53BCtMRsw1hB9ba21TBuUb5m7RvEsH0Y= -k8s.io/cli-runtime v0.22.4/go.mod h1:x35r0ERHXr/MrbR1C6MPJxQ3xKG6+hXi9m2xLzlMPZA= -k8s.io/client-go v0.20.1/go.mod h1:/zcHdt1TeWSd5HoUe6elJmHSQ6uLLgp4bIJHVEuy+/Y= -k8s.io/client-go v0.20.4/go.mod h1:LiMv25ND1gLUdBeYxBIwKpkSC5IsozMMmOOeSJboP+k= -k8s.io/client-go v0.20.6/go.mod h1:nNQMnOvEUEsOzRRFIIkdmYOjAZrC8bgq0ExboWSU1I0= -k8s.io/client-go v0.22.4 h1:aAQ1Wk+I3bjCNk35YWUqbaueqrIonkfDPJSPDDe8Kfg= -k8s.io/client-go v0.22.4/go.mod h1:Yzw4e5e7h1LNHA4uqnMVrpEpUs1hJOiuBsJKIlRCHDA= -k8s.io/code-generator v0.22.4/go.mod h1:qjYl54pQ/emhkT0UxbufbREYJMWsHNNV/jSVwhYZQGw= -k8s.io/component-base v0.20.1/go.mod h1:guxkoJnNoh8LNrbtiQOlyp2Y2XFCZQmrcg2n/DeYNLk= -k8s.io/component-base v0.20.4/go.mod h1:t4p9EdiagbVCJKrQ1RsA5/V4rFQNDfRlevJajlGwgjI= -k8s.io/component-base v0.20.6/go.mod h1:6f1MPBAeI+mvuts3sIdtpjljHWBQ2cIy38oBIWMYnrM= -k8s.io/component-base v0.22.4 h1:7qwLJnua2ppGNZrRGDQ0vhsFebI39VGbZ4zdR5ArViI= -k8s.io/component-base v0.22.4/go.mod h1:MrSaQy4a3tFVViff8TZL6JHYSewNCLshZCwHYM58v5A= -k8s.io/component-helpers v0.22.4/go.mod h1:A50qTyczDFbhZDifIfS2zFrHuPk9UNOWPpvNZ+3RSIs= -k8s.io/cri-api v0.17.3/go.mod h1:X1sbHmuXhwaHs9xxYffLqJogVsnI+f6cPRcgPel7ywM= -k8s.io/cri-api v0.20.1/go.mod h1:2JRbKt+BFLTjtrILYVqQK5jqhI+XNdF6UiGMgczeBCI= -k8s.io/cri-api v0.20.4/go.mod h1:2JRbKt+BFLTjtrILYVqQK5jqhI+XNdF6UiGMgczeBCI= -k8s.io/cri-api v0.20.6/go.mod h1:ew44AjNXwyn1s0U4xCKGodU7J1HzBeZ1MpGrpa5r8Yc= +k8s.io/api v0.22.5 h1:xk7C+rMjF/EGELiD560jdmwzrB788mfcHiNbMQLIVI8= +k8s.io/api v0.22.5/go.mod h1:mEhXyLaSD1qTOf40rRiKXkc+2iCem09rWLlFwhCEiAs= +k8s.io/apiextensions-apiserver v0.22.5 h1:ML0QqT7FIlmZHN+9+2EtARJ3cJVHeoizt6GCteFRE0o= +k8s.io/apiextensions-apiserver v0.22.5/go.mod h1:tIXeZ0BrDxUb1PoAz+tgOz43Zi1Bp4BEEqVtUccMJbE= +k8s.io/apimachinery v0.22.5 h1:cIPwldOYm1Slq9VLBRPtEYpyhjIm1C6aAMAoENuvN9s= +k8s.io/apimachinery v0.22.5/go.mod h1:xziclGKwuuJ2RM5/rSFQSYAj0zdbci3DH8kj+WvyN0U= +k8s.io/apiserver v0.22.5 h1:71krQxCUz218ecb+nPhfDsNB6QgP1/4EMvi1a2uYBlg= +k8s.io/apiserver v0.22.5/go.mod h1:s2WbtgZAkTKt679sYtSudEQrTGWUSQAPe6MupLnlmaQ= +k8s.io/cli-runtime v0.22.5 h1:bZqLgx1INiPgXyMk/Hu3o5NFmdfvlvtsoE+wHJuKA2U= +k8s.io/cli-runtime v0.22.5/go.mod h1:12ah4O0kaevIYHsRcFGt8RKER0wlTN2yCgHp1c4Uxp4= +k8s.io/client-go v0.22.5 h1:I8Zn/UqIdi2r02aZmhaJ1hqMxcpfJ3t5VqvHtctHYFo= +k8s.io/client-go v0.22.5/go.mod h1:cs6yf/61q2T1SdQL5Rdcjg9J1ElXSwbjSrW2vFImM4Y= +k8s.io/code-generator v0.22.5/go.mod h1:sbdWCOVob+KaQ5O7xs8PNNaCTpbWVqNgA6EPwLOmRNk= +k8s.io/component-base v0.22.5 h1:U0eHqZm7mAFE42hFwYhY6ze/MmVaW00JpMrzVsQmzYE= +k8s.io/component-base v0.22.5/go.mod h1:VK3I+TjuF9eaa+Ln67dKxhGar5ynVbwnGrUiNF4MqCI= +k8s.io/component-helpers v0.22.5/go.mod h1:UK4H16PcV6pTInkhAOfkPbN/aXHPXPX2/ZI4lfCXH4I= +k8s.io/cri-api v0.22.5/go.mod h1:uAw9CICQq20/1yB4ZnWT2TjJyMMROl4typFfWaURLwQ= k8s.io/gengo v0.0.0-20200413195148-3a45101e95ac/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= k8s.io/gengo v0.0.0-20201214224949-b6c5ce23f027/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E= k8s.io/klog/v2 v2.0.0/go.mod h1:PBfzABfn139FHAV07az/IF9Wp1bkk3vpT2XSJ76fSDE= k8s.io/klog/v2 v2.2.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y= k8s.io/klog/v2 v2.4.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y= -k8s.io/klog/v2 v2.9.0 h1:D7HV+n1V57XeZ0m6tdRkfknthUaM06VFbWldOFh8kzM= k8s.io/klog/v2 v2.9.0/go.mod h1:hy9LJ/NvuK+iVyP4Ehqva4HxZG/oXyIS3n3Jmire4Ec= -k8s.io/kube-openapi v0.0.0-20201113171705-d219536bb9fd/go.mod h1:WOJ3KddDSol4tAGcJo0Tvi+dK12EcqSLqcWsryKMpfM= +k8s.io/klog/v2 v2.40.1 h1:P4RRucWk/lFOlDdkAr3mc7iWFkgKrZY9qZMAgek06S4= +k8s.io/klog/v2 v2.40.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= k8s.io/kube-openapi v0.0.0-20210421082810-95288971da7e/go.mod h1:vHXdDvt9+2spS2Rx9ql3I8tycm3H9FDfdUoIuKCefvw= k8s.io/kube-openapi v0.0.0-20211109043538-20434351676c h1:jvamsI1tn9V0S8jicyX82qaFC0H/NKxv2e5mbqsgR80= k8s.io/kube-openapi v0.0.0-20211109043538-20434351676c/go.mod h1:vHXdDvt9+2spS2Rx9ql3I8tycm3H9FDfdUoIuKCefvw= -k8s.io/kubectl v0.22.4 h1:ECUO1QWyZ70DiIKEfgBx+8i9D98uspVOwgc1APs/07w= -k8s.io/kubectl v0.22.4/go.mod h1:ok2qRT6y2Gy4+y+mniJVyUMKeBHP4OWS9Rdtf/QTM5I= +k8s.io/kubectl v0.22.5 h1:diivOcs6dyDjpBqOpy9iiI3srZnW1khJDWwsFSapFt8= +k8s.io/kubectl v0.22.5/go.mod h1:uwKSKhaC6HOwnbk1cVLxVPYwfvazj9x06oZAOsL43N8= k8s.io/kubernetes v1.13.0/go.mod h1:ocZa8+6APFNC2tX1DZASIbocyYT5jHzqFVsY5aoB7Jk= -k8s.io/metrics v0.22.4/go.mod h1:6F/iwuYb1w2QDCoHkeMFLf4pwHBcYKLm4mPtVHKYrIw= +k8s.io/metrics v0.22.5/go.mod h1:dCqOkoZQWLSfBhUtPFMiDrzJaPtXJlVePVuJbEx0hW8= k8s.io/utils v0.0.0-20201110183641-67b214c5f920/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= k8s.io/utils v0.0.0-20210819203725-bdf08cb9a70a h1:8dYfu/Fc9Gz2rNJKB9IQRGgQOh2clmRzNIPPY1xLY5g= k8s.io/utils v0.0.0-20210819203725-bdf08cb9a70a/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= @@ -1795,8 +1859,6 @@ rsc.io/letsencrypt v0.0.3 h1:H7xDfhkaFFSYEJlKeq38RwX2jYcnTeHuDQyT+mMNMwM= rsc.io/letsencrypt v0.0.3/go.mod h1:buyQKZ6IXrRnB7TdkHP0RyEybLx18HHyOSoTyoOLqNY= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= -sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.14/go.mod h1:LEScyzhFmoF5pso/YSeBstl57mOzx9xlU9n85RGrDQg= -sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.15/go.mod h1:LEScyzhFmoF5pso/YSeBstl57mOzx9xlU9n85RGrDQg= sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.22/go.mod h1:LEScyzhFmoF5pso/YSeBstl57mOzx9xlU9n85RGrDQg= sigs.k8s.io/kustomize/api v0.8.11 h1:LzQzlq6Z023b+mBtc6v72N2mSHYmN8x7ssgbf/hv0H8= sigs.k8s.io/kustomize/api v0.8.11/go.mod h1:a77Ls36JdfCWojpUqR6m60pdGY1AYFix4AH83nJtY1g= @@ -1805,9 +1867,7 @@ sigs.k8s.io/kustomize/kustomize/v4 v4.2.0/go.mod h1:MOkR6fmhwG7hEDRXBYELTi5GSFcL sigs.k8s.io/kustomize/kyaml v0.11.0 h1:9KhiCPKaVyuPcgOLJXkvytOvjMJLoxpjodiycb4gHsA= sigs.k8s.io/kustomize/kyaml v0.11.0/go.mod h1:GNMwjim4Ypgp/MueD3zXHLRJEjz7RvtPae0AwlvEMFM= sigs.k8s.io/structured-merge-diff/v4 v4.0.2/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= -sigs.k8s.io/structured-merge-diff/v4 v4.0.3/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= sigs.k8s.io/structured-merge-diff/v4 v4.1.2 h1:Hr/htKFmJEbtMgS/UD0N+gtgctAqz81t3nu+sPzynno= sigs.k8s.io/structured-merge-diff/v4 v4.1.2/go.mod h1:j/nl6xW8vLS49O8YvXW1ocPhZawJtm+Yrr7PPRQ0Vg4= -sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= sigs.k8s.io/yaml v1.2.0 h1:kr/MCeFWJWTwyaHoR9c8EjH9OumOmoF9YGiZd7lFm/Q= sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= diff --git a/kind.yaml b/kind.yaml new file mode 100644 index 0000000000..b107ec3e0f --- /dev/null +++ b/kind.yaml @@ -0,0 +1,7 @@ +kind: Cluster +apiVersion: kind.x-k8s.io/v1alpha4 +name: zarf-test-cluster +nodes: + - role: control-plane + - role: worker + - role: worker diff --git a/zarf.schema.json b/zarf.schema.json index 84a7ffcace..12cc39364f 100644 --- a/zarf.schema.json +++ b/zarf.schema.json @@ -30,7 +30,8 @@ "required": [ "name", "url", - "version" + "version", + "namespace" ], "properties": { "name": { @@ -41,6 +42,18 @@ }, "version": { "type": "string" + }, + "namespace": { + "type": "string" + }, + "valuesFiles": { + "items": { + "type": "string" + }, + "type": "array" + }, + "gitPath": { + "type": "string" } }, "additionalProperties": false, @@ -70,19 +83,23 @@ }, "type": "array" }, - "manifests": { - "type": "string" - }, - "images": { + "charts": { "items": { - "type": "string" + "$schema": "http://json-schema.org/draft-04/schema#", + "$ref": "#/definitions/ZarfChart" }, "type": "array" }, - "charts": { + "manifests": { "items": { "$schema": "http://json-schema.org/draft-04/schema#", - "$ref": "#/definitions/ZarfChart" + "$ref": "#/definitions/ZarfManifest" + }, + "type": "array" + }, + "images": { + "items": { + "type": "string" }, "type": "array" }, @@ -184,15 +201,38 @@ "type": "string" }, "type": "array" + } + }, + "additionalProperties": false, + "type": "object" + }, + "ZarfManifest": { + "required": [ + "name", + "files" + ], + "properties": { + "name": { + "type": "string" }, - "template": { - "type": "boolean" + "namespace": { + "type": "string" + }, + "files": { + "items": { + "type": "string" + }, + "type": "array" } }, "additionalProperties": false, "type": "object" }, "ZarfMetadata": { + "required": [ + "url:omitempty", + "image:omitempty" + ], "properties": { "name": { "type": "string" @@ -203,6 +243,12 @@ "version": { "type": "string" }, + "url:omitempty": { + "type": "string" + }, + "image:omitempty": { + "type": "string" + }, "uncompressed": { "type": "boolean" } @@ -236,6 +282,12 @@ "$ref": "#/definitions/ZarfComponent" }, "type": "array" + }, + "seed": { + "items": { + "type": "string" + }, + "type": "array" } }, "additionalProperties": false, diff --git a/zarf.yaml b/zarf.yaml index e299e7a708..2839112e0f 100644 --- a/zarf.yaml +++ b/zarf.yaml @@ -1,14 +1,35 @@ kind: ZarfInitConfig +seed: + - library/registry:2.7.1 + components: + - name: management + description: "Add the K9s terminal-based K8s UI for cluster management" + default: true + files: + # The zarf binary is hosted on govcloud since the release on https://github.com/derailed/k9s/ is a tarball + - source: https://zarf-public.s3-us-gov-west-1.amazonaws.com/k9s_Linux_x86_64_v0_24_11 + shasum: 18a5a33bbf58cb228e56a03380dcb6b9bb8624acab4ff63deb7364dc15d3c03f + target: /usr/local/bin/k9s + executable: true + # Simple theme file to make K9s colors similar to Zarfs UI colors + - source: assets/misc/k9s-theme.yaml + target: /root/.k9s/skin.yml + - name: k3s description: > + *** REQUIRES ROOT *** Install K3s, certified Kubernetes distribution built for IoT & Edge computing. K3s provides the cluster need for Zarf running in Appliance MOde as well as can host a low-resource Gitops Service if not using an existing Kubernetes platform. - required: true + default: true scripts: retry: true + before: + # If running RHEL variant, disable firewalld + # https://rancher.com/docs/k3s/latest/en/advanced/#additional-preparation-for-red-hat-centos-enterprise-linux + - "[ -e /etc/redhat-release ] && systemctl disable firewalld --now" after: # Configure K3s systemd service - "systemctl daemon-reload" @@ -39,60 +60,57 @@ components: target: /etc/systemd/system/k3s.service symlinks: - /etc/systemd/system/multi-user.target.wants/k3s.service - # Containerd mirroring configuration with zarf string injection - - source: assets/misc/registries.yaml - target: "/etc/rancher/k3s/registries.yaml" - template: true # Mock file for creating the kube config symlink - source: assets/misc/empty-file target: /etc/rancher/k3s/k3s.yaml symlinks: - /root/.kube/config - - name: management - description: "Add the K9s terminal-based K8s UI for cluster management" - default: true - files: - # The zarf binary is hosted on govcloud since the release on https://github.com/derailed/k9s/ is a tarball - - source: https://zarf-public.s3-us-gov-west-1.amazonaws.com/k9s_Linux_x86_64_v0_24_11 - shasum: 18a5a33bbf58cb228e56a03380dcb6b9bb8624acab4ff63deb7364dc15d3c03f - target: /usr/local/bin/k9s - executable: true - # Simple theme file to make K9s colors similar to Zarfs UI colors - - source: assets/misc/k9s-theme.yaml - target: /root/.k9s/skin.yml - - - name: traefik-ingress - description: "Install the Traefik ingress (usually needed for appliance mode)" + - name: container-registry-seed required: true - scripts: - retry: true - after: - - "/usr/local/bin/kubectl get middleware" - manifests: assets/manifests/traefik charts: - - name: traefik - url: https://helm.traefik.io/traefik - version: 9.18.2 + - name: docker-registry + url: https://github.com/defenseunicorns/docker-registry.helm.git + version: 2.0.0 + namespace: zarf + valuesFiles: + - assets/charts/registry-values.yaml + - assets/charts/registry-values-seed.yaml - name: container-registry required: true - scripts: - retry: true - after: - - "./zarf tools registry catalog $ZARF_TARGET_ENDPOINT" - manifests: assets/manifests/registry - images: - - registry1.dso.mil/ironbank/opensource/docker/registry-v2:2.7.1 + manifests: + - name: kep-1775-registry-annotation + files: + - assets/manifests/registry/configmap.yaml charts: - name: docker-registry - url: https://helm.twun.io - version: 1.10.1 + url: https://github.com/defenseunicorns/docker-registry.helm.git + version: 2.0.0 + namespace: zarf + valuesFiles: + - assets/charts/registry-values.yaml + + - name: traefik-ingress + description: "Install the Traefik ingress (usually needed for appliance mode)" + default: true + manifests: + - name: configure-traefik-tls + files: + - assets/manifests/traefik/traefik-tls.yaml + images: + - traefik:2.5.6 + charts: + - name: traefik + url: https://helm.traefik.io/traefik + version: 10.9.1 + namespace: zarf + valuesFiles: + - assets/charts/traefik-values.yaml - name: logging description: "Add Promtail, Grafana and Loki (PGL) to this cluster for log monitoring." default: true - manifests: assets/manifests/logging images: - grafana/loki:2.2.0 - grafana/promtail:2.1.0 @@ -102,13 +120,18 @@ components: - name: loki-stack url: https://grafana.github.io/helm-charts version: 2.4.1 + namespace: zarf + valuesFiles: + - assets/charts/pgl-values.yaml - name: gitops-service - description: "Add Gitea for serving gitops-based clusters in an airgap" - manifests: assets/manifests/gitops + description: "Add Registry and Gitea for serving gitops-based clusters in an airgap" images: - gitea/gitea:1.13.7 charts: - name: gitea url: https://dl.gitea.io/charts version: 2.2.5 + namespace: zarf + valuesFiles: + - assets/charts/gitea-values.yaml From 3db276853c1fe7929c795c091ee83f232d271de5 Mon Sep 17 00:00:00 2001 From: Jeff McCoy Date: Fri, 21 Jan 2022 03:40:53 -0600 Subject: [PATCH 02/88] unify init/deploy & add basic chart validation before create --- cli/cmd/initialize.go | 18 ----- cli/config/config.go | 15 ++-- cli/config/types.go | 5 +- cli/internal/helm/destroy.go | 1 + cli/internal/packager/create.go | 4 ++ cli/internal/packager/deploy.go | 20 +++--- cli/internal/packager/validate/validate.go | 82 ++++++++++++++++++++++ 7 files changed, 109 insertions(+), 36 deletions(-) create mode 100644 cli/internal/helm/destroy.go create mode 100644 cli/internal/packager/validate/validate.go diff --git a/cli/cmd/initialize.go b/cli/cmd/initialize.go index 62066cf339..799b5029b7 100644 --- a/cli/cmd/initialize.go +++ b/cli/cmd/initialize.go @@ -5,10 +5,8 @@ import ( "os" "github.com/defenseunicorns/zarf/cli/config" - "github.com/defenseunicorns/zarf/cli/internal/message" "github.com/defenseunicorns/zarf/cli/internal/packager" - "github.com/AlecAivazis/survey/v2" "github.com/spf13/cobra" ) @@ -21,22 +19,6 @@ var initCmd = &cobra.Command{ zarfLogo := getLogo() _, _ = fmt.Fprintln(os.Stderr, zarfLogo) - if !config.DeployOptions.Confirm { - var confirm bool - - message.Question(` - You are about to initialize a new Zarf deployment on this machine which will make - changes to your filesystem. You should not run zarf init more than once without first - running zarf destroy.`) - - prompt := &survey.Confirm{Message: "Do you want to continue?"} - _ = survey.AskOne(prompt, &confirm) - if !confirm { - // Gracefully exit because they didn't want to play after all :-/ - os.Exit(0) - } - } - // Continue running package deploy for all components like any other package config.DeployOptions.PackagePath = config.PackageInitName diff --git a/cli/config/config.go b/cli/config/config.go index 2c96927a02..336c4e8f82 100644 --- a/cli/config/config.go +++ b/cli/config/config.go @@ -20,12 +20,14 @@ const ( PackageInitName = "zarf-init.tar.zst" PackagePrefix = "zarf-package-" - ZarfGitPushUser = "zarf-git-user" - ZarfRegistryPushUser = "zarf-push" - ZarfRegistryPullUser = "zarf-pull" - ZarfSeedPort = "45000" - ZarfRegistry = IPV4Localhost + ":45001" - ZarfLocalSeedRegistry = IPV4Localhost + ":" + ZarfSeedPort + // ZarfMaxChartNameLength limits helm chart name size to account for K8s/helm limits and zarf prefix + ZarfMaxChartNameLength = 40 + ZarfGitPushUser = "zarf-git-user" + ZarfRegistryPushUser = "zarf-push" + ZarfRegistryPullUser = "zarf-pull" + ZarfSeedPort = "45000" + ZarfRegistry = IPV4Localhost + ":45001" + ZarfLocalSeedRegistry = IPV4Localhost + ":" + ZarfSeedPort ZarfSeedTypeCLIInject = "cli-inject" ZarfSeedTypeRuntimeRegistry = "runtime-registry" @@ -56,6 +58,7 @@ func IsZarfInitConfig() bool { func SetAcrch(arch string) { message.Debugf("config.SetArch(%s)", arch) + config.Build.Arch = arch ActiveCranePlatform = crane.WithPlatform(&v1.Platform{OS: "linux", Architecture: arch}) } diff --git a/cli/config/types.go b/cli/config/types.go index 722ab95b74..18e0c779e9 100644 --- a/cli/config/types.go +++ b/cli/config/types.go @@ -52,8 +52,8 @@ type ZarfMetadata struct { Name string `yaml:"name,omitempty"` Description string `yaml:"description,omitempty"` Version string `yaml:"version,omitempty"` - Url string `yaml:"url:omitempty"` - Image string `yaml:"image:omitempty"` + Url string `yaml:"url,omitempty"` + Image string `yaml:"image,omitempty"` Uncompressed bool `yaml:"uncompressed,omitempty"` } @@ -75,6 +75,7 @@ type ZarfData struct { type ZarfBuildData struct { Terminal string `yaml:"terminal"` User string `yaml:"user"` + Arch string `yaml:"arch"` Timestamp string `yaml:"timestamp"` Version string `yaml:"string"` } diff --git a/cli/internal/helm/destroy.go b/cli/internal/helm/destroy.go new file mode 100644 index 0000000000..9a90ecfa73 --- /dev/null +++ b/cli/internal/helm/destroy.go @@ -0,0 +1 @@ +package helm diff --git a/cli/internal/packager/create.go b/cli/internal/packager/create.go index b0141e8565..aef2eb190e 100644 --- a/cli/internal/packager/create.go +++ b/cli/internal/packager/create.go @@ -2,6 +2,7 @@ package packager import ( "fmt" + "github.com/defenseunicorns/zarf/cli/internal/packager/validate" "os" "path/filepath" "regexp" @@ -35,6 +36,9 @@ func Create() { message.Fatalf(err, "Unable to write the %s file", configFile) } + // Perform early package validation + validate.Run() + if !confirmAction(configFile, "Create") { os.Exit(0) } diff --git a/cli/internal/packager/deploy.go b/cli/internal/packager/deploy.go index d05a9aa1ab..060b4c4558 100644 --- a/cli/internal/packager/deploy.go +++ b/cli/internal/packager/deploy.go @@ -47,16 +47,16 @@ func Deploy() { if config.IsZarfInitConfig() { // If init config, make sure things are ready utils.RunPreflightChecks() - } else { - // Otherwise, skip duplicate user approval - configPath := tempPath.base + "/zarf.yaml" - confirm := confirmAction(configPath, "Deploy") - - // Don't continue unless the user says so - if !confirm { - cleanup(tempPath) - os.Exit(0) - } + } + + // Confirm the overall package deployment + configPath := tempPath.base + "/zarf.yaml" + confirm := confirmAction(configPath, "Deploy") + + // Don't continue unless the user says so + if !confirm { + cleanup(tempPath) + os.Exit(0) } // Verify the components requested all exist diff --git a/cli/internal/packager/validate/validate.go b/cli/internal/packager/validate/validate.go new file mode 100644 index 0000000000..5809cfb0b4 --- /dev/null +++ b/cli/internal/packager/validate/validate.go @@ -0,0 +1,82 @@ +package validate + +import ( + "fmt" + "github.com/defenseunicorns/zarf/cli/config" + "github.com/defenseunicorns/zarf/cli/internal/message" +) + +// Run performs config validations and runs message.Fatal() on errors +func Run() { + components := config.GetComponents() + + for _, component := range components { + for _, chart := range component.Charts { + if err := validateChart(chart); err != nil { + message.Fatalf(err, "Invalid chart definition in the %s component: %s", component.Name, err) + } + } + for _, manifest := range component.Manifests { + if err := validateManifest(manifest); err != nil { + message.Fatalf(err, "Invalid manifest definition in the %s component: %s", component.Name, err) + } + } + } + +} + +func validateChart(chart config.ZarfChart) error { + intro := fmt.Sprintf("chart %s", chart.Name) + + // Don't allow empty names + if chart.Name == "" { + return fmt.Errorf("%s must include a name", intro) + } + + // Helm max release name + if len(chart.Name) > config.ZarfMaxChartNameLength { + return fmt.Errorf("%s exceed the maximum length of %d characters", + intro, + config.ZarfMaxChartNameLength) + } + + // Must have a namespace + if chart.Namespace == "" { + return fmt.Errorf("%s must include a namespace", intro) + } + + // Must have a url + if chart.Url == "" { + return fmt.Errorf("%s must include a url", intro) + } + + // Must have a version + if chart.Version == "" { + return fmt.Errorf("%s must include a chart version", intro) + } + + return nil +} + +func validateManifest(manifest config.ZarfManifest) error { + intro := fmt.Sprintf("chart %s", manifest.Name) + + // Don't allow empty names + if manifest.Name == "" { + return fmt.Errorf("%s must include a name", intro) + } + + // Helm max release name + if len(manifest.Name) > config.ZarfMaxChartNameLength { + return fmt.Errorf("%s exceed the maximum length of %d characters", + intro, + config.ZarfMaxChartNameLength) + } + + // Require files in manifest + if len(manifest.Files) < 1 { + return fmt.Errorf("%s must have at least 1 file", intro) + } + + return nil +} From 8e81e2e8a197cfbada430f7075de8784144f004b Mon Sep 17 00:00:00 2001 From: Jeff McCoy Date: Fri, 21 Jan 2022 03:41:27 -0600 Subject: [PATCH 03/88] add --remove-components to remove charts installed by zarf in other namespaces --- cli/cmd/destroy.go | 8 ++++++ cli/internal/helm/chart.go | 14 ++++++---- cli/internal/helm/destroy.go | 54 ++++++++++++++++++++++++++++++++++++ cli/internal/k8s/tunnel.go | 6 ++-- 4 files changed, 73 insertions(+), 9 deletions(-) diff --git a/cli/cmd/destroy.go b/cli/cmd/destroy.go index 2738fc1075..88a4779123 100644 --- a/cli/cmd/destroy.go +++ b/cli/cmd/destroy.go @@ -1,6 +1,7 @@ package cmd import ( + "github.com/defenseunicorns/zarf/cli/internal/helm" "os" "regexp" @@ -11,6 +12,7 @@ import ( ) var confirmDestroy bool +var removeComponents bool var destroyCmd = &cobra.Command{ Use: "destroy", @@ -31,6 +33,11 @@ var destroyCmd = &cobra.Command{ _ = os.Remove(script) } } else { + if removeComponents { + // The default behavior for charts installed outside the zarf namespace will be to leave them installed + helm.Destroy() + } + // If Zarf didn't deploy the cluster, only delete the ZarfNamespace k8s.DeleteZarfNamespace() } @@ -41,5 +48,6 @@ func init() { rootCmd.AddCommand(destroyCmd) destroyCmd.Flags().BoolVar(&confirmDestroy, "confirm", false, "Confirm the destroy action") + destroyCmd.Flags().BoolVar(&removeComponents, "remove-components", false, "Also remove any installed components outside the zarf namespace") _ = destroyCmd.MarkFlagRequired("confirm") } diff --git a/cli/internal/helm/chart.go b/cli/internal/helm/chart.go index 88ebca1b72..5e98a8ceaf 100644 --- a/cli/internal/helm/chart.go +++ b/cli/internal/helm/chart.go @@ -20,6 +20,7 @@ import ( type ChartOptions struct { BasePath string Chart config.ZarfChart + ReleaseName string ChartOverride *chart.Chart ValueOverride map[string]interface{} Images []string @@ -40,6 +41,7 @@ func InstallOrUpgradeChart(options ChartOptions) { var output *release.Release + options.ReleaseName = fmt.Sprintf("zarf-%s", options.Chart.Name) actionConfig, err := createActionConfig(options.Chart.Namespace) // Setup K8s connection @@ -59,17 +61,17 @@ func InstallOrUpgradeChart(options ChartOptions) { // On total failure try to rollback or uninstall if histClient.Version > 1 { spinner.Updatef("Performing chart rollback") - _ = rollbackChart(actionConfig, options.Chart.Name) + _ = rollbackChart(actionConfig, options.ReleaseName) } else { spinner.Updatef("Performing chart uninstall") - _, _ = uninstallChart(actionConfig, options.Chart.Name) + _, _ = uninstallChart(actionConfig, options.ReleaseName) } spinner.Errorf(nil, "Unable to complete helm chart install/upgrade") break } spinner.Updatef("Checking for existing helm deployment") - if _, histErr := histClient.Run(options.Chart.Name); histErr == driver.ErrReleaseNotFound { + if _, histErr := histClient.Run(options.ReleaseName); histErr == driver.ErrReleaseNotFound { // No prior release, try to install it spinner.Updatef("Attempting chart installation") output, err = installChart(actionConfig, options) @@ -105,7 +107,7 @@ func GenerateChart(basePath string, manifest config.ZarfManifest, images []strin // Generate a new chart tmpChart := new(chart.Chart) tmpChart.Metadata = new(chart.Metadata) - tmpChart.Metadata.Name = fmt.Sprintf("zarf-%s", manifest.Name) + tmpChart.Metadata.Name = fmt.Sprintf("raw-%s", manifest.Name) // This is fun, increment forward in a semver-way using epoch so helm doesn't cry tmpChart.Metadata.Version = fmt.Sprintf("0.1.%d", now.Unix()) tmpChart.Metadata.APIVersion = chart.APIVersionV1 @@ -159,7 +161,7 @@ func installChart(actionConfig *action.Configuration, options ChartOptions) (*re client.SkipCRDs = false // Must be unique per-namespace and < 53 characters. @todo: restrict helm loadedChart name to this - client.ReleaseName = options.Chart.Name + client.ReleaseName = options.ReleaseName // Namespace must be specified client.Namespace = options.Chart.Namespace @@ -198,7 +200,7 @@ func upgradeChart(actionConfig *action.Configuration, options ChartOptions) (*re } // Perform the loadedChart upgrade - return client.Run(options.Chart.Name, loadedChart, chartValues) + return client.Run(options.ReleaseName, loadedChart, chartValues) } func rollbackChart(actionConfig *action.Configuration, name string) error { diff --git a/cli/internal/helm/destroy.go b/cli/internal/helm/destroy.go index 9a90ecfa73..94830a6a60 100644 --- a/cli/internal/helm/destroy.go +++ b/cli/internal/helm/destroy.go @@ -1 +1,55 @@ package helm + +import ( + "github.com/defenseunicorns/zarf/cli/internal/message" + "helm.sh/helm/v3/pkg/action" + "regexp" +) + +func Destroy() { + spinner := message.NewProgressSpinner("Searching for Zarf-installed charts") + defer spinner.Stop() + + // Initially load the actionConfig without a namespace + actionConfig, err := createActionConfig("") + if err != nil { + // Don't fatal since this is a removal action + spinner.Errorf(err, "Unable to initialize the K8s client") + return + } + + // Match a name that begins with "zarf-" + // Explanation: https://regex101.com/r/3yzKZy/1 + zarfPrefix := regexp.MustCompile(`(?m)^zarf-`) + + // Get a list of all releases in all namespaces + list := action.NewList(actionConfig) + list.All = true + list.AllNamespaces = true + // Uninstall in reverse order + list.ByDate = true + list.SortReverse = true + releases, err := list.Run() + if err != nil { + // Don't fatal since this is a removal action + spinner.Errorf(err, "Unable to get the list of installed charts") + } + + // Iterate over all releases + for _, release := range releases { + // Filter on zarf releases + if zarfPrefix.MatchString(release.Name) { + spinner.Updatef("Uninstalling helm chart %s/%s", release.Namespace, release.Name) + // Establish a new actionConfig for the namespace + actionConfig, _ = createActionConfig(release.Namespace) + // Perform the uninstall + response, err := uninstallChart(actionConfig, release.Name) + message.Debug(response) + if err != nil { + // Don't fatal since this is a removal action + spinner.Errorf(err, "Unable to uninstall the chart") + } + } + } + +} diff --git a/cli/internal/k8s/tunnel.go b/cli/internal/k8s/tunnel.go index a24f01135e..dc90859fef 100644 --- a/cli/internal/k8s/tunnel.go +++ b/cli/internal/k8s/tunnel.go @@ -83,15 +83,15 @@ func NewZarfTunnel() *Tunnel { func (tunnel *Tunnel) Connect(target string, blocking bool) { switch strings.ToUpper(target) { case ZarfRegistry: - tunnel.resourceName = "docker-registry" + tunnel.resourceName = "zarf-docker-registry" tunnel.localPort = PortRegistry tunnel.remotePort = 5000 case ZarfLogging: - tunnel.resourceName = "loki-stack-grafana" + tunnel.resourceName = "zarf-loki-stack-grafana" tunnel.localPort = PortLogging tunnel.remotePort = 3000 case ZarfGit: - tunnel.resourceName = "gitea-http" + tunnel.resourceName = "zarf-gitea-http" tunnel.localPort = PortGit tunnel.remotePort = 3000 default: From 1d4b468338838847ba731fca6d19ecc9bdb09cfb Mon Sep 17 00:00:00 2001 From: Jeff McCoy Date: Fri, 21 Jan 2022 17:55:57 -0600 Subject: [PATCH 04/88] vendor k9s into "zarf tools k9s" --- assets/misc/k9s-theme.yaml | 111 ---------------------- cli/cmd/tools.go | 23 +++-- go.mod | 3 +- go.sum | 184 ++++++++++++++++++++++++++++++++++++- zarf.yaml | 13 --- 5 files changed, 202 insertions(+), 132 deletions(-) delete mode 100644 assets/misc/k9s-theme.yaml diff --git a/assets/misc/k9s-theme.yaml b/assets/misc/k9s-theme.yaml deleted file mode 100644 index c8fa1c1104..0000000000 --- a/assets/misc/k9s-theme.yaml +++ /dev/null @@ -1,111 +0,0 @@ -# original source: https://raw.githubusercontent.com/derailed/k9s/v0.24.14/skins/dracula.yml -foreground: &foreground "#f8f8f2" -background: &background "#282a36" -current_line: ¤t_line "#44475a" -selection: &selection "#44475a" -comment: &comment "#6272a4" -cyan: &cyan "#8be9fd" -green: &green "#50fa7b" -orange: &orange "#ffb86c" -pink: &pink "#ff79c6" -purple: &purple "#bd93f9" -red: &red "#ff5555" -yellow: &yellow "#f1fa8c" - -# Skin... -k9s: - # General K9s styles - body: - fgColor: *foreground - bgColor: *background - logoColor: *purple - # Command prompt styles - prompt: - fgColor: *foreground - bgColor: *background - suggestColor: *purple - # ClusterInfoView styles. - info: - fgColor: *pink - sectionColor: *foreground - # Dialog styles. - dialog: - fgColor: *foreground - bgColor: *background - buttonFgColor: *foreground - buttonBgColor: *purple - buttonFocusFgColor: *yellow - buttonFocusBgColor: *pink - labelFgColor: *orange - fieldFgColor: *foreground - frame: - # Borders styles. - border: - fgColor: *selection - focusColor: *current_line - menu: - fgColor: *foreground - keyColor: *pink - # Used for favorite namespaces - numKeyColor: *pink - # CrumbView attributes for history navigation. - crumbs: - fgColor: *foreground - bgColor: *current_line - activeColor: *current_line - # Resource status and update styles - status: - newColor: *cyan - modifyColor: *purple - addColor: *green - errorColor: *red - highlightcolor: *orange - killColor: *comment - completedColor: *comment - # Border title styles. - title: - fgColor: *foreground - bgColor: *current_line - highlightColor: *orange - counterColor: *purple - filterColor: *pink - views: - # Charts skins... - charts: - bgColor: default - defaultDialColors: - - *purple - - *red - defaultChartColors: - - *purple - - *red - # TableView attributes. - table: - fgColor: *foreground - bgColor: *background - cursorFgColor: *foreground - cursorBgColor: *current_line - # Header row styles. - header: - fgColor: *foreground - bgColor: *background - sorterColor: *cyan - # Xray view attributes. - xray: - fgColor: *foreground - bgColor: *background - cursorColor: *current_line - graphicColor: *purple - showIcons: false - # YAML info styles. - yaml: - keyColor: *pink - colonColor: *purple - valueColor: *foreground - # Logs styles. - logs: - fgColor: *foreground - bgColor: *background - indicator: - fgColor: *foreground - bgColor: *purple diff --git a/cli/cmd/tools.go b/cli/cmd/tools.go index 4e4ad6fdac..a6e4e018d0 100644 --- a/cli/cmd/tools.go +++ b/cli/cmd/tools.go @@ -3,14 +3,15 @@ package cmd import ( "encoding/json" "fmt" + "os" "github.com/alecthomas/jsonschema" "github.com/defenseunicorns/zarf/cli/config" "github.com/defenseunicorns/zarf/cli/internal/git" "github.com/defenseunicorns/zarf/cli/internal/message" + k9s "github.com/derailed/k9s/cmd" craneCmd "github.com/google/go-containerregistry/cmd/crane/cmd" "github.com/google/go-containerregistry/pkg/crane" - v1 "github.com/google/go-containerregistry/pkg/v1" "github.com/mholt/archiver/v3" "github.com/spf13/cobra" ) @@ -79,23 +80,33 @@ var configSchemaCmd = &cobra.Command{ }, } +var k9sCmd = &cobra.Command{ + Use: "k9s", + Short: "Launch K9s tool for managing K8s clusters", + Run: func(cmd *cobra.Command, args []string) { + // Hack to make k9s think it's all alone + os.Args = []string{os.Args[0], "-n", "zarf"} + k9s.Execute() + }, +} + func init() { rootCmd.AddCommand(toolsCmd) toolsCmd.AddCommand(archiverCmd) toolsCmd.AddCommand(readCredsCmd) toolsCmd.AddCommand(configSchemaCmd) + toolsCmd.AddCommand(k9sCmd) + toolsCmd.AddCommand(registryCmd) + archiverCmd.AddCommand(archiverCompressCmd) archiverCmd.AddCommand(archiverDecompressCmd) - toolsCmd.AddCommand(registryCmd) - cranePlatformOptions := []crane.Option{ - crane.WithPlatform(&v1.Platform{OS: "linux", Architecture: "amd64"}), - crane.WithPlatform(&v1.Platform{OS: "linux", Architecture: "arm64"}), - } + cranePlatformOptions := []crane.Option{config.ActiveCranePlatform} registryCmd.AddCommand(craneCmd.NewCmdAuthLogin()) registryCmd.AddCommand(craneCmd.NewCmdPull(&cranePlatformOptions)) registryCmd.AddCommand(craneCmd.NewCmdPush(&cranePlatformOptions)) registryCmd.AddCommand(craneCmd.NewCmdCopy(&cranePlatformOptions)) registryCmd.AddCommand(craneCmd.NewCmdCatalog(&cranePlatformOptions)) + } diff --git a/go.mod b/go.mod index acffec5818..757962d950 100644 --- a/go.mod +++ b/go.mod @@ -5,6 +5,7 @@ go 1.16 require ( github.com/AlecAivazis/survey/v2 v2.3.2 github.com/alecthomas/jsonschema v0.0.0-20211228220459-151e3c21f49d + github.com/derailed/k9s v0.25.18 github.com/distribution/distribution/v3 v3.0.0-20210804104954-38ab4c606ee3 github.com/docker/cli v20.10.12+incompatible github.com/fatih/color v1.13.0 @@ -25,7 +26,7 @@ require ( k8s.io/apimachinery v0.22.5 k8s.io/client-go v0.22.5 k8s.io/klog/v2 v2.40.1 - sigs.k8s.io/yaml v1.2.0 + sigs.k8s.io/yaml v1.3.0 ) replace ( diff --git a/go.sum b/go.sum index e507351c62..2c856a138c 100644 --- a/go.sum +++ b/go.sum @@ -80,6 +80,7 @@ github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym github.com/DATA-DOG/go-sqlmock v1.5.0 h1:Shsta01QNfFxHCfpW6YH2STWB0MudeXXEWMr20OEh60= github.com/DATA-DOG/go-sqlmock v1.5.0/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM= github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= +github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0= github.com/MakeNowJust/heredoc v0.0.0-20170808103936-bb23615498cd h1:sjQovDkwrZp8u+gxLtPgKGjk5hCxuy2hrRejBTA9xFU= github.com/MakeNowJust/heredoc v0.0.0-20170808103936-bb23615498cd/go.mod h1:64YHyfSL2R96J44Nlwm39UHepQbyR5q10x7iYa1ks2E= github.com/MarvinJWendt/testza v0.1.0/go.mod h1:7AxNvlfeHP7Z/hDQ5JtE3OKYT3XFUeLCDE2DQninSqs= @@ -98,6 +99,7 @@ github.com/Masterminds/sprig v2.22.0+incompatible h1:z4yfnGrZ7netVz+0EDJ0Wi+5VZC github.com/Masterminds/sprig v2.22.0+incompatible/go.mod h1:y6hNFY5UBTIWBxnzTeuNhlNS5hqE0NB0E6fgfo2Br3o= github.com/Masterminds/sprig/v3 v3.2.2 h1:17jRggJu518dr3QaafizSXOjKYp94wKfABxUmyxvxX8= github.com/Masterminds/sprig/v3 v3.2.2/go.mod h1:UoaO7Yp8KlPnJIYWTFkMaqPUYKTfGFPhxNuwnnxkKlk= +github.com/Masterminds/squirrel v1.5.0/go.mod h1:NNaOrjSoIDfDA40n7sr2tPNZRfjzjA400rg+riTZj10= github.com/Masterminds/squirrel v1.5.2 h1:UiOEi2ZX4RCSkpiNDQN5kro/XIBpSRk9iTqdIRPzUXE= github.com/Masterminds/squirrel v1.5.2/go.mod h1:NNaOrjSoIDfDA40n7sr2tPNZRfjzjA400rg+riTZj10= github.com/Masterminds/vcs v1.13.1/go.mod h1:N09YCmOQr6RLxC6UNHzuVwAdodYbbnycGHSmwVJjcKA= @@ -137,8 +139,14 @@ github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 h1:d+Bc7a5rLufV github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= github.com/Shopify/logrus-bugsnag v0.0.0-20171204204709-577dee27f20d h1:UrqY+r/OJnIp5u0s1SbQ8dVfLCZJsnvazdBP5hS4iRs= github.com/Shopify/logrus-bugsnag v0.0.0-20171204204709-577dee27f20d/go.mod h1:HI8ITrYtUY+O+ZhtlqUnD8+KwNPOyugEhfP9fdUIaEQ= +github.com/Shopify/sarama v1.19.0/go.mod h1:FVkBWblsNy7DGZRfXLU0O9RCGt5g3g3yEuWXgklEdEo= +github.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMxUHB2q5Ap20/P/eIdh4G0pI= +github.com/VividCortex/gohistogram v1.0.0/go.mod h1:Pf5mBqqDxYaXu3hDrrU+w6nw50o/4+TcAqDqk/vUH7g= github.com/acomagu/bufpipe v1.0.3 h1:fxAGrHZTgQ9w5QqVItgzwj235/uYZYgbXitB+dLupOk= github.com/acomagu/bufpipe v1.0.3/go.mod h1:mxdxdup/WdsKVreO5GpW4+M/1CE2sMG4jeGJ2sYmHc4= +github.com/adrg/xdg v0.4.0 h1:RzRqFcjH4nE5C6oTAxhBtoE2IRyjBSa62SCbyPidvls= +github.com/adrg/xdg v0.4.0/go.mod h1:N6ag73EX4wyxeaoeHctc1mas01KZgsj5tYiAIwqJE/E= +github.com/afex/hystrix-go v0.0.0-20180502004556-fa1af6a1f4f5/go.mod h1:SkGFH1ia65gfNATL8TAiHDNxPzPdmEL5uirI2Uyuz6c= github.com/agext/levenshtein v1.2.1/go.mod h1:JEDfjyjHDjOF/1e4FlBE/PkbqA9OfWu2ki2W0IB5558= github.com/agext/levenshtein v1.2.3 h1:YB2fHEn0UJagG8T1rrWknE3ZQzWM06O8AMAatNn7lmo= github.com/agext/levenshtein v1.2.3/go.mod h1:JEDfjyjHDjOF/1e4FlBE/PkbqA9OfWu2ki2W0IB5558= @@ -155,6 +163,8 @@ github.com/andybalholm/brotli v1.0.1/go.mod h1:loMXtMfwqflxFJPmdbJO0a3KNoPuLBgiu github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239 h1:kFOfPq6dUM1hTo4JG6LR5AXSUEsOjtdm0kw0FtQtMJA= github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239/go.mod h1:2FmKhYUyUczH0OGQWaF5ceTx0UBShxjsH6f8oGKYe2c= github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= +github.com/apache/thrift v0.12.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= +github.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= github.com/apparentlymart/go-dump v0.0.0-20180507223929-23540a00eaa3/go.mod h1:oL81AME2rN47vu18xqj1S1jPIPuN7afo62yKTNn3XMM= github.com/apparentlymart/go-textseg v1.0.0 h1:rRmlIsPEEhUTIKQb7T++Nz/A5Q6C9IuX2wFoYVvnCs0= github.com/apparentlymart/go-textseg v1.0.0/go.mod h1:z96Txxhf3xSFMPmb5X/1W05FF/Nj9VFpLOpjS5yuumk= @@ -168,16 +178,22 @@ github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj github.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPdPJAN/hZIm0C4OItdklCFmMRWYpio= github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= +github.com/aryann/difflib v0.0.0-20170710044230-e206f873d14a/go.mod h1:DAHtR1m6lCRdSC2Tm3DSWRPvIPr6xNKyeHdqDQSQT+A= github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= github.com/asaskevich/govalidator v0.0.0-20200428143746-21a406dcc535 h1:4daAzAu0S6Vi7/lbWECcX0j45yZReDZ56BQsrVBOEEY= github.com/asaskevich/govalidator v0.0.0-20200428143746-21a406dcc535/go.mod h1:oGkLhpf+kjZl6xBf758TQhh5XrAeiJv/7FRz/2spLIg= github.com/atomicgo/cursor v0.0.1 h1:xdogsqa6YYlLfM+GyClC/Lchf7aiMerFiZQn7soTOoU= github.com/atomicgo/cursor v0.0.1/go.mod h1:cBON2QmmrysudxNBFthvMtN32r3jxVRIvzkUiF/RuIk= +github.com/atotto/clipboard v0.1.4 h1:EH0zSVneZPSuFR11BlR9YppQTVDbh5+16AmcJi4g1z4= +github.com/atotto/clipboard v0.1.4/go.mod h1:ZY9tmq7sm5xIbd9bOK4onWV4S6X0u6GY7Vn0Yu86PYI= github.com/aws/aws-lambda-go v1.13.3/go.mod h1:4UKl9IzQMoD+QF79YdCuzCwp8VbmG4VAQwij/eHl5CU= github.com/aws/aws-sdk-go v1.15.11/go.mod h1:mFuSZ37Z9YOHbQEwBWztmVzqXrEkub65tZoCYDt7FT0= +github.com/aws/aws-sdk-go v1.27.0/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= github.com/aws/aws-sdk-go v1.34.9/go.mod h1:5zCpMtNQVjRREroY7sYe8lOMRSxkhG6MZveU8YkpAk0= +github.com/aws/aws-sdk-go v1.35.21/go.mod h1:tlPOdRjfxPBpNIwqDj61rmsnA85v9jc0Ps9+muhnW+k= github.com/aws/aws-sdk-go v1.40.56 h1:FM2yjR0UUYFzDTMx+mH9Vyw1k1EUUxsAFzk+BjkzANA= github.com/aws/aws-sdk-go v1.40.56/go.mod h1:585smgzpB/KqRA+K3y/NL/oYRqQvpNJYvLm+LY1U59Q= +github.com/aws/aws-sdk-go-v2 v0.18.0/go.mod h1:JWVYvqSMppoMJC0x5wdwiImzgXTI9FuZwxzkQq9wy+g= github.com/benbjohnson/clock v1.0.3/go.mod h1:bGMdMPoPVvcYyt1gHDf4J2KE153Yf9BuiUKYMaxlTDM= github.com/beorn7/perks v0.0.0-20160804104726-4c0e84591b9a/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= @@ -205,7 +221,12 @@ github.com/bugsnag/osext v0.0.0-20130617224835-0dd3f918b21b h1:otBG+dV+YK+Soembj github.com/bugsnag/osext v0.0.0-20130617224835-0dd3f918b21b/go.mod h1:obH5gd0BsqsP2LwDJ9aOkm/6J86V6lyAXCoQWGw3K50= github.com/bugsnag/panicwrap v0.0.0-20151223152923-e2c28503fcd0 h1:nvj0OLI3YqYXer/kZD8Ri1aaunCxIEsOst1BVJswV0o= github.com/bugsnag/panicwrap v0.0.0-20151223152923-e2c28503fcd0/go.mod h1:D/8v3kj0zr8ZAKg1AQ6crr+5VwKN5eIywRkfhyM/+dE= +github.com/casbin/casbin/v2 v2.1.2/go.mod h1:YcPU1XXisHhLzuxH9coDNf2FbKpjGlbCg3n9yuLkIJQ= +github.com/cenkalti/backoff v2.2.1+incompatible h1:tNowT99t7UNflLxfYYSlKYsBpXdEet03Pg2g16Swow4= +github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM= github.com/cenkalti/backoff/v4 v4.1.1/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw= +github.com/cenkalti/backoff/v4 v4.1.2 h1:6Yo7N8UP2K6LWZnW94DLVSSrbobcWdVzAYOisuDPIFo= +github.com/cenkalti/backoff/v4 v4.1.2/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/census-instrumentation/opencensus-proto v0.3.0/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/certifi/gocertifi v0.0.0-20191021191039-0944d244cd40/go.mod h1:sGbDF6GwGcLpkNXPUTkMRoywsNa/ol15pxFe6ERfguA= @@ -228,6 +249,7 @@ github.com/cilium/ebpf v0.4.0/go.mod h1:4tRaxcgiL706VnOzHOdBlY8IEAIdxINsQBcU4xJJ github.com/cilium/ebpf v0.6.2/go.mod h1:4tRaxcgiL706VnOzHOdBlY8IEAIdxINsQBcU4xJJXRs= github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag= github.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I= +github.com/clbanning/x2j v0.0.0-20191024224557-825249438eec/go.mod h1:jMjuTZXRI4dUb/I5gc9Hdhagfvm9+RyrPryS/auMzxE= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= @@ -239,9 +261,11 @@ github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWH github.com/cncf/xds/go v0.0.0-20211001041855-01bcc9b48dfe/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20211130200136-a8f946100490/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= github.com/cockroachdb/datadriven v0.0.0-20200714090401-bf6692d28da5/go.mod h1:h6jFvWxBdQXxjopDMZyH2UVceIRfR84bdzbkoKrsWNo= github.com/cockroachdb/errors v1.2.4/go.mod h1:rQD95gz6FARkaKkQXUksEje/d9a6wBJoCr5oaCLELYA= github.com/cockroachdb/logtags v0.0.0-20190617123548-eb05cc24525f/go.mod h1:i/u985jwjWRlyHXQbwatDASoW0RMlZ/3i9yJHE2xLkI= +github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI= github.com/containerd/aufs v0.0.0-20200908144142-dab0cbea06f4/go.mod h1:nukgQABAEopAHvB6j7cnP5zJ+/3aVcE7hCYqvIwAHyE= github.com/containerd/aufs v0.0.0-20201003224125-76a6863f2989/go.mod h1:AkGGQs9NM2vtYHaUen+NljV0/baGCAPELGm2q9ZXpWU= github.com/containerd/aufs v0.0.0-20210316121734-20793ff83c97/go.mod h1:kL5kd6KM5TzQjR79jljyi4olc1Vrx6XBlcyj3gNv2PU= @@ -347,11 +371,13 @@ github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7 github.com/coreos/go-systemd/v22 v22.0.0/go.mod h1:xO0FLkIi5MaZafQlIrOotqXZ90ih+1atmu1JpKERPPk= github.com/coreos/go-systemd/v22 v22.1.0/go.mod h1:xO0FLkIi5MaZafQlIrOotqXZ90ih+1atmu1JpKERPPk= github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= +github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= github.com/cpuguy83/go-md2man/v2 v2.0.1 h1:r/myEWzV9lfsM1tFLgDyu0atFtJ1fXn261LKYj/3DxU= github.com/cpuguy83/go-md2man/v2 v2.0.1/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= +github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/creack/pty v1.1.11 h1:07n33Z8lZxZ2qwegKbObQohDhXDQxiMMz1NOUGYlesw= github.com/creack/pty v1.1.11/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= @@ -368,6 +394,12 @@ github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSs github.com/daviddengcn/go-colortext v0.0.0-20160507010035-511bcaf42ccd/go.mod h1:dv4zxwHi5C/8AeI+4gX4dCWOIvNi7I6JCSX0HvlKPgE= github.com/denisenkom/go-mssqldb v0.9.0/go.mod h1:xbL0rPBG9cCiLr28tMa8zpbdarY27NDyej4t/EjAShU= github.com/denverdino/aliyungo v0.0.0-20190125010748-a747050bb1ba/go.mod h1:dV8lFg6daOBZbT6/BDGIz6Y3WFGn8juu6G+CQ6LHtl0= +github.com/derailed/k9s v0.25.18 h1:wvTQ56NdJ2GALD1OQjQL34yhcB7sPRuDYo9py1Md+Vw= +github.com/derailed/k9s v0.25.18/go.mod h1:SPo0YasThaL9sz3/Ero9CfNM6QSkhLa3Cf+d606zrL8= +github.com/derailed/popeye v0.9.8 h1:53Rdx09WloOj6ltZZq9OeS48zH0F44mEMcs8XaI1g0Q= +github.com/derailed/popeye v0.9.8/go.mod h1:Ih3wTG7wBOuxdqz5tlCuCFq/vyB+Te/IpqY5HwgUTEA= +github.com/derailed/tview v0.6.6 h1:hNqBewhRTYRgfLp1p5KGw0DFdbGMS68iocBSmGGNg4s= +github.com/derailed/tview v0.6.6/go.mod h1:A1LXWlbx/YDMXr3GVTy+IgclAkBssJpw/FiZ7aqUgzU= github.com/dgrijalva/jwt-go v0.0.0-20170104182250-a601269ab70c/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= @@ -409,6 +441,10 @@ github.com/dsnet/compress v0.0.2-0.20210315054119-f66993602bf5/go.mod h1:qssHWj6 github.com/dsnet/golib v0.0.0-20171103203638-1ea166775780/go.mod h1:Lj+Z9rebOhdfkVLjJ8T6VcRQv3SXugXy999NBtR9aFY= github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= +github.com/eapache/go-resiliency v1.1.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5mFgVsvEsIPBvNs= +github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21/go.mod h1:+020luEh2TKB4/GOp8oxxtq0Daoen/Cii55CzbTV6DU= +github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I= +github.com/edsrzf/mmap-go v1.0.0/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M= github.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc= github.com/elazarl/goproxy v0.0.0-20190911111923-ecfe977594f1 h1:yY9rWGoXv1U5pl4gxqlULARMQD7x0QG85lqEXTWysik= github.com/elazarl/goproxy v0.0.0-20190911111923-ecfe977594f1/go.mod h1:Ro8st/ElPeALwNFlcTpWmkr6IoMFfkjXAvTHpevnDsM= @@ -417,6 +453,7 @@ github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb github.com/emicklei/go-restful v2.9.5+incompatible/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= github.com/emirpasic/gods v1.12.0 h1:QAUIPSaCu4G+POclxeqb3F+WPpdKqFGlw36+yOzGlrg= github.com/emirpasic/gods v1.12.0/go.mod h1:YfzfFFoVP/catgzJb4IKIqXjX78Ha8FMSDh3ymbK86o= +github.com/envoyproxy/go-control-plane v0.6.9/go.mod h1:SBwIajubJHhxtWwsL9s8ss4safvEdbitLhGGK48rN6g= github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= @@ -432,6 +469,7 @@ github.com/evanphx/json-patch v4.11.0+incompatible h1:glyUF9yIYtMHzn8xaKw5rMhdWc github.com/evanphx/json-patch v4.11.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= github.com/exponent-io/jsonpath v0.0.0-20151013193312-d6023ce2651d h1:105gxyaGwCFad8crR9dcMQWvV9Hvulu6hwUh4tWPJnM= github.com/exponent-io/jsonpath v0.0.0-20151013193312-d6023ce2651d/go.mod h1:ZZMPRZwes7CROmyNKgQzC3XPs6L/G2EJLHddWejkmf4= +github.com/fatih/camelcase v1.0.0 h1:hxNvNX/xYBp0ovncs8WyWZrOrpBNub/JfaMvbURyft8= github.com/fatih/camelcase v1.0.0/go.mod h1:yN2Sb0lFhZJUdVvtELVWefmrXpuZESvPmqwoZc+/fpc= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= @@ -443,6 +481,8 @@ github.com/felixge/httpsnoop v1.0.1/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSw github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc= github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= github.com/form3tech-oss/jwt-go v3.2.3+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= +github.com/franela/goblin v0.0.0-20200105215937-c9ffbefa60db/go.mod h1:7dvUGVsVBjqR7JHJk0brhHOZYGmfBYOrK0ZhYMEtBr4= +github.com/franela/goreq v0.0.0-20171204163338-bcd34c9993f8/go.mod h1:ZhphrRTfi2rbfLwlschooIH4+wKKDR4Pdxhh+TRoA20= github.com/frankban/quicktest v1.11.3/go.mod h1:wRf/ReqHper53s+kmmSZizM8NamnL3IM0I9ntUbOk+k= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= @@ -450,9 +490,17 @@ github.com/fsnotify/fsnotify v1.5.1 h1:mZcQUHVQUQWoPXXtuf9yuEXKudkV2sx1E06UadKWp github.com/fsnotify/fsnotify v1.5.1/go.mod h1:T3375wBYaZdLLcVNkcVbzGHY7f1l/uK5T5Ai1i3InKU= github.com/fullsailor/pkcs7 v0.0.0-20190404230743-d7302db945fa/go.mod h1:KnogPXtdwXqoenmZCw6S+25EAm2MkxbG0deNDu4cbSA= github.com/fvbommel/sortorder v1.0.1/go.mod h1:uk88iVf1ovNn1iLfgUVU2F9o5eO30ui720w+kxuqRs0= +github.com/fvbommel/sortorder v1.0.2 h1:mV4o8B2hKboCdkJm+a7uX/SIpZob4JzUpc5GGnM45eo= +github.com/fvbommel/sortorder v1.0.2/go.mod h1:uk88iVf1ovNn1iLfgUVU2F9o5eO30ui720w+kxuqRs0= github.com/garyburd/redigo v0.0.0-20150301180006-535138d7bcd7 h1:LofdAjjjqCSXMwLGgOgnE+rdPuvX9DxCqaHwKy7i/ko= github.com/garyburd/redigo v0.0.0-20150301180006-535138d7bcd7/go.mod h1:NR3MbYisc3/PwhQ00EMzDiPmrwpPxAn5GI05/YaO1SY= +github.com/gdamore/encoding v1.0.0 h1:+7OoQ1Bc6eTm5niUzBa0Ctsh6JbMW6Ra+YNuAtDBdko= +github.com/gdamore/encoding v1.0.0/go.mod h1:alR0ol34c49FCSBLjhosxzcPHQbf2trDkoo5dl+VrEg= +github.com/gdamore/tcell/v2 v2.2.1/go.mod h1:cTTuF84Dlj/RqmaCIV5p4w8uG1zWdk0SF6oBpwHp4fU= +github.com/gdamore/tcell/v2 v2.4.0 h1:W6dxJEmaxYvhICFoTY3WrLLEXsQ11SaFnKGVEXW57KM= +github.com/gdamore/tcell/v2 v2.4.0/go.mod h1:cTTuF84Dlj/RqmaCIV5p4w8uG1zWdk0SF6oBpwHp4fU= github.com/getsentry/raven-go v0.2.0/go.mod h1:KungGk8q33+aIAZUIVWZDr2OfAEBsO49PX4NzFV5kcQ= +github.com/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/gliderlabs/ssh v0.2.2 h1:6zsha5zo/TWhRhwqCD3+EarCAgZ2yN28ipRnGPnwkI0= github.com/gliderlabs/ssh v0.2.2/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0= @@ -474,6 +522,7 @@ github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2 github.com/go-ini/ini v1.25.4/go.mod h1:ByCAeIL28uOIIG0E3PJtZPDL8WnHpFKFOtgjp+3Ies8= github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= +github.com/go-kit/kit v0.10.0/go.mod h1:xUsJbQ/Fp4kEt7AFgCuvyX4a71u8h9jB8tj/ORgOZ7o= github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= @@ -500,6 +549,7 @@ github.com/go-playground/universal-translator v0.17.0 h1:icxd5fm+REJzpZx7ZfpaD87 github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+Scu5vgOQjsIJAF8j9muTVoKLVtA= github.com/go-playground/validator/v10 v10.4.1 h1:pH2c5ADXtd66mxoE0Zm9SUhxE20r7aM3F26W0hOn+GE= github.com/go-playground/validator/v10 v10.4.1/go.mod h1:nlOn6nFhuKACm19sB/8EGNn9GlaMV7XkbRSipzJ0Ii4= +github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= github.com/go-sql-driver/mysql v1.4.1/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= github.com/go-sql-driver/mysql v1.5.0 h1:ozyZYNQW3x3HtqT1jira07DN2PArx2v7/mN66gGcHOs= github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= @@ -523,10 +573,13 @@ github.com/godbus/dbus v0.0.0-20190422162347-ade71ed3457e/go.mod h1:bBOAhwG1umN6 github.com/godbus/dbus/v5 v5.0.3/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/godror/godror v0.24.2/go.mod h1:wZv/9vPiUib6tkoDl+AZ/QLf5YZgMravZ7jxH2eQWAE= +github.com/gofrs/flock v0.8.0/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU= github.com/gofrs/flock v0.8.1/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU= +github.com/gogo/googleapis v1.1.0/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s= github.com/gogo/googleapis v1.2.0/go.mod h1:Njal3psf3qN6dwBtQfUmBZh2ybovJ0tlu3o/AC7HYjU= github.com/gogo/googleapis v1.4.0/go.mod h1:5YRNX2z1oM5gXdAkurHa942MDgEJyk02w4OecKY87+c= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= +github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= github.com/gogo/protobuf v1.3.0/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= @@ -534,6 +587,7 @@ github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= +github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= @@ -568,6 +622,7 @@ github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaS github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM= github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw= github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.2/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.3 h1:fHPg5GQYlCeLIPB9BZqMVR5nR9A+IM5zcgeTdjMYmLA= github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= @@ -618,6 +673,7 @@ github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLe github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 h1:El6M4kTTCOh6aBiKaUGG7oYTSPP8MxqL4YI3kZKwcP4= github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ= +github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.2.0 h1:qJYtXnJRWmpe7m/3XlyhrsLrEURqHRM2kxzoxXqyUDs= @@ -632,13 +688,16 @@ github.com/googleapis/gnostic v0.5.5/go.mod h1:7+EbHbldMins07ALC74bsA81Ovc97Dwqy github.com/gookit/color v1.4.2 h1:tXy44JFSFkKnELV6WaMo/lLfu/meqITX3iAV52do7lk= github.com/gookit/color v1.4.2/go.mod h1:fqRyamkC1W8uxl+lxCQxOT09l/vYfZ+QeiX3rKQHCoQ= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= +github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg= github.com/gorilla/handlers v0.0.0-20150720190736-60c7bfde3e33/go.mod h1:Qkdc/uu4tH4g6mTK6auzZ766c4CA0Ng8+o/OAirnOIQ= github.com/gorilla/handlers v1.5.1 h1:9lRY6j8DEeeBT10CvO9hGW0gmky0BprnvDI5vfhUHH4= github.com/gorilla/handlers v1.5.1/go.mod h1:t8XrUpc4KVXb7HGyJ4/cEnwQiaxrX/hz1Zv/4g96P1Q= +github.com/gorilla/mux v1.6.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= github.com/gorilla/mux v1.7.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= github.com/gorilla/mux v1.7.3/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI= github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= +github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/gosuri/uitable v0.0.4 h1:IG2xLKRvErL3uhY6e1BylFzG+aJiwQviDDTfOKeKTpY= @@ -646,17 +705,21 @@ github.com/gosuri/uitable v0.0.4/go.mod h1:tKR86bXuXPZazfOTG1FIzvjIdXzd0mo4Vtn16 github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7 h1:pdN6V1QBWetyv/0+wjACpqVH+eVULgEjkurDLq3goeM= github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= +github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de4/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= github.com/grpc-ecosystem/go-grpc-middleware v1.3.0/go.mod h1:z0ButlSOZa5vEBq9m2m2hlwIgKw+rp3sdCBRoJY+30Y= github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= +github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= github.com/gruntwork-io/go-commons v0.8.0 h1:k/yypwrPqSeYHevLlEDmvmgQzcyTwrlZGRaxEM6G0ro= github.com/gruntwork-io/go-commons v0.8.0/go.mod h1:gtp0yTtIBExIZp7vyIV9I0XQkVwiQZze678hvDXof78= github.com/gruntwork-io/terratest v0.38.2 h1:XgDGMxX+dE8Aw96wI8QH6oIzveej01Yk4bTjt6dtzIU= github.com/gruntwork-io/terratest v0.38.2/go.mod h1:XzW8PL9pAGbLyiBdQ5OiAeWSNpZ/9ycItjYstSS2PV8= github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q= +github.com/hashicorp/consul/api v1.3.0/go.mod h1:MmDNSzIMUjNpY/mQ398R4bk2FnqQLoPndWW5VkKPlCE= github.com/hashicorp/consul/api v1.11.0/go.mod h1:XjsvQN+RJGWI2TWy1/kqaE16HrR2J/FWgkYjdZQsX9M= github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= +github.com/hashicorp/consul/sdk v0.3.0/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= github.com/hashicorp/consul/sdk v0.8.0/go.mod h1:GBvyrGALthsZObzUGsfgHZQDXjg4lOjagTIwIR1vPms= github.com/hashicorp/errwrap v0.0.0-20141028054710-7554cd9344ce/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= github.com/hashicorp/errwrap v1.0.0 h1:hLrqtEDnRye3+sgx6z4qVLNuviH3MR5aQ0ykNJa/UYA= @@ -680,6 +743,7 @@ github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerX github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/go-version v1.2.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= github.com/hashicorp/go-version v1.3.0 h1:McDWVJIU/y+u1BRV06dPaLfLCaT7fUTJLp5r04x7iNw= github.com/hashicorp/go-version v1.3.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90= @@ -708,6 +772,7 @@ github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpO github.com/huandu/xstrings v1.3.1/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE= github.com/huandu/xstrings v1.3.2 h1:L18LIDzqlW6xN2rEkpdV8+oL/IXWJ1APd+vsdYy4Wdw= github.com/huandu/xstrings v1.3.2/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE= +github.com/hudl/fargo v1.3.0/go.mod h1:y3CKSmjA+wD2gak7sUSXTAoopbhU08POFhmITJgmKTg= github.com/iancoleman/orderedmap v0.0.0-20190318233801-ac98e3ecb4b0 h1:i462o439ZjprVSFSZLZxcsoAe592sZB1rci2Z8j4wdk= github.com/iancoleman/orderedmap v0.0.0-20190318233801-ac98e3ecb4b0/go.mod h1:N0Wam8K1arqPXNWjMo21EXnBPOPp36vB07FNRdD2geA= github.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho= @@ -721,6 +786,7 @@ github.com/imdario/mergo v0.3.12 h1:b6R2BslTbIEToALKP7LxUvijTsNI9TAe80pLWN2g/HU= github.com/imdario/mergo v0.3.12/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= +github.com/influxdata/influxdb1-client v0.0.0-20191209144304-8bf82d3c094d/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo= github.com/j-keck/arping v0.0.0-20160618110441-2cf9dc699c56/go.mod h1:ymszkNOg6tORTn+6F6j+Jc8TOr5osrynvN6ivFWZ2GA= github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 h1:BQSFePA1RWJOlocH6Fxy8MmwDt+yVQYULKfN0RoTN8A= github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99/go.mod h1:1lJo3i6rXxKeerYnT8Nvf0QmHCRC1n8sfWVwXF2Frvo= @@ -729,6 +795,7 @@ github.com/jinzhu/copier v0.0.0-20190924061706-b57f9002281a h1:zPPuIq2jAWWPTrGt7 github.com/jinzhu/copier v0.0.0-20190924061706-b57f9002281a/go.mod h1:yL958EeXv8Ylng6IfnvG4oflryUi3vgA3xPs9hmII1s= github.com/jmespath/go-jmespath v0.0.0-20160202185014-0b12d6b521d8/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= github.com/jmespath/go-jmespath v0.0.0-20160803190731-bd40a432e4c7/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= +github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= github.com/jmespath/go-jmespath v0.3.0/go.mod h1:9QtRXoHjLGCJ5IBSaohpXITPlowMeeYCZ7fLUTSywik= github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg= github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= @@ -743,6 +810,7 @@ github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFF github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.8/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= @@ -804,10 +872,17 @@ github.com/lib/pq v1.10.0 h1:Zx5DJFEYQXio93kgXnQ09fXNiUKsqv4OUEu2UtGcB1E= github.com/lib/pq v1.10.0/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= github.com/liggitt/tabwriter v0.0.0-20181228230101-89fcab3d43de h1:9TO3cAIGXtEhnIaL+V+BEER86oLrvS+kWobKpbJuye0= github.com/liggitt/tabwriter v0.0.0-20181228230101-89fcab3d43de/go.mod h1:zAbeS9B/r2mtpb6U+EI2rYA5OAXxsYw6wTamcNW+zcE= +github.com/lightstep/lightstep-tracer-common/golang/gogo v0.0.0-20190605223551-bc2310a04743/go.mod h1:qklhhLq1aX+mtWk9cPHPzaBjWImj5ULL6C7HFJtXQMM= +github.com/lightstep/lightstep-tracer-go v0.18.1/go.mod h1:jlF1pusYV4pidLvZ+XD0UBX0ZE6WURAspgAczcDHrL4= github.com/lithammer/dedent v1.1.0/go.mod h1:jrXYCQtgg0nJiN+StA2KgR7w6CiQNv9Fd/Z9BP0jIOc= +github.com/lucasb-eyer/go-colorful v1.0.3/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0= +github.com/lucasb-eyer/go-colorful v1.2.0 h1:1nnpGOrhyZZuNyfu1QjKiUICQ74+3FNCN69Aj6K7nkY= +github.com/lucasb-eyer/go-colorful v1.2.0/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0= github.com/lyft/protoc-gen-star v0.5.3/go.mod h1:V0xaHgaf5oCCqmcxYcWiDfTiKsZsRc87/1qhoTACD8w= +github.com/lyft/protoc-gen-validate v0.0.13/go.mod h1:XbGvPuh87YZc5TdIa2/I4pLk0QoUACkjt2znoq26NVQ= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= +github.com/magiconair/properties v1.8.5 h1:b6kJs+EmPFMYGkow9GiUyCyOvIwYetYJ3fSaWak/Gls= github.com/magiconair/properties v1.8.5/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= @@ -832,6 +907,7 @@ github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope github.com/mattn/go-colorable v0.1.12 h1:jF+Du6AlPIjs2BiUiQlKOX0rt3SujHxPnksPKZbaA40= github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= +github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84= github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE= @@ -839,8 +915,11 @@ github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Ky github.com/mattn/go-isatty v0.0.14 h1:yVuAays6BHfxijgZPzw+3Zlu5yQgKGP2/hcQbHb7S9Y= github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= github.com/mattn/go-oci8 v0.1.1/go.mod h1:wjDx6Xm9q7dFtHJvIlrI99JytznLw5wQ4R+9mNXJwGI= +github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= github.com/mattn/go-runewidth v0.0.7/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= +github.com/mattn/go-runewidth v0.0.10/go.mod h1:RAqKPSqVFrSLVXbA8x7dzmKdmGzieGRCM46jaSJTDAk= +github.com/mattn/go-runewidth v0.0.12/go.mod h1:RAqKPSqVFrSLVXbA8x7dzmKdmGzieGRCM46jaSJTDAk= github.com/mattn/go-runewidth v0.0.13 h1:lTGmDsbAYt5DmK6OnoV7EuIF1wEIFAcxld6ypU4OSgU= github.com/mattn/go-runewidth v0.0.13/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= github.com/mattn/go-shellwords v1.0.3/go.mod h1:3xCvwCdWdlDJUrvuMn7Wuy9eWs4pE8vqg+NOMyg4B2o= @@ -918,18 +997,29 @@ github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8m github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw= +github.com/nats-io/jwt v0.3.0/go.mod h1:fRYCDE99xlTsqUzISS1Bi75UBJ6ljOJQOAAu5VglpSg= +github.com/nats-io/jwt v0.3.2/go.mod h1:/euKqTS1ZD+zzjYrY7pseZrTtWQSjujC7xjPc8wL6eU= +github.com/nats-io/nats-server/v2 v2.1.2/go.mod h1:Afk+wRZqkMQs/p45uXdrVLuab3gwv3Z8C4HTBu8GD/k= +github.com/nats-io/nats.go v1.9.1/go.mod h1:ZjDU1L/7fJ09jvUSRVBR2e7+RnLiiIQyqyzEE/Zbp4w= +github.com/nats-io/nkeys v0.1.0/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= +github.com/nats-io/nkeys v0.1.3/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= +github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= github.com/ncw/swift v1.0.47/go.mod h1:23YIA4yWVnGwv2dQlN4bB7egfYX6YLn0Yo/S6zZO/ZM= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= github.com/nwaples/rardecode v1.1.0 h1:vSxaY8vQhOcVr4mm5e8XllHWTiM4JF507A0Katqw7MQ= github.com/nwaples/rardecode v1.1.0/go.mod h1:5DzqNKiOdpKKBH87u8VlvAnPZMXcGRhxWkRpHbbfGS0= github.com/nxadm/tail v1.4.4 h1:DQuhQpB1tVlglWS2hLQ5OV6B5r8aGxSrPc5Qo6uTN78= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= +github.com/oklog/oklog v0.3.2/go.mod h1:FCV+B7mhrz4o+ueLpx+KqkyXRGMWOYEvfiXtdGtbWGs= +github.com/oklog/run v1.0.0/go.mod h1:dlhp/R75TPv97u0XWUtDeV/lRKWPKSdTuV0TZvrmrQA= github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= +github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= github.com/olekukonko/tablewriter v0.0.4/go.mod h1:zq6QwlOf5SlnkVbMSr5EoBv3636FWnp+qbPhuoO21uA= github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= github.com/onsi/ginkgo v0.0.0-20151202141238-7f8ab55aaf3b/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.10.1/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.10.3/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= @@ -937,11 +1027,13 @@ github.com/onsi/ginkgo v1.14.0 h1:2mOpI4JVVPBN+WQRa0WKH2eXR+Ey+uK4n7Zj0aYpIQA= github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= github.com/onsi/gomega v0.0.0-20151007035656-2152b45fa28a/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= +github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= github.com/onsi/gomega v1.10.3 h1:gph6h/qe9GSUw1NhH1gp+qb+h8rXD8Cy60Z32Qw3ELA= github.com/onsi/gomega v1.10.3/go.mod h1:V9xEwhxec5O8UDM77eCW8vLymOMltsqPVYWrpDsH8xc= +github.com/op/go-logging v0.0.0-20160315200505-970db520ece7/go.mod h1:HzydrMdWErDVzsI23lYNej1Htcns9BCg93Dk0bBINWk= github.com/opencontainers/go-digest v0.0.0-20170106003457-a6d0ee40d420/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= github.com/opencontainers/go-digest v0.0.0-20180430190053-c9281466c8b2/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= github.com/opencontainers/go-digest v1.0.0-rc1/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= @@ -968,7 +1060,14 @@ github.com/opencontainers/runtime-tools v0.0.0-20181011054405-1d69bd0f9c39/go.mo github.com/opencontainers/selinux v1.6.0/go.mod h1:VVGKuOLlE7v4PJyT6h7mNWvq1rzqiriPsEqVhc+svHE= github.com/opencontainers/selinux v1.8.0/go.mod h1:RScLhm78qiWa2gbVCcGkC7tCGdgk3ogry1nUQF8Evvo= github.com/opencontainers/selinux v1.8.2/go.mod h1:MUIHuUEvKB1wtJjQdOyYRgOnLD2xAPP8dBsCoU0KuF8= +github.com/opentracing-contrib/go-observer v0.0.0-20170622124052-a52f23424492/go.mod h1:Ngi6UdF0k5OKD5t5wlmGhe/EDKPoUM3BXZSSfIuJbis= +github.com/opentracing/basictracer-go v1.0.0/go.mod h1:QfBfYuafItcjQuMwinw9GhYKwFXS9KnPs5lxoYwgW74= +github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= +github.com/openzipkin-contrib/zipkin-go-opentracing v0.4.5/go.mod h1:/wsWhb9smxSfWAKL3wpBW7V8scJMt8N8gnaMCS9E/cA= +github.com/openzipkin/zipkin-go v0.1.6/go.mod h1:QgAqvLzwWbR/WpD4A3cGpPtJrZXNIiJc5AZX7/PBEpw= +github.com/openzipkin/zipkin-go v0.2.1/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4= +github.com/openzipkin/zipkin-go v0.2.2/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4= github.com/oracle/oci-go-sdk v7.1.0+incompatible/go.mod h1:VQb79nF8Z2cwLkLS35ukwStZIg5F66tcBccjip/j888= github.com/otiai10/copy v1.7.0 h1:hVoPiN+t+7d2nzzwMiDHPSOogsWAStewq3TwU05+clE= github.com/otiai10/copy v1.7.0/go.mod h1:rmRl6QPdJj6EiUqXQ/4Nn2lLXoNQjFCQbbNrxgc/t3U= @@ -977,16 +1076,24 @@ github.com/otiai10/curr v1.0.0/go.mod h1:LskTG5wDwr8Rs+nNQ+1LlxRjAtTZZjtJW4rMXl6 github.com/otiai10/mint v1.3.0/go.mod h1:F5AjcsTsWUqX+Na9fpHb52P8pcRX2CI6A3ctIT91xUo= github.com/otiai10/mint v1.3.3 h1:7JgpsBaN0uMkyju4tbYHu0mnM55hNKVYLsXmwr15NQI= github.com/otiai10/mint v1.3.3/go.mod h1:/yxELlJQ0ufhjUwhshSj+wFjZ78CnZ48/1wtmBH1OTc= +github.com/pact-foundation/pact-go v1.0.4/go.mod h1:uExwJY4kCzNPcHRj+hCR/HBbOOIwwtUjcrb0b5/5kLM= github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= +github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= github.com/pelletier/go-toml v1.8.1/go.mod h1:T2/BmBdy8dvIRq1a/8aqjN41wvWlN4lrapLU/GW4pbc= github.com/pelletier/go-toml v1.9.3/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= github.com/pelletier/go-toml v1.9.4/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= +github.com/performancecopilot/speed v3.0.0+incompatible/go.mod h1:/CLtqpZ5gBg1M9iaPbIdPPGyKcA8hKdoy6hAWba7Yac= github.com/peterbourgon/diskv v2.0.1+incompatible h1:UBdAOUP5p4RWqPBg048CAvpKN+vxiaj6gdUUzhl4XmI= github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= +github.com/petergtz/pegomock v2.9.0+incompatible h1:BKfb5XfkJfehe5T+O1xD4Zm26Sb9dnRj7tHxLYwUPiI= +github.com/petergtz/pegomock v2.9.0+incompatible/go.mod h1:nuBLWZpVyv/fLo56qTwt/AUau7jgouO1h7bEvZCq82o= github.com/phayes/freeport v0.0.0-20180830031419-95f893ade6f2 h1:JhzVVoYvbOACxoUmOs6V/G4D5nPVUW73rKvXxP4XUJc= github.com/phayes/freeport v0.0.0-20180830031419-95f893ade6f2/go.mod h1:iIss55rKnNBTvrwdmkUpLnDpZoAHvWaiq5+iMmen4AE= +github.com/pierrec/lz4 v1.0.2-0.20190131084431-473cd7ce01a1/go.mod h1:3/3N9NVKO0jef7pBehbT1qWhCMrIgbYNnFAZCqQ5LRc= +github.com/pierrec/lz4 v2.0.5+incompatible h1:2xWsjqPFWcplujydGg4WmhC/6fZqK42wMM8aXeqhl0I= +github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= github.com/pierrec/lz4/v4 v4.1.2 h1:qvY3YFXRQE/XB8MlLzJH7mSzBs74eA2gg52YTk6jUPM= github.com/pierrec/lz4/v4 v4.1.2/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= @@ -994,6 +1101,7 @@ github.com/pkg/errors v0.8.1-0.20171018195549-f15c970de5b7/go.mod h1:bwawxfHBFNV github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/profile v1.2.1/go.mod h1:hJw3o1OdXxsrSjjVksARp5W95eeEaEfptyVZyv6JUPA= github.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZI= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= @@ -1004,30 +1112,39 @@ github.com/pquerna/otp v1.2.0 h1:/A3+Jn+cagqayeR3iHs/L62m5ue7710D35zl1zJ1kok= github.com/pquerna/otp v1.2.0/go.mod h1:dkJfzwRKNiegxyNb54X/3fLwhCynbMspSyWKnvi1AEg= github.com/prometheus/client_golang v0.0.0-20180209125602-c332b6f63c06/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= +github.com/prometheus/client_golang v0.9.3-0.20190127221311-3c4408c8b829/go.mod h1:p2iRAGwDERtqlqzRXnrOVns+ignqQo//hLXqYxZYVNs= github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= github.com/prometheus/client_golang v1.1.0/go.mod h1:I1FGZT9+L76gKKOs5djB6ezCbFQP1xR9D75/vuwEF3g= +github.com/prometheus/client_golang v1.3.0/go.mod h1:hJaj2vgQTGQmVCsAACORcieXFeDPbaTKGT+JTgUa3og= github.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU= github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= +github.com/prometheus/client_golang v1.10.0/go.mod h1:WJM3cc3yu7XKBKa/I8WeZm+V3eltZnBwfENSU7mdogU= github.com/prometheus/client_golang v1.11.0 h1:HNkLOAEQMIDv/K+04rukrLx6ch7msSRwf3/SASFAGtQ= github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= github.com/prometheus/client_model v0.0.0-20171117100541-99fa1f4be8e5/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= +github.com/prometheus/client_model v0.0.0-20190115171406-56726106282f/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.1.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.2.0 h1:uq5h0d+GuxiXLJLNABMgp2qUWDPiLvgCzz2dUR+/W/M= github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/common v0.0.0-20180110214958-89604d197083/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= +github.com/prometheus/common v0.2.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.6.0/go.mod h1:eBmuwkDJBwy6iBfxCBob6t6dR6ENT/y+J+Zk0j9GMYc= +github.com/prometheus/common v0.7.0/go.mod h1:DjGbpBbp5NYNiECxcL/VnbXCCaQpKd3tt26CguLLsqA= github.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4= github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= +github.com/prometheus/common v0.18.0/go.mod h1:U+gB1OBLb1lF3O42bTCL+FK18tX9Oar16Clt/msog/s= github.com/prometheus/common v0.26.0 h1:iMAkS2TDoNWnKM+Kopnx/8tnEStIfpYA0ur0xQzzhMQ= github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= github.com/prometheus/procfs v0.0.0-20180125133057-cb4147076ac7/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= +github.com/prometheus/procfs v0.0.0-20190117184657-bf6a532e95b1/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/procfs v0.0.0-20190522114515-bc1a522cf7b1/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= @@ -1044,6 +1161,10 @@ github.com/pterm/pterm v0.12.30/go.mod h1:MOqLIyMOgmTDz9yorcYbcw+HsgoZo3BQfg2wtl github.com/pterm/pterm v0.12.31/go.mod h1:32ZAWZVXD7ZfG0s8qqHXePte42kdz8ECtRyEejaWgXU= github.com/pterm/pterm v0.12.33 h1:XiT50Pvdqn5O8FAiIqZMpXP6NkVEcmlUa+mkA1yWVCg= github.com/pterm/pterm v0.12.33/go.mod h1:x+h2uL+n7CP/rel9+bImHD5lF3nM9vJj80k9ybiiTTE= +github.com/rakyll/hey v0.1.4 h1:hhc8GIqHN4+rPFZvkM9lkCQGi7da0sINM83xxpFkbPA= +github.com/rakyll/hey v0.1.4/go.mod h1:nAOTOo+L52KB9SZq/M6J18kxjto4yVtXQDjU2HgjUPI= +github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= +github.com/rivo/uniseg v0.1.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rivo/uniseg v0.2.0 h1:S1pD9weZBuJdFmowNwbpi7BJ8TNftyUImj/0WQi72jY= github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= @@ -1051,6 +1172,11 @@ github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6L github.com/rogpeppe/go-charset v0.0.0-20180617210344-2471d30d28b4/go.mod h1:qgYeAmZ5ZIpBWTGllZSQnw97Dj+woV0toclVaRGI8pc= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.5.2/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= +github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= +github.com/rs/xid v1.3.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= +github.com/rs/zerolog v1.18.0/go.mod h1:9nvC1axdVrAHcu/s9taAVfBuIdTZLVQmKQyvrUjF5+I= +github.com/rs/zerolog v1.26.0 h1:ORM4ibhEZeTeQlCojCK2kPz1ogAY4bGs4tD+SaAdGaE= +github.com/rs/zerolog v1.26.0/go.mod h1:yBiM87lvSqX8h0Ww4sdzNSkVYZ8dL2xjZJG1lAuGZEo= github.com/rubenv/sql-migrate v0.0.0-20210614095031-55d5740dbbcc h1:BD7uZqkN8CpjJtN/tScAKiccBikU4dlqe/gNrkRaPY4= github.com/rubenv/sql-migrate v0.0.0-20210614095031-55d5740dbbcc/go.mod h1:HFLT6i9iR4QBOF5rdCyjddC9t59ArqWJV2xx+jwcCMo= github.com/russross/blackfriday v1.5.2 h1:HyvC0ARfnZBqnXwABFeSZHpKvJHJJfPz81GNueLj0oo= @@ -1061,6 +1187,9 @@ github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQD github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= github.com/safchain/ethtool v0.0.0-20190326074333-42ed695e3de8/go.mod h1:Z0q5wiBQGYcxhMZ6gUqHn6pYNLypFAvaL3UvgZLR0U4= github.com/sagikazarmark/crypt v0.3.0/go.mod h1:uD/D+6UF4SrIR1uGEv7bBNkNqLGqUr43MRiaGWX1Nig= +github.com/sahilm/fuzzy v0.1.0 h1:FzWGaw2Opqyu+794ZQ9SYifWv2EIXpwP4q8dY1kDAwI= +github.com/sahilm/fuzzy v0.1.0/go.mod h1:VFvziUEIMCrT6A6tw2RFIXPXXmzXbOsSHF0DOI8ZK9Y= +github.com/samuel/go-zookeeper v0.0.0-20190923202752-2cc03de413da/go.mod h1:gi+0XIa01GRL2eRQVjQkKGqKF3SF9vZR/HnPullcV2E= github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= github.com/sebdah/goldie v1.0.0/go.mod h1:jXP4hmWywNEwZzhMuv2ccnqTSFpuq8iyQhtQdkkZBH4= @@ -1085,6 +1214,7 @@ github.com/smartystreets/goconvey v0.0.0-20190330032615-68dc04aab96a/go.mod h1:s github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= github.com/soheilhy/cmux v0.1.5/go.mod h1:T7TcVDs9LWfQgPlPsdngu6I6QIoyIFZDDC6sNE1GqG0= +github.com/sony/gobreaker v0.4.1/go.mod h1:ZKptC7FHNvhBz7dN2LGjPVBz2sZJmc0/PkyDJOjmxWY= github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= @@ -1098,6 +1228,7 @@ github.com/spf13/cobra v0.0.2-0.20171109065643-2da4a54c5cee/go.mod h1:1l0Ry5zgKv github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= github.com/spf13/cobra v0.0.6/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE= github.com/spf13/cobra v1.0.0/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE= +github.com/spf13/cobra v1.1.1/go.mod h1:WnodtKOvamDL/PwE2M4iKs8aMDBZ5Q5klgD3qfVJQMI= github.com/spf13/cobra v1.1.3/go.mod h1:pGADOWyqRD/YMrPZigI/zbliZ2wVD/23d+is3pSWzOo= github.com/spf13/cobra v1.2.1/go.mod h1:ExllRjgxM/piMAM+3tAZvg8fsklGAf3tPfi+i8t68Nk= github.com/spf13/cobra v1.3.0 h1:R7cSvGu+Vv+qX0gW5R/85dx2kmmJT5z5NM8ifdYjdn0= @@ -1106,6 +1237,7 @@ github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb6 github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= github.com/spf13/pflag v0.0.0-20170130214245-9ff6c6923cff/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.1-0.20171106142849-4c012f6dcd95/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= +github.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.2/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= @@ -1116,6 +1248,9 @@ github.com/spf13/viper v1.8.1/go.mod h1:o0Pch8wJ9BVSWGQMbra6iw0oQ5oktSIBaujf1rJH github.com/spf13/viper v1.10.0/go.mod h1:SoyBPwAtKDzypXNDFKN5kzH7ppppbGZtls1UpIy5AsM= github.com/stefanberger/go-pkcs11uri v0.0.0-20201008174630-78d3cae3a980/go.mod h1:AO3tvPzVZ/ayst6UlUKUv6rcPQInYe3IknH3jYhAKu8= github.com/stoewer/go-strcase v1.2.0/go.mod h1:IBiWB2sKIp3wVVQ3Y035++gc+knqhUQag1KpM8ahLw8= +github.com/streadway/amqp v0.0.0-20190404075320-75d898a42a94/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= +github.com/streadway/amqp v0.0.0-20190827072141-edfb9018d271/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= +github.com/streadway/handy v0.0.0-20190108123426-d5acb3125c2a/go.mod h1:qNTQ5P5JnDBl6z3cMAg/SywNDC5ABu5ApDIw6lUbRmI= github.com/stretchr/objx v0.0.0-20180129172003-8a3f7159479f/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= @@ -1136,6 +1271,7 @@ github.com/syndtr/gocapability v0.0.0-20170704070218-db04d3cc01c8/go.mod h1:hkRG github.com/syndtr/gocapability v0.0.0-20180916011248-d98352740cb2/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= github.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= github.com/tchap/go-patricia v2.2.6+incompatible/go.mod h1:bmLyhP68RS6kStMGxByiQ23RP/odRBOTVjwp2cDyi6I= +github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= github.com/tmc/grpc-websocket-proxy v0.0.0-20201229170055-e5319fda7802/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= github.com/tmccombs/hcl2json v0.3.3 h1:+DLNYqpWE0CsOQiEZu+OZm5ZBImake3wtITYxQ8uLFQ= @@ -1146,6 +1282,7 @@ github.com/ulikunitz/xz v0.5.8/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oW github.com/ulikunitz/xz v0.5.9 h1:RsKRIA2MO8x56wkkcd3LbtcE/uMszhb6DpRf+3uwa3I= github.com/ulikunitz/xz v0.5.9/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14= github.com/urfave/cli v0.0.0-20171014202726-7bc6a0acffa5/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= +github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= github.com/urfave/cli v1.22.2/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= github.com/urfave/cli v1.22.4 h1:u7tSpNPPswAFymm8IehJhy4uJMlUuU/GmqSkvJ1InXA= @@ -1185,6 +1322,7 @@ github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9de github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yuin/goldmark v1.4.0/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= github.com/yvasiyarov/go-metrics v0.0.0-20140926110328-57bccd1ccd43 h1:+lm10QQTNSBd8DVTNGHx7o/IKu9HYDvLMffDhbyLccI= github.com/yvasiyarov/go-metrics v0.0.0-20140926110328-57bccd1ccd43/go.mod h1:aX5oPXxHm3bOH+xeAttToC8pqch2ScQN/JoXYupl6xs= @@ -1198,12 +1336,14 @@ github.com/zclconf/go-cty v1.8.0/go.mod h1:vVKLxnk3puL4qRAv72AO+W99LUD4da90g3uUA github.com/zclconf/go-cty v1.8.1 h1:SI0LqNeNxAgv2WWqWJMlG2/Ad/6aYJ7IVYYMigmfkuI= github.com/zclconf/go-cty v1.8.1/go.mod h1:vVKLxnk3puL4qRAv72AO+W99LUD4da90g3uUAzyuvAk= github.com/zclconf/go-cty-debug v0.0.0-20191215020915-b22d67c1ba0b/go.mod h1:ZRKQfBXbGkpdV6QMzT3rU1kSTAnfu1dO8dPKjYprgj8= +github.com/zenazn/goji v0.9.0/go.mod h1:7S9M489iMyHBNxwZnk9/EHS098H4/F6TATF2mIxtB1Q= github.com/ziutek/mymysql v1.5.4 h1:GB0qdRGsTwQSBVYuVShFBKaXSnSnYYC2d9knnE1LHFs= github.com/ziutek/mymysql v1.5.4/go.mod h1:LMSpPZ6DbqWFxNCHW77HeMg9I646SAhApZ/wKdgO/C0= go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= go.etcd.io/bbolt v1.3.5/go.mod h1:G5EMThwa9y8QZGBClrRx5EY+Yw9kAhnjy3bSjsnlVTQ= go.etcd.io/bbolt v1.3.6/go.mod h1:qXsaaIqmgQH0T+OPdb99Bf+PKfBBQVAdyD6TY9G8XM4= +go.etcd.io/etcd v0.0.0-20191023171146-3cf2f69b5738/go.mod h1:dnLIgRNXwCJa5e+c6mIZCrds/GIG4ncV9HhK5PX7jPg= go.etcd.io/etcd/api/v3 v3.5.0/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs= go.etcd.io/etcd/api/v3 v3.5.1/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs= go.etcd.io/etcd/client/pkg/v3 v3.5.0/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= @@ -1215,6 +1355,8 @@ go.etcd.io/etcd/pkg/v3 v3.5.0/go.mod h1:UzJGatBQ1lXChBkQF0AuAtkRQMYnHubxAEYIrC3M go.etcd.io/etcd/raft/v3 v3.5.0/go.mod h1:UFOHSIvO/nKwd4lhkwabrTD3cqW5yVyYYf/KlD00Szc= go.etcd.io/etcd/server/v3 v3.5.0/go.mod h1:3Ah5ruV+M+7RZr0+Y/5mNLwC+eQlni+mQmOVdCRJoS4= go.mozilla.org/pkcs7 v0.0.0-20200128120323-432b2356ecb1/go.mod h1:SNgMg+EgDFwmvSmLRTNKC5fegJjB7v23qTQ0XLGUNHk= +go.opencensus.io v0.20.1/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= +go.opencensus.io v0.20.2/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= @@ -1237,12 +1379,17 @@ go.opentelemetry.io/otel/trace v0.20.0/go.mod h1:6GjCW8zgDjwGHGa6GkyeB8+/5vjT16g go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= go.starlark.net v0.0.0-20200306205701-8dd3e2ee1dd5 h1:+FNtrFTmVw0YZGpBGX56XDee331t6JAXeK2bcyhLOOc= go.starlark.net v0.0.0-20200306205701-8dd3e2ee1dd5/go.mod h1:nmDLcffg48OtT/PSW0Hg7FvpRQsQh5OSqIylirxKC7o= +go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= +go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= +go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= +go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= +go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM= go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo= golang.org/x/crypto v0.0.0-20171113213409-9f005a07e0d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= @@ -1315,11 +1462,13 @@ golang.org/x/net v0.0.0-20180811021610-c39426892332/go.mod h1:mL1N/T3taQHkDXs73r golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181011144130-49bb7cea24b1/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181017193950-04a2e542c03f/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190125091013-d26f9f9a57f3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= @@ -1332,6 +1481,7 @@ golang.org/x/net v0.0.0-20190619014844-b5b0513f8c1b/go.mod h1:z5CRVTTTmAJ677TzLL golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20191004110552-13f9640d40b9/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= @@ -1358,6 +1508,7 @@ golang.org/x/net v0.0.0-20201202161906-c7110b5ffcbb/go.mod h1:sp8m0HH+o8qH0wwXwY golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210224082022-3d97a244fca7/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= golang.org/x/net v0.0.0-20210326060303-6b1517762897/go.mod h1:uSPa2vr4CLtc/ILN5odXGNXS6mhrKVzTaCXzk9m6W3k= @@ -1366,6 +1517,7 @@ golang.org/x/net v0.0.0-20210410081132-afb366fc7cd1/go.mod h1:9tjilg8BloeKEkVJvy golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210614182718-04defd469f4e/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210813160813-60bc85c4be6d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211209124913-491a49abca63/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= @@ -1409,6 +1561,7 @@ golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5h golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181122145206-62eef0e2fa9b/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -1427,6 +1580,7 @@ golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190801041406-cbf593c0f2f3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190812073006-9eafafc0a87e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -1441,6 +1595,7 @@ golang.org/x/sys v0.0.0-20191115151921-52ab43148777/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191210023423-ac6580df4449/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191220142924-d4481acd189f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -1483,6 +1638,7 @@ golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210309074719-68d13333faf2/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210324051608-47abb6519492/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -1499,6 +1655,7 @@ golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210816183151-1e6c022a8912/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210908233432-aa78b53d3365/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -1506,13 +1663,16 @@ golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211013075003-97ac67df715c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211025201205-69cdffdb9359/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211124211545-fe61309f8881/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211205182925-97ca703d548d/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e h1:fLOSk5Q00efkSvAm+4xcoXD+RRmLmmulPn5I3Y9F2EM= golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/term v0.0.0-20201210144234-2321bbc49cbf/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210220032956-6a3ed077a48d/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/term v0.0.0-20210406210042-72f3dc4e9b72/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210503060354-a79de5458b56/go.mod h1:tfny5GFUkzUvx4ps4ajbZsCe5lw1metzhBm9T3x7oIY= golang.org/x/term v0.0.0-20210615171337-6886f2dfbf5b/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211 h1:JGgROgKl9N8DuW20oFS5gxc+lE67/N3FcwmBPMe7ArY= @@ -1527,6 +1687,7 @@ golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= @@ -1534,6 +1695,7 @@ golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba/go.mod h1:tRJNPiyCQ0inRvYxb golang.org/x/time v0.0.0-20210723032227-1f47c861a9ac h1:7zkz7BUtwNFFqcowJ+RIgu2MaV/MapERkDIy+mwPyjs= golang.org/x/time v0.0.0-20210723032227-1f47c861a9ac/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= @@ -1550,9 +1712,12 @@ golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgw golang.org/x/tools v0.0.0-20190624222133-a101b041ded4/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20190828213141-aed303cbaa74/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191108193012-7d206e10da11/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= @@ -1563,6 +1728,7 @@ golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtn golang.org/x/tools v0.0.0-20191216052735-49a3e744a425/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200103221440-774c71fcf114/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= @@ -1596,6 +1762,7 @@ golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.7/go.mod h1:LGqMHiF4EqQNHR1JncWGqT5BVaXmza+X+BDGol+dOxo= golang.org/x/tools v0.1.8/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -1603,6 +1770,7 @@ golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8T golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= google.golang.org/api v0.0.0-20160322025152-9bf6e6e569ff/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0= +google.golang.org/api v0.3.1/go.mod h1:6wY9I6uQWHQ8EM57III9mq/AjF+i8G65rmVagqKMtkk= google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= @@ -1637,6 +1805,7 @@ google.golang.org/api v0.59.0/go.mod h1:sT2boj7M9YJxZzgeZqXogmhfmRWDtPzT31xkieUb google.golang.org/api v0.61.0/go.mod h1:xQRti5UdCmoCEqFxcz93fTl338AVqDgyaDRuOZ3hg9I= google.golang.org/api v0.62.0/go.mod h1:dKmwPCydfsad4qCH08MSdgWjfHOyfpd4VtDGgRFdavw= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= +google.golang.org/appengine v1.2.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= @@ -1651,6 +1820,7 @@ google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRn google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190522204451-c2c4e71fbf69/go.mod h1:z3L6/3dTEVtUr6QSP8miRzeRqwQOioJ9I66odjN4I7s= +google.golang.org/genproto v0.0.0-20190530194941-fb225487d101/go.mod h1:z3L6/3dTEVtUr6QSP8miRzeRqwQOioJ9I66odjN4I7s= google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= @@ -1714,10 +1884,13 @@ google.golang.org/genproto v0.0.0-20211206160659-862468c7d6e0/go.mod h1:5CzLGKJ6 google.golang.org/genproto v0.0.0-20211208223120-3a66f561d7aa h1:I0YcKz0I7OAhddo7ya8kMnvprhcWM045PmkBdMO9zN0= google.golang.org/genproto v0.0.0-20211208223120-3a66f561d7aa/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= google.golang.org/grpc v0.0.0-20160317175043-d3ddb4469d5a/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= +google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= +google.golang.org/grpc v1.20.0/go.mod h1:chYK+tFQF0nDUGJgXMSgLCQk3phJEuONr2DCgLDdAQM= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= +google.golang.org/grpc v1.22.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.23.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.24.0/go.mod h1:XDChyiUovWa60DnaeDeZmSW86xtLtjtZbwvSiRnRtcA= @@ -1770,8 +1943,10 @@ gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8 gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/cheggaaa/pb.v1 v1.0.25/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= +gopkg.in/gcfg.v1 v1.2.3/go.mod h1:yesOnuUOFQAhST5vPY4nbZsb/huCgGGXlipJsBn0b3o= gopkg.in/gemnasium/logrus-airbrake-hook.v2 v2.1.2/go.mod h1:Xk6kEKp8OKb+X14hQBKWaSkCsqBpgog8nAV2xsGOxlo= gopkg.in/gorp.v1 v1.7.2 h1:j3DWlAyGVv8whO7AcIWznQ2Yj7yJkn34B8s63GViAAw= gopkg.in/gorp.v1 v1.7.2/go.mod h1:Wo3h+DBQZIxATwftsglhdD/62zRFPhGhTiu5jUJmCaw= @@ -1808,8 +1983,10 @@ gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81 gotest.tools/v3 v3.0.2/go.mod h1:3SzNCllyD9/Y+b5r9JIKQ474KzkZyqLqEfYqMsX94Bk= gotest.tools/v3 v3.0.3 h1:4AuOwCGf4lLR9u3YOe2awrHygurzhO/HeQ6laiA6Sx0= gotest.tools/v3 v3.0.3/go.mod h1:Z7Lb0S5l+klDB31fvDQX8ss/FlKDxtlFlw3Oa8Ymbl8= +helm.sh/helm/v3 v3.7.1/go.mod h1:3eOeBD3Z+O/ELiuu19zynZSN8jP1ErXLuyP21SZeMq8= helm.sh/helm/v3 v3.7.2 h1:xn1OxcZEpgKpp4CCpPz1KKUyb9gAtTouXV2E3S8ChYQ= helm.sh/helm/v3 v3.7.2/go.mod h1:UXuiAn0+FfBpqbiMuwWt8/aAKkfJvnWLBJ6f4HcFs0M= +honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= @@ -1840,6 +2017,7 @@ k8s.io/klog/v2 v2.0.0/go.mod h1:PBfzABfn139FHAV07az/IF9Wp1bkk3vpT2XSJ76fSDE= k8s.io/klog/v2 v2.2.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y= k8s.io/klog/v2 v2.4.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y= k8s.io/klog/v2 v2.9.0/go.mod h1:hy9LJ/NvuK+iVyP4Ehqva4HxZG/oXyIS3n3Jmire4Ec= +k8s.io/klog/v2 v2.30.0/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= k8s.io/klog/v2 v2.40.1 h1:P4RRucWk/lFOlDdkAr3mc7iWFkgKrZY9qZMAgek06S4= k8s.io/klog/v2 v2.40.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= k8s.io/kube-openapi v0.0.0-20210421082810-95288971da7e/go.mod h1:vHXdDvt9+2spS2Rx9ql3I8tycm3H9FDfdUoIuKCefvw= @@ -1848,6 +2026,7 @@ k8s.io/kube-openapi v0.0.0-20211109043538-20434351676c/go.mod h1:vHXdDvt9+2spS2R k8s.io/kubectl v0.22.5 h1:diivOcs6dyDjpBqOpy9iiI3srZnW1khJDWwsFSapFt8= k8s.io/kubectl v0.22.5/go.mod h1:uwKSKhaC6HOwnbk1cVLxVPYwfvazj9x06oZAOsL43N8= k8s.io/kubernetes v1.13.0/go.mod h1:ocZa8+6APFNC2tX1DZASIbocyYT5jHzqFVsY5aoB7Jk= +k8s.io/metrics v0.22.5 h1:2wNbA+Pk00Y+eJrfToksvckirugfbdWm3HQinwqDQFw= k8s.io/metrics v0.22.5/go.mod h1:dCqOkoZQWLSfBhUtPFMiDrzJaPtXJlVePVuJbEx0hW8= k8s.io/utils v0.0.0-20201110183641-67b214c5f920/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= k8s.io/utils v0.0.0-20210819203725-bdf08cb9a70a h1:8dYfu/Fc9Gz2rNJKB9IQRGgQOh2clmRzNIPPY1xLY5g= @@ -1869,5 +2048,8 @@ sigs.k8s.io/kustomize/kyaml v0.11.0/go.mod h1:GNMwjim4Ypgp/MueD3zXHLRJEjz7RvtPae sigs.k8s.io/structured-merge-diff/v4 v4.0.2/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= sigs.k8s.io/structured-merge-diff/v4 v4.1.2 h1:Hr/htKFmJEbtMgS/UD0N+gtgctAqz81t3nu+sPzynno= sigs.k8s.io/structured-merge-diff/v4 v4.1.2/go.mod h1:j/nl6xW8vLS49O8YvXW1ocPhZawJtm+Yrr7PPRQ0Vg4= -sigs.k8s.io/yaml v1.2.0 h1:kr/MCeFWJWTwyaHoR9c8EjH9OumOmoF9YGiZd7lFm/Q= +sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= +sigs.k8s.io/yaml v1.3.0 h1:a2VclLzOGrwOHDiV8EfBGhvjHvP46CtW5j6POvhYGGo= +sigs.k8s.io/yaml v1.3.0/go.mod h1:GeOyir5tyXNByN85N/dRIT9es5UQNerPYEKK56eTBm8= +sourcegraph.com/sourcegraph/appdash v0.0.0-20190731080439-ebfcffb1b5c0/go.mod h1:hI742Nqp5OhwiqlzhgfbWU4mW4yO10fP+LoT9WOswdU= diff --git a/zarf.yaml b/zarf.yaml index 2839112e0f..942c25514a 100644 --- a/zarf.yaml +++ b/zarf.yaml @@ -4,19 +4,6 @@ seed: - library/registry:2.7.1 components: - - name: management - description: "Add the K9s terminal-based K8s UI for cluster management" - default: true - files: - # The zarf binary is hosted on govcloud since the release on https://github.com/derailed/k9s/ is a tarball - - source: https://zarf-public.s3-us-gov-west-1.amazonaws.com/k9s_Linux_x86_64_v0_24_11 - shasum: 18a5a33bbf58cb228e56a03380dcb6b9bb8624acab4ff63deb7364dc15d3c03f - target: /usr/local/bin/k9s - executable: true - # Simple theme file to make K9s colors similar to Zarfs UI colors - - source: assets/misc/k9s-theme.yaml - target: /root/.k9s/skin.yml - - name: k3s description: > *** REQUIRES ROOT *** From 09d50ffa9573aa02936306df4991a59425cedfe3 Mon Sep 17 00:00:00 2001 From: Jeff McCoy Date: Fri, 21 Jan 2022 18:49:20 -0600 Subject: [PATCH 05/88] small cli UX cleanup --- cli/cmd/root.go | 2 +- cli/internal/helm/destroy.go | 3 ++- cli/internal/images/push.go | 12 ++++++++---- cli/internal/k8s/namespace.go | 2 +- cli/internal/k8s/secrets.go | 3 ++- cli/internal/message/spinner.go | 2 ++ 6 files changed, 16 insertions(+), 8 deletions(-) diff --git a/cli/cmd/root.go b/cli/cmd/root.go index 63d08da88f..cbfa9d34e1 100644 --- a/cli/cmd/root.go +++ b/cli/cmd/root.go @@ -32,7 +32,7 @@ var rootCmd = &cobra.Command{ Args: cobra.MaximumNArgs(1), Run: func(cmd *cobra.Command, args []string) { if len(args) > 0 { - if strings.Contains(args[0], "zarf-package-") { + if strings.Contains(args[0], "zarf-package-") || strings.Contains(args[0], "zarf-init") { config.DeployOptions.PackagePath = args[0] packager.Deploy() return diff --git a/cli/internal/helm/destroy.go b/cli/internal/helm/destroy.go index 94830a6a60..1153383844 100644 --- a/cli/internal/helm/destroy.go +++ b/cli/internal/helm/destroy.go @@ -7,7 +7,7 @@ import ( ) func Destroy() { - spinner := message.NewProgressSpinner("Searching for Zarf-installed charts") + spinner := message.NewProgressSpinner("Removing Zarf-installed charts") defer spinner.Stop() // Initially load the actionConfig without a namespace @@ -52,4 +52,5 @@ func Destroy() { } } + spinner.Success() } diff --git a/cli/internal/images/push.go b/cli/internal/images/push.go index 19fe3160b6..bec8a27bf2 100644 --- a/cli/internal/images/push.go +++ b/cli/internal/images/push.go @@ -9,7 +9,6 @@ import ( ) func PushToZarfRegistry(imageTarballPath string, buildImageList []string, target string) { - // Establish a registry tunnel to send the images if pushing to the zarf registry if target == config.ZarfRegistry { tunnel := k8s.NewZarfTunnel() @@ -17,11 +16,14 @@ func PushToZarfRegistry(imageTarballPath string, buildImageList []string, target defer tunnel.Close() } + spinner := message.NewProgressSpinner("Storing images in the zarf registry") + defer spinner.Stop() + for _, src := range buildImageList { - message.Infof("Updating image %s -> %s", src, target) + spinner.Updatef("Updating image %s", src) img, err := crane.LoadTag(imageTarballPath, src, config.ActiveCranePlatform) if err != nil { - message.Error(err, "Unable to load the image from the update package") + spinner.Errorf(err, "Unable to load the image from the update package") return } @@ -29,7 +31,9 @@ func PushToZarfRegistry(imageTarballPath string, buildImageList []string, target err = crane.Push(img, offlineName, config.ActiveCranePlatform) if err != nil { - message.Error(err, "Unable to push the image to the registry") + spinner.Errorf(err, "Unable to push the image to the registry") } } + + spinner.Success() } diff --git a/cli/internal/k8s/namespace.go b/cli/internal/k8s/namespace.go index 49b95c35ba..55163ad69f 100644 --- a/cli/internal/k8s/namespace.go +++ b/cli/internal/k8s/namespace.go @@ -52,8 +52,8 @@ func DeleteZarfNamespace() { spinner.Fatalf(err, "the Zarf namespace could not be deleted") } + spinner.Updatef("Zarf namespace deletion scheduled, waiting for all resources to be removed") for { - spinner.Updatef("Zarf namespace deletion scheduled, waiting for all resources to be removed") _, err := clientset.CoreV1().Namespaces().Get(context.TODO(), ZarfNamespace, metav1.GetOptions{}) if errors.IsNotFound(err) { spinner.Successf("Zarf removed from this cluster") diff --git a/cli/internal/k8s/secrets.go b/cli/internal/k8s/secrets.go index 75fe0f9ab3..a6dcf4c290 100644 --- a/cli/internal/k8s/secrets.go +++ b/cli/internal/k8s/secrets.go @@ -29,7 +29,7 @@ func GenerateRegistryPullCreds(namespace string) *corev1.Secret { name := "zarf-registry" spinner := message.NewProgressSpinner("Generating private registry credentials %s/%s", namespace, name) - defer spinner.Success() + defer spinner.Stop() secretDockerConfig := &corev1.Secret{ TypeMeta: metav1.TypeMeta{ @@ -71,6 +71,7 @@ func GenerateRegistryPullCreds(namespace string) *corev1.Secret { // Add to the secret data secretDockerConfig.Data[".dockerconfigjson"] = dockerConfigData + spinner.Success() return secretDockerConfig } diff --git a/cli/internal/message/spinner.go b/cli/internal/message/spinner.go index 41a784ec42..2cb1161f99 100644 --- a/cli/internal/message/spinner.go +++ b/cli/internal/message/spinner.go @@ -14,6 +14,8 @@ func NewProgressSpinner(format string, a ...interface{}) *Spinner { text := fmt.Sprintf(format, a...) spinner, _ := pterm.DefaultSpinner. WithRemoveWhenDone(false). + // Src: https://github.com/gernest/wow/blob/master/spin/spinners.go#L335 + WithSequence(` ⠋ `, ` ⠙ `, ` ⠹ `, ` ⠸ `, ` ⠼ `, ` ⠴ `, ` ⠦ `, ` ⠧ `, ` ⠇ `, ` ⠏ `). Start(text) return &Spinner{ From 6bd3bc8955f2889d46e1b238d87db2da0fe76ab5 Mon Sep 17 00:00:00 2001 From: Jeff McCoy Date: Fri, 21 Jan 2022 18:51:07 -0600 Subject: [PATCH 06/88] move config. -> types. --- cli/cmd/tools.go | 3 ++- cli/config/config.go | 21 +++++++++++---------- cli/internal/helm/chart.go | 8 ++++---- cli/internal/helm/repo.go | 6 +++--- cli/internal/helm/utils.go | 4 ++-- cli/internal/k8s/pods.go | 4 ++-- cli/internal/k8s/state.go | 8 ++++---- cli/internal/k8s/tunnel.go | 3 ++- cli/internal/packager/common.go | 7 ++++--- cli/internal/packager/create.go | 3 ++- cli/internal/packager/deploy.go | 5 +++-- cli/internal/packager/validate/validate.go | 5 +++-- cli/internal/template/template.go | 3 ++- cli/{config => types}/types.go | 2 +- 14 files changed, 45 insertions(+), 37 deletions(-) rename cli/{config => types}/types.go (99%) diff --git a/cli/cmd/tools.go b/cli/cmd/tools.go index a6e4e018d0..fd1cbfcc81 100644 --- a/cli/cmd/tools.go +++ b/cli/cmd/tools.go @@ -3,6 +3,7 @@ package cmd import ( "encoding/json" "fmt" + "github.com/defenseunicorns/zarf/cli/types" "os" "github.com/alecthomas/jsonschema" @@ -71,7 +72,7 @@ var configSchemaCmd = &cobra.Command{ Use: "config-schema", Short: "Generates a JSON schema for the zarf.yaml configuration", Run: func(cmd *cobra.Command, args []string) { - schema := jsonschema.Reflect(&config.ZarfPackage{}) + schema := jsonschema.Reflect(&types.ZarfPackage{}) output, err := json.MarshalIndent(schema, "", " ") if err != nil { message.Fatal(err, "Unable to generate the zarf config schema") diff --git a/cli/config/config.go b/cli/config/config.go index 336c4e8f82..e86862ec1a 100644 --- a/cli/config/config.go +++ b/cli/config/config.go @@ -2,6 +2,7 @@ package config import ( "fmt" + "github.com/defenseunicorns/zarf/cli/types" "os" "os/user" "strings" @@ -39,16 +40,16 @@ var ( CLIVersion = "unset" // TLS options used for cert creation - TLS TLSConfig + TLS types.TLSConfig // DeployOptions tracks user-defined values for the active deployment - DeployOptions ZarfDeployOptions + DeployOptions types.ZarfDeployOptions ActiveCranePlatform crane.Option // Private vars - config ZarfPackage - state ZarfState + config types.ZarfPackage + state types.ZarfState ) func IsZarfInitConfig() bool { @@ -82,19 +83,19 @@ func GetPackageName() string { } } -func GetDataInjections() []ZarfData { +func GetDataInjections() []types.ZarfData { return config.Data } -func GetMetaData() ZarfMetadata { +func GetMetaData() types.ZarfMetadata { return config.Metadata } -func GetComponents() []ZarfComponent { +func GetComponents() []types.ZarfComponent { return config.Components } -func GetBuildData() ZarfBuildData { +func GetBuildData() types.ZarfBuildData { return config.Build } @@ -102,13 +103,13 @@ func GetValidPackageExtensions() [3]string { return [...]string{".tar.zst", ".tar", ".zip"} } -func InitState(tmpState ZarfState) { +func InitState(tmpState types.ZarfState) { message.Debugf("config.InitState(%v)", tmpState) state = tmpState initSecrets() } -func GetState() ZarfState { +func GetState() types.ZarfState { return state } diff --git a/cli/internal/helm/chart.go b/cli/internal/helm/chart.go index 5e98a8ceaf..4c44a6b749 100644 --- a/cli/internal/helm/chart.go +++ b/cli/internal/helm/chart.go @@ -3,11 +3,11 @@ package helm import ( "bytes" "fmt" + "github.com/defenseunicorns/zarf/cli/types" "io/ioutil" "os" "time" - "github.com/defenseunicorns/zarf/cli/config" "github.com/defenseunicorns/zarf/cli/internal/k8s" "github.com/defenseunicorns/zarf/cli/internal/message" "github.com/defenseunicorns/zarf/cli/internal/utils" @@ -19,7 +19,7 @@ import ( type ChartOptions struct { BasePath string - Chart config.ZarfChart + Chart types.ZarfChart ReleaseName string ChartOverride *chart.Chart ValueOverride map[string]interface{} @@ -97,7 +97,7 @@ func InstallOrUpgradeChart(options ChartOptions) { } } -func GenerateChart(basePath string, manifest config.ZarfManifest, images []string) { +func GenerateChart(basePath string, manifest types.ZarfManifest, images []string) { spinner := message.NewProgressSpinner("Starting helm chart generation %s", manifest.Name) defer spinner.Stop() @@ -131,7 +131,7 @@ func GenerateChart(basePath string, manifest config.ZarfManifest, images []strin // Generate the struct to pass to InstallOrUpgradeChart() options := ChartOptions{ BasePath: basePath, - Chart: config.ZarfChart{ + Chart: types.ZarfChart{ Name: tmpChart.Metadata.Name, Version: tmpChart.Metadata.Version, Namespace: manifest.DefaultNamespace, diff --git a/cli/internal/helm/repo.go b/cli/internal/helm/repo.go index 49b8f4fdbc..81ad3e83e3 100644 --- a/cli/internal/helm/repo.go +++ b/cli/internal/helm/repo.go @@ -1,9 +1,9 @@ package helm import ( + "github.com/defenseunicorns/zarf/cli/types" "os" - "github.com/defenseunicorns/zarf/cli/config" "github.com/defenseunicorns/zarf/cli/internal/git" "github.com/defenseunicorns/zarf/cli/internal/message" "helm.sh/helm/v3/pkg/action" @@ -15,7 +15,7 @@ import ( ) // DownloadChartFromGit is a special implementation of chart downloads that support the https://p1.dso.mil/#/products/big-bang/ model -func DownloadChartFromGit(chart config.ZarfChart, destination string) { +func DownloadChartFromGit(chart types.ZarfChart, destination string) { spinner := message.NewProgressSpinner("Processing helm chart %s:%s from git url %s", chart.Name, chart.Version, chart.Url) defer spinner.Stop() @@ -40,7 +40,7 @@ func DownloadChartFromGit(chart config.ZarfChart, destination string) { } // DownloadPublishedChart loads a specific chart version from a remote repo -func DownloadPublishedChart(chart config.ZarfChart, destination string) { +func DownloadPublishedChart(chart types.ZarfChart, destination string) { spinner := message.NewProgressSpinner("Processing helm chart %s:%s from repo %s", chart.Name, chart.Version, chart.Url) defer spinner.Stop() diff --git a/cli/internal/helm/utils.go b/cli/internal/helm/utils.go index 3ca58bf91e..8bf928ff86 100644 --- a/cli/internal/helm/utils.go +++ b/cli/internal/helm/utils.go @@ -2,10 +2,10 @@ package helm import ( "fmt" + "github.com/defenseunicorns/zarf/cli/types" "os" "strconv" - "github.com/defenseunicorns/zarf/cli/config" "github.com/defenseunicorns/zarf/cli/internal/message" "helm.sh/helm/v3/pkg/action" "helm.sh/helm/v3/pkg/chart" @@ -17,7 +17,7 @@ import ( ) // StandardName generates a predictable full path for a helm chart for Zarf -func StandardName(destination string, chart config.ZarfChart) string { +func StandardName(destination string, chart types.ZarfChart) string { return destination + "/" + chart.Name + "-" + chart.Version } diff --git a/cli/internal/k8s/pods.go b/cli/internal/k8s/pods.go index b548aa2fa3..746c7819c3 100644 --- a/cli/internal/k8s/pods.go +++ b/cli/internal/k8s/pods.go @@ -2,10 +2,10 @@ package k8s import ( "context" + "github.com/defenseunicorns/zarf/cli/types" "sort" "time" - "github.com/defenseunicorns/zarf/cli/config" "github.com/defenseunicorns/zarf/cli/internal/message" corev1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -14,7 +14,7 @@ import ( const waitLimit = 30 // WaitForPodsAndContainers holds execution up to 30 seconds waiting for health pods and containers (if specified) -func WaitForPodsAndContainers(target config.ZarfContainerTarget, waitForAllPods bool) []string { +func WaitForPodsAndContainers(target types.ZarfContainerTarget, waitForAllPods bool) []string { clientSet := getClientset() diff --git a/cli/internal/k8s/state.go b/cli/internal/k8s/state.go index 2bd3b247df..6f98d04836 100644 --- a/cli/internal/k8s/state.go +++ b/cli/internal/k8s/state.go @@ -4,8 +4,8 @@ import ( "context" "encoding/json" "fmt" + "github.com/defenseunicorns/zarf/cli/types" - "github.com/defenseunicorns/zarf/cli/config" "github.com/defenseunicorns/zarf/cli/internal/message" corev1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -28,11 +28,11 @@ func getZarfStateInterface() v1.SecretInterface { } // LoadZarfState returns the current zarf/zarf-state secret data or an empty ZarfState -func LoadZarfState() config.ZarfState { +func LoadZarfState() types.ZarfState { message.Debug("k8s.LoadZarfState()") // The empty state that we will try to fill - state := config.ZarfState{ + state := types.ZarfState{ Distro: DistroIsUnknown, } @@ -50,7 +50,7 @@ func LoadZarfState() config.ZarfState { } // SaveZarfState takes a given state and makepersists it to the zarf/zarf-state secret -func SaveZarfState(state config.ZarfState) error { +func SaveZarfState(state types.ZarfState) error { message.Debugf("k8s.SaveZarfState(%v)", state) // Convert the data back to JSON diff --git a/cli/internal/k8s/tunnel.go b/cli/internal/k8s/tunnel.go index dc90859fef..ca6d2f70b3 100644 --- a/cli/internal/k8s/tunnel.go +++ b/cli/internal/k8s/tunnel.go @@ -4,6 +4,7 @@ package k8s import ( "fmt" + "github.com/defenseunicorns/zarf/cli/types" "io" "io/ioutil" "net" @@ -154,7 +155,7 @@ func (tunnel *Tunnel) getAttachablePodForService() (string, error) { } selectorLabelsOfPods := makeLabels(service.Spec.Selector) - servicePods := WaitForPodsAndContainers(config.ZarfContainerTarget{ + servicePods := WaitForPodsAndContainers(types.ZarfContainerTarget{ Namespace: tunnel.namespace, Selector: selectorLabelsOfPods, }, false) diff --git a/cli/internal/packager/common.go b/cli/internal/packager/common.go index 3a48ddf0f4..7444584a1b 100644 --- a/cli/internal/packager/common.go +++ b/cli/internal/packager/common.go @@ -4,6 +4,7 @@ import ( "crypto/sha256" "encoding/hex" "fmt" + "github.com/defenseunicorns/zarf/cli/types" "io" "io/ioutil" "net/http" @@ -47,7 +48,7 @@ func createPaths() tempPaths { } } -func createComponentPaths(basePath string, component config.ZarfComponent) componentPaths { +func createComponentPaths(basePath string, component types.ZarfComponent) componentPaths { basePath = basePath + "/" + component.Name _ = utils.CreateDirectory(basePath, 0700) return componentPaths{ @@ -89,8 +90,8 @@ func confirmAction(configPath string, userMessage string) bool { return config.DeployOptions.Confirm } -func getValidComponents(allComponents []config.ZarfComponent, requestedComponentNames []string) []config.ZarfComponent { - var validComponentsList []config.ZarfComponent +func getValidComponents(allComponents []types.ZarfComponent, requestedComponentNames []string) []types.ZarfComponent { + var validComponentsList []types.ZarfComponent confirmedComponents := make([]bool, len(requestedComponentNames)) for _, component := range allComponents { confirmComponent := component.Required diff --git a/cli/internal/packager/create.go b/cli/internal/packager/create.go index aef2eb190e..4321d7f36c 100644 --- a/cli/internal/packager/create.go +++ b/cli/internal/packager/create.go @@ -3,6 +3,7 @@ package packager import ( "fmt" "github.com/defenseunicorns/zarf/cli/internal/packager/validate" + "github.com/defenseunicorns/zarf/cli/types" "os" "path/filepath" "regexp" @@ -82,7 +83,7 @@ func Create() { cleanup(tempPath) } -func addComponent(tempPath tempPaths, component config.ZarfComponent) { +func addComponent(tempPath tempPaths, component types.ZarfComponent) { message.HeaderInfof("📦 %s COMPONENT", strings.ToUpper(component.Name)) componentPath := createComponentPaths(tempPath.components, component) diff --git a/cli/internal/packager/deploy.go b/cli/internal/packager/deploy.go index 060b4c4558..27c852793b 100644 --- a/cli/internal/packager/deploy.go +++ b/cli/internal/packager/deploy.go @@ -1,6 +1,7 @@ package packager import ( + "github.com/defenseunicorns/zarf/cli/types" "os" "path/filepath" "strconv" @@ -97,7 +98,7 @@ func Deploy() { os.Exit(0) } -func deployComponents(tempPath tempPaths, component config.ZarfComponent) { +func deployComponents(tempPath tempPaths, component types.ZarfComponent) { message.Debugf("packager.deployComponents(%v, %v", tempPath, component) componentPath := createComponentPaths(tempPath.components, component) isSeedRegistry := config.IsZarfInitConfig() && component.Name == "container-registry-seed" @@ -209,7 +210,7 @@ func deployComponents(tempPath tempPaths, component config.ZarfComponent) { // handleDataInjection performs data-copy operations into a pod // todo: this currently requires kubectl but we should have enough k8s work to make this native now -func handleDataInjection(dataInjectionList []config.ZarfData, tempPath tempPaths) { +func handleDataInjection(dataInjectionList []types.ZarfData, tempPath tempPaths) { injectionCompletionMarker := tempPath.dataInjections + "/.zarf-sync-complete" if err := utils.WriteFile(injectionCompletionMarker, []byte("🦄")); err != nil { return diff --git a/cli/internal/packager/validate/validate.go b/cli/internal/packager/validate/validate.go index 5809cfb0b4..09fed0199e 100644 --- a/cli/internal/packager/validate/validate.go +++ b/cli/internal/packager/validate/validate.go @@ -4,6 +4,7 @@ import ( "fmt" "github.com/defenseunicorns/zarf/cli/config" "github.com/defenseunicorns/zarf/cli/internal/message" + "github.com/defenseunicorns/zarf/cli/types" ) // Run performs config validations and runs message.Fatal() on errors @@ -25,7 +26,7 @@ func Run() { } -func validateChart(chart config.ZarfChart) error { +func validateChart(chart types.ZarfChart) error { intro := fmt.Sprintf("chart %s", chart.Name) // Don't allow empty names @@ -58,7 +59,7 @@ func validateChart(chart config.ZarfChart) error { return nil } -func validateManifest(manifest config.ZarfManifest) error { +func validateManifest(manifest types.ZarfManifest) error { intro := fmt.Sprintf("chart %s", manifest.Name) // Don't allow empty names diff --git a/cli/internal/template/template.go b/cli/internal/template/template.go index 8db982a8c8..387a5f6d1b 100644 --- a/cli/internal/template/template.go +++ b/cli/internal/template/template.go @@ -2,6 +2,7 @@ package template import ( "fmt" + "github.com/defenseunicorns/zarf/cli/types" "github.com/defenseunicorns/zarf/cli/config" "github.com/defenseunicorns/zarf/cli/internal/message" @@ -9,7 +10,7 @@ import ( ) type Values struct { - state config.ZarfState + state types.ZarfState htpasswd string seedRegistry string registry string diff --git a/cli/config/types.go b/cli/types/types.go similarity index 99% rename from cli/config/types.go rename to cli/types/types.go index 18e0c779e9..09b3d5f2ec 100644 --- a/cli/config/types.go +++ b/cli/types/types.go @@ -1,4 +1,4 @@ -package config +package types // ZarfFile defines a file to deploy type ZarfFile struct { From e29af10d6ace59dd69a04ad4f3ac5d5c4ea8cecc Mon Sep 17 00:00:00 2001 From: Jeff McCoy Date: Sat, 22 Jan 2022 21:22:44 -0600 Subject: [PATCH 07/88] Add docker desktop K8s support --- cli/internal/k8s/distro.go | 17 +++++++++++------ cli/internal/packager/seed.go | 6 ++++++ 2 files changed, 17 insertions(+), 6 deletions(-) diff --git a/cli/internal/k8s/distro.go b/cli/internal/k8s/distro.go index e505442c75..d85ffd5764 100644 --- a/cli/internal/k8s/distro.go +++ b/cli/internal/k8s/distro.go @@ -6,12 +6,13 @@ import ( ) const ( - DistroIsUnknown = "unknown" - DistroIsK3s = "k3s" - DistroIsK3d = "k3d" - DistroIsKind = "kind" - DistroIsMicroK8s = "microk8s" - DistroIsEKSAnywhere = "eksanywhere" + DistroIsUnknown = "unknown" + DistroIsK3s = "k3s" + DistroIsK3d = "k3d" + DistroIsKind = "kind" + DistroIsMicroK8s = "microk8s" + DistroIsEKSAnywhere = "eksanywhere" + DistroIsDockerDesktop = "dockerdesktop" // todo: more distros ) @@ -51,6 +52,10 @@ func DetectDistro() (string, error) { } } + if node.GetName() == "docker-desktop" { + return DistroIsDockerDesktop, nil + } + } namespaces, err := GetNamespaces() diff --git a/cli/internal/packager/seed.go b/cli/internal/packager/seed.go index 939858c4e3..056ea64a4b 100644 --- a/cli/internal/packager/seed.go +++ b/cli/internal/packager/seed.go @@ -148,6 +148,12 @@ func preSeedRegistry(tempPath tempPaths) { inject.command = "kind" inject.args = []string{"load", "image-archive", tempPath.seedImages, "--name", clusterName} + case k8s.DistroIsDockerDesktop: + state.StorageClass = "hostpath" + state.Registry.SeedType = config.ZarfSeedTypeCLIInject + inject.command = "docker" + inject.args = []string{"load", "-i", tempPath.seedImages} + default: state.Registry.SeedType = config.ZarfSeedTypeRuntimeRegistry } From 0aeb10d84133125128f91d8a901676e86f5be0fa Mon Sep 17 00:00:00 2001 From: Jeff McCoy Date: Sun, 23 Jan 2022 04:18:16 -0600 Subject: [PATCH 08/88] update Loki Stack for k8s 1.22+ support --- zarf.yaml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/zarf.yaml b/zarf.yaml index 942c25514a..93fce60fcb 100644 --- a/zarf.yaml +++ b/zarf.yaml @@ -99,14 +99,14 @@ components: description: "Add Promtail, Grafana and Loki (PGL) to this cluster for log monitoring." default: true images: - - grafana/loki:2.2.0 + - grafana/grafana:8.1.6 + - grafana/loki:2.4.1 - grafana/promtail:2.1.0 - - grafana/grafana:7.5.0 - - kiwigrid/k8s-sidecar:0.1.209 + - quay.io/kiwigrid/k8s-sidecar:1.12.3 charts: - name: loki-stack url: https://grafana.github.io/helm-charts - version: 2.4.1 + version: 2.5.1 namespace: zarf valuesFiles: - assets/charts/pgl-values.yaml From 593c8ef53b15b02823c1dbdcad1d56f28a540679 Mon Sep 17 00:00:00 2001 From: Jeff McCoy Date: Sun, 23 Jan 2022 04:19:12 -0600 Subject: [PATCH 09/88] Change pterm default out to stderr for cleaner output capture --- cli/internal/message/message.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/cli/internal/message/message.go b/cli/internal/message/message.go index 5dea9c6612..864861fbfb 100644 --- a/cli/internal/message/message.go +++ b/cli/internal/message/message.go @@ -25,6 +25,8 @@ const ( var logLevel = InfoLevel func init() { + // Help capture text cleaner + pterm.SetDefaultOutput(os.Stderr) pterm.ThemeDefault.SuccessMessageStyle = *pterm.NewStyle(pterm.FgLightGreen) // Customize default error. pterm.Success.Prefix = pterm.Prefix{ From 7201e1e66d63ddac43776c7eaf367f13ad4422dc Mon Sep 17 00:00:00 2001 From: Jeff McCoy Date: Sun, 23 Jan 2022 04:20:00 -0600 Subject: [PATCH 10/88] Add "zarf prepare find-images" command for calculating image deps --- cli/cmd/prepare.go | 10 ++ cli/internal/helm/chart.go | 37 ++++++++ cli/internal/packager/create.go | 2 +- cli/internal/packager/prepare.go | 158 +++++++++++++++++++++++++++++++ zarf.yaml | 3 + 5 files changed, 209 insertions(+), 1 deletion(-) create mode 100644 cli/internal/packager/prepare.go diff --git a/cli/cmd/prepare.go b/cli/cmd/prepare.go index 797b10945a..5679f0943c 100644 --- a/cli/cmd/prepare.go +++ b/cli/cmd/prepare.go @@ -2,6 +2,7 @@ package cmd import ( "fmt" + "github.com/defenseunicorns/zarf/cli/internal/packager" "io/ioutil" "github.com/AlecAivazis/survey/v2" @@ -66,8 +67,17 @@ var prepareComputeFileSha256sum = &cobra.Command{ }, } +var prepareFindImages = &cobra.Command{ + Use: "find-images", + Short: "evaluates components in a zarf file to identify images specified in their helm charts and manifests", + Run: func(cmd *cobra.Command, args []string) { + packager.FindImages() + }, +} + func init() { rootCmd.AddCommand(prepareCmd) prepareCmd.AddCommand(prepareTransformGitLinks) prepareCmd.AddCommand(prepareComputeFileSha256sum) + prepareCmd.AddCommand(prepareFindImages) } diff --git a/cli/internal/helm/chart.go b/cli/internal/helm/chart.go index 4c44a6b749..c828ad74e4 100644 --- a/cli/internal/helm/chart.go +++ b/cli/internal/helm/chart.go @@ -97,6 +97,43 @@ func InstallOrUpgradeChart(options ChartOptions) { } } +// TemplateChart generates a helm template from a given chart +func TemplateChart(options ChartOptions) (string, error) { + + actionConfig, err := createActionConfig(options.Chart.Namespace) + + // Setup K8s connection + if err != nil { + return "", fmt.Errorf("unable to initialize the K8s client: %w", err) + } + + // Bind the helm action + client := action.NewInstall(actionConfig) + + client.DryRun = false + client.Replace = true // Skip the name check + client.ClientOnly = true + client.IncludeCRDs = true + + client.ReleaseName = fmt.Sprintf("zarf-%s", options.Chart.Name) + + // Namespace must be specified + client.Namespace = options.Chart.Namespace + + loadedChart, chartValues, err := loadChartData(options) + if err != nil { + return "", fmt.Errorf("unable to load chart data: %w", err) + } + + // Perform the loadedChart installation + templatedChart, err := client.Run(loadedChart, chartValues) + if err != nil { + return "", fmt.Errorf("error generating helm chart template: %w", err) + } + + return templatedChart.Manifest, nil +} + func GenerateChart(basePath string, manifest types.ZarfManifest, images []string) { spinner := message.NewProgressSpinner("Starting helm chart generation %s", manifest.Name) defer spinner.Stop() diff --git a/cli/internal/packager/create.go b/cli/internal/packager/create.go index 4321d7f36c..185b86e313 100644 --- a/cli/internal/packager/create.go +++ b/cli/internal/packager/create.go @@ -19,8 +19,8 @@ import ( "github.com/mholt/archiver/v3" ) +// Create generates a zarf package tarball for consumption by func Create() { - if err := config.LoadConfig("zarf.yaml"); err != nil { message.Fatal(err, "Unable to read the zarf.yaml file") } diff --git a/cli/internal/packager/prepare.go b/cli/internal/packager/prepare.go new file mode 100644 index 0000000000..074b97b727 --- /dev/null +++ b/cli/internal/packager/prepare.go @@ -0,0 +1,158 @@ +package packager + +import ( + "fmt" + "github.com/defenseunicorns/zarf/cli/config" + "github.com/defenseunicorns/zarf/cli/internal/helm" + "github.com/defenseunicorns/zarf/cli/internal/k8s" + "github.com/defenseunicorns/zarf/cli/internal/message" + "github.com/defenseunicorns/zarf/cli/types" + v1 "k8s.io/api/apps/v1" + corev1 "k8s.io/api/core/v1" + "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" + "k8s.io/apimachinery/pkg/runtime" + "os" + "regexp" + "sort" +) + +var matchedImages []string + +func FindImages() { + + // Load the given zarf package + if err := config.LoadConfig("zarf.yaml"); err != nil { + message.Fatal(err, "Unable to read the zarf.yaml file") + } + + tempPath := createPaths() + components := config.GetComponents() + + for _, component := range components { + + matchedImages = []string{} + + if len(component.Charts)+len(component.Manifests) < 1 { + // Skip if it doesn't have what we need + continue + } + + // Only process helm charts and raw manifests + strippedComponent := types.ZarfComponent{ + Charts: component.Charts, + Manifests: component.Manifests, + } + + // keep things DRY by using the package creator + addComponent(tempPath, strippedComponent) + + var resources []*unstructured.Unstructured + + for _, chart := range component.Charts { + // Generate helm templates to pass to gitops engine + template, err := helm.TemplateChart(helm.ChartOptions{ + BasePath: tempPath.components, + Chart: chart, + }) + + if err != nil { + message.Errorf(err, "Problem rendering the helm template for %s", chart.Url) + continue + } + + // Break the template into separate resources + yamls, _ := k8s.SplitYAML([]byte(template)) + for _, yaml := range yamls { + resources = append(resources, yaml) + } + + } + + for _, manifest := range component.Manifests { + for _, file := range manifest.Files { + // Read the contents of each file + contents, err := os.ReadFile(file) + if err != nil { + message.Errorf(err, "Unable to read the file %s", file) + continue + } + + // Break the manifest into separate resources + yamls, _ := k8s.SplitYAML(contents) + for _, yaml := range yamls { + resources = append(resources, yaml) + } + } + } + + var imageSanityCheck = regexp.MustCompile(`(?mi)"image":"([^"]+)"`) + + for _, resource := range resources { + contents := resource.UnstructuredContent() + json, _ := resource.MarshalJSON() + + switch resource.GetKind() { + case "Deployment": + var deployment v1.Deployment + if err := runtime.DefaultUnstructuredConverter.FromUnstructured(contents, &deployment); err != nil { + message.Errorf(err, "Unable to parse deployment") + continue + } + processPod(deployment.Spec.Template.Spec) + + case "DaemonSet": + var daemonSet v1.DaemonSet + if err := runtime.DefaultUnstructuredConverter.FromUnstructured(contents, &daemonSet); err != nil { + message.Errorf(err, "Unable to parse daemonset") + continue + } + processPod(daemonSet.Spec.Template.Spec) + + case "StatefulSet": + var statefulSet v1.StatefulSet + if err := runtime.DefaultUnstructuredConverter.FromUnstructured(contents, &statefulSet); err != nil { + message.Errorf(err, "Unable to parse statefulset") + continue + } + processPod(statefulSet.Spec.Template.Spec) + + case "ReplicaSet": + var replicaSet v1.ReplicaSet + if err := runtime.DefaultUnstructuredConverter.FromUnstructured(contents, &replicaSet); err != nil { + message.Errorf(err, "Unable to parse replicaset") + continue + } + processPod(replicaSet.Spec.Template.Spec) + + default: + // Capture any custom images + matches := imageSanityCheck.FindAllStringSubmatch(string(json), -1) + for i := range matches { + message.Info(matches[i][1]) + matchedImages = append(matchedImages, matches[i][1]) + } + } + + } + + fmt.Println(fmt.Sprintf(" # %s - %s", config.GetMetaData().Name, component.Name)) + uniqueImages := sort.StringSlice(removeDuplicates(matchedImages)) + sort.Sort(uniqueImages) + for _, image := range uniqueImages { + fmt.Println(" - " + image) + } + fmt.Println() + } + +} + +func processPod(pod corev1.PodSpec) { + for _, container := range pod.InitContainers { + // Add image for each init container + matchedImages = append(matchedImages, container.Image) + } + for _, container := range pod.Containers { + // Add image for each regular container + matchedImages = append(matchedImages, container.Image) + } +} diff --git a/zarf.yaml b/zarf.yaml index 93fce60fcb..ba3ba71bf1 100644 --- a/zarf.yaml +++ b/zarf.yaml @@ -1,4 +1,7 @@ kind: ZarfInitConfig +metadata: + name: Zarf Official Init Package + description: "Used to establish a new Zarf cluster" seed: - library/registry:2.7.1 From c90a29da244f5662c4bea9e1927dc7988012f819 Mon Sep 17 00:00:00 2001 From: Jeff McCoy Date: Sun, 23 Jan 2022 04:36:12 -0600 Subject: [PATCH 11/88] secret cleanup --- assets/charts/pgl-values.yaml | 2 +- cli/internal/template/template.go | 52 +++++++++++-------- cli/types/types.go | 11 ++++ .../manifests/big-bang/manifests.yaml | 4 +- .../manifests/flux/regcred-secret.yaml | 2 +- 5 files changed, 44 insertions(+), 27 deletions(-) diff --git a/assets/charts/pgl-values.yaml b/assets/charts/pgl-values.yaml index ece2f8ed3a..97023f6a62 100644 --- a/assets/charts/pgl-values.yaml +++ b/assets/charts/pgl-values.yaml @@ -5,7 +5,7 @@ loki: grafana: enabled: true adminUser: "zarf-admin" - adminPassword: "###ZARF_SECRET###" + adminPassword: "###ZARF_LOGGING_AUTH###" image: pullSecrets: - "zarf-registry" diff --git a/cli/internal/template/template.go b/cli/internal/template/template.go index 387a5f6d1b..c209f66881 100644 --- a/cli/internal/template/template.go +++ b/cli/internal/template/template.go @@ -10,15 +10,18 @@ import ( ) type Values struct { - state types.ZarfState - htpasswd string - seedRegistry string - registry string - registryPush string - registryPull string - registrySecret string - gitPush string - gitPull string + state types.ZarfState + registry string + seedRegistry string + secret struct { + htpasswd string + registryPush string + registryPull string + registrySecret string + gitPush string + gitPull string + logging string + } } func Generate() Values { @@ -33,24 +36,26 @@ func Generate() Values { message.Debug(errPush, errPull) message.Fatal(nil, "Unable to define `htpasswd` string for the Zarf user") } - generated.htpasswd = fmt.Sprintf("%s\\n%s", pushUser, pullUser) + generated.secret.htpasswd = fmt.Sprintf("%s\\n%s", pushUser, pullUser) generated.registry = config.GetRegistry() generated.seedRegistry = config.GetSeedRegistry() - generated.registryPush = config.GetSecret(config.StateRegistryPush) - generated.registryPull = config.GetSecret(config.StateRegistryPull) - generated.registrySecret = config.GetSecret(config.StateRegistrySecret) + generated.secret.registryPush = config.GetSecret(config.StateRegistryPush) + generated.secret.registryPull = config.GetSecret(config.StateRegistryPull) + generated.secret.registrySecret = config.GetSecret(config.StateRegistrySecret) + + generated.secret.gitPush = config.GetSecret(config.StateGitPush) + generated.secret.gitPull = config.GetSecret(config.StateGitPull) - generated.gitPush = config.GetSecret(config.StateGitPush) - generated.gitPull = config.GetSecret(config.StateGitPull) + generated.secret.logging = config.GetSecret(config.StateLogging) message.Debugf("Template values: %v", generated) return generated } func (values Values) Ready() bool { - return values.htpasswd != "" + return values.secret.htpasswd != "" } func (values Values) GetRegistry() string { @@ -63,7 +68,7 @@ func (values Values) Apply(path string) { if !values.Ready() { // This should only occur if the state couldn't be pulled or on init if a template is attempted before the pre-seed stage - message.Fatalf(nil, "template.Apply() called bofore template.Generate()") + message.Fatalf(nil, "template.Apply() called before template.Generate()") } mappings := map[string]string{ @@ -71,12 +76,13 @@ func (values Values) Apply(path string) { "SEED_REGISTRY": values.seedRegistry, "REGISTRY": values.registry, "REGISTRY_NODEPORT": values.state.Registry.NodePort, - "REGISTRY_SECRET": values.registrySecret, - "REGISTRY_AUTH_PUSH": values.registryPush, - "REGISTRY_AUTH_PULL": values.registryPull, - "GIT_AUTH_PUSH": values.gitPush, - "GIT_AUTH_PULL": values.gitPull, - "HTPASSWD": values.htpasswd, + "REGISTRY_SECRET": values.secret.registrySecret, + "REGISTRY_AUTH_PUSH": values.secret.registryPush, + "REGISTRY_AUTH_PULL": values.secret.registryPull, + "GIT_AUTH_PUSH": values.secret.gitPush, + "GIT_AUTH_PULL": values.secret.gitPull, + "LOGGING_AUTH": values.secret.logging, + "HTPASSWD": values.secret.htpasswd, } message.Debug(mappings) diff --git a/cli/types/types.go b/cli/types/types.go index 09b3d5f2ec..cf78d2b7f1 100644 --- a/cli/types/types.go +++ b/cli/types/types.go @@ -31,6 +31,17 @@ type ZarfComponent struct { Images []string `yaml:"images,omitempty"` Repos []string `yaml:"repos,omitempty"` Scripts ZarfComponentScripts `yaml:"scripts,omitempty"` + Connect []ZarfConnect `yaml:"connect,omitempty"` +} + +// ZarfConnect defines tunnel parameters a component can use with zarf connect to expose a service or pod +type ZarfConnect struct { + Identifier string `yaml:"identifier"` + Namespace string `yaml:"namespace"` + Name string `yaml:"name"` + Type string `yaml:"type"` + RemotePort int `yaml:"remotePort"` + LocalPort int `yaml:"localPort,omitempty"` } // ZarfManifest defines raw manifests Zarf will deploy as a helm chart diff --git a/examples/big-bang/manifests/big-bang/manifests.yaml b/examples/big-bang/manifests/big-bang/manifests.yaml index 9dbfce6290..a0392b9387 100644 --- a/examples/big-bang/manifests/big-bang/manifests.yaml +++ b/examples/big-bang/manifests/big-bang/manifests.yaml @@ -13,7 +13,7 @@ metadata: namespace: bigbang stringData: username: "zarf-git-user" - password: "###ZARF_SECRET###" + password: "###ZARF_GIT_AUTH_PUSH###" --- apiVersion: source.toolkit.fluxcd.io/v1beta1 kind: GitRepository @@ -98,4 +98,4 @@ spec: timeout: 60m postBuild: substitute: - zarf_secret: "###ZARF_SECRET###" + zarf_secret: "###ZARF_REGISTRY_AUTH_PULL###" diff --git a/examples/big-bang/manifests/flux/regcred-secret.yaml b/examples/big-bang/manifests/flux/regcred-secret.yaml index 0ea7bd4879..9e6ba4dd53 100644 --- a/examples/big-bang/manifests/flux/regcred-secret.yaml +++ b/examples/big-bang/manifests/flux/regcred-secret.yaml @@ -6,4 +6,4 @@ metadata: namespace: bigbang stringData: username: "zarf-git-user" - password: "###ZARF_SECRET###" + password: "###ZARF_GIT_AUTH_PULL###" From a77868ba674f0ae1f7fca9e013a1d0b70a49bc60 Mon Sep 17 00:00:00 2001 From: Jon Perry Date: Mon, 24 Jan 2022 18:28:53 +0000 Subject: [PATCH 12/88] Fix RHEL check in zarf init package to avoid infinite retry loop --- zarf.yaml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/zarf.yaml b/zarf.yaml index ba3ba71bf1..7ce62d46c0 100644 --- a/zarf.yaml +++ b/zarf.yaml @@ -19,7 +19,8 @@ components: before: # If running RHEL variant, disable firewalld # https://rancher.com/docs/k3s/latest/en/advanced/#additional-preparation-for-red-hat-centos-enterprise-linux - - "[ -e /etc/redhat-release ] && systemctl disable firewalld --now" + # NOTE: The empty echo prevents infinate retry loops on non-RHEL systems where the exit code would be an error + - "[ -e /etc/redhat-release ] && systemctl disable firewalld --now || echo ''" after: # Configure K3s systemd service - "systemctl daemon-reload" From a10905cabaf01d681cdd7c5fbb2e581bd42cf64d Mon Sep 17 00:00:00 2001 From: Jeff McCoy Date: Mon, 24 Jan 2022 13:58:22 -0600 Subject: [PATCH 13/88] fix tiny kafka example (must be in own ns for helm happiness) --- examples/tiny-kafka/zarf.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/tiny-kafka/zarf.yaml b/examples/tiny-kafka/zarf.yaml index 55c5214519..9d8514aacd 100644 --- a/examples/tiny-kafka/zarf.yaml +++ b/examples/tiny-kafka/zarf.yaml @@ -15,7 +15,7 @@ components: - name: strimzi-kafka-operator url: https://strimzi.io/charts/ version: 0.24.0 - namespace: kafka-demo + namespace: kafka-operator valuesFiles: - charts/strimzi-values.yaml images: From 2e93894932ece7fd3a3520a17028fc471161df02 Mon Sep 17 00:00:00 2001 From: Jeff McCoy Date: Mon, 24 Jan 2022 13:59:21 -0600 Subject: [PATCH 14/88] cobra aliases --- cli/cmd/connect.go | 5 +++-- cli/cmd/destroy.go | 5 +++-- cli/cmd/initialize.go | 7 ++++--- cli/cmd/package.go | 5 +++-- cli/cmd/prepare.go | 11 ++++++++--- cli/cmd/tools.go | 5 +++-- cli/cmd/version.go | 5 +++-- 7 files changed, 27 insertions(+), 16 deletions(-) diff --git a/cli/cmd/connect.go b/cli/cmd/connect.go index ba352865c3..e78d138288 100644 --- a/cli/cmd/connect.go +++ b/cli/cmd/connect.go @@ -13,8 +13,9 @@ var ( connectRemotePort int connectCmd = &cobra.Command{ - Use: "connect ", - Short: "Access services or pods deployed in the cluster.", + Use: "connect ", + Aliases: []string{"c"}, + Short: "Access services or pods deployed in the cluster.", Run: func(cmd *cobra.Command, args []string) { var target string if len(args) > 0 { diff --git a/cli/cmd/destroy.go b/cli/cmd/destroy.go index 88a4779123..3491d63ff5 100644 --- a/cli/cmd/destroy.go +++ b/cli/cmd/destroy.go @@ -15,8 +15,9 @@ var confirmDestroy bool var removeComponents bool var destroyCmd = &cobra.Command{ - Use: "destroy", - Short: "Tear it all down, we'll miss you Zarf...", + Use: "destroy", + Aliases: []string{"d"}, + Short: "Tear it all down, we'll miss you Zarf...", Run: func(cmd *cobra.Command, args []string) { state := k8s.LoadZarfState() _ = os.Remove(".zarf-registry") diff --git a/cli/cmd/initialize.go b/cli/cmd/initialize.go index 799b5029b7..214218b237 100644 --- a/cli/cmd/initialize.go +++ b/cli/cmd/initialize.go @@ -12,9 +12,10 @@ import ( // initCmd represents the init command var initCmd = &cobra.Command{ - Use: "init", - Short: "Deploys the gitops service or appliance cluster on a clean linux box", - Long: "Flags are only required if running via automation, otherwise the init command will prompt you for your configuration choices", + Use: "init", + Aliases: []string{"i"}, + Short: "Deploys the gitops service or appliance cluster on a clean linux box", + Long: "Flags are only required if running via automation, otherwise the init command will prompt you for your configuration choices", Run: func(cmd *cobra.Command, args []string) { zarfLogo := getLogo() _, _ = fmt.Fprintln(os.Stderr, zarfLogo) diff --git a/cli/cmd/package.go b/cli/cmd/package.go index 5ff6779047..a1d78337d0 100644 --- a/cli/cmd/package.go +++ b/cli/cmd/package.go @@ -13,8 +13,9 @@ var insecureDeploy bool var shasum string var packageCmd = &cobra.Command{ - Use: "package", - Short: "Pack and unpack updates for the Zarf gitops service.", + Use: "package", + Aliases: []string{"p"}, + Short: "Pack and unpack updates for the Zarf gitops service.", } var packageCreateCmd = &cobra.Command{ diff --git a/cli/cmd/prepare.go b/cli/cmd/prepare.go index 5679f0943c..a89734df9d 100644 --- a/cli/cmd/prepare.go +++ b/cli/cmd/prepare.go @@ -12,6 +12,7 @@ import ( "github.com/spf13/cobra" ) +var repoHelmChartPath string var prepareCmd = &cobra.Command{ Use: "prepare", Short: "Tools to help prepare assets for packaging", @@ -68,10 +69,11 @@ var prepareComputeFileSha256sum = &cobra.Command{ } var prepareFindImages = &cobra.Command{ - Use: "find-images", - Short: "evaluates components in a zarf file to identify images specified in their helm charts and manifests", + Use: "find-images", + Aliases: []string{"prep"}, + Short: "evaluates components in a zarf file to identify images specified in their helm charts and manifests", Run: func(cmd *cobra.Command, args []string) { - packager.FindImages() + packager.FindImages(repoHelmChartPath) }, } @@ -80,4 +82,7 @@ func init() { prepareCmd.AddCommand(prepareTransformGitLinks) prepareCmd.AddCommand(prepareComputeFileSha256sum) prepareCmd.AddCommand(prepareFindImages) + + prepareFindImages.Flags().StringVarP(&repoHelmChartPath, "repo-chart-path", "p", "", `If git repos hold helm charts, often found with gitops tools, specify the chart path, e.g. "/" or "/chart"`) + } diff --git a/cli/cmd/tools.go b/cli/cmd/tools.go index fd1cbfcc81..556b3a894a 100644 --- a/cli/cmd/tools.go +++ b/cli/cmd/tools.go @@ -18,8 +18,9 @@ import ( ) var toolsCmd = &cobra.Command{ - Use: "tools", - Short: "Collection of additional tools to make airgap easier", + Use: "tools", + Aliases: []string{"t"}, + Short: "Collection of additional tools to make airgap easier", } // destroyCmd represents the init command diff --git a/cli/cmd/version.go b/cli/cmd/version.go index 0bbf70fef0..389d76d96e 100644 --- a/cli/cmd/version.go +++ b/cli/cmd/version.go @@ -8,8 +8,9 @@ import ( ) var versionCmd = &cobra.Command{ - Use: "version", - Short: "Displays the version the zarf binary was built from", + Use: "version", + Aliases: []string{"v"}, + Short: "Displays the version the zarf binary was built from", Run: func(cmd *cobra.Command, args []string) { fmt.Println(config.CLIVersion) }, From 59d35edd0b6ee8a8c03987d8648b32704818a35d Mon Sep 17 00:00:00 2001 From: Jeff McCoy Date: Mon, 24 Jan 2022 14:00:40 -0600 Subject: [PATCH 15/88] cleanup helm install/upgrade/rollback logic --- cli/internal/helm/chart.go | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/cli/internal/helm/chart.go b/cli/internal/helm/chart.go index c828ad74e4..38db839d2f 100644 --- a/cli/internal/helm/chart.go +++ b/cli/internal/helm/chart.go @@ -71,17 +71,23 @@ func InstallOrUpgradeChart(options ChartOptions) { } spinner.Updatef("Checking for existing helm deployment") - if _, histErr := histClient.Run(options.ReleaseName); histErr == driver.ErrReleaseNotFound { + + _, histErr := histClient.Run(options.ReleaseName) + + switch histErr { + case driver.ErrReleaseNotFound: // No prior release, try to install it spinner.Updatef("Attempting chart installation") output, err = installChart(actionConfig, options) - } else if err != nil { - // Something broke - spinner.Fatalf(err, "Unable to verify the chart installation status") - } else { + + case nil: // Otherwise, there is a prior release so upgrade it spinner.Updatef("Attempting chart upgrade") output, err = upgradeChart(actionConfig, options) + + default: + // 😭 things aren't working + spinner.Fatalf(err, "Unable to verify the chart installation status") } if err != nil { From 13dbc778a8c449a4abdc5f123249f85ac90b3978 Mon Sep 17 00:00:00 2001 From: Jeff McCoy Date: Mon, 24 Jan 2022 14:01:51 -0600 Subject: [PATCH 16/88] =?UTF-8?q?=F0=9F=A7=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cli/internal/git/pull.go | 18 ++++++++---------- cli/internal/packager/common.go | 12 +++++++----- cli/internal/packager/create.go | 17 +++++++++++------ cli/internal/packager/deploy.go | 7 ++----- cli/internal/packager/inspect.go | 3 +-- cli/zarf.yaml | 3 --- examples/big-bang/zarf.yaml | 1 - examples/tiny-kafka/zarf.yaml | 2 +- 8 files changed, 30 insertions(+), 33 deletions(-) diff --git a/cli/internal/git/pull.go b/cli/internal/git/pull.go index 5e56137ce2..19589855c0 100644 --- a/cli/internal/git/pull.go +++ b/cli/internal/git/pull.go @@ -11,24 +11,23 @@ import ( const onlineRemoteName = "online-upstream" -func DownloadRepoToTemp(gitUrl string) string { +func DownloadRepoToTemp(gitUrl string, spinner *message.Spinner) string { path, _ := utils.MakeTempDir() // If downloading to temp, grab all tags since the repo isn't being // packaged anyway, and it saves us from having to fetch the tags // later if we need them - pull(gitUrl, path) + pull(gitUrl, path, spinner) return path } -func Pull(gitUrl string, targetFolder string) string { +func Pull(gitUrl string, targetFolder string, spinner *message.Spinner) string { path := targetFolder + "/" + transformURLtoRepoName(gitUrl) - pull(gitUrl, path) + pull(gitUrl, path, spinner) return path } -func pull(gitUrl string, targetFolder string) { - spinner := message.NewProgressSpinner("Processing git repo %s", gitUrl) - defer spinner.Stop() +func pull(gitUrl string, targetFolder string, spinner *message.Spinner) { + spinner.Updatef("Processing git repo %s", gitUrl) gitCred := FindAuthForHost(gitUrl) @@ -76,12 +75,11 @@ func pull(gitUrl string, targetFolder string) { spinner.Errorf(nil, "No branch found for this repo head. Tag will be pushed to 'master'.") } - removeLocalBranchRefs(targetFolder) - removeOnlineRemoteRefs(targetFolder) + _, _ = removeLocalBranchRefs(targetFolder) + _, _ = removeOnlineRemoteRefs(targetFolder) fetchTag(targetFolder, tag) CheckoutTagAsBranch(targetFolder, tag, trunkBranchName) } - spinner.Success() } diff --git a/cli/internal/packager/common.go b/cli/internal/packager/common.go index 7444584a1b..666af400f9 100644 --- a/cli/internal/packager/common.go +++ b/cli/internal/packager/common.go @@ -48,6 +48,11 @@ func createPaths() tempPaths { } } +func (t tempPaths) clean() { + message.Debug("Cleaning up temp files") + _ = os.RemoveAll(t.base) +} + func createComponentPaths(basePath string, component types.ZarfComponent) componentPaths { basePath = basePath + "/" + component.Name _ = utils.CreateDirectory(basePath, 0700) @@ -61,11 +66,6 @@ func createComponentPaths(basePath string, component types.ZarfComponent) compon } } -func cleanup(tempPath tempPaths) { - message.Debug("Cleaning up temp files") - _ = os.RemoveAll(tempPath.base) -} - func confirmAction(configPath string, userMessage string) bool { content, err := ioutil.ReadFile(configPath) if err != nil { @@ -173,6 +173,8 @@ func HandleIfURL(packagePath string, shasum string, insecureDeploy bool) string // Write the package to a local file tempPath := createPaths() + defer tempPath.clean() + localPackagePath := tempPath.base + providedURL.Path message.Debugf("Creating local package with the path: %s", localPackagePath) packageFile, _ := os.Create(localPackagePath) diff --git a/cli/internal/packager/create.go b/cli/internal/packager/create.go index 185b86e313..f4dab3dc36 100644 --- a/cli/internal/packager/create.go +++ b/cli/internal/packager/create.go @@ -26,6 +26,8 @@ func Create() { } tempPath := createPaths() + defer tempPath.clean() + packageName := config.GetPackageName() dataInjections := config.GetDataInjections() seedImages := config.GetSeedImages() @@ -79,8 +81,6 @@ func Create() { if err != nil { message.Fatal(err, "Unable to create the package archive") } - - cleanup(tempPath) } func addComponent(tempPath tempPaths, component types.ZarfComponent) { @@ -94,7 +94,7 @@ func addComponent(tempPath tempPaths, component types.ZarfComponent) { for _, chart := range component.Charts { isGitURL := re.MatchString(chart.Url) if isGitURL { - helm.DownloadChartFromGit(chart, componentPath.charts) + _ = helm.DownloadChartFromGit(chart, componentPath.charts) } else { helm.DownloadPublishedChart(chart, componentPath.charts) } @@ -139,8 +139,13 @@ func addComponent(tempPath tempPaths, component types.ZarfComponent) { } // Load all specified git repos - for _, url := range component.Repos { - // Pull all the references if there is no `@` in the string - git.Pull(url, componentPath.repos) + if len(component.Repos) > 0 { + spinner := message.NewProgressSpinner("Loading %v git repos", len(component.Repos)) + defer spinner.Stop() + for _, url := range component.Repos { + // Pull all the references if there is no `@` in the string + git.Pull(url, componentPath.repos, spinner) + } + spinner.Success() } } diff --git a/cli/internal/packager/deploy.go b/cli/internal/packager/deploy.go index 27c852793b..47df6d8517 100644 --- a/cli/internal/packager/deploy.go +++ b/cli/internal/packager/deploy.go @@ -24,9 +24,9 @@ var valueTemplate template.Values func Deploy() { message.Debug("packager.Deploy()") - // Prevent disk pressure on smaller systems due to leaking temp files - _ = os.RemoveAll("/tmp/zarf*") + tempPath := createPaths() + defer tempPath.clean() // Make sure the user gave us a package we can work with if utils.InvalidPath(config.DeployOptions.PackagePath) { @@ -56,7 +56,6 @@ func Deploy() { // Don't continue unless the user says so if !confirm { - cleanup(tempPath) os.Exit(0) } @@ -92,8 +91,6 @@ func Deploy() { } } - cleanup(tempPath) - // All done os.Exit(0) } diff --git a/cli/internal/packager/inspect.go b/cli/internal/packager/inspect.go index a7f0914b91..9cdc2efa8f 100644 --- a/cli/internal/packager/inspect.go +++ b/cli/internal/packager/inspect.go @@ -12,6 +12,7 @@ import ( // Inspect list the contents of a package func Inspect(packageName string) { tempPath := createPaths() + defer tempPath.clean() if utils.InvalidPath(packageName) { message.Fatalf(nil, "The package archive %s seems to be missing or unreadable.", packageName) @@ -36,6 +37,4 @@ func Inspect(packageName string) { } message.Infof("The package was built with Zarf CLI version %s\n", config.GetBuildData().Version) - cleanup(tempPath) - } diff --git a/cli/zarf.yaml b/cli/zarf.yaml index 171731f27e..22f5c0c42d 100644 --- a/cli/zarf.yaml +++ b/cli/zarf.yaml @@ -17,9 +17,6 @@ components: version: 3.5.1-bb.10 gitPath: chart namespace: gatekeeper - files: - - source: ../assets/manifests - target: manifests manifests: - name: test-manifests files: diff --git a/examples/big-bang/zarf.yaml b/examples/big-bang/zarf.yaml index 58dd4c5090..2618b3131b 100644 --- a/examples/big-bang/zarf.yaml +++ b/examples/big-bang/zarf.yaml @@ -40,7 +40,6 @@ components: # 2. Add the actual bigbang repo as well # https://repo1.dso.mil/platform-one/big-bang/bigbang/-/tags/1.17.0 repos: - - https://github.com/defenseunicorns/zarf.git - https://repo1.dso.mil/platform-one/big-bang/bigbang.git@1.17.0 - https://repo1.dso.mil/platform-one/big-bang/apps/core/cluster-auditor.git@0.3.0-bb.7 - https://repo1.dso.mil/platform-one/big-bang/apps/core/policy.git@3.5.2-bb.1 diff --git a/examples/tiny-kafka/zarf.yaml b/examples/tiny-kafka/zarf.yaml index 9d8514aacd..6d3b6526b0 100644 --- a/examples/tiny-kafka/zarf.yaml +++ b/examples/tiny-kafka/zarf.yaml @@ -27,4 +27,4 @@ components: files: - source: https://archive.apache.org/dist/kafka/2.8.0/kafka_2.13-2.8.0.tgz shasum: 3fa380ae5d1385111ee9c83b0d1806172924ffec2e29399fd1a42671a97492c6 - target: /opt/kafka.tgz + target: kafka.tgz From 5cc854d6d9da3f67df6977eac035ac547462207e Mon Sep 17 00:00:00 2001 From: Jeff McCoy Date: Mon, 24 Jan 2022 14:35:34 -0600 Subject: [PATCH 17/88] handle fuzzy image finding & big bang chart repos For big bang: `zarf prepare find-images -p /chart -a=amd64` --- cli/internal/helm/chart.go | 15 +- cli/internal/helm/repo.go | 8 +- cli/internal/helm/utils.go | 13 +- cli/internal/packager/prepare.go | 260 ++++++++++++++++++++++--------- 4 files changed, 206 insertions(+), 90 deletions(-) diff --git a/cli/internal/helm/chart.go b/cli/internal/helm/chart.go index 38db839d2f..193c043bcd 100644 --- a/cli/internal/helm/chart.go +++ b/cli/internal/helm/chart.go @@ -18,12 +18,13 @@ import ( ) type ChartOptions struct { - BasePath string - Chart types.ZarfChart - ReleaseName string - ChartOverride *chart.Chart - ValueOverride map[string]interface{} - Images []string + BasePath string + Chart types.ZarfChart + ReleaseName string + ChartLoadOverride string + ChartOverride *chart.Chart + ValueOverride map[string]interface{} + Images []string } type renderer struct { @@ -116,7 +117,7 @@ func TemplateChart(options ChartOptions) (string, error) { // Bind the helm action client := action.NewInstall(actionConfig) - client.DryRun = false + client.DryRun = true client.Replace = true // Skip the name check client.ClientOnly = true client.IncludeCRDs = true diff --git a/cli/internal/helm/repo.go b/cli/internal/helm/repo.go index 81ad3e83e3..a90bafd0cd 100644 --- a/cli/internal/helm/repo.go +++ b/cli/internal/helm/repo.go @@ -15,14 +15,14 @@ import ( ) // DownloadChartFromGit is a special implementation of chart downloads that support the https://p1.dso.mil/#/products/big-bang/ model -func DownloadChartFromGit(chart types.ZarfChart, destination string) { - spinner := message.NewProgressSpinner("Processing helm chart %s:%s from git url %s", chart.Name, chart.Version, chart.Url) +func DownloadChartFromGit(chart types.ZarfChart, destination string) string { + spinner := message.NewProgressSpinner("Processing helm chart %s", chart.Name) defer spinner.Stop() client := action.NewPackage() // Get the git repo - tempPath := git.DownloadRepoToTemp(chart.Url) + tempPath := git.DownloadRepoToTemp(chart.Url, spinner) // Switch to the correct tag git.CheckoutTag(tempPath, chart.Version) @@ -37,6 +37,8 @@ func DownloadChartFromGit(chart types.ZarfChart, destination string) { _ = os.RemoveAll(tempPath) spinner.Success() + + return name } // DownloadPublishedChart loads a specific chart version from a remote repo diff --git a/cli/internal/helm/utils.go b/cli/internal/helm/utils.go index 8bf928ff86..e57bd5889f 100644 --- a/cli/internal/helm/utils.go +++ b/cli/internal/helm/utils.go @@ -24,10 +24,13 @@ func StandardName(destination string, chart types.ZarfChart) string { // loadChartFromTarball returns a helm chart from a tarball func loadChartFromTarball(options ChartOptions) (*chart.Chart, error) { // Get the path the temporary helm chart tarball - sourceTarball := StandardName(options.BasePath+"/charts", options.Chart) + ".tgz" + sourceFile := StandardName(options.BasePath+"/charts", options.Chart) + ".tgz" + if options.ChartLoadOverride != "" { + sourceFile = options.ChartLoadOverride + } // Load the loadedChart tarball - loadedChart, err := loader.Load(sourceTarball) + loadedChart, err := loader.Load(sourceFile) if err != nil { return nil, fmt.Errorf("unable to load helm chart archive: %w", err) } @@ -43,8 +46,12 @@ func loadChartFromTarball(options ChartOptions) (*chart.Chart, error) { func parseChartValues(options ChartOptions) (map[string]interface{}, error) { valueOpts := &values.Options{} - for idx := range options.Chart.ValuesFiles { + for idx, file := range options.Chart.ValuesFiles { path := StandardName(options.BasePath+"/values", options.Chart) + "-" + strconv.Itoa(idx) + // If we are overriding the chart path, assuming this is for zarf prepare + if options.ChartLoadOverride != "" { + path = file + } valueOpts.ValueFiles = append(valueOpts.ValueFiles, path) } diff --git a/cli/internal/packager/prepare.go b/cli/internal/packager/prepare.go index 074b97b727..13e5ce3cd4 100644 --- a/cli/internal/packager/prepare.go +++ b/cli/internal/packager/prepare.go @@ -6,7 +6,9 @@ import ( "github.com/defenseunicorns/zarf/cli/internal/helm" "github.com/defenseunicorns/zarf/cli/internal/k8s" "github.com/defenseunicorns/zarf/cli/internal/message" + "github.com/defenseunicorns/zarf/cli/internal/utils" "github.com/defenseunicorns/zarf/cli/types" + "github.com/google/go-containerregistry/pkg/crane" v1 "k8s.io/api/apps/v1" corev1 "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" @@ -14,61 +16,115 @@ import ( "os" "regexp" "sort" + "strconv" + "strings" ) -var matchedImages []string +type ImageMap map[string]bool -func FindImages() { +var matchedImages ImageMap +var maybeImages ImageMap + +// FindImages iterates over a zarf.yaml and attempts to parse any images +func FindImages(repoHelmChartPath string) { // Load the given zarf package if err := config.LoadConfig("zarf.yaml"); err != nil { message.Fatal(err, "Unable to read the zarf.yaml file") } - tempPath := createPaths() components := config.GetComponents() + tempPath := createPaths() + defer tempPath.clean() for _, component := range components { - matchedImages = []string{} + // matchedImages holds the collection of images, reset per-component + matchedImages = make(ImageMap) + maybeImages = make(ImageMap) - if len(component.Charts)+len(component.Manifests) < 1 { + if len(component.Charts)+len(component.Manifests)+len(component.Repos) < 1 { // Skip if it doesn't have what we need continue } - // Only process helm charts and raw manifests - strippedComponent := types.ZarfComponent{ - Charts: component.Charts, - Manifests: component.Manifests, - } + if repoHelmChartPath != "" { + // Also process git repos that have helm charts + for _, repo := range component.Repos { + matches := strings.Split(repo, "@") + if len(matches) < 2 { + message.Warnf("Cannot convert git repo %s to helm chart without a version tag", repo) + continue + } - // keep things DRY by using the package creator - addComponent(tempPath, strippedComponent) + // Trim the first char to match how the packager expects it, this is messy,need to clean up better + repoHelmChartPath = strings.TrimPrefix(repoHelmChartPath, "/") + // If a repo helmchartpath is specified, + component.Charts = append(component.Charts, types.ZarfChart{ + Name: repo, + Url: matches[0], + Version: matches[1], + GitPath: repoHelmChartPath, + }) + } + } + + // resources are a slice of generic structs that represent parsed K8s resources var resources []*unstructured.Unstructured - for _, chart := range component.Charts { - // Generate helm templates to pass to gitops engine - template, err := helm.TemplateChart(helm.ChartOptions{ - BasePath: tempPath.components, - Chart: chart, - }) + componentPath := createComponentPaths(tempPath.components, component) + chartNames := make(map[string]string) - if err != nil { - message.Errorf(err, "Problem rendering the helm template for %s", chart.Url) - continue - } + if len(component.Charts) > 0 { + _ = utils.CreateDirectory(componentPath.charts, 0700) + _ = utils.CreateDirectory(componentPath.values, 0700) + gitUrlRegex := regexp.MustCompile(`\.git$`) - // Break the template into separate resources - yamls, _ := k8s.SplitYAML([]byte(template)) - for _, yaml := range yamls { - resources = append(resources, yaml) - } + for _, chart := range component.Charts { + isGitURL := gitUrlRegex.MatchString(chart.Url) + if isGitURL { + path := helm.DownloadChartFromGit(chart, componentPath.charts) + // track the actual chart path + chartNames[chart.Name] = path + } else { + helm.DownloadPublishedChart(chart, componentPath.charts) + } + + for idx, path := range chart.ValuesFiles { + chartValueName := helm.StandardName(componentPath.values, chart) + "-" + strconv.Itoa(idx) + utils.CreatePathAndCopy(path, chartValueName) + } + + var override string + var ok bool + if override, ok = chartNames[chart.Name]; ok { + chart.Name = "dummy" + } + + // Generate helm templates to pass to gitops engine + template, err := helm.TemplateChart(helm.ChartOptions{ + BasePath: componentPath.base, + Chart: chart, + ChartLoadOverride: override, + }) + + if err != nil { + message.Errorf(err, "Problem rendering the helm template for %s", chart.Url) + continue + } + + // Break the template into separate resources + yamls, _ := k8s.SplitYAML([]byte(template)) + for _, yaml := range yamls { + resources = append(resources, yaml) + } + } } for _, manifest := range component.Manifests { + // Get all manifest files for _, file := range manifest.Files { // Read the contents of each file contents, err := os.ReadFile(file) @@ -85,74 +141,124 @@ func FindImages() { } } - var imageSanityCheck = regexp.MustCompile(`(?mi)"image":"([^"]+)"`) - for _, resource := range resources { - contents := resource.UnstructuredContent() - json, _ := resource.MarshalJSON() - - switch resource.GetKind() { - case "Deployment": - var deployment v1.Deployment - if err := runtime.DefaultUnstructuredConverter.FromUnstructured(contents, &deployment); err != nil { - message.Errorf(err, "Unable to parse deployment") - continue - } - processPod(deployment.Spec.Template.Spec) + if err := processUnstructured(resource); err != nil { + message.Errorf(err, "Problem processing K8s resource %s", resource.GetName()) + } + } - case "DaemonSet": - var daemonSet v1.DaemonSet - if err := runtime.DefaultUnstructuredConverter.FromUnstructured(contents, &daemonSet); err != nil { - message.Errorf(err, "Unable to parse daemonset") - continue - } - processPod(daemonSet.Spec.Template.Spec) + if sortedImages := listImages(matchedImages, nil); len(sortedImages) > 0 { + // Log the header comment + fmt.Println(fmt.Sprintf(" # %s - %s", config.GetMetaData().Name, component.Name)) + for _, image := range sortedImages { + // Use print because we want this dumped to stdout + fmt.Println(" - " + image) + } + } - case "StatefulSet": - var statefulSet v1.StatefulSet - if err := runtime.DefaultUnstructuredConverter.FromUnstructured(contents, &statefulSet); err != nil { - message.Errorf(err, "Unable to parse statefulset") - continue + // Handle the "maybes" + if sortedImages := listImages(maybeImages, matchedImages); len(sortedImages) > 0 { + var realImages []string + for _, image := range sortedImages { + if descriptor, err := crane.Head(image, config.ActiveCranePlatform); err != nil { + // Test if this is a real image, if not just quiet log to debug, this is normal + message.Debugf("Suspected image does not appear to be valid: %w", err) + } else { + // Otherwise, add to the list of images + message.Debugf("Imaged digest found: %s", descriptor.Digest) + realImages = append(realImages, image) } - processPod(statefulSet.Spec.Template.Spec) + } - case "ReplicaSet": - var replicaSet v1.ReplicaSet - if err := runtime.DefaultUnstructuredConverter.FromUnstructured(contents, &replicaSet); err != nil { - message.Errorf(err, "Unable to parse replicaset") - continue - } - processPod(replicaSet.Spec.Template.Spec) - - default: - // Capture any custom images - matches := imageSanityCheck.FindAllStringSubmatch(string(json), -1) - for i := range matches { - message.Info(matches[i][1]) - matchedImages = append(matchedImages, matches[i][1]) + if len(realImages) > 0 { + fmt.Println(fmt.Sprintf(" # Possible images - %s - %s", config.GetMetaData().Name, component.Name)) + for _, image := range realImages { + fmt.Println(" - " + image) } } + } + } +} + +func listImages(images ImageMap, compareWith ImageMap) []string { + sortedImages := sort.StringSlice{} + for image := range images { + if !compareWith[image] || compareWith == nil { + // Check compareWith, if it exists only add if not in that list + sortedImages = append(sortedImages, image) + } + } + sort.Sort(sortedImages) + return sortedImages +} + +func processUnstructured(resource *unstructured.Unstructured) error { + var imageSanityCheck = regexp.MustCompile(`(?mi)"image":"([^"]+)"`) + var imageFuzzyCheck = regexp.MustCompile(`(?mi)"([a-z0-9\-./]+:[\w][\w.\-]{0,127})"`) + var json string + + contents := resource.UnstructuredContent() + bytes, _ := resource.MarshalJSON() + json = string(bytes) + + message.Debug() + + switch resource.GetKind() { + case "Deployment": + var deployment v1.Deployment + if err := runtime.DefaultUnstructuredConverter.FromUnstructured(contents, &deployment); err != nil { + return fmt.Errorf("could not parse deployment: %w", err) + } + processPod(deployment.Spec.Template.Spec) + + case "DaemonSet": + var daemonSet v1.DaemonSet + if err := runtime.DefaultUnstructuredConverter.FromUnstructured(contents, &daemonSet); err != nil { + return fmt.Errorf("could not parse daemonset: %w", err) + } + processPod(daemonSet.Spec.Template.Spec) + case "StatefulSet": + var statefulSet v1.StatefulSet + if err := runtime.DefaultUnstructuredConverter.FromUnstructured(contents, &statefulSet); err != nil { + return fmt.Errorf("could not parse statefulset: %w", err) } + processPod(statefulSet.Spec.Template.Spec) - fmt.Println(fmt.Sprintf(" # %s - %s", config.GetMetaData().Name, component.Name)) - uniqueImages := sort.StringSlice(removeDuplicates(matchedImages)) - sort.Sort(uniqueImages) - for _, image := range uniqueImages { - fmt.Println(" - " + image) + case "ReplicaSet": + var replicaSet v1.ReplicaSet + if err := runtime.DefaultUnstructuredConverter.FromUnstructured(contents, &replicaSet); err != nil { + return fmt.Errorf("could not parse replicaset: %w", err) + } + processPod(replicaSet.Spec.Template.Spec) + + default: + // Capture any custom images + matches := imageSanityCheck.FindAllStringSubmatch(json, -1) + for _, group := range matches { + message.Debugf("Found unknown match, Kind: %s, Value: %s", resource.GetKind(), group[1]) + matchedImages[group[1]] = true } - fmt.Println() } + // Capture "maybe images" too for all kinds because they might be in unexpected places.... 👀 + matches := imageFuzzyCheck.FindAllStringSubmatch(json, -1) + for _, group := range matches { + message.Debugf("Found possible fuzzy match, Kind: %s, Value: %s", resource.GetKind(), group[1]) + maybeImages[group[1]] = true + } + return nil } +// processPod looks for init container, ephemeral and regular container images func processPod(pod corev1.PodSpec) { for _, container := range pod.InitContainers { - // Add image for each init container - matchedImages = append(matchedImages, container.Image) + matchedImages[container.Image] = true } for _, container := range pod.Containers { - // Add image for each regular container - matchedImages = append(matchedImages, container.Image) + matchedImages[container.Image] = true + } + for _, container := range pod.EphemeralContainers { + matchedImages[container.Image] = true } } From ae4aa08371aa6e91b275cfb59c0bc3fb93f1681a Mon Sep 17 00:00:00 2001 From: Jeff McCoy Date: Mon, 24 Jan 2022 14:37:13 -0600 Subject: [PATCH 18/88] tiny typo --- zarf.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/zarf.yaml b/zarf.yaml index 7ce62d46c0..d6435db37d 100644 --- a/zarf.yaml +++ b/zarf.yaml @@ -19,7 +19,7 @@ components: before: # If running RHEL variant, disable firewalld # https://rancher.com/docs/k3s/latest/en/advanced/#additional-preparation-for-red-hat-centos-enterprise-linux - # NOTE: The empty echo prevents infinate retry loops on non-RHEL systems where the exit code would be an error + # NOTE: The empty echo prevents infinite retry loops on non-RHEL systems where the exit code would be an error - "[ -e /etc/redhat-release ] && systemctl disable firewalld --now || echo ''" after: # Configure K3s systemd service From a1fec1741053d687cb76eea647b34bcc4f8995f9 Mon Sep 17 00:00:00 2001 From: Matt Strong Date: Tue, 25 Jan 2022 10:14:44 -0600 Subject: [PATCH 19/88] fix tiny typo --- zarf.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/zarf.yaml b/zarf.yaml index d6435db37d..c68c8a92f4 100644 --- a/zarf.yaml +++ b/zarf.yaml @@ -11,7 +11,7 @@ components: description: > *** REQUIRES ROOT *** Install K3s, certified Kubernetes distribution built for IoT & Edge computing. - K3s provides the cluster need for Zarf running in Appliance MOde as well as can + K3s provides the cluster need for Zarf running in Appliance Mode as well as can host a low-resource Gitops Service if not using an existing Kubernetes platform. default: true scripts: From cfc776f241b4eae36f94878264e6ca1c1cd0e49d Mon Sep 17 00:00:00 2001 From: Jeff McCoy Date: Tue, 25 Jan 2022 17:07:51 -0600 Subject: [PATCH 20/88] fix packager.HandleIfURL() tempPath early deletion --- cli/cmd/package.go | 4 +++- cli/internal/packager/common.go | 6 +++--- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/cli/cmd/package.go b/cli/cmd/package.go index a1d78337d0..6eaaca0378 100644 --- a/cli/cmd/package.go +++ b/cli/cmd/package.go @@ -31,8 +31,10 @@ var packageDeployCmd = &cobra.Command{ Short: "Deploys an update package from a local file or URL (runs offline)", Args: cobra.MaximumNArgs(1), Run: func(cmd *cobra.Command, args []string) { + var done func() packageName := choosePackage(args) - config.DeployOptions.PackagePath = packager.HandleIfURL(packageName, shasum, insecureDeploy) + config.DeployOptions.PackagePath, done = packager.HandleIfURL(packageName, shasum, insecureDeploy) + defer done() packager.Deploy() }, } diff --git a/cli/internal/packager/common.go b/cli/internal/packager/common.go index 666af400f9..e9e37c75d3 100644 --- a/cli/internal/packager/common.go +++ b/cli/internal/packager/common.go @@ -148,11 +148,11 @@ func getValidComponents(allComponents []types.ZarfComponent, requestedComponentN } // HandleIfURL If provided package is a URL download it to a temp directory -func HandleIfURL(packagePath string, shasum string, insecureDeploy bool) string { +func HandleIfURL(packagePath string, shasum string, insecureDeploy bool) (string, func()) { // Check if the user gave us a remote package providedURL, err := url.Parse(packagePath) if err != nil || providedURL.Scheme == "" || providedURL.Host == "" { - return packagePath + return packagePath, func() {} } if !insecureDeploy && shasum == "" { @@ -198,7 +198,7 @@ func HandleIfURL(packagePath string, shasum string, insecureDeploy bool) string } } - return localPackagePath + return localPackagePath, tempPath.clean } func isValidFileExtension(filename string) bool { From 690b413137f1a4530631ddec41ad0e7e866d2112 Mon Sep 17 00:00:00 2001 From: Jeff McCoy Date: Tue, 25 Jan 2022 23:53:55 -0600 Subject: [PATCH 21/88] remove traefik, have doom use default ingressclass --- assets/manifests/traefik/traefik-tls.yaml | 19 -------- examples/game/manifests/deployment.yaml | 30 ++++++++++++ examples/game/manifests/game.yaml | 57 ----------------------- examples/game/manifests/ingress.yaml | 16 +++++++ examples/game/manifests/service.yaml | 13 ++++++ examples/game/zarf.yaml | 6 ++- zarf.yaml | 17 ------- 7 files changed, 63 insertions(+), 95 deletions(-) delete mode 100644 assets/manifests/traefik/traefik-tls.yaml create mode 100644 examples/game/manifests/deployment.yaml delete mode 100644 examples/game/manifests/game.yaml create mode 100644 examples/game/manifests/ingress.yaml create mode 100644 examples/game/manifests/service.yaml diff --git a/assets/manifests/traefik/traefik-tls.yaml b/assets/manifests/traefik/traefik-tls.yaml deleted file mode 100644 index 513e40405a..0000000000 --- a/assets/manifests/traefik/traefik-tls.yaml +++ /dev/null @@ -1,19 +0,0 @@ -apiVersion: traefik.containo.us/v1alpha1 -kind: TLSStore -metadata: - name: default - namespace: kube-system -spec: - defaultCertificate: - secretName: tls-pem ---- -apiVersion: traefik.containo.us/v1alpha1 -kind: Middleware -metadata: - name: ssl-redirect - namespace: kube-system -spec: - redirectRegex: - regex: ^http://(.*) - replacement: https://${1} - permanent: true diff --git a/examples/game/manifests/deployment.yaml b/examples/game/manifests/deployment.yaml new file mode 100644 index 0000000000..fca6100f17 --- /dev/null +++ b/examples/game/manifests/deployment.yaml @@ -0,0 +1,30 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: game + namespace: default +spec: + selector: + matchLabels: + app: game + template: + metadata: + labels: + app: game + spec: + containers: + - name: game + image: "defenseunicorns/zarf-game:doom" + ports: + - name: http + containerPort: 8000 + protocol: TCP + resources: + requests: + memory: "64Mi" + cpu: "250m" + limits: + memory: "128Mi" + cpu: "500m" + imagePullSecrets: + - name: zarf-registry diff --git a/examples/game/manifests/game.yaml b/examples/game/manifests/game.yaml deleted file mode 100644 index ca76b81605..0000000000 --- a/examples/game/manifests/game.yaml +++ /dev/null @@ -1,57 +0,0 @@ -apiVersion: networking.k8s.io/v1 -kind: Ingress -metadata: - name: demo-ingress - namespace: default - annotations: - kubernetes.io/ingress.class: "traefik" - traefik.ingress.kubernetes.io/router.middlewares: kube-system-ssl-redirect@kubernetescrd -spec: - rules: - - http: - paths: - - path: / - pathType: Prefix - backend: - service: - name: game - port: - number: 8000 ---- -apiVersion: apps/v1 -kind: Deployment -metadata: - name: game - namespace: default -spec: - selector: - matchLabels: - app: game - template: - metadata: - labels: - app: game - spec: - containers: - - name: game - image: "registry.dso.mil/platform-one/big-bang/apps/product-tools/zarf/game:doom" - ports: - - name: http - containerPort: 8000 - protocol: TCP - imagePullSecrets: - - name: zarf-registry ---- -apiVersion: v1 -kind: Service -metadata: - name: game - namespace: default -spec: - selector: - app: game - ports: - - name: http - port: 8000 - protocol: TCP - targetPort: 8000 diff --git a/examples/game/manifests/ingress.yaml b/examples/game/manifests/ingress.yaml new file mode 100644 index 0000000000..a1187be99c --- /dev/null +++ b/examples/game/manifests/ingress.yaml @@ -0,0 +1,16 @@ +apiVersion: networking.k8s.io/v1 +kind: Ingress +metadata: + name: demo-ingress + namespace: default +spec: + rules: + - http: + paths: + - path: / + pathType: Prefix + backend: + service: + name: game + port: + number: 8000 diff --git a/examples/game/manifests/service.yaml b/examples/game/manifests/service.yaml new file mode 100644 index 0000000000..efa127662b --- /dev/null +++ b/examples/game/manifests/service.yaml @@ -0,0 +1,13 @@ +apiVersion: v1 +kind: Service +metadata: + name: game + namespace: default +spec: + selector: + app: game + ports: + - name: http + port: 8000 + protocol: TCP + targetPort: 8000 diff --git a/examples/game/zarf.yaml b/examples/game/zarf.yaml index 01b249d553..652319a554 100644 --- a/examples/game/zarf.yaml +++ b/examples/game/zarf.yaml @@ -9,6 +9,8 @@ components: manifests: - name: doom files: - - manifests/game.yaml + - manifests/ingress.yaml + - manifests/deployment.yaml + - manifests/service.yaml images: - - registry.dso.mil/platform-one/big-bang/apps/product-tools/zarf/game:doom + - defenseunicorns/zarf-game:doom diff --git a/zarf.yaml b/zarf.yaml index c68c8a92f4..247a4b2bfe 100644 --- a/zarf.yaml +++ b/zarf.yaml @@ -82,23 +82,6 @@ components: valuesFiles: - assets/charts/registry-values.yaml - - name: traefik-ingress - description: "Install the Traefik ingress (usually needed for appliance mode)" - default: true - manifests: - - name: configure-traefik-tls - files: - - assets/manifests/traefik/traefik-tls.yaml - images: - - traefik:2.5.6 - charts: - - name: traefik - url: https://helm.traefik.io/traefik - version: 10.9.1 - namespace: zarf - valuesFiles: - - assets/charts/traefik-values.yaml - - name: logging description: "Add Promtail, Grafana and Loki (PGL) to this cluster for log monitoring." default: true From d2e4572c258eb89c2488713229a00b0eb48c7233 Mon Sep 17 00:00:00 2001 From: Jeff McCoy Date: Tue, 25 Jan 2022 23:54:12 -0600 Subject: [PATCH 22/88] add multi-arch support for doom image --- examples/game/image/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/game/image/Dockerfile b/examples/game/image/Dockerfile index 6f753a111a..551c95b8c8 100644 --- a/examples/game/image/Dockerfile +++ b/examples/game/image/Dockerfile @@ -24,4 +24,4 @@ COPY --from=0 /binary /binary WORKDIR /site ENTRYPOINT ["/binary/darkhttpd", "/site", "--port", "8000"] -# docker build -t registry.dso.mil/platform-one/big-bang/apps/product-tools/zarf/game:doom --build-arg GAME_URL=https://archive.org/download/DoomsharewareEpisode/doom.ZIP --build-arg GAME_ARGS=\"DOOM.EXE\" . +# docker buildx build --push --platform linux/arm/v7,linux/arm64/v8,linux/amd64 --tag defenseunicorns/zarf-game:doom --build-arg GAME_URL=https://archive.org/download/DoomsharewareEpisode/doom.ZIP --build-arg GAME_ARGS=\"DOOM.EXE\" . From c454a94c1342cc42a2ef6121cfad12dab6f08f5f Mon Sep 17 00:00:00 2001 From: Jeff McCoy Date: Tue, 25 Jan 2022 23:54:41 -0600 Subject: [PATCH 23/88] handle arch mismatch on zarf package deploy --- cli/cmd/root.go | 5 ----- cli/config/config.go | 17 +++++++++++++++-- cli/internal/packager/deploy.go | 13 ++++++++++++- cli/internal/packager/seed.go | 1 + cli/types/types.go | 12 +++++++----- examples/big-bang/zarf.yaml | 2 ++ 6 files changed, 37 insertions(+), 13 deletions(-) diff --git a/cli/cmd/root.go b/cli/cmd/root.go index cbfa9d34e1..24a147db8f 100644 --- a/cli/cmd/root.go +++ b/cli/cmd/root.go @@ -3,7 +3,6 @@ package cmd import ( "fmt" "os" - "runtime" "strings" "github.com/defenseunicorns/zarf/cli/config" @@ -22,10 +21,6 @@ var rootCmd = &cobra.Command{ if zarfLogLevel != "" { setLogLevel(zarfLogLevel) } - if arch == "" { - // Default to the current running arch for images - arch = runtime.GOARCH - } config.SetAcrch(arch) }, Short: "Small tool to bundle dependencies with K3s for air-gaped deployments", diff --git a/cli/config/config.go b/cli/config/config.go index e86862ec1a..f328c42e96 100644 --- a/cli/config/config.go +++ b/cli/config/config.go @@ -2,12 +2,14 @@ package config import ( "fmt" - "github.com/defenseunicorns/zarf/cli/types" "os" "os/user" + "runtime" "strings" "time" + "github.com/defenseunicorns/zarf/cli/types" + "github.com/defenseunicorns/zarf/cli/internal/message" "github.com/defenseunicorns/zarf/cli/internal/utils" "github.com/google/go-containerregistry/pkg/crane" @@ -58,8 +60,19 @@ func IsZarfInitConfig() bool { } func SetAcrch(arch string) { + if arch == "" { + // If not cli override for arch, set to the package arch + arch = config.Metadata.Architecture + + if arch == "" { + // Finally, default to current system arch when all else fails + arch = runtime.GOARCH + } + } + message.Debugf("config.SetArch(%s)", arch) - config.Build.Arch = arch + config.Build.Architecture = arch + // Use the arch to define the image push/pull options for crane ActiveCranePlatform = crane.WithPlatform(&v1.Platform{OS: "linux", Architecture: arch}) } diff --git a/cli/internal/packager/deploy.go b/cli/internal/packager/deploy.go index 47df6d8517..c074a5002c 100644 --- a/cli/internal/packager/deploy.go +++ b/cli/internal/packager/deploy.go @@ -156,15 +156,26 @@ func deployComponents(tempPath tempPaths, component types.ZarfComponent) { } if !valueTemplate.Ready() && (hasImages || hasCharts || hasManifests || hasRepos) { + // If we are touching K8s, make sure we can talk to it once per deployment spinner := message.NewProgressSpinner("Loading the Zarf State from the Kubernetes cluster") defer spinner.Stop() state := k8s.LoadZarfState() config.InitState(state) valueTemplate = template.Generate() + if state.Distro == "" { - spinner.Fatalf(nil, "Unable to load the zarf/zarf-state secret") + // If no distro the zarf secret did not load properly + spinner.Fatalf(nil, "Unable to load the zarf/zarf-state secret, did you remember to run zarf init first?") + } + + if hasImages && state.Architecture != config.GetBuildData().Architecture { + // If the package has images but the architectures don't match warn the user to avoid ugly hidden errors with image push/pull + spinner.Fatalf(nil, "This package architecture is %s, but this cluster seems to be initailized with the %s architecture", + config.GetBuildData().Architecture, + state.Architecture) } + spinner.Success() } diff --git a/cli/internal/packager/seed.go b/cli/internal/packager/seed.go index 056ea64a4b..0a8ff11b34 100644 --- a/cli/internal/packager/seed.go +++ b/cli/internal/packager/seed.go @@ -124,6 +124,7 @@ func preSeedRegistry(tempPath tempPaths) { state.Registry.NodePort = "31999" state.Secret = utils.RandomString(120) state.Distro = distro + state.Architecture = config.GetBuildData().Architecture } switch state.Distro { diff --git a/cli/types/types.go b/cli/types/types.go index cf78d2b7f1..248ed071ad 100644 --- a/cli/types/types.go +++ b/cli/types/types.go @@ -66,6 +66,7 @@ type ZarfMetadata struct { Url string `yaml:"url,omitempty"` Image string `yaml:"image,omitempty"` Uncompressed bool `yaml:"uncompressed,omitempty"` + Architecture string `yaml:"architecture,omitempty"` } // ZarfContainerTarget defines the destination info for a ZarfData target @@ -84,11 +85,11 @@ type ZarfData struct { // ZarfBuildData is written during the packager.Create() operation to track details of the created package type ZarfBuildData struct { - Terminal string `yaml:"terminal"` - User string `yaml:"user"` - Arch string `yaml:"arch"` - Timestamp string `yaml:"timestamp"` - Version string `yaml:"string"` + Terminal string `yaml:"terminal"` + User string `yaml:"user"` + Architecture string `yaml:"architecture"` + Timestamp string `yaml:"timestamp"` + Version string `yaml:"string"` } // ZarfPackage the top-level structure of a Zarf config file @@ -105,6 +106,7 @@ type ZarfPackage struct { type ZarfState struct { ZarfAppliance bool `json:"zarfAppliance"` Distro string `json:"distro"` + Architecture string `json:"architecture"` StorageClass string `json:"storageClass"` Secret string `json:"secret"` Registry struct { diff --git a/examples/big-bang/zarf.yaml b/examples/big-bang/zarf.yaml index 2618b3131b..9bd9ecc0c7 100644 --- a/examples/big-bang/zarf.yaml +++ b/examples/big-bang/zarf.yaml @@ -2,6 +2,8 @@ kind: ZarfPackageConfig metadata: name: big-bang-core-demo description: "Demo Zarf basic deployment of Big Bang core" + # Big Bang / Iron Bank are only amd64 + architecture: amd64 components: - name: flux From 5a3b6603350af1bc3f98936431dbbd4ba6ad9ddf Mon Sep 17 00:00:00 2001 From: Jeff McCoy Date: Wed, 26 Jan 2022 09:07:30 -0600 Subject: [PATCH 24/88] re-enable built-in traefik for appliance mode --- assets/scripts/k3s.service | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/assets/scripts/k3s.service b/assets/scripts/k3s.service index ddbf47b8c3..a27ba9da0f 100644 --- a/assets/scripts/k3s.service +++ b/assets/scripts/k3s.service @@ -24,4 +24,4 @@ RestartSec=5s ExecStartPre=/bin/sh -xc '! /usr/bin/systemctl is-enabled --quiet nm-cloud-setup.service' ExecStartPre=-/sbin/modprobe br_netfilter ExecStartPre=-/sbin/modprobe overlay -ExecStart=/usr/local/bin/k3s server --write-kubeconfig-mode=700 --disable traefik +ExecStart=/usr/local/bin/k3s server --write-kubeconfig-mode=700 From 006f309d9052180ff828d93a665f0ff86f6e583f Mon Sep 17 00:00:00 2001 From: Jeff McCoy Date: Wed, 26 Jan 2022 21:30:29 -0600 Subject: [PATCH 25/88] implement svc label/annotation for dynamic zarf connect, update doom ex --- .vscode/launch.json | 5 +- cli/config/config.go | 3 + cli/internal/helm/chart.go | 66 +++++++++++---- cli/internal/k8s/services.go | 19 +++++ cli/internal/k8s/tunnel.go | 122 +++++++++++++++++++-------- cli/internal/message/message.go | 3 + cli/internal/packager/deploy.go | 43 ++++++++-- cli/types/types.go | 11 --- examples/game/manifests/service.yaml | 5 ++ 9 files changed, 206 insertions(+), 71 deletions(-) diff --git a/.vscode/launch.json b/.vscode/launch.json index 7220cf858a..15d1f0f187 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -12,9 +12,8 @@ "program": "${workspaceFolder}/cli", "env": {}, "args": [ - "init", - "--confirm", - "--components=gitops-service" + "connect", + "doom" ] }, diff --git a/cli/config/config.go b/cli/config/config.go index f328c42e96..93d2f810e3 100644 --- a/cli/config/config.go +++ b/cli/config/config.go @@ -35,6 +35,9 @@ const ( ZarfSeedTypeCLIInject = "cli-inject" ZarfSeedTypeRuntimeRegistry = "runtime-registry" ZarfSeedTypeInClusterRegistry = "in-cluster-registry" + + ZarfConnectLabelName = "zarf.dev/connect-name" + ZarfConnectAnnotationDescription = "zarf.dev/connect-description" ) var ( diff --git a/cli/internal/helm/chart.go b/cli/internal/helm/chart.go index 193c043bcd..47bd749775 100644 --- a/cli/internal/helm/chart.go +++ b/cli/internal/helm/chart.go @@ -3,11 +3,13 @@ package helm import ( "bytes" "fmt" - "github.com/defenseunicorns/zarf/cli/types" "io/ioutil" "os" "time" + "github.com/defenseunicorns/zarf/cli/config" + "github.com/defenseunicorns/zarf/cli/types" + "github.com/defenseunicorns/zarf/cli/internal/k8s" "github.com/defenseunicorns/zarf/cli/internal/message" "github.com/defenseunicorns/zarf/cli/internal/utils" @@ -17,6 +19,7 @@ import ( "helm.sh/helm/v3/pkg/storage/driver" ) +type ConnectStrings map[string]string type ChartOptions struct { BasePath string Chart types.ZarfChart @@ -28,12 +31,13 @@ type ChartOptions struct { } type renderer struct { - images []string - namespaces []string + images []string + namespaces []string + connectStrings ConnectStrings } // InstallOrUpgradeChart performs a helm install of the given chart -func InstallOrUpgradeChart(options ChartOptions) { +func InstallOrUpgradeChart(options ChartOptions) ConnectStrings { spinner := message.NewProgressSpinner("Processing helm chart %s:%s from %s", options.Chart.Name, options.Chart.Version, @@ -42,6 +46,7 @@ func InstallOrUpgradeChart(options ChartOptions) { var output *release.Release + postRender := NewRenderer(options.Images, options.Chart.Namespace) options.ReleaseName = fmt.Sprintf("zarf-%s", options.Chart.Name) actionConfig, err := createActionConfig(options.Chart.Namespace) @@ -79,12 +84,12 @@ func InstallOrUpgradeChart(options ChartOptions) { case driver.ErrReleaseNotFound: // No prior release, try to install it spinner.Updatef("Attempting chart installation") - output, err = installChart(actionConfig, options) + output, err = installChart(actionConfig, options, postRender) case nil: // Otherwise, there is a prior release so upgrade it spinner.Updatef("Attempting chart upgrade") - output, err = upgradeChart(actionConfig, options) + output, err = upgradeChart(actionConfig, options, postRender) default: // 😭 things aren't working @@ -102,10 +107,14 @@ func InstallOrUpgradeChart(options ChartOptions) { } } + + // return any collected connect strings for zarf connect + return postRender.connectStrings } // TemplateChart generates a helm template from a given chart func TemplateChart(options ChartOptions) (string, error) { + message.Debugf("helm.TemplateChart(%v)", options) actionConfig, err := createActionConfig(options.Chart.Namespace) @@ -141,7 +150,8 @@ func TemplateChart(options ChartOptions) (string, error) { return templatedChart.Manifest, nil } -func GenerateChart(basePath string, manifest types.ZarfManifest, images []string) { +func GenerateChart(basePath string, manifest types.ZarfManifest, images []string) ConnectStrings { + message.Debugf("helm.GenerateChart(%s, %v, %v)", basePath, manifest, images) spinner := message.NewProgressSpinner("Starting helm chart generation %s", manifest.Name) defer spinner.Stop() @@ -189,10 +199,11 @@ func GenerateChart(basePath string, manifest types.ZarfManifest, images []string spinner.Success() - InstallOrUpgradeChart(options) + return InstallOrUpgradeChart(options) } -func installChart(actionConfig *action.Configuration, options ChartOptions) (*release.Release, error) { +func installChart(actionConfig *action.Configuration, options ChartOptions, postRender *renderer) (*release.Release, error) { + message.Debugf("helm.installChart(%v, %v, %v)", actionConfig, options, postRender) // Bind the helm action client := action.NewInstall(actionConfig) @@ -211,7 +222,7 @@ func installChart(actionConfig *action.Configuration, options ChartOptions) (*re client.Namespace = options.Chart.Namespace // Post-processing our manifests for reasons.... - client.PostRenderer = NewRenderer(options.Images, options.Chart.Namespace) + client.PostRenderer = postRender loadedChart, chartValues, err := loadChartData(options) if err != nil { @@ -222,7 +233,8 @@ func installChart(actionConfig *action.Configuration, options ChartOptions) (*re return client.Run(loadedChart, chartValues) } -func upgradeChart(actionConfig *action.Configuration, options ChartOptions) (*release.Release, error) { +func upgradeChart(actionConfig *action.Configuration, options ChartOptions, postRender *renderer) (*release.Release, error) { + message.Debugf("helm.upgradeChart(%v, %v, %v)", actionConfig, options, postRender) client := action.NewUpgrade(actionConfig) // Let each chart run for 5 minutes @@ -236,7 +248,7 @@ func upgradeChart(actionConfig *action.Configuration, options ChartOptions) (*re client.Namespace = options.Chart.Namespace // Post-processing our manifests for reasons.... - client.PostRenderer = NewRenderer(options.Images, options.Chart.Namespace) + client.PostRenderer = postRender loadedChart, chartValues, err := loadChartData(options) if err != nil { @@ -248,6 +260,7 @@ func upgradeChart(actionConfig *action.Configuration, options ChartOptions) (*re } func rollbackChart(actionConfig *action.Configuration, name string) error { + message.Debugf("helm.rollbackChart(%v, %s)", actionConfig, name) client := action.NewRollback(actionConfig) client.CleanupOnFail = true client.Force = true @@ -257,6 +270,7 @@ func rollbackChart(actionConfig *action.Configuration, name string) error { } func uninstallChart(actionConfig *action.Configuration, name string) (*release.UninstallReleaseResponse, error) { + message.Debugf("helm.uninstallChart(%v, %s)", actionConfig, name) client := action.NewUninstall(actionConfig) client.KeepHistory = false client.Timeout = 3 * time.Minute @@ -265,6 +279,7 @@ func uninstallChart(actionConfig *action.Configuration, name string) (*release.U } func loadChartData(options ChartOptions) (*chart.Chart, map[string]interface{}, error) { + message.Debugf("helm.loadChartData(%v)", options) var ( loadedChart *chart.Chart chartValues map[string]interface{} @@ -293,14 +308,16 @@ func loadChartData(options ChartOptions) (*chart.Chart, map[string]interface{}, } func NewRenderer(images []string, namespace string) *renderer { + message.Debugf("helm.NewRenderer(%v, %s)", images, namespace) return &renderer{ - images: images, - namespaces: []string{namespace}, + images: images, + namespaces: []string{namespace}, + connectStrings: make(ConnectStrings), } } func (r *renderer) Run(renderedManifests *bytes.Buffer) (*bytes.Buffer, error) { - message.Debug("Post-rendering helm chart") + message.Debugf("helm.Run(%v)", renderedManifests) // This is very low cost and consistent for how we replace elsewhere, also good for debugging tempDir, _ := utils.MakeTempDir() path := tempDir + "/chart.yaml" @@ -331,10 +348,28 @@ func (r *renderer) Run(renderedManifests *bytes.Buffer) (*bytes.Buffer, error) { // grab the namespace, namespace := resource.GetNamespace() message.Debugf("Found namespace %s", namespace) + // and append to the list if it's unique if namespace != "" && !contains(r.namespaces, namespace) { r.namespaces = append(r.namespaces, namespace) } + + if resource.GetKind() == "Service" { + // Check service resources for the zarf-connect label + labels := resource.GetLabels() + annotations := resource.GetAnnotations() + + if key, keyExists := labels[config.ZarfConnectLabelName]; keyExists { + // If there is a zarf-connect label + if description, descExists := annotations[config.ZarfConnectAnnotationDescription]; descExists { + // and a description set the label and description + r.connectStrings[key] = description + } else { + // Otherwise, just set the label + r.connectStrings[key] = "" + } + } + } } } @@ -352,6 +387,7 @@ func (r *renderer) Run(renderedManifests *bytes.Buffer) (*bytes.Buffer, error) { } func contains(haystack []string, needle string) bool { + message.Debugf("helm.contains(%v, %s)", haystack, needle) for _, hay := range haystack { if hay == needle { return true diff --git a/cli/internal/k8s/services.go b/cli/internal/k8s/services.go index 174389a98b..9eda2fbc36 100644 --- a/cli/internal/k8s/services.go +++ b/cli/internal/k8s/services.go @@ -3,12 +3,31 @@ package k8s import ( "context" + "github.com/defenseunicorns/zarf/cli/internal/message" corev1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" ) // GetService returns a Kubernetes service resource in the provided namespace with the given name. func GetService(namespace string, serviceName string) (*corev1.Service, error) { + message.Debugf("k8s.GetService(%s, %s)", namespace, serviceName) clientset := getClientset() return clientset.CoreV1().Services(namespace).Get(context.Background(), serviceName, metav1.GetOptions{}) } + +// GetServicesByLabelExists returns a list of matched services given a set of labels. TO search all namespaces, pass "" in the namespace arg +func GetServicesByLabelExists(namespace string, label string) (*corev1.ServiceList, error) { + message.Debugf("k8s.GetServicesByLabelExists(%s, %s)", namespace, label) + clientset := getClientset() + + // Creat the selector and add the requirement + labelSelector, _ := metav1.LabelSelectorAsSelector(&metav1.LabelSelector{ + MatchExpressions: []metav1.LabelSelectorRequirement{{ + Key: label, + Operator: metav1.LabelSelectorOpExists, + }}, + }) + + // Run the query with the selector and return as a ServiceList + return clientset.CoreV1().Services(namespace).List(context.TODO(), metav1.ListOptions{LabelSelector: labelSelector.String()}) +} diff --git a/cli/internal/k8s/tunnel.go b/cli/internal/k8s/tunnel.go index ca6d2f70b3..e09c655264 100644 --- a/cli/internal/k8s/tunnel.go +++ b/cli/internal/k8s/tunnel.go @@ -4,12 +4,12 @@ package k8s import ( "fmt" - "github.com/defenseunicorns/zarf/cli/types" "io" "io/ioutil" "net" "net/http" "os" + "os/exec" "os/signal" "runtime" "strconv" @@ -17,6 +17,8 @@ import ( "sync" "syscall" + "github.com/defenseunicorns/zarf/cli/types" + "github.com/defenseunicorns/zarf/cli/config" "github.com/defenseunicorns/zarf/cli/internal/message" "k8s.io/client-go/tools/portforward" @@ -65,6 +67,7 @@ type Tunnel struct { // Note that if you use 0 for the local port, an open port on the host system // will be selected automatically, and the Tunnel struct will be updated with the selected port. func NewTunnel(namespace string, resourceType string, resourceName string, local int, remote int) *Tunnel { + message.Debugf("tunnel.NewTunnel(%s, %s, %s, %v, %v)", namespace, resourceType, resourceName, local, remote) return &Tunnel{ out: ioutil.Discard, localPort: local, @@ -82,6 +85,7 @@ func NewZarfTunnel() *Tunnel { } func (tunnel *Tunnel) Connect(target string, blocking bool) { + message.Debugf("tunnel.Connect(%s, %v)", target, blocking) switch strings.ToUpper(target) { case ZarfRegistry: tunnel.resourceName = "zarf-docker-registry" @@ -96,6 +100,12 @@ func (tunnel *Tunnel) Connect(target string, blocking bool) { tunnel.localPort = PortGit tunnel.remotePort = 3000 default: + if target != "" { + if err := tunnel.checkForZarfConnectLabel(target); err != nil { + message.Errorf(err, "Problem looking for a zarf connect label in the cluster") + } + } + if tunnel.resourceName == "" { message.Fatalf(nil, "Ensure a resource name is provided") } @@ -104,12 +114,23 @@ func (tunnel *Tunnel) Connect(target string, blocking bool) { } } - if err := tunnel.Establish(); err != nil { + if url, err := tunnel.Establish(); err != nil { + // On error abbort message.Fatal(err, "Unable to establish the tunnel") - } + } else if blocking { + // Otherwise, if this is blocking it is coming from a user request so try to open the URL, but ignore errors + switch runtime.GOOS { + case "linux": + _ = exec.Command("xdg-open", url).Start() + case "windows": + _ = exec.Command("rundll32", "url.dll,FileProtocolHandler", url).Start() + case "darwin": + _ = exec.Command("open", url).Start() + } - if blocking { + // Since this blocking, set the defer now so it closes properly on sigterm defer tunnel.Close() + // Keep this open until an interrupt signal is received c := make(chan os.Signal) signal.Notify(c, os.Interrupt, syscall.SIGTERM) @@ -126,45 +147,43 @@ func (tunnel *Tunnel) Connect(target string, blocking bool) { // Endpoint returns the tunnel endpoint func (tunnel *Tunnel) Endpoint() string { + message.Debug("tunnel.Endpoint()") return fmt.Sprintf("localhost:%d", tunnel.localPort) } // Close disconnects a tunnel connection by closing the StopChan, thereby stopping the goroutine. func (tunnel *Tunnel) Close() { + message.Debug("tunnel.Close()") close(tunnel.stopChan) } -// getAttachablePodForResource will find a pod that can be port forwarded to the provided resource type and return -// the name. -func (tunnel *Tunnel) getAttachablePodForResource() (string, error) { - switch tunnel.resourceType { - case PodResource: - return tunnel.resourceName, nil - case SvcResource: - return tunnel.getAttachablePodForService() - default: - return "", fmt.Errorf("unknown resource type: %s", tunnel.resourceType) - } -} - -// getAttachablePodForServiceE will find an active pod associated with the Service and return the pod name. -func (tunnel *Tunnel) getAttachablePodForService() (string, error) { - service, err := GetService(tunnel.namespace, tunnel.resourceName) +func (tunnel *Tunnel) checkForZarfConnectLabel(name string) error { + message.Debugf("tunnel.checkForZarfConnectLabel(%s)", name) + matches, err := GetServicesByLabelExists("", config.ZarfConnectLabelName) if err != nil { - return "", fmt.Errorf("unable to find the service: %w", err) + return fmt.Errorf("unable to lookup the service: %w", err) } - selectorLabelsOfPods := makeLabels(service.Spec.Selector) - servicePods := WaitForPodsAndContainers(types.ZarfContainerTarget{ - Namespace: tunnel.namespace, - Selector: selectorLabelsOfPods, - }, false) + if len(matches.Items) > 0 { + // If there is a match, use the first one as these are supposed to be unique + svc := matches.Items[0] - return servicePods[0], nil + // Reset based on the matched params + tunnel.resourceType = SvcResource + tunnel.resourceName = svc.Name + tunnel.namespace = svc.Namespace + // Only support a service with a single port + tunnel.remotePort = svc.Spec.Ports[0].TargetPort.IntValue() + + message.Debugf("tunnel connection match: %s/%s on port %i", svc.Namespace, svc.Name, tunnel.remotePort) + } + + return nil } // Establish opens a tunnel to a kubernetes resource, as specified by the provided tunnel struct. -func (tunnel *Tunnel) Establish() error { +func (tunnel *Tunnel) Establish() (string, error) { + message.Debug("tunnel.Establish()") spinner := message.NewProgressSpinner("Creating a port forwarding tunnel for resource %s/%s in namespace %s routing local port %d to remote port %d", tunnel.resourceType, tunnel.resourceName, @@ -177,7 +196,7 @@ func (tunnel *Tunnel) Establish() error { // Find the pod to port forward to podName, err := tunnel.getAttachablePodForResource() if err != nil { - return fmt.Errorf("unable to find pod attached to given resource: %w", err) + return "", fmt.Errorf("unable to find pod attached to given resource: %w", err) } spinner.Debugf("Selected pod %s to open port forward to", podName) @@ -201,7 +220,7 @@ func (tunnel *Tunnel) Establish() error { // Construct the spdy client required by the client-go portforward library transport, upgrader, err := spdy.RoundTripperFor(restConfig) if err != nil { - return fmt.Errorf("unable to create the spdy client %w", err) + return "", fmt.Errorf("unable to create the spdy client %w", err) } dialer := spdy.NewDialer(upgrader, &http.Client{Transport: transport}, "POST", portForwardCreateURL) @@ -215,7 +234,7 @@ func (tunnel *Tunnel) Establish() error { spinner.Debugf("Requested local port is 0. Selecting an open port on host system") tunnel.localPort, err = GetAvailablePort() if err != nil { - return fmt.Errorf("unable to find an available port: %w", err) + return "", fmt.Errorf("unable to find an available port: %w", err) } spinner.Debugf("Selected port %d", tunnel.localPort) globalMutex.Lock() @@ -226,7 +245,7 @@ func (tunnel *Tunnel) Establish() error { ports := []string{fmt.Sprintf("%d:%d", tunnel.localPort, tunnel.remotePort)} portforwarder, err := portforward.New(dialer, ports, tunnel.stopChan, tunnel.readyChan, tunnel.out, tunnel.out) if err != nil { - return fmt.Errorf("unable to create the port forward: %w", err) + return "", fmt.Errorf("unable to create the port forward: %w", err) } // Open the tunnel in a goroutine so that it is available in the background. Report errors to the main goroutine via @@ -239,16 +258,18 @@ func (tunnel *Tunnel) Establish() error { // Wait for an error or the tunnel to be ready select { case err = <-errChan: - return fmt.Errorf("unable to start the tunnel: %w", err) + return "", fmt.Errorf("unable to start the tunnel: %w", err) case <-portforwarder.Ready: - spinner.Successf("Creating port forwarding tunnel available at http://%s:%v", config.IPV4Localhost, tunnel.localPort) - return nil + url := fmt.Sprintf("http://%s:%v", config.IPV4Localhost, tunnel.localPort) + spinner.Successf("Creating port forwarding tunnel available at %s", url) + return url, nil } } // GetAvailablePort retrieves an available port on the host machine. This delegates the port selection to the golang net // library by starting a server and then checking the port that the server is using. func GetAvailablePort() (int, error) { + message.Debug("tunnel.GetAvailablePort()") l, err := net.Listen("tcp", ":0") if err != nil { return 0, err @@ -268,3 +289,34 @@ func GetAvailablePort() (int, error) { } return port, err } + +// getAttachablePodForResource will find a pod that can be port forwarded to the provided resource type and return +// the name. +func (tunnel *Tunnel) getAttachablePodForResource() (string, error) { + message.Debug("tunnel.GettAttachablePodForResource()") + switch tunnel.resourceType { + case PodResource: + return tunnel.resourceName, nil + case SvcResource: + return tunnel.getAttachablePodForService() + default: + return "", fmt.Errorf("unknown resource type: %s", tunnel.resourceType) + } +} + +// getAttachablePodForServiceE will find an active pod associated with the Service and return the pod name. +func (tunnel *Tunnel) getAttachablePodForService() (string, error) { + message.Debug("tunnel.getAttachablePodForService()") + service, err := GetService(tunnel.namespace, tunnel.resourceName) + if err != nil { + return "", fmt.Errorf("unable to find the service: %w", err) + } + selectorLabelsOfPods := makeLabels(service.Spec.Selector) + + servicePods := WaitForPodsAndContainers(types.ZarfContainerTarget{ + Namespace: tunnel.namespace, + Selector: selectorLabelsOfPods, + }, false) + + return servicePods[0], nil +} diff --git a/cli/internal/message/message.go b/cli/internal/message/message.go index 864861fbfb..d3ca0c2c1c 100644 --- a/cli/internal/message/message.go +++ b/cli/internal/message/message.go @@ -37,6 +37,9 @@ func init() { Text: " Error:", Style: pterm.NewStyle(pterm.FgLightRed), } + pterm.Info.Prefix = pterm.Prefix{ + Text: " •", + } } func debugPrinter() *pterm.PrefixPrinter { diff --git a/cli/internal/packager/deploy.go b/cli/internal/packager/deploy.go index c074a5002c..725ee107f0 100644 --- a/cli/internal/packager/deploy.go +++ b/cli/internal/packager/deploy.go @@ -1,12 +1,14 @@ package packager import ( - "github.com/defenseunicorns/zarf/cli/types" + "fmt" "os" "path/filepath" "strconv" "strings" + "github.com/defenseunicorns/zarf/cli/types" + "github.com/defenseunicorns/zarf/cli/config" "github.com/defenseunicorns/zarf/cli/internal/git" "github.com/defenseunicorns/zarf/cli/internal/helm" @@ -21,6 +23,7 @@ import ( ) var valueTemplate template.Values +var connectStrings = make(helm.ConnectStrings) func Deploy() { message.Debug("packager.Deploy()") @@ -76,11 +79,14 @@ func Deploy() { // If this is the end of an initconfig, cleanup and tell the user we're ready to roll _ = os.Remove(".zarf-registry") + pterm.Success.Println("Zarf deployment complete") + pterm.Println() + _ = pterm.DefaultTable.WithHasHeader().WithData(pterm.TableData{ - {"Application", "Username", "Password", "Connect"}, - {"Logging", "zarf-admin", config.GetSecret(config.StateLogging), "zarf connect logging"}, - {"Git", config.ZarfGitPushUser, config.GetSecret(config.StateGitPush), "zarf connect git"}, - {"Registry", "zarf-push-user", config.GetSecret(config.StateRegistryPush), "zarf connect registry"}, + {" Application", "Username", "Password", "Connect"}, + {" Logging", "zarf-admin", config.GetSecret(config.StateLogging), "zarf connect logging"}, + {" Git", config.ZarfGitPushUser, config.GetSecret(config.StateGitPush), "zarf connect git"}, + {" Registry", "zarf-push-user", config.GetSecret(config.StateRegistryPush), "zarf connect registry"}, }).Render() } else { // Otherwise, look for any datainjections to run after the components @@ -89,6 +95,21 @@ func Deploy() { message.Info("Loading data injections") handleDataInjection(dataInjectionList, tempPath) } + + pterm.Success.Println("Zarf deployment complete") + pterm.Println() + + if len(connectStrings) > 0 { + list := pterm.TableData{{" Connect Command", "Description"}} + // Loop over each connecStrings and convert to pterm.TableData + for name, description := range connectStrings { + name = fmt.Sprintf(" zarf connect %s", name) + list = append(list, []string{name, description}) + } + + // Create the table output with the data + _ = pterm.DefaultTable.WithHasHeader().WithData(list).Render() + } } // All done @@ -191,15 +212,23 @@ func deployComponents(tempPath tempPaths, component types.ZarfComponent) { } // Generate helm templates to pass to gitops engine - helm.InstallOrUpgradeChart(helm.ChartOptions{ + addedConnectStrings := helm.InstallOrUpgradeChart(helm.ChartOptions{ BasePath: componentPath.base, Chart: chart, Images: component.Images, }) + + // Iterate over any connectStrings and add to the main map + for name, description := range addedConnectStrings { + connectStrings[name] = description + } } for _, manifest := range component.Manifests { - helm.GenerateChart(componentPath.manifests, manifest, component.Images) + // Iterate over any connectStrings and add to the main map + for name, description := range helm.GenerateChart(componentPath.manifests, manifest, component.Images) { + connectStrings[name] = description + } } if hasRepos { diff --git a/cli/types/types.go b/cli/types/types.go index 248ed071ad..5bbfe2af9e 100644 --- a/cli/types/types.go +++ b/cli/types/types.go @@ -31,17 +31,6 @@ type ZarfComponent struct { Images []string `yaml:"images,omitempty"` Repos []string `yaml:"repos,omitempty"` Scripts ZarfComponentScripts `yaml:"scripts,omitempty"` - Connect []ZarfConnect `yaml:"connect,omitempty"` -} - -// ZarfConnect defines tunnel parameters a component can use with zarf connect to expose a service or pod -type ZarfConnect struct { - Identifier string `yaml:"identifier"` - Namespace string `yaml:"namespace"` - Name string `yaml:"name"` - Type string `yaml:"type"` - RemotePort int `yaml:"remotePort"` - LocalPort int `yaml:"localPort,omitempty"` } // ZarfManifest defines raw manifests Zarf will deploy as a helm chart diff --git a/examples/game/manifests/service.yaml b/examples/game/manifests/service.yaml index efa127662b..86c487539c 100644 --- a/examples/game/manifests/service.yaml +++ b/examples/game/manifests/service.yaml @@ -3,6 +3,11 @@ kind: Service metadata: name: game namespace: default + annotations: + zarf.dev/connect-description: "Play doom!!!" + labels: + # Enables "zarf connect doom" + zarf.dev/connect-name: doom spec: selector: app: game From 2782daf51ca237419a543ac23fa50741251d4a2f Mon Sep 17 00:00:00 2001 From: Jeff McCoy Date: Wed, 26 Jan 2022 21:30:43 -0600 Subject: [PATCH 26/88] handle microk8s --- cli/internal/packager/seed.go | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/cli/internal/packager/seed.go b/cli/internal/packager/seed.go index 0a8ff11b34..4eb3e48ce7 100644 --- a/cli/internal/packager/seed.go +++ b/cli/internal/packager/seed.go @@ -139,7 +139,7 @@ func preSeedRegistry(tempPath tempPaths) { clusterName := getClusterName("k3d") state.Registry.SeedType = config.ZarfSeedTypeCLIInject inject.command = "k3d" - inject.args = []string{"image", "import", tempPath.seedImages, "--cluster", clusterName} + inject.args = []string{"images", "import", tempPath.seedImages, "--cluster", clusterName} case k8s.DistroIsKind: state.StorageClass = "standard" @@ -155,6 +155,11 @@ func preSeedRegistry(tempPath tempPaths) { inject.command = "docker" inject.args = []string{"load", "-i", tempPath.seedImages} + case k8s.DistroIsMicroK8s: + state.Registry.SeedType = config.ZarfSeedTypeCLIInject + inject.command = "microk8s" + inject.args = []string{"ctr", "images", "import", tempPath.seedImages} + default: state.Registry.SeedType = config.ZarfSeedTypeRuntimeRegistry } From 10bf5834dafd627a439149d4b1ec34614520ee66 Mon Sep 17 00:00:00 2001 From: Jeff McCoy Date: Wed, 26 Jan 2022 21:31:10 -0600 Subject: [PATCH 27/88] warn on arch mismatch --- cli/internal/packager/deploy.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cli/internal/packager/deploy.go b/cli/internal/packager/deploy.go index 725ee107f0..3cb91c87d3 100644 --- a/cli/internal/packager/deploy.go +++ b/cli/internal/packager/deploy.go @@ -192,7 +192,7 @@ func deployComponents(tempPath tempPaths, component types.ZarfComponent) { if hasImages && state.Architecture != config.GetBuildData().Architecture { // If the package has images but the architectures don't match warn the user to avoid ugly hidden errors with image push/pull - spinner.Fatalf(nil, "This package architecture is %s, but this cluster seems to be initailized with the %s architecture", + spinner.Fatalf(nil, "This package architecture is %s, but this cluster seems to be initialized with the %s architecture", config.GetBuildData().Architecture, state.Architecture) } From abb789ed1f2095f36ce1f3f9b97e28287d717550 Mon Sep 17 00:00:00 2001 From: Jeff McCoy Date: Wed, 26 Jan 2022 21:31:39 -0600 Subject: [PATCH 28/88] update zarf schema file --- zarf.schema.json | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/zarf.schema.json b/zarf.schema.json index 12cc39364f..b49b8d5f02 100644 --- a/zarf.schema.json +++ b/zarf.schema.json @@ -6,6 +6,7 @@ "required": [ "terminal", "user", + "architecture", "timestamp", "string" ], @@ -16,6 +17,9 @@ "user": { "type": "string" }, + "architecture": { + "type": "string" + }, "timestamp": { "type": "string" }, @@ -229,10 +233,6 @@ "type": "object" }, "ZarfMetadata": { - "required": [ - "url:omitempty", - "image:omitempty" - ], "properties": { "name": { "type": "string" @@ -243,14 +243,17 @@ "version": { "type": "string" }, - "url:omitempty": { + "url": { "type": "string" }, - "image:omitempty": { + "image": { "type": "string" }, "uncompressed": { "type": "boolean" + }, + "architecture": { + "type": "string" } }, "additionalProperties": false, From 24956ce3de4e5a187ed17b3395377d1c48594136 Mon Sep 17 00:00:00 2001 From: Jeff McCoy Date: Wed, 26 Jan 2022 23:14:45 -0600 Subject: [PATCH 29/88] fix multi-distro destroy chart removal/ns finalizer lag --- cli/cmd/destroy.go | 6 ++---- cli/internal/helm/destroy.go | 6 +++++- cli/internal/k8s/namespace.go | 8 +++++++- 3 files changed, 14 insertions(+), 6 deletions(-) diff --git a/cli/cmd/destroy.go b/cli/cmd/destroy.go index 3491d63ff5..25aee943fa 100644 --- a/cli/cmd/destroy.go +++ b/cli/cmd/destroy.go @@ -34,10 +34,8 @@ var destroyCmd = &cobra.Command{ _ = os.Remove(script) } } else { - if removeComponents { - // The default behavior for charts installed outside the zarf namespace will be to leave them installed - helm.Destroy() - } + // Perform chart uninstallation + helm.Destroy(removeComponents) // If Zarf didn't deploy the cluster, only delete the ZarfNamespace k8s.DeleteZarfNamespace() diff --git a/cli/internal/helm/destroy.go b/cli/internal/helm/destroy.go index 1153383844..4e746f659a 100644 --- a/cli/internal/helm/destroy.go +++ b/cli/internal/helm/destroy.go @@ -6,7 +6,7 @@ import ( "regexp" ) -func Destroy() { +func Destroy(purgeAllZarfInstallations bool) { spinner := message.NewProgressSpinner("Removing Zarf-installed charts") defer spinner.Stop() @@ -37,6 +37,10 @@ func Destroy() { // Iterate over all releases for _, release := range releases { + if !purgeAllZarfInstallations && release.Namespace != "zarf" { + // Don't process releases outside the zarf namespace unless purgae all is true + continue + } // Filter on zarf releases if zarfPrefix.MatchString(release.Name) { spinner.Updatef("Uninstalling helm chart %s/%s", release.Namespace, release.Name) diff --git a/cli/internal/k8s/namespace.go b/cli/internal/k8s/namespace.go index 55163ad69f..6e1af34368 100644 --- a/cli/internal/k8s/namespace.go +++ b/cli/internal/k8s/namespace.go @@ -46,14 +46,20 @@ func DeleteZarfNamespace() { defer spinner.Stop() clientset := getClientset() - err := clientset.CoreV1().Namespaces().Delete(context.TODO(), ZarfNamespace, metav1.DeleteOptions{}) + // Get the zarf ns and ignore errors + namespace, _ := clientset.CoreV1().Namespaces().Get(context.TODO(), ZarfNamespace, metav1.GetOptions{}) + // Remove the k8s finalizer to speed up destroy + _, _ = clientset.CoreV1().Namespaces().Finalize(context.TODO(), namespace, metav1.UpdateOptions{}) + // Attempt to delete the namespace + err := clientset.CoreV1().Namespaces().Delete(context.TODO(), ZarfNamespace, metav1.DeleteOptions{}) if err != nil && !errors.IsNotFound(err) { spinner.Fatalf(err, "the Zarf namespace could not be deleted") } spinner.Updatef("Zarf namespace deletion scheduled, waiting for all resources to be removed") for { + // Keep checking for the _, err := clientset.CoreV1().Namespaces().Get(context.TODO(), ZarfNamespace, metav1.GetOptions{}) if errors.IsNotFound(err) { spinner.Successf("Zarf removed from this cluster") From bc8d900ed8e55f05e5ca49cb7a78058f457e5326 Mon Sep 17 00:00:00 2001 From: Jeff McCoy Date: Wed, 26 Jan 2022 23:15:06 -0600 Subject: [PATCH 30/88] small package deploy ui cleanup --- cli/internal/packager/deploy.go | 78 ++++++++++++++++++--------------- 1 file changed, 43 insertions(+), 35 deletions(-) diff --git a/cli/internal/packager/deploy.go b/cli/internal/packager/deploy.go index 3cb91c87d3..56f1dc09d2 100644 --- a/cli/internal/packager/deploy.go +++ b/cli/internal/packager/deploy.go @@ -31,21 +31,25 @@ func Deploy() { tempPath := createPaths() defer tempPath.clean() + spinner := message.NewProgressSpinner("Preparing zarf package %s", config.DeployOptions.PackagePath) + defer spinner.Stop() + // Make sure the user gave us a package we can work with if utils.InvalidPath(config.DeployOptions.PackagePath) { - message.Fatalf(nil, "Unable to find the package on the local system, expected package at %s", config.DeployOptions.PackagePath) + spinner.Fatalf(nil, "Unable to find the package on the local system, expected package at %s", config.DeployOptions.PackagePath) } // Extract the archive - message.Info("Extracting the package, this may take a few moments") + spinner.Updatef("Extracting the package, this may take a few moments") err := archiver.Unarchive(config.DeployOptions.PackagePath, tempPath.base) if err != nil { - message.Fatal(err, "Unable to extract the package contents") + spinner.Fatalf(err, "Unable to extract the package contents") } // Load the config from the extracted archive zarf.yaml + spinner.Updatef("Loading the zarf package config") if err := config.LoadConfig(tempPath.base + "/zarf.yaml"); err != nil { - message.Fatalf(err, "Invalid or unreadable zarf.yaml file in %s", tempPath.base) + spinner.Fatalf(err, "Invalid or unreadable zarf.yaml file in %s", tempPath.base) } if config.IsZarfInitConfig() { @@ -53,6 +57,8 @@ func Deploy() { utils.RunPreflightChecks() } + spinner.Success() + // Confirm the overall package deployment configPath := tempPath.base + "/zarf.yaml" confirm := confirmAction(configPath, "Deploy") @@ -132,44 +138,46 @@ func deployComponents(tempPath tempPaths, component types.ZarfComponent) { loopScriptUntilSuccess(script, component.Scripts.Retry) } - spinner := message.NewProgressSpinner("Copying %v files", len(component.Files)) - defer spinner.Stop() - - for index, file := range component.Files { - spinner.Updatef("Loading %s", file.Target) - sourceFile := componentPath.files + "/" + strconv.Itoa(index) + if len(component.Files) > 0 { + spinner := message.NewProgressSpinner("Copying %v files", len(component.Files)) + defer spinner.Stop() - // If a shasum is specified check it again on deployment as well - if file.Shasum != "" { - spinner.Updatef("Validating SHASUM for %s", file.Target) - utils.ValidateSha256Sum(file.Shasum, sourceFile) - } + for index, file := range component.Files { + spinner.Updatef("Loading %s", file.Target) + sourceFile := componentPath.files + "/" + strconv.Itoa(index) - // Copy the file to the destination - spinner.Updatef("Saving %s", file.Target) - err := copy.Copy(sourceFile, file.Target) - if err != nil { - spinner.Fatalf(err, "Unable to copy the contents of %s", file.Target) - } + // If a shasum is specified check it again on deployment as well + if file.Shasum != "" { + spinner.Updatef("Validating SHASUM for %s", file.Target) + utils.ValidateSha256Sum(file.Shasum, sourceFile) + } - // Loop over all symlinks and create them - for _, link := range file.Symlinks { - spinner.Updatef("Adding symlink %s->%s", link, file.Target) - // Try to remove the filepath if it exists - _ = os.RemoveAll(link) - // Make sure the parent directory exists - _ = utils.CreateFilePath(link) - // Create the symlink - err := os.Symlink(file.Target, link) + // Copy the file to the destination + spinner.Updatef("Saving %s", file.Target) + err := copy.Copy(sourceFile, file.Target) if err != nil { - spinner.Fatalf(err, "Unable to create the symbolic link %s -> %s", link, file.Target) + spinner.Fatalf(err, "Unable to copy the contents of %s", file.Target) } - } - // Cleanup now to reduce disk pressure - _ = os.RemoveAll(sourceFile) + // Loop over all symlinks and create them + for _, link := range file.Symlinks { + spinner.Updatef("Adding symlink %s->%s", link, file.Target) + // Try to remove the filepath if it exists + _ = os.RemoveAll(link) + // Make sure the parent directory exists + _ = utils.CreateFilePath(link) + // Create the symlink + err := os.Symlink(file.Target, link) + if err != nil { + spinner.Fatalf(err, "Unable to create the symbolic link %s -> %s", link, file.Target) + } + } + + // Cleanup now to reduce disk pressure + _ = os.RemoveAll(sourceFile) + } + spinner.Success() } - spinner.Success() if isSeedRegistry { preSeedRegistry(tempPath) From 67f221d9a3491ea909657b832934eb74f347fde2 Mon Sep 17 00:00:00 2001 From: Jeff McCoy Date: Thu, 27 Jan 2022 01:06:17 -0600 Subject: [PATCH 31/88] fix data injection example + update for multi-arch --- cli/config/config.go | 1 - cli/internal/packager/deploy.go | 10 ++++----- .../manifests/data-injection.yaml | 22 ++++++++++++------- examples/data-injection/zarf.yaml | 2 +- 4 files changed, 20 insertions(+), 15 deletions(-) diff --git a/cli/config/config.go b/cli/config/config.go index 93d2f810e3..eb5afead18 100644 --- a/cli/config/config.go +++ b/cli/config/config.go @@ -19,7 +19,6 @@ import ( const ( IPV4Localhost = "127.0.0.1" - K3sBinary = "/usr/local/bin/k3s" PackageInitName = "zarf-init.tar.zst" PackagePrefix = "zarf-package-" diff --git a/cli/internal/packager/deploy.go b/cli/internal/packager/deploy.go index 56f1dc09d2..09356fc0d5 100644 --- a/cli/internal/packager/deploy.go +++ b/cli/internal/packager/deploy.go @@ -270,21 +270,21 @@ func handleDataInjection(dataInjectionList []types.ZarfData, tempPath tempPaths) // Handle top-level directory targets destination = "/" } - cpPodExecArgs := []string{"kubectl", "-n", data.Target.Namespace, "cp", sourceFile, pod + ":" + destination} + cpPodExecArgs := []string{"-n", data.Target.Namespace, "cp", sourceFile, pod + ":" + destination} if data.Target.Container != "" { // Append the container args if they are specified cpPodExecArgs = append(cpPodExecArgs, "-c", data.Target.Container) } - _, err := utils.ExecCommand(true, nil, config.K3sBinary, cpPodExecArgs...) + _, err := utils.ExecCommand(true, nil, "kubectl", cpPodExecArgs...) if err != nil { message.Warn("Error copying data into the pod") } else { // Leave a marker in the target container for pods to track the sync action - cpPodExecArgs[4] = injectionCompletionMarker - cpPodExecArgs[5] = pod + ":" + data.Target.Path - _, err = utils.ExecCommand(true, nil, config.K3sBinary, cpPodExecArgs...) + cpPodExecArgs[3] = injectionCompletionMarker + cpPodExecArgs[4] = pod + ":" + data.Target.Path + _, err = utils.ExecCommand(true, nil, "kubectl", cpPodExecArgs...) if err != nil { message.Warn("Error saving the zarf sync completion file") } diff --git a/examples/data-injection/manifests/data-injection.yaml b/examples/data-injection/manifests/data-injection.yaml index 2c92f59814..17527d3209 100644 --- a/examples/data-injection/manifests/data-injection.yaml +++ b/examples/data-injection/manifests/data-injection.yaml @@ -1,9 +1,3 @@ ---- -apiVersion: v1 -kind: Namespace -metadata: - name: demo ---- apiVersion: v1 kind: Pod metadata: @@ -14,7 +8,19 @@ metadata: spec: containers: - name: data-injection - image: registry1.dso.mil/ironbank/redhat/ubi/ubi8:8.4 - command: ["/bin/sh", "-ec", "mkdir -p /test && while :; do ls -lah /test; sleep 5 ; done"] + image: alpine:3.15 + command: + [ + "/bin/sh", + "-ec", + "mkdir -p /test && while :; do ls -lah /test; sleep 5 ; done", + ] + resources: + requests: + memory: "64Mi" + cpu: "250m" + limits: + memory: "128Mi" + cpu: "500m" imagePullSecrets: - name: zarf-registry diff --git a/examples/data-injection/zarf.yaml b/examples/data-injection/zarf.yaml index 8945b8c0e7..ee507d4cf4 100644 --- a/examples/data-injection/zarf.yaml +++ b/examples/data-injection/zarf.yaml @@ -27,4 +27,4 @@ components: files: - manifests/data-injection.yaml images: - - registry1.dso.mil/ironbank/redhat/ubi/ubi8:8.4 + - alpine:3.15 From e984e1860eac96f240b7d74e87b52a093103aa3b Mon Sep 17 00:00:00 2001 From: Jeff McCoy Date: Thu, 27 Jan 2022 01:06:36 -0600 Subject: [PATCH 32/88] require amd64 for bb example (no arm for iron bank) --- examples/single-big-bang-package/zarf.yaml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/examples/single-big-bang-package/zarf.yaml b/examples/single-big-bang-package/zarf.yaml index 162beeae54..f8d12c230d 100644 --- a/examples/single-big-bang-package/zarf.yaml +++ b/examples/single-big-bang-package/zarf.yaml @@ -2,6 +2,8 @@ kind: ZarfPackageConfig metadata: name: big-bang-single-package-demo description: "Demo Zarf appliance mode with a single DoD Platform One Big Bang package" + # Big Bang / Iron Bank are only amd64 + architecture: amd64 components: - name: baseline From 528bc65bb66af091aeae1c4b9e524d161aa2ea2d Mon Sep 17 00:00:00 2001 From: Jeff McCoy Date: Thu, 27 Jan 2022 01:06:54 -0600 Subject: [PATCH 33/88] more small cli ui cleanup --- cli/internal/packager/seed.go | 18 +++++++++++++++--- cli/internal/utils/auth.go | 12 +++++++----- 2 files changed, 22 insertions(+), 8 deletions(-) diff --git a/cli/internal/packager/seed.go b/cli/internal/packager/seed.go index 4eb3e48ce7..ee3451efe8 100644 --- a/cli/internal/packager/seed.go +++ b/cli/internal/packager/seed.go @@ -166,10 +166,22 @@ func preSeedRegistry(tempPath tempPaths) { switch state.Registry.SeedType { case config.ZarfSeedTypeCLIInject: + var ( + output string + spinner = message.NewProgressSpinner("Injecting Zarf registry image using %s", inject.command) + ) + defer spinner.Stop() + // If this is a seed image injection, attempt to run it and warn if there is an error - if _, err = utils.ExecCommand(true, nil, inject.command, inject.args...); err != nil { - message.Errorf(err, "Unable to inject the seed image from the %s archive", tempPath.seedImages) + output, err = utils.ExecCommand(false, nil, inject.command, inject.args...) + message.Debug(output) + if err != nil { + spinner.Errorf(err, "Unable to inject the seed image from the %s archive", tempPath.seedImages) + spinner.Stop() + } else { + spinner.Success() } + // Set TLS host so that the seed template isn't broken config.TLS.Host = config.IPV4Localhost @@ -206,7 +218,7 @@ func preSeedRegistry(tempPath tempPaths) { registrySecret := config.GetSecret(config.StateRegistryPush) // Now that we have what the password will be, we should add the login entry to the system's registry config - if err := utils.Login(config.ZarfRegistry, config.ZarfRegistryPushUser, registrySecret); err != nil { + if err := utils.DockerLogin(config.ZarfRegistry, config.ZarfRegistryPushUser, registrySecret); err != nil { message.Fatal(err, "Unable to add login credentials for the gitops registry") } } diff --git a/cli/internal/utils/auth.go b/cli/internal/utils/auth.go index 26735a36e6..9eec0a37c7 100644 --- a/cli/internal/utils/auth.go +++ b/cli/internal/utils/auth.go @@ -1,18 +1,20 @@ package utils import ( + "os" + + "github.com/defenseunicorns/zarf/cli/internal/message" "github.com/docker/cli/cli/config" "github.com/docker/cli/cli/config/types" "github.com/google/go-containerregistry/pkg/authn" "github.com/google/go-containerregistry/pkg/name" - "log" - "os" ) -// Login adds the given creds to the user's Docker config, usually located at $HOME/.docker/config.yaml. It does not try +// DockerLogin adds the given creds to the user's Docker config, usually located at $HOME/.docker/config.yaml. It does not try // to connect to the given registry, it just simply adds another entry to the config file. // This function was mostly adapted from https://github.com/google/go-containerregistry/blob/5c9c442d5d68cd96787559ebf6e984c7eb084913/cmd/crane/cmd/auth.go -func Login(serverAddress string, user string, password string) error { +func DockerLogin(serverAddress string, user string, password string) error { + message.Debugf("utils.DockerLogin(%s, %s, %s)", serverAddress, user, password) cf, err := config.Load(os.Getenv("DOCKER_CONFIG")) if err != nil { return err @@ -32,6 +34,6 @@ func Login(serverAddress string, user string, password string) error { if err := cf.Save(); err != nil { return err } - log.Printf("logged in via %s", cf.Filename) + message.Debugf("logged in via %s", cf.Filename) return nil } From 69f287a649e085b9a1996107868cd6cce88e53ae Mon Sep 17 00:00:00 2001 From: Jeff McCoy Date: Thu, 27 Jan 2022 01:15:46 -0600 Subject: [PATCH 34/88] add kind and k3d example configs --- examples/k3d.yaml | 9 +++++++++ examples/kind.yaml | 10 ++++++++++ 2 files changed, 19 insertions(+) create mode 100644 examples/k3d.yaml create mode 100644 examples/kind.yaml diff --git a/examples/k3d.yaml b/examples/k3d.yaml new file mode 100644 index 0000000000..e1c64fcac8 --- /dev/null +++ b/examples/k3d.yaml @@ -0,0 +1,9 @@ +# usage: +# create: k3d cluster create --config k3d.yaml +# delete: k3d cluster delete --config k3d.yaml +# Schema compains but cli complains with v2... ¯\_(ツ)_/¯ +apiVersion: k3d.io/v1alpha3 +kind: Simple +name: zarf-test +servers: 1 +agents: 2 diff --git a/examples/kind.yaml b/examples/kind.yaml new file mode 100644 index 0000000000..460734c639 --- /dev/null +++ b/examples/kind.yaml @@ -0,0 +1,10 @@ +# usage: +# create: kind create cluster --config kind.yaml +# delete: kind delete cluster --config kind.yaml +kind: Cluster +apiVersion: kind.x-k8s.io/v1alpha4 +name: zarf-test +nodes: + - role: control-plane + - role: worker + - role: worker From ccdba254df4da52792579fd04f9c309253dd4594 Mon Sep 17 00:00:00 2001 From: Jeff McCoy Date: Thu, 27 Jan 2022 01:18:16 -0600 Subject: [PATCH 35/88] require amd64 for postgress example due to IB usage --- examples/postgres-operator/zarf.yaml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/examples/postgres-operator/zarf.yaml b/examples/postgres-operator/zarf.yaml index 1ad8f23d53..14f177936c 100644 --- a/examples/postgres-operator/zarf.yaml +++ b/examples/postgres-operator/zarf.yaml @@ -2,6 +2,8 @@ kind: ZarfPackageConfig metadata: name: postgres-operator-demo description: "Demo of prod-like Postgres database(s) on an edge cluster" + # Big Bang / Iron Bank are only amd64 + architecture: amd64 components: - name: baseline From 03408b03e13f2c0aef0ca653b00cb11250b257bf Mon Sep 17 00:00:00 2001 From: Jeff McCoy Date: Thu, 27 Jan 2022 01:44:13 -0600 Subject: [PATCH 36/88] fix arch mismatch logic / ui reporting --- cli/cmd/root.go | 2 +- cli/config/config.go | 9 +++++++-- cli/internal/message/message.go | 4 ++-- cli/internal/message/spinner.go | 3 ++- cli/internal/packager/create.go | 2 ++ cli/internal/packager/deploy.go | 11 ++++++++--- 6 files changed, 22 insertions(+), 9 deletions(-) diff --git a/cli/cmd/root.go b/cli/cmd/root.go index 24a147db8f..9e08963571 100644 --- a/cli/cmd/root.go +++ b/cli/cmd/root.go @@ -21,7 +21,7 @@ var rootCmd = &cobra.Command{ if zarfLogLevel != "" { setLogLevel(zarfLogLevel) } - config.SetAcrch(arch) + config.CliArch = arch }, Short: "Small tool to bundle dependencies with K3s for air-gaped deployments", Args: cobra.MaximumNArgs(1), diff --git a/cli/config/config.go b/cli/config/config.go index eb5afead18..38ca5d2815 100644 --- a/cli/config/config.go +++ b/cli/config/config.go @@ -51,6 +51,8 @@ var ( ActiveCranePlatform crane.Option + CliArch string + // Private vars config types.ZarfPackage state types.ZarfState @@ -61,8 +63,9 @@ func IsZarfInitConfig() bool { return strings.ToLower(config.Kind) == "zarfinitconfig" } -func SetAcrch(arch string) { - if arch == "" { +func SetAcrch() { + var arch string + if CliArch == "" { // If not cli override for arch, set to the package arch arch = config.Metadata.Architecture @@ -70,6 +73,8 @@ func SetAcrch(arch string) { // Finally, default to current system arch when all else fails arch = runtime.GOARCH } + } else { + arch = CliArch } message.Debugf("config.SetArch(%s)", arch) diff --git a/cli/internal/message/message.go b/cli/internal/message/message.go index d3ca0c2c1c..0545543e09 100644 --- a/cli/internal/message/message.go +++ b/cli/internal/message/message.go @@ -34,8 +34,8 @@ func init() { Style: pterm.NewStyle(pterm.FgLightGreen), } pterm.Error.Prefix = pterm.Prefix{ - Text: " Error:", - Style: pterm.NewStyle(pterm.FgLightRed), + Text: " ERROR:", + Style: pterm.NewStyle(pterm.BgLightRed, pterm.FgBlack), } pterm.Info.Prefix = pterm.Prefix{ Text: " •", diff --git a/cli/internal/message/spinner.go b/cli/internal/message/spinner.go index 2cb1161f99..d89723706d 100644 --- a/cli/internal/message/spinner.go +++ b/cli/internal/message/spinner.go @@ -69,6 +69,7 @@ func (p *Spinner) Errorf(err error, format string, a ...interface{}) { } func (p *Spinner) Fatalf(err error, format string, a ...interface{}) { - p.spinner.Fail(p.startText) + p.spinner.RemoveWhenDone = true + p.spinner.Stop() Fatalf(err, format, a...) } diff --git a/cli/internal/packager/create.go b/cli/internal/packager/create.go index f4dab3dc36..744682efc4 100644 --- a/cli/internal/packager/create.go +++ b/cli/internal/packager/create.go @@ -34,6 +34,8 @@ func Create() { components := config.GetComponents() configFile := tempPath.base + "/zarf.yaml" + config.SetAcrch() + // Save the transformed config if err := config.BuildConfig(configFile); err != nil { message.Fatalf(err, "Unable to write the %s file", configFile) diff --git a/cli/internal/packager/deploy.go b/cli/internal/packager/deploy.go index 09356fc0d5..ef4682cc82 100644 --- a/cli/internal/packager/deploy.go +++ b/cli/internal/packager/deploy.go @@ -52,6 +52,9 @@ func Deploy() { spinner.Fatalf(err, "Invalid or unreadable zarf.yaml file in %s", tempPath.base) } + // Determine the proper arch now that the config file is loaded + config.SetAcrch() + if config.IsZarfInitConfig() { // If init config, make sure things are ready utils.RunPreflightChecks() @@ -190,14 +193,16 @@ func deployComponents(tempPath tempPaths, component types.ZarfComponent) { defer spinner.Stop() state := k8s.LoadZarfState() - config.InitState(state) - valueTemplate = template.Generate() - if state.Distro == "" { + if state.Distro == k8s.DistroIsUnknown { // If no distro the zarf secret did not load properly spinner.Fatalf(nil, "Unable to load the zarf/zarf-state secret, did you remember to run zarf init first?") } + // Continue loading state data if it is valid + config.InitState(state) + valueTemplate = template.Generate() + if hasImages && state.Architecture != config.GetBuildData().Architecture { // If the package has images but the architectures don't match warn the user to avoid ugly hidden errors with image push/pull spinner.Fatalf(nil, "This package architecture is %s, but this cluster seems to be initialized with the %s architecture", From 534582336fbf11034763e643c12230e0d0c42a7f Mon Sep 17 00:00:00 2001 From: Jeff McCoy Date: Thu, 27 Jan 2022 01:49:19 -0600 Subject: [PATCH 37/88] remove invalid log entry --- cli/internal/packager/common.go | 1 - 1 file changed, 1 deletion(-) diff --git a/cli/internal/packager/common.go b/cli/internal/packager/common.go index e9e37c75d3..bbfdc1d57d 100644 --- a/cli/internal/packager/common.go +++ b/cli/internal/packager/common.go @@ -204,7 +204,6 @@ func HandleIfURL(packagePath string, shasum string, insecureDeploy bool) (string func isValidFileExtension(filename string) bool { for _, extension := range config.GetValidPackageExtensions() { if strings.HasSuffix(filename, extension) { - message.Warnf("Extension for %s is invalid", filename) return true } } From 9581b628e166449a9c8e9a5780d6af151b6a2abb Mon Sep 17 00:00:00 2001 From: Jeff McCoy Date: Thu, 27 Jan 2022 01:51:52 -0600 Subject: [PATCH 38/88] remove zarf init defaults for minimal install --- zarf.yaml | 2 -- 1 file changed, 2 deletions(-) diff --git a/zarf.yaml b/zarf.yaml index 247a4b2bfe..7cf158d29c 100644 --- a/zarf.yaml +++ b/zarf.yaml @@ -13,7 +13,6 @@ components: Install K3s, certified Kubernetes distribution built for IoT & Edge computing. K3s provides the cluster need for Zarf running in Appliance Mode as well as can host a low-resource Gitops Service if not using an existing Kubernetes platform. - default: true scripts: retry: true before: @@ -84,7 +83,6 @@ components: - name: logging description: "Add Promtail, Grafana and Loki (PGL) to this cluster for log monitoring." - default: true images: - grafana/grafana:8.1.6 - grafana/loki:2.4.1 From e5afd0561f74be4795e2d5e9c619f4bab4cc915a Mon Sep 17 00:00:00 2001 From: Jeff McCoy Date: Thu, 27 Jan 2022 08:11:41 +0000 Subject: [PATCH 39/88] add zarf connect for bb-single-package example --- .../twistlock-zarf-connect.yaml | 19 +++++++++++++++++++ examples/single-big-bang-package/zarf.yaml | 4 ++++ 2 files changed, 23 insertions(+) create mode 100644 examples/single-big-bang-package/twistlock-zarf-connect.yaml diff --git a/examples/single-big-bang-package/twistlock-zarf-connect.yaml b/examples/single-big-bang-package/twistlock-zarf-connect.yaml new file mode 100644 index 0000000000..f0ce5db67a --- /dev/null +++ b/examples/single-big-bang-package/twistlock-zarf-connect.yaml @@ -0,0 +1,19 @@ +apiVersion: v1 +kind: Service +metadata: + annotations: + zarf.dev/connect-description: "Connect to the Twistlock Console web interface" + labels: + # Enables "zarf connect twistlock" + zarf.dev/connect-name: twistlock + name: twistlock-ui-connect + namespace: twistlock +spec: + type: ClusterIP + ports: + - name: mgmt-http + port: 8081 + protocol: TCP + targetPort: 8081 + selector: + name: twistlock-console diff --git a/examples/single-big-bang-package/zarf.yaml b/examples/single-big-bang-package/zarf.yaml index f8d12c230d..15a10d8841 100644 --- a/examples/single-big-bang-package/zarf.yaml +++ b/examples/single-big-bang-package/zarf.yaml @@ -8,6 +8,10 @@ metadata: components: - name: baseline required: true + manifests: + - name: twistlock-zarf-connect + files: + - "twistlock-zarf-connect.yaml" charts: - name: twistlock url: https://repo1.dso.mil/platform-one/big-bang/apps/security-tools/twistlock.git From e5442c65544c4e259fc6ba463553f87434e09016 Mon Sep 17 00:00:00 2001 From: Jeff McCoy Date: Thu, 27 Jan 2022 08:30:53 +0000 Subject: [PATCH 40/88] update kind cluster delete note --- examples/kind.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/kind.yaml b/examples/kind.yaml index 460734c639..30e30269a8 100644 --- a/examples/kind.yaml +++ b/examples/kind.yaml @@ -1,6 +1,6 @@ # usage: # create: kind create cluster --config kind.yaml -# delete: kind delete cluster --config kind.yaml +# delete: kind delete cluster --name=zarf-test kind: Cluster apiVersion: kind.x-k8s.io/v1alpha4 name: zarf-test From 6ad630a0c5e96a09d1aee866f6f796ed2200e0cd Mon Sep 17 00:00:00 2001 From: Jeff McCoy Date: Thu, 27 Jan 2022 08:31:12 +0000 Subject: [PATCH 41/88] add missing files/arch for big bang examples --- examples/big-bang/zarf.yaml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/examples/big-bang/zarf.yaml b/examples/big-bang/zarf.yaml index 9bd9ecc0c7..06d26a0a6f 100644 --- a/examples/big-bang/zarf.yaml +++ b/examples/big-bang/zarf.yaml @@ -12,6 +12,8 @@ components: - name: flux-config files: - manifests/flux/regcred-secret.yaml + # kustomize build template/bigbang/vendor/bigbang/base/flux > manifests/flux/flux-generated.yaml + - manifests/flux/flux-generated.yaml images: # Flux images - registry1.dso.mil/ironbank/fluxcd/helm-controller:v0.11.0 From 1f0a0fea2eea10ce3ae597001dd1bb69da8c231b Mon Sep 17 00:00:00 2001 From: Jeff McCoy Date: Thu, 27 Jan 2022 04:41:37 -0600 Subject: [PATCH 42/88] =?UTF-8?q?=F0=9F=98=AD=20move=20ns/secret=20mgmt=20?= =?UTF-8?q?into=20helm=20to=20fix=20raw=20manifest=20errors=20on=20ns=20cr?= =?UTF-8?q?eation?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cli/internal/helm/chart.go | 44 ++++++++++++++++++++++++++++--------- cli/internal/k8s/secrets.go | 14 ++++++------ go.mod | 1 + kind.yaml | 7 ------ 4 files changed, 42 insertions(+), 24 deletions(-) delete mode 100644 kind.yaml diff --git a/cli/internal/helm/chart.go b/cli/internal/helm/chart.go index 47bd749775..1c243d3a98 100644 --- a/cli/internal/helm/chart.go +++ b/cli/internal/helm/chart.go @@ -9,6 +9,7 @@ import ( "github.com/defenseunicorns/zarf/cli/config" "github.com/defenseunicorns/zarf/cli/types" + "k8s.io/cli-runtime/pkg/printers" "github.com/defenseunicorns/zarf/cli/internal/k8s" "github.com/defenseunicorns/zarf/cli/internal/message" @@ -31,7 +32,7 @@ type ChartOptions struct { } type renderer struct { - images []string + options ChartOptions namespaces []string connectStrings ConnectStrings } @@ -46,9 +47,9 @@ func InstallOrUpgradeChart(options ChartOptions) ConnectStrings { var output *release.Release - postRender := NewRenderer(options.Images, options.Chart.Namespace) options.ReleaseName = fmt.Sprintf("zarf-%s", options.Chart.Name) actionConfig, err := createActionConfig(options.Chart.Namespace) + postRender := NewRenderer(options) // Setup K8s connection if err != nil { @@ -221,6 +222,9 @@ func installChart(actionConfig *action.Configuration, options ChartOptions, post // Namespace must be specified client.Namespace = options.Chart.Namespace + // Create namespace if it does not exist + client.CreateNamespace = true + // Post-processing our manifests for reasons.... client.PostRenderer = postRender @@ -307,11 +311,11 @@ func loadChartData(options ChartOptions) (*chart.Chart, map[string]interface{}, return loadedChart, chartValues, nil } -func NewRenderer(images []string, namespace string) *renderer { - message.Debugf("helm.NewRenderer(%v, %s)", images, namespace) +func NewRenderer(options ChartOptions) *renderer { + message.Debugf("helm.NewRenderer(%v)", options) return &renderer{ - images: images, - namespaces: []string{namespace}, + options: options, + namespaces: []string{options.Chart.Namespace}, connectStrings: make(ConnectStrings), } } @@ -327,7 +331,7 @@ func (r *renderer) Run(renderedManifests *bytes.Buffer) (*bytes.Buffer, error) { } // Run the template engine against the chart output - k8s.ProcessYamlFilesInPath(tempDir, r.images) + k8s.ProcessYamlFilesInPath(tempDir, r.options.Images) // Read back the final file contents buff, err := os.ReadFile(path) @@ -373,17 +377,37 @@ func (r *renderer) Run(renderedManifests *bytes.Buffer) (*bytes.Buffer, error) { } } + chartText := string(buff) + secretPrefix := "---\n" + secretName := "zarf-registry" for _, namespace := range r.namespaces { - if err := k8s.ReplaceRegistrySecret(namespace); err != nil { - message.Error(err, "Unable to update the registry secret") + // Try to get an existing secret + secret, _ := k8s.GetSecret(namespace, secretName) + + if secret.Name == secretName && secret.Annotations["meta.helm.sh/release-name"] != r.options.ReleaseName { + // Don't add a secret if it already was created by another chart + // But we have to include it this chart deployed it or helm will remove it + continue } + + // Create the secret as a k8s object + secret = k8s.GenerateRegistryPullCreds(namespace, secretName) + + // Convert to yaml buffer + buf := new(bytes.Buffer) + yp := printers.YAMLPrinter{} + yp.PrintObj(secret, buf) + + // Prepend the secret to the helm chart text + chartText = secretPrefix + buf.String() + chartText + } // Cleanup the temp file _ = os.RemoveAll(tempDir) // Send the bytes back to helm - return bytes.NewBuffer(buff), nil + return bytes.NewBuffer([]byte(chartText)), nil } func contains(haystack []string, needle string) bool { diff --git a/cli/internal/k8s/secrets.go b/cli/internal/k8s/secrets.go index a6dcf4c290..8430f02eae 100644 --- a/cli/internal/k8s/secrets.go +++ b/cli/internal/k8s/secrets.go @@ -24,9 +24,14 @@ type DockerConfigEntryWithAuth struct { Auth string `json:"auth"` } -func GenerateRegistryPullCreds(namespace string) *corev1.Secret { +func GetSecret(namespace string, name string) (*corev1.Secret, error) { + message.Debugf("k8s.getSecret(%s, %s)", namespace, name) + clientSet := getClientset() + return clientSet.CoreV1().Secrets(namespace).Get(context.TODO(), name, metav1.GetOptions{}) +} + +func GenerateRegistryPullCreds(namespace string, name string) *corev1.Secret { message.Debugf("k8s.GenerateRegistryPullCreds(%s)", namespace) - name := "zarf-registry" spinner := message.NewProgressSpinner("Generating private registry credentials %s/%s", namespace, name) defer spinner.Stop() @@ -109,11 +114,6 @@ func GenerateTLSSecret(namespace string, name string, certPath string, keyPath s return secretTLS } -func ReplaceRegistrySecret(namespace string) error { - secret := GenerateRegistryPullCreds(namespace) - return replaceSecret(secret) -} - func ReplaceTLSSecret(namespace string, name string) { message.Debugf("k8s.ReplaceTLSSecret(%s, %s)", namespace, name) diff --git a/go.mod b/go.mod index 757962d950..267c9abc18 100644 --- a/go.mod +++ b/go.mod @@ -24,6 +24,7 @@ require ( helm.sh/helm/v3 v3.7.2 k8s.io/api v0.22.5 k8s.io/apimachinery v0.22.5 + k8s.io/cli-runtime v0.22.5 k8s.io/client-go v0.22.5 k8s.io/klog/v2 v2.40.1 sigs.k8s.io/yaml v1.3.0 diff --git a/kind.yaml b/kind.yaml deleted file mode 100644 index b107ec3e0f..0000000000 --- a/kind.yaml +++ /dev/null @@ -1,7 +0,0 @@ -kind: Cluster -apiVersion: kind.x-k8s.io/v1alpha4 -name: zarf-test-cluster -nodes: - - role: control-plane - - role: worker - - role: worker From 72e9bb7828126433bf71ac7791108e6742ec35bf Mon Sep 17 00:00:00 2001 From: Jeff McCoy Date: Thu, 27 Jan 2022 11:12:12 +0000 Subject: [PATCH 43/88] more updates for bb, this thing is a mess... --- cli/internal/helm/chart.go | 1 - .../manifests/big-bang/manifests.yaml | 2 +- .../manifests/flux/regcred-secret.yaml | 2 +- .../template/bigbang/kustomization.yaml | 2 +- .../big-bang/template/bigbang/values.yaml | 22 +++++++++---------- .../bigbang/base/flux/kustomization.yaml | 2 +- examples/big-bang/zarf.yaml | 2 +- 7 files changed, 16 insertions(+), 17 deletions(-) diff --git a/cli/internal/helm/chart.go b/cli/internal/helm/chart.go index 1c243d3a98..fc4886f297 100644 --- a/cli/internal/helm/chart.go +++ b/cli/internal/helm/chart.go @@ -351,7 +351,6 @@ func (r *renderer) Run(renderedManifests *bytes.Buffer) (*bytes.Buffer, error) { for _, resource := range resources { // grab the namespace, namespace := resource.GetNamespace() - message.Debugf("Found namespace %s", namespace) // and append to the list if it's unique if namespace != "" && !contains(r.namespaces, namespace) { diff --git a/examples/big-bang/manifests/big-bang/manifests.yaml b/examples/big-bang/manifests/big-bang/manifests.yaml index a0392b9387..5e401dec01 100644 --- a/examples/big-bang/manifests/big-bang/manifests.yaml +++ b/examples/big-bang/manifests/big-bang/manifests.yaml @@ -27,7 +27,7 @@ spec: /**/*.txt /**/*.sh interval: 5m - url: http://stuart-gitea-http.zarf.svc.cluster.local:3000/zarf-git-user/mirror__github.com__defenseunicorns__zarf.git + url: http://zarf-gitea-http.zarf.svc.cluster.local:3000/zarf-git-user/mirror__github.com__defenseunicorns__zarf.git secretRef: name: zarf-git-secret ref: diff --git a/examples/big-bang/manifests/flux/regcred-secret.yaml b/examples/big-bang/manifests/flux/regcred-secret.yaml index 9e6ba4dd53..4b2ac8c7ee 100644 --- a/examples/big-bang/manifests/flux/regcred-secret.yaml +++ b/examples/big-bang/manifests/flux/regcred-secret.yaml @@ -6,4 +6,4 @@ metadata: namespace: bigbang stringData: username: "zarf-git-user" - password: "###ZARF_GIT_AUTH_PULL###" + password: "###ZARF_GIT_AUTH_PUSH###" diff --git a/examples/big-bang/template/bigbang/kustomization.yaml b/examples/big-bang/template/bigbang/kustomization.yaml index 1a14673a35..7247b824dd 100644 --- a/examples/big-bang/template/bigbang/kustomization.yaml +++ b/examples/big-bang/template/bigbang/kustomization.yaml @@ -16,6 +16,6 @@ patchesStrategicMerge: name: bigbang namespace: bigbang spec: - url: http://stuart-gitea-http.zarf.svc.cluster.local:3000/zarf-git-user/mirror__repo1.dso.mil__platform-one__big-bang__bigbang.git + url: http://zarf-gitea-http.zarf.svc.cluster.local:3000/zarf-git-user/mirror__repo1.dso.mil__platform-one__big-bang__bigbang.git secretRef: name: zarf-git-secret diff --git a/examples/big-bang/template/bigbang/values.yaml b/examples/big-bang/template/bigbang/values.yaml index 4a5d3c090b..f7d9de48c1 100644 --- a/examples/big-bang/template/bigbang/values.yaml +++ b/examples/big-bang/template/bigbang/values.yaml @@ -22,7 +22,7 @@ networkPolicies: istio: enabled: true git: - repo: http://stuart-gitea-http.zarf.svc.cluster.local:3000/zarf-git-user/mirror__repo1.dso.mil__platform-one__big-bang__apps__core__istio-controlplane.git + repo: http://zarf-gitea-http.zarf.svc.cluster.local:3000/zarf-git-user/mirror__repo1.dso.mil__platform-one__big-bang__apps__core__istio-controlplane.git ingressGateways: public-ingressgateway: type: "LoadBalancer" @@ -197,7 +197,7 @@ istio: istiooperator: enabled: true git: - repo: http://stuart-gitea-http.zarf.svc.cluster.local:3000/zarf-git-user/mirror__repo1.dso.mil__platform-one__big-bang__apps__core__istio-operator.git + repo: http://zarf-gitea-http.zarf.svc.cluster.local:3000/zarf-git-user/mirror__repo1.dso.mil__platform-one__big-bang__apps__core__istio-operator.git values: operator: resources: @@ -211,7 +211,7 @@ istiooperator: jaeger: enabled: true git: - repo: http://stuart-gitea-http.zarf.svc.cluster.local:3000/zarf-git-user/mirror__repo1.dso.mil__platform-one__big-bang__apps__core__jaeger.git + repo: http://zarf-gitea-http.zarf.svc.cluster.local:3000/zarf-git-user/mirror__repo1.dso.mil__platform-one__big-bang__apps__core__jaeger.git values: resources: requests: @@ -245,7 +245,7 @@ jaeger: kiali: enabled: true git: - repo: http://stuart-gitea-http.zarf.svc.cluster.local:3000/zarf-git-user/mirror__repo1.dso.mil__platform-one__big-bang__apps__core__kiali.git + repo: http://zarf-gitea-http.zarf.svc.cluster.local:3000/zarf-git-user/mirror__repo1.dso.mil__platform-one__big-bang__apps__core__kiali.git values: resources: requests: @@ -268,7 +268,7 @@ kiali: clusterAuditor: enabled: true git: - repo: http://stuart-gitea-http.zarf.svc.cluster.local:3000/zarf-git-user/mirror__repo1.dso.mil__platform-one__big-bang__apps__core__cluster-auditor.git + repo: http://zarf-gitea-http.zarf.svc.cluster.local:3000/zarf-git-user/mirror__repo1.dso.mil__platform-one__big-bang__apps__core__cluster-auditor.git values: resources: requests: @@ -281,7 +281,7 @@ clusterAuditor: gatekeeper: enabled: true git: - repo: http://stuart-gitea-http.zarf.svc.cluster.local:3000/zarf-git-user/mirror__repo1.dso.mil__platform-one__big-bang__apps__core__policy.git + repo: http://zarf-gitea-http.zarf.svc.cluster.local:3000/zarf-git-user/mirror__repo1.dso.mil__platform-one__big-bang__apps__core__policy.git values: replicas: 1 controllerManager: @@ -336,7 +336,7 @@ gatekeeper: logging: enabled: true git: - repo: http://stuart-gitea-http.zarf.svc.cluster.local:3000/zarf-git-user/mirror__repo1.dso.mil__platform-one__big-bang__apps__core__elasticsearch-kibana.git + repo: http://zarf-gitea-http.zarf.svc.cluster.local:3000/zarf-git-user/mirror__repo1.dso.mil__platform-one__big-bang__apps__core__elasticsearch-kibana.git values: elasticsearch: master: @@ -374,12 +374,12 @@ logging: eckoperator: enabled: true git: - repo: http://stuart-gitea-http.zarf.svc.cluster.local:3000/zarf-git-user/mirror__repo1.dso.mil__platform-one__big-bang__apps__core__eck-operator.git + repo: http://zarf-gitea-http.zarf.svc.cluster.local:3000/zarf-git-user/mirror__repo1.dso.mil__platform-one__big-bang__apps__core__eck-operator.git fluentbit: enabled: true git: - repo: http://stuart-gitea-http.zarf.svc.cluster.local:3000/zarf-git-user/mirror__repo1.dso.mil__platform-one__big-bang__apps__core__fluentbit.git + repo: http://zarf-gitea-http.zarf.svc.cluster.local:3000/zarf-git-user/mirror__repo1.dso.mil__platform-one__big-bang__apps__core__fluentbit.git values: securityContext: privileged: true @@ -394,7 +394,7 @@ fluentbit: monitoring: enabled: true git: - repo: http://stuart-gitea-http.zarf.svc.cluster.local:3000/zarf-git-user/mirror__repo1.dso.mil__platform-one__big-bang__apps__core__monitoring.git + repo: http://zarf-gitea-http.zarf.svc.cluster.local:3000/zarf-git-user/mirror__repo1.dso.mil__platform-one__big-bang__apps__core__monitoring.git values: alertmanager: alertmanagerSpec: @@ -458,7 +458,7 @@ monitoring: twistlock: enabled: true git: - repo: http://stuart-gitea-http.zarf.svc.cluster.local:3000/zarf-git-user/mirror__repo1.dso.mil__platform-one__big-bang__apps__security-tools__twistlock.git + repo: http://zarf-gitea-http.zarf.svc.cluster.local:3000/zarf-git-user/mirror__repo1.dso.mil__platform-one__big-bang__apps__security-tools__twistlock.git values: console: persistence: diff --git a/examples/big-bang/template/bigbang/vendor/bigbang/base/flux/kustomization.yaml b/examples/big-bang/template/bigbang/vendor/bigbang/base/flux/kustomization.yaml index 2b2c2788ea..27c0b6fdde 100644 --- a/examples/big-bang/template/bigbang/vendor/bigbang/base/flux/kustomization.yaml +++ b/examples/big-bang/template/bigbang/vendor/bigbang/base/flux/kustomization.yaml @@ -33,7 +33,7 @@ patches: cluster-autoscaler.kubernetes.io/safe-to-evict: "true" spec: imagePullSecrets: - - name: private-registry + - name: zarf-registry terminationGracePeriodSeconds: 60 # Required by Pod Security Policy securityContext: diff --git a/examples/big-bang/zarf.yaml b/examples/big-bang/zarf.yaml index 06d26a0a6f..f4dc034352 100644 --- a/examples/big-bang/zarf.yaml +++ b/examples/big-bang/zarf.yaml @@ -11,7 +11,6 @@ components: manifests: - name: flux-config files: - - manifests/flux/regcred-secret.yaml # kustomize build template/bigbang/vendor/bigbang/base/flux > manifests/flux/flux-generated.yaml - manifests/flux/flux-generated.yaml images: @@ -39,6 +38,7 @@ components: manifests: - name: bb-core-config files: + - manifests/flux/regcred-secret.yaml - manifests/big-bang/manifests.yaml # 1. helm template bigbang ./chart | yq e '. | select(.kind == "GitRepository") | "- " + .spec.url + "@" + .spec.ref.tag' - # 2. Add the actual bigbang repo as well From 6990d15ddac00546f5a7014923edf956c5259978 Mon Sep 17 00:00:00 2001 From: Jon Perry Date: Thu, 27 Jan 2022 10:48:03 -0500 Subject: [PATCH 44/88] Add default 'zarf connect' ports to Vagrantfile for dev testing --- examples/Vagrantfile | 3 +++ 1 file changed, 3 insertions(+) diff --git a/examples/Vagrantfile b/examples/Vagrantfile index 9c104b0d62..357e59212f 100755 --- a/examples/Vagrantfile +++ b/examples/Vagrantfile @@ -18,6 +18,9 @@ Vagrant.configure("2") do |config| config.vm.network "forwarded_port", guest: 443, host: 8443 config.vm.network "forwarded_port", guest: 9080, host: 9080 config.vm.network "forwarded_port", guest: 9443, host: 9443 + config.vm.network "forwarded_port", guest: 45001, host: 45001 + config.vm.network "forwarded_port", guest: 45002, host: 45002 + config.vm.network "forwarded_port", guest: 45003, host: 45003 config.ssh.insert_key = false config.ssh.extra_args = [ "-t", "cd /examples; sudo su" ] From a6c05339b0d86bef5ce863ae8b94e9fcd925163e Mon Sep 17 00:00:00 2001 From: Jon Perry Date: Thu, 27 Jan 2022 10:49:58 -0500 Subject: [PATCH 45/88] Actually remove HandleIfURL tempPath early deletion --- cli/internal/packager/common.go | 1 - 1 file changed, 1 deletion(-) diff --git a/cli/internal/packager/common.go b/cli/internal/packager/common.go index bbfdc1d57d..a27401a4ae 100644 --- a/cli/internal/packager/common.go +++ b/cli/internal/packager/common.go @@ -173,7 +173,6 @@ func HandleIfURL(packagePath string, shasum string, insecureDeploy bool) (string // Write the package to a local file tempPath := createPaths() - defer tempPath.clean() localPackagePath := tempPath.base + providedURL.Path message.Debugf("Creating local package with the path: %s", localPackagePath) From b191492d0751863865587b845917aad31c052217 Mon Sep 17 00:00:00 2001 From: Jon Perry Date: Thu, 27 Jan 2022 10:55:10 -0500 Subject: [PATCH 46/88] Update e2e tests to work with native apply refactor --- test/e2e/e2e_example_game_test.go | 15 +++++++++------ test/e2e/e2e_general_cli_test.go | 20 ++++++++++---------- test/e2e/e2e_gitea_and_grafana_test.go | 19 +++++++++++++++---- 3 files changed, 34 insertions(+), 20 deletions(-) diff --git a/test/e2e/e2e_example_game_test.go b/test/e2e/e2e_example_game_test.go index 893e245066..b475493b47 100644 --- a/test/e2e/e2e_example_game_test.go +++ b/test/e2e/e2e_example_game_test.go @@ -3,6 +3,7 @@ package test import ( "fmt" "testing" + "time" "github.com/gruntwork-io/terratest/modules/aws" "github.com/gruntwork-io/terratest/modules/ssh" @@ -66,19 +67,21 @@ func testGameExample(t *testing.T, terraformOptions *terraform.Options, keyPair require.NoError(t, err, output) // run `zarf init` - output, err = ssh.CheckSshCommandE(t, publicHost, fmt.Sprintf("sudo bash -c 'cd /home/%s/build && ./zarf init --confirm --components management --host 127.0.0.1'", username)) - require.NoError(t, err, output) - - // Wait until the Docker registry is ready - output, err = ssh.CheckSshCommandE(t, publicHost, "timeout 300 bash -c 'while [[ \"$(curl -sfSL --retry 15 --retry-connrefused --retry-delay 5 -o /dev/null -w \"%{http_code}\" \"https://127.0.0.1/v2/\")\" != \"401\" ]]; do sleep 1; done' || false") + output, err = ssh.CheckSshCommandE(t, publicHost, fmt.Sprintf("sudo bash -c 'cd /home/%s/build && ./zarf init --confirm --components k3s --host 127.0.0.1'", username)) require.NoError(t, err, output) // Deploy the game output, err = ssh.CheckSshCommandE(t, publicHost, fmt.Sprintf("sudo bash -c 'cd /home/%s/build && ./zarf package deploy zarf-package-appliance-demo-doom.tar.zst --confirm'", username)) require.NoError(t, err, output) + // Establish the port-forward into the game service; give the service a few seconds to come up since this is not a command we can retry + time.Sleep(5 * time.Second) + portForwardCommand := fmt.Sprintf("sudo bash -c '(/home/%s/build/zarf connect doom &> /dev/nul &)'", username) + output, err = ssh.CheckSshCommandE(t, publicHost, portForwardCommand) + require.NoError(t, err, output) + // Wait for the game to be live. Right now we're just checking that `curl` returns 0. It can be enhanced by scraping the HTML that gets returned or something. - output, err = ssh.CheckSshCommandE(t, publicHost, "timeout 300 bash -c 'while [[ \"$(curl -sfSL --retry 15 --retry-connrefused --retry-delay 5 -o /dev/null -w \"%{http_code}\" \"https://127.0.0.1\")\" != \"200\" ]]; do sleep 1; done' || false") + output, err = ssh.CheckSshCommandE(t, publicHost, "timeout 300 bash -c 'while [[ \"$(curl -sfSL --retry 15 --retry-connrefused --retry-delay 5 -o /dev/null -w \"%{http_code}\" \"http://127.0.0.1\")\" != \"200\" ]]; do sleep 1; done' || false") require.NoError(t, err, output) // Run `zarf destroy` to make sure that works correctly diff --git a/test/e2e/e2e_general_cli_test.go b/test/e2e/e2e_general_cli_test.go index bd2cc900d2..e33ab583bd 100644 --- a/test/e2e/e2e_general_cli_test.go +++ b/test/e2e/e2e_general_cli_test.go @@ -2,7 +2,6 @@ package test import ( "fmt" - "strings" "testing" "github.com/gruntwork-io/terratest/modules/aws" @@ -96,18 +95,19 @@ func testGeneralCliStuff(t *testing.T, terraformOptions *terraform.Options, keyP require.Error(t, err, output) // Test that `zarf package deploy` doesn't die when given a URL - output, err = ssh.CheckSshCommandE(t, publicHost, fmt.Sprintf("sudo bash -c 'cd /home/%s/build && ./zarf package deploy https://zarf-examples.s3.amazonaws.com/zarf-package-appliance-demo-doom.tar.zst --confirm --insecure'", username)) - require.NoError(t, err, output) - output, err = ssh.CheckSshCommandE(t, publicHost, fmt.Sprintf("sudo bash -c 'cd /home/%s/build && ./zarf package deploy https://zarf-examples.s3.amazonaws.com/zarf-package-appliance-demo-doom.tar.zst --confirm --shasum e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855'", username)) - require.NoError(t, err, output) + // NOTE: Temporarily commenting this out because this seems out of scope for a general cli test. Having this included also means we would have to fully standup a `zarf init` command. + // TODO: Move this to it's own e2e test. + // output, err = ssh.CheckSshCommandE(t, publicHost, fmt.Sprintf("sudo bash -c 'cd /home/%s/build && ./zarf package deploy https://zarf-examples.s3.amazonaws.com/zarf-package-appliance-demo-doom.tar.zst --confirm --insecure'", username)) + // require.NoError(t, err, output) + // output, err = ssh.CheckSshCommandE(t, publicHost, fmt.Sprintf("sudo bash -c 'cd /home/%s/build && ./zarf package deploy https://zarf-examples.s3.amazonaws.com/zarf-package-appliance-demo-doom.tar.zst --confirm --shasum e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855'", username)) + // require.NoError(t, err, output) // Test that `zarf package deploy` gives an error if deploying a remote package without the --insecure or --shasum flags - output, err = ssh.CheckSshCommandE(t, publicHost, fmt.Sprintf("sudo bash -c 'cd /home/%s/build && ./zarf package deploy https://zarf-examples.s3.amazonaws.com/zarf-package-appliance-demo-doom.tar.zst --confirm'", username)) + output, err = ssh.CheckSshCommandE(t, publicHost, fmt.Sprintf("sudo bash -c 'cd /home/%s/build && ./zarf package deploy https://zarf-examples.s3.amazonaws.com/zarf-package-appliance-demo-doom-20210125.tar.zst --confirm'", username)) require.Error(t, err, output) // Test that changing the log level actually applies the requested level - output, _ = ssh.CheckSshCommandE(t, publicHost, fmt.Sprintf("cd /home/%s/build && ./zarf version --log-level warn 2> /dev/null", username)) - expectedOutString := "The log level has been changed to: warning" - logLevelOutput := strings.Split(output, "\n")[0] - require.Equal(t, expectedOutString, logLevelOutput, "The log level should be changed to 'warn'") + output, _ = ssh.CheckSshCommandE(t, publicHost, fmt.Sprintf("cd /home/%s/build && ./zarf version --log-level warn 1> /dev/null", username)) + expectedOutString := "Log level set to warn" + require.Contains(t, output, expectedOutString, "The log level should be changed to 'warn'") } diff --git a/test/e2e/e2e_gitea_and_grafana_test.go b/test/e2e/e2e_gitea_and_grafana_test.go index 4e3cc718b1..4c2040cb03 100644 --- a/test/e2e/e2e_gitea_and_grafana_test.go +++ b/test/e2e/e2e_gitea_and_grafana_test.go @@ -2,12 +2,14 @@ package test import ( "fmt" + "testing" + "time" + "github.com/gruntwork-io/terratest/modules/aws" "github.com/gruntwork-io/terratest/modules/ssh" "github.com/gruntwork-io/terratest/modules/terraform" teststructure "github.com/gruntwork-io/terratest/modules/test-structure" "github.com/stretchr/testify/require" - "testing" ) func TestGiteaAndGrafana(t *testing.T) { @@ -60,14 +62,23 @@ func testGiteaAndGrafana(t *testing.T, terraformOptions *terraform.Options, keyP } // run `zarf init` - output, err := ssh.CheckSshCommandE(t, publicHost, fmt.Sprintf("sudo bash -c 'cd /home/%s/build && ./zarf init --confirm --components management,logging,gitops-service --host 127.0.0.1'", username)) + output, err := ssh.CheckSshCommandE(t, publicHost, fmt.Sprintf("sudo bash -c 'cd /home/%s/build && ./zarf init --confirm --components k3s,logging,gitops-service --host 127.0.0.1'", username)) require.NoError(t, err, output) + // Establish the port-forward into the gitea service; give the service a few seconds to come up since this is not a command we can retry + time.Sleep(15 * time.Second) + portForwardCommand := fmt.Sprintf("sudo bash -c '(/home/%s/build/zarf connect git &> /dev/nul &)'", username) + output, err = ssh.CheckSshCommandE(t, publicHost, portForwardCommand) + // Make sure Gitea comes up cleanly - output, err = ssh.CheckSshCommandE(t, publicHost, "timeout 300 bash -c 'while [[ \"$(curl -sfSL --retry 15 --retry-connrefused --retry-delay 5 -o /dev/null -w \"%{http_code}\" \"https://127.0.0.1/api/v1/user\")\" != \"401\" ]]; do sleep 1; done' || false") + output, err = ssh.CheckSshCommandE(t, publicHost, "timeout 300 bash -c 'while [[ \"$(curl -sfSL --retry 15 --retry-connrefused --retry-delay 5 -o /dev/null -w \"%{http_code}\" \"http://127.0.0.1:45003/explore/repos\")\" != \"200\" ]]; do sleep 1; done' || false") require.NoError(t, err, output) + // Establish the port-forward into the logging service + portForwardCommand = fmt.Sprintf("sudo bash -c '(/home/%s/build/zarf connect logging &> /dev/nul &)'", username) + output, err = ssh.CheckSshCommandE(t, publicHost, portForwardCommand) + // Make sure Grafana comes up cleanly - output, err = ssh.CheckSshCommandE(t, publicHost, "timeout 300 bash -c 'while [[ \"$(curl -sfSL --retry 15 --retry-connrefused --retry-delay 5 -o /dev/null -w \"%{http_code}\" \"https://127.0.0.1/monitor/api/org\")\" != \"401\" ]]; do sleep 1; done' || false") + output, err = ssh.CheckSshCommandE(t, publicHost, "timeout 300 bash -c 'while [[ \"$(curl -sfSL --retry 15 --retry-connrefused --retry-delay 5 -o /dev/null -w \"%{http_code}\" \"http://127.0.0.1:45002/monitor/login\")\" != \"200\" ]]; do sleep 1; done' || false") require.NoError(t, err, output) } From 5b3a059de0387f46a5f6b9f08ab8a182fb4bcd01 Mon Sep 17 00:00:00 2001 From: Jeff McCoy Date: Fri, 28 Jan 2022 03:56:12 -0600 Subject: [PATCH 47/88] Hybrid helm namespace management Due to complexities with how helm manages namespaces as well as how we need to handle them for things like secret injection, this commit uses different strategies depending on the situation: - Each of these conditions only run on detected namespaces that are. not already in the cluster: - When a namespace manifest is in the chart, pre-create it with the necessary labels/annotations to be adopted on helm install - When a namespace is not in the chart but is used by resources in the chart, it is created and labeled as managed by zarf The edge case will be two charts in the same namespace where one or both define the namespace in their manifests, this actually violates the helm usage anyway: https://github.com/helm/helm/pull/7649 --- cli/internal/helm/chart.go | 110 ++++++++++++++++++++-------------- cli/internal/k8s/namespace.go | 27 ++++++--- go.mod | 1 - 3 files changed, 86 insertions(+), 52 deletions(-) diff --git a/cli/internal/helm/chart.go b/cli/internal/helm/chart.go index fc4886f297..131d2fb0f2 100644 --- a/cli/internal/helm/chart.go +++ b/cli/internal/helm/chart.go @@ -9,7 +9,8 @@ import ( "github.com/defenseunicorns/zarf/cli/config" "github.com/defenseunicorns/zarf/cli/types" - "k8s.io/cli-runtime/pkg/printers" + corev1 "k8s.io/api/core/v1" + "k8s.io/apimachinery/pkg/runtime" "github.com/defenseunicorns/zarf/cli/internal/k8s" "github.com/defenseunicorns/zarf/cli/internal/message" @@ -33,7 +34,7 @@ type ChartOptions struct { type renderer struct { options ChartOptions - namespaces []string + namespaces map[string]*corev1.Namespace connectStrings ConnectStrings } @@ -222,9 +223,6 @@ func installChart(actionConfig *action.Configuration, options ChartOptions, post // Namespace must be specified client.Namespace = options.Chart.Namespace - // Create namespace if it does not exist - client.CreateNamespace = true - // Post-processing our manifests for reasons.... client.PostRenderer = postRender @@ -315,13 +313,13 @@ func NewRenderer(options ChartOptions) *renderer { message.Debugf("helm.NewRenderer(%v)", options) return &renderer{ options: options, - namespaces: []string{options.Chart.Namespace}, + namespaces: make(map[string]*corev1.Namespace), connectStrings: make(ConnectStrings), } } func (r *renderer) Run(renderedManifests *bytes.Buffer) (*bytes.Buffer, error) { - message.Debugf("helm.Run(%v)", renderedManifests) + message.Debugf("helm.Run(renderedManifests *bytes.Buffer)") // This is very low cost and consistent for how we replace elsewhere, also good for debugging tempDir, _ := utils.MakeTempDir() path := tempDir + "/chart.yaml" @@ -349,15 +347,35 @@ func (r *renderer) Run(renderedManifests *bytes.Buffer) (*bytes.Buffer, error) { } else { // Otherwise, loop over the resources, for _, resource := range resources { - // grab the namespace, - namespace := resource.GetNamespace() - // and append to the list if it's unique - if namespace != "" && !contains(r.namespaces, namespace) { - r.namespaces = append(r.namespaces, namespace) - } + switch resource.GetKind() { + case "Namespace": + var namespace corev1.Namespace + // parse the namespace resource so it can be applied out-of-band by zarf instead of helm to avoid helm ns shennanigans + if err := runtime.DefaultUnstructuredConverter.FromUnstructured(resource.UnstructuredContent(), &namespace); err != nil { + message.Errorf(err, "could not parse namespace %s", resource.GetName()) + } else { + message.Debugf("Matched helm namespace %s for zarf annotation", &namespace.Name) + // add the adoption reqs for this namespace, https://github.com/helm/helm/pull/7649 + if namespace.Labels == nil { + // Ensure map exists to avoid nil panic + namespace.Labels = make(map[string]string) + } + namespace.Labels["app.kubernetes.io/managed-by"] = "Helm" + if namespace.Annotations == nil { + // Ensure map exists to avoid nil panic + namespace.Annotations = make(map[string]string) + } + namespace.Annotations["meta.helm.sh/release-name"] = r.options.ReleaseName + namespace.Annotations["meta.helm.sh/release-namespace"] = r.options.Chart.Namespace + + // Add it to the stack + r.namespaces[namespace.Name] = &namespace + } + // skip so we can strip namespaces from helms brain + continue - if resource.GetKind() == "Service" { + case "Service": // Check service resources for the zarf-connect label labels := resource.GetLabels() annotations := resource.GetAnnotations() @@ -365,6 +383,7 @@ func (r *renderer) Run(renderedManifests *bytes.Buffer) (*bytes.Buffer, error) { if key, keyExists := labels[config.ZarfConnectLabelName]; keyExists { // If there is a zarf-connect label if description, descExists := annotations[config.ZarfConnectAnnotationDescription]; descExists { + message.Debugf("Match helm service %s for zarf connection %s", resource.GetName(), key) // and a description set the label and description r.connectStrings[key] = description } else { @@ -373,48 +392,51 @@ func (r *renderer) Run(renderedManifests *bytes.Buffer) (*bytes.Buffer, error) { } } } + + namespace := resource.GetNamespace() + if _, exists := r.namespaces[namespace]; !exists && namespace != "" { + // if this is the first time seeing this ns, we need to track that to create it as well + r.namespaces[namespace] = nil + } } } - chartText := string(buff) - secretPrefix := "---\n" secretName := "zarf-registry" - for _, namespace := range r.namespaces { - // Try to get an existing secret - secret, _ := k8s.GetSecret(namespace, secretName) - - if secret.Name == secretName && secret.Annotations["meta.helm.sh/release-name"] != r.options.ReleaseName { - // Don't add a secret if it already was created by another chart - // But we have to include it this chart deployed it or helm will remove it - continue - } + existingNamespaces, _ := k8s.GetNamespaces() - // Create the secret as a k8s object - secret = k8s.GenerateRegistryPullCreds(namespace, secretName) + for name, namespace := range r.namespaces { - // Convert to yaml buffer - buf := new(bytes.Buffer) - yp := printers.YAMLPrinter{} - yp.PrintObj(secret, buf) + // Check to see if this namespace already exists + var existingNamespace bool + for _, serverNamespace := range existingNamespaces.Items { + if serverNamespace.Name == name { + existingNamespace = true + } + } - // Prepend the secret to the helm chart text - chartText = secretPrefix + buf.String() + chartText + if !existingNamespace { + // This is a new namespace, add it + if _, err := k8s.CreateNamespace(name, namespace); err != nil { + return nil, fmt.Errorf("unable to create the missing namespace %s", name) + } + } + // Try to get an existing secret + if secret, _ := k8s.GetSecret(name, secretName); secret.Name == secretName { + // Don't add a secret if it already was created by another chart + continue + } else { + // Create the secret as a k8s object + secret = k8s.GenerateRegistryPullCreds(name, secretName) + if err := k8s.CreateSecret(secret); err != nil { + message.Errorf(err, "Problem creating registry secret for the %s namespace", name) + } + } } // Cleanup the temp file _ = os.RemoveAll(tempDir) // Send the bytes back to helm - return bytes.NewBuffer([]byte(chartText)), nil -} - -func contains(haystack []string, needle string) bool { - message.Debugf("helm.contains(%v, %s)", haystack, needle) - for _, hay := range haystack { - if hay == needle { - return true - } - } - return false + return bytes.NewBuffer(buff), nil } diff --git a/cli/internal/k8s/namespace.go b/cli/internal/k8s/namespace.go index 6e1af34368..50f9c145a0 100644 --- a/cli/internal/k8s/namespace.go +++ b/cli/internal/k8s/namespace.go @@ -2,12 +2,13 @@ package k8s import ( "context" + "os" + "time" + "github.com/defenseunicorns/zarf/cli/internal/message" corev1 "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "os" - "time" ) func GetNamespaces() (*corev1.NamespaceList, error) { @@ -17,15 +18,27 @@ func GetNamespaces() (*corev1.NamespaceList, error) { return clientset.CoreV1().Namespaces().List(context.TODO(), metaOptions) } -func CreateNamespace(name string) (*corev1.Namespace, error) { +func CreateNamespace(name string, namespace *corev1.Namespace) (*corev1.Namespace, error) { message.Debugf("k8s.CreateNamespace(%s)", name) clientset := getClientset() - namespace := &corev1.Namespace{ - TypeMeta: metav1.TypeMeta{APIVersion: corev1.SchemeGroupVersion.String(), Kind: "Namespace"}, - ObjectMeta: metav1.ObjectMeta{Name: name}, - } + if namespace == nil { + // if only a name was provided create the namespace object + namespace = &corev1.Namespace{ + TypeMeta: metav1.TypeMeta{ + APIVersion: corev1.SchemeGroupVersion.String(), + Kind: "Namespace", + }, + ObjectMeta: metav1.ObjectMeta{ + Name: name, + Labels: map[string]string{ + // track the creation of this ns by zarf + "app.kubernetes.io/managed-by": "zarf", + }, + }, + } + } metaOptions := metav1.GetOptions{} createOptions := metav1.CreateOptions{} diff --git a/go.mod b/go.mod index 267c9abc18..757962d950 100644 --- a/go.mod +++ b/go.mod @@ -24,7 +24,6 @@ require ( helm.sh/helm/v3 v3.7.2 k8s.io/api v0.22.5 k8s.io/apimachinery v0.22.5 - k8s.io/cli-runtime v0.22.5 k8s.io/client-go v0.22.5 k8s.io/klog/v2 v2.40.1 sigs.k8s.io/yaml v1.3.0 From ad4f644e0400576d78505102780f04b139497d1a Mon Sep 17 00:00:00 2001 From: Jeff McCoy Date: Fri, 28 Jan 2022 03:57:38 -0600 Subject: [PATCH 48/88] small lint/pterm spinner cleanup --- cli/internal/k8s/secrets.go | 10 +++------- cli/internal/k8s/tunnel.go | 1 + cli/internal/packager/prepare.go | 8 ++------ 3 files changed, 6 insertions(+), 13 deletions(-) diff --git a/cli/internal/k8s/secrets.go b/cli/internal/k8s/secrets.go index 8430f02eae..a684c55e66 100644 --- a/cli/internal/k8s/secrets.go +++ b/cli/internal/k8s/secrets.go @@ -31,10 +31,7 @@ func GetSecret(namespace string, name string) (*corev1.Secret, error) { } func GenerateRegistryPullCreds(namespace string, name string) *corev1.Secret { - message.Debugf("k8s.GenerateRegistryPullCreds(%s)", namespace) - - spinner := message.NewProgressSpinner("Generating private registry credentials %s/%s", namespace, name) - defer spinner.Stop() + message.Debugf("k8s.GenerateRegistryPullCreds(%s, %s)", namespace, name) secretDockerConfig := &corev1.Secret{ TypeMeta: metav1.TypeMeta{ @@ -52,7 +49,7 @@ func GenerateRegistryPullCreds(namespace string, name string) *corev1.Secret { // Auth field must be username:password and base64 encoded credential := config.GetSecret(config.StateRegistryPull) if credential == "" { - spinner.Fatalf(nil, "Generate pull cred failed") + message.Fatalf(nil, "Generate pull cred failed") } fieldValue := config.ZarfRegistryPullUser + ":" + credential authEncodedValue := base64.StdEncoding.EncodeToString([]byte(fieldValue)) @@ -70,13 +67,12 @@ func GenerateRegistryPullCreds(namespace string, name string) *corev1.Secret { // Convert to JSON dockerConfigData, err := json.Marshal(dockerConfigJSON) if err != nil { - spinner.Fatalf(err, "Unable to create the embedded registry secret") + message.Fatalf(err, "Unable to create the embedded registry secret") } // Add to the secret data secretDockerConfig.Data[".dockerconfigjson"] = dockerConfigData - spinner.Success() return secretDockerConfig } diff --git a/cli/internal/k8s/tunnel.go b/cli/internal/k8s/tunnel.go index e09c655264..743261129c 100644 --- a/cli/internal/k8s/tunnel.go +++ b/cli/internal/k8s/tunnel.go @@ -258,6 +258,7 @@ func (tunnel *Tunnel) Establish() (string, error) { // Wait for an error or the tunnel to be ready select { case err = <-errChan: + spinner.Stop() return "", fmt.Errorf("unable to start the tunnel: %w", err) case <-portforwarder.Ready: url := fmt.Sprintf("http://%s:%v", config.IPV4Localhost, tunnel.localPort) diff --git a/cli/internal/packager/prepare.go b/cli/internal/packager/prepare.go index 13e5ce3cd4..cd0a9698ba 100644 --- a/cli/internal/packager/prepare.go +++ b/cli/internal/packager/prepare.go @@ -117,9 +117,7 @@ func FindImages(repoHelmChartPath string) { // Break the template into separate resources yamls, _ := k8s.SplitYAML([]byte(template)) - for _, yaml := range yamls { - resources = append(resources, yaml) - } + resources = append(resources, yamls...) } } @@ -135,9 +133,7 @@ func FindImages(repoHelmChartPath string) { // Break the manifest into separate resources yamls, _ := k8s.SplitYAML(contents) - for _, yaml := range yamls { - resources = append(resources, yaml) - } + resources = append(resources, yamls...) } } From eb875aadf2aa1e4bfbad807a45cb2ea4bd3f13e4 Mon Sep 17 00:00:00 2001 From: Jeff McCoy Date: Fri, 28 Jan 2022 03:58:34 -0600 Subject: [PATCH 49/88] add recommended k8s managed-by labels to object creations https://kubernetes.io/docs/concepts/overview/_print/#labels --- cli/internal/k8s/secrets.go | 9 +++++++++ cli/internal/k8s/state.go | 3 +++ 2 files changed, 12 insertions(+) diff --git a/cli/internal/k8s/secrets.go b/cli/internal/k8s/secrets.go index a684c55e66..17ffcf95c5 100644 --- a/cli/internal/k8s/secrets.go +++ b/cli/internal/k8s/secrets.go @@ -41,6 +41,9 @@ func GenerateRegistryPullCreds(namespace string, name string) *corev1.Secret { ObjectMeta: metav1.ObjectMeta{ Name: name, Namespace: namespace, + Labels: map[string]string{ + "app.kubernetes.io/managed-by": "zarf", + }, }, Type: corev1.SecretTypeDockerConfigJson, Data: map[string][]byte{}, @@ -99,6 +102,9 @@ func GenerateTLSSecret(namespace string, name string, certPath string, keyPath s ObjectMeta: metav1.ObjectMeta{ Name: name, Namespace: namespace, + Labels: map[string]string{ + "app.kubernetes.io/managed-by": "zarf", + }, }, Type: corev1.SecretTypeTLS, Data: map[string][]byte{}, @@ -133,6 +139,9 @@ func ReplaceTLSSecret(namespace string, name string) { ObjectMeta: metav1.ObjectMeta{ Name: name, Namespace: namespace, + Labels: map[string]string{ + "app.kubernetes.io/managed-by": "zarf", + }, }, Type: corev1.SecretTypeTLS, Data: map[string][]byte{}, diff --git a/cli/internal/k8s/state.go b/cli/internal/k8s/state.go index 6f98d04836..886bc6cfbf 100644 --- a/cli/internal/k8s/state.go +++ b/cli/internal/k8s/state.go @@ -72,6 +72,9 @@ func SaveZarfState(state types.ZarfState) error { ObjectMeta: metav1.ObjectMeta{ Name: ZarfStateSecretName, Namespace: ZarfNamespace, + Labels: map[string]string{ + "app.kubernetes.io/managed-by": "zarf", + }, }, Type: corev1.SecretTypeOpaque, Data: dataWrapper, From 6cd0a6b5da584294c37f326c21763722b90d20be Mon Sep 17 00:00:00 2001 From: Jeff McCoy Date: Fri, 28 Jan 2022 03:59:04 -0600 Subject: [PATCH 50/88] k8s secret code cleanup --- cli/internal/k8s/secrets.go | 36 +++++++++++++++++++++++++++--------- cli/internal/k8s/state.go | 2 +- 2 files changed, 28 insertions(+), 10 deletions(-) diff --git a/cli/internal/k8s/secrets.go b/cli/internal/k8s/secrets.go index 17ffcf95c5..def0f23617 100644 --- a/cli/internal/k8s/secrets.go +++ b/cli/internal/k8s/secrets.go @@ -150,29 +150,47 @@ func ReplaceTLSSecret(namespace string, name string) { secret.Data[corev1.TLSCertKey] = tlsCert secret.Data[corev1.TLSPrivateKeyKey] = tlsKey - if err := replaceSecret(secret); err != nil { + if err := ReplaceSecret(secret); err != nil { message.Fatalf(err, "Unable to create the secret") } } -func replaceSecret(secret *corev1.Secret) error { - message.Debugf("k8s.replaceSecret(%v)", secret) - clientSet := getClientset() +func ReplaceSecret(secret *corev1.Secret) error { + message.Debugf("k8s.ReplaceSecret(%v)", secret) - _, err := CreateNamespace(secret.Namespace) - if err != nil { + if _, err := CreateNamespace(secret.Namespace, nil); err != nil { return fmt.Errorf("unable to create or read the namespace: %w", err) } + if err := DeleteSecret(secret); err != nil { + return err + } + + return CreateSecret(secret) +} + +func DeleteSecret(secret *corev1.Secret) error { + message.Debugf("k8s.DeleteSecret(%v)", secret) + clientSet := getClientset() + namespaceSecrets := clientSet.CoreV1().Secrets(secret.Namespace) - err = namespaceSecrets.Delete(context.TODO(), secret.Name, metav1.DeleteOptions{}) + err := namespaceSecrets.Delete(context.TODO(), secret.Name, metav1.DeleteOptions{}) if err != nil && !errors.IsNotFound(err) { return fmt.Errorf("error deleting the secret: %w", err) } - _, err = namespaceSecrets.Create(context.TODO(), secret, metav1.CreateOptions{}) - if err != nil { + return nil +} + +func CreateSecret(secret *corev1.Secret) error { + message.Debugf("k8s.CreateSecret(%v)", secret) + clientSet := getClientset() + + namespaceSecrets := clientSet.CoreV1().Secrets(secret.Namespace) + + // create the given secret + if _, err := namespaceSecrets.Create(context.TODO(), secret, metav1.CreateOptions{}); err != nil { return fmt.Errorf("unable to create the secret: %w", err) } diff --git a/cli/internal/k8s/state.go b/cli/internal/k8s/state.go index 886bc6cfbf..177b03ceea 100644 --- a/cli/internal/k8s/state.go +++ b/cli/internal/k8s/state.go @@ -83,7 +83,7 @@ func SaveZarfState(state types.ZarfState) error { message.Debug(secret) // Attempt to create or replace the secret and return - if err := replaceSecret(secret); err != nil { + if err := ReplaceSecret(secret); err != nil { return fmt.Errorf("unable to create the zarf state secret") } From 880ad46f9034931d5ca1da0d51dc975539bb7f95 Mon Sep 17 00:00:00 2001 From: Jeff McCoy Date: Sun, 30 Jan 2022 12:47:52 -0600 Subject: [PATCH 51/88] add kustomizations key for manifests to replace manual kustomizations --- cli/internal/kustomize/build.go | 28 + cli/internal/packager/create.go | 35 +- cli/internal/packager/deploy.go | 6 + cli/internal/packager/prepare.go | 52 +- cli/internal/packager/validate/validate.go | 4 +- cli/types/types.go | 3 +- examples/Makefile | 2 +- .../bigbang/base/flux/gotk-components.yaml | 3540 ----------------- .../bigbang/base/flux/kustomization.yaml | 134 - examples/big-bang/zarf.yaml | 8 +- go.mod | 2 + zarf.schema.json | 9 +- 12 files changed, 116 insertions(+), 3707 deletions(-) create mode 100644 cli/internal/kustomize/build.go delete mode 100644 examples/big-bang/template/bigbang/vendor/bigbang/base/flux/gotk-components.yaml delete mode 100644 examples/big-bang/template/bigbang/vendor/bigbang/base/flux/kustomization.yaml diff --git a/cli/internal/kustomize/build.go b/cli/internal/kustomize/build.go new file mode 100644 index 0000000000..03548fcf27 --- /dev/null +++ b/cli/internal/kustomize/build.go @@ -0,0 +1,28 @@ +package kustomize + +import ( + "fmt" + + "github.com/defenseunicorns/zarf/cli/internal/utils" + "sigs.k8s.io/kustomize/api/krusty" + "sigs.k8s.io/kustomize/kyaml/filesys" +) + +// BuildKustomization reads a kustomization and builds it into a single yaml file +func BuildKustomization(path string, destination string) error { + // Kustomize has to write to the filesystem on-disk + fSys := filesys.MakeFsOnDisk() + kustomizer := krusty.MakeKustomizer(krusty.MakeDefaultOptions()) + + // Try to build the kustomization + resources, err := kustomizer.Run(fSys, path) + if err != nil { + return err + } + + if yaml, err := resources.AsYaml(); err != nil { + return fmt.Errorf("problem converting kustomization to yaml: %w", err) + } else { + return utils.WriteFile(destination, yaml) + } +} diff --git a/cli/internal/packager/create.go b/cli/internal/packager/create.go index 744682efc4..5fd0b8ed77 100644 --- a/cli/internal/packager/create.go +++ b/cli/internal/packager/create.go @@ -2,14 +2,16 @@ package packager import ( "fmt" - "github.com/defenseunicorns/zarf/cli/internal/packager/validate" - "github.com/defenseunicorns/zarf/cli/types" "os" "path/filepath" "regexp" "strconv" "strings" + "github.com/defenseunicorns/zarf/cli/internal/kustomize" + "github.com/defenseunicorns/zarf/cli/internal/packager/validate" + "github.com/defenseunicorns/zarf/cli/types" + "github.com/defenseunicorns/zarf/cli/config" "github.com/defenseunicorns/zarf/cli/internal/git" "github.com/defenseunicorns/zarf/cli/internal/helm" @@ -133,11 +135,32 @@ func addComponent(tempPath tempPaths, component types.ZarfComponent) { } } - for _, manifest := range component.Manifests { - for _, file := range manifest.Files { - destination := fmt.Sprintf("%s/%s", componentPath.manifests, file) - utils.CreatePathAndCopy(file, destination) + if len(component.Manifests) > 0 { + spinner := message.NewProgressSpinner("Loading %d manifests", len(component.Manifests)) + defer spinner.Stop() + + if err := utils.CreateDirectory(componentPath.manifests, 0700); err != nil { + spinner.Fatalf(err, "Unable to create the manifest path %s", componentPath.manifests) + } + + // Iterate over all manifests + for _, manifest := range component.Manifests { + for _, file := range manifest.Files { + // Copy manifests without any processing + spinner.Updatef("Copying manifest %s", file) + destination := fmt.Sprintf("%s/%s", componentPath.manifests, file) + utils.CreatePathAndCopy(file, destination) + } + for idx, kustomization := range manifest.Kustomizations { + // Generate manifests from kustomizations and place in the package + spinner.Updatef("Building kustomization for %s", kustomization) + destination := fmt.Sprintf("%s/kustomization-%s-%d.yaml", componentPath.manifests, manifest.Name, idx) + if err := kustomize.BuildKustomization(kustomization, destination); err != nil { + spinner.Fatalf(err, "unable to build the kustomization for %s", kustomization) + } + } } + spinner.Success() } // Load all specified git repos diff --git a/cli/internal/packager/deploy.go b/cli/internal/packager/deploy.go index ef4682cc82..3301b2e14a 100644 --- a/cli/internal/packager/deploy.go +++ b/cli/internal/packager/deploy.go @@ -238,6 +238,12 @@ func deployComponents(tempPath tempPaths, component types.ZarfComponent) { } for _, manifest := range component.Manifests { + for idx := range manifest.Kustomizations { + // Move kustomizations to files now + destination := fmt.Sprintf("kustomization-%s-%d.yaml", manifest.Name, idx) + manifest.Files = append(manifest.Files, destination) + } + // Iterate over any connectStrings and add to the main map for name, description := range helm.GenerateChart(componentPath.manifests, manifest, component.Images) { connectStrings[name] = description diff --git a/cli/internal/packager/prepare.go b/cli/internal/packager/prepare.go index cd0a9698ba..c382e5b8c0 100644 --- a/cli/internal/packager/prepare.go +++ b/cli/internal/packager/prepare.go @@ -2,9 +2,16 @@ package packager import ( "fmt" + "os" + "regexp" + "sort" + "strconv" + "strings" + "github.com/defenseunicorns/zarf/cli/config" "github.com/defenseunicorns/zarf/cli/internal/helm" "github.com/defenseunicorns/zarf/cli/internal/k8s" + "github.com/defenseunicorns/zarf/cli/internal/kustomize" "github.com/defenseunicorns/zarf/cli/internal/message" "github.com/defenseunicorns/zarf/cli/internal/utils" "github.com/defenseunicorns/zarf/cli/types" @@ -13,11 +20,6 @@ import ( corev1 "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" "k8s.io/apimachinery/pkg/runtime" - "os" - "regexp" - "sort" - "strconv" - "strings" ) type ImageMap map[string]bool @@ -121,19 +123,35 @@ func FindImages(repoHelmChartPath string) { } } - for _, manifest := range component.Manifests { - // Get all manifest files - for _, file := range manifest.Files { - // Read the contents of each file - contents, err := os.ReadFile(file) - if err != nil { - message.Errorf(err, "Unable to read the file %s", file) - continue + if len(component.Manifests) > 0 { + if err := utils.CreateDirectory(componentPath.manifests, 0700); err != nil { + message.Errorf(err, "Unable to create the manifest path %s", componentPath.manifests) + } + + for _, manifest := range component.Manifests { + for idx, kustomization := range manifest.Kustomizations { + // Generate manifests from kustomizations and place in the package + destination := fmt.Sprintf("%s/kustomization-%s-%d.yaml", componentPath.manifests, manifest.Name, idx) + if err := kustomize.BuildKustomization(kustomization, destination); err != nil { + message.Errorf(err, "unable to build the kustomization for %s", kustomization) + } else { + manifest.Files = append(manifest.Files, destination) + } } - // Break the manifest into separate resources - yamls, _ := k8s.SplitYAML(contents) - resources = append(resources, yamls...) + // Get all manifest files + for _, file := range manifest.Files { + // Read the contents of each file + contents, err := os.ReadFile(file) + if err != nil { + message.Errorf(err, "Unable to read the file %s", file) + continue + } + + // Break the manifest into separate resources + yamls, _ := k8s.SplitYAML(contents) + resources = append(resources, yamls...) + } } } @@ -145,7 +163,7 @@ func FindImages(repoHelmChartPath string) { if sortedImages := listImages(matchedImages, nil); len(sortedImages) > 0 { // Log the header comment - fmt.Println(fmt.Sprintf(" # %s - %s", config.GetMetaData().Name, component.Name)) + fmt.Printf(" # %s - %s\n", config.GetMetaData().Name, component.Name) for _, image := range sortedImages { // Use print because we want this dumped to stdout fmt.Println(" - " + image) diff --git a/cli/internal/packager/validate/validate.go b/cli/internal/packager/validate/validate.go index 09fed0199e..4cacae99ab 100644 --- a/cli/internal/packager/validate/validate.go +++ b/cli/internal/packager/validate/validate.go @@ -75,8 +75,8 @@ func validateManifest(manifest types.ZarfManifest) error { } // Require files in manifest - if len(manifest.Files) < 1 { - return fmt.Errorf("%s must have at least 1 file", intro) + if len(manifest.Files) < 1 && len(manifest.Kustomizations) < 1 { + return fmt.Errorf("%s must have at least one file or kustomization", intro) } return nil diff --git a/cli/types/types.go b/cli/types/types.go index 5bbfe2af9e..82e1e7ebee 100644 --- a/cli/types/types.go +++ b/cli/types/types.go @@ -37,7 +37,8 @@ type ZarfComponent struct { type ZarfManifest struct { Name string `yaml:"name"` DefaultNamespace string `yaml:"namespace,omitempty"` - Files []string `yaml:"files"` + Files []string `yaml:"files,omitempty"` + Kustomizations []string `yaml:"kustomizations,omitempty"` } // ZarfComponentScripts are scripts that run before or after a component is deployed diff --git a/examples/Makefile b/examples/Makefile index 3a5386fd26..1aabf86f36 100755 --- a/examples/Makefile +++ b/examples/Makefile @@ -71,7 +71,7 @@ vendor-big-bang-base: ## Grab the bigbang base kustomization so we don't need to .PHONY: package-example-big-bang package-example-big-bang: vendor-big-bang-base ## Create the Big Bang Core example - cd big-bang && kustomize build template/bigbang/vendor/bigbang/base/flux > manifests/flux/flux-generated.yaml && $(ZARF_BIN) package create --confirm && mv zarf-package-* ../sync/ + cd big-bang && $(ZARF_BIN) package create --confirm && mv zarf-package-* ../sync/ .PHONY: package-example-softare-factory package-example-software-factory: ## Create the Big Bang Software Factory example diff --git a/examples/big-bang/template/bigbang/vendor/bigbang/base/flux/gotk-components.yaml b/examples/big-bang/template/bigbang/vendor/bigbang/base/flux/gotk-components.yaml deleted file mode 100644 index 2a7055c0f0..0000000000 --- a/examples/big-bang/template/bigbang/vendor/bigbang/base/flux/gotk-components.yaml +++ /dev/null @@ -1,3540 +0,0 @@ ---- -# Flux version: v0.15.0 -# Components: source-controller,kustomize-controller,helm-controller,notification-controller -apiVersion: v1 -kind: Namespace -metadata: - labels: - app.kubernetes.io/instance: flux-system - app.kubernetes.io/part-of: flux - app.kubernetes.io/version: v0.15.0 - name: flux-system ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - controller-gen.kubebuilder.io/version: v0.5.0 - creationTimestamp: null - labels: - app.kubernetes.io/instance: flux-system - app.kubernetes.io/part-of: flux - app.kubernetes.io/version: v0.15.0 - name: alerts.notification.toolkit.fluxcd.io -spec: - group: notification.toolkit.fluxcd.io - names: - kind: Alert - listKind: AlertList - plural: alerts - singular: alert - scope: Namespaced - versions: - - additionalPrinterColumns: - - jsonPath: .status.conditions[?(@.type=="Ready")].status - name: Ready - type: string - - jsonPath: .status.conditions[?(@.type=="Ready")].message - name: Status - type: string - - jsonPath: .metadata.creationTimestamp - name: Age - type: date - name: v1beta1 - schema: - openAPIV3Schema: - description: Alert is the Schema for the alerts API - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: AlertSpec defines an alerting rule for events involving a - list of objects - properties: - eventSeverity: - default: info - description: Filter events based on severity, defaults to ('info'). - If set to 'info' no events will be filtered. - enum: - - info - - error - type: string - eventSources: - description: Filter events based on the involved objects. - items: - description: CrossNamespaceObjectReference contains enough information - to let you locate the typed referenced object at cluster level - properties: - apiVersion: - description: API version of the referent - type: string - kind: - description: Kind of the referent - enum: - - Bucket - - GitRepository - - Kustomization - - HelmRelease - - HelmChart - - HelmRepository - - ImageRepository - - ImagePolicy - - ImageUpdateAutomation - type: string - name: - description: Name of the referent - maxLength: 53 - minLength: 1 - type: string - namespace: - description: Namespace of the referent - maxLength: 53 - minLength: 1 - type: string - required: - - name - type: object - type: array - exclusionList: - description: A list of Golang regular expressions to be used for excluding - messages. - items: - type: string - type: array - providerRef: - description: Send events using this provider. - properties: - name: - description: Name of the referent - type: string - required: - - name - type: object - summary: - description: Short description of the impact and affected cluster. - type: string - suspend: - description: This flag tells the controller to suspend subsequent - events dispatching. Defaults to false. - type: boolean - required: - - eventSources - - providerRef - type: object - status: - description: AlertStatus defines the observed state of Alert - properties: - conditions: - items: - description: "Condition contains details for one aspect of the current - state of this API Resource. --- This struct is intended for direct - use as an array at the field path .status.conditions. For example, - type FooStatus struct{ // Represents the observations of a - foo's current state. // Known .status.conditions.type are: - \"Available\", \"Progressing\", and \"Degraded\" // +patchMergeKey=type - \ // +patchStrategy=merge // +listType=map // +listMapKey=type - \ Conditions []metav1.Condition `json:\"conditions,omitempty\" - patchStrategy:\"merge\" patchMergeKey:\"type\" protobuf:\"bytes,1,rep,name=conditions\"` - \n // other fields }" - properties: - lastTransitionTime: - description: lastTransitionTime is the last time the condition - transitioned from one status to another. This should be when - the underlying condition changed. If that is not known, then - using the time when the API field changed is acceptable. - format: date-time - type: string - message: - description: message is a human readable message indicating - details about the transition. This may be an empty string. - maxLength: 32768 - type: string - observedGeneration: - description: observedGeneration represents the .metadata.generation - that the condition was set based upon. For instance, if .metadata.generation - is currently 12, but the .status.conditions[x].observedGeneration - is 9, the condition is out of date with respect to the current - state of the instance. - format: int64 - minimum: 0 - type: integer - reason: - description: reason contains a programmatic identifier indicating - the reason for the condition's last transition. Producers - of specific condition types may define expected values and - meanings for this field, and whether the values are considered - a guaranteed API. The value should be a CamelCase string. - This field may not be empty. - maxLength: 1024 - minLength: 1 - pattern: ^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$ - type: string - status: - description: status of the condition, one of True, False, Unknown. - enum: - - "True" - - "False" - - Unknown - type: string - type: - description: type of condition in CamelCase or in foo.example.com/CamelCase. - --- Many .condition.type values are consistent across resources - like Available, but because arbitrary conditions can be useful - (see .node.status.conditions), the ability to deconflict is - important. The regex it matches is (dns1123SubdomainFmt/)?(qualifiedNameFmt) - maxLength: 316 - pattern: ^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$ - type: string - required: - - lastTransitionTime - - message - - reason - - status - - type - type: object - type: array - observedGeneration: - description: ObservedGeneration is the last observed generation. - format: int64 - type: integer - type: object - type: object - served: true - storage: true - subresources: - status: {} -status: - acceptedNames: - kind: "" - plural: "" - conditions: [] - storedVersions: [] ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - controller-gen.kubebuilder.io/version: v0.5.0 - creationTimestamp: null - labels: - app.kubernetes.io/instance: flux-system - app.kubernetes.io/part-of: flux - app.kubernetes.io/version: v0.15.0 - name: buckets.source.toolkit.fluxcd.io -spec: - group: source.toolkit.fluxcd.io - names: - kind: Bucket - listKind: BucketList - plural: buckets - singular: bucket - scope: Namespaced - versions: - - additionalPrinterColumns: - - jsonPath: .spec.url - name: URL - type: string - - jsonPath: .status.conditions[?(@.type=="Ready")].status - name: Ready - type: string - - jsonPath: .status.conditions[?(@.type=="Ready")].message - name: Status - type: string - - jsonPath: .metadata.creationTimestamp - name: Age - type: date - name: v1beta1 - schema: - openAPIV3Schema: - description: Bucket is the Schema for the buckets API - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: BucketSpec defines the desired state of an S3 compatible - bucket - properties: - bucketName: - description: The bucket name. - type: string - endpoint: - description: The bucket endpoint address. - type: string - ignore: - description: Ignore overrides the set of excluded patterns in the - .sourceignore format (which is the same as .gitignore). If not provided, - a default will be used, consult the documentation for your version - to find out what those are. - type: string - insecure: - description: Insecure allows connecting to a non-TLS S3 HTTP endpoint. - type: boolean - interval: - description: The interval at which to check for bucket updates. - type: string - provider: - default: generic - description: The S3 compatible storage provider name, default ('generic'). - enum: - - generic - - aws - type: string - region: - description: The bucket region. - type: string - secretRef: - description: The name of the secret containing authentication credentials - for the Bucket. - properties: - name: - description: Name of the referent - type: string - required: - - name - type: object - suspend: - description: This flag tells the controller to suspend the reconciliation - of this source. - type: boolean - timeout: - default: 20s - description: The timeout for download operations, defaults to 20s. - type: string - required: - - bucketName - - endpoint - - interval - type: object - status: - description: BucketStatus defines the observed state of a bucket - properties: - artifact: - description: Artifact represents the output of the last successful - Bucket sync. - properties: - checksum: - description: Checksum is the SHA1 checksum of the artifact. - type: string - lastUpdateTime: - description: LastUpdateTime is the timestamp corresponding to - the last update of this artifact. - format: date-time - type: string - path: - description: Path is the relative file path of this artifact. - type: string - revision: - description: Revision is a human readable identifier traceable - in the origin source system. It can be a Git commit SHA, Git - tag, a Helm index timestamp, a Helm chart version, etc. - type: string - url: - description: URL is the HTTP address of this artifact. - type: string - required: - - path - - url - type: object - conditions: - description: Conditions holds the conditions for the Bucket. - items: - description: "Condition contains details for one aspect of the current - state of this API Resource. --- This struct is intended for direct - use as an array at the field path .status.conditions. For example, - type FooStatus struct{ // Represents the observations of a - foo's current state. // Known .status.conditions.type are: - \"Available\", \"Progressing\", and \"Degraded\" // +patchMergeKey=type - \ // +patchStrategy=merge // +listType=map // +listMapKey=type - \ Conditions []metav1.Condition `json:\"conditions,omitempty\" - patchStrategy:\"merge\" patchMergeKey:\"type\" protobuf:\"bytes,1,rep,name=conditions\"` - \n // other fields }" - properties: - lastTransitionTime: - description: lastTransitionTime is the last time the condition - transitioned from one status to another. This should be when - the underlying condition changed. If that is not known, then - using the time when the API field changed is acceptable. - format: date-time - type: string - message: - description: message is a human readable message indicating - details about the transition. This may be an empty string. - maxLength: 32768 - type: string - observedGeneration: - description: observedGeneration represents the .metadata.generation - that the condition was set based upon. For instance, if .metadata.generation - is currently 12, but the .status.conditions[x].observedGeneration - is 9, the condition is out of date with respect to the current - state of the instance. - format: int64 - minimum: 0 - type: integer - reason: - description: reason contains a programmatic identifier indicating - the reason for the condition's last transition. Producers - of specific condition types may define expected values and - meanings for this field, and whether the values are considered - a guaranteed API. The value should be a CamelCase string. - This field may not be empty. - maxLength: 1024 - minLength: 1 - pattern: ^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$ - type: string - status: - description: status of the condition, one of True, False, Unknown. - enum: - - "True" - - "False" - - Unknown - type: string - type: - description: type of condition in CamelCase or in foo.example.com/CamelCase. - --- Many .condition.type values are consistent across resources - like Available, but because arbitrary conditions can be useful - (see .node.status.conditions), the ability to deconflict is - important. The regex it matches is (dns1123SubdomainFmt/)?(qualifiedNameFmt) - maxLength: 316 - pattern: ^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$ - type: string - required: - - lastTransitionTime - - message - - reason - - status - - type - type: object - type: array - lastHandledReconcileAt: - description: LastHandledReconcileAt holds the value of the most recent - reconcile request value, so a change can be detected. - type: string - observedGeneration: - description: ObservedGeneration is the last observed generation. - format: int64 - type: integer - url: - description: URL is the download link for the artifact output of the - last Bucket sync. - type: string - type: object - type: object - served: true - storage: true - subresources: - status: {} -status: - acceptedNames: - kind: "" - plural: "" - conditions: [] - storedVersions: [] ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - controller-gen.kubebuilder.io/version: v0.5.0 - creationTimestamp: null - labels: - app.kubernetes.io/instance: flux-system - app.kubernetes.io/part-of: flux - app.kubernetes.io/version: v0.15.0 - name: gitrepositories.source.toolkit.fluxcd.io -spec: - group: source.toolkit.fluxcd.io - names: - kind: GitRepository - listKind: GitRepositoryList - plural: gitrepositories - shortNames: - - gitrepo - singular: gitrepository - scope: Namespaced - versions: - - additionalPrinterColumns: - - jsonPath: .spec.url - name: URL - type: string - - jsonPath: .status.conditions[?(@.type=="Ready")].status - name: Ready - type: string - - jsonPath: .status.conditions[?(@.type=="Ready")].message - name: Status - type: string - - jsonPath: .metadata.creationTimestamp - name: Age - type: date - name: v1beta1 - schema: - openAPIV3Schema: - description: GitRepository is the Schema for the gitrepositories API - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: GitRepositorySpec defines the desired state of a Git repository. - properties: - gitImplementation: - default: go-git - description: Determines which git client library to use. Defaults - to go-git, valid values are ('go-git', 'libgit2'). - enum: - - go-git - - libgit2 - type: string - ignore: - description: Ignore overrides the set of excluded patterns in the - .sourceignore format (which is the same as .gitignore). If not provided, - a default will be used, consult the documentation for your version - to find out what those are. - type: string - include: - description: Extra git repositories to map into the repository - items: - description: GitRepositoryInclude defines a source with a from and - to path. - properties: - fromPath: - description: The path to copy contents from, defaults to the - root directory. - type: string - repository: - description: Reference to a GitRepository to include. - properties: - name: - description: Name of the referent - type: string - required: - - name - type: object - toPath: - description: The path to copy contents to, defaults to the name - of the source ref. - type: string - required: - - repository - type: object - type: array - interval: - description: The interval at which to check for repository updates. - type: string - recurseSubmodules: - description: When enabled, after the clone is created, initializes - all submodules within, using their default settings. This option - is available only when using the 'go-git' GitImplementation. - type: boolean - ref: - description: The Git reference to checkout and monitor for changes, - defaults to master branch. - properties: - branch: - default: master - description: The Git branch to checkout, defaults to master. - type: string - commit: - description: The Git commit SHA to checkout, if specified Tag - filters will be ignored. - type: string - semver: - description: The Git tag semver expression, takes precedence over - Tag. - type: string - tag: - description: The Git tag to checkout, takes precedence over Branch. - type: string - type: object - secretRef: - description: The secret name containing the Git credentials. For HTTPS - repositories the secret must contain username and password fields. - For SSH repositories the secret must contain identity, identity.pub - and known_hosts fields. - properties: - name: - description: Name of the referent - type: string - required: - - name - type: object - suspend: - description: This flag tells the controller to suspend the reconciliation - of this source. - type: boolean - timeout: - default: 20s - description: The timeout for remote Git operations like cloning, defaults - to 20s. - type: string - url: - description: The repository URL, can be a HTTP/S or SSH address. - pattern: ^(http|https|ssh):// - type: string - verify: - description: Verify OpenPGP signature for the Git commit HEAD points - to. - properties: - mode: - description: Mode describes what git object should be verified, - currently ('head'). - enum: - - head - type: string - secretRef: - description: The secret name containing the public keys of all - trusted Git authors. - properties: - name: - description: Name of the referent - type: string - required: - - name - type: object - required: - - mode - type: object - required: - - interval - - url - type: object - status: - description: GitRepositoryStatus defines the observed state of a Git repository. - properties: - artifact: - description: Artifact represents the output of the last successful - repository sync. - properties: - checksum: - description: Checksum is the SHA1 checksum of the artifact. - type: string - lastUpdateTime: - description: LastUpdateTime is the timestamp corresponding to - the last update of this artifact. - format: date-time - type: string - path: - description: Path is the relative file path of this artifact. - type: string - revision: - description: Revision is a human readable identifier traceable - in the origin source system. It can be a Git commit SHA, Git - tag, a Helm index timestamp, a Helm chart version, etc. - type: string - url: - description: URL is the HTTP address of this artifact. - type: string - required: - - path - - url - type: object - conditions: - description: Conditions holds the conditions for the GitRepository. - items: - description: "Condition contains details for one aspect of the current - state of this API Resource. --- This struct is intended for direct - use as an array at the field path .status.conditions. For example, - type FooStatus struct{ // Represents the observations of a - foo's current state. // Known .status.conditions.type are: - \"Available\", \"Progressing\", and \"Degraded\" // +patchMergeKey=type - \ // +patchStrategy=merge // +listType=map // +listMapKey=type - \ Conditions []metav1.Condition `json:\"conditions,omitempty\" - patchStrategy:\"merge\" patchMergeKey:\"type\" protobuf:\"bytes,1,rep,name=conditions\"` - \n // other fields }" - properties: - lastTransitionTime: - description: lastTransitionTime is the last time the condition - transitioned from one status to another. This should be when - the underlying condition changed. If that is not known, then - using the time when the API field changed is acceptable. - format: date-time - type: string - message: - description: message is a human readable message indicating - details about the transition. This may be an empty string. - maxLength: 32768 - type: string - observedGeneration: - description: observedGeneration represents the .metadata.generation - that the condition was set based upon. For instance, if .metadata.generation - is currently 12, but the .status.conditions[x].observedGeneration - is 9, the condition is out of date with respect to the current - state of the instance. - format: int64 - minimum: 0 - type: integer - reason: - description: reason contains a programmatic identifier indicating - the reason for the condition's last transition. Producers - of specific condition types may define expected values and - meanings for this field, and whether the values are considered - a guaranteed API. The value should be a CamelCase string. - This field may not be empty. - maxLength: 1024 - minLength: 1 - pattern: ^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$ - type: string - status: - description: status of the condition, one of True, False, Unknown. - enum: - - "True" - - "False" - - Unknown - type: string - type: - description: type of condition in CamelCase or in foo.example.com/CamelCase. - --- Many .condition.type values are consistent across resources - like Available, but because arbitrary conditions can be useful - (see .node.status.conditions), the ability to deconflict is - important. The regex it matches is (dns1123SubdomainFmt/)?(qualifiedNameFmt) - maxLength: 316 - pattern: ^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$ - type: string - required: - - lastTransitionTime - - message - - reason - - status - - type - type: object - type: array - includedArtifacts: - description: IncludedArtifacts represents the included artifacts from - the last successful repository sync. - items: - description: Artifact represents the output of a source synchronisation. - properties: - checksum: - description: Checksum is the SHA1 checksum of the artifact. - type: string - lastUpdateTime: - description: LastUpdateTime is the timestamp corresponding to - the last update of this artifact. - format: date-time - type: string - path: - description: Path is the relative file path of this artifact. - type: string - revision: - description: Revision is a human readable identifier traceable - in the origin source system. It can be a Git commit SHA, Git - tag, a Helm index timestamp, a Helm chart version, etc. - type: string - url: - description: URL is the HTTP address of this artifact. - type: string - required: - - path - - url - type: object - type: array - lastHandledReconcileAt: - description: LastHandledReconcileAt holds the value of the most recent - reconcile request value, so a change can be detected. - type: string - observedGeneration: - description: ObservedGeneration is the last observed generation. - format: int64 - type: integer - url: - description: URL is the download link for the artifact output of the - last repository sync. - type: string - type: object - type: object - served: true - storage: true - subresources: - status: {} -status: - acceptedNames: - kind: "" - plural: "" - conditions: [] - storedVersions: [] ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - controller-gen.kubebuilder.io/version: v0.5.0 - creationTimestamp: null - labels: - app.kubernetes.io/instance: flux-system - app.kubernetes.io/part-of: flux - app.kubernetes.io/version: v0.15.0 - name: helmcharts.source.toolkit.fluxcd.io -spec: - group: source.toolkit.fluxcd.io - names: - kind: HelmChart - listKind: HelmChartList - plural: helmcharts - shortNames: - - hc - singular: helmchart - scope: Namespaced - versions: - - additionalPrinterColumns: - - jsonPath: .spec.chart - name: Chart - type: string - - jsonPath: .spec.version - name: Version - type: string - - jsonPath: .spec.sourceRef.kind - name: Source Kind - type: string - - jsonPath: .spec.sourceRef.name - name: Source Name - type: string - - jsonPath: .status.conditions[?(@.type=="Ready")].status - name: Ready - type: string - - jsonPath: .status.conditions[?(@.type=="Ready")].message - name: Status - type: string - - jsonPath: .metadata.creationTimestamp - name: Age - type: date - name: v1beta1 - schema: - openAPIV3Schema: - description: HelmChart is the Schema for the helmcharts API - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: HelmChartSpec defines the desired state of a Helm chart. - properties: - chart: - description: The name or path the Helm chart is available at in the - SourceRef. - type: string - interval: - description: The interval at which to check the Source for updates. - type: string - sourceRef: - description: The reference to the Source the chart is available at. - properties: - apiVersion: - description: APIVersion of the referent. - type: string - kind: - description: Kind of the referent, valid values are ('HelmRepository', - 'GitRepository', 'Bucket'). - enum: - - HelmRepository - - GitRepository - - Bucket - type: string - name: - description: Name of the referent. - type: string - required: - - kind - - name - type: object - suspend: - description: This flag tells the controller to suspend the reconciliation - of this source. - type: boolean - valuesFile: - description: Alternative values file to use as the default chart values, - expected to be a relative path in the SourceRef. Deprecated in favor - of ValuesFiles, for backwards compatibility the file defined here - is merged before the ValuesFiles items. Ignored when omitted. - type: string - valuesFiles: - description: Alternative list of values files to use as the chart - values (values.yaml is not included by default), expected to be - a relative path in the SourceRef. Values files are merged in the - order of this list with the last file overriding the first. Ignored - when omitted. - items: - type: string - type: array - version: - default: '*' - description: The chart version semver expression, ignored for charts - from GitRepository and Bucket sources. Defaults to latest when omitted. - type: string - required: - - chart - - interval - - sourceRef - type: object - status: - description: HelmChartStatus defines the observed state of the HelmChart. - properties: - artifact: - description: Artifact represents the output of the last successful - chart sync. - properties: - checksum: - description: Checksum is the SHA1 checksum of the artifact. - type: string - lastUpdateTime: - description: LastUpdateTime is the timestamp corresponding to - the last update of this artifact. - format: date-time - type: string - path: - description: Path is the relative file path of this artifact. - type: string - revision: - description: Revision is a human readable identifier traceable - in the origin source system. It can be a Git commit SHA, Git - tag, a Helm index timestamp, a Helm chart version, etc. - type: string - url: - description: URL is the HTTP address of this artifact. - type: string - required: - - path - - url - type: object - conditions: - description: Conditions holds the conditions for the HelmChart. - items: - description: "Condition contains details for one aspect of the current - state of this API Resource. --- This struct is intended for direct - use as an array at the field path .status.conditions. For example, - type FooStatus struct{ // Represents the observations of a - foo's current state. // Known .status.conditions.type are: - \"Available\", \"Progressing\", and \"Degraded\" // +patchMergeKey=type - \ // +patchStrategy=merge // +listType=map // +listMapKey=type - \ Conditions []metav1.Condition `json:\"conditions,omitempty\" - patchStrategy:\"merge\" patchMergeKey:\"type\" protobuf:\"bytes,1,rep,name=conditions\"` - \n // other fields }" - properties: - lastTransitionTime: - description: lastTransitionTime is the last time the condition - transitioned from one status to another. This should be when - the underlying condition changed. If that is not known, then - using the time when the API field changed is acceptable. - format: date-time - type: string - message: - description: message is a human readable message indicating - details about the transition. This may be an empty string. - maxLength: 32768 - type: string - observedGeneration: - description: observedGeneration represents the .metadata.generation - that the condition was set based upon. For instance, if .metadata.generation - is currently 12, but the .status.conditions[x].observedGeneration - is 9, the condition is out of date with respect to the current - state of the instance. - format: int64 - minimum: 0 - type: integer - reason: - description: reason contains a programmatic identifier indicating - the reason for the condition's last transition. Producers - of specific condition types may define expected values and - meanings for this field, and whether the values are considered - a guaranteed API. The value should be a CamelCase string. - This field may not be empty. - maxLength: 1024 - minLength: 1 - pattern: ^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$ - type: string - status: - description: status of the condition, one of True, False, Unknown. - enum: - - "True" - - "False" - - Unknown - type: string - type: - description: type of condition in CamelCase or in foo.example.com/CamelCase. - --- Many .condition.type values are consistent across resources - like Available, but because arbitrary conditions can be useful - (see .node.status.conditions), the ability to deconflict is - important. The regex it matches is (dns1123SubdomainFmt/)?(qualifiedNameFmt) - maxLength: 316 - pattern: ^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$ - type: string - required: - - lastTransitionTime - - message - - reason - - status - - type - type: object - type: array - lastHandledReconcileAt: - description: LastHandledReconcileAt holds the value of the most recent - reconcile request value, so a change can be detected. - type: string - observedGeneration: - description: ObservedGeneration is the last observed generation. - format: int64 - type: integer - url: - description: URL is the download link for the last chart pulled. - type: string - type: object - type: object - served: true - storage: true - subresources: - status: {} -status: - acceptedNames: - kind: "" - plural: "" - conditions: [] - storedVersions: [] ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - controller-gen.kubebuilder.io/version: v0.5.0 - creationTimestamp: null - labels: - app.kubernetes.io/instance: flux-system - app.kubernetes.io/part-of: flux - app.kubernetes.io/version: v0.15.0 - name: helmreleases.helm.toolkit.fluxcd.io -spec: - group: helm.toolkit.fluxcd.io - names: - kind: HelmRelease - listKind: HelmReleaseList - plural: helmreleases - shortNames: - - hr - singular: helmrelease - scope: Namespaced - versions: - - additionalPrinterColumns: - - jsonPath: .status.conditions[?(@.type=="Ready")].status - name: Ready - type: string - - jsonPath: .status.conditions[?(@.type=="Ready")].message - name: Status - type: string - - jsonPath: .metadata.creationTimestamp - name: Age - type: date - name: v2beta1 - schema: - openAPIV3Schema: - description: HelmRelease is the Schema for the helmreleases API - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: HelmReleaseSpec defines the desired state of a Helm release. - properties: - chart: - description: Chart defines the template of the v1beta1.HelmChart that - should be created for this HelmRelease. - properties: - spec: - description: Spec holds the template for the v1beta1.HelmChartSpec - for this HelmRelease. - properties: - chart: - description: The name or path the Helm chart is available - at in the SourceRef. - type: string - interval: - description: Interval at which to check the v1beta1.Source - for updates. Defaults to 'HelmReleaseSpec.Interval'. - type: string - sourceRef: - description: The name and namespace of the v1beta1.Source - the chart is available at. - properties: - apiVersion: - description: APIVersion of the referent. - type: string - kind: - description: Kind of the referent. - enum: - - HelmRepository - - GitRepository - - Bucket - type: string - name: - description: Name of the referent. - maxLength: 253 - minLength: 1 - type: string - namespace: - description: Namespace of the referent. - maxLength: 63 - minLength: 1 - type: string - required: - - name - type: object - valuesFile: - description: Alternative values file to use as the default - chart values, expected to be a relative path in the SourceRef. - Deprecated in favor of ValuesFiles, for backwards compatibility - the file defined here is merged before the ValuesFiles items. - Ignored when omitted. - type: string - valuesFiles: - description: Alternative list of values files to use as the - chart values (values.yaml is not included by default), expected - to be a relative path in the SourceRef. Values files are - merged in the order of this list with the last file overriding - the first. Ignored when omitted. - items: - type: string - type: array - version: - default: '*' - description: Version semver expression, ignored for charts - from v1beta1.GitRepository and v1beta1.Bucket sources. Defaults - to latest when omitted. - type: string - required: - - chart - - sourceRef - type: object - required: - - spec - type: object - dependsOn: - description: DependsOn may contain a dependency.CrossNamespaceDependencyReference - slice with references to HelmRelease resources that must be ready - before this HelmRelease can be reconciled. - items: - description: CrossNamespaceDependencyReference holds the reference - to a dependency. - properties: - name: - description: Name holds the name reference of a dependency. - type: string - namespace: - description: Namespace holds the namespace reference of a dependency. - type: string - required: - - name - type: object - type: array - install: - description: Install holds the configuration for Helm install actions - for this HelmRelease. - properties: - crds: - description: "CRDs upgrade CRDs from the Helm Chart's crds directory - according to the CRD upgrade policy provided here. Valid values - are `Skip`, `Create` or `CreateReplace`. Default is `Create` - and if omitted CRDs are installed but not updated. \n Skip: - do neither install nor replace (update) any CRDs. \n Create: - new CRDs are created, existing CRDs are neither updated nor - deleted. \n CreateReplace: new CRDs are created, existing CRDs - are updated (replaced) but not deleted. \n By default, CRDs - are applied (installed) during Helm install action. With this - option users can opt-in to CRD replace existing CRDs on Helm - install actions, which is not (yet) natively supported by Helm. - https://helm.sh/docs/chart_best_practices/custom_resource_definitions." - enum: - - Skip - - Create - - CreateReplace - type: string - createNamespace: - description: CreateNamespace tells the Helm install action to - create the HelmReleaseSpec.TargetNamespace if it does not exist - yet. On uninstall, the namespace will not be garbage collected. - type: boolean - disableHooks: - description: DisableHooks prevents hooks from running during the - Helm install action. - type: boolean - disableOpenAPIValidation: - description: DisableOpenAPIValidation prevents the Helm install - action from validating rendered templates against the Kubernetes - OpenAPI Schema. - type: boolean - disableWait: - description: DisableWait disables the waiting for resources to - be ready after a Helm install has been performed. - type: boolean - disableWaitForJobs: - description: DisableWaitForJobs disables waiting for jobs to complete - after a Helm install has been performed. - type: boolean - remediation: - description: Remediation holds the remediation configuration for - when the Helm install action for the HelmRelease fails. The - default is to not perform any action. - properties: - ignoreTestFailures: - description: IgnoreTestFailures tells the controller to skip - remediation when the Helm tests are run after an install - action but fail. Defaults to 'Test.IgnoreFailures'. - type: boolean - remediateLastFailure: - description: RemediateLastFailure tells the controller to - remediate the last failure, when no retries remain. Defaults - to 'false'. - type: boolean - retries: - description: Retries is the number of retries that should - be attempted on failures before bailing. Remediation, using - an uninstall, is performed between each attempt. Defaults - to '0', a negative integer equals to unlimited retries. - type: integer - type: object - replace: - description: Replace tells the Helm install action to re-use the - 'ReleaseName', but only if that name is a deleted release which - remains in the history. - type: boolean - skipCRDs: - description: "SkipCRDs tells the Helm install action to not install - any CRDs. By default, CRDs are installed if not already present. - \n Deprecated use CRD policy (`crds`) attribute with value `Skip` - instead." - type: boolean - timeout: - description: Timeout is the time to wait for any individual Kubernetes - operation (like Jobs for hooks) during the performance of a - Helm install action. Defaults to 'HelmReleaseSpec.Timeout'. - type: string - type: object - interval: - description: Interval at which to reconcile the Helm release. - type: string - kubeConfig: - description: KubeConfig for reconciling the HelmRelease on a remote - cluster. When specified, KubeConfig takes precedence over ServiceAccountName. - properties: - secretRef: - description: SecretRef holds the name to a secret that contains - a 'value' key with the kubeconfig file as the value. It must - be in the same namespace as the HelmRelease. It is recommended - that the kubeconfig is self-contained, and the secret is regularly - updated if credentials such as a cloud-access-token expire. - Cloud specific `cmd-path` auth helpers will not function without - adding binaries and credentials to the Pod that is responsible - for reconciling the HelmRelease. - properties: - name: - description: Name of the referent - type: string - required: - - name - type: object - type: object - maxHistory: - description: MaxHistory is the number of revisions saved by Helm for - this HelmRelease. Use '0' for an unlimited number of revisions; - defaults to '10'. - type: integer - postRenderers: - description: PostRenderers holds an array of Helm PostRenderers, which - will be applied in order of their definition. - items: - description: PostRenderer contains a Helm PostRenderer specification. - properties: - kustomize: - description: Kustomization to apply as PostRenderer. - properties: - images: - description: Images is a list of (image name, new name, - new tag or digest) for changing image names, tags or digests. - This can also be achieved with a patch, but this operator - is simpler to specify. - items: - description: Image contains an image name, a new name, - a new tag or digest, which will replace the original - name and tag. - properties: - digest: - description: Digest is the value used to replace the - original image tag. If digest is present NewTag - value is ignored. - type: string - name: - description: Name is a tag-less image name. - type: string - newName: - description: NewName is the value used to replace - the original name. - type: string - newTag: - description: NewTag is the value used to replace the - original tag. - type: string - required: - - name - type: object - type: array - patchesJson6902: - description: JSON 6902 patches, defined as inline YAML objects. - items: - description: JSON6902Patch contains a JSON6902 patch and - the target the patch should be applied to. - properties: - patch: - description: Patch contains the JSON6902 patch document - with an array of operation objects. - items: - description: JSON6902 is a JSON6902 operation object. - https://tools.ietf.org/html/rfc6902#section-4 - properties: - from: - type: string - op: - enum: - - test - - remove - - add - - replace - - move - - copy - type: string - path: - type: string - value: - x-kubernetes-preserve-unknown-fields: true - required: - - op - - path - type: object - type: array - target: - description: Target points to the resources that the - patch document should be applied to. - properties: - annotationSelector: - description: AnnotationSelector is a string that - follows the label selection expression https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/#api - It matches with the resource annotations. - type: string - group: - description: Group is the API group to select - resources from. Together with Version and Kind - it is capable of unambiguously identifying and/or - selecting resources. https://github.com/kubernetes/community/blob/master/contributors/design-proposals/api-machinery/api-group.md - type: string - kind: - description: Kind of the API Group to select resources - from. Together with Group and Version it is - capable of unambiguously identifying and/or - selecting resources. https://github.com/kubernetes/community/blob/master/contributors/design-proposals/api-machinery/api-group.md - type: string - labelSelector: - description: LabelSelector is a string that follows - the label selection expression https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/#api - It matches with the resource labels. - type: string - name: - description: Name to match resources with. - type: string - namespace: - description: Namespace to select resources from. - type: string - version: - description: Version of the API Group to select - resources from. Together with Group and Kind - it is capable of unambiguously identifying and/or - selecting resources. https://github.com/kubernetes/community/blob/master/contributors/design-proposals/api-machinery/api-group.md - type: string - type: object - required: - - patch - - target - type: object - type: array - patchesStrategicMerge: - description: Strategic merge patches, defined as inline - YAML objects. - items: - x-kubernetes-preserve-unknown-fields: true - type: array - type: object - type: object - type: array - releaseName: - description: ReleaseName used for the Helm release. Defaults to a - composition of '[TargetNamespace-]Name'. - maxLength: 53 - minLength: 1 - type: string - rollback: - description: Rollback holds the configuration for Helm rollback actions - for this HelmRelease. - properties: - cleanupOnFail: - description: CleanupOnFail allows deletion of new resources created - during the Helm rollback action when it fails. - type: boolean - disableHooks: - description: DisableHooks prevents hooks from running during the - Helm rollback action. - type: boolean - disableWait: - description: DisableWait disables the waiting for resources to - be ready after a Helm rollback has been performed. - type: boolean - disableWaitForJobs: - description: DisableWaitForJobs disables waiting for jobs to complete - after a Helm rollback has been performed. - type: boolean - force: - description: Force forces resource updates through a replacement - strategy. - type: boolean - recreate: - description: Recreate performs pod restarts for the resource if - applicable. - type: boolean - timeout: - description: Timeout is the time to wait for any individual Kubernetes - operation (like Jobs for hooks) during the performance of a - Helm rollback action. Defaults to 'HelmReleaseSpec.Timeout'. - type: string - type: object - serviceAccountName: - description: The name of the Kubernetes service account to impersonate - when reconciling this HelmRelease. - type: string - storageNamespace: - description: StorageNamespace used for the Helm storage. Defaults - to the namespace of the HelmRelease. - maxLength: 63 - minLength: 1 - type: string - suspend: - description: Suspend tells the controller to suspend reconciliation - for this HelmRelease, it does not apply to already started reconciliations. - Defaults to false. - type: boolean - targetNamespace: - description: TargetNamespace to target when performing operations - for the HelmRelease. Defaults to the namespace of the HelmRelease. - maxLength: 63 - minLength: 1 - type: string - test: - description: Test holds the configuration for Helm test actions for - this HelmRelease. - properties: - enable: - description: Enable enables Helm test actions for this HelmRelease - after an Helm install or upgrade action has been performed. - type: boolean - ignoreFailures: - description: IgnoreFailures tells the controller to skip remediation - when the Helm tests are run but fail. Can be overwritten for - tests run after install or upgrade actions in 'Install.IgnoreTestFailures' - and 'Upgrade.IgnoreTestFailures'. - type: boolean - timeout: - description: Timeout is the time to wait for any individual Kubernetes - operation during the performance of a Helm test action. Defaults - to 'HelmReleaseSpec.Timeout'. - type: string - type: object - timeout: - description: Timeout is the time to wait for any individual Kubernetes - operation (like Jobs for hooks) during the performance of a Helm - action. Defaults to '5m0s'. - type: string - uninstall: - description: Uninstall holds the configuration for Helm uninstall - actions for this HelmRelease. - properties: - disableHooks: - description: DisableHooks prevents hooks from running during the - Helm rollback action. - type: boolean - keepHistory: - description: KeepHistory tells Helm to remove all associated resources - and mark the release as deleted, but retain the release history. - type: boolean - timeout: - description: Timeout is the time to wait for any individual Kubernetes - operation (like Jobs for hooks) during the performance of a - Helm uninstall action. Defaults to 'HelmReleaseSpec.Timeout'. - type: string - type: object - upgrade: - description: Upgrade holds the configuration for Helm upgrade actions - for this HelmRelease. - properties: - cleanupOnFail: - description: CleanupOnFail allows deletion of new resources created - during the Helm upgrade action when it fails. - type: boolean - crds: - description: "CRDs upgrade CRDs from the Helm Chart's crds directory - according to the CRD upgrade policy provided here. Valid values - are `Skip`, `Create` or `CreateReplace`. Default is `Skip` and - if omitted CRDs are neither installed nor upgraded. \n Skip: - do neither install nor replace (update) any CRDs. \n Create: - new CRDs are created, existing CRDs are neither updated nor - deleted. \n CreateReplace: new CRDs are created, existing CRDs - are updated (replaced) but not deleted. \n By default, CRDs - are not applied during Helm upgrade action. With this option - users can opt-in to CRD upgrade, which is not (yet) natively - supported by Helm. https://helm.sh/docs/chart_best_practices/custom_resource_definitions." - enum: - - Skip - - Create - - CreateReplace - type: string - disableHooks: - description: DisableHooks prevents hooks from running during the - Helm upgrade action. - type: boolean - disableOpenAPIValidation: - description: DisableOpenAPIValidation prevents the Helm upgrade - action from validating rendered templates against the Kubernetes - OpenAPI Schema. - type: boolean - disableWait: - description: DisableWait disables the waiting for resources to - be ready after a Helm upgrade has been performed. - type: boolean - disableWaitForJobs: - description: DisableWaitForJobs disables waiting for jobs to complete - after a Helm upgrade has been performed. - type: boolean - force: - description: Force forces resource updates through a replacement - strategy. - type: boolean - preserveValues: - description: PreserveValues will make Helm reuse the last release's - values and merge in overrides from 'Values'. Setting this flag - makes the HelmRelease non-declarative. - type: boolean - remediation: - description: Remediation holds the remediation configuration for - when the Helm upgrade action for the HelmRelease fails. The - default is to not perform any action. - properties: - ignoreTestFailures: - description: IgnoreTestFailures tells the controller to skip - remediation when the Helm tests are run after an upgrade - action but fail. Defaults to 'Test.IgnoreFailures'. - type: boolean - remediateLastFailure: - description: RemediateLastFailure tells the controller to - remediate the last failure, when no retries remain. Defaults - to 'false' unless 'Retries' is greater than 0. - type: boolean - retries: - description: Retries is the number of retries that should - be attempted on failures before bailing. Remediation, using - 'Strategy', is performed between each attempt. Defaults - to '0', a negative integer equals to unlimited retries. - type: integer - strategy: - description: Strategy to use for failure remediation. Defaults - to 'rollback'. - enum: - - rollback - - uninstall - type: string - type: object - timeout: - description: Timeout is the time to wait for any individual Kubernetes - operation (like Jobs for hooks) during the performance of a - Helm upgrade action. Defaults to 'HelmReleaseSpec.Timeout'. - type: string - type: object - values: - description: Values holds the values for this Helm release. - x-kubernetes-preserve-unknown-fields: true - valuesFrom: - description: ValuesFrom holds references to resources containing Helm - values for this HelmRelease, and information about how they should - be merged. - items: - description: ValuesReference contains a reference to a resource - containing Helm values, and optionally the key they can be found - at. - properties: - kind: - description: Kind of the values referent, valid values are ('Secret', - 'ConfigMap'). - enum: - - Secret - - ConfigMap - type: string - name: - description: Name of the values referent. Should reside in the - same namespace as the referring resource. - maxLength: 253 - minLength: 1 - type: string - optional: - description: Optional marks this ValuesReference as optional. - When set, a not found error for the values reference is ignored, - but any ValuesKey, TargetPath or transient error will still - result in a reconciliation failure. - type: boolean - targetPath: - description: TargetPath is the YAML dot notation path the value - should be merged at. When set, the ValuesKey is expected to - be a single flat value. Defaults to 'None', which results - in the values getting merged at the root. - type: string - valuesKey: - description: ValuesKey is the data key where the values.yaml - or a specific value can be found at. Defaults to 'values.yaml'. - type: string - required: - - kind - - name - type: object - type: array - required: - - chart - - interval - type: object - status: - description: HelmReleaseStatus defines the observed state of a HelmRelease. - properties: - conditions: - description: Conditions holds the conditions for the HelmRelease. - items: - description: "Condition contains details for one aspect of the current - state of this API Resource. --- This struct is intended for direct - use as an array at the field path .status.conditions. For example, - type FooStatus struct{ // Represents the observations of a - foo's current state. // Known .status.conditions.type are: - \"Available\", \"Progressing\", and \"Degraded\" // +patchMergeKey=type - \ // +patchStrategy=merge // +listType=map // +listMapKey=type - \ Conditions []metav1.Condition `json:\"conditions,omitempty\" - patchStrategy:\"merge\" patchMergeKey:\"type\" protobuf:\"bytes,1,rep,name=conditions\"` - \n // other fields }" - properties: - lastTransitionTime: - description: lastTransitionTime is the last time the condition - transitioned from one status to another. This should be when - the underlying condition changed. If that is not known, then - using the time when the API field changed is acceptable. - format: date-time - type: string - message: - description: message is a human readable message indicating - details about the transition. This may be an empty string. - maxLength: 32768 - type: string - observedGeneration: - description: observedGeneration represents the .metadata.generation - that the condition was set based upon. For instance, if .metadata.generation - is currently 12, but the .status.conditions[x].observedGeneration - is 9, the condition is out of date with respect to the current - state of the instance. - format: int64 - minimum: 0 - type: integer - reason: - description: reason contains a programmatic identifier indicating - the reason for the condition's last transition. Producers - of specific condition types may define expected values and - meanings for this field, and whether the values are considered - a guaranteed API. The value should be a CamelCase string. - This field may not be empty. - maxLength: 1024 - minLength: 1 - pattern: ^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$ - type: string - status: - description: status of the condition, one of True, False, Unknown. - enum: - - "True" - - "False" - - Unknown - type: string - type: - description: type of condition in CamelCase or in foo.example.com/CamelCase. - --- Many .condition.type values are consistent across resources - like Available, but because arbitrary conditions can be useful - (see .node.status.conditions), the ability to deconflict is - important. The regex it matches is (dns1123SubdomainFmt/)?(qualifiedNameFmt) - maxLength: 316 - pattern: ^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$ - type: string - required: - - lastTransitionTime - - message - - reason - - status - - type - type: object - type: array - failures: - description: Failures is the reconciliation failure count against - the latest desired state. It is reset after a successful reconciliation. - format: int64 - type: integer - helmChart: - description: HelmChart is the namespaced name of the HelmChart resource - created by the controller for the HelmRelease. - type: string - installFailures: - description: InstallFailures is the install failure count against - the latest desired state. It is reset after a successful reconciliation. - format: int64 - type: integer - lastAppliedRevision: - description: LastAppliedRevision is the revision of the last successfully - applied source. - type: string - lastAttemptedRevision: - description: LastAttemptedRevision is the revision of the last reconciliation - attempt. - type: string - lastAttemptedValuesChecksum: - description: LastAttemptedValuesChecksum is the SHA1 checksum of the - values of the last reconciliation attempt. - type: string - lastHandledReconcileAt: - description: LastHandledReconcileAt holds the value of the most recent - reconcile request value, so a change can be detected. - type: string - lastReleaseRevision: - description: LastReleaseRevision is the revision of the last successful - Helm release. - type: integer - observedGeneration: - description: ObservedGeneration is the last observed generation. - format: int64 - type: integer - upgradeFailures: - description: UpgradeFailures is the upgrade failure count against - the latest desired state. It is reset after a successful reconciliation. - format: int64 - type: integer - type: object - type: object - served: true - storage: true - subresources: - status: {} -status: - acceptedNames: - kind: "" - plural: "" - conditions: [] - storedVersions: [] ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - controller-gen.kubebuilder.io/version: v0.5.0 - creationTimestamp: null - labels: - app.kubernetes.io/instance: flux-system - app.kubernetes.io/part-of: flux - app.kubernetes.io/version: v0.15.0 - name: helmrepositories.source.toolkit.fluxcd.io -spec: - group: source.toolkit.fluxcd.io - names: - kind: HelmRepository - listKind: HelmRepositoryList - plural: helmrepositories - shortNames: - - helmrepo - singular: helmrepository - scope: Namespaced - versions: - - additionalPrinterColumns: - - jsonPath: .spec.url - name: URL - type: string - - jsonPath: .status.conditions[?(@.type=="Ready")].status - name: Ready - type: string - - jsonPath: .status.conditions[?(@.type=="Ready")].message - name: Status - type: string - - jsonPath: .metadata.creationTimestamp - name: Age - type: date - name: v1beta1 - schema: - openAPIV3Schema: - description: HelmRepository is the Schema for the helmrepositories API - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: HelmRepositorySpec defines the reference to a Helm repository. - properties: - interval: - description: The interval at which to check the upstream for updates. - type: string - secretRef: - description: The name of the secret containing authentication credentials - for the Helm repository. For HTTP/S basic auth the secret must contain - username and password fields. For TLS the secret must contain a - certFile and keyFile, and/or caCert fields. - properties: - name: - description: Name of the referent - type: string - required: - - name - type: object - suspend: - description: This flag tells the controller to suspend the reconciliation - of this source. - type: boolean - timeout: - default: 60s - description: The timeout of index downloading, defaults to 60s. - type: string - url: - description: The Helm repository URL, a valid URL contains at least - a protocol and host. - type: string - required: - - interval - - url - type: object - status: - description: HelmRepositoryStatus defines the observed state of the HelmRepository. - properties: - artifact: - description: Artifact represents the output of the last successful - repository sync. - properties: - checksum: - description: Checksum is the SHA1 checksum of the artifact. - type: string - lastUpdateTime: - description: LastUpdateTime is the timestamp corresponding to - the last update of this artifact. - format: date-time - type: string - path: - description: Path is the relative file path of this artifact. - type: string - revision: - description: Revision is a human readable identifier traceable - in the origin source system. It can be a Git commit SHA, Git - tag, a Helm index timestamp, a Helm chart version, etc. - type: string - url: - description: URL is the HTTP address of this artifact. - type: string - required: - - path - - url - type: object - conditions: - description: Conditions holds the conditions for the HelmRepository. - items: - description: "Condition contains details for one aspect of the current - state of this API Resource. --- This struct is intended for direct - use as an array at the field path .status.conditions. For example, - type FooStatus struct{ // Represents the observations of a - foo's current state. // Known .status.conditions.type are: - \"Available\", \"Progressing\", and \"Degraded\" // +patchMergeKey=type - \ // +patchStrategy=merge // +listType=map // +listMapKey=type - \ Conditions []metav1.Condition `json:\"conditions,omitempty\" - patchStrategy:\"merge\" patchMergeKey:\"type\" protobuf:\"bytes,1,rep,name=conditions\"` - \n // other fields }" - properties: - lastTransitionTime: - description: lastTransitionTime is the last time the condition - transitioned from one status to another. This should be when - the underlying condition changed. If that is not known, then - using the time when the API field changed is acceptable. - format: date-time - type: string - message: - description: message is a human readable message indicating - details about the transition. This may be an empty string. - maxLength: 32768 - type: string - observedGeneration: - description: observedGeneration represents the .metadata.generation - that the condition was set based upon. For instance, if .metadata.generation - is currently 12, but the .status.conditions[x].observedGeneration - is 9, the condition is out of date with respect to the current - state of the instance. - format: int64 - minimum: 0 - type: integer - reason: - description: reason contains a programmatic identifier indicating - the reason for the condition's last transition. Producers - of specific condition types may define expected values and - meanings for this field, and whether the values are considered - a guaranteed API. The value should be a CamelCase string. - This field may not be empty. - maxLength: 1024 - minLength: 1 - pattern: ^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$ - type: string - status: - description: status of the condition, one of True, False, Unknown. - enum: - - "True" - - "False" - - Unknown - type: string - type: - description: type of condition in CamelCase or in foo.example.com/CamelCase. - --- Many .condition.type values are consistent across resources - like Available, but because arbitrary conditions can be useful - (see .node.status.conditions), the ability to deconflict is - important. The regex it matches is (dns1123SubdomainFmt/)?(qualifiedNameFmt) - maxLength: 316 - pattern: ^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$ - type: string - required: - - lastTransitionTime - - message - - reason - - status - - type - type: object - type: array - lastHandledReconcileAt: - description: LastHandledReconcileAt holds the value of the most recent - reconcile request value, so a change can be detected. - type: string - observedGeneration: - description: ObservedGeneration is the last observed generation. - format: int64 - type: integer - url: - description: URL is the download link for the last index fetched. - type: string - type: object - type: object - served: true - storage: true - subresources: - status: {} -status: - acceptedNames: - kind: "" - plural: "" - conditions: [] - storedVersions: [] ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - controller-gen.kubebuilder.io/version: v0.5.0 - creationTimestamp: null - labels: - app.kubernetes.io/instance: flux-system - app.kubernetes.io/part-of: flux - app.kubernetes.io/version: v0.15.0 - name: kustomizations.kustomize.toolkit.fluxcd.io -spec: - group: kustomize.toolkit.fluxcd.io - names: - kind: Kustomization - listKind: KustomizationList - plural: kustomizations - shortNames: - - ks - singular: kustomization - scope: Namespaced - versions: - - additionalPrinterColumns: - - jsonPath: .status.conditions[?(@.type=="Ready")].status - name: Ready - type: string - - jsonPath: .status.conditions[?(@.type=="Ready")].message - name: Status - type: string - - jsonPath: .metadata.creationTimestamp - name: Age - type: date - name: v1beta1 - schema: - openAPIV3Schema: - description: Kustomization is the Schema for the kustomizations API. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: KustomizationSpec defines the desired state of a kustomization. - properties: - decryption: - description: Decrypt Kubernetes secrets before applying them on the - cluster. - properties: - provider: - description: Provider is the name of the decryption engine. - enum: - - sops - type: string - secretRef: - description: The secret name containing the private OpenPGP keys - used for decryption. - properties: - name: - description: Name of the referent - type: string - required: - - name - type: object - required: - - provider - type: object - dependsOn: - description: DependsOn may contain a dependency.CrossNamespaceDependencyReference - slice with references to Kustomization resources that must be ready - before this Kustomization can be reconciled. - items: - description: CrossNamespaceDependencyReference holds the reference - to a dependency. - properties: - name: - description: Name holds the name reference of a dependency. - type: string - namespace: - description: Namespace holds the namespace reference of a dependency. - type: string - required: - - name - type: object - type: array - force: - default: false - description: Force instructs the controller to recreate resources - when patching fails due to an immutable field change. - type: boolean - healthChecks: - description: A list of resources to be included in the health assessment. - items: - description: NamespacedObjectKindReference contains enough information - to let you locate the typed referenced object in any namespace - properties: - apiVersion: - description: API version of the referent, if not specified the - Kubernetes preferred version will be used - type: string - kind: - description: Kind of the referent - type: string - name: - description: Name of the referent - type: string - namespace: - description: Namespace of the referent, when not specified it - acts as LocalObjectReference - type: string - required: - - kind - - name - type: object - type: array - images: - description: Images is a list of (image name, new name, new tag or - digest) for changing image names, tags or digests. This can also - be achieved with a patch, but this operator is simpler to specify. - items: - description: Image contains an image name, a new name, a new tag - or digest, which will replace the original name and tag. - properties: - digest: - description: Digest is the value used to replace the original - image tag. If digest is present NewTag value is ignored. - type: string - name: - description: Name is a tag-less image name. - type: string - newName: - description: NewName is the value used to replace the original - name. - type: string - newTag: - description: NewTag is the value used to replace the original - tag. - type: string - required: - - name - type: object - type: array - interval: - description: The interval at which to reconcile the Kustomization. - type: string - kubeConfig: - description: The KubeConfig for reconciling the Kustomization on a - remote cluster. When specified, KubeConfig takes precedence over - ServiceAccountName. - properties: - secretRef: - description: SecretRef holds the name to a secret that contains - a 'value' key with the kubeconfig file as the value. It must - be in the same namespace as the Kustomization. It is recommended - that the kubeconfig is self-contained, and the secret is regularly - updated if credentials such as a cloud-access-token expire. - Cloud specific `cmd-path` auth helpers will not function without - adding binaries and credentials to the Pod that is responsible - for reconciling the Kustomization. - properties: - name: - description: Name of the referent - type: string - required: - - name - type: object - type: object - patches: - description: Patches (also called overlays), defined as inline YAML - objects. - items: - description: Patch contains either a StrategicMerge or a JSON6902 - patch, either a file or inline, and the target the patch should - be applied to. - properties: - patch: - description: Patch contains the JSON6902 patch document with - an array of operation objects. - type: string - target: - description: Target points to the resources that the patch document - should be applied to. - properties: - annotationSelector: - description: AnnotationSelector is a string that follows - the label selection expression https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/#api - It matches with the resource annotations. - type: string - group: - description: Group is the API group to select resources - from. Together with Version and Kind it is capable of - unambiguously identifying and/or selecting resources. - https://github.com/kubernetes/community/blob/master/contributors/design-proposals/api-machinery/api-group.md - type: string - kind: - description: Kind of the API Group to select resources from. - Together with Group and Version it is capable of unambiguously - identifying and/or selecting resources. https://github.com/kubernetes/community/blob/master/contributors/design-proposals/api-machinery/api-group.md - type: string - labelSelector: - description: LabelSelector is a string that follows the - label selection expression https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/#api - It matches with the resource labels. - type: string - name: - description: Name to match resources with. - type: string - namespace: - description: Namespace to select resources from. - type: string - version: - description: Version of the API Group to select resources - from. Together with Group and Kind it is capable of unambiguously - identifying and/or selecting resources. https://github.com/kubernetes/community/blob/master/contributors/design-proposals/api-machinery/api-group.md - type: string - type: object - type: object - type: array - patchesJson6902: - description: JSON 6902 patches, defined as inline YAML objects. - items: - description: JSON6902Patch contains a JSON6902 patch and the target - the patch should be applied to. - properties: - patch: - description: Patch contains the JSON6902 patch document with - an array of operation objects. - items: - description: JSON6902 is a JSON6902 operation object. https://tools.ietf.org/html/rfc6902#section-4 - properties: - from: - type: string - op: - enum: - - test - - remove - - add - - replace - - move - - copy - type: string - path: - type: string - value: - x-kubernetes-preserve-unknown-fields: true - required: - - op - - path - type: object - type: array - target: - description: Target points to the resources that the patch document - should be applied to. - properties: - annotationSelector: - description: AnnotationSelector is a string that follows - the label selection expression https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/#api - It matches with the resource annotations. - type: string - group: - description: Group is the API group to select resources - from. Together with Version and Kind it is capable of - unambiguously identifying and/or selecting resources. - https://github.com/kubernetes/community/blob/master/contributors/design-proposals/api-machinery/api-group.md - type: string - kind: - description: Kind of the API Group to select resources from. - Together with Group and Version it is capable of unambiguously - identifying and/or selecting resources. https://github.com/kubernetes/community/blob/master/contributors/design-proposals/api-machinery/api-group.md - type: string - labelSelector: - description: LabelSelector is a string that follows the - label selection expression https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/#api - It matches with the resource labels. - type: string - name: - description: Name to match resources with. - type: string - namespace: - description: Namespace to select resources from. - type: string - version: - description: Version of the API Group to select resources - from. Together with Group and Kind it is capable of unambiguously - identifying and/or selecting resources. https://github.com/kubernetes/community/blob/master/contributors/design-proposals/api-machinery/api-group.md - type: string - type: object - required: - - patch - - target - type: object - type: array - patchesStrategicMerge: - description: Strategic merge patches, defined as inline YAML objects. - items: - x-kubernetes-preserve-unknown-fields: true - type: array - path: - description: Path to the directory containing the kustomization.yaml - file, or the set of plain YAMLs a kustomization.yaml should be generated - for. Defaults to 'None', which translates to the root path of the - SourceRef. - type: string - postBuild: - description: PostBuild describes which actions to perform on the YAML - manifest generated by building the kustomize overlay. - properties: - substitute: - additionalProperties: - type: string - description: Substitute holds a map of key/value pairs. The variables - defined in your YAML manifests that match any of the keys defined - in the map will be substituted with the set value. Includes - support for bash string replacement functions e.g. ${var:=default}, - ${var:position} and ${var/substring/replacement}. - type: object - substituteFrom: - description: SubstituteFrom holds references to ConfigMaps and - Secrets containing the variables and their values to be substituted - in the YAML manifests. The ConfigMap and the Secret data keys - represent the var names and they must match the vars declared - in the manifests for the substitution to happen. - items: - description: SubstituteReference contains a reference to a resource - containing the variables name and value. - properties: - kind: - description: Kind of the values referent, valid values are - ('Secret', 'ConfigMap'). - enum: - - Secret - - ConfigMap - type: string - name: - description: Name of the values referent. Should reside - in the same namespace as the referring resource. - maxLength: 253 - minLength: 1 - type: string - required: - - kind - - name - type: object - type: array - type: object - prune: - description: Prune enables garbage collection. - type: boolean - retryInterval: - description: The interval at which to retry a previously failed reconciliation. - When not specified, the controller uses the KustomizationSpec.Interval - value to retry failures. - type: string - serviceAccountName: - description: The name of the Kubernetes service account to impersonate - when reconciling this Kustomization. - type: string - sourceRef: - description: Reference of the source where the kustomization file - is. - properties: - apiVersion: - description: API version of the referent - type: string - kind: - description: Kind of the referent - enum: - - GitRepository - - Bucket - type: string - name: - description: Name of the referent - type: string - namespace: - description: Namespace of the referent, defaults to the Kustomization - namespace - type: string - required: - - kind - - name - type: object - suspend: - description: This flag tells the controller to suspend subsequent - kustomize executions, it does not apply to already started executions. - Defaults to false. - type: boolean - targetNamespace: - description: TargetNamespace sets or overrides the namespace in the - kustomization.yaml file. - maxLength: 63 - minLength: 1 - type: string - timeout: - description: Timeout for validation, apply and health checking operations. - Defaults to 'Interval' duration. - type: string - validation: - description: Validate the Kubernetes objects before applying them - on the cluster. The validation strategy can be 'client' (local dry-run), - 'server' (APIServer dry-run) or 'none'. When 'Force' is 'true', - validation will fallback to 'client' if set to 'server' because - server-side validation is not supported in this scenario. - enum: - - none - - client - - server - type: string - required: - - interval - - prune - - sourceRef - type: object - status: - description: KustomizationStatus defines the observed state of a kustomization. - properties: - conditions: - items: - description: "Condition contains details for one aspect of the current - state of this API Resource. --- This struct is intended for direct - use as an array at the field path .status.conditions. For example, - type FooStatus struct{ // Represents the observations of a - foo's current state. // Known .status.conditions.type are: - \"Available\", \"Progressing\", and \"Degraded\" // +patchMergeKey=type - \ // +patchStrategy=merge // +listType=map // +listMapKey=type - \ Conditions []metav1.Condition `json:\"conditions,omitempty\" - patchStrategy:\"merge\" patchMergeKey:\"type\" protobuf:\"bytes,1,rep,name=conditions\"` - \n // other fields }" - properties: - lastTransitionTime: - description: lastTransitionTime is the last time the condition - transitioned from one status to another. This should be when - the underlying condition changed. If that is not known, then - using the time when the API field changed is acceptable. - format: date-time - type: string - message: - description: message is a human readable message indicating - details about the transition. This may be an empty string. - maxLength: 32768 - type: string - observedGeneration: - description: observedGeneration represents the .metadata.generation - that the condition was set based upon. For instance, if .metadata.generation - is currently 12, but the .status.conditions[x].observedGeneration - is 9, the condition is out of date with respect to the current - state of the instance. - format: int64 - minimum: 0 - type: integer - reason: - description: reason contains a programmatic identifier indicating - the reason for the condition's last transition. Producers - of specific condition types may define expected values and - meanings for this field, and whether the values are considered - a guaranteed API. The value should be a CamelCase string. - This field may not be empty. - maxLength: 1024 - minLength: 1 - pattern: ^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$ - type: string - status: - description: status of the condition, one of True, False, Unknown. - enum: - - "True" - - "False" - - Unknown - type: string - type: - description: type of condition in CamelCase or in foo.example.com/CamelCase. - --- Many .condition.type values are consistent across resources - like Available, but because arbitrary conditions can be useful - (see .node.status.conditions), the ability to deconflict is - important. The regex it matches is (dns1123SubdomainFmt/)?(qualifiedNameFmt) - maxLength: 316 - pattern: ^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$ - type: string - required: - - lastTransitionTime - - message - - reason - - status - - type - type: object - type: array - lastAppliedRevision: - description: The last successfully applied revision. The revision - format for Git sources is /. - type: string - lastAttemptedRevision: - description: LastAttemptedRevision is the revision of the last reconciliation - attempt. - type: string - lastHandledReconcileAt: - description: LastHandledReconcileAt holds the value of the most recent - reconcile request value, so a change can be detected. - type: string - observedGeneration: - description: ObservedGeneration is the last reconciled generation. - format: int64 - type: integer - snapshot: - description: The last successfully applied revision metadata. - properties: - checksum: - description: The manifests sha1 checksum. - type: string - entries: - description: A list of Kubernetes kinds grouped by namespace. - items: - description: Snapshot holds the metadata of namespaced Kubernetes - objects - properties: - kinds: - additionalProperties: - type: string - description: The list of Kubernetes kinds. - type: object - namespace: - description: The namespace of this entry. - type: string - required: - - kinds - type: object - type: array - required: - - checksum - - entries - type: object - type: object - type: object - served: true - storage: true - subresources: - status: {} -status: - acceptedNames: - kind: "" - plural: "" - conditions: [] - storedVersions: [] ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - controller-gen.kubebuilder.io/version: v0.5.0 - creationTimestamp: null - labels: - app.kubernetes.io/instance: flux-system - app.kubernetes.io/part-of: flux - app.kubernetes.io/version: v0.15.0 - name: providers.notification.toolkit.fluxcd.io -spec: - group: notification.toolkit.fluxcd.io - names: - kind: Provider - listKind: ProviderList - plural: providers - singular: provider - scope: Namespaced - versions: - - additionalPrinterColumns: - - jsonPath: .status.conditions[?(@.type=="Ready")].status - name: Ready - type: string - - jsonPath: .status.conditions[?(@.type=="Ready")].message - name: Status - type: string - - jsonPath: .metadata.creationTimestamp - name: Age - type: date - name: v1beta1 - schema: - openAPIV3Schema: - description: Provider is the Schema for the providers API - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: ProviderSpec defines the desired state of Provider - properties: - address: - description: HTTP/S webhook address of this provider - pattern: ^(http|https):// - type: string - certSecretRef: - description: CertSecretRef can be given the name of a secret containing - a PEM-encoded CA certificate (`caFile`) - properties: - name: - description: Name of the referent - type: string - required: - - name - type: object - channel: - description: Alert channel for this provider - type: string - proxy: - description: HTTP/S address of the proxy - pattern: ^(http|https):// - type: string - secretRef: - description: Secret reference containing the provider webhook URL - using "address" as data key - properties: - name: - description: Name of the referent - type: string - required: - - name - type: object - type: - description: Type of provider - enum: - - slack - - discord - - msteams - - rocket - - generic - - github - - gitlab - - bitbucket - - azuredevops - - googlechat - - webex - - sentry - - azureeventhub - type: string - username: - description: Bot username for this provider - type: string - required: - - type - type: object - status: - description: ProviderStatus defines the observed state of Provider - properties: - conditions: - items: - description: "Condition contains details for one aspect of the current - state of this API Resource. --- This struct is intended for direct - use as an array at the field path .status.conditions. For example, - type FooStatus struct{ // Represents the observations of a - foo's current state. // Known .status.conditions.type are: - \"Available\", \"Progressing\", and \"Degraded\" // +patchMergeKey=type - \ // +patchStrategy=merge // +listType=map // +listMapKey=type - \ Conditions []metav1.Condition `json:\"conditions,omitempty\" - patchStrategy:\"merge\" patchMergeKey:\"type\" protobuf:\"bytes,1,rep,name=conditions\"` - \n // other fields }" - properties: - lastTransitionTime: - description: lastTransitionTime is the last time the condition - transitioned from one status to another. This should be when - the underlying condition changed. If that is not known, then - using the time when the API field changed is acceptable. - format: date-time - type: string - message: - description: message is a human readable message indicating - details about the transition. This may be an empty string. - maxLength: 32768 - type: string - observedGeneration: - description: observedGeneration represents the .metadata.generation - that the condition was set based upon. For instance, if .metadata.generation - is currently 12, but the .status.conditions[x].observedGeneration - is 9, the condition is out of date with respect to the current - state of the instance. - format: int64 - minimum: 0 - type: integer - reason: - description: reason contains a programmatic identifier indicating - the reason for the condition's last transition. Producers - of specific condition types may define expected values and - meanings for this field, and whether the values are considered - a guaranteed API. The value should be a CamelCase string. - This field may not be empty. - maxLength: 1024 - minLength: 1 - pattern: ^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$ - type: string - status: - description: status of the condition, one of True, False, Unknown. - enum: - - "True" - - "False" - - Unknown - type: string - type: - description: type of condition in CamelCase or in foo.example.com/CamelCase. - --- Many .condition.type values are consistent across resources - like Available, but because arbitrary conditions can be useful - (see .node.status.conditions), the ability to deconflict is - important. The regex it matches is (dns1123SubdomainFmt/)?(qualifiedNameFmt) - maxLength: 316 - pattern: ^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$ - type: string - required: - - lastTransitionTime - - message - - reason - - status - - type - type: object - type: array - type: object - type: object - served: true - storage: true - subresources: - status: {} -status: - acceptedNames: - kind: "" - plural: "" - conditions: [] - storedVersions: [] ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - controller-gen.kubebuilder.io/version: v0.5.0 - creationTimestamp: null - labels: - app.kubernetes.io/instance: flux-system - app.kubernetes.io/part-of: flux - app.kubernetes.io/version: v0.15.0 - name: receivers.notification.toolkit.fluxcd.io -spec: - group: notification.toolkit.fluxcd.io - names: - kind: Receiver - listKind: ReceiverList - plural: receivers - singular: receiver - scope: Namespaced - versions: - - additionalPrinterColumns: - - jsonPath: .status.conditions[?(@.type=="Ready")].status - name: Ready - type: string - - jsonPath: .status.conditions[?(@.type=="Ready")].message - name: Status - type: string - - jsonPath: .metadata.creationTimestamp - name: Age - type: date - name: v1beta1 - schema: - openAPIV3Schema: - description: Receiver is the Schema for the receivers API - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - metadata: - type: object - spec: - description: ReceiverSpec defines the desired state of Receiver - properties: - events: - description: A list of events to handle, e.g. 'push' for GitHub or - 'Push Hook' for GitLab. - items: - type: string - type: array - resources: - description: A list of resources to be notified about changes. - items: - description: CrossNamespaceObjectReference contains enough information - to let you locate the typed referenced object at cluster level - properties: - apiVersion: - description: API version of the referent - type: string - kind: - description: Kind of the referent - enum: - - Bucket - - GitRepository - - Kustomization - - HelmRelease - - HelmChart - - HelmRepository - - ImageRepository - - ImagePolicy - - ImageUpdateAutomation - type: string - name: - description: Name of the referent - maxLength: 53 - minLength: 1 - type: string - namespace: - description: Namespace of the referent - maxLength: 53 - minLength: 1 - type: string - required: - - name - type: object - type: array - secretRef: - description: Secret reference containing the token used to validate - the payload authenticity - properties: - name: - description: Name of the referent - type: string - required: - - name - type: object - suspend: - description: This flag tells the controller to suspend subsequent - events handling. Defaults to false. - type: boolean - type: - description: Type of webhook sender, used to determine the validation - procedure and payload deserialization. - enum: - - generic - - generic-hmac - - github - - gitlab - - bitbucket - - harbor - - dockerhub - - quay - - gcr - - nexus - - acr - type: string - required: - - resources - - type - type: object - status: - description: ReceiverStatus defines the observed state of Receiver - properties: - conditions: - items: - description: "Condition contains details for one aspect of the current - state of this API Resource. --- This struct is intended for direct - use as an array at the field path .status.conditions. For example, - type FooStatus struct{ // Represents the observations of a - foo's current state. // Known .status.conditions.type are: - \"Available\", \"Progressing\", and \"Degraded\" // +patchMergeKey=type - \ // +patchStrategy=merge // +listType=map // +listMapKey=type - \ Conditions []metav1.Condition `json:\"conditions,omitempty\" - patchStrategy:\"merge\" patchMergeKey:\"type\" protobuf:\"bytes,1,rep,name=conditions\"` - \n // other fields }" - properties: - lastTransitionTime: - description: lastTransitionTime is the last time the condition - transitioned from one status to another. This should be when - the underlying condition changed. If that is not known, then - using the time when the API field changed is acceptable. - format: date-time - type: string - message: - description: message is a human readable message indicating - details about the transition. This may be an empty string. - maxLength: 32768 - type: string - observedGeneration: - description: observedGeneration represents the .metadata.generation - that the condition was set based upon. For instance, if .metadata.generation - is currently 12, but the .status.conditions[x].observedGeneration - is 9, the condition is out of date with respect to the current - state of the instance. - format: int64 - minimum: 0 - type: integer - reason: - description: reason contains a programmatic identifier indicating - the reason for the condition's last transition. Producers - of specific condition types may define expected values and - meanings for this field, and whether the values are considered - a guaranteed API. The value should be a CamelCase string. - This field may not be empty. - maxLength: 1024 - minLength: 1 - pattern: ^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$ - type: string - status: - description: status of the condition, one of True, False, Unknown. - enum: - - "True" - - "False" - - Unknown - type: string - type: - description: type of condition in CamelCase or in foo.example.com/CamelCase. - --- Many .condition.type values are consistent across resources - like Available, but because arbitrary conditions can be useful - (see .node.status.conditions), the ability to deconflict is - important. The regex it matches is (dns1123SubdomainFmt/)?(qualifiedNameFmt) - maxLength: 316 - pattern: ^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$ - type: string - required: - - lastTransitionTime - - message - - reason - - status - - type - type: object - type: array - observedGeneration: - description: ObservedGeneration is the last observed generation. - format: int64 - type: integer - url: - description: Generated webhook URL in the format of '/hook/sha256sum(token+name+namespace)'. - type: string - type: object - type: object - served: true - storage: true - subresources: - status: {} -status: - acceptedNames: - kind: "" - plural: "" - conditions: [] - storedVersions: [] ---- -apiVersion: v1 -kind: ServiceAccount -metadata: - labels: - app.kubernetes.io/instance: flux-system - app.kubernetes.io/part-of: flux - app.kubernetes.io/version: v0.15.0 - name: helm-controller - namespace: flux-system ---- -apiVersion: v1 -kind: ServiceAccount -metadata: - labels: - app.kubernetes.io/instance: flux-system - app.kubernetes.io/part-of: flux - app.kubernetes.io/version: v0.15.0 - name: kustomize-controller - namespace: flux-system ---- -apiVersion: v1 -kind: ServiceAccount -metadata: - labels: - app.kubernetes.io/instance: flux-system - app.kubernetes.io/part-of: flux - app.kubernetes.io/version: v0.15.0 - name: notification-controller - namespace: flux-system ---- -apiVersion: v1 -kind: ServiceAccount -metadata: - labels: - app.kubernetes.io/instance: flux-system - app.kubernetes.io/part-of: flux - app.kubernetes.io/version: v0.15.0 - name: source-controller - namespace: flux-system ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - labels: - app.kubernetes.io/instance: flux-system - app.kubernetes.io/part-of: flux - app.kubernetes.io/version: v0.15.0 - name: crd-controller-flux-system -rules: -- apiGroups: - - source.toolkit.fluxcd.io - resources: - - '*' - verbs: - - '*' -- apiGroups: - - kustomize.toolkit.fluxcd.io - resources: - - '*' - verbs: - - '*' -- apiGroups: - - helm.toolkit.fluxcd.io - resources: - - '*' - verbs: - - '*' -- apiGroups: - - notification.toolkit.fluxcd.io - resources: - - '*' - verbs: - - '*' -- apiGroups: - - image.toolkit.fluxcd.io - resources: - - '*' - verbs: - - '*' -- apiGroups: - - "" - resources: - - secrets - verbs: - - get - - list - - watch -- apiGroups: - - "" - resources: - - events - verbs: - - create - - patch -- apiGroups: - - "" - resources: - - configmaps - - configmaps/status - verbs: - - get - - list - - watch - - create - - update - - patch - - delete -- apiGroups: - - coordination.k8s.io - resources: - - leases - verbs: - - get - - list - - watch - - create - - update - - patch - - delete ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRoleBinding -metadata: - labels: - app.kubernetes.io/instance: flux-system - app.kubernetes.io/part-of: flux - app.kubernetes.io/version: v0.15.0 - name: cluster-reconciler-flux-system -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: cluster-admin -subjects: -- kind: ServiceAccount - name: kustomize-controller - namespace: flux-system -- kind: ServiceAccount - name: helm-controller - namespace: flux-system ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRoleBinding -metadata: - labels: - app.kubernetes.io/instance: flux-system - app.kubernetes.io/part-of: flux - app.kubernetes.io/version: v0.15.0 - name: crd-controller-flux-system -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: crd-controller-flux-system -subjects: -- kind: ServiceAccount - name: kustomize-controller - namespace: flux-system -- kind: ServiceAccount - name: helm-controller - namespace: flux-system -- kind: ServiceAccount - name: source-controller - namespace: flux-system -- kind: ServiceAccount - name: notification-controller - namespace: flux-system -- kind: ServiceAccount - name: image-reflector-controller - namespace: flux-system -- kind: ServiceAccount - name: image-automation-controller - namespace: flux-system ---- -apiVersion: v1 -kind: Service -metadata: - labels: - app.kubernetes.io/instance: flux-system - app.kubernetes.io/part-of: flux - app.kubernetes.io/version: v0.15.0 - control-plane: controller - name: notification-controller - namespace: flux-system -spec: - ports: - - name: http - port: 80 - protocol: TCP - targetPort: http - selector: - app: notification-controller - type: ClusterIP ---- -apiVersion: v1 -kind: Service -metadata: - labels: - app.kubernetes.io/instance: flux-system - app.kubernetes.io/part-of: flux - app.kubernetes.io/version: v0.15.0 - control-plane: controller - name: source-controller - namespace: flux-system -spec: - ports: - - name: http - port: 80 - protocol: TCP - targetPort: http - selector: - app: source-controller - type: ClusterIP ---- -apiVersion: v1 -kind: Service -metadata: - labels: - app.kubernetes.io/instance: flux-system - app.kubernetes.io/part-of: flux - app.kubernetes.io/version: v0.15.0 - control-plane: controller - name: webhook-receiver - namespace: flux-system -spec: - ports: - - name: http - port: 80 - protocol: TCP - targetPort: http-webhook - selector: - app: notification-controller - type: ClusterIP ---- -apiVersion: apps/v1 -kind: Deployment -metadata: - labels: - app.kubernetes.io/instance: flux-system - app.kubernetes.io/part-of: flux - app.kubernetes.io/version: v0.15.0 - control-plane: controller - name: helm-controller - namespace: flux-system -spec: - replicas: 1 - selector: - matchLabels: - app: helm-controller - template: - metadata: - annotations: - prometheus.io/port: "8080" - prometheus.io/scrape: "true" - labels: - app: helm-controller - spec: - containers: - - args: - - --events-addr=http://notification-controller/ - - --watch-all-namespaces=true - - --log-level=info - - --log-encoding=json - - --enable-leader-election - env: - - name: RUNTIME_NAMESPACE - valueFrom: - fieldRef: - fieldPath: metadata.namespace - image: ghcr.io/fluxcd/helm-controller:v0.11.0 - imagePullPolicy: IfNotPresent - livenessProbe: - httpGet: - path: /healthz - port: healthz - name: manager - ports: - - containerPort: 8080 - name: http-prom - - containerPort: 9440 - name: healthz - protocol: TCP - readinessProbe: - httpGet: - path: /readyz - port: healthz - resources: - limits: - cpu: 1000m - memory: 1Gi - requests: - cpu: 100m - memory: 64Mi - securityContext: - allowPrivilegeEscalation: false - readOnlyRootFilesystem: true - volumeMounts: - - mountPath: /tmp - name: temp - nodeSelector: - kubernetes.io/os: linux - serviceAccountName: helm-controller - terminationGracePeriodSeconds: 600 - volumes: - - emptyDir: {} - name: temp ---- -apiVersion: apps/v1 -kind: Deployment -metadata: - labels: - app.kubernetes.io/instance: flux-system - app.kubernetes.io/part-of: flux - app.kubernetes.io/version: v0.15.0 - control-plane: controller - name: kustomize-controller - namespace: flux-system -spec: - replicas: 1 - selector: - matchLabels: - app: kustomize-controller - template: - metadata: - annotations: - prometheus.io/port: "8080" - prometheus.io/scrape: "true" - labels: - app: kustomize-controller - spec: - containers: - - args: - - --events-addr=http://notification-controller/ - - --watch-all-namespaces=true - - --log-level=info - - --log-encoding=json - - --enable-leader-election - env: - - name: RUNTIME_NAMESPACE - valueFrom: - fieldRef: - fieldPath: metadata.namespace - image: ghcr.io/fluxcd/kustomize-controller:v0.13.0 - imagePullPolicy: IfNotPresent - livenessProbe: - httpGet: - path: /healthz - port: healthz - name: manager - ports: - - containerPort: 8080 - name: http-prom - - containerPort: 9440 - name: healthz - protocol: TCP - readinessProbe: - httpGet: - path: /readyz - port: healthz - resources: - limits: - cpu: 1000m - memory: 1Gi - requests: - cpu: 100m - memory: 64Mi - securityContext: - allowPrivilegeEscalation: false - readOnlyRootFilesystem: true - volumeMounts: - - mountPath: /tmp - name: temp - nodeSelector: - kubernetes.io/os: linux - securityContext: - fsGroup: 1337 - serviceAccountName: kustomize-controller - terminationGracePeriodSeconds: 60 - volumes: - - emptyDir: {} - name: temp ---- -apiVersion: apps/v1 -kind: Deployment -metadata: - labels: - app.kubernetes.io/instance: flux-system - app.kubernetes.io/part-of: flux - app.kubernetes.io/version: v0.15.0 - control-plane: controller - name: notification-controller - namespace: flux-system -spec: - replicas: 1 - selector: - matchLabels: - app: notification-controller - template: - metadata: - annotations: - prometheus.io/port: "8080" - prometheus.io/scrape: "true" - labels: - app: notification-controller - spec: - containers: - - args: - - --watch-all-namespaces=true - - --log-level=info - - --log-encoding=json - - --enable-leader-election - env: - - name: RUNTIME_NAMESPACE - valueFrom: - fieldRef: - fieldPath: metadata.namespace - image: ghcr.io/fluxcd/notification-controller:v0.15.0 - imagePullPolicy: IfNotPresent - livenessProbe: - httpGet: - path: /healthz - port: healthz - name: manager - ports: - - containerPort: 9090 - name: http - - containerPort: 9292 - name: http-webhook - - containerPort: 8080 - name: http-prom - - containerPort: 9440 - name: healthz - protocol: TCP - readinessProbe: - httpGet: - path: /readyz - port: healthz - resources: - limits: - cpu: 1000m - memory: 1Gi - requests: - cpu: 100m - memory: 64Mi - securityContext: - allowPrivilegeEscalation: false - readOnlyRootFilesystem: true - volumeMounts: - - mountPath: /tmp - name: temp - nodeSelector: - kubernetes.io/os: linux - serviceAccountName: notification-controller - terminationGracePeriodSeconds: 10 - volumes: - - emptyDir: {} - name: temp ---- -apiVersion: apps/v1 -kind: Deployment -metadata: - labels: - app.kubernetes.io/instance: flux-system - app.kubernetes.io/part-of: flux - app.kubernetes.io/version: v0.15.0 - control-plane: controller - name: source-controller - namespace: flux-system -spec: - replicas: 1 - selector: - matchLabels: - app: source-controller - strategy: - type: Recreate - template: - metadata: - annotations: - prometheus.io/port: "8080" - prometheus.io/scrape: "true" - labels: - app: source-controller - spec: - containers: - - args: - - --events-addr=http://notification-controller/ - - --watch-all-namespaces=true - - --log-level=info - - --log-encoding=json - - --enable-leader-election - - --storage-path=/data - - --storage-adv-addr=source-controller.$(RUNTIME_NAMESPACE).svc.cluster.local. - env: - - name: RUNTIME_NAMESPACE - valueFrom: - fieldRef: - fieldPath: metadata.namespace - image: ghcr.io/fluxcd/source-controller:v0.14.0 - imagePullPolicy: IfNotPresent - livenessProbe: - httpGet: - path: /healthz - port: healthz - name: manager - ports: - - containerPort: 9090 - name: http - - containerPort: 8080 - name: http-prom - - containerPort: 9440 - name: healthz - readinessProbe: - httpGet: - path: / - port: http - resources: - limits: - cpu: 1000m - memory: 1Gi - requests: - cpu: 50m - memory: 64Mi - securityContext: - allowPrivilegeEscalation: false - readOnlyRootFilesystem: true - volumeMounts: - - mountPath: /data - name: data - - mountPath: /tmp - name: tmp - nodeSelector: - kubernetes.io/os: linux - securityContext: - fsGroup: 1337 - serviceAccountName: source-controller - terminationGracePeriodSeconds: 10 - volumes: - - emptyDir: {} - name: data - - emptyDir: {} - name: tmp ---- -apiVersion: networking.k8s.io/v1 -kind: NetworkPolicy -metadata: - labels: - app.kubernetes.io/instance: flux-system - app.kubernetes.io/part-of: flux - app.kubernetes.io/version: v0.15.0 - name: allow-egress - namespace: flux-system -spec: - egress: - - {} - ingress: - - from: - - podSelector: {} - podSelector: {} - policyTypes: - - Ingress - - Egress ---- -apiVersion: networking.k8s.io/v1 -kind: NetworkPolicy -metadata: - labels: - app.kubernetes.io/instance: flux-system - app.kubernetes.io/part-of: flux - app.kubernetes.io/version: v0.15.0 - name: allow-scraping - namespace: flux-system -spec: - ingress: - - from: - - namespaceSelector: {} - ports: - - port: 8080 - protocol: TCP - podSelector: {} - policyTypes: - - Ingress ---- -apiVersion: networking.k8s.io/v1 -kind: NetworkPolicy -metadata: - labels: - app.kubernetes.io/instance: flux-system - app.kubernetes.io/part-of: flux - app.kubernetes.io/version: v0.15.0 - name: allow-webhooks - namespace: flux-system -spec: - ingress: - - from: - - namespaceSelector: {} - podSelector: - matchLabels: - app: notification-controller - policyTypes: - - Ingress ---- diff --git a/examples/big-bang/template/bigbang/vendor/bigbang/base/flux/kustomization.yaml b/examples/big-bang/template/bigbang/vendor/bigbang/base/flux/kustomization.yaml deleted file mode 100644 index 27c0b6fdde..0000000000 --- a/examples/big-bang/template/bigbang/vendor/bigbang/base/flux/kustomization.yaml +++ /dev/null @@ -1,134 +0,0 @@ -# start with a default flux deployment -resources: -- gotk-components.yaml - -# update flux components to use ironbank images -images: -- name: ghcr.io/fluxcd/helm-controller - newName: registry1.dso.mil/ironbank/fluxcd/helm-controller - newTag: v0.11.0 -- name: ghcr.io/fluxcd/kustomize-controller - newName: registry1.dso.mil/ironbank/fluxcd/kustomize-controller - newTag: v0.13.0 -- name: ghcr.io/fluxcd/notification-controller - newName: registry1.dso.mil/ironbank/fluxcd/notification-controller - newTag: v0.15.0 -- name: ghcr.io/fluxcd/source-controller - newName: registry1.dso.mil/ironbank/fluxcd/source-controller - newTag: v0.14.0 - -patches: - - target: - kind: Deployment - patch: |- - apiVersion: apps/v1 - kind: Deployment - metadata: - name: whatever - spec: - template: - metadata: - annotations: - # Required by Kubernetes node autoscaler - cluster-autoscaler.kubernetes.io/safe-to-evict: "true" - spec: - imagePullSecrets: - - name: zarf-registry - terminationGracePeriodSeconds: 60 - # Required by Pod Security Policy - securityContext: - runAsUser: 1000 - fsGroup: 1000 - containers: - - name: manager - # Required by Pod Security Policy - securityContext: - runAsUser: 1000 - runAsGroup: 1000 - privileged: false - readOnlyRootFilesystem: true - allowPrivilegeEscalation: false - runAsNonRoot: true - capabilities: - drop: - - ALL - - target: - kind: Deployment - name: helm-controller - patch: |- - apiVersion: apps/v1 - kind: Deployment - metadata: - name: helm-controller - spec: - template: - spec: - containers: - - name: manager - resources: - limits: - cpu: 500m - memory: 750Mi - requests: - cpu: 500m - memory: 750Mi - - target: - kind: Deployment - name: kustomize-controller - patch: |- - apiVersion: apps/v1 - kind: Deployment - metadata: - name: kustomize-controller - spec: - template: - spec: - containers: - - name: manager - resources: - limits: - cpu: 100m - memory: 200Mi - requests: - cpu: 100m - memory: 200Mi - - target: - kind: Deployment - name: notification-controller - patch: |- - apiVersion: apps/v1 - kind: Deployment - metadata: - name: notification-controller - spec: - template: - spec: - containers: - - name: manager - resources: - limits: - cpu: 100m - memory: 100Mi - requests: - cpu: 100m - memory: 100Mi - - target: - kind: Deployment - name: source-controller - patch: |- - apiVersion: apps/v1 - kind: Deployment - metadata: - name: source-controller - spec: - template: - spec: - containers: - - name: manager - resources: - limits: - cpu: 100m - memory: 150Mi - requests: - cpu: 100m - memory: 150Mi diff --git a/examples/big-bang/zarf.yaml b/examples/big-bang/zarf.yaml index f4dc034352..4073e96d1e 100644 --- a/examples/big-bang/zarf.yaml +++ b/examples/big-bang/zarf.yaml @@ -9,10 +9,10 @@ components: - name: flux required: true manifests: - - name: flux-config - files: - # kustomize build template/bigbang/vendor/bigbang/base/flux > manifests/flux/flux-generated.yaml - - manifests/flux/flux-generated.yaml + - name: flux-installer + # This will be built on the package create side and deployed as a regular manifest on package deploy + kustomizations: + - https://repo1.dso.mil/platform-one/big-bang/bigbang.git//base/flux?ref=1.17.0 images: # Flux images - registry1.dso.mil/ironbank/fluxcd/helm-controller:v0.11.0 diff --git a/go.mod b/go.mod index 757962d950..fd360b00f8 100644 --- a/go.mod +++ b/go.mod @@ -26,6 +26,8 @@ require ( k8s.io/apimachinery v0.22.5 k8s.io/client-go v0.22.5 k8s.io/klog/v2 v2.40.1 + sigs.k8s.io/kustomize/api v0.8.11 + sigs.k8s.io/kustomize/kyaml v0.11.0 sigs.k8s.io/yaml v1.3.0 ) diff --git a/zarf.schema.json b/zarf.schema.json index b49b8d5f02..9e755c49ff 100644 --- a/zarf.schema.json +++ b/zarf.schema.json @@ -212,8 +212,7 @@ }, "ZarfManifest": { "required": [ - "name", - "files" + "name" ], "properties": { "name": { @@ -227,6 +226,12 @@ "type": "string" }, "type": "array" + }, + "kustomizations": { + "items": { + "type": "string" + }, + "type": "array" } }, "additionalProperties": false, From 05e02ab55a931f70dd396dd8fe946c3147dbfa5c Mon Sep 17 00:00:00 2001 From: Jeff McCoy Date: Sun, 30 Jan 2022 12:49:45 -0600 Subject: [PATCH 52/88] enable namespace-wide SA secret injection to remove imagepullsecrets req --- assets/charts/gitea-values.yaml | 2 - assets/charts/pgl-values.yaml | 10 - assets/charts/registry-values.yaml | 2 - assets/charts/traefik-values.yaml | 12 - cli/internal/helm/chart.go | 157 +----------- cli/internal/helm/post-render.go | 229 ++++++++++++++++++ cli/internal/k8s/sa.go | 22 +- cli/zarf.yaml | 22 +- .../manifests/data-injection.yaml | 2 - .../values/minio-instance.yaml | 2 - .../values/minio-operator.yaml | 2 - .../postgres-operator/values/pgadmin.yaml | 6 - .../values/postgres-operator-ui.yaml | 6 - .../values/postgres-operator.yaml | 7 - .../twistlock-values.yaml | 2 - examples/single-big-bang-package/zarf.yaml | 2 - .../tiny-kafka/charts/strimzi-values.yaml | 2 - 17 files changed, 263 insertions(+), 224 deletions(-) delete mode 100644 assets/charts/traefik-values.yaml create mode 100644 cli/internal/helm/post-render.go delete mode 100644 examples/single-big-bang-package/twistlock-values.yaml diff --git a/assets/charts/gitea-values.yaml b/assets/charts/gitea-values.yaml index 7fcd4c526c..3d3f5cce0c 100644 --- a/assets/charts/gitea-values.yaml +++ b/assets/charts/gitea-values.yaml @@ -1,7 +1,5 @@ persistence: storageClass: "###ZARF_STORAGE_CLASS###" -imagePullSecrets: - - name: "zarf-registry" gitea: admin: username: "zarf-git-user" diff --git a/assets/charts/pgl-values.yaml b/assets/charts/pgl-values.yaml index 97023f6a62..cc71eb10db 100644 --- a/assets/charts/pgl-values.yaml +++ b/assets/charts/pgl-values.yaml @@ -1,22 +1,12 @@ -loki: - image: - pullSecrets: - - "zarf-registry" grafana: enabled: true adminUser: "zarf-admin" adminPassword: "###ZARF_LOGGING_AUTH###" - image: - pullSecrets: - - "zarf-registry" grafana.ini: server: root_url: "%(protocol)s://%(domain)s/monitor" serve_from_sub_path: true promtail: - image: - pullSecrets: - - "zarf-registry" extraScrapeConfigs: - job_name: journal journal: diff --git a/assets/charts/registry-values.yaml b/assets/charts/registry-values.yaml index d3982e3bf5..b67252a0c5 100644 --- a/assets/charts/registry-values.yaml +++ b/assets/charts/registry-values.yaml @@ -3,8 +3,6 @@ persistence: storageClass: "###ZARF_STORAGE_CLASS###" image: repository: "###ZARF_REGISTRY###/library/registry" -imagePullSecrets: - - name: zarf-registry secrets: htpasswd: "###ZARF_HTPASSWD###" # https://github.com/containerd/containerd/blob/v1.5.8/pkg/cri/server/image_pull.go#L412 diff --git a/assets/charts/traefik-values.yaml b/assets/charts/traefik-values.yaml deleted file mode 100644 index 5f5dab8e6d..0000000000 --- a/assets/charts/traefik-values.yaml +++ /dev/null @@ -1,12 +0,0 @@ -ports: - websecure: - tls: - enabled: true -providers: - kubernetesIngress: - publishedService: - enabled: true -priorityClassName: "system-cluster-critical" -deployment: - imagePullSecrets: - - name: zarf-registry diff --git a/cli/internal/helm/chart.go b/cli/internal/helm/chart.go index 131d2fb0f2..982dc3962a 100644 --- a/cli/internal/helm/chart.go +++ b/cli/internal/helm/chart.go @@ -1,21 +1,16 @@ package helm import ( - "bytes" "fmt" "io/ioutil" - "os" "time" - "github.com/defenseunicorns/zarf/cli/config" "github.com/defenseunicorns/zarf/cli/types" - corev1 "k8s.io/api/core/v1" - "k8s.io/apimachinery/pkg/runtime" - "github.com/defenseunicorns/zarf/cli/internal/k8s" "github.com/defenseunicorns/zarf/cli/internal/message" - "github.com/defenseunicorns/zarf/cli/internal/utils" "helm.sh/helm/v3/pkg/action" + corev1 "k8s.io/api/core/v1" + "helm.sh/helm/v3/pkg/chart" "helm.sh/helm/v3/pkg/release" "helm.sh/helm/v3/pkg/storage/driver" @@ -32,25 +27,23 @@ type ChartOptions struct { Images []string } -type renderer struct { - options ChartOptions - namespaces map[string]*corev1.Namespace - connectStrings ConnectStrings -} - // InstallOrUpgradeChart performs a helm install of the given chart func InstallOrUpgradeChart(options ChartOptions) ConnectStrings { + fromMessage := options.Chart.Url + if fromMessage == "" { + fromMessage = "Zarf-generated helm chart" + } spinner := message.NewProgressSpinner("Processing helm chart %s:%s from %s", options.Chart.Name, options.Chart.Version, - options.Chart.Url) + fromMessage) defer spinner.Stop() var output *release.Release options.ReleaseName = fmt.Sprintf("zarf-%s", options.Chart.Name) actionConfig, err := createActionConfig(options.Chart.Namespace) - postRender := NewRenderer(options) + postRender := NewRenderer(options, actionConfig) // Setup K8s connection if err != nil { @@ -181,7 +174,7 @@ func GenerateChart(basePath string, manifest types.ZarfManifest, images []string if manifest.DefaultNamespace == "" { // Helm gets sad when you don't provide a namespace even though we aren't using helm templating - manifest.DefaultNamespace = "zarf" + manifest.DefaultNamespace = corev1.NamespaceDefault } // Generate the struct to pass to InstallOrUpgradeChart() @@ -308,135 +301,3 @@ func loadChartData(options ChartOptions) (*chart.Chart, map[string]interface{}, return loadedChart, chartValues, nil } - -func NewRenderer(options ChartOptions) *renderer { - message.Debugf("helm.NewRenderer(%v)", options) - return &renderer{ - options: options, - namespaces: make(map[string]*corev1.Namespace), - connectStrings: make(ConnectStrings), - } -} - -func (r *renderer) Run(renderedManifests *bytes.Buffer) (*bytes.Buffer, error) { - message.Debugf("helm.Run(renderedManifests *bytes.Buffer)") - // This is very low cost and consistent for how we replace elsewhere, also good for debugging - tempDir, _ := utils.MakeTempDir() - path := tempDir + "/chart.yaml" - - if err := utils.WriteFile(path, renderedManifests.Bytes()); err != nil { - return nil, fmt.Errorf("unable to write the post-render file for the helm chart") - } - - // Run the template engine against the chart output - k8s.ProcessYamlFilesInPath(tempDir, r.options.Images) - - // Read back the final file contents - buff, err := os.ReadFile(path) - if err != nil { - return nil, fmt.Errorf("error reading temporary post-rendered helm chart: %w", err) - } - - message.Debug(string(buff)) - - // Try to parse the yaml into unstructured data - resources, err := k8s.SplitYAML(buff) - if err != nil { - // On error only drop a warning - message.Errorf(err, "Problem parsing post-render manifest data") - } else { - // Otherwise, loop over the resources, - for _, resource := range resources { - - switch resource.GetKind() { - case "Namespace": - var namespace corev1.Namespace - // parse the namespace resource so it can be applied out-of-band by zarf instead of helm to avoid helm ns shennanigans - if err := runtime.DefaultUnstructuredConverter.FromUnstructured(resource.UnstructuredContent(), &namespace); err != nil { - message.Errorf(err, "could not parse namespace %s", resource.GetName()) - } else { - message.Debugf("Matched helm namespace %s for zarf annotation", &namespace.Name) - // add the adoption reqs for this namespace, https://github.com/helm/helm/pull/7649 - if namespace.Labels == nil { - // Ensure map exists to avoid nil panic - namespace.Labels = make(map[string]string) - } - namespace.Labels["app.kubernetes.io/managed-by"] = "Helm" - if namespace.Annotations == nil { - // Ensure map exists to avoid nil panic - namespace.Annotations = make(map[string]string) - } - namespace.Annotations["meta.helm.sh/release-name"] = r.options.ReleaseName - namespace.Annotations["meta.helm.sh/release-namespace"] = r.options.Chart.Namespace - - // Add it to the stack - r.namespaces[namespace.Name] = &namespace - } - // skip so we can strip namespaces from helms brain - continue - - case "Service": - // Check service resources for the zarf-connect label - labels := resource.GetLabels() - annotations := resource.GetAnnotations() - - if key, keyExists := labels[config.ZarfConnectLabelName]; keyExists { - // If there is a zarf-connect label - if description, descExists := annotations[config.ZarfConnectAnnotationDescription]; descExists { - message.Debugf("Match helm service %s for zarf connection %s", resource.GetName(), key) - // and a description set the label and description - r.connectStrings[key] = description - } else { - // Otherwise, just set the label - r.connectStrings[key] = "" - } - } - } - - namespace := resource.GetNamespace() - if _, exists := r.namespaces[namespace]; !exists && namespace != "" { - // if this is the first time seeing this ns, we need to track that to create it as well - r.namespaces[namespace] = nil - } - } - } - - secretName := "zarf-registry" - existingNamespaces, _ := k8s.GetNamespaces() - - for name, namespace := range r.namespaces { - - // Check to see if this namespace already exists - var existingNamespace bool - for _, serverNamespace := range existingNamespaces.Items { - if serverNamespace.Name == name { - existingNamespace = true - } - } - - if !existingNamespace { - // This is a new namespace, add it - if _, err := k8s.CreateNamespace(name, namespace); err != nil { - return nil, fmt.Errorf("unable to create the missing namespace %s", name) - } - } - - // Try to get an existing secret - if secret, _ := k8s.GetSecret(name, secretName); secret.Name == secretName { - // Don't add a secret if it already was created by another chart - continue - } else { - // Create the secret as a k8s object - secret = k8s.GenerateRegistryPullCreds(name, secretName) - if err := k8s.CreateSecret(secret); err != nil { - message.Errorf(err, "Problem creating registry secret for the %s namespace", name) - } - } - } - - // Cleanup the temp file - _ = os.RemoveAll(tempDir) - - // Send the bytes back to helm - return bytes.NewBuffer(buff), nil -} diff --git a/cli/internal/helm/post-render.go b/cli/internal/helm/post-render.go new file mode 100644 index 0000000000..dc3712a07f --- /dev/null +++ b/cli/internal/helm/post-render.go @@ -0,0 +1,229 @@ +package helm + +import ( + "bytes" + "fmt" + "os" + + "github.com/defenseunicorns/zarf/cli/config" + "github.com/defenseunicorns/zarf/cli/internal/k8s" + "github.com/defenseunicorns/zarf/cli/internal/message" + "github.com/defenseunicorns/zarf/cli/internal/utils" + "helm.sh/helm/v3/pkg/action" + "helm.sh/helm/v3/pkg/releaseutil" + corev1 "k8s.io/api/core/v1" + "sigs.k8s.io/yaml" + + "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" + "k8s.io/apimachinery/pkg/runtime" +) + +const secretName = "zarf-registry" +const managedByLabel = "app.kubernetes.io/managed-by" + +type renderer struct { + actionConfig *action.Configuration + connectStrings ConnectStrings + options ChartOptions + namespaces map[string]*corev1.Namespace +} + +func NewRenderer(options ChartOptions, actionConfig *action.Configuration) *renderer { + message.Debugf("helm.NewRenderer(%v)", options) + return &renderer{ + actionConfig: actionConfig, + connectStrings: make(ConnectStrings), + options: options, + namespaces: map[string]*corev1.Namespace{ + // Add the passed-in namespace to the list + options.Chart.Namespace: nil, + }, + } +} + +func (r *renderer) Run(renderedManifests *bytes.Buffer) (*bytes.Buffer, error) { + message.Debugf("helm.Run(renderedManifests *bytes.Buffer)") + // This is very low cost and consistent for how we replace elsewhere, also good for debugging + tempDir, _ := utils.MakeTempDir() + path := tempDir + "/chart.yaml" + + // Write the context to a file for processing + if err := utils.WriteFile(path, renderedManifests.Bytes()); err != nil { + return nil, fmt.Errorf("unable to write the post-render file for the helm chart") + } + + // Run the template engine against the chart output + k8s.ProcessYamlFilesInPath(tempDir, r.options.Images) + + // Read back the templated file contents + buff, err := os.ReadFile(path) + if err != nil { + return nil, fmt.Errorf("error reading temporary post-rendered helm chart: %w", err) + } + + // Use helm to resplit the manifest byte (same call used by helm to pass this data to postRender) + _, resources, err := releaseutil.SortManifests(map[string]string{path: string(buff)}, + r.actionConfig.Capabilities.APIVersions, + releaseutil.InstallOrder, + ) + + if err != nil { + return nil, fmt.Errorf("error re-rendering helm output: %w", err) + } + + // Dump the contents for debugging + message.Debug(resources) + + finalManifestsOutput := bytes.NewBuffer(nil) + + if err != nil { + // On error only drop a warning + message.Errorf(err, "Problem parsing post-render manifest data") + } else { + // Otherwise, loop over the resources, + for _, resource := range resources { + + // parse to unstructured to have access to more data than just the name + rawData := &unstructured.Unstructured{} + if err := yaml.Unmarshal([]byte(resource.Content), rawData); err != nil { + return nil, fmt.Errorf("failed to unmarshal manifest: %v", err) + } + + switch rawData.GetKind() { + case "Namespace": + var namespace corev1.Namespace + // parse the namespace resource so it can be applied out-of-band by zarf instead of helm to avoid helm ns shennanigans + if err := runtime.DefaultUnstructuredConverter.FromUnstructured(rawData.UnstructuredContent(), &namespace); err != nil { + message.Errorf(err, "could not parse namespace %s", rawData.GetName()) + } else { + message.Debugf("Matched helm namespace %s for zarf annotation", &namespace.Name) + if namespace.Labels == nil { + // Ensure label map exists to avoid nil panic + namespace.Labels = make(map[string]string) + } + // Now track this namespace by zarf + namespace.Labels[managedByLabel] = "zarf" + namespace.Labels["zarf-helm-release"] = r.options.ReleaseName + + // Add it to the stack + r.namespaces[namespace.Name] = &namespace + } + // skip so we can strip namespaces from helms brain + continue + + case "ServiceAccount": + var svcAccount corev1.ServiceAccount + if err := runtime.DefaultUnstructuredConverter.FromUnstructured(rawData.UnstructuredContent(), &svcAccount); err != nil { + message.Errorf(err, "could not parse service account %s", rawData.GetName()) + } else { + message.Debugf("Matched helm svc account %s for zarf annotation", &svcAccount.Name) + + // Add the zarf image pull secret to the sa + svcAccount.ImagePullSecrets = append(svcAccount.ImagePullSecrets, corev1.LocalObjectReference{ + Name: secretName, + }) + + if byteData, err := yaml.Marshal(svcAccount); err != nil { + message.Error(err, "unable to marshal svc account") + } else { + // Update the contents of the svc account + resource.Content = string(byteData) + } + } + + case "Service": + // Check service resources for the zarf-connect label + labels := rawData.GetLabels() + annotations := rawData.GetAnnotations() + + if key, keyExists := labels[config.ZarfConnectLabelName]; keyExists { + // If there is a zarf-connect label + if description, descExists := annotations[config.ZarfConnectAnnotationDescription]; descExists { + message.Debugf("Match helm service %s for zarf connection %s", rawData.GetName(), key) + // and a description set the label and description + r.connectStrings[key] = description + } else { + // Otherwise, just set the label + r.connectStrings[key] = "" + } + } + } + + namespace := rawData.GetNamespace() + if _, exists := r.namespaces[namespace]; !exists && namespace != "" { + // if this is the first time seeing this ns, we need to track that to create it as well + r.namespaces[namespace] = nil + } + + // Finally place this back onto the output buffer + fmt.Fprintf(finalManifestsOutput, "---\n# Source: %s\n%s\n", resource.Name, resource.Content) + } + } + + existingNamespaces, _ := k8s.GetNamespaces() + + for name, namespace := range r.namespaces { + + // Check to see if this namespace already exists + var existingNamespace bool + for _, serverNamespace := range existingNamespaces.Items { + if serverNamespace.Name == name { + existingNamespace = true + } + } + + if !existingNamespace { + // This is a new namespace, add it + if _, err := k8s.CreateNamespace(name, namespace); err != nil { + return nil, fmt.Errorf("unable to create the missing namespace %s", name) + } + } + + // Try to get an existing secret + if secret, _ := k8s.GetSecret(name, secretName); secret.Name != secretName { + // create the missing zarf secret + secret = k8s.GenerateRegistryPullCreds(name, secretName) + if err := k8s.CreateSecret(secret); err != nil { + message.Errorf(err, "Problem creating registry secret for the %s namespace", name) + } + } + + // Keep the default SAs up-to-date so they will use the zarf-registry pull secret for the namespace + if defaultSvcAccount, err := k8s.GetServiceAccount(name, corev1.NamespaceDefault); err != nil { + return nil, fmt.Errorf("unable to get service acocunts for namespace %s", name) + } else { + // Look to see if the service account is already patched + if defaultSvcAccount.Labels[managedByLabel] != "zarf" { + updateSvcAccount(defaultSvcAccount) + } + } + } + + // Cleanup the temp file + _ = os.RemoveAll(tempDir) + + // Send the bytes back to helm + return finalManifestsOutput, nil +} + +func updateSvcAccount(svcAccount *corev1.ServiceAccount) error { + // This service acocunt needs the pull secret added + svcAccount.ImagePullSecrets = append(svcAccount.ImagePullSecrets, corev1.LocalObjectReference{ + Name: secretName, + }) + + if svcAccount.Labels == nil { + // Ensure label map exists to avoid nil panic + svcAccount.Labels = make(map[string]string) + } + + // Track this by zarf + svcAccount.Labels[managedByLabel] = "zarf" + + // Finally update the chnage on the server + if _, err := k8s.SaveServiceAccount(svcAccount); err != nil { + return fmt.Errorf("unable to update the default service account for the %s namespace: %w", svcAccount.Namespace, err) + } + + return nil +} diff --git a/cli/internal/k8s/sa.go b/cli/internal/k8s/sa.go index 6d804285dd..9325b06867 100644 --- a/cli/internal/k8s/sa.go +++ b/cli/internal/k8s/sa.go @@ -7,9 +7,27 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" ) -func GetServiceAccounts() (*corev1.ServiceAccountList, error) { +func GetAllServiceAccounts() (*corev1.ServiceAccountList, error) { + return GetServiceAccounts(corev1.NamespaceAll) +} + +func GetServiceAccounts(namespace string) (*corev1.ServiceAccountList, error) { clientset := getClientset() metaOptions := metav1.ListOptions{} - return clientset.CoreV1().ServiceAccounts(corev1.NamespaceAll).List(context.TODO(), metaOptions) + return clientset.CoreV1().ServiceAccounts(namespace).List(context.TODO(), metaOptions) +} + +func GetServiceAccount(namespace string, name string) (*corev1.ServiceAccount, error) { + clientset := getClientset() + + metaOptions := metav1.GetOptions{} + return clientset.CoreV1().ServiceAccounts(namespace).Get(context.TODO(), name, metaOptions) +} + +func SaveServiceAccount(svcAccount *corev1.ServiceAccount) (*corev1.ServiceAccount, error) { + clientset := getClientset() + + metaOptions := metav1.UpdateOptions{} + return clientset.CoreV1().ServiceAccounts(svcAccount.Namespace).Update(context.TODO(), svcAccount, metaOptions) } diff --git a/cli/zarf.yaml b/cli/zarf.yaml index 22f5c0c42d..1a7ef42834 100644 --- a/cli/zarf.yaml +++ b/cli/zarf.yaml @@ -7,22 +7,10 @@ metadata: components: - name: baseline required: true - charts: - - name: docker-registry - url: https://helm.twun.io - version: 1.10.1 - namespace: registry - - name: gatekeeper - url: https://repo1.dso.mil/platform-one/big-bang/apps/core/policy.git - version: 3.5.1-bb.10 - gitPath: chart - namespace: gatekeeper manifests: - - name: test-manifests - files: - - ../assets/manifests/regsitry/configmap.yaml - - ../assets/manifests/traefik/traefik-tls.yaml + - name: podinfo + # This will be built on the package create side and deployed as a regular manifest on package deploy + kustomizations: + - github.com/stefanprodan/podinfo//kustomize images: - - registry1.dso.mil/ironbank/kiwigrid/k8s-sidecar:1.3.0 - repos: - - https://repo1.dso.mil/platform-one/big-bang/apps/core/cluster-auditor.git@0.3.0-bb.2 + - ghcr.io/stefanprodan/podinfo:6.0.3 \ No newline at end of file diff --git a/examples/data-injection/manifests/data-injection.yaml b/examples/data-injection/manifests/data-injection.yaml index 17527d3209..19fd501e95 100644 --- a/examples/data-injection/manifests/data-injection.yaml +++ b/examples/data-injection/manifests/data-injection.yaml @@ -22,5 +22,3 @@ spec: limits: memory: "128Mi" cpu: "500m" - imagePullSecrets: - - name: zarf-registry diff --git a/examples/postgres-operator/values/minio-instance.yaml b/examples/postgres-operator/values/minio-instance.yaml index 06e4c6c176..b638e4f7ee 100644 --- a/examples/postgres-operator/values/minio-instance.yaml +++ b/examples/postgres-operator/values/minio-instance.yaml @@ -1,7 +1,5 @@ hostname: minio.localhost tenants: - imagePullSecret: - name: zarf-registry pools: ## Servers specifies the number of MinIO Tenant Pods / Servers in this pool. ## For standalone mode, supply 1. For distributed mode, supply 4 or more. diff --git a/examples/postgres-operator/values/minio-operator.yaml b/examples/postgres-operator/values/minio-operator.yaml index 73b306d852..0765f2dd27 100644 --- a/examples/postgres-operator/values/minio-operator.yaml +++ b/examples/postgres-operator/values/minio-operator.yaml @@ -1,5 +1,3 @@ -imagePullSecrets: - - name: zarf-registry operator: image: repository: registry1.dso.mil/ironbank/opensource/minio/operator diff --git a/examples/postgres-operator/values/pgadmin.yaml b/examples/postgres-operator/values/pgadmin.yaml index 0d4f7e47c7..659b95df99 100644 --- a/examples/postgres-operator/values/pgadmin.yaml +++ b/examples/postgres-operator/values/pgadmin.yaml @@ -1,9 +1,3 @@ -# image: - # registry: registry1.dso.mil - # repository: ?? - # tag: ?? -imagePullSecrets: - - name: zarf-registry serviceAccount: create: true persistentVolume: diff --git a/examples/postgres-operator/values/postgres-operator-ui.yaml b/examples/postgres-operator/values/postgres-operator-ui.yaml index 67e94c0974..847b9c3b22 100644 --- a/examples/postgres-operator/values/postgres-operator-ui.yaml +++ b/examples/postgres-operator/values/postgres-operator-ui.yaml @@ -1,9 +1,3 @@ -# image: - # registry: registry1.dso.mil - # repository: ?? - # tag: ?? -imagePullSecrets: - - name: zarf-registry resources: requests: cpu: "100m" diff --git a/examples/postgres-operator/values/postgres-operator.yaml b/examples/postgres-operator/values/postgres-operator.yaml index 1bc27ff202..56c893e1a6 100644 --- a/examples/postgres-operator/values/postgres-operator.yaml +++ b/examples/postgres-operator/values/postgres-operator.yaml @@ -1,12 +1,5 @@ -# image: - # Eventually we'll need this to come from Iron Bank - # registry: registry1.dso.mil - # repository: ?? - # tag: ?? # configGeneral: # docker_image: registry1.dso.mil/.../spilo-13:2.1-p1 -imagePullSecrets: - - name: zarf-registry configPostgresPodResources: default_cpu_request: "100m" default_memory_request: "100Mi" diff --git a/examples/single-big-bang-package/twistlock-values.yaml b/examples/single-big-bang-package/twistlock-values.yaml deleted file mode 100644 index 1c394c5ed1..0000000000 --- a/examples/single-big-bang-package/twistlock-values.yaml +++ /dev/null @@ -1,2 +0,0 @@ -imagePullSecrets: - - name: zarf-registry \ No newline at end of file diff --git a/examples/single-big-bang-package/zarf.yaml b/examples/single-big-bang-package/zarf.yaml index 15a10d8841..1399265c60 100644 --- a/examples/single-big-bang-package/zarf.yaml +++ b/examples/single-big-bang-package/zarf.yaml @@ -18,8 +18,6 @@ components: version: 0.0.6-bb.1 namespace: twistlock gitPath: chart - valuesFiles: - - twistlock-values.yaml # https://umbrella-bigbang-releases.s3-us-gov-west-1.amazonaws.com/umbrella/1.14.0/images.txt images: - registry1.dso.mil/ironbank/twistlock/defender/defender:20.12.531 diff --git a/examples/tiny-kafka/charts/strimzi-values.yaml b/examples/tiny-kafka/charts/strimzi-values.yaml index 3416edb04a..ee5b1ed724 100644 --- a/examples/tiny-kafka/charts/strimzi-values.yaml +++ b/examples/tiny-kafka/charts/strimzi-values.yaml @@ -1,5 +1,3 @@ -image: - imagePullSecrets: zarf-registry imageRegistryOverride: registry1.dso.mil imageRepositoryOverride: ironbank/opensource/strimzi watchNamespaces: From 893204e4f165cd1adc87447e8f67770c0cbdee59 Mon Sep 17 00:00:00 2001 From: Jeff McCoy Date: Sun, 30 Jan 2022 13:24:07 -0600 Subject: [PATCH 53/88] add "zarf.dev/connect-url" annotation for url suffixes on zarf connect --- cli/config/config.go | 1 + cli/internal/helm/chart.go | 6 +++++- cli/internal/helm/post-render.go | 13 ++++++------- cli/internal/k8s/services.go | 18 +++++++++++++++++- cli/internal/k8s/tunnel.go | 10 +++++++--- cli/internal/packager/deploy.go | 4 ++-- 6 files changed, 38 insertions(+), 14 deletions(-) diff --git a/cli/config/config.go b/cli/config/config.go index 38ca5d2815..763067c4f1 100644 --- a/cli/config/config.go +++ b/cli/config/config.go @@ -37,6 +37,7 @@ const ( ZarfConnectLabelName = "zarf.dev/connect-name" ZarfConnectAnnotationDescription = "zarf.dev/connect-description" + ZarfConnectAnnotationUrl = "zarf.dev/connect-url" ) var ( diff --git a/cli/internal/helm/chart.go b/cli/internal/helm/chart.go index 982dc3962a..2091e22278 100644 --- a/cli/internal/helm/chart.go +++ b/cli/internal/helm/chart.go @@ -16,7 +16,11 @@ import ( "helm.sh/helm/v3/pkg/storage/driver" ) -type ConnectStrings map[string]string +type ConnectString struct { + Description string + Url string +} +type ConnectStrings map[string]ConnectString type ChartOptions struct { BasePath string Chart types.ZarfChart diff --git a/cli/internal/helm/post-render.go b/cli/internal/helm/post-render.go index dc3712a07f..dc300a51cc 100644 --- a/cli/internal/helm/post-render.go +++ b/cli/internal/helm/post-render.go @@ -138,13 +138,12 @@ func (r *renderer) Run(renderedManifests *bytes.Buffer) (*bytes.Buffer, error) { if key, keyExists := labels[config.ZarfConnectLabelName]; keyExists { // If there is a zarf-connect label - if description, descExists := annotations[config.ZarfConnectAnnotationDescription]; descExists { - message.Debugf("Match helm service %s for zarf connection %s", rawData.GetName(), key) - // and a description set the label and description - r.connectStrings[key] = description - } else { - // Otherwise, just set the label - r.connectStrings[key] = "" + message.Debugf("Match helm service %s for zarf connection %s", rawData.GetName(), key) + + // Add the connectstring for processing later in the deployment + r.connectStrings[key] = ConnectString{ + Description: annotations[config.ZarfConnectAnnotationDescription], + Url: annotations[config.ZarfConnectAnnotationUrl], } } } diff --git a/cli/internal/k8s/services.go b/cli/internal/k8s/services.go index 9eda2fbc36..a98e9ff42a 100644 --- a/cli/internal/k8s/services.go +++ b/cli/internal/k8s/services.go @@ -15,7 +15,23 @@ func GetService(namespace string, serviceName string) (*corev1.Service, error) { return clientset.CoreV1().Services(namespace).Get(context.Background(), serviceName, metav1.GetOptions{}) } -// GetServicesByLabelExists returns a list of matched services given a set of labels. TO search all namespaces, pass "" in the namespace arg +// GetServicesByLabel returns a list of matched services given a label and value. To search all namespaces, pass "" in the namespace arg +func GetServicesByLabel(namespace string, label string, value string) (*corev1.ServiceList, error) { + message.Debugf("k8s.GetServicesByLabel(%s, %s)", namespace, label) + clientset := getClientset() + + // Creat the selector and add the requirement + labelSelector, _ := metav1.LabelSelectorAsSelector(&metav1.LabelSelector{ + MatchLabels: map[string]string{ + label: value, + }, + }) + + // Run the query with the selector and return as a ServiceList + return clientset.CoreV1().Services(namespace).List(context.TODO(), metav1.ListOptions{LabelSelector: labelSelector.String()}) +} + +// GetServicesByLabelExists returns a list of matched services given a label. To search all namespaces, pass "" in the namespace arg func GetServicesByLabelExists(namespace string, label string) (*corev1.ServiceList, error) { message.Debugf("k8s.GetServicesByLabelExists(%s, %s)", namespace, label) clientset := getClientset() diff --git a/cli/internal/k8s/tunnel.go b/cli/internal/k8s/tunnel.go index 743261129c..2c3ff60d39 100644 --- a/cli/internal/k8s/tunnel.go +++ b/cli/internal/k8s/tunnel.go @@ -59,6 +59,7 @@ type Tunnel struct { namespace string resourceType string resourceName string + urlSuffix string stopChan chan struct{} readyChan chan struct{} } @@ -159,7 +160,7 @@ func (tunnel *Tunnel) Close() { func (tunnel *Tunnel) checkForZarfConnectLabel(name string) error { message.Debugf("tunnel.checkForZarfConnectLabel(%s)", name) - matches, err := GetServicesByLabelExists("", config.ZarfConnectLabelName) + matches, err := GetServicesByLabel("", config.ZarfConnectLabelName, name) if err != nil { return fmt.Errorf("unable to lookup the service: %w", err) } @@ -175,7 +176,10 @@ func (tunnel *Tunnel) checkForZarfConnectLabel(name string) error { // Only support a service with a single port tunnel.remotePort = svc.Spec.Ports[0].TargetPort.IntValue() - message.Debugf("tunnel connection match: %s/%s on port %i", svc.Namespace, svc.Name, tunnel.remotePort) + // Add the url suffix too + tunnel.urlSuffix = svc.Annotations[config.ZarfConnectAnnotationUrl] + + message.Debugf("tunnel connection match: %s/%s on port %d", svc.Namespace, svc.Name, tunnel.remotePort) } return nil @@ -261,7 +265,7 @@ func (tunnel *Tunnel) Establish() (string, error) { spinner.Stop() return "", fmt.Errorf("unable to start the tunnel: %w", err) case <-portforwarder.Ready: - url := fmt.Sprintf("http://%s:%v", config.IPV4Localhost, tunnel.localPort) + url := fmt.Sprintf("http://%s:%v%s", config.IPV4Localhost, tunnel.localPort, tunnel.urlSuffix) spinner.Successf("Creating port forwarding tunnel available at %s", url) return url, nil } diff --git a/cli/internal/packager/deploy.go b/cli/internal/packager/deploy.go index 3301b2e14a..fb6a43277c 100644 --- a/cli/internal/packager/deploy.go +++ b/cli/internal/packager/deploy.go @@ -111,9 +111,9 @@ func Deploy() { if len(connectStrings) > 0 { list := pterm.TableData{{" Connect Command", "Description"}} // Loop over each connecStrings and convert to pterm.TableData - for name, description := range connectStrings { + for name, connect := range connectStrings { name = fmt.Sprintf(" zarf connect %s", name) - list = append(list, []string{name, description}) + list = append(list, []string{name, connect.Description}) } // Create the table output with the data From 94d3f4cc4301812a8a52af513df4760e96eab29e Mon Sep 17 00:00:00 2001 From: Jeff McCoy Date: Sun, 30 Jan 2022 13:25:25 -0600 Subject: [PATCH 54/88] test multi-service zarf connect matching with url suffix --- examples/game/image/Dockerfile | 32 ++++-- examples/game/image/index.html | 128 ++++++++++++++++++++---- examples/game/manifests/deployment.yaml | 7 +- examples/game/manifests/ingress.yaml | 1 - examples/game/manifests/service.yaml | 24 ++++- examples/game/zarf.yaml | 8 +- 6 files changed, 159 insertions(+), 41 deletions(-) diff --git a/examples/game/image/Dockerfile b/examples/game/image/Dockerfile index 551c95b8c8..f7ae42d224 100644 --- a/examples/game/image/Dockerfile +++ b/examples/game/image/Dockerfile @@ -1,21 +1,31 @@ FROM alpine:latest -ARG GAME_URL -ARG GAME_ARGS +WORKDIR /binary +RUN apk add gcc musl-dev && \ + wget -O darkhttpd.c https://raw.githubusercontent.com/emikulic/darkhttpd/master/darkhttpd.c && \ + cc -static -Os -o darkhttpd darkhttpd.c WORKDIR /site RUN wget https://js-dos.com/6.22/current/js-dos.js && \ wget https://js-dos.com/6.22/current/wdosbox.js && \ - wget https://js-dos.com/6.22/current/wdosbox.wasm.js && \ - wget -O game.zip "$GAME_URL" + wget https://js-dos.com/6.22/current/wdosbox.wasm.js -COPY index.html . -RUN sed -i s/GAME_ARGS/$GAME_ARGS/ index.html +RUN wget -O aladdin.zip "https://web.archive.org/web/20190303222445if_/https://www.dosgames.com/files/DOSBOX_ALADDIN.ZIP" +RUN wget -O doom.zip "https://archive.org/download/DoomsharewareEpisode/doom.ZIP" +RUN wget -O mario-brothers.zip "https://image.dosgamesarchive.com/games/mario-bro.zip" +RUN wget -O prince-of-persia.zip "https://web.archive.org/web/20181030180256if_/http://image.dosgamesarchive.com/games/pop1.zip" +RUN wget -O quake.zip "https://web.archive.org/web/20190303223506if_/https://www.dosgames.com/files/DOSBOX_QUAKE.ZIP" +RUN wget -O warcraft-ii.zip "https://web.archive.org/web/20190303222732if_/https://www.dosgames.com/files/DOSBOX_WAR2.ZIP" -WORKDIR /binary -RUN apk add gcc musl-dev && \ - wget -O darkhttpd.c https://raw.githubusercontent.com/emikulic/darkhttpd/master/darkhttpd.c && \ - cc -static -Os -o darkhttpd darkhttpd.c +RUN wget -O aladdin.png "https://image.dosgamesarchive.com/screenshots/aladdem-4.png" && \ + wget -O doom.png "https://image.dosgamesarchive.com/screenshots/doom01.png" && \ + wget -O mario-brothers.png "https://image.dosgamesarchive.com/screenshots/marionl-6.png" && \ + wget -O prince-of-persia.png "https://image.dosgamesarchive.com/screenshots/prince102.png" && \ + wget -O quake.png "https://image.dosgamesarchive.com/screenshots/quake13.png" && \ + wget -O warcraft-ii.png "https://image.dosgamesarchive.com/screenshots/war2demo3.png" + + +COPY index.html . FROM scratch COPY --from=0 /site /site @@ -24,4 +34,4 @@ COPY --from=0 /binary /binary WORKDIR /site ENTRYPOINT ["/binary/darkhttpd", "/site", "--port", "8000"] -# docker buildx build --push --platform linux/arm/v7,linux/arm64/v8,linux/amd64 --tag defenseunicorns/zarf-game:doom --build-arg GAME_URL=https://archive.org/download/DoomsharewareEpisode/doom.ZIP --build-arg GAME_ARGS=\"DOOM.EXE\" . +# docker buildx build --push --platform linux/arm/v7,linux/arm64/v8,linux/amd64 --tag defenseunicorns/zarf-game:multi-tile . diff --git a/examples/game/image/index.html b/examples/game/image/index.html index 4040696d61..45731e9ee4 100644 --- a/examples/game/image/index.html +++ b/examples/game/image/index.html @@ -1,23 +1,115 @@ - + + + Zarf needs games too + + + - - Zarf needs games too - - - - - - - + } + + + +
+
+ + +
+
+ + +
+
+ + +
+
\ No newline at end of file diff --git a/examples/game/manifests/deployment.yaml b/examples/game/manifests/deployment.yaml index fca6100f17..5c2038636b 100644 --- a/examples/game/manifests/deployment.yaml +++ b/examples/game/manifests/deployment.yaml @@ -2,7 +2,6 @@ apiVersion: apps/v1 kind: Deployment metadata: name: game - namespace: default spec: selector: matchLabels: @@ -13,8 +12,8 @@ spec: app: game spec: containers: - - name: game - image: "defenseunicorns/zarf-game:doom" + - name: multi-game + image: "defenseunicorns/zarf-game:multi-tile-dark" ports: - name: http containerPort: 8000 @@ -26,5 +25,3 @@ spec: limits: memory: "128Mi" cpu: "500m" - imagePullSecrets: - - name: zarf-registry diff --git a/examples/game/manifests/ingress.yaml b/examples/game/manifests/ingress.yaml index a1187be99c..21a7832350 100644 --- a/examples/game/manifests/ingress.yaml +++ b/examples/game/manifests/ingress.yaml @@ -2,7 +2,6 @@ apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: demo-ingress - namespace: default spec: rules: - http: diff --git a/examples/game/manifests/service.yaml b/examples/game/manifests/service.yaml index 86c487539c..5e830d4a81 100644 --- a/examples/game/manifests/service.yaml +++ b/examples/game/manifests/service.yaml @@ -1,10 +1,11 @@ +--- apiVersion: v1 kind: Service metadata: - name: game - namespace: default + name: doom annotations: zarf.dev/connect-description: "Play doom!!!" + zarf.dev/connect-url: "?doom" labels: # Enables "zarf connect doom" zarf.dev/connect-name: doom @@ -16,3 +17,22 @@ spec: port: 8000 protocol: TCP targetPort: 8000 +--- +apiVersion: v1 +kind: Service +metadata: + name: game + annotations: + zarf.dev/connect-description: "Play some old dos games 🦄" + labels: + # Enables "zarf connect games" + zarf.dev/connect-name: games +spec: + selector: + app: game + ports: + - name: http + port: 8000 + protocol: TCP + targetPort: 8000 + diff --git a/examples/game/zarf.yaml b/examples/game/zarf.yaml index 652319a554..1709d39e55 100644 --- a/examples/game/zarf.yaml +++ b/examples/game/zarf.yaml @@ -1,16 +1,16 @@ kind: ZarfPackageConfig metadata: - name: appliance-demo-doom - description: "Demo Zarf appliance mode with doom game" + name: appliance-demo-multi-games + description: "Demo Zarf appliance mode with some dos games" components: - name: baseline required: true manifests: - - name: doom + - name: multi-games files: - manifests/ingress.yaml - manifests/deployment.yaml - manifests/service.yaml images: - - defenseunicorns/zarf-game:doom + - defenseunicorns/zarf-game:multi-tile-dark From 590b56b4197b5973bdeefc5c6ead97a6ddf550e6 Mon Sep 17 00:00:00 2001 From: Jeff McCoy Date: Sun, 30 Jan 2022 17:15:05 -0600 Subject: [PATCH 55/88] update component flags in test to reflect k3s not being a default component --- docs/asciinema/scenarios/examples-game-logging.exp | 4 ++-- .../asciinema/scenarios/examples-game-scripted.exp | 2 +- docs/components.md | 1 - examples/big-bang/README.md | 14 +++++++------- examples/postgres-operator/README.md | 12 ++++++------ test/e2e/e2e_data_injection_test.go | 2 +- test/e2e/e2e_example_game_test.go | 2 +- test/e2e/e2e_general_cli_test.go | 2 +- test/e2e/e2e_git_based_helm_chart_test.go | 2 +- test/e2e/e2e_gitea_and_grafana_test.go | 2 +- 10 files changed, 21 insertions(+), 22 deletions(-) diff --git a/docs/asciinema/scenarios/examples-game-logging.exp b/docs/asciinema/scenarios/examples-game-logging.exp index c01b13f334..4ca64f97fd 100755 --- a/docs/asciinema/scenarios/examples-game-logging.exp +++ b/docs/asciinema/scenarios/examples-game-logging.exp @@ -94,7 +94,7 @@ setup # prep cluster spawn bash --norc -send -h "zarf init --host=127.0.0.1 --components=management --confirm\r" +send -h "zarf init --host=127.0.0.1 --components=k3s --confirm\r" expect -timeout 120 -re {.*Grafana Username[^=]*=([^\s]*)} set grafana_user $expect_out(1,string) expect -re {.*Password \(all\)[^=]*="([^"]*)"} @@ -128,7 +128,7 @@ comment "game running?" do "kubectl get pod -l app=game"; wait_input comment "install logging component" -send -h "zarf init --host=127.0.0.1 --components=logging --confirm\r\r" +send -h "zarf init --host=127.0.0.1 --components=k3s,logging --confirm\r\r" wait_input 120 comment "PLG stack up?" diff --git a/docs/asciinema/scenarios/examples-game-scripted.exp b/docs/asciinema/scenarios/examples-game-scripted.exp index 189f31abe8..08651068ae 100755 --- a/docs/asciinema/scenarios/examples-game-scripted.exp +++ b/docs/asciinema/scenarios/examples-game-scripted.exp @@ -99,7 +99,7 @@ do "which zarf" comment "create cluster" send -h "zarf init \\\n" send -h " --host=127.0.0.1 \\\n" -send -h " --components=management \\\n" +send -h " --components=k3s \\\n" send -h " --confirm" sleep 1 ; send "\n\n" ; wait_input 120 diff --git a/docs/components.md b/docs/components.md index 519a1d5a94..363feaa736 100644 --- a/docs/components.md +++ b/docs/components.md @@ -31,7 +31,6 @@ These optional components are listed below along with the "magic strings" you pa |--components |Description| |--- |---| -|management |Installs tools for managing the Zarf cluster from the local host, including: [k9s](https://k9scli.io/).| |logging |Adds a log monitoring stack—[promtail / loki / graphana (a.k.a. PLG)](https://github.com/grafana/loki)—into the cluster.| |gitops-service |Adds a [GitOps](https://www.cloudbees.com/gitops/what-is-gitops)-compatible source control service—[Gitea](https://gitea.io/en-us/)—into the cluster.| diff --git a/examples/big-bang/README.md b/examples/big-bang/README.md index 0d5397372a..cd7e48035f 100644 --- a/examples/big-bang/README.md +++ b/examples/big-bang/README.md @@ -16,13 +16,13 @@ Because the same cluster will be running both Traefik and Istio, Istio's Virtual 1. Run one of these two commands: - `make all` - Download the latest version of Zarf, build the deploy package, and start a VM with Vagrant - `make all-dev` - Build Zarf locally, build the deploy package, and start a VM with Vagrant -1. Run: `./zarf init --confirm --components management,gitops-service --host 127.0.0.1` - Initialize Zarf, telling it to install the management component and gitops service and skip logging component (since BB has logging already) and tells Zarf to use `localhost` as the domain. If you want to use interactive mode instead just run `./zarf init`. -1. Wait a bit, run `k9s` to see pods come up. Don't move on until everything is running -1. Run: `./zarf package deploy zarf-package-big-bang-core-demo.tar.zst --components kubescape --confirm` - Deploy Big Bang Core. If you want interactive mode instead just run `./zarf package deploy`, it will give you a picker to choose the package. -1. Wait several minutes. Run `k9s` to watch progress -1. :warning: `kubectl delete -n istio-system envoyfilter/misdirected-request` (due to [this bug](https://repo1.dso.mil/platform-one/big-bang/bigbang/-/issues/802)) -1. Use a browser to visit the various services, available at https://*.bigbang.dev:9443 -1. When you're done, run `exit` to leave the VM then `make vm-destroy` to bring everything down +2. Run: `./zarf init --confirm --components k3s,gitops-service` - Initialize Zarf, telling it to install the management component and gitops service and skip logging component (since BB has logging already) and tells Zarf to use `localhost` as the domain. If you want to use interactive mode instead just run `./zarf init`. +3. Wait a bit, run `k9s` to see pods come up. Don't move on until everything is running +4. Run: `./zarf package deploy zarf-package-big-bang-core-demo.tar.zst --components kubescape --confirm` - Deploy Big Bang Core. If you want interactive mode instead just run `./zarf package deploy`, it will give you a picker to choose the package. +5. Wait several minutes. Run `k9s` to watch progress +6. :warning: `kubectl delete -n istio-system envoyfilter/misdirected-request` (due to [this bug](https://repo1.dso.mil/platform-one/big-bang/bigbang/-/issues/802)) +7. Use a browser to visit the various services, available at https://*.bigbang.dev:9443 +8. When you're done, run `exit` to leave the VM then `make vm-destroy` to bring everything down ## Kubescape scan diff --git a/examples/postgres-operator/README.md b/examples/postgres-operator/README.md index 1ce58a767c..a22eae5f37 100644 --- a/examples/postgres-operator/README.md +++ b/examples/postgres-operator/README.md @@ -18,12 +18,12 @@ After looking at several alternatives, Zalando's postgres operator felt like the 1. Run one of these two commands: - `make all` - Download the latest version of Zarf, build the deploy package, and start a VM with Vagrant - `make all-dev` - Build Zarf locally, build the deploy package, and start a VM with Vagrant -1. Run: `./zarf init --confirm --components management --host 127.0.0.1` - Initialize Zarf, telling it to install just the management component, and tells Zarf to use `127.0.0.1` as the hostname. If you want to use interactive mode instead just run `./zarf init`. -1. Wait a bit, run `k9s` to see pods come up. Don't move on until everything is running -1. Run: `./zarf package deploy zarf-package-postgres-operator-demo.tar.zst --confirm` - Deploy the package. If you want interactive mode instead just run `./zarf package deploy`, it will give you a picker to choose the package. -1. Wait a couple of minutes. Run `k9s` to watch progress -1. The Postgres Operator UI will be available at [https://postgres-operator-ui.localhost:8443](https://postgres-operator-ui.localhost:8443) and PGAdmin will be available at [https://pgadmin.localhost:8443](https://pgadmin.localhost:8443). -1. Set up a server in PGAdmin: +2. Run: `./zarf init --confirm --components k3s` - Initialize Zarf, telling it to install just the management component, and tells Zarf to use `127.0.0.1` as the hostname. If you want to use interactive mode instead just run `./zarf init`. +3. Wait a bit, run `k9s` to see pods come up. Don't move on until everything is running +4. Run: `./zarf package deploy zarf-package-postgres-operator-demo.tar.zst --confirm` - Deploy the package. If you want interactive mode instead just run `./zarf package deploy`, it will give you a picker to choose the package. +5. Wait a couple of minutes. Run `k9s` to watch progress +6. The Postgres Operator UI will be available at [https://postgres-operator-ui.localhost:8443](https://postgres-operator-ui.localhost:8443) and PGAdmin will be available at [https://pgadmin.localhost:8443](https://pgadmin.localhost:8443). +7. Set up a server in PGAdmin: - General // Name: `acid-zarf-test` - General // Server group: `Servers` - Connection // Host: (the URL in the table below) diff --git a/test/e2e/e2e_data_injection_test.go b/test/e2e/e2e_data_injection_test.go index 5dadfd2470..e7f06b2e1e 100644 --- a/test/e2e/e2e_data_injection_test.go +++ b/test/e2e/e2e_data_injection_test.go @@ -60,7 +60,7 @@ func runDataInjectionTest(t *testing.T, terraformOptions *terraform.Options, key } // run `zarf init` - output, err := ssh.CheckSshCommandE(t, publicHost, fmt.Sprintf("sudo bash -c 'cd /home/%s/build && ./zarf init --confirm --components management --host 127.0.0.1'", username)) + output, err := ssh.CheckSshCommandE(t, publicHost, fmt.Sprintf("sudo bash -c 'cd /home/%s/build && ./zarf init --confirm --components k3s'", username)) require.NoError(t, err, output) // Wait until the Docker registry is ready diff --git a/test/e2e/e2e_example_game_test.go b/test/e2e/e2e_example_game_test.go index b475493b47..b3744ff9b7 100644 --- a/test/e2e/e2e_example_game_test.go +++ b/test/e2e/e2e_example_game_test.go @@ -67,7 +67,7 @@ func testGameExample(t *testing.T, terraformOptions *terraform.Options, keyPair require.NoError(t, err, output) // run `zarf init` - output, err = ssh.CheckSshCommandE(t, publicHost, fmt.Sprintf("sudo bash -c 'cd /home/%s/build && ./zarf init --confirm --components k3s --host 127.0.0.1'", username)) + output, err = ssh.CheckSshCommandE(t, publicHost, fmt.Sprintf("sudo bash -c 'cd /home/%s/build && ./zarf init --confirm --components k3s'", username)) require.NoError(t, err, output) // Deploy the game diff --git a/test/e2e/e2e_general_cli_test.go b/test/e2e/e2e_general_cli_test.go index e33ab583bd..575d731ccf 100644 --- a/test/e2e/e2e_general_cli_test.go +++ b/test/e2e/e2e_general_cli_test.go @@ -82,7 +82,7 @@ func testGeneralCliStuff(t *testing.T, terraformOptions *terraform.Options, keyP assert.NotEqual(t, string(output), "UnknownVersion", "Zarf version should not be the default value") // Test for expected failure when given a bad component input - output, err = ssh.CheckSshCommandE(t, publicHost, fmt.Sprintf("cd /home/%s/build && ./zarf init --confirm --host 127.0.0.1 --components management,foo,logging", username)) + output, err = ssh.CheckSshCommandE(t, publicHost, fmt.Sprintf("cd /home/%s/build && ./zarf init --confirm --components k3s,foo,logging", username)) require.Error(t, err, output) // Test for expected failure when given invalid hostnames diff --git a/test/e2e/e2e_git_based_helm_chart_test.go b/test/e2e/e2e_git_based_helm_chart_test.go index bc5f92abc2..f5e0e04d6e 100644 --- a/test/e2e/e2e_git_based_helm_chart_test.go +++ b/test/e2e/e2e_git_based_helm_chart_test.go @@ -60,7 +60,7 @@ func runGitBasedCliTest(t *testing.T, terraformOptions *terraform.Options, keyPa } // run `zarf init` - output, err := ssh.CheckSshCommandE(t, publicHost, fmt.Sprintf("sudo bash -c 'cd /home/%s/build && ./zarf init --confirm --components management --host 127.0.0.1'", username)) + output, err := ssh.CheckSshCommandE(t, publicHost, fmt.Sprintf("sudo bash -c 'cd /home/%s/build && ./zarf init --confirm --components k3s'", username)) require.NoError(t, err, output) // Wait until the Docker registry is ready diff --git a/test/e2e/e2e_gitea_and_grafana_test.go b/test/e2e/e2e_gitea_and_grafana_test.go index 4c2040cb03..5aa12171a7 100644 --- a/test/e2e/e2e_gitea_and_grafana_test.go +++ b/test/e2e/e2e_gitea_and_grafana_test.go @@ -62,7 +62,7 @@ func testGiteaAndGrafana(t *testing.T, terraformOptions *terraform.Options, keyP } // run `zarf init` - output, err := ssh.CheckSshCommandE(t, publicHost, fmt.Sprintf("sudo bash -c 'cd /home/%s/build && ./zarf init --confirm --components k3s,logging,gitops-service --host 127.0.0.1'", username)) + output, err := ssh.CheckSshCommandE(t, publicHost, fmt.Sprintf("sudo bash -c 'cd /home/%s/build && ./zarf init --confirm --components k3s,logging,gitops-service'", username)) require.NoError(t, err, output) // Establish the port-forward into the gitea service; give the service a few seconds to come up since this is not a command we can retry From 526684e47b6e795f68d4aeb9c5ac2b1091ed6640 Mon Sep 17 00:00:00 2001 From: Jeff McCoy Date: Sun, 30 Jan 2022 21:55:02 -0600 Subject: [PATCH 56/88] add safer delay for k3s install --- cli/internal/helm/post-render.go | 2 +- cli/internal/k8s/namespace.go | 2 +- zarf.yaml | 2 ++ 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/cli/internal/helm/post-render.go b/cli/internal/helm/post-render.go index dc300a51cc..0d0402fde6 100644 --- a/cli/internal/helm/post-render.go +++ b/cli/internal/helm/post-render.go @@ -189,7 +189,7 @@ func (r *renderer) Run(renderedManifests *bytes.Buffer) (*bytes.Buffer, error) { // Keep the default SAs up-to-date so they will use the zarf-registry pull secret for the namespace if defaultSvcAccount, err := k8s.GetServiceAccount(name, corev1.NamespaceDefault); err != nil { - return nil, fmt.Errorf("unable to get service acocunts for namespace %s", name) + return nil, fmt.Errorf("unable to get service accounts for namespace %s", name) } else { // Look to see if the service account is already patched if defaultSvcAccount.Labels[managedByLabel] != "zarf" { diff --git a/cli/internal/k8s/namespace.go b/cli/internal/k8s/namespace.go index 50f9c145a0..ff63a656ca 100644 --- a/cli/internal/k8s/namespace.go +++ b/cli/internal/k8s/namespace.go @@ -38,7 +38,7 @@ func CreateNamespace(name string, namespace *corev1.Namespace) (*corev1.Namespac }, }, } - } + } metaOptions := metav1.GetOptions{} createOptions := metav1.CreateOptions{} diff --git a/zarf.yaml b/zarf.yaml index 7cf158d29c..a215e42067 100644 --- a/zarf.yaml +++ b/zarf.yaml @@ -26,6 +26,8 @@ components: - "systemctl enable --now k3s" # Wait for the K3s node to come up - "/usr/local/bin/kubectl get nodes" + # Make sure things are really ready in k8s + - "/usr/local/bin/kubectl wait --for=condition=available deployment/coredns -n kube-system" files: # Include the actual K3s binary - source: https://github.com/k3s-io/k3s/releases/download/v1.21.6+k3s1/k3s From b9bddf2e458dac6de171eb1014363d24f6e01f55 Mon Sep 17 00:00:00 2001 From: Jeff McCoy Date: Sun, 30 Jan 2022 22:27:30 -0600 Subject: [PATCH 57/88] update zarf game e2e test package name --- test/e2e/e2e_example_game_test.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/e2e/e2e_example_game_test.go b/test/e2e/e2e_example_game_test.go index b3744ff9b7..4eabd18341 100644 --- a/test/e2e/e2e_example_game_test.go +++ b/test/e2e/e2e_example_game_test.go @@ -38,7 +38,7 @@ func TestE2eExampleGame(t *testing.T) { syncFileToRemoteServer(t, terraformOptions, keyPair, username, "../../build/zarf", fmt.Sprintf("/home/%s/build/zarf", username), "0700") syncFileToRemoteServer(t, terraformOptions, keyPair, username, "../../build/zarf-init.tar.zst", fmt.Sprintf("/home/%s/build/zarf-init.tar.zst", username), "0600") - syncFileToRemoteServer(t, terraformOptions, keyPair, username, "../../build/zarf-package-appliance-demo-doom.tar.zst", fmt.Sprintf("/home/%s/build/zarf-package-appliance-demo-doom.tar.zst", username), "0600") + syncFileToRemoteServer(t, terraformOptions, keyPair, username, "../../build/zarf-package-appliance-demo-multi-games.tar.zst", fmt.Sprintf("/home/%s/build/zarf-package-appliance-demo-multi-games.tar.zst", username), "0600") }) teststructure.RunTestStage(t, "TEST", func() { @@ -71,7 +71,7 @@ func testGameExample(t *testing.T, terraformOptions *terraform.Options, keyPair require.NoError(t, err, output) // Deploy the game - output, err = ssh.CheckSshCommandE(t, publicHost, fmt.Sprintf("sudo bash -c 'cd /home/%s/build && ./zarf package deploy zarf-package-appliance-demo-doom.tar.zst --confirm'", username)) + output, err = ssh.CheckSshCommandE(t, publicHost, fmt.Sprintf("sudo bash -c 'cd /home/%s/build && ./zarf package deploy zarf-package-appliance-demo-multi-games.tar.zst --confirm'", username)) require.NoError(t, err, output) // Establish the port-forward into the game service; give the service a few seconds to come up since this is not a command we can retry From 6ae00d3c3b761a560ece42e2dc011eac2b4a9f8c Mon Sep 17 00:00:00 2001 From: Jeff McCoy Date: Mon, 31 Jan 2022 08:01:37 +0000 Subject: [PATCH 58/88] fix panic on registry catalog --- cli/cmd/tools.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/cli/cmd/tools.go b/cli/cmd/tools.go index 556b3a894a..b924bec71d 100644 --- a/cli/cmd/tools.go +++ b/cli/cmd/tools.go @@ -104,6 +104,9 @@ func init() { archiverCmd.AddCommand(archiverCompressCmd) archiverCmd.AddCommand(archiverDecompressCmd) + // Ensure the arch is set to avoid crane nil pointer + config.SetAcrch() + cranePlatformOptions := []crane.Option{config.ActiveCranePlatform} registryCmd.AddCommand(craneCmd.NewCmdAuthLogin()) registryCmd.AddCommand(craneCmd.NewCmdPull(&cranePlatformOptions)) From ddad9831bd573af823fd340949cad053f49f1e5c Mon Sep 17 00:00:00 2001 From: Jeff McCoy Date: Mon, 31 Jan 2022 08:02:02 +0000 Subject: [PATCH 59/88] cleanup postgres operator example --- .../postgres-operator/manifests/patch-svc-accounts.yaml | 6 ++++++ .../postgres-operator/manifests/postgres-operator.yaml | 9 --------- examples/postgres-operator/values/minio-instance.yaml | 2 +- examples/postgres-operator/values/minio-operator.yaml | 4 ++++ examples/postgres-operator/zarf.yaml | 8 ++------ 5 files changed, 13 insertions(+), 16 deletions(-) create mode 100644 examples/postgres-operator/manifests/patch-svc-accounts.yaml diff --git a/examples/postgres-operator/manifests/patch-svc-accounts.yaml b/examples/postgres-operator/manifests/patch-svc-accounts.yaml new file mode 100644 index 0000000000..06cb13de91 --- /dev/null +++ b/examples/postgres-operator/manifests/patch-svc-accounts.yaml @@ -0,0 +1,6 @@ +# This will make zarf aware of this SA to do the imagepullsecret patching for it +apiVersion: v1 +kind: ServiceAccount +metadata: + name: postgres-pod + namespace: postgres-operator \ No newline at end of file diff --git a/examples/postgres-operator/manifests/postgres-operator.yaml b/examples/postgres-operator/manifests/postgres-operator.yaml index 63da455657..85a873a39b 100644 --- a/examples/postgres-operator/manifests/postgres-operator.yaml +++ b/examples/postgres-operator/manifests/postgres-operator.yaml @@ -1,4 +1,3 @@ - # repository: ?? apiVersion: v1 kind: ConfigMap metadata: @@ -14,11 +13,3 @@ data: WALG_DISABLE_S3_SSE: "true" USE_WALG_RESTORE: "false" AWS_S3_FORCE_PATH_STYLE: "true" ---- -apiVersion: v1 -kind: ServiceAccount -metadata: - name: zalando-postgres-operator - namespace: postgres-operator -imagePullSecrets: - - name: private-registry \ No newline at end of file diff --git a/examples/postgres-operator/values/minio-instance.yaml b/examples/postgres-operator/values/minio-instance.yaml index b638e4f7ee..9b924768e4 100644 --- a/examples/postgres-operator/values/minio-instance.yaml +++ b/examples/postgres-operator/values/minio-instance.yaml @@ -10,7 +10,7 @@ tenants: ## size specifies the capacity per volume size: 1Gi ## storageClass specifies the storage class name to be used for this pool - storageClassName: local-path + storageClassName: "###ZARF_STORAGE_CLASS###" ## Used to specify a toleration for a pod tolerations: {} ## nodeSelector parameters for MinIO Pods. It specifies a map of key-value pairs. For the pod to be diff --git a/examples/postgres-operator/values/minio-operator.yaml b/examples/postgres-operator/values/minio-operator.yaml index 0765f2dd27..d4824693e9 100644 --- a/examples/postgres-operator/values/minio-operator.yaml +++ b/examples/postgres-operator/values/minio-operator.yaml @@ -10,3 +10,7 @@ operator: limits: cpu: 200m memory: 256Mi +# @todo: need to look at if this is neeeded for zarf with SA injection +# tenants: +# imagePullSecret: +# name: zarf-registry diff --git a/examples/postgres-operator/zarf.yaml b/examples/postgres-operator/zarf.yaml index 14f177936c..de19fa0080 100644 --- a/examples/postgres-operator/zarf.yaml +++ b/examples/postgres-operator/zarf.yaml @@ -9,16 +9,13 @@ components: - name: baseline required: true - scripts: - retry: true - after: - - "kubectl patch serviceaccount default -p '{\"imagePullSecrets\": [{\"name\": \"private-registry\"}]}' -n postgres-operator" - manifests: - name: postgres-example-config files: + - manifests/patch-svc-accounts.yaml - manifests/minio-instance.yaml - manifests/pgadmin.yaml + - manifests/postgres-cluster.yaml - manifests/postgres-operator.yaml - manifests/postgres-operator-ui.yaml charts: @@ -55,7 +52,6 @@ components: valuesFiles: - values/minio-instance.yaml - images: - registry.opensource.zalan.do/acid/postgres-operator:v1.7.0 - registry.opensource.zalan.do/acid/spilo-13:2.1-p1 From c20a01bf0c35d4bf205f899fab52a5c5f7962718 Mon Sep 17 00:00:00 2001 From: Jeff McCoy Date: Mon, 31 Jan 2022 10:05:20 +0000 Subject: [PATCH 60/88] add "secretName" key for components to change the default injected secret---thanks big bang :-< --- cli/internal/helm/chart.go | 8 +++--- cli/internal/helm/post-render.go | 10 ++++++-- cli/internal/packager/deploy.go | 8 +++--- cli/types/types.go | 42 ++++++++++++++++++++++++-------- 4 files changed, 48 insertions(+), 20 deletions(-) diff --git a/cli/internal/helm/chart.go b/cli/internal/helm/chart.go index 2091e22278..af7c0d69ee 100644 --- a/cli/internal/helm/chart.go +++ b/cli/internal/helm/chart.go @@ -28,7 +28,7 @@ type ChartOptions struct { ChartLoadOverride string ChartOverride *chart.Chart ValueOverride map[string]interface{} - Images []string + Component types.ZarfComponent } // InstallOrUpgradeChart performs a helm install of the given chart @@ -149,8 +149,8 @@ func TemplateChart(options ChartOptions) (string, error) { return templatedChart.Manifest, nil } -func GenerateChart(basePath string, manifest types.ZarfManifest, images []string) ConnectStrings { - message.Debugf("helm.GenerateChart(%s, %v, %v)", basePath, manifest, images) +func GenerateChart(basePath string, manifest types.ZarfManifest, component types.ZarfComponent) ConnectStrings { + message.Debugf("helm.GenerateChart(%s, %v, %s)", basePath, manifest, component.Name) spinner := message.NewProgressSpinner("Starting helm chart generation %s", manifest.Name) defer spinner.Stop() @@ -193,7 +193,7 @@ func GenerateChart(basePath string, manifest types.ZarfManifest, images []string // We don't have any values because we do not expose them in the zarf.yaml currently ValueOverride: map[string]interface{}{}, // Images needed for eventual post-render templating - Images: images, + Component: component, } spinner.Success() diff --git a/cli/internal/helm/post-render.go b/cli/internal/helm/post-render.go index 0d0402fde6..13d3140799 100644 --- a/cli/internal/helm/post-render.go +++ b/cli/internal/helm/post-render.go @@ -18,9 +18,10 @@ import ( "k8s.io/apimachinery/pkg/runtime" ) -const secretName = "zarf-registry" const managedByLabel = "app.kubernetes.io/managed-by" +var secretName = "zarf-registry" + type renderer struct { actionConfig *action.Configuration connectStrings ConnectStrings @@ -47,13 +48,18 @@ func (r *renderer) Run(renderedManifests *bytes.Buffer) (*bytes.Buffer, error) { tempDir, _ := utils.MakeTempDir() path := tempDir + "/chart.yaml" + if r.options.Component.SecretName != "" { + // A custom secret name was given for this component + secretName = r.options.Component.SecretName + } + // Write the context to a file for processing if err := utils.WriteFile(path, renderedManifests.Bytes()); err != nil { return nil, fmt.Errorf("unable to write the post-render file for the helm chart") } // Run the template engine against the chart output - k8s.ProcessYamlFilesInPath(tempDir, r.options.Images) + k8s.ProcessYamlFilesInPath(tempDir, r.options.Component.Images) // Read back the templated file contents buff, err := os.ReadFile(path) diff --git a/cli/internal/packager/deploy.go b/cli/internal/packager/deploy.go index fb6a43277c..cc0b79e6d7 100644 --- a/cli/internal/packager/deploy.go +++ b/cli/internal/packager/deploy.go @@ -226,9 +226,9 @@ func deployComponents(tempPath tempPaths, component types.ZarfComponent) { // Generate helm templates to pass to gitops engine addedConnectStrings := helm.InstallOrUpgradeChart(helm.ChartOptions{ - BasePath: componentPath.base, - Chart: chart, - Images: component.Images, + BasePath: componentPath.base, + Chart: chart, + Component: component, }) // Iterate over any connectStrings and add to the main map @@ -245,7 +245,7 @@ func deployComponents(tempPath tempPaths, component types.ZarfComponent) { } // Iterate over any connectStrings and add to the main map - for name, description := range helm.GenerateChart(componentPath.manifests, manifest, component.Images) { + for name, description := range helm.GenerateChart(componentPath.manifests, manifest, component) { connectStrings[name] = description } } diff --git a/cli/types/types.go b/cli/types/types.go index 82e1e7ebee..1ea23887d6 100644 --- a/cli/types/types.go +++ b/cli/types/types.go @@ -21,16 +21,38 @@ type ZarfChart struct { // ZarfComponent is the primary functional grouping of assets to deploy by zarf type ZarfComponent struct { - Name string `yaml:"name"` - Description string `yaml:"description,omitempty"` - Default bool `yaml:"default,omitempty"` - Required bool `yaml:"required,omitempty"` - Files []ZarfFile `yaml:"files,omitempty"` - Charts []ZarfChart `yaml:"charts,omitempty"` - Manifests []ZarfManifest `yaml:"manifests,omitempty"` - Images []string `yaml:"images,omitempty"` - Repos []string `yaml:"repos,omitempty"` - Scripts ZarfComponentScripts `yaml:"scripts,omitempty"` + // Name is the unique identifier for this component + Name string `yaml:"name"` + + // Description is a message given to a user when deciding to enable this componenent or not + Description string `yaml:"description,omitempty"` + + // Default changes the default option when deploying this component + Default bool `yaml:"default,omitempty"` + + // Required makes this component mandatory for package deployment + Required bool `yaml:"required,omitempty"` + + // SecretName is the secret zarf will use for the registry, the default is "zarf-registry" + SecretName string `yaml:"secretName,omitempty"` + + // Files are files to place on disk during deploy + Files []ZarfFile `yaml:"files,omitempty"` + + // Charts are helm charts to install during package deploy + Charts []ZarfChart `yaml:"charts,omitempty"` + + // Manifests are raw manifests that get converted into zarf-generated helm charts during deploy + Manifests []ZarfManifest `yaml:"manifests,omitempty"` + + // Images are the online images needed to be included in the zarf package + Images []string `yaml:"images,omitempty"` + + // Repos are any git repos that need to be pushed into the gitea server + Repos []string `yaml:"repos,omitempty"` + + // Scripts are custom commands that run before or after package deployment + Scripts ZarfComponentScripts `yaml:"scripts,omitempty"` } // ZarfManifest defines raw manifests Zarf will deploy as a helm chart From 9aee430f1e000d67c0163ac2388913a8e84bfe5f Mon Sep 17 00:00:00 2001 From: Jeff McCoy Date: Mon, 31 Jan 2022 10:06:17 +0000 Subject: [PATCH 61/88] wip big bang testing --- .../manifests.yaml => big-bang.yaml} | 3 +- examples/big-bang/manifests/flux/.gitkeep | 0 .../manifests/flux/regcred-secret.yaml | 9 ----- .../template/bigbang/kustomization.yaml | 6 ++- .../vendor/bigbang/base/gitrepository.yaml | 14 ------- .../vendor/bigbang/base/helmrelease.yaml | 40 ------------------- .../vendor/bigbang/base/kustomization.yaml | 37 ----------------- .../vendor/bigbang/base/namespace.yaml | 4 -- .../vendor/bigbang/base/transformer.yaml | 9 ----- examples/big-bang/zarf.yaml | 8 ++-- 10 files changed, 11 insertions(+), 119 deletions(-) rename examples/big-bang/manifests/{big-bang/manifests.yaml => big-bang.yaml} (98%) delete mode 100644 examples/big-bang/manifests/flux/.gitkeep delete mode 100644 examples/big-bang/manifests/flux/regcred-secret.yaml delete mode 100644 examples/big-bang/template/bigbang/vendor/bigbang/base/gitrepository.yaml delete mode 100644 examples/big-bang/template/bigbang/vendor/bigbang/base/helmrelease.yaml delete mode 100644 examples/big-bang/template/bigbang/vendor/bigbang/base/kustomization.yaml delete mode 100644 examples/big-bang/template/bigbang/vendor/bigbang/base/namespace.yaml delete mode 100644 examples/big-bang/template/bigbang/vendor/bigbang/base/transformer.yaml diff --git a/examples/big-bang/manifests/big-bang/manifests.yaml b/examples/big-bang/manifests/big-bang.yaml similarity index 98% rename from examples/big-bang/manifests/big-bang/manifests.yaml rename to examples/big-bang/manifests/big-bang.yaml index 5e401dec01..cc1c798a98 100644 --- a/examples/big-bang/manifests/big-bang/manifests.yaml +++ b/examples/big-bang/manifests/big-bang.yaml @@ -31,8 +31,7 @@ spec: secretRef: name: zarf-git-secret ref: - branch: master -# tag: 1.21.0 + branch: multi-distro-support --- apiVersion: kustomize.toolkit.fluxcd.io/v1beta1 kind: Kustomization diff --git a/examples/big-bang/manifests/flux/.gitkeep b/examples/big-bang/manifests/flux/.gitkeep deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/examples/big-bang/manifests/flux/regcred-secret.yaml b/examples/big-bang/manifests/flux/regcred-secret.yaml deleted file mode 100644 index 4b2ac8c7ee..0000000000 --- a/examples/big-bang/manifests/flux/regcred-secret.yaml +++ /dev/null @@ -1,9 +0,0 @@ -apiVersion: v1 -kind: Secret -type: Opaque -metadata: - name: zarf-git-secret - namespace: bigbang -stringData: - username: "zarf-git-user" - password: "###ZARF_GIT_AUTH_PUSH###" diff --git a/examples/big-bang/template/bigbang/kustomization.yaml b/examples/big-bang/template/bigbang/kustomization.yaml index 7247b824dd..0bbc5e126e 100644 --- a/examples/big-bang/template/bigbang/kustomization.yaml +++ b/examples/big-bang/template/bigbang/kustomization.yaml @@ -1,5 +1,5 @@ bases: - - vendor/bigbang/base + - git::http://zarf-gitea-http.zarf.svc.cluster.local:3000/zarf-git-user/mirror__repo1.dso.mil__platform-one__big-bang__bigbang.git//base?ref=1.17.0 configMapGenerator: - name: common @@ -19,3 +19,7 @@ patchesStrategicMerge: url: http://zarf-gitea-http.zarf.svc.cluster.local:3000/zarf-git-user/mirror__repo1.dso.mil__platform-one__big-bang__bigbang.git secretRef: name: zarf-git-secret + ref: + $patch: replace + tag: "1.17.0" + diff --git a/examples/big-bang/template/bigbang/vendor/bigbang/base/gitrepository.yaml b/examples/big-bang/template/bigbang/vendor/bigbang/base/gitrepository.yaml deleted file mode 100644 index c2c36ed55d..0000000000 --- a/examples/big-bang/template/bigbang/vendor/bigbang/base/gitrepository.yaml +++ /dev/null @@ -1,14 +0,0 @@ -apiVersion: source.toolkit.fluxcd.io/v1beta1 -kind: GitRepository -metadata: - name: bigbang -spec: - ignore: | - # exclude file extensions - /**/*.md - /**/*.txt - /**/*.sh - interval: 10m - url: https://repo1.dso.mil/platform-one/big-bang/bigbang.git - ref: - tag: 1.17.0 diff --git a/examples/big-bang/template/bigbang/vendor/bigbang/base/helmrelease.yaml b/examples/big-bang/template/bigbang/vendor/bigbang/base/helmrelease.yaml deleted file mode 100644 index 49eff03379..0000000000 --- a/examples/big-bang/template/bigbang/vendor/bigbang/base/helmrelease.yaml +++ /dev/null @@ -1,40 +0,0 @@ -apiVersion: helm.toolkit.fluxcd.io/v2beta1 -kind: HelmRelease -metadata: - name: bigbang -spec: - targetNamespace: bigbang - releaseName: bigbang - interval: 10m - chart: - spec: - chart: chart - sourceRef: - kind: GitRepository - name: bigbang - test: - enable: false - install: - remediation: - retries: -1 - upgrade: - remediation: - retries: 5 - remediateLastFailure: true - cleanupOnFail: true - rollback: - timeout: 10m - cleanupOnFail: false - valuesFrom: - # Optional secret injected with https://repo1.dso.mil/platform-one/big-bang/terraform-modules/big-bang-terraform-launcher - - kind: Secret - name: terraform - optional: true - - kind: Secret - name: common-bb - - kind: ConfigMap - name: common - - kind: Secret - name: environment-bb - - kind: ConfigMap - name: environment \ No newline at end of file diff --git a/examples/big-bang/template/bigbang/vendor/bigbang/base/kustomization.yaml b/examples/big-bang/template/bigbang/vendor/bigbang/base/kustomization.yaml deleted file mode 100644 index 09b812170d..0000000000 --- a/examples/big-bang/template/bigbang/vendor/bigbang/base/kustomization.yaml +++ /dev/null @@ -1,37 +0,0 @@ -configurations: -- transformer.yaml - -namespace: bigbang - -commonLabels: - owner: bigbang - -resources: - - namespace.yaml - - gitrepository.yaml - - helmrelease.yaml - -configMapGenerator: - - name: common - behavior: create - literals: - - values.yaml= - - name: environment - behavior: create - literals: - - values.yaml= - -# Flux combines secrets and configmaps in `valuesFrom`. Kustomize -# cannot distinguish between them when applying suffixes. Therefore, -# the secrets must have different names than the configmaps -# While capital letters or dashes could be used, '-bb' was chosen -# to make the difference obvious at a glance -secretGenerator: - - name: common-bb - behavior: create - literals: - - values.yaml= - - name: environment-bb - behavior: create - literals: - - values.yaml= \ No newline at end of file diff --git a/examples/big-bang/template/bigbang/vendor/bigbang/base/namespace.yaml b/examples/big-bang/template/bigbang/vendor/bigbang/base/namespace.yaml deleted file mode 100644 index 147e8f3920..0000000000 --- a/examples/big-bang/template/bigbang/vendor/bigbang/base/namespace.yaml +++ /dev/null @@ -1,4 +0,0 @@ -apiVersion: v1 -kind: Namespace -metadata: - name: bigbang \ No newline at end of file diff --git a/examples/big-bang/template/bigbang/vendor/bigbang/base/transformer.yaml b/examples/big-bang/template/bigbang/vendor/bigbang/base/transformer.yaml deleted file mode 100644 index f55683c3a5..0000000000 --- a/examples/big-bang/template/bigbang/vendor/bigbang/base/transformer.yaml +++ /dev/null @@ -1,9 +0,0 @@ -nameReference: -- kind: ConfigMap - fieldSpecs: - - path: spec/valuesFrom/name - kind: HelmRelease -- kind: Secret - fieldSpecs: - - path: spec/valuesFrom/name - kind: HelmRelease \ No newline at end of file diff --git a/examples/big-bang/zarf.yaml b/examples/big-bang/zarf.yaml index 4073e96d1e..71fd89a09f 100644 --- a/examples/big-bang/zarf.yaml +++ b/examples/big-bang/zarf.yaml @@ -8,6 +8,7 @@ metadata: components: - name: flux required: true + secretName: "private-registry" manifests: - name: flux-installer # This will be built on the package create side and deployed as a regular manifest on package deploy @@ -32,18 +33,19 @@ components: target: "/usr/local/bin/kubescape-framework-nsa.json" - source: "files/kubescape-exceptions.json" target: "/usr/local/bin/kubescape-exceptions.json" - + - name: bb-core required: true + secretName: "private-registry" manifests: - name: bb-core-config files: - - manifests/flux/regcred-secret.yaml - - manifests/big-bang/manifests.yaml + - manifests/big-bang.yaml # 1. helm template bigbang ./chart | yq e '. | select(.kind == "GitRepository") | "- " + .spec.url + "@" + .spec.ref.tag' - # 2. Add the actual bigbang repo as well # https://repo1.dso.mil/platform-one/big-bang/bigbang/-/tags/1.17.0 repos: + - https://github.com/defenseunicorns/zarf.git - https://repo1.dso.mil/platform-one/big-bang/bigbang.git@1.17.0 - https://repo1.dso.mil/platform-one/big-bang/apps/core/cluster-auditor.git@0.3.0-bb.7 - https://repo1.dso.mil/platform-one/big-bang/apps/core/policy.git@3.5.2-bb.1 From 7ea32ad6ffccfcd4dc16c9feae77a8016c5828f4 Mon Sep 17 00:00:00 2001 From: Jeff McCoy Date: Mon, 31 Jan 2022 10:06:51 +0000 Subject: [PATCH 62/88] add secretName to config schema --- zarf.schema.json | 3 +++ 1 file changed, 3 insertions(+) diff --git a/zarf.schema.json b/zarf.schema.json index 9e755c49ff..479f232e0d 100644 --- a/zarf.schema.json +++ b/zarf.schema.json @@ -80,6 +80,9 @@ "required": { "type": "boolean" }, + "secretName": { + "type": "string" + }, "files": { "items": { "$schema": "http://json-schema.org/draft-04/schema#", From b91c514cecd17d8bc96c91aa5b402b7c2dd6e950 Mon Sep 17 00:00:00 2001 From: Jeff McCoy Date: Mon, 31 Jan 2022 17:33:18 -0600 Subject: [PATCH 63/88] operators are messy, keep imagepullsecret for tiny-kafka --- examples/tiny-kafka/charts/strimzi-values.yaml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/examples/tiny-kafka/charts/strimzi-values.yaml b/examples/tiny-kafka/charts/strimzi-values.yaml index ee5b1ed724..3416edb04a 100644 --- a/examples/tiny-kafka/charts/strimzi-values.yaml +++ b/examples/tiny-kafka/charts/strimzi-values.yaml @@ -1,3 +1,5 @@ +image: + imagePullSecrets: zarf-registry imageRegistryOverride: registry1.dso.mil imageRepositoryOverride: ironbank/opensource/strimzi watchNamespaces: From 74d139b226d3c21427dfa703346ddd9c2c551280 Mon Sep 17 00:00:00 2001 From: Jeff McCoy Date: Tue, 1 Feb 2022 00:07:30 +0000 Subject: [PATCH 64/88] more postgres example cleanup --- ...inio-instance.yaml => minio-instance-ingress.yaml} | 0 .../manifests/{pgadmin.yaml => pgadmin-ingress.yaml} | 0 ...ator-ui.yaml => postgres-operator-ui-ingress.yaml} | 0 examples/postgres-operator/zarf.yaml | 11 +++++++---- 4 files changed, 7 insertions(+), 4 deletions(-) rename examples/postgres-operator/manifests/{minio-instance.yaml => minio-instance-ingress.yaml} (100%) rename examples/postgres-operator/manifests/{pgadmin.yaml => pgadmin-ingress.yaml} (100%) rename examples/postgres-operator/manifests/{postgres-operator-ui.yaml => postgres-operator-ui-ingress.yaml} (100%) diff --git a/examples/postgres-operator/manifests/minio-instance.yaml b/examples/postgres-operator/manifests/minio-instance-ingress.yaml similarity index 100% rename from examples/postgres-operator/manifests/minio-instance.yaml rename to examples/postgres-operator/manifests/minio-instance-ingress.yaml diff --git a/examples/postgres-operator/manifests/pgadmin.yaml b/examples/postgres-operator/manifests/pgadmin-ingress.yaml similarity index 100% rename from examples/postgres-operator/manifests/pgadmin.yaml rename to examples/postgres-operator/manifests/pgadmin-ingress.yaml diff --git a/examples/postgres-operator/manifests/postgres-operator-ui.yaml b/examples/postgres-operator/manifests/postgres-operator-ui-ingress.yaml similarity index 100% rename from examples/postgres-operator/manifests/postgres-operator-ui.yaml rename to examples/postgres-operator/manifests/postgres-operator-ui-ingress.yaml diff --git a/examples/postgres-operator/zarf.yaml b/examples/postgres-operator/zarf.yaml index de19fa0080..827d366b53 100644 --- a/examples/postgres-operator/zarf.yaml +++ b/examples/postgres-operator/zarf.yaml @@ -8,16 +8,19 @@ metadata: components: - name: baseline required: true + # Big Bang charts expect this + secretName: "private-registry" manifests: - name: postgres-example-config + # @todo: update IngressRoute manifets to use k8s Ingress or Zarf Connect logic files: - manifests/patch-svc-accounts.yaml - - manifests/minio-instance.yaml - - manifests/pgadmin.yaml - - manifests/postgres-cluster.yaml + # - manifests/minio-instance-ingress.yaml + - manifests/pgadmin-ingress.yaml + # - manifests/postgres-cluster.yaml - manifests/postgres-operator.yaml - - manifests/postgres-operator-ui.yaml + # - manifests/postgres-operator-ui-ingress.yaml charts: - name: postgres-operator url: https://opensource.zalando.com/postgres-operator/charts/postgres-operator From 94486f68543832aeb1e16d3cce908e58e58b6bd8 Mon Sep 17 00:00:00 2001 From: Jeff McCoy Date: Tue, 1 Feb 2022 05:21:24 +0000 Subject: [PATCH 65/88] update postgres example with zarf connect & secret injection --- cli/cmd/package.go | 19 ++++++----- cli/cmd/tools.go | 34 +++++++++++-------- cli/internal/helm/chart.go | 8 +++-- cli/internal/helm/destroy.go | 4 +-- cli/internal/helm/post-render.go | 1 + cli/internal/helm/utils.go | 4 +-- .../manifests/minio-instance-ingress.yaml | 14 -------- .../minio-instance-zarf-connect.yaml | 17 ++++++++++ .../manifests/pgadmin-ingress.yaml | 14 -------- .../manifests/pgadmin-zarf-connect.yaml | 18 ++++++++++ .../postgres-operator-ui-ingress.yaml | 14 -------- .../postgres-operator-ui-zarf-connect.yaml | 18 ++++++++++ examples/postgres-operator/zarf.yaml | 11 +++--- 13 files changed, 100 insertions(+), 76 deletions(-) delete mode 100644 examples/postgres-operator/manifests/minio-instance-ingress.yaml create mode 100644 examples/postgres-operator/manifests/minio-instance-zarf-connect.yaml delete mode 100644 examples/postgres-operator/manifests/pgadmin-ingress.yaml create mode 100644 examples/postgres-operator/manifests/pgadmin-zarf-connect.yaml delete mode 100644 examples/postgres-operator/manifests/postgres-operator-ui-ingress.yaml create mode 100644 examples/postgres-operator/manifests/postgres-operator-ui-zarf-connect.yaml diff --git a/cli/cmd/package.go b/cli/cmd/package.go index 6eaaca0378..b4d865a36d 100644 --- a/cli/cmd/package.go +++ b/cli/cmd/package.go @@ -19,17 +19,19 @@ var packageCmd = &cobra.Command{ } var packageCreateCmd = &cobra.Command{ - Use: "create", - Short: "Create an update package to push to the gitops server (runs online)", + Use: "create", + Aliases: []string{"c"}, + Short: "Create an update package to push to the gitops server (runs online)", Run: func(cmd *cobra.Command, args []string) { packager.Create() }, } var packageDeployCmd = &cobra.Command{ - Use: "deploy [PACKAGE]", - Short: "Deploys an update package from a local file or URL (runs offline)", - Args: cobra.MaximumNArgs(1), + Use: "deploy [PACKAGE]", + Aliases: []string{"d"}, + Short: "Deploys an update package from a local file or URL (runs offline)", + Args: cobra.MaximumNArgs(1), Run: func(cmd *cobra.Command, args []string) { var done func() packageName := choosePackage(args) @@ -40,9 +42,10 @@ var packageDeployCmd = &cobra.Command{ } var packageInspectCmd = &cobra.Command{ - Use: "inspect [PACKAGE]", - Short: "lists the payload of an update package file (runs offline)", - Args: cobra.MaximumNArgs(1), + Use: "inspect [PACKAGE]", + Aliases: []string{"i"}, + Short: "lists the payload of an update package file (runs offline)", + Args: cobra.MaximumNArgs(1), Run: func(cmd *cobra.Command, args []string) { packageName := choosePackage(args) packager.Inspect(packageName) diff --git a/cli/cmd/tools.go b/cli/cmd/tools.go index b924bec71d..8a7502e3b6 100644 --- a/cli/cmd/tools.go +++ b/cli/cmd/tools.go @@ -25,14 +25,16 @@ var toolsCmd = &cobra.Command{ // destroyCmd represents the init command var archiverCmd = &cobra.Command{ - Use: "archiver", - Short: "Compress/Decompress tools", + Use: "archiver", + Aliases: []string{"a"}, + Short: "Compress/Decompress tools", } var archiverCompressCmd = &cobra.Command{ - Use: "compress SOURCES ARCHIVE", - Short: "Compress a collection of sources based off of the destination file extension", - Args: cobra.MinimumNArgs(2), + Use: "compress SOURCES ARCHIVE", + Aliases: []string{"c"}, + Short: "Compress a collection of sources based off of the destination file extension", + Args: cobra.MinimumNArgs(2), Run: func(cmd *cobra.Command, args []string) { sourceFiles, destinationArchive := args[:len(args)-1], args[len(args)-1] err := archiver.Archive(sourceFiles, destinationArchive) @@ -43,9 +45,10 @@ var archiverCompressCmd = &cobra.Command{ } var archiverDecompressCmd = &cobra.Command{ - Use: "decompress ARCHIVE DESTINATION", - Short: "Decompress an archive to a specified location.", - Args: cobra.ExactArgs(2), + Use: "decompress ARCHIVE DESTINATION", + Aliases: []string{"d"}, + Short: "Decompress an archive to a specified location.", + Args: cobra.ExactArgs(2), Run: func(cmd *cobra.Command, args []string) { sourceArchive, destinationPath := args[0], args[1] err := archiver.Unarchive(sourceArchive, destinationPath) @@ -56,8 +59,9 @@ var archiverDecompressCmd = &cobra.Command{ } var registryCmd = &cobra.Command{ - Use: "registry", - Short: "Collection of registry commands provided by Crane", + Use: "registry", + Aliases: []string{"r"}, + Short: "Collection of registry commands provided by Crane", } var readCredsCmd = &cobra.Command{ @@ -70,8 +74,9 @@ var readCredsCmd = &cobra.Command{ } var configSchemaCmd = &cobra.Command{ - Use: "config-schema", - Short: "Generates a JSON schema for the zarf.yaml configuration", + Use: "config-schema", + Aliases: []string{"c"}, + Short: "Generates a JSON schema for the zarf.yaml configuration", Run: func(cmd *cobra.Command, args []string) { schema := jsonschema.Reflect(&types.ZarfPackage{}) output, err := json.MarshalIndent(schema, "", " ") @@ -83,8 +88,9 @@ var configSchemaCmd = &cobra.Command{ } var k9sCmd = &cobra.Command{ - Use: "k9s", - Short: "Launch K9s tool for managing K8s clusters", + Use: "monitor", + Aliases: []string{"m", "k9s"}, + Short: "Launch K9s tool for managing K8s clusters", Run: func(cmd *cobra.Command, args []string) { // Hack to make k9s think it's all alone os.Args = []string{os.Args[0], "-n", "zarf"} diff --git a/cli/internal/helm/chart.go b/cli/internal/helm/chart.go index af7c0d69ee..8ce3275543 100644 --- a/cli/internal/helm/chart.go +++ b/cli/internal/helm/chart.go @@ -46,7 +46,7 @@ func InstallOrUpgradeChart(options ChartOptions) ConnectStrings { var output *release.Release options.ReleaseName = fmt.Sprintf("zarf-%s", options.Chart.Name) - actionConfig, err := createActionConfig(options.Chart.Namespace) + actionConfig, err := createActionConfig(options.Chart.Namespace, spinner) postRender := NewRenderer(options, actionConfig) // Setup K8s connection @@ -114,8 +114,10 @@ func InstallOrUpgradeChart(options ChartOptions) ConnectStrings { // TemplateChart generates a helm template from a given chart func TemplateChart(options ChartOptions) (string, error) { message.Debugf("helm.TemplateChart(%v)", options) + spinner := message.NewProgressSpinner("Templating helm chart %s", options.Chart.Name) + defer spinner.Stop() - actionConfig, err := createActionConfig(options.Chart.Namespace) + actionConfig, err := createActionConfig(options.Chart.Namespace, spinner) // Setup K8s connection if err != nil { @@ -146,6 +148,8 @@ func TemplateChart(options ChartOptions) (string, error) { return "", fmt.Errorf("error generating helm chart template: %w", err) } + spinner.Success() + return templatedChart.Manifest, nil } diff --git a/cli/internal/helm/destroy.go b/cli/internal/helm/destroy.go index 4e746f659a..f83480e62d 100644 --- a/cli/internal/helm/destroy.go +++ b/cli/internal/helm/destroy.go @@ -11,7 +11,7 @@ func Destroy(purgeAllZarfInstallations bool) { defer spinner.Stop() // Initially load the actionConfig without a namespace - actionConfig, err := createActionConfig("") + actionConfig, err := createActionConfig("", spinner) if err != nil { // Don't fatal since this is a removal action spinner.Errorf(err, "Unable to initialize the K8s client") @@ -45,7 +45,7 @@ func Destroy(purgeAllZarfInstallations bool) { if zarfPrefix.MatchString(release.Name) { spinner.Updatef("Uninstalling helm chart %s/%s", release.Namespace, release.Name) // Establish a new actionConfig for the namespace - actionConfig, _ = createActionConfig(release.Namespace) + actionConfig, _ = createActionConfig(release.Namespace, spinner) // Perform the uninstall response, err := uninstallChart(actionConfig, release.Name) message.Debug(response) diff --git a/cli/internal/helm/post-render.go b/cli/internal/helm/post-render.go index 13d3140799..c34948e876 100644 --- a/cli/internal/helm/post-render.go +++ b/cli/internal/helm/post-render.go @@ -51,6 +51,7 @@ func (r *renderer) Run(renderedManifests *bytes.Buffer) (*bytes.Buffer, error) { if r.options.Component.SecretName != "" { // A custom secret name was given for this component secretName = r.options.Component.SecretName + message.Debugf("using custom zarf secret name %s", secretName) } // Write the context to a file for processing diff --git a/cli/internal/helm/utils.go b/cli/internal/helm/utils.go index e57bd5889f..4e585b0100 100644 --- a/cli/internal/helm/utils.go +++ b/cli/internal/helm/utils.go @@ -64,7 +64,7 @@ func parseChartValues(options ChartOptions) (map[string]interface{}, error) { return valueOpts.MergeValues(providers) } -func createActionConfig(namespace string) (*action.Configuration, error) { +func createActionConfig(namespace string, spinner *message.Spinner) (*action.Configuration, error) { // OMG THIS IS SOOOO GROSS PPL... https://github.com/helm/helm/issues/8780 _ = os.Setenv("HELM_NAMESPACE", namespace) @@ -73,7 +73,7 @@ func createActionConfig(namespace string) (*action.Configuration, error) { settings := cli.New() // Setup K8s connection - err := actionConfig.Init(settings.RESTClientGetter(), namespace, "", message.Debugf) + err := actionConfig.Init(settings.RESTClientGetter(), namespace, "", spinner.Updatef) return actionConfig, err } diff --git a/examples/postgres-operator/manifests/minio-instance-ingress.yaml b/examples/postgres-operator/manifests/minio-instance-ingress.yaml deleted file mode 100644 index 11ead3c666..0000000000 --- a/examples/postgres-operator/manifests/minio-instance-ingress.yaml +++ /dev/null @@ -1,14 +0,0 @@ -apiVersion: traefik.containo.us/v1alpha1 -kind: IngressRoute -metadata: - name: minio-console-ingressroute - namespace: minio-operator -spec: - entryPoints: - - websecure - routes: - - match: Host(`minio-console.localhost`) - kind: Rule - services: - - name: minio-instance-console - port: 9090 diff --git a/examples/postgres-operator/manifests/minio-instance-zarf-connect.yaml b/examples/postgres-operator/manifests/minio-instance-zarf-connect.yaml new file mode 100644 index 0000000000..8aad5d50e4 --- /dev/null +++ b/examples/postgres-operator/manifests/minio-instance-zarf-connect.yaml @@ -0,0 +1,17 @@ +apiVersion: v1 +kind: Service +metadata: + name: minio-console-zarf-connect + namespace: minio-operator + annotations: + zarf.dev/connect-description: "Launch the minio console" + labels: + zarf.dev/connect-name: minio +spec: + selector: + v1.min.io/tenant: zarf-minio-instance + ports: + - name: http-console + port: 9090 + protocol: TCP + targetPort: 9090 diff --git a/examples/postgres-operator/manifests/pgadmin-ingress.yaml b/examples/postgres-operator/manifests/pgadmin-ingress.yaml deleted file mode 100644 index 139ed89e58..0000000000 --- a/examples/postgres-operator/manifests/pgadmin-ingress.yaml +++ /dev/null @@ -1,14 +0,0 @@ -apiVersion: traefik.containo.us/v1alpha1 -kind: IngressRoute -metadata: - name: pgadmin-ingressroute - namespace: postgres-operator -spec: - entryPoints: - - websecure - routes: - - match: Host(`pgadmin.localhost`) - kind: Rule - services: - - name: pgadmin4 - port: 80 diff --git a/examples/postgres-operator/manifests/pgadmin-zarf-connect.yaml b/examples/postgres-operator/manifests/pgadmin-zarf-connect.yaml new file mode 100644 index 0000000000..131c343d61 --- /dev/null +++ b/examples/postgres-operator/manifests/pgadmin-zarf-connect.yaml @@ -0,0 +1,18 @@ +apiVersion: v1 +kind: Service +metadata: + name: pgadmin-zarf-connect + namespace: postgres-operator + annotations: + zarf.dev/connect-description: "Launch the pgadmin web interface" + labels: + zarf.dev/connect-name: pgadmin +spec: + selector: + app.kubernetes.io/instance: zarf-pgadmin4 + app.kubernetes.io/name: pgadmin4 + ports: + - name: http + port: 80 + protocol: TCP + targetPort: 80 diff --git a/examples/postgres-operator/manifests/postgres-operator-ui-ingress.yaml b/examples/postgres-operator/manifests/postgres-operator-ui-ingress.yaml deleted file mode 100644 index 1e1c111057..0000000000 --- a/examples/postgres-operator/manifests/postgres-operator-ui-ingress.yaml +++ /dev/null @@ -1,14 +0,0 @@ -apiVersion: traefik.containo.us/v1alpha1 -kind: IngressRoute -metadata: - name: postgres-operator-ui-ingressroute - namespace: postgres-operator -spec: - entryPoints: - - websecure - routes: - - match: Host(`postgres-operator-ui.localhost`) - kind: Rule - services: - - name: postgres-operator-ui - port: 80 diff --git a/examples/postgres-operator/manifests/postgres-operator-ui-zarf-connect.yaml b/examples/postgres-operator/manifests/postgres-operator-ui-zarf-connect.yaml new file mode 100644 index 0000000000..dc309177db --- /dev/null +++ b/examples/postgres-operator/manifests/postgres-operator-ui-zarf-connect.yaml @@ -0,0 +1,18 @@ +apiVersion: v1 +kind: Service +metadata: + name: postgres-operator-ui-zarf-connect + namespace: postgres-operator + annotations: + zarf.dev/connect-description: "Launch the postgres opertor web interface" + labels: + zarf.dev/connect-name: postgres-operator-ui +spec: + selector: + app.kubernetes.io/instance: zarf-postgres-operator-ui + app.kubernetes.io/name: postgres-operator-ui + ports: + - name: http + port: 80 + protocol: TCP + targetPort: 8081 diff --git a/examples/postgres-operator/zarf.yaml b/examples/postgres-operator/zarf.yaml index 827d366b53..2a2ee59633 100644 --- a/examples/postgres-operator/zarf.yaml +++ b/examples/postgres-operator/zarf.yaml @@ -9,18 +9,17 @@ components: - name: baseline required: true # Big Bang charts expect this - secretName: "private-registry" + secretName: "private-registry" manifests: - name: postgres-example-config - # @todo: update IngressRoute manifets to use k8s Ingress or Zarf Connect logic files: - manifests/patch-svc-accounts.yaml - # - manifests/minio-instance-ingress.yaml - - manifests/pgadmin-ingress.yaml - # - manifests/postgres-cluster.yaml + - manifests/minio-instance-zarf-connect.yaml + - manifests/pgadmin-zarf-connect.yaml + - manifests/postgres-cluster.yaml - manifests/postgres-operator.yaml - # - manifests/postgres-operator-ui-ingress.yaml + - manifests/postgres-operator-ui-zarf-connect.yaml charts: - name: postgres-operator url: https://opensource.zalando.com/postgres-operator/charts/postgres-operator From 259b6f39e48c8449e680667be674df3392bd76c0 Mon Sep 17 00:00:00 2001 From: Jeff McCoy Date: Mon, 31 Jan 2022 23:35:09 -0600 Subject: [PATCH 66/88] remove e2e pre-reqs no longer needed by zarf --- test/e2e/e2e_data_injection_test.go | 8 -------- test/e2e/e2e_git_based_helm_chart_test.go | 4 ---- 2 files changed, 12 deletions(-) diff --git a/test/e2e/e2e_data_injection_test.go b/test/e2e/e2e_data_injection_test.go index e7f06b2e1e..22f98acaba 100644 --- a/test/e2e/e2e_data_injection_test.go +++ b/test/e2e/e2e_data_injection_test.go @@ -63,18 +63,10 @@ func runDataInjectionTest(t *testing.T, terraformOptions *terraform.Options, key output, err := ssh.CheckSshCommandE(t, publicHost, fmt.Sprintf("sudo bash -c 'cd /home/%s/build && ./zarf init --confirm --components k3s'", username)) require.NoError(t, err, output) - // Wait until the Docker registry is ready - output, err = ssh.CheckSshCommandE(t, publicHost, "timeout 300 bash -c 'while [[ \"$(curl -sfSL --retry 15 --retry-connrefused --retry-delay 5 -o /dev/null -w \"%{http_code}\" \"https://127.0.0.1/v2/\")\" != \"401\" ]]; do sleep 1; done' || false") - require.NoError(t, err, output) - // Deploy the data injection example output, err = ssh.CheckSshCommandE(t, publicHost, fmt.Sprintf("sudo bash -c 'cd /home/%s/build && ./zarf package deploy zarf-package-data-injection-demo.tar --confirm'", username)) require.NoError(t, err, output) - // Wait until the deployment is ready - output, err = ssh.CheckSshCommandE(t, publicHost, `timeout 300 sudo bash -c 'while [ "$(/usr/local/bin/kubectl get pods -n demo -l app=data-injection --field-selector=status.phase=Running -o json | jq -r '"'"'.items | length'"'"')" -lt "1" ]; do sleep 1; done' || false`) - require.NoError(t, err, output) - // Test to confirm the root file was placed output, err = ssh.CheckSshCommandE(t, publicHost, `sudo bash -c '/usr/local/bin/kubectl -n demo exec data-injection -- ls /test | grep this-is-an-example'`) require.NoError(t, err, output) diff --git a/test/e2e/e2e_git_based_helm_chart_test.go b/test/e2e/e2e_git_based_helm_chart_test.go index f5e0e04d6e..54579e03cd 100644 --- a/test/e2e/e2e_git_based_helm_chart_test.go +++ b/test/e2e/e2e_git_based_helm_chart_test.go @@ -63,10 +63,6 @@ func runGitBasedCliTest(t *testing.T, terraformOptions *terraform.Options, keyPa output, err := ssh.CheckSshCommandE(t, publicHost, fmt.Sprintf("sudo bash -c 'cd /home/%s/build && ./zarf init --confirm --components k3s'", username)) require.NoError(t, err, output) - // Wait until the Docker registry is ready - output, err = ssh.CheckSshCommandE(t, publicHost, "timeout 300 bash -c 'while [[ \"$(curl -sfSL --retry 15 --retry-connrefused --retry-delay 5 -o /dev/null -w \"%{http_code}\" \"https://127.0.0.1/v2/\")\" != \"401\" ]]; do sleep 1; done' || false") - require.NoError(t, err, output) - // Deploy the single-big-bang-package example output, err = ssh.CheckSshCommandE(t, publicHost, fmt.Sprintf("sudo bash -c 'cd /home/%s/build && ./zarf package deploy zarf-package-big-bang-single-package-demo.tar.zst --confirm'", username)) require.NoError(t, err, output) From 631a429cd5f7ce252425ff8df711752f5728784b Mon Sep 17 00:00:00 2001 From: Jeff McCoy Date: Tue, 1 Feb 2022 01:17:04 -0600 Subject: [PATCH 67/88] e2e test cleanup --- test/e2e/common.go | 110 +++++++++++----- test/e2e/e2e_data_injection_test.go | 78 ++++-------- test/e2e/e2e_example_game_test.go | 91 ++++---------- test/e2e/e2e_general_cli_test.go | 147 +++++++++------------- test/e2e/e2e_git_based_helm_chart_test.go | 72 +++-------- test/e2e/e2e_gitea_and_grafana_test.go | 81 ++++-------- 6 files changed, 224 insertions(+), 355 deletions(-) diff --git a/test/e2e/common.go b/test/e2e/common.go index 54dfdf8a19..2949ce959c 100644 --- a/test/e2e/common.go +++ b/test/e2e/common.go @@ -18,27 +18,75 @@ import ( "github.com/gruntwork-io/terratest/modules/terraform" ) -func teardown(t *testing.T, tmpFolder string) { - keyPair := teststructure.LoadEc2KeyPair(t, tmpFolder) - aws.DeleteEC2KeyPair(t, keyPair) +type ZarfE2ETest struct { + testing *testing.T + tempFolder string + username string + terraformOptions *terraform.Options + keyPair *aws.Ec2Keypair + publicIP string + publicHost ssh.Host +} + +func NewE2ETest(testing *testing.T) *ZarfE2ETest { + + testing.Parallel() + + // Copy the terraform folder to a temp directory so we can run multiple tests in parallel + tempFolder := teststructure.CopyTerraformFolderToTemp(testing, "..", "tf/public-ec2-instance") + + e2e := ZarfE2ETest{ + testing: testing, + tempFolder: tempFolder, + // Our SSH username, will change based on which AMI we use + username: "ubuntu", + } + + // Deploy the terraform infra + teststructure.RunTestStage(testing, "SETUP", e2e.setup) + + return &e2e +} - terraformOptions := teststructure.LoadTerraformOptions(t, tmpFolder) - terraform.Destroy(t, terraformOptions) +func (e2e *ZarfE2ETest) runSSHCommand(format string, a ...interface{}) (string, error) { + command := fmt.Sprintf(format, a...) + return ssh.CheckSshCommandE(e2e.testing, e2e.publicHost, command) } -func setup(t *testing.T, tmpFolder string) { - terraformOptions, keyPair, err := configureTerraformOptions(t, tmpFolder) - require.NoError(t, err) +func (e2e *ZarfE2ETest) teardown() { + keyPair := teststructure.LoadEc2KeyPair(e2e.testing, e2e.tempFolder) + aws.DeleteEC2KeyPair(e2e.testing, keyPair) + + terraformOptions := teststructure.LoadTerraformOptions(e2e.testing, e2e.tempFolder) + terraform.Destroy(e2e.testing, terraformOptions) +} + +func (e2e *ZarfE2ETest) setup() { + terraformOptions, keyPair, err := e2e.configureTerraformOptions() + require.NoError(e2e.testing, err) // Save the options and key pair so later test stages can use them - teststructure.SaveTerraformOptions(t, tmpFolder, terraformOptions) - teststructure.SaveEc2KeyPair(t, tmpFolder, keyPair) + teststructure.SaveTerraformOptions(e2e.testing, e2e.tempFolder, terraformOptions) + teststructure.SaveEc2KeyPair(e2e.testing, e2e.tempFolder, keyPair) // This will run `terraform init` and `terraform apply` and fail the test if there are any errors - terraform.InitAndApply(t, terraformOptions) + terraform.InitAndApply(e2e.testing, terraformOptions) + + // Run `terraform output` to get the value of an output variable + e2e.publicIP = terraform.Output(e2e.testing, terraformOptions, "public_instance_ip") + e2e.terraformOptions = terraformOptions + e2e.keyPair = keyPair + + // We're going to try to SSH to the instance IP, using the Key Pair we created earlier, and the user "ubuntu", + // as we know the Instance is running an Ubuntu AMI that has such a user + e2e.publicHost = ssh.Host{ + Hostname: e2e.publicIP, + SshKeyPair: e2e.keyPair.KeyPair, + SshUserName: e2e.username, + } } -func configureTerraformOptions(t *testing.T, tmpFolder string) (*terraform.Options, *aws.Ec2Keypair, error) { +func (e2e *ZarfE2ETest) configureTerraformOptions() (*terraform.Options, *aws.Ec2Keypair, error) { // A unique ID we can use to namespace resources so we don't clash with anything already in the AWS account or // tests running in parallel uniqueID := random.UniqueId() @@ -56,13 +104,13 @@ func configureTerraformOptions(t *testing.T, tmpFolder string) (*terraform.Optio // Create an EC2 KeyPair that we can use for SSH access keyPairName := fmt.Sprintf("%s-%s-%s", namespace, stage, name) - keyPair := aws.CreateAndImportEC2KeyPair(t, awsRegion, keyPairName) + keyPair := aws.CreateAndImportEC2KeyPair(e2e.testing, awsRegion, keyPairName) // Construct the terraform options with default retryable errors to handle the most common retryable errors in // terraform testing. - terraformOptions := terraform.WithDefaultRetryableErrors(t, &terraform.Options{ + terraformOptions := terraform.WithDefaultRetryableErrors(e2e.testing, &terraform.Options{ // The path to where our Terraform code is located - TerraformDir: tmpFolder, + TerraformDir: e2e.tempFolder, // Variables to pass to our Terraform code using -var options Vars: map[string]interface{}{ @@ -80,48 +128,48 @@ func configureTerraformOptions(t *testing.T, tmpFolder string) (*terraform.Optio // syncFileToRemoteServer uses SCP to sync a file from source to destination. `destPath` can be absolute or relative to // the SSH user's home directory. It has to be in a directory that the SSH user is allowed to write to. -func syncFileToRemoteServer(t *testing.T, terraformOptions *terraform.Options, keyPair *aws.Ec2Keypair, sshUsername string, srcPath string, destPath string, chmod string) { +func (e2e *ZarfE2ETest) syncFileToRemoteServer(srcPath string, destPath string, chmod string) { // Run `terraform output` to get the value of an output variable - publicInstanceIP := terraform.Output(t, terraformOptions, "public_instance_ip") + publicInstanceIP := terraform.Output(e2e.testing, e2e.terraformOptions, "public_instance_ip") // We're going to try to SSH to the instance IP, using the Key Pair we created earlier, and the user "ubuntu", // as we know the Instance is running an Ubuntu AMI that has such a user host := ssh.Host{ Hostname: publicInstanceIP, - SshKeyPair: keyPair.KeyPair, - SshUserName: sshUsername, + SshKeyPair: e2e.keyPair.KeyPair, + SshUserName: e2e.username, } // It can take a minute or so for the Instance to boot up, so retry a few times maxRetries := 15 timeBetweenRetries, err := time.ParseDuration("5s") - require.NoError(t, err) + require.NoError(e2e.testing, err) // Wait for the instance to be ready - _, err = retry.DoWithRetryE(t, "Wait for the instance to be ready", maxRetries, timeBetweenRetries, func() (string, error) { - _, err := ssh.CheckSshCommandE(t, host, "whoami") + _, err = retry.DoWithRetryE(e2e.testing, "Wait for the instance to be ready", maxRetries, timeBetweenRetries, func() (string, error) { + _, err := ssh.CheckSshCommandE(e2e.testing, host, "whoami") if err != nil { return "", err } return "", nil }) - require.NoError(t, err) + require.NoError(e2e.testing, err) // Create the folder structure - output, err := ssh.CheckSshCommandE(t, host, fmt.Sprintf("bash -c 'install -m 644 -D /dev/null \"%s\"'", destPath)) - require.NoError(t, err, output) + output, err := ssh.CheckSshCommandE(e2e.testing, host, fmt.Sprintf("bash -c 'install -m 644 -D /dev/null \"%s\"'", destPath)) + require.NoError(e2e.testing, err, output) // The ssh lib only supports sending strings so we'll base64encode it first f, err := os.Open(srcPath) - require.NoError(t, err) + require.NoError(e2e.testing, err) reader := bufio.NewReader(f) content, err := ioutil.ReadAll(reader) - require.NoError(t, err) + require.NoError(e2e.testing, err) encodedContent := base64.StdEncoding.EncodeToString(content) - err = ssh.ScpFileToE(t, host, 0600, fmt.Sprintf("%s.b64", destPath), encodedContent) - require.NoError(t, err) - output, err = ssh.CheckSshCommandE(t, host, fmt.Sprintf("base64 -d \"%s.b64\" > \"%s\" && chmod \"%s\" \"%s\"", destPath, destPath, chmod, destPath)) - require.NoError(t, err, output) + err = ssh.ScpFileToE(e2e.testing, host, 0600, fmt.Sprintf("%s.b64", destPath), encodedContent) + require.NoError(e2e.testing, err) + output, err = ssh.CheckSshCommandE(e2e.testing, host, fmt.Sprintf("base64 -d \"%s.b64\" > \"%s\" && chmod \"%s\" \"%s\"", destPath, destPath, chmod, destPath)) + require.NoError(e2e.testing, err, output) } // getAwsRegion returns the desired AWS region to use by first checking the env var AWS_REGION, then checking diff --git a/test/e2e/e2e_data_injection_test.go b/test/e2e/e2e_data_injection_test.go index 22f98acaba..d734770247 100644 --- a/test/e2e/e2e_data_injection_test.go +++ b/test/e2e/e2e_data_injection_test.go @@ -2,76 +2,42 @@ package test import ( "fmt" - "github.com/gruntwork-io/terratest/modules/aws" - "github.com/gruntwork-io/terratest/modules/ssh" - "github.com/gruntwork-io/terratest/modules/terraform" + "testing" + teststructure "github.com/gruntwork-io/terratest/modules/test-structure" "github.com/stretchr/testify/require" - "testing" ) func TestDataInjection(t *testing.T) { - t.Parallel() - // Our SSH username, will change based on which AMI we use - username := "ubuntu" - // Copy the terraform folder to a temp directory so we can run multiple tests in parallel - tmpFolder := teststructure.CopyTerraformFolderToTemp(t, "..", "tf/public-ec2-instance") + e2e := NewE2ETest(t) // At the end of the test, run `terraform destroy` to clean up any resources that were created - defer teststructure.RunTestStage(t, "TEARDOWN", func() { - teardown(t, tmpFolder) - }) - - // Deploy the terraform infra - teststructure.RunTestStage(t, "SETUP", func() { - setup(t, tmpFolder) - }) + defer teststructure.RunTestStage(e2e.testing, "TEARDOWN", e2e.teardown) // Upload the Zarf artifacts - teststructure.RunTestStage(t, "UPLOAD", func() { - terraformOptions := teststructure.LoadTerraformOptions(t, tmpFolder) - keyPair := teststructure.LoadEc2KeyPair(t, tmpFolder) - - syncFileToRemoteServer(t, terraformOptions, keyPair, username, "../../build/zarf", fmt.Sprintf("/home/%s/build/zarf", username), "0700") - syncFileToRemoteServer(t, terraformOptions, keyPair, username, "../../build/zarf-init.tar.zst", fmt.Sprintf("/home/%s/build/zarf-init.tar.zst", username), "0600") - syncFileToRemoteServer(t, terraformOptions, keyPair, username, "../../build/zarf-package-data-injection-demo.tar", fmt.Sprintf("/home/%s/build/zarf-package-data-injection-demo.tar", username), "0600") + teststructure.RunTestStage(e2e.testing, "UPLOAD", func() { + e2e.syncFileToRemoteServer("../../build/zarf", fmt.Sprintf("/home/%s/build/zarf", e2e.username), "0700") + e2e.syncFileToRemoteServer("../../build/zarf-init.tar.zst", fmt.Sprintf("/home/%s/build/zarf-init.tar.zst", e2e.username), "0600") + e2e.syncFileToRemoteServer("../../build/zarf-package-data-injection-demo.tar", fmt.Sprintf("/home/%s/build/zarf-package-data-injection-demo.tar", e2e.username), "0600") }) - teststructure.RunTestStage(t, "TEST", func() { - terraformOptions := teststructure.LoadTerraformOptions(t, tmpFolder) - keyPair := teststructure.LoadEc2KeyPair(t, tmpFolder) + teststructure.RunTestStage(e2e.testing, "TEST", func() { + // run `zarf init` + output, err := e2e.runSSHCommand("sudo bash -c 'cd /home/%s/build && ./zarf init --confirm --components k3s'", e2e.username) + require.NoError(e2e.testing, err, output) - // Finally run the actual test - runDataInjectionTest(t, terraformOptions, keyPair, username) - }) -} - -func runDataInjectionTest(t *testing.T, terraformOptions *terraform.Options, keyPair *aws.Ec2Keypair, username string) { - // Run `terraform output` to get the value of an output variable - publicInstanceIP := terraform.Output(t, terraformOptions, "public_instance_ip") + // Deploy the data injection example + output, err = e2e.runSSHCommand("sudo bash -c 'cd /home/%s/build && ./zarf package deploy zarf-package-data-injection-demo.tar --confirm'", e2e.username) + require.NoError(e2e.testing, err, output) - // We're going to try to SSH to the instance IP, using the Key Pair we created earlier, and the user "ubuntu", - // as we know the Instance is running an Ubuntu AMI that has such a user - publicHost := ssh.Host{ - Hostname: publicInstanceIP, - SshKeyPair: keyPair.KeyPair, - SshUserName: username, - } + // Test to confirm the root file was placed + output, err = e2e.runSSHCommand(`sudo bash -c '/usr/local/bin/kubectl -n demo exec data-injection -- ls /test | grep this-is-an-example'`) + require.NoError(e2e.testing, err, output) - // run `zarf init` - output, err := ssh.CheckSshCommandE(t, publicHost, fmt.Sprintf("sudo bash -c 'cd /home/%s/build && ./zarf init --confirm --components k3s'", username)) - require.NoError(t, err, output) - - // Deploy the data injection example - output, err = ssh.CheckSshCommandE(t, publicHost, fmt.Sprintf("sudo bash -c 'cd /home/%s/build && ./zarf package deploy zarf-package-data-injection-demo.tar --confirm'", username)) - require.NoError(t, err, output) - - // Test to confirm the root file was placed - output, err = ssh.CheckSshCommandE(t, publicHost, `sudo bash -c '/usr/local/bin/kubectl -n demo exec data-injection -- ls /test | grep this-is-an-example'`) - require.NoError(t, err, output) + // Test to confirm the subdirectory file was placed + output, err = e2e.runSSHCommand(`sudo bash -c '/usr/local/bin/kubectl -n demo exec data-injection -- ls /test/subdirectory-test | grep this-is-an-example'`) + require.NoError(e2e.testing, err, output) + }) - // Test to confirm the subdirectory file was placed - output, err = ssh.CheckSshCommandE(t, publicHost, `sudo bash -c '/usr/local/bin/kubectl -n demo exec data-injection -- ls /test/subdirectory-test | grep this-is-an-example'`) - require.NoError(t, err, output) } diff --git a/test/e2e/e2e_example_game_test.go b/test/e2e/e2e_example_game_test.go index 4eabd18341..6a0051f0e5 100644 --- a/test/e2e/e2e_example_game_test.go +++ b/test/e2e/e2e_example_game_test.go @@ -5,86 +5,49 @@ import ( "testing" "time" - "github.com/gruntwork-io/terratest/modules/aws" - "github.com/gruntwork-io/terratest/modules/ssh" - "github.com/gruntwork-io/terratest/modules/terraform" teststructure "github.com/gruntwork-io/terratest/modules/test-structure" "github.com/stretchr/testify/require" ) func TestE2eExampleGame(t *testing.T) { - t.Parallel() - // Our SSH username, will change based on which AMI we use - username := "ubuntu" - - // Copy the terraform folder to a temp directory so we can run multiple tests in parallel - tmpFolder := teststructure.CopyTerraformFolderToTemp(t, "..", "tf/public-ec2-instance") + e2e := NewE2ETest(t) // At the end of the test, run `terraform destroy` to clean up any resources that were created - defer teststructure.RunTestStage(t, "TEARDOWN", func() { - teardown(t, tmpFolder) - }) - - // Deploy the terraform infra - teststructure.RunTestStage(t, "SETUP", func() { - setup(t, tmpFolder) - }) + defer teststructure.RunTestStage(e2e.testing, "TEARDOWN", e2e.teardown) // Upload the Zarf artifacts - teststructure.RunTestStage(t, "UPLOAD", func() { - terraformOptions := teststructure.LoadTerraformOptions(t, tmpFolder) - keyPair := teststructure.LoadEc2KeyPair(t, tmpFolder) - - syncFileToRemoteServer(t, terraformOptions, keyPair, username, "../../build/zarf", fmt.Sprintf("/home/%s/build/zarf", username), "0700") - syncFileToRemoteServer(t, terraformOptions, keyPair, username, "../../build/zarf-init.tar.zst", fmt.Sprintf("/home/%s/build/zarf-init.tar.zst", username), "0600") - syncFileToRemoteServer(t, terraformOptions, keyPair, username, "../../build/zarf-package-appliance-demo-multi-games.tar.zst", fmt.Sprintf("/home/%s/build/zarf-package-appliance-demo-multi-games.tar.zst", username), "0600") + teststructure.RunTestStage(e2e.testing, "UPLOAD", func() { + e2e.syncFileToRemoteServer("../../build/zarf", fmt.Sprintf("/home/%s/build/zarf", e2e.username), "0700") + e2e.syncFileToRemoteServer("../../build/zarf-init.tar.zst", fmt.Sprintf("/home/%s/build/zarf-init.tar.zst", e2e.username), "0600") + e2e.syncFileToRemoteServer("../../build/zarf-package-appliance-demo-multi-games.tar.zst", fmt.Sprintf("/home/%s/build/zarf-package-appliance-demo-multi-games.tar.zst", e2e.username), "0600") }) - teststructure.RunTestStage(t, "TEST", func() { - terraformOptions := teststructure.LoadTerraformOptions(t, tmpFolder) - keyPair := teststructure.LoadEc2KeyPair(t, tmpFolder) + teststructure.RunTestStage(e2e.testing, "TEST", func() { + // Make sure `zarf --help` doesn't error + output, err := e2e.runSSHCommand("sudo /home/%s/build/zarf --help", e2e.username) + require.NoError(e2e.testing, err, output) - // Finally run the actual test - testGameExample(t, terraformOptions, keyPair, username) - }) -} - -func testGameExample(t *testing.T, terraformOptions *terraform.Options, keyPair *aws.Ec2Keypair, username string) { - // Run `terraform output` to get the value of an output variable - publicInstanceIP := terraform.Output(t, terraformOptions, "public_instance_ip") - - // We're going to try to SSH to the instance IP, using the Key Pair we created earlier, and the user "ubuntu", - // as we know the Instance is running an Ubuntu AMI that has such a user - publicHost := ssh.Host{ - Hostname: publicInstanceIP, - SshKeyPair: keyPair.KeyPair, - SshUserName: username, - } + // run `zarf init` + output, err = e2e.runSSHCommand("sudo bash -c 'cd /home/%s/build && ./zarf init --confirm --components k3s'", e2e.username) + require.NoError(e2e.testing, err, output) - // Make sure `zarf --help` doesn't error - output, err := ssh.CheckSshCommandE(t, publicHost, fmt.Sprintf("sudo /home/%s/build/zarf --help", username)) - require.NoError(t, err, output) + // Deploy the game + output, err = e2e.runSSHCommand("sudo bash -c 'cd /home/%s/build && ./zarf package deploy zarf-package-appliance-demo-multi-games.tar.zst --confirm'", e2e.username) + require.NoError(e2e.testing, err, output) - // run `zarf init` - output, err = ssh.CheckSshCommandE(t, publicHost, fmt.Sprintf("sudo bash -c 'cd /home/%s/build && ./zarf init --confirm --components k3s'", username)) - require.NoError(t, err, output) + // Establish the port-forward into the game service; give the service a few seconds to come up since this is not a command we can retry + time.Sleep(5 * time.Second) + output, err = e2e.runSSHCommand("sudo bash -c '(/home/%s/build/zarf connect doom &> /dev/nul &)'", e2e.username) + require.NoError(e2e.testing, err, output) - // Deploy the game - output, err = ssh.CheckSshCommandE(t, publicHost, fmt.Sprintf("sudo bash -c 'cd /home/%s/build && ./zarf package deploy zarf-package-appliance-demo-multi-games.tar.zst --confirm'", username)) - require.NoError(t, err, output) + // // Wait for the game to be live. Right now we're just checking that `curl` returns 0. It can be enhanced by scraping the HTML that gets returned or something. + // output, err = e2e.runSSHCommand("timeout 300 bash -c 'while [[ \"$(curl -sfSL --retry 15 --retry-connrefused --retry-delay 5 -o /dev/null -w \"%{http_code}\" \"http://127.0.0.1\")\" != \"200\" ]]; do sleep 1; done' || false") + // require.NoError(e2e.testing, err, output) - // Establish the port-forward into the game service; give the service a few seconds to come up since this is not a command we can retry - time.Sleep(5 * time.Second) - portForwardCommand := fmt.Sprintf("sudo bash -c '(/home/%s/build/zarf connect doom &> /dev/nul &)'", username) - output, err = ssh.CheckSshCommandE(t, publicHost, portForwardCommand) - require.NoError(t, err, output) - - // Wait for the game to be live. Right now we're just checking that `curl` returns 0. It can be enhanced by scraping the HTML that gets returned or something. - output, err = ssh.CheckSshCommandE(t, publicHost, "timeout 300 bash -c 'while [[ \"$(curl -sfSL --retry 15 --retry-connrefused --retry-delay 5 -o /dev/null -w \"%{http_code}\" \"http://127.0.0.1\")\" != \"200\" ]]; do sleep 1; done' || false") - require.NoError(t, err, output) + // Run `zarf destroy` to make sure that works correctly + output, err = e2e.runSSHCommand("sudo bash -c 'cd /home/%s/build && ./zarf destroy --confirm'", e2e.username) + require.NoError(e2e.testing, err, output) + }) - // Run `zarf destroy` to make sure that works correctly - output, err = ssh.CheckSshCommandE(t, publicHost, fmt.Sprintf("sudo bash -c 'cd /home/%s/build && ./zarf destroy --confirm'", username)) - require.NoError(t, err, output) } diff --git a/test/e2e/e2e_general_cli_test.go b/test/e2e/e2e_general_cli_test.go index 575d731ccf..54b80d209d 100644 --- a/test/e2e/e2e_general_cli_test.go +++ b/test/e2e/e2e_general_cli_test.go @@ -4,110 +4,75 @@ import ( "fmt" "testing" - "github.com/gruntwork-io/terratest/modules/aws" - "github.com/gruntwork-io/terratest/modules/ssh" - "github.com/gruntwork-io/terratest/modules/terraform" teststructure "github.com/gruntwork-io/terratest/modules/test-structure" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) func TestGeneralCli(t *testing.T) { - t.Parallel() - // Our SSH username, will change based on which AMI we use - username := "ubuntu" - - // Copy the terraform folder to a temp directory so we can run multiple tests in parallel - tmpFolder := teststructure.CopyTerraformFolderToTemp(t, "..", "tf/public-ec2-instance") + e2e := NewE2ETest(t) // At the end of the test, run `terraform destroy` to clean up any resources that were created - defer teststructure.RunTestStage(t, "TEARDOWN", func() { - teardown(t, tmpFolder) - }) - - // Deploy the terraform infra - teststructure.RunTestStage(t, "SETUP", func() { - setup(t, tmpFolder) - }) + defer teststructure.RunTestStage(e2e.testing, "TEARDOWN", e2e.teardown) // Upload the Zarf artifacts - teststructure.RunTestStage(t, "UPLOAD", func() { - terraformOptions := teststructure.LoadTerraformOptions(t, tmpFolder) - keyPair := teststructure.LoadEc2KeyPair(t, tmpFolder) - - syncFileToRemoteServer(t, terraformOptions, keyPair, username, "../../build/zarf", fmt.Sprintf("/home/%s/build/zarf", username), "0700") + teststructure.RunTestStage(e2e.testing, "UPLOAD", func() { + e2e.syncFileToRemoteServer("../../build/zarf", fmt.Sprintf("/home/%s/build/zarf", e2e.username), "0700") }) - teststructure.RunTestStage(t, "TEST", func() { - terraformOptions := teststructure.LoadTerraformOptions(t, tmpFolder) - keyPair := teststructure.LoadEc2KeyPair(t, tmpFolder) - - // Finally run the actual test - testGeneralCliStuff(t, terraformOptions, keyPair, username) + teststructure.RunTestStage(e2e.testing, "TEST", func() { + // Test `zarf prepare sha256sum` for a local asset + expectedShasum := "61b50898f982d015ed87093ba822de0fe011cec6dd67db39f99d8c56391a6109\n" + output, err := e2e.runSSHCommand("cd /home/%s/build && echo 'random test data 🦄' > shasum-test-file", e2e.username) + require.NoError(e2e.testing, err, output) + + output, err = e2e.runSSHCommand("cd /home/%s/build && ./zarf prepare sha256sum shasum-test-file 2> /dev/null", e2e.username) + require.NoError(e2e.testing, err, output) + assert.Equal(e2e.testing, expectedShasum, output, "The expected SHASUM should equal the actual SHASUM") + + // Test `zarf prepare sha256sum` for a remote asset + expectedShasum = "c3cdea0573ba5a058ec090b5d2683bf398e8b1614c37ec81136ed03b78167617\n" + output, err = e2e.runSSHCommand("cd /home/%s/build && ./zarf prepare sha256sum https://zarf-public.s3-us-gov-west-1.amazonaws.com/pipelines/zarf-prepare-shasum-remote-test-file.txt 2> /dev/null", e2e.username) + require.NoError(e2e.testing, err, output) + assert.Equal(e2e.testing, expectedShasum, output, "The expected SHASUM should equal the actual SHASUM") + + // Test `zarf version` + output, err = e2e.runSSHCommand("cd /home/%s/build && ./zarf version", e2e.username) + require.NoError(e2e.testing, err, output) + assert.NotNil(e2e.testing, output) + assert.NotEqual(e2e.testing, len(output), 0, "Zarf version should not be an empty string") + assert.NotEqual(e2e.testing, string(output), "UnknownVersion", "Zarf version should not be the default value") + + // Test for expected failure when given a bad component input + output, err = e2e.runSSHCommand("cd /home/%s/build && ./zarf init --confirm --components k3s,foo,logging", e2e.username) + require.Error(e2e.testing, err, output) + + // Test for expected failure when given invalid hostnames + output, err = e2e.runSSHCommand("cd /home/%s/build && ./zarf init --confirm --host localhost", e2e.username) + require.Error(e2e.testing, err, output) + + output, err = e2e.runSSHCommand("cd /home/%s/build && ./zarf pki regenerate --host zarf@server", e2e.username) + require.Error(e2e.testing, err, output) + output, err = e2e.runSSHCommand("cd /home/%s/build && ./zarf pki regenerate --host some_unique_server", e2e.username) + require.Error(e2e.testing, err, output) + + // Test that `zarf package deploy` doesn't die when given a URL + // NOTE: Temporarily commenting this out because this seems out of scope for a general cli test. Having this included also means we would have to fully standup a `zarf init` command. + // TODO: Move this to it's own e2e test. + // output, err = ssh.CheckSshCommandE(t, publicHost, fmt.Sprintf("sudo bash -c 'cd /home/%s/build && ./zarf package deploy https://zarf-examples.s3.amazonaws.com/zarf-package-appliance-demo-doom.tar.zst --confirm --insecure'", username)) + // require.NoError(t, err, output) + // output, err = ssh.CheckSshCommandE(t, publicHost, fmt.Sprintf("sudo bash -c 'cd /home/%s/build && ./zarf package deploy https://zarf-examples.s3.amazonaws.com/zarf-package-appliance-demo-doom.tar.zst --confirm --shasum e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855'", username)) + // require.NoError(t, err, output) + + // Test that `zarf package deploy` gives an error if deploying a remote package without the --insecure or --shasum flags + output, err = e2e.runSSHCommand("sudo bash -c 'cd /home/%s/build && ./zarf package deploy https://zarf-examples.s3.amazonaws.com/zarf-package-appliance-demo-doom-20210125.tar.zst --confirm'", e2e.username) + require.Error(e2e.testing, err, output) + + // Test that changing the log level actually applies the requested level + output, _ = e2e.runSSHCommand("cd /home/%s/build && ./zarf version --log-level warn 1> /dev/null", e2e.username) + expectedOutString := "Log level set to warn" + require.Contains(e2e.testing, output, expectedOutString, "The log level should be changed to 'warn'") }) -} -func testGeneralCliStuff(t *testing.T, terraformOptions *terraform.Options, keyPair *aws.Ec2Keypair, username string) { - // Run `terraform output` to get the value of an output variable - publicInstanceIP := terraform.Output(t, terraformOptions, "public_instance_ip") - - // We're going to try to SSH to the instance IP, using the Key Pair we created earlier, and the user "ubuntu", - // as we know the Instance is running an Ubuntu AMI that has such a user - publicHost := ssh.Host{ - Hostname: publicInstanceIP, - SshKeyPair: keyPair.KeyPair, - SshUserName: username, - } - - // Test `zarf prepare sha256sum` for a local asset - expectedShasum := "61b50898f982d015ed87093ba822de0fe011cec6dd67db39f99d8c56391a6109\n" - output, err := ssh.CheckSshCommandE(t, publicHost, fmt.Sprintf("cd /home/%s/build && echo 'random test data 🦄' > shasum-test-file", username)) - require.NoError(t, err, output) - output, err = ssh.CheckSshCommandE(t, publicHost, fmt.Sprintf("cd /home/%s/build && ./zarf prepare sha256sum shasum-test-file 2> /dev/null", username)) - require.NoError(t, err, output) - assert.Equal(t, expectedShasum, output, "The expected SHASUM should equal the actual SHASUM") - - // Test `zarf prepare sha256sum` for a remote asset - expectedShasum = "c3cdea0573ba5a058ec090b5d2683bf398e8b1614c37ec81136ed03b78167617\n" - output, err = ssh.CheckSshCommandE(t, publicHost, fmt.Sprintf("cd /home/%s/build && ./zarf prepare sha256sum https://zarf-public.s3-us-gov-west-1.amazonaws.com/pipelines/zarf-prepare-shasum-remote-test-file.txt 2> /dev/null", username)) - require.NoError(t, err, output) - assert.Equal(t, expectedShasum, output, "The expected SHASUM should equal the actual SHASUM") - - // Test `zarf version` - output, err = ssh.CheckSshCommandE(t, publicHost, fmt.Sprintf("cd /home/%s/build && ./zarf version", username)) - require.NoError(t, err, output) - assert.NotNil(t, output) - assert.NotEqual(t, len(output), 0, "Zarf version should not be an empty string") - assert.NotEqual(t, string(output), "UnknownVersion", "Zarf version should not be the default value") - - // Test for expected failure when given a bad component input - output, err = ssh.CheckSshCommandE(t, publicHost, fmt.Sprintf("cd /home/%s/build && ./zarf init --confirm --components k3s,foo,logging", username)) - require.Error(t, err, output) - - // Test for expected failure when given invalid hostnames - output, err = ssh.CheckSshCommandE(t, publicHost, fmt.Sprintf("cd /home/%s/build && ./zarf init --confirm --host localhost", username)) - require.Error(t, err, output) - - output, err = ssh.CheckSshCommandE(t, publicHost, fmt.Sprintf("cd /home/%s/build && ./zarf pki regenerate --host zarf@server", username)) - require.Error(t, err, output) - output, err = ssh.CheckSshCommandE(t, publicHost, fmt.Sprintf("cd /home/%s/build && ./zarf pki regenerate --host some_unique_server", username)) - require.Error(t, err, output) - - // Test that `zarf package deploy` doesn't die when given a URL - // NOTE: Temporarily commenting this out because this seems out of scope for a general cli test. Having this included also means we would have to fully standup a `zarf init` command. - // TODO: Move this to it's own e2e test. - // output, err = ssh.CheckSshCommandE(t, publicHost, fmt.Sprintf("sudo bash -c 'cd /home/%s/build && ./zarf package deploy https://zarf-examples.s3.amazonaws.com/zarf-package-appliance-demo-doom.tar.zst --confirm --insecure'", username)) - // require.NoError(t, err, output) - // output, err = ssh.CheckSshCommandE(t, publicHost, fmt.Sprintf("sudo bash -c 'cd /home/%s/build && ./zarf package deploy https://zarf-examples.s3.amazonaws.com/zarf-package-appliance-demo-doom.tar.zst --confirm --shasum e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855'", username)) - // require.NoError(t, err, output) - - // Test that `zarf package deploy` gives an error if deploying a remote package without the --insecure or --shasum flags - output, err = ssh.CheckSshCommandE(t, publicHost, fmt.Sprintf("sudo bash -c 'cd /home/%s/build && ./zarf package deploy https://zarf-examples.s3.amazonaws.com/zarf-package-appliance-demo-doom-20210125.tar.zst --confirm'", username)) - require.Error(t, err, output) - - // Test that changing the log level actually applies the requested level - output, _ = ssh.CheckSshCommandE(t, publicHost, fmt.Sprintf("cd /home/%s/build && ./zarf version --log-level warn 1> /dev/null", username)) - expectedOutString := "Log level set to warn" - require.Contains(t, output, expectedOutString, "The log level should be changed to 'warn'") } diff --git a/test/e2e/e2e_git_based_helm_chart_test.go b/test/e2e/e2e_git_based_helm_chart_test.go index 54579e03cd..893c8e3a27 100644 --- a/test/e2e/e2e_git_based_helm_chart_test.go +++ b/test/e2e/e2e_git_based_helm_chart_test.go @@ -2,72 +2,38 @@ package test import ( "fmt" - "github.com/gruntwork-io/terratest/modules/aws" - "github.com/gruntwork-io/terratest/modules/ssh" - "github.com/gruntwork-io/terratest/modules/terraform" + "testing" + teststructure "github.com/gruntwork-io/terratest/modules/test-structure" "github.com/stretchr/testify/require" - "testing" ) func TestGitBasedHelmChart(t *testing.T) { - t.Parallel() - // Our SSH username, will change based on which AMI we use - username := "ubuntu" - - // Copy the terraform folder to a temp directory so we can run multiple tests in parallel - tmpFolder := teststructure.CopyTerraformFolderToTemp(t, "..", "tf/public-ec2-instance") + e2e := NewE2ETest(t) // At the end of the test, run `terraform destroy` to clean up any resources that were created - defer teststructure.RunTestStage(t, "TEARDOWN", func() { - teardown(t, tmpFolder) - }) - - // Deploy the terraform infra - teststructure.RunTestStage(t, "SETUP", func() { - setup(t, tmpFolder) - }) + defer teststructure.RunTestStage(e2e.testing, "TEARDOWN", e2e.teardown) // Upload the Zarf artifacts - teststructure.RunTestStage(t, "UPLOAD", func() { - terraformOptions := teststructure.LoadTerraformOptions(t, tmpFolder) - keyPair := teststructure.LoadEc2KeyPair(t, tmpFolder) + teststructure.RunTestStage(e2e.testing, "UPLOAD", func() { - syncFileToRemoteServer(t, terraformOptions, keyPair, username, "../../build/zarf", fmt.Sprintf("/home/%s/build/zarf", username), "0700") - syncFileToRemoteServer(t, terraformOptions, keyPair, username, "../../build/zarf-init.tar.zst", fmt.Sprintf("/home/%s/build/zarf-init.tar.zst", username), "0600") - syncFileToRemoteServer(t, terraformOptions, keyPair, username, "../../build/zarf-package-big-bang-single-package-demo.tar.zst", fmt.Sprintf("/home/%s/build/zarf-package-big-bang-single-package-demo.tar.zst", username), "0600") + e2e.syncFileToRemoteServer("../../build/zarf", fmt.Sprintf("/home/%s/build/zarf", e2e.username), "0700") + e2e.syncFileToRemoteServer("../../build/zarf-init.tar.zst", fmt.Sprintf("/home/%s/build/zarf-init.tar.zst", e2e.username), "0600") + e2e.syncFileToRemoteServer("../../build/zarf-package-big-bang-single-package-demo.tar.zst", fmt.Sprintf("/home/%s/build/zarf-package-big-bang-single-package-demo.tar.zst", e2e.username), "0600") }) - teststructure.RunTestStage(t, "TEST", func() { - terraformOptions := teststructure.LoadTerraformOptions(t, tmpFolder) - keyPair := teststructure.LoadEc2KeyPair(t, tmpFolder) + teststructure.RunTestStage(e2e.testing, "TEST", func() { + // run `zarf init` + output, err := e2e.runSSHCommand("sudo bash -c 'cd /home/%s/build && ./zarf init --confirm --components k3s'", e2e.username) + require.NoError(e2e.testing, err, output) - // Finally run the actual test - runGitBasedCliTest(t, terraformOptions, keyPair, username) - }) -} - -func runGitBasedCliTest(t *testing.T, terraformOptions *terraform.Options, keyPair *aws.Ec2Keypair, username string) { - // Run `terraform output` to get the value of an output variable - publicInstanceIP := terraform.Output(t, terraformOptions, "public_instance_ip") + // Deploy the single-big-bang-package example + output, err = e2e.runSSHCommand("sudo bash -c 'cd /home/%s/build && ./zarf package deploy zarf-package-big-bang-single-package-demo.tar.zst --confirm'", e2e.username) + require.NoError(e2e.testing, err, output) - // We're going to try to SSH to the instance IP, using the Key Pair we created earlier, and the user "ubuntu", - // as we know the Instance is running an Ubuntu AMI that has such a user - publicHost := ssh.Host{ - Hostname: publicInstanceIP, - SshKeyPair: keyPair.KeyPair, - SshUserName: username, - } - - // run `zarf init` - output, err := ssh.CheckSshCommandE(t, publicHost, fmt.Sprintf("sudo bash -c 'cd /home/%s/build && ./zarf init --confirm --components k3s'", username)) - require.NoError(t, err, output) - - // Deploy the single-big-bang-package example - output, err = ssh.CheckSshCommandE(t, publicHost, fmt.Sprintf("sudo bash -c 'cd /home/%s/build && ./zarf package deploy zarf-package-big-bang-single-package-demo.tar.zst --confirm'", username)) - require.NoError(t, err, output) + // Wait until the deployment is ready + output, err = e2e.runSSHCommand(`timeout 300 sudo bash -c 'while [ "$(/usr/local/bin/kubectl get pods -n twistlock -l app=twistlock-console --field-selector=status.phase=Running -o json | jq -r '"'"'.items | length'"'"')" -lt "1" ]; do sleep 1; done' || false`) + require.NoError(e2e.testing, err, output) + }) - // Wait until the deployment is ready - output, err = ssh.CheckSshCommandE(t, publicHost, `timeout 300 sudo bash -c 'while [ "$(/usr/local/bin/kubectl get pods -n twistlock -l app=twistlock-console --field-selector=status.phase=Running -o json | jq -r '"'"'.items | length'"'"')" -lt "1" ]; do sleep 1; done' || false`) - require.NoError(t, err, output) } diff --git a/test/e2e/e2e_gitea_and_grafana_test.go b/test/e2e/e2e_gitea_and_grafana_test.go index 5aa12171a7..0fa3f3a9ad 100644 --- a/test/e2e/e2e_gitea_and_grafana_test.go +++ b/test/e2e/e2e_gitea_and_grafana_test.go @@ -5,80 +5,41 @@ import ( "testing" "time" - "github.com/gruntwork-io/terratest/modules/aws" - "github.com/gruntwork-io/terratest/modules/ssh" - "github.com/gruntwork-io/terratest/modules/terraform" teststructure "github.com/gruntwork-io/terratest/modules/test-structure" "github.com/stretchr/testify/require" ) func TestGiteaAndGrafana(t *testing.T) { - t.Parallel() - - // Our SSH username, will change based on which AMI we use - username := "ubuntu" - - // Copy the terraform folder to a temp directory so we can run multiple tests in parallel - tmpFolder := teststructure.CopyTerraformFolderToTemp(t, "..", "tf/public-ec2-instance") + e2e := NewE2ETest(t) // At the end of the test, run `terraform destroy` to clean up any resources that were created - defer teststructure.RunTestStage(t, "TEARDOWN", func() { - teardown(t, tmpFolder) - }) - - // Deploy the terraform infra - teststructure.RunTestStage(t, "SETUP", func() { - setup(t, tmpFolder) - }) + defer teststructure.RunTestStage(e2e.testing, "TEARDOWN", e2e.teardown) // Upload the Zarf artifacts - teststructure.RunTestStage(t, "UPLOAD", func() { - terraformOptions := teststructure.LoadTerraformOptions(t, tmpFolder) - keyPair := teststructure.LoadEc2KeyPair(t, tmpFolder) - - syncFileToRemoteServer(t, terraformOptions, keyPair, username, "../../build/zarf", fmt.Sprintf("/home/%s/build/zarf", username), "0700") - syncFileToRemoteServer(t, terraformOptions, keyPair, username, "../../build/zarf-init.tar.zst", fmt.Sprintf("/home/%s/build/zarf-init.tar.zst", username), "0600") + teststructure.RunTestStage(e2e.testing, "UPLOAD", func() { + e2e.syncFileToRemoteServer("../../build/zarf", fmt.Sprintf("/home/%s/build/zarf", e2e.username), "0700") + e2e.syncFileToRemoteServer("../../build/zarf-init.tar.zst", fmt.Sprintf("/home/%s/build/zarf-init.tar.zst", e2e.username), "0600") }) - teststructure.RunTestStage(t, "TEST", func() { - terraformOptions := teststructure.LoadTerraformOptions(t, tmpFolder) - keyPair := teststructure.LoadEc2KeyPair(t, tmpFolder) + teststructure.RunTestStage(e2e.testing, "TEST", func() { + // run `zarf init` + output, err := e2e.runSSHCommand("sudo bash -c 'cd /home/%s/build && ./zarf init --confirm --components k3s,logging,gitops-service'", e2e.username) + require.NoError(e2e.testing, err, output) - // Finally run the actual test - testGiteaAndGrafana(t, terraformOptions, keyPair, username) - }) -} - -func testGiteaAndGrafana(t *testing.T, terraformOptions *terraform.Options, keyPair *aws.Ec2Keypair, username string) { - // Run `terraform output` to get the value of an output variable - publicInstanceIP := terraform.Output(t, terraformOptions, "public_instance_ip") + // Establish the port-forward into the gitea service; give the service a few seconds to come up since this is not a command we can retry + time.Sleep(15 * time.Second) + _, _ = e2e.runSSHCommand("sudo bash -c '(/home/%s/build/zarf connect git &> /dev/nul &)'", e2e.username) - // We're going to try to SSH to the instance IP, using the Key Pair we created earlier, and the user "ubuntu", - // as we know the Instance is running an Ubuntu AMI that has such a user - publicHost := ssh.Host{ - Hostname: publicInstanceIP, - SshKeyPair: keyPair.KeyPair, - SshUserName: username, - } + // // Make sure Gitea comes up cleanly + // output, err = e2e.runSSHCommand(`timeout 300 bash -c 'while [[ \"$(curl -sfSL --retry 15 --retry-connrefused --retry-delay 5 -o /dev/null -w \"%{http_code}\" \"http://127.0.0.1:45003/explore/repos\")\" != \"200\" ]]; do sleep 1; done' || false`) + // require.NoError(e2e.testing, err, output) - // run `zarf init` - output, err := ssh.CheckSshCommandE(t, publicHost, fmt.Sprintf("sudo bash -c 'cd /home/%s/build && ./zarf init --confirm --components k3s,logging,gitops-service'", username)) - require.NoError(t, err, output) + // // Establish the port-forward into the logging service + // _, _ = e2e.runSSHCommand("sudo bash -c '(/home/%s/build/zarf connect logging &> /dev/nul &)'", e2e.username) - // Establish the port-forward into the gitea service; give the service a few seconds to come up since this is not a command we can retry - time.Sleep(15 * time.Second) - portForwardCommand := fmt.Sprintf("sudo bash -c '(/home/%s/build/zarf connect git &> /dev/nul &)'", username) - output, err = ssh.CheckSshCommandE(t, publicHost, portForwardCommand) - - // Make sure Gitea comes up cleanly - output, err = ssh.CheckSshCommandE(t, publicHost, "timeout 300 bash -c 'while [[ \"$(curl -sfSL --retry 15 --retry-connrefused --retry-delay 5 -o /dev/null -w \"%{http_code}\" \"http://127.0.0.1:45003/explore/repos\")\" != \"200\" ]]; do sleep 1; done' || false") - require.NoError(t, err, output) - - // Establish the port-forward into the logging service - portForwardCommand = fmt.Sprintf("sudo bash -c '(/home/%s/build/zarf connect logging &> /dev/nul &)'", username) - output, err = ssh.CheckSshCommandE(t, publicHost, portForwardCommand) + // // Make sure Grafana comes up cleanly + // output, err = e2e.runSSHCommand(`timeout 300 bash -c 'while [[ \"$(curl -sfSL --retry 15 --retry-connrefused --retry-delay 5 -o /dev/null -w \"%{http_code}\" \"http://127.0.0.1:45002/monitor/login\")\" != \"200\" ]]; do sleep 1; done' || false`) + // require.NoError(e2e.testing, err, output) + }) - // Make sure Grafana comes up cleanly - output, err = ssh.CheckSshCommandE(t, publicHost, "timeout 300 bash -c 'while [[ \"$(curl -sfSL --retry 15 --retry-connrefused --retry-delay 5 -o /dev/null -w \"%{http_code}\" \"http://127.0.0.1:45002/monitor/login\")\" != \"200\" ]]; do sleep 1; done' || false") - require.NoError(t, err, output) } From bbb40b6fd41746961a898953110ca2ff7125c905 Mon Sep 17 00:00:00 2001 From: Jeff McCoy Date: Tue, 1 Feb 2022 03:02:39 -0600 Subject: [PATCH 68/88] Remove git-based helm chart test because the registry in the zarf init package is actually a git-based helm chart, every other test that deploys anything covers this. Have to just mock the make target until this PR is merged or the CI will explode. --- .github/workflows/test-command.yml | 97 ----------------------- Makefile | 6 +- test/e2e/e2e_git_based_helm_chart_test.go | 39 --------- 3 files changed, 4 insertions(+), 138 deletions(-) delete mode 100644 test/e2e/e2e_git_based_helm_chart_test.go diff --git a/.github/workflows/test-command.yml b/.github/workflows/test-command.yml index 75d9acb680..bf91f359fc 100644 --- a/.github/workflows/test-command.yml +++ b/.github/workflows/test-command.yml @@ -457,103 +457,6 @@ jobs: GITHUB_REF: ${{ github.event.client_payload.pull_request.head.ref }} GITHUB_OWNER: ${{ github.event.client_payload.github.payload.repository.owner.login }} - # Run the E2E test of a Git-based Helm chart - e2e-git-based-helm-chart: - runs-on: ubuntu-latest - needs: [parse, build] - if: needs.parse.outputs.run-e2e == 'true' - container: cloudposse/test-harness:latest - steps: - # Update GitHub status for pending pipeline run - - name: "Update GitHub Status for pending" - uses: docker://cloudposse/github-status-updater - with: - args: "-action update_state -ref ${{ github.event.client_payload.pull_request.head.sha }} -repo ${{ github.event.client_payload.github.payload.repository.name }}" - env: - GITHUB_TOKEN: ${{ secrets.PAT }} - GITHUB_STATE: pending - GITHUB_CONTEXT: "/test e2e - Git-Based Helm Chart" - GITHUB_DESCRIPTION: "started by @${{ github.event.client_payload.github.actor }}" - GITHUB_TARGET_URL: https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }} - GITHUB_REF: ${{ github.event.client_payload.pull_request.head.ref }} - GITHUB_OWNER: ${{ github.event.client_payload.github.payload.repository.owner.login }} - - # Checkout the code from GitHub Pull Request - - name: "Checkout the code" - uses: actions/checkout@v2 - with: - token: ${{ secrets.PAT }} - repository: ${{ github.event.client_payload.pull_request.head.repo.full_name }} - ref: ${{ github.event.client_payload.pull_request.head.ref }} - - # Download the built artifacts - - name: "Download the built artifacts" - uses: actions/download-artifact@v2 - - - name: "Run E2E tests" - shell: bash -x -e -o pipefail {0} - env: - AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID_DEFENSEUNICORNS_COMMERCIAL_SA_ZARF }} - AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY_DEFENSEUNICORNS_COMMERCIAL_SA_ZARF }} - AWS_DEFAULT_REGION: us-east-1 - run: | - # cloudposse/test-harness has golang 1.15, we need 1.16. This is the easiest way I know to do it. This should definitely be revisited and cleaned up. - git clone --branch v0.8.0 --depth 1 https://github.com/asdf-vm/asdf.git $HOME/.asdf - source ~/.asdf/asdf.sh - export PATH="$HOME/.asdf/bin:$PATH" - asdf plugin-add golang https://github.com/kennyp/asdf-golang.git - asdf install golang 1.16.7 - asdf global golang 1.16.7 - export GOPATH="$HOME/go" - export PATH="$PATH:$GOPATH/bin" - chmod +x build/zarf - ./build/zarf tools registry login registry1.dso.mil --username "${{ secrets.REGISTRY1_USERNAME_ZARF_ROBOT }}" --password "${{ secrets.REGISTRY1_PASSWORD_ZARF_ROBOT }}" - make test-cloud-e2e-git-based-helm-chart - - # Update GitHub status for failing pipeline run - - name: "Update GitHub Status for failure" - if: ${{ failure() }} - uses: docker://cloudposse/github-status-updater - with: - args: "-action update_state -ref ${{ github.event.client_payload.pull_request.head.sha }} -repo ${{ github.event.client_payload.github.payload.repository.name }}" - env: - GITHUB_TOKEN: ${{ secrets.PAT }} - GITHUB_STATE: failure - GITHUB_CONTEXT: "/test e2e - Git-Based Helm Chart" - GITHUB_DESCRIPTION: "run failed" - GITHUB_TARGET_URL: https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }} - GITHUB_REF: ${{ github.event.client_payload.pull_request.head.ref }} - GITHUB_OWNER: ${{ github.event.client_payload.github.payload.repository.owner.login }} - - # Update GitHub status for successful pipeline run - - name: "Update GitHub Status for success" - uses: docker://cloudposse/github-status-updater - with: - args: "-action update_state -ref ${{ github.event.client_payload.pull_request.head.sha }} -repo ${{ github.event.client_payload.github.payload.repository.name }}" - env: - GITHUB_TOKEN: ${{ secrets.PAT }} - GITHUB_STATE: success - GITHUB_CONTEXT: "/test e2e - Git-Based Helm Chart" - GITHUB_DESCRIPTION: "run passed" - GITHUB_TARGET_URL: https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }} - GITHUB_REF: ${{ github.event.client_payload.pull_request.head.ref }} - GITHUB_OWNER: ${{ github.event.client_payload.github.payload.repository.owner.login }} - - # Update GitHub status for cancelled pipeline run - - name: "Update GitHub Status for cancelled" - if: ${{ cancelled() }} - uses: docker://cloudposse/github-status-updater - with: - args: "-action update_state -ref ${{ github.event.client_payload.pull_request.head.sha }} -repo ${{ github.event.client_payload.github.payload.repository.name }}" - env: - GITHUB_TOKEN: ${{ secrets.PAT }} - GITHUB_STATE: error - GITHUB_CONTEXT: "/test e2e - Git-Based Helm Chart" - GITHUB_DESCRIPTION: "run cancelled" - GITHUB_TARGET_URL: https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }} - GITHUB_REF: ${{ github.event.client_payload.pull_request.head.ref }} - GITHUB_OWNER: ${{ github.event.client_payload.github.payload.repository.owner.login }} - # Run E2E test for general CLI stuff e2e-general-cli: runs-on: ubuntu-latest diff --git a/Makefile b/Makefile index 8591a6d28e..6be42b17b2 100644 --- a/Makefile +++ b/Makefile @@ -90,9 +90,11 @@ test-cloud-e2e-gitops: package-example-gitops-data ## E2E test of Gitops example test-cloud-e2e-data-injection: package-example-data-injection ## E2E test of the Data Injection example. Requires access to an AWS account. Costs money. Make sure you ran the `build-cli` and `init-package` targets first cd test/e2e && go test ./... -run TestDataInjection -v -timeout 1200s +################ BEGIN Pending removal post-merge .PHONY: test-cloud-e2e-git-based-helm-chart -test-cloud-e2e-git-based-helm-chart: package-example-single-big-bang-package ## E2E test of the Data Injection example. Requires access to an AWS account. Costs money. Make sure you ran the `build-cli` and `init-package` targets first - cd test/e2e && go test ./... -run TestGitBasedHelmChart -v -timeout 1200s +test-cloud-e2e-git-based-helm-chart: + echo done +################ END Pending removal post-merge .PHONY: test-cloud-e2e-general-cli test-cloud-e2e-general-cli: ## Runs tests of the CLI that don't need a cluster diff --git a/test/e2e/e2e_git_based_helm_chart_test.go b/test/e2e/e2e_git_based_helm_chart_test.go deleted file mode 100644 index 893c8e3a27..0000000000 --- a/test/e2e/e2e_git_based_helm_chart_test.go +++ /dev/null @@ -1,39 +0,0 @@ -package test - -import ( - "fmt" - "testing" - - teststructure "github.com/gruntwork-io/terratest/modules/test-structure" - "github.com/stretchr/testify/require" -) - -func TestGitBasedHelmChart(t *testing.T) { - e2e := NewE2ETest(t) - - // At the end of the test, run `terraform destroy` to clean up any resources that were created - defer teststructure.RunTestStage(e2e.testing, "TEARDOWN", e2e.teardown) - - // Upload the Zarf artifacts - teststructure.RunTestStage(e2e.testing, "UPLOAD", func() { - - e2e.syncFileToRemoteServer("../../build/zarf", fmt.Sprintf("/home/%s/build/zarf", e2e.username), "0700") - e2e.syncFileToRemoteServer("../../build/zarf-init.tar.zst", fmt.Sprintf("/home/%s/build/zarf-init.tar.zst", e2e.username), "0600") - e2e.syncFileToRemoteServer("../../build/zarf-package-big-bang-single-package-demo.tar.zst", fmt.Sprintf("/home/%s/build/zarf-package-big-bang-single-package-demo.tar.zst", e2e.username), "0600") - }) - - teststructure.RunTestStage(e2e.testing, "TEST", func() { - // run `zarf init` - output, err := e2e.runSSHCommand("sudo bash -c 'cd /home/%s/build && ./zarf init --confirm --components k3s'", e2e.username) - require.NoError(e2e.testing, err, output) - - // Deploy the single-big-bang-package example - output, err = e2e.runSSHCommand("sudo bash -c 'cd /home/%s/build && ./zarf package deploy zarf-package-big-bang-single-package-demo.tar.zst --confirm'", e2e.username) - require.NoError(e2e.testing, err, output) - - // Wait until the deployment is ready - output, err = e2e.runSSHCommand(`timeout 300 sudo bash -c 'while [ "$(/usr/local/bin/kubectl get pods -n twistlock -l app=twistlock-console --field-selector=status.phase=Running -o json | jq -r '"'"'.items | length'"'"')" -lt "1" ]; do sleep 1; done' || false`) - require.NoError(e2e.testing, err, output) - }) - -} From 7de3bff6810300348a93ae502a540fa24ebdb723 Mon Sep 17 00:00:00 2001 From: Jeff McCoy Date: Tue, 1 Feb 2022 14:00:48 -0600 Subject: [PATCH 69/88] update package deploy order to not make flux sad --- cli/internal/packager/deploy.go | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/cli/internal/packager/deploy.go b/cli/internal/packager/deploy.go index cc0b79e6d7..1efa5150c0 100644 --- a/cli/internal/packager/deploy.go +++ b/cli/internal/packager/deploy.go @@ -217,6 +217,11 @@ func deployComponents(tempPath tempPaths, component types.ZarfComponent) { images.PushToZarfRegistry(tempPath.images, component.Images, config.ZarfRegistry) } + if hasRepos { + // Push all the repos from the extracted archive + git.PushAllDirectories(componentPath.repos) + } + for _, chart := range component.Charts { // zarf magic for the value file for idx := range chart.ValuesFiles { @@ -250,11 +255,6 @@ func deployComponents(tempPath tempPaths, component types.ZarfComponent) { } } - if hasRepos { - // Push all the repos from the extracted archive - git.PushAllDirectories(componentPath.repos) - } - for _, script := range component.Scripts.After { loopScriptUntilSuccess(script, component.Scripts.Retry) } From 07c45a709868549259cf0e72a51cc229094789c3 Mon Sep 17 00:00:00 2001 From: Jeff McCoy Date: Tue, 1 Feb 2022 14:01:00 -0600 Subject: [PATCH 70/88] increase registry limits for larger image pushes --- assets/charts/registry-values.yaml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/assets/charts/registry-values.yaml b/assets/charts/registry-values.yaml index b67252a0c5..bb33b3f767 100644 --- a/assets/charts/registry-values.yaml +++ b/assets/charts/registry-values.yaml @@ -13,8 +13,8 @@ service: nodePort: "###ZARF_REGISTRY_NODEPORT###" resources: requests: - cpu: "100m" - memory: "512Mi" + cpu: "500m" + memory: "256Mi" limits: - cpu: "1" + cpu: "3" memory: "2Gi" From 6a3a3e2998f56dcfe53069590eee332bc6569fb9 Mon Sep 17 00:00:00 2001 From: Jon Perry Date: Tue, 1 Feb 2022 15:08:24 -0500 Subject: [PATCH 71/88] simplify e2e curl command --- test/e2e/e2e_example_game_test.go | 8 ++++---- test/e2e/e2e_gitea_and_grafana_test.go | 14 +++++++------- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/test/e2e/e2e_example_game_test.go b/test/e2e/e2e_example_game_test.go index 6a0051f0e5..5a9e3852b5 100644 --- a/test/e2e/e2e_example_game_test.go +++ b/test/e2e/e2e_example_game_test.go @@ -38,12 +38,12 @@ func TestE2eExampleGame(t *testing.T) { // Establish the port-forward into the game service; give the service a few seconds to come up since this is not a command we can retry time.Sleep(5 * time.Second) - output, err = e2e.runSSHCommand("sudo bash -c '(/home/%s/build/zarf connect doom &> /dev/nul &)'", e2e.username) + output, err = e2e.runSSHCommand("sudo bash -c '(/home/%s/build/zarf connect doom --local-port 22333 &> /dev/nul &)'", e2e.username) require.NoError(e2e.testing, err, output) - // // Wait for the game to be live. Right now we're just checking that `curl` returns 0. It can be enhanced by scraping the HTML that gets returned or something. - // output, err = e2e.runSSHCommand("timeout 300 bash -c 'while [[ \"$(curl -sfSL --retry 15 --retry-connrefused --retry-delay 5 -o /dev/null -w \"%{http_code}\" \"http://127.0.0.1\")\" != \"200\" ]]; do sleep 1; done' || false") - // require.NoError(e2e.testing, err, output) + // Right now we're just checking that `curl` returns 0. It can be enhanced by scraping the HTML that gets returned or something. + output, err = e2e.runSSHCommand("bash -c '[[ $(curl -sfSL --retry 15 --retry-connrefused --retry-delay 5 -o /dev/null -w \"%%{http_code}\" 'http://127.0.0.1:22333?doom') == 200 ]]'") + require.NoError(e2e.testing, err, output) // Run `zarf destroy` to make sure that works correctly output, err = e2e.runSSHCommand("sudo bash -c 'cd /home/%s/build && ./zarf destroy --confirm'", e2e.username) diff --git a/test/e2e/e2e_gitea_and_grafana_test.go b/test/e2e/e2e_gitea_and_grafana_test.go index 0fa3f3a9ad..623b2af908 100644 --- a/test/e2e/e2e_gitea_and_grafana_test.go +++ b/test/e2e/e2e_gitea_and_grafana_test.go @@ -30,16 +30,16 @@ func TestGiteaAndGrafana(t *testing.T) { time.Sleep(15 * time.Second) _, _ = e2e.runSSHCommand("sudo bash -c '(/home/%s/build/zarf connect git &> /dev/nul &)'", e2e.username) - // // Make sure Gitea comes up cleanly - // output, err = e2e.runSSHCommand(`timeout 300 bash -c 'while [[ \"$(curl -sfSL --retry 15 --retry-connrefused --retry-delay 5 -o /dev/null -w \"%{http_code}\" \"http://127.0.0.1:45003/explore/repos\")\" != \"200\" ]]; do sleep 1; done' || false`) - // require.NoError(e2e.testing, err, output) + // Make sure Gitea comes up cleanly + output, err = e2e.runSSHCommand(`bash -c '[[ $(curl -sfSL -o /dev/null -w '%%{http_code}' 'http://127.0.0.1:45003/explore/repos') == 200 ]]'`) + require.NoError(e2e.testing, err, output) - // // Establish the port-forward into the logging service - // _, _ = e2e.runSSHCommand("sudo bash -c '(/home/%s/build/zarf connect logging &> /dev/nul &)'", e2e.username) + // Establish the port-forward into the logging service + _, _ = e2e.runSSHCommand("sudo bash -c '(/home/%s/build/zarf connect logging &> /dev/nul &)'", e2e.username) // // Make sure Grafana comes up cleanly - // output, err = e2e.runSSHCommand(`timeout 300 bash -c 'while [[ \"$(curl -sfSL --retry 15 --retry-connrefused --retry-delay 5 -o /dev/null -w \"%{http_code}\" \"http://127.0.0.1:45002/monitor/login\")\" != \"200\" ]]; do sleep 1; done' || false`) - // require.NoError(e2e.testing, err, output) + output, err = e2e.runSSHCommand(`bash -c ' [[ $(curl -sfSL -o /dev/null -w '%%{http_code}' 'http://127.0.0.1:45002/monitor/login') == 200]]'`) + require.NoError(e2e.testing, err, output) }) } From 83ae0b9bcd23237e2e6ab3c30033df3d75801f1f Mon Sep 17 00:00:00 2001 From: Jon Perry Date: Tue, 1 Feb 2022 15:55:59 -0500 Subject: [PATCH 72/88] fix spacing in logging e2e bash command --- test/e2e/e2e_gitea_and_grafana_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/e2e/e2e_gitea_and_grafana_test.go b/test/e2e/e2e_gitea_and_grafana_test.go index 623b2af908..ab77305ff8 100644 --- a/test/e2e/e2e_gitea_and_grafana_test.go +++ b/test/e2e/e2e_gitea_and_grafana_test.go @@ -38,7 +38,7 @@ func TestGiteaAndGrafana(t *testing.T) { _, _ = e2e.runSSHCommand("sudo bash -c '(/home/%s/build/zarf connect logging &> /dev/nul &)'", e2e.username) // // Make sure Grafana comes up cleanly - output, err = e2e.runSSHCommand(`bash -c ' [[ $(curl -sfSL -o /dev/null -w '%%{http_code}' 'http://127.0.0.1:45002/monitor/login') == 200]]'`) + output, err = e2e.runSSHCommand(`bash -c '[[ $(curl -sfSL -o /dev/null -w '%%{http_code}' 'http://127.0.0.1:45002/monitor/login') == 200 ]]'`) require.NoError(e2e.testing, err, output) }) From e025dbb7270cb94c9ce758eedb7a6453cd4295e0 Mon Sep 17 00:00:00 2001 From: Jonathan Perry Date: Tue, 1 Feb 2022 19:54:37 -0500 Subject: [PATCH 73/88] slight modifications to example README's after multi-distro changes (#260) --- examples/big-bang/README.md | 4 +- examples/data-injection/README.md | 3 +- examples/game/README.md | 45 +--------------------- examples/postgres-operator/README.md | 5 ++- examples/single-big-bang-package/README.md | 15 ++++++-- 5 files changed, 20 insertions(+), 52 deletions(-) diff --git a/examples/big-bang/README.md b/examples/big-bang/README.md index cd7e48035f..69ecff2f5d 100644 --- a/examples/big-bang/README.md +++ b/examples/big-bang/README.md @@ -17,9 +17,9 @@ Because the same cluster will be running both Traefik and Istio, Istio's Virtual - `make all` - Download the latest version of Zarf, build the deploy package, and start a VM with Vagrant - `make all-dev` - Build Zarf locally, build the deploy package, and start a VM with Vagrant 2. Run: `./zarf init --confirm --components k3s,gitops-service` - Initialize Zarf, telling it to install the management component and gitops service and skip logging component (since BB has logging already) and tells Zarf to use `localhost` as the domain. If you want to use interactive mode instead just run `./zarf init`. -3. Wait a bit, run `k9s` to see pods come up. Don't move on until everything is running +3. Wait a bit, run `./zarf tools k9s` to see pods come up. Don't move on until everything is running 4. Run: `./zarf package deploy zarf-package-big-bang-core-demo.tar.zst --components kubescape --confirm` - Deploy Big Bang Core. If you want interactive mode instead just run `./zarf package deploy`, it will give you a picker to choose the package. -5. Wait several minutes. Run `k9s` to watch progress +5. Wait several minutes. Run `./zarf tools k9s` to watch progress 6. :warning: `kubectl delete -n istio-system envoyfilter/misdirected-request` (due to [this bug](https://repo1.dso.mil/platform-one/big-bang/bigbang/-/issues/802)) 7. Use a browser to visit the various services, available at https://*.bigbang.dev:9443 8. When you're done, run `exit` to leave the VM then `make vm-destroy` to bring everything down diff --git a/examples/data-injection/README.md b/examples/data-injection/README.md index 62d805f368..2f709ffeee 100644 --- a/examples/data-injection/README.md +++ b/examples/data-injection/README.md @@ -4,4 +4,5 @@ This example demonstrates using Zarf in a very low-resources/singlue-use environ ### Steps to use: 1. Create a Zarf cluster as outlined in the main [README](../../README.md#2-create-the-zarf-cluster) -2. Follow [step 3](../../README.md#3-add-resources-to-the-zarf-cluster) using this config in this folder +2. Run `zarf package create` in this directory to build this example package. +3. Run `zarf package deploy zarf-package-data-injection-demo.tar` diff --git a/examples/game/README.md b/examples/game/README.md index a00c291eec..cb188234e6 100644 --- a/examples/game/README.md +++ b/examples/game/README.md @@ -145,50 +145,7 @@ Respond as appropriate and in a couple seconds the cluster will have loaded your privacy error - -Navigate your browser to `https://localhost` and be greeted by... a "Privacy error"? What's that about?! - -### Privacy error - -Long-story-short, **it's a false alarm**—your connection _is_ private and _no one_ is trying steal your information. - -Long-story-long, your browser is showing you this because a bare bones, default install of Zarf **generates its own certificate authority (CA)** during install, which it then uses to create certificates to back `https` requests. - -The certificates generated by this CA—and used to secure Zarf cluster services—are perfectly reasonably, secure certificates, it's just that your browser does not recognize the recently-generated CA and so warns you. - ->_**Further reading**_ -> -> If you're interested in this "trusted certificates" + "https" thing, the internet abounds with resources—this [wikipedia article](https://en.wikipedia.org/wiki/Self-signed_certificate) is a great place to start. - -  - -### Proceed anyway - - -proceed anyway - - -With an understanding of _why there is no danger here_, you can proceed to the example after some one-time (per Zarf cluster) browser "risk" acceptance: - -1. Click the "Not secure" warning (at the left of the location bar) to view the site security information. - -1. Click the "Certificate is not valid" row to show the certificate information popup. - -1. Verify the certificate has: - - - an "Issued By" block showing the **Zarf Private Certificate Authority** issuer, and - - - a "Validity Period" block showing that the certificate is not expired. - - Once you're comfortable with the Zarf certificate, you can close the certificate popup. - -1. To tell the browser that _you trust the Zarf-issued certificate_, click the "Advanced" button to show the advanced options, and then - -1. Click the "Proceed to localhost" link. - -Now—in this and all future requests to this URL—you'll be taken directly to the example service. - -  +After the deploy has completed, a prompt would have displayed the new connect commands you can use to connect automatically bring up the game in your browser. Running the command `zarf connect games` should open your browser to `http://localhost:` and be greeted by a short catalog of games to play. ### It begins! diff --git a/examples/postgres-operator/README.md b/examples/postgres-operator/README.md index a22eae5f37..dd5fce5e16 100644 --- a/examples/postgres-operator/README.md +++ b/examples/postgres-operator/README.md @@ -22,7 +22,8 @@ After looking at several alternatives, Zalando's postgres operator felt like the 3. Wait a bit, run `k9s` to see pods come up. Don't move on until everything is running 4. Run: `./zarf package deploy zarf-package-postgres-operator-demo.tar.zst --confirm` - Deploy the package. If you want interactive mode instead just run `./zarf package deploy`, it will give you a picker to choose the package. 5. Wait a couple of minutes. Run `k9s` to watch progress -6. The Postgres Operator UI will be available at [https://postgres-operator-ui.localhost:8443](https://postgres-operator-ui.localhost:8443) and PGAdmin will be available at [https://pgadmin.localhost:8443](https://pgadmin.localhost:8443). +6. The Postgres Operator UI will be available by running `./zarf connect postgres-operator-ui` and pgadmin will be available by running `./zarf connect pgadmin` + - If you want to run other commands after/during the browsing of the postgres tools, you can add a `&` character at the end of the connect command to run the command in the background ie) `./zarf connect pgadmin &`. 7. Set up a server in PGAdmin: - General // Name: `acid-zarf-test` - General // Server group: `Servers` @@ -33,7 +34,7 @@ After looking at several alternatives, Zalando's postgres operator felt like the - Connection // Password: (run the command in the table below) - SSL // SSL mode: `Require` 1. Create the backups bucket in MinIO (TODO: Figure out how to create the bucket automatically) - 1. Navigate to [https://minio-console.localhost:8443](https://minio-console.localhost:8443) + 1. Run `zarf connect minio` to navigate to the web console. 1. Log in - Username: `minio` - Password: `minio123` 1. Buckets -> Create Bucket - Bucket Name: `postgres-operator-backups` diff --git a/examples/single-big-bang-package/README.md b/examples/single-big-bang-package/README.md index 52cc98da10..80c6d985e8 100644 --- a/examples/single-big-bang-package/README.md +++ b/examples/single-big-bang-package/README.md @@ -1,7 +1,16 @@ ## Zarf Big Bang Single Package Example -This example demonstrates using Zarf in a very low-resources/singlue-use environment. In this mode there is no gitops service and Zarf is simply a standard means of wrapping airgap concerns for K3s. This example deploys a basic K3s cluster using Traefik 2 and configures TLS / airgap concerns to deploy a single BB Package. +This example demonstrates using Zarf in a very low-resources/singlue-use environment. In this mode there is no gitops service and Zarf is simply a standard means of wrapping airgap concerns for K3s. This example deploys a basic K3s cluster using Traefik 2 and configures TLS / airgap concerns to deploy a single BB Package (twistlock). ### Steps to use: -1. Create a Zarf cluster as outlined in the main [README](../../README.md#2-create-the-zarf-cluster) -2. Follow [step 3](../../README.md#3-add-resources-to-the-zarf-cluster) using this config in this folder + +1. `cd examples/` +2. Run one of these two commands: + - `make all` - Download the latest version of Zarf, build the deploy package, and start a VM with Vagrant + - `make all-dev` - Build Zarf locally, build the deploy package, and start a VM with Vagrant +3. Run: `./zarf init --confirm --components k3s` - Initialize Zarf, telling it to install k3s on your new VM. If you want to use interactive mode instead just run `./zarf init`. +4. Wait a bit, run `./zarf tools k9s` to see pods come up. Don't move on until everything is running +5. Run: `./zarf package deploy zarf-package-big-bang-core-demo.tar.zst --components kubescape --confirm` - Deploy Big Bang Core. If you want interactive mode instead just run `./zarf package deploy`, it will give you a picker to choose the package. +6. Wait several minutes. Run `./zarf tools k9s` to watch progress +8. Run `./zarf connect twistlock` to be taken to the twistlock consule in your browser. +9. When you're done, run `exit` to leave the VM then `make vm-destroy` to bring everything down From d328b695d81e9a7abf5795dd8012acfbfd9684be Mon Sep 17 00:00:00 2001 From: Jeff McCoy Date: Wed, 2 Feb 2022 08:40:00 +0000 Subject: [PATCH 74/88] update bb example, still image pull sadness for now --- .../kustomizations/bigbang/git-secret.yaml | 9 +++++++ .../bigbang/values.yaml | 0 .../template/bigbang/kustomization.yaml | 25 ------------------- examples/big-bang/zarf.yaml | 6 ++--- 4 files changed, 12 insertions(+), 28 deletions(-) create mode 100644 examples/big-bang/kustomizations/bigbang/git-secret.yaml rename examples/big-bang/{template => kustomizations}/bigbang/values.yaml (100%) delete mode 100644 examples/big-bang/template/bigbang/kustomization.yaml diff --git a/examples/big-bang/kustomizations/bigbang/git-secret.yaml b/examples/big-bang/kustomizations/bigbang/git-secret.yaml new file mode 100644 index 0000000000..4b2ac8c7ee --- /dev/null +++ b/examples/big-bang/kustomizations/bigbang/git-secret.yaml @@ -0,0 +1,9 @@ +apiVersion: v1 +kind: Secret +type: Opaque +metadata: + name: zarf-git-secret + namespace: bigbang +stringData: + username: "zarf-git-user" + password: "###ZARF_GIT_AUTH_PUSH###" diff --git a/examples/big-bang/template/bigbang/values.yaml b/examples/big-bang/kustomizations/bigbang/values.yaml similarity index 100% rename from examples/big-bang/template/bigbang/values.yaml rename to examples/big-bang/kustomizations/bigbang/values.yaml diff --git a/examples/big-bang/template/bigbang/kustomization.yaml b/examples/big-bang/template/bigbang/kustomization.yaml deleted file mode 100644 index 0bbc5e126e..0000000000 --- a/examples/big-bang/template/bigbang/kustomization.yaml +++ /dev/null @@ -1,25 +0,0 @@ -bases: - - git::http://zarf-gitea-http.zarf.svc.cluster.local:3000/zarf-git-user/mirror__repo1.dso.mil__platform-one__big-bang__bigbang.git//base?ref=1.17.0 - -configMapGenerator: - - name: common - namespace: bigbang - behavior: merge - files: - - values.yaml - -patchesStrategicMerge: - - |- - apiVersion: source.toolkit.fluxcd.io/v1beta1 - kind: GitRepository - metadata: - name: bigbang - namespace: bigbang - spec: - url: http://zarf-gitea-http.zarf.svc.cluster.local:3000/zarf-git-user/mirror__repo1.dso.mil__platform-one__big-bang__bigbang.git - secretRef: - name: zarf-git-secret - ref: - $patch: replace - tag: "1.17.0" - diff --git a/examples/big-bang/zarf.yaml b/examples/big-bang/zarf.yaml index 71fd89a09f..7c5ff0efd4 100644 --- a/examples/big-bang/zarf.yaml +++ b/examples/big-bang/zarf.yaml @@ -33,14 +33,14 @@ components: target: "/usr/local/bin/kubescape-framework-nsa.json" - source: "files/kubescape-exceptions.json" target: "/usr/local/bin/kubescape-exceptions.json" - + - name: bb-core required: true secretName: "private-registry" manifests: - name: bb-core-config - files: - - manifests/big-bang.yaml + kustomizations: + - "kustomizations/bigbang" # 1. helm template bigbang ./chart | yq e '. | select(.kind == "GitRepository") | "- " + .spec.url + "@" + .spec.ref.tag' - # 2. Add the actual bigbang repo as well # https://repo1.dso.mil/platform-one/big-bang/bigbang/-/tags/1.17.0 From b8dbfc29779ee6ecc2db2bc6969ea2b68c821cfb Mon Sep 17 00:00:00 2001 From: Jeff McCoy Date: Wed, 2 Feb 2022 11:41:43 -0600 Subject: [PATCH 75/88] update e2e gitops for refactored test boilerplate --- test/e2e/e2e_gitops_example_test.go | 128 ++++++++++------------------ 1 file changed, 45 insertions(+), 83 deletions(-) diff --git a/test/e2e/e2e_gitops_example_test.go b/test/e2e/e2e_gitops_example_test.go index 70da9b09c5..6774469061 100644 --- a/test/e2e/e2e_gitops_example_test.go +++ b/test/e2e/e2e_gitops_example_test.go @@ -2,102 +2,64 @@ package test import ( "fmt" - "github.com/gruntwork-io/terratest/modules/aws" - "github.com/gruntwork-io/terratest/modules/ssh" - "github.com/gruntwork-io/terratest/modules/terraform" + "testing" + teststructure "github.com/gruntwork-io/terratest/modules/test-structure" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" - "testing" ) func TestGitopsExample(t *testing.T) { - t.Parallel() - - // Our SSH username, will change based on which AMI we use - username := "ubuntu" - - // Copy the terraform folder to a temp directory so we can run multiple tests in parallel - tmpFolder := teststructure.CopyTerraformFolderToTemp(t, "..", "tf/public-ec2-instance") + e2e := NewE2ETest(t) // At the end of the test, run `terraform destroy` to clean up any resources that were created - defer teststructure.RunTestStage(t, "TEARDOWN", func() { - teardown(t, tmpFolder) - }) - - // Deploy the terraform infra - teststructure.RunTestStage(t, "SETUP", func() { - setup(t, tmpFolder) - }) + defer teststructure.RunTestStage(e2e.testing, "TEARDOWN", e2e.teardown) // Upload the Zarf artifacts - teststructure.RunTestStage(t, "UPLOAD", func() { - terraformOptions := teststructure.LoadTerraformOptions(t, tmpFolder) - keyPair := teststructure.LoadEc2KeyPair(t, tmpFolder) - - syncFileToRemoteServer(t, terraformOptions, keyPair, username, "../../build/zarf", fmt.Sprintf("/home/%s/build/zarf", username), "0700") - syncFileToRemoteServer(t, terraformOptions, keyPair, username, "../../build/zarf-init.tar.zst", fmt.Sprintf("/home/%s/build/zarf-init.tar.zst", username), "0600") - syncFileToRemoteServer(t, terraformOptions, keyPair, username, "../../build/zarf-package-gitops-service-data.tar.zst", fmt.Sprintf("/home/%s/build/zarf-package-gitops-service-data.tar.zst", username), "0600") + teststructure.RunTestStage(e2e.testing, "UPLOAD", func() { + e2e.syncFileToRemoteServer("../../build/zarf", fmt.Sprintf("/home/%s/build/zarf", e2e.username), "0700") + e2e.syncFileToRemoteServer("../../build/zarf-init.tar.zst", fmt.Sprintf("/home/%s/build/zarf-init.tar.zst", e2e.username), "0600") + e2e.syncFileToRemoteServer("../../build/zarf-package-gitops-service-data.tar.zst", fmt.Sprintf("/home/%s/build/zarf-package-gitops-service-data.tar.zst", e2e.username), "0600") }) teststructure.RunTestStage(t, "TEST", func() { - terraformOptions := teststructure.LoadTerraformOptions(t, tmpFolder) - keyPair := teststructure.LoadEc2KeyPair(t, tmpFolder) - - // Finally run the actual test - testGitopsExample(t, terraformOptions, keyPair, username) + // run `zarf init` + output, err := e2e.runSSHCommand("sudo bash -c 'cd /home/%s/build && ./zarf init --confirm --components management,logging,gitops-service --host 127.0.0.1'", e2e.username) + require.NoError(t, err, output) + + // Make sure Gitea comes up cleanly + output, err = e2e.runSSHCommand(`bash -c '[[ $(curl -sfSL -o /dev/null -w '%%{http_code}' 'http://127.0.0.1:45003/explore/repos') == 200 ]]'`) + require.NoError(e2e.testing, err, output) + + // Deploy the gitops example + output, err = e2e.runSSHCommand("sudo bash -c 'cd /home/%s/build && ./zarf package deploy zarf-package-gitops-service-data.tar.zst --confirm'", e2e.username) + require.NoError(t, err, output) + + // Check for full git repo mirror(foo.git) from https://github.com/stefanprodan/podinfo.git + output, err = e2e.runSSHCommand("sudo bash -c 'cd /home/%s/build && git clone https://zarf-git-user:$(./zarf tools get-admin-password)@127.0.0.1/zarf-git-user/mirror__github.com__stefanprodan__podinfo.git'", e2e.username) + require.NoError(t, err, output) + + // Check for tagged git repo mirror (foo.git@1.2.3) from https://github.com/defenseunicorns/zarf.git@v0.12.0 + output, err = e2e.runSSHCommand("sudo bash -c 'cd /home/%s/build && git clone https://zarf-git-user:$(./zarf tools get-admin-password)@127.0.0.1/zarf-git-user/mirror__github.com__defenseunicorns__zarf.git'", e2e.username) + require.NoError(t, err, output) + + // Check for correct tag + expectedTag := "v0.12.0\n" + output, err = e2e.runSSHCommand("sudo bash -c 'cd /home/%s/build/mirror__github.com__defenseunicorns__zarf && git tag'", e2e.username) + require.NoError(t, err, output) + assert.Equal(t, expectedTag, output, "Expected tag should match output") + + // Check for correct commits + expectedCommits := "4fb0f14\ncd45237\n9ac3338" + output, err = e2e.runSSHCommand("sudo bash -c 'cd /home/%s/build/mirror__github.com__defenseunicorns__zarf && git log -3 --oneline --pretty=format:\"%%h\"'", e2e.username) + require.NoError(t, err, output) + assert.Equal(t, expectedCommits, output, "Expected commits should match output") + + // Check for correct branches + expectedBranch := "* master\n" + output, err = e2e.runSSHCommand("sudo bash -c 'cd /home/%s/build/mirror__github.com__stefanprodan__podinfo && git branch --list'", e2e.username) + require.NoError(t, err, output) + assert.Equal(t, expectedBranch, output, "Expected Branch should match output") }) -} - -func testGitopsExample(t *testing.T, terraformOptions *terraform.Options, keyPair *aws.Ec2Keypair, username string) { - // Run `terraform output` to get the value of an output variable - publicInstanceIP := terraform.Output(t, terraformOptions, "public_instance_ip") - - // We're going to try to SSH to the instance IP, using the Key Pair we created earlier, and the user "ubuntu", - // as we know the Instance is running an Ubuntu AMI that has such a user - publicHost := ssh.Host{ - Hostname: publicInstanceIP, - SshKeyPair: keyPair.KeyPair, - SshUserName: username, - } - - // run `zarf init` - output, err := ssh.CheckSshCommandE(t, publicHost, fmt.Sprintf("sudo bash -c 'cd /home/%s/build && ./zarf init --confirm --components management,logging,gitops-service --host 127.0.0.1'", username)) - require.NoError(t, err, output) - - // Make sure Gitea comes up cleanly - output, err = ssh.CheckSshCommandE(t, publicHost, "timeout 300 bash -c 'while [[ \"$(curl -sfSL --retry 15 --retry-connrefused --retry-delay 5 -o /dev/null -w \"%{http_code}\" \"https://127.0.0.1/api/v1/user\")\" != \"401\" ]]; do sleep 1; done' || false") - require.NoError(t, err, output) - - // Deploy the gitops example - output, err = ssh.CheckSshCommandE(t, publicHost, fmt.Sprintf("sudo bash -c 'cd /home/%s/build && ./zarf package deploy zarf-package-gitops-service-data.tar.zst --confirm'", username)) - require.NoError(t, err, output) - - // Check for full git repo mirror(foo.git) from https://github.com/stefanprodan/podinfo.git - output, err = ssh.CheckSshCommandE(t, publicHost, fmt.Sprintf("sudo bash -c 'cd /home/%s/build && git clone https://zarf-git-user:$(./zarf tools get-admin-password)@127.0.0.1/zarf-git-user/mirror__github.com__stefanprodan__podinfo.git'", username)) - require.NoError(t, err, output) - - // Check for tagged git repo mirror (foo.git@1.2.3) from https://github.com/defenseunicorns/zarf.git@v0.12.0 - output, err = ssh.CheckSshCommandE(t, publicHost, fmt.Sprintf("sudo bash -c 'cd /home/%s/build && git clone https://zarf-git-user:$(./zarf tools get-admin-password)@127.0.0.1/zarf-git-user/mirror__github.com__defenseunicorns__zarf.git'", username)) - require.NoError(t, err, output) - - // Check for correct tag - expectedTag := "v0.12.0\n" - output, err = ssh.CheckSshCommandE(t, publicHost, fmt.Sprintf("sudo bash -c 'cd /home/%s/build/mirror__github.com__defenseunicorns__zarf && git tag'", username)) - require.NoError(t, err, output) - assert.Equal(t, expectedTag, output, "Expected tag should match output") - - // Check for correct commits - expectedCommits := "4fb0f14\ncd45237\n9ac3338" - output, err = ssh.CheckSshCommandE(t, publicHost, fmt.Sprintf("sudo bash -c 'cd /home/%s/build/mirror__github.com__defenseunicorns__zarf && git log -3 --oneline --pretty=format:\"%%h\"'", username)) - require.NoError(t, err, output) - assert.Equal(t, expectedCommits, output, "Expected commits should match output") - - // Check for correct branches - expectedBranch := "* master\n" - output, err = ssh.CheckSshCommandE(t, publicHost, fmt.Sprintf("sudo bash -c 'cd /home/%s/build/mirror__github.com__stefanprodan__podinfo && git branch --list'", username)) - require.NoError(t, err, output) - assert.Equal(t, expectedBranch, output, "Expected Branch should match output") - } From 61150f6700f91dfe445331ea8a24a3b42530f28b Mon Sep 17 00:00:00 2001 From: Jon Perry Date: Wed, 2 Feb 2022 16:45:13 -0500 Subject: [PATCH 76/88] Fix tool subcommand to get git credentials The 'get-admin-password' command used to look at the ~/.gitconfig to get the password for gitea. This information is now stored in the zarf-state secret so the command has been updated to look in the state for that value. --- cli/cmd/tools.go | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/cli/cmd/tools.go b/cli/cmd/tools.go index 8a7502e3b6..76a4a2d8b0 100644 --- a/cli/cmd/tools.go +++ b/cli/cmd/tools.go @@ -3,12 +3,13 @@ package cmd import ( "encoding/json" "fmt" - "github.com/defenseunicorns/zarf/cli/types" "os" + "github.com/defenseunicorns/zarf/cli/types" + "github.com/alecthomas/jsonschema" "github.com/defenseunicorns/zarf/cli/config" - "github.com/defenseunicorns/zarf/cli/internal/git" + "github.com/defenseunicorns/zarf/cli/internal/k8s" "github.com/defenseunicorns/zarf/cli/internal/message" k9s "github.com/derailed/k9s/cmd" craneCmd "github.com/google/go-containerregistry/cmd/crane/cmd" @@ -66,10 +67,18 @@ var registryCmd = &cobra.Command{ var readCredsCmd = &cobra.Command{ Use: "get-admin-password", - Short: "Returns the Zarf admin password read from ~/.git-credentials", + Short: "Returns the Zarf admin password for gitea read from the zarf-state secret in the zarf namespace", Run: func(cmd *cobra.Command, args []string) { - authInfo := git.FindAuthForHost(config.TLS.Host) - fmt.Println(authInfo.Auth.Password) + state := k8s.LoadZarfState() + if state.Distro == k8s.DistroIsUnknown { + // If no distro the zarf secret did not load properly + message.Fatalf(nil, "Unable to load the zarf/zarf-state secret, did you remember to run zarf init first?") + } + + // Continue loading state data if it is valid + config.InitState(state) + + fmt.Println(config.GetSecret(config.StateGitPush)) }, } From 3c67c6584cb006275369024bb5e633dc3eb70edd Mon Sep 17 00:00:00 2001 From: Jon Perry Date: Wed, 2 Feb 2022 16:48:34 -0500 Subject: [PATCH 77/88] Fix gitops e2e test to use tunneled ports --- test/e2e/e2e_gitops_example_test.go | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/test/e2e/e2e_gitops_example_test.go b/test/e2e/e2e_gitops_example_test.go index 6774469061..f36213f6ba 100644 --- a/test/e2e/e2e_gitops_example_test.go +++ b/test/e2e/e2e_gitops_example_test.go @@ -24,23 +24,23 @@ func TestGitopsExample(t *testing.T) { teststructure.RunTestStage(t, "TEST", func() { // run `zarf init` - output, err := e2e.runSSHCommand("sudo bash -c 'cd /home/%s/build && ./zarf init --confirm --components management,logging,gitops-service --host 127.0.0.1'", e2e.username) + output, err := e2e.runSSHCommand("sudo bash -c 'cd /home/%s/build && ./zarf init --confirm --components k3s,logging,gitops-service --host 127.0.0.1'", e2e.username) require.NoError(t, err, output) - // Make sure Gitea comes up cleanly - output, err = e2e.runSSHCommand(`bash -c '[[ $(curl -sfSL -o /dev/null -w '%%{http_code}' 'http://127.0.0.1:45003/explore/repos') == 200 ]]'`) - require.NoError(e2e.testing, err, output) - // Deploy the gitops example output, err = e2e.runSSHCommand("sudo bash -c 'cd /home/%s/build && ./zarf package deploy zarf-package-gitops-service-data.tar.zst --confirm'", e2e.username) require.NoError(t, err, output) + // Create a tunnel to the git resources + output, err = e2e.runSSHCommand("sudo bash -c '(/home/%s/build/zarf connect git &> /dev/nul &)'", e2e.username) + require.NoError(t, err, output) + // Check for full git repo mirror(foo.git) from https://github.com/stefanprodan/podinfo.git - output, err = e2e.runSSHCommand("sudo bash -c 'cd /home/%s/build && git clone https://zarf-git-user:$(./zarf tools get-admin-password)@127.0.0.1/zarf-git-user/mirror__github.com__stefanprodan__podinfo.git'", e2e.username) + output, err = e2e.runSSHCommand("sudo bash -c 'cd /home/%s/build && git clone http://zarf-git-user:$(./zarf tools get-admin-password)@127.0.0.1:45003/zarf-git-user/mirror__github.com__stefanprodan__podinfo.git'", e2e.username) require.NoError(t, err, output) // Check for tagged git repo mirror (foo.git@1.2.3) from https://github.com/defenseunicorns/zarf.git@v0.12.0 - output, err = e2e.runSSHCommand("sudo bash -c 'cd /home/%s/build && git clone https://zarf-git-user:$(./zarf tools get-admin-password)@127.0.0.1/zarf-git-user/mirror__github.com__defenseunicorns__zarf.git'", e2e.username) + output, err = e2e.runSSHCommand("sudo bash -c 'cd /home/%s/build && git clone http://zarf-git-user:$(./zarf tools get-admin-password)@127.0.0.1:45003/zarf-git-user/mirror__github.com__defenseunicorns__zarf.git'", e2e.username) require.NoError(t, err, output) // Check for correct tag From 4ccef737b05df6a836b40c98704393560639cdcb Mon Sep 17 00:00:00 2001 From: Jon Perry Date: Wed, 2 Feb 2022 18:30:03 -0500 Subject: [PATCH 78/88] Add gitops data package creation prior to e2e test --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 6be42b17b2..7d8e3530ae 100644 --- a/Makefile +++ b/Makefile @@ -92,7 +92,7 @@ test-cloud-e2e-data-injection: package-example-data-injection ## E2E test of the ################ BEGIN Pending removal post-merge .PHONY: test-cloud-e2e-git-based-helm-chart -test-cloud-e2e-git-based-helm-chart: +test-cloud-e2e-git-based-helm-chart: echo done ################ END Pending removal post-merge From 5170755d5695a3d99cd4a758e4fd644c1745dc10 Mon Sep 17 00:00:00 2001 From: Jon Perry Date: Wed, 2 Feb 2022 18:30:48 -0500 Subject: [PATCH 79/88] Update docs for native-apply branch * Remove outdated asciinema from the READMEs * Fixed documentation using outdated zarf commands * Fixed descriptions of default and required components in docs --- docs/components.md | 3 ++- examples/data-injection/README.md | 12 ++++++++--- examples/game/README.md | 34 ++++++++----------------------- 3 files changed, 19 insertions(+), 30 deletions(-) diff --git a/docs/components.md b/docs/components.md index 363feaa736..b22e6e29d1 100644 --- a/docs/components.md +++ b/docs/components.md @@ -17,7 +17,7 @@ Zarf's work necessitates that some components are "always on" (a.k.a. required & | |Description| |--- |---| -|k3s |Installs a lightweight Kubernetes Cluster on the local host—[k3s](https://k3s.io/)—and configures it to start up on boot.| +|container-seed-registry|Adds a container registry so Zarf can bootstrap itself into the cluster.| |container-registry |Adds a container registry service—[docker registry](https://docs.docker.com/registry/)—into the cluster.|   @@ -31,6 +31,7 @@ These optional components are listed below along with the "magic strings" you pa |--components |Description| |--- |---| +|k3s |Installs a lightweight Kubernetes Cluster on the local host—[k3s](https://k3s.io/)—and configures it to start up on boot.| |logging |Adds a log monitoring stack—[promtail / loki / graphana (a.k.a. PLG)](https://github.com/grafana/loki)—into the cluster.| |gitops-service |Adds a [GitOps](https://www.cloudbees.com/gitops/what-is-gitops)-compatible source control service—[Gitea](https://gitea.io/en-us/)—into the cluster.| diff --git a/examples/data-injection/README.md b/examples/data-injection/README.md index 2f709ffeee..f58a3f93b5 100644 --- a/examples/data-injection/README.md +++ b/examples/data-injection/README.md @@ -3,6 +3,12 @@ This example demonstrates using Zarf in a very low-resources/singlue-use environment. In this mode there is no gitops service and Zarf is simply a standard means of wrapping airgap concerns for K3s. This example deploys a basic K3s cluster using Traefik 2 and configures TLS / airgap concerns to deploy [Podinfo](https://github.com/stefanprodan/podinfo). ### Steps to use: -1. Create a Zarf cluster as outlined in the main [README](../../README.md#2-create-the-zarf-cluster) -2. Run `zarf package create` in this directory to build this example package. -3. Run `zarf package deploy zarf-package-data-injection-demo.tar` +1. Build everything you will need for this example + 1. `cd /path/to/zarf` + 2. `make build-cli init-package` + 3. `cd ./examples` + 4. `make package-example-data-injection` + 5. Either run `make vm-init` or roll your own Kubernetes cluster locally however you like. +2. Run `./zarf init` following the prompts as best fit for your environment + - If you did start up your own Kubernetes cluster say `yes` when prompted for k3s. +3. Run `./zarf package deploy zarf-package-data-injection-demo.tar` diff --git a/examples/game/README.md b/examples/game/README.md index cb188234e6..0459dafd62 100644 --- a/examples/game/README.md +++ b/examples/game/README.md @@ -13,9 +13,6 @@ More specifically, you'll be running a copy of the 1993, mega-hit video game _** ## The Flow - -asciicast - Here's what you'll do in this example: @@ -36,9 +33,6 @@ Here's what you'll do in this example: ## Get ready - -asciicast - Before the magic can happen you have to do a few things: @@ -57,9 +51,6 @@ Before the magic can happen you have to do a few things: ## Create a cluster - -asciicast - You can't run software without _somewhere to run it_, so the first thing to do is have `zarf` install & run a new, local k8s cluster—the "Zarf cluster". @@ -91,9 +82,6 @@ Congratulations! Your machine is now a single node k8s cluster! ## Package the game - -asciicast - Zarf is (at heart) a tool for making it easy to get software from _where you have it_ to _**where you need it**_—specifically, across an airgap. Since moving bits is so core to Zarf the idea of a "ready-to-move group of software" has a specific name—the _package_. @@ -113,9 +101,6 @@ Answer the questions & watch the terminal scroll for a while. Once things are do ## Deploy it - -asciicast - It's time to feed the package you built into your cluster. @@ -142,16 +127,16 @@ Respond as appropriate and in a couple seconds the cluster will have loaded your ## Space marine the demon invasion! - -privacy error - -After the deploy has completed, a prompt would have displayed the new connect commands you can use to connect automatically bring up the game in your browser. Running the command `zarf connect games` should open your browser to `http://localhost:` and be greeted by a short catalog of games to play. +After the deploy has completed, a prompt would have displayed the new connect commands you can use to connect automatically bring up the game in your browser. Running the command `zarf connect games` should open your browser to `http://localhost:` and be greeted by a short catalog of games to play. + +If you're running in a vagrant virtual machine you might notice this command does not work, this is because the networking of the Vagrant vm clashes with the networking of the kubernetes cluster. In this case you will have to manually create a tunnel to the game. You can do that by running the following set of commands: + - `kubectl get pods -n default` + - This will return a pod starting with `game-#####-####`. Copy this name to be used in the next command. + - kubectl port-forward -n default --address 0.0.0.0 {COPIED_POD_NAME} 8000:8000 + - This will enable you to now go to `127.0.0.1:8000` on your host machine to play the games! -### It begins! - -dosbox - +### It begins! Give the example a couple of seconds to "boot up". @@ -168,9 +153,6 @@ Once you see the ultra-iconic title screen, you're ready to go (save the world)! ## Cleanup - -asciicast - Once you've had your fun it's time to clean up. From a585e22db0f57de3771c7dc783f5b7c48fc59df7 Mon Sep 17 00:00:00 2001 From: Andy Roth Date: Wed, 2 Feb 2022 17:10:25 -0800 Subject: [PATCH 80/88] Clean up dead code and add image specs to values.yaml (#262) --- examples/Makefile | 14 +-- examples/big-bang/Makefile | 23 ---- .../kustomizations/bigbang/values.yaml | 86 ++++++++++++++- examples/big-bang/manifests/.gitignore | 2 - examples/big-bang/manifests/big-bang.yaml | 100 ------------------ examples/big-bang/zarf.yaml | 1 - 6 files changed, 82 insertions(+), 144 deletions(-) delete mode 100644 examples/big-bang/Makefile delete mode 100644 examples/big-bang/manifests/.gitignore delete mode 100644 examples/big-bang/manifests/big-bang.yaml diff --git a/examples/Makefile b/examples/Makefile index 1aabf86f36..b3349167e7 100755 --- a/examples/Makefile +++ b/examples/Makefile @@ -57,20 +57,8 @@ vm-destroy: ## Cleanup plz .PHONY: package-examples package-examples: package-example-big-bang package-example-software-factory package-example-data-injection package-example-game package-example-gitops-data package-example-single-big-bang-package package-example-tiny-kafka package-example-postgres-operator ## Create zarf packages from all examples -.PHONY: vendor-big-bang-base -vendor-big-bang-base: ## Grab the bigbang base kustomization so we don't need to do funky things to let Flux grab it from a private repo - cd big-bang/template/bigbang/vendor && \ - rm -rf bigbang && \ - git init bigbang && \ - cd bigbang && \ - git remote add -f origin https://repo1.dso.mil/platform-one/big-bang/bigbang.git && \ - git config core.sparseCheckout true && \ - echo "base/" > .git/info/sparse-checkout && \ - git checkout tags/1.17.0 -b tagbranch && \ - rm -rf .git - .PHONY: package-example-big-bang -package-example-big-bang: vendor-big-bang-base ## Create the Big Bang Core example +package-example-big-bang: ## Create the Big Bang Core example cd big-bang && $(ZARF_BIN) package create --confirm && mv zarf-package-* ../sync/ .PHONY: package-example-softare-factory diff --git a/examples/big-bang/Makefile b/examples/big-bang/Makefile deleted file mode 100644 index da571b6dcc..0000000000 --- a/examples/big-bang/Makefile +++ /dev/null @@ -1,23 +0,0 @@ -.DEFAULT_GOAL := help - -.PHONY: help -help: ## Show a list of all targets - @grep -E '^[a-zA-Z0-9_-]+:.*?## .*$$' $(MAKEFILE_LIST) \ - | sed -n 's/^\(.*\): \(.*\)##\(.*\)/\1:\3/p' \ - | column -t -s ":" - -.PHONY: all -all: ## Download the latest version of Zarf, build the deploy package, and start a VM with Vagrant - @cd .. && $(MAKE) clean fetch-release package-example-big-bang vm-init - -.PHONY: all-dev -all-dev: ## Same as 'default', but build Zarf rather than downloading it - @cd .. && $(MAKE) clean build-release package-example-big-bang vm-init - -.PHONY: vm-init -vm-init: ## Bring up the VM - @cd .. && $(MAKE) vm-init - -.PHONY: vm-destroy -vm-destroy: ## Destroy the VM - @cd .. && $(MAKE) vm-destroy diff --git a/examples/big-bang/kustomizations/bigbang/values.yaml b/examples/big-bang/kustomizations/bigbang/values.yaml index f7d9de48c1..47ea26599c 100644 --- a/examples/big-bang/kustomizations/bigbang/values.yaml +++ b/examples/big-bang/kustomizations/bigbang/values.yaml @@ -2,8 +2,8 @@ domain: bigbang.dev registryCredentials: registry: "###ZARF_REGISTRY###" - username: "zarf-git-user" - password: "${zarf_secret}" + username: "zarf-pull" + password: "###ZARF_REGISTRY_AUTH_PULL###" git: existingSecret: "zarf-git-secret" @@ -178,6 +178,10 @@ istio: -----END CERTIFICATE----- values: + hub: "###ZARF_REGISTRY###/ironbank/opensource/istio" + cni: + image: + hub: "###ZARF_REGISTRY###/ironbank/opensource/istio" istiod: hpaSpec: maxReplicas: 1 @@ -199,6 +203,7 @@ istiooperator: git: repo: http://zarf-gitea-http.zarf.svc.cluster.local:3000/zarf-git-user/mirror__repo1.dso.mil__platform-one__big-bang__apps__core__istio-operator.git values: + hub: "###ZARF_REGISTRY###/ironbank/opensource/istio" operator: resources: requests: @@ -213,6 +218,11 @@ jaeger: git: repo: http://zarf-gitea-http.zarf.svc.cluster.local:3000/zarf-git-user/mirror__repo1.dso.mil__platform-one__big-bang__apps__core__jaeger.git values: + image: + repository: ###ZARF_REGISTRY###/ironbank/opensource/jaegertracing/jaeger-operator + retention: + image: ###ZARF_REGISTRY###/ironbank/opensource/jaegertracing/jaeger-es-index-cleaner:1.24.0 + resources: requests: cpu: "100m" @@ -223,6 +233,7 @@ jaeger: jaeger: spec: allInOne: + image: ###ZARF_REGISTRY###/ironbank/opensource/jaegertracing/all-in-one:1.24.0 resources: requests: cpu: "100m" @@ -230,7 +241,14 @@ jaeger: limits: cpu: "500m" memory: "128Mi" + agent: + image: ###ZARF_REGISTRY###/ironbank/opensource/jaegertracing/jaeger-agent:1.24.0 + ingester: + image: ###ZARF_REGISTRY###/ironbank/opensource/jaegertracing/jaeger-ingester:1.24.0 + query: + image: ###ZARF_REGISTRY###/ironbank/opensource/jaegertracing/jaeger-query:1.24.0 collector: + image: ###ZARF_REGISTRY###/ironbank/opensource/jaegertracing/jaeger-collector:1.24.0 resources: requests: cpu: "100m" @@ -238,15 +256,14 @@ jaeger: limits: cpu: "500m" memory: "128Mi" - ingester: - # TODO: Remove this once the upstream bug is fixed (https://repo1.dso.mil/platform-one/big-bang/apps/core/jaeger/-/issues/15) - image: registry1.dso.mil/ironbank/opensource/jaegertracing/jaeger-ingester:1.24.0 kiali: enabled: true git: repo: http://zarf-gitea-http.zarf.svc.cluster.local:3000/zarf-git-user/mirror__repo1.dso.mil__platform-one__big-bang__apps__core__kiali.git values: + image: + repo: ###ZARF_REGISTRY###/ironbank/opensource/kiali/kiali-operator resources: requests: cpu: "100m" @@ -257,6 +274,7 @@ kiali: cr: spec: deployment: + image_name: ###ZARF_REGISTRY###/ironbank/opensource/kiali/kiali resources: requests: cpu: "100m" @@ -264,12 +282,18 @@ kiali: limits: cpu: "500m" memory: "368Mi" + svcPatchJob: + image: + repository: ###ZARF_REGISTRY###/ironbank/big-bang/base + clusterAuditor: enabled: true git: repo: http://zarf-gitea-http.zarf.svc.cluster.local:3000/zarf-git-user/mirror__repo1.dso.mil__platform-one__big-bang__apps__core__cluster-auditor.git values: + image: + repo: ###ZARF_REGISTRY###/ironbank/cluster-auditor/opa-collector resources: requests: cpu: "100m" @@ -283,6 +307,16 @@ gatekeeper: git: repo: http://zarf-gitea-http.zarf.svc.cluster.local:3000/zarf-git-user/mirror__repo1.dso.mil__platform-one__big-bang__apps__core__policy.git values: + postInstall: + labelNamespace: + image: + repository: ###ZARF_REGISTRY###/ironbank/opensource/kubernetes-1.21/kubectl + postUpgrade: + cleanupCRD: + image: + repository: ###ZARF_REGISTRY###/ironbank/opensource/kubernetes-1.21/kubectl + image: + repository: "###ZARF_REGISTRY###/ironbank/opensource/openpolicyagent/gatekeeper" replicas: 1 controllerManager: resources: @@ -303,6 +337,8 @@ gatekeeper: violations: allowedDockerRegistries: parameters: + repos: + - ###ZARF_REGISTRY### excludedResources: # K3s kube-system stuff, better than excluding the whole namespace - "kube-system/coredns-.*" @@ -339,6 +375,8 @@ logging: repo: http://zarf-gitea-http.zarf.svc.cluster.local:3000/zarf-git-user/mirror__repo1.dso.mil__platform-one__big-bang__apps__core__elasticsearch-kibana.git values: elasticsearch: + image: + repository: ###ZARF_REGISTRY###/ironbank/elastic/elasticsearch/elasticsearch master: count: 1 persistence: @@ -362,6 +400,8 @@ logging: cpu: "500m" memory: "3Gi" kibana: + image: + repository: ###ZARF_REGISTRY###/ironbank/elastic/kibana/kibana count: 1 resources: requests: @@ -370,17 +410,25 @@ logging: limits: memory: "1Gi" cpu: "500m" + upgradeJob: + image: + repository: ###ZARF_REGISTRY###/ironbank/big-bang/base eckoperator: enabled: true git: repo: http://zarf-gitea-http.zarf.svc.cluster.local:3000/zarf-git-user/mirror__repo1.dso.mil__platform-one__big-bang__apps__core__eck-operator.git + values: + image: + repository: ###ZARF_REGISTRY###/ironbank/elastic/eck-operator/eck-operator fluentbit: enabled: true git: repo: http://zarf-gitea-http.zarf.svc.cluster.local:3000/zarf-git-user/mirror__repo1.dso.mil__platform-one__big-bang__apps__core__fluentbit.git values: + image: + repository: ###ZARF_REGISTRY###/ironbank/opensource/fluent/fluent-bit securityContext: privileged: true resources: @@ -398,6 +446,8 @@ monitoring: values: alertmanager: alertmanagerSpec: + image: + repository: ###ZARF_REGISTRY###/ironbank/opensource/prometheus/alertmanager resources: requests: cpu: "100m" @@ -406,6 +456,8 @@ monitoring: cpu: "500m" memory: "256Mi" prometheusOperator: + image: + repository: ###ZARF_REGISTRY###/ironbank/opensource/prometheus-operator/prometheus-operator resources: requests: cpu: "100m" @@ -413,8 +465,20 @@ monitoring: limits: cpu: "500m" memory: "512Mi" + admissionWebhooks: + patch: + image: + repository: ###ZARF_REGISTRY###/ironbank/opensource/jet/kube-webhook-certgen + configmapReloadImage: + repository: ###ZARF_REGISTRY###/ironbank/opensource/jimmidyson/configmap-reload + prometheusConfigReloaderImage: + repository: ###ZARF_REGISTRY###/ironbank/opensource/prometheus-operator/prometheus-config-reloader + kubectlImage: + repository: ###ZARF_REGISTRY###/ironbank/opensource/kubernetes-1.20/kubectl-1.20 prometheus: prometheusSpec: + image: + repository: ###ZARF_REGISTRY###/ironbank/opensource/prometheus/prometheus resources: requests: cpu: "100m" @@ -423,7 +487,11 @@ monitoring: cpu: "500m" memory: "2Gi" grafana: + image: + repository: ###ZARF_REGISTRY###/ironbank/opensource/grafana/grafana sidecar: + image: + repository: ###ZARF_REGISTRY###/ironbank/kiwigrid/k8s-sidecar resources: requests: cpu: "50m" @@ -438,7 +506,11 @@ monitoring: limits: cpu: "500m" memory: "128Mi" + testFramework: + image: "###ZARF_REGISTRY###/ironbank/opensource/bats/bats" kube-state-metrics: + image: + repository: ###ZARF_REGISTRY###/ironbank/opensource/coreos/kube-state-metrics resources: requests: cpu: "10m" @@ -447,6 +519,8 @@ monitoring: cpu: "500m" memory: "128Mi" prometheus-node-exporter: + image: + repository: ###ZARF_REGISTRY###/ironbank/opensource/prometheus/node-exporter resources: requests: cpu: "100m" @@ -461,6 +535,8 @@ twistlock: repo: http://zarf-gitea-http.zarf.svc.cluster.local:3000/zarf-git-user/mirror__repo1.dso.mil__platform-one__big-bang__apps__security-tools__twistlock.git values: console: + image: + repository: ###ZARF_REGISTRY###/ironbank/twistlock/console/console persistence: size: 5Gi resources: diff --git a/examples/big-bang/manifests/.gitignore b/examples/big-bang/manifests/.gitignore deleted file mode 100644 index f2d70df156..0000000000 --- a/examples/big-bang/manifests/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -*_generated.yaml -*-generated.yaml diff --git a/examples/big-bang/manifests/big-bang.yaml b/examples/big-bang/manifests/big-bang.yaml deleted file mode 100644 index cc1c798a98..0000000000 --- a/examples/big-bang/manifests/big-bang.yaml +++ /dev/null @@ -1,100 +0,0 @@ -apiVersion: v1 -kind: Namespace -metadata: - labels: - owner: bigbang - name: bigbang ---- -apiVersion: v1 -kind: Secret -type: Opaque -metadata: - name: zarf-git-secret - namespace: bigbang -stringData: - username: "zarf-git-user" - password: "###ZARF_GIT_AUTH_PUSH###" ---- -apiVersion: source.toolkit.fluxcd.io/v1beta1 -kind: GitRepository -metadata: - name: zarf - namespace: bigbang -spec: - ignore: | - # exclude file extensions - /**/*.md - /**/*.txt - /**/*.sh - interval: 5m - url: http://zarf-gitea-http.zarf.svc.cluster.local:3000/zarf-git-user/mirror__github.com__defenseunicorns__zarf.git - secretRef: - name: zarf-git-secret - ref: - branch: multi-distro-support ---- -apiVersion: kustomize.toolkit.fluxcd.io/v1beta1 -kind: Kustomization -metadata: - name: bigbang - namespace: bigbang -spec: - interval: 5m - path: "./examples/big-bang/template/bigbang" - prune: true - sourceRef: - kind: GitRepository - name: zarf - healthChecks: - - apiVersion: helm.toolkit.fluxcd.io/v2beta1 - kind: HelmRelease - namespace: bigbang - name: bigbang - - apiVersion: helm.toolkit.fluxcd.io/v2beta1 - kind: HelmRelease - namespace: bigbang - name: cluster-auditor - - apiVersion: helm.toolkit.fluxcd.io/v2beta1 - kind: HelmRelease - namespace: bigbang - name: eck-operator - - apiVersion: helm.toolkit.fluxcd.io/v2beta1 - kind: HelmRelease - namespace: bigbang - name: ek - - apiVersion: helm.toolkit.fluxcd.io/v2beta1 - kind: HelmRelease - namespace: bigbang - name: fluent-bit - - apiVersion: helm.toolkit.fluxcd.io/v2beta1 - kind: HelmRelease - namespace: bigbang - name: gatekeeper - - apiVersion: helm.toolkit.fluxcd.io/v2beta1 - kind: HelmRelease - namespace: bigbang - name: istio - - apiVersion: helm.toolkit.fluxcd.io/v2beta1 - kind: HelmRelease - namespace: bigbang - name: istio-operator - - apiVersion: helm.toolkit.fluxcd.io/v2beta1 - kind: HelmRelease - namespace: bigbang - name: jaeger - - apiVersion: helm.toolkit.fluxcd.io/v2beta1 - kind: HelmRelease - namespace: bigbang - name: kiali - - apiVersion: helm.toolkit.fluxcd.io/v2beta1 - kind: HelmRelease - namespace: bigbang - name: monitoring - - apiVersion: helm.toolkit.fluxcd.io/v2beta1 - kind: HelmRelease - namespace: bigbang - name: twistlock - timeout: 60m - postBuild: - substitute: - zarf_secret: "###ZARF_REGISTRY_AUTH_PULL###" diff --git a/examples/big-bang/zarf.yaml b/examples/big-bang/zarf.yaml index 7c5ff0efd4..ddb7ae4b63 100644 --- a/examples/big-bang/zarf.yaml +++ b/examples/big-bang/zarf.yaml @@ -45,7 +45,6 @@ components: # 2. Add the actual bigbang repo as well # https://repo1.dso.mil/platform-one/big-bang/bigbang/-/tags/1.17.0 repos: - - https://github.com/defenseunicorns/zarf.git - https://repo1.dso.mil/platform-one/big-bang/bigbang.git@1.17.0 - https://repo1.dso.mil/platform-one/big-bang/apps/core/cluster-auditor.git@0.3.0-bb.7 - https://repo1.dso.mil/platform-one/big-bang/apps/core/policy.git@3.5.2-bb.1 From 53101f91e5fc167908ddd13cfd52e2008336c3a7 Mon Sep 17 00:00:00 2001 From: Andy Roth Date: Fri, 4 Feb 2022 13:59:43 -0800 Subject: [PATCH 81/88] Updates for Big Bang example to PR #237 (#267) --- .pre-commit-config.yaml | 1 + assets/scripts/k3s.service | 2 +- examples/big-bang/README.md | 122 +++++++++++++--- examples/big-bang/img/helmreleases.png | Bin 0 -> 270224 bytes examples/big-bang/img/pods.png | Bin 0 -> 757342 bytes .../kustomizations/bigbang/values.yaml | 133 +++++++++--------- 6 files changed, 169 insertions(+), 89 deletions(-) create mode 100644 examples/big-bang/img/helmreleases.png create mode 100644 examples/big-bang/img/pods.png diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index c4f9ff3ea5..bc8e03a0df 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -3,6 +3,7 @@ repos: rev: v4.0.1 hooks: - id: check-added-large-files + args: ['--maxkb=1024'] - id: check-merge-conflict - id: detect-aws-credentials args: diff --git a/assets/scripts/k3s.service b/assets/scripts/k3s.service index a27ba9da0f..ddbf47b8c3 100644 --- a/assets/scripts/k3s.service +++ b/assets/scripts/k3s.service @@ -24,4 +24,4 @@ RestartSec=5s ExecStartPre=/bin/sh -xc '! /usr/bin/systemctl is-enabled --quiet nm-cloud-setup.service' ExecStartPre=-/sbin/modprobe br_netfilter ExecStartPre=-/sbin/modprobe overlay -ExecStart=/usr/local/bin/k3s server --write-kubeconfig-mode=700 +ExecStart=/usr/local/bin/k3s server --write-kubeconfig-mode=700 --disable traefik diff --git a/examples/big-bang/README.md b/examples/big-bang/README.md index 69ecff2f5d..35d17e4d72 100644 --- a/examples/big-bang/README.md +++ b/examples/big-bang/README.md @@ -1,28 +1,96 @@ -# Example: Big Bang Core All-In-One +# Example: Big Bang Core -This example deploys Big Bang Core with a gitops service. This is not normally the method that will be used in production but for a demo it works great. +This example shows a deployment of [Big Bang Core](https://repo1.dso.mil/platform-one/big-bang/bigbang) using Zarf. -Because the same cluster will be running both Traefik and Istio, Istio's VirtualServices will be available on port 9443 +![pods](img/pods.png) + +![helmreleases](img/helmreleases.png) + +## Known Issues + +- Inside the Vagrant VM the services are available on the standard port `443`. Outside the VM if you want to pull something up in your browser that traffic is being routed to port `8443` to avoid needing to be root when running the Vagrant box. +- Due to issues with Elasticsearch this example doesn't work yet in some distros. It does work in the Vagrant VM detailed below. Upcoming work to update to the latest version of Big Bang and swap the EFK stack out for the PLG stack (Promtail, Loki, Grafana) should resolve this issue +- Currently this example does the equivalent of `kustomize build | kubectl apply -f -`, which means Flux will be used to deploy everything, but it won't be watching a Git repository for changes. Upcoming work is planned to update the example so that you will be able to open up a Git repo in the private Gitea server inside the cluster, commit and push a change, and see that change get reflected in the deployment. ## Prerequisites 1. Install [Vagrant](https://www.vagrantup.com/) -2. Install `make` and `kustomize` +2. Install `make` 1. Install `sha256sum` (on Mac it's `brew install coreutils`) ## Instructions -1. `cd examples/big-bang` -1. Run one of these two commands: - - `make all` - Download the latest version of Zarf, build the deploy package, and start a VM with Vagrant - - `make all-dev` - Build Zarf locally, build the deploy package, and start a VM with Vagrant -2. Run: `./zarf init --confirm --components k3s,gitops-service` - Initialize Zarf, telling it to install the management component and gitops service and skip logging component (since BB has logging already) and tells Zarf to use `localhost` as the domain. If you want to use interactive mode instead just run `./zarf init`. -3. Wait a bit, run `./zarf tools k9s` to see pods come up. Don't move on until everything is running -4. Run: `./zarf package deploy zarf-package-big-bang-core-demo.tar.zst --components kubescape --confirm` - Deploy Big Bang Core. If you want interactive mode instead just run `./zarf package deploy`, it will give you a picker to choose the package. -5. Wait several minutes. Run `./zarf tools k9s` to watch progress -6. :warning: `kubectl delete -n istio-system envoyfilter/misdirected-request` (due to [this bug](https://repo1.dso.mil/platform-one/big-bang/bigbang/-/issues/802)) -7. Use a browser to visit the various services, available at https://*.bigbang.dev:9443 -8. When you're done, run `exit` to leave the VM then `make vm-destroy` to bring everything down +### Pull down the code and binaries + +```shell +# clone the binaries +git clone https://github.com/defenseunicorns/zarf.git + +# change to the examples folder +cd zarf/examples + +# Download the latest release of Zarf and the Init Package to the 'examples/sync' folder +make fetch-release +``` + +> NOTE: +> +> If you have any issues with `make fetch-release` you can try `make build-release` instead. It will build the files instead of downloading them. You'll need Golang installed. + +### Build the deploy package + +```shell +# Create the deploy package and move it to the 'examples/sync' folder +make package-example-big-bang +``` + +### Start the Vagrant VM + +```shell +# Start the VM. You'll be dropped into a shell in the VM as the Root user +make vm-init +``` + +> NOTE: +> +> All subsequent commands should be happening INSIDE the Vagrant VM + +### Initialize Zarf + +```shell +# Initialize Zarf +./zarf init --confirm --components k3s,gitops-service + +# (Optional) Inspect the results +./zarf tools k9s +``` + +### Deploy Big Bang + +```shell +# Deploy Big Bang +./zarf package deploy --confirm zarf-package-big-bang-core-demo.tar.zst --components kubescape + +# (Optional) Inspect the results +./zarf tools k9s +``` + +### Delete buggy EnvoyFilter + +```shell +# Delete this EnvoyFilter, it is bugged. Will be fixed when we update to a later version of Big Bang +kubectl delete -n istio-system envoyfilter/misdirected-request +``` + +### Clean Up + +```shell +# Inside the VM +exit + +# On the host +make vm-destroy +``` ## Kubescape scan @@ -36,10 +104,20 @@ kubescape scan framework nsa --use-from=/usr/local/bin/kubescape-framework-nsa.j | URL | Username | Password | Notes | | ----------------------------------------------------- | --------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------- | -| [AlertManager](https://alertmanager.bigbang.dev:9443) | n/a | n/a | Unauthenticated | -| [Grafana](https://grafana.bigbang.dev:9443) | `admin` | `prom-operator` | | -| [Kiali](https://kiali.bigbang.dev:9443) | n/a | `kubectl get secret -n kiali -o=json \| jq -r '.items[] \| select(.metadata.annotations."kubernetes.io/service-account.name"=="kiali-service-account") \| .data.token' \| base64 -d; echo` | | -| [Kibana](https://kibana.bigbang.dev:9443) | `elastic` | `kubectl get secret -n logging logging-ek-es-elastic-user -o=jsonpath='{.data.elastic}' \| base64 -d; echo` | | -| [Prometheus](https://prometheus.bigbang.dev:9443) | n/a | n/a | Unauthenticated | -| [Jaeger](https://tracing.bigbang.dev:9443) | n/a | n/a | Unauthenticated | -| [Twistlock](https://twistlock.bigbang.dev:9443) | n/a | n/a | Twistlock has you create an admin account the first time you log in | +| [AlertManager](https://alertmanager.bigbang.dev:8443) | n/a | n/a | Unauthenticated | +| [Grafana](https://grafana.bigbang.dev:8443) | `admin` | `prom-operator` | | +| [Kiali](https://kiali.bigbang.dev:8443) | n/a | `kubectl get secret -n kiali -o=json \| jq -r '.items[] \| select(.metadata.annotations."kubernetes.io/service-account.name"=="kiali-service-account") \| .data.token' \| base64 -d; echo` | | +| [Kibana](https://kibana.bigbang.dev:8443) | `elastic` | `kubectl get secret -n logging logging-ek-es-elastic-user -o=jsonpath='{.data.elastic}' \| base64 -d; echo` | | +| [Prometheus](https://prometheus.bigbang.dev:8443) | n/a | n/a | Unauthenticated | +| [Jaeger](https://tracing.bigbang.dev:8443) | n/a | n/a | Unauthenticated | +| [Twistlock](https://twistlock.bigbang.dev:8443) | n/a | n/a | Twistlock has you create an admin account the first time you log in | + +## Troubleshooting + +### Elasticsearch isn't working when I try to deploy the Big Bang package on KinD (or K3d, or any other distro other than K3s) +That's a known issue. This example is only supported right now when using the K3s cluster that Zarf is able to deploy when running `zarf init`. Updating to the latest version of Big Bang and swapping the EFK stack out for the PLG stack should fix this issue. It's on the roadmap™. +### I'm getting "Misdirected Request" when trying to get to any of the services in my browser +Run the `kubectl delete` command documented above to delete the buggy EnvoyFilter. Updating to the latest version of Big Bang will fix this issue. It's on the roadmap™. + +### My computer crashed! +Close all those hundreds of chrome tabs, shut down all non-essential programs, and try again. Big Bang is a HOG. If you have less than 32GB of RAM you're in for a rough time. diff --git a/examples/big-bang/img/helmreleases.png b/examples/big-bang/img/helmreleases.png new file mode 100644 index 0000000000000000000000000000000000000000..131746a84f490ff53d19fbc566cce71e1f0afa13 GIT binary patch literal 270224 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�b8)S`(tFTvwny63G}WsX_PJ%q7ZQ(in~&BT=6%RF6wydC zpQlV9Y;m;$PETgX)+o90xsNzLlLXj5j!X=>Dm57#?8E|rYW}TgCQkSR! zqOL1~344S8)PlhYv($i>pIf_}YLuy~Rdj(zH;|w#HoB~iP7Lp|ws2MteT&89#mH*nBNj;Qw>+0BQQFnVQM-;z?*3lg{WAyN(6cHsvMV6_g0uca z_1A}OPDc6KJ5{S^Cl+pMn0r&n|uoxt`hA;g< zMTXO_93fk5w+qrloas*kX>Oej9p#IMrxDez{&kjRoQc0rhTz&_C0QO(eclozxWW1B zXxRBundsXcMB22T>~kE`m>c#bx7qGylOTI_56nzTIhNfkLEp`50)6o9d&bx?m~#e2 zR!)F}^tEr}j}T5e$ZRNTnd{OX=jV1ZTC?#*4M|zN!LVAj^E=4Ey;jxn3Yr=XN>9Hy&x4oo&TO{LZ4^Eduz} zMWePij)+f2#nwvCPwRAMpU-k9A8eMml((1s4R-I5)e`;^SQN)e-P$nzn$`LZcU@|P zhVdIc*wFmtfRNW;9CC;HgMuv%yzJn{7150Z-2fupCj-{`-T$u=vo7)if6-?=mt z^7x^JZSioAD6%GF#m_n!3a$ap&7cg4vu(q;}b1hlMRk^+8%X5|W*M>H^pl3ouJg0z(8ZQbJFdtgz zb<#e)+0)iexgSHebFUe`;PBjPWpJF5{J5lIOMl9N6f~N2+M<41XMD5OUaj*T^Ep42 zbr8wD1my-%u;nOuIO1V<=sAQ;o}ug{D>M)oAXY-}j_oBMlC?Om54{8IWN%98>PFXl zS?rVVe@Q+%p1JS4+-;7#dtmPVTr89kkK+_7-U*~)iyVhnFy@Ot2xkBNM|qN&d)L0z zK227|EtZPyeht&5-^BGTX0;unw}M9%uIjCo^Rf=~(d?2~OUr~O^} zn__y;ICA_D>m0dZZs8&l`!<9KTBv^v29+&0fI(BFmQ9_e*=0C09I)Gx3Cr5D-*#(i zXGHbAiua?t|HLAg<&H6_@s}iX z{P9tVXk9dGbviI)qrEGhpOxRFG6$bgBs6*-Uwj<4Z+ys!`)XT4dMfn?E0WDxll?)` z`X&9)qB1ib+2KF~=qo}gWtwJXd4tRePTpLps)j9vuvsLg8(VSY$j_j{8ZOAY$UO1h+4%z3Uq)H_LBKWAV9>F9H@^y_(mIpaVArkr$?C#FpLR90-0+ zvu4iEdw!pfb;&PmQLIBW&zg+vO33H1b;&*Kqdyny(Q(DXeN&I5saB|)@x>`fb#Jz| z^{TF^Y`(TYCi{(ZON;)`wkV(iy3hhCmOMANV<2-i+nrQ3-}A$WnQO>m`Y0Mu{UtI)br<3I?FtmHQI=`Um+Rk4nQ?%3S5Zacg`VD&;TpZGRj!u0H-bT11?poh1k^ zaxteVw`Zij7kW
    hVSPmW_^`8Pj39s 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

    W%~tkjakJrT#di*y9qcSp;J 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∓04e5iS>63-#~aI&S`Zr0yX& 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

    %J2l5S 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 YVTm{2i+ov}IyYBKO2zG!_4y@ZFg zoD{Su%HA+`;drKWJG$t}9?*#f-(%fqk09#Td$iGbJJ@e+2ST?Z6SP|)KE;GCp`)YC z=m*9BI91SzoI6zzp8fATRZuk_(_iXm#y0>7@5CQ3&$%cb!`I56-u?7(+&1{0anifX z9(OUyTHkhbdBcoW>S#TlD?seDe}b2;2mN21D(e2XohqI`x^U<2l0DB&2(W;sf?eo& zRFk`rP+K93{05=kJXEKARkJ-i-qS5Z%1nFdDAE3lZvHK$qhYoEsh0J`}7yz6i% zr_L!pZl>}g7=LzwysE21)qMtT4QETjPsjLNe+~DCF z-SQ`0<`d|m{PR?4G%oW)nKZhunEv~y^j|a6|M9_&{hM`&wfRv9U?B0=<@-_Rh6&|; zAz}YtTTkr3;Xi23zrug^U-r2eKf6jRh65n7a$g3-hk?dP9Z?2Nv9I%$6jPyZo^zb+ z<(AN|KGI#jsYUAF0FK^^t{A*65CcHD*x;?NEBoIv%=nkMKZNmO5;!tBTS4K!c$}0p zz}vo{cK}G6X=s5jN&l%^%J=a0fMH8o`I^tKid_B9rZHGA_0E#DV##u=!kuhpz{??o z{~jaotALP+d1~NGKL5K&6L9r-t@ncRKYbie@8**OTJrob=Hx5?x%UG37vP~?ynMwG z*kyouMv&(Xy-9#(R3M8ed7bq^n^W^-A?~rfvV@-#b-L7nD9b`q#vQ8Qkv9PPCxoI| zIQQxJNUj7_2hV$NYYCN1OW}I=T%v&gd-d;Y|CKSuopWQ1H!*CT|L5-h*Eav3A1=^5 zGOjJ3d0zO~NXjRyuKY~oBhA4d@zVbfEeEojePbm5gR=Es>*l}vA^d!e-?;nv-z)UL z_uK!y&(B2xmk41DG2d@=qv9z@8wZBIB7C6D}H9}B-p zvy#+eobULez}~S-K9b)1vn%bgnp(L^ z^trmv2F4_J!F<*|v$M1F=^yHSnqdTAq}9V%>~QMKhhBUa{+qud7ET| z`SZSSC|3I1$E1BP(yb~^g1{nkFIXfzYeJD4 z+o0Ga7m1tGs8@37bHRxKRvHh-!^2U)_Y^y~(qIOxG#pt!m1`APA~%hXCh+x_ygUeP zu}6l~p7IQ3V0E&(@|?rHorVli$s6uadmy=KZh&J`)G;c%Td3!(Ays_RVK!8PGL_3Q zT^y36P*?bNU9~CiMZ5u1z#`n7+_LZM;vl@;e#drs?b*@voVGD?`~D>U-4cl$$e59{ z?A}ED~h`dD`@HS17-^=9W4pwatG)0a~4S1kz3)U8!k5NUb`4vQ6moHlwQ6~D6hhdpH+Hu)~q z%I{GdU0*^!GErnsmM73#Ve&IS9maz`r0u6-07tIP${-p@O6Qz z`gFyc?B(G>!1Cpg4`y+5Utv)vz37)eOVJC=wwVB&()gN-BylykqF;uM?cSGu(!b{c{tk7o zDg}6Spa74KKz2ERYyNF!Mz6_vHRvTc`OMKzN$kcWtt*_bvm~yk&=>6fG3f|gXu5_EQI<*H!sgEK=6Mwfx$T2ob8d3N2I%wi z)k}Uy+!`pDeu6JX%N0r^lPR(0c(pk%I)_*%Lo+i;cjYBE(ZI0($X(`->a^GjGOPnEB zTrs|-x|IQHaBhJ&K;3Lm`{-f1FS$cjm7}4-c#4UIYBohAbH?)rEyGhPtR{9%)yMV> z>(^=xNq@(czu@Ctpy6)<0_zHZ6Si-E(Up7rC{Lfu6W7xYh{Ex{8v!+hcD{nl~ z!km`xGjKjV=LZ~-Y`|q<_1iT-QRfmjAyLElLsO(q9s@^B2oRZu+_^`dSY9#oaEX)m zr0d2&O7llCtZ0{JSn-{`fyN2jcJ50xi-X@0JTF@Fq4F3NoiAafo%?)>8v$QaiS)cd zo}vKQ7RtiBS-tKC@!eNzdU(q`0$hL)?XhlA`#Z>U@2Yy10!wC${)W+hTc&U_P^IL! zc)!b<=P6K!Ol41`BHjBhHR=Lpj^|Y^U3U3kEvr@VP0wy)ksHies~KS~Xe`1-@LZcP z_MDj!Qm=Y#?9dbbRha434v{t&tx{GzK4xSXY3y|U->#ou0?5U-z*o7fzOVJ$POjJk z&brqcOZq!PFZq3Dx4_DTwqF3;qTDXB!DhMI*iMfS#{S$Cyh z=bs)=#vJVpRh8$LiFV<Hxp#cqJa=I8bi7f>b!(S%K)WG#;Rc_KoKys~(TMris!!p*Sd$<6 zp}l@>QWT+9HR?vS>6@3w-de}V-~eaKg(L*_0eWkZ$f8Q?BnTO}A#vR?g;VVFQ<}>+ zy@_lgkAJA#qWy8|aZ9(2Lf(T5Y(sie81N|Se$ilN>^{BrUKSHnV~aUj=jglw3fN0d zXRRgDAnE~_f-fNS%|(Yzm^^R#0UzU0a3?HkVaSyI1hlZ`-|+Pz;26RRyx5m99$nRV zj=xuy!IGxw0XO*maSVBJbd|> z_P#<7etFOwJnKvdd&aL0^ftbzLcZw37PA~ODZs>w|9YqMG07$`!Uvnc&6;(`c6)@O zfN0Qv@Z}23kg6n_Y{RqS+10z3zFg@0%i=G=zZl7>8DI1f&8Mu&Ea5J5`6{f);M6HE z*?h+Y)`bo^G;(xLZC0NLjYi?-!>y9EiM- z<=Cl|O#FjE+*wtsNQZn7KASbxUHX^Z*fSY;MXAKD?Oa}kBEz&7E2D^ZQ)?BVLIi3S z5DBTc;k@79v?gN##MJn0Pi&nPO&r*OWw}90=}_4bD7%|XAGAZp9`%|GZ4Va{!zZvpgZ^~&uh1^dcz|_cdIc5(*O8op`bPxlC;(@P z0Wp+^6!Q!E!VdC+Pb!l>Pm{G6%c+qaz@Zp*Cu1mCXb@&WvU+}}l<@qS#mBC?N3Q?F zOysdq;NNk@PZRml^4OZ|MzdI;qf_A|p&5iG8fFW6(k|Lq1TT*ca zHcDIW+kKEG$Z?qM8@0|29^;^Zm1^CEv=g`w>F9%yvBj|FN6+bm9kcqR95eZ+QEb4F ztV=Q`S1C1vYJct}l!(n)Ky)$aK=+=I{#5F_0K{YiCatpC?{QR&8dko1!1e0;eaoSQ z*r<@x_V&G|Bw_&ZaBRl?!`C)v#rhgEVRTZl z+j(!$wZG$M2q}P4?bfB&KfN%81B_UwoWr#WpBd`-%Bd`c&R=`E7%mM7_?aPA%SbnMagGG8(X4UX~ z7%;%HhdlO|HH}2k@u|#G+{!~2L`_t+O0NBE%b2fk9bcya*yZWHt?HuBVZ|P`FJ(?I ziHq^T!ZLB-D}y>&*>vw;b5${skk?DLe%D=>MY>F!A;@y;Ls@nvmcS6rXKQ2j5aSp! z=dqSvnyU9d9yR&OBwQ8dx{obL^e3llN$g4Y)|`J^$LN%50T)$}irq)oiYubJO7zEer&w>^|73j^?!_sjln9Kdf-^l4oUWE&;_sRQ+ z5M=?l8&H3?bgK;3n5o~PwV&3{baMLF1u?|Q78)S8r;>ek}(w4`>M~B#=*8k0n=z8JE&^_QM%zP`;a+_`|~J zAAdG0w&nMo%cVD+-V;0DH62i2Y^MRvY5ut1y`WD|QT`_*An}IgXLlF==WdNSHdiEd zGXx(>ydp3Xfa=cyvGS^aO$_+$n849MP<;B>fyXV1=yC|{Y1)&Nf&m39XE+?;@p9|UzjL;ITd*fl;$ z|1qFypzN1dR&skH8AeUJgN(26;Hz4qooCxMsP5n}%1iARp|a!t!fSpT7^q|$+-_tf@rG3QG9yI2Lj*v3WBT+8 zs6$_%@ACrpZSH+@9iW{DX#arA`YmQ=6;X$-*)jRRd&a=a*~)5LEwtU(pd;J!6gau% z$Dd09qyZMKTS+aey{ND?A-{r6F|I$cH)iW_&l?N(c;O)=Z`Zc`M5I6)Pi ztSW6~(2d(nTXB$l94HrYYZM)uPC~77jhx4+tw3tzqkV+iMvCRp2|D_PrF{i6$+#f~ zTJ5l)`f>;b`DB)^j&QQpv=TT-b4;`e;E?B{cHz2xeJrQZVw6%2gVk z7UWIZoc$MPe5w)P!!P2(Wk(ji| zx)I}BJewPE=X85UcAGmw6KKXZ*CXE_$@oq>uoQ5>!2TqV8XBJa1IaLvKlXO`!MvIAF61wWXWWecjvw zu@uc)sn4&RW6X)yUJ{Q3?o`iJ9%*_Pz;g_Cr5=jAE=!0fwh!F%9j0hJ_{{4-_$<)1 z+U*s@tH&L?R>jQPIYyd1qaJ}p*lHU=RWi^WAwqTCoDMDXuuEko-+v57%e18bIX0~L z{~Q~8mlp)P!X5G4bBr81n4Nl`FbT@chq25{EtCYdxQQch!D@k8=MMU_3r(f+k4Ox4 ziERg%{IUvg&ustt87y@1(;C@cCZljeqx@aYfz0^*#8*);hMgB%ul2^D0zIZJR9a94 zl1@cuXr}&BSseJ@St{b11L?+F^Ll46mY0i=8BO{LsIugP>m2bT&(aPT==h#!R@Uh4 z4pzoc_^e?{^!=Mhf5nHlb};g7*ZX~yh)CiUE%PeZaep^?$ms3)`?)x>_!QSkrfHKk znx_dCCKi^jN?sj@hV$8d^Km}{dAWQtH7TXh^0^ zZ9|y#>N~72>TMROA>eg*_rWpv7s=wJML_;rCJVtdYJv(HPcNe2=i2q8`1q+Jh?)GP zlfrD+x147WD13C6doQzpv*1b!>`QAQEqoze?)q35%YPwH6YxGvjknp5AKlpN)~a(5 zN?s|4Cr%)bOAu=gn5(B6YE@0Oo|neR;=Nn;|VH z-d%ik9)eBynJF%x7kDF3kQaa0IlWn}d$n+_CdUvneZT8GtfdcdLSqlBJE_)&B^K#V zi?OA3N{WWEyhy#H#QEKD5{)!t!@rUUCk~uqr6S{OsFMt_qn5jJVj$P9jJ!NOAHN}(h zW~NzN>43*W_YK_Nym0heBi_cE?HlY@=+uH6n3Zz2Y1=S;5L!@rAnci;*Sg+k%rx~q zY&ZNsdG{0LArgWYf5&$9rKkKc0I!Vew?89kUV7XTHgbR)9N)@uR`42#HpDkYWIh1r ziW?)too2nJzuz%S6kM__f1AvedsR<+&KKZtigv%76w0udyP~4~6*W+TyE9)s?7AW3 z=UITT&KX`daky0irb}o>+2fa8vW}WH*Xjke9Z+EX+ae6Bnfjy=9tc+OiqB7Fh$GQC z=5?;Js*rbm{_r3SXhOziL&dGz&CEDDz*`5IP@4TNo6~92vs5jZkwhLEWG@b+d1&F7^B}T{u$;VvK zks*B00NkyjWsOL>P!(&6>=4jWD}CsO>XR9G@KZBiS&qL;v&-oplXk!t`Uhb|Q69t* zKNBg@1|M6T-{cWsjQi63zBdu_y4AX#bhhB5Qslb#@YyLf;jk*T4R-dM3V=naE*KxX zZ}(6L3hLZHBNCJhx=vl0??&c`hGLS^0?i&l`~P0Sop2wf&nuu;kJuUHTEZe(X~K_u zd1JAj7V229XA9X+xa{*nRwijikoZVtxPzxQ)exBTrkH}{1@5p%hgD&~5!L3@utD`{ z(rn4>_d;g(ic$P#rd+eFMfl$zy1nR{Ck{1%Zb%0BHO-gPenMwd>6f40Ww>}oqzbx; zKVzeL0U0G?*vLFY$=T&G6eqX`ldF7KY*h&J=e5@Y*k)v@^`0OC>`65s`?x zaw>MwZga}&H#fw2jZ??K@UHJ}r|?$gOpGdtTXVy~TZh4kQ~A>9FM5{`eX`Il$y5}CQvjkRC!F2aYOvFu zYxxk9$Qx~lbu><{@?3sSilO(lSQR$@7~7lR6`@bs5kD4M5k#G}H;B}3Zs#=|zC-k0 zgIb1kIkU_(B~XPLVYX|LT#=yU)>i?vtHX|(v)-q#GP3g!RL+-}Z)qtF=Dgc62be`Q zTS7|WGweq{c+-fAn=&G~0D)Eo`sOq+322k zx&251$SBHLiQmsXC6iHjPY*Rquxx02`Lti_uAEfCK3H@Oj>u+fB0ukYI=gA2tG+YV zAix?l)TG&KJM0mjH~L(~?W^|Q{W$6le}#tb(_U)DQ#^RDPKwqUz^&@uIUpZ=Ux7HhQu4p5Vn)Veug>;0G?>Q#Ys*Y3Cy%k7i_jLy0 zm3$)JT}XEWhOx#2a!ZI8sTQv8)72H=uHL;`gXdzsQwBDFd)3Ne5Ma-so@?UtbIq=g z4B1axGLzo!$FMq}j|H`>OeyvVKlYUg(r)ET$7aWRdk_FC^Uk+#V(+Zm7BzO!HC>RB zP%>eVwM8)FIvt{C-Ys!gm=%OK;67_Ct>m>L8}+Z!O;_*p#%zTyUh`K|*$voX#LgNp zs=>)L_L0tmC)mhv+!J**qFxYP7>E^l3GrBKNHbf(FZ%2os-=oohd5pJpWZDfo1iJIlD;d{j1RJK@s+ zA37wre6F%=UOY8{dPwQ**Accziy&O%rot`=4eEw&dnl16L`+V$dlQNmU#Ju~7swbp zJ12?$%A7)mKjW>yS#ABe?kD&U{P2(7*|fmU4e5O8uz^w%Zf#M6?uw7X8iYFmaC7u*LaG zN!9foi>)^sWdL?FXOnqK2Cd+Ecz~< zdZ*zqQ=j3p0mb@g@!OA#`a8Y(wgjzCFl`82F;CL>^<2frR`%P$1b`WrOtsUlj>m)) z;NGL9w}dQ@QJDb4SUqxmuXQ29%~p{#%n%&^Ui1hA^0W$g+&r^57%QxPq0IOC-05f% zzjd{*`0|MPtvB_+qk0xa>w;GXMJ^6by?;2dCPOt%(Tw2M_{j|_hG3RdR6M*JqK+_j zk~Uu{d%ZQW-?s>xBW2svk_f(t#wX0-Q8`wg2qT2bql*?HO<10;bO{fgc`??#9Q+t^fLN9^Bz^)aq9CG7K)5H)JfF?lhNMO z+;UPn46my;aFn_Ac!&{RqLpMHsI=?r zz0}%+12CAehHbKt89wU2Q1_Xz{KHKru|%?AT=$^SZV=C+qHpW$pi!XZ?XXW^OBDpY z;!*v-&_bG7!5_4VcAHt)tL?1Ks`$Q|%nM$J@$}7vUJet&^Is}(YKUvsoCCH{1>SU- zmfzX%>Kc37nH8cgF_J?Izn!YaxDl!ynwMDxC*@%@AnA9G|Cr>|wOm1%WSHei(J?(q z9N^n-{SiK!l$S@jyZ}rnC5U|(jV%|My#P^e+V#wX($s$WnuaSSAvZzMPghM21G}Yt zMnHTL`E&1OQ1{;r`%nrPeN1GOWC6P|u^!u1WV8<_rlw=4osJOX50L`xr}aLMb2NC% z`l#o?eJS%JFJ1!@ADD@(G%E|F-HM?6~oEKN-hA)=V=FtlMXm~XqZlVQ4) zymAqBH@qq*arfZ84Sh%+q>6!c;%LJJ(B*iy+-2aqyFTLRi*!GNuY~iBN&_3r3w<%; z{mS?1a`v6O2tNHK^m-4)c-b=?vQE!wX?3-NGUmuTw8chz!=E&6Ih36@=+@ydAg1oD zVJ{6gHx|-#cV=>g%UlbtFZVJg zPBWQNj`b1biB2e5Dm(4eo5d~9)9K_bl6q$vDqcYA%@^u^2ui0i+mMOruP&KOdGSz>^%`D7vo(VXu?0wR15FIL7)M zn@51BF(y?PSBXjlGFAUr;!HLxRrFc-s!ibnz>hJP;GQPk?LnS+fr5uMsqR}ltGb|H zwnXhW?h_ja179LI79)Ekxgf^2ffEdvVVw$8Lp(H|3RFh*{Gc4BDVi1wRWL7jd;RbO z9p^odZp}+%VH}`Yn(g+b96T4B*m5so*svwyp?^zfNQONBMkyt|W?8wq7;6BH;jj13 z)t@q8XS)gDBx0)IEsKO6B50%c8n^(}8|Hy+LShH(Di+DTo^FlBOswKV(oN1fXF+l~ zfE#epipYHb=%xvD*sWlRyYx{ZtN^Ubt)pu@r;P4Y06deKNn0L=t8`5>i(*N+7Q{BB zf34V&ty6l@2Ox9?kK@BOb&79O0I2#$%BNQs5o)I%EM039DCnKA;wWCtk~LUxc(@$^-b!?CLV?RUS`#4 zE1JA>{qW^Hy^Qoj#h-u=&w1lZ(1@h}AX(}mD(UeR!oSL= z%-R4M>M5+)0 z=Ni!TAVul<5^E>)x|Ij<(w$cE&%r)Y2ZTLf@DZoN4PbiI-`7uszQ!T=X7=g*NW!;P z`QBIqBbKD8)_ANC1t`K$>;RoO@^&!u6`p{gK(^OTz2gx2P2e+HvN>ICKqV{WDqDZoozB!@EW3=TW+dYQ_-t{l_yBhrK3@_oeY2 z?2#Ua#cnlTO06=akI~StfHvPx4?Vb5QkSvufUxJ;mrChOAgg}WMn^CeJwvZ}q=^#E zk?n$ku-|hxB+ttZpcVd8cJ|_^O>e5XcLbKb)0BVTo0;))4Xatpcgp7k1N!* z9ZW|Dpl+B98dY{FepMda-F!mgQfuCF@w6lt-r6vSpuP8F`T7I}nByOU76)K5YTTD@ z+$ldb47XSsx_y(pho-^_^DaXdic{=qFTqy6%pLxsf&AR7VDZlB(@sKt!}Lb{NczF* zK|E7^oUIGXwugvNzWJ$viK5l_om{--j>r@WSwZSm_^d1wNdOn%k1RE9FH2y3h+b1{ zOG-ccl06_A-1jl_$0H0u$*AfMFVhDvRtZn1y&rh!l%8y4k~NB5Um8}&Xn;0$je-7j zINjr=g=m5(;xx)mytZjsruxG)=$QL;I}M*NmJ=({A-;X(pKWqe<*F7e6?aRAG^CU9 zvecI&&=nw5Ol5NtDGfh!!eWp7LqU*HwP#n;20udZVf0^D_H{+_JzXZ`qlrFmcsc|f zW{oEtrJCKAEkihZT4xSkGG0JSe(Ie-Zi)PGU3i{XL^+19)jb@BIo;uE0d|XMN6ClH z=p^U|-g)l~F?9nef9>aox)tqFPz(jNhc&7r{Q5et!8jZ4E9s}T)TBq+NV6P?SS1A6 zej>F!t1s;j@=6<<3Tz6Y!4f)*Dml^0>$Bm(o@*HyYh-HdO?Y{HDt=_6d8+SgFM~c`{>J2p zloVBe_}D?mn{D-BN8#kL9s>) zCV|U2MnvW5BFoG%gVtM*4ds7H^I4RuuVPMNu}B4$hf}|*A#qDEBEEfz%~H?!?9IM| zyMsJb4^9+c2HPz0Iiq-c7W9K-JT@P{uFB`oPN}(oey?-2;R^g$Qq^lgx;`3p6OucY z+My4oPh4IvC9-|W^xg<8eykwZ@^7;HU=s9V(uhp*vylwk=y~L}` z{pN6rZ(ugx9qv`Jp7=ixAepdV#t}Dkr0bWZVai26_?@(-rdgT5rhhD~5wf`$efqL(04g%D=>;}IEjw;ljCQcT^ z2VXm66nzNZt@eEI``~`Qf%G=mCorOW25PFvfuQ$insh!g6hv;k-}v%@kI$79aE~#P zc%r^#wo9tYp@pacnGsQ(*nCOLCF0q#i}y~WJ8I#qVq`wN$ZpZ9#$&?qoaoXsZ#*sg zDe$Uqjj{}BUKgr3kwMJ#B(_=(aDVI%WS|5DP+a{d=C2Ea9?GnwF-gyb&t3OYJu_5| zl@R_KWk#lW=-cy}nDn9Ms5SHm5tkJQTv(W3_>V1cQn|0|;gFJ-ap4B>ztQSeTEB1eTn@PZ_n#3PV3_3h&Z73sE>M*pD@Od4aIMDo z1J1gh~ZUcK+K0gOZ?6&G;s37qc|=@tEJj`JTG1u)XM+l0?F30 zod^}rcRrs}9A3RmVIRwHoc%eEyBCA@+%((eZ1O!Uz0IpgG( z6^-B<6M5y-JI+^fR0^ppewJ;*#HXMiR7e_#^l0D~@&bsW`l2?G;h+QcYMWj@nLGizqmbQB(7IP zt3VyBGbZMxytXBPwsn)dh2Bu*nn#JyH_LdCBs@4ubC!ma@$Xj6EB8&ZIn*2%bOAIL9t9A=0Rc03$6 zzyi%P&UrvR&wQg#5>#v*j9%u8Qp>SchMrS8rm2GwEZ4oJFGR)aaw^C2$^lt0{^z)zvUbamT+E^6IX9b`i^SqHy`m1g4F4hBfD)6ir?PZ*mSJ->E^g4T3e$$ z<*@6fj)+{~|LLW(6|YWGH5XTyApkNly&yVsNNf)rc179( z8s!nZ0!h`bQ=6zyVa1blPv2g+tz-ES#;4tk8yc#R7V7?cw6hK08GGN7tHK)E_ZglC zD=6?=MmPvd=RgTjo>uT6Sq&wiQ~k-WI^TbGZ-ZlUIr8P1gh7w`@Bo!)jk)X%d70Bs zIsqcFblj^ZR?Exl<@iHMg-FttZie;GKU-7LsM&COtY=~iuUK;^>qUFw)p_dCfr@m+ z)Sfey?m9Zi(8k<9?+XIF@$!2imb#>Fy;Gf?5r(C0w?Ygf`h6|l0WG>tHvMbP`qwk2 z(^XdSlOJwuw_`+DTqa%i&KX0Q9RJlyCtOtkcW~^M6EmCO*x{{x_j^}`2qnB{86L!kOTpxnFx)(yR z_80(p+6Rr|L!*@y9kB@|7dEDVB#!3(OiSr}1EUdA252V+8)nA)bgHvvI8hq0EsQpl z@zZy9C>s`7&9fMId5fIQch zNJs2T{o0MXZISfySwyt;>5N}THkFQv<@y7!yuJ1Z>!_ifwUSb+* zqQG(kKO9MKL7cmuVU_}oszx`Q=7L1NqZ4~rWUI8JE{3 zXqw0L)_0x|Y|16$q*3$DPG#m9yV`ra(ZT?@+PO1pog;6yV;wC6q?93^dRJD)R$piTa)m zjii@_@}f-uI8;Dzllap!&l9jwxAWCDz}bPc1IY&?3~eyl3}^PiDi(lhOqT4jlN`d1 zsYVg9dvrV_I{MEjm|s`6l@p`si$f|PY1^>P)jCZm_P`xAvMkrHo(Yvic*MeF_{8d$ zc&mAb(ECun-oF+3W|x%`1you_sD#u2igXcM=LqjkM5=Qlq|5Jw);7q~VGAr+|72@_ z^eA)2_@mpEWPM+F{Jl; z4~-W~<3#bT{IL&I^7l}tX?;`NTUbqELj~?F4_HCo4j4Q!M)YS;Bh4Pbu086<-nZbta2^14PlI|g)V_7;=8K?`03^G05=s4>(7ewkV zaH&VK?&VV7ZX=D0b24_Fd23TUwQM%KKa05OU;qGE#7LK z?+bIqmmJESnKQmG(6)*UdgGXIUB8vZS2L|Pc?N>umLCc*>coDu1hq7hmSaD^7X$g7 zd_(3`j8){mjvJ+1OV^hFWzGEq|E6?P=G1KXIs+E1MtGxszp&*5dB6#qT0cbd7rhFeUNJ@FAFqw+J<*y4{F4 zH%=-!^`E_SgV_>I(A8lT98NW^x)9{K6cm!h3U<>>pwaE9y%9S6E9`!ljH7!G>}c5; z*+!YC9INxl#VFq1b^ckb@0`sax9#A8%|I+G?HVp(87FCq0phsl;sN0Q zi==2qnltd!sdhF`z6*q<|hmJrbnv?#;nif^6nD#dtO5+tQkHZP%Q@#b31$cV4Xle; z6-Wa@#>j?XGLL`m)hdR0@dM16^92sxo-t-oln^~OrqmXXZMnxQ->->bQ=LMaGv4?Ptzk z+m>hs8qAprhPf{m?X7zymc2!-c0~(5-hSepzgjb?7zK;BJMs^YIl)j%>R;*cI5Ecw5hIkvpy6mZHL&A6AYRdg8fH|=2;qDxb`|KcR^Q60vW8p} zvCjdEbZL!z2xU6<58EJS@D1=khP5=g;<73RomylUbElv_8NSD~W!DF^#d_lEdG=Y9G4I~@PgXT_YJxowJ1q-8OS&wSv2YNRVSqDiw&ch>nf*fpJdCG4E$x@9Is70&x?$h)%J?*s z!x!2-@+4(#G89lL`R|JR>D<>KmiodPgo)YE+f$yw8kv3XjINABm(S8BGiAW;XwW-| zL%hj|Y&uz|38s4tV)zD4R9tD(2pmhCWheyKVOjbC$Z!vBKe#-3#srQ97Jo0oMUGTu zoa*ou%Vk*x|hG|_%&L1NWqvzacVVKtfyuVtT zK~S}D#ePc1Z$Fw$eZfhM!X?;FhXY+NVaZ|vVdLK{=<<_!2BA9QLflJ6%h4fN>>r37 zpea6xN(&IOKKGp0@_LC1@}w;9-N{rAId6)W6D`9gb*h`mB@ z+RH$#o(KqBKNQ=4S1)NbQ`tFT?3Z?w{Qcb}I^Rq(-w1@8KWKlvcZ8{6?9?CRcWbY7G1Ef&W4dgVyN zcmA(-$$~sXCrJDy91WkO|1jP^QU-)m9(kI7`sMM;FXX8rls04eb$-`SupvQ_h_pcB z2|X0SmkqDhk5h|CpUKT%VRX{HddA2KTlwfqoSlh+;pkR@5xdPEx|8n=X_bqgmA?8u zL>K5JYkV1c`#hcR9!CzqOT1TUM8-8G>s)YFB9Kj2{Ftq$kUM}n>h=sXbn^Hzpwsw9 z=t{t~5)$C%fyn6dx!l~tYHYO-(egI+!spoQtdeV2T)m9%tCag1yLC3xE=|~f6cI(C zP=pU^@V;N?!W+bs76EVrRXMVqGb(lhm~jQP%*J2vh03|_4p0TV$ep8-SN8_q=JuV7 zBw0{mYzKr~@okIv;IEmf2;DnJy-)GS5NC%9mY*iyTk2j(?J(;vCrQ{# z?BNpVDJFL653}(tms-+Bu)1KGn}BukHW}@A$ zam0Smy|02PE8ZF3*W(KG5OW5Mo_5*iXf?5Hs7xQ|tp+lComhRgc+_M5o~rdNvHrNq ziW$D0Oxl2xer~j(f^%By6rCxwN$uA$x|To2k}01vfiX+8_GX0xmQT7=P8=1w+UL}7 z{c&}Qul>k-c6;E*QOAPG3)d)1yLyMEyCY?WDBnpE*I2(CuI2TO*cx^T#__$5WLiMh zwa@;zz34^byEs8rgC_T_i>mt*Deh(Z%XDf+HJ;uKwVT3kjKD-G`?A!;*y4v!u`)Jfo|qWQeub{cK6HN~sC z^((Rg65%eFCdLCkZ4MA%iZ7mep@6IRbSEz13M>+<-#X8I|8PUwZbo)VXou9;t#0zL zWW#cMK~>rq7dIXvvC)S7WWTd@vS+BJcLWVQOp8DcP8;Xu?Y}$-OWAM5&V!8|4viku zjEsJttw{9-cnS$YP`YVeC(_Y;vbidOktMK$QWfwt-6egPpQ=~mZMwG>43)k2rAak~ zZA6rCc4gSNu1rdlNE@cf9`Q0yXd3>hZ0C=gLyZ~FT=SMLmqA+)o+?SGMY7EJtW7|y z{9i^4*&%@~9Efo%qZBW-ib zppO-rPi@07EodXcl&GXbO_b-nP=yi~_O8+WG2WXYChO1KTdSln;@%63IQ%W)c~Ler zJOjG#!}BAuBysDg%HOP1{E}sVvPlGI{+CnF1yALAs~YQ0z7!Ke=;EO!T`<5cWxez4 z2iJuHG)QN{A4>D;@&Tdj#c!M7kId(~0V=Nm(~AIXq6RZr0A?vhMyBLISTyk{v_-1h z<;DwAcO+J`U$P%sc-E*7>3#;K>@wM>-#8%;>7J-PY^Sg$-W%DQhp>4Qiq>6Sr*$fD zr5@c9FYxAs`o$gHvD(4JLO=%-r?jbY=&Q{Za}~z1Isv~C{zVhOHqYk|M{mk@jcxTB zois^2Gp>8Uk%xzW8G+DC_&>N@pP3t#90NsWKL7$JYU2zxIjfMgLX)Jl1NxvBS_Rtl z22z9vSgSc3#xlLMj3B?Zm~(4e;6a5Bzo0Xq#~+F?_)nt-CUzojcf>}BuiUUoyv z^iA_kf$?huSEX^9 zXo~x#Sw-5gL)qlItCoX?N$G2jGk$r2G3~}~MJ(OhMUxJFxA?9&w0XUH^Z+JWNlS2X zie8`I4Ty&@yKX844(ia=OUr&b6+K+>4yPhD#`Hk`57yoTD5`F2*HskBK@iC_NCwH0 zLn{a~7M))I7;?$Dn`6TdX#I+<<~)1yj!37;sK<3i;r_XqU~itq z+Z?Rxn;p|0hq1=?D(S&uuL5}8Ry#rUWjYcjkDHrpz~ZVtK^|F2;7U#gpj%JN6R+{= zOJF2Yu38s2`#+oLbQAuJnw=vnMsW`04QLZ`^s8%2>nbNZfG$_A;>Vt1++I zaS3M>OBw1-pNmgGNYnK5SC#agk_Ok_y$c5f;Qq^wp;;$-u9&L4B;K1P<*)an&rhu? zJzfH*k6s);2YKApz-+#Y5aylds5a#LT)u{)V;yc$kPBN zd^#XXkwo00?gUn>JAFpk60w&Vs~~DE8$FcZpx@C;TgQjO0&oAw4B6?QCA3+@FWBZG)OG9V(Q4iM;IY7mjRRVb)cn zk-i1XAJu^Imgt=BWuBFAk~68)5e{a}_jk7&0M|Zocw1-W^3^4L>etX^kra2q@|oi@ z;5s695JMX?b6sNImIZRLVRxh4ua{>b>#O`^XQA#5^iJj<(h#Ks(Onrpof+g=nxmQOKaFN2T+b$wCnf zn#qJ>A>D0#Ud2F{JQIaljgJTCTV2%Vy)suG15CN_bnoJm->aw7Dela(fYti<#=2vW z$=*_6D|OI|K4Safu8C6=UbK2<-9y!kcV?!BaA+c)x#jt{gVS!JOl!MeUvwrwwe6WF zzk;I5u38lHtb~~8(k@p z!l&BY8KjLJwuwBCICYKlY*3YtgwSEyKh#SRbW_^1$>S%P z6cI7^u%B}PQqz!?&^W+kS2FOMKLn`Kgc2tg4174v!{gZfx-Z*>T^?56dCOpo-z8p! zY_>OVlG9&)gS#uby3px_9Wd|(GYn6rH~d}lPssLZU3uQ=8Kl78>3kbe%i%5~LAWQNq5@c$fLmW9 z{=t5E8+(iA(May9fOJt^tjZ483*ic*98xUzv02&7kcBd6auC_WoWKiuYyijQhxAEG z;q~DN`NQuaF1oApqflpEtYchu{5dn@nb*o&#eC7ltxv`A~~@d)uBy3cMzq3XvW zctG@W#5V2M4)K^5G^w3`^o%H7tV)>*s=FXN@#j1oDuY+_{L#(g7Ta^z4C6L&2qA_A zIy)z${d+;b)f|+Iw1JRcCFq?-6v5+d9|JZCOHaY5G@sUu;47o4y^H7;QGzACB zOQz{%I#sXOFo2LCBcaAcGH&oh<4KCGazk*~Dcs_v2`{!DY`=i_+Qci!1SsxW8uor!ne23`_(HL=O1hCKR z&@a^>9jF$iwMaXx)rKJ-pFYdI8Pu2;030Uy#n)JT?7z@GOvV`OYI*r{?-!--)V<9RI>~`W2;>z}r)e+JXPqw3S2WB@+J8I$o5K->wT z2flvwF;VntZa+cH;NI-z!lsMOuv>!*cajr1`!fQ%Z6(0Gmjc1sT#HxeX&(I$ArpW)ff^}JxZ`Rz=>x$L&yBB0n zyr<(`uC|_yT?3^@P0$e1Z8=~9JTjK%2S$(O?w4ASQhS;yyJ~uz7mAeZAqmjO=9d3+ zrdu*i&jTZK|1~OqkJC>g;I?1gzH`&O_kZ*DFJuA!e_^@b13Cat5C~kC;@7}Nb-?Uc z1QauA)awiOePJX5z%ZYc_Moy5*meB5Jt|#-PPs|efl6wzhjjV<%{9_XlK|J~hyB-` zk1u=fth57HexmXM`)0UEQlG9W`LdZ6Yt$ftK;K+n(=Tt?`6Uwa_j70e`8=0TWDBYnhGve}5nT{x$#eFFpv~FnYT1 zTK+yS{5M1W_n7~WzsQcbA<~t$sp|hX!|-1R=70PhYv8#xk0kf`zYPAOya9jde#)u8 z2@e1F-jmn>BZP|Q^4@=$3IF2{{ND^;2tRPk!mDuQ9slp%v(g(HqoCp8zk@&i|BnT+ z+08A>X}j5HsujF~kshD1rj5;z%KOeUE-(Q3U#r<46>Ryz?@#SWw>xFw!1SXb1_&4g zMEk6&05hUUqbw+)`YoSAqEPzX(|=I6nv6p^d!mWro;zFoKVV&nF7d?(^MQ-dLG z1BExotYcs<;-xEsjpa8preqEBFyxbN$dQ* zor85Vu325a`-T6iUi;61<(ZuuKByQh;CTJUQ|7)lv`IAV;V{MODj_^n=B6C3?{gio zL8FU5q21h4J39l7-VJqY;a}9PxIhCq5#UoxD1Yu=yZ2o1O-(_>jFWdF`hQBdD*y4u z7p2jbwNx?sA5GA1-Tlb0l#8ZQM6jzDWT}SNhS>+`A77vSpGa5oKplCq<-ftM)TG%G zHhFY23{x6s3na98G78kY2^GxFjat9F7KgmqSY?f)-HQUr@{=YI+{L(G2t9vU3~do# z4`*kMG)_Q|$zP03smqVRpgyHv9Pni@+;%E}syUTzRRN5ojelUlZXi1cR`dnEY$pO|$RqH>fWN8L+v|p1L6Wn5h<< z^rcxs>ls5nXu@%(;85)1xIzvEwPb*vJEd*M)@5|MO+9RlmmWjdp0BVe&`mVf^N=jU zaLu(o0v!~VnT7<5L&5op7~O>|Z?)0v#aW-e9sWk+Gaz_hhyg`69n{kEP?Hd$i|i^_ zz=EzP;z^AB?w07JkYMr+hJN0QPx8_UcqBK!^@V8^Dg|sHSxo#H=`Jk_}W z^!nw4!7wH=szv4Id|!4m)FvkEcM@4R+d0(0Y&cy)iCif&2>Lq*9&D!MT zjh^9bo?mIy5xREOebwP0DFr{|3a$r5cL0MCAusH;IZ zgT35!W}U#`EVNy798dYgUJ>L<-OUSJ6iUaq5GcjCleCd256kvVo4k99MRWtv8!o~t zQd`CPPT%y=7XavlCLT|~G6NtZ^|kIK)EmoK7@3;EtT(!l>iTF3= zGj#cPYLVNwX>T_klSZAiHoRMY5=#7H=h$2rUF;2xnl#(uu`+n>}s z^5qD7(h{z=X02_?p@(}fqAl}&@>$`Cj6lNlEQ~b{fg}iij@66t($mic!Q zq`u(~DliIl-9TRQ6yvoTTG4H*HEtvG&wG;-FCf{b*r80Kz&hisW9D(6_~_xBr%7L& z&OMtOOmfwTz&2tI2K*zygdnZz zNB5%H3yy*0wZ`3lfNRf6w4aFUPFcN~KZ)#8-A{^sN%=l!G+JJ2pLrNjnNpy`&Lg}k z+e<}I=!(V}h39E$-t4L5c*+gMf$;qcI?=|+|L?OSg!N{2U@QFxnyUT3M^ml-e@0VD zhf4kjnhN$_&|1Y@dyHtR2Z$n{tUY6Rh+n+G_$QU?rGxkpvb6W~B7@e6CY~USQ_$<_ zo>pQ809bI7et*YtjtQ7G2@H#a)KeDky6^cpJN!X>;j16sxh;$Xl!DVNw0OqXmg*^X zqh?vmBFIWiil=gl-N8%|IV&5AlRT-)uyfef`%&O@SZG=nH12(+J)2DlsM=Y8P@r1g z#=IWo!P^lK(;@#e6cM z;D3E1T;AVvBdIiZ)ES`S$kwC_|FFzD9);o{tB+C2TTS$++?Vw8_(v((-9wpdA;IXq zKvxpECT!D&FSRnm>0$Tzt13Uo}^j5Suzo1@-+$6y~*=V3;lwa!|(2^mpJsUuzPV+H_bV~AiU zM5iK4--2tjkGlk)XL)|(FB9;4zZtIa)z;;%;U0DsG{Cxw=9AQCEju6HzjDe(ueli# zXS(V}yhjdOBqY<>KaPRT0VZ58wOqyZlMJpKsu;}Pugmtm78Gq)5Pex%N4eY+v7U&Q zPOKwgR`76I>sjvoB3h03JDVnb(<24QrV;vvlLOtSFVZ5+EUGEQd{5v0<~x2kg8522 z3n=3Ly^d$T-BZrxV$lt9Ia`5$a14)zfD+*G*N|0N5ksTIi(fG%GQ4;P*jl`Wl-~0ssxlvw`EP zb5t^419aK#%z#Eq0EX&vawS+zpSz~KP;-o6#zYnCi~Oat{5k0}ku0H%*!k>|a^5;N zxWOOMLeb>=I>>a2lSZ1*&esY2qT8+En5u;iKder7H>)kqzZKZ5PrbaVC3#K{9O%E| zNJwqaHk@P)y(5nt8wU#S0fWUGyf**^l}cojl_Z{ObpIa&s<8uc$q`tHu(^l3Uh|=E zCfg@IUK}%}KLn~M?W@eOBOXD&x8{hjljSE(9O3CljKX8xi1=b0ns^fb4auMo19AD0 z^^?jcg{t>Y$>P=4Lz~3Pz~31c39`t4H|pgxX?d9nkK!EqBkW<>|!+37-M3NO7>9az4-*4MFZiR zG_=a95L-zbOyILtq8iDTI6BaiKsjw(GEj}?){l6rOyNkPsFe@{AMWm;MUg1JSEP2o zNQuM4)knev18{%-2a}4^J?24I;tj9&Cc#NN*Sug);VXeCA5i^T_?xu#C03m+@W{)T z;u0Jr{~=Q4HcPWE7DDp6K$`kmrL9AG?1aNL*(rt7TLV$^d7Y+{im~ zxVil)pA>)~xG`8f8XDkj0o{NGKHj^)*&GJi0Tf8ll_1WH;qy_bbUs4;H;lYiM?!rD zxesi~Pv+Gd>ke@S_(jYH*|%FPW-audAejfFsgFx!S(LuCpc%kkpGSP@IIaa{4FC&( zjm_hQ`uhbuLjox_WEODp;*Zmw_nDMq<2=GQ05|jn`zAm-KK&KLU9(@1Cv}l<$6ea% z^|dqwuZKI(nC5R#RRyW|BzbzQ2;(!dq-dpfXPU7(edbCG&P*$CM#6zEL!_In+i~k= z*Y9TK7WxQ6;jxnRG&KMW%?=4YHZ*iE*OjveqeH$tK5jUIeWHd7hm+d@B0=b@Tl<@k zrkpIK#y%R7cMdtf;YuAv@S!9_#I@Gt^M+xWd}YPg9fLv30O-ip75R^xJP5p}0zU{Y z9NS9m=z4htnp&e>#G{!bKn- zU=ICD5Q)jf`44oInK9;W=0+=5>oWvb+dA1Ta>KiO=g>}th*N|&wAVgEm5cMrVC}y} zN1e?43msJ;@Nej-?Zb~^f6!5!I<>e22H&(;dQHp`1QqBa7^Ly0K1>TJPX)BXlB#J+ zuoI{60Juo+CtuNhie^)+bq9uaPUkK`rSwQ8nO!5J1H|B+{XyQk8+pgwMV`6RU) zK<$Kl!n_D{^^5(Hdvl0>*-9v*i&3}6It_=aB#~JLgZu%5oz^j^?}*%FkkcULpNuf_ zr%qNO$-jZ+vSYX>zT(aq`imbrB@d@=3FlkoTs`OllkBbjoL)!xuU&|QdncalgU4JC z8-;Dw+E5-StH~wq8rSuAzPyt~Q1r=2#wGwV*6LT+WH+i7I{o4KXcr_4h!qfcP zRnIjxyfLxNyKVqWe#py;l&KJ*#rs?4nrQV-^Waw8-REefPX8Q93>zM`>{){v@AkjwXtCe?w{PfZ z*YhLIYx?!aYe9(O`b&!oBoTZ>y+f1~I}!Og8cP*0r)kKFCO;d@X zaiur`dI10EOOQ6@Hb3glYaF)5>DWAvL@_lSW*wmUCzjhtXSF$7fzHI+Ic4Z5T%e%P zr7Y;P<8m~pMJ}_M|0#0;E#Pc@$e;vhOww{cmE@`RH}MiQ=7xbfF0~(xD~rC5U2gaQ zpvdkESndtQslyeFqJZ8|oWfy6nt=Co#f>ah1gq?-S#hwTi=B^V@yE-(rG|)deF;`= z*P_RL-FNW+!I)Z$H%@Fxzv5)liY%JSPkYD;3wrZaL$-lU3q8Yjb-N2nUO{+Y{3=~Q zOuRu01Oix7az&&0@g>IqZ7PxXQk>iEdzmuOl`!t80&Z2S^I)m9iHh|5pJ$!A-?-_3 z7x9`eWjfuX)0mFFs){j7Z{G|#ig{|+O4wES-8!)gU^H8t99LMh@}8TlHUmjCRfft} zPDg$2qt|ypIp4#B;kB_ ztHoV?j-Jm+PSn-TLLdjtc^VCFq_Z`9uRhOg8qZDd<=cxty9?l&u)}V_#K5krnA^#T z*ewu9+{1$myF0m#r!0Jg@zpB$0HWZTAK*G)_&46t*8(U)pXKbRC*$PUV+c;+hX;g%ZSOSV+v1O@z6>@K%&G z3kLvilCr#kH+|7!zS{h4M>UiEao&+ZRlvU^JL-cPVONxgs`gp=gJ~`}jvHz!QIRn& zgaJ5K@k}Fv0mlswZ`0BUz}dLSXY{tz=;u%)zW}PiX<#AAF*gB2c~~tSYX|+~2$?h5 zHbQq>=+sK!kgV1JW%KVJ4T`~^P}hJ680hD7pF_Wv!`ARe z&#UCVP*lA3JsN$H5zrbYXvQOwd}*!HY!W?+_EJJd)JGtYPs(3&HFyCqK0UZ&n-L|y zqds6j%#(Si-Qrc&sIV&kp64D(hsVjBM(v^`K%cb~gY1Y9*r=#5b43@IMN2xSjOGtB zt-p<@2nJ~Bpe*s}7zK?A9;D*}M69JkTc;YYpKgC>LT}`UXH>bSc`fh&CY<3@F72AjaP1#syDikq zgE|xS73qr3U6a;Q+my)gP#rEvd&~6J{gQAiezg`WYsVW-wQ-9eq>0l+tHG;^a92+r0?j<0Q4HeBh0|-nKM)0hS<2 zC~=601_`1}-4U-onG?EoReT8&UbQeo^jKb{KyVLq`GD%$Pf4`H-;2+~y9eJ~WG*d> zzFF^*uN=!Q0KDjbK-V?2g{`?pkT&Asl9n^q;Z0@5&#Qv0(PBil>GJ$&L>`Any|Vg# zh7esA(`M?om9Ghde9-;l2Nil)`_TlFg)fql13A)E2$P&H08PDz#&oC(zn%g7YY5FU zF7Ux4{=i$RsNd)toapQ_+)FO5;KlL{Nee#odv}RrVFEyD>DkGM90by#3CR7zawY&( z->AJYvH{Tfi29`<^5>tA5~J;Cro8<}6D1i-j2DPgZDhZM<57Mz%)j(n!H>u)aCQx(3zC8>Mz;CJ8DS6`w?9A}~aWKt9&vdi^) zWs_Q>l(qM$njnBmhE2O7)y1R{vz***SUdZRwv-0)xH&oL;M9S3`((!LHxs4Z>_)$# z+1T|+=9>w$OCQu0DekN5Kv(Z;GUMfR+^r_p(MG0*a(c+I!LFLq5^NUUx_nsyRDK&e zb=oY%7)5pWUW1NF>!WgxL{)4p3j4U-I!@MlV%y_Io!`S*kBuv`r8S95crXNC_D6>3 z>VC>AJAb!26tozv)2repR$ux~R;9wb&j=7tzaPp0{I+FHs;-=cP!%DXCtaGr36Tpe zCyN3sdwfLowHNpwsq1wUfhX^r;OJ2n(&dW5M$<3hQIvsf?hS7VstgbYyEYf{OpPeV zZh%YO(F&Q+WvyN1&Wflk-oR1nmCyyaPhU4|tGAUVIpVTieqFF7ClM7Om7$Vgl-Y8m zUpoG%A9*z^AayTHuC;5Id)2)625|)P>bl z_Viwx!99T_^~?|0>8kl~f!8JU_}USD~fJEg-~J$oGX)(lpXh8E?u+ zetOoU&U%8n=2D4ric?STN*DDm&v%;dJSESsTc3dYD&lh%iK7YHfaU>g=;H^R>qP)@ zQo~ObhAEWK_v%$7c!n0Owk%33zN!u6(i408E@R_Q`2Y{yup%lhEX~hOH*z6Tzh+_# z)hR3iD3-CfTE)mMpoVJfoUtfDkmO`r4#_Ull$;E^I88qb*bMD;mbBp=GMOwsU`6?i z$Fs}RjkmrwNO+OZ9LPpWjpRsOWu(RwhVgZ{+};U%0didN9pe9*5MUgF<@s%l<*#RF zwind)yjGvp6^!W{ikQx`KPVKJBu8M*X$pBTE%b=Xp4H#k$1Hh>vNf)kiu+x(UJ7kgY z$#f-1Y-|Nc&dLRdg~`?vZSMMRsMHY)xlK6v*I0& z*(ik|8O?)2V3kT#rxYU+xeAavPU9LKUNu=fI&LQ|FK&zA5g{Y5xb+o5LH0d8NZXPk z+KolJz_!73*0T>_?kAx~-Gv;#Bf5N6sUjbl(%106{SIJW1nlHTZZI#$!mwJibsnI3 zwxMnPk*D)Nr#!7Jli`tk^P96Uoi6^O3kC?q$*oVQ76qsha(i{zIZyHaUX+L3cqV_x z>Pz*-UsEZpEgR{xDPukMwVxM-gH)S7&ZugGgdVI<6;yyL#xI|}78=kp8MzkBIJp&M zHKijJad9?P>Qi7Eqg^uzt#&?GgID)Kl~BYiH8Ar-EXd!JK2Yf%mDH&E?nM#Gh*#cF zmme^YMO}x+8eRZ%zG*jMR+FVAz4Xpeb(-H-5A^V&?$0->F1Hc%3+d4Z2P82M?mkyh zU`kN2B;HQ2!+fTInMm?nMQ=S`?Jm3JvxYQz;XPsVjOv4h#*3DP^k(=F61h0HFw=|v zlAfL_X&!Wdb&$$@zT8PiF#J4?GsE?$Id60RZ090k(qzK{Vj;4hi*G@2^ju0m%BF4{ z6<$ZhArj&f0%sLJF`@{@ws%J<2sN<J;7Dkdab{+FN{;ccr@& zBia=Enf};eL~g!W`_#liSRx0Lu08cmBGJ!P!#djvxUcmopPpP7_Afyxv@Kk+*=@Xjt{ ztloUbDxm+H*`yqUd-&6gNFaEgU>E21?SHZWh<2yuM4kdJk}566xozDMNZdrGvou77 zS0O`)aV}v~Vl&X|ZQJ{wp^lBLsJ57*m(Wmv)A&O_VxguhrkUJk;~>vkSQYthQT9zV zlv#4$BP0#q_>098*1p|s3t99S4oYbk>d8U=!`luzYBt>N-bor%AdNZzV^RvC)=$d3+QrxBq1a>>%F4i znDb?kSXrp)g$$(Tgy8|J{@KxzV9S6k<*O-2-_UCgv>cpX*oyb%Js+MsT4JN)ey9R$ z(vWk~x-@dz>KVp^Tf6(BRs6(4VclVfw;ov`Ci3@jpat3UB9z^AzZN~!Q;%VpDPPA3 ziBIE69{Gx&74Wob%CNESC{wJwM(ls=_9{af8V%w6*gCOsvCTt&B>;sSTaS@%&fq4m z@PDZCSMX?C*i$VrjSOoZ`LtVS5zY}@&reeRJFeM67qd<>n!6O$GH_y^*eYe)aE`oA zq#!kkyZw)s|L;Wq@@lOjUn#zOeBMv=JmXB4!MZVkdMYa~5y?8}kn|F&h*;ZfZD4uW z(N>Ocu?cZt$ba6e#%~tl+-L56z%dKs+h^t3usz!{ihe^E?cJXi&Oj%S@a)c8BE#@X9OXloB1g;$@#(VSnZf!uq<^KLzs3 z{KY^!wQa8P6!EapN$anl!-cf`bLg>+%&v-GV;PCwWwPUS?33<1hO1{5*QFxeI;CEB z@>a)TWM6_iIz=3ed5&0HtTnA?I!*NTWF(rOmBvPRI#p+*b7`r=CFI=4cfeNbQ{||y zwKVmdDQ+nD4rPe9K8+Fe5I4lQXZ-7&!*|0D?!@|-CZR|=XTJ@8)gsk5MC-fy!T$NDlv-R+y0lasTQ(sEu;{NWFXDhir zt_XF&&%oeS_{?bLl2|49)k=42Go;fi}WPzfyXMr@_*WWta)4 zgNAp1+mC3`_5alSv3vy|qca)5Lgw1OzT6y+4Dy>P4m?zgzgXItS>>&F^P3=g!*ENF zFs-)&%$7_=x7b{^NXlwiy%BidI{L65hl{iQs5SdIh_Gr|mg?!2YL z)Pkz*7X-ees0tdQoxx+IPICJZOkNs)OMp;fpb=?`E2mO8%9*sbx>XJ}wz~GBYyalY`@rMKY`V%tXn=b3R}NTNxU`3;i{S+2 zd308{oUU5!sb!}xK`@*td6K|2;rsp~-{IiU@Jx@zS1=BuoWk&6+-ielF%jY?sl<89{=ft=oo@MsQvL$#$+X>4sFxPs?bVgBjV0X9h>18EykKtBuoWkTOq z@ftKdgJrrUX;1oX!fj~@25zrWsu1|$QGBs+_W8BkvkjllrRf7M-bzi)3csWGI|DPz z&7pYo-mz8Oewk99cL6vmSVz+N$(Px>h4qXAywuHM4v4ZRz5Ao5cSCO7r^k5y0h{=? zJBE$BWlzjW>yM}IpbP^oMOs|z_ff}t4ELb1+pX1_FOA0=a)?>&d{Pz~$@X-rd-z|b zo^r9u-3ETex7Q!aLhuYn6D%9I$^=8>waW(wFb75c6s-yv8L zwp!0zlO>IVJa{d(x#rHfha7iD-w$@S5P&vjkk$+QDQCaZf^=c$a4R;Q%7--2YBH9Z zLYu8%8l>`1&{=Y$2J@Dn`yHMysOv`bD@FFMCl~|`(I3QM7po0SjMRxAPtY_Wme_?& zek?x|0gVWjbs76gmS0BVZKLzA$XDiXpGN9)Uq~2SI-`VtBP95KH+b)&;UcK7hV1| zU1{7~Z+N&nudM05k0a0#umO6#*`Q^hz{HmqUO>PD@Pfd-JHw(`V76nfDBEt|J7&9r zo5^Ehf*+7+lOb<{#6*u68JBzG0c;RCr`E>Exa-%)xHIAOR)V)`!^rL4Y;(1yo{*~}vjrPj zTVWB1kJr=nzS0H>(>vp$(q` z_B4Z%_8p-jq6~M&{i@u445c*&1?E25~eV%{IZ@_q4cK-MrnS1_^D+2XLQ%5^?ff9 zfuT8EB|;JztGGPb%H8-BuY=9+yk>SU3hUdIlw)t+v{!qNYK(i_C1?xt#niT+Dll{5 zIzeE5ZdLW{iM(QFy7RBs@}oQTA9J@@^(5bcx%5RubO~or-t8GC9_dR5DtqmfW?fa= z;=LbNvTNf^e>UPTT^iOj8@w-H0-%gwR9;6E>D2lR=-Zm|LB&`NNPpf8Zsp!FR`Ddl zv6`sU3IKuy8P8UoDEkxIcl_={#44h;uj4N^+Y9Y_xI9vp`$n>nZJzqdu47i0iU;KB$hjeN>N)7no=K(pFeCEi9P$ypxxRU~PEPypTKsIeu6%BDs&qGC)4FZ7ST279R-}O<%+l zs)ngJHXX+-^SC`28^Yt2k@!A1wh;;7W-t2eTVQdZkx3%G+Wwnm(W|6fV(-+KCcRmZz)H%p6#Rc0)|eV)|MCC)F;lo`+{s|6GV)H|dGi{|Z!~lI-7L%53ije2g7HpaDd()A28B82 zw+4x8iv(6g4TTu6blK3#nui1*U3_WG*o@vEFY1V*9_I2*h4Vxhx!s&)?#pnV$n$Sw zts;u<6FHqIzab9$0-o~?t|PKP&s>`n3OTN!lT5q*CEFE9O&cJS?_&V5Nj5)2YF#(C zXrTAf<*Q&u_uh@9x{+?&_l^T+_J6oJuSlS!HkU^MCTX-f6w>~QIkEjpfC4B`V@AKT z!`yspx?!YppYF`{JH%pZ{WU7^QA-M%&v~3WJLJ-A6SBVs8Y2W|@cCBM;uWNY4*fh? zxB)aFwcHjUxq)cw4r`yHQzKz{y?i$F%nm1xNu3JP>_-%D1bKoGfA`QI!4M->DbEM zTi249oRb=x`MAxeVe)WG$@hd81yibtiAJnY^wkv$JhTOMHqf@McglQ6Ge1VSqaEwT z)6+>2?4Qz}?PGWXTBSNW+?-cLKkD%^Ui8Nw%cq|sHNjpo5;KR{_*XftQh`?-=&R%3 zt^;-ticm;x^thj%z;lv-2jb#?CZ`E@;4qLydX}f*6C4Hg=mLsEXs5Rcj%qmhm&@(l zW^q!l#tO7scXL(gNhP9{Kh>0lkUnKYPF1WJ}ZNjPQU4oZ=eHTklK{dvARQ(h| zi4I3V!*NExt2e(k71DUBH|wva3g+w&JyhVGHX`<@j^|kAET*|31w@=ca1Cp1!FSnj zy%4NqnfzCHMaAFNH`X3N>Pl{Kz3Gf?F{>Z1BSpGvsC9Xz9L{;x7F$cd@=1RI*5CQq zx7;cesMBBV2N`|zoz`v^Mq0NirM#Uye%)!^bl_%`PdGravMdZb^5eadV-i4r@=Q)| zjU%w{7`_RtSHDCcRviKJYndkwW+CB?@2)>6FlY2#E^F`BgEVSR)`I8nFq*WKw_=bP zYC%D=C6hT<<}iskS2SM;HTd=$#Y2YVU-?KDlD}r-<$Jjx50v*%d(rFfoZyyAprk^- z=0;Xf9M5u@t|7TJs9UxnkH*}4ZKrMe9pqR?Fozej7;wCwGLqz$| z)~slqsHexIG|jX*z^=p#vC3ud0&6`lbj-xjpR62C;M2Y>Oey^CQ}|T4IhWOoc4f1E66+SU|aOBY!fpRZ)jc89ir zd);hX&^~9`_t!0;jU+gItzt0XTt8vB6qPRYI2}FJLQ&acP@FyMm*8FYNq%OF-x>2l z_&pNmPbeL~h8EhiMXq%>;$tfhg4oKkVsMJ%^xO_X)q{oMv6ihs6r@Dd23DL+0!#n^V+icj7Yv6C01LP?frwyvuh~ zQ64xX?C*A+X||T1e-KjE8Uog?vOc{G{zTjEoY(3dq4)gi3j@wGMt%&OkYl6d%;@WW zHn)aKRMIpdfMP=m*>>BcN+P%@6U91l2#g|T+U&>Igwd3?E^qfLFA1q%ZNZfKDrq= z&kUS%=1|V36gVg6!@^ zxNsp)$4)R@1?#_Rhpzyut1~>M1?C^eFY_MQAxJTMx&+PYekO(Cn+EN!pCq?PG(9r=m% zr4l|6L)RXafI}Ryn>nAH_i0vr?7P2d9W&Pr(H9zj6~F!`j*{C-Zk(*UOR1c2o3c2D zjqf1hQ|+y_&cHyNJ+^Xr;44;raYiyPa)_j(Ake@H}NC?oKU_!9+Ta(uR(cO}}^?Nn%9yXg^=b zs9Om1oSRYw?5vqa$q`JWq}m+EEnu(|HV>X#keA$SD}>2wdyHt(!|6*R(KHz%K5W{Xlm_` z4nQ3km8$j!mk^uvqzY_4KXj*Y*VFCVN&E+d&#h-@}Md*DVb+ zt+tZfxd`eP5%|5XSYpe}X^+v{4D}VdmiZ$}y2j-P5Y)&tx9z0<&WTa2q4RfNyU{85 zg8l&23Yph7nIPy&bJ1+G)pWDMw4GY=jn+oA=@?NhT%D0_?P1G)w9UfGBaC_n>T@Hn z!MU$~;4Tl<5m~mjWtzHyM$`Ppu4QHsFg^`^5|gld3-X09 z!7{Lza5?!3i6l9~%^&Z@YIzg;sF_nN&pho;qFeKXy|u|?=9(B+hoDz^M-LU_c&fAk z=Mk$L`7is{HiGCP0dx0Q)fJma=lWwO1;0HXG=X-$2KULZ7N9ICqS8M@MmWyGr7HZ& zJBk(M3PNCOh>8USR$L}25}bMzJ#oc^KCo2-j@3KTy95mcb>rZ$WcsYx*6z->nk(aa zc7lTsgPF4Lmx8+;o^-@dfI39qW>V%H2ET`jo}I zC?8;KtFP2kAtZ(Lbb&!mm5)uzTFxTc&px+aqzv3E_5r-OI_UR-w53R$XC5C2KdtED zZGEuMk09_Rx4S(lx=|_VeRVg%eE1UnZ7TfNgaE6)nlZ@I-<7|9E}c4gxg!JYulrHv zTsn_l332yuYmqi(vFtw0Ozkh`FZG2}mb~M;63_M9_DjeafYajP-i&&R@TISXx${1EQj=80`3n+V5u^*qIrkF`{T(IJ)3$lBP0V1Q| zg6KMifJ^H0Jx5ZekE}$XpPyEPr^QheOs~@EM$L!uddJLweaGXJd*Ql1vzeqYu&obp z0t{^9nb=U8hSj_7Kazl4B^X6pqe$j|_{r`XTz#Qjc{VsHxzv}MbNJ=Vanx*(z?^VD z=uIh6+r5dHCz@VD^D0Y?j?Hh8P3%G2y{Dkl`&ZQno3B`zHiE;>I3|Gfz@|I8DXxC- zk=GP%co2aEww&_Y%@l^@MQY??%0@#lSwktjWF;E^xhZae^Ys+`&5eU-81xh0Aji+n zRS0!gmTQ793ejtnW-rG2m+EvQK|NKZkD+%|d)vq-^L+79epsX1B!!ODdaI|jx_{er zJg_s%@43~k1v2&B*Z+2~`|_KMG-#{?Smj*at;GV$RVHzdR{aB)YafDdokVc`?q1~F z%)GML3)s#=+0p zVISjg@8!5K89u!LnpqseOig#fBLG=@eszk(vG(`NQuzAxQ*u`O8jN0QS9zswLmkVl z?PPP9p86UU;rjrA1bjz`)6RMou6H_{b9P8eC-bPgztw?ig;@cgeN>J&J#HF7cdp6uy#%w{%~lmT zigVu~?ADy<-Qw?CG`23W$-~dkJF31{7LxJ76f!??;FZ@%;jX9oAHA4}caB-pAgsW# zL_3-CV?D2-NRxn#A>v1PS|VP42$9XQxYQ>9S2^ywuS!GczBRB4;>!*iNTk+lVvFjq z{ERTtK-P;3mwz}${OA^u@@?h*0z;-lm{Qh4y~XpVBW z)LWvi7;Tvhe*Y7QQPH2Wse|r*GoV1Um$Qi)OOJSw=Qi=*;T&GEafgOyOrwR zt@f^S3T?-MyN0T`-(R=}HOC{izK$@n62G_>9JmEYZ#_LPJdT4)Nn)xoj7oSr?YvZcOllVX6LP>ai^ zVYzs}itKT(9jAlOu-5s?XH0YSB0-K{D6Tl-Y-ONl>8q+k3=SC3i%=wj5jvaoXWjNo zY5uU{awQ+^&K}d_iuXZ(LJcm)xF40aOnqIZ5U?CKqlN?R;~rbI?Y58L@- zDr_{LicX>lQ7D1T0WoKXI#kl~_q~%%WmFI*z5Kt4)PbV@9yUkO@9(gl5WUL?3+tP} z(*gNh@7POvhQ=N!okC~0w+CX(7_`;sE)@*xJ>gB3NlLl)VtmIh0GWRn`>U!<8lREO z^Nh9~A3TmEm~Jb^2B8;GhJ@Fa$E==A*cSeg!qofy@oqd%x`%|jchg$0r3a%25XpOp zL>rICfdhzG(rpvEt!q-XuSSI=J!;?X0)he-|2hYDrJ=_&u6x`&Vh{_~>F$k+ZStnO zd*eo7r}y{L&&bv|bZ@V8M8dR05O$Rx*`-nENSg}WB)i+a{@5w>AD{(0?zFh@KJDOy zZGpz%w|F9U=D04L`F?k&hB91QmARk)yp2&6L{DhypN(ydq4Y;oV~B{XIw1B3j()7i zJmTm_COsQPR5|J$?oKFeA+-O}rYU-O=(1bAIkwRgLrcnuHlQAqk-OarN>CPXA}Zcfc~=S-xbtB!78^s8EK?%a>|&dPv5c(b2`Jgq1Bdahpn-o)ve-E^}nui8d4 z5?L!HRlUFDxk;s6^vnG+GTeMxzJt^*;MNa4+=Jij(}W*%XRP|BhUkLBSqbM>DCU{* zTjrN{Dk+^duuL;U$}mVh*Co&%k>aGI(ZEvl_hh9M+t z*Zj8l{@NoL@n=aqZH^(AMh)AiuX1>OjC97W%T?(2T@!6;?$`QsL`={Iu?v$Zc`0U+ z#VcwVQedx?&9{BNa$B4tdu|1hoamSg-k3v`>h!j;W+BljAr4`2;;sU~<}6?&Y~Jrwnzb=OsZ2lHRi4q-^r6t6SOg}x;}#+*~p-c|+{ zrszKnFiB>GLqfc9*c*{IZ~dz{`sZo*Gbpn=P27!*Ln`|1u3jHU4SisE>3;X#UroI< zfZM1mMzRomgj4U}zFQOdtfF5!+wg zCTrQ_)DNspaR1Li|Ds|4mtPKZA+*H-fgL_%hZH#l7F;{Q{5%0{Am(UzonZ( zqG0mp$_pC6y*JlFzrX!M_5Lrv!Tz5f$bTC~|MLs`MbF&2{M`Bfe@b_dgr>|MS29bA#nQso9n4_I^U{vi|3p`G4;h zAKe7rDxmg`CjCDSivN6z|Ewcz+w^XfqlO5ABX1u)}{Y{{G$8^;Oc5ua_9fQ z7><;)guu?Bf;|CfqELg=kz3=HW?!Nhwu!$F77!%-oT3q6lO_as?h+7H@Lvn9|2t{` zh2|W#$8z+9UJ~||R@FYW z{KJONl+v0kVRdhBI2uVVy_xGGo4~~b477gwVqTQ!3&fMr*Mz9WnC{ z+R!a_K-E3v|FGdp|I>)s#H*4*2I>s@T2ZtnX7r^U`N;@N=X`whEJeDiUKj4}ctv!x4SKh zsUCfNz?vJ~N#wHF9?F*&(}c834&aYS0D*3PLfL?tzkK^|OP{YId%_wdzzjpn0~KtI z?(4|x8nk>zZ{Fc=XQS2F*R!VZj3%q|n(|}9I;yZPwCZdX;Zi-IFI21xdOuxyvf<+f zq@BA5viuo33hKb>VE-ceU4^r!&3N6JE3@!8#o)J7PwQX52{e&&mo3s>76XqW;ZCf$ zo#vxdVLq7}4`NNw_-$5@GBESr;YkR44h_HdrwuqR`aaDBhej(eo>N@<@{rJ;GK^J% z?UTY}J}Z$tKujB(OZu5|-@{gcFlB!65w*XSSHA8ltXLyCfStovMDwf~in~>i@_-y? zR4p$l<(_~9cZGBWNVaK_een&{8SveEvGaCmP@ln|DD0%d+vH@V^3zH&<7RnYyw>Ds zfcAMs?R39>os93^ik5)mtiXwr2^qxqEJ;ETV{+aVk^QhQ#1W?h6(`q0Fl?+kjy36` zD$_tzKbx6%8>hJ7K^?s*<%X#V%@ccPXkxDH6Cb~Y>9~5KQnOb|V3BBBJ!y9=FI!ts zQsTlH#L((C4gy&|av<;V@oK_9+8 zCLV_wpB~?e*++5u#k~K09T+JrT(JNcZ!7LBvMivlmO)SroS3(P{oZFM6#X!phttVy zy>`!|QbeZChxwRkUuVh11Sh%qt0xHzZnDM6krS zZm#bw=<~g}D@_=rp%2Kfh!XhJsxV19(s?1C96-f{GY!n_E0PDXoo`Y2Z zkXK~uOl3Nw=LHyse)&F14i?cOG-vWR^@6I!-TJC#Vw+rfcm&FRl&I^)u`^xO>(LjE zAZkxNqzjg`_mIZ)ZJgh*hm^-=ZQ&P4^_*^`v__#?WnTpN9h_0!(##B(cEGq3-D8^2 zn0DXhv3tbL%tpr9qea1`_T!g2>hxW=z`=q3Iz%>amKolDZD}-TjbV1^LA2BU&Ghjy zjV;2e1K*-*X5;BPW6Xn7Z9S2n$r6H3b2sw`ye4C&5l&AUOr_O}0v=U}FyS1H>j^!6 zLRQx_F^9^yj81x>OjU?m{I|9Goz0c1EvG1*nNP0|qhp0$k&bXhE7T<7b`9#y76?7= zIZD~zfu!f-d#dMg$VZg}4eE3J!f${JG(Njh6)_wNDYW48UYp;aZSamO=jxi!+!76C@2xQi0FU#ev6KB7a6La2T=+-N68r%$;G8#NXGhP{V33 zNkVv_S|HhFWY8#bdqGwxTiMDJv**93(!tKjJ_UR0jgtx+c&c+ny|MRhi?>^i^`ahH^QhEb6(70DlLNxJdUGUj-^xPr_&7a6jma&Jg4x#0TO-v z{_(5ecg4J1N-|`_g!eB>QhxG!q6iKxhRnC70U)W6q z*Dn3^fcqW`8_Bqb@%_wJG%R^tv|qU9S29&xz>#6^$$hrrU%?8dch0Nr>{(;CLicVn z)N{-ZamSb{_S{8(8{T@-LD9nXHKhQXU1AlIj{2qPxaQUK!e6Dn-Q|?(`jci9*ZB;_ zmi6ON28r10&W#Jy`LfuXS58vUod}F{oZ9qD5slStBOC%(-(i>Viz`!C=574Hl@*SJ z2TA#)#uE(641LqJZUj3sbwnGbD=X5AT?~tDfWnKR0(~jB=VNHmW-S2D!oTh&F-TDY zJt66z&39Vn;tcf!kRkQ0=}XbOI0EO}=#LKGirAk@Ufuw%9t@z!QXeZuDV^GeV@$^o zbBAZtr5UnAHV9%t_z-I;4NudIv&l+6w2)N;tjCpu8Zs?p?A9%&l2;xGJ>6}rDZ0~S zW?k%a-0LE@n{eOF+jiLXeuC4UI6_1qyxi0_&$I^`iHNbsj{xhEaKm$wOWdZ`7^QDv z?}|ubF{to+ZFV7-y0RD_FL&q?Dk|VC&x<+*o*oKjZuW)al!YSUSGsniC{$Yx^R&$7 zzK%FAWDyv35Yn&q8`s=S@I_s(kTe-iab25i+p{W4%8ZSdrg9E?2R@Er=@L?2R0K9Z zBj+G&usxn*V4-`Fx%n5@a$vGMalBJhG3QMW20B(+%R5`%-G+S(hXYb%FX&|Sd3yqk`(T~_ zMn3A4E?IC#SV^YeZlE+nZXuD=k1z(5HD`3&cl+ndZd+dJ^umM22}cNh+nd&G~23-093HS{6*FAC_R>3 zlAECV$;;;*sw#)ffQWAK)P=mCW{G_2QtfdQ`Tp=PKC#zZbf;t`7JPnitno2*TxD?@ zsP>h%AGs=zaKqUdvK%74J9*7tRb z_lHCsWWB{futgT{?W%oSjGA}3T%y0}5O@$w@fKOHb#aR*$BLmmEvw+oW*_6TKwuyO zBLUkKHb_#JZcs>Irfn^ju8lif?#jtki&s(0l##+m96Pmcn<6_%n+eWZK0nP}d8H~d zjg|uFD;Y4rudMRrg%94+N{gF$LZQVb`|b&MG>J{JMbecv)N#3Mp5Azx!0C~6=`GXz z>{S7Ms#1D^>j1_RM1776;>(M!3EF?_FC7FR-sB={{G@8yUxHojgTsf2J({D)Y-Fyw z49jXHvBcIsRDP7m%iJ23b;%J@OQ@>}3g()UXd3E>nI3$cCdPeBEtQT9Tn9pG@^w<` zey{h#iWu3jL_u|iw9;j0b9*vXqkb?M)(47h7qC&ZNCeKloN4Py4Xj<57~-j>ah%L~ ziA$Nw{XWqm`Id~PR>&ITH@xxOZpiXS7UW_(X{!vGIfj9xgMYGEZdFCX1DAudp=;}MaGxzGe zV%B{DHvCi@e+`*sBaI`w_RoOWk1NDe17sZ(`x(axYlwQH%1NA8RByY+#8KfWTs*>k zlVS>*kR9sbRO0=hAgX_bMc1<%pqV^s-=G<$To!72{9G1xF%fUAqN|n&el|e&PO~l) z=0#%2Q!W-a-)+l@h(EVO9@y!v-8rnF1erKS+WaXX-8@hLn+}=DUPXaYF z>Fl{x6#b=ehRW%0ZqLzW=`4%?PRk7N(!^;-t@C&+?pFJ53}`y=aN8$tWIxZ|^BG+& z@NR%FF-tb-OFjApGKiZ{Cn+CWig^~t5Eid$W@wC0@2dW~DxqSq{IQO4_A9uSr+bIE zkMJbw+f!cMs%7m8{Q5G+wMr;TZN+&LYt!1>d!`!nBu;>OS>Pqr^REbUdl!`|_Y=Z& zusfvyi>$4rjX?8n;a}HcF~RQGVDB9@oMJtZk~Ch}_+s1fPlx?}lF5oC^J78VL1N$m z@3R`VJ)_XS?4Maf?JRQ!FPsHjPRn%cS2Wk*rlVHpc*W56AGj~Ju&WL7n;`uWd`tDz zi`3GCf-J00Om?))>~Ip5TWqGR*S+w3Hsqd%B20H&1t|2>wrcLEf4p*#@T0XMEitG^ zUH71Mw$T2b=kq?Bx7;Gqi~1`?h=>B*4>`G-=*)M(k`=p<;R*fB{ZLLZ4ycI^L$M#J zK-OWzadB~b%W4Vr&pVkH7e{|Rl=qZ#YFmgQ7(&~~JS-NdY0sdFpyapZr~7r1Q$#f*d#TgK@;(%YHP)*ml0}mWi-K)QLn{hgt98G-NZSI1s|0kzke?YKz1vnA zsv4s^*WEfUSH8{~I%OSic%5C<7UMo7Xk2@(IK#$h@xc9eh%nm=mjKOfKqiic-CZ|hy^O^wL5P^6vUfpOgj)XAbUHpOF8p`DW zRXBYlYm58+);htBSq?C){3zePqJdU7Me4KAw{JCM5Bv89wm!Wn1ZYT7lGqKq2zcR>geE6a;HBk%0ZAGWq7O0`IXv3SEiv zjtb1vVpEs{sH^ka=&W`8=1kO2-HXF*8T1<*YJCvXKAMB~Xnv8TBEe5w#Sn<=a32g= zRrOn&B?AyV9)<@NEJvtg|P4zOzgGj@z4WmgXXIzYi(pA(BM6>fQ)c zYJtYDK`3kqK!xLonJ!AiRSILEcm&S=0Q|>u`M#p(Qp@kBxo?c+I==Lg3pkf}?XUUX zh>5)P%Tgvw+AOTY{Yof6qOZDsZDFE0uIl{wOaKrE@R+;-5W`0ODqTzNWBH6cY$F}z8{^ou)>#L8%rsp{kz8w;+LFyP!?)zLS7>KF ziD%hRw-Gzzm3JGz`$;R_-Vzqi(m}^)_Jce0<~fXu(gz^4F2A2;zKi9pCHs!%tD{E5$nb}AFaVTY zW|RTdz)|?BecJ1FA+Kw#8nLmkAmd(>1a$KIb&^kjji;~ zZ{3`t%@JAV(~U~DojR!A&M}p485G-=B6?jO^*jLV<4G~4u%zqR=#EmzKUy4N-n%x) zYDd?!JzGfL((^zZbilafT)9^3zHJO=(JYOT{Z^MD?yA|@t;5*&5~G|lwB|70fHq9d zy?INMbV(v}L2zfc<1_^CCprPF7vF{&!1ve1(|7NL5mB43*tyI(qV*X;_lao0M%Tq$ z8$LTHBcbKzFffVD@mUKufswlsjl}i={dK8!*VlM=$rc^uZ^PgC@$2}Yq5w8BsNsPW zO~DbVVWJp#j+LxO3(QGLPMH1yQj3VuMhKP;-yqC$^9tl$z&5+5)*#$(O%jhGvI2&w zCO8b6J`{T_-90O{ah1RT^1Z^l&%Rnq2dv(G=FhjED%NTzdcx<}8A%0^b0fq}lra9x zlxlL{=;`;6>VE!-kc5EMZ_#}U>?h-1WHnT2h@Zqveg_*xSsw}7n}_+yV+xk+oJ|k4 zCV56&3k>hyly0!$Q@4Gl??%t<-wl5RSv>tn&_G z;;ejY=H)9HV18lyL!qDM1u*^fF9xrF0inMu@hZuhY^x3_-hmnO9cO^W$u`5++wl%w z^7lv;!ZQZd87m5ZJum)4O~2wX4&n$sOn_eNuA5YMLv%JT^BPZl;9#pjc{t6Q`mM4Q zuo@6lIvE9G?5QZTS;G7*wz;-oRkj_mAP=P!)nL)m!uyo-53O9-~Ds987Fpr zoN*~D%F5Q<`J0xYWVlk5<3c75qXS0B7SaQ^emSL$uB_(G<~Iqaw=q<)Sjs?3a0-@s zSr8J~*M=hztraV29eIDmfBR7;0KXQivpZr4h1^bA*={6~KvPAZMJ)j;!D^Qywi8x% zhtX-uxJr_=IlcZ>DW-g=r52z&r!72TGPJZ})Oy`C5WVdqpYSZ|k>SaCJYem{@G_eu zwCrHM+oR8}zZTMds|Ki{5Y?ErO=b_G-jrJQ1oK*|Op8PK1gR>c@Vk^W zShM?^)~iHWvQY*c5-$!w)Q7LW;Ma#SuIkGyH>{HU@LuMo?ilS)%{>DdypYAy94=|` zrjenJiPOxockRflS8a9W$NOX<_0~PR(RPYq^G73v#)0RYQNiNa)=UaeM`=>=P01 zNhP;U$LZ-1pH6*)hyy}4Gc-iD6SV`-Uf2;j@V+Q!AMb z_uPL@n98R%>|WN&0nq7?ebFzbw*gUJ$muMba6~9;sc+1JUoZ8PTj=>Kaog}T(1o?8 z-CHFZ3!hp|iXP26F$w{1k?bE4@lSpElx|vAK8I|X5dsC@9a(hjHHV-8vGGnOuNKFU z*U)Nwe_^FUYp=8@;ALM${T_?SSkrB7A_~Bun%C@`oz@ag;_3P9Z5|}s@GGN9zNpVw z3pjGto#+8@z06O>bCB{Deaow<^{-gDXDMd!hE)J~%ty;y;o|C1iXBR7+OD=oYmUHY z&|6|oTt$4=B&+RojKy8IR)&xgRawCKpbB;EEv|1go*Q=N=mls}>U?{h-@{>mi0S(> zueQD!0jE`W^dp?jEuU=*K8n!YyW;P3#&=$kcFUOP%{8t6lLZg~t{ALtj$BV1cUi0{ zq4xUlck#mr{fx1vH?x{QosudGptbvv4tR4tn6XWK0U0g57_gjv%CW!+xq=%8A> zD*bh>=P~~Gd(>J=zjQ*6;5kn8Zf)Ye)+(kgVY9G?_gefN342J;J*`Rim+!NLO0q#Y zGO>oXb#}lhDJQe}*ozazg(AzfkH=K^WO=TsO5mB+QS=-VB4~Qf8#y^e!1B?ol_1Lr zp}M;E3jn|L6lNM-m^BYe);hCdc&Z=kd}@H)pW`R&FqQiF`%ht{3)4b$&!JT{*YWkE zD_pqr;u-$L1V)j3#I;T4#X7Ej4NeeG_ zA@uLe95#;jU>KmMuWtQv%-wH=>e(y`_Z|3M4>C=DANzeBO_8~Hs_V&}3DUA+_gGuz zrM#!iOc(Y`xKGCGfaldDZJK#O{M6CF>3AZGRhKDawE&>%>@>NW`p)Lrhy z=g$!&S%5&H5@VLWD93cPambz4ATB2zA|rxPR{B|}`@)-kMI+^Yuz?BYQS?r;q!u8} ztsHBol#p@+B-_1*IYnS;L{XR$IpIEIi;V_Dd-%Cdv<{8hfc!P?yF$j6X17_7wk*$W z#2mN>J$~Sjqo9VvI9aBtg-_~;OHulJawo*j=87=z0BUTlV@Hf>V@aN==LdFcZ^Oee z&@PV1P+9$$FS9;7|Afz02ycy7BV|g7sJcKJqgdOy`0#&_%79>2D5pK3U6$mw7=5JPtv*x(oS8pr+))`1Wq5_Sa z#>i4xClJ3aOM_9(k(DetXLeqq57^7KWyjdXxL@CYx~~PugVyeunD~Vpk-5x|Uy5oM zj@gYw5Axp&*~PUniPdG`s^!3M`NwQHp{+50CMCOd&!rRYfdPWK86DiDMvBc@Cbt(_ zE7KC(T6fx2S*Iz7LBlHadcJD8p&-UL$;=n{80SIzcn8=suSdB<$ioo~ioV^;{-rro z7BIoS05=!)KC=r8B{BnSHVZI7W2Qacf8e`Mzwg-C78yDC0e~=?EgtA}WTk)rqmEUn z2<&crgFB|zeOYvQ%4PHUF;;!a=5<8mvY6fs(`jm>75&a(5c+#^xLd-l%#V4j;Nq6VrOdKW{${Jon-p2I@_gqO@MgYd$ zei)HAPPsEG5*HlSvcA3rfS-HRRvpTfZN9W@F3)yqSc!P5^uqR(R8QA#Go*H|!)<#k zD)3Ig6icJaJU7I5Uc-WooSETb3!;HF=xfITO!YEM(61^_DMtv{JbkN-a8iG7yV@LOb(^ zXs(?S3Ct|GBfcLge{4=^1d@hIfw?rByZf-*zUocb{C6>;&3aQ&4?*K8KV9WG*n$nGuj{2*kCq37v z%T3-B?>j#y`gKUZs4u8p$p|~~={GKl?l6c+ZJ8Nxp6og*5Ah6f0H=v=z&-P`0|Glk zw@ZYh4UfX>{s=Wnj3{4_qrgqBf3?xkXx`@F#m*C zAHW_cQGkFv!jN@G72txoCk{K#_!!P!^~6M6S^COhPEEaixWIWhyz2^6`86G|Z=`}( zhOmiZVYO%<^sfsNG8YFq_{E3{*f{I`#D*P6JU>h63ZG5N46Zt9h3LTOmjHJfH2LV) zl9a%kkQK!osW@&eRlX2U&AsH`S;sGk-Xz=Y2C1VaWBavbQ#Iz^uXSj%bsB4iTrnd1+C< zNVwFWVHjE@m@ZvPuOfaAxth#7)*ML?Q+=LX|FNaN{D~1pNZHwx?@i+jvu^g-lT@Rf z_hgZvAur54+grX2MM;8lArgSASsl}2o4rV7$@EybJk$;;&=ZtTKf4C_c+koVi~Det zl&HWv&cv+)*D`$c&NMj)uHDk+16MY@$S#>iX0fJS03pr^B{DEekc`*SKwHsoW(Y#N|fdT~82Jreh{DfW0BuX4Y^#4M#hU zCgT@ori4COJK}DPDK>kYrrfOj*DQ_+J^;WSn6wjK)7Jix^t=UR$dL+i!BlLQ4Q4R4y0AHA!uL9@$h1mM~D* z4BL(s@w0vuEBT#CcFHR$OYm4@bwHgwmOX*9`?LlT zS~F*xRl}0OqTm7kSw2XD;yyV5Q%E-|s(zm1Zp4jRo1mT#)gof>;;v-pGJT0}dyj)h z;xg&703!PrB8wI4y6_G_9$i|2oLkh6E6iPmA9nfgwx0wY ztMjU3#&@cO%#mhL)L4y`&{m*C8-KDzB|=xJDZG6CEVJ-JuaoRkdLTFiYmV#;NnX$e zBy;bOoFtM9B0waPgq1Y#a+eEHGI@!(^XgXVu~HD>S$xL$j~_cfPoMBn zn*nEyXO5N!2=~wsIeV9gs%tmjv^+}xREaLL2(z)l03H!TTPa^Ugh|Z7tFtQQEZvG` zVR8s{`5qDP&CQJgv48Zn_?rwhZ@`wFsdGA?0cnYqU;ML*=Jp_YcW`U*UkO&eY=gE7 zv}M~se789C0Fds#let{MB^`;`0I~gUHp^hQ%lSTo$W>oq~;{fOM$TH}3X;B#iz- z8s=B}mbDp>+bLEZG_!Brf|)&i&tXLP0ess1SCtYWcqE9C!jawwpMLc4cs1ZhIP3)n zjoC3ze4~LZPtDL*6OvudM+<5m*!*2*a#s5g&rZFP!w%BL%0lcz1HhQBLkh$dEb~D$QcLhuT3Pz8K7C;3Fc+9Q zYHR>hrn7b`eEsX*?rJD+z~Q-)F4CixyQ&^QHN>KUaE0%R(Z<7KIX zA)WG5@~ZFP`ErWU==L!r&V0#X1SUECh?J`2YZ2(G_ov(9AiGQaA6`_w?1E!JXQmuVV68fk_Kj_i1 z)iG)$#D+it=c|D`tT{StqfzrTI=k`vtJzzV`j@&Rf`(Ee26z>hPifT1th}neswp*~ z&QJah2X6iD`0QeBNFh<~=w(Cxh*~diJmC{u-*8ME=&NOGPw0wupjG*_Hyq>Fk6E9K zupiMDlR2?CT4;64Ul6T^1E~TvsJKK}Dvo+p>rUN0a0M63+Mv^K5UJt&QKZwbAb#(h zCv6c5L`}>vkoK!|wDLaBcgscEFrbtrDn6!dX7OJ#>B!z~VQjlC3T><)%`(Qc)G@bZ3F}^j^(k}@#5|LHQ#MM^ zY0?_;4`>xh9toV%{RAUCswTLiUHfvWw6Vn$Qt5@Mxa1@%L(0%lX4D~7FmLpvwY`L& zgUNdOB-Mw@bKUYlnAV7RRZlN1CarBAgnw?{@qX)In?mn^`*iHpB!$3E>2b>+r0Vls zM;B3L;bS@Ne&^bljh;wQAjh8^pgfV4F#xE465kZ-^i?K!_`#?BGN&w6E`4^1!(MIc z&VoqXv1GDtMR#QYl6hYgA*iR9iUfD}gNdJb@q$jQUaVsC)*NjxLuTDKXJ_X++MzfwI-3@t>3`IZ+Xe z)v-rht?d>u|I~_bmSTq!x*_y8RM#TJ^EFCa)$)*m`z!JmOd6eUP@Us?3VmmMNAYU` z6i&N=`oqL^in3$WYQ+99dvY&AO>O%jkcXq} zHkM2*oy-6Qu*&OL(>0aW-9AbRZoXq6kD{WGFJ@_pKiLRVOlve!HPO!vgs+Xuvuay) z|1fO;!l338V>%(TZ(de|m!k+i(rk#76jM|)&r;)h*$ThL>>G$J$E|2xudc6XDj<&q z&m90sL>D_A{7+S#M-;%2N2~myIngfPL2}Bh_lMD-Jp+Rp$yV&E?9JLdD4?`!oGin0ZW z!+M%ZBc=OlR3W@5T^Y{^8p|DXJ6q^sgwaJduqHK&#NF;%1fE%qpxTWHYoKF>KA)WhYd1TP;zC5m0R= zkNlJJm9S>o$+yyU?rK?q=aI&%AJ5mbDf-9so@*J(NiSs)s(tuQCa@%J$ebm)1|3f! zJ=X(_Ip~8sn=e_^aLq-U$}=I&amz8wg0XKNAFK($tj~+|oPda|b7GN0LEA@7?&5Dy z5t^_jpbVYZPtL#)f6SU#)4ca!+_71vMeg&2XJ^)V*(wdSG_d!a;H{2N35j8wAgS+o zdhoNGZa5-|OY%To7d7)S)7pM&+=^g6Jfc_G5WG<7%67;*8>fPXeV%Q7RvY`EVy$^* zef<{94`Y3#du+BonR=quNdt(WTjG}o@hoi;ZSo})uasm8KZru#(eh%T<}9iw54&dwfnc*sJyC^c9GMvm>*;nI4zeRod4;iVn%?x!}Rk04^edN zy@OC`VgMC(GSRF^EI)W$JB#sc)e5DpXL<~wxN+3WoRmGYQLhpo)-r( zD>V(S>jCuMYgYO~1B9KPQT_G>8G|3~^&I4BSf9p7QGG>3sNw!rBR8lRDz-mED(5;KVK1WKz!!Dc#*%>NXL}WUVJElA zQ(d6^k~+%r;PN7Klequ6X^q~B5uWWmIU_vW!>E1W^k>wwXnTgZN?Faq3v z*d2|G*<$=BBsh-4#oy&s6|P#tOn7PrKFk9YxPV@V+5T^7XM- zlw~U~mW;a{;(h?Kg{r6@19~*>rxL@qlTM$_K+ixSKWDOdA)*(%fF&LPd9?QS^KfzT zXqZC>Vg*Uhl)u0^ubf{`HaPKa^vc(P^H^$sUmu6@aIeJGJOEo zq*5FFvooF?_PVpBjEb(5YDe`iM)9!x5ECw$4vc?aVEh+rY?tjx%@S3pG$o^PiT zB1&yzbSA+Ll6n0(Pv*X(lMBH{R3y4?O&+vN<)UTy{OqTd5(77FEBS=;nkkVhxqBaAQA6{;=W2w_Q57}=N2Qa zOVx@N1>t7-)0`BZN68#)qeViaNB8BZBHo*3eBk6bmMDMocABDGrD&gkQ2237 z`T(BVJKuIYG2im)F{6T?lzopJZmD#k?qb0_@&MA;QNE}Qis8Blbfd=grxKLAX{d@2 z*WxP1E9ef7{IHIp-`8-Niz*)3+ScvRCPSIG2w&zqmf__4y`o$wQURTD=mO-^=IsLV zeMU!k?O0cP6ykt_uhzN$M91x^>0dz@^w9lk61yiPGGUn~Wm zPx3qVP60Ts=d5=xY696Hr(x9ftoUK3?Q~c;#v3+i$3292R*-I>TUDEs>K{UWu`w9X zy=60sa;X{%r9J?n3)fMTUQlHg&Fh51a(v;p)L}p2tTY7=AVMsWXeNYD z%<$A1cyqQro{)@Bb>b-F2kauuy$|-wyeL3LN)N=NJ?lxRjjLZ78j>xUVofT4eW)qW ze(?Uomlv(_^t($zQF3gUu!xW?Pf!$neD33XbW@k|J_p@7PiDeH%Vmh&Bbz+@EoPIX ztjxTV2Q}~K!+e#ivW-z_{)xMfyI$@vs7@AC)7(#Q^=^U#p;uMYV_&)YgB6M+ODo~r z%@1eyZMpGOUS#=X#-_~qQHY&tV4DzvRmI;fvKTcnWB%4Bnxr}mX6vGiL5CWkKDmA% z{!=RXH+IU0@;)(|MNE2>=ecT;#t2v6aOsT`FmycDDi8>FEiyPAPA#iFiXjwzF)lwV z32h8k4XT~Uu}51Ealrh&G~fH2z3HI9TS%lYBESG2S*1Vh0i0e(PO8-)Yr2Qx0L{in z5OL~nQmy{a6lyZ~!xW@7xOZgU$b#neLvCwkK7IxEDmj?Qti9{Q1P*nQ{*(xRD%DYu ze@<^#<-2%lW~3~u)bGoNcb1cQ(M=bBz&ivxS^?BDKLVff=Wm}=^f-860;NOAW~hzs z$>(PUL?|xZ;HjHC*sTN{MP%?(?k>pL$Sa=m;J@eu-4Eb-3u~lIej-XYZxyo5RO%I< zv3?|&&H|h0gR!HscjyI7gS>xV1c@;kwri#6HARU%#5?z*<4OC!doF35V&;;1*5Q&9 zctGq+vC;vs+ofojB=Nn>IDn$7kpX=>l>)N8 zRlQl|0eoiU{}p1TD|p4{yTag$4SnsL3+Yi4AU!f_4hI5{{?8Dt`OQ>|*n4i?kFsP1 zZ)qjJ_n9d+Wx8h#sCadA9~-aB_({cx09L%Jw~Hjx4eqHc^(+>#X|>=67=8Qw{7dvP zcvgo&b*XFNW1bo3(!W;dQx0(XCM}W~(BxFU?7b)DULO&ea{h*60?mM72z6YwD%g~< zr8|9Kkqox$%vNj>Fa8@3i~(4cmU*k%%c*XB@y|6P{G03Sr4S*D#W=*fB>dp2@|U zl`w(0v?@Sx%)JTF6Ay*U==lk-4Ok_k=9ld-XC&sr18dp^&%=1R+O+QqorM|~WW`1M z)B>XAbo|<-Vuv{nAkn;$M!WhvS}ej8U@=0T(SF+#d7FY^ZM89Do2ezpyRjX#hR9N= zQ2g?a7q%w^)?_0D?4$icG7lyb|I#9JpLqpvqBF+xSe|kvr%8yvCjj90=QF!AHBIMH z_BPh0@tHr)_u;sAT9d;;Hd<`?j_7#xYO-b^9HLsZLJP>NAM_D+>$}tZ?}=+)nz z9C4}p-zULv*CkROM3zr)f8Op`@S*C7Po1D6kO1xJvz+YcC+Pz5u>`$&hYY$7^ks0| z^(S^t`>qvRti6(yFP&7Dh<$fW=Y$~Ducz_Kqo*BEak<)8Wy=A6%(@DIKI^Rhuh$Y( z)O=C+H--XFVhTz_T3?~^ib#3<7Fi%%?AuML4Yl~dUGawJh23wdNlsN0Ibv-7n)7}K z4WsG!W?)^>ufJo?lFzLLEC(g1!6*(u%j`i|N-J=6Mh-$PW^FxZpt&>G-;j}O;p+6v zq3yzDdDMS>;dh`UsS3nYOqL zot`yr`2EqA8x#5Q1N^B;eP2WULS28Ejh5N${Au=aN|9$hfLP{u4n|#~Y^)y9s;Gg* z93>>)-ex{1as?m1O`9foDE}3|-h*1ZwD8H2pEA}D-xUqptGy0YY65K*vCLFoW1E2! zPmm>tSZ+%bM(gI60IqB8*RXpp?87{7qsZdINr&u#;^I|X$fJ@+xJ#DkBE3G%Ubv8w zxM>Kxz;mvAKE@1OaQu>BDuy^5Bx>$|k(QPU_VNV%gh=+i9l5C#{)dhTL zITBz|Tk#FLaZ8eH`CBY|fF?K{G)9 zahNo>`tA^QJe|w}_TnRtR1UTmuSPEmWXSZo>1tc`b|dLO+g}=h`ft#dN*ycb)U>oa z+1Qrt?5FeJxeBBdn$?7MRfC3GbjQbU!dgrO+wGY(_gwb@W`uk<2=}9tm=#GCiv$zi zz0gL>n$z4JzebWK0vj)4EHMr7q-12grj_|{;&(9c&Sm#1Vtf_zg>@uZi`D;kR8O^U zf=28u#$T+bQ9t&=O`r05&*)|~B6^*h(>M#C5`uwuD)erTGK`aYT%hWS$Ux~z(}m*x zVhg1CNZd!v)IE_Lv@*u}!3cVz;2k1kO z`!OGpM%`1+_f5l(o5_BFFpcG~p}UTap(@WOvxbma;*O$gnqLGB@gm20{A+vVp=XT@ zGXo4=owm=nAnC+UaLWG|YwsP@RNJ+SD;7jRP(Vb4AgEMDKza#^6j3SCK?uD_2O-o% zR6wP7kSe_gq}M22s(?uEgkDpCgp}X*d7tO~zW1Cnzd1AKo7sPC2H1PwW!-CC*J?m7 zvN+Lqr13_&AoYl;1{?>Fsn)?pJZK*$DwP!YOqP59^uyk8c~G2Ss{86QxSC1w0-9OB ze){j|zy2mB;@LAhB8?x-YfbJ~Tc}$CL1J&D+?O5Sp*^>c%FID+@Do_A!5J}Zzdj-u zh*9%|pK(Nmu(J*|cG`8_WMr}s#gA(|RxxNDe%=?90xJd6AKV|ZZzla-;MZD=_+9)^ zO2cfi$rcx`eSdX4uGv0U?V2h5XyCtc8@Q;*HyNYuW{f#4ShsS;6)?NIhn;h}5}9&N0WMG}jZ+azQ{njQ+`ypLPP8lS zhX^e9p+Eii-`|ZyVTV55G~1XeO(*!=9BKnR8|D}&q;N6@Prg;6#s_4d-xPyyJ|-kn z*V2OiDMVM!ECs}Y>)c5ByAYjph?)8ER_7#lDm7l3#6uNyXCar{KCACa+$fN|MtDV* zzBB%$Fy8c##0z9HxXKG7F{him!YAD;wGP@{8Ib)cJ!FORwNIPaSEn9|kqNgq>|L(o z{i6B)t!R#;)kG7lK>*-V|JXVqKHc7wOP++*Gqbj3Z|S6I3-SJLYj^rNW;n^lb?XF7h``&mjEVUn1>g%*@UF zr%=%;M;ZtxP@$|s@9EH2Q=3E865=+0iBqawPj9%0n`$mlM9kzI>M;!VCU8A^?lwO^5!4^D;iaPoThcReL0l(3`{$cX@ts_r5)u>m>ye6 zgRY{4ZuPB?Y3RTM#qIjcplP|IRQqm^H1ZF&Sn$eB@bir!oY}aW#P39ZZWe|Bc z4)IvJH&zV9G1L0pb^PtV=h@63A5X0aOOMr_^j^e!Leg&)+;~WCc9czAgET)~>QB%i z0wEnjI9pM>A)br7Ux3!mPe}8EN%y4AP!-+bKaHg@xy$BJ)|lZy;{QZ9yZVJm^wr!p z%ZF7~ODCwyUqV-#`XCR^jS9h=um(9s5*_qZT#W2z%|EcRYf)m|8$NT5g|9!c!29@s(W(zYn^x&y8=B2O2{gTmTXW;}V8KtjCW&r11et6HHRDd6}2T#9I}Z%tR|j$fU#xzfZ$ zR&cx+D1x0_(RPc!^7jS-zQXd2Vv+2oPOGKOdfSFhwcldtwH}eL7yi7K%bYi8T3|dr zY;~sDynWO)MqF} zvm$)e@h%KahY!naeEj6kkhvNzzX3*4;vUZm{J?zr+EOt0`;&5REzF{~Zf<~{fWewV zuSscXKRa`>sh)BV-9KXi2K6TL)Da|1zuC0WdLTVYK=PG(a}|cZGG`zVE$uoNM8YZUAsvG188V|8!hijrP(5#{^|it*Yl;ct4yG1 z78AZ)quBQw&3_xfsS8qSS<8i*A0iI0NZJC;5#BShqg{Cz+@KWof7^WjwF{%aE$sc) zCSO6(dsaAiUimDs?jYmqhFA=gdi(E1{@-sDo38+K-27Xp_Z+ZP`!idu?*I7^XM`lon=hLOi=p02~l$nfm+`hGdw{)oV`a^MqtUsCPjf4t^@ znb(X@ADDS;vsmIT`mMLIfdF=t+H{%no5$VPpCM&|kPlq6wVq!Oq9+Nb;KX9Z$| z+S{pJN##$>@$ztsUhOPCj=6?}!F0Ln+ShL=IA&1A>&ST;+{-9fKJgyT^DN-`#FHp* zHyC45A^50hG&je}ANq5WN%e-XMm1{ufQtLfpWS1A<}}cEreL)0^vLDtXToP2Be z6rUAlcV#`G?W6TTTTz=8xr-nD=WzYTPo=-+n${~haxN&o=*5qQDihDuJmBunDZY*! zeg_;Gr>M`yhMywrJqfu^6LjiA{Rc(4esGt^$@?}2(#%oy2iM|v&6kPPo#Za=5k$F zM)7l(e9}wYM0yhu_e~qzA^}~`^fPnXHTf=bx-Xary!UbDo5{m7J9gNu^Zf7coWhHb zQ)r%FRfv77m{e!?V$47Fh%}m?cS$0bY9CV-)FI;V~c9bUDnUOwMbndRNS_P)L9;o>_}YOVZI>E_+t+3L@>$jKOLQXbZygJ0Z`q*vHHLW}g;^X`xef@rp8k z7JNa1YS;y-Q}A51ebt$HFJz{JG?WQuTMOoz+VH;}Ld$q6sF1NIv5u>T?N}nAP~Twd z3}~_?;Wzm>!e=*BMfpp!V$nq`8Ve@&dg6&jGVb;WU0cf5v_rMmBsUm*ux;*57RX4+ za^f<7{B4sMtexie)R@Y4&2{@TSbYj;Kjg!$Rp3iqj92p)F#ZyvmEXUj_h7f1h~Aj? z=Viz(0BU4Oz=c z58qUBr5UTQyGuQ1@K%F!rsSS`xF^-YFZc&c@uP!BjDQ-xp!j34c9J1wz&|ScLZrnx_Lv1%j|Rm z?v49M^3&k8sQcsPW?!BeeSKPx2hqr8J;?2CsrfPwiieKcPi5JyuST%f z=9^YLyX|M=y?&0NuFUXRoL_Z3>4k~d!bng5Af%yMs^{v3#}RMF@L`2EbeBVwzx5I$ zI54UfHditfxlRSSEZgazRHE#m!s)Wl`CsJT(l6FQTKQA*V#;=JN%XffoZY^&pi7zE z_26pF#F{e(6J!?X7!<^h(VW z<$Z3RAXieTTOU3A;3=TI4@~MTlEUjg3>swL_-ONzXX*!+8QqiqM6lDheL(v%)}8II z1=)j_^>0}gn@2-DNtwyTD^dg7Il@tSO_@F!fF!7%*}cbEkXMZ`+*De^IU3kMJ0YCr zQTXa9XnGl>!c7Xcy6~%!BK2y5EX^jq=XW&vOLAjB^6m@w1QugK$pFLB#IzV#Dn7^n z?X;axXXqd-IUn|-ZoJ@Xpvu!VgH(f@cheFCKN>%d|Jq&*uQxQG`(H}3YB6$ce(Y3Q z2&+kzf3g$u?3S7Pe&`RxM^l>6Vv{Ltw(Aw`BO6Q~m$jOZHbVw#*ERxG&#CLhhg^6E z5)ux#U~sfpUVIO}W!mZ!3Coa)ti2e#1}H7{hJiF5hMINx*jM6#kFLf=yhUCkIK{F` z#}n`PhD3Ay(ew516(3CRG4tz;RNzzjpo_5{2BDKy1VVz$=Z%xw=cxfKI88&B-lQF_ z)cZ5f)6V|UQGT`O4x~fYVs5%pQhvm$@LAN!;7n*Ora-de1V&^u#w?GE66hX%l-C>{ zc|8<2r1RygULJc?N&exMxgEMZq7SH>?@0STJV-JAf?+!H!;4x*=j5}c{qqwdaAsSH zMf$UJG!M4KV_nRU8tkxi%~0~}t+ixdi`pyVn=fkoKhvOy9nw`}w6-Imfm7^Vr&Sp% z9(^k!HzmmNl*(RsoJ0Aw5#i7wyL0=7yy7I9nOPOUCONfMJghN2QKOisyjK!goJ;Iq zjH}n%QgmJ~VrhC!bK_?&3*S(ZtE-u>?8v-5^#rDm8tOgfmB_GN5#^^*g!Az`OlMvN zDsI?qu3lTNq%7FZ^_Yw>x&h%pNmEv*TaN9QSaOu^y=*OaalraxCN&dQMdC#xZ zE(=$;MBf}TiQecFrNajkW$q$pyWn?EveH%HpA_t`1!^7K)J9)Nt~%-Z&?s@SfulM< z8MKTFM?5p~^pSFI6~6OO9uT>GjFobJ2AiZ(m%RD!i#i7(y+}P+8>8kbVm=)C3?_`bUzjGug9xxFnswdFyQ7LqUcPbL1bkHZsJ(8aO33%RM^39T#+EZ0r2ad@B}@K*O@gRSAuZ zAwI@aUM8>6j*xnYfOpexA~T=f_o1i+?B(AI(o|1@<}K$-2O&~1cDX6XrNBmD`eajq z&(X4Q2RVP%V_UzE=9z>qiZJ&zjU6*`iWViE<~`XX1T4r&phkAdI{2pDq@7tESB;}W zsBjd=O;9C2=!vOoOz)oshsyoZ?>%8h?jFrdS0Y`suULHGfCxz|-V}!;zT2 zYNt$&wInjBlik3rQ#R`io!)^LmE`cd=7CI=qjo(<)EV;=<$FF`U`0+V6V9DtunY2d zsQj2aqQLq`Y(|>2r{7oWAKa7|MEKby#z{@)N9Wg#6`ot4=GjlL`so}m?e8KJh|QwY zL+$2!h!Z0$y%0K~M`6yjRa(J~5&Y2M*y`myu){R^_Cu?+yV2|%briss`C74T+K8D0ZZcnLawxZ)ben*~2AoAG9nYNTY zf2Ak$BQFk?WUUJMr1GtKO*J`0yk6yC1GHLn@^FJrw?jeUJ9&145-u}UG1S_H?Iq!O z!y>idP2EzDyD7qnNhFisAD`36#~;QWZ(pudVcv7$gHC`6ikZDE+%hqc{kTR(xB3zN z5}901FStIDv2z;3v8_^w#<;vyT62ljezt*2uFVNi7?iWz7IB)h-M}8|L^y1HRVGY( zbc5ystuP?)$niY}-`Qna&NERaut$wUsrS=Xp9hQ$MHz((HK4T*iNQAeBuZ({mI30L zN}el^k6fAew$+f_YO}bVnRM4`rAtV^QIR#S5nzwR0k(pA#~AsnTDggSnZCPncv-$s z4_TKxuI;@0t1DAkaQ0r;G{4O(S|DqY=))P*J+sCX8J2$J?R!o{5NQ^(09Y1Wwlw=b zxz))>eMW`#+hQD(Bw^>vJ73fHekBK6i7p3C?YU($(Z+r}Qu88gr4~JK{wcP2_5fpb zI}q8k@COJ92Jxys`y!j_#aL3GnX3Rr@eU278WTHeWHsVpnHxqN8|oFJ0?A-xaC1ipOVxW8{72m4K<|-y-p;=Druj;mkrpyFqU_&KhPu z7Aoe=xjvkIo@1hMF4F!o^#wI5jl+5EbCsIk2FW_cUl5YkyMDcCcUkFu3#krv<>X+p zUe+M``X-<4_D3|?>Ri{+Ogs2)QRv)r->}4NaOaJU8o{L7Ad3&G0JWJ{veX10nyxx$ zvzmV>dlldGF;iQaIu2`Z%}Rk^z9tlz7pb?EbFp$T5{UkihGP7J&^*o!l4W773SyhkFI?&+a-yVM} z!W`lgA04eYUVeMZv0;jF@1p@YYidBYH!2miIm2U?;cGo?#=Eh<&t$0m1fUUVrpRAp9e(timnZ!I;pDK-b#j=(3H3cP**x8Rki(;>;uQwAjH1DaL2{4U)e+Ujj)}IEiaMx&x!hcjfIyGfs|Y^6$MS< zXGUsH;RO_tR77X8GGe6!30jxa#S2RKXobtRCVW?w*H1lkGDNYmu=}(e9r<2qS{#l7 zMSPKVrQb)lFAv0y?Oh2;LXM_tK0r5iv&wy!ef7g^Lm|)yN^oAKhQaz}Do)R4NtdAN z{Wq{5A1v3bk+Ln@YYbLPW6rmhu=eLNoKzp7a})?Wh9}g47+d&v_~|?rrX|8WLmY(1 zMb<|ss)Ff7^GwcMwhrel>@#ESJQf;4uA;a-=JJlEPP3_+%OIGTxncav+_}*kRW9$F| z07874rFy>^3EITU9im{R~U8ubK=g;=(6ykHtE!+W&!=;75iT(24Kg%|@aK|Rt za`}>Mw(<=wE*hyxxGGDB!fDwP%}tY^b<5{R+8E}eX$t|q<n;*Lv3auaThQlUioe(}%opl9NmL=HAm zk`p89$ybWJYP!i(xZ1u$a^jm{Kz83j{`^!+#8+K>YsE~%m-5M*^8FG%iu?Ryj`lyE zp@*m<>X>)ill8HOANBBCwd=RQjb?GOvbkCFc7ckh%{gIjaY3HDxhKDcSCSqLF|6t| z$Q(U6au&QgdN>B}Vf6?mFlgPYY^?ctDp&KocRp%9aFtcx>sI9Mq{^CRX7)=u*3Pt7my>?43_U2WQ3CpLUTr%6%X!jB`6krU zO8Gm+@~EK(**`opMkDBMCIeM5eWfahGKg81wPeb0yc2H@yV4Z!l3A9@B`c2l=tDZg zrx!6EWA>yGU#!Jmtw6H(10C2Urvy0RSxT_z#`PHF^oj;OoYtkeO14@t3IwefVnpGMtpvOZ@O|a7*J(Nx-+uA+Ou1R-4m!}58CbS3Sftm z9lnc>w`$8)KhYfzG8I^jLJ%XO>eHQ?N zk9Ujf4%b{)A}5-|9wjtURORkjyyGF`4N*^m#mIM4a72)N)($`89E}3NOxnP(5cc>0SAs~Haue(>8 zU9RHb2Kz;g&EXe4KcQyBUhEWccXoHDdGG6!U+v+Av+IX-Fs@rS`8fE3s?9S>f&GL zmecz!KCqsM#xmdjkVupgp%k|M2!4?Z)j8n^BhGdR{}j9OjGQe`ritgRr>MSRZFHVI zilE#G7(`zc%(?rMIF$qa39A&$`0JP&5vva%3n^z)ob}*pkgHW|1O7;jBQN!r@BJvh zy|6=&u=NqVm?cx@D_!OFd;3&C<@V%ahslF(iP?*TVZ(9SS$>d}wE(Y2~PG`aA$zub)|vO;DUkneE((DS$7d#b8cRX$$7 z4s)|PxPRx9sN{)XyZEjgWGgA?w`hNEgh3k`(I&AcuO6~R8ADgJ8{I{!o4oF@p6d7Q z-=mf@oy*wx;o~TQ2(TW|`R3^#Ct>Cy&`iGe1Yd?`<+y)$9E^eT#mNvDndDQ7(fWT#4c-cz{siu6?6 zb_A4p{iI<$xlNK@e2xvdT3WEOgKJI>i~7LHsZ@9zaDtH2*FNev`&o6{Yz>vU_c8sF z96(+Hr|e|&(&0epp4Z1subTS4c`x|43VrmDgE0z7^R5nPJ;Zox0{Eo`E#NJq-i+KR z=7k)HnjHo7l_D<{5G`-A+;!%3TyHPI06@n9mXS(q$pmr6DUeoKN20W5(D#R428TT{ zTCh8s)uTZpG%%4c3%%?5Q4Ch0XX{Qg?7OAX>Au>Jw)^TMTnM!<ST6XBZaI+X zdFlPljKo&MQzQ3x?RfiRV8^nLcDZj8iG>GSg7c+^P2IjLd&b4#;+#IehN3PG!TJN> zU$4)7;Ax$o;F(u(TD%HzDjS3-a;C*m2ZBepiO;hLw02}ZEyH?QUZ%?aR>h4^mKo)- zs(gn2$J5t`BHWRd9Z}PAoh4(3TmBs$MlsN}%*zEQd(o%YY`(qXm>7nurwAn2EsP7= zm=uhk)@k(TVcmH=&D)i&za?PSuKE;~_8G1_zj8cnQ6b~`^n{~?INK(y#St2dw2y>S zp=fp&>)HWscViLCdbHT2Nf>M=thW-kNB)4EmDEf%TxdYMs-J1~$j+2xv#K8*&gvHO zfCknd?S+b1s>`OB2O~KMQN?9z=*che?|zSOuu@QbS{>0z8DI3sZOKNX!>(YbSPMT( zZ4XT#7=UhX1M?QMKb>e^8vjhWiDDi~q!y&!o#bJt?9r~V&_K2P2RHLrppaZ_ZvZiiL&<7Cc6+5X@dh9VqmSAR8&Q^dKy3J~)B4^)16e75*gBw6pr(3% zQNTk5eN!hBBo=Z@zYj5Dz#(GWUz%W%+X(t05{ouj6!xZyQF)hUSD9S`nf1tMipVS* z%S3Q{-m-ZM@!YvkuN=ibrRiF04<<#Ne%pdfa{=E(M$a351zywycwF zSBRZM&N4ZC8L4|gAp}s%FeJdT+!h;47(OC|=XN&4adtz0h^~sZby-182hyMj5`>-k zEQSF2w-Dv)jY?jxqWXpNpo;H70wxBGaMxr(VGLMEg(7(i;urv z&Q)lZL5vgF28Mtb7&=k~B;(fVM_rao8SlU~LGZE!OP#4|#=;)%hp?!#S$)V>6X4&< zIQpFt=K>&Pnq*gThi*Ko5j()d-g3Y#5smIrS$Bvu~Xjc?AcOPs< zP)qMMzo8Ru%Q=EW3g$-ONH+MZUGE-*0)3kQk=?g5ax(&FX1uGugub$Cm-ptxr2K}} z*EqTSFsL|`HRSBPSM}BGIGwp4Qs{3x%D^JLn`8Qp&M@gT{xSqRU%z96a__8OqsHW= ziViY0iS})c!w3eL9HO!GCjEiW!}M+Z#UIG#PIZ5u(*9oI&6aOrDcADyx)9#imQwKK z+>y0_&or*OcLI==_oh`|E?$Md{3DHb(&A`j*IWa(MAGm)^FWtGjjKyR^1_Yz1i^q6 z<(bc~In3)%dCA4I+PEG1x;IiH3D8>d&Vs8dWn=D=aIbe1GGQHa7I1MSF$4yxY{?m; zmwyp+2zOZ3W9IJeKugh3TBPETG9Nx{^_W*HV}a8wHBD6SRgq>J>3EU0_Uuc0S>_=( z9Aq1aeKdjd>Eg}EXa@W)+y(s-0YxgLO@*)J4Z+2+R?3uznUTZ3_sQPt;Nsd0RL3P! zm>T^-DcVj+McfuQ<|?{GQ@20GAei=#aGCJ)wy8i8(=1D;mKKLSMXiXksS7 zpzN^D@eQacSZ}rq+Dxf=cL3h(gw|G`E?IXzs93jJuWK+Ee&68hl4Dj8dO-G=AM7*S z?b=?lDJ#vPr+R+JF8gH;>Dl7A3$;Jo$QkU5@-QpA6^jIvg`@9#qF-Hi^!!9Dq+|$i z?b_H;o`QrkF)ltc)S{xgXdHXQ$7=HplMM=fRsN?}7PhPwlEx|MnOJD1>Nu*)>2o;- zFd#<>8BSRRyG2$~020>qApJ3`4_@G$@e_c5fm7n%i-Rid7foN7m`ESe;m7SkjjY=} zz6Q$|%QF>WWviLXHEmJtf=Y7wG6&+VFYv1gwaG(28`#ezD&tXB^(Z@Jul<{dfdGS@ zC20E8aKz|ZLJ@AG5Hq9vwAb_?elfLGLz>7VAHpUuI&l*zz|f4jz#i@~<)mBK)vw}F z(zdVteCi+)8st5*qWnV2ETeiXl-}E{VVLKmhhW>eDSEB4V^iGRs&RAk)`f!3E`Ne4 zmv1Q4NFrS%iv!JGN>{%&i~OVD!ss6Ol&1b}b!%eW1=V?`c&-cs>Mg$88GoUGB+)Cj zCzI!W`cf?uLffzJC3;G7Rr8s;1l#r!kM*cy7?XU;xM!E|wr8yj{4|@J{`u`> zT#IOiEI?RbhlfzmS0I~V>7~WG%rrNt!*dYh@#uK)$lkAbj+;!9`l+V1o*jW5>m*c$TxjjSbg6yAR< zC)NicUg@OuK7Dq5X~TeBuSu?gyO47!3`F5$-)_7sB-9pv1 zWk&4j&Q^$)Xp^zBkMIJb?D$XGM1NY7^l7n}B70=5iGDb07S0s2Bx%WjVDr)%9cSeuI`8AzaYaBI_Wl%rP^{dXVU z`}58F#n4x(Ulp5n@gc+P{1ukXdx2ig;uL`l^KNsZRGMf9`^m|dH+Ux^wl8+HsYH_+ zn=_U4 z-h}zwXh_1+*r7;FD;&X028DuS9adY2^g*LR9*w0EfZ9x*Qx6=KU&AQg*YWk5Tj5toyvdJO#xt z44}v#i1{*2lL*L}8iVhv!cv?pb3j4El0}@2_8K5i9KHqt?#~nga8|G9@t~d{j0Zqt zbroLXNdb#qWRP4#aVKuQNqCN#(eLHyevu7nU!JyYQJI>8ezH;MX_6mG8YMx0<;dgK zZ6m)BG+%KJ+24c#UA&M1h6%Iwe>qM!Q(y8a`$<;MSN6}-6T?@)SMXt7$K8CIZnVg| z<#@NI4%ZjiduFIzO7M1_$uLqIXQ@n4>-^rWh7HB;9l9aEZ{S$5Lm>8LPycSeGn<-h z>szc+mn5jIR474xPKn47z56A|K8KRpxqE;v0-UW&Lw+K~WFzVjsM;SJTl4el4W-^z zvqLvd7&}vVLTr)!5okM_VvhPI@4s^Ms&w&TM^STk?#($M0?3ixC1`}jCTDy4f*cq{ zy)%D&lVCKpAY5L|#MW zcgZ^ZTNNR&`JDBNO%^KxFP~xBIjF@@50h7>vzi)q|D}uqvPoFD#yfs0Ko=Q3RHyfA zmq&M``sH&W=WyrnxYh3-OSbqL08)9h5Hx5!YvZg*pzt9wg1p9?iTW2QG^>Uh0Y>2`V)|oF{YK zM|gdP{*W`7q%V zli~)s`SYUpHqxSLcLb6-lxXjOx%5_ucIFa!uX8-t|F_(^YSGzP`J`1z{uP4+T2%^E zHu=p*9no)1ImO;GBUW+cXKExmiil0(vuabW^P>C3xxIz*6K$_r7qR2|BjergJgc8a z2d(#>5JwCkJK_{P;GSG+ zo5y1t`zolmqtx}@mdl>?oxB(=3~M2DZEF??fzc)@%fPLfsb|uX!h8zf`9{_LVo!=GJ^laUedqGuKn3-1 zuU=P&!6V-)qqxU5P2R|$>%Q$WArn-5RW{o1HcQ-oq45uG!gH6MsH$o^)1_B)Qv)Sv z#I|(sRPVH%dHm`OY#7sKj8SnW%Sam_zm2j}h0;c4UD_3hwHHaYf6VO6Q z-|15RLP3Aa$53r5P@8G3+lf-L)l_9o2{~~FHYhgtdFC(zlW%DLStAha4OPGih>iOunM9C6b462p_h)&90OLsD=&+BB4ebPw5WTOeD`8 zd%+dK0z!!Vf+g!S5-69~)t})xQh~E?53G>Aj6?QL1xt-v!v)o%Z1SL95Qv8#sqk_N z%O=;XbO*88S)yrBc=YB_NI-c>pEQSFDuUd4A2EhK*cgHkhz2PXGUP79y6WEiwscg& zFV$0trzK|SY%g?g6h3J(Xfco*$V53epyiq(EOCPIAhj;xkbBMmig{Y$Mb4;y^ziP&?dU8_P=|OalA?NGi1ygft zci_UTnhVOz0j!SZx6d51_HzwB3p^*BBTKA--P`kdL2+YQzMQ7#u~ zZ_zAzIT5dldwwsTyJZwWI~eHaOxGq$W%BlQ%JC`DPzndimLKeR;fXll813nd z%WDlYR5J=>Pp%+m|0<)=gV%##CjUphQrlkC%nO{G;dQp7*SCzLsu_;C^`{}2LB>`V zE0j{U>&s12?IHbh5=&l&luug0+^n75|cnX#Z_IF)RsduXfq&M@q{u20?y zCT@-x?l`m3e1}&kjhO%|e2*uLwFR6AT`g% z2|PDOVvQQoF<|>aW2FC$j08trd;s+E+DWl%e-j^D!p#X{D92*NNVqk5Or5-w1{M*Z zo{3#$JHPfVO=$q~#?;)~#hl5B+{Fj?9s;rDotA|5g->s)-jx~k?Y9dFq^m=*;y-fW z^#eV3m+yE1!g58{!?L#gEiNm~eAH~m{4;X;Y61Le&TV*1BpmD8=6k#&1n+|#EN8B~Tm%dZIW|!{`bm}P zBEYPt^c2G4fRe@8a69=qrBbKldAHCD9aA{9S0gzNat2}kGis7tA#a9K4ScPgNv^9SWVddVo#lL{$Qs{0HWc%bN|vEY0yo5FWsW= zN@ia1If|Ee%m5#j->iGDV#% zm*q+FIi9j;S7yZA-D}{(0=k3bhreg=^cdo=i6I+2^`M!J483u)P;*1jKv&ku5}ejd|vO7Ml|jGNJ+wlR)<3n<8Zi}N^mhV93jI1)66`0Z}% z$^%165fB?9&mcD{yZ{nj@3yLP@6)u0T}&wXB%u{va*!6?eGl(G{TELb$=w17hL{%S z*5>G8zC?w+;K%*lYxzK}76e`F$K?C2OU z7A}?0skp!2>I!KsE^7cx0--!RK$Qsm?ORu-JQ_-+Utk_J4^#5ICX3&~WPuG(%Oa)2 zk9_=)Qc=ybB9{5ds(%sE>?n}SVb4P$PhIC^9UC?85Ffw;#1FaQba}9(fbe#FPeuzM zX<$cXd{ig-dF2DwWB+)&6K!VD%baF6A9k{C+t&~UT>jA}y%2uxs)KCdDj-SZX{QEG z>pH(^33~ZMm+WurZ;_GVV~6dV7{?B|*h3`{=U)QSAN_GsdJ^^s*0M#5-Wqs^8vRF? z&X#Ehyc&rl;dhU_$znDG zUw(juKP|DV0%n`Ma3HzlStvdInY?9o4O8&M4hvf%{$MxS`FtzS=mN{VKkNYpYXb4} zfvOHd0MASFNK`GcSZ-;ZVg?9_`-}6R^c$6GX=d&{Mjvgqm7!bKtmkIqYsU^#``UW5 z<=}ldb8O@VeKXk+hO6M+FX?aT9&4T#_~ozY2rro#?Jt3M&G;TXc46%z!+Q2lA`=>E zx*4OE4VsqRDZdQZ-XQti$%dETLS6R<81{6_=Y;QfU?e)M^k2cK=3TRo!tuSg%Hu-3 zqyRJm^hKl<12oF~ahJmpF~*fx?~N#x(v~cpXB3z{ALTVl0F~-;^n!Ply0~NhM8?Lf zFu|-e%K?5YK88;C-UmWd3jx|V*cJnl90V7;dMxsdOpn2~kT%8mNUac`FPoD5_|yU9 zC^4J=kMejl#=Fa2_Z=#CY-kBG74ma@Kz;o~YC1vK78@0gPKXcjNrTlLK%ROxpF+ft zk=mSrv;CW3LzHVMIp@_@!+{USyQAl&&;!{65oF|7!DX6AkC=x4d~i=U(EsDR9b!3qS^r z)S<~0Jb|PWo)J$N^y?Rny~a)^JYm1#B5P99ucF$z4GaP(*8%h8eW0f*bfz~w3h<+j zPq`dg{es)v_BN}3w+94ZfBa2B?WghPt@n6b>Fp`n!_M2t#av@I{DI{76DB5S)LjzK zA5!|@WZQqfN3>D|i2l`rVgCf??gL3S=oO*Y)9{T?c2QfOq&-?HVqLNl498rc+lYtL zb}e0nY_0?O&mUj{Gb+Z{#v?uTRrHRbq?s;}K2hWnA*2N0X1|Csy(vJzFx`Sf zS4&wdM(p^^zd?!cXPl98u|C_XZsZ2<097_wc9!n!Za`1*cGkXdLDmM~v4^{rYRMBq}T zD9y6Vq;$y0>Y*8=*<|x^hx%mn(1g#Wv~8r4ilveY)tFB8iRR)p^x0na87q_8?Lws1 zU%2MCueGTGuD~0*)Ig2u>b`L<%nx@tImUFS&Pb`&92Xx?99W%y0`vZnX}X+g?)A~X zYsVqz1xt1CTcdfND;nOL$mC(LXs_c7_9ehC`j~zBb>?x|ywnGbVZ}2WO(5M)j^cj+ z;0t{$s1yyvQw)D12Wyim*|&x<0Y`u0-z#Fcw}Q^19TUJ&7MVV{K+WM#;>3}K`q05y zE)0698%&sG0AfAZ>%@cVrN;imRGdkm*^T+3*nIF}ek)BN331cx6J_Xw)Z;^@b1|nI z6E&HPzFi0iqmFqcxu=HVZB_T=rAxZmxsY}~uqv_KOiokYbtu2{4)bB5(~iFbVSg7p z-Oum zo&;TTGSTGuJigx~%>3P9B)?>Y)UM#{fO~5MgLRa%+*0`VYL~6bI&a&Twr}gqw1oX` zz*mbOF9|TBmartL(=%@EMR3#grv>ceh~X5b(2Z5x7TWLibkq9G4=cYt^o%-Q&pMk& z#X0m@Zr|F_2(7p$-&#eaey=MvB{YNMF@qPV6ouP9Xnzgx8?TqUya-M|#eOZ~iqLa^ zr!qc(OPvlfyz}O86nXd)<|jt8MndVH&;X>mU@HLO#N4Zh#c5Lq#N-|L?DV4Yl`b_= zK}pw{teq10|Hs~Y2SwGj+rEk@NDh*-C`gtdSsFy5M9Cl^Ns>f~BHao|j!IBclTo5b zjx9NZB+0SKxyjvhIE(jvzq`-g=iBGjy{GPfw~C@fOKP!LbI#`(<az&qpVuGeY!e z^Un+9CO{Io0IW_nn-=d*} zvspFWYX@JR@m0C^IrzJt2tgt|#V#68k7(nx!C%m+2@)U)K4fh$TfbcYuZqCgh&7P! zGF6pZzo`j%+k@yUf<*!CvjOd1 zhA^Kast@A2d4ktVD3JpKZW*$5X=K>Oh|#D9TLy|Q=h46ka?#D)6xMT6*R9ks`omMA z){;C23Gio;?Rud69Fna~%K1=f_#7ZL*v_`Pgk!n6g1!R=5ii?wL#i%V;$uszUfga( zZeovR;bRCp=dX(4r&C9HX(;!cyNXP((s<7hwSx^NNH_ZbB;SyOPKb-e8l&JrW z$YDnyaq(WQ4p)}du|$8%&@ePQ7f4x!Y7WJov}=*D0;rLkCs{y}V*EImjjCHCr@Srz zuHNuS#kEg&N&M?V4Na7z_4&Hj+UQNQvB@~lKX!SKUl%~Lq4cp&KU+`bY$U78uDQ$8 zTH;j^2Pzc}zYME!quiTzNi0<5Nfkc2N!2LUAE3M#R}u>;4c&-dzKkhhMc?=kPPjQs zPUi3m%bkP2EX8{j#QH{J@)h*lV~G$ifr3Ik`ea1~vEto@!8^~y3nC=gK-+Vkf0wz`zry};)&V4jKae73ta+e2b)(g`^ z?|uTwbb&aEsA_LeP(&R#9S3h{v2ZRP9H3qv$c}}OxdJAKPYvWgo479%prgL%x^R6+ zk3`c~=L!n(Y9^5nqj|%sB{$qvH-9rP)+!EgY-GzSJ=0B|L)uk6YxyEC+WD>oHJy!n zsf6nx!>I6~=pus;booOygtT#bo0+x=wNqrRoL_in6!v8fxeNxzXj%^XuoOMRp=ecd>hGYJuh5)_Emdv0$ptfR_WMj-nHFE0S3sG15GMECZ$1&VJDQ~BAemZt{<@!!Mw%M{fg1Tp4`X6=hp^d|u>U z#eC46{gk4*AdAG6w{2GUi3j{LXg7*gd*WJ*mR>b((_u6T}>g9_xY80?>{4D|u;p+uVfI9QkP z-%kU-61GAgz6t*B8a0%96n*pth*{LT_glV^O9&0^n~#N$xq&&lzLo;yn9nCp$J<`0 zO@(#`XNiDMne>S4CW-GV&rD&G9xI6~<4+G`t0BLy62Xrbp(_4SNfRseUi)I2OyeK1 zSR~V+X2#Sh$9LR-o&HmLRyXt>LF(_)?~xXas2B|Vhpm%sN1<$Lk|hnR3gD)nx)*Qw zuE|;S(50T;IE(7=iG^jjZ%-f6^48HO{`oxzSf`-w$@tXP=nuOkOg>&qaP+m=gcjW< zcL2wuYKm8qIE^^f{wCi`G;>a7$ZuJD5s-S;H#W0E0`PRQ6tQLbz=qSY*A&IJmb zsyvxB(yJ=TgRL2Ei=p&fTJN;9DocU11Eav`!W zVD|V#d|Z8{)OU*JE2$4cYc)f+Mfs&KpVwaa);P2 z5CkU7n1V`%?H=3~WPh3Qo*Lu3Q?E>-MHTLY;{k-R&vq&^``i@j;5iYTgF!;3bDPtp zOJ}@5{JnekA;n1FAgK9~eK%l_VQG6TdA*s#!X5gQ(`+IyFm3X!f8{gW)lkLgRmVqa zppOXy{35!S*`EOeF$yewrzEUWm)`-iGjI-Y1tv_B_kKfuv@QO$y&yx|^}n!E2E+ft zO0B@5h-MIfvdk>di^bo)T~eWX6*vzOO-O?YBoJ=YXr?ZbnW3~`n{i`uzyGKv@EAN!4{ zJ?!!Tqq$zt!*9ogAEWawz7E37(fSOPku<-*z#}j+TZd((3Nh>k^u^u4z$FjRPx=g| zV%etd`&Nt2To*Q$ZfZ2s63$L9e(9lmzR@WNk+H=fv>>jSE$*Ohxdok9qGk(0`o{d> zp05vlD)bg=?k&3!uvH#8tIUMo00Qk&cz}Ul;8El3$sll%{x<`blh^M z@dkvSlrO#C99>Z2lX{gqYkPV5^+Mo*`Yj;j{plJX9Zm7`&&K}Ni^<;Bh=?7I_PWmC z)Bq`OTi7PfE&40C-0Z?bEON6_i?<2da$I7@Pv?ApHp_TvycULt ztA6V%T{VW1&`Pn)A8rtRJ(twzuI6~defv;Om~6)G@@^OJV{flW*zAeWz|qG1>@h7L zXZH^VQTzN58-lfq(`aK=X4n)5MezafIXXR55eT*~>jbe;sNTH-XC*a?9}ckxGTqV2 z(NFjb2n8fgs-P8?0A&(itG|3~i+iI%W%{a?c=pTTu4DtxU7stIS2*j3D=LO&MZDf~ zh94^B_x5A!-_2is0~)#f*1q2=ypf&6Sa09Z1ew3UUmxyqzDIt(rx+9RU*JUl^OrA_ zuc7D!iz#dYPQfpaD~3=LQT&Hh<)xawM~(*t6X0UjLm&8!SEX0vma(97%M`OYE(!4m zLRXn{eBhpm(zDFHk+}{$yjv&p7N8zB!uRs;sD3?lfA@z^9pE)x!yCD$vmJ{{)Gi6~ zUq0b6ZFV;l`}|}M_y^!a@ZNhQHJu^RPyGL$hO{JkebZ9X;${!P`gz|^2!Mm^Xo7Y- zK>rUQSWyuA2Y=CUp2}a_v&a9jG~tb(o@`k-=4<|uT@kpB-k@t-L7$Z#<;MSgUH^Q3 z$#i`HIu%Mq36N8+7&!m#qk|H-ybfKvoCm;vssRugnF92bw+TbEUmp7IJb*+Tg#-&``TnCOa$v^?w(TJxj>5Gu6NmXJBLLGXWV?J6P6d2_06M0D-)&vWG5nt{ zWQiHL5Xo*#QN=e4%tFWursXD;n4y@Egbzf!T@drVD(-LaJ$LK;#;ck

    Pf7TqlLZ5^_ThZ~VtTI|5`lf4opq|J^Bi+e>cw>D8`$ zo$y{QGVL1u5(yq9WluV1E&U~J_PFEdNJX>E=57Qh<;O7l4MJc?QU5bv3hX67hx7c0SmJmVNp3yh(0W!tQ!aG2M_yGhWE1V*SMV za!oQA@#ElogAP$C3lvduO{xLnWjVSoPTY<&ssrZuD{B}!!3k>vrx9W{L6S)s7qrWD zO#l_JzPNSB%lUmY@4k3=z>l44eSl%wGr1dx6p!snT#mr_Ag7)Z4c~xJbkSr1@tTmX z1@C7b5O7Eo9CVZC(!7D`Xw8hoo&_J{+|OIbznS~0ry*zs_CsM^bJOU%xu@*@ zHucG?+7ca|ct+>o{`qM6mc&Vlw2L&OxErV4P-fbCi$pXSYnz@8@`+YPU8im*y~4*3 z0s)=)8IpHt>iWgSryt^W7u200Xl2=RMNW}$LJ2*9WRsOrh+E#k0E`Q-mERVQ(TK^~ zF$VyU00ys2x9*}1WJMLG<$s0Cw~8cfX$k*nfM<*6#C_`S@BcW)?YNvcQgsn^+Y3Hp zP##d{PVhl`P)27^WkwHB)j~u}xym&V0ZS>`i^+jn7W6#7hs%&@@`!d8d^}3|OX_fv zxzC?~4&ywJpKa8W?RxQ|+nmwe)d$Ihb(+|c0Z2nBhV1+@$qWV3LR8wIb26p)j&fIk zm~cbWvK)e$nq)Vw~v z(Fnm0e*U>lPdVCDGx}rd%qdu)R1MP>lr)N^n_CvR6c_nU=4kw}Wef z@_BWgDjHdEa$uyIsgzrT>^Y{JudbH$p%&xu_kh><9(&s~eZU~a%M`VCFI70Fu%VQt zw1%zea^YWuEWmOdw?C~_Pehx`Uw{0p)*CjE9fy)rm@IqoXVie(u>Fm!;RRq-;ftB1!wJC{hht2MZI*vOwB`LmcbJYRqzdW_W1!2my8K}Ejt7R1-&;`aB`ct^Qruc!vaEYr& zyl6;zZ?-zTjV_#>IZ$n}tk1^5?*W3B5HO`G9p*ktI>F}^_ls}PzA)rMUzYGxS@p`Q zQ^@om9}FNkz4lji0m91uJ)J6R(rpQwuLH~g#L+~>XQR*Q@?iCH*p)V1NRIG91}{+D zs060+-gHaI05HT>cw4ufxo;$?Ha!?k6@ab0|2NN6>JF~%I~iwh)b`1&ohqf;j3KGx zT{U9xye2ykeq4V3%BC8K#}J%aY@ea7SO!}g6YCS3OEoc9kJ%gL#O&)(p$xf%SIvk| zHE+RZ?>>ekO#A9*=_@&gKfGu?vKF~~7;uWJ-Ur1p)9dEB?*v6om3wfD3qBu_-rkWZb*?;fraU;K zw^3ZM^4O?MfI{RJp6=aWky$B1nYqxy*xb^#m**EP8J=?)QYx%YBLVj&oKPVeUz0{# z0D@Pd=Ld&DDu+ML_vV|x8RBSZC>f?PqAa|V)6XjRA4pb2=Y6W3*QY^WPpqJ4;9lbl z$YB%(89T-G>s27iUqO@KDBO#1tVwO`qhB~)o?dDW+_}TxegC>d50vE?>go*RM1t2s zv2mZ#C9#&f@oYwN={<>@_^g5c{PUQOW3TNVIYxJ150#_$PY0=i0@vTCf_^miY_a#; zl3zq6Ggn)FOTWI8BJSCM%!(44n`mVjBx*&;<+(7R@nBSa9Ro8Z+vl>S^|aU8|3x~t zqHyas_(`mdNh}Aff(KSq{sJ&-t1Y-uhl>3io^tE5RLk_?2RS3Y_*SuD_qs*luX;9Y z04qX4W}HLV0RXo83LANL_V#(c7CfbUw3@N^a;{4s2FqW>Trsq|%BA=);cD*Mk#~5| zX#CIKe0yOJe;hY8@+uSv7`_tIs0ETBN7x=Ena6EE+WO-r4qpiJp?6h5^t0{<(@5+C zz}5EY{3>(zVA}3%dHp69Jxc)$FMHlskjw!C$mxY9#1444nI*tK#4~cELIIx71Y;_3 zF9rZv48tMbbh3aw;$bvj>XuorOdDfAaozhUi(6Nn5fmYhnN5+y87xR_gSO$qZv=tB zY!$#uyx&lRH4zMYZ~h0b>n!e@vAPyk76k z(kmD)E7K-7bKX>YBpFov_b(pwd}KRz_bf`(z9vK@uU!J zW7iXUX{SiP;&?o7T_`$kl|IX1?1G!eVinWiSaEJf?>w)f974Y+1@PSxOulIt@ESMVHJ9~GC3`(9e_4apOc{of(hCBz(!E64)$Kuo&Pcx% z`0X_zgAab(AH9Hb1?#f21%-hVkVNzmbqVEuCJcrL-JCuhGEK*9&7UXz3;3t)rW0)x zD^QsZ^jke;r6*f_+C27qb#BL|4IYmxEW}jiBfcILFEtT44F%Okcv=)Tr~Og2Ur5Nd z#t=j>0Nm_!pGfJcN{?!y6>oqs5&KIJ`y?Xis(tR{o&1Ef_Me8?WlSahR`hq{yFahR zJf&$QWcg|1f&i~V>)Iao%&_r4dC+9bQ>;$ln!L=42W6+Rs|A7kSSY}3%g<}sF28*}GvjaZ_O>Mgt;EJX^*`Sv*fITq()5Om6grkYg%>|Y! zXN(9yU|akM)3r_bQoTTb=r<|Nl(tk{E!<#;}nPJB%dk*p9C}?yw2| zhm@ss$L4v+1`EXRJZ2DrR)sgpuBL$g3*)L^8!#SplyS6g0&V^F=wMv>m zC%pwU$25xTWrYLNo+I&LycFeH528(i%CsEpFMIu$#q}SQ=wX2Yde|3j$$%9?mYMpG z0Q{8?K;e$tPaepswC3oSSZnsBi%J0S8*Ts;Wiiya%4eZGP?~o~=91+o0EbkBBUQ z8hB9xz)bvA!wYK#k&(D!El5ONA?e$$hnWCB?+ZIKAl|*^JX{Uu@v^TZv!)yTJibwe zwg?OXx&+eHq6ldoD0$FY7*q5zG-8|~_i zZFllBpnV6^z2}a9{gM#i0uWShpC?DV>!-=w0E4Q9lsas=uVYz-5{c{*IZemoZJr0B zfgbDx0f?G83fK0u#lGFuQu@`4ZS1=d`xkrmoGDjw`4-+Xl`0XkQX02aa5g(|UaaFy zxrdEQyI`mwd<3rG1t~kW3A_V9SF8=Cqbyc8Uz(rEH?Y4tQ8|h5G_zC2nGJ%9>HrV2 ziW1*~7E|&-{!Kk)K6`%+Nl*E))AI(aF{M0|jI3`Opu&DdVIhA;PK%95-sA{zPPWE4 z8)492m#<7l^NRS3h7^!!hVo1p_adlI1^3&8zPasX4DMQFI?=Qh^qxdT-$0B#TB_s#W$!^ zx$a<3Zrw&5#W`3gDt%}1w+dHFqv8h3{moCxpNCU7a|}i&4381((NZzNw;)jk&5D*$ za%pnrm_WIIv5KtWf|$5=^h4yMR0+qYzYkFl6Ee-VV7&PUEY7$rw}oAyKG^$FA{z=! z+%X6MNqg$vYHq~NIUxtnpeENp(F77DQFbNc%H4~G>6nZ)_ZAbx1vAQhlQ$4z;6uK2 zQZnl>piHtCGl%(nv?#Ou;`f4~SBR(W*ss#|w9(-*b#ZHun-OUj$L*&gFwHj~Gm`>@ zrFHh(?ngioCb^dvAIaBV=3~B1Ehz}^qYSx(w<~4-qlY>~V=(}=>nC}LQu>K49<*4zGm;~7>UOdPdQ)Y3gZWR@^IuB5(Vl>F zQyI}l3JCHRcy3s4{aC3wxJCz$FwXnq`E<$`I71aszb9@HRC+UzbNWvjahY`KT-#L#PQJ|agc=2kc9r;E4{ zulP|=8VqHi?5k5FAPg^8Cch!;+xO<%$i>%@#pTWsf@xG^|=1 zh8j>X=c>y0>Ps%Vl{VpkeBlFY`Eg+lprUQ15Q+ z^;B=AmxI3{%BWNzNi~S!ijd{=FG3cdaRXHbUE^>m#x8cfOv^Yz7nT<3SqtnRVJ)2E z%k{6G++OEik)9Irp^^1>CkISqiIIuL$~!4Tx#R)02CY@OUyt6rEJlyn_wh^XIX}g^ ze&(Y=3)CToLXql;x!cx{%ob=W!lzh5ArCt~(;o_H{Vymz&Z4mc=LdS&vdix~vz1o} zspk>y1z$FoS>B$448RtIZIK)c09?vey24n zUjBVp5r{I41!hpi_?@|#bNjrvc$zWha2(fX3@=4l-3mMzg`-~9WB~g}ky9pYlf%Uu6M#V|x7Lxt$15~^jd4!PR&q6xS zDwb|f;{IY;`Nf`s?i)1`%`Or2M^qT+=(1i~ahi*JK1<>f0N!*E^oO{9BLXhc7R~|i zx2(B;LLB}Aa7kyyjqbb%M2n1pfoA3YW6YlvkrtyggCw|Mc~9rf4Uhi}(ZcPWxIU6C zwEGBU*}6=g9H<5&Kk9KbU6;cYjS$u;wf0oQBpa)R-uo{UW%>5FH?ra1zI)!y81@%j zTQq=;AOagZc%zioBID*_d2T42<>DSo_zN1;6<2tzAk!YF{n5$1d;iOrzQ2umssSi3$01pen z+GuuS2g~n$%tpF8_>zlsu0UX<;a| z*!^}zzpK&+45M}O#>@#^k{R+h8tdfB*_zivKco3BPF<`>*U^jxR($vh_Sf$84;KsA zooaI2Ov=6K5CW%E2)sgxGVZc?XG@}R9#j0$NdMWEF-T!hKHnH%Npl3qSZic^s1rbz z*@U-B5k3tDWElq?rF4y7K#tStI)2dAM#W`3S4V)CO(=OEvOEN7_>K|3#PI5~JgvmR zxxmWIZ45B_kHkjc=(aWi5j=Eri`}9G-Ywu|J<%6nQ@sVq-iV9?Y$`z$SD6FKiBs8P zcp(Q#zB_^|<39=RTTJ>EFpMxLS$xV^inv>ZCN;*vJM$#4sNjX( zo5yn^!@@fdfE2CyLYWm8_uAyMprvYhxgq#(RMz8SL)c>R(ciGFF$0&AK_-cNH~^Mq zZz20{VObG06=Vrx!RYcPG6wW2oI?@KN!W}l5B}gU&^g(zSZXkqIBHE9_ zjzQL9hd=rl(tBj#j{=>Q;VnewM6u;7=-+#NlVnwqzvJmcU~Yc%`hA)^3VHpQ^?~D(#sJ@g z`T1$zuJh_V zjeB!GSF7ovKW5|4dvQ~@#XO@Kr5k|U0{ti<7PbAYj6E=msPrJyaHjh#H*M86ugca- zm)9DH?r4e*e7a#3=hXI4EU)R-Uc=0hd%m)OH&$NCA+PjFbAJ{0A9Q|LlwzvJa#tPt zHS04G)&xZSyUT;Au$ESL!PxSSE}rA8i}iK{UGJUU+P2O&M529b0JYF>NU{1Icf%Cu zU8AU6bQ~S)uX^6z*?!k1McfdOxXm4Waak*FGoe7*9T#kgdfG*;O!<~sXic&ccrV~v zq?Sz-xH7p%vM!FD44;t4(i^L_MM(g<)GpfE`>~8+!p81h1Yw#GO6w)lkLG;4+|1~Y zLwm@&#+Wj!@k)8!c$@9@M4$QSR1HS|58G&?Tsq_(!l-IC zcum`>7V`Gktfc#3%N#TW@_?~TU;unXhs&j(L!f&W!7~DlK7JtQ zGMYohiDWSM7!A#2BNLCdx_CX;Q>DknZ`PQQxuBIWoyyh{Fx?|oaGtALYzpCp-m(rC zw$=Syz2KkOI8p?<7f;A#*dsSgxL;fJ4?jpT zX}SH>vLYEe02_ey{>F{@C6Vy_ei=)4&0*3lajz}}rB(z1y7m>HwfLWhOpw)nj3
    -b?1^)nEH5+oh2ILz9Z5)P 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%0D^A!by&BEr<@!U!VhE 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
    ;?}r#c}Ydabtrb#JqPIR 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 literal 0 HcmV?d00001 diff --git a/examples/big-bang/kustomizations/bigbang/values.yaml b/examples/big-bang/kustomizations/bigbang/values.yaml index 47ea26599c..7f297fa7bc 100644 --- a/examples/big-bang/kustomizations/bigbang/values.yaml +++ b/examples/big-bang/kustomizations/bigbang/values.yaml @@ -34,86 +34,86 @@ istio: limits: cpu: "500m" memory: "512Mi" - service: - ports: - - name: status-port - port: 15021 - protocol: TCP - targetPort: 15021 - - name: http2 - port: 9080 - protocol: TCP - targetPort: 8080 - - name: https - port: 9443 - protocol: TCP - targetPort: 8443 - - name: tls - port: 15443 - protocol: TCP - targetPort: 15443 + # service: + # ports: + # - name: status-port + # port: 15021 + # protocol: TCP + # targetPort: 15021 + # - name: http2 + # port: 9080 + # protocol: TCP + # targetPort: 8080 + # - name: https + # port: 9443 + # protocol: TCP + # targetPort: 8443 + # - name: tls + # port: 15443 + # protocol: TCP + # targetPort: 15443 gateways: public: tls: key: | -----BEGIN PRIVATE KEY----- - MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDbaLWaC86eG74Z - D5JxLJ0X4DpOTZgGeP3oY+oS5S1pE+nZq30LrC6YMQeBLSvJDWpBtvV5x9F88gMz - yhU94HgrWH26LBUQIBti+ip6IbS0sAKc6bicw6NBtR2F4BnLGw+mrUniVT8WNrRL - C1NkN5shexmTE6XAY9Ak6UpApHVmTiB8xz6hypr4JwqnqQfxDO0+AfaGSHheKo5h - xTSgUYULhyA9UaImHU+S/SekwGLRLX1KfcTpnz1+TZiQqShG9vqUB4dAge+imwAs - ZTCnI9H3tmz6jWekXQYRUraJUwjEaqqLoSQT5VQmEl518ueeRKKNB/8mi1pylWqN - UjedV4A5AgMBAAECggEBAM56xORaljBO9WAKOotNK+1rNBO6jAYTWQeY95CeolSP - y/PvobcZa6QICAL16o3DlSqQroTTmf7WllLnq4PWueA43+ETWSMaxAsqWE0laTTd - qyfV/8lvhzTv5/+z/TIZnmoCDFT2Wm9iPdudpfXbKp+ghFnYFJVwmVITRbB91InX - 38LaEvLWFnJ3/DPYursaXerwwrm50d0PCdpa/ceqBCVHlpT3Zc0lT0rYpDVtc9BG - 3gjbvKwhVUQBDfD3FGEobxhbc5eEH6JEf0PUWKnsU5F0qRKjQnfM19XKbczP+9gY - 71BDL1sALSZxxJXW865+7GeXKCtxObkcCwYbf8UrS30CgYEA+HSH4ZpuHZ8IKIbs - vFaAjsEMkRfZPao8b/g4/JCg4TuOpAdFZUTSPWmdUq3i/J8o9b+e8/bznn9HLHIT - qyreSyiRUQRtcniSL1ZUHSzzW9QefYKzPghGYHXQLIBAWt50PDaMfPQ6Sj1NaEPH - h3hq4YNYNMQP/QVmfFdiT4xVA6cCgYEA4hJgSc17hh/u84uYAKhg2zSlFG5LlYKc - Yb2aFQJhFz2QqGxMeOXyIVDFD6btGcOLtPt4RdsBuCLZZzFBDUlWL7rY9qlL+/+P - ERStyHE9gFBDa0KWfvQxHSXIuxN2mkokktiVfaTisi8SWEKRJYp+B8HCa5lSDBti - eXcGBK3hWR8CgYBJ+aBPmsR4i1ZJgsrP1M2YM4CDXt9uzdYK3JRTFtjf1vTEf+m4 - mkIiyORvrphr8ROn//La3sdwhKLzZ8/VYgEnzZ9eyPuxXpbgA0suGKkoyUJ+ykCG - Er6pj8p4xYLjy2I+X1t7BNiqLBB1H+Ezw7XHCW1k4I+GHWqDUR1TZAwX9wKBgFhy - KAm3wqPuymWuL4HSXlJkflFH9XpA5z22GBowHBwjkfzSofiKvfgayX4eKJTz1Cyy - VZO+4yVPPQ8KThEMqBN0Xn3iLkAg87ATDwpkg1M4E6hbHNX+Y1ir96R5MOWcLELn - SVUmtSpREDRHltHBJR2TyKSgD2F9NUGgN1KNVKSxAoGARyx7VceWlpdmnr+i26UH - B4h6/rL/nY7M2oWgUaj7FeygcfemtO6cV+R1Bl876Q9Dx797hZ4ddGAgxmDFsv8J - f6SSzTJBB6IGxt+1ZcxD4uFXUrOVFv00br/Re14bsXQcMwi9kEJF2idbR5E7O2qc - qbLlPssjuZS5pDnRa05bEIQ= + MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQDWf1Mu3PzeB7cL + KMFYUoImy+bX6aXyV1d1gDCgxvXmIkY2EMFG0yL4fqRSMExgmmTVBJmDcJixBr36 + m14t6g39FX0n0XEnB4BvxyARFnbyecB7EUQ6AGCzUTbAW16pgQC2SKuIm7qjygdS + UObgPfXqkUDshARZo1Q6OEFBZgn2R/lISg3wNlxlIp8BSCgLEE5mhAJZX9OzfVXC + zJTxXtl9IUSQwuE9ANGb0AP10xdp9gR2uyAyYXgW+d0/GTKGzJTrkcy5x39XXIuY + ddOg7dQ7lSb6VqtFXaDvnrHao1Pn/W/UG8bmGM0uDRqLdvllxp9Bj2UlHD2W9v+C + OLtxxaubAgMBAAECggEBALaCAfJHADWfVOT+2XxgP/Po3NNsL9IC9Ry6ZSX4BHS7 + RwhruzibIA9WGlUAWYx88jy6PDC1loZSGUXp+vmQRDTKmwJNWD0ASg1R3fwMJEtu + wxMz/txnQ+BvwulrFSGe7U8siB+leeoxVYd55Oh6cAsVaquULOtkaJ9dDFEsFF/j + ENySaIXqpuEG457xLL/uCfmUd7SaLhS8FbmwadvYphQK6huVpVFbBhRzLbTRFGI/ + S/kpZ9cdBIxmoZTSy1l2mveCEpgdqMbqsdLQLijYUM5ZWjW+VA+4sgmY0/oPW3Mx + M6gQUu7TQeIZFmtl05UAOICm4FjqezBmaiihjsLr3JkCgYEA78V53BvgXNvN9zzr + sn3/WDBhYxZQiGacVvirk42rT/mPr3o9tqI4pxsN3ZK3pTvBoNbRI2UrfjgAQ/+J + OVuwaheXKeTdDiSWc3suddkfAHAHECD+FZ9iSIH8t8h+sVlf7HvTe5on+JGhi2nK + 26zWv5FBjBFBgFMyXikaSQBpK20CgYEA5QPs4L1YF7HskrIeN75sbQUgNL1t+Q0H + SkOpfTZ/VbnT+92lKkdWPxmXabZLZrTYxw9/ZswrW+SgIc95kbLOiwiV46PVca/Z + fLdSBZcKqV0GWnehuh0ClhiNDJA4ZXNDucu5ZP7eWVvO/Xh3SNvhAZtFidvRuO52 + bCT7W3j5hicCgYEA4pm+BjBuRTQSnpN7qW/8j2sBzvR63b4kCOnwtX2RJv8TNWMQ + yfbcFcmyu/H6D3W/E/ORKaNmjF3+mkT5ejTWMB3lZdl+tOwNKEyFZyjwbKhzdGHJ + 38OGzkHTBhm86n0t88A+6TSSjA+OHcS4zA230spDqU1xmwaFtomf5tg1jK0CgYAs + pgRDmIaZMAYIX5OGmKh45LvvrFLJcGHQd7qOf9Z5dx4+B2tQ/9FvweSEJpcyseVl + gb774qg9ZShXDyULY8niz0yxsdpGLNuA9hiWoGjithEsCBDOwSMk8iplnaRxGvTE + P1SovQvKbhy/zAGtgbivYH9BLksH++24jck3fzFelwKBgQCbTi5jgcNO5UZc0zct + BboFbBykE1LlVOWGBB9aQ6FcKmj42DZOav4M87Yajh+2GvvgeijGvGj0xdhaWEMD + /G+OLmLlXucuzb+BAxO8jgIoQhh4gVEFOuFaXrBoQT5sMuTJDnYzxLnLXOKlMf4K + Uq/W3NP3fz/2PMW2GS19TX7EQQ== -----END PRIVATE KEY----- cert: | -----BEGIN CERTIFICATE----- - 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 - nMqEgcgAiA2VuE62Q4HE0Rs5wA== + cnlwdC5vcmcwggEFBgorBgEEAdZ5AgQCBIH2BIHzAPEAdwDfpV6raIJPH2yt7rhf + Tj5a6s2iEqRqXo47EsAgRFwqcwAAAX2+VcfaAAAEAwBIMEYCIQDPwjYC5CixLXKp + NytLx3H1gd0D3t0sCwCs8zpF++OQEwIhAOYj8nLjKWayunsZiUSBow5Tp30iNJqA + HAl00ztr1ei/AHYAKXm+8J45OSHwVnOfY6V35b5XfZxgCvj5TV0mXCVdx4QAAAF9 + vlXH1AAABAMARzBFAiAb6uSCWFwa3boOPrG7LyOc2nKMU9w/QedWI/Il6wJOmQIh + AIyhqQskxeMJZjj6v1RxPY4Y4gRDzaDql1PjnXYMDLeFMA0GCSqGSIb3DQEBCwUA + A4IBAQBsIx5S6YTk8wdnvKWos7lzsHq8+RxJ6spK5JoWRTLaOIPZKPIruNudyt4D + tbGTeiYqh1hP8uoWea8tE8yBoENAner05Wh+CyMlIoULF71lOLryRVokVYYCo/NT + HiOX4RzgX3WVeve39AU6xMCmVnRLfTHS+5kGJ+cP7rAStsMKpiiG5JM4gkNSrP/T + f++rEw1H742L5bTkbxV8K+KULhT7y1zDSgkPkG0iQgYdzWJgqrpkFM+mtcpWbKv5 + ygOJ3+D9VAyfiWjSNJ90HwswN+6uYzJsilkqBfCuew8F3sDQCJdxgRWDaSv8/iEy + 44zB6B3HDGNd7ZJkym49I12FSnnx -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIFFjCCAv6gAwIBAgIRAJErCErPDBinU/bWLiWnX1owDQYJKoZIhvcNAQELBQAw @@ -177,6 +177,7 @@ istio: Dfvp7OOGAN6dEOM4+qR9sdjoSYKEBpsr6GtPAQw4dy753ec5 -----END CERTIFICATE----- + values: hub: "###ZARF_REGISTRY###/ironbank/opensource/istio" cni: From 1baf2534b4c0dd481a26e7a80a5aec8f52eb3174 Mon Sep 17 00:00:00 2001 From: Andy Roth Date: Mon, 7 Feb 2022 17:19:06 -0800 Subject: [PATCH 82/88] Multi-Distro Support - Update Docs (#289) --- docs/workstation.md | 36 +++++++------ examples/game/README.md | 78 +++++++++++++--------------- examples/game/add-logging.md | 56 ++++---------------- examples/game/img/game.png | Bin 0 -> 801399 bytes examples/game/img/logging-creds.png | Bin 0 -> 25635 bytes 5 files changed, 67 insertions(+), 103 deletions(-) create mode 100644 examples/game/img/game.png create mode 100644 examples/game/img/logging-creds.png diff --git a/docs/workstation.md b/docs/workstation.md index 380ac67920..3c2b789d6a 100644 --- a/docs/workstation.md +++ b/docs/workstation.md @@ -1,10 +1,9 @@ # Workstation Setup -There are several ways to use Zarf & the tooling needed depends on what plan to do with it. Here are some of the most common use cases, along with what you'll need to install on your workstation to play along. +There are several ways to use Zarf & the tooling needed depends on what you plan to do with it. Here are some of the most common use cases, along with what you'll need to install on your workstation to play along.   - ## Just gimmie Zarf! The simplest path to Zarf is to download a pre-built release and execute it on your shell (just like any other CLI tool). To do that: @@ -52,24 +51,30 @@ chmod +x ./zarf && ./zarf help # substitute ./zarf-mac-intel or ./zarf-mac-apple above, as appropriate ``` -> _**Take note**_ -> -> Commands run this way _will_ make changes to your current system / environment! -> ->This is the expected usage pattern for production but for demonstration / development & test there are better, **virtual machine**-isolated ways to run Zarf. Keep reading to find out how to get setup for those! +  -You'll know everything is installed correctly when you see the Zarf axolotl scroll through your terminal! +## I want a demo/example sandbox -  +If you're looking for an easy & low-risk way to evaluate Zarf, our recommendation is to pop into the `examples` folder. Because the demos _aren't_ intended to be long-lived and _are_ expected to clean up after themselves they are a perfect way to kick the tires. +There are lots of ways to get a sandbox environment, here's two of them: -## I want a demo/example sandbox +### Kubernetes-In-Docker (KinD) -If you're looking for an easy & low-risk way to evaluate Zarf, our recommendation is to pop into the `examples` folder. Because the demos _aren't_ intended to be long-lived and _are_ expected to clean up after themselves they've been wrapped into **virtual-machine (VM)**-isolated environments for easy setup & teardown. +1. Install [Docker](https://docs.docker.com/get-docker/). Other container engines will likely work as well but aren't actively tested by the Zarf team. -### Install +1. Install [KinD](https://github.com/kubernetes-sigs/kind). Other Kubernetes distros will work as well, but we'll be using KinD for this example since it is easy and tested frequently and thoroughly. + +1. Run + ```sh + kind create cluster + ``` + +That's it! You should now have a Kubernetes cluster running in Docker for use. Run `kind delete cluster` to clean up when you are done. -You'll need to install _these_ tools to run the examples: +### Vagrant + +You'll need to install _these_ tools to run the examples if you want to use Vagrant: 1. [Virtualbox ](https://www.virtualbox.org/wiki/Downloads) — The [hypervisor](https://www.redhat.com/en/topics/virtualization/what-is-a-hypervisor) we use to run our example VMs. @@ -91,12 +96,11 @@ You'll need to install _these_ tools to run the examples: ### Try it out -Once you've got everything installed you're ready to run some examples! We recommend giving the [Get Started - game](../examples/game/) example a try! +Once you've got everything installed you're ready to run some examples! We recommend giving the [Get Started - game](../examples/game/README.md) example a try!   - ## I need a dev machine During dev & test, Zarf gets its exercise the same way the examples do—inside a VM. Getting setup for development means that you'll need to install: @@ -105,7 +109,7 @@ During dev & test, Zarf gets its exercise the same way the examples do—ins 1. [Go](https://golang.org/doc/install) — the programming language / build tools we use to create the `zarf` (et al.) binary. - Currently recommended version is `1.16.x`. + Currently required version is `1.16.x`.   diff --git a/examples/game/README.md b/examples/game/README.md index 0459dafd62..8940aa30b6 100644 --- a/examples/game/README.md +++ b/examples/game/README.md @@ -2,7 +2,7 @@ This example demonstrates using Zarf to kill time (and evil). -More specifically, you'll be running a copy of the 1993, mega-hit video game _**Doom**_ in a Zarf-installed Kubernetes (k8s) cluster—_right on your local machine_. +More specifically, you'll be running a copy of the 1993, mega-hit video game _**Doom**_ in a Zarf-enabled Kubernetes (k8s) cluster—_right on your local machine_. > _**Note**_ > @@ -36,47 +36,64 @@ Here's what you'll do in this example: Before the magic can happen you have to do a few things: -1. Get a "root" shell — `zarf` needs power to install stuff / bind ports / etc. +1. Install [Docker](https://docs.docker.com/get-docker/). Other container engines will likely work as well but aren't actively tested by the Zarf team. + +1. Install [KinD](https://github.com/kubernetes-sigs/kind). Other Kubernetes distros will work as well, but we'll be using KinD for this example since it is easy and tested frequently and thoroughly. 1. Clone the Zarf project — for the example configuration files. 1. Download a Zarf release — you need a binary _**and**_ an init package, [here](../../docs/workstation.md#just-gimmie-zarf). -1. Log `zarf` into Iron Bank if you haven't already — instructions [here](../../docs/ironbank.md#2-configure-zarf-the-use-em). +1. (Optional) Log `zarf` into Iron Bank if you haven't already — instructions [here](../../docs/ironbank.md#2-configure-zarf-the-use-em). Optional for this specific example since the container comes from GitHub rather than Iron Bank but a good practice and needed for most of the other examples. -1. Put `zarf` on your path — _technically_ optional but makes running commands simpler. +1. (Optional) Put `zarf` on your path — _technically_ optional but makes running commands simpler. Make sure you are picking the right binary that matches your system architecture. `zarf` for x86 Linux, `zarf-mac-intel` for x86 MacOS, `zarf-mac-apple` for M1 MacOS.   ## Create a cluster +You can't run software without _somewhere to run it_, so the first thing to do is create a local Kubernetes cluster that Zarf can deploy to. In this example we'll be using KinD to create a lightweight, local K8s cluster running in Docker. + +Kick that off by running this command: -You can't run software without _somewhere to run it_, so the first thing to do is have `zarf` install & run a new, local k8s cluster—the "Zarf cluster". +```sh +kind create cluster +``` -Kick that off by _moving into the directory with your init package_ and running this command: +This will result in a single-node Kubernetes cluster called `kind-kind` on your local machine running in Docker. Your KUBECONFIG should be automatically configured to talk to the new cluster. ```sh cd zarf init ``` -Answer the follow-on prompts as appropriate for your machine configuration & give it a few seconds to run. +Follow the prompts, answering "no" to each of the optional components, since we don't need them for this deployment. -Congratulations! Your machine is now a single node k8s cluster! +Congratulations! Your machine is now running a single-node Kubernetes cluster powered by Zarf! > _**Note**_ > - > Zarf supports fire-and-forget installs too! Give `zarf init --help` a call for more details on that. + > Zarf supports non-interactive installs too! Give `zarf init --confirm --components logging` a try next time. + +**Troubleshooting:** -> _**Error — missing or unreadable package**_ +> _**ERROR: Unable to find the package on the local system, expected package at zarf-init.tar.zst**_ > > The zarf binary needs an init package to know how to setup your cluster! So, if `zarf init` returns an error like this: > ```sh -> FATA[0004] The package archive seems to be missing or unreadable. archive=zarf-init.tar.zst +> ERROR: Unable to find the package on the local system, expected package at zarf-init.tar.zst > ``` > It's likely you've either forgotten to download `zarf-init.tar.zst` (as part of [getting ready](#get-ready)) _**OR**_ you are _not_ running `zarf init` from the directory the init package is sitting in. +> _**ERROR: failed to create cluster: node(s) already exist for a cluster with the name "kind"**_ +> +> You already have a KinD cluster running. Either just move on to use the current cluster, or run `kind delete cluster`, then `kind create cluster`. + +> _**Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?**_ +> +> Docker isn't running or you're otherwise not able to talk to it. Check your Docker installation, then try again. +   @@ -91,10 +108,10 @@ Luckily, this is very easy to do—package contents are defined by simple, d ```sh cd /examples/game # directory with zarf.yaml, and -zarf package create # make the package +zarf package create --confirm # make the package ``` -Answer the questions & watch the terminal scroll for a while. Once things are downloaded & zipped up and you'll see a file ending in `.tar.zst` drop. _That's_ your package. +Watch the terminal scroll for a while. Once things are downloaded & zipped up and you'll see a file ending in `.tar.zst` drop. _That's_ your package.   @@ -111,46 +128,23 @@ It's time to feed the package you built into your cluster. Since you're running a Zarf cluster directly on your local machine—where the game package & `zarf` binary _already are_—deploying the game is very simple: ```sh -zarf package deploy +zarf package deploy ./zarf-package-appliance-demo-multi-games.tar.zst --confirm ``` -Respond as appropriate and in a couple seconds the cluster will have loaded your package. - -> _**Important**_ -> -> It's possible to try a package deploy _before the Zarf cluster is ready to receive it_. If you see an error like `"https:///v2/": dial tcp ,:443: connect: connection refused;` then it's very likely that you've beat the Zarf startup routines. -> -> The fix is simple: just wait for the cluster to finish starting & try again. +In a couple seconds the cluster will have loaded your package.   - ## Space marine the demon invasion! -After the deploy has completed, a prompt would have displayed the new connect commands you can use to connect automatically bring up the game in your browser. Running the command `zarf connect games` should open your browser to `http://localhost:` and be greeted by a short catalog of games to play. - -If you're running in a vagrant virtual machine you might notice this command does not work, this is because the networking of the Vagrant vm clashes with the networking of the kubernetes cluster. In this case you will have to manually create a tunnel to the game. You can do that by running the following set of commands: - - `kubectl get pods -n default` - - This will return a pod starting with `game-#####-####`. Copy this name to be used in the next command. - - kubectl port-forward -n default --address 0.0.0.0 {COPIED_POD_NAME} 8000:8000 - - This will enable you to now go to `127.0.0.1:8000` on your host machine to play the games! - - -### It begins! - -Give the example a couple of seconds to "boot up". +After the deploy has completed, a prompt would have displayed the new connect commands you can use to connect automatically bring up the game in your browser. Running the command `zarf connect games` should open your browser to `http://localhost:` and be greeted by a short catalog of games to play. Run `zarf connect doom` to directly open the _**Doom**_ game. We use `zarf connect` here so we can connect to it in a browser without needing a Kubernetes Ingress Controller, which is a more advanced topic and has different configurations depending on which controller and which distribution of Kubernetes you are using. Once you see the ultra-iconic title screen, you're ready to go (save the world)! -  - -> _**Note**_ -> -> The images / steps described here are for Chrome but all major, modern browsers will have a similar security mechanism and associated workaround. +![game](img/game.png)   - ## Cleanup @@ -159,10 +153,10 @@ Once you've had your fun it's time to clean up. In this case, since the Zarf cluster was installed specifically (and _only_) to serve this example, clean up is really easy—you just tear down the entire cluster: ```sh -zarf destroy +kind delete cluster ``` -It only takes a couple moments for the _entire Zarf cluster_ to disappear—long-running system services and all—leaving your machine ready for the next adventure. +It only takes a couple moments for the _entire cluster_ to disappear—long-running system services and all—leaving your machine ready for the next adventure.   diff --git a/examples/game/add-logging.md b/examples/game/add-logging.md index 7bc850202e..fcaee1bae7 100644 --- a/examples/game/add-logging.md +++ b/examples/game/add-logging.md @@ -1,18 +1,13 @@ # Zarf Components - Add Logging -This example demonstrates using a [Zarf component](./components.md) to inject zero-config, centralized logging into your Zarf cluster. +This example demonstrates using a Zarf component to inject zero-config, centralized logging into your Zarf cluster. More specifically, you'll be adding a [Promtail / Loki / Grafana (PLG)](https://github.com/grafana/loki) stack to the example game cluster by installing Zarf's "logging" component.   - ## The Flow -
    -asciicast - - Here's what you'll do in this example: 1. [Get ready](#get-ready) @@ -32,27 +27,18 @@ Here's what you'll do in this example: ## Get ready - -asciicast - - This scenario builds upon the previous one, so: -1. Run through the [Zarf game example](./README.md) again but _**don't** do the cleanup step_ — you're setup correctly once you can pull the game up in your browser. +1. Run through the [Zarf game example](./README.md) but stop when you're told to run `zarf init` -1. Take a deep breath—because it's good for your body—and read on! +1. Take a deep breath—because it's good for your body—and read on!     - ## Install the logging component - -asciicast - - Installing a Zarf component is _really_ easy—you just have to let `zarf init` know that you want use it. That's it! Exactly like when you first created the game example cluster, you _move into the directory holding your init package_ and run: @@ -66,17 +52,12 @@ You can answer the follow-on prompts in almost the exact same way as during your Give it some time for the new logging pods to come up and you're ready to go! - > _**Note**_ - > - > You can install components as part of new cluster installs too (obviously)—there's no need to update afterward if you already know you need a component. - > _**Note**_ > > Zarf supports non-interactive installs too! See `zarf init --help` for how to make that work.   - ## Note the credentials Go back to your terminal and review the `zarf init` command output—the very last thing printed should be a set of credentials Zarf has generated for you. @@ -85,29 +66,22 @@ Pay attention to these because you're going to need them to log into your shiny, The line you want will look something like this: -```sh -WARN[0026] Credentials stored in ~/.git-credentials Gitea Username (if installed)=zarf-git-user Grafana Username=zarf-admin Password (all)="AbCDe0fGH12IJklMnOPQRSt~uVWx" -``` +![logging-creds](./img/logging-creds.png) -Pull out the `Grafana Username` and `Password (all)` values & save them for later. +The ones under "Logging" are what you'll need.   ## Check the logs - -asciicast - - We've only _just_ installed the logging utilities so we (likely) haven't had time to record anything interesting. Since log aggregation & monitoring aren't worth much without something to collect, let's get some data in there.   - ### Generate some traffic -Pull up the game in your brower—_[instructions here](./README.md#space-marine-the-demon-invasion), in case you forgot how_—and then reload the browser window a few times. +Deploy the Game example again, then pull up the game in your brower—_[instructions here](./README.md#space-marine-the-demon-invasion), in case you forgot how_—and then reload the browser window a few times. Doing that sends a bunch of HTTP traffic into the cluster & should give you something worth looking at in Grafana. @@ -116,19 +90,15 @@ Doing that sends a bunch of HTTP traffic into the cluster & should give you some ### Get into Grafana - -dosbox - - Now that you've got some logs worth looking at, you're ready to log into your brand new Grafana instance. -Get started by navigating your browser to: `https://localhost/monitor/explore`. +Get started by opening Grafana using `zarf connect logging` You'll be redirected the `/login` page where you have to sign in with the Grafana credentials you saved [in a previous step](#note-the-credentials). -Once you've successfully logged in you will be redirected back to: +Once you've successfully logged in go to: -1. the `monitor/explore` page, where +1. The "Explore" page (Button on the left that looks like a compass) 1. you can select `Loki` in the dropdown, and then @@ -141,16 +111,12 @@ Submit that query and you'll get back a dump of all the game pod logs that Loki ## Cleanup - -asciicast - - Once you've had your fun it's time to clean up. In this case, since the Zarf cluster was installed specifically (and _only_) to serve this example, clean up is really easy—you just tear down the entire cluster: ```sh -zarf destroy --confirm +kind delete cluster ``` -It takes just a couple moments for the _entire Zarf cluster_ to disappear—long-running system services and all—leaving your machine squeaky clean. +It takes just a couple moments for the _entire cluster_ to disappear—long-running system services and all—leaving your machine squeaky clean. diff --git a/examples/game/img/game.png b/examples/game/img/game.png new file mode 100644 index 0000000000000000000000000000000000000000..19aa7039157dfc6c62fa716570fcc4a198a73e95 GIT binary patch literal 801399 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 |9@5oC$g|=fnfm`bA%O|YDPUyM@X`2 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

    Qt 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� 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 %vFS(Uc<<)1)hK3K)(nhCZ4YDc z+&a&nslEqmRI>aAy)WtgVdTssV&_MzG>hOR2tC$#354D6)Yn|}Ed1ODhf{bmzs(u5 zRNlQpzl5J4y_0c>p+BHmh8F%&%_rD2Z|Q7z7NjWC1o})kJ!D3_c|A;JMu2!izs6E> zishtpqTd=3#XYQ95WsD$A^2FMc+d+QM!nq)8cUv#&r9l^OQIhW6t-rAvIPMqS3P_ z7JAY>cJ^(4c%j7g7)?pe@nD%>a`)v^*6|a=q1-YRqk+4s$ZHR|eV=?gdqAx9H^-dc zY9d>>bhr}b_wcPxlS0YjV#dtG+4{&?t1Ojjv8`QYKFUT+vDs(~aasbubmaWQEc3yx zLmJg7(t!$Frbr;{E*OpU&J0AW_m9nKtIK~bRr-|=eeBrvPj>X?D^4+FAi(4^DR)6j zji$}>m2qWw+D~1OjagCq@@0ayn9FDS3(;w?UF1`t3Xh<)#QoK`Dc|&uliml!sh1kM zRx@}q-3MMHnP~l|%$eTnNA0&+{lyqiV$j!&6;MgKN@20!9YF2LmJsyuLPv_oOA8)0 zg1&hy6r9x$4Bqr_V{6Ca!4>NYhC_H?NFSpiMXJ8qV} zTQKsJZNH%eR(&l+NYX4;Gfw#Ch2i8@P7L@o>-q@VVcXo9`11@iR(1L=ecdox{v^;> z)3HIv#ev;|JZS1Pfjj6b05mF;D(%h^Ue-TZuq1zzNL0Kj>j~}L-**1UYV{SK_u}F zrPA+Fx0Zb;NZmf091Z*G*K=X38hHW-|ibuzd zQYZMViwD){@K{HjdrpfiM4Izs8*AlKmRuIt*Aw1|T~Y z&W^R^;9q`1g07%34#}x627`(usIx={QEo+=>%6&_bIC@y&|(MH{HHhfh9d?vSja0b zkSY-l$$)~@^>7}zMOKM)j)NpyXP-m;`frdX9f1f(AW%?9{sFfCAy)s91V)O52;UIm zcc_H#$sW%=NoDd|@qX9R(gF)FAzwTr1$X2E3xDL%zh&WJkFYb{rA%Y2d3rWx^_EL~ zv9Ix4U)9i5gqsXz-py`QZIc^r!F4<+OKcV+_`hVnfu+}o!|V^ zt%6w3dG^_7@3q%j$Nv|pZV|eE7W!G-CdOra)-Q1~H0O zXBy!5-f9aU4isJqMsM)ibUiTfEK?_#d~v_o(P!Qs*KYfoEAr!W&6*`>XU-LJ@Q16%(p}rT%QVc#GGu#$pqzor4J_JyX6cNCM773T znJ*g! z!O= zUym`04V@R9D;bvhzqJVfhL-2{5C*o4{L5V^KwT~>sc`H3ZW%=kx-^oAhFD%pr|ab2 zj%9psL3R`zx5rEy%-S!0<#WzGz630kMA+nRn#I3Jjjz9X!Da#~7q4#umi3I}?g=f& z&9hAmIZLNfN7G#JkJ>8XTU9R5-V)8(!YO%QVrIjr=fXn&tBY;Q$o<%qQYQku!fZLQ zrRMug(qKi4N3zvJy@&3=<4rg?pF`lrf6@*K0JH^>n{Z2Tj}4QE_v54vqyQi*&w|UN zkwJ4~Ws$F&5~K2P?!Yu~;79ZzwXbw`TE@a`3V)cp_7|OxAPNk2Gw+wdl((J7CQ1|vfLey_bm1tW5`k9W-a-6QpkNfJRL!%l+RZ1`S7#jN zp!7EMMAX%DDN$|Bm7k%UK?4(g=*0LAV$yVihoct|k!G_Jl3@2+XG-B$Y2~#Wx_i=M za=Q5#bZFt!V383CDxw6mvYGvMHg|`Nj&N}Pmd%A%4i!%T`fU^XJO;8hWDB3xpR)zM zjNMCyHT;QY$m7)%Q0Si`SaoO7sUwbbtG!vkyE!sko~BFy1yO(mLavu#j9^jgNiq-9 zs5v0BI}~OVGUcC~%nj-b=Oy&-2FF7lJc)cLH_P~6R*l1lY3ZBJ^TAwz74ry0Fei{v z^!LVW4raj&!+)z+kn^j6wc*lg!r z$QalZQyLu6 zNhWjnM`qkPdNV?IJK;lZQzkli961)h6dS@@V_^SYpuB==540>%I^y^nmn5`6UY3L9hkBv0 z{$368)c!lF!S@4EO@K`vj{45X`*AXU@4bT!X4b33GA?A6RW?CoM%`_D9W=%-1pa$< z|5H|1Z)Uv{y9G=wAiEiknWUdCynTRTZW4`nXQtw?Ep%iKtENePKw;PyqB_g+&tFn5AC2L1&jp4l?DQ zY##ndCVQ#iFGE>$_|2Kme8FMru?s8FexYq~SI?Q3kk+I444XH2uza~TW7GS0qz8@k zD)xAG9lS5ff!gr4vD`J%ah6boTdhZJr88CeiHX)E)JCd^`OcRN<_pMU_V_%air#5I zDO)xc96BlE>b2{O-Ib0FnzQ$at#Q!-{ROa*w*H(5U=XM@n=VrsxLtr>A5WEqpg&a;(KWpQF}e8gke&YShJHORZ7FzPu=#&Y3n^qQF&j zlN=vs!eEP?GuhhRjV+V%JxEAMKsTX(liJH*H|e`KgI-$z8`0X?Mzi}##dAW!7p8&}&PBw~Y4_7E_XBMLEk-+Ci#9Yh zZrg0d9>^%*y;5=wsjt-L^^FBp(I*pyS#Jtv+A{AO2F?zD=r3nQxx`E3M^hG3?Mf2DJ)H`ehQ{`< zYgdoOH*m(&POH53{ay5?2uAt_#9vS5mNCN2?r+PwRaUzWRrmO7pkgsqWGdMu_?B6~ zz|G_4c*B!uljCrF?Ka(!+QH(j#BUlNdnicp((xEIzx5h>qIN2+4RPVDDLGgrBrMxiW#PnZ9 z2*%sP1UOQ7a^p%`LB3|=L2l?~(s9z=7d;s^|5%ro_VlV$ctXz<|9#yWN2&3muc8cJ zhGtv)J4Mmby0S83++$*lWIfbxu{ITUdXC0+4}aMR=4QZ2<)8Sv73LWORn6L?cu4Kv zp?4@uve{A|?zx%N8>V4JNaHam089bsT(ex*2snQlAM{V%fX>AG`YT~fYF`}!UF47E zw430)OaQmFL~z?gp9gxGHh>%)qV<7uh=pGeKv7rzqLeeXx}h{_&dQ0`xx;TE3SRH} zbc{puoX@wrHn3bdr;ve7O*Rxh)^Mb5&$&V#3xJ;H8}1=<`k_FaQh{Dzk$$wW+6ZaQ zpIm-f5tLva2+|!21Droci1GYq_-$KIM8JbCnC~M@(JW6Y?AB^>`}p{HN&x}O&l1axt*~PV+W#23iVHkahj5L1#qZ~3 z+|Jc7bxfneHfP%vNs5aa^r7Q3g5zc^Ismx1i`Rn!#1;`Dw=ux$scfEsiDm%1`|-rQ zoAl9N7_Co82|+}~Ara;Je=ec`pi%@xMom)-TE>0fo7dY)qY0RNJezcjEuK%(qJuuY z2N=RYA#@A1c=NBu63nbSyz_C0`c>~Y51vA`69ZcUxD2SX^+mE;_cV#GYn#%% zk4Rdyhjxj|*xgpnei`m7v05}~d+@fIuxt2>)G6`pbU!)ge=9HCNz`%kW(9h&>U|e{ zT)wfzQ+q!3gD97k1aIdN6}AzX9l#g{THI(~m2Q5g0ksmosJ1wL)m&Ssos#!4pQKHZNqyYlf_FbB6h;+Kj>R|GxQ3q*x>XdrVB{P{b9Z)SeA+rnl`S5+$JP07@F#^=~>*yVw@o9T&Z()Hz=_l9CW3DL?&!;(m`^ya6eLC6NM^8s+-+tkygX z!)8M_d=kj$uqNq$x#vi;ynxYI77v|yuC6dQL+?$IQFF6wu88mnp1Ji4RFDNJ12~E# zCeq0@=9lO~Ep&qZ`dKT&yCXT*9s52#HB}VYGM{tm>E-=Yr#Hnff34SS$8|ZMwe{{1 z`dTZ2F(VTB;{(o#CpU6LR`zKSCTtG8#9ji$3l1J1-V?$?rEEJz9`UW9T&>X$7#9uE z6q%fm+r5zCDGm*CvfFcN7dj}RzfK@?RcN&Qg_&%ep38~%L-0w8!d@$mf^9d8pg1=> z_xiwXO0Ab$A&E2cA48J3!2f$m{D=Ag{*TaHKlwMHcx=LD?EmEf*K`5GB$f)>TLlfr zTCtKo_ca9Kg+)nUy|Z{tydS_pHBiOCfER!Wkl?jHFi~7uTJ7`SV*Qa@yji53xv_6MJI;_^yy3KebHj5e5e*s|A*JXao*JHm4J-1 z+9lb{4MgP{IvPsv7Zw)&lzn-wL~tefo}TryJ-=N4oovvBP21#|Jjj@QeQy2CS6to3 z$1%@@Ps=@hbLX*Gxy@DLx4~M}g1}Ci(7=jS_nMV{Z|{w>wtvuD)7<^0+ASTOnIi#Oi8haU}+$!c&;dX ze$YkZCT%~%T$ze&L8K=CC$sih(q#e5u0is2>8hf1L12K8&@98r7GKhhgM<0Yqn^BF z0Ytjx+O0QtIHN0rWL~Vsm-zqfOPt%-Ra%`+;JKV_(fSu*@+m7roAOT0#1p5T@$VAXK!({ zCy)v(+*frA?>K6DO?9oD7=HLs1F`CAXsEDPSQR<4%oft{(N_ab(O%_@H(x$y7PR>W z5EG{R&rf4R-BptISEjp~m7y9>+X))-2zy-XT)$j7>AMw$?J2=1BoGqZUN@O=Y&~a_ z06(O$XTIJ`Jrtrg=X&O*Wde3#b0u8hn&;M^wQor4s)P}>l0eTFUoYuzp|c4LTVK$d zZ?{x9SL^ZNvtz0YUK3y2Q_*+Qw{GgPOW9V}&NU~_TI@2@-h)m%t+p>=6F0KS{=N}Q z{LFymN8J_kVK1Iup&hK--&C7<<9woBT*(33^=N@ESK02FmQA-3lB`a??}RQnF1jHe zNW~V3B~PsONS#(1DsmdDwDz9kja5BlvqGTmN538_m0j2N>s-Yr7gQA`oMuMx_sJZ_ zMjoU3290H5$kt5NiqS4{flz7X1&=u5Jnch04YIwAkCyAVlogrZQ~o5GuU<{sy4}c& zHQ7q0@qr6GliO4BHc$IjJTOU0%-;QnX^$-C7BD;O78Hs0hRmgiRZCrQMRa=xz+6C4 z4IqAg>8Wh{=u>{;Dv6t~d-S+FBxVt(2c`Mq(sl26QhO^r+l+VLxb&{6^hSarAVj;{ zC-c-rcLRW%2I-lavW-*`K=Kuf{3yD-dy!GSF==6x13# zM{=~YYcTIPZA=*@n>0BVBiF<*CzKL|pc-@iUfKR7Kcv52S3C+x*fJCVv$&WyK$Z-$ zRGR7xombMKrmsedx&{eu=L5D$=8nNy-O0jgJ&)joiGgw+ngcwXCqRJ%XMxpAy6j2t z02F%(0S?nC#Qf$biVg_$p0zE_xfso?pGQQ(h{nXmGXkYo(!c*sfdljnCA)4-7|sMb zc$^GW@b|pCaS6fi@M)}Z`jhWq6iTXL?eZAiIS+qex`k8T3tc`uPgVoX9Qb7kriP@s zP)}d-WPYTaqA>s1dp8UjnXeRdzJ{mbsl2EUCNQ5dPKj{c{T0~n-0zxiZGK6;Zii{p zwBlM3U130K?eNJ3RH^)4IkvG7|X!sm~X#v`1wEAPb`r+3ltQlvU zRY-?FecVXQ6-3`&*S{r`+LvuYGKP9M_)&ubo<;SYPcBBkO-{nS4RVW8%>nNWFhC)~ z>qpSkpD4yhCt@H%dJ!5dkM#?v+fTfvFETktU{GhLh&+tMoBZ1p3o$Wx$y1h5*<3aZ zK-9AW%Lim;0_|!9Uq^&U=$NX$b12JqrzL1kigMuR1^A~mtTws4!p_4= zYsRw`!hHhFsV>3cbB%WAD}cKY>!37N*6zwLJZoIG3y0DQ;4_=%*xH-trNTrA!)j+b z5lzgm&IWLcukkoJEV1BI@s`PH2NP|Um5xlMEdr< z)c--O)$f#pR+R(F0}lOp=mi2!1miYX9ABt?<$7=!X^<&t6=tp(S?VRvs4QdcVS)@E zPY4JNg=-3M#O~aeL)E=|*akg5#nqTd?4{O4%t}Pw&eeZ&0|7;77malO< zA11Bw%d0430$=MDl4W{8oVpp;)#iUy(9B(SFP+vkDC55_Jf_$02K8`Ch{kM?p zuQ)5$8IHUtMZITVCG0+1d;&V7qO&Ig5uvz$i$L7Z*#C{ZKIfeW6ltv@l4p9}O@LJn zztPRXRb3K?F>y*QygKEM>NnYbX-;8j_>5@Dz?IuPj=y~w+Pq}&Of`2SEi3M-U6+`n z7!?01XU!8#gL$r^x^co*FQVnXiY%IN-||KQx~Px^=|e0JtE)pvKf4oTy{O z%_ky6oFCps9%m3w2-|@lo)8OBCO(#VydYS8 zWVJCJcrEH?06Q2MN*UEQQ#(}In9U$$7{Q6%7P=+xycXz-W>xZEtbUN2*e%e7a>ShN zPA-D;Rrr5#z5;AV_CJ250|u)u;Op+^#C}y_&EMZ@;W=u}s?(5HGMojs+024lZU?E4 zXym3-#Y+QN$AJj4^%)ZC7_$lL+59Eu9l}G2!Qi(MxUOn>iKBTb zr^ZpY%nXY|Y_3>nDCOmqjoUmqZ{5x3-XgVF(2+GGnBNt`d4UXhkaqd|66thEqCquE z4RNB{AqV~RO-&w0?Bh6ru+#orDgXzVzMxNeXb-9)>pLx?W{TbXz$!+(_YlAY9{(6c zL(+uK{>ml!-9HELOeYJ7ou8T6jO15I`B74gkmEf(z7khE^RKNw%v+!Q;KI7h`rljN z|Bo#I2|m&3Ms|I@&>*p^D;jzh#Fb)VZSFeAEp!=|_v1b#Dqvlar5@agPs_EObJvjdFDYYnVR%y)%X%r5pC$HM+W z?>T2C0%4^}2sV)Jq%aEJs-RaBGhND*btF>mf8$KQ?`0ygf-$}|{%kvo3w@t4j?mkntc5Mw4VMCm^#BcH zLc0X?ht=BAr^EweEcnqL8XHl#!>^hSK{x_+kixe5>G(6dJ`WrWPjGj0Gi|&Ks*IYG z+{@NDckUl3{U|f$^d2c4iJ}_*Ngc){o61JWU>y`61^_&hva5@;spiOnsrz*vez!+t zpc8jR9RGfDY=8$kZ{_K}En^l-%eat!As&1|Ca-S(G3g`wzPASC^OFaI(x;`sj8r~G znX_8Hc=IiARRT;q_7T!tu0mbtI2?ROe*V6D$G!_dYvuOK)o_BZ>y7Smw=uJSc2!lk z7g?3e>Fl zB||q7B}1oEsZcG}bx_{JAOLQkm(Gh(<_HOMKtNrjHp%8!h!8Q24>#3vX-w0vR%ON9 zI>WS#Zh1xNa!0;*xsZnsim&rpv!$#xtC(M!Zy;T=OW8Wed~Tr#BFO_d zIleoLpwryJ90y#}NIv^yw0WHmC5FMOocOEHi;KYH2sz(W#}Strai3 z)xC6#^Cql+PwG+bl|=(=zr}pP^1^y+J_?)bAxqqS0~E0`v%P+PGmPeubYQ{cwueb{ zNs&9=U%kh*oaWAxGaX4cTc%vTa&{JLXlUGSC4E-59WaL>IdWW<)py>G$#oSO zt6o`J_?Bg_;Qpb&e(`+a^{^EZ-aSk~Qp%M(ZVPdH0zz%{n<4M)Y{&4E@{0n#KB93b ziK;$P4%^QGvS;s+%Ylo_ezcEOkk5#6~f67@QZB)owI&~rjn#%#$_AR4`(};i|<6T zne2Y1zacYG;Mf8_DBgqfhiWg0HZ(Q)#qw+{6X--A_sGvjo4}~H`kWAWb`9Mm$BYpw zEUJ>_7TYc(LX*umJ59FMI;$Evhv6Ki z;Kiob0t z9PV;e%az;X{ux_S3~M1Hxmd#7X#C3_$ddZ7tB}zeVqHsGj)&o2!JBY>`sh2V@Kv7N z?s`zqDI8gz*{<~e(vA+|c4>atg)0K`u4QLpPk74t^-4FPLeA%+u<8wIc52xNW{ zqWQ-gngjIUed$pP#j3P8MM#^;4+#(v&-o=T?KyCtXX00L&nv~3>En%AZ{=Te;vdh8e7x^J7KXc0H!G&= zw}t>c8qbqjfjp?%y$9@IXdnq^*_(o{|DL8?E_i<+Dn!ad!`lsj%J9eART{u~-0R|q zn7X1Qa7|^o0q~J4u>d8t!L%C|lXNC#OM2$|q{%b~ z6Ug1F9%sRtrWU?(0tD3o+dkU`o^ZLtWt0CoJINE7@Jd!q6Js;mlU)A@(A*z`Ivu6c zOrDfKIvJ@VvO<&oAAV#Khq3+yq}9|2*#j8s!ED*@kKg*o_VRt$rFkzd)nI1c?ZkcC z16=(R*$66@2`lwa9S>McUqM)vHnMf_=W5WQ)3RW)G`k5b%gGdQ?OE)i7ce6aw*s)> zk9_&(;Uq=kg-i;*|5(HX?dgD29{)<2ad_W-m^lK$b^qNx#A<{fBq_Y&cS)vsm&yfr z(Y)a->Lon=DeSjD!MB`Q;@5mh2VIxs;qO}oe7f)LVbiBO-jmo8|MUx~?#l}V6tI$j zeX!<7tP(=(GG!@YjmQcAZ-%v1#k5IUS%qCUO!}X6-Hrr|$N{>`|5_VYNX++!v$K`+ z*V29<0p`+!{}lrm?I1hN1*V&B0DP4JB~X|x`ojeVFhO8|vI=oIL;UFdKVTMr$&o+S zo8o^VBWMb2@C8#&fiH3jjG=%Jk8?gn5dagAZ^zI)zef}5bd}bJLyZ5^z8xgb>r03g z!FR(|+P~_jAkTn0HKnJoY*dj!C``{mJ}Dll-lIQU4#*OE;gMs`3p9MlTP*OO6Yyp5 zHu{UEv29ZHJ!&aAQh!F{0Qq&tF02!xJvj9M0Kf1$RNys z6O{t3)IUSHU}pOk;m>!wJcC0512_cZN$y+Gx$%-y8i1XsX$wkCtU|^;@fwaN`faY# zKL*)9>w}Op2I1S%)B0f7ll#lXR>~Zv+G7?TCQEoC5{jpEOy)!B4TJ|Ix17tSVf$_` z`5Y?}Y-IWTj8$g9sQB*DAQGYFzP+tEHzvw9;~P!XS&nKmg+CBaAtMQx47yZ(R8YHf z--%Z8qOJaFIvXly3BA_`rbi)~R=kqAVI`$r1ra(rUvUT9`Quq9gMHp&)I$~ZGr8RSbkyf1e#v{lgj=0d?7iJb#@jgCvJaysP=;% zf&~VbL)8KHC69XgVr6Oz?X&0(W)cgPuhEQf_Q|r>^{5s5EN@QE1b-CS(%?U~Iio|? zQ<}=N(fTVJK0=~KJ_|`Aff4bAUKy{9J)wch7@xeZRck{CZ0gYdi%;z>}r-=sK^jF^U&Q~_a zO}ILm476(d@&*leY_523wFtWB`+n)89y}dsTRpwr#Qv1iTD@fOCMU1)^->jB8Pp>0 zMEJ!-y090Xa2wDX7{}Vtt;TZ$&P40lc`IPy^P=8PZw0Q}CIzh^(lDUzDMg0}JmYCL zr@}r?YM88$PYLy`w)gLxKToGHukrSbqmRpqF}Y7V8tXYWkTV!#h#A@Znz{MTNzx*# z#AETDz8u$a-}Ut4fnjd;c3vD?O-pS13pOyGAdpl|ScMAzGI$6zU9b0=%-rg?SAafs z*+i`|dfpK4^g_ad@TkbFLo)*}W?XtWWA&EmaMPhGFbr~A?$)lf#!UBDuFtvz47lFX zCL0@eWu03dTAtlZm`Cl+k#-Oti;3u)ULT;IeqyZvI^sd2FlkS&CK?{+P@_7T?xnYS zWPE42gKszt^Er?^V1gsBjA$9o)U&3MY9APJU6Ggm1Ez%gz)+Qkt`Q#$x^(A+&}2sG zf{QzEL`G}aKL2zYHyfVM-q=+7oa-Aj#GYx5rNXm8a%r~V4YyP4hUB`BwIjSN*xm>o zkq$2GQ1ZE^Zrdde8m#?&sY~LxeHX-kEh>{|H=<`&<&_EtCI4Tw>`88h)#4Q>ebFKQ zi-?9xCHYjkjC9>WdKft)L2G*UluQ$hv%1-dw`9XHd7xCye)EVO&j*0-^=?_xDyT5z zQeXBT)luyX5xeUZ<|Q7I-OcA66&*|YUf(2boU5cYF`T6i`~`)6@1RiXPe>x^8YjWv zsGy&JCPbB_m-LldRVj|^rXt+Jf|^AT2S9rS5E%D?%EISEHVJH~M4SELogX)NBnv9t zpO-T)p4LYIO%Ome!Lfs|HNV$c+eQg;V^HSVM#HK!!{~&OmnEW2CBLYb*ekT+?J&6y zt{V%#g-i&~eVJXv?=zzHLC@E(Jfge?LrgiY$}`(nf3iiv_D519J*G*&&xW$>X@+G& zCSN>s*9!`gXVc>OUTB?`>NeDmvt&oUM&YSp7JJSkZy_ZPBr3|uvh+n2>ik@;PwpM# z8}=ueJAz7e^EBgVbVUjHJDrVD20$lhNjtVCv0 zlE91iJVjs@maE|zBkVcM#r5WWFC zRjvu9ZGAUzwR3uD`ojxA?b)ply^Vo}H6*X>lS;_z$Th>D$ryhIC1Jr>SjW%Edw^z4 z3Fb;b7UC#*H5oo^k=uA<4#2#mQC(@eR;ff|fk2qz7Qex*f`sb_brv~dDXtr#V=xx0 z7LkCrTKwauSzi$bY_n@6)!Wb4Ug^RLb%Cx$DAK%Ix#(+k)q3=o=hXM{6PEHLc1g7ekV;}Cr_}c$W>tswZi{vxT)_qQR1O5aKGf`ApbA5ZHwFZARpjyb_B6l$ zsawZ(z{{K#6`#*WKs3)_BQYq2WGVI9Pi_nD1Sl?v;!x|n0(@6k?c}kP;5$wwMJ3Do zd`t|$G_V_7V!nra74P4}{n6q7Rk+9Ay(FR`7kk(C?iDkK*Um~H6>3LXebo*-q1Eer zMahmj68J+AQ%a=W0@3$~>^t583LF-T2L>1ARtlufq7<5raS-_1qs)H_bN~m}Ws8;8 z&};>2CCR!irzkn5SFk@=ZjOB8Ry@u(XKF+>zf9)MPit&D73)x=59vu{U3=}3*R`A) z`IJAufx7tYjctuF#4L2(=8O=?6R@`O$l5}wx9zf~gudRqWJuriJ&09nmCcPAVO-^$ z38td(orvKEQqumFUYp$Ew}x;Rl=fW+6a)bY=y;28p@D6xa>(EONCB8j40ecJFaDiS zmUEXYE;d??<2mNZXu6t->Dk|qO3Bis;6srgi(o;Tmt)nVjx!uJt-$*DK4lqyWf19h zYMl7xZQYROg#YMwE+;yzUw5wLyraelD6)i(^#*LGblF{3j{cR=p;)CPKnm7Cl7^2? zq!2P9__#xzWE_o^req`K5esG4y8#QFGPW?POHZ=dt~)N3v$~U3t7=YTw#<9$(RVzZ zF8q|tdx=uRLEF_w!au4HFmUm!T!a5oEVL=?U4Olc9q?{Fer)f5B#Q#>7tV-$BHcbD zB(R}W7zhVnjd?l);X8pK{c{Zt3|~O@844PprTK!C{0D>2Tk-S|ZKtNZANDhWDT>sj z)QXMkFN+2Va++`_h6g>{hQ+_g74|=Jg@Bai?R}&b^_~z|Ok`x)+>Y5XqI)Pal1rfe9ZCVb>J$T<{n0F03m z{4t2*@-`hsH`4zMVFc$+Uo@?^)CSy({$@U4qZKN5i{ypnt5ed1%Bn31Ge*Zcp|lz6 zEQZRSY?Qe!TmETQeGV^OXXWbDA0$DbBn#jF3&{ckI#=Z*5b+<{y}HbFhaE`0>4qNU zOwtV)#MZ8wd7b@x6m$NFVzO=suy!pf!~*a1PW@QhR8{;yvM>ScXN(?0GKPv{_CGHf zL+osZh+;N*YDHRXQzCM;9P#elmQr=DJZL%J&w2uL{b`=77#lmn_)isd?7DfJLkDQO z>o>y{j`X*uIcQr6!pF|MsJCSS%+5#9U?I#-Dtg*F2w){h$jH1vbEdrNtEdI?$b9~O{Rs} zKj)q-5B;k;`JS#ZpLUEfTD>G@&*Aqm80>UEto`3%zMZnS9fD6$49)pyk&I^bmq<@Zxum0P#V$^LDw8UOVw^^{VB{px?T z-h;E_U#T?yUk+|C4mV7MJ8S#wW)kDo&k#7{du*|iWt+s7^M&QfGBc;E>{Ca~T}mIf ze5+iKs!BIO%$2U|6Ils-Og9Eq!Wq1C&fb$q4$q)rdv!1n7yJT|HIeSSoAc?{1_d&S znMbnQt}~%r7PfI%qG(6xpM_M1mSIJCq4w#Q%^NEJ3Rn*yXUz3&e zCchq$fckpR%2jaRnV%5GfZvSE9kUSwx2-*a_KEm_t!1J9-|YVMQ@>?8bh|4nt$*{@_DWf3pN=Z#uVKbD1) z6?~Evj%>BEJEkiFT}E9rou^wM-3X;LVRIC1G*7&~_A;O)hj0{6$U8ozUPiD9|3&7_ zof|}^r%C2#N&Cd8=f8Ow#H+5`~}ls&J}sa4Lc&@KIQh4+peRNrDRUv52;f7~r1Hno6S zU|+Q2*nVXxC-R4i+h5xjdYI+RcG{IG2ri}1w^FXQiVr{*D4oYC#P3wlXbiZ zD?>L+_Yb+5t=&qp(V6eKGJy?a`6@Y)oK;qVp8Dli_3}NEA+~@OUq-=U5vY#FHD0WH zK=e+@-(~Lm$X|H3~qp8<)tIB?U4r; z!a`-vJDB+wUH{q&xh0PgrrsH|yFjV6zVDdt#6c=QZC8=TNQSEOuZ@Q>1 z)JgZMB_4haqZ@4g@u{o9i5UmE#-8bS>O5lyhhnXaR!CWQgoe)^k`e!v{$(w4;;Aa_ zf`e`wT-`Qqp)LwR8t)&Kl0VV+h)uZX&GbDtDP?+5l6JOq`0A1L13ycVf`MKK9pjz9nnNO@7I`8?JmMN|? z{KvxZbql3X0n|X@^1riG>HbDZ<}G5RH~_M7`QoBiFg!3s_b7!geqbSzw#q;_HR3Z9fZK%KF!?D_!|mSBlNanRwHhhd`^T{x?0 zm7UpL>#*>ZW}C&?$ZXLhxPFdsdYC~x1h>z~z`A1@P5i(o8R~Kr%G z9sg|uBH;jio^~$m&F!M+|M>m`8RCNua&wW$X7>gpt;^t|gd{G+f3=FVyKBafxi^Ny z>vPx8yEHkC))JtG9Ky<@ARfn^Q5`Xh8$43>>if1(o_0*8weEeZjR$uA@dw*459xNi zR10`^$Dmt}(Ab#Ky->up(CaSThFmn~8P%grexW(I(|&;2i#|H)!wQ;7Vr*f4LZ&IMfZDfjU|dEU zyRk6st?imnuwIKW!*~#72`6sYyTb~4tKy>mEuWd|uH`w%9uO>@o9NCHOlUAi@X#~e*}aGyal zK|mqh?vJ(txzGb-nzG<;48YFza0`@*;0y2cw{$sn&R`r>`CtKjvSJvc|4Nre|E_eY zKNEWfI`M(DAh^-x<87Nseyho$9;V9GYaOR z0f#-ojdjmnON!{HdnF#{PX>j^8y}k+#8ej5b9`qqjvCSzsWm2<;3UC724iDp^p;zd zpKHg08_+@k_ud9u5MQkCK=&>9vmfdCB=@{nl8yM^lBc^uQp6^Yuv!AJBrGxRe4M6X*trP%F=CZk4`*C zZibl%!oo?zZ*Q5d-;Z+i;ri#ynQ5X8AEgLDJa@P83a&F8S9s}!S|=2M`fK;&yqtd4 z@eOhM0*@nb)=Ve+9EccHB1!!tBd|b5(E5=PGX7l|VU-<$27d%GXsh8wmdVoHl|=zE zjamfsJK&1>F-?Blnw^=4by(oaxQ(-uhJG!uon!Sa$l$IfeqY17acvVb zzw>Xk%m!Fcn>0d?4c3TsKt6iO?XDMXybLZuZa;u?pEtSYu9WO)_aaTfa%B18+usBr z$dFm8;o;?XHO&`kLapm`l|*$U#+e)&Vfbol$jtN(hoSNRMcx=-CdxDZfCINX_vwE= zmC3Z0u?+!v-2O0UM8q2k_#w>~be2$q(zXZyP;Fq!0oQX;0075c)tcD+1A!Db{@!cw zMjr-g{|o~l1ShqVdn)XFywNXEt}gW(uVmln7w4PF8g4)-3ClR6*>(5LyMQesG_SY?R@G{M|_Iw?U%no7x7yELI`frEN+9IW>frRlSisQE(Bt_-9 z_u^$!(D=^&C^gjk|x zPJkcw*T{fE%kf`x81CMzk?>urP^}GN?-3tqh?X$iESo^jW9Re4`b5>m8qUn{*fTOQ z6)%n4U-epTIqzmdGu$Fbf3hDgt1+r=94UjlMFNNH=_dk6s;;lwRICWaH?-_dhQ+9h zcA<2fXeSTu=aZW7JX<3l&y~3T9HU)m2E*)-%NpzA7hlro8=UEo=4L3&H5XUZ>gE>) zHBHnv&ei)b+65L?&VJ<*796|1X}48}zx|cky>q#CKC`!!*>;^A3v^M{Cmegn6gEFM z`8jC}$=25olJoMehI;bEl@uPv>Uu9M@PO8JXlpfi%YRNH4DU?uZlBwBo`Zw0(}e<6@1mKby$M;dgJ=F^TvBgh3x87c#k7MKaS?s+WP%(udzL^l-Ih6 z)s2^Ycc6VYQ)cSM`n_c1)~i)f2MJ|vv%Nr8H`4P*jh&fl59f{y;n@4ecivO%v6BY3 zOkWt0RcLnATIYC~>KQBkv7^A&?o?VvlhOMFaEmooWP>=e_D*%*-)r=}&vwffEpw{7 zCK6K%hUcGITgx~Fm>L;%UypV_OztWk6Vlz1{ zKR*05hjxINlY6(&z}0}(cdi#3qkB2Fn>l!Bd0aH}Ei%SenI5_Vao}c+tB?b=)w* zdq|1QR@%N6zUe|Q=M;CfR@_a6Ps8X~5b#gugf^-ls(Y8tc2%Aw$B;%FSG-$U6HBN2 zJ*UeGF8PdMNv9LY{JwVDWacaa_q2wden1IzYU-@}=uYaPP7Bg9r%X+6L27(pQYN~w zw$@_oaRKH`xd3T>Ib6zw?i$>c6xx4xw&<-aRW;VvqQCg}4EK|#4-%3IT7@^BtHm7^ z*FIZ*`R@L~UC$j04<{VEp5PiJV38%*E0r<1HQ~EO$GHI7Bx#)Mtzx)iWc=z}A}HSp z3pDPZ9?M-Jo-KJcP#8{SGq&j^J~h5;Y@;XUqxhhCMW!#ES#V+ljgk0K4cq}nunN)u zp%czxkw(5e^zRH)6DWY4wRvF1tf-=h2@t&mWA97w=^3|%bw{|yl$mDFjzFEp!qp0+is>aHkygxhW3TyI zF+Q(-CH0+pPtwD-^b!~?7f5WJhsFb0>m!wH?r#hIT#i;a2+(#DHdalEtu%!70?9x# zL<_RTQOBYh%}{8n6B&BsM-F$0`zeQSPmw{9TywBU6s#bdchVWh>fZ`6sz3CVGgc+d0+^?L<>085xi({%Ip~KF{W5O5 z;*m_SZ?ze`vMkn;sOZshX_{Y?ch$xV-G)@)`M2Ex?! z&pv+7HQ8bWqL*3+-GooWv?&kYzl=jhorv{{6$i5hY3<_!6BRl+HyiU{8Ap+8Z^NIc zimX`18O%)7!eL)1)6EP-LYK!m1>$$$7ms^=_1nRIv*W`k$Z9W@^CcXAjpbC6Cl&0r zboDQSiymyxeH&b|0`JF6ZCuqO_(y=yaF%d+QI}r~;cM^a%m)B?<8k~(}TLqM!^UxhC_$10FJ!PucQ-n$g@;qJPzLjsDr3t;^ME^Pc zVL_)IQJQrJ#UD|DOg(Ia2NjaD_K3qojU7o<6x(#co1JuHae@71qc5EC)ZhWlHdmF*v?>S0L^lK(v0fd`5Uh%N#Xzxuug- z(eKd1y6g&kON8kPD@!HgGqtqd`bhbRT9d#l1sU#I?YZARkkW0ZFIPTr4AC`56jn~a z1U-R}vXL9YVi52TQ3P>&Vt@8qk%ynOe;{H9Ig z&1jHacVeGp*IXLiB^v#V&lC!J(MG;?RUfwh+4%)zT(gA_4?E2}p7V4%`ki)ngRN7O z0t+1yu7F(;B=Qei(*Eq3e#?rl%>uV?-{tNwq=sv>GOh#Ohe@F?~C zE^KB7P;g*6mRj=XB+#d2TTvuca1x9k4`)=8gZ?Zf>L8nI_RC3Pf;RLX1Es!(IeLg{ zcX9g9G>2z0_ci#fP@ggiQ%k;vKTD}BwN@>-?`2a?7ZE+w#Gh6UVr|1qaquzd7}qKv8#!UWHg z0jT{s()==37wc#tP(y2>AU%-qoE28JAVqth&0s}L#1MaTO{g}MDFhtDKQ6svmO?!j zSn;;GK2uUAx>Dw*dvYp(kxsZTr;R-$J;Pa`w~@;xeE(jijO-@cs96#k&ASwP97sZwQ znIrgM1^N^=+fk;puCC5XdU>txzP+e=5^8k(k!CLA+%ML-jSB8cS9p-iZ<0nC9dp(m zPW2Qr)ay=$2Hrd^YA~RvXH@FuAfzO_SpXfkPQE(-5zAjqTf*3)#!n=)#eaPGo@_K$aSz-8Za7G6{_{y?QEk+PCzOtR ztZJ2(mb$8l-W!~J3o>fa^-5sgT3YJDV^nLaEw^%!EazK+U*nNVN|+!TfrlX38}Bs0_Rl}s1d_Giw; zst$LmoclJBI*sKt$3(2Oe3fil;4EiMXyU33(q<3Z5re7WbEkNb(;}aCi-@q`=YP3voKL0%C3g5x#dgFboKNW=9W$2z+!d3FK@Z;!dlGc z3vOo%Qds{}vvpF;TwD2yT&ITh>_m`M#z)^OqlcXrNzWB`VMjEk{Ys`6cm%47>g#7G zFfD@7o((arzfBW8ZoVE+{mNDACC-%RdN=M_)`Syqs;vhHkE3G;j6dE!xwk-L>?&S* zFH_bFwQfGTP2(;G)U`+tyR=dk(e*#AXWi?Tmur2k*-!_z8qY0HL(8w^w&g!iPf#bgQeJMNgZ`>b1~zn(E155Z|Yoa$J!Fr~SY{>{W!JV#$5 z74@YrNH*(E`~ITiFNa@IaXj*)!ltXJeY1n^2-$Wh-O2d0UIj(1B{UngT7v14q-87{ zHSRF?aNiGA{jGqw9Q?W0$sG@AXQ}rZ7Bb=nN}Bm)e9YMcPgzATVxe)8`)qU=n(;-o z&qb3AmH<3L`JVu6Vl@HM4KSI_6_^7~X+RcqEfkN@R03ZuTq8pnc#8YFLLqJOgB?qe zi{Gf2HfEfq7Q!2WCh^1%XW0fSD7`@&wS8x|;*^U(8 z+c6dN7IkXM6-f8T6>$IN63d_Lt=n7_kcgE;vRor2%e|*Lv*cT1d!HH%gY8o353aL9 z@mXu;(SW|{DPa9S*n7{gsIqNqxJ|7#DgrG?Mi9^@DT;uEQUO6hQQIbmRzO4~Cy`K! zA|M$QBpX0Qk|0q+DX~fv1cZ_-P?B>hLWOs(0`2b8H=Og``#$%3-sk>7(F%L7z19q4 zjyYz5_L)ekP|cb~(HJiP7i-qQ)SyB%5(()8q1fILa!&FOjCEbo#dONNs*VS!AqmLi zQ;Y=M#t7~t__*p}aKNug#V_(Mal^`CVL=#5n>q=aA$jl$REILBjRP6G?iRY?Xrk%e4v0appba>r~w?LH@sDP(`1LPv%qIz}15s*X8cEG_Z z-|P}y7v{QskB|hkvwdXEewePd{s)^B1wrPQt_3X^A}sYl6|Isz=x zT=Bm0yc`mf0&v|nGRH1rg(7oEg<7GD*;gja$L2R*feiFduA+K7CmAxsoYfRG9+Zl) z%wZsooc$a-*91ab@1Z`k3?gLLwp-z$WDZF!u(1UbAU-jkHf}a}h1y(k|I#J}z)1*3 zC=o*?VwnCsS?E?rZHqxCOA)rc(}2DOF4Jv`Jo{O8p!M8oIoj6sp$PKtE;ziXOVCHd zM&GUuOa(ffHtbpkQw8{ zhflVOaNfwhb?&D-Fd~3$pCJ3aJpUgaW;m;p*0lTwM&a3i!6*R8F|o#x^8PUUT$cB1 zYsmEB%t6_hjahIj{QUpV^1>pcy2UCt11eO1;&1+Cmrg?2b z?1@XJk@*CN8$r9I$KgCN^m?SD@c%|&0t^gtB;v?4h5->7*{g$sjR5*I2zURMA=3^= zYyoT`YAF!P9X4`Ihn<92D1tL?(eQc^lgR}}-(lCo(O;d7 zS$Z|2nKyj7pfh6*^#XaR2hJxqy0| zLv0XjRX~>+W}WesE1KRBANirc$_9j61Jxfs>bw?$;Ly#QdLU>03!V8aOiXKfOf$c; z-L%LLS&z@5xKIxyIt+y)Pv|=uJ*}aW%a2eF9gRl+EX{L@E!3;)@!JJq%R;RZ|_hu5^W#MsCygMq{PY&jMct3DmaR<5*JUvX2Q$Ge#88uOul zETYzK-lG7utjgs8!d#0GsCA@;7#HzjQ>ruZJr_a-yLers0v8SZQ&ph|@-fA=(dtpDU`MC{gn^x+>1R0jA` z6%_FDF1h8li#|tb_#kw+$v?<7ydIrhBIN0cinDzPaRQsOZAEUtyOxN*P+asFP?m=wN{?Z1;YWo~nLW z>}F1bjaDAA1CY&o0I}{Gd;nkrjEcd^Y(d8abc+9ICqiEt%Rwod?WR_bx!~-^i(X;V zUKFs5VX}WVQP7-Z;+XtlccWBaRe{v)R3rUjmO5iSg`a`g`(w=7Bala^PX8cgC3_$m zZ>iFO({gRd-`saO&TASDx1Z<&i#N#+1E}V>D*%xAcik(-F!?ach(>qAjDl4hAjuIO z^l99ZeuQ#?v$fQ_P!TC9(}1US65>Y81AL~3dFvzsK;OoOKHDr??jp_`Y?{W$S>>d; zrrvWTtHQ-xIAX;N+@yr;B3e?#VmrYMg#6^4q*#dAu-0q)0fS0ISzEPVG5F=U(v9Vd zHR{a1POn%oGbFa>R?`Wu=iM-y3#biM@iW7zkpF>#F3qpkYZ^GGc3IE1)znn^j>uNX zV9oareCSQNAXfrN*dDT)4x;VkDEh*w2L`fOW!=WUMgOWCo=|LC|2-!Zs4*u zrI>0N-RrcCq^Op8^8nV3`}STVRr_vUkN zKrE=(YpS=nCssRNj=fGefIc4AEjr{BQ`3HVm-)7vEt=B=>ixm82F2^ll`v%7Q#2{4 zs8e!bjMuA>zw(U%sQtb@!mh1v6hv>4EBhJy<9NbX3llB-;QRLj-@Y%Bca)Oo7`)#5 zs+-1lLcIv}hnD#EIi}tp<(HpW@l8){)R(jFE0+6w(kjdoTnMKw6U6A-Ph+MRfP5{S zz2R-Br*1>tTXRPqIk$16LKnf2+uWsb3vJd}zPf}LeU!zS96;y@RvFlSmvj@}OdLt?|D1?rHJY#&)5 zt1F0j#&z_|G0(DPsqSkE?=PZCuCNIk7rE!B@!b(-x-FU&fO3_;@VkF{1I|IYMK*Eq z6|*blb9TmnReijC6VrQ77RtNWdc(<)4KL^JS8sjp0Am5T)h|tV6V|0i8nzW_2Y4Q; zq_)dP^cAS?47IaZP6}h%?0DfwjhdL^V^umG2tuCC4(&aS;?-iqw|Ak}X zmd62!g-*>1a1cV4koBPeZ=EBrT4w!{?!n^KghZQA0VTxm&0T_?D|(gz&;2=U;_@|@ z;x_#NRVXuL=^yt<_v_^*6AMh}PJwC>LPRZEd zPhm=Ux4ca6*P0~g!qy&z0jnovBtF4Kfa-k0(WMl7mt!G0aiYivUltn?Ju4~isZYz)w>rBn>nf4B>?J30lX~dQCIO37I!lw zl=K=>FTF79FN`n-N`MPP@EUG;zAG6+>hNC=kcvN==>mcyXq{7m3@Ge~d49DS9Lqd% zET))hh9V$?bo!~>q3Dxl$Olr%YD|-VYU!n~5u7+p#u}sRbmT$#$zRGkK!=5)utnax z>{?L(izK2^;>vJ$A7F6pR_~b+keLc~9INh!D-&`UZ>z5aoqdA>5PBUU+OEP@8J zJR$mnrMirAS13{Cg5O->$svOZTv${9L{BZm&%k;K0yzdDVCBO+kBw)2GK}eBE#g0) zkHB~jlwD`>_vIi~BLi-@(o<+OEL?NRv1?b2;5#r~?IK>Ek4auQIxGx90?GwI>U$e} zXThJ5az>ot%pd}=H52P`slG?RTZb_sBG@7g0_$-(D)mWJ!yHpHCvuV=*K#YBU!0e> zlP)Ty9Ru}huFKHB$oG2&ctzImj5~$cS3+qLY}IfFEJZg&FqEOf%f9OOULsMN5ANoI zjx%kq7B!h7b7DMB&xg*Mwz$IvQG)gaMi?u=B5!F36Glgj7#nvuV~g3|m7F?Bu>(?y z(QnsPuB%@Q`LzP;Sr)0bL*NFX5^`DUlRK;yl8w3NzexiA${@^s-?H!zJ|)31Jj{8% zLr_3vl&)bpK)`Eea}n+wkPJ0R-e+20KqNRyFoG-g4yrZy_9@Sii-_ilBe?smfIv2J zvlp0(Zf{79UX@@5gaR3Yj=wNH5Kzz{>_~<1>^wXGwSaAs=`Gj?FJX-l;c-I%3X4i; zKjPZ|XZ9_`dT0wG)9F9?8$+#j_hUhmT$?t@Av-4T29xKA41h9>JuEB+@K+Q`3J~AK z;EDm&g3f{f-^)w~?AchGHdSSq$VPqpuUPW8&TL+5R~KGEMm>`18Xw^}?=y zQv~ik8nO-^PR5^$=>R+Rvlt5!rNE9OMWdB;dr}1Hp(p*Itk_rk$I$9irmLqDJi}uTHh;)E~_s|jg-J?4g^uIDjo~|WvyZTki8Q&FgR>Pzfj&-6*zHvA(u8-8DKWY|1_5|7X=7Rw3DUx zha|$6k6NT5mWim-TlizYBtz2+KK|%q_K?~X6UVC}1H3C3T&_){p9G1OJ=tVc>J&8F z`@p(7SpS&UD*cDn*LTf->eV2> zP={QVVd8fSB9C_aYJz6w6a1V$&=15d7%q(-=@++};h?2aUHFA@oBy6+fIR1e&}%q; z$#@z2{s~D$8CpF6u<`zdXrUh-E1ci|{*4M2d2?=5NQj8%aOl&cZy-|Iuc<1)3=@<- z*aqNrAOmU*Z;sk*mLWs+H#!o@wC=ypi~S4MV8w5saSP#pHn3=OGi>S#eqvEq%P_7H zZy)8JfYa^?egA9ep+OK7#ZOdo0TWpRUcH$egUeYFz23b zk)R9v`3XR$j9iyB+$kUCnB~_A6VH;C(!1X6i^^dj>Gc03aE1C{F2^uX0vQ1Xpj^mY zL8N$jc7))*sUS0fq(sUxCO%#0%tk;b#k?f2M3EFTpH`re~AbRoc@_y>x!p+kNv zE0{YUH3^<*%_`DotvZF3EZwR-ox?KelwR1C|BA`P(!XNei$^~))zf)fv$BgOK6Eld zfS}{*ZP^yNE@NZoy(C z$PGtn&}}l)sW|hTz;Wt-#FA#+oON)iZhFza{YgWBy<{sc<%u7(-b(Uq8i=a2^IYE8 zQ6M6)(=4)UdtnYzq(`6AI?~bi;ehjg`G^q zzM3G+^_fol;*8z2w`Nl#Wud&EL*I$S2gJ|4_q8~$&O}hoCglHAJ01fEgHazKD0_Q8ezwp!R->*JDBj27+`LuRpY|GmwYPcuW~r1L#le{wRk$?gL}>%EEY3|b zcIhZz%)qYQ+~lo(d}>*dWYQMiKvCLpY8$boccuYyOv>I=clxms z`XM_jifJNso?MMB{GdIU?H(7`?&#te)Sh#5GZyAiRF2eIk0yS-%_{2!a@g#a<=2|( zTq%z>Kny;7`mlqbvRlc-6-vC9MSaEGou|2~nfnJt2zkTZbZWO>9LDSLM4}1PIYTCy zdv%u|h16oG?URKM1FX}mo$sHa_1>&HV{+oP!#?E+(`mAaS1IMd9CQzJ3+c>!3Us*@ zw~6QVT-{S#@bbDCQ^ESY;P$SAw9{q31_n+oW349_qvO8B)V#8zs$3&#EArs7_+hU& zSnajTjQf;b!h_ScpBiK8c^c5S!*)HOKyG*c{84C;o$TET060eJX(1gfDL;((f0>y-4R zIWy$bLd5HCPi+T$GR*@%_*$4X82R27A3fa{R;YKCG1&+8k@5n+^B^mVMd3;xf@iY5 z=(ZlWxLCxI7#9)%`syw!-M>`8=)$`v$=!qP@%|c(a5g#3*Oqm&U$hQK%NH`nS^w_h z(YCL@)er?_FX6xCh9FG>6hpq%Dr>h<>jKXF)B-DeUs^lm1Pou$)R(dA3T&kaM;bdr z6C*>^Xrnx{bw(#=_(-(Y+V7SH`0nHTA@gRGH|=u|tQTMS>XZ+YxC^g>TaiPU>mMT` zza^5wK&idLSL_aM_B!fd4qN7$R~>`D&OgQ6#FF{sabWhC|~!pCCZAE?FqRbj$!o=ik#5lh?rYPCD+h`m{j`h&K!+PB?NO$ zS0pjw3;l2Lg@wd|O+Uw?X8(GbA)H1=##iLf(g5)XGQyO=z=e!F1tD-uCj_8Rv=t}r zx}sGFO%94^lQXEIQc1w6^{lpFg7XD8sFw?sx?iC~kkJW>(m6(SksSw&)>Kp^+EA2r zbb`hFgH!4fP#Pjr$YumZ3w985=0aH%iZvJsjJXPfxwZeY_@_=H-*x{R8O^Wa~0?-En487I{rlHCi_G( zpa)e>S< z#LjlJr^wKsf%#8B+>n3I{G%omq|A+S|Nq2Zq3s5*TuGi>XJAmz9HU~p5*)Zo{?^SK z?vXR=EgtjiJrc1s13R;lnI z$LO4gj|txqZpM>wGu|Vo^00xE4lnd2_U!^OeqA!Kv!I9$8vcKWmwHkZz;#>gM!OC{ zDNye3tQ?0ScHYL5%k6Mlt38|w5b_1auBQX|t=Go$lmG#vPF=4Ep4Z6zLR{Cj^vn5q z0l^cvyRV6YY?BOLMC5YDrw**0XjTlkRE45)XdJP9AI48xL7$pd(WkwdA+@s)a78&& zSVHWiuz2;iyeQ{NR|yB;sv^aMP-<8i;q1uQVo-blz_6J0sBxZJdvQf|4Ao5-(%Os$ znQ3{@leIKr$i5(e5)lZX`*#Irf>*9&q5pIU0uKiHC^a1j<#K;?94D}jT>bz<;v7VR z{P56|-HGDCTSlOq|92SLFM1q$OP+*4ig_ejDoFje2;ZO+s7)3$OK>7Nhq@Ybpt;{VE1R#!=h+oXAp@*ywx5>0__3EVk_d zBEPSV+-&}n_e94v>~!_S;_O1#!u}~z8H`aKZMG&~O;OnG(;Z&5IR0bg0p%HzUlYu< z_@eG+n=7gug1P*X4fhsvO?T>ONg%!nhDT1Tf`ruV7I$F z+EENL!<0N+^0+5Ew@613+~zpcryTet=WTm0Ysd4-KMOycvoo42QNj73(L1RUx4rSp zv#BZe<8}%D1GL|TmAg)^QQbtTbEL$dsvgMV4WQQ>G5d^s%|SfptQa0^&30NS+cnCJ z_M`hPZD7~4o_+^UK0-saBrk8lO(Ct*&U-?w5G!Br7v`}e`FF?A8!#^@ zKwN!1l!e`y?*GQYM$$VodDH+e>UC^bcr0T7`6~iuLL+){i_1L)-hCVu&qITHiJZ~8 zI!B79+?(M;=Nt=f6bG?-@!}pzsPa?;5Z_C- zg{W=Z_HyJ-bMr!c1)4o;f$e2W+B6VR`JU=AmPag4QFIlkW0bS!+)MB+AyXXG>+T@_Q zkyi_v-5N;`1&>U(4RhfW&s!0N;mHxnQP|j6K zkyU)+j8DFb===b%eNe3wf-Y?dMNq;O*MOeXl^IUg2sYeq8`|CToF9EefjEm)8YBrW^l;&6dyXQ^ z@$vRB4*`pA|2G%jh6erk75XL3o?pEg1hrrWBz*L-C61~T5#l(M%_PI8CDQ%u_elD^ zOK&HV&OGdkY8eKh4VMF4Xud7#0<0Qpa=58tUGY6RIk6Biz%!AHzv#VI`&?R&OVV zZm)%aMR+bhLbImoBY=?YG2u}zCc@>qtxf51KgP(e)nEpNVHq}-(Amva1@<88oGn0w z80e`5V2nM&Z2N9bf!k`n3Rn6^KsVP1!5GvA5rOEX+1t>@(#RxvKlOe#n8pB7!z;y1 zRQA0GT-G%A_t#-&Zs$6EK@*)~fLCZjnxq~{M{H0>!7lQVcV&=&Fh?pk04LQdI_Oc3 zh4djvJ&+Q^1}MR^7`Q-4I3-Xc0c1c3)-D~C1RsQ7@uJMzz?BY;U4njKZzUBzt-%7{p)57NPdj^QEEf@`nB1k~ zI8?Zk3o0oJ2O4wg(x4{bankPE@geh5XVeRD;UI|pNlR6+Q559JLzBnE*}2n&7=myJ zwEibH9dszVj=xcs(AxiwVI=|PNCmg{7wr3gaFa#a_+nRcI}i|z zkXn1CFx(u@&tac$2UYR;{z|G)WsY8$>xt3~QlrEEgFqN|y_5`)cfjOt^Y^+YgBl63 z4?}FRLZL{`&;MF7aFQ(eVG@Y=Aw6{(AV|NW*3rp`%@5vO10d$gp})izODJ();rIbc z4Wn-KwyzlnpF(ROluj+5ONkX<3>xj03fZ>l{k%CKk3pqqIaEB{uNY6=@7R5(W8L0m z$XAuLmQ;bjmTWA2=Uo)xGsG5UknOAx^P7QpQF)7}AXf)OV6x&G3W2k`+IOlX2jNF* zmgZ_Kg91#18qAW5TjFh1`*~nXm%_h&)-iu;XSh%l3;JR@~*KcuibEFKmX3VNQ8u&(Ux40OKv;Hu2+`JAlw9g3K zvVp$hd|#=OoDH~rFMbKXd%F4E0RsUW!}KNXHQib(wo$*c405*NW^*1U^D+@Ly5~Z#0z)Nj(8BxH9HM zbsua3+iz2~d_0k*Yqv$N9JS(3c7EI4e^*=2|Ir= z6fpziwFH7jNREsD(Qm+n1X!)3(EyaHaJI+$VDR&*ssZ^68c|jT4JO~2Dh!CEd&0o! zHA{>WtmFLHKM+gX{eholYc@6oQ8IV^rC5-l8c~nDdzuQ;NO}HOW#GW({{6s)GijY; zVJSOVJbTA7H!6Me@Zh}cG>|r91N_yOZo}}8@Z5x|i?>`zrr-?WiI02RL?;BWx;3xOD5nTe^Al%)X-wylDh1v3d;`n(j`*ahb zmOls2F11NSjTE>qH9-dhRM{-c=YyZ@#F~r)QKb}fObj6L=uhn@C3!hi`k-gV^0+~Z z`~6L(7TQBw>-Qx5zr9Q=RtivI8z$3h7EIn3&i^L3BjLq;%iJS~4aNU97LrZPVH@G- zkibWfZWkO73O4#Z;w~^j+E9d+_uuC)kzMlt9rjbl_f54(0~=P*iSktsInB!2D`5CK zvE~7a9ctsD;me0ed>X9~E^ z+5*fECs-|L?|KU@Qrcd|V7?f|RFQoDWlTZbF-ly-aBy3-}@C50;*6mi^M0iMX~&G%4K z@=}7~Dj}i0E+`eK!SG=2L|-D<`P5?Pj0z)wu$*O$po|XsnG)@?SDrE@zR$F)>MOK) zm3P{b1)j@x40cwc9#k|yv%t1;pzUNf2Xwrydp19|b%Otd=X|fDT*9WaDGj$2gSrc~b*{#cd<&~%$bu}1X_$LY$f z8G@Wa(GHyYk?J$880ip5Jaf}?tm#5TZ;7C#UF_)lbADYy_{C^yPwN$RMu6%D?z^B#Qp32eG%!0 z4W2(b0+rGU>LS12@-2~ZUax~C?}G0~R}>{1|FR!D`g!AFwdYa%r8{s@OfuJG16s7& zM2h^jRV6KACrTHxqdtYjXwFYGrfBX>33Je9k}H(;#$M0eNv9U%uqUxSF^h?RrZZoI z^<#C_RPV!y5#%4h=q*T7xdz$JZJevo(UJ6v;|~tG4fOgGrBEgvPfDbI=`*XzPc&3^ z>VKcyT;qMn6l#A(i$zYD>$bJK+m1rqQ7PAqF_?_|r7rbgOL;}6g}MeW>8L^D`1u>- z_CmL-wnewh_74^U=$WN}x?Kt`))+WTgXGD^k9$3}Y`MY+CI(!o;PM9}l#x6!G(9o; zDF?1zH@?^EdQXi>M%9|vk*`N4bG8h_bRE zYGPDdZsGM+-$Nu)t?K`aHOmEn#O0Xx3lgEC`l$k5@1-#YPIXp>Y!+f6Rc#9qCaWLPYk9 zEbfQkE*`Mj8d&F}h(weKO{MfyGQwwg~#$CvjSm>+~RhpA+)M?su01{ z1eZyKXpNK8o_k0*HVM2kIR}a8oY)YsuX<7CQzkS>*s<;@Q7r~W4(6Uw$!*y+z*1+9 zA%M7zJDSOtD$20o(6Cb3-5533Uve(E8_k|Y&7lS)2}KJDNDoI1!XCp*F(*}3&oX}9 zS)0Noofx2XJku0lTO;rffvmv4?LC^wi`dOV-FqE_Ac6;OZY%IfnWle#1(`iwg!`mahA=6wO;-5a*~~HL$R#xon)N>1s==&>oIHVW~GjSVBu4O4mzk=3vo4 zYiDKAE<;Rxk=YtnpWEx`&S;lS5NC4V8({G0iU#s>avtwk*8sL{@fGlpc`r|$z6($G zJc%YzB$X~vDJb{?;)P$!Pp!5%k$4bz!B}nZ{k^bk-%0_0iL}F@faTZgOYqyeck(jh&kRQi1rm55R1k0|d|f5Tj5F@8{t^pq&v<*eVErpbkccY+YUJ z?CU+R#`XlVU-54_Oj0b585QMpBJG+ucMCQzhz3KkVvRdc`JmwvsS`0F5JUnV$=S#C zU3wYxeHT(U?7h3`tc9-s4YRj)#|D_c2sw@s%k?BR2-if+VvvAa(-%}5M_d6w))io$ zQ19`wUr9T4^S{8FykhVH>bICH-%x84Syp#EvDG&pzIs18#j8OP+WpXicOJo%x8qu3 zZ6Hpg5D?ANL5$^sdL|WK2W$;S7W|LXFCDkFfP9@1lipzH z5x@RqF>VHpofbt?-XHt=8EeWUZ<`j7u+lw$hmD23qBV_jl3^mU5a`thc8NEB;6znaVMjpS0BlA)c& z7}KQ2*C>Uy+eMCTq~i+V;qMF}0lq(u z+O~zz8NWQ+G8YFtpfXrNErf!>%0j&dutN_$;GVY+GL;vms{j<){t#`x$_}2Qfv>=o z&}DO0f}t_*;3PSwjRo<)YR^J=g6ox_7;& z)a$!Vmp9geCQvY3Gom5}BD>JMvOkTH0IS{>%dBa!6vplZUquXsGOl;WI|EWb>P)C3 zRY$@f|GEQ%4T;3`{?H1CgU+bWsRZHklE99C;|Tr3ELBJ0rF&MaS?97SanrZ8JMu8S%^*_Jk}(%!`TX0SzJkNp!9=~UsQKn6><2! zg#`wF2kA6?9smG4o0eYztKNG8OPL-+8DeL*lUWq7&ymjHWpGpHwx-@v)X;3(0piHF ztL*20!JRuSi7;1iMN|M*Mrtw`c`^U;z4*mOC{$4Y4lM1|L zFzCNcdG?I@ae64UH<`gf>%glleRofI?)sBoRd*s-fbXJeCe>hPt?z!$dYJu>j)XrYb7@i>Q-+Ie8u=gNd_!t0O&vd z(~GH=dwWr}g_tMA`^8vkYe(C4m{^FPZjQ|SXjjANk3+Lll1D-=ByRb=iwMCxs$RK4K>%L5LL(Mo~p(+ogm)o7A<(m|85i2dak4zuf69q2@u*Z~z|@9~bn`c8DDt<$FH z+b;M;tw!pC-WakST{5vc^yvAy_r7Wxeqg@#J|7I87 zaZ~yS06XHhfks4}N|RAt#JooEd1(KIswC!3qd~rJ) z;Z`;YBHZBI(subs>XY~r?ZxuZAq9^dp0Z8qdnu{D4Sk7^-6JZyMx!*Q=(buv4eFuS z!erM)ap9RoU_4?xy}h1CZE&8?{pYXhky1vUvayHN`RqA^k0a4$hMF^#X^K9y5xB}J z6+K*+du7Y0>t4V6G((V&OUydZ9^!NP(Vfc~Ds@8f1n-Fb>U`6ZGM>|4X!d)bC_%fi zlu>Bl5t0qFWtIsO@eC{dk{!hjNa~M-nemYYqv0Eu!1Inxh?_QVb5>QgU-(E{C~3Bn z8rNY!-P=Qvett`1Qx;EfZG6g7US8oF zy@@eWigvn5QoMcrGwkH&0FNjUKR}q3_3b7-Hu}G;0U@dO6U7$Vghgr1$+Q4%6TxFv zRzt0Ux+1dI>YtGez9csP$dC|vx_B6ZI;rO_!jGvE$EP})rG)~8Z zW|Fe0{e|v&UwKR6vc>*5APlRr+B&}pu*30Ut;H5IS;MDMGB5Pm$4EW1T|3^tJMG~| zkc?KLFStFw>P#P8NVRXrc^*^_B`@{%^|%t;k`FFD!_o$N^7)mh8gk@l?;#G5G^3O) z3_e3#ifP5sm;;vOHuT{v+7&rBX9*hjotK+9>}99Av9jauJ(nt`meWI(S+Q~RPpmO& z7Ic!QCv9ms9Qu=KJ*^8)Hc8h>8ik#G+7wIFqkL_s*`7vU%9!wT0v0re-Iv=~+sNQz zy?R7`babC2vsE;yk)x93f~|$HGF^V{4DrcXPtVgMzOLQZ`sp?Q)kY)PSG~F#iCUxE%%IdH#_$9kq}>mTbi;H_(9;!CaQE0sVS!XM*`Mh0`{Ja{#QWCX`7nI|6qFHo5nku%94{wEtKblXI_5@gDN{QRAWbhLk(ptJ#ehmqjY8|%{fg_LyH z8as#Or0uPcu3tkT&ywew@DYek{W~;;U=a4mC5+^)4kwYC`uBcaCqPN|(+r%WAb1&E z*BoIxWJJSx;temMId0T~p^12HMH%EA_-%&T3%EVT?BLOx?3ADGK=N5~dGyRZnIW}z zWZ)bdK#Ym>p%r&(LVyWlC=blrJhwSlr_xz(MLbp0{!y-J^Mch(=jD2z?jJYLOT}!l zkQlJAJT>2V_XKb5*k$D+PSdvCvO8faUa-*NHBgWg^6R*l3!x|M>3U*}jWx4~y2Ph_ zMdh7SdjU3ifI5O?fHBIVT>)aRDpcbH1o^Duay2ujfbV6*=m13iL^@h~d@uZ^k2M^c4`U;vbJ`M+ zJ}>H}Mdgg+Nm2ri3Hgn{RJ2NlF5J%18jCQGI?@8PL|1MGbV|M-HArhgc86qL;JKnY zI{td(!xjCom2mi5ny}Ic4V>xQvI{$2!V3Ei(NKHvGYDJQNpJP0Us|`WwKCix|2Y2C z=(aV7yY5uSoPJ{&3=t<4A8}&Z+wcL+fON?Pxsj*ZJ*NXnmpt`vX?>2Q)&hYti%)(+ zT#5*7q^hi@z6p&NwMjxm8T@b!_R#~233~H zuI7V%-A0F#eUCWLQOWCot5!DUN`VYH=_SfQQFIL~hCQ(Ks59>96ZUH93~aBZuUL9_e}U30Jyr7ztI>1yi2YJCqFR~JXf{_sT13xq+j^T(YwG_ zL~tVe!7CTUn?TR|yQM%ODTG1)>E1nQ9-3~M0EJ7h1we_@X%)9qgq{?>x#s?L{&v)G zXo!?VGuk6)XLsKIV7mlye;ALxQS&kN+#JUzLQm*5t84x%z~X>5zK2n2NYPFGGNU>U zwucdl!86YW=a9GEA3q2D?=^^F`Nt)i`h3xS1N;@=a%cJsBzsK=?wS5w-2HRj)tk8) zcX`g%iMaaxz-y<{r{(?8JOsvCQ3wB-Esm#GoQl#o~9)*gfgN3J)0RGTMIhh9|xGg;25_kfw{Vme`8$JZFq#3&b8WkOs41fO&*8Jb1J>Z^6y81d<$9dAO+M6K zWckEjj09Y%4;;EHsO`P)YhK~K1*pRqWD5z_Oolu?yhZ z{|}RZj4(sF3f+^rWKzek@Rw>~L9*_!jHr}Fo`QQ?`|>?J%G*FT>F)~(+wV1UV;)fB z@b$txdwdB=EHQWebw)1o{HPTDnYo^Jgozh$>@|qh0l-wWz`_R*tV{6NZ!1JJZp7}j zZVWu1>ukdeGB50u+i0S6*hVt~6abi#ZGI#9J08kbSU-4;o6GX>nj{$n0SIY|s4UxD zShBVNS9bE>a%DI&{>fSAJrm_sZWW8qPG6-8nWz1D{7HijmTwu5K(hv|v30BF_{k4{ z0jp3n!75K$7<_d7E2p>@rQ%tG4q*}I|9nJ-3~)b0dSmcBrs{&@z{y0+#z0Hd7Ze&uM?vhLEM2{dV)sQ|Q>qHyDJSy!ZDX>|} zoEIUbMLi(jFhlf+zjG*7w@kkGLA$=QKl~uUdqVZ-`TThpt|RmOOCx2%i>g^bH0_Zk z_l71hXG)hIggsM~pa0Z1SVQupp%AzY=*E3fQCxs^5DR z(7Ef#YSfXAl3jji5NktBLow@|Xq}V84{g+E2p<+2MT*`Y`BQwi%<-ne;K=Vr28Yvw zwd9wo3;O8Kp6s<-N{U^L`IeJh9|}QU6~gLPRRg8b3(}}rA4z4PRYUg(=1{i@_7~c; ztET1~;X@F(hinCrN1)?e$!Ql2b8Lxr|2LcGLh$M%=HhIdv##C*wvXOllq4P22V$e#2iDw{$U?j>Cbw){Hk zwp%qS$k}|atRu-A7(aFj80pimyWKp-s{j^F^J|-rh8Su;L}CAV2txSC2to8COLNbi z+i0T@s|_CT5Mk?&kjnP?pMGOF*#t%fmIq-t$fmpw{Y!!QUtC2vIS_PU+{q`Yew#JB z^~(*?zhx%Yl#;5DMXQW*r-S|Z^x&db}@tB)CVWE>`tY3UqLffFQsKl+Y zrWEspsxC*Cd|{@x>LsIc5iB*g|10Il+nATHoJ)*Li!6^>&#BKA8)qpc2p?X9Nq{MF z!kUvpk-l+hv0bM4^#f?go^UzL2m`qnagEYAvg>v1E*WjRGzB7SkCyFrs%(-w&se30 zM?P)M%io0b*LI|`O>rSZl@d&C2fV=y(_XhxOpK!X0)n}2Ot?wM^!1d(h}a(4HJ zdXpf`LvG274+BUUdtwAR-nxxZ7vu!({0UrSQ@LzaSG#di*Fs0f1a9G%EA0fgO-3}! zq@SLA_L%!%Z+oe?o}xlo8U@eIBKg&9<2(}GHYE13eNe3vtof=N!ncK}#it_~95M41 z2msyYUW=C~uS4-SE^G&mHMcjO<~95~<5umS3@ zB!iH(KoHO$a1&fe@F6BiWmI+Jp$mJ#&Z`ltopiTe`y)*V%H@Yxwqn*V-8La!+U!lz zn|)7tDn$;|=AV(bxpai8Fq^k>m2HGu8O{i4WK&63u znZOnsB?pK7G(&nQZZSI9>K?q_>Olw2SU&)>PW{TBA`k~9-=)uyLmPoF$KfUD4)no-!>+uVHLeyL(co?da&evJ}qR#wKGo>>07vMRYyS)IPV zK~Of!Ufc2t@8VI|P#lm|GJW#e{qLjzFT0lm`k6kK)!mqDzjP4&ZajNAu~1V!7BTUw z)$CVYlWhfF=0Cd$e{?!uleC2x7Q@g>i^EP6u6;;LOY3nxkd;NCDY*)m92goInJD@B z(pgplIkZIUi>Oo*6LG3u`RAl0>>ysfd@QPxEJat5qt~0_ct9UcQ{5>u@Z?s~Qmhdc z8r3H}vNHOOabY7{8bzOJ*CY)YDQ?HzF)#|M=Q#C(+)ZuAEHWqqG~4)Zjnz`9S&`B) zQ*Q_2S>VN6PtDy*mlEQ=!A^PFmSK1(Y7P>%omL*Ty?h@r5q@|1&!`%XAA*?H<2hz# zV|mn(8cKst_s)I4(wvwghe_33sc!F{zv$Qa(0q5DzCb*|ymSNZ`VT~Ut#EHa`U-W88hr@#`5cK^(agWw~nBvc;`KI%~s9%3nhXP%F5X(;5iPRMt zO`b@zNSNgdUWE#&zbL~jk_t9MF^d9IoQ8*sqw#tC;re)BSdEN7bKnGLey8Luz^jFM z@ChSCR4+r$S?~=CCss}BN!83O0`m5~B_p6CWewr;;cM(? zTcTlPXlLAQr_%n}s2l(oc0}YqD^Rbn3s5|-NGVO|;`<1520`Nr)ngj+a%`2uXSNk( zA0JK;*HDIG(m?0y(GnR!5;KqtuPFYI^nU)2mUPppe`ZNjz&E2DM(}_j?i5~6WB}tR zp{^fh4O`-|=2AUmHnLDx5a(%L5B^Q@u_ml5B7y!FmJ!8g-OvRNp~cQ<@afl(KS$rO zQs*fu6CpPu>Vs>-7r+lvoh)})cyXc|KPgAFJ`J;kp`5kL%Hz7nK}r-}rK+O4eQ0bA zFVK0HvJ0U4$89V&($5A$cHGvOi<||?XqL?PUaYfQb=#O%s7N347piGw-~58 znIfMI4?dhTyjujSSu^}aQBTAf<-rDFDyo9P&H6rxMI2pqXQUhhJB5kM;zM7!2h4pO zHi5v0&z#2!Nv>-?>1F{8hEfm*fz5jOCQy|lgQC;ta7!rRGWfi!iN-%H-Rj1>{B7e6 z2N(-4czqQ!Eh?pf;NCM@!ijrx7BGg$O|-`-OTIKE9ct3P$zwxf4U>j~%sZH|cFzhn zI>U_Rks4ScjIDD)Y+zoU;jSGT2n5Pa2>H=!dZgY0%Iu=m-#gktFwPU8rcrdbE~$FQ zg{}Il905cLQjMMk*pUI;gQmPY3%0RN`odf-&)h zoOTw#f;=r^`T&ijcvThz&#q1&enjS3!96gOsbRTFrAl1hnxsd)JriTI^EX1k98fD*F!MXu$LdyNjgHe9>J@JYpo428}#~94?oNA!D?nhFASmcST33YB(E=KE)s*MEUlx znpL<63@p0q0eBzaeV}2sScZ1{^n1`1U_6yoTEsLG)9phX4#e00h5!ZQ=VXeaA$d~D zPFs(AmgK$U+M35msjPlpw3z%(*3x^(bdAaY+>$k6pbInO=+cq!Pj32^85AiNzL6kZlX zjcU)bGfMJ<5r`&+c2xOU7!vqRUJI6LLvT+26uuN@;;sl!04|R7tWz2$V3wLKt^EV+ zL?6aZB!Mu5_9*_qI`|Dard8;x))JO5=pP#~4hj;9BopY-ovX}brIbzI&+-&lP@+?2 z+A2I?8k`G&vIcR~}tnZyP3wnuXmpOWg0nxf$OhgBB=RNV7wm(K4 zC$`MrZWjq4+E!;}ZI*qF1%+#0`_^LW1C}3Qa!yEIa_9SwuV25~&p=nEZQ%`4rB1aY z6T@=>$i!c8lEd5F!L(2mlZ)||T>RWivoGE~^(D~{nxvVtG9ObePuGGPb?TmpCmVMb zSV~rgawdn>OYm-aX6iwwLNhR*5)aVllX3Kc=&mgV)FnR*7sT(gg)m--FpwZBN<3?XcGH$kjKHrJw(jLAx>g>-4&kDG_~z+8?$Zsc3CwI=lJH{Vi3ycmH&V z=kDV@ca!5jhN)bUR{!|L;*tJu16D0DlCHS6NoR6~;ec{MzfN=M+;i9IK2hLZchAjj zR2Z5M&))Nk@VWDc14?}`%hh7Z*ItiOYZkK){X!kQkl0yIi%&|@7FB%g^V?dCQvari z7k!bN>@jlpaqJKK2HMHfeG5`{okD|+7Mq!VS!c427!awlSQO->KI0@Kb<3$uZ#~X= zpyxPtjeZ}gQWxO_m7jOJhutN_?Bx0xsvEn##m&cF@Yj#M`n(#MU?RkFt zdiK6bZs_FmcehCP!}Ak@W3yQD+fu?<0>x`SMrhF`xGBq1ECIY2R(9GtinJ8jF_WG^ z{qdB7abl1$X)!vGL+YuMz=jiLXQkxl1KupmH7zc0Y$P&cijLc-hvRTU+>0_<+^|p6e)VxQ;g#-`NT~rPpKYQI&S277sEMkizkV>&YF^iIoU_8+GJivbmx{<2 zf{EC2sQ)z*Jyv}T_5vh_n43c^V1Zn2WM?I6i>ZS z42gWT`ygPAg=(sB67$A(4%_5Af7S+Xj40$`*?aN@*WQ?K1Q>C|()pt>yk0K64Su2^ z%72hpFyqqz(2hl2zX`=^3nWLW9PpnAO+yeWOL&pGV?8+dZw#=V$fGNr6?UlN!&3w} zqs539UrY-Ou%g_tDVyg{y>gFFrUxp8Wf%Rz904uUyc{ejvYMtKW-7!S>{3^6(9LSQ zE+ut;(DZqyzn7fqE>_(@!+zUJUOVRkewujDN8iAvLuR8i5W!p2&0JXyTQ!xp11lg&+qv? z&+~hq<2{adIo^M!aNqY__j#S?=lq<@bzR(3==^wwzAo(9IC5YHmy+u73ck3ZPSYtX zgTck;Msqv#U>o{ITv60LjR*G^CeO>(6aX9<*E8x=+6lZ0}s@)Mq zGTH-6yb#I#%IWLr4n%lDeEvCijGx|nol)F#&F@E>FNG^YDs`AlA02TltnJ{}jA?Ja z%|jm?HCKGX86eD?KYPBFxFaSt>)O$giAHZ9qvH+PI!|9`%w2=EcpnSLA>z1%E+a~D zG+q6tf(3@Ip)CkiQ7QLRXX(_{W&2Cr+;X%BO)d25Ms&`li?1pbyIy6reQ7QMQj8K?N2{2nR_B-WBqnALgTFm zhNEEzJ60puV7w6o+HWkm-GO7^2(}`8xkS`_`;JC~9!6rG>84sgACh;;JwXWR%luw4 zpj{!tgi0L{>6&=xgp(LbQAqN2vi-eV8NDuLthfMK4=F{`frgN^H$8O}os(OCv-Oyy ziXqLwI@aTS=Zhrdngoy$VxGe0uv*qLEaWt6oZAIEQ8`f2l|#$PtiJ(WJOVq%%O;rkmkbeXMD6mY2?^)FaJ z$fHkb0W+MJe2*0pW3M#sY&cXXw{wDDk=bm)rW4lBv~mw1`wXrPL0U|)-C|ICM3Orx z9g{9gE-4tZYCx{3gMlEj;d}2I=r<9KRj~pagt@QiLdc6l7@Ta{3V}<-bM1p znF*$j|5K-fG;ZEdN6tQ2)Bp3}ZEDpGdVX52#FE8*fx4x?H+PD*!N5vFNIt)pz7)_Y z|9F4v+L>u<#>n%*0tS!l-2O{WNE8h(+A;8=9(42PW_D{wp}DUq%9>~S!_IzsmbE)X z-A#z=nlBy``cBZnhvndu*Bo-p1sLCdh;A}4 zTqM5%*Zk>ct*6{(tOm_MDPez(svB#k8J4WQWvMeHk=H_WkU;pKc@nOe;=Kiuy8jI< zLlo=fk1*xM+)0N22ahQ?M{i+@?bIU$-7i@+@mn#Jr*o31rbBI z-V4MXBYXjV{4Zb(uDID<2#Sb&Euu%&f2Q0+NL|~lxkZPz{c4Q*Q(4fm@KuO#*Ia>i z3J&r4zrG55&Cd<7Z0BzG@oK?=5*^h)4p$&*<@Ep6>fgD@HMMeKeC)9Q($hop;ksdO zYi>qM+5H)%oM=|(mNi)|y4bV4nC2b#w5756ypX9`dfmPNZBac0xftqRlIm>i=99Ce zTxsWbDqhgIkRluww5U@l3ky$9 zzm+#;)Og_V`^+Rs&GBWAH|6{uWa&FY&5^Pv*QpTbHaMQrv|S9&oaw+1MGBHFUN5xu>$jXw>l-+}GC5$s z@&F$OoWSVS^WPIQbIL3v=6O=B#BNadc^lGCE`8yyX+H1z)(x*=;4$MN)N7i+n4G6m zDAm*S;tS$azGu~!hmA9vRpUJSZjRF*T%&UFbKtHFVbz??qe+~UTm74sg zCq-`9mo=B)_@dX38F*frNYp%ZRRx#7+LTK#9?2-_l~74}T`(Xhw@bfW$e<^E%t{zH z^e$}p)XH1}J;@5WGfMEqs97^koWl!$to@-ud5rwC*B35LkA>1TIAR3SFspMP6TaaG zaOjV2u{l>RjlXNRC>sk_c2BQ6s;wBAb~o&|xcNMTAi>5RuH4!=Bc-=pc$aJ?hFBG= zn^uHJ=Rq}AvQ@APqvDNbV;*r!3E_38rs~FU#La#ceQ}3;7nJ$uC_NGRsmmdKRJQiy zW4BJnMLSnHtfF_n@{z&io29>$yS!4T_(fj%j(T;p&eTpFK{yP!oO0miYCwRL77jCL zfZew^Cqvn#-of}yZgD)$%2upV{?ZNSHj>hLboj}^(vVinwC>8H_;|n~x%hO!m3#iz z#!mZZBXMilSc!c@KE?d)E9F`bzu#8eL6%+y+)nYBN?EJ}oEcBRB~Y3954 ziW$%8AN=$blXQ6iz9PcD@q}|*s&<E{GX^ z?mz?7>upeo#tR5+zM1g!lOfj*79u_S6?*^HR;{ghf87wc0byW2H>yUWt8dz9@S_QV);M9GxPn^j3xpL&Q9I+Qlj-gS70>Q3z$Q3I0}jLj zE2a-^w^Bpd93a`zP4?GNwT$h*F=wwtJEs*hBt=Rg!}iYkh7eg_&!`0rBIosJIWtJ7K;F3$)gyE8drKf*l|7RBCor`RnJLTJPe%OjD%s zrqNM1eUEfXOc`GP>Md3{CJMJ$M4D7?=wbsY|J*@ija%rQ*A?s%hkUzD ze5)-PoaYaOq=8_$xVS{&Mx-Wy1iDCLq%N}mG^?N6nKsyO{F+dr<#%nXkh3`5FThhw zpsxNR>n=&dX5jFefnMCfZj%qCDY5@TuBb*iT{jX%8e)Vi+s8Qy?Cj%NhlyV!A9g+@ z&2ksomf&Qs6n)tYd#+LXp^nY^UNn`we^nYP zMPWald|fd7DbHZHrnhan*Eo67dvCgpFH&`33k8HjLd2xkrmLDLZh5dY#H1+lT!C_j zbiAl)%WbA{IAR!7_2eI_+PMmYxoHyZDx(iuI9-B#$gkaielAf{6y^9HJ?iF_Yc!IJ z29DwVD;Nt2VdH`u|3-b+D2A}PZM>C!HI4K}n&aJ(4K%SX&0mU55cP`UQH`EwHCNti z`{71AL=jaa%+>FVL(d-Ncn~reptuUaO&|k9j2pcF9wU0gs_hDU)2^8kBM4%5>(OrJ zbigbvd%Q|>dMPwRe{7#9cdp}u zv5&<@83qmBB8LOuc<~$Bt*44zj{EEeF1tX4F$i;`yJ}-LJvht{oA~|OplglsW`&b< zRFRgC>{x#pr0j-7qd%Gd5oG_;zwx~_5*E^GA<-T)t*Mv~j)n8>O2|uyNRTDhVT6$G zG`+28Mo{aqT8kHt=izq>UidS9tEMB8qmLkY2KE^aa|kJt$@J3im+>LO7W3Ulitf;J zV`tZ^>i-G<{1aJ;xuNP>3a@==%IMQCA!dQ@33a&j&xMO?iGb)K*p+)NcZNuKt&37d zX0d!}+3oe~fZcgEQ!P!;14%b1>mJLyB>c=;1!#Z7J?+^h2c|#_L z2^rV_SId8*mJl7JonwX=o8_?mr+uN@^*$(>Q*S(6HF+(uMiP|{oFyLwFEq?U_lC|K zP=in}MZ>&{UR-NV$RiIWt>^WWow>`{SC?mV>QjQ=O+r8PnHR2tx&EhkSu65i?g zmHtv1ve?uZKa}9D+iVN^MHu)~D_GYlJzz6l!lNAN?&dG=vgE=lh>#fCSS`)hT-lm( z%9w_@H_%L3QBj=KN4a2{?uHkHA)eF&10L~7LL}9@3#``ppzCv#%laQL9vfH+?aci` z6zPZE4kY!#?IEV}=X&mc;)nn{xNMPJRXGymdA@>tgZ}$<;5OLJ=FBbhe=nyncA*qfzcY3x->v zNAhcI<|IL_WHCR%Zm74IYE2_9bW)Sbsrij#lZ*u|%7adNz|0F=I4*C=R>O1dVPl!* z11(L;ywBw1;LuR>`Jtg%g`C{njL}^0(^hB9EQw{&9S)b|>^(L-r`H-UsaVKA#ZYWC zQWiAEBK6zl(;rsyctw?+tf)*u6gkl#b9xu$No6XC4c$T zegW6h{QZ+k6>zJDrk;3}d3-fkQCqT4`PitZ;ji>M>WDV4YTVElLIBF#BWAN@cKPIKtmzna zLOprw_w_YV8JK7NC(qU|#_`%4TdoQ@&vsDAOZ4&!8>So~o{Pw!cQf&^rr6a*g${Le zUR&%lsu0THE*M_qmYQMw5My6@vCv=geCbT{kfxWY5Np$o#fs~ytKB>1V<}YJn`mM} zz)~)qzHNy?(}$pLJiuR0NPp28PP(GEom6(tPF7t%0YRO|n-t zJ{g!>GUmjoWq#u&)g4}|iCeF=Oz(@1<2_7_+PN~$UN?MPur!+JEJ>6|$Hh7qdB5-V z6nEq$AK>c;MtIKhgLaXyTFXL=rtcuP)}yWGv6{HX_&o0x&s>)`Q9F5fXQ|FLl{PKL zbxQ$lTC`FE3O;>}yLc9*c;hrhVqke-pc4AME2SBS{rUM_DD|!`Iih0sd;k6#& z1Jp~S@xgkuEO*A&@yn7c@|}3S1$ns}6{}CYFzBJ~ZlszuSCrUc?%qjWz>QjA zC%;ouu>{bQ5F z^@|$kDm_Z}(cJl`zW90D{1#{GL$Al_T7(dES59IfcG(EL;_ zD|phJRAXm+}%(%%oAZ3zdUV=lD&^&mU_~2j+IVW zW=$NEV7K9tPgIu}&we;2p>Runm^R@1N?J<1*F`8)mCmsowGOLq){FThk~SN+8nH)O zvVWX@eMOnJRJgQSI@$h#zFK*=>a+LC41QHkPSF$Rm2Wf=Bqiw5_}lOUZBw0U-fzY$ ztV-MD=Oq-llgViLh|*eoWuW*S+S@PdNKT(Zg5JChsxtYuSn0W7p}dXN?@%B0?W0r! z8lks~Bo)qduVP%6u~M~UD^;(^#V5n+c<%%zCS&1_eTovtYGL+3E6 z99Fh4Ne#gsD}He<>_LqN_L3gispDDxuXpez$d{j?T66(?t>VpBTbk&roF>asAh1D7<_oY{OMZaZP=|!zkWbVz)H^lwL*}AsM8G9H#0J$2RCwhWsBf4Te0&|84Kcgk<_ZYuXS1bGU}bv+fcPFT+N zXk&29h!48XNi^D_JTM~jcdFApqLZRabqkIj#?Kq}q+_b6L)eL-<_YDbRV;W^`|=04 z_g*{R=ysqD*RKvYc0al*HLCw;^#H1@SL98n^bLvQ%1a!-w;Z{sraARVIrPws1S2HJ zEKT^gWJ4Nh(GcsK<-TF+^_yic8;w-GHo-{m=aVWH5qR-P`$e*l*aRuz&HVDS4yP6$ zT;E)q9C`1m<-Q?`Lo(rV0(a@tt2_AJEZPn&RCRnkJP`(E!cCaZ#aSEZz3Q>VmmXy^ zWx7I+sEW6f0gVHbHI1?nSlgDYDe{&2nd)aJP~r58uAy(HAC5PQ253%{4yD9Q18i+@ zcseBNW66v~pN?GUxwaSAIKS~)z%oY)&D} z6Z1CAEk(Zb>AVtcs^^FRO!UW(=$4{}%PP69x4Jej3N%!x5K!nFw|fsqsZs3kF&_$C zuivEDjaT$GlGBwEcSgPxk?Ozurhj1v*FK_;!|42Hk*rJbVe8WFIRH$gbN05cU+kTN!XI3n1lgj9VLE7@&w8 zY0~tbC{Y8hz7p>apPp6#M;cpax%?JHg$1oG#pjRiGw2cbMK|2f;fjuU!6pCfQBl<5 zt|_q##T9UUFoH@8o3mQq+Mq@U27H4@oGQ&Q)q(gTfLl3Id8Cm*j^0Gr)#?{{ozd6v? zaUnrNlu8&7R0&wQpat^1M*35}@sHo5YhpWMI`#3<7_KgR@$a78d{eMhtL zEJYB)6T*u((wCiK=byN%@B%D+HGtd77vS3+koSS647m`!6xP&U>Ep0}-N|;govz?M z0L1g#`hORSah6~AEyhRB++*NI>oG6=!HeWwLCnO1?2rbV6COp*L-!WD51Tf%Uch9x zlgX1?JKeaN_@_>8g>PX8-MG;`ipY5&1>B97&*x&$z|+D1;2{u!-qM?QF`mTC^|H`4 zXUP$XA4{A;w6CwsG46o!&hDJ5llIBAZyR(npDaEhkZ1Ok3+Zy$YAG~!VN2p!5pMo7 zL%Zh%tYtwzSP-=pk5U33)PQ1VUQ=6=Vf}^Sx7MI1#@4I?FkoufR`PIiD54rHk07M>tWNRZOy7d-5E-MI9-t62Ql7#!)M>! zXV%(u0p0>}dsU*1>rdn}Yo+F0&qmZW;=N*D$B5^HC{iIW^E9bU^qI03RM$(zM%B>~ zftsUnWrnnn{GTF3h6Ot+7_t{QAI{j?POy=ZA|5)WydFEE^h^1)CwxwgoR#yk_x}6@ z*=q{Z1bWDZ_;N&dk?|rzUv~*622oGmDcYE1U&)elWt4Y95{znif63Ltt<_fObq*$| zj_YTNOA}iIjvWskTfZJ_^y5F*QRkUMr{n))9R=Z{ej5LOPnL*nd3sHRY~9vg=W)jL z+NDwu=P5*IUyx=Gx7xB0U>mF2hls{nSjvwGgH0NTcpIGlORi`spSb-oK7xO_k&Zy2 z6WQ}Hl^Td>3N&-gS>0mF+0k_If0Sz;DqhVhtecl_>SW&5*T7`%jXsBaI6$25ejx+= z81_6%@X~O3)aFHv6_SAu;TE4?K_my+c2tef*^v(yxWo0|p4+yt6~kbI%Pk2QfL4=> zKQ^oWH2J6hn#n8nC7?!Zv=l2i?bl;FE?_?4Ie*-$x=h+JSA!-#?ZVuUO# zUEn}n^>d^nFPWe2N~l<@Y#U6{#Q38N1+j}?WAIV5%L~3*g-aWW*04cW(s4`$cz`xU z^zYqaZti5BVAsQ`$SJ-(B6%>&2K}Nw5Z@{h*MN>yZ#WA~*HUf+FbTHXu7T>dhe()eOQ402CDSxd`^Z?NTfczh)lw4WhZqi2F zm*R$k_MEHC$2XwLKz^4rVcZr`@2~5ol(U8Cx9>14k6|}gCJR^(iMVZ;v&Od`>(U2) z!BuPnmeKqkOj9^uBS2y`+ z0y{7~ytCa+}Ag383zzSL|DKYc>LE4 zX!GJ;%iuF$+qFJGvDSFg-%MH0>QvOrxnBK^^v#RoJ%{|UAoh1KLZ0BBhewgwJv3Hs zJ}$;Bi+0d)CRwkU>i+)?rW$q_&`1d7TZacz-2`^$o!1PbbDITETkOAkP;6#Q@34A7 zp20}O>F6@U36dIzwb%v$q&zl>0r zswVC8oTpS?ZS43XfPxAagwy;3&(RJ-Ja!k?s0RBYW6)z|@F?3nNi2=h=Udm@mLGaw zqC#97HuaHE_++%HujHzy+!;&;54zItoS&+|>~d{W5u9UTV7VMAmiQ^}VZGpy&8L*V znRV%pY_X5!-p2YYq59(LFe-5FNv%bS^_v&z{)(ZynWHz^+xWf=idW#QoNTUtc9C?G zxzT{u9P!0F=V85_6^Wu8eeIdNtI#lYBfZNcI&{EzboA2KO#(5uPx#l$uP#xVMNfV= zo9H1QVSVPi=f*Kd8i}#B)LGJIvjh$;D{8~};QSsNm92Z9PmB4Eo_)u|jA_KpHf_RV z{Idh*1|J4^s<|KQpKRqUm{2%jEsU|w@M;gHs3csu&T);aGJm9k#K2w?$emdh%bhQl zF1`a4SnKfF3&nG1b0>SQI;#b`UbHXsyxPsn;?DRGl{zbn4^SN^zPhY7ZoGRaa*)cK zQ}M!xkRsC09(uFhEIJ@Lc;zcC3saS-Zp_tVu(`+%5s-uA{5Jb-I*VJi*>@>TOO1=o z$NK62_Is=f;d-ch5pJapw|sK=Ig%^IH0BRd-}aQfdXSeepe8NhW``CCn@h8_v}hg= z=zHSv6qDH$lQVymM(VvyD4v{kt7$QhyOw62%9?wK-#gyj6PtSGVDD6R^EVv*CPn0& zFvU@SsAXkTN-KH+GvHD2aG^)V4+jA)S%q4!)cCk8xX%Pe*Mq8dp}y*8JA41`iW}!7JGk5^e(URT#8Q!p$#(X$VFOT zZ#Bms(SLW~Eg|Mm(>LM87xI|tpzLu~jK4PyxA-;qL_kTh^OnU+#tKU~z}l1Rv9F7m z_*=*~;~OqN=dl(}joGGQushvuS0N+QlDRop+7^P1ky!F^#jm@ag_)8dY`MjBS^7XP zAt^@)chxT%5~z^B+7+xP8BKC<4!A!dR`7e*nU-P-Sfpe;J43DRt#!+1O)sL(L}Dlp zYr>0#dPFO)oy29&776f8@!M6iF&#b_(c~G{s-eDvW1nbLXmiTkdB{lJxsx6T0DsQ- zw^MdFwYqC{9fbY6j7&+4%Khsu1Fadl*d}upqM!%i@?iP`O~*2-Z9$*x=W`53Br5vb zE@<3&tjFJkjxwN;63K7GI>(G0vgRbpnpWVQ65%AibRhu4YILr$5im}a8)bvJ*z{3a zh+xqKETy;1uuXd8k`U_iCDRB1_RDV`4C885K$FNE4|q3s-LO4+6AZS)df$W<{`C3= ztNS4umIjYx-T{s;t6=lu_j?EWeAQQpw|8#{Qk9N?k=|t{oyUUM#j2jtfIVq&t^&c?M*7 zmxCXF*#9!Bdont}GxY z#gQj7V50Tgm9x(lgxoo-gYrD}fpc7pibZ)w@7%no*FFb2W)qFfTN%m*o}LGnpE%Dq zRkzozvN4ciYWD1U&p>S{U8c~UDW7s6tH%^bpk%oSJ$r2)<(mD)F;(&C za)HrzSsk5bGN{6H2^Q&mt>p7>zPq7zZIO@~P=$2HjC0*@;pUZr_SwJj*&~5L>La6w z5|{ES;)r!jtMT=k>^A?++F=J%$$~KpF-mcM`s-w)cS>UrP~0_jau6Zi(qRC1o6(a; z+Paj3S`FSbX(CuR(nv=Q^9)ILopfou)mV!0PX)FJ^5NPNbcgUQ>#j(b z{se=tro>@6!;J`CW3+(sWf#HI&%ouWwZM>0wg=*wiODGrl^*)PT|9N^tVGaek&Q@p zbv(@{j`i5T^=@DvWoX5FCMs*06K4l5rpQ)XRco_v!sB9?hCusAEQ+NrV7cyW`e^M6 zuO~P*8``*?u|u>}Hoesv?aFNHWXT;_SV3NZ3nSbb#~=SI?;nZ}dhb zR#1(1)9t<;vde9EWV0#aI<^o}6qS@%e`wp;psM4;#@=a&2ow>eJ7o>{;2<2pOK7jy zlz#ME!~&OwOV0`1V7^g_igMFF?$MWK@equ@+|j$7K(~W8zlz2b{+1Kw!nXg^4t><- zCQYwN%N?wtZv*Yo$8a!ImSH@6+GYUv7=g=qP>`xiDp=!abKBQr51F4$yRcqn6Piuo zr{m9kr0x={Vo<){iDs6+E}aAQvUx3{dV+qZx)xD!hcR7F@2w^KZ({|T0LIrP8%@@O z{M1z)6;bvX0AZa^4!geSPxz8Fl$spaO2c-NtaOWhuUEXcnHu&!&|a%Y+L(*!@rbfC zaFx7P$F7lu2U+1U6*=arb)TZWA)JxBXc$yGYUa%6v1Ai}RENCDFH)f|lipddE)8lT z9fTv*yoh4`cxv7+XCptI?{6VKzl}0|p;%DoQ)+}ufqpt>pdQ^D!^AFr$H+dFe;h<` z4*}EET2Z%huJxU-j~6c-6F#ubqbTZ!_Gsj?5)M`Np)~YrqE!io09n71+^Kfr02SW6 zNNn^G>g*X^oySiI;DbXJVgiT+6@$$i>7s7SNb>PNz+mS}kIc-SQ(t1%@uT>y425+< zf~t%$hBTL+0qwXd?U4+HFF5}l!kDarc$l7jiJK+38$36{5EHF71d7dDn6}5M7|;yx zN_`zpK_>ekL@(xl$7LOzfBJ{e4W7SToDS(s)!}N<)Z6FoKS95;-wnCFVGHZKOiU=^ zi6%{R-weSPi;^1M^Wp!gkGm2Mp0@G+j-45S5E}1LtN?#;RaY4Tizfe2Tw9^&vxLP+ z%k24`H+U}T#%YL-i#bcqMsBbYRyei1t;Yr2P-Z>C^ie$4qY*pT$dJdnXEE2(FuEKz zzODGB>}I)!V?}jUW#cC^ZZi`v-7Z;?ASS?@3s_Tf){TnpTDJxD;lvJD$=FRpeb9FJ zy^q(r1rM;Ry_^YwI_`BO#StPW+{>KGJuKi= z3DMIZ5XCBc2HApkV|sQ91hrMZZ)|dFIE!4w9*%Lj3aKh3`ifVs3w_d@@Z%^AL~yEHQ%gMJrN9BtW8B6)JgrQ(uPn zZlqsLuRPke(PA5k(?NLJ+`d`UM%nL^xM#G#YyAS=ZjD5MEB)`12&exyNJM4Xe~&~c z^p%LQ93&ik9((u>=lalu<=BO$GV)Ey(3`EsjxSf|qz^A2KQ9B*b4HQRNHVD(FehE< z1sjw8NN!S&l;=+_od0oM;_3ZR7Erz=Rv>I&`blep+|w7B0c>!$61Uu)=+_}Z;d;94 z?`3t!mx(HyVR>(E!FFaQ0yZrblRjaj@if;xDztXzaGi8~;pQ!dQh-43?r+a}v*LY! z`hGsjb^pDj=%Jku@#E!Wem7zUn3qOhR{+HdaR*wSI=^j|;H+mZKP`}NF{-dZt}8?` zK(|Z3!DLWi)APfB=K8$`?EZ2xz`BX9l0S&EPY9;PNo(x^*T@zFmEz?Z?I;N6Fblk*eI9+1b;&D$Nyyoua*AZVAojh@~-jc1cx3 z*5|_pv--D`O;G9IP(bd1MN9s8_-^V!#7`Td1|`93?CmHayO#g z>F-*8MA8~H=_j=x+D^RvXf{B!U4CfN&9cKz|JdmVM2T_SByGZorb+8&ceUR(`|V?9 z%lw`GTK@bD#$@U2M3KBF{cTudW>11?(^3LmGcx{)M|!`NeIqq(sedUc`nvA(miuu? zca3X=i~t!Ult>kZ*nR7vKFfHWfk^u`1k`x4d76mz`F_uf%FK`?I-eMZMh4Qn{`F1a#?`srsT5D~rIiU^;-kEkmuX8w zU*g#NO2h@;-tVuSDIDHbIJ-17_T6&k%2uH=8T(0o{h5lU=luHymf|7hfHxMe-;x+- zr&{u`fz{^?Yj<5tS;FiWb|=ElJ=;7MW9jhY%*hPP>@#O}%B8G%T1FnBuzC|@^+@5H z*Lm?x=`@=bD-H9W?D?d#OTDwoZZC6Ujxf{i#Lc-Eg`l+B2;NlIFYuD_RiPNNfAf&b zn~n6c*&+%A>25oep}r8KK}c$?tLDTGU@HUh_atmSDcC!!s$@$KKA8*H29e|n<5QqL zZoEJOjCya`*YXSR{W_hl95`^EtIu)QxhU85$p*xb4RI@mBa-v60f0)+>b%mq`CdN- z9lV+S4?5V7X;qDI#9FYASjKZVYmuGqx(M+pg$U}hH*1>9hbmvM1Glb!^2CHkrP;P$ z?KXOACFBDAfr_YliCBLzs0wt37h?f|S%Y%HZ$g!D-e_TSk@K)7q1*lwW^ln)vEgTL z4f2F@F`7tH+HgoD(1+_ICpBJbHvGAQ=^;} z{W6H4M>%JrF?!1%MBJ92xNPnGWZ!xASFHb-CovGJTjb^1P1n|A#ogv1L2VNOL8L!A zisYdCvOyDs3pI9(!?Qg)SRq0YP&JoNnGJ*o!OfF~2u+-OoT~``xFyIzoNLsyWfH~T zPrh(?YH@lB>RxbB`Uv^h>BBq5=5l+&>lUFUml>#^JXgrVpo@kiARnvxI=5T#9$^;Wr6c!4P)ww?<+SZlu9VEo{@71d+!7a#1=NE3Q1Tq zH4bJ7dhT#S?SB5>rSM^b!i=)-CO+I+>EY-!_{B_J(VX(97np)Hfc%cvTKOY6o-nUH zU6b>2%%z~+8Q;FrlIFtRcPtNkaDiHPLUng7vGOko8#H;lqzy!kdmoZ*Q3@OxlsLrS zPTKz^WG(|qqbCu)Y9Fn#FBUF+Rw~)LVe!Gy&yHP(rJChM;{fB!49f@XAVLpd#E2RW<%2B1*m#O=!wD#ZBVf}^AD_@6jwN(@rw7V->+p98r zR7Rn5dpiJUUO>DOHO6HfPHOM0iR$Ly%*r*B-Ep2YsT0p5e&@F>%dOTsW{)pxghJqn z7c4?m|Ai}xc)pBJM?I3Aa!@Zjua70#vaY*sA~vRQ=`r^(Z;WBH7Bn8&dC5aws(gjS zwFWN1TTzTcLT^YZVKQ!1{u>-JJ*_#CRIQ+u%`%@|y9o)kUD^lCypNV1?30RNb$|k; zD8jNqc}0;H4#7?_FN*#koZ!io%}l&lZG(`Qo0S%TE4Eex{t^Kjy9&L9P!sY$G_TO) z_=b@9PbwKBH0Jw;H_TeG#r{xF z%dG}f(J0VID~Q@U3u$?2!Cd^tEeGsz`^SOYzp#WVkCZR#?nA_p!6wfA|FBpg9v3mK zu>_qpb*;?TS&YnQBY`F8kaQMy4D$x(38u+zus;QCLoq5N)dyWr zIc+p>f(H)%gupPaPBq$M42^kR@qB1T>gFX(R`ZRj<4?5lYQM-GWTRSczO03R^3S|X zXV%)QC!DzF_Cf#A{f@Z>9|s*9yVW@V<`PX}|8j}r^ZJoL!P+}(1dp0OT93luPvf}s z7ox(cCx-S%E?LWEA*2qXcl|<1T&hxSF|$^vIw!<}+x{r)K~II-JV`Kyrm2_!^)Ra~ zi|3WvmmwGz-0%`ech5V~4w+7+PbnF+EH9ikHSvoFSp|uzwT3T(O5M@}mIGmBaxfE+ zc%2Za&MqUU^zSN%8K@5?;O$5cnTcCH)hY;p%#bt{c;|av@9;kO&k@0bd;_8i`k2=C zk0Osg%kaa~|8-0NJbb4cMxgA`Q}X*e$ADnr500^pth=|U$u^VEE&kF$p@6~mpuhP* zbnIU~&@ErfOSd`?IPVi3)M^ev8T#&N1IuA51vvDZD78$_`o;^|41(7YByaKXz!G=z zi9Aq+fgpJ8dvKEITJs1Pu6?%tLP$3?rc@U?w=Y!6KYGy)$$3CjlHa~8w<4nBqML=yoMyrLm^1(j{1h@`%?LifHQBEUu*UK1vP(oTIpPAr`kY! z{dO?>|E=WW{|di{^hN(qbGMVsiyz&kX`lO}!dt1$Gqt2f>T&LCjqNJ(3-uP0+{qQSD-1HKOn>=pry5c?d zgT9jkgBhNA2u)~0Z&p_n1eceQ@CgV9U=NEZCK9@H;u>_AMnxZrQ~@qA5Kp?+=<&A> zx722W!_%khrr6IB%US#MZ;P<+8#ou;9d2Q_KRbKKc=;;?{IFV51_QP8GmP%8kFNHy zquv?oy~G2BSgH(q*2kuc-(w%uZ=O$i@H%!O*E@YFFXZ;z6Ok(0CvUGNqjgrVCf>z0 z%Jy2F7~h<@S#Hx~{frG$*%$5G7{(li&3Xp)!$!&iWV8l(Q$zw2Ho?g> zdn_2Ol_a&y1qWDF~V1*X!uIc5lseeU6|9bcf=R%LFB!3&Yu9Q zAp{#6iAlEPMrHwgV-5e?*wHAvFV+eZuU9eF9f^hV6|oB$k*G)J+1_d6*>}^nZSyg8 zxnDvzG+jG#x*(vx?Fx$c zSRoF(|JFjxH68Y5e5eNsFSZM!{%;{=g*aX1Z;v!^LR!sH2B!DjZI67FCC1tp>h9pE zDm8Le#9A16)+Co?WZSD!k9L)es68puz)fU$*AFDdS7}qPr?0;g>3rWb)A&sh-KHx+ z1^c50d+SxBI-|bDb@lb+E2VK7y_2`4!p#k0YP6k{G^0sq`Ec39q{b|xNItY*Ol!J- z7&uG7snq5c<0VR5N&8IT`{V5~jrp+(3Y4gc@}WF$Q<9bO3>Wj8YYVT3Rh*o70zG=? z+dq6Ln$4CO)B2=!P&py*b?tQXvVYkKtKhOzSAtrs54ynl?76QlYEUf6JvE?tGkiU2 zNi2XVH3N;)Mp1+rv-KR57D<=-Cd}##!%=-1Q@)7CV!lVj(|5J!(`)k|2UgH}=#%S* z>(~?Q3~F9r6>%J>QrwMJ#&>y~YLDg&zNv*Ks_1kI$$zt%%w<7>YwBIg7?q*^nbmZ8 zsI<^5gEsW+&`gJYnfalLq3yy%jsY8q4x!ScqS^_Tc;lhaZvGfrs?3!o)i+2VyP$RB zq`u0_dpJ`uPuY}OElZ06Ba}j%KNbsz$C1-7zP%oXhpaJ$uti)S%}qR zN)~ZOY4m+>=xq$EGJz6NRF(u#MDrh*~m(T268ZsyX?BlYPR;O@on zmK+6qk1itA9MS`Z>=&9|sM>0E4jhA)^n{N`M)kd#@2kHOTW1r!CzNOZMz7T)%bKBy zPz}~`oOuKzEH5C~Bi*WVV$Ia-F8yy?SPXEm9_kNU4c}3nn4| z(3#bo7%q=giGUw!kd6C&i}VPj{6iIee-8=&^CAp}gO1!)K6f);Yf z2keHu{0x;9vD=>SYdE|>JhfIB%EX=@|8L+CCJygPp#9~fJ|U6m??&GQ|mE=A~~Seol1A#HoJcrQY{GwnuC$F_=Ec} z-VY?Se4=;4;LUkS{F|Zo4^4zP_qXeOaU+*h?-bBt{Yd}Ae(Gzx!648=4$^9s^2J} z^>csom(V@9RE#pB?0D5@HoV|VG%)KH+fE?~sSqlMeOnXr%Kmf^(pgxYLo zEi%&m!I{17v8YengUluf-HACdnrP_rtS-6-am`W50J3;#Lv$fQaLUVha!AiX5*EAZ zx5fg|b>-qo>~=9WodD#)$&m+qR|`$_$%Gg8i&6$1*%aayfGD&f+D3A^SYQoB+x-xI z%Vp`+3|?fQbltxu4w_CNYJB4jb0(!i@#Ak};lNLIWtM;r(9{o*Gr`Zqn! z2vyRSEAS1XS6FItgBC9UK|E=Oltg~6(Ay2&0%bANNFM|{5*h?YJ+%xX1PBzcMuvZV zQUqf|I(C1Gb&8qTc-_m{=5^G zzQqjyLK6Hd>ypdyyrGHE?1PjZ;E#G%XsVbbON zOKpT7y&yXo!Vo^MDUHCR!uhykz5AhD-6>my6_>h1zIjOWF-vHyi?*XMRX%+(?g3OZ zmG?^$UBTvLvX^he#2RRcVu%Ecc<=GRIp=SOZefLhhKP+ctZ?;&cr4H{bhv=g3*8zK z(#hn-=A-*NVOY&^>V>g%P)fv>{#oeAQcUV)nW5P&nH=B2+BplDqJgZ$Sxb!wUk(8( zdbAp;5y`EkUo;=uu@EMFNP;SgcY>Q?Y?NOi(+#WltaQ!Sn-(vvK+|z)5m+zM=fUzq znpxUhIn-|#X3OGy-L7FBNanek7{h=Z&;oZn^r4MoByw#m6{9$2|OhuNkC4G#zd23_($k0O5J^WquSPoK0bj;iAS zEqcY|dhn;oGz`j9x2IDpm4EtU3NcCuE}-y3GuMd>B{%~X3ZVdb{;|#$u}G2+v7CRF zultuF7+HYzUcV(9aeSTY^{c0jcR@AgxLHdTuk#qg}5H*Oo|)SJ5eH~UBWF^r4nz7ABRc;v?=YXn@) z&(B+;=eG5CT)+B2Q~3C)^RG9x9{r}G;CuTO$GZdC`V2vy`jYJL6m z(nA#kP8~jb!a*5sInte#tc1e{&^eg-Z%f{v#qSI?zF0CTc%~vS^;E3sMyoMRu_-Z} zFI_%v;Y3e}AQ)xGrePg%p(p%gLsY%El=#Lj%~-c>O2c>*L(}2Gp@&4?MGlUA-{1FM z6Pr8~aHUsS-LQwB*Q&>Ql7E8aUvO=<*sHMwUz?yh)AVNY%hG|I>lu^R8V2zPj`v)7 zj2Xp65so%M-9=O1>&Ss#ChDO==NT_fIhXpSJqPnGe|L&j32_(h#VuS}Qcx#APc->9 z{WE>+ihO!n1r_6)fw8x7YMdOtt1Qs5FE68q>>=UTzWOPOaT#QF+O|%s=3?*1CuK58 zo2qsU5zl)*5e-l5xIa7lEi-|qMd4GqV!oVw=BOkFhh1?g>s2x?K^};e80U{f*9%`+ zm66F$Qz>YGsMz^T{_-(fQv=P^pdrgy>cmBiEbffZRanILDqnq$%~PMoe*8maVvbo{ zIh*jU>^!7DvryBzBkFO~zJZSIq@?wsHwU5yZ!O~O>+%z${mFKT6k4)b48ghL%Dz<^ z)=!Rz`$iv$8&)yhM>puAy4llgper2?OUDT=IVat8uar$nsvT}Rf?o89~SG*>= zOTFuPQ*bKduU}pjA3vmJe7NyGYwma?5ESe42y!AEHxGv)0g*`@(=HYo>1&fuxEX>T>P<3BWAiw z*qmd^dBOd1mNSj-DOd?&$v9NJ75eYQO`7Rru|5YtTE2o9rSaA8#70V-Y|qBQ8!i8X zy*H1iy6yUgOH@(`MVV&}q)294Wy};AG8a2zD07BQDj70YBBcxoAtF<3O6*;R$dGZ% zn0X%eX20u)uKT>M=eqCrxv%@VKhN`i-sg|A)3krXI@Ym<@A|HF(7ltCxg_MyM@~23 z>sK63&f8~7Ip=)h#M_4Jmb`;m_ zj+J$Q?DtOxa3IuiST6Fj)*Pk6Q39-cOohK?D_G@kae-h}?~qFirOch_^HG+fE4yrU z3b!J*0Kr*h$djAGN$XL;&hW)kqYF4{d;yToK7#`VpK5zf&^bZ{IyRuQPvTyM3a{0k z-UCJ9Hs|C85R%ph@dMAP)s}YYuS5VjNG~=F=HHAg{0xa$C3O7>!{yWInZHY+4~EhMdTvv~x4hQgFCx9-z}pSi z-V>>z2fuiUNF<9(kTQ~dEkfS&6-3SpyBAT9GP)$-`Ukl~N!kz;vGV7q9=FWxP4;3t4Z`*%oEQpa(h6nO5d+!~MaTWS0!i98h z98q!y#iHz=nOq)_0&-~reRtBq5f|RJe2#RgZhbv$#Cu2%TQLnzAROk|4-(KJa8T}B zOG*38+DT~QE$Cwr2zK593Sip-D{6QjPtOC;hhi{Ju`Z7 zy)I$n*)#KSt7qCn<@+I{{Ic6dWj0Mzy$9Y!<4+2UyhSsTi*ALch!Fo8IfP!IS~m5) zOBk=M?bnjYU^IJB&~{>XPVz;Q{86z8ItY1FkuEsIdHq#!Umpj+CQ>~kM%5Vrn|;@I zn4Z+Rt@p)542r2*#WZ8!K?*rsSs_|GV13>^N^xBx6`Gi}Fy!6ykhe2mw%;wu1y#*9 zD~Mz^^2i{?NjlZCUuxA%6b}v@4z5z)&PvfnC$!sB3D}!$i#wA##z9@}u3MZ+QwgXO-kJ-BD5j zs-*1L4gDY0EtL6U2=F55)Y1g=A%IWzFsftEuy`5aiH-tPVWm zmrJ1Y&^gh6ICWdQF8pFow5r<{Qlq+nAT?0YVx+)PK=;Mj2KYeDfpziAc{q+Jh>h2A zQyh27;l7r3`?v&n+aQbI3kVbfK0#}h;BPxvtO<~OnnK}GsJ7w7CY0^Y73#H2^}hwuO#xxfn8MiM zW3IIrarH~5)}WRL<;P#)73h`SA7rQj)>~wO5eqF({q2y(eSTo1!WbCBmEc8J*xqSp z7>J)h%Ag1To|IeD@Me_ET)?MZc&mjZUxsIU3)P_9y(MJ-#FPr)ey9SDgn(m+t5=&OWHlOP+?! z5jJqo2B_c4!`=jsws6^cPurD(TPMp9yui4`^&A2rgA9;|y=66WmhB-_Q&c&@QgRFC zg?9m1N@tkJ?@ecOZ_|O-!5?04_a~f$Oll$sXe-Klz%5Z2? z3YrSzG@#zdi!`hvfAl}tS2thi@2041MI-vDM$No-Q0aAN~QK-1=mfs#sGh7UdVwRoH(Tzeum5s zo=uwMX?l>v@9Yp`A7UZ^@X+NX<3~`^8HiuxDR|kLF}k$Hz*!NxlLd{wve#LORNLQF z>woxG2^;jVt|bN1PsFR(1>13N>b8aywNG(fl5T)~HT^MY+d*poJ;I zBF9bNc(tajYz|ZEMCj*ir$L@7AQ_#j;8uA5q^cY10RQ|kpZnQ*nKZon@HNe!#@@jM zxa{P4bVznqme%Vex&lztqp+0Vp=?hdgiQl2YZ6MwdA^Aa*y+e3*Z{!q z_qXNwBlhe)>?UMQ)RPrAZEKF7)8X@)Dj?bdgf+4;n7|^+8|uQ#(KGiexG0slPhZ~l zpu$aohT=sOz~TjEcYdp1J<$}~8B`LX!VwaWE6~V3=KLHmCCy+*?T~rNX#0+c<^adc z3_^_|a6jy^!-b#?`)(U2K!?zt#6i36@nw!Wulm}zWZ#}xujs-rNF;GyjQ=HqgY8Dz zf&e%Udu*e%3yPK(MRSGWt~y|z|B8?M48Br!jeLiba!x8SJBjvpyzvTfN0QLGDAf0kNvQ>!md|LF{|>gS3C7HRe*hGk8&f#h^T?9}DOK%q9(cL&Cjuj5ChKjB4_`Z(Cg ztVdg>0FlL(-9zB4`x(~0dD$Ej00zVKum7aNic5=1&n?G9WZZ89vrxK!CR%adGT;3U zW$=*1qwcd{exlE}Psncy@|Yq#0#!lay8}S%F(hW0lepM;!L!jLJ!DUnLP_g%zX6aW z_ng{_vs@rI_ClVu>c2V88WmrjXbs+!pHBS7_Wz%gA85yE3g+lFDyh!{NO@`gbhsn)6ikhg(l=!Hh)PmcO{gExd!C!$#Xt^3c7@AfF%xt z9OEkd+oe8F1^Q&D78v+OG;pZJ!obKc`BTE=W_$Qh@v|nNHX{|?wZz+#?NEZfTlLO) zGR$@FucEy8w#o3$$%}2ii-&Gz1th#}`1m-SixvM<{W!l-q!$<|;W#32z}HosMZ{fr zqAaZ(*6Q;8^fdMB2d8F&84c!kE#N}V^>Ipatpr_36B1Aey>arxT3}>MhK~YEW;Vkx zx^&l!pQ`3=LCmZtKpdnmp(7QlW!lHmrP-=p^90`|Wt$ZxnBV1{(IGG>&ow9yuqPkq zXq1bN$$*5OZq9egaxPVye@=OFZmMW*QT?%j?~~X$nA3Ch8W(DRg73^@VCc`36A4;f zQBxg8nDO|;2K#dXZ{lgf51R$7@ZYlb#V@N?CrOawQh&6c`fkJ!$037__v26VwYfgH z;7SbaRhgxmi7vK`j)Brm*5aVwgW=&E|AQw}eDNinD=lHJWzD&E2|V^@v@-J=%e@kk{i#*U-ABNe!cwFTuR%@ z;Ex6w-{)cvPh!ZvE7rf>{6dk3Ym^Mm^!)&Cy|23QLnScVwI*t@q`v zuis@#oWwb)4``_3#F(3A*C(KVSG zlbxVP=k^;ex<*w)9r2kgieg;VvADzh4m9RXv8vgs>o!D{S|}~>WNeg{H-=k9+UuqA z+czG@`Bq=Tycfv4g6)7QQ!eMZGeV%*XYv)e*LFyPfEEoINh;VOn!Fit1i^K$%AmLo zzcu8PH`LSI&3l0}+r}2=-a!K`v@;N2BU{6UV}<3sX2vX?l&+~jJ@v@-EMa^wgeA&X zMP^Azb^CJY0E~Ow%ETV| z%YG0aGVc+TXKce=(C`@RbQ(#yVeI7$Nni>eUJTD+NEu{m2Zt$;U4N zH#k#z`&S_EaUP+#rKpzK%SXQ}_|5=Nhq!|zmyrSyM>ycD^El%Bt5K<2nkvHfzN(OV zsY+ACM0xLpt35U1g&23ETl^fj9^KQETGd+6@)UL8<-^*`(JK)Ck23IbXlEQpLSay^ zjr+f3H0;bN$;O-Avw=!Eg!_s4aO&9RBsQcLu5Al}g-#nXMhF?=RRk4{PP!_j^$`c5 zFHm{`)Lvwph7*bE9O*F;D4?ZkeEH1-NkGZR@+W?>e7=uM>P6U|fVUb1x9)uYY)_0L zhe+<>#!G*ZagzT3&t$xnHb5NKl=P>64Ed%n19VaO0MZ%F35mb}Y)GL`QU@x8HAz)5 z5nrHt2Db*%Hri!RW0TUBR` zS!KrU+|15vN2W6y5Ml%?G7k%!|Ks?#icmW}a$%+J#aoLtJ02`8`0}JpUk)VBXFw)K z=;IJoA_y4r^q;sbU0`19n>~*p>>btg&&x=66v!Od7iHkILf$YSejs(j&{qgymO5|dh2Uyr@Ry*#)l91H)=O8n=M^b27L*th zFlqwVJDU*li+~Vfb#dJC3Kz2BN((EH&mlwhfDcfRp%YU8H9a}YquBNsy|?BLFxz4h8JCxTqLXvy?_1c16&U+b-sUg<0gYN0WE=vfKtDCt26xirYq=8+V z9CFJ~1QT7*6LfFeb@YqqT3Q&YkO-@!qX&PMmhf*WKnJG9O=FQ;0ScJMV6^Vvrc5G# z@fZ|lW2KO948Y7t2mBLDOZ=2}*6J+O1DDv~&^yE)z8{NKQXcul729ENX{RoqU zvn}JIMr+dPNaDj+Br7fbTuea}VOKl@y*BhJnmN-#xw0;MgB=Qre+-bFjSS~nRBo|Q zyRR-4Fxu_i1pXzT<{Sa}(*GKthS0wLB3@mDy@Sm9KoT+&$bctyZw#P7gQ%e~1vG=W zf7w@V8@9bYt|rklKMc(gjtqvkHZ(TYBGT6sgxXgjV?#G=#{bpf|Dq1VDM0OU8WmH( zJ8?L!gv`!4xwTdZ-jXPC?*IBRBv$xO`7xx{o$CUp6-}sU+a2(SS)n?Jt|RzhnmUAD z|JR58Cw8yyyTY>;W24>)W6+?}01j6ORTvT> zsEMXExtSw9>T0aVdOhX`x<^JKV@>gGYlT*J{NdQ_dA1tc9V8oKIceDM*~#SzQ^$C)YndpE@Sv|Xqrb4L z;%W13k8_56ts4e>#br@z=0kq(sXykQLdAyne=2;TM(nudcd%%wP40zUV_a%yQ~9vL zIrE;kk8ga}*tMMv&h4;V{`z(7-Qq_g$p@o3*S@PfDrY&;`vo$0T}Xypr~ISbJpn_7 zTl+Tay#6A(YdA(sxWvD>$Wu*9)!LkL$$G>{oU2jVX;)9JTZi-cS-OidGk#>O`T=jO zz`G1xpMv`b{lg_#!p)E+{7M%BxdH0@TH5{W`zDi#6?HgY> zN$W_$tnHtl~eMo!7#u6123r8LkX)?2Nw&?4Yh~_?*>y~Z~~F@ zgzXZSO~U@x@V2A!HCnUk7^{)j_VtBryM_(K7gtB)8zSlk{S3@auMry<8E3uSRans) z5pNsyC@^ii{kCy@U+~ELptYzK`8uY+iyp>^%)fNA?z{qX#}aK~!^BA$`OCdp1g%d` zSJpjd$2j3&kdYGns*vG(-g3He4q)3quJUnRNOvuZD0^z&|7wDVct%yzQ99n-+Lt7a zQn5cbGzh05hIhwg69Z`)QhXzXe2-3eyDmuE657trHt=bWL;z{#!TS&Hl5D$f$+!JLw1LNW@@Fl} z$fD56?q`cxKKwAYuYq}_`dm#*3u)n?UXE#PPTboZ!qf1fI?ENY`<+g;Q?!NvAY=w# z9S$#l9=;M4+mPx@&2*vl-cV)v!`<%J#8BkCl1RV(8Z@Ull|S8%y6qZ`I$mS8vc5qM zXhFyU?HripYhD?d>+cgGqROr}0S@m7(kKMpi1CLF)J9^(X1{B&C-E@rcwm3iemK~| z!y=R(EBDCCayLpuThrN8Y`Y3SI@yc<}J~ShsMAj-+cxsablwq~`(z4xLq{%$f8q8hu zSgCG8eOtlrT_YM-i!xgL&_) zz@$=7h=xfSd22!>m30;J+Z!Cg;4!^m2Al1$yW86f+lo z#90WW$F8mdQ1S3#a8)d+928p)#`H%V|1jtTB80inAVNfz9|{j4^R@0lR&e?`fD$9M zofrkEDjY|GaXp%R$~VC_dxeh)d`R&J!Tz#WFuEjv{~-eVyhjT7+kW_S9Qc+^%-+U^ z%>GkE*TERMC^0F(>Xfgb9TLYAZ5o<n|=E9}p@rZpIjcjk|BtrqtrAi&X#g zJwQ3{zD}Ha{DtT8-^8ZHl`qDz&A#yrX$XO1Fs;bf)R_eqA;}Z{9jA} z1wQh@@1VfuZsFCtLW&DGCAHC1+SK;LpCZ&B#h4gqY=fCFaL&kG_5A4I%k(=O%=1qZ zmH#46hJP+jz}76#>b&4wyMcML0V(AQ`N2+wp~i*A`{0X~cV$^HvCDxEE)YBd8MlUY z&mxZFU z`XA$l0jG%1fc#MI6X1VnvI5N5OwK4{yrrK<2(W4FPFn0d-rXmtP}U;mL}a?X5Y8<0C~WYJQ)m$BLWO&igbUv&wyZ`06C8r3XK~NtZj*wQm6cTP1@GxG zE4_`DO_uvO_|-mHj(w%QOEygjBRBfFpkP6pBZ4$eaQ_NN`#fNc`a0-%mw-!pyxX7@@C<&axi8u+EqPwWb^4^cv zFU3#)LqrwejlE~YC`qbb;tpg1PI7uD3H_S?U(fPF{7%v0=k^BS2&Dr zUUn5)tND8VVsW977e=AN1WwK;rc0*Vr7(a6gy7;~>KTu{D!>fEO~Q=L(77?qYCx)2JuSjdZ$3)|x3TgPppA^5Pq5(5;Jl)L@M~~^ zDpyF*UyC{s=|Gz42yh(frh+({*7c*vtarqM9K3`Kr?NWf=i63!crH-7TH^PZ-$JK2 z46Ja&EQFnAU&CS+?>Nm1%e;!-N#f^C$vmd*AD##j-w6|dTIX@hFbjK-M{pxl+8FQB zVNYkxM-&QT>=v@aX2Bf0^ZEA4qjDJl-kN8YBIsRf^A-asV7wqm2Obm|r;X%Q&`NKf zi2!`aH@aCIBYP#swr#^|InDaAh-%5$RtU#%1CR(#{Etx<`~RFN0njexJpp0;TxFi# zVbShJfan2A1gSx9Z%2vA<|%>eUjbUyzZ5-q3;n-E4;>yAQ!akf>0xp0b@xxeAfUY< zOm$d;FK0kmR}nz5yq`!HCEVfg5r$yl6<=|1-6B z)^?GAtQpp>@o8#CfP?J_7ajj`Pw$DLsD+2C(~!`Ht$GevyDTLzudKYGZEI~+_LZ4^ zKiBY_ZDqxb0~{7$rvIml9w#+Gnz?<5)spTde}>4%GfLl=egg;Zk>~#*-f{Qzvvx`n zI}6C(3QfhZ8Y$ROc6-uh^)1ru3zgB)(ZPIjZYs-(;H)ruVAO`D9wCh}VXi~xm6a1C8Bp{e zG4~ydbL~dgsu=8HJ7EcDjNb}9b8GjSP~TdZ`8wY9r?vTQt_d~B*Bvi18Ol8NdvXzY z3!YXZt{rO}>p572xPY`LtW8NhNmN#W-(8_zmi1h*T)6~{QQzR<8)p4Sm_P6H7~r|h zLK@b1+2c1CM{*ie`{p#%-#!147!J(~=420ZRU*Bza~P>(#8{<8w2-5YApJ6AS08EK zXkBu`seX9Mjol=@Sl@h(v;b(7a!YoQ-~E#FDPZ1uquGSbb@o1bia zyDyL>uch7x&4tQ|M_>{fgC0$$mC@OY9ZM`Z!-=Iqj4;~%Mg5L`tk-dJBHe2igK?Dw zT%gOZ37>3p%n35b(e=UNw)b2n3p~Deb=51*QM5+6r3b}sV?~d1Hz<2_-S##rF|PDd z)x9{RPi`akr@FF=zF)ClU~ut^%VF|buL`ytq34izvBC53B>P}YZ~em2=`7Svh-2#&1G+x{sY@Q?2Fg2?Ew<@tGL&%L3%!Tlo<-1_fA77}B&hr?vL} z?U){RaFB#)9DGblAS_{Huv#Q!fL?gq#}v-vYyGJ8e%J0$1G9SK$ss=voJn0*Tm*7* zDtu<@bNl<1gv610mCOiXUevCWan$h;H8rhb_1Hyn|u zPSmMk>Zxtm5mhpUC9mg819gAoOXx~5xxZ$v;gz`gZ85gFTv1f~BHx(K$VI}fk5lEu zCdI%!t^2>v4FyaU@%ZIxIr3Ic#hGyNV9w7ZL1!6Jhy`uFnOGXZkEKY>fk5j2+<3IZ# zr;FMVuI0qact-9Ed&N@cp>MwfW0<^!tslpz_QNx?7Kdik>v5FcwIlkV3L9>YecyHQeWS!J2_js2NN6BL;4*!DNO z4+8pOfchKxFdH)XzneLPE|a_nr=r3UG4!Ir;vLGZ<*MBZ5KTt~XF&zA^Wu#)06)AA zAWa7wNe!?p|4Cej%szox32$|>IDR!H4g6s^K$2+n0!sKDwG+1#dIrw-1R@pVn|bZZ zsm}U`OyH#65Uw=;vTTFx(e@>$pEvuKO?c)!fiR*rhPwTzp4c%p{^y6*;EXgNcZ)SX z9dd#eXS`SZwWf%S^#`&@<<=qa!8VisSgxBTtcqugdzZ`9N(WwT$EIB3>4FRa##l5Z zjb@z%iQKvZ*b2-c!T~6tgK!HF-ofV7xc#d*e?qCq)ru+8fC1#}HUXsIT?_R2(yFW5 z>@MG|-F`=}Mz_UBV@MZY(5Fg#QUfv{{ygvC3oOhx`e({Jl#>z@>Nbh8BgGQ<<47Z9>?B zc)xCu_T@~Q|Ds$$EZrGYwfCtO_pEYlGXV0A@V~FIo03I}gR={MOOM&Sqj$C+T!MzV zb7|#kzgcG!&qDb2_32g$5J@<*S`Fv~%=HG*KrXP67y$DXj?;Sy&|BGw9hl`P1QGo%Qw=d*KUv;ys-&aY|9Hy4d`ZP~DneO!?LeWifdLPswq58Y(g$njP&+u?7KMcmu8 zBm8jwZDMnlQ3Wr}0~nX-4{`h`6S_+$Jpl%f^y^QK8=GDD?L-IUgX^OZm4_jm1FHN6zlIZOLWl8se-0-~fx{60y+w%h z7cn<{qzq~LF3Mb z`oq$IXrbtDPe5xthhDseA!KHQf;3`dEP&$;^A*GqU~q#k^`B7xKOLyGn=L;bO6&D> z?J1}80;qje?)l7hHO?Cf=g7q_?o)>D05DnkoX-#(qR=*9C3~dWRcGl8Oox67SOyK` zIv1m;315Sq3wnD6ftEiOZ=*g3zf{G(Z08GQ0zo;pPyi}n%i4+rYskz85i3_+7gKY+ zYB-0wpV9UmpkrCU{_LQY3TM<3a`)*Z!*Vt4cRB#wv@<<&C%hA=Dk>rH$|MW47BS~w z$W61)5Vj)B@Nwy6CFX3$=F(4;0tlH;2%wfJ6N^ zXv95UtnEP?7-R@zuVIUV@!uqDAz5|JIoKTD20Ib+7TNU*a%^P41Y)1^f1aWC?|3pU z2T*fXgBeT@wa<}ST=X@gpW zut#<$0FDJfL<}Re+8}H(WCT0%+aTDzFivB`bo!g?r?*DjwAG%K@97mURfTf^Q@~8Q zB_psp6MQJ(#wEng0UN#eHOmjx?jLWu4_KT<&Rqp#ugLFnLf~slz}@!p87T!)`&A~*DOQsHksw~lWQb9DV|x{diN1LqeG>PJWMjJEh!yW_aD4$uC!__Y7o ziAq5D@e( zx+cMUr*-nU!dwld{PssGblci_ndQZ`<;A}nr?EVD;x8$g_1@!Fl3BqdzMMDuEyi3< z;KZD6>usqVA^TTcUN#N77nJ;*V&)jT1E^4R-xi2ZsZgh1)2&QABfZwdB=Td$)7HM} z?YgFH$G`BJIq;R1;PQygyIujtV|l#->p+{${8hoZYAn{5h{wsXtaFC~|&DBE6*85=l zz6*7Xq-L6dz#B%PUDI{9lTEzexzMfLh-nbJrcQJ^Y{y?iHDNm2f1e7~Shuj_H9W3n z6cuWQb6CN-r-?D1hX&)O1lRlwSAS`9ga1YOSN`3My{g{#sj!|XT@j&Wy{i@90}}lW zrx|GAiLb#E+n_5W=#3l5KO4xpo{BV>^Vi{rI_S!rddsv}!R79z9gHN$?exaHNe|(6 z1<2b=NzL3?yU(tMovZvT+mnTLLwk83-#ZEA%zGBDw>l-t8T-Auh7U;GhTO=R-P3A4 zTK`5+xG7QLg3{WA`ATuw0+W{@+Y90=_Ni9FS48qyDeF8143Qt39z#gOPu1BHoLkNn zMa8R@r3YU7%|L^ZVg}(VhQL3&qTa*5&!|wjoHdt>z6B)y+y@)`1r|&KSul0|53qE}hoj10GyG8POvX7Lw)+4BcR0n-Ka2(f zo$6TzJMKOY#aTb|$)>jK@cVp8RPvXMu#yD9co1mbdG4ZnuB+6!3 zW>z*L9Ik#i%KM1zd$OJ1iH~lugo^dBXjOIa>+eCNMGeel0jyRG;n|P%!Hm1_c*J77 zF7NyNU4W6~dgjVBL+C+}9xb;u{3{MRaW4E-{u6kt_ps84tdOV4N1jFjv_Vm|Wlrh* zv>IQc#ENs->@ziVv{Kv7o%7t=S9N;43Q{%qW%fg|k_Tj>|(IwX=*;K91WUJn{`8cgA~U?F$_ z0r)#@6O^f;&Hgn?td&x?h~TnYaubPJ(n+jPzu{@Sn3>&!^^tsZebDK&ITFAys#AhFfbCX?ZjY#5KO951di3 z7r>slu{ZM3V6=4>WcpH5#nRGB2`tMoC{l;f=UueyZ=HIFnr8ZIO3QoZ`+hP>YfY=E zN^>pOu?LY0-nx6I+M0h|5-!JNKYSLDUfllrQ3rAA5>vuiaJGk4|!2i#;Kp#`z?3NV=@sq()># zhOfGK^l4ntlT;e~zIH*X`NpHgBMB~K74skcZ)gQy>8aGc+UdkEBwT(-Q@}Smv*%{6 zI73uBa1YS3eBQd;)mOX)N7^;W<2 z%sOGmnLTkg)~BW-5<|_dl;nM3bRu8pu87KdUhe!j<$;Uw)o5e8dAjNO&{P)jPi~RH zKKH(asy*z?Z4th2f3gBSXCa1Z`0#WYU9?l`)+3+S>>Z+qvitikk|LBM$MzRLNwHwc zsfj3VxI0EP{x(CLYcMt0<08GIdSAMBli$F5Suys+aps<4IeL8Vxp;w^;m^HA0%9p9 zBI(QRG&5t;k`1q1Si3795BJ;q&zXE|)Z|aUCMb8(DD#?Fj{w!-%k0lR`9Fp#zwY)Fx>aYDXI*$G> z6`nqCWA<<+!fDT}fw`I;DCgR+jw=Ea97m>PE)Rk{2E@RA&(mWiXR^8BN`l>DYlcO!n#XioE-gV!n^Md z^cV&aGFPe#<2cy_x$K$a3Y9Tq8j3N+G_VQ9&{WUUZ;4?2Nl^sdlM_?FPe#je5tjyp zF(-{a8TGI@RdINp#vUNo%@Wi4mPls43oSS620VT>|8^oTIz8y@DV?>F@VIvEbb_}7 zzg*i=#rCtPd$om}<1dJvsNGY9sInPipNH>n&w_U zEK`*537JzLkB}Xk?7lP{sj}zp`t*HOC81PvsHIB$lx!Ww{I;d!I+5;(i$-ltr)fek zS-;UJq+#%4vk}J##$gS$zJxWo8?QLca-urKK(oBL0Cv!|$qxAlCj73-fJAw)iZslF zB{q#xNh>Km&HQ+dz)+fW@vnj&>_^@Xv*ux4&oNa8*LaJXPgI}X{B;t%(lE^-iTNQ2NlVU7MFNEMh1a;ewicQBs5Y|h|_&VI8Q0Ar;h zeuEE=D(R=h=GzNsmcNyKs{nVUQWEePE+`xmp1;Cv{#|H!VVh({A?}N4?A~+k51OBK z@U0{l`Q0OfHvi_4+zLzi`vBwCu!2 zSdAoH477h|L11qR?m2a&v}mULYslSw@K6F#hVTX~!9kRdI$#-I*;nS=i?ZKP_mCq6 zs#EAs-r&wOc@rH#s*|fIM5?RH5SYKbb9%5b*gD_rf-Bl9kL!XHs-q+MzPv(xKf%eI zCco%~MWxo8-Io8hN}OxTSj(81`Zr;2^ztG-xxEJL&Pc3}*cH+Kext)TL09D8|J~|v zfr$y>+cYsa3JI5Fbo~P=td}*c2`yN~t&D*xOmJD-Vr&J?eye^3p8`)hYX2#$HWYSx zHKe5m!*r(brH;p=-lZ>TiC5Uh4r6i>@_W-x_DI3c&mu<6K;h(K`p#%Aehu1hNJfya zw$mPcRnzXK<8%3J%Q&AGI*P@k?|ReL`NiMh>&zUu7$Hxp(SA$uLeY*t3p5ik(#YdL zmZ&9zgFvki#CjSYEcozqpEqLO%IN4MFbmeU@av#jkWH700`JS_Y%1&?u-$wQO=5cR z1-yqu?co3Smh$}u5>(_m8ANFoJfQmkiyO=ObKP5MK=>RqSRFy*(W$kkhiS-qGzaz zeEJb^n@YLSyn)#u6C_QB6mP@aFdI%MSGCUJW%?54VpKs5n%nNN#4#ZT^)iA& z@RWd-rA!{JoJuG7I2X({fH5kxhM#%D%PVFFnT%iF$D61g&;A6#YHVZow&E%hntQvX z?rfwhsUglSpsQ;dj+bJdm35pK*V=jSx)onJ}IG1)iR$jiMw6`Z@?ZsX|_*RD*T&^`zedeiv}3Lwqbg3Dst zy89fQeT=3%DJ%vc15Se1K!cT4fagHe($Lic%rk6@KL`M#CE%(J_^iPAS4-0jpZ!z~ zYtTX$RZIg;dpt>P!xTvA{Zrr|v6iP^5*3&4P^smsQ51Ds8{S9)GR#d7L}4_Xo>aa( z&ycA&9PuzwVo+c?J+v?!WETeZ2zMwd)HmbKK#b~-&v{6$IuTvTeB@~ibAquz`U$r|APzd?l3N#O_R-O83mRYUqi5i0R4}5!T+gAu z6Jp|lySJoU`$o27w)?kuW-pKo&7y@Od38A)F6$5*ncP`|*0=5e+y#hLaGdfna6 z?l3_uu8O26T7jK>!$~)j#Tf{OX4E<7tCec>*=Y-nyFBGyNU!5P9R=ooSBd`e;r@)u zw?5u=as=fi%Tv>Z80M>pVNSb1?@GX{{ce^IS@m&3vi$HX$ND3f^v`Tnc)V#EB)jHG)=;4u(_`y$sOKZ{Qpxz>&aNA8Zl z8n(AqbzglJ18yUH$vA4j2K$IGz%NC7MCDcHd%*BgT>Jq18f;i0Bnb9@m18Q#7bYQCIK{r%_l$WrkH`%2-5c9*&1nu}}) z*@X|JXDN$5>jCRHs`4FKe7=wW=m{XAPn<}f@zK%9kX{vTdwLI1fuyn)KG^jy{ZI4J z#fGcbTo>WaPyK`+9w7GGegP2c%7JR56O5pL0?t|a5NkPYSA8UtCE;)faSG{L-KaR}YvN-ZtsZK{s9se(M~N+!bM+_+*H-s&!N{2`emzf8Zo8Sx6R&cz7k%|qlEkHU z^vh7@`bX;gudR=B*}vc1zKME!;`3z%0|;-rU-FB4UnWPflpBN=!3^g%y>qKHTM28}AHTW+aOfHR(Bv2bMf-CB*4k=;U4!vB z%;-f@x?v6Dlke+Xm9zyP57)2bwZ24X0bF=!`Zo`XKD)o{i)S6vIY;Ff>bB`!e#}^= z$IN^+b5khR*fl(*^DL#mweUNl^+5X3Yq$%Kp4umIk6?Lzlzvvgki(W`KQ{l)9c;MQ zsT7(9lpjD3P3rR@6)ORcp?B{9r=*a`EZ1BnEezQpx2 zCUdj|wnQd3hrl}FC zep9Y%_JQ2|E4Yu(a<83)-*rDyPk+^yWeH1+nA}OPwS~6N3;WgjxR-^V)vNLPy?YMj z$FjwaOT9da4mzjem=rr?Pq{~>Fntr9k=&7Tt*LF`a6C(>d9qGfj%hgI@(S5(nK*s2 zzS~y<(hY0t{x;Dj$FF>e6UFVzWeP^S@TesVl2k!HGdUaOwq#PYclJ{07sbVuQu3Y2 zL@a9Mb52%^$Mn@D`yYVWeqJzOs1aPw<**T29+}Ps=g-S6&||V=htAZg!69b^md`QjC!6AbCPC)U!5H4qk2szssd)Zo0U6WhiuP1U=k}1D+osNEhD=rIOWgD$e(j z8yQeWS4>Zf-@t0@Mq-rxm2Hq$zWNf>fRY6&BpU+~CBP-pD0g0{fG>#=M}nwUEO*)p zA+A)Qek+#xjtk)6dm>JN6gUSUh6q-*fhAiS%mO>-oDfbXd{y5|cAV&rzctY%i2R}CVbA(SMsKL-aTMB3Wc#`9VtJak{WVs^+V))bO%BiznObHCI6z}21ZsyBU!aE{gBJX$%oM6>wEdYWN zEH65wO6K*p)!ImlLTYUbFF1$Gg^N`c-3*V(i0&B)b?{8+EA`WUtTeY%P#*zTn3jz@+c^-q?*hv!)Lug zkv$_<1{q1myC%<6I^DSO)^o5*t>g2>0RbqNx}JxZMI=rYj0+ZTtMG4@Rxf5G1*VIK zaK~OzUJ}_5lRbh-F_=1AKJD78VGJw$XDc9b`D-$v0t>4-_On2%+5GTNz^q<9e7}4b z6-LfYZ?4E=lO~q&%$FN>NcA`h+Kkh_i zQ*OQ5Ms3kK{8+)`A;26(lP78sy>UQNDX3Io*VCg{7}4yz(vMp2lk5ziScx@kFJ77opO7r8) zU-OnUYQMT30SH{wWBf4G6CA&GRc8Sp6Dp0NYBQGD@*x{R!|Ad2iT;2xaW+#Hw zhC}Ub?J^%?u=eX{*E2hRVCz=axeJEqAF{BG?Ys%Rd=-lTn^%Us?yfj<$I6^f6Pom- z7hbFQmKKYazviv~gEGORYC1*E!ShA&iwENCzUNbcOd*~AlOt}VQ2$Vq-7uL~N-&UC zHLloy+jqo^*iI8$a3BZ(k0wi^b^iAQQR~toWu>pg%GQWZwf0;G8mT?*@V8w?R0{C~863|Q^iN(Km6r2kT=)>#S;5 zg`mr6fWG|kGPonK!(vWG0(827FM7`$rvk94U%kg{{J`P7UJn*!ivPVPTd;BpA5JJV zN{|4!(e$GmAVW70%kq!r`d{B+8!8U~fNv9(NGSNPBOdxZ47N~CXjsuS+qB62D%*yE z^{}yFSsiGRrP|uN8-x`^NpX^|oAnWfPTj)~qMt$KK5T|YVA<0y4jD(@W=%;-5F5B5 zT@sP96C6|qsOMi2%q<^?;9-yK*|7i&(}K3pieS3}%xb7b-LGC7w2hPzT@n2g!=2m_-Fe*bkNtiT)!rgFjlorEqL>OX# z#&X9xSM{^+kh;1|JWtzfS)C(2V0AQ|Yj9{)J!(Cf2qY>?`X+(m zaGDN3gU}to2at@KCusSt-u=a_(-#)^`4uZ^*(bGCMu*;?7)yT-Q z#|zZzvkNmrPCnuOrb;11p@>8jGMs}- zq>M@Ck_HJWW8y@{1~QlFm}QDXI5@*^?L*)Dd)?RlJiqIHuKV?RUccAxk4nz)*?aA^ z*IsMA-)n7JJ*g<)?7CW~{9{$rK4WAv@i5kS3b!kZN5Y9y>aqVmOI~8zJN*XO499*ciXs4>vPBsb7sDs zRuNmp)V5@vRh?WM@uISS2=q0S!QzDa`NOYW-O2XRO#Ia0D&@3n!45te_A1q!Och$l zdN?=vJBE}eH>gdcs66E1a+V#8ocy{gN><^V zyyp_cQ@>^nMiTUoeH4DE^5YIo?EVKq@KmML+P80etSp{4eC81hK5#}~GSFvBuSsa1#dFD^ zx47|Y?B2u#?%}F#_F*FepSoukUR+I0*uAK{axU7djbr|;Nxu?Ap60f7N6O0?md=be zryFm}I6yV3)B4ybZdd0e?C-4OwKP%CVDfX8Q7(DM^~qV!V;QlYU7PA~!)|1z9Su?jSMJ=a^Q-)yWSOifcs;zT8z@~aA`p6Qd*04bP9rG8+TK-(0I<`FSxaQ_Q7 zM$T|4@!H*liqBu^aa36?mx~*fGF07ZZx0T6Tn$kgZuKRB1l9M z!}wexf*1yf3J|X7;nx07*ImL|`^a?*oRml*R&0wcB${KYenM`q*&e3-hvfEmZv^86 z4o-#MP+QEN^UO7gM7D%#1BfYw!9NffkkuMua$^0;mA)hILK%cG{l_7%&cc;r*<=pU z(D!>b%VInST#X3I6TZxIJsOfd05*U8pwI%Yh-&1Rt}{IMJ48<3YK-Ur2=L3Og-`QP zSS5@iP@~TEq?75N;+6RTFBe@(j0UeR<{@$qG?F#pJ34OV~BfA`P3t%51__MKcA6fdwNm!Cu7Vz9d5YO+?@j4&(T;5@esp2GCpc+nm z>sYu3%mohmA&R0ll-d6eiEFijzZBwWHncrjvHv_#c{BJnA3=SPP{^yCA1h+y(pvYD z*v+SwTIzVnN=93L^N`~?OyUt*^bmnnicc)pY{YyR>{M?&fDRQa$XgV-)iU{RoR{L0 zZ2-3(}gpW&eNmI2S&wTWP-RLyOU0~b{2gLw60Yf7J-mX6m;;=aTv`9 zp&j?r0m1^!*LLUO?1i@t`0tGB^XEU2B=J!^{!)vnv@R&cGJ$mc~LqzU!4J^nW;)c(O zwlenb_hQ$rfkT}Hi+;oRS+L+EiT&DXLCt`&X|Q7Ptz2XiCRU-2BTAA{x6(PAg% zE~`Y_RNdz5`m|H(BV zKcEr+At|8n69H`CuT)FWd4@H4jleZU(#15V~0QEe-EESX&=@V#TO z<(HI%Wnm}fo@93ZT$tzeyd}Lody0$k(*8hZU|-d@;Q%;8QxH4+VOswmsOKOjS?Mfn zxuF{|7l5sT83N_hs@vJN>K3!BA|yQw==)aUgnO2y+iLK1K3Cq$*Gpq+gelXxHpplI zFtRge7W9E~Mb8Pusk{t7&?S*#Mh6s;LoahYQYEH0ZUL@r7E;P5#~p0_dOwH6_$u{b zNP!+uvRja%hXGR%!Zr8_%o81M!XW;_iYh?>e=ZV&Y*9|k=IgJFZ4PtuZ5d0Gh){Q! zB6X^5YT;DPm!eX@knrduacgO+OfLvem`@qg8vaVf(R`7|dU>TSLLk5$11uAj?I30U^>&^u*Bl!+(sO z{y!VLgK11BAnEnrmlbsZc`M2Ov5D zotP+;va4^M!#^Ak5Kw{r4yjz)@k#FB4u;OxuFJ=3>%J)=z9}GmojaT8DAdT1{^MUY ze6D+`d;_5^PhFEVU+CWBP9HMPRP9yLv02{5JV-(HPa-(%x20a4_JAeCMSgBq`?dg0 zz>fQ>;~o8XvuU1X;{S>SRa$o)-^ei;2N3str&rMj^s1EYE{%zklkyBM|n4QhE65+pEU*c{d_jY8~-F{fUB)^3f7~*p#F3#SRERL>{kvuD@ zy^>brvmO&AwR4WZ951&U3$Su&>lPM_7mPoXm8o2FOMbZDPo^P^pr5dAf?L`tVhOA4 zJg5}+EdI#7b>}t0C>MX^%aZ{)Dg1f*^du*{w4i6IyIe6lA|VSZMq? zv(@f_0VFU@c9SMjN>gLDrCKs z&^wcqb6ao}O-e8^RPgi3S5A3-gb`l8eu5yc6ye3h;cTYqj}$@5*T+@{&R7>YwE%yW zkjpbc-X(9ok9}SA=}&njB`?wCRl4iRG&X}<{-$SPkG9yUq<3z4s~>cW@lYGhQ+yV$ zWOi~Use0xEQ!IMyM(bAJ-`Y5Sb&id;^A)T@DPuXLlDkiM>Z_c7+C}Lmgx6K1>{Hwy zC>Z~GQ*7y-Gq<^hEo-%_OSvz{*O-{PRD>_36G@(0jhEYVh9xWU>f4LwLKH#)yj1se z>dEmV_EW3p18iS(RC&LjGm7mqiWlv~4&PV^8*G{&<=w8a(_E#nCJT4dVsy6~RYfMr z-tD}h#-clidS`#|EBq|SbHf(vpE>t4vhlt+^3uWGlRKtGo;vMOoqIuTZIi01{$ls# z+NA~AS$1|embbpMLhIGK)dJEO``cV(bd`{mGS zp-*2R#0|d~U^z|sX`D&&yqAl+S$)nm$@|3bn=srSWAfg+C%Y$c&6RB8R)EBhZ zuQ~D5$oLM^b`jM?J;8mvmkXnHI`{WIJ(Cnp`23x=>Y;6O`a<7W*D#0L((LR4$2txV z{Bs{N=}O?UFZ@e=P5foq;F)k=WCmX^0*+oGF4gqteD@8%bod)AKiO;^*eheUEy&y0 znoW za|pv24~cn3hMa-Zwn72i6uTAE8^Q7le!6!g`M0Fa3aM=?gojWoMu&_5nlSqiQNuIP zdA^Lpqaxxd(1veE^mpUF9PB)yiE74_k*}472vZV>QFaxc_lK@@^vgnruK$;>z=KRi z#}>SYUbeFmT7@Rgpc*v92DyTKhyN(p!Cb5U8$1#$8fPN>EDcV8Z^*Ca+@>;o_Q)po z1F0vr{aAcKe6%-M=TKoJ5RgGmO{MI5{5SvZEp=)dI&l?+F}n_s4>^8I-k^qAf+9n* zdzdu++3**N;C2F)di~v0A>66Xz?5$&K8PIKC3lfk^B9n(MtA@my@}XokrN>YE&`vd z0$dC;@OkO(#vUNA5EM2EMa2VBqQ`X(9ybn;K~mZL09M8O&yh!u zDiZNYj5VEXAafuW{sT-$4}cWa!C_K}4*s%59Gp=^EBZrEg;Cf5yU$2RtRn*oyjJuF zLeVn*OwlNpGO0r&bMC?Z?n@Ti^wE(21Z{3S;N1==L9NXUYr2My5-E5b5)QLUU zD0u&7w(kpx)aueb9R>wwE9=gneKrvs1Ed{Vbsz&&iNK0U2mLA7$mIc}t6L5!L(f4> zoi4s2E(F;8t4g#N$^t(nSuO_fGJqShDot`11ge8!Jmji7IejtFe?vU@_@r9FT!ZLb z#oB%HP{iQ0s=0q6@kX&g!o(76FTW>;_i(RXCzmJ<>)eBeij@2^=6PPQr8c928+L~r zT;?ShNr9M_s#v`l#vcbB)k?US@%raY_zlwXjTytcS=o0y^aA*=E=vEVno@blxw~dMFLRQ@F%Jc5Z+e@tMLxL21DOfwS^CS#l0>O1e`^{X@gTh zm{bH*7qqU|FPM@!^dU-;he1m3MLzsZP&E{a&}%6aamp+aMF8_Q%fh>n?)?>3!3QGU zv7rA~#NcCx^Z=BF9m>iYI?J~<7vv)Z%T@UdMJU`Wy7{8{nOwpXkknA-4BMx`V3GIn z-?!SmKEO8ntYqs0C7YXVXiK9Vg`Phk=4KvRb4}A52*Al)iH3xFj)ibWAJGJA5)v%}ty+R}y+9td?mp;@Jj zGEAU+XkGu0MaC5;YuN5b9IKD`ZF7yrbzjgxjN|;B{5aq|EGK-Xrxg31c3layKIG9i z@EKzo!d#KNb@g@d8Dk`7H`FI3O(q??KA+Uqowav%!{p+(t`eTh*P+0HCjvQzi1Yn_ zLEJTnfhnQ&yu%dLe0&o1ODf{d4uA@aVi*uVDu^h>N>gKv+zk(!XaztXizOrx5+gC+ z->ik~PwZVM&>2)#ti!cs5|k1h4=5rCg1Uz1$u)|lShDzo+{Zz|WW(2xoIdR2osjDU zGo_bMyHh>5h1`L{k#4_Y0sg{Ek!B8)_k#B5V`S_T;WOEWPNP%RqcBMCk!E?H_Z>8g zx9iM%W7265YdVA^9C@Fse00iZbVS@VG$$4D5&o4xEU@8hpY{j_obM@3L z+-iQL%I~W=2mDIX@OE36v_0@QcqFFREP)feBXe_zNxjyaR(F&BX!gE)&%TgQN$)?A zAD=w2wFd5O9WYUD#;hy?Oqxz`v6OiZr(cx<7=MiLFl0+a^It*AtQS?1Yo0)8>n;pB zVv<(&-A8!7u@Op~fb=yof2R%q=>>rDfDdO1qF2Qwz^bUCd=z}{FMthgTE$^h#%#|W zso0+e)b~HN;1hc$9Cm+7=$5@Vtt)e-DLB?cn+0p_yBN}v6V^NbNtYEHdE+zat|)pW zW_MoXUrr2IiH5BXP}#QM>30W<#$!$(b~eD zdFug$6LzaB=;52}?x=+m(i>SR9Y^}MxrvqlWjf)1HfE4f9SuqBcLJ-EXm3A%@!aiH zX*|&mr4xfE?uE`H?@bti&$H)6MPIE@ybQLaIR%Jh=$^Z)d zcT|}^rtI=m9|$p^NjQ9al8Q-MDC6p}bf(5($ zHMoo2^;cdc$vS~UzFk+uM#C|7{rNQB;rI_8+%=*fBK;nvsLOmydianzR)%dND6}L_ zr!@GhzU7mzx2J0jYMOXG3P$z{=NG#1l<)a^0QJlb8>(k&qYqy8mGAxq0A&$EPKTdWSOyC2>QfFiEg!Ly(Rcj)7QaZi)geX@q<*Ab zlkSxCKBT`|%_u$a3`gZyAyzF}Z?upLKdF(d|KN^j;QH%Z)fRwTyPt&7zHx3wMu&gsOzhswdwI zAJj>SaN4LU`HP{y==Qw+tf3%rW7-NG zG6PBTyJS4X+oB>jl4}Zo0vc=G|3!tOZI@O(SLyVqc>aqraZ=jul3rDw-Cdn3r4Xhq zlMyq+`|e(Aq(;(9(9pjd7W4<-Wkrb}%AO!plIAH;NO3XdoBFhBkfq>;0HWLO`^~;y zp1$OTFXThPYYY~*&;6+MqDAH?EM#fSMFMp+HjxLeK+vtT4#nZbp^ZcnmA{)G zpQ0`&pnjm{`a9>*W!j`#Sc$BOA856F)B>x=1G~~BnhpSEsY8-PKTtd zNu~^isO=8VjB=vcSWHSeT|DpURcYz2R?c*lyJO;fRG6D~4(;294I0yU+CALumxY{o zm5rgX{dkEe^-iDB782!Yv{VGa>y8aIiKIxwEdW_RMz8qS26wR;DDZ8`fe`#x4oMXs z@=-9;#o_h?kFS+uo3+YZE{`922qoLN{fT-|Hei}nfn#Oo^O2Qqv-k1vc<_L`PTgG$ zds%FTRlx6egDbm8Yir|bsYe1T9}YZpLiLygpP%&!j3B`e516el_7t?611 zVaaa06Hp^}A|BGSL_%*YWuT23ei6@cOOd)(x?!=fjuGB`@l^%W#HWpJtk?l zB=BH_0m4Tcd00eqvY>P&Vm zZch&a6tI4m+G#syh%rP};Ln{@2>t`OIBF}tH}8(~*H2?>l#E-cDB}^keGcj>&En=< znxWdPA2T5sck)u16qm(vfh)jtJfU@4a^7(U_q&0|-76Ak24{K?0Ch$mP(|Nv@&8=n zI;~n2NLZT(4+Z)x2C;2ywCg^jgUkND-XoxY;G zmDXmSvqQ=4tjpn`ZUF-A5el=^H83YS@;of|9MH^u&re%(&E4IdJ+lRTslV!Y2I4)_ zCD_#9y9JFgy-)ve7jsVSpF7D-u0r+k@0;ar>v*L@rn~$ns)j?U-Z1^MoQUj;;UdD{ z+cs4M`vR7eSQ~qw{NWsgtFtWU&>56~-iw%KnqR>6U=`V5V&b#`XuDguRs$uq2F3Bm z{l&*1Qr~nriPOMto`-zY%Z}kp(Fq|T9$RB~I|ew353akayQ6KVx8>dTG*7qpqW94u z&hHCiSq{`Q-t4?%X(XuC56Ahe;c7jID?@Acew?aiJ27bYUe?hzDHmt=-j=>H+NIS{ z-Sh~?D$*+KW{A9lf%lL`?{qs-#JC%vk$Ff8&OcAV=dt@X}ZgSAZxTLD8Z42 z0xk{|sle2i6W1`2Ey+FdCRZ8p(clZ*Zl92Xg*uE5(;CLL8Zg(LC`#o%u5q^p!1!ha zU6dn<(BmDHk+_W{^#e0~zvLw2^+th<3Av$X0q5<*Fd)9pt5lVM0Mav(ec{5ty31R$L3Z2zNtUOlgmXuW23Vj;!C%=4dYd13 zXQTv%+iG`UuooP&l7WyJx)aL03Z}Y}#XxR%WGXoH>G*H9A&H?ijPC>zI)C%VZB8%| zF0`_rrF$I4fk_=&Vx;%f8I=tuqP3iu6>`FJT6^&mZ zbK=<`aP@`2^;)BR?6c?M?@CKsLMJ@P*&UJj$Ro`kO&V&O|C)I~yz7gC=Pyfzwm|F6 zF+2uBnxKyRKs{L@3PB913kn#r&O+*SrbcZVZuJD`b)*teEF zqb0D;b+`4WwgZ6lyAV}YBRcY5Z_Yq<&QD>^`{{e8X0t*bAZ$+#wCXNtQ~iTddSZh! zX~G0sNb|8fYAwsJ6nZiM;A{n7bQ$;*3^4#%`ar{{?}JKec}!s1N2^gG0NR#+J?9^N z^gnW4CtA!1!A#DyXL6>-(@atYq{_DMH|B7JRcFN?)wCwv+^$nH^uX%}*!h~n%rq2qM z#=^F4gh6kGK?iCMcqg@s{^xT573F`Y!35vK*H<@_3VF9;kQ~}pxgT^H=6-?b-%!+7 zA=ySumq1ac`dWD7Khuo=LUR8!4U=KU+S=My?h&_o8C_bWnfxZ!WQS2ZIt(R9*CsxF z3*{vrdYEX(plk>_@(%u(fwBocK2;B`1Xil<;jw=uiS0szZ^qsc!u-u#@c=m@1WHa; zY|ekYHzL^bNlnG4lOJCgc#HFNH&IbqkvnI(93HeOWTQk2-?rEbTV)S$2MZm^5*=VM z*p{bB!;Q7O?cY?Zq{+D_D`i952cDVVf{~E|9emjVzX-CEmTXWDo1aFj*-RuB`Sp4m z_rYd_QrNd_ADiwph5dtb2qtZ}oZzB1-K0G}ARm=nycwSia11Me+y|K7qI%@(k+uXd z%>NT=XT7#e3W@`#2bD$=^fb%$GB~+_bOBu%+Vb`smNK7WJ?9q1GOhqe%qRnB6I!F2 zCaSPY|JFn0Uo~hlEJ~SLVu$$p-P?~DU!C~zjIBhSs9U)vtY*O3O%lWNvqmy9Bq#lh z%<4FuEl{1m(vw5XYXh*(R!&ySG^%h4lpvwDCP)K8r8MvK9jaRNzM=?8Zk;DrV50=w zfWKC6%Y(wb#Q)rw08RyrzhHdg_wSlNaTrm7Zq+T0vZAW8cuoLhK$~-GP)W!4$eB0b z*L~hHxU9%d|0jwJ`c7}lkx}^)HuseS5l`oNpM9JFbZcW>(k1@&!;RoPK_FfVoz3}|=aAdSGI^243`w+q5E|_A>)_L*YA_mLgpre@PkpFi z9!l0&gY;5RR%c23kMXNg9*_lIo#?yez79Jf0S!;0dnO+Ll4k;|w0t)GFAoXeOGD*# zy5Zu`31D4~jaif^l!!~_MT(OmYkvjHPoA0 zC=O>C&ZrES;zb3#o%eMVqT_3cy6X`r9+Ac;e__MznfU^xHA_8ssN&xDc4t=BtDEl6 zKg=r09c{l{kbQIPJE47Bov7T+Z6$FE>a@#VF-1kctmodzy)INBObljaQ)&rS^;&1P z{haL^U9f_tjN1SnXS!HW8q=)@M7756swEv6rN!P^@0yjx0tLC&L0`u5ZG?$4_Oo3? z4%1lgDr<$slH^HK!X@hv+>r;R6z^*-RS$K<)k~$Q`=hGZO}T4CQjJZsOj<8(2$%TA z^5d(slI;?61WO5Ix$64|Y8jrFNo$K!1uUpv=E^!9^-ux&?W76*t}cq2W5J13sY)ZP{LT4;E%HH%bupk-?jb7i3GlcFLa~hj%;sD!_^Mcb>i3*v9geEVP7YT$81htOt|BF2HcW&O2%`Nj)D;BvX9HrqxgbjLG+hd*6@ zi=>e9rBZl?40LLOMhZmV21_b0_>LUs+_ttXn|)}4owfh?tLw+A7bbGu2^{MFCb+R# z(xd?^D{<+dUAJl7!s(ewwe7s>g^Qn zi9Z0eY1iUi&~)C{*JIv{Y^BCU&I(Y>FMi%X)7wOy0N8s`>i6U#x%QaVQH&g6B#@97 zM^d~}pGL{O)0)mr^3UinreeW$L768W|sX_5MLI!-!JI0c1~* z-&r+<+8U`+DjbKou$3XkQl4L*@@rn+J)mR;EFHuqs@!?x_h-okOj77N*!lM9Rv0%( zWOMM;rO|S4nQ69zr}hkaH9F3keT}?p1-Xb{AmfBWwXpQrWa+2AZ)H4F$68_x7--hB1Q8VIkHIlo( za>X?p&4;6JX*Q)l(+g2C3sLO69sOSu@VE4}GTlTo?UDm*wn-=1w?H+CG4d(tS@*iz z^oF+bY=B03OTiftelD{9nw~j8m1G=+sX!3;_s0oxixA z>m+!B*CU`kOBtLpqIdE>M0Z!(ZeH$vbN_JVnKrXXed-WH?O%AuuK^mcr{%vF7w}5a2YNQV8Hrk1t^c&3`52XAbJ*2p?EI6_$jICDHu8mJ0LnD1 zgN_`{ZGWJ48wrLs6xIFdeN5SKv`SfEEO-Xek0<0%X2FQ^=QTyaXQ(}0*FJ!oM-izK zVWvzWM~*+(Rv8bODySJX6$d;G{rb()nb!t!l_4IXZ}H}_VVwzj=}`Mnh}PHa}hfs-q^ zJ`Y^6a^yI*VqBeJ!yt`DnVWBuk2D=1(O36zU#o7*GLP_2wqn5dVJpBZ9v=bx&zOfo zc6yj6vQ_K!<&92aeo=dnoBZk@qrYP;;mq#2&Zp!GgPRlb0SO%klSSueLne=HG+aW` zYHyqK`k`Th^U+;|l;m#XDuc3W97)(bE^@nlp0*s8zHFPUT9x_|yIQ&L-t#1Mg0#xL z?bB1&)!^AQ{1=`L^d~va-(Uy$-3buKGUF!W_2y8cMyU@sJMth8w@0I?HfHb+J8br~ z2PgXrLLNc=Z~dBE(6eyiwQ(J^_MjazFF0CjJmzN5eraOsq)GdO?7^sZW>z<=XFMvZ zBWKR2vn}KCifAQ_t?85_ur{H2%$61)n?GZxsx!ES!foxWe1aE4=l4`@Yi2ayT#ZIWPb5h5L^`DEwkdp2LwjNG6a_Mch> z?e66|7nYy-axGt^casS`yJR_^at`$TrUpg2PY?ZQa ztfoIoHCS@RMAq;$y0z##3iX|S39FAQIf5L`mWX_)C~u%6t&YOnvHAN*!NHJXs{l&3 zS=!I4FTJQq*jxcH2Q6?JUEQakmoazb6tu!I8Zk@|aW3dE^*(tT=Y(@|LG8WMf&{)^ z^$Ydg1^ZM3vYjkJkZG%IEU=d9*V)Gw4LLzA?@>zJVa82xPzeYhJOqu{M(@IWv?Y0A z-Gw2arw{)_SwT9>!YuSd9#p;l;WD6I;IN;bkpv6#S^Jqdo!&wx#G}`aNJB6`3AI0c z^gv_(oj093TlE)3OcDL+^vbVSOvfW`0j?p3j+c(ETpLk5(WqZ^&d z^3|cG*z*+2GZH4DJkTw&L_8lg2;T?t!I*;mG;IAV+H9!552Yq>*umE<+gD9ZRH8!$ z@d8;Oatt2Z)z|kPI?SmrbdZ`fx5c-U4{#By`rf>RN@WcwzNb^La(E+H0%zq)_On5L z*!i&3DwZ;MuDYA9b5VtpQdyHx-fX}*ItKD+{4m9Un(wdMhRfV`~P)*< zcubzZKIg0Kk*DW`4$`;a+~(yYXgI1JQin>zmU<}p4GnJ>n&9iS;~>$1?3fdHK5!^P zoKDZpf+{oJ`;VrIBf$#qeGaj*gD1H5plUbv$}Xx%nI&Pw`+mU)AVCQccbi#Zz+Ed9 zRU!PJqI-3w@JrTD=Mg(=gHzoNa20#H1XudK#v2fYo zs^7$TpG{laI%1!lk7;3CdQn$zr->6z!PC3`D%9sjaSSBPT&df`8vP>7vUY&QM)MA) z@5j#dM~WQlS}texi|6TuJx;t9kq=#Xm%@ED9P-S2&xkB(J8j^Ll$MU|(Y7nf^(i)y zyfy!(;xdgsZvIZLdgEPp&N|J;&Nj z9vOK|oBz_y_eoE8$-=g`^T6hepluT(hDO%nBbAkvB+o$ji!@W}^J_z!h9k4Qw=9u^ z%JzHy-egsRAk9_9b9Q^pJzR=~)75d;_s;vaYz*Pm^ba*vR*B2d>ovy?<&Yr8Z*TY6 z**VuYSWsTngdtGK58>OZmCu5ls~ zij?DPqX(@l-*I1#6-d#XQr^EMWut&3Fpjgz>c6}tZb=t5{Wa;!d6#&O>-Gmt3Q*mv z%QTOQ3>OAs+iGT$>=P-5e7_#FeC}<|)12x`TSYh>!bbAp=-QSQxBYN>LsL(P;Xu3l zv#(Xhd-=CVX<{t=dVi6kGi$DiKPL6hOa_H;{@4w*<39f`V_j1x{vZ}gYG5ns@t8Syo$2nf> zzGRav$@7~qpG#66%1?}q2PpJsQ~C=M;>VW!U|T=l#(O%fS!3?1Ss1GfhyRz19ec48 zwbi=b#P%4H-=~6M!iECMP#j5ts7zQeEbJ;$oZHq#ernBJaAq7Ul3e_I9nsReerLDa z@w=7KH9YIK&SxUf=w0TA`zM}#8FaZdgB#}StDe3`ArcZl0?zJf^md`Gct~yQWh%tt zKpXK;rZ?;x&F2P=yd8FIlKN}1yH$Y%B*2fn1DLctj{~1hxo3H} zH)3Q?*D2|A6gfVFh$8%VJVaRFOZ>cN45{JExFXG0Pf+6>Xwpb`pf|#CvhT<~#%O4= z)v`oS9EXX@q<@0;8>#?h<2;I>5KbI*@mmH;>47gwV{Q`o$?+a_c|@IQj|NX0Tvv1wy9PcRqQM8ycAh-nQU!G65L8i%(DZZCGyc3D`{1BKg`$C) zSE+eWJBR!?ixB%y-;==uVZv7lLlbTuj1Bo&Uhwg8h=^s2TpL5*E$ zxz9b{$)kI~?QA&DS|b7yrg%c@8|sfi^Cp0%;j}<$0_29lX@TINQ;-E%iJBwXKsFud z_W*LALO5;NDmWoly*din==FDjE4y;D%*0iWOWmbR_^2gy?RVa#gqgh&j=K2l>{k!w`wv696ki)G!4!c-so-{}@C2D(fIxX0GF z*2VWM^nSX-{utbnRSq@47clkU1WRiI-f8M*UYLpbwB}l91-+M4so-o6O(V zo{Xu31X>?H{1jXrlVx?eF8zZ4q!<(F$$sdR6`?H!chRUV!`i#|D(zS(B@HeOj{;cg zIMLqH-$f-Tb(P*Rp+adh@OJZi_(V@ZGQ@NkJhSCHd;TlQ4yQYO?M7-Uh*bQK7Yuw& zROfEwRcpCqlJRttwn*ws+LL0fj;Ax{-CEH8=7RUqh1&^S;P$*&YhNqq`V?#yYXSrG zik=`D%))64^a{tkIeELE&dV}Z`nP3#u`F9e{(y0ir`;;C2I?2vSkA!K?!&$0%Fiyh z+@H^HXM=`-hdF}WYv;3?UoheKwU9p5`VkC+x)F3LVO`dcMGVQ+z=+w+bE-ga2_j}Hpu!EHY~JV zExnuHtekr7_vK8Qr!MF)y)Xj>bOvDmb|8Nc92WEMWx>IQcHcB469+K4H(od<)FE@| zRLS8Lu>J6w?yH2agD>NNR)VL#15<+Qq#H!a6){wijLgikO>+o*4#8R?eI$79N^>xQ z&<>0{?z``mL8aZjqxZJ$RF7AYQxhF=n(j43_@LWIua;J3GKT{F&#muC8ZY_x!U5UAFwQf($WG4W%qs#(f zhFaLL?K$+^>DNa&6m$3zgxKy@`Nn7jJ~SZLqJT1?Y#|E%P!q7!qhgmFGtKPEq^d3| zqXL0^dUXC5uD)y(7OCjC0Qs_Wf1JSs$7h8Tajt=-b{^%MP!enfa<@*ZHUtVx$B4l9 z_i*wj#A#Z?Vxv??V4ZOTwAqCqKn;!QPc#H20I2Ii$`mrZ+@LytrKjj?l7qSl-mF+z zB=6&`kT)HCsc2fPs0%u9rX3Ylg+b1ZSz@pe&Ambr!doLdI6jw6_al~Mum^4^DyB!q zkW@iE8{r`_`rn()bHM7|ZSuGP--UMfiq%K+L&x5Fj^C7ePy&$LHj$uV900bn z@Omcp#ClAehd5kSQY z+Th&WeBd^M944FCJ)r%_`}zO0_J=}|1k@qI)q0x{al^V%z$Ep@50mrhiYlHSrHUgL zs#+Fqx&G?CJ;^Z~bz?TKt?p*W(~zbnpYn`OccWxM2YZg!RGL+sG79V?`>%`1`tWj{4 zm$#sYJ5Ys3|wvX;Nv|H?&o4+I^IOV(!~oZ z>ai~ltSxnl(0z8XUgv9u-gUEA$>9a`R_CAI6IDKQT%dib@7nfd@12E$enP{u`HFhJ zbboEZg|mfWBO{dFPI-a?U!5vozzXwI+dJ?$>RUWVfq~dlYQhcT3@cYpdF6)VeIs)% zu5$KS74F7QhO;ZPjb)3gK3?mT+oB$BU2;XZQ!?)Lmdn2{^a;xv_ns1PuB?6;K9Rsu z;Inm(@I;oVRIc@*qToS)H7Dg&>FbSn@wwK#LDxaltliyu)%;*xZok}3*1|XvbihjV zvQtuf;NxIKE~Jevkn%)g4AipiPDr1dkA<4rYl3R-clMu&h!0;?cl*P_ObSGWerf95 z%x+&I$JYG7w`QH`RoijM!tv?_6|4a(1hOj7mdnukJytc*XLDk~i6;YO-8y$E_}G?e z6E(qZykWS1r{QSUMgIJ1-POV`?01M!-J3t`kXYMT^N=YZo4(sEC?|67_Wk^B3i+zY zdrWr%EuYsY-tes#o0nk@y{}gnlIHC870c;sDl$KKqGY%XYMJ9O1UY8;c)hG2BC(w_ zhlf|~=assHn|JBMHzkp%r|(GJr{%2cpP#nKEIO93O?SAiYTm^*sfO0%^Gx`nlVa0Z zUrHX1>`{0o-pdc8=0V8g7W_Qu=xH_=-mI~xl&8mdq){A#6z6dBUv^`hyRSnFZ#7}| zX!UW!c1n%5+M&i!(|VPS_0}cZ>qX(JMxTRwrsjuOrhE=KD<8e_dS~D8;Oy7x`h}lX z7FP);1bXI(;Z{Nt_Mb&()ZM>6)mMhLQbl&O8nV-g!|m!a&-V@vleC@cj<0c!{w)}n zq7S<$En7Dw!b7*@W0c-pxU1fh_O$w<4!L0SG$q*evh~I2-+_xN4OJnso1nQ^NdYHK zLTnJ%18<->0X>}OeL>W4vD!qqNAXf;v^s5canb@sne`rI67l9b+BUsFYxA*++SuYO zsQ%pZ0Fk=rwTls}pS8N}zr$GLFFawLRc4g6dVjk7gkY~myV%4trBs>@d&7aHT0l5B z{Gf@ys_S?x+O@ICYTMjkq2!68ptPbS7Ju{o=aX#5YQDWfBeX>k0;` z78n#!;_5!W7F)Rc%{FepVydZu-Wp~9??8eveqq3I7$B;~j513AEK#jl%_?Ij#jRQl zb{`_=q}qDK+g8OlC(MOU2?3|hn7;v+7UYmX830P`?XA|gna^vA2{UZZR;u3$6m;l6 zCQ6Ci8KJfVUB*MGtntxDWM ziKGil1QD%6RrA)7wTQVa(`_Bl{O65vO>|^UlRrc=cZfXXPm&sM`~eWY48RJ#E!W?# z0HOOkT#<7+l10Pd%b^O#y$<*FDn7UTdOa?f{t=jfa=wTz3a@0B12W09mU%Ud=USFs zvRJL?j72S7=Z$5azcRews+T)d=3GR3phJV%r_AhorK=|V+e{3cZTgj*tlaD+Jq2@& z_&Qm#VIquNr}_v=cff>lgx2V14mxaPiCC@O4mY)>Sgvt6;nJ>Nego)p2G=xcky}%p z=b~Yy1RZ_(G54WU8?)>CQ57d3*o_NbjQy>hdT{ZkZ$2~w^1KUL>JE`(F9MoSULSnB zokwIa(SC?TSqaK)3sVKLgQFOH3{uYHH9WtlBaP@TR~=m1vz4n(R^aJ7T`Adn8KGTr z_DxN(8lHx!9KS2+S1z^3F-yUuBng zTxeRn;SHUzb&xkM^P$;1>`3IQEv{*l&vK+%Ie)k+m?EsA(~;J7Qv0`H`i}Ms>VU&6 zKCWupacE0qZSbn@xbbw8$Mpxj1!u&&UZX+Tr^8?~Y+8Hoc z>IfXB=OKcb&%=+%ug>+DXoONghk10duJi8k=C*EcFeTrY!?jJkN#773AF~Snk2VJ# zG=hahd7D2F`z}n|r6|2$3&2)MK_A;X$W3(1Q{KCz4PlnH1G_cgYu@k*-Jk`mKJ?)$ zghqSfp6j~Rl1*f2@y!u)_rL7Qh~Co4oq65W;ul`D5h9MoVHGx~sCs7A2fEM_iJ!e9 zuF?E!gAZ%;SKXMq9NXhwLfLTkneGnd$J4)j_So;yyTN+fYDy2_%{@wi1gOZoF*Y~* z0EP*7y#3$Od3bttq$*L+0)9Z|TH$>H<->e=<0feD!u4Ym%AMFVMDtY0ESks|U>3)U-Pj1^kP9t8`RB&NoODj4uQD*neNDo%e+pfcfYkMNTCpC~v+_{CQ| z7bnF+eY= z30k1_hwHzJhWjdmCCvR@CC?{h7b8BP zatTz(6D|5)P=uwM7q{Ek2M{7Uo{{6?D>VyudG^+Q-4m>#~q`1Qtrg~29 zLV$H_0uxr;%dE$f?IQ!;b|Vboj+lkr+i)iAN8?KYgnb_H8+lf8pw`9HJ$x!iAetW> z0<2v@9A?||1h8`fYgnzY(>Iu0)JU!U90Ct%i#_e+c>&+yNGUZhJK|Uet&l_sn8fyW z7G%_uJ3UHX+-Dv;x{8;iwKaIv2UwL(^rgAy1FSjGcm5GOJT|luGk?iOFL?o;te69@ zeS2^;`1y3gQ=G^KRx)#@Z$2;Sn!8N^fkl9ql;poU-XG?2Cd)2GEJt+7qL%8!eRyQo z593x*+3r1CXS_@WeuWIwGvIp@WfOI)m^07YxCB_AyupMm3(S2{>WHHmW-s9vT1zGi zB(2_mU!o3vj`azbQZ77&Ez90qGPk&=B)_;=xuklS|NUIu>~)tUrON@tG!doLFWPp((75t3|i3=Z+=w6 zBzEP0aM`R33j=d5OU(rtf)JQk;TM(N;wcrOq7tlRfmL<^gf$08t;|99)o5|v(&Cg` z#T=8}_gEz^a;^4f!me&&z@OEyfKN)pCvU-5mBTO4*4ZiHRxg%65SPM)jpTvXn4HsZ zdhN!aUexY;{UQ9@Cwr#=Yk6^yd(Y~dj^cIZ-M^(s{IYL8Om40`eq+2zB;O9V=LgQf zW+%Uh&!=~GRX$p_0+XLUsz#De_sA!@2g%lMew?R2E-@AA_!^1u0TY(h0T$X7X@gx< z*xOO_fg#v${Kghv#Sc2gHH#B7%@0OCof10l?x zf*;;x?%}O0_%t8P8U8z*B)YKkl8#}`cMz4?;OU;W!3)c}!v7Hr!)BOmKx!@Tk8#@o z!qi5K9{IaTFn^Hv+2iIQ5RShIL^`1*G&8IYW+(D~G#@_q35kvAE{)QK3yY4;wR*qM z%N^>q#3AV?X0;b~N&(}yzygUWR)v){`6Jom=9;T`@xXl?-sCEa*;qyco^`RnVCOg+N^#}#Nx`b`Se=KCMH-2|pqH3J*HxdQW^wy(NDrXo0A z()pV2Q=4l_^<>uF4-N(k9eEgSgo|=JruOiAPt2NnFU^*_$9jj?D|=Cfz9NfIipLE% z=SXiDC$wjK%*+UunmX&T)CS+CP%QH%=59?mTI~Mzez9sk!w>fwSKL0=N#$wD zm)BrFrA%p#*eeq3^2R{~`}R9`PXANAS@*R?JNS6*t{nWHPLA4qsdy_x?vT#O-2@Io zI*o91QcvpCZ+>#ml$RF8Xx<=3*wGOT&L zBd$N#`l&<_K3bv1{1Hhsm4|yB_lv}(F7LLh(Hnn|HL(-fYJETMR_OPMN;5m-U4Kp5 zb*Cs=;{^!n^A6Xx;}?%n7T>jxJnqdt^CJ8)iBguicx`Qwdc?z!*NG&F`~mfiJKT>4 z3E4dqT8x8IBi$b)NcO#clayMlX9kTwm%tLJDu^+K?3WVd0^lN zTUXPEca(h$({YKfPSv_|PcH=5_1YPVEEspaW$8b0uwLZ^%{QbK>l_dzCre>F?AunQ zH*t)e>)gUQA=-%3EFtba-W0Ds)~-CR=q(Xl;y3qdiDEHJ*rjs)G4<^fYkeDzqljb9 zuY?p%$k1v?EICLgsOq z-t)5ezVG{Z-uJkl-r|eyuc2 z`k71rP!Xw2^_4xpJ@Xu|Y2Z?!8+Wz;!brVESxb`G+A&M-8`HWq3*-0i_XSY}v}hc@ zO#-L~@TcTjsT!&XwN6MLZVSa$Hexnl=nn)X)0ZF4@iKKKmTFSB0m5y zv=QJKYSFY+75m2N%h?$h3}HB=fT|g5yX0nW=R+Hcg-brwpkvA@EPKIB`&bcNX3C3^ z7#UA@xZZcwx^v@b@Iy$jI^V_HL3N1^K2WgHG(leIxaWcN+9opGVx!dc*gy9?J~>nr zcbsP{X<_9G_8+;$o0yZz^`Y$jy5EQ!r6&@BEw61xyc6K-ACjE^a-kiT8UHuqk zKv`kmOtX`iI)m=3E!qH~Ki<8BM}(XDX2ak_n6CRF@MnPV@d*KBD>tleu z{}{Fe)Q~-HIY0e{H&y?Q!zo|8Ad>%ifa06{i(6W=bNr5YlyE@PgeCJMz`NHr*tT@u z{c#zVk&P9;Ngy0SK-|3DCmdj{XAlH}LtT}I$drOasN4%158Oi=0IJGfAv7N4E*xOk zzbdw_)(sB_TkwoR93OojPCt)0BT>L&Bz0NWPHPkJcc?Z3tM4DIi_*niGx=`3?|KwX zU${CFzJC*n7%f;SN6&M#6YKpL=3I6pMdvv(AQJ8EtF<)+QH+ao=K*PkAZ-zPECZ0y zEs6uqfaBgFcP9$(bP{)ps*Jw7s2bKR?Q_F1$kI0b&~%70x(NSPZPaA;Gs>S*V+U4^ zPi7XdU6nlS{-Vj+N%)l=9tsdY8@lnLB0die!XM_QVnZ9&YwzwE!#Z&81v!9Adm);K zf__np8U8$q7WD`e5|1Y+FKC_Jjg$Fw(F(GZrz>Ir)N28~1>GOyhKLHV^Ij~N=CfBd zH+Hz+P@~==2~Aq;(6i|SfM4aAGGizCZQGxE%3w2NJM_VHuf|A8ZVY0Il>O8%jF#&i zhP^pAzfBv!#px8NLS=2sP5qN|&)+284t4vYlpy*GFsYEl9>(BhlvB)m1~x&JEh}g% zcB~2h*S@sVQDxl&@Ub$xs3nEB6&oF|-nre5f`vnpneb4Wts1}FIl1KO)he*Q5qAXb zsl#ong~QF8wmz|$<$Jmn^K9|*u{2n4Y|cOI31XxF@&sUijiIm@2&h(pkMX)5dpYl$ zWK#8_*!nji0O$V9K05+yx0t1{w7(N=m&8I5*!Sn5DS<=tK0Hiyq_rMdQwFB#$7P7Y zwZpZt96x(O;({F5JkBvlw8!8>;RRQMj`V$0u@-cXITAu*7F)PX&cVOf zE_*k3K@iC&R4A=K3SrKm=kxEL`S@U_o)3lY+WF#?tel3b`P~R2*Xq5~WS@fp|U=4}& z=Y)Vl9U8PQy1-1z4iqu#hbW+9%lm#QH2q`EE#9XqQlZKb7p?<#?;;5JE+8k4w*7&7 z8es^IMD0dJ^4xHBTOe#@ttS!)5WK3b^?fZ;jLVrzWUJ`yj>q!+h3SWrr_yf|-ueKF z9KV=pIx|PgD;EgnS5ev>_N|k`!vo)dr$?JQ!&+H)b9!>`8-MhBg4^QvPVn^SSi6~m zOdxWEH2SuhYOF_MSJ_^yWACXj|kEWK}t^GzdI#I3~-jB6|IE zzvam6x(nW3F!N0_Rmj}v-HWa%H4oRvQl4PL`MXOxF(Mzb*IgH8Dq)7hY)aiB@D|r`w=5`Ll!aP9zgLIbh_mNZ~T<}+$Tl&QT3jJsPQ{CKkok_7$Qjh&rk^GIB0jL z&@85$kSi+@; z9d2ri?^Gxi5ZB|pL?V<5+cYk!6eOylatoz?(LOb?3}OnysOk?pDNMJ&G$y(P@?Iv zyE|=DO1s-TlhbNa{A0gp*+Ms*9VX8cw#$+-ipsY?o4FYe?2sJ-3H_^^N?Yy(7jgcY z-KoI9>Y+8&j;;a4EvJ?8&c%4{&P;c<2$oMov9wKZf4cHPVTudiKfaTQq~mrDgy0-(|&`EpSV zPb?w7$T+Ug0XOe}_;)<`XwIq&L9z_inN9%SlfnYuL-eWVsw`zRV^+Oj(W6f;3Rm7# zI<&58=7Os7&Q^p}Dp2j1D|!uu;^Y7Nxk!>yXB2(@P{TCP?90t|!2v zTsQy6%>^k%0fDdc?nap^JU2Z(as4r%-ux3(@Bp=a#^OPW@bD{F*f${1?E_r*$8h&W zCRniNU%r_;ges$3ZruTBni9KJj~zu4$D~PIHN*!2oz)pwUb{(S!IDc9wgsl&E1Fvi z)=X^~%oDvtk0%P)sV zt53x@fSE9oz(};LpO%m9zXvsr+0(voQKUfew|yY#G$$YcxdTwPK?)i=PmzV8la`|d zQ~y36t_ugK;)ySw>M80+Yk3E1B^QQabXwjRt@ zR>MP@!uCtNa~WcH#*wH!fAfi6#J{KES;Twpe#f#;1iqC% z1<#F>i#Kd4D@u68Sq5HzSQlN~2S{LHW6cLh``o`1lmEN7`7bn|mj9{w_^N3J*Cw{Q zBgtX5;y2>T1a5AMKhS?N+DluC2;M+mHTx`*_#pRf=d?mWEC%pQ51dlI)-(bYB;{X` z>kBO2t%GMS>Mw>!pWAM$fx0!;aNb#y?p4{J0Ac=7c|ZE*FAab14)dKb`9YIeQM5*D z-Pxkk0pWhiU=n^i{>Q)wki&^Mp z{^k-aa@UPjjP}!LICTDo7Zri~`wj4>$!o$DFuj4?o6tgA%7CAs zzY0$HE>b}hHnVkCcSYAF)+u9!{~Ov2oL$+Qu(hZ6EGQg3+Zg$+X^! z;Yz9;7FSoMyUK65W)zpVS;N7~o(&ZZ4e~G`7e%VE-&cCoWuN7wK2_#Bv1mLt+~DD6 z1W*A6!uQa|pX1mElZXL;^Vy(eDo1!xx4FH5agO0{pO% z!67&a!DYqP6#j?^tG@!x<{fZqa(nW zYWPQ~Uwh=FRgMl=Cp!|E+^Q2?gdDpcEm8x+?ahJ zd1gcX@t~o2$6OoKr+2Tty+q3K#gq9SP+Kj`r!xqo_YJilf16R2tQ{vWr@#`Fo=)zE zJZdM0wAqu(;1+meo#<}3qp-FmnUFZHH1Qhal7D89+UXL8b4l^R%GK!8rzUq-c2_QB zrta8K_mHF4xYRyWDN=8Lgr0WpWuo}xkJX1{aj)%*{%u$9;A#?gACcAxvY*oxx0X_+ zb-B%NjD7Z8$;=61OpG8}2Fz|yF?o~7`Max{YwzNWlQPJGi6-m6@)&uhbr-2#5z*m? zjssB*X5!hjZtT{>*T&svsFoWe69U%Nj~n4xqV3bZLe4oV^x&b$fhRl>fAu^b_b#`$y*olV%F)~Tyio#y2lyAos1e-ni7sz}DTGZG(|4QtOP zWk-e0^(%c*!q5>)alc*;DM=}964mcUb5wD3mg)hxYEM0m&;dapA3F2y1JjV zz~}|8~<-{AgbwaA21`Y1#U8^7a`)2>BYtI zmg$iAk)^a|xacmHZ|V!~-~}goom}jMEkzN}*)azXdyz$mPsxX<}A#fMk?m z0pd&V7HY#>f6`sD;2O}8;Z;v(5DpoiaxXyh#okT@*Bj~*Qw5^F#un}zv{FG9>L&p( zQb%?1HHtNw7@zMuvNpR~vjUKeTqeS#?j^}iy`K+7=tq)noD`4W6kr#szx9jzXQoJS zze$(3!CdB(%xw~%a)Tktp540qU9s6=c8~M3*CApqsawSQ>IPTw_@6A#4(z;Ds1O-c z(9tN97isL$W6JgUcBn$(VJ}z5t*_gUr4+*t=WUv1mJi5Nh(_gg-p zafBx=l!V?kDC`KisL})>{we5BO7zORdFKbtZC#0xE;9XY9B%@P5r<&du4mjDz(1h% z47Ux)7*QN@Bw_4S;2Db-ZeP?BM2A%nN5_uPv9G1l5cU}eZWgrbua6*{fuPJ5gJeeQ zY{=Sf9Q<=_7uAn2ygC03JLajG{;{p(8N!%P-NT1VvQ;$NA0i7RIHob8a7R!E3fr!U zGCJzzaO(d&2|eH>71wH>(F_VHPXujFMr?~!CIM_ZyB!c{+uot4`hpE76Jq(Hunvxa zZQAc7LSS|v?uereX5eylpku&lVDxY72H0e~5Xe_trED8%Dsuq(w{iQZ%_^`@-CHi~ zjoZ0GBCMV{fLG)j%|2^Exa#C}VN_uC)!ELnznrD zWUuH|@*rL5<_NuiLl7h=x&%eOqhOw}hDFF4_L+viE57+-YE5)LUlRm!DoseT)Xo zzTHt~sYL*+_6;cp4jU;_*lq(=ShB_R-^^-_#O61nEftcvcA$GX!0S2yQ5j^#3`NO7 zj|b(ODAc-?URZWLyVP`y$6whG<&^hn{V5oUXLTc-*sx+V5w}^m$EUr`2$+D6}&Sf@lZa39TLiEivH%JOa|Xc;zcAx<8Exx%wUk_1Z8O==1G_8cl9YIfQATF>LqD zv-<`l(VZp2BAx^Mi(i}$#~HQ2eHvw6bF55=LsMo@IA@S!y2 zG$^#YJ{4g$!(BNiJRMo5BEte=zZ}y{rpSA7V00=y$mw@3H2=Of8R)Z48$kVt_Flhd>{%S0*b?>(BU+ZAswDb@I_~=aD-f2wB%nH6FX1Iq&LQ@9C znq*GYIPGfe8j5!|;L20)>~?O=>>k@E@e+T!g%Nm?Z;p*IEFQXmVN;bB!v=jNI;nn| zl?rS>uW|ZyozB+(VuR-YJMaOvcNK~4cmgVj)ZN`Z6PaJUx(bQXDHQw}R1E*iQ4UK_ThJ+L~fEnGiqg=D;Mr}DsSmEyU`h_yr^B(^LC#YLG@{?5VQ3o zSw5U+t+mGGklL6({%kY~1Z9Ynx?|;XKcv@_L&j%lW!7PB*pz3xD;UqquMlvS%PT(I}YK!{?l)E#5VQZ1JlAk%`_^GorF5G(?ju%;3v5 z2RFk6Z)Ed2>5fR!Q}6f<^8KPXJ8?vt*@ZoV&hX&ra-4o^@^{ z#zlH%CvT%~SAoJ-+s-QSxIHXsSIlvtu?%28qyxuTE7xpuX}?rhYmwFcd-}f~X(UHP z#P{Fs@-FORicISL+OIeHvO(#aE_Sr6H>Rq1<@%d8zE2~`j-pxy4ujUajsEIbH-7pL zDeG+@L?=gF`~5LOmRBKbvPT0Ex2E1_)wr#Kond@n$xr`tg4}<1hu{%JlHQ#;3Dvsy zGb@N!n4XBN9vWSuceU)zSnJLk1)X|MRGZxVG+V|KKG@PS(BFno(EPnO{TZYpH8_}q8? zVB1I)Rip6-4JtF5t#yf=pWU{f?QBr~Om$geTHpEF(Q=O${021OHR{grR6Hd$vAG8qugAG zvjcWNx!DcYY}|g5&>aem@-bOw8_RO_84QZ~FuR78M)j$7Ghe}R>@SR*j#I+4+2tL^ za6aHD)Wx*oWFVZa^9{aKG`g;HP|jMbfo389m4LXzdWRo=%rqtb#HQfNMOj7?b}Gb= z`_ilcXy-jmoHAboVn=evFE(g^uS$>n&1d41X?1#JE4f`TP2pwmWGF1&^@W;ClmQQ9 zJ};X4B>arl;FObN!?lSiY&#P~#RrEJ)ms@d*}ti*PM^&X>V59My-nJw{d|H=%wk4i zs@m+Rx+nv)YGH@A_v6$s>ODEum$$hidK;M4 z=yfB-@2&XHg^AQnUdSt8??#QHT#jlLDukx=#+?IM!&$Rm1CX%<&}%X@rm1YXcoYURqD3_U2EpG4C&R5w!p}1whYM z`?I2bNyp;g{nq{Lj`!umMSL>uaOIJ6nh7F9bT)T1s{h=p4>}l6tfML`^>CuyR^G_d z0L*Cg*qtexgoy_weC4)jjKoW3%n-(#wVi|A^xYmGTu8TT=OI0c^VLk;`OMkf@9@(y zQO2<{R$L!|rvsmIhU_aNHwV75nlc)P=)7Sc-Wd%Y)3?Py#(5#a9-hJjlmUS^PY?7z zsorS-R0Q%RuTogkJ&nS@mjAze`Oi`YJW{x`J(XX*4fYmZ|F=|Bx)u=$55|O7(7ESY z3nP7qoFYU4`$ct#nE?3RL!mU#NQwQOrM<9Aj}aRfjyNv`K5@nY=KWy4Ut}D8Vvaca z+vA@P8p3-)G@CS`#`>ta7#~EdTQKJo}e2sw$qv@WL6E{0Sff(QA3~*+)Q+StaEs?W~w2bKbQYN3eaa+4M=qs zQbdsMxi~Gv)vykrxA|kl8Cr%!-J=UnlF@`m4TI!tE=u*NIVHWI_oPLi11EE^0zInBO1+YQG?2f?fII(;&;zbgfzb!+nEtqA(Rl-VYe~QOJI^nK z%%MFGY$!e+)WR=EPn2{kYVG3duCzo(!~zo|$FXm*HH&aZjw59y{j!X&_Tdf|D|L@A zBmP|gUl6$})%9@zQ5(ke_S9ZIgj56AW-i`G2l0tc8SOJBHmF7iM#TdS>lWgfg20*Y8$ zxCniMrQL3b+xY%=G{-mC9P=LJ72QY9xQ_R}EbZ(^1kZVJYmQ}IH6W7yH5s#fx0N07 za;;_p!E~U3bh|B;3qnLvN!q6c=@}8la7O5eOMRz7*O}-n^0Fqh+A-ib?0@%&0I*iz zwHto_WpiNjKg5T)$-JIeTp-Rof28g7%SWB5jtZapU!R&WluCMW7IFwzY(u69{gkoP zjz&?={}3L`zUQ>o*{?%r2!+rvLAU5HT$yD1le^8T&_8jsX6l7}yg-E3pMvpc$v0dJgYPwx%^q+y(fni&4eCui0`<1U zhAS=i>-452B$ec^qtD+Rd*DpL zC$49P&r2o?uHrTx)+s~8P69&99*N7ZqSOc_DjzCPb87sIK@+Vx4nPrUXmsaB3%q zz=pML#tz1i)(K(*%*;zkmN{M)r?lFK8P4W3Op2)hdnfR?W4s-Yi(gQ2a48aPre9 zkeDSmAYFk~`|!FBQBB@MhtW)SI|_#s5Y>8P(_%7W!6}3W)oD9l=LEk)M^KdPyW%PW z?`7VpkJ;*C!r4B@z$(CP76IPK5{SPapVx4hQXT|2iQ5-yM*X)$isw0$0_k&B~yNE>Z?tau-ReWBz6H|J64C z1#~JK4wkYqooj6tfwjc{P!+j1NH+=%8Xl^rh9v5;!m^fO?1+2rR$_7!cj*0fOdoTD z0JLcEve;hHmZ>mORk7U`g@E&58Nj%+79HX@MsvqitaDdVnxZ@m7I+W|s^t?l4B)Be z9VSvUbsF|;Ro5aax%G2RgOCq6wz3||8c+B2lR1eKitrTY~(zn}ALTlQrq zi`QtkG#tWzt*%y18JzkxYc#-Io9|Ym)|y)Ot)}EEmt>Q=`yHt26Xu+HiZBBKZ*OJw zCk~q6(&de!KSc`q?YKl@8_SO^E?m=&*x;x-cseyf&xhZ>BHT1!E)U0k-K$I zTgAuCIcTeiJ>(bO*@1ONDN4L`n}e$xj{KQ{iwlkeAGz=3_Lm<~+|=;rtXq(b?o{g8 zn2&!`M`&I3?*&c+Lg>3ptT#Kz&=n{99PyX4bbCd zSP~giU$AIK&LL|ncduukx~B8eRkxSP%&slZor)B?ojae9P1(b*;Z0iS|%l%y>W=I%8^}=p|KXl^AN;W zcGLtvx-c~?H;Ya@SiVvZ4bh?v+8&pkF=*`+c! z)9K`DxSdaL6GwSzBm<9msL2&{SrkY9a*`+TQcFB_0T19+KH*qo&>jG$v zZ!E-z`xoFLEL&raJob5+=46w#wq{D~j9QNF6+sAdTSWMX2sU|a2x)3FO}&Bvd}MFa z?7#utW7g}I;}bDubmM(CZtlJhRQzs za){VC_FD8qvPETmT8tvDm(W;PpR8FFT8LEt>!Ep`2kGhL5q(x~I%X_5zZvi5xAFZC z@6*0*M3B!1;?^{-0I-qw!lim7atz*(_$pTh7b5e2K#wFDfn-r7!g(wlnkh6yzf#*~ zM`>_2KQYsBPF4#}rWyUxLMP7fTww?M;Gv_W*e^`5?EQuUd=8;FjPJfBRCN><%w!lz zbw(@obfGFK4$YNkQFj81SG0aXn|z@J!lfr7wJ8L+OBl6a>oOu-Mx>v)<*1R>U)vpj z8ipOOxMAQg$m8Uv&xZ9#7oZ1JB;uq~A62Jq^656BlQ?5PK)ny+!brq=e6wziZCWAV z$D$ea>a`tn>$FA&3kUrFo(1r+u_<#1H2JG6Up6F#e}}$}T7#Ub6AqQ{4+}|FOTs1oGI)W18T>!T;K|Z8H}y`wL0xFa#6H z|1p>Vj%Yy)0ZB;N^T*NFx(#O+I6hZ=<=y5R#DmR3NO+y6$O7$NdEsb~h*4XqJ10ox zSgZeU9unZ8kn%g#btchnUZO-0DbsJXWlt6i9nWG_0V}>2^t`X%s^}LJe@mV)t9vVJ zrf zX!Y0X+=i9?Sj@WEB>4~6Wt^DoH~Fz$-7QAo+vY28M#|Gz=u6sD`8Aq|IxzW4l!uZ+ zYSK{?sPK3P!SSuWzYCYn+KFLAU-CgxzSOuYF?N#GICh5;vN z7vCDLXg_Ii-n63B@TY%suS1`i$1_-hezTi}r*idm_at8nYvXoR-C(~$YNtY5=toUP zr&y}I$hSfya0qL~X<#uN{B8s7>!`ELV0EfiL$FYHQ=IggC?}P6YVSa?4NMzx#k3DYx z;q|hFYHRJa=s=WJR)4FOZ-Q0(Q}O(n>%a0xU#I|6W9w2dY%aCUrgX$H4X29VS;S;CG`9(LuvZn#QA< zoob2D$8sO4FU?O3O8LZDP-iR@*=DjO6UnlffVsCCwt%W?D`2uZlme#jd+A2bP zJj=6lH53npq)M;ie9Yf?7xu4?R?~KsV_k!BGWfyoI2QcAV8|{yg_!J_h_B8-o@i~$ zXNhosjwy;fd|nqu^tuNkuL~D~V#e7CRcfm>{`+IdNCb?Vss4<_s zsgyIYsjz8ePH(Er7yMB8u;W}U6jJv1t^f2pI!<8&%l zs|AtlIJZLbzaKh&tlChlf56`{XYGkUb?Ce^`iH-}-h1=R=o*{sKwsavwaOm~*=YJx?HKZ{xIg>LieS%YeR&@8$?ak-pNfv$~(#CfquU(6Pkvsqq!OaWmWQ_@XiOH|B z_v@U^6!uN(cDyz}UMsI`ZE`r_y2ZmAf}_#vFKqwH9~k(QyD17?MowNZ9IYb^7FOgf z@pwHBq6)1@ZCa_;Z%8{XG|eZs)yyx1J>n2*BeSy5&cDGihx_IGX=0d%!)^4MQ zUPHl%HrZjIi;<_&sC&@y&UAkA-3;YmaW(5tEO~G4O(vbw!4?`ysZWDh`1jzAH$;1c z0DutuPa!UZn8q)>@dk*NJlEut=2fVPfnVt}$s5tz zGX0*DE!SEBiO1{MvPKhu0GHJGyHgn#x9syOQ8w**7@!$UVv?JlJaFa|SU{OEOXk@f zRd)gnyOp^NBqd#l?ix8w!XGV>5euztw(U8d4T~BsrI#q$NsiYXlBqT5^0Oq`@)_H0 zx0r~J3lN#~9=>TbMdYtDru3*6QeMYwYueu3s~cz=BU_xXX^)9tiRB8gi;G7`l+}r+ zk#9T1ZAISdT2;85Zk8ziY$Odz-TcBfM(%>!WxpH`#+aXUa+RuH!DuV%^3*2tivI}h zy!w7giz}zV2>0ZDMqJIw zXPkoQw&SxwMN9$rO?n6nEd`8we9x;DuC0T$Hmc9ERuS?7^#f#_wl*)qR2Q6rGUH}X zlOV{9UTo*JNmwVi=uqH%kAm`Y!Zbow6=T=LjdYYaG2`7I*O@tMwq_?@=Pc}FK|OFE zh6UUkvWT<*W^o20!$2gY<7G43*<1Js^&&Jff%#eKR>ye63xb=^6rY!gUr^uD$N$9% z0YBgbeJ1xxon%cOcX#^4Y@FRs%j_l{KkfShK3Jz)-FrPjQwM*#o%!R9snK-JMd=~T zz}guvsKAAUc|vg__GtvRK4rP1JRdm4!h*`K%wh zZYn^pMRvuDW<|Q-Or183W*~DH4Lu%S7*>i8#3Iu__jnVPhTjXvvnYsx?RP{%9u8|-3lAOpLQOCSEuKH3SNb%*3aW-cci~I*>$BDg z?{qb9CA)zL!ky0{w)E0g|5>4ZT?&zZ`jNCO9HjTqC>SqA(VF2HdT!--6Rd3^KH2B?*fNPD2z^XrOT zJel>reFZ{Ms>iyO9VY_(6fF!hiI0hV&OZcaLy(|7daW&^geQWQ8u;6z$mNlYb$lI} z`W0K5(zBIUVB?4ML;{Hm8fO5pr!ug80+5$t5 zUbf$Ftzb8ax&0=^oOIHzmE8lch_5Zy_K17vo+uM+z&)oOM_efCugS^tY>~KVn1-;~ zlyXAux7R-^Wo$3!C`H0zsuRCU|E*8S zf!>BH6L@B1YG^oGR6^D+6wCT3j4Hho1Nv>1t+>bp5&C*))x1xT@-M^i z%hKe|UI(=H#7TUD4ufC=DwxBg+1PM}*$t*W#GAf!e`T+0!r1T-s{4P=v_%l2$5uTi zv7&KMd&2LW13J1BmCyfut1#F**ynCt$x)H7Zx0P?H^2ncCg>^(_!G|+P{I8*6ph0? zPJ>C6i2*va#@lb&MRN%f6Lhjz?!IATLD{AcGFqIqdC|87n@G2fT}WR$EA80%MB1Th zfAOA#Ju7r33={?b)>9A)4kd81y0tK4JgYuiPg<+ zm5M*POACLQl_Kdfe=xdSq@j7ot_fy1?crQ1C`l(iI<$33o3uT9%i$JGQdK@_x(3pd z;9^UELeJoTQ0M;3o&JOFl=<6$8&P5Nb9BJ(K}N62Yc?h=Ws|u$k-=&C$#B4){>uUU zgAO25?YlAW*3epwbpH0KnT3zsnOxiVNbiS3-Qe`|*3z27*+-_msU@OP((rW!VXF1_ zbf!RH0Y|W@;S%ekksb;qfp1nd&_dD>nWoktvfwn3MrpWqW<*-6jc~*>7zfbrZ%`gz$M zWVDK{tDvW1x@4ldV>pKS#*UGy+<%%k!2Q|uc$5eiLejA0asb6Y^$OxX^R8v`nPDjANT5z?_Ar?xaE$W_jGsR^IEo3=E(}Hy*6bznE`jacjZb7 zivvfsK#_oqM27Evb)6)w1$q=N-RTRzwd#tNlnvP3NY9BHXgPX8W_@reDX~&6Ad|l= z?E=dkzbt`BpU^oum)-6F((sTCGL{XQ1HNUP>3;{=K%)OPInQQ^ez4LfV93njoX(Q^ zsh7=C5K;FJ|1ofC-(+?RUu`}bAZKh)s?8CdyJJs4ktPO&ar)Q#JtJ-B~Mo* zy}Tc*7y5?}8hV}aLOnKfk`I_>Tj}6vUSHpGIMqoX-$&eR9qlT2n+-H~(V`2yG0kVK zIN-B>+_w1i(B@dt2hr7y;`YpZ#mUKvIm3aPWh;N3n%(84u7JGbTmyuiP|I;Ym5<&o zyQZ&vH$uq{FD6jzf`cQ_;0uaaCh~gh#A32Q;4y>Bse2dWUqoFSEbmZzx1?O;XB#Tm zvUR?j-8NmZ`Y<)tqpV#9@3+$;;TG$D-q9yrR?){rLI?Vg#zt+GoceKFgof9_ z2`*$B;pwv7u&=V08bTcl?6dN$Rkl#52a=^2clc6>RiyM>e~&C6&fVl#z^|I^E3Do+pp78NQ7rVxsf=FAuSC^w4nX+18A2Dv>$>i#K%Cz`; zzwQOsL~*qd6KWw#PkAUW+qMH>aRXph@e8_GHd5~>9;7u@GH_7$>Flp)yo^yda8Riv zG~9QM17WIn;t^MJG7<35f!@V1VxRsc! ziN+&8r)!_tu#+oC_4YOEaYSa36D(O!Qu3grNay>*=3tvcubq;aT#**8;7zP3|VgI z;I0(5p59wJx+pPzNNF#FsyN9z;(zK$eh8ibNvuQYFlaNW-k>?;`JO={?jSr#d#*fb zt>7vx{&U+PZ^r|(G^v2_2*@Mu1txC!XshX%I@{$vNA<~0@O<~-F?r2OiEkCNO;_pO zsDpBQZa6w~7vBo*BgT||1P1B2#~l~q=LQlauu%Nvpffk+;}v$}6nnU0mr2`sIO^-7 z=z|W{`6Jq!>NA>97!RXbfn03x8fUpQOh96HjEab@QAD3h%nA%2N&VpaxKx64DC1Qi ze{i=6(gnsU_aU+JuS^1Kg)-OxMTCJ)o;6uiKkK!6p&iJ%D|$yK(BQZsdGui zca3%UAliPEsMdgtepS-ik$=f6BwCK|yb?ac>B%@R&xjs8M1h@P!?*KH`ytFG zP~#ne*a=Yy9Su?Hg%vofO))HS43~@&h}}mFT+10Kn#mFQ+GTJ>aG}TZ|Cufns(})q zjm=Oqx7zByNV|2Yy$7buVlXeB_(9+IhrnhHLWnS%{`eDshr_>XaOcAM89p~nvD)*2 z?3|VwpyJ(&X1|UA;4j}+px_TQ=%BVznRb|(5so(9L{;WZU7JD+S9IV0bQuQzcC|Ct z{sJuTjXit&;spR9?RxEOH=V`iuy0Vd&r>VaGH5DfoVLJ|fu-)EH#K|6 zJzG^E9F^QSdC)e+vhm#gf~8RSE{!W}SjAnt6mXiy37mC31H7aBsyZ5q!dT3Xsf~7J zpW;E`X~`mqHn<|L^vT15FscPJ6X*yus)s(NULefOSZSw{>a<^fmT`82K_(KNoa}u5 z{w6oks=KIq>4$5=Hg+|v^4E7Y=n6}bK?Wk;4>(F+Y#a1Bgo2Kyv4kq%4hk8j!g2E7 z6eqxX*P1X@CbW&Umo*x;$>dp20R|Hw8o;|-nP3RqL@*$w!kShE)FE`aEw3HoBb z6vaZtV*o}eEK0BVF``}tyljtJ%q6(RrsASrw%_w`ilqL=4|BMFp~VN0k-SNE_Z=?0 zdaE`;hXnT3#SDUz%Gs(Ev$2#LFlYrLGjLY(9dSz0d5xOkg=nu%Ub&B)l=2Lev=#T1 z6E_|fNH(6!>_wVbV#k*(6Mf*E>bI!)Rf8!ak^FufX1rLc;c+U6v+#N(5hP9nBY1cvU1xYie^l5-*>jRF++EtkB#-rL6EB>YDk=jRzWw$GS2DhUn zj3&(9$FD}$eL9MC9OhfAzh;7Ix(WV?(2NjH2da1nCYUaVgps~(XYX-Bl5bwkZoCtM zv-}+98s1jua0LcT<{`NG_VSn6y??`aGNjK<+3h^83Hp?7MP|uqx_d(Dk_!tLIv{@H7>=(DKs-f}shFZ3gc=9}xmv zP+C@+*pFU|p)zmL#*5OP;qol5?%nHPdf*&(u#1!8tg_cj6JA7_+D<0lzdIQO6C)TK zC5SOz2e6YYP@#Kv>fiCFY)Em1T7zbAT8y6_9>Jc;9%Z0V>vk}=djeN9w2`94veJ&g z+_kjO!Z68S+@(l8LIl+*7MgP7xqI&rCHbIjuB^mGGP&f3N$`$nnA@SbD-F$lCvSh* zi9KR!gEZ7*W)4bQYi;J>JCN3~SS#ACW%S6Q(TcN1-`74`Zq};$kepYi5|ZxZ?aV)N zTZN2IZzbPvfUSJ;>SCumMxy1Rgmz8OP-OtFV~Kv|SGCeyp(HnH;0@;2=w8XNPLB}6 zBQESB*_nzD?35nP!X0Mb|I5;8RivTNz4!5L%*JYR|Kmd*N|MZakxq7&3J$_Q`zvV1 zgp{QUr=5Oe-na(h!WCJ63hMNxxOACKfToa26NFy$p z5G>E_;JCPt28{Q8b6na}d#>K{J_Ah_zro1digQuKHvwh+Mp6un4FbJlvx--^B*nMd zskx0(cYAK_RQ4Om?%?j<4Yt+Zel#h@JD0uMl+3HL^{6L6-$h5dF~2U>ve*CZxryC{ zCb*SbN;OxJ?+E$z;dx_CcXF#4K{5Q>C__(2OMOP`{=i$?_dPCkaTh)p$vJyTQ(21o zar@5d=*p2yKi?VknVm%uJzBMRqzTWXP4qe&(zu0^4uqeAHO;|t>1SBaz z5Rm9AIfH~oK^g=^B#EF%Y?Y)SC<2WrQ8Fk&k_t-B0+J;NO*SAoN>Xx;4QxH&`YN9J`Ku26Vv@g-&y@y?JIPaQf&*;rb!p_etFXH6h#PhyW*_*5OPuRAKMHQ;n`SCs_PPr(M>c{FTmmxt z0;GQQRunq9nx5~ROLr<;+BEzmIkxu^E}DBu56bSU)qPHyVd0X2g;T|sIt(4v~8g+!+$My=<;glTbpx+oz2a27~ z4mP5PGta#?u;d5J*L-?419_6zXI=wlNg~#x`3Tr7vEnmD=xAV z;>Y#gD6}(BK=HX7ue0q8YD%F|5CCz)cphi_AixdcItHQx$ujI%?oCz;4?UUCe4P!sb#UhEWL%mvMVf2HGT zRvBS0fC)C{3|jOX0uwUzW&4v2qCQ^gSCTxMAxRdMP*kKHZ9^-#qhouV$IO$~cdwWG z^(&&IG~{@PAHZ6vT|VE*G2vbRI9^Y33xcD7b`nVcfH?#Ly2H4$pu!cImt zAoVnZ+J)V;38-TFOnSwoHL>|u7xCO8{LZD=$#j-boMfrI9vUAEffmkK?9e$yj5XP* zeFhL{-;pHkj!+HF$ScebFUxARx=wd2qJ?G?&PmQg@$NkQ-7S&Ti-Hx^#4&e@4ixfz zjQ6jX&+i*oXK5VP1$WW(!m=U%&SBlr>y2L>eZsTdV->N44cboy(4|e`~s#m zT{_L|trzR1E^a7!^hgYh3S%mJ1mh`1+C>Jr_vdib>HTEQ*S=P$_HpGyVNi`l#66gi zmLyC={z4kxB}njt<%-|6;iwEjgl$R%VU59Q>r44|LL#Z1bB3L>pzQC$T#Kd*g?ohc zIe0I?>Eh^uKob}+owJ`~@6HbPmR97lTR;3!dSerxxpIHNW5reKhg`AUvC7>k(l4(# z!@{<>pd6FdM+?`BX;z%{S=W-FLJS7)n1N{T-w1dQSg^^@`UrpiV6 zAoT6(U?^dl61bgHb@35!h3ay#X1%1kfrZ+A+gAwF-Jnmn)vsO5vw-eO&~yP>a_HG) z;HC{en9PQdpi~VYzGmukId@$M)oXg7UBPY*y zHpuFG+1`GMt!oEe^-!nPae88SIw$y0mJBUZnidq@qe}%wz(;gsm_FLmT?Qjo>v*9} zcRZx-mJyw>=N%aFL~(-PB$3NaxRWtA6T}y2gxsGX17ptiXTt`h2|4_x6vRO;WMA)u zTltl9bOT3^+F5cS&_(w>zigx?=j)SQmx2?-UObrXJG?}QOpH16p#d;4E| zT{lwYOqM$Ff^I^j;P{^tvw+w<*UZ2Z}v{sO)Br;R>&v@$g5 z5c8BES@v-Ou!)1Z*6W>}v);spWf`5bO_P{+A=A4_LuF|bB~FeDs|M&Noh<%=9lTIV z*BFSr2X0~Nhj6(^x(jfLMr2N7(wER?xmjeGkVXThZ_ zLo7&!j}Z>(XE>xQBn%esdpP8Pux%D?MgP{|Z2f)WVo@4Iz0T@Ho@#zi1EB;rx}E7# z>6$I!CfUAbjko`P!Etar&w3wVkgpa!XIL!gVbtNwPZ$LFS+3zx)c(XVS_6Mq+&+}~ z_PtZ`Xaoq&BR!}_ng7bq1(UMFx{ivcAqkOPia;&}!0N`{nSTM6u6upG3}aXf!?j5gMY=l=YutKu7Y73;p2nZh+VhO4*gM-^hF%SQ2rw>U&+_T&BNB-pU*25_aHepXKveYS634QhM zy5h56nas|(>x=^rk3Y5ItnV6>gy7PFD5fc$9#sDC9ejMlnaZ=SHPQL(Yh1zU!M1)h zrW#=y^1NO*NPzW!M&iNpgy!{2dTTIIRnIx=7VN5R=sUrMZUHL~oO=1^vRI zdABR}MzbA0DWsvTUMZJZ7Z1gt(B(D_Cwey2CCj4%LWAt!Vj+*njj@ug$rmUhbEo+T zxIwh}rrToL)}%42%pDU`Ho9K5yz7e$eV3|slo=<%RcK8uqp!J54{W(w1~4CP+(;s< z!m!CyWxA16?8)EL+Af=BqbOBrRZHy4o*$Y_bStkP52HN6(Q%H)+Vf{b3tE;6rORAD zGY~R8`Sxy#uTNF!4yj1u4oi!_ko$&q;rv6?dhCy)x=<_@ch95BF-4(kjC{E!XoH6z za#Jk?y28qxT&TglkEJjCKKa>{=Nuc>QL1^CnUp}VeyS#VO-rJR+LS&hrh9L2cB?(W zVm85a;HGrwE6(*Mis`j)sC;MMc2U(m+;!i~?Mr(&xpf$OKMCPx;?%Ni$@~k&y`SFd zdW-Z)Qq?=>SNWg2&7Bp==$so%h=;ei24P}MfGD8qJwVD%CVD~B-%v~F&h$E=Lhk!t z+Iht3`(i&CLgqkAG~tqoe?_{-*(yxqc)p`r%UBH2Vi~_mRaMDh+(&)+(W~EhcXaB{ z*IP$Mzm%KlJIu=UnuW7&{n`DX)mQiwqOKehbQHH^y^y2NuC?1HC!nAwC+}RhTq4zIrWu466Cixi)BLu|iuKd(HP)qs709&bNhtjkz zaVfcD9d`NdjjsQ}CDJ zpz85DWP4}@4RE;!NHN4FnLCzGV1e(!{0@vpORTd&dh^a?Ax5H5@wdr83kD(WJmBhK z@r<^|#-N;TXsm$4a56&X32E=8J--bY#&}_75UA$sYPXU2btBx>(g&<9kZo}A)9MSz zu8|0Q1&=Co+WMg=1K8WZ9b>_3FX#=$Fq?KseMHcw;|ghAUM4N>yJk64i7>oH@L-2B zW)j_tHJ=1p{}2=8KK~76$zoA%l#cBBo7y7Ln+QB-L5yHyxUm} z7}3efq8%yuNHgF?3!Ibk_si;ri8}3Mrcs_3eHfc?U?jWoijupLd|;*mmpj^*RNf-_ z`@ttXphwQ|ALRf6;;UrDKdQMJ9VRN#h>1(iVjKy2pNccKC(4*9KNNI}aw@ zF>u{cKxzUY;s6(zz&qr;)Bb?oFa6>Xre9pZT9|lQ8KM<`hzSNw-_49<^s|TgFs;-| z{su3BikJU-jZ3I#fPyet;jb`?)wCH<3vC)Ehf`lae81W`+2MGh+wxY}X&+HhaFUX! zFO=6TbmFEwGS@Awkn;IJ(m>>Xy{r#7mFr8>WWYQe2GqMx3Jmym7b0*& z@)x^>{}fNc6_6)N*LM$u{D`-*5pyxWjo0xI&4-t}aGl6eZ&%pn0bY^Vo$s6Ei)KLx z&sO1&xFM~9T%GmQd&=_9;hWnAMYFRjppf z|5Z0|9+xsQ)oI0CCXfqQF+;X=?4#FL1L1m}6)mPCOgTW{UCOnmdldS_A&`2As$Qbg z8n&6M6&V+fedubiuu;3|DN^LE(Z=HC5}xrd$9 z_8Y6zX+y3Nl!c4zW)No}1;2%>cAZ?|s@<}TUGrn8D83j!RK8W)(twKcd?eZ7KZ1_i z7c_GWQ`JQ?o^}?$p+#5A5S`PC^@USRQQ_Rb6Ge}S-Ylrg95Wr_Szsp^XFOfW7HFLb zgPw`iULiM!Be%1f-E1aAK`k;xa&2vJzWnCOPk;&mgLCB%0V=djUlc0OHBxSv|3Q1@ z2TjRe-x>YpuOI6W1fyZqlwFiq2W{=M*5*Y66V&XhYH8qNEMYcFz;j&awBP&q$b5yA z1iBhQq5uk!7hwQIb2mNhK5@kU)ZMc_*TXnwvcRm*umZ9_YNmV({tqsPyeRoC+(Zj5 zZzIOQm)a+_ztBgF@b%X#IsX*Z!{+3CsaQu#o(XGp{w%wwslXTRq!2^o_d07O#4ifD zZ&~IYTuP-ir{8lTY5ykX$dk0J$~MT2Ye2vV%!tR{O-1e=3eZ4qB4p^l1PFe3|Ay9d zjP{t=ZU6nNR8Q~Y;CE4AQA%^RN{l;<;Ko|V$a%?9`2{|@k5EE#4`0-M3sZr1)9`1f z!|OB>WT;`#M9;&%KMs|a>wo4@VH_#D+A`ALj`WPQSi?0@O|e2?I44A=SPTTt;S_mA zfCBfQq4CJH_8xayp-3<*I$#0bgJQh>;P;WYR>(6H!O9j2O$+Mme^M%-``&XEsQmN( zHbs1c{`O0TVVTQ~EQ*J1-+3sPL+oWGv;bnSNE;=(q3fZH|ubNBjCF)7w*sGzxzq z6GWgcBuLDBIS@>H^7Mi0-1Ar)6w=S0KDS(s_qcOYdrX4+`YyA~VvD#L!LgI)EpB}w z`4&w^&EEN%z?J%==f`K~xBtSqPF4(UR}i2M=MKtIq8RU)vwW(4V5CCLb>}LFrHomr zrO{gr_2Zhya#Wwkm0c^n`7ok5y>q_5AiXnt`v>`YNnzW$q212j?aXt93iQ<)Hhi~) z%MBNSGSASFPh-^U14a>-xogc&-Jp-&Ttef6oG-=Mh?}sBe>D+M{LBtL(!KpI6w% zyuN@9U$qFN+s@py+-z+*^K{=`i%s$lxr-@wI(3R=YmhYJMem2MUMF_sVOtU)VYOs; z45A(i`FV00o&ghHuLMtW8J1b^FXVQ|>FrLzDF*!e`yF`sj9={J@wY-h<&Y&FJ4Q`p z5l?+RzcbyGy^_qz%!uIGNb7T8dY6FL7R;AtqzJ_)2kPS5TQ=2(Cz-TQcLu*t)V9KA zKh_|9c;aK~lWKjR!`RxjBi}Zx4M4<L+es+|%Prex_*U8zcDXj5;IuoYHknRrHyP|J*z(0VLELBmpW;>>o^&zgtU0n7 zLJN=K(smA1Ifi?^2?TnYw@}t4^8CcZsRdKs`)$8!vicnPdyDPe?^W&81|sjq0xJMs z`Q~(?Y)=5!!t%B0k~l|G&Z}Yu0QTcOgX=zdc^=(V>x_8Avu3#5yc8P~b$A~yS+!|Z zZd*OcoX*4;$54cCTK;68E<8G+p)h7dA=jihaT2`vXNk_d!`L>iAYb@rJgmSUF>R<_dQ(f56#TBZDrxz-WRoyC?O7M2H|VQ-&p1z#=9t7Mh9QC3oTqDVq1 z-xH7TEzF&F?F#X>&0w_hC(g%PEp>8E@GIa-dA7Yr-mQI=p@k^n@s5q`RdFkG|1DlQ z%=pFQ88d4QiXl|qxWJc*URjTexUd#O=~6nUr@}nXZl?9KMam~DaI&CWeiIU|;D1M$ zZnq~s?@KsGYyX^_s9UmM+QBP2hlT}5FTOKS%4YvlDWXpjyM5XC(8A6`d#{122b_bc zs;`1o2bsHLrR;q~=#;*(Yju*|>6a|mVv{}Tqj~a|D!%4W5oOw;IY(YCuYm|BhjC}) zmhjKsnt`NExLsNv+rEW)`}(das_Y?->@Mg;rvH!sdfn9hk>T*{CZ# z^oHq2Tuurl=nBfi??_~)8Ss9&m_zR8xMMtzIz7`A$#9;}vXc^26}a-oPO2r@d2e(X zGxOq00BPNYV<_>*r`!bdbZ(Z?UEpqOq5uOgt{E=BYu#oP|tKD48-QG)~sb6s^L5+^0&VB;F#F@tDM<5~`L{Lhl zv0Q+wif|9^)*pE~%w7}_7?v%eK&1TS(pDwKUxvJ+?SZbzj~dUtsg!vff12bviE5&& z>%>fw`MQE=->u=Y2SK5$Qq)(aQf#sO$5#7wCP(W(Ik?LYQkmNE)d}f%98T@q)mj{_ z5H%_uJ(s$k^Er__L7KsX#M&|Tz4>;hRMq;uso2<9ucswNzPqaid&RacL%qG0WcZ12 zOA-sER+z&=u0e>>B629;m0IAh3Uc3)l#1vUqRv4#QMdnfI8Ka(cAu~o9wV_t|8YJmsDGnaj=tH*x?`fR$ zpp?1uB^Xe?WM~Jo5{9`qr z9=)=o5kyJ^ro#v^AIcP_7_j&Kcg85d8W`(tgvd}(rVa3Q%=*N1%+YQznMXt&#>#5g z?D489egONsYz2q^x|76++4ZLM&LlGFr3yus6A6H>z$`2>f}9F3M9X`5c7cbkL{mnq?BvU;bimZ;G9@AjDEy5{c46`BEA&Ka$b|22YiWQ)b0akK_Ux})7$!jcU@3tD0CaO#&>fA zIairRt`SyAvMTF7vsop_R`I+NKNVJ9Ob&h?tGRsr02tu-#E(Ysm||ol!#@ete^1f} z(QzW;Lskr84R63A=kUob0CPPj?mz zd|;d51k;#d>QEyxd_o-3mIWU0WPK>#rO<{$Jtnxym%i5$sA!4wmUK!`{L`xL zD$wtQz9#^ESSDSq16B?BHOZW?IVzWYSIb zY2V=@@extn>Tf*Zr|@LsowZjc>S+?%hz##@Q9#E-nObdFDlvDaF$K)7*WIUMhg>(-TU%S@huF3n{6Ecqc~ht^v{##; zz-lu?d0T6=4t1H+swyg(nYHIi+WaqLQHE#;c!>WEew~wYtmoR>1HbMvnh0s#L zM2KjtFrWC8$7cWUO)j_Fi}>F<0Hn$vPYMF!+w)Dl8Sp9_#H@>m+9DX9)R`MhsUKra z+vEAcBiN<5uY294VxaPs`7aBEwoiyRS-ie5aBI1FYjt)IV%U%Dg|6PE1Hz!Z{2Djg z2~HzEKNCDg9GOBB-lp;EFADgEEbK$iK47L)Df~RsDMIJV(_1`eF4h$tWjK5!FN+p6 z!dMT7v5ncV%bDJgx1%`en<@o``ID8B2tI1}LyPKNq=p`c(IG_;l?PmZzw5{TO=zPP zqh2+fVzOYJuS|$adG;@z`$bxTPpSXx_=|^P{yT(@9RE=*%%rH|8biMQ_}j?!XElm1 z@w#(V&C*vBX@a>ItVho)OW@WPM%FHf1=|f&p+*OGDpuFxT}_XGeDz>K4E4&Z)qelr zYkU+o+Ih-mX=9dS0t$n8BxL;$z0zgyZpKJHfSkGF!KnVWFB9UsWKupYGdO5{7ut|% z0JxAdZr%ewE~NSQ6W%M3vJo3hQVd%E#<$n1J%18*$~i1go{RbJ-wx?fM67&?CuY-W zY&7I?oty$WU5Levh@F~po$X&N5dJe)V2e)OVQ;UeUDbNj))a6?zh^dtfDFIZkl5B{ z`D8}OVyNk&!2A*KKf%s@B-l|O?y4v9Ukk3g=$c#&7&nBh(N%VOqBRz~?_U}?$+Dgt!bY9Y{fFrT`D^|u$JZ8 zHA+>WhVRW-x&L6IB}Vv*-Xw=cov)7&sG_B=kbOvEnU97Hvxrk%UyQ1L)_ypj>^$dB-0Dm_{|@GI<8C6a_h;Ae_iBE zbBwjut%UR6D+inELdRn}D7{#oN0AaHqTEF(#@8<=9);<)Mr^qzwVXfC^|~>Bb|=K! zFDEy)W+(pmwYC<&Q9!Xoeh0PPQJ~$++G{y`14`KAjw!X#i3;={KA6jD*vdx|Hv@bL zlxj6R+3wVF)jZYsO5GTQ=?d}f8I*S5vT+^hoXwqmm_0z+_sY~;#hv4=oQK@5@sEjz z%g?B062DA0b;gIrGifIz1vkofyJ2^A@d=uB3)%sxhWlIeYP`uUp#u%Wq0E>|K`sY2V<}(d>Mzkuo3Z ze@LkL@zM0osk;-q>UY;6ccH0TxZR&C*ukzd9Hob*sY

    siT7q!WnCkFGl9)EORai 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

    lpS>6WJ(rbI3Hi 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

    qM2d6(Q!8W z7Y6r;4+j2~_{5J*2cfS2Onb$xcWtn*Qn4rZQtFo!8oJzvyZ|U)pQyy0D`jZsXGzyE z2}pmuk3swKIa9H>*M74=>B8%gFGy5mnh9U=w3yqGFcvb1Ate-7U)NCf3%|kv$7I>$#3)^i10g^L zRfStRx!?r}Nh+~06J{Fd3~}R7hx&VQm^MwHK7%QZal6WwQA) zq29~J5)TsONr`VQz;E%V0mWb9AB?~MP|SguE%~p}?#1TgM?&!zY?5~lJ$U5*#W+C_ z*DuK5KP@-64=Mh_LAwYT9Dr4DrW;_C zS$f_Q{^gjXbN$;aVgJvsDlY_{W~b+^a`Mz?rxcfEm*N{KjT%9E>LxT~0hu$b&^n)?H$TMIF2fBJdWIu7}bL&FuF~amoB}y8uaQX}b zQEGBlSxNpS(N+W;P$EGF^~!)zqdWw0nvv*svF`j2^~%?teT->t_T$(@e9(C0O>NdO zu?E%Au@b@xUgJ@zF-NE0#MG}k6r@O3nz|RKZ_Pff%?K-%Yr(QWmVU&(ebH#rq{Sed zXToB)Zhz2?U^mbdhtdo~jf~oweZ;Qwg$PE8%KNTVNzL+!Ep_%_QpT|=DIwIx+yR}@ z>D4Vze0H|XBhk&%c!*Z)r|f5k@rRUEmOFLP7L5CNtcg#Iwze)3_uQH(P7>+w%C@Tk zmzY{kDmDKanCbplGSfY6CJEDA3lBJvmFbRCl*yy%Dllx!_0ZB?8OsWLDOF`g*_mW+ zF}Nw-&AqWnKLWAascZ)fu*#a6F3c`Y+-9`%Y>3QjhmsrFSnH6Ya>eV|& z0q^GPIX*IW{qoir|I#!%mJy(Aee;~7e=cS<9jqkTT>ZdIMt4?f;vQk^!A2MANq!h3 zS0lB$93-jjqblEqf;xi1P|!fhF}^8`;KJ1v z!4?ApO4qO^GMpS0A`EBn+4dcs?h`YBh-2J3I{hbRe)fxU#Hd*cJ$aq zz1pNOzmYK;P8ve;R*+|gw-Hv((!qI%HX2taU6&E2B282~ph8IkEoh(8?u!xOrM)Qo zUPGo`mozwH2uyGw`|P`(x*rAws(I=u$j9;)KV|3Ereo|Zn!)kS`7o>;Hg)1dKzum* zTF+tQDQ&iI`^NBS|I(M=JYg1iLcRCi{kvCQ-duK04hzZE2#^fN+&)on!wlxHX7bdlRqHvDe{LN7Zd&$t*o%q~PntBpuH zLk`)TTR6};BqLdKxG%SGv2*A!k;s~-ig-10{QTt?KdI+>T^s4)*RhssA;ECU5spe2;j8e2qv51FJrezm|pa8BQ|-w zm*$sQj2}LqJxHsUnRyhZvYYk3gF3HI)EnP2W-#@XZC3H_V^e(Fu}B1@0Sq*}&S3&n zP@wmODNPjF>rq+URFU4>SOn(I07qvRkeiDx4j6(u=>!;bvk4-U?kAR{@q%{q*+x{eV^WM~^t8 zyZMWMHh6zSiwZa1JHV7^3GvT(|6daC5V5Z$Qoc^YVVd9=YtS-Lvb5Qs$X_9$$NysQ zU;ser38n!f-kjZia@Lm;C6A?psc+1h;fmsja>OF0L zFh%>VU8|xbzhSZ4_&HXguJKW?kksNQ7n743@M*fC0Hf7hazKlt+D0BoDUnO0}5S%L7vh@55@S$kfJY%Uoo}#85+mAHu#*3 zrc~d3C6-&^C_I$#26ns(r<)qoDbY#&n5F2!Tu(ueIivJ3(Ql+enl1Prm!uBgT%nV|?4HQJK0eq_A4&;fR_Ir7O?a)cguh zIIE|cU3lmFhwFo9g16OZ4;u$KHf;-?>~d@)Y^z~~e@JhUj5PCvx0B!j=IrGym%86i z;F<{meeV~Gdo(lM2`?#i%%JAUsS3EYNO-&wQ>vF=AhVGBG3vtpq7b31R)UbCn`J

    HV|A}NYQCIX7Px1@wC+>Vp?VzSz}McYa}>+ZaOWz$DYiVv}ISBnEZW3cN5VFM( z&TH$-wL6{2`mTD}QU?t$^ht1f0tx|>m^oB154PuRle{E*I!V|0keF8Sw2_Ca>CHal zEVA<=|&N zW&6OU@Ns%MmC(n1R{Z%FUz({}%P>4|_e?W=C0)nz0d3rDutu{ZKvI{tmjW0CeD2+92p=HbND=dxQOLA`& zF;usk;OnugyP)}nKIN+BnNOv4r>Y60BtAvEi3Ti~Vr{^6db;``?VGO1%t$Jn= z0O3Kw#>!2mJvC^)hnD@&XBAw&sg&;Fb$qO$B@Q`?X?0=Ln$NapqMr9;2UgMKEF*G& zE@VGlHrum`{fZb(sCCHvbYT*%n_vpR(5e~U;Jga)#1UV;YuE*2u>_`pHhI%8%7>e z<|q1ylU?J7d|F;=_xBVat>ir6o&pi?^G$~H#yeghJ)Xtx<#%ei=&izbwIj}s?ajCI4<8dPyb7yON zX|j&tQ$UA7g8K!%O8uGyHmUT!%BAuASYdGyUfDp zL9=d*M;|3riq|SSVO91h^1!5<4C|y=w&vG#sExC+OU{eZC$faVm#I807dg3nV;^Ow z+B=o9LXNhM$H~kIOgeSSmG;&1gcmv#$NShswi4Vs=I|gAP+v}Yz(dCz)hF`TD)K~D zvqA8E#Vi?FHmWNU#uY=i8NRX37$k?ujlBu89MVW2%B?od)BGO_RWKH# z8kX^KhbZ7LzAy%f0+@*B^|07L;16HV{>mTf@7N;yq;4g~pUvswoX@FTKHS{*ss8a0 zkv)%=8oC!Bt9h0e>32dgG7jFW-0|RA%N%~t{sUzUA0Y;Yh|W#hF&^hvt9o76h?G|E z!PGY?4yA6uVWwO zvouK0l-NZWhf~*brBphs?Ao+O0iekG(LxgZ`=V6kJx|xR&0UjML{v&@qEPj~C$MLxk4Oy2LHv zc48r=I1iblq;>+=c>S`T<{0oE&~q`}7tmbKBRRSQ)mXvT^OCtGKcbP}EyseCut~cy zqSR0mT)zj$0oY&~3RX*ZUJtw5%fgK+=J8*24bpCaFXUCK7n=T>L-{N$n2X-~Fwbc= zS8VMqX4$GG#Ys?|%5%r6ZNlMFHqY(BJF-Fwxu>VLoEGUbGYfVd@jHGd9Pk3?`4 z!Id~J9K|8MRaU6%lob*oo0nw$l-Mr3+mERjYWBoU=0U9h!wlykXJ;&zM$UdkE2v9) zMrCcw95CEyV{ReNP?%|jPm}1xkBQ{eI-mhrt*gQL_%f;I;P}pxtXV-2$lcFF5`_8P zT5JcdlVb79lHB$WV!+kD>Sb#} zFjS{WZ|hd{plXml?o&E->-=QH#{v!7u;=8H#ZS{r=Vn@lgG5D=Jz6#KvfpdwMxsBn zEtCMW^k;vHwDYGp5udDAY;rq9mRtY*IMCbO762}MBrau_iEex7xh5`jI+M^UyxZg_ z@Adm4+~nkRif7gL?BwCA)4ZeBqBRtwTRy)F0C`WZiQ~is z!e^z)c)R*)Yw_w46=_=b(qZ4Xouqi5YV&Dwsm9jO++s=1#1)I;o4{KPPvDdldBdgJ zOW`v)n=pZGYBjvuj;Z}U*(G1y=Ajrz3uvz)s|2SG<=XITOqP)gGH=@kV$;9HfSB>+;4TyT&Iwm%j*&EGYYcaX~g(N zbc?kj>ABx%U^M_G{;S}0bwJZwSV}IgZ90uSA;k^=X)OAr?iXmhE8(oC=$59nYxG`m zI6k9Ci%mk^i7zCBlqrZHV4pdF<0#}FO&zpjpARTn5=gun3gBZfX!t4CB-qm#@9i{^ z(5AD?@fIzXy_uynf$w&s2i2Or?4q42&>d|k8S{nD$0>Gh8Hz`lnVXDVj}!!cFWD{* zU44K!?Kl}8bPm3HjazoA9>M6u$ zgO^e4{g-6tYc)%utdrBuK3z5;yd*|1`@T9-l$?5h@azXk>JYwhdcEE#e)OP7x^><= z^ryUQB*rBfWy$u`#IKmy*mVsBWcc_A5URzjSTjG4Q3{0=tKFxtC*S*vA$-YFAZ+KBjQUoxZnSoJ<*n|$ zM!_rNv~j}uCKzoixw6gN@Im%{2%N{wUAsk_{lMOD&BWSWcA9mezw@p#hhsp5KM!gp zfQ6lp6Hr_=MmXbM~W7*H@eg4Yi1_KGD}VJ{}4 zlrGO`^~-evVbb9h@;ICK_$1)z%kr6pk;;O58c*?iNDTo`%Ygya@P%HD94!GfFB5jC zG@gtDEMINc*6%=*^^qvM-X~}!nkdz4R&J-X<9>puM|uFbez_D2BEip2{*%4X-n9F522^m4aQlPZl}*^= zfccUq;um+y-6PD5!|fG)VGGM&L81u*kfwMCLEKhDISiv{T3NrbF_LLsMx(D1N}`TsPXHTZv_{DLdw!d=98c`t0zN;yNEdRLoNJocgjo z3+uE^S$;$h3EQ=w}(s93MGdC`J3rsk$2*4BULU(Gxr+SrEh;*Ql>$(Wn>Zt z?He@nm9b|d8)?rcGgo(51EqXr$90S3Udmz$6qL zI5Up7(c>1{fnz2Z*Y$SoP<2Vj(jX~40zTPLQWcC#9Fc)w$Jtm8)E{udsfqIz67BiO z{+vQ5V}WbWJ{>a|l?K;GVJINQc4~1|oOvsj2^+{Allx@d^S{oA3AQ9)2eAgYG)(A>)?l3cf?eJrNsf%D&SpvCWTiU;ohLyZ(jt_gXjMeNWEh zf9Jj=P$B>bcGJ$#$|*#y;7_JAQS6WH|j-j$dkrZfE=7v^yuRkV6y>Vs@` zpqpq?%*3%bFNS>qdyn*a!gYDU=8ywEiZky_t&+=+6YHW=-1M{4UB7XQ$lQF-*y_2D zdGzqXsKK-2vELYpR@E?tXlKn5D{ZiGqKeBe$!|aU5s|HXuqc(|DMveSNuZkNC^2Wd z-VU$M(78x<(-S4A?i(0oA0@<2@(#TPm4+;=4vnn~FNYWt?l>`UG3cCPWVJc96krWEFZEV&$E(Vh!Unb+IPdy2 zkLzE^!jpRx;g-R!onAqvb#@`e?YYQ{_a58Tng2iRy?G$iYx_UmdRm+|LaC^1otT^m zDN!Nhl%g!7%*mdyl%)_eZIXmggfc~v82gZQ&JnUp7)vzSh3v~PW9E0=!#U4+p3gbY z_IaMq_w)OHpMTD&)GY7&zOU=`dR?#Uy5mXk`VM7tz`_$X;Ax3odr@#dHz~^^P$`Cd zDJna**p(7BWppFlThnX~STEqC?~;3>!gZ#?i@%9)Pt^y!8ajF5ShBN76;LJXYgQ^6 zJnh}e%n!}?`*{fNBi1C&ei7Uk*Nh*JJy}zn6?^x38)A70XD7sDmfbs>1&h9Ck@IPl z$>7UMT6 zRzr8}=rbeNgF+hzmV7VRtuOQ6P7jsR|Je%vd-)}j9tzxMI_heO`#PEDnOiZBFB8;8 z?Z4apL`wO@!D?YnpMvBJDQ4w%ai-gZ#5nOnE!nR@-i_ zK4cnD;Pj(0?W%8^mDTBisRBK`Be8t^YNk`)OkBa7VVTket8QHY22l_jdxEE{CNCJd zbi#F1%PY}$$@LLHKxF~0>TMcoW)>%&A(BQYLj6cDi^0rjlMh@6Rv5N)YS^&=wvrQ z#Jnf_b+(1IhF$jFAg)+v$YrmISYR3AGU|$7bB`vPrx%&v8xti8PoMe4Xg=-br(@O|#hDW<9xb2ZK9d zGrOHB@*E45_#dOa?*lE6d3PsfFI4nmywlWxLq)IvlbPNK#vLA zXxlc9iyoRwnCGK@22Iw0RGrM1n+C|I)xah!(jD-wzX33ykqUcN@rAg%n39;n3rBpF zz(ETyLDPUW*GTT_W&muCVym)SB8akaSZwK=FH)|+RthWDDR4j|b|`PYFCbT8`Z2>C zcg1eB!ph3Os843^#jkRT191$=Y#C-{A^c@uvjMwfc&|<2S2+f9fmURDa$|ap>U0Q$ z%Z)<46gsyCHF5~dVr3q!s!h84PbSD4Mvm+DJXAlL@!)dZG?ap{AntD7!Ac8v?~}l^ zm)*a%&&q%!hKLPt8eNbqXg*D~IWIoJT%IX~M!U47>_8(d+Ew&`D^WnJI_XwDuP)_a zoheG3Jq<+wHi8DyYly5^J6+X`yX2H0=^KLE17tNnYB?+^Uwuk?g$ys1e=Sbyhh=v= zNuVlmw*?;vRr5gO>cz#Sbb~xGA2VuK5aZ*yhh+h`j*Qk`XYBAHjQV|fuyVci`}`o~ z7mv`BtMYh7!S5RP)Nz4woIXI!tp)2bx5G{HwqhP`bE>Iq=mJ3xrV2cHto;L$7|neu z`Qn#$kh=0m#%@(ZCM-Rbk5zhcEQ@BBs@6Eoj|7Rpm5!#u*camRRC$ie$wQN$XGkxu z98&#IN4@8O9(k&b+<4uaN_Krm7{8m6P^ro|96@=k%!{=dNC#_F1=`~yV?oN!R=HnF z&qAyJ!XOj9L5F1C)-7G=LpD_^?@W|8Z*{+K;GC4%L#q7F_omH`&X>vcAYkyws5a#R zto+v552qlfdc1OtuQr}!Y+?y#+H@ zjp^R#Th;-m+N>10L*87ueLtCY&c0eTT%UJU?a`7GIAa;ZAFUe9ywf)qt`VXNQ0=T} zT2E$ml%3uIs+X47A$)WRI~<^>n4DLgQd~FNs+?`^gM;MUz*CR}VyY zrH?HACaoS@XZHCB{a&$r3lhs42j*k;o z=7iKI^=f*|8rGgb@LRy%iXar$Ov19#mdI!>ZAL*L?HD@w2B32c%r+kI+`+7bG^Nfi zz?6xW?VzMlto*j|Lg}k%`-;%+k>XF*!W(E2dxw;dB`6s}bb&*81RYAl{&Rk?iXwKO zAYt6eE|!T57ZLBdQ}lvTBQ39Hd$?#l2g|HXV?&&Sy_OfQbnoe&s+e)Fzp)JrsvLi_ z4dRj9ZJS!y{B8R;{y4PJ@M0(D#D%j_b(pO^lrWmu;I>z?#%s~Tla zt0rw4ZPIr`F<<2>vhOpp!qG;#AR3-fHFNdi$p+IACR>v3H90o9g+L+{;6@HgRy&i( zODmRqQ`0=%Lyx$gwq#?)&we)Ph3!1PzCblYmR69Le8;}{Nn{N;8u+L>Jcrqt9pXwG znU>G_iIIM?&8Zw7!p_DMUd!R<=9Qncgm(n}`S}ky(WQJA#K?A@S~KqxT{h1LA6&Ca zlAuBoHT>LN^n=+>6tWIlL}_hX&k-Aj$Lj)*SL059L-`K*9JDey1<5Hvo*5^)ieic@ zBg05mx%Dg>t4?XM{#GwBxMh;1rOVkpuQ^3mRe}wKsqcp~_}p!?ommO=m1dLw;K2KG zfGOuW*#C+1@ARX)ob$$m=OZ+GnMq!mv;lmL*Z6Q+0Xn_!UP9)Pby85XEpaQnj3r0V zpFoxoB$?Jm8g4rre);nDJ)P&mYvZwPQJqtJDw>l20QlYm5Q$4)j3NG74UM{Q=YEyf>h+Ve3y#QdQI~iKtu26D+WW< z3+84`QuUP@g6-D`;j0`_Vq$GaorIqaj@Z;cIu?Sw9#SJth2ncRppUyvPwoZb9x-?t zvg?6iLDo*SNyzg;Z79#5rz^_&<-|Dpg)7Re^REkzphpl7#6@|GuypluqeQ-Z!D(dC zgq@{>msUi356VFuBRh48%sV0Of$xxX7Q3pw4QRRR9DZBD1Fs&?v33&apS&I|XX8lG}z02KzmC?A-u)-s#8ev)hYRtC(D!spB^ZUpk}1(fPE*!6}$=(v=gR zd>C}7`#~}v6gP9C9E0a!Uc}_7j0Y*c4r#uSOQ~8rePq=A_!WZw5bMpOPA=ASha%eM z*M?F)^?kGm%$2^`g2H2CwF*Ief%8_UuYU~kAP@Uj4C-PC#y7%ZZg97Oam?h={=-sG z3H^K49#$rWcK>qk-d`Y}*y@GDh_Dpv$8k_s_f}#E&6TWOdlkhbV8P=z>n+`RhtUYT zU=qA zd!Y>RDxDkUjS3*j-#CUOB=GJn*JJ%I)cbYi{}bl_0_Od14Dn!_X z9j9GW1JIc5?0hxMW_N(#JPWyiw&8 z+ZlFrf4dvuDQ}w{m8~7!e)eY_zbuJiMFE^ ztMj(5u^@pqT`EKt)LVf?mCga&zz8G=utIE@VP=X2iuu%+qcEezx*cYI3y98JLB#uv z@Fj1?H<5eJ*;gS@zMKon))~))GAP2q7-FT` z;KwTw09p&tb48JA*|qlW6;GiO7WCYM;-uy8KyEhkNg9^26BDuLQyR5F>^`n}&mVF< zt+mpA0#dMjiG^#yn?hk&0?q%1OY<%KD}!3aU7tOIB1R6IvKCjW;ta-zAgZIzn3j_k z*$%x`5d?09(i@gao~hyg^xB6E-{Yb#$ee#0@|lCKZ~}3%vL`|`oMYMSRj-V=L+ZJ| zX8-n!E=e39uT_T^?>xxIjqqhV z^h+T_llj!Kv6a5)yyIzVAhjOf`o*KVW2SC1M|vR!S-dhOZ`F%2!Dlu-A7HNDQl|M){iHIsGS7YHVx~@& zW0mSteceNDY{~fZHGvZo$zWlJCn4QZ$pSO5>YuMUjVFF7`3WD?e*nJ%+i13SNLnX4 zHf^shti3k=5n0}3@Bssu**9Dj0Fv^57xB%XwFq|?LJ6gY=Hc}<+mU^qb`>GDrVQ9q z$EvM&q&a}ybfJFafjj-H5lJsY9;<{!B z$3=+WeXLuzq36rf={aq6P9Tw)TeptWEl8AaQ`|;nbcEH-5r;cDb~(fE=q$}TFL4RZ zG>#ql<#OGq2%$H!Zf^O#?(0Pvi<1x9-gp?j{mQwBH^V||0&lOj5tHew@(82FHE|-$ z6(WTFZPWY{RnPQRK=3G5W#)7CeZ@)9U#{78^&$4fORYrLK?7o~S`V(m)cC5|TgQWk z{i;QX6G1M?6LVi`2**01G2onlsD-J{8o@2#-^z)vigrc}yOTa&NZSTN>oAnHWV67I zV(A?o`%Tv>-Vk6=5+7{I3F}6gvn$NXuMH<4MK-XcLVIPKevsG!At3p2Gs+21!D7;$ zUPFx~*))DQ@m1g{=qv5rHaqCk;u2|GV6~M48ewQ&V3ku@t0_>0d{aQ-w%3b9FM|QH zS!MP(MhFaJ+KI`5QwH;^?v^U- z9wF;W2;B8#hU84%61gnc>wY-aP7(dEuDSZ_xGNvry|}evF>*RYLO2-}qmHDiyRg)@ zwGi2LeJ3m3a2g`DphFsN2>OIntdE_N&L;hguL6gNaZb1DZ}gHpnK%ve_HHAw-tca_ zJAok_#bq?Ej##fu?p2>{DMo%i{#$n1CGqQQste-G|i$$0Bp^DY)cK1{+;$%pG zd)U||#2q7l&hCAIRNqSlzv}q_3UQxHkCAS&1O|q`Q_Z$;07_TBT25z8DW8}G_{%IT zt4`YoH&B6%UuLTgc@~I|dw3t}aTCR7a@BI+hmcRH2Gy2>{Cmin=?Xekq;2VKy67D; zOt|$JUN8a+e1IKy(Vkp@uwaECi7*v&byhrt^>k_Lm$02L&@!DDLnC%ena3vb z@?BvP4*R^uTTUr&+_1g+Jld&gLDHvM%d?(;X4=a)uJD~?p1q)ae!^%mNI#w3P;df( zRW?B8>WD?6(EL%+*dTNWoo*4`H$?pMwtA`BY{XVa9liZ6xMiNJ$h#RxgyRPy-9vt> zP@xBsT0g)>eyo*1Nm40tq<)rs{w6;8`|(;grJL|1ENR}a!p^Vt^9{dH2r-U*wV(+4>v#~3` zLrL6lUfAJg%0D>Q^^1Ld;ZSbO8nfTUAedB59xU%cWZ| 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

    wxx{6kj&sGH_2#u- zAC4+kEWr|`13)oVF+a`^MS)%%0Di=9)ytO#_u8Fb`evEvkg$Z1X!WEirh3u(W(8O- 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 PZG2LtvY{NpX-hC^^;=6`c53DlZ@KMS;+687J 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%0D?PJhc}98Ga{^`KD0RAZf*=Uwv~kz}Rp4
    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
    L21m2iPx=23l-l-o
    
    literal 0
    HcmV?d00001
    
    diff --git a/examples/game/img/logging-creds.png b/examples/game/img/logging-creds.png
    new file mode 100644
    index 0000000000000000000000000000000000000000..2a78369db5364f9fc051d75e26d030c4821d119a
    GIT binary patch
    literal 25635
    zcmd43g&;mLdg;yA_w<4nYbODDGaYxI=*=DMgFB6t_b0;vS^9dyBgk*FZ>q
    z;W^KF-}AiZ`vX3%YqKYNWY4TMv(~!rndFO_iaa(383qy(61Kvd*BVGjC>Dsc7y47g
    z|CsDFQY54&GPW`@Y6>zkG-__n?`<8dkdT<;E#AF*`G%c&z|8F3yMa+Q77RBpjqva&
    zjd!5F&Yzv#ojsj{G?{5eMr$OvYbaXXNCoO$jrLekGazH6X!AUyC1!3yqdj`OFUc=ae0+LYGxz^?p=z(9qk
    zv?)_Poz*f_d)u|>+{yb`SWv{}YlQJK^5y!AchEkK%=ZqcX70|`@7`ry!{NIwPoI8J
    zei{m%hr{9R4{$hmn1m$FnVXB^_9;>ek?Cko{%jUPsybGB3h$MbkysIFbfhO?wn(Um
    z)Dy%-hPV(4NC-uGhPb~(T(5JH|DB6sk&E*0G?Le2K`Bic1qH-i)56Wl%E{fv*&|Ct
    zrW(=IoUN9gho16V5esKWPBTkqb1P17N0-McNMhb1h@_*HhZ&8xql1&Xh_^W1UnN8k
    z>Bq+aI-0+Vc-V{6=_#wx$T+)M(FkyIadOc~V9?Oeh`Cw57twev_jh%~CviF(4-Xd+
    z0Km)3i_?pj)7i}$z%48+4B+Ac@bGXTN^rRQIC+?Pb2z!v|ErOIxAWS{-NMb*#lzOw
    ziRQ6gGjnH84{Y!+?-s1|7jahRqXMph?=dp
    zm4p6kTStU=5bu!S<`x$FtNefE{O=q8qo&^f))W#D{Lh;Ik@J6RYP(yx$v8VAUg;t6
    zznb~G@_%OjT~Q41IP(9H#J|M+*HeU?B{0MQ|D!VrjN~Q=Vo6FODZG}_@_urZg_g{t
    zw2atF5l=~w{X;w7otQrJh1{3t>C1(FqUB1%vmqS`X{;efMtpiK^1rtUQ}i^RInx2d
    zj{kl3cL}Z%JTAfB$^*a)d*XDzrmX-Hwhbd*)_hwgJji74gO8EyWI=pHB3AMeUt)?A
    zA@EkwjWT4aK5K^fNe{T=*5KfuEz)6^Mb%TZrECRoOObxj(Sa3$BK%-7mpa?K^r3GK
    zzmO{oJ51m4VW@U6K{ikJ{6FGj$6tdT0g%J&lxx*Gr#ltzJ)Z>`dP1bmL
    zfN_gcXrj4&WL-H|D}gCoYpeDoBXIj=Y<(vfg76P|3{}mKUxc
    zH`J^vBA^EE;UTAqMn@^-0~KPax-rkJON+?$+49Zn6D>im#0bZW4DEhpOe^Q6yXxYc7l-P5Ph|KeXh>B
    z?6u7xHotM2?&`+U0ZHFtq-5mTcZrYfnCusgeF78T;ZN2lV)7JpEL1pnD1h5O)VshKdA4%uM$yM)fQ@e_Fw*mM-12Iv-
    zf2-jyZICpf&!~{PBl{dWmA!GA(VF_PdPPSqx?P~NWrSpSqo*AKj7^57!_S8_hGT{m
    z4y%ZdQe+cGDN9sa9T
    zLug;6JlB1BF|v*7rphTk?Q0lX*0vULAdm(d_KMEf3Y^{s>YT)MnmMtV~C8662p0c58QFwbytkHHz$g=cMx|OM|xMWUB>1)Cf
    zB5IPbQE(Dr`Af3-YD@XmF2U#StMNBo$&FUM&28qIepePO9hdQSlx+=l>>{;WCjqjE
    zRkz2NoL|Q&*s9wZF&;p}0XETdON@=%0D%)?fTC#AEHWIJW6ZKdNIuh}KMv@;o%PL$
    zSe76)wH?uOi&Gy5TBdmV0fncXhY8>fSG;1RdQJhwh{`{`)^Iisa`sm|!!sIf+i28b
    z5GBX^a?bM{Ks#ZD)pz|@pjmu64&mK9;fk#)e*?=UZ)=uJV~jCbo&oqBrs8nj7~Ssq
    z;q9=078JmjNC1Q`%ntW!cyDpANI+BS%DJnyDCZ!+)y<*P1OgK%S7MDmbh}XH_tH;W
    zQ#6()A8*LTF)`#^eo$G!C}P|{&LDtvfidq~I}$`D5%O#WD+S0Qanv*LAG&)Y^KOlP
    z4LVc$YL~7bnPjDVBPslIt%3ntBcs_7isE`$ltPySS6t;
    z(PRU}U?#MpAO|gPefUkE;9*W2M6QoB~Y#i>4YM0*@Q!O_KSrKWPd?GK}zi-j$VXmdkPX}~toOakEXgQZCT&Zm+GAdvM^|Rujt!*T*(N=Vh<_veyPi8Ro*AQ<l8HObV4;x1mz?eLApY7tg;Zk{`
    z-idOkIo`*~dI?!r%5IU%QLwNfDzWj>F@;^B2}NWUsmHKpfmg`jjYZ*FQt#4K?VHJF
    z%^D97m6wYD80CYHu6_ikiOS~tZScqjot00-Ryw2(tFNd@e<(+z!>BwuX=?Oi0%1CSG%I^6(ka5ID4tN^@jriF-Ua8%HL|N9ahz0&RoN|2k=SPFEHT|VCQ*xEYqfDXKn
    zn}LD`5&!PO2L0BWQJ90W+wDHaQS;jAI8B#lH?zSbQdmb=N6q7+H0fMWY%^&_pfN2>
    z^D8Acm;=*l8{2EErN>Ee*kN;z=jM<0^0A(hIve2
    zBWJC(_PYO66$(~h1iMAA^~w#WGdi4oj7Ak~>aMr&;zJ5Ro*jL%W|D4s3Ltit?PWaD
    zj3(;ll%3cl%W1GoQ6NFT`&HK)t^_XkA3o8+buGh_^RXOLgH1Lrf2MSjil?7T-l%Z8
    zlC+i`s@S@<>g~RuV*j!5VWV%#wbx>*VbB~#<=&XDZ
    zeQjqxFj4n49cKKiUO*F?tbtCByn&aoKE@aaL6KPF?TFKpSUio}48w4S3g~fqxz=--
    za2SZlFJUOheS7>R(4O><@IM#s&g)z{tEgsKN^tAaiFNY5Tlb1yeefski`==2l!JJO
    zv-?Snrb~5OR}2iLrcLKm(8y?r!2-wEyvh&a=Cjvw{m;GL+@~A9ISj?T4}Ora9wV&&
    zRnP7Z!)lbyuT`w)6fPThdAwVq=W)^PJUaMsHN(^OpDUDt^pso)214YMg6YmsY20Wok>s)@swjh`xWv_ovgt^fxC6%yi&(lygtuq_RIqLGb0R>c=+D
    zo8l}z)NP94Y)+DVQnaC}*xp$F9(;ahn{4^
    z7eIax!K;3Htz%(OY|%Aak@ND31=Rd!M5?egi-W6g=MN4^k0(jL3ieZmU;gXI@(~Mel;bv$4DFI+E1yeVp?C>6-*A;b>E%Z
    zHDWwW*XR9aYz@u8d%5}hAI>$`8P6s_u(zXk*zKR~{e=&58PT=s>im`68eabsH2f=C
    z{fU4{0^w|{5l;UI^dFV;5cY}1;vuYk`w`&%Q(-|QPc-|Ux^5dzV*dk(All4@<8oP*
    z!>b!J|10YqF8#ZqUo@3|Y%Tw({lA*Nq(=T0bwz!hQu|+7Smvm2Ny&dEJInsloFax7
    z2$Shd`T^@%aTEB5BpH4I|!Hm
    zA>>E2b%%o(^&O7y@IU4MnDvw!(S7WVp~n1wPM$}A3#WZIqz5;17XGiSP8vBx_oa*=
    zIv)S98ILmE10qI!2>iog{a;xm|36Y%kS-}X_m8ar;hIafh6aZD?&@_qndK^QNzO%%
    z_r{l^`ucjXqBBH52zgF|M`yxP^U4{R5U=d}S8N|BC)L>jh}OXGlNZOc$#SR}jH$GK
    zI{R(8q3e38W6t??2V5?~G(f}At?1TqxRRmgMnqvj7g7(820^Lfa}WWcylQ9;6vsB*
    z_QN3XUhVS3>~3$0j%@~rg(ZfZgQxG|Wr+!d$#VYagRgIEdE5EW`NPfXuqyCjhJ*bq
    z-#;8{`Qmkag8)mwt;+rn+Qnl)bNX&lcLpHo__u;Py_)*Hi>#BW7rCvewY{z3M{HX|
    zH|;@Xkr0B8ySJ7O=e`p&Z<@O@zl^o%M*#ikL*Q*IGqT(}f6e}M#O4>wx)1RHi>02&f#EC(XtmhUxU?1`&*egSajWJV^f`Q(f1TS
    zSROnv=YyeApOKpz*Y9pafZ|zD%h!fZ|ubjR9i!j-kFlCAt3*>9kM!)aaMgy
    zX00J>MPwyS#RdDqQMNIb3aY`b@kk?{Vl172$Az&~zGhWo1Aik$+NUi9!BVdE*X-vb
    zL+-uKNt|>qpXq_4dCK9QBy$IDZ=5XGaIr-|qQ|%AWfj_s!YpA>6HQtUYZj
    z^Zwn6zODhWO95Fk(I6paR+R8zBtfLch}WB8EJW0OU)6q9{?n6YX;_YOQ}&iYjk{k{
    znAH93`LUjd^)`#(EZ{X`x^zSiXsg^Fm_n5=W0U^jV|)q`OTf7lOBJ0e7Ad1J@r!MW
    zDp{{1TWFI8Y3)`{&z0@@_rkTQ@o4ht^r!H}1>^1*i>Zu{A}lcw{jL5J#$dsrbj>Dr
    z-Z9SJoQ~8DV(OcpzgWtfO-Ek!R!Mk5L95aBCk6)#VSvUSE_qQG+i)c|B?$gue?2d4
    zdrIckx34M~a9>q7ddB#r(=Q^BaJTqw(@SpAlP^e)Zh!Qjc|LtBmLBCY^efKvgoe@!
    z-m|Jyn&ZS0vY?vo0A3ZQS>2HVH7*gU7TAty7nQ`dRpdDILugM?F=5-_OC0NVbB^of)n1_DT!cADl13G*{
    zIbih&;_CGv)3@yL1ApRu3SPgF1_pV}AayV`-;OhrB5d#;>SG7PS3M}VV^TO|cfYrW
    z2p-3Phi?r5SMxGAqQ(Y{=}T;%IHqIIZ~B0)RZ;C*h1nRfI7f@1w6!o{T{(6e#gLPZ
    zgvn$vC$`lHgBlF50Ei1;J41ql2W-pl7EDxCdSO?Btyx^ecBd@3>Er3SuB<$C-%LsNJ)L~38y+1
    z`lcFwvQAwOX(m|1bVFU>YD3^jrsLxZot_sWi|qpeZRXw6iK-kuOPRGBs=$F?Wn&33
    zsX3>d-on4$3s8d@amg|KJhI9KXpD@xHo+GTOvn6_->xk*1WlxnO
    zr7BKJ)fKi7-5k#CNmHgHw#r??AKbdxv=Cw{Lb;NK6usu3FP!X|&Cy3GohnVr+_x!O
    zU=2K51vi$^EZyYn9ybxopd-sA@%d(9e;ltCDI$@I;_ut4->ED1UFWk8pCS=mA7L=G
    zT5VBGb@Y8RAsrqv{h}_aAm7_{nb3$sWwGo`1CE@=gS%VBDZnn6p#(rk)j06D@K?uyTvkfLuuAd^LHOGan9+Ic
    z3InB=@uud!_ZrdqE-{sB!4@UX^3F+P6B>J)Ral*Vb!R-W#B%*C#Ie3q_=2X4tZFEQzJO9+AY)t7HIAkzo(^j<>t
    zHuAb*F|*0;!OldC``Dnb*_0OOLS>tA6*nogAR!I8%qvj9ngv3GqQf61!J-N$INu8!
    zawNUO$bB40XKmG;j4jbfKm0oi
    zU!e(_nn5d4A$3PN{|f0OA8_B{VzG)e(|z%S!@zJY4q$RJfM?*D?YYH!2-kO)4`3EN
    z8@*vY`&3_pFhieMyu;76T=k;@Ia`^-#*-|xYF!o8CGK@;@OZBXe0RSj>GeA!hW@2X
    z-g_In`pDw0(!ib%!V9r=@;zz3TKvj<-*quWR{UJ0HO6|Y)^^IazoqAS;B3q47PAFh
    z$AiZUC**Qt`j5}bEMtTYs!RsETLh_O=R9)_LUkHHZ-?WDNMDe?(3=KvwCs86DV-Lc;|huPo%5v!xyr$e6H$^i|?qz$XC?v6FMM
    z4fg$!A_rq9W!o&D7q(f>&uv`|jVC%H#u7rNC_jShFgA}=?{lGx_(u4n%IcFf1%JuP
    z^Yy#8yQSmJX7oeW8%g!-558ZalHCgH`ddM9P`zx|R?#>-8zZaoVGM!E=ei$yz_ZP)
    zA3RtrmXYsnkpm|aO}AtKBC+gzJbt?cOWD#rmY2=)9-LN3*ZW`hlI%CfVwUOOx4WgF
    zs5+U&WzP`qAV*lGJP&JZNo0MyeS2s?5{M=ouwYGZYiP&cSO>A=`PmHTh9B;>>mQZW
    zVp%x1HBBFom^JMUnRI6}4GweY8pa^-Z+id*b%=^d%Wg&%*v;>Ey9%mar^QJ8qE}E*
    z%cutM`%!=WkGj+DMZmq7;f|i9)`
    zDlut<+=s|6l7D+k(kFMI8^^(BTQVya3wZV`pv~98bu&orB|kGg(C+R7g%NsEqQD(>
    zAj`M-IooeHm;zC-i@7U$7ZF%pXVi)Z&U
    zezuFmK$GX)EGpB|QBEzV?(ouU{PIs8s=~#YcgZhWo6HG+Lg~E*eofyb|47YYY^HVM
    zCTe6>T)&8Yz~|r{-O=HLG%o^l<+}bj($>zYYP4MK09aPL+<^8Euj;9LS-6+lfgx4k
    zI9hwBb)C6A7tBs0x(ZBA4vyLpdY|jgvhxRxo6QvA9bKKm+0igwp1%zq5ZPx}VfKJ%
    z`Q`4zM37$d?_t$=iRRFAO(F=5a)4FU6Hx&|WNcf~Y5&H)Wl$u+@@Ha2A3;!*
    zuvxQ0@r)sl$GnB57^ZiVu+hY={4slo>r0IBR$-;`UqY7C#v;4g(XdItXWAy@7UG#i
    zLnE490?HJXFpM$Enx3;cSlOsmiQ$S|{waRS0ez@lWmqtQ=W>&@d;U-W^F>6bd1A|j!sOcx-
    zhVG-Mp;L
    z7e^UVF4)-4Cz?Q+heS-jl;kMRi9sMJN~5Avujj)CsziJx$U#KhBf}r6aj-;oF^~TW
    zKJ(B8?Kk%7XxzbeEqgU|K;D`rT=n)~3eNsHm-Bw`F?V2ezDAnqTap`WUwTYJSQMEPGe5W(kl|Lh!=i*;UBoB7YbsxOojBT2gW!^Pn!W?_q
    z!z^!%j``J)sN=R*{zdE=|9F0TyRnX;Bfk#}vb$Y7E}{$iqs=&$oU{#VPayQ-wzRMk
    zDBKB1ZMBK5Gln&PFHX&O_eV8dwkYp+CtN9M2{;%r4e33owb5>jMJoP&g>MJUJC$6K
    zXd1d1ZggJpCnD$h+X4(kNh)^$oK$rHL4KRx3ZqI09#1~orCdtzDoMF
    z;j=>S6N0z?->8IijDemz0PL?_xG4s}ylZ@napZT&C#eP>Yb~wD|7MG3NCK&|qP7C8
    zz7N6L9llOxkZuL>LAbvrW#KrW8hmZ=HjXrXbxw_;8fEi;c>jN)BkI6!o|@%Az7!Pn
    zx~A=R>r7XJYO&QZLNecw0gEr?nwn@idOsNbV5?fssgW2~eO&y$BB9OQfG;KKwG{A9qbqV2mFIfQ^pZZ%l+w+AcmO!z7)6vvsk_
    zItB^?%O0ApDAMO(_=Bnn@WBIeJ`CVBYn_xMhdi8o%XCw$q5)k_%DasT@7{WBJTI>q
    zVy*f8K4Z|(xt#$7yU5w>vZ|8VN3=RtvzH%bX@>`E63!DlVv^
    zqM`74#@lc7JzEpxCHFh
    z;Ut
    z)3;9cDZMjnHrj5@)W6^V0gQ!6!;AoeibBZU)lU^mwKBE
    zb5!hN#BC?tdWgb(gw_=FP!A`0CmgtHpr!*$Sjka?s@)p7k1~L7djVo{esz$mZ-DU#
    zRgH(x+r@zUBP)d12<2>6eNV*G5kuYzr;mwaNHwY
    zeUdcaK{i;&2g7I)dn%$wuMW#=RjPRJ4o%^#hK}{gOWvE&?J#^R-;#?|A3>pofTB;b`GV*X)>fv#qQmD|^e18k^k$3)87ZZ{%L
    zN@S{i5q(mUEopd2dP(+)$>V2R7_(-ckGcRpy6x9~0qdn=UOX-~&|i4^w_sqpWZD_BVmJBcjWi=bYk|)``0gq_F=otdcf5X%DM3Ughe2u^sUZx5pN0W%uYD1#=RRIGySUwU^`~cv|F@8^Tg-M~-ff=C
    zZGU$^x=lE1ZoF`!@
    zA&ZZD>~~KC-^T$7zPLT)gfa{^CdI-S6ku2(_IC=aK@SuQqg2q(PxCC=Eoy
    zsK3<(ho4ZKn+#yS`VK9`p+-^Ya5k`VSg6=}-Q+_ER$H
    zy-V`$|53>!$d?qLg-0)eA^Nlb4NEj=D9ZjBCzYl$e{y4tZ7WkiiGOIf40IC2?VU>i
    z`pZ0h<+QT+^h!ca&YS-h7g!M>1MR|>4mPiZey^eKW}1L*!wORKj)rVN6$N1w|nYVw~SShT8FP3%#6nTzMsms9Eejt
    zuI3#MWCF`=tIT;pyXLo+mc;z$-rgWf2Q0fLR1*+)cJ@NbGYo
    zt$n_G6HBj?R0sX>b5cUB+vCTJ+gKGL26a@y;I~QKW9me>LwM47b;-pm4LMX;IMw8B
    zk+_(q69Ux}6V1E}q4~(%InP3lhS;ju^}i?VI94_+*qP9Fv)&z)Ro&gP({%MmsEDe}
    zj3c}eJv(#P8!C@!WkHAlzV2%MN^R798%1BmL!
    z72YGV`6ISRi8u5FDtETfc!1XN!`YK#Qv<(j1x#xyqHN@m{T^u*&_h2EHi;9({Yjfc
    z!uBd71oZTCCq>7tR2^DYcs3gKDAS5W9USM1nrt-&5iP12qTXr31~d}tV6nHh=N#v8
    z8p06G9-$P>@$(1FvoME(Y(lKU(sKOK)~^?J=QqiIZEPcWJ6|w3*`fzq@NLxR4058nLa4S-OI1dav~O
    zS@Bp6wzS5*f~DUl)IHIlZY5Dk(kJ#i8!Vws+|mdqWoq}GSnu5vDJ~}Er5CjI;c=YE
    zu9-6o2`X1JnyN=c6pcnnN~ZK&pE_|O$=s7ZtonPczPQyZJgee#z0|e)AtU^b>ZN;BTm6=6$)ut6iQtYX1AD*pp&_C`-lB3?qAcR~~2LrrXwY#H*(6WdP-vFY4
    zqhOPMHHgf)C$kvas>1Co>w^%r^7p9kom$5|p@h;*Xgo}kEFY;b=7sX;yR|ZLneCGU
    z#E#y#_I(ZR4f5er$3!FH-VLE2?gc`&5?8+dtl2yhDXR3W6S0SouJ=`Nd?Bf@j(MvA
    z+h*5qlI{JnJ0wmHkP*u^VXCLbrY`A6n6qwTY&JT|Y}Wk|>`gL7-~I=bV``_orbM%4
    zvzSk;ZnssM&zKch^)x|xZ<}@OML6A4O+J2S+>QMTAXeD-id^GVLr}lZZsh7m>_xU0
    zKBt&+^cVK8Az_F``0YKQhgh!z5P;va`CK*!C**?NDUjKsh4>x+ZSX;=)zOcSti6yP
    z?XMkQ0=7%bD$irhl8YS6n>Hef1Paa)V-$`GjB?Z};cpb@j}be-l2_=LsnGb43xpIo
    z*cTdux55ftlz~V0#p6l$0ah%g{Nsh&%6|*f`EOy0GmPBgV|$Mdeb6Eas8GzLANk=%
    z$H{}+o&A#jmEt1?ow8`3u1c!vhzjc**yEK(|F*K%{ghrl=JMEPvOPVmR-H{cx1TQI
    z5_7xi*k$rs(}_F5;7s(_RGy4>5hf-^8Gxhhw7a8XueHam78lu1_-nx3zW;qb^}G7%
    zJ!Ccj7+NEC|EIPaugh?kCI630tgtlh5mKJ`oo1P_!QJ+)86S>x`sbXK2qT;X*zd(ToT%>)D6H8bT}a(-3H}=sBB7E0ucZOlZjUHQny2*?9V>jPpi&%N8I
    z-e7Y_5?JxJpvLKtIpQT4yC>Qhw@x_)5C92c?pcI@dpqGgdE`=I*fq2QI-#Xq&!VOf
    zVJ7t|%0b4ii>s9@jnQ{fw3xB})2I|kzq{>G(6z23T%FOd)e3R+gA{Lo6|^Sa1zqn*
    z0y0aNz?Bl6d8OlSN&HP0ZgA3te^P(hbc($~Z%#w|vv;U|nZJm{z%xmBdb=6xdqPL_
    z#$pJgkD!Cxb{l7KKF_5lX4rZJaN-Q3tI(0QRNq0sZ<7+WB#WkKA!IT~pDK;mPL`;dTuwR>aFn3-lgZ>E}JY@#1|h
    zMcVmr^dg)Sy_)=sm+RCa>J=`w&_rTP%si}#9f*|QfX7vr+WlM1;#kbHUEa61#1Z4j
    z?6&*78WGap+^Yvd`QX=$U`YE$Qza4g)SG-<_|MJ7uFxVq6YX^QG_}UL!n$T^JL)=c
    z9gLpC5fgEuC-49deUKV!Y!djx&J;92o%d*dQxc`}OG3J*J3xi_8>$yA2s+AlmC52t`IC3DP3On29w7yI?a=H1$^qYKTjUG-52Yu9Z0
    zxENzgY)?)5+CukvFUQ}7*K>=EzwId#H-M{id?o^M(W@QZFa#SLz)2$v%T5vgUxHn^
    zqar1YeHF|HD;)(A0JUIoev}wE+te6UR(Hx(Q4E10!*~~dX@zerq)B_QTG|b-urBPF
    z#aNchZw|8pbRY@5jm~7{QJbc5s`LClpTxxjLC&Q8zzYm586RKp^XSX>$
    zC#lI+lz(VU=#8LQVF@zI*^;)uua_{^5g{i%
    zTL8qdr*gn#L)-tyA+bH_caqE&2zdB?^`_6RUIM)uDwMG&x>rK_;?afmwkls9ez
    ziwIJdw;M&f^rz$gI3Nd&(XB>z6oK*QEyl?N((kttRV{P;ulMJk>JueLdzpURFQRg7
    z5w{`!g3fn0RpT+^fIASNI&oM9<_x3!pl9yG`n>u&Im)2uCZTL}YTqzU)+lTvm?=)v0EpFZ@3Ran&T=s9PMQos+(oxt
    z%^AA=#Wh`e3q*sx4UANI244kCA0UwH{EhmO18cR+4JDMr21;@r^sDJy;fQ0Td
    zYQJhQTID1C!(QEq96%EcJ3>Tl$>Tt{m}V1*c@wOyqu=ZN3FB$G5N1&_nCPnZVoY>6
    zKa%s{nW~=Am*@lpP|yMAn9f~JN2KrZ@;ensHcQayI1>x4h5s{{T*)?jCsLi54Adm16~DNHRY3eId3g&iatx
    zIj7G=WjT+68t6H1JkMtS2O2OT^=wezI!pT^LI1u~xbXY){KCmec~ILh^O7CpkzH%A
    z>HZcsGmap{SP+CwgYG8{{1XgIa2I0SbIyv;72lIVzl%{Oc?#FyRSbG1=q>LlMbRVH
    zf+3*Y@Pd8S5k~`pHt^!p+xcqG=}a1x!fod-aon^S%#(1eYwFM7Kt;h}%G_r7o`tw4
    z3?~)g-g+%CL-k7#;#qPVhTK`z9{NcD9;q+@b%a{VW$mf{KCk|{>Lz%~k0ToqG4K&1
    z`_qE>Sn2#3{w0kY(jK}#c|5j$a_6@7#Z4_uWd`-Ur}m`df532<20M|GV~Q`nGN1aO
    zRk(4Vt3aaz03X6$((fn||=)bhW4ptSFLWdu>p0sTfNMM9Wf9II3^;hS7^J6X3
    z7yTPFsVNL?J;S-hSf
    z5!BHzVqqO77Z+!LEKTwfhVjK+^FC5!j%3*db(d30_adzu5p0&=hwI3v$z%Po)T;%V
    zs8bEsph5MehR>?ZK1OXO7WvV__>b5jhqaF;F>rxq
    z0_!|1g>MDE=O4p6!W9IkrQWA%UMlwU1I1aBme5BXh5fb1{}q}${u5G`?6;hAo|;k-
    zAA|ipY7)tnQo2)17Hi`6jRb;MVSrXP?~nmohOp)IW|i?8b1h>xS!a$gW
    zTWgu3mS74j$NUdR)o8ayM^t2;?IWimvR|0M<8iwl=4-XT9!7nAYB(DWeJ=usUbMfAP%93`y+f#Dh^07lW07A+
    z!V|njO3=vBxHJVETSK0UPq)t2FSz$YI?QGDw!LjfsHVvK!Sgd0WiN@~7Rn2u+@GMN
    zs$OE#C6G%UFzu1%dMVd#W~EW~f(SDSFR8BXI%H~$CYrVJE>C7(TX7Sx63_v=vya}1
    z#iGkAlu{TXF~j2Oirg6&p9*yu)Y@qOZBr0!`MoIR+)<3fD4Cl;C5h}QN78ZgE>-i|
    zXH4ieT_pR)Gok9HqaXcLcW?I7bYN35#!T%MIVE&*FCz%MWrZV(sY^|#(9aOu){wjy
    zoE;i=9{bIC_YrT4qLLZIatm!AaB9$NCI~d&sw0O;Nk65`d*lW|;JvV!iBrV%zw6@f
    zu+2MVKbLt48d#ehnm;?SHXSx)P$S>7?AC1wOzY;yGk+x*jq6SFMCg2gzExZfL0wPY
    z;k~i_$(rkjAWWCD>m%=IT+VulherihjT9-izr5H<)-^f1ss2p+?h&z@oV|0xM#gy$
    zs&_l1DPUqNul|gHGMFan2Jh3YP$Q8!t{
    z$8kLvzYghrD*Go!^!U{KE%4!T#jZe%%58ww1h2pmevt#ebTZMisOIAGQe=4!#6B6P
    z*AW$2XRB(PVk3KGmvby+7r#u|l~wE{?|>c-O<@8Twamn>v@4!T%o1F|QhC>&2+|s(
    zG8kcdzv_Ne+qeyvU34G=Ed;2oq*sL&aVnM?y*}w3S1=vM0Ap!9vdjU;B;!29Dqo(k
    zhM#jcVku%UML`;xsLv}WB-Rpd&;=#YBe73jJkXxJ6SiWnfIjZrCePrglfLOB3+0Ip
    zG4hH2HtHkhe;jgD+4lvHvaOPO7bb&S3cFChs&38rNsav1R`dAW#b3esa7CLM%gC
    zZ|Q@(0_-4PbYpZiTuys6zoeJLNM<6Xk`(@P^3@#Kfs*JG
    z%#@8wZjp^NYi`8aecqvCy9npEp+)8UhZ{5l(jzQ^+dL#tRXQtN{=`@Hjzo2G-OY55
    z0Y%M@&ms1joYeV7R~o9+V0uV0h3*C3L^mh_2;bTk8yY8wprpL>D3kzy5mG#WhF|6|
    zkvjl3c+dU8b?n{qqb&qIccWvUFbxI6faJb;6&B;lma+D~1XpjW5Xt*3^b@6QWlXX8fde6v%W6L7#WaC-U|Q-zgF
    zv;J{doal7zYb^I`i1fNx{{?e7a|`pOnuiGoX80-hJemv?#R`_p2I4pfE3Y0||L{Gy
    zUaz9%W2{9RteLpfG&?W>p{r@q)(cQG^!Z>nNCP%`d9;Ke`RyVlL60c-iu`3pqV8Nf}NUV~{
    zkv9m7bi1fN%%-SnM9M}iINYuVJ77#nAtEAUH*T^tx9YNr_GY#^NRTh?!|+wtXl&hU
    zU)dmzHXL_fvC{sf?hU!!6Rml+lB2zNd8)G^A$M4Hnq=N}Nb575
    ze1wypjFqV2nn3Id?QE8kyT1gLwtcTrd8LE$Cz^-I*ybriqHvAgJAvPp_~3k6v0R%{
    zQS{r~Ty=>9Ar6WFm(5^=xsd=x!89XZH07x=s%tdVj;EfwW#iUf|I)HPuLLWNs|bjliyI=j0MmGmcGY8dp_+M|
    z4>Fy2O+*DcpugkjH186N+d~(V=8YifM{K|@VVXwG(d14&mwn#F>r@dQnkw4g9cZZY
    z(l)FwleTEDd8O=ysK^NR)SJX
    z5x#C8Ygd)wXMevC!ZE}zI?yOR{uTho$|u0
    zwyyDZqU^p@m%eK+p(f(QyXlgKB68D%woH?9ew3MZh+3ci3+j34a|^yCw*yISW+T@q
    zuxjBbRR6dD_4~$i_|_=@a065Px3cx*nb^Kr`XS;Vtfu+=3AyASZu?;ey3-t9TCgj<
    z7dbXq%Vbx6_tbB(Y>^%Q3vNmB0rvv{g30RXPeIMxdplYCZxftX|#B?WD^hky&
    z2TWKGofYrvezc6kh!`@OyilBWy!J-en;+;XgrQ}m($aNLuAjP8co25@;?HMSym%sl
    zR*o}6{q213r(bzy)Y_U`iF5;o`0VxqDS2R~>C1gOZ1fAosNAcRgaut@(0Lann@BaT
    zsl#XMH(?JEx7@`q?5UAk4MaQD<@>xleuoSDHc`-pPn)FS5SpR~H5;w@A$IptBjiCy
    z0!_d3I&1H?x-kKN7Rio5dDle`Qd)si7bRAlUx1!BkqtR+k+Vr8V=nnuRVmW>xp5ak
    zX-Z#kyC{&0>ReJ#-g8A>zx2AdIwLBNR_|_47EnktAWj^jj@DIpc)fWjT+pRP0ID1=
    zLb%=yDO+gqzYRjc`bU!(cpa2K`>&~bjcyqaOyg0
    zgV;`AOomK;3|SI-B_5uBAV0l*HFl7J&AY%?ek9R2%kr$=tZ42);Rl
    zuCE`@^e
    zPPg9Mv9pmJ849mBjNh)%71}pSCU8k0?pr2{4*^ox2JE{(X%(ztWu>Z><$T(^m@HZl
    z*HG|;V6OSqjqVhqm;Jt%OC*PiO*QXW5k2@Q;j?p=gEFtN60Y$$MDDgjk1}L>dE}8o}{x
    z((}z@?#mUkl-EOh6{f`;2Th-E1?OK{hGG{tw+J(Qo#bbBlFv?wn(*AdeMy6nYUNVg`;h<|1Ud6PuFkR_Zi@1e7VyGp*1z7)wQq2L6gs7j-`p0(~~}&A%F+-_jmz9
    z^iBxJNn|&1d<0N0dknSGi+!NwkA(~VONSz$f
    zIZg0x+%VJYwOA=hPe;9!BIlrCdsS}38i~b
    zl>k~d?ULC_>)O)bG?*=7KVqMkDdU3aQf*2rf0ZMVjo^4i-G&6%TD_yaXTy44-;wE(
    zL;P^vgpMyyi%QoXJCB~@4P#Q_>8QEkdh%XXXXMi|FjcFV3_`XhZ?$WfOzpe~3^&~1
    zKRdCD;J&v;TD+?3J^;BnICAjRvdxfjYQ}rY{>s^jgE9LSr&%Bt1tzZG0nTcuyV~6F
    z;hxnttS#w4kkW8AaYXqudQuJUV|N!~WnTM;Mk$J{764HV4vNq(v)Zot3f(bJDRYb!boKg<7Fi~!ZCgerc&j0|`s!+S96
    zV}g2Eq#B%?jM<&GG$M6}caFZ8^&Wtzx{g@cxL&}7-QZ~!MLdJlBHtN{Z(?N+XCBL8
    zoUeL@(Wrnuwomz){B&whoRA4W9`wI4fIi4B4LOj&T}B4_|2LS{+AGlj{Dcok(rV`0
    z8UKtU?2MdULc`GwSJ&e^2TPP8N7^#!OUjF96p&KBJC+D2cdKDloLasPAFA-L*3#HD
    z2<-__58Jqt3ee=FexpbEll@66BM#Akx-dR{EWHD*JdWK1tJEJ*xC}8f_{&GtMs2*y
    z=E~oNkCoz(3vcfJ0)f?M*{0)Rg)!e11_XN7kiK3YcRxJ-c@|cU=s;FT{e-={Zj+7E8XpZ^
    zS{2#JIjTs#>45MqayD4Sx?eRqZeK}Ey|tc$eP&6Rv~naRjE$&Mp8S0A%QJYDF1gRq
    zmMVpt6u{2lfZz6u0T)2|_RgQH3xL*YtlS9K038le%UEP_w3+dT9K$GcKpBrzr2!ET
    z^(A{iF*|JugwmhQx&6)^Sf4@eQjUMu%Rf=
    zt#bf6LBo>4t0BSysdzA}D_eS@&F_ViQ)9-9)qR=1lI4;}$ULzerJKHpYD)I#X`Ggt
    zne`cw!C{U=5fkR0Hk>$nIYxPHw7i_tj8t#yrUtqJWt`j`wms;fZ!~96nx<}O?A@GL
    ziFaSv+||m#n!|cYLid~IIWxh*R%4s8=uyo*U=I<|?QXaHh^FDtT~K6a-H$tO9djVf
    zXS%WuOwm^k0g_O{r9Xc2Ab=}0emF%bT#;Y7S&@1|rLDO6nKHU>aXD06aF3*?g8W5
    zs$3hN3HGcw#_({q3s%q+`
    zZHRHe>N^i+#y!*Wh(3&P{(MDEqHx+ckdcr*p1qYkM@>2KY=M9g<9f0HHPZD=M?Mh?
    z07XA)O%kGkzC{>GF&F(ebt@muDFir#zfxRr|N4PHLL$y8z2Se_u90dY?Rb%vvV}-|6k&=86SyS(L5)0&C;
    z>fohEm`wZUv9o~fUwVK9Za{K~$TVO^-@~CYXc335^MUL83(oUDAyGuOQt+ASjugB}
    zHHushqtqyca?v2*X?vdpcW5oOd>?9i5G2$S?U=)-LyOt7+@+3s)ifWyNh*3S;#y1<
    zeU_0br@8blv;wvG{wB(1)$zO7W|j_3e+8t@oPt~!9kfPs9q-qp0$rbMRhA#LjSccr
    zA2QyJHT@fLPUQ>RsNyKV#PzUcNB+@p7BZPQ8)mGd=NrrKXZ~AVmSKyg%g4HA_w;?K
    zzloW6G6gV*nvT6gsr%EJD%B_an{q}pIP}NIyPW5i;Chls03ZFTbLsv>AeIU}_~FvY
    z#PQhfebS4~9*LWDcezV%R$fR>QhO?I8Uz5Jze`e$uZFx##j9>r6h8zmg@cRd6Ov$O
    zUH#0}0Q)h-J)xm;ij$iR*ofUyc9F%G_e?D{PX_=JbQK6c2s;v$Asc^6*c{Q8F`S-T
    z_nF*6>Sh~fjez9=%>Yq#oUxTqo{^>eBS
    z2~izWPdN&J`o0YBQDDBtBk;>5>9%O;g@rXNc^yX5mzJTT$>q3cuPc^C3qAXf0K4+)
    z6&J+nP%ju!J_)5)FpN8pQ$vm1KK#OT$-cX?Br1BQ-b8p$ZoaFj;}}6SR-W^vWq`aKg+B~SKhT1JpmzxO1wXd8rngNrP-mvuYrooRpSPE%kvS4kQ*%I)wTv{k3
    zM{OJrnnYEE!1ju}qG_pE1=uJ-w+q0bNj@vAIPO
    z<<2Wb=`Z8P^uRK_28%KVG|R5kM8qCT-Xp|95|N_H@taZx>xaeja7GBBj=WK7zu#ze
    zi0U#>*P+Lob6GqI&WwWo%xlIRxPRF_!}$3A*mDt_kzz?|*Mu&|R}{yLU2*n%3-A}z
    z3Kh_`-dNc8=rCp`5IL;Z6=LXt`yYdo(;hH5k78ut!n)g*yb)IFr>s3JoZ`!{Pu4Fv
    zA{%FcKt{aPG;hPnA#n8qDrrwl_%?7&cjaY${4|h}tPI$tPPdMDl0TWfmXB&-V9HH4
    zj~T<)^nGEUYN)RJFgTLHbK_B(yeJaD1DR9xAA|XLX&g@8&aS&mf?oijaP?QUy7{I;
    z8ft?&3OqBD_#naN2{40<^``*2h5|EO$2P2jDqodY{S8r`yB764Qa@7BGqozl^$OU>
    z%0r5sRVOwW?ZX;c;l9?=UztKg5S=DnIp|7b=;(zfr8_qu!4F$OxWUyZsL
    z(H&y`OFH5uk|m3QDXLd%XIgT6zuum5W-0%b9M72C%d>rLiO;y`?YS{^|8!F1t+f}D
    z(0i^3%)3^hO%{)7)^M0Db^8!t0b!(vQYX9v4c^jnq2AO%TxStlzb3+iXp-Q@&MSvImcy-4xNB!6EwoX>|5{#nS4=b
    z3n6S$^Ds=#xW3RwHVG&c(NwYcsUZOVH4nfohqJ99U(<=2aYxEQahq3qss9p7Azd$J~)H@cjfp(oM&N3F&_bR9b
    z8})$Y>JWA(_T`2YEHU^l@Vpcz^>%2BuN97g3%|M0NhCpOgrv|#$vi!A0v2yN1kwYT
    z-()?cO{3XTf3B;%#!yeA0E*9;vU=N%gZ+r-p5~}CJro?Q{@QzRoHjnF7lhb6p9eo?
    zFIf6;FZU#zb#T_s3gbW*r&)9X1qoRa+GR5lWy@RiCq-+i6M-R+hr&^OT}UaBi^GMu
    zHPvX%SIYVV(7d?ykxn$AOsRXh5AQHr)dKlt`fu}XM-142$`T^EM`xHNJJoY|`jT5r
    zm=)x2sCX$(>>~=Xgdm=WS{xT1*mxpk81z1aZ|M*~Eyo^5w3|2+z{Uy0&V!b*{!5;P
    zKu>>5gycETG+Yb7F>3zHF^)qcPj(9bYWZxSJ&l!6j+4W6-$}vo+wyAR>Aldt>h$f#
    z3XUvH%tdC_B2tF&c?kC;=K9D}LRS5XHM7Z_zS5rUeF}pSLu|X^oo^3|H@7^x9DMqy
    z(Z=W6^!A)&+36YU;uvBZUMN&0zU0f@9)N(Rn%W)P-pv;CqQ4MI=`|-B~My^y5+g%{&^FHifrX|&lziTti8Lu
    zS>>KnT++jjyB-&=ZN&{7wao#8`=Xn26QWW0&uXBWolevK6rz~P{Aod$b9V%imj}y<
    zO1r~2a}!vg&nwa6>m)QS;@K&`c+tY$-*}LNwMAOWVEGba07hL|V*z;e5ZBbxQSP3Y
    z)h)S56sx1>ddb=0iR-^&ldY=#PnnydPA-FFwJ6Ot#15cKufZ-Mt%|1q_
    z27henDlLUF*u+9hSCbCeGRjI0quXt^7u+q@99sxC3_j;8h5gDhtDtWCP(%JXvFqLf
    z>#P>S^Tl~dK>W8PS?B`2tAvi^u0935{X+O3T-I+ns2!;`#RBLg_KW^{sE?9{@q;hwxRG>3Y>;
    zf-K3AM^1PXG#VdX=6ZbkOmT+Mit?Z2FjGxM>(9xS(B8FIJvHkwG6Y}_W`&2($Ug85yRJw({8b$fb2T3t)la*W1vY8wCJ=|
    z_%p>&#~iU)dDd`>0{!`Lb6X0X)Qk{LP_}}D%1W=2F)|Nv!H~W`Ln1RKO~huyVf_I~
    z#TK4N9=1Wolqd_+Wr0I`=1Z`QAT1jbRuLg5_3>6yM>*u{YjJqU;Bd>C?=~~}W&F2a
    zjq5cUSEI%sG|;yh*)y2-@r1a_vlgl+{GBrhF0;4ppxwv~K$Ur8dxNo|LzDSsxsk^}
    zt&(GlLaqqgM{sWVawNQeX0KOiPm7cStq$h5P@B9??FK+h+WV@wCbMxY9eorKv&XVF
    z#d2^kUma}XnBG|8Rb#k14`y5hY|)u|9vh?M$?St-wG7p(v;aAImb(PG!zUfo%;2(m
    z+&(~dmgXREdbT_vZ_QGWoM)#0rjl8fx390xI~rjw>g~l24FJ07WNGt987Ap}s+9FK
    zRVlLDhxtA@0D>9nKsu;~#?w>S96`*2C}@t`^%_M`J*>^Z&hbg7=rg&*s$srp%}-4N
    zoIJ$tN_=Qo?odQ9~oiSyZ7w5AN
    z?CNNm#AtlN)%(_W@Vd@+tn(t&)<-sjt0vaAq$aeZJrgNZI7)(S>0JQlL+ibIc_X
    zap&XK7q1REC6a%MHE7Re{N&+lQ;Iy7yYk8Gz0nmPAx=AoZd2Bnl#}l-5WrJ~dv(QL?d(071}@n}v87B??n=kiJR<
    zO@e)bZHy8Uu%@;oV~w#|!IZuA_b}4xREkv|q%S{kP-O!M}>vdpde3d6%k3O2~8HJT4j;7{TJ*=XrX)DvpQ7kNf`AuKK}A
    z4BP7S1|c%2$a&E3%V`P4N$N8r&F%_U_1CrF5tbP=kv=fVO6pi5U4#wAVA=)5C-)A$
    z&3sDXe6q3DHbi;hnx)?E=!;f2#rMbDqqH-G^#VW54tsF-V&1(l&C4n;jWn>cvefQ&
    zehLEf3;z7AHH?&v`~+EozmzJj>+c(IIMjHpp6NSWBn-J+n0#15ObBw6)WH5EnD;`n
    zm`-uvy*?N3ZXA)mj9)2Q{Cj~gUM#=W!Ox9oF&>}d33EMn4tha0y$wc*X}h10xo_=B
    zla9+i2z|I(49!~+{5*a>_mCxz6+OYg{RkRg)vUvat3TrdF}B70Jq__N{8qp64g>_r
    zd_t&vL^11c6_y0WMP8{O-@HdHg!H!OdJ?i?e+k3*2oFq$9qh)cn0mmU&;qrFtHRm~
    zQpGPG~if~)XM*X~sC4jrA$mRVW`ssf4F$?P%Bg?Dp@L3+*)TH8|HH=)FSG4O^k
    z=nQYfGcwg+C8;%i3hHcR%$AfPxv6%SD*1Ue^afB4mOB>Sk0xWJsV02KldqzFgP4;x
    zFpVD$qK`O(pz;t{w6u0vTyi5Zd$3Ie&~QNEt$Bo?T1Xu~QX#m+V8S2^>p9&&Z_!C5
    z>ZaOb5zTw-gIwo@NZq=zV>eXXbrT6udQN7}Qe^x0J~ghswDupJICyg<%UGj`MUUM(
    zlNY!5hEpVnBBMo$@TLF*2#C>OtF~>|vd~v+Df1Q^+fI1MOY6$GZo2{09C
    z-mFX<@2&R4OfDyxX{fq4+`Dk$v&^J+9+vNc_=y5-gCMfA*DA^4coxOX={T>+GRdRNH0BwJleTB3?
    z*>cqdLz%;ouMW|@9l7HPW@u`vfdN?qfb?+!ge#(Ga7zo$QUn;VPhYoGm`iwFt2CJt
    z;IVXS>C%PuLBMt1@gEdSxl(IP7eoto4MVc4SKa=X&kwso51d+XLxw`_!?p0m#EXt8
    zR-bmV5>L@q+R2MW)}ZTwLAw`cHdw7G9)J0+(f*APJd7Ftp^WG3Pg&W6E|b*PCAKD!
    z!#{#qIwW0=t%8rIx~dj?@pkQ?TM#cNYd4VWp+5b!`V3wi(
    zXz$mGR1F%}unU!HKgkq9VRz-IUp=eGd?xW9fFTiDwhyOL-P5NGf*zsvrHV@Jr5N1=
    z%-_t-^U7%LmA#ofV}5twKf|jCoW!m2%7<;$BWd~lXK_AmC}JTbT41l)?#Fg8&
    Date: Mon, 7 Feb 2022 17:40:50 -0800
    Subject: [PATCH 83/88] Update gitops-data example docs (#290)
    
    ---
     examples/gitops-data/README.md | 34 ++++++++++++++++++++++++----------
     1 file changed, 24 insertions(+), 10 deletions(-)
    
    diff --git a/examples/gitops-data/README.md b/examples/gitops-data/README.md
    index 652e4c0b1c..354a19fc01 100644
    --- a/examples/gitops-data/README.md
    +++ b/examples/gitops-data/README.md
    @@ -7,10 +7,10 @@ choice.
     
     ## Demonstrated Features
     
    -### Docker Image Deployment
    +### Docker Image Push
     
    -This example demonstrates using component `images` to deploy container images
    -to a docker container image registry. Images provided to the `images` tag are
    +This example demonstrates using component `images` to push container images
    +to an image registry. Images provided to the `images` tag are
     uploaded to a Zarf hosted docker registry, which can be later used by
     Kubernetes manifests, or manually used as shown in this guide.
     
    @@ -67,17 +67,31 @@ container images to the Docker registry.
     zarf package deploy zarf-package-gitops-service-data.tar.zst
     ```
     
    -> _**Important**_
    ->
    -> It's possible to try a package deploy _before the Zarf cluster is ready to receive it_. If you see an error like `"https:///v2/": dial tcp ,:443: connect: connection refused;` then it's very likely that you've beat the Zarf startup routines.
    ->
    -> The fix is simple: just wait for the cluster to finish starting & try again.
    -
     ## Applying the Kustomization
     
     Once the package has been deployed, the Kustomization can be applied from the
     Gitea repository using the below command.
     
     ```sh
    -kubectl apply -k https://zarf-git-user:$(./zarf tools get-admin-password)@localhost/zarf-git-user/mirror__github.com__stefanprodan__podinfo//kustomize
    +# Run 'zarf connect' and send it to the background
    +zarf connect git&
    +
    +# Apply the kustomization
    +kubectl apply -k http://zarf-git-user:$(zarf tools get-admin-password)@localhost:/zarf-git-user/mirror__github.com__stefanprodan__podinfo//kustomize
    +
    +# Inspect
    +zarf tools k9s
    +
    +# Bring the connection back to the foreground
    +fg
    +
    +# Kill the connection with Ctrl-C
    +```
    +
    +## Clean Up
    +
    +Clean up simply by just deleting the whole cluster
    +
    +```sh
    +kind delete cluster
     ```
    
    From c95de62865f6d1bb460ee8eaefa269874c5c2b02 Mon Sep 17 00:00:00 2001
    From: Jonathan Perry 
    Date: Mon, 7 Feb 2022 20:49:26 -0500
    Subject: [PATCH 84/88] update post-render to retry updating service account on
     error (#269)
    
    We experienced a race condition when updating the ServiceAccount for a newly created namespace.
    Sometimes KIND distro would  error because it was still updating the SA at the same time we were.
    ---
     cli/internal/helm/post-render.go | 57 +++++++++++++++++++++-----------
     1 file changed, 37 insertions(+), 20 deletions(-)
    
    diff --git a/cli/internal/helm/post-render.go b/cli/internal/helm/post-render.go
    index c34948e876..834625ab95 100644
    --- a/cli/internal/helm/post-render.go
    +++ b/cli/internal/helm/post-render.go
    @@ -4,6 +4,7 @@ import (
     	"bytes"
     	"fmt"
     	"os"
    +	"time"
     
     	"github.com/defenseunicorns/zarf/cli/config"
     	"github.com/defenseunicorns/zarf/cli/internal/k8s"
    @@ -194,15 +195,21 @@ func (r *renderer) Run(renderedManifests *bytes.Buffer) (*bytes.Buffer, error) {
     			}
     		}
     
    -		// Keep the default SAs up-to-date so they will use the zarf-registry pull secret for the namespace
    -		if defaultSvcAccount, err := k8s.GetServiceAccount(name, corev1.NamespaceDefault); err != nil {
    -			return nil, fmt.Errorf("unable to get service accounts for namespace %s", name)
    -		} else {
    -			// Look to see if the service account is already patched
    -			if defaultSvcAccount.Labels[managedByLabel] != "zarf" {
    -				updateSvcAccount(defaultSvcAccount)
    +		// Attempt to update the default service account
    +		attemptsLeft := 5
    +		for attemptsLeft > 0 {
    +			err = updateDefaultSvcAccount(name)
    +			if err == nil {
    +				break
    +			} else {
    +				attemptsLeft--
    +				time.Sleep(1 * time.Second)
     			}
     		}
    +		if err != nil {
    +			message.Errorf(err, "Unable to update the default service account for the %s namespace", name)
    +		}
    +
     	}
     
     	// Cleanup the temp file
    @@ -212,23 +219,33 @@ func (r *renderer) Run(renderedManifests *bytes.Buffer) (*bytes.Buffer, error) {
     	return finalManifestsOutput, nil
     }
     
    -func updateSvcAccount(svcAccount *corev1.ServiceAccount) error {
    -	// This service acocunt needs the pull secret added
    -	svcAccount.ImagePullSecrets = append(svcAccount.ImagePullSecrets, corev1.LocalObjectReference{
    -		Name: secretName,
    -	})
    +func updateDefaultSvcAccount(namespace string) error {
     
    -	if svcAccount.Labels == nil {
    -		// Ensure label map exists to avoid nil panic
    -		svcAccount.Labels = make(map[string]string)
    +	// Get the default service account from the provided namespace
    +	defaultSvcAccount, err := k8s.GetServiceAccount(namespace, corev1.NamespaceDefault)
    +	if err != nil {
    +		return fmt.Errorf("unable to get service accounts for namespace %s", namespace)
     	}
     
    -	// Track this by zarf
    -	svcAccount.Labels[managedByLabel] = "zarf"
    +	// Look to see if the service account needs to be patched
    +	if defaultSvcAccount.Labels[managedByLabel] != "zarf" {
    +		// This service account needs the pull secret added
    +		defaultSvcAccount.ImagePullSecrets = append(defaultSvcAccount.ImagePullSecrets, corev1.LocalObjectReference{
    +			Name: secretName,
    +		})
     
    -	// Finally update the chnage on the server
    -	if _, err := k8s.SaveServiceAccount(svcAccount); err != nil {
    -		return fmt.Errorf("unable to update the default service account for the %s namespace: %w", svcAccount.Namespace, err)
    +		if defaultSvcAccount.Labels == nil {
    +			// Ensure label map exists to avoid nil panic
    +			defaultSvcAccount.Labels = make(map[string]string)
    +		}
    +
    +		// Track this by zarf
    +		defaultSvcAccount.Labels[managedByLabel] = "zarf"
    +
    +		// Finally update the chnage on the server
    +		if _, err := k8s.SaveServiceAccount(defaultSvcAccount); err != nil {
    +			return fmt.Errorf("unable to update the default service account for the %s namespace: %w", defaultSvcAccount.Namespace, err)
    +		}
     	}
     
     	return nil
    
    From 54edd51e133e70bdf88bf4abad288e97810ee747 Mon Sep 17 00:00:00 2001
    From: Jeff McCoy 
    Date: Mon, 7 Feb 2022 21:15:56 -0600
    Subject: [PATCH 85/88] Update tiny-kafka docs
    
    ---
     examples/tiny-kafka/README.md | 157 ++++++++++++++++++++++++++++++++--
     1 file changed, 149 insertions(+), 8 deletions(-)
    
    diff --git a/examples/tiny-kafka/README.md b/examples/tiny-kafka/README.md
    index e112b14aab..7eb18e0df0 100644
    --- a/examples/tiny-kafka/README.md
    +++ b/examples/tiny-kafka/README.md
    @@ -1,16 +1,157 @@
    -This is a sample package that deploys Kafka onto K3s using Iron Bank images.
    +# Zarf Tiny Kafka Example
     
    -Steps to use:
    +This example demonstrates using Zarf to deploy a simple operator example, in this case [Strimzi Kafka Operator](https://strimzi.io/).
     
    -1. Download the Zarf release, https://repo1.dso.mil/platform-one/big-bang/apps/product-tools/zarf/-/releases
    -2. Run `zarf package create` in this folder on the online machine
    -3. Copy the created `zarf-package-kafka-strimzi-demo.tar.zst` file and the other download zarf files to the offline/airgap/test machine
    -4. Run `zarf init` with all defaults
    -5. Run `zarf package deploy` and choose the package from step 3.
    +## The Flow
    +
    +
    +Here's what you'll do in this example:
    +
    +1. [Get ready](#get-ready)
    +
    +1. [Create a cluster](#create-a-cluster)
    +
    +2. [Package it](#package-it)
    +
    +3. [Deploy it](#deploy-it)
    +
    +4. [Try it](#try-it)
    +
    +5. [Cleanup](#cleanup)
    +
    + 
    +
    +
    +## Get ready
    +
    +
    +Before the magic can happen you have to do a few things:
    +
    +1. Install [Docker](https://docs.docker.com/get-docker/). Other container engines will likely work as well but aren't actively tested by the Zarf team.
    +
    +2. Install [KinD](https://github.com/kubernetes-sigs/kind). Other Kubernetes distros will work as well, but we'll be using KinD for this example since it is easy and tested frequently and thoroughly.
    +
    +3. Clone the Zarf project — for the example configuration files.
    +
    +4. Download a Zarf release — you need a binary _**and**_ an init package, [here](../../docs/workstation.md#just-gimmie-zarf).
    +
    + 
    +
    +
    +## Create a cluster
    +
    +You can't run software without _somewhere to run it_, so the first thing to do is create a local Kubernetes cluster that Zarf can deploy to. In this example we'll be using KinD to create a lightweight, local K8s cluster running in Docker.
    +
    +Kick that off by running this command:
    +
    +```sh
    +kind create cluster
    +```
    +
    +This will result in a single-node Kubernetes cluster called `kind-kind` on your local machine running in Docker. Your KUBECONFIG should be automatically configured to talk to the new cluster.
    +
    +```sh
    +cd 
    +zarf init
    +```
    +
    +Follow the prompts, answering "no" to each of the optional components, since we don't need them for this deployment.
    +
    +Congratulations!  Your machine is now running a single-node Kubernetes cluster powered by Zarf!
    +
    + > _**Note**_
    + >
    + > Zarf supports non-interactive installs too! Give `zarf init --confirm --components logging` a try next time.
    +
    +**Troubleshooting:**
    +
    +> _**ERROR:  Unable to find the package on the local system, expected package at zarf-init.tar.zst**_
    +>
    +> The zarf binary needs an init package to know how to setup your cluster! So, if `zarf init` returns an error like this:
    +> ```sh
    +> ERROR:  Unable to find the package on the local system, expected package at zarf-init.tar.zst
    +> ```
    +> It's likely you've either forgotten to download `zarf-init.tar.zst` (as part of [getting ready](#get-ready)) _**OR**_ you are _not_ running `zarf init` from the directory the init package is sitting in.
    +
    +> _**ERROR: failed to create cluster: node(s) already exist for a cluster with the name "kind"**_
    +>
    +> You already have a KinD cluster running. Either just move on to use the current cluster, or run `kind delete cluster`, then `kind create cluster`.
    +
    +> _**Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?**_
    +>
    +> Docker isn't running or you're otherwise not able to talk to it. Check your Docker installation, then try again.
    +
    + 
    +
    +
    +## Package it
    +
    +
    +Zarf is (at heart) a tool for making it easy to get software from _where you have it_ to _**where you need it**_—specifically, across an airgap. Since moving bits is so core to Zarf the idea of a "ready-to-move group of software" has a specific name—the _package_.
    +
    +All of the software a Zarf cluster runs is installed via package—for many reasons like versioning, auditability, etc—which means that if you want to run a  in your cluster you're going to have to build a package for it.
    +
    +Luckily, this is very easy to do—package contents are defined by simple, declarative yaml files and _we've already made one for you_. To build this package you simply:
    +
    +```sh
    +cd /examples/tiny-kafka     # directory with zarf.yaml, and
    +zarf package create --confirm         # make the package
    +```
    +
    +Watch the terminal scroll for a while. Once things are downloaded & zipped up and you'll see a file ending in `.tar.zst` drop.  _That's_ your package.
    +
    + 
    +
    +
    +## Deploy it
    +
    +
    +It's time to feed the package you built into your cluster.
    +
    +Since you're running a Zarf cluster directly on your local machine—where this package & `zarf` binary _already are_—deploying the package is very simple:
    +
    +```sh
    +zarf package deploy zarf-package-kafka-strimzi-demo.tar.zst --confirm
    +```
    +
    +In a couple seconds the cluster will have loaded your package.
    +
    + 
    +
    +## Use it
     
     Testing will require JDK and the kafka tools:  `sudo apt install openjdk-14-jdk-headless` for Ubuntu.  More details can be found at https://kafka.apache.org/quickstart.  Steps to test:
     
    -1. Install JDK and extract the Kafka tools from the package `/opt/kafka.tgz`
    +1. Install JDK and extract the Kafka tools from the package `kafka.tgz`
     2. Get the Nodeport: `NODEPORT=$(kubectl get service demo-kafka-external-bootstrap -n kafka-demo -o=jsonpath='{.spec.ports[0].nodePort}{"\n"}')`
     3. For pub: `./bin/kafka-console-producer.sh --broker-list localhost:$NODEPORT --topic cool-topic`
     4. For sub: `./bin/kafka-console-consumer.sh --bootstrap-server localhost:$NODEPORT --topic cool-topic`
    +
    + 
    +
    +## Cleanup
    +
    +
    +Once you've had your fun it's time to clean up.
    +
    +In this case, since the Zarf cluster was installed specifically (and _only_) to serve this example, clean up is really easy—you just tear down the entire cluster:
    +
    +```sh
    +kind delete cluster
    +```
    +
    +It only takes a couple moments for the _entire cluster_ to disappear—long-running system services and all—leaving your machine ready for the next adventure.
    +
    + 
    +
    +---
    +
    + 
    +
    +### Credits
    +
    +✨ Special thanks to these fine references! ✨
    +
    +- https://www.reddit.com/r/programming/comments/nap4pt/dos_gaming_in_docker/
    +
    +- https://earthly.dev/blog/dos-gaming-in-docker/
    
    From 864b47d3bbf496c88fc81c2ca0501b03aee4a525 Mon Sep 17 00:00:00 2001
    From: Andy Roth 
    Date: Mon, 7 Feb 2022 19:53:09 -0800
    Subject: [PATCH 86/88] Update postgres-operator example & docs (#291)
    
    ---
     examples/postgres-operator/README.md          | 72 +++++++++++++------
     .../postgres-operator/values/pgadmin.yaml     |  2 +-
     2 files changed, 50 insertions(+), 24 deletions(-)
    
    diff --git a/examples/postgres-operator/README.md b/examples/postgres-operator/README.md
    index dd5fce5e16..21ecec7365 100644
    --- a/examples/postgres-operator/README.md
    +++ b/examples/postgres-operator/README.md
    @@ -8,23 +8,51 @@ After looking at several alternatives, Zalando's postgres operator felt like the
     
     ## Prerequisites
     
    -1. Install [Vagrant](https://www.vagrantup.com/)
    -2. Install `make` and `kustomize`
    -1. Install `sha256sum` (on Mac it's `brew install coreutils`)
    +1. Install [Docker](https://docs.docker.com/get-docker/). Other container engines will likely work as well but aren't actively tested by the Zarf team.
    +
    +1. Install [KinD](https://github.com/kubernetes-sigs/kind). Other Kubernetes distros will work as well, but we'll be using KinD for this example since it is easy and tested frequently and thoroughly.
    +
    +1. Clone the Zarf project — for the example configuration files.
    +
    +1. Download a Zarf release — you need a binary _**and**_ an init package, [here](../../docs/workstation.md#just-gimmie-zarf).
    +
    +1. Log `zarf` into Iron Bank if you haven't already — instructions [here](../../docs/ironbank.md#2-configure-zarf-the-use-em). Optional for this specific example since the container comes from GitHub rather than Iron Bank but a good practice and needed for most of the other examples.
    +
    +1. (Optional) Put `zarf` on your path — _technically_ optional but makes running commands simpler. Make sure you are picking the right binary that matches your system architecture. `zarf` for x86 Linux, `zarf-mac-intel` for x86 MacOS, `zarf-mac-apple` for M1 MacOS.
    +
    +1. Create a Zarf cluster as described in the [Doom example docs](../game/README.md)
     
     ## Instructions
     
    -1. `cd examples/postgres-operator`
    -1. Run one of these two commands:
    -  - `make all` - Download the latest version of Zarf, build the deploy package, and start a VM with Vagrant
    -  - `make all-dev` - Build Zarf locally, build the deploy package, and start a VM with Vagrant
    -2. Run: `./zarf init --confirm --components k3s` - Initialize Zarf, telling it to install just the management component, and tells Zarf to use `127.0.0.1` as the hostname. If you want to use interactive mode instead just run `./zarf init`.
    -3. Wait a bit, run `k9s` to see pods come up. Don't move on until everything is running
    -4. Run: `./zarf package deploy zarf-package-postgres-operator-demo.tar.zst --confirm` - Deploy the package. If you want interactive mode instead just run `./zarf package deploy`, it will give you a picker to choose the package.
    -5. Wait a couple of minutes. Run `k9s` to watch progress
    -6. The Postgres Operator UI will be available by running `./zarf connect postgres-operator-ui` and pgadmin will be available by running `./zarf connect pgadmin`
    -  -  If you want to run other commands after/during the browsing of the postgres tools, you can add a `&` character at the end of the connect command to run the command in the background ie) `./zarf connect pgadmin &`.
    -7. Set up a server in PGAdmin:
    +### Deploy the package
    +
    +```sh
    +# Open the directory
    +cd examples/postgres-operator
    +
    +# Build the package
    +zarf package create
    +
    +# Deploy the package (Press TAB for the listing of available packages)
    +zarf package deploy
    +```
    +
    +Wait a couple of minutes. You'll know it is done when Zarf exits and you get the 3 connect commands.
    +
    +### Create the backups bucket in MinIO (TODO: Figure out how to create the bucket automatically)
    +
    +1. Run `zarf connect minio` to navigate to the web console.
    +1. Log in - Username: `minio` - Password: `minio123`
    +1. Buckets -> Create Bucket
    +   - Bucket Name: `postgres-operator-backups`
    +
    +### Open the UI
    +
    +The Postgres Operator UI will be available by running `./zarf connect postgres-operator-ui` and pgadmin will be available by running `./zarf connect pgadmin`
    +
    +> If you want to run other commands after/during the browsing of the postgres tools, you can add a `&` character at the end of the connect command to run the command in the background ie) `./zarf connect pgadmin &`.
    +
    +### Set up a server in PGAdmin:
       - General // Name: `acid-zarf-test`
       - General // Server group: `Servers`
       - Connection // Host: (the URL in the table below)
    @@ -33,23 +61,21 @@ After looking at several alternatives, Zalando's postgres operator felt like the
       - Connection // Username: `zarf`
       - Connection // Password: (run the command in the table below)
       - SSL // SSL mode: `Require`
    -1. Create the backups bucket in MinIO (TODO: Figure out how to create the bucket automatically)
    -  1. Run `zarf connect minio` to navigate to the web console.
    -  1. Log in - Username: `minio` - Password: `minio123`
    -  1. Buckets -> Create Bucket
    -    - Bucket Name: `postgres-operator-backups`
    -1. When you're done, run `exit` to leave the VM then `make vm-destroy` to bring everything down
     
    +### Clean Up
     
    +```sh
    +kind delete cluster
    +```
     
     ## Logins
     
     | Service                   | URL                                                                                        | Username             | Password                                                                                                                                                   |
     | ------------------------- | ------------------------------------------------------------------------------------------ | -------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------- |
    -| Postgres Operator UI      | [https://postgres-operator-ui.localhost:8443](https://postgres-operator-ui.localhost:8443) | N/A                  | N/A                                                                                                                                                        |
    -| PGAdmin                   | [https://pgadmin.localhost:8443](https://pgadmin.localhost:8443)                           | `zarf@example.local` | Run: `zarf tools get-admin-password`                                                                                                                       |
    +| Postgres Operator UI      | `zarf connect postgres-operator-ui` | N/A                  | N/A                                                                                                                                                        |
    +| PGAdmin                   | `zarf connect pgadmin`                           | `zarf@example.local` | Run: `zarf tools get-admin-password`                                                                                                                       |
     | Example Postgres Database | `acid-zarf-test.postgres-operator.svc.cluster.local`                                       | `zarf`               | Run: `echo $(kubectl get secret zarf.acid-zarf-test.credentials.postgresql.acid.zalan.do -n postgres-operator --template={{.data.password}} \| base64 -d)` |
    -| Minio Console             | [https://minio-console.localhost:8443](https://minio-console.localhost:8443)               | `minio`              | `minio123`                                                                                                                                                 |
    +| Minio Console             | `zarf connect minio`               | `minio`              | `minio123`                                                                                                                                                 |
     
     ## References
     - https://blog.flant.com/comparing-kubernetes-operators-for-postgresql/
    diff --git a/examples/postgres-operator/values/pgadmin.yaml b/examples/postgres-operator/values/pgadmin.yaml
    index 659b95df99..d29da8690c 100644
    --- a/examples/postgres-operator/values/pgadmin.yaml
    +++ b/examples/postgres-operator/values/pgadmin.yaml
    @@ -11,4 +11,4 @@ resources:
         memory: "512Mi"
     env:
       email: "zarf@example.local"
    -  password: "###ZARF_SECRET###"
    +  password: "###ZARF_GIT_AUTH_PUSH###"
    
    From d997ff1790c47e00665db3190dd41a58e1ff5db7 Mon Sep 17 00:00:00 2001
    From: Jeff McCoy 
    Date: Mon, 7 Feb 2022 21:57:51 -0600
    Subject: [PATCH 87/88] update single-big-bang-package example docs
    
    ---
     examples/single-big-bang-package/README.md | 149 ++++++++++++++++++---
     examples/tiny-kafka/README.md              |  49 ++-----
     2 files changed, 147 insertions(+), 51 deletions(-)
    
    diff --git a/examples/single-big-bang-package/README.md b/examples/single-big-bang-package/README.md
    index 80c6d985e8..31f6a90b59 100644
    --- a/examples/single-big-bang-package/README.md
    +++ b/examples/single-big-bang-package/README.md
    @@ -1,16 +1,133 @@
    -## Zarf Big Bang Single Package Example
    -
    -This example demonstrates using Zarf in a very low-resources/singlue-use environment.  In this mode there is no gitops service and Zarf is simply a standard means of wrapping airgap concerns for K3s. This example deploys a basic K3s cluster using Traefik 2 and configures TLS / airgap concerns to deploy a single BB Package (twistlock).
    -
    -### Steps to use:
    -
    -1. `cd examples/`
    -2. Run one of these two commands:
    -   - `make all` - Download the latest version of Zarf, build the deploy package, and start a VM with Vagrant
    -   - `make all-dev` - Build Zarf locally, build the deploy package, and start a VM with Vagrant
    -3. Run: `./zarf init --confirm --components k3s` - Initialize Zarf, telling it to install k3s on your new VM. If you want to use interactive mode instead just run `./zarf init`.
    -4. Wait a bit, run `./zarf tools k9s` to see pods come up. Don't move on until everything is running
    -5. Run: `./zarf package deploy zarf-package-big-bang-core-demo.tar.zst --components kubescape --confirm` - Deploy Big Bang Core. If you want interactive mode instead just run `./zarf package deploy`, it will give you a picker to choose the package.
    -6. Wait several minutes. Run `./zarf tools k9s` to watch progress
    -8. Run `./zarf connect twistlock` to be taken to the twistlock consule in your browser.
    -9. When you're done, run `exit` to leave the VM then `make vm-destroy` to bring everything down
    +# Zarf Single Big Bang Package Example
    +
    +This example uses Zarf to deploy a single [Big Bang](https://p1.dso.mil/#/products/big-bang/) Package into a KinD cluster.
    +
    +## The Flow
    +
    +Here's what you'll do in this example:
    +
    +1. [Get ready](#get-ready)
    +
    +1. [Create a cluster](#create-a-cluster)
    +
    +1. [Package it](#package-it)
    +
    +1. [Deploy it](#deploy-it)
    +
    +1. [Try it](#try-it)
    +
    +1. [Cleanup](#cleanup)
    +
    + 
    +
    +## Get ready
    +
    +Before the magic can happen you have to do a few things:
    +
    +1. Install [Docker](https://docs.docker.com/get-docker/). Other container engines will likely work as well but aren't actively tested by the Zarf team.
    +
    +2. Install [KinD](https://github.com/kubernetes-sigs/kind). Other Kubernetes distros will work as well, but we'll be using KinD for this example since it is easy and tested frequently and thoroughly.
    +
    +3. Clone the Zarf project — for the example configuration files.
    +
    +4. Download a Zarf release — you need a binary _**and**_ an init package, [here](../../docs/workstation.md#just-gimmie-zarf).
    +
    + 
    +
    +## Create a cluster
    +
    +You can't run software without _somewhere to run it_, so the first thing to do is create a local Kubernetes cluster that Zarf can deploy to. In this example we'll be using KinD to create a lightweight, local K8s cluster running in Docker.
    +
    +Kick that off by running this command:
    +
    +```sh
    +kind create cluster
    +```
    +
    +This will result in a single-node Kubernetes cluster called `kind-kind` on your local machine running in Docker. Your KUBECONFIG should be automatically configured to talk to the new cluster.
    +
    +```sh
    +cd 
    +zarf init
    +```
    +
    +Follow the prompts, answering "no" to each of the optional components, since we don't need them for this deployment.
    +
    +Congratulations! Your machine is now running a single-node Kubernetes cluster powered by Zarf!
    +
    +> _**Note**_
    +>
    +> Zarf supports non-interactive installs too! Give `zarf init --confirm --components logging` a try next time.
    +
    +**Troubleshooting:**
    +
    +> _**ERROR: Unable to find the package on the local system, expected package at zarf-init.tar.zst**_
    +>
    +> The zarf binary needs an init package to know how to setup your cluster! So, if `zarf init` returns an error like this:
    +>
    +> ```sh
    +> ERROR:  Unable to find the package on the local system, expected package at zarf-init.tar.zst
    +> ```
    +>
    +> It's likely you've either forgotten to download `zarf-init.tar.zst` (as part of [getting ready](#get-ready)) _**OR**_ you are _not_ running `zarf init` from the directory the init package is sitting in.
    +
    +> _**ERROR: failed to create cluster: node(s) already exist for a cluster with the name "kind"**_
    +>
    +> You already have a KinD cluster running. Either just move on to use the current cluster, or run `kind delete cluster`, then `kind create cluster`.
    +
    +> _**Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?**_
    +>
    +> Docker isn't running or you're otherwise not able to talk to it. Check your Docker installation, then try again.
    +
    + 
    +
    +## Package it
    +
    +Zarf is (at heart) a tool for making it easy to get software from _where you have it_ to _**where you need it**_—specifically, across an airgap. Since moving bits is so core to Zarf the idea of a "ready-to-move group of software" has a specific name—the _package_.
    +
    +All of the software a Zarf cluster runs is installed via package—for many reasons like versioning, auditability, etc—which means that if you want to run a in your cluster you're going to have to build a package for it.
    +
    +Luckily, this is very easy to do—package contents are defined by simple, declarative yaml files and _we've already made one for you_. To build this package you simply:
    +
    +```sh
    +cd /examples/single-big-bang-package     # directory with zarf.yaml, and
    +zarf package create --confirm         # make the package
    +```
    +
    +Watch the terminal scroll for a while. Once things are downloaded & zipped up and you'll see a file ending in `.tar.zst` drop. _That's_ your package.
    +
    + 
    +
    +## Deploy it
    +
    +It's time to feed the package you built into your cluster.
    +
    +Since you're running a Zarf cluster directly on your local machine—where this package & `zarf` binary _already are_—deploying the package is very simple:
    +
    +```sh
    +zarf package deploy zarf-package-big-bang-single-package-demo.tar.zst --confirm
    +```
    +
    +In a couple seconds the cluster will have loaded your package.
    +
    + 
    +
    +## Use it
    +
    +Run `./zarf connect twistlock` to be taken to the twistlock consule in your browser.
    +
    + 
    +
    +## Cleanup
    +
    +Once you've had your fun it's time to clean up.
    +
    +In this case, since the Zarf cluster was installed specifically (and _only_) to serve this example, clean up is really easy—you just tear down the entire cluster:
    +
    +```sh
    +kind delete cluster
    +```
    +
    +It only takes a couple moments for the _entire cluster_ to disappear—long-running system services and all—leaving your machine ready for the next adventure.
    +
    + 
    diff --git a/examples/tiny-kafka/README.md b/examples/tiny-kafka/README.md
    index 7eb18e0df0..e5fdf927c8 100644
    --- a/examples/tiny-kafka/README.md
    +++ b/examples/tiny-kafka/README.md
    @@ -4,27 +4,24 @@ This example demonstrates using Zarf to deploy a simple operator example, in thi
     
     ## The Flow
     
    -
     Here's what you'll do in this example:
     
     1. [Get ready](#get-ready)
     
     1. [Create a cluster](#create-a-cluster)
     
    -2. [Package it](#package-it)
    +1. [Package it](#package-it)
     
    -3. [Deploy it](#deploy-it)
    +1. [Deploy it](#deploy-it)
     
    -4. [Try it](#try-it)
    +1. [Try it](#try-it)
     
    -5. [Cleanup](#cleanup)
    +1. [Cleanup](#cleanup)
     
      
     
    -
     ## Get ready
     
    -
     Before the magic can happen you have to do a few things:
     
     1. Install [Docker](https://docs.docker.com/get-docker/). Other container engines will likely work as well but aren't actively tested by the Zarf team.
    @@ -37,7 +34,6 @@ Before the magic can happen you have to do a few things:
     
      
     
    -
     ## Create a cluster
     
     You can't run software without _somewhere to run it_, so the first thing to do is create a local Kubernetes cluster that Zarf can deploy to. In this example we'll be using KinD to create a lightweight, local K8s cluster running in Docker.
    @@ -57,20 +53,22 @@ zarf init
     
     Follow the prompts, answering "no" to each of the optional components, since we don't need them for this deployment.
     
    -Congratulations!  Your machine is now running a single-node Kubernetes cluster powered by Zarf!
    +Congratulations! Your machine is now running a single-node Kubernetes cluster powered by Zarf!
     
    - > _**Note**_
    - >
    - > Zarf supports non-interactive installs too! Give `zarf init --confirm --components logging` a try next time.
    +> _**Note**_
    +>
    +> Zarf supports non-interactive installs too! Give `zarf init --confirm --components logging` a try next time.
     
     **Troubleshooting:**
     
    -> _**ERROR:  Unable to find the package on the local system, expected package at zarf-init.tar.zst**_
    +> _**ERROR: Unable to find the package on the local system, expected package at zarf-init.tar.zst**_
     >
     > The zarf binary needs an init package to know how to setup your cluster! So, if `zarf init` returns an error like this:
    +>
     > ```sh
     > ERROR:  Unable to find the package on the local system, expected package at zarf-init.tar.zst
     > ```
    +>
     > It's likely you've either forgotten to download `zarf-init.tar.zst` (as part of [getting ready](#get-ready)) _**OR**_ you are _not_ running `zarf init` from the directory the init package is sitting in.
     
     > _**ERROR: failed to create cluster: node(s) already exist for a cluster with the name "kind"**_
    @@ -83,13 +81,11 @@ Congratulations!  Your machine is now running a single-node Kubernetes cluster p
     
      
     
    -
     ## Package it
     
    -
     Zarf is (at heart) a tool for making it easy to get software from _where you have it_ to _**where you need it**_—specifically, across an airgap. Since moving bits is so core to Zarf the idea of a "ready-to-move group of software" has a specific name—the _package_.
     
    -All of the software a Zarf cluster runs is installed via package—for many reasons like versioning, auditability, etc—which means that if you want to run a  in your cluster you're going to have to build a package for it.
    +All of the software a Zarf cluster runs is installed via package—for many reasons like versioning, auditability, etc—which means that if you want to run a in your cluster you're going to have to build a package for it.
     
     Luckily, this is very easy to do—package contents are defined by simple, declarative yaml files and _we've already made one for you_. To build this package you simply:
     
    @@ -98,14 +94,12 @@ cd /examples/tiny-kafka     # directory with zarf.yaml, and
     zarf package create --confirm         # make the package
     ```
     
    -Watch the terminal scroll for a while. Once things are downloaded & zipped up and you'll see a file ending in `.tar.zst` drop.  _That's_ your package.
    +Watch the terminal scroll for a while. Once things are downloaded & zipped up and you'll see a file ending in `.tar.zst` drop. _That's_ your package.
     
      
     
    -
     ## Deploy it
     
    -
     It's time to feed the package you built into your cluster.
     
     Since you're running a Zarf cluster directly on your local machine—where this package & `zarf` binary _already are_—deploying the package is very simple:
    @@ -120,7 +114,7 @@ In a couple seconds the cluster will have loaded your package.
     
     ## Use it
     
    -Testing will require JDK and the kafka tools:  `sudo apt install openjdk-14-jdk-headless` for Ubuntu.  More details can be found at https://kafka.apache.org/quickstart.  Steps to test:
    +Testing will require JDK and the kafka tools: `sudo apt install openjdk-14-jdk-headless` for Ubuntu. More details can be found at https://kafka.apache.org/quickstart. Steps to test:
     
     1. Install JDK and extract the Kafka tools from the package `kafka.tgz`
     2. Get the Nodeport: `NODEPORT=$(kubectl get service demo-kafka-external-bootstrap -n kafka-demo -o=jsonpath='{.spec.ports[0].nodePort}{"\n"}')`
    @@ -131,7 +125,6 @@ Testing will require JDK and the kafka tools:  `sudo apt install openjdk-14-jdk-
     
     ## Cleanup
     
    -
     Once you've had your fun it's time to clean up.
     
     In this case, since the Zarf cluster was installed specifically (and _only_) to serve this example, clean up is really easy—you just tear down the entire cluster:
    @@ -141,17 +134,3 @@ kind delete cluster
     ```
     
     It only takes a couple moments for the _entire cluster_ to disappear—long-running system services and all—leaving your machine ready for the next adventure.
    -
    - 
    -
    ----
    -
    - 
    -
    -### Credits
    -
    -✨ Special thanks to these fine references! ✨
    -
    -- https://www.reddit.com/r/programming/comments/nap4pt/dos_gaming_in_docker/
    -
    -- https://earthly.dev/blog/dos-gaming-in-docker/
    
    From f4e5aa3f5db0f41a51c3fe18ab881e5fa4fa597d Mon Sep 17 00:00:00 2001
    From: Jeff McCoy 
    Date: Mon, 7 Feb 2022 22:19:54 -0600
    Subject: [PATCH 88/88] update data injection example docs
    
    ---
     examples/data-injection/README.md | 156 +++++++++++++++++++++++++++---
     1 file changed, 144 insertions(+), 12 deletions(-)
    
    diff --git a/examples/data-injection/README.md b/examples/data-injection/README.md
    index f58a3f93b5..ecfc4e4b45 100644
    --- a/examples/data-injection/README.md
    +++ b/examples/data-injection/README.md
    @@ -1,14 +1,146 @@
     ## Zarf Appliance Mode Example
     
    -This example demonstrates using Zarf in a very low-resources/singlue-use environment.  In this mode there is no gitops service and Zarf is simply a standard means of wrapping airgap concerns for K3s. This example deploys a basic K3s cluster using Traefik 2 and configures TLS / airgap concerns to deploy [Podinfo](https://github.com/stefanprodan/podinfo).
    -
    -### Steps to use:
    -1. Build everything you will need for this example
    -   1. `cd /path/to/zarf`
    -   2. `make build-cli init-package`
    -   3. `cd ./examples`
    -   4. `make package-example-data-injection`
    -   5. Either run `make vm-init` or roll your own Kubernetes cluster locally however you like.
    -2. Run `./zarf init` following the prompts as best fit for your environment 
    -   - If you did start up your own Kubernetes cluster say `yes` when prompted for k3s.
    -3. Run `./zarf package deploy zarf-package-data-injection-demo.tar`
    +This example demonstrates using Zarf in a very low-resources/singlue-use environment.  In this mode there is no gitops service and Zarf is simply a standard means of wrapping airgap concerns for K3s. 
    +
    +# Zarf Data Injection Example
    +
    +This example deploys a basic K3s cluster using Traefik 2 and configures TLS / airgap concerns to deploy [Podinfo](https://github.com/stefanprodan/podinfo).
    +## The Flow
    +
    +Here's what you'll do in this example:
    +
    +1. [Get ready](#get-ready)
    +
    +1. [Create a cluster](#create-a-cluster)
    +
    +1. [Package it](#package-it)
    +
    +1. [Deploy it](#deploy-it)
    +
    +1. [Try it](#try-it)
    +
    +1. [Cleanup](#cleanup)
    +
    + 
    +
    +## Get ready
    +
    +Before the magic can happen you have to do a few things:
    +
    +1. Install [Docker](https://docs.docker.com/get-docker/). Other container engines will likely work as well but aren't actively tested by the Zarf team.
    +
    +2. Install [KinD](https://github.com/kubernetes-sigs/kind). Other Kubernetes distros will work as well, but we'll be using KinD for this example since it is easy and tested frequently and thoroughly.
    +
    +3. Clone the Zarf project — for the example configuration files.
    +
    +4. Download a Zarf release — you need a binary _**and**_ an init package, [here](../../docs/workstation.md#just-gimmie-zarf).
    +
    + 
    +
    +## Create a cluster
    +
    +You can't run software without _somewhere to run it_, so the first thing to do is create a local Kubernetes cluster that Zarf can deploy to. In this example we'll be using KinD to create a lightweight, local K8s cluster running in Docker.
    +
    +Kick that off by running this command:
    +
    +```sh
    +kind create cluster
    +```
    +
    +This will result in a single-node Kubernetes cluster called `kind-kind` on your local machine running in Docker. Your KUBECONFIG should be automatically configured to talk to the new cluster.
    +
    +```sh
    +cd 
    +zarf init
    +```
    +
    +Follow the prompts, answering "no" to each of the optional components, since we don't need them for this deployment.
    +
    +Congratulations! Your machine is now running a single-node Kubernetes cluster powered by Zarf!
    +
    +> _**Note**_
    +>
    +> Zarf supports non-interactive installs too! Give `zarf init --confirm --components logging` a try next time.
    +
    +**Troubleshooting:**
    +
    +> _**ERROR: Unable to find the package on the local system, expected package at zarf-init.tar.zst**_
    +>
    +> The zarf binary needs an init package to know how to setup your cluster! So, if `zarf init` returns an error like this:
    +>
    +> ```sh
    +> ERROR:  Unable to find the package on the local system, expected package at zarf-init.tar.zst
    +> ```
    +>
    +> It's likely you've either forgotten to download `zarf-init.tar.zst` (as part of [getting ready](#get-ready)) _**OR**_ you are _not_ running `zarf init` from the directory the init package is sitting in.
    +
    +> _**ERROR: failed to create cluster: node(s) already exist for a cluster with the name "kind"**_
    +>
    +> You already have a KinD cluster running. Either just move on to use the current cluster, or run `kind delete cluster`, then `kind create cluster`.
    +
    +> _**Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?**_
    +>
    +> Docker isn't running or you're otherwise not able to talk to it. Check your Docker installation, then try again.
    +
    + 
    +
    +## Package it
    +
    +Zarf is (at heart) a tool for making it easy to get software from _where you have it_ to _**where you need it**_—specifically, across an airgap. Since moving bits is so core to Zarf the idea of a "ready-to-move group of software" has a specific name—the _package_.
    +
    +All of the software a Zarf cluster runs is installed via package—for many reasons like versioning, auditability, etc—which means that if you want to run a in your cluster you're going to have to build a package for it.
    +
    +Luckily, this is very easy to do—package contents are defined by simple, declarative yaml files and _we've already made one for you_. To build this package you simply:
    +
    +```sh
    +cd /examples/data-injection     # directory with zarf.yaml, and
    +zarf package create --confirm             # make the package
    +```
    +
    +Watch the terminal scroll for a while. Once things are downloaded & zipped up and you'll see a file ending in `.tar` drop. _That's_ your package.  
    +
    +*This package ends in .tar instead of .tar.zst because the `zarf.yaml` uncrompressed flag is set to true.*
    +
    + 
    +
    +## Deploy it
    +
    +It's time to feed the package you built into your cluster.
    +
    +Since you're running a Zarf cluster directly on your local machine—where this package & `zarf` binary _already are_—deploying the package is very simple:
    +
    +```sh
    +zarf package deploy zarf-package-data-injection-demo.tar --confirm
    +```
    +
    +In a couple seconds the cluster will have loaded your package.
    +
    + 
    +
    +## Use it
    +
    +This demo should have placed some test files in the cluster from the zarf package.  To verify they were created, you can run the following command:
    +
    +```shell
    +kubectl exec -n demo data-injection -- cat /test/this-is-an-example-file.txt 
    +```
    +
    +The output should say:
    +>This is a sample file to be injected into the cluster.  Normal flow would keep this data gitignored as it would likely be large.
    +
    +
    + 
    +
    +## Cleanup
    +
    +Once you've had your fun it's time to clean up.
    +
    +In this case, since the Zarf cluster was installed specifically (and _only_) to serve this example, clean up is really easy—you just tear down the entire cluster:
    +
    +```sh
    +kind delete cluster
    +```
    +
    +It only takes a couple moments for the _entire cluster_ to disappear—long-running system services and all—leaving your machine ready for the next adventure.
    +
    + 
    

+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 &%#?z-oD^RILTm7|C+#g$F;}Df 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