Index: trunk/Nebulous-Server/Changes
===================================================================
--- trunk/Nebulous-Server/Changes	(revision 24358)
+++ trunk/Nebulous-Server/Changes	(revision 24362)
@@ -20,4 +20,6 @@
     - change 'log_level' param to 'trace'
     - refactor ->find_objects() functionality
+    - rename Nebulous::Key->soft_volume Nebulous::Key->hard_volume and invert
+      the semantics
       
 0.16
Index: trunk/Nebulous-Server/lib/Nebulous/Key.pm
===================================================================
--- trunk/Nebulous-Server/lib/Nebulous/Key.pm	(revision 24358)
+++ trunk/Nebulous-Server/lib/Nebulous/Key.pm	(revision 24362)
@@ -8,5 +8,5 @@
 use warnings FATAL => qw( all );
 
-our $VERSION = '0.02';
+our $VERSION = '0.03';
 
 use base qw( Exporter Class::Accessor::Fast );
@@ -23,5 +23,5 @@
 );
 
-__PACKAGE__->mk_ro_accessors(qw( path volume soft_volume ));
+__PACKAGE__->mk_ro_accessors(qw( path volume hard_volume ));
 
 sub parse_neb_key
@@ -42,5 +42,5 @@
     
     my $volume_name;
-    my $soft_volume;
+    my $hard_volume;
     # if this is a valid uri 
     if (defined $scheme) {
@@ -71,5 +71,5 @@
         if (defined $volume_info->{volume} and $volume_info->{volume} ne 'any') {
             $volume_name = $volume_info->{volume};
-            $soft_volume = $volume_info->{soft_volume};
+            $hard_volume = $volume_info->{hard_volume};
         }
 
@@ -84,5 +84,5 @@
         if (defined $volume_info->{volume} and $volume_info->{volume} ne 'any') {
             $volume_name = $volume_info->{volume};
-            $soft_volume = $volume_info->{soft_volume};
+            $hard_volume = $volume_info->{hard_volume};
         }
     }
@@ -99,5 +99,5 @@
     return __PACKAGE__->new({
         volume      => $volume_name,
-        soft_volume => $soft_volume,
+        hard_volume => $hard_volume,
         path        => $path,
     });
@@ -110,11 +110,11 @@
     return unless defined $volume;
 
-    my $soft_volume;
+    my $hard_volume;
     # check to see if there is a tilde and remove it if found
-    unless (defined $volume and $volume =~ s/^~//) {
-        $soft_volume = 1;
+    if (defined $volume and $volume =~ s/^~//) {
+        $hard_volume = 1;
     }
 
-    return({ volume => $volume, soft_volume => $soft_volume });
+    return({ volume => $volume, hard_volume => $hard_volume });
 }
 
@@ -125,8 +125,8 @@
 
     my $path        = $self->path;
-    my $volume      = $self->volume || "";
-    my $soft_volume = $self->soft_volume ? '~' : "";
-
-    return "neb://${soft_volume}${volume}/$path";
+    my $volume      = $self->volume || '';
+    my $hard_volume = $self->hard_volume ? '~' : '';
+
+    return "neb://${hard_volume}${volume}/$path";
 }
 
