-
Notifications
You must be signed in to change notification settings - Fork 822
/
work_types.go
175 lines (144 loc) · 6.29 KB
/
work_types.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
/*
Copyright 2020 The Karmada 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.
*/
package v1alpha1
import (
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/runtime"
)
const (
// ResourceKindWork is kind name of Work.
ResourceKindWork = "Work"
// ResourceSingularWork is singular name of Work.
ResourceSingularWork = "work"
// ResourcePluralWork is plural name of Work.
ResourcePluralWork = "works"
// ResourceNamespaceScopedWork indicates if Work is NamespaceScoped.
ResourceNamespaceScopedWork = true
)
// +genclient
// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
// +kubebuilder:subresource:status
// +kubebuilder:resource:path=works,scope=Namespaced,shortName=wk,categories={karmada-io}
// +kubebuilder:printcolumn:JSONPath=`.spec.workload.manifests[*].kind`,name="Workload-Kind",type=string
// +kubebuilder:printcolumn:JSONPath=`.status.conditions[?(@.type=="Applied")].status`,name="Applied",type=string
// +kubebuilder:printcolumn:JSONPath=`.metadata.creationTimestamp`,name="Age",type=date
// Work defines a list of resources to be deployed on the member cluster.
type Work struct {
metav1.TypeMeta `json:",inline"`
metav1.ObjectMeta `json:"metadata,omitempty"`
// Spec represents the desired behavior of Work.
Spec WorkSpec `json:"spec"`
// Status represents the status of PropagationStatus.
// +optional
Status WorkStatus `json:"status,omitempty"`
}
// WorkSpec defines the desired state of Work.
type WorkSpec struct {
// Workload represents the manifest workload to be deployed on managed cluster.
Workload WorkloadTemplate `json:"workload,omitempty"`
}
// WorkloadTemplate represents the manifest workload to be deployed on managed cluster.
type WorkloadTemplate struct {
// Manifests represents a list of Kubernetes resources to be deployed on the managed cluster.
// +optional
Manifests []Manifest `json:"manifests,omitempty"`
}
// Manifest represents a resource to be deployed on managed cluster.
type Manifest struct {
// +kubebuilder:pruning:PreserveUnknownFields
runtime.RawExtension `json:",inline"`
}
// WorkStatus defines the observed state of Work.
type WorkStatus struct {
// Conditions contain the different condition statuses for this work.
// Valid condition types are:
// 1. Applied represents workload in Work is applied successfully on a managed cluster.
// 2. Progressing represents workload in Work is being applied on a managed cluster.
// 3. Available represents workload in Work exists on the managed cluster.
// 4. Degraded represents the current state of workload does not match the desired
// state for a certain period.
// +optional
Conditions []metav1.Condition `json:"conditions,omitempty"`
// ManifestStatuses contains running status of manifests in spec.
// +optional
ManifestStatuses []ManifestStatus `json:"manifestStatuses,omitempty"`
}
// ManifestStatus contains running status of a specific manifest in spec.
type ManifestStatus struct {
// Identifier represents the identity of a resource linking to manifests in spec.
// +required
Identifier ResourceIdentifier `json:"identifier"`
// Status reflects running status of current manifest.
// +kubebuilder:pruning:PreserveUnknownFields
// +optional
Status *runtime.RawExtension `json:"status,omitempty"`
// Health represents the healthy state of the current resource.
// There maybe different rules for different resources to achieve health status.
// +kubebuilder:validation:Enum=Healthy;Unhealthy;Unknown
// +optional
Health ResourceHealth `json:"health,omitempty"`
}
// ResourceIdentifier provides the identifiers needed to interact with any arbitrary object.
type ResourceIdentifier struct {
// Ordinal represents an index in manifests list, so the condition can still be linked
// to a manifest even though manifest cannot be parsed successfully.
Ordinal int `json:"ordinal"`
// Group is the group of the resource.
Group string `json:"group,omitempty"`
// Version is the version of the resource.
Version string `json:"version"`
// Kind is the kind of the resource.
Kind string `json:"kind"`
// Resource is the resource type of the resource
Resource string `json:"resource"`
// Namespace is the namespace of the resource, the resource is cluster scoped if the value
// is empty
Namespace string `json:"namespace,omitempty"`
// Name is the name of the resource
Name string `json:"name"`
}
const (
// WorkApplied represents that the resource defined in Work is
// successfully applied on the managed cluster.
WorkApplied string = "Applied"
// WorkProgressing represents that the resource defined in Work is
// in the progress to be applied on the managed cluster.
WorkProgressing string = "Progressing"
// WorkAvailable represents that all resources of the Work exists on
// the managed cluster.
WorkAvailable string = "Available"
// WorkDegraded represents that the current state of Work does not match
// the desired state for a certain period.
WorkDegraded string = "Degraded"
)
// ResourceHealth represents that the health status of the reference resource.
type ResourceHealth string
const (
// ResourceHealthy represents that the health status of the current resource
// that applied on the managed cluster is healthy.
ResourceHealthy ResourceHealth = "Healthy"
// ResourceUnhealthy represents that the health status of the current resource
// that applied on the managed cluster is unhealthy.
ResourceUnhealthy ResourceHealth = "Unhealthy"
// ResourceUnknown represents that the health status of the current resource
// that applied on the managed cluster is unknown.
ResourceUnknown ResourceHealth = "Unknown"
)
// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
// WorkList is a collection of Work.
type WorkList struct {
metav1.TypeMeta `json:",inline"`
metav1.ListMeta `json:"metadata,omitempty"`
// Items holds a list of Work.
Items []Work `json:"items"`
}