morpheus-cli 4.2.20 → 5.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (71) hide show
  1. checksums.yaml +4 -4
  2. data/Dockerfile +1 -1
  3. data/lib/morpheus/api/api_client.rb +26 -0
  4. data/lib/morpheus/api/billing_interface.rb +34 -0
  5. data/lib/morpheus/api/catalog_item_types_interface.rb +9 -0
  6. data/lib/morpheus/api/deploy_interface.rb +1 -1
  7. data/lib/morpheus/api/deployments_interface.rb +20 -1
  8. data/lib/morpheus/api/forgot_password_interface.rb +17 -0
  9. data/lib/morpheus/api/instances_interface.rb +7 -0
  10. data/lib/morpheus/api/rest_interface.rb +0 -6
  11. data/lib/morpheus/api/roles_interface.rb +14 -0
  12. data/lib/morpheus/api/search_interface.rb +13 -0
  13. data/lib/morpheus/api/servers_interface.rb +7 -0
  14. data/lib/morpheus/api/usage_interface.rb +18 -0
  15. data/lib/morpheus/cli.rb +6 -3
  16. data/lib/morpheus/cli/apps.rb +3 -4
  17. data/lib/morpheus/cli/backup_jobs_command.rb +3 -0
  18. data/lib/morpheus/cli/backups_command.rb +3 -0
  19. data/lib/morpheus/cli/budgets_command.rb +4 -4
  20. data/lib/morpheus/cli/catalog_command.rb +507 -0
  21. data/lib/morpheus/cli/cli_command.rb +45 -20
  22. data/lib/morpheus/cli/commands/standard/curl_command.rb +26 -12
  23. data/lib/morpheus/cli/commands/standard/history_command.rb +3 -1
  24. data/lib/morpheus/cli/commands/standard/man_command.rb +74 -40
  25. data/lib/morpheus/cli/commands/standard/source_command.rb +1 -1
  26. data/lib/morpheus/cli/commands/standard/update_command.rb +76 -0
  27. data/lib/morpheus/cli/containers_command.rb +14 -0
  28. data/lib/morpheus/cli/deploy.rb +199 -90
  29. data/lib/morpheus/cli/deployments.rb +342 -29
  30. data/lib/morpheus/cli/deploys.rb +206 -41
  31. data/lib/morpheus/cli/error_handler.rb +7 -0
  32. data/lib/morpheus/cli/forgot_password.rb +133 -0
  33. data/lib/morpheus/cli/groups.rb +1 -1
  34. data/lib/morpheus/cli/health_command.rb +2 -2
  35. data/lib/morpheus/cli/hosts.rb +181 -26
  36. data/lib/morpheus/cli/instances.rb +102 -33
  37. data/lib/morpheus/cli/invoices_command.rb +33 -16
  38. data/lib/morpheus/cli/jobs_command.rb +28 -6
  39. data/lib/morpheus/cli/library_option_lists_command.rb +14 -6
  40. data/lib/morpheus/cli/logs_command.rb +9 -6
  41. data/lib/morpheus/cli/mixins/accounts_helper.rb +7 -6
  42. data/lib/morpheus/cli/mixins/backups_helper.rb +2 -4
  43. data/lib/morpheus/cli/mixins/catalog_helper.rb +66 -0
  44. data/lib/morpheus/cli/mixins/deployments_helper.rb +31 -3
  45. data/lib/morpheus/cli/mixins/option_source_helper.rb +1 -1
  46. data/lib/morpheus/cli/mixins/print_helper.rb +46 -21
  47. data/lib/morpheus/cli/mixins/provisioning_helper.rb +24 -4
  48. data/lib/morpheus/cli/network_pools_command.rb +14 -6
  49. data/lib/morpheus/cli/option_types.rb +266 -17
  50. data/lib/morpheus/cli/ping.rb +0 -1
  51. data/lib/morpheus/cli/provisioning_licenses_command.rb +2 -2
  52. data/lib/morpheus/cli/remote.rb +35 -12
  53. data/lib/morpheus/cli/reports_command.rb +99 -30
  54. data/lib/morpheus/cli/roles.rb +305 -3
  55. data/lib/morpheus/cli/search_command.rb +182 -0
  56. data/lib/morpheus/cli/service_plans_command.rb +2 -2
  57. data/lib/morpheus/cli/setup.rb +1 -1
  58. data/lib/morpheus/cli/shell.rb +33 -11
  59. data/lib/morpheus/cli/storage_providers_command.rb +40 -56
  60. data/lib/morpheus/cli/tasks.rb +20 -21
  61. data/lib/morpheus/cli/tenants_command.rb +1 -1
  62. data/lib/morpheus/cli/usage_command.rb +203 -0
  63. data/lib/morpheus/cli/user_settings_command.rb +1 -0
  64. data/lib/morpheus/cli/users.rb +12 -1
  65. data/lib/morpheus/cli/version.rb +1 -1
  66. data/lib/morpheus/cli/virtual_images.rb +280 -199
  67. data/lib/morpheus/cli/whoami.rb +6 -6
  68. data/lib/morpheus/cli/workflows.rb +34 -41
  69. data/lib/morpheus/formatters.rb +48 -5
  70. data/lib/morpheus/terminal.rb +6 -2
  71. metadata +13 -2
