From 61a9003a972cb9ad0ca9b105fc74e1e13b7aa5c0 Mon Sep 17 00:00:00 2001 From: Adam Reese <adam@reese.io> Date: Thu, 12 Apr 2018 16:19:35 -0700 Subject: [PATCH] ref(cmd/tiller): delete main tiller package --- cmd/tiller/probes.go | 43 ------ cmd/tiller/probes_test.go | 58 -------- cmd/tiller/tiller.go | 288 -------------------------------------- cmd/tiller/tiller_test.go | 47 ------- cmd/tiller/trace.go | 58 -------- 5 files changed, 494 deletions(-) delete mode 100644 cmd/tiller/probes.go delete mode 100644 cmd/tiller/probes_test.go delete mode 100644 cmd/tiller/tiller.go delete mode 100644 cmd/tiller/tiller_test.go delete mode 100644 cmd/tiller/trace.go diff --git a/cmd/tiller/probes.go b/cmd/tiller/probes.go deleted file mode 100644 index 144ad8a1b..000000000 --- a/cmd/tiller/probes.go +++ /dev/null @@ -1,43 +0,0 @@ -/* -Copyright 2016 The Kubernetes Authors All rights reserved. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package main - -import ( - "net/http" - - "github.com/prometheus/client_golang/prometheus/promhttp" -) - -func readinessProbe(w http.ResponseWriter, r *http.Request) { - w.WriteHeader(http.StatusOK) -} - -func livenessProbe(w http.ResponseWriter, r *http.Request) { - w.WriteHeader(http.StatusOK) -} - -func newProbesMux() *http.ServeMux { - mux := http.NewServeMux() - mux.HandleFunc("/readiness", readinessProbe) - mux.HandleFunc("/liveness", livenessProbe) - return mux -} - -func addPrometheusHandler(mux *http.ServeMux) { - // Register HTTP handler for the global Prometheus registry. - mux.Handle("/metrics", promhttp.Handler()) -} diff --git a/cmd/tiller/probes_test.go b/cmd/tiller/probes_test.go deleted file mode 100644 index 0b13460e0..000000000 --- a/cmd/tiller/probes_test.go +++ /dev/null @@ -1,58 +0,0 @@ -/* -Copyright 2016 The Kubernetes Authors All rights reserved. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package main - -import ( - "net/http" - "net/http/httptest" - "testing" -) - -func TestProbesServer(t *testing.T) { - mux := newProbesMux() - srv := httptest.NewServer(mux) - defer srv.Close() - resp, err := http.Get(srv.URL + "/readiness") - if err != nil { - t.Fatalf("GET /readiness returned an error (%s)", err) - } - if resp.StatusCode != http.StatusOK { - t.Fatalf("GET /readiness returned status code %d, expected %d", resp.StatusCode, http.StatusOK) - } - - resp, err = http.Get(srv.URL + "/liveness") - if err != nil { - t.Fatalf("GET /liveness returned an error (%s)", err) - } - if resp.StatusCode != http.StatusOK { - t.Fatalf("GET /liveness returned status code %d, expected %d", resp.StatusCode, http.StatusOK) - } -} - -func TestPrometheus(t *testing.T) { - mux := http.NewServeMux() - addPrometheusHandler(mux) - srv := httptest.NewServer(mux) - defer srv.Close() - resp, err := http.Get(srv.URL + "/metrics") - if err != nil { - t.Fatalf("GET /metrics returned an error (%s)", err) - } - if resp.StatusCode != http.StatusOK { - t.Fatalf("GET /metrics returned status code %d, expected %d", resp.StatusCode, http.StatusOK) - } -} diff --git a/cmd/tiller/tiller.go b/cmd/tiller/tiller.go deleted file mode 100644 index 5d2db3816..000000000 --- a/cmd/tiller/tiller.go +++ /dev/null @@ -1,288 +0,0 @@ -/* -Copyright 2016 The Kubernetes Authors All rights reserved. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package main // import "k8s.io/helm/cmd/tiller" - -import ( - "crypto/tls" - "flag" - "fmt" - "io/ioutil" - "log" - "net" - "net/http" - "os" - "path/filepath" - "strconv" - "strings" - "time" - - goprom "github.com/grpc-ecosystem/go-grpc-prometheus" - "google.golang.org/grpc" - "google.golang.org/grpc/credentials" - "google.golang.org/grpc/health" - healthpb "google.golang.org/grpc/health/grpc_health_v1" - "google.golang.org/grpc/keepalive" - - "k8s.io/helm/pkg/kube" - "k8s.io/helm/pkg/proto/hapi/services" - "k8s.io/helm/pkg/storage" - "k8s.io/helm/pkg/storage/driver" - "k8s.io/helm/pkg/tiller" - "k8s.io/helm/pkg/tiller/environment" - "k8s.io/helm/pkg/tlsutil" - "k8s.io/helm/pkg/version" -) - -const ( - // tlsEnableEnvVar names the environment variable that enables TLS. - tlsEnableEnvVar = "TILLER_TLS_ENABLE" - // tlsVerifyEnvVar names the environment variable that enables - // TLS, as well as certificate verification of the remote. - tlsVerifyEnvVar = "TILLER_TLS_VERIFY" - // tlsCertsEnvVar names the environment variable that points to - // the directory where Tiller's TLS certificates are located. - tlsCertsEnvVar = "TILLER_TLS_CERTS" - // historyMaxEnvVar is the name of the env var for setting max history. - historyMaxEnvVar = "TILLER_HISTORY_MAX" - - storageMemory = "memory" - storageConfigMap = "configmap" - storageSecret = "secret" - - probeAddr = ":44135" - traceAddr = ":44136" - - // defaultMaxHistory sets the maximum number of releases to 0: unlimited - defaultMaxHistory = 0 -) - -var ( - grpcAddr = flag.String("listen", ":44134", "address:port to listen on") - enableTracing = flag.Bool("trace", false, "enable rpc tracing") - store = flag.String("storage", storageConfigMap, "storage driver to use. One of 'configmap', 'memory', or 'secret'") - remoteReleaseModules = flag.Bool("experimental-release", false, "enable experimental release modules") - tlsEnable = flag.Bool("tls", tlsEnableEnvVarDefault(), "enable TLS") - tlsVerify = flag.Bool("tls-verify", tlsVerifyEnvVarDefault(), "enable TLS and verify remote certificate") - keyFile = flag.String("tls-key", tlsDefaultsFromEnv("tls-key"), "path to TLS private key file") - certFile = flag.String("tls-cert", tlsDefaultsFromEnv("tls-cert"), "path to TLS certificate file") - caCertFile = flag.String("tls-ca-cert", tlsDefaultsFromEnv("tls-ca-cert"), "trust certificates signed by this CA") - maxHistory = flag.Int("history-max", historyMaxFromEnv(), "maximum number of releases kept in release history, with 0 meaning no limit") - printVersion = flag.Bool("version", false, "print the version number") - - // rootServer is the root gRPC server. - // - // Each gRPC service registers itself to this server during init(). - rootServer *grpc.Server - - // env is the default environment. - // - // Any changes to env should be done before rootServer.Serve() is called. - env = environment.New() - - logger *log.Logger -) - -func main() { - // TODO: use spf13/cobra for tiller instead of flags - flag.Parse() - - if *printVersion { - fmt.Println(version.GetVersion()) - os.Exit(0) - } - - if *enableTracing { - log.SetFlags(log.Lshortfile) - } - logger = newLogger("main") - - start() -} - -func start() { - - healthSrv := health.NewServer() - healthSrv.SetServingStatus("Tiller", healthpb.HealthCheckResponse_NOT_SERVING) - - clientset, err := kube.New(nil).ClientSet() - if err != nil { - logger.Fatalf("Cannot initialize Kubernetes connection: %s", err) - } - - switch *store { - case storageMemory: - env.Releases = storage.Init(driver.NewMemory()) - case storageConfigMap: - cfgmaps := driver.NewConfigMaps(clientset.Core().ConfigMaps(namespace())) - cfgmaps.Log = newLogger("storage/driver").Printf - - env.Releases = storage.Init(cfgmaps) - env.Releases.Log = newLogger("storage").Printf - case storageSecret: - secrets := driver.NewSecrets(clientset.Core().Secrets(namespace())) - secrets.Log = newLogger("storage/driver").Printf - - env.Releases = storage.Init(secrets) - env.Releases.Log = newLogger("storage").Printf - } - - if *maxHistory > 0 { - env.Releases.MaxHistory = *maxHistory - } - - kubeClient := kube.New(nil) - kubeClient.Log = newLogger("kube").Printf - env.KubeClient = kubeClient - - if *tlsEnable || *tlsVerify { - opts := tlsutil.Options{CertFile: *certFile, KeyFile: *keyFile} - if *tlsVerify { - opts.CaCertFile = *caCertFile - } - } - - var opts []grpc.ServerOption - if *tlsEnable || *tlsVerify { - cfg, err := tlsutil.ServerConfig(tlsOptions()) - if err != nil { - logger.Fatalf("Could not create server TLS configuration: %v", err) - } - opts = append(opts, grpc.Creds(credentials.NewTLS(cfg))) - } - - opts = append(opts, grpc.KeepaliveParams(keepalive.ServerParameters{ - MaxConnectionIdle: 10 * time.Minute, - // If needed, we can configure the max connection age - })) - opts = append(opts, grpc.KeepaliveEnforcementPolicy(keepalive.EnforcementPolicy{ - MinTime: time.Duration(20) * time.Second, // For compatibility with the client keepalive.ClientParameters - })) - - rootServer = tiller.NewServer(opts...) - healthpb.RegisterHealthServer(rootServer, healthSrv) - - lstn, err := net.Listen("tcp", *grpcAddr) - if err != nil { - logger.Fatalf("Server died: %s", err) - } - - logger.Printf("Starting Tiller %s (tls=%t)", version.GetVersion(), *tlsEnable || *tlsVerify) - logger.Printf("GRPC listening on %s", *grpcAddr) - logger.Printf("Probes listening on %s", probeAddr) - logger.Printf("Storage driver is %s", env.Releases.Name()) - logger.Printf("Max history per release is %d", *maxHistory) - - if *enableTracing { - startTracing(traceAddr) - } - - srvErrCh := make(chan error) - probeErrCh := make(chan error) - go func() { - svc := tiller.NewReleaseServer(env, clientset, *remoteReleaseModules) - svc.Log = newLogger("tiller").Printf - services.RegisterReleaseServiceServer(rootServer, svc) - if err := rootServer.Serve(lstn); err != nil { - srvErrCh <- err - } - }() - - go func() { - mux := newProbesMux() - - // Register gRPC server to prometheus to initialized matrix - goprom.Register(rootServer) - addPrometheusHandler(mux) - - if err := http.ListenAndServe(probeAddr, mux); err != nil { - probeErrCh <- err - } - }() - - healthSrv.SetServingStatus("Tiller", healthpb.HealthCheckResponse_SERVING) - - select { - case err := <-srvErrCh: - logger.Fatalf("Server died: %s", err) - case err := <-probeErrCh: - logger.Printf("Probes server died: %s", err) - } -} - -func newLogger(prefix string) *log.Logger { - if len(prefix) > 0 { - prefix = fmt.Sprintf("[%s] ", prefix) - } - return log.New(os.Stderr, prefix, log.Flags()) -} - -// namespace returns the namespace of tiller -func namespace() string { - if ns := os.Getenv("TILLER_NAMESPACE"); ns != "" { - return ns - } - - // Fall back to the namespace associated with the service account token, if available - if data, err := ioutil.ReadFile("/var/run/secrets/kubernetes.io/serviceaccount/namespace"); err == nil { - if ns := strings.TrimSpace(string(data)); len(ns) > 0 { - return ns - } - } - - return environment.DefaultTillerNamespace -} - -func tlsOptions() tlsutil.Options { - opts := tlsutil.Options{CertFile: *certFile, KeyFile: *keyFile} - if *tlsVerify { - opts.CaCertFile = *caCertFile - - // We want to force the client to not only provide a cert, but to - // provide a cert that we can validate. - // http://www.bite-code.com/2015/06/25/tls-mutual-auth-in-golang/ - opts.ClientAuth = tls.RequireAndVerifyClientCert - } - return opts -} - -func tlsDefaultsFromEnv(name string) (value string) { - switch certsDir := os.Getenv(tlsCertsEnvVar); name { - case "tls-key": - return filepath.Join(certsDir, "tls.key") - case "tls-cert": - return filepath.Join(certsDir, "tls.crt") - case "tls-ca-cert": - return filepath.Join(certsDir, "ca.crt") - } - return "" -} - -func historyMaxFromEnv() int { - val := os.Getenv(historyMaxEnvVar) - if val == "" { - return defaultMaxHistory - } - ret, err := strconv.Atoi(val) - if err != nil { - log.Printf("Invalid max history %q. Defaulting to 0.", val) - return defaultMaxHistory - } - return ret -} - -func tlsEnableEnvVarDefault() bool { return os.Getenv(tlsEnableEnvVar) != "" } -func tlsVerifyEnvVarDefault() bool { return os.Getenv(tlsVerifyEnvVar) != "" } diff --git a/cmd/tiller/tiller_test.go b/cmd/tiller/tiller_test.go deleted file mode 100644 index 0698e9d94..000000000 --- a/cmd/tiller/tiller_test.go +++ /dev/null @@ -1,47 +0,0 @@ -/* -Copyright 2016 The Kubernetes Authors All rights reserved. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package main - -import ( - "testing" - - "k8s.io/helm/pkg/engine" - "k8s.io/helm/pkg/tiller/environment" -) - -// These are canary tests to make sure that the default server actually -// fulfills its requirements. -var _ environment.Engine = &engine.Engine{} - -func TestInit(t *testing.T) { - defer func() { - if recover() != nil { - t.Fatalf("Panic trapped. Check EngineYard.Default()") - } - }() - - // This will panic if it is not correct. - env.EngineYard.Default() - - e, ok := env.EngineYard.Get(environment.GoTplEngine) - if !ok { - t.Fatalf("Could not find GoTplEngine") - } - if e == nil { - t.Fatalf("Template engine GoTplEngine returned nil.") - } -} diff --git a/cmd/tiller/trace.go b/cmd/tiller/trace.go deleted file mode 100644 index 71d7e8f72..000000000 --- a/cmd/tiller/trace.go +++ /dev/null @@ -1,58 +0,0 @@ -/* -Copyright 2016 The Kubernetes Authors All rights reserved. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package main // import "k8s.io/helm/cmd/tiller" - -import ( - "net/http" - - _ "net/http/pprof" - - "google.golang.org/grpc" -) - -func startTracing(addr string) { - logger.Printf("Tracing server is listening on %s\n", addr) - grpc.EnableTracing = true - - http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { - if r.URL.Path != "/" { - http.NotFound(w, r) - return - } - w.Header().Set("Content-Type", "text/html; charset=utf-8") - w.Write([]byte(traceIndexHTML)) - }) - - go func() { - if err := http.ListenAndServe(addr, nil); err != nil { - logger.Printf("tracing error: %s", err) - } - }() -} - -const traceIndexHTML = `<!DOCTYPE html> -<html> - <body> - <ul> - <li><a href="/debug/requests">requests</a></li> - <li><a href="/debug/events">events</a></li> - <li><a href="/debug/pprof">pprof</a></li> - <li><a href="/debug/vars">vars</a></li> - </ul> - </body> -</html> -` -- GitLab