// Copyright 2019 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

library fuchsia.update;

[Discoverable]
protocol Manager {
    /// Immediately check for an update.
    ///  |options|:  Did a user initiate this request? (USER_INITIATED) This changes
    ///              some parameters about aggressiveness of retries and throttling.
    ///  |monitor|:  An interface on which to receive the status events for this update check.
    ///               It's only valid for a single update check, after that it won't receive any
    ///               more events.
    ///
    ///  -> Was the update check successfully started (state machine in a proper state
    ///     to do so).
    CheckNow(Options options, request<Monitor>? monitor)
        -> (CheckStartedResult result);

    /// Get the current state of the Manager (is an update available, is it currently
    /// checking for an update, etc).
    GetState() -> (State state);

    /// Get all status events, for all update checks (interactive and background).
    AddMonitor(request<Monitor> monitor);
};

/// Receiver of updates for either an individual update check, or to continuously
/// receive updates for all checks.
protocol Monitor {
    /// Receive the current state as it changes.
    -> OnState(State state);

    // TODO: support progress reporting.
};

/// Configuration options for an update attempt (this is common with the Fuchsia
///  OTA Interface v2)
table Options {
    /// What initiated this update attempt.
    1: Initiator initiator;
};

/// Who or what initiated the update check.
enum Initiator {
    /// The update check was initiated by an interactive user, or the user is
    /// otherwise blocked and waiting for the result of this update check.
    USER = 0;

    /// The update check was initiated by a service, in the background.
    SERVICE = 1;
};

/// The various states that the manager can be in.
///
///     +----------------------+
/// --->|         IDLE         |<--------------------------------+
/// |   +----------------------+                                 |
/// |              |               +----------------------+      |
/// |              |<--------------|   UPDATE_AVAILABLE   |      |
/// |              |               +----------------------+      |
/// |              v                       ^                     |
/// |   +----------------------+           |                     |
/// |<--| CHECKING_FOR_UPDATES |-----------------+               |
/// |   +----------------------+                 |               |
/// |              v                             |               |
/// |   +----------------------+                 |               |
/// |   |  PERFORMING_UPDATE   |---------------->|               |
/// |   +----------------------+                 |               |
/// |              v                             |               |
/// |   +----------------------+                 |               |
/// |   |  WAITING_FOR_REBOOT  |---------------->|               |
/// |   +----------------------+                 |               |
/// |              v                             v               |
/// |   +----------------------+     +----------------------+    |
/// +---|  FINALIZING_UPDATE   |---->|  ENCOUNTERED_ERROR   |----+
///     +----------------------+     +----------------------+
///
enum ManagerState {
    /// The Manager is currently idle (in between updates).
    ///
    /// Next states:
    /// * |CHECKING_FOR_UPDATES|
    IDLE = 0;
    /// The Manager is currently checking for an update.
    ///
    /// Next states:
    /// * |IDLE| update is not available
    /// * |UPDATE_AVAILABLE| update is available but not allowed by policy
    /// * |PERFORMING_UPDATE| update is available and allowed by policy
    /// * |ENCOUNTERED_ERROR| on error
    CHECKING_FOR_UPDATES = 1;
    /// The Manager has found an available update but is not allowed to update
    /// due to policy.
    ///
    /// Next states:
    /// * |CHECKING_FOR_UPDATES| when CheckNow() is called or a background update starts
    UPDATE_AVAILABLE = 2;
    /// The Manager has started the available update.
    ///
    /// Next states:
    /// * |WAITING_FOR_REBOOT| on success
    /// * |ENCOUNTERED_ERROR| on error
    PERFORMING_UPDATE = 3;
    /// The update has been performed, and the device is waiting to be rebooted.
    ///
    /// Next states:
    /// * |FINALIZING_UPDATE| after device reboot
    /// * |ENCOUNTERED_ERROR| on error
    WAITING_FOR_REBOOT = 4;
    /// The update is being finalized after reboot.
    ///
    /// Next states:
    /// * |IDLE| on success
    /// * |ENCOUNTERED_ERROR| on error
    FINALIZING_UPDATE = 5;
    /// The Manager is reporting to Omaha that an error has occurred during the
    /// update.
    ///
    /// Next states:
    /// * |IDLE|
    ENCOUNTERED_ERROR = 6;
};

enum CheckStartedResult {
    /// The update check has been started.
    STARTED = 0;
    /// The update check was not started, as an update is already in progress, |monitor| is
    /// attached to that update and will immediately get a OnState() call on current state.
    IN_PROGRESS = 1;
    /// The update check was not started, because too many requests to check have
    /// been made in a short period of time.
    THROTTLED = 2;
};

table State {
    /// The current state of the Manager. Always present.
    1: ManagerState state;

    /// The version available from Omaha. Will be present in |UPDATE_AVAILABLE| or starting
    /// from |PERFORMING_UPDATE|.
    2: string version_available;
};
