generate_schema_config.py 4.65 KB
Newer Older
1 2
from formats import message_header
from formats.mission_plan import mission_plan_schema
3
from formats.mission_plan_encoded import mission_plan_encoded_schema
4
from formats.observation import observation_schema
5
from formats.observation_encoded import observation_encoded_schema
6
from formats.planning_configuration import planning_configuration_schema
7
from formats.platform_status import platform_status_schema
8
from formats.platform_status_encoded import platform_status_encoded_schema
9 10
from formats.survey import survey_schema
from formats.survey_encoded import survey_encoded_schema
11
from formats.acknowledgement import acknowledgement_schema
12
from formats.alert import alert_schema
13 14 15 16

from flasgger import Swagger
from flask import Flask

17 18
import os

19 20
app = Flask(__name__)

James Kirk's avatar
James Kirk committed
21
url_prefix = os.getenv("URL_PREFIX", "")
22 23 24 25 26

swagger_config = {
    "openapi": "3.0.2",
    "swagger_ui": True,
    "specs_route": "/",
27
    "info": {
28 29
        "title": "SoAR Backbone Message Formats",
        "version": "1.0",
30
        "description": "SoAR message protocol in schemas",
31 32 33 34 35 36 37
    },
    "specs": [
        {
            "endpoint": "swagger",
            "route": "/soar_protocol.json",
        }
    ],
38
    "url_prefix": url_prefix,
39 40 41 42 43
    "paths": {},
    "components": {
        "schemas": {
            "MESSAGE": {
                "type": "object",
Trishna Saeharaseelan's avatar
Trishna Saeharaseelan committed
44 45 46
                "description": "Full message definition with"
                + " message-metadata in `header` and different"
                + " message type schemas under `payload`",
47 48 49 50
                "properties": {
                    "header": {
                        "$ref": "#/components/schemas/header",
                    },
51
                    "payload": {"$ref": "#/components/schemas/payload"},
52 53 54 55 56 57
                },
                "required": ["header", "payload"],
            },
            "payload": {
                "discriminator": {
                    "propertyName": "message_type",
58
                    "mapping": {
59
                        "alert": "#/components/schemas/alert",
60
                        "mission_plan": "#/components/schemas/mission_plan",
61 62
                        "mission_plan_encoded": "#/components/schemas/"
                        + "mission_plan_encoded",
63
                        "observation": "#/components/schemas/observation",
64 65
                        "observation_encoded": "#/components/schemas/"
                        + "observation_encoded",
Trishna Saeharaseelan's avatar
Trishna Saeharaseelan committed
66 67
                        "planning_configuration": "#/components/schemas/"
                        + "planning_configuration",
68
                        "platform_status": "#/components/schemas/platform_status",
69 70
                        "platform_status_encoded": "#/components/schemas/"
                        + "platform_status_encoded",
71
                        "acknowledgement": "#/components/schemas/acknowledgement",
72
                        "survey": "#/components/schemas/survey",
Trishna Saeharaseelan's avatar
Trishna Saeharaseelan committed
73
                        "survey_encoded": "#/components/schemas/" + "survey_encoded",
74 75
                    },
                },
76
                "oneOf": [
77
                    {"$ref": "#/components/schemas/alert"},
Trishna Saeharaseelan's avatar
Trishna Saeharaseelan committed
78 79
                    {"$ref": "#/components/schemas/acknowledgement"},
                    {"$ref": "#/components/schemas/mission_plan"},
80
                    {"$ref": "#/components/schemas/mission_plan_encoded"},
Trishna Saeharaseelan's avatar
Trishna Saeharaseelan committed
81
                    {"$ref": "#/components/schemas/observation"},
82
                    {"$ref": "#/components/schemas/observation_encoded"},
Trishna Saeharaseelan's avatar
Trishna Saeharaseelan committed
83 84
                    {"$ref": "#/components/schemas/planning_configuration"},
                    {"$ref": "#/components/schemas/platform_status"},
85
                    {"$ref": "#/components/schemas/platform_status_encoded"},
86 87
                    {"$ref": "#/components/schemas/survey"},
                    {"$ref": "#/components/schemas/survey_encoded"},
88
                ],
89 90 91
            },
            "header": message_header,
            "mission_plan": mission_plan_schema,
92
            "mission_plan_encoded": mission_plan_encoded_schema,
93
            "observation": observation_schema,
94
            "observation_encoded": observation_encoded_schema,
95
            "planning_configuration": planning_configuration_schema,
96
            "platform_status": platform_status_schema,
97
            "platform_status_encoded": platform_status_encoded_schema,
98 99
            "survey": survey_schema,
            "survey_encoded": survey_encoded_schema,
100
            "acknowledgement": acknowledgement_schema,
101
            "alert": alert_schema,
102 103 104 105 106 107
        }
    },
}

swag = Swagger(app, config=swagger_config, merge=True)

108 109
flask_host = os.getenv(
    "FLASK_HOST", "localhost"
110
)  # Sets to whatever FLASK_HOST is, or defaults to localhost
111 112

if __name__ == "__main__":
113
    app.run(debug=False, host=flask_host)