Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion pkg/liqoctl/test/network/client/k8s.go
Original file line number Diff line number Diff line change
Expand Up @@ -95,7 +95,7 @@ func initConfigAndClient(ctx context.Context, kubeconfig string, cl *Client, cfg
sname := string(name)

cfg[sname] = cfgtmp
if cl.ConsumerName == "" {
if kubeconfig == "" {
cl.ConsumerName = sname
cl.Consumer = cltmp
cl.ConsumerDynamic = cldyntmp
Expand Down
62 changes: 43 additions & 19 deletions pkg/liqoctl/test/network/setup/kyverno.go
Original file line number Diff line number Diff line change
Expand Up @@ -22,8 +22,10 @@ import (
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
"k8s.io/apimachinery/pkg/runtime/schema"
"k8s.io/client-go/dynamic"

"github.com/liqotech/liqo/pkg/liqoctl/test/network/client"
"github.com/liqotech/liqo/pkg/liqoctl/test/network/flags"
)

// KyvernoPolicyGroupVersionResource specifies the group version resource used to register the objects.
Expand All @@ -32,32 +34,54 @@ var KyvernoPolicyGroupVersionResource = schema.GroupVersionResource{Group: "kyve
// KyvernoPolicyKind is the kind of the Kyverno policy.
const KyvernoPolicyKind = "Policy"

// IsKyvernoAvailable checks if Kyverno is available.
func IsKyvernoAvailable(ctx context.Context, cl *dynamic.DynamicClient) bool {
_, err := cl.Resource(KyvernoPolicyGroupVersionResource).
Namespace(NamespaceName).List(ctx, metav1.ListOptions{})
return err == nil
}

// CreatePolicy creates the Kyverno policies.
func CreatePolicy(ctx context.Context, cl *client.Client) error {
policy := ForgeKyvernoPodAntiaffinityPolicy(cl.ConsumerName, false)
if _, err := cl.ConsumerDynamic.Resource(KyvernoPolicyGroupVersionResource).
Namespace(NamespaceName).Create(ctx, policy, metav1.CreateOptions{}); err != nil && !apierrors.IsAlreadyExists(err) {
return fmt.Errorf("consumer failed to create policy: %w", err)
}
func CreatePolicy(ctx context.Context, cl *client.Client, opts *flags.Options) error {
var kyvernoNotInstalled bool
printer := opts.Topts.LocalFactory.Printer
if IsKyvernoAvailable(ctx, cl.ConsumerDynamic) {
policy := ForgeKyvernoPodAntiaffinityPolicy(cl.ConsumerName, false)
if _, err := cl.ConsumerDynamic.Resource(KyvernoPolicyGroupVersionResource).
Namespace(NamespaceName).Create(ctx, policy, metav1.CreateOptions{}); err != nil && !apierrors.IsAlreadyExists(err) {
return fmt.Errorf("consumer failed to create policy: %w", err)
}

policy = ForgeKyvernoPodAntiaffinityPolicy(cl.ConsumerName, true)
if _, err := cl.ConsumerDynamic.Resource(KyvernoPolicyGroupVersionResource).
Namespace(NamespaceName).Create(ctx, policy, metav1.CreateOptions{}); err != nil && !apierrors.IsAlreadyExists(err) {
return fmt.Errorf("consumer failed to create policy: %w", err)
policy = ForgeKyvernoPodAntiaffinityPolicy(cl.ConsumerName, true)
if _, err := cl.ConsumerDynamic.Resource(KyvernoPolicyGroupVersionResource).
Namespace(NamespaceName).Create(ctx, policy, metav1.CreateOptions{}); err != nil && !apierrors.IsAlreadyExists(err) {
return fmt.Errorf("consumer failed to create policy: %w", err)
}
} else {
kyvernoNotInstalled = true
printer.Logger.Warn("Kyverno not available on consumer, skipping policy creation.")
}

for k := range cl.Providers {
policy := ForgeKyvernoPodAntiaffinityPolicy(k, false)
if _, err := cl.ProvidersDynamic[k].Resource(KyvernoPolicyGroupVersionResource).
Namespace(NamespaceName).Create(ctx, policy, metav1.CreateOptions{}); err != nil && !apierrors.IsAlreadyExists(err) {
return fmt.Errorf("provider %q failed to create policy: %w", k, err)
}
policy = ForgeKyvernoPodAntiaffinityPolicy(k, true)
if _, err := cl.ProvidersDynamic[k].Resource(KyvernoPolicyGroupVersionResource).
Namespace(NamespaceName).Create(ctx, policy, metav1.CreateOptions{}); err != nil && !apierrors.IsAlreadyExists(err) {
return fmt.Errorf("provider %q failed to create policy: %w", k, err)
if IsKyvernoAvailable(ctx, cl.ProvidersDynamic[k]) {
policy := ForgeKyvernoPodAntiaffinityPolicy(k, false)
if _, err := cl.ProvidersDynamic[k].Resource(KyvernoPolicyGroupVersionResource).
Namespace(NamespaceName).Create(ctx, policy, metav1.CreateOptions{}); err != nil && !apierrors.IsAlreadyExists(err) {
return fmt.Errorf("provider %q failed to create policy: %w", k, err)
}
policy = ForgeKyvernoPodAntiaffinityPolicy(k, true)
if _, err := cl.ProvidersDynamic[k].Resource(KyvernoPolicyGroupVersionResource).
Namespace(NamespaceName).Create(ctx, policy, metav1.CreateOptions{}); err != nil && !apierrors.IsAlreadyExists(err) {
return fmt.Errorf("provider %q failed to create policy: %w", k, err)
}
} else {
kyvernoNotInstalled = true
printer.Logger.Warn(fmt.Sprintf("Kyverno not available on provider %q, skipping policy creation.", k))
}
}
Comment on lines +48 to 81
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

NIT: can we refactor it so that both consumer and providers call the same function, avoiding code duplicates?

if kyvernoNotInstalled {
printer.Logger.Warn("Pods may not be scheduled on every node. Install Kyverno on all clusters for comprehensive tests.")
}
return nil
}

Expand Down
2 changes: 1 addition & 1 deletion pkg/liqoctl/test/network/setup/setup.go
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ func MakeInfrastructure(ctx context.Context, cl *client.Client, opts *flags.Opti
return 0, fmt.Errorf("error offloading namespace: %w", err)
}

if err := CreatePolicy(ctx, cl); err != nil {
if err := CreatePolicy(ctx, cl, opts); err != nil {
return 0, fmt.Errorf("error creating policy: %w", err)
}

Expand Down
Loading