Commit a01d6e75 authored by Leigh Stoller's avatar Leigh Stoller

Small utility script to update the types for an image when new types are

added to the testbed. Useful when we know that all of the old images
will work on the new types.
parent 4acd0bfe
......@@ -59,7 +59,7 @@ SBIN_SCRIPTS = vlandiff vlansync withadminprivs export_tables cvsupd.pl \
addrfdevice addrfpath reserve announce createimagealias \
predict test-reserve notify-reservations \
deprecate_image pushrootkey addinterface addwire cnetwatch \
addswitch
addswitch addtypetoimages
WEB_SBIN_SCRIPTS= webnewnode webdeletenode webspewconlog webarchive_list \
webspewimage webdumpdescriptor webemulabfeature \
......
#!/usr/bin/perl -w
#
# Copyright (c) 2003-2018 University of Utah and the Flux Group.
#
# {{{EMULAB-LICENSE
#
# This file is part of the Emulab network testbed software.
#
# This file is free software: you can redistribute it and/or modify it
# under the terms of the GNU Affero General Public License as published by
# the Free Software Foundation, either version 3 of the License, or (at
# your option) any later version.
#
# This file is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public
# License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this file. If not, see <http://www.gnu.org/licenses/>.
#
# }}}
#
use strict;
use English;
use Getopt::Std;
use Data::Dumper;
#
# Add a new type to images having another type (or architecture).
#
sub usage()
{
print STDERR "Usage: addtypetoimages <newtype> <oldtype>\n";
exit(-1);
}
my $optlist = "vn";
my $verbose = 0;
my $impotent = 1;
# Protos
sub fatal($);
#
# Configure variables
#
my $TB = "@prefix@";
#
# Testbed Support libraries
#
use lib "@prefix@/lib";
use emdb;
use emutil;
use User;
use NodeType;
use Image;
#
# Turn off line buffering on output
#
$| = 1;
#
# Untaint the path
#
$ENV{'PATH'} = "/bin:/sbin:/usr/bin:";
#
# Parse command arguments.
#
my %options = ();
if (! getopts($optlist, \%options)) {
usage();
}
if (defined($options{'v'})) {
$verbose = 1;
}
if (defined($options{'n'})) {
$impotent = 1;
}
usage()
if (@ARGV != 2);
#
# Map invoking user to object.
#
my $this_user = User->ThisUser();
if (! defined($this_user)) {
fatal("You ($UID) do not exist!");
}
fatal("Not a testbed administrator")
if ($this_user->IsAdmin());
my $newtype_string = shift(@ARGV);
my $oldtype_string = shift(@ARGV);
my $newtype = NodeType->Lookup($newtype_string);
fatal("Not a valid PC type: $newtype_string")
if (!defined($newtype));
my $oldtype = NodeType->Lookup($oldtype_string);
fatal("Not a valid PC type: $oldtype_string")
if (!defined($oldtype));
#
# Look in osidtoimageid to find all the images that run on the old type,
# and add the new type to that image.
#
my $query_result =
DBQueryFatal("select imageid from osidtoimageid ".
"where type='$oldtype_string'");
while (my ($imageid) = $query_result->fetchrow_array()) {
my $image = Image->Lookup($imageid);
if (!defined($image)) {
print STDERR "Cannot lookup $imageid, skipping\n";
}
my @typelist = $image->TypeList();
next
if (grep {$_ eq $newtype_string} map { $_->type() } @typelist);
if ($impotent) {
print "Would add newtype to $image\n";
}
else {
if ($verbose) {
print "Adding newtype to $image\n";
}
$image->SetRunsOnNodeType($newtype_string) == 0
or fatal("Could not add new type to $image");
}
}
exit(0);
sub fatal($)
{
my ($mesg) = $_[0];
die("*** $0:\n".
" $mesg\n");
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment