cloudprovidercapacities.go 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  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. "fmt"
  18. "sort"
  19. "yunion.io/x/pkg/errors"
  20. "yunion.io/x/onecloud/pkg/cloudcommon/db"
  21. "yunion.io/x/onecloud/pkg/mcclient"
  22. "yunion.io/x/onecloud/pkg/util/stringutils2"
  23. )
  24. // +onecloud:swagger-gen-ignore
  25. type SCloudproviderCapabilityManager struct {
  26. db.SResourceBaseManager
  27. }
  28. var CloudproviderCapabilityManager *SCloudproviderCapabilityManager
  29. func init() {
  30. CloudproviderCapabilityManager = &SCloudproviderCapabilityManager{
  31. SResourceBaseManager: db.NewResourceBaseManager(
  32. SCloudproviderCapability{},
  33. "cloudprovider_capabilities_tbl",
  34. "cloudprovider_capability",
  35. "cloudprovider_capabilities",
  36. ),
  37. }
  38. CloudproviderCapabilityManager.SetVirtualObject(CloudproviderCapabilityManager)
  39. }
  40. // +onecloud:swagger-gen-ignore
  41. type SCloudproviderCapability struct {
  42. db.SResourceBase
  43. CloudproviderId string `width:"36" charset:"ascii" nullable:"false" primary:"true"`
  44. CloudregionId string `width:"36" charset:"ascii" nullable:"false" default:"" primary:"true"`
  45. Capability string `width:"36" charset:"ascii" nullable:"false" primary:"true"`
  46. }
  47. func (self *SCloudproviderCapability) GetId() string {
  48. return fmt.Sprintf("%s/%s", self.CloudregionId, self.CloudproviderId)
  49. }
  50. func (self *SCloudproviderCapability) GetName() string {
  51. return self.Capability
  52. }
  53. func (manager *SCloudproviderCapabilityManager) setCapabilities(ctx context.Context, userCred mcclient.TokenCredential, cloudproviderId string, capabilities []string) error {
  54. return manager.setRegionCapabilities(ctx, userCred, cloudproviderId, "", capabilities)
  55. }
  56. func (manager *SCloudproviderCapabilityManager) setRegionCapabilities(ctx context.Context, userCred mcclient.TokenCredential, cloudproviderId string, cloudregionId string, capabilities []string) error {
  57. oldCapabilities, err := manager.getRegionCapabilities(cloudproviderId, cloudregionId)
  58. if err != nil {
  59. return errors.Wrap(err, "manager.getCapabilities")
  60. }
  61. oldCapas := stringutils2.NewSortedStrings(oldCapabilities)
  62. newCapas := stringutils2.NewSortedStrings(capabilities)
  63. deleted, _, added := stringutils2.Split(oldCapas, newCapas)
  64. cpc := SCloudproviderCapability{
  65. CloudproviderId: cloudproviderId,
  66. CloudregionId: cloudregionId,
  67. }
  68. cpc.SetModelManager(manager, &cpc)
  69. for _, capability := range added {
  70. cpc.Capability = capability
  71. err := manager.TableSpec().InsertOrUpdate(ctx, &cpc)
  72. if err != nil {
  73. return errors.Wrap(err, "manager.TableSpec().InsertOrUpdate")
  74. }
  75. }
  76. for _, capability := range deleted {
  77. cpc.Capability = capability
  78. err := cpc.Delete(ctx, userCred)
  79. if err != nil {
  80. return errors.Wrap(err, "cpc.Delete")
  81. }
  82. }
  83. return nil
  84. }
  85. func (manager *SCloudproviderCapabilityManager) getCapabilities(cloudproviderId string) ([]string, error) {
  86. return manager.getRegionCapabilities(cloudproviderId, "")
  87. }
  88. func (manager *SCloudproviderCapabilityManager) getRegionCapabilities(cloudproviderId string, cloudregionId string) ([]string, error) {
  89. q := manager.Query().Equals("cloudprovider_id", cloudproviderId).Equals("cloudregion_id", cloudregionId)
  90. capabilities := make([]SCloudproviderCapability, 0)
  91. err := db.FetchModelObjects(manager, q, &capabilities)
  92. if err != nil {
  93. return nil, errors.Wrap(err, "db.FetchModelObjects")
  94. }
  95. capaStrs := make([]string, len(capabilities))
  96. for i := range capabilities {
  97. capaStrs[i] = capabilities[i].Capability
  98. }
  99. sort.Strings(capaStrs)
  100. return capaStrs, nil
  101. }
  102. func (manager *SCloudproviderCapabilityManager) getProvidersCapabilities(providerIds []string) (map[string][]string, error) {
  103. q := manager.Query().In("cloudprovider_id", providerIds).IsNullOrEmpty("cloudregion_id")
  104. capabilities := make([]SCloudproviderCapability, 0)
  105. err := db.FetchModelObjects(manager, q, &capabilities)
  106. if err != nil {
  107. return nil, errors.Wrap(err, "db.FetchModelObjects")
  108. }
  109. ret := map[string][]string{}
  110. for i := range capabilities {
  111. _, ok := ret[capabilities[i].CloudproviderId]
  112. if !ok {
  113. ret[capabilities[i].CloudproviderId] = []string{}
  114. }
  115. ret[capabilities[i].CloudproviderId] = append(ret[capabilities[i].CloudproviderId], capabilities[i].Capability)
  116. }
  117. result := map[string][]string{}
  118. for id, capas := range ret {
  119. sort.Strings(capas)
  120. result[id] = capas
  121. }
  122. return result, nil
  123. }
  124. func (manager *SCloudproviderCapabilityManager) removeCapabilities(ctx context.Context, userCred mcclient.TokenCredential, cloudproviderId string) error {
  125. return manager.removeRegionCapabilities(ctx, userCred, cloudproviderId, "")
  126. }
  127. func (manager *SCloudproviderCapabilityManager) removeRegionCapabilities(ctx context.Context, userCred mcclient.TokenCredential, cloudproviderId string, cloudregionId string) error {
  128. return manager.setRegionCapabilities(ctx, userCred, cloudproviderId, cloudregionId, []string{})
  129. }