morpheus-cli 6.3.3 → 7.0.0
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.
- checksums.yaml +4 -4
- data/Dockerfile +1 -1
- data/lib/morpheus/api/api_client.rb +8 -0
- data/lib/morpheus/api/backup_restores_interface.rb +4 -0
- data/lib/morpheus/api/backup_types_interface.rb +9 -0
- data/lib/morpheus/api/catalog_item_types_interface.rb +1 -2
- data/lib/morpheus/api/hub_interface.rb +25 -0
- data/lib/morpheus/cli/cli_command.rb +3 -0
- data/lib/morpheus/cli/commands/backup_types_command.rb +53 -0
- data/lib/morpheus/cli/commands/backups_command.rb +100 -21
- data/lib/morpheus/cli/commands/catalog_item_types_command.rb +3 -31
- data/lib/morpheus/cli/commands/clouds.rb +22 -4
- data/lib/morpheus/cli/commands/curl_command.rb +1 -1
- data/lib/morpheus/cli/commands/groups.rb +50 -7
- data/lib/morpheus/cli/commands/hub.rb +215 -0
- data/lib/morpheus/cli/commands/jobs_command.rb +10 -6
- data/lib/morpheus/cli/commands/library_forms_command.rb +1 -1
- data/lib/morpheus/cli/commands/library_option_lists_command.rb +1 -1
- data/lib/morpheus/cli/commands/library_option_types_command.rb +1 -1
- data/lib/morpheus/cli/commands/license.rb +151 -86
- data/lib/morpheus/cli/commands/networks_command.rb +1 -1
- data/lib/morpheus/cli/commands/security_packages.rb +1 -1
- data/lib/morpheus/cli/commands/setup.rb +1 -1
- data/lib/morpheus/cli/commands/tasks.rb +2 -2
- data/lib/morpheus/cli/commands/user_settings_command.rb +10 -1
- data/lib/morpheus/cli/mixins/backups_helper.rb +4 -3
- data/lib/morpheus/cli/mixins/jobs_helper.rb +3 -0
- data/lib/morpheus/cli/mixins/print_helper.rb +80 -2
- data/lib/morpheus/cli/option_types.rb +9 -2
- data/lib/morpheus/cli/version.rb +1 -1
- data/lib/morpheus/routes.rb +2 -1
- metadata +6 -2
| @@ -119,10 +119,10 @@ module Morpheus::Cli::BackupsHelper | |
| 119 119 | 
             
                  "Backup" => lambda {|it| it['backup']['name'] rescue '' },
         | 
| 120 120 | 
             
                  "Status" => lambda {|it| format_backup_result_status(it) },
         | 
| 121 121 | 
             
                  #"Duration" => lambda {|it| format_duration(it['startDate'], it['endDate']) },
         | 
| 122 | 
            -
                  "Duration" => lambda {|it| format_duration_milliseconds(it['durationMillis']) },
         | 
| 122 | 
            +
                  "Duration" => lambda {|it| format_duration_milliseconds(it['durationMillis']) if it['durationMillis'].to_i > 0 },
         | 
| 123 123 | 
             
                  "Start Date" => lambda {|it| format_local_dt(it['startDate']) },
         | 
| 124 124 | 
             
                  "End Date" => lambda {|it| format_local_dt(it['endDate']) },
         | 
| 125 | 
            -
                  "Size" => lambda {|it| format_bytes(it['sizeInMb'], 'MB') },
         | 
| 125 | 
            +
                  "Size" => lambda {|it| it['sizeInMb'].to_i != 0 ? format_bytes(it['sizeInMb'], 'MB') : '' },
         | 
| 126 126 | 
             
                }
         | 
| 127 127 | 
             
              end
         | 
| 128 128 |  | 
| @@ -155,7 +155,7 @@ module Morpheus::Cli::BackupsHelper | |
| 155 155 | 
             
                  "Target" => lambda {|it| it['instance']['name'] rescue '' },
         | 
| 156 156 | 
             
                  "Status" => lambda {|it| format_backup_result_status(it) },
         | 
| 157 157 | 
             
                  #"Duration" => lambda {|it| format_duration(it['startDate'], it['endDate']) },
         | 
