class Morpheus::Cli::LibraryLayoutsCommand

Public Class Methods

new() click to toggle source
# File lib/morpheus/cli/commands/library_layouts_command.rb, line 14
def initialize()
  # @appliance_name, @appliance_url = Morpheus::Cli::Remote.active_appliance
end

Public Instance Methods

_get(id, options) click to toggle source
# File lib/morpheus/cli/commands/library_layouts_command.rb, line 139
def _get(id, options)
  exit_code, err = 0, nil
  instance_type_id = nil
  params = {}
  params.merge!(parse_query_options(options))
  @library_layouts_interface.setopts(options)
  if options[:dry_run]
    if id.to_s =~ /\A\d{1,}\Z/
      print_dry_run @library_layouts_interface.dry.get(instance_type_id, id.to_i, params)
    else
      print_dry_run @library_layouts_interface.dry.list(instance_type_id, params.merge({name:id}))
    end
    return
  end
  layout = find_layout_by_name_or_id(instance_type_id, id)
  if layout.nil?
    return 1
  end
  # skip redundant request
  #json_response = @library_layouts_interface.get(instance_type_id, layout['id'])
  json_response = {'instanceTypeLayout' => layout}
  #layout = json_response['instanceTypeLayout']
  if options[:json]
    puts as_json(json_response, options, "instanceTypeLayout")
    return 0
  elsif options[:yaml]
    puts as_yaml(json_response, options, "instanceTypeLayout")
    return 0
  elsif options[:csv]
    puts records_as_csv([json_response['instanceTypeLayout']], options)
    return 0
  end

  print_h1 "Layout Details"
  print cyan
  description_cols = {
    "ID" => lambda {|it| it['id'] },
    "Name" => lambda {|it| it['name'] },
    "Instance Type" => lambda {|it| it['instanceType']['name'] rescue '' },
    #"Code" => lambda {|it| it['code'] },
    "Version" => lambda {|it| it['instanceVersion'] },
    "Description" => lambda {|it| it['description'] },
    "Technology" => lambda {|it| format_layout_technology(it) },
    "Labels" => lambda {|it| format_list(it['labels'], '') },
    "Min Memory" => lambda {|it| 
      if it['memoryRequirement'].to_i != 0
        (it['memoryRequirement'].to_i / (1024*1024)).to_s + " MB"
      else
        ""
      end
    },
    "Workflow" => lambda {|it| 
      if it['taskSets']
        it['taskSets'][0]['name'] rescue ""
      else
        ""
      end
    },
    "Tfvar Secret" => lambda {|it| it['tfvarSecret'] },
    # "Category" => lambda {|it| it['category'].to_s.capitalize },
    # # "Logo" => lambda {|it| it['logo'].to_s },
    # "Visiblity" => lambda {|it| it['visibility'].to_s.capitalize },
    # "Environment Prefix" => lambda {|it| it['environmentPrefix'] },
    # "Enable Settings" => lambda {|it| format_boolean it['hasSettings'] },
    # "Enable Scaling" => lambda {|it| format_boolean it['hasAutoScale'] },
    # "Supports Deployments" => lambda {|it| format_boolean it['hasDeployment'] },
    # "Featured" => lambda {|it| format_boolean it['featured'] },
    # "Owner" => lambda {|it| it['account'] ? it['account']['name'] : '' },
    # "Active" => lambda {|it| format_boolean it['active'] },
    # "Created" => lambda {|it| format_local_dt(it['dateCreated']) },
    # "Updated" => lambda {|it| format_local_dt(it['lastUpdated']) }
  }
  description_cols.delete("Tfvar Secret") if !(layout['provisionType'] && layout['provisionType']['code'] == 'terraform')
  print_description_list(description_cols, layout)

  price_sets = layout['priceSets']
    if price_sets && price_sets.size > 0
      print_h2 "Price Sets"
      price_set_columns = [
        {"ID" => lambda {|it| it['id'] } },
        {"NAME" => lambda {|it| it['name'] } },
        {"PRICE UNIT" => lambda {|it| it['priceUnit'] } },
      ]
      print as_pretty_table(price_sets, price_set_columns)
    else
      # print cyan,"No price sets found for this instance type.","\n",reset
    end

  layout_evars = layout['environmentVariables']
  if layout_evars && layout_evars.size > 0
    print_h2 "Environment Variables"
    evar_columns = [
      {"NAME" => lambda {|it| it['name'] } },
      {"VALUE" => lambda {|it| it['defaultValue'] } },
      {"TYPE" => lambda {|it| it['valueType'].to_s.capitalize } },
      {"EXPORT" => lambda {|it| format_boolean it['export'] } },
      {"MASKED" => lambda {|it| format_boolean it['masked'] } },
    ]
    print as_pretty_table(layout_evars, evar_columns)
  else
    # print yellow,"No environment variables found for this instance type.","\n",reset
  end

  layout_option_types = layout['optionTypes']
  if layout_option_types && layout_option_types.size > 0
    print_h2 "Option Types"
    columns = [
      {"ID" => lambda {|it| it['id'] } },
      {"NAME" => lambda {|it| it['name'] } },
      {"TYPE" => lambda {|it| it['type'] } },
      {"FIELD NAME" => lambda {|it| it['fieldName'] } },
      {"FIELD LABEL" => lambda {|it| it['fieldLabel'] } },
      {"DEFAULT" => lambda {|it| it['defaultValue'] } },
      {"REQUIRED" => lambda {|it| format_boolean it['required'] } },
    ]
    print as_pretty_table(layout_option_types, columns)
  else
    # print yellow,"No option types found for this layout.","\n",reset
  end

  layout_node_types = layout['containerTypes']
  if layout_node_types && layout_node_types.size > 0
    print_h2 "Node Types"
    # match UI sorting [version desc, name asc]
    # or use something simpler like one of these
    layout_node_types = layout_node_types.sort { |a,b| a['name'] <=> b['name'] }
    # layout_node_types = layout_node_types.sort { |a,b| a['sortOrder'] <=> b['sortOrder'] }
    node_type_columns = [
      {"ID" => lambda {|it| it['id'] } },
      {"NAME" => lambda {|it| it['name'] } },
      {"SHORT NAME" => lambda {|it| it['shortName'] } },
      {"VERSION" => lambda {|it| it['containerVersion'] } },
      {"TECHNOLOGY" => lambda {|it| it['provisionType'] ? it['provisionType']['name'] : '' } },
      {"CATEGORY" => lambda {|it| it['category'] } },
    ]
    print as_pretty_table(layout_node_types, node_type_columns)
  else
    # print yellow,"No node types for this layout.","\n",reset
  end

  layout_spec_templates = layout['specTemplates']
  if layout_spec_templates && layout_spec_templates.size > 0
    print_h2 "Spec Templates"
    layout_spec_templates = layout_spec_templates.sort { |a,b| a['name'] <=> b['name'] }
    spec_template_columns = [
      {"ID" => lambda {|it| it['id'] } },
      {"NAME" => lambda {|it| it['name'] } },
      {"TYPE" => lambda {|it| it['type']['name'] rescue '' } }
    ]
    print as_pretty_table(layout_spec_templates, spec_template_columns)
  else
    # print yellow,"No spec templates for this layout.","\n",reset
  end


  if options[:show_perms] || (layout['permissions'] && !layout['permissions'].empty?)
    print_permissions(layout['permissions'], layout_permission_excludes)
    print reset
  else
    print reset,"\n"
  end
  return exit_code, err
