Merge pull request #7980 from yousong/bugfix/yousong-opslog

Bugfix/yousong actionlog
This commit is contained in:
yunion-ci-robot
2020-09-21 16:39:11 +08:00
committed by GitHub
39 changed files with 1884 additions and 1134 deletions
+580 -580
View File
File diff suppressed because it is too large Load Diff
+14 -14
View File
@@ -5330,9 +5330,9 @@
"position": "pkg/compute/models/loadbalanceragents_deploy.go:279:40"
},
{
"id": "unmarshal input",
"message": "unmarshal input",
"translation": "unmarshal输入参数出错",
"id": "unmarshal input: %v",
"message": "unmarshal input: %v",
"translation": "unmarshal输入参数出错: %v",
"position": "pkg/compute/models/loadbalanceragents_deploy.go:301:44"
},
{
@@ -5378,15 +5378,15 @@
"position": "pkg/compute/models/loadbalancerbackendgroups.go:118:49"
},
{
"id": "weight %s not support, only support range 0 ~ 256",
"message": "weight %s not support, only support range 0 ~ 256",
"translation": "无效的权重%s,要求在0~256范围",
"id": "weight %d not support, only support range 0 ~ 256",
"message": "weight %d not support, only support range 0 ~ 256",
"translation": "无效的权重%d,要求在0~256范围",
"position": "pkg/compute/models/loadbalancerbackendgroups.go:206:50"
},
{
"id": "port %s not support, only support range 1 ~ 65535",
"message": "port %s not support, only support range 1 ~ 65535",
"translation": "无效的端口%s,要求在1~65535范围",
"id": "port %d not support, only support range 1 ~ 65535",
"message": "port %d not support, only support range 1 ~ 65535",
"translation": "无效的端口%d,要求在1~65535范围",
"position": "pkg/compute/models/loadbalancerbackendgroups.go:209:50"
},
{
@@ -5762,9 +5762,9 @@
"position": "pkg/compute/models/networks.go:924:44"
},
{
"id": "Network %s not found %s",
"message": "Network %s not found %s",
"translation": "查找网络%s失败:%s",
"id": "Network %s not found: %v",
"message": "Network %s not found: %v",
"translation": "查找网络%s失败:%v",
"position": "pkg/compute/models/networks.go:950:46"
},
{
@@ -7598,8 +7598,8 @@
"position": "pkg/compute/regiondrivers/huawei.go:2356:43"
},
{
"id": "% not support create account",
"message": "% not support create account",
"id": "%s not support create account",
"message": "%s not support create account",
"translation": "%s不支持创建账号",
"position": "pkg/compute/regiondrivers/huawei.go:2561:51"
},
+4 -3
View File
@@ -38,6 +38,7 @@ import (
"yunion.io/x/onecloud/pkg/appctx"
"yunion.io/x/onecloud/pkg/httperrors"
"yunion.io/x/onecloud/pkg/i18n"
"yunion.io/x/onecloud/pkg/proxy"
"yunion.io/x/onecloud/pkg/util/httputils"
)
@@ -283,7 +284,7 @@ func (app *Application) defaultHandle(w http.ResponseWriter, r *http.Request, ri
if cancel != nil {
defer cancel()
}
ctx = httperrors.WithRequestLang(ctx, r)
ctx = i18n.WithRequestLang(ctx, r)
session := hand.workerMan
if session == nil {
if r.Method == "GET" || r.Method == "HEAD" {
@@ -339,11 +340,11 @@ func (app *Application) defaultHandle(w http.ResponseWriter, r *http.Request, ri
fw.closeChannels()
return hand, appParams
} else {
ctx := httperrors.WithRequestLang(context.TODO(), r)
ctx := i18n.WithRequestLang(context.TODO(), r)
httperrors.InternalServerError(ctx, w, "Invalid handler %s", r.URL)
}
} else if !isCors {
ctx := httperrors.WithRequestLang(context.TODO(), r)
ctx := i18n.WithRequestLang(context.TODO(), r)
httperrors.NotFoundError(ctx, w, "Handler not found")
}
return nil, nil
+3 -2
View File
@@ -27,6 +27,7 @@ import (
"yunion.io/x/onecloud/pkg/appctx"
"yunion.io/x/onecloud/pkg/appsrv"
"yunion.io/x/onecloud/pkg/httperrors"
"yunion.io/x/onecloud/pkg/i18n"
"yunion.io/x/onecloud/pkg/mcclient/modulebase"
)
@@ -294,13 +295,13 @@ func getSpecHandler(ctx context.Context, w http.ResponseWriter, r *http.Request)
}
func writeErrNoRequestKey(ctx context.Context, w http.ResponseWriter, r *http.Request, key string) {
ctx = httperrors.WithRequestLang(ctx, r)
ctx = i18n.WithRequestLang(ctx, r)
httperrors.InvalidInputError(ctx, w,
"No request key: %s", key)
}
func writeErrInvalidRequestHeader(ctx context.Context, w http.ResponseWriter, r *http.Request, err error) {
ctx = httperrors.WithRequestLang(ctx, r)
ctx = i18n.WithRequestLang(ctx, r)
httperrors.InvalidInputError(ctx, w,
"Invalid request header: %v", err)
}
+14 -3
View File
@@ -350,7 +350,7 @@ func Query2List(manager IModelManager, ctx context.Context, userCred mcclient.To
} else {
showDetails = true
}
items := make([]interface{}, 0)
var items []interface{}
extraResults := make([]*jsonutils.JSONDict, 0)
rows, err := q.Rows()
if err != nil && err != sql.ErrNoRows {
@@ -405,7 +405,7 @@ func Query2List(manager IModelManager, ctx context.Context, userCred mcclient.To
items = append(items, item)
}
results := make([]jsonutils.JSONObject, len(items))
results := make([]*jsonutils.JSONDict, len(items))
if showDetails || len(exportKeys) > 0 {
var sortedListFields stringutils2.SSortedStrings
if len(exportKeys) > 0 {
@@ -445,7 +445,18 @@ func Query2List(manager IModelManager, ctx context.Context, userCred mcclient.To
results[i] = jsonDict
}
}
return results, nil
for i := range items {
i18nDict := items[i].(IModel).GetI18N(ctx)
if i18nDict != nil {
jsonDict := results[i]
jsonDict.Set("_i18n", i18nDict)
}
}
r := make([]jsonutils.JSONObject, len(items))
for i := range results {
r[i] = results[i]
}
return r, nil
}
func fetchContextObjectsIds(manager IModelManager, ctx context.Context, userCred mcclient.TokenCredential, ctxIds []dispatcher.SResourceContext, queryDict *jsonutils.JSONDict) (*jsonutils.JSONDict, error) {
+1
View File
@@ -196,6 +196,7 @@ type IModel interface {
MarkDeletePreventionOff()
GetUsages() []IUsage
GetI18N(ctx context.Context) *jsonutils.JSONDict
}
type IResourceModelManager interface {
+4
View File
@@ -596,3 +596,7 @@ func (model *SModelBase) DeleteInContext(ctx context.Context, userCred mcclient.
func (model *SModelBase) GetUsages() []IUsage {
return nil
}
func (model *SModelBase) GetI18N(ctx context.Context) *jsonutils.JSONDict {
return nil
}
-246
View File
@@ -38,252 +38,6 @@ import (
"yunion.io/x/onecloud/pkg/util/stringutils2"
)
const (
ACT_CREATE = "create"
ACT_DELETE = "delete"
ACT_UPDATE = "update"
ACT_FETCH = "fetch"
ACT_ENABLE = "enable"
ACT_DISABLE = "disable"
ACT_OFFLINE = "offline"
ACT_ONLINE = "online"
ACT_ATTACH = "attach"
ACT_DETACH = "detach"
ACT_ATTACH_FAIL = "attach_fail"
ACT_DETACH_FAIL = "detach_fail"
ACT_DELETE_FAIL = "delete_fail"
ACT_PUBLIC = "public"
ACT_PRIVATE = "private"
ACT_SYNC_UPDATE = "sync_update"
ACT_SYNC_CREATE = "sync_create"
ACT_START_CREATE_BACKUP = "start_create_backup"
ACT_CREATE_BACKUP = "create_backup"
ACT_CREATE_BACKUP_FAILED = "create_backup_failed"
ACT_DELETE_BACKUP = "delete_backup"
ACT_DELETE_BACKUP_FAILED = "delete_backup_failed"
ACT_UPDATE_STATUS = "updatestatus"
ACT_STARTING = "starting"
ACT_START = "start"
ACT_START_FAIL = "start_fail"
ACT_BACKUP_START = "backup_start"
ACT_BACKUP_START_FAILED = "backup_start_fail"
ACT_RESTARING = "restarting"
ACT_RESTART_FAIL = "restart_fail"
ACT_STOPPING = "stopping"
ACT_STOP = "stop"
ACT_STOP_FAIL = "stop_fail"
ACT_RESUMING = "resuming"
ACT_RESUME = "resume"
ACT_RESUME_FAIL = "resume_fail"
ACT_RESIZING = "resizing"
ACT_RESIZE = "resize"
ACT_RESIZE_FAIL = "resize_fail"
ACT_MIGRATING = "migrating"
ACT_MIGRATE = "migrate"
ACT_MIGRATE_FAIL = "migrate_fail"
ACT_VM_CONVERT = "vm_convert"
ACT_VM_CONVERTING = "vm_converting"
ACT_VM_CONVERT_FAIL = "vm_convert_fail"
ACT_SPLIT = "net_split"
ACT_MERGE = "net_merge"
ACT_SAVING = "saving"
ACT_SAVE = "save"
ACT_SAVE_FAIL = "save_fail"
ACT_PROBE = "probe"
ACT_PROBE_FAIL = "probe_fail"
ACT_IMAGE_DELETE_FAIL = "delete_fail"
ACT_SWITCHED = "switched"
ACT_SWITCH_FAILED = "switch_failed"
ACT_SNAPSHOTING = "snapshoting"
ACT_SNAPSHOT_STREAM = "snapshot_stream"
ACT_SNAPSHOT_DONE = "snapshot"
ACT_SNAPSHOT_READY = "snapshot_ready"
ACT_SNAPSHOT_SYNC = "snapshot_sync"
ACT_SNAPSHOT_FAIL = "snapshot_fail"
ACT_SNAPSHOT_DELETING = "snapshot_deling"
ACT_SNAPSHOT_DELETE = "snapshot_del"
ACT_SNAPSHOT_DELETE_FAIL = "snapshot_del_fail"
ACT_SNAPSHOT_FAKE_DELETE = "snapshot_fake_del"
ACT_SNAPSHOT_UNLINK = "snapshot_unlink"
ACT_APPLY_SNAPSHOT_POLICY = "apply_snapshot_policy"
ACT_APPLY_SNAPSHOT_POLICY_FAILED = "apply_snapshot_policy_failed"
ACT_CANCEL_SNAPSHOT_POLICY = "cancel_snapshot_policy"
ACT_CANCEL_SNAPSHOT_POLICY_FAILED = "cancel_snapshot_policy_failed"
ACT_VM_SNAPSHOT_AND_CLONE = "vm_snapshot_and_clone"
ACT_VM_SNAPSHOT_AND_CLONE_FAILED = "vm_snapshot_and_clone_failed"
ACT_VM_RESET_SNAPSHOT = "instance_reset_snapshot"
ACT_VM_RESET_SNAPSHOT_FAILED = "instance_reset_snapshot_failed"
ACT_SNAPSHOT_POLICY_BIND_DISK = "snapshot_policy_bind_disk"
ACT_SNAPSHOT_POLICY_BIND_DISK_FAIL = "snapshot_policy_bind_disk_fail"
ACT_SNAPSHOT_POLICY_UNBIND_DISK = "snapshot_policy_unbind_disk"
ACT_SNAPSHOT_POLICY_UNBIND_DISK_FAIL = "snapshot_policy_unbind_disk_fail"
ACT_DISK_CLEAN_UP_SNAPSHOTS = "disk_clean_up_snapshots"
ACT_DISK_CLEAN_UP_SNAPSHOTS_FAIL = "disk_clean_up_snapshots_fail"
ACT_DISK_AUTO_SNAPSHOT = "disk_auto_snapshot"
ACT_DISK_AUTO_SNAPSHOT_FAIL = "disk_auto_snapshot_fail"
ACT_DISK_AUTO_SYNC_SNAPSHOT = "disk_auto_sync_snapshot"
ACT_DISK_AUTO_SYNC_SNAPSHOT_FAIL = "disk_auto_sync_snapshot_fail"
ACT_ALLOCATING = "allocating"
ACT_BACKUP_ALLOCATING = "backup_allocating"
ACT_ALLOCATE = "allocate"
ACT_BACKUP_ALLOCATE = "backup_allocate"
ACT_ALLOCATE_FAIL = "alloc_fail"
ACT_BACKUP_ALLOCATE_FAIL = "backup_alloc_fail"
ACT_REW_FAIL = "renew_fail"
ACT_SET_AUTO_RENEW = "set_auto_renew"
ACT_SET_AUTO_RENEW_FAIL = "set_auto_renew_fail"
ACT_DELOCATING = "delocating"
ACT_DELOCATE = "delocate"
ACT_DELOCATE_FAIL = "delocate_fail"
ACT_ISO_PREPARING = "iso_preparing"
ACT_ISO_PREPARE_FAIL = "iso_prepare_fail"
ACT_ISO_ATTACH = "iso_attach"
ACT_ISO_DETACH = "iso_detach"
ACT_EIP_ATTACH = "eip_attach"
ACT_EIP_DETACH = "eip_detach"
ACT_SET_METADATA = "set_meta"
ACT_DEL_METADATA = "del_meta"
ACT_VM_DEPLOY = "deploy"
ACT_VM_DEPLOY_FAIL = "deploy_fail"
ACT_VM_IO_THROTTLE = "io_throttle"
ACT_VM_IO_THROTTLE_FAIL = "io_throttle_fail"
ACT_REBUILDING_ROOT = "rebuilding_root"
ACT_REBUILD_ROOT = "rebuild_root"
ACT_REBUILD_ROOT_FAIL = "rebuild_root_fail"
ACT_CHANGING_FLAVOR = "changing_flavor"
ACT_CHANGE_FLAVOR = "change_flavor"
ACT_CHANGE_FLAVOR_FAIL = "change_flavor_fail"
ACT_SYNCING_CONF = "syncing_conf"
ACT_SYNC_CONF = "sync_conf"
ACT_SYNC_CONF_FAIL = "sync_conf_fail"
ACT_SYNC_STATUS = "sync_status"
ACT_CHANGE_OWNER = "change_owner"
ACT_SYNC_OWNER = "sync_owner"
ACT_SYNC_SHARE = "sync_share"
ACT_RESERVE_IP = "reserve_ip"
ACT_RELEASE_IP = "release_ip"
ACT_CONVERT_START = "converting"
ACT_CONVERT_COMPLETE = "converted"
ACT_CONVERT_FAIL = "convert_fail"
ACT_UNCONVERT_START = "unconverting"
ACT_UNCONVERT_COMPLETE = "unconverted"
ACT_UNCONVERT_FAIL = "unconvert_fail"
ACT_SYNC_HOST_START = "sync_host_start"
ACT_SYNCING_HOST = "syncing_host"
ACT_SYNC_HOST_COMPLETE = "sync_host_end"
ACT_SYNC_HOST_FAILED = "sync_host_fail"
ACT_SYNC_PROJECT_COMPLETE = "sync_project_end"
ACT_SYNC_LB_START = "sync_lb_start"
ACT_SYNCING_LB = "syncing_lb"
ACT_SYNC_LB_COMPLETE = "sync_lb_end"
ACT_CACHING_IMAGE = "caching_image"
ACT_CACHE_IMAGE_FAIL = "cache_image_fail"
ACT_CACHED_IMAGE = "cached_image"
ACT_UNCACHING_IMAGE = "uncaching_image"
ACT_UNCACHE_IMAGE_FAIL = "uncache_image_fail"
ACT_UNCACHED_IMAGE = "uncached_image"
ACT_SYNC_CLOUD_DISK = "sync_cloud_disk"
ACT_SYNC_CLOUD_SERVER = "sync_cloud_server"
ACT_SYNC_CLOUD_SKUS = "sync_cloud_skus"
ACT_SYNC_CLOUD_EIP = "sync_cloud_eip"
ACT_SYNC_CLOUD_PROJECT = "sync_cloud_project"
ACT_SYNC_CLOUD_ELASTIC_CACHE = "sync_cloud_elastic_cache"
ACT_PENDING_DELETE = "pending_delete"
ACT_CANCEL_DELETE = "cancel_delete"
// # isolated device (host)
ACT_HOST_ATTACH_ISOLATED_DEVICE = "host_attach_isolated_deivce"
ACT_HOST_ATTACH_ISOLATED_DEVICE_FAIL = "host_attach_isolated_deivce_fail"
ACT_HOST_DETACH_ISOLATED_DEVICE = "host_detach_isolated_deivce"
ACT_HOST_DETACH_ISOLATED_DEVICE_FAIL = "host_detach_isolated_deivce_fail"
// # isolated device (guest)
ACT_GUEST_ATTACH_ISOLATED_DEVICE = "guest_attach_isolated_deivce"
ACT_GUEST_ATTACH_ISOLATED_DEVICE_FAIL = "guest_attach_isolated_deivce_fail"
ACT_GUEST_DETACH_ISOLATED_DEVICE = "guest_detach_isolated_deivce"
ACT_GUEST_DETACH_ISOLATED_DEVICE_FAIL = "guest_detach_isolated_deivce_fail"
ACT_GUEST_SAVE_GUEST_IMAGE = "guest_save_guest_image"
ACT_GUEST_SAVE_GUEST_IMAGE_FAIL = "guest_save_guest_image_fail"
ACT_GUEST_SRC_CHECK = "guest_src_check"
ACT_CHANGE_BANDWIDTH = "eip_change_bandwidth"
ACT_EIP_CONVERT_FAIL = "eip_convert_fail"
ACT_RENEW = "renew"
ACT_SCHEDULE = "schedule"
ACT_RECYCLE_PREPAID = "recycle_prepaid"
ACT_UNDO_RECYCLE_PREPAID = "undo_recycle_prepaid"
ACT_HOST_IMPORT_LIBVIRT_SERVERS = "host_import_libvirt_servers"
ACT_HOST_IMPORT_LIBVIRT_SERVERS_FAIL = "host_import_libvirt_servers_fail"
ACT_GUEST_CREATE_FROM_IMPORT_SUCC = "guest_create_from_import_succ"
ACT_GUEST_CREATE_FROM_IMPORT_FAIL = "guest_create_from_import_fail"
ACT_GUEST_PANICKED = "guest_panicked"
ACT_HOST_MAINTENANCE = "host_maintenance"
ACT_HOST_DOWN = "host_down"
ACT_UPLOAD_OBJECT = "upload_obj"
ACT_DELETE_OBJECT = "delete_obj"
ACT_MKDIR = "mkdir"
ACT_GRANT_PRIVILEGE = "grant_privilege"
ACT_REVOKE_PRIVILEGE = "revoke_privilege"
ACT_SET_PRIVILEGES = "set_privileges"
ACT_REBOOT = "reboot"
ACT_RESTORE = "restore"
ACT_CHANGE_CONFIG = "change_config"
ACT_RESET_PASSWORD = "reset_password"
ACT_SUBIMAGE_UPDATE_FAIL = "guest_image_subimages_update_fail"
ACT_FLUSH_INSTANCE = "flush_instance"
ACT_FLUSH_INSTANCE_FAIL = "flush_instance_fail"
ACT_SYNC_VPCS = "sync_vpcs"
ACT_SYNC_RECORD_SETS = "sync_record_sets"
)
type SOpsLogManager struct {
SModelBaseManager
}
+260
View File
@@ -0,0 +1,260 @@
// Copyright 2019 Yunion
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package db
const (
ACT_CREATE = "create"
ACT_DELETE = "delete"
ACT_UPDATE = "update"
ACT_FETCH = "fetch"
ACT_ENABLE = "enable"
ACT_DISABLE = "disable"
ACT_OFFLINE = "offline"
ACT_ONLINE = "online"
ACT_ATTACH = "attach"
ACT_DETACH = "detach"
ACT_ATTACH_FAIL = "attach_fail"
ACT_DETACH_FAIL = "detach_fail"
ACT_DELETE_FAIL = "delete_fail"
ACT_PUBLIC = "public"
ACT_PRIVATE = "private"
ACT_SYNC_UPDATE = "sync_update"
ACT_SYNC_CREATE = "sync_create"
ACT_START_CREATE_BACKUP = "start_create_backup"
ACT_CREATE_BACKUP = "create_backup"
ACT_CREATE_BACKUP_FAILED = "create_backup_failed"
ACT_DELETE_BACKUP = "delete_backup"
ACT_DELETE_BACKUP_FAILED = "delete_backup_failed"
ACT_UPDATE_STATUS = "updatestatus"
ACT_STARTING = "starting"
ACT_START = "start"
ACT_START_FAIL = "start_fail"
ACT_BACKUP_START = "backup_start"
ACT_BACKUP_START_FAILED = "backup_start_fail"
ACT_RESTARING = "restarting"
ACT_RESTART_FAIL = "restart_fail"
ACT_STOPPING = "stopping"
ACT_STOP = "stop"
ACT_STOP_FAIL = "stop_fail"
ACT_RESUMING = "resuming"
ACT_RESUME = "resume"
ACT_RESUME_FAIL = "resume_fail"
ACT_RESIZING = "resizing"
ACT_RESIZE = "resize"
ACT_RESIZE_FAIL = "resize_fail"
ACT_MIGRATING = "migrating"
ACT_MIGRATE = "migrate"
ACT_MIGRATE_FAIL = "migrate_fail"
ACT_VM_CONVERT = "vm_convert"
ACT_VM_CONVERTING = "vm_converting"
ACT_VM_CONVERT_FAIL = "vm_convert_fail"
ACT_SPLIT = "net_split"
ACT_MERGE = "net_merge"
ACT_SAVING = "saving"
ACT_SAVE = "save"
ACT_SAVE_FAIL = "save_fail"
ACT_PROBE = "probe"
ACT_PROBE_FAIL = "probe_fail"
ACT_IMAGE_DELETE_FAIL = "delete_fail"
ACT_SWITCHED = "switched"
ACT_SWITCH_FAILED = "switch_failed"
ACT_SNAPSHOTING = "snapshoting"
ACT_SNAPSHOT_STREAM = "snapshot_stream"
ACT_SNAPSHOT_DONE = "snapshot"
ACT_SNAPSHOT_READY = "snapshot_ready"
ACT_SNAPSHOT_SYNC = "snapshot_sync"
ACT_SNAPSHOT_FAIL = "snapshot_fail"
ACT_SNAPSHOT_DELETING = "snapshot_deling"
ACT_SNAPSHOT_DELETE = "snapshot_del"
ACT_SNAPSHOT_DELETE_FAIL = "snapshot_del_fail"
ACT_SNAPSHOT_FAKE_DELETE = "snapshot_fake_del"
ACT_SNAPSHOT_UNLINK = "snapshot_unlink"
ACT_APPLY_SNAPSHOT_POLICY = "apply_snapshot_policy"
ACT_APPLY_SNAPSHOT_POLICY_FAILED = "apply_snapshot_policy_failed"
ACT_CANCEL_SNAPSHOT_POLICY = "cancel_snapshot_policy"
ACT_CANCEL_SNAPSHOT_POLICY_FAILED = "cancel_snapshot_policy_failed"
ACT_VM_SNAPSHOT_AND_CLONE = "vm_snapshot_and_clone"
ACT_VM_SNAPSHOT_AND_CLONE_FAILED = "vm_snapshot_and_clone_failed"
ACT_VM_RESET_SNAPSHOT = "instance_reset_snapshot"
ACT_VM_RESET_SNAPSHOT_FAILED = "instance_reset_snapshot_failed"
ACT_SNAPSHOT_POLICY_BIND_DISK = "snapshot_policy_bind_disk"
ACT_SNAPSHOT_POLICY_BIND_DISK_FAIL = "snapshot_policy_bind_disk_fail"
ACT_SNAPSHOT_POLICY_UNBIND_DISK = "snapshot_policy_unbind_disk"
ACT_SNAPSHOT_POLICY_UNBIND_DISK_FAIL = "snapshot_policy_unbind_disk_fail"
ACT_DISK_CLEAN_UP_SNAPSHOTS = "disk_clean_up_snapshots"
ACT_DISK_CLEAN_UP_SNAPSHOTS_FAIL = "disk_clean_up_snapshots_fail"
ACT_DISK_AUTO_SNAPSHOT = "disk_auto_snapshot"
ACT_DISK_AUTO_SNAPSHOT_FAIL = "disk_auto_snapshot_fail"
ACT_DISK_AUTO_SYNC_SNAPSHOT = "disk_auto_sync_snapshot"
ACT_DISK_AUTO_SYNC_SNAPSHOT_FAIL = "disk_auto_sync_snapshot_fail"
ACT_ALLOCATING = "allocating"
ACT_BACKUP_ALLOCATING = "backup_allocating"
ACT_ALLOCATE = "allocate"
ACT_BACKUP_ALLOCATE = "backup_allocate"
ACT_ALLOCATE_FAIL = "alloc_fail"
ACT_BACKUP_ALLOCATE_FAIL = "backup_alloc_fail"
ACT_REW_FAIL = "renew_fail"
ACT_SET_AUTO_RENEW = "set_auto_renew"
ACT_SET_AUTO_RENEW_FAIL = "set_auto_renew_fail"
ACT_DELOCATING = "delocating"
ACT_DELOCATE = "delocate"
ACT_DELOCATE_FAIL = "delocate_fail"
ACT_ISO_PREPARING = "iso_preparing"
ACT_ISO_PREPARE_FAIL = "iso_prepare_fail"
ACT_ISO_ATTACH = "iso_attach"
ACT_ISO_DETACH = "iso_detach"
ACT_EIP_ATTACH = "eip_attach"
ACT_EIP_DETACH = "eip_detach"
ACT_SET_METADATA = "set_meta"
ACT_DEL_METADATA = "del_meta"
ACT_VM_DEPLOY = "deploy"
ACT_VM_DEPLOY_FAIL = "deploy_fail"
ACT_VM_IO_THROTTLE = "io_throttle"
ACT_VM_IO_THROTTLE_FAIL = "io_throttle_fail"
ACT_REBUILDING_ROOT = "rebuilding_root"
ACT_REBUILD_ROOT = "rebuild_root"
ACT_REBUILD_ROOT_FAIL = "rebuild_root_fail"
ACT_CHANGING_FLAVOR = "changing_flavor"
ACT_CHANGE_FLAVOR = "change_flavor"
ACT_CHANGE_FLAVOR_FAIL = "change_flavor_fail"
ACT_SYNCING_CONF = "syncing_conf"
ACT_SYNC_CONF = "sync_conf"
ACT_SYNC_CONF_FAIL = "sync_conf_fail"
ACT_SYNC_STATUS = "sync_status"
ACT_CHANGE_OWNER = "change_owner"
ACT_SYNC_OWNER = "sync_owner"
ACT_SYNC_SHARE = "sync_share"
ACT_RESERVE_IP = "reserve_ip"
ACT_RELEASE_IP = "release_ip"
ACT_CONVERT_START = "converting"
ACT_CONVERT_COMPLETE = "converted"
ACT_CONVERT_FAIL = "convert_fail"
ACT_UNCONVERT_START = "unconverting"
ACT_UNCONVERT_COMPLETE = "unconverted"
ACT_UNCONVERT_FAIL = "unconvert_fail"
ACT_SYNC_HOST_START = "sync_host_start"
ACT_SYNCING_HOST = "syncing_host"
ACT_SYNC_HOST_COMPLETE = "sync_host_end"
ACT_SYNC_HOST_FAILED = "sync_host_fail"
ACT_SYNC_PROJECT_COMPLETE = "sync_project_end"
ACT_SYNC_LB_START = "sync_lb_start"
ACT_SYNCING_LB = "syncing_lb"
ACT_SYNC_LB_COMPLETE = "sync_lb_end"
ACT_CACHING_IMAGE = "caching_image"
ACT_CACHE_IMAGE_FAIL = "cache_image_fail"
ACT_CACHED_IMAGE = "cached_image"
ACT_UNCACHING_IMAGE = "uncaching_image"
ACT_UNCACHE_IMAGE_FAIL = "uncache_image_fail"
ACT_UNCACHED_IMAGE = "uncached_image"
ACT_SYNC_CLOUD_DISK = "sync_cloud_disk"
ACT_SYNC_CLOUD_SERVER = "sync_cloud_server"
ACT_SYNC_CLOUD_SKUS = "sync_cloud_skus"
ACT_SYNC_CLOUD_EIP = "sync_cloud_eip"
ACT_SYNC_CLOUD_PROJECT = "sync_cloud_project"
ACT_SYNC_CLOUD_ELASTIC_CACHE = "sync_cloud_elastic_cache"
ACT_PENDING_DELETE = "pending_delete"
ACT_CANCEL_DELETE = "cancel_delete"
// # isolated device (host)
ACT_HOST_ATTACH_ISOLATED_DEVICE = "host_attach_isolated_deivce"
ACT_HOST_ATTACH_ISOLATED_DEVICE_FAIL = "host_attach_isolated_deivce_fail"
ACT_HOST_DETACH_ISOLATED_DEVICE = "host_detach_isolated_deivce"
ACT_HOST_DETACH_ISOLATED_DEVICE_FAIL = "host_detach_isolated_deivce_fail"
// # isolated device (guest)
ACT_GUEST_ATTACH_ISOLATED_DEVICE = "guest_attach_isolated_deivce"
ACT_GUEST_ATTACH_ISOLATED_DEVICE_FAIL = "guest_attach_isolated_deivce_fail"
ACT_GUEST_DETACH_ISOLATED_DEVICE = "guest_detach_isolated_deivce"
ACT_GUEST_DETACH_ISOLATED_DEVICE_FAIL = "guest_detach_isolated_deivce_fail"
ACT_GUEST_SAVE_GUEST_IMAGE = "guest_save_guest_image"
ACT_GUEST_SAVE_GUEST_IMAGE_FAIL = "guest_save_guest_image_fail"
ACT_GUEST_SRC_CHECK = "guest_src_check"
ACT_CHANGE_BANDWIDTH = "eip_change_bandwidth"
ACT_EIP_CONVERT_FAIL = "eip_convert_fail"
ACT_RENEW = "renew"
ACT_SCHEDULE = "schedule"
ACT_RECYCLE_PREPAID = "recycle_prepaid"
ACT_UNDO_RECYCLE_PREPAID = "undo_recycle_prepaid"
ACT_HOST_IMPORT_LIBVIRT_SERVERS = "host_import_libvirt_servers"
ACT_HOST_IMPORT_LIBVIRT_SERVERS_FAIL = "host_import_libvirt_servers_fail"
ACT_GUEST_CREATE_FROM_IMPORT_SUCC = "guest_create_from_import_succ"
ACT_GUEST_CREATE_FROM_IMPORT_FAIL = "guest_create_from_import_fail"
ACT_GUEST_PANICKED = "guest_panicked"
ACT_HOST_MAINTENANCE = "host_maintenance"
ACT_HOST_DOWN = "host_down"
ACT_UPLOAD_OBJECT = "upload_obj"
ACT_DELETE_OBJECT = "delete_obj"
ACT_MKDIR = "mkdir"
ACT_GRANT_PRIVILEGE = "grant_privilege"
ACT_REVOKE_PRIVILEGE = "revoke_privilege"
ACT_SET_PRIVILEGES = "set_privileges"
ACT_REBOOT = "reboot"
ACT_RESTORE = "restore"
ACT_CHANGE_CONFIG = "change_config"
ACT_RESET_PASSWORD = "reset_password"
ACT_SUBIMAGE_UPDATE_FAIL = "guest_image_subimages_update_fail"
ACT_FLUSH_INSTANCE = "flush_instance"
ACT_FLUSH_INSTANCE_FAIL = "flush_instance_fail"
ACT_SYNC_VPCS = "sync_vpcs"
ACT_SYNC_RECORD_SETS = "sync_record_sets"
)
+2 -1
View File
@@ -33,6 +33,7 @@ import (
"yunion.io/x/onecloud/pkg/cloudcommon/db"
"yunion.io/x/onecloud/pkg/cloudcommon/policy"
"yunion.io/x/onecloud/pkg/httperrors"
"yunion.io/x/onecloud/pkg/i18n"
"yunion.io/x/onecloud/pkg/mcclient"
"yunion.io/x/onecloud/pkg/mcclient/auth"
"yunion.io/x/onecloud/pkg/util/rbacutils"
@@ -347,7 +348,7 @@ func (manager *SQuotaBaseManager) setQuotaHandler(ctx context.Context, w http.Re
err := body.Unmarshal(quota, manager.KeywordPlural())
if err != nil {
log.Errorf("Fail to decode JSON request body: %s", err)
httperrors.InvalidInputError(httperrors.WithRequestLang(ctx, r), w, "fail to decode body")
httperrors.InvalidInputError(i18n.WithRequestLang(ctx, r), w, "fail to decode body")
return
}
+2 -2
View File
@@ -31,7 +31,7 @@ import (
"yunion.io/x/onecloud/pkg/appsrv"
"yunion.io/x/onecloud/pkg/cloudcommon/consts"
"yunion.io/x/onecloud/pkg/httperrors"
"yunion.io/x/onecloud/pkg/i18n"
"yunion.io/x/onecloud/pkg/mcclient"
"yunion.io/x/onecloud/pkg/mcclient/auth"
"yunion.io/x/onecloud/pkg/mcclient/modulebase"
@@ -55,7 +55,7 @@ func init() {
}
func getLangSuffix(ctx context.Context) string {
lang := httperrors.Lang(ctx)
lang := i18n.Lang(ctx)
switch lang {
case language.English:
return "en"
+1 -1
View File
@@ -155,7 +155,7 @@ func (self *SQcloudGuestDriver) ValidateCreateData(ctx context.Context, userCred
return nil, httperrors.NewInputParameterError("The %s disk size must be in the range of 100GB ~ 16000GB", disk.Backend)
}
case api.STORAGE_LOCAL_PRO:
return nil, httperrors.NewInputParameterError("storage %s can not be data disk")
return nil, httperrors.NewInputParameterError("storage %s can not be data disk", disk.Backend)
}
if disk.SizeMb/1024%10 > 0 {
return nil, httperrors.NewInputParameterError("Data disk size must be an integer multiple of 10G")
+1 -1
View File
@@ -3080,7 +3080,7 @@ func (self *SCloudaccount) AllowPerformCreateSubscription(ctx context.Context, u
// 创建Azure订阅
func (self *SCloudaccount) PerformCreateSubscription(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject, input api.SubscriptonCreateInput) (jsonutils.JSONObject, error) {
if self.Provider != api.CLOUD_PROVIDER_AZURE {
return nil, httperrors.NewNotSupportedError("%s not support create subscription")
return nil, httperrors.NewNotSupportedError("%s not support create subscription", self.Provider)
}
if len(input.Name) == 0 {
return nil, httperrors.NewMissingParameterError("name")
+1 -1
View File
@@ -138,7 +138,7 @@ func (manager *SDnsZoneManager) ValidateCreateData(ctx context.Context, userCred
}
err = quotas.CheckSetPendingQuota(ctx, userCred, quota)
if err != nil {
return input, httperrors.NewOutOfQuotaError(err.Error())
return input, httperrors.NewOutOfQuotaError("%v", err)
}
return input, nil
}
+2 -2
View File
@@ -241,11 +241,11 @@ func (man *SDnsRecordManager) checkRecordName(typ, name string) error {
}
case "SRV":
if !regutils.MatchDomainSRV(name) {
return httperrors.NewNotAcceptableError("SRV: invalid srv record name: %s", typ, name)
return httperrors.NewNotAcceptableError("SRV: invalid srv record name: %s", name)
}
case "PTR":
if !regutils.MatchPtr(name) {
return httperrors.NewNotAcceptableError("PTR: invalid ptr record name: %s", typ, name)
return httperrors.NewNotAcceptableError("PTR: invalid ptr record name: %s", name)
}
}
if regutils.MatchIPAddr(name) {
+1 -1
View File
@@ -540,7 +540,7 @@ func (gt *SGuestTemplate) PerformPublic(
model, err := NetworkManager.FetchByIdOrName(userCred, str)
if err != nil {
return nil, httperrors.NewResourceNotFoundError(
"there is no such secgroup %s descripted by guest template")
"there is no such secgroup %s descripted by guest template", str)
}
network := model.(*SNetwork)
netScope := rbacutils.String2Scope(network.PublicScope)
+1 -1
View File
@@ -5421,7 +5421,7 @@ func (host *SHost) PerformSetReservedResourceForIsolatedDevice(
caps := host.GetAttachedLocalStorageCapacity()
if input.ReservedStorage != nil && caps.Capacity < int64(*input.ReservedStorage*len(devs)) {
return nil, httperrors.NewBadRequestError(
"host %s can't reserve %dM storage for each isolated device, not enough")
"host %s can't reserve %dM storage for each isolated device, not enough", host.Name, input.ReservedStorage)
}
defer func() {
go host.ClearSchedDescCache()
@@ -298,7 +298,7 @@ func (lbagent *SLoadbalancerAgent) validateHost(ctx context.Context, userCred mc
func (lbagent *SLoadbalancerAgent) PerformDeploy(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject, data *jsonutils.JSONDict) (*jsonutils.JSONDict, error) {
input := &compute_apis.LoadbalancerAgentDeployInput{}
if err := data.Unmarshal(input); err != nil {
return nil, httperrors.NewBadRequestError("unmarshal input", err)
return nil, httperrors.NewBadRequestError("unmarshal input: %v", err)
}
host := input.Host
for _, k := range []string{"user", "pass", "proj"} {
@@ -203,10 +203,10 @@ func (man *SLoadbalancerBackendGroupManager) ValidateCreateData(ctx context.Cont
backends[i].BackendType = api.LB_BACKEND_GUEST
}
if backends[i].Weight < 0 || backends[i].Weight > 256 {
return nil, httperrors.NewInputParameterError("weight %s not support, only support range 0 ~ 256")
return nil, httperrors.NewInputParameterError("weight %d not support, only support range 0 ~ 256", backends[i].Weight)
}
if backends[i].Port < 1 || backends[i].Port > 65535 {
return nil, httperrors.NewInputParameterError("port %s not support, only support range 1 ~ 65535")
return nil, httperrors.NewInputParameterError("port %d not support, only support range 1 ~ 65535", backends[i].Port)
}
if len(backends[i].ID) == 0 {
return nil, httperrors.NewMissingParameterError("Missing backend id")
+1 -1
View File
@@ -947,7 +947,7 @@ func isValidNetworkInfo(userCred mcclient.TokenCredential, netConfig *api.Networ
if len(netConfig.Network) > 0 {
netObj, err := NetworkManager.FetchByIdOrName(userCred, netConfig.Network)
if err != nil {
return httperrors.NewResourceNotFoundError("Network %s not found %s", err)
return httperrors.NewResourceNotFoundError("Network %s not found: %v", netConfig.Network, err)
}
net := netObj.(*SNetwork)
/*
+1 -1
View File
@@ -175,7 +175,7 @@ func (st *SScalingTimer) ValidateCreateData(input api.ScalingPolicyCreateInput)
input.CycleTimer, err = checkCycleTimerCreateInput(input.CycleTimer)
}
if err != nil {
return input, httperrors.NewInputParameterError(err.Error())
return input, httperrors.NewInputParameterError("%v", err)
}
return input, nil
}
+1 -1
View File
@@ -179,7 +179,7 @@ func (stm *SScheduledTaskManager) ValidateCreateData(ctx context.Context, userCr
input.CycleTimer, err = checkCycleTimerCreateInput(input.CycleTimer)
}
if err != nil {
return input, httperrors.NewInputParameterError(err.Error())
return input, httperrors.NewInputParameterError("%v", err)
}
return input, nil
}
+3 -2
View File
@@ -1147,7 +1147,7 @@ func (self *SAliyunRegionDriver) ValidateCreateDBInstanceAccountData(ctx context
for i, s := range input.Name {
if !unicode.IsLetter(s) && !unicode.IsDigit(s) && s != '_' {
return input, httperrors.NewInputParameterError("invalid character %s for account name", s)
return input, httperrors.NewInputParameterError("invalid character %s for account name", string(s))
}
if s == '_' && (i == 0 || i == len(input.Name)) {
return input, httperrors.NewInputParameterError("account name can not start or end with _")
@@ -1396,7 +1396,8 @@ func (self *SAliyunRegionDriver) ValidateCreateElasticcacheAccountData(ctx conte
}
if accountPrivilegeV.Value == "repl" && elasticCacheV.Model.(*models.SElasticcache).EngineVersion != "4.0" {
return nil, httperrors.NewInputParameterError("account_privilege %s only support redis version 4.0")
return nil, httperrors.NewInputParameterError("account_privilege %s only support redis version 4.0",
accountPrivilegeV.Value)
}
return data, nil
+1 -1
View File
@@ -2558,7 +2558,7 @@ func (self *SHuaWeiRegionDriver) RequestCreateElasticcache(ctx context.Context,
}
func (self *SHuaWeiRegionDriver) ValidateCreateElasticcacheAccountData(ctx context.Context, userCred mcclient.TokenCredential, ownerId mcclient.IIdentityProvider, data *jsonutils.JSONDict) (*jsonutils.JSONDict, error) {
return nil, httperrors.NewUnsupportOperationError("% not support create account", self.GetProvider())
return nil, httperrors.NewUnsupportOperationError("%s not support create account", self.GetProvider())
}
func (self *SHuaWeiRegionDriver) RequestElasticcacheAccountResetPassword(ctx context.Context, userCred mcclient.TokenCredential, ea *models.SElasticcacheAccount, task taskman.ITask) error {
+3 -56
View File
@@ -19,53 +19,13 @@ import (
"net/http"
"runtime/debug"
"golang.org/x/text/language"
"yunion.io/x/jsonutils"
"yunion.io/x/log"
"yunion.io/x/onecloud/pkg/i18n"
"yunion.io/x/onecloud/pkg/util/httputils"
)
type ctxLang uintptr
const ctxLangKey = ctxLang(0)
const LangHeader = "X-Yunion-Lang"
func SetLangHeader(ctx context.Context, header http.Header) bool {
langv := ctx.Value(ctxLangKey)
langTag, ok := langv.(language.Tag)
if ok {
header.Set(LangHeader, langTag.String())
}
return ok
}
func WithLangTag(ctx context.Context, tag language.Tag) context.Context {
return context.WithValue(ctx, ctxLangKey, tag)
}
func WithLang(ctx context.Context, lang string) context.Context {
tag, err := language.Parse(lang)
if err != nil {
tag = language.English
}
return WithLangTag(ctx, tag)
}
func WithRequestLang(ctx context.Context, req *http.Request) context.Context {
if val := req.URL.Query().Get("lang"); val != "" {
return WithLang(ctx, val)
}
if val := req.Header.Get(LangHeader); val != "" {
return WithLang(ctx, val)
}
if cookie, err := req.Cookie("lang"); err == nil {
return WithLang(ctx, cookie.Value)
}
return WithLangTag(ctx, language.English)
}
func SendHTTPErrorHeader(w http.ResponseWriter, statusCode int) {
w.Header().Set("Content-Type", "application/json")
w.WriteHeader(statusCode)
@@ -100,29 +60,16 @@ func formatDetails(ctx context.Context, errData httputils.Error, msg string) str
if errData.Id == "" {
details = msg
} else {
lang := Lang(ctx)
lang := i18n.Lang(ctx)
a := make([]interface{}, len(errData.Fields))
for i := range errData.Fields {
a[i] = errData.Fields[i]
}
details = P(lang, errData.Id, a...)
details = i18n.P(lang, errData.Id, a...)
}
return details
}
func Lang(ctx context.Context) language.Tag {
var (
langv = ctx.Value(ctxLangKey)
lang language.Tag
)
if langv != nil {
lang = langv.(language.Tag)
} else {
lang = language.English
}
return lang
}
func HTTPError(ctx context.Context, w http.ResponseWriter, msg string, statusCode int, class string, errData httputils.Error) {
details := formatDetails(ctx, errData, msg)
if statusCode >= 300 && statusCode <= 400 {
+65
View File
@@ -0,0 +1,65 @@
package i18n
import (
"context"
"net/http"
"golang.org/x/text/language"
)
type ctxLang uintptr
const (
ctxLangKey = ctxLang(0)
)
func WithLangTag(ctx context.Context, tag language.Tag) context.Context {
return context.WithValue(ctx, ctxLangKey, tag)
}
func WithLang(ctx context.Context, lang string) context.Context {
tag, err := language.Parse(lang)
if err != nil {
tag = language.English
}
return WithLangTag(ctx, tag)
}
func WithRequestLang(ctx context.Context, req *http.Request) context.Context {
if val := req.URL.Query().Get("lang"); val != "" {
return WithLang(ctx, val)
}
if val := req.Header.Get(LangHeader); val != "" {
return WithLang(ctx, val)
}
if cookie, err := req.Cookie("lang"); err == nil {
return WithLang(ctx, cookie.Value)
}
return WithLangTag(ctx, language.English)
}
func Lang(ctx context.Context) language.Tag {
var (
langv = ctx.Value(ctxLangKey)
lang language.Tag
)
if langv != nil {
lang = langv.(language.Tag)
} else {
lang = language.English
}
return lang
}
const (
LangHeader = "X-Yunion-Lang"
)
func SetHTTPLangHeader(ctx context.Context, header http.Header) bool {
langv := ctx.Value(ctxLangKey)
langTag, ok := langv.(language.Tag)
if ok {
header.Set(LangHeader, langTag.String())
}
return ok
}
+1
View File
@@ -0,0 +1 @@
package i18n // import "yunion.io/x/onecloud/pkg/i18n"
+1 -1
View File
@@ -1,4 +1,4 @@
package httperrors
package i18n
import (
"golang.org/x/text/language"
+57
View File
@@ -0,0 +1,57 @@
package i18n
import (
"context"
"golang.org/x/text/language"
)
type ITable interface {
Lookup(ctx context.Context, key string) string
}
type TableEntry map[language.Tag]string
type Table map[string]TableEntry
func NewTableEntry() TableEntry {
return TableEntry{}
}
func (te TableEntry) CN(v string) TableEntry {
te[language.Chinese] = v
return te
}
func (te TableEntry) EN(v string) TableEntry {
te[language.English] = v
return te
}
func (tbl Table) Set(k string, te TableEntry) {
tbl[k] = te
}
func (tbl Table) Lookup(ctx context.Context, key string) string {
te, ok := tbl[key]
if !ok {
return key
}
lang := Lang(ctx)
lang = tableLangMatch(lang)
v, ok := te[lang]
if !ok {
return key
}
return v
}
var tableLangSupported = []language.Tag{
language.English,
language.Chinese,
}
var tableLangMatcher = language.NewMatcher(tableLangSupported)
func tableLangMatch(tag language.Tag) language.Tag {
_, i, _ := tableLangMatcher.Match(tag)
return tableLangSupported[i]
}
+9 -3
View File
@@ -47,9 +47,9 @@ type SActionlogManager struct {
type SActionlog struct {
db.SOpsLog
StartTime time.Time `nullable:"true" list:"user" create:"optional"` // = Column(DateTime, nullable=False)
Success bool `list:"user" create:"required"` // = Column(Boolean, default=True)
Service string `width:"32" charset:"utf8" nullable:"true" list:"user" create:"optional"` //= Column(VARCHAR(32, charset='utf8'), nullable=False)
StartTime time.Time `nullable:"true" list:"user" create:"optional"`
Success bool `list:"user" create:"required"`
Service string `width:"32" charset:"utf8" nullable:"true" list:"user" create:"optional"`
}
var ActionLog *SActionlogManager
@@ -74,6 +74,12 @@ func (action *SActionlog) CustomizeCreate(ctx context.Context, userCred mcclient
return action.SOpsLog.CustomizeCreate(ctx, userCred, ownerId, query, data)
}
func (action *SActionlog) GetI18N(ctx context.Context) *jsonutils.JSONDict {
r := jsonutils.NewDict()
r.Set("action", jsonutils.NewString(logclient.OpsActionI18nTable.Lookup(ctx, action.Action)))
return r
}
// Websockets 不再拉取 ActionLog 的消息,因此注释掉如下代码
// 可以保留,以便有需求时,再次打开
// func (manager *SActionlogManager) OnCreateComplete(ctx context.Context, items []db.IModel, userCred mcclient.TokenCredential, query jsonutils.JSONObject, data jsonutils.JSONObject) {
+3 -3
View File
@@ -30,7 +30,7 @@ import (
"yunion.io/x/pkg/utils"
api "yunion.io/x/onecloud/pkg/apis/identity"
"yunion.io/x/onecloud/pkg/httperrors"
"yunion.io/x/onecloud/pkg/i18n"
"yunion.io/x/onecloud/pkg/util/httputils"
)
@@ -209,7 +209,7 @@ func (this *ClientSession) RawBaseUrlRequest(
populateHeader(&tmpHeader, headers)
}
populateHeader(&tmpHeader, this.Header)
httperrors.SetLangHeader(this.ctx, tmpHeader)
i18n.SetHTTPLangHeader(this.ctx, tmpHeader)
ctx := this.ctx
if this.ctx == nil {
ctx = context.Background()
@@ -245,7 +245,7 @@ func (this *ClientSession) JSONVersionRequest(
populateHeader(&tmpHeader, headers)
}
populateHeader(&tmpHeader, this.Header)
httperrors.SetLangHeader(this.ctx, tmpHeader)
i18n.SetHTTPLangHeader(this.ctx, tmpHeader)
ctx := this.ctx
if this.ctx == nil {
ctx = context.Background()
+5 -3
View File
@@ -24,6 +24,7 @@ import (
"yunion.io/x/log"
"yunion.io/x/onecloud/pkg/httperrors"
"yunion.io/x/onecloud/pkg/i18n"
)
type EndpointGenerator func(context.Context, *http.Request) (string, error)
@@ -54,14 +55,15 @@ func NewHTTPReverseProxy(ef *SEndpointFactory, m RequestManipulator) *SReversePr
}
func (p *SReverseProxy) ServeHTTP(ctx context.Context, w http.ResponseWriter, r *http.Request) {
ctx = i18n.WithRequestLang(ctx, r)
endpoint, err := p.generator(ctx, r)
if err != nil {
httperrors.InternalServerError(httperrors.WithRequestLang(ctx, r), w, "%v", err)
httperrors.InternalServerError(ctx, w, "%v", err)
return
}
remoteUrl, err := url.Parse(endpoint)
if err != nil {
httperrors.InternalServerError(httperrors.WithRequestLang(ctx, r), w, "failed parsing url %q: %v", endpoint, err)
httperrors.InternalServerError(ctx, w, "failed parsing url %q: %v", endpoint, err)
return
}
log.Debugf("Forwarding to servie: %q, url: %q", p.serviceName, remoteUrl.String())
@@ -73,7 +75,7 @@ func (p *SReverseProxy) ServeHTTP(ctx context.Context, w http.ResponseWriter, r
}
r, err = p.manipulator(ctx, r)
if err != nil {
httperrors.InternalServerError(httperrors.WithRequestLang(ctx, r), w, "%v", err)
httperrors.InternalServerError(ctx, w, "%v", err)
return
}
proxy.ServeHTTP(w, r)
+8 -19
View File
@@ -24,27 +24,16 @@ import (
// class: error class
// msg: message
// params: message format parameters
func NewJsonClientError(code int, class string, msg string, params ...interface{}) *JSONClientError {
details, err := errorMessage(msg, params...)
return &JSONClientError{Code: code, Class: class, Details: details, Data: err}
}
func errorMessage(msgFmt string, params ...interface{}) (string, Error) {
fields := make([]string, len(params))
for i, v := range params {
fields[i] = fmt.Sprint(v)
}
err := Error{
Id: msgFmt,
Fields: fields,
}
msg := msgFmt
func NewJsonClientError(code int, class string, msgFmt string, params ...interface{}) *JSONClientError {
details := msgFmt
if len(params) > 0 {
msg = fmt.Sprintf(msg, params...)
details = fmt.Sprintf(msgFmt, params...)
}
return msg, err
theErr := Error{
Id: msgFmt,
Fields: params,
}
return &JSONClientError{Code: code, Class: class, Details: details, Data: theErr}
}
func msgFmtToTmpl(msgFmt string) string {
-6
View File
@@ -50,12 +50,6 @@ func TestVariadic(t *testing.T) {
},
}
for _, c := range cases {
t.Run(c.name, func(t *testing.T) {
msg, _ := errorMessage(c.msg, c.params...)
if msg != c.out {
t.Errorf("want %s, got %s", c.out, msg)
}
})
t.Run(c.name+"_New", func(t *testing.T) {
err := NewJsonClientError(400, "InputParameterError", c.msg, c.params...)
if err.Details != c.out {
+2 -2
View File
@@ -70,8 +70,8 @@ var (
)
type Error struct {
Id string `json:"id,omitempty"`
Fields []string `json:"fields,omitempty"`
Id string `json:"id,omitempty"`
Fields []interface{} `json:"fields,omitempty"`
}
type JSONClientError struct {
+137 -173
View File
@@ -14,204 +14,168 @@
package logclient
// 这些状态不做 websocket 通知
var BlackList = []string{
ACT_CLOUD_FULLSYNC,
ACT_CREATE,
ACT_DELETE,
ACT_PENDING_DELETE,
ACT_PRIVATE,
ACT_PUBLIC,
ACT_UPDATE,
ACT_VM_SYNC_STATUS,
ACT_VM_SYNC_CONF,
}
// 这些状态需要做 websocket 通知
var WhiteList = []string{
ACT_ADDTAG, ACT_ALLOCATE, ACT_DELOCATE, ACT_BM_CONVERT_HYPER,
ACT_BM_MAINTENANCE, ACT_BM_UNCONVERT_HYPER, ACT_BM_UNMAINTENANCE,
ACT_CANCEL_DELETE, ACT_CHANGE_OWNER, ACT_SYNC_CLOUD_OWNER,
ACT_CLOUD_SYNC, ACT_DISABLE, ACT_ENABLE,
ACT_GUEST_ATTACH_ISOLATED_DEVICE, ACT_GUEST_DETACH_ISOLATED_DEVICE,
ACT_MERGE, ACT_OFFLINE, ACT_ONLINE, ACT_RELEASE_IP,
ACT_RESERVE_IP, ACT_RESIZE, ACT_RMTAG, ACT_SPLIT,
ACT_UNCACHED_IMAGE, ACT_VM_ATTACH_DISK, ACT_VM_BIND_KEYPAIR,
ACT_VM_CHANGE_FLAVOR, ACT_VM_DEPLOY, ACT_VM_DETACH_DISK,
ACT_VM_PURGE, ACT_VM_REBUILD, ACT_VM_RESET_PSWD,
ACT_VM_CHANGE_BANDWIDTH, ACT_VM_START, ACT_VM_STOP,
ACT_VM_RESTART, ACT_VM_UNBIND_KEYPAIR, ACT_VM_ASSIGNSECGROUP,
ACT_VM_REVOKESECGROUP, ACT_VM_SETSECGROUP, ACT_RESET_DISK,
ACT_SYNC_STATUS, ACT_SYNC_CONF, ACT_CREATE_BACKUP,
ACT_SWITCH_TO_BACKUP, ACT_RENEW, ACT_MIGRATE,
ACT_IMAGE_SAVE, ACT_RECYCLE_PREPAID, ACT_UNDO_RECYCLE_PREPAID,
ACT_FETCH, ACT_VM_CHANGE_NIC, ACT_HOST_IMPORT_LIBVIRT_SERVERS,
ACT_GUEST_CREATE_FROM_IMPORT, ACT_DISK_CREATE_SNAPSHOT,
ACT_IMAGE_PROBE,
}
const (
ACT_ADDTAG = "添加标签"
ACT_ALLOCATE = "分配"
ACT_DELOCATE = "释放资源"
ACT_BM_CONVERT_HYPER = "转换为宿主机"
ACT_BM_MAINTENANCE = "进入离线状态"
ACT_BM_UNCONVERT_HYPER = "转换为受管物理机"
ACT_BM_UNMAINTENANCE = "退出离线状态"
ACT_CANCEL_DELETE = "恢复"
ACT_CHANGE_OWNER = "更改项目"
ACT_SYNC_CLOUD_OWNER = "同步云项目"
ACT_CLOUD_FULLSYNC = "全量同步"
ACT_CLOUD_SYNC = "同步"
ACT_CREATE = "创建"
ACT_DELETE = "删除"
ACT_PENDING_DELETE = "预删除"
ACT_DISABLE = "禁用"
ACT_ENABLE = "启用"
ACT_GUEST_ATTACH_ISOLATED_DEVICE = "挂载透传设备"
ACT_GUEST_DETACH_ISOLATED_DEVICE = "卸载透传设备"
ACT_MERGE = "合并"
ACT_OFFLINE = "下线"
ACT_ONLINE = "上线"
ACT_PRIVATE = "设为私有"
ACT_PUBLIC = "设为共享"
ACT_RELEASE_IP = "释放IP"
ACT_RESERVE_IP = "预留IP"
ACT_RESIZE = "扩容"
ACT_RMTAG = "删除标签"
ACT_SPLIT = "分割"
ACT_UNCACHED_IMAGE = "清除缓存"
ACT_UPDATE = "更新"
ACT_VM_ATTACH_DISK = "挂载磁盘"
ACT_VM_BIND_KEYPAIR = "绑定密钥"
ACT_VM_CHANGE_FLAVOR = "调整配置"
ACT_VM_DEPLOY = "部署"
ACT_VM_DETACH_DISK = "卸载磁盘"
ACT_VM_PURGE = "清除"
ACT_VM_REBUILD = "重装系统"
ACT_VM_RESET_PSWD = "重置密码"
ACT_VM_CHANGE_BANDWIDTH = "调整带宽"
ACT_VM_SRC_CHECK = "调整源IP、MAC地址检查"
ACT_VM_START = "开机"
ACT_VM_STOP = "关机"
ACT_VM_RESTART = "重启"
ACT_VM_SYNC_CONF = "同步配置"
ACT_VM_SYNC_STATUS = "同步状态"
ACT_VM_UNBIND_KEYPAIR = "解绑密钥"
ACT_VM_ASSIGNSECGROUP = "关联安全组"
ACT_VM_REVOKESECGROUP = "取消关联安全组"
ACT_VM_SETSECGROUP = "设置安全组"
ACT_RESET_DISK = "回滚磁盘"
ACT_SYNC_STATUS = "同步状态"
ACT_SYNC_CONF = "同步配置"
ACT_CREATE_BACKUP = "创建备份机"
ACT_SWITCH_TO_BACKUP = "主备切换"
ACT_RENEW = "续费"
ACT_SET_AUTO_RENEW = "设置自动续费"
ACT_MIGRATE = "迁移"
ACT_EIP_ASSOCIATE = "绑定弹性IP"
ACT_EIP_DISSOCIATE = "解绑弹性IP"
ACT_EIP_CONVERT = "弹性IP转换"
ACT_CHANGE_BANDWIDTH = "调整带宽"
ACT_DISK_CREATE_SNAPSHOT = "磁盘创建快照"
ACT_LB_ADD_BACKEND = "添加后端服务器"
ACT_LB_REMOVE_BACKEND = "移除后端服务器"
ACT_ADDTAG = "addtag"
ACT_ALLOCATE = "allocate"
ACT_DELOCATE = "delocate"
ACT_BM_CONVERT_HYPER = "bm_convert_hyper"
ACT_BM_MAINTENANCE = "bm_maintenance"
ACT_BM_UNCONVERT_HYPER = "bm_unconvert_hyper"
ACT_BM_UNMAINTENANCE = "bm_unmaintenance"
ACT_CANCEL_DELETE = "cancel_delete"
ACT_CHANGE_OWNER = "change_owner"
ACT_SYNC_CLOUD_OWNER = "sync_cloud_owner"
ACT_CLOUD_FULLSYNC = "cloud_fullsync"
ACT_CLOUD_SYNC = "cloud_sync"
ACT_CREATE = "create"
ACT_DELETE = "delete"
ACT_PENDING_DELETE = "pending_delete"
ACT_DISABLE = "disable"
ACT_ENABLE = "enable"
ACT_GUEST_ATTACH_ISOLATED_DEVICE = "guest_attach_isolated_device"
ACT_GUEST_DETACH_ISOLATED_DEVICE = "guest_detach_isolated_device"
ACT_MERGE = "merge"
ACT_OFFLINE = "offline"
ACT_ONLINE = "online"
ACT_PRIVATE = "private"
ACT_PUBLIC = "public"
ACT_RELEASE_IP = "release_ip"
ACT_RESERVE_IP = "reserve_ip"
ACT_RESIZE = "resize"
ACT_RMTAG = "rmtag"
ACT_SPLIT = "split"
ACT_UNCACHED_IMAGE = "uncached_image"
ACT_UPDATE = "update"
ACT_VM_ATTACH_DISK = "vm_attach_disk"
ACT_VM_BIND_KEYPAIR = "vm_bind_keypair"
ACT_VM_CHANGE_FLAVOR = "vm_change_flavor"
ACT_VM_DEPLOY = "vm_deploy"
ACT_VM_DETACH_DISK = "vm_detach_disk"
ACT_VM_PURGE = "vm_purge"
ACT_VM_REBUILD = "vm_rebuild"
ACT_VM_RESET_PSWD = "vm_reset_pswd"
ACT_VM_CHANGE_BANDWIDTH = "vm_change_bandwidth"
ACT_VM_SRC_CHECK = "vm_src_check"
ACT_VM_START = "vm_start"
ACT_VM_STOP = "vm_stop"
ACT_VM_RESTART = "vm_restart"
ACT_VM_SYNC_CONF = "vm_sync_conf"
ACT_VM_SYNC_STATUS = "vm_sync_status"
ACT_VM_UNBIND_KEYPAIR = "vm_unbind_keypair"
ACT_VM_ASSIGNSECGROUP = "vm_assignsecgroup"
ACT_VM_REVOKESECGROUP = "vm_revokesecgroup"
ACT_VM_SETSECGROUP = "vm_setsecgroup"
ACT_RESET_DISK = "reset_disk"
ACT_SYNC_STATUS = "sync_status"
ACT_SYNC_CONF = "sync_conf"
ACT_CREATE_BACKUP = "create_backup"
ACT_SWITCH_TO_BACKUP = "switch_to_backup"
ACT_RENEW = "renew"
ACT_SET_AUTO_RENEW = "set_auto_renew"
ACT_MIGRATE = "migrate"
ACT_EIP_ASSOCIATE = "eip_associate"
ACT_EIP_DISSOCIATE = "eip_dissociate"
ACT_EIP_CONVERT = "eip_convert"
ACT_CHANGE_BANDWIDTH = "change_bandwidth"
ACT_DISK_CREATE_SNAPSHOT = "disk_create_snapshot"
ACT_LB_ADD_BACKEND = "lb_add_backend"
ACT_LB_REMOVE_BACKEND = "lb_remove_backend"
ACL_LB_SYNC_BACKEND_CONF = "同步后端服务器配置"
ACT_LB_ADD_LISTENER_RULE = "添加负载均衡转发规则"
ACT_LB_REMOVE_LISTENER_RULE = "移除负载均衡转发规则"
ACT_DELETE_BACKUP = "删除备份机"
ACT_APPLY_SNAPSHOT_POLICY = "绑定快照策略"
ACT_CANCEL_SNAPSHOT_POLICY = "取消快照策略"
ACT_BIND_DISK = "绑定磁盘"
ACT_UNBIND_DISK = "解绑磁盘"
ACT_ATTACH_HOST = "关联宿主机"
ACT_DETACH_HOST = "取消关联宿主机"
ACT_VM_IO_THROTTLE = "虚拟机磁盘限速"
ACT_VM_RESET = "虚拟机回滚快照"
ACT_VM_SNAPSHOT_AND_CLONE = "虚拟机快照并克隆"
ACT_VM_BLOCK_STREAM = "同步数据"
ACT_ATTACH_NETWORK = "绑定网卡"
ACT_VM_CONVERT = "虚拟机转换Hypervisor"
ACT_LB_ADD_LISTENER_RULE = "lb_add_listener_rule"
ACT_LB_REMOVE_LISTENER_RULE = "lb_remove_listener_rule"
ACT_DELETE_BACKUP = "delete_backup"
ACT_APPLY_SNAPSHOT_POLICY = "apply_snapshot_policy"
ACT_CANCEL_SNAPSHOT_POLICY = "cancel_snapshot_policy"
ACT_BIND_DISK = "bind_disk"
ACT_UNBIND_DISK = "unbind_disk"
ACT_ATTACH_HOST = "attach_host"
ACT_DETACH_HOST = "detach_host"
ACT_VM_IO_THROTTLE = "vm_io_throttle"
ACT_VM_RESET = "vm_reset"
ACT_VM_SNAPSHOT_AND_CLONE = "vm_snapshot_and_clone"
ACT_VM_BLOCK_STREAM = "vm_block_stream"
ACT_ATTACH_NETWORK = "attach_network"
ACT_VM_CONVERT = "vm_convert"
ACT_CACHED_IMAGE = "缓存镜像"
ACT_CACHED_IMAGE = "cached_image"
ACT_REBOOT = "重启"
ACT_CHANGE_CONFIG = "调整配置"
ACT_REBOOT = "reboot"
ACT_CHANGE_CONFIG = "change_config"
ACT_OPEN_PUBLIC_CONNECTION = "打开外网地址"
ACT_CLOSE_PUBLIC_CONNECTION = "关闭外网地址"
ACT_OPEN_PUBLIC_CONNECTION = "open_public_connection"
ACT_CLOSE_PUBLIC_CONNECTION = "close_public_connection"
ACT_IMAGE_SAVE = "上传镜像"
ACT_IMAGE_PROBE = "镜像检测"
ACT_IMAGE_SAVE = "image_save"
ACT_IMAGE_PROBE = "image_probe"
ACT_AUTHENTICATE = "认证登录"
ACT_AUTHENTICATE = "authenticate"
ACT_HEALTH_CHECK = "健康检查"
ACT_HEALTH_CHECK = "health_check"
ACT_RECYCLE_PREPAID = "池化预付费主机"
ACT_UNDO_RECYCLE_PREPAID = "取消池化预付费主机"
ACT_RECYCLE_PREPAID = "recycle_prepaid"
ACT_UNDO_RECYCLE_PREPAID = "undo_recycle_prepaid"
ACT_FETCH = "下载密钥"
ACT_FETCH = "fetch"
ACT_VM_CHANGE_NIC = "更改网卡配置"
ACT_VM_CHANGE_NIC = "vm_change_nic"
ACT_HOST_IMPORT_LIBVIRT_SERVERS = "libvirt托管虚拟机导入"
ACT_GUEST_CREATE_FROM_IMPORT = "导入虚拟机创建"
ACT_GUEST_PANICKED = "GuestPanicked"
ACT_HOST_MAINTAINING = "宿主机进入维护模式"
ACT_HOST_IMPORT_LIBVIRT_SERVERS = "host_import_libvirt_servers"
ACT_GUEST_CREATE_FROM_IMPORT = "guest_create_from_import"
ACT_GUEST_PANICKED = "guest_panicked"
ACT_HOST_MAINTAINING = "host_maintaining"
ACT_MKDIR = "创建目录"
ACT_DELETE_OBJECT = "删除对象"
ACT_UPLOAD_OBJECT = "上传对象"
ACT_MKDIR = "mkdir"
ACT_DELETE_OBJECT = "delete_object"
ACT_UPLOAD_OBJECT = "upload_object"
ACT_NAT_CREATE_SNAT = "创建SNAT规则"
ACT_NAT_CREATE_DNAT = "创建DNAT规则"
ACT_NAT_DELETE_SNAT = "删除SNAT规则"
ACT_NAT_DELETE_DNAT = "删除DNAT规则"
ACT_NAT_CREATE_SNAT = "nat_create_snat"
ACT_NAT_CREATE_DNAT = "nat_create_dnat"
ACT_NAT_DELETE_SNAT = "nat_delete_snat"
ACT_NAT_DELETE_DNAT = "nat_delete_dnat"
ACT_GRANT_PRIVILEGE = "赋予权限"
ACT_REVOKE_PRIVILEGE = "解除权限"
ACT_SET_PRIVILEGES = "设置权限"
ACT_RESTORE = "备份恢复"
ACT_RESET_PASSWORD = "重置密码"
ACT_GRANT_PRIVILEGE = "grant_privilege"
ACT_REVOKE_PRIVILEGE = "revoke_privilege"
ACT_SET_PRIVILEGES = "set_privileges"
ACT_RESTORE = "restore"
ACT_RESET_PASSWORD = "reset_password"
ACT_VM_ASSOCIATE = "绑定虚拟机"
ACT_VM_DISSOCIATE = "解绑虚拟机"
ACT_NATGATEWAY_DISSOCIATE = "解绑NAT网关"
ACT_LOADBALANCER_DISSOCIATE = "解绑负载均衡"
ACT_VM_ASSOCIATE = "vm_associate"
ACT_VM_DISSOCIATE = "vm_dissociate"
ACT_NATGATEWAY_DISSOCIATE = "natgateway_dissociate"
ACT_LOADBALANCER_DISSOCIATE = "loadbalancer_dissociate"
ACT_PREPARE = "同步硬件配置"
ACT_PROBE = "检测配置"
ACT_PREPARE = "prepare"
ACT_PROBE = "probe"
ACT_INSTANCE_GROUP_BIND = "绑定主机组"
ACT_INSTANCE_GROUP_UNBIND = "解绑主机组"
ACT_INSTANCE_GROUP_BIND = "instance_group_bind"
ACT_INSTANCE_GROUP_UNBIND = "instance_group_unbind"
ACT_FLUSH_INSTANCE = "清空数据"
ACT_FLUSH_INSTANCE = "flush_instance"
ACT_UPDATE_STATUS = "更新状态"
ACT_UPDATE_STATUS = "update_status"
ACT_UPDATE_PASSWORD = "更新密码"
ACT_UPDATE_PASSWORD = "update_password"
ACT_REMOVE_GUEST = "移除实例"
ACT_CREATE_SCALING_POLICY = "创建伸缩策略"
ACT_DELETE_SCALING_POLICY = "删除伸缩策略"
ACT_REMOVE_GUEST = "remove_guest"
ACT_CREATE_SCALING_POLICY = "create_scaling_policy"
ACT_DELETE_SCALING_POLICY = "delete_scaling_policy"
ACT_SAVE_TO_TEMPLATE = "保存为模版"
ACT_SAVE_TO_TEMPLATE = "save_to_template"
ACT_SYNC_POLICIES = "同步权限"
ACT_SYNC_USERS = "同步用户"
ACT_ADD_USER = "添加用户"
ACT_REMOVE_USER = "移除用户"
ACT_ATTACH_POLICY = "绑定权限"
ACT_DETACH_POLICY = "移除权限"
ACT_SYNC_POLICIES = "sync_policies"
ACT_SYNC_USERS = "sync_users"
ACT_ADD_USER = "add_user"
ACT_REMOVE_USER = "remove_user"
ACT_ATTACH_POLICY = "attach_policy"
ACT_DETACH_POLICY = "detach_policy"
ACT_UPDATE_BILLING_OPTIONS = "更新账单文件"
ACT_UPDATE_CREDENTIAL = "更新账号密码"
ACT_UPDATE_BILLING_OPTIONS = "update_billing_options"
ACT_UPDATE_CREDENTIAL = "update_credential"
ACT_PULL_SUBCONTACT = "拉取联系方式"
ACT_SEND_NOTIFICATION = "发送通知消息"
ACT_SEND_VERIFICATION = "发送验证消息"
ACT_PULL_SUBCONTACT = "pull_subcontact"
ACT_SEND_NOTIFICATION = "send_notification"
ACT_SEND_VERIFICATION = "send_verification"
ACT_SYNC_VPCS = "同步VPC"
ACT_SYNC_RECORD_SETS = "同步解析列表"
ACT_SYNC_VPCS = "sync_vpcs"
ACT_SYNC_RECORD_SETS = "sync_record_sets"
)
+602
View File
@@ -0,0 +1,602 @@
// Copyright 2019 Yunion
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package logclient
import (
"yunion.io/x/onecloud/pkg/i18n"
)
var OpsActionI18nTable = i18n.Table{}
func init() {
t := OpsActionI18nTable
t.Set(ACT_ADDTAG, i18n.NewTableEntry().
EN("Addtag").
CN("添加标签"),
)
t.Set(ACT_ALLOCATE, i18n.NewTableEntry().
EN("Allocate").
CN("分配"),
)
t.Set(ACT_DELOCATE, i18n.NewTableEntry().
EN("Delocate").
CN("释放资源"),
)
t.Set(ACT_BM_CONVERT_HYPER, i18n.NewTableEntry().
EN("Bm Convert Hyper").
CN("转换为宿主机"),
)
t.Set(ACT_BM_MAINTENANCE, i18n.NewTableEntry().
EN("Bm Maintenance").
CN("进入离线状态"),
)
t.Set(ACT_BM_UNCONVERT_HYPER, i18n.NewTableEntry().
EN("Bm Unconvert Hyper").
CN("转换为受管物理机"),
)
t.Set(ACT_BM_UNMAINTENANCE, i18n.NewTableEntry().
EN("Bm Unmaintenance").
CN("退出离线状态"),
)
t.Set(ACT_CANCEL_DELETE, i18n.NewTableEntry().
EN("Cancel Delete").
CN("恢复"),
)
t.Set(ACT_CHANGE_OWNER, i18n.NewTableEntry().
EN("Change Owner").
CN("更改项目"),
)
t.Set(ACT_SYNC_CLOUD_OWNER, i18n.NewTableEntry().
EN("Sync Cloud Owner").
CN("同步云项目"),
)
t.Set(ACT_CLOUD_FULLSYNC, i18n.NewTableEntry().
EN("Cloud Fullsync").
CN("全量同步"),
)
t.Set(ACT_CLOUD_SYNC, i18n.NewTableEntry().
EN("Cloud Sync").
CN("同步"),
)
t.Set(ACT_CREATE, i18n.NewTableEntry().
EN("Create").
CN("创建"),
)
t.Set(ACT_DELETE, i18n.NewTableEntry().
EN("Delete").
CN("删除"),
)
t.Set(ACT_PENDING_DELETE, i18n.NewTableEntry().
EN("Pending Delete").
CN("预删除"),
)
t.Set(ACT_DISABLE, i18n.NewTableEntry().
EN("Disable").
CN("禁用"),
)
t.Set(ACT_ENABLE, i18n.NewTableEntry().
EN("Enable").
CN("启用"),
)
t.Set(ACT_GUEST_ATTACH_ISOLATED_DEVICE, i18n.NewTableEntry().
EN("Guest Attach Isolated Device").
CN("挂载透传设备"),
)
t.Set(ACT_GUEST_DETACH_ISOLATED_DEVICE, i18n.NewTableEntry().
EN("Guest Detach Isolated Device").
CN("卸载透传设备"),
)
t.Set(ACT_MERGE, i18n.NewTableEntry().
EN("Merge").
CN("合并"),
)
t.Set(ACT_OFFLINE, i18n.NewTableEntry().
EN("Offline").
CN("下线"),
)
t.Set(ACT_ONLINE, i18n.NewTableEntry().
EN("Online").
CN("上线"),
)
t.Set(ACT_PRIVATE, i18n.NewTableEntry().
EN("Private").
CN("设为私有"),
)
t.Set(ACT_PUBLIC, i18n.NewTableEntry().
EN("Public").
CN("设为共享"),
)
t.Set(ACT_RELEASE_IP, i18n.NewTableEntry().
EN("Release Ip").
CN("释放IP"),
)
t.Set(ACT_RESERVE_IP, i18n.NewTableEntry().
EN("Reserve Ip").
CN("预留IP"),
)
t.Set(ACT_RESIZE, i18n.NewTableEntry().
EN("Resize").
CN("扩容"),
)
t.Set(ACT_RMTAG, i18n.NewTableEntry().
EN("Rmtag").
CN("删除标签"),
)
t.Set(ACT_SPLIT, i18n.NewTableEntry().
EN("Split").
CN("分割"),
)
t.Set(ACT_UNCACHED_IMAGE, i18n.NewTableEntry().
EN("Uncached Image").
CN("清除缓存"),
)
t.Set(ACT_UPDATE, i18n.NewTableEntry().
EN("Update").
CN("更新"),
)
t.Set(ACT_VM_ATTACH_DISK, i18n.NewTableEntry().
EN("Vm Attach Disk").
CN("挂载磁盘"),
)
t.Set(ACT_VM_BIND_KEYPAIR, i18n.NewTableEntry().
EN("Vm Bind Keypair").
CN("绑定密钥"),
)
t.Set(ACT_VM_CHANGE_FLAVOR, i18n.NewTableEntry().
EN("Vm Change Flavor").
CN("调整配置"),
)
t.Set(ACT_VM_DEPLOY, i18n.NewTableEntry().
EN("Vm Deploy").
CN("部署"),
)
t.Set(ACT_VM_DETACH_DISK, i18n.NewTableEntry().
EN("Vm Detach Disk").
CN("卸载磁盘"),
)
t.Set(ACT_VM_PURGE, i18n.NewTableEntry().
EN("Vm Purge").
CN("清除"),
)
t.Set(ACT_VM_REBUILD, i18n.NewTableEntry().
EN("Vm Rebuild").
CN("重装系统"),
)
t.Set(ACT_VM_RESET_PSWD, i18n.NewTableEntry().
EN("Vm Reset Pswd").
CN("重置密码"),
)
t.Set(ACT_VM_CHANGE_BANDWIDTH, i18n.NewTableEntry().
EN("Vm Change Bandwidth").
CN("调整带宽"),
)
t.Set(ACT_VM_SRC_CHECK, i18n.NewTableEntry().
EN("Vm Src Check").
CN("调整源IP、MAC地址检查"),
)
t.Set(ACT_VM_START, i18n.NewTableEntry().
EN("Vm Start").
CN("开机"),
)
t.Set(ACT_VM_STOP, i18n.NewTableEntry().
EN("Vm Stop").
CN("关机"),
)
t.Set(ACT_VM_RESTART, i18n.NewTableEntry().
EN("Vm Restart").
CN("重启"),
)
t.Set(ACT_VM_SYNC_CONF, i18n.NewTableEntry().
EN("Vm Sync Conf").
CN("同步配置"),
)
t.Set(ACT_VM_SYNC_STATUS, i18n.NewTableEntry().
EN("Vm Sync Status").
CN("同步状态"),
)
t.Set(ACT_VM_UNBIND_KEYPAIR, i18n.NewTableEntry().
EN("Vm Unbind Keypair").
CN("解绑密钥"),
)
t.Set(ACT_VM_ASSIGNSECGROUP, i18n.NewTableEntry().
EN("Vm Assignsecgroup").
CN("关联安全组"),
)
t.Set(ACT_VM_REVOKESECGROUP, i18n.NewTableEntry().
EN("Vm Revokesecgroup").
CN("取消关联安全组"),
)
t.Set(ACT_VM_SETSECGROUP, i18n.NewTableEntry().
EN("Vm Setsecgroup").
CN("设置安全组"),
)
t.Set(ACT_RESET_DISK, i18n.NewTableEntry().
EN("Reset Disk").
CN("回滚磁盘"),
)
t.Set(ACT_SYNC_STATUS, i18n.NewTableEntry().
EN("Sync Status").
CN("同步状态"),
)
t.Set(ACT_SYNC_CONF, i18n.NewTableEntry().
EN("Sync Conf").
CN("同步配置"),
)
t.Set(ACT_CREATE_BACKUP, i18n.NewTableEntry().
EN("Create Backup").
CN("创建备份机"),
)
t.Set(ACT_SWITCH_TO_BACKUP, i18n.NewTableEntry().
EN("Switch To Backup").
CN("主备切换"),
)
t.Set(ACT_RENEW, i18n.NewTableEntry().
EN("Renew").
CN("续费"),
)
t.Set(ACT_SET_AUTO_RENEW, i18n.NewTableEntry().
EN("Set Auto Renew").
CN("设置自动续费"),
)
t.Set(ACT_MIGRATE, i18n.NewTableEntry().
EN("Migrate").
CN("迁移"),
)
t.Set(ACT_EIP_ASSOCIATE, i18n.NewTableEntry().
EN("Eip Associate").
CN("绑定弹性IP"),
)
t.Set(ACT_EIP_DISSOCIATE, i18n.NewTableEntry().
EN("Eip Dissociate").
CN("解绑弹性IP"),
)
t.Set(ACT_EIP_CONVERT, i18n.NewTableEntry().
EN("Eip Convert").
CN("弹性IP转换"),
)
t.Set(ACT_CHANGE_BANDWIDTH, i18n.NewTableEntry().
EN("Change Bandwidth").
CN("调整带宽"),
)
t.Set(ACT_DISK_CREATE_SNAPSHOT, i18n.NewTableEntry().
EN("Disk Create Snapshot").
CN("磁盘创建快照"),
)
t.Set(ACT_LB_ADD_BACKEND, i18n.NewTableEntry().
EN("Lb Add Backend").
CN("添加后端服务器"),
)
t.Set(ACT_LB_REMOVE_BACKEND, i18n.NewTableEntry().
EN("Lb Remove Backend").
CN("移除后端服务器"),
)
t.Set(ACL_LB_SYNC_BACKEND_CONF, i18n.NewTableEntry().
CN("同步后端服务器配置"),
)
t.Set(ACT_LB_ADD_LISTENER_RULE, i18n.NewTableEntry().
EN("Lb Add Listener Rule").
CN("添加负载均衡转发规则"),
)
t.Set(ACT_LB_REMOVE_LISTENER_RULE, i18n.NewTableEntry().
EN("Lb Remove Listener Rule").
CN("移除负载均衡转发规则"),
)
t.Set(ACT_DELETE_BACKUP, i18n.NewTableEntry().
EN("Delete Backup").
CN("删除备份机"),
)
t.Set(ACT_APPLY_SNAPSHOT_POLICY, i18n.NewTableEntry().
EN("Apply Snapshot Policy").
CN("绑定快照策略"),
)
t.Set(ACT_CANCEL_SNAPSHOT_POLICY, i18n.NewTableEntry().
EN("Cancel Snapshot Policy").
CN("取消快照策略"),
)
t.Set(ACT_BIND_DISK, i18n.NewTableEntry().
EN("Bind Disk").
CN("绑定磁盘"),
)
t.Set(ACT_UNBIND_DISK, i18n.NewTableEntry().
EN("Unbind Disk").
CN("解绑磁盘"),
)
t.Set(ACT_ATTACH_HOST, i18n.NewTableEntry().
EN("Attach Host").
CN("关联宿主机"),
)
t.Set(ACT_DETACH_HOST, i18n.NewTableEntry().
EN("Detach Host").
CN("取消关联宿主机"),
)
t.Set(ACT_VM_IO_THROTTLE, i18n.NewTableEntry().
EN("Vm Io Throttle").
CN("虚拟机磁盘限速"),
)
t.Set(ACT_VM_RESET, i18n.NewTableEntry().
EN("Vm Reset").
CN("虚拟机回滚快照"),
)
t.Set(ACT_VM_SNAPSHOT_AND_CLONE, i18n.NewTableEntry().
EN("Vm Snapshot And Clone").
CN("虚拟机快照并克隆"),
)
t.Set(ACT_VM_BLOCK_STREAM, i18n.NewTableEntry().
EN("Vm Block Stream").
CN("同步数据"),
)
t.Set(ACT_ATTACH_NETWORK, i18n.NewTableEntry().
EN("Attach Network").
CN("绑定网卡"),
)
t.Set(ACT_VM_CONVERT, i18n.NewTableEntry().
EN("Vm Convert").
CN("虚拟机转换Hypervisor"),
)
t.Set(ACT_CACHED_IMAGE, i18n.NewTableEntry().
EN("Cached Image").
CN("缓存镜像"),
)
t.Set(ACT_REBOOT, i18n.NewTableEntry().
EN("Reboot").
CN("重启"),
)
t.Set(ACT_CHANGE_CONFIG, i18n.NewTableEntry().
EN("Change Config").
CN("调整配置"),
)
t.Set(ACT_OPEN_PUBLIC_CONNECTION, i18n.NewTableEntry().
EN("Open Public Connection").
CN("打开外网地址"),
)
t.Set(ACT_CLOSE_PUBLIC_CONNECTION, i18n.NewTableEntry().
EN("Close Public Connection").
CN("关闭外网地址"),
)
t.Set(ACT_IMAGE_SAVE, i18n.NewTableEntry().
EN("Image Save").
CN("上传镜像"),
)
t.Set(ACT_IMAGE_PROBE, i18n.NewTableEntry().
EN("Image Probe").
CN("镜像检测"),
)
t.Set(ACT_AUTHENTICATE, i18n.NewTableEntry().
EN("Authenticate").
CN("认证登录"),
)
t.Set(ACT_HEALTH_CHECK, i18n.NewTableEntry().
EN("Health Check").
CN("健康检查"),
)
t.Set(ACT_RECYCLE_PREPAID, i18n.NewTableEntry().
EN("Recycle Prepaid").
CN("池化预付费主机"),
)
t.Set(ACT_UNDO_RECYCLE_PREPAID, i18n.NewTableEntry().
EN("Undo Recycle Prepaid").
CN("取消池化预付费主机"),
)
t.Set(ACT_FETCH, i18n.NewTableEntry().
EN("Fetch").
CN("下载密钥"),
)
t.Set(ACT_VM_CHANGE_NIC, i18n.NewTableEntry().
EN("Vm Change Nic").
CN("更改网卡配置"),
)
t.Set(ACT_HOST_IMPORT_LIBVIRT_SERVERS, i18n.NewTableEntry().
EN("Host Import Libvirt Servers").
CN("libvirt托管虚拟机导入"),
)
t.Set(ACT_GUEST_CREATE_FROM_IMPORT, i18n.NewTableEntry().
EN("Guest Create From Import").
CN("导入虚拟机创建"),
)
t.Set(ACT_GUEST_PANICKED, i18n.NewTableEntry().
EN("Guest Panicked").
CN("GuestPanicked"),
)
t.Set(ACT_HOST_MAINTAINING, i18n.NewTableEntry().
EN("Host Maintaining").
CN("宿主机进入维护模式"),
)
t.Set(ACT_MKDIR, i18n.NewTableEntry().
EN("Mkdir").
CN("创建目录"),
)
t.Set(ACT_DELETE_OBJECT, i18n.NewTableEntry().
EN("Delete Object").
CN("删除对象"),
)
t.Set(ACT_UPLOAD_OBJECT, i18n.NewTableEntry().
EN("Upload Object").
CN("上传对象"),
)
t.Set(ACT_NAT_CREATE_SNAT, i18n.NewTableEntry().
EN("Nat Create Snat").
CN("创建SNAT规则"),
)
t.Set(ACT_NAT_CREATE_DNAT, i18n.NewTableEntry().
EN("Nat Create Dnat").
CN("创建DNAT规则"),
)
t.Set(ACT_NAT_DELETE_SNAT, i18n.NewTableEntry().
EN("Nat Delete Snat").
CN("删除SNAT规则"),
)
t.Set(ACT_NAT_DELETE_DNAT, i18n.NewTableEntry().
EN("Nat Delete Dnat").
CN("删除DNAT规则"),
)
t.Set(ACT_GRANT_PRIVILEGE, i18n.NewTableEntry().
EN("Grant Privilege").
CN("赋予权限"),
)
t.Set(ACT_REVOKE_PRIVILEGE, i18n.NewTableEntry().
EN("Revoke Privilege").
CN("解除权限"),
)
t.Set(ACT_SET_PRIVILEGES, i18n.NewTableEntry().
EN("Set Privileges").
CN("设置权限"),
)
t.Set(ACT_RESTORE, i18n.NewTableEntry().
EN("Restore").
CN("备份恢复"),
)
t.Set(ACT_RESET_PASSWORD, i18n.NewTableEntry().
EN("Reset Password").
CN("重置密码"),
)
t.Set(ACT_VM_ASSOCIATE, i18n.NewTableEntry().
EN("Vm Associate").
CN("绑定虚拟机"),
)
t.Set(ACT_VM_DISSOCIATE, i18n.NewTableEntry().
EN("Vm Dissociate").
CN("解绑虚拟机"),
)
t.Set(ACT_NATGATEWAY_DISSOCIATE, i18n.NewTableEntry().
EN("Natgateway Dissociate").
CN("解绑NAT网关"),
)
t.Set(ACT_LOADBALANCER_DISSOCIATE, i18n.NewTableEntry().
EN("Loadbalancer Dissociate").
CN("解绑负载均衡"),
)
t.Set(ACT_PREPARE, i18n.NewTableEntry().
EN("Prepare").
CN("同步硬件配置"),
)
t.Set(ACT_PROBE, i18n.NewTableEntry().
EN("Probe").
CN("检测配置"),
)
t.Set(ACT_INSTANCE_GROUP_BIND, i18n.NewTableEntry().
EN("Instance Group Bind").
CN("绑定主机组"),
)
t.Set(ACT_INSTANCE_GROUP_UNBIND, i18n.NewTableEntry().
EN("Instance Group Unbind").
CN("解绑主机组"),
)
t.Set(ACT_FLUSH_INSTANCE, i18n.NewTableEntry().
EN("Flush Instance").
CN("清空数据"),
)
t.Set(ACT_UPDATE_STATUS, i18n.NewTableEntry().
EN("Update Status").
CN("更新状态"),
)
t.Set(ACT_UPDATE_PASSWORD, i18n.NewTableEntry().
EN("Update Password").
CN("更新密码"),
)
t.Set(ACT_REMOVE_GUEST, i18n.NewTableEntry().
EN("Remove Guest").
CN("移除实例"),
)
t.Set(ACT_CREATE_SCALING_POLICY, i18n.NewTableEntry().
EN("Create Scaling Policy").
CN("创建伸缩策略"),
)
t.Set(ACT_DELETE_SCALING_POLICY, i18n.NewTableEntry().
EN("Delete Scaling Policy").
CN("删除伸缩策略"),
)
t.Set(ACT_SAVE_TO_TEMPLATE, i18n.NewTableEntry().
EN("Save To Template").
CN("保存为模版"),
)
t.Set(ACT_SYNC_POLICIES, i18n.NewTableEntry().
EN("Sync Policies").
CN("同步权限"),
)
t.Set(ACT_SYNC_USERS, i18n.NewTableEntry().
EN("Sync Users").
CN("同步用户"),
)
t.Set(ACT_ADD_USER, i18n.NewTableEntry().
EN("Add User").
CN("添加用户"),
)
t.Set(ACT_REMOVE_USER, i18n.NewTableEntry().
EN("Remove User").
CN("移除用户"),
)
t.Set(ACT_ATTACH_POLICY, i18n.NewTableEntry().
EN("Attach Policy").
CN("绑定权限"),
)
t.Set(ACT_DETACH_POLICY, i18n.NewTableEntry().
EN("Detach Policy").
CN("移除权限"),
)
t.Set(ACT_UPDATE_BILLING_OPTIONS, i18n.NewTableEntry().
EN("Update Billing Options").
CN("更新账单文件"),
)
t.Set(ACT_UPDATE_CREDENTIAL, i18n.NewTableEntry().
EN("Update Credential").
CN("更新账号密码"),
)
t.Set(ACT_PULL_SUBCONTACT, i18n.NewTableEntry().
EN("Pull Subcontact").
CN("拉取联系方式"),
)
t.Set(ACT_SEND_NOTIFICATION, i18n.NewTableEntry().
EN("Send Notification").
CN("发送通知消息"),
)
t.Set(ACT_SEND_VERIFICATION, i18n.NewTableEntry().
EN("Send Verification").
CN("发送验证消息"),
)
t.Set(ACT_SYNC_VPCS, i18n.NewTableEntry().
EN("Sync Vpcs").
CN("同步VPC"),
)
t.Set(ACT_SYNC_RECORD_SETS, i18n.NewTableEntry().
EN("Sync Record Sets").
CN("同步解析列表"),
)
}
+88
View File
@@ -0,0 +1,88 @@
// Copyright 2019 Yunion
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package logclient
// 这些状态不做 websocket 通知
var BlackList = []string{
ACT_CLOUD_FULLSYNC,
ACT_CREATE,
ACT_DELETE,
ACT_PENDING_DELETE,
ACT_PRIVATE,
ACT_PUBLIC,
ACT_UPDATE,
ACT_VM_SYNC_STATUS,
ACT_VM_SYNC_CONF,
}
// 这些状态需要做 websocket 通知
var WhiteList = []string{
ACT_ADDTAG,
ACT_ALLOCATE,
ACT_DELOCATE,
ACT_BM_CONVERT_HYPER,
ACT_BM_MAINTENANCE,
ACT_BM_UNCONVERT_HYPER,
ACT_BM_UNMAINTENANCE,
ACT_CANCEL_DELETE,
ACT_CHANGE_OWNER,
ACT_SYNC_CLOUD_OWNER,
ACT_CLOUD_SYNC,
ACT_DISABLE,
ACT_ENABLE,
ACT_GUEST_ATTACH_ISOLATED_DEVICE,
ACT_GUEST_DETACH_ISOLATED_DEVICE,
ACT_MERGE,
ACT_OFFLINE,
ACT_ONLINE,
ACT_RELEASE_IP,
ACT_RESERVE_IP,
ACT_RESIZE,
ACT_RMTAG,
ACT_SPLIT,
ACT_UNCACHED_IMAGE,
ACT_VM_ATTACH_DISK,
ACT_VM_BIND_KEYPAIR,
ACT_VM_CHANGE_FLAVOR,
ACT_VM_DEPLOY,
ACT_VM_DETACH_DISK,
ACT_VM_PURGE,
ACT_VM_REBUILD,
ACT_VM_RESET_PSWD,
ACT_VM_CHANGE_BANDWIDTH,
ACT_VM_START,
ACT_VM_STOP,
ACT_VM_RESTART,
ACT_VM_UNBIND_KEYPAIR,
ACT_VM_ASSIGNSECGROUP,
ACT_VM_REVOKESECGROUP,
ACT_VM_SETSECGROUP,
ACT_RESET_DISK,
ACT_SYNC_STATUS,
ACT_SYNC_CONF,
ACT_CREATE_BACKUP,
ACT_SWITCH_TO_BACKUP,
ACT_RENEW,
ACT_MIGRATE,
ACT_IMAGE_SAVE,
ACT_RECYCLE_PREPAID,
ACT_UNDO_RECYCLE_PREPAID,
ACT_FETCH,
ACT_VM_CHANGE_NIC,
ACT_HOST_IMPORT_LIBVIRT_SERVERS,
ACT_GUEST_CREATE_FROM_IMPORT,
ACT_DISK_CREATE_SNAPSHOT,
ACT_IMAGE_PROBE,
}
+2 -1
View File
@@ -22,6 +22,7 @@ import (
"yunion.io/x/log"
"yunion.io/x/onecloud/pkg/httperrors"
"yunion.io/x/onecloud/pkg/i18n"
"yunion.io/x/onecloud/pkg/webconsole/session"
)
@@ -34,7 +35,7 @@ func NewConnectionServer() *ConnectionServer {
func (s *ConnectionServer) ServeHTTP(w http.ResponseWriter, req *http.Request) {
ctx := context.Background()
ctx = httperrors.WithRequestLang(ctx, req)
ctx = i18n.WithRequestLang(ctx, req)
query, err := jsonutils.ParseQueryString(req.URL.RawQuery)
if err != nil {
httperrors.GeneralServerError(ctx, w, err)