@@ -172,6 +172,7 @@ func (r *Reconciler) singleClusterSync(ctx context.Context, logger logr.Logger,
|
|||||||
logger.Error(err, "create workspace failed")
|
logger.Error(err, "create workspace failed")
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
return nil
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
logger.Error(err, "get workspace failed")
|
logger.Error(err, "get workspace failed")
|
||||||
@@ -207,6 +208,7 @@ func (r *Reconciler) multiClusterSync(ctx context.Context, logger logr.Logger, w
|
|||||||
logger.Error(err, "create federated workspace failed")
|
logger.Error(err, "create federated workspace failed")
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
return nil
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
logger.Error(err, "get federated workspace failed")
|
logger.Error(err, "get federated workspace failed")
|
||||||
|
|||||||
@@ -17,35 +17,21 @@ limitations under the License.
|
|||||||
package workspacetemplate
|
package workspacetemplate
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"os"
|
|
||||||
"path/filepath"
|
|
||||||
"testing"
|
"testing"
|
||||||
"time"
|
|
||||||
|
|
||||||
"github.com/onsi/gomega/gexec"
|
|
||||||
utilruntime "k8s.io/apimachinery/pkg/util/runtime"
|
|
||||||
"k8s.io/client-go/kubernetes/scheme"
|
"k8s.io/client-go/kubernetes/scheme"
|
||||||
"k8s.io/klog/klogr"
|
"k8s.io/klog/klogr"
|
||||||
ctrl "sigs.k8s.io/controller-runtime"
|
|
||||||
"sigs.k8s.io/controller-runtime/pkg/client"
|
|
||||||
logf "sigs.k8s.io/controller-runtime/pkg/log"
|
logf "sigs.k8s.io/controller-runtime/pkg/log"
|
||||||
|
|
||||||
"kubesphere.io/kubesphere/pkg/apis"
|
"kubesphere.io/kubesphere/pkg/apis"
|
||||||
helmappscheme "kubesphere.io/kubesphere/pkg/apis/application/v1alpha1"
|
helmappscheme "kubesphere.io/kubesphere/pkg/apis/application/v1alpha1"
|
||||||
|
typesv1beta1 "kubesphere.io/kubesphere/pkg/apis/types/v1beta1"
|
||||||
|
|
||||||
. "github.com/onsi/ginkgo"
|
. "github.com/onsi/ginkgo"
|
||||||
. "github.com/onsi/gomega"
|
. "github.com/onsi/gomega"
|
||||||
"sigs.k8s.io/controller-runtime/pkg/envtest"
|
|
||||||
"sigs.k8s.io/controller-runtime/pkg/envtest/printer"
|
"sigs.k8s.io/controller-runtime/pkg/envtest/printer"
|
||||||
)
|
)
|
||||||
|
|
||||||
// These tests use Ginkgo (BDD-style Go testing framework). Refer to
|
|
||||||
// http://onsi.github.io/ginkgo/ to learn more about Ginkgo.
|
|
||||||
|
|
||||||
var k8sClient client.Client
|
|
||||||
var k8sManager ctrl.Manager
|
|
||||||
var testEnv *envtest.Environment
|
|
||||||
|
|
||||||
func TestWorkspaceTemplateController(t *testing.T) {
|
func TestWorkspaceTemplateController(t *testing.T) {
|
||||||
RegisterFailHandler(Fail)
|
RegisterFailHandler(Fail)
|
||||||
RunSpecsWithDefaultAndCustomReporters(t,
|
RunSpecsWithDefaultAndCustomReporters(t,
|
||||||
@@ -56,51 +42,13 @@ func TestWorkspaceTemplateController(t *testing.T) {
|
|||||||
var _ = BeforeSuite(func(done Done) {
|
var _ = BeforeSuite(func(done Done) {
|
||||||
logf.SetLogger(klogr.New())
|
logf.SetLogger(klogr.New())
|
||||||
|
|
||||||
By("bootstrapping test environment")
|
err := helmappscheme.AddToScheme(scheme.Scheme)
|
||||||
t := true
|
Expect(err).NotTo(HaveOccurred())
|
||||||
if os.Getenv("TEST_USE_EXISTING_CLUSTER") == "true" {
|
|
||||||
testEnv = &envtest.Environment{
|
|
||||||
UseExistingCluster: &t,
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
testEnv = &envtest.Environment{
|
|
||||||
CRDDirectoryPaths: []string{filepath.Join("..", "..", "..", "config", "crds")},
|
|
||||||
AttachControlPlaneOutput: false,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
cfg, err := testEnv.Start()
|
|
||||||
Expect(err).ToNot(HaveOccurred())
|
|
||||||
Expect(cfg).ToNot(BeNil())
|
|
||||||
|
|
||||||
err = apis.AddToScheme(scheme.Scheme)
|
err = apis.AddToScheme(scheme.Scheme)
|
||||||
Expect(err).NotTo(HaveOccurred())
|
Expect(err).NotTo(HaveOccurred())
|
||||||
|
|
||||||
k8sManager, err = ctrl.NewManager(cfg, ctrl.Options{
|
err = typesv1beta1.AddToScheme(scheme.Scheme)
|
||||||
Scheme: scheme.Scheme,
|
Expect(err).NotTo(HaveOccurred())
|
||||||
MetricsBindAddress: "0",
|
|
||||||
})
|
|
||||||
Expect(err).ToNot(HaveOccurred())
|
|
||||||
|
|
||||||
utilruntime.Must(helmappscheme.AddToScheme(k8sManager.GetScheme()))
|
|
||||||
|
|
||||||
err = (&Reconciler{}).SetupWithManager(k8sManager)
|
|
||||||
Expect(err).ToNot(HaveOccurred())
|
|
||||||
|
|
||||||
go func() {
|
|
||||||
err = k8sManager.Start(ctrl.SetupSignalHandler())
|
|
||||||
Expect(err).ToNot(HaveOccurred())
|
|
||||||
}()
|
|
||||||
|
|
||||||
k8sClient = k8sManager.GetClient()
|
|
||||||
Expect(k8sClient).ToNot(BeNil())
|
|
||||||
|
|
||||||
close(done)
|
close(done)
|
||||||
}, 60)
|
}, 60)
|
||||||
|
|
||||||
var _ = AfterSuite(func() {
|
|
||||||
By("tearing down the test environment")
|
|
||||||
gexec.KillAndWait(5 * time.Second)
|
|
||||||
err := testEnv.Stop()
|
|
||||||
Expect(err).ToNot(HaveOccurred())
|
|
||||||
})
|
|
||||||
|
|||||||
@@ -26,26 +26,38 @@ import (
|
|||||||
"k8s.io/apimachinery/pkg/labels"
|
"k8s.io/apimachinery/pkg/labels"
|
||||||
"k8s.io/apimachinery/pkg/runtime"
|
"k8s.io/apimachinery/pkg/runtime"
|
||||||
"k8s.io/apimachinery/pkg/types"
|
"k8s.io/apimachinery/pkg/types"
|
||||||
|
"k8s.io/client-go/kubernetes/scheme"
|
||||||
|
"k8s.io/client-go/tools/record"
|
||||||
|
ctrl "sigs.k8s.io/controller-runtime"
|
||||||
"sigs.k8s.io/controller-runtime/pkg/client"
|
"sigs.k8s.io/controller-runtime/pkg/client"
|
||||||
|
"sigs.k8s.io/controller-runtime/pkg/client/fake"
|
||||||
|
|
||||||
iamv1alpha2 "kubesphere.io/kubesphere/pkg/apis/iam/v1alpha2"
|
iamv1alpha2 "kubesphere.io/kubesphere/pkg/apis/iam/v1alpha2"
|
||||||
tenantv1alpha1 "kubesphere.io/kubesphere/pkg/apis/tenant/v1alpha1"
|
tenantv1alpha1 "kubesphere.io/kubesphere/pkg/apis/tenant/v1alpha1"
|
||||||
tenantv1alpha2 "kubesphere.io/kubesphere/pkg/apis/tenant/v1alpha2"
|
tenantv1alpha2 "kubesphere.io/kubesphere/pkg/apis/tenant/v1alpha2"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
var reconciler *Reconciler
|
||||||
var _ = Describe("WorkspaceTemplate", func() {
|
var _ = Describe("WorkspaceTemplate", func() {
|
||||||
|
|
||||||
const timeout = time.Second * 30
|
const timeout = time.Second * 30
|
||||||
const interval = time.Second * 1
|
const interval = time.Second * 1
|
||||||
|
|
||||||
BeforeEach(func() {
|
BeforeEach(func() {
|
||||||
|
|
||||||
|
reconciler = &Reconciler{
|
||||||
|
Client: fake.NewFakeClientWithScheme(scheme.Scheme),
|
||||||
|
Logger: ctrl.Log.WithName("controllers").WithName("acrpullbinding-controller"),
|
||||||
|
Recorder: record.NewFakeRecorder(5),
|
||||||
|
}
|
||||||
|
|
||||||
workspaceAdmin := newWorkspaceAdmin()
|
workspaceAdmin := newWorkspaceAdmin()
|
||||||
|
|
||||||
err := k8sClient.Create(context.Background(), &workspaceAdmin)
|
err := reconciler.Create(context.Background(), &workspaceAdmin)
|
||||||
Expect(err).NotTo(HaveOccurred())
|
Expect(err).NotTo(HaveOccurred())
|
||||||
|
|
||||||
admin := iamv1alpha2.User{ObjectMeta: metav1.ObjectMeta{Name: "admin"}}
|
admin := iamv1alpha2.User{ObjectMeta: metav1.ObjectMeta{Name: "admin"}}
|
||||||
err = k8sClient.Create(context.Background(), &admin)
|
err = reconciler.Create(context.Background(), &admin)
|
||||||
Expect(err).NotTo(HaveOccurred())
|
Expect(err).NotTo(HaveOccurred())
|
||||||
})
|
})
|
||||||
|
|
||||||
@@ -54,70 +66,82 @@ var _ = Describe("WorkspaceTemplate", func() {
|
|||||||
// Avoid adding tests for vanilla CRUD operations because they would
|
// Avoid adding tests for vanilla CRUD operations because they would
|
||||||
// test Kubernetes API server, which isn't the goal here.
|
// test Kubernetes API server, which isn't the goal here.
|
||||||
Context("WorkspaceTemplate Controller", func() {
|
Context("WorkspaceTemplate Controller", func() {
|
||||||
It("Should create successfully", func() {
|
for _, multiCluster := range []bool{true, false} {
|
||||||
key := types.NamespacedName{
|
enalbed := multiCluster
|
||||||
Name: "workspace-template",
|
It("Should create successfully", func() {
|
||||||
}
|
reconciler.MultiClusterEnabled = enalbed
|
||||||
|
key := types.NamespacedName{
|
||||||
|
Name: "workspace-template",
|
||||||
|
}
|
||||||
|
|
||||||
created := &tenantv1alpha2.WorkspaceTemplate{
|
created := &tenantv1alpha2.WorkspaceTemplate{
|
||||||
ObjectMeta: metav1.ObjectMeta{
|
ObjectMeta: metav1.ObjectMeta{
|
||||||
Name: key.Name,
|
Name: key.Name,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
// Create
|
// Create
|
||||||
Expect(k8sClient.Create(context.Background(), created)).Should(Succeed())
|
Expect(reconciler.Create(context.Background(), created)).Should(Succeed())
|
||||||
|
|
||||||
By("Expecting to create workspace template successfully")
|
req := ctrl.Request{
|
||||||
Eventually(func() bool {
|
NamespacedName: key,
|
||||||
f := &tenantv1alpha2.WorkspaceTemplate{}
|
}
|
||||||
k8sClient.Get(context.Background(), key, f)
|
_, err := reconciler.Reconcile(req)
|
||||||
return !f.CreationTimestamp.IsZero()
|
Expect(err).To(BeNil())
|
||||||
}, timeout, interval).Should(BeTrue())
|
|
||||||
|
|
||||||
By("Expecting to create workspace successfully")
|
By("Expecting to create workspace template successfully")
|
||||||
Eventually(func() bool {
|
Expect(func() *tenantv1alpha2.WorkspaceTemplate {
|
||||||
f := &tenantv1alpha1.Workspace{}
|
f := &tenantv1alpha2.WorkspaceTemplate{}
|
||||||
k8sClient.Get(context.Background(), key, f)
|
reconciler.Get(context.Background(), key, f)
|
||||||
return !f.CreationTimestamp.IsZero()
|
return f
|
||||||
}, timeout, interval).Should(BeTrue())
|
}()).ShouldNot(BeNil())
|
||||||
|
|
||||||
// List workspace roles
|
By("Expecting to create workspace successfully")
|
||||||
By("Expecting to create workspace role successfully")
|
Expect(func() *tenantv1alpha1.Workspace {
|
||||||
Eventually(func() bool {
|
f := &tenantv1alpha1.Workspace{}
|
||||||
f := &iamv1alpha2.WorkspaceRoleList{}
|
reconciler.Get(context.Background(), key, f)
|
||||||
k8sClient.List(context.Background(), f, &client.ListOptions{LabelSelector: labels.SelectorFromSet(labels.Set{tenantv1alpha1.WorkspaceLabel: key.Name})})
|
return f
|
||||||
return len(f.Items) == 1
|
}()).ShouldNot(BeNil())
|
||||||
}, timeout, interval).Should(BeTrue())
|
|
||||||
|
|
||||||
// Update
|
// List workspace roles
|
||||||
updated := &tenantv1alpha2.WorkspaceTemplate{}
|
By("Expecting to create workspace role successfully")
|
||||||
Expect(k8sClient.Get(context.Background(), key, updated)).Should(Succeed())
|
Eventually(func() bool {
|
||||||
updated.Spec.Template.Spec.Manager = "admin"
|
f := &iamv1alpha2.WorkspaceRoleList{}
|
||||||
Expect(k8sClient.Update(context.Background(), updated)).Should(Succeed())
|
reconciler.List(context.Background(), f, &client.ListOptions{LabelSelector: labels.SelectorFromSet(labels.Set{tenantv1alpha1.WorkspaceLabel: key.Name})})
|
||||||
|
return len(f.Items) == 1
|
||||||
|
}, timeout, interval).Should(BeTrue())
|
||||||
|
|
||||||
// List workspace role bindings
|
// Update
|
||||||
By("Expecting to create workspace manager role binding successfully")
|
updated := &tenantv1alpha2.WorkspaceTemplate{}
|
||||||
Eventually(func() bool {
|
Expect(reconciler.Get(context.Background(), key, updated)).Should(Succeed())
|
||||||
f := &iamv1alpha2.WorkspaceRoleBindingList{}
|
updated.Spec.Template.Spec.Manager = "admin"
|
||||||
k8sClient.List(context.Background(), f, &client.ListOptions{LabelSelector: labels.SelectorFromSet(labels.Set{tenantv1alpha1.WorkspaceLabel: key.Name})})
|
Expect(reconciler.Update(context.Background(), updated)).Should(Succeed())
|
||||||
return len(f.Items) == 1
|
|
||||||
}, timeout, interval).Should(BeTrue())
|
|
||||||
|
|
||||||
// Delete
|
_, err = reconciler.Reconcile(req)
|
||||||
By("Expecting to delete workspace successfully")
|
Expect(err).To(BeNil())
|
||||||
Eventually(func() error {
|
|
||||||
f := &tenantv1alpha2.WorkspaceTemplate{}
|
|
||||||
k8sClient.Get(context.Background(), key, f)
|
|
||||||
return k8sClient.Delete(context.Background(), f)
|
|
||||||
}, timeout, interval).Should(Succeed())
|
|
||||||
|
|
||||||
By("Expecting to delete workspace finish")
|
// List workspace role bindings
|
||||||
Eventually(func() error {
|
By("Expecting to create workspace manager role binding successfully")
|
||||||
f := &tenantv1alpha2.WorkspaceTemplate{}
|
Eventually(func() bool {
|
||||||
return k8sClient.Get(context.Background(), key, f)
|
f := &iamv1alpha2.WorkspaceRoleBindingList{}
|
||||||
}, timeout, interval).ShouldNot(Succeed())
|
reconciler.List(context.Background(), f, &client.ListOptions{LabelSelector: labels.SelectorFromSet(labels.Set{tenantv1alpha1.WorkspaceLabel: key.Name})})
|
||||||
})
|
return len(f.Items) == 1
|
||||||
|
}, timeout, interval).Should(BeTrue())
|
||||||
|
|
||||||
|
// Delete
|
||||||
|
By("Expecting to finalize workspace successfully")
|
||||||
|
Eventually(func() error {
|
||||||
|
f := &tenantv1alpha2.WorkspaceTemplate{}
|
||||||
|
reconciler.Get(context.Background(), key, f)
|
||||||
|
now := metav1.NewTime(time.Now())
|
||||||
|
f.DeletionTimestamp = &now
|
||||||
|
return reconciler.Update(context.Background(), f)
|
||||||
|
}, timeout, interval).Should(Succeed())
|
||||||
|
|
||||||
|
_, err = reconciler.Reconcile(req)
|
||||||
|
Expect(err).To(BeNil())
|
||||||
|
})
|
||||||
|
}
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user