summaryrefslogtreecommitdiff
path: root/opendc-web/opendc-web-server/src/main
diff options
context:
space:
mode:
Diffstat (limited to 'opendc-web/opendc-web-server/src/main')
-rw-r--r--opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/model/Job.java33
-rw-r--r--opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/model/Portfolio.java45
-rw-r--r--opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/model/Project.java37
-rw-r--r--opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/model/ProjectAuthorization.java70
-rw-r--r--opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/model/Scenario.java34
-rw-r--r--opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/model/Topology.java40
-rw-r--r--opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/model/Trace.java10
-rw-r--r--opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/model/UserAccounting.java14
-rw-r--r--opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/model/Workload.java6
-rw-r--r--opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/rest/SchedulerResource.java6
-rw-r--r--opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/rest/TraceResource.java10
-rw-r--r--opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/rest/error/MissingKotlinParameterExceptionMapper.java8
-rw-r--r--opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/rest/error/WebApplicationExceptionMapper.java10
-rw-r--r--opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/rest/runner/JobResource.java20
-rw-r--r--opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/rest/user/PortfolioResource.java22
-rw-r--r--opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/rest/user/PortfolioScenarioResource.java20
-rw-r--r--opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/rest/user/ProjectResource.java26
-rw-r--r--opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/rest/user/ScenarioResource.java16
-rw-r--r--opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/rest/user/TopologyResource.java26
-rw-r--r--opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/rest/user/UserResource.java8
-rw-r--r--opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/service/JobService.java2
-rw-r--r--opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/service/UserAccountingService.java4
-rw-r--r--opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/util/DevSecurityOverrideFilter.java10
-rw-r--r--opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/util/KotlinModuleCustomizer.java2
-rw-r--r--opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/util/QuarkusObjectMapperSupplier.java2
-rw-r--r--opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/util/runner/QuarkusJobManager.java4
-rw-r--r--opendc-web/opendc-web-server/src/main/resources/application-test.properties4
-rw-r--r--opendc-web/opendc-web-server/src/main/resources/db/migration/V3.0__core.sql160
-rw-r--r--opendc-web/opendc-web-server/src/main/resources/db/testing/V3.0.1__entities.sql24
-rw-r--r--opendc-web/opendc-web-server/src/main/resources/load_data.sql124
30 files changed, 388 insertions, 409 deletions
diff --git a/opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/model/Job.java b/opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/model/Job.java
index c5fb208e..a0ac390f 100644
--- a/opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/model/Job.java
+++ b/opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/model/Job.java
@@ -22,23 +22,14 @@
package org.opendc.web.server.model;
+import io.hypersistence.utils.hibernate.type.json.JsonType;
import io.quarkus.hibernate.orm.panache.Panache;
-import io.quarkus.hibernate.orm.panache.PanacheEntity;
+import io.quarkus.hibernate.orm.panache.PanacheEntityBase;
import io.quarkus.hibernate.orm.panache.PanacheQuery;
import io.quarkus.panache.common.Parameters;
+import jakarta.persistence.*;
import java.time.Instant;
import java.util.Map;
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.EnumType;
-import javax.persistence.Enumerated;
-import javax.persistence.FetchType;
-import javax.persistence.ForeignKey;
-import javax.persistence.JoinColumn;
-import javax.persistence.ManyToOne;
-import javax.persistence.NamedQueries;
-import javax.persistence.NamedQuery;
-import javax.persistence.Table;
import org.hibernate.annotations.Type;
import org.opendc.web.proto.JobState;
@@ -46,7 +37,7 @@ import org.opendc.web.proto.JobState;
* A simulation job to be run by the simulator.
*/
@Entity
-@Table(name = "jobs")
+@Table
@NamedQueries({
@NamedQuery(
name = "Job.updateOne",
@@ -57,7 +48,16 @@ import org.opendc.web.proto.JobState;
WHERE j.id = :id AND j.state = :oldState
""")
})
-public class Job extends PanacheEntity {
+public class Job extends PanacheEntityBase {
+ /**
+ * The main ID of a project.
+ * The value starts at 6 to account for the other 5 projects already made by the loading script.
+ */
+ @Id
+ @SequenceGenerator(name = "jobSeq", sequenceName = "job_id_seq", allocationSize = 1, initialValue = 3)
+ @GeneratedValue(generator = "jobSeq")
+ public Long id;
+
@ManyToOne(optional = false, fetch = FetchType.EAGER)
@JoinColumn(name = "scenario_id", foreignKey = @ForeignKey(name = "fk_jobs_scenario"), nullable = false)
public Scenario scenario;
@@ -83,9 +83,8 @@ public class Job extends PanacheEntity {
/**
* The state of the job.
*/
- @Type(type = "io.hypersistence.utils.hibernate.type.basic.PostgreSQLEnumType")
- @Column(nullable = false, columnDefinition = "enum")
@Enumerated(EnumType.STRING)
+ @Column(nullable = false)
public JobState state = JobState.PENDING;
/**
@@ -97,8 +96,8 @@ public class Job extends PanacheEntity {
/**
* Experiment results in JSON
*/
- @Type(type = "io.hypersistence.utils.hibernate.type.json.JsonType")
@Column(columnDefinition = "jsonb")
+ @Type(JsonType.class)
public Map<String, ?> results = null;
/**
diff --git a/opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/model/Portfolio.java b/opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/model/Portfolio.java
index 3a406683..c2695192 100644
--- a/opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/model/Portfolio.java
+++ b/opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/model/Portfolio.java
@@ -22,23 +22,27 @@
package org.opendc.web.server.model;
-import io.quarkus.hibernate.orm.panache.PanacheEntity;
+import io.hypersistence.utils.hibernate.type.json.JsonType;
+import io.quarkus.hibernate.orm.panache.PanacheEntityBase;
import io.quarkus.hibernate.orm.panache.PanacheQuery;
import io.quarkus.panache.common.Parameters;
+import jakarta.persistence.CascadeType;
+import jakarta.persistence.Column;
+import jakarta.persistence.Entity;
+import jakarta.persistence.GeneratedValue;
+import jakarta.persistence.Id;
+import jakarta.persistence.Index;
+import jakarta.persistence.JoinColumn;
+import jakarta.persistence.ManyToOne;
+import jakarta.persistence.NamedQueries;
+import jakarta.persistence.NamedQuery;
+import jakarta.persistence.OneToMany;
+import jakarta.persistence.OrderBy;
+import jakarta.persistence.SequenceGenerator;
+import jakarta.persistence.Table;
+import jakarta.persistence.UniqueConstraint;
import java.util.HashSet;
import java.util.Set;
-import javax.persistence.CascadeType;
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.Index;
-import javax.persistence.JoinColumn;
-import javax.persistence.ManyToOne;
-import javax.persistence.NamedQueries;
-import javax.persistence.NamedQuery;
-import javax.persistence.OneToMany;
-import javax.persistence.OrderBy;
-import javax.persistence.Table;
-import javax.persistence.UniqueConstraint;
import org.hibernate.annotations.Type;
import org.opendc.web.proto.Targets;
@@ -47,7 +51,6 @@ import org.opendc.web.proto.Targets;
*/
@Entity
@Table(
- name = "portfolios",
uniqueConstraints = {
@UniqueConstraint(
name = "uk_portfolios_number",
@@ -60,7 +63,17 @@ import org.opendc.web.proto.Targets;
name = "Portfolio.findOneByProject",
query = "SELECT p FROM Portfolio p WHERE p.project.id = :projectId AND p.number = :number")
})
-public class Portfolio extends PanacheEntity {
+public class Portfolio extends PanacheEntityBase {
+
+ /**
+ * The main ID of a project.
+ * The value starts at 6 to account for the other 5 projects already made by the loading script.
+ */
+ @Id
+ @SequenceGenerator(name = "portfolioSeq", sequenceName = "portfolio_id_seq", allocationSize = 1, initialValue = 4)
+ @GeneratedValue(generator = "portfolioSeq")
+ public Long id;
+
/**
* The {@link Project} this portfolio belongs to.
*/
@@ -83,8 +96,8 @@ public class Portfolio extends PanacheEntity {
/**
* The portfolio targets (metrics, repetitions).
*/
- @Type(type = "io.hypersistence.utils.hibernate.type.json.JsonType")
@Column(columnDefinition = "jsonb", nullable = false, updatable = false)
+ @Type(JsonType.class)
public Targets targets;
/**
diff --git a/opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/model/Project.java b/opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/model/Project.java
index 5836e33f..f4e5305d 100644
--- a/opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/model/Project.java
+++ b/opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/model/Project.java
@@ -23,25 +23,28 @@
package org.opendc.web.server.model;
import io.quarkus.hibernate.orm.panache.Panache;
-import io.quarkus.hibernate.orm.panache.PanacheEntity;
+import io.quarkus.hibernate.orm.panache.PanacheEntityBase;
import io.quarkus.panache.common.Parameters;
+import jakarta.persistence.CascadeType;
+import jakarta.persistence.Column;
+import jakarta.persistence.Entity;
+import jakarta.persistence.GeneratedValue;
+import jakarta.persistence.Id;
+import jakarta.persistence.NamedQueries;
+import jakarta.persistence.NamedQuery;
+import jakarta.persistence.OneToMany;
+import jakarta.persistence.OrderBy;
+import jakarta.persistence.SequenceGenerator;
+import jakarta.persistence.Table;
import java.time.Instant;
import java.util.HashSet;
import java.util.Set;
-import javax.persistence.CascadeType;
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.NamedQueries;
-import javax.persistence.NamedQuery;
-import javax.persistence.OneToMany;
-import javax.persistence.OrderBy;
-import javax.persistence.Table;
/**
* A project in OpenDC encapsulates all the datacenter designs and simulation runs for a set of users.
*/
@Entity
-@Table(name = "projects")
+@Table
@NamedQueries({
@NamedQuery(
name = "Project.findByUser",
@@ -49,7 +52,7 @@ import javax.persistence.Table;
"""
SELECT a
FROM ProjectAuthorization a
- WHERE a.key.userId = :userId
+ WHERE a.key.userName = :userName
"""),
@NamedQuery(
name = "Project.allocatePortfolio",
@@ -76,7 +79,17 @@ import javax.persistence.Table;
WHERE p.id = :id AND p.scenariosCreated = :oldState
""")
})
-public class Project extends PanacheEntity {
+public class Project extends PanacheEntityBase {
+
+ /**
+ * The main ID of a project.
+ * The value starts at 6 to account for the other 5 projects already made by the loading script.
+ */
+ @Id
+ @SequenceGenerator(name = "projectSeq", sequenceName = "project_id_seq", allocationSize = 1, initialValue = 7)
+ @GeneratedValue(generator = "projectSeq")
+ public Long id;
+
/**
* The name of the project.
*/
diff --git a/opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/model/ProjectAuthorization.java b/opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/model/ProjectAuthorization.java
index 1238f58d..3776ae12 100644
--- a/opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/model/ProjectAuthorization.java
+++ b/opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/model/ProjectAuthorization.java
@@ -25,30 +25,29 @@ package org.opendc.web.server.model;
import io.quarkus.hibernate.orm.panache.PanacheEntityBase;
import io.quarkus.hibernate.orm.panache.PanacheQuery;
import io.quarkus.panache.common.Parameters;
+import jakarta.persistence.Column;
+import jakarta.persistence.Embeddable;
+import jakarta.persistence.EmbeddedId;
+import jakarta.persistence.Entity;
+import jakarta.persistence.EnumType;
+import jakarta.persistence.Enumerated;
+import jakarta.persistence.FetchType;
+import jakarta.persistence.ForeignKey;
+import jakarta.persistence.JoinColumn;
+import jakarta.persistence.ManyToOne;
+import jakarta.persistence.MapsId;
+import jakarta.persistence.NamedQueries;
+import jakarta.persistence.NamedQuery;
+import jakarta.persistence.Table;
import java.io.Serializable;
import java.util.Objects;
-import javax.persistence.Column;
-import javax.persistence.Embeddable;
-import javax.persistence.EmbeddedId;
-import javax.persistence.Entity;
-import javax.persistence.EnumType;
-import javax.persistence.Enumerated;
-import javax.persistence.FetchType;
-import javax.persistence.ForeignKey;
-import javax.persistence.JoinColumn;
-import javax.persistence.ManyToOne;
-import javax.persistence.MapsId;
-import javax.persistence.NamedQueries;
-import javax.persistence.NamedQuery;
-import javax.persistence.Table;
-import org.hibernate.annotations.Type;
import org.opendc.web.proto.user.ProjectRole;
/**
* An authorization for some user to participate in a project.
*/
@Entity
-@Table(name = "project_authorizations")
+@Table
@NamedQueries({
@NamedQuery(
name = "ProjectAuthorization.findByUser",
@@ -56,7 +55,7 @@ import org.opendc.web.proto.user.ProjectRole;
"""
SELECT a
FROM ProjectAuthorization a
- WHERE a.key.userId = :userId
+ WHERE a.key.userName = :userName
"""),
})
public class ProjectAuthorization extends PanacheEntityBase {
@@ -82,16 +81,15 @@ public class ProjectAuthorization extends PanacheEntityBase {
/**
* The role of the user in the project.
*/
- @Type(type = "io.hypersistence.utils.hibernate.type.basic.PostgreSQLEnumType")
- @Column(nullable = false, columnDefinition = "enum")
+ @Column(nullable = false)
@Enumerated(EnumType.STRING)
public ProjectRole role;
/**
* Construct a {@link ProjectAuthorization} object.
*/
- public ProjectAuthorization(Project project, String userId, ProjectRole role) {
- this.key = new ProjectAuthorization.Key(project.id, userId);
+ public ProjectAuthorization(Project project, String userName, ProjectRole role) {
+ this.key = new ProjectAuthorization.Key(project.id, userName);
this.project = project;
this.role = role;
}
@@ -102,25 +100,25 @@ public class ProjectAuthorization extends PanacheEntityBase {
protected ProjectAuthorization() {}
/**
- * List all projects for the user with the specified <code>userId</code>.
+ * List all projects for the user with the specified <code>userName</code>.
*
- * @param userId The identifier of the user that is requesting the list of projects.
+ * @param userName The identifier of the user that is requesting the list of projects.
* @return A query returning projects that the user has received authorization for.
*/
- public static PanacheQuery<ProjectAuthorization> findByUser(String userId) {
- return find("#ProjectAuthorization.findByUser", Parameters.with("userId", userId));
+ public static PanacheQuery<ProjectAuthorization> findByUser(String userName) {
+ return find("#ProjectAuthorization.findByUser", Parameters.with("userName", userName));
}
/**
- * Find the project with <code>id</code> for the user with the specified <code>userId</code>.
+ * Find the project with <code>id</code> for the user with the specified <code>userName</code>.
*
- * @param userId The identifier of the user that is requesting the list of projects.
- * @param id The unique identifier of the project.
+ * @param userName The identifier of the user that is requesting the list of projects.
+ * @param project_id The unique identifier of the project.
* @return The project with the specified identifier or <code>null</code> if it does not exist or is not accessible
* to the user with the specified identifier.
*/
- public static ProjectAuthorization findByUser(String userId, long id) {
- return findById(new ProjectAuthorization.Key(id, userId));
+ public static ProjectAuthorization findByUser(String userName, long project_id) {
+ return findById(new ProjectAuthorization.Key(project_id, userName));
}
/**
@@ -148,12 +146,12 @@ public class ProjectAuthorization extends PanacheEntityBase {
@Column(name = "project_id", nullable = false)
public long projectId;
- @Column(name = "user_id", nullable = false)
- public String userId;
+ @Column(name = "user_name", nullable = false)
+ public String userName;
- public Key(long projectId, String userId) {
+ public Key(long projectId, String userName) {
this.projectId = projectId;
- this.userId = userId;
+ this.userName = userName;
}
protected Key() {}
@@ -163,12 +161,12 @@ public class ProjectAuthorization extends PanacheEntityBase {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Key key = (Key) o;
- return projectId == key.projectId && userId.equals(key.userId);
+ return projectId == key.projectId && userName.equals(key.userName);
}
@Override
public int hashCode() {
- return Objects.hash(projectId, userId);
+ return Objects.hash(projectId, userName);
}
}
}
diff --git a/opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/model/Scenario.java b/opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/model/Scenario.java
index 016e931b..c79ef5bb 100644
--- a/opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/model/Scenario.java
+++ b/opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/model/Scenario.java
@@ -22,25 +22,13 @@
package org.opendc.web.server.model;
-import io.quarkus.hibernate.orm.panache.PanacheEntity;
+import io.hypersistence.utils.hibernate.type.json.JsonType;
+import io.quarkus.hibernate.orm.panache.PanacheEntityBase;
import io.quarkus.hibernate.orm.panache.PanacheQuery;
import io.quarkus.panache.common.Parameters;
+import jakarta.persistence.*;
import java.util.ArrayList;
import java.util.List;
-import javax.persistence.CascadeType;
-import javax.persistence.Column;
-import javax.persistence.Embedded;
-import javax.persistence.Entity;
-import javax.persistence.FetchType;
-import javax.persistence.ForeignKey;
-import javax.persistence.Index;
-import javax.persistence.JoinColumn;
-import javax.persistence.ManyToOne;
-import javax.persistence.NamedQueries;
-import javax.persistence.NamedQuery;
-import javax.persistence.OneToMany;
-import javax.persistence.Table;
-import javax.persistence.UniqueConstraint;
import org.hibernate.annotations.Type;
import org.opendc.web.proto.OperationalPhenomena;
@@ -49,7 +37,6 @@ import org.opendc.web.proto.OperationalPhenomena;
*/
@Entity
@Table(
- name = "scenarios",
uniqueConstraints = {
@UniqueConstraint(
name = "uk_scenarios_number",
@@ -71,7 +58,16 @@ import org.opendc.web.proto.OperationalPhenomena;
name = "Scenario.findOneByProject",
query = "SELECT s FROM Scenario s WHERE s.project.id = :projectId AND s.number = :number")
})
-public class Scenario extends PanacheEntity {
+public class Scenario extends PanacheEntityBase {
+ /**
+ * The main ID of a Scenario.
+ * The value starts at 3 to account for the other 2 scenarios already made by the loading script.
+ */
+ @Id
+ @SequenceGenerator(name = "scenarioSeq", sequenceName = "scenario_id_seq", allocationSize = 1, initialValue = 3)
+ @GeneratedValue(generator = "scenarioSeq")
+ public Long id;
+
/**
* The {@link Project} to which this scenario belongs.
*/
@@ -113,9 +109,11 @@ public class Scenario extends PanacheEntity {
/**
* Operational phenomena activated in the scenario.
+ * @Column(columnDefinition = "jsonb", nullable = false, updatable = false)
+ * @Type(JsonType.class)
*/
- @Type(type = "io.hypersistence.utils.hibernate.type.json.JsonType")
@Column(columnDefinition = "jsonb", nullable = false, updatable = false)
+ @Type(JsonType.class)
public OperationalPhenomena phenomena;
/**
diff --git a/opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/model/Topology.java b/opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/model/Topology.java
index 05a1ac12..8a4e2ae2 100644
--- a/opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/model/Topology.java
+++ b/opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/model/Topology.java
@@ -22,20 +22,24 @@
package org.opendc.web.server.model;
-import io.quarkus.hibernate.orm.panache.PanacheEntity;
+import io.hypersistence.utils.hibernate.type.json.JsonType;
+import io.quarkus.hibernate.orm.panache.PanacheEntityBase;
import io.quarkus.hibernate.orm.panache.PanacheQuery;
import io.quarkus.panache.common.Parameters;
+import jakarta.persistence.Column;
+import jakarta.persistence.Entity;
+import jakarta.persistence.GeneratedValue;
+import jakarta.persistence.Id;
+import jakarta.persistence.Index;
+import jakarta.persistence.JoinColumn;
+import jakarta.persistence.ManyToOne;
+import jakarta.persistence.NamedQueries;
+import jakarta.persistence.NamedQuery;
+import jakarta.persistence.SequenceGenerator;
+import jakarta.persistence.Table;
+import jakarta.persistence.UniqueConstraint;
import java.time.Instant;
import java.util.List;
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.Index;
-import javax.persistence.JoinColumn;
-import javax.persistence.ManyToOne;
-import javax.persistence.NamedQueries;
-import javax.persistence.NamedQuery;
-import javax.persistence.Table;
-import javax.persistence.UniqueConstraint;
import org.hibernate.annotations.Type;
import org.opendc.web.proto.Room;
@@ -44,7 +48,6 @@ import org.opendc.web.proto.Room;
*/
@Entity
@Table(
- name = "topologies",
uniqueConstraints = {
@UniqueConstraint(
name = "uk_topologies_number",
@@ -57,7 +60,16 @@ import org.opendc.web.proto.Room;
name = "Topology.findOneByProject",
query = "SELECT t FROM Topology t WHERE t.project.id = :projectId AND t.number = :number")
})
-public class Topology extends PanacheEntity {
+public class Topology extends PanacheEntityBase {
+ /**
+ * The main ID of a project.
+ * The value starts at 6 to account for the other 5 projects already made by the loading script.
+ */
+ @Id
+ @SequenceGenerator(name = "topologySeq", sequenceName = "topology_id_seq", allocationSize = 1, initialValue = 5)
+ @GeneratedValue(generator = "topologySeq")
+ public Long id;
+
/**
* The {@link Project} to which the topology belongs.
*/
@@ -91,9 +103,11 @@ public class Topology extends PanacheEntity {
/**
* Datacenter design in JSON
+ * @Column(columnDefinition = "jsonb", nullable = false)
+ * @Type(JsonType.class)
*/
- @Type(type = "io.hypersistence.utils.hibernate.type.json.JsonType")
@Column(columnDefinition = "jsonb", nullable = false)
+ @Type(JsonType.class)
public List<Room> rooms;
/**
diff --git a/opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/model/Trace.java b/opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/model/Trace.java
index 36d27abc..71c647bc 100644
--- a/opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/model/Trace.java
+++ b/opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/model/Trace.java
@@ -23,16 +23,16 @@
package org.opendc.web.server.model;
import io.quarkus.hibernate.orm.panache.PanacheEntityBase;
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.Id;
-import javax.persistence.Table;
+import jakarta.persistence.Column;
+import jakarta.persistence.Entity;
+import jakarta.persistence.Id;
+import jakarta.persistence.Table;
/**
* A workload trace available for simulation.
*/
@Entity
-@Table(name = "traces")
+@Table
public class Trace extends PanacheEntityBase {
/**
* The unique identifier of the trace.
diff --git a/opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/model/UserAccounting.java b/opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/model/UserAccounting.java
index fda4302f..10a10ef9 100644
--- a/opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/model/UserAccounting.java
+++ b/opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/model/UserAccounting.java
@@ -24,19 +24,19 @@ package org.opendc.web.server.model;
import io.quarkus.hibernate.orm.panache.PanacheEntityBase;
import io.quarkus.panache.common.Parameters;
+import jakarta.persistence.Column;
+import jakarta.persistence.Entity;
+import jakarta.persistence.Id;
+import jakarta.persistence.NamedQueries;
+import jakarta.persistence.NamedQuery;
+import jakarta.persistence.Table;
import java.time.LocalDate;
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.Id;
-import javax.persistence.NamedQueries;
-import javax.persistence.NamedQuery;
-import javax.persistence.Table;
/**
* Entity to track the number of simulation minutes used by a user.
*/
@Entity
-@Table(name = "user_accounting")
+@Table
@NamedQueries({
@NamedQuery(
name = "UserAccounting.consumeBudget",
diff --git a/opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/model/Workload.java b/opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/model/Workload.java
index 129fb0c5..fd7010d2 100644
--- a/opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/model/Workload.java
+++ b/opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/model/Workload.java
@@ -22,9 +22,9 @@
package org.opendc.web.server.model;
-import javax.persistence.Column;
-import javax.persistence.Embeddable;
-import javax.persistence.ManyToOne;
+import jakarta.persistence.Column;
+import jakarta.persistence.Embeddable;
+import jakarta.persistence.ManyToOne;
/**
* Specification of the workload for a {@link Scenario}
diff --git a/opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/rest/SchedulerResource.java b/opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/rest/SchedulerResource.java
index 0fd58182..d7bb8f69 100644
--- a/opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/rest/SchedulerResource.java
+++ b/opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/rest/SchedulerResource.java
@@ -22,10 +22,10 @@
package org.opendc.web.server.rest;
+import jakarta.ws.rs.GET;
+import jakarta.ws.rs.Path;
+import jakarta.ws.rs.Produces;
import java.util.List;
-import javax.ws.rs.GET;
-import javax.ws.rs.Path;
-import javax.ws.rs.Produces;
/**
* A resource representing the available schedulers that can be used during experiments.
diff --git a/opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/rest/TraceResource.java b/opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/rest/TraceResource.java
index 7316c93f..daec01cd 100644
--- a/opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/rest/TraceResource.java
+++ b/opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/rest/TraceResource.java
@@ -22,13 +22,13 @@
package org.opendc.web.server.rest;
+import jakarta.ws.rs.GET;
+import jakarta.ws.rs.Path;
+import jakarta.ws.rs.PathParam;
+import jakarta.ws.rs.Produces;
+import jakarta.ws.rs.WebApplicationException;
import java.util.List;
import java.util.stream.Stream;
-import javax.ws.rs.GET;
-import javax.ws.rs.Path;
-import javax.ws.rs.PathParam;
-import javax.ws.rs.Produces;
-import javax.ws.rs.WebApplicationException;
import org.opendc.web.server.model.Trace;
/**
diff --git a/opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/rest/error/MissingKotlinParameterExceptionMapper.java b/opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/rest/error/MissingKotlinParameterExceptionMapper.java
index 3b6be42e..345acdfe 100644
--- a/opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/rest/error/MissingKotlinParameterExceptionMapper.java
+++ b/opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/rest/error/MissingKotlinParameterExceptionMapper.java
@@ -23,10 +23,10 @@
package org.opendc.web.server.rest.error;
import com.fasterxml.jackson.module.kotlin.MissingKotlinParameterException;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-import javax.ws.rs.ext.ExceptionMapper;
-import javax.ws.rs.ext.Provider;
+import jakarta.ws.rs.core.MediaType;
+import jakarta.ws.rs.core.Response;
+import jakarta.ws.rs.ext.ExceptionMapper;
+import jakarta.ws.rs.ext.Provider;
import org.opendc.web.proto.ProtocolError;
/**
diff --git a/opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/rest/error/WebApplicationExceptionMapper.java b/opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/rest/error/WebApplicationExceptionMapper.java
index ad1bb05e..e027e559 100644
--- a/opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/rest/error/WebApplicationExceptionMapper.java
+++ b/opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/rest/error/WebApplicationExceptionMapper.java
@@ -22,11 +22,11 @@
package org.opendc.web.server.rest.error;
-import javax.ws.rs.WebApplicationException;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-import javax.ws.rs.ext.ExceptionMapper;
-import javax.ws.rs.ext.Provider;
+import jakarta.ws.rs.WebApplicationException;
+import jakarta.ws.rs.core.MediaType;
+import jakarta.ws.rs.core.Response;
+import jakarta.ws.rs.ext.ExceptionMapper;
+import jakarta.ws.rs.ext.Provider;
import org.opendc.web.proto.ProtocolError;
/**
diff --git a/opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/rest/runner/JobResource.java b/opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/rest/runner/JobResource.java
index dff52526..4dde8654 100644
--- a/opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/rest/runner/JobResource.java
+++ b/opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/rest/runner/JobResource.java
@@ -22,17 +22,17 @@
package org.opendc.web.server.rest.runner;
+import jakarta.annotation.security.RolesAllowed;
+import jakarta.transaction.Transactional;
+import jakarta.validation.Valid;
+import jakarta.ws.rs.Consumes;
+import jakarta.ws.rs.GET;
+import jakarta.ws.rs.POST;
+import jakarta.ws.rs.Path;
+import jakarta.ws.rs.PathParam;
+import jakarta.ws.rs.Produces;
+import jakarta.ws.rs.WebApplicationException;
import java.util.List;
-import javax.annotation.security.RolesAllowed;
-import javax.transaction.Transactional;
-import javax.validation.Valid;
-import javax.ws.rs.Consumes;
-import javax.ws.rs.GET;
-import javax.ws.rs.POST;
-import javax.ws.rs.Path;
-import javax.ws.rs.PathParam;
-import javax.ws.rs.Produces;
-import javax.ws.rs.WebApplicationException;
import org.opendc.web.proto.JobState;
import org.opendc.web.server.model.Job;
import org.opendc.web.server.service.JobService;
diff --git a/opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/rest/user/PortfolioResource.java b/opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/rest/user/PortfolioResource.java
index d1fc980d..2a3a40f4 100644
--- a/opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/rest/user/PortfolioResource.java
+++ b/opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/rest/user/PortfolioResource.java
@@ -23,19 +23,19 @@
package org.opendc.web.server.rest.user;
import io.quarkus.security.identity.SecurityIdentity;
+import jakarta.annotation.security.RolesAllowed;
+import jakarta.transaction.Transactional;
+import jakarta.validation.Valid;
+import jakarta.ws.rs.Consumes;
+import jakarta.ws.rs.DELETE;
+import jakarta.ws.rs.GET;
+import jakarta.ws.rs.POST;
+import jakarta.ws.rs.Path;
+import jakarta.ws.rs.PathParam;
+import jakarta.ws.rs.Produces;
+import jakarta.ws.rs.WebApplicationException;
import java.time.Instant;
import java.util.List;
-import javax.annotation.security.RolesAllowed;
-import javax.transaction.Transactional;
-import javax.validation.Valid;
-import javax.ws.rs.Consumes;
-import javax.ws.rs.DELETE;
-import javax.ws.rs.GET;
-import javax.ws.rs.POST;
-import javax.ws.rs.Path;
-import javax.ws.rs.PathParam;
-import javax.ws.rs.Produces;
-import javax.ws.rs.WebApplicationException;
import org.opendc.web.server.model.Portfolio;
import org.opendc.web.server.model.ProjectAuthorization;
diff --git a/opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/rest/user/PortfolioScenarioResource.java b/opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/rest/user/PortfolioScenarioResource.java
index a058cd31..789808c8 100644
--- a/opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/rest/user/PortfolioScenarioResource.java
+++ b/opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/rest/user/PortfolioScenarioResource.java
@@ -23,18 +23,18 @@
package org.opendc.web.server.rest.user;
import io.quarkus.security.identity.SecurityIdentity;
+import jakarta.annotation.security.RolesAllowed;
+import jakarta.transaction.Transactional;
+import jakarta.validation.Valid;
+import jakarta.ws.rs.Consumes;
+import jakarta.ws.rs.GET;
+import jakarta.ws.rs.POST;
+import jakarta.ws.rs.Path;
+import jakarta.ws.rs.PathParam;
+import jakarta.ws.rs.Produces;
+import jakarta.ws.rs.WebApplicationException;
import java.time.Instant;
import java.util.List;
-import javax.annotation.security.RolesAllowed;
-import javax.transaction.Transactional;
-import javax.validation.Valid;
-import javax.ws.rs.Consumes;
-import javax.ws.rs.GET;
-import javax.ws.rs.POST;
-import javax.ws.rs.Path;
-import javax.ws.rs.PathParam;
-import javax.ws.rs.Produces;
-import javax.ws.rs.WebApplicationException;
import org.opendc.web.proto.JobState;
import org.opendc.web.server.model.Job;
import org.opendc.web.server.model.Portfolio;
diff --git a/opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/rest/user/ProjectResource.java b/opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/rest/user/ProjectResource.java
index da47c3ff..ae1c959e 100644
--- a/opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/rest/user/ProjectResource.java
+++ b/opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/rest/user/ProjectResource.java
@@ -23,19 +23,19 @@
package org.opendc.web.server.rest.user;
import io.quarkus.security.identity.SecurityIdentity;
+import jakarta.annotation.security.RolesAllowed;
+import jakarta.transaction.Transactional;
+import jakarta.validation.Valid;
+import jakarta.ws.rs.Consumes;
+import jakarta.ws.rs.DELETE;
+import jakarta.ws.rs.GET;
+import jakarta.ws.rs.POST;
+import jakarta.ws.rs.Path;
+import jakarta.ws.rs.PathParam;
+import jakarta.ws.rs.Produces;
+import jakarta.ws.rs.WebApplicationException;
import java.time.Instant;
import java.util.List;
-import javax.annotation.security.RolesAllowed;
-import javax.transaction.Transactional;
-import javax.validation.Valid;
-import javax.ws.rs.Consumes;
-import javax.ws.rs.DELETE;
-import javax.ws.rs.GET;
-import javax.ws.rs.POST;
-import javax.ws.rs.Path;
-import javax.ws.rs.PathParam;
-import javax.ws.rs.Produces;
-import javax.ws.rs.WebApplicationException;
import org.opendc.web.proto.user.ProjectRole;
import org.opendc.web.server.model.Project;
import org.opendc.web.server.model.ProjectAuthorization;
@@ -96,9 +96,9 @@ public final class ProjectResource {
*/
@GET
@Path("{project}")
- public org.opendc.web.proto.user.Project get(@PathParam("project") long id) {
+ public org.opendc.web.proto.user.Project get(@PathParam("project") long project_id) {
ProjectAuthorization auth =
- ProjectAuthorization.findByUser(identity.getPrincipal().getName(), id);
+ ProjectAuthorization.findByUser(identity.getPrincipal().getName(), project_id);
if (auth == null) {
throw new WebApplicationException("Project not found", 404);
diff --git a/opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/rest/user/ScenarioResource.java b/opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/rest/user/ScenarioResource.java
index cf933c32..bb3eb89b 100644
--- a/opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/rest/user/ScenarioResource.java
+++ b/opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/rest/user/ScenarioResource.java
@@ -23,15 +23,15 @@
package org.opendc.web.server.rest.user;
import io.quarkus.security.identity.SecurityIdentity;
+import jakarta.annotation.security.RolesAllowed;
+import jakarta.transaction.Transactional;
+import jakarta.ws.rs.DELETE;
+import jakarta.ws.rs.GET;
+import jakarta.ws.rs.Path;
+import jakarta.ws.rs.PathParam;
+import jakarta.ws.rs.Produces;
+import jakarta.ws.rs.WebApplicationException;
import java.util.List;
-import javax.annotation.security.RolesAllowed;
-import javax.transaction.Transactional;
-import javax.ws.rs.DELETE;
-import javax.ws.rs.GET;
-import javax.ws.rs.Path;
-import javax.ws.rs.PathParam;
-import javax.ws.rs.Produces;
-import javax.ws.rs.WebApplicationException;
import org.opendc.web.server.model.ProjectAuthorization;
import org.opendc.web.server.model.Scenario;
diff --git a/opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/rest/user/TopologyResource.java b/opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/rest/user/TopologyResource.java
index 71491801..b8c542d3 100644
--- a/opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/rest/user/TopologyResource.java
+++ b/opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/rest/user/TopologyResource.java
@@ -24,21 +24,21 @@ package org.opendc.web.server.rest.user;
import io.quarkus.hibernate.orm.panache.Panache;
import io.quarkus.security.identity.SecurityIdentity;
+import jakarta.annotation.security.RolesAllowed;
+import jakarta.persistence.PersistenceException;
+import jakarta.transaction.Transactional;
+import jakarta.validation.Valid;
+import jakarta.ws.rs.Consumes;
+import jakarta.ws.rs.DELETE;
+import jakarta.ws.rs.GET;
+import jakarta.ws.rs.POST;
+import jakarta.ws.rs.PUT;
+import jakarta.ws.rs.Path;
+import jakarta.ws.rs.PathParam;
+import jakarta.ws.rs.Produces;
+import jakarta.ws.rs.WebApplicationException;
import java.time.Instant;
import java.util.List;
-import javax.annotation.security.RolesAllowed;
-import javax.persistence.PersistenceException;
-import javax.transaction.Transactional;
-import javax.validation.Valid;
-import javax.ws.rs.Consumes;
-import javax.ws.rs.DELETE;
-import javax.ws.rs.GET;
-import javax.ws.rs.POST;
-import javax.ws.rs.PUT;
-import javax.ws.rs.Path;
-import javax.ws.rs.PathParam;
-import javax.ws.rs.Produces;
-import javax.ws.rs.WebApplicationException;
import org.opendc.web.server.model.Project;
import org.opendc.web.server.model.ProjectAuthorization;
import org.opendc.web.server.model.Topology;
diff --git a/opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/rest/user/UserResource.java b/opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/rest/user/UserResource.java
index c3fb2866..c8cda2b7 100644
--- a/opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/rest/user/UserResource.java
+++ b/opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/rest/user/UserResource.java
@@ -23,10 +23,10 @@
package org.opendc.web.server.rest.user;
import io.quarkus.security.identity.SecurityIdentity;
-import javax.annotation.security.RolesAllowed;
-import javax.ws.rs.GET;
-import javax.ws.rs.Path;
-import javax.ws.rs.Produces;
+import jakarta.annotation.security.RolesAllowed;
+import jakarta.ws.rs.GET;
+import jakarta.ws.rs.Path;
+import jakarta.ws.rs.Produces;
import org.opendc.web.proto.user.User;
import org.opendc.web.proto.user.UserAccounting;
import org.opendc.web.server.service.UserAccountingService;
diff --git a/opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/service/JobService.java b/opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/service/JobService.java
index ed0eaf9c..70933520 100644
--- a/opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/service/JobService.java
+++ b/opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/service/JobService.java
@@ -22,9 +22,9 @@
package org.opendc.web.server.service;
+import jakarta.enterprise.context.ApplicationScoped;
import java.time.Instant;
import java.util.Map;
-import javax.enterprise.context.ApplicationScoped;
import org.opendc.web.proto.JobState;
import org.opendc.web.server.model.Job;
diff --git a/opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/service/UserAccountingService.java b/opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/service/UserAccountingService.java
index e5003cb4..73fa2a3e 100644
--- a/opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/service/UserAccountingService.java
+++ b/opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/service/UserAccountingService.java
@@ -22,11 +22,11 @@
package org.opendc.web.server.service;
+import jakarta.enterprise.context.ApplicationScoped;
+import jakarta.persistence.EntityExistsException;
import java.time.Duration;
import java.time.LocalDate;
import java.time.temporal.TemporalAdjusters;
-import javax.enterprise.context.ApplicationScoped;
-import javax.persistence.EntityExistsException;
import org.eclipse.microprofile.config.inject.ConfigProperty;
import org.opendc.web.server.model.UserAccounting;
diff --git a/opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/util/DevSecurityOverrideFilter.java b/opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/util/DevSecurityOverrideFilter.java
index de4478cb..103f868d 100644
--- a/opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/util/DevSecurityOverrideFilter.java
+++ b/opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/util/DevSecurityOverrideFilter.java
@@ -23,12 +23,12 @@
package org.opendc.web.server.util;
import io.quarkus.arc.properties.IfBuildProperty;
+import jakarta.ws.rs.container.ContainerRequestContext;
+import jakarta.ws.rs.container.ContainerRequestFilter;
+import jakarta.ws.rs.container.PreMatching;
+import jakarta.ws.rs.core.SecurityContext;
+import jakarta.ws.rs.ext.Provider;
import java.security.Principal;
-import javax.ws.rs.container.ContainerRequestContext;
-import javax.ws.rs.container.ContainerRequestFilter;
-import javax.ws.rs.container.PreMatching;
-import javax.ws.rs.core.SecurityContext;
-import javax.ws.rs.ext.Provider;
/**
* Helper class to disable security for the OpenDC web API when in development mode.
diff --git a/opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/util/KotlinModuleCustomizer.java b/opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/util/KotlinModuleCustomizer.java
index c30edcbf..ff3ba1cd 100644
--- a/opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/util/KotlinModuleCustomizer.java
+++ b/opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/util/KotlinModuleCustomizer.java
@@ -25,7 +25,7 @@ package org.opendc.web.server.util;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.module.kotlin.KotlinModule;
import io.quarkus.jackson.ObjectMapperCustomizer;
-import javax.inject.Singleton;
+import jakarta.inject.Singleton;
/**
* Helper class to register the Kotlin Jackson module.
diff --git a/opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/util/QuarkusObjectMapperSupplier.java b/opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/util/QuarkusObjectMapperSupplier.java
index e46c74ed..60ca77e5 100644
--- a/opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/util/QuarkusObjectMapperSupplier.java
+++ b/opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/util/QuarkusObjectMapperSupplier.java
@@ -25,7 +25,7 @@ package org.opendc.web.server.util;
import com.fasterxml.jackson.databind.ObjectMapper;
import io.hypersistence.utils.hibernate.type.util.ObjectMapperSupplier;
import io.quarkus.runtime.annotations.RegisterForReflection;
-import javax.enterprise.inject.spi.CDI;
+import jakarta.enterprise.inject.spi.CDI;
/**
* A supplier for an {@link ObjectMapper} used by the Hypersistence utilities.
diff --git a/opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/util/runner/QuarkusJobManager.java b/opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/util/runner/QuarkusJobManager.java
index 0331eacf..47d397f3 100644
--- a/opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/util/runner/QuarkusJobManager.java
+++ b/opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/util/runner/QuarkusJobManager.java
@@ -22,9 +22,9 @@
package org.opendc.web.server.util.runner;
+import jakarta.enterprise.context.ApplicationScoped;
+import jakarta.transaction.Transactional;
import java.util.Map;
-import javax.enterprise.context.ApplicationScoped;
-import javax.transaction.Transactional;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.opendc.web.proto.JobState;
diff --git a/opendc-web/opendc-web-server/src/main/resources/application-test.properties b/opendc-web/opendc-web-server/src/main/resources/application-test.properties
index bee17221..4e3063e4 100644
--- a/opendc-web/opendc-web-server/src/main/resources/application-test.properties
+++ b/opendc-web/opendc-web-server/src/main/resources/application-test.properties
@@ -37,3 +37,7 @@ quarkus.swagger-ui.enable=false
# Disable OpenDC web UI and runner
quarkus.opendc-ui.include=false
quarkus.opendc-runner.include=false
+
+# Create new tables and fill them
+quarkus.hibernate-orm.database.generation=drop-and-create
+quarkus.hibernate-orm.sql-load-script=load_data.sql
diff --git a/opendc-web/opendc-web-server/src/main/resources/db/migration/V3.0__core.sql b/opendc-web/opendc-web-server/src/main/resources/db/migration/V3.0__core.sql
deleted file mode 100644
index 40654b6b..00000000
--- a/opendc-web/opendc-web-server/src/main/resources/db/migration/V3.0__core.sql
+++ /dev/null
@@ -1,160 +0,0 @@
--- Hibernate sequence for unique identifiers
-create sequence hibernate_sequence start with 1 increment by 1;
-
--- Projects
-create table projects
-(
- id bigint not null,
- created_at timestamp not null,
- name varchar(255) not null,
- portfolios_created integer not null default 0,
- scenarios_created integer not null default 0,
- topologies_created integer not null default 0,
- updated_at timestamp not null,
- primary key (id)
-);
-
-create type project_role as enum ('OWNER', 'EDITOR', 'VIEWER');
-
--- Project authorizations authorize users specific permissions to a project.
-create table project_authorizations
-(
- project_id bigint not null,
- user_id varchar(255) not null,
- role project_role not null,
- primary key (project_id, user_id)
-);
-
--- Topologies represent the datacenter designs created by users.
-create table topologies
-(
- id bigint not null,
- created_at timestamp not null,
- name varchar(255) not null,
- number integer not null,
- rooms jsonb not null,
- updated_at timestamp not null,
- project_id bigint not null,
- primary key (id)
-);
-
--- Portfolios
-create table portfolios
-(
- id bigint not null,
- name varchar(255) not null,
- number integer not null,
- targets jsonb not null,
- project_id bigint not null,
- primary key (id)
-);
-
-create table scenarios
-(
- id bigint not null,
- name varchar(255) not null,
- number integer not null,
- phenomena jsonb not null,
- scheduler_name varchar(255) not null,
- sampling_fraction double precision not null,
- portfolio_id bigint not null,
- project_id bigint not null,
- topology_id bigint not null,
- trace_id varchar(255) not null,
- primary key (id)
-);
-
-create type job_state as enum ('PENDING', 'CLAIMED', 'RUNNING', 'FINISHED', 'FAILED');
-
-create table jobs
-(
- id bigint not null,
- created_by varchar(255) not null,
- created_at timestamp not null,
- repeats integer not null,
- results jsonb,
- state job_state not null default 'PENDING',
- runtime integer not null default 0,
- updated_at timestamp not null,
- scenario_id bigint not null,
- primary key (id)
-);
-
--- User accounting
-create table user_accounting
-(
- user_id varchar(255) not null,
- period_end date not null,
- simulation_time integer not null,
- simulation_time_budget integer not null,
- primary key (user_id)
-);
-
--- Workload traces available to the user.
-create table traces
-(
- id varchar(255) not null,
- name varchar(255) not null,
- type varchar(255) not null,
- primary key (id)
-);
-
--- Relations
-alter table project_authorizations
- add constraint fk_project_authorizations
- foreign key (project_id)
- references projects;
-
-create index ux_topologies_number on topologies (project_id, number);
-
-alter table topologies
- add constraint uk_topologies_number unique (project_id, number);
-
-alter table topologies
- add constraint fk_topologies_project
- foreign key (project_id)
- references projects;
-
-create index ux_portfolios_number on portfolios (project_id, number);
-
-alter table portfolios
- add constraint fk_portfolios_project
- foreign key (project_id)
- references projects;
-
-alter table portfolios
- add constraint uk_portfolios_number unique (project_id, number);
-
-create index ux_scenarios_number on scenarios (project_id, number);
-
-alter table scenarios
- add constraint uk_scenarios_number unique (project_id, number);
-
-alter table scenarios
- add constraint fk_scenarios_project
- foreign key (project_id)
- references projects;
-
-alter table scenarios
- add constraint fk_scenarios_topology
- foreign key (topology_id)
- references topologies;
-
-alter table scenarios
- add constraint fk_scenarios_portfolio
- foreign key (portfolio_id)
- references portfolios;
-
-alter table scenarios
- add constraint fk_scenarios_trace
- foreign key (trace_id)
- references traces;
-
-alter table jobs
- add constraint fk_scenarios_job
- foreign key (scenario_id)
- references scenarios;
-
--- Initial data
-insert into traces (id, name, type)
-values ('bitbrains-small', 'Bitbrains Small', 'vm');
diff --git a/opendc-web/opendc-web-server/src/main/resources/db/testing/V3.0.1__entities.sql b/opendc-web/opendc-web-server/src/main/resources/db/testing/V3.0.1__entities.sql
deleted file mode 100644
index 1b702f4e..00000000
--- a/opendc-web/opendc-web-server/src/main/resources/db/testing/V3.0.1__entities.sql
+++ /dev/null
@@ -1,24 +0,0 @@
--- Test entities
-
-alter sequence hibernate_sequence restart with 500;
-
-insert into projects (id, created_at, name, portfolios_created, scenarios_created, topologies_created, updated_at)
-values (1, current_timestamp(), 'Test Project', 1, 2, 1, current_timestamp());
-insert into project_authorizations (project_id, user_id, role)
-values (1, 'owner', 'OWNER'),
- (1, 'editor', 'EDITOR'),
- (1, 'viewer', 'VIEWER');
-
-insert into portfolios (id, name, number, targets, project_id)
-values (1, 'Test Portfolio', 1, '{ "metrics": [] }' format json, 1);
-
-insert into topologies (id, created_at, name, number, rooms, updated_at, project_id)
-values (1, current_timestamp(), 'Test Topology', 1, '[]' format json, current_timestamp(), 1);
-
-insert into scenarios (id, name, number, phenomena, scheduler_name, sampling_fraction, portfolio_id, project_id, topology_id, trace_id)
-values (1, 'Test Scenario', 1, '{ "failures": false, "interference": false }' format json, 'mem', 1.0, 1, 1, 1, 'bitbrains-small'),
- (2, 'Test Scenario', 2, '{ "failures": false, "interference": false }' format json, 'mem', 1.0, 1, 1, 1, 'bitbrains-small');
-
-insert into jobs (id, created_by, created_at, repeats, updated_at, scenario_id)
-values (1, 'owner', current_timestamp(), 1, current_timestamp(), 1),
- (2, 'owner', current_timestamp(), 1, current_timestamp(), 2);
diff --git a/opendc-web/opendc-web-server/src/main/resources/load_data.sql b/opendc-web/opendc-web-server/src/main/resources/load_data.sql
new file mode 100644
index 00000000..72396cef
--- /dev/null
+++ b/opendc-web/opendc-web-server/src/main/resources/load_data.sql
@@ -0,0 +1,124 @@
+
+-- Insert data
+
+INSERT INTO PROJECT (created_at, name, portfolios_created, scenarios_created, topologies_created, updated_at, id)
+ VALUES ('2024-03-01T15:31:41.579969Z', 'Test Project 1', 0, 0, 0, '2024-03-01T15:31:41.579969Z', 1);
+
+INSERT INTO PROJECTAUTHORIZATION (role, project_id, user_name)
+VALUES ('OWNER', 1, 'test_user_1');
+
+-- Add test user 2 as a viewer for project 1
+
+INSERT INTO PROJECTAUTHORIZATION (role, project_id, user_name)
+VALUES ('VIEWER', 1, 'test_user_2');
+
+-- Add test user 3 as an editor for project 1
+
+INSERT INTO PROJECTAUTHORIZATION (role, project_id, user_name)
+VALUES ('EDITOR', 1, 'test_user_3');
+
+-- Create a project for test user 2
+
+INSERT INTO PROJECT (created_at, name, portfolios_created, scenarios_created, topologies_created, updated_at, id)
+VALUES ('2024-03-01T15:31:41.579969Z', 'Test Project 2', 0, 0, 0, '2024-03-01T15:31:41.579969Z', 2);
+
+INSERT INTO PROJECTAUTHORIZATION (role, project_id, user_name)
+VALUES ('OWNER', 2, 'test_user_2');
+
+-- Create three projects for test user 3. User 3 has multiple projects to test getAll
+
+INSERT INTO PROJECT (created_at, name, portfolios_created, scenarios_created, topologies_created, updated_at, id)
+VALUES ('2024-03-01T15:31:41.579969Z', 'Test Project 3', 0, 0, 0, '2024-03-01T15:31:41.579969Z', 3);
+
+INSERT INTO PROJECTAUTHORIZATION (role, project_id, user_name)
+VALUES ('OWNER', 3, 'test_user_3');
+
+INSERT INTO PROJECT (created_at, name, portfolios_created, scenarios_created, topologies_created, updated_at, id)
+VALUES ('2024-03-01T15:31:41.579969Z', 'Test Project 4', 0, 0, 0, '2024-03-01T15:31:41.579969Z', 4);
+
+INSERT INTO PROJECTAUTHORIZATION (role, project_id, user_name)
+VALUES ('OWNER', 4, 'test_user_3');
+
+INSERT INTO PROJECT (created_at, name, portfolios_created, scenarios_created, topologies_created, updated_at, id)
+VALUES ('2024-03-01T15:31:41.579969Z', 'Test Project 5', 0, 0, 0, '2024-03-01T15:31:41.579969Z', 5);
+
+INSERT INTO PROJECTAUTHORIZATION (role, project_id, user_name)
+VALUES ('OWNER', 5, 'test_user_3');
+
+-- Project to delete
+
+INSERT INTO PROJECT (created_at, name, portfolios_created, scenarios_created, topologies_created, updated_at, id)
+VALUES ('2024-03-01T15:31:41.579969Z', 'Test Project Delete', 0, 0, 0, '2024-03-01T15:31:41.579969Z', 6);
+
+INSERT INTO PROJECTAUTHORIZATION (role, project_id, user_name)
+VALUES ('OWNER', 6, 'test_user_1');
+
+-- --------------------------------------------------------------------------------
+-- PortFolios
+-- --------------------------------------------------------------------------------
+
+-- Add Portfolio to project 1
+INSERT INTO PORTFOLIO (name, number, project_id, targets, id)
+VALUES ('Test PortFolio Base', 1, 1, '{"metrics": [], "repeats":1}' FORMAT JSON, 1);
+
+INSERT INTO PORTFOLIO (name, number, project_id, targets, id)
+VALUES ('Test PortFolio Delete', 2, 1, '{"metrics": [], "repeats":1}' FORMAT JSON, 2);
+
+INSERT INTO PORTFOLIO (name, number, project_id, targets, id)
+VALUES ('Test PortFolio DeleteEditor', 3, 1, '{"metrics": [], "repeats":1}' FORMAT JSON, 3);
+
+UPDATE Project p
+SET p.portfolios_created = 3, p.updated_at = '2024-03-01T15:31:41.579969Z'
+WHERE p.id = 1;
+
+-- --------------------------------------------------------------------------------
+-- Topologies
+-- --------------------------------------------------------------------------------
+
+INSERT INTO TOPOLOGY (created_at, name, number, project_id, rooms, updated_at, id)
+VALUES ('2024-03-01T15:31:41.579969Z', 'Test Topology testUpdate', 1, 1, '[]' FORMAT JSON, '2024-03-01T15:31:41.579969Z', 1);
+
+INSERT INTO TOPOLOGY (created_at, name, number, project_id, rooms, updated_at, id)
+VALUES ('2024-03-01T15:31:41.579969Z', 'Test Topology testDeleteAsEditor', 2, 1, '[]' FORMAT JSON, '2024-03-01T15:31:41.579969Z', 2);
+
+INSERT INTO TOPOLOGY (created_at, name, number, project_id, rooms, updated_at, id)
+VALUES ('2024-03-01T15:31:41.579969Z', 'Test Topology testDelete', 3, 1, '[]' FORMAT JSON, '2024-03-01T15:31:41.579969Z', 3);
+
+INSERT INTO TOPOLOGY (created_at, name, number, project_id, rooms, updated_at, id)
+VALUES ('2024-03-01T15:31:41.579969Z', 'Test Topology testDeleteUsed', 4, 1, '[]' FORMAT JSON, '2024-03-01T15:31:41.579969Z', 4);
+
+UPDATE Project p
+SET p.topologies_created = 4, p.updated_at = '2024-03-01T15:31:41.579969Z'
+WHERE p.id = 1;
+
+-- --------------------------------------------------------------------------------
+-- Traces
+-- --------------------------------------------------------------------------------
+
+INSERT INTO TRACE (id, name, type)
+VALUES ('bitbrains-small', 'Bitbrains Small', 'small');
+
+-- --------------------------------------------------------------------------------
+-- Scenario
+-- --------------------------------------------------------------------------------
+
+INSERT INTO SCENARIO (name, number, phenomena, portfolio_id, project_id, scheduler_name, topology_id, sampling_fraction, trace_id, id)
+VALUES ('Test Scenario testDelete', 1, '{"failures": false, "interference": false}' FORMAT JSON, 1, 1, 'test', 1, 1.0, 'bitbrains-small', 1);
+
+INSERT INTO SCENARIO (name, number, phenomena, portfolio_id, project_id, scheduler_name, topology_id, sampling_fraction, trace_id, id)
+VALUES ('Test Scenario testDeleteUsed', 2, '{"failures": false, "interference": false}' FORMAT JSON, 1, 1, 'test', 4, 1.0, 'bitbrains-small', 2);
+
+
+UPDATE Project p
+SET p.scenarios_created = 2, p.updated_at = '2024-03-01T15:31:41.579969Z'
+WHERE p.id = 1;
+
+-- --------------------------------------------------------------------------------
+-- Job
+-- --------------------------------------------------------------------------------
+
+INSERT INTO JOB (scenario_id, created_by, created_at, repeats, updated_at, state, runtime, results, id)
+VALUES (1, 'test_user_1', '2024-03-01T15:31:41.579969Z', 1, '2024-03-01T15:31:41.579969Z', 'PENDING', 1, '{}' FORMAT JSON, 1);
+
+INSERT INTO JOB (scenario_id, created_by, created_at, repeats, updated_at, state, runtime, results, id)
+VALUES (1, 'test_user_1', '2024-03-01T15:31:41.579969Z', 1, '2024-03-01T15:31:41.579969Z', 'PENDING', 1, '{}' FORMAT JSON, 2);