@@ -22,8 +22,10 @@ import (
2222 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
2323 "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
2424 "k8s.io/apimachinery/pkg/runtime/schema"
25+ "k8s.io/client-go/dynamic"
2526
2627 "github.com/liqotech/liqo/pkg/liqoctl/test/network/client"
28+ "github.com/liqotech/liqo/pkg/liqoctl/test/network/flags"
2729)
2830
2931// KyvernoPolicyGroupVersionResource specifies the group version resource used to register the objects.
@@ -32,32 +34,54 @@ var KyvernoPolicyGroupVersionResource = schema.GroupVersionResource{Group: "kyve
3234// KyvernoPolicyKind is the kind of the Kyverno policy.
3335const KyvernoPolicyKind = "Policy"
3436
37+ // IsKyvernoAvailable checks if Kyverno is available.
38+ func IsKyvernoAvailable (ctx context.Context , cl * dynamic.DynamicClient ) bool {
39+ _ , err := cl .Resource (KyvernoPolicyGroupVersionResource ).
40+ Namespace (NamespaceName ).List (ctx , metav1.ListOptions {})
41+ return err == nil
42+ }
43+
3544// CreatePolicy creates the Kyverno policies.
36- func CreatePolicy (ctx context.Context , cl * client.Client ) error {
37- policy := ForgeKyvernoPodAntiaffinityPolicy (cl .ConsumerName , false )
38- if _ , err := cl .ConsumerDynamic .Resource (KyvernoPolicyGroupVersionResource ).
39- Namespace (NamespaceName ).Create (ctx , policy , metav1.CreateOptions {}); err != nil && ! apierrors .IsAlreadyExists (err ) {
40- return fmt .Errorf ("consumer failed to create policy: %w" , err )
41- }
45+ func CreatePolicy (ctx context.Context , cl * client.Client , opts * flags.Options ) error {
46+ var kyvernoNotInstalled bool
47+ printer := opts .Topts .LocalFactory .Printer
48+ if IsKyvernoAvailable (ctx , cl .ConsumerDynamic ) {
49+ policy := ForgeKyvernoPodAntiaffinityPolicy (cl .ConsumerName , false )
50+ if _ , err := cl .ConsumerDynamic .Resource (KyvernoPolicyGroupVersionResource ).
51+ Namespace (NamespaceName ).Create (ctx , policy , metav1.CreateOptions {}); err != nil && ! apierrors .IsAlreadyExists (err ) {
52+ return fmt .Errorf ("consumer failed to create policy: %w" , err )
53+ }
4254
43- policy = ForgeKyvernoPodAntiaffinityPolicy (cl .ConsumerName , true )
44- if _ , err := cl .ConsumerDynamic .Resource (KyvernoPolicyGroupVersionResource ).
45- Namespace (NamespaceName ).Create (ctx , policy , metav1.CreateOptions {}); err != nil && ! apierrors .IsAlreadyExists (err ) {
46- return fmt .Errorf ("consumer failed to create policy: %w" , err )
55+ policy = ForgeKyvernoPodAntiaffinityPolicy (cl .ConsumerName , true )
56+ if _ , err := cl .ConsumerDynamic .Resource (KyvernoPolicyGroupVersionResource ).
57+ Namespace (NamespaceName ).Create (ctx , policy , metav1.CreateOptions {}); err != nil && ! apierrors .IsAlreadyExists (err ) {
58+ return fmt .Errorf ("consumer failed to create policy: %w" , err )
59+ }
60+ } else {
61+ kyvernoNotInstalled = true
62+ printer .Logger .Warn ("Kyverno not available on consumer, skipping policy creation." )
4763 }
4864
4965 for k := range cl .Providers {
50- policy := ForgeKyvernoPodAntiaffinityPolicy (k , false )
51- if _ , err := cl .ProvidersDynamic [k ].Resource (KyvernoPolicyGroupVersionResource ).
52- Namespace (NamespaceName ).Create (ctx , policy , metav1.CreateOptions {}); err != nil && ! apierrors .IsAlreadyExists (err ) {
53- return fmt .Errorf ("provider %q failed to create policy: %w" , k , err )
54- }
55- policy = ForgeKyvernoPodAntiaffinityPolicy (k , true )
56- if _ , err := cl .ProvidersDynamic [k ].Resource (KyvernoPolicyGroupVersionResource ).
57- Namespace (NamespaceName ).Create (ctx , policy , metav1.CreateOptions {}); err != nil && ! apierrors .IsAlreadyExists (err ) {
58- return fmt .Errorf ("provider %q failed to create policy: %w" , k , err )
66+ if IsKyvernoAvailable (ctx , cl .ProvidersDynamic [k ]) {
67+ policy := ForgeKyvernoPodAntiaffinityPolicy (k , false )
68+ if _ , err := cl .ProvidersDynamic [k ].Resource (KyvernoPolicyGroupVersionResource ).
69+ Namespace (NamespaceName ).Create (ctx , policy , metav1.CreateOptions {}); err != nil && ! apierrors .IsAlreadyExists (err ) {
70+ return fmt .Errorf ("provider %q failed to create policy: %w" , k , err )
71+ }
72+ policy = ForgeKyvernoPodAntiaffinityPolicy (k , true )
73+ if _ , err := cl .ProvidersDynamic [k ].Resource (KyvernoPolicyGroupVersionResource ).
74+ Namespace (NamespaceName ).Create (ctx , policy , metav1.CreateOptions {}); err != nil && ! apierrors .IsAlreadyExists (err ) {
75+ return fmt .Errorf ("provider %q failed to create policy: %w" , k , err )
76+ }
77+ } else {
78+ kyvernoNotInstalled = true
79+ printer .Logger .Warn (fmt .Sprintf ("Kyverno not available on provider %q, skipping policy creation." , k ))
5980 }
6081 }
82+ if kyvernoNotInstalled {
83+ printer .Logger .Warn ("Pods may not be scheduled on every node. Install Kyverno on all clusters for comprehensive tests." )
84+ }
6185 return nil
6286}
6387
0 commit comments