From 7abba86274c33ddc382a90b1f4f897f90f1cba20 Mon Sep 17 00:00:00 2001 From: Murat Kabilov <murat.kabilov@zalando.de> Date: Fri, 9 Jun 2017 15:30:28 +0200 Subject: [PATCH] move exec method from separate file to the utils; move regexps to the utils --- pkg/cluster/cluster.go | 6 ----- pkg/cluster/exec.go | 61 ------------------------------------------ pkg/cluster/util.go | 59 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 59 insertions(+), 67 deletions(-) delete mode 100644 pkg/cluster/exec.go diff --git a/pkg/cluster/cluster.go b/pkg/cluster/cluster.go index eaa56ec4..5627b7b6 100644 --- a/pkg/cluster/cluster.go +++ b/pkg/cluster/cluster.go @@ -7,7 +7,6 @@ import ( "encoding/json" "fmt" "reflect" - "regexp" "sync" "github.com/Sirupsen/logrus" @@ -29,11 +28,6 @@ import ( "github.com/zalando-incubator/postgres-operator/pkg/util/volumes" ) -var ( - alphaNumericRegexp = regexp.MustCompile("^[a-zA-Z][a-zA-Z0-9]*$") - userRegexp = regexp.MustCompile(`^[a-z0-9]([-_a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-_a-z0-9]*[a-z0-9])?)*$`) -) - // Config contains operator-wide clients and configuration used from a cluster. TODO: remove struct duplication. type Config struct { KubeClient *kubernetes.Clientset //TODO: move clients to the better place? diff --git a/pkg/cluster/exec.go b/pkg/cluster/exec.go deleted file mode 100644 index fbd913c2..00000000 --- a/pkg/cluster/exec.go +++ /dev/null @@ -1,61 +0,0 @@ -package cluster - -import ( - "bytes" - "fmt" - - remotecommandconsts "k8s.io/apimachinery/pkg/util/remotecommand" - "k8s.io/client-go/pkg/api" - "k8s.io/kubernetes/pkg/client/unversioned/remotecommand" - - "github.com/zalando-incubator/postgres-operator/pkg/spec" -) - -func (c *Cluster) ExecCommand(podName *spec.NamespacedName, command ...string) (string, error) { - var ( - execOut bytes.Buffer - execErr bytes.Buffer - ) - - pod, err := c.KubeClient.Pods(podName.Namespace).Get(podName.Name) - if err != nil { - return "", fmt.Errorf("could not get pod info: %v", err) - } - - if len(pod.Spec.Containers) != 1 { - return "", fmt.Errorf("could not determine which container to use") - } - - req := c.RestClient.Post(). - Resource("pods"). - Name(podName.Name). - Namespace(podName.Namespace). - SubResource("exec") - req.VersionedParams(&api.PodExecOptions{ - Container: pod.Spec.Containers[0].Name, - Command: command, - Stdout: true, - Stderr: true, - }, api.ParameterCodec) - - exec, err := remotecommand.NewExecutor(c.RestConfig, "POST", req.URL()) - if err != nil { - return "", fmt.Errorf("failed to init executor: %v", err) - } - - err = exec.Stream(remotecommand.StreamOptions{ - SupportedProtocols: remotecommandconsts.SupportedStreamingProtocols, - Stdout: &execOut, - Stderr: &execErr, - }) - - if err != nil { - return "", fmt.Errorf("could not execute: %v", err) - } - - if execErr.Len() > 0 { - return "", fmt.Errorf("stderr: %v", execErr.String()) - } - - return execOut.String(), nil -} diff --git a/pkg/cluster/util.go b/pkg/cluster/util.go index b6416cd7..4c90804f 100644 --- a/pkg/cluster/util.go +++ b/pkg/cluster/util.go @@ -1,14 +1,19 @@ package cluster import ( + "bytes" "encoding/json" "fmt" "strings" + "regexp" "time" "k8s.io/client-go/pkg/api/v1" "k8s.io/client-go/pkg/apis/apps/v1beta1" "k8s.io/client-go/pkg/labels" + remotecommandconsts "k8s.io/apimachinery/pkg/util/remotecommand" + "k8s.io/client-go/pkg/api" + "k8s.io/kubernetes/pkg/client/unversioned/remotecommand" "github.com/zalando-incubator/postgres-operator/pkg/spec" "github.com/zalando-incubator/postgres-operator/pkg/util" @@ -16,6 +21,11 @@ import ( "github.com/zalando-incubator/postgres-operator/pkg/util/retryutil" ) +var ( + alphaNumericRegexp = regexp.MustCompile("^[a-zA-Z][a-zA-Z0-9]*$") + userRegexp = regexp.MustCompile(`^[a-z0-9]([-_a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-_a-z0-9]*[a-z0-9])?)*$`) +) + func isValidUsername(username string) bool { return userRegexp.MatchString(username) } @@ -302,3 +312,52 @@ func (c *Cluster) credentialSecretName(username string) string { func (c *Cluster) podSpiloRole(pod *v1.Pod) string { return pod.Labels[c.OpConfig.PodRoleLabel] } + +func (c *Cluster) ExecCommand(podName *spec.NamespacedName, command ...string) (string, error) { + var ( + execOut bytes.Buffer + execErr bytes.Buffer + ) + + pod, err := c.KubeClient.Pods(podName.Namespace).Get(podName.Name) + if err != nil { + return "", fmt.Errorf("could not get pod info: %v", err) + } + + if len(pod.Spec.Containers) != 1 { + return "", fmt.Errorf("could not determine which container to use") + } + + req := c.RestClient.Post(). + Resource("pods"). + Name(podName.Name). + Namespace(podName.Namespace). + SubResource("exec") + req.VersionedParams(&api.PodExecOptions{ + Container: pod.Spec.Containers[0].Name, + Command: command, + Stdout: true, + Stderr: true, + }, api.ParameterCodec) + + exec, err := remotecommand.NewExecutor(c.RestConfig, "POST", req.URL()) + if err != nil { + return "", fmt.Errorf("failed to init executor: %v", err) + } + + err = exec.Stream(remotecommand.StreamOptions{ + SupportedProtocols: remotecommandconsts.SupportedStreamingProtocols, + Stdout: &execOut, + Stderr: &execErr, + }) + + if err != nil { + return "", fmt.Errorf("could not execute: %v", err) + } + + if execErr.Len() > 0 { + return "", fmt.Errorf("stderr: %v", execErr.String()) + } + + return execOut.String(), nil +} -- GitLab