class Morpheus::Cli::VdiAppsCommand

CLI command VDI App management UI is Tools: VDI Apps API is /vdi-apps and returns vdiApps

Public Instance Methods

_get(id, params, options) click to toggle source
# File lib/morpheus/cli/commands/vdi_apps_command.rb, line 84
def _get(id, params, options)
  vdi_app = nil
  if id.to_s !~ /\A\d{1,}\Z/
    vdi_app = find_vdi_app_by_name(id)
    return 1, "VDI app not found for #{id}" if vdi_app.nil?
    id = vdi_app['id']
  end
  @vdi_apps_interface.setopts(options)
  if options[:dry_run]
    print_dry_run @vdi_apps_interface.dry.get(id, params)
    return
  end
  json_response = @vdi_apps_interface.get(id, params)
  vdi_app = json_response[vdi_app_object_key]
  config = vdi_app['config'] || {}
  # export just the config as json or yaml (default)
  if options[:show_config]
    unless options[:json] || options[:yaml] || options[:csv]
      options[:yaml] = true
    end
    return render_with_format(config, options)
  end
  render_response(json_response, options, vdi_app_object_key) do
    print_h1 "VDI App Details", [], options
    print cyan
    show_columns = vdi_app_column_definitions
    show_columns.delete("VDI Apps") unless vdi_app['apps']
    show_columns.delete("VDI App") unless vdi_app['app']
    show_columns.delete("Guest Console Jump Host") unless vdi_app['guestConsoleJumpHost']
    show_columns.delete("Guest Console Jump Port") unless vdi_app['guestConsoleJumpPort']
    show_columns.delete("Guest Console Jump Username") unless vdi_app['guestConsoleJumpUsername']
    show_columns.delete("Guest Console Jump Password") unless vdi_app['guestConsoleJumpPassword']
    show_columns.delete("Guest Console Jump Keypair") unless vdi_app['guestConsoleJumpKeypair']
    print_description_list(show_columns, vdi_app)


    print reset,"\n"
  end
  return 0, nil
end
add(args) click to toggle source
# File lib/morpheus/cli/commands/vdi_apps_command.rb, line 125
  def add(args)
    options = {}
    params = {}
    optparse = Morpheus::Cli::OptionParser.new do |opts|
      opts.banner = subcommand_usage("[name] [options]")
      build_option_type_options(opts, options, add_vdi_app_option_types)
      build_standard_add_options(opts, options)
      opts.footer = <<-EOT
Create a new VDI app.
EOT
    end
    optparse.parse!(args)
    verify_args!(args:args, optparse:optparse, min:0, max:1)
    options[:options]['name'] = args[0] if args[0]
    if options[:options]['logo']
      options[:options]['iconPath'] = 'custom'
    end
    connect(options)
    payload = {}
    if options[:payload]
      payload = options[:payload]
      payload.deep_merge!({vdi_app_object_key => parse_passed_options(options)})
    else
      payload.deep_merge!({vdi_app_object_key => parse_passed_options(options)})
      v_prompt = Morpheus::Cli::OptionTypes.prompt(add_vdi_app_option_types, options[:options], @api_client, options[:params])
      params.deep_merge!(v_prompt)
      params.booleanize!
      # logo upload requires multipart instead of json
      if params['logo']
        params['logo'] = File.new(File.expand_path(params['logo']), 'rb')
        payload[:multipart] = true
      end
      payload[vdi_app_object_key].deep_merge!(params)
    end
    @vdi_apps_interface.setopts(options)
    if options[:dry_run]
      print_dry_run @vdi_apps_interface.dry.create(payload)
      return 0, nil
    end
    json_response = @vdi_apps_interface.create(payload)
    vdi_app = json_response[vdi_app_object_key]
    render_response(json_response, options, vdi_app_object_key) do
      print_green_success "Added VDI app #{vdi_app['name']}"
      return _get(vdi_app["id"], {}, options)
    end
    return 0, nil
  end
connect(opts) click to toggle source
# File lib/morpheus/cli/commands/vdi_apps_command.rb, line 16
def connect(opts)
  @api_client = establish_remote_appliance_connection(opts)
  @vdi_apps_interface = @api_client.vdi_apps
  @vdi_apps_interface = @api_client.vdi_apps
  @vdi_apps_interface = @api_client.vdi_apps
  @option_types_interface = @api_client.option_types
