diff --git a/Makefile b/Makefile index 9a96f6675..65834551c 100644 --- a/Makefile +++ b/Makefile @@ -46,6 +46,10 @@ push-docker: ## Build and publish agent docker image. @echo "publishing Docker image .. " devops/build-push-featurebranch.sh +push-docker-debug: + @echo "publishing debug Docker image .. " + devops/build-push-featurebranch-debug.sh + build-docker-ci: ## Build agent docker image for CI. @echo "building docker image for ci" devops/build-agent-ci.sh diff --git a/cli/cmd/clean.go b/cli/cmd/clean.go new file mode 100644 index 000000000..263685af2 --- /dev/null +++ b/cli/cmd/clean.go @@ -0,0 +1,20 @@ +package cmd + +import ( + "github.com/spf13/cobra" + "github.com/up9inc/mizu/cli/telemetry" +) + +var cleanCmd = &cobra.Command{ + Use: "clean", + Short: "Removes all mizu resources", + RunE: func(cmd *cobra.Command, args []string) error { + go telemetry.ReportRun("clean", nil) + performCleanCommand() + return nil + }, +} + +func init() { + rootCmd.AddCommand(cleanCmd) +} diff --git a/cli/cmd/cleanRunner.go b/cli/cmd/cleanRunner.go new file mode 100644 index 000000000..be5cb2c8a --- /dev/null +++ b/cli/cmd/cleanRunner.go @@ -0,0 +1,17 @@ +package cmd + +import ( + "github.com/up9inc/mizu/cli/config" + "github.com/up9inc/mizu/cli/kubernetes" + "github.com/up9inc/mizu/shared/logger" +) + +func performCleanCommand() { + kubernetesProvider, err := kubernetes.NewProvider(config.Config.KubeConfigPath()) + if err != nil { + logger.Log.Error(err) + return + } + + finishMizuExecution(kubernetesProvider) +} diff --git a/cli/cmd/tapRunner.go b/cli/cmd/tapRunner.go index 2909fb583..006ea1a11 100644 --- a/cli/cmd/tapRunner.go +++ b/cli/cmd/tapRunner.go @@ -2,8 +2,11 @@ package cmd import ( "context" + "errors" "fmt" "io/ioutil" + k8serrors "k8s.io/apimachinery/pkg/api/errors" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "path" "regexp" "strings" @@ -129,11 +132,18 @@ func RunMizuTap() { return } - defer finishMizuExecution(kubernetesProvider) if err := createMizuResources(ctx, kubernetesProvider, mizuValidationRules, contract); err != nil { logger.Log.Errorf(uiUtils.Error, fmt.Sprintf("Error creating resources: %v", errormessage.FormatError(err))) + + var statusError *k8serrors.StatusError + if errors.As(err, &statusError) { + if statusError.ErrStatus.Reason == metav1.StatusReasonAlreadyExists { + logger.Log.Info("Mizu is already running in this namespace, change the `mizu-resources-namespace` configuration or run `mizu clean` to remove the currently running Mizu instance") + } + } return } + defer finishMizuExecution(kubernetesProvider) go goUtils.HandleExcWrapper(watchApiServerPod, ctx, kubernetesProvider, cancel, mizuApiFilteringOptions) go goUtils.HandleExcWrapper(watchTapperPod, ctx, kubernetesProvider, cancel) diff --git a/debug.Dockerfile b/debug.Dockerfile index f3145d218..354351cd3 100644 --- a/debug.Dockerfile +++ b/debug.Dockerfile @@ -12,7 +12,7 @@ FROM golang:1.16-alpine AS builder # Set necessary environment variables needed for our image. ENV CGO_ENABLED=1 GOOS=linux GOARCH=amd64 -RUN apk add libpcap-dev gcc g++ make +RUN apk add libpcap-dev gcc g++ make bash # Move to agent working directory (/agent-build). WORKDIR /app/agent-build @@ -20,17 +20,25 @@ WORKDIR /app/agent-build COPY agent/go.mod agent/go.sum ./ COPY shared/go.mod shared/go.mod ../shared/ COPY tap/go.mod tap/go.mod ../tap/ - +COPY tap/api/go.* ../tap/api/ RUN go mod download # cheap trick to make the build faster (As long as go.mod wasn't changes) RUN go list -f '{{.Path}}@{{.Version}}' -m all | sed 1d | grep -e 'go-cache' -e 'sqlite' | xargs go get +ARG COMMIT_HASH +ARG GIT_BRANCH +ARG BUILD_TIMESTAMP +ARG SEM_VER + # Copy and build agent code COPY shared ../shared COPY tap ../tap COPY agent . RUN go build -gcflags="all=-N -l" -o mizuagent . +COPY devops/build_extensions_debug.sh .. +RUN cd .. && /bin/bash build_extensions_debug.sh + FROM golang:1.16-alpine @@ -39,6 +47,7 @@ WORKDIR /app # Copy binary and config files from /build to root folder of scratch container. COPY --from=builder ["/app/agent-build/mizuagent", "."] +COPY --from=builder ["/app/agent/build/extensions", "extensions"] COPY --from=site-build ["/app/ui-build/build", "site"] # install remote debugging tool diff --git a/devops/build-push-featurebranch-debug.sh b/devops/build-push-featurebranch-debug.sh new file mode 100755 index 000000000..3e38385b3 --- /dev/null +++ b/devops/build-push-featurebranch-debug.sh @@ -0,0 +1,28 @@ +#!/bin/bash +set -e + +GCP_PROJECT=up9-docker-hub +REPOSITORY=gcr.io/$GCP_PROJECT +SERVER_NAME=mizu +GIT_BRANCH=$(git branch | grep \* | cut -d ' ' -f2 | tr '[:upper:]' '[:lower:]') + +DOCKER_REPO=$REPOSITORY/$SERVER_NAME/$GIT_BRANCH +SEM_VER=${SEM_VER=0.0.0} + +DOCKER_TAGGED_BUILDS=("$DOCKER_REPO:latest" "$DOCKER_REPO:$SEM_VER") + +if [ "$GIT_BRANCH" = 'develop' -o "$GIT_BRANCH" = 'master' -o "$GIT_BRANCH" = 'main' ] +then + echo "Pushing to $GIT_BRANCH is allowed only via CI" + exit 1 +fi + +echo "building ${DOCKER_TAGGED_BUILDS[@]}" +DOCKER_TAGS_ARGS=$(echo ${DOCKER_TAGGED_BUILDS[@]/#/-t }) # "-t FIRST_TAG -t SECOND_TAG ..." +docker build -f debug.Dockerfile $DOCKER_TAGS_ARGS --build-arg SEM_VER=${SEM_VER} --build-arg BUILD_TIMESTAMP=${BUILD_TIMESTAMP} --build-arg GIT_BRANCH=${GIT_BRANCH} --build-arg COMMIT_HASH=${COMMIT_HASH} . + +for DOCKER_TAG in "${DOCKER_TAGGED_BUILDS[@]}" +do + echo pushing "$DOCKER_TAG" + docker push "$DOCKER_TAG" +done diff --git a/devops/build_extensions_debug.sh b/devops/build_extensions_debug.sh new file mode 100755 index 000000000..5b272ba73 --- /dev/null +++ b/devops/build_extensions_debug.sh @@ -0,0 +1,12 @@ +#!/bin/bash + +for f in tap/extensions/*; do + if [ -d "$f" ]; then + extension=$(basename $f) && \ + cd tap/extensions/${extension} && \ + go build -gcflags="all=-N -l" -buildmode=plugin -o ../${extension}.so . && \ + cd ../../.. && \ + mkdir -p agent/build/extensions && \ + cp tap/extensions/${extension}.so agent/build/extensions + fi +done