metric_field.go 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221
  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. "yunion.io/x/jsonutils"
  19. "yunion.io/x/pkg/errors"
  20. "yunion.io/x/pkg/tristate"
  21. "yunion.io/x/pkg/util/rbacscope"
  22. "yunion.io/x/pkg/utils"
  23. "yunion.io/x/sqlchemy"
  24. "yunion.io/x/onecloud/pkg/apis/monitor"
  25. "yunion.io/x/onecloud/pkg/cloudcommon/db"
  26. "yunion.io/x/onecloud/pkg/httperrors"
  27. "yunion.io/x/onecloud/pkg/mcclient"
  28. "yunion.io/x/onecloud/pkg/util/stringutils2"
  29. )
  30. // +onecloud:swagger-gen-model-singular=metricfield
  31. // +onecloud:swagger-gen-model-plural=metricfields
  32. type SMetricFieldManager struct {
  33. db.SEnabledResourceBaseManager
  34. db.SStatusStandaloneResourceBaseManager
  35. db.SScopedResourceBaseManager
  36. }
  37. type SMetricField struct {
  38. //db.SVirtualResourceBase
  39. db.SEnabledResourceBase
  40. db.SStatusStandaloneResourceBase
  41. db.SScopedResourceBase
  42. DisplayName string `width:"256" list:"user" update:"user"`
  43. Unit string `width:"32" list:"user" update:"user"`
  44. ValueType string `width:"32" list:"user" update:"user"`
  45. Score int `width:"32" list:"user" update:"user" default:"99"`
  46. }
  47. var MetricFieldManager *SMetricFieldManager
  48. func init() {
  49. MetricFieldManager = &SMetricFieldManager{
  50. SStatusStandaloneResourceBaseManager: db.NewStatusStandaloneResourceBaseManager(
  51. SMetricField{},
  52. "metricfield_tbl",
  53. "metricfield",
  54. "metricfields",
  55. ),
  56. }
  57. MetricFieldManager.SetVirtualObject(MetricFieldManager)
  58. }
  59. func (manager *SMetricFieldManager) NamespaceScope() rbacscope.TRbacScope {
  60. return rbacscope.ScopeSystem
  61. }
  62. func (manager *SMetricFieldManager) ListItemExportKeys(ctx context.Context, q *sqlchemy.SQuery,
  63. userCred mcclient.TokenCredential, keys stringutils2.SSortedStrings) (*sqlchemy.SQuery, error) {
  64. q, err := manager.SStatusStandaloneResourceBaseManager.ListItemExportKeys(ctx, q, userCred, keys)
  65. if err != nil {
  66. return nil, errors.Wrap(err, "SStatusStandaloneResourceBaseManager.ListItemExportKeys")
  67. }
  68. q, err = manager.SScopedResourceBaseManager.ListItemExportKeys(ctx, q, userCred, keys)
  69. if err != nil {
  70. return nil, errors.Wrap(err, "SScopedResourceBaseManager.ListItemExportKeys")
  71. }
  72. return q, nil
  73. }
  74. func (man *SMetricFieldManager) ValidateCreateData(
  75. ctx context.Context, userCred mcclient.TokenCredential,
  76. ownerId mcclient.IIdentityProvider, query jsonutils.JSONObject,
  77. data monitor.MetricFieldCreateInput) (monitor.MetricFieldCreateInput, error) {
  78. return data, nil
  79. }
  80. func (field *SMetricField) ValidateUpdateData(
  81. ctx context.Context,
  82. userCred mcclient.TokenCredential,
  83. query jsonutils.JSONObject,
  84. data monitor.MetricFieldUpdateInput,
  85. ) (monitor.MetricFieldUpdateInput, error) {
  86. if len(data.DisplayName) == 0 {
  87. return data, errors.Wrap(httperrors.ErrNotEmpty, "display_name")
  88. }
  89. if len(data.Unit) == 0 {
  90. return data, errors.Wrap(httperrors.ErrNotEmpty, "unit")
  91. }
  92. if !utils.IsInStringArray(data.Unit, monitor.MetricUnit) {
  93. return data, errors.Wrap(httperrors.ErrBadRequest, "unit")
  94. }
  95. return data, nil
  96. }
  97. func (manager *SMetricFieldManager) ListItemFilter(
  98. ctx context.Context, q *sqlchemy.SQuery,
  99. userCred mcclient.TokenCredential,
  100. query monitor.MetricFieldListInput,
  101. ) (*sqlchemy.SQuery, error) {
  102. var err error
  103. q, err = manager.SStandaloneResourceBaseManager.ListItemFilter(ctx, q, userCred, query.StandaloneResourceListInput)
  104. if err != nil {
  105. return nil, errors.Wrap(err, "SStandaloneResourceBaseManager.ListItemFilter")
  106. }
  107. q, err = manager.SEnabledResourceBaseManager.ListItemFilter(ctx, q, userCred, query.EnabledResourceBaseListInput)
  108. if err != nil {
  109. return nil, errors.Wrap(err, "SEnabledResourceBaseManager.ListItemFilter")
  110. }
  111. q, err = manager.SScopedResourceBaseManager.ListItemFilter(ctx, q, userCred,
  112. query.ScopedResourceBaseListInput)
  113. if err != nil {
  114. return nil, errors.Wrap(err, "SScopedResourceBaseManager.ListItemFilter")
  115. }
  116. if len(query.DisplayName) != 0 {
  117. //q = q.Equals("display_name", query.DisplayName)
  118. q = q.Filter(sqlchemy.Like(q.Field("display_name"), query.DisplayName))
  119. }
  120. if len(query.Unit) != 0 {
  121. q = q.Equals("unit", query.Unit)
  122. }
  123. return q, nil
  124. }
  125. func (man *SMetricFieldManager) FetchCustomizeColumns(
  126. ctx context.Context,
  127. userCred mcclient.TokenCredential,
  128. query jsonutils.JSONObject,
  129. objs []interface{},
  130. fields stringutils2.SSortedStrings,
  131. isList bool,
  132. ) []monitor.MetricFieldDetail {
  133. rows := make([]monitor.MetricFieldDetail, len(objs))
  134. return rows
  135. }
  136. func (man *SMetricFieldManager) OrderByExtraFields(
  137. ctx context.Context,
  138. q *sqlchemy.SQuery,
  139. userCred mcclient.TokenCredential,
  140. input monitor.AlertListInput,
  141. ) (*sqlchemy.SQuery, error) {
  142. var err error
  143. q, err = man.SStatusStandaloneResourceBaseManager.OrderByExtraFields(ctx, q, userCred, input.StatusStandaloneResourceListInput)
  144. if err != nil {
  145. return nil, errors.Wrap(err, "SStandaloneResourceBaseManager.OrderByExtraFields")
  146. }
  147. q, err = man.SScopedResourceBaseManager.OrderByExtraFields(ctx, q, userCred, input.ScopedResourceBaseListInput)
  148. if err != nil {
  149. return nil, errors.Wrap(err, "SScopedResourceBaseManager.OrderByExtraFields")
  150. }
  151. return q, nil
  152. }
  153. func (manager *SMetricFieldManager) SaveMetricField(ctx context.Context, userCred mcclient.TokenCredential,
  154. ownerId mcclient.IIdentityProvider, fieldInput monitor.MetricFieldCreateInput) (*SMetricField, error) {
  155. field := new(SMetricField)
  156. field.Name = fieldInput.Name
  157. field.DisplayName = fieldInput.DisplayName
  158. field.Description = fieldInput.Description
  159. field.Unit = fieldInput.Unit
  160. field.ValueType = fieldInput.ValueType
  161. field.Enabled = tristate.True
  162. field.SetModelManager(manager, field)
  163. if err := manager.TableSpec().Insert(ctx, field); err != nil {
  164. return nil, errors.Wrapf(err, "insert config %#v", field)
  165. }
  166. return field, nil
  167. }
  168. func (man *SMetricFieldManager) GetFieldByIdOrName(ctx context.Context, id string, userCred mcclient.TokenCredential) (*SMetricField, error) {
  169. obj, err := man.FetchByIdOrName(ctx, userCred, id)
  170. if err != nil {
  171. if errors.Cause(err) == sql.ErrNoRows {
  172. return nil, nil
  173. }
  174. return nil, err
  175. }
  176. return obj.(*SMetricField), nil
  177. }
  178. func (self *SMetricField) CustomizeDelete(
  179. ctx context.Context, userCred mcclient.TokenCredential,
  180. query jsonutils.JSONObject, data jsonutils.JSONObject) error {
  181. metricJoint, err := self.getMetricJoint()
  182. if err != nil {
  183. return err
  184. }
  185. for _, joint := range metricJoint {
  186. if err := joint.Detach(ctx, userCred); err != nil {
  187. return err
  188. }
  189. }
  190. return nil
  191. }
  192. func (self *SMetricField) getMetricJoint() ([]SMetric, error) {
  193. metricJoint := make([]SMetric, 0)
  194. q := MetricManager.Query().Equals(MetricManager.GetSlaveFieldName(), self.Id)
  195. if err := db.FetchModelObjects(MetricManager, q, &metricJoint); err != nil {
  196. return nil, err
  197. }
  198. return metricJoint, nil
  199. }