Index: trunk/Nebulous-Server/lib/Nebulous/Server.pm
===================================================================
--- trunk/Nebulous-Server/lib/Nebulous/Server.pm	(revision 24358)
+++ trunk/Nebulous-Server/lib/Nebulous/Server.pm	(revision 24362)
@@ -229,5 +229,5 @@
     if (defined $vol_name
         and not $self->_is_valid_volume_name($key, $key->volume)) {
-        if ($key->soft_volume) {
+        unless ($key->hard_volume) {
             $log->warn( "$vol_name is not a known volume name" );
             $vol_name = undef;
@@ -238,5 +238,5 @@
         
     my ($vol_id, $vol_host, $vol_path, $vol_xattr)
-        = $self->_get_storage_volume($key, $vol_name, $key->soft_volume);
+        = $self->_get_storage_volume($key, $vol_name, $key->hard_volume);
 
     my $parent_id = $self->_resolve_dir_parent_id(key => $key, create => 1);
@@ -705,5 +705,5 @@
     if (defined $vol_name
         and not $self->_is_valid_volume_name($key, $key->volume)) {
-        if ($key->soft_volume) {
+        unless ($key->hard_volume) {
             $log->warn( "$vol_name is not a known volume name" );
             $vol_name = undef;
@@ -777,5 +777,5 @@
             $db->rollback;
             # handle soft volumes
-            if (defined $vol_name and defined $key->soft_volume) {
+            if (defined $vol_name and not defined $key->hard_volume) {
                 $log->debug("retrying with 'any' volume");
                 return $self->replicate_object($key->path, 'any');
@@ -1446,8 +1446,8 @@
     my $sql = $self->sql;
 
-    unless ($key) {
-        $log->warn("key was undefined after validate_pos(), trying again...");
-        return $self->find_instances(@_);
-    }
+#    unless ($key) {
+#        $log->warn("key was undefined after validate_pos(), trying again...");
+#        return $self->find_instances(@_);
+#    }
 
     # vol_name overrides the key implied volume
@@ -1464,9 +1464,9 @@
     if (defined $vol_name
         and not $self->_is_valid_volume_name($key, $key->volume)) {
-        if ($key->soft_volume) {
+        if ($key->hard_volume) {
+            $log->logdie("$vol_name is not a valid volume name");
+        } else {
             $log->warn( "$vol_name is not a known volume name" );
             $vol_name = undef;
-        } else {
-            $log->logdie("$vol_name is not a valid volume name");
         }
     }
@@ -1501,5 +1501,5 @@
         $db->rollback;
         # handle soft volumes
-        if (defined $vol_name and defined $key->soft_volume) {
+        if (defined $vol_name and not defined $key->hard_volume) {
             $log->debug("retrying with 'any' volume");
             return $self->find_instances($key->path, 'any');
@@ -1794,5 +1794,5 @@
     use warnings;
 
-    my ($key, $name, $soft_volume) = @_;
+    my ($key, $name, $hard_volume) = @_;
 
     my $sql = $self->sql;
@@ -1813,5 +1813,5 @@
                 # if a volume name was specified, and is soft, and we failed to
                 # find it, fall back to any volume
-                if ($soft_volume) {
+                unless ($hard_volume) {
                     ($vol_id, $vol_host, $vol_path, $xattr) = $self->_get_storage_volume($key);
                     return; # this just returns out of the eval not from the subroutine
@@ -1831,5 +1831,5 @@
             unless ($rows > 0) {
                 $query->finish;
-                $log->logdie("no storage volume is available for key: $key volume: $name soft: $soft_volume");
+                $log->logdie("no storage volume is available for key: $key volume: $name hard_volume: $hard_volume");
             }
         }
@@ -1962,4 +1962,6 @@
     my $sql = $self->sql;
 
+    # the volume name implied by the key is ignored.  $key is only needed to
+    # select a database connection
     eval {
         $key = parse_neb_key($key);
Index: trunk/Nebulous-Server/t/08_server_find_instances.t
===================================================================
--- trunk/Nebulous-Server/t/08_server_find_instances.t	(revision 24358)
+++ trunk/Nebulous-Server/t/08_server_find_instances.t	(revision 24362)
@@ -109,5 +109,4 @@
 like($@, qr/no instances on storage volume/, 'instances on a different volume');
 
-
 Test::Nebulous->setup;
 
Index: trunk/Nebulous-Server/t/75_parse_neb_key.t
===================================================================
--- trunk/Nebulous-Server/t/75_parse_neb_key.t	(revision 24358)
+++ trunk/Nebulous-Server/t/75_parse_neb_key.t	(revision 24362)
@@ -10,5 +10,5 @@
 use Test::More;
 
-plan tests => 103;
+plan tests => 106;
 
 use lib qw( ./t ./lib );
@@ -28,5 +28,5 @@
     is($key->path, 'foo/bar/baz/quix', 'path');
     is($key->volume, undef, 'volume name');
-    is($key->soft_volume, undef, 'soft volume name');
+    is($key->hard_volume, undef, 'soft volume name');
 }
 
@@ -36,5 +36,5 @@
     is($key->path, 'foo/bar/baz/quix', 'path');
     is($key->volume, undef, 'volume name');
-    is($key->soft_volume, undef, 'soft volume name');
+    is($key->hard_volume, undef, 'soft volume name');
 }
 
@@ -44,5 +44,5 @@
     is($key->path, 'foo/bar/baz/quix', 'path');
     is($key->volume, undef, 'volume name');
-    is($key->soft_volume, undef, 'soft volume name');
+    is($key->hard_volume, undef, 'soft volume name');
 }
 
@@ -52,5 +52,5 @@
     is($key->path, 'foo/bar/baz/quix', 'path');
     is($key->volume, undef, 'volume name');
-    is($key->soft_volume, undef, 'soft volume name');
+    is($key->hard_volume, undef, 'soft volume name');
 }
 
@@ -60,5 +60,5 @@
     is($key->path, 'foo/bar/baz/quix', 'path');
     is($key->volume, undef, 'volume name');
-    is($key->soft_volume, undef, 'soft volume name');
+    is($key->hard_volume, undef, 'soft volume name');
 }
 
@@ -68,5 +68,5 @@
     is($key->path, 'foo/bar/baz/quix', 'path');
     is($key->volume, undef, 'volume name');
-    is($key->soft_volume, undef, 'soft volume name');
+    is($key->hard_volume, undef, 'soft volume name');
 }
 
@@ -77,5 +77,5 @@
     is($key->path, 'foo/bar/baz/quix', 'path');
     is($key->volume, 'boing', 'volume name');
-    is($key->soft_volume, 1, 'soft volume name');
+    is($key->hard_volume, undef, 'soft volume name');
 }
 
@@ -85,5 +85,5 @@
     is($key->path, 'foo/bar/baz/quix', 'path');
     is($key->volume, 'boing', 'volume name');
-    is($key->soft_volume, undef, 'soft volume name');
+    is($key->hard_volume, 1, 'soft volume name');
 }
 
@@ -94,5 +94,5 @@
     is($key->path, 'bar/baz/quix', 'path');
     is($key->volume, 'foo', 'volume name');
-    is($key->soft_volume, 1, 'soft volume name');
+    is($key->hard_volume, undef, 'soft volume name');
 }
 
@@ -102,5 +102,5 @@
     is($key->path, 'bar/baz/quix', 'path');
     is($key->volume, 'foo', 'volume name');
-    is($key->soft_volume, 1, 'soft volume name');
+    is($key->hard_volume, undef, 'soft volume name');
 }
 
@@ -110,5 +110,5 @@
     is($key->path, 'bar/baz/quix', 'path');
     is($key->volume, 'foo', 'volume name');
-    is($key->soft_volume, 1, 'soft volume name');
+    is($key->hard_volume, undef, 'soft volume name');
 }
 
@@ -118,5 +118,5 @@
     is($key->path, 'bar/baz/quix', 'path');
     is($key->volume, 'foo', 'volume name');
-    is($key->soft_volume, 1, 'soft volume name');
+    is($key->hard_volume, undef, 'soft volume name');
 }
 
@@ -126,5 +126,5 @@
     is($key->path, 'bar/baz/quix', 'path');
     is($key->volume, 'foo', 'volume name');
-    is($key->soft_volume, 1, 'soft volume name');
+    is($key->hard_volume, undef, 'soft volume name');
 }
 
