[SEBA-823] REST APIs initial implementation (legacy+new)

Change-Id: Ia8480b72540ff08d35003534d39aff984e31120c
diff --git a/docs/requirements.txt b/docs/requirements.txt
index 3496da1..2fdbc75 100644
--- a/docs/requirements.txt
+++ b/docs/requirements.txt
@@ -11,4 +11,5 @@
 sphinxcontrib-actdiag~=0.8.5
 sphinxcontrib-blockdiag~=1.5.5
 sphinxcontrib-nwdiag~=0.9.5
-sphinxcontrib-seqdiag~=0.8.5
\ No newline at end of file
+sphinxcontrib-seqdiag~=0.8.5
+sphinxcontrib-openapi~=0.5.0
\ No newline at end of file
diff --git a/docs/source/api.rst b/docs/source/api.rst
new file mode 100644
index 0000000..37c653b
--- /dev/null
+++ b/docs/source/api.rst
@@ -0,0 +1,17 @@
+.. _BBSimAPI:
+
+BBSimAPI
+--------
+
+BBSim exposes gRPC and REST APIs for external control of the simulated OLT. The API is defined using the protocol buffer specification in `api/bbsim/bbsim.proto`. 
+By default, the gRPC server is started on port 50070 and the REST server is started on port 50071. The following endpoints are currently defined:
+
+.. openapi:: ../swagger/bbsim/bbsim.swagger.json
+
+Legacy BBSimAPI
+---------------
+
+Additionally, a legacy API is available, defined in `api/legacy/bbsim.proto`. This API is deprecated and will be removed once BBSim reaches feature parity with the legacz version.
+By default, the legacy gRPC server is started on port 50072 and the corresponding REST server is started on port 50073. The following endpoints are currently defined:
+
+.. openapi:: ../swagger/legacy/bbsim.swagger.json
diff --git a/docs/source/conf.py b/docs/source/conf.py
index 0a9ac82..81910a3 100644
--- a/docs/source/conf.py
+++ b/docs/source/conf.py
@@ -53,6 +53,7 @@
 # extensions coming with Sphinx (named 'sphinx.ext.*') or your custom
 # ones.
 extensions = [
+    'sphinxcontrib.openapi',
     'sphinx.ext.graphviz'
 ]
 
diff --git a/docs/source/index.rst b/docs/source/index.rst
index 184fcfa..9acc4d5 100644
--- a/docs/source/index.rst
+++ b/docs/source/index.rst
@@ -15,6 +15,7 @@
    development-dependencies.rst
    bbr.rst
    bbsimctl.rst
+   api.rst
 
 
 Quickstart
