From 87e280094e0d605f0c1da3a8d6a375779cdd6d0a Mon Sep 17 00:00:00 2001 From: Mariia Kotliarevskaia Date: Thu, 30 Mar 2023 21:36:38 +0200 Subject: [PATCH] Add harbor app Signed-off-by: Mariia Kotliarevskaia --- README.md | 91 ++++++++++++------------- cmd/apps/harbor.go | 162 +++++++++++++++++++++++++++++++++++++++++++++ cmd/install.go | 4 +- 3 files changed, 211 insertions(+), 46 deletions(-) create mode 100644 cmd/apps/harbor.go diff --git a/README.md b/README.md index c087bcd95..2aa034d09 100644 --- a/README.md +++ b/README.md @@ -617,70 +617,71 @@ A CLI or "tool" is a command line tool that you run directly on your own worksta | TOOL | DESCRIPTION | |-------------------------|---------------------------------------------------------------------| -| docker-registry-ingress | Install registry ingress with TLS | -| inlets-operator | Install inlets-operator | -| kuma | Install Kuma | -| kube-state-metrics | Install kube-state-metrics | -| cert-manager | Install cert-manager | -| docker-registry | Install a Docker registry | +| gitlab | Install GitLab | | rabbitmq | Install rabbitmq | +| kanister | Install kanister for application-level data management | | linkerd | Install linkerd | -| redis | Install redis | -| gitlab | Install GitLab | -| falco | Install Falco | +| inlets-operator | Install inlets-operator | +| loki | Install Loki for monitoring and tracing | +| jenkins | Install jenkins | +| opa-gatekeeper | Install Open Policy Agent (OPA) Gatekeeper | +| cassandra | Install cassandra | | registry-creds | Install registry-creds | -| qemu-static | Install qemu-user-static | -| metrics-server | Install metrics-server | -| postgresql | Install postgresql | +| chart | Install the specified helm chart | +| kafka-connector | Install kafka-connector for OpenFaaS | +| kubernetes-dashboard | Install kubernetes-dashboard | | ingress-nginx | Install ingress-nginx | -| jenkins | Install jenkins | -| nginx-inc | Install nginx-inc for OpenFaaS | -| metallb-arp | Install MetalLB in L2 (ARP) mode | -| loki | Install Loki for monitoring and tracing | -| nfs-provisioner | Install nfs subdir external provisioner | -| mqtt-connector | Install mqtt-connector for OpenFaaS | -| kanister | Install kanister for application-level data management | +| cert-manager | Install cert-manager | | openfaas-ingress | Install openfaas ingress with TLS | -| chart | Install the specified helm chart | -| cron-connector | Install cron-connector for OpenFaaS | -| minio | Install minio | +| vault | Install vault | +| harbor | Install harbor | +| docker-registry-ingress | Install registry ingress with TLS | +| cockroachdb | Install CockroachDB | +| tekton | Install Tekton pipelines and dashboard | +| consul-connect | Install Consul Service Mesh | +| inlets-tcp-client | Install inlets PRO TCP client | +| docker-registry | Install a community maintained Docker registry chart | +| falco | Install Falco | +| prometheus | Install Prometheus for monitoring | +| qemu-static | Install qemu-user-static | +| crossplane | Install Crossplane | +| portainer | Install portainer to visualise and manage containers | +| grafana | Install grafana | +| kyverno | Install Kyverno | | openfaas | Install openfaas | +| influxdb | Install influxdb | +| metrics-server | Install metrics-server | +| argocd | Install argocd | +| nfs-provisioner | Install nfs subdir external provisioner | +| metallb-arp | Install MetalLB in L2 (ARP) mode | | kafka | Install Confluent Platform Kafka | -| kubernetes-dashboard | Install kubernetes-dashboard | -| OSM | Install osm | -| inlets-tcp-client | Install inlets PRO TCP client | +| cron-connector | Install cron-connector for OpenFaaS | | kong-ingress | Install kong-ingress for OpenFaaS | | sealed-secret | Install sealed-secrets | -| cassandra | Install cassandra | +| nginx-inc | Install nginx-inc for OpenFaaS | +| openfaas-loki | Install Loki-OpenFaaS and Configure Loki logs provider for OpenFaaS | +| redis | Install redis | +| OSM | Install osm | | waypoint | Install Waypoint | -| opa-gatekeeper | Install Open Policy Agent (OPA) Gatekeeper | +| gitea | Install gitea | | mongodb | Install mongodb | -| grafana | Install grafana | +| mqtt-connector | Install mqtt-connector for OpenFaaS | +| nats-connector | Install OpenFaaS connector for NATS | +| traefik2 | Install traefik2 | | kube-image-prefetch | Install kube-image-prefetch | -| consul-connect | Install Consul Service Mesh | -| argocd | Install argocd | -| prometheus | Install Prometheus for monitoring | +| kuma | Install Kuma | +| kube-state-metrics | Install kube-state-metrics | | istio | Install istio | -| crossplane | Install Crossplane | -| cockroachdb | Install CockroachDB | -| openfaas-loki | Install Loki-OpenFaaS and Configure Loki logs provider for OpenFaaS | -| portainer | Install portainer to visualise and manage containers | -| tekton | Install Tekton pipelines and dashboard | -| traefik2 | Install traefik2 | -| kafka-connector | Install kafka-connector for OpenFaaS | -| gitea | Install gitea | -| influxdb | Install influxdb | -| nats-connector | Install OpenFaaS connector for NATS | -| kyverno | Install Kyverno | -| vault | Install Vault | +| postgresql | Install postgresql | +| minio | Install minio | -There are 56 apps that you can install on your cluster. +There are 57 apps that you can install on your cluster. > Note to contributors, run `arkade install --print-table` to generate this list ### Catalog of CLIs -| TOOL | DESCRIPTION | +| TOOL | DESCRIPTION | |------------------------------------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------| | [argocd](https://github.com/argoproj/argo-cd) | Declarative, GitOps continuous delivery tool for Kubernetes. | | [argocd-autopilot](https://github.com/argoproj-labs/argocd-autopilot) | An opinionated way of installing Argo-CD and managing GitOps repositories. | diff --git a/cmd/apps/harbor.go b/cmd/apps/harbor.go new file mode 100644 index 000000000..2f8b1eecb --- /dev/null +++ b/cmd/apps/harbor.go @@ -0,0 +1,162 @@ +// Copyright (c) arkade author(s) 2022. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +package apps + +import ( + "fmt" + + "github.com/spf13/cobra" + + "github.com/alexellis/arkade/pkg" + "github.com/alexellis/arkade/pkg/apps" + "github.com/alexellis/arkade/pkg/config" + "github.com/alexellis/arkade/pkg/types" +) + +func MakeInstallHarbor() *cobra.Command { + var harbor = &cobra.Command{ + Use: "harbor", + Short: "Install harbor", + Long: `Install harbor`, + Example: ` arkade install harbor + # with ingress and custom domain + arkade install harbor --ingress=true --domain=example.com`, + SilenceUsage: true, + } + + harbor.Flags().StringP("namespace", "n", "harbor", "The namespace to install the chart") + harbor.Flags().Bool("update-repo", true, "Update the helm repo") + harbor.Flags().Bool("ingress", false, "Enable ingress") + harbor.Flags().Bool("trivy", false, "Enable trivy") + harbor.Flags().Bool("notary", false, "Enable notary") + harbor.Flags().String("domain", "", "Set ingress domain") + harbor.Flags().Bool("persistence", false, "Enable harbor server persistence") + harbor.Flags().StringArray("set", []string{}, "Use custom flags or override existing flags \n(example --set image.tag=1.11.2)") + + harbor.PreRunE = func(cmd *cobra.Command, args []string) error { + _, err := cmd.Flags().GetString("namespace") + if err != nil { + return err + } + + _, err = cmd.Flags().GetStringArray("set") + if err != nil { + return err + } + + _, err = cmd.Flags().GetBool("update-repo") + if err != nil { + return err + } + + ingressEnabled, err := cmd.Flags().GetBool("ingress") + if err != nil { + return err + } + + _, err = cmd.Flags().GetBool("trivy") + if err != nil { + return err + } + + _, err = cmd.Flags().GetBool("notary") + if err != nil { + return err + } + + ingressDomain, err := cmd.Flags().GetString("domain") + if err != nil { + return err + } + + if !ingressEnabled && ingressDomain != "" { + return fmt.Errorf("--domain option should be used only with --ingress=true") + } + + _, err = cmd.Flags().GetBool("persistence") + if err != nil { + return err + } + + return nil + } + + harbor.RunE = func(cmd *cobra.Command, args []string) error { + kubeConfigPath, _ := cmd.Flags().GetString("kubeconfig") + if err := config.SetKubeconfig(kubeConfigPath); err != nil { + return err + } + + namespace, _ := cmd.Flags().GetString("namespace") + updateRepo, _ := cmd.Flags().GetBool("update-repo") + ingressEnabled, _ := cmd.Flags().GetBool("ingress") + ingressDomain, _ := cmd.Flags().GetString("domain") + persistence, _ := cmd.Flags().GetBool("persistence") + trivyEnabled, _ := cmd.Flags().GetBool("trivy") + notaryEnabled, _ := cmd.Flags().GetBool("notary") + customFlags, _ := cmd.Flags().GetStringArray("set") + + overrides := map[string]string{ + "expose.type": "clusterIP", + "externalURL": "harbor", + "trivy.enabled": "false", + "notary.enabled": "false", + "persistence.enabled": "false", + "expose.tls.auto.commonName": "harbor", + "chartmuseum.enabled": "false", // disable chartmuseum per https://github.com/goharbor/harbor/discussions/15057 + } + + if ingressDomain != "" { + overrides["expose.ingress.hosts.core"] = fmt.Sprintf("harbor.%s", ingressDomain) + overrides["externalURL"] = fmt.Sprintf("https://harbor.%s", ingressDomain) + } + + if ingressEnabled { + overrides["expose.type"] = "ingress" + } + + if persistence { + overrides["persistence.enabled"] = "true" + } + + if trivyEnabled { + overrides["trivy.enabled"] = "true" + } + + if notaryEnabled { + overrides["notary.enabled"] = "true" + overrides["expose.ingress.hosts.notary"] = fmt.Sprintf("notary.%s", ingressDomain) + } + + if err := config.MergeFlags(overrides, customFlags); err != nil { + return err + } + + harborOptions := types.DefaultInstallOptions(). + WithNamespace(namespace). + WithHelmRepo("harbor/harbor"). + WithHelmURL("https://helm.goharbor.io"). + WithOverrides(overrides). + WithHelmUpdateRepo(updateRepo). + WithKubeconfigPath(kubeConfigPath) + + _, err := apps.MakeInstallChart(harborOptions) + if err != nil { + return err + } + + fmt.Println(HarborInstallMsg) + + return nil + } + + return harbor +} + +const HarborInfoMsg = `# Get the Harbor URL and login with the default credentials: admin/Harbor12345` + +const HarborInstallMsg = `======================================================================= += Harbor has been installed. = +=======================================================================` + + "\n\n" + HarborInfoMsg + "\n\n" + pkg.SupportMessageShort diff --git a/cmd/install.go b/cmd/install.go index 73b11be3a..02e44ab8c 100644 --- a/cmd/install.go +++ b/cmd/install.go @@ -7,9 +7,10 @@ import ( "fmt" "os" - "github.com/alexellis/arkade/cmd/apps" "github.com/olekukonko/tablewriter" "github.com/spf13/cobra" + + "github.com/alexellis/arkade/cmd/apps" ) type ArkadeApp struct { @@ -164,6 +165,7 @@ func GetApps() map[string]ArkadeApp { arkadeApps["kuma"] = NewArkadeApp(apps.MakeInstallKuma, apps.KumaInfoMsg) arkadeApps["qemu-static"] = NewArkadeApp(apps.MakeInstallQemuStatic, apps.QemuStaticInfoMsg) arkadeApps["vault"] = NewArkadeApp(apps.MakeInstallVault, apps.VaultInfoMsg) + arkadeApps["harbor"] = NewArkadeApp(apps.MakeInstallHarbor, apps.HarborInstallMsg) // Special "chart" app - let a user deploy any helm chart arkadeApps["chart"] = NewArkadeApp(apps.MakeInstallChart, "")