end
add(args) click to toggle source
# File lib/morpheus/cli/commands/library_layouts_command.rb, line 303
  def add(args)
    options = {}
    params = {}
    instance_type_id = nil
    evars = nil
    optparse = Morpheus::Cli::OptionParser.new do|opts|
      opts.banner = subcommand_usage("[instance-type]")
      opts.on('--instance-type ID', String, "Instance Type") do |val|
        instance_type_id = val
      end
      opts.on('--name VALUE', String, "Name for this layout") do |val|
        params['name'] = val
      end
      opts.on('-l', '--labels [LIST]', String, "Labels") do |val|
        params['labels'] = parse_labels(val)
      end
      opts.on('--version VALUE', String, "Version") do |val|
        params['instanceVersion'] = val
      end
      opts.on('--description VALUE', String, "Description") do |val|
        params['description'] = val
      end
      opts.on("--creatable [on|off]", ['on','off'], "Creatable") do |val|
        params['creatable'] = (val.to_s != 'false' && val.to_s != 'off')
      end
      opts.on('--technology CODE', String, "Technology") do |val|
        params['provisionTypeCode'] = val
      end
      opts.on('--min-memory VALUE', String, "Minimum Memory (MB)") do |val|
        params['memoryRequirement'] = val
      end
      opts.on("--auto-scale [on|off]", ['on','off'], "Enable Scaling (Horizontal)") do |val|
        params['hasAutoScale'] = (val.to_s != 'false' && val.to_s != 'off')
      end
      opts.on("--convert-to-managed [on|off]", ['on','off'], "Supports Convert To Managed") do |val|
        params['supportsConvertToManaged'] = (val.to_s != 'false' && val.to_s != 'off')
      end
      opts.on('--workflow ID', String, "Workflow") do |val|
        params['taskSetId'] = val.to_i
      end
      opts.on('--option-types [x,y,z]', Array, "List of Option Type IDs") do |list|
        if list.nil?
          params['optionTypes'] = []
        else
          params['optionTypes'] = list.collect {|it| it.to_s.strip.empty? ? nil : it.to_s.strip }.compact.uniq
        end
      end
      opts.on('--node-types [x,y,z]', Array, "List of Node Type IDs") do |list|
        if list.nil?
          params['containerTypes'] = []
        else
          params['containerTypes'] = list.collect {|it| it.to_s.strip.empty? ? nil : it.to_s.strip }.compact.uniq
        end
      end
      opts.on('--spec-templates [x,y,z]', Array, "List of Spec Templates to include in this layout, comma separated list of names or IDs.") do |list|
        if list.nil?
          params['specTemplates'] = []
        else
          params['specTemplates'] = list.collect {|it| it.to_s.strip.empty? ? nil : it.to_s.strip }.compact.uniq
        end
      end
      opts.on('--tfvar-secret VALUE', String, "Tfvar Secret name, eg. 'tfvars/dev-key'") do |val|
        params['tfvarSecret'] = val == 'null' ? nil : val
      end
      opts.on('--price-sets [LIST]', Array, 'Price set(s), comma separated list of price set IDs') do |list|
        params['priceSets'] = list.collect {|it| it.to_s.strip.empty? || !it.to_i ? nil : it.to_s.strip}.compact.uniq.collect {|it| {'id' => it.to_i}}
      end
      add_perms_options(opts, options, layout_permission_excludes)
      build_standard_add_options(opts, options)
      opts.footer = <<-EOT