| 158 | 
            -
                  "Duration" => lambda {|it| format_duration_milliseconds(it['durationMillis']) },
         | 
| 158 | 
            +
                  "Duration" => lambda {|it| format_duration_milliseconds(it['durationMillis']) if it['durationMillis'].to_i > 0 },
         | 
| 159 159 | 
             
                  "Start Date" => lambda {|it| format_local_dt(it['startDate']) },
         | 
| 160 160 | 
             
                  "End Date" => lambda {|it| format_local_dt(it['endDate']) },
         | 
| 161 161 | 
             
                }
         | 
| @@ -168,4 +168,5 @@ module Morpheus::Cli::BackupsHelper | |
| 168 168 | 
             
              def format_backup_restore_status(backup_restore, return_color=cyan)
         | 
| 169 169 | 
             
                format_backup_result_status(backup_restore, return_color)
         | 
| 170 170 | 
             
              end
         | 
| 171 | 
            +
              
         | 
| 171 172 | 
             
            end
         | 
| @@ -84,6 +84,7 @@ module Morpheus::Cli::JobsHelper | |
| 84 84 | 
             
                  end
         | 
| 85 85 | 
             
                  if process_data[:error] && process_data[:error].strip.length > 0
         | 
| 86 86 | 
             
                    print_h2 "Error"
         | 
| 87 | 
            +
                    print red
         | 
| 87 88 | 
             
                    print (process['message'] || process['error']).to_s.strip
         | 
| 88 89 | 
             
                    print reset,"\n"
         | 
| 89 90 | 
             
                  end
         | 
| @@ -129,6 +130,8 @@ module Morpheus::Cli::JobsHelper | |
| 129 130 | 
             
                    out << "#{green}#{status_string.upcase}"
         | 
| 130 131 | 
             
                  elsif ['error', 'offline', 'failed', 'failure'].include?(status_string)
         | 
| 131 132 | 
             
                    out << "#{red}#{status_string.upcase}"
         | 
| 133 | 
            +
                  elsif ['running'].include?(status_string)
         | 
| 134 | 
            +
                    out << "#{cyan}#{status_string.upcase}"
         | 
| 132 135 | 
             
                  else
         | 
| 133 136 | 
             
                    out << "#{yellow}#{status_string.upcase}"
         | 
| 134 137 | 
             
                  end
         | 
| @@ -514,7 +514,8 @@ module Morpheus::Cli::PrintHelper | |
| 514 514 | 
             
                else
         | 
| 515 515 | 
             
                  percent = ((used_value.to_f / max_value.to_f) * 100)
         | 
| 516 516 | 
             
                end
         | 
| 517 | 
            -
                 | 
| 517 | 
            +
                unlimited_label = opts[:unlimited_label] || "n/a" 
         | 
| 518 | 
            +
                percent_label = ((used_value.nil? || max_value.to_f == 0.0) ? unlimited_label : "#{percent.round(percent_sigdig)}%").rjust(6, ' ')
         | 
| 518 519 | 
             
                bar_display = ""
         | 
| 519 520 | 
             
                if percent > 100
         | 
| 520 521 | 
             
                  max_bars.times { bars << "|" }
         | 
| @@ -1000,6 +1001,83 @@ module Morpheus::Cli::PrintHelper | |
| 1000 1001 | 
             
                print as_description_list(obj, columns, opts)
         | 
| 1001 1002 | 
             
              end
         | 
| 1002 1003 |  | 
| 1004 | 
            +
              def print_pretty_details(obj, opts={})
         | 
| 1005 | 
            +
                print as_pretty_details(obj, opts)
         | 
| 1006 | 
            +
              end
         | 
| 1007 | 
            +
             | 
| 1008 | 
            +
              def as_pretty_details(obj, opts={})
         | 
| 1009 | 
            +
                print as_pretty_details(obj, opts.merge({pretty: true}))
         | 
| 1010 | 
            +
              end
         | 
| 1011 | 
            +
             | 
| 1012 | 
            +
              def print_details(obj, opts={})
         | 
| 1013 | 
            +
                print as_details(obj, opts)
         | 
| 1014 | 
            +
              end
         | 
| 1015 | 
            +
             | 
| 1016 | 
            +
              def as_details(obj, opts={})
         | 
