a73x

internal/pb/sync.pb.go

Ref:   Size: 66.8 KiB   History

// Code generated by protoc-gen-go. DO NOT EDIT.
// versions:
// 	protoc-gen-go v1.36.11
// 	protoc        v7.35.1
// source: proto/eitri/v1/sync.proto

package pb

import (
	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
	reflect "reflect"
	sync "sync"
	unsafe "unsafe"
)

const (
	// Verify that this generated code is sufficiently up-to-date.
	_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
	// Verify that runtime/protoimpl is sufficiently up-to-date.
	_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
)

type AgentMessage struct {
	state protoimpl.MessageState `protogen:"open.v1"`
	// Types that are valid to be assigned to Msg:
	//
	//	*AgentMessage_Hello
	//	*AgentMessage_Report
	//	*AgentMessage_ConsoleOpened
	//	*AgentMessage_TcpOpened
	Msg           isAgentMessage_Msg `protobuf_oneof:"msg"`
	unknownFields protoimpl.UnknownFields
	sizeCache     protoimpl.SizeCache
}

func (x *AgentMessage) Reset() {
	*x = AgentMessage{}
	mi := &file_proto_eitri_v1_sync_proto_msgTypes[0]
	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
	ms.StoreMessageInfo(mi)
}

func (x *AgentMessage) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*AgentMessage) ProtoMessage() {}

func (x *AgentMessage) ProtoReflect() protoreflect.Message {
	mi := &file_proto_eitri_v1_sync_proto_msgTypes[0]
	if x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use AgentMessage.ProtoReflect.Descriptor instead.
func (*AgentMessage) Descriptor() ([]byte, []int) {
	return file_proto_eitri_v1_sync_proto_rawDescGZIP(), []int{0}
}

func (x *AgentMessage) GetMsg() isAgentMessage_Msg {
	if x != nil {
		return x.Msg
	}
	return nil
}

func (x *AgentMessage) GetHello() *Hello {
	if x != nil {
		if x, ok := x.Msg.(*AgentMessage_Hello); ok {
			return x.Hello
		}
	}
	return nil
}

func (x *AgentMessage) GetReport() *Report {
	if x != nil {
		if x, ok := x.Msg.(*AgentMessage_Report); ok {
			return x.Report
		}
	}
	return nil
}

func (x *AgentMessage) GetConsoleOpened() *ConsoleOpened {
	if x != nil {
		if x, ok := x.Msg.(*AgentMessage_ConsoleOpened); ok {
			return x.ConsoleOpened
		}
	}
	return nil
}

func (x *AgentMessage) GetTcpOpened() *TCPOpened {
	if x != nil {
		if x, ok := x.Msg.(*AgentMessage_TcpOpened); ok {
			return x.TcpOpened
		}
	}
	return nil
}

type isAgentMessage_Msg interface {
	isAgentMessage_Msg()
}

type AgentMessage_Hello struct {
	Hello *Hello `protobuf:"bytes,1,opt,name=hello,proto3,oneof"`
}

type AgentMessage_Report struct {
	Report *Report `protobuf:"bytes,2,opt,name=report,proto3,oneof"`
}

type AgentMessage_ConsoleOpened struct {
	ConsoleOpened *ConsoleOpened `protobuf:"bytes,3,opt,name=console_opened,json=consoleOpened,proto3,oneof"`
}

type AgentMessage_TcpOpened struct {
	TcpOpened *TCPOpened `protobuf:"bytes,4,opt,name=tcp_opened,json=tcpOpened,proto3,oneof"`
}

func (*AgentMessage_Hello) isAgentMessage_Msg() {}

func (*AgentMessage_Report) isAgentMessage_Msg() {}

func (*AgentMessage_ConsoleOpened) isAgentMessage_Msg() {}

func (*AgentMessage_TcpOpened) isAgentMessage_Msg() {}

type ServerMessage struct {
	state protoimpl.MessageState `protogen:"open.v1"`
	// Types that are valid to be assigned to Msg:
	//
	//	*ServerMessage_Snapshot
	//	*ServerMessage_ConsoleOpen
	//	*ServerMessage_TcpOpen
	Msg           isServerMessage_Msg `protobuf_oneof:"msg"`
	unknownFields protoimpl.UnknownFields
	sizeCache     protoimpl.SizeCache
}

func (x *ServerMessage) Reset() {
	*x = ServerMessage{}
	mi := &file_proto_eitri_v1_sync_proto_msgTypes[1]
	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
	ms.StoreMessageInfo(mi)
}

func (x *ServerMessage) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*ServerMessage) ProtoMessage() {}

func (x *ServerMessage) ProtoReflect() protoreflect.Message {
	mi := &file_proto_eitri_v1_sync_proto_msgTypes[1]
	if x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use ServerMessage.ProtoReflect.Descriptor instead.
func (*ServerMessage) Descriptor() ([]byte, []int) {
	return file_proto_eitri_v1_sync_proto_rawDescGZIP(), []int{1}
}

func (x *ServerMessage) GetMsg() isServerMessage_Msg {
	if x != nil {
		return x.Msg
	}
	return nil
}

func (x *ServerMessage) GetSnapshot() *Snapshot {
	if x != nil {
		if x, ok := x.Msg.(*ServerMessage_Snapshot); ok {
			return x.Snapshot
		}
	}
	return nil
}

func (x *ServerMessage) GetConsoleOpen() *ConsoleOpen {
	if x != nil {
		if x, ok := x.Msg.(*ServerMessage_ConsoleOpen); ok {
			return x.ConsoleOpen
		}
	}
	return nil
}

func (x *ServerMessage) GetTcpOpen() *TCPOpen {
	if x != nil {
		if x, ok := x.Msg.(*ServerMessage_TcpOpen); ok {
			return x.TcpOpen
		}
	}
	return nil
}

type isServerMessage_Msg interface {
	isServerMessage_Msg()
}

type ServerMessage_Snapshot struct {
	Snapshot *Snapshot `protobuf:"bytes,1,opt,name=snapshot,proto3,oneof"`
}

type ServerMessage_ConsoleOpen struct {
	ConsoleOpen *ConsoleOpen `protobuf:"bytes,2,opt,name=console_open,json=consoleOpen,proto3,oneof"`
}

type ServerMessage_TcpOpen struct {
	TcpOpen *TCPOpen `protobuf:"bytes,3,opt,name=tcp_open,json=tcpOpen,proto3,oneof"`
}

func (*ServerMessage_Snapshot) isServerMessage_Msg() {}

func (*ServerMessage_ConsoleOpen) isServerMessage_Msg() {}

func (*ServerMessage_TcpOpen) isServerMessage_Msg() {}

type Hello struct {
	state       protoimpl.MessageState `protogen:"open.v1"`
	HostId      string                 `protobuf:"bytes,1,opt,name=host_id,json=hostId,proto3" json:"host_id,omitempty"`
	Hostname    string                 `protobuf:"bytes,2,opt,name=hostname,proto3" json:"hostname,omitempty"`
	Os          string                 `protobuf:"bytes,3,opt,name=os,proto3" json:"os,omitempty"`
	Arch        string                 `protobuf:"bytes,4,opt,name=arch,proto3" json:"arch,omitempty"`
	Provisioner string                 `protobuf:"bytes,5,opt,name=provisioner,proto3" json:"provisioner,omitempty"` // "cloudhv"
	// Report.guest_cidr.
	LastSeenEpoch uint64     `protobuf:"varint,7,opt,name=last_seen_epoch,json=lastSeenEpoch,proto3" json:"last_seen_epoch,omitempty"` // for the restore runbook
	Capacity      *Capacity  `protobuf:"bytes,8,opt,name=capacity,proto3" json:"capacity,omitempty"`
	Credential    string     `protobuf:"bytes,9,opt,name=credential,proto3" json:"credential,omitempty"` // Bearer host credential, verified in first frame
	Facts         *HostFacts `protobuf:"bytes,10,opt,name=facts,proto3" json:"facts,omitempty"`          // best-effort static host identity; refreshed each Hello
	// The named guest networks this host is configured to serve
	// (--host-network name=bridge), names only. In Hello rather than the
	// report because the set changes only with agent configuration, i.e. a
	// restart. Empty for a Mac, and for a Linux host with none configured.
	HostNetworks  []string `protobuf:"bytes,11,rep,name=host_networks,json=hostNetworks,proto3" json:"host_networks,omitempty"`
	unknownFields protoimpl.UnknownFields
	sizeCache     protoimpl.SizeCache
}

func (x *Hello) Reset() {
	*x = Hello{}
	mi := &file_proto_eitri_v1_sync_proto_msgTypes[2]
	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
	ms.StoreMessageInfo(mi)
}

func (x *Hello) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*Hello) ProtoMessage() {}