Create a new layout.
[instance-type] is required and can be passed as --instance-type instead.
EOT
    end
    optparse.parse!(args)
    if args.count > 1
      raise_command_error "wrong number of arguments, expected 0-1 and got (#{args.count}) #{args}\n#{optparse}"
    end
    if args[0]
      #params["name"] = args[0]
      instance_type_id = args[0]
    end
    if instance_type_id.nil?
      instance_type_id = args[0]
    end
    if !instance_type_id
      puts optparse
      return 1
    end
    connect(options)
    begin
      instance_type = find_instance_type_by_name_or_id(instance_type_id)
      exit 1 if instance_type.nil?
      instance_type_id = instance_type['id']

      # construct payload
      payload = nil
      if options[:payload]
        payload = options[:payload]
      else
        params.deep_merge!(options[:options].reject {|k,v| k.is_a?(Symbol) }) if options[:options]
        
        if !params['name']
          v_prompt = Morpheus::Cli::OptionTypes.prompt([{'fieldName' => 'name', 'type' => 'text', 'fieldLabel' => 'Name', 'required' => true}], options[:options])
          params['name'] = v_prompt['name']
        end
        if !params['instanceVersion']
          v_prompt = Morpheus::Cli::OptionTypes.prompt([{'fieldName' => 'instanceVersion', 'type' => 'text', 'fieldLabel' => 'Version', 'required' => true}], options[:options])
          params['instanceVersion'] = v_prompt['instanceVersion']
        end
        if !params['description']
          v_prompt = Morpheus::Cli::OptionTypes.prompt([{'fieldName' => 'description', 'type' => 'text', 'fieldLabel' => 'Description', 'required' => false}], options[:options])
          params['description'] = v_prompt['description'] if v_prompt['description']
        end
        if params['creatable'].nil?
          v_prompt = Morpheus::Cli::OptionTypes.prompt([{'fieldName' => 'creatable', 'type' => 'checkbox', 'fieldLabel' => 'Creatable', 'defaultValue' => 'on'}], options[:options])
          params['creatable'] = ['true','on'].include?(v_prompt['creatable'].to_s) if v_prompt['creatable'] != nil
        end

        provision_types = @provision_types_interface.list({customSupported: true})['provisionTypes']
        if provision_types.empty?
          print_red_alert "No available provision types found!"
          exit 1
        end
        provision_type_options = provision_types.collect {|it| { 'name' => it['name'], 'value' => it['code']} }

        if !params['provisionTypeCode']
          v_prompt = Morpheus::Cli::OptionTypes.prompt([{'fieldName' => 'provisionTypeCode', 'type' => 'select', 'selectOptions' => provision_type_options, 'fieldLabel' => 'Technology', 'required' => true, 'description' => 'The type of container technology.'}], options[:options])
          params['provisionTypeCode'] = v_prompt['provisionTypeCode']
        else

        end
        provision_type = provision_types.find {|it| it['code'] == params['provisionTypeCode'] }

        if !params['memoryRequirement']
          v_prompt = Morpheus::Cli::OptionTypes.prompt([{'fieldName' => 'memoryRequirement', 'type' => 'text', 'fieldLabel' => 'Min Memory (MB)', 'required' => false, 'description' => 'This will override any memory requirement set on the virtual image'}], options[:options])
          params['memoryRequirement'] = v_prompt['memoryRequirement'] if v_prompt['memoryRequirement']
        end
        if params['hasAutoScale'].nil?
          v_prompt = Morpheus::Cli::OptionTypes.prompt([{'fieldName' => 'hasAutoScale', 'type' => 'checkbox', 'fieldLabel' => 'Enable Scaling (Horizontal)'}], options[:options])
          params['hasAutoScale'] = ['true','on'].include?(v_prompt['hasAutoScale'].to_s) if v_prompt['hasAutoScale'] != nil
        end
        if params['supportsConvertToManaged'].nil?
          v_prompt = Morpheus::Cli::OptionTypes.prompt([{'fieldName' => 'supportsConvertToManaged', 'type' => 'checkbox', 'fieldLabel' => 'Supports Convert To Managed'}], options[:options])
          params['supportsConvertToManaged'] = ['true','on'].include?(v_prompt['supportsConvertToManaged'].to_s) if v_prompt['supportsConvertToManaged'] != nil
        end        
        if !params['taskSetId']
          v_prompt = Morpheus::Cli::OptionTypes.prompt([{'fieldName' => 'taskSetId', 'type' => 'text', 'fieldLabel' => 'Workflow ID', 'required' => false, 'description' => 'Worflow ID'}], options[:options])
          params['taskSetId'] = v_prompt['taskSetId'].to_i if v_prompt['taskSetId']
        end
        
        # ENVIRONMENT VARIABLES
        if evars

        else
          # prompt
        end

        # OPTION TYPES
        prompt_results = prompt_for_option_types(params, options, @api_client)
        if prompt_results[:success]
          params['optionTypes'] = prompt_results[:data] unless prompt_results[:data].nil?
        else
          return 1
        end

        # NODE TYPES
        prompt_results = prompt_for_container_types(params, options, @api_client)
        if prompt_results[:success]
          params['containerTypes'] = prompt_results[:data] unless prompt_results[:data].nil?
        else
          return 1
        end

        # SPEC TEMPLATES
        prompt_results = prompt_for_spec_templates(params, options, @api_client)
        if prompt_results[:success]
          params['specTemplates'] = prompt_results[:data] unless prompt_results[:data].nil?
        else
          return 1
        end
        
        # TFVAR SECRET
        if !params['tfvarSecret']
          if provision_type && provision_type['code'] == 'terraform'
            v_prompt = Morpheus::Cli::OptionTypes.prompt([{'fieldName' => 'tfvarSecret', 'type' => 'select', 'optionSource' => 'tfvarSecrets', 'fieldLabel' => 'Tfvar Secret', 'required' => false}], options[:options], @api_client)
            params['tfvarSecret'] = v_prompt['tfvarSecret'] if v_prompt['tfvarSecret']
          end
        end

        payload = {'instanceTypeLayout' => params}
        
        # Resource Permissions (Groups only for layouts)
        perms = prompt_permissions(options.merge({}), layout_permission_excludes)
        perms_payload = {}
        perms_payload['resourcePermissions'] = perms['resourcePermissions'] if !perms['resourcePermissions'].empty?
        #perms_payload['tenantPermissions'] = perms['tenantPermissions'] if !perms['tenantPermissions'].nil?

        payload['instanceTypeLayout']['permissions'] = perms_payload
        payload['instanceTypeLayout']['visibility'] = perms['resourcePool']['visibility'] if !perms['resourcePool'].nil? && !perms['resourcePool']['visibility'].nil?

      end
      @library_layouts_interface.setopts(options)
      if options[:dry_run]
        print_dry_run @library_layouts_interface.dry.create(instance_type_id, payload)
        return
      end

      json_response = @library_layouts_interface.create(instance_type_id, payload)

      if options[:json]
        print JSON.pretty_generate(json_response), "\n"
        return
      end

      print_green_success "Added layout #{params['name']}"

      #get([json_response['instanceTypeLayout']['id']])

    rescue RestClient::Exception => e
      print_rest_exception(e, options)
      exit 1
    end
  end
