Unverified Commit 26fe79dc authored by julienmancuso's avatar julienmancuso Committed by GitHub
Browse files

feat: rename operator CRDs (#795)

parent a03fd307
...@@ -19,6 +19,7 @@ package controller ...@@ -19,6 +19,7 @@ package controller
import ( import (
"fmt" "fmt"
"strings"
"github.com/ai-dynamo/dynamo/deploy/dynamo/operator/api/v1alpha1" "github.com/ai-dynamo/dynamo/deploy/dynamo/operator/api/v1alpha1"
corev1 "k8s.io/api/core/v1" corev1 "k8s.io/api/core/v1"
...@@ -90,3 +91,7 @@ func getIngressHost(ingressSpec v1alpha1.IngressSpec) string { ...@@ -90,3 +91,7 @@ func getIngressHost(ingressSpec v1alpha1.IngressSpec) string {
} }
return fmt.Sprintf("%s.%s", host, ingressSuffix) return fmt.Sprintf("%s.%s", host, ingressSuffix)
} }
func getK8sName(value string) string {
return strings.ReplaceAll(value, ":", "--")
}
...@@ -90,8 +90,8 @@ const ( ...@@ -90,8 +90,8 @@ const (
var ServicePortHTTPNonProxy = commonconsts.DynamoServicePort + 1 var ServicePortHTTPNonProxy = commonconsts.DynamoServicePort + 1
// DynamoNimDeploymentReconciler reconciles a DynamoNimDeployment object // DynamoComponentDeploymentReconciler reconciles a DynamoComponentDeployment object
type DynamoNimDeploymentReconciler struct { type DynamoComponentDeploymentReconciler struct {
client.Client client.Client
Scheme *runtime.Scheme Scheme *runtime.Scheme
Recorder record.EventRecorder Recorder record.EventRecorder
...@@ -102,9 +102,9 @@ type DynamoNimDeploymentReconciler struct { ...@@ -102,9 +102,9 @@ type DynamoNimDeploymentReconciler struct {
UseVirtualService bool UseVirtualService bool
} }
// +kubebuilder:rbac:groups=nvidia.com,resources=dynamonimdeployments,verbs=get;list;watch;create;update;patch;delete // +kubebuilder:rbac:groups=nvidia.com,resources=dynamocomponentdeployments,verbs=get;list;watch;create;update;patch;delete
// +kubebuilder:rbac:groups=nvidia.com,resources=dynamonimdeployments/status,verbs=get;update;patch // +kubebuilder:rbac:groups=nvidia.com,resources=dynamocomponentdeployments/status,verbs=get;update;patch
// +kubebuilder:rbac:groups=nvidia.com,resources=dynamonimdeployments/finalizers,verbs=update // +kubebuilder:rbac:groups=nvidia.com,resources=dynamocomponentdeployments/finalizers,verbs=update
//+kubebuilder:rbac:groups=apps,resources=deployments,verbs=get;list;watch;create;update;patch;delete //+kubebuilder:rbac:groups=apps,resources=deployments,verbs=get;list;watch;create;update;patch;delete
//+kubebuilder:rbac:groups=core,resources=pods,verbs=get;list;watch //+kubebuilder:rbac:groups=core,resources=pods,verbs=get;list;watch
...@@ -122,7 +122,7 @@ type DynamoNimDeploymentReconciler struct { ...@@ -122,7 +122,7 @@ type DynamoNimDeploymentReconciler struct {
// Reconcile is part of the main kubernetes reconciliation loop which aims to // Reconcile is part of the main kubernetes reconciliation loop which aims to
// move the current state of the cluster closer to the desired state. // move the current state of the cluster closer to the desired state.
// TODO(user): Modify the Reconcile function to compare the state specified by // TODO(user): Modify the Reconcile function to compare the state specified by
// the DynamoNimDeployment object against the actual cluster state, and then // the DynamoComponentDeployment object against the actual cluster state, and then
// perform operations to make the cluster state reflect the state specified by // perform operations to make the cluster state reflect the state specified by
// the user. // the user.
// //
...@@ -130,27 +130,27 @@ type DynamoNimDeploymentReconciler struct { ...@@ -130,27 +130,27 @@ type DynamoNimDeploymentReconciler struct {
// - https://pkg.go.dev/sigs.k8s.io/controller-runtime@v0.18.2/pkg/reconcile // - https://pkg.go.dev/sigs.k8s.io/controller-runtime@v0.18.2/pkg/reconcile
// //
//nolint:gocyclo,nakedret //nolint:gocyclo,nakedret
func (r *DynamoNimDeploymentReconciler) Reconcile(ctx context.Context, req ctrl.Request) (result ctrl.Result, err error) { func (r *DynamoComponentDeploymentReconciler) Reconcile(ctx context.Context, req ctrl.Request) (result ctrl.Result, err error) {
logs := log.FromContext(ctx) logs := log.FromContext(ctx)
dynamoNimDeployment := &v1alpha1.DynamoNimDeployment{} dynamoComponentDeployment := &v1alpha1.DynamoComponentDeployment{}
err = r.Get(ctx, req.NamespacedName, dynamoNimDeployment) err = r.Get(ctx, req.NamespacedName, dynamoComponentDeployment)
if err != nil { if err != nil {
if k8serrors.IsNotFound(err) { if k8serrors.IsNotFound(err) {
// Object not found, return. Created objects are automatically garbage collected. // Object not found, return. Created objects are automatically garbage collected.
// For additional cleanup logic use finalizers. // For additional cleanup logic use finalizers.
logs.Info("DynamoNimDeployment resource not found. Ignoring since object must be deleted.") logs.Info("DynamoComponentDeployment resource not found. Ignoring since object must be deleted.")
err = nil err = nil
return return
} }
// Error reading the object - requeue the request. // Error reading the object - requeue the request.
logs.Error(err, "Failed to get DynamoNimDeployment.") logs.Error(err, "Failed to get DynamoComponentDeployment.")
return return
} }
logs = logs.WithValues("dynamoNimDeployment", dynamoNimDeployment.Name, "namespace", dynamoNimDeployment.Namespace) logs = logs.WithValues("dynamoComponentDeployment", dynamoComponentDeployment.Name, "namespace", dynamoComponentDeployment.Namespace)
deleted, err := commonController.HandleFinalizer(ctx, dynamoNimDeployment, r.Client, r) deleted, err := commonController.HandleFinalizer(ctx, dynamoComponentDeployment, r.Client, r)
if err != nil { if err != nil {
logs.Error(err, "Failed to handle finalizer") logs.Error(err, "Failed to handle finalizer")
return ctrl.Result{}, err return ctrl.Result{}, err
...@@ -159,22 +159,22 @@ func (r *DynamoNimDeploymentReconciler) Reconcile(ctx context.Context, req ctrl. ...@@ -159,22 +159,22 @@ func (r *DynamoNimDeploymentReconciler) Reconcile(ctx context.Context, req ctrl.
return ctrl.Result{}, nil return ctrl.Result{}, nil
} }
if len(dynamoNimDeployment.Status.Conditions) == 0 { if len(dynamoComponentDeployment.Status.Conditions) == 0 {
logs.Info("Starting to reconcile DynamoNimDeployment") logs.Info("Starting to reconcile DynamoComponentDeployment")
logs.Info("Initializing DynamoNimDeployment status") logs.Info("Initializing DynamoComponentDeployment status")
r.Recorder.Event(dynamoNimDeployment, corev1.EventTypeNormal, "Reconciling", "Starting to reconcile DynamoNimDeployment") r.Recorder.Event(dynamoComponentDeployment, corev1.EventTypeNormal, "Reconciling", "Starting to reconcile DynamoComponentDeployment")
dynamoNimDeployment, err = r.setStatusConditions(ctx, req, dynamoComponentDeployment, err = r.setStatusConditions(ctx, req,
metav1.Condition{ metav1.Condition{
Type: v1alpha1.DynamoDeploymentConditionTypeAvailable, Type: v1alpha1.DynamoGraphDeploymentConditionTypeAvailable,
Status: metav1.ConditionUnknown, Status: metav1.ConditionUnknown,
Reason: "Reconciling", Reason: "Reconciling",
Message: "Starting to reconcile DynamoNimDeployment", Message: "Starting to reconcile DynamoComponentDeployment",
}, },
metav1.Condition{ metav1.Condition{
Type: v1alpha1.DynamoDeploymentConditionTypeDynamoNimFound, Type: v1alpha1.DynamoGraphDeploymentConditionTypeDynamoComponentFound,
Status: metav1.ConditionUnknown, Status: metav1.ConditionUnknown,
Reason: "Reconciling", Reason: "Reconciling",
Message: "Starting to reconcile DynamoNimDeployment", Message: "Starting to reconcile DynamoComponentDeployment",
}, },
) )
if err != nil { if err != nil {
...@@ -186,14 +186,14 @@ func (r *DynamoNimDeploymentReconciler) Reconcile(ctx context.Context, req ctrl. ...@@ -186,14 +186,14 @@ func (r *DynamoNimDeploymentReconciler) Reconcile(ctx context.Context, req ctrl.
if err == nil { if err == nil {
return return
} }
logs.Error(err, "Failed to reconcile DynamoNimDeployment.") logs.Error(err, "Failed to reconcile DynamoComponentDeployment.")
r.Recorder.Eventf(dynamoNimDeployment, corev1.EventTypeWarning, "ReconcileError", "Failed to reconcile DynamoNimDeployment: %v", err) r.Recorder.Eventf(dynamoComponentDeployment, corev1.EventTypeWarning, "ReconcileError", "Failed to reconcile DynamoComponentDeployment: %v", err)
_, err = r.setStatusConditions(ctx, req, _, err = r.setStatusConditions(ctx, req,
metav1.Condition{ metav1.Condition{
Type: v1alpha1.DynamoDeploymentConditionTypeAvailable, Type: v1alpha1.DynamoGraphDeploymentConditionTypeAvailable,
Status: metav1.ConditionFalse, Status: metav1.ConditionFalse,
Reason: "Reconciling", Reason: "Reconciling",
Message: fmt.Sprintf("Failed to reconcile DynamoNimDeployment: %v", err), Message: fmt.Sprintf("Failed to reconcile DynamoComponentDeployment: %v", err),
}, },
) )
if err != nil { if err != nil {
...@@ -201,70 +201,70 @@ func (r *DynamoNimDeploymentReconciler) Reconcile(ctx context.Context, req ctrl. ...@@ -201,70 +201,70 @@ func (r *DynamoNimDeploymentReconciler) Reconcile(ctx context.Context, req ctrl.
} }
}() }()
dynamoNimFoundCondition := meta.FindStatusCondition(dynamoNimDeployment.Status.Conditions, v1alpha1.DynamoDeploymentConditionTypeDynamoNimFound) dynamoComponentFoundCondition := meta.FindStatusCondition(dynamoComponentDeployment.Status.Conditions, v1alpha1.DynamoGraphDeploymentConditionTypeDynamoComponentFound)
if dynamoNimFoundCondition != nil && dynamoNimFoundCondition.Status == metav1.ConditionUnknown { if dynamoComponentFoundCondition != nil && dynamoComponentFoundCondition.Status == metav1.ConditionUnknown {
logs.Info(fmt.Sprintf("Getting Dynamo NIM %s", dynamoNimDeployment.Spec.DynamoNim)) logs.Info(fmt.Sprintf("Getting Dynamo Component %s", dynamoComponentDeployment.Spec.DynamoComponent))
r.Recorder.Eventf(dynamoNimDeployment, corev1.EventTypeNormal, "GetDynamoNim", "Getting Dynamo NIM %s", dynamoNimDeployment.Spec.DynamoNim) r.Recorder.Eventf(dynamoComponentDeployment, corev1.EventTypeNormal, "GetDynamoComponent", "Getting Dynamo Component %s", dynamoComponentDeployment.Spec.DynamoComponent)
} }
dynamoNimRequest := &v1alpha1.DynamoNimRequest{} dynamoComponentRequest := &v1alpha1.DynamoComponentRequest{}
dynamoNimCR := &v1alpha1.DynamoNim{} dynamoComponentCR := &v1alpha1.DynamoComponent{}
err = r.Get(ctx, types.NamespacedName{ err = r.Get(ctx, types.NamespacedName{
Namespace: dynamoNimDeployment.Namespace, Namespace: dynamoComponentDeployment.Namespace,
Name: dynamoNimDeployment.Spec.DynamoNim, Name: getK8sName(dynamoComponentDeployment.Spec.DynamoComponent),
}, dynamoNimCR) }, dynamoComponentCR)
dynamoNimIsNotFound := k8serrors.IsNotFound(err) dynamoComponentIsNotFound := k8serrors.IsNotFound(err)
if err != nil && !dynamoNimIsNotFound { if err != nil && !dynamoComponentIsNotFound {
err = errors.Wrapf(err, "get DynamoNim %s/%s", dynamoNimDeployment.Namespace, dynamoNimDeployment.Spec.DynamoNim) err = errors.Wrapf(err, "get DynamoComponent %s/%s", dynamoComponentDeployment.Namespace, dynamoComponentDeployment.Spec.DynamoComponent)
return return
} }
if dynamoNimIsNotFound { if dynamoComponentIsNotFound {
if dynamoNimFoundCondition != nil && dynamoNimFoundCondition.Status == metav1.ConditionUnknown { if dynamoComponentFoundCondition != nil && dynamoComponentFoundCondition.Status == metav1.ConditionUnknown {
logs.Info(fmt.Sprintf("DynamoNim %s not found", dynamoNimDeployment.Spec.DynamoNim)) logs.Info(fmt.Sprintf("DynamoComponent %s not found", dynamoComponentDeployment.Spec.DynamoComponent))
r.Recorder.Eventf(dynamoNimDeployment, corev1.EventTypeNormal, "GetDynamoNim", "DynamoNim %s not found", dynamoNimDeployment.Spec.DynamoNim) r.Recorder.Eventf(dynamoComponentDeployment, corev1.EventTypeNormal, "GetDynamoComponent", "DynamoComponent %s not found", dynamoComponentDeployment.Spec.DynamoComponent)
} }
dynamoNimDeployment, err = r.setStatusConditions(ctx, req, dynamoComponentDeployment, err = r.setStatusConditions(ctx, req,
metav1.Condition{ metav1.Condition{
Type: v1alpha1.DynamoDeploymentConditionTypeDynamoNimFound, Type: v1alpha1.DynamoGraphDeploymentConditionTypeDynamoComponentFound,
Status: metav1.ConditionFalse, Status: metav1.ConditionFalse,
Reason: "Reconciling", Reason: "Reconciling",
Message: "DynamoNim not found", Message: "DynamoComponent not found",
}, },
) )
if err != nil { if err != nil {
return return
} }
dynamoNimRequestFoundCondition := meta.FindStatusCondition(dynamoNimDeployment.Status.Conditions, v1alpha1.DynamoDeploymentConditionTypeDynamoNimRequestFound) dynamoComponentRequestFoundCondition := meta.FindStatusCondition(dynamoComponentDeployment.Status.Conditions, v1alpha1.DynamoGraphDeploymentConditionTypeDynamoComponentRequestFound)
if dynamoNimRequestFoundCondition == nil || dynamoNimRequestFoundCondition.Status != metav1.ConditionUnknown { if dynamoComponentRequestFoundCondition == nil || dynamoComponentRequestFoundCondition.Status != metav1.ConditionUnknown {
dynamoNimDeployment, err = r.setStatusConditions(ctx, req, dynamoComponentDeployment, err = r.setStatusConditions(ctx, req,
metav1.Condition{ metav1.Condition{
Type: v1alpha1.DynamoDeploymentConditionTypeDynamoNimRequestFound, Type: v1alpha1.DynamoGraphDeploymentConditionTypeDynamoComponentRequestFound,
Status: metav1.ConditionUnknown, Status: metav1.ConditionUnknown,
Reason: "Reconciling", Reason: "Reconciling",
Message: "DynamoNim not found", Message: "DynamoComponent not found",
}, },
) )
if err != nil { if err != nil {
return return
} }
} }
if dynamoNimRequestFoundCondition != nil && dynamoNimRequestFoundCondition.Status == metav1.ConditionUnknown { if dynamoComponentRequestFoundCondition != nil && dynamoComponentRequestFoundCondition.Status == metav1.ConditionUnknown {
r.Recorder.Eventf(dynamoNimDeployment, corev1.EventTypeNormal, "GetDynamoNimRequest", "Getting DynamoNimRequest %s", dynamoNimDeployment.Spec.DynamoNim) r.Recorder.Eventf(dynamoComponentDeployment, corev1.EventTypeNormal, "GetDynamoComponentRequest", "Getting DynamoComponentRequest %s", dynamoComponentDeployment.Spec.DynamoComponent)
} }
err = r.Get(ctx, types.NamespacedName{ err = r.Get(ctx, types.NamespacedName{
Namespace: dynamoNimDeployment.Namespace, Namespace: dynamoComponentDeployment.Namespace,
Name: dynamoNimDeployment.Spec.DynamoNim, Name: getK8sName(dynamoComponentDeployment.Spec.DynamoComponent),
}, dynamoNimRequest) }, dynamoComponentRequest)
if err != nil { if err != nil {
err = errors.Wrapf(err, "get DynamoNimRequest %s/%s", dynamoNimDeployment.Namespace, dynamoNimDeployment.Spec.DynamoNim) err = errors.Wrapf(err, "get DynamoComponentRequest %s/%s", dynamoComponentDeployment.Namespace, dynamoComponentDeployment.Spec.DynamoComponent)
dynamoNimDeployment, err = r.setStatusConditions(ctx, req, dynamoComponentDeployment, err = r.setStatusConditions(ctx, req,
metav1.Condition{ metav1.Condition{
Type: v1alpha1.DynamoDeploymentConditionTypeDynamoNimFound, Type: v1alpha1.DynamoGraphDeploymentConditionTypeDynamoComponentFound,
Status: metav1.ConditionFalse, Status: metav1.ConditionFalse,
Reason: "Reconciling", Reason: "Reconciling",
Message: err.Error(), Message: err.Error(),
}, },
metav1.Condition{ metav1.Condition{
Type: v1alpha1.DynamoDeploymentConditionTypeDynamoNimRequestFound, Type: v1alpha1.DynamoGraphDeploymentConditionTypeDynamoComponentRequestFound,
Status: metav1.ConditionFalse, Status: metav1.ConditionFalse,
Reason: "Reconciling", Reason: "Reconciling",
Message: err.Error(), Message: err.Error(),
...@@ -274,34 +274,34 @@ func (r *DynamoNimDeploymentReconciler) Reconcile(ctx context.Context, req ctrl. ...@@ -274,34 +274,34 @@ func (r *DynamoNimDeploymentReconciler) Reconcile(ctx context.Context, req ctrl.
return return
} }
} }
if dynamoNimRequestFoundCondition != nil && dynamoNimRequestFoundCondition.Status == metav1.ConditionUnknown { if dynamoComponentRequestFoundCondition != nil && dynamoComponentRequestFoundCondition.Status == metav1.ConditionUnknown {
logs.Info(fmt.Sprintf("DynamoNimRequest %s found", dynamoNimDeployment.Spec.DynamoNim)) logs.Info(fmt.Sprintf("DynamoComponentRequest %s found", dynamoComponentDeployment.Spec.DynamoComponent))
r.Recorder.Eventf(dynamoNimDeployment, corev1.EventTypeNormal, "GetDynamoNimRequest", "DynamoNimRequest %s is found and waiting for its dynamoNim to be provided", dynamoNimDeployment.Spec.DynamoNim) r.Recorder.Eventf(dynamoComponentDeployment, corev1.EventTypeNormal, "GetDynamoComponentRequest", "DynamoComponentRequest %s is found and waiting for its dynamoComponent to be provided", dynamoComponentDeployment.Spec.DynamoComponent)
} }
dynamoNimDeployment, err = r.setStatusConditions(ctx, req, dynamoComponentDeployment, err = r.setStatusConditions(ctx, req,
metav1.Condition{ metav1.Condition{
Type: v1alpha1.DynamoDeploymentConditionTypeDynamoNimRequestFound, Type: v1alpha1.DynamoGraphDeploymentConditionTypeDynamoComponentRequestFound,
Status: metav1.ConditionTrue, Status: metav1.ConditionTrue,
Reason: "Reconciling", Reason: "Reconciling",
Message: "DynamoNim not found", Message: "DynamoComponent not found",
}, },
) )
if err != nil { if err != nil {
return return
} }
dynamoNimRequestAvailableCondition := meta.FindStatusCondition(dynamoNimRequest.Status.Conditions, v1alpha1.DynamoDeploymentConditionTypeAvailable) dynamoComponentRequestAvailableCondition := meta.FindStatusCondition(dynamoComponentRequest.Status.Conditions, v1alpha1.DynamoGraphDeploymentConditionTypeAvailable)
if dynamoNimRequestAvailableCondition != nil && dynamoNimRequestAvailableCondition.Status == metav1.ConditionFalse { if dynamoComponentRequestAvailableCondition != nil && dynamoComponentRequestAvailableCondition.Status == metav1.ConditionFalse {
err = errors.Errorf("DynamoNimRequest %s/%s is not available: %s", dynamoNimRequest.Namespace, dynamoNimRequest.Name, dynamoNimRequestAvailableCondition.Message) err = errors.Errorf("DynamoComponentRequest %s/%s is not available: %s", dynamoComponentRequest.Namespace, dynamoComponentRequest.Name, dynamoComponentRequestAvailableCondition.Message)
r.Recorder.Eventf(dynamoNimDeployment, corev1.EventTypeWarning, "GetDynamoNimRequest", err.Error()) r.Recorder.Eventf(dynamoComponentDeployment, corev1.EventTypeWarning, "GetDynamoComponentRequest", err.Error())
_, err_ := r.setStatusConditions(ctx, req, _, err_ := r.setStatusConditions(ctx, req,
metav1.Condition{ metav1.Condition{
Type: v1alpha1.DynamoDeploymentConditionTypeDynamoNimFound, Type: v1alpha1.DynamoGraphDeploymentConditionTypeDynamoComponentFound,
Status: metav1.ConditionFalse, Status: metav1.ConditionFalse,
Reason: "Reconciling", Reason: "Reconciling",
Message: err.Error(), Message: err.Error(),
}, },
metav1.Condition{ metav1.Condition{
Type: v1alpha1.DynamoDeploymentConditionTypeAvailable, Type: v1alpha1.DynamoGraphDeploymentConditionTypeAvailable,
Status: metav1.ConditionFalse, Status: metav1.ConditionFalse,
Reason: "Reconciling", Reason: "Reconciling",
Message: err.Error(), Message: err.Error(),
...@@ -315,16 +315,16 @@ func (r *DynamoNimDeploymentReconciler) Reconcile(ctx context.Context, req ctrl. ...@@ -315,16 +315,16 @@ func (r *DynamoNimDeploymentReconciler) Reconcile(ctx context.Context, req ctrl.
} }
return return
} else { } else {
if dynamoNimFoundCondition != nil && dynamoNimFoundCondition.Status != metav1.ConditionTrue { if dynamoComponentFoundCondition != nil && dynamoComponentFoundCondition.Status != metav1.ConditionTrue {
logs.Info(fmt.Sprintf("DynamoNim %s found", dynamoNimDeployment.Spec.DynamoNim)) logs.Info(fmt.Sprintf("DynamoComponent %s found", dynamoComponentDeployment.Spec.DynamoComponent))
r.Recorder.Eventf(dynamoNimDeployment, corev1.EventTypeNormal, "GetDynamoNim", "DynamoNim %s is found", dynamoNimDeployment.Spec.DynamoNim) r.Recorder.Eventf(dynamoComponentDeployment, corev1.EventTypeNormal, "GetDynamoComponent", "DynamoComponent %s is found", dynamoComponentDeployment.Spec.DynamoComponent)
} }
dynamoNimDeployment, err = r.setStatusConditions(ctx, req, dynamoComponentDeployment, err = r.setStatusConditions(ctx, req,
metav1.Condition{ metav1.Condition{
Type: v1alpha1.DynamoDeploymentConditionTypeDynamoNimFound, Type: v1alpha1.DynamoGraphDeploymentConditionTypeDynamoComponentFound,
Status: metav1.ConditionTrue, Status: metav1.ConditionTrue,
Reason: "Reconciling", Reason: "Reconciling",
Message: "DynamoNim found", Message: "DynamoComponent found",
}, },
) )
if err != nil { if err != nil {
...@@ -335,7 +335,7 @@ func (r *DynamoNimDeploymentReconciler) Reconcile(ctx context.Context, req ctrl. ...@@ -335,7 +335,7 @@ func (r *DynamoNimDeploymentReconciler) Reconcile(ctx context.Context, req ctrl.
modified := false modified := false
// Reconcile PVC // Reconcile PVC
_, err = r.reconcilePVC(ctx, dynamoNimDeployment) _, err = r.reconcilePVC(ctx, dynamoComponentDeployment)
if err != nil { if err != nil {
logs.Error(err, "Unable to create PVC", "crd", req.NamespacedName) logs.Error(err, "Unable to create PVC", "crd", req.NamespacedName)
return ctrl.Result{}, err return ctrl.Result{}, err
...@@ -343,8 +343,8 @@ func (r *DynamoNimDeploymentReconciler) Reconcile(ctx context.Context, req ctrl. ...@@ -343,8 +343,8 @@ func (r *DynamoNimDeploymentReconciler) Reconcile(ctx context.Context, req ctrl.
// create or update api-server deployment // create or update api-server deployment
modified_, deployment, err := r.createOrUpdateOrDeleteDeployments(ctx, generateResourceOption{ modified_, deployment, err := r.createOrUpdateOrDeleteDeployments(ctx, generateResourceOption{
dynamoNimDeployment: dynamoNimDeployment, dynamoComponentDeployment: dynamoComponentDeployment,
dynamoNim: dynamoNimCR, dynamoComponent: dynamoComponentCR,
}) })
if err != nil { if err != nil {
return return
...@@ -356,8 +356,8 @@ func (r *DynamoNimDeploymentReconciler) Reconcile(ctx context.Context, req ctrl. ...@@ -356,8 +356,8 @@ func (r *DynamoNimDeploymentReconciler) Reconcile(ctx context.Context, req ctrl.
// create or update api-server hpa // create or update api-server hpa
modified_, _, err = createOrUpdateResource(ctx, r, generateResourceOption{ modified_, _, err = createOrUpdateResource(ctx, r, generateResourceOption{
dynamoNimDeployment: dynamoNimDeployment, dynamoComponentDeployment: dynamoComponentDeployment,
dynamoNim: dynamoNimCR, dynamoComponent: dynamoComponentCR,
}, r.generateHPA) }, r.generateHPA)
if err != nil { if err != nil {
return return
...@@ -369,8 +369,8 @@ func (r *DynamoNimDeploymentReconciler) Reconcile(ctx context.Context, req ctrl. ...@@ -369,8 +369,8 @@ func (r *DynamoNimDeploymentReconciler) Reconcile(ctx context.Context, req ctrl.
// create or update api-server service // create or update api-server service
modified_, err = r.createOrUpdateOrDeleteServices(ctx, generateResourceOption{ modified_, err = r.createOrUpdateOrDeleteServices(ctx, generateResourceOption{
dynamoNimDeployment: dynamoNimDeployment, dynamoComponentDeployment: dynamoComponentDeployment,
dynamoNim: dynamoNimCR, dynamoComponent: dynamoComponentCR,
}) })
if err != nil { if err != nil {
return return
...@@ -382,8 +382,8 @@ func (r *DynamoNimDeploymentReconciler) Reconcile(ctx context.Context, req ctrl. ...@@ -382,8 +382,8 @@ func (r *DynamoNimDeploymentReconciler) Reconcile(ctx context.Context, req ctrl.
// create or update api-server ingresses // create or update api-server ingresses
modified_, err = r.createOrUpdateOrDeleteIngress(ctx, generateResourceOption{ modified_, err = r.createOrUpdateOrDeleteIngress(ctx, generateResourceOption{
dynamoNimDeployment: dynamoNimDeployment, dynamoComponentDeployment: dynamoComponentDeployment,
dynamoNim: dynamoNimCR, dynamoComponent: dynamoComponentCR,
}) })
if err != nil { if err != nil {
return return
...@@ -394,36 +394,36 @@ func (r *DynamoNimDeploymentReconciler) Reconcile(ctx context.Context, req ctrl. ...@@ -394,36 +394,36 @@ func (r *DynamoNimDeploymentReconciler) Reconcile(ctx context.Context, req ctrl.
} }
if !modified { if !modified {
r.Recorder.Eventf(dynamoNimDeployment, corev1.EventTypeNormal, "UpdateDynamoDeployment", "No changes to dynamo deployment %s", dynamoNimDeployment.Name) r.Recorder.Eventf(dynamoComponentDeployment, corev1.EventTypeNormal, "UpdateDynamoGraphDeployment", "No changes to dynamo deployment %s", dynamoComponentDeployment.Name)
} }
logs.Info("Finished reconciling.") logs.Info("Finished reconciling.")
r.Recorder.Eventf(dynamoNimDeployment, corev1.EventTypeNormal, "Update", "All resources updated!") r.Recorder.Eventf(dynamoComponentDeployment, corev1.EventTypeNormal, "Update", "All resources updated!")
err = r.computeAvailableStatusCondition(ctx, req, deployment) err = r.computeAvailableStatusCondition(ctx, req, deployment)
return return
} }
func (r *DynamoNimDeploymentReconciler) FinalizeResource(ctx context.Context, dynamoNimDeployment *v1alpha1.DynamoNimDeployment) error { func (r *DynamoComponentDeploymentReconciler) FinalizeResource(ctx context.Context, dynamoComponentDeployment *v1alpha1.DynamoComponentDeployment) error {
logger := log.FromContext(ctx) logger := log.FromContext(ctx)
logger.Info("Finalizing the DynamoNimDeployment", "dynamoNimDeployment", dynamoNimDeployment) logger.Info("Finalizing the DynamoComponentDeployment", "dynamoComponentDeployment", dynamoComponentDeployment)
if dynamoNimDeployment.Spec.ServiceName != "" && dynamoNimDeployment.Spec.DynamoNamespace != nil && *dynamoNimDeployment.Spec.DynamoNamespace != "" { if dynamoComponentDeployment.Spec.ServiceName != "" && dynamoComponentDeployment.Spec.DynamoNamespace != nil && *dynamoComponentDeployment.Spec.DynamoNamespace != "" {
logger.Info("Deleting the etcd keys for the service", "service", dynamoNimDeployment.Spec.ServiceName, "dynamoNamespace", *dynamoNimDeployment.Spec.DynamoNamespace) logger.Info("Deleting the etcd keys for the service", "service", dynamoComponentDeployment.Spec.ServiceName, "dynamoNamespace", *dynamoComponentDeployment.Spec.DynamoNamespace)
err := r.EtcdStorage.DeleteKeys(ctx, fmt.Sprintf("/%s/components/%s", *dynamoNimDeployment.Spec.DynamoNamespace, dynamoNimDeployment.Spec.ServiceName)) err := r.EtcdStorage.DeleteKeys(ctx, fmt.Sprintf("/%s/components/%s", *dynamoComponentDeployment.Spec.DynamoNamespace, dynamoComponentDeployment.Spec.ServiceName))
if err != nil { if err != nil {
logger.Error(err, "Failed to delete the etcd keys for the service", "service", dynamoNimDeployment.Spec.ServiceName, "dynamoNamespace", *dynamoNimDeployment.Spec.DynamoNamespace) logger.Error(err, "Failed to delete the etcd keys for the service", "service", dynamoComponentDeployment.Spec.ServiceName, "dynamoNamespace", *dynamoComponentDeployment.Spec.DynamoNamespace)
return err return err
} }
} }
return nil return nil
} }
func (r *DynamoNimDeploymentReconciler) computeAvailableStatusCondition(ctx context.Context, req ctrl.Request, deployment *appsv1.Deployment) error { func (r *DynamoComponentDeploymentReconciler) computeAvailableStatusCondition(ctx context.Context, req ctrl.Request, deployment *appsv1.Deployment) error {
logs := log.FromContext(ctx) logs := log.FromContext(ctx)
if IsDeploymentReady(deployment) { if IsDeploymentReady(deployment) {
logs.Info("Deployment is ready. Setting available status condition to true.") logs.Info("Deployment is ready. Setting available status condition to true.")
_, err := r.setStatusConditions(ctx, req, _, err := r.setStatusConditions(ctx, req,
metav1.Condition{ metav1.Condition{
Type: v1alpha1.DynamoDeploymentConditionTypeAvailable, Type: v1alpha1.DynamoGraphDeploymentConditionTypeAvailable,
Status: metav1.ConditionTrue, Status: metav1.ConditionTrue,
Reason: "DeploymentReady", Reason: "DeploymentReady",
Message: "Deployment is ready", Message: "Deployment is ready",
...@@ -434,7 +434,7 @@ func (r *DynamoNimDeploymentReconciler) computeAvailableStatusCondition(ctx cont ...@@ -434,7 +434,7 @@ func (r *DynamoNimDeploymentReconciler) computeAvailableStatusCondition(ctx cont
logs.Info("Deployment is not ready. Setting available status condition to false.") logs.Info("Deployment is not ready. Setting available status condition to false.")
_, err := r.setStatusConditions(ctx, req, _, err := r.setStatusConditions(ctx, req,
metav1.Condition{ metav1.Condition{
Type: v1alpha1.DynamoDeploymentConditionTypeAvailable, Type: v1alpha1.DynamoGraphDeploymentConditionTypeAvailable,
Status: metav1.ConditionFalse, Status: metav1.ConditionFalse,
Reason: "DeploymentNotReady", Reason: "DeploymentNotReady",
Message: "Deployment is not ready", Message: "Deployment is not ready",
...@@ -485,7 +485,7 @@ func IsDeploymentReady(deployment *appsv1.Deployment) bool { ...@@ -485,7 +485,7 @@ func IsDeploymentReady(deployment *appsv1.Deployment) bool {
return false return false
} }
func (r *DynamoNimDeploymentReconciler) reconcilePVC(ctx context.Context, crd *v1alpha1.DynamoNimDeployment) (*corev1.PersistentVolumeClaim, error) { func (r *DynamoComponentDeploymentReconciler) reconcilePVC(ctx context.Context, crd *v1alpha1.DynamoComponentDeployment) (*corev1.PersistentVolumeClaim, error) {
logger := log.FromContext(ctx) logger := log.FromContext(ctx)
if crd.Spec.PVC == nil { if crd.Spec.PVC == nil {
return nil, nil return nil, nil
...@@ -520,18 +520,18 @@ func (r *DynamoNimDeploymentReconciler) reconcilePVC(ctx context.Context, crd *v ...@@ -520,18 +520,18 @@ func (r *DynamoNimDeploymentReconciler) reconcilePVC(ctx context.Context, crd *v
return pvc, nil return pvc, nil
} }
func (r *DynamoNimDeploymentReconciler) setStatusConditions(ctx context.Context, req ctrl.Request, conditions ...metav1.Condition) (dynamoNimDeployment *v1alpha1.DynamoNimDeployment, err error) { func (r *DynamoComponentDeploymentReconciler) setStatusConditions(ctx context.Context, req ctrl.Request, conditions ...metav1.Condition) (dynamoComponentDeployment *v1alpha1.DynamoComponentDeployment, err error) {
dynamoNimDeployment = &v1alpha1.DynamoNimDeployment{} dynamoComponentDeployment = &v1alpha1.DynamoComponentDeployment{}
maxRetries := 3 maxRetries := 3
for range maxRetries - 1 { for range maxRetries - 1 {
if err = r.Get(ctx, req.NamespacedName, dynamoNimDeployment); err != nil { if err = r.Get(ctx, req.NamespacedName, dynamoComponentDeployment); err != nil {
err = errors.Wrap(err, "Failed to re-fetch DynamoNimDeployment") err = errors.Wrap(err, "Failed to re-fetch DynamoComponentDeployment")
return return
} }
for _, condition := range conditions { for _, condition := range conditions {
meta.SetStatusCondition(&dynamoNimDeployment.Status.Conditions, condition) meta.SetStatusCondition(&dynamoComponentDeployment.Status.Conditions, condition)
} }
if err = r.Status().Update(ctx, dynamoNimDeployment); err != nil { if err = r.Status().Update(ctx, dynamoComponentDeployment); err != nil {
if k8serrors.IsConflict(err) { if k8serrors.IsConflict(err) {
time.Sleep(100 * time.Millisecond) time.Sleep(100 * time.Millisecond)
continue continue
...@@ -542,23 +542,23 @@ func (r *DynamoNimDeploymentReconciler) setStatusConditions(ctx context.Context, ...@@ -542,23 +542,23 @@ func (r *DynamoNimDeploymentReconciler) setStatusConditions(ctx context.Context,
} }
} }
if err != nil { if err != nil {
err = errors.Wrap(err, "Failed to update DynamoNimDeployment status") err = errors.Wrap(err, "Failed to update DynamoComponentDeployment status")
return return
} }
if err = r.Get(ctx, req.NamespacedName, dynamoNimDeployment); err != nil { if err = r.Get(ctx, req.NamespacedName, dynamoComponentDeployment); err != nil {
err = errors.Wrap(err, "Failed to re-fetch DynamoNimDeployment") err = errors.Wrap(err, "Failed to re-fetch DynamoComponentDeployment")
return return
} }
return return
} }
//nolint:nakedret //nolint:nakedret
func (r *DynamoNimDeploymentReconciler) createOrUpdateOrDeleteDeployments(ctx context.Context, opt generateResourceOption) (modified bool, depl *appsv1.Deployment, err error) { func (r *DynamoComponentDeploymentReconciler) createOrUpdateOrDeleteDeployments(ctx context.Context, opt generateResourceOption) (modified bool, depl *appsv1.Deployment, err error) {
containsStealingTrafficDebugModeEnabled := checkIfContainsStealingTrafficDebugModeEnabled(opt.dynamoNimDeployment) containsStealingTrafficDebugModeEnabled := checkIfContainsStealingTrafficDebugModeEnabled(opt.dynamoComponentDeployment)
// create the main deployment // create the main deployment
modified, depl, err = createOrUpdateResource(ctx, r, generateResourceOption{ modified, depl, err = createOrUpdateResource(ctx, r, generateResourceOption{
dynamoNimDeployment: opt.dynamoNimDeployment, dynamoComponentDeployment: opt.dynamoComponentDeployment,
dynamoNim: opt.dynamoNim, dynamoComponent: opt.dynamoComponent,
isStealingTrafficDebugModeEnabled: false, isStealingTrafficDebugModeEnabled: false,
containsStealingTrafficDebugModeEnabled: containsStealingTrafficDebugModeEnabled, containsStealingTrafficDebugModeEnabled: containsStealingTrafficDebugModeEnabled,
}, r.generateDeployment) }, r.generateDeployment)
...@@ -568,8 +568,8 @@ func (r *DynamoNimDeploymentReconciler) createOrUpdateOrDeleteDeployments(ctx co ...@@ -568,8 +568,8 @@ func (r *DynamoNimDeploymentReconciler) createOrUpdateOrDeleteDeployments(ctx co
} }
// create the debug deployment // create the debug deployment
modified2, _, err := createOrUpdateResource(ctx, r, generateResourceOption{ modified2, _, err := createOrUpdateResource(ctx, r, generateResourceOption{
dynamoNimDeployment: opt.dynamoNimDeployment, dynamoComponentDeployment: opt.dynamoComponentDeployment,
dynamoNim: opt.dynamoNim, dynamoComponent: opt.dynamoComponent,
isStealingTrafficDebugModeEnabled: true, isStealingTrafficDebugModeEnabled: true,
containsStealingTrafficDebugModeEnabled: containsStealingTrafficDebugModeEnabled, containsStealingTrafficDebugModeEnabled: containsStealingTrafficDebugModeEnabled,
}, r.generateDeployment) }, r.generateDeployment)
...@@ -581,7 +581,7 @@ func (r *DynamoNimDeploymentReconciler) createOrUpdateOrDeleteDeployments(ctx co ...@@ -581,7 +581,7 @@ func (r *DynamoNimDeploymentReconciler) createOrUpdateOrDeleteDeployments(ctx co
} }
//nolint:nakedret //nolint:nakedret
func createOrUpdateResource[T client.Object](ctx context.Context, r *DynamoNimDeploymentReconciler, opt generateResourceOption, generateResource func(ctx context.Context, opt generateResourceOption) (T, bool, error)) (modified bool, res T, err error) { func createOrUpdateResource[T client.Object](ctx context.Context, r *DynamoComponentDeploymentReconciler, opt generateResourceOption, generateResource func(ctx context.Context, opt generateResourceOption) (T, bool, error)) (modified bool, res T, err error) {
logs := log.FromContext(ctx) logs := log.FromContext(ctx)
resource, toDelete, err := generateResource(ctx, opt) resource, toDelete, err := generateResource(ctx, opt)
...@@ -616,7 +616,7 @@ func createOrUpdateResource[T client.Object](ctx context.Context, r *DynamoNimDe ...@@ -616,7 +616,7 @@ func createOrUpdateResource[T client.Object](ctx context.Context, r *DynamoNimDe
err = r.Get(ctx, types.NamespacedName{Name: resourceName, Namespace: resourceNamespace}, oldResource) err = r.Get(ctx, types.NamespacedName{Name: resourceName, Namespace: resourceNamespace}, oldResource)
oldResourceIsNotFound := k8serrors.IsNotFound(err) oldResourceIsNotFound := k8serrors.IsNotFound(err)
if err != nil && !oldResourceIsNotFound { if err != nil && !oldResourceIsNotFound {
r.Recorder.Eventf(opt.dynamoNimDeployment, corev1.EventTypeWarning, fmt.Sprintf("Get%s", resourceType), "Failed to get %s %s: %s", resourceType, resourceNamespace, err) r.Recorder.Eventf(opt.dynamoComponentDeployment, corev1.EventTypeWarning, fmt.Sprintf("Get%s", resourceType), "Failed to get %s %s: %s", resourceType, resourceNamespace, err)
logs.Error(err, "Failed to get HPA.") logs.Error(err, "Failed to get HPA.")
return return
} }
...@@ -632,26 +632,26 @@ func createOrUpdateResource[T client.Object](ctx context.Context, r *DynamoNimDe ...@@ -632,26 +632,26 @@ func createOrUpdateResource[T client.Object](ctx context.Context, r *DynamoNimDe
err = errors.Wrapf(patch.DefaultAnnotator.SetLastAppliedAnnotation(resource), "set last applied annotation for resource %s", resourceName) err = errors.Wrapf(patch.DefaultAnnotator.SetLastAppliedAnnotation(resource), "set last applied annotation for resource %s", resourceName)
if err != nil { if err != nil {
logs.Error(err, "Failed to set last applied annotation.") logs.Error(err, "Failed to set last applied annotation.")
r.Recorder.Eventf(opt.dynamoNimDeployment, corev1.EventTypeWarning, "SetLastAppliedAnnotation", "Failed to set last applied annotation for %s %s: %s", resourceType, resourceNamespace, err) r.Recorder.Eventf(opt.dynamoComponentDeployment, corev1.EventTypeWarning, "SetLastAppliedAnnotation", "Failed to set last applied annotation for %s %s: %s", resourceType, resourceNamespace, err)
return return
} }
err = ctrl.SetControllerReference(opt.dynamoNimDeployment, resource, r.Scheme) err = ctrl.SetControllerReference(opt.dynamoComponentDeployment, resource, r.Scheme)
if err != nil { if err != nil {
logs.Error(err, "Failed to set controller reference.") logs.Error(err, "Failed to set controller reference.")
r.Recorder.Eventf(opt.dynamoNimDeployment, corev1.EventTypeWarning, "SetControllerReference", "Failed to set controller reference for %s %s: %s", resourceType, resourceNamespace, err) r.Recorder.Eventf(opt.dynamoComponentDeployment, corev1.EventTypeWarning, "SetControllerReference", "Failed to set controller reference for %s %s: %s", resourceType, resourceNamespace, err)
return return
} }
r.Recorder.Eventf(opt.dynamoNimDeployment, corev1.EventTypeNormal, fmt.Sprintf("Create%s", resourceType), "Creating a new %s %s", resourceType, resourceNamespace) r.Recorder.Eventf(opt.dynamoComponentDeployment, corev1.EventTypeNormal, fmt.Sprintf("Create%s", resourceType), "Creating a new %s %s", resourceType, resourceNamespace)
err = r.Create(ctx, resource) err = r.Create(ctx, resource)
if err != nil { if err != nil {
logs.Error(err, "Failed to create Resource.") logs.Error(err, "Failed to create Resource.")
r.Recorder.Eventf(opt.dynamoNimDeployment, corev1.EventTypeWarning, fmt.Sprintf("Create%s", resourceType), "Failed to create %s %s: %s", resourceType, resourceNamespace, err) r.Recorder.Eventf(opt.dynamoComponentDeployment, corev1.EventTypeWarning, fmt.Sprintf("Create%s", resourceType), "Failed to create %s %s: %s", resourceType, resourceNamespace, err)
return return
} }
logs.Info(fmt.Sprintf("%s created.", resourceType)) logs.Info(fmt.Sprintf("%s created.", resourceType))
r.Recorder.Eventf(opt.dynamoNimDeployment, corev1.EventTypeNormal, fmt.Sprintf("Create%s", resourceType), "Created %s %s", resourceType, resourceNamespace) r.Recorder.Eventf(opt.dynamoComponentDeployment, corev1.EventTypeNormal, fmt.Sprintf("Create%s", resourceType), "Created %s %s", resourceType, resourceNamespace)
modified = true modified = true
res = resource res = resource
} else { } else {
...@@ -661,11 +661,11 @@ func createOrUpdateResource[T client.Object](ctx context.Context, r *DynamoNimDe ...@@ -661,11 +661,11 @@ func createOrUpdateResource[T client.Object](ctx context.Context, r *DynamoNimDe
err = r.Delete(ctx, oldResource) err = r.Delete(ctx, oldResource)
if err != nil { if err != nil {
logs.Error(err, fmt.Sprintf("Failed to delete %s.", resourceType)) logs.Error(err, fmt.Sprintf("Failed to delete %s.", resourceType))
r.Recorder.Eventf(opt.dynamoNimDeployment, corev1.EventTypeWarning, fmt.Sprintf("Delete%s", resourceType), "Failed to delete %s %s: %s", resourceType, resourceNamespace, err) r.Recorder.Eventf(opt.dynamoComponentDeployment, corev1.EventTypeWarning, fmt.Sprintf("Delete%s", resourceType), "Failed to delete %s %s: %s", resourceType, resourceNamespace, err)
return return
} }
logs.Info(fmt.Sprintf("%s deleted.", resourceType)) logs.Info(fmt.Sprintf("%s deleted.", resourceType))
r.Recorder.Eventf(opt.dynamoNimDeployment, corev1.EventTypeNormal, fmt.Sprintf("Delete%s", resourceType), "Deleted %s %s", resourceType, resourceNamespace) r.Recorder.Eventf(opt.dynamoComponentDeployment, corev1.EventTypeNormal, fmt.Sprintf("Delete%s", resourceType), "Deleted %s %s", resourceType, resourceNamespace)
modified = true modified = true
return return
} }
...@@ -674,7 +674,7 @@ func createOrUpdateResource[T client.Object](ctx context.Context, r *DynamoNimDe ...@@ -674,7 +674,7 @@ func createOrUpdateResource[T client.Object](ctx context.Context, r *DynamoNimDe
patchResult, err = patch.DefaultPatchMaker.Calculate(oldResource, resource) patchResult, err = patch.DefaultPatchMaker.Calculate(oldResource, resource)
if err != nil { if err != nil {
logs.Error(err, "Failed to calculate patch.") logs.Error(err, "Failed to calculate patch.")
r.Recorder.Eventf(opt.dynamoNimDeployment, corev1.EventTypeWarning, fmt.Sprintf("CalculatePatch%s", resourceType), "Failed to calculate patch for %s %s: %s", resourceType, resourceNamespace, err) r.Recorder.Eventf(opt.dynamoComponentDeployment, corev1.EventTypeWarning, fmt.Sprintf("CalculatePatch%s", resourceType), "Failed to calculate patch for %s %s: %s", resourceType, resourceNamespace, err)
return return
} }
...@@ -684,33 +684,33 @@ func createOrUpdateResource[T client.Object](ctx context.Context, r *DynamoNimDe ...@@ -684,33 +684,33 @@ func createOrUpdateResource[T client.Object](ctx context.Context, r *DynamoNimDe
err = errors.Wrapf(patch.DefaultAnnotator.SetLastAppliedAnnotation(resource), "set last applied annotation for resource %s", resourceName) err = errors.Wrapf(patch.DefaultAnnotator.SetLastAppliedAnnotation(resource), "set last applied annotation for resource %s", resourceName)
if err != nil { if err != nil {
logs.Error(err, "Failed to set last applied annotation.") logs.Error(err, "Failed to set last applied annotation.")
r.Recorder.Eventf(opt.dynamoNimDeployment, corev1.EventTypeWarning, fmt.Sprintf("SetLastAppliedAnnotation%s", resourceType), "Failed to set last applied annotation for %s %s: %s", resourceType, resourceNamespace, err) r.Recorder.Eventf(opt.dynamoComponentDeployment, corev1.EventTypeWarning, fmt.Sprintf("SetLastAppliedAnnotation%s", resourceType), "Failed to set last applied annotation for %s %s: %s", resourceType, resourceNamespace, err)
return return
} }
r.Recorder.Eventf(opt.dynamoNimDeployment, corev1.EventTypeNormal, fmt.Sprintf("Update%s", resourceType), "Updating %s %s", resourceType, resourceNamespace) r.Recorder.Eventf(opt.dynamoComponentDeployment, corev1.EventTypeNormal, fmt.Sprintf("Update%s", resourceType), "Updating %s %s", resourceType, resourceNamespace)
resource.SetResourceVersion(oldResource.GetResourceVersion()) resource.SetResourceVersion(oldResource.GetResourceVersion())
err = r.Update(ctx, resource) err = r.Update(ctx, resource)
if err != nil { if err != nil {
logs.Error(err, fmt.Sprintf("Failed to update %s.", resourceType)) logs.Error(err, fmt.Sprintf("Failed to update %s.", resourceType))
r.Recorder.Eventf(opt.dynamoNimDeployment, corev1.EventTypeWarning, fmt.Sprintf("Update%s", resourceType), "Failed to update %s %s: %s", resourceType, resourceNamespace, err) r.Recorder.Eventf(opt.dynamoComponentDeployment, corev1.EventTypeWarning, fmt.Sprintf("Update%s", resourceType), "Failed to update %s %s: %s", resourceType, resourceNamespace, err)
return return
} }
logs.Info(fmt.Sprintf("%s updated.", resourceType)) logs.Info(fmt.Sprintf("%s updated.", resourceType))
r.Recorder.Eventf(opt.dynamoNimDeployment, corev1.EventTypeNormal, fmt.Sprintf("Update%s", resourceType), "Updated %s %s", resourceType, resourceNamespace) r.Recorder.Eventf(opt.dynamoComponentDeployment, corev1.EventTypeNormal, fmt.Sprintf("Update%s", resourceType), "Updated %s %s", resourceType, resourceNamespace)
modified = true modified = true
res = resource res = resource
} else { } else {
logs.Info(fmt.Sprintf("%s spec is the same. Skipping update.", resourceType)) logs.Info(fmt.Sprintf("%s spec is the same. Skipping update.", resourceType))
r.Recorder.Eventf(opt.dynamoNimDeployment, corev1.EventTypeNormal, fmt.Sprintf("Update%s", resourceType), "Skipping update %s %s", resourceType, resourceNamespace) r.Recorder.Eventf(opt.dynamoComponentDeployment, corev1.EventTypeNormal, fmt.Sprintf("Update%s", resourceType), "Skipping update %s %s", resourceType, resourceNamespace)
res = oldResource res = oldResource
} }
} }
return return
} }
func getResourceAnnotations(dynamoNimDeployment *v1alpha1.DynamoNimDeployment) map[string]string { func getResourceAnnotations(dynamoComponentDeployment *v1alpha1.DynamoComponentDeployment) map[string]string {
resourceAnnotations := dynamoNimDeployment.Spec.Annotations resourceAnnotations := dynamoComponentDeployment.Spec.Annotations
if resourceAnnotations == nil { if resourceAnnotations == nil {
resourceAnnotations = map[string]string{} resourceAnnotations = map[string]string{}
} }
...@@ -742,19 +742,19 @@ func checkIfIsDebugPodReceiveProductionTrafficEnabled(annotations map[string]str ...@@ -742,19 +742,19 @@ func checkIfIsDebugPodReceiveProductionTrafficEnabled(annotations map[string]str
return annotations[KubeAnnotationEnableDebugPodReceiveProductionTraffic] == commonconsts.KubeLabelValueTrue return annotations[KubeAnnotationEnableDebugPodReceiveProductionTraffic] == commonconsts.KubeLabelValueTrue
} }
func checkIfContainsStealingTrafficDebugModeEnabled(dynamoNimDeployment *v1alpha1.DynamoNimDeployment) bool { func checkIfContainsStealingTrafficDebugModeEnabled(dynamoComponentDeployment *v1alpha1.DynamoComponentDeployment) bool {
return checkIfIsStealingTrafficDebugModeEnabled(dynamoNimDeployment.Spec.Annotations) return checkIfIsStealingTrafficDebugModeEnabled(dynamoComponentDeployment.Spec.Annotations)
} }
//nolint:nakedret //nolint:nakedret
func (r *DynamoNimDeploymentReconciler) createOrUpdateOrDeleteServices(ctx context.Context, opt generateResourceOption) (modified bool, err error) { func (r *DynamoComponentDeploymentReconciler) createOrUpdateOrDeleteServices(ctx context.Context, opt generateResourceOption) (modified bool, err error) {
resourceAnnotations := getResourceAnnotations(opt.dynamoNimDeployment) resourceAnnotations := getResourceAnnotations(opt.dynamoComponentDeployment)
isDebugPodReceiveProductionTrafficEnabled := checkIfIsDebugPodReceiveProductionTrafficEnabled(resourceAnnotations) isDebugPodReceiveProductionTrafficEnabled := checkIfIsDebugPodReceiveProductionTrafficEnabled(resourceAnnotations)
containsStealingTrafficDebugModeEnabled := checkIfContainsStealingTrafficDebugModeEnabled(opt.dynamoNimDeployment) containsStealingTrafficDebugModeEnabled := checkIfContainsStealingTrafficDebugModeEnabled(opt.dynamoComponentDeployment)
// main generic service // main generic service
modified, _, err = createOrUpdateResource(ctx, r, generateResourceOption{ modified, _, err = createOrUpdateResource(ctx, r, generateResourceOption{
dynamoNimDeployment: opt.dynamoNimDeployment, dynamoComponentDeployment: opt.dynamoComponentDeployment,
dynamoNim: opt.dynamoNim, dynamoComponent: opt.dynamoComponent,
isStealingTrafficDebugModeEnabled: false, isStealingTrafficDebugModeEnabled: false,
isDebugPodReceiveProductionTraffic: isDebugPodReceiveProductionTrafficEnabled, isDebugPodReceiveProductionTraffic: isDebugPodReceiveProductionTrafficEnabled,
containsStealingTrafficDebugModeEnabled: containsStealingTrafficDebugModeEnabled, containsStealingTrafficDebugModeEnabled: containsStealingTrafficDebugModeEnabled,
...@@ -766,8 +766,8 @@ func (r *DynamoNimDeploymentReconciler) createOrUpdateOrDeleteServices(ctx conte ...@@ -766,8 +766,8 @@ func (r *DynamoNimDeploymentReconciler) createOrUpdateOrDeleteServices(ctx conte
// debug production service (if enabled) // debug production service (if enabled)
modified_, _, err := createOrUpdateResource(ctx, r, generateResourceOption{ modified_, _, err := createOrUpdateResource(ctx, r, generateResourceOption{
dynamoNimDeployment: opt.dynamoNimDeployment, dynamoComponentDeployment: opt.dynamoComponentDeployment,
dynamoNim: opt.dynamoNim, dynamoComponent: opt.dynamoComponent,
isStealingTrafficDebugModeEnabled: false, isStealingTrafficDebugModeEnabled: false,
isDebugPodReceiveProductionTraffic: isDebugPodReceiveProductionTrafficEnabled, isDebugPodReceiveProductionTraffic: isDebugPodReceiveProductionTrafficEnabled,
containsStealingTrafficDebugModeEnabled: containsStealingTrafficDebugModeEnabled, containsStealingTrafficDebugModeEnabled: containsStealingTrafficDebugModeEnabled,
...@@ -779,8 +779,8 @@ func (r *DynamoNimDeploymentReconciler) createOrUpdateOrDeleteServices(ctx conte ...@@ -779,8 +779,8 @@ func (r *DynamoNimDeploymentReconciler) createOrUpdateOrDeleteServices(ctx conte
modified = modified || modified_ modified = modified || modified_
// debug service (if enabled) // debug service (if enabled)
modified_, _, err = createOrUpdateResource(ctx, r, generateResourceOption{ modified_, _, err = createOrUpdateResource(ctx, r, generateResourceOption{
dynamoNimDeployment: opt.dynamoNimDeployment, dynamoComponentDeployment: opt.dynamoComponentDeployment,
dynamoNim: opt.dynamoNim, dynamoComponent: opt.dynamoComponent,
isStealingTrafficDebugModeEnabled: true, isStealingTrafficDebugModeEnabled: true,
isDebugPodReceiveProductionTraffic: isDebugPodReceiveProductionTrafficEnabled, isDebugPodReceiveProductionTraffic: isDebugPodReceiveProductionTrafficEnabled,
containsStealingTrafficDebugModeEnabled: containsStealingTrafficDebugModeEnabled, containsStealingTrafficDebugModeEnabled: containsStealingTrafficDebugModeEnabled,
...@@ -793,7 +793,7 @@ func (r *DynamoNimDeploymentReconciler) createOrUpdateOrDeleteServices(ctx conte ...@@ -793,7 +793,7 @@ func (r *DynamoNimDeploymentReconciler) createOrUpdateOrDeleteServices(ctx conte
return return
} }
func (r *DynamoNimDeploymentReconciler) createOrUpdateOrDeleteIngress(ctx context.Context, opt generateResourceOption) (modified bool, err error) { func (r *DynamoComponentDeploymentReconciler) createOrUpdateOrDeleteIngress(ctx context.Context, opt generateResourceOption) (modified bool, err error) {
modified, _, err = createOrUpdateResource(ctx, r, opt, r.generateIngress) modified, _, err = createOrUpdateResource(ctx, r, opt, r.generateIngress)
if err != nil { if err != nil {
return return
...@@ -806,25 +806,25 @@ func (r *DynamoNimDeploymentReconciler) createOrUpdateOrDeleteIngress(ctx contex ...@@ -806,25 +806,25 @@ func (r *DynamoNimDeploymentReconciler) createOrUpdateOrDeleteIngress(ctx contex
return return
} }
func (r *DynamoNimDeploymentReconciler) generateIngress(ctx context.Context, opt generateResourceOption) (*networkingv1.Ingress, bool, error) { func (r *DynamoComponentDeploymentReconciler) generateIngress(ctx context.Context, opt generateResourceOption) (*networkingv1.Ingress, bool, error) {
log := log.FromContext(ctx) log := log.FromContext(ctx)
log.Info("Starting generateIngress") log.Info("Starting generateIngress")
ingress := &networkingv1.Ingress{ ingress := &networkingv1.Ingress{
ObjectMeta: metav1.ObjectMeta{ ObjectMeta: metav1.ObjectMeta{
Name: opt.dynamoNimDeployment.Name, Name: opt.dynamoComponentDeployment.Name,
Namespace: opt.dynamoNimDeployment.Namespace, Namespace: opt.dynamoComponentDeployment.Namespace,
}, },
} }
if !opt.dynamoNimDeployment.Spec.Ingress.Enabled || opt.dynamoNimDeployment.Spec.Ingress.IngressControllerClassName == nil { if !opt.dynamoComponentDeployment.Spec.Ingress.Enabled || opt.dynamoComponentDeployment.Spec.Ingress.IngressControllerClassName == nil {
log.Info("Ingress is not enabled") log.Info("Ingress is not enabled")
return ingress, true, nil return ingress, true, nil
} }
host := getIngressHost(opt.dynamoNimDeployment.Spec.Ingress) host := getIngressHost(opt.dynamoComponentDeployment.Spec.Ingress)
ingress.Spec = networkingv1.IngressSpec{ ingress.Spec = networkingv1.IngressSpec{
IngressClassName: opt.dynamoNimDeployment.Spec.Ingress.IngressControllerClassName, IngressClassName: opt.dynamoComponentDeployment.Spec.Ingress.IngressControllerClassName,
Rules: []networkingv1.IngressRule{ Rules: []networkingv1.IngressRule{
{ {
Host: host, Host: host,
...@@ -836,7 +836,7 @@ func (r *DynamoNimDeploymentReconciler) generateIngress(ctx context.Context, opt ...@@ -836,7 +836,7 @@ func (r *DynamoNimDeploymentReconciler) generateIngress(ctx context.Context, opt
PathType: &[]networkingv1.PathType{networkingv1.PathTypePrefix}[0], PathType: &[]networkingv1.PathType{networkingv1.PathTypePrefix}[0],
Backend: networkingv1.IngressBackend{ Backend: networkingv1.IngressBackend{
Service: &networkingv1.IngressServiceBackend{ Service: &networkingv1.IngressServiceBackend{
Name: opt.dynamoNimDeployment.Name, Name: opt.dynamoComponentDeployment.Name,
Port: networkingv1.ServiceBackendPort{ Port: networkingv1.ServiceBackendPort{
Number: 3000, Number: 3000,
}, },
...@@ -850,11 +850,11 @@ func (r *DynamoNimDeploymentReconciler) generateIngress(ctx context.Context, opt ...@@ -850,11 +850,11 @@ func (r *DynamoNimDeploymentReconciler) generateIngress(ctx context.Context, opt
}, },
} }
if opt.dynamoNimDeployment.Spec.Ingress.TLS != nil { if opt.dynamoComponentDeployment.Spec.Ingress.TLS != nil {
ingress.Spec.TLS = []networkingv1.IngressTLS{ ingress.Spec.TLS = []networkingv1.IngressTLS{
{ {
Hosts: []string{host}, Hosts: []string{host},
SecretName: opt.dynamoNimDeployment.Spec.Ingress.TLS.SecretName, SecretName: opt.dynamoComponentDeployment.Spec.Ingress.TLS.SecretName,
}, },
} }
} }
...@@ -862,18 +862,18 @@ func (r *DynamoNimDeploymentReconciler) generateIngress(ctx context.Context, opt ...@@ -862,18 +862,18 @@ func (r *DynamoNimDeploymentReconciler) generateIngress(ctx context.Context, opt
return ingress, false, nil return ingress, false, nil
} }
func (r *DynamoNimDeploymentReconciler) generateVirtualService(ctx context.Context, opt generateResourceOption) (*networkingv1beta1.VirtualService, bool, error) { func (r *DynamoComponentDeploymentReconciler) generateVirtualService(ctx context.Context, opt generateResourceOption) (*networkingv1beta1.VirtualService, bool, error) {
log := log.FromContext(ctx) log := log.FromContext(ctx)
log.Info("Starting generateVirtualService") log.Info("Starting generateVirtualService")
vs := &networkingv1beta1.VirtualService{ vs := &networkingv1beta1.VirtualService{
ObjectMeta: metav1.ObjectMeta{ ObjectMeta: metav1.ObjectMeta{
Name: opt.dynamoNimDeployment.Name, Name: opt.dynamoComponentDeployment.Name,
Namespace: opt.dynamoNimDeployment.Namespace, Namespace: opt.dynamoComponentDeployment.Namespace,
}, },
} }
vsEnabled := opt.dynamoNimDeployment.Spec.Ingress.Enabled && opt.dynamoNimDeployment.Spec.Ingress.UseVirtualService && opt.dynamoNimDeployment.Spec.Ingress.VirtualServiceGateway != nil vsEnabled := opt.dynamoComponentDeployment.Spec.Ingress.Enabled && opt.dynamoComponentDeployment.Spec.Ingress.UseVirtualService && opt.dynamoComponentDeployment.Spec.Ingress.VirtualServiceGateway != nil
if !vsEnabled { if !vsEnabled {
log.Info("VirtualService is not enabled") log.Info("VirtualService is not enabled")
return vs, true, nil return vs, true, nil
...@@ -881,9 +881,9 @@ func (r *DynamoNimDeploymentReconciler) generateVirtualService(ctx context.Conte ...@@ -881,9 +881,9 @@ func (r *DynamoNimDeploymentReconciler) generateVirtualService(ctx context.Conte
vs.Spec = istioNetworking.VirtualService{ vs.Spec = istioNetworking.VirtualService{
Hosts: []string{ Hosts: []string{
getIngressHost(opt.dynamoNimDeployment.Spec.Ingress), getIngressHost(opt.dynamoComponentDeployment.Spec.Ingress),
}, },
Gateways: []string{*opt.dynamoNimDeployment.Spec.Ingress.VirtualServiceGateway}, Gateways: []string{*opt.dynamoComponentDeployment.Spec.Ingress.VirtualServiceGateway},
Http: []*istioNetworking.HTTPRoute{ Http: []*istioNetworking.HTTPRoute{
{ {
Match: []*istioNetworking.HTTPMatchRequest{ Match: []*istioNetworking.HTTPMatchRequest{
...@@ -896,7 +896,7 @@ func (r *DynamoNimDeploymentReconciler) generateVirtualService(ctx context.Conte ...@@ -896,7 +896,7 @@ func (r *DynamoNimDeploymentReconciler) generateVirtualService(ctx context.Conte
Route: []*istioNetworking.HTTPRouteDestination{ Route: []*istioNetworking.HTTPRouteDestination{
{ {
Destination: &istioNetworking.Destination{ Destination: &istioNetworking.Destination{
Host: opt.dynamoNimDeployment.Name, Host: opt.dynamoComponentDeployment.Name,
Port: &istioNetworking.PortSelector{ Port: &istioNetworking.PortSelector{
Number: 3000, Number: 3000,
}, },
...@@ -909,49 +909,44 @@ func (r *DynamoNimDeploymentReconciler) generateVirtualService(ctx context.Conte ...@@ -909,49 +909,44 @@ func (r *DynamoNimDeploymentReconciler) generateVirtualService(ctx context.Conte
return vs, false, nil return vs, false, nil
} }
func (r *DynamoNimDeploymentReconciler) getKubeName(dynamoNimDeployment *v1alpha1.DynamoNimDeployment, _ *v1alpha1.DynamoNim, debug bool) string { func (r *DynamoComponentDeploymentReconciler) getKubeName(dynamoComponentDeployment *v1alpha1.DynamoComponentDeployment, _ *v1alpha1.DynamoComponent, debug bool) string {
if debug { if debug {
return fmt.Sprintf("%s-d", dynamoNimDeployment.Name) return fmt.Sprintf("%s-d", dynamoComponentDeployment.Name)
} }
return dynamoNimDeployment.Name return dynamoComponentDeployment.Name
} }
func (r *DynamoNimDeploymentReconciler) getServiceName(dynamoNimDeployment *v1alpha1.DynamoNimDeployment, _ *v1alpha1.DynamoNim, debug bool) string { func (r *DynamoComponentDeploymentReconciler) getServiceName(dynamoComponentDeployment *v1alpha1.DynamoComponentDeployment, _ *v1alpha1.DynamoComponent, debug bool) string {
var kubeName string var kubeName string
if debug { if debug {
kubeName = fmt.Sprintf("%s-d", dynamoNimDeployment.Name) kubeName = fmt.Sprintf("%s-d", dynamoComponentDeployment.Name)
} else { } else {
kubeName = fmt.Sprintf("%s-p", dynamoNimDeployment.Name) kubeName = fmt.Sprintf("%s-p", dynamoComponentDeployment.Name)
} }
return kubeName return kubeName
} }
func (r *DynamoNimDeploymentReconciler) getGenericServiceName(dynamoNimDeployment *v1alpha1.DynamoNimDeployment, dynamoNim *v1alpha1.DynamoNim) string { func (r *DynamoComponentDeploymentReconciler) getGenericServiceName(dynamoComponentDeployment *v1alpha1.DynamoComponentDeployment, dynamoComponent *v1alpha1.DynamoComponent) string {
return r.getKubeName(dynamoNimDeployment, dynamoNim, false) return r.getKubeName(dynamoComponentDeployment, dynamoComponent, false)
} }
func (r *DynamoNimDeploymentReconciler) getKubeLabels(dynamoNimDeployment *v1alpha1.DynamoNimDeployment, dynamoNim *v1alpha1.DynamoNim) map[string]string { func (r *DynamoComponentDeploymentReconciler) getKubeLabels(_ *v1alpha1.DynamoComponentDeployment, dynamoComponent *v1alpha1.DynamoComponent) map[string]string {
dynamoNimRepositoryName, _, dynamoNimVersion := xstrings.Partition(dynamoNim.Spec.Tag, ":")
labels := map[string]string{ labels := map[string]string{
commonconsts.KubeLabelDynamoDeployment: dynamoNimDeployment.Name, commonconsts.KubeLabelDynamoComponent: dynamoComponent.Name,
commonconsts.KubeLabelDynamoRepository: dynamoNimRepositoryName,
commonconsts.KubeLabelDynamoVersion: dynamoNimVersion,
commonconsts.KubeLabelDynamoDeploymentTargetType: DeploymentTargetTypeProduction,
commonconsts.KubeLabelDynamoCreator: "dynamo-deployment",
} }
labels[commonconsts.KubeLabelDynamoDeploymentComponentType] = commonconsts.DynamoDeploymentComponentApiServer labels[commonconsts.KubeLabelDynamoComponentType] = commonconsts.DynamoApiServerComponentName
return labels return labels
} }
func (r *DynamoNimDeploymentReconciler) getKubeAnnotations(dynamoNimDeployment *v1alpha1.DynamoNimDeployment, dynamoNim *v1alpha1.DynamoNim) map[string]string { func (r *DynamoComponentDeploymentReconciler) getKubeAnnotations(dynamoComponentDeployment *v1alpha1.DynamoComponentDeployment, dynamoComponent *v1alpha1.DynamoComponent) map[string]string {
dynamoNimRepositoryName, dynamoNimVersion := getDynamoNimRepositoryNameAndDynamoNimVersion(dynamoNim) dynamoComponentRepositoryName, dynamoComponentVersion := getDynamoComponentRepositoryNameAndDynamoComponentVersion(dynamoComponent)
annotations := map[string]string{ annotations := map[string]string{
commonconsts.KubeAnnotationDynamoRepository: dynamoNimRepositoryName, commonconsts.KubeAnnotationDynamoRepository: dynamoComponentRepositoryName,
commonconsts.KubeAnnotationDynamoVersion: dynamoNimVersion, commonconsts.KubeAnnotationDynamoVersion: dynamoComponentVersion,
} }
var extraAnnotations map[string]string var extraAnnotations map[string]string
if dynamoNimDeployment.Spec.ExtraPodMetadata != nil { if dynamoComponentDeployment.Spec.ExtraPodMetadata != nil {
extraAnnotations = dynamoNimDeployment.Spec.ExtraPodMetadata.Annotations extraAnnotations = dynamoComponentDeployment.Spec.ExtraPodMetadata.Annotations
} else { } else {
extraAnnotations = map[string]string{} extraAnnotations = map[string]string{}
} }
...@@ -962,14 +957,14 @@ func (r *DynamoNimDeploymentReconciler) getKubeAnnotations(dynamoNimDeployment * ...@@ -962,14 +957,14 @@ func (r *DynamoNimDeploymentReconciler) getKubeAnnotations(dynamoNimDeployment *
} }
//nolint:nakedret //nolint:nakedret
func (r *DynamoNimDeploymentReconciler) generateDeployment(ctx context.Context, opt generateResourceOption) (kubeDeployment *appsv1.Deployment, toDelete bool, err error) { func (r *DynamoComponentDeploymentReconciler) generateDeployment(ctx context.Context, opt generateResourceOption) (kubeDeployment *appsv1.Deployment, toDelete bool, err error) {
kubeNs := opt.dynamoNimDeployment.Namespace kubeNs := opt.dynamoComponentDeployment.Namespace
labels := r.getKubeLabels(opt.dynamoNimDeployment, opt.dynamoNim) labels := r.getKubeLabels(opt.dynamoComponentDeployment, opt.dynamoComponent)
annotations := r.getKubeAnnotations(opt.dynamoNimDeployment, opt.dynamoNim) annotations := r.getKubeAnnotations(opt.dynamoComponentDeployment, opt.dynamoComponent)
kubeName := r.getKubeName(opt.dynamoNimDeployment, opt.dynamoNim, opt.isStealingTrafficDebugModeEnabled) kubeName := r.getKubeName(opt.dynamoComponentDeployment, opt.dynamoComponent, opt.isStealingTrafficDebugModeEnabled)
kubeDeployment = &appsv1.Deployment{ kubeDeployment = &appsv1.Deployment{
ObjectMeta: metav1.ObjectMeta{ ObjectMeta: metav1.ObjectMeta{
...@@ -1002,7 +997,7 @@ func (r *DynamoNimDeploymentReconciler) generateDeployment(ctx context.Context, ...@@ -1002,7 +997,7 @@ func (r *DynamoNimDeploymentReconciler) generateDeployment(ctx context.Context,
}, },
} }
resourceAnnotations := getResourceAnnotations(opt.dynamoNimDeployment) resourceAnnotations := getResourceAnnotations(opt.dynamoComponentDeployment)
strategyStr := resourceAnnotations[KubeAnnotationDeploymentStrategy] strategyStr := resourceAnnotations[KubeAnnotationDeploymentStrategy]
if strategyStr != "" { if strategyStr != "" {
strategyType := schemas.DeploymentStrategy(strategyStr) strategyType := schemas.DeploymentStrategy(strategyStr)
...@@ -1039,7 +1034,7 @@ func (r *DynamoNimDeploymentReconciler) generateDeployment(ctx context.Context, ...@@ -1039,7 +1034,7 @@ func (r *DynamoNimDeploymentReconciler) generateDeployment(ctx context.Context,
} }
var replicas *int32 var replicas *int32
replicas = opt.dynamoNimDeployment.Spec.Replicas replicas = opt.dynamoComponentDeployment.Spec.Replicas
if opt.isStealingTrafficDebugModeEnabled { if opt.isStealingTrafficDebugModeEnabled {
replicas = &[]int32{int32(1)}[0] replicas = &[]int32{int32(1)}[0]
} }
...@@ -1059,24 +1054,24 @@ func (r *DynamoNimDeploymentReconciler) generateDeployment(ctx context.Context, ...@@ -1059,24 +1054,24 @@ func (r *DynamoNimDeploymentReconciler) generateDeployment(ctx context.Context,
} }
type generateResourceOption struct { type generateResourceOption struct {
dynamoNimDeployment *v1alpha1.DynamoNimDeployment dynamoComponentDeployment *v1alpha1.DynamoComponentDeployment
dynamoNim *v1alpha1.DynamoNim dynamoComponent *v1alpha1.DynamoComponent
isStealingTrafficDebugModeEnabled bool isStealingTrafficDebugModeEnabled bool
containsStealingTrafficDebugModeEnabled bool containsStealingTrafficDebugModeEnabled bool
isDebugPodReceiveProductionTraffic bool isDebugPodReceiveProductionTraffic bool
isGenericService bool isGenericService bool
} }
func (r *DynamoNimDeploymentReconciler) generateHPA(ctx context.Context, opt generateResourceOption) (*autoscalingv2.HorizontalPodAutoscaler, bool, error) { func (r *DynamoComponentDeploymentReconciler) generateHPA(ctx context.Context, opt generateResourceOption) (*autoscalingv2.HorizontalPodAutoscaler, bool, error) {
labels := r.getKubeLabels(opt.dynamoNimDeployment, opt.dynamoNim) labels := r.getKubeLabels(opt.dynamoComponentDeployment, opt.dynamoComponent)
annotations := r.getKubeAnnotations(opt.dynamoNimDeployment, opt.dynamoNim) annotations := r.getKubeAnnotations(opt.dynamoComponentDeployment, opt.dynamoComponent)
kubeName := r.getKubeName(opt.dynamoNimDeployment, opt.dynamoNim, false) kubeName := r.getKubeName(opt.dynamoComponentDeployment, opt.dynamoComponent, false)
kubeNs := opt.dynamoNimDeployment.Namespace kubeNs := opt.dynamoComponentDeployment.Namespace
hpaConf := opt.dynamoNimDeployment.Spec.Autoscaling hpaConf := opt.dynamoComponentDeployment.Spec.Autoscaling
kubeHpa := &autoscalingv2.HorizontalPodAutoscaler{ kubeHpa := &autoscalingv2.HorizontalPodAutoscaler{
ObjectMeta: metav1.ObjectMeta{ ObjectMeta: metav1.ObjectMeta{
...@@ -1124,23 +1119,23 @@ func (r *DynamoNimDeploymentReconciler) generateHPA(ctx context.Context, opt gen ...@@ -1124,23 +1119,23 @@ func (r *DynamoNimDeploymentReconciler) generateHPA(ctx context.Context, opt gen
return kubeHpa, false, nil return kubeHpa, false, nil
} }
func getDynamoNimRepositoryNameAndDynamoNimVersion(dynamoNim *v1alpha1.DynamoNim) (repositoryName string, version string) { func getDynamoComponentRepositoryNameAndDynamoComponentVersion(dynamoComponent *v1alpha1.DynamoComponent) (repositoryName string, version string) {
repositoryName, _, version = xstrings.Partition(dynamoNim.Spec.Tag, ":") repositoryName, _, version = xstrings.Partition(dynamoComponent.Spec.DynamoComponent, ":")
return return
} }
//nolint:gocyclo,nakedret //nolint:gocyclo,nakedret
func (r *DynamoNimDeploymentReconciler) generatePodTemplateSpec(ctx context.Context, opt generateResourceOption) (podTemplateSpec *corev1.PodTemplateSpec, err error) { func (r *DynamoComponentDeploymentReconciler) generatePodTemplateSpec(ctx context.Context, opt generateResourceOption) (podTemplateSpec *corev1.PodTemplateSpec, err error) {
dynamoNimRepositoryName, _ := getDynamoNimRepositoryNameAndDynamoNimVersion(opt.dynamoNim) dynamoComponentRepositoryName, _ := getDynamoComponentRepositoryNameAndDynamoComponentVersion(opt.dynamoComponent)
podLabels := r.getKubeLabels(opt.dynamoNimDeployment, opt.dynamoNim) podLabels := r.getKubeLabels(opt.dynamoComponentDeployment, opt.dynamoComponent)
if opt.isStealingTrafficDebugModeEnabled { if opt.isStealingTrafficDebugModeEnabled {
podLabels[commonconsts.KubeLabelDynamoDeploymentTargetType] = DeploymentTargetTypeDebug podLabels[commonconsts.KubeLabelDynamoDeploymentTargetType] = DeploymentTargetTypeDebug
} }
podAnnotations := r.getKubeAnnotations(opt.dynamoNimDeployment, opt.dynamoNim) podAnnotations := r.getKubeAnnotations(opt.dynamoComponentDeployment, opt.dynamoComponent)
kubeName := r.getKubeName(opt.dynamoNimDeployment, opt.dynamoNim, opt.isStealingTrafficDebugModeEnabled) kubeName := r.getKubeName(opt.dynamoComponentDeployment, opt.dynamoComponent, opt.isStealingTrafficDebugModeEnabled)
containerPort := commonconsts.DynamoServicePort containerPort := commonconsts.DynamoServicePort
lastPort := containerPort + 1 lastPort := containerPort + 1
...@@ -1150,8 +1145,8 @@ func (r *DynamoNimDeploymentReconciler) generatePodTemplateSpec(ctx context.Cont ...@@ -1150,8 +1145,8 @@ func (r *DynamoNimDeploymentReconciler) generatePodTemplateSpec(ctx context.Cont
var envs []corev1.EnvVar var envs []corev1.EnvVar
envsSeen := make(map[string]struct{}) envsSeen := make(map[string]struct{})
resourceAnnotations := opt.dynamoNimDeployment.Spec.Annotations resourceAnnotations := opt.dynamoComponentDeployment.Spec.Annotations
specEnvs := opt.dynamoNimDeployment.Spec.Envs specEnvs := opt.dynamoComponentDeployment.Spec.Envs
if resourceAnnotations == nil { if resourceAnnotations == nil {
resourceAnnotations = make(map[string]string) resourceAnnotations = make(map[string]string)
...@@ -1186,18 +1181,6 @@ func (r *DynamoNimDeploymentReconciler) generatePodTemplateSpec(ctx context.Cont ...@@ -1186,18 +1181,6 @@ func (r *DynamoNimDeploymentReconciler) generatePodTemplateSpec(ctx context.Cont
Name: commonconsts.EnvDynamoServicePort, Name: commonconsts.EnvDynamoServicePort,
Value: fmt.Sprintf("%d", containerPort), Value: fmt.Sprintf("%d", containerPort),
}, },
{
Name: commonconsts.EnvDynamoDeploymentUID,
Value: string(opt.dynamoNimDeployment.UID),
},
{
Name: commonconsts.EnvDynamoDeploymentName,
Value: opt.dynamoNimDeployment.Name,
},
{
Name: commonconsts.EnvDynamoDeploymentNamespace,
Value: opt.dynamoNimDeployment.Namespace,
},
} }
if r.NatsAddr != "" { if r.NatsAddr != "" {
...@@ -1221,13 +1204,13 @@ func (r *DynamoNimDeploymentReconciler) generatePodTemplateSpec(ctx context.Cont ...@@ -1221,13 +1204,13 @@ func (r *DynamoNimDeploymentReconciler) generatePodTemplateSpec(ctx context.Cont
} }
var livenessProbe *corev1.Probe var livenessProbe *corev1.Probe
if opt.dynamoNimDeployment.Spec.LivenessProbe != nil { if opt.dynamoComponentDeployment.Spec.LivenessProbe != nil {
livenessProbe = opt.dynamoNimDeployment.Spec.LivenessProbe livenessProbe = opt.dynamoComponentDeployment.Spec.LivenessProbe
} }
var readinessProbe *corev1.Probe var readinessProbe *corev1.Probe
if opt.dynamoNimDeployment.Spec.ReadinessProbe != nil { if opt.dynamoComponentDeployment.Spec.ReadinessProbe != nil {
readinessProbe = opt.dynamoNimDeployment.Spec.ReadinessProbe readinessProbe = opt.dynamoComponentDeployment.Spec.ReadinessProbe
} }
volumes := make([]corev1.Volume, 0) volumes := make([]corev1.Volume, 0)
...@@ -1239,17 +1222,17 @@ func (r *DynamoNimDeploymentReconciler) generatePodTemplateSpec(ctx context.Cont ...@@ -1239,17 +1222,17 @@ func (r *DynamoNimDeploymentReconciler) generatePodTemplateSpec(ctx context.Cont
// todo : remove this line when https://github.com/ai-dynamo/dynamo/issues/345 is fixed // todo : remove this line when https://github.com/ai-dynamo/dynamo/issues/345 is fixed
enableDependsOption := false enableDependsOption := false
if len(opt.dynamoNimDeployment.Spec.ExternalServices) > 0 && enableDependsOption { if len(opt.dynamoComponentDeployment.Spec.ExternalServices) > 0 && enableDependsOption {
serviceSuffix := fmt.Sprintf("%s.svc.cluster.local:3000", opt.dynamoNimDeployment.Namespace) serviceSuffix := fmt.Sprintf("%s.svc.cluster.local:3000", opt.dynamoComponentDeployment.Namespace)
keys := make([]string, 0, len(opt.dynamoNimDeployment.Spec.ExternalServices)) keys := make([]string, 0, len(opt.dynamoComponentDeployment.Spec.ExternalServices))
for key := range opt.dynamoNimDeployment.Spec.ExternalServices { for key := range opt.dynamoComponentDeployment.Spec.ExternalServices {
keys = append(keys, key) keys = append(keys, key)
} }
sort.Strings(keys) sort.Strings(keys)
for _, key := range keys { for _, key := range keys {
service := opt.dynamoNimDeployment.Spec.ExternalServices[key] service := opt.dynamoComponentDeployment.Spec.ExternalServices[key]
// Check if DeploymentSelectorKey is not "name" // Check if DeploymentSelectorKey is not "name"
if service.DeploymentSelectorKey == "name" { if service.DeploymentSelectorKey == "name" {
...@@ -1264,23 +1247,23 @@ func (r *DynamoNimDeploymentReconciler) generatePodTemplateSpec(ctx context.Cont ...@@ -1264,23 +1247,23 @@ func (r *DynamoNimDeploymentReconciler) generatePodTemplateSpec(ctx context.Cont
} }
} }
if opt.dynamoNimDeployment.Spec.ServiceName != "" { if opt.dynamoComponentDeployment.Spec.ServiceName != "" {
args = append(args, []string{"--service-name", opt.dynamoNimDeployment.Spec.ServiceName}...) args = append(args, []string{"--service-name", opt.dynamoComponentDeployment.Spec.ServiceName}...)
args = append(args, opt.dynamoNimDeployment.Spec.DynamoTag) args = append(args, opt.dynamoComponentDeployment.Spec.DynamoTag)
if opt.dynamoNimDeployment.Spec.DynamoNamespace != nil && *opt.dynamoNimDeployment.Spec.DynamoNamespace != "" { if opt.dynamoComponentDeployment.Spec.DynamoNamespace != nil && *opt.dynamoComponentDeployment.Spec.DynamoNamespace != "" {
args = append(args, fmt.Sprintf("--%s.ServiceArgs.dynamo.namespace=%s", opt.dynamoNimDeployment.Spec.ServiceName, *opt.dynamoNimDeployment.Spec.DynamoNamespace)) args = append(args, fmt.Sprintf("--%s.ServiceArgs.dynamo.namespace=%s", opt.dynamoComponentDeployment.Spec.ServiceName, *opt.dynamoComponentDeployment.Spec.DynamoNamespace))
} }
} }
if len(opt.dynamoNimDeployment.Spec.Envs) > 0 { if len(opt.dynamoComponentDeployment.Spec.Envs) > 0 {
for _, env := range opt.dynamoNimDeployment.Spec.Envs { for _, env := range opt.dynamoComponentDeployment.Spec.Envs {
if env.Name == "DYNAMO_CONFIG_PATH" { if env.Name == "DYNAMO_CONFIG_PATH" {
args = append(args, "-f", env.Value) args = append(args, "-f", env.Value)
} }
} }
} }
dynamoResources := opt.dynamoNimDeployment.Spec.Resources dynamoResources := opt.dynamoComponentDeployment.Spec.Resources
resources, err := getResourcesConfig(dynamoResources) resources, err := getResourcesConfig(dynamoResources)
if err != nil { if err != nil {
...@@ -1307,22 +1290,22 @@ func (r *DynamoNimDeploymentReconciler) generatePodTemplateSpec(ctx context.Cont ...@@ -1307,22 +1290,22 @@ func (r *DynamoNimDeploymentReconciler) generatePodTemplateSpec(ctx context.Cont
Name: KubeValueNameSharedMemory, Name: KubeValueNameSharedMemory,
MountPath: "/dev/shm", MountPath: "/dev/shm",
}) })
if opt.dynamoNimDeployment.Spec.PVC != nil { if opt.dynamoComponentDeployment.Spec.PVC != nil {
volumes = append(volumes, corev1.Volume{ volumes = append(volumes, corev1.Volume{
Name: getPvcName(opt.dynamoNimDeployment, opt.dynamoNimDeployment.Spec.PVC.Name), Name: getPvcName(opt.dynamoComponentDeployment, opt.dynamoComponentDeployment.Spec.PVC.Name),
VolumeSource: corev1.VolumeSource{ VolumeSource: corev1.VolumeSource{
PersistentVolumeClaim: &corev1.PersistentVolumeClaimVolumeSource{ PersistentVolumeClaim: &corev1.PersistentVolumeClaimVolumeSource{
ClaimName: getPvcName(opt.dynamoNimDeployment, opt.dynamoNimDeployment.Spec.PVC.Name), ClaimName: getPvcName(opt.dynamoComponentDeployment, opt.dynamoComponentDeployment.Spec.PVC.Name),
}, },
}, },
}) })
volumeMounts = append(volumeMounts, corev1.VolumeMount{ volumeMounts = append(volumeMounts, corev1.VolumeMount{
Name: getPvcName(opt.dynamoNimDeployment, opt.dynamoNimDeployment.Spec.PVC.Name), Name: getPvcName(opt.dynamoComponentDeployment, opt.dynamoComponentDeployment.Spec.PVC.Name),
MountPath: *opt.dynamoNimDeployment.Spec.PVC.MountPoint, MountPath: *opt.dynamoComponentDeployment.Spec.PVC.MountPoint,
}) })
} }
imageName := opt.dynamoNim.Spec.Image imageName := opt.dynamoComponent.Spec.Image
var securityContext *corev1.SecurityContext var securityContext *corev1.SecurityContext
var mainContainerSecurityContext *corev1.SecurityContext var mainContainerSecurityContext *corev1.SecurityContext
...@@ -1370,12 +1353,12 @@ func (r *DynamoNimDeploymentReconciler) generatePodTemplateSpec(ctx context.Cont ...@@ -1370,12 +1353,12 @@ func (r *DynamoNimDeploymentReconciler) generatePodTemplateSpec(ctx context.Cont
SecurityContext: mainContainerSecurityContext, SecurityContext: mainContainerSecurityContext,
} }
if opt.dynamoNimDeployment.Spec.EnvFromSecret != nil { if opt.dynamoComponentDeployment.Spec.EnvFromSecret != nil {
container.EnvFrom = []corev1.EnvFromSource{ container.EnvFrom = []corev1.EnvFromSource{
{ {
SecretRef: &corev1.SecretEnvSource{ SecretRef: &corev1.SecretEnvSource{
LocalObjectReference: corev1.LocalObjectReference{ LocalObjectReference: corev1.LocalObjectReference{
Name: *opt.dynamoNimDeployment.Spec.EnvFromSecret, Name: *opt.dynamoComponentDeployment.Spec.EnvFromSecret,
}, },
}, },
}, },
...@@ -1460,7 +1443,7 @@ func (r *DynamoNimDeploymentReconciler) generatePodTemplateSpec(ctx context.Cont ...@@ -1460,7 +1443,7 @@ func (r *DynamoNimDeploymentReconciler) generatePodTemplateSpec(ctx context.Cont
}, },
{ {
Name: "OLD_METRICS_PREFIX", Name: "OLD_METRICS_PREFIX",
Value: fmt.Sprintf("BENTOML_%s_", strings.ReplaceAll(dynamoNimRepositoryName, "-", ":")), Value: fmt.Sprintf("BENTOML_%s_", strings.ReplaceAll(dynamoComponentRepositoryName, "-", ":")),
}, },
{ {
Name: "NEW_METRICS_PREFIX", Name: "NEW_METRICS_PREFIX",
...@@ -1522,23 +1505,23 @@ func (r *DynamoNimDeploymentReconciler) generatePodTemplateSpec(ctx context.Cont ...@@ -1522,23 +1505,23 @@ func (r *DynamoNimDeploymentReconciler) generatePodTemplateSpec(ctx context.Cont
} }
var envoyConfigContent string var envoyConfigContent string
if opt.isStealingTrafficDebugModeEnabled { if opt.isStealingTrafficDebugModeEnabled {
productionServiceName := r.getServiceName(opt.dynamoNimDeployment, opt.dynamoNim, false) productionServiceName := r.getServiceName(opt.dynamoComponentDeployment, opt.dynamoComponent, false)
envoyConfigContent, err = envoy.GenerateEnvoyConfigurationContent(envoy.CreateEnvoyConfig{ envoyConfigContent, err = envoy.GenerateEnvoyConfigurationContent(envoy.CreateEnvoyConfig{
ListenPort: proxyPort, ListenPort: proxyPort,
DebugHeaderName: HeaderNameDebug, DebugHeaderName: HeaderNameDebug,
DebugHeaderValue: commonconsts.KubeLabelValueTrue, DebugHeaderValue: commonconsts.KubeLabelValueTrue,
DebugServerAddress: "localhost", DebugServerAddress: "localhost",
DebugServerPort: containerPort, DebugServerPort: containerPort,
ProductionServerAddress: fmt.Sprintf("%s.%s.svc.cluster.local", productionServiceName, opt.dynamoNimDeployment.Namespace), ProductionServerAddress: fmt.Sprintf("%s.%s.svc.cluster.local", productionServiceName, opt.dynamoComponentDeployment.Namespace),
ProductionServerPort: ServicePortHTTPNonProxy, ProductionServerPort: ServicePortHTTPNonProxy,
}) })
} else { } else {
debugServiceName := r.getServiceName(opt.dynamoNimDeployment, opt.dynamoNim, true) debugServiceName := r.getServiceName(opt.dynamoComponentDeployment, opt.dynamoComponent, true)
envoyConfigContent, err = envoy.GenerateEnvoyConfigurationContent(envoy.CreateEnvoyConfig{ envoyConfigContent, err = envoy.GenerateEnvoyConfigurationContent(envoy.CreateEnvoyConfig{
ListenPort: proxyPort, ListenPort: proxyPort,
DebugHeaderName: HeaderNameDebug, DebugHeaderName: HeaderNameDebug,
DebugHeaderValue: commonconsts.KubeLabelValueTrue, DebugHeaderValue: commonconsts.KubeLabelValueTrue,
DebugServerAddress: fmt.Sprintf("%s.%s.svc.cluster.local", debugServiceName, opt.dynamoNimDeployment.Namespace), DebugServerAddress: fmt.Sprintf("%s.%s.svc.cluster.local", debugServiceName, opt.dynamoComponentDeployment.Namespace),
DebugServerPort: ServicePortHTTPNonProxy, DebugServerPort: ServicePortHTTPNonProxy,
ProductionServerAddress: "localhost", ProductionServerAddress: "localhost",
ProductionServerPort: containerPort, ProductionServerPort: containerPort,
...@@ -1552,13 +1535,13 @@ func (r *DynamoNimDeploymentReconciler) generatePodTemplateSpec(ctx context.Cont ...@@ -1552,13 +1535,13 @@ func (r *DynamoNimDeploymentReconciler) generatePodTemplateSpec(ctx context.Cont
envoyConfigConfigMap := &corev1.ConfigMap{ envoyConfigConfigMap := &corev1.ConfigMap{
ObjectMeta: metav1.ObjectMeta{ ObjectMeta: metav1.ObjectMeta{
Name: envoyConfigConfigMapName, Name: envoyConfigConfigMapName,
Namespace: opt.dynamoNimDeployment.Namespace, Namespace: opt.dynamoComponentDeployment.Namespace,
}, },
Data: map[string]string{ Data: map[string]string{
"envoy.yaml": envoyConfigContent, "envoy.yaml": envoyConfigContent,
}, },
} }
err = ctrl.SetControllerReference(opt.dynamoNimDeployment, envoyConfigConfigMap, r.Scheme) err = ctrl.SetControllerReference(opt.dynamoComponentDeployment, envoyConfigConfigMap, r.Scheme)
if err != nil { if err != nil {
err = errors.Wrapf(err, "failed to set controller reference for envoy config config map") err = errors.Wrapf(err, "failed to set controller reference for envoy config config map")
return nil, err return nil, err
...@@ -1689,9 +1672,9 @@ func (r *DynamoNimDeploymentReconciler) generatePodTemplateSpec(ctx context.Cont ...@@ -1689,9 +1672,9 @@ func (r *DynamoNimDeploymentReconciler) generatePodTemplateSpec(ctx context.Cont
Volumes: volumes, Volumes: volumes,
} }
podSpec.ImagePullSecrets = opt.dynamoNim.Spec.ImagePullSecrets podSpec.ImagePullSecrets = opt.dynamoComponent.Spec.ImagePullSecrets
extraPodMetadata := opt.dynamoNimDeployment.Spec.ExtraPodMetadata extraPodMetadata := opt.dynamoComponentDeployment.Spec.ExtraPodMetadata
if extraPodMetadata != nil { if extraPodMetadata != nil {
for k, v := range extraPodMetadata.Annotations { for k, v := range extraPodMetadata.Annotations {
...@@ -1703,7 +1686,7 @@ func (r *DynamoNimDeploymentReconciler) generatePodTemplateSpec(ctx context.Cont ...@@ -1703,7 +1686,7 @@ func (r *DynamoNimDeploymentReconciler) generatePodTemplateSpec(ctx context.Cont
} }
} }
extraPodSpec := opt.dynamoNimDeployment.Spec.ExtraPodSpec extraPodSpec := opt.dynamoComponentDeployment.Spec.ExtraPodSpec
if extraPodSpec != nil { if extraPodSpec != nil {
podSpec.SchedulerName = extraPodSpec.SchedulerName podSpec.SchedulerName = extraPodSpec.SchedulerName
...@@ -1717,11 +1700,11 @@ func (r *DynamoNimDeploymentReconciler) generatePodTemplateSpec(ctx context.Cont ...@@ -1717,11 +1700,11 @@ func (r *DynamoNimDeploymentReconciler) generatePodTemplateSpec(ctx context.Cont
if podSpec.ServiceAccountName == "" { if podSpec.ServiceAccountName == "" {
serviceAccounts := &corev1.ServiceAccountList{} serviceAccounts := &corev1.ServiceAccountList{}
err = r.List(ctx, serviceAccounts, client.InNamespace(opt.dynamoNimDeployment.Namespace), client.MatchingLabels{ err = r.List(ctx, serviceAccounts, client.InNamespace(opt.dynamoComponentDeployment.Namespace), client.MatchingLabels{
commonconsts.KubeLabelDynamoDeploymentPod: commonconsts.KubeLabelValueTrue, commonconsts.KubeLabelDynamoDeploymentPod: commonconsts.KubeLabelValueTrue,
}) })
if err != nil { if err != nil {
err = errors.Wrapf(err, "failed to list service accounts in namespace %s", opt.dynamoNimDeployment.Namespace) err = errors.Wrapf(err, "failed to list service accounts in namespace %s", opt.dynamoComponentDeployment.Namespace)
return return
} }
if len(serviceAccounts.Items) > 0 { if len(serviceAccounts.Items) > 0 {
...@@ -1852,15 +1835,15 @@ func getResourcesConfig(resources *dynamoCommon.Resources) (corev1.ResourceRequi ...@@ -1852,15 +1835,15 @@ func getResourcesConfig(resources *dynamoCommon.Resources) (corev1.ResourceRequi
} }
//nolint:nakedret //nolint:nakedret
func (r *DynamoNimDeploymentReconciler) generateService(ctx context.Context, opt generateResourceOption) (kubeService *corev1.Service, toDelete bool, err error) { func (r *DynamoComponentDeploymentReconciler) generateService(ctx context.Context, opt generateResourceOption) (kubeService *corev1.Service, toDelete bool, err error) {
var kubeName string var kubeName string
if opt.isGenericService { if opt.isGenericService {
kubeName = r.getGenericServiceName(opt.dynamoNimDeployment, opt.dynamoNim) kubeName = r.getGenericServiceName(opt.dynamoComponentDeployment, opt.dynamoComponent)
} else { } else {
kubeName = r.getServiceName(opt.dynamoNimDeployment, opt.dynamoNim, opt.isStealingTrafficDebugModeEnabled) kubeName = r.getServiceName(opt.dynamoComponentDeployment, opt.dynamoComponent, opt.isStealingTrafficDebugModeEnabled)
} }
kubeNs := opt.dynamoNimDeployment.Namespace kubeNs := opt.dynamoComponentDeployment.Namespace
kubeService = &corev1.Service{ kubeService = &corev1.Service{
ObjectMeta: metav1.ObjectMeta{ ObjectMeta: metav1.ObjectMeta{
...@@ -1874,7 +1857,7 @@ func (r *DynamoNimDeploymentReconciler) generateService(ctx context.Context, opt ...@@ -1874,7 +1857,7 @@ func (r *DynamoNimDeploymentReconciler) generateService(ctx context.Context, opt
return kubeService, true, nil return kubeService, true, nil
} }
labels := r.getKubeLabels(opt.dynamoNimDeployment, opt.dynamoNim) labels := r.getKubeLabels(opt.dynamoComponentDeployment, opt.dynamoComponent)
selector := make(map[string]string) selector := make(map[string]string)
...@@ -1912,7 +1895,7 @@ func (r *DynamoNimDeploymentReconciler) generateService(ctx context.Context, opt ...@@ -1912,7 +1895,7 @@ func (r *DynamoNimDeploymentReconciler) generateService(ctx context.Context, opt
}, },
} }
annotations := r.getKubeAnnotations(opt.dynamoNimDeployment, opt.dynamoNim) annotations := r.getKubeAnnotations(opt.dynamoComponentDeployment, opt.dynamoComponent)
kubeService.ObjectMeta.Annotations = annotations kubeService.ObjectMeta.Annotations = annotations
kubeService.ObjectMeta.Labels = labels kubeService.ObjectMeta.Labels = labels
...@@ -1939,10 +1922,10 @@ type IngressConfig struct { ...@@ -1939,10 +1922,10 @@ type IngressConfig struct {
} }
// SetupWithManager sets up the controller with the Manager. // SetupWithManager sets up the controller with the Manager.
func (r *DynamoNimDeploymentReconciler) SetupWithManager(mgr ctrl.Manager) error { func (r *DynamoComponentDeploymentReconciler) SetupWithManager(mgr ctrl.Manager) error {
m := ctrl.NewControllerManagedBy(mgr). m := ctrl.NewControllerManagedBy(mgr).
For(&v1alpha1.DynamoNimDeployment{}, builder.WithPredicates(predicate.GenerationChangedPredicate{})). For(&v1alpha1.DynamoComponentDeployment{}, builder.WithPredicates(predicate.GenerationChangedPredicate{})).
Owns(&appsv1.Deployment{}, builder.WithPredicates(predicate.Funcs{ Owns(&appsv1.Deployment{}, builder.WithPredicates(predicate.Funcs{
// ignore creation cause we don't want to be called again after we create the deployment // ignore creation cause we don't want to be called again after we create the deployment
CreateFunc: func(ce event.CreateEvent) bool { return false }, CreateFunc: func(ce event.CreateEvent) bool { return false },
...@@ -1953,66 +1936,66 @@ func (r *DynamoNimDeploymentReconciler) SetupWithManager(mgr ctrl.Manager) error ...@@ -1953,66 +1936,66 @@ func (r *DynamoNimDeploymentReconciler) SetupWithManager(mgr ctrl.Manager) error
Owns(&corev1.Service{}, builder.WithPredicates(predicate.GenerationChangedPredicate{})). Owns(&corev1.Service{}, builder.WithPredicates(predicate.GenerationChangedPredicate{})).
Owns(&networkingv1.Ingress{}, builder.WithPredicates(predicate.GenerationChangedPredicate{})). Owns(&networkingv1.Ingress{}, builder.WithPredicates(predicate.GenerationChangedPredicate{})).
Owns(&corev1.PersistentVolumeClaim{}, builder.WithPredicates(predicate.GenerationChangedPredicate{})). Owns(&corev1.PersistentVolumeClaim{}, builder.WithPredicates(predicate.GenerationChangedPredicate{})).
Watches(&v1alpha1.DynamoNimRequest{}, handler.EnqueueRequestsFromMapFunc(func(ctx context.Context, dynamoNimRequest client.Object) []reconcile.Request { Watches(&v1alpha1.DynamoComponentRequest{}, handler.EnqueueRequestsFromMapFunc(func(ctx context.Context, dynamoComponentRequest client.Object) []reconcile.Request {
reqs := make([]reconcile.Request, 0) reqs := make([]reconcile.Request, 0)
logs := log.Log.WithValues("func", "Watches", "kind", "DynamoNimRequest", "name", dynamoNimRequest.GetName(), "namespace", dynamoNimRequest.GetNamespace()) logs := log.Log.WithValues("func", "Watches", "kind", "DynamoComponentRequest", "name", dynamoComponentRequest.GetName(), "namespace", dynamoComponentRequest.GetNamespace())
logs.Info("Triggering reconciliation for DynamoNimRequest", "DynamoNimRequestName", dynamoNimRequest.GetName(), "Namespace", dynamoNimRequest.GetNamespace()) logs.Info("Triggering reconciliation for DynamoComponentRequest", "DynamoComponentRequestName", dynamoComponentRequest.GetName(), "Namespace", dynamoComponentRequest.GetNamespace())
dynamoNim := &v1alpha1.DynamoNim{} dynamoComponent := &v1alpha1.DynamoComponent{}
err := r.Get(context.Background(), types.NamespacedName{ err := r.Get(context.Background(), types.NamespacedName{
Name: dynamoNimRequest.GetName(), Name: dynamoComponentRequest.GetName(),
Namespace: dynamoNimRequest.GetNamespace(), Namespace: dynamoComponentRequest.GetNamespace(),
}, dynamoNim) }, dynamoComponent)
dynamoNimIsNotFound := k8serrors.IsNotFound(err) dynamoComponentIsNotFound := k8serrors.IsNotFound(err)
if err != nil && !dynamoNimIsNotFound { if err != nil && !dynamoComponentIsNotFound {
logs.Info("Failed to get DynamoNim", "name", dynamoNimRequest.GetName(), "namespace", dynamoNimRequest.GetNamespace(), "error", err) logs.Info("Failed to get DynamoComponent", "name", dynamoComponentRequest.GetName(), "namespace", dynamoComponentRequest.GetNamespace(), "error", err)
return reqs return reqs
} }
if !dynamoNimIsNotFound { if !dynamoComponentIsNotFound {
logs.Info("DynamoNim found, skipping enqueue as it's already present", "DynamoNimName", dynamoNimRequest.GetName()) logs.Info("DynamoComponent found, skipping enqueue as it's already present", "DynamoComponentName", dynamoComponentRequest.GetName())
return reqs return reqs
} }
dynamoNimDeployments := &v1alpha1.DynamoNimDeploymentList{} dynamoComponentDeployments := &v1alpha1.DynamoComponentDeploymentList{}
err = r.List(context.Background(), dynamoNimDeployments, &client.ListOptions{ err = r.List(context.Background(), dynamoComponentDeployments, &client.ListOptions{
Namespace: dynamoNimRequest.GetNamespace(), Namespace: dynamoComponentRequest.GetNamespace(),
}) })
if err != nil { if err != nil {
logs.Info("Failed to list DynamoNimDeployments", "Namespace", dynamoNimRequest.GetNamespace(), "error", err) logs.Info("Failed to list DynamoComponentDeployments", "Namespace", dynamoComponentRequest.GetNamespace(), "error", err)
return reqs return reqs
} }
for _, dynamoNimDeployment := range dynamoNimDeployments.Items { for _, dynamoComponentDeployment := range dynamoComponentDeployments.Items {
dynamoNimDeployment := dynamoNimDeployment dynamoComponentDeployment := dynamoComponentDeployment
if dynamoNimDeployment.Spec.DynamoNim == dynamoNimRequest.GetName() { if getK8sName(dynamoComponentDeployment.Spec.DynamoComponent) == dynamoComponentRequest.GetName() {
reqs = append(reqs, reconcile.Request{ reqs = append(reqs, reconcile.Request{
NamespacedName: client.ObjectKeyFromObject(&dynamoNimDeployment), NamespacedName: client.ObjectKeyFromObject(&dynamoComponentDeployment),
}) })
} }
} }
// Log the list of DynamoNimDeployments being enqueued for reconciliation // Log the list of DynamoComponentDeployments being enqueued for reconciliation
logs.Info("Enqueuing DynamoNimDeployments for reconciliation", "ReconcileRequests", reqs) logs.Info("Enqueuing DynamoComponentDeployments for reconciliation", "ReconcileRequests", reqs)
return reqs return reqs
})).WithEventFilter(controller_common.EphemeralDeploymentEventFilter(r.Config)). })).WithEventFilter(controller_common.EphemeralDeploymentEventFilter(r.Config)).
Watches(&v1alpha1.DynamoNim{}, handler.EnqueueRequestsFromMapFunc(func(ctx context.Context, dynamoNim client.Object) []reconcile.Request { Watches(&v1alpha1.DynamoComponent{}, handler.EnqueueRequestsFromMapFunc(func(ctx context.Context, dynamoComponent client.Object) []reconcile.Request {
logs := log.Log.WithValues("func", "Watches", "kind", "DynamoNim", "name", dynamoNim.GetName(), "namespace", dynamoNim.GetNamespace()) logs := log.Log.WithValues("func", "Watches", "kind", "DynamoComponent", "name", dynamoComponent.GetName(), "namespace", dynamoComponent.GetNamespace())
logs.Info("Triggering reconciliation for DynamoNim", "DynamoNimName", dynamoNim.GetName(), "Namespace", dynamoNim.GetNamespace()) logs.Info("Triggering reconciliation for DynamoComponent", "DynamoComponentName", dynamoComponent.GetName(), "Namespace", dynamoComponent.GetNamespace())
dynamoNimDeployments := &v1alpha1.DynamoNimDeploymentList{} dynamoComponentDeployments := &v1alpha1.DynamoComponentDeploymentList{}
err := r.List(context.Background(), dynamoNimDeployments, &client.ListOptions{ err := r.List(context.Background(), dynamoComponentDeployments, &client.ListOptions{
Namespace: dynamoNim.GetNamespace(), Namespace: dynamoComponent.GetNamespace(),
}) })
if err != nil { if err != nil {
logs.Info("Failed to list DynamoNimDeployments", "Namespace", dynamoNim.GetNamespace(), "error", err) logs.Info("Failed to list DynamoComponentDeployments", "Namespace", dynamoComponent.GetNamespace(), "error", err)
return []reconcile.Request{} return []reconcile.Request{}
} }
reqs := make([]reconcile.Request, 0) reqs := make([]reconcile.Request, 0)
for _, dynamoNimDeployment := range dynamoNimDeployments.Items { for _, dynamoComponentDeployment := range dynamoComponentDeployments.Items {
dynamoNimDeployment := dynamoNimDeployment dynamoComponentDeployment := dynamoComponentDeployment
if dynamoNimDeployment.Spec.DynamoNim == dynamoNim.GetName() { if getK8sName(dynamoComponentDeployment.Spec.DynamoComponent) == dynamoComponent.GetName() {
reqs = append(reqs, reconcile.Request{ reqs = append(reqs, reconcile.Request{
NamespacedName: client.ObjectKeyFromObject(&dynamoNimDeployment), NamespacedName: client.ObjectKeyFromObject(&dynamoComponentDeployment),
}) })
} }
} }
// Log the list of DynamoNimDeployments being enqueued for reconciliation // Log the list of DynamoComponentDeployments being enqueued for reconciliation
logs.Info("Enqueuing DynamoNimDeployments for reconciliation", "ReconcileRequests", reqs) logs.Info("Enqueuing DynamoComponentDeployments for reconciliation", "ReconcileRequests", reqs)
return reqs return reqs
})) }))
......
...@@ -160,13 +160,13 @@ func (m *mockEtcdStorage) DeleteKeys(ctx context.Context, prefix string) error { ...@@ -160,13 +160,13 @@ func (m *mockEtcdStorage) DeleteKeys(ctx context.Context, prefix string) error {
return m.deleteKeysFunc(ctx, prefix) return m.deleteKeysFunc(ctx, prefix)
} }
func TestDynamoNimDeploymentReconciler_FinalizeResource(t *testing.T) { func TestDynamoComponentDeploymentReconciler_FinalizeResource(t *testing.T) {
type fields struct { type fields struct {
EtcdStorage etcdStorage EtcdStorage etcdStorage
} }
type args struct { type args struct {
ctx context.Context ctx context.Context
dynamoNimDeployment *v1alpha1.DynamoNimDeployment dynamoComponentDeployment *v1alpha1.DynamoComponentDeployment
} }
tests := []struct { tests := []struct {
name string name string
...@@ -188,9 +188,9 @@ func TestDynamoNimDeploymentReconciler_FinalizeResource(t *testing.T) { ...@@ -188,9 +188,9 @@ func TestDynamoNimDeploymentReconciler_FinalizeResource(t *testing.T) {
}, },
args: args{ args: args{
ctx: context.Background(), ctx: context.Background(),
dynamoNimDeployment: &v1alpha1.DynamoNimDeployment{ dynamoComponentDeployment: &v1alpha1.DynamoComponentDeployment{
Spec: v1alpha1.DynamoNimDeploymentSpec{ Spec: v1alpha1.DynamoComponentDeploymentSpec{
DynamoNimDeploymentSharedSpec: v1alpha1.DynamoNimDeploymentSharedSpec{ DynamoComponentDeploymentSharedSpec: v1alpha1.DynamoComponentDeploymentSharedSpec{
ServiceName: "service1", ServiceName: "service1",
DynamoNamespace: &[]string{"default"}[0], DynamoNamespace: &[]string{"default"}[0],
}, },
...@@ -210,9 +210,9 @@ func TestDynamoNimDeploymentReconciler_FinalizeResource(t *testing.T) { ...@@ -210,9 +210,9 @@ func TestDynamoNimDeploymentReconciler_FinalizeResource(t *testing.T) {
}, },
args: args{ args: args{
ctx: context.Background(), ctx: context.Background(),
dynamoNimDeployment: &v1alpha1.DynamoNimDeployment{ dynamoComponentDeployment: &v1alpha1.DynamoComponentDeployment{
Spec: v1alpha1.DynamoNimDeploymentSpec{ Spec: v1alpha1.DynamoComponentDeploymentSpec{
DynamoNimDeploymentSharedSpec: v1alpha1.DynamoNimDeploymentSharedSpec{ DynamoComponentDeploymentSharedSpec: v1alpha1.DynamoComponentDeploymentSharedSpec{
ServiceName: "service1", ServiceName: "service1",
DynamoNamespace: &[]string{"default"}[0], DynamoNamespace: &[]string{"default"}[0],
}, },
...@@ -224,17 +224,17 @@ func TestDynamoNimDeploymentReconciler_FinalizeResource(t *testing.T) { ...@@ -224,17 +224,17 @@ func TestDynamoNimDeploymentReconciler_FinalizeResource(t *testing.T) {
} }
for _, tt := range tests { for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) { t.Run(tt.name, func(t *testing.T) {
r := &DynamoNimDeploymentReconciler{ r := &DynamoComponentDeploymentReconciler{
EtcdStorage: tt.fields.EtcdStorage, EtcdStorage: tt.fields.EtcdStorage,
} }
if err := r.FinalizeResource(tt.args.ctx, tt.args.dynamoNimDeployment); (err != nil) != tt.wantErr { if err := r.FinalizeResource(tt.args.ctx, tt.args.dynamoComponentDeployment); (err != nil) != tt.wantErr {
t.Errorf("DynamoNimDeploymentReconciler.FinalizeResource() error = %v, wantErr %v", err, tt.wantErr) t.Errorf("DynamoComponentDeploymentReconciler.FinalizeResource() error = %v, wantErr %v", err, tt.wantErr)
} }
}) })
} }
} }
func TestDynamoNimDeploymentReconciler_generateIngress(t *testing.T) { func TestDynamoComponentDeploymentReconciler_generateIngress(t *testing.T) {
type fields struct { type fields struct {
} }
type args struct { type args struct {
...@@ -255,13 +255,13 @@ func TestDynamoNimDeploymentReconciler_generateIngress(t *testing.T) { ...@@ -255,13 +255,13 @@ func TestDynamoNimDeploymentReconciler_generateIngress(t *testing.T) {
args: args{ args: args{
ctx: context.Background(), ctx: context.Background(),
opt: generateResourceOption{ opt: generateResourceOption{
dynamoNimDeployment: &v1alpha1.DynamoNimDeployment{ dynamoComponentDeployment: &v1alpha1.DynamoComponentDeployment{
ObjectMeta: metav1.ObjectMeta{ ObjectMeta: metav1.ObjectMeta{
Name: "service1", Name: "service1",
Namespace: "default", Namespace: "default",
}, },
Spec: v1alpha1.DynamoNimDeploymentSpec{ Spec: v1alpha1.DynamoComponentDeploymentSpec{
DynamoNimDeploymentSharedSpec: v1alpha1.DynamoNimDeploymentSharedSpec{ DynamoComponentDeploymentSharedSpec: v1alpha1.DynamoComponentDeploymentSharedSpec{
ServiceName: "service1", ServiceName: "service1",
DynamoNamespace: &[]string{"default"}[0], DynamoNamespace: &[]string{"default"}[0],
Ingress: v1alpha1.IngressSpec{ Ingress: v1alpha1.IngressSpec{
...@@ -314,13 +314,13 @@ func TestDynamoNimDeploymentReconciler_generateIngress(t *testing.T) { ...@@ -314,13 +314,13 @@ func TestDynamoNimDeploymentReconciler_generateIngress(t *testing.T) {
args: args{ args: args{
ctx: context.Background(), ctx: context.Background(),
opt: generateResourceOption{ opt: generateResourceOption{
dynamoNimDeployment: &v1alpha1.DynamoNimDeployment{ dynamoComponentDeployment: &v1alpha1.DynamoComponentDeployment{
ObjectMeta: metav1.ObjectMeta{ ObjectMeta: metav1.ObjectMeta{
Name: "service1", Name: "service1",
Namespace: "default", Namespace: "default",
}, },
Spec: v1alpha1.DynamoNimDeploymentSpec{ Spec: v1alpha1.DynamoComponentDeploymentSpec{
DynamoNimDeploymentSharedSpec: v1alpha1.DynamoNimDeploymentSharedSpec{ DynamoComponentDeploymentSharedSpec: v1alpha1.DynamoComponentDeploymentSharedSpec{
ServiceName: "service1", ServiceName: "service1",
DynamoNamespace: &[]string{"default"}[0], DynamoNamespace: &[]string{"default"}[0],
Ingress: v1alpha1.IngressSpec{ Ingress: v1alpha1.IngressSpec{
...@@ -344,10 +344,10 @@ func TestDynamoNimDeploymentReconciler_generateIngress(t *testing.T) { ...@@ -344,10 +344,10 @@ func TestDynamoNimDeploymentReconciler_generateIngress(t *testing.T) {
for _, tt := range tests { for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) { t.Run(tt.name, func(t *testing.T) {
g := gomega.NewGomegaWithT(t) g := gomega.NewGomegaWithT(t)
r := &DynamoNimDeploymentReconciler{} r := &DynamoComponentDeploymentReconciler{}
got, got1, err := r.generateIngress(tt.args.ctx, tt.args.opt) got, got1, err := r.generateIngress(tt.args.ctx, tt.args.opt)
if (err != nil) != tt.wantErr { if (err != nil) != tt.wantErr {
t.Errorf("DynamoNimDeploymentReconciler.generateIngress() error = %v, wantErr %v", err, tt.wantErr) t.Errorf("DynamoComponentDeploymentReconciler.generateIngress() error = %v, wantErr %v", err, tt.wantErr)
return return
} }
g.Expect(got).To(gomega.Equal(tt.want)) g.Expect(got).To(gomega.Equal(tt.want))
...@@ -356,7 +356,7 @@ func TestDynamoNimDeploymentReconciler_generateIngress(t *testing.T) { ...@@ -356,7 +356,7 @@ func TestDynamoNimDeploymentReconciler_generateIngress(t *testing.T) {
} }
} }
func TestDynamoNimDeploymentReconciler_generateVirtualService(t *testing.T) { func TestDynamoComponentDeploymentReconciler_generateVirtualService(t *testing.T) {
type fields struct { type fields struct {
} }
type args struct { type args struct {
...@@ -377,13 +377,13 @@ func TestDynamoNimDeploymentReconciler_generateVirtualService(t *testing.T) { ...@@ -377,13 +377,13 @@ func TestDynamoNimDeploymentReconciler_generateVirtualService(t *testing.T) {
args: args{ args: args{
ctx: context.Background(), ctx: context.Background(),
opt: generateResourceOption{ opt: generateResourceOption{
dynamoNimDeployment: &v1alpha1.DynamoNimDeployment{ dynamoComponentDeployment: &v1alpha1.DynamoComponentDeployment{
ObjectMeta: metav1.ObjectMeta{ ObjectMeta: metav1.ObjectMeta{
Name: "service1", Name: "service1",
Namespace: "default", Namespace: "default",
}, },
Spec: v1alpha1.DynamoNimDeploymentSpec{ Spec: v1alpha1.DynamoComponentDeploymentSpec{
DynamoNimDeploymentSharedSpec: v1alpha1.DynamoNimDeploymentSharedSpec{ DynamoComponentDeploymentSharedSpec: v1alpha1.DynamoComponentDeploymentSharedSpec{
ServiceName: "service1", ServiceName: "service1",
DynamoNamespace: &[]string{"default"}[0], DynamoNamespace: &[]string{"default"}[0],
Ingress: v1alpha1.IngressSpec{ Ingress: v1alpha1.IngressSpec{
...@@ -409,13 +409,13 @@ func TestDynamoNimDeploymentReconciler_generateVirtualService(t *testing.T) { ...@@ -409,13 +409,13 @@ func TestDynamoNimDeploymentReconciler_generateVirtualService(t *testing.T) {
args: args{ args: args{
ctx: context.Background(), ctx: context.Background(),
opt: generateResourceOption{ opt: generateResourceOption{
dynamoNimDeployment: &v1alpha1.DynamoNimDeployment{ dynamoComponentDeployment: &v1alpha1.DynamoComponentDeployment{
ObjectMeta: metav1.ObjectMeta{ ObjectMeta: metav1.ObjectMeta{
Name: "service1", Name: "service1",
Namespace: "default", Namespace: "default",
}, },
Spec: v1alpha1.DynamoNimDeploymentSpec{ Spec: v1alpha1.DynamoComponentDeploymentSpec{
DynamoNimDeploymentSharedSpec: v1alpha1.DynamoNimDeploymentSharedSpec{ DynamoComponentDeploymentSharedSpec: v1alpha1.DynamoComponentDeploymentSharedSpec{
ServiceName: "service1", ServiceName: "service1",
DynamoNamespace: &[]string{"default"}[0], DynamoNamespace: &[]string{"default"}[0],
Ingress: v1alpha1.IngressSpec{ Ingress: v1alpha1.IngressSpec{
...@@ -467,10 +467,10 @@ func TestDynamoNimDeploymentReconciler_generateVirtualService(t *testing.T) { ...@@ -467,10 +467,10 @@ func TestDynamoNimDeploymentReconciler_generateVirtualService(t *testing.T) {
for _, tt := range tests { for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) { t.Run(tt.name, func(t *testing.T) {
g := gomega.NewGomegaWithT(t) g := gomega.NewGomegaWithT(t)
r := &DynamoNimDeploymentReconciler{} r := &DynamoComponentDeploymentReconciler{}
got, got1, err := r.generateVirtualService(tt.args.ctx, tt.args.opt) got, got1, err := r.generateVirtualService(tt.args.ctx, tt.args.opt)
if (err != nil) != tt.wantErr { if (err != nil) != tt.wantErr {
t.Errorf("DynamoNimDeploymentReconciler.generateVirtualService() error = %v, wantErr %v", err, tt.wantErr) t.Errorf("DynamoComponentDeploymentReconciler.generateVirtualService() error = %v, wantErr %v", err, tt.wantErr)
return return
} }
g.Expect(got).To(gomega.Equal(tt.want)) g.Expect(got).To(gomega.Equal(tt.want))
......
...@@ -71,19 +71,19 @@ import ( ...@@ -71,19 +71,19 @@ import (
nvidiacomv1alpha1 "github.com/ai-dynamo/dynamo/deploy/dynamo/operator/api/v1alpha1" nvidiacomv1alpha1 "github.com/ai-dynamo/dynamo/deploy/dynamo/operator/api/v1alpha1"
) )
// DynamoNimRequestReconciler reconciles a DynamoNimRequest object // DynamoComponentRequestReconciler reconciles a DynamoComponentRequest object
type DynamoNimRequestReconciler struct { type DynamoComponentRequestReconciler struct {
client.Client client.Client
Scheme *runtime.Scheme Scheme *runtime.Scheme
Recorder record.EventRecorder Recorder record.EventRecorder
Config controller_common.Config Config controller_common.Config
} }
// +kubebuilder:rbac:groups=nvidia.com,resources=dynamonimrequests,verbs=get;list;watch;create;update;patch;delete // +kubebuilder:rbac:groups=nvidia.com,resources=dynamocomponentrequests,verbs=get;list;watch;create;update;patch;delete
// +kubebuilder:rbac:groups=nvidia.com,resources=dynamonimrequests/status,verbs=get;update;patch // +kubebuilder:rbac:groups=nvidia.com,resources=dynamocomponentrequests/status,verbs=get;update;patch
// +kubebuilder:rbac:groups=nvidia.com,resources=dynamonimrequests/finalizers,verbs=update // +kubebuilder:rbac:groups=nvidia.com,resources=dynamocomponentrequests/finalizers,verbs=update
//+kubebuilder:rbac:groups=nvidia.com,resources=dynamonims,verbs=get;list;watch;create;update;patch;delete //+kubebuilder:rbac:groups=nvidia.com,resources=dynamocomponents,verbs=get;list;watch;create;update;patch;delete
//+kubebuilder:rbac:groups=nvidia.com,resources=dynamonims/status,verbs=get;update;patch //+kubebuilder:rbac:groups=nvidia.com,resources=dynamocomponents/status,verbs=get;update;patch
//+kubebuilder:rbac:groups=events.k8s.io,resources=events,verbs=get;list;watch;create;update;patch;delete //+kubebuilder:rbac:groups=events.k8s.io,resources=events,verbs=get;list;watch;create;update;patch;delete
//+kubebuilder:rbac:groups=core,resources=events,verbs=get;list;watch;create;update;patch;delete //+kubebuilder:rbac:groups=core,resources=events,verbs=get;list;watch;create;update;patch;delete
//+kubebuilder:rbac:groups=core,resources=pods,verbs=get;list;watch;create;update;patch;delete //+kubebuilder:rbac:groups=core,resources=pods,verbs=get;list;watch;create;update;patch;delete
...@@ -95,7 +95,7 @@ type DynamoNimRequestReconciler struct { ...@@ -95,7 +95,7 @@ type DynamoNimRequestReconciler struct {
// Reconcile is part of the main kubernetes reconciliation loop which aims to // Reconcile is part of the main kubernetes reconciliation loop which aims to
// move the current state of the cluster closer to the desired state. // move the current state of the cluster closer to the desired state.
// TODO(user): Modify the Reconcile function to compare the state specified by // TODO(user): Modify the Reconcile function to compare the state specified by
// the DynamoNimRequest object against the actual cluster state, and then // the DynamoComponentRequest object against the actual cluster state, and then
// perform operations to make the cluster state reflect the state specified by // perform operations to make the cluster state reflect the state specified by
// the user. // the user.
// //
...@@ -103,52 +103,52 @@ type DynamoNimRequestReconciler struct { ...@@ -103,52 +103,52 @@ type DynamoNimRequestReconciler struct {
// - https://pkg.go.dev/sigs.k8s.io/controller-runtime@v0.18.2/pkg/reconcile // - https://pkg.go.dev/sigs.k8s.io/controller-runtime@v0.18.2/pkg/reconcile
// //
//nolint:gocyclo,nakedret //nolint:gocyclo,nakedret
func (r *DynamoNimRequestReconciler) Reconcile(ctx context.Context, req ctrl.Request) (result ctrl.Result, err error) { func (r *DynamoComponentRequestReconciler) Reconcile(ctx context.Context, req ctrl.Request) (result ctrl.Result, err error) {
logs := log.FromContext(ctx) logs := log.FromContext(ctx)
dynamoNimRequest := &nvidiacomv1alpha1.DynamoNimRequest{} dynamoComponentRequest := &nvidiacomv1alpha1.DynamoComponentRequest{}
err = r.Get(ctx, req.NamespacedName, dynamoNimRequest) err = r.Get(ctx, req.NamespacedName, dynamoComponentRequest)
if err != nil { if err != nil {
if k8serrors.IsNotFound(err) { if k8serrors.IsNotFound(err) {
// Object not found, return. Created objects are automatically garbage collected. // Object not found, return. Created objects are automatically garbage collected.
// For additional cleanup logic use finalizers. // For additional cleanup logic use finalizers.
logs.Info("dynamoNimRequest resource not found. Ignoring since object must be deleted") logs.Info("dynamoComponentRequest resource not found. Ignoring since object must be deleted")
err = nil err = nil
return return
} }
// Error reading the object - requeue the request. // Error reading the object - requeue the request.
logs.Error(err, "Failed to get dynamoNimRequest") logs.Error(err, "Failed to get dynamoComponentRequest")
return return
} }
for _, condition := range dynamoNimRequest.Status.Conditions { for _, condition := range dynamoComponentRequest.Status.Conditions {
if condition.Type == nvidiacomv1alpha1.DynamoDeploymentConditionTypeAvailable && condition.Status == metav1.ConditionTrue { if condition.Type == nvidiacomv1alpha1.DynamoGraphDeploymentConditionTypeAvailable && condition.Status == metav1.ConditionTrue {
logs.Info("Skip available dynamoNimRequest") logs.Info("Skip available dynamoComponentRequest")
return return
} }
} }
if len(dynamoNimRequest.Status.Conditions) == 0 { if len(dynamoComponentRequest.Status.Conditions) == 0 {
dynamoNimRequest, err = r.setStatusConditions(ctx, req, dynamoComponentRequest, err = r.setStatusConditions(ctx, req,
metav1.Condition{ metav1.Condition{
Type: nvidiacomv1alpha1.DynamoNimRequestConditionTypeModelsSeeding, Type: nvidiacomv1alpha1.DynamoComponentRequestConditionTypeModelsSeeding,
Status: metav1.ConditionUnknown, Status: metav1.ConditionUnknown,
Reason: "Reconciling", Reason: "Reconciling",
Message: "Starting to reconcile dynamoNimRequest", Message: "Starting to reconcile dynamoComponentRequest",
}, },
metav1.Condition{ metav1.Condition{
Type: nvidiacomv1alpha1.DynamoNimRequestConditionTypeImageBuilding, Type: nvidiacomv1alpha1.DynamoComponentRequestConditionTypeImageBuilding,
Status: metav1.ConditionUnknown, Status: metav1.ConditionUnknown,
Reason: "Reconciling", Reason: "Reconciling",
Message: "Starting to reconcile dynamoNimRequest", Message: "Starting to reconcile dynamoComponentRequest",
}, },
metav1.Condition{ metav1.Condition{
Type: nvidiacomv1alpha1.DynamoNimRequestConditionTypeImageExists, Type: nvidiacomv1alpha1.DynamoComponentRequestConditionTypeImageExists,
Status: metav1.ConditionUnknown, Status: metav1.ConditionUnknown,
Reason: "Reconciling", Reason: "Reconciling",
Message: "Starting to reconcile dynamoNimRequest", Message: "Starting to reconcile dynamoComponentRequest",
}, },
) )
if err != nil { if err != nil {
...@@ -156,34 +156,34 @@ func (r *DynamoNimRequestReconciler) Reconcile(ctx context.Context, req ctrl.Req ...@@ -156,34 +156,34 @@ func (r *DynamoNimRequestReconciler) Reconcile(ctx context.Context, req ctrl.Req
} }
} }
logs = logs.WithValues("dynamoNimRequest", dynamoNimRequest.Name, "dynamoNimRequestNamespace", dynamoNimRequest.Namespace) logs = logs.WithValues("dynamoComponentRequest", dynamoComponentRequest.Name, "dynamoComponentRequestNamespace", dynamoComponentRequest.Namespace)
defer func() { defer func() {
if err == nil { if err == nil {
logs.Info("Reconcile success") logs.Info("Reconcile success")
return return
} }
logs.Error(err, "Failed to reconcile dynamoNimRequest.") logs.Error(err, "Failed to reconcile dynamoComponentRequest.")
r.Recorder.Eventf(dynamoNimRequest, corev1.EventTypeWarning, "ReconcileError", "Failed to reconcile dynamoNimRequest: %v", err) r.Recorder.Eventf(dynamoComponentRequest, corev1.EventTypeWarning, "ReconcileError", "Failed to reconcile dynamoComponentRequest: %v", err)
_, err_ := r.setStatusConditions(ctx, req, _, err_ := r.setStatusConditions(ctx, req,
metav1.Condition{ metav1.Condition{
Type: nvidiacomv1alpha1.DynamoNimRequestConditionTypeDynamoNimAvailable, Type: nvidiacomv1alpha1.DynamoComponentRequestConditionTypeDynamoComponentAvailable,
Status: metav1.ConditionFalse, Status: metav1.ConditionFalse,
Reason: "Reconciling", Reason: "Reconciling",
Message: err.Error(), Message: err.Error(),
}, },
) )
if err_ != nil { if err_ != nil {
logs.Error(err_, "Failed to update dynamoNimRequest status") logs.Error(err_, "Failed to update dynamoComponentRequest status")
return return
} }
}() }()
dynamoNimAvailableCondition := meta.FindStatusCondition(dynamoNimRequest.Status.Conditions, nvidiacomv1alpha1.DynamoNimRequestConditionTypeDynamoNimAvailable) dynamoComponentAvailableCondition := meta.FindStatusCondition(dynamoComponentRequest.Status.Conditions, nvidiacomv1alpha1.DynamoComponentRequestConditionTypeDynamoComponentAvailable)
if dynamoNimAvailableCondition == nil || dynamoNimAvailableCondition.Status != metav1.ConditionUnknown { if dynamoComponentAvailableCondition == nil || dynamoComponentAvailableCondition.Status != metav1.ConditionUnknown {
dynamoNimRequest, err = r.setStatusConditions(ctx, req, dynamoComponentRequest, err = r.setStatusConditions(ctx, req,
metav1.Condition{ metav1.Condition{
Type: nvidiacomv1alpha1.DynamoNimRequestConditionTypeDynamoNimAvailable, Type: nvidiacomv1alpha1.DynamoComponentRequestConditionTypeDynamoComponentAvailable,
Status: metav1.ConditionUnknown, Status: metav1.ConditionUnknown,
Reason: "Reconciling", Reason: "Reconciling",
Message: "Reconciling", Message: "Reconciling",
...@@ -194,9 +194,9 @@ func (r *DynamoNimRequestReconciler) Reconcile(ctx context.Context, req ctrl.Req ...@@ -194,9 +194,9 @@ func (r *DynamoNimRequestReconciler) Reconcile(ctx context.Context, req ctrl.Req
} }
} }
dynamoNimRequest, imageInfo, imageExists, imageExistsResult, err := r.ensureImageExists(ctx, ensureImageExistsOption{ dynamoComponentRequest, imageInfo, imageExists, imageExistsResult, err := r.ensureImageExists(ctx, ensureImageExistsOption{
dynamoNimRequest: dynamoNimRequest, dynamoComponentRequest: dynamoComponentRequest,
req: req, req: req,
}) })
if err != nil { if err != nil {
...@@ -206,12 +206,12 @@ func (r *DynamoNimRequestReconciler) Reconcile(ctx context.Context, req ctrl.Req ...@@ -206,12 +206,12 @@ func (r *DynamoNimRequestReconciler) Reconcile(ctx context.Context, req ctrl.Req
if !imageExists { if !imageExists {
result = imageExistsResult result = imageExistsResult
dynamoNimRequest, err = r.setStatusConditions(ctx, req, dynamoComponentRequest, err = r.setStatusConditions(ctx, req,
metav1.Condition{ metav1.Condition{
Type: nvidiacomv1alpha1.DynamoNimRequestConditionTypeDynamoNimAvailable, Type: nvidiacomv1alpha1.DynamoComponentRequestConditionTypeDynamoComponentAvailable,
Status: metav1.ConditionUnknown, Status: metav1.ConditionUnknown,
Reason: "Reconciling", Reason: "Reconciling",
Message: "DynamoNim image is building", Message: "DynamoComponent image is building",
}, },
) )
if err != nil { if err != nil {
...@@ -220,78 +220,64 @@ func (r *DynamoNimRequestReconciler) Reconcile(ctx context.Context, req ctrl.Req ...@@ -220,78 +220,64 @@ func (r *DynamoNimRequestReconciler) Reconcile(ctx context.Context, req ctrl.Req
return return
} }
dynamoNimCR := &nvidiacomv1alpha1.DynamoNim{ dynamoComponentCR := &nvidiacomv1alpha1.DynamoComponent{
ObjectMeta: metav1.ObjectMeta{ ObjectMeta: metav1.ObjectMeta{
Name: dynamoNimRequest.Name, Name: dynamoComponentRequest.Name,
Namespace: dynamoNimRequest.Namespace, Namespace: dynamoComponentRequest.Namespace,
}, },
Spec: nvidiacomv1alpha1.DynamoNimSpec{ Spec: nvidiacomv1alpha1.DynamoComponentSpec{
Tag: dynamoNimRequest.Spec.BentoTag, DynamoComponent: dynamoComponentRequest.Spec.DynamoComponent,
Image: imageInfo.ImageName, Image: imageInfo.ImageName,
ServiceName: dynamoNimRequest.Spec.ServiceName, ServiceName: dynamoComponentRequest.Spec.ServiceName,
Context: dynamoNimRequest.Spec.Context,
Models: dynamoNimRequest.Spec.Models,
}, },
} }
err = ctrl.SetControllerReference(dynamoNimRequest, dynamoNimCR, r.Scheme) err = ctrl.SetControllerReference(dynamoComponentRequest, dynamoComponentCR, r.Scheme)
if err != nil { if err != nil {
err = errors.Wrap(err, "set controller reference") err = errors.Wrap(err, "set controller reference")
return return
} }
if imageInfo.DockerConfigJSONSecretName != "" { if imageInfo.DockerConfigJSONSecretName != "" {
dynamoNimCR.Spec.ImagePullSecrets = []corev1.LocalObjectReference{ dynamoComponentCR.Spec.ImagePullSecrets = []corev1.LocalObjectReference{
{ {
Name: imageInfo.DockerConfigJSONSecretName, Name: imageInfo.DockerConfigJSONSecretName,
}, },
} }
} }
if dynamoNimRequest.Spec.DownloadURL == "" { r.Recorder.Eventf(dynamoComponentRequest, corev1.EventTypeNormal, "DynamoComponentImageBuilder", "Creating DynamoComponent CR %s in namespace %s", dynamoComponentCR.Name, dynamoComponentCR.Namespace)
var dynamoComponent *schemas.DynamoComponent err = r.Create(ctx, dynamoComponentCR)
dynamoComponent, err = r.getDynamoComponent(ctx, dynamoNimRequest)
if err != nil {
err = errors.Wrap(err, "get dynamo component")
return
}
dynamoNimCR.Spec.Context = &nvidiacomv1alpha1.BentoContext{
BentomlVersion: dynamoComponent.Manifest.BentomlVersion,
}
}
r.Recorder.Eventf(dynamoNimRequest, corev1.EventTypeNormal, "DynamoNimImageBuilder", "Creating DynamoNim CR %s in namespace %s", dynamoNimCR.Name, dynamoNimCR.Namespace)
err = r.Create(ctx, dynamoNimCR)
isAlreadyExists := k8serrors.IsAlreadyExists(err) isAlreadyExists := k8serrors.IsAlreadyExists(err)
if err != nil && !isAlreadyExists { if err != nil && !isAlreadyExists {
err = errors.Wrap(err, "create DynamoNim resource") err = errors.Wrap(err, "create DynamoComponent resource")
return return
} }
if isAlreadyExists { if isAlreadyExists {
oldDynamoNimCR := &nvidiacomv1alpha1.DynamoNim{} oldDynamoComponentCR := &nvidiacomv1alpha1.DynamoComponent{}
r.Recorder.Eventf(dynamoNimRequest, corev1.EventTypeNormal, "DynamoNimImageBuilder", "Updating DynamoNim CR %s in namespace %s", dynamoNimCR.Name, dynamoNimCR.Namespace) r.Recorder.Eventf(dynamoComponentRequest, corev1.EventTypeNormal, "DynamoComponentImageBuilder", "Updating DynamoComponent CR %s in namespace %s", dynamoComponentCR.Name, dynamoComponentCR.Namespace)
err = r.Get(ctx, types.NamespacedName{Name: dynamoNimCR.Name, Namespace: dynamoNimCR.Namespace}, oldDynamoNimCR) err = r.Get(ctx, types.NamespacedName{Name: dynamoComponentCR.Name, Namespace: dynamoComponentCR.Namespace}, oldDynamoComponentCR)
if err != nil { if err != nil {
err = errors.Wrap(err, "get DynamoNim resource") err = errors.Wrap(err, "get DynamoComponent resource")
return return
} }
if !reflect.DeepEqual(oldDynamoNimCR.Spec, dynamoNimCR.Spec) { if !reflect.DeepEqual(oldDynamoComponentCR.Spec, dynamoComponentCR.Spec) {
oldDynamoNimCR.OwnerReferences = dynamoNimCR.OwnerReferences oldDynamoComponentCR.OwnerReferences = dynamoComponentCR.OwnerReferences
oldDynamoNimCR.Spec = dynamoNimCR.Spec oldDynamoComponentCR.Spec = dynamoComponentCR.Spec
err = r.Update(ctx, oldDynamoNimCR) err = r.Update(ctx, oldDynamoComponentCR)
if err != nil { if err != nil {
err = errors.Wrap(err, "update DynamoNim resource") err = errors.Wrap(err, "update DynamoComponent resource")
return return
} }
} }
} }
dynamoNimRequest, err = r.setStatusConditions(ctx, req, dynamoComponentRequest, err = r.setStatusConditions(ctx, req,
metav1.Condition{ metav1.Condition{
Type: nvidiacomv1alpha1.DynamoNimRequestConditionTypeDynamoNimAvailable, Type: nvidiacomv1alpha1.DynamoComponentRequestConditionTypeDynamoComponentAvailable,
Status: metav1.ConditionTrue, Status: metav1.ConditionTrue,
Reason: "Reconciling", Reason: "Reconciling",
Message: "DynamoNim is generated", Message: "DynamoComponent is generated",
}, },
) )
if err != nil { if err != nil {
...@@ -306,100 +292,100 @@ func isEstargzEnabled() bool { ...@@ -306,100 +292,100 @@ func isEstargzEnabled() bool {
} }
type ensureImageExistsOption struct { type ensureImageExistsOption struct {
dynamoNimRequest *nvidiacomv1alpha1.DynamoNimRequest dynamoComponentRequest *nvidiacomv1alpha1.DynamoComponentRequest
req ctrl.Request req ctrl.Request
} }
//nolint:gocyclo,nakedret //nolint:gocyclo,nakedret
func (r *DynamoNimRequestReconciler) ensureImageExists(ctx context.Context, opt ensureImageExistsOption) (dynamoNimRequest *nvidiacomv1alpha1.DynamoNimRequest, imageInfo ImageInfo, imageExists bool, result ctrl.Result, err error) { // nolint: unparam func (r *DynamoComponentRequestReconciler) ensureImageExists(ctx context.Context, opt ensureImageExistsOption) (dynamoComponentRequest *nvidiacomv1alpha1.DynamoComponentRequest, imageInfo ImageInfo, imageExists bool, result ctrl.Result, err error) { // nolint: unparam
logs := log.FromContext(ctx) logs := log.FromContext(ctx)
dynamoNimRequest = opt.dynamoNimRequest dynamoComponentRequest = opt.dynamoComponentRequest
req := opt.req req := opt.req
imageInfo, err = r.getImageInfo(ctx, GetImageInfoOption{ imageInfo, err = r.getImageInfo(ctx, GetImageInfoOption{
DynamoNimRequest: dynamoNimRequest, DynamoComponentRequest: dynamoComponentRequest,
}) })
if err != nil { if err != nil {
err = errors.Wrap(err, "get image info") err = errors.Wrap(err, "get image info")
return return
} }
imageExistsCheckedCondition := meta.FindStatusCondition(dynamoNimRequest.Status.Conditions, nvidiacomv1alpha1.DynamoNimRequestConditionTypeImageExistsChecked) imageExistsCheckedCondition := meta.FindStatusCondition(dynamoComponentRequest.Status.Conditions, nvidiacomv1alpha1.DynamoComponentRequestConditionTypeImageExistsChecked)
imageExistsCondition := meta.FindStatusCondition(dynamoNimRequest.Status.Conditions, nvidiacomv1alpha1.DynamoNimRequestConditionTypeImageExists) imageExistsCondition := meta.FindStatusCondition(dynamoComponentRequest.Status.Conditions, nvidiacomv1alpha1.DynamoComponentRequestConditionTypeImageExists)
if imageExistsCheckedCondition == nil || imageExistsCheckedCondition.Status != metav1.ConditionTrue || imageExistsCheckedCondition.Message != imageInfo.ImageName { if imageExistsCheckedCondition == nil || imageExistsCheckedCondition.Status != metav1.ConditionTrue || imageExistsCheckedCondition.Message != imageInfo.ImageName {
imageExistsCheckedCondition = &metav1.Condition{ imageExistsCheckedCondition = &metav1.Condition{
Type: nvidiacomv1alpha1.DynamoNimRequestConditionTypeImageExistsChecked, Type: nvidiacomv1alpha1.DynamoComponentRequestConditionTypeImageExistsChecked,
Status: metav1.ConditionUnknown, Status: metav1.ConditionUnknown,
Reason: "Reconciling", Reason: "Reconciling",
Message: imageInfo.ImageName, Message: imageInfo.ImageName,
} }
dynamoNimAvailableCondition := &metav1.Condition{ dynamoComponentAvailableCondition := &metav1.Condition{
Type: nvidiacomv1alpha1.DynamoNimRequestConditionTypeDynamoNimAvailable, Type: nvidiacomv1alpha1.DynamoComponentRequestConditionTypeDynamoComponentAvailable,
Status: metav1.ConditionUnknown, Status: metav1.ConditionUnknown,
Reason: "Reconciling", Reason: "Reconciling",
Message: "Checking image exists", Message: "Checking image exists",
} }
dynamoNimRequest, err = r.setStatusConditions(ctx, req, *imageExistsCheckedCondition, *dynamoNimAvailableCondition) dynamoComponentRequest, err = r.setStatusConditions(ctx, req, *imageExistsCheckedCondition, *dynamoComponentAvailableCondition)
if err != nil { if err != nil {
return return
} }
r.Recorder.Eventf(dynamoNimRequest, corev1.EventTypeNormal, "CheckingImage", "Checking image exists: %s", imageInfo.ImageName) r.Recorder.Eventf(dynamoComponentRequest, corev1.EventTypeNormal, "CheckingImage", "Checking image exists: %s", imageInfo.ImageName)
imageExists, err = checkImageExists(dynamoNimRequest, imageInfo.DockerRegistry, imageInfo.InClusterImageName) imageExists, err = checkImageExists(dynamoComponentRequest, imageInfo.DockerRegistry, imageInfo.InClusterImageName)
if err != nil { if err != nil {
err = errors.Wrapf(err, "check image %s exists", imageInfo.ImageName) err = errors.Wrapf(err, "check image %s exists", imageInfo.ImageName)
return return
} }
err = r.Get(ctx, req.NamespacedName, dynamoNimRequest) err = r.Get(ctx, req.NamespacedName, dynamoComponentRequest)
if err != nil { if err != nil {
logs.Error(err, "Failed to re-fetch dynamoNimRequest") logs.Error(err, "Failed to re-fetch dynamoComponentRequest")
return return
} }
if imageExists { if imageExists {
r.Recorder.Eventf(dynamoNimRequest, corev1.EventTypeNormal, "CheckingImage", "Image exists: %s", imageInfo.ImageName) r.Recorder.Eventf(dynamoComponentRequest, corev1.EventTypeNormal, "CheckingImage", "Image exists: %s", imageInfo.ImageName)
imageExistsCheckedCondition = &metav1.Condition{ imageExistsCheckedCondition = &metav1.Condition{
Type: nvidiacomv1alpha1.DynamoNimRequestConditionTypeImageExistsChecked, Type: nvidiacomv1alpha1.DynamoComponentRequestConditionTypeImageExistsChecked,
Status: metav1.ConditionTrue, Status: metav1.ConditionTrue,
Reason: "Reconciling", Reason: "Reconciling",
Message: imageInfo.ImageName, Message: imageInfo.ImageName,
} }
imageExistsCondition = &metav1.Condition{ imageExistsCondition = &metav1.Condition{
Type: nvidiacomv1alpha1.DynamoNimRequestConditionTypeImageExists, Type: nvidiacomv1alpha1.DynamoComponentRequestConditionTypeImageExists,
Status: metav1.ConditionTrue, Status: metav1.ConditionTrue,
Reason: "Reconciling", Reason: "Reconciling",
Message: imageInfo.ImageName, Message: imageInfo.ImageName,
} }
dynamoNimRequest, err = r.setStatusConditions(ctx, req, *imageExistsCondition, *imageExistsCheckedCondition) dynamoComponentRequest, err = r.setStatusConditions(ctx, req, *imageExistsCondition, *imageExistsCheckedCondition)
if err != nil { if err != nil {
return return
} }
} else { } else {
r.Recorder.Eventf(dynamoNimRequest, corev1.EventTypeNormal, "CheckingImage", "Image not exists: %s", imageInfo.ImageName) r.Recorder.Eventf(dynamoComponentRequest, corev1.EventTypeNormal, "CheckingImage", "Image not exists: %s", imageInfo.ImageName)
imageExistsCheckedCondition = &metav1.Condition{ imageExistsCheckedCondition = &metav1.Condition{
Type: nvidiacomv1alpha1.DynamoNimRequestConditionTypeImageExistsChecked, Type: nvidiacomv1alpha1.DynamoComponentRequestConditionTypeImageExistsChecked,
Status: metav1.ConditionFalse, Status: metav1.ConditionFalse,
Reason: "Reconciling", Reason: "Reconciling",
Message: fmt.Sprintf("Image not exists: %s", imageInfo.ImageName), Message: fmt.Sprintf("Image not exists: %s", imageInfo.ImageName),
} }
imageExistsCondition = &metav1.Condition{ imageExistsCondition = &metav1.Condition{
Type: nvidiacomv1alpha1.DynamoNimRequestConditionTypeImageExists, Type: nvidiacomv1alpha1.DynamoComponentRequestConditionTypeImageExists,
Status: metav1.ConditionFalse, Status: metav1.ConditionFalse,
Reason: "Reconciling", Reason: "Reconciling",
Message: fmt.Sprintf("Image %s is not exists", imageInfo.ImageName), Message: fmt.Sprintf("Image %s is not exists", imageInfo.ImageName),
} }
dynamoNimRequest, err = r.setStatusConditions(ctx, req, *imageExistsCondition, *imageExistsCheckedCondition) dynamoComponentRequest, err = r.setStatusConditions(ctx, req, *imageExistsCondition, *imageExistsCheckedCondition)
if err != nil { if err != nil {
return return
} }
} }
} }
var dynamoNimRequestHashStr string var dynamoComponentRequestHashStr string
dynamoNimRequestHashStr, err = r.getHashStr(dynamoNimRequest) dynamoComponentRequestHashStr, err = r.getHashStr(dynamoComponentRequest)
if err != nil { if err != nil {
err = errors.Wrapf(err, "get dynamoNimRequest %s/%s hash string", dynamoNimRequest.Namespace, dynamoNimRequest.Name) err = errors.Wrapf(err, "get dynamoComponentRequest %s/%s hash string", dynamoComponentRequest.Namespace, dynamoComponentRequest.Name)
return return
} }
...@@ -409,8 +395,8 @@ func (r *DynamoNimRequestReconciler) ensureImageExists(ctx context.Context, opt ...@@ -409,8 +395,8 @@ func (r *DynamoNimRequestReconciler) ensureImageExists(ctx context.Context, opt
} }
jobLabels := map[string]string{ jobLabels := map[string]string{
commonconsts.KubeLabelDynamoRequest: dynamoNimRequest.Name, commonconsts.KubeLabelDynamoComponentRequest: dynamoComponentRequest.Name,
commonconsts.KubeLabelIsDynamoImageBuilder: commonconsts.KubeLabelValueTrue, commonconsts.KubeLabelIsDynamoImageBuilder: commonconsts.KubeLabelValueTrue,
} }
jobs := &batchv1.JobList{} jobs := &batchv1.JobList{}
...@@ -424,9 +410,9 @@ func (r *DynamoNimRequestReconciler) ensureImageExists(ctx context.Context, opt ...@@ -424,9 +410,9 @@ func (r *DynamoNimRequestReconciler) ensureImageExists(ctx context.Context, opt
for _, job_ := range jobs.Items { for _, job_ := range jobs.Items {
job_ := job_ job_ := job_
oldHash := job_.Annotations[consts.KubeAnnotationDynamoNimRequestHash] oldHash := job_.Annotations[consts.KubeAnnotationDynamoComponentRequestHash]
if oldHash != dynamoNimRequestHashStr { if oldHash != dynamoComponentRequestHashStr {
logs.Info("Because hash changed, delete old job", "job", job_.Name, "oldHash", oldHash, "newHash", dynamoNimRequestHashStr) logs.Info("Because hash changed, delete old job", "job", job_.Name, "oldHash", oldHash, "newHash", dynamoComponentRequestHashStr)
// --cascade=foreground // --cascade=foreground
err = r.Delete(ctx, &job_, &client.DeleteOptions{ err = r.Delete(ctx, &job_, &client.DeleteOptions{
PropagationPolicy: &[]metav1.DeletionPropagation{metav1.DeletePropagationForeground}[0], PropagationPolicy: &[]metav1.DeletionPropagation{metav1.DeletePropagationForeground}[0],
...@@ -462,31 +448,31 @@ func (r *DynamoNimRequestReconciler) ensureImageExists(ctx context.Context, opt ...@@ -462,31 +448,31 @@ func (r *DynamoNimRequestReconciler) ensureImageExists(ctx context.Context, opt
if job == nil { if job == nil {
job, err = r.generateImageBuilderJob(ctx, GenerateImageBuilderJobOption{ job, err = r.generateImageBuilderJob(ctx, GenerateImageBuilderJobOption{
ImageInfo: imageInfo, ImageInfo: imageInfo,
DynamoNimRequest: dynamoNimRequest, DynamoComponentRequest: dynamoComponentRequest,
}) })
if err != nil { if err != nil {
err = errors.Wrap(err, "generate image builder job") err = errors.Wrap(err, "generate image builder job")
return return
} }
r.Recorder.Eventf(dynamoNimRequest, corev1.EventTypeNormal, "GenerateImageBuilderJob", "Creating image builder job: %s", job.Name) r.Recorder.Eventf(dynamoComponentRequest, corev1.EventTypeNormal, "GenerateImageBuilderJob", "Creating image builder job: %s", job.Name)
err = r.Create(ctx, job) err = r.Create(ctx, job)
if err != nil { if err != nil {
err = errors.Wrapf(err, "create image builder job %s", job.Name) err = errors.Wrapf(err, "create image builder job %s", job.Name)
return return
} }
r.Recorder.Eventf(dynamoNimRequest, corev1.EventTypeNormal, "GenerateImageBuilderJob", "Created image builder job: %s", job.Name) r.Recorder.Eventf(dynamoComponentRequest, corev1.EventTypeNormal, "GenerateImageBuilderJob", "Created image builder job: %s", job.Name)
return return
} }
r.Recorder.Eventf(dynamoNimRequest, corev1.EventTypeNormal, "CheckingImageBuilderJob", "Found image builder job: %s", job.Name) r.Recorder.Eventf(dynamoComponentRequest, corev1.EventTypeNormal, "CheckingImageBuilderJob", "Found image builder job: %s", job.Name)
err = r.Get(ctx, req.NamespacedName, dynamoNimRequest) err = r.Get(ctx, req.NamespacedName, dynamoComponentRequest)
if err != nil { if err != nil {
logs.Error(err, "Failed to re-fetch dynamoNimRequest") logs.Error(err, "Failed to re-fetch dynamoComponentRequest")
return return
} }
imageBuildingCondition := meta.FindStatusCondition(dynamoNimRequest.Status.Conditions, nvidiacomv1alpha1.DynamoNimRequestConditionTypeImageBuilding) imageBuildingCondition := meta.FindStatusCondition(dynamoComponentRequest.Status.Conditions, nvidiacomv1alpha1.DynamoComponentRequestConditionTypeImageBuilding)
isJobFailed := false isJobFailed := false
isJobRunning := true isJobRunning := true
...@@ -511,23 +497,23 @@ func (r *DynamoNimRequestReconciler) ensureImageExists(ctx context.Context, opt ...@@ -511,23 +497,23 @@ func (r *DynamoNimRequestReconciler) ensureImageExists(ctx context.Context, opt
conditions := make([]metav1.Condition, 0) conditions := make([]metav1.Condition, 0)
if job.Status.Active > 0 { if job.Status.Active > 0 {
conditions = append(conditions, metav1.Condition{ conditions = append(conditions, metav1.Condition{
Type: nvidiacomv1alpha1.DynamoNimRequestConditionTypeImageBuilding, Type: nvidiacomv1alpha1.DynamoComponentRequestConditionTypeImageBuilding,
Status: metav1.ConditionTrue, Status: metav1.ConditionTrue,
Reason: "Reconciling", Reason: "Reconciling",
Message: fmt.Sprintf("Image building job %s is running", job.Name), Message: fmt.Sprintf("Image building job %s is running", job.Name),
}) })
} else { } else {
conditions = append(conditions, metav1.Condition{ conditions = append(conditions, metav1.Condition{
Type: nvidiacomv1alpha1.DynamoNimRequestConditionTypeImageBuilding, Type: nvidiacomv1alpha1.DynamoComponentRequestConditionTypeImageBuilding,
Status: metav1.ConditionUnknown, Status: metav1.ConditionUnknown,
Reason: "Reconciling", Reason: "Reconciling",
Message: fmt.Sprintf("Image building job %s is waiting", job.Name), Message: fmt.Sprintf("Image building job %s is waiting", job.Name),
}) })
} }
if dynamoNimRequest.Spec.ImageBuildTimeout != nil { if dynamoComponentRequest.Spec.ImageBuildTimeout != nil {
if imageBuildingCondition != nil && imageBuildingCondition.LastTransitionTime.Add(time.Duration(*dynamoNimRequest.Spec.ImageBuildTimeout)).Before(time.Now()) { if imageBuildingCondition != nil && imageBuildingCondition.LastTransitionTime.Add(time.Duration(*dynamoComponentRequest.Spec.ImageBuildTimeout)).Before(time.Now()) {
conditions = append(conditions, metav1.Condition{ conditions = append(conditions, metav1.Condition{
Type: nvidiacomv1alpha1.DynamoNimRequestConditionTypeImageBuilding, Type: nvidiacomv1alpha1.DynamoComponentRequestConditionTypeImageBuilding,
Status: metav1.ConditionFalse, Status: metav1.ConditionFalse,
Reason: "Timeout", Reason: "Timeout",
Message: fmt.Sprintf("Image building job %s is timeout", job.Name), Message: fmt.Sprintf("Image building job %s is timeout", job.Name),
...@@ -540,27 +526,27 @@ func (r *DynamoNimRequestReconciler) ensureImageExists(ctx context.Context, opt ...@@ -540,27 +526,27 @@ func (r *DynamoNimRequestReconciler) ensureImageExists(ctx context.Context, opt
} }
} }
if dynamoNimRequest, err = r.setStatusConditions(ctx, req, conditions...); err != nil { if dynamoComponentRequest, err = r.setStatusConditions(ctx, req, conditions...); err != nil {
return return
} }
if imageBuildingCondition != nil && imageBuildingCondition.Status != metav1.ConditionTrue && isJobRunning { if imageBuildingCondition != nil && imageBuildingCondition.Status != metav1.ConditionTrue && isJobRunning {
r.Recorder.Eventf(dynamoNimRequest, corev1.EventTypeNormal, "DynamoNimImageBuilder", "Image is building now") r.Recorder.Eventf(dynamoComponentRequest, corev1.EventTypeNormal, "DynamoComponentImageBuilder", "Image is building now")
} }
return return
} }
if isJobFailed { if isJobFailed {
dynamoNimRequest, err = r.setStatusConditions(ctx, req, dynamoComponentRequest, err = r.setStatusConditions(ctx, req,
metav1.Condition{ metav1.Condition{
Type: nvidiacomv1alpha1.DynamoNimRequestConditionTypeImageBuilding, Type: nvidiacomv1alpha1.DynamoComponentRequestConditionTypeImageBuilding,
Status: metav1.ConditionFalse, Status: metav1.ConditionFalse,
Reason: "Reconciling", Reason: "Reconciling",
Message: fmt.Sprintf("Image building job %s is failed.", job.Name), Message: fmt.Sprintf("Image building job %s is failed.", job.Name),
}, },
metav1.Condition{ metav1.Condition{
Type: nvidiacomv1alpha1.DynamoNimRequestConditionTypeDynamoNimAvailable, Type: nvidiacomv1alpha1.DynamoComponentRequestConditionTypeDynamoComponentAvailable,
Status: metav1.ConditionFalse, Status: metav1.ConditionFalse,
Reason: "Reconciling", Reason: "Reconciling",
Message: fmt.Sprintf("Image building job %s is failed.", job.Name), Message: fmt.Sprintf("Image building job %s is failed.", job.Name),
...@@ -572,15 +558,15 @@ func (r *DynamoNimRequestReconciler) ensureImageExists(ctx context.Context, opt ...@@ -572,15 +558,15 @@ func (r *DynamoNimRequestReconciler) ensureImageExists(ctx context.Context, opt
return return
} }
dynamoNimRequest, err = r.setStatusConditions(ctx, req, dynamoComponentRequest, err = r.setStatusConditions(ctx, req,
metav1.Condition{ metav1.Condition{
Type: nvidiacomv1alpha1.DynamoNimRequestConditionTypeImageBuilding, Type: nvidiacomv1alpha1.DynamoComponentRequestConditionTypeImageBuilding,
Status: metav1.ConditionFalse, Status: metav1.ConditionFalse,
Reason: "Reconciling", Reason: "Reconciling",
Message: fmt.Sprintf("Image building job %s is succeeded.", job.Name), Message: fmt.Sprintf("Image building job %s is succeeded.", job.Name),
}, },
metav1.Condition{ metav1.Condition{
Type: nvidiacomv1alpha1.DynamoNimRequestConditionTypeImageExists, Type: nvidiacomv1alpha1.DynamoComponentRequestConditionTypeImageExists,
Status: metav1.ConditionTrue, Status: metav1.ConditionTrue,
Reason: "Reconciling", Reason: "Reconciling",
Message: imageInfo.ImageName, Message: imageInfo.ImageName,
...@@ -590,67 +576,67 @@ func (r *DynamoNimRequestReconciler) ensureImageExists(ctx context.Context, opt ...@@ -590,67 +576,67 @@ func (r *DynamoNimRequestReconciler) ensureImageExists(ctx context.Context, opt
return return
} }
r.Recorder.Eventf(dynamoNimRequest, corev1.EventTypeNormal, "DynamoNimImageBuilder", "Image has been built successfully") r.Recorder.Eventf(dynamoComponentRequest, corev1.EventTypeNormal, "DynamoComponentImageBuilder", "Image has been built successfully")
imageExists = true imageExists = true
return return
} }
func (r *DynamoNimRequestReconciler) setStatusConditions(ctx context.Context, req ctrl.Request, conditions ...metav1.Condition) (dynamoNimRequest *nvidiacomv1alpha1.DynamoNimRequest, err error) { func (r *DynamoComponentRequestReconciler) setStatusConditions(ctx context.Context, req ctrl.Request, conditions ...metav1.Condition) (dynamoComponentRequest *nvidiacomv1alpha1.DynamoComponentRequest, err error) {
dynamoNimRequest = &nvidiacomv1alpha1.DynamoNimRequest{} dynamoComponentRequest = &nvidiacomv1alpha1.DynamoComponentRequest{}
/* /*
Please don't blame me when you see this kind of code, Please don't blame me when you see this kind of code,
this is to avoid "the object has been modified; please apply your changes to the latest version and try again" when updating CR status, this is to avoid "the object has been modified; please apply your changes to the latest version and try again" when updating CR status,
don't doubt that almost all CRD operators (e.g. cert-manager) can't avoid this stupid error and can only try to avoid this by this stupid way. don't doubt that almost all CRD operators (e.g. cert-manager) can't avoid this stupid error and can only try to avoid this by this stupid way.
*/ */
for i := 0; i < 3; i++ { for i := 0; i < 3; i++ {
if err = r.Get(ctx, req.NamespacedName, dynamoNimRequest); err != nil { if err = r.Get(ctx, req.NamespacedName, dynamoComponentRequest); err != nil {
err = errors.Wrap(err, "Failed to re-fetch dynamoNimRequest") err = errors.Wrap(err, "Failed to re-fetch dynamoComponentRequest")
return return
} }
for _, condition := range conditions { for _, condition := range conditions {
meta.SetStatusCondition(&dynamoNimRequest.Status.Conditions, condition) meta.SetStatusCondition(&dynamoComponentRequest.Status.Conditions, condition)
} }
if err = r.Status().Update(ctx, dynamoNimRequest); err != nil { if err = r.Status().Update(ctx, dynamoComponentRequest); err != nil {
time.Sleep(100 * time.Millisecond) time.Sleep(100 * time.Millisecond)
} else { } else {
break break
} }
} }
if err != nil { if err != nil {
err = errors.Wrap(err, "Failed to update dynamoNimRequest status") err = errors.Wrap(err, "Failed to update dynamoComponentRequest status")
return return
} }
if err = r.Get(ctx, req.NamespacedName, dynamoNimRequest); err != nil { if err = r.Get(ctx, req.NamespacedName, dynamoComponentRequest); err != nil {
err = errors.Wrap(err, "Failed to re-fetch dynamoNimRequest") err = errors.Wrap(err, "Failed to re-fetch dynamoComponentRequest")
return return
} }
return return
} }
type DynamoNimImageBuildEngine string type DynamoComponentImageBuildEngine string
const ( const (
DynamoNimImageBuildEngineKaniko DynamoNimImageBuildEngine = "kaniko" DynamoComponentImageBuildEngineKaniko DynamoComponentImageBuildEngine = "kaniko"
DynamoNimImageBuildEngineBuildkit DynamoNimImageBuildEngine = "buildkit" DynamoComponentImageBuildEngineBuildkit DynamoComponentImageBuildEngine = "buildkit"
DynamoNimImageBuildEngineBuildkitRootless DynamoNimImageBuildEngine = "buildkit-rootless" DynamoComponentImageBuildEngineBuildkitRootless DynamoComponentImageBuildEngine = "buildkit-rootless"
) )
const ( const (
EnvDynamoImageBuildEngine = "DYNAMO_IMAGE_BUILD_ENGINE" EnvDynamoImageBuildEngine = "DYNAMO_IMAGE_BUILD_ENGINE"
) )
func getDynamoNimImageBuildEngine() DynamoNimImageBuildEngine { func getDynamoComponentImageBuildEngine() DynamoComponentImageBuildEngine {
engine := os.Getenv(EnvDynamoImageBuildEngine) engine := os.Getenv(EnvDynamoImageBuildEngine)
if engine == "" { if engine == "" {
return DynamoNimImageBuildEngineKaniko return DynamoComponentImageBuildEngineKaniko
} }
return DynamoNimImageBuildEngine(engine) return DynamoComponentImageBuildEngine(engine)
} }
//nolint:nakedret //nolint:nakedret
func (r *DynamoNimRequestReconciler) makeSureDockerConfigJSONSecret(ctx context.Context, namespace string, dockerRegistryConf *commonconfig.DockerRegistryConfig) (dockerConfigJSONSecret *corev1.Secret, err error) { func (r *DynamoComponentRequestReconciler) makeSureDockerConfigJSONSecret(ctx context.Context, namespace string, dockerRegistryConf *commonconfig.DockerRegistryConfig) (dockerConfigJSONSecret *corev1.Secret, err error) {
if dockerRegistryConf.Username == "" { if dockerRegistryConf.Username == "" {
return return
} }
...@@ -728,7 +714,7 @@ func (r *DynamoNimRequestReconciler) makeSureDockerConfigJSONSecret(ctx context. ...@@ -728,7 +714,7 @@ func (r *DynamoNimRequestReconciler) makeSureDockerConfigJSONSecret(ctx context.
} }
//nolint:nakedret //nolint:nakedret
func (r *DynamoNimRequestReconciler) getApiStoreClient(ctx context.Context) (*apiStoreClient.ApiStoreClient, *commonconfig.ApiStoreConfig, error) { func (r *DynamoComponentRequestReconciler) getApiStoreClient(ctx context.Context) (*apiStoreClient.ApiStoreClient, *commonconfig.ApiStoreConfig, error) {
apiStoreConf, err := commonconfig.GetApiStoreConfig(ctx) apiStoreConf, err := commonconfig.GetApiStoreConfig(ctx)
isNotFound := k8serrors.IsNotFound(err) isNotFound := k8serrors.IsNotFound(err)
if err != nil && !isNotFound { if err != nil && !isNotFound {
...@@ -754,20 +740,20 @@ func (r *DynamoNimRequestReconciler) getApiStoreClient(ctx context.Context) (*ap ...@@ -754,20 +740,20 @@ func (r *DynamoNimRequestReconciler) getApiStoreClient(ctx context.Context) (*ap
} }
//nolint:nakedret //nolint:nakedret
func (r *DynamoNimRequestReconciler) getDockerRegistry(ctx context.Context, dynamoNimRequest *nvidiacomv1alpha1.DynamoNimRequest) (dockerRegistry schemas.DockerRegistrySchema, err error) { func (r *DynamoComponentRequestReconciler) getDockerRegistry(ctx context.Context, dynamoComponentRequest *nvidiacomv1alpha1.DynamoComponentRequest) (dockerRegistry schemas.DockerRegistrySchema, err error) {
if dynamoNimRequest != nil && dynamoNimRequest.Spec.DockerConfigJSONSecretName != "" { if dynamoComponentRequest != nil && dynamoComponentRequest.Spec.DockerConfigJSONSecretName != "" {
secret := &corev1.Secret{} secret := &corev1.Secret{}
err = r.Get(ctx, types.NamespacedName{ err = r.Get(ctx, types.NamespacedName{
Namespace: dynamoNimRequest.Namespace, Namespace: dynamoComponentRequest.Namespace,
Name: dynamoNimRequest.Spec.DockerConfigJSONSecretName, Name: dynamoComponentRequest.Spec.DockerConfigJSONSecretName,
}, secret) }, secret)
if err != nil { if err != nil {
err = errors.Wrapf(err, "get docker config json secret %s", dynamoNimRequest.Spec.DockerConfigJSONSecretName) err = errors.Wrapf(err, "get docker config json secret %s", dynamoComponentRequest.Spec.DockerConfigJSONSecretName)
return return
} }
configJSON, ok := secret.Data[".dockerconfigjson"] configJSON, ok := secret.Data[".dockerconfigjson"]
if !ok { if !ok {
err = errors.Errorf("docker config json secret %s does not have .dockerconfigjson key", dynamoNimRequest.Spec.DockerConfigJSONSecretName) err = errors.Errorf("docker config json secret %s does not have .dockerconfigjson key", dynamoComponentRequest.Spec.DockerConfigJSONSecretName)
return return
} }
var configObj struct { var configObj struct {
...@@ -777,10 +763,10 @@ func (r *DynamoNimRequestReconciler) getDockerRegistry(ctx context.Context, dyna ...@@ -777,10 +763,10 @@ func (r *DynamoNimRequestReconciler) getDockerRegistry(ctx context.Context, dyna
} }
err = json.Unmarshal(configJSON, &configObj) err = json.Unmarshal(configJSON, &configObj)
if err != nil { if err != nil {
err = errors.Wrapf(err, "unmarshal docker config json secret %s", dynamoNimRequest.Spec.DockerConfigJSONSecretName) err = errors.Wrapf(err, "unmarshal docker config json secret %s", dynamoComponentRequest.Spec.DockerConfigJSONSecretName)
return return
} }
imageRegistryURI, _, _ := xstrings.Partition(dynamoNimRequest.Spec.Image, "/") imageRegistryURI, _, _ := xstrings.Partition(dynamoComponentRequest.Spec.Image, "/")
var server string var server string
var auth string var auth string
if imageRegistryURI != "" { if imageRegistryURI != "" {
...@@ -809,19 +795,19 @@ func (r *DynamoNimRequestReconciler) getDockerRegistry(ctx context.Context, dyna ...@@ -809,19 +795,19 @@ func (r *DynamoNimRequestReconciler) getDockerRegistry(ctx context.Context, dyna
} }
} }
if server == "" { if server == "" {
err = errors.Errorf("no auth in docker config json secret %s", dynamoNimRequest.Spec.DockerConfigJSONSecretName) err = errors.Errorf("no auth in docker config json secret %s", dynamoComponentRequest.Spec.DockerConfigJSONSecretName)
return return
} }
dockerRegistry.Server = server dockerRegistry.Server = server
var credentials []byte var credentials []byte
credentials, err = base64.StdEncoding.DecodeString(auth) credentials, err = base64.StdEncoding.DecodeString(auth)
if err != nil { if err != nil {
err = errors.Wrapf(err, "cannot base64 decode auth in docker config json secret %s", dynamoNimRequest.Spec.DockerConfigJSONSecretName) err = errors.Wrapf(err, "cannot base64 decode auth in docker config json secret %s", dynamoComponentRequest.Spec.DockerConfigJSONSecretName)
return return
} }
dockerRegistry.Username, _, dockerRegistry.Password = xstrings.Partition(string(credentials), ":") dockerRegistry.Username, _, dockerRegistry.Password = xstrings.Partition(string(credentials), ":")
if dynamoNimRequest.Spec.OCIRegistryInsecure != nil { if dynamoComponentRequest.Spec.OCIRegistryInsecure != nil {
dockerRegistry.Secure = !*dynamoNimRequest.Spec.OCIRegistryInsecure dockerRegistry.Secure = !*dynamoComponentRequest.Spec.OCIRegistryInsecure
} }
return return
} }
...@@ -863,23 +849,23 @@ func isAddNamespacePrefix() bool { ...@@ -863,23 +849,23 @@ func isAddNamespacePrefix() bool {
return os.Getenv("ADD_NAMESPACE_PREFIX_TO_IMAGE_NAME") == trueStr return os.Getenv("ADD_NAMESPACE_PREFIX_TO_IMAGE_NAME") == trueStr
} }
func getDynamoNimImagePrefix(dynamoNimRequest *nvidiacomv1alpha1.DynamoNimRequest) string { func getDynamoComponentImagePrefix(dynamoComponentRequest *nvidiacomv1alpha1.DynamoComponentRequest) string {
if dynamoNimRequest == nil { if dynamoComponentRequest == nil {
return "" return ""
} }
prefix, exist := dynamoNimRequest.Annotations[consts.KubeAnnotationDynamoNimStorageNS] prefix, exist := dynamoComponentRequest.Annotations[consts.KubeAnnotationDynamoComponentStorageNS]
if exist && prefix != "" { if exist && prefix != "" {
return fmt.Sprintf("%s.", prefix) return fmt.Sprintf("%s.", prefix)
} }
if isAddNamespacePrefix() { if isAddNamespacePrefix() {
return fmt.Sprintf("%s.", dynamoNimRequest.Namespace) return fmt.Sprintf("%s.", dynamoComponentRequest.Namespace)
} }
return "" return ""
} }
func getDynamoNimImageName(dynamoNimRequest *nvidiacomv1alpha1.DynamoNimRequest, dockerRegistry schemas.DockerRegistrySchema, dynamoNimRepositoryName, dynamoNimVersion string, inCluster bool) string { func getDynamoComponentImageName(dynamoComponentRequest *nvidiacomv1alpha1.DynamoComponentRequest, dockerRegistry schemas.DockerRegistrySchema, dynamoComponentRepositoryName, dynamoComponentVersion string, inCluster bool) string {
if dynamoNimRequest != nil && dynamoNimRequest.Spec.Image != "" { if dynamoComponentRequest != nil && dynamoComponentRequest.Spec.Image != "" {
return dynamoNimRequest.Spec.Image return dynamoComponentRequest.Spec.Image
} }
var uri, tag string var uri, tag string
if inCluster { if inCluster {
...@@ -887,25 +873,25 @@ func getDynamoNimImageName(dynamoNimRequest *nvidiacomv1alpha1.DynamoNimRequest, ...@@ -887,25 +873,25 @@ func getDynamoNimImageName(dynamoNimRequest *nvidiacomv1alpha1.DynamoNimRequest,
} else { } else {
uri = dockerRegistry.DynamoRepositoryURI uri = dockerRegistry.DynamoRepositoryURI
} }
tail := fmt.Sprintf("%s.%s", dynamoNimRepositoryName, dynamoNimVersion) tail := fmt.Sprintf("%s.%s", dynamoComponentRepositoryName, dynamoComponentVersion)
if isEstargzEnabled() { if isEstargzEnabled() {
tail += ".esgz" tail += ".esgz"
} }
tag = fmt.Sprintf("dynamo.%s%s", getDynamoNimImagePrefix(dynamoNimRequest), tail) tag = fmt.Sprintf("dynamo.%s%s", getDynamoComponentImagePrefix(dynamoComponentRequest), tail)
if len(tag) > 128 { if len(tag) > 128 {
hashStr := hash(tail) hashStr := hash(tail)
tag = fmt.Sprintf("dynamo.%s%s", getDynamoNimImagePrefix(dynamoNimRequest), hashStr) tag = fmt.Sprintf("dynamo.%s%s", getDynamoComponentImagePrefix(dynamoComponentRequest), hashStr)
if len(tag) > 128 { if len(tag) > 128 {
tag = fmt.Sprintf("dynamo.%s", hash(fmt.Sprintf("%s%s", getDynamoNimImagePrefix(dynamoNimRequest), tail)))[:128] tag = fmt.Sprintf("dynamo.%s", hash(fmt.Sprintf("%s%s", getDynamoComponentImagePrefix(dynamoComponentRequest), tail)))[:128]
} }
} }
return fmt.Sprintf("%s:%s", uri, tag) return fmt.Sprintf("%s:%s", uri, tag)
} }
func checkImageExists(dynamoNimRequest *nvidiacomv1alpha1.DynamoNimRequest, dockerRegistry schemas.DockerRegistrySchema, imageName string) (bool, error) { func checkImageExists(dynamoComponentRequest *nvidiacomv1alpha1.DynamoComponentRequest, dockerRegistry schemas.DockerRegistrySchema, imageName string) (bool, error) {
if dynamoNimRequest.Annotations["nvidia.com/force-build-image"] == commonconsts.KubeLabelValueTrue { if dynamoComponentRequest.Annotations["nvidia.com/force-build-image"] == commonconsts.KubeLabelValueTrue {
return false, nil return false, nil
} }
...@@ -950,26 +936,26 @@ type ImageInfo struct { ...@@ -950,26 +936,26 @@ type ImageInfo struct {
} }
type GetImageInfoOption struct { type GetImageInfoOption struct {
DynamoNimRequest *nvidiacomv1alpha1.DynamoNimRequest DynamoComponentRequest *nvidiacomv1alpha1.DynamoComponentRequest
} }
//nolint:nakedret //nolint:nakedret
func (r *DynamoNimRequestReconciler) getImageInfo(ctx context.Context, opt GetImageInfoOption) (imageInfo ImageInfo, err error) { func (r *DynamoComponentRequestReconciler) getImageInfo(ctx context.Context, opt GetImageInfoOption) (imageInfo ImageInfo, err error) {
dynamoNimRepositoryName, _, dynamoNimVersion := xstrings.Partition(opt.DynamoNimRequest.Spec.BentoTag, ":") dynamoComponentRepositoryName, _, dynamoComponentVersion := xstrings.Partition(opt.DynamoComponentRequest.Spec.DynamoComponent, ":")
dockerRegistry, err := r.getDockerRegistry(ctx, opt.DynamoNimRequest) dockerRegistry, err := r.getDockerRegistry(ctx, opt.DynamoComponentRequest)
if err != nil { if err != nil {
err = errors.Wrap(err, "get docker registry") err = errors.Wrap(err, "get docker registry")
return return
} }
imageInfo.DockerRegistry = dockerRegistry imageInfo.DockerRegistry = dockerRegistry
imageInfo.ImageName = getDynamoNimImageName(opt.DynamoNimRequest, dockerRegistry, dynamoNimRepositoryName, dynamoNimVersion, false) imageInfo.ImageName = getDynamoComponentImageName(opt.DynamoComponentRequest, dockerRegistry, dynamoComponentRepositoryName, dynamoComponentVersion, false)
imageInfo.InClusterImageName = getDynamoNimImageName(opt.DynamoNimRequest, dockerRegistry, dynamoNimRepositoryName, dynamoNimVersion, true) imageInfo.InClusterImageName = getDynamoComponentImageName(opt.DynamoComponentRequest, dockerRegistry, dynamoComponentRepositoryName, dynamoComponentVersion, true)
imageInfo.DockerConfigJSONSecretName = opt.DynamoNimRequest.Spec.DockerConfigJSONSecretName imageInfo.DockerConfigJSONSecretName = opt.DynamoComponentRequest.Spec.DockerConfigJSONSecretName
imageInfo.DockerRegistryInsecure = opt.DynamoNimRequest.Annotations[commonconsts.KubeAnnotationDynamoDockerRegistryInsecure] == "true" imageInfo.DockerRegistryInsecure = opt.DynamoComponentRequest.Annotations[commonconsts.KubeAnnotationDynamoDockerRegistryInsecure] == "true"
if opt.DynamoNimRequest.Spec.OCIRegistryInsecure != nil { if opt.DynamoComponentRequest.Spec.OCIRegistryInsecure != nil {
imageInfo.DockerRegistryInsecure = *opt.DynamoNimRequest.Spec.OCIRegistryInsecure imageInfo.DockerRegistryInsecure = *opt.DynamoComponentRequest.Spec.OCIRegistryInsecure
} }
if imageInfo.DockerConfigJSONSecretName == "" { if imageInfo.DockerConfigJSONSecretName == "" {
...@@ -981,13 +967,13 @@ func (r *DynamoNimRequestReconciler) getImageInfo(ctx context.Context, opt GetIm ...@@ -981,13 +967,13 @@ func (r *DynamoNimRequestReconciler) getImageInfo(ctx context.Context, opt GetIm
} }
imageInfo.DockerRegistryInsecure = !dockerRegistryConf.Secure imageInfo.DockerRegistryInsecure = !dockerRegistryConf.Secure
var dockerConfigSecret *corev1.Secret var dockerConfigSecret *corev1.Secret
r.Recorder.Eventf(opt.DynamoNimRequest, corev1.EventTypeNormal, "GenerateImageBuilderPod", "Making sure docker config secret %s in namespace %s", commonconsts.KubeSecretNameRegcred, opt.DynamoNimRequest.Namespace) r.Recorder.Eventf(opt.DynamoComponentRequest, corev1.EventTypeNormal, "GenerateImageBuilderPod", "Making sure docker config secret %s in namespace %s", commonconsts.KubeSecretNameRegcred, opt.DynamoComponentRequest.Namespace)
dockerConfigSecret, err = r.makeSureDockerConfigJSONSecret(ctx, opt.DynamoNimRequest.Namespace, dockerRegistryConf) dockerConfigSecret, err = r.makeSureDockerConfigJSONSecret(ctx, opt.DynamoComponentRequest.Namespace, dockerRegistryConf)
if err != nil { if err != nil {
err = errors.Wrap(err, "make sure docker config secret") err = errors.Wrap(err, "make sure docker config secret")
return return
} }
r.Recorder.Eventf(opt.DynamoNimRequest, corev1.EventTypeNormal, "GenerateImageBuilderPod", "Docker config secret %s in namespace %s is ready", commonconsts.KubeSecretNameRegcred, opt.DynamoNimRequest.Namespace) r.Recorder.Eventf(opt.DynamoComponentRequest, corev1.EventTypeNormal, "GenerateImageBuilderPod", "Docker config secret %s in namespace %s is ready", commonconsts.KubeSecretNameRegcred, opt.DynamoComponentRequest.Namespace)
if dockerConfigSecret != nil { if dockerConfigSecret != nil {
imageInfo.DockerConfigJSONSecretName = dockerConfigSecret.Name imageInfo.DockerConfigJSONSecretName = dockerConfigSecret.Name
} }
...@@ -995,54 +981,22 @@ func (r *DynamoNimRequestReconciler) getImageInfo(ctx context.Context, opt GetIm ...@@ -995,54 +981,22 @@ func (r *DynamoNimRequestReconciler) getImageInfo(ctx context.Context, opt GetIm
return return
} }
func (r *DynamoNimRequestReconciler) getDynamoComponent(ctx context.Context, dynamoNimRequest *nvidiacomv1alpha1.DynamoNimRequest) (dynamoComponent *schemas.DynamoComponent, err error) { func (r *DynamoComponentRequestReconciler) getImageBuilderJobName() string {
dynamoComponentRepositoryName, _, dynamoComponentVersion := xstrings.Partition(dynamoNimRequest.Spec.BentoTag, ":")
apiStoreClient, _, err := r.getApiStoreClient(ctx)
if err != nil {
err = errors.Wrap(err, "get api store client")
return
}
if apiStoreClient == nil {
err = errors.New("can't get api store client, please check api store configuration")
return
}
r.Recorder.Eventf(dynamoNimRequest, corev1.EventTypeNormal, "FetchDynamoComponent", "Getting dynamo component %s from api store service", dynamoNimRequest.Spec.BentoTag)
dynamoComponent, err = apiStoreClient.GetDynamoComponent(ctx, dynamoComponentRepositoryName, dynamoComponentVersion)
if err != nil {
err = errors.Wrap(err, "get dynamo component")
return
}
r.Recorder.Eventf(dynamoNimRequest, corev1.EventTypeNormal, "FetchDynamoComponent", "Got dynamo component %s from api store service", dynamoNimRequest.Spec.BentoTag)
return
}
func (r *DynamoNimRequestReconciler) getImageBuilderJobName() string {
guid := xid.New() guid := xid.New()
return fmt.Sprintf("dynamo-image-builder-%s", guid.String()) return fmt.Sprintf("dynamo-image-builder-%s", guid.String())
} }
func (r *DynamoNimRequestReconciler) getImageBuilderJobLabels(dynamoNimRequest *nvidiacomv1alpha1.DynamoNimRequest) map[string]string { func (r *DynamoComponentRequestReconciler) getImageBuilderJobLabels(dynamoComponentRequest *nvidiacomv1alpha1.DynamoComponentRequest) map[string]string {
dynamoNimRepositoryName, _, dynamoNimVersion := xstrings.Partition(dynamoNimRequest.Spec.BentoTag, ":") return map[string]string{
labels := map[string]string{ commonconsts.KubeLabelDynamoComponentRequest: dynamoComponentRequest.Name,
commonconsts.KubeLabelDynamoRequest: dynamoNimRequest.Name, commonconsts.KubeLabelIsDynamoImageBuilder: "true",
commonconsts.KubeLabelIsDynamoImageBuilder: "true",
commonconsts.KubeLabelDynamoRepository: dynamoNimRepositoryName,
commonconsts.KubeLabelDynamoVersion: dynamoNimVersion,
} }
return labels
} }
func (r *DynamoNimRequestReconciler) getImageBuilderPodLabels(dynamoNimRequest *nvidiacomv1alpha1.DynamoNimRequest) map[string]string { func (r *DynamoComponentRequestReconciler) getImageBuilderPodLabels(dynamoComponentRequest *nvidiacomv1alpha1.DynamoComponentRequest) map[string]string {
dynamoNimRepositoryName, _, dynamoNimVersion := xstrings.Partition(dynamoNimRequest.Spec.BentoTag, ":")
return map[string]string{ return map[string]string{
commonconsts.KubeLabelDynamoRequest: dynamoNimRequest.Name, commonconsts.KubeLabelDynamoComponentRequest: dynamoComponentRequest.Name,
commonconsts.KubeLabelIsDynamoImageBuilder: "true", commonconsts.KubeLabelIsDynamoImageBuilder: "true",
commonconsts.KubeLabelDynamoRepository: dynamoNimRepositoryName,
commonconsts.KubeLabelDynamoVersion: dynamoNimVersion,
} }
} }
...@@ -1054,12 +1008,12 @@ func hash(text string) string { ...@@ -1054,12 +1008,12 @@ func hash(text string) string {
} }
type GenerateImageBuilderJobOption struct { type GenerateImageBuilderJobOption struct {
ImageInfo ImageInfo ImageInfo ImageInfo
DynamoNimRequest *nvidiacomv1alpha1.DynamoNimRequest DynamoComponentRequest *nvidiacomv1alpha1.DynamoComponentRequest
} }
//nolint:nakedret //nolint:nakedret
func (r *DynamoNimRequestReconciler) generateImageBuilderJob(ctx context.Context, opt GenerateImageBuilderJobOption) (job *batchv1.Job, err error) { func (r *DynamoComponentRequestReconciler) generateImageBuilderJob(ctx context.Context, opt GenerateImageBuilderJobOption) (job *batchv1.Job, err error) {
// nolint: gosimple // nolint: gosimple
podTemplateSpec, err := r.generateImageBuilderPodTemplateSpec(ctx, GenerateImageBuilderPodTemplateSpecOption(opt)) podTemplateSpec, err := r.generateImageBuilderPodTemplateSpec(ctx, GenerateImageBuilderPodTemplateSpecOption(opt))
if err != nil { if err != nil {
...@@ -1067,17 +1021,17 @@ func (r *DynamoNimRequestReconciler) generateImageBuilderJob(ctx context.Context ...@@ -1067,17 +1021,17 @@ func (r *DynamoNimRequestReconciler) generateImageBuilderJob(ctx context.Context
return return
} }
kubeAnnotations := make(map[string]string) kubeAnnotations := make(map[string]string)
hashStr, err := r.getHashStr(opt.DynamoNimRequest) hashStr, err := r.getHashStr(opt.DynamoComponentRequest)
if err != nil { if err != nil {
err = errors.Wrap(err, "failed to get hash string") err = errors.Wrap(err, "failed to get hash string")
return return
} }
kubeAnnotations[consts.KubeAnnotationDynamoNimRequestHash] = hashStr kubeAnnotations[consts.KubeAnnotationDynamoComponentRequestHash] = hashStr
job = &batchv1.Job{ job = &batchv1.Job{
ObjectMeta: metav1.ObjectMeta{ ObjectMeta: metav1.ObjectMeta{
Name: r.getImageBuilderJobName(), Name: r.getImageBuilderJobName(),
Namespace: opt.DynamoNimRequest.Namespace, Namespace: opt.DynamoComponentRequest.Namespace,
Labels: r.getImageBuilderJobLabels(opt.DynamoNimRequest), Labels: r.getImageBuilderJobLabels(opt.DynamoComponentRequest),
Annotations: kubeAnnotations, Annotations: kubeAnnotations,
}, },
Spec: batchv1.JobSpec{ Spec: batchv1.JobSpec{
...@@ -1099,7 +1053,7 @@ func (r *DynamoNimRequestReconciler) generateImageBuilderJob(ctx context.Context ...@@ -1099,7 +1053,7 @@ func (r *DynamoNimRequestReconciler) generateImageBuilderJob(ctx context.Context
Template: *podTemplateSpec, Template: *podTemplateSpec,
}, },
} }
err = ctrl.SetControllerReference(opt.DynamoNimRequest, job, r.Scheme) err = ctrl.SetControllerReference(opt.DynamoComponentRequest, job, r.Scheme)
if err != nil { if err != nil {
err = errors.Wrapf(err, "set controller reference for job %s", job.Name) err = errors.Wrapf(err, "set controller reference for job %s", job.Name)
return return
...@@ -1107,7 +1061,7 @@ func (r *DynamoNimRequestReconciler) generateImageBuilderJob(ctx context.Context ...@@ -1107,7 +1061,7 @@ func (r *DynamoNimRequestReconciler) generateImageBuilderJob(ctx context.Context
return return
} }
func injectPodAffinity(podSpec *corev1.PodSpec, dynamoNimRequest *nvidiacomv1alpha1.DynamoNimRequest) { func injectPodAffinity(podSpec *corev1.PodSpec, dynamoComponentRequest *nvidiacomv1alpha1.DynamoComponentRequest) {
if podSpec.Affinity == nil { if podSpec.Affinity == nil {
podSpec.Affinity = &corev1.Affinity{} podSpec.Affinity = &corev1.Affinity{}
} }
...@@ -1121,7 +1075,7 @@ func injectPodAffinity(podSpec *corev1.PodSpec, dynamoNimRequest *nvidiacomv1alp ...@@ -1121,7 +1075,7 @@ func injectPodAffinity(podSpec *corev1.PodSpec, dynamoNimRequest *nvidiacomv1alp
PodAffinityTerm: corev1.PodAffinityTerm{ PodAffinityTerm: corev1.PodAffinityTerm{
LabelSelector: &metav1.LabelSelector{ LabelSelector: &metav1.LabelSelector{
MatchLabels: map[string]string{ MatchLabels: map[string]string{
commonconsts.KubeLabelDynamoRequest: dynamoNimRequest.Name, commonconsts.KubeLabelDynamoComponentRequest: dynamoComponentRequest.Name,
}, },
}, },
TopologyKey: corev1.LabelHostname, TopologyKey: corev1.LabelHostname,
...@@ -1135,14 +1089,14 @@ const ModelSeederContainerName = "seeder" ...@@ -1135,14 +1089,14 @@ const ModelSeederContainerName = "seeder"
const ModelSeederJobFailedExitCode = 42 const ModelSeederJobFailedExitCode = 42
type GenerateImageBuilderPodTemplateSpecOption struct { type GenerateImageBuilderPodTemplateSpecOption struct {
ImageInfo ImageInfo ImageInfo ImageInfo
DynamoNimRequest *nvidiacomv1alpha1.DynamoNimRequest DynamoComponentRequest *nvidiacomv1alpha1.DynamoComponentRequest
} }
//nolint:gocyclo,nakedret //nolint:gocyclo,nakedret
func (r *DynamoNimRequestReconciler) generateImageBuilderPodTemplateSpec(ctx context.Context, opt GenerateImageBuilderPodTemplateSpecOption) (pod *corev1.PodTemplateSpec, err error) { func (r *DynamoComponentRequestReconciler) generateImageBuilderPodTemplateSpec(ctx context.Context, opt GenerateImageBuilderPodTemplateSpecOption) (pod *corev1.PodTemplateSpec, err error) {
dynamoComponentRepositoryName, _, dynamoComponentVersion := xstrings.Partition(opt.DynamoNimRequest.Spec.BentoTag, ":") dynamoComponentRepositoryName, _, dynamoComponentVersion := xstrings.Partition(opt.DynamoComponentRequest.Spec.DynamoComponent, ":")
kubeLabels := r.getImageBuilderPodLabels(opt.DynamoNimRequest) kubeLabels := r.getImageBuilderPodLabels(opt.DynamoComponentRequest)
inClusterImageName := opt.ImageInfo.InClusterImageName inClusterImageName := opt.ImageInfo.InClusterImageName
...@@ -1198,7 +1152,7 @@ func (r *DynamoNimRequestReconciler) generateImageBuilderPodTemplateSpec(ctx con ...@@ -1198,7 +1152,7 @@ func (r *DynamoNimRequestReconciler) generateImageBuilderPodTemplateSpec(ctx con
} }
var dynamoComponent *schemas.DynamoComponent var dynamoComponent *schemas.DynamoComponent
dynamoComponentDownloadURL := opt.DynamoNimRequest.Spec.DownloadURL dynamoComponentDownloadURL := opt.DynamoComponentRequest.Spec.DownloadURL
if dynamoComponentDownloadURL == "" { if dynamoComponentDownloadURL == "" {
var apiStoreClient *apiStoreClient.ApiStoreClient var apiStoreClient *apiStoreClient.ApiStoreClient
...@@ -1215,23 +1169,23 @@ func (r *DynamoNimRequestReconciler) generateImageBuilderPodTemplateSpec(ctx con ...@@ -1215,23 +1169,23 @@ func (r *DynamoNimRequestReconciler) generateImageBuilderPodTemplateSpec(ctx con
return return
} }
r.Recorder.Eventf(opt.DynamoNimRequest, corev1.EventTypeNormal, "GenerateImageBuilderPod", "Getting dynamoNim %s from api store service", opt.DynamoNimRequest.Spec.BentoTag) r.Recorder.Eventf(opt.DynamoComponentRequest, corev1.EventTypeNormal, "GenerateImageBuilderPod", "Getting dynamoComponent %s from api store service", opt.DynamoComponentRequest.Spec.DynamoComponent)
dynamoComponent, err = apiStoreClient.GetDynamoComponent(ctx, dynamoComponentRepositoryName, dynamoComponentVersion) dynamoComponent, err = apiStoreClient.GetDynamoComponent(ctx, dynamoComponentRepositoryName, dynamoComponentVersion)
if err != nil { if err != nil {
err = errors.Wrap(err, "get dynamoNim") err = errors.Wrap(err, "get dynamoComponent")
return return
} }
r.Recorder.Eventf(opt.DynamoNimRequest, corev1.EventTypeNormal, "GenerateImageBuilderPod", "Got dynamoNim %s from api store service", opt.DynamoNimRequest.Spec.BentoTag) r.Recorder.Eventf(opt.DynamoComponentRequest, corev1.EventTypeNormal, "GenerateImageBuilderPod", "Got dynamoComponent %s from api store service", opt.DynamoComponentRequest.Spec.DynamoComponent)
if dynamoComponent.TransmissionStrategy != nil && *dynamoComponent.TransmissionStrategy == schemas.TransmissionStrategyPresignedURL { if dynamoComponent.TransmissionStrategy != nil && *dynamoComponent.TransmissionStrategy == schemas.TransmissionStrategyPresignedURL {
var dynamoComponent_ *schemas.DynamoComponent var dynamoComponent_ *schemas.DynamoComponent
r.Recorder.Eventf(opt.DynamoNimRequest, corev1.EventTypeNormal, "GenerateImageBuilderPod", "Getting presigned url for dynamoNim %s from api store service", opt.DynamoNimRequest.Spec.BentoTag) r.Recorder.Eventf(opt.DynamoComponentRequest, corev1.EventTypeNormal, "GenerateImageBuilderPod", "Getting presigned url for dynamoComponent %s from api store service", opt.DynamoComponentRequest.Spec.DynamoComponent)
dynamoComponent_, err = apiStoreClient.PresignDynamoComponentDownloadURL(ctx, dynamoComponentRepositoryName, dynamoComponentVersion) dynamoComponent_, err = apiStoreClient.PresignDynamoComponentDownloadURL(ctx, dynamoComponentRepositoryName, dynamoComponentVersion)
if err != nil { if err != nil {
err = errors.Wrap(err, "presign dynamoNim download url") err = errors.Wrap(err, "presign dynamoComponent download url")
return return
} }
r.Recorder.Eventf(opt.DynamoNimRequest, corev1.EventTypeNormal, "GenerateImageBuilderPod", "Got presigned url for dynamoNim %s from api store service", opt.DynamoNimRequest.Spec.BentoTag) r.Recorder.Eventf(opt.DynamoComponentRequest, corev1.EventTypeNormal, "GenerateImageBuilderPod", "Got presigned url for dynamoComponent %s from api store service", opt.DynamoComponentRequest.Spec.DynamoComponent)
dynamoComponentDownloadURL = dynamoComponent_.PresignedDownloadUrl dynamoComponentDownloadURL = dynamoComponent_.PresignedDownloadUrl
} else { } else {
dynamoComponentDownloadURL = fmt.Sprintf("%s/api/v1/dynamo_nims/%s/versions/%s/download", apiStoreConf.Endpoint, dynamoComponentRepositoryName, dynamoComponentVersion) dynamoComponentDownloadURL = fmt.Sprintf("%s/api/v1/dynamo_nims/%s/versions/%s/download", apiStoreConf.Endpoint, dynamoComponentRepositoryName, dynamoComponentVersion)
...@@ -1241,16 +1195,16 @@ func (r *DynamoNimRequestReconciler) generateImageBuilderPodTemplateSpec(ctx con ...@@ -1241,16 +1195,16 @@ func (r *DynamoNimRequestReconciler) generateImageBuilderPodTemplateSpec(ctx con
internalImages := commonconfig.GetInternalImages() internalImages := commonconfig.GetInternalImages()
logrus.Infof("Image builder is using the images %v", *internalImages) logrus.Infof("Image builder is using the images %v", *internalImages)
buildEngine := getDynamoNimImageBuildEngine() buildEngine := getDynamoComponentImageBuildEngine()
privileged := buildEngine != DynamoNimImageBuildEngineBuildkitRootless privileged := buildEngine != DynamoComponentImageBuildEngineBuildkitRootless
dynamoNimDownloadCommandTemplate, err := template.New("downloadCommand").Parse(` dynamoComponentDownloadCommandTemplate, err := template.New("downloadCommand").Parse(`
set -e set -e
mkdir -p /workspace/buildcontext mkdir -p /workspace/buildcontext
url="{{.DynamoComponentDownloadURL}}" url="{{.DynamoComponentDownloadURL}}"
echo "Downloading dynamoNim {{.DynamoComponentRepositoryName}}:{{.DynamoComponentVersion}} to /tmp/downloaded.tar..." echo "Downloading dynamoComponent {{.DynamoComponentRepositoryName}}:{{.DynamoComponentVersion}} to /tmp/downloaded.tar..."
if [[ ${url} == s3://* ]]; then if [[ ${url} == s3://* ]]; then
echo "Downloading from s3..." echo "Downloading from s3..."
aws s3 cp ${url} /tmp/downloaded.tar aws s3 cp ${url} /tmp/downloaded.tar
...@@ -1261,9 +1215,9 @@ else ...@@ -1261,9 +1215,9 @@ else
curl --fail -L ${url} --output /tmp/downloaded.tar --progress-bar curl --fail -L ${url} --output /tmp/downloaded.tar --progress-bar
fi fi
cd /workspace/buildcontext cd /workspace/buildcontext
echo "Extracting dynamoNim tar file..." echo "Extracting dynamoComponent tar file..."
tar -xvf /tmp/downloaded.tar tar -xvf /tmp/downloaded.tar
echo "Removing dynamoNim tar file..." echo "Removing dynamoComponent tar file..."
rm /tmp/downloaded.tar rm /tmp/downloaded.tar
{{if not .Privileged}} {{if not .Privileged}}
echo "Changing directory permission..." echo "Changing directory permission..."
...@@ -1277,9 +1231,9 @@ echo "Done" ...@@ -1277,9 +1231,9 @@ echo "Done"
return return
} }
var dynamoNimDownloadCommandBuffer bytes.Buffer var dynamoComponentDownloadCommandBuffer bytes.Buffer
err = dynamoNimDownloadCommandTemplate.Execute(&dynamoNimDownloadCommandBuffer, map[string]interface{}{ err = dynamoComponentDownloadCommandTemplate.Execute(&dynamoComponentDownloadCommandBuffer, map[string]interface{}{
"DynamoComponentDownloadURL": dynamoComponentDownloadURL, "DynamoComponentDownloadURL": dynamoComponentDownloadURL,
"DynamoComponentRepositoryName": dynamoComponentRepositoryName, "DynamoComponentRepositoryName": dynamoComponentRepositoryName,
"DynamoComponentVersion": dynamoComponentVersion, "DynamoComponentVersion": dynamoComponentVersion,
...@@ -1290,7 +1244,7 @@ echo "Done" ...@@ -1290,7 +1244,7 @@ echo "Done"
return return
} }
dynamoNimDownloadCommand := dynamoNimDownloadCommandBuffer.String() dynamoComponentDownloadCommand := dynamoComponentDownloadCommandBuffer.String()
downloaderContainerResources := corev1.ResourceRequirements{ downloaderContainerResources := corev1.ResourceRequirements{
Limits: corev1.ResourceList{ Limits: corev1.ResourceList{
...@@ -1303,16 +1257,16 @@ echo "Done" ...@@ -1303,16 +1257,16 @@ echo "Done"
}, },
} }
downloaderContainerEnvFrom := opt.DynamoNimRequest.Spec.DownloaderContainerEnvFrom downloaderContainerEnvFrom := opt.DynamoComponentRequest.Spec.DownloaderContainerEnvFrom
initContainers := []corev1.Container{ initContainers := []corev1.Container{
{ {
Name: "dynamonim-downloader", Name: "dynamocomponent-downloader",
Image: internalImages.DynamoComponentsDownloader, Image: internalImages.DynamoComponentsDownloader,
Command: []string{ Command: []string{
"bash", "bash",
"-c", "-c",
dynamoNimDownloadCommand, dynamoComponentDownloadCommand,
}, },
VolumeMounts: volumeMounts, VolumeMounts: volumeMounts,
Resources: downloaderContainerResources, Resources: downloaderContainerResources,
...@@ -1328,22 +1282,6 @@ echo "Done" ...@@ -1328,22 +1282,6 @@ echo "Done"
containers := make([]corev1.Container, 0) containers := make([]corev1.Container, 0)
models := opt.DynamoNimRequest.Spec.Models
modelsSeen := map[string]struct{}{}
for _, model := range models {
modelsSeen[model.Tag] = struct{}{}
}
if dynamoComponent != nil {
for _, modelTag := range dynamoComponent.Manifest.Models {
if _, ok := modelsSeen[modelTag]; !ok {
models = append(models, nvidiacomv1alpha1.BentoModel{
Tag: modelTag,
})
}
}
}
var globalExtraPodMetadata *dynamoCommon.ExtraPodMetadata var globalExtraPodMetadata *dynamoCommon.ExtraPodMetadata
var globalExtraPodSpec *dynamoCommon.ExtraPodSpec var globalExtraPodSpec *dynamoCommon.ExtraPodSpec
var globalExtraContainerEnv []corev1.EnvVar var globalExtraContainerEnv []corev1.EnvVar
...@@ -1358,7 +1296,7 @@ echo "Done" ...@@ -1358,7 +1296,7 @@ echo "Done"
} }
configCmName := "dynamo-image-builder-config" configCmName := "dynamo-image-builder-config"
r.Recorder.Eventf(opt.DynamoNimRequest, corev1.EventTypeNormal, "GenerateImageBuilderPod", "Getting configmap %s from namespace %s", configCmName, configNamespace) r.Recorder.Eventf(opt.DynamoComponentRequest, corev1.EventTypeNormal, "GenerateImageBuilderPod", "Getting configmap %s from namespace %s", configCmName, configNamespace)
configCm := &corev1.ConfigMap{} configCm := &corev1.ConfigMap{}
err = r.Get(ctx, types.NamespacedName{Name: configCmName, Namespace: configNamespace}, configCm) err = r.Get(ctx, types.NamespacedName{Name: configCmName, Namespace: configNamespace}, configCm)
configCmIsNotFound := k8serrors.IsNotFound(err) configCmIsNotFound := k8serrors.IsNotFound(err)
...@@ -1369,7 +1307,7 @@ echo "Done" ...@@ -1369,7 +1307,7 @@ echo "Done"
err = nil // nolint: ineffassign err = nil // nolint: ineffassign
if !configCmIsNotFound { if !configCmIsNotFound {
r.Recorder.Eventf(opt.DynamoNimRequest, corev1.EventTypeNormal, "GenerateImageBuilderPod", "Configmap %s is got from namespace %s", configCmName, configNamespace) r.Recorder.Eventf(opt.DynamoComponentRequest, corev1.EventTypeNormal, "GenerateImageBuilderPod", "Configmap %s is got from namespace %s", configCmName, configNamespace)
globalExtraPodMetadata = &dynamoCommon.ExtraPodMetadata{} globalExtraPodMetadata = &dynamoCommon.ExtraPodMetadata{}
...@@ -1430,15 +1368,15 @@ echo "Done" ...@@ -1430,15 +1368,15 @@ echo "Done"
} }
logrus.Info("passed in builder args: ", builderArgs) logrus.Info("passed in builder args: ", builderArgs)
} else { } else {
r.Recorder.Eventf(opt.DynamoNimRequest, corev1.EventTypeNormal, "GenerateImageBuilderPod", "Configmap %s is not found in namespace %s", configCmName, configNamespace) r.Recorder.Eventf(opt.DynamoComponentRequest, corev1.EventTypeNormal, "GenerateImageBuilderPod", "Configmap %s is not found in namespace %s", configCmName, configNamespace)
} }
if buildArgs == nil { if buildArgs == nil {
buildArgs = make([]string, 0) buildArgs = make([]string, 0)
} }
if opt.DynamoNimRequest.Spec.BuildArgs != nil { if opt.DynamoComponentRequest.Spec.BuildArgs != nil {
buildArgs = append(buildArgs, opt.DynamoNimRequest.Spec.BuildArgs...) buildArgs = append(buildArgs, opt.DynamoComponentRequest.Spec.BuildArgs...)
} }
dockerFilePath := "/workspace/buildcontext/env/docker/Dockerfile" dockerFilePath := "/workspace/buildcontext/env/docker/Dockerfile"
...@@ -1461,7 +1399,7 @@ echo "Done" ...@@ -1461,7 +1399,7 @@ echo "Done"
} }
kubeAnnotations := make(map[string]string) kubeAnnotations := make(map[string]string)
kubeAnnotations[consts.KubeAnnotationDynamoNimRequestImageBuiderHash] = opt.DynamoNimRequest.Annotations[consts.KubeAnnotationDynamoNimRequestImageBuiderHash] kubeAnnotations[consts.KubeAnnotationDynamoComponentRequestImageBuiderHash] = opt.DynamoComponentRequest.Annotations[consts.KubeAnnotationDynamoComponentRequestImageBuiderHash]
command := []string{ command := []string{
"/kaniko/executor", "/kaniko/executor",
...@@ -1487,7 +1425,7 @@ echo "Done" ...@@ -1487,7 +1425,7 @@ echo "Done"
var builderImage string var builderImage string
switch buildEngine { switch buildEngine {
case DynamoNimImageBuildEngineKaniko: case DynamoComponentImageBuildEngineKaniko:
builderImage = internalImages.Kaniko builderImage = internalImages.Kaniko
if isEstargzEnabled() { if isEstargzEnabled() {
builderContainerEnvs = append(builderContainerEnvs, corev1.EnvVar{ builderContainerEnvs = append(builderContainerEnvs, corev1.EnvVar{
...@@ -1495,16 +1433,16 @@ echo "Done" ...@@ -1495,16 +1433,16 @@ echo "Done"
Value: "1", Value: "1",
}) })
} }
case DynamoNimImageBuildEngineBuildkit: case DynamoComponentImageBuildEngineBuildkit:
builderImage = internalImages.Buildkit builderImage = internalImages.Buildkit
case DynamoNimImageBuildEngineBuildkitRootless: case DynamoComponentImageBuildEngineBuildkitRootless:
builderImage = internalImages.BuildkitRootless builderImage = internalImages.BuildkitRootless
default: default:
err = errors.Errorf("unknown dynamoNim image build engine %s", buildEngine) err = errors.Errorf("unknown dynamoComponent image build engine %s", buildEngine)
return return
} }
isBuildkit := buildEngine == DynamoNimImageBuildEngineBuildkit || buildEngine == DynamoNimImageBuildEngineBuildkitRootless isBuildkit := buildEngine == DynamoComponentImageBuildEngineBuildkit || buildEngine == DynamoComponentImageBuildEngineBuildkitRootless
if isBuildkit { if isBuildkit {
output := fmt.Sprintf("type=image,name=%s,push=true,registry.insecure=%v", inClusterImageName, dockerRegistryInsecure) output := fmt.Sprintf("type=image,name=%s,push=true,registry.insecure=%v", inClusterImageName, dockerRegistryInsecure)
...@@ -1552,11 +1490,11 @@ echo "Done" ...@@ -1552,11 +1490,11 @@ echo "Done"
var builderContainerSecurityContext *corev1.SecurityContext var builderContainerSecurityContext *corev1.SecurityContext
if buildEngine == DynamoNimImageBuildEngineBuildkit { if buildEngine == DynamoComponentImageBuildEngineBuildkit {
builderContainerSecurityContext = &corev1.SecurityContext{ builderContainerSecurityContext = &corev1.SecurityContext{
Privileged: ptr.To(true), Privileged: ptr.To(true),
} }
} else if buildEngine == DynamoNimImageBuildEngineBuildkitRootless { } else if buildEngine == DynamoComponentImageBuildEngineBuildkitRootless {
kubeAnnotations["container.apparmor.security.beta.kubernetes.io/builder"] = "unconfined" kubeAnnotations["container.apparmor.security.beta.kubernetes.io/builder"] = "unconfined"
builderContainerSecurityContext = &corev1.SecurityContext{ builderContainerSecurityContext = &corev1.SecurityContext{
SeccompProfile: &corev1.SeccompProfile{ SeccompProfile: &corev1.SeccompProfile{
...@@ -1582,7 +1520,7 @@ echo "Done" ...@@ -1582,7 +1520,7 @@ echo "Done"
// nolint: gosec // nolint: gosec
buildArgsSecretName := "dynamo-image-builder-build-args" buildArgsSecretName := "dynamo-image-builder-build-args"
r.Recorder.Eventf(opt.DynamoNimRequest, corev1.EventTypeNormal, "GenerateImageBuilderPod", "Getting secret %s from namespace %s", buildArgsSecretName, configNamespace) r.Recorder.Eventf(opt.DynamoComponentRequest, corev1.EventTypeNormal, "GenerateImageBuilderPod", "Getting secret %s from namespace %s", buildArgsSecretName, configNamespace)
buildArgsSecret := &corev1.Secret{} buildArgsSecret := &corev1.Secret{}
err = r.Get(ctx, types.NamespacedName{Name: buildArgsSecretName, Namespace: configNamespace}, buildArgsSecret) err = r.Get(ctx, types.NamespacedName{Name: buildArgsSecretName, Namespace: configNamespace}, buildArgsSecret)
buildArgsSecretIsNotFound := k8serrors.IsNotFound(err) buildArgsSecretIsNotFound := k8serrors.IsNotFound(err)
...@@ -1592,42 +1530,42 @@ echo "Done" ...@@ -1592,42 +1530,42 @@ echo "Done"
} }
if !buildArgsSecretIsNotFound { if !buildArgsSecretIsNotFound {
r.Recorder.Eventf(opt.DynamoNimRequest, corev1.EventTypeNormal, "GenerateImageBuilderPod", "Secret %s is got from namespace %s", buildArgsSecretName, configNamespace) r.Recorder.Eventf(opt.DynamoComponentRequest, corev1.EventTypeNormal, "GenerateImageBuilderPod", "Secret %s is got from namespace %s", buildArgsSecretName, configNamespace)
if configNamespace != opt.DynamoNimRequest.Namespace { if configNamespace != opt.DynamoComponentRequest.Namespace {
r.Recorder.Eventf(opt.DynamoNimRequest, corev1.EventTypeNormal, "GenerateImageBuilderPod", "Secret %s is in namespace %s, but DynamoNimRequest is in namespace %s, so we need to copy the secret to DynamoNimRequest namespace", buildArgsSecretName, configNamespace, opt.DynamoNimRequest.Namespace) r.Recorder.Eventf(opt.DynamoComponentRequest, corev1.EventTypeNormal, "GenerateImageBuilderPod", "Secret %s is in namespace %s, but DynamoComponentRequest is in namespace %s, so we need to copy the secret to DynamoComponentRequest namespace", buildArgsSecretName, configNamespace, opt.DynamoComponentRequest.Namespace)
r.Recorder.Eventf(opt.DynamoNimRequest, corev1.EventTypeNormal, "GenerateImageBuilderPod", "Getting secret %s in namespace %s", buildArgsSecretName, opt.DynamoNimRequest.Namespace) r.Recorder.Eventf(opt.DynamoComponentRequest, corev1.EventTypeNormal, "GenerateImageBuilderPod", "Getting secret %s in namespace %s", buildArgsSecretName, opt.DynamoComponentRequest.Namespace)
_buildArgsSecret := &corev1.Secret{} _buildArgsSecret := &corev1.Secret{}
err = r.Get(ctx, types.NamespacedName{Namespace: opt.DynamoNimRequest.Namespace, Name: buildArgsSecretName}, _buildArgsSecret) err = r.Get(ctx, types.NamespacedName{Namespace: opt.DynamoComponentRequest.Namespace, Name: buildArgsSecretName}, _buildArgsSecret)
localBuildArgsSecretIsNotFound := k8serrors.IsNotFound(err) localBuildArgsSecretIsNotFound := k8serrors.IsNotFound(err)
if err != nil && !localBuildArgsSecretIsNotFound { if err != nil && !localBuildArgsSecretIsNotFound {
err = errors.Wrapf(err, "failed to get secret %s from namespace %s", buildArgsSecretName, opt.DynamoNimRequest.Namespace) err = errors.Wrapf(err, "failed to get secret %s from namespace %s", buildArgsSecretName, opt.DynamoComponentRequest.Namespace)
return return
} }
if localBuildArgsSecretIsNotFound { if localBuildArgsSecretIsNotFound {
r.Recorder.Eventf(opt.DynamoNimRequest, corev1.EventTypeNormal, "GenerateImageBuilderPod", "Copying secret %s from namespace %s to namespace %s", buildArgsSecretName, configNamespace, opt.DynamoNimRequest.Namespace) r.Recorder.Eventf(opt.DynamoComponentRequest, corev1.EventTypeNormal, "GenerateImageBuilderPod", "Copying secret %s from namespace %s to namespace %s", buildArgsSecretName, configNamespace, opt.DynamoComponentRequest.Namespace)
err = r.Create(ctx, &corev1.Secret{ err = r.Create(ctx, &corev1.Secret{
ObjectMeta: metav1.ObjectMeta{ ObjectMeta: metav1.ObjectMeta{
Name: buildArgsSecretName, Name: buildArgsSecretName,
Namespace: opt.DynamoNimRequest.Namespace, Namespace: opt.DynamoComponentRequest.Namespace,
}, },
Data: buildArgsSecret.Data, Data: buildArgsSecret.Data,
}) })
if err != nil { if err != nil {
err = errors.Wrapf(err, "failed to create secret %s in namespace %s", buildArgsSecretName, opt.DynamoNimRequest.Namespace) err = errors.Wrapf(err, "failed to create secret %s in namespace %s", buildArgsSecretName, opt.DynamoComponentRequest.Namespace)
return return
} }
} else { } else {
r.Recorder.Eventf(opt.DynamoNimRequest, corev1.EventTypeNormal, "GenerateImageBuilderPod", "Secret %s is already in namespace %s", buildArgsSecretName, opt.DynamoNimRequest.Namespace) r.Recorder.Eventf(opt.DynamoComponentRequest, corev1.EventTypeNormal, "GenerateImageBuilderPod", "Secret %s is already in namespace %s", buildArgsSecretName, opt.DynamoComponentRequest.Namespace)
r.Recorder.Eventf(opt.DynamoNimRequest, corev1.EventTypeNormal, "GenerateImageBuilderPod", "Updating secret %s in namespace %s", buildArgsSecretName, opt.DynamoNimRequest.Namespace) r.Recorder.Eventf(opt.DynamoComponentRequest, corev1.EventTypeNormal, "GenerateImageBuilderPod", "Updating secret %s in namespace %s", buildArgsSecretName, opt.DynamoComponentRequest.Namespace)
err = r.Update(ctx, &corev1.Secret{ err = r.Update(ctx, &corev1.Secret{
ObjectMeta: metav1.ObjectMeta{ ObjectMeta: metav1.ObjectMeta{
Name: buildArgsSecretName, Name: buildArgsSecretName,
Namespace: opt.DynamoNimRequest.Namespace, Namespace: opt.DynamoComponentRequest.Namespace,
}, },
Data: buildArgsSecret.Data, Data: buildArgsSecret.Data,
}) })
if err != nil { if err != nil {
err = errors.Wrapf(err, "failed to update secret %s in namespace %s", buildArgsSecretName, opt.DynamoNimRequest.Namespace) err = errors.Wrapf(err, "failed to update secret %s in namespace %s", buildArgsSecretName, opt.DynamoComponentRequest.Namespace)
return return
} }
} }
...@@ -1654,7 +1592,7 @@ echo "Done" ...@@ -1654,7 +1592,7 @@ echo "Done"
} }
} }
} else { } else {
r.Recorder.Eventf(opt.DynamoNimRequest, corev1.EventTypeNormal, "GenerateImageBuilderPod", "Secret %s is not found in namespace %s", buildArgsSecretName, configNamespace) r.Recorder.Eventf(opt.DynamoComponentRequest, corev1.EventTypeNormal, "GenerateImageBuilderPod", "Secret %s is not found in namespace %s", buildArgsSecretName, configNamespace)
} }
builderContainerArgs := []string{ builderContainerArgs := []string{
...@@ -1680,8 +1618,8 @@ echo "Done" ...@@ -1680,8 +1618,8 @@ echo "Done"
container.Resources = *globalDefaultImageBuilderContainerResources container.Resources = *globalDefaultImageBuilderContainerResources
} }
if opt.DynamoNimRequest.Spec.ImageBuilderContainerResources != nil { if opt.DynamoComponentRequest.Spec.ImageBuilderContainerResources != nil {
container.Resources = *opt.DynamoNimRequest.Spec.ImageBuilderContainerResources container.Resources = *opt.DynamoComponentRequest.Spec.ImageBuilderContainerResources
} }
containers = append(containers, container) containers = append(containers, container)
...@@ -1709,12 +1647,12 @@ echo "Done" ...@@ -1709,12 +1647,12 @@ echo "Done"
} }
} }
if opt.DynamoNimRequest.Spec.ImageBuilderExtraPodMetadata != nil { if opt.DynamoComponentRequest.Spec.ImageBuilderExtraPodMetadata != nil {
for k, v := range opt.DynamoNimRequest.Spec.ImageBuilderExtraPodMetadata.Annotations { for k, v := range opt.DynamoComponentRequest.Spec.ImageBuilderExtraPodMetadata.Annotations {
pod.Annotations[k] = v pod.Annotations[k] = v
} }
for k, v := range opt.DynamoNimRequest.Spec.ImageBuilderExtraPodMetadata.Labels { for k, v := range opt.DynamoComponentRequest.Spec.ImageBuilderExtraPodMetadata.Labels {
pod.Labels[k] = v pod.Labels[k] = v
} }
} }
...@@ -1729,45 +1667,45 @@ echo "Done" ...@@ -1729,45 +1667,45 @@ echo "Done"
pod.Spec.ServiceAccountName = globalExtraPodSpec.ServiceAccountName pod.Spec.ServiceAccountName = globalExtraPodSpec.ServiceAccountName
} }
if opt.DynamoNimRequest.Spec.ImageBuilderExtraPodSpec != nil { if opt.DynamoComponentRequest.Spec.ImageBuilderExtraPodSpec != nil {
if opt.DynamoNimRequest.Spec.ImageBuilderExtraPodSpec.PriorityClassName != "" { if opt.DynamoComponentRequest.Spec.ImageBuilderExtraPodSpec.PriorityClassName != "" {
pod.Spec.PriorityClassName = opt.DynamoNimRequest.Spec.ImageBuilderExtraPodSpec.PriorityClassName pod.Spec.PriorityClassName = opt.DynamoComponentRequest.Spec.ImageBuilderExtraPodSpec.PriorityClassName
} }
if opt.DynamoNimRequest.Spec.ImageBuilderExtraPodSpec.SchedulerName != "" { if opt.DynamoComponentRequest.Spec.ImageBuilderExtraPodSpec.SchedulerName != "" {
pod.Spec.SchedulerName = opt.DynamoNimRequest.Spec.ImageBuilderExtraPodSpec.SchedulerName pod.Spec.SchedulerName = opt.DynamoComponentRequest.Spec.ImageBuilderExtraPodSpec.SchedulerName
} }
if opt.DynamoNimRequest.Spec.ImageBuilderExtraPodSpec.NodeSelector != nil { if opt.DynamoComponentRequest.Spec.ImageBuilderExtraPodSpec.NodeSelector != nil {
pod.Spec.NodeSelector = opt.DynamoNimRequest.Spec.ImageBuilderExtraPodSpec.NodeSelector pod.Spec.NodeSelector = opt.DynamoComponentRequest.Spec.ImageBuilderExtraPodSpec.NodeSelector
} }
if opt.DynamoNimRequest.Spec.ImageBuilderExtraPodSpec.Affinity != nil { if opt.DynamoComponentRequest.Spec.ImageBuilderExtraPodSpec.Affinity != nil {
pod.Spec.Affinity = opt.DynamoNimRequest.Spec.ImageBuilderExtraPodSpec.Affinity pod.Spec.Affinity = opt.DynamoComponentRequest.Spec.ImageBuilderExtraPodSpec.Affinity
} }
if opt.DynamoNimRequest.Spec.ImageBuilderExtraPodSpec.Tolerations != nil { if opt.DynamoComponentRequest.Spec.ImageBuilderExtraPodSpec.Tolerations != nil {
pod.Spec.Tolerations = opt.DynamoNimRequest.Spec.ImageBuilderExtraPodSpec.Tolerations pod.Spec.Tolerations = opt.DynamoComponentRequest.Spec.ImageBuilderExtraPodSpec.Tolerations
} }
if opt.DynamoNimRequest.Spec.ImageBuilderExtraPodSpec.TopologySpreadConstraints != nil { if opt.DynamoComponentRequest.Spec.ImageBuilderExtraPodSpec.TopologySpreadConstraints != nil {
pod.Spec.TopologySpreadConstraints = opt.DynamoNimRequest.Spec.ImageBuilderExtraPodSpec.TopologySpreadConstraints pod.Spec.TopologySpreadConstraints = opt.DynamoComponentRequest.Spec.ImageBuilderExtraPodSpec.TopologySpreadConstraints
} }
if opt.DynamoNimRequest.Spec.ImageBuilderExtraPodSpec.ServiceAccountName != "" { if opt.DynamoComponentRequest.Spec.ImageBuilderExtraPodSpec.ServiceAccountName != "" {
pod.Spec.ServiceAccountName = opt.DynamoNimRequest.Spec.ImageBuilderExtraPodSpec.ServiceAccountName pod.Spec.ServiceAccountName = opt.DynamoComponentRequest.Spec.ImageBuilderExtraPodSpec.ServiceAccountName
} }
} }
injectPodAffinity(&pod.Spec, opt.DynamoNimRequest) injectPodAffinity(&pod.Spec, opt.DynamoComponentRequest)
if pod.Spec.ServiceAccountName == "" { if pod.Spec.ServiceAccountName == "" {
serviceAccounts := &corev1.ServiceAccountList{} serviceAccounts := &corev1.ServiceAccountList{}
err = r.List(ctx, serviceAccounts, client.InNamespace(opt.DynamoNimRequest.Namespace), client.MatchingLabels{ err = r.List(ctx, serviceAccounts, client.InNamespace(opt.DynamoComponentRequest.Namespace), client.MatchingLabels{
commonconsts.KubeLabelDynamoImageBuilderPod: commonconsts.KubeLabelValueTrue, commonconsts.KubeLabelDynamoImageBuilderPod: commonconsts.KubeLabelValueTrue,
}) })
if err != nil { if err != nil {
err = errors.Wrapf(err, "failed to list service accounts in namespace %s", opt.DynamoNimRequest.Namespace) err = errors.Wrapf(err, "failed to list service accounts in namespace %s", opt.DynamoComponentRequest.Namespace)
return return
} }
if len(serviceAccounts.Items) > 0 { if len(serviceAccounts.Items) > 0 {
...@@ -1782,7 +1720,7 @@ echo "Done" ...@@ -1782,7 +1720,7 @@ echo "Done"
if globalExtraContainerEnv != nil { if globalExtraContainerEnv != nil {
env = append(env, globalExtraContainerEnv...) env = append(env, globalExtraContainerEnv...)
} }
env = append(env, opt.DynamoNimRequest.Spec.ImageBuilderExtraContainerEnv...) env = append(env, opt.DynamoComponentRequest.Spec.ImageBuilderExtraContainerEnv...)
pod.Spec.InitContainers[i].Env = env pod.Spec.InitContainers[i].Env = env
} }
for i, c := range pod.Spec.Containers { for i, c := range pod.Spec.Containers {
...@@ -1790,26 +1728,26 @@ echo "Done" ...@@ -1790,26 +1728,26 @@ echo "Done"
if globalExtraContainerEnv != nil { if globalExtraContainerEnv != nil {
env = append(env, globalExtraContainerEnv...) env = append(env, globalExtraContainerEnv...)
} }
env = append(env, opt.DynamoNimRequest.Spec.ImageBuilderExtraContainerEnv...) env = append(env, opt.DynamoComponentRequest.Spec.ImageBuilderExtraContainerEnv...)
pod.Spec.Containers[i].Env = env pod.Spec.Containers[i].Env = env
} }
return return
} }
func (r *DynamoNimRequestReconciler) getHashStr(dynamoNimRequest *nvidiacomv1alpha1.DynamoNimRequest) (string, error) { func (r *DynamoComponentRequestReconciler) getHashStr(dynamoComponentRequest *nvidiacomv1alpha1.DynamoComponentRequest) (string, error) {
var hash uint64 var hash uint64
hash, err := hashstructure.Hash(struct { hash, err := hashstructure.Hash(struct {
Spec nvidiacomv1alpha1.DynamoNimRequestSpec Spec nvidiacomv1alpha1.DynamoComponentRequestSpec
Labels map[string]string Labels map[string]string
Annotations map[string]string Annotations map[string]string
}{ }{
Spec: dynamoNimRequest.Spec, Spec: dynamoComponentRequest.Spec,
Labels: dynamoNimRequest.Labels, Labels: dynamoComponentRequest.Labels,
Annotations: dynamoNimRequest.Annotations, Annotations: dynamoComponentRequest.Annotations,
}, hashstructure.FormatV2, nil) }, hashstructure.FormatV2, nil)
if err != nil { if err != nil {
err = errors.Wrap(err, "get dynamoNimRequest CR spec hash") err = errors.Wrap(err, "get dynamoComponentRequest CR spec hash")
return "", err return "", err
} }
hashStr := strconv.FormatUint(hash, 10) hashStr := strconv.FormatUint(hash, 10)
...@@ -1821,13 +1759,13 @@ const ( ...@@ -1821,13 +1759,13 @@ const (
) )
// SetupWithManager sets up the controller with the Manager. // SetupWithManager sets up the controller with the Manager.
func (r *DynamoNimRequestReconciler) SetupWithManager(mgr ctrl.Manager) error { func (r *DynamoComponentRequestReconciler) SetupWithManager(mgr ctrl.Manager) error {
err := ctrl.NewControllerManagedBy(mgr). err := ctrl.NewControllerManagedBy(mgr).
For(&nvidiacomv1alpha1.DynamoNimRequest{}, builder.WithPredicates(predicate.GenerationChangedPredicate{})). For(&nvidiacomv1alpha1.DynamoComponentRequest{}, builder.WithPredicates(predicate.GenerationChangedPredicate{})).
Owns(&nvidiacomv1alpha1.DynamoNim{}). Owns(&nvidiacomv1alpha1.DynamoComponent{}).
Owns(&batchv1.Job{}). Owns(&batchv1.Job{}).
WithEventFilter(controller_common.EphemeralDeploymentEventFilter(r.Config)). WithEventFilter(controller_common.EphemeralDeploymentEventFilter(r.Config)).
Complete(r) Complete(r)
return errors.Wrap(err, "failed to setup DynamoNimRequest controller") return errors.Wrap(err, "failed to setup DynamoComponentRequest controller")
} }
...@@ -50,8 +50,8 @@ type etcdStorage interface { ...@@ -50,8 +50,8 @@ type etcdStorage interface {
DeleteKeys(ctx context.Context, prefix string) error DeleteKeys(ctx context.Context, prefix string) error
} }
// DynamoDeploymentReconciler reconciles a DynamoDeployment object // DynamoGraphDeploymentReconciler reconciles a DynamoGraphDeployment object
type DynamoDeploymentReconciler struct { type DynamoGraphDeploymentReconciler struct {
client.Client client.Client
Scheme *runtime.Scheme Scheme *runtime.Scheme
Config commonController.Config Config commonController.Config
...@@ -62,20 +62,20 @@ type DynamoDeploymentReconciler struct { ...@@ -62,20 +62,20 @@ type DynamoDeploymentReconciler struct {
IngressHostSuffix string IngressHostSuffix string
} }
// +kubebuilder:rbac:groups=nvidia.com,resources=dynamodeployments,verbs=get;list;watch;create;update;patch;delete // +kubebuilder:rbac:groups=nvidia.com,resources=dynamographdeployments,verbs=get;list;watch;create;update;patch;delete
// +kubebuilder:rbac:groups=nvidia.com,resources=dynamodeployments/status,verbs=get;update;patch // +kubebuilder:rbac:groups=nvidia.com,resources=dynamographdeployments/status,verbs=get;update;patch
// +kubebuilder:rbac:groups=nvidia.com,resources=dynamodeployments/finalizers,verbs=update // +kubebuilder:rbac:groups=nvidia.com,resources=dynamographdeployments/finalizers,verbs=update
// Reconcile is part of the main kubernetes reconciliation loop which aims to // Reconcile is part of the main kubernetes reconciliation loop which aims to
// move the current state of the cluster closer to the desired state. // move the current state of the cluster closer to the desired state.
// TODO(user): Modify the Reconcile function to compare the state specified by // TODO(user): Modify the Reconcile function to compare the state specified by
// the DynamoDeployment object against the actual cluster state, and then // the DynamoGraphDeployment object against the actual cluster state, and then
// perform operations to make the cluster state reflect the state specified by // perform operations to make the cluster state reflect the state specified by
// the user. // the user.
// //
// For more details, check Reconcile and its Result here: // For more details, check Reconcile and its Result here:
// - https://pkg.go.dev/sigs.k8s.io/controller-runtime@v0.19.1/pkg/reconcile // - https://pkg.go.dev/sigs.k8s.io/controller-runtime@v0.19.1/pkg/reconcile
func (r *DynamoDeploymentReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) { func (r *DynamoGraphDeploymentReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) {
logger := log.FromContext(ctx) logger := log.FromContext(ctx)
var err error var err error
...@@ -83,7 +83,7 @@ func (r *DynamoDeploymentReconciler) Reconcile(ctx context.Context, req ctrl.Req ...@@ -83,7 +83,7 @@ func (r *DynamoDeploymentReconciler) Reconcile(ctx context.Context, req ctrl.Req
message := "" message := ""
readyStatus := metav1.ConditionFalse readyStatus := metav1.ConditionFalse
// retrieve the CRD // retrieve the CRD
dynamoDeployment := &nvidiacomv1alpha1.DynamoDeployment{} dynamoDeployment := &nvidiacomv1alpha1.DynamoGraphDeployment{}
if err = r.Get(ctx, req.NamespacedName, dynamoDeployment); err != nil { if err = r.Get(ctx, req.NamespacedName, dynamoDeployment); err != nil {
return ctrl.Result{}, client.IgnoreNotFound(err) return ctrl.Result{}, client.IgnoreNotFound(err)
} }
...@@ -138,7 +138,7 @@ func (r *DynamoDeploymentReconciler) Reconcile(ctx context.Context, req ctrl.Req ...@@ -138,7 +138,7 @@ func (r *DynamoDeploymentReconciler) Reconcile(ctx context.Context, req ctrl.Req
// merge the dynamoComponentsDeployments with the dynamoComponentsDeployments from the CRD // merge the dynamoComponentsDeployments with the dynamoComponentsDeployments from the CRD
for serviceName, deployment := range dynamoComponentsDeployments { for serviceName, deployment := range dynamoComponentsDeployments {
if _, ok := dynamoDeployment.Spec.Services[serviceName]; ok { if _, ok := dynamoDeployment.Spec.Services[serviceName]; ok {
err := mergo.Merge(&deployment.Spec.DynamoNimDeploymentSharedSpec, dynamoDeployment.Spec.Services[serviceName].DynamoNimDeploymentSharedSpec, mergo.WithOverride) err := mergo.Merge(&deployment.Spec.DynamoComponentDeploymentSharedSpec, dynamoDeployment.Spec.Services[serviceName].DynamoComponentDeploymentSharedSpec, mergo.WithOverride)
if err != nil { if err != nil {
reason = "failed_to_merge_the_DynamoComponentsDeployments" reason = "failed_to_merge_the_DynamoComponentsDeployments"
return ctrl.Result{}, err return ctrl.Result{}, err
...@@ -156,37 +156,38 @@ func (r *DynamoDeploymentReconciler) Reconcile(ctx context.Context, req ctrl.Req ...@@ -156,37 +156,38 @@ func (r *DynamoDeploymentReconciler) Reconcile(ctx context.Context, req ctrl.Req
} }
} }
// reconcile the dynamoNimRequest // reconcile the dynamoComponentRequest
dynamoNimRequest := &nvidiacomv1alpha1.DynamoNimRequest{ // for now we use the same component for all the services and we differentiate them by the service name when launching the component
dynamoComponentRequest := &nvidiacomv1alpha1.DynamoComponentRequest{
ObjectMeta: metav1.ObjectMeta{ ObjectMeta: metav1.ObjectMeta{
Name: strings.ReplaceAll(dynamoDeployment.Spec.DynamoNim, ":", "--"), Name: strings.ReplaceAll(dynamoDeployment.Spec.DynamoGraph, ":", "--"),
Namespace: dynamoDeployment.Namespace, Namespace: dynamoDeployment.Namespace,
}, },
Spec: nvidiacomv1alpha1.DynamoNimRequestSpec{ Spec: nvidiacomv1alpha1.DynamoComponentRequestSpec{
BentoTag: dynamoDeployment.Spec.DynamoNim, DynamoComponent: dynamoDeployment.Spec.DynamoGraph,
}, },
} }
if err := ctrl.SetControllerReference(dynamoDeployment, dynamoNimRequest, r.Scheme); err != nil { if err := ctrl.SetControllerReference(dynamoDeployment, dynamoComponentRequest, r.Scheme); err != nil {
reason = "failed_to_set_the_controller_reference_for_the_DynamoNimRequest" reason = "failed_to_set_the_controller_reference_for_the_DynamoComponentRequest"
return ctrl.Result{}, err return ctrl.Result{}, err
} }
_, err = commonController.SyncResource(ctx, r.Client, dynamoNimRequest, types.NamespacedName{Name: dynamoNimRequest.Name, Namespace: dynamoNimRequest.Namespace}, false) _, err = commonController.SyncResource(ctx, r.Client, dynamoComponentRequest, types.NamespacedName{Name: dynamoComponentRequest.Name, Namespace: dynamoComponentRequest.Namespace}, false)
if err != nil { if err != nil {
reason = "failed_to_sync_the_DynamoNimRequest" reason = "failed_to_sync_the_DynamoComponentRequest"
return ctrl.Result{}, err return ctrl.Result{}, err
} }
notReadyDeployments := []string{} notReadyDeployments := []string{}
// reconcile the dynamoComponentsDeployments // reconcile the dynamoComponentsDeployments
for serviceName, dynamoComponentDeployment := range dynamoComponentsDeployments { for serviceName, dynamoComponentDeployment := range dynamoComponentsDeployments {
logger.Info("Reconciling the DynamoNimDeployment", "serviceName", serviceName, "dynamoComponentDeployment", dynamoComponentDeployment) logger.Info("Reconciling the DynamoComponentDeployment", "serviceName", serviceName, "dynamoComponentDeployment", dynamoComponentDeployment)
if err := ctrl.SetControllerReference(dynamoDeployment, dynamoComponentDeployment, r.Scheme); err != nil { if err := ctrl.SetControllerReference(dynamoDeployment, dynamoComponentDeployment, r.Scheme); err != nil {
reason = "failed_to_set_the_controller_reference_for_the_DynamoComponentDeployment" reason = "failed_to_set_the_controller_reference_for_the_DynamoComponentDeployment"
return ctrl.Result{}, err return ctrl.Result{}, err
} }
dynamoComponentDeployment, err = commonController.SyncResource(ctx, r.Client, dynamoComponentDeployment, types.NamespacedName{Name: dynamoComponentDeployment.Name, Namespace: dynamoComponentDeployment.Namespace}, false) dynamoComponentDeployment, err = commonController.SyncResource(ctx, r.Client, dynamoComponentDeployment, types.NamespacedName{Name: dynamoComponentDeployment.Name, Namespace: dynamoComponentDeployment.Namespace}, false)
if err != nil { if err != nil {
reason = "failed_to_sync_the_DynamoNimDeployment" reason = "failed_to_sync_the_DynamoComponentDeployment"
return ctrl.Result{}, err return ctrl.Result{}, err
} }
if !dynamoComponentDeployment.Status.IsReady() { if !dynamoComponentDeployment.Status.IsReady() {
...@@ -208,7 +209,7 @@ func (r *DynamoDeploymentReconciler) Reconcile(ctx context.Context, req ctrl.Req ...@@ -208,7 +209,7 @@ func (r *DynamoDeploymentReconciler) Reconcile(ctx context.Context, req ctrl.Req
} }
func (r *DynamoDeploymentReconciler) generateDefaultIngressSpec(dynamoDeployment *nvidiacomv1alpha1.DynamoDeployment) *nvidiacomv1alpha1.IngressSpec { func (r *DynamoGraphDeploymentReconciler) generateDefaultIngressSpec(dynamoDeployment *nvidiacomv1alpha1.DynamoGraphDeployment) *nvidiacomv1alpha1.IngressSpec {
res := &nvidiacomv1alpha1.IngressSpec{ res := &nvidiacomv1alpha1.IngressSpec{
Enabled: r.VirtualServiceGateway != "" || r.IngressControllerClassName != "", Enabled: r.VirtualServiceGateway != "" || r.IngressControllerClassName != "",
Host: dynamoDeployment.Name, Host: dynamoDeployment.Name,
...@@ -231,7 +232,7 @@ func (r *DynamoDeploymentReconciler) generateDefaultIngressSpec(dynamoDeployment ...@@ -231,7 +232,7 @@ func (r *DynamoDeploymentReconciler) generateDefaultIngressSpec(dynamoDeployment
return res return res
} }
func (r *DynamoDeploymentReconciler) isEndpointSecured() bool { func (r *DynamoGraphDeploymentReconciler) isEndpointSecured() bool {
return r.IngressControllerTLSSecret != "" return r.IngressControllerTLSSecret != ""
} }
...@@ -256,19 +257,19 @@ func mergeEnvs(common, specific []corev1.EnvVar) []corev1.EnvVar { ...@@ -256,19 +257,19 @@ func mergeEnvs(common, specific []corev1.EnvVar) []corev1.EnvVar {
return merged return merged
} }
func (r *DynamoDeploymentReconciler) FinalizeResource(ctx context.Context, dynamoDeployment *nvidiacomv1alpha1.DynamoDeployment) error { func (r *DynamoGraphDeploymentReconciler) FinalizeResource(ctx context.Context, dynamoDeployment *nvidiacomv1alpha1.DynamoGraphDeployment) error {
// for now doing nothing // for now doing nothing
return nil return nil
} }
// SetupWithManager sets up the controller with the Manager. // SetupWithManager sets up the controller with the Manager.
func (r *DynamoDeploymentReconciler) SetupWithManager(mgr ctrl.Manager) error { func (r *DynamoGraphDeploymentReconciler) SetupWithManager(mgr ctrl.Manager) error {
return ctrl.NewControllerManagedBy(mgr). return ctrl.NewControllerManagedBy(mgr).
For(&nvidiacomv1alpha1.DynamoDeployment{}, builder.WithPredicates( For(&nvidiacomv1alpha1.DynamoGraphDeployment{}, builder.WithPredicates(
predicate.GenerationChangedPredicate{}, predicate.GenerationChangedPredicate{},
)). )).
Named("dynamodeployment"). Named("dynamographdeployment").
Owns(&nvidiacomv1alpha1.DynamoNimDeployment{}, builder.WithPredicates(predicate.Funcs{ Owns(&nvidiacomv1alpha1.DynamoComponentDeployment{}, builder.WithPredicates(predicate.Funcs{
// ignore creation cause we don't want to be called again after we create the deployment // ignore creation cause we don't want to be called again after we create the deployment
CreateFunc: func(ce event.CreateEvent) bool { return false }, CreateFunc: func(ce event.CreateEvent) bool { return false },
DeleteFunc: func(de event.DeleteEvent) bool { return true }, DeleteFunc: func(de event.DeleteEvent) bool { return true },
......
...@@ -84,14 +84,14 @@ func (s ServiceConfig) GetNamespace() *string { ...@@ -84,14 +84,14 @@ func (s ServiceConfig) GetNamespace() *string {
return &s.Config.Dynamo.Namespace return &s.Config.Dynamo.Namespace
} }
func GetDefaultDynamoNamespace(ctx context.Context, dynamoDeployment *v1alpha1.DynamoDeployment) string { func GetDefaultDynamoNamespace(ctx context.Context, dynamoDeployment *v1alpha1.DynamoGraphDeployment) string {
return fmt.Sprintf("dynamo-%s", dynamoDeployment.Name) return fmt.Sprintf("dynamo-%s", dynamoDeployment.Name)
} }
func RetrieveDynamoGraphDownloadURL(ctx context.Context, dynamoDeployment *v1alpha1.DynamoDeployment, recorder EventRecorder) (*string, error) { func RetrieveDynamoGraphDownloadURL(ctx context.Context, dynamoDeployment *v1alpha1.DynamoGraphDeployment, recorder EventRecorder) (*string, error) {
dynamoGraphDownloadURL := "" dynamoGraphDownloadURL := ""
var dynamoComponent *schemas.DynamoComponent var dynamoComponent *schemas.DynamoComponent
dynamoComponentRepositoryName, _, dynamoComponentVersion := xstrings.Partition(dynamoDeployment.Spec.DynamoNim, ":") dynamoComponentRepositoryName, _, dynamoComponentVersion := xstrings.Partition(dynamoDeployment.Spec.DynamoGraph, ":")
var err error var err error
var apiStoreClient *apiStoreClient.ApiStoreClient var apiStoreClient *apiStoreClient.ApiStoreClient
...@@ -108,23 +108,23 @@ func RetrieveDynamoGraphDownloadURL(ctx context.Context, dynamoDeployment *v1alp ...@@ -108,23 +108,23 @@ func RetrieveDynamoGraphDownloadURL(ctx context.Context, dynamoDeployment *v1alp
return nil, err return nil, err
} }
recorder.Eventf(dynamoDeployment, corev1.EventTypeNormal, "GenerateImageBuilderPod", "Getting dynamo graph %s from api store service", dynamoDeployment.Spec.DynamoNim) recorder.Eventf(dynamoDeployment, corev1.EventTypeNormal, "GenerateImageBuilderPod", "Getting dynamo graph %s from api store service", dynamoDeployment.Spec.DynamoGraph)
dynamoComponent, err = apiStoreClient.GetDynamoComponent(ctx, dynamoComponentRepositoryName, dynamoComponentVersion) dynamoComponent, err = apiStoreClient.GetDynamoComponent(ctx, dynamoComponentRepositoryName, dynamoComponentVersion)
if err != nil { if err != nil {
err = errors.Wrap(err, "get dynamo component") err = errors.Wrap(err, "get dynamo component")
return nil, err return nil, err
} }
recorder.Eventf(dynamoDeployment, corev1.EventTypeNormal, "GenerateImageBuilderPod", "Got dynamo graph %s from api store service", dynamoDeployment.Spec.DynamoNim) recorder.Eventf(dynamoDeployment, corev1.EventTypeNormal, "GenerateImageBuilderPod", "Got dynamo graph %s from api store service", dynamoDeployment.Spec.DynamoGraph)
if dynamoComponent.TransmissionStrategy != nil && *dynamoComponent.TransmissionStrategy == schemas.TransmissionStrategyPresignedURL { if dynamoComponent.TransmissionStrategy != nil && *dynamoComponent.TransmissionStrategy == schemas.TransmissionStrategyPresignedURL {
var dynamoComponent_ *schemas.DynamoComponent var dynamoComponent_ *schemas.DynamoComponent
recorder.Eventf(dynamoDeployment, corev1.EventTypeNormal, "GenerateImageBuilderPod", "Getting presigned url for dynamo graph %s from api store service", dynamoDeployment.Spec.DynamoNim) recorder.Eventf(dynamoDeployment, corev1.EventTypeNormal, "GenerateImageBuilderPod", "Getting presigned url for dynamo graph %s from api store service", dynamoDeployment.Spec.DynamoGraph)
dynamoComponent_, err = apiStoreClient.PresignDynamoComponentDownloadURL(ctx, dynamoComponentRepositoryName, dynamoComponentVersion) dynamoComponent_, err = apiStoreClient.PresignDynamoComponentDownloadURL(ctx, dynamoComponentRepositoryName, dynamoComponentVersion)
if err != nil { if err != nil {
err = errors.Wrap(err, "presign dynamo component download url") err = errors.Wrap(err, "presign dynamo component download url")
return nil, err return nil, err
} }
recorder.Eventf(dynamoDeployment, corev1.EventTypeNormal, "GenerateImageBuilderPod", "Got presigned url for dynamo graph %s from api store service", dynamoDeployment.Spec.DynamoNim) recorder.Eventf(dynamoDeployment, corev1.EventTypeNormal, "GenerateImageBuilderPod", "Got presigned url for dynamo graph %s from api store service", dynamoDeployment.Spec.DynamoGraph)
dynamoGraphDownloadURL = dynamoComponent_.PresignedDownloadUrl dynamoGraphDownloadURL = dynamoComponent_.PresignedDownloadUrl
} else { } else {
dynamoGraphDownloadURL = fmt.Sprintf("%s/api/v1/dynamo_nims/%s/versions/%s/download", apiStoreConf.Endpoint, dynamoComponentRepositoryName, dynamoComponentVersion) dynamoGraphDownloadURL = fmt.Sprintf("%s/api/v1/dynamo_nims/%s/versions/%s/download", apiStoreConf.Endpoint, dynamoComponentRepositoryName, dynamoComponentVersion)
...@@ -133,7 +133,7 @@ func RetrieveDynamoGraphDownloadURL(ctx context.Context, dynamoDeployment *v1alp ...@@ -133,7 +133,7 @@ func RetrieveDynamoGraphDownloadURL(ctx context.Context, dynamoDeployment *v1alp
return &dynamoGraphDownloadURL, nil return &dynamoGraphDownloadURL, nil
} }
// ServicesConfig represents the top-level YAML structure of a dynamoNim yaml file stored in a dynamoNim tar file // ServicesConfig represents the top-level YAML structure of a dynamoComponent yaml file stored in a dynamoComponent tar file
type DynamoGraphConfig struct { type DynamoGraphConfig struct {
DynamoTag string `yaml:"service"` DynamoTag string `yaml:"service"`
Services []ServiceConfig `yaml:"services"` Services []ServiceConfig `yaml:"services"`
...@@ -211,7 +211,7 @@ func ParseDynamoGraphConfig(ctx context.Context, yamlContent *bytes.Buffer) (*Dy ...@@ -211,7 +211,7 @@ func ParseDynamoGraphConfig(ctx context.Context, yamlContent *bytes.Buffer) (*Dy
return &config, err return &config, err
} }
func GetDynamoGraphConfig(ctx context.Context, dynamoDeployment *v1alpha1.DynamoDeployment, recorder EventRecorder) (*DynamoGraphConfig, error) { func GetDynamoGraphConfig(ctx context.Context, dynamoDeployment *v1alpha1.DynamoGraphDeployment, recorder EventRecorder) (*DynamoGraphConfig, error) {
dynamoGraphDownloadURL, err := RetrieveDynamoGraphDownloadURL(ctx, dynamoDeployment, recorder) dynamoGraphDownloadURL, err := RetrieveDynamoGraphDownloadURL(ctx, dynamoDeployment, recorder)
if err != nil { if err != nil {
return nil, err return nil, err
...@@ -224,21 +224,21 @@ func GetDynamoGraphConfig(ctx context.Context, dynamoDeployment *v1alpha1.Dynamo ...@@ -224,21 +224,21 @@ func GetDynamoGraphConfig(ctx context.Context, dynamoDeployment *v1alpha1.Dynamo
} }
// GenerateDynamoComponentsDeployments generates a map of DynamoComponentDeployments from a DynamoGraphConfig // GenerateDynamoComponentsDeployments generates a map of DynamoComponentDeployments from a DynamoGraphConfig
func GenerateDynamoComponentsDeployments(ctx context.Context, parentDynamoDeployment *v1alpha1.DynamoDeployment, config *DynamoGraphConfig, ingressSpec *v1alpha1.IngressSpec) (map[string]*v1alpha1.DynamoNimDeployment, error) { func GenerateDynamoComponentsDeployments(ctx context.Context, parentDynamoGraphDeployment *v1alpha1.DynamoGraphDeployment, config *DynamoGraphConfig, ingressSpec *v1alpha1.IngressSpec) (map[string]*v1alpha1.DynamoComponentDeployment, error) {
dynamoServices := make(map[string]string) dynamoServices := make(map[string]string)
deployments := make(map[string]*v1alpha1.DynamoNimDeployment) deployments := make(map[string]*v1alpha1.DynamoComponentDeployment)
for _, service := range config.Services { for _, service := range config.Services {
deployment := &v1alpha1.DynamoNimDeployment{} deployment := &v1alpha1.DynamoComponentDeployment{}
deployment.Name = fmt.Sprintf("%s-%s", parentDynamoDeployment.Name, strings.ToLower(service.Name)) deployment.Name = fmt.Sprintf("%s-%s", parentDynamoGraphDeployment.Name, strings.ToLower(service.Name))
deployment.Namespace = parentDynamoDeployment.Namespace deployment.Namespace = parentDynamoGraphDeployment.Namespace
deployment.Spec.DynamoTag = config.DynamoTag deployment.Spec.DynamoTag = config.DynamoTag
deployment.Spec.DynamoNim = strings.ReplaceAll(parentDynamoDeployment.Spec.DynamoNim, ":", "--") deployment.Spec.DynamoComponent = parentDynamoGraphDeployment.Spec.DynamoGraph
deployment.Spec.ServiceName = service.Name deployment.Spec.ServiceName = service.Name
if service.Config.Dynamo != nil && service.Config.Dynamo.Enabled { if service.Config.Dynamo != nil && service.Config.Dynamo.Enabled {
dynamoNamespace := service.Config.Dynamo.Namespace dynamoNamespace := service.Config.Dynamo.Namespace
if dynamoNamespace == "" { if dynamoNamespace == "" {
// if no namespace is specified, use the default namespace // if no namespace is specified, use the default namespace
dynamoNamespace = GetDefaultDynamoNamespace(ctx, parentDynamoDeployment) dynamoNamespace = GetDefaultDynamoNamespace(ctx, parentDynamoGraphDeployment)
} }
deployment.Spec.DynamoNamespace = &dynamoNamespace deployment.Spec.DynamoNamespace = &dynamoNamespace
dynamoServices[service.Name] = fmt.Sprintf("%s/%s", service.Config.Dynamo.Name, dynamoNamespace) dynamoServices[service.Name] = fmt.Sprintf("%s/%s", service.Config.Dynamo.Name, dynamoNamespace)
......
...@@ -27,32 +27,32 @@ import ( ...@@ -27,32 +27,32 @@ import (
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
) )
func TestGenerateDynamoNIMDeployments(t *testing.T) { func TestGenerateDynamoComponentsDeployments(t *testing.T) {
type args struct { type args struct {
parentDynamoDeployment *v1alpha1.DynamoDeployment parentDynamoGraphDeployment *v1alpha1.DynamoGraphDeployment
config *DynamoGraphConfig config *DynamoGraphConfig
ingressSpec *v1alpha1.IngressSpec ingressSpec *v1alpha1.IngressSpec
} }
tests := []struct { tests := []struct {
name string name string
args args args args
want map[string]*v1alpha1.DynamoNimDeployment want map[string]*v1alpha1.DynamoComponentDeployment
wantErr bool wantErr bool
}{ }{
{ {
name: "Test GenerateDynamoNIMDeployments http dependency", name: "Test GenerateDynamoComponentsDeployments http dependency",
args: args{ args: args{
parentDynamoDeployment: &v1alpha1.DynamoDeployment{ parentDynamoGraphDeployment: &v1alpha1.DynamoGraphDeployment{
ObjectMeta: metav1.ObjectMeta{ ObjectMeta: metav1.ObjectMeta{
Name: "test-dynamodeployment", Name: "test-dynamographdeployment",
Namespace: "default", Namespace: "default",
}, },
Spec: v1alpha1.DynamoDeploymentSpec{ Spec: v1alpha1.DynamoGraphDeploymentSpec{
DynamoNim: "dynamonim:ac4e234", DynamoGraph: "dynamocomponent:ac4e234",
}, },
}, },
config: &DynamoGraphConfig{ config: &DynamoGraphConfig{
DynamoTag: "dynamonim:MyService1", DynamoTag: "dynamocomponent:MyService1",
Services: []ServiceConfig{ Services: []ServiceConfig{
{ {
Name: "service1", Name: "service1",
...@@ -88,16 +88,16 @@ func TestGenerateDynamoNIMDeployments(t *testing.T) { ...@@ -88,16 +88,16 @@ func TestGenerateDynamoNIMDeployments(t *testing.T) {
}, },
ingressSpec: &v1alpha1.IngressSpec{}, ingressSpec: &v1alpha1.IngressSpec{},
}, },
want: map[string]*v1alpha1.DynamoNimDeployment{ want: map[string]*v1alpha1.DynamoComponentDeployment{
"service1": { "service1": {
ObjectMeta: metav1.ObjectMeta{ ObjectMeta: metav1.ObjectMeta{
Name: "test-dynamodeployment-service1", Name: "test-dynamographdeployment-service1",
Namespace: "default", Namespace: "default",
}, },
Spec: v1alpha1.DynamoNimDeploymentSpec{ Spec: v1alpha1.DynamoComponentDeploymentSpec{
DynamoNim: "dynamonim--ac4e234", DynamoComponent: "dynamocomponent:ac4e234",
DynamoTag: "dynamonim:MyService1", DynamoTag: "dynamocomponent:MyService1",
DynamoNimDeploymentSharedSpec: v1alpha1.DynamoNimDeploymentSharedSpec{ DynamoComponentDeploymentSharedSpec: v1alpha1.DynamoComponentDeploymentSharedSpec{
ServiceName: "service1", ServiceName: "service1",
DynamoNamespace: &[]string{"default"}[0], DynamoNamespace: &[]string{"default"}[0],
Resources: &compounaiCommon.Resources{ Resources: &compounaiCommon.Resources{
...@@ -130,13 +130,13 @@ func TestGenerateDynamoNIMDeployments(t *testing.T) { ...@@ -130,13 +130,13 @@ func TestGenerateDynamoNIMDeployments(t *testing.T) {
}, },
"service2": { "service2": {
ObjectMeta: metav1.ObjectMeta{ ObjectMeta: metav1.ObjectMeta{
Name: "test-dynamodeployment-service2", Name: "test-dynamographdeployment-service2",
Namespace: "default", Namespace: "default",
}, },
Spec: v1alpha1.DynamoNimDeploymentSpec{ Spec: v1alpha1.DynamoComponentDeploymentSpec{
DynamoNim: "dynamonim--ac4e234", DynamoComponent: "dynamocomponent:ac4e234",
DynamoTag: "dynamonim:MyService1", DynamoTag: "dynamocomponent:MyService1",
DynamoNimDeploymentSharedSpec: v1alpha1.DynamoNimDeploymentSharedSpec{ DynamoComponentDeploymentSharedSpec: v1alpha1.DynamoComponentDeploymentSharedSpec{
ServiceName: "service2", ServiceName: "service2",
Autoscaling: &v1alpha1.Autoscaling{ Autoscaling: &v1alpha1.Autoscaling{
Enabled: false, Enabled: false,
...@@ -148,19 +148,19 @@ func TestGenerateDynamoNIMDeployments(t *testing.T) { ...@@ -148,19 +148,19 @@ func TestGenerateDynamoNIMDeployments(t *testing.T) {
wantErr: false, wantErr: false,
}, },
{ {
name: "Test GenerateDynamoNIMDeployments dynamo dependency", name: "Test GenerateDynamoComponentsDeployments dynamo dependency",
args: args{ args: args{
parentDynamoDeployment: &v1alpha1.DynamoDeployment{ parentDynamoGraphDeployment: &v1alpha1.DynamoGraphDeployment{
ObjectMeta: metav1.ObjectMeta{ ObjectMeta: metav1.ObjectMeta{
Name: "test-dynamodeployment", Name: "test-dynamographdeployment",
Namespace: "default", Namespace: "default",
}, },
Spec: v1alpha1.DynamoDeploymentSpec{ Spec: v1alpha1.DynamoGraphDeploymentSpec{
DynamoNim: "dynamonim:ac4e234", DynamoGraph: "dynamocomponent:ac4e234",
}, },
}, },
config: &DynamoGraphConfig{ config: &DynamoGraphConfig{
DynamoTag: "dynamonim:MyService2", DynamoTag: "dynamocomponent:MyService2",
EntryService: "service1", EntryService: "service1",
Services: []ServiceConfig{ Services: []ServiceConfig{
{ {
...@@ -194,19 +194,19 @@ func TestGenerateDynamoNIMDeployments(t *testing.T) { ...@@ -194,19 +194,19 @@ func TestGenerateDynamoNIMDeployments(t *testing.T) {
}, },
ingressSpec: &v1alpha1.IngressSpec{ ingressSpec: &v1alpha1.IngressSpec{
Enabled: true, Enabled: true,
Host: "test-dynamodeployment", Host: "test-dynamographdeployment",
}, },
}, },
want: map[string]*v1alpha1.DynamoNimDeployment{ want: map[string]*v1alpha1.DynamoComponentDeployment{
"service1": { "service1": {
ObjectMeta: metav1.ObjectMeta{ ObjectMeta: metav1.ObjectMeta{
Name: "test-dynamodeployment-service1", Name: "test-dynamographdeployment-service1",
Namespace: "default", Namespace: "default",
}, },
Spec: v1alpha1.DynamoNimDeploymentSpec{ Spec: v1alpha1.DynamoComponentDeploymentSpec{
DynamoNim: "dynamonim--ac4e234", DynamoComponent: "dynamocomponent:ac4e234",
DynamoTag: "dynamonim:MyService2", DynamoTag: "dynamocomponent:MyService2",
DynamoNimDeploymentSharedSpec: v1alpha1.DynamoNimDeploymentSharedSpec{ DynamoComponentDeploymentSharedSpec: v1alpha1.DynamoComponentDeploymentSharedSpec{
ServiceName: "service1", ServiceName: "service1",
Resources: &compounaiCommon.Resources{ Resources: &compounaiCommon.Resources{
Requests: &compounaiCommon.ResourceItem{ Requests: &compounaiCommon.ResourceItem{
...@@ -235,20 +235,20 @@ func TestGenerateDynamoNIMDeployments(t *testing.T) { ...@@ -235,20 +235,20 @@ func TestGenerateDynamoNIMDeployments(t *testing.T) {
}, },
Ingress: v1alpha1.IngressSpec{ Ingress: v1alpha1.IngressSpec{
Enabled: true, Enabled: true,
Host: "test-dynamodeployment", Host: "test-dynamographdeployment",
}, },
}, },
}, },
}, },
"service2": { "service2": {
ObjectMeta: metav1.ObjectMeta{ ObjectMeta: metav1.ObjectMeta{
Name: "test-dynamodeployment-service2", Name: "test-dynamographdeployment-service2",
Namespace: "default", Namespace: "default",
}, },
Spec: v1alpha1.DynamoNimDeploymentSpec{ Spec: v1alpha1.DynamoComponentDeploymentSpec{
DynamoNim: "dynamonim--ac4e234", DynamoComponent: "dynamocomponent:ac4e234",
DynamoTag: "dynamonim:MyService2", DynamoTag: "dynamocomponent:MyService2",
DynamoNimDeploymentSharedSpec: v1alpha1.DynamoNimDeploymentSharedSpec{ DynamoComponentDeploymentSharedSpec: v1alpha1.DynamoComponentDeploymentSharedSpec{
ServiceName: "service2", ServiceName: "service2",
DynamoNamespace: &[]string{"default"}[0], DynamoNamespace: &[]string{"default"}[0],
Autoscaling: &v1alpha1.Autoscaling{ Autoscaling: &v1alpha1.Autoscaling{
...@@ -261,19 +261,19 @@ func TestGenerateDynamoNIMDeployments(t *testing.T) { ...@@ -261,19 +261,19 @@ func TestGenerateDynamoNIMDeployments(t *testing.T) {
wantErr: false, wantErr: false,
}, },
{ {
name: "Test GenerateDynamoNIMDeployments dynamo dependency, default namespace", name: "Test GenerateDynamoComponentsDeployments dynamo dependency, default namespace",
args: args{ args: args{
parentDynamoDeployment: &v1alpha1.DynamoDeployment{ parentDynamoGraphDeployment: &v1alpha1.DynamoGraphDeployment{
ObjectMeta: metav1.ObjectMeta{ ObjectMeta: metav1.ObjectMeta{
Name: "test-dynamodeployment", Name: "test-dynamographdeployment",
Namespace: "default", Namespace: "default",
}, },
Spec: v1alpha1.DynamoDeploymentSpec{ Spec: v1alpha1.DynamoGraphDeploymentSpec{
DynamoNim: "dynamonim:ac4e234", DynamoGraph: "dynamocomponent:ac4e234",
}, },
}, },
config: &DynamoGraphConfig{ config: &DynamoGraphConfig{
DynamoTag: "dynamonim:MyService2", DynamoTag: "dynamocomponent:MyService2",
EntryService: "service1", EntryService: "service1",
Services: []ServiceConfig{ Services: []ServiceConfig{
{ {
...@@ -306,16 +306,16 @@ func TestGenerateDynamoNIMDeployments(t *testing.T) { ...@@ -306,16 +306,16 @@ func TestGenerateDynamoNIMDeployments(t *testing.T) {
}, },
ingressSpec: &v1alpha1.IngressSpec{}, ingressSpec: &v1alpha1.IngressSpec{},
}, },
want: map[string]*v1alpha1.DynamoNimDeployment{ want: map[string]*v1alpha1.DynamoComponentDeployment{
"service1": { "service1": {
ObjectMeta: metav1.ObjectMeta{ ObjectMeta: metav1.ObjectMeta{
Name: "test-dynamodeployment-service1", Name: "test-dynamographdeployment-service1",
Namespace: "default", Namespace: "default",
}, },
Spec: v1alpha1.DynamoNimDeploymentSpec{ Spec: v1alpha1.DynamoComponentDeploymentSpec{
DynamoNim: "dynamonim--ac4e234", DynamoComponent: "dynamocomponent:ac4e234",
DynamoTag: "dynamonim:MyService2", DynamoTag: "dynamocomponent:MyService2",
DynamoNimDeploymentSharedSpec: v1alpha1.DynamoNimDeploymentSharedSpec{ DynamoComponentDeploymentSharedSpec: v1alpha1.DynamoComponentDeploymentSharedSpec{
ServiceName: "service1", ServiceName: "service1",
Resources: &compounaiCommon.Resources{ Resources: &compounaiCommon.Resources{
Requests: &compounaiCommon.ResourceItem{ Requests: &compounaiCommon.ResourceItem{
...@@ -339,7 +339,7 @@ func TestGenerateDynamoNIMDeployments(t *testing.T) { ...@@ -339,7 +339,7 @@ func TestGenerateDynamoNIMDeployments(t *testing.T) {
ExternalServices: map[string]v1alpha1.ExternalService{ ExternalServices: map[string]v1alpha1.ExternalService{
"service2": { "service2": {
DeploymentSelectorKey: "dynamo", DeploymentSelectorKey: "dynamo",
DeploymentSelectorValue: "service2/dynamo-test-dynamodeployment", DeploymentSelectorValue: "service2/dynamo-test-dynamographdeployment",
}, },
}, },
Ingress: v1alpha1.IngressSpec{}, Ingress: v1alpha1.IngressSpec{},
...@@ -348,18 +348,18 @@ func TestGenerateDynamoNIMDeployments(t *testing.T) { ...@@ -348,18 +348,18 @@ func TestGenerateDynamoNIMDeployments(t *testing.T) {
}, },
"service2": { "service2": {
ObjectMeta: metav1.ObjectMeta{ ObjectMeta: metav1.ObjectMeta{
Name: "test-dynamodeployment-service2", Name: "test-dynamographdeployment-service2",
Namespace: "default", Namespace: "default",
}, },
Spec: v1alpha1.DynamoNimDeploymentSpec{ Spec: v1alpha1.DynamoComponentDeploymentSpec{
DynamoNim: "dynamonim--ac4e234", DynamoComponent: "dynamocomponent:ac4e234",
DynamoTag: "dynamonim:MyService2", DynamoTag: "dynamocomponent:MyService2",
DynamoNimDeploymentSharedSpec: v1alpha1.DynamoNimDeploymentSharedSpec{ DynamoComponentDeploymentSharedSpec: v1alpha1.DynamoComponentDeploymentSharedSpec{
ServiceName: "service2", ServiceName: "service2",
Autoscaling: &v1alpha1.Autoscaling{ Autoscaling: &v1alpha1.Autoscaling{
Enabled: false, Enabled: false,
}, },
DynamoNamespace: &[]string{"dynamo-test-dynamodeployment"}[0], DynamoNamespace: &[]string{"dynamo-test-dynamographdeployment"}[0],
}, },
}, },
}, },
...@@ -367,19 +367,19 @@ func TestGenerateDynamoNIMDeployments(t *testing.T) { ...@@ -367,19 +367,19 @@ func TestGenerateDynamoNIMDeployments(t *testing.T) {
wantErr: false, wantErr: false,
}, },
{ {
name: "Test GenerateDynamoNIMDeployments dependency not found", name: "Test GenerateDynamoComponentsDeployments dependency not found",
args: args{ args: args{
parentDynamoDeployment: &v1alpha1.DynamoDeployment{ parentDynamoGraphDeployment: &v1alpha1.DynamoGraphDeployment{
ObjectMeta: metav1.ObjectMeta{ ObjectMeta: metav1.ObjectMeta{
Name: "test-dynamodeployment", Name: "test-dynamographdeployment",
Namespace: "default", Namespace: "default",
}, },
Spec: v1alpha1.DynamoDeploymentSpec{ Spec: v1alpha1.DynamoGraphDeploymentSpec{
DynamoNim: "dynamonim:ac4e234", DynamoGraph: "dynamocomponent:ac4e234",
}, },
}, },
config: &DynamoGraphConfig{ config: &DynamoGraphConfig{
DynamoTag: "dynamonim:MyService3", DynamoTag: "dynamocomponent:MyService3",
Services: []ServiceConfig{ Services: []ServiceConfig{
{ {
Name: "service1", Name: "service1",
...@@ -423,7 +423,7 @@ func TestGenerateDynamoNIMDeployments(t *testing.T) { ...@@ -423,7 +423,7 @@ func TestGenerateDynamoNIMDeployments(t *testing.T) {
for _, tt := range tests { for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) { t.Run(tt.name, func(t *testing.T) {
g := gomega.NewGomegaWithT(t) g := gomega.NewGomegaWithT(t)
got, err := GenerateDynamoComponentsDeployments(context.Background(), tt.args.parentDynamoDeployment, tt.args.config, tt.args.ingressSpec) got, err := GenerateDynamoComponentsDeployments(context.Background(), tt.args.parentDynamoGraphDeployment, tt.args.config, tt.args.ingressSpec)
if (err != nil) != tt.wantErr { if (err != nil) != tt.wantErr {
t.Errorf("GenerateDynamoComponentsDeployments() error = %v, wantErr %v", err, tt.wantErr) t.Errorf("GenerateDynamoComponentsDeployments() error = %v, wantErr %v", err, tt.wantErr)
return return
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment