diff options
Diffstat (limited to 'controller-server')
7 files changed, 88 insertions, 35 deletions
diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/Application.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/Application.java index 9208537dd98..677f2363c08 100644 --- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/Application.java +++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/Application.java @@ -53,7 +53,7 @@ public class Application { /** Creates an empty application */ public Application(ApplicationId id) { this(id, DeploymentSpec.empty, ValidationOverrides.empty, Collections.emptyMap(), - new DeploymentJobs(OptionalLong.empty(), Collections.emptyList(), Optional.empty()), + new DeploymentJobs(OptionalLong.empty(), Collections.emptyList(), Optional.empty(), false), Change.empty(), Change.empty(), Optional.empty(), new ApplicationMetrics(0, 0), Optional.empty()); } diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/LockedApplication.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/LockedApplication.java index 79e7fa0295a..2209cdf3013 100644 --- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/LockedApplication.java +++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/LockedApplication.java @@ -89,6 +89,12 @@ public class LockedApplication { outstandingChange, ownershipIssueId, metrics, rotation); } + public LockedApplication withBuiltInternally(boolean builtInternally) { + return new LockedApplication(lock, id, deploymentSpec, validationOverrides, deployments, + deploymentJobs.withBuiltInternally(builtInternally), change, outstandingChange, + ownershipIssueId, metrics, rotation); + } + public LockedApplication withProjectId(OptionalLong projectId) { return new LockedApplication(lock, id, deploymentSpec, validationOverrides, deployments, deploymentJobs.withProjectId(projectId), change, outstandingChange, diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/application/DeploymentJobs.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/application/DeploymentJobs.java index 4968e161a35..65ba7e68d31 100644 --- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/application/DeploymentJobs.java +++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/application/DeploymentJobs.java @@ -27,19 +27,22 @@ public class DeploymentJobs { private final OptionalLong projectId; private final ImmutableMap<JobType, JobStatus> status; private final Optional<IssueId> issueId; + private final boolean builtInternally; public DeploymentJobs(OptionalLong projectId, Collection<JobStatus> jobStatusEntries, - Optional<IssueId> issueId) { - this(projectId, asMap(jobStatusEntries), issueId); + Optional<IssueId> issueId, boolean builtInternally) { + this(projectId, asMap(jobStatusEntries), issueId, builtInternally); } - private DeploymentJobs(OptionalLong projectId, Map<JobType, JobStatus> status, Optional<IssueId> issueId) { + private DeploymentJobs(OptionalLong projectId, Map<JobType, JobStatus> status, Optional<IssueId> issueId, + boolean builtInternally) { requireId(projectId, "projectId must be a positive integer"); Objects.requireNonNull(status, "status cannot be null"); Objects.requireNonNull(issueId, "issueId cannot be null"); this.projectId = projectId; this.status = ImmutableMap.copyOf(status); this.issueId = issueId; + this.builtInternally = builtInternally; } private static Map<JobType, JobStatus> asMap(Collection<JobStatus> jobStatusEntries) { @@ -56,7 +59,7 @@ public class DeploymentJobs { if (job == null) job = JobStatus.initial(jobType); return job.withCompletion(completion, jobError); }); - return new DeploymentJobs(OptionalLong.of(projectId), status, issueId); + return new DeploymentJobs(OptionalLong.of(projectId), status, issueId, builtInternally); } public DeploymentJobs withTriggering(JobType jobType, JobStatus.JobRun jobRun) { @@ -65,21 +68,25 @@ public class DeploymentJobs { if (job == null) job = JobStatus.initial(jobType); return job.withTriggering(jobRun); }); - return new DeploymentJobs(projectId, status, issueId); + return new DeploymentJobs(projectId, status, issueId, builtInternally); } public DeploymentJobs withProjectId(OptionalLong projectId) { - return new DeploymentJobs(projectId, status, issueId); + return new DeploymentJobs(projectId, status, issueId, builtInternally); } public DeploymentJobs with(IssueId issueId) { - return new DeploymentJobs(projectId, status, Optional.ofNullable(issueId)); + return new DeploymentJobs(projectId, status, Optional.ofNullable(issueId), builtInternally); } public DeploymentJobs without(JobType job) { Map<JobType, JobStatus> status = new HashMap<>(this.status); status.remove(job); - return new DeploymentJobs(projectId, status, issueId); + return new DeploymentJobs(projectId, status, issueId, builtInternally); + } + + public DeploymentJobs withBuiltInternally(boolean builtInternally) { + return new DeploymentJobs(projectId, status, issueId, builtInternally); } /** Returns an immutable map of the status entries in this */ @@ -107,6 +114,8 @@ public class DeploymentJobs { public Optional<IssueId> issueId() { return issueId; } + public boolean builtInternally() { return builtInternally; } + private static OptionalLong requireId(OptionalLong id, String message) { Objects.requireNonNull(id, message); if ( ! id.isPresent()) { diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/deployment/JobController.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/deployment/JobController.java index aff60191f7f..dc339dd9330 100644 --- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/deployment/JobController.java +++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/deployment/JobController.java @@ -28,11 +28,11 @@ public class JobController { this.logs = logStore; } - -// GET: /** Returns whether the given application has registered with this build service. */ - boolean builds(ApplicationId application) { - return false; + public boolean builds(ApplicationId id) { + return controller.applications().get(id) + .map(application -> application.deploymentJobs().builtInternally()) + .orElse(false); } /** Returns a list of all application which have registered. */ @@ -41,58 +41,56 @@ public class JobController { } /** Returns all job types which have been run for the given application. */ - public List<JobType> jobs(ApplicationId application) { + public List<JobType> jobs(ApplicationId id) { return null; } /** Returns a list of meta information about all known runs of the given job type. */ - public List<RunStatus> runs(ApplicationId application, JobType type) { + public List<RunStatus> runs(ApplicationId id, JobType type) { return null; } /** Returns the current status of the given job. */ - public RunStatus status(RunId job) { + public RunStatus status(RunId id) { return null; } /** Returns the details for the given job. */ - public RunDetails details(RunId job) { + public RunDetails details(RunId id) { return null; } - -// POST: /** Registers the given application, such that it may have deployment jobs run here. */ - void register(ApplicationId application) { - ; + void register(ApplicationId id) { + controller.applications().lockIfPresent(id, application -> + controller.applications().store(application.withBuiltInternally(true))); } /** Accepts and stores a new appliaction package and test jar pair, and returns the reference these will have. */ public ApplicationVersion submit(byte[] applicationPackage, byte[] applicationTestJar) { + + // TODO jvenstad: Return versions with increasing numbers. + return ApplicationVersion.unknown; } /** Orders a run of the given type, and returns the id of the created job. */ - public RunId run(ApplicationId application, JobType type) { + public RunId run(ApplicationId id, JobType type) { return null; } + /** Unregisters the given application, and deletes all associated data. */ + public void unregister(ApplicationId id) { + controller.applications().lockIfPresent(id, application -> { -// PUT: - /** Stores the given details for the given job. */ - public void store(RunDetails details, RunId job) { - ; - } - + // TODO jvenstad: Clean out data for jobs. -// DELETE: - /** Unregisters the given application, and deletes all associated data. */ - public void unregister(ApplicationId application) { - ; + controller.applications().store(application.withBuiltInternally(false)); + }); } /** Aborts the given job. */ - public void abort(RunId job) { + public void abort(RunId id) { ; } diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/ApplicationSerializer.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/ApplicationSerializer.java index d804afdf98e..763d26834e6 100644 --- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/ApplicationSerializer.java +++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/ApplicationSerializer.java @@ -80,6 +80,7 @@ public class ApplicationSerializer { private final String projectIdField = "projectId"; private final String jobStatusField = "jobStatus"; private final String issueIdField = "jiraIssueId"; + private final String builtInternallyField = "builtInternally"; // JobStatus field private final String jobTypeField = "jobType"; @@ -227,6 +228,7 @@ public class ApplicationSerializer { deploymentJobs.projectId().ifPresent(projectId -> cursor.setLong(projectIdField, projectId)); jobStatusToSlime(deploymentJobs.jobStatus().values(), cursor.setArray(jobStatusField)); deploymentJobs.issueId().ifPresent(jiraIssueId -> cursor.setString(issueIdField, jiraIssueId.value())); + cursor.setBool(builtInternallyField, deploymentJobs.builtInternally()); } private void jobStatusToSlime(Collection<JobStatus> jobStatuses, Cursor jobStatusArray) { @@ -374,8 +376,9 @@ public class ApplicationSerializer { OptionalLong projectId = optionalLong(object.field(projectIdField)); List<JobStatus> jobStatusList = jobStatusListFromSlime(object.field(jobStatusField)); Optional<IssueId> issueId = optionalString(object.field(issueIdField)).map(IssueId::from); + boolean builtInternally = object.field(builtInternallyField).asBool(); - return new DeploymentJobs(projectId, jobStatusList, issueId); + return new DeploymentJobs(projectId, jobStatusList, issueId, builtInternally); } private Change changeFromSlime(Inspector object) { diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/JobSerializer.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/JobSerializer.java new file mode 100644 index 00000000000..4b13c9acc20 --- /dev/null +++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/JobSerializer.java @@ -0,0 +1,37 @@ +package com.yahoo.vespa.hosted.controller.persistence; + +import com.yahoo.slime.ArrayTraverser; +import com.yahoo.slime.Cursor; +import com.yahoo.slime.Inspector; +import com.yahoo.slime.Slime; +import com.yahoo.vespa.hosted.controller.deployment.RunStatus; + +import java.util.ArrayList; +import java.util.List; + +public class JobSerializer { + + public List<RunStatus> fromSlime(Slime slime) { + List<RunStatus> runs = new ArrayList<>(); + Inspector runArray = slime.get(); + runArray.traverse((ArrayTraverser) (__, runObject) -> + runs.add(runFromSlime(runObject))); + return runs; + } + + private RunStatus runFromSlime(Inspector runObject) { + throw new AssertionError(); + } + + public Slime toSlime(Iterable<RunStatus> runs) { + Slime slime = new Slime(); + Cursor runArray = slime.setArray(); + runs.forEach(run -> toSlime(run, runArray.addObject())); + return slime; + } + + private Slime toSlime(RunStatus run, Cursor runObject) { + throw new AssertionError(); + } + +} diff --git a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/persistence/ApplicationSerializerTest.java b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/persistence/ApplicationSerializerTest.java index e96d41f5b44..a17584f9bfa 100644 --- a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/persistence/ApplicationSerializerTest.java +++ b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/persistence/ApplicationSerializerTest.java @@ -87,7 +87,7 @@ public class ApplicationSerializerTest { .withTriggering(Version.fromString("5.6.6"), ApplicationVersion.unknown, deployments.stream().findFirst(), "Test 3", Instant.ofEpochMilli(6)) .withCompletion(11, empty(), Instant.ofEpochMilli(7))); - DeploymentJobs deploymentJobs = new DeploymentJobs(projectId, statusList, empty()); + DeploymentJobs deploymentJobs = new DeploymentJobs(projectId, statusList, empty(), true); Application original = new Application(ApplicationId.from("t1", "a1", "i1"), deploymentSpec, |