connect(opts) click to toggle source
# File lib/morpheus/cli/commands/library_layouts_command.rb, line 18
def connect(opts)
  @api_client = establish_remote_appliance_connection(opts)
  @library_layouts_interface = @api_client.library_layouts
  @library_instance_types_interface = @api_client.library_instance_types
  @library_container_types_interface = @api_client.library_container_types
  @spec_templates_interface = @api_client.library_spec_templates
  @spec_template_types_interface = @api_client.library_spec_template_types
  @provision_types_interface = @api_client.provision_types
  @option_types_interface = @api_client.option_types
  @option_type_lists_interface = @api_client.option_type_lists
end
get(args) click to toggle source
# File lib/morpheus/cli/commands/library_layouts_command.rb, line 117
  def get(args)
    options = {}
    optparse = Morpheus::Cli::OptionParser.new do |opts|
      opts.banner = subcommand_usage("[layout]")
      # opts.on( nil, '--permissions', "Display permissions" ) do
      #   options[:show_perms] = true
      # end
      build_standard_get_options(opts, options)
      opts.footer = <<-EOT
Get details about a layout.
[layout] is required. This is the name or id of a layout.
EOT
    end
    verify_args!(args:args, optparse:optparse, min:1)
    optparse.parse!(args)
    connect(options)
    id_list = parse_id_list(args)
    return run_command_for_each_arg(id_list) do |arg|
      _get(arg, options)
    end
  end
