You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@vcl.apache.org by yo...@apache.org on 2014/07/09 01:21:22 UTC
svn commit: r1608972 -
/vcl/trunk/managementnode/lib/VCL/Module/Provisioning/openstack.pm
Author: yoh
Date: Tue Jul 8 23:21:21 2014
New Revision: 1608972
URL: http://svn.apache.org/r1608972
Log:
Replaced CLIs (novaclient) with OpenStack Compute APIs v2.
Use LWP::UserAgent to dispatch web requests.
Modified:
vcl/trunk/managementnode/lib/VCL/Module/Provisioning/openstack.pm
Modified: vcl/trunk/managementnode/lib/VCL/Module/Provisioning/openstack.pm
URL: http://svn.apache.org/viewvc/vcl/trunk/managementnode/lib/VCL/Module/Provisioning/openstack.pm?rev=1608972&r1=1608971&r2=1608972&view=diff
==============================================================================
--- vcl/trunk/managementnode/lib/VCL/Module/Provisioning/openstack.pm (original)
+++ vcl/trunk/managementnode/lib/VCL/Module/Provisioning/openstack.pm Tue Jul 8 23:21:21 2014
@@ -20,7 +20,7 @@
=head1 NAME
-VCL::Provisioning::openstack - VCL module to support the Openstack provisioning engine
+VCL::Provisioning::openstack - VCL module to support the Openstack provisioning engine with REST APIs v2
=head1 SYNOPSIS
@@ -60,7 +60,8 @@ use Fcntl qw(:DEFAULT :flock);
use File::Temp qw( tempfile );
use List::Util qw( max );
use VCL::utils;
-use List::BinarySearch qw(binsearch_pos);
+use JSON qw(from_json to_json);
+use LWP::UserAgent;
#/////////////////////////////////////////////////////////////////////////////
@@ -74,20 +75,19 @@ use List::BinarySearch qw(binsearch_pos)
sub initialize {
my $self = shift;
- notify($ERRORS{'DEBUG'}, 0, "OpenStack module initialized");
+ notify($ERRORS{'DEBUG'}, 0, "OpenStack module initialized");
- if($self->_set_openstack_user_conf) {
- notify($ERRORS{'OK'}, 0, "Success to OpenStack user configuration");
+ if($self->_set_openstack_user_conf()) {
+ notify($ERRORS{'OK'}, 0, "Success to OpenStack user configuration");
}
else {
- notify($ERRORS{'CRITICAL'}, 0, "Failure to Openstack user configuration");
+ notify($ERRORS{'CRITICAL'}, 0, "Failure to Openstack user configuration");
return 0;
}
- return 1;
+ return 1;
} ## end sub initialize
-
#/////////////////////////////////////////////////////////////////////////////
=head2 provision
@@ -99,41 +99,39 @@ sub initialize {
=cut
sub load {
- my $self = shift;
- if (ref($self) !~ /openstack/i) {
- notify($ERRORS{'CRITICAL'}, 0, "subroutine was called as a function, it must be called as a class method");
- return;
- }
-
- my $reservation_id = $self->data->get_reservation_id() || return;
- my $computer_id = $self->data->get_computer_id() || return;
- my $computer_name = $self->data->get_computer_short_name() || return;
- my $image_name = $self->data->get_image_name() || return;
- my $vmhost_name = $self->data->get_vmhost_short_name() || return;
-
- insertloadlog($reservation_id, $computer_id, "doesimageexists", "image exists $image_name");
-
- insertloadlog($reservation_id, $computer_id, "startload", "$computer_name $image_name");
-
- # Remove existing VMs which were created for the reservation computer
- if (!$self->_terminate_instances) {
- notify($ERRORS{'WARNING'}, 0, "failed to remove existing VMs created for computer $computer_name on VM host: $vmhost_name");
- return;
- }
+ my $self = shift;
+ if (ref($self) !~ /openstack/i) {
+ notify($ERRORS{'CRITICAL'}, 0, "subroutine was called as a function, it must be called as a class method");
+ return;
+ }
+
+ my $reservation_id = $self->data->get_reservation_id() || return;
+ my $computer_id = $self->data->get_computer_id() || return;
+ my $computer_name = $self->data->get_computer_short_name() || return;
+ my $image_name = $self->data->get_image_name() || return;
+ my $vmhost_name = $self->data->get_vmhost_short_name() || return;
+
+ insertloadlog($reservation_id, $computer_id, "doesimageexists", "image exists $image_name");
+ insertloadlog($reservation_id, $computer_id, "startload", "$computer_name $image_name");
+
+ # Remove existing VMs which were created for the reservation computer
+ if (!$self->_terminate_instances()) {
+ notify($ERRORS{'WARNING'}, 0, " No instance or failed to remove existing VMs");
+ }
# Create new instance
- if (!$self->_run_instances) {
- notify($ERRORS{'WARNING'}, 0, "failed to create VMs for computer $computer_name on VM host: $vmhost_name");
- return;
- }
- my $instance_id = $self->_get_instance_id;
- if (!$instance_id) {
- notify($ERRORS{'WARNING'}, 0, "failed to get the instance id for $computer_name");
- return;
+ if (!$self->_run_instances()) {
+ notify($ERRORS{'WARNING'}, 0, "failed to create VMs for computer $computer_name on VM host: $vmhost_name");
+ return;
+ }
+ my $instance_id = $self->_get_instance_id();
+ if (!$instance_id) {
+ notify($ERRORS{'WARNING'}, 0, "failed to get the instance id for $computer_name");
+ return;
}
# Update the private ip of the instance in /etc/hosts file
- if($self->_update_private_ip($instance_id))
+ if ($self->_update_private_ip($instance_id))
{
notify($ERRORS{'OK'}, 0, "Update the private ip of instance $instance_id is succeeded\n");
}
@@ -144,9 +142,9 @@ sub load {
}
- # Instances have the ip instantly when it use FlatNetworkManager
+ # An instance has an ip instantly when it uses FlatNetworkManager
# Need to wait for copying images from repository or cache to instance directory
- # 15G for 3 to 5 minutes (depends on systems)
+ # 15G for 3 to 5 minutes (depends on network and systems)
#sleep 300;
sleep 10;
@@ -180,58 +178,60 @@ sub load {
=cut
sub capture {
- notify($ERRORS{'DEBUG'}, 0, "**********************************************************");
- notify($ERRORS{'OK'}, 0, "Entering Openstack Capture routine");
- my $self = shift;
-
- if (ref($self) !~ /openstack/i) {
- notify($ERRORS{'CRITICAL'}, 0, "subroutine was called as a function, it must be called as a class method");
- return 0;
- }
+ my $self = shift;
- my $image_name = $self->data->get_image_name();
- my $computer_name = $self->data->get_computer_short_name;
+ if (ref($self) !~ /openstack/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() || return;
+ my $computer_id = $self->data->get_computer_id() || return;
+ my $image_name = $self->data->get_image_name() || return;
+ my $computer_name = $self->data->get_computer_short_name() || return;
my $instance_id;
+ insertloadlog($reservation_id, $computer_id, "startcapture", "$computer_name $image_name");
- if(_pingnode($computer_name))
- {
- $instance_id = $self->_get_instance_id;
+ if (_pingnode($computer_name))
+ {
+ $instance_id = $self->_get_instance_id();
notify($ERRORS{'OK'}, 0, "instance id: $instance_id is done");
- if(!$instance_id)
+ if (!$instance_id)
{
notify($ERRORS{'DEBUG'}, 0, "unable to get instance id for $computer_name");
return 0;
}
- }
+ }
else {
notify($ERRORS{'DEBUG'}, 0, "unable to ping to $computer_name");
return 0;
}
- if($self->_prepare_capture)
+ if ($self->_prepare_capture())
{
notify($ERRORS{'OK'}, 0, "Prepare_Capture for $computer_name is done");
}
my $new_image_name = $self->_image_create($instance_id);
- if($new_image_name)
+ if(defined($new_image_name))
{
notify($ERRORS{'OK'}, 0, "Create Image for $computer_name is done");
}
if($self->_insert_openstack_image_name($new_image_name))
{
- notify($ERRORS{'OK'}, 0, "Successfully insert image name");
- }
+ notify($ERRORS{'OK'}, 0, "Successfully insert image name");
+ }
- if($self->_wait_for_copying_image($instance_id))
+ if($self->_wait_for_copying_image($new_image_name))
{
notify($ERRORS{'OK'}, 0, "Wait for copying $new_image_name is succeeded\n");
}
- return 1;
+ return 1;
} ## end sub capture
+
#/////////////////////////////////////////////////////////////////////////
=head2 node_status
@@ -239,7 +239,7 @@ sub capture {
Parameters : $computer_id or $hash->{computer}{id} (optional)
Returns : string -- 'READY', 'POST_LOAD', or 'RELOAD'
Description : Checks the status of a VM. 'READY' is returned if the VM is
- accessible via SSH, and the OS module's post-load tasks have
+ accessible via SSH, and the OS module's post-load tasks have
run. 'POST_LOAD' is returned if the VM only needs to have
the OS module's post-load tasks run before it is ready.
'RELOAD' is returned otherwise.
@@ -249,139 +249,136 @@ sub capture {
sub node_status {
my $self;
- # Get the argument
- my $argument = shift;
+ # Get the argument
+ my $argument = shift;
- # Check if this subroutine was called an an object method or an argument was passed
- if (ref($argument) =~ /VCL::Module/i) {
- $self = $argument;
- }
- elsif (!ref($argument) || ref($argument) eq 'HASH') {
- # An argument was passed, check its type and determine the computer ID
- my $computer_id;
- if (ref($argument)) {
- # Hash reference was passed
- $computer_id = $argument->{id};
- }
- elsif ($argument =~ /^\d+$/) {
- # Computer ID was passed
- $computer_id = $argument;
- }
- else {
- # Computer name was passed
- ($computer_id) = get_computer_ids($argument);
- }
-
- if ($computer_id) {
- notify($ERRORS{'DEBUG'}, 0, "computer ID: $computer_id");
- }
-
- else {
- notify($ERRORS{'WARNING'}, 0, "unable to determine computer ID from argument:\n" . format_data($argument));
- return;
- }
-
- # Create a DataStructure object containing data for the computer specified as the argument
- my $data;
- eval {
- $data= new VCL::DataStructure({computer_identifier => $computer_id});
- };
- if ($EVAL_ERROR) {
- notify($ERRORS{'WARNING'}, 0, "failed to create DataStructure object for computer ID: $computer_id, error: $EVAL_ERROR");
- return;
- }
- elsif (!$data) {
- notify($ERRORS{'WARNING'}, 0, "failed to create DataStructure object for computer ID: $computer_id, DataStructure object is not defined");
- return;
- }
- else {
- notify($ERRORS{'DEBUG'}, 0, "created DataStructure object for computer ID: $computer_id");
- }
-
- # Create a VMware object
- my $object_type = 'VCL::Module::Provisioning::openstack';
- if ($self = ($object_type)->new({data_structure => $data})) {
- notify($ERRORS{'DEBUG'}, 0, "created $object_type object to check the status of computer ID: $computer_id");
- }
- else {
- notify($ERRORS{'WARNING'}, 0, "failed to create $object_type object to check the status of computer ID: $computer_id");
- return;
- }
-
- # Create an OS object for the VMware object to access
- if (!$self->create_os_object()) {
- notify($ERRORS{'WARNING'}, 0, "failed to create OS object");
- return;
- }
- }
-
- my $reservation_id = $self->data->get_reservation_id();
- my $computer_name = $self->data->get_computer_node_name();
- my $image_name = $self->data->get_image_name();
- my $request_forimaging = $self->data->get_request_forimaging();
- my $imagerevision_id = $self->data->get_imagerevision_id();
+ # Check if this subroutine was called an an object method or an argument was passed
+ if (ref($argument) =~ /VCL::Module/i) {
+ $self = $argument;
+ }
+ elsif (!ref($argument) || ref($argument) eq 'HASH') {
+ # An argument was passed, check its type and determine the computer ID
+ my $computer_id;
+ if (ref($argument)) {
+ # Hash reference was passed
+ $computer_id = $argument->{id};
+ }
+ elsif ($argument =~ /^\d+$/) {
+ # Computer ID was passed
+ $computer_id = $argument;
+ }
+ else {
+ # Computer name was passed
+ ($computer_id) = get_computer_ids($argument);
+ }
+
+ if ($computer_id) {
+ notify($ERRORS{'DEBUG'}, 0, "computer ID: $computer_id");
+ }
- notify($ERRORS{'DEBUG'}, 0, "attempting to check the status of computer $computer_name, image: $image_name");
+ else {
+ notify($ERRORS{'WARNING'}, 0, "unable to determine computer ID from argument:\n" . format_data($argument));
+ return;
+ }
- # Create a hash reference and populate it with the default values
- my $status;
- $status->{currentimage} = '';
- $status->{ssh} = 0;
- $status->{image_match} = 0;
- $status->{status} = 'RELOAD';
-
- # Check if node is pingable and retrieve the power status if the reservation ID is 0
- # The reservation ID will be 0 is this subroutine was not called as an object method, but with a computer ID argument
- # The reservation ID will be 0 when called from healthcheck.pm
- # The reservation ID will be > 0 if called from a normal VCL reservation
- # Skip the ping and power status checks for a normal reservation to speed things up
- if (!$reservation_id) {
- if (_pingnode($computer_name)) {
- notify($ERRORS{'DEBUG'}, 0, "VM $computer_name is pingable");
- $status->{ping} = 1;
- }
- else {
- notify($ERRORS{'DEBUG'}, 0, "VM $computer_name is not pingable");
- $status->{ping} = 0;
- }
+ # Create a DataStructure object containing data for the computer specified as the argument
+ my $data;
+ eval {
+ $data= new VCL::DataStructure({computer_identifier => $computer_id});
+ };
+ if ($EVAL_ERROR) {
+ notify($ERRORS{'WARNING'}, 0, "failed to create DataStructure object for computer ID: $computer_id, error: $EVAL_ERROR");
+ return;
+ }
+ elsif (!$data) {
+ notify($ERRORS{'WARNING'}, 0, "failed to create DataStructure object for computer ID: $computer_id, DataStructure object is not defined");
+ return;
+ }
+ else {
+ notify($ERRORS{'DEBUG'}, 0, "created DataStructure object for computer ID: $computer_id");
+ }
- }
+ # Create a VMware object
+ my $object_type = 'VCL::Module::Provisioning::openstack';
+ if ($self = ($object_type)->new({data_structure => $data})) {
+ notify($ERRORS{'DEBUG'}, 0, "created $object_type object to check the status of computer ID: $computer_id");
+ }
+ else {
+ notify($ERRORS{'WARNING'}, 0, "failed to create $object_type object to check the status of computer ID: $computer_id");
+ return;
+ }
+
+ # Create an OS object for the VMware object to access
+ if (!$self->create_os_object()) {
+ notify($ERRORS{'WARNING'}, 0, "failed to create OS object");
+ return;
+ }
+ }
+
+ my $reservation_id = $self->data->get_reservation_id();
+ my $computer_name = $self->data->get_computer_node_name();
+ my $image_name = $self->data->get_image_name();
+ my $imagerevision_id = $self->data->get_imagerevision_id();
+
+ notify($ERRORS{'DEBUG'}, 0, "attempting to check the status of computer $computer_name, image: $image_name");
+
+ # Create a hash reference and populate it with the default values
+ my $status;
+ $status->{currentimage} = '';
+ $status->{ssh} = 0;
+ $status->{image_match} = 0;
+ $status->{status} = 'RELOAD';
+
+ # Check if node is pingable and retrieve the power status if the reservation ID is 0
+ # The reservation ID will be 0 is this subroutine was not called as an object method, but with a computer ID argument
+ # The reservation ID will be 0 when called from healthcheck.pm
+ # The reservation ID will be > 0 if called from a normal VCL reservation
+ # Skip the ping and power status checks for a normal reservation to speed things up
+ if (!$reservation_id) {
+ if (_pingnode($computer_name)) {
+ notify($ERRORS{'DEBUG'}, 0, "VM $computer_name is pingable");
+ $status->{ping} = 1;
+ }
+ else {
+ notify($ERRORS{'DEBUG'}, 0, "VM $computer_name is not pingable");
+ $status->{ping} = 0;
+ }
+ }
notify($ERRORS{'DEBUG'}, 0, "Trying to ssh...");
- # Check if SSH is available
- if ($self->os->is_ssh_responding()) {
- notify($ERRORS{'DEBUG'}, 0, "VM $computer_name is responding to SSH");
- $status->{ssh} = 1;
- }
- else {
- notify($ERRORS{'OK'}, 0, "VM $computer_name is not responding to SSH, returning 'RELOAD'");
- $status->{status} = 'RELOAD';
- $status->{ssh} = 0;
-
- # Skip remaining checks if SSH isn't available
- return $status;
- }
+ # Check if SSH is available
+ if ($self->os->is_ssh_responding()) {
+ notify($ERRORS{'DEBUG'}, 0, "VM $computer_name is responding to SSH");
+ $status->{ssh} = 1;
+ }
+ else {
+ notify($ERRORS{'OK'}, 0, "VM $computer_name is not responding to SSH, returning 'RELOAD'");
+ $status->{status} = 'RELOAD';
+ $status->{ssh} = 0;
+
+ # Skip remaining checks if SSH isn't available
+ return $status;
+ }
- my $current_image_revision_id = $self->os->get_current_image_info();
+ my $current_image_revision_id = $self->os->get_current_image_info();
$status->{currentimagerevision_id} = $current_image_revision_id;
$status->{currentimage} = $self->data->get_computer_currentimage_name();
- my $current_image_name = $status->{currentimage};
- my $vcld_post_load_status = $self->data->get_computer_currentimage_vcld_post_load();
-
- if (!$current_image_revision_id) {
- notify($ERRORS{'OK'}, 0, "unable to retrieve image name from currentimage.txt on VM $computer_name, returning 'RELOAD'");
- return $status;
- }
- elsif ($current_image_revision_id eq $imagerevision_id) {
- notify($ERRORS{'OK'}, 0, "currentimage.txt image $current_image_revision_id ($current_image_name) matches requested imagerevision_id $imagerevision_id on VM $computer_name");
- $status->{image_match} = 1;
- }
- else {
- notify($ERRORS{'OK'}, 0, "currentimage.txt imagerevision_id $current_image_revision_id ($current_image_name) does not match requested imagerevision_id $imagerevision_id on VM $computer_name, returning 'RELOAD'");
- return $status;
- }
+ my $current_image_name = $status->{currentimage};
+ my $vcld_post_load_status = $self->data->get_computer_currentimage_vcld_post_load();
+ if (!$current_image_revision_id) {
+ notify($ERRORS{'OK'}, 0, "unable to retrieve image name from currentimage.txt on VM $computer_name, returning 'RELOAD'");
+ return $status;
+ }
+ elsif ($current_image_revision_id eq $imagerevision_id) {
+ notify($ERRORS{'OK'}, 0, "currentimage.txt image $current_image_revision_id ($current_image_name) matches requested imagerevision_id $imagerevision_id on VM $computer_name");
+ $status->{image_match} = 1;
+ }
+ else {
+ notify($ERRORS{'OK'}, 0, "currentimage.txt imagerevision_id $current_image_revision_id ($current_image_name) does not match requested imagerevision_id $imagerevision_id on VM $computer_name, returning 'RELOAD'");
+ return $status;
+ }
# Determine the overall machine status based on the individual status results
if ($status->{ssh} && $status->{image_match}) {
@@ -393,25 +390,17 @@ sub node_status {
notify($ERRORS{'DEBUG'}, 0, "status set to $status->{status}");
-
- if ($request_forimaging) {
- $status->{status} = 'RELOAD';
- notify($ERRORS{'OK'}, 0, "request_forimaging set, setting status to RELOAD");
+ if ($vcld_post_load_status) {
+ notify($ERRORS{'DEBUG'}, 0, "OS module post_load tasks have been completed on VM $computer_name");
+ $status->{status} = 'READY';
+ }
+ else {
+ notify($ERRORS{'OK'}, 0, "OS module post_load tasks have not been completed on VM $computer_name, returning 'POST_LOAD'");
+ $status->{status} = 'POST_LOAD';
}
-
- if ($vcld_post_load_status) {
- notify($ERRORS{'DEBUG'}, 0, "OS module post_load tasks have been completed on VM $computer_name");
- $status->{status} = 'READY';
- }
- else {
- notify($ERRORS{'OK'}, 0, "OS module post_load tasks have not been completed on VM $computer_name, returning 'POST_LOAD'");
- $status->{status} = 'POST_LOAD';
- }
-
notify($ERRORS{'DEBUG'}, 0, "returning node status hash reference (\$node_status->{status}=$status->{status})");
return $status;
-
} ## end sub node_status
@@ -436,23 +425,29 @@ sub does_image_exist {
my $vcl_image_name = $self->data->get_image_name();
# Match image name between VCL database and openstack Hbase database
- my $openstack_image_name = _match_image_name($vcl_image_name);
-
- if($openstack_image_name =~ m/(\w{8}-\w{4}-\w{4}-\w{4}-\w{12})-v/g ) {
- $openstack_image_name = $1;
- notify($ERRORS{'OK'}, 0, "Acquire the OpenStack image name: $openstack_image_name");
- }
- else {
- notify($ERRORS{'DEBUG'}, 0, "Fail to acquire the OpenStack image name for $vcl_image_name");
- return 0;
- }
+ my $openstack_image_id = _match_image_name($vcl_image_name);
+ if (!defined($openstack_image_id))
+ {
+ notify($ERRORS{'DEBUG'}, 0, "Fail to acquire the Image ID: $openstack_image_id");
+ return 0;
+ }
+ my ($token, $compute_url) = $self->_get_token_account_info();
+ my $ua = LWP::UserAgent->new();
+ my $resp = $ua->get(
+ $compute_url . "/images/" . $openstack_image_id,
+ x_auth_token => $token,
+ x_auth_project_id => $ENV{'OS_PROJECT_ID'},
+ );
- my $list_openstack_image = "nova image-list | grep $openstack_image_name";
- my $list_openstack_image_output = `$list_openstack_image`;
+ if(!$resp->is_success) {
+ notify($ERRORS{'WARNING'}, 0, "failed to execute post token: " . join("\n", $resp->content));
+ return 0;
+ }
- notify($ERRORS{'OK'}, 0, "The describe_image output: $list_openstack_image_output");
+ my $output = from_json($resp->content);
+ my $image_status = $output->{image}{status};
- if ($list_openstack_image_output =~ /$openstack_image_name/) {
+ if (defined($image_status) && $image_status eq 'ACTIVE') {
notify($ERRORS{'OK'}, 0, "The openstack image for $vcl_image_name exists");
return 1;
}
@@ -481,14 +476,14 @@ sub get_image_size {
return 0;
}
- notify($ERRORS{'OK'}, 0, "No image size information in Openstack");
+ notify($ERRORS{'OK'}, 0, "No image size information in Openstack");
return 0;
} ## end sub get_image_size
sub _delete_computer_mapping {
my $self = shift;
- my $computer_id = $self->data->get_computer_id;
+ my $computer_id = $self->data->get_computer_id();
my $delete_statement = "
DELETE FROM
@@ -515,38 +510,38 @@ sub _get_flavor_type {
my $image_disk_size;
# Change the glance image path based on your confirguration
my $openstack_image_info = "qemu-img info /var/lib/glance/images/$openstack_image_name";
- my $openstack_image_info_output = `$openstack_image_info`;
- if($openstack_image_info_output =~ m/virtual size:(\s\d{1,4})G/g)
- {
- $image_disk_size = $1;
- notify($ERRORS{'OK'}, 0, "The disk size for $openstack_image_name is $image_disk_size G");
- } else {
- notify($ERRORS{'WARNING'}, 0, "Unable to find $openstack_image_name in /var/lib/glance/images");
- return 0;
- }
+ my $openstack_image_info_output = qx/$openstack_image_info/;
+ if ($openstack_image_info_output =~ m/virtual size:(\s\d{1,4})G/g)
+ {
+ $image_disk_size = $1;
+ notify($ERRORS{'OK'}, 0, "The disk size for $openstack_image_name is $image_disk_size G");
+ } else {
+ notify($ERRORS{'WARNING'}, 0, "Unable to find $openstack_image_name in /var/lib/glance/images");
+ return 0;
+ }
my @flavor_ids;
my @flavor_disk_sizes;
my $openstack_flavor_info = "nova flavor-list";
my $openstack_flavor_info_output = `$openstack_flavor_info`;
my @lines = split /\n/, $openstack_flavor_info_output;
foreach my $line (@lines) {
- if($line =~ m/^\|\s(\d+)\s+\|/g) {
- push(@flavor_ids, $1);
- }
- if($line =~ m/\|\s\d+\s+\|\s(\d{1,4})\s+\|/g) {
- push(@flavor_disk_sizes, $1);
- }
+ if($line =~ m/^\|\s(\d+)\s+\|/g) {
+ push(@flavor_ids, $1);
+ }
+ if($line =~ m/\|\s\d+\s+\|\s(\d{1,4})\s+\|/g) {
+ push(@flavor_disk_sizes, $1);
+ }
}
notify($ERRORS{'OK'}, 0, "OpenStack flavor IDs: @flavor_ids, disk sizes: @flavor_disk_sizes");
my $num_of_ids = @flavor_ids;
- if(!$num_of_ids || $image_disk_size > $flavor_disk_sizes[$num_of_ids-1]) {
+ if (!defined($num_of_ids) || $image_disk_size > $flavor_disk_sizes[$num_of_ids-1]) {
notify($ERRORS{'WARNING'}, 0, "No flavor information or disk size is greater than the maximum flavor");
return 0;
}
my $flavor_type;
my $index=0;
foreach my $x (@flavor_disk_sizes) {
- if($x >= $image_disk_size) {
+ if ($x >= $image_disk_size) {
$flavor_type = $flavor_ids[$index];
last;
}
@@ -554,20 +549,12 @@ sub _get_flavor_type {
}
notify($ERRORS{'OK'}, 0, "OpenStack flavor type = $flavor_type");
-=for comment
-# if you want to use List::BinarySearch package
- # Use List::BinarySearch package to find the proper flavor type for the image based on its size.
- my $index = binsearch_pos { $a <=> $b} $image_disk_size, @flavor_disk_sizes;
- my $flavor_type = $flavor_ids[$index];
- notify($ERRORS{'OK'}, 0, "OpenStack flavor type = $flavor_type");
-=cut
-
return $flavor_type;
}
sub _get_instance_id {
my $self = shift;
- my $computer_id = $self->data->get_computer_id;
+ my $computer_id = $self->data->get_computer_id();
my $select_statement = "
SELECT
@@ -592,47 +579,124 @@ sub _get_instance_id {
return $instance_id;
}
+sub _get_token_account_info {
+ my $self = shift;
+
+ my $ua = LWP::UserAgent->new();
+ my $url = $ENV{'OS_AUTH_URL'};
+ my $auth_data = {
+ auth => {
+ tenantName => $ENV{'OS_TENANT_NAME'},
+ passwordCredentials => {
+ username => $ENV{'OS_USERNAME'},
+ password => $ENV{'OS_PASSWORD'},
+ }
+ }
+ };
+ my $resp = $ua->post(
+ $url . "/tokens",
+ content_type => 'application/json',
+ content => to_json($auth_data)
+ );
+ notify($ERRORS{'OK'}, 0, "resp->request: " . join("\n", $resp->request));
+
+ if(!$resp->is_success) {
+ notify($ERRORS{'WARNING'}, 0, "failed to execute post token: " . join("\n", $resp->content));
+ return;
+ }
+
+ my $output = from_json($resp->content);
+ my $token = $output->{access}{token}{id};
+
+ my @serviceCatalog = @{ $output->{access}{serviceCatalog} };
+ @serviceCatalog = grep { $_->{type} eq 'compute' } @serviceCatalog;
+ if(!@serviceCatalog) {
+ notify($ERRORS{'WARNING'}, 0, "failed to get compute serviceCatalog");
+ return;
+ }
+
+ my $service_name = $ENV{'OS_SERVICE_NAME'};
+ if ($service_name) {
+ @serviceCatalog = grep { $_->{name} eq $service_name } @serviceCatalog;
+ if(!@serviceCatalog) {
+ notify($ERRORS{'WARNING'}, 0, "failed to get service name: $service_name");
+ return;
+ }
+ }
+ my $serviceCatalog = $serviceCatalog[0];
+ my $compute_url = $serviceCatalog->{endpoints}[0]{publicURL};
+
+ if(!defined($token) || !defined($compute_url)) {
+ notify($ERRORS{'WARNING'}, 0, "Unable to get token or tenant account information");
+ return 0;
+ }
+
+ notify($ERRORS{'OK'}, 0, "compute_url: $compute_url");
+ return ($token, $compute_url);
+}
+
sub _image_create{
my $self = shift;
my $instance_id = shift;
my $imagerevision_comments = $self->data->get_imagerevision_comments(0);
- my $image_name = $self->data->get_image_name();
+ my $image_name = $self->data->get_image_name();
my $image_version;
- if($image_name =~ m/(-+)(.+)(-v\d+)/g)
- {
- $image_version = $3;
- notify($ERRORS{'OK'}, 0, "Acquire the Image Version: $image_version");
- }
-
- my $image_description = $image_name . $imagerevision_comments;
- #my $image_description = $image_name . '-' . $imagerevision_comments;
- my $capture_image = "nova image-create $instance_id $image_description";
- notify($ERRORS{'OK'}, 0, "New Image Capture Command: $capture_image");
- my $capture_image_output = `$capture_image`;
-
- my $openstack_image_id;
- my $new_image_name;
- my $describe_image = "nova image-list |grep $instance_id";
- my $run_describe_image_output = `$describe_image`;
- notify($ERRORS{'OK'}, 0, "The images: $run_describe_image_output");
+ if ($image_name =~ m/(-+)(.+)(-v\d+)/g)
+ {
+ $image_version = $3;
+ notify($ERRORS{'OK'}, 0, "Acquire the Image Version: $image_version");
+ }
+ my $openstack_image_name = $image_name . $imagerevision_comments;
- sleep 10;
+ my $ua = LWP::UserAgent->new();
+ my ($token, $compute_url) = $self->_get_token_account_info();
+ my $server_data = {
+ createImage => {
+ name => $openstack_image_name,
+ metadata => {
+ version => $image_version,
+ }
+ }
+ };
+
+ my $res = $ua->post(
+ $compute_url . "/servers/" . $instance_id . "/action",
+ content_type => 'application/json',
+ x_auth_token => $token,
+ content => to_json($server_data)
+ );
+
+ if(!$res->is_success) {
+ notify($ERRORS{'WARNING'}, 0, "failed to execute capture image: " . join("\n", $res->content));
+ return;
+ }
+ notify($ERRORS{'OK'}, 0, "Capturing an image of $instance_id");
- if($run_describe_image_output =~ m/^\|\s(\w{8}-\w{4}-\w{4}-\w{4}-\w{12})/g )
- {
- $openstack_image_id = $1;
- $new_image_name = $openstack_image_id . $image_version;
- #$new_image_name = $openstack_image_id .'-v'. $image_version;
- notify($ERRORS{'OK'}, 0, "The Openstack Image ID:$openstack_image_id");
- notify($ERRORS{'OK'}, 0, "The New Image Name:$new_image_name");
- return $new_image_name;
- }
- else
- {
- notify($ERRORS{'DEBUG'}, 0, "Fail to capture new Image");
- return 0;
- }
+ my $resp = $ua->get(
+ $compute_url . "/images/detail",
+ server => $instance_id,
+ content_type => 'application/json',
+ x_auth_project_id => $ENV{'OS_PROJECT_ID'},
+ x_auth_token => $token
+ );
+
+ if(!$resp->is_success) {
+ notify($ERRORS{'WARNING'}, 0, "failed to get image info: " . join("\n", $resp->content));
+ return 0;
+ }
+
+ my $output = from_json($resp->content);
+ my $openstack_image_id = $output->{images}[0]{id};
+ if (!defined($openstack_image_id)) {
+ notify($ERRORS{'OK'}, 0, "No image name for new captured instance of $instance_id");
+ return 0;
+ }
+ else {
+ my $new_image_name = $openstack_image_id . $image_version;
+ notify($ERRORS{'OK'}, 0, "New openstack image name is $new_image_name");
+ return $new_image_name;
+ }
}
sub _insert_instance_id {
@@ -668,27 +732,27 @@ sub _insert_openstack_image_name {
my $self = shift;
my $openstack_image_name = shift;
- my $image_name = $self->data->get_image_name();
+ my $image_name = $self->data->get_image_name();
+
+ my $insert_statement = "
+ INSERT INTO
+ openstackImageNameMap (
+ openstackImageNameMap.openstackimagename,
+ openstackImageNameMap.vclimagename
+ ) VALUES (
+ '$openstack_image_name',
+ '$image_name')";
- my $insert_statement = "
- INSERT INTO
- openstackImageNameMap (
- openstackImageNameMap.openstackimagename,
- openstackImageNameMap.vclimagename
- ) VALUES (
- '$openstack_image_name',
- '$image_name')";
-
- notify($ERRORS{'OK'}, 0, "$insert_statement");
-
- my $requested_id = database_execute($insert_statement);
- notify($ERRORS{'OK'}, 0, "SQL Insert is first time or requested_id : $requested_id");
-
- if (!$requested_id) {
- notify($ERRORS{'DEBUG'}, 0, "unable to insert image name");
- return 0;
- }
- notify($ERRORS{'OK'}, 0, "Successfully insert image name");
+ notify($ERRORS{'OK'}, 0, "$insert_statement");
+
+ my $requested_id = database_execute($insert_statement);
+ notify($ERRORS{'OK'}, 0, "SQL Insert is first time or requested_id : $requested_id");
+
+ if (!$requested_id) {
+ notify($ERRORS{'DEBUG'}, 0, "unable to insert image name");
+ return 0;
+ }
+ notify($ERRORS{'OK'}, 0, "Successfully insert image name");
return 1;
}
@@ -718,21 +782,27 @@ sub _match_image_name {
";
notify($ERRORS{'OK'}, 0, "$select_statement");
- # Call the database select subroutine
- # This will return an array of one or more rows based on the select statement
- my @selected_rows = database_select($select_statement);
+ # Call the database select subroutine
+ # This will return an array of one or more rows based on the select statement
+ my @selected_rows = database_select($select_statement);
# Check to make sure 1 row was returned
- if (scalar @selected_rows == 0) {
- return 1;
- }
- elsif (scalar @selected_rows > 1) {
- notify($ERRORS{'WARNING'}, 0, "" . scalar @selected_rows . " rows were returned from database select");
- return 0;
- }
- my $openstack_image_name = $selected_rows[0]{openstack_name};
- my $vcl_imagename = $selected_rows[0]{vcl_name};
+ if (scalar @selected_rows == 0 || scalar @selected_rows > 1) {
+ notify($ERRORS{'WARNING'}, 0, "" . scalar @selected_rows . " rows were returned from database select");
+ return 0;
+ }
+ my $openstack_image_name = $selected_rows[0]{openstack_name};
+ my $vcl_imagename = $selected_rows[0]{vcl_name};
+ if ($openstack_image_name =~ m/(\w{8}-\w{4}-\w{4}-\w{4}-\w{12})-v/g )
+ {
+ $openstack_image_name = $1;
+ notify($ERRORS{'OK'}, 0, "Acquire the Image ID: $openstack_image_name");
+ }
+ else {
+ notify($ERRORS{'DEBUG'}, 0, "Fail to acquire the Image ID: $openstack_image_name");
+ return 0;
+ }
- notify($ERRORS{'OK'}, 0, "The OpenStack image name $openstack_image_name is matched to $vcl_imagename");
+ notify($ERRORS{'OK'}, 0, "The OpenStack image name $openstack_image_name is matched to $vcl_imagename");
return $openstack_image_name;
}
@@ -740,49 +810,49 @@ sub _match_image_name {
sub _prepare_capture {
my $self = shift;
- my ($package, $filename, $line, $sub) = caller(0);
- my $request_data = $self->data->get_request_data;
+ my ($package, $filename, $line, $sub) = caller(0);
+ my $request_data = $self->data->get_request_data;
+
+ if (!$request_data) {
+ notify($ERRORS{'WARNING'}, 0, "unable to retrieve request data hash");
+ return 0;
+ }
+
+ my $request_id = $self->data->get_request_id;
+ my $reservation_id = $self->data->get_reservation_id;
+ my $management_node_keys = $self->data->get_management_node_keys();
+
+ my $image_id = $self->data->get_image_id;
+ my $image_os_name = $self->data->get_image_os_name;
+ my $image_identity = $self->data->get_image_identity;
+ my $image_os_type = $self->data->get_image_os_type;
+ my $image_name = $self->data->get_image_name();
+
+ my $computer_id = $self->data->get_computer_id;
+ my $computer_name = $self->data->get_computer_short_name;
+ my $computer_nodename = $computer_name;
+ my $computer_hostname = $self->data->get_computer_hostname;
+ my $computer_type = $self->data->get_computer_type;
- if (!$request_data) {
- notify($ERRORS{'WARNING'}, 0, "unable to retrieve request data hash");
- return 0;
- }
-
- my $request_id = $self->data->get_request_id;
- my $reservation_id = $self->data->get_reservation_id;
- my $management_node_keys = $self->data->get_management_node_keys();
-
- my $image_id = $self->data->get_image_id;
- my $image_os_name = $self->data->get_image_os_name;
- my $image_identity = $self->data->get_image_identity;
- my $image_os_type = $self->data->get_image_os_type;
- my $image_name = $self->data->get_image_name();
-
- my $computer_id = $self->data->get_computer_id;
- my $computer_name = $self->data->get_computer_short_name;
- my $computer_nodename = $computer_name;
- my $computer_hostname = $self->data->get_computer_hostname;
- my $computer_type = $self->data->get_computer_type;
-
- if (write_currentimage_txt($self->data)) {
- notify($ERRORS{'OK'}, 0, "currentimage.txt updated on $computer_name");
- }
- else {
- notify($ERRORS{'DEBUG'}, 0, "unable to update currentimage.txt on $computer_name");
- return 0;
- }
-
- $self->data->set_imagemeta_sysprep(0);
- notify($ERRORS{'OK'}, 0, "Set the imagemeta Sysprep value to 0");
-
- if ($self->os->can("pre_capture")) {
- notify($ERRORS{'OK'}, 0, "calling OS module's pre_capture() subroutine");
-
- if (!$self->os->pre_capture({end_state => 'on'})) {
- notify($ERRORS{'DEBUG'}, 0, "OS module pre_capture() failed");
- return 0;
- }
- }
+ if (write_currentimage_txt($self->data)) {
+ notify($ERRORS{'OK'}, 0, "currentimage.txt updated on $computer_name");
+ }
+ else {
+ notify($ERRORS{'DEBUG'}, 0, "unable to update currentimage.txt on $computer_name");
+ return 0;
+ }
+
+ $self->data->set_imagemeta_sysprep(0);
+ notify($ERRORS{'OK'}, 0, "Set the imagemeta Sysprep value to 0");
+
+ if ($self->os->can("pre_capture")) {
+ notify($ERRORS{'OK'}, 0, "calling OS module's pre_capture() subroutine");
+
+ if (!$self->os->pre_capture({end_state => 'on'})) {
+ notify($ERRORS{'DEBUG'}, 0, "OS module pre_capture() failed");
+ return 0;
+ }
+ }
return 1;
}
@@ -793,56 +863,65 @@ sub _run_instances {
my $image_full_name = $self->data->get_image_name;
my $computer_name = $self->data->get_computer_short_name;
- my $image_name = _match_image_name($image_full_name);
- if($image_name =~ m/(\w{8}-\w{4}-\w{4}-\w{4}-\w{12})-v/g )
+ my $openstack_image_id = _match_image_name($image_full_name);
+ if (!defined($openstack_image_id))
{
- $image_name = $1;
- notify($ERRORS{'OK'}, 0, "Acquire the openstack image name: $image_name");
- }
- else {
- notify($ERRORS{'DEBUG'}, 0, "Failed to acquire the openstack image name: $image_name");
- return 0;
- }
+ notify($ERRORS{'DEBUG'}, 0, "Fail to acquire the Image ID: $openstack_image_id");
+ return 0;
+ }
- my $flavor_type = _get_flavor_type($image_name);
+ my $flavor_type = _get_flavor_type($openstack_image_id);
if(!$flavor_type) {
- notify($ERRORS{'DEBUG'}, 0, "Fail to acquire openstack flavor type for $image_name");
- return 0;
+ notify($ERRORS{'DEBUG'}, 0, "Fail to acquire openstack flavor type for $openstack_image_id");
+ return 0;
}
my $openstack_key;
- my $image_os_type = $self->data->get_image_os_type;
+ my $image_os_type = $self->data->get_image_os_type;
if ($image_os_type eq 'linux') {
$openstack_key = $ENV{'VCL_LINUX_KEY'};
- notify($ERRORS{'OK'}, 0, "VCL Linux key is $openstack_key");
+ notify($ERRORS{'OK'}, 0, "VCL Linux key is $openstack_key");
}
elsif ($image_os_type eq 'windows') {
$openstack_key = $ENV{'VCL_WINDOWS_KEY'};
- notify($ERRORS{'OK'}, 0, "VCL Windows key is $openstack_key");
+ notify($ERRORS{'OK'}, 0, "VCL Windows key is $openstack_key");
}
else {
- notify($ERRORS{'OK'}, 0, "No available openstack keys for $image_full_name");
+ notify($ERRORS{'OK'}, 0, "No available openstack keys for $image_full_name");
return;
}
+ my $ua = LWP::UserAgent->new();
+ my ($token, $compute_url) = $self->_get_token_account_info();
+ my $server_data = {
+ server => {
+ name => $computer_name,
+ imageRef => $openstack_image_id,
+ key_name => $openstack_key,
+ flavorRef => $flavor_type
+ }
+ };
- my $run_instance = "nova boot --flavor $flavor_type --image $image_name --key_name $openstack_key $computer_name";
- notify($ERRORS{'OK'}, 0, "The run_instance: $run_instance\n");
-
- my $run_instance_output = `$run_instance`;
- my $instance_id;
- my $insert_success;
-
- notify($ERRORS{'OK'}, 0, "The run_instance Output: $run_instance_output\n");
- if($run_instance_output =~ m/(\w{8}-\w{4}-\w{4}-\w{4}-\w{12})/g )
- {
- $instance_id = $&;
- notify($ERRORS{'OK'}, 0, "The indstance_id: $instance_id\n");
+ my $resp = $ua->post(
+ $compute_url . "/servers",
+ content_type => 'application/json',
+ x_auth_token => $token,
+ x_auth_project_id => $ENV{'OS_PROJECT_ID'},
+ content => to_json($server_data)
+ );
+
+ if(!$resp->is_success) {
+ notify($ERRORS{'WARNING'}, 0, "failed to execute run instance: " . join("\n", $resp->content));
+ return;
}
- else {
- notify($ERRORS{'OK'}, 0, "Failed to run the instance");
+
+ my $output = from_json($resp->content);
+ my $instance_id = $output->{'server'}{'id'};
+ if (!defined($instance_id)){
+ notify($ERRORS{'WARNING'}, 0, "failed to execute command to get the instance id on $computer_name");
return 0;
}
-
+ notify($ERRORS{'OK'}, 0, "The run_instance: $instance_id\n");
+
if (!$self->_insert_instance_id($instance_id)) {
notify($ERRORS{'OK'}, 0, "Failed to insert the instance id : $instance_id");
return 0;
@@ -863,11 +942,11 @@ example: openstack.conf
"os_tenant_name" => "admin",
"os_username" => "admin",
"os_password" => "adminpassword",
-"os_auth_url" => "http://openstack_nova_url:5000/v2.0/",
+"os_auth_url" => "http://openstack_nova_url:5000/v2.0",
+"os_service_name" => "nova",
"vcl_windows_key" => "vcl_windows_key",
"vcl_linux_key" => "vcl_linux_key",
-
=cut
sub _set_openstack_user_conf {
@@ -875,51 +954,62 @@ sub _set_openstack_user_conf {
my $computer_name = $self->data->get_computer_short_name;
# User's environment file
my $user_config_file = '/etc/vcl/openstack/openstack.conf';
- notify($ERRORS{'OK'}, 0, "********* Set OpenStack User Configuration******************");
- notify($ERRORS{'OK'}, 0, "computer_name: $computer_name");
- notify($ERRORS{'OK'}, 0, "loading $user_config_file");
- my %config = do($user_config_file);
- if (!%config) {
- notify($ERRORS{'CRITICAL'},0, "failure to process $user_config_file");
- return 0;
- }
- $self->{config} = \%config;
- my $os_auth_url = $self->{config}->{os_auth_url};
- my $os_tenant_name = $self->{config}->{os_tenant_name};
- my $os_username = $self->{config}->{os_username};
- my $os_password = $self->{config}->{os_password};
- my $vcl_windows_key = $self->{config}->{vcl_windows_key};
- my $vcl_linux_key = $self->{config}->{vcl_linux_key};
+ notify($ERRORS{'OK'}, 0, "********* Set OpenStack User Configuration******************");
+ notify($ERRORS{'OK'}, 0, "computer_name: $computer_name");
+ notify($ERRORS{'OK'}, 0, "loading $user_config_file");
+ my %config = do($user_config_file);
+ if (!%config) {
+ notify($ERRORS{'CRITICAL'},0, "failure to process $user_config_file");
+ return 0;
+ }
+ $self->{config} = \%config;
+ my $os_auth_url = $self->{config}->{os_auth_url};
+ my $os_service_name = $self->{config}->{os_service_name};
+ my $os_project_id = $self->{config}->{os_project_id};
+ my $os_tenant_name = $self->{config}->{os_tenant_name};
+ my $os_username = $self->{config}->{os_username};
+ my $os_password = $self->{config}->{os_password};
+ my $vcl_windows_key = $self->{config}->{vcl_windows_key};
+ my $vcl_linux_key = $self->{config}->{vcl_linux_key};
# Set Environment File
$ENV{'OS_AUTH_URL'} = $os_auth_url;
+ $ENV{'OS_SERVICE_NAME'} = $os_service_name;
+ $ENV{'OS_PROJECT_ID'} = $os_project_id;
$ENV{'OS_TENANT_NAME'} = $os_tenant_name;
$ENV{'OS_USERNAME'} = $os_username;
$ENV{'OS_PASSWORD'} = $os_password;
$ENV{'VCL_WINDOWS_KEY'} = $vcl_windows_key;
$ENV{'VCL_LINUX_KEY'} = $vcl_linux_key;
- return 1;
+ return 1;
}# _set_openstack_user_conf close
sub _terminate_instances {
my $self = shift;
- my $computer_name = $self->data->get_computer_short_name;
- my $instance_id = $self->_get_instance_id;
+ my $instance_id = $self->_get_instance_id();
+ my $computer_name = $self->data->get_computer_short_name();
+ if (!$instance_id) {
+ notify($ERRORS{'WARNING'}, 0, "failed to get the instance id for $computer_name");
+ return 0;
+ }
+
$self->_delete_computer_mapping;
- if ($instance_id) {
- notify($ERRORS{'OK'}, 0, "Terminate the existing instance");
- my $terminate_instances = "nova delete $instance_id";
- my $run_terminate_instances = `$terminate_instances`;
- notify($ERRORS{'OK'}, 0, "The nova delete : $instance_id is terminated");
- # nova.conf, set force_dhcp_release=true
- sleep 30; # wait for completely removing from nova list
- }
- else {
- notify($ERRORS{'OK'}, 0, "No instance found for $computer_name");
+ my ($token, $compute_url) = $self->_get_token_account_info();
+
+ my $ua = LWP::UserAgent->new();
+ my $resp = $ua->delete(
+ $compute_url . "/servers/" . $instance_id,
+ x_auth_token => $token
+ );
+ if(!$resp->is_success) {
+ notify($ERRORS{'WARNING'}, 0, "failed to execute terminate instance: " . join("\n", $resp->content));
+ return 0;
}
+ notify($ERRORS{'OK'}, 0, "successfully terminate the instance for $computer_name");
+ sleep 30;
return 1;
}
@@ -931,80 +1021,107 @@ sub _update_private_ip {
my $main_loop = 60;
my $private_ip;
my $describe_instance_output;
- my $computer_id = $self->data->get_computer_id;
+ my $computer_id = $self->data->get_computer_id;
my $computer_name = $self->data->get_computer_short_name;
- my $describe_instance = "nova list |grep $instance_id";
- notify($ERRORS{'OK'}, 0, "Describe Instance: $describe_instance");
- notify($ERRORS{'OK'}, 0, "Computer ID: $computer_id");
+
+ my ($token, $compute_url) = $self->_get_token_account_info();
+ my $ua = LWP::UserAgent->new();
+ my $output;
+ my $resp;
+
# Find the correct instance among running instances using the private IP
- while($main_loop > 0 && !defined($private_ip))
+ while ($main_loop > 0)
{
notify($ERRORS{'OK'}, 0, "Try to fetch the Private IP on Computer $computer_name: Number $main_loop");
- $describe_instance_output = `$describe_instance`;
- notify($ERRORS{'OK'}, 0, "Describe Instance: $describe_instance_output");
+ $resp = $ua->get(
+ $compute_url . "/servers/" . $instance_id,
+ x_auth_token => $token
+ );
+ if(!$resp->is_success) {
+ notify($ERRORS{'WARNING'}, 0, "failed to execute instance detail: " . join("\n", $resp->content));
+ return;
+ }
- if($describe_instance_output =~ m/((10|192|172).(\d{1,3}|68|16).(\d{1,3}).(\d{1,3}))/g)
- {
- $private_ip = $1;
- notify($ERRORS{'OK'}, 0, "The instance private IP on Computer $computer_name: $private_ip");
- if (defined($private_ip) && $private_ip ne "") {
- my $new_private_ip = update_computer_private_ip_address($computer_id, $private_ip);
- if(!$new_private_ip) {
- notify($ERRORS{'OK'}, 0, "The $private_ip on Computer $computer_name is NOT updated");
- return 0;
- }
- goto EXIT_WHILELOOP;
+ $output = from_json($resp->content);
+ $private_ip = $output->{'server'}{'addresses'}{'private'}[0]->{'addr'};
+
+ if (defined($private_ip) && $private_ip ne "") {
+ my $new_private_ip = update_computer_private_ip_address($computer_id, $private_ip);
+ if (!defined($new_private_ip)) {
+ notify($ERRORS{'OK'}, 0, "The $private_ip on Computer $computer_name is NOT updated");
+ return 0;
}
+ notify($ERRORS{'OK'}, 0, "Private IP is $new_private_ip for $computer_name");
+ return 1;
}
else {
- notify($ERRORS{'DEBUG'}, 0, "Private IP for $computer_name is not determined");
+ notify($ERRORS{'DEBUG'}, 0, "Waiting for assinging private ip address to $computer_name");
}
sleep 20;
$main_loop--;
}
- EXIT_WHILELOOP:
-
- return 1;
+ notify($ERRORS{'DEBUG'}, 0, "Private IP for $computer_name is not determined");
+ return 0;
}
sub _wait_for_copying_image {
my $self = shift;
- my $instance_id = shift;
- my $query_image = "nova image-list | grep $instance_id";
- my $query_image_output = `$query_image`;
+ my $openstack_image_id = shift;
+ if ($openstack_image_id =~ m/(\w{8}-\w{4}-\w{4}-\w{4}-\w{12})-v/g )
+ {
+ $openstack_image_id = $1;
+ notify($ERRORS{'OK'}, 0, "Acquire the Image ID: $openstack_image_id");
+ }
+ else {
+ notify($ERRORS{'DEBUG'}, 0, "Fail to acquire the Image ID: $openstack_image_id");
+ return 0;
+ }
+ my ($token, $compute_url) = $self->_get_token_account_info();
+ my $ua = LWP::UserAgent->new();
+ my $resp;
- my $loop = 50;
- notify($ERRORS{'OK'}, 0, "The describe image output for $instance_id : $query_image_output");
- while ($loop > 0)
- {
- if($query_image_output =~ m/\|\s(\w{6})\s\|/g )
- {
- my $temp = $1;
+ my $output;
+ my $image_status;
+
+ my $loop = 100;
+ while ($loop > 0)
+ {
+ $resp = $ua->get(
+ $compute_url . "/images/" . $openstack_image_id,
+ content_type => 'application/json',
+ x_auth_project_id => $ENV{'OS_PROJECT_ID'},
+ x_auth_token => $token
+ );
- if( $temp eq 'ACTIVE') {
- notify($ERRORS{'OK'}, 0, "$instance_id is available now");
- goto RELOAD;
- }
- elsif ($temp eq 'SAVING') {
- notify($ERRORS{'OK'}, 0, "Sleep to capture New Image for 25 secs");
- sleep 25;
- }
- else {
- notify($ERRORS{'DEBUG'}, 0, "Failure for $instance_id");
+ if(!$resp->is_success) {
+ notify($ERRORS{'WARNING'}, 0, "failed to get image info: " . join("\n", $resp->content));
+ return;
+ }
+
+ $output = from_json($resp->content);
+ $image_status = $output->{'image'}{'status'};
+ if (defined($image_status)) {
+ notify($ERRORS{'OK'}, 0, "The describe image output of loop #$loop: $image_status");
+ if($image_status eq 'ACTIVE') {
+ notify($ERRORS{'OK'}, 0, "$openstack_image_id is available now");
+ last;
+ }
+ elsif ($image_status eq 'SAVING') {
+ notify($ERRORS{'OK'}, 0, "Sleep to capture New Image for 25 secs");
+ sleep 25;
+ }
+ else {
+ notify($ERRORS{'DEBUG'}, 0, "Failure for $openstack_image_id");
return 0;
- }
- }
- $query_image_output = `$query_image`;
- notify($ERRORS{'OK'}, 0, "The describe image output of loop #$loop: $query_image_output");
- $loop--;
- }
- RELOAD:
- #notify($ERRORS{'OK'}, 0, "Sleep until image is available");
- sleep 30;
-
+ }
+ }
+ sleep 10;
+ $loop--;
+ }
+
return 1;
}