Skip to content

Commit fee459e

Browse files
committed
Request results filtered by arch and repository
1 parent 8c99dbe commit fee459e

File tree

5 files changed

+91
-18
lines changed

5 files changed

+91
-18
lines changed

obsctl/src/main.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ async fn monitor(client: Client, opts: Package) -> Result<()> {
4444
let p = client.project(opts.project).package(opts.package.clone());
4545
let mut last: Vec<MonitorData> = Vec::new();
4646
loop {
47-
let result = p.result().await?;
47+
let result = p.result(Default::default()).await?;
4848
for r in result.results {
4949
let data = MonitorData::from_result(r, &opts.package);
5050

open-build-service-api/examples/obsapi.rs

+11-3
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
use anyhow::{Context, Result};
22
use clap::Parser;
33
use futures::prelude::*;
4-
use open_build_service_api::{Client, PackageLogStreamOptions};
4+
use open_build_service_api::{BuildTargerSpec, Client, PackageLogStreamOptions};
55
use oscrc::Oscrc;
66
use std::path::PathBuf;
77
use tokio::io::AsyncWriteExt;
@@ -25,6 +25,10 @@ struct Package {
2525
struct BuildResult {
2626
project: String,
2727
package: Option<String>,
28+
#[arg(long, short)]
29+
repository: Option<String>,
30+
#[arg(long, short)]
31+
arch: Option<String>,
2832
}
2933

3034
async fn jobstatus(client: Client, opts: PackageFull) -> Result<()> {
@@ -70,11 +74,15 @@ async fn list(client: Client, opts: Package) -> Result<()> {
7074

7175
async fn result(client: Client, opts: BuildResult) -> Result<()> {
7276
let p = client.project(opts.project);
77+
let result_options = BuildTargerSpec {
78+
repository: opts.repository,
79+
arch: opts.arch,
80+
};
7381
if let Some(package) = opts.package {
7482
let p = p.package(package);
75-
println!("{:#?}", p.result().await);
83+
println!("{:#?}", p.result(result_options).await);
7684
} else {
77-
println!("{:#?}", p.result().await);
85+
println!("{:#?}", p.result(result_options).await);
7886
}
7987

8088
Ok(())

open-build-service-api/src/lib.rs

+28-6
Original file line numberDiff line numberDiff line change
@@ -365,8 +365,8 @@ impl<'de> Deserialize<'de> for BranchStatus {
365365
}
366366
}
367367

368-
#[derive(Deserialize, Debug)]
369-
pub struct PackageBuildMetaDisable {
368+
#[derive(Deserialize, Debug, Default)]
369+
pub struct BuildTargerSpec {
370370
#[serde(default)]
371371
pub repository: Option<String>,
372372
#[serde(default)]
@@ -376,7 +376,7 @@ pub struct PackageBuildMetaDisable {
376376
#[derive(Deserialize, Debug, Default)]
377377
pub struct PackageBuildMeta {
378378
#[serde(rename = "disable")]
379-
pub disabled: Vec<PackageBuildMetaDisable>,
379+
pub disabled: Vec<BuildTargerSpec>,
380380
}
381381

382382
#[derive(Deserialize, Debug)]
@@ -1031,14 +1031,25 @@ impl<'a> PackageBuilder<'a> {
10311031
self.client.post_request(u).await
10321032
}
10331033

1034-
pub async fn result(&self) -> Result<ResultList> {
1034+
pub async fn result(&self, filter: BuildTargerSpec) -> Result<ResultList> {
10351035
let mut u = self.client.base.clone();
10361036
u.path_segments_mut()
10371037
.map_err(|_| Error::InvalidUrl)?
10381038
.push("build")
10391039
.push(&self.project)
10401040
.push("_result");
1041-
u.query_pairs_mut().append_pair("package", &self.package);
1041+
1042+
{
1043+
let mut q = u.query_pairs_mut();
1044+
q.append_pair("package", &self.package);
1045+
if let Some(repository) = &filter.repository {
1046+
q.append_pair("repository", repository);
1047+
}
1048+
if let Some(arch) = &filter.arch {
1049+
q.append_pair("arch", arch);
1050+
}
1051+
}
1052+
10421053
self.client.request(u).await
10431054
}
10441055
}
@@ -1088,13 +1099,24 @@ impl<'a> ProjectBuilder<'a> {
10881099
self.client.request(u).await
10891100
}
10901101

1091-
pub async fn result(&self) -> Result<ResultList> {
1102+
pub async fn result(&self, filter: BuildTargerSpec) -> Result<ResultList> {
10921103
let mut u = self.client.base.clone();
10931104
u.path_segments_mut()
10941105
.map_err(|_| Error::InvalidUrl)?
10951106
.push("build")
10961107
.push(&self.project)
10971108
.push("_result");
1109+
1110+
{
1111+
let mut q = u.query_pairs_mut();
1112+
if let Some(repository) = &filter.repository {
1113+
q.append_pair("repository", repository);
1114+
}
1115+
if let Some(arch) = &filter.arch {
1116+
q.append_pair("arch", arch);
1117+
}
1118+
}
1119+
10981120
self.client.request(u).await
10991121
}
11001122

open-build-service-api/tests/integration.rs

+36-4
Original file line numberDiff line numberDiff line change
@@ -1046,7 +1046,7 @@ async fn test_build_results() {
10461046
.project(TEST_PROJECT.to_owned())
10471047
.package(TEST_PACKAGE_2.to_owned());
10481048

1049-
let results = project.result().await.unwrap();
1049+
let results = project.result(Default::default()).await.unwrap();
10501050
let (arch1_repo, arch2_repo) = get_results_by_arch(results);
10511051

10521052
assert_eq!(arch1_repo.project, TEST_PROJECT);
@@ -1070,7 +1070,23 @@ async fn test_build_results() {
10701070
assert_eq!(package2_status.details.as_ref().unwrap(), details);
10711071
assert!(package2_status.dirty);
10721072

1073-
let results = package_2.result().await.unwrap();
1073+
// Test project filter
1074+
let results = project
1075+
.result(BuildTargerSpec {
1076+
repository: Some(TEST_REPO.to_owned()),
1077+
arch: Some(TEST_ARCH_1.to_owned()),
1078+
})
1079+
.await
1080+
.unwrap();
1081+
1082+
let arch1_repo = &results.results[0];
1083+
assert_eq!(arch1_repo.project, TEST_PROJECT);
1084+
assert_eq!(arch1_repo.repository, TEST_REPO);
1085+
assert_eq!(arch1_repo.arch, TEST_ARCH_1);
1086+
assert_eq!(arch1_repo.code, RepositoryCode::Building);
1087+
assert_eq!(results.results.len(), 1);
1088+
1089+
let results = package_2.result(Default::default()).await.unwrap();
10741090
let (arch1_repo, arch2_repo) = get_results_by_arch(results);
10751091

10761092
assert_eq!(arch1_repo.statuses.len(), 0);
@@ -1089,7 +1105,7 @@ async fn test_build_results() {
10891105
MockBuildStatus::new(MockPackageCode::Broken),
10901106
);
10911107

1092-
let results = project.result().await.unwrap();
1108+
let results = project.result(Default::default()).await.unwrap();
10931109
let (arch1_repo, _) = get_results_by_arch(results);
10941110

10951111
let package2_arch2 = arch1_repo
@@ -1100,14 +1116,30 @@ async fn test_build_results() {
11001116
assert_eq!(package2_arch2.package, TEST_PACKAGE_2);
11011117
assert_eq!(package2_arch2.code, PackageCode::Broken);
11021118

1103-
let results = package_2.result().await.unwrap();
1119+
let results = package_2.result(Default::default()).await.unwrap();
11041120
let (arch1_repo, arch2_repo) = get_results_by_arch(results);
11051121

11061122
assert_eq!(arch1_repo.statuses.len(), 1);
11071123
assert_eq!(arch2_repo.statuses.len(), 1);
11081124

11091125
assert_eq!(arch1_repo.statuses[0].package, TEST_PACKAGE_2);
11101126
assert_eq!(arch2_repo.statuses[0].package, TEST_PACKAGE_2);
1127+
1128+
// Test package filter
1129+
let results = package_2
1130+
.result(BuildTargerSpec {
1131+
repository: Some(TEST_REPO.to_owned()),
1132+
arch: Some(TEST_ARCH_2.to_owned()),
1133+
})
1134+
.await
1135+
.unwrap();
1136+
1137+
let arch2_repo = &results.results[0];
1138+
assert_eq!(arch2_repo.project, TEST_PROJECT);
1139+
assert_eq!(arch2_repo.repository, TEST_REPO);
1140+
assert_eq!(arch2_repo.code, RepositoryCode::Broken);
1141+
assert_eq!(arch2_repo.statuses.len(), 1);
1142+
assert_eq!(results.results.len(), 1);
11111143
}
11121144

11131145
#[tokio::test]

open-build-service-mock/src/api/build.rs

+15-4
Original file line numberDiff line numberDiff line change
@@ -270,9 +270,15 @@ impl Respond for BuildResultsResponder {
270270
let project_name = components.nth_back(1).unwrap();
271271

272272
let mut package_filters = vec![];
273+
let mut arch_filter = None;
274+
let mut repository_filter = None;
273275
for (key, value) in request.url.query_pairs() {
274-
ensure!(key == "package", unknown_parameter(&key));
275-
package_filters.push(value);
276+
match key.as_ref() {
277+
"package" => package_filters.push(value),
278+
"arch" => arch_filter = Some(value),
279+
"repository" => repository_filter = Some(value),
280+
_ => return unknown_parameter(&key).into_response(),
281+
};
276282
}
277283

278284
let projects = self.mock.projects().read().unwrap();
@@ -293,8 +299,13 @@ impl Respond for BuildResultsResponder {
293299
// these are computed.
294300
.with_attribute(("state", "3ff37f67d60b76bd0491a5243311ba81"))
295301
.write_inner_content(|writer| {
296-
for (repo_name, arches) in &project.repos {
297-
for (arch, repo) in arches {
302+
for (repo_name, arches) in project.repos.iter().filter(|(repo_name, _)| {
303+
repository_filter.as_ref().map_or(true, |f| f == *repo_name)
304+
}) {
305+
for (arch, repo) in arches
306+
.iter()
307+
.filter(|(arch, _)| arch_filter.as_ref().map_or(true, |f| f == *arch))
308+
{
298309
let result_xml = writer.create_element("result").with_attributes([
299310
("project", project_name),
300311
("repository", repo_name.as_str()),

0 commit comments

Comments
 (0)