modelset.go 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460
  1. // Copyright 2019 Yunion
  2. //
  3. // Licensed under the Apache License, Version 2.0 (the "License");
  4. // you may not use this file except in compliance with the License.
  5. // You may obtain a copy of the License at
  6. //
  7. // http://www.apache.org/licenses/LICENSE-2.0
  8. //
  9. // Unless required by applicable law or agreed to in writing, software
  10. // distributed under the License is distributed on an "AS IS" BASIS,
  11. // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  12. // See the License for the specific language governing permissions and
  13. // limitations under the License.
  14. package models
  15. import (
  16. "sort"
  17. "yunion.io/x/log"
  18. "yunion.io/x/onecloud/pkg/apihelper"
  19. "yunion.io/x/onecloud/pkg/cloudcommon/db"
  20. "yunion.io/x/onecloud/pkg/compute/models"
  21. "yunion.io/x/onecloud/pkg/mcclient/modulebase"
  22. modules "yunion.io/x/onecloud/pkg/mcclient/modules/compute"
  23. )
  24. type Networks map[string]*Network
  25. type LoadbalancerNetworks map[string]*LoadbalancerNetwork // key: networkId/loadbalancerId
  26. type Loadbalancers map[string]*Loadbalancer
  27. type LoadbalancerListeners map[string]*LoadbalancerListener
  28. type LoadbalancerListenerRules map[string]*LoadbalancerListenerRule
  29. type LoadbalancerBackendGroups map[string]*LoadbalancerBackendGroup
  30. type LoadbalancerBackends map[string]*LoadbalancerBackend
  31. type LoadbalancerAcls map[string]*LoadbalancerAcl
  32. type LoadbalancerCertificates map[string]*LoadbalancerCertificate
  33. func (set Networks) ModelManager() modulebase.IBaseManager {
  34. return &modules.Networks
  35. }
  36. func (set Networks) NewModel() db.IModel {
  37. return &models.SNetwork{}
  38. }
  39. func (set Networks) AddModel(i db.IModel) {
  40. m, _ := i.(*models.SNetwork)
  41. set[m.Id] = &Network{
  42. SNetwork: m,
  43. }
  44. }
  45. func (set Networks) Copy() apihelper.IModelSet {
  46. setCopy := Networks{}
  47. for id, el := range set {
  48. setCopy[id] = el.Copy()
  49. }
  50. return setCopy
  51. }
  52. func (set LoadbalancerNetworks) ModelManager() modulebase.IBaseManager {
  53. return &modules.Loadbalancernetworks
  54. }
  55. func (set LoadbalancerNetworks) NewModel() db.IModel {
  56. return &models.SLoadbalancerNetwork{}
  57. }
  58. func (set LoadbalancerNetworks) AddModel(i db.IModel) {
  59. m, _ := i.(*models.SLoadbalancerNetwork)
  60. set[m.NetworkId+"/"+m.LoadbalancerId] = &LoadbalancerNetwork{
  61. SLoadbalancerNetwork: m,
  62. }
  63. }
  64. func (set LoadbalancerNetworks) Copy() apihelper.IModelSet {
  65. setCopy := LoadbalancerNetworks{}
  66. for id, el := range set {
  67. setCopy[id] = el.Copy()
  68. }
  69. return setCopy
  70. }
  71. func (set LoadbalancerNetworks) JoinLoadbalancers(entries Loadbalancers) bool {
  72. for mKey, m := range set {
  73. lbId := m.LoadbalancerId
  74. netId := m.NetworkId
  75. entry, ok := entries[lbId]
  76. if !ok {
  77. // this can happen for external loadbalancers
  78. log.Warningf("lb for loadbalancer network %s %s not found", lbId, netId)
  79. delete(set, mKey)
  80. continue
  81. }
  82. m.Loadbalancer = entry
  83. entry.LoadbalancerNetwork = m
  84. }
  85. for _, entry := range entries {
  86. if entry.LoadbalancerNetwork == nil {
  87. log.Warningf("loadbalancer network for loadbalancer %s(%s) not found ", entry.Name, entry.Id)
  88. return false
  89. }
  90. }
  91. return true
  92. }
  93. func (set LoadbalancerNetworks) JoinNetworks(entries Networks) bool {
  94. for mKey, m := range set {
  95. lbId := m.LoadbalancerId
  96. netId := m.NetworkId
  97. entry, ok := entries[netId]
  98. if !ok {
  99. // this can happen for external loadbalancers
  100. log.Warningf("network for loadbalancer network %s/%s not found", lbId, netId)
  101. delete(set, mKey)
  102. continue
  103. }
  104. m.Network = entry
  105. }
  106. return true
  107. }
  108. func (set Loadbalancers) ModelManager() modulebase.IBaseManager {
  109. return &modules.Loadbalancers
  110. }
  111. func (set Loadbalancers) NewModel() db.IModel {
  112. return &models.SLoadbalancer{}
  113. }
  114. func (set Loadbalancers) AddModel(i db.IModel) {
  115. m, _ := i.(*models.SLoadbalancer)
  116. if m.ManagerId != "" || m.ExternalId != "" {
  117. log.Errorf("unexpected lb: %#v", m)
  118. return
  119. }
  120. set[m.Id] = &Loadbalancer{
  121. SLoadbalancer: m,
  122. Listeners: LoadbalancerListeners{},
  123. BackendGroups: LoadbalancerBackendGroups{},
  124. }
  125. }
  126. func (set Loadbalancers) Copy() apihelper.IModelSet {
  127. setCopy := Loadbalancers{}
  128. for id, el := range set {
  129. setCopy[id] = el.Copy()
  130. }
  131. return setCopy
  132. }
  133. func (ms Loadbalancers) JoinListeners(subEntries LoadbalancerListeners) bool {
  134. for _, m := range ms {
  135. m.Listeners = LoadbalancerListeners{}
  136. }
  137. correct := true
  138. for subId, subEntry := range subEntries {
  139. id := subEntry.LoadbalancerId
  140. m, ok := ms[id]
  141. if !ok {
  142. log.Warningf("loadbalancer id %s not found", id)
  143. correct = false
  144. continue
  145. }
  146. if _, ok := m.Listeners[subId]; ok {
  147. log.Warningf("loadbalancer listener id %s already joined", subId)
  148. continue
  149. }
  150. subEntry.loadbalancer = m
  151. m.Listeners[subId] = subEntry
  152. }
  153. return correct
  154. }
  155. func (ms Loadbalancers) JoinBackendGroups(subEntries LoadbalancerBackendGroups) bool {
  156. for _, m := range ms {
  157. m.BackendGroups = LoadbalancerBackendGroups{}
  158. }
  159. correct := true
  160. for subId, subEntry := range subEntries {
  161. id := subEntry.LoadbalancerId
  162. m, ok := ms[id]
  163. if !ok {
  164. // external_id of AWS backendgroup can be empty
  165. log.Warningf("backendgroup %s(%s): loadbalancer id %s not found",
  166. subEntry.Name, subEntry.Id, id)
  167. continue
  168. }
  169. if _, ok := m.BackendGroups[subId]; ok {
  170. log.Warningf("loadbalancer backendgroup id %s already joined", subId)
  171. continue
  172. }
  173. subEntry.loadbalancer = m
  174. m.BackendGroups[subId] = subEntry
  175. }
  176. return correct
  177. }
  178. func (set LoadbalancerListeners) ModelManager() modulebase.IBaseManager {
  179. return &modules.LoadbalancerListeners
  180. }
  181. func (set LoadbalancerListeners) NewModel() db.IModel {
  182. return &models.SLoadbalancerListener{}
  183. }
  184. func (set LoadbalancerListeners) AddModel(i db.IModel) {
  185. m, _ := i.(*models.SLoadbalancerListener)
  186. if m.ExternalId != "" || m.LoadbalancerId == "" {
  187. log.Errorf("unexpected lblistener: %#v", m)
  188. return
  189. }
  190. set[m.Id] = &LoadbalancerListener{
  191. SLoadbalancerListener: m,
  192. rules: LoadbalancerListenerRules{},
  193. }
  194. }
  195. func (set LoadbalancerListeners) Copy() apihelper.IModelSet {
  196. setCopy := LoadbalancerListeners{}
  197. for id, el := range set {
  198. setCopy[id] = el.Copy()
  199. }
  200. return setCopy
  201. }
  202. func (ms LoadbalancerListeners) JoinListenerRules(subEntries LoadbalancerListenerRules) bool {
  203. for _, m := range ms {
  204. m.rules = LoadbalancerListenerRules{}
  205. }
  206. correct := true
  207. for subId, subEntry := range subEntries {
  208. id := subEntry.ListenerId
  209. m, ok := ms[id]
  210. if !ok {
  211. log.Warningf("loadbalancer listener id %s not found", id)
  212. correct = false
  213. continue
  214. }
  215. if _, ok := m.rules[subId]; ok {
  216. log.Warningf("loadbalancer rule id %s already joined", subId)
  217. continue
  218. }
  219. subEntry.listener = m
  220. m.rules[subId] = subEntry
  221. }
  222. return correct
  223. }
  224. func (ms LoadbalancerListeners) JoinCertificates(subEntries LoadbalancerCertificates) bool {
  225. correct := true
  226. for _, m := range ms {
  227. m.certificate = nil
  228. if m.CertificateId != "" {
  229. subEntry, ok := subEntries[m.CertificateId]
  230. if !ok {
  231. log.Warningf("loadbalancerlistener id %s: cannot find certificate id %s",
  232. m.Id, m.CertificateId)
  233. correct = false
  234. continue
  235. }
  236. m.certificate = subEntry
  237. }
  238. }
  239. return correct
  240. }
  241. func (set LoadbalancerListenerRules) ModelManager() modulebase.IBaseManager {
  242. return &modules.LoadbalancerListenerRules
  243. }
  244. func (set LoadbalancerListenerRules) NewModel() db.IModel {
  245. return &models.SLoadbalancerListenerRule{}
  246. }
  247. func (set LoadbalancerListenerRules) AddModel(i db.IModel) {
  248. m, _ := i.(*models.SLoadbalancerListenerRule)
  249. if m.ExternalId != "" || m.ListenerId == "" {
  250. log.Errorf("unexpected lblistenerrule: %#v", m)
  251. return
  252. }
  253. set[m.Id] = &LoadbalancerListenerRule{
  254. SLoadbalancerListenerRule: m,
  255. }
  256. }
  257. func (set LoadbalancerListenerRules) Copy() apihelper.IModelSet {
  258. setCopy := LoadbalancerListenerRules{}
  259. for id, el := range set {
  260. setCopy[id] = el.Copy()
  261. }
  262. return setCopy
  263. }
  264. type OrderedLoadbalancerListenerRuleList []*LoadbalancerListenerRule
  265. func (lst OrderedLoadbalancerListenerRuleList) Len() int {
  266. return len(lst)
  267. }
  268. func (lst OrderedLoadbalancerListenerRuleList) Less(i, j int) bool {
  269. ldi := len(lst[i].Domain)
  270. ldj := len(lst[j].Domain)
  271. if ldi < ldj {
  272. return true
  273. } else if ldi == ldj {
  274. lpi := len(lst[i].Path)
  275. lpj := len(lst[j].Path)
  276. if lpi < lpj {
  277. return true
  278. }
  279. }
  280. return false
  281. }
  282. func (lst OrderedLoadbalancerListenerRuleList) Swap(i, j int) {
  283. lst[i], lst[j] = lst[j], lst[i]
  284. }
  285. func (set LoadbalancerListenerRules) OrderedEnabledList() OrderedLoadbalancerListenerRuleList {
  286. rules := OrderedLoadbalancerListenerRuleList{}
  287. for _, rule := range set {
  288. if rule.Status == "enabled" {
  289. rules = append(rules, rule)
  290. }
  291. }
  292. // more specific rules come first
  293. sort.Sort(sort.Reverse(rules))
  294. return rules
  295. }
  296. func (set LoadbalancerBackendGroups) ModelManager() modulebase.IBaseManager {
  297. return &modules.LoadbalancerBackendGroups
  298. }
  299. func (set LoadbalancerBackendGroups) NewModel() db.IModel {
  300. return &models.SLoadbalancerBackendGroup{}
  301. }
  302. func (set LoadbalancerBackendGroups) AddModel(i db.IModel) {
  303. m, _ := i.(*models.SLoadbalancerBackendGroup)
  304. if m.ExternalId != "" || m.LoadbalancerId == "" {
  305. log.Errorf("unexpected lbbg: %#v", m)
  306. }
  307. set[m.Id] = &LoadbalancerBackendGroup{
  308. SLoadbalancerBackendGroup: m,
  309. Backends: LoadbalancerBackends{},
  310. }
  311. }
  312. func (set LoadbalancerBackendGroups) Copy() apihelper.IModelSet {
  313. setCopy := LoadbalancerBackendGroups{}
  314. for id, el := range set {
  315. setCopy[id] = el.Copy()
  316. }
  317. return setCopy
  318. }
  319. func (ms LoadbalancerBackendGroups) JoinBackends(subEntries LoadbalancerBackends) bool {
  320. for _, m := range ms {
  321. m.Backends = LoadbalancerBackends{}
  322. }
  323. correct := true
  324. for subId, subEntry := range subEntries {
  325. id := subEntry.BackendGroupId
  326. m, ok := ms[id]
  327. if !ok {
  328. log.Warningf("loadbalancer backend group id %s not found", id)
  329. correct = false
  330. continue
  331. }
  332. if _, ok := m.Backends[subId]; ok {
  333. log.Warningf("loadbalancer backend id %s already joined", subId)
  334. continue
  335. }
  336. m.Backends[subId] = subEntry
  337. subEntry.backendGroup = m
  338. }
  339. return correct
  340. }
  341. func (set LoadbalancerBackends) ModelManager() modulebase.IBaseManager {
  342. return &modules.LoadbalancerBackends
  343. }
  344. func (set LoadbalancerBackends) NewModel() db.IModel {
  345. return &models.SLoadbalancerBackend{}
  346. }
  347. func (set LoadbalancerBackends) AddModel(i db.IModel) {
  348. m, _ := i.(*models.SLoadbalancerBackend)
  349. if m.ExternalId != "" || m.BackendGroupId == "" {
  350. log.Errorf("unexpected lbb: %#v", m)
  351. return
  352. }
  353. set[m.Id] = &LoadbalancerBackend{
  354. SLoadbalancerBackend: m,
  355. }
  356. }
  357. func (set LoadbalancerBackends) Copy() apihelper.IModelSet {
  358. setCopy := LoadbalancerBackends{}
  359. for id, el := range set {
  360. setCopy[id] = el.Copy()
  361. }
  362. return setCopy
  363. }
  364. func (set LoadbalancerAcls) ModelManager() modulebase.IBaseManager {
  365. return &modules.LoadbalancerAcls
  366. }
  367. func (set LoadbalancerAcls) NewModel() db.IModel {
  368. return &models.SLoadbalancerAcl{}
  369. }
  370. func (set LoadbalancerAcls) AddModel(i db.IModel) {
  371. m, _ := i.(*models.SLoadbalancerAcl)
  372. if m.ManagerId != "" || m.ExternalId != "" {
  373. return
  374. }
  375. set[m.Id] = &LoadbalancerAcl{
  376. SLoadbalancerAcl: m,
  377. }
  378. }
  379. func (set LoadbalancerAcls) Copy() apihelper.IModelSet {
  380. setCopy := LoadbalancerAcls{}
  381. for id, el := range set {
  382. setCopy[id] = el.Copy()
  383. }
  384. return setCopy
  385. }
  386. func (set LoadbalancerCertificates) ModelManager() modulebase.IBaseManager {
  387. return &modules.LoadbalancerCertificates
  388. }
  389. func (set LoadbalancerCertificates) NewModel() db.IModel {
  390. return &models.SLoadbalancerCertificate{}
  391. }
  392. func (set LoadbalancerCertificates) AddModel(i db.IModel) {
  393. m, _ := i.(*models.SLoadbalancerCertificate)
  394. if m.ExternalId != "" {
  395. return
  396. }
  397. set[m.Id] = &LoadbalancerCertificate{
  398. SLoadbalancerCertificate: m,
  399. }
  400. }
  401. func (set LoadbalancerCertificates) Copy() apihelper.IModelSet {
  402. setCopy := LoadbalancerCertificates{}
  403. for id, el := range set {
  404. setCopy[id] = el.Copy()
  405. }
  406. return setCopy
  407. }