class Chef::Knife::IonoscloudCompositeServerCreate

Attributes

description[R]
required_options[R]

Public Class Methods

new(args = []) click to toggle source
Calls superclass method
# File lib/chef/knife/ionoscloud_composite_server_create.rb, line 117
def initialize(args = [])
  super(args)
  @description =
  'This creates a new composite server with an attached volume and NIC in a specified virtual data center.'
  @required_options = [
    :datacenter_id, :name, :cores, :ram, :size, :type, :dhcp, :lan, :ionoscloud_username, :ionoscloud_password,
  ]
end

Public Instance Methods

run() click to toggle source
# File lib/chef/knife/ionoscloud_composite_server_create.rb, line 126
def run
  $stdout.sync = true
  handle_extra_config
  validate_required_params(@required_options, config)

  config[:ssh_keys] = config[:ssh_keys].split(',') if config[:ssh_keys] && config[:ssh_keys].instance_of?(String)
  config[:ips] = config[:ips].split(',') if config[:ips] && config[:ips].instance_of?(String)

  print ui.color('Creating composite server...', :magenta).to_s

  volume = Ionoscloud::Volume.new(
    properties: Ionoscloud::VolumeProperties.new({
      name: config[:volume_name],
      size: config[:size],
      bus: config[:bus] || 'VIRTIO',
      image: config[:image],
      image_alias: config[:image_alias],
      ssh_keys: config[:ssh_keys],
      image_password: config[:image_password],
      type: config[:type],
      licence_type: config[:licence_type],
      availability_zone: config[:volume_availability_zone],
    }.compact)
  )

  nic = Ionoscloud::Nic.new(
    properties: Ionoscloud::NicProperties.new({
      name: config[:nic_name],
      ips: config[:ips],
      dhcp: config[:dhcp],
      lan: config[:lan],
      nat: !config[:nat].nil?,
    }.compact)
  )

  server = Ionoscloud::Server.new(
    properties: Ionoscloud::ServerProperties.new({
      name: config[:name],
      cores: config[:cores],
      cpu_family: config[:cpu_family],
      ram: config[:ram],
      availability_zone: config[:availability_zone],
    }.compact),
    entities: Ionoscloud::ServerEntities.new(
      volumes: {
         items: [volume],
      },
      nics: {
        items: [nic],
      },
    ),
  )

  server_api = Ionoscloud::ServerApi.new(api_client)

  server, _, headers = server_api.datacenters_servers_post_with_http_info(config[:datacenter_id], server)

  dot = ui.color('.', :magenta)
  api_client.wait_for { print dot; is_done? get_request_id headers }

  server = server_api.datacenters_servers_find_by_id(config[:datacenter_id], server.id)

  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.cpu_family}"
  puts "#{ui.color('Ram', :cyan)}: #{server.properties.ram}"
  puts "#{ui.color('Availability Zone', :cyan)}: #{server.properties.availability_zone}"
  puts "#{ui.color('Boot Volume', :cyan)}: #{server.properties.boot_volume ? server.properties.boot_volume.id : ''}"
  puts "#{ui.color('Boot CDROM', :cyan)}: #{server.properties.boot_cdrom ? server.properties.boot_cdrom.id : ''}"

  puts 'done'
end