in managementnode/lib/VCL/Module/Provisioning/one.pm [113:239]
sub load {
my $self = shift;
if (ref($self) !~ /one/i) {
notify($ERRORS{'CRITICAL'}, 0, "subroutine was called as a function, it must be called as a class method");
return 0;
}
my $reservation_id = $self->data->get_reservation_id();
my $computer_id = $self->data->get_computer_id();
my $image_name = $self->data->get_image_name();
my $eth0_ip = $self->data->get_computer_private_ip_address();
my $image_os_type = $self->data->get_image_os_type();
my $one_network_0 = $self->data->get_vmhost_profile_virtualswitch0();
my $one_network_1 = $self->data->get_vmhost_profile_virtualswitch1();
my $vm_name = $self->data->get_image_prettyname();
my $cpu_count = $self->data->get_image_minprocnumber() || 1;
my $image_arch = $self->data->get_image_architecture();
if ($image_arch ne "x86_64") {$image_arch = "i686";}
my $memory = $self->data->get_image_minram();
my $computer_name = $self->data->get_computer_hostname();
if ($memory < 512) {
$memory = 512;
#$memory = $cpu_count * 2048;
}
my $one_vm_name = "$computer_name ($image_name)";
#delete running VM, if present
notify($ERRORS{'OK'}, 0, "Checking if computer $computer_name already loaded on ONE...");
my $one_computer_id = $self->_one_get_object_id("computer",$computer_name);
if ($one_computer_id) {
$self->_one_delete_vm($one_computer_id);
notify($ERRORS{'OK'}, 0, "Computer $computer_name was running on ONE ... deleted.");
# sleep for 2sec to allow ONE process the request:
sleep 2;
}
# check if there is ONE template already exsist for the image
# and create VM based on the template. If no template create 'manually'
my $one_template_id = $self->_one_get_template_id($image_name);
if ($one_template_id) {
my @template_info = $one{'server'}->call('one.template.info',$one{'auth'},$one_template_id);
if ($template_info[0][0]->value()) {
my $data = XMLin($template_info[0][1]);
my $template;
$template = $data->{TEMPLATE};
$template->{NAME} = $one_vm_name;
$template->{NIC}[0]{IP} = $eth0_ip;
my $one_new_vmid = $self->_one_create_vm(XMLout($template,NoAttr => 1,RootName=>'TEMPLATE',));
if ($one_new_vmid) {
notify($ERRORS{'OK'}, 0, "New VM $template->{NAME} deployed with ID $one_new_vmid using template ID $one_template_id");
insertloadlog($reservation_id, $computer_id, "vmsetupconfig", "defined $computer_name");
insertloadlog($reservation_id, $computer_id, "startvm", "powered on $computer_name");
} else {
notify($ERRORS{'CRITICAL'}, 0, "Could't create requested VM. Abort.");
return 0;
}
} else {
notify($ERRORS{'CRITICAL'}, 0, "Error while making one.template.info call: $template_info[0][1]");
}
} else {
# No template, create VM manually:
my $template = {};
my $one_network_0_id = $self->_one_get_object_id("network",$one_network_0);
my $one_network_1_id = $self->_one_get_object_id("network",$one_network_1);
my $one_image_id = $self->_one_get_object_id("image",$image_name);
my $one_virtio = $self->_one_get_virtio($one_image_id);
my $virtio = 0;
if ($self->_one_get_image_tag_value($image_name,"DEV_PREFIX") eq "vd") {
$virtio = 1;
}
$template->{NAME} = $one_vm_name;
$template->{CPU} = $cpu_count;
$template->{VCPU} = $cpu_count;
$template->{MEMORY} = $memory;
$template->{OS}{ARCH} = $image_arch;
$template->{INPUT}{BUS} = "usb";
$template->{INPUT}{TYPE} = "tablet";
$template->{GRAPHICS}{TYPE} = "VNC";
$template->{GRAPHICS}{LISTEN} = "0.0.0.0";
$template->{REQUIREMENTS} = "CLUSTER_ID=\"100\"";
#$template->{REQUIREMENTS} = "CLUSTER_ID=\"100\" | CLUSTER_ID=\"108\"";
$template->{DISK}[0]{IMAGE_ID} = $one_image_id;
$template->{NIC}[0]{NETWORK_ID} = $one_network_0_id;
$template->{NIC}[0]{IP} = $eth0_ip;
$template->{NIC}[0]{MODEL} = "virtio" if ($virtio);
$template->{NIC}[1]{NETWORK_ID} = $one_network_1_id;
$template->{NIC}[1]{MODEL} = "virtio" if ($virtio);
# Check if SWAP disk needed. Does image have SWAP=<size_MB> attribute?
my $swap_disk = '';
my $swap_size = $self->_one_get_image_tag_value($image_name,"SWAP");
if ($swap_size) {
$template->{DISK}[1]{TYPE} = "swap";
$template->{DISK}[1]{SIZE} = $swap_size;
$template->{DISK}[1]{DEV_PREFIX} = "vd" if ($virtio);
}
# create VM
my $one_new_vmid = $self->_one_create_vm(XMLout($template,NoAttr => 1,RootName=>'TEMPLATE',));
if ($one_new_vmid) {
notify($ERRORS{'OK'}, 0, "New VM $template->{NAME} deployed with ID $one_new_vmid");
insertloadlog($reservation_id, $computer_id, "vmsetupconfig", "defined $computer_name");
insertloadlog($reservation_id, $computer_id, "startvm", "powered on $computer_name");
}
}
# VM is created and loading, execute "post_load"
if ($self->os->can("post_load")) {
if ($self->os->post_load()) {
insertloadlog($reservation_id, $computer_id, "loadimagecomplete", "performed OS post-load tasks for $computer_name");
}
else {
notify($ERRORS{'WARNING'}, 0, "failed to perform OS post-load tasks on $computer_name");
return;
}
}
else {
insertloadlog($reservation_id, $computer_id, "loadimagecomplete", "OS post-load tasks not necessary $computer_name");
}
return 1;
}