Skip to content
Prev Previous commit
Next Next commit
translate csv to deployment
Signed-off-by: Ben Luzarraga <[email protected]>
  • Loading branch information
bluzarraga committed Jan 14, 2025
commit fabfbcf62ba20db5958a7155847c6fa376736d3b
47 changes: 19 additions & 28 deletions controllers/operandrequestnoolm/reconcile_operand.go
Original file line number Diff line number Diff line change
Expand Up @@ -147,37 +147,28 @@ func (r *Reconciler) reconcileOperand(ctx context.Context, requestInstance *oper
var deployment *appsv1.Deployment

//TODO need to translate this if block to look for deployments and not CSVs
if opdRegistry.UserManaged {
csvList, err := r.GetClusterServiceVersionListFromPackage(ctx, opdRegistry.PackageName, opdRegistry.Namespace)
if err != nil {
merr.Add(err)
requestInstance.SetMemberStatus(operand.Name, operatorv1alpha1.OperatorFailed, "", &r.Mutex)
continue
}
csv = csvList[0]
} else {
csv, err = r.GetClusterServiceVersion(ctx, sub)
// If can't get CSV, requeue the request
if err != nil {
merr.Add(err)
requestInstance.SetMemberStatus(operand.Name, operatorv1alpha1.OperatorFailed, "", &r.Mutex)
continue
}
deploymentList, err := r.GetDeploymentListFromPackage(ctx, opdRegistry.PackageName, opdRegistry.Namespace)
if err != nil {
merr.Add(err)
requestInstance.SetMemberStatus(operand.Name, operatorv1alpha1.OperatorFailed, "", &r.Mutex)
continue
}
deployment = deploymentList[0]

//TODO change this block to deal with an empty list of deployments instead of csvs
if csv == nil {
klog.Warningf("ClusterServiceVersion for the Subscription %s in the namespace %s is not ready yet, retry", operatorName, namespace)
if deployment == nil {
klog.Warningf("Deployment for %s in the namespace %s is not ready yet, retry", operatorName, namespace)
requestInstance.SetMemberStatus(operand.Name, operatorv1alpha1.OperatorInstalling, "", &r.Mutex)
continue
}

// TODO determine if we need to reimagine this function for noolm use, do we want odlm cleaning up extra deployments? How should ODLM know the difference between "good" and "bad" deployments?
//otherwise get rid of it
if err := r.DeleteRedundantCSV(ctx, csv.Name, csv.Namespace, registryKey.Namespace, opdRegistry.PackageName); err != nil {
merr.Add(errors.Wrapf(err, "failed to delete the redundant ClusterServiceVersion %s in the namespace %s", csv.Name, csv.Namespace))
requestInstance.SetMemberStatus(operand.Name, operatorv1alpha1.OperatorFailed, "", &r.Mutex)
continue
}
// if err := r.DeleteRedundantCSV(ctx, csv.Name, csv.Namespace, registryKey.Namespace, opdRegistry.PackageName); err != nil {
// merr.Add(errors.Wrapf(err, "failed to delete the redundant ClusterServiceVersion %s in the namespace %s", csv.Name, csv.Namespace))
// requestInstance.SetMemberStatus(operand.Name, operatorv1alpha1.OperatorFailed, "", &r.Mutex)
// continue
// }

//TODO git rid of this section
// if !opdRegistry.UserManaged {
Expand All @@ -192,7 +183,7 @@ func (r *Reconciler) reconcileOperand(ctx context.Context, requestInstance *oper
// }

//TODO update to deployment name
klog.V(3).Info("Generating customresource base on ClusterServiceVersion: ", csv.GetName())
klog.V(3).Info("Generating customresource base on Deployment: ", deployment.GetName())
requestInstance.SetMemberStatus(operand.Name, operatorv1alpha1.OperatorRunning, "", &r.Mutex)

// Merge and Generate CR
Expand Down Expand Up @@ -220,7 +211,7 @@ func (r *Reconciler) reconcileOperand(ctx context.Context, requestInstance *oper
}

} else {
err = r.reconcileCRwithRequest(ctx, requestInstance, operand, types.NamespacedName{Name: requestInstance.Name, Namespace: requestInstance.Namespace}, i, csv.Namespace, &r.Mutex)
err = r.reconcileCRwithRequest(ctx, requestInstance, operand, types.NamespacedName{Name: requestInstance.Name, Namespace: requestInstance.Namespace}, i, deployment.Namespace, &r.Mutex)
if err != nil {
merr.Add(err)
requestInstance.SetMemberStatus(operand.Name, "", operatorv1alpha1.ServiceFailed, &r.Mutex)
Expand Down Expand Up @@ -274,7 +265,7 @@ func (r *Reconciler) reconcileCRwithConfig(ctx context.Context, service *operato
}

//TODO change this to deployment, make sure GetAnnotations works for deployments the same way
almExamples := csv.GetAnnotations()["alm-examples"]
almExamples := deployment.GetAnnotations()["alm-examples"]

// Convert CR template string to slice
var almExampleList []interface{}
Expand Down Expand Up @@ -331,7 +322,7 @@ func (r *Reconciler) reconcileCRwithConfig(ctx context.Context, service *operato

if !foundInConfig {
//TODO change to deployment
klog.Warningf("%v in the alm-example doesn't exist in the OperandConfig for %v", crFromALM.GetKind(), csv.GetName())
klog.Warningf("%v in the alm-example doesn't exist in the OperandConfig for %v", crFromALM.GetKind(), deployment.GetName())
continue
}

Expand Down Expand Up @@ -376,7 +367,7 @@ func (r *Reconciler) reconcileCRwithConfig(ctx context.Context, service *operato
for cr, found := range foundMap {
if !found {
//TODO change to deployment
klog.Warningf("Custom resource %v doesn't exist in the alm-example of %v", cr, csv.GetName())
klog.Warningf("Custom resource %v doesn't exist in the alm-example of %v", cr, deployment.GetName())
}
}

Expand Down
41 changes: 41 additions & 0 deletions controllers/operator/manager.go
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ import (
operatorsv1 "github.com/operator-framework/operator-lifecycle-manager/pkg/package-server/apis/operators/v1"
"github.com/pkg/errors"
"golang.org/x/mod/semver"
appsv1 "k8s.io/api/apps/v1"
authorizationv1 "k8s.io/api/authorization/v1"
corev1 "k8s.io/api/core/v1"
apierrors "k8s.io/apimachinery/pkg/api/errors"
Expand Down Expand Up @@ -574,6 +575,46 @@ func (m *ODLMOperator) GetClusterServiceVersionListFromPackage(ctx context.Conte
return csvs, nil
}

func (m *ODLMOperator) GetDeploymentListFromPackage(ctx context.Context, name, namespace string) ([]*appsv1.Deployment, error) {
packageName := name
deploymentNamespace := namespace

deploymentList := &appsv1.DeploymentList{}

opts := []client.ListOption{
client.InNamespace(deploymentNamespace),
}

if err := m.Reader.List(ctx, deploymentList, opts...); err != nil {
if apierrors.IsNotFound(err) || len(deploymentList.Items) == 0 {
klog.V(3).Infof("No Deployment found")
return nil, nil
}
return nil, errors.Wrapf(err, "failed to list Deployments")
}

var deployments []*appsv1.Deployment
// filter deploymentList to find one(s) that contain packageName
for _, v := range deploymentList.Items {
deployment := v
if deployment.Annotations == nil {
continue
}
if _, ok := deployment.Annotations["operatorframework.io/properties"]; !ok {
continue
}
annotation := fmt.Sprintf("\"packageName\":\"%s\"", packageName)
if !strings.Contains(deployment.Annotations["operatorframework.io/properties"], annotation) {
continue
}
klog.V(3).Infof("Get Deployment %s in the namespace %s", deployment.Name, deploymentNamespace)
deployments = append(deployments, &deployment)
}

klog.V(3).Infof("Get %v Deployment in the namespace %s", len(deployments), deploymentNamespace)
return deployments, nil
}

func (m *ODLMOperator) DeleteRedundantCSV(ctx context.Context, csvName, operatorNs, serviceNs, packageName string) error {
// Get the csv by its name and namespace
csv := &olmv1alpha1.ClusterServiceVersion{}
Expand Down