Skip to content

Commit

Permalink
[backend] support buildtime source services
Browse files Browse the repository at this point in the history
* skip them on service server
* add dependencies to build env
  • Loading branch information
adrianschroeter committed Apr 17, 2015
1 parent 0ea5baa commit 6583424
Show file tree
Hide file tree
Showing 7 changed files with 66 additions and 3 deletions.
1 change: 1 addition & 0 deletions docs/api/api/obs.rng
Expand Up @@ -85,6 +85,7 @@
<value>trylocal</value> <!-- try on local clients and merge result, but run also on server side -->
<value>localonly</value> <!-- never run on server side, but on the clients (not enforced) -->
<value>serveronly</value> <!-- run on server side, but not on the clients by default -->
<value>buildtime</value> <!-- run during build time, pulls in services as build dependencies -->
<value>disabled</value> <!-- never run, except user explicit starts it locally -->
</choice>
</define>
Expand Down
@@ -0,0 +1,4 @@
<services>
<service name="recompresserator" mode="buildtime">
</service>
</services>
@@ -0,0 +1,6 @@
# Comment
Name: pack
Version: 12
Release: 9
Summary: absolut basic spec file

37 changes: 36 additions & 1 deletion src/api/test/functional/source_services_test.rb
Expand Up @@ -3,6 +3,11 @@

class SourceServicesTest < ActionDispatch::IntegrationTest
fixtures :all

def setup
super
wait_for_scheduler_start
end

def test_get_servicelist
get '/service'
Expand Down Expand Up @@ -84,7 +89,7 @@ def test_run_source_service
login_tom
raw_put '/source/home:tom/service/_meta', "<package project='home:tom' name='service'> <title /> <description /> </package>"
assert_response :success
raw_put '/source/home:tom/service/pack.spec', "# Comment \nVersion: 12\nRelease: 9\nSummary: asd"
raw_put '/source/home:tom/service/pack.spec', "# Comment \nName: pack\nVersion: 12\nRelease: 9\nSummary: asd"
assert_response :success

raw_put '/source/home:tom/service/_service', '<services> <service name="not_existing" /> </services>'
Expand Down Expand Up @@ -241,6 +246,36 @@ def test_run_source_service
assert_response 404
end

def test_buildtime_service
login_Iggy
raw_put '/source/home:Iggy/service/_meta', "<package project='home:Iggy' name='service'> <title /> <description /> <build><enable/></build></package>"
assert_response :success
raw_put '/source/home:Iggy/service/pack.spec', "# Comment \nName: pack\nVersion: 12\nRelease: 9\nSummary: asd"
assert_response :success

wait_for_service( 'home:Iggy', 'service')
put '/source/home:Iggy/service/_service', '<services> <service name="set_version" mode="buildtime"> <param name="version">0817</param> <param name="file">pack.spec</param> </service> </services>'
assert_response :success
wait_for_service( 'home:Iggy', 'service')
run_scheduler('i586')
get '/build/home:Iggy/_result'
assert_response :success
assert_xml_tag :tag => "details", :content => "nothing provides obs-service-set_version"

# osc local package build call
get "/build/home:Iggy/10.2/i586/service/_buildinfo"
assert_response :success
assert_xml_tag :tag => "error", :content => "unresolvable: nothing provides obs-service-set_version"
# osc local package build call sending own spec and _service file
cpio=IO.popen("cd #{Rails.root}/test/fixtures/backend/source/buildtime_service_source/; exec ls -1 | cpio -H newc -o 2>/dev/null")
raw_post "/build/home:Iggy/10.2/i586/service/_buildinfo", cpio.sysread(1024*1024)
assert_response :success
assert_xml_tag :tag => "error", :content => "unresolvable: nothing provides obs-service-recompresserator"

delete '/source/home:Iggy/service'
assert_response :success
end