handle(args) click to toggle source
# File lib/morpheus/cli/commands/library_layouts_command.rb, line 30
def handle(args)
  handle_subcommand(args)
end
list(args) click to toggle source
# File lib/morpheus/cli/commands/library_layouts_command.rb, line 35
def list(args)
  options = {}
  params = {}
  instance_type = nil
  instance_type_id = nil
  optparse = Morpheus::Cli::OptionParser.new do |opts|
    opts.banner = subcommand_usage()
    opts.on('--instance-type ID', String, "Filter by Instance Type") do |val|
      instance_type_id = val
    end
    opts.on('--category VALUE', String, "Filter by category") do |val|
      params['category'] = val
    end
    opts.on('--code VALUE', String, "Filter by code") do |val|
      params['code'] = val
    end
    opts.on('--technology VALUE', String, "Filter by technology") do |val|
      params['provisionType'] = val
    end
    opts.on('-l', '--labels LABEL', String, "Filter by labels, can match any of the values") do |val|
      add_query_parameter(params, 'labels', parse_labels(val))
    end
    opts.on('--all-labels LABEL', String, "Filter by labels, must match all of the values") do |val|
      add_query_parameter(params, 'allLabels', parse_labels(val))
    end
    build_common_options(opts, options, [:list, :query, :json, :yaml, :csv, :fields, :dry_run, :remote])
    opts.footer = "List layouts."
  end
  optparse.parse!(args)
  # verify_args!(args:args, optparse:optparse, count:0)
  if args.count > 0
    options[:phrase] = args.join(" ")
  end
  connect(options)
  begin
    # construct payload
    if instance_type_id
      instance_type = find_instance_type_by_name_or_id(instance_type_id)
      return 1 if instance_type.nil?
      instance_type_id = instance_type['id']
    end
    
    params.merge!(parse_list_options(options))
    @library_layouts_interface.setopts(options)
    if options[:dry_run]
      print_dry_run @library_layouts_interface.dry.list(instance_type_id, params)
      return
    end

    json_response = @library_layouts_interface.list(instance_type_id, params)
    if options[:json]
      puts as_json(json_response, options, "instanceTypeLayouts")
      return 0
    elsif options[:csv]
      puts records_as_csv(json_response['instanceTypeLayouts'], options)
      return 0
    elsif options[:yaml]
      puts as_yaml(json_response, options, "instanceTypeLayouts")
      return 0
    end
    layouts = json_response['instanceTypeLayouts']
    title = "Morpheus Library - Layouts"
    subtitles = []
    if instance_type
      subtitles << "Instance Type: #{instance_type['name']}".strip
    end
    subtitles += parse_list_subtitles(options)
    print_h1 title, subtitles
    if layouts.empty?
      print cyan,"No layouts found.",reset,"\n"
    else
      print_layouts_table(layouts, options)
      print_results_pagination(json_response, {:label => "layout", :n_label => "layouts"})
      # print_results_pagination(json_response)
    end
    print reset,"\n"
  rescue RestClient::Exception => e
    print_rest_exception(e, options)
    return 1
  end