func (x *Hello) ProtoReflect() protoreflect.Message {
	mi := &file_proto_eitri_v1_sync_proto_msgTypes[2]
	if x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use Hello.ProtoReflect.Descriptor instead.
func (*Hello) Descriptor() ([]byte, []int) {
	return file_proto_eitri_v1_sync_proto_rawDescGZIP(), []int{2}
}

func (x *Hello) GetHostId() string {
	if x != nil {
		return x.HostId
	}
	return ""
}

func (x *Hello) GetHostname() string {
	if x != nil {
		return x.Hostname
	}
	return ""
}

func (x *Hello) GetOs() string {
	if x != nil {
		return x.Os
	}
	return ""
}

func (x *Hello) GetArch() string {
	if x != nil {
		return x.Arch
	}
	return ""
}

func (x *Hello) GetProvisioner() string {
	if x != nil {
		return x.Provisioner
	}
	return ""
}

func (x *Hello) GetLastSeenEpoch() uint64 {
	if x != nil {
		return x.LastSeenEpoch
	}
	return 0
}

func (x *Hello) GetCapacity() *Capacity {
	if x != nil {
		return x.Capacity
	}
	return nil
}

func (x *Hello) GetCredential() string {
	if x != nil {
		return x.Credential
	}
	return ""
}

func (x *Hello) GetFacts() *HostFacts {
	if x != nil {
		return x.Facts
	}
	return nil
}

func (x *Hello) GetHostNetworks() []string {
	if x != nil {
		return x.HostNetworks
	}
	return nil
}

type Capacity struct {
	state         protoimpl.MessageState `protogen:"open.v1"`
	Vcpus         int64                  `protobuf:"varint,1,opt,name=vcpus,proto3" json:"vcpus,omitempty"`
	MemMb         int64                  `protobuf:"varint,2,opt,name=mem_mb,json=memMb,proto3" json:"mem_mb,omitempty"`
	DiskGb        int64                  `protobuf:"varint,3,opt,name=disk_gb,json=diskGb,proto3" json:"disk_gb,omitempty"`
	unknownFields protoimpl.UnknownFields
	sizeCache     protoimpl.SizeCache
}

func (x *Capacity) Reset() {
	*x = Capacity{}
	mi := &file_proto_eitri_v1_sync_proto_msgTypes[3]
	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
	ms.StoreMessageInfo(mi)
}

func (x *Capacity) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*Capacity) ProtoMessage() {}

func (x *Capacity) ProtoReflect() protoreflect.Message {
	mi := &file_proto_eitri_v1_sync_proto_msgTypes[3]
	if x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use Capacity.ProtoReflect.Descriptor instead.
func (*Capacity) Descriptor() ([]byte, []int) {
	return file_proto_eitri_v1_sync_proto_rawDescGZIP(), []int{3}
}

func (x *Capacity) GetVcpus() int64 {
	if x != nil {
		return x.Vcpus
	}
	return 0
}

func (x *Capacity) GetMemMb() int64 {
	if x != nil {
		return x.MemMb
	}
	return 0
}

func (x *Capacity) GetDiskGb() int64 {
	if x != nil {
		return x.DiskGb
	}
	return 0
}

// HostFacts is slow-changing host identity, gathered best-effort by the agent.
// Every field is empty when its source can't be read.
type HostFacts struct {
	state         protoimpl.MessageState `protogen:"open.v1"`
	OsId          string                 `protobuf:"bytes,1,opt,name=os_id,json=osId,proto3" json:"os_id,omitempty"`                         // /etc/os-release ID, e.g. "debian"
	OsPretty      string                 `protobuf:"bytes,2,opt,name=os_pretty,json=osPretty,proto3" json:"os_pretty,omitempty"`             // PRETTY_NAME, e.g. "Debian GNU/Linux 12 (bookworm)"
	OsVersion     string                 `protobuf:"bytes,3,opt,name=os_version,json=osVersion,proto3" json:"os_version,omitempty"`          // VERSION_ID, e.g. "12"
	Kernel        string                 `protobuf:"bytes,4,opt,name=kernel,proto3" json:"kernel,omitempty"`                                 // kernel release, e.g. "6.1.0-18-amd64"
	CpuModel      string                 `protobuf:"bytes,5,opt,name=cpu_model,json=cpuModel,proto3" json:"cpu_model,omitempty"`             // /proc/cpuinfo model name
	Virt          string                 `protobuf:"bytes,6,opt,name=virt,proto3" json:"virt,omitempty"`                                     // systemd-detect-virt: "kvm" | "none" | "" (unknown)
	AgentVersion  string                 `protobuf:"bytes,7,opt,name=agent_version,json=agentVersion,proto3" json:"agent_version,omitempty"` // the agent binary's stamped version ("dev" unstamped)
	unknownFields protoimpl.UnknownFields
	sizeCache     protoimpl.SizeCache
}

func (x *HostFacts) Reset() {
	*x = HostFacts{}
	mi := &file_proto_eitri_v1_sync_proto_msgTypes[4]
	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
	ms.StoreMessageInfo(mi)
}

func (x *HostFacts) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*HostFacts) ProtoMessage() {}

func (x *HostFacts) ProtoReflect() protoreflect.Message {
	mi := &file_proto_eitri_v1_sync_proto_msgTypes[4]
	if x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use HostFacts.ProtoReflect.Descriptor instead.
func (*HostFacts) Descriptor() ([]byte, []int) {
	return file_proto_eitri_v1_sync_proto_rawDescGZIP(), []int{4}
}

func (x *HostFacts) GetOsId() string {
	if x != nil {
		return x.OsId
	}
	return ""
}

func (x *HostFacts) GetOsPretty() string {
	if x != nil {
		return x.OsPretty
	}
	return ""
}

func (x *HostFacts) GetOsVersion() string {
	if x != nil {
		return x.OsVersion
	}
	return ""
}

func (x *HostFacts) GetKernel() string {
	if x != nil {
		return x.Kernel
	}
	return ""
}

func (x *HostFacts) GetCpuModel() string {
	if x != nil {
		return x.CpuModel
	}
	return ""
}

func (x *HostFacts) GetVirt() string {
	if x != nil {
		return x.Virt
	}
	return ""
}

func (x *HostFacts) GetAgentVersion() string {
	if x != nil {
		return x.AgentVersion
	}
	return ""
}

// HostMetrics is live measured host utilization, refreshed each report. It is
// NOT persisted — it lives only in the registry while the host is online.
type HostMetrics struct {
	state          protoimpl.MessageState `protogen:"open.v1"`
	UptimeS        int64                  `protobuf:"varint,1,opt,name=uptime_s,json=uptimeS,proto3" json:"uptime_s,omitempty"`
	MemUsedMb      int64                  `protobuf:"varint,2,opt,name=mem_used_mb,json=memUsedMb,proto3" json:"mem_used_mb,omitempty"`
	MemAvailableMb int64                  `protobuf:"varint,3,opt,name=mem_available_mb,json=memAvailableMb,proto3" json:"mem_available_mb,omitempty"`
	Load1          float64                `protobuf:"fixed64,4,opt,name=load1,proto3" json:"load1,omitempty"` // 1-min load average (whole machine)
	Load5          float64                `protobuf:"fixed64,5,opt,name=load5,proto3" json:"load5,omitempty"`
	Load15         float64                `protobuf:"fixed64,6,opt,name=load15,proto3" json:"load15,omitempty"`
	DiskUsedGb     int64                  `protobuf:"varint,7,opt,name=disk_used_gb,json=diskUsedGb,proto3" json:"disk_used_gb,omitempty"`
	DiskFreeGb     int64                  `protobuf:"varint,8,opt,name=disk_free_gb,json=diskFreeGb,proto3" json:"disk_free_gb,omitempty"`
	unknownFields  protoimpl.UnknownFields
	sizeCache      protoimpl.SizeCache
}

func (x *HostMetrics) Reset() {
	*x = HostMetrics{}
	mi := &file_proto_eitri_v1_sync_proto_msgTypes[5]
	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
	ms.StoreMessageInfo(mi)
}

func (x *HostMetrics) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*HostMetrics) ProtoMessage() {}

func (x *HostMetrics) ProtoReflect() protoreflect.Message {
	mi := &file_proto_eitri_v1_sync_proto_msgTypes[5]
	if x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use HostMetrics.ProtoReflect.Descriptor instead.
func (*HostMetrics) Descriptor() ([]byte, []int) {
	return file_proto_eitri_v1_sync_proto_rawDescGZIP(), []int{5}
}

func (x *HostMetrics) GetUptimeS() int64 {
	if x != nil {
		return x.UptimeS
	}
	return 0
}

func (x *HostMetrics) GetMemUsedMb() int64 {
	if x != nil {
		return x.MemUsedMb
	}
	return 0
}

func (x *HostMetrics) GetMemAvailableMb() int64 {
	if x != nil {
		return x.MemAvailableMb
	}
	return 0
}

func (x *HostMetrics) GetLoad1() float64 {
	if x != nil {
		return x.Load1
	}
	return 0
}

func (x *HostMetrics) GetLoad5() float64 {
	if x != nil {
		return x.Load5
	}
	return 0
}

func (x *HostMetrics) GetLoad15() float64 {
	if x != nil {
		return x.Load15
	}
	return 0
}

func (x *HostMetrics) GetDiskUsedGb() int64 {
	if x != nil {
		return x.DiskUsedGb
	}
	return 0
}

func (x *HostMetrics) GetDiskFreeGb() int64 {
	if x != nil {
		return x.DiskFreeGb
	}
	return 0
}

// VMStatus is the half of a VM its host owns: what it observed, never what it
// was told. One VM, two halves — VMSpec travels down in a Snapshot, VMStatus
// travels back in a Report, and the control plane holds both on one row.
type VMStatus struct {
	state protoimpl.MessageState `protogen:"open.v1"`
	VmId  string                 `protobuf:"bytes,1,opt,name=vm_id,json=vmId,proto3" json:"vm_id,omitempty"`
	// As observed on the host, never as asked for: VMSpec.power_state carries
	// the request, and the two disagreeing is what converge exists to fix.
	PowerState string `protobuf:"bytes,2,opt,name=power_state,json=powerState,proto3" json:"power_state,omitempty"` // "running"|"stopped"
	Phase      string `protobuf:"bytes,3,opt,name=phase,proto3" json:"phase,omitempty"`                             // "creating"|"ready"|"failed"|"quarantined"
	Ip         string `protobuf:"bytes,4,opt,name=ip,proto3" json:"ip,omitempty"`                                   // the guest's address on its host's NAT underlay — every guest has one, from boot
	LastError  string `protobuf:"bytes,5,opt,name=last_error,json=lastError,proto3" json:"last_error,omitempty"`
	// The guest's ed25519 HOST public key. It is generated on the host, and the
	// private half never leaves it — this is the only half that travels. Sent on
	// every report for as long as the VM exists (level-triggered), so a lost
	// snapshot or a control-plane restart re-certifies without operator action.
	SshHostPubkey string `protobuf:"bytes,6,opt,name=ssh_host_pubkey,json=sshHostPubkey,proto3" json:"ssh_host_pubkey,omitempty"`
	// What this VM's host is doing about it right now, in the host's own words:
	// "downloading image 1.2/3.7 GiB", "preparing root disk", "booting". A create
	// is minutes of work behind one word, and the host is the only thing that can
	// see inside it — the control plane knows the VM is creating and nothing more.
	//
	// Free text for display, never parsed. Empty is the normal state of a settled
	// VM and means only "nothing to add": an agent that predates this field sends
	// it never, and a console reading it reads exactly what it read before.
	StatusDetail string `protobuf:"bytes,7,opt,name=status_detail,json=statusDetail,proto3" json:"status_detail,omitempty"`
	// The address the site's DHCP server granted this guest on its SECOND NIC,
	// the one attached to the named host network its spec asked for (see
	// VMSpec.network). Empty for the guests that have no such NIC — the
	// majority — and for one DHCP round-trip after a networked guest boots,
	// because the host learns it by watching the exchange rather than granting
	// it. Never a substitute for ip: that one is known before the guest is even
	// running, which is why the gate path uses it and this field never appears
	// there.
	NetworkIp     string `protobuf:"bytes,8,opt,name=network_ip,json=networkIp,proto3" json:"network_ip,omitempty"`
	unknownFields protoimpl.UnknownFields
	sizeCache     protoimpl.SizeCache
}

func (x *VMStatus) Reset() {
	*x = VMStatus{}
	mi := &file_proto_eitri_v1_sync_proto_msgTypes[6]
	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
	ms.StoreMessageInfo(mi)
}

func (x *VMStatus) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*VMStatus) ProtoMessage() {}

