summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGatis Paeglis <gatis.paeglis@qt.io>2016-12-20 16:47:30 +0100
committerGatis Paeglis <gatis.paeglis@qt.io>2017-01-05 08:50:25 +0000
commit67d7afa9def07eac716ea164fa1a2be101c420de (patch)
treeb424ff47dad5fdda1f75d5fe1de52826af4dc107
parent1ff76535d08db76bf0f791f6de167f7a0f708ccc (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.qml8
-rw-r--r--src/imports/pluginmain.cpp40
-rw-r--r--src/lib/qotaclient.cpp63
-rw-r--r--src/lib/qotaclient.h5
-rw-r--r--src/lib/qotaclient_p.h5
-rw-r--r--src/lib/qotaclientasync.cpp7
-rw-r--r--src/lib/qotaclientasync_p.h2
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();