--- /dev/null
+.. This work is licensed under a Creative Commons Attribution 4.0 International License.
+.. SPDX-License-Identifier: CC-BY-4.0
+.. Copyright (C) 2020 Nordix
+
+.. _simulator-api:
+
+=============
+Simulator API
+=============
+
+This document describes the API used to manage policy types and manipulate the simulator.
+
+The simulator supports different versions of the A1 interface. Some functions are common for all version, and some are
+specific for a certain version.
+
+.. contents:: Operations
+ :depth: 4
+ :local:
+
+Common Functions
+================
+
+Health Check
+------------
+
+The status of the simulator.
+
+/
+~~
+
+GET
++++
+
+ Returns the status of the simulator.
+
+ **URL path:**
+ /
+
+ **Parameters:**
+
+ None.
+
+ **Responses:**
+
+ 200:
+ Simulator is living.
+
+ **Examples:**
+
+ Call: ::
+
+ curl -X GET "http://localhost:8085/"
+
+ Result:
+ 200
+ Simulator is living (OSC_2.1.0 responds OK)
+
+Supported Interfaces
+--------------------
+
+The simulator can support different versions of the A1 interface. With this API the supported versions can be listed.
+
+/container_interfaces
+~~~~~~~~~~~~~~~~~~~~~
+
+GET
++++
+
+ Returns the status of the simulator. (Not available for A1 Standard 1.1.3)
+
+ **URL path:**
+ /container_interfaces
+
+ **Parameters:**
+
+ None.
+
+ **Responses:**
+
+ 200:
+ List of supported interfaces.
+
+ **Examples:**
+
+ Call: ::
+
+ curl -X GET "http://localhost:8085/container_interfaces"
+
+ Result:
+ 200
+ 1.1.x-alpha.2 OSC_2.1.0 STD_1.1.3
+
+Counters
+--------
+
+The simulator keeps counts of different things that can be accessed.
+
+/counter
+~~~~~~~~
+
+GET
++++
+
+ Get a counter. Counter-name can be one of the following: 'num_instances', 'num_types' or 'interface'.
+
+ **URL path:**
+ /counter/{counter-name}
+
+ **Parameters:**
+
+ None.
+
+ **Responses:**
+
+ 200:
+ The counter value for the given counter.
+
+ **Examples:**
+
+ Call: ::
+
+ curl -X GET "http://localhost:8085/counter/num_instances"
+
+ Result:
+ 200
+ 10
+
+Version Specific Functions
+==========================
+
+The methods available to control the simulator depends on the version of the A1 API the simulator is simulating.
+
+OSC_2.1.0
+---------
+
+The available functions for the OSC_2.1.0 version of A1.
+
+/deleteinstances
+~~~~~~~~~~~~~~~~
+
+POST
+++++
+
+ Delete all policy instances.
+
+ **URL path:**
+ /deleteinstances
+
+ **Parameters:**
+
+ None.
+
+ **Responses:**
+
+ 200:
+ All policy instances deleted.
+
+ **Examples:**
+
+ Call: ::
+
+ curl -X POST "http://localhost:8085/deleteinstances"
+
+ Result:
+ 200
+ All policy instances deleted.
+
+/deleteall
+~~~~~~~~~~~~~~~~
+
+POST
+++++
+
+ Full reset.
+
+ **URL path:**
+ /deleteall
+
+ **Parameters:**
+
+ None.
+
+ **Responses:**
+
+ 200:
+ All policy instances and types deleted.
+
+ **Examples:**
+
+ Call: ::
+
+ curl -X POST "http://localhost:8085/deleteall"
+
+ Result:
+ 200
+ All policy instances and types deleted.
+
+/policytype
+~~~~~~~~~~~
+
+PUT
++++
+
+ Create a policy type.
+
+ **URL path:**
+ /policytype?id=<policy-type-id>
+
+ **Parameters:**
+
+ id: (*Required*)
+ The ID of the policy type.
+
+ **Body:** (*Required*)
+ A JSON object containing the schema for the type.
+
+ **Responses:**
+
+ 200:
+ Policy type <policy-type-id> is OK.
+
+ 201:
+ Policy type <policy-type-id> is OK.
+
+ **Examples:**
+
+ Call: ::
+
+ curl -X PUT "http://localhost:8085/policytype?id=Policy%201&ric=ric1&service=Service%201&type=STD_PolicyModelUnconstrained_0.2.0"
+ -H "Content-Type: application/json"
+ -d "
+ {
+ "$schema": "http://json-schema.org/draft-07/schema#",
+ "title": "STD_PolicyModelUnconstrained_0.2.0",
+ "description": "Standard model of a policy with unconstrained scope id combinations",
+ "type": "object",
+ "properties": {
+ "scope": {
+ "type": "object",
+ "properties": {
+ "ueId": {"type": "string"},
+ "groupId": {"type": "string"},
+ "sliceId": {"type": "string"},
+ "qosId": {"type": "string"},
+ "cellId": {"type": "string"}
+ },
+ "minProperties": 1,
+ "additionalProperties": false
+ },
+ "qosObjectives": {
+ "type": "object",
+ "properties": {
+ "gfbr": {"type": "number"},
+ "mfbr": {"type": "number"},
+ "priorityLevel": {"type": "number"},
+ "pdb": {"type": "number"}
+ },
+ "additionalProperties": false
+ },
+ "qoeObjectives": {
+ "type": "object",
+ "properties": {
+ "qoeScore": {"type": "number"},
+ "initialBuffering": {"type": "number"},
+ "reBuffFreq": {"type": "number"},
+ "stallRatio": {"type": "number"}
+ },
+ "additionalProperties": false
+ },
+ "resources": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "properties": {
+ "cellIdList": {
+ "type": "array",
+ "minItems": 1,
+ "uniqueItems": true,
+ "items": {
+ "type": "string"
+ }
+ },
+ "preference": {
+ "type": "string",
+ "enum": [
+ "SHALL",
+ "PREFER",
+ "AVOID",
+ "FORBID"
+ ]
+ },
+ "primary": {"type": "boolean"}
+ },
+ "additionalProperties": false,
+ "required": ["cellIdList", "preference"]
+ }
+ }
+ },
+ "minProperties": 2,
+ "additionalProperties": false,
+ "required": ["scope"]
+ }
+ "
+
+ Result:
+ 201
+ Policy type STD_PolicyModelUnconstrained_0.2.0 is OK
+
+DELETE
+++++++
+
+ Delete a policy type.
+
+ **URL path:**
+ /policytype?id=<policy-type-id>
+
+ **Parameters:**
+
+ id: (*Required*)
+ The ID of the policy type.
+
+ **Responses:**
+
+ 204:
+ Policy type <policy-type-id> is OK.
+
+ **Examples:**
+
+ Call: ::
+
+ curl -X DELETE "http://localhost:8085/policytype?id=Policy%201&ric=ric1&service=Service%201&type=STD_PolicyModelUnconstrained_0.2.0"
+
+ Result:
+ 204
+ Policy type STD_PolicyModelUnconstrained_0.2.0 is OK
+
+/policytypes
+~~~~~~~~~~~~
+
+GET
++++
+
+ Get a list of policy types.
+
+ **URL path:**
+ /policytypes
+
+ **Parameters:**
+
+ None.
+
+ **Responses:**
+
+ 200:
+ A list of policy types.
+
+ **Examples:**
+
+ Call: ::
+
+ curl -X GET "http://localhost:8085/policytypes"
+
+ Result:
+ 200
+ STD_PolicyModelUnconstrained_0.2.0
+
+/forceresponse
+~~~~~~~~~~~~~~
+
+POST
+++++
+
+ Force a specific response code for an A1 operation.
+
+ **URL path:**
+ /forceresponse?responsecode=<http-response-code>
+
+ **Parameters:**
+
+ responsecode: (*Required*)
+ The HTTP response code to return.
+
+ **Responses:**
+
+ 200:
+ Force response code: <expected code> set for one single A1 response
+
+ **Examples:**
+
+ Call: ::
+
+ curl -X POST "http://localhost:8085/forceresponse?responsecode=400"
+
+ Result:
+ 200
+ Force response code: 400 set for one single A1 response
+
+/forcedelay
+~~~~~~~~~~~
+
+POST
+++++
+
+ Force delayed response of all A1 operations.
+
+ **URL path:**
+ /forcedelay?delay=<delay-time-seconds>
+
+ **Parameters:**
+
+ delay: (*Required*)
+ The time in seconds to delay all responses.
+
+ **Responses:**
+
+ 200:
+ Force delay: <expected delay> sec set for all A1 responses
+
+ **Examples:**
+
+ Call: ::
+
+ curl -X POST "http://localhost:8085/forcedelay?delay=2"
+
+ Result:
+ 200
+ Force delay: 2 sec set for all A1 responses
+
+/status
+~~~~~~~
+
+PUT
++++
+
+ Set status and optional reason, delete and time stamp.
+
+ **URL path:**
+ /status?policyid=<policyid>&status=<status>&deleted=<value>&created_at=<time-stamp>
+
+ **Parameters:**
+
+ policyid: (*Required*)
+ The ID of a policy.
+
+ status: (*Required*)
+ The status of a policy.
+
+ deleted: (*Optional*)
+ True or false for real values, but accepts anything for error testing.
+
+ created_at: (*Optional*)
+ Time stamp for the status.
+
+ **Responses:**
+
+ 200:
+ Status set to <status> for policy <policy-id>
+
+ **Examples:**
+
+ Call: ::
+
+ curl -X PUT "http://localhost:8085/policyid=Policy1&status?status=Accepted
+
+ Result:
+ 200
+ Status set to Accepted for policy Policy1.
+
+A1 Standard 1.1.3
+-----------------
+
+The available functions for the A1 Standard 1.1.3 version of A1.
+
+/deleteinstances
+~~~~~~~~~~~~~~~~
+
+POST
+++++
+
+ Delete all policy instances.
+
+ **URL path:**
+ /deleteinstances
+
+ **Parameters:**
+
+ None.
+
+ **Responses:**
+
+ 200:
+ All policy instances deleted.
+
+ **Examples:**
+
+ Call: ::
+
+ curl -X POST "http://localhost:8085/deleteinstances"
+
+ Result:
+ 200
+ All policy instances deleted.
+
+/deleteall
+~~~~~~~~~~
+
+POST
+++++
+
+ Full reset.
+
+ **URL path:**
+ /deleteinstances
+
+ **Parameters:**
+
+ None.
+
+ **Responses:**
+
+ 200:
+ All policy instances deleted.
+
+ **Examples:**
+
+ Call: ::
+
+ curl -X POST "http://localhost:8085/deleteall"
+
+ Result:
+ 200
+ All policy instances deleted.
+
+/forceresponse
+~~~~~~~~~~~~~~
+
+POST
+++++
+
+ Force a specific response code for an A1 operation.
+
+ **URL path:**
+ /forceresponse?responsecode=<http-response-code>
+
+ **Parameters:**
+
+ responsecode: (*Required*)
+ The HTTP response code to return.
+
+ **Responses:**
+
+ 200:
+ Force response code: <expected code> set for one single A1 response
+
+ **Examples:**
+
+ Call: ::
+
+ curl -X POST "http://localhost:8085/forceresponse?responsecode=400"
+
+ Result:
+ 200
+ Force response code: 400 set for one single A1 response
+
+/forcedelay
+~~~~~~~~~~~
+
+POST
+++++
+
+ Force delayed response of all A1 operations.
+
+ **URL path:**
+ /forcedelay?delay=<delay-time-seconds>
+
+ **Parameters:**
+
+ delay: (*Required*)
+ The time in seconds to delay all responses.
+
+ **Responses:**
+
+ 200:
+ Force delay: <expected delay> sec set for all A1 responses
+
+ **Examples:**
+
+ Call: ::
+
+ curl -X POST "http://localhost:8085/forcedelay?delay=2"
+
+ Result:
+ 200
+ Force delay: 2 sec set for all A1 responses
+
+/status
+~~~~~~~
+
+PUT
++++
+
+ Set status and optional reason, delete and time stamp.
+
+ **URL path:**
+ /status?policyid=<policyid>&status=<status>&reason=<reason>
+
+ **Parameters:**
+
+ policyid: (*Required*)
+ The ID of a policy.
+
+ status: (*Required*)
+ The status of a policy.
+
+ reason: (*Optional*)
+ The reason for the status.
+
+ **Responses:**
+
+ 200:
+ Status set to <status> for policy <policy-id>
+
+ **Examples:**
+
+ Call: ::
+
+ curl -X PUT "http://localhost:8085/status?policyid=Policy1&status=Accepted
+
+ Result:
+ 200
+ Status set to Accepted for policy Policy1
+
+/sendstatus
+~~~~~~~~~~~
+
+POST
+++++
+
+ Send status for policy.
+
+ **URL path:**
+ /sendstatus?policyid=<policy-id>
+
+ **Parameters:**
+
+ policyid: (*Required*)
+ The ID of the policy to send status for.
+
+ **Responses:**
+
+ 200:
+ Is a JSON with the response of the actual post request to the callback server, whatever that is.
+
+ **Examples:**
+
+ Call: ::
+
+ curl -X POST "http://localhost:8085/sendstatus?policyid=Policy2"
+
+ Result:
+ 200
+
+1.1.x-alpha.2
+-------------
+
+The available functions for the 1.1.x-alpha.2.
+
+/deleteinstances
+~~~~~~~~~~~~~~~~
+
+DELETE
+++++++
+
+ Delete all policy instances.
+
+ **URL path:**
+ /deleteinstances
+
+ **Parameters:**
+
+ None.
+
+ **Responses:**
+
+ 200:
+ All policy instances deleted.
+
+ **Examples:**
+
+ Call: ::
+
+ curl -X DELETE "http://localhost:8085/deleteinstances"
+
+ Result:
+ 200
+ All policy instances deleted.
+
+/deletetypes
+~~~~~~~~~~~~
+
+DELETE
+++++++
+
+ Delete all policy types.
+
+ **URL path:**
+ /deletetypes
+
+ **Parameters:**
+
+ None.
+
+ **Responses:**
+
+ 200:
+ All policy types deleted.
+
+ **Examples:**
+
+ Call: ::
+
+ curl -X DELETE "http://localhost:8085/deletetypes"
+
+ Result:
+ 200
+ All policy types deleted.
+
+/policytypes
+~~~~~~~~~~~~
+
+PUT
++++
+
+ Create or update a policy type.
+
+ **URL path:**
+ /policytypes/{policy-type-id}
+
+ **Parameters:**
+
+ None.
+
+ **Body:** (*Required*)
+ A JSON object containing the schema for the type.
+
+ **Responses:**
+
+ 200:
+ The policy type was either created or updated for policy type id: <policy-type-id>
+
+ **Examples:**
+
+ Call: ::
+
+ curl -X PUT "http://localhost:8085/policytype/Policy%201&ric=ric1&service=Service%201&type=STD_PolicyModelUnconstrained_0.2.0"
+ -H "Content-Type: application/json"
+ -d "
+ {
+ "$schema": "http://json-schema.org/draft-07/schema#",
+ "title": "STD_PolicyModelUnconstrained_0.2.0",
+ "description": "Standard model of a policy with unconstrained scope id combinations",
+ "type": "object",
+ "properties": {
+ "scope": {
+ "type": "object",
+ "properties": {
+ "ueId": {"type": "string"},
+ "groupId": {"type": "string"},
+ "sliceId": {"type": "string"},
+ "qosId": {"type": "string"},
+ "cellId": {"type": "string"}
+ },
+ "minProperties": 1,
+ "additionalProperties": false
+ },
+ "qosObjectives": {
+ "type": "object",
+ "properties": {
+ "gfbr": {"type": "number"},
+ "mfbr": {"type": "number"},
+ "priorityLevel": {"type": "number"},
+ "pdb": {"type": "number"}
+ },
+ "additionalProperties": false
+ },
+ "qoeObjectives": {
+ "type": "object",
+ "properties": {
+ "qoeScore": {"type": "number"},
+ "initialBuffering": {"type": "number"},
+ "reBuffFreq": {"type": "number"},
+ "stallRatio": {"type": "number"}
+ },
+ "additionalProperties": false
+ },
+ "resources": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "properties": {
+ "cellIdList": {
+ "type": "array",
+ "minItems": 1,
+ "uniqueItems": true,
+ "items": {
+ "type": "string"
+ }
+ },
+ "preference": {
+ "type": "string",
+ "enum": [
+ "SHALL",
+ "PREFER",
+ "AVOID",
+ "FORBID"
+ ]
+ },
+ "primary": {"type": "boolean"}
+ },
+ "additionalProperties": false,
+ "required": ["cellIdList", "preference"]
+ }
+ }
+ },
+ "minProperties": 2,
+ "additionalProperties": false,
+ "required": ["scope"]
+ }
+ "
+
+ Result:
+ 200
+ The policy type was either created or updated for policy type id: STD_PolicyModelUnconstrained_0.2.0
+
+DELETE
+++++++
+
+ Delete a policy type.
+
+ **URL path:**
+ /policytypes/{policy-type-id}
+
+ **Parameters:**
+
+ None.
+
+ **Responses:**
+
+ 200:
+ policy type successfully deleted for policy type id: <policy-type-id>
+
+ **Examples:**
+
+ Call: ::
+
+ curl -X DELETE "http://localhost:8085/policytype?id=Policy%201&ric=ric1&service=Service%201&type=STD_PolicyModelUnconstrained_0.2.0"
+
+ Result:
+ 200
+ policy type successfully deleted for policy type id: STD_PolicyModelUnconstrained_0.2.0
+
+/{policyId}/{enforceStatus}
+~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+PUT
++++
+
+ Set a status to a policy instance with an enforceStatus parameter only.
+
+ **URL path:**
+ /{policyId}/{enforceStatus}
+
+ **Parameters:**
+
+ None.
+
+ **Responses:**
+
+ 200:
+ Status updated for policy: <policyId>
+
+ **Examples:**
+
+ Call: ::
+
+ curl -X PUT "http://localhost:8085/Policy1/ENFORCED
+
+ Result:
+ 200
+ Status updated for policy: Policy1
+
+/{policyId}/{enforceStatus}/{enforceReason}
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+PUT
+++++
+
+ Send a status to a policy instance with both enforceStatus and enforceReason.
+
+ **URL path:**
+ /{policyId}/{enforceStatus}/{enforceReason}
+
+ **Parameters:**
+
+ None.
+
+ **Responses:**
+
+ 200:
+ Status updated for policy: <policyId>
+
+ **Examples:**
+
+ Call: ::
+
+ curl -X PUT "http://localhost:8085/Policy1/NOT_ENFORCED/100"
+
+ Result:
+ 200
+ Status updated for policy: Policy1