Skip to content

Commit 9bc7bbc

Browse files
author
Per Goncalves da Silva
committed
Add ClusterExtensionRevisionAPI
Signed-off-by: Per Goncalves da Silva <[email protected]>
1 parent c517690 commit 9bc7bbc

File tree

2 files changed

+289
-0
lines changed

2 files changed

+289
-0
lines changed
Lines changed: 123 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,123 @@
1+
/*
2+
Copyright 2024.
3+
4+
Licensed under the Apache License, Version 2.0 (the "License");
5+
you may not use this file except in compliance with the License.
6+
You may obtain a copy of the License at
7+
8+
http://www.apache.org/licenses/LICENSE-2.0
9+
10+
Unless required by applicable law or agreed to in writing, software
11+
distributed under the License is distributed on an "AS IS" BASIS,
12+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
See the License for the specific language governing permissions and
14+
limitations under the License.
15+
*/
16+
17+
package v1
18+
19+
import (
20+
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
21+
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
22+
"k8s.io/apimachinery/pkg/types"
23+
)
24+
25+
const ClusterExtensionRevisionKind = "ClusterExtensionRevision"
26+
27+
// ClusterExtensionRevisionSpec defines the desired state of ClusterExtensionRevision.
28+
type ClusterExtensionRevisionSpec struct {
29+
// Specifies the lifecycle state of the ClusterExtensionRevision.
30+
// +kubebuilder:default="Active"
31+
// +kubebuilder:validation:Enum=Active;Paused;Archived
32+
// +kubebuilder:validation:XValidation:rule="oldSelf == 'Active' || oldSelf == 'Paused' || oldSelf == 'Archived' && oldSelf == self", message="can not un-archive"
33+
LifecycleState ClusterExtensionRevisionLifecycleState `json:"lifecycleState,omitempty"`
34+
// +kubebuilder:validation:Required
35+
// +kubebuilder:validation:XValidation:rule="self == oldSelf", message="revision is immutable"
36+
Revision int64 `json:"revision"`
37+
// +kubebuilder:validation:Required
38+
// +kubebuilder:validation:XValidation:rule="self == oldSelf || oldSelf.size() == 0", message="phases is immutable"
39+
Phases []ClusterExtensionRevisionPhase `json:"phases"`
40+
// +kubebuilder:validation:XValidation:rule="self == oldSelf", message="previous is immutable"
41+
Previous []ClusterExtensionRevisionPrevious `json:"previous,omitempty"`
42+
}
43+
44+
// ClusterExtensionRevisionLifecycleState specifies the lifecycle state of the ClusterExtensionRevision.
45+
type ClusterExtensionRevisionLifecycleState string
46+
47+
const (
48+
// ClusterExtensionRevisionLifecycleStateActive / "Active" is the default lifecycle state.
49+
ClusterExtensionRevisionLifecycleStateActive ClusterExtensionRevisionLifecycleState = "Active"
50+
// ClusterExtensionRevisionLifecycleStatePaused / "Paused" disables reconciliation of the ClusterExtensionRevision.
51+
// Only Status updates will still propagated, but object changes will not be reconciled.
52+
ClusterExtensionRevisionLifecycleStatePaused ClusterExtensionRevisionLifecycleState = "Paused"
53+
// ClusterExtensionRevisionLifecycleStateArchived / "Archived" disables reconciliation while also "scaling to zero",
54+
// which deletes all objects that are not excluded via the pausedFor property and
55+
// removes itself from the owner list of all other objects previously under management.
56+
ClusterExtensionRevisionLifecycleStateArchived ClusterExtensionRevisionLifecycleState = "Archived"
57+
)
58+
59+
type ClusterExtensionRevisionPhase struct {
60+
Name string `json:"name"`
61+
Objects []ClusterExtensionRevisionObject `json:"objects"`
62+
Slices []string `json:"slices,omitempty"`
63+
}
64+
65+
type ClusterExtensionRevisionObject struct {
66+
// +kubebuilder:validation:EmbeddedResource
67+
// +kubebuilder:pruning:PreserveUnknownFields
68+
Object unstructured.Unstructured `json:"object"`
69+
}
70+
71+
type ClusterExtensionRevisionPrevious struct {
72+
// +kubebuilder:validation:Required
73+
Name string `json:"name"`
74+
// +kubebuilder:validation:Required
75+
UID types.UID `json:"uid"`
76+
}
77+
78+
// ClusterExtensionRevisionStatus defines the observed state of a ClusterExtensionRevision.
79+
type ClusterExtensionRevisionStatus struct {
80+
// +patchMergeKey=type
81+
// +patchStrategy=merge
82+
// +listType=map
83+
// +listMapKey=type
84+
// +optional
85+
Conditions []metav1.Condition `json:"conditions,omitempty" patchStrategy:"merge" patchMergeKey:"type" protobuf:"bytes,1,rep,name=conditions"`
86+
}
87+
88+
// +kubebuilder:object:root=true
89+
// +kubebuilder:resource:scope=Cluster
90+
// +kubebuilder:subresource:status
91+
92+
// ClusterExtensionRevision is the Schema for the clusterextensionrevisions API
93+
type ClusterExtensionRevision struct {
94+
metav1.TypeMeta `json:",inline"`
95+
metav1.ObjectMeta `json:"metadata,omitempty"`
96+
97+
// spec is an optional field that defines the desired state of the ClusterExtension.
98+
// +optional
99+
Spec ClusterExtensionRevisionSpec `json:"spec,omitempty"`
100+
101+
// status is an optional field that defines the observed state of the ClusterExtension.
102+
// +optional
103+
Status ClusterExtensionRevisionStatus `json:"status,omitempty"`
104+
}
105+
106+
// +kubebuilder:object:root=true
107+
108+
// ClusterExtensionRevisionList contains a list of ClusterExtensionRevision
109+
type ClusterExtensionRevisionList struct {
110+
metav1.TypeMeta `json:",inline"`
111+
112+
// +optional
113+
metav1.ListMeta `json:"metadata,omitempty"`
114+
115+
// items is a required list of ClusterExtensionRevision objects.
116+
//
117+
// +kubebuilder:validation:Required
118+
Items []ClusterExtensionRevision `json:"items"`
119+
}
120+
121+
func init() {
122+
SchemeBuilder.Register(&ClusterExtensionRevision{}, &ClusterExtensionRevisionList{})
123+
}

api/v1/zz_generated.deepcopy.go

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

0 commit comments

Comments
 (0)