Skip to content

Commit

Permalink
feat: add servicemeshmember for model registry namespace, fixes RHOAI…
Browse files Browse the repository at this point in the history
…ENG-11831 (opendatahub-io#1202)

* feat: add servicemeshmember for model registry namespace, fixes RHOAIENG-11831

* fix: ignore error if MR smm already exists

* code cleanup for readability

Co-authored-by: Bartosz Majsak <[email protected]>

* Avoid shadowing package name in variable

Co-authored-by: Bartosz Majsak <[email protected]>

* chore: rename createServicemeshMember to enrollToServiceMesh, add log messages

---------

Co-authored-by: Bartosz Majsak <[email protected]>
  • Loading branch information
dhirajsb and bartoszmajsak authored Aug 26, 2024
1 parent 1f34806 commit 8f3d013
Show file tree
Hide file tree
Showing 3 changed files with 74 additions and 3 deletions.
46 changes: 43 additions & 3 deletions components/modelregistry/modelregistry.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@ import (
"errors"
"fmt"
"path/filepath"
"strings"
"text/template"

"github.com/go-logr/logr"
operatorv1 "github.com/openshift/api/operator/v1"
Expand All @@ -15,9 +17,13 @@ import (
"sigs.k8s.io/controller-runtime/pkg/client"

dsciv1 "github.com/opendatahub-io/opendatahub-operator/v2/apis/dscinitialization/v1"
infrav1 "github.com/opendatahub-io/opendatahub-operator/v2/apis/infrastructure/v1"
"github.com/opendatahub-io/opendatahub-operator/v2/components"
"github.com/opendatahub-io/opendatahub-operator/v2/pkg/cluster"
"github.com/opendatahub-io/opendatahub-operator/v2/pkg/conversion"
"github.com/opendatahub-io/opendatahub-operator/v2/pkg/deploy"

_ "embed"
)

const DefaultModelRegistryCert = "default-modelregistry-cert"
Expand All @@ -27,8 +33,9 @@ var (
Path = deploy.DefaultManifestPath + "/" + ComponentName + "/overlays/odh"
// we should not apply this label to the namespace, as it triggered namspace deletion during operator uninstall
// modelRegistryLabels = cluster.WithLabels(
// labels.ODH.OwnedNamespace, "true",
// labels.ODH.OwnedNamespace, "true",
// ).
ModelRegistriesNamespace = "odh-model-registries"
)

// Verifies that ModelRegistry implements ComponentInterface.
Expand Down Expand Up @@ -100,12 +107,19 @@ func (m *ModelRegistry) ReconcileComponent(ctx context.Context, cli client.Clien
}
}

// Create odh-model-registries namespace
// Create model registries namespace
// We do not delete this namespace even when ModelRegistry is Removed or when operator is uninstalled.
_, err := cluster.CreateNamespace(ctx, cli, "odh-model-registries")
ns, err := cluster.CreateNamespace(ctx, cli, ModelRegistriesNamespace)
if err != nil {
return err
}
l.Info("created model registry namespace", "namespace", ModelRegistriesNamespace)
// create servicemeshmember here, for now until post MVP solution
err = enrollToServiceMesh(ctx, cli, dscispec, ns)
if err != nil {
return err
}
l.Info("created model registry servicemesh member", "namespace", ModelRegistriesNamespace)
} else {
err := m.removeDependencies(ctx, cli, dscispec)
if err != nil {
Expand Down Expand Up @@ -169,3 +183,29 @@ func (m *ModelRegistry) removeDependencies(ctx context.Context, cli client.Clien
}
return nil
}

//go:embed resources/servicemesh-member.tmpl.yaml
var smmTemplate string

func enrollToServiceMesh(ctx context.Context, cli client.Client, dscispec *dsciv1.DSCInitializationSpec, namespace *corev1.Namespace) error {
tmpl, err := template.New("servicemeshmember").Parse(smmTemplate)
if err != nil {
return fmt.Errorf("error parsing servicemeshmember template: %w", err)
}
builder := strings.Builder{}
controlPlaneData := struct {
Namespace string
ControlPlane *infrav1.ControlPlaneSpec
}{Namespace: namespace.Name, ControlPlane: &dscispec.ServiceMesh.ControlPlane}

if err = tmpl.Execute(&builder, controlPlaneData); err != nil {
return fmt.Errorf("error executing servicemeshmember template: %w", err)
}

unstrObj, err := conversion.StrToUnstructured(builder.String())
if err != nil || len(unstrObj) != 1 {
return fmt.Errorf("error converting servicemeshmember template: %w", err)
}

return client.IgnoreAlreadyExists(cli.Create(ctx, unstrObj[0]))
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
apiVersion: maistra.io/v1
kind: ServiceMeshMember
metadata:
name: default
namespace: {{.Namespace}}
spec:
controlPlaneRef:
namespace: {{ .ControlPlane.Namespace }}
name: {{ .ControlPlane.Name }}
22 changes: 22 additions & 0 deletions tests/e2e/dsc_creation_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ import (
"k8s.io/apimachinery/pkg/types"
"k8s.io/apimachinery/pkg/util/wait"
"k8s.io/client-go/util/retry"
"sigs.k8s.io/controller-runtime/pkg/client"

dscv1 "github.com/opendatahub-io/opendatahub-operator/v2/apis/datasciencecluster/v1"
dsciv1 "github.com/opendatahub-io/opendatahub-operator/v2/apis/dscinitialization/v1"
Expand Down Expand Up @@ -81,6 +82,10 @@ func creationTestSuite(t *testing.T) {
err = testCtx.testDefaultModelRegistryCertAvailable()
require.NoError(t, err, "error getting default cert secret for ModelRegistry")
})
t.Run("Validate model registry servicemeshmember available", func(t *testing.T) {
err = testCtx.testMRServiceMeshMember()
require.NoError(t, err, "error getting servicemeshmember for Model Registry")
})
t.Run("Validate Controller reconcile", func(t *testing.T) {
// only test Dashboard component for now
err = testCtx.testUpdateComponentReconcile()
Expand Down Expand Up @@ -470,6 +475,23 @@ func (tc *testContext) testDefaultModelRegistryCertAvailable() error {
return nil
}

func (tc *testContext) testMRServiceMeshMember() error {
if tc.testDsc.Spec.Components.ModelRegistry.ManagementState != operatorv1.Managed {
return nil
}

// Get unstructured ServiceMeshMember
smm := unstructured.Unstructured{}
smm.SetAPIVersion("maistra.io/v1")
smm.SetKind("ServiceMeshMember")
err := tc.customClient.Get(tc.ctx,
client.ObjectKey{Namespace: modelregistry.ModelRegistriesNamespace, Name: "default"}, &smm)
if err != nil {
return fmt.Errorf("failed to get servicemesh member: %w", err)
}
return nil
}

func (tc *testContext) testUpdateComponentReconcile() error {
// Test Updating Dashboard Replicas

Expand Down

0 comments on commit 8f3d013

Please sign in to comment.