Index: trunk/Nebulous-Server/Changes
===================================================================
--- trunk/Nebulous-Server/Changes	(revision 16205)
+++ trunk/Nebulous-Server/Changes	(revision 16221)
@@ -2,4 +2,5 @@
 
 0.06
+    - add Nebulous::Sever:: neb key/uri support
     - add Nebulous::Util::parse_neb_key()
     - change bin/* scripts to conistently use --volume instead of --node,
Index: trunk/Nebulous-Server/lib/Nebulous/Server.pm
===================================================================
--- trunk/Nebulous-Server/lib/Nebulous/Server.pm	(revision 16205)
+++ trunk/Nebulous-Server/lib/Nebulous/Server.pm	(revision 16221)
@@ -1,5 +1,5 @@
 # Copyright (c) 2004  Joshua Hoblitt
 #
-# $Id: Server.pm,v 1.46 2008-01-23 00:46:06 jhoblitt Exp $
+# $Id: Server.pm,v 1.47 2008-01-25 01:53:28 jhoblitt Exp $
 
 package Nebulous::Server;
@@ -158,4 +158,15 @@
     $log->debug( "entered - @_" );
 
+    {
+        my $volume;
+        ($volume, $key) = parse_neb_key($key);
+#        if (defined $volume) {
+#            die "$volume is not a valid volume name"
+#                unless $self->_is_valid_volume_name($volume);
+#        }
+        $vol_name ||= $volume;
+
+    }
+
     my ($uri, $vol_id);
     eval {
@@ -257,4 +268,8 @@
     $log->debug("entered - @_");
 
+    # ignore volumes
+    $key    = parse_neb_key($key);
+    $newkey = parse_neb_key($newkey);
+
     eval {
         # rename storage_object
@@ -309,4 +324,14 @@
 
     $log->debug("entered - @_");
+
+    {
+        my $volume;
+        ($volume, $key) = parse_neb_key($key);
+        if (defined $volume) {
+            die "$volume is not a valid volume name"
+                unless $self->_is_valid_volume_name($volume);
+        }
+        $vol_name ||= $volume;
+    }
 
     my ($uri, $vol_id);
@@ -395,4 +420,7 @@
 
     $log->debug( "entered - @_" );
+
+    # ignore volume
+    $key = parse_neb_key($key);
 
     my $so_id;
@@ -495,4 +523,7 @@
     $log->debug( "entered - @_" );
 
+    # ignore volume
+    $key = parse_neb_key($key);
+
     my $so_id;
     my $read_lock;
@@ -604,4 +635,7 @@
     $log->debug("entered - @_");
 
+    # ignore volume
+    $key = parse_neb_key($key);
+
     eval {
         my $query;
@@ -672,4 +706,7 @@
     $log->debug("entered - @_");
 
+    # ignore volume
+    $key = parse_neb_key($key);
+
     my $query;
     eval {
@@ -718,4 +755,7 @@
     $log->debug("entered - @_");
 
+    # ignore volume
+    $key = parse_neb_key($key);
+
     my $query;
     eval {
@@ -763,4 +803,7 @@
     $log->debug("entered - @_");
 
+    # ignore volume
+    $key = parse_neb_key($key);
+
     my $query;
     eval {
@@ -862,4 +905,14 @@
 
     $log->debug("entered - @_");
+
+    {
+        my $volume;
+        ($volume, $key) = parse_neb_key($key);
+        if (defined $volume) {
+            die "$volume is not a valid volume name"
+                unless $self->_is_valid_volume_name($volume);
+        }
+        $vol_name ||= $volume;
+    }
 
     my $query;
@@ -1008,4 +1061,7 @@
     $log->debug("entered - @_");
 
+    # ignore volume
+    $key = parse_neb_key($key);
+
     my $stat;
     eval {
@@ -1055,4 +1111,5 @@
             # %free, name, avaiable, allocate
             $rows = $query->execute(0.95, $name, 1, 1);
+            # XXX destinguish between non-existant and unaviable
             unless ($rows > 0) {
                 $query->finish;
Index: trunk/Nebulous-Server/t/03_server_create_object.t
===================================================================
--- trunk/Nebulous-Server/t/03_server_create_object.t	(revision 16205)
+++ trunk/Nebulous-Server/t/03_server_create_object.t	(revision 16221)
@@ -3,10 +3,10 @@
 # Copryight (C) 2004-2005  Joshua Hoblitt
 #
-# $Id: 03_server_create_object.t,v 1.20 2007-05-08 02:27:42 jhoblitt Exp $
+# $Id: 03_server_create_object.t,v 1.21 2008-01-25 01:53:28 jhoblitt Exp $
 
 use strict;
 use warnings FATAL => qw( all );
 
-use Test::More tests => 28;
+use Test::More tests => 64;
 
 use lib qw( ./t ./lib );
@@ -35,4 +35,56 @@
     my ($scheme, $auth, $path, $query, $frag) = uri_split($uri);
     ok(-e $path, "file exists");
+    ok($neb->find_instances("foo"), 'object key exists');
+    uri_scheme_ok($uri, 'file');
+
+SKIP: {
+    skip "requires xattr support", 1 unless $test_xattr;
+    is(getfattr($path, 'user.nebulous_key'), 'foo', 'user.nebulous_key xattr');
+}
+}
+
+Test::Nebulous->setup;
+
+{
+    # key
+    my $uri = $neb->create_object("neb:/foo");
+
+    my ($scheme, $auth, $path, $query, $frag) = uri_split($uri);
+    ok(-e $path, "file exists");
+    ok($neb->find_instances("foo"), 'object key exists');
+    uri_scheme_ok($uri, 'file');
+
+SKIP: {
+    skip "requires xattr support", 1 unless $test_xattr;
+    is(getfattr($path, 'user.nebulous_key'), 'foo', 'user.nebulous_key xattr');
+}
+}
+
+Test::Nebulous->setup;
+
+{
+    # key
+    my $uri = $neb->create_object("neb://node01/foo");
+
+    my ($scheme, $auth, $path, $query, $frag) = uri_split($uri);
+    ok(-e $path, "file exists");
+    ok($neb->find_instances("foo"), 'object key exists');
+    uri_scheme_ok($uri, 'file');
+
+SKIP: {
+    skip "requires xattr support", 1 unless $test_xattr;
+    is(getfattr($path, 'user.nebulous_key'), 'foo', 'user.nebulous_key xattr');
+}
+}
+
+Test::Nebulous->setup;
+
+{
+    # key
+    my $uri = $neb->create_object("neb://node02/foo");
+
+    my ($scheme, $auth, $path, $query, $frag) = uri_split($uri);
+    ok(-e $path, "file exists");
+    ok($neb->find_instances("foo"), 'object key exists');
     uri_scheme_ok($uri, 'file');
 
@@ -51,4 +103,5 @@
     my ($scheme, $auth, $path, $query, $frag) = uri_split($uri);
     ok(-e $path, "file exists");
+    ok($neb->find_instances("foo"), 'object key exists');
     uri_scheme_ok($uri, 'file');
 
@@ -60,4 +113,20 @@
 
 Test::Nebulous->setup;
+{
+    # key
+    my $uri = $neb->create_object("neb:///foo");
+
+    my ($scheme, $auth, $path, $query, $frag) = uri_split($uri);
+    ok(-e $path, "file exists");
+    ok($neb->find_instances("foo"), 'object key exists');
+    uri_scheme_ok($uri, 'file');
+
+SKIP: {
+    skip "requires xattr support", 1 unless $test_xattr;
+    is(getfattr($path, 'user.nebulous_key'), 'foo', 'user.nebulous_key xattr');
+}
+}
+
+Test::Nebulous->setup;
 
 {
@@ -67,4 +136,5 @@
     my ($scheme, $auth, $path, $query, $frag) = uri_split($uri);
     ok(-e $path, "file exists");
+    ok($neb->find_instances("foo"), 'object key exists');
     uri_scheme_ok($uri, 'file');
 
@@ -79,8 +149,26 @@
 {
     # key
+    my $uri = $neb->create_object("neb:/foo/");
+
+    my ($scheme, $auth, $path, $query, $frag) = uri_split($uri);
+    ok(-e $path, "file exists");
+    ok($neb->find_instances("foo"), 'object key exists');
+    uri_scheme_ok($uri, 'file');
+
+SKIP: {
+    skip "requires xattr support", 1 unless $test_xattr;
+    is(getfattr($path, 'user.nebulous_key'), '/foo/', 'user.nebulous_key xattr');
+}
+}
+
+Test::Nebulous->setup;
+
+{
+    # key
     my $uri = $neb->create_object("foo/");
 
     my ($scheme, $auth, $path, $query, $frag) = uri_split($uri);
     ok(-e $path, "file exists");
+    ok($neb->find_instances("foo"), 'object key exists');
     uri_scheme_ok($uri, 'file');
 
@@ -99,4 +187,5 @@
     my ($scheme, $auth, $path, $query, $frag) = uri_split($uri);
     ok(-e $path, "file exists");
+    ok($neb->find_instances("foo/bar"), 'object key exists');
     uri_scheme_ok($uri, 'file');
 
@@ -115,4 +204,5 @@
     my ($scheme, $auth, $path, $query, $frag) = uri_split($uri);
     ok(-e $path, "file exists");
+    ok($neb->find_instances("foo/bar"), 'object key exists');
     uri_scheme_ok($uri, 'file');
 
@@ -131,4 +221,17 @@
     my ($scheme, $auth, $path, $query, $frag) = uri_split($uri);
     ok(-e $path, "file exists");
+    ok($neb->find_instances("foo"), 'object key exists');
+    uri_scheme_ok($uri, 'file');
+}
+
+Test::Nebulous->setup;
+
+{
+    # volume name override
+    my $uri = $neb->create_object("neb://99/foo", "node01");
+
+    my ($scheme, $auth, $path, $query, $frag) = uri_split($uri);
+    ok(-e $path, "file exists");
+    ok($neb->find_instances("foo"), 'object key exists');
     uri_scheme_ok($uri, 'file');
 }
@@ -145,4 +248,12 @@
 
 eval {
+    $neb->create_object("neb:/foo");
+    $neb->create_object("neb:/foo");
+};
+like($@, qr/Duplicate entry/, "object already exists");
+
+Test::Nebulous->setup;
+
+eval {
     $neb->create_object("foo", 'node03');
 };
@@ -152,4 +263,11 @@
 
 eval {
+    $neb->create_object("neb://node03/foo");
+};
+like($@, qr/node03 is not available/, "request volume this is full");
+
+Test::Nebulous->setup;
+
+eval {
     $neb->create_object("foo", 'node04');
 };
@@ -159,4 +277,11 @@
 
 eval {
+    $neb->create_object("neb://node04/foo");
+};
+like($@, qr/node04 is not available/, "request volume with allocate = FALSE, available = FALSE");
+
+Test::Nebulous->setup;
+
+eval {
     $neb->create_object("foo", 'node05');
 };
@@ -166,4 +291,11 @@
 
 eval {
+    $neb->create_object("neb://node05/foo");
+};
+like($@, qr/node05 is not available/, "request volume with allocate = FALSE , available = TRUE");
+
+Test::Nebulous->setup;
+
+eval {
     $neb->create_object("foo", 'node06');
 };
@@ -173,4 +305,11 @@
 
 eval {
+    $neb->create_object("neb://node06/foo");
+};
+like($@, qr/node06 is not available/, "request volume with allocate = TRUE, available = FALSE");
+
+Test::Nebulous->setup;
+
+eval {
     $neb->create_object("foo", 99);
 };
@@ -180,4 +319,11 @@
 
 eval {
+    $neb->create_object("neb://99/foo");
+};
+like($@, qr/is not available/, "volume name doesn't exist");
+
+Test::Nebulous->setup;
+
+eval {
     $neb->create_object();
 };