| 1017 | 
            +
                #return "" if obj.nil?
         | 
| 1018 | 
            +
                columns = {}
         | 
| 1019 | 
            +
                keys = obj.keys
         | 
| 1020 | 
            +
                if opts[:sort]
         | 
| 1021 | 
            +
                  keys.sort!
         | 
| 1022 | 
            +
                end
         | 
| 1023 | 
            +
                keys.each do |key|
         | 
| 1024 | 
            +
                  display_proc = nil
         | 
| 1025 | 
            +
                  if opts[:column_format] && opts[:column_format].key?(key.to_sym)
         | 
| 1026 | 
            +
                    display_proc = opts[:column_format][key.to_sym]
         | 
| 1027 | 
            +
                  else
         | 
| 1028 | 
            +
                    display_proc = lambda {|it| format_detail_value(it[key]) }
         | 
| 1029 | 
            +
                  end
         | 
| 1030 | 
            +
                  label = opts[:pretty] ? key.to_s.titleize : key.to_s
         | 
| 1031 | 
            +
                  columns[label] = display_proc
         | 
| 1032 | 
            +
                end
         | 
| 1033 | 
            +
                as_description_list(obj, columns, opts)
         | 
| 1034 | 
            +
              end
         | 
| 1035 | 
            +
             | 
| 1036 | 
            +
              def format_detail_value(value)
         | 
| 1037 | 
            +
                rtn = value
         | 
| 1038 | 
            +
                if value.is_a?(Array)
         | 
| 1039 | 
            +
                  # show the first three objects
         | 
| 1040 | 
            +
                  rtn = value.first(3).collect { |row| format_abbreviated_value(row) }.join(", ")
         | 
| 1041 | 
            +
                elsif value.is_a?(Hash)
         | 
| 1042 | 
            +
                  # show the first three properties
         | 
| 1043 | 
            +
                  keys = values.keys.select { |key| value[key].is_a?(Numeric) || value[key].is_a?(String) }.first(3)
         | 
| 1044 | 
            +
                  rtn = keys.collect { |key|
         | 
| 1045 | 
            +
                    "#{key.to_s.titleize}: #{format_abbreviated_value(value[key])}"
         | 
| 1046 | 
            +
                  }.join(", ")
         | 
| 1047 | 
            +
                elsif value.is_a?(TrueClass) || value.is_a?(FalseClass)
         | 
| 1048 | 
            +
                  rtn = format_boolean(value)
         | 
| 1049 | 
            +
                else
         | 
| 1050 | 
            +
                  rtn = value.to_s
         | 
| 1051 | 
            +
                end
         | 
| 1052 | 
            +
                return rtn
         | 
| 1053 | 
            +
              end
         | 
| 1054 | 
            +
             | 
| 1055 | 
            +
              def format_abbreviated_value(value)
         | 
| 1056 | 
            +
                if value.is_a?(Hash)
         | 
| 1057 | 
            +
                  if value.keys.size == 0
         | 
| 1058 | 
            +
                    "{}"
         | 
| 1059 | 
            +
                  else
         | 
| 1060 | 
            +
                    # show the first three properties
         | 
| 1061 | 
            +
                    keys = value.keys.select { |key| value[key].is_a?(Numeric) || value[key].is_a?(String) }.first(3)
         | 
| 1062 | 
            +
                    keys.collect { |key|
         | 
| 1063 | 
            +
                      "#{key.to_s.titleize}: #{value[key]}"
         | 
| 1064 | 
            +
                    }.join(", ")
         | 
| 1065 | 
            +
                  end
         | 
| 1066 | 
            +
                elsif value.is_a?(Array)
         | 
| 1067 | 
            +
                  if value.size == 0
         | 
| 1068 | 
            +
                    return "[]"
         | 
| 1069 | 
            +
                  elsif obj.size == 1
         | 
| 1070 | 
            +
                    "[(#{obj.size})]"
         | 
| 1071 | 
            +
                  else
         | 
| 1072 | 
            +
                    "[(#{obj.size})]"
         | 
| 1073 | 
            +
                  end
         | 
| 1074 | 
            +
                elsif value.is_a?(TrueClass) || value.is_a?(FalseClass)
         | 
| 1075 | 
            +
                  format_boolean(value)
         | 
