external.go 3.4 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 db
  15. import (
  16. "context"
  17. "database/sql"
  18. "time"
  19. "yunion.io/x/sqlchemy"
  20. "yunion.io/x/onecloud/pkg/apis"
  21. "yunion.io/x/onecloud/pkg/mcclient"
  22. )
  23. // +onecloud:model-api-gen
  24. type SExternalizedResourceBase struct {
  25. // 云上Id, 对应云上资源自身Id
  26. ExternalId string `width:"256" charset:"utf8" index:"true" list:"user" create:"domain_optional" update:"admin" json:"external_id"`
  27. // 资源导入时间
  28. ImportedAt time.Time `nullable:"true" created_at:"true" index:"true" get:"user" list:"user" json:"imported_at"`
  29. // 资源来源, cloud: 从云上同步下来的资源, local: 从本地创建的资源或资源在本地更改过项目
  30. Source string `width:"12" charset:"ascii" get:"user" list:"user" create:"optional" json:"source"`
  31. }
  32. func (model *SExternalizedResourceBase) BeforeInsert() {
  33. model.Source = apis.EXTERNAL_RESOURCE_SOURCE_LOCAL
  34. if len(model.ExternalId) > 0 {
  35. model.Source = apis.EXTERNAL_RESOURCE_SOURCE_CLOUD
  36. }
  37. }
  38. type SExternalizedResourceBaseManager struct{}
  39. func (model SExternalizedResourceBase) GetExternalId() string {
  40. return model.ExternalId
  41. }
  42. func (model *SExternalizedResourceBase) SetExternalId(idStr string) {
  43. model.ExternalId = idStr
  44. }
  45. type IExternalizedModelManager interface {
  46. IModelManager
  47. FetchByExternalId(idStr string) IExternalizedModel
  48. }
  49. type IExternalizedModel interface {
  50. IModel
  51. GetExternalId() string
  52. SetExternalId(idStr string)
  53. }
  54. func SetExternalId(model IExternalizedModel, userCred mcclient.TokenCredential, idStr string) error {
  55. if model.GetExternalId() != idStr {
  56. diff, err := Update(model, func() error {
  57. model.SetExternalId(idStr)
  58. return nil
  59. })
  60. if err == nil {
  61. OpsLog.LogEvent(model, ACT_UPDATE, diff, userCred)
  62. }
  63. return err
  64. }
  65. return nil
  66. }
  67. func FetchByExternalId(manager IModelManager, idStr string) (IExternalizedModel, error) {
  68. return FetchByExternalIdAndManagerId(manager, idStr, func(q *sqlchemy.SQuery) *sqlchemy.SQuery {
  69. return q
  70. })
  71. }
  72. func FetchByExternalIdAndManagerId(manager IModelManager, idStr string, filter func(q *sqlchemy.SQuery) *sqlchemy.SQuery) (IExternalizedModel, error) {
  73. q := manager.Query().Equals("external_id", idStr)
  74. q = filter(q)
  75. count, err := q.CountWithError()
  76. if err != nil {
  77. return nil, err
  78. }
  79. if count == 1 {
  80. obj, err := NewModelObject(manager)
  81. if err != nil {
  82. return nil, err
  83. }
  84. err = q.First(obj)
  85. if err != nil {
  86. return nil, err
  87. } else {
  88. return obj.(IExternalizedModel), nil
  89. }
  90. } else if count > 1 {
  91. return nil, sqlchemy.ErrDuplicateEntry
  92. } else {
  93. return nil, sql.ErrNoRows
  94. }
  95. }
  96. func (manager *SExternalizedResourceBaseManager) ListItemFilter(
  97. ctx context.Context,
  98. q *sqlchemy.SQuery,
  99. userCred mcclient.TokenCredential,
  100. query apis.ExternalizedResourceBaseListInput,
  101. ) (*sqlchemy.SQuery, error) {
  102. if len(query.ExternalId) > 0 {
  103. q = q.Equals("external_id", query.ExternalId)
  104. }
  105. return q, nil
  106. }