networks_id_change_handlers.go 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187
  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. "context"
  17. "yunion.io/x/log"
  18. "yunion.io/x/pkg/util/netutils"
  19. "yunion.io/x/onecloud/pkg/cloudcommon/db"
  20. "yunion.io/x/onecloud/pkg/mcclient"
  21. "yunion.io/x/onecloud/pkg/util/logclient"
  22. )
  23. type networkIdChangeArgs struct {
  24. action string
  25. oldNet *SNetwork
  26. newNet *SNetwork
  27. userCred mcclient.TokenCredential
  28. }
  29. type networkIdChangeHandler interface {
  30. handleNetworkIdChange(ctx context.Context, args *networkIdChangeArgs) error
  31. }
  32. func (manager *SGuestnetworkManager) handleNetworkIdChange(ctx context.Context, args *networkIdChangeArgs) error {
  33. gns := make([]SGuestnetwork, 0)
  34. err := db.FetchModelObjects(manager, manager.Query().Equals("network_id", args.oldNet.Id), &gns)
  35. if err != nil {
  36. logclient.AddActionLogWithContext(ctx, args.oldNet, args.action, err.Error(), args.userCred, false)
  37. return err
  38. }
  39. for _, gn := range gns {
  40. addr, _ := netutils.NewIPV4Addr(gn.IpAddr)
  41. if args.newNet.IsAddressInRange(addr) {
  42. _, err = db.Update(&gn, func() error {
  43. gn.NetworkId = args.newNet.Id
  44. return nil
  45. })
  46. if err != nil {
  47. log.Errorln(err)
  48. }
  49. }
  50. }
  51. return nil
  52. }
  53. func (manager *SHostnetworkManager) handleNetworkIdChange(ctx context.Context, args *networkIdChangeArgs) error {
  54. hns := make([]SHostnetwork, 0)
  55. err := db.FetchModelObjects(manager, manager.Query().Equals("network_id", args.oldNet.Id), &hns)
  56. if err != nil {
  57. logclient.AddActionLogWithContext(ctx, args.oldNet, args.action, err.Error(), args.userCred, false)
  58. return err
  59. }
  60. for _, hn := range hns {
  61. inNet := false
  62. if len(hn.IpAddr) > 0 {
  63. addr, _ := netutils.NewIPV4Addr(hn.IpAddr)
  64. if args.newNet.IsAddressInRange(addr) {
  65. inNet = true
  66. }
  67. }
  68. if len(hn.Ip6Addr) > 0 {
  69. addr, _ := netutils.NewIPV6Addr(hn.Ip6Addr)
  70. if args.newNet.IsAddress6InRange(addr) {
  71. inNet = true
  72. }
  73. }
  74. if inNet {
  75. _, err = db.Update(&hn, func() error {
  76. hn.NetworkId = args.newNet.Id
  77. return nil
  78. })
  79. if err != nil {
  80. log.Errorln(err)
  81. }
  82. }
  83. }
  84. return nil
  85. }
  86. func (manager *SReservedipManager) handleNetworkIdChange(ctx context.Context, args *networkIdChangeArgs) error {
  87. ris := make([]SReservedip, 0)
  88. err := db.FetchModelObjects(manager, manager.Query().Equals("network_id", args.oldNet.Id), &ris)
  89. if err != nil {
  90. logclient.AddActionLogWithContext(ctx, args.oldNet, args.action, err.Error(), args.userCred, false)
  91. return err
  92. }
  93. for _, ri := range ris {
  94. if len(ri.IpAddr) == 0 {
  95. continue
  96. }
  97. addr, _ := netutils.NewIPV4Addr(ri.IpAddr)
  98. if args.newNet.IsAddressInRange(addr) {
  99. _, err = db.Update(&ri, func() error {
  100. ri.NetworkId = args.newNet.Id
  101. return nil
  102. })
  103. if err != nil {
  104. log.Errorln(err)
  105. }
  106. }
  107. }
  108. return nil
  109. }
  110. func (manager *SGroupnetworkManager) handleNetworkIdChange(ctx context.Context, args *networkIdChangeArgs) error {
  111. gns := make([]SGroupnetwork, 0)
  112. err := db.FetchModelObjects(manager, manager.Query().Equals("network_id", args.oldNet.Id), &gns)
  113. if err != nil {
  114. logclient.AddActionLogWithContext(ctx, args.oldNet, args.action, err.Error(), args.userCred, false)
  115. return err
  116. }
  117. for _, gn := range gns {
  118. if len(gn.IpAddr) == 0 {
  119. continue
  120. }
  121. addr, _ := netutils.NewIPV4Addr(gn.IpAddr)
  122. if args.newNet.IsAddressInRange(addr) {
  123. _, err = db.Update(&gn, func() error {
  124. gn.NetworkId = args.newNet.Id
  125. return nil
  126. })
  127. if err != nil {
  128. log.Errorln(err)
  129. }
  130. }
  131. }
  132. return nil
  133. }
  134. func (manager *SLoadbalancernetworkManager) handleNetworkIdChange(ctx context.Context, args *networkIdChangeArgs) error {
  135. lbns := make([]SLoadbalancerNetwork, 0)
  136. err := db.FetchModelObjects(manager, manager.Query().Equals("network_id", args.oldNet.Id), &lbns)
  137. if err != nil {
  138. logclient.AddActionLogWithContext(ctx, args.oldNet, args.action, err.Error(), args.userCred, false)
  139. return err
  140. }
  141. for _, lbn := range lbns {
  142. addr, _ := netutils.NewIPV4Addr(lbn.IpAddr)
  143. if args.newNet.IsAddressInRange(addr) {
  144. _, err = db.Update(&lbn, func() error {
  145. lbn.NetworkId = args.newNet.Id
  146. return nil
  147. })
  148. if err != nil {
  149. log.Errorln(err)
  150. }
  151. }
  152. }
  153. return nil
  154. }
  155. func (manager *SLoadbalancerManager) handleNetworkIdChange(ctx context.Context, args *networkIdChangeArgs) error {
  156. lbs := make([]SLoadbalancer, 0)
  157. err := db.FetchModelObjects(manager, manager.Query().Equals("network_id", args.oldNet.Id), &lbs)
  158. if err != nil {
  159. logclient.AddActionLogWithContext(ctx, args.oldNet, args.action, err.Error(), args.userCred, false)
  160. return err
  161. }
  162. for _, lb := range lbs {
  163. addr, _ := netutils.NewIPV4Addr(lb.Address)
  164. if args.newNet.IsAddressInRange(addr) {
  165. _, err = db.Update(&lb, func() error {
  166. lb.NetworkId = args.newNet.Id
  167. return nil
  168. })
  169. if err != nil {
  170. log.Errorln(err)
  171. }
  172. }
  173. }
  174. return nil
  175. }