@@ -135,5 +135,5 @@
     is($key->path, 'bar/baz/quix', 'path');
     is($key->volume, 'foo', 'volume name');
-    is($key->soft_volume, undef, 'soft volume name');
+    is($key->hard_volume, 1, 'soft volume name');
 }
 
@@ -144,5 +144,5 @@
     is($key->path, 'bar/baz/quix', 'path');
     is($key->volume, 'boing', 'volume name');
-    is($key->soft_volume, 1, 'soft volume name');
+    is($key->hard_volume, undef, 'soft volume name');
 }
 
@@ -152,5 +152,5 @@
     is($key->path, 'bar/baz/quix', 'path');
     is($key->volume, 'boing', 'volume name');
-    is($key->soft_volume, undef, 'soft volume name');
+    is($key->hard_volume, 1, 'soft volume name');
 }
 
@@ -160,5 +160,5 @@
     is($key->path, 'bar/baz/quix', 'path');
     is($key->volume, 'foo', 'volume name');
-    is($key->soft_volume, 1, 'soft volume name');
+    is($key->hard_volume, undef, 'soft volume name');
 }
 
@@ -169,5 +169,5 @@
     is($key->path, 'bar/baz/quix', 'path');
     is($key->volume, undef, 'volume name');
-    is($key->soft_volume, undef, 'soft volume name');
+    is($key->hard_volume, undef, 'soft volume name');
 }
 