end
get(args) click to toggle source
# File lib/morpheus/cli/commands/vdi_apps_command.rb, line 63
  def get(args)
    params = {}
    options = {}
    optparse = Morpheus::Cli::OptionParser.new do |opts|
      opts.banner = subcommand_usage("[app]")
      build_standard_get_options(opts, options)
      opts.footer = <<-EOT
Get details about a specific VDI app.
[app] is required. This is the name or id of a VDI app.
EOT
    end
    optparse.parse!(args)
    verify_args!(args:args, optparse:optparse, min:1)
    connect(options)
    params.merge!(parse_query_options(options))
    id_list = parse_id_list(args)
    return run_command_for_each_arg(id_list) do |arg|
      _get(arg, params, options)
    end
  end
handle(args) click to toggle source
# File lib/morpheus/cli/commands/vdi_apps_command.rb, line 24
def handle(args)
  handle_subcommand(args)
end
list(args) click to toggle source
# File lib/morpheus/cli/commands/vdi_apps_command.rb, line 28
def list(args)
  options = {}
  params = {}
  ref_ids = []
  optparse = Morpheus::Cli::OptionParser.new do |opts|
    opts.banner = subcommand_usage("[search]")
    build_standard_list_options(opts, options)
    opts.footer = "List VDI apps."
  end
  optparse.parse!(args)
  connect(options)
  if args.count > 0
    options[:phrase] = args.join(" ")
  end
  params.merge!(parse_list_options(options))
  @vdi_apps_interface.setopts(options)
  if options[:dry_run]
    print_dry_run @vdi_apps_interface.dry.list(params)
    return
  end
  json_response = @vdi_apps_interface.list(params)
  render_response(json_response, options, vdi_app_list_key) do
    vdi_apps = json_response[vdi_app_list_key]
    print_h1 "Morpheus VDI Apps", parse_list_subtitles(options), options
    if vdi_apps.empty?
      print cyan,"No VDI apps found.",reset,"\n"
    else
      print as_pretty_table(vdi_apps, vdi_app_list_column_definitions.upcase_keys!, options)
      print_results_pagination(json_response)
    end
    print reset,"\n"
  end
  return 0, nil
end
remove(args) click to toggle source
# File lib/morpheus/cli/commands/vdi_apps_command.rb, line 228
  def remove(args)
    options = {}
    params = {}
    optparse = Morpheus::Cli::OptionParser.new do |opts|
      opts.banner = subcommand_usage("[app] [options]")
      build_standard_remove_options(opts, options)
      opts.footer = <<-EOT
Delete a VDI app.
[app] is required. This is the name or id of a VDI app.
EOT
    end
    optparse.parse!(args)
    verify_args!(args:args, optparse:optparse, count:1)
    connect(options)
    vdi_app = find_vdi_app_by_name_or_id(args[0])
    return 1 if vdi_app.nil?
    @vdi_apps_interface.setopts(options)
    if options[:dry_run]
      print_dry_run @vdi_apps_interface.dry.destroy(vdi_app['id'], params)
      return
    end
    unless options[:yes] || Morpheus::Cli::OptionTypes.confirm("Are you sure you want to delete the VDI app #{vdi_app['name']}?")
      return 9, "aborted command"
    end
    json_response = @vdi_apps_interface.destroy(vdi_app['id'], params)
    render_response(json_response, options) do
      print_green_success "Removed VDI app #{vdi_app['name']}"
    end
    return 0, nil
  end
update(args) click to toggle source
# File lib/morpheus/cli/commands/vdi_apps_command.rb, line 173
  def update(args)
    options = {}
    params = {}
    payload = {}
    optparse = Morpheus::Cli::OptionParser.new do |opts|
      opts.banner = subcommand_usage("[app] [options]")
      build_option_type_options(opts, options, update_vdi_app_option_types)
      build_standard_update_options(opts, options)
      opts.footer = <<-EOT
