172 lines
4.8 KiB
Go
172 lines
4.8 KiB
Go
package client
|
|
|
|
import (
|
|
"context"
|
|
"encoding/base64"
|
|
"fmt"
|
|
"os"
|
|
"testing"
|
|
"time"
|
|
|
|
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
|
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
|
|
"k8s.io/apimachinery/pkg/runtime/schema"
|
|
)
|
|
|
|
// TestAcceptanceFissionCRUD выполняет интеграционный CRUD тест в реальном кластере.
|
|
func TestAcceptanceFissionCRUD(t *testing.T) {
|
|
if os.Getenv("ACCEPTANCE_TEST") != "1" {
|
|
t.Skip("set ACCEPTANCE_TEST=1 to run acceptance tests")
|
|
}
|
|
|
|
kubeconfigPath := os.Getenv("KUBECONFIG")
|
|
if kubeconfigPath == "" {
|
|
kubeconfigPath = "/home/naeel/.kube/config"
|
|
}
|
|
|
|
namespace := os.Getenv("FISSION_NAMESPACE")
|
|
if namespace == "" {
|
|
namespace = "default"
|
|
}
|
|
|
|
c, err := New(kubeconfigPath, os.Getenv("KUBE_CONTEXT"), namespace)
|
|
if err != nil {
|
|
t.Fatalf("create client: %v", err)
|
|
}
|
|
|
|
ctx := context.Background()
|
|
suffix := time.Now().UnixNano()
|
|
envName := fmt.Sprintf("acc-env-%d", suffix)
|
|
pkgName := fmt.Sprintf("acc-pkg-%d", suffix)
|
|
fnName := fmt.Sprintf("acc-fn-%d", suffix)
|
|
triggerName := fmt.Sprintf("acc-tr-%d", suffix)
|
|
urlPath := fmt.Sprintf("/acc-%d", suffix)
|
|
|
|
envObj := &unstructured.Unstructured{Object: map[string]interface{}{
|
|
"apiVersion": "fission.io/v1",
|
|
"kind": "Environment",
|
|
"metadata": map[string]interface{}{
|
|
"name": envName,
|
|
"namespace": namespace,
|
|
},
|
|
"spec": map[string]interface{}{
|
|
"version": 3,
|
|
"runtime": map[string]interface{}{
|
|
"image": "ghcr.io/fission/python-env",
|
|
},
|
|
"poolsize": 1,
|
|
},
|
|
}}
|
|
|
|
if _, err = c.CreateEnvironment(ctx, envObj); err != nil {
|
|
t.Fatalf("create environment: %v", err)
|
|
}
|
|
defer func() { _ = c.DeleteEnvironment(ctx, namespace, envName) }()
|
|
|
|
if _, err = c.GetEnvironment(ctx, namespace, envName); err != nil {
|
|
t.Fatalf("get environment: %v", err)
|
|
}
|
|
|
|
literal := base64.StdEncoding.EncodeToString([]byte("def main():\n return 'ok from acceptance'\n"))
|
|
pkgObj := &unstructured.Unstructured{Object: map[string]interface{}{
|
|
"apiVersion": "fission.io/v1",
|
|
"kind": "Package",
|
|
"metadata": map[string]interface{}{
|
|
"name": pkgName,
|
|
"namespace": namespace,
|
|
},
|
|
"spec": map[string]interface{}{
|
|
"deployment": map[string]interface{}{
|
|
"type": "literal",
|
|
"literal": literal,
|
|
},
|
|
"environment": map[string]interface{}{
|
|
"name": envName,
|
|
"namespace": namespace,
|
|
},
|
|
"source": map[string]interface{}{},
|
|
},
|
|
}}
|
|
|
|
if _, err = c.CreatePackage(ctx, pkgObj); err != nil {
|
|
t.Fatalf("create package: %v", err)
|
|
}
|
|
defer func() { _ = c.DeletePackage(ctx, namespace, pkgName) }()
|
|
|
|
if _, err = c.GetPackage(ctx, namespace, pkgName); err != nil {
|
|
t.Fatalf("get package: %v", err)
|
|
}
|
|
|
|
fnObj := &unstructured.Unstructured{Object: map[string]interface{}{
|
|
"apiVersion": "fission.io/v1",
|
|
"kind": "Function",
|
|
"metadata": map[string]interface{}{
|
|
"name": fnName,
|
|
"namespace": namespace,
|
|
},
|
|
"spec": map[string]interface{}{
|
|
"environment": map[string]interface{}{
|
|
"name": envName,
|
|
"namespace": namespace,
|
|
},
|
|
"InvokeStrategy": map[string]interface{}{
|
|
"ExecutionStrategy": map[string]interface{}{
|
|
"ExecutorType": "poolmgr",
|
|
},
|
|
"StrategyType": "execution",
|
|
},
|
|
"package": map[string]interface{}{
|
|
"packageref": map[string]interface{}{
|
|
"name": pkgName,
|
|
"namespace": namespace,
|
|
},
|
|
"functionName": "main.main",
|
|
},
|
|
},
|
|
}}
|
|
|
|
if _, err = c.CreateFunction(ctx, fnObj); err != nil {
|
|
t.Fatalf("create function: %v", err)
|
|
}
|
|
defer func() { _ = c.DeleteFunction(ctx, namespace, fnName) }()
|
|
|
|
if _, err = c.GetFunction(ctx, namespace, fnName); err != nil {
|
|
t.Fatalf("get function: %v", err)
|
|
}
|
|
|
|
trObj := &unstructured.Unstructured{Object: map[string]interface{}{
|
|
"apiVersion": "fission.io/v1",
|
|
"kind": "HTTPTrigger",
|
|
"metadata": map[string]interface{}{
|
|
"name": triggerName,
|
|
"namespace": namespace,
|
|
},
|
|
"spec": map[string]interface{}{
|
|
"relativeurl": urlPath,
|
|
"methods": []interface{}{"GET"},
|
|
"functionref": map[string]interface{}{
|
|
"type": "name",
|
|
"name": fnName,
|
|
},
|
|
"createingress": false,
|
|
},
|
|
}}
|
|
|
|
if _, err = c.CreateHTTPTrigger(ctx, trObj); err != nil {
|
|
t.Fatalf("create http trigger: %v", err)
|
|
}
|
|
defer func() { _ = c.DeleteHTTPTrigger(ctx, namespace, triggerName) }()
|
|
|
|
if _, err = c.GetHTTPTrigger(ctx, namespace, triggerName); err != nil {
|
|
t.Fatalf("get http trigger: %v", err)
|
|
}
|
|
|
|
gvr := schema.GroupVersionResource{Group: "fission.io", Version: "v1", Resource: "httptriggers"}
|
|
if err = c.DynClient.Resource(gvr).Namespace(namespace).Delete(ctx, triggerName, metav1.DeleteOptions{}); err != nil {
|
|
t.Fatalf("delete trigger via dynamic client: %v", err)
|
|
}
|
|
if err = c.DeleteHTTPTrigger(ctx, namespace, triggerName); err == nil {
|
|
t.Fatalf("expected not found error after trigger deletion")
|
|
}
|
|
}
|