diff --git a/cmd/climc/shell/parameters.go b/cmd/climc/shell/parameters.go index ed8a6b4fe6..3f825ebaf4 100644 --- a/cmd/climc/shell/parameters.go +++ b/cmd/climc/shell/parameters.go @@ -97,9 +97,14 @@ func init() { } R(&ParametersCreateOptions{}, "parameter-create", "create a parameter", func(s *mcclient.ClientSession, args *ParametersCreateOptions) error { + value, err := jsonutils.ParseString(args.VALUE) + if err != nil { + return err + } + params := jsonutils.NewDict() params.Add(jsonutils.NewString(args.NAME), "name") - params.Add(jsonutils.NewString(args.VALUE), "value") + params.Add(value, "value") if len(args.User) > 0 { params.Add(jsonutils.NewString(args.User), "user_id") @@ -123,13 +128,18 @@ func init() { } R(&ParametersUpdateOptions{}, "parameter-update", "update parameter", func(s *mcclient.ClientSession, args *ParametersUpdateOptions) error { - params := jsonutils.NewDict() - if len(args.VALUE) > 0 { - params.Add(jsonutils.NewString(args.VALUE), "value") - } - var parameter jsonutils.JSONObject var err error + value, err := jsonutils.ParseString(args.VALUE) + if err != nil { + return err + } + + params := jsonutils.NewDict() + if len(args.VALUE) > 0 { + params.Add(value, "value") + } + if len(args.User) > 0 { parameter, err = modules.Parameters.PutInContext(s, args.NAME, params, &modules.UsersV3, args.User) } else if len(args.Service) > 0 { diff --git a/pkg/yunionconf/models/parameters.go b/pkg/yunionconf/models/parameters.go index c21c3fd1e9..ea08195844 100644 --- a/pkg/yunionconf/models/parameters.go +++ b/pkg/yunionconf/models/parameters.go @@ -16,6 +16,9 @@ package models import ( "context" + "yunion.io/x/onecloud/pkg/mcclient/auth" + "yunion.io/x/onecloud/pkg/mcclient/modules" + "yunion.io/x/onecloud/pkg/yunionconf/options" "yunion.io/x/jsonutils" "yunion.io/x/log" @@ -69,20 +72,66 @@ func isAdminQuery(query jsonutils.JSONObject) bool { return false } +func getUserId(user string) (string, error) { + s := auth.GetAdminSession(context.Background(), options.Options.Region, "") + userObj, err := modules.UsersV3.Get(s, user, nil) + if err != nil { + return "", err + } + + uid, err := userObj.GetString("id") + if err != nil { + return "", err + } + + return uid, nil +} + +func getServiceId(service string) (string, error) { + s := auth.GetAdminSession(context.Background(), options.Options.Region, "") + serviceObj, err := modules.ServicesV3.Get(s, service, nil) + if err != nil { + return "", err + } + + uid, err := serviceObj.GetString("id") + if err != nil { + return "", err + } + + return uid, nil +} + func getNamespaceInContext(userCred mcclient.TokenCredential, query jsonutils.JSONObject, data *jsonutils.JSONDict) (namespace string, namespaceId string, err error) { // 优先匹配上线文中的参数, /users//parameters /services//parameters if query != nil { - if uid, _ := query.GetString("user_id"); len(uid) > 0 { + if uid := jsonutils.GetAnyString(query, []string{"user", "user_id"}); len(uid) > 0 { + uid, err := getUserId(uid) + if err != nil { + return "", "", err + } return NAMESPACE_USER, uid, nil - } else if sid, _ := query.GetString("service_id"); len(sid) > 0 { + } else if sid := jsonutils.GetAnyString(query, []string{"service", "service_id"}); len(sid) > 0 { + sid, err := getServiceId(sid) + if err != nil { + return "", "", err + } return NAMESPACE_SERVICE, sid, nil } } // 匹配/parameters中的参数 - if uid, _ := data.GetString("user_id"); len(uid) > 0 { + if uid := jsonutils.GetAnyString(data, []string{"user", "user_id"}); len(uid) > 0 { + uid, err := getUserId(uid) + if err != nil { + return "", "", err + } return NAMESPACE_USER, uid, nil - } else if sid, _ := data.GetString("service_id"); len(sid) > 0 { + } else if sid := jsonutils.GetAnyString(data, []string{"service", "service_id"}); len(sid) > 0 { + sid, err := getServiceId(sid) + if err != nil { + return "", "", err + } return NAMESPACE_SERVICE, sid, nil } else { return NAMESPACE_USER, userCred.GetUserId(), nil @@ -145,6 +194,11 @@ func (manager *SParameterManager) ValidateCreateData(ctx context.Context, userCr return nil, httperrors.NewDuplicateNameError("paramter %s has been created", name) } + _, err = data.Get("value") + if err != nil { + return nil, err + } + data.Add(jsonutils.NewString(uid), "created_by") data.Add(jsonutils.NewString(uid), "updated_by") data.Add(jsonutils.NewString(namespace), "namespace") @@ -172,10 +226,18 @@ func (manager *SParameterManager) ListItemFilter(ctx context.Context, q *sqlchem if db.IsAdminAllowList(userCred, manager) { if id, _ := query.GetString("namespace_id"); len(id) > 0 { q = q.Equals("namespace_id", id) - } else if id, _ := query.GetString("service_id"); len(id) > 0 { - q = q.Equals("namespace_id", id).Equals("namespace", NAMESPACE_SERVICE) - } else if id, _ := query.GetString("user_id"); len(id) > 0 { - q = q.Equals("namespace_id", id).Equals("namespace", NAMESPACE_USER) + } else if id := jsonutils.GetAnyString(query, []string{"service", "service_id"}); len(id) > 0 { + if sid, err := getServiceId(id); err != nil { + return q, err + } else { + q = q.Equals("namespace_id", sid).Equals("namespace", NAMESPACE_SERVICE) + } + } else if id := jsonutils.GetAnyString(query, []string{"user", "user_id"}); len(id) > 0 { + if uid, err := getUserId(id); err != nil { + return q, err + } else { + q = q.Equals("namespace_id", uid).Equals("namespace", NAMESPACE_USER) + } } else { // not admin admin, _ := query.GetString("admin") @@ -207,6 +269,12 @@ func (model *SParameter) ValidateUpdateData(ctx context.Context, userCred mcclie if e != nil { return nil, e } + + _, err := data.Get("value") + if err != nil { + return nil, err + } + data.Add(jsonutils.NewString(uid), "updated_by") data.Add(jsonutils.NewString(namespace_id), "namespace_id") data.Add(jsonutils.NewString(namespace), "namespace")