-
Notifications
You must be signed in to change notification settings - Fork 831
/
publish_status.go
145 lines (130 loc) · 3.67 KB
/
publish_status.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
144
145
package models
import (
"github.com/astaxie/beego/orm"
"github.com/Qihoo360/wayne/src/backend/util/logs"
)
const (
PublishTypeDeployment PublishType = iota
PublishTypeService
PublishTypeConfigMap
PublishTypeSecret
PublishTypePersistentVolumeClaim
PublishTypeCronJob
PublishTypeStatefulSet
PublishTypeDaemonSet
PublishTypeIngress
PublishTypeHPA
TableNamePublishStatus = "publish_status"
)
type publishStatusModel struct{}
type PublishType int32
// 记录已发布模版信息
type PublishStatus struct {
Id int64 `orm:"auto" json:"id,omitempty"`
Type PublishType `orm:"index;type(integer)" json:"type,omitempty"`
ResourceId int64 `orm:"index;column(resource_id)" json:"resourceId,omitempty"`
TemplateId int64 `orm:"index;column(template_id);" json:"templateId,omitempty"`
Cluster string `orm:"size(128);column(cluster)" json:"cluster,omitempty"`
}
func (*PublishStatus) TableName() string {
return TableNamePublishStatus
}
func (*publishStatusModel) GetAll(publishType PublishType, resourceId int64) (publishStatus []PublishStatus, err error) {
_, err = Ormer().
QueryTable(new(PublishStatus)).
Filter("ResourceId", resourceId).
Filter("Type", publishType).
All(&publishStatus)
return
}
func (*publishStatusModel) GetByCluster(publishType PublishType, resourceId int64, cluster string) (publishStatus PublishStatus, err error) {
err = Ormer().
QueryTable(new(PublishStatus)).
Filter("ResourceId", resourceId).
Filter("Type", publishType).
Filter("Cluster", cluster).
One(&publishStatus)
return
}
func (*publishStatusModel) Publish(m *PublishStatus) error {
o := orm.NewOrm()
qs := o.QueryTable(new(PublishStatus))
err := o.Begin()
if err != nil {
logs.Error("(%v) begin transaction error.%v", m, err)
return err
}
publishStatus := []PublishStatus{}
count, err := qs.Filter("ResourceId", m.ResourceId).
Filter("Type", m.Type).
All(&publishStatus)
if err != nil {
return err
}
// 该资源未发布过
if count == 0 {
_, err := o.Insert(m)
transactionError := o.Commit()
if transactionError != nil {
logs.Error("(%v) commit transaction error.%v", m, err)
}
return err
}
for _, state := range publishStatus {
if state.Cluster == m.Cluster {
// 模版已经发布过,不做任何操作
if state.TemplateId == m.TemplateId {
return nil
} else { // 改集群已经被其他模版发布过,需要先删除原来记录
_, err := o.Delete(&state)
if err != nil {
return err
}
_, err = o.Insert(m)
if err != nil {
transactionError := o.Rollback()
if transactionError != nil {
logs.Error("(%v) rollback transaction error.%v", m, err)
}
return err
}
transactionError := o.Commit()
if transactionError != nil {
logs.Error("(%v) commit transaction error.%v", m, err)
}
return err
}
}
}
// 未找到已发布的机房,可以直接发布
_, err = o.Insert(m)
transactionError := o.Commit()
if transactionError != nil {
logs.Error("(%v) commit transaction error.%v", m, err)
}
return err
}
func (*publishStatusModel) DeleteById(id int64) (err error) {
v := PublishStatus{Id: id}
// ascertain id exists in the database
if err = Ormer().Read(&v); err == nil {
_, err = Ormer().Delete(&v)
return err
}
return
}
func (p *publishStatusModel) Add(id int64, tplId int64, cluster string, publishType PublishType) error {
// 添加发布状态
publishStatus := PublishStatus{
ResourceId: id,
TemplateId: tplId,
Type: publishType,
Cluster: cluster,
}
err := p.Publish(&publishStatus)
if err != nil {
logs.Error("publish publishStatus (%v) to db error.%v", publishStatus, err)
return err
}
return nil
}