Skip to content

Commit 1230530

Browse files
committed
WIP OpenQA::VcsProvider
1 parent 015d8d0 commit 1230530

File tree

7 files changed

+98
-66
lines changed

7 files changed

+98
-66
lines changed

lib/OpenQA/Schema/Result/ScheduledProducts.pm

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,7 @@ use OpenQA::JobSettings;
1818
use OpenQA::Jobs::Constants;
1919
use OpenQA::JobDependencies::Constants;
2020
use OpenQA::Scheduler::Client;
21-
use OpenQA::VcsProvider::GitHub;
22-
use OpenQA::VcsProvider::Gitea;
21+
use OpenQA::VcsProvider;
2322
use Mojo::JSON qw(encode_json decode_json);
2423
use OpenQA::YAML 'load_yaml';
2524
use Carp;
@@ -937,9 +936,7 @@ sub report_status_to_git ($self, $callback = undef) {
937936
my $id = $self->id;
938937
my $settings = $self->{_settings} // $self->settings;
939938
return undef unless $self->webhook_id;
940-
my ($type) = split m/:/, $self->webhook_id;
941-
my $class = {gh => 'GitHub', gitea => 'Gitea'}->{$type} or return undef;
942-
my $vcs = "OpenQA::VcsProvider::$class"->new(app => OpenQA::App->singleton);
939+
my $vcs = OpenQA::VcsProvider->new(type => $self->webhook_id, app => OpenQA::App->singleton);
943940
$vcs->read_settings($settings) or return undef;
944941
my ($state, $verb, $count, $total) = $self->state_for_ci_status;
945942
return undef unless $state;

lib/OpenQA/VcsProvider.pm

Lines changed: 9 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -3,50 +3,15 @@
33

44
package OpenQA::VcsProvider;
55

6-
use Mojo::Base -base, -signatures;
7-
use Mojo::JSON qw(encode_json);
8-
use Mojo::URL;
9-
10-
has 'app';
11-
has 'base_url';
12-
has 'statuses_url';
13-
14-
sub read_settings ($self, $settings) {
15-
$self->statuses_url($settings->{GITHUB_STATUSES_URL});
16-
$self->base_url($settings->{CI_TARGET_URL});
17-
return undef unless $self->statuses_url;
18-
return 1;
19-
}
20-
21-
sub add_params ($self, $params, $scheduled_product_id) {
22-
$params->{context} //= 'openqa';
23-
$params->{description} //= 'openQA test run';
24-
my $base_url = $self->base_url;
25-
$params->{target_url} //= "$base_url/admin/productlog?id=$scheduled_product_id"
26-
if $scheduled_product_id && $base_url;
27-
}
28-
29-
sub create_request ($self, $params) {
30-
my $app = $self->app;
31-
my $ua = $app->ua;
32-
my $url = Mojo::URL->new($self->statuses_url);
33-
my $tx = $ua->build_tx(POST => $url);
34-
my $req = $tx->req;
35-
my $json = encode_json($params);
36-
$req->body($json);
37-
my $headers = $req->headers;
38-
$headers->content_type('application/json');
39-
$headers->content_length(length $json);
40-
41-
return $tx;
42-
}
43-
44-
sub report_status_to_git ($self, $params, $scheduled_product_id, $callback = undef) {
45-
$self->add_params($params, $scheduled_product_id);
46-
47-
my $tx = $self->create_request($params);
48-
$self->app->ua->start($tx, $callback);
49-
return $tx;
6+
use Mojo::Base -signatures;
7+
use OpenQA::VcsProvider::GitHub;
8+
use OpenQA::VcsProvider::Gitea;
9+
10+
sub new ($class, %args) {
11+
my $type = delete $args{type};
12+
my ($provider) = split m/:/, $type;
13+
$class = {gh => 'GitHub', gitea => 'Gitea'}->{$provider} or return undef;
14+
return "OpenQA::VcsProvider::$class"->new(%args);
5015
}
5116

5217
1;

lib/OpenQA/VcsProvider/Base.pm

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
# Copyright SUSE LLC
2+
# SPDX-License-Identifier: GPL-2.0-or-later
3+
4+
package OpenQA::VcsProvider::Base;
5+
6+
use Mojo::Base -base, -signatures;
7+
use Mojo::JSON qw(encode_json);
8+
use Mojo::URL;
9+
10+
has 'app';
11+
has 'base_url';
12+
has 'statuses_url';
13+
14+
sub add_params ($self, $params, $scheduled_product_id) {
15+
$params->{context} //= 'openqa';
16+
$params->{description} //= 'openQA test run';
17+
my $base_url = $self->base_url;
18+
$params->{target_url} //= "$base_url/admin/productlog?id=$scheduled_product_id"
19+
if $scheduled_product_id && $base_url;
20+
}
21+
22+
sub create_request ($self, $params) {
23+
my $app = $self->app;
24+
my $ua = $app->ua;
25+
my $url = Mojo::URL->new($self->statuses_url);
26+
my $tx = $ua->build_tx(POST => $url);
27+
my $req = $tx->req;
28+
my $json = encode_json($params);
29+
$req->body($json);
30+
my $headers = $req->headers;
31+
$headers->content_type('application/json');
32+
$headers->content_length(length $json);
33+
34+
return $tx;
35+
}
36+
37+
sub report_status_to_git ($self, $params, $scheduled_product_id, $callback = undef) {
38+
$self->add_params($params, $scheduled_product_id);
39+
40+
my $tx = $self->create_request($params);
41+
$self->app->ua->start($tx, $callback);
42+
return $tx;
43+
}
44+
45+
1;

lib/OpenQA/VcsProvider/GitHub.pm

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,19 @@
33

44
package OpenQA::VcsProvider::GitHub;
55

6-
use Mojo::Base 'OpenQA::VcsProvider', -signatures;
7-
use Mojo::URL;
6+
use Mojo::Base 'OpenQA::VcsProvider::Base', -signatures;
7+
8+
sub read_settings ($self, $settings) {
9+
$self->statuses_url($settings->{GITHUB_STATUSES_URL});
10+
$self->base_url($settings->{CI_TARGET_URL});
11+
return undef unless $self->statuses_url;
12+
return 1;
13+
}
814

915
sub create_request ($self, $params) {
1016
my $tx = $self->SUPER::create_request($params);
11-
my $headers = $tx->req->headers;
1217

18+
my $headers = $tx->req->headers;
1319
my $github_token = $self->app->config->{secrets}->{github_token};
1420
$headers->header(Accept => 'application/vnd.github+json');
1521
$headers->header(Authorization => "Bearer $github_token");

lib/OpenQA/VcsProvider/Gitea.pm

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,17 +3,23 @@
33

44
package OpenQA::VcsProvider::Gitea;
55

6-
use Mojo::Base 'OpenQA::VcsProvider', -signatures;
7-
use Mojo::URL;
6+
use Mojo::Base 'OpenQA::VcsProvider::Base', -signatures;
7+
8+
sub read_settings ($self, $settings) {
9+
$self->statuses_url($settings->{GITEA_STATUSES_URL});
10+
$self->base_url($settings->{CI_TARGET_URL});
11+
return undef unless $self->statuses_url;
12+
return 1;
13+
}
814

915
sub create_request ($self, $params) {
1016
my $tx = $self->SUPER::create_request($params);
11-
my $headers = $tx->req->headers;
1217

13-
# my $github_token = $self->app->config->{secrets}->{github_token};
14-
# $headers->header(Accept => 'application/vnd.github+json');
15-
# $headers->header(Authorization => "Bearer $github_token");
16-
# $headers->header('X-GitHub-Api-Version' => '2022-11-28');
18+
my $headers = $tx->req->headers;
19+
# TODO there might be more than one gitea server -> add sections?
20+
my $token = $self->app->config->{secrets}->{gitea_token};
21+
$headers->header(Accept => 'application/json');
22+
$headers->header(Authorization => "Bearer $token");
1723

1824
return $tx;
1925
}

lib/OpenQA/WebAPI/Controller/API/V1/Webhook.pm

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ use OpenQA::Utils;
1010
use DBIx::Class::Timestamps 'now';
1111
use OpenQA::Schema::Result::JobDependencies;
1212
use OpenQA::Utils 'format_tx_error';
13-
use OpenQA::VcsProvider::GitHub;
13+
use OpenQA::VcsProvider;
1414
use Mojo::Util 'secure_compare';
1515

1616
my %SUPPORTED_PR_ACTIONS = (opened => 'opened', synchronize => 'updated', closed => 'closed');
@@ -144,7 +144,7 @@ sub product ($self) {
144144

145145
# create scheduled product and enqueue minion job with parameter
146146
my $scheduled_product = $scheduled_products->create_with_event(\%params, $self->current_user, $webhook_id);
147-
my $vcs = OpenQA::VcsProvider::GitHub->new(app => $app);
147+
my $vcs = OpenQA::VcsProvider->new(type => $webhook_id, app => $app);
148148
my $cb = sub ($ua, $tx, @) {
149149
if (my $err = $tx->error) {
150150
$scheduled_product->delete;

t/16-utils-vcs-provider.t

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,25 +4,25 @@
44

55
use Test::Most;
66

7+
use Mojo::Base -signatures;
78
use FindBin;
89
use lib "$FindBin::Bin/lib", "$FindBin::Bin/../external/os-autoinst-common/lib";
910
require OpenQA::Test::Database;
1011
use OpenQA::Test::TimeLimit '5';
1112
use OpenQA::VcsProvider::GitHub;
13+
use OpenQA::VcsProvider::Gitea;
1214
use Test::Mojo;
1315
use Test::Warnings ':report_warnings';
1416

1517
my $schema = OpenQA::Test::Database->new->create(fixtures_glob => '03-users.pl');
1618
my $t = Test::Mojo->new('OpenQA::WebAPI');
1719

18-
subtest 'reporting status to GitHub' => sub {
20+
sub test_report_status_to_git ($app, $statuses_url_key, $webhook_id) {
1921
# avoid making an actual query to GitHub; this test just checks whether an expected request would have been done
20-
my $app = $t->app;
21-
$app->config->{secrets}->{github_token} = 'some-token';
2222

23-
my $git = OpenQA::VcsProvider::GitHub->new(app => $app);
23+
my $git = OpenQA::VcsProvider->new(app => $app, type => $webhook_id);
2424
my $url = 'http://127.0.0.1/repos/some/repo/statuses/some-sha';
25-
$git->read_settings({GITHUB_STATUSES_URL => $url, CI_TARGET_URL => 'https://openqa.opensuse.org'});
25+
$git->read_settings({$statuses_url_key => $url, CI_TARGET_URL => 'https://openqa.opensuse.org'});
2626
my $tx = $git->report_status_to_git({state => 'pending'}, '42');
2727
my $req = $tx->req;
2828
is $req->method, 'POST', 'method';
@@ -38,4 +38,17 @@ subtest 'reporting status to GitHub' => sub {
3838
ok $tx->is_finished, 'transaction has finished (and thus was started in first place)';
3939
};
4040

41+
42+
subtest 'reporting status to GitHub' => sub {
43+
my $app = $t->app;
44+
$app->config->{secrets}->{github_token} = 'some-token';
45+
test_report_status_to_git($app, 'GITHUB_STATUSES_URL', 'gh:pr:123');
46+
};
47+
48+
subtest 'reporting status to Gitea' => sub {
49+
my $app = $t->app;
50+
$app->config->{secrets}->{gitea_token} = 'some-token';
51+
test_report_status_to_git($app, 'GITEA_STATUSES_URL', 'gitea:pr:123');
52+
};
53+
4154
done_testing();

0 commit comments

Comments
 (0)