@@ -178,5 +178,5 @@
     is($key->path, 'bar/baz/quix', 'path');
     is($key->volume, undef, 'volume name');
-    is($key->soft_volume, undef, 'soft volume name');
+    is($key->hard_volume, undef, 'soft volume name');
 }
 
@@ -186,5 +186,5 @@
     is($key->path, 'bar/baz/quix', 'path');
     is($key->volume, undef, 'volume name');
-    is($key->soft_volume, undef, 'soft volume name');
+    is($key->hard_volume, undef, 'soft volume name');
 }
 
@@ -195,5 +195,5 @@
     is($key->path, 'bar/baz/quix', 'path');
     is($key->volume, 'foo', 'volume name');
-    is($key->soft_volume, undef, 'soft volume name');
+    is($key->hard_volume, 1, 'soft volume name');
 }
 
@@ -205,5 +205,5 @@
     is($key->path, 'foo/bar/baz/quix', 'path');
     is($key->volume, undef, 'volume name');
-    is($key->soft_volume, undef, 'soft volume name');
+    is($key->hard_volume, undef, 'soft volume name');
 }
 
@@ -213,5 +213,5 @@
     is($key->volume, undef, 'volume name');
     is($key->path, 'foo/bar/baz/quix', 'path');
-    is($key->soft_volume, undef, 'soft volume name');
+    is($key->hard_volume, undef, 'soft volume name');
 }
 
@@ -221,5 +221,5 @@
     is($key->path, 'foo/bar/baz/quix', 'path');
     is($key->volume, undef, 'volume name');
-    is($key->soft_volume, undef, 'soft volume name');
+    is($key->hard_volume, undef, 'soft volume name');
 }
 
@@ -230,5 +230,5 @@
     is($key->path, '', 'path');
     is($key->volume, undef, 'volume name');
-    is($key->soft_volume, undef, 'soft volume name');
+    is($key->hard_volume, undef, 'soft volume name');
 }
 
@@ -238,5 +238,5 @@
     is($key->path, '', 'path');
     is($key->volume, undef, 'volume name');
-    is($key->soft_volume, undef, 'soft volume name');
+    is($key->hard_volume, undef, 'soft volume name');
 }
 
@@ -246,5 +246,5 @@
     is($key->path, '', 'path');
     is($key->volume, undef, 'volume name');
-    is($key->soft_volume, undef, 'soft volume name');
+    is($key->hard_volume, undef, 'soft volume name');
 }
 
@@ -254,5 +254,5 @@
     is($key->path, '', 'path');
     is($key->volume, undef, 'volume name');
-    is($key->soft_volume, undef, 'soft volume name');
+    is($key->hard_volume, undef, 'soft volume name');
 }
 
@@ -262,5 +262,5 @@
     is($key->path, '', 'path');
     is($key->volume, undef, 'volume name');
-    is($key->soft_volume, undef, 'soft volume name');
+    is($key->hard_volume, undef, 'soft volume name');
 }
 
@@ -270,5 +270,28 @@
     is($key->path, '', 'path');
     is($key->volume, undef, 'volume name');
-    is($key->soft_volume, undef, 'soft volume name');
+    is($key->hard_volume, undef, 'soft volume name');
+}
+
+# stringification
+
+{
+    my $txt = 'neb:///bar/baz';
+    my $key = parse_neb_key($txt);
+
+    is("$key", $txt, "stringified");
+}
+
+{
+    my $txt = 'neb://foo.0/bar/baz';
+    my $key = parse_neb_key($txt);
+
+    is("$key", $txt, "stringified");
+}
+
+{
+    my $txt = 'neb://~foo.0/bar/baz';
+    my $key = parse_neb_key($txt);
+
+    is("$key", $txt, "stringified");
 }
 
