TMP selftest: Samba3: add a clusteredmember environment
authorMichael Adam <obnox@samba.org>
Thu, 20 Oct 2011 10:58:43 +0000 (12:58 +0200)
committerMichael Adam <obnox@samba.org>
Thu, 20 Oct 2011 10:58:43 +0000 (12:58 +0200)
selftest/target/Samba3.pm

index 2f23ae3c1687545b44ffe36ebc7153b70bfbe915..89ef2e98923fe6f19666f94c893ece77b58f1b2f 100755 (executable)
@@ -32,16 +32,19 @@ sub teardown_env($$)
        my $smbdpid = read_pid($envvars, "smbd");
        my $nmbdpid = read_pid($envvars, "nmbd");
        my $winbinddpid = read_pid($envvars, "winbindd");
+       my $ctdbdpid = read_pid($envvars, "ctdbd");
 
        $self->stop_sig_term($smbdpid);
        $self->stop_sig_term($nmbdpid);
        $self->stop_sig_term($winbinddpid);
+       $self->stop_sig_term($ctdbdpid);
 
        sleep(2);
 
        $self->stop_sig_kill($smbdpid);
        $self->stop_sig_kill($nmbdpid);
        $self->stop_sig_kill($winbinddpid);
+       $self->stop_sig_kill($ctdbdpid);
 
        return 0;
 }
@@ -53,6 +56,10 @@ sub getlog_env_app($$$)
        my $title = "$name LOG of: $envvars->{NETBIOSNAME}\n";
        my $out = $title;
 
+       unless (exists($envvars->{$name."_TEST_LOG"})) {
+               die "getlog_env_app: \$envvars->{".$name."_TEST_LOG} not set\n";
+       }
+
        open(LOG, "<".$envvars->{$name."_TEST_LOG"});
 
        seek(LOG, $envvars->{$name."_TEST_LOG_POS"}, SEEK_SET);
@@ -79,6 +86,14 @@ sub getlog_env($$)
        return $ret;
 }
 
+sub getlog_env_ctdb($$)
+{
+       my ($self, $envvars) = @_;
+       my $ret = "";
+
+       $ret .= $self->getlog_env_app($envvars, "CTDBD");
+}
+
 sub check_env($$)
 {
        my ($self, $envvars) = @_;
@@ -113,6 +128,15 @@ sub setup_env($$$)
                        }
                }
                return $self->setup_member("$path/member", $self->{vars}->{s3dc});
+       } elsif ($envname eq "clusteredmember") {
+               if (not defined($self->{vars}->{s3dc})) {
+                       if (not defined($self->setup_s3dc("$path/s3dc"))) {
+                               return undef;
+                       }
+               }
+               return $self->setup_clusteredmember("$path/clusteredmember",
+                                                   $self->{vars}->{s3dc},
+                                                   "$path/ctdb");
        } else {
                return undef;
        }
@@ -200,6 +224,59 @@ sub setup_member($$$)
        return $ret;
 }
 
