diff --git a/docs/WritingTests.asciidoc b/docs/WritingTests.asciidoc index 158f5c049f86..991b89f3138e 100644 --- a/docs/WritingTests.asciidoc +++ b/docs/WritingTests.asciidoc @@ -672,8 +672,8 @@ eventually workers can be held back for the cluster. It is possible to ensure that all jobs within the same _parallel_ cluster are executed on the same worker host. This is useful for connecting the SUTs without having to connect the physical worker hosts. Use `PARALLEL_ONE_HOST_ONLY=1` to -enable this. Note that adding this setting in `workers.ini` has currently *no* -effect. +enable this. This setting can be applied as a test variable during the time +of scheduling as well as in the worker configuration file `workers.ini`. WARNING: You need to provide enough worker slots on single worker hosts to fit an entire cluster. So this feature is mainly intended to workaround situations diff --git a/etc/openqa/workers.ini b/etc/openqa/workers.ini index 28685760ecce..3d467d655af9 100644 --- a/etc/openqa/workers.ini +++ b/etc/openqa/workers.ini @@ -6,6 +6,10 @@ # space separated list of webuis to connect to (empty defaults to localhost) #HOST = http://openqa.example.host +# Enable to restrict any multi-machine jobs taken by this worker host to only run here. +# Disabled by default. +#PARALLEL_ONE_HOST_ONLY = 0 + # Specify a cache directory for assets and tests to sync them automatically via # http/rsync; the specified path is just an example but what you would usually # use on a normal setup diff --git a/lib/OpenQA/WebAPI/Controller/API/V1/Worker.pm b/lib/OpenQA/WebAPI/Controller/API/V1/Worker.pm index 172b5bc9ba76..b55463572e50 100644 --- a/lib/OpenQA/WebAPI/Controller/API/V1/Worker.pm +++ b/lib/OpenQA/WebAPI/Controller/API/V1/Worker.pm @@ -173,10 +173,10 @@ sub create { my ($self) = @_; my $validation = $self->validation; my @validation_params - = qw(cpu_arch cpu_modelname cpu_opmode cpu_flags mem_max isotovideo_interface_version websocket_api_version worker_class); + = qw(cpu_arch cpu_modelname cpu_opmode cpu_flags mem_max isotovideo_interface_version websocket_api_version worker_class parallel_one_host_only); $validation->required($_) for qw(host instance cpu_arch mem_max worker_class); - $validation->optional($_) - for qw(cpu_modelname cpu_opmode cpu_flags isotovideo_interface_version job_id websocket_api_version); + $validation->optional($_) for qw(cpu_modelname cpu_opmode cpu_flags isotovideo_interface_version job_id + websocket_api_version parallel_one_host_only); return $self->reply->validation_error({format => 'json'}) if $validation->has_error; my $host = $validation->param('host'); @@ -184,7 +184,6 @@ sub create { my $job_ids = $validation->every_param('job_id'); my $caps = {}; $caps->{$_} = $validation->param($_) for @validation_params; - my $id; try { $id = $self->_register($self->schema, $host, $instance, $caps, $job_ids); diff --git a/lib/OpenQA/Worker.pm b/lib/OpenQA/Worker.pm index 0bd2fa6c3243..882102249a30 100644 --- a/lib/OpenQA/Worker.pm +++ b/lib/OpenQA/Worker.pm @@ -212,7 +212,8 @@ sub capabilities ($self) { = join(',', map { 'qemu_' . $_ } @{$supported_archs_by_cpu_archs{$caps->{cpu_arch}} // [$caps->{cpu_arch}]}); # TODO: check installed qemu and kvm? } - + $caps->{parallel_one_host_only} = $global_settings->{PARALLEL_ONE_HOST_ONLY} + if exists $global_settings->{PARALLEL_ONE_HOST_ONLY}; return $self->{_caps} = $caps; } diff --git a/t/24-worker-overall.t b/t/24-worker-overall.t index 50bd97f82d70..167058926393 100755 --- a/t/24-worker-overall.t +++ b/t/24-worker-overall.t @@ -142,6 +142,14 @@ subtest 'capabilities' => sub { # clear cached capabilities delete $worker->{_caps}; + subtest 'capabilities include PARALLEL_ONE_HOST_ONLY setting if present' => sub { + $global_settings->{PARALLEL_ONE_HOST_ONLY} = 1; + $capabilities = $worker->capabilities; + is $capabilities->{parallel_one_host_only}, 1, 'capabilities contain expected information'; + delete $global_settings->{PARALLEL_ONE_HOST_ONLY}; + }; + delete $worker->{_caps}; + subtest 'deduce worker class from CPU architecture' => sub { delete $global_settings->{WORKER_CLASS}; $global_settings->{ARCH} = 'aarch64';