From 098d62bdc505fc035c4c948c0d1faac71b596331 Mon Sep 17 00:00:00 2001 From: Yousong Zhou Date: Wed, 13 Mar 2019 09:19:12 +0000 Subject: [PATCH] =?UTF-8?q?treewide:=20=E6=94=B9=E8=BF=9Bopslog=E8=AE=B0?= =?UTF-8?q?=E5=BD=95update=20diff?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit action为ACT_UPDATE,仅当len(UpdateDiffs) > 0时才记录 --- Gopkg.lock | 21 ++++++++--- pkg/cloudcommon/db/adminsharablevirtual.go | 4 +-- pkg/cloudcommon/db/db_dispatcher.go | 12 ++----- pkg/cloudcommon/db/opslog.go | 9 +++++ pkg/compute/models/cachedimages.go | 2 +- pkg/compute/models/guests.go | 7 +--- pkg/util/logclient/logclient.go | 22 +++++++----- .../x/pkg/util/compare/syncresults.go | 12 +++---- .../x/pkg/util/stringutils/stringutils.go | 3 ++ vendor/yunion.io/x/sqlchemy/functions.go | 35 +++++++++++++++++++ vendor/yunion.io/x/sqlchemy/update.go | 20 ++++++----- 11 files changed, 100 insertions(+), 47 deletions(-) diff --git a/Gopkg.lock b/Gopkg.lock index 62b7e8ef99..74023376b6 100644 --- a/Gopkg.lock +++ b/Gopkg.lock @@ -328,6 +328,17 @@ revision = "e99fbc797b795e0a7a94affc8d44f6a0350d85f0" version = "v0.2.1" +[[projects]] + branch = "master" + digest = "1:371dbf7f04fe7ddbcf65b88aef026278e21c9a7df810339bbe94abcf830e0627" + name = "github.com/ceph/go-ceph" + packages = [ + "rados", + "rbd", + ] + pruneopts = "UT" + revision = "e32f9f0f2e941422937c0a6c4f0a61b8f0c82995" + [[projects]] digest = "1:09cdbb058b09d19b9888aca007b30de99ff6d17e27cec0501b2376b21f8a47cd" name = "github.com/coredns/coredns" @@ -1684,7 +1695,7 @@ [[projects]] branch = "master" - digest = "1:37d4e9b3030c077522fc5669b497a25ce53429da77d5e592226658e57cc604bb" + digest = "1:04fac3de327ed7bf4490436dd3eb5fb10c7e80b919a109935d053f584fdb6566" name = "yunion.io/x/pkg" packages = [ "gotypes", @@ -1718,15 +1729,15 @@ "utils", ] pruneopts = "UT" - revision = "5fbe7b39e5f599aa49f6f597d57da460d93c26ff" + revision = "5d28ae811a2aaaed19efdc468573ef236b8327f9" [[projects]] branch = "master" - digest = "1:cb0b3f303fb24e8a173183b30480ccb690996b6e28e1c52e58e8fc6d2cf51eb8" + digest = "1:4137f40ed548a5dc02719ad2e6b6bdfd76a9d881fcd1a72eb5970956a7219d03" name = "yunion.io/x/sqlchemy" packages = ["."] pruneopts = "UT" - revision = "dfa73ef1a72202e8cbc68dbb7bd155cec4894928" + revision = "4d8d8e9b16804336f16570787421b9be24a6da1f" [[projects]] branch = "master" @@ -1768,6 +1779,8 @@ "github.com/aws/aws-sdk-go/service/s3/s3manager", "github.com/bitly/go-simplejson", "github.com/c-bata/go-prompt", + "github.com/ceph/go-ceph/rados", + "github.com/ceph/go-ceph/rbd", "github.com/coredns/coredns/core/dnsserver", "github.com/coredns/coredns/coremain", "github.com/coredns/coredns/plugin", diff --git a/pkg/cloudcommon/db/adminsharablevirtual.go b/pkg/cloudcommon/db/adminsharablevirtual.go index 5d15005c8e..8a86e4bf55 100644 --- a/pkg/cloudcommon/db/adminsharablevirtual.go +++ b/pkg/cloudcommon/db/adminsharablevirtual.go @@ -132,8 +132,6 @@ func (model *SAdminSharableVirtualResourceBase) setInfo( if err != nil { return err } - if diff != nil { - OpsLog.LogEvent(model, ACT_UPDATE, diff, userCred) - } + OpsLog.LogEvent(model, ACT_UPDATE, diff, userCred) return err } diff --git a/pkg/cloudcommon/db/db_dispatcher.go b/pkg/cloudcommon/db/db_dispatcher.go index 534808e8fc..0ad79730f6 100644 --- a/pkg/cloudcommon/db/db_dispatcher.go +++ b/pkg/cloudcommon/db/db_dispatcher.go @@ -1259,16 +1259,8 @@ func updateItem(manager IModelManager, item IModel, ctx context.Context, userCre log.Errorf("save update error: %s", err) return nil, httperrors.NewGeneralError(err) } - if diff != nil { - diffStr := sqlchemy.UpdateDiffString(diff) - if len(diffStr) > 0 { - item.PostUpdate(ctx, userCred, query, dataDict) - OpsLog.LogEvent(item, ACT_UPDATE, diffStr, userCred) - logclient.AddActionLogWithContext(ctx, item, logclient.ACT_UPDATE, diffStr, userCred, true) - } - } else { - logclient.AddActionLogWithContext(ctx, item, logclient.ACT_UPDATE, "", userCred, true) - } + OpsLog.LogEvent(item, ACT_UPDATE, diff, userCred) + logclient.AddActionLogWithContext(ctx, item, logclient.ACT_UPDATE, diff, userCred, true) item.PostUpdate(ctx, userCred, query, data) diff --git a/pkg/cloudcommon/db/opslog.go b/pkg/cloudcommon/db/opslog.go index 0ffee3eb56..cd53754643 100644 --- a/pkg/cloudcommon/db/opslog.go +++ b/pkg/cloudcommon/db/opslog.go @@ -230,6 +230,15 @@ func (manager *SOpsLogManager) LogEvent(model IModel, action string, notes inter if len(model.GetId()) == 0 || len(model.GetName()) == 0 { return } + if action == ACT_UPDATE { + // skip empty diff + if notes == nil { + return + } + if uds, ok := notes.(sqlchemy.UpdateDiffs); ok && len(uds) == 0 { + return + } + } opslog := SOpsLog{} opslog.ObjType = model.Keyword() opslog.ObjId = model.GetId() diff --git a/pkg/compute/models/cachedimages.go b/pkg/compute/models/cachedimages.go index 6421b4b06a..f57a44de75 100644 --- a/pkg/compute/models/cachedimages.go +++ b/pkg/compute/models/cachedimages.go @@ -212,7 +212,7 @@ func (manager *SCachedimageManager) cacheGlanceImageInfo(ctx context.Context, us return nil, err } - db.OpsLog.LogEvent(&imageCache, db.ACT_UPDATE, sqlchemy.UpdateDiffString(diff), userCred) + db.OpsLog.LogEvent(&imageCache, db.ACT_UPDATE, diff, userCred) return &imageCache, nil } diff --git a/pkg/compute/models/guests.go b/pkg/compute/models/guests.go index ec8ca9ee36..ec0fc857f5 100644 --- a/pkg/compute/models/guests.go +++ b/pkg/compute/models/guests.go @@ -1893,12 +1893,7 @@ func (self *SGuest) syncWithCloudVM(ctx context.Context, userCred mcclient.Token log.Errorf("%s", err) return err } - if diff != nil { - diffStr := sqlchemy.UpdateDiffString(diff) - if len(diffStr) > 0 { - db.OpsLog.LogEvent(self, db.ACT_UPDATE, diffStr, userCred) - } - } + db.OpsLog.LogEvent(self, db.ACT_UPDATE, diff, userCred) if metaData != nil { meta := make(map[string]string, 0) if err := metaData.Unmarshal(meta); err != nil { diff --git a/pkg/util/logclient/logclient.go b/pkg/util/logclient/logclient.go index cb39c98599..5ed1f90ecf 100644 --- a/pkg/util/logclient/logclient.go +++ b/pkg/util/logclient/logclient.go @@ -9,6 +9,8 @@ import ( "yunion.io/x/log" "yunion.io/x/pkg/util/stringutils" "yunion.io/x/pkg/util/timeutils" + "yunion.io/x/pkg/utils" + "yunion.io/x/sqlchemy" "yunion.io/x/onecloud/pkg/appctx" "yunion.io/x/onecloud/pkg/appsrv" @@ -127,18 +129,22 @@ func addLog(model IObject, action string, iNotes interface{}, userCred mcclient. if !consts.OpsLogEnabled() { return } - - token := userCred - notes := stringutils.Interface2String(iNotes) - - // 忽略不黑名单里的资源类型 - for _, v := range BLACK_LIST_OBJ_TYPE { - if v == model.Keyword() { - log.Errorf("不支持的 actionlog 类型") + if ok, _ := utils.InStringArray(model.Keyword(), BLACK_LIST_OBJ_TYPE); ok { + log.Errorf("不支持的 actionlog 类型") + return + } + if action == ACT_UPDATE { + if iNotes == nil { + return + } + if uds, ok := iNotes.(sqlchemy.UpdateDiffs); ok && len(uds) == 0 { return } } + token := userCred + notes := stringutils.Interface2String(iNotes) + objId := model.GetId() if len(objId) == 0 { objId = "-" diff --git a/vendor/yunion.io/x/pkg/util/compare/syncresults.go b/vendor/yunion.io/x/pkg/util/compare/syncresults.go index 1382328928..8c39aba7b0 100644 --- a/vendor/yunion.io/x/pkg/util/compare/syncresults.go +++ b/vendor/yunion.io/x/pkg/util/compare/syncresults.go @@ -6,12 +6,12 @@ import ( ) type SyncResult struct { - AddCnt int - AddErrCnt int - UpdateCnt int - UpdateErrCnt int - DelCnt int - DelErrCnt int + AddCnt int `json:"add_cnt,omitzero"` + AddErrCnt int `json:"add_err_cnt,omitzero"` + UpdateCnt int `json:"update_cnt,omitzero"` + UpdateErrCnt int `json:"update_err_cnt,omitzero"` + DelCnt int `json:"del_cnt,omitzero"` + DelErrCnt int `json:"del_err_cnt,omitzero"` errors []error } diff --git a/vendor/yunion.io/x/pkg/util/stringutils/stringutils.go b/vendor/yunion.io/x/pkg/util/stringutils/stringutils.go index 038f54e7d0..530ece0eda 100644 --- a/vendor/yunion.io/x/pkg/util/stringutils/stringutils.go +++ b/vendor/yunion.io/x/pkg/util/stringutils/stringutils.go @@ -53,6 +53,9 @@ func Interface2String(val interface{}) string { tm := val.(time.Time) return timeutils.FullIsoTime(tm) default: + if s, ok := val.(fmt.Stringer); ok { + return s.String() + } json := jsonutils.Marshal(val) return json.String() } diff --git a/vendor/yunion.io/x/sqlchemy/functions.go b/vendor/yunion.io/x/sqlchemy/functions.go index 237cdb31f5..1819324e64 100644 --- a/vendor/yunion.io/x/sqlchemy/functions.go +++ b/vendor/yunion.io/x/sqlchemy/functions.go @@ -2,6 +2,8 @@ package sqlchemy import ( "fmt" + "strconv" + "strings" ) type SFunctionField struct { @@ -68,3 +70,36 @@ func GROUP_CONCAT(name string, field IQueryField) IQueryField { ff := NewFunctionField(name, "GROUP_CONCAT(%s)", field) return &ff } + +type SStringField struct { + strConst string +} + +func (s *SStringField) Expression() string { + return "" +} + +func (s *SStringField) Name() string { + return "" +} + +func (s *SStringField) Reference() string { + return strconv.Quote(s.strConst) +} + +func (s *SStringField) Label(label string) IQueryField { + return s +} + +func NewStringField(name string) *SStringField { + return &SStringField{strConst: name} +} + +func CONCAT(name string, fields ...IQueryField) IQueryField { + params := []string{} + for i := 0; i < len(fields); i++ { + params = append(params, "%s") + } + ff := NewFunctionField(name, `CONCAT(`+strings.Join(params, ",")+`)`, fields...) + return &ff +} diff --git a/vendor/yunion.io/x/sqlchemy/update.go b/vendor/yunion.io/x/sqlchemy/update.go index 7dd3b2454e..14bb4b7e84 100644 --- a/vendor/yunion.io/x/sqlchemy/update.go +++ b/vendor/yunion.io/x/sqlchemy/update.go @@ -52,9 +52,11 @@ type SUpdateDiff struct { col IColumnSpec } -func UpdateDiffString(diff map[string]SUpdateDiff) string { - items := make([]string, 0) - for k, v := range diff { +type UpdateDiffs map[string]SUpdateDiff + +func (uds UpdateDiffs) String() string { + items := make([]string, 0, len(uds)) + for k, v := range uds { items = append(items, fmt.Sprintf("%s: %s -> %s", k, utils.TruncateString(v.old, 32), utils.TruncateString(v.new, 32))) @@ -62,7 +64,7 @@ func UpdateDiffString(diff map[string]SUpdateDiff) string { return strings.Join(items, "; ") } -func (us *SUpdateSession) saveUpdate(dt interface{}) (map[string]SUpdateDiff, error) { +func (us *SUpdateSession) saveUpdate(dt interface{}) (UpdateDiffs, error) { beforeUpdateFunc := reflect.ValueOf(dt).MethodByName("BeforeUpdate") if beforeUpdateFunc.IsValid() && !beforeUpdateFunc.IsNil() { beforeUpdateFunc.Call([]reflect.Value{}) @@ -76,7 +78,7 @@ func (us *SUpdateSession) saveUpdate(dt interface{}) (map[string]SUpdateDiff, er versionFields := make([]string, 0) updatedFields := make([]string, 0) primaries := make(map[string]interface{}) - setters := make(map[string]SUpdateDiff) + setters := UpdateDiffs{} for _, c := range us.tableSpec.columns { k := c.Name() of, _ := ofields.GetInterface(k) @@ -165,7 +167,7 @@ func (us *SUpdateSession) saveUpdate(dt interface{}) (map[string]SUpdateDiff, er return setters, nil } -func (ts *STableSpec) Update(dt interface{}, doUpdate func() error) (map[string]SUpdateDiff, error) { +func (ts *STableSpec) Update(dt interface{}, doUpdate func() error) (UpdateDiffs, error) { session, err := ts.prepareUpdate(dt) if err != nil { return nil, err @@ -174,13 +176,13 @@ func (ts *STableSpec) Update(dt interface{}, doUpdate func() error) (map[string] if err != nil { return nil, err } - diff, err := session.saveUpdate(dt) + uds, err := session.saveUpdate(dt) if err == ErrNoDataToUpdate { return nil, nil } else if err == nil { if DEBUG_SQLCHEMY { - log.Debugf("Update diff: %s", UpdateDiffString(diff)) + log.Debugf("Update diff: %s", uds) } } - return diff, err + return uds, err }