@@ -4,8 +4,11 @@ class Morpheus::Cli::Deployments
4
4
  include Morpheus::Cli::CliCommand
5
5
  include Morpheus::Cli::DeploymentsHelper
6
6
 
7
+ set_command_description "View and manage deployments, including versions and files."
8
+
7
9
  register_subcommands :list, :get, :add, :update, :remove
8
10
  register_subcommands :list_versions, :get_version, :add_version, :update_version, :remove_version
11
+ register_subcommands :list_files, :upload, :remove_file
9
12
  alias_subcommand :versions, :'list-versions'
10
13
 
11
14
  def initialize()
@@ -81,7 +84,7 @@ EOT
81
84
  if id.to_s =~ /\A\d{1,}\Z/
82
85
  id
83
86
  else
84
- deployment = find_deployment_by_name(id)
87
+ deployment = find_deployment_by_name_or_id(id)
85
88
  if deployment
86
89
  deployment['id']
87
90
  else
@@ -275,6 +278,9 @@ EOT
275
278
  connect(options)
276
279
  deployment = find_deployment_by_name_or_id(args[0])
277
280
  return 1 if deployment.nil?
281
+ unless options[:yes] || Morpheus::Cli::OptionTypes.confirm("Are you sure you want to delete the deployment #{deployment['name']}?")
282
+ return 9, "aborted command"
283
+ end
278
284
  @deployments_interface.setopts(options)
279
285
  if options[:dry_run]
280
286
  print_dry_run @deployments_interface.dry.destroy(deployment['id'], params)
@@ -292,6 +298,9 @@ EOT
292
298
  params = {}
293
299
  optparse = Morpheus::Cli::OptionParser.new do |opts|
294
300
  opts.banner = subcommand_usage("[deployment] [version] [options]")
301
+ opts.on(nil, '--no-files', "Do not show files") do
302
+ options[:no_files] = true
303
+ end
295
304
  build_option_type_options(opts, options, add_deployment_version_option_types)
296
305
  build_option_type_options(opts, options, add_deployment_version_advanced_option_types)
297
306
  build_standard_add_options(opts, options)
@@ -311,7 +320,7 @@ EOT
311
320
  if id.to_s =~ /\A\d{1,}\Z/
312
321
  id = id.to_i
313
322
  else
314
- deployment_version = find_deployment_version_by_name(deployment['id'], id)
323
+ deployment_version = find_deployment_version_by_name_or_id(deployment['id'], id)
315
324
  if deployment_version
316
325
  id = deployment_version['id']
317
326
  else
@@ -326,6 +335,13 @@ EOT
326
335
  end
327
336
  json_response = @deployments_interface.get_version(deployment['id'], id, params)
328
337
  deployment_version = json_response['version']
338
+ deploy_type = deployment_version['deployType'] || deployment_version['type']
339
+ deployment_files_response = nil
340
+ deployment_files = nil
341
+ if options[:no_files] != true
342
+ deployment_files_response = @deployments_interface.list_files(deployment['id'], deployment_version['id'], params)
343
+ deployment_files = deployment_files_response.is_a?(Array) ? deployment_files_response : deployment_files_response['files']
344
+ end
329
345
  render_response(json_response, options, 'version') do
330
346
  # print_h1 "Deployment Version Details", [deployment['name']], options
331
347
  print_h1 "Deployment Version Details", [], options
