/
nodelabel.go
96 lines (86 loc) · 2.52 KB
/
nodelabel.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
// Copyright (c) 2021 Terminus, Inc.
//
// This program is free software: you can use, redistribute, and/or modify
// it under the terms of the GNU Affero General Public License, version 3
// or later ("AGPL"), as published by the Free Software Foundation.
//
// This program is distributed in the hope that it will be useful, but WITHOUT
// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
// FITNESS FOR A PARTICULAR PURPOSE.
//
// You should have received a copy of the GNU Affero General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
package k8s
import (
"github.com/sirupsen/logrus"
v1 "k8s.io/api/core/v1"
"github.com/erda-project/erda/modules/scheduler/executor/executortypes"
"github.com/erda-project/erda/pkg/schedule/schedulepolicy/labelconfig"
"github.com/erda-project/erda/pkg/strutil"
)
func (m *Kubernetes) IPToHostname(ip string) string {
nodeList, err := m.nodeLabel.List()
if err != nil {
return ""
}
for _, node := range nodeList.Items {
for _, addr := range node.Status.Addresses {
if addr.Type == v1.NodeInternalIP && addr.Address == ip {
return node.Name
}
}
}
return ""
}
// SetNodeLabels set the labels of k8s node
func (m *Kubernetes) SetNodeLabels(_ executortypes.NodeLabelSetting, hosts []string, labels map[string]string) error {
// contents in 'hosts' maybe hostname or internalIP, it should be unified into hostname
nodelist, err := m.nodeLabel.List()
if err != nil {
logrus.Errorf("failed to list nodes: %v", err)
return err
}
updatedHosts := []string{}
for _, host := range hosts {
for _, node := range nodelist.Items {
add := false
for _, addr := range node.Status.Addresses {
if addr.Address == host {
add = true
break
}
}
if add {
updatedHosts = append(updatedHosts, node.Name)
}
}
}
for _, host := range updatedHosts {
prefixedLabels := map[string]*string{}
orig, err := m.nodeLabel.Get(host)
if err != nil {
return err
}
// 1. unset all 'dice/' labels
for k := range orig {
if !strutil.HasPrefixes(k, labelconfig.K8SLabelPrefix) {
continue
}
prefixedLabels[k] = nil
}
// 2. set labels in param 'labels'
for k := range labels {
v := labels[k]
prefixedKey := k
if !strutil.HasPrefixes(prefixedKey, labelconfig.K8SLabelPrefix) {
prefixedKey = strutil.Concat(labelconfig.K8SLabelPrefix, k)
}
prefixedLabels[prefixedKey] = &v
}
// 3. set them
if err := m.nodeLabel.Set(prefixedLabels, host); err != nil {
return err
}
}
return nil
}