diff --git a/selftest/selftest.pl b/selftest/selftest.pl index 64fb9f85d3a..c48e1926520 100755 --- a/selftest/selftest.pl +++ b/selftest/selftest.pl @@ -85,7 +85,12 @@ sub find_in_list($$) sub skip { - my ($name) = @_; + my ($name, $envname) = @_; + my ($env_basename, $env_localpart) = split(/:/, $envname); + + if ($opt_target eq "samba3" && $Samba::ENV_NEEDS_AD_DC{$env_basename}) { + return "environment $envname is disabled as this build does not include an AD DC"; + } return find_in_list(\@excludes, $name); } @@ -449,15 +454,12 @@ if (defined($ENV{SMBD_MAXTIME}) and $ENV{SMBD_MAXTIME} ne "") { $server_maxtime = $ENV{SMBD_MAXTIME}; } +$target = new Samba($bindir, $ldap, $srcdir, $server_maxtime); unless ($opt_list) { if ($opt_target eq "samba") { $testenv_default = "ad_dc"; - require target::Samba; - $target = new Samba($bindir, $ldap, $srcdir, $server_maxtime); } elsif ($opt_target eq "samba3") { $testenv_default = "nt4_member"; - require target::Samba3; - $target = new Samba3($bindir, $srcdir_abs, $server_maxtime); } } @@ -725,7 +727,7 @@ $individual_tests = {}; foreach my $testsuite (@available) { my $name = $$testsuite[0]; - my $skipreason = skip($name); + my $skipreason = skip(@$testsuite); if (defined($restricted)) { # Find the testsuite for this test my $match = undef; diff --git a/selftest/target/Samba.pm b/selftest/target/Samba.pm index ba0cc7d0adb..f25507f7201 100644 --- a/selftest/target/Samba.pm +++ b/selftest/target/Samba.pm @@ -22,33 +22,71 @@ sub new($$$$$) { return $self; } +%Samba::ENV_DEPS = (%Samba3::ENV_DEPS, %Samba4::ENV_DEPS); +our %ENV_DEPS; + +%Samba::ENV_TARGETS = ( + (map { $_ => "Samba3" } keys %Samba3::ENV_DEPS), + (map { $_ => "Samba4" } keys %Samba4::ENV_DEPS), +); +our %ENV_TARGETS; + +%Samba::ENV_NEEDS_AD_DC = ( + (map { $_ => 1 } keys %Samba4::ENV_DEPS) +); +our %ENV_NEEDS_AD_DC; +foreach my $env (keys %Samba3::ENV_DEPS) { + $ENV_NEEDS_AD_DC{$env} = ($env =~ /^ad_/); +} + sub setup_env($$$) { my ($self, $envname, $path) = @_; - $ENV{ENVNAME} = $envname; - - my $env = $self->{samba4}->setup_env($envname, $path); - if (defined($env) and $env ne "UNKNOWN") { - if (not defined($env->{target})) { - $env->{target} = $self->{samba4}; - } - } elsif (defined($env) and $env eq "UNKNOWN") { - $env = $self->{samba3}->setup_env($envname, $path); - if (defined($env) and $env ne "UNKNOWN") { - if (not defined($env->{target})) { - $env->{target} = $self->{samba3}; - } - } - } - if (defined($env) and ($env eq "UNKNOWN")) { + my $targetname = $ENV_TARGETS{$envname}; + if (not defined($targetname)) { warn("Samba can't provide environment '$envname'"); return "UNKNOWN"; } - if (not defined $env) { + + my %targetlookup = ( + "Samba3" => $self->{samba3}, + "Samba4" => $self->{samba4} + ); + my $target = $targetlookup{$targetname}; + + if (defined($target->{vars}->{$envname})) { + return $target->{vars}->{$envname}; + } + + my @dep_vars; + foreach(@{$ENV_DEPS{$envname}}) { + my $vars = $self->setup_env($_, $path); + if (defined($vars)) { + push(@dep_vars, $vars); + } else { + warn("Failed setting up $_ as a dependency of $envname"); + return undef; + } + } + + $ENV{ENVNAME} = $envname; + # Avoid hitting system krb5.conf - + # An env that needs Kerberos will reset this to the real value. + $ENV{KRB5_CONFIG} = "$path/no_krb5.conf"; + + my $setup_name = $ENV_TARGETS{$envname}."::setup_".$envname; + my $setup_sub = \&$setup_name; + my $env = &$setup_sub($target, "$path/$envname", @dep_vars); + + if (not defined($env)) { warn("failed to start up environment '$envname'"); return undef; } + + $target->{vars}->{$envname} = $env; + $target->{vars}->{$envname}->{target} = $target; + return $env; } diff --git a/selftest/target/Samba3.pm b/selftest/target/Samba3.pm index fc18954d0fa..e6c95fa991a 100755 --- a/selftest/target/Samba3.pm +++ b/selftest/target/Samba3.pm @@ -163,46 +163,26 @@ sub check_env($$) return 1; } -sub setup_env($$$) -{ - my ($self, $envname, $path) = @_; +# Declare the environments Samba3 makes available. +# To be set up, they will be called as +# samba3->setup_$envname($self, $path, $dep_1_vars, $dep_2_vars, ...) +%Samba3::ENV_DEPS = ( + # name => [dep_1, dep_2, ...], + nt4_dc => [], + nt4_dc_schannel => [], - $ENV{ENVNAME} = $envname; + simpleserver => [], + fileserver => [], + maptoguest => [], + ktest => [], - if (defined($self->{vars}->{$envname})) { - return $self->{vars}->{$envname}; - } + nt4_member => ["nt4_dc"], - # - # Avoid hitting system krb5.conf - - # An env that needs Kerberos will reset this to the real - # value. - # - $ENV{KRB5_CONFIG} = "$path/no_krb5.conf"; - - if ($envname eq "nt4_dc") { - return $self->setup_nt4_dc("$path/nt4_dc"); - } elsif ($envname eq "nt4_dc_schannel") { - return $self->setup_nt4_dc_schannel("$path/nt4_dc_schannel"); - } elsif ($envname eq "simpleserver") { - return $self->setup_simpleserver("$path/simpleserver"); - } elsif ($envname eq "fileserver") { - return $self->setup_fileserver("$path/fileserver"); - } elsif ($envname eq "maptoguest") { - return $self->setup_maptoguest("$path/maptoguest"); - } elsif ($envname eq "ktest") { - return $self->setup_ktest("$path/ktest"); - } elsif ($envname eq "nt4_member") { - if (not defined($self->{vars}->{nt4_dc})) { - if (not defined($self->setup_nt4_dc("$path/nt4_dc"))) { - return undef; - } - } - return $self->setup_nt4_member("$path/nt4_member", $self->{vars}->{nt4_dc}); - } else { - return "UNKNOWN"; - } -} + ad_member => ["ad_dc"], + ad_member_rfc2307 => ["ad_dc_ntvfs"], + ad_member_idmap_rid => ["ad_dc"], + ad_member_idmap_ad => ["ad_dc"], +); sub setup_nt4_dc { @@ -252,8 +232,6 @@ sub setup_nt4_dc $vars->{DC_USERNAME} = $vars->{USERNAME}; $vars->{DC_PASSWORD} = $vars->{PASSWORD}; - $self->{vars}->{nt4_dc} = $vars; - return $vars; } @@ -302,8 +280,6 @@ sub setup_nt4_dc_schannel $vars->{DC_USERNAME} = $vars->{USERNAME}; $vars->{DC_PASSWORD} = $vars->{PASSWORD}; - $self->{vars}->{nt4_dc_schannel} = $vars; - return $vars; } @@ -381,7 +357,7 @@ sub setup_nt4_member return $ret; } -sub setup_admember +sub setup_ad_member { my ($self, $prefix, $dcvars) = @_; @@ -501,13 +477,10 @@ sub setup_admember $ret->{DC_USERNAME} = $dcvars->{USERNAME}; $ret->{DC_PASSWORD} = $dcvars->{PASSWORD}; - # Special case, this is called from Samba4.pm but needs to use the Samba3 check_env and get_log_env - $ret->{target} = $self; - return $ret; } -sub setup_admember_rfc2307 +sub setup_ad_member_rfc2307 { my ($self, $prefix, $dcvars) = @_; @@ -597,9 +570,6 @@ sub setup_admember_rfc2307 $ret->{DC_USERNAME} = $dcvars->{USERNAME}; $ret->{DC_PASSWORD} = $dcvars->{PASSWORD}; - # Special case, this is called from Samba4.pm but needs to use the Samba3 check_env and get_log_env - $ret->{target} = $self; - return $ret; } @@ -685,9 +655,6 @@ sub setup_ad_member_idmap_rid $ret->{DC_USERNAME} = $dcvars->{USERNAME}; $ret->{DC_PASSWORD} = $dcvars->{PASSWORD}; - # Special case, this is called from Samba4.pm but needs to use the Samba3 check_env and get_log_env - $ret->{target} = $self; - return $ret; } @@ -774,9 +741,6 @@ sub setup_ad_member_idmap_ad $ret->{DC_USERNAME} = $dcvars->{USERNAME}; $ret->{DC_PASSWORD} = $dcvars->{PASSWORD}; - # Special case, this is called from Samba4.pm but needs to use the Samba3 check_env and get_log_env - $ret->{target} = $self; - return $ret; } @@ -829,8 +793,6 @@ sub setup_simpleserver return undef; } - $self->{vars}->{simpleserver} = $vars; - return $vars; } @@ -961,7 +923,6 @@ sub setup_fileserver return undef; } - $self->{vars}->{fileserver} = $vars; mkdir($_, 0777) foreach(@dirs); @@ -1139,8 +1100,6 @@ ntlm auth = yes return undef; } - $self->{vars}->{s3maptoguest} = $vars; - return $vars; } diff --git a/selftest/target/Samba4.pm b/selftest/target/Samba4.pm index 0cd2cf84321..fd4e4b61984 100755 --- a/selftest/target/Samba4.pm +++ b/selftest/target/Samba4.pm @@ -2063,111 +2063,37 @@ sub check_env($$) } else { return 1; } - } -sub setup_env($$$) -{ - my ($self, $envname, $path) = @_; - my $target3 = $self->{target3}; +# Declare the environments Samba4 makes available. +# To be set up, they will be called as +# samba4->setup_$envname($self, $path, $dep_1_vars, $dep_2_vars, ...) +%Samba4::ENV_DEPS = ( + # name => [dep_1, dep_2, ...], + ad_dc_ntvfs => [], + ad_dc => [], + ad_dc_no_nss => [], + ad_dc_no_ntlm => [], + ad_dc_ntvfs => [], - $ENV{ENVNAME} = $envname; + fl2008r2dc => ["ad_dc"], + fl2003dc => ["ad_dc"], + fl2000dc => [], - if (defined($self->{vars}->{$envname})) { - return $self->{vars}->{$envname}; - } + vampire_2000_dc => ["fl2000dc"], + vampire_dc => ["ad_dc_ntvfs"], + promoted_dc => ["ad_dc_ntvfs"], + subdom_dc => ["ad_dc_ntvfs"], - if ($envname eq "ad_dc_ntvfs") { - return $self->setup_ad_dc_ntvfs("$path/ad_dc_ntvfs"); - } elsif ($envname eq "fl2000dc") { - return $self->setup_fl2000dc("$path/fl2000dc"); - } elsif ($envname eq "vampire_2000_dc") { - if (not defined($self->{vars}->{fl2000dc})) { - $self->setup_fl2000dc("$path/fl2000dc"); - } - return $self->setup_vampire_dc("$path/vampire_2000_dc", $self->{vars}->{fl2000dc}, "2000"); - } elsif ($envname eq "fl2003dc") { - if (not defined($self->{vars}->{ad_dc})) { - $self->setup_ad_dc("$path/ad_dc"); - } - return $self->setup_fl2003dc("$path/fl2003dc", $self->{vars}->{ad_dc}); - } elsif ($envname eq "fl2008r2dc") { - if (not defined($self->{vars}->{ad_dc})) { - $self->setup_ad_dc("$path/ad_dc"); - } - return $self->setup_fl2008r2dc("$path/fl2008r2dc", $self->{vars}->{ad_dc}); - } elsif ($envname eq "rpc_proxy") { - if (not defined($self->{vars}->{ad_dc_ntvfs})) { - $self->setup_ad_dc_ntvfs("$path/ad_dc_ntvfs"); - } - return $self->setup_rpc_proxy("$path/rpc_proxy", $self->{vars}->{ad_dc_ntvfs}); - } elsif ($envname eq "vampire_dc") { - if (not defined($self->{vars}->{ad_dc_ntvfs})) { - $self->setup_ad_dc_ntvfs("$path/ad_dc_ntvfs"); - } - return $self->setup_vampire_dc("$path/vampire_dc", $self->{vars}->{ad_dc_ntvfs}, "2008"); - } elsif ($envname eq "promoted_dc") { - if (not defined($self->{vars}->{ad_dc_ntvfs})) { - $self->setup_ad_dc_ntvfs("$path/ad_dc_ntvfs"); - } - return $self->setup_promoted_dc("$path/promoted_dc", $self->{vars}->{ad_dc_ntvfs}); - } elsif ($envname eq "subdom_dc") { - if (not defined($self->{vars}->{ad_dc_ntvfs})) { - $self->setup_ad_dc_ntvfs("$path/ad_dc_ntvfs"); - } - return $self->setup_subdom_dc("$path/subdom_dc", $self->{vars}->{ad_dc_ntvfs}); - } elsif ($envname eq "s4member_dflt_domain") { - if (not defined($self->{vars}->{ad_dc_ntvfs})) { - $self->setup_ad_dc_ntvfs("$path/ad_dc_ntvfs"); - } - return $self->setup_s4member_dflt_domain("$path/s4member_dflt_domain", $self->{vars}->{ad_dc_ntvfs}); - } elsif ($envname eq "s4member") { - if (not defined($self->{vars}->{ad_dc_ntvfs})) { - $self->setup_ad_dc_ntvfs("$path/ad_dc_ntvfs"); - } - return $self->setup_s4member("$path/s4member", $self->{vars}->{ad_dc_ntvfs}); - } elsif ($envname eq "rodc") { - if (not defined($self->{vars}->{ad_dc_ntvfs})) { - $self->setup_ad_dc_ntvfs("$path/ad_dc_ntvfs"); - } - return $self->setup_rodc("$path/rodc", $self->{vars}->{ad_dc_ntvfs}); - } elsif ($envname eq "chgdcpass") { - return $self->setup_chgdcpass("$path/chgdcpass", $self->{vars}->{chgdcpass}); - } elsif ($envname eq "ad_member") { - if (not defined($self->{vars}->{ad_dc})) { - $self->setup_ad_dc("$path/ad_dc"); - } - return $target3->setup_admember("$path/ad_member", $self->{vars}->{ad_dc}, 29); - } elsif ($envname eq "ad_dc") { - return $self->setup_ad_dc("$path/ad_dc"); - } elsif ($envname eq "ad_dc_no_nss") { - return $self->setup_ad_dc_no_nss("$path/ad_dc_no_nss"); - } elsif ($envname eq "ad_dc_no_ntlm") { - return $self->setup_ad_dc_no_ntlm("$path/ad_dc_no_ntlm"); - } elsif ($envname eq "ad_member_rfc2307") { - if (not defined($self->{vars}->{ad_dc_ntvfs})) { - $self->setup_ad_dc_ntvfs("$path/ad_dc_ntvfs"); - } - return $target3->setup_admember_rfc2307("$path/ad_member_rfc2307", - $self->{vars}->{ad_dc_ntvfs}, 34); - } elsif ($envname eq "ad_member_idmap_rid") { - if (not defined($self->{vars}->{ad_dc})) { - $self->setup_ad_dc("$path/ad_dc"); - } - return $target3->setup_ad_member_idmap_rid("$path/ad_member_idmap_rid", - $self->{vars}->{ad_dc}); - } elsif ($envname eq "ad_member_idmap_ad") { - if (not defined($self->{vars}->{ad_dc})) { - $self->setup_ad_dc("$path/ad_dc"); - } - return $target3->setup_ad_member_idmap_ad("$path/ad_member_idmap_ad", - $self->{vars}->{ad_dc}); - } elsif ($envname eq "none") { - return $self->setup_none("$path/none"); - } else { - return "UNKNOWN"; - } -} + rodc => ["ad_dc_ntvfs"], + rpc_proxy => ["ad_dc_ntvfs"], + chgdcpass => [], + + s4member_dflt_domain => ["ad_dc_ntvfs"], + s4member => ["ad_dc_ntvfs"], + + none => [], +); sub setup_s4member { @@ -2179,8 +2105,6 @@ sub setup_s4member if (not defined($self->check_or_start($env, "standard"))) { return undef; } - - $self->{vars}->{s4member} = $env; } return $env; @@ -2197,8 +2121,6 @@ sub setup_s4member_dflt_domain if (not defined($self->check_or_start($env, "standard"))) { return undef; } - - $self->{vars}->{s4member_dflt_domain} = $env; } return $env; @@ -2214,8 +2136,6 @@ sub setup_rpc_proxy if (not defined($self->check_or_start($env, "standard"))) { return undef; } - - $self->{vars}->{rpc_proxy} = $env; } return $env; } @@ -2230,8 +2150,6 @@ sub setup_ad_dc_ntvfs warn("Failed to start ad_dc_ntvfs"); return undef; } - - $self->{vars}->{ad_dc_ntvfs} = $env; } return $env; } @@ -2245,8 +2163,6 @@ sub setup_chgdcpass if (not defined($self->check_or_start($env, "standard"))) { return undef; } - - $self->{vars}->{chgdcpass} = $env; } return $env; } @@ -2260,8 +2176,6 @@ sub setup_fl2000dc if (not defined($self->check_or_start($env, "standard"))) { return undef; } - - $self->{vars}->{fl2000dc} = $env; } return $env; @@ -2279,8 +2193,6 @@ sub setup_fl2003dc } $env = $self->setup_trust($env, $dc_vars, "external", "--no-aes-keys"); - - $self->{vars}->{fl2003dc} = $env; } return $env; } @@ -2302,14 +2214,22 @@ sub setup_fl2008r2dc $self->setup_namespaces($env, $upn_array, $spn_array); $env = $self->setup_trust($env, $dc_vars, "forest", ""); - - $self->{vars}->{fl2008r2dc} = $env; } return $env; } sub setup_vampire_dc +{ + return setup_generic_vampire_dc(@_, "2008"); +} + +sub setup_vampire_2000_dc +{ + return setup_generic_vampire_dc(@_, "2000"); +} + +sub setup_generic_vampire_dc { my ($self, $path, $dc_vars, $fl) = @_; @@ -2320,8 +2240,6 @@ sub setup_vampire_dc return undef; } - $self->{vars}->{vampire_dc} = $env; - # force replicated DC to update repsTo/repsFrom # for vampired partitions my $samba_tool = Samba::bindir_path($self, "samba-tool"); @@ -2396,8 +2314,6 @@ sub setup_promoted_dc return undef; } - $self->{vars}->{promoted_dc} = $env; - # force source and replicated DC to update repsTo/repsFrom # for vampired partitions my $samba_tool = Samba::bindir_path($self, "samba-tool"); @@ -2439,8 +2355,6 @@ sub setup_subdom_dc return undef; } - $self->{vars}->{subdom_dc} = $env; - # force replicated DC to update repsTo/repsFrom # for primary domain partitions my $samba_tool = Samba::bindir_path($self, "samba-tool"); @@ -2509,8 +2423,6 @@ sub setup_rodc return undef; } - $self->{vars}->{rodc} = $env; - return $env; } @@ -2538,7 +2450,6 @@ sub setup_ad_dc $self->setup_namespaces($env, $upn_array, $spn_array); - $self->{vars}->{ad_dc} = $env; return $env; } @@ -2569,7 +2480,6 @@ sub setup_ad_dc_no_nss $self->setup_namespaces($env, $upn_array, $spn_array); - $self->{vars}->{ad_dc_no_nss} = $env; return $env; } @@ -2598,7 +2508,6 @@ sub setup_ad_dc_no_ntlm $self->setup_namespaces($env, $upn_array, $spn_array); - $self->{vars}->{ad_dc_no_ntlm} = $env; return $env; }