@@ -334,26 +350,17 @@ EOT
334
350
  columns = {
335
351
  "ID" => 'id',
336
352
  "Deployment" => lambda {|it| deployment['name'] },
337
- "Version" => 'userVersion',
353
+ "Version" => lambda {|it| format_deployment_version_number(it) },
338
354
  "Deploy Type" => lambda {|it| it['deployType'] },
339
- "URL" => lambda {|it|
340
- if it['deployType'] == 'fetch'
341
- "#{it['fetchUrl']}"
342
- elsif it['deployType'] == 'git'
343
- "#{it['gitUrl']}"
344
- end
345
- },
346
- "Ref" => lambda {|it|
347
- if it['deployType'] == 'git'
348
- "#{it['gitRef']}"
349
- end
350
- },
355
+ "URL" => lambda {|it| it['fetchUrl'] || it['gitUrl'] || it['url'] },
356
+ "Ref" => lambda {|it| it['gitRef'] || it['ref'] },
351
357
  "Created" => lambda {|it| format_local_dt(it['dateCreated']) },
352
358
  "Updated" => lambda {|it| format_local_dt(it['lastUpdated']) },
353
359
  }
354
360
  if deployment_version['deployType'] == 'git'
355
- columns['Git URL'] = columns['URL']
361
+ options[:no_files] = true
356
362
  elsif deployment_version['deployType'] == 'fetch'
363
+ options[:no_files] = true
357
364
  columns['Fetch URL'] = columns['URL']
358
365
  columns.delete('Ref')
359
366
  else
@@ -362,6 +369,18 @@ EOT
362
369
  end
363
370
  print_description_list(columns, deployment_version)
364
371
  print reset,"\n"
372
+
373
+ if options[:no_files] != true
374
+ print_h2 "Deployment Files", options
375
+ if !deployment_files || deployment_files.empty?
376
+ print cyan,"No files found.",reset,"\n"
377
+ else
378
+ print as_pretty_table(deployment_files, deployment_file_column_definitions.upcase_keys!, options)
379
+ print_results_pagination({size:deployment_files.size,total:deployment_files.size.to_i})
380
+ end
381
+ print reset,"\n"
382
+ end
383
+
365
384
  end
366
385
  return 0, nil
367
386
  end
@@ -371,7 +390,11 @@ EOT
371
390
  params = {}
372
391
  optparse = Morpheus::Cli::OptionParser.new do |opts|
373
392
  opts.banner = subcommand_usage("[deployment] [version] [options]")
393
+ opts.on('-t', '--type CODE', String, "Deploy Type, file, git or fetch, default is file.") do |val|
394
+ options[:options]['deployType'] = val
395
+ end
374
396
  build_option_type_options(opts, options, add_deployment_version_option_types)
397
+ opts.add_hidden_option('--deployType')
375
398
  build_option_type_options(opts, options, add_deployment_version_advanced_option_types)
376
399
  build_standard_add_options(opts, options)
377
400
  opts.footer = <<-EOT
@@ -388,7 +411,7 @@ EOT
388
411
  deployment = find_deployment_by_name_or_id(args[0])
389
412
  return 1 if deployment.nil?
390
413
  else
