Skip to content

Commit

Permalink
Makes OLMVariableSource responsible for fetching
Browse files Browse the repository at this point in the history
`OLMVariableSource` now contains the client and makes requests
to get available operators.

Signed-off-by: Mikalai Radchuk <mradchuk@redhat.com>
  • Loading branch information
m1kola committed Jun 8, 2023
1 parent 80a5786 commit b418973
Show file tree
Hide file tree
Showing 7 changed files with 77 additions and 78 deletions.
12 changes: 8 additions & 4 deletions cmd/manager/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ import (
"flag"
"os"

"github.com/operator-framework/deppy/pkg/deppy/solver"
rukpakv1alpha1 "github.com/operator-framework/rukpak/api/v1alpha1"
"go.uber.org/zap/zapcore"
"k8s.io/apimachinery/pkg/runtime"
Expand All @@ -33,8 +34,8 @@ import (
catalogd "github.com/operator-framework/catalogd/pkg/apis/core/v1beta1"
operatorsv1alpha1 "github.com/operator-framework/operator-controller/api/v1alpha1"
"github.com/operator-framework/operator-controller/internal/controllers"
"github.com/operator-framework/operator-controller/internal/resolution"
"github.com/operator-framework/operator-controller/internal/resolution/entitysources"
"github.com/operator-framework/operator-controller/internal/resolution/variable_sources/olm"
)

var (
Expand Down Expand Up @@ -94,9 +95,12 @@ func main() {
}

if err = (&controllers.OperatorReconciler{
Client: mgr.GetClient(),
Scheme: mgr.GetScheme(),
Resolver: resolution.NewOperatorResolver(mgr.GetClient(), entitysources.NewCatalogdEntitySource(mgr.GetClient())),
Client: mgr.GetClient(),
Scheme: mgr.GetScheme(),
Resolver: solver.NewDeppySolver(
entitysources.NewCatalogdEntitySource(mgr.GetClient()),
olm.NewOLMVariableSource(mgr.GetClient()),
),
}).SetupWithManager(mgr); err != nil {
setupLog.Error(err, "unable to create controller", "controller", "Operator")
os.Exit(1)
Expand Down
5 changes: 2 additions & 3 deletions internal/controllers/operator_controller.go
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,6 @@ import (

operatorsv1alpha1 "github.com/operator-framework/operator-controller/api/v1alpha1"
"github.com/operator-framework/operator-controller/internal/controllers/validators"
"github.com/operator-framework/operator-controller/internal/resolution"
"github.com/operator-framework/operator-controller/internal/resolution/variable_sources/bundles_and_dependencies"
"github.com/operator-framework/operator-controller/internal/resolution/variable_sources/entity"
)
Expand All @@ -50,7 +49,7 @@ import (
type OperatorReconciler struct {
client.Client
Scheme *runtime.Scheme
Resolver *resolution.OperatorResolver
Resolver *solver.DeppySolver
}

//+kubebuilder:rbac:groups=operators.operatorframework.io,resources=operators,verbs=get;list;watch
Expand Down Expand Up @@ -122,7 +121,7 @@ func (r *OperatorReconciler) reconcile(ctx context.Context, op *operatorsv1alpha
return ctrl.Result{}, nil
}
// run resolution
solution, err := r.Resolver.Resolve(ctx)
solution, err := r.Resolver.Solve(ctx)
if err != nil {
op.Status.InstalledBundleResource = ""
setInstalledStatusConditionUnknown(&op.Status.Conditions, "installation has not been attempted as resolution failed", op.GetGeneration())
Expand Down
5 changes: 3 additions & 2 deletions internal/controllers/operator_controller_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import (
. "github.com/onsi/gomega"
"github.com/operator-framework/deppy/pkg/deppy"
"github.com/operator-framework/deppy/pkg/deppy/input"
"github.com/operator-framework/deppy/pkg/deppy/solver"
rukpakv1alpha1 "github.com/operator-framework/rukpak/api/v1alpha1"
apimeta "k8s.io/apimachinery/pkg/api/meta"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
Expand All @@ -21,7 +22,7 @@ import (
operatorsv1alpha1 "github.com/operator-framework/operator-controller/api/v1alpha1"
"github.com/operator-framework/operator-controller/internal/conditionsets"
"github.com/operator-framework/operator-controller/internal/controllers"
"github.com/operator-framework/operator-controller/internal/resolution"
"github.com/operator-framework/operator-controller/internal/resolution/variable_sources/olm"
)

var _ = Describe("Operator Controller Test", func() {
Expand All @@ -34,7 +35,7 @@ var _ = Describe("Operator Controller Test", func() {
reconciler = &controllers.OperatorReconciler{
Client: cl,
Scheme: sch,
Resolver: resolution.NewOperatorResolver(cl, testEntitySource),
Resolver: solver.NewDeppySolver(testEntitySource, olm.NewOLMVariableSource(cl)),
}
})
When("the operator does not exist", func() {
Expand Down
43 changes: 0 additions & 43 deletions internal/resolution/resolver.go

This file was deleted.

23 changes: 14 additions & 9 deletions internal/resolution/resolver_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,13 +9,14 @@ import (
. "github.com/onsi/gomega"
"github.com/operator-framework/deppy/pkg/deppy"
"github.com/operator-framework/deppy/pkg/deppy/input"
"github.com/operator-framework/deppy/pkg/deppy/solver"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/runtime"
"sigs.k8s.io/controller-runtime/pkg/client"
"sigs.k8s.io/controller-runtime/pkg/client/fake"

"github.com/operator-framework/operator-controller/api/v1alpha1"
"github.com/operator-framework/operator-controller/internal/resolution"
"github.com/operator-framework/operator-controller/internal/resolution/variable_sources/olm"
)

func TestOperatorResolver(t *testing.T) {
Expand Down Expand Up @@ -74,8 +75,9 @@ var _ = Describe("OperatorResolver", func() {
}
client := FakeClient(resources...)
entitySource := input.NewCacheQuerier(testEntityCache)
resolver := resolution.NewOperatorResolver(client, entitySource)
solution, err := resolver.Resolve(context.Background())
variableSource := olm.NewOLMVariableSource(client)
resolver := solver.NewDeppySolver(entitySource, variableSource)
solution, err := resolver.Solve(context.Background())
Expect(err).ToNot(HaveOccurred())
// 2 * required package variables + 2 * bundle variables
Expect(solution.SelectedVariables()).To(HaveLen(4))
Expand All @@ -93,8 +95,9 @@ var _ = Describe("OperatorResolver", func() {
var resources []client.Object
client := FakeClient(resources...)
entitySource := input.NewCacheQuerier(testEntityCache)
resolver := resolution.NewOperatorResolver(client, entitySource)
solution, err := resolver.Resolve(context.Background())
variableSource := olm.NewOLMVariableSource(client)
resolver := solver.NewDeppySolver(entitySource, variableSource)
solution, err := resolver.Solve(context.Background())
Expect(err).ToNot(HaveOccurred())
Expect(solution.SelectedVariables()).To(HaveLen(0))
})
Expand All @@ -110,17 +113,19 @@ var _ = Describe("OperatorResolver", func() {
}
client := FakeClient(resource)
entitySource := FailEntitySource{}
resolver := resolution.NewOperatorResolver(client, entitySource)
solution, err := resolver.Resolve(context.Background())
variableSource := olm.NewOLMVariableSource(client)
resolver := solver.NewDeppySolver(entitySource, variableSource)
solution, err := resolver.Solve(context.Background())
Expect(solution).To(BeNil())
Expect(err).To(HaveOccurred())
})

It("should return an error if the client throws an error", func() {
client := NewFailClientWithError(fmt.Errorf("something bad happened"))
entitySource := input.NewCacheQuerier(testEntityCache)
resolver := resolution.NewOperatorResolver(client, entitySource)
solution, err := resolver.Resolve(context.Background())
variableSource := olm.NewOLMVariableSource(client)
resolver := solver.NewDeppySolver(entitySource, variableSource)
solution, err := resolver.Solve(context.Background())
Expect(solution).To(BeNil())
Expect(err).To(HaveOccurred())
})
Expand Down
14 changes: 10 additions & 4 deletions internal/resolution/variable_sources/olm/olm.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import (

"github.com/operator-framework/deppy/pkg/deppy"
"github.com/operator-framework/deppy/pkg/deppy/input"
"sigs.k8s.io/controller-runtime/pkg/client"

operatorsv1alpha1 "github.com/operator-framework/operator-controller/api/v1alpha1"
"github.com/operator-framework/operator-controller/internal/resolution/variable_sources/bundles_and_dependencies"
Expand All @@ -15,20 +16,25 @@ import (
var _ input.VariableSource = &OLMVariableSource{}

type OLMVariableSource struct {
operators []operatorsv1alpha1.Operator
client client.Client
}

func NewOLMVariableSource(operators ...operatorsv1alpha1.Operator) *OLMVariableSource {
func NewOLMVariableSource(cl client.Client) *OLMVariableSource {
return &OLMVariableSource{
operators: operators,
client: cl,
}
}

func (o *OLMVariableSource) GetVariables(ctx context.Context, entitySource input.EntitySource) ([]deppy.Variable, error) {
operatorList := operatorsv1alpha1.OperatorList{}
if err := o.client.List(ctx, &operatorList); err != nil {
return nil, err
}

var inputVariableSources []input.VariableSource

// build required package variable sources
for _, operator := range o.operators {
for _, operator := range operatorList.Items {
rps, err := required_package.NewRequiredPackage(
operator.Spec.PackageName,
required_package.InVersionRange(operator.Spec.Version),
Expand Down
53 changes: 40 additions & 13 deletions internal/resolution/variable_sources/olm/olm_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,14 +11,25 @@ import (
. "github.com/onsi/gomega"
"github.com/operator-framework/deppy/pkg/deppy"
"github.com/operator-framework/deppy/pkg/deppy/input"
"github.com/operator-framework/operator-controller/api/v1alpha1"
operatorsv1alpha1 "github.com/operator-framework/operator-controller/api/v1alpha1"
"github.com/operator-framework/operator-controller/internal/resolution/variable_sources/bundles_and_dependencies"
"github.com/operator-framework/operator-controller/internal/resolution/variable_sources/crd_constraints"
"github.com/operator-framework/operator-controller/internal/resolution/variable_sources/olm"
"github.com/operator-framework/operator-controller/internal/resolution/variable_sources/required_package"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/runtime"
utilruntime "k8s.io/apimachinery/pkg/util/runtime"
"sigs.k8s.io/controller-runtime/pkg/client"
"sigs.k8s.io/controller-runtime/pkg/client/fake"
)

func FakeClient(objects ...client.Object) client.Client {
scheme := runtime.NewScheme()
utilruntime.Must(v1alpha1.AddToScheme(scheme))
return fake.NewClientBuilder().WithScheme(scheme).WithObjects(objects...).Build()
}

func TestGlobalConstraints(t *testing.T) {
RegisterFailHandler(Fail)
RunSpecs(t, "OLMVariableSource Suite")
Expand Down Expand Up @@ -59,7 +70,7 @@ func withVersionRange(versionRange string) opOption {
}
}

func operator(name string, opts ...opOption) operatorsv1alpha1.Operator {
func operator(name string, opts ...opOption) *operatorsv1alpha1.Operator {
op := operatorsv1alpha1.Operator{
ObjectMeta: metav1.ObjectMeta{
Name: name,
Expand All @@ -73,7 +84,7 @@ func operator(name string, opts ...opOption) operatorsv1alpha1.Operator {
Fail(err.Error())
}
}
return op
return &op
}

var _ = Describe("OLMVariableSource", func() {
Expand All @@ -84,20 +95,30 @@ var _ = Describe("OLMVariableSource", func() {
})

It("should produce RequiredPackage variables", func() {
olmVariableSource := olm.NewOLMVariableSource(operator("prometheus"), operator("packageA"))
cl := FakeClient(operator("prometheus"), operator("packageA"))

olmVariableSource := olm.NewOLMVariableSource(cl)
variables, err := olmVariableSource.GetVariables(context.Background(), testEntitySource)
Expect(err).ToNot(HaveOccurred())

packageRequiredVariables := filterVariables[*required_package.RequiredPackageVariable](variables)
Expect(packageRequiredVariables).To(HaveLen(2))
Expect(packageRequiredVariables[0].Identifier()).To(Equal(deppy.IdentifierFromString("required package prometheus")))
Expect(packageRequiredVariables[0].BundleEntities()).To(HaveLen(2))
Expect(packageRequiredVariables[1].Identifier()).To(Equal(deppy.IdentifierFromString("required package packageA")))
Expect(packageRequiredVariables[1].BundleEntities()).To(HaveLen(1))
Expect(packageRequiredVariables).To(WithTransform(func(bvars []*required_package.RequiredPackageVariable) map[deppy.Identifier]int {
out := map[deppy.Identifier]int{}
for _, variable := range bvars {
out[variable.Identifier()] = len(variable.BundleEntities())
}
return out
}, Equal(map[deppy.Identifier]int{
deppy.IdentifierFromString("required package prometheus"): 2,
deppy.IdentifierFromString("required package packageA"): 1,
})))
})

It("should produce BundleVariables variables", func() {
olmVariableSource := olm.NewOLMVariableSource(operator("prometheus"), operator("packageA"))
cl := FakeClient(operator("prometheus"), operator("packageA"))

olmVariableSource := olm.NewOLMVariableSource(cl)
variables, err := olmVariableSource.GetVariables(context.Background(), testEntitySource)
Expect(err).ToNot(HaveOccurred())

Expand All @@ -109,15 +130,17 @@ var _ = Describe("OLMVariableSource", func() {
out = append(out, variable.BundleEntity().Entity)
}
return out
}, Equal([]*input.Entity{
}, ConsistOf([]*input.Entity{
entityFromCache("operatorhub/prometheus/0.47.0"),
entityFromCache("operatorhub/prometheus/0.37.0"),
entityFromCache("operatorhub/packageA/2.0.0"),
})))
})

It("should produce version filtered BundleVariables variables", func() {
olmVariableSource := olm.NewOLMVariableSource(operator("prometheus", withVersionRange(">0.40.0")), operator("packageA"))
cl := FakeClient(operator("prometheus", withVersionRange(">0.40.0")), operator("packageA"))

olmVariableSource := olm.NewOLMVariableSource(cl)
variables, err := olmVariableSource.GetVariables(context.Background(), testEntitySource)
Expect(err).ToNot(HaveOccurred())

Expand All @@ -129,7 +152,7 @@ var _ = Describe("OLMVariableSource", func() {
out = append(out, variable.BundleEntity().Entity)
}
return out
}, Equal([]*input.Entity{
}, ConsistOf([]*input.Entity{
entityFromCache("operatorhub/prometheus/0.47.0"),
// filtered out
// entityFromCache("operatorhub/prometheus/0.37.0"),
Expand All @@ -138,7 +161,9 @@ var _ = Describe("OLMVariableSource", func() {
})

It("should produce GlobalConstraints variables", func() {
olmVariableSource := olm.NewOLMVariableSource(operator("prometheus"), operator("packageA"))
cl := FakeClient(operator("prometheus"), operator("packageA"))

olmVariableSource := olm.NewOLMVariableSource(cl)
variables, err := olmVariableSource.GetVariables(context.Background(), testEntitySource)
Expect(err).ToNot(HaveOccurred())

Expand Down Expand Up @@ -166,7 +191,9 @@ var _ = Describe("OLMVariableSource", func() {
})

It("should return an errors when they occur", func() {
olmVariableSource := olm.NewOLMVariableSource(operator("prometheus"), operator("packageA"))
cl := FakeClient(operator("prometheus"), operator("packageA"))

olmVariableSource := olm.NewOLMVariableSource(cl)
_, err := olmVariableSource.GetVariables(context.Background(), FailEntitySource{})
Expect(err).To(HaveOccurred())
})
Expand Down

0 comments on commit b418973

Please sign in to comment.