// Copyright 2017 The Chromium OS Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. syntax = "proto3"; option optimize_for = LITE_RUNTIME; // This file defines messages used for starting, stopping, and managing VMs. package vm_tools.concierge; option go_package = "vm_concierge_proto"; // Specification of the key components of a VM. message VirtualMachineSpec { // Path to the kernel that should be used for the VM. string kernel = 1; // Path to the disk image that should be used as the root file system for // the VM. string rootfs = 2; } // The type of disk image. enum DiskImageType { // A raw file. DISK_IMAGE_RAW = 0; // A qcow2-compatible disk image. DISK_IMAGE_QCOW2 = 1; } // Describes any additional disk images that should be mounted inside the VM. message DiskImage { // Path to the disk image on the host. string path = 1; // Path where this disk image will be mounted inside the VM. string mount_point = 2; // The file system type for this disk image. string fstype = 3; // Any special flags to be used when mounting the file system. Specified the // same way as in mount(2). uint64 flags = 4; // Any additional data associated with the mount. string data = 5; // If true, the disk image will be mounted writable. bool writable = 6; // If true, the disk image will be mounted. bool do_mount = 7; // Image type of the disk. DiskImageType image_type = 8; } // Information about a particular VM. message VmInfo { // The IPv4 address assigned to the VM, in network byte order. fixed32 ipv4_address = 1; // The process ID of the main crosvm process for the VM. int32 pid = 2; // The virtual socket context id assigned to the VM. int64 cid = 3; // The handle to a 9p server managed by the seneschal system service. Use // this handle when making requests to that service to manage the files shared // with this VM. uint64 seneschal_server_handle = 4; } // Information that must be included with every StartVm dbus message. message StartVmRequest { // The VM that should be started. This is ignored if starting a termina VM, // which will always use the latest component from imageloader. VirtualMachineSpec vm = 1; // Any additional disks that should be mounted inside the VM. repeated DiskImage disks = 2; // Path to a shared directory that will be mounted via NFS inside the VM. // DEPRECATED: The server never did anything with this field. Instead callers // should use the |shared_dir_handle| field of the VmInfo message to get a // server handle that can be used in requests to the seneschal system service. string shared_directory = 3 [deprecated = true]; // The human-readable name to be assigned to this VM. string name = 4; // If true, concierge should also perform termina-specific setup. bool start_termina = 5; // If true, a file descriptor must be passed along with the message and that // file descriptor will be used for storage. // Ignored unless |start_termina| is true. bool use_fd_for_storage = 6; // The owner of the vm. string owner_id = 7; } enum VmStatus { // Unknown status. VM_STATUS_UNKNOWN = 0; // The VM is already running. VM_STATUS_RUNNING = 1; // The VM is currently starting up. VM_STATUS_STARTING = 2; // The VM failed to startup. VM_STATUS_FAILURE = 3; } // Information sent back by vm_concierge in response to a StartVm dbus message. message StartVmResponse { // If true, the VM was started successfully. |vm_info| will have non-default // values only if this is true. bool success = 1; // If the VM failed to start, the reason for the failure. string failure_reason = 2; // Information about the VM that was started, if successful. VmInfo vm_info = 3; // Status of the VM. If VM_STATUS_RUNNING, it is not necessary to wait for a // TremplinStartedSignal before starting a container in the VM. VmStatus status = 4; } // Information that must be included with every StopVm dbus message. message StopVmRequest { // The name of the VM to be stopped. string name = 1; // The owner of the vm. string owner_id = 2; } // Response sent back by vm_concierge when it receives a StopVm dbus message. message StopVmResponse { // If true, the requested VM was stopped. bool success = 1; // The failure_reason if the requested VM could not be stopped. string failure_reason = 2; } // Request for information about the VM. message GetVmInfoRequest { // The name of the VM to query. string name = 1; // The owner of the vm. string owner_id = 2; } // Response sent back by vm_concierge for a GetVmInfo dbus message. message GetVmInfoResponse { // If true, the requested VM exists and info was returned. bool success = 1; // Information about the VM that was requested. VmInfo vm_info = 2; } // The type of storage location for a disk image. enum StorageLocation { // Subdirectory under /home/root/<id>/crosvm. STORAGE_CRYPTOHOME_ROOT = 0; // The user's Downloads directory, under /home/user/<id>/Downloads. STORAGE_CRYPTOHOME_DOWNLOADS = 1; } enum DiskImageStatus { // Unknown status. DISK_STATUS_UNKNOWN = 0; // The disk image was created. DISK_STATUS_CREATED = 1; // The disk already existed. DISK_STATUS_EXISTS = 2; // Unable to create the disk image. DISK_STATUS_FAILED = 3; // Specified Disk does not exist. DISK_STATUS_DOES_NOT_EXIST = 4; // The specified disk was destroyed. DISK_STATUS_DESTROYED = 5; } // Request to concierge to create a disk image. message CreateDiskImageRequest { // The cryptohome id for the user's encrypted storage. string cryptohome_id = 1; // The path to the disk image. This must be a relative path, and any // directories must already exist. string disk_path = 2; // The logical size of the new disk image, in bytes. uint64 disk_size = 3; // The type of disk image to be created. DiskImageType image_type = 4; // The storage location for the disk image. StorageLocation storage_location = 5; } // Response to a CreateDiskImageRequest. message CreateDiskImageResponse { // If true, the disk image has been successfully created. DiskImageStatus status = 1; // The absolute path to the created disk image, if it was successfully // created or already existed. string disk_path = 2; // The failure reason if the disk image could not be created or doesn't exist. string failure_reason = 3; } // Request to concierge to destroy a disk image. message DestroyDiskImageRequest { // The cryptohome id for the user's encrypted storage. string cryptohome_id = 1; // The path to the disk image. This must be a relative path. string disk_path = 2; // The storage location for the disk image. StorageLocation storage_location = 3; } // Response to a DestroyDiskImageRequest. message DestroyDiskImageResponse { // If DISK_STATUS_DESTROYED, the disk image has been successfully destroyed. // If DISK_STATUS_DOES_NOT_EXIST, the disk image had already been removed. DiskImageStatus status = 1; // The failure reason if the disk image could not be destroyed or doesn't exist. string failure_reason = 3; } // Request to concierge to export a disk image. // Must be accompanied by an FD. The contents of `disk_path` will be written to // the passed FD. message ExportDiskImageRequest { // The cryptohome id for the user's encrypted storage. string cryptohome_id = 1; // The path to the disk image. This must be a relative path. string disk_path = 2; } // Response to a ExportDiskImageRequest. message ExportDiskImageResponse { // If DISK_STATUS_CREATED, the disk image has been successfully exported. DiskImageStatus status = 1; // The failure reason if the disk image could not be exported. string failure_reason = 2; } // Request to list all VM disk images in the given storage area. message ListVmDisksRequest { // The cryptohome id for the user's encrypted storage. string cryptohome_id = 1; // The storage location to check. StorageLocation storage_location = 2; } // Response to ListVmDisks { message ListVmDisksResponse { // If true, the images array is valid. bool success = 1; // List of disk images. repeated string images = 2; // The failure reason if the disks could not be listed. string failure_reason = 3; // The total size in bytes on disk of the disk images in the response. uint64 total_size = 4; } // Message used in the signal for when a container has failed to start up. message ContainerStartedSignal { // Name of the VM the container is in. string vm_name = 1; // Name of the container within the VM. string container_name = 2; // The owner of the vm and container. string owner_id = 3; } // Request to start a specified container image within a VM. If the container // does not exist in the VM it will be created. Used with the StartContainer // D-Bus message into vm_concierge. message StartContainerRequest { // Name of the VM to start the container in. string vm_name = 1; // Name of the container to start within the VM. If empty, the default // container name will be used. string container_name = 2; // Username for the default user in the container. This is only used if the // container has not been created yet. string container_username = 3; // Async mode is always used now. bool async = 4 [deprecated=true]; // The cryptohome id for the user's encrypted storage. This is used for SSH // key storage. string cryptohome_id = 5; } enum ContainerStatus { // Unknown status. CONTAINER_STATUS_UNKNOWN = 0; // The container is already running. CONTAINER_STATUS_RUNNING = 1; // The container is currently starting up. CONTAINER_STATUS_STARTING = 2; // The container failed to startup. CONTAINER_STATUS_FAILURE = 3; } // Response sent back by vm_concierge when it receives a StartContaienr D-Bus // message. message StartContainerResponse { // Use the status field instead. bool success = 1 [deprecated=true]; // The failure_reason if the status is CONTAINER_STATUS_FAILURE. string failure_reason = 2; // The status of the container as a result of the StartContainer call. If the // status is CONTAINER_STATUS_STARTING then a D-Bus signal will be sent to // indicate whether success or failure occurred. The signal should be // registered for before the StartContainer call is made because it may be // sent before the call returns. ContainerStatus status = 3; } // Request to get the SSH keys associated with the host and a specific // container for the GetContainerSshKeys call. These keys will be generated // when StartContainer is called the first time for a container, so this should // not be called until after that call is invoked. message ContainerSshKeysRequest { // Name of the VM to target. string vm_name = 1; // Name of the container within the VM to target, if empty the default // container name will be used. string container_name = 2; // The cryptohome id for the user's encrypted storage. string cryptohome_id = 3; } // Response sent back by vm_concierge when it receives a GetContainerSshKeys // call. If either of the keys do not exist, the empty string will be set for // that value. message ContainerSshKeysResponse { // Public key of the container for verification of it as a known host. This // will be a single line string equivalent to the contents in the ssh-keygen // generated file. string container_public_key = 1; // Private key for the host, counterpart to the public key which is stored in // the container as an authorized host. This will be a multiline string that // is equivalent to the contents in the ssh-keygen generated file. This will // be the same for all VMs/containers. string host_private_key = 2; // The hostname of the container. string hostname = 3; // Public key of the host for verification of it as a known host. This // will be a single line string equivalent to the contents in the ssh-keygen // generated file. string host_public_key = 4; // Private key for the container, counterpart to the public key which is // stored in the container. This will be a multiline string that // is equivalent to the contents in the ssh-keygen generated file. This is // unique for each container. string container_private_key = 5; }