Constellation Release 1.0.0#
We are happy to announce the release of Constellation version 1.0.0, named Corona Australis. This is a the first stable release of Constellation. Starting with this release, no breaking changes in the satellite API will be introduced until the next major release of Constellation.
This release includes the some last minor breaking changes for the satellite API and many bug fixes.
Breaking Changes for Operators#
New Satellite Version Commands#
So far, the satellite command get_version has returned the Constellation framework version the satellite has been built against, including the version code name.
Starting with version 1.0.0, satellites can expose their own, separate version number. Consequently, the available commands and their return values have changed:
get_versionnow returns the Satellite version number whileget_cnstln_versionreturns the Constellation library version the satellite has been built against, omitting the code name.
Reconfiguring Fails with Unused Parameters#
Previously, unused parameters provided to a reconfigure command only produced a WARNING log message.
Starting with 1.0.0, all parameters provided to the reconfiguration have to be already used by the target satellite.
Any unused parameter now triggers a transition into the ERROR state.
Improved Awaiting for States (Python)#
In the last release, the await_state_change method was introduced for transitions which transition to the same steady state such as reconfigure or initialize from INIT and required caching the last state change.
This behavior has now been implemented in the controller directly, allowing to use the simpler await_state method instead.
The await_state_change method has thus been removed.
Before:
# Store when Sputnik.One last changed state
last_state_change = ctrl.get_last_state_change(["Sputnik.One"])
# Send reconfigure command to Sputnik.One
constellation.Sputnik.One.reconfigure(recfg)
# Wait until all states are back in the ORBIT state while ensuring Sputnik.One changed state
ctrl.await_state_change(SatelliteState.ORBIT, last_state_change)
Starting with 1.0.0:
# Send reconfigure command to Sputnik.One
constellation.Sputnik.One.reconfigure(recfg)
# Wait until all states are back in the ORBIT state
ctrl.await_state(SatelliteState.ORBIT)
New Features for Operators#
NextcloudTalk Satellite#
A new satellite has been added which sends log messages to a Nextcloud Talk chat, similar to the Mattermost satellite.
More details can be found in the satellite documentation.
Allow Waiting for a Number of Satellites (Python)#
A new method has been added to the Python controller allowing to check for the presence of a number of satellites. This is a faster to implement alternative compared to naming each satellite.
await_satellites:
ctrl.await_satellites([
"Sputnik.One",
"Sputnik.Two",
"Sputnik.Three",
"Sputnik.Four",
])
await_n_satellites:
ctrl.await_n_satellites(4)
Improved Metrics and Log Monitor#
The Python Monitor tool has existed since v0.1, however it was never document and lacked control about what is being monitored.
For this release, the Monitor has been reworked and extensively documented, including a dedicated tutorial.
The monitor can be started via:
Monitor -g group_name
Metrics can be subscribed to via:
Monitor -g group_name --metrics METRIC_1 METRIC_2
A full tutorial can be found in the operator guide.
Data Transmitters Can Discard Data Locally#
Transmitter satellites have so far always sent their data to a connected receiver satellite and would transition into the ERROR state when no receiver satellite was available.
Starting with 1.0.0, it is possible to configure transmitter satellites to discard all data locally instead of transmitting it, e.g. when the generated data do not need to be stored.
This can be configured via the _data.disable_transmission configuration key:
[RandomTransmitter.Spammer]
_data.disable_transmission = true
Breaking Changes for Application Developers#
Programs written for previous versions of Constellation may not compatible with this version due to the breaking changes in the command API in Python.
Command Registration (Python)#
Up until now, custom CSCP commands required to take the full CSCP1Message class in their function signature and parse command arguments on their own.
In this release, the command registration has been updated to store the function signature instead and pass the arguments directly to the function.
Before:
@cscp_requestable()
def get_channel_reading(self, request: CSCP1Message) -> tuple[str, Any, dict[str, Any]]:
paramList = request.payload
channel = paramList[0]
value = _device.read(channel)
return str(value / 10), None, {}
Starting with 1.0.0:
@cscp_requestable()
def get_channel_reading(self, channel: int) -> tuple[str, Any, dict[str, Any]]:
value = _device.read(channel)
return str(value / 10), None, {}
Satellite Versions (C++/Python)#
Up until now, satellites only reported the version of the Constellation framework they had been built with. It is now possible to give a satellite its own version number, which can differ from the version of the underlying Constellation library.
In Python, the satellite version can be set when subclassing the Satellite class:
class MySatellite(Satellite, version="1.2.3"):
...
In C++, the version is passed to the Satellite constructor:
MySatellite::MySatellite(std::string_view type, std::string_view name, std::string_view version)
: Satellite(type, name, version) {}
New Features for Application Developers#
None
Detailed Changelog#
The following changes related to satellites are included in this release:
MR!1062: EudaqNativeWriter: Allow to configure file name pattern
MR!1116: Add NextcloudTalk satellite
MR!1123: H5DataWriter: fix storing configurations
MR!1124: Mattermost: fix card info
MR!1210: Influx: close InfluxDB client on reentry
The following changes related to graphical user interfaces are included in this release:
MR!922: Observatory: add log level reset button and allow to resize the sender list
MR!1103: MissionControl: fix allowed transitions in context menu
MR!1177: MissionControl: only enable the start button when in a global state
MR!1195: MissionControl: append file extension if not given to deduced configurations
MR!1200: MissionControl: fetch command when right-clicking instead of caching them
MR!1163: MissionControl: append run sequence to full run ID if split failed
The following improvements to the framework are included in this release:
MR!579: Allow transmitter satellites to discard data locally (C++/Python)
MR!912: Proper parsing of local data and time in configuration files (C++)
MR!926: Send the number of data records sent in the EOR (C++/Python)
MR!983: Also parse binary and hexadecimal integers in YAML configuration files (C++)
MR!1101: Allow to unregister services in CHIRP (Python)
MR!1102: Add state change callback and
STATEmetric (Python)MR!1128: Mark configuration keys as used with
getText(C++)MR!1131: Fix inconsistent casing in heartbeating (Python)
MR!1132: Fix improper shutdown of satellites (Python)
MR!1138: Check dependent satellites already during initialize (Python)
MR!1139: Fix improper casing for CMDP topics (Python)
MR!1142: Handle non-standard log levels (Python)
MR!1143: Change disk space metric failure logging to debug and clarify that it is in mebibytes (C++)
MR!1145: Introduce satellite versioning (C++/Python)
MR!1148: Add
states_excepthelper method (C++)MR!1149: Check for outdated states when awaiting a state (C++/Python)
MR!1150: Make the MessagePack functions of the data record public (C++)
MR!1155: Rename remaining ‘satellite class’ artifacts to ‘satellite type’ (Python)
MR!1156: Add CPU and memory metrics (Python)
MR!1164: Throw when reconfiguring with unused parameters (C++/Python)
MR!1168: Allow returning
Noneindo_run(Python)MR!1169: Fix compilation for inserting BOR/EOR tags on weird compilers (C++)
MR!1170: Print BOR and EOR tags on the INFO log level (Python)
MR!1173: Allow waiting for a number of satellites (Python)
MR!1175: Improve and document Python Monitor
MR!1179: First stop sending data and then update metadata in EOR (Python)
MR!1186: Allow to check if any satellite is in a given state (C++)
MR!1188: Rework of the CSCP command interface (Python)
MR!1190: Satellite version is printed when using
--version(C++)MR!1193: The version of external satellites is parsed from GitHub and GitLab repositories
MR!1194: Improved shutdown procedure (Python)
MR!1196: Avoid hot loop when waiting for a steady state when interrupting (C++)
MR!1197: Catch exceptions when unpacking CDTP2 messages (C++)
MR!1198: Ignore CHIRP offers with port zero (C++)
MR!1199: Remove passing variables by reference to asynchronous tasks (C++)
MR!1201: Dispatch heartbeat callbacks after freeing the mutex to avoid deadlocks (C++)
MR!1202: Improve handling of the ERROR and DEAD states (Python)
MR!1204: Ask for the satellite name explicitly in the controller (Python)
MR!1206: Fix selecting non-multicast interfaces by default (Python)
MR!1209: Fix data races in the command registry and reconfigure support (C++)
MR!1211: Fix assuming lives == 0 for ERROR or SAFE (C++)
The following documentation changes are included in this release:
MR!1096: Improve documentation for data transmission
MR!1112: Add tutorial for TelemetryConsole
MR!1118: Document firewall settings
MR!1120: Add FAQ section
MR!1130: Improve InfluxDB+Grafana how-to
MR!1137: Add tutorial for IPython controller
MR!1160: Reworked front page
MR!1167: Add documentation for listener and extend telemetry documentation
The following miscellaneous changes are included in this release:
MR!1147: Allow not building the controller and listener libraries (C++)
Notes#
The software is publicly available under the EUPL-1.2 from the DESY GitLab repository. In addition, the Python version is available on PyPI and the full framework is available on Flathub for Linux.