// Copyright (C) 2018 The Android Open Source Project
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

// Note that if you add/remove methods in this file you must update
// the metrics sql as well by running ./android/scripts/gen-grpc-sql.py
//
// Please group deleted methods in a block including the date (MM/DD/YY)
// it was removed. This enables us to easily keep metrics around after removal
//
// List of deleted methods
// rpc iWasDeleted (03/12/12)
// ...
syntax = "proto3";

package android.emulation.control;

import "google/protobuf/empty.proto";
import "snapshot.proto";

option java_multiple_files = true;
option java_package = "com.android.emulator.control";
option objc_class_prefix = "AEC";

// The SnapshotService enables you to list, insert, store, and retrieve
// snapshots.
//
// Currently there are two types of snapshots:
//
// - Local (default): These are snapshots that are created locally. They are
//     stored internally inside qcow2 files and are very efficient. These are
//     the snapshots usually created by interacting with the UI.
//
// - Remote: These are snapshots that have been exported at a certain point.
//     an exported snapshot is normalized (completely self contained) and
//     can be imported into an emulator with a similar hardware configuration.
//
// Currently the emulator has limited support for importing snapshots:
// - Once an imported snapshot has been loaded into an emulator it is no longer
// possible to create new snapshots.
// - The hardware configuration of the emulator your are pushing a snapshot to
// must match (or be very similar) to the one you pulled the snapshot from.
//
// For example do not expect to be able to restore a snapshot on created on an
// Intel cpu on an AMD cpu.
service SnapshotService {
  // Lists all the snapshots, filtered by the given query, that are stored
  // locally for the currently running avd. This includes all the snapshots that
  // were imported (pushed) into this emulator.
  //
  // Returns a list of snapshot_id's and associated details that describes
  // the hardware configuration, logical name, etc of the snapshot.
  rpc ListSnapshots(SnapshotFilter) returns (SnapshotList) {}

  // Pulls down the snapshot stored inside the AVD as a tar.gz/tar stream
  // This will normalize the snapshot, all relevant data to push a snapshot
  // into a similar emulator will be placed inside the tar file.
  //
  // Pulling  down a snapshot will pause the emulator until the snapshots
  // are rebased and ready for exporting. Once the snapshot is rebased
  // the emulator will continue and downloading should commence.
  //
  // Note that pulling .gz stream is slow.
  //
  // You must provide the snapshot_id and (desired) format.
  //
  // If SnapshotPackage.path is set, the gRPC service will directly write the
  // exported snapshot to SnapshotPackage.path without streaming, which is
  // usually significantly faster. It would require emulator to have direct
  // access to SnapshotPackage.path, which usually means it can only be used
  // when pulling from a local emulator.
  rpc PullSnapshot(SnapshotPackage) returns (stream SnapshotPackage) {}

  // Push a tar.gz stream contain the snapshot. The tar file should
  // be a snapshot that was exported through the PullSnapshot in the past.
  // The emulator will try to import the snapshot. The hardware configuration
  // of the current emulator should match the one used for pulling.
  //
  // A detailed description of the snapshot (emulator_snapshot.Snapshot)
  // is stored in the snapshot.pb file inside the tar.
  //
  // You must provide the snapshot_id and format in the first message.
  // Will return success and a possible error message when a failure occurs.
  //
  // If SnapshotPackage.path is set, the gRPC service will directly unzip the
  // exported snapshot from SnapshotPackage.path without streaming, which is
  // usually significantly faster. It would require emulator to have direct
  // access to SnapshotPackage.path, which usually means it can only be used
  // when pushing to a local emulator.
  rpc PushSnapshot(stream SnapshotPackage) returns (SnapshotPackage) {}

  // Loads the given snapshot inside the emulator and activates it.
  // The device will be in the state as it was when the snapshot was created.
  //
  // You will no longer be able to call Save if this was an imported
  // snapshot that was pushed into this emulator.
  //
  // You must provide the snapshot_id to indicate which snapshot to load
  // Will return success and a possible error message when a failure occurs.
  rpc LoadSnapshot(SnapshotPackage) returns (SnapshotPackage) {}

  // Creates as a snapshot of the current state of the emulator.
  // You can only save a snapshot if you never activated (Load) an imported
  // snapshot (Push).
  //
  // For example:
  // - PushSnapshot("some_snap.tar.gz");
  // - LoadSnapshot("some_snap");
  // - SaveSnapshot("same_newer_snap"); // <--- Will currently fail.
  //
  // You can provide the snapshot_id to indicate the name used for storing.
  // Will return success and a possible error message when a failure occurs.
  rpc SaveSnapshot(SnapshotPackage) returns (SnapshotPackage) {}

  // Deletes the snapshot with the given snapshot_id from the avd.
  //
  // You must provide the snapshot_id to indicate which snapshot to delete.
  // Will return success and a possible error message when a failure occurs.
  rpc DeleteSnapshot(SnapshotPackage) returns (SnapshotPackage) {}

  // Tracks the given process for automated snapshot creation in case of
  // assert failures.
  //
  // Will return success and a possible error message when a failure occurs.
  // The snapshot_id field will contain the name of the snapshot that
  // will be created. The pid field will contain the process id that is
  // being tracked.
  rpc TrackProcess(IceboxTarget) returns (IceboxTarget) {}
}

