Skip to content

Commit 049812e

Browse files
authored
use lifecycle label manager to support dynamic label management (#79)
1 parent 905d851 commit 049812e

12 files changed

Lines changed: 231 additions & 203 deletions

File tree

xset/api/opslifecycle_types.go

Lines changed: 34 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,40 @@ import (
2020
"sigs.k8s.io/controller-runtime/pkg/client"
2121
)
2222

23+
type OperationLabelEnum int
24+
25+
const (
26+
// OperatingLabelPrefix indicates a target is under operation
27+
// set by xset controller
28+
OperatingLabelPrefix OperationLabelEnum = iota
29+
30+
// OperationTypeLabelPrefix indicates the type of operation
31+
// set by xset controller
32+
OperationTypeLabelPrefix
33+
34+
// OperateLabelPrefix indicates a target could start operation
35+
// set by related opsLifecycle controller.
36+
// xset controller will start operation only after this label is set
37+
OperateLabelPrefix
38+
39+
// UndoOperationTypeLabelPrefix indicates a type of operation has been canceled.
40+
// need to be handled by related opsLifecycle controller
41+
UndoOperationTypeLabelPrefix
42+
43+
// ServiceAvailableLabel indicates a target is available for service.
44+
// set by related opsLifecycle controller.
45+
ServiceAvailableLabel
46+
47+
// PreparingDeleteLabel indicates a target is preparing to be deleted.
48+
// set by xset controller,
49+
// handle by related opsLifecycle controller if needed.
50+
PreparingDeleteLabel
51+
)
52+
53+
type LifeCycleLabelManager interface {
54+
Get(labelType OperationLabelEnum) string
55+
}
56+
2357
type OperationType string
2458

2559
var (
@@ -28,8 +62,6 @@ var (
2862
OpsLifecycleTypeDelete OperationType = "delete"
2963
)
3064

31-
type UpdateFunc func(object client.Object) (bool, error)
32-
3365
// LifecycleAdapter helps CRD Operators to easily access TargetOpsLifecycle
3466
type LifecycleAdapter interface {
3567
// GetID indicates ID of one TargetOpsLifecycle

xset/api/xset_controller_types.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ type XSetController interface {
3939
GetXSetStatus(object XSetObject) *XSetStatus
4040
SetXSetStatus(object XSetObject, status *XSetStatus)
4141

42+
GetLifeCycleLabelManager() LifeCycleLabelManager
4243
GetScaleInOpsLifecycleAdapter() LifecycleAdapter
4344
GetUpdateOpsLifecycleAdapter() LifecycleAdapter
4445

xset/opslifecycle/const.go

Lines changed: 0 additions & 76 deletions
This file was deleted.
Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,9 @@ import (
2424

2525
var _ api.LifecycleAdapter = &DefaultUpdateLifecycleAdapter{}
2626

27-
type DefaultUpdateLifecycleAdapter struct{}
27+
type DefaultUpdateLifecycleAdapter struct {
28+
LabelManager api.LifeCycleLabelManager
29+
}
2830

2931
func (d *DefaultUpdateLifecycleAdapter) GetID() string {
3032
return "xset"
@@ -39,7 +41,7 @@ func (d *DefaultUpdateLifecycleAdapter) AllowMultiType() bool {
3941
}
4042

4143
func (d *DefaultUpdateLifecycleAdapter) WhenBegin(target client.Object) (bool, error) {
42-
setOperate(d, target)
44+
setOperate(d.LabelManager, d, target)
4345
return true, nil
4446
}
4547

@@ -49,7 +51,9 @@ func (d *DefaultUpdateLifecycleAdapter) WhenFinish(target client.Object) (bool,
4951

5052
var _ api.LifecycleAdapter = &DefaultScaleInLifecycleAdapter{}
5153

52-
type DefaultScaleInLifecycleAdapter struct{}
54+
type DefaultScaleInLifecycleAdapter struct {
55+
LabelManager api.LifeCycleLabelManager
56+
}
5357

5458
func (d *DefaultScaleInLifecycleAdapter) GetID() string {
5559
return "xset"
@@ -64,7 +68,7 @@ func (d *DefaultScaleInLifecycleAdapter) AllowMultiType() bool {
6468
}
6569

6670
func (d *DefaultScaleInLifecycleAdapter) WhenBegin(target client.Object) (bool, error) {
67-
setOperate(d, target)
71+
setOperate(d.LabelManager, d, target)
6872
return true, nil
6973
}
7074

xset/opslifecycle/label_manager.go

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
/*
2+
* Copyright 2024 - 2025 KusionStack Authors.
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 opslifecycle
18+
19+
import (
20+
"kusionstack.io/kube-utils/xset/api"
21+
)
22+
23+
// OpsLifecycle default labels
24+
var (
25+
defaultOperatingLabelPrefix = "operating.opslifecycle.kusionstack.io"
26+
defaultOperationTypeLabelPrefix = "operation-type.opslifecycle.kusionstack.io"
27+
defaultOperateLabelPrefix = "operate.opslifecycle.kusionstack.io"
28+
defaultUndoOperationTypeLabelPrefix = "undo-operation-type.opslifecycle.kusionstack.io"
29+
defaultServiceAvailableLabel = "opslifecycle.kusionstack.io/service-available"
30+
defaultPreparingDeleteLabel = "opslifecycle.kusionstack.io/preparing-to-delete"
31+
)
32+
33+
var defaultLables = map[api.OperationLabelEnum]string{
34+
api.OperatingLabelPrefix: defaultOperatingLabelPrefix,
35+
api.OperationTypeLabelPrefix: defaultOperationTypeLabelPrefix,
36+
api.OperateLabelPrefix: defaultOperateLabelPrefix,
37+
api.UndoOperationTypeLabelPrefix: defaultUndoOperationTypeLabelPrefix,
38+
api.ServiceAvailableLabel: defaultServiceAvailableLabel,
39+
api.PreparingDeleteLabel: defaultPreparingDeleteLabel,
40+
}
41+
42+
type LabelManagerImpl struct {
43+
labels map[api.OperationLabelEnum]string
44+
wellKnownLabelPrefixesWithID []string
45+
}
46+
47+
func NewLabelManager(overwrite map[api.OperationLabelEnum]string) api.LifeCycleLabelManager {
48+
labelKeys := make(map[api.OperationLabelEnum]string)
49+
for k, v := range defaultLables {
50+
labelKeys[k] = v
51+
}
52+
if len(overwrite) > 0 {
53+
for k, v := range overwrite {
54+
labelKeys[k] = v
55+
}
56+
}
57+
58+
wellKnownLabelPrefilxesWithID := []string{
59+
labelKeys[api.OperatingLabelPrefix],
60+
labelKeys[api.OperationTypeLabelPrefix],
61+
labelKeys[api.UndoOperationTypeLabelPrefix],
62+
labelKeys[api.OperatingLabelPrefix],
63+
}
64+
return &LabelManagerImpl{
65+
labels: labelKeys,
66+
wellKnownLabelPrefixesWithID: wellKnownLabelPrefilxesWithID,
67+
}
68+
}
69+
70+
func (m *LabelManagerImpl) Get(labelType api.OperationLabelEnum) string {
71+
return m.labels[labelType]
72+
}

0 commit comments

Comments
 (0)