diff --git a/pkg/multicluster/cluster_management.go b/pkg/multicluster/cluster_management.go index 69d4c91f6..9a3f84b3e 100644 --- a/pkg/multicluster/cluster_management.go +++ b/pkg/multicluster/cluster_management.go @@ -34,6 +34,7 @@ import ( "sigs.k8s.io/controller-runtime/pkg/client" "github.com/oam-dev/kubevela/apis/core.oam.dev/v1beta1" + "github.com/oam-dev/kubevela/apis/types" "github.com/oam-dev/kubevela/pkg/policy/envbinding" errors3 "github.com/oam-dev/kubevela/pkg/utils/errors" ) @@ -62,6 +63,20 @@ func ensureResourceTrackerCRDInstalled(ctx context.Context, c client.Client, clu return nil } +// ensureVelaSystemNamespaceInstalled ensures vela namespace to be installed in child cluster +func ensureVelaSystemNamespaceInstalled(ctx context.Context, c client.Client, clusterName string, createNamespace string) error { + remoteCtx := ContextWithClusterName(ctx, clusterName) + if err := c.Get(remoteCtx, types2.NamespacedName{Name: createNamespace}, &v1.Namespace{}); err != nil { + if !errors2.IsNotFound(err) { + return errors.Wrapf(err, "failed to check vela-system ") + } + if err = c.Create(remoteCtx, &v1.Namespace{ObjectMeta: v12.ObjectMeta{Name: createNamespace}}); err != nil { + return errors.Wrapf(err, "failed to create vela-system namespace") + } + } + return nil +} + // ensureClusterNotExists checks if child cluster has already been joined, if joined, error is returned func ensureClusterNotExists(ctx context.Context, c client.Client, clusterName string) error { secret := &v1.Secret{} @@ -173,6 +188,11 @@ func JoinClusterByKubeConfig(_ctx context.Context, k8sClient client.Client, kube _ = k8sClient.Delete(_ctx, secret) return cluster, errors.Wrapf(err, "failed to ensure resourcetracker crd installed in cluster %s", clusterName) } + + if err := ensureVelaSystemNamespaceInstalled(_ctx, k8sClient, clusterName, types.DefaultKubeVelaNS); err != nil { + return nil, errors.Wrapf(err, "failed to create vela namespace in cluster %s", clusterName) + } + return cluster, nil }