fix: Ensure only one CheCluster is created (#1517)

* fix: Ensure only one CheCluster is created

Signed-off-by: Anatolii Bazko <abazko@redhat.com>
pull/1519/head
Anatolii Bazko 2022-09-16 13:41:34 +03:00 committed by GitHub
parent 23c5dadd01
commit 1505555e0e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 37 additions and 0 deletions

View File

@ -20,6 +20,7 @@ import (
"github.com/eclipse-che/che-operator/pkg/common/constants"
"k8s.io/apimachinery/pkg/types"
"k8s.io/apimachinery/pkg/util/json"
utilruntime "k8s.io/apimachinery/pkg/util/runtime"
k8shelper "github.com/eclipse-che/che-operator/pkg/common/k8s-helper"
corev1 "k8s.io/api/core/v1"
@ -43,6 +44,9 @@ var _ webhook.Validator = &CheCluster{}
// ValidateCreate implements webhook.Validator so a webhook will be registered for the type
func (r *CheCluster) ValidateCreate() error {
if err := ensureSingletonCheCluster(); err != nil {
return err
}
return validate(r)
}
@ -56,6 +60,23 @@ func (r *CheCluster) ValidateDelete() error {
return nil
}
func ensureSingletonCheCluster() error {
client := k8shelper.New().GetClient()
utilruntime.Must(AddToScheme(client.Scheme()))
che := &CheClusterList{}
err := client.List(context.TODO(), che)
if err != nil {
logger.Error(err, "Failed to list CheCluster Custom Resources.")
}
if len(che.Items) != 0 {
return fmt.Errorf("only one CheCluster is allowed")
}
return nil
}
func validate(checluster *CheCluster) error {
for _, github := range checluster.Spec.GitServices.GitHub {
if err := validateGitHubOAuthSecret(github, checluster.Namespace); err != nil {

View File

@ -18,6 +18,10 @@ import (
"io"
"os"
"k8s.io/apimachinery/pkg/runtime"
"sigs.k8s.io/controller-runtime/pkg/client"
fakeclient "sigs.k8s.io/controller-runtime/pkg/client/fake"
"k8s.io/client-go/kubernetes/fake"
"github.com/sirupsen/logrus"
@ -31,6 +35,7 @@ import (
type K8sHelper struct {
clientset kubernetes.Interface
client client.Client
}
var (
@ -53,6 +58,10 @@ func (cl *K8sHelper) GetClientset() kubernetes.Interface {
return cl.clientset
}
func (cl *K8sHelper) GetClient() client.Client {
return cl.client
}
func (cl *K8sHelper) ExecIntoPod(
deploymentName string,
command string,
@ -159,6 +168,7 @@ func (cl *K8sHelper) RunExec(command []string, podName, namespace string, stdin
func initializeForTesting() *K8sHelper {
k8sHelper = &K8sHelper{
clientset: fake.NewSimpleClientset(),
client: fakeclient.NewClientBuilder().Build(),
}
return k8sHelper
@ -175,8 +185,14 @@ func initialize() *K8sHelper {
logrus.Fatalf("Failed to initialized Kubernetes client: %v", err)
}
client, err := client.New(cfg, client.Options{Scheme: runtime.NewScheme()})
if err != nil {
logrus.Fatalf("Failed to initialized Kubernetes client: %v", err)
}
k8sHelper = &K8sHelper{
clientset: clientSet,
client: client,
}
return k8sHelper