Skip to content

Commit 3515262

Browse files
Add tech preview features struct to DPA CRD, add enableDataMover flag to DPA features , data-mover controller deployment and data-mover csi plugin (#727)
* add datamover controller deployment * revert to org images in csv * add enableDataMover boolean flag on DPA CR * update csi plugin image based on dm flag and add unsupported overrides for dm controller * add labels to DM deployment and unit tests * make users specifically specify enabledataMover as true for DM functionality * revert default dpa sample file * update DPA API and run make bundle * address feedback and add events perms * add CRDs - VolumeSnapshotBackup and VolumeSnapshotRestore
1 parent eff08b1 commit 3515262

16 files changed

+1182
-8
lines changed

api/v1alpha1/oadp_types.go

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ const ReconcileCompleteMessage = "Reconcile complete"
3030

3131
const OadpOperatorLabel = "openshift.io/oadp"
3232
const RegistryDeploymentLabel = "openshift.io/oadp-registry"
33+
const DataMoverDeploymentLabel = "openshift.io/oadp-data-mover"
3334

3435
type DefaultPlugin string
3536

@@ -53,6 +54,7 @@ const OpenShiftPluginImageKey UnsupportedImageKey = "openshiftPluginImageFqin"
5354
const AzurePluginImageKey UnsupportedImageKey = "azurePluginImageFqin"
5455
const GCPPluginImageKey UnsupportedImageKey = "gcpPluginImageFqin"
5556
const CSIPluginImageKey UnsupportedImageKey = "csiPluginImageFqin"
57+
const DataMoverImageKey UnsupportedImageKey = "dataMoverImageFqin"
5658
const ResticRestoreImageKey UnsupportedImageKey = "resticRestoreImageFqin"
5759
const RegistryImageKey UnsupportedImageKey = "registryImageFqin"
5860
const KubeVirtPluginImageKey UnsupportedImageKey = "kubevirtPluginImageFqin"
@@ -158,6 +160,13 @@ type SnapshotLocation struct {
158160
Velero *velero.VolumeSnapshotLocationSpec `json:"velero"`
159161
}
160162

163+
// Features defines the configuration for the DPA to enable the tech preview features
164+
type Features struct {
165+
// EnableDataMover is used to specify whether you want to deploy the volume snapshot mover controller and a modified csi datamover plugin
166+
// +optional
167+
EnableDataMover bool `json:"enableDataMover,omitempty"`
168+
}
169+
161170
// DataProtectionApplicationSpec defines the desired state of Velero
162171
type DataProtectionApplicationSpec struct {
163172
// BackupLocations defines the list of desired configuration to use for BackupStorageLocations
@@ -184,9 +193,11 @@ type DataProtectionApplicationSpec struct {
184193
// BackupImages is used to specify whether you want to deploy a registry for enabling backup and restore of images
185194
// +optional
186195
BackupImages *bool `json:"backupImages,omitempty"`
187-
188196
// Configuration is used to configure the data protection application's server config
189197
Configuration *ApplicationConfig `json:"configuration"`
198+
// Features defines the configuration for the DPA to enable the OADP tech preview features
199+
// +optional
200+
Features *Features `json:"features"`
190201
}
191202

192203
// DataProtectionApplicationStatus defines the observed state of DataProtectionApplication

api/v1alpha1/zz_generated.deepcopy.go

Lines changed: 20 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 205 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,205 @@
1+
apiVersion: apiextensions.k8s.io/v1
2+
kind: CustomResourceDefinition
3+
metadata:
4+
annotations:
5+
controller-gen.kubebuilder.io/version: v0.8.0
6+
creationTimestamp: null
7+
name: volumesnapshotbackups.datamover.oadp.openshift.io
8+
spec:
9+
group: datamover.oadp.openshift.io
10+
names:
11+
kind: VolumeSnapshotBackup
12+
listKind: VolumeSnapshotBackupList
13+
plural: volumesnapshotbackups
14+
shortNames:
15+
- vsb
16+
singular: volumesnapshotbackup
17+
scope: Namespaced
18+
versions:
19+
- name: v1alpha1
20+
schema:
21+
openAPIV3Schema:
22+
description: VolumeSnapshotBackup is the Schema for the volumesnapshotbackups
23+
API
24+
properties:
25+
apiVersion:
26+
description: 'APIVersion defines the versioned schema of this representation
27+
of an object. Servers should convert recognized schemas to the latest
28+
internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources'
29+
type: string
30+
kind:
31+
description: 'Kind is a string value representing the REST resource this
32+
object represents. Servers may infer this from the endpoint the client
33+
submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds'
34+
type: string
35+
metadata:
36+
type: object
37+
spec:
38+
description: VolumeSnapshotBackupSpec defines the desired state of VolumeSnapshotBackup
39+
properties:
40+
protectedNamespace:
41+
description: Namespace where the Velero deployment is present
42+
type: string
43+
volumeSnapshotContent:
44+
description: 'ObjectReference contains enough information to let you
45+
inspect or modify the referred object. --- New uses of this type
46+
are discouraged because of difficulty describing its usage when
47+
embedded in APIs. 1. Ignored fields. It includes many fields which
48+
are not generally honored. For instance, ResourceVersion and FieldPath
49+
are both very rarely valid in actual usage. 2. Invalid usage help. It
50+
is impossible to add specific help for individual usage. In most
51+
embedded usages, there are particular restrictions like, "must refer
52+
only to types A and B" or "UID not honored" or "name must be restricted".
53+
Those cannot be well described when embedded. 3. Inconsistent validation. Because
54+
the usages are different, the validation rules are different by
55+
usage, which makes it hard for users to predict what will happen.
56+
4. The fields are both imprecise and overly precise. Kind is not
57+
a precise mapping to a URL. This can produce ambiguity during interpretation
58+
and require a REST mapping. In most cases, the dependency is on
59+
the group,resource tuple and the version of the actual struct is
60+
irrelevant. 5. We cannot easily change it. Because this type is
61+
embedded in many locations, updates to this type will affect numerous
62+
schemas. Don''t make new APIs embed an underspecified API type
63+
they do not control. Instead of using this type, create a locally
64+
provided and used type that is well-focused on your reference. For
65+
example, ServiceReferences for admission registration: https://github.com/kubernetes/api/blob/release-1.17/admissionregistration/v1/types.go#L533
66+
.'
67+
properties:
68+
apiVersion:
69+
description: API version of the referent.
70+
type: string
71+
fieldPath:
72+
description: 'If referring to a piece of an object instead of
73+
an entire object, this string should contain a valid JSON/Go
74+
field access statement, such as desiredState.manifest.containers[2].
75+
For example, if the object reference is to a container within
76+
a pod, this would take on a value like: "spec.containers{name}"
77+
(where "name" refers to the name of the container that triggered
78+
the event) or if no container name is specified "spec.containers[2]"
79+
(container with index 2 in this pod). This syntax is chosen
80+
only to have some well-defined way of referencing a part of
81+
an object. TODO: this design is not final and this field is
82+
subject to change in the future.'
83+
type: string
84+
kind:
85+
description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds'
86+
type: string
87+
name:
88+
description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names'
89+
type: string
90+
namespace:
91+
description: 'Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/'
92+
type: string
93+
resourceVersion:
94+
description: 'Specific resourceVersion to which this reference
95+
is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency'
96+
type: string
97+
uid:
98+
description: 'UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids'
99+
type: string
100+
type: object
101+
type: object
102+
status:
103+
description: VolumeSnapshotBackupStatus defines the observed state of
104+
VolumeSnapshotBackup
105+
properties:
106+
completed:
107+
type: boolean
108+
conditions:
109+
description: Include references to the volsync CRs and their state
110+
as they are running
111+
items:
112+
description: "Condition contains details for one aspect of the current
113+
state of this API Resource. --- This struct is intended for direct
114+
use as an array at the field path .status.conditions. For example,
115+
type FooStatus struct{ // Represents the observations of a foo's
116+
current state. // Known .status.conditions.type are: \"Available\",
117+
\"Progressing\", and \"Degraded\" // +patchMergeKey=type // +patchStrategy=merge
118+
// +listType=map // +listMapKey=type Conditions []metav1.Condition
119+
`json:\"conditions,omitempty\" patchStrategy:\"merge\" patchMergeKey:\"type\"
120+
protobuf:\"bytes,1,rep,name=conditions\"` \n // other fields }"
121+
properties:
122+
lastTransitionTime:
123+
description: lastTransitionTime is the last time the condition
124+
transitioned from one status to another. This should be when
125+
the underlying condition changed. If that is not known, then
126+
using the time when the API field changed is acceptable.
127+
format: date-time
128+
type: string
129+
message:
130+
description: message is a human readable message indicating
131+
details about the transition. This may be an empty string.
132+
maxLength: 32768
133+
type: string
134+
observedGeneration:
135+
description: observedGeneration represents the .metadata.generation
136+
that the condition was set based upon. For instance, if .metadata.generation
137+
is currently 12, but the .status.conditions[x].observedGeneration
138+
is 9, the condition is out of date with respect to the current
139+
state of the instance.
140+
format: int64
141+
minimum: 0
142+
type: integer
143+
reason:
144+
description: reason contains a programmatic identifier indicating
145+
the reason for the condition's last transition. Producers
146+
of specific condition types may define expected values and
147+
meanings for this field, and whether the values are considered
148+
a guaranteed API. The value should be a CamelCase string.
149+
This field may not be empty.
150+
maxLength: 1024
151+
minLength: 1
152+
pattern: ^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$
153+
type: string
154+
status:
155+
description: status of the condition, one of True, False, Unknown.
156+
enum:
157+
- "True"
158+
- "False"
159+
- Unknown
160+
type: string
161+
type:
162+
description: type of condition in CamelCase or in foo.example.com/CamelCase.
163+
--- Many .condition.type values are consistent across resources
164+
like Available, but because arbitrary conditions can be useful
165+
(see .node.status.conditions), the ability to deconflict is
166+
important. The regex it matches is (dns1123SubdomainFmt/)?(qualifiedNameFmt)
167+
maxLength: 316
168+
pattern: ^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$
169+
type: string
170+
required:
171+
- lastTransitionTime
172+
- message
173+
- reason
174+
- status
175+
- type
176+
type: object
177+
type: array
178+
phase:
179+
description: volumesnapshot backup phase status
180+
type: string
181+
resticrepository:
182+
description: Includes restic repository path
183+
type: string
184+
sourcePVCData:
185+
description: Includes source PVC name and size
186+
properties:
187+
name:
188+
description: name of the PersistentVolumeClaim
189+
type: string
190+
size:
191+
description: size of the PersistentVolumeClaim
192+
type: string
193+
type: object
194+
type: object
195+
type: object
196+
served: true
197+
storage: true
198+
subresources:
199+
status: {}
200+
status:
201+
acceptedNames:
202+
kind: ""
203+
plural: ""
204+
conditions: []
205+
storedVersions: []

0 commit comments

Comments
 (0)