end
remove(args) click to toggle source
# File lib/morpheus/cli/commands/library_layouts_command.rb, line 736
def remove(args)
  options = {}
  optparse = Morpheus::Cli::OptionParser.new do|opts|
    opts.banner = subcommand_usage("[name]")
    build_common_options(opts, options, [:auto_confirm, :json, :dry_run, :remote])
    opts.footer = "Delete a layout."
  end
  optparse.parse!(args)
  if args.count < 1
    puts optparse
    exit 1
  end
  connect(options)

  begin
    layout = find_layout_by_name_or_id(nil, args[0])
    exit 1 if layout.nil?

    unless Morpheus::Cli::OptionTypes.confirm("Are you sure you want to delete the instance type #{layout['name']}?", options)
      exit
    end
    @library_layouts_interface.setopts(options)
    if options[:dry_run]
      print_dry_run @library_layouts_interface.dry.destroy(nil, layout['id'])
      return
    end
    json_response = @library_layouts_interface.destroy(nil, layout['id'])

    if options[:json]
      print JSON.pretty_generate(json_response), "\n"
      return
    end

    print_green_success "Removed layout #{layout['name']}"
    #list([])
  rescue RestClient::Exception => e
    print_rest_exception(e, options)
    exit 1
  end
end
update(args) click to toggle source
# File lib/morpheus/cli/commands/library_layouts_command.rb, line 528
  def update(args)
    options = {}
    params = {}
    instance_type_id = nil
    evars = nil
    optparse = Morpheus::Cli::OptionParser.new do|opts|
      opts.banner = subcommand_usage("[layout] [options]")
      opts.on('--name VALUE', String, "Name for this layout") do |val|
        params['name'] = val
      end
      opts.on('-l', '--labels [LIST]', String, "Labels") do |val|
        params['labels'] = parse_labels(val)
      end
      opts.on('--version VALUE', String, "Version") do |val|
        params['instanceVersion'] = val
      end
      opts.on('--description VALUE', String, "Description") do |val|
        params['description'] = val
      end
      opts.on("--creatable [on|off]", ['on','off'], "Creatable") do |val|
        params['creatable'] = (val.to_s != 'false' && val.to_s != 'off')
      end
      opts.on('--technology CODE', String, "Technology") do |val|
        params['provisionTypeCode'] = val
      end
      opts.on('--min-memory VALUE', String, "Minimum Memory (MB)") do |val|
        params['memoryRequirement'] = val
      end
      opts.on("--auto-scale [on|off]", ['on','off'], "Enable Scaling (Horizontal)") do |val|
        params['hasAutoScale'] = (val.to_s != 'false' && val.to_s != 'off')
      end
      opts.on("--convert-to-managed [on|off]", ['on','off'], "Supports Convert To Managed") do |val|
        params['supportsConvertToManaged'] = (val.to_s != 'false' && val.to_s != 'off')
      end
      opts.on('--workflow ID', String, "Workflow") do |val|
        params['taskSetId'] = val.to_i
      end
      opts.on('--option-types [x,y,z]', Array, "List of Option Type IDs") do |list|
        if list.nil?
          params['optionTypes'] = []
        else
          params['optionTypes'] = list.collect {|it| it.to_s.strip.empty? ? nil : it.to_s.strip }.compact.uniq
        end
      end
      opts.on('--node-types [x,y,z]', Array, "List of Node Type IDs") do |list|
        if list.nil?
          params['containerTypes'] = []
        else
          params['containerTypes'] = list.collect {|it| it.to_s.strip.empty? ? nil : it.to_s.strip }.compact.uniq
        end
      end
      opts.on('--spec-templates [x,y,z]', Array, "List of Spec Templates to include in this layout, comma separated list of names or IDs.") do |list|
        if list.nil?
          params['specTemplates'] = []
        else
          params['specTemplates'] = list.collect {|it| it.to_s.strip.empty? ? nil : it.to_s.strip }.compact.uniq
        end
      end
      opts.on('--tfvar-secret VALUE', String, "Tfvar Secret name, eg. 'tfvars/dev-key'") do |val|
        params['tfvarSecret'] = val == 'null' ? nil : val
      end
      opts.on('--price-sets [LIST]', Array, 'Price set(s), comma separated list of price set IDs') do |list|
        params['priceSets'] = list.collect {|it| it.to_s.strip.empty? || !it.to_i ? nil : it.to_s.strip}.compact.uniq.collect {|it| {'id' => it.to_i}}
      end
      add_perms_options(opts, options, layout_permission_excludes)
      build_standard_update_options(opts, options)
            opts.footer = <<-EOT