func (x *VMStatus) ProtoReflect() protoreflect.Message {
	mi := &file_proto_eitri_v1_sync_proto_msgTypes[6]
	if x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use VMStatus.ProtoReflect.Descriptor instead.
func (*VMStatus) Descriptor() ([]byte, []int) {
	return file_proto_eitri_v1_sync_proto_rawDescGZIP(), []int{6}
}

func (x *VMStatus) GetVmId() string {
	if x != nil {
		return x.VmId
	}
	return ""
}

func (x *VMStatus) GetPowerState() string {
	if x != nil {
		return x.PowerState
	}
	return ""
}

func (x *VMStatus) GetPhase() string {
	if x != nil {
		return x.Phase
	}
	return ""
}

func (x *VMStatus) GetIp() string {
	if x != nil {
		return x.Ip
	}
	return ""
}

func (x *VMStatus) GetLastError() string {
	if x != nil {
		return x.LastError
	}
	return ""
}

func (x *VMStatus) GetSshHostPubkey() string {
	if x != nil {
		return x.SshHostPubkey
	}
	return ""
}

func (x *VMStatus) GetStatusDetail() string {
	if x != nil {
		return x.StatusDetail
	}
	return ""
}

func (x *VMStatus) GetNetworkIp() string {
	if x != nil {
		return x.NetworkIp
	}
	return ""
}

type QuarantinedVM struct {
	state         protoimpl.MessageState `protogen:"open.v1"`
	VmId          string                 `protobuf:"bytes,1,opt,name=vm_id,json=vmId,proto3" json:"vm_id,omitempty"`
	Name          string                 `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"`
	VmspecJson    []byte                 `protobuf:"bytes,3,opt,name=vmspec_json,json=vmspecJson,proto3" json:"vmspec_json,omitempty"` // full VMSpec — only surviving copy after a DB restore
	DestroyAtUnix int64                  `protobuf:"varint,4,opt,name=destroy_at_unix,json=destroyAtUnix,proto3" json:"destroy_at_unix,omitempty"`
	unknownFields protoimpl.UnknownFields
	sizeCache     protoimpl.SizeCache
}

func (x *QuarantinedVM) Reset() {
	*x = QuarantinedVM{}
	mi := &file_proto_eitri_v1_sync_proto_msgTypes[7]
	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
	ms.StoreMessageInfo(mi)
}

func (x *QuarantinedVM) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*QuarantinedVM) ProtoMessage() {}

func (x *QuarantinedVM) ProtoReflect() protoreflect.Message {
	mi := &file_proto_eitri_v1_sync_proto_msgTypes[7]
	if x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use QuarantinedVM.ProtoReflect.Descriptor instead.
func (*QuarantinedVM) Descriptor() ([]byte, []int) {
	return file_proto_eitri_v1_sync_proto_rawDescGZIP(), []int{7}
}

func (x *QuarantinedVM) GetVmId() string {
	if x != nil {
		return x.VmId
	}
	return ""
}

func (x *QuarantinedVM) GetName() string {
	if x != nil {
		return x.Name
	}
	return ""
}

func (x *QuarantinedVM) GetVmspecJson() []byte {
	if x != nil {
		return x.VmspecJson
	}
	return nil
}

func (x *QuarantinedVM) GetDestroyAtUnix() int64 {
	if x != nil {
		return x.DestroyAtUnix
	}
	return 0
}

// Report is what one host observes, level-triggered: the status of every VM
// and exposure it holds, and the host's own numbers.
type Report struct {
	state protoimpl.MessageState `protogen:"open.v1"`
	Vms   []*VMStatus            `protobuf:"bytes,1,rep,name=vms,proto3" json:"vms,omitempty"`
	// LEVEL-TRIGGERED destroy ack: ALL tombstoned vm_ids with no local
	// record/disk/process, repeated every report until hard-deleted server-side.
	Destroyed      []string         `protobuf:"bytes,2,rep,name=destroyed,proto3" json:"destroyed,omitempty"`
	Quarantined    []*QuarantinedVM `protobuf:"bytes,3,rep,name=quarantined,proto3" json:"quarantined,omitempty"`
	Capacity       *Capacity        `protobuf:"bytes,4,opt,name=capacity,proto3" json:"capacity,omitempty"`
	FenceViolation bool             `protobuf:"varint,5,opt,name=fence_violation,json=fenceViolation,proto3" json:"fence_violation,omitempty"`
	LastSeenEpoch  uint64           `protobuf:"varint,6,opt,name=last_seen_epoch,json=lastSeenEpoch,proto3" json:"last_seen_epoch,omitempty"`
	Metrics        *HostMetrics     `protobuf:"bytes,7,opt,name=metrics,proto3" json:"metrics,omitempty"` // live measured host utilization (heartbeat)
	// The subnet this host's guests are on, as the HOST observes it. Empty means
	// "not yet known", never "no network" — a host that cannot answer leaves the
	// fleet's record alone rather than erasing it.
	//
	// In the report rather than Hello because it can change while an agent stays
	// connected (an admin edits the host's network), and on some platforms is not
	// knowable at connect time at all. Capacity is in both messages for the same
	// reason: an opening value, then the ongoing truth.
	GuestCidr string            `protobuf:"bytes,8,opt,name=guest_cidr,json=guestCidr,proto3" json:"guest_cidr,omitempty"`
	Exposures []*ExposureStatus `protobuf:"bytes,9,rep,name=exposures,proto3" json:"exposures,omitempty"`
	// The address this host presents on the network it reaches the control
	// plane over — the address an operator dials to reach a published guest
	// port. Empty means "not yet known", never "no address": a host that cannot
	// answer leaves the fleet's record alone rather than erasing it. In the
	// report rather than Hello for the same reason guest_cidr is: it can change
	// while an agent stays connected.
	HostUplinkAddr string          `protobuf:"bytes,10,opt,name=host_uplink_addr,json=hostUplinkAddr,proto3" json:"host_uplink_addr,omitempty"`
	Volumes        []*VolumeStatus `protobuf:"bytes,11,rep,name=volumes,proto3" json:"volumes,omitempty"`
	unknownFields  protoimpl.UnknownFields
	sizeCache      protoimpl.SizeCache
}

func (x *Report) Reset() {
	*x = Report{}
	mi := &file_proto_eitri_v1_sync_proto_msgTypes[8]
	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
	ms.StoreMessageInfo(mi)
}

func (x *Report) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*Report) ProtoMessage() {}

