// 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.
  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.
  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) {}
}

message SnapshotPackage {
  enum Format {
    TARGZ = 0;
    TAR = 1;
  }
  // The identifier to the snapshot, only required for the first message.
  string snapshot_id = 1;

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

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

  // Format of the payload. Only required for the first message.
  Format format = 5;
}

// 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:
//
