class Chef::Knife::ProfitbricksCompositeServerCreate

Public Instance Methods

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

  validate_required_params(%i[datacenter_id name cores ram size type dhcp lan], Chef::Config[:knife])

  if !Chef::Config[:knife][:image] && !Chef::Config[:knife][:imagealias]
    ui.error("Either '--image' or '--image-alias' parameter must be provided")
    exit(1)
  end

  if !Chef::Config[:knife][:sshkeys] && !Chef::Config[:knife][:imagepassword]
    ui.error("Either '--image-password' or '--ssh-keys' parameter must be provided")
    exit(1)
  end

  print ui.color('Creating composite server...', :magenta).to_s
  volume_params = {
    name: Chef::Config[:knife][:volumename],
    size: Chef::Config[:knife][:size],
    bus: Chef::Config[:knife][:bus] || 'VIRTIO',
    image: Chef::Config[:knife][:image],
    type: Chef::Config[:knife][:type],
    licenceType: Chef::Config[:knife][:licencetype]
  }

  if Chef::Config[:knife][:image]
    volume_params['image'] = Chef::Config[:knife][:image]
  end

  if Chef::Config[:knife][:imagealias]
    volume_params['imageAlias'] = Chef::Config[:knife][:imagealias]
  end

  if Chef::Config[:knife][:sshkeys]
    volume_params[:sshKeys] = Chef::Config[:knife][:sshkeys]
  end

  if Chef::Config[:knife][:imagepassword]
    volume_params[:imagePassword] = Chef::Config[:knife][:imagepassword]
  end

  if config[:volume_availability_zone]
    volume_params[:availabilityZone] = Chef::Config[:knife][:volume_availability_zone]
  end

  nic_params = {
    name: Chef::Config[:knife][:nicname],
    ips: Chef::Config[:knife][:ips],
    dhcp: Chef::Config[:knife][:dhcp],
    lan: Chef::Config[:knife][:lan]
  }

  nic_params[:nat] = Chef::Config[:knife][:nat] if config[:nat]

  params = {
    name: Chef::Config[:knife][:name],
    cores: Chef::Config[:knife][:cores],
    cpuFamily: Chef::Config[:knife][:cpufamily],
    ram: Chef::Config[:knife][:ram],
    availabilityZone: Chef::Config[:knife][:availabilityzone],
    volumes: [volume_params],
    nics: [nic_params]
  }

  connection

  server = ProfitBricks::Server.create(
    Chef::Config[:knife][:datacenter_id],
    params.compact
  )

  dot = ui.color('.', :magenta)
  server.wait_for(300) { print dot; ready? }

  puts "\n"
  puts "#{ui.color('ID', :cyan)}: #{server.id}"
  puts "#{ui.color('Name', :cyan)}: #{server.properties['name']}"
  puts "#{ui.color('Cores', :cyan)}: #{server.properties['cores']}"
  puts "#{ui.color('CPU Family', :cyan)}: #{server.properties['cpuFamily']}"
  puts "#{ui.color('Ram', :cyan)}: #{server.properties['ram']}"
  puts "#{ui.color('Availability Zone', :cyan)}: #{server.properties['availabilityZone']}"

  puts 'done'
end