sub load()

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;
}