-
Notifications
You must be signed in to change notification settings - Fork 373
/
types.go
143 lines (113 loc) · 4.26 KB
/
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
// Copyright (c) 2021 Terminus, Inc.
//
// 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 executortypes
import (
"context"
"regexp"
"sync"
"github.com/gorilla/websocket"
"github.com/pkg/errors"
"github.com/sirupsen/logrus"
"github.com/erda-project/erda/apistructs"
"github.com/erda-project/erda/modules/scheduler/events/eventtypes"
"github.com/erda-project/erda/pkg/jsonstore/storetypes"
)
const kindNameFormat = `^[A-Z0-9]+$`
var formater *regexp.Regexp = regexp.MustCompile(kindNameFormat)
// Name represents a executor's name.
type Name string
func (s Name) String() string {
return string(s)
}
func (s Name) Validate() bool {
return formater.MatchString(string(s))
}
// Kind represents a executor's type.
type Kind string
func (s Kind) String() string {
return string(s)
}
func (s Kind) Validate() bool {
return formater.MatchString(string(s))
}
// Create be used to create a executor instance.
type CreateFn func(name Name, clustername string, options map[string]string, moreoptions interface{}) (Executor, error)
// return executor's event channel according to executor's name
type GetEventChanFn func(Name) (chan *eventtypes.StatusEvent, chan struct{}, *sync.Map, error)
type EventCbFn func(k string, v interface{}, t storetypes.ChangeType) error
type NodeLabelSetting struct {
SoldierURL string
}
// Executor defines the all interfaces that must be implemented by a executor instance.
type Executor interface {
Kind() Kind
Name() Name
CleanUpBeforeDelete()
Create(ctx context.Context, spec interface{}) (interface{}, error)
Destroy(ctx context.Context, spec interface{}) error
Status(ctx context.Context, spec interface{}) (apistructs.StatusDesc, error)
Remove(ctx context.Context, spec interface{}) error
Update(ctx context.Context, spec interface{}) (interface{}, error)
Inspect(ctx context.Context, spec interface{}) (interface{}, error)
Cancel(ctx context.Context, spec interface{}) (interface{}, error)
Scale(ctx context.Context, spec interface{}) (interface{}, error)
Precheck(ctx context.Context, spec interface{}) (apistructs.ServiceGroupPrecheckData, error)
// only k8s-job executor supported
JobVolumeCreate(ctx context.Context, spec interface{}) (string, error)
// SetNodeLabels set schedule-labels on nodes
// Only k8s, k8sjob, marathon, metronome executor implement this function
SetNodeLabels(setting NodeLabelSetting, hosts []string, labels map[string]string) error
// executor's capacity
// 1. addonoperator
CapacityInfo() apistructs.CapacityInfoData
ResourceInfo(brief bool) (apistructs.ClusterResourceInfoData, error)
// only k8s executor supported
KillPod(podname string) error
}
type TerminalExecutor interface {
Terminal(namespace, podname, containername string, conn *websocket.Conn)
}
type StopEventsChans struct {
StopWatchEventCh chan struct{}
StopHandleEventCh chan struct{}
}
var Factory = map[Kind]CreateFn{}
var EvFuncMap = map[Name]GetEventChanFn{}
var EvCbMap = map[Name]EventCbFn{}
// Register add a executor's create function.
func Register(kind Kind, create CreateFn) error {
if !kind.Validate() {
return errors.Errorf("invalid kind: %s", kind)
}
if _, ok := Factory[kind]; ok {
return errors.Errorf("duplicate to register executor: %s", kind)
}
Factory[kind] = create
return nil
}
// Get a GetEventChanFn according to an executor's name
func RegisterEvChan(name Name, get GetEventChanFn, cb EventCbFn) error {
logrus.Debugf("in RegisterEvChan going to register executor: %s", name)
if _, ok := EvFuncMap[name]; ok {
return errors.Errorf("duplicate to register executor's event channel: %s", name)
}
EvFuncMap[name] = get
EvCbMap[name] = cb
return nil
}
func UnRegisterEvChan(name Name) {
logrus.Debugf("in UnRegisterEvChan going to unregister executor: %s", name)
delete(EvFuncMap, name)
delete(EvCbMap, name)
}