func (x *Report) ProtoReflect() protoreflect.Message {
	mi := &file_proto_eitri_v1_sync_proto_msgTypes[8]
	if x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use Report.ProtoReflect.Descriptor instead.
func (*Report) Descriptor() ([]byte, []int) {
	return file_proto_eitri_v1_sync_proto_rawDescGZIP(), []int{8}
}

func (x *Report) GetVms() []*VMStatus {
	if x != nil {
		return x.Vms
	}
	return nil
}

func (x *Report) GetDestroyed() []string {
	if x != nil {
		return x.Destroyed
	}
	return nil
}

func (x *Report) GetQuarantined() []*QuarantinedVM {
	if x != nil {
		return x.Quarantined
	}
	return nil
}

func (x *Report) GetCapacity() *Capacity {
	if x != nil {
		return x.Capacity
	}
	return nil
}

func (x *Report) GetFenceViolation() bool {
	if x != nil {
		return x.FenceViolation
	}
	return false
}

func (x *Report) GetLastSeenEpoch() uint64 {
	if x != nil {
		return x.LastSeenEpoch
	}
	return 0
}

func (x *Report) GetMetrics() *HostMetrics {
	if x != nil {
		return x.Metrics
	}
	return nil
}

func (x *Report) GetGuestCidr() string {
	if x != nil {
		return x.GuestCidr
	}
	return ""
}

func (x *Report) GetExposures() []*ExposureStatus {
	if x != nil {
		return x.Exposures
	}
	return nil
}

func (x *Report) GetHostUplinkAddr() string {
	if x != nil {
		return x.HostUplinkAddr
	}
	return ""
}

func (x *Report) GetVolumes() []*VolumeStatus {
	if x != nil {
		return x.Volumes
	}
	return nil
}

// VMSpec is the half of a VM the control plane owns. See VMStatus.
type VMSpec struct {
	state       protoimpl.MessageState `protogen:"open.v1"`
	VmId        string                 `protobuf:"bytes,1,opt,name=vm_id,json=vmId,proto3" json:"vm_id,omitempty"`
	Name        string                 `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"`
	ImageUrl    string                 `protobuf:"bytes,3,opt,name=image_url,json=imageUrl,proto3" json:"image_url,omitempty"`
	ImageSha256 string                 `protobuf:"bytes,4,opt,name=image_sha256,json=imageSha256,proto3" json:"image_sha256,omitempty"`
	CloudInit   string                 `protobuf:"bytes,5,opt,name=cloud_init,json=cloudInit,proto3" json:"cloud_init,omitempty"` // user-data YAML, may be empty
	Vcpus       int64                  `protobuf:"varint,6,opt,name=vcpus,proto3" json:"vcpus,omitempty"`
	MemMb       int64                  `protobuf:"varint,7,opt,name=mem_mb,json=memMb,proto3" json:"mem_mb,omitempty"`
	DiskGb      int64                  `protobuf:"varint,8,opt,name=disk_gb,json=diskGb,proto3" json:"disk_gb,omitempty"`
	// Always true, and read by nobody in this tree — the control plane sets it
	// unconditionally and the agent no longer branches on it, because every VM is
	// persistent. It cannot be reserved yet: this is a restart policy whose
	// absence means "ephemeral", and an agent at or below v0.0.5 reads the proto3
	// default as exactly that, marking a guest failed forever the first time its
	// host reboots. It comes out in the first release that cannot meet a v0.0.5
	// agent — the same fielded-version reasoning internal/server/release applies
	// to the pre-CSR floor — and its number is reserved when it goes.
	Persistent       bool   `protobuf:"varint,9,opt,name=persistent,proto3" json:"persistent,omitempty"`
	PowerState       string `protobuf:"bytes,10,opt,name=power_state,json=powerState,proto3" json:"power_state,omitempty"` // "running"|"stopped"
	Tombstoned       bool   `protobuf:"varint,11,opt,name=tombstoned,proto3" json:"tombstoned,omitempty"`                  // present-but-tombstoned (drives quarantine + destroyed[])
	SshAuthorizedKey string `protobuf:"bytes,12,opt,name=ssh_authorized_key,json=sshAuthorizedKey,proto3" json:"ssh_authorized_key,omitempty"`
	// The certificate the control plane signed for the public key the host
	// reported in VMStatus.ssh_host_pubkey (authorized_keys form); seed installs
	// it as /etc/ssh/ssh_host_ed25519_key-cert.pub. Empty until the round trip
	// completes, and forever when the jump gate is off.
	SshHostCert             string   `protobuf:"bytes,17,opt,name=ssh_host_cert,json=sshHostCert,proto3" json:"ssh_host_cert,omitempty"`
	SshUserCaAuthorizedKeys []string `protobuf:"bytes,18,rep,name=ssh_user_ca_authorized_keys,json=sshUserCaAuthorizedKeys,proto3" json:"ssh_user_ca_authorized_keys,omitempty"` // the VM's tenant user-CA set (canonical authorized_keys lines); seed writes them all into TrustedUserCAKeys. Empty when the gate is off / tenant has none.
	// The fleet has an SSH CA, so this guest must present a certified host key.
	// A host that has reported its public key waits here until the certificate
	// arrives rather than booting a guest that clients would refuse. Without it
	// the agent could not tell "the gate is off, boot uncertified" from "your
	// certificate has not come back yet" — both are an empty ssh_host_cert.
	HostCertRequired bool `protobuf:"varint,19,opt,name=host_cert_required,json=hostCertRequired,proto3" json:"host_cert_required,omitempty"`
	// The named host network this guest attaches to, or "" for the host's
	// NAT'd private bridge (the default, and the only behavior agents before
	// this field know). A name is only ever placed on a host that advertised
	// it (see Hello.host_networks); an agent that has the name but no longer
	// the configuration fails the VM legibly rather than silently NAT-ing it.
	Network string `protobuf:"bytes,20,opt,name=network,proto3" json:"network,omitempty"`
	// volume_ids are the bound volumes to attach after root and seed, in this
	// order — the first is /dev/vdc. Every id names a VolumeSpec in the same
	// snapshot.
	VolumeIds     []string `protobuf:"bytes,21,rep,name=volume_ids,json=volumeIds,proto3" json:"volume_ids,omitempty"`
	unknownFields protoimpl.UnknownFields
	sizeCache     protoimpl.SizeCache
}

func (x *VMSpec) Reset() {
	*x = VMSpec{}
	mi := &file_proto_eitri_v1_sync_proto_msgTypes[9]
	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
	ms.StoreMessageInfo(mi)
}

func (x *VMSpec) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*VMSpec) ProtoMessage() {}

func (x *VMSpec) ProtoReflect() protoreflect.Message {
	mi := &file_proto_eitri_v1_sync_proto_msgTypes[9]
	if x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use VMSpec.ProtoReflect.Descriptor instead.
func (*VMSpec) Descriptor() ([]byte, []int) {
	return file_proto_eitri_v1_sync_proto_rawDescGZIP(), []int{9}
}

func (x *VMSpec) GetVmId() string {
	if x != nil {
		return x.VmId
	}
	return ""
}

func (x *VMSpec) GetName() string {
	if x != nil {
		return x.Name
	}
	return ""
}

func (x *VMSpec) GetImageUrl() string {
	if x != nil {
		return x.ImageUrl
	}
	return ""
}

func (x *VMSpec) GetImageSha256() string {
	if x != nil {
		return x.ImageSha256
	}
	return ""
}

func (x *VMSpec) GetCloudInit() string {
	if x != nil {
		return x.CloudInit
	}
	return ""
}

func (x *VMSpec) GetVcpus() int64 {
	if x != nil {
		return x.Vcpus
	}
	return 0
}

func (x *VMSpec) GetMemMb() int64 {
	if x != nil {
		return x.MemMb
	}
	return 0
}

func (x *VMSpec) GetDiskGb() int64 {
	if x != nil {
		return x.DiskGb
	}
	return 0
}

func (x *VMSpec) GetPersistent() bool {
	if x != nil {
		return x.Persistent
	}
	return false
}

func (x *VMSpec) GetPowerState() string {
	if x != nil {
		return x.PowerState
	}
	return ""
}

func (x *VMSpec) GetTombstoned() bool {
	if x != nil {
		return x.Tombstoned
	}
	return false
}

func (x *VMSpec) GetSshAuthorizedKey() string {
	if x != nil {
		return x.SshAuthorizedKey
	}
	return ""
}

func (x *VMSpec) GetSshHostCert() string {
	if x != nil {
		return x.SshHostCert
	}
	return ""
}

func (x *VMSpec) GetSshUserCaAuthorizedKeys() []string {
	if x != nil {
		return x.SshUserCaAuthorizedKeys
	}
	return nil
}

func (x *VMSpec) GetHostCertRequired() bool {
	if x != nil {
		return x.HostCertRequired
	}
	return false
}

func (x *VMSpec) GetNetwork() string {
	if x != nil {
		return x.Network
	}
	return ""
}

func (x *VMSpec) GetVolumeIds() []string {
	if x != nil {
		return x.VolumeIds
	}
	return nil
}

// Snapshot is the FULL spec for one host; the agent converges toward it.
type Snapshot struct {
	state        protoimpl.MessageState `protogen:"open.v1"`
	Epoch        uint64                 `protobuf:"varint,1,opt,name=epoch,proto3" json:"epoch,omitempty"`                                  // agents refuse epoch < highest seen
	Vms          []*VMSpec              `protobuf:"bytes,2,rep,name=vms,proto3" json:"vms,omitempty"`                                       // FULL set for this host, including tombstoned
	AgentUpgrade *AgentUpgrade          `protobuf:"bytes,3,opt,name=agent_upgrade,json=agentUpgrade,proto3" json:"agent_upgrade,omitempty"` // optional operator-initiated agent self-upgrade
	Exposures    []*ExposureSpec        `protobuf:"bytes,4,rep,name=exposures,proto3" json:"exposures,omitempty"`                           // FULL set for this host
	Volumes      []*VolumeSpec          `protobuf:"bytes,5,rep,name=volumes,proto3" json:"volumes,omitempty"`                               // FULL set for this host
	// min_agent_version is the lowest agent release that understands every
	// field in this snapshot. An agent below it fails every VM here with a
	// legible reason rather than materialising a spec it only half-reads.
	// Empty means no floor. Agents from before this field ignore it.
	MinAgentVersion string `protobuf:"bytes,6,opt,name=min_agent_version,json=minAgentVersion,proto3" json:"min_agent_version,omitempty"`
	unknownFields   protoimpl.UnknownFields
	sizeCache       protoimpl.SizeCache
}

func (x *Snapshot) Reset() {
	*x = Snapshot{}
	mi := &file_proto_eitri_v1_sync_proto_msgTypes[10]
	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
	ms.StoreMessageInfo(mi)
}

func (x *Snapshot) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*Snapshot) ProtoMessage() {}

