Changeset 20990
- Timestamp:
- Dec 14, 2008, 12:54:25 PM (17 years ago)
- Location:
- trunk/Nebulous-Server
- Files:
-
- 9 edited
-
MANIFEST (modified) (1 diff)
-
lib/Nebulous/Server.pm (modified) (39 diffs)
-
lib/Nebulous/Server/Config.pm (modified) (5 diffs)
-
lib/Nebulous/Server/Log.pm (modified) (3 diffs)
-
lib/Nebulous/Server/SOAP.pm (modified) (5 diffs)
-
lib/Nebulous/Server/SQL.pm (modified) (4 diffs)
-
t/02_server_setup.t (modified) (2 diffs)
-
t/08_server_delete_instance.t (modified) (5 diffs)
-
t/10_server_is_valid_volume_name.t (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/Nebulous-Server/MANIFEST
r20965 r20990 35 35 t/00_distribution.t 36 36 t/01_load.t 37 t/02_config.t38 37 t/02_server_setup.t 39 38 t/03_server_create_object.t -
trunk/Nebulous-Server/lib/Nebulous/Server.pm
r20972 r20990 1 1 # Copyright (c) 2004-2008 Joshua Hoblitt 2 2 # 3 # $Id: Server.pm,v 1.9 5 2008-12-13 00:41:15 jhoblittExp $3 # $Id: Server.pm,v 1.96 2008-12-14 22:54:25 eugene Exp $ 4 4 5 5 package Nebulous::Server; … … 9 9 no warnings qw( uninitialized ); 10 10 11 our $VERSION = '0.1 6';11 our $VERSION = '0.15'; 12 12 13 13 use base qw( Class::Accessor::Fast ); … … 19 19 use File::Spec; 20 20 use Log::Log4perl; 21 use Nebulous::Keys qw( parse_neb_key parse_neb_volume );22 21 use Nebulous::Server::Config; 23 22 use Nebulous::Server::Log; 24 23 use Nebulous::Server::SQL; 24 use Nebulous::Keys qw( parse_neb_key parse_neb_volume ); 25 25 use Params::Validate qw( validate_pos SCALAR SCALARREF UNDEF ); 26 26 use URI::file; … … 36 36 37 37 # let Nebulous::Server::Config validate our params 38 my $config = Nebulous::Server::Config->new( @_ ); 39 40 return $class->new_from_config($config); 41 } 42 43 44 sub new_from_config 45 { 46 my ($class, $config) = @_; 38 my $config = Nebulous::Server::Config->init( @_ ); 47 39 48 40 # log4perl is not avaliable until we call init() … … 59 51 $self->config($config); 60 52 53 # ask for the db handle as a means of validating the database parameters 54 $self->db; 55 61 56 $log->debug( "leaving" ); 62 57 63 58 return $self; 64 59 } 65 60 61 66 62 sub db 67 63 { 68 my ($self, $key) = @_; 64 my $self = shift; 65 66 if (@_) { 67 $self->{db} = $_[0]; 68 return $self; 69 } 69 70 70 71 my $log = $self->log; … … 72 73 my $config = $self->config; 73 74 74 my $db_index = 0;75 if (defined $key) {76 # hash the key to select the correct database instance77 # only use the first 8 hex chars... have to be careful to avoid an int78 # overflow here79 $db_index = unpack("h8", sha1_hex("$key")) % $config->n_db;80 }81 82 # lookup to see if we have a stored dbh for this database83 my $dbh = $self->{dbs}[$db_index];84 75 # if the dbh is still alive, return it 85 if (defined $ dbh and $dbh->ping) {76 if (defined $self->{db} and $self->{db}->ping) { 86 77 $log->debug("db handle is still alive"); 87 return $ dbh;78 return $self->{db}; 88 79 } 89 80 # otherwise create a new connection 90 81 $log->debug("db handle is dead/unopened"); 91 92 # lookup database info93 my $db_config = $config->db($db_index);94 die "can't find database configuration info for database # $db_index"95 unless $db_config;96 82 97 83 # if we're running under mod_perl & Apache::DBI is loaded we want to … … 100 86 # processes and the database might have gone away on us. Apache::DBI will 101 87 # take care of getting a valid dbh back. 102 eval { 103 $dbh = DBI->connect_cached( 104 $db_config->dsn, 105 $db_config->dbuser, 106 $db_config->dbpasswd, 88 my $db; 89 eval { 90 $db = DBI->connect_cached( 91 $config->dsn, 92 $config->dbuser, 93 $config->dbpasswd, 107 94 { 108 95 RaiseError => 1, … … 112 99 ); 113 100 114 $db h->do( $sql->set_transaction_model );115 $log->debug( "connected to database: ", sub { $db h->data_sources; } );116 $db h->commit;101 $db->do( $sql->set_transaction_model ); 102 $log->debug( "connected to database: ", sub { $db->data_sources; } ); 103 $db->commit; 117 104 $log->debug("commit"); 118 105 }; 119 106 if ( $@ ) { 120 $db h->rollback if $dbh;107 $db->rollback if $db; 121 108 $log->debug("rollback"); 122 109 $log->logdie( "database error: $@" ); 123 110 } 124 111 125 $self->{db s}[$db_index] = $dbh;126 127 return $db h;112 $self->{db} = $db; 113 114 return $db; 128 115 } 129 116 … … 152 139 my $log = $self->log; 153 140 my $sql = $self->sql; 154 my $db = $self->db($key);141 my $db =$self->db; 155 142 156 143 $log->debug( "entered - @_" ); … … 163 150 # to check it after parsing the key 164 151 if (defined $vol_name 165 and not $self->_is_valid_volume_name($key , $key->volume)) {152 and not $self->_is_valid_volume_name($key->volume)) { 166 153 if ($key->soft_volume) { 167 154 $log->warn( "$vol_name is not a known volume name" ); … … 173 160 174 161 my ($vol_id, $vol_host, $vol_path, $vol_xattr) 175 = $self->_get_storage_volume($ key, $vol_name, $key->soft_volume);162 = $self->_get_storage_volume($vol_name, $key->soft_volume); 176 163 177 164 my $uri; … … 274 261 my $log = $self->log; 275 262 my $sql = $self->sql; 276 my $db = $self->db($key);263 my $db =$self->db; 277 264 278 265 $log->debug("entered - @_"); … … 309 296 310 297 311 # sub swap_objects 312 # { 313 # my $self = shift; 314 # 315 # my ($key1, $key2) = validate_pos(@_, 316 # { 317 # type => SCALAR, 318 # callbacks => { 319 # 'is valid object key' => sub { $self->_is_valid_object_key($_[0]) }, 320 # }, 321 # }, 322 # { 323 # type => SCALAR, 324 # callbacks => { 325 # 'is valid object key' => sub { $self->_is_valid_object_key($_[0]) }, 326 # }, 327 # }, 328 # ); 329 # 330 # my $log = $self->log; 331 # my $sql = $self->sql; 332 # my $dbh1 = $self->db($key1); 333 # my $dbh2 = $self->db($key2); 334 # 335 # $log->debug("entered - @_"); 336 # 337 # # ignore volumes 338 # $key1 = parse_neb_key($key1); 339 # $key2 = parse_neb_key($key2); 340 # 341 # # order of operations for the swap with a single db is: 342 # # key1 -> key1.swap 343 # # key2 -> key1 344 # # key1.swap -> key2 345 # 346 # # XXX this cmp will only work if ->db() returns the same exact (cached) dbh 347 # if ($dbh1 == $dbh2) { 348 # my $dbh = $dbh1; 349 # eval { 350 # { 351 # # key1 -> key1.swap 352 # my $query = $dbh->prepare_cached($sql->rename_object); 353 # # this SQL statment takes the new key name as the first param 354 # my $rows = $query->execute($key1->path . ".swap", $key1->path); 355 # 356 # # if we affected more then one row something very bad has happened. 357 # unless ($rows == 1) { 358 # $query->finish; 359 # $log->logdie("affected row count is $rows instead of 1"); 360 # } 361 # } 362 # 363 # { 364 # # key2 -> key1 365 # my $query = $dbh->prepare_cached($sql->rename_object); 366 # # this SQL statment takes the new key name as the first param 367 # my $rows = $query->execute($key1->path, $key2->path); 368 # 369 # # if we affected more then one row something very bad has happened. 370 # unless ($rows == 1) { 371 # $query->finish; 372 # $log->logdie("affected row count is $rows instead of 1"); 373 # } 374 # } 375 # 376 # { 377 # # key1.swap -> key2 378 # my $query = $dbh->prepare_cached($sql->rename_object); 379 # # this SQL statment takes the new key name as the first param 380 # my $rows = $query->execute($key2->path, $key1->path . ".swap"); 381 # 382 # # if we affected more then one row something very bad has happened. 383 # unless ($rows == 1) { 384 # $query->finish; 385 # $log->logdie("affected row count is $rows instead of 1"); 386 # } 387 # } 388 # 389 # $dbn->commit; 390 # $log->debug("commit"); 391 # }; 392 # if ($@) { 393 # $dbh->rollback; 394 # $log->debug("rollback"); 395 # $log->logdie("database error: $@"); 396 # } 397 # } 398 # 399 # # order of operations for the swap between two dbs is: 400 # # key1 start transaction 401 # # key1 -> read all instances 402 # # key1 -> remove all instances 403 # # key2 start transaction 404 # # key2 -> read all instances 405 # # key2 -> remove all instances 406 # # key1 -> insert key 2 instances 407 # # key2 -> insert key 1 instances 408 # # key1,2 commit 409 # 410 # eval { 411 # { 412 # # key1 -> read all instances 413 # my $query = $dbh->prepare_cached($sql->rename_object); 414 # # this SQL statment takes the new key name as the first param 415 # my $rows = $query->execute($key1->path . ".swap", $key1->path); 416 # 417 # # if we affected more then one row something very bad has happened. 418 # unless ($rows == 1) { 419 # $query->finish; 420 # $log->logdie("affected row count is $rows instead of 1"); 421 # } 422 # } 423 # 424 # { 425 # # key2 -> key1 426 # my $query = $db->prepare_cached($sql->rename_object); 427 # # this SQL statment takes the new key name as the first param 428 # my $rows = $query->execute($key1->path, $key2->path); 429 # 430 # # if we affected more then one row something very bad has happened. 431 # unless ($rows == 1) { 432 # $query->finish; 433 # $log->logdie("affected row count is $rows instead of 1"); 434 # } 435 # } 436 # 437 # { 438 # # key1.swap -> key2 439 # my $query = $db->prepare_cached($sql->rename_object); 440 # # this SQL statment takes the new key name as the first param 441 # my $rows = $query->execute($key2->path, $key1->path . ".swap"); 442 # 443 # # if we affected more then one row something very bad has happened. 444 # unless ($rows == 1) { 445 # $query->finish; 446 # $log->logdie("affected row count is $rows instead of 1"); 447 # } 448 # } 449 # 450 # $db->commit; 451 # $log->debug("commit"); 452 # }; 453 # if ($@) { 454 # $db->rollback; 455 # $log->debug("rollback"); 456 # $log->logdie("database error: $@"); 457 # } 458 # 459 # 460 # $log->debug("leaving"); 461 # 462 # return 1; 463 # } 298 sub swap_objects 299 { 300 my $self = shift; 301 302 my ($key1, $key2) = validate_pos(@_, 303 { 304 type => SCALAR, 305 callbacks => { 306 'is valid object key' => sub { $self->_is_valid_object_key($_[0]) }, 307 }, 308 }, 309 { 310 type => SCALAR, 311 callbacks => { 312 'is valid object key' => sub { $self->_is_valid_object_key($_[0]) }, 313 }, 314 }, 315 ); 316 317 my $log = $self->log; 318 my $sql = $self->sql; 319 my $db =$self->db; 320 321 $log->debug("entered - @_"); 322 323 # ignore volumes 324 $key1 = parse_neb_key($key1); 325 $key2 = parse_neb_key($key2); 326 327 # order of operations for the swap: 328 # key1 -> key1.swap 329 # key2 -> key1 330 # key1.swap -> key2 331 332 eval { 333 { 334 # key1 -> key1.swap 335 my $query = $db->prepare_cached($sql->rename_object); 336 # this SQL statment takes the new key name as the first param 337 my $rows = $query->execute($key1->path . ".swap", $key1->path); 338 339 # if we affected more then one row something very bad has happened. 340 unless ($rows == 1) { 341 $query->finish; 342 $log->logdie("affected row count is $rows instead of 1"); 343 } 344 } 345 346 { 347 # key2 -> key1 348 my $query = $db->prepare_cached($sql->rename_object); 349 # this SQL statment takes the new key name as the first param 350 my $rows = $query->execute($key1->path, $key2->path); 351 352 # if we affected more then one row something very bad has happened. 353 unless ($rows == 1) { 354 $query->finish; 355 $log->logdie("affected row count is $rows instead of 1"); 356 } 357 } 358 359 { 360 # key1.swap -> key2 361 my $query = $db->prepare_cached($sql->rename_object); 362 # this SQL statment takes the new key name as the first param 363 my $rows = $query->execute($key2->path, $key1->path . ".swap"); 364 365 # if we affected more then one row something very bad has happened. 366 unless ($rows == 1) { 367 $query->finish; 368 $log->logdie("affected row count is $rows instead of 1"); 369 } 370 } 371 372 $db->commit; 373 $log->debug("commit"); 374 }; 375 if ($@) { 376 $db->rollback; 377 $log->debug("rollback"); 378 $log->logdie("database error: $@"); 379 } 380 381 $log->debug("leaving"); 382 383 return 1; 384 } 464 385 465 386 … … 499 420 my $log = $self->log; 500 421 my $sql = $self->sql; 501 my $db = $self->db($key);422 my $db =$self->db; 502 423 503 424 $log->debug("entered - @_"); … … 508 429 509 430 if (defined $vol_name 510 and not $self->_is_valid_volume_name($key , $key->volume)) {431 and not $self->_is_valid_volume_name($key->volume)) { 511 432 if ($key->soft_volume) { 512 433 $log->warn( "$vol_name is not a known volume name" ); … … 520 441 if (defined $vol_name) { 521 442 ($vol_id, $vol_host, $vol_path, $vol_xattr) 522 = $self->_get_storage_volume($ key, $vol_name);443 = $self->_get_storage_volume($vol_name); 523 444 } else { 524 445 ($vol_id, $vol_host, $vol_path, $vol_xattr) … … 613 534 my $log = $self->log; 614 535 my $sql = $self->sql; 615 my $db = $self->db($key);536 my $db =$self->db; 616 537 617 538 $log->debug( "entered - @_" ); … … 716 637 my $log = $self->log; 717 638 my $sql = $self->sql; 718 my $db = $self->db($key);639 my $db =$self->db; 719 640 720 641 $log->debug( "entered - @_" ); … … 828 749 my $log = $self->log; 829 750 my $sql = $self->sql; 830 my $db = $self->db($key);751 my $db =$self->db; 831 752 832 753 $log->debug("entered - @_"); … … 895 816 my $log = $self->log; 896 817 my $sql = $self->sql; 897 my $db = $self->db($key);818 my $db =$self->db; 898 819 899 820 $log->debug("entered - @_"); … … 948 869 my $log = $self->log; 949 870 my $sql = $self->sql; 950 my $db = $self->db($key);871 my $db =$self->db; 951 872 952 873 $log->debug("entered - @_"); … … 991 912 my $log = $self->log; 992 913 my $sql = $self->sql; 993 my $db = $self->db($key);914 my $db =$self->db; 994 915 995 916 $log->debug("entered - @_"); … … 1026 947 sub find_objects 1027 948 { 1028 # XXX: this will only search one db 1029 1030 my $self = shift; 1031 1032 my ($pattern) = validate_pos( @_, 949 my $self = shift; 950 951 my ( $pattern ) = validate_pos( @_, 1033 952 { 1034 953 type => SCALAR, … … 1039 958 my $log = $self->log; 1040 959 my $sql = $self->sql; 1041 my $db = $self->db;960 my $db =$self->db; 1042 961 1043 962 $log->debug( "entered - @_" ); … … 1097 1016 my $log = $self->log; 1098 1017 my $sql = $self->sql; 1099 my $db = $self->db($key);1018 my $db =$self->db; 1100 1019 1101 1020 $log->debug("entered - @_"); … … 1108 1027 # to check it after parsing the key 1109 1028 if (defined $vol_name 1110 and not $self->_is_valid_volume_name($key , $key->volume)) {1029 and not $self->_is_valid_volume_name($key->volume)) { 1111 1030 if ($key->soft_volume) { 1112 1031 $log->warn( "$vol_name is not a known volume name" ); … … 1168 1087 my $self = shift; 1169 1088 1170 my ($key, $uri) = validate_pos( @_, 1171 { 1172 type => SCALAR, 1173 callbacks => { 1174 'is valid object key' => sub { $self->_is_valid_object_key($_[0]) }, 1175 }, 1176 }, 1089 my ( $uri ) = validate_pos( @_, 1177 1090 { 1178 1091 type => SCALAR|SCALARREF, … … 1182 1095 my $log = $self->log; 1183 1096 my $sql = $self->sql; 1184 my $db = $self->db($key);1097 my $db =$self->db; 1185 1098 1186 1099 $log->debug( "entered - @_" ); … … 1269 1182 my $log = $self->log; 1270 1183 my $sql = $self->sql; 1271 my $db = $self->db($key);1184 my $db =$self->db; 1272 1185 1273 1186 $log->debug("entered - @_"); … … 1298 1211 sub mounts 1299 1212 { 1300 # XXX: this will only pull the mounts from one db1301 1213 my $self = shift; 1302 1214 … … 1305 1217 my $log = $self->log; 1306 1218 my $sql = $self->sql; 1307 my $db = $self->db;1219 my $db =$self->db; 1308 1220 1309 1221 $log->debug("entered - @_"); … … 1334 1246 my $self = shift; 1335 1247 1336 my ($key, $name, $soft_volume) = @_; 1337 1338 my $log = $self->log; 1339 my $sql = $self->sql; 1340 my $db = $self->db($key); 1248 my $log = $self->log; 1249 my $sql = $self->sql; 1250 my $db = $self->db; 1341 1251 1342 1252 no warnings qw( uninitialized ); 1343 1253 $log->debug( "entered - @_" ); 1344 1254 use warnings; 1255 1256 my ($name, $soft_volume) = @_; 1345 1257 1346 1258 my ($vol_id, $vol_host, $vol_path, $xattr); … … 1359 1271 # find it, fall back to any volume 1360 1272 if ($soft_volume) { 1361 ($vol_id, $vol_host, $vol_path, $xattr) = $self->_get_storage_volume ($key);1273 ($vol_id, $vol_host, $vol_path, $xattr) = $self->_get_storage_volume; 1362 1274 return; # this just returns out of the eval not from the subroutine 1363 1275 } … … 1399 1311 my $self = shift; 1400 1312 1401 my $key = shift; 1402 1403 my $log = $self->log; 1404 my $sql = $self->sql; 1405 my $db = $self->db($key); 1313 my $log = $self->log; 1314 my $sql = $self->sql; 1315 my $db =$self->db; 1406 1316 1407 1317 no warnings qw( uninitialized ); … … 1409 1319 use warnings; 1410 1320 1321 my $key = shift; 1411 1322 1412 1323 $key = parse_neb_key($key); … … 1450 1361 my $log = $self->log; 1451 1362 my $sql = $self->sql; 1452 my $db = $self->db($key);1363 my $db =$self->db; 1453 1364 1454 1365 $key = parse_neb_key($key); … … 1477 1388 sub _is_valid_volume_name 1478 1389 { 1479 my ($self, $ key, $vol_name) = @_;1480 1481 my $log = $self->log; 1482 my $sql = $self->sql; 1483 my $db = $self->db($key);1390 my ($self, $vol_name) = @_; 1391 1392 my $log = $self->log; 1393 my $sql = $self->sql; 1394 my $db =$self->db; 1484 1395 1485 1396 my $volume_info = parse_neb_volume($vol_name); … … 1518 1429 my $log = $self->log; 1519 1430 my $sql = $self->sql; 1520 my $db = $self->db ($key);1431 my $db = $self->db; 1521 1432 1522 1433 my $uri; … … 1647 1558 my $log = $self->log; 1648 1559 my $sql = $self->sql; 1649 # my $db =$self->db;1560 my $db =$self->db; 1650 1561 1651 1562 $log->debug( "entered" ); 1652 1563 1653 #$self->db->disconnect;1654 1655 #$log->debug( "disconnected from database: ", sub { $db->data_sources; } );1564 $self->db->disconnect; 1565 1566 $log->debug( "disconnected from database: ", sub { $db->data_sources; } ); 1656 1567 1657 1568 $log->debug( "leaving" ); -
trunk/Nebulous-Server/lib/Nebulous/Server/Config.pm
r20965 r20990 1 1 # Copyright (C) 2005 Joshua Hoblitt 2 2 # 3 # $Id: Config.pm,v 1. 4 2008-12-12 21:13:41 jhoblittExp $3 # $Id: Config.pm,v 1.5 2008-12-14 22:54:25 eugene Exp $ 4 4 5 5 package Nebulous::Server::Config; … … 8 8 use warnings FATAL => qw( all ); 9 9 10 our $VERSION = 0.0 3;10 our $VERSION = 0.02; 11 11 12 12 use base qw( Class::Accessor::Fast ); 13 13 14 14 use Log::Log4perl qw( :levels ); 15 use Params::Validate qw( validate validate_posSCALAR );15 use Params::Validate qw( validate SCALAR ); 16 16 17 17 our %LEVELS = ( … … 25 25 ); 26 26 27 my $db_validate = { 28 dbindex => { 29 type => SCALAR, 30 regex => qr/^\d+$/, 31 }, 27 my $new_validate = { 32 28 dsn => { type => SCALAR }, 33 29 dbuser => { type => SCALAR }, 34 30 dbpasswd => { type => SCALAR }, 35 };36 37 my $new_validate = {38 31 log_level => { 39 32 type => SCALAR, … … 46 39 }, 47 40 }, 48 dsn => { type => SCALAR, optional => 1 },49 dbuser => { type => SCALAR, optional => 1 },50 dbpasswd => { type => SCALAR, optional => 1 },51 41 }; 52 42 53 43 __PACKAGE__->mk_ro_accessors( keys %$new_validate ); 54 44 55 56 sub new 57 { 45 sub init { 58 46 my $class = shift; 59 47 … … 61 49 62 50 # normalize log levels to lower-case 63 my $self ={ log_level => lc $p{ log_level } }; 51 $p{ log_level } = lc $p{ log_level }; 52 53 my $self = \%p; 64 54 65 55 bless $self, $class || ref $class; 66 67 my @dbs;68 $self->{dbs} = \@dbs;69 70 if (defined $p{dsn} or defined $p{dbuser} or defined $p{dbpasswd}) {71 $self->add_db(72 dbindex => 0,73 dsn => $p{dsn},74 dbuser => $p{dbuser},75 dbpasswd => $p{dbpasswd},76 );77 }78 56 79 57 return $self; 80 58 } 81 59 82 83 sub add_db84 {85 my $self = shift;86 87 my %p = validate( @_, $db_validate );88 89 my $config_db = Nebulous::Server::Config::DB->new({90 dsn => $p{dsn},91 dbuser => $p{dbuser},92 dbpasswd => $p{dbpasswd},93 });94 95 $self->{dbs}->[$p{dbindex}] = $config_db;96 97 return $self;98 }99 100 101 sub db102 {103 my $self = shift;104 105 my ($db_index) = validate_pos( @_, { type => SCALAR, optional => 1, });106 107 # default to 0108 $db_index ||= 0;109 110 return $self->{dbs}->[$db_index];111 }112 113 114 sub n_db115 {116 my $self = shift;117 118 return scalar @{ $self->{dbs} };119 }120 121 122 package Nebulous::Server::Config::DB;123 124 use strict;125 use warnings FATAL => qw( all );126 127 our $VERSION = 0.01;128 129 use base qw( Class::Accessor::Fast );130 131 __PACKAGE__->mk_ro_accessors(qw( dsn dbuser dbpasswd ));132 133 60 1; 134 61 -
trunk/Nebulous-Server/lib/Nebulous/Server/Log.pm
r20965 r20990 1 1 # Copyright (c) 2004 Joshua Hoblitt 2 2 # 3 # $Id: Log.pm,v 1. 8 2008-12-12 21:13:41 jhoblittExp $3 # $Id: Log.pm,v 1.9 2008-12-14 22:54:25 eugene Exp $ 4 4 5 5 package Nebulous::Server::Log; … … 16 16 my ($self, $config) = @_; 17 17 18 # my $dsn = $config->db->dsn;19 # my $dbuser = $config->db->dbuser;20 # my $dbpasswd = $config->db->dbpasswd;18 my $dsn = $config->dsn; 19 my $dbuser = $config->dbuser; 20 my $dbpasswd = $config->dbpasswd; 21 21 22 22 my $conf = <<END; … … 30 30 # date | hostname | priority | method/sub - message\n 31 31 32 #log4perl.appender.SQLLOG = Log::Log4perl::Appender::DBI33 # log4perl.appender.SQLLOG.sql = \ 34 # log4perl.appender.SQLLOG.datasource = 35 # log4perl.appender.SQLLOG.username = 36 # log4perl.appender.SQLLOG.password = 32 log4perl.appender.SQLLOG = Log::Log4perl::Appender::DBI 33 log4perl.appender.SQLLOG.datasource = $dsn 34 log4perl.appender.SQLLOG.username = $dbuser 35 log4perl.appender.SQLLOG.password = $dbpasswd 36 log4perl.appender.SQLLOG.sql = \ 37 37 INSERT INTO log (timestamp, hostname, level, sub, message) \ 38 38 VALUES (%d, %H, %p, %M, %m) -
trunk/Nebulous-Server/lib/Nebulous/Server/SOAP.pm
r20972 r20990 1 1 # Copyright (c) 2004 Joshua Hoblitt 2 2 # 3 # $Id: SOAP.pm,v 1. 5 2008-12-13 00:41:15 jhoblittExp $3 # $Id: SOAP.pm,v 1.6 2008-12-14 22:54:25 eugene Exp $ 4 4 5 5 package Nebulous::Server::SOAP; … … 17 17 our $AUTOLOAD; 18 18 19 our $config;19 our @args; 20 20 our $neb; 21 21 22 23 sub new_on_init 24 { 22 sub new_on_init { 25 23 my $self = shift; 26 24 … … 29 27 require Apache2::ServerUtil; 30 28 31 $config = shift;29 @args = @_; 32 30 33 31 my $s = Apache2::ServerUtil->server; … … 37 35 } 38 36 39 40 sub init 41 { 37 sub init { 42 38 my $self = shift; 43 39 44 $neb = Nebulous::Server->new _from_config($config);40 $neb = Nebulous::Server->new(@args); 45 41 46 42 return Apache2::Const::OK; 47 43 } 48 44 49 50 sub AUTOLOAD 51 { 45 sub AUTOLOAD { 52 46 my $self = shift; 53 47 … … 82 76 } 83 77 84 85 78 1; -
trunk/Nebulous-Server/lib/Nebulous/Server/SQL.pm
r20966 r20990 1 1 # Copyright (c) 2004 Joshua Hoblitt 2 2 # 3 # $Id: SQL.pm,v 1.7 7 2008-12-12 21:41:07 jhoblittExp $3 # $Id: SQL.pm,v 1.78 2008-12-14 22:54:25 eugene Exp $ 4 4 5 5 package Nebulous::Server::SQL; … … 8 8 use warnings FATAL => qw( all ); 9 9 10 our $VERSION = '0.0 3';10 our $VERSION = '0.02'; 11 11 12 12 use base qw( Class::Accessor::Fast ); … … 47 47 (so_id, vol_id, uri) 48 48 VALUES (?, ?, 'error') 49 },50 get_all_instances => qq{51 SELECT * FROM INSTANCE52 WHERE so_id = ?53 49 }, 54 50 get_object => qq{ … … 328 324 HAVING available_instances < instances OR instances < copies 329 325 }, 330 find_objects_with_extra_instances _by_xattr=> qq{331 SELECT 332 s o.so_id,333 so.ext_id,326 find_objects_with_extra_instances => qq{ 327 SELECT 328 storage_object.so_id, 329 ext_id, 334 330 count(ins_id) as instances, 335 mv.name as volume_name, 336 mv.host as volume_host, 337 count(mv.vol_id) as available_instances, 338 xattr.value as copies 339 FROM storage_object AS so 340 JOIN storage_object_xattr as xattr 341 ON so.so_id = xattr.so_id 342 AND xattr.name = 'user.copies' 343 JOIN instance AS i 344 ON so.so_id = i.so_id 345 JOIN mountedvol AS mv 331 volume.name as volume_name, 332 volume.host as volume_host, 333 count(mymountedvol.vol_id) as available_instances, 334 count(mymountedvol.vol_id) > 0 as recoverable, 335 storage_object_xattr.value as copies 336 FROM storage_object 337 JOIN instance 338 USING(so_id) 339 JOIN volume 340 USING(vol_id) 341 LEFT JOIN storage_object_xattr 342 ON storage_object.so_id = storage_object_xattr.so_id 343 JOIN mymountedvol 346 344 USING(vol_id) 347 345 WHERE 348 mv.available = 1 346 mymountedvol.available = 1 347 AND storage_object_xattr.name = 'user.copies' 349 348 GROUP BY so_id 350 349 HAVING available_instances > copies 351 limit 5;352 350 }, 353 351 get_mounted_volumes => qq{ -
trunk/Nebulous-Server/t/02_server_setup.t
r20965 r20990 3 3 # Copryight (C) 2004-2005 Joshua Hoblitt 4 4 # 5 # $Id: 02_server_setup.t,v 1. 7 2008-12-12 21:13:41 jhoblittExp $5 # $Id: 02_server_setup.t,v 1.8 2008-12-14 22:54:25 eugene Exp $ 6 6 7 7 use strict; 8 8 use warnings; 9 9 10 use Test::More tests => 6;10 use Test::More tests => 2; 11 11 12 12 use lib qw( ./t ./lib ); … … 17 17 Test::Nebulous->setup; 18 18 19 isa_ok(Nebulous::Server->new(), "Nebulous::Server"); 19 isa_ok( 20 Nebulous::Server->new( 21 dsn => $NEB_DB, 22 dbuser => $NEB_USER, 23 dbpasswd => $NEB_PASS, 24 ), 25 "Nebulous::Server" 26 ); 20 27 21 28 Test::Nebulous->setup; 22 29 23 # ->new() 24 { 25 my $neb = Nebulous::Server->new( log_level => 'off' ); 26 27 ok($neb, "set log level"); 28 } 29 30 Test::Nebulous->setup; 31 32 { 33 my $neb = Nebulous::Server->new( 30 eval { 31 Nebulous::Server->new( 34 32 dsn => "DBI:mysql:database=foobar:host=localhost", 35 33 dbuser => "baz", 36 34 dbpasswd =>"boo", 37 35 ); 38 39 ok($neb, "set database"); 40 } 41 42 Test::Nebulous->setup; 43 44 # add dbs after ->new() 45 { 46 my $neb = Nebulous::Server->new; 47 48 ok($neb->config->add_db( 49 dbindex => 0, 50 dsn => "DBI:mysql:database=foobar:host=localhost", 51 dbuser => "baz", 52 dbpasswd =>"boo", 53 ), "add db"); 54 55 ok($neb->config->add_db( 56 dbindex => 1, 57 dsn => "DBI:mysql:database=foobar:host=localhost", 58 dbuser => "baz", 59 dbpasswd =>"boo", 60 ), "add dbs"); 61 62 is($neb->config->n_db, 2, "n dbs") 63 } 36 }; 37 like( $@, qr/DBI connect.*? failed/, "bad dsn/user/pass" ); 64 38 65 39 Test::Nebulous->cleanup; -
trunk/Nebulous-Server/t/08_server_delete_instance.t
r20965 r20990 3 3 # Copryight (C) 2004-2005 Joshua Hoblitt 4 4 # 5 # $Id: 08_server_delete_instance.t,v 1.1 1 2008-12-12 21:13:41 jhoblittExp $5 # $Id: 08_server_delete_instance.t,v 1.12 2008-12-14 22:54:25 eugene Exp $ 6 6 7 7 use strict; … … 24 24 25 25 { 26 my $key = "foo"; 27 my $uri = $neb->create_object($key); 26 my $uri = $neb->create_object("foo"); 28 27 29 ok($neb->delete_instance($ key, $uri), "delete instance");28 ok($neb->delete_instance($uri), "delete instance"); 30 29 } 31 30 … … 33 32 34 33 { 35 my $key = "foo"; 36 my $uri1 = $neb->create_object($key); 37 my $uri2 = $neb->replicate_object($key); 34 my $uri1 = $neb->create_object("foo"); 35 my $uri2 = $neb->replicate_object("foo"); 38 36 39 ok($neb->delete_instance($ key, $uri1), "delete instance");37 ok($neb->delete_instance($uri1), "delete instance"); 40 38 41 my $locations = $neb->find_instances( $key);39 my $locations = $neb->find_instances("foo"); 42 40 43 41 is($locations->[0], $uri2, "instance remains"); 44 42 45 ok($neb->delete_instance( $key, $uri2), "delete instance");43 ok($neb->delete_instance( $uri2 ), "delete instance"); 46 44 47 45 eval { 48 $neb->find_instances( $key);46 $neb->find_instances("foo"); 49 47 }; 50 48 like($@, qr/is valid object key/, "storage object was deleted"); … … 54 52 55 53 eval { 56 my $key = "foo"; 57 my $uri1 = $neb->create_object($key); 58 59 $neb->delete_instance($key, "file:/foo"); 54 $neb->delete_instance("file:/foo"); 60 55 }; 61 56 like($@, qr/no instance is associated with uri/, "uri does not exist"); … … 66 61 $neb->delete_instance(); 67 62 }; 68 like($@, qr/ 2 wereexpected/, "no params");63 like($@, qr/1 was expected/, "no params"); 69 64 70 65 Test::Nebulous->setup; 71 66 72 67 eval { 73 my $key = "foo"; 74 my $uri1 = $neb->create_object($key); 75 76 $neb->delete_instance("foo", 2, 3); 68 $neb->delete_instance("foo", 2); 77 69 }; 78 like($@, qr/ 2 wereexpected/, "too many params");70 like($@, qr/1 was expected/, "too many params"); 79 71 80 72 Test::Nebulous->cleanup; -
trunk/Nebulous-Server/t/10_server_is_valid_volume_name.t
r20965 r20990 3 3 # Copryight (C) 2004-2005 Joshua Hoblitt 4 4 # 5 # $Id: 10_server_is_valid_volume_name.t,v 1. 6 2008-12-12 21:13:41 jhoblittExp $5 # $Id: 10_server_is_valid_volume_name.t,v 1.7 2008-12-14 22:54:25 eugene Exp $ 6 6 7 7 use strict; … … 23 23 Test::Nebulous->setup; 24 24 25 ok($neb->_is_valid_volume_name(' foo', 'node01'), "valid volume name");25 ok($neb->_is_valid_volume_name('node01'), "valid volume name"); 26 26 27 27 Test::Nebulous->setup; 28 28 29 ok($neb->_is_valid_volume_name(' foo', 'node02'), "valid volume name");29 ok($neb->_is_valid_volume_name('node02'), "valid volume name"); 30 30 31 31 Test::Nebulous->setup; 32 32 33 is($neb->_is_valid_volume_name(' foo', 'node99'), undef, "invalid volume name");33 is($neb->_is_valid_volume_name('node99'), undef, "invalid volume name"); 34 34 35 35 Test::Nebulous->cleanup;
Note:
See TracChangeset
for help on using the changeset viewer.