+sub setup_clusteredmember($$$$)
+{
+       my ($self, $prefix, $s3dcvars, $ctdbprefix) = @_;
+       my $public_if = 8;
+
+       my $ctdb_vars = $self->setup_ctdb($ctdbprefix, $public_if);
+
+       $ctdb_vars or return undef;
+
+       print "PROVISIONING CLUSTEREDMEMBER...";
+
+       my $member_options = "
+       security = domain
+       server signing = on
+       clustering = yes
+       ctdbd socket = $ctdb_vars->{SOCKET_FILE}
+";
+       my $ret = $self->provision($prefix,
+                                  "LOCALMEMBER3CLUSTERED",
+                                  $public_if,
+                                  "localmember3pass",
+                                  $member_options);
+
+       $ret or return undef;
+
+       my $net = Samba::bindir_path($self, "net");
+       my $cmd = "";
+       $cmd .= "SOCKET_WRAPPER_DEFAULT_IFACE=\"$ret->{SOCKET_WRAPPER_DEFAULT_IFACE}\" ";
+       $cmd .= "$net join $ret->{CONFIGURATION} $s3dcvars->{DOMAIN} member";
+       $cmd .= " -U$s3dcvars->{USERNAME}\%$s3dcvars->{PASSWORD}";
+
+       if (system($cmd) != 0) {
+           warn("Join failed\n$cmd");
+           return undef;
+       }
+
+       $self->check_or_start($ret, "yes", "yes", "yes");
+
+       if (not $self->wait_for_start($ret)) {
+              return undef;
+       }
+
+       $ret->{DC_SERVER} = $s3dcvars->{SERVER};
+       $ret->{DC_SERVER_IP} = $s3dcvars->{SERVER_IP};
+       $ret->{DC_NETBIOSNAME} = $s3dcvars->{NETBIOSNAME};
+       $ret->{DC_USERNAME} = $s3dcvars->{USERNAME};
+       $ret->{DC_PASSWORD} = $s3dcvars->{PASSWORD};
+
+       $ret->{CTDB_SOCKET_FILE} = $ctdb_vars->{SOCKET_FILE};
+
+       return $ret;
+}
+
 sub setup_admember($$$$)
 {
        my ($self, $prefix, $dcvars, $iface) = @_;
@@ -556,7 +633,7 @@ sub read_pid($$)
        return $pid;
 }
 
