modelsets.go 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193
  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. "strings"
  17. "time"
  18. "yunion.io/x/jsonutils"
  19. "yunion.io/x/onecloud/pkg/apihelper"
  20. )
  21. // pluralMap maps from KeyPlurals to underscore-separated field names
  22. var pluralMap = map[string]string{}
  23. func init() {
  24. ss := []string{
  25. "networks",
  26. "loadbalancer_networks",
  27. "loadbalancers",
  28. "loadbalancer_listeners",
  29. "loadbalancer_listener_rules",
  30. "loadbalancer_backend_groups",
  31. "loadbalancer_backends",
  32. "loadbalancer_acls",
  33. "loadbalancer_certificates",
  34. }
  35. for _, s := range ss {
  36. k := strings.Replace(s, "_", "", -1)
  37. pluralMap[k] = s
  38. }
  39. }
  40. type ModelSetsMaxUpdatedAt struct {
  41. Networks time.Time
  42. LoadbalancerNetworks time.Time
  43. Loadbalancers time.Time
  44. LoadbalancerListeners time.Time
  45. LoadbalancerListenerRules time.Time
  46. LoadbalancerBackendGroups time.Time
  47. LoadbalancerBackends time.Time
  48. LoadbalancerAcls time.Time
  49. LoadbalancerCertificates time.Time
  50. }
  51. func NewModelSetsMaxUpdatedAt() *ModelSetsMaxUpdatedAt {
  52. return &ModelSetsMaxUpdatedAt{
  53. Networks: apihelper.PseudoZeroTime,
  54. LoadbalancerNetworks: apihelper.PseudoZeroTime,
  55. Loadbalancers: apihelper.PseudoZeroTime,
  56. LoadbalancerListeners: apihelper.PseudoZeroTime,
  57. LoadbalancerListenerRules: apihelper.PseudoZeroTime,
  58. LoadbalancerBackendGroups: apihelper.PseudoZeroTime,
  59. LoadbalancerBackends: apihelper.PseudoZeroTime,
  60. LoadbalancerAcls: apihelper.PseudoZeroTime,
  61. LoadbalancerCertificates: apihelper.PseudoZeroTime,
  62. }
  63. }
  64. type ModelSets struct {
  65. Networks Networks
  66. LoadbalancerNetworks LoadbalancerNetworks
  67. Loadbalancers Loadbalancers
  68. LoadbalancerListeners LoadbalancerListeners
  69. LoadbalancerListenerRules LoadbalancerListenerRules
  70. LoadbalancerBackendGroups LoadbalancerBackendGroups
  71. LoadbalancerBackends LoadbalancerBackends
  72. LoadbalancerAcls LoadbalancerAcls
  73. LoadbalancerCertificates LoadbalancerCertificates
  74. }
  75. func NewModelSets() *ModelSets {
  76. return &ModelSets{
  77. Networks: Networks{},
  78. LoadbalancerNetworks: LoadbalancerNetworks{},
  79. Loadbalancers: Loadbalancers{},
  80. LoadbalancerListeners: LoadbalancerListeners{},
  81. LoadbalancerListenerRules: LoadbalancerListenerRules{},
  82. LoadbalancerBackendGroups: LoadbalancerBackendGroups{},
  83. LoadbalancerBackends: LoadbalancerBackends{},
  84. LoadbalancerAcls: LoadbalancerAcls{},
  85. LoadbalancerCertificates: LoadbalancerCertificates{},
  86. }
  87. }
  88. func (mss *ModelSets) NewEmpty() apihelper.IModelSets {
  89. return NewModelSets()
  90. }
  91. func (mss *ModelSets) ModelSetList() []apihelper.IModelSet {
  92. // it's ordered this way to favour creation, not deletion
  93. return []apihelper.IModelSet{
  94. mss.LoadbalancerListenerRules,
  95. mss.LoadbalancerListeners,
  96. mss.LoadbalancerBackends,
  97. mss.LoadbalancerBackendGroups,
  98. mss.Loadbalancers,
  99. mss.LoadbalancerAcls,
  100. mss.LoadbalancerCertificates,
  101. mss.LoadbalancerNetworks,
  102. mss.Networks,
  103. }
  104. }
  105. func (mss *ModelSets) copy_() *ModelSets {
  106. mssCopy := &ModelSets{
  107. Networks: mss.Networks.Copy().(Networks),
  108. LoadbalancerNetworks: mss.LoadbalancerNetworks.Copy().(LoadbalancerNetworks),
  109. Loadbalancers: mss.Loadbalancers.Copy().(Loadbalancers),
  110. LoadbalancerListeners: mss.LoadbalancerListeners.Copy().(LoadbalancerListeners),
  111. LoadbalancerListenerRules: mss.LoadbalancerListenerRules.Copy().(LoadbalancerListenerRules),
  112. LoadbalancerBackendGroups: mss.LoadbalancerBackendGroups.Copy().(LoadbalancerBackendGroups),
  113. LoadbalancerBackends: mss.LoadbalancerBackends.Copy().(LoadbalancerBackends),
  114. LoadbalancerAcls: mss.LoadbalancerAcls.Copy().(LoadbalancerAcls),
  115. LoadbalancerCertificates: mss.LoadbalancerCertificates.Copy().(LoadbalancerCertificates),
  116. }
  117. return mssCopy
  118. }
  119. func (mss *ModelSets) Copy() apihelper.IModelSets {
  120. return mss.copy_()
  121. }
  122. func (mss *ModelSets) CopyJoined() apihelper.IModelSets {
  123. mssCopy := mss.copy_()
  124. mssCopy.join()
  125. return mssCopy
  126. }
  127. func (mss *ModelSets) MaxSeenUpdatedAtParams() *jsonutils.JSONDict {
  128. d := jsonutils.NewDict()
  129. for _, ms := range mss.ModelSetList() {
  130. k := ms.ModelManager().KeyString()
  131. k = pluralMap[k]
  132. t := apihelper.ModelSetMaxUpdatedAt(ms)
  133. if !t.Equal(apihelper.PseudoZeroTime) {
  134. d.Set(k, jsonutils.NewTimeString(t))
  135. }
  136. }
  137. return d
  138. }
  139. func (mss *ModelSets) ApplyUpdates(mssNews apihelper.IModelSets) apihelper.ModelSetsUpdateResult {
  140. r := apihelper.ModelSetsUpdateResult{
  141. Changed: false,
  142. Correct: true,
  143. }
  144. mssList := mss.ModelSetList()
  145. mssNewsList := mssNews.ModelSetList()
  146. for i, mss := range mssList {
  147. mssNews := mssNewsList[i]
  148. msR := apihelper.ModelSetApplyUpdates(mss, mssNews)
  149. if !r.Changed && msR.Changed {
  150. r.Changed = true
  151. }
  152. }
  153. if r.Changed {
  154. r.Correct = mss.join()
  155. }
  156. return r
  157. }
  158. func (mss *ModelSets) join() bool {
  159. var p []bool
  160. p = append(p, mss.LoadbalancerBackendGroups.JoinBackends(mss.LoadbalancerBackends))
  161. p = append(p, mss.LoadbalancerListeners.JoinListenerRules(mss.LoadbalancerListenerRules))
  162. p = append(p, mss.LoadbalancerListeners.JoinCertificates(mss.LoadbalancerCertificates))
  163. p = append(p, mss.Loadbalancers.JoinListeners(mss.LoadbalancerListeners))
  164. p = append(p, mss.Loadbalancers.JoinBackendGroups(mss.LoadbalancerBackendGroups))
  165. p = append(p, mss.LoadbalancerNetworks.JoinLoadbalancers(mss.Loadbalancers))
  166. p = append(p, mss.LoadbalancerNetworks.JoinNetworks(mss.Networks))
  167. for _, b := range p {
  168. if !b {
  169. return false
  170. }
  171. }
  172. return true
  173. }