/*
Copyright The Kubernetes Authors.

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/

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

package v1beta2

import (
	resourcev1beta2 "k8s.io/api/resource/v1beta2"
	resource "k8s.io/apimachinery/pkg/api/resource"
)

// NodeAllocatableMappingApplyConfiguration represents a declarative configuration of the NodeAllocatableMapping type for use
// with apply.
//
// NodeAllocatableMapping defines how a DRA allocation directly translates into a node allocatable resource quantity.
// The mapping can be derived from either the count of allocated devices (via deviceMultiplier) or the specific capacity consumed (via capacityKey and capacityMultiplier). These options are mutually exclusive.
// Kubelet adds this mapped resource quantity from claim to both requests and limits at the pod-level cgroup, and to limits at the container-level cgroup for each container referencing the claim.
type NodeAllocatableMappingApplyConfiguration struct {
	// CapacityKey references a capacity name defined as a key in the
	// `spec.devices[*].capacity` map. When this field is set, the value associated with
	// this key in the `status.allocation.devices.results[*].consumedCapacity` map
	// (for a specific claim allocation) determines the base quantity for
	// the node allocatable resource. `capacityMultiplier` must also be set and is
	// multiplied with the base quantity.
	// For example, if `spec.devices[*].capacity` has an entry "dra.example.com/memory": "128Gi",
	// and this field is set to "dra.example.com/memory", then for a claim allocation
	// that consumes { "dra.example.com/memory": "4Gi" } the base quantity for the
	// node allocatable resource mapping will be "4Gi".
	// The final node allocatable resource amount is `consumedCapacity[capacityKey]` * `capacityMultiplier`.
	CapacityKey *resourcev1beta2.QualifiedName `json:"capacityKey,omitempty"`
	// CapacityMultiplier is used as a multiplier for the allocated capacity consumed.
	// It is only valid if `capacityKey` is set.
	// The final node allocatable resource amount is `consumedCapacity[capacityKey]` * `capacityMultiplier`.
	// For example, if a Device's capacity "dra.example.com/cores" is consumed,
	// and each "core" provides 2 "cpu"s, the mapping would be:
	// {ResourceName: "cpu", capacityKey: "dra.example.com/cores", capacityMultiplier: "2"}.
	// If a claim consumes 8 "dra.example.com/cores", the CPU footprint is 8 * 2 = 16.
	CapacityMultiplier *resource.Quantity `json:"capacityMultiplier,omitempty"`
	// DeviceMultiplier is used as a multiplier for the allocated device count in the claim.
	// The final node allocatable resource amount is `deviceCount` * `deviceMultiplier`.
	// For example, a DRA driver representing each cache complex (CCX) as a device would have
	// {ResourceName: "cpu", deviceMultiplier: "8"} in its `nodeAllocatableResources`.
	// If 2 devices (CCX) are allocated to the claim, 2 * 8 = 16 CPUs would be considered as allocated.
	// It is only valid when `capacityKey` and `capacityMultiplier` are not set.
	DeviceMultiplier *resource.Quantity `json:"deviceMultiplier,omitempty"`
}

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

// WithCapacityKey sets the CapacityKey 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 CapacityKey field is set to the value of the last call.
func (b *NodeAllocatableMappingApplyConfiguration) WithCapacityKey(value resourcev1beta2.QualifiedName) *NodeAllocatableMappingApplyConfiguration {
	b.CapacityKey = &value
	return b
}

// WithCapacityMultiplier sets the CapacityMultiplier 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 CapacityMultiplier field is set to the value of the last call.
func (b *NodeAllocatableMappingApplyConfiguration) WithCapacityMultiplier(value resource.Quantity) *NodeAllocatableMappingApplyConfiguration {
	b.CapacityMultiplier = &value
	return b
}

// WithDeviceMultiplier sets the DeviceMultiplier 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 DeviceMultiplier field is set to the value of the last call.
func (b *NodeAllocatableMappingApplyConfiguration) WithDeviceMultiplier(value resource.Quantity) *NodeAllocatableMappingApplyConfiguration {
	b.DeviceMultiplier = &value
	return b
}