Update a layout.
[layout] is required. This is the name or id of a layout.
EOT
    end
    optparse.parse!(args)
    verify_args!(args:args, optparse:optparse, count:1)
    connect(options)
    exit_code, err = 0, nil
    
      layout = find_layout_by_name_or_id(nil, args[0])
      exit 1 if layout.nil?
      payload = nil
      if options[:payload]
        payload = options[:payload]
      else
        params.deep_merge!(options[:options].reject {|k,v| k.is_a?(Symbol) }) if options[:options]
        
        # ENVIRONMENT VARIABLES
        if evars

        else
          # prompt
        end

        # OPTION TYPES
        if params['optionTypes']
          prompt_results = prompt_for_option_types(params, options, @api_client)
          if prompt_results[:success]
            params['optionTypes'] = prompt_results[:data] unless prompt_results[:data].nil?
          else
            return 1
          end
        end

        # NODE TYPES
        if params['containerTypes']
          prompt_results = prompt_for_container_types(params, options, @api_client)
          if prompt_results[:success]
            params['containerTypes'] = prompt_results[:data] unless prompt_results[:data].nil?
          else
            return 1
          end
        end

        # SPEC TEMPLATES
        if params['specTemplates']
          prompt_results = prompt_for_spec_templates(params, options, @api_client)
          if prompt_results[:success]
            params['specTemplates'] = prompt_results[:data] unless prompt_results[:data].nil?
          else
            return 1
          end
        end

        # perms
        if options[:groupAccessAll] != nil || options[:groupAccessList]
          perms = prompt_permissions(options.merge({no_prompt:true}), layout_permission_excludes)
          perms_payload = {}
          perms_payload['resourcePermissions'] = perms['resourcePermissions'] if !perms['resourcePermissions'].empty?
          params.deep_merge!({'permissions' => perms_payload}) if !perms_payload.empty?
        end
        
        params['visibility'] = options[:visibility] if !options[:visibility].nil?

        if params.empty?
          raise_command_error "Specify at least one option to update.\n#{optparse}"
        end

        payload = {'instanceTypeLayout' => params}

      end
      @library_layouts_interface.setopts(options)
      if options[:dry_run]
        print_dry_run @library_layouts_interface.dry.update(nil, layout['id'], payload)
        return
      end
      
      json_response = @library_layouts_interface.update(nil, layout['id'], payload)
      
      if options[:json]
        print JSON.pretty_generate(json_response), "\n"
        return
      end

      print_green_success "Updated layout #{params['name'] || layout['name']}"
      #list([])
    return exit_code, err
  end
