Use Kubernetes Client instead of Controller APIs from CLI (#2605)

Use the Kubernetes and Fission Client from CLI instead of Controller API.
This removes port-forwarding for the controller across Fission CLI mostly.

* Use configurable client in CLI
* Move resource namespace under cmd client
* use server to get fission version
* get archive with URL

Signed-off-by: Sanket Sudake <sanketsudake@gmail.com>
Co-authored-by: Sanket Sudake <sanketsudake@gmail.com>
This commit is contained in:
neha_gupta
2022-11-07 21:42:39 +05:30
committed by GitHub
co-authored by Sanket Sudake
parent 261bf24974
commit b71a36dc1c
86 changed files with 1115 additions and 978 deletions
+1 -1
View File
@@ -261,7 +261,7 @@ func (api *API) GetHandler() http.Handler {
r.HandleFunc("/proxy/{dbType}", api.FunctionLogsApiPost).Methods("POST")
r.HandleFunc("/proxy/storage/v1/archive", api.StorageServiceProxy)
r.HandleFunc("/proxy/logs/{function}", api.FunctionPodLogs).Methods("POST")
r.HandleFunc("/proxy/workflows-apiserver/{path:.*}", api.WorkflowApiserverProxy)
r.HandleFunc("/proxy/workflows-apiserver/{path:.*}", api.WorkflowApiserverProxy) // Deprecated
r.HandleFunc("/proxy/svcname", api.GetSvcName).Queries("application", "").Methods("GET")
r.Handle("/v2/apidocs.json", openAPI()).Methods("GET")
+80 -55
View File
@@ -44,9 +44,9 @@ import (
)
var (
g struct {
cmd.CommandActioner
}
// g struct {
// cmd.CommandActioner
// }
testNS = metav1.NamespaceDefault
)
@@ -105,41 +105,45 @@ func TestFunctionApi(t *testing.T) {
},
},
}
_, err := g.Client().V1().Function().Get(&metav1.ObjectMeta{
restClient := rest.NewRESTClient("http://localhost:8888")
dClient := client.MakeClientset(restClient)
_, err := dClient.V1().Function().Get(&metav1.ObjectMeta{
Name: testFunc.ObjectMeta.Name,
Namespace: testNS,
})
assertNotFoundFailure(err, "function")
m, err := g.Client().V1().Function().Create(testFunc)
m, err := dClient.V1().Function().Create(testFunc)
panicIf(err)
defer func() {
err := g.Client().V1().Function().Delete(m)
err := dClient.V1().Function().Delete(m)
panicIf(err)
}()
_, err = g.Client().V1().Function().Create(testFunc)
_, err = dClient.V1().Function().Create(testFunc)
assertNameReuseFailure(err, "function")
testFunc.ObjectMeta.ResourceVersion = m.ResourceVersion
testFunc.Spec.Package.FunctionName = "yyy"
_, err = g.Client().V1().Function().Update(testFunc)
_, err = dClient.V1().Function().Update(testFunc)
panicIf(err)
testFunc.ObjectMeta.ResourceVersion = ""
testFunc.ObjectMeta.Name = "bar"
m2, err := g.Client().V1().Function().Create(testFunc)
m2, err := dClient.V1().Function().Create(testFunc)
panicIf(err)
defer func() {
err := g.Client().V1().Function().Delete(m2)
err := dClient.V1().Function().Delete(m2)
panicIf(err)
}()
funcs, err := g.Client().V1().Function().List(testNS)
funcs, err := dClient.V1().Function().List(testNS)
panicIf(err)
assert(len(funcs) == 2, fmt.Sprintf("created two functions, but found %v", len(funcs)))
funcs_url := g.Client().ServerURL() + "/v2/functions"
funcs_url := dClient.ServerURL() + "/v2/functions"
resp, err := http.Get(funcs_url)
panicIf(err)
defer resp.Body.Close()
@@ -169,23 +173,27 @@ func TestHTTPTriggerApi(t *testing.T) {
},
},
}
_, err := g.Client().V1().HTTPTrigger().Get(&metav1.ObjectMeta{
restClient := rest.NewRESTClient("http://localhost:8888")
dClient := client.MakeClientset(restClient)
_, err := dClient.V1().HTTPTrigger().Get(&metav1.ObjectMeta{
Name: testTrigger.ObjectMeta.Name,
Namespace: testNS,
})
assertNotFoundFailure(err, "httptrigger")
m, err := g.Client().V1().HTTPTrigger().Create(testTrigger)
m, err := dClient.V1().HTTPTrigger().Create(testTrigger)
panicIf(err)
defer func() {
err := g.Client().V1().HTTPTrigger().Delete(m)
err := dClient.V1().HTTPTrigger().Delete(m)
panicIf(err)
}()
_, err = g.Client().V1().HTTPTrigger().Create(testTrigger)
_, err = dClient.V1().HTTPTrigger().Create(testTrigger)
assertNameReuseFailure(err, "httptrigger")
tr, err := g.Client().V1().HTTPTrigger().Get(m)
tr, err := dClient.V1().HTTPTrigger().Get(m)
panicIf(err)
assert(len(testTrigger.Spec.Methods) == len(tr.Spec.Methods) &&
testTrigger.Spec.RelativeURL == tr.Spec.RelativeURL &&
@@ -194,23 +202,23 @@ func TestHTTPTriggerApi(t *testing.T) {
testTrigger.ObjectMeta.ResourceVersion = m.ResourceVersion
testTrigger.Spec.RelativeURL = "/hi"
_, err = g.Client().V1().HTTPTrigger().Update(testTrigger)
_, err = dClient.V1().HTTPTrigger().Update(testTrigger)
panicIf(err)
testTrigger.ObjectMeta.ResourceVersion = ""
testTrigger.ObjectMeta.Name = "yyy"
_, err = g.Client().V1().HTTPTrigger().Create(testTrigger)
_, err = dClient.V1().HTTPTrigger().Create(testTrigger)
assert(err != nil, "duplicate trigger should not be allowed")
testTrigger.Spec.RelativeURL = "/hi2"
m2, err := g.Client().V1().HTTPTrigger().Create(testTrigger)
m2, err := dClient.V1().HTTPTrigger().Create(testTrigger)
panicIf(err)
defer func() {
err = g.Client().V1().HTTPTrigger().Delete(m2)
err = dClient.V1().HTTPTrigger().Delete(m2)
panicIf(err)
}()
ts, err := g.Client().V1().HTTPTrigger().List(testNS)
ts, err := dClient.V1().HTTPTrigger().List(testNS)
panicIf(err)
assert(len(ts) == 2, fmt.Sprintf("created two triggers, but found %v", len(ts)))
}
@@ -237,7 +245,9 @@ func createFissionFnForMultipleTrigger() {
},
}
_, err := g.Client().V1().Function().Create(testFunc)
restClient := rest.NewRESTClient("http://localhost:8888")
dClient := client.MakeClientset(restClient)
_, err := dClient.V1().Function().Create(testFunc)
panicIf(err)
defer func() {
panicIf(err)
@@ -245,7 +255,7 @@ func createFissionFnForMultipleTrigger() {
testFunc.Name = "foo2"
_, err = g.Client().V1().Function().Create(testFunc)
_, err = dClient.V1().Function().Create(testFunc)
panicIf(err)
defer func() {
panicIf(err)
@@ -272,9 +282,11 @@ func TestHTTPTriggerCreateMultipleTrigger(t *testing.T) {
},
}
m, err := g.Client().V1().HTTPTrigger().Create(testTrigger)
restClient := rest.NewRESTClient("http://localhost:8888")
dClient := client.MakeClientset(restClient)
m, err := dClient.V1().HTTPTrigger().Create(testTrigger)
panicIf(err)
defer panicIf(g.Client().V1().HTTPTrigger().Delete(m))
defer panicIf(dClient.V1().HTTPTrigger().Delete(m))
prefix_2 := "url_another"
testTrigger2 := &fv1.HTTPTrigger{
@@ -293,7 +305,7 @@ func TestHTTPTriggerCreateMultipleTrigger(t *testing.T) {
},
}
m2, err := g.Client().V1().HTTPTrigger().Create(testTrigger2)
m2, err := dClient.V1().HTTPTrigger().Create(testTrigger2)
if err != nil {
t.Fatal()
@@ -301,7 +313,7 @@ func TestHTTPTriggerCreateMultipleTrigger(t *testing.T) {
defer func() {
if m2 != nil {
err := g.Client().V1().HTTPTrigger().Delete(m2)
err := dClient.V1().HTTPTrigger().Delete(m2)
if err != nil {
logger.Error("Error deleting http trigger", zap.String("name", m2.Name), zap.Error(err))
}
@@ -324,42 +336,46 @@ func TestEnvironmentApi(t *testing.T) {
Resources: v1.ResourceRequirements{},
},
}
_, err := g.Client().V1().Environment().Get(&metav1.ObjectMeta{
restClient := rest.NewRESTClient("http://localhost:8888")
dClient := client.MakeClientset(restClient)
_, err := dClient.V1().Environment().Get(&metav1.ObjectMeta{
Name: testEnv.ObjectMeta.Name,
Namespace: testNS,
})
assertNotFoundFailure(err, "environment")
m, err := g.Client().V1().Environment().Create(testEnv)
m, err := dClient.V1().Environment().Create(testEnv)
panicIf(err)
defer func() {
err := g.Client().V1().Environment().Delete(m)
err := dClient.V1().Environment().Delete(m)
panicIf(err)
}()
_, err = g.Client().V1().Environment().Create(testEnv)
_, err = dClient.V1().Environment().Create(testEnv)
assertNameReuseFailure(err, "environment")
e, err := g.Client().V1().Environment().Get(m)
e, err := dClient.V1().Environment().Get(m)
panicIf(err)
assert(reflect.DeepEqual(testEnv.Spec, e.Spec), "env should match after reading")
testEnv.ObjectMeta.ResourceVersion = m.ResourceVersion
testEnv.Spec.Runtime.Image = "another-img"
_, err = g.Client().V1().Environment().Update(testEnv)
_, err = dClient.V1().Environment().Update(testEnv)
panicIf(err)
testEnv.ObjectMeta.ResourceVersion = ""
testEnv.ObjectMeta.Name = "bar"
m2, err := g.Client().V1().Environment().Create(testEnv)
m2, err := dClient.V1().Environment().Create(testEnv)
panicIf(err)
defer func() {
err := g.Client().V1().Environment().Delete(m2)
err := dClient.V1().Environment().Delete(m2)
panicIf(err)
}()
ts, err := g.Client().V1().Environment().List(testNS)
ts, err := dClient.V1().Environment().List(testNS)
panicIf(err)
assert(len(ts) == 2, fmt.Sprintf("created two envs, but found %v", len(ts)))
}
@@ -379,23 +395,27 @@ func TestWatchApi(t *testing.T) {
},
},
}
_, err := g.Client().V1().KubeWatcher().Get(&metav1.ObjectMeta{
restClient := rest.NewRESTClient("http://localhost:8888")
dClient := client.MakeClientset(restClient)
_, err := dClient.V1().KubeWatcher().Get(&metav1.ObjectMeta{
Name: testWatch.ObjectMeta.Name,
Namespace: testNS,
})
assertNotFoundFailure(err, "watch")
m, err := g.Client().V1().KubeWatcher().Create(testWatch)
m, err := dClient.V1().KubeWatcher().Create(testWatch)
panicIf(err)
defer func() {
err := g.Client().V1().KubeWatcher().Delete(m)
err := dClient.V1().KubeWatcher().Delete(m)
panicIf(err)
}()
_, err = g.Client().V1().KubeWatcher().Create(testWatch)
_, err = dClient.V1().KubeWatcher().Create(testWatch)
assertNameReuseFailure(err, "watch")
w, err := g.Client().V1().KubeWatcher().Get(m)
w, err := dClient.V1().KubeWatcher().Get(m)
panicIf(err)
assert(testWatch.Spec.Namespace == w.Spec.Namespace &&
testWatch.Spec.Type == w.Spec.Type &&
@@ -403,14 +423,14 @@ func TestWatchApi(t *testing.T) {
testWatch.Spec.FunctionReference.Name == w.Spec.FunctionReference.Name, "watch should match after reading")
testWatch.ObjectMeta.Name = "yyy"
m2, err := g.Client().V1().KubeWatcher().Create(testWatch)
m2, err := dClient.V1().KubeWatcher().Create(testWatch)
panicIf(err)
defer func() {
err := g.Client().V1().KubeWatcher().Delete(m2)
err := dClient.V1().KubeWatcher().Delete(m2)
panicIf(err)
}()
ws, err := g.Client().V1().KubeWatcher().List(testNS)
ws, err := dClient.V1().KubeWatcher().List(testNS)
panicIf(err)
assert(len(ws) == 2, fmt.Sprintf("created two watches, but found %v", len(ws)))
}
@@ -429,20 +449,24 @@ func TestTimeTriggerApi(t *testing.T) {
},
},
}
_, err := g.Client().V1().TimeTrigger().Get(&metav1.ObjectMeta{Name: testTrigger.ObjectMeta.Name})
restClient := rest.NewRESTClient("http://localhost:8888")
dClient := client.MakeClientset(restClient)
_, err := dClient.V1().TimeTrigger().Get(&metav1.ObjectMeta{Name: testTrigger.ObjectMeta.Name})
assertNotFoundFailure(err, "trigger")
m, err := g.Client().V1().TimeTrigger().Create(testTrigger)
m, err := dClient.V1().TimeTrigger().Create(testTrigger)
panicIf(err)
defer func() {
err := g.Client().V1().TimeTrigger().Delete(m)
err := dClient.V1().TimeTrigger().Delete(m)
panicIf(err)
}()
_, err = g.Client().V1().TimeTrigger().Create(testTrigger)
_, err = dClient.V1().TimeTrigger().Create(testTrigger)
assertNameReuseFailure(err, "trigger")
tr, err := g.Client().V1().TimeTrigger().Get(m)
tr, err := dClient.V1().TimeTrigger().Get(m)
panicIf(err)
assert(testTrigger.Spec.Cron == tr.Spec.Cron &&
testTrigger.Spec.FunctionReference.Type == tr.Spec.FunctionReference.Type &&
@@ -450,16 +474,16 @@ func TestTimeTriggerApi(t *testing.T) {
testTrigger.ObjectMeta.ResourceVersion = m.ResourceVersion
testTrigger.Spec.Cron = "@hourly"
_, err = g.Client().V1().TimeTrigger().Update(testTrigger)
_, err = dClient.V1().TimeTrigger().Update(testTrigger)
panicIf(err)
testTrigger.ObjectMeta.ResourceVersion = ""
testTrigger.ObjectMeta.Name = "yyy"
testTrigger.Spec.Cron = "Not valid cron spec"
_, err = g.Client().V1().TimeTrigger().Create(testTrigger)
_, err = dClient.V1().TimeTrigger().Create(testTrigger)
assertCronSpecFails(err)
ts, err := g.Client().V1().TimeTrigger().List(testNS)
ts, err := dClient.V1().TimeTrigger().List(testNS)
panicIf(err)
assert(len(ts) == 1, fmt.Sprintf("created two time triggers, but found %v", len(ts)))
}
@@ -497,9 +521,10 @@ func TestMain(m *testing.M) {
time.Sleep(5 * time.Second)
restClient := rest.NewRESTClient("http://localhost:8888")
client, err := cmd.NewClient(cmd.ClientOptions{})
panicIf(err)
// TODO: use fake rest client for offline spec generation
cmd.SetClientset(client.MakeClientset(restClient))
cmd.SetClientset(*client)
resp, err := http.Get("http://localhost:8888/")
panicIf(err)
+1 -2
View File
@@ -20,11 +20,10 @@ 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/core/v1"
"github.com/fission/fission/pkg/controller/client/rest"
)
type (
@@ -17,11 +17,10 @@ limitations under the License.
package fake
import (
v1 "github.com/fission/fission/pkg/controller/client/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
fv1 "github.com/fission/fission/pkg/apis/core/v1"
v1 "github.com/fission/fission/pkg/controller/client/v1"
)
type (
@@ -17,11 +17,10 @@ limitations under the License.
package fake
import (
v1 "github.com/fission/fission/pkg/controller/client/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
fv1 "github.com/fission/fission/pkg/apis/core/v1"
v1 "github.com/fission/fission/pkg/controller/client/v1"
)
type (
+1 -2
View File
@@ -20,11 +20,10 @@ 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/core/v1"
"github.com/fission/fission/pkg/controller/client/rest"
)
type (
@@ -20,11 +20,10 @@ 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/core/v1"
"github.com/fission/fission/pkg/controller/client/rest"
ferror "github.com/fission/fission/pkg/error"
)
+1 -2
View File
@@ -20,11 +20,10 @@ 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/core/v1"
"github.com/fission/fission/pkg/controller/client/rest"
)
type (
+1 -2
View File
@@ -20,11 +20,10 @@ 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/core/v1"
"github.com/fission/fission/pkg/controller/client/rest"
)
type (
+1 -2
View File
@@ -20,11 +20,10 @@ 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/core/v1"
"github.com/fission/fission/pkg/controller/client/rest"
)
type (
+1 -2
View File
@@ -20,9 +20,8 @@ import (
"io"
"net/http"
ferror "github.com/fission/fission/pkg/error"
"github.com/fission/fission/pkg/controller/client/rest"
ferror "github.com/fission/fission/pkg/error"
)
type (