modelarts_pool_sku.go 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308
  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/jsonutils"
  19. "yunion.io/x/pkg/errors"
  20. "yunion.io/x/pkg/util/compare"
  21. "yunion.io/x/sqlchemy"
  22. api "yunion.io/x/onecloud/pkg/apis/compute"
  23. "yunion.io/x/onecloud/pkg/cloudcommon/db"
  24. "yunion.io/x/onecloud/pkg/cloudcommon/db/lockman"
  25. "yunion.io/x/onecloud/pkg/httperrors"
  26. "yunion.io/x/onecloud/pkg/mcclient"
  27. "yunion.io/x/onecloud/pkg/util/stringutils2"
  28. )
  29. type SModelartsPoolSkuManager struct {
  30. db.SExternalizedResourceBaseManager
  31. db.SEnabledStatusStandaloneResourceBaseManager
  32. SCloudregionResourceBaseManager
  33. SManagedResourceBaseManager
  34. }
  35. var ModelartsPoolSkuManager *SModelartsPoolSkuManager
  36. func init() {
  37. ModelartsPoolSkuManager = &SModelartsPoolSkuManager{
  38. SEnabledStatusStandaloneResourceBaseManager: db.NewEnabledStatusStandaloneResourceBaseManager(
  39. SModelartsPoolSku{},
  40. "modelarts_pool_skus_tbl",
  41. "modelarts_pool_sku",
  42. "modelarts_pool_skus",
  43. ),
  44. }
  45. ModelartsPoolSkuManager.NameRequireAscii = false
  46. ModelartsPoolSkuManager.SetVirtualObject(ModelartsPoolSkuManager)
  47. }
  48. type SModelartsPoolSku struct {
  49. db.SEnabledStatusStandaloneResourceBase
  50. db.SExternalizedResourceBase
  51. SCloudregionResourceBase
  52. Type string `width:"128" charset:"ascii" nullable:"true" list:"user" create:"admin_optional" update:"admin"` // 资源规格类型
  53. // CPU 架构 x86|xarm
  54. CpuArch string `width:"16" charset:"ascii" nullable:"true" list:"user" create:"admin_optional" update:"admin"`
  55. //CPU核心数量
  56. CpuCount int `list:"user" create:"admin_optional" update:"admin"`
  57. // GPU卡类型
  58. GpuType string `width:"128" charset:"ascii" nullable:"true" list:"user" create:"admin_optional" update:"admin"`
  59. // GPU卡数量
  60. GpuSize int `nullable:"true" list:"user" create:"admin_optional" update:"admin"`
  61. // NPU卡类型
  62. NpuType string `width:"128" charset:"ascii" nullable:"true" list:"user" create:"admin_optional" update:"admin"`
  63. // NPU卡数量
  64. NpuSize int `nullable:"true" list:"user" create:"admin_optional" update:"admin"`
  65. // 内存
  66. Memory int `nullable:"true" list:"user" create:"admin_optional" update:"admin"`
  67. // 处理器类型
  68. ProcessorType string `width:"128" charset:"ascii" nullable:"true" list:"user" create:"admin_optional" update:"admin"`
  69. }
  70. func (manager *SModelartsPoolSkuManager) GetContextManagers() [][]db.IModelManager {
  71. return [][]db.IModelManager{}
  72. }
  73. func (man *SModelartsPoolSkuManager) ListItemFilter(
  74. ctx context.Context,
  75. q *sqlchemy.SQuery,
  76. userCred mcclient.TokenCredential,
  77. query api.ModelartsPoolSkuListInput,
  78. ) (*sqlchemy.SQuery, error) {
  79. var err error
  80. q, err = man.SEnabledStatusStandaloneResourceBaseManager.ListItemFilter(ctx, q, userCred, query.EnabledStatusStandaloneResourceListInput)
  81. if err != nil {
  82. return nil, errors.Wrap(err, "SEnabledStatusStandaloneResourceBaseManager.ListItemFilter")
  83. }
  84. q, err = man.SExternalizedResourceBaseManager.ListItemFilter(ctx, q, userCred, query.ExternalizedResourceBaseListInput)
  85. if err != nil {
  86. return nil, errors.Wrap(err, "SExternalizedResourceBaseManager.ListItemFilter")
  87. }
  88. q, err = man.SCloudregionResourceBaseManager.ListItemFilter(ctx, q, userCred, query.RegionalFilterListInput)
  89. if err != nil {
  90. return nil, errors.Wrap(err, "SCloudregionResourceBaseManager.ListItemFilter")
  91. }
  92. if len(query.CpuArch) > 0 {
  93. q = q.Equals("cpu_arch", query.CpuArch)
  94. }
  95. if len(query.ProcessorType) > 0 {
  96. q = q.Equals("processor_type", query.ProcessorType)
  97. }
  98. return q, nil
  99. }
  100. func (man *SModelartsPoolSkuManager) OrderByExtraFields(
  101. ctx context.Context,
  102. q *sqlchemy.SQuery,
  103. userCred mcclient.TokenCredential,
  104. query api.ModelartsPoolSkuListInput,
  105. ) (*sqlchemy.SQuery, error) {
  106. q, err := man.SEnabledStatusStandaloneResourceBaseManager.OrderByExtraFields(ctx, q, userCred, query.EnabledStatusStandaloneResourceListInput)
  107. if err != nil {
  108. return nil, errors.Wrap(err, "SVirtualResourceBaseManager.OrderByExtraFields")
  109. }
  110. q, err = man.SExternalizedResourceBaseManager.ListItemFilter(ctx, q, userCred, query.ExternalizedResourceBaseListInput)
  111. if err != nil {
  112. return nil, errors.Wrap(err, "SExternalizedResourceBaseManager.ListItemFilter")
  113. }
  114. q, err = man.SCloudregionResourceBaseManager.OrderByExtraFields(ctx, q, userCred, query.RegionalFilterListInput)
  115. if err != nil {
  116. return nil, errors.Wrap(err, "SCloudregionResourceBaseManager.OrderByExtraFields")
  117. }
  118. return q, nil
  119. }
  120. func (man *SModelartsPoolSkuManager) QueryDistinctExtraField(q *sqlchemy.SQuery, field string) (*sqlchemy.SQuery, error) {
  121. q, err := man.SEnabledStatusStandaloneResourceBaseManager.QueryDistinctExtraField(q, field)
  122. if err == nil {
  123. return q, nil
  124. }
  125. q, err = man.SManagedResourceBaseManager.QueryDistinctExtraField(q, field)
  126. if err == nil {
  127. return q, nil
  128. }
  129. return q, httperrors.ErrNotFound
  130. }
  131. func (manager *SModelartsPoolSkuManager) QueryDistinctExtraFields(q *sqlchemy.SQuery, resource string, fields []string) (*sqlchemy.SQuery, error) {
  132. var err error
  133. q, err = manager.SManagedResourceBaseManager.QueryDistinctExtraFields(q, resource, fields)
  134. if err == nil {
  135. return q, nil
  136. }
  137. return q, httperrors.ErrNotFound
  138. }
  139. func (manager *SModelartsPoolSkuManager) FetchCustomizeColumns(
  140. ctx context.Context,
  141. userCred mcclient.TokenCredential,
  142. query jsonutils.JSONObject,
  143. objs []interface{},
  144. fields stringutils2.SSortedStrings,
  145. isList bool,
  146. ) []api.ModelartsPoolSkuDetails {
  147. rows := make([]api.ModelartsPoolSkuDetails, len(objs))
  148. enabledRows := manager.SEnabledStatusStandaloneResourceBaseManager.FetchCustomizeColumns(ctx, userCred, query, objs, fields, isList)
  149. manRows := manager.SManagedResourceBaseManager.FetchCustomizeColumns(ctx, userCred, query, objs, fields, isList)
  150. regRows := manager.SCloudregionResourceBaseManager.FetchCustomizeColumns(ctx, userCred, query, objs, fields, isList)
  151. for i := range rows {
  152. rows[i] = api.ModelartsPoolSkuDetails{
  153. EnabledStatusStandaloneResourceDetails: enabledRows[i],
  154. ManagedResourceInfo: manRows[i],
  155. CloudregionResourceInfo: regRows[i],
  156. }
  157. }
  158. return rows
  159. }
  160. func (manager *SModelartsPoolSkuManager) ListItemExportKeys(ctx context.Context,
  161. q *sqlchemy.SQuery,
  162. userCred mcclient.TokenCredential,
  163. keys stringutils2.SSortedStrings,
  164. ) (*sqlchemy.SQuery, error) {
  165. var err error
  166. q, err = manager.SEnabledStatusStandaloneResourceBaseManager.ListItemExportKeys(ctx, q, userCred, keys)
  167. if err != nil {
  168. return nil, errors.Wrap(err, "SVirtualResourceBaseManager.ListItemExportKeys")
  169. }
  170. if keys.ContainsAny(manager.SManagedResourceBaseManager.GetExportKeys()...) {
  171. q, err = manager.SManagedResourceBaseManager.ListItemExportKeys(ctx, q, userCred, keys)
  172. if err != nil {
  173. return nil, errors.Wrap(err, "SManagedResourceBaseManager.ListItemExportKeys")
  174. }
  175. }
  176. return q, nil
  177. }
  178. func (self *SCloudregion) GetModelartsPoolSkus() ([]SModelartsPoolSku, error) {
  179. q := ModelartsPoolSkuManager.Query().Equals("cloudregion_id", self.Id)
  180. ret := []SModelartsPoolSku{}
  181. err := db.FetchModelObjects(ModelartsPoolSkuManager, q, &ret)
  182. if err != nil {
  183. return nil, errors.Wrapf(err, "db.FetchModelObjects")
  184. }
  185. return ret, nil
  186. }
  187. func (self *SCloudregion) SyncModelartsPoolSkus(
  188. ctx context.Context,
  189. userCred mcclient.TokenCredential,
  190. provider *SCloudprovider,
  191. exts []cloudprovider.ICloudModelartsPoolSku,
  192. xor bool,
  193. ) compare.SyncResult {
  194. // 加锁防止重入
  195. lockman.LockRawObject(ctx, self.Provider, ModelartsPoolSkuManager.Keyword())
  196. defer lockman.ReleaseRawObject(ctx, self.Provider, ModelartsPoolSkuManager.Keyword())
  197. result := compare.SyncResult{}
  198. dbPoolSku, err := self.GetModelartsPoolSkus()
  199. if err != nil {
  200. result.Error(err)
  201. return result
  202. }
  203. removed := make([]SModelartsPoolSku, 0)
  204. commondb := make([]SModelartsPoolSku, 0)
  205. commonext := make([]cloudprovider.ICloudModelartsPoolSku, 0)
  206. added := make([]cloudprovider.ICloudModelartsPoolSku, 0)
  207. // 本地和云上资源列表进行比对
  208. err = compare.CompareSets(dbPoolSku, exts, &removed, &commondb, &commonext, &added)
  209. if err != nil {
  210. result.Error(err)
  211. return result
  212. }
  213. // 删除云上没有的资源
  214. for i := 0; i < len(removed); i++ {
  215. err := removed[i].Delete(ctx, userCred)
  216. if err != nil {
  217. result.DeleteError(err)
  218. continue
  219. }
  220. result.Delete()
  221. }
  222. if !xor {
  223. // 和云上资源属性进行同步
  224. for i := 0; i < len(commondb); i++ {
  225. err := commondb[i].syncWithCloudSku(ctx, userCred, commonext[i])
  226. if err != nil {
  227. result.UpdateError(err)
  228. continue
  229. }
  230. result.Update()
  231. }
  232. }
  233. // 创建本地没有的云上资源
  234. for i := 0; i < len(added); i++ {
  235. err := self.newFromCloudModelartsPoolSku(ctx, userCred, provider, added[i])
  236. if err != nil {
  237. result.AddError(err)
  238. continue
  239. }
  240. result.Add()
  241. }
  242. return result
  243. }
  244. func (self *SModelartsPoolSku) syncWithCloudSku(ctx context.Context, userCred mcclient.TokenCredential, isku cloudprovider.ICloudModelartsPoolSku) error {
  245. _, err := db.Update(self, func() error {
  246. self.Name = isku.GetName()
  247. self.CpuCount = isku.GetCpuCoreCount()
  248. self.CpuArch = isku.GetCpuArch()
  249. self.Status = isku.GetStatus()
  250. self.Type = isku.GetPoolType()
  251. self.CreatedAt = isku.GetCreatedAt()
  252. self.GpuType = isku.GetGpuType()
  253. self.GpuSize = isku.GetGpuSize()
  254. self.Memory = isku.GetMemorySizeMB()
  255. self.NpuType = isku.GetNpuType()
  256. self.NpuSize = isku.GetNpuSize()
  257. self.ExternalId = isku.GetGlobalId()
  258. self.ProcessorType = isku.GetProcessorType()
  259. return nil
  260. })
  261. return err
  262. }
  263. func (self *SCloudregion) newFromCloudModelartsPoolSku(ctx context.Context, userCred mcclient.TokenCredential, provider *SCloudprovider, isku cloudprovider.ICloudModelartsPoolSku) error {
  264. sku := SModelartsPoolSku{}
  265. sku.SetModelManager(ModelartsPoolSkuManager, &sku)
  266. sku.CloudregionId = self.Id
  267. sku.Name = isku.GetName()
  268. sku.CpuCount = isku.GetCpuCoreCount()
  269. sku.CpuArch = isku.GetCpuArch()
  270. sku.ProcessorType = isku.GetProcessorType()
  271. sku.Status = isku.GetStatus()
  272. sku.Type = isku.GetPoolType()
  273. sku.CreatedAt = isku.GetCreatedAt()
  274. sku.GpuType = isku.GetGpuType()
  275. sku.GpuSize = isku.GetGpuSize()
  276. sku.Memory = isku.GetMemorySizeMB()
  277. sku.NpuType = isku.GetNpuType()
  278. sku.NpuSize = isku.GetNpuSize()
  279. sku.ExternalId = isku.GetGlobalId()
  280. return ModelartsPoolSkuManager.TableSpec().Insert(ctx, &sku)
  281. }