openapi: 3.0.0 info: version: 2.1.0 title: OpenDC REST API v2 description: OpenDC is an open-source datacenter simulator for education, featuring real-time online collaboration, diverse simulation models, and detailed performance feedback statistics. license: name: MIT url: https://spdx.org/licenses/MIT contact: name: Support url: https://opendc.org servers: - url: https://api.opendc.org/v2 externalDocs: description: OpenDC REST API v2 url: https://api.opendc.com/v2/docs/ security: - auth0: - openid paths: /projects: get: tags: - projects description: List Projects of the active user responses: "200": description: Successfully content: "application/json": schema: type: object required: - data properties: data: type: array items: $ref: "#/components/schemas/Project" "401": description: Unauthorized. content: "application/json": schema: $ref: "#/components/schemas/Unauthorized" post: tags: - projects description: Add a Project. requestBody: content: application/json: schema: properties: name: type: string description: The new Project. required: true responses: "200": description: Successfully added Project. content: "application/json": schema: type: object required: - data properties: data: $ref: "#/components/schemas/Project" "400": description: Missing or incorrectly typed parameter. content: "application/json": schema: $ref: "#/components/schemas/Invalid" "401": description: Unauthorized. content: "application/json": schema: $ref: "#/components/schemas/Unauthorized" "/projects/{projectId}": get: tags: - projects description: Get this Project. parameters: - name: projectId in: path description: Project's ID. required: true schema: type: string responses: "200": description: Successfully retrieved Project. content: "application/json": schema: type: object required: - data properties: data: $ref: "#/components/schemas/Project" "401": description: Unauthorized. content: "application/json": schema: $ref: "#/components/schemas/Unauthorized" "403": description: Forbidden from retrieving Project. content: "application/json": schema: $ref: "#/components/schemas/Forbidden" "404": description: Project not found content: "application/json": schema: $ref: "#/components/schemas/NotFound" put: tags: - projects description: Update this Project. parameters: - name: projectId in: path description: Project's ID. required: true schema: type: string requestBody: content: application/json: schema: properties: project: $ref: "#/components/schemas/Project" description: Project's new properties. required: true responses: "200": description: Successfully updated Project. content: "application/json": schema: type: object required: - data properties: data: $ref: "#/components/schemas/Project" "400": description: Missing or incorrectly typed parameter. content: "application/json": schema: $ref: "#/components/schemas/Invalid" "401": description: Unauthorized. content: "application/json": schema: $ref: "#/components/schemas/Unauthorized" "403": description: Forbidden from updating Project. content: "application/json": schema: $ref: "#/components/schemas/Forbidden" "404": description: Project not found. content: "application/json": schema: $ref: "#/components/schemas/NotFound" delete: tags: - projects description: Delete this project. parameters: - name: projectId in: path description: Project's ID. required: true schema: type: string responses: "200": description: Successfully deleted Project. content: "application/json": schema: type: object required: - data properties: data: $ref: "#/components/schemas/Project" "401": description: Unauthorized. content: "application/json": schema: $ref: "#/components/schemas/Unauthorized" "403": description: Forbidden from deleting Project. content: "application/json": schema: $ref: "#/components/schemas/Forbidden" "404": description: Project not found. content: "application/json": schema: $ref: "#/components/schemas/NotFound" "/projects/{projectId}/topologies": get: tags: - projects description: Get Project Topologies. parameters: - name: projectId in: path description: Project's ID. required: true schema: type: string responses: "200": description: Successfully retrieved Project Topologies. content: "application/json": schema: type: object required: - data properties: data: type: array items: $ref: "#/components/schemas/Topology" "401": description: Unauthorized. content: "application/json": schema: $ref: "#/components/schemas/Unauthorized" "403": description: Forbidden from retrieving Project. content: "application/json": schema: $ref: "#/components/schemas/Forbidden" "404": description: Project not found. content: "application/json": schema: $ref: "#/components/schemas/NotFound" post: tags: - projects description: Add a Topology. parameters: - name: projectId in: path description: Project's ID. required: true schema: type: string requestBody: content: application/json: schema: properties: topology: $ref: "#/components/schemas/Topology" description: The new Topology. required: true responses: "200": description: Successfully added Topology. content: "application/json": schema: type: object required: - data properties: data: $ref: "#/components/schemas/Topology" "400": description: Missing or incorrectly typed parameter. content: "application/json": schema: $ref: "#/components/schemas/Invalid" "401": description: Unauthorized. content: "application/json": schema: $ref: "#/components/schemas/Unauthorized" "404": description: Project not found. content: "application/json": schema: $ref: "#/components/schemas/NotFound" "/projects/{projectId}/portfolios": get: tags: - projects description: Get Project Portfolios. parameters: - name: projectId in: path description: Project's ID. required: true schema: type: string responses: "200": description: Successfully retrieved Project Portfolios. content: "application/json": schema: type: object required: - data properties: data: type: array items: $ref: "#/components/schemas/Portfolio" "401": description: Unauthorized. content: "application/json": schema: $ref: "#/components/schemas/Unauthorized" "403": description: Forbidden from retrieving Project. content: "application/json": schema: $ref: "#/components/schemas/Forbidden" "404": description: Project not found. content: "application/json": schema: $ref: "#/components/schemas/NotFound" post: tags: - projects description: Add a Portfolio. parameters: - name: projectId in: path description: Project's ID. required: true schema: type: string requestBody: content: application/json: schema: properties: topology: $ref: "#/components/schemas/Portfolio" description: The new Portfolio. required: true responses: "200": description: Successfully added Portfolio. content: "application/json": schema: type: object required: - data properties: data: $ref: "#/components/schemas/Portfolio" "400": description: Missing or incorrectly typed parameter. content: "application/json": schema: $ref: "#/components/schemas/Invalid" "401": description: Unauthorized. content: "application/json": schema: $ref: "#/components/schemas/Unauthorized" "404": description: Project not found. content: "application/json": schema: $ref: "#/components/schemas/NotFound" "/topologies/{topologyId}": get: tags: - topologies description: Get this Topology. parameters: - name: topologyId in: path description: Topology's ID. required: true schema: type: string responses: "200": description: Successfully retrieved Topology. content: "application/json": schema: type: object required: - data properties: data: $ref: "#/components/schemas/Topology" "400": description: Missing or incorrectly typed parameter. content: "application/json": schema: $ref: "#/components/schemas/Invalid" "401": description: Unauthorized. content: "application/json": schema: $ref: "#/components/schemas/Unauthorized" "403": description: Forbidden from retrieving Topology. content: "application/json": schema: $ref: "#/components/schemas/Forbidden" "404": description: Topology not found. content: "application/json": schema: $ref: "#/components/schemas/NotFound" put: tags: - topologies description: Update this Topology's name. parameters: - name: topologyId in: path description: Topology's ID. required: true schema: type: string requestBody: content: application/json: schema: properties: topology: $ref: "#/components/schemas/Topology" description: Topology's new properties. required: true responses: "200": description: Successfully updated Topology. content: "application/json": schema: type: object required: - data properties: data: $ref: "#/components/schemas/Topology" "400": description: Missing or incorrectly typed parameter. content: "application/json": schema: $ref: "#/components/schemas/Invalid" "401": description: Unauthorized. content: "application/json": schema: $ref: "#/components/schemas/Unauthorized" "403": description: Forbidden from retrieving Project. content: "application/json": schema: $ref: "#/components/schemas/Forbidden" "404": description: Project not found. content: "application/json": schema: $ref: "#/components/schemas/NotFound" delete: tags: - topologies description: Delete this Topology. parameters: - name: topologyId in: path description: Topology's ID. required: true schema: type: string responses: "200": description: Successfully deleted Topology. content: "application/json": schema: type: object required: - data properties: data: $ref: "#/components/schemas/Topology" "401": description: Unauthorized. content: "application/json": schema: $ref: "#/components/schemas/Unauthorized" "403": description: Forbidden from deleting Topology. content: "application/json": schema: $ref: "#/components/schemas/Forbidden" "404": description: Topology not found. content: "application/json": schema: $ref: "#/components/schemas/NotFound" "/portfolios/{portfolioId}": get: tags: - portfolios description: Get this Portfolio. parameters: - name: portfolioId in: path description: Portfolio's ID. required: true schema: type: string responses: "200": description: Successfully retrieved Portfolio. content: "application/json": schema: type: object required: - data properties: data: $ref: "#/components/schemas/Portfolio" "400": description: Missing or incorrectly typed parameter. content: "application/json": schema: $ref: "#/components/schemas/Invalid" "401": description: Unauthorized. content: "application/json": schema: $ref: "#/components/schemas/Unauthorized" "403": description: Forbidden from retrieving Portfolio. content: "application/json": schema: $ref: "#/components/schemas/Forbidden" "404": description: Portfolio not found. content: "application/json": schema: $ref: "#/components/schemas/NotFound" put: tags: - portfolios description: Update this Portfolio. parameters: - name: portfolioId in: path description: Portfolio's ID. required: true schema: type: string requestBody: content: application/json: schema: $ref: "#/components/schemas/Portfolio" description: Portfolio's new properties. required: true responses: "200": description: Successfully updated Portfolio. content: "application/json": schema: type: object required: - data properties: data: $ref: "#/components/schemas/Portfolio" "400": description: Missing or incorrectly typed parameter. content: "application/json": schema: $ref: "#/components/schemas/Invalid" "401": description: Unauthorized. content: "application/json": schema: $ref: "#/components/schemas/Unauthorized" "403": description: Forbidden from retrieving Portfolio. content: "application/json": schema: $ref: "#/components/schemas/Forbidden" "404": description: Portfolio not found. content: "application/json": schema: $ref: "#/components/schemas/NotFound" delete: tags: - portfolios description: Delete this Portfolio. parameters: - name: portfolioId in: path description: Portfolio's ID. required: true schema: type: string responses: "200": description: Successfully deleted Portfolio. content: "application/json": schema: type: object required: - data properties: data: $ref: "#/components/schemas/Portfolio" "401": description: Unauthorized. content: "application/json": schema: $ref: "#/components/schemas/Unauthorized" "403": description: Forbidden from retrieving Portfolio. content: "application/json": schema: $ref: "#/components/schemas/Forbidden" "404": description: Portfolio not found. content: "application/json": schema: $ref: "#/components/schemas/NotFound" "/portfolios/{portfolioId}/scenarios": get: tags: - portfolios description: Get Portfolio Scenarios. parameters: - name: portfolioId in: path description: Portfolio's ID. required: true schema: type: string responses: "200": description: Successfully retrieved Portfolio Scenarios. content: "application/json": schema: type: object required: - data properties: data: type: array items: $ref: "#/components/schemas/Scenario" "401": description: Unauthorized. content: "application/json": schema: $ref: "#/components/schemas/Unauthorized" "403": description: Forbidden from retrieving Portfolio. content: "application/json": schema: $ref: "#/components/schemas/Forbidden" "404": description: Portfolio not found. content: "application/json": schema: $ref: "#/components/schemas/NotFound" post: tags: - portfolios description: Add a Scenario. parameters: - name: portfolioId in: path description: Portfolio's ID. required: true schema: type: string requestBody: content: application/json: schema: properties: topology: $ref: "#/components/schemas/Scenario" description: The new Scenario. required: true responses: "200": description: Successfully added Scenario. content: "application/json": schema: type: object required: - data properties: data: $ref: "#/components/schemas/Scenario" "400": description: Missing or incorrectly typed parameter. content: "application/json": schema: $ref: "#/components/schemas/Invalid" "401": description: Unauthorized. content: "application/json": schema: $ref: "#/components/schemas/Unauthorized" "404": description: Portfolio not found. content: "application/json": schema: $ref: "#/components/schemas/NotFound" "/scenarios/{scenarioId}": get: tags: - scenarios description: Get this Scenario. parameters: - name: scenarioId in: path description: Scenario's ID. required: true schema: type: string responses: "200": description: Successfully retrieved Scenario. content: "application/json": schema: type: object required: - data properties: data: $ref: "#/components/schemas/Scenario" "400": description: Missing or incorrectly typed parameter. content: "application/json": schema: $ref: "#/components/schemas/Invalid" "401": description: Unauthorized. content: "application/json": schema: $ref: "#/components/schemas/Unauthorized" "403": description: Forbidden from retrieving Scenario. content: "application/json": schema: $ref: "#/components/schemas/Forbidden" "404": description: Scenario not found. content: "application/json": schema: $ref: "#/components/schemas/NotFound" put: tags: - scenarios description: Update this Scenario's name (other properties are read-only). parameters: - name: scenarioId in: path description: Scenario's ID. required: true schema: type: string requestBody: content: application/json: schema: $ref: "#/components/schemas/Scenario" description: Scenario with new name. required: true responses: "200": description: Successfully updated Scenario. content: "application/json": schema: type: object required: - data properties: data: $ref: "#/components/schemas/Scenario" "400": description: Missing or incorrectly typed parameter. content: "application/json": schema: $ref: "#/components/schemas/Invalid" "401": description: Unauthorized. content: "application/json": schema: $ref: "#/components/schemas/Unauthorized" "403": description: Forbidden from retrieving Scenario. content: "application/json": schema: $ref: "#/components/schemas/Forbidden" "404": description: Scenario not found. content: "application/json": schema: $ref: "#/components/schemas/NotFound" delete: tags: - scenarios description: Delete this Scenario. parameters: - name: scenarioId in: path description: Scenario's ID. required: true schema: type: string responses: "200": description: Successfully deleted Scenario. content: "application/json": schema: type: object required: - data properties: data: $ref: "#/components/schemas/Scenario" "401": description: Unauthorized. content: "application/json": schema: $ref: "#/components/schemas/Unauthorized" "403": description: Forbidden from retrieving Scenario. content: "application/json": schema: $ref: "#/components/schemas/Forbidden" "404": description: Scenario not found. content: "application/json": schema: $ref: "#/components/schemas/NotFound" /schedulers: get: tags: - simulation description: Get all available Schedulers responses: "200": description: Successfully retrieved Schedulers. content: "application/json": schema: type: object required: - data properties: data: type: array items: $ref: "#/components/schemas/Scheduler" "401": description: Unauthorized. content: "application/json": schema: $ref: "#/components/schemas/Unauthorized" /traces: get: tags: - simulation description: Get all available Traces responses: "200": description: Successfully retrieved Traces. content: "application/json": schema: type: object required: - data properties: data: type: array items: type: object properties: _id: type: string name: type: string "401": description: Unauthorized. content: "application/json": schema: $ref: "#/components/schemas/Unauthorized" "/traces/{traceId}": get: tags: - simulation description: Get this Trace. parameters: - name: traceId in: path description: Trace's ID. required: true schema: type: string responses: "200": description: Successfully retrieved Trace. content: "application/json": schema: type: object required: - data properties: data: $ref: "#/components/schemas/Trace" "401": description: Unauthorized. content: "application/json": schema: $ref: "#/components/schemas/Unauthorized" "404": description: Trace not found content: "application/json": schema: $ref: "#/components/schemas/NotFound" /prefabs: get: tags: - prefabs description: Get all Prefabs the user has rights to view. responses: "200": description: Successfully retrieved prefabs the user is authorized on. content: "application/json": schema: type: object required: - data properties: data: type: array items: $ref: "#/components/schemas/Prefab" "401": description: Unauthorized. content: "application/json": schema: $ref: "#/components/schemas/Unauthorized" post: tags: - prefabs description: Add a Prefab. requestBody: content: application/json: schema: properties: name: type: string description: The new Prefab. required: true responses: "200": description: Successfully added Prefab. content: "application/json": schema: type: object required: - data properties: data: $ref: "#/components/schemas/Prefab" "400": description: Missing or incorrectly typed parameter. content: "application/json": schema: $ref: "#/components/schemas/Invalid" "401": description: Unauthorized. content: "application/json": schema: $ref: "#/components/schemas/Unauthorized" "/prefabs/{prefabId}": get: tags: - prefabs description: Get this Prefab. parameters: - name: prefabId in: path description: Prefab's ID. required: true schema: type: string responses: "200": description: Successfully retrieved Prefab. content: "application/json": schema: type: object required: - data properties: data: $ref: "#/components/schemas/Prefab" "401": description: Unauthorized. content: "application/json": schema: $ref: "#/components/schemas/Unauthorized" "403": description: Forbidden from retrieving Prefab. content: "application/json": schema: $ref: "#/components/schemas/Forbidden" "404": description: Prefab not found. content: "application/json": schema: $ref: "#/components/schemas/NotFound" put: tags: - prefabs description: Update this Prefab. parameters: - name: prefabId in: path description: Prefab's ID. required: true schema: type: string requestBody: content: application/json: schema: properties: prefab: $ref: "#/components/schemas/Prefab" description: Prefab's new properties. required: true responses: "200": description: Successfully updated Prefab. content: "application/json": schema: type: object required: - data properties: data: $ref: "#/components/schemas/Prefab" "400": description: Missing or incorrectly typed parameter. content: "application/json": schema: $ref: "#/components/schemas/Invalid" "401": description: Unauthorized. content: "application/json": schema: $ref: "#/components/schemas/Unauthorized" "403": description: Forbidden from retrieving Prefab. content: "application/json": schema: $ref: "#/components/schemas/Forbidden" "404": description: Prefab not found. content: "application/json": schema: $ref: "#/components/schemas/NotFound" delete: tags: - prefabs description: Delete this prefab. parameters: - name: prefabId in: path description: Prefab's ID. required: true schema: type: string responses: "200": description: Successfully deleted Prefab. content: "application/json": schema: type: object required: - data properties: data: $ref: "#/components/schemas/Prefab" "401": description: Unauthorized. content: "application/json": schema: $ref: "#/components/schemas/Unauthorized" "404": description: Prefab not found. content: "application/json": schema: $ref: "#/components/schemas/NotFound" /jobs: get: tags: - jobs description: Get all available jobs to run. responses: "200": description: Successfully retrieved available jobs. content: "application/json": schema: type: object required: - data properties: data: type: array items: $ref: "#/components/schemas/Job" "401": description: Unauthorized. content: "application/json": schema: $ref: "#/components/schemas/Unauthorized" "/jobs/{jobId}": get: tags: - jobs description: Get this Job. parameters: - name: jobId in: path description: Job's ID. required: true schema: type: string responses: "200": description: Successfully retrieved Job. content: "application/json": schema: type: object required: - data properties: data: $ref: "#/components/schemas/Job" "401": description: Unauthorized. content: "application/json": schema: $ref: "#/components/schemas/Unauthorized" "403": description: Forbidden from retrieving Job. content: "application/json": schema: $ref: "#/components/schemas/Forbidden" "404": description: Job not found. content: "application/json": schema: $ref: "#/components/schemas/NotFound" post: tags: - jobs description: Update this Job. parameters: - name: jobId in: path description: Job's ID. required: true schema: type: string requestBody: content: application/json: schema: properties: job: $ref: "#/components/schemas/Job" description: Job's new properties. required: true responses: "200": description: Successfully updated Job. content: "application/json": schema: type: object required: - data properties: data: $ref: "#/components/schemas/Job" "400": description: Missing or incorrectly typed parameter. content: "application/json": schema: $ref: "#/components/schemas/Invalid" "401": description: Unauthorized. content: "application/json": schema: $ref: "#/components/schemas/Unauthorized" "403": description: Forbidden from retrieving Job. content: "application/json": schema: $ref: "#/components/schemas/Forbidden" "404": description: Job not found. content: "application/json": schema: $ref: "#/components/schemas/NotFound" "409": description: State conflict. content: "application/json": schema: $ref: "#/components/schemas/Invalid" components: securitySchemes: auth0: type: oauth2 x-token-validation-url: https://opendc.eu.auth0.com/userinfo flows: authorizationCode: authorizationUrl: https://opendc.eu.auth0.com/authorize tokenUrl: https://opendc.eu.auth0.com/oauth/token scopes: openid: Grants access to user_id runner: Grants access to runner jobs schemas: Unauthorized: type: object required: - message properties: message: type: string Invalid: type: object required: - message - errors properties: message: type: string errors: type: array items: type: string Forbidden: type: object required: - message properties: message: type: string NotFound: type: object required: - message properties: message: type: string Scheduler: type: object properties: name: type: string Project: type: object properties: _id: type: string name: type: string datetimeCreated: type: string format: dateTime datetimeLastEdited: type: string format: dateTime topologyIds: type: array items: type: string portfolioIds: type: array items: type: string authorizations: type: array items: type: object properties: userId: type: string level: type: string enum: ['OWN', 'EDIT', 'VIEW'] Topology: type: object properties: _id: type: string projectId: type: string name: type: string rooms: type: array items: type: object properties: _id: type: string name: type: string tiles: type: array items: type: object properties: _id: type: string positionX: type: integer positionY: type: integer object: type: object properties: _id: type: string name: type: string capacity: type: integer powerCapacityW: type: integer machines: type: array items: type: object properties: _id: type: string position: type: integer cpus: type: array items: type: object properties: _id: type: string name: type: string clockRateMhz: type: integer numberOfCores: type: integer energyConsumptionW: type: integer gpus: type: array items: type: object properties: _id: type: string name: type: string clockRateMhz: type: integer numberOfCores: type: integer energyConsumptionW: type: integer memories: type: array items: type: object properties: _id: type: string name: type: string speedMbPerS: type: integer sizeMb: type: integer energyConsumptionW: type: integer storages: type: array items: type: object properties: _id: type: string name: type: string speedMbPerS: type: integer sizeMb: type: integer energyConsumptionW: type: integer Portfolio: type: object properties: _id: type: string projectId: type: string name: type: string scenarioIds: type: array items: type: string targets: type: object properties: enabledMetrics: type: array items: type: string repeatsPerScenario: type: integer Scenario: type: object properties: _id: type: string portfolioId: type: string name: type: string trace: type: object properties: traceId: type: string loadSamplingFraction: type: number topology: type: object properties: topologyId: type: string operational: type: object properties: failuresEnabled: type: boolean performanceInterferenceEnabled: type: boolean schedulerName: type: string Job: type: object properties: _id: type: string scenarioId: type: string state: type: string heartbeat: type: string results: type: object Trace: type: object properties: _id: type: string name: type: string path: type: string type: type: string Prefab: type: object properties: _id: type: string name: type: string datetimeCreated: type: string format: dateTime datetimeLastEdited: type: string format: dateTime