syncutils.go 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  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. "strings"
  18. "yunion.io/x/cloudmux/pkg/cloudprovider"
  19. "yunion.io/x/log"
  20. "yunion.io/x/onecloud/pkg/apis"
  21. "yunion.io/x/onecloud/pkg/cloudcommon/db"
  22. "yunion.io/x/onecloud/pkg/compute/options"
  23. "yunion.io/x/onecloud/pkg/mcclient"
  24. )
  25. type IMetadataSetter interface {
  26. SetCloudMetadataAll(ctx context.Context, meta map[string]string, userCred mcclient.TokenCredential, readOnly bool) error
  27. SetSysCloudMetadataAll(ctx context.Context, meta map[string]string, userCred mcclient.TokenCredential, readOnly bool) error
  28. Keyword() string
  29. GetName() string
  30. GetCloudproviderId() string
  31. }
  32. type IVirtualResourceMetadataSetter interface {
  33. IMetadataSetter
  34. SetSystemInfo(isSystem bool) error
  35. }
  36. func syncMetadata(ctx context.Context, userCred mcclient.TokenCredential, model IMetadataSetter, remote cloudprovider.ICloudResource, readOnly bool) error {
  37. sysTags := remote.GetSysTags()
  38. sysStore := make(map[string]string, 0)
  39. for key, value := range sysTags {
  40. key = strings.TrimSpace(key)
  41. value = strings.TrimSpace(value)
  42. sysStore[db.SYS_CLOUD_TAG_PREFIX+key] = value
  43. }
  44. if options.Options.KeepTagLocalization {
  45. readOnly = true
  46. }
  47. model.SetSysCloudMetadataAll(ctx, sysStore, userCred, readOnly)
  48. tags, err := remote.GetTags()
  49. if err == nil {
  50. store := make(map[string]string, 0)
  51. for key, value := range tags {
  52. key = strings.TrimSpace(key)
  53. value = strings.TrimSpace(value)
  54. store[db.CLOUD_TAG_PREFIX+key] = value
  55. }
  56. model.SetCloudMetadataAll(ctx, store, userCred, readOnly)
  57. }
  58. return nil
  59. }
  60. func syncVirtualResourceMetadata(ctx context.Context, userCred mcclient.TokenCredential, model IVirtualResourceMetadataSetter, remote cloudprovider.IVirtualResource, readOnly bool) error {
  61. sysTags := remote.GetSysTags()
  62. sysStore := make(map[string]string, 0)
  63. for key, value := range sysTags {
  64. key = strings.TrimSpace(key)
  65. value = strings.TrimSpace(value)
  66. if key == apis.IS_SYSTEM && value == "true" {
  67. model.SetSystemInfo(true)
  68. }
  69. sysStore[db.SYS_CLOUD_TAG_PREFIX+key] = value
  70. }
  71. extProjectId := remote.GetProjectId()
  72. if len(extProjectId) > 0 {
  73. extProject, err := ExternalProjectManager.GetProject(extProjectId, model.GetCloudproviderId())
  74. if err != nil {
  75. log.Errorf("sync project metadata for %s %s error: %v", model.Keyword(), model.GetName(), err)
  76. } else {
  77. sysStore[db.SYS_CLOUD_TAG_PREFIX+"project"] = extProject.Name
  78. }
  79. }
  80. if options.Options.KeepTagLocalization {
  81. readOnly = true
  82. }
  83. model.SetSysCloudMetadataAll(ctx, sysStore, userCred, readOnly)
  84. tags, err := remote.GetTags()
  85. if err == nil {
  86. store := make(map[string]string, 0)
  87. for key, value := range tags {
  88. key = strings.TrimSpace(key)
  89. value = strings.TrimSpace(value)
  90. store[db.CLOUD_TAG_PREFIX+key] = value
  91. }
  92. model.SetCloudMetadataAll(ctx, store, userCred, readOnly)
  93. }
  94. return nil
  95. }
  96. func SyncMetadata(ctx context.Context, userCred mcclient.TokenCredential, model IMetadataSetter, remote cloudprovider.ICloudResource, readOnly bool) error {
  97. return syncMetadata(ctx, userCred, model, remote, readOnly)
  98. }
  99. func SyncVirtualResourceMetadata(ctx context.Context, userCred mcclient.TokenCredential, model IVirtualResourceMetadataSetter, remote cloudprovider.IVirtualResource, readOnly bool) error {
  100. return syncVirtualResourceMetadata(ctx, userCred, model, remote, readOnly)
  101. }