From bfbb80efcf78f1b444f563cee994c0538111d6c3 Mon Sep 17 00:00:00 2001 From: Ta-Ching Chen Date: Mon, 16 Dec 2019 23:14:14 +0800 Subject: [PATCH] Add controller API client interface (#1467) This PR adds an interface for controller API client, it allows us to implement mock API client for unit testing with ease and we are able to generate spec file without accessing the real Fission server. --- cmd/fission-cli/app/app.go | 11 ++ pkg/controller/api_test.go | 97 +++++++------- pkg/controller/client/client.go | 118 +++------------- pkg/controller/client/rest/client.go | 126 ++++++++++++++++++ .../client/{ => v1}/canaryconfig.go | 53 +++++--- pkg/controller/client/{ => v1}/environment.go | 53 +++++--- pkg/controller/client/{ => v1}/function.go | 91 ++++++------- pkg/controller/client/{ => v1}/httptrigger.go | 53 +++++--- .../client/{ => v1}/kuberneteswatchtrigger.go | 49 +++++-- pkg/controller/client/{core.go => v1/misc.go} | 64 ++++++--- pkg/controller/client/{ => v1}/mqtrigger.go | 53 +++++--- pkg/controller/client/{ => v1}/package.go | 53 +++++--- pkg/controller/client/{ => v1}/timetrigger.go | 53 +++++--- pkg/controller/client/v1/v1.go | 100 ++++++++++++++ pkg/fission-cli/cmd/canaryconfig/create.go | 19 +-- pkg/fission-cli/cmd/canaryconfig/delete.go | 16 +-- pkg/fission-cli/cmd/canaryconfig/get.go | 16 +-- pkg/fission-cli/cmd/canaryconfig/list.go | 16 +-- pkg/fission-cli/cmd/canaryconfig/update.go | 18 +-- pkg/fission-cli/cmd/cmd.go | 21 ++- pkg/fission-cli/cmd/environment/create.go | 19 +-- pkg/fission-cli/cmd/environment/delete.go | 16 +-- pkg/fission-cli/cmd/environment/get.go | 16 +-- pkg/fission-cli/cmd/environment/list.go | 16 +-- pkg/fission-cli/cmd/environment/update.go | 20 +-- pkg/fission-cli/cmd/function/create.go | 29 ++-- pkg/fission-cli/cmd/function/delete.go | 16 +-- pkg/fission-cli/cmd/function/get.go | 18 +-- pkg/fission-cli/cmd/function/getmeta.go | 16 +-- pkg/fission-cli/cmd/function/list.go | 16 +-- pkg/fission-cli/cmd/function/log.go | 15 +-- pkg/fission-cli/cmd/function/test.go | 18 +-- pkg/fission-cli/cmd/function/update.go | 29 ++-- pkg/fission-cli/cmd/httptrigger/create.go | 19 +-- pkg/fission-cli/cmd/httptrigger/delete.go | 18 +-- pkg/fission-cli/cmd/httptrigger/get.go | 16 +-- pkg/fission-cli/cmd/httptrigger/list.go | 16 +-- pkg/fission-cli/cmd/httptrigger/update.go | 19 +-- pkg/fission-cli/cmd/kubewatch/create.go | 15 +-- pkg/fission-cli/cmd/kubewatch/delete.go | 16 +-- pkg/fission-cli/cmd/kubewatch/list.go | 16 +-- pkg/fission-cli/cmd/mqtrigger/create.go | 15 +-- pkg/fission-cli/cmd/mqtrigger/delete.go | 16 +-- pkg/fission-cli/cmd/mqtrigger/list.go | 16 +-- pkg/fission-cli/cmd/mqtrigger/update.go | 18 +-- pkg/fission-cli/cmd/package/create.go | 18 +-- pkg/fission-cli/cmd/package/delete.go | 29 ++-- pkg/fission-cli/cmd/package/get.go | 29 +--- pkg/fission-cli/cmd/package/info.go | 16 +-- pkg/fission-cli/cmd/package/list.go | 18 +-- pkg/fission-cli/cmd/package/package.go | 6 +- pkg/fission-cli/cmd/package/rebuild.go | 18 +-- pkg/fission-cli/cmd/package/update.go | 33 ++--- pkg/fission-cli/cmd/package/util/util.go | 10 +- pkg/fission-cli/cmd/plugin/list.go | 14 +- pkg/fission-cli/cmd/spec/apply.go | 96 +++++++------ pkg/fission-cli/cmd/spec/buildwatch.go | 6 +- pkg/fission-cli/cmd/spec/destroy.go | 15 +-- pkg/fission-cli/cmd/spec/init.go | 13 +- pkg/fission-cli/cmd/spec/spec.go | 4 +- pkg/fission-cli/cmd/spec/validate.go | 13 +- pkg/fission-cli/cmd/support/dump.go | 29 ++-- pkg/fission-cli/cmd/support/resources/crd.go | 18 +-- .../cmd/support/resources/fissionversion.go | 4 +- pkg/fission-cli/cmd/timetrigger/create.go | 20 +-- pkg/fission-cli/cmd/timetrigger/delete.go | 16 +-- pkg/fission-cli/cmd/timetrigger/list.go | 21 +-- pkg/fission-cli/cmd/timetrigger/test.go | 16 +-- pkg/fission-cli/cmd/timetrigger/update.go | 20 +-- pkg/fission-cli/cmd/version/version.go | 15 +-- pkg/fission-cli/util/util.go | 25 ++-- 71 files changed, 1021 insertions(+), 1025 deletions(-) create mode 100644 pkg/controller/client/rest/client.go rename pkg/controller/client/{ => v1}/canaryconfig.go (60%) rename pkg/controller/client/{ => v1}/environment.go (64%) rename pkg/controller/client/{ => v1}/function.go (58%) rename pkg/controller/client/{ => v1}/httptrigger.go (62%) rename pkg/controller/client/{ => v1}/kuberneteswatchtrigger.go (62%) rename pkg/controller/client/{core.go => v1/misc.go} (55%) rename pkg/controller/client/{ => v1}/mqtrigger.go (62%) rename pkg/controller/client/{ => v1}/package.go (63%) rename pkg/controller/client/{ => v1}/timetrigger.go (63%) create mode 100644 pkg/controller/client/v1/v1.go diff --git a/cmd/fission-cli/app/app.go b/cmd/fission-cli/app/app.go index 8d343b18..adf99776 100644 --- a/cmd/fission-cli/app/app.go +++ b/cmd/fission-cli/app/app.go @@ -3,9 +3,12 @@ package app import ( "github.com/spf13/cobra" + "github.com/fission/fission/pkg/controller/client" + "github.com/fission/fission/pkg/controller/client/rest" "github.com/fission/fission/pkg/fission-cli/cliwrapper/cli" wrapper "github.com/fission/fission/pkg/fission-cli/cliwrapper/driver/cobra" "github.com/fission/fission/pkg/fission-cli/cliwrapper/driver/cobra/helptemplate" + "github.com/fission/fission/pkg/fission-cli/cmd" "github.com/fission/fission/pkg/fission-cli/cmd/canaryconfig" "github.com/fission/fission/pkg/fission-cli/cmd/environment" "github.com/fission/fission/pkg/fission-cli/cmd/function" @@ -20,6 +23,7 @@ import ( "github.com/fission/fission/pkg/fission-cli/console" "github.com/fission/fission/pkg/fission-cli/flag" flagkey "github.com/fission/fission/pkg/fission-cli/flag/key" + "github.com/fission/fission/pkg/fission-cli/util" ) const ( @@ -40,6 +44,13 @@ func App() *cobra.Command { PersistentPreRunE: wrapper.Wrapper( func(input cli.Input) error { console.Verbosity = input.Int(flagkey.Verbosity) + serverUrl, err := util.GetServerURL(input) + if err != nil { + return err + } + restClient := rest.NewRESTClient(serverUrl) + // TODO: use fake rest client for offline spec generation + cmd.SetClientset(client.MakeClientset(restClient)) return nil }, ), diff --git a/pkg/controller/api_test.go b/pkg/controller/api_test.go index c311f852..6c4e27ce 100644 --- a/pkg/controller/api_test.go +++ b/pkg/controller/api_test.go @@ -34,11 +34,13 @@ import ( fv1 "github.com/fission/fission/pkg/apis/fission.io/v1" "github.com/fission/fission/pkg/controller/client" + "github.com/fission/fission/pkg/controller/client/rest" ferror "github.com/fission/fission/pkg/error" + "github.com/fission/fission/pkg/fission-cli/cmd" ) var g struct { - client *client.Client + cmd.CommandActioner } func panicIf(err error) { @@ -96,38 +98,38 @@ func TestFunctionApi(t *testing.T) { }, }, } - _, err := g.client.FunctionGet(&metav1.ObjectMeta{ + _, err := g.Client().V1().Function().Get(&metav1.ObjectMeta{ Name: testFunc.Metadata.Name, Namespace: metav1.NamespaceDefault, }) assertNotFoundFailure(err, "function") - m, err := g.client.FunctionCreate(testFunc) + m, err := g.Client().V1().Function().Create(testFunc) panicIf(err) defer func() { - err := g.client.FunctionDelete(m) + err := g.Client().V1().Function().Delete(m) panicIf(err) }() - _, err = g.client.FunctionCreate(testFunc) + _, err = g.Client().V1().Function().Create(testFunc) assertNameReuseFailure(err, "function") testFunc.Metadata.ResourceVersion = m.ResourceVersion testFunc.Spec.Package.FunctionName = "yyy" - _, err = g.client.FunctionUpdate(testFunc) + _, err = g.Client().V1().Function().Update(testFunc) panicIf(err) testFunc.Metadata.ResourceVersion = "" testFunc.Metadata.Name = "bar" - m2, err := g.client.FunctionCreate(testFunc) + m2, err := g.Client().V1().Function().Create(testFunc) panicIf(err) - defer g.client.FunctionDelete(m2) + defer g.Client().V1().Function().Delete(m2) - funcs, err := g.client.FunctionList(metav1.NamespaceDefault) + funcs, err := g.Client().V1().Function().List(metav1.NamespaceDefault) panicIf(err) assert(len(funcs) == 2, fmt.Sprintf("created two functions, but found %v", len(funcs))) - funcs_url := g.client.Url + "/v2/functions" + funcs_url := g.Client().ServerURL() + "/v2/functions" resp, err := http.Get(funcs_url) panicIf(err) defer resp.Body.Close() @@ -157,20 +159,20 @@ func TestHTTPTriggerApi(t *testing.T) { }, }, } - _, err := g.client.HTTPTriggerGet(&metav1.ObjectMeta{ + _, err := g.Client().V1().HTTPTrigger().Get(&metav1.ObjectMeta{ Name: testTrigger.Metadata.Name, Namespace: metav1.NamespaceDefault, }) assertNotFoundFailure(err, "httptrigger") - m, err := g.client.HTTPTriggerCreate(testTrigger) + m, err := g.Client().V1().HTTPTrigger().Create(testTrigger) panicIf(err) - defer g.client.HTTPTriggerDelete(m) + defer g.Client().V1().HTTPTrigger().Delete(m) - _, err = g.client.HTTPTriggerCreate(testTrigger) + _, err = g.Client().V1().HTTPTrigger().Create(testTrigger) assertNameReuseFailure(err, "httptrigger") - tr, err := g.client.HTTPTriggerGet(m) + tr, err := g.Client().V1().HTTPTrigger().Get(m) panicIf(err) assert(testTrigger.Spec.Method == tr.Spec.Method && testTrigger.Spec.RelativeURL == tr.Spec.RelativeURL && @@ -179,20 +181,20 @@ func TestHTTPTriggerApi(t *testing.T) { testTrigger.Metadata.ResourceVersion = m.ResourceVersion testTrigger.Spec.RelativeURL = "/hi" - _, err = g.client.HTTPTriggerUpdate(testTrigger) + _, err = g.Client().V1().HTTPTrigger().Update(testTrigger) panicIf(err) testTrigger.Metadata.ResourceVersion = "" testTrigger.Metadata.Name = "yyy" - _, err = g.client.HTTPTriggerCreate(testTrigger) + _, err = g.Client().V1().HTTPTrigger().Create(testTrigger) assert(err != nil, "duplicate trigger should not be allowed") testTrigger.Spec.RelativeURL = "/hi2" - m2, err := g.client.HTTPTriggerCreate(testTrigger) + m2, err := g.Client().V1().HTTPTrigger().Create(testTrigger) panicIf(err) - defer g.client.HTTPTriggerDelete(m2) + defer g.Client().V1().HTTPTrigger().Delete(m2) - ts, err := g.client.HTTPTriggerList(metav1.NamespaceDefault) + ts, err := g.Client().V1().HTTPTrigger().List(metav1.NamespaceDefault) panicIf(err) assert(len(ts) == 2, fmt.Sprintf("created two triggers, but found %v", len(ts))) } @@ -212,36 +214,36 @@ func TestEnvironmentApi(t *testing.T) { Resources: v1.ResourceRequirements{}, }, } - _, err := g.client.EnvironmentGet(&metav1.ObjectMeta{ + _, err := g.Client().V1().Environment().Get(&metav1.ObjectMeta{ Name: testEnv.Metadata.Name, Namespace: metav1.NamespaceDefault, }) assertNotFoundFailure(err, "environment") - m, err := g.client.EnvironmentCreate(testEnv) + m, err := g.Client().V1().Environment().Create(testEnv) panicIf(err) - defer g.client.EnvironmentDelete(m) + defer g.Client().V1().Environment().Delete(m) - _, err = g.client.EnvironmentCreate(testEnv) + _, err = g.Client().V1().Environment().Create(testEnv) assertNameReuseFailure(err, "environment") - e, err := g.client.EnvironmentGet(m) + e, err := g.Client().V1().Environment().Get(m) panicIf(err) assert(reflect.DeepEqual(testEnv.Spec, e.Spec), "env should match after reading") testEnv.Metadata.ResourceVersion = m.ResourceVersion testEnv.Spec.Runtime.Image = "another-img" - _, err = g.client.EnvironmentUpdate(testEnv) + _, err = g.Client().V1().Environment().Update(testEnv) panicIf(err) testEnv.Metadata.ResourceVersion = "" testEnv.Metadata.Name = "bar" - m2, err := g.client.EnvironmentCreate(testEnv) + m2, err := g.Client().V1().Environment().Create(testEnv) panicIf(err) - defer g.client.EnvironmentDelete(m2) + defer g.Client().V1().Environment().Delete(m2) - ts, err := g.client.EnvironmentList(metav1.NamespaceDefault) + ts, err := g.Client().V1().Environment().List(metav1.NamespaceDefault) panicIf(err) assert(len(ts) == 2, fmt.Sprintf("created two envs, but found %v", len(ts))) } @@ -261,20 +263,20 @@ func TestWatchApi(t *testing.T) { }, }, } - _, err := g.client.WatchGet(&metav1.ObjectMeta{ + _, err := g.Client().V1().KubeWatcher().Get(&metav1.ObjectMeta{ Name: testWatch.Metadata.Name, Namespace: metav1.NamespaceDefault, }) assertNotFoundFailure(err, "watch") - m, err := g.client.WatchCreate(testWatch) + m, err := g.Client().V1().KubeWatcher().Create(testWatch) panicIf(err) - defer g.client.WatchDelete(m) + defer g.Client().V1().KubeWatcher().Delete(m) - _, err = g.client.WatchCreate(testWatch) + _, err = g.Client().V1().KubeWatcher().Create(testWatch) assertNameReuseFailure(err, "watch") - w, err := g.client.WatchGet(m) + w, err := g.Client().V1().KubeWatcher().Get(m) panicIf(err) assert(testWatch.Spec.Namespace == w.Spec.Namespace && testWatch.Spec.Type == w.Spec.Type && @@ -282,11 +284,11 @@ func TestWatchApi(t *testing.T) { testWatch.Spec.FunctionReference.Name == w.Spec.FunctionReference.Name, "watch should match after reading") testWatch.Metadata.Name = "yyy" - m2, err := g.client.WatchCreate(testWatch) + m2, err := g.Client().V1().KubeWatcher().Create(testWatch) panicIf(err) - defer g.client.WatchDelete(m2) + defer g.Client().V1().KubeWatcher().Delete(m2) - ws, err := g.client.WatchList(metav1.NamespaceDefault) + ws, err := g.Client().V1().KubeWatcher().List(metav1.NamespaceDefault) panicIf(err) assert(len(ws) == 2, fmt.Sprintf("created two watches, but found %v", len(ws))) } @@ -305,17 +307,17 @@ func TestTimeTriggerApi(t *testing.T) { }, }, } - _, err := g.client.TimeTriggerGet(&metav1.ObjectMeta{Name: testTrigger.Metadata.Name}) + _, err := g.Client().V1().TimeTrigger().Get(&metav1.ObjectMeta{Name: testTrigger.Metadata.Name}) assertNotFoundFailure(err, "trigger") - m, err := g.client.TimeTriggerCreate(testTrigger) + m, err := g.Client().V1().TimeTrigger().Create(testTrigger) panicIf(err) - defer g.client.TimeTriggerDelete(m) + defer g.Client().V1().TimeTrigger().Delete(m) - _, err = g.client.TimeTriggerCreate(testTrigger) + _, err = g.Client().V1().TimeTrigger().Create(testTrigger) assertNameReuseFailure(err, "trigger") - tr, err := g.client.TimeTriggerGet(m) + tr, err := g.Client().V1().TimeTrigger().Get(m) panicIf(err) assert(testTrigger.Spec.Cron == tr.Spec.Cron && testTrigger.Spec.FunctionReference.Type == tr.Spec.FunctionReference.Type && @@ -323,16 +325,16 @@ func TestTimeTriggerApi(t *testing.T) { testTrigger.Metadata.ResourceVersion = m.ResourceVersion testTrigger.Spec.Cron = "@hourly" - _, err = g.client.TimeTriggerUpdate(testTrigger) + _, err = g.Client().V1().TimeTrigger().Update(testTrigger) panicIf(err) testTrigger.Metadata.ResourceVersion = "" testTrigger.Metadata.Name = "yyy" testTrigger.Spec.Cron = "Not valid cron spec" - _, err = g.client.TimeTriggerCreate(testTrigger) + _, err = g.Client().V1().TimeTrigger().Create(testTrigger) assertCronSpecFails(err) - ts, err := g.client.TimeTriggerList(metav1.NamespaceDefault) + ts, err := g.Client().V1().TimeTrigger().List(metav1.NamespaceDefault) panicIf(err) assert(len(ts) == 1, fmt.Sprintf("created two time triggers, but found %v", len(ts))) } @@ -353,7 +355,10 @@ func TestMain(m *testing.M) { go Start(logger, 8888, true) time.Sleep(5 * time.Second) - g.client = client.MakeClient("http://localhost:8888") + + restClient := rest.NewRESTClient("http://localhost:8888") + // TODO: use fake rest client for offline spec generation + cmd.SetClientset(client.MakeClientset(restClient)) resp, err := http.Get("http://localhost:8888/") panicIf(err) diff --git a/pkg/controller/client/client.go b/pkg/controller/client/client.go index 0d018d81..d7c2eb1d 100644 --- a/pkg/controller/client/client.go +++ b/pkg/controller/client/client.go @@ -17,115 +17,33 @@ limitations under the License. package client import ( - "bytes" - "io" - "io/ioutil" - "net/http" - "strings" - - "github.com/pkg/errors" - - ferror "github.com/fission/fission/pkg/error" -) - -var ( - DefaultRequestHeaders map[string]string + "github.com/fission/fission/pkg/controller/client/rest" + v1 "github.com/fission/fission/pkg/controller/client/v1" ) type ( - Client struct { - Url string - Headers map[string]string + Interface interface { + V1() v1.V1Interface + ServerURL() string + } + + Clientset struct { + restClient rest.Interface + v1 v1.V1Interface } ) -func MakeClient(serverUrl string) *Client { - return &Client{ - Url: strings.TrimSuffix(serverUrl, "/"), - Headers: DefaultRequestHeaders, +func MakeClientset(restClient rest.Interface) Interface { + return &Clientset{ + restClient: restClient, + v1: v1.MakeV1Client(restClient), } } -func (c *Client) create(relativeUrl string, contentType string, payload []byte) (*http.Response, error) { - var reader io.Reader - if len(payload) > 0 { - reader = bytes.NewReader(payload) - } - return c.sendRequest(http.MethodPost, c.v2CrdUrl(relativeUrl), map[string]string{"Content-type": contentType}, reader) +func (c *Clientset) V1() v1.V1Interface { + return c.v1 } -func (c *Client) put(relativeUrl string, contentType string, payload []byte) (*http.Response, error) { - var reader io.Reader - if len(payload) > 0 { - reader = bytes.NewReader(payload) - } - return c.sendRequest(http.MethodPut, c.v2CrdUrl(relativeUrl), map[string]string{"Content-type": contentType}, reader) -} - -func (c *Client) get(relativeUrl string) (*http.Response, error) { - return c.sendRequest(http.MethodGet, c.v2CrdUrl(relativeUrl), nil, nil) -} - -func (c *Client) delete(relativeUrl string) error { - resp, err := c.sendRequest(http.MethodDelete, c.v2CrdUrl(relativeUrl), nil, nil) - if err != nil { - return err - } - defer resp.Body.Close() - - if resp.StatusCode != 200 { - body, err := ioutil.ReadAll(resp.Body) - if err != nil { - return errors.Wrap(err, "error deleting") - } else { - return errors.Errorf("failed to delete: %v", string(body)) - } - } - - return nil -} - -func (c *Client) proxy(method string, relativeUrl string, payload []byte) (*http.Response, error) { - var reader io.Reader - if len(payload) > 0 { - reader = bytes.NewReader(payload) - } - return c.sendRequest(method, c.proxyUrl(relativeUrl), nil, reader) -} - -func (c *Client) sendRequest(method string, relativeUrl string, headers map[string]string, reader io.Reader) (*http.Response, error) { - req, err := http.NewRequest(method, relativeUrl, reader) - if err != nil { - return nil, err - } - for _, hs := range []map[string]string{headers, c.Headers} { - for k, v := range hs { - req.Header.Set(k, v) - } - } - return http.DefaultClient.Do(req) -} - -func (c *Client) v2CrdUrl(relativeUrl string) string { - return c.Url + "/v2/" + strings.TrimPrefix(relativeUrl, "/") -} - -func (c *Client) proxyUrl(relativeUrl string) string { - return c.Url + "/proxy/" + strings.TrimPrefix(relativeUrl, "/") -} - -func (c *Client) handleResponse(resp *http.Response) ([]byte, error) { - if resp.StatusCode != 200 { - return nil, ferror.MakeErrorFromHTTP(resp) - } - body, err := ioutil.ReadAll(resp.Body) - return body, err -} - -func (c *Client) handleCreateResponse(resp *http.Response) ([]byte, error) { - if resp.StatusCode != 201 { - return nil, ferror.MakeErrorFromHTTP(resp) - } - body, err := ioutil.ReadAll(resp.Body) - return body, err +func (c *Clientset) ServerURL() string { + return c.restClient.ServerURL() } diff --git a/pkg/controller/client/rest/client.go b/pkg/controller/client/rest/client.go new file mode 100644 index 00000000..9deb799a --- /dev/null +++ b/pkg/controller/client/rest/client.go @@ -0,0 +1,126 @@ +/* +Copyright 2019 The Fission Authors. + +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 rest + +import ( + "bytes" + "context" + "io" + "io/ioutil" + "net/http" + "strings" + + "github.com/pkg/errors" + "golang.org/x/net/context/ctxhttp" +) + +type ( + Interface interface { + Create(relativeUrl string, contentType string, payload []byte) (*http.Response, error) + Put(relativeUrl string, contentType string, payload []byte) (*http.Response, error) + Get(relativeUrl string) (*http.Response, error) + Delete(relativeUrl string) error + Proxy(method string, relativeUrl string, payload []byte) (*http.Response, error) + ServerInfo() (*http.Response, error) + ServerURL() string + } + + RESTClient struct { + url string + } +) + +func NewRESTClient(serverUrl string) Interface { + return &RESTClient{ + url: strings.TrimSuffix(serverUrl, "/"), + } +} + +func (c *RESTClient) Create(relativeUrl string, contentType string, payload []byte) (*http.Response, error) { + var reader io.Reader + if len(payload) > 0 { + reader = bytes.NewReader(payload) + } + return c.sendRequest(http.MethodPost, c.v2CrdUrl(relativeUrl), map[string]string{"Content-type": contentType}, reader) +} + +func (c *RESTClient) Put(relativeUrl string, contentType string, payload []byte) (*http.Response, error) { + var reader io.Reader + if len(payload) > 0 { + reader = bytes.NewReader(payload) + } + return c.sendRequest(http.MethodPut, c.v2CrdUrl(relativeUrl), map[string]string{"Content-type": contentType}, reader) +} + +func (c *RESTClient) Get(relativeUrl string) (*http.Response, error) { + return c.sendRequest(http.MethodGet, c.v2CrdUrl(relativeUrl), nil, nil) +} + +func (c *RESTClient) Delete(relativeUrl string) error { + resp, err := c.sendRequest(http.MethodDelete, c.v2CrdUrl(relativeUrl), nil, nil) + if err != nil { + return err + } + defer resp.Body.Close() + + if resp.StatusCode != 200 { + body, err := ioutil.ReadAll(resp.Body) + if err != nil { + return errors.Wrap(err, "error deleting") + } else { + return errors.Errorf("failed to delete: %v", string(body)) + } + } + + return nil +} + +func (c *RESTClient) Proxy(method string, relativeUrl string, payload []byte) (*http.Response, error) { + var reader io.Reader + if len(payload) > 0 { + reader = bytes.NewReader(payload) + } + return c.sendRequest(method, c.proxyUrl(relativeUrl), nil, reader) +} + +func (c *RESTClient) ServerInfo() (*http.Response, error) { + return c.sendRequest(http.MethodGet, c.url, nil, nil) +} + +func (c *RESTClient) ServerURL() string { + return c.url +} + +func (c *RESTClient) sendRequest(method string, relativeUrl string, headers map[string]string, reader io.Reader) (*http.Response, error) { + req, err := http.NewRequest(method, relativeUrl, reader) + if err != nil { + return nil, err + } + for k, v := range headers { + req.Header.Set(k, v) + } + // TODO: accept context + return ctxhttp.Do(context.Background(), &http.Client{}, req) +} + +func (c *RESTClient) v2CrdUrl(relativeUrl string) string { + return c.url + "/v2/" + strings.TrimPrefix(relativeUrl, "/") +} + +func (c *RESTClient) proxyUrl(relativeUrl string) string { + return c.url + "/proxy/" + strings.TrimPrefix(relativeUrl, "/") +} diff --git a/pkg/controller/client/canaryconfig.go b/pkg/controller/client/v1/canaryconfig.go similarity index 60% rename from pkg/controller/client/canaryconfig.go rename to pkg/controller/client/v1/canaryconfig.go index a4584929..f237ae31 100644 --- a/pkg/controller/client/canaryconfig.go +++ b/pkg/controller/client/v1/canaryconfig.go @@ -14,30 +14,53 @@ See the License for the specific language governing permissions and limitations under the License. */ -package client +package v1 import ( "encoding/json" "fmt" + "github.com/fission/fission/pkg/controller/client/rest" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" fv1 "github.com/fission/fission/pkg/apis/fission.io/v1" ) -func (c *Client) CanaryConfigCreate(canaryConf *fv1.CanaryConfig) (*metav1.ObjectMeta, error) { +type ( + CanaryConfigGetter interface { + CanaryConfig() CanaryConfigInterface + } + + CanaryConfigInterface interface { + Create(canaryConf *fv1.CanaryConfig) (*metav1.ObjectMeta, error) + Get(m *metav1.ObjectMeta) (*fv1.CanaryConfig, error) + Update(canaryConf *fv1.CanaryConfig) (*metav1.ObjectMeta, error) + Delete(m *metav1.ObjectMeta) error + List(ns string) ([]fv1.CanaryConfig, error) + } + + CanaryConfig struct { + client rest.Interface + } +) + +func newCanaryConfigClient(c *V1) CanaryConfigInterface { + return &CanaryConfig{client: c.restClient} +} + +func (c *CanaryConfig) Create(canaryConf *fv1.CanaryConfig) (*metav1.ObjectMeta, error) { reqbody, err := json.Marshal(canaryConf) if err != nil { return nil, err } - resp, err := c.create("canaryconfigs", "application/json", reqbody) + resp, err := c.client.Create("canaryconfigs", "application/json", reqbody) if err != nil { return nil, err } defer resp.Body.Close() - body, err := c.handleCreateResponse(resp) + body, err := handleCreateResponse(resp) if err != nil { return nil, err } @@ -51,17 +74,17 @@ func (c *Client) CanaryConfigCreate(canaryConf *fv1.CanaryConfig) (*metav1.Objec return &m, nil } -func (c *Client) CanaryConfigGet(m *metav1.ObjectMeta) (*fv1.CanaryConfig, error) { +func (c *CanaryConfig) Get(m *metav1.ObjectMeta) (*fv1.CanaryConfig, error) { relativeUrl := fmt.Sprintf("canaryconfigs/%v", m.Name) relativeUrl += fmt.Sprintf("?namespace=%v", m.Namespace) - resp, err := c.get(relativeUrl) + resp, err := c.client.Get(relativeUrl) if err != nil { return nil, err } defer resp.Body.Close() - body, err := c.handleResponse(resp) + body, err := handleResponse(resp) if err != nil { return nil, err } @@ -75,20 +98,20 @@ func (c *Client) CanaryConfigGet(m *metav1.ObjectMeta) (*fv1.CanaryConfig, error return &canaryCfg, nil } -func (c *Client) CanaryConfigUpdate(canaryConf *fv1.CanaryConfig) (*metav1.ObjectMeta, error) { +func (c *CanaryConfig) Update(canaryConf *fv1.CanaryConfig) (*metav1.ObjectMeta, error) { reqbody, err := json.Marshal(canaryConf) if err != nil { return nil, err } relativeUrl := fmt.Sprintf("canaryconfigs/%v", canaryConf.Metadata.Name) - resp, err := c.put(relativeUrl, "application/json", reqbody) + resp, err := c.client.Put(relativeUrl, "application/json", reqbody) if err != nil { return nil, err } defer resp.Body.Close() - body, err := c.handleResponse(resp) + body, err := handleResponse(resp) if err != nil { return nil, err } @@ -101,21 +124,21 @@ func (c *Client) CanaryConfigUpdate(canaryConf *fv1.CanaryConfig) (*metav1.Objec return &m, nil } -func (c *Client) CanaryConfigDelete(m *metav1.ObjectMeta) error { +func (c *CanaryConfig) Delete(m *metav1.ObjectMeta) error { relativeUrl := fmt.Sprintf("canaryconfigs/%v", m.Name) relativeUrl += fmt.Sprintf("?namespace=%v", m.Namespace) - return c.delete(relativeUrl) + return c.client.Delete(relativeUrl) } -func (c *Client) CanaryConfigList(ns string) ([]fv1.CanaryConfig, error) { +func (c *CanaryConfig) List(ns string) ([]fv1.CanaryConfig, error) { relativeUrl := fmt.Sprintf("canaryconfigs?namespace=%v", ns) - resp, err := c.get(relativeUrl) + resp, err := c.client.Get(relativeUrl) if err != nil { return nil, err } defer resp.Body.Close() - body, err := c.handleResponse(resp) + body, err := handleResponse(resp) if err != nil { return nil, err } diff --git a/pkg/controller/client/environment.go b/pkg/controller/client/v1/environment.go similarity index 64% rename from pkg/controller/client/environment.go rename to pkg/controller/client/v1/environment.go index 02f152af..0c7eaa98 100644 --- a/pkg/controller/client/environment.go +++ b/pkg/controller/client/v1/environment.go @@ -14,11 +14,12 @@ See the License for the specific language governing permissions and limitations under the License. */ -package client +package v1 import ( "encoding/json" "fmt" + "github.com/fission/fission/pkg/controller/client/rest" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -27,6 +28,24 @@ import ( v1generator "github.com/fission/fission/pkg/generator/v1" ) +type ( + EnvironmentGetter interface { + Environment() EnvironmentInterface + } + + EnvironmentInterface interface { + Create(env *fv1.Environment) (*metav1.ObjectMeta, error) + Get(m *metav1.ObjectMeta) (*fv1.Environment, error) + Update(env *fv1.Environment) (*metav1.ObjectMeta, error) + Delete(m *metav1.ObjectMeta) error + List(ns string) ([]fv1.Environment, error) + } + + Environment struct { + client rest.Interface + } +) + func getEnvEncodingPayload(env *fv1.Environment) ([]byte, error) { generator, err := v1generator.CreateEnvironmentGeneratorFromObj(env) if err != nil { @@ -35,19 +54,23 @@ func getEnvEncodingPayload(env *fv1.Environment) ([]byte, error) { return generator.StructuredGenerate(encoder.DefaultJSONEncoder()) } -func (c *Client) EnvironmentCreate(env *fv1.Environment) (*metav1.ObjectMeta, error) { +func newEnvironmentClient(c *V1) EnvironmentInterface { + return &Environment{client: c.restClient} +} + +func (c *Environment) Create(env *fv1.Environment) (*metav1.ObjectMeta, error) { data, err := getEnvEncodingPayload(env) if err != nil { return nil, err } - resp, err := c.create("environments", "application/json", data) + resp, err := c.client.Create("environments", "application/json", data) if err != nil { return nil, err } defer resp.Body.Close() - body, err := c.handleCreateResponse(resp) + body, err := handleCreateResponse(resp) if err != nil { return nil, err } @@ -61,17 +84,17 @@ func (c *Client) EnvironmentCreate(env *fv1.Environment) (*metav1.ObjectMeta, er return &m, nil } -func (c *Client) EnvironmentGet(m *metav1.ObjectMeta) (*fv1.Environment, error) { +func (c *Environment) Get(m *metav1.ObjectMeta) (*fv1.Environment, error) { relativeUrl := fmt.Sprintf("environments/%v", m.Name) relativeUrl += fmt.Sprintf("?namespace=%v", m.Namespace) - resp, err := c.get(relativeUrl) + resp, err := c.client.Get(relativeUrl) if err != nil { return nil, err } defer resp.Body.Close() - body, err := c.handleResponse(resp) + body, err := handleResponse(resp) if err != nil { return nil, err } @@ -85,7 +108,7 @@ func (c *Client) EnvironmentGet(m *metav1.ObjectMeta) (*fv1.Environment, error) return &env, nil } -func (c *Client) EnvironmentUpdate(env *fv1.Environment) (*metav1.ObjectMeta, error) { +func (c *Environment) Update(env *fv1.Environment) (*metav1.ObjectMeta, error) { data, err := getEnvEncodingPayload(env) if err != nil { return nil, err @@ -93,13 +116,13 @@ func (c *Client) EnvironmentUpdate(env *fv1.Environment) (*metav1.ObjectMeta, er relativeUrl := fmt.Sprintf("environments/%v", env.Metadata.Name) - resp, err := c.put(relativeUrl, "application/json", data) + resp, err := c.client.Put(relativeUrl, "application/json", data) if err != nil { return nil, err } defer resp.Body.Close() - body, err := c.handleResponse(resp) + body, err := handleResponse(resp) if err != nil { return nil, err } @@ -112,21 +135,21 @@ func (c *Client) EnvironmentUpdate(env *fv1.Environment) (*metav1.ObjectMeta, er return &m, nil } -func (c *Client) EnvironmentDelete(m *metav1.ObjectMeta) error { +func (c *Environment) Delete(m *metav1.ObjectMeta) error { relativeUrl := fmt.Sprintf("environments/%v", m.Name) relativeUrl += fmt.Sprintf("?namespace=%v", m.Namespace) - return c.delete(relativeUrl) + return c.client.Delete(relativeUrl) } -func (c *Client) EnvironmentList(ns string) ([]fv1.Environment, error) { +func (c *Environment) List(ns string) ([]fv1.Environment, error) { relativeUrl := fmt.Sprintf("environments?namespace=%v", ns) - resp, err := c.get(relativeUrl) + resp, err := c.client.Get(relativeUrl) if err != nil { return nil, err } defer resp.Body.Close() - body, err := c.handleResponse(resp) + body, err := handleResponse(resp) if err != nil { return nil, err } diff --git a/pkg/controller/client/function.go b/pkg/controller/client/v1/function.go similarity index 58% rename from pkg/controller/client/function.go rename to pkg/controller/client/v1/function.go index 7ca7c6c6..19cdb721 100644 --- a/pkg/controller/client/function.go +++ b/pkg/controller/client/v1/function.go @@ -14,23 +14,42 @@ See the License for the specific language governing permissions and limitations under the License. */ -package client +package v1 import ( "encoding/json" "fmt" - "io" - "net/http" - "net/url" - "github.com/pkg/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" fv1 "github.com/fission/fission/pkg/apis/fission.io/v1" - "github.com/fission/fission/pkg/fission-cli/console" + "github.com/fission/fission/pkg/controller/client/rest" ) -func (c *Client) FunctionCreate(f *fv1.Function) (*metav1.ObjectMeta, error) { +type ( + FunctionGetter interface { + Function() FunctionInterface + } + + FunctionInterface interface { + Create(f *fv1.Function) (*metav1.ObjectMeta, error) + Get(m *metav1.ObjectMeta) (*fv1.Function, error) + GetRawDeployment(m *metav1.ObjectMeta) ([]byte, error) + Update(f *fv1.Function) (*metav1.ObjectMeta, error) + Delete(m *metav1.ObjectMeta) error + List(functionNamespace string) ([]fv1.Function, error) + } + + Function struct { + client rest.Interface + } +) + +func newFunctionClient(c *V1) FunctionInterface { + return &Function{client: c.restClient} +} + +func (c *Function) Create(f *fv1.Function) (*metav1.ObjectMeta, error) { err := f.Validate() if err != nil { return nil, fv1.AggregateValidationErrors("Function", err) @@ -41,13 +60,13 @@ func (c *Client) FunctionCreate(f *fv1.Function) (*metav1.ObjectMeta, error) { return nil, err } - resp, err := c.create("functions", "application/json", reqbody) + resp, err := c.client.Create("functions", "application/json", reqbody) if err != nil { return nil, err } defer resp.Body.Close() - body, err := c.handleCreateResponse(resp) + body, err := handleCreateResponse(resp) if err != nil { return nil, err } @@ -61,17 +80,17 @@ func (c *Client) FunctionCreate(f *fv1.Function) (*metav1.ObjectMeta, error) { return &m, nil } -func (c *Client) FunctionGet(m *metav1.ObjectMeta) (*fv1.Function, error) { +func (c *Function) Get(m *metav1.ObjectMeta) (*fv1.Function, error) { relativeUrl := fmt.Sprintf("functions/%v", m.Name) relativeUrl += fmt.Sprintf("?namespace=%v", m.Namespace) - resp, err := c.get(relativeUrl) + resp, err := c.client.Get(relativeUrl) if err != nil { return nil, err } defer resp.Body.Close() - body, err := c.handleResponse(resp) + body, err := handleResponse(resp) if err != nil { return nil, err } @@ -85,21 +104,21 @@ func (c *Client) FunctionGet(m *metav1.ObjectMeta) (*fv1.Function, error) { return &f, nil } -func (c *Client) FunctionGetRawDeployment(m *metav1.ObjectMeta) ([]byte, error) { +func (c *Function) GetRawDeployment(m *metav1.ObjectMeta) ([]byte, error) { relativeUrl := fmt.Sprintf("functions/%v", m.Name) relativeUrl += fmt.Sprintf("?namespace=%v", m.Namespace) relativeUrl += fmt.Sprintf("&deploymentraw=1") - resp, err := c.get(relativeUrl) + resp, err := c.client.Get(relativeUrl) if err != nil { return nil, err } defer resp.Body.Close() - return c.handleResponse(resp) + return handleResponse(resp) } -func (c *Client) FunctionUpdate(f *fv1.Function) (*metav1.ObjectMeta, error) { +func (c *Function) Update(f *fv1.Function) (*metav1.ObjectMeta, error) { err := f.Validate() if err != nil { return nil, fv1.AggregateValidationErrors("Function", err) @@ -111,13 +130,13 @@ func (c *Client) FunctionUpdate(f *fv1.Function) (*metav1.ObjectMeta, error) { } relativeUrl := fmt.Sprintf("functions/%v", f.Metadata.Name) - resp, err := c.put(relativeUrl, "application/json", reqbody) + resp, err := c.client.Put(relativeUrl, "application/json", reqbody) if err != nil { return nil, err } defer resp.Body.Close() - body, err := c.handleResponse(resp) + body, err := handleResponse(resp) if err != nil { return nil, err } @@ -130,21 +149,21 @@ func (c *Client) FunctionUpdate(f *fv1.Function) (*metav1.ObjectMeta, error) { return &m, nil } -func (c *Client) FunctionDelete(m *metav1.ObjectMeta) error { +func (c *Function) Delete(m *metav1.ObjectMeta) error { relativeUrl := fmt.Sprintf("functions/%v", m.Name) relativeUrl += fmt.Sprintf("?namespace=%v", m.Namespace) - return c.delete(relativeUrl) + return c.client.Delete(relativeUrl) } -func (c *Client) FunctionList(functionNamespace string) ([]fv1.Function, error) { +func (c *Function) List(functionNamespace string) ([]fv1.Function, error) { relativeUrl := fmt.Sprintf("functions?namespace=%v", functionNamespace) - resp, err := c.get(relativeUrl) + resp, err := c.client.Get(relativeUrl) if err != nil { return nil, err } defer resp.Body.Close() - body, err := c.handleResponse(resp) + body, err := handleResponse(resp) if err != nil { return nil, err } @@ -157,29 +176,3 @@ func (c *Client) FunctionList(functionNamespace string) ([]fv1.Function, error) return funcs, nil } - -func (c *Client) FunctionPodLogs(m *metav1.ObjectMeta) (io.ReadCloser, int, error) { - relativeUrl := fmt.Sprintf("functions/%v", m.Name) - relativeUrl += fmt.Sprintf("?namespace=%v", m.Namespace) - - queryURL, err := url.Parse(c.Url) - if err != nil { - return nil, 0, errors.Wrapf(err, "error parsing the base URL '%v'", c.Url) - } - queryURL.Path = fmt.Sprintf("/proxy/logs/%s", m.Name) - - console.Verbose(2, fmt.Sprintf("Try to get pod logs from controller '%v'", queryURL.String())) - - req, err := http.NewRequest(http.MethodPost, queryURL.String(), nil) - if err != nil { - return nil, 0, errors.Wrap(err, "error creating logs request") - } - - httpClient := http.Client{} - resp, err := httpClient.Do(req) - if err != nil { - return nil, 0, errors.Wrap(err, "error executing get logs request") - } - - return resp.Body, resp.StatusCode, nil -} diff --git a/pkg/controller/client/httptrigger.go b/pkg/controller/client/v1/httptrigger.go similarity index 62% rename from pkg/controller/client/httptrigger.go rename to pkg/controller/client/v1/httptrigger.go index b9971d3c..12acbcbe 100644 --- a/pkg/controller/client/httptrigger.go +++ b/pkg/controller/client/v1/httptrigger.go @@ -14,18 +14,41 @@ See the License for the specific language governing permissions and limitations under the License. */ -package client +package v1 import ( "encoding/json" "fmt" + "github.com/fission/fission/pkg/controller/client/rest" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" fv1 "github.com/fission/fission/pkg/apis/fission.io/v1" ) -func (c *Client) HTTPTriggerCreate(t *fv1.HTTPTrigger) (*metav1.ObjectMeta, error) { +type ( + HTTPTriggerGetter interface { + HTTPTrigger() HTTPTriggerInterface + } + + HTTPTriggerInterface interface { + Create(t *fv1.HTTPTrigger) (*metav1.ObjectMeta, error) + Get(m *metav1.ObjectMeta) (*fv1.HTTPTrigger, error) + Update(t *fv1.HTTPTrigger) (*metav1.ObjectMeta, error) + Delete(m *metav1.ObjectMeta) error + List(triggerNamespace string) ([]fv1.HTTPTrigger, error) + } + + HTTPTrigger struct { + client rest.Interface + } +) + +func newHTTPTriggerClient(c *V1) HTTPTriggerInterface { + return &HTTPTrigger{client: c.restClient} +} + +func (c *HTTPTrigger) Create(t *fv1.HTTPTrigger) (*metav1.ObjectMeta, error) { err := t.Validate() if err != nil { return nil, fv1.AggregateValidationErrors("HTTPTrigger", err) @@ -36,13 +59,13 @@ func (c *Client) HTTPTriggerCreate(t *fv1.HTTPTrigger) (*metav1.ObjectMeta, erro return nil, err } - resp, err := c.create("triggers/http", "application/json", reqbody) + resp, err := c.client.Create("triggers/http", "application/json", reqbody) if err != nil { return nil, err } defer resp.Body.Close() - body, err := c.handleCreateResponse(resp) + body, err := handleCreateResponse(resp) if err != nil { return nil, err } @@ -56,17 +79,17 @@ func (c *Client) HTTPTriggerCreate(t *fv1.HTTPTrigger) (*metav1.ObjectMeta, erro return &m, nil } -func (c *Client) HTTPTriggerGet(m *metav1.ObjectMeta) (*fv1.HTTPTrigger, error) { +func (c *HTTPTrigger) Get(m *metav1.ObjectMeta) (*fv1.HTTPTrigger, error) { relativeUrl := fmt.Sprintf("triggers/http/%v", m.Name) relativeUrl += fmt.Sprintf("?namespace=%v", m.Namespace) - resp, err := c.get(relativeUrl) + resp, err := c.client.Get(relativeUrl) if err != nil { return nil, err } defer resp.Body.Close() - body, err := c.handleResponse(resp) + body, err := handleResponse(resp) if err != nil { return nil, err } @@ -80,7 +103,7 @@ func (c *Client) HTTPTriggerGet(m *metav1.ObjectMeta) (*fv1.HTTPTrigger, error) return &t, nil } -func (c *Client) HTTPTriggerUpdate(t *fv1.HTTPTrigger) (*metav1.ObjectMeta, error) { +func (c *HTTPTrigger) Update(t *fv1.HTTPTrigger) (*metav1.ObjectMeta, error) { err := t.Validate() if err != nil { return nil, fv1.AggregateValidationErrors("HTTPTrigger", err) @@ -92,13 +115,13 @@ func (c *Client) HTTPTriggerUpdate(t *fv1.HTTPTrigger) (*metav1.ObjectMeta, erro } relativeUrl := fmt.Sprintf("triggers/http/%v", t.Metadata.Name) - resp, err := c.put(relativeUrl, "application/json", reqbody) + resp, err := c.client.Put(relativeUrl, "application/json", reqbody) if err != nil { return nil, err } defer resp.Body.Close() - body, err := c.handleResponse(resp) + body, err := handleResponse(resp) if err != nil { return nil, err } @@ -111,21 +134,21 @@ func (c *Client) HTTPTriggerUpdate(t *fv1.HTTPTrigger) (*metav1.ObjectMeta, erro return &m, nil } -func (c *Client) HTTPTriggerDelete(m *metav1.ObjectMeta) error { +func (c *HTTPTrigger) Delete(m *metav1.ObjectMeta) error { relativeUrl := fmt.Sprintf("triggers/http/%v", m.Name) relativeUrl += fmt.Sprintf("?namespace=%v", m.Namespace) - return c.delete(relativeUrl) + return c.client.Delete(relativeUrl) } -func (c *Client) HTTPTriggerList(triggerNamespace string) ([]fv1.HTTPTrigger, error) { +func (c *HTTPTrigger) List(triggerNamespace string) ([]fv1.HTTPTrigger, error) { relativeUrl := fmt.Sprintf("triggers/http?namespace=%v", triggerNamespace) - resp, err := c.get(relativeUrl) + resp, err := c.client.Get(relativeUrl) if err != nil { return nil, err } defer resp.Body.Close() - body, err := c.handleResponse(resp) + body, err := handleResponse(resp) if err != nil { return nil, err } diff --git a/pkg/controller/client/kuberneteswatchtrigger.go b/pkg/controller/client/v1/kuberneteswatchtrigger.go similarity index 62% rename from pkg/controller/client/kuberneteswatchtrigger.go rename to pkg/controller/client/v1/kuberneteswatchtrigger.go index 67836a30..7a988314 100644 --- a/pkg/controller/client/kuberneteswatchtrigger.go +++ b/pkg/controller/client/v1/kuberneteswatchtrigger.go @@ -14,11 +14,12 @@ See the License for the specific language governing permissions and limitations under the License. */ -package client +package v1 import ( "encoding/json" "fmt" + "github.com/fission/fission/pkg/controller/client/rest" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -26,7 +27,29 @@ import ( ferror "github.com/fission/fission/pkg/error" ) -func (c *Client) WatchCreate(w *fv1.KubernetesWatchTrigger) (*metav1.ObjectMeta, error) { +type ( + KubeWatcherGetter interface { + KubeWatcher() KubeWatcherInterface + } + + KubeWatcherInterface interface { + Create(w *fv1.KubernetesWatchTrigger) (*metav1.ObjectMeta, error) + Get(m *metav1.ObjectMeta) (*fv1.KubernetesWatchTrigger, error) + Update(w *fv1.KubernetesWatchTrigger) (*metav1.ObjectMeta, error) + Delete(m *metav1.ObjectMeta) error + List(ns string) ([]fv1.KubernetesWatchTrigger, error) + } + + KubeWatcher struct { + client rest.Interface + } +) + +func newKubeWatcher(c *V1) KubeWatcherInterface { + return &KubeWatcher{client: c.restClient} +} + +func (c *KubeWatcher) Create(w *fv1.KubernetesWatchTrigger) (*metav1.ObjectMeta, error) { err := w.Validate() if err != nil { return nil, fv1.AggregateValidationErrors("KubernetesWatchTrigger", err) @@ -37,13 +60,13 @@ func (c *Client) WatchCreate(w *fv1.KubernetesWatchTrigger) (*metav1.ObjectMeta, return nil, err } - resp, err := c.create("watches", "application/json", reqbody) + resp, err := c.client.Create("watches", "application/json", reqbody) if err != nil { return nil, err } defer resp.Body.Close() - body, err := c.handleCreateResponse(resp) + body, err := handleCreateResponse(resp) if err != nil { return nil, err } @@ -57,17 +80,17 @@ func (c *Client) WatchCreate(w *fv1.KubernetesWatchTrigger) (*metav1.ObjectMeta, return &m, nil } -func (c *Client) WatchGet(m *metav1.ObjectMeta) (*fv1.KubernetesWatchTrigger, error) { +func (c *KubeWatcher) Get(m *metav1.ObjectMeta) (*fv1.KubernetesWatchTrigger, error) { relativeUrl := fmt.Sprintf("watches/%v", m.Name) relativeUrl += fmt.Sprintf("?namespace=%v", m.Namespace) - resp, err := c.get(relativeUrl) + resp, err := c.client.Get(relativeUrl) if err != nil { return nil, err } defer resp.Body.Close() - body, err := c.handleResponse(resp) + body, err := handleResponse(resp) if err != nil { return nil, err } @@ -81,25 +104,25 @@ func (c *Client) WatchGet(m *metav1.ObjectMeta) (*fv1.KubernetesWatchTrigger, er return &w, nil } -func (c *Client) WatchUpdate(w *fv1.KubernetesWatchTrigger) (*metav1.ObjectMeta, error) { +func (c *KubeWatcher) Update(w *fv1.KubernetesWatchTrigger) (*metav1.ObjectMeta, error) { return nil, ferror.MakeError(ferror.ErrorNotImplmented, "watch update not implemented") } -func (c *Client) WatchDelete(m *metav1.ObjectMeta) error { +func (c *KubeWatcher) Delete(m *metav1.ObjectMeta) error { relativeUrl := fmt.Sprintf("watches/%v", m.Name) relativeUrl += fmt.Sprintf("?namespace=%v", m.Namespace) - return c.delete(relativeUrl) + return c.client.Delete(relativeUrl) } -func (c *Client) WatchList(ns string) ([]fv1.KubernetesWatchTrigger, error) { +func (c *KubeWatcher) List(ns string) ([]fv1.KubernetesWatchTrigger, error) { relativeUrl := fmt.Sprintf("watches?namespace=%v", ns) - resp, err := c.get(relativeUrl) + resp, err := c.client.Get(relativeUrl) if err != nil { return nil, err } defer resp.Body.Close() - body, err := c.handleResponse(resp) + body, err := handleResponse(resp) if err != nil { return nil, err } diff --git a/pkg/controller/client/core.go b/pkg/controller/client/v1/misc.go similarity index 55% rename from pkg/controller/client/core.go rename to pkg/controller/client/v1/misc.go index 02423737..3d7b1fef 100644 --- a/pkg/controller/client/core.go +++ b/pkg/controller/client/v1/misc.go @@ -14,35 +14,58 @@ See the License for the specific language governing permissions and limitations under the License. */ -package client +package v1 import ( - "context" "encoding/json" "fmt" + "io" "io/ioutil" "net/http" - "time" "github.com/pkg/errors" - "golang.org/x/net/context/ctxhttp" apiv1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "github.com/fission/fission/pkg/controller/client/rest" + "github.com/fission/fission/pkg/fission-cli/console" "github.com/fission/fission/pkg/info" ) -func (c *Client) SecretGet(m *metav1.ObjectMeta) (*apiv1.Secret, error) { +// TODO: we should remove this interface, having this for now is for backward compatibility. +type ( + MiscGetter interface { + Misc() MiscInterface + } + + MiscInterface interface { + SecretGet(m *metav1.ObjectMeta) (*apiv1.Secret, error) + ConfigMapGet(m *metav1.ObjectMeta) (*apiv1.ConfigMap, error) + GetSvcURL(label string) (string, error) + ServerInfo() (*info.ServerInfo, error) + PodLogs(m *metav1.ObjectMeta) (io.ReadCloser, int, error) + } + + Misc struct { + client rest.Interface + } +) + +func newMiscClient(c *V1) MiscInterface { + return &Misc{client: c.restClient} +} + +func (c *Misc) SecretGet(m *metav1.ObjectMeta) (*apiv1.Secret, error) { relativeUrl := fmt.Sprintf("secrets/%v", m.Name) relativeUrl += fmt.Sprintf("?namespace=%v", m.Namespace) - resp, err := c.get(relativeUrl) + resp, err := c.client.Get(relativeUrl) if err != nil { return nil, err } defer resp.Body.Close() - body, err := c.handleResponse(resp) + body, err := handleResponse(resp) if err != nil { return nil, err } @@ -56,17 +79,17 @@ func (c *Client) SecretGet(m *metav1.ObjectMeta) (*apiv1.Secret, error) { return &secret, nil } -func (c *Client) ConfigMapGet(m *metav1.ObjectMeta) (*apiv1.ConfigMap, error) { +func (c *Misc) ConfigMapGet(m *metav1.ObjectMeta) (*apiv1.ConfigMap, error) { relativeUrl := fmt.Sprintf("configmaps/%v", m.Name) relativeUrl += fmt.Sprintf("?namespace=%v", m.Namespace) - resp, err := c.get(relativeUrl) + resp, err := c.client.Get(relativeUrl) if err != nil { return nil, err } defer resp.Body.Close() - body, err := c.handleResponse(resp) + body, err := handleResponse(resp) if err != nil { return nil, err } @@ -80,8 +103,8 @@ func (c *Client) ConfigMapGet(m *metav1.ObjectMeta) (*apiv1.ConfigMap, error) { return &configMap, nil } -func (c *Client) GetSvcURL(label string) (string, error) { - resp, err := c.proxy(http.MethodGet, "svcname?"+label, nil) +func (c *Misc) GetSvcURL(label string) (string, error) { + resp, err := c.client.Proxy(http.MethodGet, "svcname?"+label, nil) if err != nil { return "", err } @@ -100,11 +123,8 @@ func (c *Client) GetSvcURL(label string) (string, error) { return storageSvc, err } -func (c *Client) ServerInfo() (*info.ServerInfo, error) { - ctx, cancel := context.WithTimeout(context.Background(), 15*time.Second) - defer cancel() - - resp, err := ctxhttp.Get(ctx, &http.Client{}, c.Url) +func (c *Misc) ServerInfo() (*info.ServerInfo, error) { + resp, err := c.client.ServerInfo() if err != nil { return nil, err } @@ -123,3 +143,13 @@ func (c *Client) ServerInfo() (*info.ServerInfo, error) { return info, nil } + +func (c *Misc) PodLogs(m *metav1.ObjectMeta) (io.ReadCloser, int, error) { + uri := fmt.Sprintf("logs/%s", m.Name) + console.Verbose(2, fmt.Sprintf("Try to get pod logs from controller '%v'", uri)) + resp, err := c.client.Proxy(http.MethodPost, uri, nil) + if err != nil { + return nil, 0, errors.Wrap(err, "error executing get logs request") + } + return resp.Body, resp.StatusCode, nil +} diff --git a/pkg/controller/client/mqtrigger.go b/pkg/controller/client/v1/mqtrigger.go similarity index 62% rename from pkg/controller/client/mqtrigger.go rename to pkg/controller/client/v1/mqtrigger.go index 9b37bc3c..0eaf10ea 100644 --- a/pkg/controller/client/mqtrigger.go +++ b/pkg/controller/client/v1/mqtrigger.go @@ -14,18 +14,41 @@ See the License for the specific language governing permissions and limitations under the License. */ -package client +package v1 import ( "encoding/json" "fmt" + "github.com/fission/fission/pkg/controller/client/rest" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" fv1 "github.com/fission/fission/pkg/apis/fission.io/v1" ) -func (c *Client) MessageQueueTriggerCreate(t *fv1.MessageQueueTrigger) (*metav1.ObjectMeta, error) { +type ( + MessageQueueTriggerGetter interface { + MessageQueueTrigger() MessageQueueTriggerInterface + } + + MessageQueueTriggerInterface interface { + Create(t *fv1.MessageQueueTrigger) (*metav1.ObjectMeta, error) + Get(m *metav1.ObjectMeta) (*fv1.MessageQueueTrigger, error) + Update(mqTrigger *fv1.MessageQueueTrigger) (*metav1.ObjectMeta, error) + Delete(m *metav1.ObjectMeta) error + List(mqType string, ns string) ([]fv1.MessageQueueTrigger, error) + } + + MessageQueueTrigger struct { + client rest.Interface + } +) + +func newMessageQueueTrigger(c *V1) MessageQueueTriggerInterface { + return &MessageQueueTrigger{client: c.restClient} +} + +func (c *MessageQueueTrigger) Create(t *fv1.MessageQueueTrigger) (*metav1.ObjectMeta, error) { err := t.Validate() if err != nil { return nil, fv1.AggregateValidationErrors("MessageQueueTrigger", err) @@ -36,13 +59,13 @@ func (c *Client) MessageQueueTriggerCreate(t *fv1.MessageQueueTrigger) (*metav1. return nil, err } - resp, err := c.create("triggers/messagequeue", "application/json", reqbody) + resp, err := c.client.Create("triggers/messagequeue", "application/json", reqbody) if err != nil { return nil, err } defer resp.Body.Close() - body, err := c.handleCreateResponse(resp) + body, err := handleCreateResponse(resp) if err != nil { return nil, err } @@ -56,17 +79,17 @@ func (c *Client) MessageQueueTriggerCreate(t *fv1.MessageQueueTrigger) (*metav1. return &m, nil } -func (c *Client) MessageQueueTriggerGet(m *metav1.ObjectMeta) (*fv1.MessageQueueTrigger, error) { +func (c *MessageQueueTrigger) Get(m *metav1.ObjectMeta) (*fv1.MessageQueueTrigger, error) { relativeUrl := fmt.Sprintf("triggers/messagequeue/%v", m.Name) relativeUrl += fmt.Sprintf("?namespace=%v", m.Namespace) - resp, err := c.get(relativeUrl) + resp, err := c.client.Get(relativeUrl) if err != nil { return nil, err } defer resp.Body.Close() - body, err := c.handleResponse(resp) + body, err := handleResponse(resp) if err != nil { return nil, err } @@ -80,7 +103,7 @@ func (c *Client) MessageQueueTriggerGet(m *metav1.ObjectMeta) (*fv1.MessageQueue return &t, nil } -func (c *Client) MessageQueueTriggerUpdate(mqTrigger *fv1.MessageQueueTrigger) (*metav1.ObjectMeta, error) { +func (c *MessageQueueTrigger) Update(mqTrigger *fv1.MessageQueueTrigger) (*metav1.ObjectMeta, error) { err := mqTrigger.Validate() if err != nil { return nil, fv1.AggregateValidationErrors("MessageQueueTrigger", err) @@ -92,13 +115,13 @@ func (c *Client) MessageQueueTriggerUpdate(mqTrigger *fv1.MessageQueueTrigger) ( } relativeUrl := fmt.Sprintf("triggers/messagequeue/%v", mqTrigger.Metadata.Name) - resp, err := c.put(relativeUrl, "application/json", reqbody) + resp, err := c.client.Put(relativeUrl, "application/json", reqbody) if err != nil { return nil, err } defer resp.Body.Close() - body, err := c.handleResponse(resp) + body, err := handleResponse(resp) if err != nil { return nil, err } @@ -111,26 +134,26 @@ func (c *Client) MessageQueueTriggerUpdate(mqTrigger *fv1.MessageQueueTrigger) ( return &m, nil } -func (c *Client) MessageQueueTriggerDelete(m *metav1.ObjectMeta) error { +func (c *MessageQueueTrigger) Delete(m *metav1.ObjectMeta) error { relativeUrl := fmt.Sprintf("triggers/messagequeue/%v", m.Name) relativeUrl += fmt.Sprintf("?namespace=%v", m.Namespace) - return c.delete(relativeUrl) + return c.client.Delete(relativeUrl) } -func (c *Client) MessageQueueTriggerList(mqType string, ns string) ([]fv1.MessageQueueTrigger, error) { +func (c *MessageQueueTrigger) List(mqType string, ns string) ([]fv1.MessageQueueTrigger, error) { relativeUrl := "triggers/messagequeue" if len(mqType) > 0 { // TODO remove this, replace with field selector relativeUrl += fmt.Sprintf("?mqtype=%v&namespace=%v", mqType, ns) } - resp, err := c.get(relativeUrl) + resp, err := c.client.Get(relativeUrl) if err != nil { return nil, err } defer resp.Body.Close() - body, err := c.handleResponse(resp) + body, err := handleResponse(resp) if err != nil { return nil, err } diff --git a/pkg/controller/client/package.go b/pkg/controller/client/v1/package.go similarity index 63% rename from pkg/controller/client/package.go rename to pkg/controller/client/v1/package.go index cd28bb47..087c2a29 100644 --- a/pkg/controller/client/package.go +++ b/pkg/controller/client/v1/package.go @@ -14,18 +14,41 @@ See the License for the specific language governing permissions and limitations under the License. */ -package client +package v1 import ( "encoding/json" "fmt" + "github.com/fission/fission/pkg/controller/client/rest" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" fv1 "github.com/fission/fission/pkg/apis/fission.io/v1" ) -func (c *Client) PackageCreate(f *fv1.Package) (*metav1.ObjectMeta, error) { +type ( + PackageGetter interface { + Package() PackageInterface + } + + PackageInterface interface { + Create(f *fv1.Package) (*metav1.ObjectMeta, error) + Get(m *metav1.ObjectMeta) (*fv1.Package, error) + Update(f *fv1.Package) (*metav1.ObjectMeta, error) + Delete(m *metav1.ObjectMeta) error + List(pkgNamespace string) ([]fv1.Package, error) + } + + Package struct { + client rest.Interface + } +) + +func newPackageClient(c *V1) PackageInterface { + return &Package{client: c.restClient} +} + +func (c *Package) Create(f *fv1.Package) (*metav1.ObjectMeta, error) { err := f.Validate() if err != nil { return nil, fv1.AggregateValidationErrors("Package", err) @@ -36,13 +59,13 @@ func (c *Client) PackageCreate(f *fv1.Package) (*metav1.ObjectMeta, error) { return nil, err } - resp, err := c.create("packages", "application/json", reqbody) + resp, err := c.client.Create("packages", "application/json", reqbody) if err != nil { return nil, err } defer resp.Body.Close() - body, err := c.handleCreateResponse(resp) + body, err := handleCreateResponse(resp) if err != nil { return nil, err } @@ -56,17 +79,17 @@ func (c *Client) PackageCreate(f *fv1.Package) (*metav1.ObjectMeta, error) { return &m, nil } -func (c *Client) PackageGet(m *metav1.ObjectMeta) (*fv1.Package, error) { +func (c *Package) Get(m *metav1.ObjectMeta) (*fv1.Package, error) { relativeUrl := fmt.Sprintf("packages/%v", m.Name) relativeUrl += fmt.Sprintf("?namespace=%v", m.Namespace) - resp, err := c.get(relativeUrl) + resp, err := c.client.Get(relativeUrl) if err != nil { return nil, err } defer resp.Body.Close() - body, err := c.handleResponse(resp) + body, err := handleResponse(resp) if err != nil { return nil, err } @@ -80,7 +103,7 @@ func (c *Client) PackageGet(m *metav1.ObjectMeta) (*fv1.Package, error) { return &f, nil } -func (c *Client) PackageUpdate(f *fv1.Package) (*metav1.ObjectMeta, error) { +func (c *Package) Update(f *fv1.Package) (*metav1.ObjectMeta, error) { err := f.Validate() if err != nil { return nil, fv1.AggregateValidationErrors("Package", err) @@ -92,13 +115,13 @@ func (c *Client) PackageUpdate(f *fv1.Package) (*metav1.ObjectMeta, error) { } relativeUrl := fmt.Sprintf("packages/%v", f.Metadata.Name) - resp, err := c.put(relativeUrl, "application/json", reqbody) + resp, err := c.client.Put(relativeUrl, "application/json", reqbody) if err != nil { return nil, err } defer resp.Body.Close() - body, err := c.handleResponse(resp) + body, err := handleResponse(resp) if err != nil { return nil, err } @@ -111,21 +134,21 @@ func (c *Client) PackageUpdate(f *fv1.Package) (*metav1.ObjectMeta, error) { return &m, nil } -func (c *Client) PackageDelete(m *metav1.ObjectMeta) error { +func (c *Package) Delete(m *metav1.ObjectMeta) error { relativeUrl := fmt.Sprintf("packages/%v", m.Name) relativeUrl += fmt.Sprintf("?namespace=%v", m.Namespace) - return c.delete(relativeUrl) + return c.client.Delete(relativeUrl) } -func (c *Client) PackageList(pkgNamespace string) ([]fv1.Package, error) { +func (c *Package) List(pkgNamespace string) ([]fv1.Package, error) { relativeUrl := fmt.Sprintf("packages?namespace=%v", pkgNamespace) - resp, err := c.get(relativeUrl) + resp, err := c.client.Get(relativeUrl) if err != nil { return nil, err } defer resp.Body.Close() - body, err := c.handleResponse(resp) + body, err := handleResponse(resp) if err != nil { return nil, err } diff --git a/pkg/controller/client/timetrigger.go b/pkg/controller/client/v1/timetrigger.go similarity index 63% rename from pkg/controller/client/timetrigger.go rename to pkg/controller/client/v1/timetrigger.go index b36200aa..db5e5468 100644 --- a/pkg/controller/client/timetrigger.go +++ b/pkg/controller/client/v1/timetrigger.go @@ -14,18 +14,41 @@ See the License for the specific language governing permissions and limitations under the License. */ -package client +package v1 import ( "encoding/json" "fmt" + "github.com/fission/fission/pkg/controller/client/rest" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" fv1 "github.com/fission/fission/pkg/apis/fission.io/v1" ) -func (c *Client) TimeTriggerCreate(t *fv1.TimeTrigger) (*metav1.ObjectMeta, error) { +type ( + TimeTriggerGetter interface { + TimeTrigger() TimeTriggerInterface + } + + TimeTriggerInterface interface { + Create(t *fv1.TimeTrigger) (*metav1.ObjectMeta, error) + Get(m *metav1.ObjectMeta) (*fv1.TimeTrigger, error) + Update(t *fv1.TimeTrigger) (*metav1.ObjectMeta, error) + Delete(m *metav1.ObjectMeta) error + List(ns string) ([]fv1.TimeTrigger, error) + } + + TimeTrigger struct { + client rest.Interface + } +) + +func newTimeTriggerClient(c *V1) TimeTriggerInterface { + return &TimeTrigger{client: c.restClient} +} + +func (c *TimeTrigger) Create(t *fv1.TimeTrigger) (*metav1.ObjectMeta, error) { err := t.Validate() if err != nil { return nil, fv1.AggregateValidationErrors("TimeTrigger", err) @@ -36,13 +59,13 @@ func (c *Client) TimeTriggerCreate(t *fv1.TimeTrigger) (*metav1.ObjectMeta, erro return nil, err } - resp, err := c.create("triggers/time", "application/json", reqbody) + resp, err := c.client.Create("triggers/time", "application/json", reqbody) if err != nil { return nil, err } defer resp.Body.Close() - body, err := c.handleCreateResponse(resp) + body, err := handleCreateResponse(resp) if err != nil { return nil, err } @@ -56,17 +79,17 @@ func (c *Client) TimeTriggerCreate(t *fv1.TimeTrigger) (*metav1.ObjectMeta, erro return &m, nil } -func (c *Client) TimeTriggerGet(m *metav1.ObjectMeta) (*fv1.TimeTrigger, error) { +func (c *TimeTrigger) Get(m *metav1.ObjectMeta) (*fv1.TimeTrigger, error) { relativeUrl := fmt.Sprintf("triggers/time/%v", m.Name) relativeUrl += fmt.Sprintf("?namespace=%v", m.Namespace) - resp, err := c.get(relativeUrl) + resp, err := c.client.Get(relativeUrl) if err != nil { return nil, err } defer resp.Body.Close() - body, err := c.handleResponse(resp) + body, err := handleResponse(resp) if err != nil { return nil, err } @@ -80,7 +103,7 @@ func (c *Client) TimeTriggerGet(m *metav1.ObjectMeta) (*fv1.TimeTrigger, error) return &t, nil } -func (c *Client) TimeTriggerUpdate(t *fv1.TimeTrigger) (*metav1.ObjectMeta, error) { +func (c *TimeTrigger) Update(t *fv1.TimeTrigger) (*metav1.ObjectMeta, error) { err := t.Validate() if err != nil { return nil, fv1.AggregateValidationErrors("TimeTrigger", err) @@ -92,13 +115,13 @@ func (c *Client) TimeTriggerUpdate(t *fv1.TimeTrigger) (*metav1.ObjectMeta, erro } relativeUrl := fmt.Sprintf("triggers/time/%v", t.Metadata.Name) - resp, err := c.put(relativeUrl, "application/json", reqbody) + resp, err := c.client.Put(relativeUrl, "application/json", reqbody) if err != nil { return nil, err } defer resp.Body.Close() - body, err := c.handleResponse(resp) + body, err := handleResponse(resp) if err != nil { return nil, err } @@ -111,21 +134,21 @@ func (c *Client) TimeTriggerUpdate(t *fv1.TimeTrigger) (*metav1.ObjectMeta, erro return &m, nil } -func (c *Client) TimeTriggerDelete(m *metav1.ObjectMeta) error { +func (c *TimeTrigger) Delete(m *metav1.ObjectMeta) error { relativeUrl := fmt.Sprintf("triggers/time/%v", m.Name) relativeUrl += fmt.Sprintf("?namespace=%v", m.Namespace) - return c.delete(relativeUrl) + return c.client.Delete(relativeUrl) } -func (c *Client) TimeTriggerList(ns string) ([]fv1.TimeTrigger, error) { +func (c *TimeTrigger) List(ns string) ([]fv1.TimeTrigger, error) { relativeUrl := fmt.Sprintf("triggers/time?namespace=%v", ns) - resp, err := c.get(relativeUrl) + resp, err := c.client.Get(relativeUrl) if err != nil { return nil, err } defer resp.Body.Close() - body, err := c.handleResponse(resp) + body, err := handleResponse(resp) if err != nil { return nil, err } diff --git a/pkg/controller/client/v1/v1.go b/pkg/controller/client/v1/v1.go new file mode 100644 index 00000000..b803a519 --- /dev/null +++ b/pkg/controller/client/v1/v1.go @@ -0,0 +1,100 @@ +/* +Copyright 2019 The Fission Authors. + +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 v1 + +import ( + "io/ioutil" + "net/http" + + ferror "github.com/fission/fission/pkg/error" + + "github.com/fission/fission/pkg/controller/client/rest" +) + +type ( + V1Interface interface { + MiscGetter + CanaryConfigGetter + EnvironmentGetter + FunctionGetter + HTTPTriggerGetter + KubeWatcherGetter + MessageQueueTriggerGetter + PackageGetter + TimeTriggerGetter + } + + V1 struct { + restClient rest.Interface + } +) + +func MakeV1Client(restClient rest.Interface) *V1 { + return &V1{restClient: restClient} +} + +func (c *V1) Misc() MiscInterface { + return newMiscClient(c) +} + +func (c *V1) CanaryConfig() CanaryConfigInterface { + return newCanaryConfigClient(c) +} + +func (c *V1) Environment() EnvironmentInterface { + return newEnvironmentClient(c) +} + +func (c *V1) Function() FunctionInterface { + return newFunctionClient(c) +} + +func (c *V1) HTTPTrigger() HTTPTriggerInterface { + return newHTTPTriggerClient(c) +} + +func (c *V1) KubeWatcher() KubeWatcherInterface { + return newKubeWatcher(c) +} + +func (c *V1) MessageQueueTrigger() MessageQueueTriggerInterface { + return newMessageQueueTrigger(c) +} + +func (c *V1) Package() PackageInterface { + return newPackageClient(c) +} + +func (c *V1) TimeTrigger() TimeTriggerInterface { + return newTimeTriggerClient(c) +} + +func handleResponse(resp *http.Response) ([]byte, error) { + if resp.StatusCode != 200 { + return nil, ferror.MakeErrorFromHTTP(resp) + } + body, err := ioutil.ReadAll(resp.Body) + return body, err +} + +func handleCreateResponse(resp *http.Response) ([]byte, error) { + if resp.StatusCode != 201 { + return nil, ferror.MakeErrorFromHTTP(resp) + } + body, err := ioutil.ReadAll(resp.Body) + return body, err +} diff --git a/pkg/fission-cli/cmd/canaryconfig/create.go b/pkg/fission-cli/cmd/canaryconfig/create.go index 635faa55..6a7570fb 100644 --- a/pkg/fission-cli/cmd/canaryconfig/create.go +++ b/pkg/fission-cli/cmd/canaryconfig/create.go @@ -24,27 +24,20 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" fv1 "github.com/fission/fission/pkg/apis/fission.io/v1" - "github.com/fission/fission/pkg/controller/client" "github.com/fission/fission/pkg/fission-cli/cliwrapper/cli" + "github.com/fission/fission/pkg/fission-cli/cmd" flagkey "github.com/fission/fission/pkg/fission-cli/flag/key" "github.com/fission/fission/pkg/fission-cli/util" "github.com/fission/fission/pkg/types" ) type CreateSubCommand struct { - client *client.Client + cmd.CommandActioner canary *fv1.CanaryConfig } func Create(input cli.Input) error { - c, err := util.GetServer(input) - if err != nil { - return err - } - opts := CreateSubCommand{ - client: c, - } - return opts.do(input) + return (&CreateSubCommand{}).do(input) } func (opts *CreateSubCommand) do(input cli.Input) error { @@ -74,7 +67,7 @@ func (opts *CreateSubCommand) complete(input cli.Input) error { } // check that the trigger exists in the same namespace. - htTrigger, err := opts.client.HTTPTriggerGet(&metav1.ObjectMeta{ + htTrigger, err := opts.Client().V1().HTTPTrigger().Get(&metav1.ObjectMeta{ Name: ht, Namespace: fnNs, }) @@ -100,7 +93,7 @@ func (opts *CreateSubCommand) complete(input cli.Input) error { // check that the functions exist in the same namespace fnList := []string{newFunc, oldFunc} - err = util.CheckFunctionExistence(opts.client, fnList, fnNs) + err = util.CheckFunctionExistence(opts.Client(), fnList, fnNs) if err != nil { return errors.Wrap(err, "error checking functions existence") } @@ -129,7 +122,7 @@ func (opts *CreateSubCommand) complete(input cli.Input) error { } func (opts *CreateSubCommand) run(input cli.Input) error { - _, err := opts.client.CanaryConfigCreate(opts.canary) + _, err := opts.Client().V1().CanaryConfig().Create(opts.canary) if err != nil { return errors.Wrap(err, "error creating canary config") } diff --git a/pkg/fission-cli/cmd/canaryconfig/delete.go b/pkg/fission-cli/cmd/canaryconfig/delete.go index 2d0cf771..ea57f343 100644 --- a/pkg/fission-cli/cmd/canaryconfig/delete.go +++ b/pkg/fission-cli/cmd/canaryconfig/delete.go @@ -22,25 +22,17 @@ import ( "github.com/pkg/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "github.com/fission/fission/pkg/controller/client" "github.com/fission/fission/pkg/fission-cli/cliwrapper/cli" + "github.com/fission/fission/pkg/fission-cli/cmd" flagkey "github.com/fission/fission/pkg/fission-cli/flag/key" - "github.com/fission/fission/pkg/fission-cli/util" ) type DeleteSubCommand struct { - client *client.Client + cmd.CommandActioner } func Delete(input cli.Input) error { - c, err := util.GetServer(input) - if err != nil { - return err - } - opts := DeleteSubCommand{ - client: c, - } - return opts.run(input) + return (&DeleteSubCommand{}).run(input) } func (opts *DeleteSubCommand) run(input cli.Input) error { @@ -49,7 +41,7 @@ func (opts *DeleteSubCommand) run(input cli.Input) error { Namespace: input.String(flagkey.NamespaceCanary), } - err := opts.client.CanaryConfigDelete(m) + err := opts.Client().V1().CanaryConfig().Delete(m) if err != nil { return errors.Wrap(err, "error deleting canary config") } diff --git a/pkg/fission-cli/cmd/canaryconfig/get.go b/pkg/fission-cli/cmd/canaryconfig/get.go index 8d69006a..a85b7b65 100644 --- a/pkg/fission-cli/cmd/canaryconfig/get.go +++ b/pkg/fission-cli/cmd/canaryconfig/get.go @@ -24,29 +24,21 @@ import ( "github.com/pkg/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "github.com/fission/fission/pkg/controller/client" "github.com/fission/fission/pkg/fission-cli/cliwrapper/cli" + "github.com/fission/fission/pkg/fission-cli/cmd" flagkey "github.com/fission/fission/pkg/fission-cli/flag/key" - "github.com/fission/fission/pkg/fission-cli/util" ) type GetSubCommand struct { - client *client.Client + cmd.CommandActioner } func Get(input cli.Input) error { - c, err := util.GetServer(input) - if err != nil { - return err - } - opts := GetSubCommand{ - client: c, - } - return opts.run(input) + return (&GetSubCommand{}).run(input) } func (opts *GetSubCommand) run(input cli.Input) error { - canaryCfg, err := opts.client.CanaryConfigGet(&metav1.ObjectMeta{ + canaryCfg, err := opts.Client().V1().CanaryConfig().Get(&metav1.ObjectMeta{ Name: input.String(flagkey.CanaryName), Namespace: input.String(flagkey.NamespaceCanary), }) diff --git a/pkg/fission-cli/cmd/canaryconfig/list.go b/pkg/fission-cli/cmd/canaryconfig/list.go index cd630768..1b35fe4b 100644 --- a/pkg/fission-cli/cmd/canaryconfig/list.go +++ b/pkg/fission-cli/cmd/canaryconfig/list.go @@ -23,26 +23,18 @@ import ( "github.com/pkg/errors" - "github.com/fission/fission/pkg/controller/client" "github.com/fission/fission/pkg/fission-cli/cliwrapper/cli" + "github.com/fission/fission/pkg/fission-cli/cmd" flagkey "github.com/fission/fission/pkg/fission-cli/flag/key" - "github.com/fission/fission/pkg/fission-cli/util" ) type ListSubCommand struct { - client *client.Client + cmd.CommandActioner namespace string } func List(input cli.Input) error { - c, err := util.GetServer(input) - if err != nil { - return err - } - opts := ListSubCommand{ - client: c, - } - return opts.do(input) + return (&ListSubCommand{}).do(input) } func (opts *ListSubCommand) do(input cli.Input) error { @@ -59,7 +51,7 @@ func (opts *ListSubCommand) complete(input cli.Input) error { } func (opts *ListSubCommand) run(input cli.Input) error { - canaryCfgs, err := opts.client.CanaryConfigList(opts.namespace) + canaryCfgs, err := opts.Client().V1().CanaryConfig().List(opts.namespace) if err != nil { return errors.Wrap(err, "error listing canary config") } diff --git a/pkg/fission-cli/cmd/canaryconfig/update.go b/pkg/fission-cli/cmd/canaryconfig/update.go index dbc09f58..eb1e779a 100644 --- a/pkg/fission-cli/cmd/canaryconfig/update.go +++ b/pkg/fission-cli/cmd/canaryconfig/update.go @@ -24,26 +24,18 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" fv1 "github.com/fission/fission/pkg/apis/fission.io/v1" - "github.com/fission/fission/pkg/controller/client" "github.com/fission/fission/pkg/fission-cli/cliwrapper/cli" + "github.com/fission/fission/pkg/fission-cli/cmd" flagkey "github.com/fission/fission/pkg/fission-cli/flag/key" - "github.com/fission/fission/pkg/fission-cli/util" ) type UpdateSubCommand struct { - client *client.Client + cmd.CommandActioner canary *fv1.CanaryConfig } func Update(input cli.Input) error { - c, err := util.GetServer(input) - if err != nil { - return err - } - opts := UpdateSubCommand{ - client: c, - } - return opts.do(input) + return (&UpdateSubCommand{}).do(input) } func (opts *UpdateSubCommand) do(input cli.Input) error { @@ -68,7 +60,7 @@ func (opts *UpdateSubCommand) complete(input cli.Input) error { return errors.Wrap(err, "error parsing time duration") } - canaryCfg, err := opts.client.CanaryConfigGet(&metav1.ObjectMeta{ + canaryCfg, err := opts.Client().V1().CanaryConfig().Get(&metav1.ObjectMeta{ Name: name, Namespace: ns, }) @@ -100,7 +92,7 @@ func (opts *UpdateSubCommand) complete(input cli.Input) error { } func (opts *UpdateSubCommand) run(input cli.Input) error { - _, err := opts.client.CanaryConfigUpdate(opts.canary) + _, err := opts.Client().V1().CanaryConfig().Update(opts.canary) if err != nil { return errors.Wrap(err, "error updating canary config") } diff --git a/pkg/fission-cli/cmd/cmd.go b/pkg/fission-cli/cmd/cmd.go index d25a8b8f..599ee831 100644 --- a/pkg/fission-cli/cmd/cmd.go +++ b/pkg/fission-cli/cmd/cmd.go @@ -17,9 +17,28 @@ limitations under the License. package cmd import ( + "sync" + + "github.com/fission/fission/pkg/controller/client" "github.com/fission/fission/pkg/fission-cli/cliwrapper/cli" ) type ( - CommandAction func(input cli.Input) error + CommandAction func(input cli.Input) error + CommandActioner struct{} ) + +var ( + once = sync.Once{} + defaultClientset client.Interface +) + +func SetClientset(clientset client.Interface) { + once.Do(func() { + defaultClientset = clientset + }) +} + +func (c *CommandActioner) Client() client.Interface { + return defaultClientset +} diff --git a/pkg/fission-cli/cmd/environment/create.go b/pkg/fission-cli/cmd/environment/create.go index e4aeff21..0b9dd01f 100644 --- a/pkg/fission-cli/cmd/environment/create.go +++ b/pkg/fission-cli/cmd/environment/create.go @@ -24,8 +24,8 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" fv1 "github.com/fission/fission/pkg/apis/fission.io/v1" - "github.com/fission/fission/pkg/controller/client" "github.com/fission/fission/pkg/fission-cli/cliwrapper/cli" + "github.com/fission/fission/pkg/fission-cli/cmd" "github.com/fission/fission/pkg/fission-cli/cmd/spec" "github.com/fission/fission/pkg/fission-cli/console" flagkey "github.com/fission/fission/pkg/fission-cli/flag/key" @@ -34,19 +34,12 @@ import ( ) type CreateSubCommand struct { - client *client.Client - env *fv1.Environment + cmd.CommandActioner + env *fv1.Environment } func Create(input cli.Input) error { - c, err := util.GetServer(input) - if err != nil { - return err - } - opts := CreateSubCommand{ - client: c, - } - return opts.do(input) + return (&CreateSubCommand{}).do(input) } func (opts *CreateSubCommand) do(input cli.Input) error { @@ -72,7 +65,7 @@ func (opts *CreateSubCommand) complete(input cli.Input) error { func (opts *CreateSubCommand) run(input cli.Input) error { m := opts.env.Metadata - envList, err := opts.client.EnvironmentList(m.Namespace) + envList, err := opts.Client().V1().Environment().List(m.Namespace) if err != nil { return err } else if len(envList) > 0 { @@ -92,7 +85,7 @@ func (opts *CreateSubCommand) run(input cli.Input) error { return nil } - _, err = opts.client.EnvironmentCreate(opts.env) + _, err = opts.Client().V1().Environment().Create(opts.env) if err != nil { return errors.Wrap(err, "error creating environment") } diff --git a/pkg/fission-cli/cmd/environment/delete.go b/pkg/fission-cli/cmd/environment/delete.go index 8ba11b8c..00e23085 100644 --- a/pkg/fission-cli/cmd/environment/delete.go +++ b/pkg/fission-cli/cmd/environment/delete.go @@ -22,25 +22,17 @@ import ( "github.com/pkg/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "github.com/fission/fission/pkg/controller/client" "github.com/fission/fission/pkg/fission-cli/cliwrapper/cli" + "github.com/fission/fission/pkg/fission-cli/cmd" flagkey "github.com/fission/fission/pkg/fission-cli/flag/key" - "github.com/fission/fission/pkg/fission-cli/util" ) type DeleteSubCommand struct { - client *client.Client + cmd.CommandActioner } func Delete(input cli.Input) error { - c, err := util.GetServer(input) - if err != nil { - return err - } - opts := DeleteSubCommand{ - client: c, - } - return opts.do(input) + return (&DeleteSubCommand{}).do(input) } func (opts *DeleteSubCommand) do(input cli.Input) error { @@ -49,7 +41,7 @@ func (opts *DeleteSubCommand) do(input cli.Input) error { Namespace: input.String(flagkey.NamespaceEnvironment), } - err := opts.client.EnvironmentDelete(m) + err := opts.Client().V1().Environment().Delete(m) if err != nil { return errors.Wrap(err, "error deleting environment") } diff --git a/pkg/fission-cli/cmd/environment/get.go b/pkg/fission-cli/cmd/environment/get.go index ef8436b4..31a76ac8 100644 --- a/pkg/fission-cli/cmd/environment/get.go +++ b/pkg/fission-cli/cmd/environment/get.go @@ -24,25 +24,17 @@ import ( "github.com/pkg/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "github.com/fission/fission/pkg/controller/client" "github.com/fission/fission/pkg/fission-cli/cliwrapper/cli" + "github.com/fission/fission/pkg/fission-cli/cmd" flagkey "github.com/fission/fission/pkg/fission-cli/flag/key" - "github.com/fission/fission/pkg/fission-cli/util" ) type GetSubCommand struct { - client *client.Client + cmd.CommandActioner } func Get(input cli.Input) error { - c, err := util.GetServer(input) - if err != nil { - return err - } - opts := GetSubCommand{ - client: c, - } - return opts.do(input) + return (&GetSubCommand{}).do(input) } func (opts *GetSubCommand) do(input cli.Input) error { @@ -51,7 +43,7 @@ func (opts *GetSubCommand) do(input cli.Input) error { Namespace: input.String(flagkey.NamespaceEnvironment), } - env, err := opts.client.EnvironmentGet(m) + env, err := opts.Client().V1().Environment().Get(m) if err != nil { return errors.Wrap(err, "error getting environment") } diff --git a/pkg/fission-cli/cmd/environment/list.go b/pkg/fission-cli/cmd/environment/list.go index a1a1f25f..949e2bbd 100644 --- a/pkg/fission-cli/cmd/environment/list.go +++ b/pkg/fission-cli/cmd/environment/list.go @@ -23,29 +23,21 @@ import ( "github.com/pkg/errors" - "github.com/fission/fission/pkg/controller/client" "github.com/fission/fission/pkg/fission-cli/cliwrapper/cli" + "github.com/fission/fission/pkg/fission-cli/cmd" flagkey "github.com/fission/fission/pkg/fission-cli/flag/key" - "github.com/fission/fission/pkg/fission-cli/util" ) type ListSubCommand struct { - client *client.Client + cmd.CommandActioner } func List(input cli.Input) error { - c, err := util.GetServer(input) - if err != nil { - return err - } - opts := ListSubCommand{ - client: c, - } - return opts.do(input) + return (&ListSubCommand{}).do(input) } func (opts *ListSubCommand) do(input cli.Input) error { - envs, err := opts.client.EnvironmentList(input.String(flagkey.NamespaceEnvironment)) + envs, err := opts.Client().V1().Environment().List(input.String(flagkey.NamespaceEnvironment)) if err != nil { return errors.Wrap(err, "error listing environments") } diff --git a/pkg/fission-cli/cmd/environment/update.go b/pkg/fission-cli/cmd/environment/update.go index af9b9756..5709eb90 100644 --- a/pkg/fission-cli/cmd/environment/update.go +++ b/pkg/fission-cli/cmd/environment/update.go @@ -24,27 +24,19 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" fv1 "github.com/fission/fission/pkg/apis/fission.io/v1" - "github.com/fission/fission/pkg/controller/client" "github.com/fission/fission/pkg/fission-cli/cliwrapper/cli" + "github.com/fission/fission/pkg/fission-cli/cmd" flagkey "github.com/fission/fission/pkg/fission-cli/flag/key" - "github.com/fission/fission/pkg/fission-cli/util" "github.com/fission/fission/pkg/utils" ) type UpdateSubCommand struct { - client *client.Client - env *fv1.Environment + cmd.CommandActioner + env *fv1.Environment } func Update(input cli.Input) error { - c, err := util.GetServer(input) - if err != nil { - return err - } - opts := UpdateSubCommand{ - client: c, - } - return opts.do(input) + return (&UpdateSubCommand{}).do(input) } func (opts *UpdateSubCommand) do(input cli.Input) error { @@ -56,7 +48,7 @@ func (opts *UpdateSubCommand) do(input cli.Input) error { } func (opts *UpdateSubCommand) complete(input cli.Input) error { - env, err := opts.client.EnvironmentGet(&metav1.ObjectMeta{ + env, err := opts.Client().V1().Environment().Get(&metav1.ObjectMeta{ Name: input.String(flagkey.EnvName), Namespace: input.String(flagkey.NamespaceEnvironment), }) @@ -74,7 +66,7 @@ func (opts *UpdateSubCommand) complete(input cli.Input) error { } func (opts *UpdateSubCommand) run(input cli.Input) error { - _, err := opts.client.EnvironmentUpdate(opts.env) + _, err := opts.Client().V1().Environment().Update(opts.env) if err != nil { return errors.Wrap(err, "error updating environment") } diff --git a/pkg/fission-cli/cmd/function/create.go b/pkg/fission-cli/cmd/function/create.go index 55f4d35d..19adfa77 100644 --- a/pkg/fission-cli/cmd/function/create.go +++ b/pkg/fission-cli/cmd/function/create.go @@ -27,9 +27,9 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" fv1 "github.com/fission/fission/pkg/apis/fission.io/v1" - "github.com/fission/fission/pkg/controller/client" ferror "github.com/fission/fission/pkg/error" "github.com/fission/fission/pkg/fission-cli/cliwrapper/cli" + "github.com/fission/fission/pkg/fission-cli/cmd" "github.com/fission/fission/pkg/fission-cli/cmd/httptrigger" _package "github.com/fission/fission/pkg/fission-cli/cmd/package" "github.com/fission/fission/pkg/fission-cli/cmd/spec" @@ -44,20 +44,13 @@ const ( ) type CreateSubCommand struct { - client *client.Client + cmd.CommandActioner function *fv1.Function specFile string } func Create(input cli.Input) error { - c, err := util.GetServer(input) - if err != nil { - return err - } - opts := CreateSubCommand{ - client: c, - } - return opts.do(input) + return (&CreateSubCommand{}).do(input) } func (opts *CreateSubCommand) do(input cli.Input) error { @@ -83,7 +76,7 @@ func (opts *CreateSubCommand) complete(input cli.Input) error { if !toSpec { // check for unique function names within a namespace - fn, err := opts.client.FunctionGet(&metav1.ObjectMeta{ + fn, err := opts.Client().V1().Function().Get(&metav1.ObjectMeta{ Name: input.String(flagkey.FnName), Namespace: input.String(flagkey.NamespaceFunction), }) @@ -139,7 +132,7 @@ func (opts *CreateSubCommand) complete(input cli.Input) error { pkgMetadata = &pkg.Metadata } else { // use existing package - pkg, err = opts.client.PackageGet(&metav1.ObjectMeta{ + pkg, err = opts.Client().V1().Package().Get(&metav1.ObjectMeta{ Namespace: fnNamespace, Name: pkgName, }) @@ -181,7 +174,7 @@ func (opts *CreateSubCommand) complete(input cli.Input) error { fnName, envName)) } } else { - _, err := opts.client.EnvironmentGet(&metav1.ObjectMeta{ + _, err := opts.Client().V1().Environment().Get(&metav1.ObjectMeta{ Namespace: envNamespace, Name: envName, }) @@ -213,7 +206,7 @@ func (opts *CreateSubCommand) complete(input cli.Input) error { pkgName := fmt.Sprintf("%v-%v", fnName, uuid.NewV4().String()) // create new package in the same namespace as the function. - pkgMetadata, err = _package.CreatePackage(input, opts.client, pkgName, fnNamespace, envName, envNamespace, + pkgMetadata, err = _package.CreatePackage(input, opts.Client(), pkgName, fnNamespace, envName, envNamespace, srcArchiveFiles, deployArchiveFiles, buildcmd, specDir, opts.specFile, noZip) if err != nil { return errors.Wrap(err, "error creating package") @@ -227,7 +220,7 @@ func (opts *CreateSubCommand) complete(input cli.Input) error { // check the referenced secret is in the same ns as the function, if not give a warning. if !toSpec { // TODO: workaround in order not to block users from creating function spec, remove it. for _, secretName := range secretNames { - _, err := opts.client.SecretGet(&metav1.ObjectMeta{ + _, err := opts.Client().V1().Misc().SecretGet(&metav1.ObjectMeta{ Namespace: fnNamespace, Name: secretName, }) @@ -253,7 +246,7 @@ func (opts *CreateSubCommand) complete(input cli.Input) error { // check the referenced cfgmap is in the same ns as the function, if not give a warning. if !toSpec { for _, cfgMapName := range cfgMapNames { - _, err := opts.client.ConfigMapGet(&metav1.ObjectMeta{ + _, err := opts.Client().V1().Misc().ConfigMapGet(&metav1.ObjectMeta{ Namespace: fnNamespace, Name: cfgMapName, }) @@ -316,7 +309,7 @@ func (opts *CreateSubCommand) run(input cli.Input) error { return nil } - _, err := opts.client.FunctionCreate(opts.function) + _, err := opts.Client().V1().Function().Create(opts.function) if err != nil { return errors.Wrap(err, "error creating function") } @@ -352,7 +345,7 @@ func (opts *CreateSubCommand) run(input cli.Input) error { }, }, } - _, err = opts.client.HTTPTriggerCreate(ht) + _, err = opts.Client().V1().HTTPTrigger().Create(ht) if err != nil { return errors.Wrap(err, "error creating HTTP trigger") } diff --git a/pkg/fission-cli/cmd/function/delete.go b/pkg/fission-cli/cmd/function/delete.go index 4e845ff7..3e8bcd30 100644 --- a/pkg/fission-cli/cmd/function/delete.go +++ b/pkg/fission-cli/cmd/function/delete.go @@ -22,25 +22,17 @@ import ( "github.com/pkg/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "github.com/fission/fission/pkg/controller/client" "github.com/fission/fission/pkg/fission-cli/cliwrapper/cli" + "github.com/fission/fission/pkg/fission-cli/cmd" flagkey "github.com/fission/fission/pkg/fission-cli/flag/key" - "github.com/fission/fission/pkg/fission-cli/util" ) type DeleteSubCommand struct { - client *client.Client + cmd.CommandActioner } func Delete(input cli.Input) error { - c, err := util.GetServer(input) - if err != nil { - return err - } - opts := DeleteSubCommand{ - client: c, - } - return opts.do(input) + return (&DeleteSubCommand{}).do(input) } func (opts *DeleteSubCommand) do(input cli.Input) error { @@ -49,7 +41,7 @@ func (opts *DeleteSubCommand) do(input cli.Input) error { Namespace: input.String(flagkey.NamespaceFunction), } - err := opts.client.FunctionDelete(m) + err := opts.Client().V1().Function().Delete(m) if err != nil { return errors.Wrap(err, fmt.Sprintf("delete function '%v'", m.Name)) } diff --git a/pkg/fission-cli/cmd/function/get.go b/pkg/fission-cli/cmd/function/get.go index 392b1426..1148cbd0 100644 --- a/pkg/fission-cli/cmd/function/get.go +++ b/pkg/fission-cli/cmd/function/get.go @@ -22,29 +22,21 @@ import ( "github.com/pkg/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "github.com/fission/fission/pkg/controller/client" "github.com/fission/fission/pkg/fission-cli/cliwrapper/cli" + "github.com/fission/fission/pkg/fission-cli/cmd" flagkey "github.com/fission/fission/pkg/fission-cli/flag/key" - "github.com/fission/fission/pkg/fission-cli/util" ) type GetSubCommand struct { - client *client.Client + cmd.CommandActioner } func Get(input cli.Input) error { - c, err := util.GetServer(input) - if err != nil { - return err - } - opts := GetSubCommand{ - client: c, - } - return opts.do(input) + return (&GetSubCommand{}).do(input) } func (opts *GetSubCommand) do(input cli.Input) error { - fn, err := opts.client.FunctionGet(&metav1.ObjectMeta{ + fn, err := opts.Client().V1().Function().Get(&metav1.ObjectMeta{ Name: input.String(flagkey.FnName), Namespace: input.String(flagkey.NamespaceFunction), }) @@ -52,7 +44,7 @@ func (opts *GetSubCommand) do(input cli.Input) error { return errors.Wrap(err, "error getting function") } - pkg, err := opts.client.PackageGet(&metav1.ObjectMeta{ + pkg, err := opts.Client().V1().Package().Get(&metav1.ObjectMeta{ Name: fn.Spec.Package.PackageRef.Name, Namespace: fn.Spec.Package.PackageRef.Namespace, }) diff --git a/pkg/fission-cli/cmd/function/getmeta.go b/pkg/fission-cli/cmd/function/getmeta.go index 819f066f..c1a375c7 100644 --- a/pkg/fission-cli/cmd/function/getmeta.go +++ b/pkg/fission-cli/cmd/function/getmeta.go @@ -24,29 +24,21 @@ import ( "github.com/pkg/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "github.com/fission/fission/pkg/controller/client" "github.com/fission/fission/pkg/fission-cli/cliwrapper/cli" + "github.com/fission/fission/pkg/fission-cli/cmd" flagkey "github.com/fission/fission/pkg/fission-cli/flag/key" - "github.com/fission/fission/pkg/fission-cli/util" ) type GetMetaSubCommand struct { - client *client.Client + cmd.CommandActioner } func GetMeta(input cli.Input) error { - c, err := util.GetServer(input) - if err != nil { - return err - } - opts := GetMetaSubCommand{ - client: c, - } - return opts.do(input) + return (&GetMetaSubCommand{}).do(input) } func (opts *GetMetaSubCommand) do(input cli.Input) error { - fn, err := opts.client.FunctionGet(&metav1.ObjectMeta{ + fn, err := opts.Client().V1().Function().Get(&metav1.ObjectMeta{ Name: input.String(flagkey.FnName), Namespace: input.String(flagkey.NamespaceFunction), }) diff --git a/pkg/fission-cli/cmd/function/list.go b/pkg/fission-cli/cmd/function/list.go index b17fdf8c..d394e19e 100644 --- a/pkg/fission-cli/cmd/function/list.go +++ b/pkg/fission-cli/cmd/function/list.go @@ -24,31 +24,23 @@ import ( "github.com/pkg/errors" - "github.com/fission/fission/pkg/controller/client" "github.com/fission/fission/pkg/fission-cli/cliwrapper/cli" + "github.com/fission/fission/pkg/fission-cli/cmd" flagkey "github.com/fission/fission/pkg/fission-cli/flag/key" - "github.com/fission/fission/pkg/fission-cli/util" ) type ListSubCommand struct { - client *client.Client + cmd.CommandActioner } func List(input cli.Input) error { - c, err := util.GetServer(input) - if err != nil { - return err - } - opts := ListSubCommand{ - client: c, - } - return opts.do(input) + return (&ListSubCommand{}).do(input) } func (opts *ListSubCommand) do(input cli.Input) error { ns := input.String(flagkey.NamespaceFunction) - fns, err := opts.client.FunctionList(ns) + fns, err := opts.Client().V1().Function().List(ns) if err != nil { return errors.Wrap(err, "error listing functions") } diff --git a/pkg/fission-cli/cmd/function/log.go b/pkg/fission-cli/cmd/function/log.go index 52930982..e4625f7d 100644 --- a/pkg/fission-cli/cmd/function/log.go +++ b/pkg/fission-cli/cmd/function/log.go @@ -24,26 +24,19 @@ import ( "github.com/pkg/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "github.com/fission/fission/pkg/controller/client" "github.com/fission/fission/pkg/fission-cli/cliwrapper/cli" + "github.com/fission/fission/pkg/fission-cli/cmd" flagkey "github.com/fission/fission/pkg/fission-cli/flag/key" "github.com/fission/fission/pkg/fission-cli/logdb" "github.com/fission/fission/pkg/fission-cli/util" ) type LogSubCommand struct { - client *client.Client + cmd.CommandActioner } func Log(input cli.Input) error { - c, err := util.GetServer(input) - if err != nil { - return err - } - opts := LogSubCommand{ - client: c, - } - return opts.do(input) + return (&LogSubCommand{}).do(input) } func (opts *LogSubCommand) do(input cli.Input) error { @@ -57,7 +50,7 @@ func (opts *LogSubCommand) do(input cli.Input) error { recordLimit = 1000 } - f, err := opts.client.FunctionGet(&metav1.ObjectMeta{ + f, err := opts.Client().V1().Function().Get(&metav1.ObjectMeta{ Name: input.String(flagkey.FnName), Namespace: input.String(flagkey.NamespaceFunction), }) diff --git a/pkg/fission-cli/cmd/function/test.go b/pkg/fission-cli/cmd/function/test.go index 064455fe..26e8650e 100644 --- a/pkg/fission-cli/cmd/function/test.go +++ b/pkg/fission-cli/cmd/function/test.go @@ -30,6 +30,7 @@ import ( "github.com/fission/fission/pkg/controller/client" "github.com/fission/fission/pkg/fission-cli/cliwrapper/cli" + "github.com/fission/fission/pkg/fission-cli/cmd" "github.com/fission/fission/pkg/fission-cli/cmd/httptrigger" "github.com/fission/fission/pkg/fission-cli/console" flagkey "github.com/fission/fission/pkg/fission-cli/flag/key" @@ -37,18 +38,11 @@ import ( ) type TestSubCommand struct { - client *client.Client + cmd.CommandActioner } func Test(input cli.Input) error { - c, err := util.GetServer(input) - if err != nil { - return err - } - opts := TestSubCommand{ - client: c, - } - return opts.do(input) + return (&TestSubCommand{}).do(input) } func (opts *TestSubCommand) do(input cli.Input) error { @@ -124,7 +118,7 @@ func (opts *TestSubCommand) do(input cli.Input) error { } console.Errorf("Error calling function %s: %d; Please try again or fix the error: %s\n", m.Name, resp.StatusCode, string(body)) - log, err := printPodLogs(opts.client, m) + log, err := printPodLogs(opts.Client(), m) if err != nil { console.Errorf("Error getting function logs from controller: %v. Try to get logs from log database.", err) err = Log(input) @@ -163,8 +157,8 @@ func doHTTPRequest(ctx context.Context, url string, headers []string, method, bo return resp, nil } -func printPodLogs(client *client.Client, fnMeta *metav1.ObjectMeta) (string, error) { - reader, statusCode, err := client.FunctionPodLogs(fnMeta) +func printPodLogs(client client.Interface, fnMeta *metav1.ObjectMeta) (string, error) { + reader, statusCode, err := client.V1().Misc().PodLogs(fnMeta) if err != nil { return "", errors.Wrap(err, "error executing get logs request") } diff --git a/pkg/fission-cli/cmd/function/update.go b/pkg/fission-cli/cmd/function/update.go index 7e1a6fad..14384cf4 100644 --- a/pkg/fission-cli/cmd/function/update.go +++ b/pkg/fission-cli/cmd/function/update.go @@ -24,8 +24,8 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" fv1 "github.com/fission/fission/pkg/apis/fission.io/v1" - "github.com/fission/fission/pkg/controller/client" "github.com/fission/fission/pkg/fission-cli/cliwrapper/cli" + "github.com/fission/fission/pkg/fission-cli/cmd" _package "github.com/fission/fission/pkg/fission-cli/cmd/package" "github.com/fission/fission/pkg/fission-cli/console" flagkey "github.com/fission/fission/pkg/fission-cli/flag/key" @@ -33,19 +33,12 @@ import ( ) type UpdateSubCommand struct { - client *client.Client + cmd.CommandActioner function *fv1.Function } func Update(input cli.Input) error { - c, err := util.GetServer(input) - if err != nil { - return err - } - opts := UpdateSubCommand{ - client: c, - } - return opts.do(input) + return (&UpdateSubCommand{}).do(input) } func (opts *UpdateSubCommand) do(input cli.Input) error { @@ -60,7 +53,7 @@ func (opts *UpdateSubCommand) complete(input cli.Input) error { fnName := input.String(flagkey.FnName) fnNamespace := input.String(flagkey.NamespaceFunction) - function, err := opts.client.FunctionGet(&metav1.ObjectMeta{ + function, err := opts.Client().V1().Function().Get(&metav1.ObjectMeta{ Name: input.String(flagkey.FnName), Namespace: input.String(flagkey.NamespaceFunction), }) @@ -94,7 +87,7 @@ func (opts *UpdateSubCommand) complete(input cli.Input) error { // check that the referenced secret is in the same ns as the function, if not give a warning. for _, secretName := range secretNames { - _, err := opts.client.SecretGet(&metav1.ObjectMeta{ + _, err := opts.Client().V1().Misc().SecretGet(&metav1.ObjectMeta{ Namespace: fnNamespace, Name: secretName, }) @@ -118,7 +111,7 @@ func (opts *UpdateSubCommand) complete(input cli.Input) error { // check that the referenced cfgmap is in the same ns as the function, if not give a warning. for _, cfgMapName := range cfgMapNames { - _, err := opts.client.ConfigMapGet(&metav1.ObjectMeta{ + _, err := opts.Client().V1().Misc().ConfigMapGet(&metav1.ObjectMeta{ Namespace: fnNamespace, Name: cfgMapName, }) @@ -174,7 +167,7 @@ func (opts *UpdateSubCommand) complete(input cli.Input) error { function.Spec.Resources = *resReqs - pkg, err := opts.client.PackageGet(&metav1.ObjectMeta{ + pkg, err := opts.Client().V1().Package().Get(&metav1.ObjectMeta{ Namespace: fnNamespace, Name: pkgName, }) @@ -184,7 +177,7 @@ func (opts *UpdateSubCommand) complete(input cli.Input) error { forceUpdate := input.Bool(flagkey.PkgForce) - fnList, err := _package.GetFunctionsByPackage(opts.client, pkg.Metadata.Name, pkg.Metadata.Namespace) + fnList, err := _package.GetFunctionsByPackage(opts.Client(), pkg.Metadata.Name, pkg.Metadata.Namespace) if err != nil { return errors.Wrap(err, "error getting function list") } @@ -193,7 +186,7 @@ func (opts *UpdateSubCommand) complete(input cli.Input) error { return errors.Errorf("Package is used by multiple functions, use --%v to force update", flagkey.PkgForce) } - newPkgMeta, err := _package.UpdatePackage(input, opts.client, pkg) + newPkgMeta, err := _package.UpdatePackage(input, opts.Client(), pkg) if err != nil { return errors.Wrap(err, fmt.Sprintf("error updating package '%v'", pkgName)) } @@ -210,7 +203,7 @@ func (opts *UpdateSubCommand) complete(input cli.Input) error { fns = append(fns, fn) } } - err = _package.UpdateFunctionPackageResourceVersion(opts.client, newPkgMeta, fns...) + err = _package.UpdateFunctionPackageResourceVersion(opts.Client(), newPkgMeta, fns...) if err != nil { return errors.Wrap(err, "error updating function package reference resource version") } @@ -238,7 +231,7 @@ func (opts *UpdateSubCommand) complete(input cli.Input) error { } func (opts *UpdateSubCommand) run(input cli.Input) error { - _, err := opts.client.FunctionUpdate(opts.function) + _, err := opts.Client().V1().Function().Update(opts.function) if err != nil { return errors.Wrap(err, "error updating function") } diff --git a/pkg/fission-cli/cmd/httptrigger/create.go b/pkg/fission-cli/cmd/httptrigger/create.go index 56081e3e..c4a4991a 100644 --- a/pkg/fission-cli/cmd/httptrigger/create.go +++ b/pkg/fission-cli/cmd/httptrigger/create.go @@ -26,9 +26,9 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" fv1 "github.com/fission/fission/pkg/apis/fission.io/v1" - "github.com/fission/fission/pkg/controller/client" ferror "github.com/fission/fission/pkg/error" "github.com/fission/fission/pkg/fission-cli/cliwrapper/cli" + "github.com/fission/fission/pkg/fission-cli/cmd" "github.com/fission/fission/pkg/fission-cli/cmd/spec" "github.com/fission/fission/pkg/fission-cli/console" flagkey "github.com/fission/fission/pkg/fission-cli/flag/key" @@ -36,19 +36,12 @@ import ( ) type CreateSubCommand struct { - client *client.Client + cmd.CommandActioner trigger *fv1.HTTPTrigger } func Create(input cli.Input) error { - c, err := util.GetServer(input) - if err != nil { - return err - } - opts := CreateSubCommand{ - client: c, - } - return opts.do(input) + return (&CreateSubCommand{}).do(input) } func (opts *CreateSubCommand) do(input cli.Input) error { @@ -85,7 +78,7 @@ func (opts *CreateSubCommand) complete(input cli.Input) error { Namespace: fnNamespace, } - htTrigger, err := opts.client.HTTPTriggerGet(m) + htTrigger, err := opts.Client().V1().HTTPTrigger().Get(m) if err != nil && !ferror.IsNotFound(err) { return err } @@ -128,7 +121,7 @@ func (opts *CreateSubCommand) complete(input cli.Input) error { } } } else { - err = util.CheckFunctionExistence(opts.client, functionList, fnNamespace) + err = util.CheckFunctionExistence(opts.Client(), functionList, fnNamespace) if err != nil { console.Warn(err.Error()) } @@ -173,7 +166,7 @@ func (opts *CreateSubCommand) run(input cli.Input) error { return nil } - _, err := opts.client.HTTPTriggerCreate(opts.trigger) + _, err := opts.Client().V1().HTTPTrigger().Create(opts.trigger) if err != nil { return errors.Wrap(err, "create HTTP trigger") } diff --git a/pkg/fission-cli/cmd/httptrigger/delete.go b/pkg/fission-cli/cmd/httptrigger/delete.go index 12f4c608..c44f1ad9 100644 --- a/pkg/fission-cli/cmd/httptrigger/delete.go +++ b/pkg/fission-cli/cmd/httptrigger/delete.go @@ -23,29 +23,21 @@ import ( "github.com/pkg/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "github.com/fission/fission/pkg/controller/client" "github.com/fission/fission/pkg/fission-cli/cliwrapper/cli" + "github.com/fission/fission/pkg/fission-cli/cmd" flagkey "github.com/fission/fission/pkg/fission-cli/flag/key" - "github.com/fission/fission/pkg/fission-cli/util" "github.com/fission/fission/pkg/utils" ) type DeleteSubCommand struct { - client *client.Client + cmd.CommandActioner triggerName string functionName string namespace string } func Delete(input cli.Input) error { - c, err := util.GetServer(input) - if err != nil { - return err - } - opts := DeleteSubCommand{ - client: c, - } - return opts.do(input) + return (&DeleteSubCommand{}).do(input) } func (opts *DeleteSubCommand) do(input cli.Input) error { @@ -69,7 +61,7 @@ func (opts *DeleteSubCommand) complete(input cli.Input) error { } func (opts *DeleteSubCommand) run(input cli.Input) error { - triggers, err := opts.client.HTTPTriggerList(opts.namespace) + triggers, err := opts.Client().V1().HTTPTrigger().List(opts.namespace) if err != nil { return errors.Wrap(err, "error getting HTTP trigger list") } @@ -90,7 +82,7 @@ func (opts *DeleteSubCommand) run(input cli.Input) error { errs := utils.MultiErrorWithFormat() for _, name := range triggersToDelete { - err := opts.client.HTTPTriggerDelete(&metav1.ObjectMeta{ + err := opts.Client().V1().HTTPTrigger().Delete(&metav1.ObjectMeta{ Name: name, Namespace: opts.namespace, }) diff --git a/pkg/fission-cli/cmd/httptrigger/get.go b/pkg/fission-cli/cmd/httptrigger/get.go index 1d60e510..2d9bda2d 100644 --- a/pkg/fission-cli/cmd/httptrigger/get.go +++ b/pkg/fission-cli/cmd/httptrigger/get.go @@ -26,25 +26,17 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" fv1 "github.com/fission/fission/pkg/apis/fission.io/v1" - "github.com/fission/fission/pkg/controller/client" "github.com/fission/fission/pkg/fission-cli/cliwrapper/cli" + "github.com/fission/fission/pkg/fission-cli/cmd" flagkey "github.com/fission/fission/pkg/fission-cli/flag/key" - "github.com/fission/fission/pkg/fission-cli/util" ) type GetSubCommand struct { - client *client.Client + cmd.CommandActioner } func Get(input cli.Input) error { - c, err := util.GetServer(input) - if err != nil { - return err - } - opts := GetSubCommand{ - client: c, - } - return opts.do(input) + return (&GetSubCommand{}).do(input) } func (opts *GetSubCommand) do(input cli.Input) error { @@ -56,7 +48,7 @@ func (opts *GetSubCommand) run(input cli.Input) error { Name: input.String(flagkey.HtName), Namespace: input.String(flagkey.NamespaceFunction), } - ht, err := opts.client.HTTPTriggerGet(m) + ht, err := opts.Client().V1().HTTPTrigger().Get(m) if err != nil { return errors.Wrap(err, "error getting http trigger") } diff --git a/pkg/fission-cli/cmd/httptrigger/list.go b/pkg/fission-cli/cmd/httptrigger/list.go index fdcad45f..529d051b 100644 --- a/pkg/fission-cli/cmd/httptrigger/list.go +++ b/pkg/fission-cli/cmd/httptrigger/list.go @@ -20,25 +20,17 @@ import ( "github.com/pkg/errors" fv1 "github.com/fission/fission/pkg/apis/fission.io/v1" - "github.com/fission/fission/pkg/controller/client" "github.com/fission/fission/pkg/fission-cli/cliwrapper/cli" + "github.com/fission/fission/pkg/fission-cli/cmd" flagkey "github.com/fission/fission/pkg/fission-cli/flag/key" - "github.com/fission/fission/pkg/fission-cli/util" ) type ListSubCommand struct { - client *client.Client + cmd.CommandActioner } func List(input cli.Input) error { - c, err := util.GetServer(input) - if err != nil { - return err - } - opts := ListSubCommand{ - client: c, - } - return opts.do(input) + return (&ListSubCommand{}).do(input) } func (opts *ListSubCommand) do(input cli.Input) error { @@ -46,7 +38,7 @@ func (opts *ListSubCommand) do(input cli.Input) error { } func (opts *ListSubCommand) run(input cli.Input) error { - hts, err := opts.client.HTTPTriggerList(input.String(flagkey.NamespaceTrigger)) + hts, err := opts.Client().V1().HTTPTrigger().List(input.String(flagkey.NamespaceTrigger)) if err != nil { return errors.Wrap(err, "error listing HTTP triggers") } diff --git a/pkg/fission-cli/cmd/httptrigger/update.go b/pkg/fission-cli/cmd/httptrigger/update.go index 16391d3a..2cb44fca 100644 --- a/pkg/fission-cli/cmd/httptrigger/update.go +++ b/pkg/fission-cli/cmd/httptrigger/update.go @@ -23,27 +23,20 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" fv1 "github.com/fission/fission/pkg/apis/fission.io/v1" - "github.com/fission/fission/pkg/controller/client" "github.com/fission/fission/pkg/fission-cli/cliwrapper/cli" + "github.com/fission/fission/pkg/fission-cli/cmd" "github.com/fission/fission/pkg/fission-cli/console" flagkey "github.com/fission/fission/pkg/fission-cli/flag/key" "github.com/fission/fission/pkg/fission-cli/util" ) type UpdateSubCommand struct { - client *client.Client + cmd.CommandActioner trigger *fv1.HTTPTrigger } func Update(input cli.Input) error { - c, err := util.GetServer(input) - if err != nil { - return err - } - opts := UpdateSubCommand{ - client: c, - } - return opts.do(input) + return (&UpdateSubCommand{}).do(input) } func (opts *UpdateSubCommand) do(input cli.Input) error { @@ -58,7 +51,7 @@ func (opts *UpdateSubCommand) complete(input cli.Input) error { htName := input.String(flagkey.HtName) triggerNamespace := input.String(flagkey.NamespaceTrigger) - ht, err := opts.client.HTTPTriggerGet(&metav1.ObjectMeta{ + ht, err := opts.Client().V1().HTTPTrigger().Get(&metav1.ObjectMeta{ Name: htName, Namespace: triggerNamespace, }) @@ -77,7 +70,7 @@ func (opts *UpdateSubCommand) complete(input cli.Input) error { if input.IsSet(flagkey.HtFnName) { // get the functions and their weights if specified functionList := input.StringSlice(flagkey.HtFnName) - err := util.CheckFunctionExistence(opts.client, functionList, triggerNamespace) + err := util.CheckFunctionExistence(opts.Client(), functionList, triggerNamespace) if err != nil { console.Warn(err.Error()) } @@ -120,7 +113,7 @@ func (opts *UpdateSubCommand) complete(input cli.Input) error { } func (opts *UpdateSubCommand) run(input cli.Input) error { - _, err := opts.client.HTTPTriggerUpdate(opts.trigger) + _, err := opts.Client().V1().HTTPTrigger().Update(opts.trigger) if err != nil { return errors.Wrap(err, "error updating the HTTP trigger") } diff --git a/pkg/fission-cli/cmd/kubewatch/create.go b/pkg/fission-cli/cmd/kubewatch/create.go index 802b286b..04c3939b 100644 --- a/pkg/fission-cli/cmd/kubewatch/create.go +++ b/pkg/fission-cli/cmd/kubewatch/create.go @@ -24,8 +24,8 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" fv1 "github.com/fission/fission/pkg/apis/fission.io/v1" - "github.com/fission/fission/pkg/controller/client" "github.com/fission/fission/pkg/fission-cli/cliwrapper/cli" + "github.com/fission/fission/pkg/fission-cli/cmd" "github.com/fission/fission/pkg/fission-cli/cmd/spec" "github.com/fission/fission/pkg/fission-cli/console" flagkey "github.com/fission/fission/pkg/fission-cli/flag/key" @@ -33,19 +33,12 @@ import ( ) type CreateSubCommand struct { - client *client.Client + cmd.CommandActioner watcher *fv1.KubernetesWatchTrigger } func Create(input cli.Input) error { - c, err := util.GetServer(input) - if err != nil { - return err - } - opts := CreateSubCommand{ - client: c, - } - return opts.do(input) + return (&CreateSubCommand{}).do(input) } func (opts *CreateSubCommand) do(input cli.Input) error { @@ -119,7 +112,7 @@ func (opts *CreateSubCommand) run(input cli.Input) error { return nil } - _, err := opts.client.WatchCreate(opts.watcher) + _, err := opts.Client().V1().KubeWatcher().Create(opts.watcher) if err != nil { return errors.Wrap(err, "error creating kubewatch") } diff --git a/pkg/fission-cli/cmd/kubewatch/delete.go b/pkg/fission-cli/cmd/kubewatch/delete.go index 5e8c9b5d..de8a3664 100644 --- a/pkg/fission-cli/cmd/kubewatch/delete.go +++ b/pkg/fission-cli/cmd/kubewatch/delete.go @@ -22,27 +22,19 @@ import ( "github.com/pkg/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "github.com/fission/fission/pkg/controller/client" "github.com/fission/fission/pkg/fission-cli/cliwrapper/cli" + "github.com/fission/fission/pkg/fission-cli/cmd" flagkey "github.com/fission/fission/pkg/fission-cli/flag/key" - "github.com/fission/fission/pkg/fission-cli/util" ) type DeleteSubCommand struct { - client *client.Client + cmd.CommandActioner name string namespace string } func Delete(input cli.Input) error { - c, err := util.GetServer(input) - if err != nil { - return err - } - opts := DeleteSubCommand{ - client: c, - } - return opts.do(input) + return (&DeleteSubCommand{}).do(input) } func (opts *DeleteSubCommand) do(input cli.Input) error { @@ -60,7 +52,7 @@ func (opts *DeleteSubCommand) complete(input cli.Input) error { } func (opts *DeleteSubCommand) run(input cli.Input) error { - err := opts.client.WatchDelete(&metav1.ObjectMeta{ + err := opts.Client().V1().KubeWatcher().Delete(&metav1.ObjectMeta{ Name: opts.name, Namespace: opts.namespace, }) diff --git a/pkg/fission-cli/cmd/kubewatch/list.go b/pkg/fission-cli/cmd/kubewatch/list.go index 60fed7b0..09f90086 100644 --- a/pkg/fission-cli/cmd/kubewatch/list.go +++ b/pkg/fission-cli/cmd/kubewatch/list.go @@ -23,26 +23,18 @@ import ( "github.com/pkg/errors" - "github.com/fission/fission/pkg/controller/client" "github.com/fission/fission/pkg/fission-cli/cliwrapper/cli" + "github.com/fission/fission/pkg/fission-cli/cmd" flagkey "github.com/fission/fission/pkg/fission-cli/flag/key" - "github.com/fission/fission/pkg/fission-cli/util" ) type ListSubCommand struct { - client *client.Client + cmd.CommandActioner namespace string } func List(input cli.Input) error { - c, err := util.GetServer(input) - if err != nil { - return err - } - opts := ListSubCommand{ - client: c, - } - return opts.do(input) + return (&ListSubCommand{}).do(input) } func (opts *ListSubCommand) do(input cli.Input) error { @@ -59,7 +51,7 @@ func (opts *ListSubCommand) complete(input cli.Input) error { } func (opts *ListSubCommand) run(input cli.Input) error { - ws, err := opts.client.WatchList(opts.namespace) + ws, err := opts.Client().V1().KubeWatcher().List(opts.namespace) if err != nil { return errors.Wrap(err, "error listing kubewatches") } diff --git a/pkg/fission-cli/cmd/mqtrigger/create.go b/pkg/fission-cli/cmd/mqtrigger/create.go index 11c90db3..3bb64b6d 100644 --- a/pkg/fission-cli/cmd/mqtrigger/create.go +++ b/pkg/fission-cli/cmd/mqtrigger/create.go @@ -24,8 +24,8 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" fv1 "github.com/fission/fission/pkg/apis/fission.io/v1" - "github.com/fission/fission/pkg/controller/client" "github.com/fission/fission/pkg/fission-cli/cliwrapper/cli" + "github.com/fission/fission/pkg/fission-cli/cmd" "github.com/fission/fission/pkg/fission-cli/cmd/spec" "github.com/fission/fission/pkg/fission-cli/console" flagkey "github.com/fission/fission/pkg/fission-cli/flag/key" @@ -34,19 +34,12 @@ import ( ) type CreateSubCommand struct { - client *client.Client + cmd.CommandActioner trigger *fv1.MessageQueueTrigger } func Create(input cli.Input) error { - c, err := util.GetServer(input) - if err != nil { - return err - } - opts := CreateSubCommand{ - client: c, - } - return opts.do(input) + return (&CreateSubCommand{}).do(input) } func (opts *CreateSubCommand) do(input cli.Input) error { @@ -164,7 +157,7 @@ func (opts *CreateSubCommand) run(input cli.Input) error { return nil } - _, err := opts.client.MessageQueueTriggerCreate(opts.trigger) + _, err := opts.Client().V1().MessageQueueTrigger().Create(opts.trigger) if err != nil { return errors.Wrap(err, "create message queue trigger") } diff --git a/pkg/fission-cli/cmd/mqtrigger/delete.go b/pkg/fission-cli/cmd/mqtrigger/delete.go index ad860c44..81650af5 100644 --- a/pkg/fission-cli/cmd/mqtrigger/delete.go +++ b/pkg/fission-cli/cmd/mqtrigger/delete.go @@ -22,26 +22,18 @@ import ( "github.com/pkg/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "github.com/fission/fission/pkg/controller/client" "github.com/fission/fission/pkg/fission-cli/cliwrapper/cli" + "github.com/fission/fission/pkg/fission-cli/cmd" flagkey "github.com/fission/fission/pkg/fission-cli/flag/key" - "github.com/fission/fission/pkg/fission-cli/util" ) type DeleteSubCommand struct { - client *client.Client + cmd.CommandActioner metadata *metav1.ObjectMeta } func Delete(input cli.Input) error { - c, err := util.GetServer(input) - if err != nil { - return err - } - opts := DeleteSubCommand{ - client: c, - } - return opts.do(input) + return (&DeleteSubCommand{}).do(input) } func (opts *DeleteSubCommand) do(input cli.Input) error { @@ -61,7 +53,7 @@ func (opts *DeleteSubCommand) complete(input cli.Input) error { } func (opts *DeleteSubCommand) run(input cli.Input) error { - err := opts.client.MessageQueueTriggerDelete(opts.metadata) + err := opts.Client().V1().MessageQueueTrigger().Delete(opts.metadata) if err != nil { return errors.Wrap(err, "error deleting message queue trigger") } diff --git a/pkg/fission-cli/cmd/mqtrigger/list.go b/pkg/fission-cli/cmd/mqtrigger/list.go index 62879e6b..3d361008 100644 --- a/pkg/fission-cli/cmd/mqtrigger/list.go +++ b/pkg/fission-cli/cmd/mqtrigger/list.go @@ -23,26 +23,18 @@ import ( "github.com/pkg/errors" - "github.com/fission/fission/pkg/controller/client" "github.com/fission/fission/pkg/fission-cli/cliwrapper/cli" + "github.com/fission/fission/pkg/fission-cli/cmd" flagkey "github.com/fission/fission/pkg/fission-cli/flag/key" - "github.com/fission/fission/pkg/fission-cli/util" ) type ListSubCommand struct { - client *client.Client + cmd.CommandActioner namespace string } func List(input cli.Input) error { - c, err := util.GetServer(input) - if err != nil { - return err - } - opts := ListSubCommand{ - client: c, - } - return opts.do(input) + return (&ListSubCommand{}).do(input) } func (opts *ListSubCommand) do(input cli.Input) error { @@ -59,7 +51,7 @@ func (opts *ListSubCommand) complete(input cli.Input) error { } func (opts *ListSubCommand) run(input cli.Input) error { - mqts, err := opts.client.MessageQueueTriggerList(input.String(flagkey.MqtMQType), opts.namespace) + mqts, err := opts.Client().V1().MessageQueueTrigger().List(input.String(flagkey.MqtMQType), opts.namespace) if err != nil { return errors.Wrap(err, "error listing message queue triggers") } diff --git a/pkg/fission-cli/cmd/mqtrigger/update.go b/pkg/fission-cli/cmd/mqtrigger/update.go index 1c89981b..5bdeb333 100644 --- a/pkg/fission-cli/cmd/mqtrigger/update.go +++ b/pkg/fission-cli/cmd/mqtrigger/update.go @@ -23,26 +23,18 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" fv1 "github.com/fission/fission/pkg/apis/fission.io/v1" - "github.com/fission/fission/pkg/controller/client" "github.com/fission/fission/pkg/fission-cli/cliwrapper/cli" + "github.com/fission/fission/pkg/fission-cli/cmd" flagkey "github.com/fission/fission/pkg/fission-cli/flag/key" - "github.com/fission/fission/pkg/fission-cli/util" ) type UpdateSubCommand struct { - client *client.Client + cmd.CommandActioner trigger *fv1.MessageQueueTrigger } func Update(input cli.Input) error { - c, err := util.GetServer(input) - if err != nil { - return err - } - opts := UpdateSubCommand{ - client: c, - } - return opts.do(input) + return (&UpdateSubCommand{}).do(input) } func (opts *UpdateSubCommand) do(input cli.Input) error { @@ -54,7 +46,7 @@ func (opts *UpdateSubCommand) do(input cli.Input) error { } func (opts *UpdateSubCommand) complete(input cli.Input) error { - mqt, err := opts.client.MessageQueueTriggerGet(&metav1.ObjectMeta{ + mqt, err := opts.Client().V1().MessageQueueTrigger().Get(&metav1.ObjectMeta{ Name: input.String(flagkey.MqtName), Namespace: input.String(flagkey.NamespaceTrigger), }) @@ -111,7 +103,7 @@ func (opts *UpdateSubCommand) complete(input cli.Input) error { } func (opts *UpdateSubCommand) run(input cli.Input) error { - _, err := opts.client.MessageQueueTriggerUpdate(opts.trigger) + _, err := opts.Client().V1().MessageQueueTrigger().Update(opts.trigger) if err != nil { return errors.Wrap(err, "error updating message queue trigger") } diff --git a/pkg/fission-cli/cmd/package/create.go b/pkg/fission-cli/cmd/package/create.go index 8034e6c1..10ab503c 100644 --- a/pkg/fission-cli/cmd/package/create.go +++ b/pkg/fission-cli/cmd/package/create.go @@ -30,6 +30,7 @@ import ( fv1 "github.com/fission/fission/pkg/apis/fission.io/v1" "github.com/fission/fission/pkg/controller/client" "github.com/fission/fission/pkg/fission-cli/cliwrapper/cli" + "github.com/fission/fission/pkg/fission-cli/cmd" "github.com/fission/fission/pkg/fission-cli/cmd/spec" "github.com/fission/fission/pkg/fission-cli/console" flagkey "github.com/fission/fission/pkg/fission-cli/flag/key" @@ -37,18 +38,11 @@ import ( ) type CreateSubCommand struct { - client *client.Client + cmd.CommandActioner } func Create(input cli.Input) error { - c, err := util.GetServer(input) - if err != nil { - return err - } - opts := CreateSubCommand{ - client: c, - } - return opts.do(input) + return (&CreateSubCommand{}).do(input) } func (opts *CreateSubCommand) do(input cli.Input) error { @@ -114,14 +108,14 @@ func (opts *CreateSubCommand) run(input cli.Input) error { specFile = fmt.Sprintf("package-%v.yaml", pkgName) } - _, err := CreatePackage(input, opts.client, pkgName, pkgNamespace, envName, envNamespace, + _, err := CreatePackage(input, opts.Client(), pkgName, pkgNamespace, envName, envNamespace, srcArchiveFiles, deployArchiveFiles, buildcmd, specDir, specFile, noZip) return err } // TODO: get all necessary value from CLI input directly -func CreatePackage(input cli.Input, client *client.Client, pkgName string, pkgNamespace string, envName string, envNamespace string, +func CreatePackage(input cli.Input, client client.Interface, pkgName string, pkgNamespace string, envName string, envNamespace string, srcArchiveFiles []string, deployArchiveFiles []string, buildcmd string, specDir string, specFile string, noZip bool) (*metav1.ObjectMeta, error) { insecure := input.Bool(flagkey.PkgInsecure) @@ -201,7 +195,7 @@ func CreatePackage(input cli.Input, client *client.Client, pkgName string, pkgNa } return &pkg.Metadata, nil } else { - pkgMetadata, err := client.PackageCreate(pkg) + pkgMetadata, err := client.V1().Package().Create(pkg) if err != nil { return nil, errors.Wrap(err, "error creating package") } diff --git a/pkg/fission-cli/cmd/package/delete.go b/pkg/fission-cli/cmd/package/delete.go index 8e413553..e81a0b73 100644 --- a/pkg/fission-cli/cmd/package/delete.go +++ b/pkg/fission-cli/cmd/package/delete.go @@ -24,12 +24,12 @@ import ( "github.com/fission/fission/pkg/controller/client" "github.com/fission/fission/pkg/fission-cli/cliwrapper/cli" + "github.com/fission/fission/pkg/fission-cli/cmd" flagkey "github.com/fission/fission/pkg/fission-cli/flag/key" - "github.com/fission/fission/pkg/fission-cli/util" ) type DeleteSubCommand struct { - client *client.Client + cmd.CommandActioner name string namespace string deleteOrphans bool @@ -37,14 +37,7 @@ type DeleteSubCommand struct { } func Delete(input cli.Input) error { - c, err := util.GetServer(input) - if err != nil { - return err - } - opts := DeleteSubCommand{ - client: c, - } - return opts.do(input) + return (&DeleteSubCommand{}).do(input) } func (opts *DeleteSubCommand) do(input cli.Input) error { @@ -70,7 +63,7 @@ func (opts *DeleteSubCommand) complete(input cli.Input) error { func (opts *DeleteSubCommand) run(input cli.Input) error { if len(opts.name) != 0 { - _, err := opts.client.PackageGet(&metav1.ObjectMeta{ + _, err := opts.Client().V1().Package().Get(&metav1.ObjectMeta{ Namespace: opts.namespace, Name: opts.name, }) @@ -78,7 +71,7 @@ func (opts *DeleteSubCommand) run(input cli.Input) error { return errors.Wrap(err, "find package") } - fnList, err := GetFunctionsByPackage(opts.client, opts.name, opts.namespace) + fnList, err := GetFunctionsByPackage(opts.Client(), opts.name, opts.namespace) if err != nil { return err } @@ -86,7 +79,7 @@ func (opts *DeleteSubCommand) run(input cli.Input) error { if !opts.force && len(fnList) > 0 { return errors.New("Package is used by at least one function, use -f to force delete") } - err = deletePackage(opts.client, opts.name, opts.namespace) + err = deletePackage(opts.Client(), opts.name, opts.namespace) if err != nil { return err } @@ -95,7 +88,7 @@ func (opts *DeleteSubCommand) run(input cli.Input) error { // TODO improve list speed when --orphan if opts.deleteOrphans { - err := deleteOrphanPkgs(opts.client, opts.namespace) + err := deleteOrphanPkgs(opts.Client(), opts.namespace) if err != nil { return errors.Wrap(err, "deleting orphan packages") } @@ -105,8 +98,8 @@ func (opts *DeleteSubCommand) run(input cli.Input) error { return nil } -func deleteOrphanPkgs(client *client.Client, pkgNamespace string) error { - pkgList, err := client.PackageList(pkgNamespace) +func deleteOrphanPkgs(client client.Interface, pkgNamespace string) error { + pkgList, err := client.V1().Package().List(pkgNamespace) if err != nil { return err } @@ -127,8 +120,8 @@ func deleteOrphanPkgs(client *client.Client, pkgNamespace string) error { return nil } -func deletePackage(client *client.Client, pkgName string, pkgNamespace string) error { - return client.PackageDelete(&metav1.ObjectMeta{ +func deletePackage(client client.Interface, pkgName string, pkgNamespace string) error { + return client.V1().Package().Delete(&metav1.ObjectMeta{ Namespace: pkgNamespace, Name: pkgName, }) diff --git a/pkg/fission-cli/cmd/package/get.go b/pkg/fission-cli/cmd/package/get.go index 5090c124..dec01061 100644 --- a/pkg/fission-cli/cmd/package/get.go +++ b/pkg/fission-cli/cmd/package/get.go @@ -24,11 +24,10 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" fv1 "github.com/fission/fission/pkg/apis/fission.io/v1" - "github.com/fission/fission/pkg/controller/client" "github.com/fission/fission/pkg/fission-cli/cliwrapper/cli" + "github.com/fission/fission/pkg/fission-cli/cmd" pkgutil "github.com/fission/fission/pkg/fission-cli/cmd/package/util" flagkey "github.com/fission/fission/pkg/fission-cli/flag/key" - "github.com/fission/fission/pkg/fission-cli/util" ) const ( @@ -37,7 +36,7 @@ const ( ) type GetSubCommand struct { - client *client.Client + cmd.CommandActioner name string namespace string output string @@ -45,27 +44,11 @@ type GetSubCommand struct { } func GetSrc(input cli.Input) error { - c, err := util.GetServer(input) - if err != nil { - return err - } - opts := GetSubCommand{ - client: c, - archiveType: sourceArchive, - } - return opts.do(input) + return (&GetSubCommand{}).do(input) } func GetDeploy(input cli.Input) error { - c, err := util.GetServer(input) - if err != nil { - return err - } - opts := GetSubCommand{ - client: c, - archiveType: deployArchive, - } - return opts.do(input) + return (&GetSubCommand{}).do(input) } func (opts *GetSubCommand) do(input cli.Input) error { @@ -84,7 +67,7 @@ func (opts *GetSubCommand) complete(input cli.Input) error { } func (opts *GetSubCommand) run(input cli.Input) error { - pkg, err := opts.client.PackageGet(&metav1.ObjectMeta{ + pkg, err := opts.Client().V1().Package().Get(&metav1.ObjectMeta{ Namespace: opts.namespace, Name: opts.name, }) @@ -101,7 +84,7 @@ func (opts *GetSubCommand) run(input cli.Input) error { if pkg.Spec.Deployment.Type == fv1.ArchiveTypeLiteral { reader = bytes.NewReader(archive.Literal) } else if pkg.Spec.Deployment.Type == fv1.ArchiveTypeUrl { - readCloser, err := pkgutil.DownloadStoragesvcURL(opts.client, archive.URL) + readCloser, err := pkgutil.DownloadStoragesvcURL(opts.Client(), archive.URL) if err != nil { return err } diff --git a/pkg/fission-cli/cmd/package/info.go b/pkg/fission-cli/cmd/package/info.go index ea7736d7..b8cdd5d0 100644 --- a/pkg/fission-cli/cmd/package/info.go +++ b/pkg/fission-cli/cmd/package/info.go @@ -22,28 +22,20 @@ import ( "github.com/pkg/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "github.com/fission/fission/pkg/controller/client" "github.com/fission/fission/pkg/fission-cli/cliwrapper/cli" + "github.com/fission/fission/pkg/fission-cli/cmd" pkgutil "github.com/fission/fission/pkg/fission-cli/cmd/package/util" flagkey "github.com/fission/fission/pkg/fission-cli/flag/key" - "github.com/fission/fission/pkg/fission-cli/util" ) type InfoSubCommand struct { - client *client.Client + cmd.CommandActioner name string namespace string } func Info(input cli.Input) error { - c, err := util.GetServer(input) - if err != nil { - return err - } - opts := InfoSubCommand{ - client: c, - } - return opts.do(input) + return (&InfoSubCommand{}).do(input) } func (opts *InfoSubCommand) do(input cli.Input) error { @@ -61,7 +53,7 @@ func (opts *InfoSubCommand) complete(input cli.Input) error { } func (opts *InfoSubCommand) run(input cli.Input) error { - pkg, err := opts.client.PackageGet(&metav1.ObjectMeta{ + pkg, err := opts.Client().V1().Package().Get(&metav1.ObjectMeta{ Namespace: opts.namespace, Name: opts.name, }) diff --git a/pkg/fission-cli/cmd/package/list.go b/pkg/fission-cli/cmd/package/list.go index 345ffa00..41ee0d4e 100644 --- a/pkg/fission-cli/cmd/package/list.go +++ b/pkg/fission-cli/cmd/package/list.go @@ -25,28 +25,20 @@ import ( "github.com/pkg/errors" - "github.com/fission/fission/pkg/controller/client" "github.com/fission/fission/pkg/fission-cli/cliwrapper/cli" + "github.com/fission/fission/pkg/fission-cli/cmd" flagkey "github.com/fission/fission/pkg/fission-cli/flag/key" - "github.com/fission/fission/pkg/fission-cli/util" ) type ListSubCommand struct { - client *client.Client + cmd.CommandActioner listOrphans bool status string pkgNamespace string } func List(input cli.Input) error { - c, err := util.GetServer(input) - if err != nil { - return err - } - opts := ListSubCommand{ - client: c, - } - return opts.do(input) + return (&ListSubCommand{}).do(input) } func (opts *ListSubCommand) do(input cli.Input) error { @@ -66,7 +58,7 @@ func (opts *ListSubCommand) complete(input cli.Input) error { } func (opts *ListSubCommand) run(input cli.Input) error { - pkgList, err := opts.client.PackageList(opts.pkgNamespace) + pkgList, err := opts.Client().V1().Package().List(opts.pkgNamespace) if err != nil { return err } @@ -83,7 +75,7 @@ func (opts *ListSubCommand) run(input cli.Input) error { show := true // TODO improve list speed when --orphan if opts.listOrphans { - fnList, err := GetFunctionsByPackage(opts.client, pkg.Metadata.Name, pkg.Metadata.Namespace) + fnList, err := GetFunctionsByPackage(opts.Client(), pkg.Metadata.Name, pkg.Metadata.Namespace) if err != nil { return errors.Wrap(err, fmt.Sprintf("get functions sharing package %s", pkg.Metadata.Name)) } diff --git a/pkg/fission-cli/cmd/package/package.go b/pkg/fission-cli/cmd/package/package.go index da23ab62..18ca5499 100644 --- a/pkg/fission-cli/cmd/package/package.go +++ b/pkg/fission-cli/cmd/package/package.go @@ -45,7 +45,7 @@ import ( // create an archive upload spec in the specs directory; otherwise // upload the archive using client. noZip avoids zipping the // includeFiles, but is ignored if there's more than one includeFile. -func CreateArchive(client *client.Client, includeFiles []string, noZip bool, insecure bool, checksum string, specDir string, specFile string) (*fv1.Archive, error) { +func CreateArchive(client client.Interface, includeFiles []string, noZip bool, insecure bool, checksum string, specDir string, specFile string) (*fv1.Archive, error) { // get root dir var rootDir string var err error @@ -241,8 +241,8 @@ func archiveName(givenNameHint string, includedFiles []string) string { return fmt.Sprintf("%v-%v", util.KubifyName(includedFiles[0]), uniuri.NewLen(4)) } -func GetFunctionsByPackage(client *client.Client, pkgName, pkgNamespace string) ([]fv1.Function, error) { - fnList, err := client.FunctionList(pkgNamespace) +func GetFunctionsByPackage(client client.Interface, pkgName, pkgNamespace string) ([]fv1.Function, error) { + fnList, err := client.V1().Function().List(pkgNamespace) if err != nil { return nil, err } diff --git a/pkg/fission-cli/cmd/package/rebuild.go b/pkg/fission-cli/cmd/package/rebuild.go index ec1f00ff..0e245ff0 100644 --- a/pkg/fission-cli/cmd/package/rebuild.go +++ b/pkg/fission-cli/cmd/package/rebuild.go @@ -23,27 +23,19 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" fv1 "github.com/fission/fission/pkg/apis/fission.io/v1" - "github.com/fission/fission/pkg/controller/client" "github.com/fission/fission/pkg/fission-cli/cliwrapper/cli" + "github.com/fission/fission/pkg/fission-cli/cmd" flagkey "github.com/fission/fission/pkg/fission-cli/flag/key" - "github.com/fission/fission/pkg/fission-cli/util" ) type RebuildSubCommand struct { - client *client.Client + cmd.CommandActioner name string namespace string } func Rebuild(input cli.Input) error { - c, err := util.GetServer(input) - if err != nil { - return err - } - opts := RebuildSubCommand{ - client: c, - } - return opts.do(input) + return (&RebuildSubCommand{}).do(input) } func (opts *RebuildSubCommand) do(input cli.Input) error { @@ -61,7 +53,7 @@ func (opts *RebuildSubCommand) complete(input cli.Input) error { } func (opts *RebuildSubCommand) run(input cli.Input) error { - pkg, err := opts.client.PackageGet(&metav1.ObjectMeta{ + pkg, err := opts.Client().V1().Package().Get(&metav1.ObjectMeta{ Name: opts.name, Namespace: opts.namespace, }) @@ -74,7 +66,7 @@ func (opts *RebuildSubCommand) run(input cli.Input) error { pkg.Metadata.Name, fv1.BuildStatusFailed)) } - _, err = updatePackageStatus(opts.client, pkg, fv1.BuildStatusPending) + _, err = updatePackageStatus(opts.Client(), pkg, fv1.BuildStatusPending) if err != nil { return errors.Wrap(err, "update package status") } diff --git a/pkg/fission-cli/cmd/package/update.go b/pkg/fission-cli/cmd/package/update.go index 96bcf781..306a3d70 100644 --- a/pkg/fission-cli/cmd/package/update.go +++ b/pkg/fission-cli/cmd/package/update.go @@ -27,26 +27,19 @@ import ( fv1 "github.com/fission/fission/pkg/apis/fission.io/v1" "github.com/fission/fission/pkg/controller/client" "github.com/fission/fission/pkg/fission-cli/cliwrapper/cli" + "github.com/fission/fission/pkg/fission-cli/cmd" flagkey "github.com/fission/fission/pkg/fission-cli/flag/key" - "github.com/fission/fission/pkg/fission-cli/util" ) type UpdateSubCommand struct { - client *client.Client + cmd.CommandActioner pkgName string pkgNamespace string force bool } func Update(input cli.Input) error { - c, err := util.GetServer(input) - if err != nil { - return err - } - opts := UpdateSubCommand{ - client: c, - } - return opts.do(input) + return (&UpdateSubCommand{}).do(input) } func (opts *UpdateSubCommand) do(input cli.Input) error { @@ -65,7 +58,7 @@ func (opts *UpdateSubCommand) complete(input cli.Input) error { } func (opts *UpdateSubCommand) run(input cli.Input) error { - pkg, err := opts.client.PackageGet(&metav1.ObjectMeta{ + pkg, err := opts.Client().V1().Package().Get(&metav1.ObjectMeta{ Namespace: opts.pkgNamespace, Name: opts.pkgName, }) @@ -75,7 +68,7 @@ func (opts *UpdateSubCommand) run(input cli.Input) error { forceUpdate := input.Bool(flagkey.PkgForce) - fnList, err := GetFunctionsByPackage(opts.client, pkg.Metadata.Name, pkg.Metadata.Namespace) + fnList, err := GetFunctionsByPackage(opts.Client(), pkg.Metadata.Name, pkg.Metadata.Namespace) if err != nil { return errors.Wrap(err, "error getting function list") } @@ -84,13 +77,13 @@ func (opts *UpdateSubCommand) run(input cli.Input) error { return errors.Errorf("package is used by multiple functions, use --%v to force update", flagkey.PkgForce) } - newPkgMeta, err := UpdatePackage(input, opts.client, pkg) + newPkgMeta, err := UpdatePackage(input, opts.Client(), pkg) if err != nil { return errors.Wrap(err, "error updating package") } if pkg.Metadata.ResourceVersion != newPkgMeta.ResourceVersion { - err = UpdateFunctionPackageResourceVersion(opts.client, newPkgMeta, fnList...) + err = UpdateFunctionPackageResourceVersion(opts.Client(), newPkgMeta, fnList...) if err != nil { return errors.Wrap(err, "error updating function package reference resource version") } @@ -99,7 +92,7 @@ func (opts *UpdateSubCommand) run(input cli.Input) error { return nil } -func UpdatePackage(input cli.Input, client *client.Client, pkg *fv1.Package) (*metav1.ObjectMeta, error) { +func UpdatePackage(input cli.Input, client client.Interface, pkg *fv1.Package) (*metav1.ObjectMeta, error) { envName := input.String(flagkey.PkgEnvironment) envNamespace := input.String(flagkey.NamespaceEnvironment) srcArchiveFiles := input.StringSlice(flagkey.PkgSrcArchive) @@ -185,7 +178,7 @@ func UpdatePackage(input cli.Input, client *client.Client, pkg *fv1.Package) (*m } } - newPkgMeta, err := client.PackageUpdate(pkg) + newPkgMeta, err := client.V1().Package().Update(pkg) if err != nil { return nil, errors.Wrap(err, "update package") } @@ -195,13 +188,13 @@ func UpdatePackage(input cli.Input, client *client.Client, pkg *fv1.Package) (*m return newPkgMeta, err } -func UpdateFunctionPackageResourceVersion(client *client.Client, pkgMeta *metav1.ObjectMeta, fnList ...fv1.Function) error { +func UpdateFunctionPackageResourceVersion(client client.Interface, pkgMeta *metav1.ObjectMeta, fnList ...fv1.Function) error { errs := &multierror.Error{} // update resource version of package reference of functions that shared the same package for _, fn := range fnList { fn.Spec.Package.PackageRef.ResourceVersion = pkgMeta.ResourceVersion - _, err := client.FunctionUpdate(&fn) + _, err := client.V1().Function().Update(&fn) if err != nil { errs = multierror.Append(errs, errors.Wrapf(err, "error updating package resource version of function '%v'", fn.Metadata.Name)) } @@ -210,14 +203,14 @@ func UpdateFunctionPackageResourceVersion(client *client.Client, pkgMeta *metav1 return errs.ErrorOrNil() } -func updatePackageStatus(client *client.Client, pkg *fv1.Package, status fv1.BuildStatus) (*metav1.ObjectMeta, error) { +func updatePackageStatus(client client.Interface, pkg *fv1.Package, status fv1.BuildStatus) (*metav1.ObjectMeta, error) { switch status { case fv1.BuildStatusNone, fv1.BuildStatusPending, fv1.BuildStatusRunning, fv1.BuildStatusSucceeded, fv1.CanaryConfigStatusAborted: pkg.Status = fv1.PackageStatus{ BuildStatus: status, LastUpdateTimestamp: time.Now().UTC(), } - pkg, err := client.PackageUpdate(pkg) + pkg, err := client.V1().Package().Update(pkg) return pkg, err } return nil, errors.New("unknown package status") diff --git a/pkg/fission-cli/cmd/package/util/util.go b/pkg/fission-cli/cmd/package/util/util.go index a0052c43..dc211a2d 100644 --- a/pkg/fission-cli/cmd/package/util/util.go +++ b/pkg/fission-cli/cmd/package/util/util.go @@ -37,7 +37,7 @@ import ( "github.com/fission/fission/pkg/utils" ) -func UploadArchiveFile(ctx context.Context, client *client.Client, fileName string) (*fv1.Archive, error) { +func UploadArchiveFile(ctx context.Context, client client.Interface, fileName string) (*fv1.Archive, error) { var archive fv1.Archive size, err := utils.FileSize(fileName) @@ -52,7 +52,7 @@ func UploadArchiveFile(ctx context.Context, client *client.Client, fileName stri return nil, err } } else { - u := strings.TrimSuffix(client.Url, "/") + "/proxy/storage" + u := strings.TrimSuffix(client.ServerURL(), "/") + "/proxy/storage" ssClient := storageSvcClient.MakeClient(u) // TODO add a progress bar @@ -61,7 +61,7 @@ func UploadArchiveFile(ctx context.Context, client *client.Client, fileName stri return nil, errors.Wrapf(err, "error uploading file %v", fileName) } - storageSvc, err := client.GetSvcURL("application=fission-storage") + storageSvc, err := client.V1().Misc().GetSvcURL("application=fission-storage") storageSvcURL := "http://" + storageSvc if err != nil { return nil, errors.Wrapf(err, "error getting fission storage service name") @@ -161,14 +161,14 @@ func WriteArchiveToFile(fileName string, reader io.Reader) error { } // DownloadStoragesvcURL downloads and return archive content with given storage service url -func DownloadStoragesvcURL(client *client.Client, fileUrl string) (io.ReadCloser, error) { +func DownloadStoragesvcURL(client client.Interface, fileUrl string) (io.ReadCloser, error) { u, err := url.ParseRequestURI(fileUrl) if err != nil { return nil, err } // replace in-cluster storage service host with controller server url - fileDownloadUrl := strings.TrimSuffix(client.Url, "/") + "/proxy/storage/" + u.RequestURI() + fileDownloadUrl := strings.TrimSuffix(client.ServerURL(), "/") + "/proxy/storage/" + u.RequestURI() reader, err := DownloadURL(fileDownloadUrl) if err != nil { return nil, errors.Wrapf(err, fmt.Sprintf("error downloading from storage service url: %v", fileUrl)) diff --git a/pkg/fission-cli/cmd/plugin/list.go b/pkg/fission-cli/cmd/plugin/list.go index 6965a460..02ae5216 100644 --- a/pkg/fission-cli/cmd/plugin/list.go +++ b/pkg/fission-cli/cmd/plugin/list.go @@ -21,25 +21,17 @@ import ( "os" "text/tabwriter" - "github.com/fission/fission/pkg/controller/client" "github.com/fission/fission/pkg/fission-cli/cliwrapper/cli" - "github.com/fission/fission/pkg/fission-cli/util" + "github.com/fission/fission/pkg/fission-cli/cmd" "github.com/fission/fission/pkg/plugin" ) type ListSubCommand struct { - client *client.Client + cmd.CommandActioner } func List(input cli.Input) error { - c, err := util.GetServer(input) - if err != nil { - return err - } - opts := &ListSubCommand{ - client: c, - } - return opts.do(input) + return (&ListSubCommand{}).do(input) } func (opts *ListSubCommand) do(input cli.Input) error { diff --git a/pkg/fission-cli/cmd/spec/apply.go b/pkg/fission-cli/cmd/spec/apply.go index 8a07b69c..74e37191 100644 --- a/pkg/fission-cli/cmd/spec/apply.go +++ b/pkg/fission-cli/cmd/spec/apply.go @@ -34,6 +34,7 @@ import ( fv1 "github.com/fission/fission/pkg/apis/fission.io/v1" "github.com/fission/fission/pkg/controller/client" "github.com/fission/fission/pkg/fission-cli/cliwrapper/cli" + "github.com/fission/fission/pkg/fission-cli/cmd" pkgutil "github.com/fission/fission/pkg/fission-cli/cmd/package/util" spectypes "github.com/fission/fission/pkg/fission-cli/cmd/spec/types" "github.com/fission/fission/pkg/fission-cli/console" @@ -44,7 +45,7 @@ import ( ) type ApplySubCommand struct { - client *client.Client + cmd.CommandActioner } // Apply compares the specs in the spec/config/ directory to the @@ -57,14 +58,7 @@ type ApplySubCommand struct { // etc, while doing an apply, they will get a partially applied deployment. However, // they can retry their apply command once they're back online. func Apply(input cli.Input) error { - c, err := util.GetServer(input) - if err != nil { - return err - } - opts := ApplySubCommand{ - client: c, - } - return opts.do(input) + return (&ApplySubCommand{}).do(input) } func (opts *ApplySubCommand) do(input cli.Input) error { @@ -83,7 +77,7 @@ func (opts *ApplySubCommand) run(input cli.Input) error { if watchResources || waitForBuild { // init package build watcher - pbw = makePackageBuildWatcher(opts.client) + pbw = makePackageBuildWatcher(opts.Client()) } if watchResources { @@ -129,7 +123,7 @@ func (opts *ApplySubCommand) run(input cli.Input) error { } // make changes to the cluster based on the specs - pkgMetas, as, err := applyResources(opts.client, specDir, fr, deleteResources) + pkgMetas, as, err := applyResources(opts.Client(), specDir, fr, deleteResources) if err != nil { return errors.Wrap(err, "error applying specs") } @@ -258,7 +252,7 @@ func pluralize(num int, word string) string { } // applyArchives figures out the set of archives that need to be uploaded, and uploads them. -func applyArchives(fclient *client.Client, specDir string, fr *FissionResources) error { +func applyArchives(fclient client.Interface, specDir string, fr *FissionResources) error { // archive:// URL -> archive map. archiveFiles := make(map[string]fv1.Archive) @@ -278,7 +272,7 @@ func applyArchives(fclient *client.Client, specDir string, fr *FissionResources) // get list of packages, make content-indexed map of available archives availableArchives := make(map[string]string) // (sha256 -> url) - pkgs, err := fclient.PackageList(metav1.NamespaceAll) + pkgs, err := fclient.V1().Package().List(metav1.NamespaceAll) if err != nil { return err } @@ -332,7 +326,7 @@ func applyArchives(fclient *client.Client, specDir string, fr *FissionResources) } // applyResources applies the given set of fission resources. -func applyResources(fclient *client.Client, specDir string, fr *FissionResources, delete bool) (map[string]metav1.ObjectMeta, map[string]ResourceApplyStatus, error) { +func applyResources(fclient client.Interface, specDir string, fr *FissionResources, delete bool) (map[string]metav1.ObjectMeta, map[string]ResourceApplyStatus, error) { applyStatus := make(map[string]ResourceApplyStatus) @@ -527,7 +521,7 @@ func hasDeploymentConfig(m *metav1.ObjectMeta, fr *FissionResources) bool { return false } -func waitForPackageBuild(fclient *client.Client, pkg *fv1.Package) (*fv1.Package, error) { +func waitForPackageBuild(fclient client.Interface, pkg *fv1.Package) (*fv1.Package, error) { start := time.Now() for { if pkg.Status.BuildStatus != fv1.BuildStatusRunning { @@ -541,16 +535,16 @@ func waitForPackageBuild(fclient *client.Client, pkg *fv1.Package) (*fv1.Package time.Sleep(time.Second) var err error - pkg, err = fclient.PackageGet(&pkg.Metadata) + pkg, err = fclient.V1().Package().Get(&pkg.Metadata) if err != nil { return nil, err } } } -func applyPackages(fclient *client.Client, fr *FissionResources, delete bool) (map[string]metav1.ObjectMeta, *ResourceApplyStatus, error) { +func applyPackages(fclient client.Interface, fr *FissionResources, delete bool) (map[string]metav1.ObjectMeta, *ResourceApplyStatus, error) { // get list - allObjs, err := fclient.PackageList(metav1.NamespaceAll) + allObjs, err := fclient.V1().Package().List(metav1.NamespaceAll) if err != nil { return nil, nil, err } @@ -620,7 +614,7 @@ func applyPackages(fclient *client.Client, fr *FissionResources, delete bool) (m pkg.Status.BuildStatus = fv1.BuildStatusPending } - newmeta, err := fclient.PackageUpdate(pkg) + newmeta, err := fclient.V1().Package().Update(pkg) if err != nil { return nil, nil, err // TODO check for resourceVersion conflict errors and retry @@ -631,7 +625,7 @@ func applyPackages(fclient *client.Client, fr *FissionResources, delete bool) (m } } else { // create - newmeta, err := fclient.PackageCreate(&o) + newmeta, err := fclient.V1().Package().Create(&o) if err != nil { return nil, nil, err } @@ -646,7 +640,7 @@ func applyPackages(fclient *client.Client, fr *FissionResources, delete bool) (m for _, o := range objs { _, wanted := desired[mapKey(&o.Metadata)] if !wanted { - err := fclient.PackageDelete(&o.Metadata) + err := fclient.V1().Package().Delete(&o.Metadata) if err != nil { return nil, nil, err } @@ -659,9 +653,9 @@ func applyPackages(fclient *client.Client, fr *FissionResources, delete bool) (m return metadataMap, &ras, nil } -func applyFunctions(fclient *client.Client, fr *FissionResources, delete bool) (map[string]metav1.ObjectMeta, *ResourceApplyStatus, error) { +func applyFunctions(fclient client.Interface, fr *FissionResources, delete bool) (map[string]metav1.ObjectMeta, *ResourceApplyStatus, error) { // get list - allObjs, err := fclient.FunctionList(metav1.NamespaceAll) + allObjs, err := fclient.V1().Function().List(metav1.NamespaceAll) if err != nil { return nil, nil, err } @@ -704,7 +698,7 @@ func applyFunctions(fclient *client.Client, fr *FissionResources, delete bool) ( } else { // update o.Metadata.ResourceVersion = existingObj.Metadata.ResourceVersion - newmeta, err := fclient.FunctionUpdate(&o) + newmeta, err := fclient.V1().Function().Update(&o) if err != nil { return nil, nil, err } @@ -714,7 +708,7 @@ func applyFunctions(fclient *client.Client, fr *FissionResources, delete bool) ( } } else { // create - newmeta, err := fclient.FunctionCreate(&o) + newmeta, err := fclient.V1().Function().Create(&o) if err != nil { return nil, nil, err } @@ -729,7 +723,7 @@ func applyFunctions(fclient *client.Client, fr *FissionResources, delete bool) ( for _, o := range objs { _, wanted := desired[mapKey(&o.Metadata)] if !wanted { - err := fclient.FunctionDelete(&o.Metadata) + err := fclient.V1().Function().Delete(&o.Metadata) if err != nil { return nil, nil, err } @@ -742,9 +736,9 @@ func applyFunctions(fclient *client.Client, fr *FissionResources, delete bool) ( return metadataMap, &ras, nil } -func applyEnvironments(fclient *client.Client, fr *FissionResources, delete bool) (map[string]metav1.ObjectMeta, *ResourceApplyStatus, error) { +func applyEnvironments(fclient client.Interface, fr *FissionResources, delete bool) (map[string]metav1.ObjectMeta, *ResourceApplyStatus, error) { // get list - allObjs, err := fclient.EnvironmentList(metav1.NamespaceAll) + allObjs, err := fclient.V1().Environment().List(metav1.NamespaceAll) if err != nil { return nil, nil, err } @@ -787,7 +781,7 @@ func applyEnvironments(fclient *client.Client, fr *FissionResources, delete bool } else { // update o.Metadata.ResourceVersion = existingObj.Metadata.ResourceVersion - newmeta, err := fclient.EnvironmentUpdate(&o) + newmeta, err := fclient.V1().Environment().Update(&o) if err != nil { return nil, nil, err } @@ -797,7 +791,7 @@ func applyEnvironments(fclient *client.Client, fr *FissionResources, delete bool } } else { // create - newmeta, err := fclient.EnvironmentCreate(&o) + newmeta, err := fclient.V1().Environment().Create(&o) if err != nil { return nil, nil, err } @@ -812,7 +806,7 @@ func applyEnvironments(fclient *client.Client, fr *FissionResources, delete bool for _, o := range objs { _, wanted := desired[mapKey(&o.Metadata)] if !wanted { - err := fclient.EnvironmentDelete(&o.Metadata) + err := fclient.V1().Environment().Delete(&o.Metadata) if err != nil { return nil, nil, err } @@ -825,9 +819,9 @@ func applyEnvironments(fclient *client.Client, fr *FissionResources, delete bool return metadataMap, &ras, nil } -func applyHTTPTriggers(fclient *client.Client, fr *FissionResources, delete bool) (map[string]metav1.ObjectMeta, *ResourceApplyStatus, error) { +func applyHTTPTriggers(fclient client.Interface, fr *FissionResources, delete bool) (map[string]metav1.ObjectMeta, *ResourceApplyStatus, error) { // get list - allObjs, err := fclient.HTTPTriggerList(metav1.NamespaceAll) + allObjs, err := fclient.V1().HTTPTrigger().List(metav1.NamespaceAll) if err != nil { return nil, nil, err } @@ -870,7 +864,7 @@ func applyHTTPTriggers(fclient *client.Client, fr *FissionResources, delete bool } else { // update o.Metadata.ResourceVersion = existingObj.Metadata.ResourceVersion - newmeta, err := fclient.HTTPTriggerUpdate(&o) + newmeta, err := fclient.V1().HTTPTrigger().Update(&o) if err != nil { return nil, nil, err } @@ -880,7 +874,7 @@ func applyHTTPTriggers(fclient *client.Client, fr *FissionResources, delete bool } } else { // create - newmeta, err := fclient.HTTPTriggerCreate(&o) + newmeta, err := fclient.V1().HTTPTrigger().Create(&o) if err != nil { return nil, nil, err } @@ -895,7 +889,7 @@ func applyHTTPTriggers(fclient *client.Client, fr *FissionResources, delete bool for _, o := range objs { _, wanted := desired[mapKey(&o.Metadata)] if !wanted { - err := fclient.HTTPTriggerDelete(&o.Metadata) + err := fclient.V1().HTTPTrigger().Delete(&o.Metadata) if err != nil { return nil, nil, err } @@ -908,9 +902,9 @@ func applyHTTPTriggers(fclient *client.Client, fr *FissionResources, delete bool return metadataMap, &ras, nil } -func applyKubernetesWatchTriggers(fclient *client.Client, fr *FissionResources, delete bool) (map[string]metav1.ObjectMeta, *ResourceApplyStatus, error) { +func applyKubernetesWatchTriggers(fclient client.Interface, fr *FissionResources, delete bool) (map[string]metav1.ObjectMeta, *ResourceApplyStatus, error) { // get list - allObjs, err := fclient.WatchList(metav1.NamespaceAll) + allObjs, err := fclient.V1().KubeWatcher().List(metav1.NamespaceAll) if err != nil { return nil, nil, err } @@ -953,7 +947,7 @@ func applyKubernetesWatchTriggers(fclient *client.Client, fr *FissionResources, } else { // update o.Metadata.ResourceVersion = existingObj.Metadata.ResourceVersion - newmeta, err := fclient.WatchUpdate(&o) + newmeta, err := fclient.V1().KubeWatcher().Update(&o) if err != nil { return nil, nil, err } @@ -963,7 +957,7 @@ func applyKubernetesWatchTriggers(fclient *client.Client, fr *FissionResources, } } else { // create - newmeta, err := fclient.WatchCreate(&o) + newmeta, err := fclient.V1().KubeWatcher().Create(&o) if err != nil { return nil, nil, err } @@ -978,7 +972,7 @@ func applyKubernetesWatchTriggers(fclient *client.Client, fr *FissionResources, for _, o := range objs { _, wanted := desired[mapKey(&o.Metadata)] if !wanted { - err := fclient.WatchDelete(&o.Metadata) + err := fclient.V1().KubeWatcher().Delete(&o.Metadata) if err != nil { return nil, nil, err } @@ -991,9 +985,9 @@ func applyKubernetesWatchTriggers(fclient *client.Client, fr *FissionResources, return metadataMap, &ras, nil } -func applyTimeTriggers(fclient *client.Client, fr *FissionResources, delete bool) (map[string]metav1.ObjectMeta, *ResourceApplyStatus, error) { +func applyTimeTriggers(fclient client.Interface, fr *FissionResources, delete bool) (map[string]metav1.ObjectMeta, *ResourceApplyStatus, error) { // get list - allObjs, err := fclient.TimeTriggerList(metav1.NamespaceAll) + allObjs, err := fclient.V1().TimeTrigger().List(metav1.NamespaceAll) if err != nil { return nil, nil, err } @@ -1036,7 +1030,7 @@ func applyTimeTriggers(fclient *client.Client, fr *FissionResources, delete bool } else { // update o.Metadata.ResourceVersion = existingObj.Metadata.ResourceVersion - newmeta, err := fclient.TimeTriggerUpdate(&o) + newmeta, err := fclient.V1().TimeTrigger().Update(&o) if err != nil { return nil, nil, err } @@ -1046,7 +1040,7 @@ func applyTimeTriggers(fclient *client.Client, fr *FissionResources, delete bool } } else { // create - newmeta, err := fclient.TimeTriggerCreate(&o) + newmeta, err := fclient.V1().TimeTrigger().Create(&o) if err != nil { return nil, nil, err } @@ -1061,7 +1055,7 @@ func applyTimeTriggers(fclient *client.Client, fr *FissionResources, delete bool for _, o := range objs { _, wanted := desired[mapKey(&o.Metadata)] if !wanted { - err := fclient.TimeTriggerDelete(&o.Metadata) + err := fclient.V1().TimeTrigger().Delete(&o.Metadata) if err != nil { return nil, nil, err } @@ -1074,9 +1068,9 @@ func applyTimeTriggers(fclient *client.Client, fr *FissionResources, delete bool return metadataMap, &ras, nil } -func applyMessageQueueTriggers(fclient *client.Client, fr *FissionResources, delete bool) (map[string]metav1.ObjectMeta, *ResourceApplyStatus, error) { +func applyMessageQueueTriggers(fclient client.Interface, fr *FissionResources, delete bool) (map[string]metav1.ObjectMeta, *ResourceApplyStatus, error) { // get list - allObjs, err := fclient.MessageQueueTriggerList("", metav1.NamespaceAll) + allObjs, err := fclient.V1().MessageQueueTrigger().List("", metav1.NamespaceAll) if err != nil { return nil, nil, err } @@ -1119,7 +1113,7 @@ func applyMessageQueueTriggers(fclient *client.Client, fr *FissionResources, del } else { // update o.Metadata.ResourceVersion = existingObj.Metadata.ResourceVersion - newmeta, err := fclient.MessageQueueTriggerUpdate(&o) + newmeta, err := fclient.V1().MessageQueueTrigger().Update(&o) if err != nil { return nil, nil, err } @@ -1129,7 +1123,7 @@ func applyMessageQueueTriggers(fclient *client.Client, fr *FissionResources, del } } else { // create - newmeta, err := fclient.MessageQueueTriggerCreate(&o) + newmeta, err := fclient.V1().MessageQueueTrigger().Create(&o) if err != nil { return nil, nil, err } @@ -1144,7 +1138,7 @@ func applyMessageQueueTriggers(fclient *client.Client, fr *FissionResources, del for _, o := range objs { _, wanted := desired[mapKey(&o.Metadata)] if !wanted { - err := fclient.MessageQueueTriggerDelete(&o.Metadata) + err := fclient.V1().MessageQueueTrigger().Delete(&o.Metadata) if err != nil { return nil, nil, err } diff --git a/pkg/fission-cli/cmd/spec/buildwatch.go b/pkg/fission-cli/cmd/spec/buildwatch.go index 9244c98c..a9828290 100644 --- a/pkg/fission-cli/cmd/spec/buildwatch.go +++ b/pkg/fission-cli/cmd/spec/buildwatch.go @@ -34,7 +34,7 @@ type ( // packageBuildWatcher is used to watch a set of in-progress builds. packageBuildWatcher struct { // fission client - fclient *client.Client + fclient client.Interface // set of packages already printed, ensures we don't duplicate the notifications finished map[string]bool @@ -44,7 +44,7 @@ type ( } ) -func makePackageBuildWatcher(fclient *client.Client) *packageBuildWatcher { +func makePackageBuildWatcher(fclient client.Interface) *packageBuildWatcher { return &packageBuildWatcher{ fclient: fclient, finished: make(map[string]bool), @@ -68,7 +68,7 @@ func (w *packageBuildWatcher) watch(ctx context.Context) { } // pull list of packages (TODO: convert to watch) - pkgs, err := w.fclient.PackageList(metav1.NamespaceAll) + pkgs, err := w.fclient.V1().Package().List(metav1.NamespaceAll) if err != nil { fmt.Printf("Getting list of packages: %v", err) os.Exit(1) diff --git a/pkg/fission-cli/cmd/spec/destroy.go b/pkg/fission-cli/cmd/spec/destroy.go index 34c2a374..fd64fa2f 100644 --- a/pkg/fission-cli/cmd/spec/destroy.go +++ b/pkg/fission-cli/cmd/spec/destroy.go @@ -19,25 +19,18 @@ package spec import ( "github.com/pkg/errors" - "github.com/fission/fission/pkg/controller/client" "github.com/fission/fission/pkg/fission-cli/cliwrapper/cli" + "github.com/fission/fission/pkg/fission-cli/cmd" "github.com/fission/fission/pkg/fission-cli/util" ) type DestroySubCommand struct { - client *client.Client + cmd.CommandActioner } // Destroy destroys everything in the spec. func Destroy(input cli.Input) error { - c, err := util.GetServer(input) - if err != nil { - return err - } - opts := &DestroySubCommand{ - client: c, - } - return opts.do(input) + return (&DestroySubCommand{}).do(input) } func (opts *DestroySubCommand) do(input cli.Input) error { @@ -59,7 +52,7 @@ func (opts *DestroySubCommand) run(input cli.Input) error { emptyFr.DeploymentConfig = fr.DeploymentConfig // "apply" the empty state - _, _, err = applyResources(opts.client, specDir, &emptyFr, true) + _, _, err = applyResources(opts.Client(), specDir, &emptyFr, true) if err != nil { return errors.Wrap(err, "error deleting resources") } diff --git a/pkg/fission-cli/cmd/spec/init.go b/pkg/fission-cli/cmd/spec/init.go index e1140ca9..c342b509 100644 --- a/pkg/fission-cli/cmd/spec/init.go +++ b/pkg/fission-cli/cmd/spec/init.go @@ -26,27 +26,20 @@ import ( "github.com/pkg/errors" uuid "github.com/satori/go.uuid" - "github.com/fission/fission/pkg/controller/client" "github.com/fission/fission/pkg/fission-cli/cliwrapper/cli" + "github.com/fission/fission/pkg/fission-cli/cmd" spectypes "github.com/fission/fission/pkg/fission-cli/cmd/spec/types" flagkey "github.com/fission/fission/pkg/fission-cli/flag/key" "github.com/fission/fission/pkg/fission-cli/util" ) type InitSubCommand struct { - client *client.Client + cmd.CommandActioner deployConfig *spectypes.DeploymentConfig } func Init(input cli.Input) error { - c, err := util.GetServer(input) - if err != nil { - return err - } - opts := InitSubCommand{ - client: c, - } - return opts.do(input) + return (&InitSubCommand{}).do(input) } func (opts *InitSubCommand) do(input cli.Input) error { diff --git a/pkg/fission-cli/cmd/spec/spec.go b/pkg/fission-cli/cmd/spec/spec.go index 158f178a..ab4e0041 100644 --- a/pkg/fission-cli/cmd/spec/spec.go +++ b/pkg/fission-cli/cmd/spec/spec.go @@ -378,7 +378,7 @@ func (fr *FissionResources) Validate(input cli.Input) error { return err } for _, cm := range f.Spec.ConfigMaps { - _, err := client.ConfigMapGet(&metav1.ObjectMeta{ + _, err := client.V1().Misc().ConfigMapGet(&metav1.ObjectMeta{ Name: cm.Name, Namespace: cm.Namespace, }) @@ -388,7 +388,7 @@ func (fr *FissionResources) Validate(input cli.Input) error { } for _, s := range f.Spec.Secrets { - _, err := client.SecretGet(&metav1.ObjectMeta{ + _, err := client.V1().Misc().SecretGet(&metav1.ObjectMeta{ Name: s.Name, Namespace: s.Namespace, }) diff --git a/pkg/fission-cli/cmd/spec/validate.go b/pkg/fission-cli/cmd/spec/validate.go index 0a04927c..62d3ffea 100644 --- a/pkg/fission-cli/cmd/spec/validate.go +++ b/pkg/fission-cli/cmd/spec/validate.go @@ -27,26 +27,19 @@ import ( "github.com/pkg/errors" fv1 "github.com/fission/fission/pkg/apis/fission.io/v1" - "github.com/fission/fission/pkg/controller/client" "github.com/fission/fission/pkg/fission-cli/cliwrapper/cli" + "github.com/fission/fission/pkg/fission-cli/cmd" "github.com/fission/fission/pkg/fission-cli/util" ) type ValidateSubCommand struct { - client *client.Client + cmd.CommandActioner } // Validate parses a set of specs and checks for references to // resources that don't exist. func Validate(input cli.Input) error { - c, err := util.GetServer(input) - if err != nil { - return err - } - opts := &ValidateSubCommand{ - client: c, - } - return opts.do(input) + return (&ValidateSubCommand{}).do(input) } func (opts *ValidateSubCommand) do(input cli.Input) error { diff --git a/pkg/fission-cli/cmd/support/dump.go b/pkg/fission-cli/cmd/support/dump.go index f59a92ab..decc421a 100644 --- a/pkg/fission-cli/cmd/support/dump.go +++ b/pkg/fission-cli/cmd/support/dump.go @@ -25,8 +25,8 @@ import ( "github.com/pkg/errors" - "github.com/fission/fission/pkg/controller/client" "github.com/fission/fission/pkg/fission-cli/cliwrapper/cli" + "github.com/fission/fission/pkg/fission-cli/cmd" "github.com/fission/fission/pkg/fission-cli/cmd/support/resources" flagkey "github.com/fission/fission/pkg/fission-cli/flag/key" "github.com/fission/fission/pkg/fission-cli/util" @@ -39,18 +39,11 @@ const ( ) type DumpSubCommand struct { - client *client.Client + cmd.CommandActioner } func Dump(input cli.Input) error { - c, err := util.GetServer(input) - if err != nil { - return err - } - opts := &DumpSubCommand{ - client: c, - } - return opts.do(input) + return (&DumpSubCommand{}).do(input) } func (opts *DumpSubCommand) do(input cli.Input) error { @@ -86,7 +79,7 @@ func (opts *DumpSubCommand) do(input cli.Input) error { "kubernetes-nodes": resources.NewKubernetesObjectDumper(k8sClient, resources.KubernetesNode, ""), // fission info - "fission-version": resources.NewFissionVersion(opts.client), + "fission-version": resources.NewFissionVersion(opts.Client()), // fission component logs & spec "fission-components-svc-spec": resources.NewKubernetesObjectDumper(k8sClient, resources.KubernetesService, @@ -113,13 +106,13 @@ func (opts *DumpSubCommand) do(input cli.Input) error { "fission-function-pod-log": resources.NewKubernetesPodLogDumper(k8sClient, "executorType in (poolmgr, newdeploy)"), // CRD resources - "fission-crd-packages": resources.NewCrdDumper(opts.client, resources.CrdPackage), - "fission-crd-environments": resources.NewCrdDumper(opts.client, resources.CrdEnvironment), - "fission-crd-functions": resources.NewCrdDumper(opts.client, resources.CrdFunction), - "fission-crd-httptriggers": resources.NewCrdDumper(opts.client, resources.CrdHttpTrigger), - "fission-crd-kubewatchers": resources.NewCrdDumper(opts.client, resources.CrdKubeWatcher), - "fission-crd-mqtriggers": resources.NewCrdDumper(opts.client, resources.CrdMessageQueueTrigger), - "fission-crd-timetriggers": resources.NewCrdDumper(opts.client, resources.CrdTimeTrigger), + "fission-crd-packages": resources.NewCrdDumper(opts.Client(), resources.CrdPackage), + "fission-crd-environments": resources.NewCrdDumper(opts.Client(), resources.CrdEnvironment), + "fission-crd-functions": resources.NewCrdDumper(opts.Client(), resources.CrdFunction), + "fission-crd-httptriggers": resources.NewCrdDumper(opts.Client(), resources.CrdHttpTrigger), + "fission-crd-kubewatchers": resources.NewCrdDumper(opts.Client(), resources.CrdKubeWatcher), + "fission-crd-mqtriggers": resources.NewCrdDumper(opts.Client(), resources.CrdMessageQueueTrigger), + "fission-crd-timetriggers": resources.NewCrdDumper(opts.Client(), resources.CrdTimeTrigger), } dumpName := fmt.Sprintf("%v_%v", DUMP_ARCHIVE_PREFIX, time.Now().Unix()) diff --git a/pkg/fission-cli/cmd/support/resources/crd.go b/pkg/fission-cli/cmd/support/resources/crd.go index 112c80e3..3f3c72ce 100644 --- a/pkg/fission-cli/cmd/support/resources/crd.go +++ b/pkg/fission-cli/cmd/support/resources/crd.go @@ -39,11 +39,11 @@ const ( ) type CrdDumper struct { - client *client.Client + client client.Interface crdType string } -func NewCrdDumper(client *client.Client, crdType string) Resource { +func NewCrdDumper(client client.Interface, crdType string) Resource { return CrdDumper{client: client, crdType: crdType} } @@ -51,7 +51,7 @@ func (res CrdDumper) Dump(dumpDir string) { switch res.crdType { case CrdEnvironment: - items, err := res.client.EnvironmentList(metav1.NamespaceAll) + items, err := res.client.V1().Environment().List(metav1.NamespaceAll) if err != nil { console.Warn(fmt.Sprintf("Error getting %v list: %v", res.crdType, err)) return @@ -63,7 +63,7 @@ func (res CrdDumper) Dump(dumpDir string) { } case CrdFunction: - items, err := res.client.FunctionList(metav1.NamespaceAll) + items, err := res.client.V1().Function().List(metav1.NamespaceAll) if err != nil { console.Warn(fmt.Sprintf("Error getting %v list: %v", res.crdType, err)) return @@ -75,7 +75,7 @@ func (res CrdDumper) Dump(dumpDir string) { } case CrdPackage: - items, err := res.client.PackageList(metav1.NamespaceAll) + items, err := res.client.V1().Package().List(metav1.NamespaceAll) if err != nil { console.Warn(fmt.Sprintf("Error getting %v list: %v", res.crdType, err)) return @@ -88,7 +88,7 @@ func (res CrdDumper) Dump(dumpDir string) { } case CrdHttpTrigger: - items, err := res.client.HTTPTriggerList(metav1.NamespaceAll) + items, err := res.client.V1().HTTPTrigger().List(metav1.NamespaceAll) if err != nil { console.Warn(fmt.Sprintf("Error getting %v list: %v", res.crdType, err)) return @@ -100,7 +100,7 @@ func (res CrdDumper) Dump(dumpDir string) { } case CrdKubeWatcher: - items, err := res.client.WatchList(metav1.NamespaceAll) + items, err := res.client.V1().KubeWatcher().List(metav1.NamespaceAll) if err != nil { console.Warn(fmt.Sprintf("Error getting %v list: %v", res.crdType, err)) return @@ -115,7 +115,7 @@ func (res CrdDumper) Dump(dumpDir string) { var triggers []fv1.MessageQueueTrigger for _, mqType := range []string{types.MessageQueueTypeNats, types.MessageQueueTypeASQ} { - l, err := res.client.MessageQueueTriggerList(mqType, metav1.NamespaceAll) + l, err := res.client.V1().MessageQueueTrigger().List(mqType, metav1.NamespaceAll) if err != nil { console.Warn(fmt.Sprintf("Error getting %v list: %v", res.crdType, err)) break @@ -129,7 +129,7 @@ func (res CrdDumper) Dump(dumpDir string) { } case CrdTimeTrigger: - items, err := res.client.TimeTriggerList(metav1.NamespaceAll) + items, err := res.client.V1().TimeTrigger().List(metav1.NamespaceAll) if err != nil { console.Warn(fmt.Sprintf("Error getting %v list: %v", res.crdType, err)) return diff --git a/pkg/fission-cli/cmd/support/resources/fissionversion.go b/pkg/fission-cli/cmd/support/resources/fissionversion.go index e92a1ca8..ede1145b 100644 --- a/pkg/fission-cli/cmd/support/resources/fissionversion.go +++ b/pkg/fission-cli/cmd/support/resources/fissionversion.go @@ -25,10 +25,10 @@ import ( ) type FissionVersion struct { - client *client.Client + client client.Interface } -func NewFissionVersion(client *client.Client) Resource { +func NewFissionVersion(client client.Interface) Resource { return FissionVersion{client: client} } diff --git a/pkg/fission-cli/cmd/timetrigger/create.go b/pkg/fission-cli/cmd/timetrigger/create.go index 019b4f8f..9624eb17 100644 --- a/pkg/fission-cli/cmd/timetrigger/create.go +++ b/pkg/fission-cli/cmd/timetrigger/create.go @@ -18,6 +18,7 @@ package timetrigger import ( "fmt" + "github.com/fission/fission/pkg/fission-cli/cmd" "time" "github.com/pkg/errors" @@ -35,19 +36,12 @@ import ( ) type CreateSubCommand struct { - client *client.Client + cmd.CommandActioner trigger *fv1.TimeTrigger } func Create(input cli.Input) error { - c, err := util.GetServer(input) - if err != nil { - return err - } - opts := CreateSubCommand{ - client: c, - } - return opts.do(input) + return (&CreateSubCommand{}).do(input) } func (opts *CreateSubCommand) do(input cli.Input) error { @@ -126,14 +120,14 @@ func (opts *CreateSubCommand) run(input cli.Input) error { return nil } - _, err := opts.client.TimeTriggerCreate(opts.trigger) + _, err := opts.Client().V1().TimeTrigger().Create(opts.trigger) if err != nil { return errors.Wrap(err, "error creating Time trigger") } fmt.Printf("trigger '%v' created\n", opts.trigger.Metadata.Name) - t, err := getAPITimeInfo(opts.client) + t, err := getAPITimeInfo(opts.Client()) if err != nil { return err } @@ -146,8 +140,8 @@ func (opts *CreateSubCommand) run(input cli.Input) error { return nil } -func getAPITimeInfo(client *client.Client) (time.Time, error) { - serverInfo, err := client.ServerInfo() +func getAPITimeInfo(client client.Interface) (time.Time, error) { + serverInfo, err := client.V1().Misc().ServerInfo() if err != nil { return time.Time{}, errors.Errorf("Error syncing server time information: %v", err) } diff --git a/pkg/fission-cli/cmd/timetrigger/delete.go b/pkg/fission-cli/cmd/timetrigger/delete.go index 9448cbfb..dfcbca5d 100644 --- a/pkg/fission-cli/cmd/timetrigger/delete.go +++ b/pkg/fission-cli/cmd/timetrigger/delete.go @@ -22,25 +22,17 @@ import ( "github.com/pkg/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "github.com/fission/fission/pkg/controller/client" "github.com/fission/fission/pkg/fission-cli/cliwrapper/cli" + "github.com/fission/fission/pkg/fission-cli/cmd" flagkey "github.com/fission/fission/pkg/fission-cli/flag/key" - "github.com/fission/fission/pkg/fission-cli/util" ) type DeleteSubCommand struct { - client *client.Client + cmd.CommandActioner } func Delete(input cli.Input) error { - c, err := util.GetServer(input) - if err != nil { - return err - } - opts := DeleteSubCommand{ - client: c, - } - return opts.do(input) + return (&DeleteSubCommand{}).do(input) } func (opts *DeleteSubCommand) do(input cli.Input) error { @@ -49,7 +41,7 @@ func (opts *DeleteSubCommand) do(input cli.Input) error { Namespace: input.String(flagkey.NamespaceTrigger), } - err := opts.client.TimeTriggerDelete(m) + err := opts.Client().V1().TimeTrigger().Delete(m) if err != nil { return errors.Wrap(err, "error deleting trigger") } diff --git a/pkg/fission-cli/cmd/timetrigger/list.go b/pkg/fission-cli/cmd/timetrigger/list.go index 3d767a30..db049fa7 100644 --- a/pkg/fission-cli/cmd/timetrigger/list.go +++ b/pkg/fission-cli/cmd/timetrigger/list.go @@ -21,31 +21,24 @@ import ( "os" "text/tabwriter" - "github.com/fission/fission/pkg/controller/client" - "github.com/fission/fission/pkg/fission-cli/cliwrapper/cli" - flagkey "github.com/fission/fission/pkg/fission-cli/flag/key" - "github.com/fission/fission/pkg/fission-cli/util" "github.com/pkg/errors" + + "github.com/fission/fission/pkg/fission-cli/cliwrapper/cli" + "github.com/fission/fission/pkg/fission-cli/cmd" + flagkey "github.com/fission/fission/pkg/fission-cli/flag/key" ) type ListSubCommand struct { - client *client.Client + cmd.CommandActioner } func List(input cli.Input) error { - c, err := util.GetServer(input) - if err != nil { - return err - } - opts := ListSubCommand{ - client: c, - } - return opts.do(input) + return (&ListSubCommand{}).do(input) } func (opts *ListSubCommand) do(input cli.Input) error { ttNs := input.String(flagkey.NamespaceTrigger) - tts, err := opts.client.TimeTriggerList(ttNs) + tts, err := opts.Client().V1().TimeTrigger().List(ttNs) if err != nil { return errors.Wrap(err, "list Time triggers") } diff --git a/pkg/fission-cli/cmd/timetrigger/test.go b/pkg/fission-cli/cmd/timetrigger/test.go index a21f5482..95bddc6f 100644 --- a/pkg/fission-cli/cmd/timetrigger/test.go +++ b/pkg/fission-cli/cmd/timetrigger/test.go @@ -19,25 +19,17 @@ package timetrigger import ( "github.com/pkg/errors" - "github.com/fission/fission/pkg/controller/client" "github.com/fission/fission/pkg/fission-cli/cliwrapper/cli" + "github.com/fission/fission/pkg/fission-cli/cmd" flagkey "github.com/fission/fission/pkg/fission-cli/flag/key" - "github.com/fission/fission/pkg/fission-cli/util" ) type ShowSubCommand struct { - client *client.Client + cmd.CommandActioner } func Show(input cli.Input) error { - c, err := util.GetServer(input) - if err != nil { - return err - } - opts := ShowSubCommand{ - client: c, - } - return opts.do(input) + return (&ShowSubCommand{}).do(input) } func (opts *ShowSubCommand) do(input cli.Input) error { @@ -51,7 +43,7 @@ func (opts *ShowSubCommand) run(flaginput cli.Input) error { return errors.New("need a cron spec like '0 30 * * * *', '@every 1h30m', or '@hourly'; use --cron") } - t, err := getAPITimeInfo(opts.client) + t, err := getAPITimeInfo(opts.Client()) if err != nil { return err } diff --git a/pkg/fission-cli/cmd/timetrigger/update.go b/pkg/fission-cli/cmd/timetrigger/update.go index 94b6819b..b3009c5f 100644 --- a/pkg/fission-cli/cmd/timetrigger/update.go +++ b/pkg/fission-cli/cmd/timetrigger/update.go @@ -23,26 +23,18 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" fv1 "github.com/fission/fission/pkg/apis/fission.io/v1" - "github.com/fission/fission/pkg/controller/client" "github.com/fission/fission/pkg/fission-cli/cliwrapper/cli" + "github.com/fission/fission/pkg/fission-cli/cmd" flagkey "github.com/fission/fission/pkg/fission-cli/flag/key" - "github.com/fission/fission/pkg/fission-cli/util" ) type UpdateSubCommand struct { - client *client.Client + cmd.CommandActioner trigger *fv1.TimeTrigger } func Update(input cli.Input) error { - c, err := util.GetServer(input) - if err != nil { - return err - } - opts := UpdateSubCommand{ - client: c, - } - return opts.do(input) + return (&UpdateSubCommand{}).do(input) } func (opts *UpdateSubCommand) do(input cli.Input) error { @@ -54,7 +46,7 @@ func (opts *UpdateSubCommand) do(input cli.Input) error { } func (opts *UpdateSubCommand) complete(input cli.Input) error { - tt, err := opts.client.TimeTriggerGet(&metav1.ObjectMeta{ + tt, err := opts.Client().V1().TimeTrigger().Get(&metav1.ObjectMeta{ Name: input.String(flagkey.TtName), Namespace: input.String(flagkey.NamespaceTrigger), }) @@ -88,14 +80,14 @@ func (opts *UpdateSubCommand) complete(input cli.Input) error { } func (opts *UpdateSubCommand) run(input cli.Input) error { - _, err := opts.client.TimeTriggerUpdate(opts.trigger) + _, err := opts.Client().V1().TimeTrigger().Update(opts.trigger) if err != nil { return errors.Wrap(err, "error updating Time trigger") } fmt.Printf("trigger '%v' updated\n", opts.trigger.Metadata.Name) - t, err := getAPITimeInfo(opts.client) + t, err := getAPITimeInfo(opts.Client()) if err != nil { return err } diff --git a/pkg/fission-cli/cmd/version/version.go b/pkg/fission-cli/cmd/version/version.go index c9271d2f..9f363698 100644 --- a/pkg/fission-cli/cmd/version/version.go +++ b/pkg/fission-cli/cmd/version/version.go @@ -22,28 +22,21 @@ import ( "github.com/ghodss/yaml" "github.com/pkg/errors" - "github.com/fission/fission/pkg/controller/client" "github.com/fission/fission/pkg/fission-cli/cliwrapper/cli" + "github.com/fission/fission/pkg/fission-cli/cmd" "github.com/fission/fission/pkg/fission-cli/util" ) type VersionSubCommand struct { - client *client.Client + cmd.CommandActioner } func Version(input cli.Input) error { - c, err := util.GetServer(input) - if err != nil { - return err - } - opts := &VersionSubCommand{ - client: c, - } - return opts.do(input) + return (&VersionSubCommand{}).do(input) } func (opts *VersionSubCommand) do(input cli.Input) error { - ver := util.GetVersion(opts.client) + ver := util.GetVersion(opts.Client()) bs, err := yaml.Marshal(ver) if err != nil { return errors.Wrap(err, "error formatting versions") diff --git a/pkg/fission-cli/util/util.go b/pkg/fission-cli/util/util.go index 85dd8e28..1a639ecb 100644 --- a/pkg/fission-cli/util/util.go +++ b/pkg/fission-cli/util/util.go @@ -18,6 +18,7 @@ package util import ( "fmt" + "github.com/fission/fission/pkg/controller/client/rest" "os" "os/user" "path/filepath" @@ -144,7 +145,7 @@ func GetKubernetesClient() (*restclient.Config, *kubernetes.Clientset, error) { } // given a list of functions, this checks if the functions actually exist on the cluster -func CheckFunctionExistence(fissionClient *client.Client, functions []string, fnNamespace string) (err error) { +func CheckFunctionExistence(client client.Interface, functions []string, fnNamespace string) (err error) { fnMissing := make([]string, 0) for _, fnName := range functions { meta := &metav1.ObjectMeta{ @@ -152,7 +153,7 @@ func CheckFunctionExistence(fissionClient *client.Client, functions []string, fn Namespace: fnNamespace, } - _, err := fissionClient.FunctionGet(meta) + _, err := client.V1().Function().Get(meta) if err != nil { fnMissing = append(fnMissing, fnName) } @@ -165,7 +166,7 @@ func CheckFunctionExistence(fissionClient *client.Client, functions []string, fn return nil } -func GetVersion(client *client.Client) info.Versions { +func GetVersion(client client.Interface) info.Versions { // Fetch client versions versions := info.Versions{ Client: map[string]info.BuildMeta{ @@ -179,7 +180,7 @@ func GetVersion(client *client.Client) info.Versions { } } - serverInfo, err := client.ServerInfo() + serverInfo, err := client.V1().Misc().ServerInfo() if err != nil { console.Warn(fmt.Sprintf("Error getting Fission API version: %v", err)) serverInfo = &info.ServerInfo{} @@ -195,13 +196,21 @@ func GetVersion(client *client.Client) info.Versions { return versions } -func GetServer(input cli.Input) (c *client.Client, err error) { - serverUrl := input.GlobalString(flagkey.Server) +func GetServer(input cli.Input) (c client.Interface, err error) { + serverUrl, err := GetServerURL(input) + if err != nil { + return nil, err + } + return client.MakeClientset(rest.NewRESTClient(serverUrl)), nil +} + +func GetServerURL(input cli.Input) (serverUrl string, err error) { + serverUrl = input.GlobalString(flagkey.Server) if len(serverUrl) == 0 { // starts local portforwarder etc. serverUrl, err = GetApplicationUrl("application=fission-api") if err != nil { - return nil, err + return "", err } } @@ -212,7 +221,7 @@ func GetServer(input cli.Input) (c *client.Client, err error) { serverUrl = "http://" + serverUrl } - return client.MakeClient(serverUrl), nil + return serverUrl, nil } func GetResourceReqs(input cli.Input, resReqs *v1.ResourceRequirements) (*v1.ResourceRequirements, error) {