From 7af5837ffabd5420b52b7980baeab19f046f9294 Mon Sep 17 00:00:00 2001 From: kshamajain99 Date: Wed, 20 Jan 2021 11:28:06 -0800 Subject: [PATCH] build consolidated argocd binary (#5247) Signed-off-by: kshamajain99 --- .github/workflows/release.yaml | 9 +- Dockerfile | 15 +- Makefile | 36 ++-- Procfile | 8 +- .../commands/argocd_application_controller.go | 11 +- cmd/argocd-application-controller/main.go | 22 -- cmd/argocd-dex/commands/argocd_dex.go | 202 ++++++++++++++++++ .../commands/argocd_repo_server.go | 11 +- cmd/argocd-repo-server/main.go | 15 -- cmd/argocd-server/commands/argocd_server.go | 11 +- cmd/argocd-server/main.go | 18 -- cmd/argocd-util/commands/argocd_util.go | 139 +----------- cmd/argocd-util/main.go | 22 -- cmd/argocd/commands/root.go | 14 +- cmd/argocd/main.go | 18 -- cmd/main.go | 64 ++++++ cmd/util/common.go | 5 + .../server-commands/argocd-dex.md | 25 +++ .../server-commands/argocd-dex_gendexcfg.md | 36 ++++ .../server-commands/argocd-dex_rundex.md | 35 +++ .../server-commands/argocd-util.md | 2 - .../dex/argocd-dex-server-deployment.yaml | 4 +- manifests/ha/install.yaml | 6 +- manifests/ha/namespace-install.yaml | 6 +- manifests/install.yaml | 6 +- manifests/namespace-install.yaml | 6 +- mkdocs.yml | 1 + test/container/Procfile | 8 +- tools/cmd-docs/main.go | 10 +- util/settings/settings.go | 2 +- 30 files changed, 458 insertions(+), 309 deletions(-) delete mode 100644 cmd/argocd-application-controller/main.go create mode 100644 cmd/argocd-dex/commands/argocd_dex.go delete mode 100644 cmd/argocd-repo-server/main.go delete mode 100644 cmd/argocd-server/main.go delete mode 100644 cmd/argocd-util/main.go delete mode 100644 cmd/argocd/main.go create mode 100644 cmd/main.go create mode 100644 docs/operator-manual/server-commands/argocd-dex.md create mode 100644 docs/operator-manual/server-commands/argocd-dex_gendexcfg.md create mode 100644 docs/operator-manual/server-commands/argocd-dex_rundex.md diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index 44a809f73b35e..22730e38773b5 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -184,9 +184,6 @@ jobs: git clean -fd mkdir -p dist/ make image IMAGE_TAG="${TARGET_VERSION}" DOCKER_PUSH=false - sudo ./hack/install.sh packr-linux - make UTIL_CLI_NAME=argocd-util-darwin-amd64 GOOS=darwin argocd-util - make UTIL_CLI_NAME=argocd-util-windows-amd64.exe GOOS=windows argocd-util make release-cli chmod +x ./dist/argocd-linux-amd64 ./dist/argocd-linux-amd64 version --client @@ -271,7 +268,7 @@ jobs: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: upload_url: ${{ steps.create_release.outputs.upload_url }} - asset_path: ./dist/argocd-util-linux-amd64 + asset_path: ./dist/argocd-linux-amd64 asset_name: argocd-util-linux-amd64 asset_content_type: application/octet-stream if: ${{ env.DRY_RUN != 'true' }} @@ -282,7 +279,7 @@ jobs: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: upload_url: ${{ steps.create_release.outputs.upload_url }} - asset_path: ./dist/argocd-util-darwin-amd64 + asset_path: ./dist/argocd-darwin-amd64 asset_name: argocd-util-darwin-amd64 asset_content_type: application/octet-stream if: ${{ env.DRY_RUN != 'true' }} @@ -293,7 +290,7 @@ jobs: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: upload_url: ${{ steps.create_release.outputs.upload_url }} - asset_path: ./dist/argocd-util-windows-amd64.exe + asset_path: ./dist/argocd-windows-amd64.exe asset_name: argocd-util-windows-amd64.exe asset_content_type: application/octet-stream if: ${{ env.DRY_RUN != 'true' }} diff --git a/Dockerfile b/Dockerfile index 4e2e17c409fbc..5ff315ff0ef2d 100644 --- a/Dockerfile +++ b/Dockerfile @@ -117,12 +117,12 @@ RUN go mod download # Perform the build COPY . . -RUN make cli-local server controller repo-server argocd-util +RUN make argocd-all ARG BUILD_ALL_CLIS=true RUN if [ "$BUILD_ALL_CLIS" = "true" ] ; then \ - make CLI_NAME=argocd-darwin-amd64 GOOS=darwin cli-local && \ - make CLI_NAME=argocd-windows-amd64.exe GOOS=windows cli-local \ + make BIN_NAME=argocd-darwin-amd64 GOOS=darwin argocd-all && \ + make BIN_NAME=argocd-windows-amd64.exe GOOS=windows argocd-all \ ; fi #################################################################################################### @@ -131,3 +131,12 @@ RUN if [ "$BUILD_ALL_CLIS" = "true" ] ; then \ FROM argocd-base COPY --from=argocd-build /go/src/github.com/argoproj/argo-cd/dist/argocd* /usr/local/bin/ COPY --from=argocd-ui ./src/dist/app /shared/app + +USER root +RUN ln -s /usr/local/bin/argocd /usr/local/bin/argocd-util +RUN ln -s /usr/local/bin/argocd /usr/local/bin/argocd-server +RUN ln -s /usr/local/bin/argocd /usr/local/bin/argocd-repo-server +RUN ln -s /usr/local/bin/argocd /usr/local/bin/argocd-application-controller +RUN ln -s /usr/local/bin/argocd /usr/local/bin/argocd-dex + +USER 999 \ No newline at end of file diff --git a/Makefile b/Makefile index 6265ed62af4ea..49796e37659e0 100644 --- a/Makefile +++ b/Makefile @@ -3,6 +3,7 @@ CURRENT_DIR=$(shell pwd) DIST_DIR=${CURRENT_DIR}/dist CLI_NAME=argocd UTIL_CLI_NAME=argocd-util +BIN_NAME=argocd HOST_OS:=$(shell go env GOOS) HOST_ARCH:=$(shell go env GOARCH) @@ -194,11 +195,11 @@ cli: test-tools-image .PHONY: cli-local cli-local: clean-debug - CGO_ENABLED=0 ${PACKR_CMD} build -v -i -ldflags '${LDFLAGS}' -o ${DIST_DIR}/${CLI_NAME} ./cmd/argocd + CGO_ENABLED=0 ${PACKR_CMD} build -v -i -ldflags '${LDFLAGS}' -o ${DIST_DIR}/${CLI_NAME} ./cmd .PHONY: cli-argocd cli-argocd: - go build -v -i -ldflags '${LDFLAGS}' -o ${DIST_DIR}/${CLI_NAME} ./cmd/argocd + go build -v -i -ldflags '${LDFLAGS}' -o ${DIST_DIR}/${CLI_NAME} ./cmd .PHONY: release-cli release-cli: clean-debug image @@ -206,13 +207,12 @@ release-cli: clean-debug image docker cp tmp-argocd-linux:/usr/local/bin/argocd ${DIST_DIR}/argocd-linux-amd64 docker cp tmp-argocd-linux:/usr/local/bin/argocd-darwin-amd64 ${DIST_DIR}/argocd-darwin-amd64 docker cp tmp-argocd-linux:/usr/local/bin/argocd-windows-amd64.exe ${DIST_DIR}/argocd-windows-amd64.exe - docker cp tmp-argocd-linux:/usr/local/bin/argocd-util ${DIST_DIR}/argocd-util-linux-amd64 docker rm tmp-argocd-linux .PHONY: argocd-util argocd-util: clean-debug # Build argocd-util as a statically linked binary, so it could run within the alpine-based dex container (argoproj/argo-cd#844) - CGO_ENABLED=0 ${PACKR_CMD} build -v -i -ldflags '${LDFLAGS}' -o ${DIST_DIR}/${UTIL_CLI_NAME} ./cmd/argocd-util + CGO_ENABLED=0 ${PACKR_CMD} build -v -i -ldflags '${LDFLAGS}' -o ${DIST_DIR}/${UTIL_CLI_NAME} ./cmd # .PHONY: dev-tools-image # dev-tools-image: @@ -232,20 +232,24 @@ manifests-local: manifests: test-tools-image $(call run-in-test-client,make manifests-local IMAGE_NAMESPACE='${IMAGE_NAMESPACE}' IMAGE_TAG='${IMAGE_TAG}') +# consolidated binary for cli, util, server, repo-server, controller +.PHONY: argocd-all +argocd-all: clean-debug + CGO_ENABLED=0 ${PACKR_CMD} build -v -i -ldflags '${LDFLAGS}' -o ${DIST_DIR}/${BIN_NAME} ./cmd # NOTE: we use packr to do the build instead of go, since we embed swagger files and policy.csv # files into the go binary .PHONY: server server: clean-debug - CGO_ENABLED=0 ${PACKR_CMD} build -v -i -ldflags '${LDFLAGS}' -o ${DIST_DIR}/argocd-server ./cmd/argocd-server + CGO_ENABLED=0 ${PACKR_CMD} build -v -i -ldflags '${LDFLAGS}' -o ${DIST_DIR}/argocd-server ./cmd .PHONY: repo-server repo-server: - CGO_ENABLED=0 ${PACKR_CMD} build -v -i -ldflags '${LDFLAGS}' -o ${DIST_DIR}/argocd-repo-server ./cmd/argocd-repo-server + CGO_ENABLED=0 ${PACKR_CMD} build -v -i -ldflags '${LDFLAGS}' -o ${DIST_DIR}/argocd-repo-server ./cmd .PHONY: controller controller: - CGO_ENABLED=0 ${PACKR_CMD} build -v -i -ldflags '${LDFLAGS}' -o ${DIST_DIR}/argocd-application-controller ./cmd/argocd-application-controller + CGO_ENABLED=0 ${PACKR_CMD} build -v -i -ldflags '${LDFLAGS}' -o ${DIST_DIR}/argocd-application-controller ./cmd .PHONY: packr packr: @@ -260,15 +264,15 @@ IMAGE_TAG="dev-$(shell git describe --always --dirty)" image: packr docker build -t argocd-base --target argocd-base . docker build -t argocd-ui --target argocd-ui . - CGO_ENABLED=0 GOOS=linux GOARCH=amd64 dist/packr build -v -i -ldflags '${LDFLAGS}' -o ${DIST_DIR}/argocd-server ./cmd/argocd-server - CGO_ENABLED=0 GOOS=linux GOARCH=amd64 dist/packr build -v -i -ldflags '${LDFLAGS}' -o ${DIST_DIR}/argocd-application-controller ./cmd/argocd-application-controller - CGO_ENABLED=0 GOOS=linux GOARCH=amd64 dist/packr build -v -i -ldflags '${LDFLAGS}' -o ${DIST_DIR}/argocd-repo-server ./cmd/argocd-repo-server - CGO_ENABLED=0 GOOS=linux GOARCH=amd64 dist/packr build -v -i -ldflags '${LDFLAGS}' -o ${DIST_DIR}/argocd ./cmd/argocd - CGO_ENABLED=0 GOOS=darwin GOARCH=amd64 dist/packr build -v -i -ldflags '${LDFLAGS}' -o ${DIST_DIR}/argocd-darwin-amd64 ./cmd/argocd - CGO_ENABLED=0 GOOS=windows GOARCH=amd64 dist/packr build -v -i -ldflags '${LDFLAGS}' -o ${DIST_DIR}/argocd-windows-amd64.exe ./cmd/argocd - CGO_ENABLED=0 GOOS=linux GOARCH=amd64 dist/packr build -v -i -ldflags '${LDFLAGS}' -o ${DIST_DIR}/argocd-util ./cmd/argocd-util - CGO_ENABLED=0 GOOS=darwin GOARCH=amd64 dist/packr build -v -i -ldflags '${LDFLAGS}' -o ${DIST_DIR}/argocd-util-darwin-amd64 ./cmd/argocd-util - CGO_ENABLED=0 GOOS=windows GOARCH=amd64 dist/packr build -v -i -ldflags '${LDFLAGS}' -o ${DIST_DIR}/argocd-util-windows-amd64.exe ./cmd/argocd-util + CGO_ENABLED=0 GOOS=linux GOARCH=amd64 dist/packr build -v -i -ldflags '${LDFLAGS}' -o ${DIST_DIR}/argocd ./cmd + CGO_ENABLED=0 GOOS=darwin GOARCH=amd64 dist/packr build -v -i -ldflags '${LDFLAGS}' -o ${DIST_DIR}/argocd-darwin-amd64 ./cmd + CGO_ENABLED=0 GOOS=windows GOARCH=amd64 dist/packr build -v -i -ldflags '${LDFLAGS}' -o ${DIST_DIR}/argocd-windows-amd64.exe ./cmd + ln -s ${DIST_DIR}/argocd ${DIST_DIR}/argocd-util + ln -s ${DIST_DIR}/argocd ${DIST_DIR}/argocd-server + ln -s ${DIST_DIR}/argocd ${DIST_DIR}/argocd-application-controller + ln -s ${DIST_DIR}/argocd ${DIST_DIR}/argocd-repo-server + ln -s ${DIST_DIR}/argocd-darwin-amd64 ${DIST_DIR}/argocd-util-darwin-amd64 + ln -s ${DIST_DIR}/argocd-windows-amd64.exe ${DIST_DIR}/argocd-util-windows-amd64.exe cp Dockerfile.dev dist docker build -t $(IMAGE_PREFIX)argocd:$(IMAGE_TAG) -f dist/Dockerfile.dev dist else diff --git a/Procfile b/Procfile index 6ecbafbae330d..79eb5a86fd164 100644 --- a/Procfile +++ b/Procfile @@ -1,8 +1,8 @@ -controller: sh -c "FORCE_LOG_COLORS=1 ARGOCD_FAKE_IN_CLUSTER=true ARGOCD_TLS_DATA_PATH=${ARGOCD_TLS_DATA_PATH:-/tmp/argocd-local/tls} ARGOCD_SSH_DATA_PATH=${ARGOCD_SSH_DATA_PATH:-/tmp/argocd-local/ssh} go run ./cmd/argocd-application-controller/main.go --loglevel debug --redis localhost:${ARGOCD_E2E_REDIS_PORT:-6379} --repo-server localhost:${ARGOCD_E2E_REPOSERVER_PORT:-8081}" -api-server: sh -c "FORCE_LOG_COLORS=1 ARGOCD_FAKE_IN_CLUSTER=true ARGOCD_TLS_DATA_PATH=${ARGOCD_TLS_DATA_PATH:-/tmp/argocd-local/tls} ARGOCD_SSH_DATA_PATH=${ARGOCD_SSH_DATA_PATH:-/tmp/argocd-local/ssh} go run ./cmd/argocd-server/main.go --loglevel debug --redis localhost:${ARGOCD_E2E_REDIS_PORT:-6379} --disable-auth=${ARGOCD_E2E_DISABLE_AUTH:-'true'} --insecure --dex-server http://localhost:${ARGOCD_E2E_DEX_PORT:-5556} --repo-server localhost:${ARGOCD_E2E_REPOSERVER_PORT:-8081} --port ${ARGOCD_E2E_APISERVER_PORT:-8080} --staticassets ui/dist/app" -dex: sh -c "go run github.com/argoproj/argo-cd/cmd/argocd-util gendexcfg -o `pwd`/dist/dex.yaml && docker run --rm -p ${ARGOCD_E2E_DEX_PORT:-5556}:${ARGOCD_E2E_DEX_PORT:-5556} -v `pwd`/dist/dex.yaml:/dex.yaml ghcr.io/dexidp/dex:v2.27.0 serve /dex.yaml" +controller: sh -c "FORCE_LOG_COLORS=1 ARGOCD_FAKE_IN_CLUSTER=true ARGOCD_TLS_DATA_PATH=${ARGOCD_TLS_DATA_PATH:-/tmp/argocd-local/tls} ARGOCD_SSH_DATA_PATH=${ARGOCD_SSH_DATA_PATH:-/tmp/argocd-local/ssh} ARGOCD_BINARY_NAME=argocd-application-controller go run ./cmd/main.go --loglevel debug --redis localhost:${ARGOCD_E2E_REDIS_PORT:-6379} --repo-server localhost:${ARGOCD_E2E_REPOSERVER_PORT:-8081}" +api-server: sh -c "FORCE_LOG_COLORS=1 ARGOCD_FAKE_IN_CLUSTER=true ARGOCD_TLS_DATA_PATH=${ARGOCD_TLS_DATA_PATH:-/tmp/argocd-local/tls} ARGOCD_SSH_DATA_PATH=${ARGOCD_SSH_DATA_PATH:-/tmp/argocd-local/ssh} ARGOCD_BINARY_NAME=argocd-server go run ./cmd/main.go --loglevel debug --redis localhost:${ARGOCD_E2E_REDIS_PORT:-6379} --disable-auth=${ARGOCD_E2E_DISABLE_AUTH:-'true'} --insecure --dex-server http://localhost:${ARGOCD_E2E_DEX_PORT:-5556} --repo-server localhost:${ARGOCD_E2E_REPOSERVER_PORT:-8081} --port ${ARGOCD_E2E_APISERVER_PORT:-8080} --staticassets ui/dist/app" +dex: sh -c "ARGOCD_BINARY_NAME=argocd-dex go run github.com/argoproj/argo-cd/cmd gendexcfg -o `pwd`/dist/dex.yaml && docker run --rm -p ${ARGOCD_E2E_DEX_PORT:-5556}:${ARGOCD_E2E_DEX_PORT:-5556} -v `pwd`/dist/dex.yaml:/dex.yaml ghcr.io/dexidp/dex:v2.27.0 serve /dex.yaml" redis: docker run --rm --name argocd-redis -i -p ${ARGOCD_E2E_REDIS_PORT:-6379}:${ARGOCD_E2E_REDIS_PORT:-6379} redis:5.0.10-alpine --save "" --appendonly no --port ${ARGOCD_E2E_REDIS_PORT:-6379} -repo-server: sh -c "FORCE_LOG_COLORS=1 ARGOCD_FAKE_IN_CLUSTER=true ARGOCD_GNUPGHOME=${ARGOCD_GNUPGHOME:-/tmp/argocd-local/gpg/keys} ARGOCD_GPG_DATA_PATH=${ARGOCD_GPG_DATA_PATH:-/tmp/argocd-local/gpg/source} ARGOCD_TLS_DATA_PATH=${ARGOCD_TLS_DATA_PATH:-/tmp/argocd-local/tls} ARGOCD_SSH_DATA_PATH=${ARGOCD_SSH_DATA_PATH:-/tmp/argocd-local/ssh} go run ./cmd/argocd-repo-server/main.go --loglevel debug --port ${ARGOCD_E2E_REPOSERVER_PORT:-8081} --redis localhost:${ARGOCD_E2E_REDIS_PORT:-6379}" +repo-server: sh -c "FORCE_LOG_COLORS=1 ARGOCD_FAKE_IN_CLUSTER=true ARGOCD_GNUPGHOME=${ARGOCD_GNUPGHOME:-/tmp/argocd-local/gpg/keys} ARGOCD_GPG_DATA_PATH=${ARGOCD_GPG_DATA_PATH:-/tmp/argocd-local/gpg/source} ARGOCD_TLS_DATA_PATH=${ARGOCD_TLS_DATA_PATH:-/tmp/argocd-local/tls} ARGOCD_SSH_DATA_PATH=${ARGOCD_SSH_DATA_PATH:-/tmp/argocd-local/ssh} ARGOCD_BINARY_NAME=argocd-repo-server go run ./cmd/main.go --loglevel debug --port ${ARGOCD_E2E_REPOSERVER_PORT:-8081} --redis localhost:${ARGOCD_E2E_REDIS_PORT:-6379}" ui: sh -c 'cd ui && ${ARGOCD_E2E_YARN_CMD:-yarn} start' git-server: test/fixture/testrepos/start-git.sh dev-mounter: [[ "$ARGOCD_E2E_TEST" != "true" ]] && go run hack/dev-mounter/main.go --configmap argocd-ssh-known-hosts-cm=${ARGOCD_SSH_DATA_PATH:-/tmp/argocd-local/ssh} --configmap argocd-tls-certs-cm=${ARGOCD_TLS_DATA_PATH:-/tmp/argocd-local/tls} --configmap argocd-gpg-keys-cm=${ARGOCD_GPG_DATA_PATH:-/tmp/argocd-local/gpg/source} diff --git a/cmd/argocd-application-controller/commands/argocd_application_controller.go b/cmd/argocd-application-controller/commands/argocd_application_controller.go index 3fdecfb3dee86..3f2d8c25c3bd5 100644 --- a/cmd/argocd-application-controller/commands/argocd_application_controller.go +++ b/cmd/argocd-application-controller/commands/argocd_application_controller.go @@ -12,6 +12,7 @@ import ( "k8s.io/client-go/kubernetes" "k8s.io/client-go/tools/clientcmd" + cmdutil "github.com/argoproj/argo-cd/cmd/util" "github.com/argoproj/argo-cd/common" "github.com/argoproj/argo-cd/controller" "github.com/argoproj/argo-cd/controller/sharding" @@ -43,8 +44,6 @@ func NewCommand() *cobra.Command { selfHealTimeoutSeconds int statusProcessors int operationProcessors int - logFormat string - logLevel string glogLevel int metricsPort int kubectlParallelismLimit int64 @@ -57,8 +56,8 @@ func NewCommand() *cobra.Command { Long: "ArgoCD application controller is a Kubernetes controller that continuously monitors running applications and compares the current, live state against the desired target state (as specified in the repo). This command runs Application Controller in the foreground. It can be configured by following options.", DisableAutoGenTag: true, RunE: func(c *cobra.Command, args []string) error { - cli.SetLogFormat(logFormat) - cli.SetLogLevel(logLevel) + cli.SetLogFormat(cmdutil.LogFormat) + cli.SetLogLevel(cmdutil.LogLevel) cli.SetGLogLevel(glogLevel) config, err := clientConfig.ClientConfig() @@ -117,8 +116,8 @@ func NewCommand() *cobra.Command { command.Flags().IntVar(&repoServerTimeoutSeconds, "repo-server-timeout-seconds", 60, "Repo server RPC call timeout seconds.") command.Flags().IntVar(&statusProcessors, "status-processors", 1, "Number of application status processors") command.Flags().IntVar(&operationProcessors, "operation-processors", 1, "Number of application operation processors") - command.Flags().StringVar(&logFormat, "logformat", "text", "Set the logging format. One of: text|json") - command.Flags().StringVar(&logLevel, "loglevel", "info", "Set the logging level. One of: debug|info|warn|error") + command.Flags().StringVar(&cmdutil.LogFormat, "logformat", "text", "Set the logging format. One of: text|json") + command.Flags().StringVar(&cmdutil.LogLevel, "loglevel", "info", "Set the logging level. One of: debug|info|warn|error") command.Flags().IntVar(&glogLevel, "gloglevel", 0, "Set the glog logging level") command.Flags().IntVar(&metricsPort, "metrics-port", common.DefaultPortArgoCDMetrics, "Start metrics server on given port") command.Flags().IntVar(&selfHealTimeoutSeconds, "self-heal-timeout-seconds", 5, "Specifies timeout between application self heal attempts") diff --git a/cmd/argocd-application-controller/main.go b/cmd/argocd-application-controller/main.go deleted file mode 100644 index 0f8fd41fdb96b..0000000000000 --- a/cmd/argocd-application-controller/main.go +++ /dev/null @@ -1,22 +0,0 @@ -package main - -import ( - "fmt" - "os" - - // load the gcp plugin (required to authenticate against GKE clusters). - _ "k8s.io/client-go/plugin/pkg/client/auth/gcp" - // load the oidc plugin (required to authenticate with OpenID Connect). - _ "k8s.io/client-go/plugin/pkg/client/auth/oidc" - // load the azure plugin (required to authenticate with AKS clusters). - _ "k8s.io/client-go/plugin/pkg/client/auth/azure" - - "github.com/argoproj/argo-cd/cmd/argocd-application-controller/commands" -) - -func main() { - if err := commands.NewCommand().Execute(); err != nil { - fmt.Println(err) - os.Exit(1) - } -} diff --git a/cmd/argocd-dex/commands/argocd_dex.go b/cmd/argocd-dex/commands/argocd_dex.go new file mode 100644 index 0000000000000..0aa84b20d7b67 --- /dev/null +++ b/cmd/argocd-dex/commands/argocd_dex.go @@ -0,0 +1,202 @@ +package commands + +import ( + "context" + "fmt" + "io/ioutil" + "os" + "os/exec" + "syscall" + + "github.com/ghodss/yaml" + log "github.com/sirupsen/logrus" + "github.com/spf13/cobra" + "k8s.io/client-go/kubernetes" + "k8s.io/client-go/tools/clientcmd" + + cmdutil "github.com/argoproj/argo-cd/cmd/util" + "github.com/argoproj/argo-cd/util/cli" + "github.com/argoproj/argo-cd/util/dex" + "github.com/argoproj/argo-cd/util/errors" + "github.com/argoproj/argo-cd/util/settings" +) + +const ( + cliName = "argocd-dex" +) + +func NewCommand() *cobra.Command { + var command = &cobra.Command{ + Use: cliName, + Short: "argocd-util tools used by Argo CD", + Long: "argocd-util has internal utility tools used by Argo CD", + DisableAutoGenTag: true, + Run: func(c *cobra.Command, args []string) { + c.HelpFunc()(c, args) + }, + } + + command.AddCommand(NewRunDexCommand()) + command.AddCommand(NewGenDexConfigCommand()) + + command.Flags().StringVar(&cmdutil.LogFormat, "logformat", "text", "Set the logging format. One of: text|json") + command.Flags().StringVar(&cmdutil.LogLevel, "loglevel", "info", "Set the logging level. One of: debug|info|warn|error") + return command +} + +func NewRunDexCommand() *cobra.Command { + var ( + clientConfig clientcmd.ClientConfig + ) + var command = cobra.Command{ + Use: "rundex", + Short: "Runs dex generating a config using settings from the Argo CD configmap and secret", + RunE: func(c *cobra.Command, args []string) error { + _, err := exec.LookPath("dex") + errors.CheckError(err) + config, err := clientConfig.ClientConfig() + errors.CheckError(err) + namespace, _, err := clientConfig.Namespace() + errors.CheckError(err) + kubeClientset := kubernetes.NewForConfigOrDie(config) + settingsMgr := settings.NewSettingsManager(context.Background(), kubeClientset, namespace) + prevSettings, err := settingsMgr.GetSettings() + errors.CheckError(err) + updateCh := make(chan *settings.ArgoCDSettings, 1) + settingsMgr.Subscribe(updateCh) + + for { + var cmd *exec.Cmd + dexCfgBytes, err := dex.GenerateDexConfigYAML(prevSettings) + errors.CheckError(err) + if len(dexCfgBytes) == 0 { + log.Infof("dex is not configured") + } else { + err = ioutil.WriteFile("/tmp/dex.yaml", dexCfgBytes, 0644) + errors.CheckError(err) + log.Debug(redactor(string(dexCfgBytes))) + cmd = exec.Command("dex", "serve", "/tmp/dex.yaml") + cmd.Stdout = os.Stdout + cmd.Stderr = os.Stderr + err = cmd.Start() + errors.CheckError(err) + } + + // loop until the dex config changes + for { + newSettings := <-updateCh + newDexCfgBytes, err := dex.GenerateDexConfigYAML(newSettings) + errors.CheckError(err) + if string(newDexCfgBytes) != string(dexCfgBytes) { + prevSettings = newSettings + log.Infof("dex config modified. restarting dex") + if cmd != nil && cmd.Process != nil { + err = cmd.Process.Signal(syscall.SIGTERM) + errors.CheckError(err) + _, err = cmd.Process.Wait() + errors.CheckError(err) + } + break + } else { + log.Infof("dex config unmodified") + } + } + } + }, + } + + clientConfig = cli.AddKubectlFlagsToCmd(&command) + return &command +} + +func NewGenDexConfigCommand() *cobra.Command { + var ( + clientConfig clientcmd.ClientConfig + out string + ) + var command = cobra.Command{ + Use: "gendexcfg", + Short: "Generates a dex config from Argo CD settings", + RunE: func(c *cobra.Command, args []string) error { + config, err := clientConfig.ClientConfig() + errors.CheckError(err) + namespace, _, err := clientConfig.Namespace() + errors.CheckError(err) + kubeClientset := kubernetes.NewForConfigOrDie(config) + settingsMgr := settings.NewSettingsManager(context.Background(), kubeClientset, namespace) + settings, err := settingsMgr.GetSettings() + errors.CheckError(err) + dexCfgBytes, err := dex.GenerateDexConfigYAML(settings) + errors.CheckError(err) + if len(dexCfgBytes) == 0 { + log.Infof("dex is not configured") + return nil + } + if out == "" { + dexCfg := make(map[string]interface{}) + err := yaml.Unmarshal(dexCfgBytes, &dexCfg) + errors.CheckError(err) + if staticClientsInterface, ok := dexCfg["staticClients"]; ok { + if staticClients, ok := staticClientsInterface.([]interface{}); ok { + for i := range staticClients { + staticClient := staticClients[i] + if mappings, ok := staticClient.(map[string]interface{}); ok { + for key := range mappings { + if key == "secret" { + mappings[key] = "******" + } + } + staticClients[i] = mappings + } + } + dexCfg["staticClients"] = staticClients + } + } + errors.CheckError(err) + maskedDexCfgBytes, err := yaml.Marshal(dexCfg) + errors.CheckError(err) + fmt.Print(string(maskedDexCfgBytes)) + } else { + err = ioutil.WriteFile(out, dexCfgBytes, 0644) + errors.CheckError(err) + } + return nil + }, + } + + clientConfig = cli.AddKubectlFlagsToCmd(&command) + command.Flags().StringVarP(&out, "out", "o", "", "Output to the specified file instead of stdout") + return &command +} + +func iterateStringFields(obj interface{}, callback func(name string, val string) string) { + if mapField, ok := obj.(map[string]interface{}); ok { + for field, val := range mapField { + if strVal, ok := val.(string); ok { + mapField[field] = callback(field, strVal) + } else { + iterateStringFields(val, callback) + } + } + } else if arrayField, ok := obj.([]interface{}); ok { + for i := range arrayField { + iterateStringFields(arrayField[i], callback) + } + } +} + +func redactor(dirtyString string) string { + config := make(map[string]interface{}) + err := yaml.Unmarshal([]byte(dirtyString), &config) + errors.CheckError(err) + iterateStringFields(config, func(name string, val string) string { + if name == "clientSecret" || name == "secret" || name == "bindPW" { + return "********" + } else { + return val + } + }) + data, err := yaml.Marshal(config) + errors.CheckError(err) + return string(data) +} diff --git a/cmd/argocd-repo-server/commands/argocd_repo_server.go b/cmd/argocd-repo-server/commands/argocd_repo_server.go index b1a644c6a44f9..208e018d60f60 100644 --- a/cmd/argocd-repo-server/commands/argocd_repo_server.go +++ b/cmd/argocd-repo-server/commands/argocd_repo_server.go @@ -14,6 +14,7 @@ import ( "github.com/spf13/cobra" "google.golang.org/grpc/health/grpc_health_v1" + cmdutil "github.com/argoproj/argo-cd/cmd/util" "github.com/argoproj/argo-cd/common" "github.com/argoproj/argo-cd/reposerver" "github.com/argoproj/argo-cd/reposerver/apiclient" @@ -62,8 +63,6 @@ func getPauseGenerationOnFailureForRequests() int { func NewCommand() *cobra.Command { var ( - logFormat string - logLevel string parallelismLimit int64 listenPort int metricsPort int @@ -77,8 +76,8 @@ func NewCommand() *cobra.Command { Long: "ArgoCD Repository Server is an internal service which maintains a local cache of the Git repository holding the application manifests, and is responsible for generating and returning the Kubernetes manifests. This command runs Repository Server in the foreground. It can be configured by following options.", DisableAutoGenTag: true, RunE: func(c *cobra.Command, args []string) error { - cli.SetLogFormat(logFormat) - cli.SetLogLevel(logLevel) + cli.SetLogFormat(cmdutil.LogFormat) + cli.SetLogLevel(cmdutil.LogLevel) tlsConfigCustomizer, err := tlsConfigCustomizerSrc() errors.CheckError(err) @@ -148,8 +147,8 @@ func NewCommand() *cobra.Command { }, } - command.Flags().StringVar(&logFormat, "logformat", "text", "Set the logging format. One of: text|json") - command.Flags().StringVar(&logLevel, "loglevel", "info", "Set the logging level. One of: debug|info|warn|error") + command.Flags().StringVar(&cmdutil.LogFormat, "logformat", "text", "Set the logging format. One of: text|json") + command.Flags().StringVar(&cmdutil.LogLevel, "loglevel", "info", "Set the logging level. One of: debug|info|warn|error") command.Flags().Int64Var(¶llelismLimit, "parallelismlimit", 0, "Limit on number of concurrent manifests generate requests. Any value less the 1 means no limit.") command.Flags().IntVar(&listenPort, "port", common.DefaultPortRepoServer, "Listen on given port for incoming connections") command.Flags().IntVar(&metricsPort, "metrics-port", common.DefaultPortRepoServerMetrics, "Start metrics server on given port") diff --git a/cmd/argocd-repo-server/main.go b/cmd/argocd-repo-server/main.go deleted file mode 100644 index 3b28b3545a933..0000000000000 --- a/cmd/argocd-repo-server/main.go +++ /dev/null @@ -1,15 +0,0 @@ -package main - -import ( - "fmt" - "os" - - "github.com/argoproj/argo-cd/cmd/argocd-repo-server/commands" -) - -func main() { - if err := commands.NewCommand().Execute(); err != nil { - fmt.Println(err) - os.Exit(1) - } -} diff --git a/cmd/argocd-server/commands/argocd_server.go b/cmd/argocd-server/commands/argocd_server.go index 76977f7533daf..a48e0a5976296 100644 --- a/cmd/argocd-server/commands/argocd_server.go +++ b/cmd/argocd-server/commands/argocd_server.go @@ -11,6 +11,7 @@ import ( "k8s.io/client-go/kubernetes" "k8s.io/client-go/tools/clientcmd" + cmdutil "github.com/argoproj/argo-cd/cmd/util" "github.com/argoproj/argo-cd/common" "github.com/argoproj/argo-cd/pkg/apis/application/v1alpha1" appclientset "github.com/argoproj/argo-cd/pkg/client/clientset/versioned" @@ -46,8 +47,6 @@ func NewCommand() *cobra.Command { insecure bool listenPort int metricsPort int - logFormat string - logLevel string glogLevel int clientConfig clientcmd.ClientConfig repoServerTimeoutSeconds int @@ -68,8 +67,8 @@ func NewCommand() *cobra.Command { Long: "The API server is a gRPC/REST server which exposes the API consumed by the Web UI, CLI, and CI/CD systems. This command runs API server in the foreground. It can be configured by following options.", DisableAutoGenTag: true, Run: func(c *cobra.Command, args []string) { - cli.SetLogFormat(logFormat) - cli.SetLogLevel(logLevel) + cli.SetLogFormat(cmdutil.LogFormat) + cli.SetLogLevel(cmdutil.LogLevel) cli.SetGLogLevel(glogLevel) config, err := clientConfig.ClientConfig() @@ -142,8 +141,8 @@ func NewCommand() *cobra.Command { command.Flags().StringVar(&staticAssetsDir, "staticassets", "", "Static assets directory path") command.Flags().StringVar(&baseHRef, "basehref", "/", "Value for base href in index.html. Used if Argo CD is running behind reverse proxy under subpath different from /") command.Flags().StringVar(&rootPath, "rootpath", "", "Used if Argo CD is running behind reverse proxy under subpath different from /") - command.Flags().StringVar(&logFormat, "logformat", "text", "Set the logging format. One of: text|json") - command.Flags().StringVar(&logLevel, "loglevel", "info", "Set the logging level. One of: debug|info|warn|error") + command.Flags().StringVar(&cmdutil.LogFormat, "logformat", "text", "Set the logging format. One of: text|json") + command.Flags().StringVar(&cmdutil.LogLevel, "loglevel", "info", "Set the logging level. One of: debug|info|warn|error") command.Flags().IntVar(&glogLevel, "gloglevel", 0, "Set the glog logging level") command.Flags().StringVar(&repoServerAddress, "repo-server", common.DefaultRepoServerAddr, "Repo server address") command.Flags().StringVar(&dexServerAddress, "dex-server", common.DefaultDexServerAddr, "Dex server address") diff --git a/cmd/argocd-server/main.go b/cmd/argocd-server/main.go deleted file mode 100644 index 0f747842c7951..0000000000000 --- a/cmd/argocd-server/main.go +++ /dev/null @@ -1,18 +0,0 @@ -package main - -import ( - commands "github.com/argoproj/argo-cd/cmd/argocd-server/commands" - "github.com/argoproj/argo-cd/util/errors" - - // load the gcp plugin (required to authenticate against GKE clusters). - _ "k8s.io/client-go/plugin/pkg/client/auth/gcp" - // load the oidc plugin (required to authenticate with OpenID Connect). - _ "k8s.io/client-go/plugin/pkg/client/auth/oidc" - // load the azure plugin (required to authenticate with AKS clusters). - _ "k8s.io/client-go/plugin/pkg/client/auth/azure" -) - -func main() { - err := commands.NewCommand().Execute() - errors.CheckError(err) -} diff --git a/cmd/argocd-util/commands/argocd_util.go b/cmd/argocd-util/commands/argocd_util.go index c8dcc9c04404c..9b723afe50c92 100644 --- a/cmd/argocd-util/commands/argocd_util.go +++ b/cmd/argocd-util/commands/argocd_util.go @@ -7,9 +7,7 @@ import ( "io" "io/ioutil" "os" - "os/exec" "reflect" - "syscall" "github.com/argoproj/gitops-engine/pkg/utils/kube" "github.com/ghodss/yaml" @@ -25,10 +23,10 @@ import ( "k8s.io/client-go/rest" "k8s.io/client-go/tools/clientcmd" + cmdutil "github.com/argoproj/argo-cd/cmd/util" "github.com/argoproj/argo-cd/common" "github.com/argoproj/argo-cd/util/cli" "github.com/argoproj/argo-cd/util/db" - "github.com/argoproj/argo-cd/util/dex" "github.com/argoproj/argo-cd/util/errors" "github.com/argoproj/argo-cd/util/settings" ) @@ -50,9 +48,7 @@ var ( // NewCommand returns a new instance of an argocd command func NewCommand() *cobra.Command { var ( - logFormat string - logLevel string - pathOpts = clientcmd.NewDefaultPathOptions() + pathOpts = clientcmd.NewDefaultPathOptions() ) var command = &cobra.Command{ @@ -66,8 +62,6 @@ func NewCommand() *cobra.Command { } command.AddCommand(cli.NewVersionCmd(cliName)) - command.AddCommand(NewRunDexCommand()) - command.AddCommand(NewGenDexConfigCommand()) command.AddCommand(NewImportCommand()) command.AddCommand(NewExportCommand()) command.AddCommand(NewClusterConfig()) @@ -77,136 +71,11 @@ func NewCommand() *cobra.Command { command.AddCommand(NewRBACCommand()) command.AddCommand(NewGenerateConfigCommand(pathOpts)) - command.Flags().StringVar(&logFormat, "logformat", "text", "Set the logging format. One of: text|json") - command.Flags().StringVar(&logLevel, "loglevel", "info", "Set the logging level. One of: debug|info|warn|error") + command.Flags().StringVar(&cmdutil.LogFormat, "logformat", "text", "Set the logging format. One of: text|json") + command.Flags().StringVar(&cmdutil.LogLevel, "loglevel", "info", "Set the logging level. One of: debug|info|warn|error") return command } -func NewRunDexCommand() *cobra.Command { - var ( - clientConfig clientcmd.ClientConfig - ) - var command = cobra.Command{ - Use: "rundex", - Short: "Runs dex generating a config using settings from the Argo CD configmap and secret", - RunE: func(c *cobra.Command, args []string) error { - _, err := exec.LookPath("dex") - errors.CheckError(err) - config, err := clientConfig.ClientConfig() - errors.CheckError(err) - namespace, _, err := clientConfig.Namespace() - errors.CheckError(err) - kubeClientset := kubernetes.NewForConfigOrDie(config) - settingsMgr := settings.NewSettingsManager(context.Background(), kubeClientset, namespace) - prevSettings, err := settingsMgr.GetSettings() - errors.CheckError(err) - updateCh := make(chan *settings.ArgoCDSettings, 1) - settingsMgr.Subscribe(updateCh) - - for { - var cmd *exec.Cmd - dexCfgBytes, err := dex.GenerateDexConfigYAML(prevSettings) - errors.CheckError(err) - if len(dexCfgBytes) == 0 { - log.Infof("dex is not configured") - } else { - err = ioutil.WriteFile("/tmp/dex.yaml", dexCfgBytes, 0644) - errors.CheckError(err) - log.Debug(redactor(string(dexCfgBytes))) - cmd = exec.Command("dex", "serve", "/tmp/dex.yaml") - cmd.Stdout = os.Stdout - cmd.Stderr = os.Stderr - err = cmd.Start() - errors.CheckError(err) - } - - // loop until the dex config changes - for { - newSettings := <-updateCh - newDexCfgBytes, err := dex.GenerateDexConfigYAML(newSettings) - errors.CheckError(err) - if string(newDexCfgBytes) != string(dexCfgBytes) { - prevSettings = newSettings - log.Infof("dex config modified. restarting dex") - if cmd != nil && cmd.Process != nil { - err = cmd.Process.Signal(syscall.SIGTERM) - errors.CheckError(err) - _, err = cmd.Process.Wait() - errors.CheckError(err) - } - break - } else { - log.Infof("dex config unmodified") - } - } - } - }, - } - - clientConfig = cli.AddKubectlFlagsToCmd(&command) - return &command -} - -func NewGenDexConfigCommand() *cobra.Command { - var ( - clientConfig clientcmd.ClientConfig - out string - ) - var command = cobra.Command{ - Use: "gendexcfg", - Short: "Generates a dex config from Argo CD settings", - RunE: func(c *cobra.Command, args []string) error { - config, err := clientConfig.ClientConfig() - errors.CheckError(err) - namespace, _, err := clientConfig.Namespace() - errors.CheckError(err) - kubeClientset := kubernetes.NewForConfigOrDie(config) - settingsMgr := settings.NewSettingsManager(context.Background(), kubeClientset, namespace) - settings, err := settingsMgr.GetSettings() - errors.CheckError(err) - dexCfgBytes, err := dex.GenerateDexConfigYAML(settings) - errors.CheckError(err) - if len(dexCfgBytes) == 0 { - log.Infof("dex is not configured") - return nil - } - if out == "" { - dexCfg := make(map[string]interface{}) - err := yaml.Unmarshal(dexCfgBytes, &dexCfg) - errors.CheckError(err) - if staticClientsInterface, ok := dexCfg["staticClients"]; ok { - if staticClients, ok := staticClientsInterface.([]interface{}); ok { - for i := range staticClients { - staticClient := staticClients[i] - if mappings, ok := staticClient.(map[string]interface{}); ok { - for key := range mappings { - if key == "secret" { - mappings[key] = "******" - } - } - staticClients[i] = mappings - } - } - dexCfg["staticClients"] = staticClients - } - } - errors.CheckError(err) - maskedDexCfgBytes, err := yaml.Marshal(dexCfg) - errors.CheckError(err) - fmt.Print(string(maskedDexCfgBytes)) - } else { - err = ioutil.WriteFile(out, dexCfgBytes, 0644) - errors.CheckError(err) - } - return nil - }, - } - - clientConfig = cli.AddKubectlFlagsToCmd(&command) - command.Flags().StringVarP(&out, "out", "o", "", "Output to the specified file instead of stdout") - return &command -} - // NewImportCommand defines a new command for exporting Kubernetes and Argo CD resources. func NewImportCommand() *cobra.Command { var ( diff --git a/cmd/argocd-util/main.go b/cmd/argocd-util/main.go deleted file mode 100644 index 0c87cabb0ef1c..0000000000000 --- a/cmd/argocd-util/main.go +++ /dev/null @@ -1,22 +0,0 @@ -package main - -import ( - "fmt" - "os" - - "github.com/argoproj/argo-cd/cmd/argocd-util/commands" - - // load the gcp plugin (required to authenticate against GKE clusters). - _ "k8s.io/client-go/plugin/pkg/client/auth/gcp" - // load the oidc plugin (required to authenticate with OpenID Connect). - _ "k8s.io/client-go/plugin/pkg/client/auth/oidc" - // load the azure plugin (required to authenticate with AKS clusters). - _ "k8s.io/client-go/plugin/pkg/client/auth/azure" -) - -func main() { - if err := commands.NewCommand().Execute(); err != nil { - fmt.Println(err) - os.Exit(1) - } -} diff --git a/cmd/argocd/commands/root.go b/cmd/argocd/commands/root.go index 0b33a5e739c9d..a6a2306f243b7 100644 --- a/cmd/argocd/commands/root.go +++ b/cmd/argocd/commands/root.go @@ -4,6 +4,7 @@ import ( "github.com/spf13/cobra" "k8s.io/client-go/tools/clientcmd" + cmdutil "github.com/argoproj/argo-cd/cmd/util" argocdclient "github.com/argoproj/argo-cd/pkg/apiclient" "github.com/argoproj/argo-cd/util/cli" "github.com/argoproj/argo-cd/util/config" @@ -15,14 +16,9 @@ func init() { cobra.OnInitialize(initConfig) } -var ( - logFormat string - logLevel string -) - func initConfig() { - cli.SetLogFormat(logFormat) - cli.SetLogLevel(logLevel) + cli.SetLogFormat(cmdutil.LogFormat) + cli.SetLogLevel(cmdutil.LogLevel) } // NewCommand returns a new instance of an argocd command @@ -68,8 +64,8 @@ func NewCommand() *cobra.Command { command.PersistentFlags().StringVar(&clientOpts.AuthToken, "auth-token", config.GetFlag("auth-token", ""), "Authentication token") command.PersistentFlags().BoolVar(&clientOpts.GRPCWeb, "grpc-web", config.GetBoolFlag("grpc-web"), "Enables gRPC-web protocol. Useful if Argo CD server is behind proxy which does not support HTTP2.") command.PersistentFlags().StringVar(&clientOpts.GRPCWebRootPath, "grpc-web-root-path", config.GetFlag("grpc-web-root-path", ""), "Enables gRPC-web protocol. Useful if Argo CD server is behind proxy which does not support HTTP2. Set web root.") - command.PersistentFlags().StringVar(&logFormat, "logformat", config.GetFlag("logformat", "text"), "Set the logging format. One of: text|json") - command.PersistentFlags().StringVar(&logLevel, "loglevel", config.GetFlag("loglevel", "info"), "Set the logging level. One of: debug|info|warn|error") + command.PersistentFlags().StringVar(&cmdutil.LogFormat, "logformat", config.GetFlag("logformat", "text"), "Set the logging format. One of: text|json") + command.PersistentFlags().StringVar(&cmdutil.LogLevel, "loglevel", config.GetFlag("loglevel", "info"), "Set the logging level. One of: debug|info|warn|error") command.PersistentFlags().StringSliceVarP(&clientOpts.Headers, "header", "H", []string{}, "Sets additional header to all requests made by Argo CD CLI. (Can be repeated multiple times to add multiple headers, also supports comma separated headers)") command.PersistentFlags().BoolVar(&clientOpts.PortForward, "port-forward", config.GetBoolFlag("port-forward"), "Connect to a random argocd-server port using port forwarding") command.PersistentFlags().StringVar(&clientOpts.PortForwardNamespace, "port-forward-namespace", config.GetFlag("port-forward-namespace", ""), "Namespace name which should be used for port forwarding") diff --git a/cmd/argocd/main.go b/cmd/argocd/main.go deleted file mode 100644 index 5e1e67133a062..0000000000000 --- a/cmd/argocd/main.go +++ /dev/null @@ -1,18 +0,0 @@ -package main - -import ( - commands "github.com/argoproj/argo-cd/cmd/argocd/commands" - "github.com/argoproj/argo-cd/util/errors" - - // load the gcp plugin (required to authenticate against GKE clusters). - _ "k8s.io/client-go/plugin/pkg/client/auth/gcp" - // load the oidc plugin (required to authenticate with OpenID Connect). - _ "k8s.io/client-go/plugin/pkg/client/auth/oidc" - // load the azure plugin (required to authenticate with AKS clusters). - _ "k8s.io/client-go/plugin/pkg/client/auth/azure" -) - -func main() { - err := commands.NewCommand().Execute() - errors.CheckError(err) -} diff --git a/cmd/main.go b/cmd/main.go new file mode 100644 index 0000000000000..ac6bcfa5e1af3 --- /dev/null +++ b/cmd/main.go @@ -0,0 +1,64 @@ +package main + +import ( + "fmt" + "os" + "path/filepath" + + "github.com/spf13/cobra" + + appcontroller "github.com/argoproj/argo-cd/cmd/argocd-application-controller/commands" + dex "github.com/argoproj/argo-cd/cmd/argocd-dex/commands" + reposerver "github.com/argoproj/argo-cd/cmd/argocd-repo-server/commands" + apiserver "github.com/argoproj/argo-cd/cmd/argocd-server/commands" + util "github.com/argoproj/argo-cd/cmd/argocd-util/commands" + cli "github.com/argoproj/argo-cd/cmd/argocd/commands" +) + +const ( + binaryNameEnv = "ARGOCD_BINARY_NAME" +) + +func main() { + var command *cobra.Command + + binaryName := filepath.Base(os.Args[0]) + if val := os.Getenv(binaryNameEnv); val != "" { + binaryName = val + } + switch binaryName { + case "argocd", "argocd-linux-amd64", "argocd-darwin-amd64", "argocd-windows-amd64.exe": + command = cli.NewCommand() + case "argocd-util", "argocd-util-linux-amd64", "argocd-util-darwin-amd64", "argocd-util-windows-amd64.exe": + command = util.NewCommand() + case "argocd-server": + command = apiserver.NewCommand() + case "argocd-application-controller": + command = appcontroller.NewCommand() + case "argocd-repo-server": + command = reposerver.NewCommand() + case "argocd-dex": + command = dex.NewCommand() + default: + if len(os.Args[1:]) > 0 { + // trying to guess between argocd and argocd-util by matching sub command + for _, cmd := range []*cobra.Command{cli.NewCommand(), util.NewCommand()} { + if _, _, err := cmd.Find(os.Args[1:]); err == nil { + command = cmd + break + } + } + } + + if command == nil { + fmt.Printf("Unknown binary name '%s'.Use '%s' environment variable to specify required binary name "+ + "(possible values 'argocd' or 'argocd-util').\n", binaryName, binaryNameEnv) + os.Exit(1) + } + } + + if err := command.Execute(); err != nil { + fmt.Println(err) + os.Exit(1) + } +} diff --git a/cmd/util/common.go b/cmd/util/common.go index f2d11174abfd4..e71ec26258d69 100644 --- a/cmd/util/common.go +++ b/cmd/util/common.go @@ -10,6 +10,11 @@ import ( "github.com/argoproj/gitops-engine/pkg/utils/kube" ) +var ( + LogFormat string + LogLevel string +) + // PrintResource prints a single resource in YAML or JSON format to stdout according to the output format func PrintResources(resources []interface{}, output string) error { for i, resource := range resources { diff --git a/docs/operator-manual/server-commands/argocd-dex.md b/docs/operator-manual/server-commands/argocd-dex.md new file mode 100644 index 0000000000000..d1289db35e0c2 --- /dev/null +++ b/docs/operator-manual/server-commands/argocd-dex.md @@ -0,0 +1,25 @@ +## argocd-dex + +argocd-util tools used by Argo CD + +### Synopsis + +argocd-util has internal utility tools used by Argo CD + +``` +argocd-dex [flags] +``` + +### Options + +``` + -h, --help help for argocd-dex + --logformat string Set the logging format. One of: text|json (default "text") + --loglevel string Set the logging level. One of: debug|info|warn|error (default "info") +``` + +### SEE ALSO + +* [argocd-dex gendexcfg](argocd-dex_gendexcfg.md) - Generates a dex config from Argo CD settings +* [argocd-dex rundex](argocd-dex_rundex.md) - Runs dex generating a config using settings from the Argo CD configmap and secret + diff --git a/docs/operator-manual/server-commands/argocd-dex_gendexcfg.md b/docs/operator-manual/server-commands/argocd-dex_gendexcfg.md new file mode 100644 index 0000000000000..929bf5c429f4e --- /dev/null +++ b/docs/operator-manual/server-commands/argocd-dex_gendexcfg.md @@ -0,0 +1,36 @@ +## argocd-dex gendexcfg + +Generates a dex config from Argo CD settings + +``` +argocd-dex gendexcfg [flags] +``` + +### Options + +``` + --as string Username to impersonate for the operation + --as-group stringArray Group to impersonate for the operation, this flag can be repeated to specify multiple groups. + --certificate-authority string Path to a cert file for the certificate authority + --client-certificate string Path to a client certificate file for TLS + --client-key string Path to a client key file for TLS + --cluster string The name of the kubeconfig cluster to use + --context string The name of the kubeconfig context to use + -h, --help help for gendexcfg + --insecure-skip-tls-verify If true, the server's certificate will not be checked for validity. This will make your HTTPS connections insecure + --kubeconfig string Path to a kube config. Only required if out-of-cluster + -n, --namespace string If present, the namespace scope for this CLI request + -o, --out string Output to the specified file instead of stdout + --password string Password for basic authentication to the API server + --request-timeout string The length of time to wait before giving up on a single server request. Non-zero values should contain a corresponding time unit (e.g. 1s, 2m, 3h). A value of zero means don't timeout requests. (default "0") + --server string The address and port of the Kubernetes API server + --tls-server-name string If provided, this name will be used to validate server certificate. If this is not provided, hostname used to contact the server is used. + --token string Bearer token for authentication to the API server + --user string The name of the kubeconfig user to use + --username string Username for basic authentication to the API server +``` + +### SEE ALSO + +* [argocd-dex](argocd-dex.md) - argocd-util tools used by Argo CD + diff --git a/docs/operator-manual/server-commands/argocd-dex_rundex.md b/docs/operator-manual/server-commands/argocd-dex_rundex.md new file mode 100644 index 0000000000000..7f9871ebaad4e --- /dev/null +++ b/docs/operator-manual/server-commands/argocd-dex_rundex.md @@ -0,0 +1,35 @@ +## argocd-dex rundex + +Runs dex generating a config using settings from the Argo CD configmap and secret + +``` +argocd-dex rundex [flags] +``` + +### Options + +``` + --as string Username to impersonate for the operation + --as-group stringArray Group to impersonate for the operation, this flag can be repeated to specify multiple groups. + --certificate-authority string Path to a cert file for the certificate authority + --client-certificate string Path to a client certificate file for TLS + --client-key string Path to a client key file for TLS + --cluster string The name of the kubeconfig cluster to use + --context string The name of the kubeconfig context to use + -h, --help help for rundex + --insecure-skip-tls-verify If true, the server's certificate will not be checked for validity. This will make your HTTPS connections insecure + --kubeconfig string Path to a kube config. Only required if out-of-cluster + -n, --namespace string If present, the namespace scope for this CLI request + --password string Password for basic authentication to the API server + --request-timeout string The length of time to wait before giving up on a single server request. Non-zero values should contain a corresponding time unit (e.g. 1s, 2m, 3h). A value of zero means don't timeout requests. (default "0") + --server string The address and port of the Kubernetes API server + --tls-server-name string If provided, this name will be used to validate server certificate. If this is not provided, hostname used to contact the server is used. + --token string Bearer token for authentication to the API server + --user string The name of the kubeconfig user to use + --username string Username for basic authentication to the API server +``` + +### SEE ALSO + +* [argocd-dex](argocd-dex.md) - argocd-util tools used by Argo CD + diff --git a/docs/operator-manual/server-commands/argocd-util.md b/docs/operator-manual/server-commands/argocd-util.md index 6afecaea76955..ab1cdd035074e 100644 --- a/docs/operator-manual/server-commands/argocd-util.md +++ b/docs/operator-manual/server-commands/argocd-util.md @@ -23,12 +23,10 @@ argocd-util [flags] * [argocd-util apps](argocd-util_apps.md) - Utility commands operate on ArgoCD applications * [argocd-util config](argocd-util_config.md) - Generate declarative configuration files * [argocd-util export](argocd-util_export.md) - Export all Argo CD data to stdout (default) or a file -* [argocd-util gendexcfg](argocd-util_gendexcfg.md) - Generates a dex config from Argo CD settings * [argocd-util import](argocd-util_import.md) - Import Argo CD data from stdin (specify `-') or a file * [argocd-util kubeconfig](argocd-util_kubeconfig.md) - Generates kubeconfig for the specified cluster * [argocd-util projects](argocd-util_projects.md) - Utility commands operate on ArgoCD Projects * [argocd-util rbac](argocd-util_rbac.md) - Validate and test RBAC configuration -* [argocd-util rundex](argocd-util_rundex.md) - Runs dex generating a config using settings from the Argo CD configmap and secret * [argocd-util settings](argocd-util_settings.md) - Provides set of commands for settings validation and troubleshooting * [argocd-util version](argocd-util_version.md) - Print version information diff --git a/manifests/base/dex/argocd-dex-server-deployment.yaml b/manifests/base/dex/argocd-dex-server-deployment.yaml index 0c57ab6708375..23f049cb8d754 100644 --- a/manifests/base/dex/argocd-dex-server-deployment.yaml +++ b/manifests/base/dex/argocd-dex-server-deployment.yaml @@ -20,7 +20,7 @@ spec: - name: copyutil image: quay.io/argoproj/argocd:latest imagePullPolicy: Always - command: [cp, -n, /usr/local/bin/argocd-util, /shared] + command: [cp, -n, /usr/local/bin/argocd, /shared/argocd-dex] volumeMounts: - mountPath: /shared name: static-files @@ -28,7 +28,7 @@ spec: - name: dex image: ghcr.io/dexidp/dex:v2.27.0 imagePullPolicy: Always - command: [/shared/argocd-util, rundex] + command: [/shared/argocd-dex, rundex] ports: - containerPort: 5556 - containerPort: 5557 diff --git a/manifests/ha/install.yaml b/manifests/ha/install.yaml index f90cd9ed26130..753751c5fa1d6 100644 --- a/manifests/ha/install.yaml +++ b/manifests/ha/install.yaml @@ -2856,7 +2856,7 @@ spec: weight: 5 containers: - command: - - /shared/argocd-util + - /shared/argocd-dex - rundex image: ghcr.io/dexidp/dex:v2.27.0 imagePullPolicy: Always @@ -2872,8 +2872,8 @@ spec: - command: - cp - -n - - /usr/local/bin/argocd-util - - /shared + - /usr/local/bin/argocd + - /shared/argocd-dex image: quay.io/argoproj/argocd:latest imagePullPolicy: Always name: copyutil diff --git a/manifests/ha/namespace-install.yaml b/manifests/ha/namespace-install.yaml index 614dd3d1e9ce9..ee92991310d0f 100644 --- a/manifests/ha/namespace-install.yaml +++ b/manifests/ha/namespace-install.yaml @@ -2771,7 +2771,7 @@ spec: weight: 5 containers: - command: - - /shared/argocd-util + - /shared/argocd-dex - rundex image: ghcr.io/dexidp/dex:v2.27.0 imagePullPolicy: Always @@ -2787,8 +2787,8 @@ spec: - command: - cp - -n - - /usr/local/bin/argocd-util - - /shared + - /usr/local/bin/argocd + - /shared/argocd-dex image: quay.io/argoproj/argocd:latest imagePullPolicy: Always name: copyutil diff --git a/manifests/install.yaml b/manifests/install.yaml index 5db7cdeea263d..540e1401bca0b 100644 --- a/manifests/install.yaml +++ b/manifests/install.yaml @@ -2447,7 +2447,7 @@ spec: weight: 5 containers: - command: - - /shared/argocd-util + - /shared/argocd-dex - rundex image: ghcr.io/dexidp/dex:v2.27.0 imagePullPolicy: Always @@ -2463,8 +2463,8 @@ spec: - command: - cp - -n - - /usr/local/bin/argocd-util - - /shared + - /usr/local/bin/argocd + - /shared/argocd-dex image: quay.io/argoproj/argocd:latest imagePullPolicy: Always name: copyutil diff --git a/manifests/namespace-install.yaml b/manifests/namespace-install.yaml index 1d522192716e6..713b1a5c2da2b 100644 --- a/manifests/namespace-install.yaml +++ b/manifests/namespace-install.yaml @@ -2362,7 +2362,7 @@ spec: weight: 5 containers: - command: - - /shared/argocd-util + - /shared/argocd-dex - rundex image: ghcr.io/dexidp/dex:v2.27.0 imagePullPolicy: Always @@ -2378,8 +2378,8 @@ spec: - command: - cp - -n - - /usr/local/bin/argocd-util - - /shared + - /usr/local/bin/argocd + - /shared/argocd-dex image: quay.io/argoproj/argocd:latest imagePullPolicy: Always name: copyutil diff --git a/mkdocs.yml b/mkdocs.yml index acc693fb618b2..6fb47dfd4fbd5 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -55,6 +55,7 @@ nav: - operator-manual/server-commands/argocd-server.md - operator-manual/server-commands/argocd-application-controller.md - operator-manual/server-commands/argocd-repo-server.md + - operator-manual/server-commands/argocd-dex.md - argocd-util Tools: operator-manual/server-commands/argocd-util.md - Upgrading: - operator-manual/upgrading/overview.md diff --git a/test/container/Procfile b/test/container/Procfile index 2d78109e61d91..fa070dcc03eb6 100644 --- a/test/container/Procfile +++ b/test/container/Procfile @@ -1,8 +1,8 @@ -controller: sh -c "FORCE_LOG_COLORS=1 ARGOCD_FAKE_IN_CLUSTER=true go run ./cmd/argocd-application-controller/main.go --loglevel debug --redis localhost:${ARGOCD_E2E_REDIS_PORT:-6379} --repo-server localhost:${ARGOCD_E2E_REPOSERVER_PORT:-8081}" -api-server: sh -c "FORCE_LOG_COLORS=1 ARGOCD_FAKE_IN_CLUSTER=true go run ./cmd/argocd-server/main.go --loglevel debug --redis localhost:${ARGOCD_E2E_REDIS_PORT:-6379} --disable-auth=${ARGOCD_E2E_DISABLE_AUTH:-'true'} --insecure --dex-server http://localhost:${ARGOCD_E2E_DEX_PORT:-5556} --repo-server localhost:${ARGOCD_E2E_REPOSERVER_PORT:-8081} --port ${ARGOCD_E2E_APISERVER_PORT:-8080} --staticassets ui/dist/app" -dex: sh -c "test $ARGOCD_IN_CI = true && exit 0; go run github.com/argoproj/argo-cd/cmd/argocd-util gendexcfg -o `pwd`/dist/dex.yaml && docker run --rm -p ${ARGOCD_E2E_DEX_PORT:-5556}:${ARGOCD_E2E_DEX_PORT:-5556} -v `pwd`/dist/dex.yaml:/dex.yaml ghcr.io/dexidp/dex:v2.27.0 serve /dex.yaml" +controller: sh -c "FORCE_LOG_COLORS=1 ARGOCD_FAKE_IN_CLUSTER=true ARGOCD_BINARY_NAME=argocd-application-controller go run ./cmd/main.go --loglevel debug --redis localhost:${ARGOCD_E2E_REDIS_PORT:-6379} --repo-server localhost:${ARGOCD_E2E_REPOSERVER_PORT:-8081}" +api-server: sh -c "FORCE_LOG_COLORS=1 ARGOCD_FAKE_IN_CLUSTER=true ARGOCD_BINARY_NAME=argocd-server go run ./cmd/main.go --loglevel debug --redis localhost:${ARGOCD_E2E_REDIS_PORT:-6379} --disable-auth=${ARGOCD_E2E_DISABLE_AUTH:-'true'} --insecure --dex-server http://localhost:${ARGOCD_E2E_DEX_PORT:-5556} --repo-server localhost:${ARGOCD_E2E_REPOSERVER_PORT:-8081} --port ${ARGOCD_E2E_APISERVER_PORT:-8080} --staticassets ui/dist/app" +dex: sh -c "test $ARGOCD_IN_CI = true && exit 0; ARGOCD_BINARY_NAME=argocd-dex go run github.com/argoproj/argo-cd/cmd gendexcfg -o `pwd`/dist/dex.yaml && docker run --rm -p ${ARGOCD_E2E_DEX_PORT:-5556}:${ARGOCD_E2E_DEX_PORT:-5556} -v `pwd`/dist/dex.yaml:/dex.yaml ghcr.io/dexidp/dex:v2.27.0 serve /dex.yaml" redis: sh -c "/usr/local/bin/redis-server --save "" --appendonly no --port ${ARGOCD_E2E_REDIS_PORT:-6379}" -repo-server: sh -c "FORCE_LOG_COLORS=1 ARGOCD_FAKE_IN_CLUSTER=true ARGOCD_GNUPGHOME=${ARGOCD_GNUPGHOME:-/tmp/argocd-local/gpg/keys} ARGOCD_GPG_DATA_PATH=${ARGOCD_GPG_DATA_PATH:-/tmp/argocd-local/gpg/source} go run ./cmd/argocd-repo-server/main.go --loglevel debug --port ${ARGOCD_E2E_REPOSERVER_PORT:-8081} --redis localhost:${ARGOCD_E2E_REDIS_PORT:-6379}" +repo-server: sh -c "FORCE_LOG_COLORS=1 ARGOCD_FAKE_IN_CLUSTER=true ARGOCD_GNUPGHOME=${ARGOCD_GNUPGHOME:-/tmp/argocd-local/gpg/keys} ARGOCD_GPG_DATA_PATH=${ARGOCD_GPG_DATA_PATH:-/tmp/argocd-local/gpg/source} ARGOCD_BINARY_NAME=argocd-repo-server go run ./cmd/main.go --loglevel debug --port ${ARGOCD_E2E_REPOSERVER_PORT:-8081} --redis localhost:${ARGOCD_E2E_REDIS_PORT:-6379}" ui: sh -c "test $ARGOCD_IN_CI = true && exit 0; cd ui && ARGOCD_E2E_YARN_HOST=0.0.0.0 ${ARGOCD_E2E_YARN_CMD:-yarn} start" sshd: sudo sh -c "test $ARGOCD_E2E_TEST = true && /usr/sbin/sshd -p 2222 -D -e" fcgiwrap: sudo sh -c "test $ARGOCD_E2E_TEST = true && (fcgiwrap -s unix:/var/run/fcgiwrap.socket & sleep 1 && chmod 777 /var/run/fcgiwrap.socket && wait)" diff --git a/tools/cmd-docs/main.go b/tools/cmd-docs/main.go index e1e7e34c8af66..a44df55791345 100644 --- a/tools/cmd-docs/main.go +++ b/tools/cmd-docs/main.go @@ -4,13 +4,14 @@ import ( "log" "os" + "github.com/spf13/cobra/doc" + controller "github.com/argoproj/argo-cd/cmd/argocd-application-controller/commands" + argocddex "github.com/argoproj/argo-cd/cmd/argocd-dex/commands" reposerver "github.com/argoproj/argo-cd/cmd/argocd-repo-server/commands" argocdserver "github.com/argoproj/argo-cd/cmd/argocd-server/commands" argocdutil "github.com/argoproj/argo-cd/cmd/argocd-util/commands" argocdcli "github.com/argoproj/argo-cd/cmd/argocd/commands" - - "github.com/spf13/cobra/doc" ) func main() { @@ -37,6 +38,11 @@ func main() { log.Fatal(err) } + err = doc.GenMarkdownTree(argocddex.NewCommand(), "./docs/operator-manual/server-commands") + if err != nil { + log.Fatal(err) + } + err = doc.GenMarkdownTree(argocdutil.NewCommand(), "./docs/operator-manual/server-commands") if err != nil { log.Fatal(err) diff --git a/util/settings/settings.go b/util/settings/settings.go index 1b2e70c7af24c..85b5d6b773f61 100644 --- a/util/settings/settings.go +++ b/util/settings/settings.go @@ -1157,7 +1157,7 @@ func (a *ArgoCDSettings) DexRedirectURL() (string, error) { } // DexOAuth2ClientSecret calculates an arbitrary, but predictable OAuth2 client secret string derived -// from the server secret. This is called by the dex startup wrapper (argocd-util rundex), as well +// from the server secret. This is called by the dex startup wrapper (argocd-dex rundex), as well // as the API server, such that they both independently come to the same conclusion of what the // OAuth2 shared client secret should be. func (a *ArgoCDSettings) DexOAuth2ClientSecret() string {