From 0679fe6c43b8c9b175887b4c82d364cb9a087055 Mon Sep 17 00:00:00 2001 From: Gary Wong Date: Mon, 13 Jul 2009 22:07:29 +0000 Subject: [PATCH] Another hack to allow URNs in fields which are actually named UUIDs (for nodes/components this time). Ultimately, it will be safe to assume that everything both is and is named a URN, and this mess will go away. --- protogeni/lib/GeniCM.pm.in | 58 +++++++++++++++++++++++++++----------- 1 file changed, 41 insertions(+), 17 deletions(-) diff --git a/protogeni/lib/GeniCM.pm.in b/protogeni/lib/GeniCM.pm.in index a09386a89..d8b43111d 100644 --- a/protogeni/lib/GeniCM.pm.in +++ b/protogeni/lib/GeniCM.pm.in @@ -77,6 +77,36 @@ my $SNMPIT = "$TB/bin/snmpit"; my $PRERENDER = "$TB/libexec/vis/prerender"; my $EMULAB_PEMFILE = "@prefix@/etc/genicm.pem"; +# Look up a node by an identifier of unspecified type (perhaps a URN, an +# (obsolete) UUID, or an old-style HRN. Ultimately, all IDs should be +# URNs and this mess will go away, but for now we try not to make +# any assumptions, because of backward compatibility constraints. +sub LookupNode($) +{ + my ($nodeid) = @_; + + if( GeniHRN::IsValid( $nodeid ) ) { + # Looks like a URN. + my ($auth,$t,$id) = GeniHRN::Parse( $nodeid ); + + return undef if $auth ne $OURDOMAIN or $t ne "node"; + + return Node->Lookup( $id ); + } + + # + # Looks like an old HRN, but we only want the last token for node lookup. + # + if ($nodeid =~ /\./) { + ($nodeid) = ($nodeid =~ /\.([-\w]*)$/); + + return Node->Lookup($nodeid); + } + + # Assume it's a UUID, and pass it on as is. + return Node->Lookup($nodeid); +} + # # Respond to a Resolve request. # @@ -131,16 +161,10 @@ sub Resolve($) my $node; if (defined($uuid)) { - $node= Node->Lookup($uuid); + $node= LookupNode($uuid); } else { - # - # We only want the last token for node lookup. - # - if ($hrn =~ /\./) { - ($hrn) = ($hrn =~ /\.([-\w]*)$/); - } - $node= Node->Lookup($hrn); + $node= LookupNode($hrn); } if (!defined($node)) { return GeniResponse->Create(GENIRESPONSE_SEARCHFAILED, @@ -588,7 +612,7 @@ sub GetTicket($;$) !GeniHRN::Equal( $manager_uuid, $ENV{'MYURN'} ) && $manager_uuid ne $ENV{'MYUUID'}); - my $node = Node->Lookup($resource_uuid); + my $node = LookupNode($resource_uuid); if (!defined($node)) { $response = GeniResponse->Create(GENIRESPONSE_BADARGS, undef, "Bad resource $resource_uuid in ticket"); @@ -678,7 +702,7 @@ sub GetTicket($;$) } } else { - $node = Node->Lookup($resource_uuid); + $node = LookupNode($resource_uuid); if (!defined($node)) { $response = @@ -890,7 +914,7 @@ sub GetTicket($;$) my $component_uuid = $ref->{"component_uuid"}; my $rspec = $nodemap{$virtual_id}->{'rspec'}; my $virtnode = $nodemap{$virtual_id}->{'virtnode'}; - my $node = Node->Lookup($component_uuid); + my $node = LookupNode($component_uuid); my $colocate = $rspec->{'colocate'} || $rspec->{'phys_nickname'}; @@ -1300,7 +1324,7 @@ sub SliverWork($$) !GeniHRN::Equal( $manager_uuid, $ENV{'MYURN'} ) && $manager_uuid ne $ENV{'MYUUID'}); - my $node = Node->Lookup($resource_uuid); + my $node = LookupNode($resource_uuid); if (!defined($node)) { $message = "Bad resource_uuid $resource_uuid"; goto bad; @@ -1523,7 +1547,7 @@ sub SliverWork($$) next if (grep {$_ eq $virtual_id} keys(%nodemap)); - my $node = Node->Lookup($resource_uuid); + my $node = LookupNode($resource_uuid); if (!defined($node)) { $message = "Unknown resource_uuid in ticket: $resource_uuid"; goto bad; @@ -1551,7 +1575,7 @@ sub SliverWork($$) # See below; setup all pnodes at once. if ($node->isremotenode()) { - my $vnode = Node->Lookup($sliver->uuid()); + my $vnode = LookupNode($sliver->uuid()); if (!defined($vnode)) { print STDERR "Could not locate vnode $sliver\n"; goto bad; @@ -1674,7 +1698,7 @@ sub SliverWork($$) $message = "Link $linkname specifies a non-existent node"; goto bad; } - my $nodeobject= Node->Lookup($nodesliver->resource_uuid()); + my $nodeobject= LookupNode($nodesliver->resource_uuid()); if (!defined($nodeobject)) { $message = "Could not find node object for $nodesliver"; goto bad; @@ -2689,7 +2713,7 @@ sub SliceStatus($) if ($sliver->resource_type() ne "Node"); my $node_uuid = $sliver->uuid(); - my $node = Node->Lookup($node_uuid); + my $node = LookupNode($node_uuid); if (!defined($node)) { $slice->UnLock(); print STDERR "Cannot find node by uuid $node_uuid\n"; @@ -2886,7 +2910,7 @@ sub SliverStatus($) if ($sliver->resource_type() ne "Node"); my $node_uuid = $sliver->uuid(); - my $node = Node->Lookup($node_uuid); + my $node = LookupNode($node_uuid); if (!defined($node)) { $slice->UnLock(); print STDERR "Cannot find node by uuid $node_uuid\n"; -- GitLab