From 14c9c412cda76c2852dfbbd4f6008ee5bfd709ce Mon Sep 17 00:00:00 2001 From: Asim Aslam Date: Tue, 24 Dec 2019 17:45:17 +0000 Subject: [PATCH] Move and rename --- util/kubernetes/client/client.go | 245 ++++++++++++++++++++------- util/kubernetes/client/kubernetes.go | 125 -------------- 2 files changed, 180 insertions(+), 190 deletions(-) delete mode 100644 util/kubernetes/client/kubernetes.go diff --git a/util/kubernetes/client/client.go b/util/kubernetes/client/client.go index 1c8b91b3..911e885c 100644 --- a/util/kubernetes/client/client.go +++ b/util/kubernetes/client/client.go @@ -1,3 +1,4 @@ +// Package client provides an implementation of a restricted subset of kubernetes API client package client import ( @@ -10,6 +11,7 @@ import ( "os" "path" "strconv" + "strings" "github.com/micro/go-micro/util/kubernetes/api" "github.com/micro/go-micro/util/log" @@ -20,6 +22,8 @@ var ( serviceAccountPath = "/var/run/secrets/kubernetes.io/serviceaccount" // ErrReadNamespace is returned when the names could not be read from service account ErrReadNamespace = errors.New("Could not read namespace from service account secret") + // DefaultImage is default micro image + DefaultImage = "micro/go-micro" ) // Client ... @@ -27,71 +31,20 @@ type client struct { opts *api.Options } -// NewLocalDevClient returns a client that can be used with `kubectl proxy` on an optional port -func NewLocalDevClient(port ...int) *client { - var p int - if len(port) > 1 { - log.Fatal("Expected 0 or 1 port parameters") - } - if len(port) == 0 { - p = 8001 - } else { - p = port[0] - } - return &client{ - opts: &api.Options{ - Client: http.DefaultClient, - Host: "http://localhost:" + strconv.Itoa(p), - Namespace: "default", - }, - } -} - -// NewClientInCluster creates a Kubernetes client for use from within a k8s pod. -func NewClientInCluster() *client { - host := "https://" + os.Getenv("KUBERNETES_SERVICE_HOST") + ":" + os.Getenv("KUBERNETES_SERVICE_PORT") - - s, err := os.Stat(serviceAccountPath) - if err != nil { - log.Fatal(err) - } - if s == nil || !s.IsDir() { - log.Fatal(errors.New("service account not found")) - } - - token, err := ioutil.ReadFile(path.Join(serviceAccountPath, "token")) - if err != nil { - log.Fatal(err) - } - t := string(token) - - ns, err := detectNamespace() - if err != nil { - log.Fatal(err) - } - - crt, err := CertPoolFromFile(path.Join(serviceAccountPath, "ca.crt")) - if err != nil { - log.Fatal(err) - } - - c := &http.Client{ - Transport: &http.Transport{ - TLSClientConfig: &tls.Config{ - RootCAs: crt, - }, - DisableCompression: true, - }, - } - - return &client{ - opts: &api.Options{ - Client: c, - Host: host, - Namespace: ns, - BearerToken: &t, - }, - } +// Kubernetes client +type Client interface { + // Create creates new API resource + Create(*Resource) error + // Get queries API resrouces + Get(*Resource, map[string]string) error + // Update patches existing API object + Update(*Resource) error + // Delete deletes API resource + Delete(*Resource) error + // List lists API resources + List(*Resource) error + // Log gets log for a pod + Log(*Resource, ...LogOption) (io.ReadCloser, error) } func detectNamespace() (string, error) { @@ -203,3 +156,165 @@ func (c *client) List(r *Resource) error { } return c.Get(r, labels) } + +// NewService returns default micro kubernetes service definition +func NewService(name, version, typ string) *Service { + log.Tracef("kubernetes default service: name: %s, version: %s", name, version) + + Labels := map[string]string{ + "name": name, + "version": version, + "micro": typ, + } + + svcName := name + if len(version) > 0 { + // API service object name joins name and version over "-" + svcName = strings.Join([]string{name, version}, "-") + } + + Metadata := &Metadata{ + Name: svcName, + Namespace: "default", + Version: version, + Labels: Labels, + } + + Spec := &ServiceSpec{ + Type: "ClusterIP", + Selector: Labels, + Ports: []ServicePort{{ + "service-port", 9090, "", + }}, + } + + return &Service{ + Metadata: Metadata, + Spec: Spec, + } +} + +// NewService returns default micro kubernetes deployment definition +func NewDeployment(name, version, typ string) *Deployment { + log.Tracef("kubernetes default deployment: name: %s, version: %s", name, version) + + Labels := map[string]string{ + "name": name, + "version": version, + "micro": typ, + } + + depName := name + if len(version) > 0 { + // API deployment object name joins name and version over "-" + depName = strings.Join([]string{name, version}, "-") + } + + Metadata := &Metadata{ + Name: depName, + Namespace: "default", + Version: version, + Labels: Labels, + Annotations: map[string]string{}, + } + + // enable go modules by default + env := EnvVar{ + Name: "GO111MODULE", + Value: "on", + } + + Spec := &DeploymentSpec{ + Replicas: 1, + Selector: &LabelSelector{ + MatchLabels: Labels, + }, + Template: &Template{ + Metadata: Metadata, + PodSpec: &PodSpec{ + Containers: []Container{{ + Name: name, + Image: DefaultImage, + Env: []EnvVar{env}, + Command: []string{"go", "run", "main.go"}, + Ports: []ContainerPort{{ + Name: "service-port", + ContainerPort: 8080, + }}, + }}, + }, + }, + } + + return &Deployment{ + Metadata: Metadata, + Spec: Spec, + } +} + +// NewLocalDevClient returns a client that can be used with `kubectl proxy` on an optional port +func NewLocalDevClient(port ...int) *client { + var p int + if len(port) > 1 { + log.Fatal("Expected 0 or 1 port parameters") + } + if len(port) == 0 { + p = 8001 + } else { + p = port[0] + } + return &client{ + opts: &api.Options{ + Client: http.DefaultClient, + Host: "http://localhost:" + strconv.Itoa(p), + Namespace: "default", + }, + } +} + +// NewClientInCluster creates a Kubernetes client for use from within a k8s pod. +func NewClientInCluster() *client { + host := "https://" + os.Getenv("KUBERNETES_SERVICE_HOST") + ":" + os.Getenv("KUBERNETES_SERVICE_PORT") + + s, err := os.Stat(serviceAccountPath) + if err != nil { + log.Fatal(err) + } + if s == nil || !s.IsDir() { + log.Fatal(errors.New("service account not found")) + } + + token, err := ioutil.ReadFile(path.Join(serviceAccountPath, "token")) + if err != nil { + log.Fatal(err) + } + t := string(token) + + ns, err := detectNamespace() + if err != nil { + log.Fatal(err) + } + + crt, err := CertPoolFromFile(path.Join(serviceAccountPath, "ca.crt")) + if err != nil { + log.Fatal(err) + } + + c := &http.Client{ + Transport: &http.Transport{ + TLSClientConfig: &tls.Config{ + RootCAs: crt, + }, + DisableCompression: true, + }, + } + + return &client{ + opts: &api.Options{ + Client: c, + Host: host, + Namespace: ns, + BearerToken: &t, + }, + } +} diff --git a/util/kubernetes/client/kubernetes.go b/util/kubernetes/client/kubernetes.go deleted file mode 100644 index bbb22949..00000000 --- a/util/kubernetes/client/kubernetes.go +++ /dev/null @@ -1,125 +0,0 @@ -// Package client provides an implementation of a restricted subset of kubernetes API client -package client - -import ( - "io" - "strings" - - "github.com/micro/go-micro/util/log" -) - -var ( - // DefaultImage is default micro image - DefaultImage = "micro/go-micro" -) - -// Kubernetes client -type Kubernetes interface { - // Create creates new API resource - Create(*Resource) error - // Get queries API resrouces - Get(*Resource, map[string]string) error - // Update patches existing API object - Update(*Resource) error - // Delete deletes API resource - Delete(*Resource) error - // List lists API resources - List(*Resource) error - // Log gets log for a pod - Log(*Resource, ...LogOption) (io.ReadCloser, error) -} - -// NewService returns default micro kubernetes service definition -func NewService(name, version, typ string) *Service { - log.Tracef("kubernetes default service: name: %s, version: %s", name, version) - - Labels := map[string]string{ - "name": name, - "version": version, - "micro": typ, - } - - svcName := name - if len(version) > 0 { - // API service object name joins name and version over "-" - svcName = strings.Join([]string{name, version}, "-") - } - - Metadata := &Metadata{ - Name: svcName, - Namespace: "default", - Version: version, - Labels: Labels, - } - - Spec := &ServiceSpec{ - Type: "ClusterIP", - Selector: Labels, - Ports: []ServicePort{{ - "service-port", 9090, "", - }}, - } - - return &Service{ - Metadata: Metadata, - Spec: Spec, - } -} - -// NewService returns default micro kubernetes deployment definition -func NewDeployment(name, version, typ string) *Deployment { - log.Tracef("kubernetes default deployment: name: %s, version: %s", name, version) - - Labels := map[string]string{ - "name": name, - "version": version, - "micro": typ, - } - - depName := name - if len(version) > 0 { - // API deployment object name joins name and version over "-" - depName = strings.Join([]string{name, version}, "-") - } - - Metadata := &Metadata{ - Name: depName, - Namespace: "default", - Version: version, - Labels: Labels, - Annotations: map[string]string{}, - } - - // enable go modules by default - env := EnvVar{ - Name: "GO111MODULE", - Value: "on", - } - - Spec := &DeploymentSpec{ - Replicas: 1, - Selector: &LabelSelector{ - MatchLabels: Labels, - }, - Template: &Template{ - Metadata: Metadata, - PodSpec: &PodSpec{ - Containers: []Container{{ - Name: name, - Image: DefaultImage, - Env: []EnvVar{env}, - Command: []string{"go", "run", "main.go"}, - Ports: []ContainerPort{{ - Name: "service-port", - ContainerPort: 8080, - }}, - }}, - }, - }, - } - - return &Deployment{ - Metadata: Metadata, - Spec: Spec, - } -}