blob: 114ad5d9a72796e6391653929fcf5f246017381f [file]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package webhook
import (
"context"
"os"
"path/filepath"
"testing"
"time"
. "github.com/onsi/ginkgo/v2"
. "github.com/onsi/gomega"
admissionv1 "k8s.io/api/admissionregistration/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/util/wait"
"k8s.io/client-go/kubernetes"
"k8s.io/client-go/kubernetes/scheme"
"sigs.k8s.io/controller-runtime/pkg/envtest"
logf "sigs.k8s.io/controller-runtime/pkg/log"
"sigs.k8s.io/controller-runtime/pkg/log/zap"
unifflev1alpha1 "github.com/apache/incubator-uniffle/deploy/kubernetes/operator/api/uniffle/v1alpha1"
"github.com/apache/incubator-uniffle/deploy/kubernetes/operator/pkg/constants"
"github.com/apache/incubator-uniffle/deploy/kubernetes/operator/pkg/generated/clientset/versioned"
"github.com/apache/incubator-uniffle/deploy/kubernetes/operator/pkg/utils"
"github.com/apache/incubator-uniffle/deploy/kubernetes/operator/pkg/webhook/config"
webhookconstants "github.com/apache/incubator-uniffle/deploy/kubernetes/operator/pkg/webhook/constants"
)
var (
testEnv *envtest.Environment
kubeClient kubernetes.Interface
rssClient versioned.Interface
stopCtx context.Context
ctxCancel context.CancelFunc
)
func TestAdmissionManager(t *testing.T) {
_ = os.Setenv(constants.PodNamespaceEnv, constants.DefaultNamespace)
RegisterFailHandler(Fail)
suiteCfg, reporterCfg := GinkgoConfiguration()
reporterCfg.VeryVerbose = true
reporterCfg.FullTrace = true
RunSpecs(t, "admission manager suite", suiteCfg, reporterCfg)
}
var _ = BeforeSuite(
func() {
logf.SetLogger(zap.New(zap.WriteTo(GinkgoWriter), zap.UseDevMode(true)))
By("bootstrapping test environment")
testEnv = &envtest.Environment{
CRDDirectoryPaths: []string{filepath.Join("../..", "config", "crd", "bases")},
}
restConfig, err := testEnv.Start()
Expect(err).To(BeNil())
Expect(restConfig).ToNot(BeNil())
kubeClient, err = kubernetes.NewForConfig(restConfig)
Expect(err).ToNot(HaveOccurred())
Expect(kubeClient).ToNot(BeNil())
rssClient, err = versioned.NewForConfig(restConfig)
Expect(err).ToNot(HaveOccurred())
Expect(rssClient).ToNot(BeNil())
err = unifflev1alpha1.AddToScheme(scheme.Scheme)
Expect(err).NotTo(HaveOccurred())
// +kubebuilder:scaffold:scheme
cfg := &config.Config{
HTTPConfig: config.HTTPConfig{
Port: 9876,
ExternalService: webhookconstants.ComponentName,
},
GenericConfig: utils.GenericConfig{
RESTConfig: restConfig,
KubeClient: kubeClient,
RSSClient: rssClient,
},
}
am := newAdmissionManager(cfg)
stopCtx, ctxCancel = context.WithCancel(context.TODO())
go func() {
err = am.Start(stopCtx)
Expect(err).ToNot(HaveOccurred())
}()
},
)
var _ = AfterSuite(func() {
By("stopping admission manager")
ctxCancel()
By("tearing down the test environment")
Expect(testEnv.Stop()).To(Succeed())
})
var _ = Describe("AdmissionManager", func() {
Context("Setup syncer", func() {
It("Generate validation and webhook configurations", func() {
By("Wait validation configurations synced")
var vwc *admissionv1.ValidatingWebhookConfiguration
err := wait.Poll(time.Second, time.Second*5, func() (bool, error) {
var getErr error
vwc, getErr = kubeClient.AdmissionregistrationV1().ValidatingWebhookConfigurations().
Get(context.TODO(), webhookconstants.ComponentName, metav1.GetOptions{})
if getErr != nil {
return false, getErr
}
return true, nil
})
Expect(err).ToNot(HaveOccurred())
Expect(vwc).ToNot(BeNil())
By("Wait mutating configurations synced")
var mwc *admissionv1.MutatingWebhookConfiguration
err = wait.Poll(time.Second, time.Second*5, func() (bool, error) {
var getErr error
mwc, getErr = kubeClient.AdmissionregistrationV1().MutatingWebhookConfigurations().
Get(context.TODO(), webhookconstants.ComponentName, metav1.GetOptions{})
if getErr != nil {
return false, getErr
}
return true, nil
})
Expect(err).ToNot(HaveOccurred())
Expect(mwc).ToNot(BeNil())
})
})
})