From 1530ca8914b96b987685e48f3690ea667783eb19 Mon Sep 17 00:00:00 2001 From: wanyaoqi Date: Fri, 30 Nov 2018 20:30:10 +0800 Subject: [PATCH] add guest extra options --- cmd/climc/shell/servers.go | 30 +++++++++++++++++++++ pkg/compute/models/guest_actions.go | 42 +++++++++++++++++++++++++++++ 2 files changed, 72 insertions(+) diff --git a/cmd/climc/shell/servers.go b/cmd/climc/shell/servers.go index d6957bfb8e..6e978ed90f 100644 --- a/cmd/climc/shell/servers.go +++ b/cmd/climc/shell/servers.go @@ -467,4 +467,34 @@ func init() { printObject(result) return nil }) + type ServerAddExtraOption struct { + ID string `help:"ID or name of server"` + KEY string `help:"Option key"` + VALUE string `help:"Option value"` + } + R(&ServerAddExtraOption{}, "server-add-extra-options", "Add server extra options", func(s *mcclient.ClientSession, args *ServerAddExtraOption) error { + params := jsonutils.NewDict() + params.Add(jsonutils.NewString(args.KEY), "key") + params.Add(jsonutils.NewString(args.VALUE), "value") + result, err := modules.Servers.PerformAction(s, args.ID, "set-extra-option", params) + if err != nil { + return err + } + printObject(result) + return nil + }) + type ServerRemoveExtraOption struct { + ID string `help:"ID or name of server"` + KEY string `help:"Option key"` + } + R(&ServerRemoveExtraOption{}, "server-remove-extra-options", "Remove server extra options", func(s *mcclient.ClientSession, args *ServerRemoveExtraOption) error { + params := jsonutils.NewDict() + params.Add(jsonutils.NewString(args.KEY), "key") + result, err := modules.Servers.PerformAction(s, args.ID, "del-extra-option", params) + if err != nil { + return err + } + printObject(result) + return nil + }) } diff --git a/pkg/compute/models/guest_actions.go b/pkg/compute/models/guest_actions.go index 3174208e9b..e1585d8980 100644 --- a/pkg/compute/models/guest_actions.go +++ b/pkg/compute/models/guest_actions.go @@ -1571,3 +1571,45 @@ func (self *SGuest) PerformCreateEip(ctx context.Context, userCred mcclient.Toke return nil, nil } + +func (self *SGuest) AllowPerformSetExtraOption(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject, data jsonutils.JSONObject) bool { + return userCred.IsSystemAdmin() +} + +func (self *SGuest) PerformSetExtraOption(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject, data jsonutils.JSONObject) (jsonutils.JSONObject, error) { + key, err := data.GetString("key") + if err != nil { + return nil, httperrors.NewBadRequestError("Option key required") + } + value, _ := data.GetString("value") + extraOptions := self.GetExtraOptions(userCred) + extraOptions.Set(key, jsonutils.NewString(value)) + return nil, self.SetExtraOptions(ctx, userCred, extraOptions) +} + +func (self *SGuest) GetExtraOptions(userCred mcclient.TokenCredential) *jsonutils.JSONDict { + options := self.GetMetadataJson("extra_options", userCred) + o, ok := options.(*jsonutils.JSONDict) + if ok { + return o + } + return jsonutils.NewDict() +} + +func (self *SGuest) SetExtraOptions(ctx context.Context, userCred mcclient.TokenCredential, extraOptions *jsonutils.JSONDict) error { + return self.SetMetadata(ctx, "extra_options", extraOptions, userCred) +} + +func (self *SGuest) AllowPerformDelExtraOption(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject, data jsonutils.JSONObject) bool { + return userCred.IsSystemAdmin() +} + +func (self *SGuest) PerformDelExtraOption(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject, data jsonutils.JSONObject) (jsonutils.JSONObject, error) { + key, err := data.GetString("key") + if err != nil { + return nil, httperrors.NewBadRequestError("Option key required") + } + extraOptions := self.GetExtraOptions(userCred) + extraOptions.Remove(key) + return nil, self.SetExtraOptions(ctx, userCred, extraOptions) +}