skuresource.go 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  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. "database/sql"
  18. "strings"
  19. "yunion.io/x/cloudmux/pkg/cloudprovider"
  20. "yunion.io/x/jsonutils"
  21. "yunion.io/x/pkg/errors"
  22. "yunion.io/x/pkg/utils"
  23. "yunion.io/x/sqlchemy"
  24. apis "yunion.io/x/onecloud/pkg/apis/compute"
  25. "yunion.io/x/onecloud/pkg/cloudcommon/db"
  26. "yunion.io/x/onecloud/pkg/cloudcommon/db/taskman"
  27. "yunion.io/x/onecloud/pkg/httperrors"
  28. "yunion.io/x/onecloud/pkg/mcclient"
  29. )
  30. func PerformActionSyncSkus(ctx context.Context, userCred mcclient.TokenCredential, resourceKey string, input apis.SkuSyncInput) (jsonutils.JSONObject, error) {
  31. if !utils.IsInStringArray(resourceKey, []string{
  32. ServerSkuManager.Keyword(),
  33. ElasticcacheSkuManager.Keyword(),
  34. DBInstanceSkuManager.Keyword(),
  35. NatSkuManager.Keyword(),
  36. NasSkuManager.Keyword(),
  37. }) {
  38. return nil, httperrors.NewUnsupportOperationError("resource %s is not support sync skus", resourceKey)
  39. }
  40. if len(input.Provider) == 0 && len(input.CloudregionIds) == 0 {
  41. return nil, httperrors.NewMissingParameterError("must specific one of `provider` or `cloudregionids`")
  42. }
  43. input.Provider = strings.TrimSpace(input.Provider)
  44. if len(input.Provider) > 0 {
  45. if !utils.IsInStringArray(input.Provider, cloudprovider.GetPublicProviders()) {
  46. return nil, httperrors.NewInputParameterError("Unsupported provider %s", input.Provider)
  47. }
  48. }
  49. // cloudregions to sync
  50. q := CloudregionManager.Query()
  51. if len(input.Provider) > 0 {
  52. q = q.Equals("provider", input.Provider)
  53. } else {
  54. q = q.In("provider", cloudprovider.GetPublicProviders())
  55. }
  56. if len(input.CloudregionIds) > 0 {
  57. q = q.Filter(sqlchemy.OR(sqlchemy.Equals(q.Field("id"), input.CloudregionIds), sqlchemy.Equals(q.Field("name"), input.CloudregionIds)))
  58. }
  59. regions := []SCloudregion{}
  60. err := db.FetchModelObjects(CloudregionManager, q, &regions)
  61. if err != nil && errors.Cause(err) != sql.ErrNoRows {
  62. return nil, httperrors.NewGeneralError(err)
  63. }
  64. if len(input.CloudregionIds) > 0 && len(input.CloudregionIds) != len(regions) {
  65. return nil, httperrors.NewInputParameterError("input data contains invalid cloudregion id")
  66. }
  67. if len(regions) == 0 {
  68. return nil, httperrors.NewInputParameterError("no cloudregion found to sync skus")
  69. }
  70. params := jsonutils.NewDict()
  71. params.Set("resource", jsonutils.NewString(resourceKey))
  72. ret := jsonutils.NewDict()
  73. taskIds := jsonutils.NewArray()
  74. for i := range regions {
  75. err = regions[i].StartSyncSkusTask(ctx, userCred, resourceKey)
  76. if err != nil {
  77. return nil, err
  78. }
  79. }
  80. ret.Set("tasks", taskIds)
  81. return ret, nil
  82. }
  83. func GetPropertySkusSyncTasks(ctx context.Context, userCred mcclient.TokenCredential, query apis.SkuTaskQueryInput) (jsonutils.JSONObject, error) {
  84. tasks := []taskman.STask{}
  85. q := taskman.TaskManager.Query()
  86. q = q.Equals("obj_name", CloudregionManager.Keyword())
  87. q = q.Equals("task_name", "CloudRegionSyncSkusTask")
  88. if len(query.TaskIds) > 0 {
  89. q = q.In("id", query.TaskIds)
  90. } else {
  91. q = q.NotIn("stage", []string{taskman.TASK_STAGE_FAILED, taskman.TASK_STAGE_COMPLETE})
  92. }
  93. err := q.All(&tasks)
  94. if err != nil {
  95. return nil, httperrors.NewGeneralError(err)
  96. }
  97. ret := jsonutils.NewDict()
  98. items := jsonutils.NewArray()
  99. for i := range tasks {
  100. item := jsonutils.NewDict()
  101. item.Set("id", jsonutils.NewString(tasks[i].GetId()))
  102. item.Set("created_at", jsonutils.NewTimeString(tasks[i].GetStartTime()))
  103. item.Set("stage", jsonutils.NewString(tasks[i].Stage))
  104. items.Add(item)
  105. }
  106. ret.Set("tasks", items)
  107. return ret, nil
  108. }