Merge remote-tracking branch 'origin/release/2.6.0' into bugfix/yousong-update-diffs-270

This commit is contained in:
Yousong Zhou
2019-03-14 07:39:01 +00:00
11 changed files with 87 additions and 43 deletions
Generated
+4 -4
View File
@@ -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"
+2 -4
View File
@@ -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
}
+2 -10
View File
@@ -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)
+12 -4
View File
@@ -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)
}
}
+1 -1
View File
@@ -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
}
+2 -2
View File
@@ -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
}
+1 -1
View File
@@ -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
}
+14 -8
View File
@@ -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 = "-"
+3
View File
@@ -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()
}
+35
View File
@@ -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
}
+11 -9
View File
@@ -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
}