Update a VDI app.
[app] is required. This is the name or id of a VDI app.
EOT
    end
    optparse.parse!(args)
    verify_args!(args:args, optparse:optparse, count:1)
    if options[:options]['logo']
      options[:options]['iconPath'] = 'custom'
    end
    connect(options)
    vdi_app = find_vdi_app_by_name_or_id(args[0])
    return 1 if vdi_app.nil?
    payload = {}
    if options[:payload]
      payload = options[:payload]
      payload.deep_merge!({vdi_app_object_key => parse_passed_options(options)})
    else
      payload.deep_merge!({vdi_app_object_key => parse_passed_options(options)})
      v_prompt = Morpheus::Cli::OptionTypes.no_prompt(update_vdi_app_option_types, options[:options], @api_client, options[:params])
      v_prompt.deep_compact!
      params.deep_merge!(v_prompt)
      params.booleanize!
      # logo upload requires multipart instead of json
      if params['logo']
        params['logo'] = File.new(File.expand_path(params['logo']), 'rb')
        payload[:multipart] = true
      end
      payload.deep_merge!({vdi_app_object_key => params})
      if payload[vdi_app_object_key].empty? # || options[:no_prompt]
        raise_command_error "Specify at least one option to update.\n#{optparse}"
      end
    end
    @vdi_apps_interface.setopts(options)
    if options[:dry_run]
      print_dry_run @vdi_apps_interface.dry.update(vdi_app['id'], payload)
      return
    end
    json_response = @vdi_apps_interface.update(vdi_app['id'], payload)
    vdi_app = json_response[vdi_app_object_key]
    render_response(json_response, options, vdi_app_object_key) do
      print_green_success "Updated VDI app #{vdi_app['name']}"
      return _get(vdi_app["id"], {}, options)
    end
    return 0, nil
  end

Private Instance Methods

add_vdi_app_option_types() click to toggle source
# File lib/morpheus/cli/commands/vdi_apps_command.rb, line 286
def add_vdi_app_option_types
  [
    {'fieldName' => 'name', 'fieldLabel' => 'Name', 'type' => 'text', 'required' => true, 'description' => 'Choose a unique name for the VDI App'},
    {'fieldName' => 'description', 'fieldLabel' => 'Description', 'type' => 'text', 'description' => 'Description'},
    {'fieldName' => 'launchPrefix', 'fieldLabel' => 'Launch Prefix', 'type' => 'text', 'required' => true, 'description' => 'The RDS App Name Prefix. Note: Must start with || (i.e. ||notepad) to launch notepad'},
    #{'code' => 'vdiApp.iconPath', 'fieldName' => 'iconPath', 'fieldLabel' => 'Logo', 'type' => 'select', 'optionSource' => 'iconList', 'defaultValue' => 'resource'},
    # iconList does not include custom, so add it ourselves..
    # only prompt for logo file if custom
    {'code' => 'vdiApp.iconPath', 'fieldName' => 'iconPath', 'fieldLabel' => 'Logo', 'type' => 'select', 'optionSource' => lambda { |api_client, api_params| 
      dropdown = api_client.options.options_for_source("iconList")['data']
      if !dropdown.find {|it| it['value'] == 'custom'}
        dropdown.push({'name' => 'Custom', 'value' => 'custom'})
      end
      dropdown
    }, 'description' => 'Logo icon path or custom if uploading a custom logo', 'defaultValue' => 'resource'},
    {'dependsOnCode' => 'vdiApp.iconPath:custom', 'fieldName' => 'logo', 'fieldLabel' => 'Logo File', 'type' => 'file', 'required' => true, 'description' => 'Local filepath of image file to upload as custom icon'},
  ]
end
update_vdi_app_option_types() click to toggle source
# File lib/morpheus/cli/commands/vdi_apps_command.rb, line 305
def update_vdi_app_option_types
  list = add_vdi_app_option_types.collect {|it|
    it.delete('required')
    it.delete('defaultValue')
    it
  }
  list = list.reject {|it| ["type"].include? it['fieldName'] }
  list
end
vdi_app_column_definitions() click to toggle source
# File lib/morpheus/cli/commands/vdi_apps_command.rb, line 274
def vdi_app_column_definitions()
  {
    "ID" => 'id',
    "Name" => 'name',
    "Description" => 'description',
    "Launch Prefix" => 'launchPrefix',
    "Logo" => 'logo',
    "Created" => lambda {|it| format_local_dt(it['dateCreated']) },
    "Updated" => lambda {|it| format_local_dt(it['lastUpdated']) },
  }
end
vdi_app_list_column_definitions() click to toggle source
# File lib/morpheus/cli/commands/vdi_apps_command.rb, line 261
def vdi_app_list_column_definitions()

  {
    "ID" => 'id',
    "Name" => 'name',
    # "Description" => 'description',
    "Launch Prefix" => 'launchPrefix',
    # "Logo" => 'logo',
    # "Created" => lambda {|it| format_local_dt(it['dateCreated']) },
    # "Updated" => lambda {|it| format_local_dt(it['lastUpdated']) },
  }
end