-sub check_or_start($$$$$) {
+sub check_or_start($$$$) {
        my ($self, $env_vars, $nmbd, $winbindd, $smbd) = @_;
 
        unlink($env_vars->{NMBD_TEST_LOG});
@@ -1137,4 +1214,181 @@ sub wait_for_start($$)
        return 1;
 }
 
+
+##
+## provision and start of ctdb
+##
+
+sub setup_ctdb($$)
+{
+       my ($self, $prefix, $public_if) = @_;
+
+       print "PROVISIONING CTDB...";
+
+       # Give it a high ip that is (hopfully) not used elsewhere.
+       # What is the mechanism here?
+       my $private_if = 100;
+
+       my $vars = $self->provision_ctdb($prefix, $public_if, $private_if);
+
+       $vars or return undef;
+
+       $self->check_or_start_ctdb($vars);
+
+       if (not $self->wait_for_start_ctdb($vars)) {
+               return undef;
+       }
+
+       # TODO $vars->... ?
+
+       $self->{vars}->{ctdb} = $vars;
+
+       return $vars;
+}
+
+sub check_or_start_ctdb($$) {
+       my ($self, $env_vars) = @_;
+
+       unlink($env_vars->{CTDB_TEST_LOG});
+       print "STARTING CTDB...";
+       my $pid = fork();
+       if ($pid == 0) {
+               open STDOUT, ">$env_vars->{CTDB_TEST_LOG}";
+               open STDERR, '>&STDOUT';
+
+               my @preargs = (Samba::bindir_path($self, "timelimit"), $self->{server_maxtime});
+               if(defined($ENV{CTDBD_VALGRIND})) {
+                       @preargs = split(/ /, $ENV{CTDBD_VALGRIND});
+               }
+
+               exec(@preargs, "$env_vars->{BINDIR}/ctdbd",
+                       "--socket=$env_vars->{SOCKET_FILE}",
+                       "--reclock=$env_vars->{RECLOCK_FILE}",
+                       "--nlist=$env_vars->{NODES_FILE}",
+                       "--nopublicipcheck",
+                       "--public-addresses=$env_vars->{PUBLIC_ADDRESSES_FILE}",
+                       "--event-script-dir=$env_vars->{EVENT_SCRIPT_DIR}",
+                       "--logfile=$env_vars->{LOG_FILE}",
+                       "-d $env_vars->{DEBUG_LEVEL}",
+                       "--dbdir=$env_vars->{DB_DIR}",
+                       "--dbdir-persistent=$env_vars->{DB_DIR_PERSISTENT}",
+                       "--dbdir-state=$env_vars->{DB_DIR_STATE}",
+                       ) or die("Unable to start ctdbd: $!");
+       }
+       write_pid($env_vars, "ctdbd", $pid);
+       print "DONE\n";
+
+       return 0;
+}
+
+sub provision_ctdb($$$$$)
+{
+       my ($self, $prefix, $priviface, $pubiface, $no_delete_prefix) = @_;
+
+       my %ret = ();
+
+       my $internal_ip = "127.0.0.$priviface";
+       my $public_ip = "127.0.0.$pubiface";
+
+       my @dirs = ();
+
+       my $prefix_abs = abs_path($prefix);
+
+       my $bindir = "$prefix_abs/bin";
+       push @dirs, $bindir;
+
+       my $var_dir = "$prefix_abs/var";
+       push @dirs, $var_dir;
+
+       my $reclock_file = "$var_dir/reck.lock";
+       my $socket_file = "$var_dir/ctdb.socket";
+       my $log_file = "$var_dir/log.ctdb";
+
+       my $db_dir = "$var_dir/ctdb";
+       push @dirs, $db_dir;
+
+       my $db_dir_persistent = "$db_dir/persistent";
+       push @dirs, $db_dir_persistent;
+
+       my $db_dir_state = "$db_dir/state";
+       push @dirs, $db_dir_state;
+
+       my $ctdb_dir = "$prefix_abs/etc/ctdb";
+       push @dirs, $ctdb_dir;
+
+       my $nodes_file = "$ctdb_dir/nodes";
+       my $public_addresses_file = "$ctdb_dir/public_addresses";
+
+       my $event_script_dir = "$ctdb_dir/events.d";
+       push @dirs, $event_script_dir;
+
+       #
+       # check / create directories:
+       #
+       die ("prefix_abs = ''") if $prefix_abs eq "";
+       die ("prefix_abs = '/'") if $prefix_abs eq "/";
+
+       mkdir ($prefix_abs, 0777);
+       print "CREATE CTDB TEST ENVIRONMENT in '$prefix_abs'...";
+
+       if (not defined($no_delete_prefix) or not $no_delete_prefix) {
+               system("rm -rf $prefix_abs/*");
+       }
+
+       mkdir($_, 0777) foreach(@dirs);
+
+       # - setup nodes
+       unless (open(NODES, ">$nodes_file")) {
+               warn("Unable to open nodesfile '$nodes_file'");
+               return undef;
+       }
+       print NODES "$internal_ip";
+       close(NODES);
+
+       # - setup public-addresses
+       unless(open(PUBLIC_ADDR, ">$public_addresses_file")) {
+               warn("Unable to open public addresses file '$public_addresses_file'");
+               return undef;
+       }
+       print PUBLIC_ADDR "$public_addresses_file/128 lo";
+       close(PUBLIC_ADDR);
+
+
+       $ret{CTDBD_TEST_LOG} = "$prefix/ctdbd_test.log";
+       $ret{CTDBD_TEST_LOG_POS} = 0;
+
+       $ret{NODES_FILE} = $nodes_file;
+       $ret{PUBLIC_ADDRESSES_FILE} = $public_addresses_file;
+       $ret{RECLOCK_FILE} = $reclock_file;
+       $ret{SOCKET_FILE} = $socket_file;
+       $ret{DB_DIR} = $db_dir;
+       $ret{DB_DIR_PERSISTENT} = $db_dir_persistent;
+       $ret{DB_DIR_STATE} = $db_dir_state;
+       $ret{LOG_FILE} = $log_file;
+       $ret{EVENT_SCRIPT_DIR} = $event_script_dir;
+       $ret{PUBLIC_INTERFACE} = "lo";
+       $ret{DEBUG_LEVEL} = 0;
+
+       $ret{BINDIR} = $bindir;
+
+       return \%ret;
+}
+
+sub wait_for_start_ctdb($$)
+{
+       my ($self, $envvars) = @_;
+
+       print "wait for ctdbd\n";
+
+       sleep(5);
+
+       # TODO
+
+       # - run ctdb status...
+
+       print $self->getlog_env_ctdb($envvars);
+
+       return 1;
+}
+
 1;