func (x *Snapshot) ProtoReflect() protoreflect.Message {
	mi := &file_proto_eitri_v1_sync_proto_msgTypes[10]
	if x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use Snapshot.ProtoReflect.Descriptor instead.
func (*Snapshot) Descriptor() ([]byte, []int) {
	return file_proto_eitri_v1_sync_proto_rawDescGZIP(), []int{10}
}

func (x *Snapshot) GetEpoch() uint64 {
	if x != nil {
		return x.Epoch
	}
	return 0
}

func (x *Snapshot) GetVms() []*VMSpec {
	if x != nil {
		return x.Vms
	}
	return nil
}

func (x *Snapshot) GetAgentUpgrade() *AgentUpgrade {
	if x != nil {
		return x.AgentUpgrade
	}
	return nil
}

func (x *Snapshot) GetExposures() []*ExposureSpec {
	if x != nil {
		return x.Exposures
	}
	return nil
}

func (x *Snapshot) GetVolumes() []*VolumeSpec {
	if x != nil {
		return x.Volumes
	}
	return nil
}

func (x *Snapshot) GetMinAgentVersion() string {
	if x != nil {
		return x.MinAgentVersion
	}
	return ""
}

// AgentUpgrade asks the agent to replace its own binary: download url, verify
// sha256, swap atomically (keeping .prev), re-exec. Present only on hosts an
// operator explicitly clicked; absent otherwise. An agent already running
// version treats it as a no-op.
type AgentUpgrade struct {
	state         protoimpl.MessageState `protogen:"open.v1"`
	Version       string                 `protobuf:"bytes,1,opt,name=version,proto3" json:"version,omitempty"` // target version (matches Hello facts.agent_version when done)
	Url           string                 `protobuf:"bytes,2,opt,name=url,proto3" json:"url,omitempty"`         // artifact URL (https, from the release manifest)
	Sha256        string                 `protobuf:"bytes,3,opt,name=sha256,proto3" json:"sha256,omitempty"`   // artifact sha256 (hex)
	unknownFields protoimpl.UnknownFields
	sizeCache     protoimpl.SizeCache
}

func (x *AgentUpgrade) Reset() {
	*x = AgentUpgrade{}
	mi := &file_proto_eitri_v1_sync_proto_msgTypes[11]
	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
	ms.StoreMessageInfo(mi)
}

func (x *AgentUpgrade) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*AgentUpgrade) ProtoMessage() {}

func (x *AgentUpgrade) ProtoReflect() protoreflect.Message {
	mi := &file_proto_eitri_v1_sync_proto_msgTypes[11]
	if x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use AgentUpgrade.ProtoReflect.Descriptor instead.
func (*AgentUpgrade) Descriptor() ([]byte, []int) {
	return file_proto_eitri_v1_sync_proto_rawDescGZIP(), []int{11}
}

func (x *AgentUpgrade) GetVersion() string {
	if x != nil {
		return x.Version
	}
	return ""
}

func (x *AgentUpgrade) GetUrl() string {
	if x != nil {
		return x.Url
	}
	return ""
}

func (x *AgentUpgrade) GetSha256() string {
	if x != nil {
		return x.Sha256
	}
	return ""
}

// ConsoleOpen is the first frame on a server-initiated console stream: it names
// the VM whose serial console the stream should bridge. After the agent's
// ConsoleOpened reply, the stream carries RAW serial bytes (no framing).
type ConsoleOpen struct {
	state         protoimpl.MessageState `protogen:"open.v1"`
	VmId          string                 `protobuf:"bytes,1,opt,name=vm_id,json=vmId,proto3" json:"vm_id,omitempty"`
	unknownFields protoimpl.UnknownFields
	sizeCache     protoimpl.SizeCache
}

func (x *ConsoleOpen) Reset() {
	*x = ConsoleOpen{}
	mi := &file_proto_eitri_v1_sync_proto_msgTypes[12]
	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
	ms.StoreMessageInfo(mi)
}

func (x *ConsoleOpen) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*ConsoleOpen) ProtoMessage() {}

func (x *ConsoleOpen) ProtoReflect() protoreflect.Message {
	mi := &file_proto_eitri_v1_sync_proto_msgTypes[12]
	if x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use ConsoleOpen.ProtoReflect.Descriptor instead.
func (*ConsoleOpen) Descriptor() ([]byte, []int) {
	return file_proto_eitri_v1_sync_proto_rawDescGZIP(), []int{12}
}

func (x *ConsoleOpen) GetVmId() string {
	if x != nil {
		return x.VmId
	}
	return ""
}

// ConsoleOpened is the agent's reply on the console stream. ok=false carries a
// human-readable error (unknown VM, VM not running, console unsupported) and
// the stream is then closed by the agent.
type ConsoleOpened struct {
	state         protoimpl.MessageState `protogen:"open.v1"`
	Ok            bool                   `protobuf:"varint,1,opt,name=ok,proto3" json:"ok,omitempty"`
	Error         string                 `protobuf:"bytes,2,opt,name=error,proto3" json:"error,omitempty"`
	unknownFields protoimpl.UnknownFields
	sizeCache     protoimpl.SizeCache
}

func (x *ConsoleOpened) Reset() {
	*x = ConsoleOpened{}
	mi := &file_proto_eitri_v1_sync_proto_msgTypes[13]
	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
	ms.StoreMessageInfo(mi)
}

func (x *ConsoleOpened) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*ConsoleOpened) ProtoMessage() {}

func (x *ConsoleOpened) ProtoReflect() protoreflect.Message {
	mi := &file_proto_eitri_v1_sync_proto_msgTypes[13]
	if x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use ConsoleOpened.ProtoReflect.Descriptor instead.
func (*ConsoleOpened) Descriptor() ([]byte, []int) {
	return file_proto_eitri_v1_sync_proto_rawDescGZIP(), []int{13}
}

func (x *ConsoleOpened) GetOk() bool {
	if x != nil {
		return x.Ok
	}
	return false
}

func (x *ConsoleOpened) GetError() string {
	if x != nil {
		return x.Error
	}
	return ""
}

// TCPOpen is the first frame on a server-initiated tunnel stream: it names the
// VM and the guest TCP port the stream should bridge to. After the agent's
// TCPOpened reply, the stream carries RAW TCP bytes (no framing).
type TCPOpen struct {
	state         protoimpl.MessageState `protogen:"open.v1"`
	VmId          string                 `protobuf:"bytes,1,opt,name=vm_id,json=vmId,proto3" json:"vm_id,omitempty"`
	Port          uint32                 `protobuf:"varint,2,opt,name=port,proto3" json:"port,omitempty"`
	unknownFields protoimpl.UnknownFields
	sizeCache     protoimpl.SizeCache
}

func (x *TCPOpen) Reset() {
	*x = TCPOpen{}
	mi := &file_proto_eitri_v1_sync_proto_msgTypes[14]
	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
	ms.StoreMessageInfo(mi)
}

func (x *TCPOpen) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*TCPOpen) ProtoMessage() {}

func (x *TCPOpen) ProtoReflect() protoreflect.Message {
	mi := &file_proto_eitri_v1_sync_proto_msgTypes[14]
	if x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use TCPOpen.ProtoReflect.Descriptor instead.
func (*TCPOpen) Descriptor() ([]byte, []int) {
	return file_proto_eitri_v1_sync_proto_rawDescGZIP(), []int{14}
}

func (x *TCPOpen) GetVmId() string {
	if x != nil {
		return x.VmId
	}
	return ""
}

func (x *TCPOpen) GetPort() uint32 {
	if x != nil {
		return x.Port
	}
	return 0
}

// TCPOpened is the agent's reply on the tunnel stream. ok=false carries a
// human-readable error (unknown VM, VM not running, dial refused) and the
// stream is then closed by the agent.
type TCPOpened struct {
	state         protoimpl.MessageState `protogen:"open.v1"`
	Ok            bool                   `protobuf:"varint,1,opt,name=ok,proto3" json:"ok,omitempty"`
	Error         string                 `protobuf:"bytes,2,opt,name=error,proto3" json:"error,omitempty"`
	unknownFields protoimpl.UnknownFields
	sizeCache     protoimpl.SizeCache
}

func (x *TCPOpened) Reset() {
	*x = TCPOpened{}
	mi := &file_proto_eitri_v1_sync_proto_msgTypes[15]
	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
	ms.StoreMessageInfo(mi)
}

func (x *TCPOpened) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*TCPOpened) ProtoMessage() {}

func (x *TCPOpened) ProtoReflect() protoreflect.Message {
	mi := &file_proto_eitri_v1_sync_proto_msgTypes[15]
	if x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use TCPOpened.ProtoReflect.Descriptor instead.
func (*TCPOpened) Descriptor() ([]byte, []int) {
	return file_proto_eitri_v1_sync_proto_rawDescGZIP(), []int{15}
}

func (x *TCPOpened) GetOk() bool {
	if x != nil {
		return x.Ok
	}
	return false
}

func (x *TCPOpened) GetError() string {
	if x != nil {
		return x.Error
	}
	return ""
}

// ExposureSpec is one published guest port a host should be serving: bind
// host_port on the host, pipe every accepted connection (or every datagram)
// to guest_port inside the guest. It rides the snapshot at TOP LEVEL rather
// than nested in VMSpec, because exposures are their own objects converging
// on their own cadence — an exposure can be created while its VM is still
// imaging, and it binds immediately.
type ExposureSpec struct {
	state         protoimpl.MessageState `protogen:"open.v1"`
	Id            string                 `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"`
	VmId          string                 `protobuf:"bytes,2,opt,name=vm_id,json=vmId,proto3" json:"vm_id,omitempty"`
	GuestPort     uint32                 `protobuf:"varint,3,opt,name=guest_port,json=guestPort,proto3" json:"guest_port,omitempty"`
	HostPort      uint32                 `protobuf:"varint,4,opt,name=host_port,json=hostPort,proto3" json:"host_port,omitempty"`
	Protocol      string                 `protobuf:"bytes,5,opt,name=protocol,proto3" json:"protocol,omitempty"` // "tcp"|"udp"
	unknownFields protoimpl.UnknownFields
	sizeCache     protoimpl.SizeCache
}

func (x *ExposureSpec) Reset() {
	*x = ExposureSpec{}
	mi := &file_proto_eitri_v1_sync_proto_msgTypes[16]
	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
	ms.StoreMessageInfo(mi)
}

func (x *ExposureSpec) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*ExposureSpec) ProtoMessage() {}

