Skip to content

Commit e61fad0

Browse files
refactor: update logic to kuperator v0.6.3 (#84)
* add xset label manager * sync kuperator code * sync kuperator code2 * fix1 * refactor default lifrcycle id * add todo * refactor scale and update order * fix decideTargetToUpdate * fix replace UpgradeTarget * fix FinishUpdateTarget * fix FinishUpdateTarget * add template patcher * add ops priority * fix service available * refactor order of update and scale * fix compare target * fix label set
1 parent e092364 commit e61fad0

17 files changed

+719
-411
lines changed

xset/api/resourcecontext_types.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,8 @@ const (
4545
EnumJustCreateContextDataKey
4646
EnumRecreateUpdateContextDataKey
4747
EnumScaleInContextDataKey
48+
EnumReplaceNewTargetIDContextDataKey
49+
EnumReplaceOriginTargetIDContextDataKey
4850
)
4951

5052
// ResourceContextSpec defines the desired state of ResourceContext

xset/api/xset_controller_types.go

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@
1717
package api
1818

1919
import (
20+
"context"
21+
2022
appsv1 "k8s.io/api/apps/v1"
2123
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
2224
"sigs.k8s.io/controller-runtime/pkg/client"
@@ -35,18 +37,23 @@ type XSetController interface {
3537

3638
GetXSetSpec(object XSetObject) *XSetSpec
3739
GetXSetPatch(object metav1.Object) ([]byte, error)
38-
UpdateScaleStrategy(object XSetObject, scaleStrategy *ScaleStrategy) (err error)
40+
GetXSetTemplatePatcher(object metav1.Object) func(client.Object) error
3941
GetXSetStatus(object XSetObject) *XSetStatus
4042
SetXSetStatus(object XSetObject, status *XSetStatus)
43+
GetReadyTime(object client.Object) *metav1.Time
4144

4245
GetLifeCycleLabelManager() LifeCycleLabelManager
46+
GetXSetControllerLabelManager() XSetLabelManager
4347
GetScaleInOpsLifecycleAdapter() LifecycleAdapter
4448
GetUpdateOpsLifecycleAdapter() LifecycleAdapter
4549
GetResourceContextAdapter() ResourceContextAdapter
4650

4751
CheckScheduled(object client.Object) bool
4852
CheckReady(object client.Object) bool
4953
CheckAvailable(object client.Object) bool
54+
55+
UpdateScaleStrategy(ctx context.Context, c client.Client, object XSetObject, scaleStrategy *ScaleStrategy) error
56+
GetXOpsPriority(ctx context.Context, c client.Client, object client.Object) (*OpsPriority, error)
5057
}
5158

5259
type XSetObject client.Object

xset/api/xset_types.go

Lines changed: 47 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ package api
2020

2121
import (
2222
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
23+
"sigs.k8s.io/controller-runtime/pkg/client"
2324
)
2425

2526
type XSetConditionType string
@@ -188,11 +189,56 @@ type XSetStatus struct {
188189
AvailableReplicas int32 `json:"availableReplicas,omitempty"`
189190

190191
// UpdatedAvailableReplicas indicates the number of available updated revision replicas for this replicas set.
191-
// A model is updated available means the model is ready for updated revision and accessible
192+
// A target is updated available means the target is ready for updated revision and accessible
192193
// +optional
193194
UpdatedAvailableReplicas int32 `json:"updatedAvailableReplicas,omitempty"`
194195

195196
// Represents the latest available observations of a XSet's current state.
196197
// +optional
197198
Conditions []metav1.Condition `json:"conditions,omitempty"`
198199
}
200+
201+
// OpsPriority is used to store the ops priority of a target
202+
type OpsPriority struct {
203+
// PriorityClass is the priority class of the target
204+
PriorityClass int32
205+
// DeletionCost is the deletion cost of the target
206+
DeletionCost int32
207+
}
208+
209+
type XSetControllerLabelEnum int
210+
211+
const (
212+
EnumXSetControlledLabel XSetControllerLabelEnum = iota
213+
214+
EnumXSetInstanceIdLabel
215+
216+
EnumXSetUpdateIndicationLabel
217+
218+
EnumXSetDeletionIndicationLabel
219+
220+
EnumXSetReplaceIndicationLabel
221+
222+
EnumXSetReplacePairNewIdLabel
223+
224+
EnumXSetReplacePairOriginNameLabel
225+
226+
EnumXSetReplaceByReplaceUpdateLabel
227+
228+
EnumXSetOrphanedLabel
229+
230+
EnumXSetTargetCreatingLabel
231+
232+
EnumXSetTargetCompletingLabel
233+
234+
EnumXSetTargetExcludeIndicationLabel
235+
236+
EnumXSetLastTargetStatusAnnotationKey
237+
)
238+
239+
type XSetLabelManager interface {
240+
Get(labels map[string]string, labelType XSetControllerLabelEnum) (string, bool)
241+
Set(obj client.Object, labelType XSetControllerLabelEnum, value string)
242+
Delete(labels map[string]string, labelType XSetControllerLabelEnum)
243+
Label(labelType XSetControllerLabelEnum) string
244+
}

xset/opslifecycle/default_adapters.go

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,9 @@
1717
package opslifecycle
1818

1919
import (
20+
"strings"
21+
22+
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
2023
"sigs.k8s.io/controller-runtime/pkg/client"
2124

2225
"kusionstack.io/kube-utils/xset/api"
@@ -26,10 +29,11 @@ var _ api.LifecycleAdapter = &DefaultUpdateLifecycleAdapter{}
2629

2730
type DefaultUpdateLifecycleAdapter struct {
2831
LabelManager api.LifeCycleLabelManager
32+
XSetType metav1.TypeMeta
2933
}
3034

3135
func (d *DefaultUpdateLifecycleAdapter) GetID() string {
32-
return "xset"
36+
return strings.ToLower(d.XSetType.Kind)
3337
}
3438

3539
func (d *DefaultUpdateLifecycleAdapter) GetType() api.OperationType {
@@ -40,23 +44,24 @@ func (d *DefaultUpdateLifecycleAdapter) AllowMultiType() bool {
4044
return true
4145
}
4246

43-
func (d *DefaultUpdateLifecycleAdapter) WhenBegin(target client.Object) (bool, error) {
44-
setOperate(d.LabelManager, d, target)
47+
func (d *DefaultUpdateLifecycleAdapter) WhenBegin(_ client.Object) (bool, error) {
4548
return true, nil
4649
}
4750

4851
func (d *DefaultUpdateLifecycleAdapter) WhenFinish(target client.Object) (bool, error) {
52+
// TODO inplace update post actions
4953
return false, nil
5054
}
5155

5256
var _ api.LifecycleAdapter = &DefaultScaleInLifecycleAdapter{}
5357

5458
type DefaultScaleInLifecycleAdapter struct {
5559
LabelManager api.LifeCycleLabelManager
60+
XSetType metav1.TypeMeta
5661
}
5762

5863
func (d *DefaultScaleInLifecycleAdapter) GetID() string {
59-
return "xset"
64+
return strings.ToLower(d.XSetType.Kind)
6065
}
6166

6267
func (d *DefaultScaleInLifecycleAdapter) GetType() api.OperationType {
@@ -68,10 +73,9 @@ func (d *DefaultScaleInLifecycleAdapter) AllowMultiType() bool {
6873
}
6974

7075
func (d *DefaultScaleInLifecycleAdapter) WhenBegin(target client.Object) (bool, error) {
71-
setOperate(d.LabelManager, d, target)
72-
return true, nil
76+
return WhenBeginDelete(d.LabelManager, target)
7377
}
7478

75-
func (d *DefaultScaleInLifecycleAdapter) WhenFinish(target client.Object) (bool, error) {
79+
func (d *DefaultScaleInLifecycleAdapter) WhenFinish(_ client.Object) (bool, error) {
7680
return false, nil
7781
}

xset/opslifecycle/utils.go

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -31,12 +31,7 @@ import (
3131

3232
type UpdateFunc func(object client.Object) (bool, error)
3333

34-
func IsServiceAvailable(m api.LifeCycleLabelManager, target client.Object) bool {
35-
_, exists := target.GetLabels()[m.Get(api.ServiceAvailableLabel)]
36-
return exists
37-
}
38-
39-
// IDToLabelsMap returns a map of pod id to labels map and a map of operation type to number of pods.
34+
// IDToLabelsMap returns a map of target id to labels map and a map of operation type to number of targets.
4035
func IDToLabelsMap(m *LabelManagerImpl, target client.Object) (map[string]map[string]string, map[string]int, error) {
4136
idToLabelsMap := map[string]map[string]string{}
4237
typeToNumsMap := map[string]int{}
@@ -77,7 +72,7 @@ func IDToLabelsMap(m *LabelManagerImpl, target client.Object) (map[string]map[st
7772
return idToLabelsMap, typeToNumsMap, nil
7873
}
7974

80-
// NumOfLifecycleOnTarget returns the nums of lifecycles on pod
75+
// NumOfLifecycleOnTarget returns the nums of lifecycles on target
8176
func NumOfLifecycleOnTarget(m *LabelManagerImpl, target client.Object) (int, error) {
8277
if target == nil {
8378
return 0, nil
@@ -310,6 +305,21 @@ func IsLifecycleOnTarget(m api.LifeCycleLabelManager, operatingID string, target
310305
return false, nil
311306
}
312307

308+
func CancelOpsLifecycle(m api.LifeCycleLabelManager, client client.Client, adapter api.LifecycleAdapter, target client.Object) error {
309+
if target == nil {
310+
return nil
311+
}
312+
313+
// only cancel when lifecycle exist on target
314+
if exist, err := IsLifecycleOnTarget(m, adapter.GetID(), target); err != nil {
315+
return fmt.Errorf("fail to check %s TargetOpsLifecycle on Target %s/%s: %w", adapter.GetID(), target.GetNamespace(), target.GetName(), err)
316+
} else if !exist {
317+
return nil
318+
}
319+
320+
return Undo(m, client, adapter, target)
321+
}
322+
313323
func DefaultUpdateAll(target client.Object, updateFuncs ...UpdateFunc) (updated bool, err error) {
314324
for _, updateFunc := range updateFuncs {
315325
ok, updateErr := updateFunc(target)

xset/resourcecontexts/default_adapters.go

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -26,12 +26,14 @@ import (
2626
var _ api.ResourceContextAdapter = &DefaultResourceContextAdapter{}
2727

2828
var defaultResourceContextKeys = map[api.ResourceContextKeyEnum]string{
29-
api.EnumOwnerContextKey: "Owner",
30-
api.EnumRevisionContextDataKey: "Revision",
31-
api.EnumTargetDecorationRevisionKey: "TargetDecorationRevisions",
32-
api.EnumJustCreateContextDataKey: "TargetJustCreate",
33-
api.EnumRecreateUpdateContextDataKey: "TargetRecreateUpdate",
34-
api.EnumScaleInContextDataKey: "ScaleIn",
29+
api.EnumOwnerContextKey: "Owner",
30+
api.EnumRevisionContextDataKey: "Revision",
31+
api.EnumTargetDecorationRevisionKey: "TargetDecorationRevisions",
32+
api.EnumJustCreateContextDataKey: "TargetJustCreate",
33+
api.EnumRecreateUpdateContextDataKey: "TargetRecreateUpdate",
34+
api.EnumScaleInContextDataKey: "ScaleIn",
35+
api.EnumReplaceNewTargetIDContextDataKey: "ReplaceNewTargetID",
36+
api.EnumReplaceOriginTargetIDContextDataKey: "ReplaceOriginTargetID",
3537
}
3638

3739
// DefaultResourceContextAdapter is the adapter to api apps.kusionstack.io.resourcecontexts

xset/synccontrols/const.go

Lines changed: 0 additions & 48 deletions
This file was deleted.

xset/synccontrols/inexclude.go

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -20,16 +20,17 @@ import (
2020
"fmt"
2121

2222
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
23-
appsv1alpha1 "kusionstack.io/kube-api/apps/v1alpha1"
23+
24+
"kusionstack.io/kube-utils/xset/api"
2425
)
2526

2627
// AllowResourceExclude checks if pod or pvc is allowed to exclude
27-
func AllowResourceExclude(obj metav1.Object, ownerName, ownerKind string) (bool, string) {
28+
func AllowResourceExclude(obj metav1.Object, ownerName, ownerKind string, manager api.XSetLabelManager) (bool, string) {
2829
labels := obj.GetLabels()
2930
// not controlled by ks manager
3031
if labels == nil {
3132
return false, "object's label is empty"
32-
} else if val, exist := labels[appsv1alpha1.ControlledByKusionStackLabelKey]; !exist || val != "true" {
33+
} else if val, exist := manager.Get(labels, api.EnumXSetControlledLabel); !exist || val != "true" {
3334
return false, "object is not controlled by kusionstack system"
3435
}
3536

@@ -41,14 +42,14 @@ func AllowResourceExclude(obj metav1.Object, ownerName, ownerKind string) (bool,
4142
}
4243

4344
// AllowResourceInclude checks if pod or pvc is allowed to include
44-
func AllowResourceInclude(obj metav1.Object, ownerName, ownerKind string) (bool, string) {
45+
func AllowResourceInclude(obj metav1.Object, ownerName, ownerKind string, manager api.XSetLabelManager) (bool, string) {
4546
labels := obj.GetLabels()
4647
ownerRefs := obj.GetOwnerReferences()
4748

4849
// not controlled by ks manager
4950
if labels == nil {
5051
return false, "object's label is empty"
51-
} else if val, exist := labels[appsv1alpha1.ControlledByKusionStackLabelKey]; !exist || val != "true" {
52+
} else if val, exist := manager.Get(labels, api.EnumXSetControlledLabel); !exist || val != "true" {
5253
return false, "object is not controlled by kusionstack system"
5354
}
5455

xset/synccontrols/inexclude_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,7 @@ func TestAllowResourceExclude(t *testing.T) {
128128
}
129129
for _, tt := range tests {
130130
t.Run(tt.name, func(t *testing.T) {
131-
got, got1 := AllowResourceExclude(tt.obj, ownerName, ownerKind)
131+
got, got1 := AllowResourceExclude(tt.obj, ownerName, ownerKind, NewXSetControllerLabelManager())
132132
if got != tt.allow {
133133
t.Errorf("AllowResourceExclude() got = %v, want %v", got, tt.allow)
134134
}
@@ -288,7 +288,7 @@ func TestAllowResourceInclude(t *testing.T) {
288288
}
289289
for _, tt := range tests {
290290
t.Run(tt.name, func(t *testing.T) {
291-
got, got1 := AllowResourceInclude(tt.obj, ownerName, ownerKind)
291+
got, got1 := AllowResourceInclude(tt.obj, ownerName, ownerKind, NewXSetControllerLabelManager())
292292
if got != tt.allow {
293293
t.Errorf("AllowResourceExclude() got = %v, want %v", got, tt.allow)
294294
}

0 commit comments

Comments
 (0)