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

package v1

import (
	imagev1 "github.com/openshift/api/image/v1"
	internal "github.com/openshift/client-go/image/applyconfigurations/internal"
	apismetav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
	runtime "k8s.io/apimachinery/pkg/runtime"
	types "k8s.io/apimachinery/pkg/types"
	managedfields "k8s.io/apimachinery/pkg/util/managedfields"
	metav1 "k8s.io/client-go/applyconfigurations/meta/v1"
)

// ImageApplyConfiguration represents a declarative configuration of the Image type for use
// with apply.
//
// Image is an immutable representation of a container image and its metadata at a point in time.
// Images are named by taking a hash of their contents (metadata and content) and any change
// in format, content, or metadata results in a new name. The images resource is primarily
// for use by cluster administrators and integrations like the cluster image registry - end
// users, instead, access images via the imagestreamtags or imagestreamimages resources. While
// image metadata is stored in the API, any integration that implements the container image
// registry API must provide its own storage for the raw manifest data, image config, and
// layer contents.
//
// Compatibility level 1: Stable within a major release for a minimum of 12 months or 3 minor releases (whichever is longer).
type ImageApplyConfiguration struct {
	metav1.TypeMetaApplyConfiguration `json:",inline"`
	// metadata is the standard object's metadata.
	// More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata
	*metav1.ObjectMetaApplyConfiguration `json:"metadata,omitempty"`
	// dockerImageReference is the string that can be used to pull this image.
	DockerImageReference *string `json:"dockerImageReference,omitempty"`
	// dockerImageMetadata contains metadata about this image
	DockerImageMetadata *runtime.RawExtension `json:"dockerImageMetadata,omitempty"`
	// dockerImageMetadataVersion conveys the version of the object, which if empty defaults to "1.0"
	DockerImageMetadataVersion *string `json:"dockerImageMetadataVersion,omitempty"`
	// dockerImageManifest is the raw JSON of the manifest
	DockerImageManifest *string `json:"dockerImageManifest,omitempty"`
	// dockerImageLayers represents the layers in the image. May not be set if the image does not define that data or if the image represents a manifest list.
	DockerImageLayers []ImageLayerApplyConfiguration `json:"dockerImageLayers,omitempty"`
	// signatures holds all signatures of the image.
	Signatures []ImageSignatureApplyConfiguration `json:"signatures,omitempty"`
	// dockerImageSignatures provides the signatures as opaque blobs. This is a part of manifest schema v1.
	DockerImageSignatures [][]byte `json:"dockerImageSignatures,omitempty"`
	// dockerImageManifestMediaType specifies the mediaType of manifest. This is a part of manifest schema v2.
	DockerImageManifestMediaType *string `json:"dockerImageManifestMediaType,omitempty"`
	// dockerImageConfig is a JSON blob that the runtime uses to set up the container. This is a part of manifest schema v2.
	// Will not be set when the image represents a manifest list.
	DockerImageConfig *string `json:"dockerImageConfig,omitempty"`
	// dockerImageManifests holds information about sub-manifests when the image represents a manifest list.
	// When this field is present, no DockerImageLayers should be specified.
	DockerImageManifests []ImageManifestApplyConfiguration `json:"dockerImageManifests,omitempty"`
}

// Image constructs a declarative configuration of the Image type for use with
// apply.
func Image(name string) *ImageApplyConfiguration {
	b := &ImageApplyConfiguration{}
	b.WithName(name)
	b.WithKind("Image")
	b.WithAPIVersion("image.openshift.io/v1")
	return b
}

// ExtractImageFrom extracts the applied configuration owned by fieldManager from
// image for the specified subresource. Pass an empty string for subresource to extract
// the main resource. Common subresources include "status", "scale", etc.
// image must be a unmodified Image API object that was retrieved from the Kubernetes API.
// ExtractImageFrom provides a way to perform a extract/modify-in-place/apply workflow.
// Note that an extracted apply configuration will contain fewer fields than what the fieldManager previously
// applied if another fieldManager has updated or force applied any of the previously applied fields.
func ExtractImageFrom(image *imagev1.Image, fieldManager string, subresource string) (*ImageApplyConfiguration, error) {
	b := &ImageApplyConfiguration{}
	err := managedfields.ExtractInto(image, internal.Parser().Type("com.github.openshift.api.image.v1.Image"), fieldManager, b, subresource)
	if err != nil {
		return nil, err
	}
	b.WithName(image.Name)

	b.WithKind("Image")
	b.WithAPIVersion("image.openshift.io/v1")
	return b, nil
}

