class Morpheus::Cli::NetworkServerGroups

Constants

NSXT_AD_GROUP_TYPES
NSXT_CRITERIA_TYPES
NSXT_IP_TYPES
NSXT_MEMBER_TYPES

Protected Instance Methods

load_option_types_for_network_server_group(record_type, parent_record) click to toggle source
# File lib/morpheus/cli/commands/network_server_groups_command.rb, line 35
def load_option_types_for_network_server_group(record_type, parent_record)
  parent_record['type']['groupOptionTypes']
end
network_server_group_add_prompt(record_payload, record_type, parent_record, options) click to toggle source
# File lib/morpheus/cli/commands/network_server_groups_command.rb, line 100
def network_server_group_add_prompt(record_payload, record_type, parent_record, options)
  unless parent_record['type']['code'] != 'nsx-t' or options[:no_prompt]
    nsxt_add_prompt(record_payload, record_type, parent_record, options)
  end
end
network_server_group_column_definitions(options) click to toggle source
# File lib/morpheus/cli/commands/network_server_groups_command.rb, line 81
def network_server_group_column_definitions(options)
  if options[:parent_record]['type']['code'] == 'nsx-t'
    tags_lambda = lambda{|group|
      (group['tags'] || []).collect{|tag|
        "#{tag['name']}#{(tag['value'] || '').length > 0 ? " (scope: #{tag['value']})" : ''}"
      }.join(', ')
    }
  else
    tags_lambda = lambda {|group| group['tags'] ? format_metadata(group['tags']) : '' }
  end
  columns = {
    "ID" => 'id',
    "Name" => 'name',
    "Description" => 'description',
    "Tags" => tags_lambda
  }
  columns
end
network_server_group_field_context() click to toggle source
# File lib/morpheus/cli/commands/network_server_groups_command.rb, line 31
def network_server_group_field_context
  network_server_group_object_key
end
network_server_group_list_column_definitions(options) click to toggle source
# File lib/morpheus/cli/commands/network_server_groups_command.rb, line 39
def network_server_group_list_column_definitions(options)
  if options[:parent_record]['type']['code'] == 'nsx-t'
    members_lambda = lambda do |group|
      members = []
      {
        'Criteria' => NSXT_CRITERIA_TYPES,
        'Members' => NSXT_MEMBER_TYPES,
        'IPS / MACS' => NSXT_IP_TYPES,
        'AD Groups' => NSXT_AD_GROUP_TYPES
      }.each do |label, types|
        if (count = group['members'].select{|member| types.include?(member['type'])}.count) > 0
          members << "#{count} #{label}"
        end
      end
      members.join(', ')
    end
  else
    members_lambda = lambda do |group|
      group['members'].collect{|member| member['type']}.join(', ')
    end
  end

  columns = {
    'ID' => 'id',
    'Name' => 'name',
    'Description' => {:label => 'Description', :max_width => 50, :display_method => lambda {|group| group['description']}},
    'Members' => members_lambda
  }

  if is_master_account
    columns['Visibility'] = lambda {|it| it['visibility'].capitalize}
    columns['Tenants'] = lambda do |it|
      tenants = []
      if it['permissions'] and it['permissions']['tenantPermissions']
        tenants = @accounts_interface.list({:ids => it['permissions']['tenantPermissions']['accounts']})['accounts'].collect{|account| account['name']}
      end
      tenants.join(', ')
    end
  end
  columns
end
network_server_group_list_key() click to toggle source
# File lib/morpheus/cli/commands/network_server_groups_command.rb, line 23
def network_server_group_list_key
  'groups'
end
network_server_group_object_key() click to toggle source
# File lib/morpheus/cli/commands/network_server_groups_command.rb, line 27
def network_server_group_object_key
  'group'
end
nsxt_add_prompt(record_payload, record_type, parent_record, options) click to toggle source
# File lib/morpheus/cli/commands/network_server_groups_command.rb, line 106
def nsxt_add_prompt(record_payload, record_type, parent_record, options)
  # criteria
  criteria = []
  while criteria.count < 5 && Morpheus::Cli::OptionTypes.confirm("Add#{criteria.count == 0 ? '': ' another'} criteria?", {:default => false})
    if true #members.count == 0 or members.last['memberValue'] == 'OR' # Can't have nested follow AND conjunction
      type = Morpheus::Cli::OptionTypes.prompt([{'fieldName' => 'type', 'fieldLabel' => 'Criteria Type', 'type' => 'select', 'selectOptions' => ['Condition', 'Nested Expression'].map{|it| {'name' => it, 'value' => it.sub(' ', '')}}, 'required' => true, 'defaultValue' => 'Condition'}], options[:options])['type']
    end
    prompt_condition = lambda do
      compare_type = Morpheus::Cli::OptionTypes.prompt([{'fieldName' => 'memberType', 'fieldLabel' => 'Criteria Item', 'type' => 'select', 'selectOptions' => ['Virtual Machine', 'Segment Port', 'Segment', 'IP Set'].map{|it| {'name' => it, 'value' => it.sub(' ', '')}}, 'required' => true, 'defaultValue' => 'VirtualMachine'}], options[:options])['memberType']
      compare_key = Morpheus::Cli::OptionTypes.prompt([{'fieldName' => 'key', 'fieldLabel' => "#{compare_type} Field", 'type' => 'select', 'selectOptions' => (compare_type == 'VirtualMachine' ? ['Name', 'Tag', 'OS Name', 'Computer Name'] : ['Tag'] ).map{|it| {'name' => it, 'value' => it.sub(' ', '')}}, 'required' => true, 'defaultValue' => 'Tag'}], options[:options])['key']
      compare_operator = Morpheus::Cli::OptionTypes.prompt([{'fieldName' => 'operator', 'fieldLabel' => "#{compare_key} Operator", 'type' => 'select', 'selectOptions' => (compare_type == 'VirtualMachine' ? ['Equals', 'Contains', 'Starts With', 'Ends With'] : ['Equals']).map{|it| {'name' => it, 'value' => it.sub(' ', '').upcase}}, 'required' => true, 'defaultValue' => 'EQUALS'}], options[:options])['operator']
      compare_value = Morpheus::Cli::OptionTypes.prompt([{'fieldName' => 'value', 'type' => 'text', 'fieldLabel' => "#{compare_key} Value", 'required' => true, 'description' => 'Value to compare.'}], options[:options])['value']
      compare_scope = nil
      if compare_key == 'Tag'
        compare_scope = Morpheus::Cli::OptionTypes.prompt([{'fieldName' => 'scope', 'type' => 'text', 'fieldLabel' => "#{compare_key} Scope", 'required' => false}], options[:options], @api_client, {}, false, true)['scope']
      end
      compare_expr = {key: compare_key, operator: compare_operator, value: compare_value}
      compare_expr.merge!({scope: compare_scope}) if compare_scope
      {'type' => 'Condition', 'memberType' => compare_type, 'memberExpression' => JSON.generate(compare_expr)}
    end

    if criteria.count > 0
      criteria.last['memberValue'] = 'OR'
    end

    if type == 'Condition'
      prev_criteria = criteria.count > 0 ? criteria.last : nil
      criteria << prompt_condition.call
      if prev_criteria and prev_criteria['type'] != 'NestedExpression' and prev_criteria['memberType'] == criteria.last['memberType']
        prev_criteria['memberValue'] = Morpheus::Cli::OptionTypes.prompt([{'fieldName' => 'memberValue', 'fieldLabel' => 'And/Or', 'type' => 'select', 'selectOptions' => ['and', 'or'].map{|it| {'name' => it, 'value' => it.upcase}}, 'required' => true, 'defaultValue' => 'AND', 'description' => 'Conjunction to use between this condition and the previous condition'}], options[:options])['memberValue']
      end
    else
      # just prompt for conditions w/
      nested_members = [prompt_condition.call]
      while nested_members.count < 5 && Morpheus::Cli::OptionTypes.confirm("Add another criteria to nested expression?", {:default => false})
        nested_members.last['memberValue'] = 'AND'
        nested_members << prompt_condition.call
      end
      criteria << {'type' => type, 'members' => nested_members}
    end
  end

  members = []
  while members.count < 500 && Morpheus::Cli::OptionTypes.confirm("Add#{members.count == 0 ? '': ' another'} member?", {:default => false})
    member_type = Morpheus::Cli::OptionTypes.prompt([{'fieldName' => 'memberType', 'fieldLabel' => 'Member Type', 'type' => 'select', 'selectOptions' => ['Group', 'Segment', 'Segment Port', 'Virtual Network Interface', 'Virtual Machine', 'Physical Server'].map{|it| {'name' => it, 'value' => it.gsub(' ', '')}}, 'required' => true, 'defaultValue' => 'Group'}], options[:options])['memberType']
    member_value = Morpheus::Cli::OptionTypes.prompt([{'fieldName' => 'memberValue', 'fieldLabel' => member_type, 'type' => 'select', 'optionSource' => 'nsxtGroupMembers', 'optionSourceType' => 'nsxt', 'required' => true}], options[:options], @api_client, {networkServerId: parent_record['id'], memberType: member_type}, false, true)['memberValue']
    type = ['Group', 'Segment', 'SegmentPort'].include?(member_type) ? 'Path' : 'ExternalID'
    members << {'type' => type, 'memberType' => member_type, 'memberValue' => member_value}
  end

  # ip/mac
  ips = []
  while members.count + ips.count < 500 && Morpheus::Cli::OptionTypes.confirm("Add#{ips.count == 0 ? '': ' another'} IP/MAC address?", {:default => false})
    member_value = Morpheus::Cli::OptionTypes.prompt([{'fieldName' => 'ipAddress', 'type' => 'text', 'fieldLabel' => "IP/MAC Address", 'required' => true, 'description' => 'Enter an IP or MAC address. x.x.x.x'}], options[:options])['ipAddress']
    type = member_value.match(/[a-fA-F0-9]{2}(:[a-fA-F0-9]{2}){5}/) ? 'MACAddress' : 'IPAddress'
    ips << {'type' => type, 'memberValue' => member_value}
  end

  # ad groups
  ad_groups = []
  while members.count + ips.count + ad_groups.count < 500 && Morpheus::Cli::OptionTypes.confirm("Add#{ad_groups.count == 0 ? '': ' another'} AD Group?", {:default => false})
    member_value = Morpheus::Cli::OptionTypes.prompt([{'fieldName' => 'identityGroup', 'type' => 'select', 'optionSource' => 'nsxtIdentityGroups', 'optionSourceType' => 'nsxt', 'required' => true, 'fieldLabel' => "AD Group"}], options[:options], @api_client, {networkServerId: parent_record['id'], memberType: member_type}, false, true)['identityGroup']
    ad_groups << {'type' => 'IdentityGroup', 'memberValue' => member_value}
  end

  record_payload['members'] = criteria + members + ips + ad_groups
  record_payload
end
render_response_details_for_get(record, options) click to toggle source
# File lib/morpheus/cli/commands/network_server_groups_command.rb, line 175
def render_response_details_for_get(record, options)
  if options[:parent_record]['type']['code'] == 'nsx-t'
    members = record['members'].select{|member| NSXT_CRITERIA_TYPES.include?(member['type'])}
    if members.count > 0
      cond_criteria = lambda do |member|
        expr = JSON.parse(member['memberExpression'])
        "#{member['memberType']} #{expr['key']} #{expr['operator']} #{expr['value']}#{expr['scope'].nil? ? '' : " w/ #{expr['scope']} scope"}"
      end
      criteria_parts = []
      members.each_with_index do |member, index|
        if member['type'] == 'NestedExpression'
          criteria_parts << "("
          member['members'].each do |child_member|
            criteria_parts << "  #{cond_criteria.call(child_member)}"
            criteria_parts << "  #{child_member['memberValue']}"
          end
          criteria_parts.pop # remove last conjunction
          criteria_parts << ")"
        else
          criteria_parts << cond_criteria.call(member)
          criteria_parts << member['memberValue']
        end
      end
      criteria_parts.pop if ['AND', 'OR'].include?(criteria_parts.last) # remove last conjunction
      print_h2 "Criteria (#{members.count})", options
      print "#{cyan}#{criteria_parts.join("\n")}\n"
    end

    members = record['members'].select{|member| NSXT_MEMBER_TYPES.include?(member['type'])}
    if members.count > 0
      print_h2 "Members (#{members.count})", options
      print as_pretty_table(members, {'Type' => 'memberType', 'Path/ExternalID' => 'memberValue'}, options)
    end

    members = record['members'].select{|member| NSXT_IP_TYPES.include?(member['type'])}
    if members.count > 0
      print_h2 "IP/MAC Addresses (#{members.count})", options
      print "#{cyan}#{members.collect{|member| "#{member['memberValue']}"}.join("\n")}\n"
    end

    members = record['members'].select{|member| NSXT_AD_GROUP_TYPES.include?(member['type'])}
    if members.count > 0
      print_h2 "AD Groups (#{members.count})", options
      print "#{cyan}#{members.collect{|member| "#{member['memberValue']}"}.join("\n")}\n"
    end
  end
end