Skip to content

Commit 5d074fc

Browse files
shubham-pampattiwarclaudekaovilai
authored
Add VM file restore feature integration (#2003)
* Add VM file restore feature integration This commit integrates the VM file restore feature into OADP operator, following the same pattern as the non-admin controller integration. Features: - Enable/disable VM file restore via DPA.Spec.VMFileRestore.Enable - Automatic deployment of oadp-vm-file-restore-controller when enabled - Support for custom resource limits via DPA configuration - Image override support for all 4 required images: * VM file restore controller * File access container * SSH sidecar * FileBrowser sidecar Changes: - API: Added VMFileRestore struct to DataProtectionApplication spec - API: Added 4 image key constants for unsupportedOverrides - Controller: Created vmfilerestore_controller.go with reconciliation logic - Validation: Added VM file restore validation requiring kubevirt and openshift plugins - CRDs: Added VirtualMachineBackupsDiscovery and VirtualMachineFileRestore - RBAC: Added ClusterRole, binding, and ServiceAccount for controller - Bundle: Updated CSV with new CRDs, environment variables, and related images - Documentation: Created comprehensive user guide at docs/config/vm_file_restore.md - Tests: Added 33 unit test scenarios with full coverage Prerequisites: - KubeVirt must be installed in the cluster - kubevirt-velero-plugin must be configured in defaultPlugins (required) - openshift-velero-plugin must be configured in defaultPlugins (required) Implements: migtools/oadp-vm-file-restore#10 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> * Fix VM file restore controller deployment and permissions This commit fixes issues found during live cluster testing: 1. Add missing RBAC permissions: - events permission for controller to create events - coordination.k8s.io/leases for leader election 2. Fix reconciliation loop in OADP operator: - Only update dynamic container fields (Image, ImagePullPolicy, Env, Resources) - Make PodSecurityContext conditional (set only if nil) - Prevents continuous reconciliation by leaving static fields unchanged 3. Bundle generation fixes: - Add vm-file-restore RBAC kustomization.yaml - Add oadp-vm-file-restore-controller-manager to Makefile BUNDLE_GEN_FLAGS - Reference vm-file-restore RBAC in config/manifests/kustomization.yaml - Clean unwanted RBAC from CSV (buckets, velero-privileged SCC, wildcards) Tested on live cluster - controller now deploys successfully, performs leader election, and no longer causes reconciliation loops. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> * Fix code formatting and clean unwanted RBAC permissions - Fix import grouping (gci) in validator_test.go, vmfilerestore_controller.go, and vmfilerestore_controller_test.go - Replace custom contains helper with strings.Contains from stdlib - Remove unwanted RBAC from config/rbac/role.yaml: - Full wildcard permissions (apiGroups: *, resources: *, verbs: *) - buckets resources (3 locations) - velero-privileged SCC reference - Duplicate privileged SCC entry - Extra velero.io resource listings - Remove unwanted RBAC from bundle CSV: - Full wildcard from velero ServiceAccount All tests pass. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> * lint fix * make bundle * `make bundle` after `gh pr checkout 2003 --recurse-submodules` ❯ gh pr checkout 2003 --recurse-submodules remote: Enumerating objects: 77, done. remote: Counting objects: 100% (29/29), done. remote: Compressing objects: 100% (14/14), done. remote: Total 77 (delta 15), reused 18 (delta 14), pack-reused 48 (from 1) Unpacking objects: 100% (77/77), 118.21 KiB | 1.01 MiB/s, done. From https://github.com/shubham-pampattiwar/oadp-operator * [new branch] vm-file-restore-integration -> shub/vm-file-restore-integration Previous HEAD position was 24e3758 update prow notes, operator-config (#2029) branch 'vm-file-restore-integration' set up to track 'shub/vm-file-restore-integration'. Switched to a new branch 'vm-file-restore-integration' ~/oadp-operator vm-file-restore-integration ❯ make bundle Using Container Tool: docker [ -f /Users/tkaovila/oadp-operator/bin/oadp-dev/controller-gen ] || { set -e ; mkdir -p /Users/tkaovila/oadp-operator/bin/oadp-dev/ ; TMP_DIR=$(mktemp -d) ; cd $TMP_DIR ; go mod init tmp ; echo "Downloading sigs.k8s.io/controller-tools/cmd/controller-gen@v0.16.5 to branch directory" ; GOBIN=/Users/tkaovila/oadp-operator/bin/oadp-dev/ go install -mod=mod sigs.k8s.io/controller-tools/cmd/controller-gen@v0.16.5 ; rm -rf $TMP_DIR ; } GOFLAGS="-mod=mod" /Users/tkaovila/oadp-operator/bin/oadp-dev/controller-gen rbac:roleName=manager-role crd webhook paths="./..." output:crd:artifacts:config=config/crd/bases [ -f /Users/tkaovila/oadp-operator/bin/oadp-dev/kustomize ] || { set -e ; mkdir -p /Users/tkaovila/oadp-operator/bin/oadp-dev/ ; TMP_DIR=$(mktemp -d) ; cd $TMP_DIR ; go mod init tmp ; echo "Downloading sigs.k8s.io/kustomize/kustomize/v5@v5.2.1 to branch directory" ; GOBIN=/Users/tkaovila/oadp-operator/bin/oadp-dev/ go install -mod=mod sigs.k8s.io/kustomize/kustomize/v5@v5.2.1 ; rm -rf $TMP_DIR ; } GOFLAGS="-mod=mod" /Users/tkaovila/oadp-operator/bin/oadp-dev/operator-sdk generate kustomize manifests -q cd config/manager && GOFLAGS="-mod=mod" /Users/tkaovila/oadp-operator/bin/oadp-dev/kustomize edit set image controller=quay.io/konveyor/oadp-operator:latest GOFLAGS="-mod=mod" /Users/tkaovila/oadp-operator/bin/oadp-dev/kustomize build config/manifests | GOFLAGS="-mod=mod" /Users/tkaovila/oadp-operator/bin/oadp-dev/operator-sdk generate bundle -q --extra-service-accounts "velero,non-admin-controller,oadp-vm-file-restore-controller-manager" --overwrite --version 99.0.0 --channels="dev" --default-channel="dev" WARN[0000] ClusterServiceVersion validation: [OperationFailed] provided API should have an example annotation WARN[0000] ClusterServiceVersion validation: [OperationFailed] provided API should have an example annotation WARN[0000] ClusterServiceVersion validation: [OperationFailed] provided API should have an example annotation WARN[0000] ClusterServiceVersion validation: [OperationFailed] provided API should have an example annotation WARN[0000] ClusterServiceVersion validation: [OperationFailed] provided API should have an example annotation WARN[0000] ClusterServiceVersion validation: [OperationFailed] provided API should have an example annotation WARN[0000] ClusterServiceVersion validation: [CSVFileNotValid] (oadp-operator.v99.0.0) csv.Spec.minKubeVersion is not informed. It is recommended you provide this information. Otherwise, it would mean that your operator project can be distributed and installed in any cluster version available, which is not necessarily the case for all projects. INFO[0000] Creating bundle.Dockerfile INFO[0000] Creating bundle/metadata/annotations.yaml INFO[0000] Bundle metadata generated successfully Using Container Tool: docker Using Container Tool: docker [ -f /Users/tkaovila/oadp-operator/bin/yq ] || { set -e ; TMP_DIR=$(mktemp -d) ; cd $TMP_DIR ; go mod init tmp ; echo "Downloading github.com/mikefarah/yq/v4@v4.28.1" ; GOBIN=/Users/tkaovila/oadp-operator/bin go install -mod=mod github.com/mikefarah/yq/v4@v4.28.1 ; rm -rf $TMP_DIR ; } go: creating new go.mod: module tmp Downloading github.com/mikefarah/yq/v4@v4.28.1 Using Container Tool: docker [ -f /Users/tkaovila/oadp-operator/bin/yq ] || { set -e ; TMP_DIR=$(mktemp -d) ; cd $TMP_DIR ; go mod init tmp ; echo "Downloading github.com/mikefarah/yq/v4@v4.28.1" ; GOBIN=/Users/tkaovila/oadp-operator/bin go install -mod=mod github.com/mikefarah/yq/v4@v4.28.1 ; rm -rf $TMP_DIR ; } cp bundle.Dockerfile build/Dockerfile.bundle GOFLAGS="-mod=mod" /Users/tkaovila/oadp-operator/bin/oadp-dev/operator-sdk bundle validate ./bundle WARN[0000] Warning: Value velero.io/v1, Kind=BackupRepository: provided API should have an example annotation WARN[0000] Warning: Value oadp.openshift.io/v1alpha1, Kind=VirtualMachineBackupsDiscovery: provided API should have an example annotation WARN[0000] Warning: Value oadp.openshift.io/v1alpha1, Kind=CloudStorage: provided API should have an example annotation WARN[0000] Warning: Value velero.io/v2alpha1, Kind=DataUpload: provided API should have an example annotation WARN[0000] Warning: Value velero.io/v2alpha1, Kind=DataDownload: provided API should have an example annotation WARN[0000] Warning: Value oadp.openshift.io/v1alpha1, Kind=VirtualMachineFileRestore: provided API should have an example annotation WARN[0000] Warning: Value : (oadp-operator.v99.0.0) csv.Spec.minKubeVersion is not informed. It is recommended you provide this information. Otherwise, it would mean that your operator project can be distributed and installed in any cluster version available, which is not necessarily the case for all projects. INFO[0000] All validation tests have completed successfully gsed -e 's/ createdAt: .*/ createdAt: "2025-02-28T20:03:54Z"/' bundle/manifests/oadp-operator.clusterserviceversion.yaml > bundle/manifests/oadp-operator.clusterserviceversion.yaml.tmp mv bundle/manifests/oadp-operator.clusterserviceversion.yaml.tmp bundle/manifests/oadp-operator.clusterserviceversion.yaml Signed-off-by: Tiger Kaovilai <tkaovila@redhat.com> --------- Signed-off-by: Tiger Kaovilai <tkaovila@redhat.com> Co-authored-by: Claude <noreply@anthropic.com> Co-authored-by: Tiger Kaovilai <tkaovila@redhat.com>
1 parent 2abf698 commit 5d074fc

24 files changed

+4152
-2
lines changed

Makefile

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ DEFAULT_VERSION := 99.0.0
44
VERSION ?= $(DEFAULT_VERSION) # the version of the operator
55
OPERATOR_SDK_VERSION ?= v1.35.0
66
ENVTEST_K8S_VERSION = 1.32 #refers to the version of kubebuilder assets to be downloaded by envtest binary # Kubernetes version from OpenShift 4.19.x
7-
GOLANGCI_LINT_VERSION ?= v2.1.2
7+
GOLANGCI_LINT_VERSION ?= v2.6.1
88
KUSTOMIZE_VERSION ?= v5.2.1
99
CONTROLLER_TOOLS_VERSION ?= v0.16.5
1010
OPM_VERSION ?= v1.23.0
@@ -47,7 +47,7 @@ IMAGE_TAG_BASE ?= openshift.io/oadp-operator
4747
BUNDLE_IMG ?= $(IMAGE_TAG_BASE)-bundle:v$(VERSION)
4848

4949
# BUNDLE_GEN_FLAGS are the flags passed to the operator-sdk generate bundle command
50-
BUNDLE_GEN_FLAGS ?= -q --extra-service-accounts "velero,non-admin-controller" --overwrite --version $(VERSION) $(BUNDLE_METADATA_OPTS)
50+
BUNDLE_GEN_FLAGS ?= -q --extra-service-accounts "velero,non-admin-controller,oadp-vm-file-restore-controller-manager" --overwrite --version $(VERSION) $(BUNDLE_METADATA_OPTS)
5151

5252
# USE_IMAGE_DIGESTS defines if images are resolved via tags or digests
5353
# You can enable this value if you would like to use SHA Based Digests

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,7 @@ Documentation in this repository are considered unofficial and for development p
103103
5. [Use NooBaa as a Backup Storage Location](docs/config/noobaa/install_oadp_noobaa.md)
104104
6. [Use Velero --features flag](docs/config/features_flag.md)
105105
7. [Use Custom Plugin Images for Velero ](docs/config/custom_plugin_images.md)
106+
8. [Enable VM File Restore](docs/config/vm_file_restore.md)
106107
5. Examples
107108
1. [Sample Apps used in OADP CI](https://github.com/openshift/oadp-operator/tree/oadp-dev/tests/e2e/sample-applications)
108109
2. [Stateless App Backup/Restore](docs/examples/stateless.md)

api/v1alpha1/dataprotectionapplication_types.go

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,10 @@ const GCPPluginImageKey UnsupportedImageKey = "gcpPluginImageFqin"
7373
const KubeVirtPluginImageKey UnsupportedImageKey = "kubevirtPluginImageFqin"
7474
const HypershiftPluginImageKey UnsupportedImageKey = "hypershiftPluginImageFqin"
7575
const NonAdminControllerImageKey UnsupportedImageKey = "nonAdminControllerImageFqin"
76+
const VMFileRestoreControllerImageKey UnsupportedImageKey = "vmFileRestoreControllerImageFqin"
77+
const VMFileRestoreAccessImageKey UnsupportedImageKey = "vmFileRestoreAccessImageFqin"
78+
const VMFileRestoreSSHImageKey UnsupportedImageKey = "vmFileRestoreSSHImageFqin"
79+
const VMFileRestoreBrowserImageKey UnsupportedImageKey = "vmFileRestoreBrowserImageFqin"
7680
const OperatorTypeKey UnsupportedImageKey = "operator-type"
7781

7882
const OperatorTypeMTC = "mtc"
@@ -728,6 +732,18 @@ type NonAdmin struct {
728732
BackupSyncPeriod *metav1.Duration `json:"backupSyncPeriod,omitempty"`
729733
}
730734

735+
// VMFileRestore defines VM file restore feature configuration
736+
type VMFileRestore struct {
737+
// Enable flag to deploy VM file restore controller
738+
// By default is disabled
739+
// +optional
740+
Enable *bool `json:"enable,omitempty"`
741+
742+
// Resource requirements for the VM file restore controller
743+
// +optional
744+
Resources *corev1.ResourceRequirements `json:"resources,omitempty"`
745+
}
746+
731747
// DataMover defines the various config for DPA data mover
732748
type DataMover struct {
733749
// enable flag is used to specify whether you want to deploy the volume snapshot mover controller
@@ -840,6 +856,10 @@ type DataProtectionApplicationSpec struct {
840856
// - kubevirtPluginImageFqin
841857
// - hypershiftPluginImageFqin
842858
// - nonAdminControllerImageFqin
859+
// - vmFileRestoreControllerImageFqin
860+
// - vmFileRestoreAccessImageFqin
861+
// - vmFileRestoreSSHImageFqin
862+
// - vmFileRestoreBrowserImageFqin
843863
// - operator-type
844864
// - tech-preview-ack
845865
// +optional
@@ -873,6 +893,9 @@ type DataProtectionApplicationSpec struct {
873893
// nonAdmin defines the configuration for the DPA to enable backup and restore operations for non-admin users
874894
// +optional
875895
NonAdmin *NonAdmin `json:"nonAdmin,omitempty"`
896+
// vmFileRestore defines the configuration for the DPA to enable VM file restore feature
897+
// +optional
898+
VMFileRestore *VMFileRestore `json:"vmFileRestore,omitempty"`
876899
// The format for log output. Valid values are text, json. (default text)
877900
// +kubebuilder:validation:Enum=text;json
878901
// +kubebuilder:default=text

api/v1alpha1/zz_generated.deepcopy.go

Lines changed: 30 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

bundle/manifests/oadp-operator.clusterserviceversion.yaml

Lines changed: 165 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -688,6 +688,12 @@ spec:
688688
displayName: Plugins
689689
path: plugins
690690
version: v1
691+
- kind: VirtualMachineBackupsDiscovery
692+
name: virtualmachinebackupsdiscoveries.oadp.openshift.io
693+
version: v1alpha1
694+
- kind: VirtualMachineFileRestore
695+
name: virtualmachinefilerestores.oadp.openshift.io
696+
version: v1alpha1
691697
- description: VolumeSnapshotLocation is a location where Velero stores volume
692698
snapshots.
693699
displayName: VolumeSnapshotLocation
@@ -835,6 +841,149 @@ spec:
835841
verbs:
836842
- get
837843
serviceAccountName: non-admin-controller
844+
- rules:
845+
- apiGroups:
846+
- ""
847+
resources:
848+
- events
849+
- namespaces
850+
- pods
851+
- secrets
852+
- serviceaccounts
853+
- services
854+
verbs:
855+
- create
856+
- delete
857+
- get
858+
- list
859+
- patch
860+
- update
861+
- watch
862+
- apiGroups:
863+
- ""
864+
resources:
865+
- persistentvolumeclaims
866+
verbs:
867+
- get
868+
- list
869+
- watch
870+
- apiGroups:
871+
- apps
872+
resources:
873+
- deployments
874+
verbs:
875+
- create
876+
- delete
877+
- get
878+
- list
879+
- patch
880+
- update
881+
- watch
882+
- apiGroups:
883+
- coordination.k8s.io
884+
resources:
885+
- leases
886+
verbs:
887+
- get
888+
- list
889+
- watch
890+
- create
891+
- update
892+
- patch
893+
- delete
894+
- apiGroups:
895+
- oadp.openshift.io
896+
resources:
897+
- virtualmachinebackupsdiscoveries
898+
- virtualmachinefilerestores
899+
verbs:
900+
- create
901+
- delete
902+
- get
903+
- list
904+
- patch
905+
- update
906+
- watch
907+
- apiGroups:
908+
- oadp.openshift.io
909+
resources:
910+
- virtualmachinebackupsdiscoveries/finalizers
911+
- virtualmachinefilerestores/finalizers
912+
verbs:
913+
- update
914+
- apiGroups:
915+
- oadp.openshift.io
916+
resources:
917+
- virtualmachinebackupsdiscoveries/status
918+
- virtualmachinefilerestores/status
919+
verbs:
920+
- get
921+
- patch
922+
- update
923+
- apiGroups:
924+
- rbac.authorization.k8s.io
925+
resources:
926+
- rolebindings
927+
verbs:
928+
- create
929+
- delete
930+
- get
931+
- list
932+
- patch
933+
- update
934+
- watch
935+
- apiGroups:
936+
- route.openshift.io
937+
resources:
938+
- routes
939+
verbs:
940+
- create
941+
- delete
942+
- get
943+
- list
944+
- patch
945+
- update
946+
- watch
947+
- apiGroups:
948+
- velero.io
949+
resources:
950+
- backups
951+
verbs:
952+
- get
953+
- list
954+
- watch
955+
- apiGroups:
956+
- velero.io
957+
resources:
958+
- datadownloads
959+
verbs:
960+
- get
961+
- list
962+
- patch
963+
- watch
964+
- apiGroups:
965+
- velero.io
966+
resources:
967+
- downloadrequests
968+
verbs:
969+
- create
970+
- delete
971+
- get
972+
- list
973+
- watch
974+
- apiGroups:
975+
- velero.io
976+
resources:
977+
- restores
978+
verbs:
979+
- create
980+
- delete
981+
- get
982+
- list
983+
- patch
984+
- update
985+
- watch
986+
serviceAccountName: oadp-vm-file-restore-controller-manager
838987
- rules:
839988
- apiGroups:
840989
- ""
@@ -1135,6 +1284,14 @@ spec:
11351284
value: registry.redhat.io/oadp/oadp-mustgather-rhel8:v1.2
11361285
- name: RELATED_IMAGE_NON_ADMIN_CONTROLLER
11371286
value: quay.io/konveyor/oadp-non-admin:latest
1287+
- name: RELATED_IMAGE_VM_FILE_RESTORE_CONTROLLER
1288+
value: quay.io/konveyor/oadp-vm-file-restore:latest
1289+
- name: RELATED_IMAGE_VM_FILE_RESTORE_ACCESS
1290+
value: quay.io/konveyor/oadp-vmfr-access:latest
1291+
- name: RELATED_IMAGE_VM_FILE_RESTORE_SSH
1292+
value: quay.io/konveyor/oadp-vmfr-access-sshd:latest
1293+
- name: RELATED_IMAGE_VM_FILE_RESTORE_BROWSER
1294+
value: quay.io/konveyor/oadp-vmfr-access-filebrowser:latest
11381295
image: quay.io/konveyor/oadp-operator:latest
11391296
imagePullPolicy: Always
11401297
livenessProbe:
@@ -1297,4 +1454,12 @@ spec:
12971454
name: mustgather
12981455
- image: quay.io/konveyor/oadp-non-admin:latest
12991456
name: non-admin-controller
1457+
- image: quay.io/konveyor/oadp-vm-file-restore:latest
1458+
name: vm-file-restore-controller
1459+
- image: quay.io/konveyor/oadp-vmfr-access:latest
1460+
name: vm-file-restore-access
1461+
- image: quay.io/konveyor/oadp-vmfr-access-sshd:latest
1462+
name: vm-file-restore-ssh
1463+
- image: quay.io/konveyor/oadp-vmfr-access-filebrowser:latest
1464+
name: vm-file-restore-browser
13001465
version: 99.0.0

bundle/manifests/oadp.openshift.io_dataprotectionapplications.yaml

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2669,9 +2669,81 @@ spec:
26692669
- kubevirtPluginImageFqin
26702670
- hypershiftPluginImageFqin
26712671
- nonAdminControllerImageFqin
2672+
- vmFileRestoreControllerImageFqin
2673+
- vmFileRestoreAccessImageFqin
2674+
- vmFileRestoreSSHImageFqin
2675+
- vmFileRestoreBrowserImageFqin
26722676
- operator-type
26732677
- tech-preview-ack
26742678
type: object
2679+
vmFileRestore:
2680+
description: vmFileRestore defines the configuration for the DPA to enable VM file restore feature
2681+
properties:
2682+
enable:
2683+
description: |-
2684+
Enable flag to deploy VM file restore controller
2685+
By default is disabled
2686+
type: boolean
2687+
resources:
2688+
description: Resource requirements for the VM file restore controller
2689+
properties:
2690+
claims:
2691+
description: |-
2692+
Claims lists the names of resources, defined in spec.resourceClaims,
2693+
that are used by this container.
2694+
2695+
This is an alpha field and requires enabling the
2696+
DynamicResourceAllocation feature gate.
2697+
2698+
This field is immutable. It can only be set for containers.
2699+
items:
2700+
description: ResourceClaim references one entry in PodSpec.ResourceClaims.
2701+
properties:
2702+
name:
2703+
description: |-
2704+
Name must match the name of one entry in pod.spec.resourceClaims of
2705+
the Pod where this field is used. It makes that resource available
2706+
inside a container.
2707+
type: string
2708+
request:
2709+
description: |-
2710+
Request is the name chosen for a request in the referenced claim.
2711+
If empty, everything from the claim is made available, otherwise
2712+
only the result of this request.
2713+
type: string
2714+
required:
2715+
- name
2716+
type: object
2717+
type: array
2718+
x-kubernetes-list-map-keys:
2719+
- name
2720+
x-kubernetes-list-type: map
2721+
limits:
2722+
additionalProperties:
2723+
anyOf:
2724+
- type: integer
2725+
- type: string
2726+
pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$
2727+
x-kubernetes-int-or-string: true
2728+
description: |-
2729+
Limits describes the maximum amount of compute resources allowed.
2730+
More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/
2731+
type: object
2732+
requests:
2733+
additionalProperties:
2734+
anyOf:
2735+
- type: integer
2736+
- type: string
2737+
pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$
2738+
x-kubernetes-int-or-string: true
2739+
description: |-
2740+
Requests describes the minimum amount of compute resources required.
2741+
If Requests is omitted for a container, it defaults to Limits if that is explicitly specified,
2742+
otherwise to an implementation-defined value. Requests cannot exceed Limits.
2743+
More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/
2744+
type: object
2745+
type: object
2746+
type: object
26752747
required:
26762748
- configuration
26772749
type: object

0 commit comments

Comments
 (0)