From 569a56cf6a115b28472da7a24c14be4bb11321d3 Mon Sep 17 00:00:00 2001 From: Pavan Navarathna Devaraj Date: Tue, 12 Jun 2018 11:56:21 -0700 Subject: [PATCH] Return error while creating kubernetes client (#3134) --- pkg/function/backup_data.go | 5 ++++- pkg/function/kube_exec.go | 6 ++++-- pkg/function/kube_exec_all.go | 6 ++++-- pkg/function/kube_task.go | 5 ++++- pkg/function/kube_task_test.go | 4 +++- pkg/function/prepare_data.go | 5 ++++- pkg/function/prepare_data_test.go | 4 +++- pkg/function/scale_workload.go | 5 ++++- pkg/kube/client.go | 10 +++++----- pkg/kube/exec_test.go | 3 ++- pkg/kube/job_test.go | 24 ++++++++++++++++-------- pkg/kube/statefulset_test.go | 4 +++- pkg/param/param_test.go | 4 +++- pkg/resource/resource_test.go | 4 +++- 14 files changed, 62 insertions(+), 27 deletions(-) diff --git a/pkg/function/backup_data.go b/pkg/function/backup_data.go index 1abcf134ca..2a9018d811 100644 --- a/pkg/function/backup_data.go +++ b/pkg/function/backup_data.go @@ -91,7 +91,10 @@ func (*backupDataFunc) Exec(ctx context.Context, tp param.TemplateParams, args m if err = validateProfile(tp.Profile); err != nil { return errors.Wrapf(err, "Failed to validate Profile") } - cli := kube.NewClient() + cli, err := kube.NewClient() + if err != nil { + return errors.Wrapf(err, "Failed to create Kubernetes client") + } // Create backup and dump it on the object store cmd := generateBackupCommand(includePath, backupArtifact, tp.Profile) stdout, stderr, err := kube.Exec(cli, namespace, pod, container, cmd) diff --git a/pkg/function/kube_exec.go b/pkg/function/kube_exec.go index 400ecf12e8..f5708246a4 100644 --- a/pkg/function/kube_exec.go +++ b/pkg/function/kube_exec.go @@ -34,10 +34,12 @@ func (*kubeExecFunc) Name() string { } func (kef *kubeExecFunc) Exec(ctx context.Context, tp param.TemplateParams, args map[string]interface{}) error { - cli := kube.NewClient() + cli, err := kube.NewClient() + if err != nil { + return err + } var namespace, pod, container string var cmd []string - var err error if err = Arg(args, KubeExecNamespaceArg, &namespace); err != nil { return err } diff --git a/pkg/function/kube_exec_all.go b/pkg/function/kube_exec_all.go index 53a161cc56..859f2531d7 100644 --- a/pkg/function/kube_exec_all.go +++ b/pkg/function/kube_exec_all.go @@ -36,10 +36,12 @@ func (*kubeExecAllFunc) Name() string { } func (*kubeExecAllFunc) Exec(ctx context.Context, tp param.TemplateParams, args map[string]interface{}) error { - cli := kube.NewClient() + cli, err := kube.NewClient() + if err != nil { + return err + } var namespace, pods, containers string var cmd []string - var err error if err = Arg(args, KubeExecAllNamespaceArg, &namespace); err != nil { return err } diff --git a/pkg/function/kube_task.go b/pkg/function/kube_task.go index 65e293ba97..2b4e548337 100644 --- a/pkg/function/kube_task.go +++ b/pkg/function/kube_task.go @@ -55,7 +55,10 @@ func (ktf *kubeTaskFunc) Exec(ctx context.Context, tp param.TemplateParams, args } jobName := generateJobName(jobPrefix) - clientset := kube.NewClient() + clientset, err := kube.NewClient() + if err != nil { + return errors.Wrapf(err, "Failed to create Kubernetes client") + } serviceAccount, err := kube.GetControllerServiceAccount(clientset) if err != nil { return errors.Wrap(err, "Failed to get Controller Service Account") diff --git a/pkg/function/kube_task_test.go b/pkg/function/kube_task_test.go index 3fbe5264b8..7f256cfbed 100644 --- a/pkg/function/kube_task_test.go +++ b/pkg/function/kube_task_test.go @@ -23,7 +23,9 @@ type KubeTaskSuite struct { } func (s *KubeTaskSuite) SetUpSuite(c *C) { - s.cli = kube.NewClient() + cli, err := kube.NewClient() + c.Assert(err, IsNil) + s.cli = cli ns := &v1.Namespace{ ObjectMeta: metav1.ObjectMeta{ diff --git a/pkg/function/prepare_data.go b/pkg/function/prepare_data.go index 2474aa827e..db1c196b30 100644 --- a/pkg/function/prepare_data.go +++ b/pkg/function/prepare_data.go @@ -50,7 +50,10 @@ func (*prepareDataFunc) Exec(ctx context.Context, tp param.TemplateParams, args if err = OptArg(args, PrepareDataServiceAccount, &serviceAccount, ""); err != nil { return err } - cli := kube.NewClient() + cli, err := kube.NewClient() + if err != nil { + return errors.Wrapf(err, "Failed to create Kubernetes client") + } // Validate volumes for pvc := range vols { if _, err := cli.CoreV1().PersistentVolumeClaims(namespace).Get(pvc, metav1.GetOptions{}); err != nil { diff --git a/pkg/function/prepare_data_test.go b/pkg/function/prepare_data_test.go index c1d6b002d7..b83a6623c9 100644 --- a/pkg/function/prepare_data_test.go +++ b/pkg/function/prepare_data_test.go @@ -23,7 +23,9 @@ type PrepareDataSuite struct { } func (s *PrepareDataSuite) SetUpSuite(c *C) { - s.cli = kube.NewClient() + cli, err := kube.NewClient() + c.Assert(err, IsNil) + s.cli = cli ns := &v1.Namespace{ ObjectMeta: metav1.ObjectMeta{ diff --git a/pkg/function/scale_workload.go b/pkg/function/scale_workload.go index be55177f9f..365322f40a 100644 --- a/pkg/function/scale_workload.go +++ b/pkg/function/scale_workload.go @@ -43,7 +43,10 @@ func (*scaleWorkloadFunc) Exec(ctx context.Context, tp param.TemplateParams, arg return err } - cli := kube.NewClient() + cli, err := kube.NewClient() + if err != nil { + return errors.Wrapf(err, "Failed to create Kubernetes client") + } switch strings.ToLower(kind) { case "statefulset": return kube.ScaleStatefulSet(ctx, cli, namespace, name, replicas) diff --git a/pkg/kube/client.go b/pkg/kube/client.go index 461f6f10ac..d32c3f7ec8 100644 --- a/pkg/kube/client.go +++ b/pkg/kube/client.go @@ -36,17 +36,17 @@ func LoadConfig() (*rest.Config, error) { return newClientConfig().ClientConfig() } -// NewClient returns a k8 client configured by the k10 environment. -func NewClient() kubernetes.Interface { +// NewClient returns a k8 client configured by the kanister environment. +func NewClient() (kubernetes.Interface, error) { config, err := LoadConfig() if err != nil { - panic(err.Error()) + return nil, err } // creates the clientset clientset, err := kubernetes.NewForConfig(config) if err != nil { - panic(err.Error()) + return nil, err } - return clientset + return clientset, nil } diff --git a/pkg/kube/exec_test.go b/pkg/kube/exec_test.go index d4bb6f1e1d..d53f0c0ba7 100644 --- a/pkg/kube/exec_test.go +++ b/pkg/kube/exec_test.go @@ -12,7 +12,8 @@ var _ = Suite(&ExecSuite{}) func (s *ExecSuite) TestExecEcho(c *C) { cmd := []string{"sh", "-c", "echo badabing"} - cli := NewClient() + cli, err := NewClient() + c.Assert(err, IsNil) pods, err := cli.Core().Pods(defaultNamespace).List(emptyListOptions) c.Assert(err, IsNil) if len(pods.Items) == 0 { diff --git a/pkg/kube/job_test.go b/pkg/kube/job_test.go index ec98e5c906..cb446b6430 100644 --- a/pkg/kube/job_test.go +++ b/pkg/kube/job_test.go @@ -31,7 +31,8 @@ func (s *JobSuite) SetUpSuite(c *C) { // Verifies that the Job object is not created if the job name is not specified. func (s *JobSuite) TestJobsNoName(c *C) { - clientset := NewClient() + clientset, err := NewClient() + c.Assert(err, IsNil) job, err := NewJob(clientset, testJobName, testJobNamespace, testJobServiceAccount, "", nil, "sleep", "10") c.Assert(job, IsNil) @@ -40,7 +41,8 @@ func (s *JobSuite) TestJobsNoName(c *C) { // Verifies that the Job object is not created if the image is not specified. func (s *JobSuite) TestJobsNoImage(c *C) { - clientset := NewClient() + clientset, err := NewClient() + c.Assert(err, IsNil) job, err := NewJob(clientset, testJobName, testJobNamespace, testJobServiceAccount, "", nil, "sleep", "10") c.Assert(job, IsNil) @@ -49,7 +51,8 @@ func (s *JobSuite) TestJobsNoImage(c *C) { // Verifies that the Job object is not created if the namespace is not specified. func (s *JobSuite) TestJobsNoNamespace(c *C) { - clientset := NewClient() + clientset, err := NewClient() + c.Assert(err, IsNil) job, err := NewJob(clientset, testJobName, "", testJobServiceAccount, testJobImage, nil, "sleep", "10") c.Assert(job.namespace, Equals, "default") @@ -65,7 +68,8 @@ func (s *JobSuite) TestJobsNoClientset(c *C) { // Verifies that the Job object is not created if the command is not passed. func (s *JobSuite) TestJobsNoCommand(c *C) { - clientset := NewClient() + clientset, err := NewClient() + c.Assert(err, IsNil) job, err := NewJob(clientset, testJobName, testJobNamespace, testJobServiceAccount, testJobImage, nil, "") c.Assert(job, IsNil) @@ -109,7 +113,8 @@ func waitForJobCount(clientset kubernetes.Interface, namespace string, expectedC // Verifies that the basic Job creation and deletion completes successfully. func (s *JobSuite) TestJobsBasic(c *C) { namespace := "default" - clientset := NewClient() + clientset, err := NewClient() + c.Assert(err, IsNil) origJobCount := getK8sJobCount(clientset, namespace, c) @@ -140,7 +145,8 @@ func (s *JobSuite) TestJobsBasic(c *C) { // Verifies that deleting the Job while it is running works. func (s *JobSuite) TestJobsDeleteWhileRunning(c *C) { namespace := "default" - clientset := NewClient() + clientset, err := NewClient() + c.Assert(err, IsNil) job, err := NewJob(clientset, testJobName, testJobNamespace, testJobServiceAccount, testJobImage, nil, "sleep", "300") @@ -165,7 +171,8 @@ func cancelLater(cancel func()) { // Verifies that cancelling the context results in WaitForCompletion finishing. func (s *JobSuite) TestJobsWaitAfterDelete(c *C) { - clientset := NewClient() + clientset, err := NewClient() + c.Assert(err, IsNil) job, err := NewJob(clientset, testJobName, testJobNamespace, testJobServiceAccount, testJobImage, nil, "sleep", "300") @@ -188,7 +195,8 @@ func (s *JobSuite) TestJobsWaitAfterDelete(c *C) { } func (s *JobSuite) TestJobsWaitOnNonExistentJob(c *C) { - clientset := NewClient() + clientset, err := NewClient() + c.Assert(err, IsNil) job, err := NewJob(clientset, testJobName, testJobNamespace, testJobServiceAccount, testJobImage, nil, "sleep", "300") diff --git a/pkg/kube/statefulset_test.go b/pkg/kube/statefulset_test.go index 823b8390af..4039073b12 100644 --- a/pkg/kube/statefulset_test.go +++ b/pkg/kube/statefulset_test.go @@ -22,7 +22,9 @@ var _ = Suite(&StatefulSetSuite{}) func (s *StatefulSetSuite) SetUpSuite(c *C) { c.Skip("Too slow") - s.cli = NewClient() + cli, err := NewClient() + c.Assert(err, IsNil) + s.cli = cli ns := &v1.Namespace{ ObjectMeta: metav1.ObjectMeta{ GenerateName: "statefulsettest-", diff --git a/pkg/param/param_test.go b/pkg/param/param_test.go index 7f4bbe04ec..8e99c88181 100644 --- a/pkg/param/param_test.go +++ b/pkg/param/param_test.go @@ -30,7 +30,9 @@ type ParamsSuite struct { var _ = Suite(&ParamsSuite{}) func (s *ParamsSuite) SetUpSuite(c *C) { - s.cli = kube.NewClient() + cli, err := kube.NewClient() + c.Assert(err, IsNil) + s.cli = cli ns := &v1.Namespace{ ObjectMeta: metav1.ObjectMeta{ GenerateName: "kanisterparamstest-", diff --git a/pkg/resource/resource_test.go b/pkg/resource/resource_test.go index e371332cc9..38b311fb2d 100644 --- a/pkg/resource/resource_test.go +++ b/pkg/resource/resource_test.go @@ -25,7 +25,9 @@ type ResourceSuite struct { var _ = Suite(&ResourceSuite{}) func (s *ResourceSuite) SetUpSuite(c *C) { - s.cli = kube.NewClient() + cli, err := kube.NewClient() + c.Assert(err, IsNil) + s.cli = cli ns := &v1.Namespace{ ObjectMeta: metav1.ObjectMeta{ GenerateName: "kanistercontrollertest-",