class Chef::Knife::VcVappNetworkInternal

Public Instance Methods

run() click to toggle source
# File lib/chef/knife/vapp/vc_vapp_network_internal.rb, line 76
def run
  $stdout.sync = true

  command_arg = @name_args.shift
  vapp_arg = @name_args.shift
  network_arg = @name_args.shift

  unless command_arg =~ /add|delete|edit/
    raise ArgumentError, "Invalid command #{command_arg} supplied. Only add, delete and edit are allowed."
  end

  command = command_arg.to_sym

  config = { :fence_mode => 'isolated' }

  connection.login

  vapp = get_vapp(vapp_arg)

  network = vapp[:networks].select{|n| n[:name] == network_arg }.first

  unless network
    if command != :add
      raise ArgumentError, "Network #{network_arg} not found in vApp, " \
                                "please use `--add` if you want to add new network."
    else
      network = {:name => network_arg}
    end
  end

  unless command == :delete
    fields = [:gateway, :netmask, :dns1, :dns2, :dns_suffix,
              :start_address, :end_address, :is_inherited, :retain_network]

    fields.each do |field|
      config[field] = locate_config_value(field)

      if command == :add && config[field].nil?
        config[field] = ui.ask_question("  #{pretty_symbol(field)}: ")
      end
    end

    parent_network_arg = locate_config_value(:parent_network)
    if parent_network_arg
      ui.msg "Retrieving parent network details"
      parent_network = get_network parent_network_arg
      config[:parent_network] =  { :id => parent_network[:id],
                                  :name => parent_network[:name] }
    end

    if parent_network && config[:fence_mode] != 'natRouted'
      ui.info "Setting a parent network for an internal network requires fence mode natRouted. Fixing it..."
      config[:fence_mode] = 'natRouted'
    end
  end

  case command
    when :add
      ui.msg "Adding #{network[:name]} to vApp..."
      task_id, response = connection.add_internal_network_to_vapp vapp[:id], network, config
      wait_task(connection, task_id)
    when :delete
      ui.msg "Removing #{network[:name]} from vApp..."
      task_id, response = connection.delete_vapp_network vapp[:id], network
      wait_task(connection, task_id)
    when :edit
      ui.msg "vApp network configuration for #{network[:name]}..."
      task_id, response = connection.set_vapp_network_config vapp[:id], network, config
      wait_task(connection, task_id)
  end

  connection.logout
end