From 962e8a0ea7db79b96dddec06a4bde211eea0d1d6 Mon Sep 17 00:00:00 2001 From: Jamie McClymont Date: Wed, 21 Feb 2018 13:33:49 +1300 Subject: [PATCH] selftest: move to declaratively specifying environments and their dependencies This removes the tangle of code for starting up dependencies, and allows selftest.pl to query dependencies (hence it can know when things can be shut down early and how to order environments for optimal memory usage - that patch not yet submitted). It also removes the slightly hacky special-casing of the ad_members, and sets $target->{vars} centrally (so each setup_ function does not need to). Signed-off-by: Jamie McClymont Reviewed-by: Douglas Bagnall Reviewed-by: Andrew Bartlett --- selftest/selftest.pl | 14 ++-- selftest/target/Samba.pm | 72 +++++++++++++---- selftest/target/Samba3.pm | 79 +++++------------- selftest/target/Samba4.pm | 163 +++++++++----------------------------- 4 files changed, 118 insertions(+), 210 deletions(-) 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; }