kubernetes-operator/test/support/olm/support_olm.go

223 lines
5.4 KiB
Go

package olm
import (
"fmt"
"github.com/dapr/kubernetes-operator/pkg/pointer"
"k8s.io/apimachinery/pkg/runtime"
"github.com/dapr/kubernetes-operator/test/support"
"github.com/onsi/gomega"
olmV1 "github.com/operator-framework/api/pkg/operators/v1"
olmV1Alpha1 "github.com/operator-framework/api/pkg/operators/v1alpha1"
corev1 "k8s.io/api/core/v1"
k8serrors "k8s.io/apimachinery/pkg/api/errors"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
)
const (
CatalogRegistryPollInterval = "15m0s"
)
func DeployOperator(test support.Test, ns *corev1.Namespace, image string) {
//
// Install OperatorGroups
//
og, err := test.Client().OLM().OperatorsV1().OperatorGroups(ns.Name).Create(
test.Ctx(),
&olmV1.OperatorGroup{
ObjectMeta: metav1.ObjectMeta{
Name: test.ID(),
Namespace: ns.Name,
},
},
metav1.CreateOptions{},
)
test.Expect(err).
ToNot(gomega.HaveOccurred())
test.Expect(image).
ToNot(gomega.BeEmpty())
test.Cleanup(func() []runtime.Object {
//
// For some reason, panic happen if the OperatorGroup is translated to
// an unstructured object, hence the need of a dedicated cleanup logic
//
// see:
// https://github.com/operator-framework/api/issues/269
//
err := test.Client().OLM().OperatorsV1().OperatorGroups(ns.Name).Delete(
test.Ctx(),
og.Name,
metav1.DeleteOptions{
PropagationPolicy: pointer.Any(metav1.DeletePropagationForeground),
},
)
test.Expect(err).
ToNot(gomega.HaveOccurred())
test.Eventually(OperatorGroup(test, og.Name, og.Namespace), support.TestTimeoutShort).
Should(
gomega.BeNil(),
fmt.Sprintf("Failure deleting OperatorGroups with name %s in namespace %s",
og.GetName(),
og.GetNamespace(),
),
)
return []runtime.Object{}
})
//
// Install CatalogSource
//
catalog, err := test.Client().OLM().OperatorsV1alpha1().CatalogSources(ns.Name).Create(
test.Ctx(),
&olmV1Alpha1.CatalogSource{
ObjectMeta: metav1.ObjectMeta{
Name: test.ID(),
Namespace: ns.Name,
},
Spec: olmV1Alpha1.CatalogSourceSpec{
SourceType: "grpc",
Image: image,
DisplayName: "Dapr.io Catalog",
Publisher: "dapr.io",
GrpcPodConfig: &olmV1Alpha1.GrpcPodConfig{
SecurityContextConfig: "restricted",
},
UpdateStrategy: &olmV1Alpha1.UpdateStrategy{
RegistryPoll: &olmV1Alpha1.RegistryPoll{
RawInterval: "15m0s",
},
},
},
},
metav1.CreateOptions{},
)
test.Expect(err).
ToNot(gomega.HaveOccurred())
test.Expect(catalog).
ToNot(gomega.BeNil())
test.Cleanup(func() []runtime.Object {
return []runtime.Object{catalog}
})
test.Eventually(CatalogSource(test, catalog.Name, catalog.Namespace), support.TestTimeoutLong).Should(
gomega.WithTransform(ExtractCatalogState(), gomega.Equal("READY")),
)
//
// Install Subscription
//
sub, err := test.Client().OLM().OperatorsV1alpha1().Subscriptions(ns.Name).Create(
test.Ctx(),
&olmV1Alpha1.Subscription{
ObjectMeta: metav1.ObjectMeta{
Name: test.ID(),
Namespace: ns.Name,
},
Spec: &olmV1Alpha1.SubscriptionSpec{
Channel: "alpha",
Package: "dapr-kubernetes-operator",
InstallPlanApproval: olmV1Alpha1.ApprovalAutomatic,
CatalogSource: catalog.Name,
CatalogSourceNamespace: catalog.Namespace,
},
},
metav1.CreateOptions{},
)
test.Expect(err).
ToNot(gomega.HaveOccurred())
test.Expect(sub).
ToNot(gomega.BeNil())
test.Cleanup(func() []runtime.Object {
return []runtime.Object{sub}
})
test.Eventually(Subscription(test, sub.Name, sub.Namespace), support.TestTimeoutLong).Should(
gomega.WithTransform(ExtractSubscriptionInstallPlan(), gomega.Not(gomega.BeEmpty())),
)
}
func CatalogSource(t support.Test, name string, namespace string) func(g gomega.Gomega) (*olmV1Alpha1.CatalogSource, error) {
return func(g gomega.Gomega) (*olmV1Alpha1.CatalogSource, error) {
answer, err := t.Client().OLM().OperatorsV1alpha1().CatalogSources(namespace).Get(
t.Ctx(),
name,
metav1.GetOptions{},
)
if k8serrors.IsNotFound(err) {
return nil, nil
}
return answer, err
}
}
func OperatorGroup(t support.Test, name string, namespace string) func(g gomega.Gomega) (*olmV1.OperatorGroup, error) {
return func(g gomega.Gomega) (*olmV1.OperatorGroup, error) {
answer, err := t.Client().OLM().OperatorsV1().OperatorGroups(namespace).Get(
t.Ctx(),
name,
metav1.GetOptions{},
)
if err != nil && !k8serrors.IsNotFound(err) {
return nil, err
}
if err != nil && k8serrors.IsNotFound(err) {
return nil, nil
}
return answer, err
}
}
func ExtractCatalogState() func(*olmV1Alpha1.CatalogSource) string {
return func(in *olmV1Alpha1.CatalogSource) string {
if in.Status.GRPCConnectionState == nil {
return ""
}
return in.Status.GRPCConnectionState.LastObservedState
}
}
func Subscription(t support.Test, name string, namespace string) func(g gomega.Gomega) (*olmV1Alpha1.Subscription, error) {
return func(g gomega.Gomega) (*olmV1Alpha1.Subscription, error) {
answer, err := t.Client().OLM().OperatorsV1alpha1().Subscriptions(namespace).Get(
t.Ctx(),
name,
metav1.GetOptions{},
)
if k8serrors.IsNotFound(err) {
return nil, nil
}
return answer, err
}
}
func ExtractSubscriptionInstallPlan() func(*olmV1Alpha1.Subscription) string {
return func(in *olmV1Alpha1.Subscription) string {
if in.Status.InstallPlanRef == nil {
return ""
}
return in.Status.InstallPlanRef.Name
}
}