This repository has been archived by the owner on Mar 16, 2022. It is now read-only.
-
-
Notifications
You must be signed in to change notification settings - Fork 206
/
service.go
138 lines (111 loc) · 3.62 KB
/
service.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
package namespace
import (
"context"
"github.com/go-kit/kit/log"
"github.com/go-kit/kit/log/level"
"github.com/icowan/config"
"github.com/kplcloud/kplcloud/src/kubernetes"
"github.com/kplcloud/kplcloud/src/repository"
"github.com/kplcloud/kplcloud/src/repository/types"
"github.com/pkg/errors"
"k8s.io/api/core/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
)
var (
ErrInvalidArgument = errors.New("invalid argument")
ErrNamespaceIsExists = errors.New("空间已经存在.")
ErrNamespaceCreate = errors.New("空间创建失败.")
ErrNamespaceList = errors.New("空间获取获取失败.")
)
type Service interface {
// 详情信息
Get(ctx context.Context, name string) (resp *types.Namespace, err error)
// 创建namespace
Post(ctx context.Context, name, displayName string) error
// 同步namespace
Sync(ctx context.Context) error
// 删除namespace
Delete(ctx context.Context) error
// 更新Namespaces
Update(ctx context.Context, name, displayName string) error
// 空间列表
List(ctx context.Context) (res []*types.Namespace, err error)
}
type service struct {
logger log.Logger
config *config.Config
k8sClient kubernetes.K8sClient
repository repository.Repository
}
func (c *service) List(ctx context.Context) (res []*types.Namespace, err error) {
return c.repository.Namespace().FindAll()
}
func (c *service) Update(ctx context.Context, name, displayName string) error {
return nil
}
func (c *service) Get(ctx context.Context, name string) (resp *types.Namespace, err error) {
return c.repository.Namespace().Find(name)
}
func (c *service) Post(ctx context.Context, name, displayName string) error {
res, err := c.repository.Namespace().Find(name)
if err == nil || res != nil {
_ = level.Error(c.logger).Log("displayName", name)
return ErrNamespaceIsExists
}
namespace := new(v1.Namespace)
namespace.Name = name
if _, err := c.k8sClient.Do().CoreV1().Namespaces().Create(namespace); err != nil {
_ = level.Error(c.logger).Log("k8s", "create", "err", err.Error())
return ErrNamespaceCreate
}
if err = c.repository.Namespace().Create(&types.Namespace{
DisplayName: displayName,
Name: name,
}); err != nil {
_ = level.Error(c.logger).Log("ns", "create", "err", err.Error())
return ErrNamespaceCreate
}
// 是否需要创建secret
if secrets := c.config.GetString("kubernetes", "image_pull_secrets"); secrets != "" {
if _, err := c.k8sClient.Do().CoreV1().Secrets(name).Create(&v1.Secret{
Type: v1.SecretTypeDockerConfigJson,
ObjectMeta: metav1.ObjectMeta{
Name: secrets,
Namespace: name,
},
}); err != nil {
_ = level.Warn(c.logger).Log("k8s", "secrets", "err", err.Error())
}
}
// 如果有配置jenkins的话,创建jenkins 视图
return nil
}
func (c *service) Sync(ctx context.Context) error {
nsList, err := c.k8sClient.Do().CoreV1().Namespaces().List(metav1.ListOptions{})
if err != nil {
_ = level.Error(c.logger).Log("namespace", "list", "err", err.Error())
return ErrNamespaceList
}
for _, ns := range nsList.Items {
if info, err := c.repository.Namespace().Find(ns.Name); err != nil || info == nil {
if err = c.repository.Namespace().Create(&types.Namespace{
DisplayName: ns.Name,
Name: ns.Name,
}); err != nil {
_ = level.Warn(c.logger).Log("namespace", "create", "err", err.Error())
}
}
}
return nil
}
func (c *service) Delete(ctx context.Context) error {
return nil
}
func NewService(logger log.Logger, cf *config.Config, client kubernetes.K8sClient, store repository.Repository) Service {
return &service{
logger: logger,
config: cf,
k8sClient: client,
repository: store,
}
}