Skip to content

Commit

Permalink
Update deployment template
Browse files Browse the repository at this point in the history
  • Loading branch information
christinaexyou committed Feb 12, 2025
1 parent 6a188c0 commit 06ebbba
Show file tree
Hide file tree
Showing 10 changed files with 189 additions and 148 deletions.
131 changes: 20 additions & 111 deletions controllers/gorch/guardrailsorchestrator_controller.go
Original file line number Diff line number Diff line change
Expand Up @@ -122,16 +122,11 @@ func (r *GuardrailsOrchestratorReconciler) Reconcile(ctx context.Context, req ct
isMarkedToBeDeleted := orchestrator.GetDeletionTimestamp() != nil
if isMarkedToBeDeleted {
if controllerutil.ContainsFinalizer(orchestrator, finalizerName) {
log.Info("Performing Finalizer Operations for GuardrailsOrchestrator before deleting the CR")
if err = r.doFinalizerOperationsForOrchestrator(ctx, orchestrator); err != nil {
log.Error(err, "Failed to do finalizer operations for GuardrailsOrchestrator")
return ctrl.Result{Requeue: true}, err
}
if err = r.Get(ctx, req.NamespacedName, orchestrator); err != nil {
log.Error(err, "Failed to re-fetch GuardrailsOrchestrator")
return ctrl.Result{}, err
}
log.Info("Removing Finalizer for GuardrailsOrchestrator after sucessfully performing the operations")
log.Info("Removing Finalizer for GuardrailsOrchestrator")
if ok := controllerutil.RemoveFinalizer(orchestrator, finalizerName); !ok {
log.Error(err, "Failed to remove finalizer from GuardrailsOrchestrator")
return ctrl.Result{Requeue: true}, nil
Expand Down Expand Up @@ -201,14 +196,28 @@ func (r *GuardrailsOrchestratorReconciler) Reconcile(ctx context.Context, req ct
}

existingRoute := &routev1.Route{}
err = r.Get(ctx, types.NamespacedName{Name: orchestrator.Name + "-route", Namespace: orchestrator.Namespace}, existingRoute)
err = r.Get(ctx, types.NamespacedName{Name: orchestrator.Name + "-http", Namespace: orchestrator.Namespace}, existingRoute)
if err != nil && errors.IsNotFound(err) {
// Define a new route
route := r.createRoute(ctx, orchestrator)
log.Info("Creating a new Route", "Route.Namespace", route.Namespace, "Route.Name", route.Name)
err = r.Create(ctx, route)
httpRoute := r.createRoute(ctx, "http-route.tmpl.yaml", orchestrator)
log.Info("Creating a new Route", "Route.Namespace", httpRoute.Namespace, "Route.Name", httpRoute.Name)
err = r.Create(ctx, httpRoute)
if err != nil {
log.Error(err, "Failed to create new Route", "Route.Namespace", route.Namespace, "Route.Name", route.Name)
log.Error(err, "Failed to create new Route", "Route.Namespace", httpRoute.Namespace, "Route.Name", httpRoute.Name)
}
} else if err != nil {
log.Error(err, "Failed to get Route")
return ctrl.Result{}, err
}

err = r.Get(ctx, types.NamespacedName{Name: orchestrator.Name + "-health", Namespace: orchestrator.Namespace}, existingRoute)
if err != nil && errors.IsNotFound(err) {
// Define a new route
healthRoute := r.createRoute(ctx, "health-route.tmpl.yaml", orchestrator)
log.Info("Creating a new Route", "Route.Namespace", healthRoute.Namespace, "Route.Name", healthRoute.Name)
err = r.Create(ctx, healthRoute)
if err != nil {
log.Error(err, "Failed to create new Route", "Route.Namespace", healthRoute.Namespace, "Route.Name", healthRoute.Name)
}
} else if err != nil {
log.Error(err, "Failed to get Route")
Expand All @@ -223,106 +232,6 @@ func (r *GuardrailsOrchestratorReconciler) Reconcile(ctx context.Context, req ct
return ctrl.Result{Requeue: true, RequeueAfter: 30 * time.Second}, nil
}

func (r *GuardrailsOrchestratorReconciler) deleteServiceAccount(ctx context.Context, orchestrator *gorchv1alpha1.GuardrailsOrchestrator) (err error) {
obj := client.ObjectKey{Name: orchestrator.Name + "-serviceaccount", Namespace: orchestrator.Namespace}
orig := &corev1.ServiceAccount{}
log := log.FromContext(ctx).WithValues("GuardrailsOrchestratorReconciler.deleteServiceAccount", obj)
err = r.Get(ctx, obj, orig)
if errors.IsNotFound(err) {
return nil
} else if err != nil {
log.Error(err, "Get", "ServiceAccount", obj)
return err
}

err = r.Delete(ctx, orig, &client.DeleteOptions{})
if err != nil && errors.IsNotFound(err) {
log.Error(err, "Delete", "ServiceAccount", obj)
return err
}
log.Info("Delete", "ServiceAccount", obj)
return nil
}

func (r *GuardrailsOrchestratorReconciler) deleteDeployment(ctx context.Context, orchestrator *gorchv1alpha1.GuardrailsOrchestrator) (err error) {
obj := client.ObjectKey{Name: orchestrator.Name, Namespace: orchestrator.Namespace}
orig := &appsv1.Deployment{}
log := log.FromContext(ctx).WithValues("GuardrailsOrchestratorReconciler.deleteDeployment", obj)
err = r.Get(ctx, obj, orig)
if errors.IsNotFound(err) {
return nil
} else if err != nil {
log.Error(err, "Get", "Deployment", obj)
return err
}

err = r.Delete(ctx, orig, &client.DeleteOptions{})
if err != nil && errors.IsNotFound(err) {
log.Error(err, "Delete", "Deployment", obj)
return err
}
log.Info("Delete", "Deployment", obj)
return nil
}

func (r *GuardrailsOrchestratorReconciler) deleteService(ctx context.Context, orchestrator *gorchv1alpha1.GuardrailsOrchestrator) (err error) {
obj := client.ObjectKey{Name: orchestrator.Name + "-service", Namespace: orchestrator.Namespace}
orig := &corev1.Service{}
log := log.FromContext(ctx).WithValues("GuardrailsOrchestratorReconciler.deleteService", obj)
err = r.Get(ctx, obj, orig)
if errors.IsNotFound(err) {
return nil
} else if err != nil {
log.Error(err, "Get", "Service", obj)
return err
}

err = r.Delete(ctx, orig, &client.DeleteOptions{})
if err != nil && errors.IsNotFound(err) {
log.Error(err, "Delete", "Service", obj)
return err
}
log.Info("Delete", "Service", obj)
return nil
}

func (r *GuardrailsOrchestratorReconciler) deleteRoute(ctx context.Context, orchestrator *gorchv1alpha1.GuardrailsOrchestrator) (err error) {
obj := client.ObjectKey{Name: orchestrator.Name + "-route", Namespace: orchestrator.Namespace}
orig := &routev1.Route{}
log := log.FromContext(ctx).WithValues("GuardrailsOrchestratorReconciler.deleteRoute", obj)
err = r.Get(ctx, obj, orig)
if errors.IsNotFound(err) {
return nil
} else if err != nil {
log.Error(err, "Get", "Route", obj)
return err
}

err = r.Delete(ctx, orig, &client.DeleteOptions{})
if err != nil && !errors.IsNotFound(err) {
log.Error(err, "Delete", "Route", obj)
return err
}
log.Info("Delete", "Route", obj)
return nil
}

func (r *GuardrailsOrchestratorReconciler) doFinalizerOperationsForOrchestrator(ctx context.Context, orchestrator *gorchv1alpha1.GuardrailsOrchestrator) (err error) {
if err = r.deleteServiceAccount(ctx, orchestrator); err != nil {
return err
}
if err = r.deleteDeployment(ctx, orchestrator); err != nil {
return err
}
if err = r.deleteService(ctx, orchestrator); err != nil {
return err
}
if err = r.deleteRoute(ctx, orchestrator); err != nil {
return err
}
return
}

// SetupWithManager sets up the controller with the Manager.
func (r *GuardrailsOrchestratorReconciler) SetupWithManager(mgr ctrl.Manager) error {
return ctrl.NewControllerManagedBy(mgr).
Expand Down
22 changes: 19 additions & 3 deletions controllers/gorch/guardrailsorchestrator_controller_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -112,7 +112,14 @@ func deleteGuardrailsOrchestrator(ctx context.Context, namespace string) error {
Namespace: typedNamespacedName.Namespace,
},
}
err = doFinalizerOperationsForOrchestrator(ctx, gorch)
if err != nil {
return err
}
err = k8sClient.Delete(ctx, gorch)
if err != nil {
return err
}
}
return err
}
Expand Down Expand Up @@ -207,7 +214,10 @@ func testCreateDeleteGuardrailsOrchestrator(namespaceName string) {
if err := routev1.AddToScheme(scheme.Scheme); err != nil {
return err
}
if err := k8sClient.Get(ctx, types.NamespacedName{Name: orchestratorName + "-route", Namespace: namespaceName}, route); err != nil {
if err := k8sClient.Get(ctx, types.NamespacedName{Name: orchestratorName + "-http", Namespace: namespaceName}, route); err != nil {
return err
}
if err := k8sClient.Get(ctx, types.NamespacedName{Name: orchestratorName + "-health", Namespace: namespaceName}, route); err != nil {
return err
}
return nil
Expand Down Expand Up @@ -337,7 +347,10 @@ func testCreateDeleteGuardrailsOrchestratorSidecar(namespaceName string) {
if err := routev1.AddToScheme(scheme.Scheme); err != nil {
return err
}
if err := k8sClient.Get(ctx, types.NamespacedName{Name: orchestratorName + "-route", Namespace: namespaceName}, route); err != nil {
if err := k8sClient.Get(ctx, types.NamespacedName{Name: orchestratorName + "-http", Namespace: namespaceName}, route); err != nil {
return err
}
if err := k8sClient.Get(ctx, types.NamespacedName{Name: orchestratorName + "-health", Namespace: namespaceName}, route); err != nil {
return err
}
return nil
Expand Down Expand Up @@ -461,7 +474,10 @@ func testCreateDeleteGuardrailsOrchestratorOtelExporter(namespaceName string) {
if err := routev1.AddToScheme(scheme.Scheme); err != nil {
return err
}
if err := k8sClient.Get(ctx, types.NamespacedName{Name: orchestratorName + "-route", Namespace: namespaceName}, route); err != nil {
if err := k8sClient.Get(ctx, types.NamespacedName{Name: orchestratorName + "-http", Namespace: namespaceName}, route); err != nil {
return err
}
if err := k8sClient.Get(ctx, types.NamespacedName{Name: orchestratorName + "-health", Namespace: namespaceName}, route); err != nil {
return err
}
return nil
Expand Down
10 changes: 3 additions & 7 deletions controllers/gorch/route.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,17 +17,13 @@ import (
"sigs.k8s.io/controller-runtime/pkg/log"
)

const routeTemplatePath = "route.tmpl.yaml"

type RouteConfig struct {
Orchestrator *gorchv1alpha1.GuardrailsOrchestrator
PortName string
}

func (r *GuardrailsOrchestratorReconciler) createRoute(ctx context.Context, orchestrator *gorchv1alpha1.GuardrailsOrchestrator) *routev1.Route {
func (r *GuardrailsOrchestratorReconciler) createRoute(ctx context.Context, routeTemplatePath string, orchestrator *gorchv1alpha1.GuardrailsOrchestrator) *routev1.Route {
routeHttpConfig := RouteConfig{
Orchestrator: orchestrator,
PortName: "http",
}
var route *routev1.Route
route, err := templateParser.ParseResource[routev1.Route](routeTemplatePath, routeHttpConfig, reflect.TypeOf(&routev1.Route{}))
Expand All @@ -39,7 +35,7 @@ func (r *GuardrailsOrchestratorReconciler) createRoute(ctx context.Context, orch
return route
}

func (r *GuardrailsOrchestratorReconciler) checkRouteReady(ctx context.Context, orchestrator *gorchv1alpha1.GuardrailsOrchestrator) (bool, error) {
func (r *GuardrailsOrchestratorReconciler) checkRouteReady(ctx context.Context, orchestrator *gorchv1alpha1.GuardrailsOrchestrator, portName string) (bool, error) {
// Retry logic for getting the route and checking its readiness
var existingRoute *routev1.Route
err := retry.OnError(
Expand All @@ -52,7 +48,7 @@ func (r *GuardrailsOrchestratorReconciler) checkRouteReady(ctx context.Context,
},
func() error {
// Fetch the Route resource
typedNamespaceName := types.NamespacedName{Name: orchestrator.Name + "-route", Namespace: orchestrator.Namespace}
typedNamespaceName := types.NamespacedName{Name: orchestrator.Name + portName, Namespace: orchestrator.Namespace}
existingRoute = &routev1.Route{}
err := r.Get(ctx, typedNamespaceName, existingRoute)
if err != nil {
Expand Down
5 changes: 3 additions & 2 deletions controllers/gorch/status.go
Original file line number Diff line number Diff line change
Expand Up @@ -128,8 +128,9 @@ func (r *GuardrailsOrchestratorReconciler) updateStatus(ctx context.Context, ori
func (r *GuardrailsOrchestratorReconciler) reconcileStatuses(ctx context.Context, orchestrator *gorchv1alpha1.GuardrailsOrchestrator) (ctrl.Result, error) {
generatorReady, _ = r.checkGeneratorPresent(ctx, orchestrator.Namespace)
deploymentReady, _ = r.checkDeploymentReady(ctx, orchestrator)
routeReady, _ = r.checkRouteReady(ctx, orchestrator)

httpRouteReady, _ := r.checkRouteReady(ctx, orchestrator, "-http")
healthRouteReady, _ := r.checkRouteReady(ctx, orchestrator, "-health")
routeReady = httpRouteReady && healthRouteReady
if generatorReady && deploymentReady && routeReady {
_, updateErr := r.updateStatus(ctx, orchestrator, func(saved *gorchv1alpha1.GuardrailsOrchestrator) {
SetResourceCondition(&saved.Status.Conditions, "InferenceService", "InferenceServiceReady", "Inference service is ready", corev1.ConditionTrue)
Expand Down
103 changes: 103 additions & 0 deletions controllers/gorch/suite_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -25,12 +25,15 @@ import (
. "github.com/onsi/gomega"

routev1 "github.com/openshift/api/route/v1"
appsv1 "k8s.io/api/apps/v1"
corev1 "k8s.io/api/core/v1"
"k8s.io/apimachinery/pkg/api/errors"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/client-go/kubernetes/scheme"
"k8s.io/client-go/rest"
"sigs.k8s.io/controller-runtime/pkg/client"
"sigs.k8s.io/controller-runtime/pkg/envtest"
"sigs.k8s.io/controller-runtime/pkg/log"
logf "sigs.k8s.io/controller-runtime/pkg/log"
"sigs.k8s.io/controller-runtime/pkg/log/zap"

Expand Down Expand Up @@ -66,6 +69,106 @@ func getEnvVar(envVarName string, envVars []corev1.EnvVar) *corev1.EnvVar {
return nil
}

func deleteServiceAccount(ctx context.Context, orchestrator *gorchv1alpha1.GuardrailsOrchestrator) (err error) {
obj := client.ObjectKey{Name: orchestrator.Name + "-serviceaccount", Namespace: orchestrator.Namespace}
orig := &corev1.ServiceAccount{}
log := log.FromContext(ctx).WithValues("GuardrailsOrchestratorReconciler.deleteServiceAccount", obj)
err = k8sClient.Get(ctx, obj, orig)
if errors.IsNotFound(err) {
return nil
} else if err != nil {
log.Error(err, "Get", "ServiceAccount", obj)
return err
}

err = k8sClient.Delete(ctx, orig, &client.DeleteOptions{})
if err != nil && errors.IsNotFound(err) {
log.Error(err, "Delete", "ServiceAccount", obj)
return err
}
log.Info("Delete", "ServiceAccount", obj)
return nil
}

func deleteDeployment(ctx context.Context, orchestrator *gorchv1alpha1.GuardrailsOrchestrator) (err error) {
obj := client.ObjectKey{Name: orchestrator.Name, Namespace: orchestrator.Namespace}
orig := &appsv1.Deployment{}
log := log.FromContext(ctx).WithValues("GuardrailsOrchestratorReconciler.deleteDeployment", obj)
err = k8sClient.Get(ctx, obj, orig)
if errors.IsNotFound(err) {
return nil
} else if err != nil {
log.Error(err, "Get", "Deployment", obj)
return err
}

err = k8sClient.Delete(ctx, orig, &client.DeleteOptions{})
if err != nil && errors.IsNotFound(err) {
log.Error(err, "Delete", "Deployment", obj)
return err
}
log.Info("Delete", "Deployment", obj)
return nil
}

func deleteService(ctx context.Context, orchestrator *gorchv1alpha1.GuardrailsOrchestrator) (err error) {
obj := client.ObjectKey{Name: orchestrator.Name + "-service", Namespace: orchestrator.Namespace}
orig := &corev1.Service{}
log := log.FromContext(ctx).WithValues("GuardrailsOrchestratorReconciler.deleteService", obj)
err = k8sClient.Get(ctx, obj, orig)
if errors.IsNotFound(err) {
return nil
} else if err != nil {
log.Error(err, "Get", "Service", obj)
return err
}

err = k8sClient.Delete(ctx, orig, &client.DeleteOptions{})
if err != nil && errors.IsNotFound(err) {
log.Error(err, "Delete", "Service", obj)
return err
}
log.Info("Delete", "Service", obj)
return nil
}

func deleteRoute(ctx context.Context, orchestrator *gorchv1alpha1.GuardrailsOrchestrator) (err error) {
obj := client.ObjectKey{Name: orchestrator.Name + "-route", Namespace: orchestrator.Namespace}
orig := &routev1.Route{}
log := log.FromContext(ctx).WithValues("GuardrailsOrchestratorReconciler.deleteRoute", obj)
err = k8sClient.Get(ctx, obj, orig)
if errors.IsNotFound(err) {
return nil
} else if err != nil {
log.Error(err, "Get", "Route", obj)
return err
}

err = k8sClient.Delete(ctx, orig, &client.DeleteOptions{})
if err != nil && !errors.IsNotFound(err) {
log.Error(err, "Delete", "Route", obj)
return err
}
log.Info("Delete", "Route", obj)
return nil
}

func doFinalizerOperationsForOrchestrator(ctx context.Context, orchestrator *gorchv1alpha1.GuardrailsOrchestrator) (err error) {
if err = deleteServiceAccount(ctx, orchestrator); err != nil {
return err
}
if err = deleteDeployment(ctx, orchestrator); err != nil {
return err
}
if err = deleteService(ctx, orchestrator); err != nil {
return err
}
if err = deleteRoute(ctx, orchestrator); err != nil {
return err
}
return
}

func TestControllers(t *testing.T) {
RegisterFailHandler(Fail)

Expand Down
Loading

0 comments on commit 06ebbba

Please sign in to comment.