update_permissions(args) click to toggle source
# File lib/morpheus/cli/commands/library_layouts_command.rb, line 684
  def update_permissions(args)
    options = {}
    optparse = Morpheus::Cli::OptionParser.new do |opts|
      opts.banner = subcommand_usage( "[layout]")
      add_perms_options(opts, options, layout_permission_excludes)
      build_standard_update_options(opts, options)
      opts.footer = <<-EOT
Update layout permissions.
[layout] is required. This is the name or id of a layout.
EOT
    end
    optparse.parse!(args)
    verify_args!(args:args, optparse:optparse, count:1)
    connect(options)
    exit_code, err = 0, nil
    # if !is_master_account
    #   print_red_alert "Permissions only available for master tenant"
    #   return 1
    # end
    layout = find_layout_by_name_or_id(nil, args[0])
    return 1, "layout not found for #{args[0]}" if layout.nil?
    payload = {}
    if options[:payload]
      payload = options[:payload]
      payload.deep_merge!(parse_passed_options(options))
    else
      payload.deep_merge!(parse_passed_options(options))
      
      perms = prompt_permissions(options.merge({}), layout_permission_excludes)
      perms_payload = {}
      perms_payload['resourcePermissions'] = perms['resourcePermissions'] if !perms['resourcePermissions'].empty?
      payload.deep_merge!({'permissions' => perms_payload}) if !perms_payload.empty?
    end

    @library_layouts_interface.setopts(options)
    if options[:dry_run]
      print_dry_run @library_layouts_interface.dry.update_permissions(layout['id'], payload)
      return
    end
    json_response = @library_layouts_interface.update_permissions(layout['id'], payload)
    render_response(json_response, options, 'instanceTypeLayout') do
      # note: this api does not return 400 when it fails?
      if json_response['success']
        print_green_success "Updated layout permissions"
      else
        print_rest_errors(json_response, options)
        exit_code, err = 3, (json_response['msg'] || "api did not return success:true")
      end
    end
    return exit_code, err
  end

Private Instance Methods

find_layout_by_id(instance_type_id, id, params={}) click to toggle source
# File lib/morpheus/cli/commands/library_layouts_command.rb, line 787
def find_layout_by_id(instance_type_id, id, params={})
  begin
    json_response = @library_layouts_interface.get(instance_type_id, id.to_i, params)
    return json_response['instanceTypeLayout']
  rescue RestClient::Exception => e
    if e.response && e.response.code == 404
      print_rest_exception(e)
      #print_red_alert "Layout not found by id #{id}"
    else
      raise e
    end
  end
end
find_layout_by_name(instance_type_id, name, params={}) click to toggle source
# File lib/morpheus/cli/commands/library_layouts_command.rb, line 801
def find_layout_by_name(instance_type_id, name, params={})
  layouts = @library_layouts_interface.list(instance_type_id, params.merge({name: name.to_s}))['instanceTypeLayouts']
  if layouts.empty?
    print_red_alert "Layout not found by name #{name}"
    return nil
  elsif layouts.size > 1
    print_red_alert "#{layouts.size} layouts found by name #{name}"
    print_layouts_table(layouts, {color: red})
    print_red_alert "Try using ID instead"
    print reset,"\n"
    return nil
  else
    return layouts[0]
  end
end
find_layout_by_name_or_id(instance_type_id, val, params={}) click to toggle source
# File lib/morpheus/cli/commands/library_layouts_command.rb, line 779
def find_layout_by_name_or_id(instance_type_id, val, params={})
  if val.to_s =~ /\A\d{1,}\Z/
    return find_layout_by_id(instance_type_id, val, params)
  else
    return find_layout_by_name(instance_type_id, val, params)
  end
end
format_instance_type_phase(val) click to toggle source
# File lib/morpheus/cli/commands/library_layouts_command.rb, line 842
def format_instance_type_phase(val)
  val.to_s # .capitalize
end
format_layout_technology(layout) click to toggle source
# File lib/morpheus/cli/commands/library_layouts_command.rb, line 834
def format_layout_technology(layout)
  if layout
    layout['provisionType'] ? layout['provisionType']['name'] : ''
  else
    ""
  end
end
layout_permission_excludes() click to toggle source
# File lib/morpheus/cli/commands/library_layouts_command.rb, line 846
def layout_permission_excludes
  ['plans', 'groupDefaults', 'visibility', 'tenants']
end
print_layouts_table(layouts, opts={}) click to toggle source