func (x *ExposureSpec) ProtoReflect() protoreflect.Message {
	mi := &file_proto_eitri_v1_sync_proto_msgTypes[16]
	if x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use ExposureSpec.ProtoReflect.Descriptor instead.
func (*ExposureSpec) Descriptor() ([]byte, []int) {
	return file_proto_eitri_v1_sync_proto_rawDescGZIP(), []int{16}
}

func (x *ExposureSpec) GetId() string {
	if x != nil {
		return x.Id
	}
	return ""
}

func (x *ExposureSpec) GetVmId() string {
	if x != nil {
		return x.VmId
	}
	return ""
}

func (x *ExposureSpec) GetGuestPort() uint32 {
	if x != nil {
		return x.GuestPort
	}
	return 0
}

func (x *ExposureSpec) GetHostPort() uint32 {
	if x != nil {
		return x.HostPort
	}
	return 0
}

func (x *ExposureSpec) GetProtocol() string {
	if x != nil {
		return x.Protocol
	}
	return ""
}

// ExposureStatus is one exposure's state as its host observes it: "active"
// once the host socket is bound, "failed" with the OS error otherwise.
// "active" means the HOST half of the pipe exists — whether anything answers
// inside the guest is the guest's half, and this does not pretend otherwise.
type ExposureStatus struct {
	state         protoimpl.MessageState `protogen:"open.v1"`
	Id            string                 `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"`
	State         string                 `protobuf:"bytes,2,opt,name=state,proto3" json:"state,omitempty"`   // "active"|"failed"
	Reason        string                 `protobuf:"bytes,3,opt,name=reason,proto3" json:"reason,omitempty"` // the OS error, when failed; a bound port's ongoing trouble otherwise
	Sessions      *ExposureSessions      `protobuf:"bytes,4,opt,name=sessions,proto3" json:"sessions,omitempty"`
	unknownFields protoimpl.UnknownFields
	sizeCache     protoimpl.SizeCache
}

func (x *ExposureStatus) Reset() {
	*x = ExposureStatus{}
	mi := &file_proto_eitri_v1_sync_proto_msgTypes[17]
	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
	ms.StoreMessageInfo(mi)
}

func (x *ExposureStatus) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*ExposureStatus) ProtoMessage() {}

func (x *ExposureStatus) ProtoReflect() protoreflect.Message {
	mi := &file_proto_eitri_v1_sync_proto_msgTypes[17]
	if x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use ExposureStatus.ProtoReflect.Descriptor instead.
func (*ExposureStatus) Descriptor() ([]byte, []int) {
	return file_proto_eitri_v1_sync_proto_rawDescGZIP(), []int{17}
}

func (x *ExposureStatus) GetId() string {
	if x != nil {
		return x.Id
	}
	return ""
}

func (x *ExposureStatus) GetState() string {
	if x != nil {
		return x.State
	}
	return ""
}

func (x *ExposureStatus) GetReason() string {
	if x != nil {
		return x.Reason
	}
	return ""
}

func (x *ExposureStatus) GetSessions() *ExposureSessions {
	if x != nil {
		return x.Sessions
	}
	return nil
}

// ExposureSessions is what one published port has carried since the agent
// serving it started: what it holds this instant, and what it has turned away
// or could not carry along the way.
//
// The two totals only ever go up, deliberately. Loss on a published port is
// intermittent — a burst at the cap, a guest that went away for a second — and
// a gauge sampled once per report would show a clean zero for every one of
// those bursts, which reads as a port with nothing wrong. A running total
// cannot hide a burst it has already counted.
//
// A MESSAGE rather than three scalars beside the state, so that its absence is
// readable. An agent that predates these counters reports none, which is not
// the same fact as an exposure that has counted zero; the console says nothing
// rather than presenting a zero it was never told.
type ExposureSessions struct {
	state protoimpl.MessageState `protogen:"open.v1"`
	// active is what the port holds right now — spliced TCP connections, or live
	// UDP client sessions. The one gauge here, and the only number that goes down.
	Active int64 `protobuf:"varint,1,opt,name=active,proto3" json:"active,omitempty"`
	// refused counts callers turned away because the port was already at its cap:
	// a TCP connection accepted and closed, a UDP datagram dropped without
	// starting a session.
	Refused int64 `protobuf:"varint,2,opt,name=refused,proto3" json:"refused,omitempty"`
	// dropped counts conversations this host could not carry to the guest — no
	// guest address yet, a dial the guest refused, a datagram that would not send
	// — as opposed to ones the cap refused.
	Dropped       int64 `protobuf:"varint,3,opt,name=dropped,proto3" json:"dropped,omitempty"`
	unknownFields protoimpl.UnknownFields
	sizeCache     protoimpl.SizeCache
}

func (x *ExposureSessions) Reset() {
	*x = ExposureSessions{}
	mi := &file_proto_eitri_v1_sync_proto_msgTypes[18]
	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
	ms.StoreMessageInfo(mi)
}

func (x *ExposureSessions) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*ExposureSessions) ProtoMessage() {}

func (x *ExposureSessions) ProtoReflect() protoreflect.Message {
	mi := &file_proto_eitri_v1_sync_proto_msgTypes[18]
	if x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use ExposureSessions.ProtoReflect.Descriptor instead.
func (*ExposureSessions) Descriptor() ([]byte, []int) {
	return file_proto_eitri_v1_sync_proto_rawDescGZIP(), []int{18}
}

func (x *ExposureSessions) GetActive() int64 {
	if x != nil {
		return x.Active
	}
	return 0
}

func (x *ExposureSessions) GetRefused() int64 {
	if x != nil {
		return x.Refused
	}
	return 0
}

func (x *ExposureSessions) GetDropped() int64 {
	if x != nil {
		return x.Dropped
	}
	return 0
}

// VolumeSpec is one volume the control plane has placed on this host. The
// agent keeps a sparse raw file for it at volumes/<volume_id>/disk.raw, beside
// vms/ and never inside a VM's directory: a VM's directory dies with the VM,
// a volume's does not. Snapshot.volumes is the FULL set for the host.
type VolumeSpec struct {
	state         protoimpl.MessageState `protogen:"open.v1"`
	VolumeId      string                 `protobuf:"bytes,1,opt,name=volume_id,json=volumeId,proto3" json:"volume_id,omitempty"`
	SizeGb        int64                  `protobuf:"varint,2,opt,name=size_gb,json=sizeGb,proto3" json:"size_gb,omitempty"`
	Tombstoned    bool                   `protobuf:"varint,3,opt,name=tombstoned,proto3" json:"tombstoned,omitempty"` // delete the file after grace; set only once no VM references it
	unknownFields protoimpl.UnknownFields
	sizeCache     protoimpl.SizeCache
}

func (x *VolumeSpec) Reset() {
	*x = VolumeSpec{}
	mi := &file_proto_eitri_v1_sync_proto_msgTypes[19]
	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
	ms.StoreMessageInfo(mi)
}

func (x *VolumeSpec) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*VolumeSpec) ProtoMessage() {}

func (x *VolumeSpec) ProtoReflect() protoreflect.Message {
	mi := &file_proto_eitri_v1_sync_proto_msgTypes[19]
	if x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use VolumeSpec.ProtoReflect.Descriptor instead.
func (*VolumeSpec) Descriptor() ([]byte, []int) {
	return file_proto_eitri_v1_sync_proto_rawDescGZIP(), []int{19}
}

func (x *VolumeSpec) GetVolumeId() string {
	if x != nil {
		return x.VolumeId
	}
	return ""
}

func (x *VolumeSpec) GetSizeGb() int64 {
	if x != nil {
		return x.SizeGb
	}
	return 0
}

func (x *VolumeSpec) GetTombstoned() bool {
	if x != nil {
		return x.Tombstoned
	}
	return false
}

// VolumeStatus is what the host found on its disk for one volume id —
// including ids the snapshot did not name, which are reported and kept.
type VolumeStatus struct {
	state         protoimpl.MessageState `protogen:"open.v1"`
	VolumeId      string                 `protobuf:"bytes,1,opt,name=volume_id,json=volumeId,proto3" json:"volume_id,omitempty"`
	Present       bool                   `protobuf:"varint,2,opt,name=present,proto3" json:"present,omitempty"`
	SizeGb        int64                  `protobuf:"varint,3,opt,name=size_gb,json=sizeGb,proto3" json:"size_gb,omitempty"` // as found, not as asked: a guest filesystem sits on it, so it is never resized
	unknownFields protoimpl.UnknownFields
	sizeCache     protoimpl.SizeCache
}

func (x *VolumeStatus) Reset() {
	*x = VolumeStatus{}
	mi := &file_proto_eitri_v1_sync_proto_msgTypes[20]
	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
	ms.StoreMessageInfo(mi)
}

func (x *VolumeStatus) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*VolumeStatus) ProtoMessage() {}

