diff --git a/Gopkg.lock b/Gopkg.lock index 9a7109e191..74023376b6 100644 --- a/Gopkg.lock +++ b/Gopkg.lock @@ -1695,7 +1695,7 @@ [[projects]] branch = "master" - digest = "1:204f1b178847f36dd976b909c0cf720c60b5f144c8390601928cd75abd4a894f" + digest = "1:04fac3de327ed7bf4490436dd3eb5fb10c7e80b919a109935d053f584fdb6566" name = "yunion.io/x/pkg" packages = [ "gotypes", @@ -1729,15 +1729,15 @@ "utils", ] pruneopts = "UT" - revision = "857664cbfc1ceb07fcdbacbd8dfe5563ad2a96df" + 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" diff --git a/pkg/cloudcommon/db/adminsharablevirtual.go b/pkg/cloudcommon/db/adminsharablevirtual.go index a57f56ea40..e1ca9c3444 100644 --- a/pkg/cloudcommon/db/adminsharablevirtual.go +++ b/pkg/cloudcommon/db/adminsharablevirtual.go @@ -137,9 +137,7 @@ func (model *SAdminSharableVirtualResourceBase) setInfo(ctx context.Context, if err != nil { return err } - if diff != nil { - OpsLog.LogEvent(model, ACT_UPDATE, diff, userCred) - logclient.AddActionLogWithContext(ctx, model, logclient.ACT_UPDATE, diff, userCred, true) - } + OpsLog.LogEvent(model, ACT_UPDATE, diff, userCred) + logclient.AddActionLogWithContext(ctx, model, logclient.ACT_UPDATE, diff, userCred, true) return err } diff --git a/pkg/cloudcommon/db/db_dispatcher.go b/pkg/cloudcommon/db/db_dispatcher.go index 05ea1c51b2..4c9df13e94 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 5aefdac2d2..4bc90398a8 100644 --- a/pkg/cloudcommon/db/opslog.go +++ b/pkg/cloudcommon/db/opslog.go @@ -237,6 +237,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() @@ -348,10 +357,9 @@ func (manager *SOpsLogManager) SyncOwner(m IModel, former *STenant, userCred mcc manager.LogEvent(m, ACT_CHANGE_OWNER, notes, userCred) } -func (manager *SOpsLogManager) LogSyncUpdate(m IModel, diff map[string]sqlchemy.SUpdateDiff, userCred mcclient.TokenCredential) { - diffStr := sqlchemy.UpdateDiffString(diff) - if len(diffStr) > 0 { - manager.LogEvent(m, ACT_SYNC_UPDATE, diffStr, userCred) +func (manager *SOpsLogManager) LogSyncUpdate(m IModel, uds sqlchemy.UpdateDiffs, userCred mcclient.TokenCredential) { + if len(uds) > 0 { + manager.LogEvent(m, ACT_SYNC_UPDATE, uds, userCred) } } diff --git a/pkg/compute/models/cachedimages.go b/pkg/compute/models/cachedimages.go index a6c3ba9d6d..82c5723b0e 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/cloudaccounts.go b/pkg/compute/models/cloudaccounts.go index 7f9090168c..733b5f902e 100644 --- a/pkg/compute/models/cloudaccounts.go +++ b/pkg/compute/models/cloudaccounts.go @@ -911,7 +911,7 @@ func (self *SCloudaccount) enableAutoSync(ctx context.Context, userCred mcclient if err != nil { return err } - db.OpsLog.LogEvent(self, db.ACT_UPDATE, sqlchemy.UpdateDiffString(diff), userCred) + db.OpsLog.LogEvent(self, db.ACT_UPDATE, diff, userCred) return nil } @@ -938,7 +938,7 @@ func (self *SCloudaccount) disableAutoSync(ctx context.Context, userCred mcclien if err != nil { return err } - db.OpsLog.LogEvent(self, db.ACT_UPDATE, sqlchemy.UpdateDiffString(diff), userCred) + db.OpsLog.LogEvent(self, db.ACT_UPDATE, diff, userCred) return nil } diff --git a/pkg/compute/models/skus.go b/pkg/compute/models/skus.go index e0b5277d88..38a6af7c3b 100644 --- a/pkg/compute/models/skus.go +++ b/pkg/compute/models/skus.go @@ -889,7 +889,7 @@ func (self *SServerSku) setPrepaidPostpaidStatus(userCred mcclient.TokenCredenti if err != nil { return err } - db.OpsLog.LogEvent(self, db.ACT_UPDATE, sqlchemy.UpdateDiffString(diff), userCred) + db.OpsLog.LogEvent(self, db.ACT_UPDATE, diff, userCred) } return nil } diff --git a/pkg/util/logclient/logclient.go b/pkg/util/logclient/logclient.go index 7005da8f77..f423b7eba2 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" @@ -129,18 +131,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/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 }