@@ -21,6 +21,7 @@ import (
21
21
"github.com/operator-framework/api/pkg/operators/v1alpha1"
22
22
listersv1alpha1 "github.com/operator-framework/operator-lifecycle-manager/pkg/api/client/listers/operators/v1alpha1"
23
23
"github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/cache"
24
+ "github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/constraints"
24
25
"github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/solver"
25
26
"github.com/operator-framework/operator-registry/pkg/api"
26
27
opregistry "github.com/operator-framework/operator-registry/pkg/registry"
@@ -2380,3 +2381,124 @@ func TestNewOperatorFromCSV(t *testing.T) {
2380
2381
})
2381
2382
}
2382
2383
}
2384
+
2385
+ func TestSolveOperators_GenericConstraint (t * testing.T ) {
2386
+ Provides1 := cache.APISet {opregistry.APIKey {"g" , "v" , "k" , "ks" }: struct {}{}}
2387
+ namespace := "olm"
2388
+ catalog := cache.SourceKey {Name : "community" , Namespace : namespace }
2389
+
2390
+ deps1 := []* api.Dependency {
2391
+ {
2392
+ Type : "olm.constraint" ,
2393
+ Value : `{"message":"gvk-constraint",
2394
+ "cel":{"rule":"properties.exists(p, p.type == 'olm.gvk' && p.value == {'group': 'g', 'version': 'v', 'kind': 'k'})"}}` ,
2395
+ },
2396
+ }
2397
+ deps2 := []* api.Dependency {
2398
+ {
2399
+ Type : "olm.constraint" ,
2400
+ Value : `{"message":"gvk2-constraint",
2401
+ "cel":{"rule":"properties.exists(p, p.type == 'olm.gvk' && p.value == {'group': 'g2', 'version': 'v', 'kind': 'k'})"}}` ,
2402
+ },
2403
+ }
2404
+ deps3 := []* api.Dependency {
2405
+ {
2406
+ Type : "olm.constraint" ,
2407
+ Value : `{"message":"package-constraint",
2408
+ "cel":{"rule":"properties.exists(p, p.type == 'olm.package' && p.value.packageName == 'packageB' && (semver_compare(p.value.version, '1.0.1') == 0))"}}` ,
2409
+ },
2410
+ }
2411
+
2412
+ tests := []struct {
2413
+ name string
2414
+ isErr bool
2415
+ subs []* v1alpha1.Subscription
2416
+ catalog cache.Source
2417
+ expected cache.OperatorSet
2418
+ message string
2419
+ }{
2420
+ {
2421
+ // generic constraint for satisfiable gvk dependency
2422
+ name : "Generic Constraint/Satisfiable GVK Dependency" ,
2423
+ isErr : false ,
2424
+ subs : []* v1alpha1.Subscription {
2425
+ newSub (namespace , "packageA" , "stable" , catalog ),
2426
+ },
2427
+ catalog : & cache.Snapshot {
2428
+ Entries : []* cache.Entry {
2429
+ genOperator ("opA.v1.0.0" , "1.0.0" , "" , "packageA" , "stable" , catalog .Name , catalog .Namespace , nil , nil , deps1 , "" , false ),
2430
+ genOperator ("opB.v1.0.0" , "1.0.0" , "" , "packageB" , "stable" , catalog .Name , catalog .Namespace , nil , Provides1 , nil , "stable" , false ),
2431
+ },
2432
+ },
2433
+ expected : cache.OperatorSet {
2434
+ "opA.v1.0.0" : genOperator ("opA.v1.0.0" , "1.0.0" , "" , "packageA" , "stable" , catalog .Name , catalog .Namespace , nil , nil , deps1 , "" , false ),
2435
+ "opB.v1.0.0" : genOperator ("opB.v1.0.0" , "1.0.0" , "" , "packageB" , "stable" , catalog .Name , catalog .Namespace , nil , Provides1 , nil , "stable" , false ),
2436
+ },
2437
+ },
2438
+ {
2439
+ // generic constraint for NotSatisfiable gvk dependency
2440
+ name : "Generic Constraint/NotSatisfiable GVK Dependency" ,
2441
+ isErr : true ,
2442
+ subs : []* v1alpha1.Subscription {
2443
+ newSub (namespace , "packageA" , "stable" , catalog ),
2444
+ },
2445
+ catalog : & cache.Snapshot {
2446
+ Entries : []* cache.Entry {
2447
+ genOperator ("opA.v1.0.0" , "1.0.0" , "" , "packageA" , "stable" , catalog .Name , catalog .Namespace , nil , nil , deps2 , "" , false ),
2448
+ genOperator ("opB.v1.0.0" , "1.0.0" , "" , "packageB" , "stable" , catalog .Name , catalog .Namespace , nil , Provides1 , nil , "" , false ),
2449
+ },
2450
+ },
2451
+ // unable to find satisfiable gvk dependency
2452
+ // resolve into nothing
2453
+ expected : cache.OperatorSet {},
2454
+ message : "gvk2-constraint" ,
2455
+ },
2456
+ {
2457
+ // generic constraint for package constraint
2458
+ name : "Generic Constraint/Satisfiable Package Dependency" ,
2459
+ isErr : false ,
2460
+ subs : []* v1alpha1.Subscription {
2461
+ newSub (namespace , "packageA" , "stable" , catalog ),
2462
+ },
2463
+ catalog : & cache.Snapshot {
2464
+ Entries : []* cache.Entry {
2465
+ genOperator ("opA.v1.0.0" , "1.0.0" , "" , "packageA" , "stable" , catalog .Name , catalog .Namespace , nil , nil , deps3 , "" , false ),
2466
+ genOperator ("opB.v1.0.0" , "1.0.0" , "" , "packageB" , "stable" , catalog .Name , catalog .Namespace , nil , nil , nil , "" , false ),
2467
+ genOperator ("opB.v1.0.1" , "1.0.1" , "opB.v1.0.0" , "packageB" , "stable" , catalog .Name , catalog .Namespace , nil , nil , nil , "stable" , false ),
2468
+ genOperator ("opB.v1.0.2" , "1.0.2" , "opB.v1.0.1" , "packageB" , "stable" , catalog .Name , catalog .Namespace , nil , nil , nil , "stable" , false ),
2469
+ },
2470
+ },
2471
+ expected : cache.OperatorSet {
2472
+ "opA.v1.0.0" : genOperator ("opA.v1.0.1" , "1.0.1" , "" , "packageA" , "stable" , catalog .Name , catalog .Namespace , nil , nil , deps3 , "" , false ),
2473
+ "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 ),
2474
+ },
2475
+ },
2476
+ }
2477
+
2478
+ for _ , tt := range tests {
2479
+ t .Run (tt .name , func (t * testing.T ) {
2480
+ var err error
2481
+ var operators cache.OperatorSet
2482
+ satResolver := SatResolver {
2483
+ cache : cache .New (cache.StaticSourceProvider {
2484
+ catalog : tt .catalog ,
2485
+ }),
2486
+ log : logrus .New (),
2487
+ evaluatorProvider : constraints .NewCelEvaluatorProvider (),
2488
+ }
2489
+
2490
+ operators , err = satResolver .SolveOperators ([]string {namespace }, nil , tt .subs )
2491
+ if tt .isErr {
2492
+ assert .Error (t , err )
2493
+ assert .Contains (t , err .Error (), tt .message )
2494
+ } else {
2495
+ assert .NoError (t , err )
2496
+ for k := range tt .expected {
2497
+ require .NotNil (t , operators [k ])
2498
+ assert .EqualValues (t , k , operators [k ].Name )
2499
+ }
2500
+ }
2501
+ assert .Equal (t , len (tt .expected ), len (operators ))
2502
+ })
2503
+ }
2504
+ }
0 commit comments