| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818 |
- // 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 shell
- import (
- "fmt"
- "reflect"
- "strings"
- "yunion.io/x/jsonutils"
- "yunion.io/x/pkg/util/printutils"
- "yunion.io/x/pkg/util/shellutils"
- "yunion.io/x/pkg/utils"
- "yunion.io/x/onecloud/pkg/mcclient"
- "yunion.io/x/onecloud/pkg/mcclient/modulebase"
- )
- type ResourceCmd struct {
- manager modulebase.IBaseManager
- contextManager modulebase.IBaseManager
- keyword string
- prefix string
- printObject func(jsonutils.JSONObject)
- }
- func NewResourceCmd(manager modulebase.IBaseManager) *ResourceCmd {
- return &ResourceCmd{
- manager: manager,
- keyword: manager.GetKeyword(),
- printObject: printObjectRecursive,
- }
- }
- func (cmd *ResourceCmd) SetPrefix(prefix string) *ResourceCmd {
- cmd.prefix = prefix
- return cmd
- }
- func (cmd *ResourceCmd) WithContextManager(manager modulebase.IBaseManager) *ResourceCmd {
- cmd.contextManager = manager
- return cmd
- }
- func (cmd *ResourceCmd) WithKeyword(keyword string) *ResourceCmd {
- return cmd.SetKeyword(keyword)
- }
- func (cmd *ResourceCmd) SetKeyword(keyword string) *ResourceCmd {
- if len(keyword) > 0 {
- cmd.keyword = keyword
- }
- return cmd
- }
- func (cmd *ResourceCmd) PrintObjectYAML() *ResourceCmd {
- cmd.printObject = func(obj jsonutils.JSONObject) {
- fmt.Print(obj.YAMLString())
- }
- return cmd
- }
- func (cmd *ResourceCmd) PrintObjectTable() *ResourceCmd {
- cmd.printObject = printutils.PrintJSONObject
- return cmd
- }
- func (cmd *ResourceCmd) PrintObjectKV() *ResourceCmd {
- cmd.printObject = printObjectFmtKv
- return cmd
- }
- func (cmd *ResourceCmd) PrintObjectFlattenKV() *ResourceCmd {
- cmd.printObject = func(obj jsonutils.JSONObject) {
- printObjectRecursiveEx(obj, printObjectFmtKv)
- }
- return cmd
- }
- type IOpt interface {
- Params() (jsonutils.JSONObject, error)
- }
- type IListOpt interface {
- IOpt
- GetContextId() string
- GetExportFile() string
- GetExportKeys() string
- GetExportTexts() string
- }
- type ICreateOpt interface {
- IOpt
- }
- type IBatchCreateOpt interface {
- IOpt
- GetCountParam() int
- }
- func (cmd ResourceCmd) RunWithDesc(action, desc string, args interface{}, callback interface{}) {
- man := cmd.manager
- prefix := cmd.prefix
- if prefix != "" {
- prefix = cmd.prefix + "-"
- }
- descKeyword := man.GetKeyword()
- if _, ok := args.(IListOpt); ok {
- descKeyword = man.KeyString()
- }
- if desc == "" {
- desc = fmt.Sprintf("%s %s", strings.Title(action), descKeyword)
- }
- descArgs, ok := args.(IWithDescOpt)
- if ok {
- desc = descArgs.Description()
- }
- R(args, fmt.Sprintf("%s%s-%s", prefix, strings.ReplaceAll(cmd.keyword, "_", "-"), action), desc, callback)
- }
- func (cmd ResourceCmd) Run(action string, args interface{}, callback interface{}) {
- cmd.RunWithDesc(action, "", args, callback)
- }
- func (cmd ResourceCmd) List(args IListOpt) {
- man := cmd.manager
- callback := func(s *mcclient.ClientSession, args IListOpt) error {
- params, err := args.Params()
- if err != nil {
- return err
- }
- var result *printutils.ListResult
- contextId := args.GetContextId()
- if cmd.contextManager != nil && len(contextId) > 0 {
- result, err = man.(modulebase.Manager).ListInContext(s, params, cmd.contextManager.(modulebase.Manager), contextId)
- if err != nil {
- return err
- }
- } else {
- result, err = man.List(s, params)
- if err != nil {
- return err
- }
- }
- exportFile := args.GetExportFile()
- if len(exportFile) > 0 {
- ExportList(result, exportFile, args.GetExportKeys(), args.GetExportTexts(), man.GetColumns(s))
- return nil
- }
- PrintList(result, man.GetColumns(s))
- return nil
- }
- cmd.Run("list", args, callback)
- }
- func (cmd ResourceCmd) Create(args ICreateOpt) {
- cmd.CreateWithKeyword("create", args)
- }
- func (cmd ResourceCmd) CreateWithKeyword(keyword string, args ICreateOpt) {
- cmd.Run(keyword, args, cmd.create)
- }
- func (cmd ResourceCmd) create(s *mcclient.ClientSession, args ICreateOpt) error {
- man := cmd.manager
- params, err := args.Params()
- if err != nil {
- return err
- }
- ret, err := man.(modulebase.Manager).Create(s, params)
- if err != nil {
- return err
- }
- PrintObject(ret)
- return nil
- }
- func (cmd ResourceCmd) BatchCreate(args IBatchCreateOpt) {
- cmd.BatchCreateWithKeyword("create", args)
- }
- func (cmd ResourceCmd) BatchCreateWithKeyword(keyword string, args IBatchCreateOpt) {
- cmd.Run(keyword, args, cmd.batchCreate)
- }
- func (cmd ResourceCmd) batchCreate(s *mcclient.ClientSession, args IBatchCreateOpt) error {
- man := cmd.manager.(modulebase.Manager)
- count := args.GetCountParam()
- if count <= 1 {
- return cmd.create(s, args)
- }
- params, err := args.Params()
- if err != nil {
- return err
- }
- rets := man.BatchCreate(s, params, count)
- printBatchResults(rets, man.GetColumns(s))
- return nil
- }
- type IIdOpt interface {
- GetId() string
- }
- type IIdsOpt interface {
- GetIds() []string
- }
- type IShowOpt interface {
- IOpt
- IIdOpt
- }
- type IPropertyOpt interface {
- IOpt
- Property() string
- }
- func (cmd ResourceCmd) GetPropertyWithShowFunc(args IPropertyOpt, showFunc func(jsonutils.JSONObject) error) {
- man := cmd.manager
- callback := func(s *mcclient.ClientSession, args IPropertyOpt) error {
- params, err := args.Params()
- if err != nil {
- return err
- }
- ret, err := man.(modulebase.Manager).Get(s, args.Property(), params)
- if err != nil {
- return err
- }
- err = showFunc(ret)
- if err != nil {
- return err
- }
- return nil
- }
- cmd.RunWithDesc(args.Property(), fmt.Sprintf("Get property of a %s", man.GetKeyword()), args, callback)
- }
- func (cmd ResourceCmd) GetProperty(args IPropertyOpt) {
- cmd.GetPropertyWithShowFunc(args, func(ret jsonutils.JSONObject) error {
- if _, ok := ret.(*jsonutils.JSONArray); ok {
- data, _ := ret.GetArray()
- PrintList(&printutils.ListResult{
- Data: data,
- }, nil)
- } else {
- PrintObject(ret)
- }
- return nil
- })
- }
- func (cmd ResourceCmd) Show(args IShowOpt) {
- man := cmd.manager
- callback := func(s *mcclient.ClientSession, args IShowOpt) error {
- params, err := args.Params()
- if err != nil {
- return err
- }
- ret, err := man.(modulebase.Manager).Get(s, args.GetId(), params)
- if err != nil {
- return err
- }
- PrintObject(ret)
- return nil
- }
- cmd.RunWithDesc("show", fmt.Sprintf("Show details of a %s", man.GetKeyword()), args, callback)
- }
- func (cmd ResourceCmd) ClassShow(args IShowOpt) {
- man := cmd.manager
- callback := func(s *mcclient.ClientSession, args IShowOpt) error {
- params, err := args.Params()
- if err != nil {
- return err
- }
- ret, err := man.(modulebase.Manager).Get(s, args.GetId(), params)
- if err != nil {
- return err
- }
- PrintObject(ret)
- return nil
- }
- cmd.RunWithDesc(args.GetId(), fmt.Sprintf("Show %s of a %s", args.GetId(), man.GetKeyword()), args, callback)
- }
- type IGetActionOpt interface {
- IOpt
- IIdOpt
- }
- type TCustomAction string
- const (
- CustomActionGet = TCustomAction("Get")
- CustomActionDo = TCustomAction("Do")
- )
- func (cmd ResourceCmd) Custom(action TCustomAction, funcname string, args IGetActionOpt) {
- man := cmd.manager
- callback := func(s *mcclient.ClientSession, args IGetActionOpt) error {
- params, err := args.Params()
- if err != nil {
- return err
- }
- mod := man.(modulebase.Manager)
- modvalue := reflect.ValueOf(mod)
- funcvalue := modvalue.MethodByName(string(action) + utils.Kebab2Camel(funcname, "-"))
- if !funcvalue.IsValid() || funcvalue.IsNil() {
- return fmt.Errorf("funcname %s not found", funcname)
- }
- callParams := make([]reflect.Value, 0)
- callParams = append(callParams, reflect.ValueOf(s))
- if len(args.GetId()) > 0 {
- callParams = append(callParams, reflect.ValueOf(args.GetId()))
- }
- if params == nil {
- params = jsonutils.NewDict()
- }
- callParams = append(callParams, reflect.ValueOf(params))
- retValue := funcvalue.Call(callParams)
- retobj := retValue[0]
- reterr := retValue[1]
- if reterr.IsNil() {
- v, ok := retobj.Interface().(jsonutils.JSONObject)
- if ok {
- PrintObject(v)
- return nil
- }
- }
- v, ok := reterr.Interface().(error)
- if ok {
- return v
- }
- return nil
- }
- cmd.RunWithDesc(funcname, fmt.Sprintf("Get %s of a %s", funcname, man.GetKeyword()), args, callback)
- }
- type IDeleteOpt interface {
- IOpt
- IIdOpt
- }
- func (cmd ResourceCmd) Delete(args IDeleteOpt) {
- man := cmd.manager
- callback := func(s *mcclient.ClientSession, args IDeleteOpt) error {
- params, err := args.Params()
- if err != nil {
- return err
- }
- ret, err := man.(modulebase.Manager).Delete(s, args.GetId(), params)
- if err != nil {
- return err
- }
- PrintObject(ret)
- return nil
- }
- cmd.RunWithDesc("delete", fmt.Sprintf("Delete %s", man.GetKeyword()), args, callback)
- }
- type IDeleteWithParamOpt interface {
- IDeleteOpt
- QueryParams() (jsonutils.JSONObject, error)
- }
- func (cmd ResourceCmd) DeleteWithParam(args IDeleteWithParamOpt) {
- man := cmd.manager
- callback := func(s *mcclient.ClientSession, args IDeleteWithParamOpt) error {
- queryParams, err := args.QueryParams()
- if err != nil {
- return err
- }
- params, err := args.Params()
- if err != nil {
- return err
- }
- ret, err := man.(modulebase.Manager).DeleteWithParam(s, args.GetId(), queryParams, params)
- if err != nil {
- return err
- }
- PrintObject(ret)
- return nil
- }
- cmd.RunWithDesc("delete", fmt.Sprintf("Delete %s", man.GetKeyword()), args, callback)
- }
- type IWithDescOpt interface {
- Description() string
- }
- type IPerformOpt interface {
- IOpt
- IIdOpt
- }
- func (cmd ResourceCmd) PerformWithKeyword(keyword, action string, args IPerformOpt) {
- man := cmd.manager
- callback := func(s *mcclient.ClientSession, args IPerformOpt) error {
- params, err := args.Params()
- if err != nil {
- return err
- }
- ret, err := man.(modulebase.Manager).PerformAction(s, args.GetId(), action, params)
- if err != nil {
- return err
- }
- cmd.printObject(ret)
- return nil
- }
- cmd.Run(keyword, args, callback)
- }
- func (cmd ResourceCmd) PerformClassWithKeyword(keyword, action string, args IOpt) {
- man := cmd.manager
- callback := func(s *mcclient.ClientSession, args IOpt) error {
- params, err := args.Params()
- if err != nil {
- return err
- }
- ret, err := man.(modulebase.Manager).PerformClassAction(s, action, params)
- if err != nil {
- return err
- }
- cmd.printObject(ret)
- return nil
- }
- cmd.Run(keyword, args, callback)
- }
- func (cmd ResourceCmd) Perform(action string, args IPerformOpt) {
- cmd.PerformWithKeyword(action, action, args)
- }
- func (cmd ResourceCmd) PerformClass(action string, args IOpt) {
- man := cmd.manager
- callback := func(s *mcclient.ClientSession, args IOpt) error {
- params, err := args.Params()
- if err != nil {
- return err
- }
- ret, err := man.(modulebase.Manager).PerformClassAction(s, action, params)
- if err != nil {
- return err
- }
- cmd.printObject(ret)
- return nil
- }
- cmd.Run(action, args, callback)
- }
- type IBatchPerformOpt interface {
- IIdsOpt
- IOpt
- }
- func (cmd ResourceCmd) BatchPerform(action string, args IBatchPerformOpt) {
- man := cmd.manager
- callback := func(s *mcclient.ClientSession, args IBatchPerformOpt) error {
- params, err := args.Params()
- if err != nil {
- return err
- }
- ret := man.(modulebase.Manager).BatchPerformAction(s, args.GetIds(), action, params)
- printBatchResults(ret, man.GetColumns(s))
- return nil
- }
- cmd.Run(action, args, callback)
- }
- type IGetOpt interface {
- IIdOpt
- IOpt
- }
- func (cmd ResourceCmd) GetWithCustomShow(specific string, show func(data jsonutils.JSONObject), args IGetOpt) {
- cmd.GetWithCustomOptionShow(specific, func(data jsonutils.JSONObject, _ IGetOpt) {
- show(data)
- }, args)
- }
- func (cmd ResourceCmd) GetWithCustomOptionShow(specific string, show func(data jsonutils.JSONObject, args IGetOpt), args IGetOpt) {
- man := cmd.manager
- callback := func(s *mcclient.ClientSession, args IGetOpt) error {
- params, err := args.Params()
- if err != nil {
- return err
- }
- ret, err := man.(modulebase.Manager).GetSpecific(s, args.GetId(), specific, params)
- if err != nil {
- return err
- }
- show(ret, args)
- return nil
- }
- cmd.RunWithDesc(specific, fmt.Sprintf("Get %s of a %s", specific, man.GetKeyword()), args, callback)
- }
- func (cmd ResourceCmd) Get(specific string, args IGetOpt) {
- cmd.GetWithCustomShow(specific, PrintObject, args)
- }
- type IUpdateOpt interface {
- IOpt
- IIdOpt
- }
- func (cmd ResourceCmd) UpdateWithKeyword(keyword string, args IUpdateOpt) {
- man := cmd.manager
- callback := func(s *mcclient.ClientSession, args IUpdateOpt) error {
- _params, err := args.Params()
- if err != nil {
- return err
- }
- params := _params.(*jsonutils.JSONDict)
- params.Remove("id")
- if params.Length() == 0 {
- return InvalidUpdateError()
- }
- ret, err := man.(modulebase.Manager).Update(s, args.GetId(), params)
- if err != nil {
- return err
- }
- PrintObject(ret)
- return nil
- }
- cmd.Run(keyword, args, callback)
- }
- func (cmd ResourceCmd) Update(args IUpdateOpt) {
- cmd.UpdateWithKeyword("update", args)
- }
- type EditType string
- const (
- EditTypeText EditType = "text"
- EditTypeYaml EditType = "yaml"
- EditTypeJson EditType = "json"
- )
- type IEditOpt interface {
- IGetOpt
- EditType() EditType
- EditFields() []string
- }
- func (cmd ResourceCmd) Edit(args IEditOpt) {
- man := cmd.manager
- callback := func(s *mcclient.ClientSession, args IEditOpt) error {
- params, err := args.Params()
- if err != nil {
- return err
- }
- obj, err := man.(modulebase.Manager).Get(s, args.GetId(), params)
- if err != nil {
- return err
- }
- format := args.EditType()
- fields := args.EditFields()
- var editText string
- switch format {
- case EditTypeText:
- editText, _ = obj.GetString(fields...)
- default:
- editJson, _ := obj.Get(fields...)
- if editJson == nil {
- editJson = jsonutils.NewDict()
- }
- if format == EditTypeYaml {
- editText = editJson.YAMLString()
- } else if format == EditTypeJson {
- editText = editJson.PrettyString()
- }
- }
- editText, err = shellutils.Edit(editText)
- if err != nil {
- return err
- }
- updateParams := jsonutils.NewDict()
- switch format {
- case EditTypeText:
- updateParams.Add(jsonutils.NewString(editText), fields...)
- case EditTypeYaml:
- yamlObj, err := jsonutils.ParseYAML(editText)
- if err != nil {
- return err
- }
- updateParams.Add(yamlObj, fields...)
- case EditTypeJson:
- jsonObj, err := jsonutils.ParseString(editText)
- if err != nil {
- return err
- }
- updateParams.Add(jsonObj, fields...)
- }
- updateResult, err := man.(modulebase.Manager).Update(s, args.GetId(), updateParams)
- if err != nil {
- return err
- }
- PrintObject(updateResult)
- return nil
- }
- cmd.Run("edit", args, callback)
- }
- type IMetadataOpt interface {
- IIdOpt
- IOpt
- }
- func (cmd ResourceCmd) GetMetadata(args IMetadataOpt) {
- man := cmd.manager
- callback := func(s *mcclient.ClientSession, args IMetadataOpt) error {
- params, err := args.Params()
- if err != nil {
- return err
- }
- ret, err := man.(modulebase.IResourceManager).GetMetadata(s, args.GetId(), params)
- if err != nil {
- return err
- }
- PrintObject(ret)
- return nil
- }
- cmd.RunWithDesc("metadata", fmt.Sprintf("Show metadata of a %s", man.GetKeyword()), args, callback)
- }
- type IBatchDeleteOpt interface {
- IIdsOpt
- IOpt
- }
- func (cmd ResourceCmd) BatchDelete(args IBatchDeleteOpt) {
- man := cmd.manager
- callback := func(s *mcclient.ClientSession, args IBatchDeleteOpt) error {
- params, err := args.Params()
- if err != nil {
- return err
- }
- ret := man.(modulebase.Manager).BatchDelete(s, args.GetIds(), params)
- printBatchResults(ret, man.GetColumns(s))
- return nil
- }
- cmd.Run("delete", args, callback)
- }
- type IBatchDeleteWithParamOpt interface {
- IBatchDeleteOpt
- QueryParams() (jsonutils.JSONObject, error)
- }
- func (cmd ResourceCmd) BatchDeleteWithParam(args IBatchDeleteWithParamOpt) {
- man := cmd.manager
- callback := func(s *mcclient.ClientSession, args IBatchDeleteWithParamOpt) error {
- queryParams, err := args.QueryParams()
- if err != nil {
- return err
- }
- params, err := args.Params()
- if err != nil {
- return err
- }
- ret := man.(modulebase.Manager).BatchDeleteWithParam(s, args.GetIds(), queryParams, params)
- printBatchResults(ret, man.GetColumns(s))
- return nil
- }
- cmd.Run("delete", args, callback)
- }
- type IBatchPutOpt interface {
- IIdsOpt
- IOpt
- }
- func (cmd ResourceCmd) BatchPut(args IBatchPutOpt) {
- man := cmd.manager
- callback := func(s *mcclient.ClientSession, args IBatchPutOpt) error {
- params, err := args.Params()
- if err != nil {
- return err
- }
- ret := man.(modulebase.Manager).BatchPut(s, args.GetIds(), params)
- printBatchResults(ret, man.GetColumns(s))
- return nil
- }
- cmd.Run("update", args, callback)
- }
- type JointCmd struct {
- *ResourceCmd
- }
- func NewJointCmd(manager modulebase.JointManager) *JointCmd {
- return &JointCmd{
- ResourceCmd: NewResourceCmd(manager),
- }
- }
- type IJointListOpt interface {
- IListOpt
- GetMasterOpt() string
- GetSlaveOpt() string
- }
- func (cmd JointCmd) List(args IJointListOpt) {
- man := cmd.manager.(modulebase.JointManager)
- callback := func(s *mcclient.ClientSession, args IJointListOpt) error {
- params, err := args.Params()
- if err != nil {
- return err
- }
- var result *printutils.ListResult
- if len(args.GetMasterOpt()) > 0 {
- result, err = man.ListDescendent(s, args.GetMasterOpt(), params)
- } else if len(args.GetSlaveOpt()) > 0 {
- result, err = man.ListDescendent2(s, args.GetSlaveOpt(), params)
- } else {
- result, err = man.List(s, params)
- }
- if err != nil {
- return err
- }
- PrintList(result, man.GetColumns(s))
- return nil
- }
- cmd.RunWithDesc("list", fmt.Sprintf("list %s %s pairs", man.MasterManager().KeyString(), man.SlaveManager().KeyString()), args, callback)
- }
- type IJointOpt interface {
- IOpt
- GetMasterId() string
- GetSlaveId() string
- }
- func (cmd JointCmd) Show(args IJointOpt) {
- man := cmd.manager.(modulebase.JointManager)
- callback := func(s *mcclient.ClientSession, args IJointOpt) error {
- params, err := args.Params()
- if err != nil {
- return err
- }
- result, err := man.Get(s, args.GetMasterId(), args.GetSlaveId(), params)
- if err != nil {
- return err
- }
- PrintObject(result)
- return nil
- }
- cmd.Run("show", args, callback)
- }
- func (cmd JointCmd) Attach(args IJointOpt) {
- man := cmd.manager.(modulebase.JointManager)
- callback := func(s *mcclient.ClientSession, args IJointOpt) error {
- params, err := args.Params()
- if err != nil {
- return err
- }
- result, err := man.Attach(s, args.GetMasterId(), args.GetSlaveId(), params)
- if err != nil {
- return err
- }
- PrintObject(result)
- return nil
- }
- cmd.Run("attach", args, callback)
- }
- func (cmd JointCmd) Detach(args IJointOpt) {
- man := cmd.manager.(modulebase.JointManager)
- callback := func(s *mcclient.ClientSession, args IJointOpt) error {
- params, err := args.Params()
- if err != nil {
- return err
- }
- result, err := man.Detach(s, args.GetMasterId(), args.GetSlaveId(), params)
- if err != nil {
- return err
- }
- PrintObject(result)
- return nil
- }
- cmd.Run("detach", args, callback)
- }
- func (cmd JointCmd) Update(args IJointOpt) {
- man := cmd.manager.(modulebase.JointManager)
- callback := func(s *mcclient.ClientSession, args IJointOpt) error {
- params, err := args.Params()
- if err != nil {
- return err
- }
- result, err := man.Update(s, args.GetMasterId(), args.GetSlaveId(), nil, params)
- if err != nil {
- return err
- }
- PrintObject(result)
- return nil
- }
- cmd.Run("update", args, callback)
- }
|