diff --git a/api/Dockerfile b/api/Dockerfile index 443e010b6..e3aa09a73 100644 --- a/api/Dockerfile +++ b/api/Dockerfile @@ -1,26 +1,37 @@ FROM golang:1.16-alpine AS builder +# Set necessary environment variables needed for our image. +ENV CGO_ENABLED=1 GOOS=linux GOARCH=amd64 -# Move to working directory (/build). -WORKDIR /build +RUN apk add libpcap-dev gcc g++ make + +# Move to tapper working directory (/tap-build). +WORKDIR /tap-build + +COPY tap/go.mod tap/go.sum ./ +RUN go mod download +# Copy and build tapper code +COPY tap/src ./ +RUN go build -ldflags="-s -w" -o passivetapper . + +# Move to api working directory (/api-build). +WORKDIR ../api-build -# Copy and download dependency using go mod. COPY go.mod go.sum ./ RUN go mod download - -# Copy the code into the container. +# Copy and build api code COPY . . - -# Set necessary environmet variables needed for our image and build the API server. -ENV CGO_ENABLED=0 GOOS=linux GOARCH=amd64 RUN go build -ldflags="-s -w" -o apiserver . -FROM scratch +FROM alpine:3.13.5 + +RUN apk add bash libpcap-dev + +WORKDIR /app # Copy binary and config files from /build to root folder of scratch container. -COPY --from=builder ["/build/apiserver", "/"] +COPY --from=builder ["/api-build/apiserver", "."] +COPY --from=builder ["/tap-build/passivetapper", "."] +COPY scripts/multi-runner.sh ./ -# Export necessary port. -EXPOSE 5000 - -# Command to run when starting the container. -ENTRYPOINT ["/apiserver"] +# this script runs both apiserver and passivetapper and exits either if one of them exits, preventing a scenario where the container runs without one process +CMD "./multi-runner.sh" diff --git a/api/scripts/multi-runner.sh b/api/scripts/multi-runner.sh new file mode 100755 index 000000000..61caa7e7b --- /dev/null +++ b/api/scripts/multi-runner.sh @@ -0,0 +1,5 @@ +#!/bin/bash +./apiserver & +./passivetapper -i eth0 & +wait -n +pkill -P $$ diff --git a/tap/README.md b/api/tap/README.md similarity index 100% rename from tap/README.md rename to api/tap/README.md diff --git a/tap/go.mod b/api/tap/go.mod similarity index 100% rename from tap/go.mod rename to api/tap/go.mod diff --git a/tap/go.sum b/api/tap/go.sum similarity index 100% rename from tap/go.sum rename to api/tap/go.sum diff --git a/tap/src/cleaner.go b/api/tap/src/cleaner.go similarity index 100% rename from tap/src/cleaner.go rename to api/tap/src/cleaner.go diff --git a/tap/src/grpc_assembler.go b/api/tap/src/grpc_assembler.go similarity index 100% rename from tap/src/grpc_assembler.go rename to api/tap/src/grpc_assembler.go diff --git a/tap/src/har_writer.go b/api/tap/src/har_writer.go similarity index 100% rename from tap/src/har_writer.go rename to api/tap/src/har_writer.go diff --git a/tap/src/http_matcher.go b/api/tap/src/http_matcher.go similarity index 100% rename from tap/src/http_matcher.go rename to api/tap/src/http_matcher.go diff --git a/tap/src/http_reader.go b/api/tap/src/http_reader.go similarity index 100% rename from tap/src/http_reader.go rename to api/tap/src/http_reader.go diff --git a/tap/src/net_utils.go b/api/tap/src/net_utils.go similarity index 100% rename from tap/src/net_utils.go rename to api/tap/src/net_utils.go diff --git a/tap/src/passive_tapper.go b/api/tap/src/passive_tapper.go similarity index 100% rename from tap/src/passive_tapper.go rename to api/tap/src/passive_tapper.go diff --git a/tap/src/stats_tracker.go b/api/tap/src/stats_tracker.go similarity index 100% rename from tap/src/stats_tracker.go rename to api/tap/src/stats_tracker.go diff --git a/tap/src/tap_output.go b/api/tap/src/tap_output.go similarity index 100% rename from tap/src/tap_output.go rename to api/tap/src/tap_output.go diff --git a/tap/src/tcp_stream.go b/api/tap/src/tcp_stream.go similarity index 100% rename from tap/src/tcp_stream.go rename to api/tap/src/tcp_stream.go diff --git a/tap/src/tcp_stream_factory.go b/api/tap/src/tcp_stream_factory.go similarity index 100% rename from tap/src/tcp_stream_factory.go rename to api/tap/src/tcp_stream_factory.go diff --git a/cli/cmd/root.go b/cli/cmd/root.go index 055b9991b..ae192e4d6 100644 --- a/cli/cmd/root.go +++ b/cli/cmd/root.go @@ -36,6 +36,8 @@ func init() { rootCmd.Flags().StringVarP(&config.Configuration.Namespace, "namespace", "n", "", "Namespace selector") rootCmd.Flags().BoolVarP(&config.Configuration.AllNamespaces, "all-namespaces", "A", false, "Select all namespaces") rootCmd.Flags().StringVarP(&config.Configuration.KubeConfigPath, "kubeconfig", "k", "", "Path to kubeconfig file") + rootCmd.Flags().StringVarP(&config.Configuration.MizuImage, "mizu-image", "", "gcr.io/up9-docker-hub/mizu/develop/v1", "Custom image for mizu collector") + rootCmd.Flags().Uint16VarP(&config.Configuration.MizuPodPort, "mizu-port", "", 8899, "Port which mizu cli will attempt to forward from the mizu collector pod") } // Execute adds all child commands to the root command and sets flags appropriately. diff --git a/cli/config/config.go b/cli/config/config.go index fab01b5ef..3be92624a 100644 --- a/cli/config/config.go +++ b/cli/config/config.go @@ -8,6 +8,8 @@ type Options struct { Namespace string AllNamespaces bool KubeConfigPath string + MizuImage string + MizuPodPort uint16 } var Configuration = &Options{} diff --git a/cli/mizu/mizuRunner.go b/cli/mizu/mizuRunner.go index a50ce3cd1..f75028a8c 100644 --- a/cli/mizu/mizuRunner.go +++ b/cli/mizu/mizuRunner.go @@ -12,10 +12,6 @@ import ( "time" ) -var ( - isPortForwarded = false -) - func Run(podRegex *regexp.Regexp) { kubernetesProvider := kubernetes.NewProvider(config.Configuration.KubeConfigPath, config.Configuration.Namespace) ctx, cancel := context.WithCancel(context.Background()) @@ -58,9 +54,7 @@ func watchPodsForTapping(ctx context.Context, kubernetesProvider *kubernetes.Pro } func createPodAndPortForward(ctx context.Context, kubernetesProvider *kubernetes.Provider, cancel context.CancelFunc, podName string) { - podImage := "kennethreitz/httpbin:latest" - - pod, err := kubernetesProvider.CreatePod(ctx, podName, podImage) + pod, err := kubernetesProvider.CreatePod(ctx, podName, config.Configuration.MizuImage) if err != nil { fmt.Printf("error creating pod %s", err) cancel() @@ -82,7 +76,7 @@ func createPodAndPortForward(ctx context.Context, kubernetesProvider *kubernetes if modifiedPod.Status.Phase == "Running" && !isPodReady { isPodReady = true var err error - portForward, err = kubernetes.NewPortForward(kubernetesProvider, kubernetesProvider.Namespace, podName, config.Configuration.DashboardPort, 80, cancel) + portForward, err = kubernetes.NewPortForward(kubernetesProvider, kubernetesProvider.Namespace, podName, config.Configuration.DashboardPort, config.Configuration.MizuPodPort, cancel) if !config.Configuration.NoDashboard { fmt.Printf("Dashboard is now available at http://localhost:%d\n", config.Configuration.DashboardPort) } @@ -92,7 +86,7 @@ func createPodAndPortForward(ctx context.Context, kubernetesProvider *kubernetes } } - case <- time.After(10 * time.Second): + case <- time.After(25 * time.Second): if !isPodReady { fmt.Printf("error: %s pod was not ready in time", podName) cancel()