// ExtractImage extracts the applied configuration owned by fieldManager from
// image. If no managedFields are found in image for fieldManager, a
// ImageApplyConfiguration is returned with only the Name, Namespace (if applicable),
// APIVersion and Kind populated. It is possible that no managed fields were found for because other
// field managers have taken ownership of all the fields previously owned by fieldManager, or because
// the fieldManager never owned fields any fields.
// image must be a unmodified Image API object that was retrieved from the Kubernetes API.
// ExtractImage provides a way to perform a extract/modify-in-place/apply workflow.
// Note that an extracted apply configuration will contain fewer fields than what the fieldManager previously
// applied if another fieldManager has updated or force applied any of the previously applied fields.
func ExtractImage(image *imagev1.Image, fieldManager string) (*ImageApplyConfiguration, error) {
	return ExtractImageFrom(image, fieldManager, "")
}

func (b ImageApplyConfiguration) IsApplyConfiguration() {}

// WithKind sets the Kind 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 Kind field is set to the value of the last call.
func (b *ImageApplyConfiguration) WithKind(value string) *ImageApplyConfiguration {
	b.TypeMetaApplyConfiguration.Kind = &value
	return b
}

// WithAPIVersion sets the APIVersion 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 APIVersion field is set to the value of the last call.
func (b *ImageApplyConfiguration) WithAPIVersion(value string) *ImageApplyConfiguration {
	b.TypeMetaApplyConfiguration.APIVersion = &value
	return b
}

// WithName sets the Name 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 Name field is set to the value of the last call.
func (b *ImageApplyConfiguration) WithName(value string) *ImageApplyConfiguration {
	b.ensureObjectMetaApplyConfigurationExists()
	b.ObjectMetaApplyConfiguration.Name = &value
	return b
}

// WithGenerateName sets the GenerateName 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 GenerateName field is set to the value of the last call.
func (b *ImageApplyConfiguration) WithGenerateName(value string) *ImageApplyConfiguration {
	b.ensureObjectMetaApplyConfigurationExists()
	b.ObjectMetaApplyConfiguration.GenerateName = &value
	return b
}

// WithNamespace sets the Namespace 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 Namespace field is set to the value of the last call.
func (b *ImageApplyConfiguration) WithNamespace(value string) *ImageApplyConfiguration {
	b.ensureObjectMetaApplyConfigurationExists()
	b.ObjectMetaApplyConfiguration.Namespace = &value
	return b
}

// WithUID sets the UID 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 UID field is set to the value of the last call.
func (b *ImageApplyConfiguration) WithUID(value types.UID) *ImageApplyConfiguration {
	b.ensureObjectMetaApplyConfigurationExists()
	b.ObjectMetaApplyConfiguration.UID = &value
	return b
}

// WithResourceVersion sets the ResourceVersion 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 ResourceVersion field is set to the value of the last call.
func (b *ImageApplyConfiguration) WithResourceVersion(value string) *ImageApplyConfiguration {
	b.ensureObjectMetaApplyConfigurationExists()
	b.ObjectMetaApplyConfiguration.ResourceVersion = &value
	return b
}

// WithGeneration sets the Generation 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 Generation field is set to the value of the last call.
func (b *ImageApplyConfiguration) WithGeneration(value int64) *ImageApplyConfiguration {
	b.ensureObjectMetaApplyConfigurationExists()
	b.ObjectMetaApplyConfiguration.Generation = &value
	return b
}

// WithCreationTimestamp sets the CreationTimestamp 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 CreationTimestamp field is set to the value of the last call.
func (b *ImageApplyConfiguration) WithCreationTimestamp(value apismetav1.Time) *ImageApplyConfiguration {
	b.ensureObjectMetaApplyConfigurationExists()
	b.ObjectMetaApplyConfiguration.CreationTimestamp = &value
	return b
}

