modelsets.go 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320
  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/log"
  19. "yunion.io/x/pkg/errors"
  20. "yunion.io/x/onecloud/pkg/apihelper"
  21. "yunion.io/x/onecloud/pkg/mcclient"
  22. "yunion.io/x/onecloud/pkg/mcclient/modules/apimap"
  23. )
  24. type ModelSetsMaxUpdatedAt struct {
  25. Vpcs time.Time
  26. Wires time.Time
  27. Networks time.Time
  28. Guests time.Time
  29. Hosts time.Time
  30. SecurityGroups time.Time
  31. SecurityGroupRules time.Time
  32. Guestnetworks time.Time
  33. Guestsecgroups time.Time
  34. Elasticips time.Time
  35. NetworkAddresses time.Time
  36. Guestnetworksecgroups time.Time
  37. DnsZones time.Time
  38. DnsRecords time.Time
  39. RouteTables time.Time
  40. Groupguests time.Time
  41. Groupnetworks time.Time
  42. LoadbalancerNetworks time.Time
  43. LoadbalancerListeners time.Time
  44. LoadbalancerAcls time.Time
  45. }
  46. func NewModelSetsMaxUpdatedAt() *ModelSetsMaxUpdatedAt {
  47. return &ModelSetsMaxUpdatedAt{
  48. Vpcs: apihelper.PseudoZeroTime,
  49. Wires: apihelper.PseudoZeroTime,
  50. Networks: apihelper.PseudoZeroTime,
  51. Guests: apihelper.PseudoZeroTime,
  52. Hosts: apihelper.PseudoZeroTime,
  53. SecurityGroups: apihelper.PseudoZeroTime,
  54. SecurityGroupRules: apihelper.PseudoZeroTime,
  55. Guestnetworks: apihelper.PseudoZeroTime,
  56. Guestsecgroups: apihelper.PseudoZeroTime,
  57. Elasticips: apihelper.PseudoZeroTime,
  58. NetworkAddresses: apihelper.PseudoZeroTime,
  59. Guestnetworksecgroups: apihelper.PseudoZeroTime,
  60. DnsZones: apihelper.PseudoZeroTime,
  61. DnsRecords: apihelper.PseudoZeroTime,
  62. RouteTables: apihelper.PseudoZeroTime,
  63. Groupguests: apihelper.PseudoZeroTime,
  64. Groupnetworks: apihelper.PseudoZeroTime,
  65. LoadbalancerNetworks: apihelper.PseudoZeroTime,
  66. LoadbalancerListeners: apihelper.PseudoZeroTime,
  67. LoadbalancerAcls: apihelper.PseudoZeroTime,
  68. }
  69. }
  70. type ModelSets struct {
  71. Vpcs Vpcs
  72. Wires Wires
  73. Networks Networks
  74. Guests Guests
  75. Hosts Hosts
  76. SecurityGroups SecurityGroups
  77. SecurityGroupRules SecurityGroupRules
  78. Guestnetworks Guestnetworks
  79. Guestsecgroups Guestsecgroups
  80. Elasticips Elasticips
  81. NetworkAddresses NetworkAddresses
  82. Guestnetworksecgroups Guestnetworksecgroups
  83. DnsZones DnsZones
  84. DnsRecords DnsRecords
  85. RouteTables RouteTables
  86. Groupguests Groupguests
  87. Groupnetworks Groupnetworks
  88. Groups Groups
  89. LoadbalancerNetworks LoadbalancerNetworks
  90. LoadbalancerListeners LoadbalancerListeners
  91. LoadbalancerAcls LoadbalancerAcls
  92. }
  93. func NewModelSets() *ModelSets {
  94. return &ModelSets{
  95. Vpcs: Vpcs{},
  96. Wires: Wires{},
  97. Networks: Networks{},
  98. Guests: Guests{},
  99. Hosts: Hosts{},
  100. SecurityGroups: SecurityGroups{},
  101. SecurityGroupRules: SecurityGroupRules{},
  102. Guestnetworks: Guestnetworks{},
  103. Guestsecgroups: Guestsecgroups{},
  104. Elasticips: Elasticips{},
  105. NetworkAddresses: NetworkAddresses{},
  106. Guestnetworksecgroups: Guestnetworksecgroups{},
  107. DnsZones: DnsZones{},
  108. DnsRecords: DnsRecords{},
  109. RouteTables: RouteTables{},
  110. Groupguests: Groupguests{},
  111. Groupnetworks: Groupnetworks{},
  112. Groups: Groups{},
  113. LoadbalancerNetworks: LoadbalancerNetworks{},
  114. LoadbalancerListeners: LoadbalancerListeners{},
  115. LoadbalancerAcls: LoadbalancerAcls{},
  116. }
  117. }
  118. func (mss *ModelSets) ModelSetList() []apihelper.IModelSet {
  119. // it's ordered this way to favour creation, not deletion
  120. return []apihelper.IModelSet{
  121. mss.Vpcs,
  122. mss.Wires,
  123. mss.Networks,
  124. mss.Guests,
  125. mss.Hosts,
  126. mss.SecurityGroups,
  127. mss.SecurityGroupRules,
  128. mss.Guestnetworks,
  129. mss.Guestsecgroups,
  130. mss.Elasticips,
  131. mss.NetworkAddresses,
  132. mss.Guestnetworksecgroups,
  133. mss.DnsZones,
  134. mss.DnsRecords,
  135. mss.RouteTables,
  136. mss.Groupguests,
  137. mss.Groupnetworks,
  138. mss.Groups,
  139. mss.LoadbalancerNetworks,
  140. mss.LoadbalancerListeners,
  141. mss.LoadbalancerAcls,
  142. }
  143. }
  144. func (mss *ModelSets) NewEmpty() apihelper.IModelSets {
  145. return NewModelSets()
  146. }
  147. func (mss *ModelSets) copy_() *ModelSets {
  148. mssCopy := &ModelSets{
  149. Vpcs: mss.Vpcs.Copy().(Vpcs),
  150. Wires: mss.Wires.Copy().(Wires),
  151. Networks: mss.Networks.Copy().(Networks),
  152. Guests: mss.Guests.Copy().(Guests),
  153. Hosts: mss.Hosts.Copy().(Hosts),
  154. SecurityGroups: mss.SecurityGroups.Copy().(SecurityGroups),
  155. SecurityGroupRules: mss.SecurityGroupRules.Copy().(SecurityGroupRules),
  156. Guestnetworks: mss.Guestnetworks.Copy().(Guestnetworks),
  157. Guestsecgroups: mss.Guestsecgroups.Copy().(Guestsecgroups),
  158. Elasticips: mss.Elasticips.Copy().(Elasticips),
  159. NetworkAddresses: mss.NetworkAddresses.Copy().(NetworkAddresses),
  160. Guestnetworksecgroups: mss.Guestnetworksecgroups.Copy().(Guestnetworksecgroups),
  161. DnsZones: mss.DnsZones.Copy().(DnsZones),
  162. DnsRecords: mss.DnsRecords.Copy().(DnsRecords),
  163. RouteTables: mss.RouteTables.Copy().(RouteTables),
  164. Groupguests: mss.Groupguests.Copy().(Groupguests),
  165. Groupnetworks: mss.Groupnetworks.Copy().(Groupnetworks),
  166. Groups: mss.Groups.Copy().(Groups),
  167. LoadbalancerNetworks: mss.LoadbalancerNetworks.Copy().(LoadbalancerNetworks),
  168. LoadbalancerListeners: mss.LoadbalancerListeners.Copy().(LoadbalancerListeners),
  169. LoadbalancerAcls: mss.LoadbalancerAcls.Copy().(LoadbalancerAcls),
  170. }
  171. return mssCopy
  172. }
  173. func (mss *ModelSets) Copy() apihelper.IModelSets {
  174. return mss.copy_()
  175. }
  176. func (mss *ModelSets) CopyJoined() apihelper.IModelSets {
  177. mssCopy := mss.copy_()
  178. mssCopy.join()
  179. return mssCopy
  180. }
  181. func (mss *ModelSets) ApplyUpdates(mssNews apihelper.IModelSets) apihelper.ModelSetsUpdateResult {
  182. r := apihelper.ModelSetsUpdateResult{
  183. Changed: false,
  184. Correct: true,
  185. }
  186. mssList := mss.ModelSetList()
  187. mssNewsList := mssNews.ModelSetList()
  188. for i, mss := range mssList {
  189. mssNews := mssNewsList[i]
  190. msR := apihelper.ModelSetApplyUpdates(mss, mssNews)
  191. if !r.Changed && msR.Changed {
  192. r.Changed = true
  193. }
  194. }
  195. if r.Changed {
  196. r.Correct = mss.join()
  197. }
  198. return r
  199. }
  200. func (mss *ModelSets) FetchFromAPIMap(s *mcclient.ClientSession) (apihelper.IModelSets, error) {
  201. mssNews := mss.NewEmpty()
  202. ret, err := apimap.APIMap.GetVPCAgentTopo(s)
  203. if err != nil {
  204. return nil, errors.Wrap(err, "GetVPCAgentTopo")
  205. }
  206. if err := ret.Unmarshal(mssNews, "models"); err != nil {
  207. return nil, errors.Wrap(err, "Unmarshal topo")
  208. }
  209. return mssNews, nil
  210. }
  211. func (mss *ModelSets) join() bool {
  212. mss.Guests.initJoin()
  213. mss.Groups = Groups{}
  214. var p []bool
  215. var msg []string
  216. p = append(p, mss.Vpcs.joinWires(mss.Wires))
  217. msg = append(msg, "mss.Vpcs.joinWires(mss.Wires)")
  218. p = append(p, mss.Vpcs.joinRouteTables(mss.RouteTables))
  219. msg = append(msg, "mss.Vpcs.joinRouteTables(mss.RouteTables)")
  220. p = append(p, mss.Wires.joinNetworks(mss.Networks))
  221. msg = append(msg, "mss.Wires.joinNetworks(mss.Networks)")
  222. p = append(p, mss.Vpcs.joinNetworks(mss.Networks))
  223. msg = append(msg, "mss.Vpcs.joinNetworks(mss.Networks)")
  224. p = append(p, mss.Networks.joinGuestnetworks(mss.Guestnetworks))
  225. msg = append(msg, "mss.Networks.joinGuestnetworks(mss.Guestnetworks)")
  226. p = append(p, mss.Networks.joinNetworkAddresses(mss.NetworkAddresses))
  227. msg = append(msg, "mss.Networks.joinNetworkAddresses(mss.NetworkAddresses)")
  228. p = append(p, mss.Networks.joinLoadbalancerNetworks(mss.LoadbalancerNetworks))
  229. msg = append(msg, "mss.Networks.joinLoadbalancerNetworks(mss.LoadbalancerNetworks)")
  230. p = append(p, mss.Networks.joinElasticips(mss.Elasticips))
  231. msg = append(msg, "mss.Networks.joinElasticips(mss.Elasticips)")
  232. p = append(p, mss.Guests.joinHosts(mss.Hosts))
  233. msg = append(msg, "mss.Guests.joinHosts(mss.Hosts)")
  234. p = append(p, mss.Guests.joinSecurityGroups(mss.SecurityGroups))
  235. msg = append(msg, "mss.Guests.joinSecurityGroups(mss.SecurityGroups)")
  236. p = append(p, mss.Guests.joinGroupguests(mss.Groups, mss.Groupguests))
  237. msg = append(msg, "mss.Guests.joinGroupguests(mss.Groups, mss.Groupguests)")
  238. p = append(p, mss.SecurityGroups.joinSecurityGroupRules(mss.SecurityGroupRules))
  239. msg = append(msg, "mss.SecurityGroups.joinSecurityGroupRules(mss.SecurityGroupRules)")
  240. p = append(p, mss.Guestsecgroups.join(mss.SecurityGroups, mss.Guests))
  241. msg = append(msg, "mss.Guestsecgroups.join(mss.SecurityGroups, mss.Guests)")
  242. p = append(p, mss.Guestnetworksecgroups.joinSecurityGroups(mss.SecurityGroups))
  243. msg = append(msg, "mss.Guestnetworksecgroups.joinSecurityGroups(mss.SecurityGroups)")
  244. p = append(p, mss.Guestnetworks.joinGuests(mss.Guests))
  245. msg = append(msg, "mss.Guestnetworks.joinGuests(mss.Guests)")
  246. p = append(p, mss.Guestnetworks.joinElasticips(mss.Elasticips))
  247. msg = append(msg, "mss.Guestnetworks.joinElasticips(mss.Elasticips)")
  248. p = append(p, mss.Guestnetworks.joinNetworkAddresses(mss.NetworkAddresses))
  249. msg = append(msg, "mss.Guestnetworks.joinNetworkAddresses(mss.NetworkAddresses)")
  250. p = append(p, mss.Guestnetworks.joinGuestnetworksecgroups(mss.Guestnetworksecgroups))
  251. msg = append(msg, "mss.Guestnetworks.joinGuestnetworksecgroups(mss.Guestnetworksecgroups)")
  252. p = append(p, mss.Groups.joinGroupnetworks(mss.Groupnetworks, mss.Networks))
  253. msg = append(msg, "mss.Groups.joinGroupnetworks(mss.Groupnetworks, mss.Networks)")
  254. p = append(p, mss.Groupnetworks.joinElasticips(mss.Elasticips))
  255. msg = append(msg, "mss.Groupnetworks.joinElasticips(mss.Elasticips)")
  256. p = append(p, mss.LoadbalancerNetworks.joinElasticips(mss.Elasticips))
  257. msg = append(msg, "mss.LoadbalancerNetworks.joinElasticips(mss.Elasticips)")
  258. p = append(p, mss.LoadbalancerNetworks.joinLoadbalancerListeners(mss.LoadbalancerListeners))
  259. msg = append(msg, "mss.LoadbalancerNetworks.joinLoadbalancerListeners(mss.LoadbalancerListeners)")
  260. p = append(p, mss.LoadbalancerListeners.joinLoadbalancerAcls(mss.LoadbalancerAcls))
  261. msg = append(msg, "mss.LoadbalancerListeners.joinLoadbalancerAcls(mss.LoadbalancerAcls)")
  262. p = append(p, mss.DnsZones.joinRecords(mss.DnsRecords))
  263. msg = append(msg, "mss.Vpcs.joinRecords(mss.DnsRecords)")
  264. ret := true
  265. var failMsg []string
  266. for i, b := range p {
  267. if !b {
  268. ret = false
  269. failMsg = append(failMsg, msg[i])
  270. }
  271. }
  272. if !ret {
  273. log.Errorln(strings.Join(failMsg, ","))
  274. } else {
  275. for _, g := range mss.Guests {
  276. g.FixIsDefaults()
  277. }
  278. }
  279. return ret
  280. }