Skip to content

Commit

Permalink
test: unified the clients
Browse files Browse the repository at this point in the history
replaced all clients with a controller runtime client.

Signed-off-by: riya-singhal31 <[email protected]>
  • Loading branch information
riya-singhal31 committed May 5, 2022
1 parent 4bb8d1d commit c77dc25
Show file tree
Hide file tree
Showing 3 changed files with 58 additions and 121 deletions.
16 changes: 13 additions & 3 deletions pkg/deploymanager/common.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import (
k8sv1 "k8s.io/api/core/v1"
"k8s.io/apimachinery/pkg/api/errors"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/types"
utilwait "k8s.io/apimachinery/pkg/util/wait"
)

Expand All @@ -22,7 +23,7 @@ func (t *DeployManager) CreateNamespace(namespace string) error {
Labels: label,
},
}
_, err := t.k8sClient.CoreV1().Namespaces().Create(context.TODO(), ns, metav1.CreateOptions{})
err := t.crClient.Create(context.TODO(), ns)
if err != nil && !errors.IsAlreadyExists(err) {
return err
}
Expand All @@ -31,7 +32,16 @@ func (t *DeployManager) CreateNamespace(namespace string) error {

// DeleteNamespaceAndWait deletes a namespace and waits on it to terminate.
func (t *DeployManager) DeleteNamespaceAndWait(namespace string) error {
err := t.k8sClient.CoreV1().Namespaces().Delete(context.TODO(), namespace, metav1.DeleteOptions{})
label := make(map[string]string)
// Label required for monitoring this namespace
label["openshift.io/cluster-monitoring"] = "true"
ns := &k8sv1.Namespace{
ObjectMeta: metav1.ObjectMeta{
Name: namespace,
Labels: label,
},
}
err := t.crClient.Delete(context.TODO(), ns)
if err != nil && !errors.IsNotFound(err) {
return err
}
Expand All @@ -42,7 +52,7 @@ func (t *DeployManager) DeleteNamespaceAndWait(namespace string) error {

// Wait for namespace to terminate
err = utilwait.PollImmediate(interval, timeout, func() (done bool, err error) {
_, err = t.k8sClient.CoreV1().Namespaces().Get(context.TODO(), namespace, metav1.GetOptions{})
err = t.crClient.Get(context.TODO(), types.NamespacedName{Name: namespace, Namespace: namespace}, ns)
if err != nil && !errors.IsNotFound(err) {
lastReason = fmt.Sprintf("Error talking to k8s apiserver: %v", err)
return false, nil
Expand Down
104 changes: 19 additions & 85 deletions pkg/deploymanager/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,51 +3,38 @@ package deploymanager
import (
"os"

olmclient "github.com/operator-framework/operator-lifecycle-manager/pkg/api/client/clientset/versioned"
operatorv1 "github.com/operator-framework/api/pkg/operators/v1"
operatorv1alpha1 "github.com/operator-framework/api/pkg/operators/v1alpha1"
lvmv1 "github.com/red-hat-storage/lvm-operator/api/v1alpha1"
"k8s.io/apimachinery/pkg/runtime"
"k8s.io/apimachinery/pkg/runtime/serializer"
utilruntime "k8s.io/apimachinery/pkg/util/runtime"
"k8s.io/client-go/kubernetes"
"k8s.io/client-go/kubernetes/scheme"
k8sscheme "k8s.io/client-go/kubernetes/scheme"
"k8s.io/client-go/rest"
"k8s.io/client-go/tools/clientcmd"

crclient "sigs.k8s.io/controller-runtime/pkg/client"
)

// InstallNamespace is the namespace lvm is installed into
var (
scheme = runtime.NewScheme()
)

const InstallNamespace = "openshift-storage"

// DeployManager is a util tool used by the tests
func init() {
utilruntime.Must(k8sscheme.AddToScheme(scheme))
utilruntime.Must(lvmv1.AddToScheme(scheme))
utilruntime.Must(operatorv1.AddToScheme(scheme))
utilruntime.Must(operatorv1alpha1.AddToScheme(scheme))
}

type DeployManager struct {
olmClient *olmclient.Clientset
k8sClient *kubernetes.Clientset
crClient crclient.Client
parameterCodec runtime.ParameterCodec
lvmClient *rest.RESTClient
crClient crclient.Client
}

// GetCrClient is the function used to retrieve the controller-runtime client.
func (t *DeployManager) GetCrClient() crclient.Client {
return t.crClient
}

// GetK8sClient is the function used to retrieve the kubernetes client.
func (t *DeployManager) GetK8sClient() *kubernetes.Clientset {
return t.k8sClient
}

// GetParameterCodec is the function used to retrieve the parameterCodec.
func (t *DeployManager) GetParameterCodec() runtime.ParameterCodec {
return t.parameterCodec
}

// GetLvmClient is the function used to retrieve the lvm client.
func (t *DeployManager) GetLvmClient() *rest.RESTClient {
return t.lvmClient
}

func getKubeconfig(kubeconfig string) (*rest.Config, error) {
var config *rest.Config
var err error
Expand All @@ -62,72 +49,19 @@ func getKubeconfig(kubeconfig string) (*rest.Config, error) {
return config, err
}

// NewDeployManager creates a DeployManager struct with default configuration.
// NewDeployManager creates a DeployManager struct with default configuration
func NewDeployManager() (*DeployManager, error) {
codecs := serializer.NewCodecFactory(scheme.Scheme)
parameterCodec := runtime.NewParameterCodec(scheme.Scheme)
var config *rest.Config
var lvmConfig *rest.Config
var olmConfig *rest.Config
var err error

kubeconfig := os.Getenv("KUBECONFIG")
config, err = getKubeconfig(kubeconfig)
if err != nil {
return nil, err
}
config.NegotiatedSerializer = serializer.WithoutConversionCodecFactory{CodecFactory: codecs}
config.APIPath = "/apis"
config.ContentType = runtime.ContentTypeJSON
k8sClient, err := kubernetes.NewForConfig(config)
if err != nil {
return nil, err
}

// lvm Operator rest client
lvmConfig, err = getKubeconfig(kubeconfig)
if err != nil {
return nil, err
}
lvmConfig.GroupVersion = &lvmv1.GroupVersion
lvmConfig.NegotiatedSerializer = serializer.WithoutConversionCodecFactory{CodecFactory: codecs}
lvmConfig.APIPath = "/apis"
lvmConfig.ContentType = runtime.ContentTypeJSON
if lvmConfig.UserAgent == "" {
lvmConfig.UserAgent = rest.DefaultKubernetesUserAgent()
}
lvmClient, err := rest.RESTClientFor(lvmConfig)
if err != nil {
return nil, err
}

// controller-runtime client
myScheme := runtime.NewScheme()
utilruntime.Must(lvmv1.AddToScheme(myScheme))
utilruntime.Must(scheme.AddToScheme(myScheme))
crClient, err := crclient.New(config, crclient.Options{Scheme: myScheme})
if err != nil {
return nil, err
}

// olm client
olmConfig, err = getKubeconfig(kubeconfig)
config, err := getKubeconfig(kubeconfig)
if err != nil {
return nil, err
}
olmConfig.NegotiatedSerializer = serializer.WithoutConversionCodecFactory{CodecFactory: scheme.Codecs}
olmConfig.APIPath = "/apis"
olmConfig.ContentType = runtime.ContentTypeJSON
olmClient, err := olmclient.NewForConfig(olmConfig)
crClient, err := crclient.New(config, crclient.Options{Scheme: scheme})
if err != nil {
return nil, err
}

return &DeployManager{
olmClient: olmClient,
k8sClient: k8sClient,
crClient: crClient,
lvmClient: lvmClient,
parameterCodec: parameterCodec,
crClient: crClient,
}, nil
}
59 changes: 26 additions & 33 deletions pkg/deploymanager/subscription.go
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,9 @@ import (
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/labels"
"k8s.io/apimachinery/pkg/runtime/schema"
"k8s.io/apimachinery/pkg/types"
utilwait "k8s.io/apimachinery/pkg/util/wait"
crClient "sigs.k8s.io/controller-runtime/pkg/client"
)

type clusterObjects struct {
Expand Down Expand Up @@ -97,7 +99,7 @@ func (t *DeployManager) generateClusterObjects(lvmCatalogImage string, subscript
}

// Waiting for LVM catalog source.
func (t *DeployManager) waitForLVMCatalogSource() error {
func (t *DeployManager) waitForLVMCatalogSource(catalogsource *v1alpha1.CatalogSource) error {
timeout := 300 * time.Second
interval := 10 * time.Second

Expand All @@ -107,10 +109,12 @@ func (t *DeployManager) waitForLVMCatalogSource() error {
if err != nil {
return err
}

err = utilwait.PollImmediate(interval, timeout, func() (done bool, err error) {
pods, err := t.k8sClient.CoreV1().Pods(InstallNamespace).List(context.TODO(), metav1.ListOptions{
LabelSelector: labelSelector.String(),

pods := &k8sv1.PodList{}
err = t.crClient.List(context.TODO(), pods, &crClient.ListOptions{
LabelSelector: labelSelector,
Namespace: InstallNamespace,
})
if err != nil {
lastReason = fmt.Sprintf("error talking to k8s apiserver: %v", err)
Expand All @@ -130,7 +134,6 @@ func (t *DeployManager) waitForLVMCatalogSource() error {
}
}
}

if !isReady {
lastReason = "waiting on lvm catalog source pod to reach ready state"
return false, nil
Expand Down Expand Up @@ -158,7 +161,8 @@ func (t *DeployManager) WaitForLVMOperator() error {

err := utilwait.PollImmediate(interval, timeout, func() (done bool, err error) {
for _, name := range deployments {
deployment, err := t.k8sClient.AppsV1().Deployments(InstallNamespace).Get(context.TODO(), name, metav1.GetOptions{})
deployment := &appsv1.Deployment{}
err = t.crClient.Get(context.TODO(), types.NamespacedName{Name: name, Namespace: InstallNamespace}, deployment)
if err != nil {
lastReason = fmt.Sprintf("waiting on deployment %s to be created", name)
return false, nil
Expand Down Expand Up @@ -201,50 +205,36 @@ func (t *DeployManager) deployClusterObjects(co *clusterObjects) error {

for _, operatorGroup := range co.operatorGroups {
operatorGroup := operatorGroup
operatorGroups, err := t.olmClient.OperatorsV1().OperatorGroups(operatorGroup.Namespace).List(context.TODO(), metav1.ListOptions{})
if err != nil {
return err
}
if len(operatorGroups.Items) > 1 {
// There should be only one operatorgroup in a namespace.
// The system is already misconfigured - error out.
return fmt.Errorf("more than one operatorgroup detected in namespace %v - aborting", operatorGroup.Namespace)
}
if len(operatorGroups.Items) > 0 {
// There should be only one operatorgroup in a namespace.
// Skip this one, so we don't make the system bad.
continue
}
_, err = t.olmClient.OperatorsV1().OperatorGroups(operatorGroup.Namespace).Create(context.TODO(), &operatorGroup, metav1.CreateOptions{})
err := t.crClient.Create(context.TODO(), &operatorGroup)
if err != nil && !errors.IsAlreadyExists(err) {
return err
}
}

for _, catalogSource := range co.catalogSources {
catalogSource := catalogSource
_, err := t.olmClient.OperatorsV1alpha1().CatalogSources(catalogSource.Namespace).Create(context.TODO(), &catalogSource, metav1.CreateOptions{})
err := t.crClient.Create(context.TODO(), &catalogSource)
if err != nil && !errors.IsAlreadyExists(err) {
return err
}
}

// Wait for catalog source before posting subscription
err := t.waitForLVMCatalogSource()
if err != nil {
return err
}
// Wait for catalog source before posting subscription
err = t.waitForLVMCatalogSource(&catalogSource)
if err != nil {
return err
}

}
for _, subscription := range co.subscriptions {
subscription := subscription
_, err := t.olmClient.OperatorsV1alpha1().Subscriptions(subscription.Namespace).Create(context.TODO(), &subscription, metav1.CreateOptions{})
err := t.crClient.Create(context.TODO(), &subscription)
if err != nil && !errors.IsAlreadyExists(err) {
return err
}
}

// Wait on lvm-operator to come online.
err = t.WaitForLVMOperator()
err := t.WaitForLVMOperator()
if err != nil {
return err
}
Expand Down Expand Up @@ -272,22 +262,25 @@ func (t *DeployManager) DeployLVMWithOLM(lvmCatalogImage string, subscriptionCha
func (t *DeployManager) deleteClusterObjects(co *clusterObjects) error {

for _, operatorGroup := range co.operatorGroups {
err := t.olmClient.OperatorsV1().OperatorGroups(operatorGroup.Namespace).Delete(context.TODO(), operatorGroup.Name, metav1.DeleteOptions{})
operatorgroup := operatorGroup
err := t.crClient.Delete(context.TODO(), &operatorgroup)
if err != nil && !errors.IsNotFound(err) {
return err
}

}

for _, catalogSource := range co.catalogSources {
err := t.olmClient.OperatorsV1alpha1().CatalogSources(catalogSource.Namespace).Delete(context.TODO(), catalogSource.Name, metav1.DeleteOptions{})
catalogsource := catalogSource
err := t.crClient.Delete(context.TODO(), &catalogsource)
if err != nil && !errors.IsNotFound(err) {
return err
}
}

for _, subscription := range co.subscriptions {
err := t.olmClient.OperatorsV1alpha1().Subscriptions(subscription.Namespace).Delete(context.TODO(), subscription.Name, metav1.DeleteOptions{})
subs := subscription
err := t.crClient.Delete(context.TODO(), &subs)
if err != nil && !errors.IsNotFound(err) {
return err
}
Expand Down

0 comments on commit c77dc25

Please sign in to comment.