helper.go 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818
  1. // Copyright 2019 Yunion
  2. //
  3. // Licensed under the Apache License, Version 2.0 (the "License");
  4. // you may not use this file except in compliance with the License.
  5. // You may obtain a copy of the License at
  6. //
  7. // http://www.apache.org/licenses/LICENSE-2.0
  8. //
  9. // Unless required by applicable law or agreed to in writing, software
  10. // distributed under the License is distributed on an "AS IS" BASIS,
  11. // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  12. // See the License for the specific language governing permissions and
  13. // limitations under the License.
  14. package shell
  15. import (
  16. "fmt"
  17. "reflect"
  18. "strings"
  19. "yunion.io/x/jsonutils"
  20. "yunion.io/x/pkg/util/printutils"
  21. "yunion.io/x/pkg/util/shellutils"
  22. "yunion.io/x/pkg/utils"
  23. "yunion.io/x/onecloud/pkg/mcclient"
  24. "yunion.io/x/onecloud/pkg/mcclient/modulebase"
  25. )
  26. type ResourceCmd struct {
  27. manager modulebase.IBaseManager
  28. contextManager modulebase.IBaseManager
  29. keyword string
  30. prefix string
  31. printObject func(jsonutils.JSONObject)
  32. }
  33. func NewResourceCmd(manager modulebase.IBaseManager) *ResourceCmd {
  34. return &ResourceCmd{
  35. manager: manager,
  36. keyword: manager.GetKeyword(),
  37. printObject: printObjectRecursive,
  38. }
  39. }
  40. func (cmd *ResourceCmd) SetPrefix(prefix string) *ResourceCmd {
  41. cmd.prefix = prefix
  42. return cmd
  43. }
  44. func (cmd *ResourceCmd) WithContextManager(manager modulebase.IBaseManager) *ResourceCmd {
  45. cmd.contextManager = manager
  46. return cmd
  47. }
  48. func (cmd *ResourceCmd) WithKeyword(keyword string) *ResourceCmd {
  49. return cmd.SetKeyword(keyword)
  50. }
  51. func (cmd *ResourceCmd) SetKeyword(keyword string) *ResourceCmd {
  52. if len(keyword) > 0 {
  53. cmd.keyword = keyword
  54. }
  55. return cmd
  56. }
  57. func (cmd *ResourceCmd) PrintObjectYAML() *ResourceCmd {
  58. cmd.printObject = func(obj jsonutils.JSONObject) {
  59. fmt.Print(obj.YAMLString())
  60. }
  61. return cmd
  62. }
  63. func (cmd *ResourceCmd) PrintObjectTable() *ResourceCmd {
  64. cmd.printObject = printutils.PrintJSONObject
  65. return cmd
  66. }
  67. func (cmd *ResourceCmd) PrintObjectKV() *ResourceCmd {
  68. cmd.printObject = printObjectFmtKv
  69. return cmd
  70. }
  71. func (cmd *ResourceCmd) PrintObjectFlattenKV() *ResourceCmd {
  72. cmd.printObject = func(obj jsonutils.JSONObject) {
  73. printObjectRecursiveEx(obj, printObjectFmtKv)
  74. }
  75. return cmd
  76. }
  77. type IOpt interface {
  78. Params() (jsonutils.JSONObject, error)
  79. }
  80. type IListOpt interface {
  81. IOpt
  82. GetContextId() string
  83. GetExportFile() string
  84. GetExportKeys() string
  85. GetExportTexts() string
  86. }
  87. type ICreateOpt interface {
  88. IOpt
  89. }
  90. type IBatchCreateOpt interface {
  91. IOpt
  92. GetCountParam() int
  93. }
  94. func (cmd ResourceCmd) RunWithDesc(action, desc string, args interface{}, callback interface{}) {
  95. man := cmd.manager
  96. prefix := cmd.prefix
  97. if prefix != "" {
  98. prefix = cmd.prefix + "-"
  99. }
  100. descKeyword := man.GetKeyword()
  101. if _, ok := args.(IListOpt); ok {
  102. descKeyword = man.KeyString()
  103. }
  104. if desc == "" {
  105. desc = fmt.Sprintf("%s %s", strings.Title(action), descKeyword)
  106. }
  107. descArgs, ok := args.(IWithDescOpt)
  108. if ok {
  109. desc = descArgs.Description()
  110. }
  111. R(args, fmt.Sprintf("%s%s-%s", prefix, strings.ReplaceAll(cmd.keyword, "_", "-"), action), desc, callback)
  112. }
  113. func (cmd ResourceCmd) Run(action string, args interface{}, callback interface{}) {
  114. cmd.RunWithDesc(action, "", args, callback)
  115. }
  116. func (cmd ResourceCmd) List(args IListOpt) {
  117. man := cmd.manager
  118. callback := func(s *mcclient.ClientSession, args IListOpt) error {
  119. params, err := args.Params()
  120. if err != nil {
  121. return err
  122. }
  123. var result *printutils.ListResult
  124. contextId := args.GetContextId()
  125. if cmd.contextManager != nil && len(contextId) > 0 {
  126. result, err = man.(modulebase.Manager).ListInContext(s, params, cmd.contextManager.(modulebase.Manager), contextId)
  127. if err != nil {
  128. return err
  129. }
  130. } else {
  131. result, err = man.List(s, params)
  132. if err != nil {
  133. return err
  134. }
  135. }
  136. exportFile := args.GetExportFile()
  137. if len(exportFile) > 0 {
  138. ExportList(result, exportFile, args.GetExportKeys(), args.GetExportTexts(), man.GetColumns(s))
  139. return nil
  140. }
  141. PrintList(result, man.GetColumns(s))
  142. return nil
  143. }
  144. cmd.Run("list", args, callback)
  145. }
  146. func (cmd ResourceCmd) Create(args ICreateOpt) {
  147. cmd.CreateWithKeyword("create", args)
  148. }
  149. func (cmd ResourceCmd) CreateWithKeyword(keyword string, args ICreateOpt) {
  150. cmd.Run(keyword, args, cmd.create)
  151. }
  152. func (cmd ResourceCmd) create(s *mcclient.ClientSession, args ICreateOpt) error {
  153. man := cmd.manager
  154. params, err := args.Params()
  155. if err != nil {
  156. return err
  157. }
  158. ret, err := man.(modulebase.Manager).Create(s, params)
  159. if err != nil {
  160. return err
  161. }
  162. PrintObject(ret)
  163. return nil
  164. }
  165. func (cmd ResourceCmd) BatchCreate(args IBatchCreateOpt) {
  166. cmd.BatchCreateWithKeyword("create", args)
  167. }
  168. func (cmd ResourceCmd) BatchCreateWithKeyword(keyword string, args IBatchCreateOpt) {
  169. cmd.Run(keyword, args, cmd.batchCreate)
  170. }
  171. func (cmd ResourceCmd) batchCreate(s *mcclient.ClientSession, args IBatchCreateOpt) error {
  172. man := cmd.manager.(modulebase.Manager)
  173. count := args.GetCountParam()
  174. if count <= 1 {
  175. return cmd.create(s, args)
  176. }
  177. params, err := args.Params()
  178. if err != nil {
  179. return err
  180. }
  181. rets := man.BatchCreate(s, params, count)
  182. printBatchResults(rets, man.GetColumns(s))
  183. return nil
  184. }
  185. type IIdOpt interface {
  186. GetId() string
  187. }
  188. type IIdsOpt interface {
  189. GetIds() []string
  190. }
  191. type IShowOpt interface {
  192. IOpt
  193. IIdOpt
  194. }
  195. type IPropertyOpt interface {
  196. IOpt
  197. Property() string
  198. }
  199. func (cmd ResourceCmd) GetPropertyWithShowFunc(args IPropertyOpt, showFunc func(jsonutils.JSONObject) error) {
  200. man := cmd.manager
  201. callback := func(s *mcclient.ClientSession, args IPropertyOpt) error {
  202. params, err := args.Params()
  203. if err != nil {
  204. return err
  205. }
  206. ret, err := man.(modulebase.Manager).Get(s, args.Property(), params)
  207. if err != nil {
  208. return err
  209. }
  210. err = showFunc(ret)
  211. if err != nil {
  212. return err
  213. }
  214. return nil
  215. }
  216. cmd.RunWithDesc(args.Property(), fmt.Sprintf("Get property of a %s", man.GetKeyword()), args, callback)
  217. }
  218. func (cmd ResourceCmd) GetProperty(args IPropertyOpt) {
  219. cmd.GetPropertyWithShowFunc(args, func(ret jsonutils.JSONObject) error {
  220. if _, ok := ret.(*jsonutils.JSONArray); ok {
  221. data, _ := ret.GetArray()
  222. PrintList(&printutils.ListResult{
  223. Data: data,
  224. }, nil)
  225. } else {
  226. PrintObject(ret)
  227. }
  228. return nil
  229. })
  230. }
  231. func (cmd ResourceCmd) Show(args IShowOpt) {
  232. man := cmd.manager
  233. callback := func(s *mcclient.ClientSession, args IShowOpt) error {
  234. params, err := args.Params()
  235. if err != nil {
  236. return err
  237. }
  238. ret, err := man.(modulebase.Manager).Get(s, args.GetId(), params)
  239. if err != nil {
  240. return err
  241. }
  242. PrintObject(ret)
  243. return nil
  244. }
  245. cmd.RunWithDesc("show", fmt.Sprintf("Show details of a %s", man.GetKeyword()), args, callback)
  246. }
  247. func (cmd ResourceCmd) ClassShow(args IShowOpt) {
  248. man := cmd.manager
  249. callback := func(s *mcclient.ClientSession, args IShowOpt) error {
  250. params, err := args.Params()
  251. if err != nil {
  252. return err
  253. }
  254. ret, err := man.(modulebase.Manager).Get(s, args.GetId(), params)
  255. if err != nil {
  256. return err
  257. }
  258. PrintObject(ret)
  259. return nil
  260. }
  261. cmd.RunWithDesc(args.GetId(), fmt.Sprintf("Show %s of a %s", args.GetId(), man.GetKeyword()), args, callback)
  262. }
  263. type IGetActionOpt interface {
  264. IOpt
  265. IIdOpt
  266. }
  267. type TCustomAction string
  268. const (
  269. CustomActionGet = TCustomAction("Get")
  270. CustomActionDo = TCustomAction("Do")
  271. )
  272. func (cmd ResourceCmd) Custom(action TCustomAction, funcname string, args IGetActionOpt) {
  273. man := cmd.manager
  274. callback := func(s *mcclient.ClientSession, args IGetActionOpt) error {
  275. params, err := args.Params()
  276. if err != nil {
  277. return err
  278. }
  279. mod := man.(modulebase.Manager)
  280. modvalue := reflect.ValueOf(mod)
  281. funcvalue := modvalue.MethodByName(string(action) + utils.Kebab2Camel(funcname, "-"))
  282. if !funcvalue.IsValid() || funcvalue.IsNil() {
  283. return fmt.Errorf("funcname %s not found", funcname)
  284. }
  285. callParams := make([]reflect.Value, 0)
  286. callParams = append(callParams, reflect.ValueOf(s))
  287. if len(args.GetId()) > 0 {
  288. callParams = append(callParams, reflect.ValueOf(args.GetId()))
  289. }
  290. if params == nil {
  291. params = jsonutils.NewDict()
  292. }
  293. callParams = append(callParams, reflect.ValueOf(params))
  294. retValue := funcvalue.Call(callParams)
  295. retobj := retValue[0]
  296. reterr := retValue[1]
  297. if reterr.IsNil() {
  298. v, ok := retobj.Interface().(jsonutils.JSONObject)
  299. if ok {
  300. PrintObject(v)
  301. return nil
  302. }
  303. }
  304. v, ok := reterr.Interface().(error)
  305. if ok {
  306. return v
  307. }
  308. return nil
  309. }
  310. cmd.RunWithDesc(funcname, fmt.Sprintf("Get %s of a %s", funcname, man.GetKeyword()), args, callback)
  311. }
  312. type IDeleteOpt interface {
  313. IOpt
  314. IIdOpt
  315. }
  316. func (cmd ResourceCmd) Delete(args IDeleteOpt) {
  317. man := cmd.manager
  318. callback := func(s *mcclient.ClientSession, args IDeleteOpt) error {
  319. params, err := args.Params()
  320. if err != nil {
  321. return err
  322. }
  323. ret, err := man.(modulebase.Manager).Delete(s, args.GetId(), params)
  324. if err != nil {
  325. return err
  326. }
  327. PrintObject(ret)
  328. return nil
  329. }
  330. cmd.RunWithDesc("delete", fmt.Sprintf("Delete %s", man.GetKeyword()), args, callback)
  331. }
  332. type IDeleteWithParamOpt interface {
  333. IDeleteOpt
  334. QueryParams() (jsonutils.JSONObject, error)
  335. }
  336. func (cmd ResourceCmd) DeleteWithParam(args IDeleteWithParamOpt) {
  337. man := cmd.manager
  338. callback := func(s *mcclient.ClientSession, args IDeleteWithParamOpt) error {
  339. queryParams, err := args.QueryParams()
  340. if err != nil {
  341. return err
  342. }
  343. params, err := args.Params()
  344. if err != nil {
  345. return err
  346. }
  347. ret, err := man.(modulebase.Manager).DeleteWithParam(s, args.GetId(), queryParams, params)
  348. if err != nil {
  349. return err
  350. }
  351. PrintObject(ret)
  352. return nil
  353. }
  354. cmd.RunWithDesc("delete", fmt.Sprintf("Delete %s", man.GetKeyword()), args, callback)
  355. }
  356. type IWithDescOpt interface {
  357. Description() string
  358. }
  359. type IPerformOpt interface {
  360. IOpt
  361. IIdOpt
  362. }
  363. func (cmd ResourceCmd) PerformWithKeyword(keyword, action string, args IPerformOpt) {
  364. man := cmd.manager
  365. callback := func(s *mcclient.ClientSession, args IPerformOpt) error {
  366. params, err := args.Params()
  367. if err != nil {
  368. return err
  369. }
  370. ret, err := man.(modulebase.Manager).PerformAction(s, args.GetId(), action, params)
  371. if err != nil {
  372. return err
  373. }
  374. cmd.printObject(ret)
  375. return nil
  376. }
  377. cmd.Run(keyword, args, callback)
  378. }
  379. func (cmd ResourceCmd) PerformClassWithKeyword(keyword, action string, args IOpt) {
  380. man := cmd.manager
  381. callback := func(s *mcclient.ClientSession, args IOpt) error {
  382. params, err := args.Params()
  383. if err != nil {
  384. return err
  385. }
  386. ret, err := man.(modulebase.Manager).PerformClassAction(s, action, params)
  387. if err != nil {
  388. return err
  389. }
  390. cmd.printObject(ret)
  391. return nil
  392. }
  393. cmd.Run(keyword, args, callback)
  394. }
  395. func (cmd ResourceCmd) Perform(action string, args IPerformOpt) {
  396. cmd.PerformWithKeyword(action, action, args)
  397. }
  398. func (cmd ResourceCmd) PerformClass(action string, args IOpt) {
  399. man := cmd.manager
  400. callback := func(s *mcclient.ClientSession, args IOpt) error {
  401. params, err := args.Params()
  402. if err != nil {
  403. return err
  404. }
  405. ret, err := man.(modulebase.Manager).PerformClassAction(s, action, params)
  406. if err != nil {
  407. return err
  408. }
  409. cmd.printObject(ret)
  410. return nil
  411. }
  412. cmd.Run(action, args, callback)
  413. }
  414. type IBatchPerformOpt interface {
  415. IIdsOpt
  416. IOpt
  417. }
  418. func (cmd ResourceCmd) BatchPerform(action string, args IBatchPerformOpt) {
  419. man := cmd.manager
  420. callback := func(s *mcclient.ClientSession, args IBatchPerformOpt) error {
  421. params, err := args.Params()
  422. if err != nil {
  423. return err
  424. }
  425. ret := man.(modulebase.Manager).BatchPerformAction(s, args.GetIds(), action, params)
  426. printBatchResults(ret, man.GetColumns(s))
  427. return nil
  428. }
  429. cmd.Run(action, args, callback)
  430. }
  431. type IGetOpt interface {
  432. IIdOpt
  433. IOpt
  434. }
  435. func (cmd ResourceCmd) GetWithCustomShow(specific string, show func(data jsonutils.JSONObject), args IGetOpt) {
  436. cmd.GetWithCustomOptionShow(specific, func(data jsonutils.JSONObject, _ IGetOpt) {
  437. show(data)
  438. }, args)
  439. }
  440. func (cmd ResourceCmd) GetWithCustomOptionShow(specific string, show func(data jsonutils.JSONObject, args IGetOpt), args IGetOpt) {
  441. man := cmd.manager
  442. callback := func(s *mcclient.ClientSession, args IGetOpt) error {
  443. params, err := args.Params()
  444. if err != nil {
  445. return err
  446. }
  447. ret, err := man.(modulebase.Manager).GetSpecific(s, args.GetId(), specific, params)
  448. if err != nil {
  449. return err
  450. }
  451. show(ret, args)
  452. return nil
  453. }
  454. cmd.RunWithDesc(specific, fmt.Sprintf("Get %s of a %s", specific, man.GetKeyword()), args, callback)
  455. }
  456. func (cmd ResourceCmd) Get(specific string, args IGetOpt) {
  457. cmd.GetWithCustomShow(specific, PrintObject, args)
  458. }
  459. type IUpdateOpt interface {
  460. IOpt
  461. IIdOpt
  462. }
  463. func (cmd ResourceCmd) UpdateWithKeyword(keyword string, args IUpdateOpt) {
  464. man := cmd.manager
  465. callback := func(s *mcclient.ClientSession, args IUpdateOpt) error {
  466. _params, err := args.Params()
  467. if err != nil {
  468. return err
  469. }
  470. params := _params.(*jsonutils.JSONDict)
  471. params.Remove("id")
  472. if params.Length() == 0 {
  473. return InvalidUpdateError()
  474. }
  475. ret, err := man.(modulebase.Manager).Update(s, args.GetId(), params)
  476. if err != nil {
  477. return err
  478. }
  479. PrintObject(ret)
  480. return nil
  481. }
  482. cmd.Run(keyword, args, callback)
  483. }
  484. func (cmd ResourceCmd) Update(args IUpdateOpt) {
  485. cmd.UpdateWithKeyword("update", args)
  486. }
  487. type EditType string
  488. const (
  489. EditTypeText EditType = "text"
  490. EditTypeYaml EditType = "yaml"
  491. EditTypeJson EditType = "json"
  492. )
  493. type IEditOpt interface {
  494. IGetOpt
  495. EditType() EditType
  496. EditFields() []string
  497. }
  498. func (cmd ResourceCmd) Edit(args IEditOpt) {
  499. man := cmd.manager
  500. callback := func(s *mcclient.ClientSession, args IEditOpt) error {
  501. params, err := args.Params()
  502. if err != nil {
  503. return err
  504. }
  505. obj, err := man.(modulebase.Manager).Get(s, args.GetId(), params)
  506. if err != nil {
  507. return err
  508. }
  509. format := args.EditType()
  510. fields := args.EditFields()
  511. var editText string
  512. switch format {
  513. case EditTypeText:
  514. editText, _ = obj.GetString(fields...)
  515. default:
  516. editJson, _ := obj.Get(fields...)
  517. if editJson == nil {
  518. editJson = jsonutils.NewDict()
  519. }
  520. if format == EditTypeYaml {
  521. editText = editJson.YAMLString()
  522. } else if format == EditTypeJson {
  523. editText = editJson.PrettyString()
  524. }
  525. }
  526. editText, err = shellutils.Edit(editText)
  527. if err != nil {
  528. return err
  529. }
  530. updateParams := jsonutils.NewDict()
  531. switch format {
  532. case EditTypeText:
  533. updateParams.Add(jsonutils.NewString(editText), fields...)
  534. case EditTypeYaml:
  535. yamlObj, err := jsonutils.ParseYAML(editText)
  536. if err != nil {
  537. return err
  538. }
  539. updateParams.Add(yamlObj, fields...)
  540. case EditTypeJson:
  541. jsonObj, err := jsonutils.ParseString(editText)
  542. if err != nil {
  543. return err
  544. }
  545. updateParams.Add(jsonObj, fields...)
  546. }
  547. updateResult, err := man.(modulebase.Manager).Update(s, args.GetId(), updateParams)
  548. if err != nil {
  549. return err
  550. }
  551. PrintObject(updateResult)
  552. return nil
  553. }
  554. cmd.Run("edit", args, callback)
  555. }
  556. type IMetadataOpt interface {
  557. IIdOpt
  558. IOpt
  559. }
  560. func (cmd ResourceCmd) GetMetadata(args IMetadataOpt) {
  561. man := cmd.manager
  562. callback := func(s *mcclient.ClientSession, args IMetadataOpt) error {
  563. params, err := args.Params()
  564. if err != nil {
  565. return err
  566. }
  567. ret, err := man.(modulebase.IResourceManager).GetMetadata(s, args.GetId(), params)
  568. if err != nil {
  569. return err
  570. }
  571. PrintObject(ret)
  572. return nil
  573. }
  574. cmd.RunWithDesc("metadata", fmt.Sprintf("Show metadata of a %s", man.GetKeyword()), args, callback)
  575. }
  576. type IBatchDeleteOpt interface {
  577. IIdsOpt
  578. IOpt
  579. }
  580. func (cmd ResourceCmd) BatchDelete(args IBatchDeleteOpt) {
  581. man := cmd.manager
  582. callback := func(s *mcclient.ClientSession, args IBatchDeleteOpt) error {
  583. params, err := args.Params()
  584. if err != nil {
  585. return err
  586. }
  587. ret := man.(modulebase.Manager).BatchDelete(s, args.GetIds(), params)
  588. printBatchResults(ret, man.GetColumns(s))
  589. return nil
  590. }
  591. cmd.Run("delete", args, callback)
  592. }
  593. type IBatchDeleteWithParamOpt interface {
  594. IBatchDeleteOpt
  595. QueryParams() (jsonutils.JSONObject, error)
  596. }
  597. func (cmd ResourceCmd) BatchDeleteWithParam(args IBatchDeleteWithParamOpt) {
  598. man := cmd.manager
  599. callback := func(s *mcclient.ClientSession, args IBatchDeleteWithParamOpt) error {
  600. queryParams, err := args.QueryParams()
  601. if err != nil {
  602. return err
  603. }
  604. params, err := args.Params()
  605. if err != nil {
  606. return err
  607. }
  608. ret := man.(modulebase.Manager).BatchDeleteWithParam(s, args.GetIds(), queryParams, params)
  609. printBatchResults(ret, man.GetColumns(s))
  610. return nil
  611. }
  612. cmd.Run("delete", args, callback)
  613. }
  614. type IBatchPutOpt interface {
  615. IIdsOpt
  616. IOpt
  617. }
  618. func (cmd ResourceCmd) BatchPut(args IBatchPutOpt) {
  619. man := cmd.manager
  620. callback := func(s *mcclient.ClientSession, args IBatchPutOpt) error {
  621. params, err := args.Params()
  622. if err != nil {
  623. return err
  624. }
  625. ret := man.(modulebase.Manager).BatchPut(s, args.GetIds(), params)
  626. printBatchResults(ret, man.GetColumns(s))
  627. return nil
  628. }
  629. cmd.Run("update", args, callback)
  630. }
  631. type JointCmd struct {
  632. *ResourceCmd
  633. }
  634. func NewJointCmd(manager modulebase.JointManager) *JointCmd {
  635. return &JointCmd{
  636. ResourceCmd: NewResourceCmd(manager),
  637. }
  638. }
  639. type IJointListOpt interface {
  640. IListOpt
  641. GetMasterOpt() string
  642. GetSlaveOpt() string
  643. }
  644. func (cmd JointCmd) List(args IJointListOpt) {
  645. man := cmd.manager.(modulebase.JointManager)
  646. callback := func(s *mcclient.ClientSession, args IJointListOpt) error {
  647. params, err := args.Params()
  648. if err != nil {
  649. return err
  650. }
  651. var result *printutils.ListResult
  652. if len(args.GetMasterOpt()) > 0 {
  653. result, err = man.ListDescendent(s, args.GetMasterOpt(), params)
  654. } else if len(args.GetSlaveOpt()) > 0 {
  655. result, err = man.ListDescendent2(s, args.GetSlaveOpt(), params)
  656. } else {
  657. result, err = man.List(s, params)
  658. }
  659. if err != nil {
  660. return err
  661. }
  662. PrintList(result, man.GetColumns(s))
  663. return nil
  664. }
  665. cmd.RunWithDesc("list", fmt.Sprintf("list %s %s pairs", man.MasterManager().KeyString(), man.SlaveManager().KeyString()), args, callback)
  666. }
  667. type IJointOpt interface {
  668. IOpt
  669. GetMasterId() string
  670. GetSlaveId() string
  671. }
  672. func (cmd JointCmd) Show(args IJointOpt) {
  673. man := cmd.manager.(modulebase.JointManager)
  674. callback := func(s *mcclient.ClientSession, args IJointOpt) error {
  675. params, err := args.Params()
  676. if err != nil {
  677. return err
  678. }
  679. result, err := man.Get(s, args.GetMasterId(), args.GetSlaveId(), params)
  680. if err != nil {
  681. return err
  682. }
  683. PrintObject(result)
  684. return nil
  685. }
  686. cmd.Run("show", args, callback)
  687. }
  688. func (cmd JointCmd) Attach(args IJointOpt) {
  689. man := cmd.manager.(modulebase.JointManager)
  690. callback := func(s *mcclient.ClientSession, args IJointOpt) error {
  691. params, err := args.Params()
  692. if err != nil {
  693. return err
  694. }
  695. result, err := man.Attach(s, args.GetMasterId(), args.GetSlaveId(), params)
  696. if err != nil {
  697. return err
  698. }
  699. PrintObject(result)
  700. return nil
  701. }
  702. cmd.Run("attach", args, callback)
  703. }
  704. func (cmd JointCmd) Detach(args IJointOpt) {
  705. man := cmd.manager.(modulebase.JointManager)
  706. callback := func(s *mcclient.ClientSession, args IJointOpt) error {
  707. params, err := args.Params()
  708. if err != nil {
  709. return err
  710. }
  711. result, err := man.Detach(s, args.GetMasterId(), args.GetSlaveId(), params)
  712. if err != nil {
  713. return err
  714. }
  715. PrintObject(result)
  716. return nil
  717. }
  718. cmd.Run("detach", args, callback)
  719. }
  720. func (cmd JointCmd) Update(args IJointOpt) {
  721. man := cmd.manager.(modulebase.JointManager)
  722. callback := func(s *mcclient.ClientSession, args IJointOpt) error {
  723. params, err := args.Params()
  724. if err != nil {
  725. return err
  726. }
  727. result, err := man.Update(s, args.GetMasterId(), args.GetSlaveId(), nil, params)
  728. if err != nil {
  729. return err
  730. }
  731. PrintObject(result)
  732. return nil
  733. }
  734. cmd.Run("update", args, callback)
  735. }