From debf079e2efa3ddc0f1064973154098481dfb367 Mon Sep 17 00:00:00 2001 From: Qiu Jian Date: Wed, 20 Nov 2019 18:38:19 +0800 Subject: [PATCH] feature: add network-status methods to change status of on-premise network --- cmd/climc/shell/networks.go | 15 +++++++++++++++ cmd/climc/shell/tasks.go | 17 +++++++---------- pkg/cloudcommon/db/statusstandalone.go | 9 +++++---- pkg/compute/models/networks.go | 19 +++++++++++++++++++ 4 files changed, 46 insertions(+), 14 deletions(-) diff --git a/cmd/climc/shell/networks.go b/cmd/climc/shell/networks.go index e384fd14e8..8e5639f3ed 100644 --- a/cmd/climc/shell/networks.go +++ b/cmd/climc/shell/networks.go @@ -445,4 +445,19 @@ func init() { printObject(result) return nil }) + + type NetworkStatusOptions struct { + NETWORK string `help:"id or name of network to sync" json:"-"` + STATUS string `help:"status of network" choices:"available|unavailable" json:"status"` + Reason string `help:"reason to change status" json:"reason"` + } + R(&NetworkStatusOptions{}, "network-status", "Set on-premise network status", func(s *mcclient.ClientSession, args *NetworkStatusOptions) error { + params := jsonutils.Marshal(args) + result, err := modules.Networks.PerformAction(s, args.NETWORK, "status", params) + if err != nil { + return err + } + printObject(result) + return nil + }) } diff --git a/cmd/climc/shell/tasks.go b/cmd/climc/shell/tasks.go index c7989982d8..50e4b7277f 100644 --- a/cmd/climc/shell/tasks.go +++ b/cmd/climc/shell/tasks.go @@ -44,16 +44,13 @@ func init() { return nil }) - R(&TaskListOptions{}, "region-task-list", "List tasks on region server", func(s *mcclient.ClientSession, suboptions *TaskListOptions) error { - var params *jsonutils.JSONDict - { - var err error - params, err = suboptions.BaseListOptions.Params() - if err != nil { - return err - - } - } + type RegionTaskListOptions struct { + ObjName string `help:"object name"` + ObjId string `help:"object id"` + TaskName string `help:"task name"` + } + R(&RegionTaskListOptions{}, "region-task-list", "List tasks on region server", func(s *mcclient.ClientSession, args *RegionTaskListOptions) error { + params := jsonutils.Marshal(args) result, err := modules.ComputeTasks.List(s, params) if err != nil { return err diff --git a/pkg/cloudcommon/db/statusstandalone.go b/pkg/cloudcommon/db/statusstandalone.go index 11395e55ba..e696171629 100644 --- a/pkg/cloudcommon/db/statusstandalone.go +++ b/pkg/cloudcommon/db/statusstandalone.go @@ -21,6 +21,7 @@ import ( "yunion.io/x/jsonutils" "yunion.io/x/pkg/utils" + "yunion.io/x/onecloud/pkg/httperrors" "yunion.io/x/onecloud/pkg/mcclient" "yunion.io/x/onecloud/pkg/util/rbacutils" ) @@ -66,12 +67,12 @@ func (model *SStatusStandaloneResourceBase) AllowPerformStatus(ctx context.Conte } func (model *SStatusStandaloneResourceBase) PerformStatus(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject, data jsonutils.JSONObject) (jsonutils.JSONObject, error) { - status, err := data.GetString("status") - if err != nil { - return nil, err + status, _ := data.GetString("status") + if len(status) == 0 { + return nil, httperrors.NewMissingParameterError("status") } reason, _ := data.GetString("reason") - err = model.SetStatus(userCred, status, reason) + err := model.SetStatus(userCred, status, reason) return nil, err } diff --git a/pkg/compute/models/networks.go b/pkg/compute/models/networks.go index 2ef96d8878..20ac960866 100644 --- a/pkg/compute/models/networks.go +++ b/pkg/compute/models/networks.go @@ -2443,3 +2443,22 @@ func (net *SNetwork) StartNetworkSyncstatusTask(ctx context.Context, userCred mc task.ScheduleRun(nil) return nil } + +func (net *SNetwork) AllowPerformStatus(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject, data jsonutils.JSONObject) bool { + return net.IsOwner(userCred) || db.IsAdminAllowPerform(userCred, net, "status") +} + +func (net *SNetwork) PerformStatus(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject, data jsonutils.JSONObject) (jsonutils.JSONObject, error) { + status, _ := data.GetString("status") + if len(status) == 0 { + return nil, httperrors.NewMissingParameterError("status") + } + vpc := net.GetVpc() + if vpc != nil && vpc.IsManaged() { + return nil, httperrors.NewUnsupportOperationError("managed network cannot change status") + } + if !utils.IsInStringArray(status, []string{api.NETWORK_STATUS_AVAILABLE, api.NETWORK_STATUS_UNAVAILABLE}) { + return nil, httperrors.NewInputParameterError("invalid status %s", status) + } + return net.SSharableVirtualResourceBase.PerformStatus(ctx, userCred, query, data) +}