forked from chaosblade-io/chaosblade-operator
/
controller.go
94 lines (84 loc) · 3.29 KB
/
controller.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
/*
* Copyright 1999-2020 Alibaba Group Holding Ltd.
*
* 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 node
import (
"context"
"github.com/lomoonmoonbird/chaosblade-spec-go/spec"
"github.com/sirupsen/logrus"
v1 "k8s.io/api/core/v1"
"github.com/lomoonmoonbird/chaosblade-operator/channel"
"github.com/lomoonmoonbird/chaosblade-operator/exec/model"
"github.com/lomoonmoonbird/chaosblade-operator/pkg/apis/chaosblade/v1alpha1"
)
type ExpController struct {
model.BaseExperimentController
}
func NewExpController(client *channel.Client) model.ExperimentController {
return &ExpController{
model.BaseExperimentController{
Client: client,
ResourceModelSpec: NewResourceModelSpec(client),
},
}
}
func (*ExpController) Name() string {
return "node"
}
func (e *ExpController) Create(ctx context.Context, expSpec v1alpha1.ExperimentSpec) *spec.Response {
expModel := model.ExtractExpModelFromExperimentSpec(expSpec)
experimentId := model.GetExperimentIdFromContext(ctx)
logrusField := logrus.WithField("experiment", experimentId)
// get nodes
nodes, resp := e.getMatchedNodeResources(ctx, *expModel)
if !resp.Success {
logrusField.Errorf("uid: %s, get matched node resources failed, %v", experimentId, resp.Err)
resp.Result = v1alpha1.CreateFailExperimentStatus(resp.Err, []v1alpha1.ResourceStatus{})
return resp
}
logrusField.Infof("creating node experiment, node count is %d", len(nodes))
containerMatchedList := getContainerMatchedList(nodes)
ctx = model.SetContainerObjectMetaListToContext(ctx, containerMatchedList)
return e.Exec(ctx, expModel)
}
func (e *ExpController) Destroy(ctx context.Context, expSpec v1alpha1.ExperimentSpec, oldExpStatus v1alpha1.ExperimentStatus) *spec.Response {
logrus.WithField("experiment", model.GetExperimentIdFromContext(ctx)).Infoln("start to destroy")
expModel := model.ExtractExpModelFromExperimentSpec(expSpec)
statuses := oldExpStatus.ResStatuses
if statuses == nil {
return spec.ReturnSuccess(v1alpha1.CreateSuccessExperimentStatus([]v1alpha1.ResourceStatus{}))
}
containerObjectMetaList := model.ContainerMatchedList{}
for _, status := range statuses {
if !status.Success {
continue
}
containerObjectMeta := model.ParseIdentifier(status.Identifier)
containerObjectMeta.Id = status.Id
containerObjectMetaList = append(containerObjectMetaList, containerObjectMeta)
}
ctx = model.SetContainerObjectMetaListToContext(ctx, containerObjectMetaList)
return e.Exec(ctx, expModel)
}
// getContainerMatchedList transports selected pods
func getContainerMatchedList(nodes []v1.Node) model.ContainerMatchedList {
containerObjectMetaList := model.ContainerMatchedList{}
for _, n := range nodes {
containerObjectMetaList = append(containerObjectMetaList, model.ContainerObjectMeta{
NodeName: n.Name,
})
}
return containerObjectMetaList
}