syntax = "proto3";
package virtbuf;

// import "google/protobuf/any.proto";
import "google/protobuf/timestamp.proto"; // Import the well-known type for Timestamp

message Droplets {
	string  uuid	        = 1;    // I guess why not just have this on each file
	string  version         = 2;    // maybe can be used for protobuf schema change violations
	repeated Droplet droplets = 3;
}

message Droplet {
	string          uuid	        = 1;       // should be unique across the cluster
	string	        hostname        = 2;       // should be unique and work in DNS
	int64	        cpus	        = 3;       // what's the point of int64 vs int32
	int64	        memory	        = 4;       // in bytes
	Current         current         = 5;       // what the state and values of the droplet is
	DropletState    start_state     = 6;       // what the state of the droplet is SUPPOSED TO BE ('on' or 'off')
	string	        qemu_machine    = 7;       // the qemu machine type to use "pc-q35-9.0"
        int64           spice_port      = 8;       // preferred port to use for spice

	string	 preferred_hypervisor   = 9;       // the hypervisor to prefer to run the droplet on
	string	 force_hypervisor       = 10;      // use this hypervisor and this hypervisor only
	string	 preferred_arch         = 11;      // the cpu arch to use "x86_64" (should really get this from the disk?)
	repeated Network networks       = 12;      // really just mac addresses. should be unique across cluster
	repeated Disk disks             = 13;      // disks to attach

	string          local_only      = 14;      // this is only defined locally on the hypervisor
	string          custom_xml      = 15;      // if needed,
	DropletArchive  archive         = 16;      // what the state of the droplet is SUPPOSED TO BE ('on' or 'off')
}

// volatile data. the current settings and values of things.
// These are passed around while the cluster to monitor and control the systems
// but they are not saved to the config file
message Current {
        DropletState                    state           = 1;    // used to track the current state before taking any action
        string                          hypervisor      = 2;    // the current hypervisor the droplet is running on
        int64                           start_attempts  = 3;    // how many times a start has been attempted
	string                          full_xml        = 4;    // the full libvirt xml to import
        google.protobuf.Timestamp       last_poll       = 5;    // the last time we heard anything from this droplet
        string                          image_url       = 6;    // url to the image
}

message Archive {
        DropletArchive                  reason          = 1;    // why the droplet was archived
        google.protobuf.Timestamp       when            = 2;    // when it was archived
}

// virtual machine state
enum DropletState {
	ON              = 0;
	OFF             = 1;
	UNKNOWN         = 2; // qemu says 'Shutdown'
	PAUSED          = 3;
	CRASHED         = 4;
	INMIGRATE       = 5;
}

enum DropletArchive {
	ARCHIVE_DUP     = 0;
	ARCHIVE_USER    = 1;
}

message Network {
	string	mac     = 1;
	string	name	= 2;
}

message Disk {
	string	filename        = 1;
	string	filepath        = 2;
	int64	size    	= 3;
	string	qemu_arch       = 4;       // what arch. example: "x86_64" or "riscv64"
}
