forked from os-autoinst/os-autoinst-distri-opensuse
-
Notifications
You must be signed in to change notification settings - Fork 0
/
check_registercloudguest.pm
167 lines (145 loc) · 8.08 KB
/
check_registercloudguest.pm
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
# SUSE's openQA tests
#
# Copyright 2022 SUSE LLC
# SPDX-License-Identifier: FSFAP
# Package: cloud-regionsrv-client
# Summary: Test system (re)registration
# https://github.com/SUSE-Enceladus/cloud-regionsrv-client/blob/master/integration_test-process.txt
# Leave system in *registered* state
#
# Maintainer: <[email protected]>
use Mojo::Base 'publiccloud::basetest';
use version_utils;
use registration;
use warnings;
use testapi;
use strict;
use utils;
use publiccloud::utils;
use publiccloud::ssh_interactive 'select_host_console';
use version_utils 'is_sle';
sub run {
my ($self, $args) = @_;
my ($provider, $instance);
select_host_console();
if (get_var('PUBLIC_CLOUD_QAM', 0)) {
$instance = $self->{my_instance} = $args->{my_instance};
$provider = $self->{provider} = $args->{my_provider}; # required for cleanup
} else {
$provider = $self->provider_factory();
$instance = $self->{my_instance} = $provider->create_instance(check_guestregister => is_openstack ? 0 : 1);
}
my $regcode_param = (is_byos()) ? "-r " . get_required_var('SCC_REGCODE') : '';
my $path = is_sle('>15') && is_sle('<15-SP3') ? '/usr/sbin/' : '';
if (check_var('PUBLIC_CLOUD_SCC_ENDPOINT', 'SUSEConnect')) {
record_info('SKIP', 'PUBLIC_CLOUD_SCC_ENDPOINT is hardcoded to SUSEConnect - skipping registration testing. Falling back to registration module behavior');
registercloudguest($instance) if (is_byos() || get_var('PUBLIC_CLOUD_FORCE_REGISTRATION'));
register_addons_in_pc($instance);
return;
}
# this is special use case needed by dev ops team within SUSE. Should not be used for any product testing.
# Use this variable ONLY if you really know what you are doing!
if (check_var('PUBLIC_CLOUD_INFRA', '1')) {
my $prefix = "PREPARATION PHASE.";
my $rmt_ipv4 = get_required_var("PUBLIC_CLOUD_INFRA_RMT_V4");
my $rmt_ipv6 = get_required_var("PUBLIC_CLOUD_INFRA_RMT_V6");
if (is_ondemand()) {
$instance->ssh_assert_script_run(cmd => "sudo ${path}registercloudguest --clean", fail_message => "$prefix registercloudguest --clean failed");
$instance->ssh_script_run(cmd => 'sudo rm /var/log/cloudregister; sudo rm /etc/pki/trust/anchors/*.pem', fail_message => "$prefix Deletion of register log and/or certificates failed");
}
$instance->ssh_script_run(cmd => "sudo sed -i \"s/regionsrv.*\$/regionsrv = $rmt_ipv4,$rmt_ipv6/\" /etc/regionserverclnt.cfg");
$instance->ssh_assert_script_run(cmd => "sudo grep \"regionsrv = $rmt_ipv4,$rmt_ipv6\" /etc/regionserverclnt.cfg", fail_message => "$prefix regionserverclnt.cfg update failed");
$instance->ssh_assert_script_run(cmd => "sudo curl -k -O --output-dir /usr/lib/regionService/certs https://$rmt_ipv4/$rmt_ipv4.pem", fail_message => "$prefix Download of test cert failed");
$instance->ssh_assert_script_run(cmd => 'sudo update-ca-certificates', fail_message => "$prefix update-ca-certificates failed");
$instance->ssh_assert_script_run(cmd => "sudo registercloudguest $regcode_param", timeout => 300);
check_instance_registered($instance);
} elsif (is_container_host()) {
# CHOST images don't have registercloudguest pre-installed. To install it we need to register which make it impossible to do
# all BYOS related checks. So we just regestering system and going further
registercloudguest($instance);
} elsif (is_byos()) {
if (check_var('PUBLIC_CLOUD_CHECK_CLOUDREGISTER_EXECUTED', '1')) {
$instance->ssh_assert_script_run(cmd => "sudo ${path}registercloudguest --clean", fail_message => 'Failed to deregister the previously registered BYOS system');
$instance->ssh_script_run(cmd => 'sudo rm /etc/zypp/repos.d/*.repo');
} else {
check_instance_unregistered($instance, 'The BYOS instance should be unregistered and report "Warning: No repositories defined.".');
if ($instance->ssh_script_output(cmd => 'sudo systemctl is-enabled guestregister.service', proceed_on_failure => 1) !~ /disabled/) {
die('guestregister.service is not disabled');
}
if (is_azure() && $instance->ssh_assert_script_run(cmd => 'sudo systemctl is-enabled regionsrv-enabler-azure.timer')) {
die('regionsrv-enabler-azure.timer is not enabled');
}
if ($instance->ssh_script_run(cmd => 'sudo test -s /var/log/cloudregister') == 0) {
die('/var/log/cloudregister is not empty');
}
$instance->ssh_assert_script_run(cmd => '! sudo SUSEConnect -d', fail_message => 'SUSEConnect succeeds but it is not supported should fail on BYOS');
}
} else {
check_instance_registered($instance);
if ($instance->ssh_script_output(cmd => 'sudo systemctl is-enabled guestregister.service', proceed_on_failure => 1) !~ /enabled/) {
die('guestregister.service is not enabled');
}
if ($instance->ssh_script_output(cmd => 'sudo stat --printf="%s" /var/log/cloudregister') == 0) {
die('/var/log/cloudregister is empty');
}
}
$instance->ssh_assert_script_run(cmd => "sudo ${path}registercloudguest --clean");
# It might take a bit for the system to remove the repositories
foreach my $i (1 .. 4) {
last if ($instance->ssh_script_output(cmd => 'LANG=C zypper -t lr | awk "/^\s?[[:digit:]]+/{c++} END {print c}"', timeout => 300) == 0);
sleep 15;
}
check_instance_unregistered($instance, 'The list of zypper repositories is not empty.');
# The SUSEConnect registration should still work on BYOS
if (is_byos()) {
$instance->ssh_assert_script_run(cmd => 'sudo SUSEConnect --version');
$instance->ssh_assert_script_run(cmd => "sudo SUSEConnect $regcode_param");
$instance->ssh_assert_script_run(cmd => "sudo ${path}registercloudguest --clean");
}
$instance->ssh_script_retry(cmd => "sudo ${path}registercloudguest $regcode_param", timeout => 300, retry => 3, delay => 120);
check_instance_registered($instance);
$instance->ssh_script_retry(cmd => "sudo ${path}registercloudguest $regcode_param --force-new", timeout => 300, retry => 3, delay => 120);
check_instance_registered($instance);
register_addons_in_pc($instance);
set_var('PUBLIC_CLOUD_CHECK_CLOUDREGISTER_EXECUTED', '1');
}
sub check_instance_registered {
my ($instance) = @_;
if ($instance->ssh_script_output(cmd => 'LANG=C zypper -t lr | awk "/^\s?[[:digit:]]+/{c++} END {print c}"', timeout => 300) == 0) {
record_info('zypper lr', $instance->ssh_script_output(cmd => 'zypper -t lr ||:'));
die('The list of zypper repositories is empty.');
}
if ($instance->ssh_script_output(cmd => 'sudo ls /etc/zypp/credentials.d/ | wc -l') == 0) {
die('Directory /etc/zypp/credentials.d/ is empty.');
}
}
sub check_instance_unregistered {
my ($instance, $error) = @_;
if ($instance->ssh_script_output(cmd => 'sudo ls /etc/zypp/credentials.d/ | wc -l') != 0) {
my $creds_output = $instance->ssh_script_output(cmd => 'sudo ls -la /etc/zypp/credentials.d/');
die("/etc/zypp/credentials.d/ is not empty:\n" . $creds_output);
}
my $out = $instance->ssh_script_output(cmd => 'zypper -t lr ||:', timeout => 300);
return if ($out =~ /No repositories defined/m);
for (split('\n', $out)) {
if ($_ =~ /^\s?\d+/ && $_ !~ /SUSE_Maintenance/) {
record_info('zypper lr', $out);
die($error);
}
}
}
sub post_fail_hook {
my ($self) = @_;
if (exists($self->{my_instance})) {
$self->{my_instance}->upload_log('/var/log/cloudregister', log_name => $autotest::current_test->{name} . '-cloudregister.log');
}
if (is_azure()) {
record_info('azuremetadata', $self->{my_instance}->run_ssh_command(cmd => "sudo /usr/bin/azuremetadata --api latest --subscriptionId --billingTag --attestedData --signature --xml"));
}
$self->SUPER::post_fail_hook();
registercloudguest($self->{my_instance});
}
sub test_flags {
return {fatal => 0, publiccloud_multi_module => 1};
}
1;