Author: dimach
Date: Thu Sep  5 19:01:49 2013
New Revision: 1520386

URL: http://svn.apache.org/r1520386
Log:
VCL-722: Add one.pm module

Added:
    vcl/trunk/managementnode/lib/VCL/Module/Provisioning/one.pm

Added: vcl/trunk/managementnode/lib/VCL/Module/Provisioning/one.pm
URL: 
http://svn.apache.org/viewvc/vcl/trunk/managementnode/lib/VCL/Module/Provisioning/one.pm?rev=1520386&view=auto
==============================================================================
--- vcl/trunk/managementnode/lib/VCL/Module/Provisioning/one.pm (added)
+++ vcl/trunk/managementnode/lib/VCL/Module/Provisioning/one.pm Thu Sep  5 
19:01:49 2013
@@ -0,0 +1,815 @@
+#!/usr/bin/perl -w
+###############################################################################
+# $Id: $ 
+###############################################################################
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+###############################################################################
+
+=head1 NAME
+
+VCL::Provisioning::one - VCL module to support OpenNebula Cloud
+
+=head1 SYNOPSIS
+
+ Needs to be written
+
+=head1 DESCRIPTION
+
+ This module provides VCL support for OpenNebula Cloud
+
+=cut
+
+##############################################################################
+package VCL::Module::Provisioning::one;
+
+# Specify the lib path using FindBin
+use FindBin;
+use lib "$FindBin::Bin/../../..";
+
+# Configure inheritance
+use base qw(VCL::Module::Provisioning);
+
+# Specify the version of this module
+our $VERSION = '2.3.1';
+
+# Specify the version of Perl to use
+use 5.008000;
+
+use strict;
+use warnings;
+use diagnostics;
+use English qw( -no_match_vars );
+
+use VCL::utils;
+use Fcntl qw(:DEFAULT :flock);
+use Frontier::Client;
+use XML::Simple;
+use Data::Dumper;
+
+my %one;
+my $xml;
+
+##############################################################################
+
+
+##############################################################################
+
+=head1 OBJECT METHODS
+
+=cut
+
+#/////////////////////////////////////////////////////////////////////////////
+
+=head2 initialize
+
+ Parameters  :
+ Returns     :
+ Description :
+
+=cut
+
+sub initialize {
+       my $self = shift;
+       unless (ref($self) && $self->isa('VCL::Module')) {
+               notify($ERRORS{'CRITICAL'}, 0, "subroutine was called as a 
function, it must be called as a class method");
+               return;
+       }
+       
+       my $one_username = $self->data->get_vmhost_profile_username();
+       my $one_password = $self->data->get_vmhost_profile_password();
+       my $one_server_url = $self->data->get_vmhost_profile_resource_path();
+       
+       if (defined($one_username) and defined($one_password) and 
defined($one_server_url)) {
+       
+               $one{'server_url'} = $one_server_url;
+               $one{'auth'} = "$one_username:$one_password"; 
+               $one{'server'} = Frontier::Client->new(url => 
$one{'server_url'});
+               $one{'false'} = $one{'server'}->boolean(0);
+               $one{'true'} = $one{'server'}->boolean(1);
+       
+               $xml = XML::Simple->new();
+       
+               notify($ERRORS{'DEBUG'}, 0, "Module ONE initialized with 
following parameters: \n one_server_url -> $one{'server_url'}, 
one_username:one_password -> $one{'auth'}\n");
+       
+               return 1;
+       } else {
+               notify($ERRORS{'CRITICAL'}, 0,"one_username, one_password, 
one_server_url not defined in VM Host profile. Abort.");
+               return 0;
+       }
+}
+
+#/////////////////////////////////////////////////////////////////////////////
+
+=head2 provision
+
+ Parameters  : hash
+ Returns     : 1(success) or 0(failure)
+ Description : loads node with provided image
+
+=cut
+
+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
+       my $one_computer_id = 
$self->one_get_object_id("computer",$computer_name);
+       if ($one_computer_id) {
+               $self->one_delete_vm($one_computer_id);
+       }
+       
+       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 = '';
+       $one_virtio = $self->one_get_virtio($one_image_id);
+       
+       my $one_network = 
'NIC=[NETWORK_ID="'.$one_network_0_id.'",IP="'.$eth0_ip.'"'.$one_virtio.']';
+       
+       if ($self->data->can("get_vNetwork")) {
+               my @vNetwork = $self->data->get_vNetwork();
+               if (@vNetwork) {
+                       # yes, add custom network(s);
+                       notify($ERRORS{'OK'}, 0, "Reservation will be loaded 
with addition Networks:");
+                       foreach (@vNetwork) {
+                               my $one_net_id = 
$self->one_get_object_id("network",'VLAN_ID='.$_);
+                               $one_network = 
$one_network.'NIC=[NETWORK_ID="'.$one_net_id.'"'.$one_virtio.']';
+                               }
+               } else { 
+                       # no custom networks, add eth1 as default public;
+                       $one_network = 
$one_network.'NIC=[NETWORK_ID="'.$one_network_1_id.'"'.$one_virtio.']';
+               }
+       } else {
+               # custom networking is not implemented, add eth1 as default 
public;
+               $one_network = 
$one_network.'NIC=[NETWORK_ID="'.$one_network_1_id.'"'.$one_virtio.']';
+       }
+       
+       # Check if SWAP disk needed, format: 
DISK=[DEV_PREFIX="vd",TYPE="swap",SIZE="4096"]
+       my $swap_disk = '';
+       my $swap_size = $self->get_image_tag_value("SWAP");
+       if (defined($swap_size)) {
+               if ($self->get_image_tag_value("DEV_PREFIX") eq "vd") {
+                       $swap_disk = 
'DISK=[DEV_PREFIX="vd",TYPE="swap",SIZE="'.$swap_size.'"]';
+               } else {
+                       $swap_disk = 'DISK=[TYPE="swap",SIZE="'.$swap_size.'"]';
+               }
+       }
+       
+       my $VM_TEMPLATE = 'OS=[BOOT="hd",ARCH="'.$image_arch.'",ACPI="YES"] 
+               NAME="'.$one_vm_name.'"
+               CPU="'.$cpu_count.'"
+               VCPU="'.$cpu_count.'" 
+               INPUT=[BUS="usb",TYPE="tablet"]
+               MEMORY="'.$memory.'" 
+               GRAPHICS=[TYPE="VNC",LISTEN="0.0.0.0"] 
+               DISK=[IMAGE_ID="'.$one_image_id.'"]'.$swap_disk.$one_network;
+       
+       # create VM
+       my @reply = 
$one{'server'}->call('one.vm.allocate',$one{'auth'},$VM_TEMPLATE,$one{'false'});
+       
+       if ( $reply[0][0]->value() ) {
+               notify($ERRORS{'OK'}, 0, "New VM ".$vm_name." deployed with ID: 
$reply[0][1] using template: $VM_TEMPLATE");
+               insertloadlog($reservation_id, $computer_id, "vmsetupconfig", 
"defined $computer_name");
+               insertloadlog($reservation_id, $computer_id, "startvm", 
"powered on $computer_name");
+       } else {
+               notify($ERRORS{'CRITICAL'}, 0, 
"\n".$VM_TEMPLATE."\n".$reply[0][1]);
+               return 0;
+       }
+       
+
+       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;
+}
+
+#/////////////////////////////////////////////////////////////////////////////
+=head2 one_get_virtio
+
+ Parameters  : imagename
+ Returns     : '' or MODEL="virtio"
+ Description : 
+
+=cut
+
+sub one_get_virtio {
+       my $self = shift;
+       unless (ref($self) && $self->isa('VCL::Module')) {
+               notify($ERRORS{'CRITICAL'}, 0, "subroutine can only be called 
as a VCL::Module module object method");
+               return; 
+       }
+       
+       my $one_image_id = shift;
+       
+       my @reply = 
$one{'server'}->call('one.image.info',$one{'auth'},$one_image_id);
+       
+       if ( $reply[0][0]->value() ) {
+               my $data = $xml->XMLin($reply[0][1]);
+               if ($data->{TEMPLATE}{DEV_PREFIX} eq 'vd' ) {
+                       return ',MODEL="virtio"';
+               }
+       } else {
+               notify($ERRORS{'WARNING'}, 0, "couldn't get image configuration 
for image_id $one_image_id, won't use VIRTIO driver.");
+               return '';
+       }
+       
+       return '';
+}
+#/////////////////////////////////////////////////////////////////////////////
+
+=head2 does_image_exist
+
+ Parameters  : imagename
+ Returns     : 0 or 1
+ Description : scans  our image local image library for requested image
+                                       returns 1 if found or 0 if not
+                                       attempts to scp image files from peer 
management nodes
+
+=cut
+
+sub does_image_exist {
+       
+       my $self = shift;
+       unless (ref($self) && $self->isa('VCL::Module')) {
+               notify($ERRORS{'CRITICAL'}, 0, "subroutine can only be called 
as a VCL::Module module object method");
+               return; 
+       }
+
+       my $image_name = $self->data->get_image_name();
+       if (!$image_name) {
+               notify($ERRORS{'WARNING'}, 0, "unable to determine image name");
+               return;
+       }
+       
+       my $one_image_id = $self->one_get_object_id("image",$image_name);
+       if ($one_image_id) {
+               notify($ERRORS{'DEBUG'}, 0, "Found image $image_name with id 
$one_image_id");
+               return $one_image_id;
+       } 
+
+       notify($ERRORS{'DEBUG'}, 0, "Image $image_name NOT found on ONE");
+       return 0;
+} 
+
+#/////////////////////////////////////////////////////////////////////////////
+
+=head2 one_get_object_id
+
+ Parameters  : $o_type, $o_name
+ Returns     : ONE Object ID (INT)
+ Description : 
+
+=cut
+
+sub one_get_object_id {
+       my $self = shift;
+       unless (ref($self) && $self->isa('VCL::Module')) {
+               notify($ERRORS{'CRITICAL'}, 0, "subroutine was called as a 
function, it must be called as a class method");
+               return 0;
+       }
+       
+       my $o_type = shift;
+       my $o_name = shift;
+       
+       if ($o_type eq "computer") {
+               my @reply = 
$one{server}->call('one.vmpool.info',$one{'auth'},-3,-1,-1,-1);
+               if ( $reply[0][0]->value() ) {
+                       
+                       my $data = $xml->XMLin($reply[0][1]);
+                       if ( (ref($data->{VM})) eq "ARRAY" ){
+                               foreach (@{$data->{VM}}) {
+                               if ($_->{NAME} =~ /$o_name/i) {
+                                       return $_->{ID};
+                               }
+                               }
+                   } else { #HASH, found only one entry
+                               if ($data->{VM}{NAME} =~ /$o_name/i) {
+                               return $data->{VM}{ID};
+                           }
+                       }
+               } else {
+                       notify($ERRORS{'CRITICAL'}, 0, $reply[0][1]);
+                       return 0;
+               }       
+       } elsif ($o_type eq "image") {
+               my @reply = $one{'server'}->call('one.imagepool.info', 
$one{'auth'},-3,-1,-1);
+               if ( $reply[0][0]->value() ) {
+                       
+                       my $rs_data = $xml->XMLin($reply[0][1]);
+                               if ( (ref($rs_data->{IMAGE})) eq "ARRAY" ) {
+                                       foreach (@{$rs_data->{IMAGE}}) {
+                                               if ($_->{NAME} eq $o_name) {
+                                                       return $_->{ID};
+                                               }
+                                       }
+                                       } else { #HASH, only one entry
+                                               if ($rs_data->{IMAGE}{NAME} eq 
$o_name) {
+                                                       return 
$rs_data->{IMAGE}{ID};
+                                               }
+                                       }
+               } else {
+                       notify($ERRORS{'CRITICAL'}, 0, $reply[0][1]);
+                       return 0;
+               }
+       } elsif ($o_type eq "network") {
+               my @reply = 
$one{'server'}->call('one.vnpool.info',$one{'auth'},-1,-1,-1);
+               if ($reply[0][0]->value()) {
+                       my $rs_data = $xml->XMLin($reply[0][1]);
+                       # don't check if ARRAY or HASH since we always have 
more then 1 network
+                       foreach (@{$rs_data->{VNET}}) {
+                               # if $o_name is in VLAN_ID= then lookup by 
VLAN_ID, not NAME
+                               
+                               if ($o_name =~ /^VLAN_ID=/i) {
+                                       my @vlan_id = split('=',$o_name);
+                                       if ($_->{VLAN_ID} == $vlan_id[1]) {
+                                               return $_->{ID};
+                                       }
+                               } else {
+                                       if ($_->{NAME} eq $o_name) {
+                                               return $_->{ID};
+                                       }
+                               }
+                       }
+               } else {
+                       notify($ERRORS{'CRITICAL'},0,$reply[0][1]);
+                       return 0;
+               }
+       } else {
+               notify($ERRORS{'CRITICAL'}, 0, "$o_type is UNKNOWN type");
+               return 0;
+       } 
+       
+       return 0;       
+} 
+
+#/////////////////////////////////////////////////////////////////////////////
+
+=head2 one_delete_vm
+
+ Parameters  : $vmid
+ Returns     : 
+ Description : one.vm.action
+
+=cut
+
+sub one_delete_vm {
+       my $self = shift;
+       unless (ref($self) && $self->isa('VCL::Module')) {
+               notify($ERRORS{'CRITICAL'}, 0, "subroutine was called as a 
function, it must be called as a class method");
+               return;
+       }
+       my $vmid = shift;
+       my @reply;
+       
+       @reply = $one{'server'}->call('one.vm.action', 
$one{'auth'},'delete',$vmid);
+       if ( $reply[0][0]->value() ) {
+               notify($ERRORS{'OK'}, 0, "ONE VM $vmid deleted");
+       } else {
+               notify($ERRORS{'CRITICAL'}, 0, $reply[0][1]);
+       }
+       
+} 
+
+
+#/////////////////////////////////////////////////////////////////////////////
+
+=head2 capture
+
+ Parameters  : 
+ Returns     : 
+ Description : 
+
+=cut
+
+sub capture {
+       my $self = shift;
+       unless (ref($self) && $self->isa('VCL::Module')) {
+               notify($ERRORS{'CRITICAL'}, 0, "subroutine was called as a 
function, it must be called as a class method");
+               return;
+       }
+       
+       my $image_name = $self->data->get_image_name();
+       
+       my $image_id = $self->data->get_image_id();
+       my $imagerevision_id = $self->data->get_imagerevision_id();
+       my $image_type = $self->data->get_imagetype_name();
+       my $computer_name = $self->data->get_computer_hostname();
+       my $one_new_image_id = 0;
+       
+       $self->data->set_imagemeta_sysprep(0);
+       
+       notify($ERRORS{'OK'}, 0, "ONE module starting image capture.");
+       
+       my $vmid = $self->one_get_object_id("computer",$computer_name);
+       if ($vmid) {
+               my @savedisk = $one{'server'}->call('one.vm.savedisk', 
$one{'auth'},$vmid,0,$image_name,'OS',$one{'false'});
+               if ( $savedisk[0][0]->value() ) {
+                       notify($ERRORS{'OK'}, 0, "VM $vmid will be captured as 
$image_name");
+                       
+               } else {
+                       notify($ERRORS{'CRITICAL'}, 0, $savedisk[0][1]);
+                       return;
+               }
+       } else {
+               notify($ERRORS{'CRITICAL'}, 0, "Couldn't find vmid for 
$computer_name. Abort.");
+               return 0;
+       }
+       # check for new image to be READY (1)
+
+       # Call the OS module's pre_capture() subroutine, this will shutdown the 
VM at the end
+       if ($self->os->can("pre_capture")) {
+               if (!$self->os->pre_capture({end_state => 'off'})) {
+                       notify($ERRORS{'CRITICAL'}, 0, "failed to complete OS 
module's pre_capture tasks");
+                       return;
+               } else {
+                       notify($ERRORS{'OK'}, 0, "OS's pre_capture complited 
OK.");
+               }
+       } else {
+               notify($ERRORS{'CRITICAL'}, 0, "OS module doesn't implement 
pre_capture(). Abort.");
+               return;
+       }
+
+       my $attempt = 0;
+       my $sleep = 15;
+       while (1) {
+               $attempt++;
+               $one_new_image_id = 
$self->one_get_object_id("image",$image_name);
+               last if ($one_new_image_id);
+               if ($attempt > 20) {
+                       notify($ERRORS{'CRITICAL'}, 0, "ONE could not locate 
new disk id for $image_name");
+                       last;
+               }
+               sleep $sleep;
+       }
+       
+       $attempt = 0;
+       my $total_attempts = 120;
+       while (1) {
+               $attempt++;
+               notify($ERRORS{'OK'}, 0, "check status for new image id 
$one_new_image_id, attempt $attempt / $total_attempts");
+               my $one_image_state = 
$self->one_get_image_state($one_new_image_id);
+               if ($one_image_state == 4) {
+                       notify($ERRORS{'OK'}, 0, "disk save in pregress, image 
id $one_new_image_id is LOCKED");
+               }
+               if ($one_image_state == 5) {
+                       notify($ERRORS{'CRITICAL'}, 0, "disk save failed, image 
id $one_new_image_id is ERROR");
+                       return 0;
+               }
+               if ($one_image_state == 1) {
+                       notify($ERRORS{'OK'}, 0, "disk save OK, image id 
$one_new_image_id is READY");
+                       return 1;
+               }
+               if ( $attempt > $total_attempts ) {
+                       notify($ERRORS{'CRITICAL'}, 0, "disk save failed, image 
id $one_new_image_id is not READY after $total_attempts attempts");
+                       return 0;
+               }       
+               sleep $sleep;
+       }
+       
+       return 0;
+       
+}
+
+sub one_get_image_state {
+       my $self = shift;
+       unless (ref($self) && $self->isa('VCL::Module')) {
+               notify($ERRORS{'CRITICAL'}, 0, "subroutine was called as a 
function, it must be called as a class method");
+               return;
+       }
+       
+       my $image_id = shift;
+       
+       my @status = 
$one{'server'}->call('one.image.info',$one{'auth'},$image_id);
+       if ( $status[0][0]->value() ) {
+               my $data = $xml->XMLin($status[0][1]);
+               return $data->{STATE};
+       } else {
+               notify($ERRORS{'CRITICAL'}, 0, $status[0][1]);
+       }
+       
+}
+
+=head2 opennebula
+ Description : returns 1. Yes, it's opennebula module.
+=cut
+sub opennebula {
+       return 1;
+}
+
+=head2 power_off
+
+ Parameters  : 
+ Returns     : 
+ Description : send 'shutdown' to VM via controller.
+                               * need to add check if VM is OFF. Sometimes VM 
won't power off *
+
+=cut
+
+sub power_off {
+       my $self = shift;
+       unless (ref($self) && $self->isa('VCL::Module')) {
+               notify($ERRORS{'CRITICAL'}, 0, "subroutine was called as a 
function, it must be called as a class method");
+               return;
+       }
+       
+       my $computer_name = $self->data->get_computer_hostname();
+       my $vmid = $self->one_get_object_id("computer",$computer_name);
+       my @poweroff = $one{'server'}->call('one.vm.action', 
$one{'auth'},'shutdown',$vmid);
+       
+       if ( $poweroff[0][0]->value() ) {
+               notify($ERRORS{'OK'}, 0, "Sent shutdown signal to VM $vmid");
+               return 1;
+       } else {
+               notify($ERRORS{'CRITICAL'}, 0, $poweroff[0][1]);
+               return 0;
+       }
+       
+} ## end sub power_off
+
+=head2 power_reset
+=cut
+
+sub power_reset() {
+       my $self = shift;
+       unless (ref($self) && $self->isa('VCL::Module')) {
+               notify($ERRORS{'CRITICAL'}, 0, "subroutine was called as a 
function, it must be called as a class method");
+               return;
+       }
+       
+       my $computer_name = $self->data->get_computer_hostname();
+       my $vmid = $self->one_get_object_id("computer",$computer_name);
+       my @poweroff = $one{'server'}->call('one.vm.action', 
$one{'auth'},'reboot',$vmid);
+       
+       if ( $poweroff[0][0]->value() ) {
+               notify($ERRORS{'OK'}, 0, "Sent reboot signal to VM $vmid");
+               return 1;
+       } else {
+               notify($ERRORS{'CRITICAL'}, 0, $poweroff[0][1]);
+               return 0;
+       }
+}
+
+#/////////////////////////////////////////////////////////////////////////////
+
+=head2 one_wait_for_vm_status
+
+ Parameters  : 
+ Returns     : 
+ Description : 
+
+=cut
+
+sub one_wait_for_vm_state {
+       my $self = shift;
+       unless (ref($self) && $self->isa('VCL::Module')) {
+               notify($ERRORS{'CRITICAL'}, 0, "subroutine was called as a 
function, it must be called as a class method");
+               return;
+       }
+       
+       my $vmid = shift;
+       my $state = shift;
+       my $wait = shift;
+       my $sleep = 15;
+       my $num_state = 0;
+       
+       # 6 - POWEROFF
+       
+       $num_state = 6 if ($state eq "SHUTDOWN");
+       
+       
+       if (!$num_state) {
+               notify($ERRORS{'CRITICAL'}, 0, "Unknown vm_state: $state 
requested");
+               return 0;
+       }
+       
+       while (1) {
+               notify($ERRORS{'OK'}, 0, "Check state of VM $vmid ...");
+               my $ttime;
+               my $one_vm_state = $self->one_get_vm_state($vmid);
+               if ( $self->one_get_vm_state($vmid) == $num_state ) {
+                       notify($ERRORS{'OK'}, 0, "VM $vmid is in $state state");
+                       return 1;
+               } else {
+                       notify($ERRORS{'OK'}, 0, "VM $vmid is NOT in $state 
state. Waiting $sleep sec...");
+                       sleep $sleep;
+                       $ttime = $ttime + $sleep;
+                       if ($ttime >= $wait) {
+                               notify($ERRORS{'CRITICAL'}, 0, "VM $vmid is 
still NOT in $state state after $wait sec, abort");
+                               last;
+                       }
+               }
+       }
+       
+       return 0;
+       
+} ## end sub one_wait_for_vm_status
+
+sub one_get_vm_state {
+       my $self = shift;
+       unless (ref($self) && $self->isa('VCL::Module')) {
+               notify($ERRORS{'CRITICAL'}, 0, "subroutine was called as a 
function, it must be called as a class method");
+               return;
+       }
+       # one.vm.info
+       my $vmid = shift;
+       
+       my @result = $one{'server'}->call('one.vm.info', $one{'auth'},$vmid);
+       if ( $result[0][0]->value() ) {
+               my $data = $xml->XMLin($result[0][1]);
+               return $data->{STATE}; 
+       } else {
+               notify($ERRORS{'CRITICAL'}, 0, $result[0][1]);
+               return 0;
+       }
+}
+
+#/////////////////////////////////////////////////////////////////////////////
+
+=head2 power_status
+
+ Parameters  : $domain_name (optional)
+ Returns     : string
+ Description : Determines the power state of the domain. A string is returned
+               containing one of the following values:
+                  * 'on'
+                  * 'off'
+                  * 'suspended'
+=cut
+
+sub power_status {
+       my $self = shift;
+       unless (ref($self) && $self->isa('VCL::Module')) {
+               notify($ERRORS{'CRITICAL'}, 0, "subroutine was called as a 
function, it must be called as a class method");
+               return;
+       }
+       
+       my $computer_name = $self->data->get_computer_hostname();
+       my $vmid = $self->one_get_object_id("computer",$computer_name);
+       
+       my @result = $one{'server'}->call('one.vm.info', $one{'auth'},$vmid);
+       if ( $result[0][0]->value() ) {
+               my $data = $xml->XMLin($result[0][1]);
+               if ($data->{STATE} == 3) {
+                       if ($data->{LCM_STATE} == 3) {
+                               notify($ERRORS{'OK'}, 0, "vm $vmid is RUNNING, 
STATE=3 and LCM_STATE=3");
+                               return 'on';
+                       }
+               }
+       } else {
+               notify($ERRORS{'CRITICAL'}, 0, $result[0][1]);
+               return 0;
+       }
+
+       return 'off';
+       
+} ## end sub power_status
+
+=head2 power_on
+
+ Parameters  : $domain_name (optional)
+ Returns     : string
+ Description : powers on VM
+=cut
+
+sub power_on {
+       my $self = shift;
+       unless (ref($self) && $self->isa('VCL::Module')) {
+               notify($ERRORS{'CRITICAL'}, 0, "subroutine was called as a 
function, it must be called as a class method");
+               return;
+       }
+       my $computer_name = $self->data->get_computer_hostname();
+       my $vmid = $self->one_get_object_id("computer",$computer_name);
+       #later
+       return 1;
+       
+} ## end sub power_on
+#/////////////////////////////////////////////////////////////////////////////
+
+=head2 new
+
+ Parameters  : 
+ Returns     : 
+ Description : 
+=cut
+
+
+sub get_image_size {
+       my $self = shift;
+       unless (ref($self) && $self->isa('VCL::Module')) {
+               notify($ERRORS{'CRITICAL'}, 0, "subroutine was called as a 
function, it must be called as a class method");
+               return;
+       }
+       
+       return $self->get_image_tag_value("SIZE");
+#      
+#      my $image_name = $self->data->get_image_name();
+#      
+#      my $imid = $self->one_get_object_id("image",$image_name);
+#      my @result = $one{server}->call('one.image.info',$one{'auth'},$imid);
+#      if ( $result[0][0]->value() ) {
+#              my $data = $xml->XMLin($result[0][1]);
+#              return $data->{SIZE}; 
+#      } else {
+#              notify($ERRORS{'CRITICAL'}, 0, $result[0][1]);
+#              return 0;
+#      }
+}
+
+sub get_image_tag_value {
+       my $self = shift;
+       unless (ref($self) && $self->isa('VCL::Module')) {
+               notify($ERRORS{'CRITICAL'}, 0, "subroutine was called as a 
function, it must be called as a class method");
+               return;
+       }
+       
+       my $tag = shift;
+       
+       my $image_name = $self->data->get_image_name();
+       
+       my $imid = $self->one_get_object_id("image",$image_name);
+       my @result = $one{server}->call('one.image.info',$one{'auth'},$imid);
+       if ( $result[0][0]->value() ) {
+               my $data = $xml->XMLin($result[0][1]);
+               
+               if ($tag eq 'SIZE') {
+                       if (defined($data->{$tag})) {
+                               return $data->{$tag};
+                       } else {
+                               return;
+                       }
+               }
+               
+               if ($tag eq 'SWAP') {
+                       if (defined($data->{TEMPLATE}{$tag})) {
+                               return $data->{TEMPLATE}{$tag};
+                       } else {
+                               return;
+                       }
+               }
+               
+               if ($tag eq 'DEV_PREFIX') {
+                       if (defined($data->{TEMPLATE}{$tag})) {
+                               return $data->{TEMPLATE}{$tag};
+                       } else {
+                               return;
+                       }
+               }
+               
+       } else {
+               notify($ERRORS{'CRITICAL'}, 0, $result[0][1]);
+               return 0;
+       }
+       notify($ERRORS{'CRITICAL'},0,"requested tag = $tag, don't know how to 
get it...");
+       return 0;
+}
+
+
+1;
+__END__
+


Reply via email to