Skip to content

Commit f9a0ef0

Browse files
Merge pull request #1706 from stuartwdouglas/auto-validation
Automatically create validation rules
2 parents 1eb3671 + d65f882 commit f9a0ef0

File tree

11 files changed

+147
-15
lines changed

11 files changed

+147
-15
lines changed

java-components/build-request-processor/src/main/java/com/redhat/hacbs/container/verifier/VerifyBuiltArtifactsCommand.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -242,12 +242,12 @@ private List<String> getExcludes() throws IOException {
242242
}
243243

244244
for (var exclude : excludes) {
245-
if (!exclude.matches("^[+-^]:.*$")) {
246-
Log.errorf("Invalid exclude %s", exclude);
247-
return null;
245+
if (exclude.matches("^[+-^]:.*$")) {
246+
newExcludes.add(exclude.replaceAll("^([+-^])", "^\\\\$1"));
247+
} else {
248+
newExcludes.add(exclude);
248249
}
249250

250-
newExcludes.add(exclude.replaceAll("^([+-^])", "^\\\\$1"));
251251
}
252252

253253
return newExcludes;

java-components/cache/src/main/java/com/redhat/hacbs/artifactcache/artifactwatch/ScmLookup.java

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,7 @@ public void onAdd(ArtifactBuild newObj) {
7171
if (newObj.getStatus() == null || newObj.getStatus().getState() == null
7272
|| Objects.equals(newObj.getStatus().getState(), "")
7373
|| Objects.equals(newObj.getStatus().getState(), ModelConstants.ARTIFACT_BUILD_NEW)) {
74+
Log.infof("updating SCM info for %s", newObj.getMetadata().getName());
7475
try {
7576
if (newObj.getStatus() == null) {
7677
newObj.setStatus(new ArtifactBuildStatus());
@@ -83,9 +84,6 @@ public void onAdd(ArtifactBuild newObj) {
8384
//if this is a forced rebuild we always update the SCM info
8485
//there is a good chance there may be a new recipe
8586
recipeManager.forceUpdate();
86-
// Not updating rebuild annotation as that will be handled in artifactbuild.go Reconcile
87-
// operator loop.
88-
return; //the update should trigger the watch again
8987
}
9088
Scm scm = new Scm();
9189

java-components/management-console/src/main/java/com/redhat/hacbs/management/resources/AdminResource.java

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
package com.redhat.hacbs.management.resources;
22

33
import java.util.HashMap;
4+
import java.util.HashSet;
45
import java.util.Map;
6+
import java.util.Set;
57
import java.util.function.UnaryOperator;
68

79
import jakarta.inject.Inject;
@@ -55,16 +57,28 @@ public void rebuildAll() {
5557
@POST
5658
@Path("rebuild-failed")
5759
public void rebuildFailed() {
60+
Set<String> seen = new HashSet<>();
5861
for (StoredArtifactBuild sb : StoredArtifactBuild.<StoredArtifactBuild> list("state",
5962
ModelConstants.ARTIFACT_BUILD_MISSING)) {
6063
BuildQueue.rebuild(sb.mavenArtifact, false, Map.of());
6164
}
6265
for (StoredArtifactBuild sb : StoredArtifactBuild.<StoredArtifactBuild> list("state",
6366
ModelConstants.ARTIFACT_BUILD_FAILED)) {
64-
BuildQueue.rebuild(sb.mavenArtifact, false, Map.of());
67+
if (sb.buildIdentifier == null || sb.buildIdentifier.dependencyBuildName == null) {
68+
BuildQueue.rebuild(sb.mavenArtifact, false, Map.of());
69+
} else if (!seen.contains(sb.buildIdentifier.dependencyBuildName)) {
70+
BuildQueue.rebuild(sb.mavenArtifact, false, Map.of());
71+
seen.add(sb.buildIdentifier.dependencyBuildName);
72+
}
6573
}
6674
}
6775

76+
@POST
77+
@Path("clear-build-queue")
78+
public void clearBuildQueue() {
79+
BuildQueue.deleteAll();
80+
}
81+
6882
@POST
6983
@Path("import-froms3")
7084
public void s3Import() {

java-components/management-console/src/main/java/com/redhat/hacbs/management/resources/BuildInfoEditResource.java

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
11
package com.redhat.hacbs.management.resources;
22

3+
import java.util.ArrayList;
34
import java.util.Optional;
5+
import java.util.regex.Pattern;
46

7+
import jakarta.transaction.Transactional;
58
import jakarta.ws.rs.Consumes;
69
import jakarta.ws.rs.GET;
710
import jakarta.ws.rs.POST;
@@ -13,6 +16,8 @@
1316
import org.eclipse.microprofile.openapi.annotations.media.Schema;
1417

1518
import com.redhat.hacbs.common.tools.repo.BuildInfoService;
19+
import com.redhat.hacbs.management.dto.BuildAttemptDTO;
20+
import com.redhat.hacbs.management.model.BuildAttempt;
1621
import com.redhat.hacbs.recipes.build.BuildRecipeInfo;
1722

1823
@Path("/build-info/edit")
@@ -37,6 +42,38 @@ public EditResult modify(BuildInfoService.BuildEditInfo command) {
3742
return ret;
3843
}
3944

45+
@POST
46+
@Consumes(MediaType.APPLICATION_JSON)
47+
@Produces(MediaType.APPLICATION_JSON)
48+
@Transactional
49+
@Path("approve-validation")
50+
public EditResult modify(BuildAttemptDTO buildAttemptDTO) {
51+
BuildAttempt ba = BuildAttempt.findById(buildAttemptDTO.id());
52+
String url = ba.dependencyBuild.buildIdentifier.repository.url;
53+
BuildInfoService.BuildEditInfo info;
54+
Optional<BuildInfoService.BuildEditInfo> scmInfo = BuildInfoService.getBuildInfo(url);
55+
if (scmInfo.isPresent()) {
56+
info = scmInfo.get();
57+
} else {
58+
info = new BuildInfoService.BuildEditInfo(new BuildRecipeInfo(), url, false);
59+
}
60+
if (info.buildInfo().getAllowedDifferences() == null) {
61+
info.buildInfo().setAllowedDifferences(new ArrayList<>());
62+
}
63+
for (var i : buildAttemptDTO.upstreamDifferences().entrySet()) {
64+
for (var dif : i.getValue()) {
65+
var val = Pattern.quote(dif);
66+
if (!info.buildInfo().getAllowedDifferences().contains(val)) {
67+
info.buildInfo().getAllowedDifferences().add(val);
68+
}
69+
}
70+
}
71+
var prUrul = BuildInfoService.writeBuildInfo(info);
72+
EditResult ret = new EditResult();
73+
ret.prUrl = prUrul;
74+
return ret;
75+
}
76+
4077
public static class EditResult {
4178
@Schema(required = true)
4279
public String prUrl;

java-components/management-console/src/main/resources/application.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ quarkus.jib.user=0
1212
# Dev Config
1313
%dev.quarkus.kubernetes-client.trust-certs=true
1414
bucket.name=jvm-build-service-data
15-
concurrent-builds=20
15+
concurrent-builds=10
1616
%test.concurrent-builds=8
1717
%test.quarkus.kubernetes-client.trust-certs=true
1818

java-components/management-console/src/main/webui/src/app/BuildView/BuildView.tsx

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import {
55
ArtifactListDTO,
66
BuildAttemptDTO,
77
BuildDTO,
8-
BuildHistoryResourceService,
8+
BuildHistoryResourceService, BuildInfoEditResourceService,
99
BuildQueueResourceService
1010
} from "../../services/openapi";
1111
import {Link, RouteComponentProps} from "react-router-dom";
@@ -44,7 +44,8 @@ import {
4444
MinusIcon,
4545
PlusIcon,
4646
QuestionIcon,
47-
WarningTriangleIcon
47+
WarningTriangleIcon,
48+
GithubIcon
4849
} from "@patternfly/react-icons";
4950
import {Table, Tbody, Td, Th, Thead, Tr} from "@patternfly/react-table";
5051
import {DependencySet, StoredArtifactView} from "../../components";
@@ -293,6 +294,7 @@ type BuildAttemptType = {
293294
const BuildAttempt: React.FunctionComponent<BuildAttemptType> = (data: BuildAttemptType) => {
294295

295296
const [activeTabKey, setActiveTabKey] = React.useState<string | number>(0);
297+
const [prUrl, setPrUrl] = useState('');
296298
const handleTabClick = (
297299
event: React.MouseEvent<any> | React.KeyboardEvent | MouseEvent,
298300
tabIndex: string | number
@@ -311,7 +313,14 @@ const BuildAttempt: React.FunctionComponent<BuildAttemptType> = (data: BuildAtte
311313
Build Failed
312314
</Label>
313315
}
316+
const saveVerificationInfo = () => {
314317

318+
BuildInfoEditResourceService.postApiBuildInfoEditApproveValidation(data.attempt)
319+
.then((ret) => {
320+
console.log(ret.prUrl)
321+
setPrUrl(ret.prUrl)
322+
})
323+
}
315324
return (<Tabs activeKey={activeTabKey}
316325
onSelect={handleTabClick}
317326
isBox
@@ -346,6 +355,17 @@ const BuildAttempt: React.FunctionComponent<BuildAttemptType> = (data: BuildAtte
346355
<CardHeader>Verification Failures</CardHeader>
347356
<CardBody>
348357
<DescriptionList>
358+
<DescriptionListGroup>
359+
<DescriptionListTerm>Fix Errors</DescriptionListTerm>
360+
<DescriptionListDescription>
361+
<Button key="create" variant="primary" form="modal-with-form-form" onClick={saveVerificationInfo} disabled={prUrl.length > 0}>
362+
Approve Validation Differences
363+
</Button>
364+
{prUrl.length == 0 ? <></> :
365+
<a href={prUrl} target={'_blank'}><GithubIcon></GithubIcon>{prUrl}</a>
366+
}
367+
</DescriptionListDescription>
368+
</DescriptionListGroup>
349369
{Object.entries(selectBuildAttempt.upstreamDifferences).map(([key, value]) => {
350370
return <DescriptionListGroup key={key}>
351371
<DescriptionListTerm>{key}</DescriptionListTerm>

java-components/management-console/src/main/webui/src/app/ControlPanel/ControlPanel.tsx

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,25 +19,30 @@ const ControlPanel: React.FunctionComponent = () => {
1919
<CardBody>
2020
<ActionList>
2121
<ActionListItem>
22-
<Button variant="danger" id="rebuild-all" onClick={() => AdminResourceService.postApiAdminRebuildAll()}>
22+
<Button variant="danger" id="rebuild-all" onClick={AdminResourceService.postApiAdminRebuildAll}>
2323
Rebuild All
2424
</Button>
2525
</ActionListItem>
2626
<ActionListItem>
27-
<Button variant="warning" id="rebuild-failed" onClick={() => AdminResourceService.postApiAdminRebuildFailed()}>
27+
<Button variant="warning" id="rebuild-failed" onClick={AdminResourceService.postApiAdminRebuildFailed}>
2828
Rebuild Failed
2929
</Button>
3030
</ActionListItem>
3131
<ActionListItem>
32-
<Button variant="danger" id="rebuild-failed" onClick={() => AdminResourceService.postApiAdminCleanOutDatabase()}>
32+
<Button variant="danger" id="rebuild-failed" onClick={AdminResourceService.postApiAdminCleanOutDatabase}>
3333
Delete All Data
3434
</Button>
3535
</ActionListItem>
3636
<ActionListItem>
37-
<Button variant="warning" id="s3-import" onClick={() => AdminResourceService.postApiAdminImportFroms3()}>
37+
<Button variant="warning" id="s3-import" onClick={AdminResourceService.postApiAdminImportFroms3}>
3838
S3 Import
3939
</Button>
4040
</ActionListItem>
41+
<ActionListItem>
42+
<Button variant="warning" id="s3-import" onClick={AdminResourceService.postApiAdminClearBuildQueue}>
43+
Clear Build Queue
44+
</Button>
45+
</ActionListItem>
4146
</ActionList>
4247
</CardBody>
4348
</Card>

java-components/management-console/src/main/webui/src/components/BuildEdit/BuildEdit.tsx

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -181,6 +181,37 @@ export const BuildEdit: React.FunctionComponent<BuildEditModalData> = (data) =>
181181
})}
182182
/>
183183
</FormGroup>)}
184+
185+
<FormGroup label="Allowed Differences to Upstream">
186+
<Button variant="control" onClick={() => {
187+
stateChange((s, v) => {
188+
if (s.buildInfo.allowedDifferences) {
189+
s.buildInfo.allowedDifferences.push("")
190+
} else {
191+
s.buildInfo.allowedDifferences = [""]
192+
}
193+
})(info.buildInfo, null)
194+
}}>Add Allowed Difference</Button>
195+
196+
</FormGroup>
197+
{info.buildInfo.allowedDifferences?.map((s, index) =>
198+
<FormGroup
199+
label="Difference"
200+
labelIcon={
201+
<Popover bodyContent={<div>A regex that matches a validation failure to ignore</div>}><HelpIcon/></Popover>
202+
}
203+
fieldId="artifact-edit-upstream-diff">
204+
<TextInput
205+
id="artifact-edit-upstream-diff"
206+
name="artifact-edit-upstream-diff"
207+
value={s}
208+
onChange={stateChange((s, v) => {
209+
if (s.buildInfo.allowedDifferences) {
210+
s.buildInfo.allowedDifferences[index] = v
211+
}
212+
})}
213+
/>
214+
</FormGroup>)}
184215
<FormGroup>
185216
<Button key="create" variant="primary" form="modal-with-form-form" onClick={save} disabled={prUrl.length > 0}>
186217
Confirm

java-components/management-console/src/main/webui/src/services/openapi/services/AdminResourceService.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,16 @@ export class AdminResourceService {
1616
url: '/api/admin/clean-out-database',
1717
});
1818
}
19+
/**
20+
* @returns any Created
21+
* @throws ApiError
22+
*/
23+
public static postApiAdminClearBuildQueue(): CancelablePromise<any> {
24+
return __request(OpenAPI, {
25+
method: 'POST',
26+
url: '/api/admin/clear-build-queue',
27+
});
28+
}
1929
/**
2030
* @returns any Created
2131
* @throws ApiError

java-components/management-console/src/main/webui/src/services/openapi/services/BuildInfoEditResourceService.ts

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
/* istanbul ignore file */
33
/* tslint:disable */
44
/* eslint-disable */
5+
import type { BuildAttemptDTO } from '../models/BuildAttemptDTO';
56
import type { BuildEditInfo } from '../models/BuildEditInfo';
67
import type { EditResult1 } from '../models/EditResult1';
78
import type { CancelablePromise } from '../core/CancelablePromise';
@@ -39,4 +40,19 @@ export class BuildInfoEditResourceService {
3940
mediaType: 'application/json',
4041
});
4142
}
43+
/**
44+
* @param requestBody
45+
* @returns EditResult1 OK
46+
* @throws ApiError
47+
*/
48+
public static postApiBuildInfoEditApproveValidation(
49+
requestBody?: BuildAttemptDTO,
50+
): CancelablePromise<EditResult1> {
51+
return __request(OpenAPI, {
52+
method: 'POST',
53+
url: '/api/build-info/edit/approve-validation',
54+
body: requestBody,
55+
mediaType: 'application/json',
56+
});
57+
}
4258
}

0 commit comments

Comments
 (0)