Alex Perry | cb7da4b | 2019-08-28 19:35:56 -0700 | [diff] [blame] | 1 | include "reflection/reflection.fbs"; |
| 2 | |
Austin Schuh | cb10841 | 2019-10-13 16:09:54 -0700 | [diff] [blame] | 3 | namespace aos; |
| 4 | |
Austin Schuh | 719946b | 2019-12-28 14:51:01 -0800 | [diff] [blame] | 5 | enum LoggerConfig : ubyte { |
| 6 | // This data should be logged on this node. |
| 7 | LOCAL_LOGGER, |
| 8 | // This data should be logged on a remote node. |
| 9 | REMOTE_LOGGER, |
| 10 | // This data should not be logged. |
| 11 | NOT_LOGGED, |
| 12 | // This data should be logged both on this node and on the remote node. |
| 13 | // This is useful where you want to log a message on both the sender and |
| 14 | // receiver to create self-contained log files. |
| 15 | LOCAL_AND_REMOTE_LOGGER |
| 16 | } |
| 17 | |
| 18 | table Connection { |
| 19 | // Node name to forward to. |
Austin Schuh | 38912b1 | 2020-10-03 18:23:31 -0700 | [diff] [blame] | 20 | name:string (id: 0); |
Austin Schuh | 719946b | 2019-12-28 14:51:01 -0800 | [diff] [blame] | 21 | |
| 22 | // How the delivery timestamps for this connection should be logged. Do we |
| 23 | // log them with the local logger (i.e. the logger running on the node that |
| 24 | // this message is delivered to)? Do we log them on another node (a central |
| 25 | // logging node)? Do we log them in both places redundantly? |
Austin Schuh | 38912b1 | 2020-10-03 18:23:31 -0700 | [diff] [blame] | 26 | timestamp_logger:LoggerConfig = LOCAL_LOGGER (id: 1); |
Austin Schuh | 719946b | 2019-12-28 14:51:01 -0800 | [diff] [blame] | 27 | |
| 28 | // If the corresponding delivery timestamps for this channel are logged |
| 29 | // remotely, which node should be responsible for logging the data. Note: |
| 30 | // for now, this can only be the source node. Empty implies the node this |
| 31 | // connection is connecting to (i.e. name). |
Austin Schuh | 38912b1 | 2020-10-03 18:23:31 -0700 | [diff] [blame] | 32 | timestamp_logger_nodes:[string] (id: 2); |
Austin Schuh | 719946b | 2019-12-28 14:51:01 -0800 | [diff] [blame] | 33 | |
| 34 | // Priority to forward data with. |
Austin Schuh | 38912b1 | 2020-10-03 18:23:31 -0700 | [diff] [blame] | 35 | priority:ushort = 100 (id: 3); |
Austin Schuh | 719946b | 2019-12-28 14:51:01 -0800 | [diff] [blame] | 36 | |
| 37 | // Time to live in nanoseconds before the message is dropped. |
| 38 | // A value of 0 means no timeout, i.e. reliable. When a client connects, the |
| 39 | // latest message from this channel will be sent regardless. |
| 40 | // TODO(austin): We can retry more than just the last message on reconnect |
| 41 | // if we want. This is an unlikely scenario though. |
Austin Schuh | 38912b1 | 2020-10-03 18:23:31 -0700 | [diff] [blame] | 42 | time_to_live:uint = 0 (id: 4); |
Austin Schuh | 719946b | 2019-12-28 14:51:01 -0800 | [diff] [blame] | 43 | } |
| 44 | |
Brian Silverman | 7716297 | 2020-08-12 19:52:40 -0700 | [diff] [blame] | 45 | enum ReadMethod : ubyte { |
| 46 | // Copy all the data out of shared memory into a local buffer for each reader. |
| 47 | COPY, |
| 48 | // Pin the data in shared memory and read directly from there. |
| 49 | PIN, |
| 50 | } |
| 51 | |
Austin Schuh | 40485ed | 2019-10-26 21:51:44 -0700 | [diff] [blame] | 52 | // Table representing a channel. Channels are where data is published and |
Austin Schuh | cb10841 | 2019-10-13 16:09:54 -0700 | [diff] [blame] | 53 | // subscribed from. The tuple of name, type is the identifying information. |
Austin Schuh | 40485ed | 2019-10-26 21:51:44 -0700 | [diff] [blame] | 54 | table Channel { |
| 55 | // Name of the channel. |
Austin Schuh | 38912b1 | 2020-10-03 18:23:31 -0700 | [diff] [blame] | 56 | name:string (id: 0); |
Austin Schuh | cb10841 | 2019-10-13 16:09:54 -0700 | [diff] [blame] | 57 | // Type name of the flatbuffer. |
Austin Schuh | 38912b1 | 2020-10-03 18:23:31 -0700 | [diff] [blame] | 58 | type:string (id: 1); |
Austin Schuh | 40485ed | 2019-10-26 21:51:44 -0700 | [diff] [blame] | 59 | // Max frequency in messages/sec of the data published on this channel. |
Austin Schuh | 38912b1 | 2020-10-03 18:23:31 -0700 | [diff] [blame] | 60 | frequency:int = 100 (id: 2); |
Austin Schuh | 719946b | 2019-12-28 14:51:01 -0800 | [diff] [blame] | 61 | // Max size of the data being published. (This will hopefully be |
| 62 | // automatically computed in the future.) |
Austin Schuh | 38912b1 | 2020-10-03 18:23:31 -0700 | [diff] [blame] | 63 | max_size:int = 1000 (id: 3); |
Alex Perry | cb7da4b | 2019-08-28 19:35:56 -0700 | [diff] [blame] | 64 | |
Austin Schuh | 80c7fce | 2019-12-05 20:48:43 -0800 | [diff] [blame] | 65 | // Sets the maximum number of senders on a channel. |
Austin Schuh | 38912b1 | 2020-10-03 18:23:31 -0700 | [diff] [blame] | 66 | num_senders:int = 10 (id: 4); |
Austin Schuh | 80c7fce | 2019-12-05 20:48:43 -0800 | [diff] [blame] | 67 | // Sets the maximum number of watchers on a channel. |
Austin Schuh | 38912b1 | 2020-10-03 18:23:31 -0700 | [diff] [blame] | 68 | num_watchers:int = 10 (id: 5); |
Austin Schuh | 80c7fce | 2019-12-05 20:48:43 -0800 | [diff] [blame] | 69 | |
Alex Perry | cb7da4b | 2019-08-28 19:35:56 -0700 | [diff] [blame] | 70 | // The schema for the data sent on this channel. |
Austin Schuh | 38912b1 | 2020-10-03 18:23:31 -0700 | [diff] [blame] | 71 | schema:reflection.Schema (id: 6); |
Austin Schuh | 217a978 | 2019-12-21 23:02:50 -0800 | [diff] [blame] | 72 | |
| 73 | // The source node name for the data sent on this channel. |
| 74 | // If nodes is populated below, this needs to also be populated. |
Austin Schuh | 38912b1 | 2020-10-03 18:23:31 -0700 | [diff] [blame] | 75 | source_node:string (id: 7); |
Austin Schuh | 217a978 | 2019-12-21 23:02:50 -0800 | [diff] [blame] | 76 | |
Austin Schuh | 719946b | 2019-12-28 14:51:01 -0800 | [diff] [blame] | 77 | // The destination nodes for data sent on this channel. |
Austin Schuh | 217a978 | 2019-12-21 23:02:50 -0800 | [diff] [blame] | 78 | // This only needs to be populated if this message is getting forwarded. |
Austin Schuh | 38912b1 | 2020-10-03 18:23:31 -0700 | [diff] [blame] | 79 | destination_nodes:[Connection] (id: 8); |
Austin Schuh | 719946b | 2019-12-28 14:51:01 -0800 | [diff] [blame] | 80 | |
| 81 | // What service is responsible for logging this channel: |
Austin Schuh | 38912b1 | 2020-10-03 18:23:31 -0700 | [diff] [blame] | 82 | logger:LoggerConfig = LOCAL_LOGGER (id: 9); |
Austin Schuh | 719946b | 2019-12-28 14:51:01 -0800 | [diff] [blame] | 83 | // If the channel is logged remotely, which node should be responsible for |
| 84 | // logging the data. Note: this requires that the data is forwarded to the |
| 85 | // node responsible for logging it. Empty implies the node this connection |
| 86 | // is connecting to (i.e. name). |
Austin Schuh | 38912b1 | 2020-10-03 18:23:31 -0700 | [diff] [blame] | 87 | logger_nodes:[string] (id: 10); |
Brian Silverman | 7716297 | 2020-08-12 19:52:40 -0700 | [diff] [blame] | 88 | |
| 89 | // The way messages are read from shared memory for this channel. |
Austin Schuh | 38912b1 | 2020-10-03 18:23:31 -0700 | [diff] [blame] | 90 | read_method:ReadMethod = COPY (id: 11); |
Brian Silverman | 7716297 | 2020-08-12 19:52:40 -0700 | [diff] [blame] | 91 | |
| 92 | // Sets the maximum number of senders on a channel. |
| 93 | // |
| 94 | // Currently, this must be set if and only if read_method is PIN. |
Austin Schuh | 38912b1 | 2020-10-03 18:23:31 -0700 | [diff] [blame] | 95 | num_readers:int (id: 12); |
Austin Schuh | cb10841 | 2019-10-13 16:09:54 -0700 | [diff] [blame] | 96 | } |
| 97 | |
Austin Schuh | 40485ed | 2019-10-26 21:51:44 -0700 | [diff] [blame] | 98 | // Table to support renaming channel names. |
Austin Schuh | cb10841 | 2019-10-13 16:09:54 -0700 | [diff] [blame] | 99 | table Map { |
Austin Schuh | 40485ed | 2019-10-26 21:51:44 -0700 | [diff] [blame] | 100 | // Channel to match with. If the name in here matches, the name is replaced |
Austin Schuh | f1fff28 | 2020-03-28 16:57:32 -0700 | [diff] [blame] | 101 | // with the name in rename. If the name ends in *, it will be treated like a |
| 102 | // wildcard. Anything with the same prefix will match, and anything matching |
| 103 | // the * will get preserved on rename. This supports moving subfolders. |
Austin Schuh | bca6cf0 | 2019-12-22 17:28:34 -0800 | [diff] [blame] | 104 | // Node specific matches are also supported. |
Austin Schuh | 38912b1 | 2020-10-03 18:23:31 -0700 | [diff] [blame] | 105 | match:Channel (id: 0); |
Austin Schuh | 40485ed | 2019-10-26 21:51:44 -0700 | [diff] [blame] | 106 | // The channel to merge in. |
Austin Schuh | 38912b1 | 2020-10-03 18:23:31 -0700 | [diff] [blame] | 107 | rename:Channel (id: 1); |
Austin Schuh | cb10841 | 2019-10-13 16:09:54 -0700 | [diff] [blame] | 108 | } |
| 109 | |
| 110 | // Application specific information. |
| 111 | table Application { |
| 112 | // Name of the application. |
Austin Schuh | 38912b1 | 2020-10-03 18:23:31 -0700 | [diff] [blame] | 113 | name:string (id: 0); |
Tyler Chatow | a79419d | 2020-08-12 20:12:11 -0700 | [diff] [blame] | 114 | |
| 115 | // Path of the executable relative to starter. If this field is unset, use |
| 116 | // name as the path. Not permitted to change while starter is running. |
| 117 | executable_name:string (id: 5); |
| 118 | |
Austin Schuh | cb10841 | 2019-10-13 16:09:54 -0700 | [diff] [blame] | 119 | // List of maps to apply for this specific application. Application specific |
| 120 | // maps are applied in reverse order, and before the global maps. |
| 121 | // For example |
| 122 | // "maps": [ { "match": { "name": "/foo" }, "rename": { "name": "/bar" } } ] |
Austin Schuh | 40485ed | 2019-10-26 21:51:44 -0700 | [diff] [blame] | 123 | // will make it so any channels named "/foo" actually go to "/bar" for just |
Austin Schuh | cb10841 | 2019-10-13 16:09:54 -0700 | [diff] [blame] | 124 | // this application. This is super handy for running an application twice |
Austin Schuh | 40485ed | 2019-10-26 21:51:44 -0700 | [diff] [blame] | 125 | // publishing to different channels, or for injecting a little application |
Austin Schuh | cb10841 | 2019-10-13 16:09:54 -0700 | [diff] [blame] | 126 | // to modify messages live for testing. |
| 127 | // |
| 128 | // "maps": [ |
| 129 | // { "match": { "name": "/foo" }, "rename": { "name": "/bar" } }, |
| 130 | // { "match": { "name": "/foo" }, "rename": { "name": "/baz" } } |
| 131 | // ] |
| 132 | // |
| 133 | // will map "/foo" to "/baz", even if there is a global list of maps. |
Austin Schuh | 38912b1 | 2020-10-03 18:23:31 -0700 | [diff] [blame] | 134 | maps:[Map] (id: 1); |
Austin Schuh | 217a978 | 2019-12-21 23:02:50 -0800 | [diff] [blame] | 135 | |
| 136 | // The node that this application will be started on. |
| 137 | // TODO(austin): Teach starter how to use this for starting applications. |
Austin Schuh | 38912b1 | 2020-10-03 18:23:31 -0700 | [diff] [blame] | 138 | nodes:[string] (id: 2); |
Brian Silverman | 2713ed5 | 2020-09-22 22:23:14 -0700 | [diff] [blame] | 139 | |
| 140 | // The user to run this application as. If this field is unset, run it as |
| 141 | // the current user of the application starter. |
Austin Schuh | 38912b1 | 2020-10-03 18:23:31 -0700 | [diff] [blame] | 142 | user:string (id: 3); |
Tyler Chatow | a79419d | 2020-08-12 20:12:11 -0700 | [diff] [blame] | 143 | |
| 144 | // List of arguments to be passed to application |
| 145 | args:[string] (id: 4); |
Austin Schuh | 5f79a5a | 2021-10-12 17:46:50 -0700 | [diff] [blame^] | 146 | |
| 147 | // Indicates that application should be executed on boot. |
| 148 | autostart:bool = true (id: 6); |
Austin Schuh | 217a978 | 2019-12-21 23:02:50 -0800 | [diff] [blame] | 149 | } |
| 150 | |
| 151 | // Per node data and connection information. |
| 152 | table Node { |
| 153 | // Short name for the node. This provides a short hand to make it easy to |
| 154 | // setup forwarding rules as part of the channel setup. |
Austin Schuh | 38912b1 | 2020-10-03 18:23:31 -0700 | [diff] [blame] | 155 | name:string (id: 0); |
Austin Schuh | 217a978 | 2019-12-21 23:02:50 -0800 | [diff] [blame] | 156 | |
| 157 | // Hostname used to identify and connect to the node. |
Austin Schuh | 38912b1 | 2020-10-03 18:23:31 -0700 | [diff] [blame] | 158 | hostname:string (id: 1); |
Austin Schuh | 217a978 | 2019-12-21 23:02:50 -0800 | [diff] [blame] | 159 | // Port to serve forwarded data from. |
Austin Schuh | 38912b1 | 2020-10-03 18:23:31 -0700 | [diff] [blame] | 160 | port:ushort = 9971 (id: 2); |
Brian Silverman | aa2633f | 2020-02-17 21:04:14 -0800 | [diff] [blame] | 161 | |
| 162 | // An alternative to hostname which allows specifying multiple hostnames, |
| 163 | // any of which will match this node. |
| 164 | // |
| 165 | // Don't specify a hostname in multiple nodes in the same configuration. |
Austin Schuh | 38912b1 | 2020-10-03 18:23:31 -0700 | [diff] [blame] | 166 | hostnames:[string] (id: 3); |
Austin Schuh | d60967a | 2020-10-19 09:34:42 -0700 | [diff] [blame] | 167 | |
| 168 | // An arbitrary list of strings representing properties of each node. These |
| 169 | // can be used to store information about roles. |
| 170 | tags:[string] (id: 4); |
Austin Schuh | cb10841 | 2019-10-13 16:09:54 -0700 | [diff] [blame] | 171 | } |
| 172 | |
| 173 | // Overall configuration datastructure for the pubsub. |
| 174 | table Configuration { |
Austin Schuh | 40485ed | 2019-10-26 21:51:44 -0700 | [diff] [blame] | 175 | // List of channels. |
| 176 | channels:[Channel] (id: 0); |
Austin Schuh | cb10841 | 2019-10-13 16:09:54 -0700 | [diff] [blame] | 177 | // List of global maps. These are applied in reverse order. |
| 178 | maps:[Map] (id: 1); |
Austin Schuh | 217a978 | 2019-12-21 23:02:50 -0800 | [diff] [blame] | 179 | |
| 180 | // If present, this is the list of nodes in the system. If this is not |
| 181 | // present, AOS will be running in a single node configuration. |
| 182 | nodes:[Node] (id: 4); |
| 183 | |
Austin Schuh | cb10841 | 2019-10-13 16:09:54 -0700 | [diff] [blame] | 184 | // List of applications. |
| 185 | applications:[Application] (id: 2); |
| 186 | // List of imports. Imports are loaded first, and then this configuration |
| 187 | // is merged into them. |
| 188 | imports:[string] (id: 3); |
Austin Schuh | aa79e4e | 2019-12-29 20:43:32 -0800 | [diff] [blame] | 189 | |
| 190 | // Length of the channels in nanoseconds. Every channel will have enough |
| 191 | // data allocated so that if data is published at the configured frequency, |
Brian Silverman | 587da25 | 2020-01-01 17:00:47 -0800 | [diff] [blame] | 192 | // at least this many nanoseconds of messages will be available for fetchers. |
Austin Schuh | aa79e4e | 2019-12-29 20:43:32 -0800 | [diff] [blame] | 193 | channel_storage_duration:long = 2000000000 (id: 5); |
Austin Schuh | cb10841 | 2019-10-13 16:09:54 -0700 | [diff] [blame] | 194 | } |
| 195 | |
| 196 | root_type Configuration; |