script_apply_record.go 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180
  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. "time"
  18. "yunion.io/x/jsonutils"
  19. "yunion.io/x/log"
  20. "yunion.io/x/pkg/util/rbacscope"
  21. "yunion.io/x/sqlchemy"
  22. api "yunion.io/x/onecloud/pkg/apis/devtool"
  23. "yunion.io/x/onecloud/pkg/cloudcommon/db"
  24. "yunion.io/x/onecloud/pkg/mcclient"
  25. "yunion.io/x/onecloud/pkg/util/stringutils2"
  26. )
  27. type SScriptApplyRecord struct {
  28. db.SStatusStandaloneResourceBase
  29. ScriptApplyId string `width:"36" charset:"ascii" nullable:"true" list:"user" index:"true"`
  30. StartTime time.Time `list:"user"`
  31. EndTime time.Time `list:"user"`
  32. Reason string `list:"user"`
  33. FailCode string `list:"user"`
  34. }
  35. type SScriptApplyRecordManager struct {
  36. db.SStatusStandaloneResourceBaseManager
  37. }
  38. var ScriptApplyRecordManager *SScriptApplyRecordManager
  39. func init() {
  40. ScriptApplyRecordManager = &SScriptApplyRecordManager{
  41. SStatusStandaloneResourceBaseManager: db.NewStatusStandaloneResourceBaseManager(
  42. SScriptApplyRecord{},
  43. "scriptapplyrecord_tbl",
  44. "scriptapplyrecord",
  45. "scriptapplyrecords",
  46. ),
  47. }
  48. ScriptApplyRecordManager.SetVirtualObject(ScriptApplyRecordManager)
  49. }
  50. func (sarm *SScriptApplyRecordManager) ListItemFilter(ctx context.Context, q *sqlchemy.SQuery, userCred mcclient.TokenCredential, input api.ScriptApplyRecoredListInput) (*sqlchemy.SQuery, error) {
  51. q, err := sarm.SStatusStandaloneResourceBaseManager.ListItemFilter(ctx, q, userCred, input.StatusStandaloneResourceListInput)
  52. if err != nil {
  53. return q, err
  54. }
  55. if len(input.ScriptApplyId) > 0 {
  56. q = q.Equals("script_apply_id", input.ScriptApplyId)
  57. }
  58. if len(input.ScriptId) > 0 || len(input.ServerId) > 0 {
  59. saq := ScriptApplyManager.Query("id")
  60. if len(input.ScriptId) > 0 {
  61. saq = saq.Equals("script_id", input.ScriptId)
  62. }
  63. if len(input.ServerId) > 0 {
  64. saq = saq.Equals("guest_id", input.ServerId)
  65. }
  66. saqSub := saq.SubQuery()
  67. q = q.Join(saqSub, sqlchemy.Equals(q.Field("script_apply_id"), saqSub.Field("id")))
  68. }
  69. return q, nil
  70. }
  71. func (sarm *SScriptApplyRecordManager) FetchCustomizeColumns(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject, objs []interface{}, fields stringutils2.SSortedStrings, isList bool) []api.ScriptApplyRecordDetails {
  72. sDetails := sarm.SStandaloneResourceBaseManager.FetchCustomizeColumns(ctx, userCred, query, objs, fields, isList)
  73. details := make([]api.ScriptApplyRecordDetails, len(objs))
  74. for i := range details {
  75. details[i].StandaloneResourceDetails = sDetails[i]
  76. scriptApplyRecord := objs[i].(*SScriptApplyRecord)
  77. sa, err := scriptApplyRecord.ScriptApply()
  78. if err != nil {
  79. log.Errorf("unable to get SScriptApply: %v", err)
  80. }
  81. details[i].ScriptId = sa.ScriptId
  82. details[i].ServerId = sa.GuestId
  83. }
  84. return details
  85. }
  86. func (sar *SScriptApplyRecord) ScriptApply() (*SScriptApply, error) {
  87. obj, err := ScriptApplyManager.FetchById(sar.ScriptApplyId)
  88. if err != nil {
  89. return nil, err
  90. }
  91. return obj.(*SScriptApply), nil
  92. }
  93. func (sarm *SScriptApplyRecordManager) CreateRecord(ctx context.Context, scriptApplyId string) (*SScriptApplyRecord, error) {
  94. return sarm.createRecordWithResult(ctx, scriptApplyId, nil, "")
  95. }
  96. func (sarm *SScriptApplyRecordManager) createRecordWithResult(ctx context.Context, scriptApplyId string, success *bool, reason string) (*SScriptApplyRecord, error) {
  97. now := time.Now()
  98. sar := &SScriptApplyRecord{
  99. StartTime: now,
  100. ScriptApplyId: scriptApplyId,
  101. }
  102. if success == nil {
  103. sar.Status = api.SCRIPT_APPLY_RECORD_APPLYING
  104. } else if *success {
  105. sar.Status = api.SCRIPT_APPLY_RECORD_SUCCEED
  106. } else if !*success {
  107. sar.Status = api.SCRIPT_APPLY_RECORD_FAILED
  108. }
  109. sar.Reason = reason
  110. err := sarm.TableSpec().Insert(ctx, sar)
  111. if err != nil {
  112. return nil, err
  113. }
  114. sar.SetModelManager(sarm, sar)
  115. return sar, nil
  116. }
  117. func (sarm *SScriptApplyRecordManager) NamespaceScope() rbacscope.TRbacScope {
  118. return rbacscope.ScopeProject
  119. }
  120. func (sarm *SScriptApplyRecordManager) ResourceScope() rbacscope.TRbacScope {
  121. return rbacscope.ScopeProject
  122. }
  123. func (sarm *SScriptApplyRecordManager) FileterByOwner(q *sqlchemy.SQuery, owner mcclient.IIdentityProvider, scope rbacscope.TRbacScope) *sqlchemy.SQuery {
  124. if owner != nil {
  125. switch scope {
  126. case rbacscope.ScopeProject, rbacscope.ScopeDomain:
  127. scriptQ := ScriptManager.Query("id", "domain_id").SubQuery()
  128. q = q.Join(scriptQ, sqlchemy.Equals(q.Field("script_id"), scriptQ.Field("id")))
  129. q = q.Filter(sqlchemy.Equals(scriptQ.Field("domain_id"), owner.GetProjectDomainId()))
  130. }
  131. }
  132. return q
  133. }
  134. func (sarm *SScriptApplyRecordManager) FetchOwnerId(ctx context.Context, data jsonutils.JSONObject) (mcclient.IIdentityProvider, error) {
  135. return db.FetchDomainInfo(ctx, data)
  136. }
  137. func (sar *SScriptApplyRecord) GetOwnerId() mcclient.IIdentityProvider {
  138. obj, _ := ScriptApplyManager.FetchById(sar.ScriptApplyId)
  139. if obj == nil {
  140. return nil
  141. }
  142. return obj.GetOwnerId()
  143. }
  144. func (sar *SScriptApplyRecord) SetResult(status, failCode, reason string) error {
  145. _, err := db.Update(sar, func() error {
  146. sar.Status = status
  147. sar.Reason = reason
  148. sar.FailCode = failCode
  149. sar.EndTime = time.Now()
  150. return nil
  151. })
  152. return err
  153. }
  154. func (sar *SScriptApplyRecord) Fail(code string, reason string) error {
  155. return sar.SetResult(api.SCRIPT_APPLY_RECORD_FAILED, code, reason)
  156. }
  157. func (sar *SScriptApplyRecord) Succeed(reason string) error {
  158. return sar.SetResult(api.SCRIPT_APPLY_RECORD_SUCCEED, "", reason)
  159. }