guestnetwork_traffic_log.go 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227
  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. "github.com/golang-plus/errors"
  19. "yunion.io/x/jsonutils"
  20. "yunion.io/x/pkg/util/rbacscope"
  21. "yunion.io/x/sqlchemy"
  22. api "yunion.io/x/onecloud/pkg/apis/compute"
  23. guest_api "yunion.io/x/onecloud/pkg/apis/compute/guest"
  24. "yunion.io/x/onecloud/pkg/cloudcommon/consts"
  25. "yunion.io/x/onecloud/pkg/cloudcommon/db"
  26. "yunion.io/x/onecloud/pkg/mcclient"
  27. "yunion.io/x/onecloud/pkg/util/stringutils2"
  28. )
  29. type SGuestNetworkTrafficLogManager struct {
  30. db.SLogBaseManager
  31. db.SProjectizedResourceBaseManager
  32. SGuestResourceBaseManager
  33. SNetworkResourceBaseManager
  34. }
  35. type SGuestNetworkTrafficLog struct {
  36. db.SLogBase
  37. db.SProjectizedResourceBase
  38. SGuestResourceBase
  39. SNetworkResourceBase
  40. // MAC地址
  41. Mac string `width:"32" charset:"ascii" nullable:"false" list:"user"`
  42. // IPv4地址
  43. IpAddr string `width:"16" charset:"ascii" nullable:"true" list:"user"`
  44. // IPv6地址
  45. Ip6Addr string `width:"64" charset:"ascii" nullable:"true" list:"user"`
  46. // 下行流量,单位 bytes
  47. RxBytes int64 `nullable:"false" default:"0" list:"user" old_name:"rx_traffic_used"`
  48. // 上行流量,单位 bytes
  49. TxBytes int64 `nullable:"false" default:"0" list:"user" old_name:"tx_traffic_used"`
  50. ReportAt time.Time `nullable:"false" list:"user"`
  51. State guest_api.GuestNetworkTrafficState `width:"10" charset:"ascii" nullable:"false" default:"" list:"user" json:"state"`
  52. }
  53. var GuestNetworkTrafficLogManager *SGuestNetworkTrafficLogManager
  54. var _ db.IModelManager = (*SGuestNetworkTrafficLogManager)(nil)
  55. var _ db.IModel = (*SGuestNetworkTrafficLog)(nil)
  56. func InitGuestNetworkTrafficLog() {
  57. GuestNetworkTrafficLogManager = &SGuestNetworkTrafficLogManager{
  58. SLogBaseManager: db.NewLogBaseManager(SGuestNetworkTrafficLog{},
  59. "guest_network_traffic_log_tbl",
  60. "guest_network_traffic_log",
  61. "guest_network_traffic_logs",
  62. "report_at", consts.OpsLogWithClickhouse),
  63. }
  64. GuestNetworkTrafficLogManager.SetVirtualObject(GuestNetworkTrafficLogManager)
  65. }
  66. // 操作日志列表
  67. func (manager *SGuestNetworkTrafficLogManager) ListItemFilter(
  68. ctx context.Context,
  69. q *sqlchemy.SQuery,
  70. userCred mcclient.TokenCredential,
  71. input guest_api.GuestNetworkTrafficLogListInput,
  72. ) (*sqlchemy.SQuery, error) {
  73. var err error
  74. q, err = manager.SGuestResourceBaseManager.ListItemFilter(ctx, q, userCred, input.ServerFilterListInput)
  75. if err != nil {
  76. return nil, errors.Wrap(err, "SGuestResourceBaseManager.ListItemFilter")
  77. }
  78. q, err = manager.SNetworkResourceBaseManager.ListItemFilter(ctx, q, userCred, input.NetworkFilterListInput)
  79. if err != nil {
  80. return nil, errors.Wrap(err, "SNetworkResourceBaseManager.ListItemFilter")
  81. }
  82. q, err = manager.SProjectizedResourceBaseManager.ListItemFilter(ctx, q, userCred, input.ProjectizedResourceListInput)
  83. if err != nil {
  84. return nil, errors.Wrap(err, "SProjectizedResourceBaseManager.ListItemFilter")
  85. }
  86. if len(input.IpAddr) > 0 {
  87. q = q.In("ip_addr", input.IpAddr)
  88. }
  89. if len(input.Ip6Addr) > 0 {
  90. q = q.In("ip6_addr", input.Ip6Addr)
  91. }
  92. if !input.Since.IsZero() {
  93. q = q.GT("ops_time", input.Since)
  94. }
  95. if !input.Until.IsZero() {
  96. q = q.LE("ops_time", input.Until)
  97. }
  98. if len(input.State) > 0 {
  99. q = q.In("state", input.State)
  100. }
  101. return q, nil
  102. }
  103. func (manager *SGuestNetworkTrafficLogManager) ListItemExportKeys(ctx context.Context, q *sqlchemy.SQuery, userCred mcclient.TokenCredential, keys stringutils2.SSortedStrings) (*sqlchemy.SQuery, error) {
  104. var err error
  105. q, err = manager.SGuestResourceBaseManager.ListItemExportKeys(ctx, q, userCred, keys)
  106. if err != nil {
  107. return nil, errors.Wrap(err, "SGuestResourceBaseManager.ListItemExportKeys")
  108. }
  109. q, err = manager.SNetworkResourceBaseManager.ListItemExportKeys(ctx, q, userCred, keys)
  110. if err != nil {
  111. return nil, errors.Wrap(err, "SNetworkResourceBaseManager.ListItemExportKeys")
  112. }
  113. q, err = manager.SProjectizedResourceBaseManager.ListItemExportKeys(ctx, q, userCred, keys)
  114. if err != nil {
  115. return nil, errors.Wrap(err, "SProjectizedResourceBaseManager.ListItemExportKeys")
  116. }
  117. return q, nil
  118. }
  119. func (manager *SGuestNetworkTrafficLogManager) QueryDistinctExtraField(q *sqlchemy.SQuery, field string) (*sqlchemy.SQuery, error) {
  120. var err error
  121. q, err = manager.SGuestResourceBaseManager.QueryDistinctExtraField(q, field)
  122. if err != nil {
  123. return nil, errors.Wrap(err, "SGuestResourceBaseManager.QueryDistinctExtraField")
  124. }
  125. q, err = manager.SNetworkResourceBaseManager.QueryDistinctExtraField(q, field)
  126. if err != nil {
  127. return nil, errors.Wrap(err, "SNetworkResourceBaseManager.QueryDistinctExtraField")
  128. }
  129. q, err = manager.SProjectizedResourceBaseManager.QueryDistinctExtraField(q, field)
  130. if err != nil {
  131. return nil, errors.Wrap(err, "SProjectizedResourceBaseManager.QueryDistinctExtraField")
  132. }
  133. return q, nil
  134. }
  135. func (manager *SGuestNetworkTrafficLogManager) NamespaceScope() rbacscope.TRbacScope {
  136. return manager.SProjectizedResourceBaseManager.NamespaceScope()
  137. }
  138. func (manager *SGuestNetworkTrafficLogManager) logTraffic(ctx context.Context, guest *SGuest, gn *SGuestnetwork, matrics *api.SNicTrafficRecord, tm time.Time, isReset bool) error {
  139. logGen := func(tx, rx int64) *SGuestNetworkTrafficLog {
  140. log := &SGuestNetworkTrafficLog{}
  141. log.SetModelManager(manager, log)
  142. log.Mac = gn.MacAddr
  143. log.GuestId = guest.Id
  144. log.NetworkId = gn.NetworkId
  145. log.ProjectId = guest.ProjectId
  146. log.DomainId = guest.DomainId
  147. log.IpAddr = gn.IpAddr
  148. log.Ip6Addr = gn.Ip6Addr
  149. log.RxBytes = rx
  150. log.TxBytes = tx
  151. log.ReportAt = tm
  152. log.State = guest_api.GuestNetworkTrafficStateContinue
  153. return log
  154. }
  155. if matrics != nil {
  156. log := logGen(matrics.TxTraffic, matrics.RxTraffic)
  157. err := manager.TableSpec().Insert(ctx, log)
  158. if err != nil {
  159. return errors.Wrap(err, "insert guest network traffic log")
  160. }
  161. }
  162. if isReset {
  163. log := logGen(0, 0)
  164. log.State = guest_api.GuestNetworkTrafficStateStart
  165. err := manager.TableSpec().Insert(ctx, log)
  166. if err != nil {
  167. return errors.Wrap(err, "insert guest network traffic log")
  168. }
  169. }
  170. return nil
  171. }
  172. func (manager *SGuestNetworkTrafficLogManager) OrderByExtraFields(
  173. ctx context.Context,
  174. q *sqlchemy.SQuery,
  175. userCred mcclient.TokenCredential,
  176. query guest_api.GuestNetworkTrafficLogListInput,
  177. ) (*sqlchemy.SQuery, error) {
  178. var err error
  179. q, err = manager.SGuestResourceBaseManager.OrderByExtraFields(ctx, q, userCred, query.ServerFilterListInput)
  180. if err != nil {
  181. return nil, errors.Wrap(err, "SGuestResourceBaseManager.OrderByExtraFields")
  182. }
  183. q, err = manager.SNetworkResourceBaseManager.OrderByExtraFields(ctx, q, userCred, query.NetworkFilterListInput)
  184. if err != nil {
  185. return nil, errors.Wrap(err, "SNetworkResourceBaseManager.OrderByExtraFields")
  186. }
  187. q, err = manager.SProjectizedResourceBaseManager.OrderByExtraFields(ctx, q, userCred, query.ProjectizedResourceListInput)
  188. if err != nil {
  189. return nil, errors.Wrap(err, "SProjectizedResourceBaseManager.OrderByExtraFields")
  190. }
  191. return q, nil
  192. }
  193. func (manager *SGuestNetworkTrafficLogManager) FetchCustomizeColumns(
  194. ctx context.Context,
  195. userCred mcclient.TokenCredential,
  196. query jsonutils.JSONObject,
  197. objs []interface{},
  198. fields stringutils2.SSortedStrings,
  199. isList bool,
  200. ) []guest_api.GuestNetworkTrafficLogDetails {
  201. rows := make([]guest_api.GuestNetworkTrafficLogDetails, len(objs))
  202. return rows
  203. }