| 1076 | 
            +
                else
         | 
| 1077 | 
            +
                  value.to_s
         | 
| 1078 | 
            +
                end
         | 
| 1079 | 
            +
              end
         | 
| 1080 | 
            +
             | 
| 1003 1081 | 
             
              # build_column_definitions constructs an Array of column definitions (OpenStruct)
         | 
| 1004 1082 | 
             
              # Each column is defined by a label (String), and a display_method (Proc)
         | 
| 1005 1083 | 
             
              #
         | 
| @@ -1059,7 +1137,7 @@ module Morpheus::Cli::PrintHelper | |
| 1059 1137 | 
             
                      column_def.display_method = lambda {|data| get_object_value(data, v) }
         | 
| 1060 1138 | 
             
                    elsif v.is_a?(Proc)
         | 
| 1061 1139 | 
             
                      column_def.display_method = v
         | 
| 1062 | 
            -
                    elsif v.is_a?(Hash) || v.is_a?( | 
| 1140 | 
            +
                    elsif v.is_a?(Hash) || v.is_a?(OpenStruct)
         | 
| 1063 1141 | 
             
                      if v[:display_name] || v[:label]
         | 
| 1064 1142 | 
             
                        column_def.label = v[:display_name] || v[:label]
         | 
| 1065 1143 | 
             
                      end
         | 
| @@ -1113,8 +1113,15 @@ module Morpheus | |
| 1113 1113 | 
             
                    value_found = false
         | 
| 1114 1114 | 
             
                    value = nil
         | 
| 1115 1115 | 
             
                    while !value_found do
         | 
| 1116 | 
            -
                      print "#{option_type['fieldLabel']}#{option_type['fieldAddOn'] ? (' (' + option_type['fieldAddOn'] + ') ') : '' }#{!option_type['required'] ? ' (optional)' : ''}#{!option_type['defaultValue'].to_s.empty? ? ' ['+option_type['defaultValue'].to_s+']' : ''}: "
         | 
| 1117 | 
            -
                      input = $stdin.gets.chomp!
         | 
| 1116 | 
            +
                      # print "#{option_type['fieldLabel']}#{option_type['fieldAddOn'] ? (' (' + option_type['fieldAddOn'] + ') ') : '' }#{!option_type['required'] ? ' (optional)' : ''}#{!option_type['defaultValue'].to_s.empty? ? ' ['+option_type['defaultValue'].to_s+']' : ''}: "
         | 
| 1117 | 
            +
                      # input = $stdin.gets.chomp!
         | 
| 1118 | 
            +
                      Readline.completion_append_character = ""
         | 
| 1119 | 
            +
                      Readline.basic_word_break_characters = ''
         | 
| 1120 | 
            +
                      Readline.completion_proc = nil
         | 
| 1121 | 
            +
                      prompt_label = "#{option_type['fieldLabel']}#{option_type['fieldAddOn'] ? (' (' + option_type['fieldAddOn'] + ') ') : '' }#{!option_type['required'] ? ' (optional)' : ''}#{!option_type['defaultValue'].to_s.empty? ? ' ['+option_type['defaultValue'].to_s+']' : ''}: "
         | 
| 1122 | 
            +
                      input = Readline.readline(prompt_label, false).to_s
         | 
| 1123 | 
            +
                      input = input.chomp #.strip
         | 
| 1124 | 
            +
             | 
| 1118 1125 | 
             
                      value = input.empty? ? option_type['defaultValue'] : input
         | 
| 1119 1126 | 
             
                      if input == '?'
         | 
| 1120 1127 | 
             
                        help_prompt(option_type)
         | 
    
        data/lib/morpheus/cli/version.rb
    CHANGED
    
    
    
        data/lib/morpheus/routes.rb
    CHANGED
    
    | @@ -223,9 +223,10 @@ module Morpheus::Routes | |
| 223 223 | 
             
                    path = "/admin/settings/environments"
         | 
| 224 224 | 
             
                  when "software-licenses"
         | 
| 225 225 | 
             
                    path = "/admin/settings/software-licenses"
         | 
| 226 | 
            -
                  when "license"
         | 
| 226 | 
            +
                  when "license","licenses"
         | 
| 227 227 | 
             
                    path = "/admin/settings/#!license"
         | 
| 228 228 | 
             
                  end
         | 
| 229 | 
            +
                  # todo: this is weird, fix it so "view license matches license before software-licenses without needing the above alias..
         | 
| 229 230 | 
             
                  # dasherize path and attempt to match the plural first
         | 
| 230 231 | 
             
                  plural_path = path.pluralize
         | 
| 231 232 | 
             
                  paths = [path.dasherize]
         | 
    
        metadata
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: morpheus-cli
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version:  | 
| 4 | 
            +
              version: 7.0.0
         | 
| 5 5 | 
             
            platform: ruby
         | 
| 6 6 | 
             
            authors:
         | 
| 7 7 | 
             
            - David Estes
         | 
| @@ -11,7 +11,7 @@ authors: | |
| 11 11 | 
             
            autorequire:
         | 
| 12 12 | 
             
            bindir: bin
         | 
| 13 13 | 
             
            cert_chain: []
         | 
| 14 | 
            -
            date: 2024- | 
| 14 | 
            +
            date: 2024-03-21 00:00:00.000000000 Z
         | 
| 15 15 | 
             
            dependencies:
         | 
| 16 16 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 17 17 | 
             
              name: bundler
         | 
| @@ -204,6 +204,7 @@ files: | |
| 204 204 | 
             
            - lib/morpheus/api/backup_service_types_interface.rb
         | 
| 205 205 | 
             
            - lib/morpheus/api/backup_services_interface.rb
         | 
| 206 206 | 
             
            - lib/morpheus/api/backup_settings_interface.rb
         | 
| 207 | 
            +
            - lib/morpheus/api/backup_types_interface.rb
         | 
| 207 208 | 
             
            - lib/morpheus/api/backups_interface.rb
         | 
| 208 209 | 
             
            - lib/morpheus/api/billing_interface.rb
         | 
| 209 210 | 
             
            - lib/morpheus/api/blueprints_interface.rb
         | 
| @@ -238,6 +239,7 @@ files: | |
| 238 239 | 
             
            - lib/morpheus/api/guidance_interface.rb
         | 
| 239 240 | 
             
            - lib/morpheus/api/guidance_settings_interface.rb
         | 
| 240 241 | 
             
            - lib/morpheus/api/health_interface.rb
         | 
| 242 | 
            +
            - lib/morpheus/api/hub_interface.rb
         | 
| 241 243 | 
             
            - lib/morpheus/api/image_builder_boot_scripts_interface.rb
         | 
| 242 244 | 
             
            - lib/morpheus/api/image_builder_image_builds_interface.rb
         | 
| 243 245 | 
             
            - lib/morpheus/api/image_builder_interface.rb
         | 
| @@ -381,6 +383,7 @@ files: | |
| 381 383 | 
             
            - lib/morpheus/cli/commands/backup_results_command.rb
         | 
| 382 384 | 
             
            - lib/morpheus/cli/commands/backup_services_command.rb
         | 
| 383 385 | 
             
            - lib/morpheus/cli/commands/backup_settings_command.rb
         | 
| 386 | 
            +
            - lib/morpheus/cli/commands/backup_types_command.rb
         | 
| 384 387 | 
             
            - lib/morpheus/cli/commands/backups_command.rb
         | 
| 385 388 | 
             
            - lib/morpheus/cli/commands/benchmark_command.rb
         | 
| 386 389 | 
             
            - lib/morpheus/cli/commands/blueprints_command.rb
         | 
| @@ -424,6 +427,7 @@ files: | |
| 424 427 | 
             
            - lib/morpheus/cli/commands/health_command.rb
         | 
| 425 428 | 
             
            - lib/morpheus/cli/commands/history_command.rb
         | 
| 426 429 | 
             
            - lib/morpheus/cli/commands/hosts.rb
         | 
| 430 | 
            +
            - lib/morpheus/cli/commands/hub.rb
         | 
| 427 431 | 
             
            - lib/morpheus/cli/commands/image_builder_command.rb
         | 
| 428 432 | 
             
            - lib/morpheus/cli/commands/instance_types.rb
         | 
| 429 433 | 
             
            - lib/morpheus/cli/commands/instances.rb
         |