def test_source_commit_with_service
login_tom
put '/source/home:tom/service/_meta', "<package project='home:tom' name='service'> <title /> <description /> </package>"
Expand Down
11 changes: 10 additions & 1 deletion src/backend/bs_repserver
Expand Up @@ -3244,13 +3244,15 @@ sub getbuildinfo_post {
# should we check if the cpio archive contains <= 2 files?
$depfile = (grep { $_->{'name'} eq 'deps' } @$uploaded)[0];
$depfile = "$dir/$depfile->{'name'}" if $depfile;
my $servicefile = (grep { $_->{'name'} eq '_service' } @$uploaded)[0];
$servicefile = "$dir/$servicefile->{'name'}" if $servicefile;
my $bifile = (grep { $_->{'name'} eq 'buildenv' } @$uploaded)[0];
$bifile = "$dir/$bifile->{'name'}" if $bifile;
$fn = (grep { $_->{'name'} ne "deps" && $_->{'name'} ne 'buildenv'} @$uploaded)[0];
die("no build recipe file found\n") unless $fn;
my @r;
eval {
@r = getbuildinfo_post({ %$cgi, '_fn' => "$dir/$fn->{'name'}", '_depfile' => $depfile, '_buildenvfile' => $bifile, '_buildtype' => Build::recipe2buildtype($fn->{'name'})}, $projid, $repoid, $arch, $packid);
@r = getbuildinfo_post({ %$cgi, '_fn' => "$dir/$fn->{'name'}", '_depfile' => $depfile, '_buildenvfile' => $bifile, '_servicefile' => $servicefile, '_buildtype' => Build::recipe2buildtype($fn->{'name'})}, $projid, $repoid, $arch, $packid);
};
unlink("$dir/$_") for ls($dir);
rmdir($dir) if -d $dir;
Expand Down Expand Up @@ -3286,6 +3288,13 @@ sub getbuildinfo_post {
}
my $pdata = {'buildtype' => $bconf->{'type'}, 'info' => [ $info ]};
$pdata->{'buildenv'} = readxml($cgi->{'_buildenvfile'}, $BSXML::buildinfo) if $cgi->{'_buildenvfile'};
if ($cgi->{'_servicefile'}) {
my $services = readxml($cgi->{'_servicefile'}, $BSXML::services);
for my $service (@{$services->{'service'} || []}) {
next unless $service->{'mode'} && $service->{'mode'} eq "buildtime";
push @{$info->{'dep'}}, "obs-service-$service->{'name'}";
}
}
$pdata->{'ldepfile'} = $depfile if defined $depfile;
return getbuildinfo($cgi, $projid, $repoid, $arch, $packid, $pdata);
}
Expand Down
2 changes: 1 addition & 1 deletion src/backend/bs_service
Expand Up @@ -144,7 +144,7 @@ sub run_source_update {
my $serviceinfo = XMLin($BSXML::services, $infoxml);
for my $service (@{$serviceinfo->{'service'}}) {
BSVerify::verify_filename($service->{'name'});
if (defined($service->{'mode'}) && ($service->{'mode'} eq 'localonly' || $service->{'mode'} eq 'disabled')) {
if (defined($service->{'mode'}) && ($service->{'mode'} eq 'localonly' || $service->{'mode'} eq 'disabled' || $service->{'mode'} eq 'buildtime')) {
print "Skip ".$service->{'name'}."\n";
next;
}
Expand Down
8 changes: 8 additions & 0 deletions src/backend/bs_srcserver
Expand Up @@ -3412,6 +3412,14 @@ sub getprojpack {
my @prereqs = grep {!$deps{$_} && !/^%/} @{$d->{'prereqs'}};
$rinfo->{'prereq'} = \@prereqs if @prereqs;
}
# add all source services to be used at build time
if ($files->{'_service'}) {
my $services = repreadxml($rev, '_service', $files->{'_service'}, $BSXML::services, 1);
for my $service (@{$services->{'service'} || []}) {
next unless $service->{'mode'} && $service->{'mode'} eq "buildtime";
push @{$rinfo->{'dep'}}, "obs-service-$service->{'name'}";
}
}
# KIWI Products need local arch added if we have it defined on this server
if ($type eq 'kiwi' && ($d->{'imagetype'}[0] || '') eq 'product' && $d->{'exclarch'}) {
$rinfo->{'imagearch'} = [ @{$d->{'exclarch'}} ];
Expand Down

0 comments on commit 6583424

Please sign in to comment.