host_watch.go 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  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/cloudmux/pkg/cloudprovider"
  18. "yunion.io/x/log"
  19. "yunion.io/x/pkg/errors"
  20. "yunion.io/x/sqlchemy"
  21. api "yunion.io/x/onecloud/pkg/apis/compute"
  22. "yunion.io/x/onecloud/pkg/mcclient"
  23. )
  24. func RefreshCloudproviderHostStatus(ctx context.Context, userCred mcclient.TokenCredential, isStart bool) {
  25. if isStart {
  26. return
  27. }
  28. vmwareFilter := api.ManagedResourceListInput{}
  29. vmwareFilter.Providers = []string{api.CLOUD_PROVIDER_VMWARE}
  30. for _, filter := range []api.ManagedResourceListInput{
  31. vmwareFilter,
  32. } {
  33. err := refreshCloudproviderHostStatus(ctx, userCred, filter)
  34. if err != nil {
  35. log.Errorf("refreshCloudproviderHostStatus fail %s", err)
  36. }
  37. }
  38. }
  39. func refreshCloudproviderHostStatus(ctx context.Context, userCred mcclient.TokenCredential, filter api.ManagedResourceListInput) error {
  40. crs, err := CloudproviderRegionManager.FetchCloudproviderRegions(func(q *sqlchemy.SQuery) (*sqlchemy.SQuery, error) {
  41. var err error
  42. q, err = CloudproviderRegionManager.SManagedResourceBaseManager.ListItemFilter(ctx, q, userCred, filter)
  43. if err != nil {
  44. return nil, errors.Wrap(err, "SManagedResourceBaseManager.ListItemFilter")
  45. }
  46. return q, nil
  47. })
  48. if err != nil {
  49. return errors.Wrap(err, "FetchCloudproviderRegions")
  50. }
  51. log.Debugf("refreshCloudproviderHostStatus count %d", len(crs))
  52. var errs []error
  53. for i := range crs {
  54. err := crs[i].doSyncHostsStatus(ctx, userCred)
  55. if err != nil {
  56. log.Errorf("DoSyncHostsStatus fail %s", err)
  57. errs = append(errs, err)
  58. }
  59. }
  60. if len(errs) > 0 {
  61. return errors.NewAggregate(errs)
  62. }
  63. return nil
  64. }
  65. func (cr *SCloudproviderregion) doSyncHostsStatus(ctx context.Context, userCred mcclient.TokenCredential) error {
  66. localRegion, err := cr.GetRegion()
  67. if err != nil {
  68. return errors.Wrapf(err, "GetRegion")
  69. }
  70. provider, err := cr.GetProvider()
  71. if err != nil {
  72. return errors.Wrapf(err, "GetProvider")
  73. }
  74. log.Infof("doSyncHostsStatus for provider %s(%s) region %s(%s)", provider.Name, provider.Id, localRegion.Name, localRegion.Id)
  75. driver, err := provider.GetProvider(ctx)
  76. if err != nil {
  77. log.Errorf("Failed to get driver, connection problem?")
  78. return errors.Wrap(err, "GetProvider")
  79. }
  80. var remoteRegion cloudprovider.ICloudRegion
  81. if localRegion.isManaged() {
  82. var err error
  83. remoteRegion, err = driver.GetIRegionById(localRegion.ExternalId)
  84. if err != nil {
  85. return errors.Wrap(err, "GetIRegionById")
  86. }
  87. } else {
  88. var err error
  89. remoteRegion, err = driver.GetOnPremiseIRegion()
  90. if err != nil {
  91. return errors.Wrap(err, "GetOnPremiseIRegion")
  92. }
  93. }
  94. extHosts, err := remoteRegion.GetIHosts()
  95. if err != nil {
  96. return errors.Wrap(err, "GetIHosts")
  97. }
  98. _, _, results := HostManager.SyncHosts(ctx, userCred, provider, nil, localRegion, extHosts, false)
  99. if results.IsError() {
  100. return errors.Wrap(results.AllError(), "SyncHosts")
  101. }
  102. log.Infof("End of doSyncHostsStatus for provider %s(%s) region %s(%s)", provider.Name, provider.Id, localRegion.Name, localRegion.Id)
  103. return nil
  104. }