diff --git a/docs/swagger/bbsim/.gitignore b/docs/swagger/bbsim/.gitignore
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/docs/swagger/bbsim/.gitignore
diff --git a/docs/swagger/bbsim/bbsim.swagger.json b/docs/swagger/bbsim/bbsim.swagger.json
new file mode 100644
index 0000000..e124c5c
--- /dev/null
+++ b/docs/swagger/bbsim/bbsim.swagger.json
@@ -0,0 +1,252 @@
+{
+  "swagger": "2.0",
+  "info": {
+    "title": "bbsim/bbsim.proto",
+    "version": "version not set"
+  },
+  "schemes": [
+    "http",
+    "https"
+  ],
+  "consumes": [
+    "application/json"
+  ],
+  "produces": [
+    "application/json"
+  ],
+  "paths": {
+    "/v1/olt": {
+      "get": {
+        "operationId": "GetOlt",
+        "responses": {
+          "200": {
+            "description": "A successful response.",
+            "schema": {
+              "$ref": "#/definitions/bbsimOlt"
+            }
+          }
+        },
+        "tags": [
+          "BBSim"
+        ]
+      }
+    },
+    "/v1/olt/onus": {
+      "get": {
+        "operationId": "GetONUs",
+        "responses": {
+          "200": {
+            "description": "A successful response.",
+            "schema": {
+              "$ref": "#/definitions/bbsimONUs"
+            }
+          }
+        },
+        "tags": [
+          "BBSim"
+        ]
+      }
+    },
+    "/v1/olt/onus/{SerialNumber}": {
+      "get": {
+        "operationId": "GetONU",
+        "responses": {
+          "200": {
+            "description": "A successful response.",
+            "schema": {
+              "$ref": "#/definitions/bbsimONU"
+            }
+          }
+        },
+        "parameters": [
+          {
+            "name": "SerialNumber",
+            "in": "path",
+            "required": true,
+            "type": "string"
+          }
+        ],
+        "tags": [
+          "BBSim"
+        ]
+      }
+    },
+    "/v1/olt/status": {
+      "get": {
+        "operationId": "GetOlt2",
+        "responses": {
+          "200": {
+            "description": "A successful response.",
+            "schema": {
+              "$ref": "#/definitions/bbsimOlt"
+            }
+          }
+        },
+        "tags": [
+          "BBSim"
+        ]
+      }
+    },
+    "/v1/version": {
+      "get": {
+        "operationId": "Version",
+        "responses": {
+          "200": {
+            "description": "A successful response.",
+            "schema": {
+              "$ref": "#/definitions/bbsimVersionNumber"
+            }
+          }
+        },
+        "tags": [
+          "BBSim"
+        ]
+      }
+    }
+  },
+  "definitions": {
+    "bbsimLogLevel": {
+      "type": "object",
+      "properties": {
+        "level": {
+          "type": "string"
+        },
+        "caller": {
+          "type": "boolean",
+          "format": "boolean"
+        }
+      }
+    },
+    "bbsimNNIPort": {
+      "type": "object",
+      "properties": {
+        "ID": {
+          "type": "integer",
+          "format": "int32"
+        },
+        "OperState": {
+          "type": "string"
+        }
+      }
+    },
+    "bbsimONU": {
+      "type": "object",
+      "properties": {
+        "ID": {
+          "type": "integer",
+          "format": "int32"
+        },
+        "SerialNumber": {
+          "type": "string"
+        },
+        "OperState": {
+          "type": "string"
+        },
+        "InternalState": {
+          "type": "string"
+        },
+        "PonPortID": {
+          "type": "integer",
+          "format": "int32"
+        },
+        "STag": {
+          "type": "integer",
+          "format": "int32"
+        },
+        "CTag": {
+          "type": "integer",
+          "format": "int32"
+        },
+        "HwAddress": {
+          "type": "string"
+        },
+        "PortNo": {
+          "type": "integer",
+          "format": "int32"
+        }
+      }
+    },
+    "bbsimONUs": {
+      "type": "object",
+      "properties": {
+        "items": {
+          "type": "array",
+          "items": {
+            "$ref": "#/definitions/bbsimONU"
+          }
+        }
+      }
+    },
+    "bbsimOlt": {
+      "type": "object",
+      "properties": {
+        "ID": {
+          "type": "integer",
+          "format": "int32"
+        },
+        "SerialNumber": {
+          "type": "string"
+        },
+        "OperState": {
+          "type": "string"
+        },
+        "InternalState": {
+          "type": "string"
+        },
+        "NNIPorts": {
+          "type": "array",
+          "items": {
+            "$ref": "#/definitions/bbsimNNIPort"
+          }
+        },
+        "PONPorts": {
+          "type": "array",
+          "items": {
+            "$ref": "#/definitions/bbsimPONPort"
+          }
+        }
+      }
+    },
+    "bbsimPONPort": {
+      "type": "object",
+      "properties": {
+        "ID": {
+          "type": "integer",
+          "format": "int32"
+        },
+        "OperState": {
+          "type": "string"
+        }
+      }
+    },
+    "bbsimResponse": {
+      "type": "object",
+      "properties": {
+        "status_code": {
+          "type": "integer",
+          "format": "int32"
+        },
+        "message": {
+          "type": "string"
+        }
+      }
+    },
+    "bbsimVersionNumber": {
+      "type": "object",
+      "properties": {
+        "version": {
+          "type": "string"
+        },
+        "buildTime": {
+          "type": "string"
+        },
+        "commitHash": {
+          "type": "string"
+        },
+        "gitStatus": {
+          "type": "string"
+        }
+      }
+    }
+  }
+}
diff --git a/docs/swagger/legacy/.gitignore b/docs/swagger/legacy/.gitignore
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/docs/swagger/legacy/.gitignore
diff --git a/docs/swagger/legacy/bbsim.swagger.json b/docs/swagger/legacy/bbsim.swagger.json
new file mode 100644
index 0000000..2873efd
--- /dev/null
+++ b/docs/swagger/legacy/bbsim.swagger.json
@@ -0,0 +1,1648 @@
+{
+  "swagger": "2.0",
+  "info": {
+    "title": "BBSim API",
+    "version": "1.0",
+    "contact": {
+      "url": "http://opencord.org"
+    }
+  },
+  "schemes": [
+    "http"
+  ],
+  "consumes": [
+    "application/json"
+  ],
+  "produces": [
+    "application/json"
+  ],
+  "paths": {
+    "/v0/olt": {
+      "get": {
+        "summary": "Get current status of OLT",
+        "operationId": "OLTStatus",
+        "responses": {
+          "200": {
+            "description": "A successful response.",
+            "schema": {
+              "$ref": "#/definitions/legacyOLTStatusResponse"
+            }
+          },
+          "404": {
+            "description": "Returned when the resource does not exist.",
+            "schema": {
+              "type": "string",
+              "format": "string"
+            }
+          }
+        },
+        "tags": [
+          "BBSimService"
+        ]
+      }
+    },
+    "/v0/olt/flows": {
+      "get": {
+        "summary": "Get flows",
+        "operationId": "GetFlows",
+        "responses": {
+          "200": {
+            "description": "A successful response.",
+            "schema": {
+              "$ref": "#/definitions/legacyFlows"
+            }
+          },
+          "404": {
+            "description": "Returned when the resource does not exist.",
+            "schema": {
+              "type": "string",
+              "format": "string"
+            }
+          }
+        },
+        "parameters": [
+          {
+            "name": "onu_id",
+            "in": "query",
+            "required": false,
+            "type": "integer",
+            "format": "int64"
+          },
+          {
+            "name": "pon_port_id",
+            "in": "query",
+            "required": false,
+            "type": "integer",
+            "format": "int64"
+          },
+          {
+            "name": "onu_serial",
+            "description": "ONU serial number.",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "oper_state",
+            "description": "ONU oper state.",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "onu_state",
+            "description": "ONU internal state.",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "gemports",
+            "in": "query",
+            "required": false,
+            "type": "array",
+            "items": {
+              "type": "integer",
+              "format": "int64"
+            },
+            "collectionFormat": "multi"
+          },
+          {
+            "name": "tconts.uni_id",
+            "in": "query",
+            "required": false,
+            "type": "integer",
+            "format": "int64"
+          },
+          {
+            "name": "tconts.port_no",
+            "in": "query",
+            "required": false,
+            "type": "integer",
+            "format": "int64"
+          }
+        ],
+        "tags": [
+          "BBSimService"
+        ]
+      }
+    },
+    "/v0/olt/onu/{onu_serial}/flows": {
+      "get": {
+        "summary": "Get flows",
+        "operationId": "GetFlows2",
+        "responses": {
+          "200": {
+            "description": "A successful response.",
+            "schema": {
+              "$ref": "#/definitions/legacyFlows"
+            }
+          },
+          "404": {
+            "description": "Returned when the resource does not exist.",
+            "schema": {
+              "type": "string",
+              "format": "string"
+            }
+          }
+        },
+        "parameters": [
+          {
+            "name": "onu_serial",
+            "description": "ONU serial number",
+            "in": "path",
+            "required": true,
+            "type": "string"
+          },
+          {
+            "name": "onu_id",
+            "in": "query",
+            "required": false,
+            "type": "integer",
+            "format": "int64"
+          },
+          {
+            "name": "pon_port_id",
+            "in": "query",
+            "required": false,
+            "type": "integer",
+            "format": "int64"
+          },
+          {
+            "name": "oper_state",
+            "description": "ONU oper state.",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "onu_state",
+            "description": "ONU internal state.",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "gemports",
+            "in": "query",
+            "required": false,
+            "type": "array",
+            "items": {
+              "type": "integer",
+              "format": "int64"
+            },
+            "collectionFormat": "multi"
+          },
+          {
+            "name": "tconts.uni_id",
+            "in": "query",
+            "required": false,
+            "type": "integer",
+            "format": "int64"
+          },
+          {
+            "name": "tconts.port_no",
+            "in": "query",
+            "required": false,
+            "type": "integer",
+            "format": "int64"
+          }
+        ],
+        "tags": [
+          "BBSimService"
+        ]
+      }
+    },
+    "/v0/olt/onus": {
+      "get": {
+        "summary": "Get status of all or specific ONUs",
+        "operationId": "ONUStatus",
+        "responses": {
+          "200": {
+            "description": "A successful response.",
+            "schema": {
+              "$ref": "#/definitions/legacyONUs"
+            }
+          },
+          "404": {
+            "description": "Returned when the resource does not exist.",
+            "schema": {
+              "type": "string",
+              "format": "string"
+            }
+          }
+        },
+        "parameters": [
+          {
+            "name": "onu.onu_id",
+            "in": "query",
+            "required": false,
+            "type": "integer",
+            "format": "int64"
+          },
+          {
+            "name": "onu.pon_port_id",
+            "in": "query",
+            "required": false,
+            "type": "integer",
+            "format": "int64"
+          },
+          {
+            "name": "onu.onu_serial",
+            "description": "ONU serial number.",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "onu.oper_state",
+            "description": "ONU oper state.",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "onu.onu_state",
+            "description": "ONU internal state.",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "onu.gemports",
+            "in": "query",
+            "required": false,
+            "type": "array",
+            "items": {
+              "type": "integer",
+              "format": "int64"
+            },
+            "collectionFormat": "multi"
+          },
+          {
+            "name": "onu.tconts.uni_id",
+            "in": "query",
+            "required": false,
+            "type": "integer",
+            "format": "int64"
+          },
+          {
+            "name": "onu.tconts.port_no",
+            "in": "query",
+            "required": false,
+            "type": "integer",
+            "format": "int64"
+          }
+        ],
+        "tags": [
+          "BBSimService"
+        ]
+      },
+      "delete": {
+        "summary": "Deactivate ONU(s) for specific PON port(s) specified by\na given onu_serial, onu_id, or pon_port_id",
+        "operationId": "ONUDeactivate",
+        "responses": {
+          "200": {
+            "description": "A successful response.",
+            "schema": {
+              "$ref": "#/definitions/legacyBBSimResponse"
+            }
+          },
+          "404": {
+            "description": "Returned when the resource does not exist.",
+            "schema": {
+              "type": "string",
+              "format": "string"
+            }
+          }
+        },
+        "parameters": [
+          {
+            "name": "body",
+            "in": "body",
+            "required": true,
+            "schema": {
+              "$ref": "#/definitions/legacyONUs"
+            }
+          }
+        ],
+        "tags": [
+          "BBSimService"
+        ]
+      },
+      "post": {
+        "summary": "Single/bulk activate ONU(s) for specific PON port(s)",
+        "operationId": "ONUActivate",
+        "responses": {
+          "200": {
+            "description": "A successful response.",
+            "schema": {
+              "$ref": "#/definitions/legacyBBSimResponse"
+            }
+          },
+          "404": {
+            "description": "Returned when the resource does not exist.",
+            "schema": {
+              "type": "string",
+              "format": "string"
+            }
+          }
+        },
+        "parameters": [
+          {
+            "name": "body",
+            "in": "body",
+            "required": true,
+            "schema": {
+              "$ref": "#/definitions/legacyONUs"
+            }
+          }
+        ],
+        "tags": [
+          "BBSimService"
+        ]
+      }
+    },
+    "/v0/olt/onus/{onu.onu_serial}": {
+      "get": {
+        "summary": "Get status of all or specific ONUs",
+        "operationId": "ONUStatus2",
+        "responses": {
+          "200": {
+            "description": "A successful response.",
+            "schema": {
+              "$ref": "#/definitions/legacyONUs"
+            }
+          },
+          "404": {
+            "description": "Returned when the resource does not exist.",
+            "schema": {
+              "type": "string",
+              "format": "string"
+            }
+          }
+        },
+        "parameters": [
+          {
+            "name": "onu.onu_serial",
+            "description": "ONU serial number",
+            "in": "path",
+            "required": true,
+            "type": "string"
+          },
+          {
+            "name": "onu.onu_id",
+            "in": "query",
+            "required": false,
+            "type": "integer",
+            "format": "int64"
+          },
+          {
+            "name": "onu.pon_port_id",
+            "in": "query",
+            "required": false,
+            "type": "integer",
+            "format": "int64"
+          },
+          {
+            "name": "onu.oper_state",
+            "description": "ONU oper state.",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "onu.onu_state",
+            "description": "ONU internal state.",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "onu.gemports",
+            "in": "query",
+            "required": false,
+            "type": "array",
+            "items": {
+              "type": "integer",
+              "format": "int64"
+            },
+            "collectionFormat": "multi"
+          },
+          {
+            "name": "onu.tconts.uni_id",
+            "in": "query",
+            "required": false,
+            "type": "integer",
+            "format": "int64"
+          },
+          {
+            "name": "onu.tconts.port_no",
+            "in": "query",
+            "required": false,
+            "type": "integer",
+            "format": "int64"
+          }
+        ],
+        "tags": [
+          "BBSimService"
+        ]
+      },
+      "delete": {
+        "summary": "Deactivate ONU(s) for specific PON port(s) specified by\na given onu_serial, onu_id, or pon_port_id",
+        "operationId": "ONUDeactivate2",
+        "responses": {
+          "200": {
+            "description": "A successful response.",
+            "schema": {
+              "$ref": "#/definitions/legacyBBSimResponse"
+            }
+          },
+          "404": {
+            "description": "Returned when the resource does not exist.",
+            "schema": {
+              "type": "string",
+              "format": "string"
+            }
+          }
+        },
+        "parameters": [
+          {
+            "name": "onu.onu_serial",
+            "description": "ONU serial number",
+            "in": "path",
+            "required": true,
+            "type": "string"
+          },
+          {
+            "name": "onu.onu_id",
+            "in": "query",
+            "required": false,
+            "type": "integer",
+            "format": "int64"
+          },
+          {
+            "name": "onu.pon_port_id",
+            "in": "query",
+            "required": false,
+            "type": "integer",
+            "format": "int64"
+          },
+          {
+            "name": "onu.oper_state",
+            "description": "ONU oper state.",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "onu.onu_state",
+            "description": "ONU internal state.",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "onu.gemports",
+            "in": "query",
+            "required": false,
+            "type": "array",
+            "items": {
+              "type": "integer",
+              "format": "int64"
+            },
+            "collectionFormat": "multi"
+          },
+          {
+            "name": "onu.tconts.uni_id",
+            "in": "query",
+            "required": false,
+            "type": "integer",
+            "format": "int64"
+          },
+          {
+            "name": "onu.tconts.port_no",
+            "in": "query",
+            "required": false,
+            "type": "integer",
+            "format": "int64"
+          }
+        ],
+        "tags": [
+          "BBSimService"
+        ]
+      }
+    },
+    "/v0/olt/onus/{onu_serial}/alarms/{alarm_type}/{status}": {
+      "post": {
+        "summary": "Generate ONU related alarms",
+        "operationId": "GenerateONUAlarm",
+        "responses": {
+          "200": {
+            "description": "A successful response.",
+            "schema": {
+              "$ref": "#/definitions/legacyBBSimResponse"
+            }
+          },
+          "404": {
+            "description": "Returned when the resource does not exist.",
+            "schema": {
+              "type": "string",
+              "format": "string"
+            }
+          }
+        },
+        "parameters": [
+          {
+            "name": "onu_serial",
+            "description": "ONU serial number",
+            "in": "path",
+            "required": true,
+            "type": "string"
+          },
+          {
+            "name": "alarm_type",
+            "description": "Alarm types are:\n  \"signaldegrade\"\n  \"lossofomcichannel\"\n  \"lossofploam\"",
+            "in": "path",
+            "required": true,
+            "type": "string"
+          },
+          {
+            "name": "status",
+            "description": "\"on\"/\"off\" indicates raised or cleared alarm",
+            "in": "path",
+            "required": true,
+            "type": "string"
+          }
+        ],
+        "tags": [
+          "BBSimService"
+        ]
+      }
+    },
+    "/v0/olt/ports/{onu.pon_port_id}/onus": {
+      "get": {
+        "summary": "Get status of all or specific ONUs",
+        "operationId": "ONUStatus4",
+        "responses": {
+          "200": {
+            "description": "A successful response.",
+            "schema": {
+              "$ref": "#/definitions/legacyONUs"
+            }
+          },
+          "404": {
+            "description": "Returned when the resource does not exist.",
+            "schema": {
+              "type": "string",
+              "format": "string"
+            }
+          }
+        },
+        "parameters": [
+          {
+            "name": "onu.pon_port_id",
+            "in": "path",
+            "required": true,
+            "type": "integer",
+            "format": "int64"
+          },
+          {
+            "name": "onu.onu_id",
+            "in": "query",
+            "required": false,
+            "type": "integer",
+            "format": "int64"
+          },
+          {
+            "name": "onu.onu_serial",
+            "description": "ONU serial number.",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "onu.oper_state",
+            "description": "ONU oper state.",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "onu.onu_state",
+            "description": "ONU internal state.",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "onu.gemports",
+            "in": "query",
+            "required": false,
+            "type": "array",
+            "items": {
+              "type": "integer",
+              "format": "int64"
+            },
+            "collectionFormat": "multi"
+          },
+          {
+            "name": "onu.tconts.uni_id",
+            "in": "query",
+            "required": false,
+            "type": "integer",
+            "format": "int64"
+          },
+          {
+            "name": "onu.tconts.port_no",
+            "in": "query",
+            "required": false,
+            "type": "integer",
+            "format": "int64"
+          }
+        ],
+        "tags": [
+          "BBSimService"
+        ]
+      },
+      "delete": {
+        "summary": "Deactivate ONU(s) for specific PON port(s) specified by\na given onu_serial, onu_id, or pon_port_id",
+        "operationId": "ONUDeactivate3",
+        "responses": {
+          "200": {
+            "description": "A successful response.",
+            "schema": {
+              "$ref": "#/definitions/legacyBBSimResponse"
+            }
+          },
+          "404": {
+            "description": "Returned when the resource does not exist.",
+            "schema": {
+              "type": "string",
+              "format": "string"
+            }
+          }
+        },
+        "parameters": [
+          {
+            "name": "onu.pon_port_id",
+            "in": "path",
+            "required": true,
+            "type": "integer",
+            "format": "int64"
+          },
+          {
+            "name": "onu.onu_id",
+            "in": "query",
+            "required": false,
+            "type": "integer",
+            "format": "int64"
+          },
+          {
+            "name": "onu.onu_serial",
+            "description": "ONU serial number.",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "onu.oper_state",
+            "description": "ONU oper state.",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "onu.onu_state",
+            "description": "ONU internal state.",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "onu.gemports",
+            "in": "query",
+            "required": false,
+            "type": "array",
+            "items": {
+              "type": "integer",
+              "format": "int64"
+            },
+            "collectionFormat": "multi"
+          },
+          {
+            "name": "onu.tconts.uni_id",
+            "in": "query",
+            "required": false,
+            "type": "integer",
+            "format": "int64"
+          },
+          {
+            "name": "onu.tconts.port_no",
+            "in": "query",
+            "required": false,
+            "type": "integer",
+            "format": "int64"
+          }
+        ],
+        "tags": [
+          "BBSimService"
+        ]
+      },
+      "post": {
+        "summary": "Single/bulk activate ONU(s) for specific PON port(s)",
+        "operationId": "ONUActivate2",
+        "responses": {
+          "200": {
+            "description": "A successful response.",
+            "schema": {
+              "$ref": "#/definitions/legacyBBSimResponse"
+            }
+          },
+          "404": {
+            "description": "Returned when the resource does not exist.",
+            "schema": {
+              "type": "string",
+              "format": "string"
+            }
+          }
+        },
+        "parameters": [
+          {
+            "name": "onu.pon_port_id",
+            "in": "path",
+            "required": true,
+            "type": "integer",
+            "format": "int64"
+          }
+        ],
+        "tags": [
+          "BBSimService"
+        ]
+      }
+    },
+    "/v0/olt/ports/{onu.pon_port_id}/onus/{onu.onu_id}": {
+      "get": {
+        "summary": "Get status of all or specific ONUs",
+        "operationId": "ONUStatus3",
+        "responses": {
+          "200": {
+            "description": "A successful response.",
+            "schema": {
+              "$ref": "#/definitions/legacyONUs"
+            }
+          },
+          "404": {
+            "description": "Returned when the resource does not exist.",
+            "schema": {
+              "type": "string",
+              "format": "string"
+            }
+          }
+        },
+        "parameters": [
+          {
+            "name": "onu.pon_port_id",
+            "in": "path",
+            "required": true,
+            "type": "integer",
+            "format": "int64"
+          },
+          {
+            "name": "onu.onu_id",
+            "in": "path",
+            "required": true,
+            "type": "integer",
+            "format": "int64"
+          },
+          {
+            "name": "onu.onu_serial",
+            "description": "ONU serial number.",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "onu.oper_state",
+            "description": "ONU oper state.",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "onu.onu_state",
+            "description": "ONU internal state.",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "onu.gemports",
+            "in": "query",
+            "required": false,
+            "type": "array",
+            "items": {
+              "type": "integer",
+              "format": "int64"
+            },
+            "collectionFormat": "multi"
+          },
+          {
+            "name": "onu.tconts.uni_id",
+            "in": "query",
+            "required": false,
+            "type": "integer",
+            "format": "int64"
+          },
+          {
+            "name": "onu.tconts.port_no",
+            "in": "query",
+            "required": false,
+            "type": "integer",
+            "format": "int64"
+          }
+        ],
+        "tags": [
+          "BBSimService"
+        ]
+      },
+      "delete": {
+        "summary": "Deactivate ONU(s) for specific PON port(s) specified by\na given onu_serial, onu_id, or pon_port_id",
+        "operationId": "ONUDeactivate4",
+        "responses": {
+          "200": {
+            "description": "A successful response.",
+            "schema": {
+              "$ref": "#/definitions/legacyBBSimResponse"
+            }
+          },
+          "404": {
+            "description": "Returned when the resource does not exist.",
+            "schema": {
+              "type": "string",
+              "format": "string"
+            }
+          }
+        },
+        "parameters": [
+          {
+            "name": "onu.pon_port_id",
+            "in": "path",
+            "required": true,
+            "type": "integer",
+            "format": "int64"
+          },
+          {
+            "name": "onu.onu_id",
+            "in": "path",
+            "required": true,
+            "type": "integer",
+            "format": "int64"
+          },
+          {
+            "name": "onu.onu_serial",
+            "description": "ONU serial number.",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "onu.oper_state",
+            "description": "ONU oper state.",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "onu.onu_state",
+            "description": "ONU internal state.",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "onu.gemports",
+            "in": "query",
+            "required": false,
+            "type": "array",
+            "items": {
+              "type": "integer",
+              "format": "int64"
+            },
+            "collectionFormat": "multi"
+          },
+          {
+            "name": "onu.tconts.uni_id",
+            "in": "query",
+            "required": false,
+            "type": "integer",
+            "format": "int64"
+          },
+          {
+            "name": "onu.tconts.port_no",
+            "in": "query",
+            "required": false,
+            "type": "integer",
+            "format": "int64"
+          }
+        ],
+        "tags": [
+          "BBSimService"
+        ]
+      }
+    },
+    "/v0/olt/ports/{onu.pon_port_id}/onus/{onu.onu_serial}": {
+      "post": {
+        "summary": "Single/bulk activate ONU(s) for specific PON port(s)",
+        "operationId": "ONUActivate3",
+        "responses": {
+          "200": {
+            "description": "A successful response.",
+            "schema": {
+              "$ref": "#/definitions/legacyBBSimResponse"
+            }
+          },
+          "404": {
+            "description": "Returned when the resource does not exist.",
+            "schema": {
+              "type": "string",
+              "format": "string"
+            }
+          }
+        },
+        "parameters": [
+          {
+            "name": "onu.pon_port_id",
+            "in": "path",
+            "required": true,
+            "type": "integer",
+            "format": "int64"
+          },
+          {
+            "name": "onu.onu_serial",
+            "description": "ONU serial number",
+            "in": "path",
+            "required": true,
+            "type": "string"
+          }
+        ],
+        "tags": [
+          "BBSimService"
+        ]
+      }
+    },
+    "/v0/olt/ports/{port_type}/{port_id}/alarms/los/{status}": {
+      "post": {
+        "summary": "Generate OLT related alarms",
+        "operationId": "GenerateOLTAlarm",
+        "responses": {
+          "200": {
+            "description": "A successful response.",
+            "schema": {
+              "$ref": "#/definitions/legacyBBSimResponse"
+            }
+          },
+          "404": {
+            "description": "Returned when the resource does not exist.",
+            "schema": {
+              "type": "string",
+              "format": "string"
+            }
+          }
+        },
+        "parameters": [
+          {
+            "name": "port_type",
+            "in": "path",
+            "required": true,
+            "type": "string"
+          },
+          {
+            "name": "port_id",
+            "in": "path",
+            "required": true,
+            "type": "integer",
+            "format": "int64"
+          },
+          {
+            "name": "status",
+            "in": "path",
+            "required": true,
+            "type": "string"
+          }
+        ],
+        "tags": [
+          "BBSimService"
+        ]
+      }
+    },
+    "/v0/olt/ports/{port_type}/{port_id}/status": {
+      "get": {
+        "summary": "Get status of a PON/NNI port",
+        "operationId": "PortStatus",
+        "responses": {
+          "200": {
+            "description": "A successful response.",
+            "schema": {
+              "$ref": "#/definitions/legacyPorts"
+            }
+          },
+          "404": {
+            "description": "Returned when the resource does not exist.",
+            "schema": {
+              "type": "string",
+              "format": "string"
+            }
+          }
+        },
+        "parameters": [
+          {
+            "name": "port_type",
+            "in": "path",
+            "required": true,
+            "type": "string"
+          },
+          {
+            "name": "port_id",
+            "in": "path",
+            "required": true,
+            "type": "integer",
+            "format": "int64"
+          },
+          {
+            "name": "pon_port_max_onus",
+            "in": "query",
+            "required": false,
+            "type": "integer",
+            "format": "int64"
+          },
+          {
+            "name": "pon_port_active_onus",
+            "in": "query",
+            "required": false,
+            "type": "integer",
+            "format": "int64"
+          },
+          {
+            "name": "port_state",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          },
+          {
+            "name": "alarm_state",
+            "in": "query",
+            "required": false,
+            "type": "string"
+          }
+        ],
+        "tags": [
+          "BBSimService"
+        ]
+      }
+    },
+    "/v0/olt/status": {
+      "get": {
+        "summary": "Get current status of OLT",
+        "operationId": "OLTStatus2",
+        "responses": {
+          "200": {
+            "description": "A successful response.",
+            "schema": {
+              "$ref": "#/definitions/legacyOLTStatusResponse"
+            }
+          },
+          "404": {
+            "description": "Returned when the resource does not exist.",
+            "schema": {
+              "type": "string",
+              "format": "string"
+            }
+          }
+        },
+        "tags": [
+          "BBSimService"
+        ]
+      }
+    },
+    "/v0/olt/{device_type}/{serial_number}/action/{action}": {
+      "patch": {
+        "summary": "Perform actions on OLT/ONU devices (e.g. reboot)",
+        "operationId": "PerformDeviceAction2",
+        "responses": {
+          "200": {
+            "description": "A successful response.",
+            "schema": {
+              "$ref": "#/definitions/legacyBBSimResponse"
+            }
+          },
+          "404": {
+            "description": "Returned when the resource does not exist.",
+            "schema": {
+              "type": "string",
+              "format": "string"
+            }
+          }
+        },
+        "parameters": [
+          {
+            "name": "device_type",
+            "in": "path",
+            "required": true,
+            "type": "string"
+          },
+          {
+            "name": "serial_number",
+            "in": "path",
+            "required": true,
+            "type": "string"
+          },
+          {
+            "name": "action",
+            "in": "path",
+            "required": true,
+            "type": "string"
+          }
+        ],
+        "tags": [
+          "BBSimService"
+        ]
+      }
+    },
+    "/v0/{device_type}/action/{action}": {
+      "patch": {
+        "summary": "Perform actions on OLT/ONU devices (e.g. reboot)",
+        "operationId": "PerformDeviceAction",
+        "responses": {
+          "200": {
+            "description": "A successful response.",
+            "schema": {
+              "$ref": "#/definitions/legacyBBSimResponse"
+            }
+          },
+          "404": {
+            "description": "Returned when the resource does not exist.",
+            "schema": {
+              "type": "string",
+              "format": "string"
+            }
+          }
+        },
+        "parameters": [
+          {
+            "name": "device_type",
+            "in": "path",
+            "required": true,
+            "type": "string"
+          },
+          {
+            "name": "action",
+            "in": "path",
+            "required": true,
+            "type": "string"
+          }
+        ],
+        "tags": [
+          "BBSimService"
+        ]
+      }
+    }
+  },
+  "definitions": {
+    "legacyBBSimResponse": {
+      "type": "object",
+      "properties": {
+        "status_msg": {
+          "type": "string"
+        }
+      },
+      "title": "BBSim response message"
+    },
+    "legacyFlows": {
+      "type": "object",
+      "properties": {
+        "flows": {
+          "type": "array",
+          "items": {
+            "$ref": "#/definitions/openoltFlow"
+          }
+        }
+      }
+    },
+    "legacyOLTInfo": {
+      "type": "object",
+      "properties": {
+        "olt_id": {
+          "type": "string",
+          "format": "int64"
+        },
+        "olt_serial": {
+          "type": "string"
+        },
+        "olt_ip": {
+          "type": "string"
+        },
+        "olt_state": {
+          "type": "string"
+        },
+        "olt_vendor": {
+          "type": "string"
+        }
+      },
+      "title": "OLT information"
+    },
+    "legacyOLTStatusResponse": {
+      "type": "object",
+      "properties": {
+        "olt": {
+          "$ref": "#/definitions/legacyOLTInfo"
+        },
+        "ports": {
+          "type": "array",
+          "items": {
+            "$ref": "#/definitions/legacyPortInfo"
+          }
+        }
+      },
+      "title": "BBSim status"
+    },
+    "legacyONUInfo": {
+      "type": "object",
+      "properties": {
+        "onu_id": {
+          "type": "integer",
+          "format": "int64"
+        },
+        "pon_port_id": {
+          "type": "integer",
+          "format": "int64"
+        },
+        "onu_serial": {
+          "type": "string",
+          "title": "ONU serial number"
+        },
+        "oper_state": {
+          "type": "string",
+          "title": "ONU oper state"
+        },
+        "onu_state": {
+          "type": "string",
+          "title": "ONU internal state"
+        },
+        "gemports": {
+          "type": "array",
+          "items": {
+            "type": "integer",
+            "format": "int64"
+          }
+        },
+        "tconts": {
+          "$ref": "#/definitions/legacyTconts"
+        }
+      },
+      "title": "ONU information"
+    },
+    "legacyONUs": {
+      "type": "object",
+      "properties": {
+        "onus": {
+          "type": "array",
+          "items": {
+            "$ref": "#/definitions/legacyONUInfo"
+          }
+        }
+      },
+      "title": "Bulk ONU operations"
+    },
+    "legacyPortInfo": {
+      "type": "object",
+      "properties": {
+        "port_type": {
+          "type": "string"
+        },
+        "port_id": {
+          "type": "integer",
+          "format": "int64"
+        },
+        "pon_port_max_onus": {
+          "type": "integer",
+          "format": "int64"
+        },
+        "pon_port_active_onus": {
+          "type": "integer",
+          "format": "int64"
+        },
+        "port_state": {
+          "type": "string"
+        },
+        "alarm_state": {
+          "type": "string"
+        }
+      },
+      "title": "Port information"
+    },
+    "legacyPorts": {
+      "type": "object",
+      "properties": {
+        "ports": {
+          "type": "array",
+          "items": {
+            "$ref": "#/definitions/legacyPortInfo"
+          }
+        }
+      },
+      "title": "Bulk port information"
+    },
+    "legacyTconts": {
+      "type": "object",
+      "properties": {
+        "uni_id": {
+          "type": "integer",
+          "format": "int64"
+        },
+        "port_no": {
+          "type": "integer",
+          "format": "int64"
+        },
+        "tconts": {
+          "type": "array",
+          "items": {
+            "$ref": "#/definitions/tech_profileTrafficScheduler"
+          }
+        }
+      }
+    },
+    "openoltAction": {
+      "type": "object",
+      "properties": {
+        "cmd": {
+          "$ref": "#/definitions/openoltActionCmd"
+        },
+        "o_vid": {
+          "type": "integer",
+          "format": "int64"
+        },
+        "o_pbits": {
+          "type": "integer",
+          "format": "int64"
+        },
+        "o_tpid": {
+          "type": "integer",
+          "format": "int64"
+        },
+        "i_vid": {
+          "type": "integer",
+          "format": "int64"
+        },
+        "i_pbits": {
+          "type": "integer",
+          "format": "int64"
+        },
+        "i_tpid": {
+          "type": "integer",
+          "format": "int64"
+        }
+      }
+    },
+    "openoltActionCmd": {
+      "type": "object",
+      "properties": {
+        "add_outer_tag": {
+          "type": "boolean",
+          "format": "boolean"
+        },
+        "remove_outer_tag": {
+          "type": "boolean",
+          "format": "boolean"
+        },
+        "trap_to_host": {
+          "type": "boolean",
+          "format": "boolean"
+        }
+      }
+    },
+    "openoltClassifier": {
+      "type": "object",
+      "properties": {
+        "o_tpid": {
+          "type": "integer",
+          "format": "int64"
+        },
+        "o_vid": {
+          "type": "integer",
+          "format": "int64"
+        },
+        "i_tpid": {
+          "type": "integer",
+          "format": "int64"
+        },
+        "i_vid": {
+          "type": "integer",
+          "format": "int64"
+        },
+        "o_pbits": {
+          "type": "integer",
+          "format": "int64"
+        },
+        "i_pbits": {
+          "type": "integer",
+          "format": "int64"
+        },
+        "eth_type": {
+          "type": "integer",
+          "format": "int64"
+        },
+        "dst_mac": {
+          "type": "string",
+          "format": "byte"
+        },
+        "src_mac": {
+          "type": "string",
+          "format": "byte"
+        },
+        "ip_proto": {
+          "type": "integer",
+          "format": "int64"
+        },
+        "dst_ip": {
+          "type": "integer",
+          "format": "int64"
+        },
+        "src_ip": {
+          "type": "integer",
+          "format": "int64"
+        },
+        "src_port": {
+          "type": "integer",
+          "format": "int64"
+        },
+        "dst_port": {
+          "type": "integer",
+          "format": "int64"
+        },
+        "pkt_tag_type": {
+          "type": "string"
+        }
+      }
+    },
+    "openoltFlow": {
+      "type": "object",
+      "properties": {
+        "access_intf_id": {
+          "type": "integer",
+          "format": "int32"
+        },
+        "onu_id": {
+          "type": "integer",
+          "format": "int32"
+        },
+        "uni_id": {
+          "type": "integer",
+          "format": "int32"
+        },
+        "flow_id": {
+          "type": "integer",
+          "format": "int64"
+        },
+        "flow_type": {
+          "type": "string"
+        },
+        "alloc_id": {
+          "type": "integer",
+          "format": "int32"
+        },
+        "network_intf_id": {
+          "type": "integer",
+          "format": "int32"
+        },
+        "gemport_id": {
+          "type": "integer",
+          "format": "int32"
+        },
+        "classifier": {
+          "$ref": "#/definitions/openoltClassifier"
+        },
+        "action": {
+          "$ref": "#/definitions/openoltAction"
+        },
+        "priority": {
+          "type": "integer",
+          "format": "int32"
+        },
+        "cookie": {
+          "type": "string",
+          "format": "uint64"
+        },
+        "port_no": {
+          "type": "integer",
+          "format": "int64"
+        }
+      }
+    },
+    "tech_profileAdditionalBW": {
+      "type": "string",
+      "enum": [
+        "AdditionalBW_None",
+        "AdditionalBW_NA",
+        "AdditionalBW_BestEffort",
+        "AdditionalBW_Auto"
+      ],
+      "default": "AdditionalBW_None"
+    },
+    "tech_profileDirection": {
+      "type": "string",
+      "enum": [
+        "UPSTREAM",
+        "DOWNSTREAM",
+        "BIDIRECTIONAL"
+      ],
+      "default": "UPSTREAM"
+    },
+    "tech_profileInferredAdditionBWIndication": {
+      "type": "string",
+      "enum": [
+        "InferredAdditionBWIndication_None",
+        "InferredAdditionBWIndication_Assured",
+        "InferredAdditionBWIndication_BestEffort"
+      ],
+      "default": "InferredAdditionBWIndication_None"
+    },
+    "tech_profileSchedulerConfig": {
+      "type": "object",
+      "properties": {
+        "direction": {
+          "$ref": "#/definitions/tech_profileDirection"
+        },
+        "additional_bw": {
+          "$ref": "#/definitions/tech_profileAdditionalBW"
+        },
+        "priority": {
+          "type": "integer",
+          "format": "int64"
+        },
+        "weight": {
+          "type": "integer",
+          "format": "int64"
+        },
+        "sched_policy": {
+          "$ref": "#/definitions/tech_profileSchedulingPolicy"
+        }
+      }
+    },
+    "tech_profileSchedulingPolicy": {
+      "type": "string",
+      "enum": [
+        "WRR",
+        "StrictPriority",
+        "Hybrid"
+      ],
+      "default": "WRR"
+    },
+    "tech_profileTrafficScheduler": {
+      "type": "object",
+      "properties": {
+        "direction": {
+          "$ref": "#/definitions/tech_profileDirection"
+        },
+        "alloc_id": {
+          "type": "integer",
+          "format": "int64"
+        },
+        "scheduler": {
+          "$ref": "#/definitions/tech_profileSchedulerConfig"
+        },
+        "traffic_shaping_info": {
+          "$ref": "#/definitions/tech_profileTrafficShapingInfo"
+        }
+      }
+    },
+    "tech_profileTrafficShapingInfo": {
+      "type": "object",
+      "properties": {
+        "cir": {
+          "type": "integer",
+          "format": "int64"
+        },
+        "cbs": {
+          "type": "integer",
+          "format": "int64"
+        },
+        "pir": {
+          "type": "integer",
+          "format": "int64"
+        },
+        "pbs": {
+          "type": "integer",
+          "format": "int64"
+        },
+        "gir": {
+          "type": "integer",
+          "format": "int64"
+        },
+        "add_bw_ind": {
+          "$ref": "#/definitions/tech_profileInferredAdditionBWIndication"
+        }
+      }
+    }
+  }
+}