diff options
author | Gatis Paeglis <gatis.paeglis@qt.io> | 2016-12-20 16:47:30 +0100 |
---|---|---|
committer | Gatis Paeglis <gatis.paeglis@qt.io> | 2017-01-05 08:50:25 +0000 |
commit | 67d7afa9def07eac716ea164fa1a2be101c420de (patch) | |
tree | b424ff47dad5fdda1f75d5fe1de52826af4dc107 | |
parent | 1ff76535d08db76bf0f791f6de167f7a0f708ccc (diff) |
Expose default revision and metadata
Default system is the system that is scheduled to be
booted into during the next system startup. With the
previous 3 metadata versions it was possible to rotate
to a state where we can't access and present to the user
what currently is scheduled for the next system boot:
Booted : b
Remote : b
Rollback: a
call ::rollback() => [ a -> b ]
Booted : b
Remote : b
Rollback : b
Now if we want to present a message box to a user when
the system shutdown has been initiated, we don't know what
the system will boot into. This of course could be worked
around by saving a state in user application, but the better
solution is to expose default revision.
With this API, the previous example after the rollback will
contain:
Booted : b
Remote : b
Rollback : b
Default : a
Change-Id: Id123ed8ef76f0284a02899daf22aef0716c78e4e
Reviewed-by: Gatis Paeglis <gatis.paeglis@qt.io>
-rw-r--r-- | examples/qml/basic/main.qml | 8 | ||||
-rw-r--r-- | src/imports/pluginmain.cpp | 40 | ||||
-rw-r--r-- | src/lib/qotaclient.cpp | 63 | ||||
-rw-r--r-- | src/lib/qotaclient.h | 5 | ||||
-rw-r--r-- | src/lib/qotaclient_p.h | 5 | ||||
-rw-r--r-- | src/lib/qotaclientasync.cpp | 7 | ||||
-rw-r--r-- | src/lib/qotaclientasync_p.h | 2 |
7 files changed, 103 insertions, 27 deletions
diff --git a/examples/qml/basic/main.qml b/examples/qml/basic/main.qml index b715403..68a70ab 100644 --- a/examples/qml/basic/main.qml +++ b/examples/qml/basic/main.qml @@ -108,6 +108,9 @@ Window { function updateRollbackMetadataLabel() { updateMetadataLabel(rollbackMetadataLabel, OtaClient.rollbackMetadata, OtaClient.rollbackRevision) } + function updateDefaultMetadataLabel() { + updateMetadataLabel(defaultMetadataLabel, OtaClient.defaultMetadata, OtaClient.defaultRevision) + } Flickable { anchors.fill: parent @@ -129,6 +132,9 @@ Window { Label { text: "ROLLBACK"; Layout.bottomMargin: 14; Layout.topMargin: 14; font.underline: true } Label { id: rollbackMetadataLabel; lineHeight : 1.3 } + Label { text: "DEFAULT"; Layout.bottomMargin: 14; Layout.topMargin: 14; font.underline: true } + Label { id: defaultMetadataLabel; lineHeight : 1.3 } + Label { text: "REPOSITORY CONFIGURATION"; Layout.bottomMargin: 14; Layout.topMargin: 14; font.underline: true } Label { id: repoConfigLabel; lineHeight : 1.3 } @@ -255,6 +261,7 @@ Window { onRepositoryConfigChanged: updateConfigView(config) onRemoteMetadataChanged: updateRemoteMetadataLabel() onRollbackMetadataChanged: updateRollbackMetadataLabel() + onDefaultMetadataChanged: updateDefaultMetadataLabel() } Component.onCompleted: { @@ -272,5 +279,6 @@ Window { updateBootedMetadataLabel() updateRemoteMetadataLabel() updateRollbackMetadataLabel() + updateDefaultMetadataLabel() } } diff --git a/src/imports/pluginmain.cpp b/src/imports/pluginmain.cpp index 6112b3f..2087b93 100644 --- a/src/imports/pluginmain.cpp +++ b/src/imports/pluginmain.cpp @@ -100,6 +100,27 @@ QT_BEGIN_NAMESPACE */ /*! + \qmlproperty string OtaClient::defaultRevision + \readonly + + This property holds a string containing the default system's revision (a + checksum in the OSTree repository). +*/ + +/*! + \qmlproperty string OtaClient::defaultMetadata + \readonly + + \include qotaclient.cpp default-metadata +*/ + +/*! + \qmlsignal OtaClient::defaultMetadataChanged() + + This signal is emitted when the default metadata changes. +*/ + +/*! \qmlmethod bool OtaClient::fetchRemoteMetadata() \include qotaclient.cpp fetchremotemetadata-description @@ -137,14 +158,7 @@ QT_BEGIN_NAMESPACE /*! \qmlmethod bool OtaClient::rollback() - - Rollback to the previous system version. - - This method is asynchronous and returns immediately. The return value - holds whether the operation was started successfully. - - \note This method mutates system's state/metadata. - \sa rollbackFinished(), restartRequired + \include qotaclient.cpp rollback-description */ /*! @@ -229,10 +243,9 @@ QT_BEGIN_NAMESPACE \qmlproperty bool OtaClient::updateAvailable \readonly - Holds a bool indicating the availability of a system update. This - information is cached; to update the local cache, call fetchRemoteMetadata(). + Holds a bool indicating the availability of a system update. - \sa update() + \include qotaclient.cpp update-available-description */ /*! @@ -263,9 +276,8 @@ QT_BEGIN_NAMESPACE \qmlproperty bool OtaClient::restartRequired \readonly - Holds a bool indicating whether a reboot is required. Reboot is required - after update(), updateOffline() and rollback(), to boot into the new default - system. + Holds a bool indicating whether a reboot is required. + Reboot is required when the default system differ from the booted system. */ /*! diff --git a/src/lib/qotaclient.cpp b/src/lib/qotaclient.cpp index a3e8f37..329c545 100644 --- a/src/lib/qotaclient.cpp +++ b/src/lib/qotaclient.cpp @@ -75,7 +75,9 @@ void QOtaClientPrivate::handleStateChanges() { Q_Q(QOtaClient); - bool updateAvailable = m_defaultRev != m_remoteRev && m_remoteRev != m_bootedRev; + // The default system is used as the configuration merge source + // when performing a system update. + bool updateAvailable = m_defaultRev != m_remoteRev; if (m_updateAvailable != updateAvailable) { m_updateAvailable = updateAvailable; emit q->updateAvailableChanged(m_updateAvailable); @@ -148,13 +150,17 @@ void QOtaClientPrivate::remoteMetadataChanged(const QString &remoteRev, const QS emit q->remoteMetadataChanged(); } -void QOtaClientPrivate::defaultRevisionChanged(const QString &defaultRevision) +void QOtaClientPrivate::defaultRevisionChanged(const QString &defaultRevision, const QString &defaultMetadata) { + Q_Q(QOtaClient); if (m_defaultRev == defaultRevision) return; m_defaultRev = defaultRevision; + m_defaultMetadata = defaultMetadata; handleStateChanges(); + + emit q->defaultMetadataChanged(); } /*! @@ -240,6 +246,12 @@ void QOtaClientPrivate::defaultRevisionChanged(const QString &defaultRevision) */ /*! + \fn void QOtaClient::defaultMetadataChanged() + + This signal is emitted when the default metadata changes. +*/ + +/*! \fn void QOtaClient::updateAvailableChanged(bool available) This signal is emitted when the value of updateAvailable changes. The @@ -367,13 +379,16 @@ bool QOtaClient::update() } /*! - Rollback to the previous system version. +//! [rollback-description] + Rollback to the previous system version. The currently booted system + becomes the new rollback system. This method is asynchronous and returns immediately. The return value holds whether the operation was started successfully. \note This method mutates system's state/metadata. \sa rollbackFinished(), restartRequired +//! [rollback-description] */ bool QOtaClient::rollback() { @@ -644,8 +659,12 @@ QString QOtaClient::statusString() const \property QOtaClient::updateAvailable \brief whether a system update is available. - This information is cached; to update the local cache, call - fetchRemoteMetadata(). +//! [update-available-description] + This information is cached; to update the local cache, call fetchRemoteMetadata(). + The return value holds whether a system update is available for the default system. + + \sa update() +//! [update-available-description] */ bool QOtaClient::updateAvailable() const { @@ -671,9 +690,9 @@ bool QOtaClient::rollbackAvailable() const \property QOtaClient::restartRequired \brief whether a reboot is required. - Reboot is required after update(), updateOffline() and rollback(), - to boot into the new default system. + Reboot is required when the default system differ from the booted system. + \sa defaultRevision, defaultMetadata */ bool QOtaClient::restartRequired() const { @@ -685,7 +704,7 @@ bool QOtaClient::restartRequired() const \property QOtaClient::bootedRevision \brief a QString containing the booted system's revision. - A booted revision is a checksum in the OSTree repository. + A checksum in the OSTree repository. */ QString QOtaClient::bootedRevision() const { @@ -754,4 +773,32 @@ QString QOtaClient::rollbackMetadata() const return d_func()->m_rollbackMetadata; } +/*! + \property QOtaClient::defaultRevision + \brief a QString containing the default system's revision. + + A checksum in the OSTree repository. +*/ +QString QOtaClient::defaultRevision() const +{ + return d_func()->m_defaultRev; +} + +/*! + \property QOtaClient::defaultMetadata + \brief a QString containing the default system's OTA metadata. + +//! [default-metadata] + A default system represents what the host will boot into the next time + system is rebooted. A default system changes after system updates or rollbacks. + + Returns a JSON-formatted QString containing OTA metadata for the default + system. Metadata is bundled with each system's version. +//! [default-metadata] +*/ +QString QOtaClient::defaultMetadata() const +{ + return d_func()->m_defaultMetadata; +} + QT_END_NAMESPACE diff --git a/src/lib/qotaclient.h b/src/lib/qotaclient.h index 2708a02..28cb422 100644 --- a/src/lib/qotaclient.h +++ b/src/lib/qotaclient.h @@ -52,6 +52,8 @@ class Q_DECL_EXPORT QOtaClient : public QObject Q_PROPERTY(QString remoteMetadata READ remoteMetadata NOTIFY remoteMetadataChanged) Q_PROPERTY(QString rollbackRevision READ rollbackRevision NOTIFY rollbackMetadataChanged) Q_PROPERTY(QString rollbackMetadata READ rollbackMetadata NOTIFY rollbackMetadataChanged) + Q_PROPERTY(QString defaultRevision READ defaultRevision NOTIFY defaultMetadataChanged) + Q_PROPERTY(QString defaultMetadata READ defaultMetadata NOTIFY defaultMetadataChanged) public: static QOtaClient& instance(); virtual ~QOtaClient(); @@ -80,10 +82,13 @@ public: QString remoteMetadata() const; QString rollbackRevision() const; QString rollbackMetadata() const; + QString defaultRevision() const; + QString defaultMetadata() const; Q_SIGNALS: void remoteMetadataChanged(); void rollbackMetadataChanged(); + void defaultMetadataChanged(); void updateAvailableChanged(bool available); void rollbackAvailableChanged(); void restartRequiredChanged(bool required); diff --git a/src/lib/qotaclient_p.h b/src/lib/qotaclient_p.h index a58a7ec..7e25b39 100644 --- a/src/lib/qotaclient_p.h +++ b/src/lib/qotaclient_p.h @@ -57,7 +57,7 @@ public: void setBootedMetadata(const QString &bootedRev, const QString &bootedMetadata); void rollbackMetadataChanged(const QString &rollbackRev, const QString &rollbackMetadata, int treeCount); void remoteMetadataChanged(const QString &remoteRev, const QString &remoteMetadata); - void defaultRevisionChanged(const QString &defaultRevision); + void defaultRevisionChanged(const QString &defaultRevision, const QString &defaultMetadata); // members QOtaClient *const q_ptr; @@ -69,7 +69,6 @@ public: QString m_error; QThread *m_otaAsyncThread; QScopedPointer<QOtaClientAsync> m_otaAsync; - QString m_defaultRev; QString m_bootedRev; QString m_bootedMetadata; @@ -77,6 +76,8 @@ public: QString m_remoteMetadata; QString m_rollbackRev; QString m_rollbackMetadata; + QString m_defaultRev; + QString m_defaultMetadata; }; QT_END_NAMESPACE diff --git a/src/lib/qotaclientasync.cpp b/src/lib/qotaclientasync.cpp index 987a879..738a8f1 100644 --- a/src/lib/qotaclientasync.cpp +++ b/src/lib/qotaclientasync.cpp @@ -258,14 +258,17 @@ bool QOtaClientAsync::handleRevisionChanges(OstreeSysroot *sysroot, bool reloadS g_autoptr(GPtrArray) deployments = ostree_sysroot_get_deployments (sysroot); OstreeDeployment *firstDeployment = (OstreeDeployment*)deployments->pdata[0]; + bool ok = true; QString defaultRev(QLatin1String(ostree_deployment_get_csum (firstDeployment))); - emit defaultRevisionChanged(defaultRev); + QString defaultMetadata = metadataFromRev(defaultRev, &ok); + if (!ok) + return false; + emit defaultRevisionChanged(defaultRev, defaultMetadata); int index = rollbackIndex(sysroot); if (index != -1) { OstreeDeployment *rollbackDeployment = (OstreeDeployment*)deployments->pdata[index]; QString rollbackRev(QLatin1String(ostree_deployment_get_csum (rollbackDeployment))); - bool ok = true; QString rollbackMetadata = metadataFromRev(rollbackRev, &ok); if (!ok) return false; diff --git a/src/lib/qotaclientasync_p.h b/src/lib/qotaclientasync_p.h index 6252878..e5756e0 100644 --- a/src/lib/qotaclientasync_p.h +++ b/src/lib/qotaclientasync_p.h @@ -68,7 +68,7 @@ signals: void errorOccurred(const QString &error); void statusStringChanged(const QString &status); void remoteMetadataChanged(const QString &remoteRev, const QString &remoteMetadata); - void defaultRevisionChanged(const QString &defaultRevision); + void defaultRevisionChanged(const QString &defaultRevision, const QString &defaultMetadata); protected: OstreeSysroot* defaultSysroot(); |