From 5f72d9eeeb8255994a7a10d34057d19740d07d87 Mon Sep 17 00:00:00 2001 From: Leigh B Stoller Date: Thu, 8 Mar 2018 17:27:00 -0700 Subject: [PATCH] Add support for a rspec directive. --- db/VirtExperiment.pm.in | 5 +- protogeni/lib/GeniAggregate.pm.in | 94 ++++++++++++++++--------------- protogeni/lib/GeniCM.pm.in | 7 +++ protogeni/lib/GeniXML.pm.in | 11 ++++ sql/database-fill.sql | 1 + sql/updates/4/629 | 16 ++++++ 6 files changed, 87 insertions(+), 47 deletions(-) create mode 100644 sql/updates/4/629 diff --git a/db/VirtExperiment.pm.in b/db/VirtExperiment.pm.in index ee82314f1..616c569ee 100644 --- a/db/VirtExperiment.pm.in +++ b/db/VirtExperiment.pm.in @@ -1,6 +1,6 @@ #!/usr/bin/perl -wT # -# Copyright (c) 2009-2014, 2016 University of Utah and the Flux Group. +# Copyright (c) 2009-2018 University of Utah and the Flux Group. # # {{{EMULAB-LICENSE # @@ -140,7 +140,8 @@ my $debug = 0; "delay_capacity" => 1, "dpdb" => 1, "nonfsmounts" => 1, - "nfsmounts" => 1); + "nfsmounts" => 1, + "skipvlans" => 1); # # Grab the virtual topo for an experiment. diff --git a/protogeni/lib/GeniAggregate.pm.in b/protogeni/lib/GeniAggregate.pm.in index 30569a387..32341a5ca 100755 --- a/protogeni/lib/GeniAggregate.pm.in +++ b/protogeni/lib/GeniAggregate.pm.in @@ -1311,59 +1311,63 @@ sub ActionStart($$;$) # We want to let snmpit run in parallel with os_setup, like the # classic path does. # - my $snmpit_child = fork(); - if ($snmpit_child) { - # - # Parent just continues on, but will wait later, we cannot - # return to the caller until snmpit is done. - # - print STDERR "Forked off snmpit: process $snmpit_child\n"; - } - else { - EventFork(); - my $msg; - - DebugTimeStamp("snmpit started"); - if ($flags & $ACTION_FLAGS_SYNCVLANS) { - if (Lan->CompareVlansWithSwitches2($experiment)) { - $msg .= "CompareVlansWithSwitches2 failed!\n"; - goto badsnmpit; - } - system("$SNMPIT -X $pid $eid"); - if ($?) { - $msg .= "Failed to synchronize vlans"; - goto badsnmpit; - } + my $snmpit_child; + + if (!$experiment->skipvlans()) { + $snmpit_child = fork(); + if ($snmpit_child) { + # + # Parent just continues on, but will wait later, we cannot + # return to the caller until snmpit is done. + # + print STDERR "Forked off snmpit: process $snmpit_child\n"; } else { - my @diff = (); - my @same = (); - - if (Lan->CompareVlansWithSwitches($experiment, \@diff, \@same)) { - print STDERR "CompareVlansWithSwitches failed!\n"; - goto badsnmpit; - } - if (@diff) { - system("$SNMPIT -f ". join(" ", map("-o $_", @diff))); + EventFork(); + my $msg; + + DebugTimeStamp("snmpit started"); + if ($flags & $ACTION_FLAGS_SYNCVLANS) { + if (Lan->CompareVlansWithSwitches2($experiment)) { + $msg .= "CompareVlansWithSwitches2 failed!\n"; + goto badsnmpit; + } + system("$SNMPIT -X $pid $eid"); if ($?) { - $msg .= "Failed to remove obsolete VLANs."; + $msg .= "Failed to synchronize vlans"; goto badsnmpit; } } - system("$SNMPIT -t $pid $eid"); - if ($?) { - $msg .= "Failed to setup vlans"; - goto badsnmpit; + else { + my @diff = (); + my @same = (); + + if (Lan->CompareVlansWithSwitches($experiment, \@diff,\@same)) { + print STDERR "CompareVlansWithSwitches failed!\n"; + goto badsnmpit; + } + if (@diff) { + system("$SNMPIT -f ". join(" ", map("-o $_", @diff))); + if ($?) { + $msg .= "Failed to remove obsolete VLANs."; + goto badsnmpit; + } + } + system("$SNMPIT -t $pid $eid"); + if ($?) { + $msg .= "Failed to setup vlans"; + goto badsnmpit; + } } + DebugTimeStamp("snmpit finished"); + # Avoid END block processing + POSIX::_exit(0); + + badsnmpit: + print STDERR "Failed to setup vlans: $msg\n"; + # Avoid END block processing + POSIX::_exit(-1); } - DebugTimeStamp("snmpit finished"); - # Avoid END block processing - POSIX::_exit(0); - - badsnmpit: - print STDERR "Failed to setup vlans: $msg\n"; - # Avoid END block processing - POSIX::_exit(-1); } my @nodes = keys(%nodes); diff --git a/protogeni/lib/GeniCM.pm.in b/protogeni/lib/GeniCM.pm.in index 87f1f3637..a45900d2a 100755 --- a/protogeni/lib/GeniCM.pm.in +++ b/protogeni/lib/GeniCM.pm.in @@ -876,6 +876,13 @@ sub GetTicketAuxAux($) # my $disablerootkeys = GeniXML::DisableRootKey($rspec); + # + # Allow caller to turn off vlan creation. + # + if (GeniXML::SkipVlans($rspec)) { + $virtexperiment->skipvlans(1); + } + # # User can turn off routing. # diff --git a/protogeni/lib/GeniXML.pm.in b/protogeni/lib/GeniXML.pm.in index 5f6d73caa..58647c68a 100755 --- a/protogeni/lib/GeniXML.pm.in +++ b/protogeni/lib/GeniXML.pm.in @@ -791,6 +791,17 @@ sub DisableRootKey($) return 1; } +sub SkipVlans($) +{ + my ($rspec) = @_; + + my $tmp = GeniXML::FindNodesNS("n:skipvlans", $rspec, $EMULAB_NS)->pop(); + return 1 + if (defined($tmp)); + + return 0; +} + sub GetTarball($) { my ($node) = @_; diff --git a/sql/database-fill.sql b/sql/database-fill.sql index 8de6eda4e..4c1d173a7 100644 --- a/sql/database-fill.sql +++ b/sql/database-fill.sql @@ -992,6 +992,7 @@ REPLACE INTO table_regex VALUES ('experiments','ipassign_args','text','regex','^ REPLACE INTO table_regex VALUES ('experiments','expt_name','text','redirect','default:fulltext',1,255,NULL); REPLACE INTO table_regex VALUES ('experiments','dpdb','int','redirect','default:tinyint',0,1,NULL); REPLACE INTO table_regex VALUES ('experiments','nonfsmounts','int','redirect','default:tinyint',0,1,NULL); +REPLACE INTO table_regex VALUES ('experiments','skipvlans','int','redirect','default:tinyint',0,1,NULL); REPLACE INTO table_regex VALUES ('experiments','nfsmounts','text','regex','^(emulabdefault|genidefault|all|none)$',0,0,NULL); REPLACE INTO table_regex VALUES ('experiments','packing_strategy','text','regex','^(pack|balance)$',0,0,NULL); diff --git a/sql/updates/4/629 b/sql/updates/4/629 new file mode 100644 index 000000000..55f05bd37 --- /dev/null +++ b/sql/updates/4/629 @@ -0,0 +1,16 @@ +use strict; +use libdb; + +sub DoUpdate($$$) +{ + my ($dbhandle, $dbname, $version) = @_; + + DBQueryFatal("REPLACE INTO table_regex VALUES ". + "('experiments','skipvlans','int','redirect',". + "'default:boolean',0,1,NULL)"); + return 0; +} + +# Local Variables: +# mode:perl +# End: -- GitLab