// WithDeletionTimestamp sets the DeletionTimestamp 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 DeletionTimestamp field is set to the value of the last call.
func (b *ImageApplyConfiguration) WithDeletionTimestamp(value apismetav1.Time) *ImageApplyConfiguration {
	b.ensureObjectMetaApplyConfigurationExists()
	b.ObjectMetaApplyConfiguration.DeletionTimestamp = &value
	return b
}

// WithDeletionGracePeriodSeconds sets the DeletionGracePeriodSeconds 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 DeletionGracePeriodSeconds field is set to the value of the last call.
func (b *ImageApplyConfiguration) WithDeletionGracePeriodSeconds(value int64) *ImageApplyConfiguration {
	b.ensureObjectMetaApplyConfigurationExists()
	b.ObjectMetaApplyConfiguration.DeletionGracePeriodSeconds = &value
	return b
}

// WithLabels puts the entries into the Labels field in the declarative configuration
// and returns the receiver, so that objects can be build by chaining "With" function invocations.
// If called multiple times, the entries provided by each call will be put on the Labels field,
// overwriting an existing map entries in Labels field with the same key.
func (b *ImageApplyConfiguration) WithLabels(entries map[string]string) *ImageApplyConfiguration {
	b.ensureObjectMetaApplyConfigurationExists()
	if b.ObjectMetaApplyConfiguration.Labels == nil && len(entries) > 0 {
		b.ObjectMetaApplyConfiguration.Labels = make(map[string]string, len(entries))
	}
	for k, v := range entries {
		b.ObjectMetaApplyConfiguration.Labels[k] = v
	}
	return b
}

// WithAnnotations puts the entries into the Annotations field in the declarative configuration
// and returns the receiver, so that objects can be build by chaining "With" function invocations.
// If called multiple times, the entries provided by each call will be put on the Annotations field,
// overwriting an existing map entries in Annotations field with the same key.
func (b *ImageApplyConfiguration) WithAnnotations(entries map[string]string) *ImageApplyConfiguration {
	b.ensureObjectMetaApplyConfigurationExists()
	if b.ObjectMetaApplyConfiguration.Annotations == nil && len(entries) > 0 {
		b.ObjectMetaApplyConfiguration.Annotations = make(map[string]string, len(entries))
	}
	for k, v := range entries {
		b.ObjectMetaApplyConfiguration.Annotations[k] = v
	}
	return b
}

// WithOwnerReferences adds the given value to the OwnerReferences 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 OwnerReferences field.
func (b *ImageApplyConfiguration) WithOwnerReferences(values ...*metav1.OwnerReferenceApplyConfiguration) *ImageApplyConfiguration {
	b.ensureObjectMetaApplyConfigurationExists()
	for i := range values {
		if values[i] == nil {
			panic("nil value passed to WithOwnerReferences")
		}
		b.ObjectMetaApplyConfiguration.OwnerReferences = append(b.ObjectMetaApplyConfiguration.OwnerReferences, *values[i])
	}
	return b
}

// WithFinalizers adds the given value to the Finalizers 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 Finalizers field.
func (b *ImageApplyConfiguration) WithFinalizers(values ...string) *ImageApplyConfiguration {
	b.ensureObjectMetaApplyConfigurationExists()
	for i := range values {
		b.ObjectMetaApplyConfiguration.Finalizers = append(b.ObjectMetaApplyConfiguration.Finalizers, values[i])
	}
	return b
}

func (b *ImageApplyConfiguration) ensureObjectMetaApplyConfigurationExists() {
	if b.ObjectMetaApplyConfiguration == nil {
		b.ObjectMetaApplyConfiguration = &metav1.ObjectMetaApplyConfiguration{}
	}
}

// WithDockerImageReference sets the DockerImageReference 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 DockerImageReference field is set to the value of the last call.
func (b *ImageApplyConfiguration) WithDockerImageReference(value string) *ImageApplyConfiguration {
	b.DockerImageReference = &value
	return b
}

// WithDockerImageMetadata sets the DockerImageMetadata 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 DockerImageMetadata field is set to the value of the last call.
func (b *ImageApplyConfiguration) WithDockerImageMetadata(value runtime.RawExtension) *ImageApplyConfiguration {
	b.DockerImageMetadata = &value
	return b
}

// WithDockerImageMetadataVersion sets the DockerImageMetadataVersion 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 DockerImageMetadataVersion field is set to the value of the last call.
func (b *ImageApplyConfiguration) WithDockerImageMetadataVersion(value string) *ImageApplyConfiguration {
	b.DockerImageMetadataVersion = &value
	return b
}

// WithDockerImageManifest sets the DockerImageManifest 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 DockerImageManifest field is set to the value of the last call.
func (b *ImageApplyConfiguration) WithDockerImageManifest(value string) *ImageApplyConfiguration {
	b.DockerImageManifest = &value
	return b
}

// WithDockerImageLayers adds the given value to the DockerImageLayers 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 DockerImageLayers field.
func (b *ImageApplyConfiguration) WithDockerImageLayers(values ...*ImageLayerApplyConfiguration) *ImageApplyConfiguration {
	for i := range values {
		if values[i] == nil {
			panic("nil value passed to WithDockerImageLayers")
		}
		b.DockerImageLayers = append(b.DockerImageLayers, *values[i])
	}
	return b
}

// WithSignatures adds the given value to the Signatures 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 Signatures field.
func (b *ImageApplyConfiguration) WithSignatures(values ...*ImageSignatureApplyConfiguration) *ImageApplyConfiguration {
	for i := range values {
		if values[i] == nil {
			panic("nil value passed to WithSignatures")
		}
		b.Signatures = append(b.Signatures, *values[i])
	}
	return b
}

// WithDockerImageSignatures adds the given value to the DockerImageSignatures 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 DockerImageSignatures field.
func (b *ImageApplyConfiguration) WithDockerImageSignatures(values ...[]byte) *ImageApplyConfiguration {
	for i := range values {
		b.DockerImageSignatures = append(b.DockerImageSignatures, values[i])
	}
	return b
}

// WithDockerImageManifestMediaType sets the DockerImageManifestMediaType 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 DockerImageManifestMediaType field is set to the value of the last call.
func (b *ImageApplyConfiguration) WithDockerImageManifestMediaType(value string) *ImageApplyConfiguration {
	b.DockerImageManifestMediaType = &value
	return b
}

// WithDockerImageConfig sets the DockerImageConfig 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 DockerImageConfig field is set to the value of the last call.
func (b *ImageApplyConfiguration) WithDockerImageConfig(value string) *ImageApplyConfiguration {
	b.DockerImageConfig = &value
	return b
}

// WithDockerImageManifests adds the given value to the DockerImageManifests 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 DockerImageManifests field.
func (b *ImageApplyConfiguration) WithDockerImageManifests(values ...*ImageManifestApplyConfiguration) *ImageApplyConfiguration {
	for i := range values {
		if values[i] == nil {
			panic("nil value passed to WithDockerImageManifests")
		}
		b.DockerImageManifests = append(b.DockerImageManifests, *values[i])
	}
	return b
}

// GetKind retrieves the value of the Kind field in the declarative configuration.
func (b *ImageApplyConfiguration) GetKind() *string {
	return b.TypeMetaApplyConfiguration.Kind
}

// GetAPIVersion retrieves the value of the APIVersion field in the declarative configuration.
func (b *ImageApplyConfiguration) GetAPIVersion() *string {
	return b.TypeMetaApplyConfiguration.APIVersion
}

// GetName retrieves the value of the Name field in the declarative configuration.
func (b *ImageApplyConfiguration) GetName() *string {
	b.ensureObjectMetaApplyConfigurationExists()
	return b.ObjectMetaApplyConfiguration.Name
}

// GetNamespace retrieves the value of the Namespace field in the declarative configuration.
func (b *ImageApplyConfiguration) GetNamespace() *string {
	b.ensureObjectMetaApplyConfigurationExists()
	return b.ObjectMetaApplyConfiguration.Namespace
}
