"vscode:/vscode.git/clone" did not exist on "96dfcbd05101d0bc3cc6ad87548c4d69b475b989"
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
import (
"fmt"
"strings"
"github.com/ai-dynamo/dynamo/deploy/dynamo/operator/api/v1alpha1"
corev1 "k8s.io/api/core/v1"
......@@ -90,3 +91,7 @@ func getIngressHost(ingressSpec v1alpha1.IngressSpec) string {
}
return fmt.Sprintf("%s.%s", host, ingressSuffix)
}
func getK8sName(value string) string {
return strings.ReplaceAll(value, ":", "--")
}
......@@ -160,13 +160,13 @@ func (m *mockEtcdStorage) DeleteKeys(ctx context.Context, prefix string) error {
return m.deleteKeysFunc(ctx, prefix)
}
func TestDynamoNimDeploymentReconciler_FinalizeResource(t *testing.T) {
func TestDynamoComponentDeploymentReconciler_FinalizeResource(t *testing.T) {
type fields struct {
EtcdStorage etcdStorage
}
type args struct {
ctx context.Context
dynamoNimDeployment *v1alpha1.DynamoNimDeployment
ctx context.Context
dynamoComponentDeployment *v1alpha1.DynamoComponentDeployment
}
tests := []struct {
name string
......@@ -188,9 +188,9 @@ func TestDynamoNimDeploymentReconciler_FinalizeResource(t *testing.T) {
},
args: args{
ctx: context.Background(),
dynamoNimDeployment: &v1alpha1.DynamoNimDeployment{
Spec: v1alpha1.DynamoNimDeploymentSpec{
DynamoNimDeploymentSharedSpec: v1alpha1.DynamoNimDeploymentSharedSpec{
dynamoComponentDeployment: &v1alpha1.DynamoComponentDeployment{
Spec: v1alpha1.DynamoComponentDeploymentSpec{
DynamoComponentDeploymentSharedSpec: v1alpha1.DynamoComponentDeploymentSharedSpec{
ServiceName: "service1",
DynamoNamespace: &[]string{"default"}[0],
},
......@@ -210,9 +210,9 @@ func TestDynamoNimDeploymentReconciler_FinalizeResource(t *testing.T) {
},
args: args{
ctx: context.Background(),
dynamoNimDeployment: &v1alpha1.DynamoNimDeployment{
Spec: v1alpha1.DynamoNimDeploymentSpec{
DynamoNimDeploymentSharedSpec: v1alpha1.DynamoNimDeploymentSharedSpec{
dynamoComponentDeployment: &v1alpha1.DynamoComponentDeployment{
Spec: v1alpha1.DynamoComponentDeploymentSpec{
DynamoComponentDeploymentSharedSpec: v1alpha1.DynamoComponentDeploymentSharedSpec{
ServiceName: "service1",
DynamoNamespace: &[]string{"default"}[0],
},
......@@ -224,17 +224,17 @@ func TestDynamoNimDeploymentReconciler_FinalizeResource(t *testing.T) {
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
r := &DynamoNimDeploymentReconciler{
r := &DynamoComponentDeploymentReconciler{
EtcdStorage: tt.fields.EtcdStorage,
}
if err := r.FinalizeResource(tt.args.ctx, tt.args.dynamoNimDeployment); (err != nil) != tt.wantErr {
t.Errorf("DynamoNimDeploymentReconciler.FinalizeResource() error = %v, wantErr %v", err, tt.wantErr)
if err := r.FinalizeResource(tt.args.ctx, tt.args.dynamoComponentDeployment); (err != nil) != 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 args struct {
......@@ -255,13 +255,13 @@ func TestDynamoNimDeploymentReconciler_generateIngress(t *testing.T) {
args: args{
ctx: context.Background(),
opt: generateResourceOption{
dynamoNimDeployment: &v1alpha1.DynamoNimDeployment{
dynamoComponentDeployment: &v1alpha1.DynamoComponentDeployment{
ObjectMeta: metav1.ObjectMeta{
Name: "service1",
Namespace: "default",
},
Spec: v1alpha1.DynamoNimDeploymentSpec{
DynamoNimDeploymentSharedSpec: v1alpha1.DynamoNimDeploymentSharedSpec{
Spec: v1alpha1.DynamoComponentDeploymentSpec{
DynamoComponentDeploymentSharedSpec: v1alpha1.DynamoComponentDeploymentSharedSpec{
ServiceName: "service1",
DynamoNamespace: &[]string{"default"}[0],
Ingress: v1alpha1.IngressSpec{
......@@ -314,13 +314,13 @@ func TestDynamoNimDeploymentReconciler_generateIngress(t *testing.T) {
args: args{
ctx: context.Background(),
opt: generateResourceOption{
dynamoNimDeployment: &v1alpha1.DynamoNimDeployment{
dynamoComponentDeployment: &v1alpha1.DynamoComponentDeployment{
ObjectMeta: metav1.ObjectMeta{
Name: "service1",
Namespace: "default",
},
Spec: v1alpha1.DynamoNimDeploymentSpec{
DynamoNimDeploymentSharedSpec: v1alpha1.DynamoNimDeploymentSharedSpec{
Spec: v1alpha1.DynamoComponentDeploymentSpec{
DynamoComponentDeploymentSharedSpec: v1alpha1.DynamoComponentDeploymentSharedSpec{
ServiceName: "service1",
DynamoNamespace: &[]string{"default"}[0],
Ingress: v1alpha1.IngressSpec{
......@@ -344,10 +344,10 @@ func TestDynamoNimDeploymentReconciler_generateIngress(t *testing.T) {
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
g := gomega.NewGomegaWithT(t)
r := &DynamoNimDeploymentReconciler{}
r := &DynamoComponentDeploymentReconciler{}
got, got1, err := r.generateIngress(tt.args.ctx, tt.args.opt)
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
}
g.Expect(got).To(gomega.Equal(tt.want))
......@@ -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 args struct {
......@@ -377,13 +377,13 @@ func TestDynamoNimDeploymentReconciler_generateVirtualService(t *testing.T) {
args: args{
ctx: context.Background(),
opt: generateResourceOption{
dynamoNimDeployment: &v1alpha1.DynamoNimDeployment{
dynamoComponentDeployment: &v1alpha1.DynamoComponentDeployment{
ObjectMeta: metav1.ObjectMeta{
Name: "service1",
Namespace: "default",
},
Spec: v1alpha1.DynamoNimDeploymentSpec{
DynamoNimDeploymentSharedSpec: v1alpha1.DynamoNimDeploymentSharedSpec{
Spec: v1alpha1.DynamoComponentDeploymentSpec{
DynamoComponentDeploymentSharedSpec: v1alpha1.DynamoComponentDeploymentSharedSpec{
ServiceName: "service1",
DynamoNamespace: &[]string{"default"}[0],
Ingress: v1alpha1.IngressSpec{
......@@ -409,13 +409,13 @@ func TestDynamoNimDeploymentReconciler_generateVirtualService(t *testing.T) {
args: args{
ctx: context.Background(),
opt: generateResourceOption{
dynamoNimDeployment: &v1alpha1.DynamoNimDeployment{
dynamoComponentDeployment: &v1alpha1.DynamoComponentDeployment{
ObjectMeta: metav1.ObjectMeta{
Name: "service1",
Namespace: "default",
},
Spec: v1alpha1.DynamoNimDeploymentSpec{
DynamoNimDeploymentSharedSpec: v1alpha1.DynamoNimDeploymentSharedSpec{
Spec: v1alpha1.DynamoComponentDeploymentSpec{
DynamoComponentDeploymentSharedSpec: v1alpha1.DynamoComponentDeploymentSharedSpec{
ServiceName: "service1",
DynamoNamespace: &[]string{"default"}[0],
Ingress: v1alpha1.IngressSpec{
......@@ -467,10 +467,10 @@ func TestDynamoNimDeploymentReconciler_generateVirtualService(t *testing.T) {
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
g := gomega.NewGomegaWithT(t)
r := &DynamoNimDeploymentReconciler{}
r := &DynamoComponentDeploymentReconciler{}
got, got1, err := r.generateVirtualService(tt.args.ctx, tt.args.opt)
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
}
g.Expect(got).To(gomega.Equal(tt.want))
......
......@@ -50,8 +50,8 @@ type etcdStorage interface {
DeleteKeys(ctx context.Context, prefix string) error
}
// DynamoDeploymentReconciler reconciles a DynamoDeployment object
type DynamoDeploymentReconciler struct {
// DynamoGraphDeploymentReconciler reconciles a DynamoGraphDeployment object
type DynamoGraphDeploymentReconciler struct {
client.Client
Scheme *runtime.Scheme
Config commonController.Config
......@@ -62,20 +62,20 @@ type DynamoDeploymentReconciler struct {
IngressHostSuffix string
}
// +kubebuilder:rbac:groups=nvidia.com,resources=dynamodeployments,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=dynamodeployments/finalizers,verbs=update
// +kubebuilder:rbac:groups=nvidia.com,resources=dynamographdeployments,verbs=get;list;watch;create;update;patch;delete
// +kubebuilder:rbac:groups=nvidia.com,resources=dynamographdeployments/status,verbs=get;update;patch
// +kubebuilder:rbac:groups=nvidia.com,resources=dynamographdeployments/finalizers,verbs=update
// Reconcile is part of the main kubernetes reconciliation loop which aims to
// move the current state of the cluster closer to the desired state.
// 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
// the user.
//
// For more details, check Reconcile and its Result here:
// - 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)
var err error
......@@ -83,7 +83,7 @@ func (r *DynamoDeploymentReconciler) Reconcile(ctx context.Context, req ctrl.Req
message := ""
readyStatus := metav1.ConditionFalse
// retrieve the CRD
dynamoDeployment := &nvidiacomv1alpha1.DynamoDeployment{}
dynamoDeployment := &nvidiacomv1alpha1.DynamoGraphDeployment{}
if err = r.Get(ctx, req.NamespacedName, dynamoDeployment); err != nil {
return ctrl.Result{}, client.IgnoreNotFound(err)
}
......@@ -138,7 +138,7 @@ func (r *DynamoDeploymentReconciler) Reconcile(ctx context.Context, req ctrl.Req
// merge the dynamoComponentsDeployments with the dynamoComponentsDeployments from the CRD
for serviceName, deployment := range dynamoComponentsDeployments {
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 {
reason = "failed_to_merge_the_DynamoComponentsDeployments"
return ctrl.Result{}, err
......@@ -156,37 +156,38 @@ func (r *DynamoDeploymentReconciler) Reconcile(ctx context.Context, req ctrl.Req
}
}
// reconcile the dynamoNimRequest
dynamoNimRequest := &nvidiacomv1alpha1.DynamoNimRequest{
// reconcile the dynamoComponentRequest
// 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{
Name: strings.ReplaceAll(dynamoDeployment.Spec.DynamoNim, ":", "--"),
Name: strings.ReplaceAll(dynamoDeployment.Spec.DynamoGraph, ":", "--"),
Namespace: dynamoDeployment.Namespace,
},
Spec: nvidiacomv1alpha1.DynamoNimRequestSpec{
BentoTag: dynamoDeployment.Spec.DynamoNim,
Spec: nvidiacomv1alpha1.DynamoComponentRequestSpec{
DynamoComponent: dynamoDeployment.Spec.DynamoGraph,
},
}
if err := ctrl.SetControllerReference(dynamoDeployment, dynamoNimRequest, r.Scheme); err != nil {
reason = "failed_to_set_the_controller_reference_for_the_DynamoNimRequest"
if err := ctrl.SetControllerReference(dynamoDeployment, dynamoComponentRequest, r.Scheme); err != nil {
reason = "failed_to_set_the_controller_reference_for_the_DynamoComponentRequest"
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 {
reason = "failed_to_sync_the_DynamoNimRequest"
reason = "failed_to_sync_the_DynamoComponentRequest"
return ctrl.Result{}, err
}
notReadyDeployments := []string{}
// reconcile the 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 {
reason = "failed_to_set_the_controller_reference_for_the_DynamoComponentDeployment"
return ctrl.Result{}, err
}
dynamoComponentDeployment, err = commonController.SyncResource(ctx, r.Client, dynamoComponentDeployment, types.NamespacedName{Name: dynamoComponentDeployment.Name, Namespace: dynamoComponentDeployment.Namespace}, false)
if err != nil {
reason = "failed_to_sync_the_DynamoNimDeployment"
reason = "failed_to_sync_the_DynamoComponentDeployment"
return ctrl.Result{}, err
}
if !dynamoComponentDeployment.Status.IsReady() {
......@@ -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{
Enabled: r.VirtualServiceGateway != "" || r.IngressControllerClassName != "",
Host: dynamoDeployment.Name,
......@@ -231,7 +232,7 @@ func (r *DynamoDeploymentReconciler) generateDefaultIngressSpec(dynamoDeployment
return res
}
func (r *DynamoDeploymentReconciler) isEndpointSecured() bool {
func (r *DynamoGraphDeploymentReconciler) isEndpointSecured() bool {
return r.IngressControllerTLSSecret != ""
}
......@@ -256,19 +257,19 @@ func mergeEnvs(common, specific []corev1.EnvVar) []corev1.EnvVar {
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
return nil
}
// 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).
For(&nvidiacomv1alpha1.DynamoDeployment{}, builder.WithPredicates(
For(&nvidiacomv1alpha1.DynamoGraphDeployment{}, builder.WithPredicates(
predicate.GenerationChangedPredicate{},
)).
Named("dynamodeployment").
Owns(&nvidiacomv1alpha1.DynamoNimDeployment{}, builder.WithPredicates(predicate.Funcs{
Named("dynamographdeployment").
Owns(&nvidiacomv1alpha1.DynamoComponentDeployment{}, builder.WithPredicates(predicate.Funcs{
// ignore creation cause we don't want to be called again after we create the deployment
CreateFunc: func(ce event.CreateEvent) bool { return false },
DeleteFunc: func(de event.DeleteEvent) bool { return true },
......
......@@ -84,14 +84,14 @@ func (s ServiceConfig) GetNamespace() *string {
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)
}
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 := ""
var dynamoComponent *schemas.DynamoComponent
dynamoComponentRepositoryName, _, dynamoComponentVersion := xstrings.Partition(dynamoDeployment.Spec.DynamoNim, ":")
dynamoComponentRepositoryName, _, dynamoComponentVersion := xstrings.Partition(dynamoDeployment.Spec.DynamoGraph, ":")
var err error
var apiStoreClient *apiStoreClient.ApiStoreClient
......@@ -108,23 +108,23 @@ func RetrieveDynamoGraphDownloadURL(ctx context.Context, dynamoDeployment *v1alp
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)
if err != nil {
err = errors.Wrap(err, "get dynamo component")
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 {
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)
if err != nil {
err = errors.Wrap(err, "presign dynamo component download url")
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
} else {
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
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 {
DynamoTag string `yaml:"service"`
Services []ServiceConfig `yaml:"services"`
......@@ -211,7 +211,7 @@ func ParseDynamoGraphConfig(ctx context.Context, yamlContent *bytes.Buffer) (*Dy
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)
if err != nil {
return nil, err
......@@ -224,21 +224,21 @@ func GetDynamoGraphConfig(ctx context.Context, dynamoDeployment *v1alpha1.Dynamo
}
// 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)
deployments := make(map[string]*v1alpha1.DynamoNimDeployment)
deployments := make(map[string]*v1alpha1.DynamoComponentDeployment)
for _, service := range config.Services {
deployment := &v1alpha1.DynamoNimDeployment{}
deployment.Name = fmt.Sprintf("%s-%s", parentDynamoDeployment.Name, strings.ToLower(service.Name))
deployment.Namespace = parentDynamoDeployment.Namespace
deployment := &v1alpha1.DynamoComponentDeployment{}
deployment.Name = fmt.Sprintf("%s-%s", parentDynamoGraphDeployment.Name, strings.ToLower(service.Name))
deployment.Namespace = parentDynamoGraphDeployment.Namespace
deployment.Spec.DynamoTag = config.DynamoTag
deployment.Spec.DynamoNim = strings.ReplaceAll(parentDynamoDeployment.Spec.DynamoNim, ":", "--")
deployment.Spec.DynamoComponent = parentDynamoGraphDeployment.Spec.DynamoGraph
deployment.Spec.ServiceName = service.Name
if service.Config.Dynamo != nil && service.Config.Dynamo.Enabled {
dynamoNamespace := service.Config.Dynamo.Namespace
if dynamoNamespace == "" {
// if no namespace is specified, use the default namespace
dynamoNamespace = GetDefaultDynamoNamespace(ctx, parentDynamoDeployment)
dynamoNamespace = GetDefaultDynamoNamespace(ctx, parentDynamoGraphDeployment)
}
deployment.Spec.DynamoNamespace = &dynamoNamespace
dynamoServices[service.Name] = fmt.Sprintf("%s/%s", service.Config.Dynamo.Name, dynamoNamespace)
......
......@@ -27,32 +27,32 @@ import (
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
)
func TestGenerateDynamoNIMDeployments(t *testing.T) {
func TestGenerateDynamoComponentsDeployments(t *testing.T) {
type args struct {
parentDynamoDeployment *v1alpha1.DynamoDeployment
config *DynamoGraphConfig
ingressSpec *v1alpha1.IngressSpec
parentDynamoGraphDeployment *v1alpha1.DynamoGraphDeployment
config *DynamoGraphConfig
ingressSpec *v1alpha1.IngressSpec
}
tests := []struct {
name string
args args
want map[string]*v1alpha1.DynamoNimDeployment
want map[string]*v1alpha1.DynamoComponentDeployment
wantErr bool
}{
{
name: "Test GenerateDynamoNIMDeployments http dependency",
name: "Test GenerateDynamoComponentsDeployments http dependency",
args: args{
parentDynamoDeployment: &v1alpha1.DynamoDeployment{
parentDynamoGraphDeployment: &v1alpha1.DynamoGraphDeployment{
ObjectMeta: metav1.ObjectMeta{
Name: "test-dynamodeployment",
Name: "test-dynamographdeployment",
Namespace: "default",
},
Spec: v1alpha1.DynamoDeploymentSpec{
DynamoNim: "dynamonim:ac4e234",
Spec: v1alpha1.DynamoGraphDeploymentSpec{
DynamoGraph: "dynamocomponent:ac4e234",
},
},
config: &DynamoGraphConfig{
DynamoTag: "dynamonim:MyService1",
DynamoTag: "dynamocomponent:MyService1",
Services: []ServiceConfig{
{
Name: "service1",
......@@ -88,16 +88,16 @@ func TestGenerateDynamoNIMDeployments(t *testing.T) {
},
ingressSpec: &v1alpha1.IngressSpec{},
},
want: map[string]*v1alpha1.DynamoNimDeployment{
want: map[string]*v1alpha1.DynamoComponentDeployment{
"service1": {
ObjectMeta: metav1.ObjectMeta{
Name: "test-dynamodeployment-service1",
Name: "test-dynamographdeployment-service1",
Namespace: "default",
},
Spec: v1alpha1.DynamoNimDeploymentSpec{
DynamoNim: "dynamonim--ac4e234",
DynamoTag: "dynamonim:MyService1",
DynamoNimDeploymentSharedSpec: v1alpha1.DynamoNimDeploymentSharedSpec{
Spec: v1alpha1.DynamoComponentDeploymentSpec{
DynamoComponent: "dynamocomponent:ac4e234",
DynamoTag: "dynamocomponent:MyService1",
DynamoComponentDeploymentSharedSpec: v1alpha1.DynamoComponentDeploymentSharedSpec{
ServiceName: "service1",
DynamoNamespace: &[]string{"default"}[0],
Resources: &compounaiCommon.Resources{
......@@ -130,13 +130,13 @@ func TestGenerateDynamoNIMDeployments(t *testing.T) {
},
"service2": {
ObjectMeta: metav1.ObjectMeta{
Name: "test-dynamodeployment-service2",
Name: "test-dynamographdeployment-service2",
Namespace: "default",
},
Spec: v1alpha1.DynamoNimDeploymentSpec{
DynamoNim: "dynamonim--ac4e234",
DynamoTag: "dynamonim:MyService1",
DynamoNimDeploymentSharedSpec: v1alpha1.DynamoNimDeploymentSharedSpec{
Spec: v1alpha1.DynamoComponentDeploymentSpec{
DynamoComponent: "dynamocomponent:ac4e234",
DynamoTag: "dynamocomponent:MyService1",
DynamoComponentDeploymentSharedSpec: v1alpha1.DynamoComponentDeploymentSharedSpec{
ServiceName: "service2",
Autoscaling: &v1alpha1.Autoscaling{
Enabled: false,
......@@ -148,19 +148,19 @@ func TestGenerateDynamoNIMDeployments(t *testing.T) {
wantErr: false,
},
{
name: "Test GenerateDynamoNIMDeployments dynamo dependency",
name: "Test GenerateDynamoComponentsDeployments dynamo dependency",
args: args{
parentDynamoDeployment: &v1alpha1.DynamoDeployment{
parentDynamoGraphDeployment: &v1alpha1.DynamoGraphDeployment{
ObjectMeta: metav1.ObjectMeta{
Name: "test-dynamodeployment",
Name: "test-dynamographdeployment",
Namespace: "default",
},
Spec: v1alpha1.DynamoDeploymentSpec{
DynamoNim: "dynamonim:ac4e234",
Spec: v1alpha1.DynamoGraphDeploymentSpec{
DynamoGraph: "dynamocomponent:ac4e234",
},
},
config: &DynamoGraphConfig{
DynamoTag: "dynamonim:MyService2",
DynamoTag: "dynamocomponent:MyService2",
EntryService: "service1",
Services: []ServiceConfig{
{
......@@ -194,19 +194,19 @@ func TestGenerateDynamoNIMDeployments(t *testing.T) {
},
ingressSpec: &v1alpha1.IngressSpec{
Enabled: true,
Host: "test-dynamodeployment",
Host: "test-dynamographdeployment",
},
},
want: map[string]*v1alpha1.DynamoNimDeployment{
want: map[string]*v1alpha1.DynamoComponentDeployment{
"service1": {
ObjectMeta: metav1.ObjectMeta{
Name: "test-dynamodeployment-service1",
Name: "test-dynamographdeployment-service1",
Namespace: "default",
},
Spec: v1alpha1.DynamoNimDeploymentSpec{
DynamoNim: "dynamonim--ac4e234",
DynamoTag: "dynamonim:MyService2",
DynamoNimDeploymentSharedSpec: v1alpha1.DynamoNimDeploymentSharedSpec{
Spec: v1alpha1.DynamoComponentDeploymentSpec{
DynamoComponent: "dynamocomponent:ac4e234",
DynamoTag: "dynamocomponent:MyService2",
DynamoComponentDeploymentSharedSpec: v1alpha1.DynamoComponentDeploymentSharedSpec{
ServiceName: "service1",
Resources: &compounaiCommon.Resources{
Requests: &compounaiCommon.ResourceItem{
......@@ -235,20 +235,20 @@ func TestGenerateDynamoNIMDeployments(t *testing.T) {
},
Ingress: v1alpha1.IngressSpec{
Enabled: true,
Host: "test-dynamodeployment",
Host: "test-dynamographdeployment",
},
},
},
},
"service2": {
ObjectMeta: metav1.ObjectMeta{
Name: "test-dynamodeployment-service2",
Name: "test-dynamographdeployment-service2",
Namespace: "default",
},
Spec: v1alpha1.DynamoNimDeploymentSpec{
DynamoNim: "dynamonim--ac4e234",
DynamoTag: "dynamonim:MyService2",
DynamoNimDeploymentSharedSpec: v1alpha1.DynamoNimDeploymentSharedSpec{
Spec: v1alpha1.DynamoComponentDeploymentSpec{
DynamoComponent: "dynamocomponent:ac4e234",
DynamoTag: "dynamocomponent:MyService2",
DynamoComponentDeploymentSharedSpec: v1alpha1.DynamoComponentDeploymentSharedSpec{
ServiceName: "service2",
DynamoNamespace: &[]string{"default"}[0],
Autoscaling: &v1alpha1.Autoscaling{
......@@ -261,19 +261,19 @@ func TestGenerateDynamoNIMDeployments(t *testing.T) {
wantErr: false,
},
{
name: "Test GenerateDynamoNIMDeployments dynamo dependency, default namespace",
name: "Test GenerateDynamoComponentsDeployments dynamo dependency, default namespace",
args: args{
parentDynamoDeployment: &v1alpha1.DynamoDeployment{
parentDynamoGraphDeployment: &v1alpha1.DynamoGraphDeployment{
ObjectMeta: metav1.ObjectMeta{
Name: "test-dynamodeployment",
Name: "test-dynamographdeployment",
Namespace: "default",
},
Spec: v1alpha1.DynamoDeploymentSpec{
DynamoNim: "dynamonim:ac4e234",
Spec: v1alpha1.DynamoGraphDeploymentSpec{
DynamoGraph: "dynamocomponent:ac4e234",
},
},
config: &DynamoGraphConfig{
DynamoTag: "dynamonim:MyService2",
DynamoTag: "dynamocomponent:MyService2",
EntryService: "service1",
Services: []ServiceConfig{
{
......@@ -306,16 +306,16 @@ func TestGenerateDynamoNIMDeployments(t *testing.T) {
},
ingressSpec: &v1alpha1.IngressSpec{},
},
want: map[string]*v1alpha1.DynamoNimDeployment{
want: map[string]*v1alpha1.DynamoComponentDeployment{
"service1": {
ObjectMeta: metav1.ObjectMeta{
Name: "test-dynamodeployment-service1",
Name: "test-dynamographdeployment-service1",
Namespace: "default",
},
Spec: v1alpha1.DynamoNimDeploymentSpec{
DynamoNim: "dynamonim--ac4e234",
DynamoTag: "dynamonim:MyService2",
DynamoNimDeploymentSharedSpec: v1alpha1.DynamoNimDeploymentSharedSpec{
Spec: v1alpha1.DynamoComponentDeploymentSpec{
DynamoComponent: "dynamocomponent:ac4e234",
DynamoTag: "dynamocomponent:MyService2",
DynamoComponentDeploymentSharedSpec: v1alpha1.DynamoComponentDeploymentSharedSpec{
ServiceName: "service1",
Resources: &compounaiCommon.Resources{
Requests: &compounaiCommon.ResourceItem{
......@@ -339,7 +339,7 @@ func TestGenerateDynamoNIMDeployments(t *testing.T) {
ExternalServices: map[string]v1alpha1.ExternalService{
"service2": {
DeploymentSelectorKey: "dynamo",
DeploymentSelectorValue: "service2/dynamo-test-dynamodeployment",
DeploymentSelectorValue: "service2/dynamo-test-dynamographdeployment",
},
},
Ingress: v1alpha1.IngressSpec{},
......@@ -348,18 +348,18 @@ func TestGenerateDynamoNIMDeployments(t *testing.T) {
},
"service2": {
ObjectMeta: metav1.ObjectMeta{
Name: "test-dynamodeployment-service2",
Name: "test-dynamographdeployment-service2",
Namespace: "default",
},
Spec: v1alpha1.DynamoNimDeploymentSpec{
DynamoNim: "dynamonim--ac4e234",
DynamoTag: "dynamonim:MyService2",
DynamoNimDeploymentSharedSpec: v1alpha1.DynamoNimDeploymentSharedSpec{
Spec: v1alpha1.DynamoComponentDeploymentSpec{
DynamoComponent: "dynamocomponent:ac4e234",
DynamoTag: "dynamocomponent:MyService2",
DynamoComponentDeploymentSharedSpec: v1alpha1.DynamoComponentDeploymentSharedSpec{
ServiceName: "service2",
Autoscaling: &v1alpha1.Autoscaling{
Enabled: false,
},
DynamoNamespace: &[]string{"dynamo-test-dynamodeployment"}[0],
DynamoNamespace: &[]string{"dynamo-test-dynamographdeployment"}[0],
},
},
},
......@@ -367,19 +367,19 @@ func TestGenerateDynamoNIMDeployments(t *testing.T) {
wantErr: false,
},
{
name: "Test GenerateDynamoNIMDeployments dependency not found",
name: "Test GenerateDynamoComponentsDeployments dependency not found",
args: args{
parentDynamoDeployment: &v1alpha1.DynamoDeployment{
parentDynamoGraphDeployment: &v1alpha1.DynamoGraphDeployment{
ObjectMeta: metav1.ObjectMeta{
Name: "test-dynamodeployment",
Name: "test-dynamographdeployment",
Namespace: "default",
},
Spec: v1alpha1.DynamoDeploymentSpec{
DynamoNim: "dynamonim:ac4e234",
Spec: v1alpha1.DynamoGraphDeploymentSpec{
DynamoGraph: "dynamocomponent:ac4e234",
},
},
config: &DynamoGraphConfig{
DynamoTag: "dynamonim:MyService3",
DynamoTag: "dynamocomponent:MyService3",
Services: []ServiceConfig{
{
Name: "service1",
......@@ -423,7 +423,7 @@ func TestGenerateDynamoNIMDeployments(t *testing.T) {
for _, tt := range tests {
t.Run(tt.name, func(t *testing.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 {
t.Errorf("GenerateDynamoComponentsDeployments() error = %v, wantErr %v", err, tt.wantErr)
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