Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

QAM public cloud enablement #8422

Merged
merged 1 commit into from Oct 14, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
7 changes: 7 additions & 0 deletions data/publiccloud/ssh_config
@@ -0,0 +1,7 @@
ControlMaster auto
ControlPath /tmp/ssh_%r_%h_%p
StrictHostKeyChecking no
HostKeyAlgorithms ssh-rsa
IdentityFile ~/.ssh/id_rsa
ControlPersist 86400

7 changes: 7 additions & 0 deletions lib/Utils/Backends.pm
Expand Up @@ -44,6 +44,7 @@ use constant {
CONSOLES => [
qw(
set_sshserial_dev
unset_sshserial_dev
use_ssh_serial_console
)
]
Expand All @@ -62,6 +63,12 @@ sub set_sshserial_dev {
bmwqemu::save_vars();
}

sub unset_sshserial_dev {
$serialdev = get_var('SERIALDEV_');
set_var('SERIALDEV', $serialdev);
bmwqemu::save_vars();
}

# Use it after SUT boot finish, as it requires ssh connection to SUT to
# interact with SUT, including window and serial console

Expand Down
22 changes: 15 additions & 7 deletions lib/consoletest.pm
Expand Up @@ -49,13 +49,21 @@ Method executed when run() finishes and the module has result => 'fail'

=cut
sub post_fail_hook {
my ($self) = shift;
select_console('log-console');
$self->SUPER::post_fail_hook;
$self->remount_tmp_if_ro;
$self->export_logs_basic;
# Export extra log after failure for further check gdm issue 1127317, also poo#45236 used for tracking action on Openqa
$self->export_logs_desktop;
# On Public Cloud everything is done via SSH so the code below doesn't work
# TODO: Make some reasonable base post_fail_hook for Public Cloud
unless (get_var('PUBLIC_CLOUD')) {
my ($self) = shift;
select_console('log-console');
$self->SUPER::post_fail_hook;
$self->remount_tmp_if_ro;
$self->export_logs_basic;
# Export extra log after failure for further check gdm issue 1127317, also poo#45236 used for tracking action on Openqa
$self->export_logs_desktop;
}
}

sub test_flags {
return get_var('PUBLIC_CLOUD') ? {no_rollback => 1} : {};
}

1;
46 changes: 28 additions & 18 deletions lib/main_common.pm
Expand Up @@ -1576,23 +1576,22 @@ sub load_extra_tests_console {
# JeOS kernel is missing 'openvswitch' kernel module
loadtest "console/openvswitch" unless is_jeos;
# dependency of git test
loadtest "console/sshd";
# start extra console tests from here
loadtest "console/sshd" unless get_var('PUBLIC_CLOUD');
loadtest "console/update_alternatives";
loadtest 'console/rpm';
loadtest 'console/slp';
# Audio device is not supported on ppc64le, s390x, JeOS, and Xen PV
if (!get_var("OFW") && !is_jeos && !check_var('VIRSH_VMM_FAMILY', 'xen') && !check_var('ARCH', 's390x')) {
# Audio device is not supported on ppc64le, s390x, JeOS, Public Cloud and Xen PV
if (!get_var('PUBLIC_CLOUD') && !get_var("OFW") && !is_jeos && !check_var('VIRSH_VMM_FAMILY', 'xen') && !check_var('ARCH', 's390x')) {
loadtest "console/aplay";
loadtest "console/soundtouch" if is_opensuse || (is_sle('12-sp4+') && is_sle('<15'));
# wavpack is available only sle12sp4 onwards
if (is_opensuse || is_sle '12-sp4+') {
loadtest "console/wavpack";
}
}
loadtest "console/libvorbis";
loadtest "console/command_not_found";
if (is_sle '12-sp2+') {
loadtest "console/libvorbis" unless get_var('PUBLIC_CLOUD');
loadtest "console/command_not_found" unless get_var('PUBLIC_CLOUD');
if (is_sle('12-sp2+') && !get_var('PUBLIC_CLOUD')) {
loadtest 'console/openssl_alpn';
loadtest 'console/autoyast_removed';
}
Expand All @@ -1601,19 +1600,19 @@ sub load_extra_tests_console {
loadtest "console/ntp_client" if (!is_sle || is_jeos);
loadtest "console/mta" unless is_jeos;
# We cannot change network device settings as rely on ssh/vnc connection to the machine
loadtest "console/yast2_lan_device_settings" unless is_s390x();
loadtest "console/yast2_lan_device_settings" unless (is_s390x() || get_var('PUBLIC_CLOUD'));
loadtest "console/check_default_network_manager";
loadtest "console/ipsec_tools_h2h" if get_var("IPSEC");
loadtest "console/git";
loadtest "console/cups";
loadtest "console/java";
loadtest "console/sqlite3";
loadtest "console/sqlite3" unless get_var('PUBLIC_CLOUD');
loadtest "console/ant" if is_sle('<15-sp1');
loadtest "console/gdb";
loadtest "console/gdb" unless get_var('PUBLIC_CLOUD');
loadtest "console/perf" if is_sle('<15-sp1');
loadtest "console/sysctl";
loadtest "console/sysstat";
loadtest "console/curl_ipv6";
loadtest "console/curl_ipv6" unless get_var('PUBLIC_CLOUD');
loadtest "console/wget_ipv6";
loadtest "console/ca_certificates_mozilla";
loadtest "console/unzip";
Expand All @@ -1623,7 +1622,7 @@ sub load_extra_tests_console {
loadtest "console/rsync";
loadtest "console/clamav";
loadtest "console/shells";
loadtest 'console/sudo';
loadtest 'console/sudo' unless get_var('PUBLIC_CLOUD');
loadtest "console/repo_orphaned_packages_check" if is_jeos;
# dstat is not in sle12sp1
loadtest "console/dstat" if is_sle('12-SP2+') || is_opensuse;
Expand All @@ -1633,21 +1632,21 @@ sub load_extra_tests_console {
}
# bind need source package and legacy and development module on SLE15+
loadtest 'console/bind' if get_var('MAINT_TEST_REPO');
unless (is_sle('<12-SP3')) {
unless (is_sle('<12-SP3') || get_var('PUBLIC_CLOUD')) {
loadtest 'x11/evolution/evolution_prepare_servers';
loadtest 'console/mutt';
}
loadtest 'console/supportutils' if (is_sle && !is_jeos);
loadtest 'console/mdadm' unless is_jeos;
loadtest 'console/mdadm' unless (is_jeos || get_var('PUBLIC_CLOUD'));
loadtest 'console/journalctl';
loadtest 'console/quota' unless is_jeos;
loadtest 'console/vhostmd';
loadtest 'console/quota' unless (is_jeos || get_var('PUBLIC_CLOUD'));
loadtest 'console/vhostmd' unless get_var('PUBLIC_CLOUD');
loadtest 'console/rpcbind' unless is_jeos;
# sysauth test scenarios run in the console
loadtest "sysauth/sssd" if get_var('SYSAUTHTEST') || is_sle('12-SP5+');
loadtest "sysauth/sssd" if (!get_var('PUBLIC_CLOUD') && (get_var('SYSAUTHTEST') || is_sle('12-SP5+')));
loadtest 'console/timezone';
loadtest 'console/ntp' if is_sle('<15');
loadtest 'console/procps';
loadtest 'console/procps' unless get_var('PUBLIC_CLOUD');
loadtest "console/lshw" if ((is_sle('15+') && (is_ppc64le || is_x86_64)) || is_opensuse);
loadtest 'console/kmod';
loadtest 'console/suse_module_tools';
Expand Down Expand Up @@ -2622,6 +2621,17 @@ sub load_publiccloud_tests {
elsif (get_var('PUBLIC_CLOUD_IMG_PROOF_TESTS')) {
loadtest "publiccloud/img_proof";
}
elsif (get_var('PUBLIC_CLOUD_QAM')) {
loadtest "publiccloud/download_repos";
my $args = OpenQA::Test::RunArgs->new();
loadtest "publiccloud/ssh_interactive_init", run_args => $args;
loadtest "publiccloud/transfer_repos", run_args => $args;
loadtest "publiccloud/patch_and_reboot", run_args => $args;
loadtest "publiccloud/ssh_interactive_start", run_args => $args;
loadtest "publiccloud/instance_overview";
load_extra_tests_console();
loadtest "publiccloud/ssh_interactive_end", run_args => $args;
}
elsif (get_var('PUBLIC_CLOUD_LTP')) {
loadtest 'publiccloud/run_ltp';
}
Expand Down
8 changes: 5 additions & 3 deletions lib/publiccloud/basetest.pm
Expand Up @@ -78,6 +78,11 @@ sub _cleanup {
eval { $self->cleanup(); } or bmwqemu::fctwarn($@);

$self->{provider} //= [];
my $flags = $self->test_flags();
if ($flags->{publiccloud_multi_module} &&
pdostal marked this conversation as resolved.
Show resolved Hide resolved
!($self->{result} eq 'fail' && $flags->{fatal})) {
return; # skip cleanup
}
for my $provider (@{$self->{provider}}) {
eval { $provider->cleanup(); } or bmwqemu::fctwarn($@);
}
Expand All @@ -93,7 +98,4 @@ sub post_run_hook {
$self->_cleanup() unless $self->{cleanup_called};
}




1;
8 changes: 7 additions & 1 deletion lib/publiccloud/instance.pm
Expand Up @@ -68,7 +68,13 @@ sub run_ssh_command {
delete($args{no_quote});
delete($args{ssh_opts});
delete($args{username});
return script_output($ssh_cmd, %args);
if ($args{timeout} == 0) {
# Run the command and don't wait for it - no output nor returncode here
script_run($ssh_cmd, %args);
} else {
# Run the command, wait for it and return the output
return script_output($ssh_cmd, %args);
}
}

=head2 scp
Expand Down
71 changes: 71 additions & 0 deletions lib/publiccloud/ssh_interactive.pm
@@ -0,0 +1,71 @@
# SUSE's openQA tests
#
# Copyright © 2019 SUSE LLC
#
# Copying and distribution of this file, with or without modification,
# are permitted in any medium without royalty provided the copyright
# notice and this notice are preserved. This file is offered as-is,
# without any warranty.

# Summary: Class with helpers related to SSH Interactive mode
#
# Maintainer: Pavel Dostal <pdostal@suse.cz>

package publiccloud::ssh_interactive;
use base opensusebasetest;
use testapi;
use Utils::Backends qw(set_sshserial_dev unset_sshserial_dev);
use strict;
use warnings;

our @ISA = qw(Exporter);
our @EXPORT = qw(ssh_interactive_tunnel ssh_interactive_join ssh_interactive_leave);

sub ssh_interactive_tunnel {
my ($instance) = @_;

# Prepare the environment for the SSH tunnel
my $upload_port = get_required_var('QEMUPORT') + 1;
my $upload_host = testapi::host_ip();

$instance->run_ssh_command(
cmd => "'rm -rf /dev/sshserial; mkfifo -m a=rwx /dev/sshserial; tail -fn +1 /dev/sshserial' | tee /dev/$serialdev ", # Create /dev/sshserial fifo on remote and tail|tee it to /dev/$serialdev on local
timeout => 0, # This will also cause script_run instead of script_output to be used so the test will not wait for the command to end
no_quote => 1,
ssh_opts => "-t -R $upload_port:$upload_host:$upload_port", # Tunnel the worker port (for downloading from data/ and uploading assets / logs
username => 'root'
);
sleep 3;
save_screenshot;

set_var('SERIALDEV_', $serialdev);
set_var('_SSH_TUNNELS_INITIALIZED', 1);
}

sub ssh_interactive_join {
# Prepare the environment to use the SSH tunnel for upload/download from the worker
#set_var('SUT_HOSTNAME', script_output('sed -n "s/^ Hostname \([0-9.]*\)$/\1/p" ~/.ssh/config'));
set_var('AUTOINST_URL_HOSTNAME', 'localhost');
set_sshserial_dev();

# Open SSH interactive session and check the serial console works
type_string("ssh -t sut\n");
wait_serial("ssh_serial_ready", 10);

$testapi::distri->set_standard_prompt('root');
}

sub ssh_interactive_leave {
# Check if the SSH tunnel is still up and leave the SSH interactive session
assert_script_run("if [[ -p /dev/$serialdev ]]; then true; else false; fi");
pdostal marked this conversation as resolved.
Show resolved Hide resolved
type_string("exit\n");

# Restore the environment to not use the SSH tunnel for upload/download from the worker
#set_var('SUT_HOSTNAME', testapi::host_ip());
set_var('AUTOINST_URL_HOSTNAME', testapi::host_ip());
unset_sshserial_dev();

$testapi::distri->set_standard_prompt('root');
}

1;
7 changes: 4 additions & 3 deletions lib/susedistribution.pm
Expand Up @@ -18,6 +18,7 @@ use version_utils qw(is_hyperv_in_gui is_sle is_leap is_svirt_except_s390x is_tu
use x11utils qw(desktop_runner_hotkey ensure_unlocked_desktop);
use Utils::Backends qw(set_sshserial_dev use_ssh_serial_console is_remote_backend);
use backend::svirt qw(SERIAL_TERMINAL_DEFAULT_DEVICE SERIAL_TERMINAL_DEFAULT_PORT);
use publiccloud::ssh_interactive 'ssh_interactive_join';
use Cwd;

=head1 SUSEDISTRIBUTION
Expand Down Expand Up @@ -767,15 +768,15 @@ sub activate_console {
# Both consoles and shells should be prevented from blanking
if ((($type eq 'console') or ($type =~ /shell/)) and (get_var('BACKEND', '') =~ /qemu|svirt/)) {
# On s390x 'setterm' binary is not present as there's no linux console
if (!check_var('ARCH', 's390x')) {
unless (check_var('ARCH', 's390x') || get_var('PUBLIC_CLOUD')) {
# Disable console screensaver
$self->script_run('setterm -blank 0') unless $args{skip_setterm};
}
}
if (get_var('TUNNELED') && $name !~ /tunnel/) {
die "Console '$console' activated in TUNNEL mode activated but tunnel(s) are not yet initialized, use the 'tunnel' console and call 'setup_ssh_tunnels' first" unless get_var('_SSH_TUNNELS_INITIALIZED');
$self->script_run('ssh -t sut', 0);
ensure_user($user);
(get_var('PUBLIC_CLOUD')) ? ssh_interactive_join() : $self->script_run('ssh -t sut', 0);
ensure_user($user) unless (get_var('PUBLIC_CLOUD'));
}
set_var('CONSOLE_JUST_ACTIVATED', 1);
}
Expand Down
2 changes: 1 addition & 1 deletion lib/y2_module_consoletest.pm
Expand Up @@ -36,7 +36,7 @@ sub post_run_hook {
}

sub test_flags {
return {fatal => 0};
return get_var('PUBLIC_CLOUD') ? {no_rollback => 1, fatal => 0} : {fatal => 0};
}

1;
2 changes: 1 addition & 1 deletion products/sle/main.pm
Expand Up @@ -885,7 +885,7 @@ elsif (get_var('LIBSOLV_INSTALLCHECK')) {
elsif (get_var("EXTRATEST")) {
boot_hdd_image;
load_extra_tests();
loadtest "console/coredump_collect" unless (check_var('EXTRATEST', 'wicked'));
loadtest "console/coredump_collect" unless (check_var('EXTRATEST', 'wicked') || get_var('PUBLIC_CLOUD'));

}
elsif (get_var("WINDOWS")) {
Expand Down
1 change: 1 addition & 0 deletions tests/console/ntp.pm
Expand Up @@ -27,4 +27,5 @@ sub run {
services::ntpd::check_service();
services::ntpd::check_function();
}

1;
49 changes: 49 additions & 0 deletions tests/publiccloud/download_repos.pm
@@ -0,0 +1,49 @@
# SUSE's openQA tests
#
# Copyright © 2019 SUSE LLC
#
# Copying and distribution of this file, with or without modification,
# are permitted in any medium without royalty provided the copyright
# notice and this notice are preserved. This file is offered as-is,
# without any warranty.

# Summary: Download repositores from the internal server
#
# Maintainer: Pavel Dostal <pdostal@suse.cz>

use base 'consoletest';
use registration;
use warnings;
use testapi;
use strict;
use utils;

sub run {
my ($self, $args) = @_;
select_console 'tunnel-console';

my $domain = '';
my @repos = split(/,/, get_var('INCIDENT_REPO'));
assert_script_run("mkdir ~/repos");
assert_script_run("cd ~/repos");
for my $maintrepo (@repos) {
my ($parent) = $maintrepo =~ 'https?://(.*)$';
my ($domain) = $parent =~ '^([a-zA-Z.]*)';
assert_script_run("wget --no-clobber -r -R 'robots.txt,*.ico,*.png,*.gif,*.css,*.js,*.htm*' --domains $domain --no-parent $parent $maintrepo", timeout => 600);
assert_script_run("echo -en '# $maintrepo:\\n\\n' >> /tmp/repos.list.txt");
assert_script_run("find $parent >> /tmp/repos.list.txt");
}
upload_logs('/tmp/repos.list.txt');
assert_script_run("cd ~/");
}

sub test_flags {
return {
fatal => 1,
milestone => 1,
publiccloud_multi_module => 1
};
}

1;