diff --git a/cmd/main.go b/cmd/main.go index d407c7f1..13fbb3ec 100644 --- a/cmd/main.go +++ b/cmd/main.go @@ -166,6 +166,8 @@ func main() { Client: mgr.GetClient(), Scheme: mgr.GetScheme(), CronJobClient: cronJobClient, + ServiceName: httpConfig.Fullname, + ServicePort: httpConfig.Port, }).SetupWithManager(mgr); err != nil { setupLog.Error(err, "unable to create controller", "controller", "Test") os.Exit(1) @@ -174,6 +176,8 @@ func main() { Client: mgr.GetClient(), Scheme: mgr.GetScheme(), CronJobClient: cronJobClient, + ServiceName: httpConfig.Fullname, + ServicePort: httpConfig.Port, }).SetupWithManager(mgr); err != nil { setupLog.Error(err, "unable to create controller", "controller", "TestSuite") os.Exit(1) @@ -229,6 +233,8 @@ func main() { Client: mgr.GetClient(), Scheme: mgr.GetScheme(), CronJobClient: cronJobClient, + ServiceName: httpConfig.Fullname, + ServicePort: httpConfig.Port, }).SetupWithManager(mgr); err != nil { setupLog.Error(err, "unable to create controller", "controller", "TestWorkflow") os.Exit(1) diff --git a/internal/controller/tests/test_controller.go b/internal/controller/tests/test_controller.go index 7a749826..90bd2317 100644 --- a/internal/controller/tests/test_controller.go +++ b/internal/controller/tests/test_controller.go @@ -19,6 +19,8 @@ package tests import ( "context" "encoding/json" + "fmt" + "net/http" "k8s.io/apimachinery/pkg/api/errors" "k8s.io/apimachinery/pkg/runtime" @@ -39,6 +41,8 @@ type TestReconciler struct { client.Client Scheme *runtime.Scheme CronJobClient *cronjob.Client + ServiceName string + ServicePort int } //+kubebuilder:rbac:groups=tests.testkube.io,resources=tests,verbs=get;list;watch;create;update;patch;delete @@ -66,6 +70,10 @@ func (r *TestReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl. return ctrl.Result{}, err } + if _, err = r.deleteTest(req.NamespacedName.Name, req.NamespacedName.Namespace); err != nil { + return ctrl.Result{}, err + } + return ctrl.Result{}, nil } @@ -158,3 +166,25 @@ func (r *TestReconciler) SetupWithManager(mgr ctrl.Manager) error { WithEventFilter(pred). Complete(r) } + +func (r *TestReconciler) deleteTest(testName, namespace string) (out string, err error) { + request, err := http.NewRequest(http.MethodDelete, + fmt.Sprintf("http://%s.%s.svc.cluster.local:%d/v1/tests/%s?skipDeleteCRD=true", + r.ServiceName, namespace, r.ServicePort, testName), nil) + if err != nil { + return out, err + } + + request.Header.Set("Content-Type", "application/json") + resp, err := http.DefaultClient.Do(request) + if err != nil { + return out, err + } + defer resp.Body.Close() + + if resp.StatusCode > 300 { + return out, fmt.Errorf("could not DELETE, statusCode: %d", resp.StatusCode) + } + + return fmt.Sprintf("status: %d", resp.StatusCode), err +} diff --git a/internal/controller/testsuite/testsuite_controller.go b/internal/controller/testsuite/testsuite_controller.go index 35bc6560..61afb2a3 100644 --- a/internal/controller/testsuite/testsuite_controller.go +++ b/internal/controller/testsuite/testsuite_controller.go @@ -19,6 +19,8 @@ package testsuite import ( "context" "encoding/json" + "fmt" + "net/http" "k8s.io/apimachinery/pkg/api/errors" "k8s.io/apimachinery/pkg/runtime" @@ -38,6 +40,8 @@ type TestSuiteReconciler struct { client.Client Scheme *runtime.Scheme CronJobClient *cronjob.Client + ServiceName string + ServicePort int } //+kubebuilder:rbac:groups=tests.testkube.io,resources=testsuites,verbs=get;list;watch;create;update;patch;delete @@ -65,6 +69,10 @@ func (r *TestSuiteReconciler) Reconcile(ctx context.Context, req ctrl.Request) ( return ctrl.Result{}, err } + if _, err = r.deleteTestSuite(req.NamespacedName.Name, req.NamespacedName.Namespace); err != nil { + return ctrl.Result{}, err + } + return ctrl.Result{}, nil } @@ -158,3 +166,25 @@ func (r *TestSuiteReconciler) SetupWithManager(mgr ctrl.Manager) error { WithEventFilter(pred). Complete(r) } + +func (r *TestSuiteReconciler) deleteTestSuite(testSuiteName, namespace string) (out string, err error) { + request, err := http.NewRequest(http.MethodDelete, + fmt.Sprintf("http://%s.%s.svc.cluster.local:%d/v1/test-suites/%s?skipDeleteCRD=true", + r.ServiceName, namespace, r.ServicePort, testSuiteName), nil) + if err != nil { + return out, err + } + + request.Header.Set("Content-Type", "application/json") + resp, err := http.DefaultClient.Do(request) + if err != nil { + return out, err + } + defer resp.Body.Close() + + if resp.StatusCode > 300 { + return out, fmt.Errorf("could not DELETE, statusCode: %d", resp.StatusCode) + } + + return fmt.Sprintf("status: %d", resp.StatusCode), err +} diff --git a/internal/controller/testworkflows/testworkflow_controller.go b/internal/controller/testworkflows/testworkflow_controller.go index 80b4cfb4..9b3c3c61 100644 --- a/internal/controller/testworkflows/testworkflow_controller.go +++ b/internal/controller/testworkflows/testworkflow_controller.go @@ -18,7 +18,9 @@ package testworkflows import ( "context" + "fmt" "maps" + "net/http" testworkflowsv1 "github.com/kubeshop/testkube-operator/api/testworkflows/v1" "github.com/kubeshop/testkube-operator/pkg/cronjob" @@ -37,6 +39,8 @@ type TestWorkflowReconciler struct { client.Client Scheme *runtime.Scheme CronJobClient *cronjob.Client + ServiceName string + ServicePort int } //+kubebuilder:rbac:groups=testworkflows.testkube.io,resources=testworkflows,verbs=get;list;watch;create;update;patch;delete @@ -64,6 +68,10 @@ func (r *TestWorkflowReconciler) Reconcile(ctx context.Context, req ctrl.Request return ctrl.Result{}, err } + if _, err = r.deleteTestWorkflow(req.NamespacedName.Name, req.NamespacedName.Namespace); err != nil { + return ctrl.Result{}, err + } + return ctrl.Result{}, nil } @@ -215,3 +223,25 @@ func (r *TestWorkflowReconciler) SetupWithManager(mgr ctrl.Manager) error { For(&testworkflowsv1.TestWorkflow{}). Complete(r) } + +func (r *TestWorkflowReconciler) deleteTestWorkflow(testWorkflowName, namespace string) (out string, err error) { + request, err := http.NewRequest(http.MethodDelete, + fmt.Sprintf("http://%s.%s.svc.cluster.local:%d/v1/test-workflows/%s?skipDeleteCRD=true", + r.ServiceName, namespace, r.ServicePort, testWorkflowName), nil) + if err != nil { + return out, err + } + + request.Header.Set("Content-Type", "application/json") + resp, err := http.DefaultClient.Do(request) + if err != nil { + return out, err + } + defer resp.Body.Close() + + if resp.StatusCode > 300 { + return out, fmt.Errorf("could not DELETE, statusCode: %d", resp.StatusCode) + } + + return fmt.Sprintf("status: %d", resp.StatusCode), err +}