// Sets options for SnapshotService. Used for both request and response messages.
message SnapshotPackage {
  enum Format {
    TARGZ = 0;
    TAR = 1;
  }
  // The identifier to the snapshot, only required for request messages. For
  // streaming service, only used in the first stream message of a gRPC call
  // (would be ignored in consequent stream messages of the same call).
  string snapshot_id = 1;

  // A stream of bytes. Encoded as a tar (possibly gzipped) file pendinf on the
  // value of format.
  bytes payload = 2;

  // [response only] status fields, usually indicates end of transmission.
  bool success = 3;
  bytes err = 4;

  // [request only] Format of the payload. Only used in request messages. For
  // streaming service, only used in the first stream message of a gRPC call
  // (would be ignored in consequent stream messages of the same call).
  Format format = 5;

  // [request only] Path to the snapshot package file. Only used in request
  // messages.
  //
  // When set in a request, the PullSnapshot/PushSnapshot operation will directly
  // write/read the exported snapshot in path without streaming, which is usually
  // significantly faster. It would require emulator to have direct access to
  // path, which usually means it can only be used with a local emulator.
  string path = 6;
}

// A snapshot filter can be used to filter the results produced by ListSnapshots
message SnapshotFilter {
  enum LoadStatus {
    // Only return compatible snapshots
    CompatibleOnly = 0;

    // Return all snapshots.
    All = 1;
  }

  // Filter snapshots by load status.
  LoadStatus statusFilter = 1;
}

// Provides detailed information regarding the snapshot.
message SnapshotDetails {

  enum LoadStatus {
    // The emulator believes that the snapshot is compatible with the emulator
    // that provided this information.  The emulator will attempt to load this
    // snapshot when requested.
    //
    // A snapshot is usually compatible when the following statements are true:
    // - The snapshot was taken by the current emulator version. i.e.
    //   emulator_build_id in the details field matches the build_id of the
    //   emulator that provided this information.
    //
    // - The snapshot was taken on the current running machine, and no hardware
    //  changes have taken place between taking and loading the snapshot.
    //
    // - The avd configuration has not changed between when this snapshot was
    //   taken  and when the snapshot was loaded.
    //
    // - The system images on which the avd is based have not changed.
    Compatible = 0;

    // The emulator will not allow loading of the snapshot, as it deems the
    // snapshot to be incompatible. Loading of snapshots can be forced by
    // launching the emulator with the feature "AllowSnapshotMigration" enabled.
    Incompatible = 1;

    // This snapshot was successfully loaded in the emulator, and was used at
    // the starting point of the current running emulator. The following holds:
    //
    // A loaded snapshot is a compatible snapshot
    // There is at most one snapshot_id that is in the "Loaded" state
    Loaded = 2;
  }

  // The id of this snapshot. Use this id to load/delete/pull the
  // snapshot.
  string snapshot_id = 1;

  // Detailed information about this snapshot. This contains a detailed
  // hardware description of the snapshot. These details are the same
  // as the "snapshot.pb" file found in an exported snapshot.
  // Look at the import file for a detailed description of the available
  // fields.
  emulator_snapshot.Snapshot details = 2;

  // Provides information about the ability to restore this snapshot.
  LoadStatus status = 3;

  // The size of the folder that stores required information to load a snapshot.
  uint64 size = 4;
}

// A List of on snapshot details.
message SnapshotList { repeated SnapshotDetails snapshots = 1; }

message IceboxTarget {
  // This is the process id to attach to, if this value is not set (0)
  // The process name will be used instead.
  int64 pid = 1;

  // The process name to attach to if any, if this is not set the pid will
  // be used. This is usually the application name of your application under
  // test, that is passed in to the am instrument command. It is likely
  // what you will find in your AndroidManifest.xml
  string package_name = 2;

  // The name of the snapshot that icebox will create if a snapshot is
  // generated.
  string snapshot_id = 3;

  // [Output Only] True if icebox failed to track the given target.
  bool failed = 4;

  // [Output Only] Detailed error message that might provide more information.
  string err = 5;

  // Maximum number of snapshots the emulator can take during one Icebox run.
  // Set to -1 for unlimited number of snapshots.
  int32 max_snapshot_number = 6;
}

// List of deleted methods:
//
