// Copyright (c) 2026 Tigera, Inc. All rights reserved.

// Code generated by applyconfiguration-gen. DO NOT EDIT.

package v3

import (
	projectcalicov3 "github.com/projectcalico/api/pkg/apis/projectcalico/v3"
	networkingv1 "k8s.io/api/networking/v1"
	v1 "k8s.io/client-go/applyconfigurations/meta/v1"
)

// StagedKubernetesNetworkPolicySpecApplyConfiguration represents a declarative configuration of the StagedKubernetesNetworkPolicySpec type for use
// with apply.
type StagedKubernetesNetworkPolicySpecApplyConfiguration struct {
	// The staged action. If this is omitted, the default is Set.
	StagedAction *projectcalicov3.StagedAction `json:"stagedAction,omitempty"`
	// Selects the pods to which this NetworkPolicy object applies. The array of
	// ingress rules is applied to any pods selected by this field. Multiple network
	// policies can select the same set of pods. In this case, the ingress rules for
	// each are combined additively. This field is NOT optional and follows standard
	// label selector semantics. An empty podSelector matches all pods in this
	// namespace.
	PodSelector *v1.LabelSelectorApplyConfiguration `json:"podSelector,omitempty"`
	// List of ingress rules to be applied to the selected pods. Traffic is allowed to
	// a pod if there are no NetworkPolicies selecting the pod
	// (and cluster policy otherwise allows the traffic), OR if the traffic source is
	// the pod's local node, OR if the traffic matches at least one ingress rule
	// across all of the NetworkPolicy objects whose podSelector matches the pod. If
	// this field is empty then this NetworkPolicy does not allow any traffic (and serves
	// solely to ensure that the pods it selects are isolated by default)
	Ingress []networkingv1.NetworkPolicyIngressRule `json:"ingress,omitempty"`
	// List of egress rules to be applied to the selected pods. Outgoing traffic is
	// allowed if there are no NetworkPolicies selecting the pod (and cluster policy
	// otherwise allows the traffic), OR if the traffic matches at least one egress rule
	// across all of the NetworkPolicy objects whose podSelector matches the pod. If
	// this field is empty then this NetworkPolicy limits all outgoing traffic (and serves
	// solely to ensure that the pods it selects are isolated by default).
	// This field is beta-level in 1.8
	Egress []networkingv1.NetworkPolicyEgressRule `json:"egress,omitempty"`
	// List of rule types that the NetworkPolicy relates to.
	// Valid options are Ingress, Egress, or Ingress,Egress.
	// If this field is not specified, it will default based on the existence of Ingress or Egress rules;
	// policies that contain an Egress section are assumed to affect Egress, and all policies
	// (whether or not they contain an Ingress section) are assumed to affect Ingress.
	// If you want to write an egress-only policy, you must explicitly specify policyTypes [ "Egress" ].
	// Likewise, if you want to write a policy that specifies that no egress is allowed,
	// you must specify a policyTypes value that include "Egress" (since such a policy would not include
	// an Egress section and would otherwise default to just [ "Ingress" ]).
	// This field is beta-level in 1.8
	PolicyTypes []networkingv1.PolicyType `json:"policyTypes,omitempty"`
}

// StagedKubernetesNetworkPolicySpecApplyConfiguration constructs a declarative configuration of the StagedKubernetesNetworkPolicySpec type for use with
// apply.
func StagedKubernetesNetworkPolicySpec() *StagedKubernetesNetworkPolicySpecApplyConfiguration {
	return &StagedKubernetesNetworkPolicySpecApplyConfiguration{}
}

// WithStagedAction sets the StagedAction field in the declarative configuration to the given value
// and returns the receiver, so that objects can be built by chaining "With" function invocations.
// If called multiple times, the StagedAction field is set to the value of the last call.
func (b *StagedKubernetesNetworkPolicySpecApplyConfiguration) WithStagedAction(value projectcalicov3.StagedAction) *StagedKubernetesNetworkPolicySpecApplyConfiguration {
	b.StagedAction = &value
	return b
}

// WithPodSelector sets the PodSelector field in the declarative configuration to the given value
// and returns the receiver, so that objects can be built by chaining "With" function invocations.
// If called multiple times, the PodSelector field is set to the value of the last call.
func (b *StagedKubernetesNetworkPolicySpecApplyConfiguration) WithPodSelector(value *v1.LabelSelectorApplyConfiguration) *StagedKubernetesNetworkPolicySpecApplyConfiguration {
	b.PodSelector = value
	return b
}

// WithIngress adds the given value to the Ingress field in the declarative configuration
// and returns the receiver, so that objects can be build by chaining "With" function invocations.
// If called multiple times, values provided by each call will be appended to the Ingress field.
func (b *StagedKubernetesNetworkPolicySpecApplyConfiguration) WithIngress(values ...networkingv1.NetworkPolicyIngressRule) *StagedKubernetesNetworkPolicySpecApplyConfiguration {
	for i := range values {
		b.Ingress = append(b.Ingress, values[i])
	}
	return b
}

// WithEgress adds the given value to the Egress field in the declarative configuration
// and returns the receiver, so that objects can be build by chaining "With" function invocations.
// If called multiple times, values provided by each call will be appended to the Egress field.
func (b *StagedKubernetesNetworkPolicySpecApplyConfiguration) WithEgress(values ...networkingv1.NetworkPolicyEgressRule) *StagedKubernetesNetworkPolicySpecApplyConfiguration {
	for i := range values {
		b.Egress = append(b.Egress, values[i])
	}
	return b
}

// WithPolicyTypes adds the given value to the PolicyTypes field in the declarative configuration
// and returns the receiver, so that objects can be build by chaining "With" function invocations.
// If called multiple times, values provided by each call will be appended to the PolicyTypes field.
func (b *StagedKubernetesNetworkPolicySpecApplyConfiguration) WithPolicyTypes(values ...networkingv1.PolicyType) *StagedKubernetesNetworkPolicySpecApplyConfiguration {
	for i := range values {
		b.PolicyTypes = append(b.PolicyTypes, values[i])
	}
	return b
}