func (x *VolumeStatus) ProtoReflect() protoreflect.Message {
	mi := &file_proto_eitri_v1_sync_proto_msgTypes[20]
	if x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use VolumeStatus.ProtoReflect.Descriptor instead.
func (*VolumeStatus) Descriptor() ([]byte, []int) {
	return file_proto_eitri_v1_sync_proto_rawDescGZIP(), []int{20}
}

func (x *VolumeStatus) GetVolumeId() string {
	if x != nil {
		return x.VolumeId
	}
	return ""
}

func (x *VolumeStatus) GetPresent() bool {
	if x != nil {
		return x.Present
	}
	return false
}

func (x *VolumeStatus) GetSizeGb() int64 {
	if x != nil {
		return x.SizeGb
	}
	return 0
}

var File_proto_eitri_v1_sync_proto protoreflect.FileDescriptor

const file_proto_eitri_v1_sync_proto_rawDesc = "" +
	"\n" +
	"\x19proto/eitri/v1/sync.proto\x12\beitri.v1\"\xe2\x01\n" +
	"\fAgentMessage\x12'\n" +
	"\x05hello\x18\x01 \x01(\v2\x0f.eitri.v1.HelloH\x00R\x05hello\x12*\n" +
	"\x06report\x18\x02 \x01(\v2\x10.eitri.v1.ReportH\x00R\x06report\x12@\n" +
	"\x0econsole_opened\x18\x03 \x01(\v2\x17.eitri.v1.ConsoleOpenedH\x00R\rconsoleOpened\x124\n" +
	"\n" +
	"tcp_opened\x18\x04 \x01(\v2\x13.eitri.v1.TCPOpenedH\x00R\ttcpOpenedB\x05\n" +
	"\x03msg\"\xb4\x01\n" +
	"\rServerMessage\x120\n" +
	"\bsnapshot\x18\x01 \x01(\v2\x12.eitri.v1.SnapshotH\x00R\bsnapshot\x12:\n" +
	"\fconsole_open\x18\x02 \x01(\v2\x15.eitri.v1.ConsoleOpenH\x00R\vconsoleOpen\x12.\n" +
	"\btcp_open\x18\x03 \x01(\v2\x11.eitri.v1.TCPOpenH\x00R\atcpOpenB\x05\n" +
	"\x03msg\"\xdd\x02\n" +
	"\x05Hello\x12\x17\n" +
	"\ahost_id\x18\x01 \x01(\tR\x06hostId\x12\x1a\n" +
	"\bhostname\x18\x02 \x01(\tR\bhostname\x12\x0e\n" +
	"\x02os\x18\x03 \x01(\tR\x02os\x12\x12\n" +
	"\x04arch\x18\x04 \x01(\tR\x04arch\x12 \n" +
	"\vprovisioner\x18\x05 \x01(\tR\vprovisioner\x12&\n" +
	"\x0flast_seen_epoch\x18\a \x01(\x04R\rlastSeenEpoch\x12.\n" +
	"\bcapacity\x18\b \x01(\v2\x12.eitri.v1.CapacityR\bcapacity\x12\x1e\n" +
	"\n" +
	"credential\x18\t \x01(\tR\n" +
	"credential\x12)\n" +
	"\x05facts\x18\n" +
	" \x01(\v2\x13.eitri.v1.HostFactsR\x05facts\x12#\n" +
	"\rhost_networks\x18\v \x03(\tR\fhostNetworksJ\x04\b\x06\x10\aR\vbridge_cidr\"P\n" +
	"\bCapacity\x12\x14\n" +
	"\x05vcpus\x18\x01 \x01(\x03R\x05vcpus\x12\x15\n" +
	"\x06mem_mb\x18\x02 \x01(\x03R\x05memMb\x12\x17\n" +
	"\adisk_gb\x18\x03 \x01(\x03R\x06diskGb\"\xca\x01\n" +
	"\tHostFacts\x12\x13\n" +
	"\x05os_id\x18\x01 \x01(\tR\x04osId\x12\x1b\n" +
	"\tos_pretty\x18\x02 \x01(\tR\bosPretty\x12\x1d\n" +
	"\n" +
	"os_version\x18\x03 \x01(\tR\tosVersion\x12\x16\n" +
	"\x06kernel\x18\x04 \x01(\tR\x06kernel\x12\x1b\n" +
	"\tcpu_model\x18\x05 \x01(\tR\bcpuModel\x12\x12\n" +
	"\x04virt\x18\x06 \x01(\tR\x04virt\x12#\n" +
	"\ragent_version\x18\a \x01(\tR\fagentVersion\"\xfa\x01\n" +
	"\vHostMetrics\x12\x19\n" +
	"\buptime_s\x18\x01 \x01(\x03R\auptimeS\x12\x1e\n" +
	"\vmem_used_mb\x18\x02 \x01(\x03R\tmemUsedMb\x12(\n" +
	"\x10mem_available_mb\x18\x03 \x01(\x03R\x0ememAvailableMb\x12\x14\n" +
	"\x05load1\x18\x04 \x01(\x01R\x05load1\x12\x14\n" +
	"\x05load5\x18\x05 \x01(\x01R\x05load5\x12\x16\n" +
	"\x06load15\x18\x06 \x01(\x01R\x06load15\x12 \n" +
	"\fdisk_used_gb\x18\a \x01(\x03R\n" +
	"diskUsedGb\x12 \n" +
	"\fdisk_free_gb\x18\b \x01(\x03R\n" +
	"diskFreeGb\"\xf1\x01\n" +
	"\bVMStatus\x12\x13\n" +
	"\x05vm_id\x18\x01 \x01(\tR\x04vmId\x12\x1f\n" +
	"\vpower_state\x18\x02 \x01(\tR\n" +
	"powerState\x12\x14\n" +
	"\x05phase\x18\x03 \x01(\tR\x05phase\x12\x0e\n" +
	"\x02ip\x18\x04 \x01(\tR\x02ip\x12\x1d\n" +
	"\n" +
	"last_error\x18\x05 \x01(\tR\tlastError\x12&\n" +
	"\x0fssh_host_pubkey\x18\x06 \x01(\tR\rsshHostPubkey\x12#\n" +
	"\rstatus_detail\x18\a \x01(\tR\fstatusDetail\x12\x1d\n" +
	"\n" +
	"network_ip\x18\b \x01(\tR\tnetworkIp\"\x81\x01\n" +
	"\rQuarantinedVM\x12\x13\n" +
	"\x05vm_id\x18\x01 \x01(\tR\x04vmId\x12\x12\n" +
	"\x04name\x18\x02 \x01(\tR\x04name\x12\x1f\n" +
	"\vvmspec_json\x18\x03 \x01(\fR\n" +
	"vmspecJson\x12&\n" +
	"\x0fdestroy_at_unix\x18\x04 \x01(\x03R\rdestroyAtUnix\"\xec\x03\n" +
	"\x06Report\x12$\n" +
	"\x03vms\x18\x01 \x03(\v2\x12.eitri.v1.VMStatusR\x03vms\x12\x1c\n" +
	"\tdestroyed\x18\x02 \x03(\tR\tdestroyed\x129\n" +
	"\vquarantined\x18\x03 \x03(\v2\x17.eitri.v1.QuarantinedVMR\vquarantined\x12.\n" +
	"\bcapacity\x18\x04 \x01(\v2\x12.eitri.v1.CapacityR\bcapacity\x12'\n" +
	"\x0ffence_violation\x18\x05 \x01(\bR\x0efenceViolation\x12&\n" +
	"\x0flast_seen_epoch\x18\x06 \x01(\x04R\rlastSeenEpoch\x12/\n" +
	"\ametrics\x18\a \x01(\v2\x15.eitri.v1.HostMetricsR\ametrics\x12\x1d\n" +
	"\n" +
	"guest_cidr\x18\b \x01(\tR\tguestCidr\x126\n" +
	"\texposures\x18\t \x03(\v2\x18.eitri.v1.ExposureStatusR\texposures\x12(\n" +
	"\x10host_uplink_addr\x18\n" +
	" \x01(\tR\x0ehostUplinkAddr\x120\n" +
	"\avolumes\x18\v \x03(\v2\x16.eitri.v1.VolumeStatusR\avolumes\"\xd8\x04\n" +
	"\x06VMSpec\x12\x13\n" +
	"\x05vm_id\x18\x01 \x01(\tR\x04vmId\x12\x12\n" +
	"\x04name\x18\x02 \x01(\tR\x04name\x12\x1b\n" +
	"\timage_url\x18\x03 \x01(\tR\bimageUrl\x12!\n" +
	"\fimage_sha256\x18\x04 \x01(\tR\vimageSha256\x12\x1d\n" +
	"\n" +
	"cloud_init\x18\x05 \x01(\tR\tcloudInit\x12\x14\n" +
	"\x05vcpus\x18\x06 \x01(\x03R\x05vcpus\x12\x15\n" +
	"\x06mem_mb\x18\a \x01(\x03R\x05memMb\x12\x17\n" +
	"\adisk_gb\x18\b \x01(\x03R\x06diskGb\x12\x1e\n" +
	"\n" +
	"persistent\x18\t \x01(\bR\n" +
	"persistent\x12\x1f\n" +
	"\vpower_state\x18\n" +
	" \x01(\tR\n" +
	"powerState\x12\x1e\n" +
	"\n" +
	"tombstoned\x18\v \x01(\bR\n" +
	"tombstoned\x12,\n" +
	"\x12ssh_authorized_key\x18\f \x01(\tR\x10sshAuthorizedKey\x12\"\n" +
	"\rssh_host_cert\x18\x11 \x01(\tR\vsshHostCert\x12<\n" +
	"\x1bssh_user_ca_authorized_keys\x18\x12 \x03(\tR\x17sshUserCaAuthorizedKeys\x12,\n" +
	"\x12host_cert_required\x18\x13 \x01(\bR\x10hostCertRequired\x12\x18\n" +
	"\anetwork\x18\x14 \x01(\tR\anetwork\x12\x1d\n" +
	"\n" +
	"volume_ids\x18\x15 \x03(\tR\tvolumeIdsJ\x04\b\r\x10\x0eJ\x04\b\x0e\x10\x0fJ\x04\b\x0f\x10\x10J\x04\b\x10\x10\x11R\x10ssh_host_key_pem\"\x93\x02\n" +
	"\bSnapshot\x12\x14\n" +
	"\x05epoch\x18\x01 \x01(\x04R\x05epoch\x12\"\n" +
	"\x03vms\x18\x02 \x03(\v2\x10.eitri.v1.VMSpecR\x03vms\x12;\n" +
	"\ragent_upgrade\x18\x03 \x01(\v2\x16.eitri.v1.AgentUpgradeR\fagentUpgrade\x124\n" +
	"\texposures\x18\x04 \x03(\v2\x16.eitri.v1.ExposureSpecR\texposures\x12.\n" +
	"\avolumes\x18\x05 \x03(\v2\x14.eitri.v1.VolumeSpecR\avolumes\x12*\n" +
	"\x11min_agent_version\x18\x06 \x01(\tR\x0fminAgentVersion\"R\n" +
	"\fAgentUpgrade\x12\x18\n" +
	"\aversion\x18\x01 \x01(\tR\aversion\x12\x10\n" +
	"\x03url\x18\x02 \x01(\tR\x03url\x12\x16\n" +
	"\x06sha256\x18\x03 \x01(\tR\x06sha256\"\"\n" +
	"\vConsoleOpen\x12\x13\n" +
	"\x05vm_id\x18\x01 \x01(\tR\x04vmId\"5\n" +
	"\rConsoleOpened\x12\x0e\n" +
	"\x02ok\x18\x01 \x01(\bR\x02ok\x12\x14\n" +
	"\x05error\x18\x02 \x01(\tR\x05error\"2\n" +
	"\aTCPOpen\x12\x13\n" +
	"\x05vm_id\x18\x01 \x01(\tR\x04vmId\x12\x12\n" +
	"\x04port\x18\x02 \x01(\rR\x04port\"1\n" +
	"\tTCPOpened\x12\x0e\n" +
	"\x02ok\x18\x01 \x01(\bR\x02ok\x12\x14\n" +
	"\x05error\x18\x02 \x01(\tR\x05error\"\x8b\x01\n" +
	"\fExposureSpec\x12\x0e\n" +
	"\x02id\x18\x01 \x01(\tR\x02id\x12\x13\n" +
	"\x05vm_id\x18\x02 \x01(\tR\x04vmId\x12\x1d\n" +
	"\n" +
	"guest_port\x18\x03 \x01(\rR\tguestPort\x12\x1b\n" +
	"\thost_port\x18\x04 \x01(\rR\bhostPort\x12\x1a\n" +
	"\bprotocol\x18\x05 \x01(\tR\bprotocol\"\x86\x01\n" +
	"\x0eExposureStatus\x12\x0e\n" +
	"\x02id\x18\x01 \x01(\tR\x02id\x12\x14\n" +
	"\x05state\x18\x02 \x01(\tR\x05state\x12\x16\n" +
	"\x06reason\x18\x03 \x01(\tR\x06reason\x126\n" +
	"\bsessions\x18\x04 \x01(\v2\x1a.eitri.v1.ExposureSessionsR\bsessions\"^\n" +
	"\x10ExposureSessions\x12\x16\n" +
	"\x06active\x18\x01 \x01(\x03R\x06active\x12\x18\n" +
	"\arefused\x18\x02 \x01(\x03R\arefused\x12\x18\n" +
	"\adropped\x18\x03 \x01(\x03R\adropped\"b\n" +
	"\n" +
	"VolumeSpec\x12\x1b\n" +
	"\tvolume_id\x18\x01 \x01(\tR\bvolumeId\x12\x17\n" +
	"\asize_gb\x18\x02 \x01(\x03R\x06sizeGb\x12\x1e\n" +
	"\n" +
	"tombstoned\x18\x03 \x01(\bR\n" +
	"tombstoned\"^\n" +
	"\fVolumeStatus\x12\x1b\n" +
	"\tvolume_id\x18\x01 \x01(\tR\bvolumeId\x12\x18\n" +
	"\apresent\x18\x02 \x01(\bR\apresent\x12\x17\n" +
	"\asize_gb\x18\x03 \x01(\x03R\x06sizeGbB&Z$github.com/a73x/eitri/internal/pb;pbb\x06proto3"

var (
	file_proto_eitri_v1_sync_proto_rawDescOnce sync.Once
	file_proto_eitri_v1_sync_proto_rawDescData []byte
)

func file_proto_eitri_v1_sync_proto_rawDescGZIP() []byte {
	file_proto_eitri_v1_sync_proto_rawDescOnce.Do(func() {
		file_proto_eitri_v1_sync_proto_rawDescData = protoimpl.X.CompressGZIP(unsafe.Slice(unsafe.StringData(file_proto_eitri_v1_sync_proto_rawDesc), len(file_proto_eitri_v1_sync_proto_rawDesc)))
	})
	return file_proto_eitri_v1_sync_proto_rawDescData
}

var file_proto_eitri_v1_sync_proto_msgTypes = make([]protoimpl.MessageInfo, 21)
var file_proto_eitri_v1_sync_proto_goTypes = []any{
	(*AgentMessage)(nil),     // 0: eitri.v1.AgentMessage
	(*ServerMessage)(nil),    // 1: eitri.v1.ServerMessage
	(*Hello)(nil),            // 2: eitri.v1.Hello
	(*Capacity)(nil),         // 3: eitri.v1.Capacity
	(*HostFacts)(nil),        // 4: eitri.v1.HostFacts
	(*HostMetrics)(nil),      // 5: eitri.v1.HostMetrics
	(*VMStatus)(nil),         // 6: eitri.v1.VMStatus
	(*QuarantinedVM)(nil),    // 7: eitri.v1.QuarantinedVM
	(*Report)(nil),           // 8: eitri.v1.Report
	(*VMSpec)(nil),           // 9: eitri.v1.VMSpec
	(*Snapshot)(nil),         // 10: eitri.v1.Snapshot
	(*AgentUpgrade)(nil),     // 11: eitri.v1.AgentUpgrade
	(*ConsoleOpen)(nil),      // 12: eitri.v1.ConsoleOpen
	(*ConsoleOpened)(nil),    // 13: eitri.v1.ConsoleOpened
	(*TCPOpen)(nil),          // 14: eitri.v1.TCPOpen
	(*TCPOpened)(nil),        // 15: eitri.v1.TCPOpened
	(*ExposureSpec)(nil),     // 16: eitri.v1.ExposureSpec
	(*ExposureStatus)(nil),   // 17: eitri.v1.ExposureStatus
	(*ExposureSessions)(nil), // 18: eitri.v1.ExposureSessions
	(*VolumeSpec)(nil),       // 19: eitri.v1.VolumeSpec
	(*VolumeStatus)(nil),     // 20: eitri.v1.VolumeStatus
}
var file_proto_eitri_v1_sync_proto_depIdxs = []int32{
	2,  // 0: eitri.v1.AgentMessage.hello:type_name -> eitri.v1.Hello
	8,  // 1: eitri.v1.AgentMessage.report:type_name -> eitri.v1.Report
	13, // 2: eitri.v1.AgentMessage.console_opened:type_name -> eitri.v1.ConsoleOpened
	15, // 3: eitri.v1.AgentMessage.tcp_opened:type_name -> eitri.v1.TCPOpened
	10, // 4: eitri.v1.ServerMessage.snapshot:type_name -> eitri.v1.Snapshot
	12, // 5: eitri.v1.ServerMessage.console_open:type_name -> eitri.v1.ConsoleOpen
	14, // 6: eitri.v1.ServerMessage.tcp_open:type_name -> eitri.v1.TCPOpen
	3,  // 7: eitri.v1.Hello.capacity:type_name -> eitri.v1.Capacity
	4,  // 8: eitri.v1.Hello.facts:type_name -> eitri.v1.HostFacts
	6,  // 9: eitri.v1.Report.vms:type_name -> eitri.v1.VMStatus
	7,  // 10: eitri.v1.Report.quarantined:type_name -> eitri.v1.QuarantinedVM
	3,  // 11: eitri.v1.Report.capacity:type_name -> eitri.v1.Capacity
	5,  // 12: eitri.v1.Report.metrics:type_name -> eitri.v1.HostMetrics
	17, // 13: eitri.v1.Report.exposures:type_name -> eitri.v1.ExposureStatus
	20, // 14: eitri.v1.Report.volumes:type_name -> eitri.v1.VolumeStatus
	9,  // 15: eitri.v1.Snapshot.vms:type_name -> eitri.v1.VMSpec
	11, // 16: eitri.v1.Snapshot.agent_upgrade:type_name -> eitri.v1.AgentUpgrade
	16, // 17: eitri.v1.Snapshot.exposures:type_name -> eitri.v1.ExposureSpec
	19, // 18: eitri.v1.Snapshot.volumes:type_name -> eitri.v1.VolumeSpec
	18, // 19: eitri.v1.ExposureStatus.sessions:type_name -> eitri.v1.ExposureSessions
	20, // [20:20] is the sub-list for method output_type
	20, // [20:20] is the sub-list for method input_type
	20, // [20:20] is the sub-list for extension type_name
	20, // [20:20] is the sub-list for extension extendee
	0,  // [0:20] is the sub-list for field type_name
}

func init() { file_proto_eitri_v1_sync_proto_init() }
func file_proto_eitri_v1_sync_proto_init() {
	if File_proto_eitri_v1_sync_proto != nil {
		return
	}
	file_proto_eitri_v1_sync_proto_msgTypes[0].OneofWrappers = []any{
		(*AgentMessage_Hello)(nil),
		(*AgentMessage_Report)(nil),
		(*AgentMessage_ConsoleOpened)(nil),
		(*AgentMessage_TcpOpened)(nil),
	}
	file_proto_eitri_v1_sync_proto_msgTypes[1].OneofWrappers = []any{
		(*ServerMessage_Snapshot)(nil),
		(*ServerMessage_ConsoleOpen)(nil),
		(*ServerMessage_TcpOpen)(nil),
	}
	type x struct{}
	out := protoimpl.TypeBuilder{
		File: protoimpl.DescBuilder{
			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
			RawDescriptor: unsafe.Slice(unsafe.StringData(file_proto_eitri_v1_sync_proto_rawDesc), len(file_proto_eitri_v1_sync_proto_rawDesc)),
			NumEnums:      0,
			NumMessages:   21,
			NumExtensions: 0,
			NumServices:   0,
		},
		GoTypes:           file_proto_eitri_v1_sync_proto_goTypes,
		DependencyIndexes: file_proto_eitri_v1_sync_proto_depIdxs,
		MessageInfos:      file_proto_eitri_v1_sync_proto_msgTypes,
	}.Build()
	File_proto_eitri_v1_sync_proto = out.File
	file_proto_eitri_v1_sync_proto_goTypes = nil
	file_proto_eitri_v1_sync_proto_depIdxs = nil
}