// 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;
    DIRECTORY = 2;
  }
  // 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:
//