391
- deployment_id = Morpheus::Cli::OptionTypes.prompt([{'fieldName' => 'deploymentId', 'fieldLabel' => 'Deployment', 'type' => 'select', 'required' => true, 'description' => 'Deployment to add version to', 'optionSource' => lambda {
414
+ deployment_id = Morpheus::Cli::OptionTypes.prompt([{'fieldName' => 'deploymentId', 'fieldLabel' => 'Deployment', 'type' => 'select', 'required' => true, 'description' => 'Deployment to add version to', 'optionSource' => lambda { |api_client, api_params|
392
415
  @deployments_interface.list(max:10000)['deployments'].collect {|it|
393
416
  {'name' => it['name'], 'value' => it['id']}
394
417
  }
@@ -485,28 +508,304 @@ EOT
485
508
  verify_args!(args:args, optparse:optparse, count:2)
486
509
  connect(options)
487
510
  deployment = find_deployment_by_name_or_id(args[0])
488
- return 1 if deployment.nil?
511
+ return 1, "deployment not found" if deployment.nil?
489
512
  id = args[1]
513
+ deployment_version = find_deployment_version_by_name_or_id(deployment['id'], id)
514
+ return 1, "version not found" if deployment_version.nil?
515
+ unless options[:yes] || Morpheus::Cli::OptionTypes.confirm("Are you sure you want to delete the deployment version #{format_deployment_version_number(deployment_version)}?")
516
+ return 9, "aborted command"
517
+ end
518
+ @deployments_interface.setopts(options)
519
+ if options[:dry_run]
520
+ print_dry_run @deployments_interface.dry.destroy_version(deployment['id'], deployment_version['id'], params)
521
+ return
522
+ end
523
+ json_response = @deployments_interface.destroy_version(deployment['id'], deployment_version['id'], params)
524
+ render_response(json_response, options) do
525
+ print_green_success "Removed deployment #{deployment['name']} version #{format_deployment_version_number(deployment_version)}"
526
+ end
527
+ return 0, nil
528
+ end
490
529
 
491
- if id.to_s =~ /\A\d{1,}\Z/
492
- id = id.to_i
530
+ def list_files(args)
531
+ options = {}
532
+ params = {}
533
+ optparse = Morpheus::Cli::OptionParser.new do |opts|
534
+ opts.banner = subcommand_usage("[deployment] [version] [path] [options]")
535
+ build_standard_list_options(opts, options)
536
+ opts.footer = <<-EOT
537
+ List files in a deployment version.
538
+ [deployment] is required. This is the name or id of a deployment.
539
+ [version] is required. This is the deployment version identifier
540
+ [path] is optional. This is a the directory to search for files under.
541
+ EOT
542
+ end
543
+ optparse.parse!(args)
544
+ verify_args!(args:args, optparse:optparse, min:2, max: 3)
545
+ connect(options)
546
+ params.merge!(parse_list_options(options))
547
+ deployment = find_deployment_by_name_or_id(args[0])
548
+ return 1, "deployment not found for '#{args[0]}'" if deployment.nil?
549
+ deployment_version = find_deployment_version_by_name_or_id(deployment['id'], args[1])
550
+ return 1, "deployment version not found for '#{args[1]}'" if deployment_version.nil?
551
+ if args[2]
552
+ params['filePath'] = args[2]
553
+ end
554
+ @deployments_interface.setopts(options)
555
+ if options[:dry_run]
556
+ print_dry_run @deployments_interface.dry.list_files(deployment['id'], deployment_version['id'], params)
557
+ return
558
+ end
559
+ json_response = @deployments_interface.list_files(deployment['id'], deployment_version['id'], params)
560
+ # odd, api used to just return an array
561
+ deployment_files = json_response.is_a?(Array) ? json_response : json_response['files']
562
+ render_response(json_response, options) do
563
+ print_h1 "Deployment Files", ["#{deployment['name']} #{format_deployment_version_number(deployment_version)}"]
564
+ if !deployment_files || deployment_files.empty?
565
+ print cyan,"No files found.",reset,"\n"
566
+ else
567
+ print as_pretty_table(deployment_files, deployment_file_column_definitions.upcase_keys!, options)
568
+ #print_results_pagination(json_response)
569
+ print_results_pagination({size:deployment_files.size,total:deployment_files.size.to_i})
570
+ end
571
+ print reset,"\n"
572
+ end
573
+ return 0, nil
574
+ end
575
+
576
+ def upload(args)
577
+ options = {}
578
+ params = {}
579
+ optparse = Morpheus::Cli::OptionParser.new do |opts|
580
+ opts.banner = subcommand_usage("[deployment] [version] [files]")
581
+ opts.on('--files LIST', String, "Files to upload") do |val|
582
+ val_list = val.to_s.split(",").collect {|it| it.to_s.strip }.select { |it| it != "" }
583
+ options[:files] ||= []
584
+ options[:files] += val_list
585
+ end
586
+ opts.on('--workdir DIRECTORY', String, "Working directory to switch to before uploading files, determines the paths of the uploaded files. The current working directory of your terminal is used by default.") do |val|
587
+ options[:workdir] = File.expand_path(val)
588
+ if !File.directory?(options[:workdir])
589
+ raise_command_error "invalid directory: #{val}"
590
+ end
591
+ end
592
+ opts.on('--destination FILEPATH', String, "Destination filepath for file being uploaded, should include full filename and extension. Only applies when uploading a single file.") do |val|
593
+ options[:destination] = val
594
+ end
595
+ build_standard_update_options(opts, options, [:auto_confirm])
596
+ opts.footer = <<-EOT
597
+ Upload one or more files or directories to a deployment version.
598
+ [deployment] is required. This is the name or id of a deployment.
599
+ [version] is required. This is the deployment version identifier
600
+ [files] is required. This is a list of files or directories to be uploaded. Glob pattern format supported eg. build/*.html
601
+ EOT
602
+ end
603
+ optparse.parse!(args)
604
+ # verify_args!(args:args, optparse:optparse, min:0, max:2)
605
+ connect(options)
606
+
607
+ # fetch deployment
608
+ deployment = nil
609
+ if args[0]
610
+ deployment = find_deployment_by_name_or_id(args[0])
611
+ return 1 if deployment.nil?
493
612
  else
494
- deployment_version = find_deployment_version_by_name(deployment['id'], id)
495
- if deployment_version
496
- id = deployment_version['id']
613
+ all_deployments = @deployments_interface.list(max:10000)['deployments']
614
+ deployment_id = Morpheus::Cli::OptionTypes.prompt([{'fieldName' => 'deployment', 'fieldLabel' => 'Deployment', 'type' => 'select', 'required' => true, 'description' => 'Deployment identifier (name or ID)', 'optionSource' => lambda { |api_client, api_params|
615
+ all_deployments.collect {|it| {'name' => it['name'], 'value' => it['id']} }
616
+ }}], options[:options])['deployment']
617
+ deployment = all_deployments.find {|it| deployment_id == it['id'] || deployment_id == it['name'] }
618
+ raise_command_error "Deployment not found for '#{deployment_id}'" if deployment.nil?
619
+ end
620
+
621
+ # fetch deployment version
622
+ deployment_version = nil
623
+ if args[1]
624
+ deployment_version = find_deployment_version_by_name_or_id(deployment['id'], args[1])
625
+ return 1 if deployment_version.nil?
626
+ else
627
+ all_deployment_versions = @deployments_interface.list_versions(deployment['id'], {max:10000})['versions']
628
+ deployment_version_id = Morpheus::Cli::OptionTypes.prompt([{'fieldName' => 'version', 'fieldLabel' => 'Version', 'type' => 'select', 'required' => true, 'description' => 'Deployment Version identifier (version or ID) to upload files to', 'optionSource' => lambda { |api_client, api_params|
629
+ all_deployment_versions.collect {|it| {'name' => it['version'] || it['userVersion'], 'value' => it['id']} }
630
+ }}], options[:options])['version']
631
+ deployment_version = all_deployment_versions.find {|it| deployment_version_id == it['id'] || deployment_version_id == it['userVersion'] || deployment_version_id == it['version'] }
632
+ raise_command_error "Deployment Version not found for '#{deployment_version_id}'" if deployment_version.nil?
633
+ end
634
+
635
+
636
+ # Determine which files to find
637
+ file_patterns = []
638
+ # [files] is args 3 - N
639
+ if args.size > 2
640
+ file_patterns += args[2..-1]
641
+ end
642
+ if options[:files]
643
+ file_patterns += options[:files]
644
+ end
645
+ if file_patterns.empty?
646
+ #raise_command_error "Files not specified. Please specify files array, each item may specify a path or pattern of file(s) to upload", args, optparse
647
+ file_patterns = Morpheus::Cli::OptionTypes.prompt([{'fieldName' => 'files', 'fieldLabel' => 'Files', 'type' => 'text', 'required' => true, 'description' => 'Files or directories to upload'}], options[:options])['files'].to_s.split(",").collect {|it| it.to_s.strip }.select { |it| it != "" }
648
+ end
649
+
650
+ # Find Files to Upload
651
+ deploy_files = []
652
+
653
+ #print "\n",cyan, "Finding Files...", reset, "\n" unless options[:quiet]
654
+ original_working_dir = Dir.pwd
655
+ base_working_dir = options[:workdir] || original_working_dir
656
+ begin
657
+ file_patterns.each do |file_pattern|
658
+ # start in the working directory
659
+ # to preserve relative paths in upload file destinations
660
+ # allow passing just build instead build/**/*
661
+ Dir.chdir(base_working_dir)
662
+ fmap = nil
663
+ full_file_pattern = File.expand_path(file_pattern)
664
+ if File.exists?(full_file_pattern)
665
+ if File.directory?(full_file_pattern)
666
+ fmap = {'path' => full_file_pattern, 'pattern' => '**/*'}
667
+ else
668
+ fmap = {'path' => File.dirname(full_file_pattern), 'pattern' => File.basename(full_file_pattern)}
669
+ end
670
+ else
671
+ fmap = {'path' => nil, 'pattern' => file_pattern}
672
+ end
673
+ if fmap['path']
674
+ Dir.chdir(File.expand_path(fmap['path']))
675
+ end
676
+ files = Dir.glob(fmap['pattern'] || '**/*')
677
+ if files.empty?
678
+ raise_command_error "Found 0 files for file pattern '#{file_pattern}'"
679
+ end
680
+ files.each do |file|
681
+ if File.file?(file)
682
+ destination = file.split("/")[0..-2].join("/")
683
+ # deploy_files << {filepath: File.expand_path(file), destination: destination}
684
+ # absolute path was given, so no path is given to the destination file
685
+ # maybe apply options[:destination] as prefix here
686
+ # actually just do destination.sub!(base_working_dir, '')
687
+ if file[0].chr == "/"
688
+ deploy_files << {filepath: File.expand_path(file), destination: File.basename(file)}
689
+ else
690
+ deploy_files << {filepath: File.expand_path(file), destination: file}
691
+ end
692
+ end
693
+ end
694
+ end
695
+ #print cyan, "Found #{deploy_files.size} Files to Upload!", reset, "\n"
696
+ rescue => ex
697
+ # does not happen, just in case
698
+ #print_error "An error occured while searching for files to upload: #{ex}"
699
+ raise ex
700
+ ensure
701
+ Dir.chdir(original_working_dir)
702
+ end
703
+
704
+ # make sure we have something to upload.
705
+ if deploy_files.empty?
706
+ raise_command_error "0 files found for: #{file_patterns.join(', ')}"
707
+ else
708
+ unless options[:quiet]
709
+ print cyan, "Found #{deploy_files.size} Files to Upload!", reset, "\n"
710
+ end
711
+ end
712
+
713
+ # support uploading a local file to a custom destination
714
+ # this only works for a single file right now, should be better
715
+ # could try to add destination + filename
716
+ # for now expect filename to be included in destination
717
+ if options[:destination]
718
+ if deploy_files.size == 1
719
+ deploy_files[0][:destination] = options[:destination]
497
720
  else
498
- # raise_command_error "deployment not found for '#{id}'"
499
- return 1, "deployment version not found for '#{id}'"
721
+ raise_command_error "--destination can only specified for a single file upload, not #{deploy_files} files.", args, optparse
500
722
  end
501
723
  end
724
+
725
+ confirm_message = "Are you sure you want to upload #{deploy_files.size} files to deployment #{deployment['name']} #{format_deployment_version_number(deployment_version)}?"
726
+ if deploy_files.size == 1
727
+ confirm_message = "Are you sure you want to upload file #{deploy_files[0][:destination]} to deployment #{deployment['name']} #{format_deployment_version_number(deployment_version)}?"
728
+ end
729
+ unless options[:yes] || Morpheus::Cli::OptionTypes.confirm(confirm_message)
730
+ return 9, "aborted command"
731
+ end
732
+
733
+ @deployments_interface.setopts(options)
734
+
735
+ # Upload Files
736
+ if deploy_files && !deploy_files.empty?
737
+ print "\n",cyan, "Uploading #{deploy_files.size} Files...", reset, "\n" if !options[:quiet]
738
+ deploy_files.each do |f|
739
+ destination = f[:destination]
740
+ if options[:dry_run]
741
+ print_dry_run @deployments_interface.upload_file(deployment['id'], deployment_version['id'], f[:filepath], f[:destination])
742
+ else
743
+ print cyan," - Uploading #{f[:destination]} ...", reset if !options[:quiet]
744
+ upload_result = @deployments_interface.upload_file(deployment['id'], deployment_version['id'], f[:filepath], f[:destination])
745
+ #print green + "SUCCESS" + reset + "\n" if !options[:quiet]
746
+ print reset, "\n" if !options[:quiet]
747
+ end
748
+ end
749
+ if options[:dry_run]
750
+ return 0, nil
751
+ end
752
+ #print cyan, "Upload Complete!", reset, "\n" if !options[:quiet]
753
+ if options[:quiet]
754
+ return 0, nil
755
+ else
756
+ print_green_success "Upload Complete!"
757
+ return get_version([deployment["id"], deployment_version['id']] + (options[:remote] ? ["-r",options[:remote]] : []))
758
+ end
759
+ else
760
+ raise_command_error "No files to upload!"
761
+ end
762
+ end
763
+
764
+ def remove_file(args)
765
+ options = {}
766
+ params = {}
767
+ optparse = Morpheus::Cli::OptionParser.new do |opts|
768
+ opts.banner = subcommand_usage("[deployment] [version] [file] [options]")
769
+ opts.on( '-R', '--recursive', "Delete a directory and all of its files. This must be passed if specifying a directory." ) do
770
+ # do_recursive = true
771
+ params['force'] = true
772
+ end
773
+ opts.on( '-f', '--force', "Force delete, this will do a recursive delete of directories." ) do
774
+ params['force'] = true
775
+ end
776
+ build_standard_remove_options(opts, options)
777
+ opts.footer = <<-EOT
778
+ Delete a deployment file.
779
+ [deployment] is required. This is the name or id of a deployment.
780
+ [version] is required. This is the version identifier of a deployment version.
781
+ [file] is required. This is the name of the file to be deleted.
782
+ EOT
783
+ end
784
+ optparse.parse!(args)
785
+ verify_args!(args:args, optparse:optparse, min:2, max:3)
786
+ connect(options)
787
+ deployment = find_deployment_by_name_or_id(args[0])
788
+ return 1, "deployment not found" if deployment.nil?
789
+ id = args[1]
790
+ deployment_version = find_deployment_version_by_name_or_id(deployment['id'], id)
791
+ return 1, "version not found" if deployment_version.nil?
792
+ # could look it up here, or allow a directory instead of a single file
793
+ filename = args[2]
794
+ if filename.nil?
795
+ #raise_command_error "Files not specified. Please specify files array, each item may specify a path or pattern of file(s) to upload", args, optparse
796
+ filename = Morpheus::Cli::OptionTypes.prompt([{'fieldName' => 'file', 'fieldLabel' => 'Files', 'type' => 'text', 'required' => true, 'description' => 'Files or directories to upload'}], options[:options])['file'].to_s #.split(",").collect {|it| it.to_s.strip }.select { |it| it != "" }
797
+ end
798
+ unless options[:yes] || Morpheus::Cli::OptionTypes.confirm("Are you sure you want to delete the file #{filename}?")
799
+ return 9, "aborted command"
800
+ end
502
801
  @deployments_interface.setopts(options)
503
802
  if options[:dry_run]
504
- print_dry_run @deployments_interface.dry.destroy(deployment['id'], params)
803
+ print_dry_run @deployments_interface.dry.destroy_file(deployment['id'], deployment_version['id'], filename, params)
505
804
  return
506
805
  end
507
- json_response = @deployments_interface.destroy(deployment['id'], params)
806
+ json_response = @deployments_interface.destroy_file(deployment['id'], deployment_version['id'], filename, params)
508
807
  render_response(json_response, options) do
509
- print_green_success "Removed deployment version #{deployment_version['userVersion']}"
808
+ print_green_success "Removed deployment file #{filename}"
510
809
  end
511
810
  return 0, nil
512
811
  end
@@ -557,7 +856,7 @@ EOT
557
856
  def deployment_version_column_definitions
558
857
  {
559
858
  "ID" => 'id',
560
- "Version" => 'userVersion',
859
+ "Version" => lambda {|it| format_deployment_version_number(it) },
561
860
  "Deploy Type" => lambda {|it| it['deployType'] },
562
861
  "URL" => lambda {|it|
563
862
  if it['deployType'] == 'fetch'
@@ -607,4 +906,18 @@ EOT
607
906
  }
608
907
  end
609
908
 
909
+ # Deployment Files
910
+
911
+ def deployment_file_column_definitions
912
+ {
913
+ #"ID" => 'id',
914
+ "Name" => 'name',
915
+ "Type" => lambda {|it| (it['directory'] || it['isDirectory']) ? "directory" : (it["contentType"] || "file") },
916
+ "Size" => lambda {|it| (it['directory'] || it['isDirectory']) ? "" : format_bytes_short(it['contentLength']) },
917
+ #"Content Type" => lambda {|it| it['contentType'] },
918
+ # "Created" => lambda {|it| format_local_dt(it['dateCreated']) },
919
+ # "Updated" => lambda {|it| format_local_dt(it['lastUpdated']) },
920
+ }
921
+ end
922
+
610
923
  end