From 4f218511195494c47566b9909a2151e26fe172fc Mon Sep 17 00:00:00 2001 From: Sebastian Riedel Date: Tue, 15 Oct 2024 13:38:36 +0200 Subject: [PATCH] Configure each OBS instance individually --- cavil.conf | 12 +++-- lib/Cavil.pm | 3 +- lib/Cavil/OBS.pm | 46 +++++++++--------- t/api.t | 13 +++-- t/command_obs.t | 15 +++--- t/embargo.t | 21 +++++---- t/obs.t | 120 +++++++++++++++++++++++------------------------ 7 files changed, 118 insertions(+), 112 deletions(-) diff --git a/cavil.conf b/cavil.conf index 02c460c7d0..f13711246f 100644 --- a/cavil.conf +++ b/cavil.conf @@ -19,10 +19,16 @@ well_known_url => 'https://id.opensuse.org/openidc/.well-known/openid-configuration' }, - # Optional SSH authentication credentials for the Open Build Service + # Authentication credentials for the Open Build Service (Basic or SSH) obs => { - user => 'NAME', - ssh_key => 'SSH_PRIVATE_KEY_PATH' + 'api.opensuse.org' => { + user => 'OBS_USER', + password => 'OBS_PASSWORD' + }, + 'api.suse.de' => { + user => 'IBS_USER', + ssh_key => 'SSH_PRIVATE_KEY_PATH' + } }, # Token authentication strings for the dedicated bot REST API diff --git a/lib/Cavil.pm b/lib/Cavil.pm index 9cc23c9058..64ea1d0d14 100644 --- a/lib/Cavil.pm +++ b/lib/Cavil.pm @@ -61,8 +61,7 @@ sub startup ($self) { # Optional OBS credentials if (my $obs = $config->{obs}) { - $self->obs->user($obs->{user}) if $obs->{user}; - $self->obs->ssh_key($obs->{ssh_key}) if $obs->{ssh_key}; + $self->obs->config($obs); } # Short logs for systemd diff --git a/lib/Cavil/OBS.pm b/lib/Cavil/OBS.pm index 90b1def72e..d9d800339d 100644 --- a/lib/Cavil/OBS.pm +++ b/lib/Cavil/OBS.pm @@ -23,9 +23,8 @@ use Mojo::UserAgent; use Mojo::URL; use Cavil::Util qw(obs_ssh_auth); -has ssh_hosts => sub { ['api.suse.de'] }; -has ssh_key => sub { die 'Missing ssh key' }; -has ua => sub { +has config => sub { {} }; +has ua => sub { my $ua = Mojo::UserAgent->new(inactivity_timeout => 600); $ua->on( start => sub ($ua, $tx) { @@ -39,15 +38,14 @@ has ua => sub { ); return $ua; }; -has user => sub { die 'Missing ssh user' }; sub check_for_embargo ($self, $api, $request) { - my $url = _url($api, 'public', 'request', $request); + my $url = _url($api, 'request', $request); my $res = $self->_get($url); croak "$url: " . $res->code unless $res->is_success; for my $project ($res->dom->find('action [project]')->map('attr', 'project')->uniq->each) { - my $url = _url($api, 'public', 'source', $project, '_attribute'); + my $url = _url($api, 'source', $project, '_attribute'); my $res = $self->_get($url); my $code = $res->code; next if $code == 404; @@ -68,7 +66,7 @@ sub download_source ($self, $api, $project, $pkg, $dir, $options = {}) { $dir = path($dir)->make_path; # List files - my $url = _url($api, 'public', 'source', $project, $pkg)->query(expand => 1); + my $url = _url($api, 'source', $project, $pkg)->query(expand => 1); $url->query([rev => $options->{rev}]) if defined $options->{rev}; my $res = $self->_get($url); croak "$url: " . $res->code unless $res->is_success; @@ -82,7 +80,7 @@ sub download_source ($self, $api, $project, $pkg, $dir, $options = {}) { # We've actually seen this in IBS (usually a checksum mismatch) next if $file->{name} eq '_meta'; - my $url = _url($api, 'public', 'source', $project, $pkg, $file->{name}); + my $url = _url($api, 'source', $project, $pkg, $file->{name}); $url->query([expand => 1, rev => $srcmd5]); my $res = $self->_get($url); croak "$url: " . $res->code unless $res->is_success; @@ -94,7 +92,7 @@ sub download_source ($self, $api, $project, $pkg, $dir, $options = {}) { } sub package_info ($self, $api, $project, $pkg, $options = {}) { - my $url = _url($api, 'public', 'source', $project, $pkg)->query(view => 'info'); + my $url = _url($api, 'source', $project, $pkg)->query(view => 'info'); $url->query([rev => $options->{rev}]) if defined $options->{rev}; my $res = $self->_get($url); croak "$url: " . $res->code unless $res->is_success; @@ -109,7 +107,7 @@ sub package_info ($self, $api, $project, $pkg, $options = {}) { } sub _find_link_target ($self, $api, $project, $pkg, $lrev) { - my $url = _url($api, 'public', 'source', $project, $pkg); + my $url = _url($api, 'source', $project, $pkg); my $query = {expand => 1}; $query->{rev} = $lrev if defined $lrev; $url->query($query); @@ -127,7 +125,7 @@ sub _find_link_target ($self, $api, $project, $pkg, $lrev) { return $linfo unless $match && !$linfo->{match}; } } - $url = _url($api, 'public', 'source', $project, $pkg, '_meta'); + $url = _url($api, 'source', $project, $pkg, '_meta'); $res = $self->_get($url); # This is severe as we already checked the sources @@ -141,18 +139,24 @@ sub _find_link_target ($self, $api, $project, $pkg, $lrev) { sub _get ($self, $url) { my $ua = $self->ua; - # "api.suse.de" does not have public API endpoints - my $host = $url->host; - my $path = $url->path; - my $hosts = $self->ssh_hosts; - shift @{$path->parts} if (grep { $host eq $_ } @$hosts) && $path->parts->[0] eq 'public'; - - my $tx = $ua->get($url); + my $host = $url->host; + die "Missing configuration for OBS instance: $host" unless my $config = $self->config->{$host}; + die "Missing user for OBS instance: $host" unless my $user = $config->{user}; # "api.suse.de" needs ssh authentication - my $res = $tx->res; - $tx = $ua->get($url, {Authorization => obs_ssh_auth($res->headers->www_authenticate, $self->user, $self->ssh_key)}) - if $res->code == 401; + my $tx; + if (my $ssh_key = $config->{ssh_key}) { + $tx = $ua->get($url); + my $res = $tx->res; + $tx = $ua->get($url, {Authorization => obs_ssh_auth($res->headers->www_authenticate, $user, $ssh_key)}) + if $res->code == 401; + } + + # All other instances should use basic authentication + else { + die "Missing password for OBS instance: $host" unless my $password = $config->{password}; + $tx = $ua->get($url->userinfo("$user:$password")); + } return $tx->result; } diff --git a/t/api.t b/t/api.t index 3945c81910..5de5ed5b45 100644 --- a/t/api.t +++ b/t/api.t @@ -51,7 +51,7 @@ $routes->add_condition( } ); $routes->get( - '/public/source/:project/perl-Mojolicious' => [project => ['devel:languages:perl']] => (query => {view => 'info'}) => + '/source/:project/perl-Mojolicious' => [project => ['devel:languages:perl']] => (query => {view => 'info'}) => {text => <<'EOF'}); get( perl-Mojolicious.spec EOF -$routes->get( - '/public/source/:project/perl-Mojolicious' => [project => ['devel:languages:perl']] => (query => {expand => 1}) => +$routes->get('/source/:project/perl-Mojolicious' => [project => ['devel:languages:perl']] => (query => {expand => 1}) => {text => <<'EOF'}); @@ -76,8 +75,7 @@ $routes->get( size="2420" mtime="1496988145" /> EOF -$routes->get( - '/public/source/:project/perl-Mojolicious/_meta' => [project => ['devel:languages:perl']] => {text => <<'EOF'}); +$routes->get('/source/:project/perl-Mojolicious/_meta' => [project => ['devel:languages:perl']] => {text => <<'EOF'}); The Web In A Box! Test package @@ -86,10 +84,11 @@ $routes->get( EOF my @files = qw(Mojolicious-7.25.tar.gz perl-Mojolicious.changes perl-Mojolicious.spec); -$routes->get("/public/source/:project/perl-Mojolicious/$_" => [project => ['devel:languages:perl']] => +$routes->get("/source/:project/perl-Mojolicious/$_" => [project => ['devel:languages:perl']] => {data => path(__FILE__)->sibling('legal-bot', 'perl-Mojolicious', 'c7cfdab0e71b0bebfdf8b2dc3badfecd', $_)->slurp}) for @files; my $api = 'http://127.0.0.1:' . $t->app->obs->ua->server->app($mock_app)->url->port; +$t->app->obs->config({'127.0.0.1' => {user => 'test', password => 'testing'}}); subtest 'Not authenticated' => sub { $t->get_ok('/package/1')->status_is(403)->content_like(qr/permission/); @@ -128,7 +127,7 @@ subtest 'Create package' => sub { start => sub { my $job = shift; return unless $job->task eq 'obs_import'; - $job->app->obs(Cavil::OBS->new); + $job->app->obs(Cavil::OBS->new(config => $job->app->obs->config)); my $api = 'http://127.0.0.1:' . $job->app->obs->ua->server->app($mock_app)->url->port; $job->args->[1]{api} = $api; } diff --git a/t/command_obs.t b/t/command_obs.t index 12c130ffe6..d41932feb4 100644 --- a/t/command_obs.t +++ b/t/command_obs.t @@ -48,7 +48,7 @@ app->routes->add_condition( } ); -get '/public/source/:project/perl-Mojolicious' => [project => ['home:kraih']] => (query => {view => 'info'}) => +get '/source/:project/perl-Mojolicious' => [project => ['home:kraih']] => (query => {view => 'info'}) => {text => <<'EOF'}; EOF -get '/public/source/:project/perl-Mojolicious/_meta' => [project => ['home:kraih']] => {text => <<'EOF'}; +get '/source/:project/perl-Mojolicious/_meta' => [project => ['home:kraih']] => {text => <<'EOF'}; Mojolicious @@ -68,7 +68,7 @@ get '/public/source/:project/perl-Mojolicious/_meta' => [project => ['home:kraih EOF -get '/public/source/:project/perl-Mojolicious' => [project => ['home:kraih']] => +get '/source/:project/perl-Mojolicious' => [project => ['home:kraih']] => (query => {expand => 1, rev => [1, '0e5c2d1c0c4178869cf7fb82482b9c52']}) => {text => <<'EOF'}; @@ -83,14 +83,15 @@ get '/public/source/:project/perl-Mojolicious' => [p EOF -get '/public/source/:project/perl-Mojolicious/perl-Mojolicious.spec' => [project => ['home:kraih']] => - (query => {rev => '9199eca9ec0fa5cffe4c3a6cb99a8093'}) => {text => 'Mojolicious spec!'}; +get '/source/:project/perl-Mojolicious/perl-Mojolicious.spec' => [project => ['home:kraih']] => + (query => {rev => '9199eca9ec0fa5cffe4c3a6cb99a8093'}) => {text => 'Mojolicious spec!'}; -get '/public/source/:project/perl-Mojolicious/:special' => [project => ['home:kraih']] => +get '/source/:project/perl-Mojolicious/:special' => [project => ['home:kraih']] => (query => {rev => '9199eca9ec0fa5cffe4c3a6cb99a8093'}) => [special => ['perl-Mojo#licious.changes']] => {text => 'Mojolicious changes!'}; -my $api = 'http://127.0.0.1:' . $app->obs->ua->server->app(app)->url->port; +my $api = 'http://127.0.0.1:' + . $app->obs->config({'127.0.0.1' => {user => 'test', password => 'testing'}})->ua->server->app(app)->url->port; subtest 'OBS' => sub { subtest 'Info' => sub { diff --git a/t/embargo.t b/t/embargo.t index bdfd285fc0..eb8a34395f 100644 --- a/t/embargo.t +++ b/t/embargo.t @@ -43,8 +43,8 @@ app->routes->add_condition( } ); -get '/public/source/:project/perl-Mojolicious.SUSE_SLE-15-SP2_Update' => [project => ['SUSE:Maintenance:4321']] => - (query => {view => 'info'}) => {text => <<'EOF'}; +get '/source/:project/perl-Mojolicious.SUSE_SLE-15-SP2_Update' => [project => ['SUSE:Maintenance:4321']] => + (query => {view => 'info'}) => {text => <<'EOF'}; @@ -52,8 +52,8 @@ get '/public/source/:project/perl-Mojolicious.SUSE_SLE-15-SP2_Update' => [projec EOF -get '/public/source/:project/perl-Mojolicious.SUSE_SLE-15-SP2_Update' => [project => ['SUSE:Maintenance:4321']] => - (query => {expand => 1}) => {text => <<'EOF'}; +get '/source/:project/perl-Mojolicious.SUSE_SLE-15-SP2_Update' => [project => ['SUSE:Maintenance:4321']] => + (query => {expand => 1}) => {text => <<'EOF'}; [projec EOF -get '/public/source/:project/perl-Mojolicious.SUSE_SLE-15-SP2_Update/_meta' => - [project => ['SUSE:Maintenance:4321']] => {text => <<'EOF'}; +get '/source/:project/perl-Mojolicious.SUSE_SLE-15-SP2_Update/_meta' => [project => ['SUSE:Maintenance:4321']] => + {text => <<'EOF'}; Job Queue Test package @@ -80,11 +80,11 @@ get '/public/source/:project/perl-Mojolicious.SUSE_SLE-15-SP2_Update/_meta' => EOF my @files = qw(Mojolicious-7.25.tar.gz perl-Mojolicious.changes perl-Mojolicious.spec); -get("/public/source/:project/perl-Mojolicious.SUSE_SLE-15-SP2_Update//$_" => [project => ['SUSE:Maintenance:4321']] => +get("/source/:project/perl-Mojolicious.SUSE_SLE-15-SP2_Update//$_" => [project => ['SUSE:Maintenance:4321']] => {data => path(__FILE__)->sibling('legal-bot', 'perl-Mojolicious', 'c7cfdab0e71b0bebfdf8b2dc3badfecd', $_)->slurp}) for @files; -get '/public/request/4321' => {text => <<'EOF'}; +get '/request/4321' => {text => <<'EOF'}; {text => <<'EOF'}; EOF -get '/public/source/:project/_attribute' => [project => 'SUSE:Maintenance:4321'] => {text => <<'EOF'}; +get '/source/:project/_attribute' => [project => 'SUSE:Maintenance:4321'] => {text => <<'EOF'}; 2024-03-27 07:00 UTC @@ -113,6 +113,7 @@ my $dir = $cavil_test->checkout_dir; # Connect mock web service my $mock_app = app; my $api = 'http://127.0.0.1:' . $t->app->obs->ua->server->app($mock_app)->url->port; +$t->app->obs->config({'127.0.0.1' => {user => 'test', password => 'testing'}}); subtest 'Embargoed package does not existy yet' => sub { $t->get_ok('/package/3' => {Authorization => 'Token test_token'})->status_is(404)->content_like(qr/No such package/); @@ -141,7 +142,7 @@ subtest 'Embargoed packages' => sub { my $job = shift; my $task = $job->task; return unless $task eq 'obs_import' || $task eq 'obs_embargo'; - $job->app->obs(Cavil::OBS->new); + $job->app->obs(Cavil::OBS->new(config => $job->app->obs->config)); my $api = 'http://127.0.0.1:' . $job->app->obs->ua->server->app($mock_app)->url->port; $job->args->[1]{api} = $api; } diff --git a/t/obs.t b/t/obs.t index 01c94ed12f..e634affe35 100644 --- a/t/obs.t +++ b/t/obs.t @@ -1,4 +1,4 @@ -# Copyright (C) 2018-2020 SUSE LLC +# Copyright (C) 2018-2024 SUSE LLC # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by @@ -43,7 +43,7 @@ app->routes->add_condition( } ); -get '/public/source/:project/kernel-default' => [project => ['openSUSE:Factory']] => (query => {view => 'info'}) => +get '/source/:project/kernel-default' => [project => ['openSUSE:Factory']] => (query => {view => 'info'}) => {text => <<'EOF'}; EOF -get '/public/source/:project/kernel-default' => [project => ['openSUSE:Factory']] => +get '/source/:project/kernel-default' => [project => ['openSUSE:Factory']] => (query => {expand => 1, rev => '74ee00bc30bdaf23acbfba25a893b52a'}) => {text => <<'EOF'}; @@ -68,7 +68,7 @@ get '/public/source/:project/kernel-default' => [projec EOF -get '/public/source/:project/kernel-source' => [project => ['openSUSE:Factory']] => +get '/source/:project/kernel-source' => [project => ['openSUSE:Factory']] => (query => {expand => 1, rev => '75a7d6524faa9d48cd415a62feadea8e'}) => {text => <<'EOF'}; @@ -81,7 +81,7 @@ get '/public/source/:project/kernel-source' => [projec EOF -get '/public/source/:project/kernel-source' => [project => ['openSUSE:Factory']] => +get '/source/:project/kernel-source' => [project => ['openSUSE:Factory']] => (query => {rev => 'bb19066400b2b60e2310b45f10d12f56'}) => {text => <<'EOF'}; @@ -90,15 +90,15 @@ get '/public/source/:project/kernel-source' => [project => ['openSU EOF -get '/public/source/:project/kernel-source/_meta' => [project => ['openSUSE:Factory']] => {text => <<'EOF'}; +get '/source/:project/kernel-source/_meta' => [project => ['openSUSE:Factory']] => {text => <<'EOF'}; The Linux Kernel Sources EOF -get '/public/source/:project/perl-Mojolicious' => [project => ['openSUSE:Factory']] => - (query => {view => 'info', rev => '3'}) => {text => <<'EOF'}; +get '/source/:project/perl-Mojolicious' => [project => ['openSUSE:Factory']] => + (query => {view => 'info', rev => '3'}) => {text => <<'EOF'}; @@ -106,14 +106,14 @@ get '/public/source/:project/perl-Mojolicious' => [project => ['openSUSE:Factory EOF -get '/public/source/:project/perl-Mojolicious/_meta' => [project => ['openSUSE:Factory']] => {text => <<'EOF'}; +get '/source/:project/perl-Mojolicious/_meta' => [project => ['openSUSE:Factory']] => {text => <<'EOF'}; The Web In A Box! EOF -get '/public/source/:project/perl-Mojolicious' => [project => ['home:kraih']] => (query => {view => 'info'}) => +get '/source/:project/perl-Mojolicious' => [project => ['home:kraih']] => (query => {view => 'info'}) => {text => <<'EOF'}; EOF -get '/public/source/:project/perl-Mojolicious/_meta' => [project => ['home:kraih']] => {text => <<'EOF'}; +get '/source/:project/perl-Mojolicious/_meta' => [project => ['home:kraih']] => {text => <<'EOF'}; Mojolicious @@ -133,7 +133,7 @@ get '/public/source/:project/perl-Mojolicious/_meta' => [project => ['home:kraih EOF -get '/public/source/:project/perl-Mojolicious' => [project => ['home:kraih']] => +get '/source/:project/perl-Mojolicious' => [project => ['home:kraih']] => (query => {expand => 1, rev => [1, '0e5c2d1c0c4178869cf7fb82482b9c52']}) => {text => <<'EOF'}; @@ -149,18 +149,18 @@ get '/public/source/:project/perl-Mojolicious' => [p EOF # explicit 404 -get '/public/source/:project/perl-Mojolicious' => [project => ['openSUSE:Factory']] => - (query => {view => 'info', rev => 4}) => {text => '', status => 404}; +get '/source/:project/perl-Mojolicious' => [project => ['openSUSE:Factory']] => + (query => {view => 'info', rev => 4}) => {text => '', status => 404}; -get '/public/source/:project/perl-Mojolicious/perl-Mojolicious.spec' => [project => ['home:kraih']] => - (query => {rev => '9199eca9ec0fa5cffe4c3a6cb99a8093'}) => {text => 'Mojolicious spec!'}; +get '/source/:project/perl-Mojolicious/perl-Mojolicious.spec' => [project => ['home:kraih']] => + (query => {rev => '9199eca9ec0fa5cffe4c3a6cb99a8093'}) => {text => 'Mojolicious spec!'}; -get '/public/source/:project/perl-Mojolicious/:special' => [project => ['home:kraih']] => +get '/source/:project/perl-Mojolicious/:special' => [project => ['home:kraih']] => (query => {rev => '9199eca9ec0fa5cffe4c3a6cb99a8093'}) => [special => ['perl-Mojo#licious.changes']] => {text => 'Mojolicious changes!'}; -get '/public/source/:project/perl-WrongChecksum' => [project => ['home:kraih']] => - (query => {expand => 1, rev => 1}) => {text => <<'EOF'}; +get '/source/:project/perl-WrongChecksum' => [project => ['home:kraih']] => (query => {expand => 1, rev => 1}) => + {text => <<'EOF'}; [project => ['home:kraih']] EOF -get '/public/source/:project/perl-WrongChecksum/perl-WrongChecksum.changes' => [project => ['home:kraih']] => - (query => {rev => '9199eca9ec0fa5cffe4c3a6cb99a8093'}) => {text => 'Wrong checksum changes!'}; +get '/source/:project/perl-WrongChecksum/perl-WrongChecksum.changes' => [project => ['home:kraih']] => + (query => {rev => '9199eca9ec0fa5cffe4c3a6cb99a8093'}) => {text => 'Wrong checksum changes!'}; -get '/public/source/:project/perl-Mojo-SQLite' => (query => {expand => 1}) => [project => ['home:kraih']] => - {text => <<'EOF'}; +get '/source/:project/perl-Mojo-SQLite' => (query => {expand => 1}) => [project => ['home:kraih']] => {text => <<'EOF'}; (query => {expand => 1}) => [p EOF -get '/public/source/:project/python-monascaclient' => [project => ['Cloud:OpenStack:Factory']] => - (query => {view => 'info', rev => 4}) => {text => <<'EOF'}; +get '/source/:project/python-monascaclient' => [project => ['Cloud:OpenStack:Factory']] => + (query => {view => 'info', rev => 4}) => {text => <<'EOF'}; [project => ['Cloud:OpenSt EOF -get '/public/source/:project/python-monascaclient' => [project => ['Cloud:OpenStack:Factory']] => - (query => {expand => 1, rev => 4}) => {text => <<'EOF'}; +get '/source/:project/python-monascaclient' => [project => ['Cloud:OpenStack:Factory']] => + (query => {expand => 1, rev => 4}) => {text => <<'EOF'}; [project => ['Cloud:OpenSt EOF -get '/public/source/:project/python-monascaclient' => [project => ['openSUSE:Factory']] => +get '/source/:project/python-monascaclient' => [project => ['openSUSE:Factory']] => (query => {rev => 'd41d8cd98f00b204e9800998ecf8427e'}) => {text => '', status => 404}; -get '/public/source/:project/python-monascaclient/_meta' => [project => ['Cloud:OpenStack:Factory']] => - {text => <<'EOF'}; +get '/source/:project/python-monascaclient/_meta' => [project => ['Cloud:OpenStack:Factory']] => {text => <<'EOF'}; <description/> </package> EOF -get '/public/source/:project/postgresql95-plr' => [project => ['server:database:postgresql']] => - (query => {view => 'info', rev => 2}) => {text => <<'EOF'}; +get '/source/:project/postgresql95-plr' => [project => ['server:database:postgresql']] => + (query => {view => 'info', rev => 2}) => {text => <<'EOF'}; <sourceinfo package="postgresql95-plr" rev="2" vrev="30" srcmd5="33fd6e072853f97aa64a205090f55d5e" lsrcmd5="3cb5f8a6851e65e8f10270f2bbe5dac4" @@ -247,8 +245,8 @@ get '/public/source/:project/postgresql95-plr' => [project => ['server:database: </sourceinfo> EOF -get '/public/source/:project/postgresql96-plr' => [project => ['server:database:postgresql']] => - (query => {view => 'info', rev => 2}) => {text => <<'EOF'}; +get '/source/:project/postgresql96-plr' => [project => ['server:database:postgresql']] => + (query => {view => 'info', rev => 2}) => {text => <<'EOF'}; <sourceinfo package="postgresql96-plr" rev="2" vrev="30" srcmd5="e9cb3655b11bd63d07210a161240330c" lsrcmd5="36b5b26094ae578303e70881a7e246b8" @@ -258,8 +256,8 @@ get '/public/source/:project/postgresql96-plr' => [project => ['server:database: </sourceinfo> EOF -get '/public/source/:project/postgresql96-plr' => [project => ['server:database:postgresql']] => - (query => {rev => 2, expand => 1}) => {text => <<'EOF'}; +get '/source/:project/postgresql96-plr' => [project => ['server:database:postgresql']] => + (query => {rev => 2, expand => 1}) => {text => <<'EOF'}; <directory name="postgresql96-plr" rev="e9cb3655b11bd63d07210a161240330c" vrev="30" srcmd5="e9cb3655b11bd63d07210a161240330c"> <linkinfo project="server:database:postgresql" package="postgresql-plr" @@ -287,8 +285,8 @@ get '/public/source/:project/postgresql96-plr' => [project => ['server:database: </directory> EOF -get '/public/source/:project/postgresql95-plr' => [project => ['server:database:postgresql']] => - (query => {rev => 2, expand => 1}) => {text => <<'EOF'}; +get '/source/:project/postgresql95-plr' => [project => ['server:database:postgresql']] => + (query => {rev => 2, expand => 1}) => {text => <<'EOF'}; <directory name="postgresql95-plr" rev="33fd6e072853f97aa64a205090f55d5e" vrev="30" srcmd5="33fd6e072853f97aa64a205090f55d5e"> <linkinfo project="server:database:postgresql" package="postgresql-plr" @@ -316,7 +314,7 @@ get '/public/source/:project/postgresql95-plr' => [project => ['server:database: </directory> EOF -get '/public/source/:project/postgresql-plr' => [project => ['server:database:postgresql']] => +get '/source/:project/postgresql-plr' => [project => ['server:database:postgresql']] => (query => {expand => 1, rev => '7ee96456a79d70a12270cb1d045cca3c'}) => {text => <<'EOF'}; <directory name="postgresql-plr" rev="7ee96456a79d70a12270cb1d045cca3c" srcmd5="7ee96456a79d70a12270cb1d045cca3c"> @@ -361,7 +359,7 @@ get '/public/source/:project/postgresql-plr' => [projec </directory> EOF -get '/public/source/:project/postgresql-plr/_meta' => [project => ['server:database:postgresql']] => {text => <<'EOF'}; +get '/source/:project/postgresql-plr/_meta' => [project => ['server:database:postgresql']] => {text => <<'EOF'}; <package name="postgresql-plr" project="server:database:postgresql"> <title>PL/R - R Procedural Language for PostgreSQL @@ -371,8 +369,7 @@ get '/public/source/:project/postgresql-plr/_meta' => [project => ['server:datab EOF -get '/public/source/:project/postgresql95-plr/_meta' => [project => ['server:database:postgresql']] => - {text => <<'EOF'}; +get '/source/:project/postgresql95-plr/_meta' => [project => ['server:database:postgresql']] => {text => <<'EOF'}; PL/R - R Procedural Language for PostgreSQL @@ -382,8 +379,7 @@ get '/public/source/:project/postgresql95-plr/_meta' => [project => ['server:dat EOF -get '/public/source/:project/postgresql96-plr/_meta' => [project => ['server:database:postgresql']] => - {text => <<'EOF'}; +get '/source/:project/postgresql96-plr/_meta' => [project => ['server:database:postgresql']] => {text => <<'EOF'}; PL/R - R Procedural Language for PostgreSQL @@ -393,7 +389,7 @@ get '/public/source/:project/postgresql96-plr/_meta' => [project => ['server:dat EOF -get '/public/request/1234' => {text => <<'EOF'}; +get '/request/1234' => {text => <<'EOF'}; {text => <<'EOF'}; EOF -get '/public/source/:project/_attribute' => [project => 'SUSE:Maintenance:4321'] => {text => <<'EOF'}; +get '/source/:project/_attribute' => [project => 'SUSE:Maintenance:4321'] => {text => <<'EOF'}; 2024-03-27 07:00 UTC @@ -412,7 +408,7 @@ get '/public/source/:project/_attribute' => [project => 'SUSE:Maintenance:4321'] EOF -get '/public/request/1235' => {text => <<'EOF'}; +get '/request/1235' => {text => <<'EOF'}; {text => <<'EOF'}; EOF -get '/public/source/:project/_attribute' => [project => 'SUSE:Maintenance:5321'] => {text => <<'EOF'}; +get '/source/:project/_attribute' => [project => 'SUSE:Maintenance:5321'] => {text => <<'EOF'}; EOF -get '/public/request/324874' => {text => <<'EOF'}; +get '/request/324874' => {text => <<'EOF'}; {text => <<'EOF'}; EOF -get '/public/source/:project/_attribute' => [project => 'SUSE:Maintenance:33127'] => {text => <<'EOF'}; +get '/source/:project/_attribute' => [project => 'SUSE:Maintenance:33127'] => {text => <<'EOF'}; EOF -get '/public/source/:project/_attribute' => [project => 'SUSE:Maintenance:34725'] => {text => <<'EOF'}; +get '/source/:project/_attribute' => [project => 'SUSE:Maintenance:34725'] => {text => <<'EOF'}; 2024-07-16 12:00 UTC @@ -555,7 +551,7 @@ get '/public/source/:project/_attribute' => [project => 'SUSE:Maintenance:34725' EOF -get '/public/request/5678' => {text => <<'EOF'}; +get '/request/5678' => {text => <<'EOF'}; {text => <<'EOF'}; EOF -get '/public/source/:project/_attribute' => [project => 'SUSE:Maintenance:5678'] => {status => 400, text => <<'EOF'}; +get '/source/:project/_attribute' => [project => 'SUSE:Maintenance:5678'] => {status => 400, text => <<'EOF'}; Attribute access to remote project is not yet supported {text => <<'EOF'}; +get '/request/6789' => {text => <<'EOF'}; {text => <<'EOF'}; EOF -get '/public/source/:project/_attribute' => [project => 'SUSE:Maintenance:6789'] => {status => 501, text => <<'EOF'}; +get '/source/:project/_attribute' => [project => 'SUSE:Maintenance:6789'] => {status => 501, text => <<'EOF'}; Attribute access to remote project is not yet supported [project => ['openSUSE:Factory']] => (query => {view => 'info'}) => sub ($c) { +get '/source/:project/kernel-test' => [project => ['openSUSE:Factory']] => (query => {view => 'info'}) => sub ($c) { if (($c->req->headers->authorization // '') =~ /^Signature keyId="legaldb",algorithm="ssh",.+,created="\d+"$/) { $AUTHENTICATED = 1; $c->render(data => <<'EOF'); - @@ -614,6 +610,7 @@ get '/*whatever' => {whatever => ''} => {text => '', status => 404}; # Connect mock web service my $obs = Cavil::OBS->new; my $api = 'http://127.0.0.1:' . $obs->ua->server->app(app)->url->port; +$obs->config({'127.0.0.1' => {user => 'test', password => 'testing'}}); subtest 'Package info' => sub { my $info = { @@ -706,6 +703,7 @@ subtest 'Bot API (with Minion background jobs)' => sub { # Connect with mock web service $t->app->obs->ua->server->app(app); my $api = 'http://127.0.0.1:' . $t->app->obs->ua->server->app(app)->url->port; + $t->app->obs->config({'127.0.0.1' => {user => 'test', password => 'testing'}}); # Validation errors $t->post_ok('/packages')->status_is(403); @@ -753,17 +751,15 @@ AAAEAnJpCOHj1O0O8oCygQJ6pjDT+827VkQXq98zApns/VYRDWS3I4IUMxQhX0Z9pmKjw0 09PT2YdwbRanHdujvHDMAAAACmNhdmlsQHRlc3QBAgM= -----END OPENSSH PRIVATE KEY----- EOF - $obs->user('legaldb'); - $obs->ssh_key($private_key->to_string); - $obs->ssh_hosts(['127.0.0.1']); + $obs->config({'127.0.0.1' => {user => 'legaldb', ssh_key => $private_key->to_string}}); my $info = { srcmd5 => '74ee00bc30bdaf23acbfba25a893b52a', - package => 'kernel-default', + package => 'kernel-test', verifymd5 => 'bb19066400b2b60e2310b45f10d12f56' }; ok !$AUTHENTICATED, 'not authenticated'; - is_deeply $obs->package_info($api, 'openSUSE:Factory', 'kernel-default'), $info, 'right structure'; + is_deeply $obs->package_info($api, 'openSUSE:Factory', 'kernel-test'), $info, 'right structure'; ok $AUTHENTICATED, 'authenticated'; };