@@ -18,6 +18,7 @@ import (
18
18
"github.com/operator-framework/api/pkg/operators/v1alpha1"
19
19
listersv1alpha1 "github.com/operator-framework/operator-lifecycle-manager/pkg/api/client/listers/operators/v1alpha1"
20
20
"github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/cache"
21
+ "github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/constraints"
21
22
"github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/solver"
22
23
"github.com/operator-framework/operator-registry/pkg/api"
23
24
opregistry "github.com/operator-framework/operator-registry/pkg/registry"
@@ -2066,3 +2067,124 @@ func TestNewOperatorFromCSV(t *testing.T) {
2066
2067
})
2067
2068
}
2068
2069
}
2070
+
2071
+ func TestSolveOperators_GenericConstraint (t * testing.T ) {
2072
+ Provides1 := cache.APISet {opregistry.APIKey {"g" , "v" , "k" , "ks" }: struct {}{}}
2073
+ namespace := "olm"
2074
+ catalog := cache.SourceKey {Name : "community" , Namespace : namespace }
2075
+
2076
+ deps1 := []* api.Dependency {
2077
+ {
2078
+ Type : "olm.constraint" ,
2079
+ Value : `{"message":"gvk-constraint",
2080
+ "cel":{"rule":"properties.exists(p, p.type == 'olm.gvk' && p.value == {'group': 'g', 'version': 'v', 'kind': 'k'})"}}` ,
2081
+ },
2082
+ }
2083
+ deps2 := []* api.Dependency {
2084
+ {
2085
+ Type : "olm.constraint" ,
2086
+ Value : `{"message":"gvk2-constraint",
2087
+ "cel":{"rule":"properties.exists(p, p.type == 'olm.gvk' && p.value == {'group': 'g2', 'version': 'v', 'kind': 'k'})"}}` ,
2088
+ },
2089
+ }
2090
+ deps3 := []* api.Dependency {
2091
+ {
2092
+ Type : "olm.constraint" ,
2093
+ Value : `{"message":"package-constraint",
2094
+ "cel":{"rule":"properties.exists(p, p.type == 'olm.package' && p.value.packageName == 'packageB' && (semver_compare(p.value.version, '1.0.1') == 0))"}}` ,
2095
+ },
2096
+ }
2097
+
2098
+ tests := []struct {
2099
+ name string
2100
+ isErr bool
2101
+ subs []* v1alpha1.Subscription
2102
+ catalog cache.Source
2103
+ expected cache.OperatorSet
2104
+ message string
2105
+ }{
2106
+ {
2107
+ // generic constraint for satisfiable gvk dependency
2108
+ name : "Generic Constraint/Satisfiable GVK Dependency" ,
2109
+ isErr : false ,
2110
+ subs : []* v1alpha1.Subscription {
2111
+ newSub (namespace , "packageA" , "stable" , catalog ),
2112
+ },
2113
+ catalog : & cache.Snapshot {
2114
+ Entries : []* cache.Entry {
2115
+ genOperator ("opA.v1.0.0" , "1.0.0" , "" , "packageA" , "stable" , catalog .Name , catalog .Namespace , nil , nil , deps1 , "" , false ),
2116
+ genOperator ("opB.v1.0.0" , "1.0.0" , "" , "packageB" , "stable" , catalog .Name , catalog .Namespace , nil , Provides1 , nil , "stable" , false ),
2117
+ },
2118
+ },
2119
+ expected : cache.OperatorSet {
2120
+ "opA.v1.0.0" : genOperator ("opA.v1.0.0" , "1.0.0" , "" , "packageA" , "stable" , catalog .Name , catalog .Namespace , nil , nil , deps1 , "" , false ),
2121
+ "opB.v1.0.0" : genOperator ("opB.v1.0.0" , "1.0.0" , "" , "packageB" , "stable" , catalog .Name , catalog .Namespace , nil , Provides1 , nil , "stable" , false ),
2122
+ },
2123
+ },
2124
+ {
2125
+ // generic constraint for NotSatisfiable gvk dependency
2126
+ name : "Generic Constraint/NotSatisfiable GVK Dependency" ,
2127
+ isErr : true ,
2128
+ subs : []* v1alpha1.Subscription {
2129
+ newSub (namespace , "packageA" , "stable" , catalog ),
2130
+ },
2131
+ catalog : & cache.Snapshot {
2132
+ Entries : []* cache.Entry {
2133
+ genOperator ("opA.v1.0.0" , "1.0.0" , "" , "packageA" , "stable" , catalog .Name , catalog .Namespace , nil , nil , deps2 , "" , false ),
2134
+ genOperator ("opB.v1.0.0" , "1.0.0" , "" , "packageB" , "stable" , catalog .Name , catalog .Namespace , nil , Provides1 , nil , "" , false ),
2135
+ },
2136
+ },
2137
+ // unable to find satisfiable gvk dependency
2138
+ // resolve into nothing
2139
+ expected : cache.OperatorSet {},
2140
+ message : "gvk2-constraint" ,
2141
+ },
2142
+ {
2143
+ // generic constraint for package constraint
2144
+ name : "Generic Constraint/Satisfiable Package Dependency" ,
2145
+ isErr : false ,
2146
+ subs : []* v1alpha1.Subscription {
2147
+ newSub (namespace , "packageA" , "stable" , catalog ),
2148
+ },
2149
+ catalog : & cache.Snapshot {
2150
+ Entries : []* cache.Entry {
2151
+ genOperator ("opA.v1.0.0" , "1.0.0" , "" , "packageA" , "stable" , catalog .Name , catalog .Namespace , nil , nil , deps3 , "" , false ),
2152
+ genOperator ("opB.v1.0.0" , "1.0.0" , "" , "packageB" , "stable" , catalog .Name , catalog .Namespace , nil , nil , nil , "" , false ),
2153
+ genOperator ("opB.v1.0.1" , "1.0.1" , "opB.v1.0.0" , "packageB" , "stable" , catalog .Name , catalog .Namespace , nil , nil , nil , "stable" , false ),
2154
+ genOperator ("opB.v1.0.2" , "1.0.2" , "opB.v1.0.1" , "packageB" , "stable" , catalog .Name , catalog .Namespace , nil , nil , nil , "stable" , false ),
2155
+ },
2156
+ },
2157
+ expected : cache.OperatorSet {
2158
+ "opA.v1.0.0" : genOperator ("opA.v1.0.1" , "1.0.1" , "" , "packageA" , "stable" , catalog .Name , catalog .Namespace , nil , nil , deps3 , "" , false ),
2159
+ "opB.v1.0.1" : genOperator ("opB.v1.0.1" , "1.0.1" , "opB.v1.0.0" , "packageB" , "stable" , catalog .Name , catalog .Namespace , nil , nil , nil , "stable" , false ),
2160
+ },
2161
+ },
2162
+ }
2163
+
2164
+ for _ , tt := range tests {
2165
+ t .Run (tt .name , func (t * testing.T ) {
2166
+ var err error
2167
+ var operators cache.OperatorSet
2168
+ satResolver := SatResolver {
2169
+ cache : cache .New (cache.StaticSourceProvider {
2170
+ catalog : tt .catalog ,
2171
+ }),
2172
+ log : logrus .New (),
2173
+ evaluatorProvider : constraints .NewCelEvaluatorProvider (),
2174
+ }
2175
+
2176
+ operators , err = satResolver .SolveOperators ([]string {namespace }, nil , tt .subs )
2177
+ if tt .isErr {
2178
+ assert .Error (t , err )
2179
+ assert .Contains (t , err .Error (), tt .message )
2180
+ } else {
2181
+ assert .NoError (t , err )
2182
+ for k := range tt .expected {
2183
+ require .NotNil (t , operators [k ])
2184
+ assert .EqualValues (t , k , operators [k ].Name )
2185
+ }
2186
+ }
2187
+ assert .Equal (t , len (tt .expected ), len (operators ))
2188
+ })
2189
+ }
2190
+ }
0 commit comments