Repository: firecracker-microvm/firecracker-containerd
Pull request #174 (2019-04-25 22:11:53)

Generate both GRPC and TTRPC service definitions.
This will allow us to use the same proto definitions for both the external
facing API (which must be GRPC) and the internal facing API (which must be
ttrpc). For example, the FCControl plugin must accept GRPC requests from
clients, but now it can also make internal TTRPC requests to the shim using the
same API schema.

Signed-off-by: Erik Sipsma <sipsma@amazon.com>

By submitting this pull request, I confirm that my contribution is made under the terms of the Apache 2.0 license.



Patch:
diff --git a/Makefile b/Makefile
index 2a1f2cf..cc7298d 100644
--- a/Makefile
+++ b/Makefile
@@ -30,7 +30,7 @@ $(SUBDIRS):
 	$(MAKE) -C $@
 
 proto:
-	$(MAKE) -C proto/ proto
+	PATH=$(BINPATH):$(PATH) $(MAKE) -C proto/ proto
 
 clean:
 	for d in $(SUBDIRS); do $(MAKE) -C $$d clean; done
@@ -53,6 +53,7 @@ deps:
 	$(BINPATH)/golangci-lint --version
 	GOBIN=$(BINPATH) GO111MODULE=off go get -u github.com/vbatts/git-validation
 	GOBIN=$(BINPATH) GO111MODULE=off go get -u github.com/kunalkushwaha/ltag
+	GOBIN=$(BINPATH) GO111MODULE=off go get -u github.com/containerd/ttrpc/cmd/protoc-gen-gogottrpc
 
 runc-builder: runc-builder-stamp
 
diff --git a/agent/service.go b/agent/service.go
index 845a7a9..2d8488c 100644
--- a/agent/service.go
+++ b/agent/service.go
@@ -33,7 +33,7 @@ import (
 	"github.com/sirupsen/logrus"
 
 	"github.com/firecracker-microvm/firecracker-containerd/internal"
-	"github.com/firecracker-microvm/firecracker-containerd/proto"
+	proto "github.com/firecracker-microvm/firecracker-containerd/proto/grpc"
 )
 
 const (
diff --git a/examples/taskworkflow.go b/examples/taskworkflow.go
index baf2a0c..28cabe0 100644
--- a/examples/taskworkflow.go
+++ b/examples/taskworkflow.go
@@ -27,7 +27,7 @@ import (
 	"github.com/containerd/containerd/cio"
 	"github.com/containerd/containerd/namespaces"
 	"github.com/containerd/containerd/oci"
-	"github.com/firecracker-microvm/firecracker-containerd/proto"
+	proto "github.com/firecracker-microvm/firecracker-containerd/proto/grpc"
 	specs "github.com/opencontainers/runtime-spec/specs-go"
 	"github.com/pkg/errors"
 )
diff --git a/firecracker-control/helpers.go b/firecracker-control/helpers.go
index 2a4783d..696ced8 100644
--- a/firecracker-control/helpers.go
+++ b/firecracker-control/helpers.go
@@ -19,7 +19,7 @@ import (
 	"github.com/firecracker-microvm/firecracker-go-sdk"
 	models "github.com/firecracker-microvm/firecracker-go-sdk/client/models"
 
-	"github.com/firecracker-microvm/firecracker-containerd/proto"
+	proto "github.com/firecracker-microvm/firecracker-containerd/proto/grpc"
 )
 
 func machineConfigurationFromProto(req *proto.FirecrackerMachineConfiguration) models.MachineConfiguration {
diff --git a/firecracker-control/local.go b/firecracker-control/local.go
index 26a1306..b39e7f0 100644
--- a/firecracker-control/local.go
+++ b/firecracker-control/local.go
@@ -29,7 +29,7 @@ import (
 	"github.com/pkg/errors"
 	"github.com/sirupsen/logrus"
 
-	"github.com/firecracker-microvm/firecracker-containerd/proto"
+	proto "github.com/firecracker-microvm/firecracker-containerd/proto/grpc"
 )
 
 var (
diff --git a/firecracker-control/service.go b/firecracker-control/service.go
index 3587ac8..fda61e7 100644
--- a/firecracker-control/service.go
+++ b/firecracker-control/service.go
@@ -22,7 +22,7 @@ import (
 	"github.com/golang/protobuf/ptypes/empty"
 	"google.golang.org/grpc"
 
-	"github.com/firecracker-microvm/firecracker-containerd/proto"
+	proto "github.com/firecracker-microvm/firecracker-containerd/proto/grpc"
 )
 
 func init() {
diff --git a/proto/Makefile b/proto/Makefile
index 625b831..1215f23 100644
--- a/proto/Makefile
+++ b/proto/Makefile
@@ -13,15 +13,22 @@
 
 PROTO_SRC := $(wildcard *.proto)
 PROTO_GEN_SRC := $(PROTO_SRC:.proto=.pb.go)
+PROTO_GEN_SRC_GRPC := $(addprefix grpc/,$(PROTO_GEN_SRC))
+PROTO_GEN_SRC_TTRPC := $(addprefix ttrpc/,$(PROTO_GEN_SRC))
 
-$(PROTO_GEN_SRC): $(PROTO_SRC)
+$(PROTO_GEN_SRC_TTRPC): $(PROTO_SRC)
 	protoc \
-		--gogo_out=plugins=grpc,Mgoogle/protobuf/any.proto=github.com/gogo/protobuf/types:. \
+		--gogottrpc_out=plugins=ttrpc,Mgoogle/protobuf/any.proto=github.com/gogo/protobuf/types:ttrpc \
 		$^
 
-proto: $(PROTO_GEN_SRC)
+$(PROTO_GEN_SRC_GRPC): $(PROTO_SRC)
+	protoc \
+		--gogo_out=plugins=grpc,Mgoogle/protobuf/any.proto=github.com/gogo/protobuf/types:grpc \
+		$^
+
+proto: $(PROTO_GEN_SRC_GRPC) $(PROTO_GEN_SRC_TTRPC)
 
 clean:
-	- rm -f *.pb.go
+	- rm -f $(PROTO_GEN_SRC_GRPC) $(PROTO_GEN_SRC_TTRPC)
 
 .PHONY: clean proto
diff --git a/proto/events.pb.go b/proto/grpc/events.pb.go
similarity index 79%
rename from proto/events.pb.go
rename to proto/grpc/events.pb.go
index 923c649..80b0bdf 100644
--- a/proto/events.pb.go
+++ b/proto/grpc/events.pb.go
@@ -3,9 +3,11 @@
 
 package proto
 
-import proto "github.com/gogo/protobuf/proto"
-import fmt "fmt"
-import math "math"
+import (
+	fmt "fmt"
+	proto "github.com/gogo/protobuf/proto"
+	math "math"
+)
 
 // Reference imports to suppress errors if they are not otherwise used.
 var _ = proto.Marshal
@@ -19,7 +21,7 @@ var _ = math.Inf
 const _ = proto.GoGoProtoPackageIsVersion2 // please upgrade the proto package
 
 type VMStart struct {
-	VMID                 string   `protobuf:"bytes,1,opt,name=VMID,proto3" json:"VMID,omitempty"`
+	VMID                 string   `protobuf:"bytes,1,opt,name=VMID,json=vMID,proto3" json:"VMID,omitempty"`
 	XXX_NoUnkeyedLiteral struct{} `json:"-"`
 	XXX_unrecognized     []byte   `json:"-"`
 	XXX_sizecache        int32    `json:"-"`
@@ -29,7 +31,7 @@ func (m *VMStart) Reset()         { *m = VMStart{} }
 func (m *VMStart) String() string { return proto.CompactTextString(m) }
 func (*VMStart) ProtoMessage()    {}
 func (*VMStart) Descriptor() ([]byte, []int) {
-	return fileDescriptor_events_a5324d3df6ddc3de, []int{0}
+	return fileDescriptor_8f22242cb04491f9, []int{0}
 }
 func (m *VMStart) XXX_Unmarshal(b []byte) error {
 	return xxx_messageInfo_VMStart.Unmarshal(m, b)
@@ -37,8 +39,8 @@ func (m *VMStart) XXX_Unmarshal(b []byte) error {
 func (m *VMStart) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
 	return xxx_messageInfo_VMStart.Marshal(b, m, deterministic)
 }
-func (dst *VMStart) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_VMStart.Merge(dst, src)
+func (m *VMStart) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_VMStart.Merge(m, src)
 }
 func (m *VMStart) XXX_Size() int {
 	return xxx_messageInfo_VMStart.Size(m)
@@ -57,7 +59,7 @@ func (m *VMStart) GetVMID() string {
 }
 
 type VMStop struct {
-	VMID                 string   `protobuf:"bytes,1,opt,name=VMID,proto3" json:"VMID,omitempty"`
+	VMID                 string   `protobuf:"bytes,1,opt,name=VMID,json=vMID,proto3" json:"VMID,omitempty"`
 	XXX_NoUnkeyedLiteral struct{} `json:"-"`
 	XXX_unrecognized     []byte   `json:"-"`
 	XXX_sizecache        int32    `json:"-"`
@@ -67,7 +69,7 @@ func (m *VMStop) Reset()         { *m = VMStop{} }
 func (m *VMStop) String() string { return proto.CompactTextString(m) }
 func (*VMStop) ProtoMessage()    {}
 func (*VMStop) Descriptor() ([]byte, []int) {
-	return fileDescriptor_events_a5324d3df6ddc3de, []int{1}
+	return fileDescriptor_8f22242cb04491f9, []int{1}
 }
 func (m *VMStop) XXX_Unmarshal(b []byte) error {
 	return xxx_messageInfo_VMStop.Unmarshal(m, b)
@@ -75,8 +77,8 @@ func (m *VMStop) XXX_Unmarshal(b []byte) error {
 func (m *VMStop) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
 	return xxx_messageInfo_VMStop.Marshal(b, m, deterministic)
 }
-func (dst *VMStop) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_VMStop.Merge(dst, src)
+func (m *VMStop) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_VMStop.Merge(m, src)
 }
 func (m *VMStop) XXX_Size() int {
 	return xxx_messageInfo_VMStop.Size(m)
@@ -99,14 +101,14 @@ func init() {
 	proto.RegisterType((*VMStop)(nil), "VMStop")
 }
 
-func init() { proto.RegisterFile("events.proto", fileDescriptor_events_a5324d3df6ddc3de) }
+func init() { proto.RegisterFile("events.proto", fileDescriptor_8f22242cb04491f9) }
 
-var fileDescriptor_events_a5324d3df6ddc3de = []byte{
-	// 81 bytes of a gzipped FileDescriptorProto
+var fileDescriptor_8f22242cb04491f9 = []byte{
+	// 84 bytes of a gzipped FileDescriptorProto
 	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0xe2, 0x49, 0x2d, 0x4b, 0xcd,
 	0x2b, 0x29, 0xd6, 0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x57, 0x92, 0xe5, 0x62, 0x0f, 0xf3, 0x0d, 0x2e,
 	0x49, 0x2c, 0x2a, 0x11, 0x12, 0xe2, 0x62, 0x09, 0xf3, 0xf5, 0x74, 0x91, 0x60, 0x54, 0x60, 0xd4,
-	0xe0, 0x0c, 0x02, 0xb3, 0x95, 0x64, 0xb8, 0xd8, 0x40, 0xd2, 0xf9, 0x05, 0xd8, 0x64, 0x93, 0xd8,
-	0xc0, 0x66, 0x18, 0x03, 0x02, 0x00, 0x00, 0xff, 0xff, 0xf6, 0x83, 0xd8, 0x3c, 0x53, 0x00, 0x00,
-	0x00,
+	0xe0, 0x0c, 0x62, 0x29, 0xf3, 0xf5, 0x74, 0x51, 0x92, 0xe1, 0x62, 0x03, 0x49, 0xe7, 0x17, 0x60,
+	0x93, 0x4d, 0x62, 0x03, 0x9b, 0x61, 0x0c, 0x08, 0x00, 0x00, 0xff, 0xff, 0xd2, 0x8a, 0x85, 0x02,
+	0x53, 0x00, 0x00, 0x00,
 }
diff --git a/proto/firecracker.pb.go b/proto/grpc/firecracker.pb.go
similarity index 74%
rename from proto/firecracker.pb.go
rename to proto/grpc/firecracker.pb.go
index ccc268d..bbe66ab 100644
--- a/proto/firecracker.pb.go
+++ b/proto/grpc/firecracker.pb.go
@@ -3,14 +3,13 @@
 
 package proto
 
-import proto "github.com/gogo/protobuf/proto"
-import fmt "fmt"
-import math "math"
-import empty "github.com/golang/protobuf/ptypes/empty"
-
 import (
-	context "golang.org/x/net/context"
+	context "context"
+	fmt "fmt"
+	proto "github.com/gogo/protobuf/proto"
+	empty "github.com/golang/protobuf/ptypes/empty"
 	grpc "google.golang.org/grpc"
+	math "math"
 )
 
 // Reference imports to suppress errors if they are not otherwise used.
@@ -27,21 +26,21 @@ const _ = proto.GoGoProtoPackageIsVersion2 // please upgrade the proto package
 // CreateVMRequest specifies creation parameters for a new FC instance
 type CreateVMRequest struct {
 	// VM identifier to assign
-	VMID string `protobuf:"bytes,1,opt,name=VMID,proto3" json:"VMID,omitempty"`
+	VMID string `protobuf:"bytes,1,opt,name=VMID,json=vMID,proto3" json:"VMID,omitempty"`
 	// Specifies the machine configuration for the VM
-	MachineCfg *FirecrackerMachineConfiguration `protobuf:"bytes,2,opt,name=MachineCfg,proto3" json:"MachineCfg,omitempty"`
+	MachineCfg *FirecrackerMachineConfiguration `protobuf:"bytes,2,opt,name=MachineCfg,json=machineCfg,proto3" json:"MachineCfg,omitempty"`
 	// Specifies the file path where the kernel image is located
-	KernelImagePath string `protobuf:"bytes,3,opt,name=KernelImagePath,proto3" json:"KernelImagePath,omitempty"`
+	KernelImagePath string `protobuf:"bytes,3,opt,name=KernelImagePath,json=kernelImagePath,proto3" json:"KernelImagePath,omitempty"`
 	// Specifies the commandline arguments that should be passed to the kernel
-	KernelArgs string `protobuf:"bytes,4,opt,name=KernelArgs,proto3" json:"KernelArgs,omitempty"`
+	KernelArgs string `protobuf:"bytes,4,opt,name=KernelArgs,json=kernelArgs,proto3" json:"KernelArgs,omitempty"`
 	// Specifies the root block device for the VM
-	RootDrive *FirecrackerDrive `protobuf:"bytes,5,opt,name=RootDrive,proto3" json:"RootDrive,omitempty"`
+	RootDrive *FirecrackerDrive `protobuf:"bytes,5,opt,name=RootDrive,json=rootDrive,proto3" json:"RootDrive,omitempty"`
 	// Specifies the additional block device config for the VM.
-	AdditionalDrives []*FirecrackerDrive `protobuf:"bytes,6,rep,name=AdditionalDrives,proto3" json:"AdditionalDrives,omitempty"`
+	AdditionalDrives []*FirecrackerDrive `protobuf:"bytes,6,rep,name=AdditionalDrives,json=additionalDrives,proto3" json:"AdditionalDrives,omitempty"`
 	// Specifies the networking configuration for a VM
-	NetworkInterfaces []*FirecrackerNetworkInterface `protobuf:"bytes,7,rep,name=NetworkInterfaces,proto3" json:"NetworkInterfaces,omitempty"`
+	NetworkInterfaces []*FirecrackerNetworkInterface `protobuf:"bytes,7,rep,name=NetworkInterfaces,json=networkInterfaces,proto3" json:"NetworkInterfaces,omitempty"`
 	// The number of dummy drives to reserve in advance before running FC instance.
-	ContainerCount       int32    `protobuf:"varint,8,opt,name=ContainerCount,proto3" json:"ContainerCount,omitempty"`
+	ContainerCount       int32    `protobuf:"varint,8,opt,name=ContainerCount,json=containerCount,proto3" json:"ContainerCount,omitempty"`
 	XXX_NoUnkeyedLiteral struct{} `json:"-"`
 	XXX_unrecognized     []byte   `json:"-"`
 	XXX_sizecache        int32    `json:"-"`
@@ -51,7 +50,7 @@ func (m *CreateVMRequest) Reset()         { *m = CreateVMRequest{} }
 func (m *CreateVMRequest) String() string { return proto.CompactTextString(m) }
 func (*CreateVMRequest) ProtoMessage()    {}
 func (*CreateVMRequest) Descriptor() ([]byte, []int) {
-	return fileDescriptor_firecracker_7b3f3f0a94e95e55, []int{0}
+	return fileDescriptor_a73317e9fb8da571, []int{0}
 }
 func (m *CreateVMRequest) XXX_Unmarshal(b []byte) error {
 	return xxx_messageInfo_CreateVMRequest.Unmarshal(m, b)
@@ -59,8 +58,8 @@ func (m *CreateVMRequest) XXX_Unmarshal(b []byte) error {
 func (m *CreateVMRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
 	return xxx_messageInfo_CreateVMRequest.Marshal(b, m, deterministic)
 }
-func (dst *CreateVMRequest) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_CreateVMRequest.Merge(dst, src)
+func (m *CreateVMRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_CreateVMRequest.Merge(m, src)
 }
 func (m *CreateVMRequest) XXX_Size() int {
 	return xxx_messageInfo_CreateVMRequest.Size(m)
@@ -128,7 +127,7 @@ func (m *CreateVMRequest) GetContainerCount() int32 {
 }
 
 type StopVMRequest struct {
-	VMID                 string   `protobuf:"bytes,1,opt,name=VMID,proto3" json:"VMID,omitempty"`
+	VMID                 string   `protobuf:"bytes,1,opt,name=VMID,json=vMID,proto3" json:"VMID,omitempty"`
 	XXX_NoUnkeyedLiteral struct{} `json:"-"`
 	XXX_unrecognized     []byte   `json:"-"`
 	XXX_sizecache        int32    `json:"-"`
@@ -138,7 +137,7 @@ func (m *StopVMRequest) Reset()         { *m = StopVMRequest{} }
 func (m *StopVMRequest) String() string { return proto.CompactTextString(m) }
 func (*StopVMRequest) ProtoMessage()    {}
 func (*StopVMRequest) Descriptor() ([]byte, []int) {
-	return fileDescriptor_firecracker_7b3f3f0a94e95e55, []int{1}
+	return fileDescriptor_a73317e9fb8da571, []int{1}
 }
 func (m *StopVMRequest) XXX_Unmarshal(b []byte) error {
 	return xxx_messageInfo_StopVMRequest.Unmarshal(m, b)
@@ -146,8 +145,8 @@ func (m *StopVMRequest) XXX_Unmarshal(b []byte) error {
 func (m *StopVMRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
 	return xxx_messageInfo_StopVMRequest.Marshal(b, m, deterministic)
 }
-func (dst *StopVMRequest) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_StopVMRequest.Merge(dst, src)
+func (m *StopVMRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_StopVMRequest.Merge(m, src)
 }
 func (m *StopVMRequest) XXX_Size() int {
 	return xxx_messageInfo_StopVMRequest.Size(m)
@@ -166,7 +165,7 @@ func (m *StopVMRequest) GetVMID() string {
 }
 
 type GetVMInfoRequest struct {
-	VMID                 string   `protobuf:"bytes,1,opt,name=VMID,proto3" json:"VMID,omitempty"`
+	VMID                 string   `protobuf:"bytes,1,opt,name=VMID,json=vMID,proto3" json:"VMID,omitempty"`
 	XXX_NoUnkeyedLiteral struct{} `json:"-"`
 	XXX_unrecognized     []byte   `json:"-"`
 	XXX_sizecache        int32    `json:"-"`
@@ -176,7 +175,7 @@ func (m *GetVMInfoRequest) Reset()         { *m = GetVMInfoRequest{} }
 func (m *GetVMInfoRequest) String() string { return proto.CompactTextString(m) }
 func (*GetVMInfoRequest) ProtoMessage()    {}
 func (*GetVMInfoRequest) Descriptor() ([]byte, []int) {
-	return fileDescriptor_firecracker_7b3f3f0a94e95e55, []int{2}
+	return fileDescriptor_a73317e9fb8da571, []int{2}
 }
 func (m *GetVMInfoRequest) XXX_Unmarshal(b []byte) error {
 	return xxx_messageInfo_GetVMInfoRequest.Unmarshal(m, b)
@@ -184,8 +183,8 @@ func (m *GetVMInfoRequest) XXX_Unmarshal(b []byte) error {
 func (m *GetVMInfoRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
 	return xxx_messageInfo_GetVMInfoRequest.Marshal(b, m, deterministic)
 }
-func (dst *GetVMInfoRequest) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_GetVMInfoRequest.Merge(dst, src)
+func (m *GetVMInfoRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_GetVMInfoRequest.Merge(m, src)
 }
 func (m *GetVMInfoRequest) XXX_Size() int {
 	return xxx_messageInfo_GetVMInfoRequest.Size(m)
@@ -204,11 +203,11 @@ func (m *GetVMInfoRequest) GetVMID() string {
 }
 
 type GetVMInfoResponse struct {
-	VMID                 string   `protobuf:"bytes,1,opt,name=VMID,proto3" json:"VMID,omitempty"`
-	ContextID            uint32   `protobuf:"varint,2,opt,name=ContextID,proto3" json:"ContextID,omitempty"`
-	SocketPath           string   `protobuf:"bytes,3,opt,name=SocketPath,proto3" json:"SocketPath,omitempty"`
-	LogFifoPath          string   `protobuf:"bytes,4,opt,name=LogFifoPath,proto3" json:"LogFifoPath,omitempty"`
-	MetricsFifoPath      string   `protobuf:"bytes,5,opt,name=MetricsFifoPath,proto3" json:"MetricsFifoPath,omitempty"`
+	VMID                 string   `protobuf:"bytes,1,opt,name=VMID,json=vMID,proto3" json:"VMID,omitempty"`
+	ContextID            uint32   `protobuf:"varint,2,opt,name=ContextID,json=contextID,proto3" json:"ContextID,omitempty"`
+	SocketPath           string   `protobuf:"bytes,3,opt,name=SocketPath,json=socketPath,proto3" json:"SocketPath,omitempty"`
+	LogFifoPath          string   `protobuf:"bytes,4,opt,name=LogFifoPath,json=logFifoPath,proto3" json:"LogFifoPath,omitempty"`
+	MetricsFifoPath      string   `protobuf:"bytes,5,opt,name=MetricsFifoPath,json=metricsFifoPath,proto3" json:"MetricsFifoPath,omitempty"`
 	XXX_NoUnkeyedLiteral struct{} `json:"-"`
 	XXX_unrecognized     []byte   `json:"-"`
 	XXX_sizecache        int32    `json:"-"`
@@ -218,7 +217,7 @@ func (m *GetVMInfoResponse) Reset()         { *m = GetVMInfoResponse{} }
 func (m *GetVMInfoResponse) String() string { return proto.CompactTextString(m) }
 func (*GetVMInfoResponse) ProtoMessage()    {}
 func (*GetVMInfoResponse) Descriptor() ([]byte, []int) {
-	return fileDescriptor_firecracker_7b3f3f0a94e95e55, []int{3}
+	return fileDescriptor_a73317e9fb8da571, []int{3}
 }
 func (m *GetVMInfoResponse) XXX_Unmarshal(b []byte) error {
 	return xxx_messageInfo_GetVMInfoResponse.Unmarshal(m, b)
@@ -226,8 +225,8 @@ func (m *GetVMInfoResponse) XXX_Unmarshal(b []byte) error {
 func (m *GetVMInfoResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
 	return xxx_messageInfo_GetVMInfoResponse.Marshal(b, m, deterministic)
 }
-func (dst *GetVMInfoResponse) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_GetVMInfoResponse.Merge(dst, src)
+func (m *GetVMInfoResponse) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_GetVMInfoResponse.Merge(m, src)
 }
 func (m *GetVMInfoResponse) XXX_Size() int {
 	return xxx_messageInfo_GetVMInfoResponse.Size(m)
@@ -274,8 +273,8 @@ func (m *GetVMInfoResponse) GetMetricsFifoPath() string {
 }
 
 type SetVMMetadataRequest struct {
-	VMID                 string   `protobuf:"bytes,1,opt,name=VMID,proto3" json:"VMID,omitempty"`
-	Metadata             string   `protobuf:"bytes,2,opt,name=Metadata,proto3" json:"Metadata,omitempty"`
+	VMID                 string   `protobuf:"bytes,1,opt,name=VMID,json=vMID,proto3" json:"VMID,omitempty"`
+	Metadata             string   `protobuf:"bytes,2,opt,name=Metadata,json=metadata,proto3" json:"Metadata,omitempty"`
 	XXX_NoUnkeyedLiteral struct{} `json:"-"`
 	XXX_unrecognized     []byte   `json:"-"`
 	XXX_sizecache        int32    `json:"-"`
@@ -285,7 +284,7 @@ func (m *SetVMMetadataRequest) Reset()         { *m = SetVMMetadataRequest{} }
 func (m *SetVMMetadataRequest) String() string { return proto.CompactTextString(m) }
 func (*SetVMMetadataRequest) ProtoMessage()    {}
 func (*SetVMMetadataRequest) Descriptor() ([]byte, []int) {
-	return fileDescriptor_firecracker_7b3f3f0a94e95e55, []int{4}
+	return fileDescriptor_a73317e9fb8da571, []int{4}
 }
 func (m *SetVMMetadataRequest) XXX_Unmarshal(b []byte) error {
 	return xxx_messageInfo_SetVMMetadataRequest.Unmarshal(m, b)
@@ -293,8 +292,8 @@ func (m *SetVMMetadataRequest) XXX_Unmarshal(b []byte) error {
 func (m *SetVMMetadataRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
 	return xxx_messageInfo_SetVMMetadataRequest.Marshal(b, m, deterministic)
 }
-func (dst *SetVMMetadataRequest) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_SetVMMetadataRequest.Merge(dst, src)
+func (m *SetVMMetadataRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_SetVMMetadataRequest.Merge(m, src)
 }
 func (m *SetVMMetadataRequest) XXX_Size() int {
 	return xxx_messageInfo_SetVMMetadataRequest.Size(m)
@@ -327,6 +326,44 @@ func init() {
 	proto.RegisterType((*SetVMMetadataRequest)(nil), "SetVMMetadataRequest")
 }
 
+func init() { proto.RegisterFile("firecracker.proto", fileDescriptor_a73317e9fb8da571) }
+
+var fileDescriptor_a73317e9fb8da571 = []byte{
+	// 502 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x53, 0xdb, 0x6e, 0xd3, 0x40,
+	0x10, 0x95, 0xc9, 0xa5, 0xf1, 0x44, 0xb9, 0x78, 0x05, 0xc8, 0x0a, 0x15, 0xb2, 0x82, 0x54, 0xe5,
+	0x69, 0x83, 0x02, 0xaf, 0x20, 0x4a, 0x42, 0x90, 0x01, 0x23, 0xe4, 0x48, 0x79, 0xe0, 0x6d, 0x71,
+	0xc6, 0xae, 0x95, 0x64, 0x37, 0xac, 0x37, 0x85, 0x7e, 0x08, 0x1f, 0xc2, 0x67, 0xf1, 0x17, 0xc8,
+	0xeb, 0x3a, 0xb5, 0xdd, 0x34, 0x4f, 0xd6, 0x9c, 0x39, 0x47, 0x73, 0xbc, 0x67, 0x06, 0xac, 0x30,
+	0x96, 0x18, 0x48, 0x16, 0xac, 0x51, 0xd2, 0x9d, 0x14, 0x4a, 0x0c, 0x9e, 0x45, 0x42, 0x44, 0x1b,
+	0x1c, 0xeb, 0xea, 0xc7, 0x3e, 0x1c, 0xe3, 0x76, 0xa7, 0x6e, 0x6e, 0x9b, 0x6d, 0x75, 0xb3, 0xc3,
+	0x24, 0x2b, 0x86, 0x7f, 0x6a, 0xd0, 0x9b, 0x4a, 0x64, 0x0a, 0x97, 0x9e, 0x8f, 0x3f, 0xf7, 0x98,
+	0x28, 0x42, 0xa0, 0xbe, 0xf4, 0xdc, 0x99, 0x6d, 0x38, 0xc6, 0xc8, 0xf4, 0xeb, 0xd7, 0x9e, 0x3b,
+	0x23, 0xef, 0x00, 0x3c, 0x16, 0x5c, 0xc5, 0x1c, 0xa7, 0x61, 0x64, 0x3f, 0x72, 0x8c, 0x51, 0x7b,
+	0xe2, 0xd0, 0xf9, 0xdd, 0xe4, 0xbc, 0x2b, 0x78, 0x18, 0x47, 0x7b, 0xc9, 0x54, 0x2c, 0xb8, 0x0f,
+	0xdb, 0x83, 0x86, 0x8c, 0xa0, 0xf7, 0x19, 0x25, 0xc7, 0x8d, 0xbb, 0x65, 0x11, 0x7e, 0x63, 0xea,
+	0xca, 0xae, 0xe9, 0x01, 0xbd, 0x75, 0x19, 0x26, 0xcf, 0x01, 0x32, 0xe6, 0xa5, 0x8c, 0x12, 0xbb,
+	0xae, 0x49, 0xb0, 0x3e, 0x20, 0x64, 0x0c, 0xa6, 0x2f, 0x84, 0x9a, 0xc9, 0xf8, 0x1a, 0xed, 0x86,
+	0xb6, 0x62, 0x15, 0xad, 0xe8, 0x86, 0x6f, 0xca, 0x9c, 0x43, 0xde, 0x40, 0xff, 0x72, 0xb5, 0x8a,
+	0x53, 0x4b, 0x6c, 0xa3, 0xa1, 0xc4, 0x6e, 0x3a, 0xb5, 0xe3, 0xba, 0x3e, 0xab, 0x50, 0xc9, 0x27,
+	0xb0, 0xbe, 0xa2, 0xfa, 0x25, 0xe4, 0xda, 0xe5, 0x0a, 0x65, 0xc8, 0x02, 0x4c, 0xec, 0x33, 0xad,
+	0x3f, 0x2f, 0xea, 0xab, 0x24, 0xdf, 0xe2, 0x55, 0x19, 0xb9, 0x80, 0xee, 0x54, 0x70, 0xc5, 0x62,
+	0x8e, 0x72, 0x2a, 0xf6, 0x5c, 0xd9, 0x2d, 0xc7, 0x18, 0x35, 0xfc, 0x6e, 0x50, 0x42, 0x87, 0x2f,
+	0xa0, 0xb3, 0x50, 0x62, 0x77, 0x32, 0x94, 0xe1, 0x05, 0xf4, 0x3f, 0xa2, 0x5a, 0x7a, 0x2e, 0x0f,
+	0xc5, 0x29, 0xde, 0x5f, 0x03, 0xac, 0x02, 0x31, 0xd9, 0x09, 0x9e, 0xe0, 0xd1, 0x98, 0xcf, 0xc1,
+	0x4c, 0xed, 0xe1, 0x6f, 0xe5, 0xce, 0x74, 0xca, 0x1d, 0xdf, 0x0c, 0x72, 0x20, 0x0d, 0x66, 0x21,
+	0x82, 0x35, 0xaa, 0x42, 0x7a, 0x90, 0x1c, 0x10, 0xe2, 0x40, 0xfb, 0x8b, 0x88, 0xe6, 0x71, 0x28,
+	0x34, 0x21, 0x4b, 0xae, 0xbd, 0xb9, 0x83, 0xd2, 0x25, 0xf0, 0x50, 0xc9, 0x38, 0x48, 0x0e, 0xac,
+	0x46, 0xb6, 0x04, 0xdb, 0x32, 0x3c, 0x9c, 0xc3, 0xe3, 0x45, 0x6a, 0xd9, 0x43, 0xc5, 0x56, 0x4c,
+	0xb1, 0x53, 0xcb, 0x39, 0x80, 0x56, 0x4e, 0xd3, 0xa6, 0x4d, 0xbf, 0xb5, 0xbd, 0xad, 0x27, 0xff,
+	0x0c, 0x68, 0x17, 0x32, 0x22, 0xaf, 0xa1, 0x95, 0xef, 0x3b, 0xe9, 0xd3, 0xca, 0xea, 0x0f, 0x9e,
+	0xd2, 0xec, 0x72, 0x68, 0x7e, 0x39, 0xf4, 0x43, 0x7a, 0x39, 0xe4, 0x25, 0x34, 0xb3, 0x38, 0x48,
+	0x97, 0x96, 0x72, 0x79, 0x50, 0x31, 0x01, 0xf3, 0xf0, 0xe4, 0xc4, 0xa2, 0xd5, 0x9c, 0x06, 0x84,
+	0xde, 0x4f, 0xe4, 0x2d, 0x74, 0x4a, 0xff, 0x4c, 0x9e, 0xd0, 0x63, 0x6f, 0xf0, 0xd0, 0xcc, 0xf7,
+	0x67, 0xdf, 0x1b, 0x19, 0xd2, 0xd4, 0x9f, 0x57, 0xff, 0x03, 0x00, 0x00, 0xff, 0xff, 0x29, 0xa5,
+	0xe3, 0xff, 0x1b, 0x04, 0x00, 0x00,
+}
+
 // Reference imports to suppress errors if they are not otherwise used.
 var _ context.Context
 var _ grpc.ClientConn
@@ -505,40 +542,3 @@ var _Firecracker_serviceDesc = grpc.ServiceDesc{
 	Streams:  []grpc.StreamDesc{},
 	Metadata: "firecracker.proto",
 }
-
-func init() { proto.RegisterFile("firecracker.proto", fileDescriptor_firecracker_7b3f3f0a94e95e55) }
-
-var fileDescriptor_firecracker_7b3f3f0a94e95e55 = []byte{
-	// 481 bytes of a gzipped FileDescriptorProto
-	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x53, 0xd1, 0x8e, 0xd2, 0x40,
-	0x14, 0x4d, 0x65, 0x61, 0xe1, 0x12, 0x76, 0xe9, 0x44, 0x4d, 0x83, 0x1b, 0xd3, 0x60, 0xb2, 0xe1,
-	0x69, 0x30, 0xe8, 0xab, 0xc6, 0x15, 0xc4, 0x54, 0xad, 0x31, 0x25, 0xe1, 0xc1, 0xb7, 0xb1, 0xdc,
-	0x76, 0x1b, 0xd8, 0x99, 0x3a, 0xbd, 0xa8, 0xfb, 0x21, 0x7e, 0x88, 0x9f, 0xe5, 0x5f, 0x98, 0x4e,
-	0x05, 0xba, 0x85, 0xe5, 0x09, 0xee, 0xb9, 0xe7, 0xe4, 0x9e, 0xce, 0xb9, 0x17, 0xec, 0x28, 0xd1,
-	0x18, 0x6a, 0x11, 0x2e, 0x51, 0xf3, 0x54, 0x2b, 0x52, 0xbd, 0x27, 0xb1, 0x52, 0xf1, 0x0a, 0x87,
-	0xa6, 0xfa, 0xb6, 0x8e, 0x86, 0x78, 0x93, 0xd2, 0xed, 0xff, 0x66, 0x9b, 0x6e, 0x53, 0xcc, 0x8a,
-	0xa2, 0xff, 0xbb, 0x06, 0xe7, 0x63, 0x8d, 0x82, 0x70, 0xee, 0x07, 0xf8, 0x7d, 0x8d, 0x19, 0x31,
-	0x06, 0x27, 0x73, 0xdf, 0x9b, 0x38, 0x96, 0x6b, 0x0d, 0x5a, 0x81, 0xf9, 0xcf, 0xde, 0x00, 0xf8,
-	0x22, 0xbc, 0x4e, 0x24, 0x8e, 0xa3, 0xd8, 0x79, 0xe0, 0x5a, 0x83, 0xf6, 0xc8, 0xe5, 0xd3, 0xdd,
-	0xe4, 0x4d, 0x57, 0xc9, 0x28, 0x89, 0xd7, 0x5a, 0x50, 0xa2, 0x64, 0x50, 0xd2, 0xb0, 0x01, 0x9c,
-	0x7f, 0x44, 0x2d, 0x71, 0xe5, 0xdd, 0x88, 0x18, 0xbf, 0x08, 0xba, 0x76, 0x6a, 0x66, 0x40, 0x15,
-	0x66, 0x4f, 0x01, 0x0a, 0xe8, 0x4a, 0xc7, 0x99, 0x73, 0x62, 0x48, 0x25, 0x84, 0x0d, 0xa1, 0x15,
-	0x28, 0x45, 0x13, 0x9d, 0xfc, 0x40, 0xa7, 0x6e, 0xac, 0xd8, 0x65, 0x2b, 0xa6, 0x11, 0xec, 0x38,
-	0xec, 0x15, 0x74, 0xaf, 0x16, 0x8b, 0x24, 0xb7, 0x24, 0x56, 0x06, 0xca, 0x9c, 0x86, 0x5b, 0x3b,
-	0xac, 0xdb, 0xa3, 0xb2, 0x0f, 0x60, 0x7f, 0x46, 0xfa, 0xa9, 0xf4, 0xd2, 0x93, 0x84, 0x3a, 0x12,
-	0x21, 0x66, 0xce, 0xa9, 0xd1, 0x5f, 0x94, 0xf5, 0x55, 0x52, 0xb0, 0x2f, 0x63, 0x97, 0x70, 0x36,
-	0x56, 0x92, 0x44, 0x22, 0x51, 0x8f, 0xd5, 0x5a, 0x92, 0xd3, 0x74, 0xad, 0x41, 0x3d, 0xa8, 0xa0,
-	0xfd, 0x67, 0xd0, 0x99, 0x91, 0x4a, 0x8f, 0x86, 0xd2, 0xbf, 0x84, 0xee, 0x7b, 0xa4, 0xb9, 0xef,
-	0xc9, 0x48, 0x1d, 0xe3, 0xfd, 0xb1, 0xc0, 0x2e, 0x11, 0xb3, 0x54, 0xc9, 0x0c, 0x0f, 0xc6, 0x7c,
-	0x01, 0xad, 0xdc, 0x08, 0xfe, 0x22, 0x6f, 0x62, 0x52, 0xee, 0x04, 0x3b, 0x20, 0x0f, 0x66, 0xa6,
-	0xc2, 0x25, 0x52, 0x29, 0xbd, 0x12, 0xc2, 0x5c, 0x68, 0x7f, 0x52, 0xf1, 0x34, 0x89, 0x94, 0x21,
-	0x14, 0xc9, 0x95, 0xa1, 0x7c, 0x09, 0x7c, 0x24, 0x9d, 0x84, 0xd9, 0x96, 0x55, 0x2f, 0x96, 0xa0,
-	0x02, 0xf7, 0xa7, 0xf0, 0x70, 0x96, 0x5b, 0xf6, 0x91, 0xc4, 0x42, 0x90, 0x38, 0xb6, 0x9c, 0x3d,
-	0x68, 0x6e, 0x68, 0xc6, 0x74, 0x2b, 0xd8, 0xd6, 0xa3, 0xbf, 0x16, 0xb4, 0x4b, 0x19, 0xb1, 0x97,
-	0xd0, 0xdc, 0xec, 0x3b, 0xeb, 0xf2, 0xca, 0xea, 0xf7, 0x1e, 0xf3, 0xe2, 0x72, 0xf8, 0xe6, 0x72,
-	0xf8, 0xbb, 0xfc, 0x72, 0xd8, 0x73, 0x68, 0x14, 0x71, 0xb0, 0x33, 0x7e, 0x27, 0x97, 0x7b, 0x15,
-	0x23, 0x68, 0x6d, 0x9f, 0x9c, 0xd9, 0xbc, 0x9a, 0x53, 0x8f, 0xf1, 0xfd, 0x44, 0x5e, 0x43, 0xe7,
-	0xce, 0x37, 0xb3, 0x47, 0xfc, 0xd0, 0x1b, 0xdc, 0x37, 0xf3, 0xed, 0xe9, 0xd7, 0x7a, 0x81, 0x34,
-	0xcc, 0xcf, 0x8b, 0x7f, 0x01, 0x00, 0x00, 0xff, 0xff, 0xac, 0xa7, 0xfc, 0x93, 0x1b, 0x04, 0x00,
-	0x00,
-}
diff --git a/proto/types.pb.go b/proto/grpc/types.pb.go
similarity index 65%
rename from proto/types.pb.go
rename to proto/grpc/types.pb.go
index 1ae7ba6..6a4f4e8 100644
--- a/proto/types.pb.go
+++ b/proto/grpc/types.pb.go
@@ -3,10 +3,12 @@
 
 package proto
 
-import proto "github.com/gogo/protobuf/proto"
-import fmt "fmt"
-import math "math"
-import types "github.com/gogo/protobuf/types"
+import (
+	fmt "fmt"
+	proto "github.com/gogo/protobuf/proto"
+	types "github.com/gogo/protobuf/types"
+	math "math"
+)
 
 // Reference imports to suppress errors if they are not otherwise used.
 var _ = proto.Marshal
@@ -21,8 +23,8 @@ const _ = proto.GoGoProtoPackageIsVersion2 // please upgrade the proto package
 
 // Message to store bundle/config.json bytes
 type ExtraData struct {
-	JsonSpec             []byte     `protobuf:"bytes,1,opt,name=JsonSpec,proto3" json:"JsonSpec,omitempty"`
-	RuncOptions          *types.Any `protobuf:"bytes,2,opt,name=RuncOptions,proto3" json:"RuncOptions,omitempty"`
+	JsonSpec             []byte     `protobuf:"bytes,1,opt,name=JsonSpec,json=jsonSpec,proto3" json:"JsonSpec,omitempty"`
+	RuncOptions          *types.Any `protobuf:"bytes,2,opt,name=RuncOptions,json=runcOptions,proto3" json:"RuncOptions,omitempty"`
 	XXX_NoUnkeyedLiteral struct{}   `json:"-"`
 	XXX_unrecognized     []byte     `json:"-"`
 	XXX_sizecache        int32      `json:"-"`
@@ -32,7 +34,7 @@ func (m *ExtraData) Reset()         { *m = ExtraData{} }
 func (m *ExtraData) String() string { return proto.CompactTextString(m) }
 func (*ExtraData) ProtoMessage()    {}
 func (*ExtraData) Descriptor() ([]byte, []int) {
-	return fileDescriptor_types_0f9ecb44d1a28b6a, []int{0}
+	return fileDescriptor_d938547f84707355, []int{0}
 }
 func (m *ExtraData) XXX_Unmarshal(b []byte) error {
 	return xxx_messageInfo_ExtraData.Unmarshal(m, b)
@@ -40,8 +42,8 @@ func (m *ExtraData) XXX_Unmarshal(b []byte) error {
 func (m *ExtraData) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
 	return xxx_messageInfo_ExtraData.Marshal(b, m, deterministic)
 }
-func (dst *ExtraData) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_ExtraData.Merge(dst, src)
+func (m *ExtraData) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_ExtraData.Merge(m, src)
 }
 func (m *ExtraData) XXX_Size() int {
 	return xxx_messageInfo_ExtraData.Size(m)
@@ -68,17 +70,17 @@ func (m *ExtraData) GetRuncOptions() *types.Any {
 
 // Message to specify the various Firecracker VM configurations for a task
 type FirecrackerConfig struct {
-	RuncOptions       *types.Any                       `protobuf:"bytes,1,opt,name=RuncOptions,proto3" json:"RuncOptions,omitempty"`
-	NetworkInterfaces []*FirecrackerNetworkInterface   `protobuf:"bytes,2,rep,name=NetworkInterfaces,proto3" json:"NetworkInterfaces,omitempty"`
-	KernelImagePath   string                           `protobuf:"bytes,3,opt,name=KernelImagePath,proto3" json:"KernelImagePath,omitempty"`
-	KernelArgs        string                           `protobuf:"bytes,4,opt,name=KernelArgs,proto3" json:"KernelArgs,omitempty"`
-	MachineCfg        *FirecrackerMachineConfiguration `protobuf:"bytes,5,opt,name=MachineCfg,proto3" json:"MachineCfg,omitempty"`
-	RootDrive         *FirecrackerDrive                `protobuf:"bytes,6,opt,name=RootDrive,proto3" json:"RootDrive,omitempty"`
+	RuncOptions       *types.Any                       `protobuf:"bytes,1,opt,name=RuncOptions,json=runcOptions,proto3" json:"RuncOptions,omitempty"`
+	NetworkInterfaces []*FirecrackerNetworkInterface   `protobuf:"bytes,2,rep,name=NetworkInterfaces,json=networkInterfaces,proto3" json:"NetworkInterfaces,omitempty"`
+	KernelImagePath   string                           `protobuf:"bytes,3,opt,name=KernelImagePath,json=kernelImagePath,proto3" json:"KernelImagePath,omitempty"`
+	KernelArgs        string                           `protobuf:"bytes,4,opt,name=KernelArgs,json=kernelArgs,proto3" json:"KernelArgs,omitempty"`
+	MachineCfg        *FirecrackerMachineConfiguration `protobuf:"bytes,5,opt,name=MachineCfg,json=machineCfg,proto3" json:"MachineCfg,omitempty"`
+	RootDrive         *FirecrackerDrive                `protobuf:"bytes,6,opt,name=RootDrive,json=rootDrive,proto3" json:"RootDrive,omitempty"`
 	// Specifies the additional block device config for the VM. Note that
 	// the snapshotter used might itself present block devices to the be
 	// attached to the VM. This fields allows additional block devices to
 	// that list.
-	AdditionalDrives     []*FirecrackerDrive `protobuf:"bytes,7,rep,name=AdditionalDrives,proto3" json:"AdditionalDrives,omitempty"`
+	AdditionalDrives     []*FirecrackerDrive `protobuf:"bytes,7,rep,name=AdditionalDrives,json=additionalDrives,proto3" json:"AdditionalDrives,omitempty"`
 	XXX_NoUnkeyedLiteral struct{}            `json:"-"`
 	XXX_unrecognized     []byte              `json:"-"`
 	XXX_sizecache        int32               `json:"-"`
@@ -88,7 +90,7 @@ func (m *FirecrackerConfig) Reset()         { *m = FirecrackerConfig{} }
 func (m *FirecrackerConfig) String() string { return proto.CompactTextString(m) }
 func (*FirecrackerConfig) ProtoMessage()    {}
 func (*FirecrackerConfig) Descriptor() ([]byte, []int) {
-	return fileDescriptor_types_0f9ecb44d1a28b6a, []int{1}
+	return fileDescriptor_d938547f84707355, []int{1}
 }
 func (m *FirecrackerConfig) XXX_Unmarshal(b []byte) error {
 	return xxx_messageInfo_FirecrackerConfig.Unmarshal(m, b)
@@ -96,8 +98,8 @@ func (m *FirecrackerConfig) XXX_Unmarshal(b []byte) error {
 func (m *FirecrackerConfig) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
 	return xxx_messageInfo_FirecrackerConfig.Marshal(b, m, deterministic)
 }
-func (dst *FirecrackerConfig) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_FirecrackerConfig.Merge(dst, src)
+func (m *FirecrackerConfig) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_FirecrackerConfig.Merge(m, src)
 }
 func (m *FirecrackerConfig) XXX_Size() int {
 	return xxx_messageInfo_FirecrackerConfig.Size(m)
@@ -159,11 +161,11 @@ func (m *FirecrackerConfig) GetAdditionalDrives() []*FirecrackerDrive {
 
 // Message to specify network config for a Firecracker VM
 type FirecrackerNetworkInterface struct {
-	MacAddress           string                  `protobuf:"bytes,1,opt,name=MacAddress,proto3" json:"MacAddress,omitempty"`
-	HostDevName          string                  `protobuf:"bytes,2,opt,name=HostDevName,proto3" json:"HostDevName,omitempty"`
-	AllowMMDS            bool                    `protobuf:"varint,3,opt,name=AllowMMDS,proto3" json:"AllowMMDS,omitempty"`
-	InRateLimiter        *FirecrackerRateLimiter `protobuf:"bytes,4,opt,name=InRateLimiter,proto3" json:"InRateLimiter,omitempty"`
-	OutRateLimiter       *FirecrackerRateLimiter `protobuf:"bytes,5,opt,name=OutRateLimiter,proto3" json:"OutRateLimiter,omitempty"`
+	MacAddress           string                  `protobuf:"bytes,1,opt,name=MacAddress,json=macAddress,proto3" json:"MacAddress,omitempty"`
+	HostDevName          string                  `protobuf:"bytes,2,opt,name=HostDevName,json=hostDevName,proto3" json:"HostDevName,omitempty"`
+	AllowMMDS            bool                    `protobuf:"varint,3,opt,name=AllowMMDS,json=allowMMDS,proto3" json:"AllowMMDS,omitempty"`
+	InRateLimiter        *FirecrackerRateLimiter `protobuf:"bytes,4,opt,name=InRateLimiter,json=inRateLimiter,proto3" json:"InRateLimiter,omitempty"`
+	OutRateLimiter       *FirecrackerRateLimiter `protobuf:"bytes,5,opt,name=OutRateLimiter,json=outRateLimiter,proto3" json:"OutRateLimiter,omitempty"`
 	XXX_NoUnkeyedLiteral struct{}                `json:"-"`
 	XXX_unrecognized     []byte                  `json:"-"`
 	XXX_sizecache        int32                   `json:"-"`
@@ -173,7 +175,7 @@ func (m *FirecrackerNetworkInterface) Reset()         { *m = FirecrackerNetworkI
 func (m *FirecrackerNetworkInterface) String() string { return proto.CompactTextString(m) }
 func (*FirecrackerNetworkInterface) ProtoMessage()    {}
 func (*FirecrackerNetworkInterface) Descriptor() ([]byte, []int) {
-	return fileDescriptor_types_0f9ecb44d1a28b6a, []int{2}
+	return fileDescriptor_d938547f84707355, []int{2}
 }
 func (m *FirecrackerNetworkInterface) XXX_Unmarshal(b []byte) error {
 	return xxx_messageInfo_FirecrackerNetworkInterface.Unmarshal(m, b)
@@ -181,8 +183,8 @@ func (m *FirecrackerNetworkInterface) XXX_Unmarshal(b []byte) error {
 func (m *FirecrackerNetworkInterface) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
 	return xxx_messageInfo_FirecrackerNetworkInterface.Marshal(b, m, deterministic)
 }
-func (dst *FirecrackerNetworkInterface) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_FirecrackerNetworkInterface.Merge(dst, src)
+func (m *FirecrackerNetworkInterface) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_FirecrackerNetworkInterface.Merge(m, src)
 }
 func (m *FirecrackerNetworkInterface) XXX_Size() int {
 	return xxx_messageInfo_FirecrackerNetworkInterface.Size(m)
@@ -230,13 +232,13 @@ func (m *FirecrackerNetworkInterface) GetOutRateLimiter() *FirecrackerRateLimite
 
 // Message to set the machine config for a Firecracker VM
 type FirecrackerMachineConfiguration struct {
-	CPUTemplate string `protobuf:"bytes,1,opt,name=CPUTemplate,proto3" json:"CPUTemplate,omitempty"`
-	HtEnabled   bool   `protobuf:"varint,2,opt,name=HtEnabled,proto3" json:"HtEnabled,omitempty"`
+	CPUTemplate string `protobuf:"bytes,1,opt,name=CPUTemplate,json=cPUTemplate,proto3" json:"CPUTemplate,omitempty"`
+	HtEnabled   bool   `protobuf:"varint,2,opt,name=HtEnabled,json=htEnabled,proto3" json:"HtEnabled,omitempty"`
 	// Specifies the memory size of VM
 	// This lets us create a Firecracker VM of up to 4096 TiB, which
 	// for a mircroVM should be large enough
-	MemSizeMib           uint32   `protobuf:"varint,3,opt,name=MemSizeMib,proto3" json:"MemSizeMib,omitempty"`
-	VcpuCount            uint32   `protobuf:"varint,4,opt,name=VcpuCount,proto3" json:"VcpuCount,omitempty"`
+	MemSizeMib           uint32   `protobuf:"varint,3,opt,name=MemSizeMib,json=memSizeMib,proto3" json:"MemSizeMib,omitempty"`
+	VcpuCount            uint32   `protobuf:"varint,4,opt,name=VcpuCount,json=vcpuCount,proto3" json:"VcpuCount,omitempty"`
 	XXX_NoUnkeyedLiteral struct{} `json:"-"`
 	XXX_unrecognized     []byte   `json:"-"`
 	XXX_sizecache        int32    `json:"-"`
@@ -246,7 +248,7 @@ func (m *FirecrackerMachineConfiguration) Reset()         { *m = FirecrackerMach
 func (m *FirecrackerMachineConfiguration) String() string { return proto.CompactTextString(m) }
 func (*FirecrackerMachineConfiguration) ProtoMessage()    {}
 func (*FirecrackerMachineConfiguration) Descriptor() ([]byte, []int) {
-	return fileDescriptor_types_0f9ecb44d1a28b6a, []int{3}
+	return fileDescriptor_d938547f84707355, []int{3}
 }
 func (m *FirecrackerMachineConfiguration) XXX_Unmarshal(b []byte) error {
 	return xxx_messageInfo_FirecrackerMachineConfiguration.Unmarshal(m, b)
@@ -254,8 +256,8 @@ func (m *FirecrackerMachineConfiguration) XXX_Unmarshal(b []byte) error {
 func (m *FirecrackerMachineConfiguration) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
 	return xxx_messageInfo_FirecrackerMachineConfiguration.Marshal(b, m, deterministic)
 }
-func (dst *FirecrackerMachineConfiguration) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_FirecrackerMachineConfiguration.Merge(dst, src)
+func (m *FirecrackerMachineConfiguration) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_FirecrackerMachineConfiguration.Merge(m, src)
 }
 func (m *FirecrackerMachineConfiguration) XXX_Size() int {
 	return xxx_messageInfo_FirecrackerMachineConfiguration.Size(m)
@@ -296,11 +298,11 @@ func (m *FirecrackerMachineConfiguration) GetVcpuCount() uint32 {
 
 // Message to specify the block device config for a Firecracker VM
 type FirecrackerDrive struct {
-	IsReadOnly           bool                    `protobuf:"varint,1,opt,name=IsReadOnly,proto3" json:"IsReadOnly,omitempty"`
-	IsRootDevice         bool                    `protobuf:"varint,2,opt,name=IsRootDevice,proto3" json:"IsRootDevice,omitempty"`
-	Partuuid             string                  `protobuf:"bytes,3,opt,name=Partuuid,proto3" json:"Partuuid,omitempty"`
-	PathOnHost           string                  `protobuf:"bytes,4,opt,name=PathOnHost,proto3" json:"PathOnHost,omitempty"`
-	RateLimiter          *FirecrackerRateLimiter `protobuf:"bytes,5,opt,name=RateLimiter,proto3" json:"RateLimiter,omitempty"`
+	IsReadOnly           bool                    `protobuf:"varint,1,opt,name=IsReadOnly,json=isReadOnly,proto3" json:"IsReadOnly,omitempty"`
+	IsRootDevice         bool                    `protobuf:"varint,2,opt,name=IsRootDevice,json=isRootDevice,proto3" json:"IsRootDevice,omitempty"`
+	Partuuid             string                  `protobuf:"bytes,3,opt,name=Partuuid,json=partuuid,proto3" json:"Partuuid,omitempty"`
+	PathOnHost           string                  `protobuf:"bytes,4,opt,name=PathOnHost,json=pathOnHost,proto3" json:"PathOnHost,omitempty"`
+	RateLimiter          *FirecrackerRateLimiter `protobuf:"bytes,5,opt,name=RateLimiter,json=rateLimiter,proto3" json:"RateLimiter,omitempty"`
 	XXX_NoUnkeyedLiteral struct{}                `json:"-"`
 	XXX_unrecognized     []byte                  `json:"-"`
 	XXX_sizecache        int32                   `json:"-"`
@@ -310,7 +312,7 @@ func (m *FirecrackerDrive) Reset()         { *m = FirecrackerDrive{} }
 func (m *FirecrackerDrive) String() string { return proto.CompactTextString(m) }
 func (*FirecrackerDrive) ProtoMessage()    {}
 func (*FirecrackerDrive) Descriptor() ([]byte, []int) {
-	return fileDescriptor_types_0f9ecb44d1a28b6a, []int{4}
+	return fileDescriptor_d938547f84707355, []int{4}
 }
 func (m *FirecrackerDrive) XXX_Unmarshal(b []byte) error {
 	return xxx_messageInfo_FirecrackerDrive.Unmarshal(m, b)
@@ -318,8 +320,8 @@ func (m *FirecrackerDrive) XXX_Unmarshal(b []byte) error {
 func (m *FirecrackerDrive) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
 	return xxx_messageInfo_FirecrackerDrive.Marshal(b, m, deterministic)
 }
-func (dst *FirecrackerDrive) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_FirecrackerDrive.Merge(dst, src)
+func (m *FirecrackerDrive) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_FirecrackerDrive.Merge(m, src)
 }
 func (m *FirecrackerDrive) XXX_Size() int {
 	return xxx_messageInfo_FirecrackerDrive.Size(m)
@@ -367,8 +369,8 @@ func (m *FirecrackerDrive) GetRateLimiter() *FirecrackerRateLimiter {
 
 // Message to specify an IO rate limiter with bytes/s and ops/s limits
 type FirecrackerRateLimiter struct {
-	Bandwidth            *FirecrackerTokenBucket `protobuf:"bytes,1,opt,name=Bandwidth,proto3" json:"Bandwidth,omitempty"`
-	Ops                  *FirecrackerTokenBucket `protobuf:"bytes,2,opt,name=Ops,proto3" json:"Ops,omitempty"`
+	Bandwidth            *FirecrackerTokenBucket `protobuf:"bytes,1,opt,name=Bandwidth,json=bandwidth,proto3" json:"Bandwidth,omitempty"`
+	Ops                  *FirecrackerTokenBucket `protobuf:"bytes,2,opt,name=Ops,json=ops,proto3" json:"Ops,omitempty"`
 	XXX_NoUnkeyedLiteral struct{}                `json:"-"`
 	XXX_unrecognized     []byte                  `json:"-"`
 	XXX_sizecache        int32                   `json:"-"`
@@ -378,7 +380,7 @@ func (m *FirecrackerRateLimiter) Reset()         { *m = FirecrackerRateLimiter{}
 func (m *FirecrackerRateLimiter) String() string { return proto.CompactTextString(m) }
 func (*FirecrackerRateLimiter) ProtoMessage()    {}
 func (*FirecrackerRateLimiter) Descriptor() ([]byte, []int) {
-	return fileDescriptor_types_0f9ecb44d1a28b6a, []int{5}
+	return fileDescriptor_d938547f84707355, []int{5}
 }
 func (m *FirecrackerRateLimiter) XXX_Unmarshal(b []byte) error {
 	return xxx_messageInfo_FirecrackerRateLimiter.Unmarshal(m, b)
@@ -386,8 +388,8 @@ func (m *FirecrackerRateLimiter) XXX_Unmarshal(b []byte) error {
 func (m *FirecrackerRateLimiter) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
 	return xxx_messageInfo_FirecrackerRateLimiter.Marshal(b, m, deterministic)
 }
-func (dst *FirecrackerRateLimiter) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_FirecrackerRateLimiter.Merge(dst, src)
+func (m *FirecrackerRateLimiter) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_FirecrackerRateLimiter.Merge(m, src)
 }
 func (m *FirecrackerRateLimiter) XXX_Size() int {
 	return xxx_messageInfo_FirecrackerRateLimiter.Size(m)
@@ -414,9 +416,9 @@ func (m *FirecrackerRateLimiter) GetOps() *FirecrackerTokenBucket {
 
 // Message to specify a token buicket used to rate limit disk and network IO for a Firecracker VM
 type FirecrackerTokenBucket struct {
-	OneTimeBurst         int64    `protobuf:"varint,1,opt,name=OneTimeBurst,proto3" json:"OneTimeBurst,omitempty"`
-	RefillTime           int64    `protobuf:"varint,2,opt,name=RefillTime,proto3" json:"RefillTime,omitempty"`
-	Capacity             int64    `protobuf:"varint,3,opt,name=Capacity,proto3" json:"Capacity,omitempty"`
+	OneTimeBurst         int64    `protobuf:"varint,1,opt,name=OneTimeBurst,json=oneTimeBurst,proto3" json:"OneTimeBurst,omitempty"`
+	RefillTime           int64    `protobuf:"varint,2,opt,name=RefillTime,json=refillTime,proto3" json:"RefillTime,omitempty"`
+	Capacity             int64    `protobuf:"varint,3,opt,name=Capacity,json=capacity,proto3" json:"Capacity,omitempty"`
 	XXX_NoUnkeyedLiteral struct{} `json:"-"`
 	XXX_unrecognized     []byte   `json:"-"`
 	XXX_sizecache        int32    `json:"-"`
@@ -426,7 +428,7 @@ func (m *FirecrackerTokenBucket) Reset()         { *m = FirecrackerTokenBucket{}
 func (m *FirecrackerTokenBucket) String() string { return proto.CompactTextString(m) }
 func (*FirecrackerTokenBucket) ProtoMessage()    {}
 func (*FirecrackerTokenBucket) Descriptor() ([]byte, []int) {
-	return fileDescriptor_types_0f9ecb44d1a28b6a, []int{6}
+	return fileDescriptor_d938547f84707355, []int{6}
 }
 func (m *FirecrackerTokenBucket) XXX_Unmarshal(b []byte) error {
 	return xxx_messageInfo_FirecrackerTokenBucket.Unmarshal(m, b)
@@ -434,8 +436,8 @@ func (m *FirecrackerTokenBucket) XXX_Unmarshal(b []byte) error {
 func (m *FirecrackerTokenBucket) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
 	return xxx_messageInfo_FirecrackerTokenBucket.Marshal(b, m, deterministic)
 }
-func (dst *FirecrackerTokenBucket) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_FirecrackerTokenBucket.Merge(dst, src)
+func (m *FirecrackerTokenBucket) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_FirecrackerTokenBucket.Merge(m, src)
 }
 func (m *FirecrackerTokenBucket) XXX_Size() int {
 	return xxx_messageInfo_FirecrackerTokenBucket.Size(m)
@@ -477,48 +479,51 @@ func init() {
 	proto.RegisterType((*FirecrackerTokenBucket)(nil), "FirecrackerTokenBucket")
 }
 
-func init() { proto.RegisterFile("types.proto", fileDescriptor_types_0f9ecb44d1a28b6a) }
-
-var fileDescriptor_types_0f9ecb44d1a28b6a = []byte{
-	// 639 bytes of a gzipped FileDescriptorProto
-	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x54, 0xdd, 0x4e, 0x13, 0x41,
-	0x14, 0xce, 0x5a, 0x81, 0xee, 0x59, 0x50, 0x98, 0x18, 0x5d, 0x91, 0x68, 0xb3, 0x57, 0xf5, 0xa6,
-	0x24, 0x18, 0x4d, 0xbc, 0x20, 0xda, 0x1f, 0x0c, 0x45, 0x4b, 0xc9, 0x80, 0x5e, 0x78, 0x63, 0x86,
-	0xdd, 0xd3, 0x32, 0xe9, 0x76, 0x66, 0x33, 0x3b, 0x0b, 0x94, 0xd7, 0xf0, 0x01, 0x7c, 0x22, 0x1f,
-	0xc9, 0xc4, 0xcc, 0xb4, 0xa5, 0xd3, 0x82, 0xa8, 0x57, 0x9b, 0xf9, 0xce, 0x77, 0xbe, 0x39, 0xe7,
-	0x3b, 0x67, 0x07, 0x02, 0x3d, 0xca, 0x30, 0xaf, 0x65, 0x4a, 0x6a, 0xb9, 0xf9, 0xb4, 0x2f, 0x65,
-	0x3f, 0xc5, 0x6d, 0x7b, 0x3a, 0x2d, 0x7a, 0xdb, 0x4c, 0x8c, 0xc6, 0xa1, 0xe8, 0x1b, 0xf8, 0x7b,
-	0x97, 0x5a, 0xb1, 0x16, 0xd3, 0x8c, 0x6c, 0x42, 0xf9, 0x20, 0x97, 0xe2, 0x38, 0xc3, 0x38, 0xf4,
-	0x2a, 0x5e, 0x75, 0x95, 0x5e, 0x9f, 0xc9, 0x1b, 0x08, 0x68, 0x21, 0xe2, 0x6e, 0xa6, 0xb9, 0x14,
-	0x79, 0x78, 0xaf, 0xe2, 0x55, 0x83, 0x9d, 0x47, 0xb5, 0xb1, 0x72, 0x6d, 0xaa, 0x5c, 0xab, 0x8b,
-	0x11, 0x75, 0x89, 0xd1, 0xf7, 0x12, 0x6c, 0x7c, 0xe0, 0x0a, 0x63, 0xc5, 0xe2, 0x01, 0xaa, 0xa6,
-	0x14, 0x3d, 0xde, 0x5f, 0x54, 0xf3, 0xfe, 0x51, 0x8d, 0x1c, 0xc0, 0xc6, 0x21, 0xea, 0x0b, 0xa9,
-	0x06, 0x6d, 0xa1, 0x51, 0xf5, 0x58, 0x8c, 0xa6, 0x96, 0x52, 0x35, 0xd8, 0xd9, 0xaa, 0x39, 0xd7,
-	0x2c, 0x92, 0xe8, 0xcd, 0x34, 0x52, 0x85, 0x87, 0x1f, 0x51, 0x09, 0x4c, 0xdb, 0x43, 0xd6, 0xc7,
-	0x23, 0xa6, 0xcf, 0xc2, 0x52, 0xc5, 0xab, 0xfa, 0x74, 0x11, 0x26, 0xcf, 0x01, 0xc6, 0x50, 0x5d,
-	0xf5, 0xf3, 0xf0, 0xbe, 0x25, 0x39, 0x08, 0x79, 0x0f, 0xd0, 0x61, 0xf1, 0x19, 0x17, 0xd8, 0xec,
-	0xf5, 0xc3, 0x25, 0xdb, 0x4c, 0xc5, 0x2d, 0x67, 0x1a, 0xb5, 0xcd, 0x17, 0x8a, 0x99, 0x66, 0xa8,
-	0x93, 0x43, 0xb6, 0xc1, 0xa7, 0x52, 0xea, 0x96, 0xe2, 0xe7, 0x18, 0x2e, 0x5b, 0x81, 0x0d, 0x57,
-	0xc0, 0x06, 0xe8, 0x8c, 0x43, 0x76, 0x61, 0xbd, 0x9e, 0x24, 0xdc, 0x08, 0xb1, 0xd4, 0x42, 0x79,
-	0xb8, 0x62, 0x7d, 0xb8, 0x25, 0xef, 0x06, 0x35, 0xfa, 0xe5, 0xc1, 0xb3, 0x3b, 0xec, 0x32, 0x1d,
-	0x77, 0x58, 0x5c, 0x4f, 0x12, 0x85, 0xf9, 0x78, 0x3c, 0x3e, 0x75, 0x10, 0x52, 0x81, 0x60, 0x5f,
-	0xe6, 0xba, 0x85, 0xe7, 0x87, 0x6c, 0x88, 0x76, 0x1b, 0x7c, 0xea, 0x42, 0x64, 0x0b, 0xfc, 0x7a,
-	0x9a, 0xca, 0x8b, 0x4e, 0xa7, 0x75, 0x6c, 0x7d, 0x2d, 0xd3, 0x19, 0x40, 0x76, 0x61, 0xad, 0x2d,
-	0x28, 0xd3, 0xf8, 0x89, 0x0f, 0xb9, 0x46, 0x65, 0x4d, 0x0d, 0x76, 0x9e, 0xb8, 0xb5, 0x3b, 0x61,
-	0x3a, 0xcf, 0x26, 0xef, 0xe0, 0x41, 0xb7, 0xd0, 0x6e, 0xfe, 0xd2, 0xdd, 0xf9, 0x0b, 0xf4, 0xe8,
-	0x87, 0x07, 0x2f, 0xfe, 0x32, 0x1f, 0xd3, 0x63, 0xf3, 0xe8, 0xf3, 0x09, 0x0e, 0xb3, 0x94, 0x69,
-	0x9c, 0x98, 0xe0, 0x42, 0xa6, 0xc7, 0x7d, 0xbd, 0x27, 0xd8, 0x69, 0x8a, 0x89, 0xf5, 0xa0, 0x4c,
-	0x67, 0x80, 0xf5, 0x10, 0x87, 0xc7, 0xfc, 0x0a, 0x3b, 0xfc, 0xd4, 0x5a, 0xb0, 0x46, 0x1d, 0xc4,
-	0x64, 0x7f, 0x89, 0xb3, 0xa2, 0x29, 0x0b, 0xa1, 0x6d, 0xff, 0x6b, 0x74, 0x06, 0x44, 0x3f, 0x3d,
-	0x58, 0x5f, 0x1c, 0xa4, 0x91, 0x6c, 0xe7, 0x14, 0x59, 0xd2, 0x15, 0xe9, 0xc8, 0x56, 0x54, 0xa6,
-	0x0e, 0x42, 0x22, 0x58, 0x6d, 0xe7, 0x76, 0x49, 0xf0, 0x9c, 0xc7, 0x38, 0xa9, 0x69, 0x0e, 0x33,
-	0x3f, 0xf9, 0x11, 0x53, 0xba, 0x28, 0x78, 0x32, 0xd9, 0xf7, 0xeb, 0xb3, 0xd1, 0x37, 0x0b, 0xdf,
-	0x15, 0x66, 0x92, 0xd3, 0x45, 0x9f, 0x21, 0xe4, 0x2d, 0x04, 0xff, 0x61, 0xba, 0xcb, 0x8d, 0xae,
-	0xe0, 0xf1, 0xed, 0x34, 0xf2, 0x1a, 0xfc, 0x06, 0x13, 0xc9, 0x05, 0x4f, 0xf4, 0xd9, 0xe4, 0x25,
-	0x98, 0x93, 0x3c, 0x91, 0x03, 0x14, 0x8d, 0x22, 0x1e, 0xa0, 0xa6, 0x33, 0x26, 0x79, 0x09, 0xa5,
-	0x6e, 0x36, 0x7d, 0x88, 0xfe, 0x98, 0x60, 0x38, 0xd1, 0xe5, 0xdc, 0xdd, 0x4e, 0xd8, 0x18, 0xd6,
-	0x15, 0x78, 0xc2, 0x87, 0xd8, 0x28, 0x54, 0xae, 0xed, 0xf5, 0x25, 0x3a, 0x87, 0x19, 0x53, 0x28,
-	0xf6, 0x78, 0x9a, 0x1a, 0xc8, 0xde, 0x57, 0xa2, 0x0e, 0x62, 0x0c, 0x6d, 0xb2, 0x8c, 0xc5, 0x5c,
-	0x8f, 0xac, 0xa1, 0x25, 0x7a, 0x7d, 0x6e, 0xac, 0x7c, 0x5d, 0x1a, 0x3f, 0x66, 0xcb, 0xf6, 0xf3,
-	0xea, 0x77, 0x00, 0x00, 0x00, 0xff, 0xff, 0x26, 0xfb, 0x2b, 0x82, 0x98, 0x05, 0x00, 0x00,
+func init() { proto.RegisterFile("types.proto", fileDescriptor_d938547f84707355) }
+
+var fileDescriptor_d938547f84707355 = []byte{
+	// 679 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x54, 0xdf, 0x6e, 0xd3, 0x3e,
+	0x14, 0x56, 0x7e, 0xf9, 0x6d, 0x6b, 0x9c, 0x76, 0x5b, 0x2d, 0x04, 0x65, 0x4c, 0x50, 0xe5, 0xaa,
+	0xdc, 0x74, 0xd2, 0x10, 0x48, 0x5c, 0x4c, 0xd0, 0x3f, 0x43, 0xeb, 0xa0, 0xeb, 0xe4, 0x0d, 0x2e,
+	0xb8, 0x41, 0x6e, 0x72, 0xda, 0x9a, 0x26, 0x76, 0xe4, 0x38, 0xdd, 0xba, 0xd7, 0xe0, 0x01, 0x78,
+	0x22, 0x1e, 0x09, 0x09, 0xd9, 0x4d, 0xba, 0xb4, 0x1a, 0x03, 0xae, 0x22, 0x7f, 0xe7, 0x3b, 0x9f,
+	0xcf, 0xf9, 0xce, 0x89, 0x91, 0xab, 0xe6, 0x31, 0x24, 0xcd, 0x58, 0x0a, 0x25, 0xf6, 0x1e, 0x8f,
+	0x85, 0x18, 0x87, 0x70, 0x60, 0x4e, 0xc3, 0x74, 0x74, 0x40, 0xf9, 0x7c, 0x11, 0xf2, 0xbe, 0x20,
+	0xe7, 0xf8, 0x5a, 0x49, 0xda, 0xa5, 0x8a, 0xe2, 0x3d, 0x54, 0x3a, 0x4d, 0x04, 0xbf, 0x88, 0xc1,
+	0xaf, 0x59, 0x75, 0xab, 0x51, 0x26, 0xa5, 0xaf, 0xd9, 0x19, 0xbf, 0x42, 0x2e, 0x49, 0xb9, 0x3f,
+	0x88, 0x15, 0x13, 0x3c, 0xa9, 0xfd, 0x57, 0xb7, 0x1a, 0xee, 0xe1, 0x83, 0xe6, 0x42, 0xb9, 0x99,
+	0x2b, 0x37, 0x5b, 0x7c, 0x4e, 0x5c, 0x79, 0x4b, 0xf4, 0xbe, 0xd9, 0xa8, 0xfa, 0x8e, 0x49, 0xf0,
+	0x25, 0xf5, 0xa7, 0x20, 0x3b, 0x82, 0x8f, 0xd8, 0x78, 0x5d, 0xcd, 0xfa, 0x4b, 0x35, 0x7c, 0x8a,
+	0xaa, 0x67, 0xa0, 0xae, 0x84, 0x9c, 0xf6, 0xb8, 0x02, 0x39, 0xa2, 0x3e, 0xe8, 0x5a, 0xec, 0x86,
+	0x7b, 0xb8, 0xdf, 0x2c, 0x5c, 0xb3, 0x4e, 0x22, 0x55, 0xbe, 0x9e, 0x86, 0x1b, 0x68, 0xe7, 0x3d,
+	0x48, 0x0e, 0x61, 0x2f, 0xa2, 0x63, 0x38, 0xa7, 0x6a, 0x52, 0xb3, 0xeb, 0x56, 0xc3, 0x21, 0x3b,
+	0xd3, 0x55, 0x18, 0x3f, 0x45, 0x68, 0xc1, 0x6c, 0xc9, 0x71, 0x52, 0xfb, 0xdf, 0x90, 0xd0, 0x74,
+	0x89, 0xe0, 0xb7, 0x08, 0xf5, 0xa9, 0x3f, 0x61, 0x1c, 0x3a, 0xa3, 0x71, 0x6d, 0xc3, 0x34, 0x53,
+	0x2f, 0x96, 0x93, 0x47, 0x4d, 0xf3, 0xa9, 0xa4, 0xba, 0x19, 0x82, 0xa2, 0x65, 0x0e, 0x3e, 0x40,
+	0x0e, 0x11, 0x42, 0x75, 0x25, 0x9b, 0x41, 0x6d, 0xd3, 0x08, 0x54, 0x8b, 0x02, 0x26, 0x40, 0x1c,
+	0x99, 0x73, 0xf0, 0x11, 0xda, 0x6d, 0x05, 0x01, 0xd3, 0x42, 0x34, 0x34, 0x50, 0x52, 0xdb, 0x32,
+	0x3e, 0xdc, 0x91, 0xb7, 0x4b, 0xd7, 0xa8, 0xde, 0x4f, 0x0b, 0x3d, 0xb9, 0xc7, 0x2e, 0xdd, 0x71,
+	0x9f, 0xfa, 0xad, 0x20, 0x90, 0x90, 0x2c, 0xc6, 0xe3, 0x98, 0x7a, 0x33, 0x04, 0xd7, 0x91, 0x7b,
+	0x22, 0x12, 0xd5, 0x85, 0xd9, 0x19, 0x8d, 0xc0, 0x6c, 0x83, 0x43, 0xdc, 0xc9, 0x2d, 0x84, 0xf7,
+	0x91, 0xd3, 0x0a, 0x43, 0x71, 0xd5, 0xef, 0x77, 0x2f, 0x8c, 0xaf, 0x25, 0xe2, 0xd0, 0x1c, 0xc0,
+	0x47, 0xa8, 0xd2, 0xe3, 0x84, 0x2a, 0xf8, 0xc0, 0x22, 0xa6, 0x40, 0x1a, 0x53, 0xdd, 0xc3, 0x47,
+	0xc5, 0xda, 0x0b, 0x61, 0x52, 0x61, 0x45, 0x36, 0x7e, 0x83, 0xb6, 0x07, 0xa9, 0x2a, 0xe6, 0x6f,
+	0xdc, 0x9f, 0xbf, 0x2d, 0x56, 0xe8, 0xde, 0x77, 0x0b, 0x3d, 0xfb, 0xc3, 0x7c, 0x74, 0x8f, 0x9d,
+	0xf3, 0x8f, 0x97, 0x10, 0xc5, 0x21, 0x55, 0x90, 0x99, 0xe0, 0xfa, 0xb7, 0x90, 0xee, 0xf1, 0x44,
+	0x1d, 0x73, 0x3a, 0x0c, 0x21, 0x30, 0x1e, 0x94, 0x88, 0x33, 0xc9, 0x01, 0xe3, 0x21, 0x44, 0x17,
+	0xec, 0x06, 0xfa, 0x6c, 0x68, 0x2c, 0xa8, 0x10, 0x14, 0x2d, 0x11, 0x9d, 0xfd, 0xc9, 0x8f, 0xd3,
+	0x8e, 0x48, 0xb9, 0x32, 0xfd, 0x57, 0x88, 0x33, 0xcb, 0x01, 0xef, 0x87, 0x85, 0x76, 0xd7, 0x07,
+	0xa9, 0x25, 0x7b, 0x09, 0x01, 0x1a, 0x0c, 0x78, 0x38, 0x37, 0x15, 0x95, 0x08, 0x62, 0x4b, 0x04,
+	0x7b, 0xa8, 0xdc, 0x4b, 0xcc, 0x22, 0xc1, 0x8c, 0xf9, 0x90, 0xd5, 0x54, 0x66, 0x05, 0x4c, 0xff,
+	0xe4, 0xe7, 0x54, 0xaa, 0x34, 0x65, 0x41, 0xb6, 0xef, 0xa5, 0x38, 0x3b, 0x6b, 0x7d, 0xbd, 0xf0,
+	0x03, 0xae, 0x87, 0x9b, 0x2f, 0x7a, 0xbc, 0x44, 0xf0, 0x6b, 0xe4, 0xfe, 0x83, 0xe9, 0xae, 0x2c,
+	0x38, 0x7e, 0x83, 0x1e, 0xde, 0x4d, 0xc3, 0x2f, 0x91, 0xd3, 0xa6, 0x3c, 0xb8, 0x62, 0x81, 0x9a,
+	0x64, 0x2f, 0xc1, 0x8a, 0xe4, 0xa5, 0x98, 0x02, 0x6f, 0xa7, 0xfe, 0x14, 0x14, 0x71, 0x86, 0x39,
+	0x13, 0x3f, 0x47, 0xf6, 0x20, 0xce, 0x1f, 0xa2, 0xdf, 0x26, 0xd8, 0x22, 0x4e, 0xbc, 0xeb, 0x95,
+	0xbb, 0x0b, 0x61, 0x6d, 0xd8, 0x80, 0xc3, 0x25, 0x8b, 0xa0, 0x9d, 0xca, 0x44, 0x99, 0xeb, 0x6d,
+	0x52, 0x16, 0x05, 0x4c, 0x9b, 0x42, 0x60, 0xc4, 0xc2, 0x50, 0x43, 0xe6, 0x3e, 0x9b, 0x20, 0xb9,
+	0x44, 0xb4, 0xa1, 0x1d, 0x1a, 0x53, 0x9f, 0xa9, 0xb9, 0x31, 0xd4, 0x26, 0x25, 0x3f, 0x3b, 0xb7,
+	0xb7, 0x3e, 0x6f, 0x2c, 0x1e, 0xb3, 0x4d, 0xf3, 0x79, 0xf1, 0x2b, 0x00, 0x00, 0xff, 0xff, 0x73,
+	0x09, 0x59, 0xef, 0x98, 0x05, 0x00, 0x00,
 }
diff --git a/proto/ttrpc/events.pb.go b/proto/ttrpc/events.pb.go
new file mode 100644
index 0000000..b08bb0e
--- /dev/null
+++ b/proto/ttrpc/events.pb.go
@@ -0,0 +1,541 @@
+// Code generated by protoc-gen-gogo. DO NOT EDIT.
+// source: events.proto
+
+package proto
+
+import (
+	fmt "fmt"
+	proto "github.com/gogo/protobuf/proto"
+	io "io"
+	math "math"
+	reflect "reflect"
+	strings "strings"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.GoGoProtoPackageIsVersion2 // please upgrade the proto package
+
+type VMStart struct {
+	VMID                 string   `protobuf:"bytes,1,opt,name=VMID,json=vMID,proto3" json:"VMID,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *VMStart) Reset()      { *m = VMStart{} }
+func (*VMStart) ProtoMessage() {}
+func (*VMStart) Descriptor() ([]byte, []int) {
+	return fileDescriptor_8f22242cb04491f9, []int{0}
+}
+func (m *VMStart) XXX_Unmarshal(b []byte) error {
+	return m.Unmarshal(b)
+}
+func (m *VMStart) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	if deterministic {
+		return xxx_messageInfo_VMStart.Marshal(b, m, deterministic)
+	} else {
+		b = b[:cap(b)]
+		n, err := m.MarshalTo(b)
+		if err != nil {
+			return nil, err
+		}
+		return b[:n], nil
+	}
+}
+func (m *VMStart) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_VMStart.Merge(m, src)
+}
+func (m *VMStart) XXX_Size() int {
+	return m.Size()
+}
+func (m *VMStart) XXX_DiscardUnknown() {
+	xxx_messageInfo_VMStart.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_VMStart proto.InternalMessageInfo
+
+type VMStop struct {
+	VMID                 string   `protobuf:"bytes,1,opt,name=VMID,json=vMID,proto3" json:"VMID,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *VMStop) Reset()      { *m = VMStop{} }
+func (*VMStop) ProtoMessage() {}
+func (*VMStop) Descriptor() ([]byte, []int) {
+	return fileDescriptor_8f22242cb04491f9, []int{1}
+}
+func (m *VMStop) XXX_Unmarshal(b []byte) error {
+	return m.Unmarshal(b)
+}
+func (m *VMStop) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	if deterministic {
+		return xxx_messageInfo_VMStop.Marshal(b, m, deterministic)
+	} else {
+		b = b[:cap(b)]
+		n, err := m.MarshalTo(b)
+		if err != nil {
+			return nil, err
+		}
+		return b[:n], nil
+	}
+}
+func (m *VMStop) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_VMStop.Merge(m, src)
+}
+func (m *VMStop) XXX_Size() int {
+	return m.Size()
+}
+func (m *VMStop) XXX_DiscardUnknown() {
+	xxx_messageInfo_VMStop.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_VMStop proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterType((*VMStart)(nil), "VMStart")
+	proto.RegisterType((*VMStop)(nil), "VMStop")
+}
+
+func init() { proto.RegisterFile("events.proto", fileDescriptor_8f22242cb04491f9) }
+
+var fileDescriptor_8f22242cb04491f9 = []byte{
+	// 112 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0xe2, 0x49, 0x2d, 0x4b, 0xcd,
+	0x2b, 0x29, 0xd6, 0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x57, 0x92, 0xe5, 0x62, 0x0f, 0xf3, 0x0d, 0x2e,
+	0x49, 0x2c, 0x2a, 0x11, 0x12, 0xe2, 0x62, 0x09, 0xf3, 0xf5, 0x74, 0x91, 0x60, 0x54, 0x60, 0xd4,
+	0xe0, 0x0c, 0x62, 0x29, 0xf3, 0xf5, 0x74, 0x51, 0x92, 0xe1, 0x62, 0x03, 0x49, 0xe7, 0x17, 0x60,
+	0x93, 0x75, 0x92, 0x38, 0xf1, 0x50, 0x8e, 0xe1, 0xc6, 0x43, 0x39, 0x86, 0x86, 0x47, 0x72, 0x8c,
+	0x27, 0x1e, 0xc9, 0x31, 0x5e, 0x78, 0x24, 0xc7, 0xf8, 0xe0, 0x91, 0x1c, 0x63, 0x12, 0x1b, 0xd8,
+	0x74, 0x63, 0x40, 0x00, 0x00, 0x00, 0xff, 0xff, 0x54, 0x93, 0xbc, 0xf8, 0x6d, 0x00, 0x00, 0x00,
+}
+
+func (m *VMStart) Marshal() (dAtA []byte, err error) {
+	size := m.Size()
+	dAtA = make([]byte, size)
+	n, err := m.MarshalTo(dAtA)
+	if err != nil {
+		return nil, err
+	}
+	return dAtA[:n], nil
+}
+
+func (m *VMStart) MarshalTo(dAtA []byte) (int, error) {
+	var i int
+	_ = i
+	var l int
+	_ = l
+	if len(m.VMID) > 0 {
+		dAtA[i] = 0xa
+		i++
+		i = encodeVarintEvents(dAtA, i, uint64(len(m.VMID)))
+		i += copy(dAtA[i:], m.VMID)
+	}
+	if m.XXX_unrecognized != nil {
+		i += copy(dAtA[i:], m.XXX_unrecognized)
+	}
+	return i, nil
+}
+
+func (m *VMStop) Marshal() (dAtA []byte, err error) {
+	size := m.Size()
+	dAtA = make([]byte, size)
+	n, err := m.MarshalTo(dAtA)
+	if err != nil {
+		return nil, err
+	}
+	return dAtA[:n], nil
+}
+
+func (m *VMStop) MarshalTo(dAtA []byte) (int, error) {
+	var i int
+	_ = i
+	var l int
+	_ = l
+	if len(m.VMID) > 0 {
+		dAtA[i] = 0xa
+		i++
+		i = encodeVarintEvents(dAtA, i, uint64(len(m.VMID)))
+		i += copy(dAtA[i:], m.VMID)
+	}
+	if m.XXX_unrecognized != nil {
+		i += copy(dAtA[i:], m.XXX_unrecognized)
+	}
+	return i, nil
+}
+
+func encodeVarintEvents(dAtA []byte, offset int, v uint64) int {
+	for v >= 1<<7 {
+		dAtA[offset] = uint8(v&0x7f | 0x80)
+		v >>= 7
+		offset++
+	}
+	dAtA[offset] = uint8(v)
+	return offset + 1
+}
+func (m *VMStart) Size() (n int) {
+	if m == nil {
+		return 0
+	}
+	var l int
+	_ = l
+	l = len(m.VMID)
+	if l > 0 {
+		n += 1 + l + sovEvents(uint64(l))
+	}
+	if m.XXX_unrecognized != nil {
+		n += len(m.XXX_unrecognized)
+	}
+	return n
+}
+
+func (m *VMStop) Size() (n int) {
+	if m == nil {
+		return 0
+	}
+	var l int
+	_ = l
+	l = len(m.VMID)
+	if l > 0 {
+		n += 1 + l + sovEvents(uint64(l))
+	}
+	if m.XXX_unrecognized != nil {
+		n += len(m.XXX_unrecognized)
+	}
+	return n
+}
+
+func sovEvents(x uint64) (n int) {
+	for {
+		n++
+		x >>= 7
+		if x == 0 {
+			break
+		}
+	}
+	return n
+}
+func sozEvents(x uint64) (n int) {
+	return sovEvents(uint64((x << 1) ^ uint64((int64(x) >> 63))))
+}
+func (this *VMStart) String() string {
+	if this == nil {
+		return "nil"
+	}
+	s := strings.Join([]string{`&VMStart{`,
+		`VMID:` + fmt.Sprintf("%v", this.VMID) + `,`,
+		`XXX_unrecognized:` + fmt.Sprintf("%v", this.XXX_unrecognized) + `,`,
+		`}`,
+	}, "")
+	return s
+}
+func (this *VMStop) String() string {
+	if this == nil {
+		return "nil"
+	}
+	s := strings.Join([]string{`&VMStop{`,
+		`VMID:` + fmt.Sprintf("%v", this.VMID) + `,`,
+		`XXX_unrecognized:` + fmt.Sprintf("%v", this.XXX_unrecognized) + `,`,
+		`}`,
+	}, "")
+	return s
+}
+func valueToStringEvents(v interface{}) string {
+	rv := reflect.ValueOf(v)
+	if rv.IsNil() {
+		return "nil"
+	}
+	pv := reflect.Indirect(rv).Interface()
+	return fmt.Sprintf("*%v", pv)
+}
+func (m *VMStart) Unmarshal(dAtA []byte) error {
+	l := len(dAtA)
+	iNdEx := 0
+	for iNdEx < l {
+		preIndex := iNdEx
+		var wire uint64
+		for shift := uint(0); ; shift += 7 {
+			if shift >= 64 {
+				return ErrIntOverflowEvents
+			}
+			if iNdEx >= l {
+				return io.ErrUnexpectedEOF
+			}
+			b := dAtA[iNdEx]
+			iNdEx++
+			wire |= uint64(b&0x7F) << shift
+			if b < 0x80 {
+				break
+			}
+		}
+		fieldNum := int32(wire >> 3)
+		wireType := int(wire & 0x7)
+		if wireType == 4 {
+			return fmt.Errorf("proto: VMStart: wiretype end group for non-group")
+		}
+		if fieldNum <= 0 {
+			return fmt.Errorf("proto: VMStart: illegal tag %d (wire type %d)", fieldNum, wire)
+		}
+		switch fieldNum {
+		case 1:
+			if wireType != 2 {
+				return fmt.Errorf("proto: wrong wireType = %d for field VMID", wireType)
+			}
+			var stringLen uint64
+			for shift := uint(0); ; shift += 7 {
+				if shift >= 64 {
+					return ErrIntOverflowEvents
+				}
+				if iNdEx >= l {
+					return io.ErrUnexpectedEOF
+				}
+				b := dAtA[iNdEx]
+				iNdEx++
+				stringLen |= uint64(b&0x7F) << shift
+				if b < 0x80 {
+					break
+				}
+			}
+			intStringLen := int(stringLen)
+			if intStringLen < 0 {
+				return ErrInvalidLengthEvents
+			}
+			postIndex := iNdEx + intStringLen
+			if postIndex < 0 {
+				return ErrInvalidLengthEvents
+			}
+			if postIndex > l {
+				return io.ErrUnexpectedEOF
+			}
+			m.VMID = string(dAtA[iNdEx:postIndex])
+			iNdEx = postIndex
+		default:
+			iNdEx = preIndex
+			skippy, err := skipEvents(dAtA[iNdEx:])
+			if err != nil {
+				return err
+			}
+			if skippy < 0 {
+				return ErrInvalidLengthEvents
+			}
+			if (iNdEx + skippy) < 0 {
+				return ErrInvalidLengthEvents
+			}
+			if (iNdEx + skippy) > l {
+				return io.ErrUnexpectedEOF
+			}
+			m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...)
+			iNdEx += skippy
+		}
+	}
+
+	if iNdEx > l {
+		return io.ErrUnexpectedEOF
+	}
+	return nil
+}
+func (m *VMStop) Unmarshal(dAtA []byte) error {
+	l := len(dAtA)
+	iNdEx := 0
+	for iNdEx < l {
+		preIndex := iNdEx
+		var wire uint64
+		for shift := uint(0); ; shift += 7 {
+			if shift >= 64 {
+				return ErrIntOverflowEvents
+			}
+			if iNdEx >= l {
+				return io.ErrUnexpectedEOF
+			}
+			b := dAtA[iNdEx]
+			iNdEx++
+			wire |= uint64(b&0x7F) << shift
+			if b < 0x80 {
+				break
+			}
+		}
+		fieldNum := int32(wire >> 3)
+		wireType := int(wire & 0x7)
+		if wireType == 4 {
+			return fmt.Errorf("proto: VMStop: wiretype end group for non-group")
+		}
+		if fieldNum <= 0 {
+			return fmt.Errorf("proto: VMStop: illegal tag %d (wire type %d)", fieldNum, wire)
+		}
+		switch fieldNum {
+		case 1:
+			if wireType != 2 {
+				return fmt.Errorf("proto: wrong wireType = %d for field VMID", wireType)
+			}
+			var stringLen uint64
+			for shift := uint(0); ; shift += 7 {
+				if shift >= 64 {
+					return ErrIntOverflowEvents
+				}
+				if iNdEx >= l {
+					return io.ErrUnexpectedEOF
+				}
+				b := dAtA[iNdEx]
+				iNdEx++
+				stringLen |= uint64(b&0x7F) << shift
+				if b < 0x80 {
+					break
+				}
+			}
+			intStringLen := int(stringLen)
+			if intStringLen < 0 {
+				return ErrInvalidLengthEvents
+			}
+			postIndex := iNdEx + intStringLen
+			if postIndex < 0 {
+				return ErrInvalidLengthEvents
+			}
+			if postIndex > l {
+				return io.ErrUnexpectedEOF
+			}
+			m.VMID = string(dAtA[iNdEx:postIndex])
+			iNdEx = postIndex
+		default:
+			iNdEx = preIndex
+			skippy, err := skipEvents(dAtA[iNdEx:])
+			if err != nil {
+				return err
+			}
+			if skippy < 0 {
+				return ErrInvalidLengthEvents
+			}
+			if (iNdEx + skippy) < 0 {
+				return ErrInvalidLengthEvents
+			}
+			if (iNdEx + skippy) > l {
+				return io.ErrUnexpectedEOF
+			}
+			m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...)
+			iNdEx += skippy
+		}
+	}
+
+	if iNdEx > l {
+		return io.ErrUnexpectedEOF
+	}
+	return nil
+}
+func skipEvents(dAtA []byte) (n int, err error) {
+	l := len(dAtA)
+	iNdEx := 0
+	for iNdEx < l {
+		var wire uint64
+		for shift := uint(0); ; shift += 7 {
+			if shift >= 64 {
+				return 0, ErrIntOverflowEvents
+			}
+			if iNdEx >= l {
+				return 0, io.ErrUnexpectedEOF
+			}
+			b := dAtA[iNdEx]
+			iNdEx++
+			wire |= (uint64(b) & 0x7F) << shift
+			if b < 0x80 {
+				break
+			}
+		}
+		wireType := int(wire & 0x7)
+		switch wireType {
+		case 0:
+			for shift := uint(0); ; shift += 7 {
+				if shift >= 64 {
+					return 0, ErrIntOverflowEvents
+				}
+				if iNdEx >= l {
+					return 0, io.ErrUnexpectedEOF
+				}
+				iNdEx++
+				if dAtA[iNdEx-1] < 0x80 {
+					break
+				}
+			}
+			return iNdEx, nil
+		case 1:
+			iNdEx += 8
+			return iNdEx, nil
+		case 2:
+			var length int
+			for shift := uint(0); ; shift += 7 {
+				if shift >= 64 {
+					return 0, ErrIntOverflowEvents
+				}
+				if iNdEx >= l {
+					return 0, io.ErrUnexpectedEOF
+				}
+				b := dAtA[iNdEx]
+				iNdEx++
+				length |= (int(b) & 0x7F) << shift
+				if b < 0x80 {
+					break
+				}
+			}
+			if length < 0 {
+				return 0, ErrInvalidLengthEvents
+			}
+			iNdEx += length
+			if iNdEx < 0 {
+				return 0, ErrInvalidLengthEvents
+			}
+			return iNdEx, nil
+		case 3:
+			for {
+				var innerWire uint64
+				var start int = iNdEx
+				for shift := uint(0); ; shift += 7 {
+					if shift >= 64 {
+						return 0, ErrIntOverflowEvents
+					}
+					if iNdEx >= l {
+						return 0, io.ErrUnexpectedEOF
+					}
+					b := dAtA[iNdEx]
+					iNdEx++
+					innerWire |= (uint64(b) & 0x7F) << shift
+					if b < 0x80 {
+						break
+					}
+				}
+				innerWireType := int(innerWire & 0x7)
+				if innerWireType == 4 {
+					break
+				}
+				next, err := skipEvents(dAtA[start:])
+				if err != nil {
+					return 0, err
+				}
+				iNdEx = start + next
+				if iNdEx < 0 {
+					return 0, ErrInvalidLengthEvents
+				}
+			}
+			return iNdEx, nil
+		case 4:
+			return iNdEx, nil
+		case 5:
+			iNdEx += 4
+			return iNdEx, nil
+		default:
+			return 0, fmt.Errorf("proto: illegal wireType %d", wireType)
+		}
+	}
+	panic("unreachable")
+}
+
+var (
+	ErrInvalidLengthEvents = fmt.Errorf("proto: negative length found during unmarshaling")
+	ErrIntOverflowEvents   = fmt.Errorf("proto: integer overflow")
+)
diff --git a/proto/ttrpc/firecracker.pb.go b/proto/ttrpc/firecracker.pb.go
new file mode 100644
index 0000000..00e360d
--- /dev/null
+++ b/proto/ttrpc/firecracker.pb.go
@@ -0,0 +1,1746 @@
+// Code generated by protoc-gen-gogo. DO NOT EDIT.
+// source: firecracker.proto
+
+package proto
+
+import (
+	context "context"
+	fmt "fmt"
+	github_com_containerd_ttrpc "github.com/containerd/ttrpc"
+	proto "github.com/gogo/protobuf/proto"
+	empty "github.com/golang/protobuf/ptypes/empty"
+	io "io"
+	math "math"
+	reflect "reflect"
+	strings "strings"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.GoGoProtoPackageIsVersion2 // please upgrade the proto package
+
+// CreateVMRequest specifies creation parameters for a new FC instance
+type CreateVMRequest struct {
+	// VM identifier to assign
+	VMID string `protobuf:"bytes,1,opt,name=VMID,json=vMID,proto3" json:"VMID,omitempty"`
+	// Specifies the machine configuration for the VM
+	MachineCfg *FirecrackerMachineConfiguration `protobuf:"bytes,2,opt,name=MachineCfg,json=machineCfg,proto3" json:"MachineCfg,omitempty"`
+	// Specifies the file path where the kernel image is located
+	KernelImagePath string `protobuf:"bytes,3,opt,name=KernelImagePath,json=kernelImagePath,proto3" json:"KernelImagePath,omitempty"`
+	// Specifies the commandline arguments that should be passed to the kernel
+	KernelArgs string `protobuf:"bytes,4,opt,name=KernelArgs,json=kernelArgs,proto3" json:"KernelArgs,omitempty"`
+	// Specifies the root block device for the VM
+	RootDrive *FirecrackerDrive `protobuf:"bytes,5,opt,name=RootDrive,json=rootDrive,proto3" json:"RootDrive,omitempty"`
+	// Specifies the additional block device config for the VM.
+	AdditionalDrives []*FirecrackerDrive `protobuf:"bytes,6,rep,name=AdditionalDrives,json=additionalDrives,proto3" json:"AdditionalDrives,omitempty"`
+	// Specifies the networking configuration for a VM
+	NetworkInterfaces []*FirecrackerNetworkInterface `protobuf:"bytes,7,rep,name=NetworkInterfaces,json=networkInterfaces,proto3" json:"NetworkInterfaces,omitempty"`
+	// The number of dummy drives to reserve in advance before running FC instance.
+	ContainerCount       int32    `protobuf:"varint,8,opt,name=ContainerCount,json=containerCount,proto3" json:"ContainerCount,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *CreateVMRequest) Reset()      { *m = CreateVMRequest{} }
+func (*CreateVMRequest) ProtoMessage() {}
+func (*CreateVMRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_a73317e9fb8da571, []int{0}
+}
+func (m *CreateVMRequest) XXX_Unmarshal(b []byte) error {
+	return m.Unmarshal(b)
+}
+func (m *CreateVMRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	if deterministic {
+		return xxx_messageInfo_CreateVMRequest.Marshal(b, m, deterministic)
+	} else {
+		b = b[:cap(b)]
+		n, err := m.MarshalTo(b)
+		if err != nil {
+			return nil, err
+		}
+		return b[:n], nil
+	}
+}
+func (m *CreateVMRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_CreateVMRequest.Merge(m, src)
+}
+func (m *CreateVMRequest) XXX_Size() int {
+	return m.Size()
+}
+func (m *CreateVMRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_CreateVMRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_CreateVMRequest proto.InternalMessageInfo
+
+type StopVMRequest struct {
+	VMID                 string   `protobuf:"bytes,1,opt,name=VMID,json=vMID,proto3" json:"VMID,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *StopVMRequest) Reset()      { *m = StopVMRequest{} }
+func (*StopVMRequest) ProtoMessage() {}
+func (*StopVMRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_a73317e9fb8da571, []int{1}
+}
+func (m *StopVMRequest) XXX_Unmarshal(b []byte) error {
+	return m.Unmarshal(b)
+}
+func (m *StopVMRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	if deterministic {
+		return xxx_messageInfo_StopVMRequest.Marshal(b, m, deterministic)
+	} else {
+		b = b[:cap(b)]
+		n, err := m.MarshalTo(b)
+		if err != nil {
+			return nil, err
+		}
+		return b[:n], nil
+	}
+}
+func (m *StopVMRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_StopVMRequest.Merge(m, src)
+}
+func (m *StopVMRequest) XXX_Size() int {
+	return m.Size()
+}
+func (m *StopVMRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_StopVMRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_StopVMRequest proto.InternalMessageInfo
+
+type GetVMInfoRequest struct {
+	VMID                 string   `protobuf:"bytes,1,opt,name=VMID,json=vMID,proto3" json:"VMID,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *GetVMInfoRequest) Reset()      { *m = GetVMInfoRequest{} }
+func (*GetVMInfoRequest) ProtoMessage() {}
+func (*GetVMInfoRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_a73317e9fb8da571, []int{2}
+}
+func (m *GetVMInfoRequest) XXX_Unmarshal(b []byte) error {
+	return m.Unmarshal(b)
+}
+func (m *GetVMInfoRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	if deterministic {
+		return xxx_messageInfo_GetVMInfoRequest.Marshal(b, m, deterministic)
+	} else {
+		b = b[:cap(b)]
+		n, err := m.MarshalTo(b)
+		if err != nil {
+			return nil, err
+		}
+		return b[:n], nil
+	}
+}
+func (m *GetVMInfoRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_GetVMInfoRequest.Merge(m, src)
+}
+func (m *GetVMInfoRequest) XXX_Size() int {
+	return m.Size()
+}
+func (m *GetVMInfoRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_GetVMInfoRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_GetVMInfoRequest proto.InternalMessageInfo
+
+type GetVMInfoResponse struct {
+	VMID                 string   `protobuf:"bytes,1,opt,name=VMID,json=vMID,proto3" json:"VMID,omitempty"`
+	ContextID            uint32   `protobuf:"varint,2,opt,name=ContextID,json=contextID,proto3" json:"ContextID,omitempty"`
+	SocketPath           string   `protobuf:"bytes,3,opt,name=SocketPath,json=socketPath,proto3" json:"SocketPath,omitempty"`
+	LogFifoPath          string   `protobuf:"bytes,4,opt,name=LogFifoPath,json=logFifoPath,proto3" json:"LogFifoPath,omitempty"`
+	MetricsFifoPath      string   `protobuf:"bytes,5,opt,name=MetricsFifoPath,json=metricsFifoPath,proto3" json:"MetricsFifoPath,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *GetVMInfoResponse) Reset()      { *m = GetVMInfoResponse{} }
+func (*GetVMInfoResponse) ProtoMessage() {}
+func (*GetVMInfoResponse) Descriptor() ([]byte, []int) {
+	return fileDescriptor_a73317e9fb8da571, []int{3}
+}
+func (m *GetVMInfoResponse) XXX_Unmarshal(b []byte) error {
+	return m.Unmarshal(b)
+}
+func (m *GetVMInfoResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	if deterministic {
+		return xxx_messageInfo_GetVMInfoResponse.Marshal(b, m, deterministic)
+	} else {
+		b = b[:cap(b)]
+		n, err := m.MarshalTo(b)
+		if err != nil {
+			return nil, err
+		}
+		return b[:n], nil
+	}
+}
+func (m *GetVMInfoResponse) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_GetVMInfoResponse.Merge(m, src)
+}
+func (m *GetVMInfoResponse) XXX_Size() int {
+	return m.Size()
+}
+func (m *GetVMInfoResponse) XXX_DiscardUnknown() {
+	xxx_messageInfo_GetVMInfoResponse.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_GetVMInfoResponse proto.InternalMessageInfo
+
+type SetVMMetadataRequest struct {
+	VMID                 string   `protobuf:"bytes,1,opt,name=VMID,json=vMID,proto3" json:"VMID,omitempty"`
+	Metadata             string   `protobuf:"bytes,2,opt,name=Metadata,json=metadata,proto3" json:"Metadata,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *SetVMMetadataRequest) Reset()      { *m = SetVMMetadataRequest{} }
+func (*SetVMMetadataRequest) ProtoMessage() {}
+func (*SetVMMetadataRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_a73317e9fb8da571, []int{4}
+}
+func (m *SetVMMetadataRequest) XXX_Unmarshal(b []byte) error {
+	return m.Unmarshal(b)
+}
+func (m *SetVMMetadataRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	if deterministic {
+		return xxx_messageInfo_SetVMMetadataRequest.Marshal(b, m, deterministic)
+	} else {
+		b = b[:cap(b)]
+		n, err := m.MarshalTo(b)
+		if err != nil {
+			return nil, err
+		}
+		return b[:n], nil
+	}
+}
+func (m *SetVMMetadataRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_SetVMMetadataRequest.Merge(m, src)
+}
+func (m *SetVMMetadataRequest) XXX_Size() int {
+	return m.Size()
+}
+func (m *SetVMMetadataRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_SetVMMetadataRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_SetVMMetadataRequest proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterType((*CreateVMRequest)(nil), "CreateVMRequest")
+	proto.RegisterType((*StopVMRequest)(nil), "StopVMRequest")
+	proto.RegisterType((*GetVMInfoRequest)(nil), "GetVMInfoRequest")
+	proto.RegisterType((*GetVMInfoResponse)(nil), "GetVMInfoResponse")
+	proto.RegisterType((*SetVMMetadataRequest)(nil), "SetVMMetadataRequest")
+}
+
+func init() { proto.RegisterFile("firecracker.proto", fileDescriptor_a73317e9fb8da571) }
+
+var fileDescriptor_a73317e9fb8da571 = []byte{
+	// 533 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x53, 0x4d, 0x8f, 0xd2, 0x50,
+	0x14, 0x9d, 0xca, 0x87, 0xf4, 0x12, 0x3e, 0xfa, 0xa2, 0xa6, 0xc1, 0x49, 0x6d, 0x30, 0x99, 0xb0,
+	0x2a, 0x06, 0xdd, 0x6a, 0x1c, 0x41, 0x4c, 0xd5, 0x1a, 0x53, 0x12, 0x16, 0xee, 0x9e, 0xe5, 0xb6,
+	0xd3, 0x00, 0xef, 0xe1, 0xeb, 0x63, 0x74, 0x76, 0xfe, 0x09, 0x7f, 0x88, 0xff, 0x62, 0x96, 0x2e,
+	0x5d, 0x3a, 0xec, 0xfc, 0x17, 0xa6, 0xaf, 0x53, 0x06, 0x90, 0x61, 0xd5, 0xdc, 0x73, 0xcf, 0xc9,
+	0x3d, 0x7d, 0xe7, 0x5e, 0x30, 0xc2, 0x58, 0x60, 0x20, 0x68, 0x30, 0x45, 0xe1, 0x2c, 0x04, 0x97,
+	0xbc, 0xf5, 0x30, 0xe2, 0x3c, 0x9a, 0x61, 0x57, 0x55, 0x9f, 0x97, 0x61, 0x17, 0xe7, 0x0b, 0x79,
+	0x71, 0xdd, 0xac, 0xca, 0x8b, 0x05, 0x26, 0x59, 0xd1, 0xfe, 0x51, 0x80, 0x46, 0x5f, 0x20, 0x95,
+	0x38, 0xf6, 0x7c, 0xfc, 0xb2, 0xc4, 0x44, 0x12, 0x02, 0xc5, 0xb1, 0xe7, 0x0e, 0x4c, 0xcd, 0xd6,
+	0x3a, 0xba, 0x5f, 0x3c, 0xf7, 0xdc, 0x01, 0x79, 0x09, 0xe0, 0xd1, 0xe0, 0x2c, 0x66, 0xd8, 0x0f,
+	0x23, 0xf3, 0x8e, 0xad, 0x75, 0xaa, 0x3d, 0xdb, 0x19, 0xde, 0x4c, 0xce, 0xbb, 0x9c, 0x85, 0x71,
+	0xb4, 0x14, 0x54, 0xc6, 0x9c, 0xf9, 0x30, 0x5f, 0x6b, 0x48, 0x07, 0x1a, 0xef, 0x50, 0x30, 0x9c,
+	0xb9, 0x73, 0x1a, 0xe1, 0x47, 0x2a, 0xcf, 0xcc, 0x82, 0x1a, 0xd0, 0x98, 0x6e, 0xc3, 0xc4, 0x02,
+	0xc8, 0x98, 0xa7, 0x22, 0x4a, 0xcc, 0xa2, 0x22, 0xc1, 0x74, 0x8d, 0x90, 0x2e, 0xe8, 0x3e, 0xe7,
+	0x72, 0x20, 0xe2, 0x73, 0x34, 0x4b, 0xca, 0x8a, 0xb1, 0x69, 0x45, 0x35, 0x7c, 0x5d, 0xe4, 0x1c,
+	0xf2, 0x1c, 0x9a, 0xa7, 0x93, 0x49, 0x9c, 0x5a, 0xa2, 0x33, 0x05, 0x25, 0x66, 0xd9, 0x2e, 0xec,
+	0xd7, 0x35, 0xe9, 0x0e, 0x95, 0xbc, 0x05, 0xe3, 0x03, 0xca, 0xaf, 0x5c, 0x4c, 0x5d, 0x26, 0x51,
+	0x84, 0x34, 0xc0, 0xc4, 0xbc, 0xab, 0xf4, 0xc7, 0x9b, 0xfa, 0x5d, 0x92, 0x6f, 0xb0, 0x5d, 0x19,
+	0x39, 0x81, 0x7a, 0x9f, 0x33, 0x49, 0x63, 0x86, 0xa2, 0xcf, 0x97, 0x4c, 0x9a, 0x15, 0x5b, 0xeb,
+	0x94, 0xfc, 0x7a, 0xb0, 0x85, 0xb6, 0x1f, 0x43, 0x6d, 0x24, 0xf9, 0xe2, 0x60, 0x28, 0xed, 0x13,
+	0x68, 0xbe, 0x41, 0x39, 0xf6, 0x5c, 0x16, 0xf2, 0x43, 0xbc, 0x9f, 0x1a, 0x18, 0x1b, 0xc4, 0x64,
+	0xc1, 0x59, 0x82, 0x7b, 0x63, 0x3e, 0x06, 0x3d, 0xb5, 0x87, 0xdf, 0xa4, 0x3b, 0x50, 0x29, 0xd7,
+	0x7c, 0x3d, 0xc8, 0x81, 0x34, 0x98, 0x11, 0x0f, 0xa6, 0x28, 0x37, 0xd2, 0x83, 0x64, 0x8d, 0x10,
+	0x1b, 0xaa, 0xef, 0x79, 0x34, 0x8c, 0x43, 0xae, 0x08, 0x59, 0x72, 0xd5, 0xd9, 0x0d, 0x94, 0x2e,
+	0x81, 0x87, 0x52, 0xc4, 0x41, 0xb2, 0x66, 0x95, 0xb2, 0x25, 0x98, 0x6f, 0xc3, 0xed, 0x21, 0xdc,
+	0x1b, 0xa5, 0x96, 0x3d, 0x94, 0x74, 0x42, 0x25, 0x3d, 0xb4, 0x9c, 0x2d, 0xa8, 0xe4, 0x34, 0x65,
+	0x5a, 0xf7, 0x2b, 0xf3, 0xeb, 0xba, 0xf7, 0x57, 0x83, 0xea, 0x46, 0x46, 0xe4, 0x19, 0x54, 0xf2,
+	0x7d, 0x27, 0x4d, 0x67, 0x67, 0xf5, 0x5b, 0x0f, 0x9c, 0xec, 0x72, 0x9c, 0xfc, 0x72, 0x9c, 0xd7,
+	0xe9, 0xe5, 0x90, 0x27, 0x50, 0xce, 0xe2, 0x20, 0x75, 0x67, 0x2b, 0x97, 0x5b, 0x15, 0x3d, 0xd0,
+	0xd7, 0x4f, 0x4e, 0x0c, 0x67, 0x37, 0xa7, 0x16, 0x71, 0xfe, 0x4f, 0xe4, 0x05, 0xd4, 0xb6, 0xfe,
+	0x99, 0xdc, 0x77, 0xf6, 0xbd, 0xc1, 0x6d, 0x33, 0x5f, 0x3d, 0xba, 0xbc, 0xb2, 0x8e, 0x7e, 0x5f,
+	0x59, 0x47, 0xdf, 0x57, 0x96, 0x76, 0xb9, 0xb2, 0xb4, 0x5f, 0x2b, 0x4b, 0xfb, 0xb3, 0xb2, 0xb4,
+	0x4f, 0xa5, 0x8c, 0x59, 0x56, 0x9f, 0xa7, 0xff, 0x02, 0x00, 0x00, 0xff, 0xff, 0x42, 0xe9, 0xd8,
+	0x58, 0x33, 0x04, 0x00, 0x00,
+}
+
+func (m *CreateVMRequest) Marshal() (dAtA []byte, err error) {
+	size := m.Size()
+	dAtA = make([]byte, size)
+	n, err := m.MarshalTo(dAtA)
+	if err != nil {
+		return nil, err
+	}
+	return dAtA[:n], nil
+}
+
+func (m *CreateVMRequest) MarshalTo(dAtA []byte) (int, error) {
+	var i int
+	_ = i
+	var l int
+	_ = l
+	if len(m.VMID) > 0 {
+		dAtA[i] = 0xa
+		i++
+		i = encodeVarintFirecracker(dAtA, i, uint64(len(m.VMID)))
+		i += copy(dAtA[i:], m.VMID)
+	}
+	if m.MachineCfg != nil {
+		dAtA[i] = 0x12
+		i++
+		i = encodeVarintFirecracker(dAtA, i, uint64(m.MachineCfg.Size()))
+		n1, err1 := m.MachineCfg.MarshalTo(dAtA[i:])
+		if err1 != nil {
+			return 0, err1
+		}
+		i += n1
+	}
+	if len(m.KernelImagePath) > 0 {
+		dAtA[i] = 0x1a
+		i++
+		i = encodeVarintFirecracker(dAtA, i, uint64(len(m.KernelImagePath)))
+		i += copy(dAtA[i:], m.KernelImagePath)
+	}
+	if len(m.KernelArgs) > 0 {
+		dAtA[i] = 0x22
+		i++
+		i = encodeVarintFirecracker(dAtA, i, uint64(len(m.KernelArgs)))
+		i += copy(dAtA[i:], m.KernelArgs)
+	}
+	if m.RootDrive != nil {
+		dAtA[i] = 0x2a
+		i++
+		i = encodeVarintFirecracker(dAtA, i, uint64(m.RootDrive.Size()))
+		n2, err2 := m.RootDrive.MarshalTo(dAtA[i:])
+		if err2 != nil {
+			return 0, err2
+		}
+		i += n2
+	}
+	if len(m.AdditionalDrives) > 0 {
+		for _, msg := range m.AdditionalDrives {
+			dAtA[i] = 0x32
+			i++
+			i = encodeVarintFirecracker(dAtA, i, uint64(msg.Size()))
+			n, err := msg.MarshalTo(dAtA[i:])
+			if err != nil {
+				return 0, err
+			}
+			i += n
+		}
+	}
+	if len(m.NetworkInterfaces) > 0 {
+		for _, msg := range m.NetworkInterfaces {
+			dAtA[i] = 0x3a
+			i++
+			i = encodeVarintFirecracker(dAtA, i, uint64(msg.Size()))
+			n, err := msg.MarshalTo(dAtA[i:])
+			if err != nil {
+				return 0, err
+			}
+			i += n
+		}
+	}
+	if m.ContainerCount != 0 {
+		dAtA[i] = 0x40
+		i++
+		i = encodeVarintFirecracker(dAtA, i, uint64(m.ContainerCount))
+	}
+	if m.XXX_unrecognized != nil {
+		i += copy(dAtA[i:], m.XXX_unrecognized)
+	}
+	return i, nil
+}
+
+func (m *StopVMRequest) Marshal() (dAtA []byte, err error) {
+	size := m.Size()
+	dAtA = make([]byte, size)
+	n, err := m.MarshalTo(dAtA)
+	if err != nil {
+		return nil, err
+	}
+	return dAtA[:n], nil
+}
+
+func (m *StopVMRequest) MarshalTo(dAtA []byte) (int, error) {
+	var i int
+	_ = i
+	var l int
+	_ = l
+	if len(m.VMID) > 0 {
+		dAtA[i] = 0xa
+		i++
+		i = encodeVarintFirecracker(dAtA, i, uint64(len(m.VMID)))
+		i += copy(dAtA[i:], m.VMID)
+	}
+	if m.XXX_unrecognized != nil {
+		i += copy(dAtA[i:], m.XXX_unrecognized)
+	}
+	return i, nil
+}
+
+func (m *GetVMInfoRequest) Marshal() (dAtA []byte, err error) {
+	size := m.Size()
+	dAtA = make([]byte, size)
+	n, err := m.MarshalTo(dAtA)
+	if err != nil {
+		return nil, err
+	}
+	return dAtA[:n], nil
+}
+
+func (m *GetVMInfoRequest) MarshalTo(dAtA []byte) (int, error) {
+	var i int
+	_ = i
+	var l int
+	_ = l
+	if len(m.VMID) > 0 {
+		dAtA[i] = 0xa
+		i++
+		i = encodeVarintFirecracker(dAtA, i, uint64(len(m.VMID)))
+		i += copy(dAtA[i:], m.VMID)
+	}
+	if m.XXX_unrecognized != nil {
+		i += copy(dAtA[i:], m.XXX_unrecognized)
+	}
+	return i, nil
+}
+
+func (m *GetVMInfoResponse) Marshal() (dAtA []byte, err error) {
+	size := m.Size()
+	dAtA = make([]byte, size)
+	n, err := m.MarshalTo(dAtA)
+	if err != nil {
+		return nil, err
+	}
+	return dAtA[:n], nil
+}
+
+func (m *GetVMInfoResponse) MarshalTo(dAtA []byte) (int, error) {
+	var i int
+	_ = i
+	var l int
+	_ = l
+	if len(m.VMID) > 0 {
+		dAtA[i] = 0xa
+		i++
+		i = encodeVarintFirecracker(dAtA, i, uint64(len(m.VMID)))
+		i += copy(dAtA[i:], m.VMID)
+	}
+	if m.ContextID != 0 {
+		dAtA[i] = 0x10
+		i++
+		i = encodeVarintFirecracker(dAtA, i, uint64(m.ContextID))
+	}
+	if len(m.SocketPath) > 0 {
+		dAtA[i] = 0x1a
+		i++
+		i = encodeVarintFirecracker(dAtA, i, uint64(len(m.SocketPath)))
+		i += copy(dAtA[i:], m.SocketPath)
+	}
+	if len(m.LogFifoPath) > 0 {
+		dAtA[i] = 0x22
+		i++
+		i = encodeVarintFirecracker(dAtA, i, uint64(len(m.LogFifoPath)))
+		i += copy(dAtA[i:], m.LogFifoPath)
+	}
+	if len(m.MetricsFifoPath) > 0 {
+		dAtA[i] = 0x2a
+		i++
+		i = encodeVarintFirecracker(dAtA, i, uint64(len(m.MetricsFifoPath)))
+		i += copy(dAtA[i:], m.MetricsFifoPath)
+	}
+	if m.XXX_unrecognized != nil {
+		i += copy(dAtA[i:], m.XXX_unrecognized)
+	}
+	return i, nil
+}
+
+func (m *SetVMMetadataRequest) Marshal() (dAtA []byte, err error) {
+	size := m.Size()
+	dAtA = make([]byte, size)
+	n, err := m.MarshalTo(dAtA)
+	if err != nil {
+		return nil, err
+	}
+	return dAtA[:n], nil
+}
+
+func (m *SetVMMetadataRequest) MarshalTo(dAtA []byte) (int, error) {
+	var i int
+	_ = i
+	var l int
+	_ = l
+	if len(m.VMID) > 0 {
+		dAtA[i] = 0xa
+		i++
+		i = encodeVarintFirecracker(dAtA, i, uint64(len(m.VMID)))
+		i += copy(dAtA[i:], m.VMID)
+	}
+	if len(m.Metadata) > 0 {
+		dAtA[i] = 0x12
+		i++
+		i = encodeVarintFirecracker(dAtA, i, uint64(len(m.Metadata)))
+		i += copy(dAtA[i:], m.Metadata)
+	}
+	if m.XXX_unrecognized != nil {
+		i += copy(dAtA[i:], m.XXX_unrecognized)
+	}
+	return i, nil
+}
+
+func encodeVarintFirecracker(dAtA []byte, offset int, v uint64) int {
+	for v >= 1<<7 {
+		dAtA[offset] = uint8(v&0x7f | 0x80)
+		v >>= 7
+		offset++
+	}
+	dAtA[offset] = uint8(v)
+	return offset + 1
+}
+func (m *CreateVMRequest) Size() (n int) {
+	if m == nil {
+		return 0
+	}
+	var l int
+	_ = l
+	l = len(m.VMID)
+	if l > 0 {
+		n += 1 + l + sovFirecracker(uint64(l))
+	}
+	if m.MachineCfg != nil {
+		l = m.MachineCfg.Size()
+		n += 1 + l + sovFirecracker(uint64(l))
+	}
+	l = len(m.KernelImagePath)
+	if l > 0 {
+		n += 1 + l + sovFirecracker(uint64(l))
+	}
+	l = len(m.KernelArgs)
+	if l > 0 {
+		n += 1 + l + sovFirecracker(uint64(l))
+	}
+	if m.RootDrive != nil {
+		l = m.RootDrive.Size()
+		n += 1 + l + sovFirecracker(uint64(l))
+	}
+	if len(m.AdditionalDrives) > 0 {
+		for _, e := range m.AdditionalDrives {
+			l = e.Size()
+			n += 1 + l + sovFirecracker(uint64(l))
+		}
+	}
+	if len(m.NetworkInterfaces) > 0 {
+		for _, e := range m.NetworkInterfaces {
+			l = e.Size()
+			n += 1 + l + sovFirecracker(uint64(l))
+		}
+	}
+	if m.ContainerCount != 0 {
+		n += 1 + sovFirecracker(uint64(m.ContainerCount))
+	}
+	if m.XXX_unrecognized != nil {
+		n += len(m.XXX_unrecognized)
+	}
+	return n
+}
+
+func (m *StopVMRequest) Size() (n int) {
+	if m == nil {
+		return 0
+	}
+	var l int
+	_ = l
+	l = len(m.VMID)
+	if l > 0 {
+		n += 1 + l + sovFirecracker(uint64(l))
+	}
+	if m.XXX_unrecognized != nil {
+		n += len(m.XXX_unrecognized)
+	}
+	return n
+}
+
+func (m *GetVMInfoRequest) Size() (n int) {
+	if m == nil {
+		return 0
+	}
+	var l int
+	_ = l
+	l = len(m.VMID)
+	if l > 0 {
+		n += 1 + l + sovFirecracker(uint64(l))
+	}
+	if m.XXX_unrecognized != nil {
+		n += len(m.XXX_unrecognized)
+	}
+	return n
+}
+
+func (m *GetVMInfoResponse) Size() (n int) {
+	if m == nil {
+		return 0
+	}
+	var l int
+	_ = l
+	l = len(m.VMID)
+	if l > 0 {
+		n += 1 + l + sovFirecracker(uint64(l))
+	}
+	if m.ContextID != 0 {
+		n += 1 + sovFirecracker(uint64(m.ContextID))
+	}
+	l = len(m.SocketPath)
+	if l > 0 {
+		n += 1 + l + sovFirecracker(uint64(l))
+	}
+	l = len(m.LogFifoPath)
+	if l > 0 {
+		n += 1 + l + sovFirecracker(uint64(l))
+	}
+	l = len(m.MetricsFifoPath)
+	if l > 0 {
+		n += 1 + l + sovFirecracker(uint64(l))
+	}
+	if m.XXX_unrecognized != nil {
+		n += len(m.XXX_unrecognized)
+	}
+	return n
+}
+
+func (m *SetVMMetadataRequest) Size() (n int) {
+	if m == nil {
+		return 0
+	}
+	var l int
+	_ = l
+	l = len(m.VMID)
+	if l > 0 {
+		n += 1 + l + sovFirecracker(uint64(l))
+	}
+	l = len(m.Metadata)
+	if l > 0 {
+		n += 1 + l + sovFirecracker(uint64(l))
+	}
+	if m.XXX_unrecognized != nil {
+		n += len(m.XXX_unrecognized)
+	}
+	return n
+}
+
+func sovFirecracker(x uint64) (n int) {
+	for {
+		n++
+		x >>= 7
+		if x == 0 {
+			break
+		}
+	}
+	return n
+}
+func sozFirecracker(x uint64) (n int) {
+	return sovFirecracker(uint64((x << 1) ^ uint64((int64(x) >> 63))))
+}
+func (this *CreateVMRequest) String() string {
+	if this == nil {
+		return "nil"
+	}
+	repeatedStringForAdditionalDrives := "[]*FirecrackerDrive{"
+	for _, f := range this.AdditionalDrives {
+		repeatedStringForAdditionalDrives += strings.Replace(fmt.Sprintf("%v", f), "FirecrackerDrive", "FirecrackerDrive", 1) + ","
+	}
+	repeatedStringForAdditionalDrives += "}"
+	repeatedStringForNetworkInterfaces := "[]*FirecrackerNetworkInterface{"
+	for _, f := range this.NetworkInterfaces {
+		repeatedStringForNetworkInterfaces += strings.Replace(fmt.Sprintf("%v", f), "FirecrackerNetworkInterface", "FirecrackerNetworkInterface", 1) + ","
+	}
+	repeatedStringForNetworkInterfaces += "}"
+	s := strings.Join([]string{`&CreateVMRequest{`,
+		`VMID:` + fmt.Sprintf("%v", this.VMID) + `,`,
+		`MachineCfg:` + strings.Replace(fmt.Sprintf("%v", this.MachineCfg), "FirecrackerMachineConfiguration", "FirecrackerMachineConfiguration", 1) + `,`,
+		`KernelImagePath:` + fmt.Sprintf("%v", this.KernelImagePath) + `,`,
+		`KernelArgs:` + fmt.Sprintf("%v", this.KernelArgs) + `,`,
+		`RootDrive:` + strings.Replace(fmt.Sprintf("%v", this.RootDrive), "FirecrackerDrive", "FirecrackerDrive", 1) + `,`,
+		`AdditionalDrives:` + repeatedStringForAdditionalDrives + `,`,
+		`NetworkInterfaces:` + repeatedStringForNetworkInterfaces + `,`,
+		`ContainerCount:` + fmt.Sprintf("%v", this.ContainerCount) + `,`,
+		`XXX_unrecognized:` + fmt.Sprintf("%v", this.XXX_unrecognized) + `,`,
+		`}`,
+	}, "")
+	return s
+}
+func (this *StopVMRequest) String() string {
+	if this == nil {
+		return "nil"
+	}
+	s := strings.Join([]string{`&StopVMRequest{`,
+		`VMID:` + fmt.Sprintf("%v", this.VMID) + `,`,
+		`XXX_unrecognized:` + fmt.Sprintf("%v", this.XXX_unrecognized) + `,`,
+		`}`,
+	}, "")
+	return s
+}
+func (this *GetVMInfoRequest) String() string {
+	if this == nil {
+		return "nil"
+	}
+	s := strings.Join([]string{`&GetVMInfoRequest{`,
+		`VMID:` + fmt.Sprintf("%v", this.VMID) + `,`,
+		`XXX_unrecognized:` + fmt.Sprintf("%v", this.XXX_unrecognized) + `,`,
+		`}`,
+	}, "")
+	return s
+}
+func (this *GetVMInfoResponse) String() string {
+	if this == nil {
+		return "nil"
+	}
+	s := strings.Join([]string{`&GetVMInfoResponse{`,
+		`VMID:` + fmt.Sprintf("%v", this.VMID) + `,`,
+		`ContextID:` + fmt.Sprintf("%v", this.ContextID) + `,`,
+		`SocketPath:` + fmt.Sprintf("%v", this.SocketPath) + `,`,
+		`LogFifoPath:` + fmt.Sprintf("%v", this.LogFifoPath) + `,`,
+		`MetricsFifoPath:` + fmt.Sprintf("%v", this.MetricsFifoPath) + `,`,
+		`XXX_unrecognized:` + fmt.Sprintf("%v", this.XXX_unrecognized) + `,`,
+		`}`,
+	}, "")
+	return s
+}
+func (this *SetVMMetadataRequest) String() string {
+	if this == nil {
+		return "nil"
+	}
+	s := strings.Join([]string{`&SetVMMetadataRequest{`,
+		`VMID:` + fmt.Sprintf("%v", this.VMID) + `,`,
+		`Metadata:` + fmt.Sprintf("%v", this.Metadata) + `,`,
+		`XXX_unrecognized:` + fmt.Sprintf("%v", this.XXX_unrecognized) + `,`,
+		`}`,
+	}, "")
+	return s
+}
+func valueToStringFirecracker(v interface{}) string {
+	rv := reflect.ValueOf(v)
+	if rv.IsNil() {
+		return "nil"
+	}
+	pv := reflect.Indirect(rv).Interface()
+	return fmt.Sprintf("*%v", pv)
+}
+
+type FirecrackerService interface {
+	CreateVM(ctx context.Context, req *CreateVMRequest) (*empty.Empty, error)
+	StopVM(ctx context.Context, req *StopVMRequest) (*empty.Empty, error)
+	GetVMInfo(ctx context.Context, req *GetVMInfoRequest) (*GetVMInfoResponse, error)
+	SetVMMetadata(ctx context.Context, req *SetVMMetadataRequest) (*empty.Empty, error)
+}
+
+func RegisterFirecrackerService(srv *github_com_containerd_ttrpc.Server, svc FirecrackerService) {
+	srv.Register("Firecracker", map[string]github_com_containerd_ttrpc.Method{
+		"CreateVM": func(ctx context.Context, unmarshal func(interface{}) error) (interface{}, error) {
+			var req CreateVMRequest
+			if err := unmarshal(&req); err != nil {
+				return nil, err
+			}
+			return svc.CreateVM(ctx, &req)
+		},
+		"StopVM": func(ctx context.Context, unmarshal func(interface{}) error) (interface{}, error) {
+			var req StopVMRequest
+			if err := unmarshal(&req); err != nil {
+				return nil, err
+			}
+			return svc.StopVM(ctx, &req)
+		},
+		"GetVMInfo": func(ctx context.Context, unmarshal func(interface{}) error) (interface{}, error) {
+			var req GetVMInfoRequest
+			if err := unmarshal(&req); err != nil {
+				return nil, err
+			}
+			return svc.GetVMInfo(ctx, &req)
+		},
+		"SetVMMetadata": func(ctx context.Context, unmarshal func(interface{}) error) (interface{}, error) {
+			var req SetVMMetadataRequest
+			if err := unmarshal(&req); err != nil {
+				return nil, err
+			}
+			return svc.SetVMMetadata(ctx, &req)
+		},
+	})
+}
+
+type firecrackerClient struct {
+	client *github_com_containerd_ttrpc.Client
+}
+
+func NewFirecrackerClient(client *github_com_containerd_ttrpc.Client) FirecrackerService {
+	return &firecrackerClient{
+		client: client,
+	}
+}
+
+func (c *firecrackerClient) CreateVM(ctx context.Context, req *CreateVMRequest) (*empty.Empty, error) {
+	var resp empty.Empty
+	if err := c.client.Call(ctx, "Firecracker", "CreateVM", req, &resp); err != nil {
+		return nil, err
+	}
+	return &resp, nil
+}
+
+func (c *firecrackerClient) StopVM(ctx context.Context, req *StopVMRequest) (*empty.Empty, error) {
+	var resp empty.Empty
+	if err := c.client.Call(ctx, "Firecracker", "StopVM", req, &resp); err != nil {
+		return nil, err
+	}
+	return &resp, nil
+}
+
+func (c *firecrackerClient) GetVMInfo(ctx context.Context, req *GetVMInfoRequest) (*GetVMInfoResponse, error) {
+	var resp GetVMInfoResponse
+	if err := c.client.Call(ctx, "Firecracker", "GetVMInfo", req, &resp); err != nil {
+		return nil, err
+	}
+	return &resp, nil
+}
+
+func (c *firecrackerClient) SetVMMetadata(ctx context.Context, req *SetVMMetadataRequest) (*empty.Empty, error) {
+	var resp empty.Empty
+	if err := c.client.Call(ctx, "Firecracker", "SetVMMetadata", req, &resp); err != nil {
+		return nil, err
+	}
+	return &resp, nil
+}
+func (m *CreateVMRequest) Unmarshal(dAtA []byte) error {
+	l := len(dAtA)
+	iNdEx := 0
+	for iNdEx < l {
+		preIndex := iNdEx
+		var wire uint64
+		for shift := uint(0); ; shift += 7 {
+			if shift >= 64 {
+				return ErrIntOverflowFirecracker
+			}
+			if iNdEx >= l {
+				return io.ErrUnexpectedEOF
+			}
+			b := dAtA[iNdEx]
+			iNdEx++
+			wire |= uint64(b&0x7F) << shift
+			if b < 0x80 {
+				break
+			}
+		}
+		fieldNum := int32(wire >> 3)
+		wireType := int(wire & 0x7)
+		if wireType == 4 {
+			return fmt.Errorf("proto: CreateVMRequest: wiretype end group for non-group")
+		}
+		if fieldNum <= 0 {
+			return fmt.Errorf("proto: CreateVMRequest: illegal tag %d (wire type %d)", fieldNum, wire)
+		}
+		switch fieldNum {
+		case 1:
+			if wireType != 2 {
+				return fmt.Errorf("proto: wrong wireType = %d for field VMID", wireType)
+			}
+			var stringLen uint64
+			for shift := uint(0); ; shift += 7 {
+				if shift >= 64 {
+					return ErrIntOverflowFirecracker
+				}
+				if iNdEx >= l {
+					return io.ErrUnexpectedEOF
+				}
+				b := dAtA[iNdEx]
+				iNdEx++
+				stringLen |= uint64(b&0x7F) << shift
+				if b < 0x80 {
+					break
+				}
+			}
+			intStringLen := int(stringLen)
+			if intStringLen < 0 {
+				return ErrInvalidLengthFirecracker
+			}
+			postIndex := iNdEx + intStringLen
+			if postIndex < 0 {
+				return ErrInvalidLengthFirecracker
+			}
+			if postIndex > l {
+				return io.ErrUnexpectedEOF
+			}
+			m.VMID = string(dAtA[iNdEx:postIndex])
+			iNdEx = postIndex
+		case 2:
+			if wireType != 2 {
+				return fmt.Errorf("proto: wrong wireType = %d for field MachineCfg", wireType)
+			}
+			var msglen int
+			for shift := uint(0); ; shift += 7 {
+				if shift >= 64 {
+					return ErrIntOverflowFirecracker
+				}
+				if iNdEx >= l {
+					return io.ErrUnexpectedEOF
+				}
+				b := dAtA[iNdEx]
+				iNdEx++
+				msglen |= int(b&0x7F) << shift
+				if b < 0x80 {
+					break
+				}
+			}
+			if msglen < 0 {
+				return ErrInvalidLengthFirecracker
+			}
+			postIndex := iNdEx + msglen
+			if postIndex < 0 {
+				return ErrInvalidLengthFirecracker
+			}
+			if postIndex > l {
+				return io.ErrUnexpectedEOF
+			}
+			if m.MachineCfg == nil {
+				m.MachineCfg = &FirecrackerMachineConfiguration{}
+			}
+			if err := m.MachineCfg.Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
+				return err
+			}
+			iNdEx = postIndex
+		case 3:
+			if wireType != 2 {
+				return fmt.Errorf("proto: wrong wireType = %d for field KernelImagePath", wireType)
+			}
+			var stringLen uint64
+			for shift := uint(0); ; shift += 7 {
+				if shift >= 64 {
+					return ErrIntOverflowFirecracker
+				}
+				if iNdEx >= l {
+					return io.ErrUnexpectedEOF
+				}
+				b := dAtA[iNdEx]
+				iNdEx++
+				stringLen |= uint64(b&0x7F) << shift
+				if b < 0x80 {
+					break
+				}
+			}
+			intStringLen := int(stringLen)
+			if intStringLen < 0 {
+				return ErrInvalidLengthFirecracker
+			}
+			postIndex := iNdEx + intStringLen
+			if postIndex < 0 {
+				return ErrInvalidLengthFirecracker
+			}
+			if postIndex > l {
+				return io.ErrUnexpectedEOF
+			}
+			m.KernelImagePath = string(dAtA[iNdEx:postIndex])
+			iNdEx = postIndex
+		case 4:
+			if wireType != 2 {
+				return fmt.Errorf("proto: wrong wireType = %d for field KernelArgs", wireType)
+			}
+			var stringLen uint64
+			for shift := uint(0); ; shift += 7 {
+				if shift >= 64 {
+					return ErrIntOverflowFirecracker
+				}
+				if iNdEx >= l {
+					return io.ErrUnexpectedEOF
+				}
+				b := dAtA[iNdEx]
+				iNdEx++
+				stringLen |= uint64(b&0x7F) << shift
+				if b < 0x80 {
+					break
+				}
+			}
+			intStringLen := int(stringLen)
+			if intStringLen < 0 {
+				return ErrInvalidLengthFirecracker
+			}
+			postIndex := iNdEx + intStringLen
+			if postIndex < 0 {
+				return ErrInvalidLengthFirecracker
+			}
+			if postIndex > l {
+				return io.ErrUnexpectedEOF
+			}
+			m.KernelArgs = string(dAtA[iNdEx:postIndex])
+			iNdEx = postIndex
+		case 5:
+			if wireType != 2 {
+				return fmt.Errorf("proto: wrong wireType = %d for field RootDrive", wireType)
+			}
+			var msglen int
+			for shift := uint(0); ; shift += 7 {
+				if shift >= 64 {
+					return ErrIntOverflowFirecracker
+				}
+				if iNdEx >= l {
+					return io.ErrUnexpectedEOF
+				}
+				b := dAtA[iNdEx]
+				iNdEx++
+				msglen |= int(b&0x7F) << shift
+				if b < 0x80 {
+					break
+				}
+			}
+			if msglen < 0 {
+				return ErrInvalidLengthFirecracker
+			}
+			postIndex := iNdEx + msglen
+			if postIndex < 0 {
+				return ErrInvalidLengthFirecracker
+			}
+			if postIndex > l {
+				return io.ErrUnexpectedEOF
+			}
+			if m.RootDrive == nil {
+				m.RootDrive = &FirecrackerDrive{}
+			}
+			if err := m.RootDrive.Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
+				return err
+			}
+			iNdEx = postIndex
+		case 6:
+			if wireType != 2 {
+				return fmt.Errorf("proto: wrong wireType = %d for field AdditionalDrives", wireType)
+			}
+			var msglen int
+			for shift := uint(0); ; shift += 7 {
+				if shift >= 64 {
+					return ErrIntOverflowFirecracker
+				}
+				if iNdEx >= l {
+					return io.ErrUnexpectedEOF
+				}
+				b := dAtA[iNdEx]
+				iNdEx++
+				msglen |= int(b&0x7F) << shift
+				if b < 0x80 {
+					break
+				}
+			}
+			if msglen < 0 {
+				return ErrInvalidLengthFirecracker
+			}
+			postIndex := iNdEx + msglen
+			if postIndex < 0 {
+				return ErrInvalidLengthFirecracker
+			}
+			if postIndex > l {
+				return io.ErrUnexpectedEOF
+			}
+			m.AdditionalDrives = append(m.AdditionalDrives, &FirecrackerDrive{})
+			if err := m.AdditionalDrives[len(m.AdditionalDrives)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
+				return err
+			}
+			iNdEx = postIndex
+		case 7:
+			if wireType != 2 {
+				return fmt.Errorf("proto: wrong wireType = %d for field NetworkInterfaces", wireType)
+			}
+			var msglen int
+			for shift := uint(0); ; shift += 7 {
+				if shift >= 64 {
+					return ErrIntOverflowFirecracker
+				}
+				if iNdEx >= l {
+					return io.ErrUnexpectedEOF
+				}
+				b := dAtA[iNdEx]
+				iNdEx++
+				msglen |= int(b&0x7F) << shift
+				if b < 0x80 {
+					break
+				}
+			}
+			if msglen < 0 {
+				return ErrInvalidLengthFirecracker
+			}
+			postIndex := iNdEx + msglen
+			if postIndex < 0 {
+				return ErrInvalidLengthFirecracker
+			}
+			if postIndex > l {
+				return io.ErrUnexpectedEOF
+			}
+			m.NetworkInterfaces = append(m.NetworkInterfaces, &FirecrackerNetworkInterface{})
+			if err := m.NetworkInterfaces[len(m.NetworkInterfaces)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
+				return err
+			}
+			iNdEx = postIndex
+		case 8:
+			if wireType != 0 {
+				return fmt.Errorf("proto: wrong wireType = %d for field ContainerCount", wireType)
+			}
+			m.ContainerCount = 0
+			for shift := uint(0); ; shift += 7 {
+				if shift >= 64 {
+					return ErrIntOverflowFirecracker
+				}
+				if iNdEx >= l {
+					return io.ErrUnexpectedEOF
+				}
+				b := dAtA[iNdEx]
+				iNdEx++
+				m.ContainerCount |= int32(b&0x7F) << shift
+				if b < 0x80 {
+					break
+				}
+			}
+		default:
+			iNdEx = preIndex
+			skippy, err := skipFirecracker(dAtA[iNdEx:])
+			if err != nil {
+				return err
+			}
+			if skippy < 0 {
+				return ErrInvalidLengthFirecracker
+			}
+			if (iNdEx + skippy) < 0 {
+				return ErrInvalidLengthFirecracker
+			}
+			if (iNdEx + skippy) > l {
+				return io.ErrUnexpectedEOF
+			}
+			m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...)
+			iNdEx += skippy
+		}
+	}
+
+	if iNdEx > l {
+		return io.ErrUnexpectedEOF
+	}
+	return nil
+}
+func (m *StopVMRequest) Unmarshal(dAtA []byte) error {
+	l := len(dAtA)
+	iNdEx := 0
+	for iNdEx < l {
+		preIndex := iNdEx
+		var wire uint64
+		for shift := uint(0); ; shift += 7 {
+			if shift >= 64 {
+				return ErrIntOverflowFirecracker
+			}
+			if iNdEx >= l {
+				return io.ErrUnexpectedEOF
+			}
+			b := dAtA[iNdEx]
+			iNdEx++
+			wire |= uint64(b&0x7F) << shift
+			if b < 0x80 {
+				break
+			}
+		}
+		fieldNum := int32(wire >> 3)
+		wireType := int(wire & 0x7)
+		if wireType == 4 {
+			return fmt.Errorf("proto: StopVMRequest: wiretype end group for non-group")
+		}
+		if fieldNum <= 0 {
+			return fmt.Errorf("proto: StopVMRequest: illegal tag %d (wire type %d)", fieldNum, wire)
+		}
+		switch fieldNum {
+		case 1:
+			if wireType != 2 {
+				return fmt.Errorf("proto: wrong wireType = %d for field VMID", wireType)
+			}
+			var stringLen uint64
+			for shift := uint(0); ; shift += 7 {
+				if shift >= 64 {
+					return ErrIntOverflowFirecracker
+				}
+				if iNdEx >= l {
+					return io.ErrUnexpectedEOF
+				}
+				b := dAtA[iNdEx]
+				iNdEx++
+				stringLen |= uint64(b&0x7F) << shift
+				if b < 0x80 {
+					break
+				}
+			}
+			intStringLen := int(stringLen)
+			if intStringLen < 0 {
+				return ErrInvalidLengthFirecracker
+			}
+			postIndex := iNdEx + intStringLen
+			if postIndex < 0 {
+				return ErrInvalidLengthFirecracker
+			}
+			if postIndex > l {
+				return io.ErrUnexpectedEOF
+			}
+			m.VMID = string(dAtA[iNdEx:postIndex])
+			iNdEx = postIndex
+		default:
+			iNdEx = preIndex
+			skippy, err := skipFirecracker(dAtA[iNdEx:])
+			if err != nil {
+				return err
+			}
+			if skippy < 0 {
+				return ErrInvalidLengthFirecracker
+			}
+			if (iNdEx + skippy) < 0 {
+				return ErrInvalidLengthFirecracker
+			}
+			if (iNdEx + skippy) > l {
+				return io.ErrUnexpectedEOF
+			}
+			m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...)
+			iNdEx += skippy
+		}
+	}
+
+	if iNdEx > l {
+		return io.ErrUnexpectedEOF
+	}
+	return nil
+}
+func (m *GetVMInfoRequest) Unmarshal(dAtA []byte) error {
+	l := len(dAtA)
+	iNdEx := 0
+	for iNdEx < l {
+		preIndex := iNdEx
+		var wire uint64
+		for shift := uint(0); ; shift += 7 {
+			if shift >= 64 {
+				return ErrIntOverflowFirecracker
+			}
+			if iNdEx >= l {
+				return io.ErrUnexpectedEOF
+			}
+			b := dAtA[iNdEx]
+			iNdEx++
+			wire |= uint64(b&0x7F) << shift
+			if b < 0x80 {
+				break
+			}
+		}
+		fieldNum := int32(wire >> 3)
+		wireType := int(wire & 0x7)
+		if wireType == 4 {
+			return fmt.Errorf("proto: GetVMInfoRequest: wiretype end group for non-group")
+		}
+		if fieldNum <= 0 {
+			return fmt.Errorf("proto: GetVMInfoRequest: illegal tag %d (wire type %d)", fieldNum, wire)
+		}
+		switch fieldNum {
+		case 1:
+			if wireType != 2 {
+				return fmt.Errorf("proto: wrong wireType = %d for field VMID", wireType)
+			}
+			var stringLen uint64
+			for shift := uint(0); ; shift += 7 {
+				if shift >= 64 {
+					return ErrIntOverflowFirecracker
+				}
+				if iNdEx >= l {
+					return io.ErrUnexpectedEOF
+				}
+				b := dAtA[iNdEx]
+				iNdEx++
+				stringLen |= uint64(b&0x7F) << shift
+				if b < 0x80 {
+					break
+				}
+			}
+			intStringLen := int(stringLen)
+			if intStringLen < 0 {
+				return ErrInvalidLengthFirecracker
+			}
+			postIndex := iNdEx + intStringLen
+			if postIndex < 0 {
+				return ErrInvalidLengthFirecracker
+			}
+			if postIndex > l {
+				return io.ErrUnexpectedEOF
+			}
+			m.VMID = string(dAtA[iNdEx:postIndex])
+			iNdEx = postIndex
+		default:
+			iNdEx = preIndex
+			skippy, err := skipFirecracker(dAtA[iNdEx:])
+			if err != nil {
+				return err
+			}
+			if skippy < 0 {
+				return ErrInvalidLengthFirecracker
+			}
+			if (iNdEx + skippy) < 0 {
+				return ErrInvalidLengthFirecracker
+			}
+			if (iNdEx + skippy) > l {
+				return io.ErrUnexpectedEOF
+			}
+			m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...)
+			iNdEx += skippy
+		}
+	}
+
+	if iNdEx > l {
+		return io.ErrUnexpectedEOF
+	}
+	return nil
+}
+func (m *GetVMInfoResponse) Unmarshal(dAtA []byte) error {
+	l := len(dAtA)
+	iNdEx := 0
+	for iNdEx < l {
+		preIndex := iNdEx
+		var wire uint64
+		for shift := uint(0); ; shift += 7 {
+			if shift >= 64 {
+				return ErrIntOverflowFirecracker
+			}
+			if iNdEx >= l {
+				return io.ErrUnexpectedEOF
+			}
+			b := dAtA[iNdEx]
+			iNdEx++
+			wire |= uint64(b&0x7F) << shift
+			if b < 0x80 {
+				break
+			}
+		}
+		fieldNum := int32(wire >> 3)
+		wireType := int(wire & 0x7)
+		if wireType == 4 {
+			return fmt.Errorf("proto: GetVMInfoResponse: wiretype end group for non-group")
+		}
+		if fieldNum <= 0 {
+			return fmt.Errorf("proto: GetVMInfoResponse: illegal tag %d (wire type %d)", fieldNum, wire)
+		}
+		switch fieldNum {
+		case 1:
+			if wireType != 2 {
+				return fmt.Errorf("proto: wrong wireType = %d for field VMID", wireType)
+			}
+			var stringLen uint64
+			for shift := uint(0); ; shift += 7 {
+				if shift >= 64 {
+					return ErrIntOverflowFirecracker
+				}
+				if iNdEx >= l {
+					return io.ErrUnexpectedEOF
+				}
+				b := dAtA[iNdEx]
+				iNdEx++
+				stringLen |= uint64(b&0x7F) << shift
+				if b < 0x80 {
+					break
+				}
+			}
+			intStringLen := int(stringLen)
+			if intStringLen < 0 {
+				return ErrInvalidLengthFirecracker
+			}
+			postIndex := iNdEx + intStringLen
+			if postIndex < 0 {
+				return ErrInvalidLengthFirecracker
+			}
+			if postIndex > l {
+				return io.ErrUnexpectedEOF
+			}
+			m.VMID = string(dAtA[iNdEx:postIndex])
+			iNdEx = postIndex
+		case 2:
+			if wireType != 0 {
+				return fmt.Errorf("proto: wrong wireType = %d for field ContextID", wireType)
+			}
+			m.ContextID = 0
+			for shift := uint(0); ; shift += 7 {
+				if shift >= 64 {
+					return ErrIntOverflowFirecracker
+				}
+				if iNdEx >= l {
+					return io.ErrUnexpectedEOF
+				}
+				b := dAtA[iNdEx]
+				iNdEx++
+				m.ContextID |= uint32(b&0x7F) << shift
+				if b < 0x80 {
+					break
+				}
+			}
+		case 3:
+			if wireType != 2 {
+				return fmt.Errorf("proto: wrong wireType = %d for field SocketPath", wireType)
+			}
+			var stringLen uint64
+			for shift := uint(0); ; shift += 7 {
+				if shift >= 64 {
+					return ErrIntOverflowFirecracker
+				}
+				if iNdEx >= l {
+					return io.ErrUnexpectedEOF
+				}
+				b := dAtA[iNdEx]
+				iNdEx++
+				stringLen |= uint64(b&0x7F) << shift
+				if b < 0x80 {
+					break
+				}
+			}
+			intStringLen := int(stringLen)
+			if intStringLen < 0 {
+				return ErrInvalidLengthFirecracker
+			}
+			postIndex := iNdEx + intStringLen
+			if postIndex < 0 {
+				return ErrInvalidLengthFirecracker
+			}
+			if postIndex > l {
+				return io.ErrUnexpectedEOF
+			}
+			m.SocketPath = string(dAtA[iNdEx:postIndex])
+			iNdEx = postIndex
+		case 4:
+			if wireType != 2 {
+				return fmt.Errorf("proto: wrong wireType = %d for field LogFifoPath", wireType)
+			}
+			var stringLen uint64
+			for shift := uint(0); ; shift += 7 {
+				if shift >= 64 {
+					return ErrIntOverflowFirecracker
+				}
+				if iNdEx >= l {
+					return io.ErrUnexpectedEOF
+				}
+				b := dAtA[iNdEx]
+				iNdEx++
+				stringLen |= uint64(b&0x7F) << shift
+				if b < 0x80 {
+					break
+				}
+			}
+			intStringLen := int(stringLen)
+			if intStringLen < 0 {
+				return ErrInvalidLengthFirecracker
+			}
+			postIndex := iNdEx + intStringLen
+			if postIndex < 0 {
+				return ErrInvalidLengthFirecracker
+			}
+			if postIndex > l {
+				return io.ErrUnexpectedEOF
+			}
+			m.LogFifoPath = string(dAtA[iNdEx:postIndex])
+			iNdEx = postIndex
+		case 5:
+			if wireType != 2 {
+				return fmt.Errorf("proto: wrong wireType = %d for field MetricsFifoPath", wireType)
+			}
+			var stringLen uint64
+			for shift := uint(0); ; shift += 7 {
+				if shift >= 64 {
+					return ErrIntOverflowFirecracker
+				}
+				if iNdEx >= l {
+					return io.ErrUnexpectedEOF
+				}
+				b := dAtA[iNdEx]
+				iNdEx++
+				stringLen |= uint64(b&0x7F) << shift
+				if b < 0x80 {
+					break
+				}
+			}
+			intStringLen := int(stringLen)
+			if intStringLen < 0 {
+				return ErrInvalidLengthFirecracker
+			}
+			postIndex := iNdEx + intStringLen
+			if postIndex < 0 {
+				return ErrInvalidLengthFirecracker
+			}
+			if postIndex > l {
+				return io.ErrUnexpectedEOF
+			}
+			m.MetricsFifoPath = string(dAtA[iNdEx:postIndex])
+			iNdEx = postIndex
+		default:
+			iNdEx = preIndex
+			skippy, err := skipFirecracker(dAtA[iNdEx:])
+			if err != nil {
+				return err
+			}
+			if skippy < 0 {
+				return ErrInvalidLengthFirecracker
+			}
+			if (iNdEx + skippy) < 0 {
+				return ErrInvalidLengthFirecracker
+			}
+			if (iNdEx + skippy) > l {
+				return io.ErrUnexpectedEOF
+			}
+			m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...)
+			iNdEx += skippy
+		}
+	}
+
+	if iNdEx > l {
+		return io.ErrUnexpectedEOF
+	}
+	return nil
+}
+func (m *SetVMMetadataRequest) Unmarshal(dAtA []byte) error {
+	l := len(dAtA)
+	iNdEx := 0
+	for iNdEx < l {
+		preIndex := iNdEx
+		var wire uint64
+		for shift := uint(0); ; shift += 7 {
+			if shift >= 64 {
+				return ErrIntOverflowFirecracker
+			}
+			if iNdEx >= l {
+				return io.ErrUnexpectedEOF
+			}
+			b := dAtA[iNdEx]
+			iNdEx++
+			wire |= uint64(b&0x7F) << shift
+			if b < 0x80 {
+				break
+			}
+		}
+		fieldNum := int32(wire >> 3)
+		wireType := int(wire & 0x7)
+		if wireType == 4 {
+			return fmt.Errorf("proto: SetVMMetadataRequest: wiretype end group for non-group")
+		}
+		if fieldNum <= 0 {
+			return fmt.Errorf("proto: SetVMMetadataRequest: illegal tag %d (wire type %d)", fieldNum, wire)
+		}
+		switch fieldNum {
+		case 1:
+			if wireType != 2 {
+				return fmt.Errorf("proto: wrong wireType = %d for field VMID", wireType)
+			}
+			var stringLen uint64
+			for shift := uint(0); ; shift += 7 {
+				if shift >= 64 {
+					return ErrIntOverflowFirecracker
+				}
+				if iNdEx >= l {
+					return io.ErrUnexpectedEOF
+				}
+				b := dAtA[iNdEx]
+				iNdEx++
+				stringLen |= uint64(b&0x7F) << shift
+				if b < 0x80 {
+					break
+				}
+			}
+			intStringLen := int(stringLen)
+			if intStringLen < 0 {
+				return ErrInvalidLengthFirecracker
+			}
+			postIndex := iNdEx + intStringLen
+			if postIndex < 0 {
+				return ErrInvalidLengthFirecracker
+			}
+			if postIndex > l {
+				return io.ErrUnexpectedEOF
+			}
+			m.VMID = string(dAtA[iNdEx:postIndex])
+			iNdEx = postIndex
+		case 2:
+			if wireType != 2 {
+				return fmt.Errorf("proto: wrong wireType = %d for field Metadata", wireType)
+			}
+			var stringLen uint64
+			for shift := uint(0); ; shift += 7 {
+				if shift >= 64 {
+					return ErrIntOverflowFirecracker
+				}
+				if iNdEx >= l {
+					return io.ErrUnexpectedEOF
+				}
+				b := dAtA[iNdEx]
+				iNdEx++
+				stringLen |= uint64(b&0x7F) << shift
+				if b < 0x80 {
+					break
+				}
+			}
+			intStringLen := int(stringLen)
+			if intStringLen < 0 {
+				return ErrInvalidLengthFirecracker
+			}
+			postIndex := iNdEx + intStringLen
+			if postIndex < 0 {
+				return ErrInvalidLengthFirecracker
+			}
+			if postIndex > l {
+				return io.ErrUnexpectedEOF
+			}
+			m.Metadata = string(dAtA[iNdEx:postIndex])
+			iNdEx = postIndex
+		default:
+			iNdEx = preIndex
+			skippy, err := skipFirecracker(dAtA[iNdEx:])
+			if err != nil {
+				return err
+			}
+			if skippy < 0 {
+				return ErrInvalidLengthFirecracker
+			}
+			if (iNdEx + skippy) < 0 {
+				return ErrInvalidLengthFirecracker
+			}
+			if (iNdEx + skippy) > l {
+				return io.ErrUnexpectedEOF
+			}
+			m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...)
+			iNdEx += skippy
+		}
+	}
+
+	if iNdEx > l {
+		return io.ErrUnexpectedEOF
+	}
+	return nil
+}
+func skipFirecracker(dAtA []byte) (n int, err error) {
+	l := len(dAtA)
+	iNdEx := 0
+	for iNdEx < l {
+		var wire uint64
+		for shift := uint(0); ; shift += 7 {
+			if shift >= 64 {
+				return 0, ErrIntOverflowFirecracker
+			}
+			if iNdEx >= l {
+				return 0, io.ErrUnexpectedEOF
+			}
+			b := dAtA[iNdEx]
+			iNdEx++
+			wire |= (uint64(b) & 0x7F) << shift
+			if b < 0x80 {
+				break
+			}
+		}
+		wireType := int(wire & 0x7)
+		switch wireType {
+		case 0:
+			for shift := uint(0); ; shift += 7 {
+				if shift >= 64 {
+					return 0, ErrIntOverflowFirecracker
+				}
+				if iNdEx >= l {
+					return 0, io.ErrUnexpectedEOF
+				}
+				iNdEx++
+				if dAtA[iNdEx-1] < 0x80 {
+					break
+				}
+			}
+			return iNdEx, nil
+		case 1:
+			iNdEx += 8
+			return iNdEx, nil
+		case 2:
+			var length int
+			for shift := uint(0); ; shift += 7 {
+				if shift >= 64 {
+					return 0, ErrIntOverflowFirecracker
+				}
+				if iNdEx >= l {
+					return 0, io.ErrUnexpectedEOF
+				}
+				b := dAtA[iNdEx]
+				iNdEx++
+				length |= (int(b) & 0x7F) << shift
+				if b < 0x80 {
+					break
+				}
+			}
+			if length < 0 {
+				return 0, ErrInvalidLengthFirecracker
+			}
+			iNdEx += length
+			if iNdEx < 0 {
+				return 0, ErrInvalidLengthFirecracker
+			}
+			return iNdEx, nil
+		case 3:
+			for {
+				var innerWire uint64
+				var start int = iNdEx
+				for shift := uint(0); ; shift += 7 {
+					if shift >= 64 {
+						return 0, ErrIntOverflowFirecracker
+					}
+					if iNdEx >= l {
+						return 0, io.ErrUnexpectedEOF
+					}
+					b := dAtA[iNdEx]
+					iNdEx++
+					innerWire |= (uint64(b) & 0x7F) << shift
+					if b < 0x80 {
+						break
+					}
+				}
+				innerWireType := int(innerWire & 0x7)
+				if innerWireType == 4 {
+					break
+				}
+				next, err := skipFirecracker(dAtA[start:])
+				if err != nil {
+					return 0, err
+				}
+				iNdEx = start + next
+				if iNdEx < 0 {
+					return 0, ErrInvalidLengthFirecracker
+				}
+			}
+			return iNdEx, nil
+		case 4:
+			return iNdEx, nil
+		case 5:
+			iNdEx += 4
+			return iNdEx, nil
+		default:
+			return 0, fmt.Errorf("proto: illegal wireType %d", wireType)
+		}
+	}
+	panic("unreachable")
+}
+
+var (
+	ErrInvalidLengthFirecracker = fmt.Errorf("proto: negative length found during unmarshaling")
+	ErrIntOverflowFirecracker   = fmt.Errorf("proto: integer overflow")
+)
diff --git a/proto/ttrpc/types.pb.go b/proto/ttrpc/types.pb.go
new file mode 100644
index 0000000..d2ac5e4
--- /dev/null
+++ b/proto/ttrpc/types.pb.go
@@ -0,0 +1,2411 @@
+// Code generated by protoc-gen-gogo. DO NOT EDIT.
+// source: types.proto
+
+package proto
+
+import (
+	fmt "fmt"
+	proto "github.com/gogo/protobuf/proto"
+	types "github.com/gogo/protobuf/types"
+	io "io"
+	math "math"
+	reflect "reflect"
+	strings "strings"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.GoGoProtoPackageIsVersion2 // please upgrade the proto package
+
+// Message to store bundle/config.json bytes
+type ExtraData struct {
+	JsonSpec             []byte     `protobuf:"bytes,1,opt,name=JsonSpec,json=jsonSpec,proto3" json:"JsonSpec,omitempty"`
+	RuncOptions          *types.Any `protobuf:"bytes,2,opt,name=RuncOptions,json=runcOptions,proto3" json:"RuncOptions,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}   `json:"-"`
+	XXX_unrecognized     []byte     `json:"-"`
+	XXX_sizecache        int32      `json:"-"`
+}
+
+func (m *ExtraData) Reset()      { *m = ExtraData{} }
+func (*ExtraData) ProtoMessage() {}
+func (*ExtraData) Descriptor() ([]byte, []int) {
+	return fileDescriptor_d938547f84707355, []int{0}
+}
+func (m *ExtraData) XXX_Unmarshal(b []byte) error {
+	return m.Unmarshal(b)
+}
+func (m *ExtraData) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	if deterministic {
+		return xxx_messageInfo_ExtraData.Marshal(b, m, deterministic)
+	} else {
+		b = b[:cap(b)]
+		n, err := m.MarshalTo(b)
+		if err != nil {
+			return nil, err
+		}
+		return b[:n], nil
+	}
+}
+func (m *ExtraData) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_ExtraData.Merge(m, src)
+}
+func (m *ExtraData) XXX_Size() int {
+	return m.Size()
+}
+func (m *ExtraData) XXX_DiscardUnknown() {
+	xxx_messageInfo_ExtraData.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_ExtraData proto.InternalMessageInfo
+
+// Message to specify the various Firecracker VM configurations for a task
+type FirecrackerConfig struct {
+	RuncOptions       *types.Any                       `protobuf:"bytes,1,opt,name=RuncOptions,json=runcOptions,proto3" json:"RuncOptions,omitempty"`
+	NetworkInterfaces []*FirecrackerNetworkInterface   `protobuf:"bytes,2,rep,name=NetworkInterfaces,json=networkInterfaces,proto3" json:"NetworkInterfaces,omitempty"`
+	KernelImagePath   string                           `protobuf:"bytes,3,opt,name=KernelImagePath,json=kernelImagePath,proto3" json:"KernelImagePath,omitempty"`
+	KernelArgs        string                           `protobuf:"bytes,4,opt,name=KernelArgs,json=kernelArgs,proto3" json:"KernelArgs,omitempty"`
+	MachineCfg        *FirecrackerMachineConfiguration `protobuf:"bytes,5,opt,name=MachineCfg,json=machineCfg,proto3" json:"MachineCfg,omitempty"`
+	RootDrive         *FirecrackerDrive                `protobuf:"bytes,6,opt,name=RootDrive,json=rootDrive,proto3" json:"RootDrive,omitempty"`
+	// Specifies the additional block device config for the VM. Note that
+	// the snapshotter used might itself present block devices to the be
+	// attached to the VM. This fields allows additional block devices to
+	// that list.
+	AdditionalDrives     []*FirecrackerDrive `protobuf:"bytes,7,rep,name=AdditionalDrives,json=additionalDrives,proto3" json:"AdditionalDrives,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}            `json:"-"`
+	XXX_unrecognized     []byte              `json:"-"`
+	XXX_sizecache        int32               `json:"-"`
+}
+
+func (m *FirecrackerConfig) Reset()      { *m = FirecrackerConfig{} }
+func (*FirecrackerConfig) ProtoMessage() {}
+func (*FirecrackerConfig) Descriptor() ([]byte, []int) {
+	return fileDescriptor_d938547f84707355, []int{1}
+}
+func (m *FirecrackerConfig) XXX_Unmarshal(b []byte) error {
+	return m.Unmarshal(b)
+}
+func (m *FirecrackerConfig) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	if deterministic {
+		return xxx_messageInfo_FirecrackerConfig.Marshal(b, m, deterministic)
+	} else {
+		b = b[:cap(b)]
+		n, err := m.MarshalTo(b)
+		if err != nil {
+			return nil, err
+		}
+		return b[:n], nil
+	}
+}
+func (m *FirecrackerConfig) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_FirecrackerConfig.Merge(m, src)
+}
+func (m *FirecrackerConfig) XXX_Size() int {
+	return m.Size()
+}
+func (m *FirecrackerConfig) XXX_DiscardUnknown() {
+	xxx_messageInfo_FirecrackerConfig.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_FirecrackerConfig proto.InternalMessageInfo
+
+// Message to specify network config for a Firecracker VM
+type FirecrackerNetworkInterface struct {
+	MacAddress           string                  `protobuf:"bytes,1,opt,name=MacAddress,json=macAddress,proto3" json:"MacAddress,omitempty"`
+	HostDevName          string                  `protobuf:"bytes,2,opt,name=HostDevName,json=hostDevName,proto3" json:"HostDevName,omitempty"`
+	AllowMMDS            bool                    `protobuf:"varint,3,opt,name=AllowMMDS,json=allowMMDS,proto3" json:"AllowMMDS,omitempty"`
+	InRateLimiter        *FirecrackerRateLimiter `protobuf:"bytes,4,opt,name=InRateLimiter,json=inRateLimiter,proto3" json:"InRateLimiter,omitempty"`
+	OutRateLimiter       *FirecrackerRateLimiter `protobuf:"bytes,5,opt,name=OutRateLimiter,json=outRateLimiter,proto3" json:"OutRateLimiter,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}                `json:"-"`
+	XXX_unrecognized     []byte                  `json:"-"`
+	XXX_sizecache        int32                   `json:"-"`
+}
+
+func (m *FirecrackerNetworkInterface) Reset()      { *m = FirecrackerNetworkInterface{} }
+func (*FirecrackerNetworkInterface) ProtoMessage() {}
+func (*FirecrackerNetworkInterface) Descriptor() ([]byte, []int) {
+	return fileDescriptor_d938547f84707355, []int{2}
+}
+func (m *FirecrackerNetworkInterface) XXX_Unmarshal(b []byte) error {
+	return m.Unmarshal(b)
+}
+func (m *FirecrackerNetworkInterface) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	if deterministic {
+		return xxx_messageInfo_FirecrackerNetworkInterface.Marshal(b, m, deterministic)
+	} else {
+		b = b[:cap(b)]
+		n, err := m.MarshalTo(b)
+		if err != nil {
+			return nil, err
+		}
+		return b[:n], nil
+	}
+}
+func (m *FirecrackerNetworkInterface) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_FirecrackerNetworkInterface.Merge(m, src)
+}
+func (m *FirecrackerNetworkInterface) XXX_Size() int {
+	return m.Size()
+}
+func (m *FirecrackerNetworkInterface) XXX_DiscardUnknown() {
+	xxx_messageInfo_FirecrackerNetworkInterface.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_FirecrackerNetworkInterface proto.InternalMessageInfo
+
+// Message to set the machine config for a Firecracker VM
+type FirecrackerMachineConfiguration struct {
+	CPUTemplate string `protobuf:"bytes,1,opt,name=CPUTemplate,json=cPUTemplate,proto3" json:"CPUTemplate,omitempty"`
+	HtEnabled   bool   `protobuf:"varint,2,opt,name=HtEnabled,json=htEnabled,proto3" json:"HtEnabled,omitempty"`
+	// Specifies the memory size of VM
+	// This lets us create a Firecracker VM of up to 4096 TiB, which
+	// for a mircroVM should be large enough
+	MemSizeMib           uint32   `protobuf:"varint,3,opt,name=MemSizeMib,json=memSizeMib,proto3" json:"MemSizeMib,omitempty"`
+	VcpuCount            uint32   `protobuf:"varint,4,opt,name=VcpuCount,json=vcpuCount,proto3" json:"VcpuCount,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *FirecrackerMachineConfiguration) Reset()      { *m = FirecrackerMachineConfiguration{} }
+func (*FirecrackerMachineConfiguration) ProtoMessage() {}
+func (*FirecrackerMachineConfiguration) Descriptor() ([]byte, []int) {
+	return fileDescriptor_d938547f84707355, []int{3}
+}
+func (m *FirecrackerMachineConfiguration) XXX_Unmarshal(b []byte) error {
+	return m.Unmarshal(b)
+}
+func (m *FirecrackerMachineConfiguration) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	if deterministic {
+		return xxx_messageInfo_FirecrackerMachineConfiguration.Marshal(b, m, deterministic)
+	} else {
+		b = b[:cap(b)]
+		n, err := m.MarshalTo(b)
+		if err != nil {
+			return nil, err
+		}
+		return b[:n], nil
+	}
+}
+func (m *FirecrackerMachineConfiguration) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_FirecrackerMachineConfiguration.Merge(m, src)
+}
+func (m *FirecrackerMachineConfiguration) XXX_Size() int {
+	return m.Size()
+}
+func (m *FirecrackerMachineConfiguration) XXX_DiscardUnknown() {
+	xxx_messageInfo_FirecrackerMachineConfiguration.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_FirecrackerMachineConfiguration proto.InternalMessageInfo
+
+// Message to specify the block device config for a Firecracker VM
+type FirecrackerDrive struct {
+	IsReadOnly           bool                    `protobuf:"varint,1,opt,name=IsReadOnly,json=isReadOnly,proto3" json:"IsReadOnly,omitempty"`
+	IsRootDevice         bool                    `protobuf:"varint,2,opt,name=IsRootDevice,json=isRootDevice,proto3" json:"IsRootDevice,omitempty"`
+	Partuuid             string                  `protobuf:"bytes,3,opt,name=Partuuid,json=partuuid,proto3" json:"Partuuid,omitempty"`
+	PathOnHost           string                  `protobuf:"bytes,4,opt,name=PathOnHost,json=pathOnHost,proto3" json:"PathOnHost,omitempty"`
+	RateLimiter          *FirecrackerRateLimiter `protobuf:"bytes,5,opt,name=RateLimiter,json=rateLimiter,proto3" json:"RateLimiter,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}                `json:"-"`
+	XXX_unrecognized     []byte                  `json:"-"`
+	XXX_sizecache        int32                   `json:"-"`
+}
+
+func (m *FirecrackerDrive) Reset()      { *m = FirecrackerDrive{} }
+func (*FirecrackerDrive) ProtoMessage() {}
+func (*FirecrackerDrive) Descriptor() ([]byte, []int) {
+	return fileDescriptor_d938547f84707355, []int{4}
+}
+func (m *FirecrackerDrive) XXX_Unmarshal(b []byte) error {
+	return m.Unmarshal(b)
+}
+func (m *FirecrackerDrive) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	if deterministic {
+		return xxx_messageInfo_FirecrackerDrive.Marshal(b, m, deterministic)
+	} else {
+		b = b[:cap(b)]
+		n, err := m.MarshalTo(b)
+		if err != nil {
+			return nil, err
+		}
+		return b[:n], nil
+	}
+}
+func (m *FirecrackerDrive) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_FirecrackerDrive.Merge(m, src)
+}
+func (m *FirecrackerDrive) XXX_Size() int {
+	return m.Size()
+}
+func (m *FirecrackerDrive) XXX_DiscardUnknown() {
+	xxx_messageInfo_FirecrackerDrive.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_FirecrackerDrive proto.InternalMessageInfo
+
+// Message to specify an IO rate limiter with bytes/s and ops/s limits
+type FirecrackerRateLimiter struct {
+	Bandwidth            *FirecrackerTokenBucket `protobuf:"bytes,1,opt,name=Bandwidth,json=bandwidth,proto3" json:"Bandwidth,omitempty"`
+	Ops                  *FirecrackerTokenBucket `protobuf:"bytes,2,opt,name=Ops,json=ops,proto3" json:"Ops,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}                `json:"-"`
+	XXX_unrecognized     []byte                  `json:"-"`
+	XXX_sizecache        int32                   `json:"-"`
+}
+
+func (m *FirecrackerRateLimiter) Reset()      { *m = FirecrackerRateLimiter{} }
+func (*FirecrackerRateLimiter) ProtoMessage() {}
+func (*FirecrackerRateLimiter) Descriptor() ([]byte, []int) {
+	return fileDescriptor_d938547f84707355, []int{5}
+}
+func (m *FirecrackerRateLimiter) XXX_Unmarshal(b []byte) error {
+	return m.Unmarshal(b)
+}
+func (m *FirecrackerRateLimiter) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	if deterministic {
+		return xxx_messageInfo_FirecrackerRateLimiter.Marshal(b, m, deterministic)
+	} else {
+		b = b[:cap(b)]
+		n, err := m.MarshalTo(b)
+		if err != nil {
+			return nil, err
+		}
+		return b[:n], nil
+	}
+}
+func (m *FirecrackerRateLimiter) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_FirecrackerRateLimiter.Merge(m, src)
+}
+func (m *FirecrackerRateLimiter) XXX_Size() int {
+	return m.Size()
+}
+func (m *FirecrackerRateLimiter) XXX_DiscardUnknown() {
+	xxx_messageInfo_FirecrackerRateLimiter.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_FirecrackerRateLimiter proto.InternalMessageInfo
+
+// Message to specify a token buicket used to rate limit disk and network IO for a Firecracker VM
+type FirecrackerTokenBucket struct {
+	OneTimeBurst         int64    `protobuf:"varint,1,opt,name=OneTimeBurst,json=oneTimeBurst,proto3" json:"OneTimeBurst,omitempty"`
+	RefillTime           int64    `protobuf:"varint,2,opt,name=RefillTime,json=refillTime,proto3" json:"RefillTime,omitempty"`
+	Capacity             int64    `protobuf:"varint,3,opt,name=Capacity,json=capacity,proto3" json:"Capacity,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *FirecrackerTokenBucket) Reset()      { *m = FirecrackerTokenBucket{} }
+func (*FirecrackerTokenBucket) ProtoMessage() {}
+func (*FirecrackerTokenBucket) Descriptor() ([]byte, []int) {
+	return fileDescriptor_d938547f84707355, []int{6}
+}
+func (m *FirecrackerTokenBucket) XXX_Unmarshal(b []byte) error {
+	return m.Unmarshal(b)
+}
+func (m *FirecrackerTokenBucket) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	if deterministic {
+		return xxx_messageInfo_FirecrackerTokenBucket.Marshal(b, m, deterministic)
+	} else {
+		b = b[:cap(b)]
+		n, err := m.MarshalTo(b)
+		if err != nil {
+			return nil, err
+		}
+		return b[:n], nil
+	}
+}
+func (m *FirecrackerTokenBucket) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_FirecrackerTokenBucket.Merge(m, src)
+}
+func (m *FirecrackerTokenBucket) XXX_Size() int {
+	return m.Size()
+}
+func (m *FirecrackerTokenBucket) XXX_DiscardUnknown() {
+	xxx_messageInfo_FirecrackerTokenBucket.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_FirecrackerTokenBucket proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterType((*ExtraData)(nil), "ExtraData")
+	proto.RegisterType((*FirecrackerConfig)(nil), "FirecrackerConfig")
+	proto.RegisterType((*FirecrackerNetworkInterface)(nil), "FirecrackerNetworkInterface")
+	proto.RegisterType((*FirecrackerMachineConfiguration)(nil), "FirecrackerMachineConfiguration")
+	proto.RegisterType((*FirecrackerDrive)(nil), "FirecrackerDrive")
+	proto.RegisterType((*FirecrackerRateLimiter)(nil), "FirecrackerRateLimiter")
+	proto.RegisterType((*FirecrackerTokenBucket)(nil), "FirecrackerTokenBucket")
+}
+
+func init() { proto.RegisterFile("types.proto", fileDescriptor_d938547f84707355) }
+
+var fileDescriptor_d938547f84707355 = []byte{
+	// 715 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x54, 0xcd, 0x6e, 0xe3, 0x36,
+	0x10, 0x8e, 0xaa, 0x26, 0xb5, 0x28, 0x3b, 0x89, 0x89, 0xa2, 0x75, 0xd3, 0xc0, 0x31, 0x7c, 0x72,
+	0x2f, 0x0e, 0x90, 0xa2, 0x05, 0x7a, 0x08, 0x5a, 0xff, 0xa4, 0x88, 0xd3, 0x3a, 0x0e, 0x98, 0xb4,
+	0x87, 0x5e, 0x0a, 0x5a, 0x1a, 0xdb, 0xac, 0x25, 0x52, 0xa0, 0x28, 0x27, 0xce, 0xa9, 0xef, 0xd0,
+	0x07, 0xe8, 0xeb, 0xe4, 0x52, 0xa0, 0xc7, 0x3d, 0x6e, 0xfc, 0x1e, 0x0b, 0x2c, 0x48, 0x4b, 0x8e,
+	0x6c, 0x64, 0xb3, 0xbb, 0x27, 0x81, 0xdf, 0x7c, 0xf3, 0x71, 0xe6, 0x9b, 0x11, 0x91, 0xab, 0xe6,
+	0x11, 0xc4, 0xcd, 0x48, 0x0a, 0x25, 0x0e, 0xbe, 0x1a, 0x0b, 0x31, 0x0e, 0xe0, 0xd8, 0x9c, 0x86,
+	0xc9, 0xe8, 0x98, 0xf2, 0xf9, 0x32, 0x54, 0xff, 0x13, 0x39, 0x67, 0x77, 0x4a, 0xd2, 0x2e, 0x55,
+	0x14, 0x1f, 0xa0, 0xc2, 0x45, 0x2c, 0xf8, 0x75, 0x04, 0x5e, 0xc5, 0xaa, 0x59, 0x8d, 0x22, 0x29,
+	0xfc, 0x95, 0x9e, 0xf1, 0xf7, 0xc8, 0x25, 0x09, 0xf7, 0x06, 0x91, 0x62, 0x82, 0xc7, 0x95, 0x4f,
+	0x6a, 0x56, 0xc3, 0x3d, 0xf9, 0xbc, 0xb9, 0x54, 0x6e, 0x66, 0xca, 0xcd, 0x16, 0x9f, 0x13, 0x57,
+	0x3e, 0x11, 0xeb, 0xff, 0xd8, 0xa8, 0xfc, 0x33, 0x93, 0xe0, 0x49, 0xea, 0x4d, 0x41, 0x76, 0x04,
+	0x1f, 0xb1, 0xf1, 0xa6, 0x9a, 0xf5, 0x81, 0x6a, 0xf8, 0x02, 0x95, 0x2f, 0x41, 0xdd, 0x0a, 0x39,
+	0xed, 0x71, 0x05, 0x72, 0x44, 0x3d, 0xd0, 0xb5, 0xd8, 0x0d, 0xf7, 0xe4, 0xb0, 0x99, 0xbb, 0x66,
+	0x93, 0x44, 0xca, 0x7c, 0x33, 0x0d, 0x37, 0xd0, 0xde, 0x2f, 0x20, 0x39, 0x04, 0xbd, 0x90, 0x8e,
+	0xe1, 0x8a, 0xaa, 0x49, 0xc5, 0xae, 0x59, 0x0d, 0x87, 0xec, 0x4d, 0xd7, 0x61, 0x5c, 0x45, 0x68,
+	0xc9, 0x6c, 0xc9, 0x71, 0x5c, 0xf9, 0xd4, 0x90, 0xd0, 0x74, 0x85, 0xe0, 0x9f, 0x10, 0xea, 0x53,
+	0x6f, 0xc2, 0x38, 0x74, 0x46, 0xe3, 0xca, 0xb6, 0x69, 0xa6, 0x96, 0x2f, 0x27, 0x8b, 0x9a, 0xe6,
+	0x13, 0x49, 0x75, 0x33, 0x04, 0x85, 0xab, 0x1c, 0x7c, 0x8c, 0x1c, 0x22, 0x84, 0xea, 0x4a, 0x36,
+	0x83, 0xca, 0x8e, 0x11, 0x28, 0xe7, 0x05, 0x4c, 0x80, 0x38, 0x32, 0xe3, 0xe0, 0x53, 0xb4, 0xdf,
+	0xf2, 0x7d, 0xa6, 0x85, 0x68, 0x60, 0xa0, 0xb8, 0xf2, 0x99, 0xf1, 0xe1, 0x99, 0xbc, 0x7d, 0xba,
+	0x41, 0xad, 0xbf, 0xb1, 0xd0, 0xd7, 0x2f, 0xd8, 0xa5, 0x3b, 0xee, 0x53, 0xaf, 0xe5, 0xfb, 0x12,
+	0xe2, 0xe5, 0x78, 0x1c, 0x53, 0x6f, 0x8a, 0xe0, 0x1a, 0x72, 0xcf, 0x45, 0xac, 0xba, 0x30, 0xbb,
+	0xa4, 0x21, 0x98, 0x6d, 0x70, 0x88, 0x3b, 0x79, 0x82, 0xf0, 0x21, 0x72, 0x5a, 0x41, 0x20, 0x6e,
+	0xfb, 0xfd, 0xee, 0xb5, 0xf1, 0xb5, 0x40, 0x1c, 0x9a, 0x01, 0xf8, 0x14, 0x95, 0x7a, 0x9c, 0x50,
+	0x05, 0xbf, 0xb2, 0x90, 0x29, 0x90, 0xc6, 0x54, 0xf7, 0xe4, 0xcb, 0x7c, 0xed, 0xb9, 0x30, 0x29,
+	0xb1, 0x3c, 0x1b, 0xff, 0x88, 0x76, 0x07, 0x89, 0xca, 0xe7, 0x6f, 0xbf, 0x9c, 0xbf, 0x2b, 0xd6,
+	0xe8, 0xf5, 0x7f, 0x2d, 0x74, 0xf4, 0x9e, 0xf9, 0xe8, 0x1e, 0x3b, 0x57, 0xbf, 0xdd, 0x40, 0x18,
+	0x05, 0x54, 0x41, 0x6a, 0x82, 0xeb, 0x3d, 0x41, 0xba, 0xc7, 0x73, 0x75, 0xc6, 0xe9, 0x30, 0x00,
+	0xdf, 0x78, 0x50, 0x20, 0xce, 0x24, 0x03, 0x8c, 0x87, 0x10, 0x5e, 0xb3, 0x7b, 0xe8, 0xb3, 0xa1,
+	0xb1, 0xa0, 0x44, 0x50, 0xb8, 0x42, 0x74, 0xf6, 0xef, 0x5e, 0x94, 0x74, 0x44, 0xc2, 0x95, 0xe9,
+	0xbf, 0x44, 0x9c, 0x59, 0x06, 0xd4, 0xff, 0xb3, 0xd0, 0xfe, 0xe6, 0x20, 0xb5, 0x64, 0x2f, 0x26,
+	0x40, 0xfd, 0x01, 0x0f, 0xe6, 0xa6, 0xa2, 0x02, 0x41, 0x6c, 0x85, 0xe0, 0x3a, 0x2a, 0xf6, 0x62,
+	0xb3, 0x48, 0x30, 0x63, 0x1e, 0xa4, 0x35, 0x15, 0x59, 0x0e, 0xd3, 0x3f, 0xf9, 0x15, 0x95, 0x2a,
+	0x49, 0x98, 0x9f, 0xee, 0x7b, 0x21, 0x4a, 0xcf, 0x5a, 0x5f, 0x2f, 0xfc, 0x80, 0xeb, 0xe1, 0x66,
+	0x8b, 0x1e, 0xad, 0x10, 0xfc, 0x03, 0x72, 0x3f, 0xc2, 0x74, 0x57, 0xe6, 0x1c, 0xbf, 0x47, 0x5f,
+	0x3c, 0x4f, 0xc3, 0xdf, 0x21, 0xa7, 0x4d, 0xb9, 0x7f, 0xcb, 0x7c, 0x35, 0x49, 0x5f, 0x82, 0x35,
+	0xc9, 0x1b, 0x31, 0x05, 0xde, 0x4e, 0xbc, 0x29, 0x28, 0xe2, 0x0c, 0x33, 0x26, 0xfe, 0x06, 0xd9,
+	0x83, 0x28, 0x7b, 0x88, 0xde, 0x99, 0x60, 0x8b, 0x28, 0xae, 0xdf, 0xad, 0xdd, 0x9d, 0x0b, 0x6b,
+	0xc3, 0x06, 0x1c, 0x6e, 0x58, 0x08, 0xed, 0x44, 0xc6, 0xca, 0x5c, 0x6f, 0x93, 0xa2, 0xc8, 0x61,
+	0xda, 0x14, 0x02, 0x23, 0x16, 0x04, 0x1a, 0x32, 0xf7, 0xd9, 0x04, 0xc9, 0x15, 0xa2, 0x0d, 0xed,
+	0xd0, 0x88, 0x7a, 0x4c, 0xcd, 0x8d, 0xa1, 0x36, 0x29, 0x78, 0xe9, 0xb9, 0x7d, 0xf4, 0xf0, 0x58,
+	0xdd, 0x7a, 0xf5, 0x58, 0xdd, 0xfa, 0x7b, 0x51, 0xb5, 0x1e, 0x16, 0x55, 0xeb, 0xff, 0x45, 0xd5,
+	0x7a, 0xbd, 0xa8, 0x5a, 0x7f, 0x6c, 0x2f, 0x1f, 0xb9, 0x1d, 0xf3, 0xf9, 0xf6, 0x6d, 0x00, 0x00,
+	0x00, 0xff, 0xff, 0x17, 0x24, 0xbf, 0xb1, 0xb0, 0x05, 0x00, 0x00,
+}
+
+func (m *ExtraData) Marshal() (dAtA []byte, err error) {
+	size := m.Size()
+	dAtA = make([]byte, size)
+	n, err := m.MarshalTo(dAtA)
+	if err != nil {
+		return nil, err
+	}
+	return dAtA[:n], nil
+}
+
+func (m *ExtraData) MarshalTo(dAtA []byte) (int, error) {
+	var i int
+	_ = i
+	var l int
+	_ = l
+	if len(m.JsonSpec) > 0 {
+		dAtA[i] = 0xa
+		i++
+		i = encodeVarintTypes(dAtA, i, uint64(len(m.JsonSpec)))
+		i += copy(dAtA[i:], m.JsonSpec)
+	}
+	if m.RuncOptions != nil {
+		dAtA[i] = 0x12
+		i++
+		i = encodeVarintTypes(dAtA, i, uint64(m.RuncOptions.Size()))
+		n1, err1 := m.RuncOptions.MarshalTo(dAtA[i:])
+		if err1 != nil {
+			return 0, err1
+		}
+		i += n1
+	}
+	if m.XXX_unrecognized != nil {
+		i += copy(dAtA[i:], m.XXX_unrecognized)
+	}
+	return i, nil
+}
+
+func (m *FirecrackerConfig) Marshal() (dAtA []byte, err error) {
+	size := m.Size()
+	dAtA = make([]byte, size)
+	n, err := m.MarshalTo(dAtA)
+	if err != nil {
+		return nil, err
+	}
+	return dAtA[:n], nil
+}
+
+func (m *FirecrackerConfig) MarshalTo(dAtA []byte) (int, error) {
+	var i int
+	_ = i
+	var l int
+	_ = l
+	if m.RuncOptions != nil {
+		dAtA[i] = 0xa
+		i++
+		i = encodeVarintTypes(dAtA, i, uint64(m.RuncOptions.Size()))
+		n2, err2 := m.RuncOptions.MarshalTo(dAtA[i:])
+		if err2 != nil {
+			return 0, err2
+		}
+		i += n2
+	}
+	if len(m.NetworkInterfaces) > 0 {
+		for _, msg := range m.NetworkInterfaces {
+			dAtA[i] = 0x12
+			i++
+			i = encodeVarintTypes(dAtA, i, uint64(msg.Size()))
+			n, err := msg.MarshalTo(dAtA[i:])
+			if err != nil {
+				return 0, err
+			}
+			i += n
+		}
+	}
+	if len(m.KernelImagePath) > 0 {
+		dAtA[i] = 0x1a
+		i++
+		i = encodeVarintTypes(dAtA, i, uint64(len(m.KernelImagePath)))
+		i += copy(dAtA[i:], m.KernelImagePath)
+	}
+	if len(m.KernelArgs) > 0 {
+		dAtA[i] = 0x22
+		i++
+		i = encodeVarintTypes(dAtA, i, uint64(len(m.KernelArgs)))
+		i += copy(dAtA[i:], m.KernelArgs)
+	}
+	if m.MachineCfg != nil {
+		dAtA[i] = 0x2a
+		i++
+		i = encodeVarintTypes(dAtA, i, uint64(m.MachineCfg.Size()))
+		n3, err3 := m.MachineCfg.MarshalTo(dAtA[i:])
+		if err3 != nil {
+			return 0, err3
+		}
+		i += n3
+	}
+	if m.RootDrive != nil {
+		dAtA[i] = 0x32
+		i++
+		i = encodeVarintTypes(dAtA, i, uint64(m.RootDrive.Size()))
+		n4, err4 := m.RootDrive.MarshalTo(dAtA[i:])
+		if err4 != nil {
+			return 0, err4
+		}
+		i += n4
+	}
+	if len(m.AdditionalDrives) > 0 {
+		for _, msg := range m.AdditionalDrives {
+			dAtA[i] = 0x3a
+			i++
+			i = encodeVarintTypes(dAtA, i, uint64(msg.Size()))
+			n, err := msg.MarshalTo(dAtA[i:])
+			if err != nil {
+				return 0, err
+			}
+			i += n
+		}
+	}
+	if m.XXX_unrecognized != nil {
+		i += copy(dAtA[i:], m.XXX_unrecognized)
+	}
+	return i, nil
+}
+
+func (m *FirecrackerNetworkInterface) Marshal() (dAtA []byte, err error) {
+	size := m.Size()
+	dAtA = make([]byte, size)
+	n, err := m.MarshalTo(dAtA)
+	if err != nil {
+		return nil, err
+	}
+	return dAtA[:n], nil
+}
+
+func (m *FirecrackerNetworkInterface) MarshalTo(dAtA []byte) (int, error) {
+	var i int
+	_ = i
+	var l int
+	_ = l
+	if len(m.MacAddress) > 0 {
+		dAtA[i] = 0xa
+		i++
+		i = encodeVarintTypes(dAtA, i, uint64(len(m.MacAddress)))
+		i += copy(dAtA[i:], m.MacAddress)
+	}
+	if len(m.HostDevName) > 0 {
+		dAtA[i] = 0x12
+		i++
+		i = encodeVarintTypes(dAtA, i, uint64(len(m.HostDevName)))
+		i += copy(dAtA[i:], m.HostDevName)
+	}
+	if m.AllowMMDS {
+		dAtA[i] = 0x18
+		i++
+		if m.AllowMMDS {
+			dAtA[i] = 1
+		} else {
+			dAtA[i] = 0
+		}
+		i++
+	}
+	if m.InRateLimiter != nil {
+		dAtA[i] = 0x22
+		i++
+		i = encodeVarintTypes(dAtA, i, uint64(m.InRateLimiter.Size()))
+		n5, err5 := m.InRateLimiter.MarshalTo(dAtA[i:])
+		if err5 != nil {
+			return 0, err5
+		}
+		i += n5
+	}
+	if m.OutRateLimiter != nil {
+		dAtA[i] = 0x2a
+		i++
+		i = encodeVarintTypes(dAtA, i, uint64(m.OutRateLimiter.Size()))
+		n6, err6 := m.OutRateLimiter.MarshalTo(dAtA[i:])
+		if err6 != nil {
+			return 0, err6
+		}
+		i += n6
+	}
+	if m.XXX_unrecognized != nil {
+		i += copy(dAtA[i:], m.XXX_unrecognized)
+	}
+	return i, nil
+}
+
+func (m *FirecrackerMachineConfiguration) Marshal() (dAtA []byte, err error) {
+	size := m.Size()
+	dAtA = make([]byte, size)
+	n, err := m.MarshalTo(dAtA)
+	if err != nil {
+		return nil, err
+	}
+	return dAtA[:n], nil
+}
+
+func (m *FirecrackerMachineConfiguration) MarshalTo(dAtA []byte) (int, error) {
+	var i int
+	_ = i
+	var l int
+	_ = l
+	if len(m.CPUTemplate) > 0 {
+		dAtA[i] = 0xa
+		i++
+		i = encodeVarintTypes(dAtA, i, uint64(len(m.CPUTemplate)))
+		i += copy(dAtA[i:], m.CPUTemplate)
+	}
+	if m.HtEnabled {
+		dAtA[i] = 0x10
+		i++
+		if m.HtEnabled {
+			dAtA[i] = 1
+		} else {
+			dAtA[i] = 0
+		}
+		i++
+	}
+	if m.MemSizeMib != 0 {
+		dAtA[i] = 0x18
+		i++
+		i = encodeVarintTypes(dAtA, i, uint64(m.MemSizeMib))
+	}
+	if m.VcpuCount != 0 {
+		dAtA[i] = 0x20
+		i++
+		i = encodeVarintTypes(dAtA, i, uint64(m.VcpuCount))
+	}
+	if m.XXX_unrecognized != nil {
+		i += copy(dAtA[i:], m.XXX_unrecognized)
+	}
+	return i, nil
+}
+
+func (m *FirecrackerDrive) Marshal() (dAtA []byte, err error) {
+	size := m.Size()
+	dAtA = make([]byte, size)
+	n, err := m.MarshalTo(dAtA)
+	if err != nil {
+		return nil, err
+	}
+	return dAtA[:n], nil
+}
+
+func (m *FirecrackerDrive) MarshalTo(dAtA []byte) (int, error) {
+	var i int
+	_ = i
+	var l int
+	_ = l
+	if m.IsReadOnly {
+		dAtA[i] = 0x8
+		i++
+		if m.IsReadOnly {
+			dAtA[i] = 1
+		} else {
+			dAtA[i] = 0
+		}
+		i++
+	}
+	if m.IsRootDevice {
+		dAtA[i] = 0x10
+		i++
+		if m.IsRootDevice {
+			dAtA[i] = 1
+		} else {
+			dAtA[i] = 0
+		}
+		i++
+	}
+	if len(m.Partuuid) > 0 {
+		dAtA[i] = 0x1a
+		i++
+		i = encodeVarintTypes(dAtA, i, uint64(len(m.Partuuid)))
+		i += copy(dAtA[i:], m.Partuuid)
+	}
+	if len(m.PathOnHost) > 0 {
+		dAtA[i] = 0x22
+		i++
+		i = encodeVarintTypes(dAtA, i, uint64(len(m.PathOnHost)))
+		i += copy(dAtA[i:], m.PathOnHost)
+	}
+	if m.RateLimiter != nil {
+		dAtA[i] = 0x2a
+		i++
+		i = encodeVarintTypes(dAtA, i, uint64(m.RateLimiter.Size()))
+		n7, err7 := m.RateLimiter.MarshalTo(dAtA[i:])
+		if err7 != nil {
+			return 0, err7
+		}
+		i += n7
+	}
+	if m.XXX_unrecognized != nil {
+		i += copy(dAtA[i:], m.XXX_unrecognized)
+	}
+	return i, nil
+}
+
+func (m *FirecrackerRateLimiter) Marshal() (dAtA []byte, err error) {
+	size := m.Size()
+	dAtA = make([]byte, size)
+	n, err := m.MarshalTo(dAtA)
+	if err != nil {
+		return nil, err
+	}
+	return dAtA[:n], nil
+}
+
+func (m *FirecrackerRateLimiter) MarshalTo(dAtA []byte) (int, error) {
+	var i int
+	_ = i
+	var l int
+	_ = l
+	if m.Bandwidth != nil {
+		dAtA[i] = 0xa
+		i++
+		i = encodeVarintTypes(dAtA, i, uint64(m.Bandwidth.Size()))
+		n8, err8 := m.Bandwidth.MarshalTo(dAtA[i:])
+		if err8 != nil {
+			return 0, err8
+		}
+		i += n8
+	}
+	if m.Ops != nil {
+		dAtA[i] = 0x12
+		i++
+		i = encodeVarintTypes(dAtA, i, uint64(m.Ops.Size()))
+		n9, err9 := m.Ops.MarshalTo(dAtA[i:])
+		if err9 != nil {
+			return 0, err9
+		}
+		i += n9
+	}
+	if m.XXX_unrecognized != nil {
+		i += copy(dAtA[i:], m.XXX_unrecognized)
+	}
+	return i, nil
+}
+
+func (m *FirecrackerTokenBucket) Marshal() (dAtA []byte, err error) {
+	size := m.Size()
+	dAtA = make([]byte, size)
+	n, err := m.MarshalTo(dAtA)
+	if err != nil {
+		return nil, err
+	}
+	return dAtA[:n], nil
+}
+
+func (m *FirecrackerTokenBucket) MarshalTo(dAtA []byte) (int, error) {
+	var i int
+	_ = i
+	var l int
+	_ = l
+	if m.OneTimeBurst != 0 {
+		dAtA[i] = 0x8
+		i++
+		i = encodeVarintTypes(dAtA, i, uint64(m.OneTimeBurst))
+	}
+	if m.RefillTime != 0 {
+		dAtA[i] = 0x10
+		i++
+		i = encodeVarintTypes(dAtA, i, uint64(m.RefillTime))
+	}
+	if m.Capacity != 0 {
+		dAtA[i] = 0x18
+		i++
+		i = encodeVarintTypes(dAtA, i, uint64(m.Capacity))
+	}
+	if m.XXX_unrecognized != nil {
+		i += copy(dAtA[i:], m.XXX_unrecognized)
+	}
+	return i, nil
+}
+
+func encodeVarintTypes(dAtA []byte, offset int, v uint64) int {
+	for v >= 1<<7 {
+		dAtA[offset] = uint8(v&0x7f | 0x80)
+		v >>= 7
+		offset++
+	}
+	dAtA[offset] = uint8(v)
+	return offset + 1
+}
+func (m *ExtraData) Size() (n int) {
+	if m == nil {
+		return 0
+	}
+	var l int
+	_ = l
+	l = len(m.JsonSpec)
+	if l > 0 {
+		n += 1 + l + sovTypes(uint64(l))
+	}
+	if m.RuncOptions != nil {
+		l = m.RuncOptions.Size()
+		n += 1 + l + sovTypes(uint64(l))
+	}
+	if m.XXX_unrecognized != nil {
+		n += len(m.XXX_unrecognized)
+	}
+	return n
+}
+
+func (m *FirecrackerConfig) Size() (n int) {
+	if m == nil {
+		return 0
+	}
+	var l int
+	_ = l
+	if m.RuncOptions != nil {
+		l = m.RuncOptions.Size()
+		n += 1 + l + sovTypes(uint64(l))
+	}
+	if len(m.NetworkInterfaces) > 0 {
+		for _, e := range m.NetworkInterfaces {
+			l = e.Size()
+			n += 1 + l + sovTypes(uint64(l))
+		}
+	}
+	l = len(m.KernelImagePath)
+	if l > 0 {
+		n += 1 + l + sovTypes(uint64(l))
+	}
+	l = len(m.KernelArgs)
+	if l > 0 {
+		n += 1 + l + sovTypes(uint64(l))
+	}
+	if m.MachineCfg != nil {
+		l = m.MachineCfg.Size()
+		n += 1 + l + sovTypes(uint64(l))
+	}
+	if m.RootDrive != nil {
+		l = m.RootDrive.Size()
+		n += 1 + l + sovTypes(uint64(l))
+	}
+	if len(m.AdditionalDrives) > 0 {
+		for _, e := range m.AdditionalDrives {
+			l = e.Size()
+			n += 1 + l + sovTypes(uint64(l))
+		}
+	}
+	if m.XXX_unrecognized != nil {
+		n += len(m.XXX_unrecognized)
+	}
+	return n
+}
+
+func (m *FirecrackerNetworkInterface) Size() (n int) {
+	if m == nil {
+		return 0
+	}
+	var l int
+	_ = l
+	l = len(m.MacAddress)
+	if l > 0 {
+		n += 1 + l + sovTypes(uint64(l))
+	}
+	l = len(m.HostDevName)
+	if l > 0 {
+		n += 1 + l + sovTypes(uint64(l))
+	}
+	if m.AllowMMDS {
+		n += 2
+	}
+	if m.InRateLimiter != nil {
+		l = m.InRateLimiter.Size()
+		n += 1 + l + sovTypes(uint64(l))
+	}
+	if m.OutRateLimiter != nil {
+		l = m.OutRateLimiter.Size()
+		n += 1 + l + sovTypes(uint64(l))
+	}
+	if m.XXX_unrecognized != nil {
+		n += len(m.XXX_unrecognized)
+	}
+	return n
+}
+
+func (m *FirecrackerMachineConfiguration) Size() (n int) {
+	if m == nil {
+		return 0
+	}
+	var l int
+	_ = l
+	l = len(m.CPUTemplate)
+	if l > 0 {
+		n += 1 + l + sovTypes(uint64(l))
+	}
+	if m.HtEnabled {
+		n += 2
+	}
+	if m.MemSizeMib != 0 {
+		n += 1 + sovTypes(uint64(m.MemSizeMib))
+	}
+	if m.VcpuCount != 0 {
+		n += 1 + sovTypes(uint64(m.VcpuCount))
+	}
+	if m.XXX_unrecognized != nil {
+		n += len(m.XXX_unrecognized)
+	}
+	return n
+}
+
+func (m *FirecrackerDrive) Size() (n int) {
+	if m == nil {
+		return 0
+	}
+	var l int
+	_ = l
+	if m.IsReadOnly {
+		n += 2
+	}
+	if m.IsRootDevice {
+		n += 2
+	}
+	l = len(m.Partuuid)
+	if l > 0 {
+		n += 1 + l + sovTypes(uint64(l))
+	}
+	l = len(m.PathOnHost)
+	if l > 0 {
+		n += 1 + l + sovTypes(uint64(l))
+	}
+	if m.RateLimiter != nil {
+		l = m.RateLimiter.Size()
+		n += 1 + l + sovTypes(uint64(l))
+	}
+	if m.XXX_unrecognized != nil {
+		n += len(m.XXX_unrecognized)
+	}
+	return n
+}
+
+func (m *FirecrackerRateLimiter) Size() (n int) {
+	if m == nil {
+		return 0
+	}
+	var l int
+	_ = l
+	if m.Bandwidth != nil {
+		l = m.Bandwidth.Size()
+		n += 1 + l + sovTypes(uint64(l))
+	}
+	if m.Ops != nil {
+		l = m.Ops.Size()
+		n += 1 + l + sovTypes(uint64(l))
+	}
+	if m.XXX_unrecognized != nil {
+		n += len(m.XXX_unrecognized)
+	}
+	return n
+}
+
+func (m *FirecrackerTokenBucket) Size() (n int) {
+	if m == nil {
+		return 0
+	}
+	var l int
+	_ = l
+	if m.OneTimeBurst != 0 {
+		n += 1 + sovTypes(uint64(m.OneTimeBurst))
+	}
+	if m.RefillTime != 0 {
+		n += 1 + sovTypes(uint64(m.RefillTime))
+	}
+	if m.Capacity != 0 {
+		n += 1 + sovTypes(uint64(m.Capacity))
+	}
+	if m.XXX_unrecognized != nil {
+		n += len(m.XXX_unrecognized)
+	}
+	return n
+}
+
+func sovTypes(x uint64) (n int) {
+	for {
+		n++
+		x >>= 7
+		if x == 0 {
+			break
+		}
+	}
+	return n
+}
+func sozTypes(x uint64) (n int) {
+	return sovTypes(uint64((x << 1) ^ uint64((int64(x) >> 63))))
+}
+func (this *ExtraData) String() string {
+	if this == nil {
+		return "nil"
+	}
+	s := strings.Join([]string{`&ExtraData{`,
+		`JsonSpec:` + fmt.Sprintf("%v", this.JsonSpec) + `,`,
+		`RuncOptions:` + strings.Replace(fmt.Sprintf("%v", this.RuncOptions), "Any", "types.Any", 1) + `,`,
+		`XXX_unrecognized:` + fmt.Sprintf("%v", this.XXX_unrecognized) + `,`,
+		`}`,
+	}, "")
+	return s
+}
+func (this *FirecrackerConfig) String() string {
+	if this == nil {
+		return "nil"
+	}
+	repeatedStringForNetworkInterfaces := "[]*FirecrackerNetworkInterface{"
+	for _, f := range this.NetworkInterfaces {
+		repeatedStringForNetworkInterfaces += strings.Replace(f.String(), "FirecrackerNetworkInterface", "FirecrackerNetworkInterface", 1) + ","
+	}
+	repeatedStringForNetworkInterfaces += "}"
+	repeatedStringForAdditionalDrives := "[]*FirecrackerDrive{"
+	for _, f := range this.AdditionalDrives {
+		repeatedStringForAdditionalDrives += strings.Replace(f.String(), "FirecrackerDrive", "FirecrackerDrive", 1) + ","
+	}
+	repeatedStringForAdditionalDrives += "}"
+	s := strings.Join([]string{`&FirecrackerConfig{`,
+		`RuncOptions:` + strings.Replace(fmt.Sprintf("%v", this.RuncOptions), "Any", "types.Any", 1) + `,`,
+		`NetworkInterfaces:` + repeatedStringForNetworkInterfaces + `,`,
+		`KernelImagePath:` + fmt.Sprintf("%v", this.KernelImagePath) + `,`,
+		`KernelArgs:` + fmt.Sprintf("%v", this.KernelArgs) + `,`,
+		`MachineCfg:` + strings.Replace(this.MachineCfg.String(), "FirecrackerMachineConfiguration", "FirecrackerMachineConfiguration", 1) + `,`,
+		`RootDrive:` + strings.Replace(this.RootDrive.String(), "FirecrackerDrive", "FirecrackerDrive", 1) + `,`,
+		`AdditionalDrives:` + repeatedStringForAdditionalDrives + `,`,
+		`XXX_unrecognized:` + fmt.Sprintf("%v", this.XXX_unrecognized) + `,`,
+		`}`,
+	}, "")
+	return s
+}
+func (this *FirecrackerNetworkInterface) String() string {
+	if this == nil {
+		return "nil"
+	}
+	s := strings.Join([]string{`&FirecrackerNetworkInterface{`,
+		`MacAddress:` + fmt.Sprintf("%v", this.MacAddress) + `,`,
+		`HostDevName:` + fmt.Sprintf("%v", this.HostDevName) + `,`,
+		`AllowMMDS:` + fmt.Sprintf("%v", this.AllowMMDS) + `,`,
+		`InRateLimiter:` + strings.Replace(this.InRateLimiter.String(), "FirecrackerRateLimiter", "FirecrackerRateLimiter", 1) + `,`,
+		`OutRateLimiter:` + strings.Replace(this.OutRateLimiter.String(), "FirecrackerRateLimiter", "FirecrackerRateLimiter", 1) + `,`,
+		`XXX_unrecognized:` + fmt.Sprintf("%v", this.XXX_unrecognized) + `,`,
+		`}`,
+	}, "")
+	return s
+}
+func (this *FirecrackerMachineConfiguration) String() string {
+	if this == nil {
+		return "nil"
+	}
+	s := strings.Join([]string{`&FirecrackerMachineConfiguration{`,
+		`CPUTemplate:` + fmt.Sprintf("%v", this.CPUTemplate) + `,`,
+		`HtEnabled:` + fmt.Sprintf("%v", this.HtEnabled) + `,`,
+		`MemSizeMib:` + fmt.Sprintf("%v", this.MemSizeMib) + `,`,
+		`VcpuCount:` + fmt.Sprintf("%v", this.VcpuCount) + `,`,
+		`XXX_unrecognized:` + fmt.Sprintf("%v", this.XXX_unrecognized) + `,`,
+		`}`,
+	}, "")
+	return s
+}
+func (this *FirecrackerDrive) String() string {
+	if this == nil {
+		return "nil"
+	}
+	s := strings.Join([]string{`&FirecrackerDrive{`,
+		`IsReadOnly:` + fmt.Sprintf("%v", this.IsReadOnly) + `,`,
+		`IsRootDevice:` + fmt.Sprintf("%v", this.IsRootDevice) + `,`,
+		`Partuuid:` + fmt.Sprintf("%v", this.Partuuid) + `,`,
+		`PathOnHost:` + fmt.Sprintf("%v", this.PathOnHost) + `,`,
+		`RateLimiter:` + strings.Replace(this.RateLimiter.String(), "FirecrackerRateLimiter", "FirecrackerRateLimiter", 1) + `,`,
+		`XXX_unrecognized:` + fmt.Sprintf("%v", this.XXX_unrecognized) + `,`,
+		`}`,
+	}, "")
+	return s
+}
+func (this *FirecrackerRateLimiter) String() string {
+	if this == nil {
+		return "nil"
+	}
+	s := strings.Join([]string{`&FirecrackerRateLimiter{`,
+		`Bandwidth:` + strings.Replace(this.Bandwidth.String(), "FirecrackerTokenBucket", "FirecrackerTokenBucket", 1) + `,`,
+		`Ops:` + strings.Replace(this.Ops.String(), "FirecrackerTokenBucket", "FirecrackerTokenBucket", 1) + `,`,
+		`XXX_unrecognized:` + fmt.Sprintf("%v", this.XXX_unrecognized) + `,`,
+		`}`,
+	}, "")
+	return s
+}
+func (this *FirecrackerTokenBucket) String() string {
+	if this == nil {
+		return "nil"
+	}
+	s := strings.Join([]string{`&FirecrackerTokenBucket{`,
+		`OneTimeBurst:` + fmt.Sprintf("%v", this.OneTimeBurst) + `,`,
+		`RefillTime:` + fmt.Sprintf("%v", this.RefillTime) + `,`,
+		`Capacity:` + fmt.Sprintf("%v", this.Capacity) + `,`,
+		`XXX_unrecognized:` + fmt.Sprintf("%v", this.XXX_unrecognized) + `,`,
+		`}`,
+	}, "")
+	return s
+}
+func valueToStringTypes(v interface{}) string {
+	rv := reflect.ValueOf(v)
+	if rv.IsNil() {
+		return "nil"
+	}
+	pv := reflect.Indirect(rv).Interface()
+	return fmt.Sprintf("*%v", pv)
+}
+func (m *ExtraData) Unmarshal(dAtA []byte) error {
+	l := len(dAtA)
+	iNdEx := 0
+	for iNdEx < l {
+		preIndex := iNdEx
+		var wire uint64
+		for shift := uint(0); ; shift += 7 {
+			if shift >= 64 {
+				return ErrIntOverflowTypes
+			}
+			if iNdEx >= l {
+				return io.ErrUnexpectedEOF
+			}
+			b := dAtA[iNdEx]
+			iNdEx++
+			wire |= uint64(b&0x7F) << shift
+			if b < 0x80 {
+				break
+			}
+		}
+		fieldNum := int32(wire >> 3)
+		wireType := int(wire & 0x7)
+		if wireType == 4 {
+			return fmt.Errorf("proto: ExtraData: wiretype end group for non-group")
+		}
+		if fieldNum <= 0 {
+			return fmt.Errorf("proto: ExtraData: illegal tag %d (wire type %d)", fieldNum, wire)
+		}
+		switch fieldNum {
+		case 1:
+			if wireType != 2 {
+				return fmt.Errorf("proto: wrong wireType = %d for field JsonSpec", wireType)
+			}
+			var byteLen int
+			for shift := uint(0); ; shift += 7 {
+				if shift >= 64 {
+					return ErrIntOverflowTypes
+				}
+				if iNdEx >= l {
+					return io.ErrUnexpectedEOF
+				}
+				b := dAtA[iNdEx]
+				iNdEx++
+				byteLen |= int(b&0x7F) << shift
+				if b < 0x80 {
+					break
+				}
+			}
+			if byteLen < 0 {
+				return ErrInvalidLengthTypes
+			}
+			postIndex := iNdEx + byteLen
+			if postIndex < 0 {
+				return ErrInvalidLengthTypes
+			}
+			if postIndex > l {
+				return io.ErrUnexpectedEOF
+			}
+			m.JsonSpec = append(m.JsonSpec[:0], dAtA[iNdEx:postIndex]...)
+			if m.JsonSpec == nil {
+				m.JsonSpec = []byte{}
+			}
+			iNdEx = postIndex
+		case 2:
+			if wireType != 2 {
+				return fmt.Errorf("proto: wrong wireType = %d for field RuncOptions", wireType)
+			}
+			var msglen int
+			for shift := uint(0); ; shift += 7 {
+				if shift >= 64 {
+					return ErrIntOverflowTypes
+				}
+				if iNdEx >= l {
+					return io.ErrUnexpectedEOF
+				}
+				b := dAtA[iNdEx]
+				iNdEx++
+				msglen |= int(b&0x7F) << shift
+				if b < 0x80 {
+					break
+				}
+			}
+			if msglen < 0 {
+				return ErrInvalidLengthTypes
+			}
+			postIndex := iNdEx + msglen
+			if postIndex < 0 {
+				return ErrInvalidLengthTypes
+			}
+			if postIndex > l {
+				return io.ErrUnexpectedEOF
+			}
+			if m.RuncOptions == nil {
+				m.RuncOptions = &types.Any{}
+			}
+			if err := m.RuncOptions.Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
+				return err
+			}
+			iNdEx = postIndex
+		default:
+			iNdEx = preIndex
+			skippy, err := skipTypes(dAtA[iNdEx:])
+			if err != nil {
+				return err
+			}
+			if skippy < 0 {
+				return ErrInvalidLengthTypes
+			}
+			if (iNdEx + skippy) < 0 {
+				return ErrInvalidLengthTypes
+			}
+			if (iNdEx + skippy) > l {
+				return io.ErrUnexpectedEOF
+			}
+			m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...)
+			iNdEx += skippy
+		}
+	}
+
+	if iNdEx > l {
+		return io.ErrUnexpectedEOF
+	}
+	return nil
+}
+func (m *FirecrackerConfig) Unmarshal(dAtA []byte) error {
+	l := len(dAtA)
+	iNdEx := 0
+	for iNdEx < l {
+		preIndex := iNdEx
+		var wire uint64
+		for shift := uint(0); ; shift += 7 {
+			if shift >= 64 {
+				return ErrIntOverflowTypes
+			}
+			if iNdEx >= l {
+				return io.ErrUnexpectedEOF
+			}
+			b := dAtA[iNdEx]
+			iNdEx++
+			wire |= uint64(b&0x7F) << shift
+			if b < 0x80 {
+				break
+			}
+		}
+		fieldNum := int32(wire >> 3)
+		wireType := int(wire & 0x7)
+		if wireType == 4 {
+			return fmt.Errorf("proto: FirecrackerConfig: wiretype end group for non-group")
+		}
+		if fieldNum <= 0 {
+			return fmt.Errorf("proto: FirecrackerConfig: illegal tag %d (wire type %d)", fieldNum, wire)
+		}
+		switch fieldNum {
+		case 1:
+			if wireType != 2 {
+				return fmt.Errorf("proto: wrong wireType = %d for field RuncOptions", wireType)
+			}
+			var msglen int
+			for shift := uint(0); ; shift += 7 {
+				if shift >= 64 {
+					return ErrIntOverflowTypes
+				}
+				if iNdEx >= l {
+					return io.ErrUnexpectedEOF
+				}
+				b := dAtA[iNdEx]
+				iNdEx++
+				msglen |= int(b&0x7F) << shift
+				if b < 0x80 {
+					break
+				}
+			}
+			if msglen < 0 {
+				return ErrInvalidLengthTypes
+			}
+			postIndex := iNdEx + msglen
+			if postIndex < 0 {
+				return ErrInvalidLengthTypes
+			}
+			if postIndex > l {
+				return io.ErrUnexpectedEOF
+			}
+			if m.RuncOptions == nil {
+				m.RuncOptions = &types.Any{}
+			}
+			if err := m.RuncOptions.Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
+				return err
+			}
+			iNdEx = postIndex
+		case 2:
+			if wireType != 2 {
+				return fmt.Errorf("proto: wrong wireType = %d for field NetworkInterfaces", wireType)
+			}
+			var msglen int
+			for shift := uint(0); ; shift += 7 {
+				if shift >= 64 {
+					return ErrIntOverflowTypes
+				}
+				if iNdEx >= l {
+					return io.ErrUnexpectedEOF
+				}
+				b := dAtA[iNdEx]
+				iNdEx++
+				msglen |= int(b&0x7F) << shift
+				if b < 0x80 {
+					break
+				}
+			}
+			if msglen < 0 {
+				return ErrInvalidLengthTypes
+			}
+			postIndex := iNdEx + msglen
+			if postIndex < 0 {
+				return ErrInvalidLengthTypes
+			}
+			if postIndex > l {
+				return io.ErrUnexpectedEOF
+			}
+			m.NetworkInterfaces = append(m.NetworkInterfaces, &FirecrackerNetworkInterface{})
+			if err := m.NetworkInterfaces[len(m.NetworkInterfaces)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
+				return err
+			}
+			iNdEx = postIndex
+		case 3:
+			if wireType != 2 {
+				return fmt.Errorf("proto: wrong wireType = %d for field KernelImagePath", wireType)
+			}
+			var stringLen uint64
+			for shift := uint(0); ; shift += 7 {
+				if shift >= 64 {
+					return ErrIntOverflowTypes
+				}
+				if iNdEx >= l {
+					return io.ErrUnexpectedEOF
+				}
+				b := dAtA[iNdEx]
+				iNdEx++
+				stringLen |= uint64(b&0x7F) << shift
+				if b < 0x80 {
+					break
+				}
+			}
+			intStringLen := int(stringLen)
+			if intStringLen < 0 {
+				return ErrInvalidLengthTypes
+			}
+			postIndex := iNdEx + intStringLen
+			if postIndex < 0 {
+				return ErrInvalidLengthTypes
+			}
+			if postIndex > l {
+				return io.ErrUnexpectedEOF
+			}
+			m.KernelImagePath = string(dAtA[iNdEx:postIndex])
+			iNdEx = postIndex
+		case 4:
+			if wireType != 2 {
+				return fmt.Errorf("proto: wrong wireType = %d for field KernelArgs", wireType)
+			}
+			var stringLen uint64
+			for shift := uint(0); ; shift += 7 {
+				if shift >= 64 {
+					return ErrIntOverflowTypes
+				}
+				if iNdEx >= l {
+					return io.ErrUnexpectedEOF
+				}
+				b := dAtA[iNdEx]
+				iNdEx++
+				stringLen |= uint64(b&0x7F) << shift
+				if b < 0x80 {
+					break
+				}
+			}
+			intStringLen := int(stringLen)
+			if intStringLen < 0 {
+				return ErrInvalidLengthTypes
+			}
+			postIndex := iNdEx + intStringLen
+			if postIndex < 0 {
+				return ErrInvalidLengthTypes
+			}
+			if postIndex > l {
+				return io.ErrUnexpectedEOF
+			}
+			m.KernelArgs = string(dAtA[iNdEx:postIndex])
+			iNdEx = postIndex
+		case 5:
+			if wireType != 2 {
+				return fmt.Errorf("proto: wrong wireType = %d for field MachineCfg", wireType)
+			}
+			var msglen int
+			for shift := uint(0); ; shift += 7 {
+				if shift >= 64 {
+					return ErrIntOverflowTypes
+				}
+				if iNdEx >= l {
+					return io.ErrUnexpectedEOF
+				}
+				b := dAtA[iNdEx]
+				iNdEx++
+				msglen |= int(b&0x7F) << shift
+				if b < 0x80 {
+					break
+				}
+			}
+			if msglen < 0 {
+				return ErrInvalidLengthTypes
+			}
+			postIndex := iNdEx + msglen
+			if postIndex < 0 {
+				return ErrInvalidLengthTypes
+			}
+			if postIndex > l {
+				return io.ErrUnexpectedEOF
+			}
+			if m.MachineCfg == nil {
+				m.MachineCfg = &FirecrackerMachineConfiguration{}
+			}
+			if err := m.MachineCfg.Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
+				return err
+			}
+			iNdEx = postIndex
+		case 6:
+			if wireType != 2 {
+				return fmt.Errorf("proto: wrong wireType = %d for field RootDrive", wireType)
+			}
+			var msglen int
+			for shift := uint(0); ; shift += 7 {
+				if shift >= 64 {
+					return ErrIntOverflowTypes
+				}
+				if iNdEx >= l {
+					return io.ErrUnexpectedEOF
+				}
+				b := dAtA[iNdEx]
+				iNdEx++
+				msglen |= int(b&0x7F) << shift
+				if b < 0x80 {
+					break
+				}
+			}
+			if msglen < 0 {
+				return ErrInvalidLengthTypes
+			}
+			postIndex := iNdEx + msglen
+			if postIndex < 0 {
+				return ErrInvalidLengthTypes
+			}
+			if postIndex > l {
+				return io.ErrUnexpectedEOF
+			}
+			if m.RootDrive == nil {
+				m.RootDrive = &FirecrackerDrive{}
+			}
+			if err := m.RootDrive.Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
+				return err
+			}
+			iNdEx = postIndex
+		case 7:
+			if wireType != 2 {
+				return fmt.Errorf("proto: wrong wireType = %d for field AdditionalDrives", wireType)
+			}
+			var msglen int
+			for shift := uint(0); ; shift += 7 {
+				if shift >= 64 {
+					return ErrIntOverflowTypes
+				}
+				if iNdEx >= l {
+					return io.ErrUnexpectedEOF
+				}
+				b := dAtA[iNdEx]
+				iNdEx++
+				msglen |= int(b&0x7F) << shift
+				if b < 0x80 {
+					break
+				}
+			}
+			if msglen < 0 {
+				return ErrInvalidLengthTypes
+			}
+			postIndex := iNdEx + msglen
+			if postIndex < 0 {
+				return ErrInvalidLengthTypes
+			}
+			if postIndex > l {
+				return io.ErrUnexpectedEOF
+			}
+			m.AdditionalDrives = append(m.AdditionalDrives, &FirecrackerDrive{})
+			if err := m.AdditionalDrives[len(m.AdditionalDrives)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
+				return err
+			}
+			iNdEx = postIndex
+		default:
+			iNdEx = preIndex
+			skippy, err := skipTypes(dAtA[iNdEx:])
+			if err != nil {
+				return err
+			}
+			if skippy < 0 {
+				return ErrInvalidLengthTypes
+			}
+			if (iNdEx + skippy) < 0 {
+				return ErrInvalidLengthTypes
+			}
+			if (iNdEx + skippy) > l {
+				return io.ErrUnexpectedEOF
+			}
+			m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...)
+			iNdEx += skippy
+		}
+	}
+
+	if iNdEx > l {
+		return io.ErrUnexpectedEOF
+	}
+	return nil
+}
+func (m *FirecrackerNetworkInterface) Unmarshal(dAtA []byte) error {
+	l := len(dAtA)
+	iNdEx := 0
+	for iNdEx < l {
+		preIndex := iNdEx
+		var wire uint64
+		for shift := uint(0); ; shift += 7 {
+			if shift >= 64 {
+				return ErrIntOverflowTypes
+			}
+			if iNdEx >= l {
+				return io.ErrUnexpectedEOF
+			}
+			b := dAtA[iNdEx]
+			iNdEx++
+			wire |= uint64(b&0x7F) << shift
+			if b < 0x80 {
+				break
+			}
+		}
+		fieldNum := int32(wire >> 3)
+		wireType := int(wire & 0x7)
+		if wireType == 4 {
+			return fmt.Errorf("proto: FirecrackerNetworkInterface: wiretype end group for non-group")
+		}
+		if fieldNum <= 0 {
+			return fmt.Errorf("proto: FirecrackerNetworkInterface: illegal tag %d (wire type %d)", fieldNum, wire)
+		}
+		switch fieldNum {
+		case 1:
+			if wireType != 2 {
+				return fmt.Errorf("proto: wrong wireType = %d for field MacAddress", wireType)
+			}
+			var stringLen uint64
+			for shift := uint(0); ; shift += 7 {
+				if shift >= 64 {
+					return ErrIntOverflowTypes
+				}
+				if iNdEx >= l {
+					return io.ErrUnexpectedEOF
+				}
+				b := dAtA[iNdEx]
+				iNdEx++
+				stringLen |= uint64(b&0x7F) << shift
+				if b < 0x80 {
+					break
+				}
+			}
+			intStringLen := int(stringLen)
+			if intStringLen < 0 {
+				return ErrInvalidLengthTypes
+			}
+			postIndex := iNdEx + intStringLen
+			if postIndex < 0 {
+				return ErrInvalidLengthTypes
+			}
+			if postIndex > l {
+				return io.ErrUnexpectedEOF
+			}
+			m.MacAddress = string(dAtA[iNdEx:postIndex])
+			iNdEx = postIndex
+		case 2:
+			if wireType != 2 {
+				return fmt.Errorf("proto: wrong wireType = %d for field HostDevName", wireType)
+			}
+			var stringLen uint64
+			for shift := uint(0); ; shift += 7 {
+				if shift >= 64 {
+					return ErrIntOverflowTypes
+				}
+				if iNdEx >= l {
+					return io.ErrUnexpectedEOF
+				}
+				b := dAtA[iNdEx]
+				iNdEx++
+				stringLen |= uint64(b&0x7F) << shift
+				if b < 0x80 {
+					break
+				}
+			}
+			intStringLen := int(stringLen)
+			if intStringLen < 0 {
+				return ErrInvalidLengthTypes
+			}
+			postIndex := iNdEx + intStringLen
+			if postIndex < 0 {
+				return ErrInvalidLengthTypes
+			}
+			if postIndex > l {
+				return io.ErrUnexpectedEOF
+			}
+			m.HostDevName = string(dAtA[iNdEx:postIndex])
+			iNdEx = postIndex
+		case 3:
+			if wireType != 0 {
+				return fmt.Errorf("proto: wrong wireType = %d for field AllowMMDS", wireType)
+			}
+			var v int
+			for shift := uint(0); ; shift += 7 {
+				if shift >= 64 {
+					return ErrIntOverflowTypes
+				}
+				if iNdEx >= l {
+					return io.ErrUnexpectedEOF
+				}
+				b := dAtA[iNdEx]
+				iNdEx++
+				v |= int(b&0x7F) << shift
+				if b < 0x80 {
+					break
+				}
+			}
+			m.AllowMMDS = bool(v != 0)
+		case 4:
+			if wireType != 2 {
+				return fmt.Errorf("proto: wrong wireType = %d for field InRateLimiter", wireType)
+			}
+			var msglen int
+			for shift := uint(0); ; shift += 7 {
+				if shift >= 64 {
+					return ErrIntOverflowTypes
+				}
+				if iNdEx >= l {
+					return io.ErrUnexpectedEOF
+				}
+				b := dAtA[iNdEx]
+				iNdEx++
+				msglen |= int(b&0x7F) << shift
+				if b < 0x80 {
+					break
+				}
+			}
+			if msglen < 0 {
+				return ErrInvalidLengthTypes
+			}
+			postIndex := iNdEx + msglen
+			if postIndex < 0 {
+				return ErrInvalidLengthTypes
+			}
+			if postIndex > l {
+				return io.ErrUnexpectedEOF
+			}
+			if m.InRateLimiter == nil {
+				m.InRateLimiter = &FirecrackerRateLimiter{}
+			}
+			if err := m.InRateLimiter.Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
+				return err
+			}
+			iNdEx = postIndex
+		case 5:
+			if wireType != 2 {
+				return fmt.Errorf("proto: wrong wireType = %d for field OutRateLimiter", wireType)
+			}
+			var msglen int
+			for shift := uint(0); ; shift += 7 {
+				if shift >= 64 {
+					return ErrIntOverflowTypes
+				}
+				if iNdEx >= l {
+					return io.ErrUnexpectedEOF
+				}
+				b := dAtA[iNdEx]
+				iNdEx++
+				msglen |= int(b&0x7F) << shift
+				if b < 0x80 {
+					break
+				}
+			}
+			if msglen < 0 {
+				return ErrInvalidLengthTypes
+			}
+			postIndex := iNdEx + msglen
+			if postIndex < 0 {
+				return ErrInvalidLengthTypes
+			}
+			if postIndex > l {
+				return io.ErrUnexpectedEOF
+			}
+			if m.OutRateLimiter == nil {
+				m.OutRateLimiter = &FirecrackerRateLimiter{}
+			}
+			if err := m.OutRateLimiter.Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
+				return err
+			}
+			iNdEx = postIndex
+		default:
+			iNdEx = preIndex
+			skippy, err := skipTypes(dAtA[iNdEx:])
+			if err != nil {
+				return err
+			}
+			if skippy < 0 {
+				return ErrInvalidLengthTypes
+			}
+			if (iNdEx + skippy) < 0 {
+				return ErrInvalidLengthTypes
+			}
+			if (iNdEx + skippy) > l {
+				return io.ErrUnexpectedEOF
+			}
+			m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...)
+			iNdEx += skippy
+		}
+	}
+
+	if iNdEx > l {
+		return io.ErrUnexpectedEOF
+	}
+	return nil
+}
+func (m *FirecrackerMachineConfiguration) Unmarshal(dAtA []byte) error {
+	l := len(dAtA)
+	iNdEx := 0
+	for iNdEx < l {
+		preIndex := iNdEx
+		var wire uint64
+		for shift := uint(0); ; shift += 7 {
+			if shift >= 64 {
+				return ErrIntOverflowTypes
+			}
+			if iNdEx >= l {
+				return io.ErrUnexpectedEOF
+			}
+			b := dAtA[iNdEx]
+			iNdEx++
+			wire |= uint64(b&0x7F) << shift
+			if b < 0x80 {
+				break
+			}
+		}
+		fieldNum := int32(wire >> 3)
+		wireType := int(wire & 0x7)
+		if wireType == 4 {
+			return fmt.Errorf("proto: FirecrackerMachineConfiguration: wiretype end group for non-group")
+		}
+		if fieldNum <= 0 {
+			return fmt.Errorf("proto: FirecrackerMachineConfiguration: illegal tag %d (wire type %d)", fieldNum, wire)
+		}
+		switch fieldNum {
+		case 1:
+			if wireType != 2 {
+				return fmt.Errorf("proto: wrong wireType = %d for field CPUTemplate", wireType)
+			}
+			var stringLen uint64
+			for shift := uint(0); ; shift += 7 {
+				if shift >= 64 {
+					return ErrIntOverflowTypes
+				}
+				if iNdEx >= l {
+					return io.ErrUnexpectedEOF
+				}
+				b := dAtA[iNdEx]
+				iNdEx++
+				stringLen |= uint64(b&0x7F) << shift
+				if b < 0x80 {
+					break
+				}
+			}
+			intStringLen := int(stringLen)
+			if intStringLen < 0 {
+				return ErrInvalidLengthTypes
+			}
+			postIndex := iNdEx + intStringLen
+			if postIndex < 0 {
+				return ErrInvalidLengthTypes
+			}
+			if postIndex > l {
+				return io.ErrUnexpectedEOF
+			}
+			m.CPUTemplate = string(dAtA[iNdEx:postIndex])
+			iNdEx = postIndex
+		case 2:
+			if wireType != 0 {
+				return fmt.Errorf("proto: wrong wireType = %d for field HtEnabled", wireType)
+			}
+			var v int
+			for shift := uint(0); ; shift += 7 {
+				if shift >= 64 {
+					return ErrIntOverflowTypes
+				}
+				if iNdEx >= l {
+					return io.ErrUnexpectedEOF
+				}
+				b := dAtA[iNdEx]
+				iNdEx++
+				v |= int(b&0x7F) << shift
+				if b < 0x80 {
+					break
+				}
+			}
+			m.HtEnabled = bool(v != 0)
+		case 3:
+			if wireType != 0 {
+				return fmt.Errorf("proto: wrong wireType = %d for field MemSizeMib", wireType)
+			}
+			m.MemSizeMib = 0
+			for shift := uint(0); ; shift += 7 {
+				if shift >= 64 {
+					return ErrIntOverflowTypes
+				}
+				if iNdEx >= l {
+					return io.ErrUnexpectedEOF
+				}
+				b := dAtA[iNdEx]
+				iNdEx++
+				m.MemSizeMib |= uint32(b&0x7F) << shift
+				if b < 0x80 {
+					break
+				}
+			}
+		case 4:
+			if wireType != 0 {
+				return fmt.Errorf("proto: wrong wireType = %d for field VcpuCount", wireType)
+			}
+			m.VcpuCount = 0
+			for shift := uint(0); ; shift += 7 {
+				if shift >= 64 {
+					return ErrIntOverflowTypes
+				}
+				if iNdEx >= l {
+					return io.ErrUnexpectedEOF
+				}
+				b := dAtA[iNdEx]
+				iNdEx++
+				m.VcpuCount |= uint32(b&0x7F) << shift
+				if b < 0x80 {
+					break
+				}
+			}
+		default:
+			iNdEx = preIndex
+			skippy, err := skipTypes(dAtA[iNdEx:])
+			if err != nil {
+				return err
+			}
+			if skippy < 0 {
+				return ErrInvalidLengthTypes
+			}
+			if (iNdEx + skippy) < 0 {
+				return ErrInvalidLengthTypes
+			}
+			if (iNdEx + skippy) > l {
+				return io.ErrUnexpectedEOF
+			}
+			m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...)
+			iNdEx += skippy
+		}
+	}
+
+	if iNdEx > l {
+		return io.ErrUnexpectedEOF
+	}
+	return nil
+}
+func (m *FirecrackerDrive) Unmarshal(dAtA []byte) error {
+	l := len(dAtA)
+	iNdEx := 0
+	for iNdEx < l {
+		preIndex := iNdEx
+		var wire uint64
+		for shift := uint(0); ; shift += 7 {
+			if shift >= 64 {
+				return ErrIntOverflowTypes
+			}
+			if iNdEx >= l {
+				return io.ErrUnexpectedEOF
+			}
+			b := dAtA[iNdEx]
+			iNdEx++
+			wire |= uint64(b&0x7F) << shift
+			if b < 0x80 {
+				break
+			}
+		}
+		fieldNum := int32(wire >> 3)
+		wireType := int(wire & 0x7)
+		if wireType == 4 {
+			return fmt.Errorf("proto: FirecrackerDrive: wiretype end group for non-group")
+		}
+		if fieldNum <= 0 {
+			return fmt.Errorf("proto: FirecrackerDrive: illegal tag %d (wire type %d)", fieldNum, wire)
+		}
+		switch fieldNum {
+		case 1:
+			if wireType != 0 {
+				return fmt.Errorf("proto: wrong wireType = %d for field IsReadOnly", wireType)
+			}
+			var v int
+			for shift := uint(0); ; shift += 7 {
+				if shift >= 64 {
+					return ErrIntOverflowTypes
+				}
+				if iNdEx >= l {
+					return io.ErrUnexpectedEOF
+				}
+				b := dAtA[iNdEx]
+				iNdEx++
+				v |= int(b&0x7F) << shift
+				if b < 0x80 {
+					break
+				}
+			}
+			m.IsReadOnly = bool(v != 0)
+		case 2:
+			if wireType != 0 {
+				return fmt.Errorf("proto: wrong wireType = %d for field IsRootDevice", wireType)
+			}
+			var v int
+			for shift := uint(0); ; shift += 7 {
+				if shift >= 64 {
+					return ErrIntOverflowTypes
+				}
+				if iNdEx >= l {
+					return io.ErrUnexpectedEOF
+				}
+				b := dAtA[iNdEx]
+				iNdEx++
+				v |= int(b&0x7F) << shift
+				if b < 0x80 {
+					break
+				}
+			}
+			m.IsRootDevice = bool(v != 0)
+		case 3:
+			if wireType != 2 {
+				return fmt.Errorf("proto: wrong wireType = %d for field Partuuid", wireType)
+			}
+			var stringLen uint64
+			for shift := uint(0); ; shift += 7 {
+				if shift >= 64 {
+					return ErrIntOverflowTypes
+				}
+				if iNdEx >= l {
+					return io.ErrUnexpectedEOF
+				}
+				b := dAtA[iNdEx]
+				iNdEx++
+				stringLen |= uint64(b&0x7F) << shift
+				if b < 0x80 {
+					break
+				}
+			}
+			intStringLen := int(stringLen)
+			if intStringLen < 0 {
+				return ErrInvalidLengthTypes
+			}
+			postIndex := iNdEx + intStringLen
+			if postIndex < 0 {
+				return ErrInvalidLengthTypes
+			}
+			if postIndex > l {
+				return io.ErrUnexpectedEOF
+			}
+			m.Partuuid = string(dAtA[iNdEx:postIndex])
+			iNdEx = postIndex
+		case 4:
+			if wireType != 2 {
+				return fmt.Errorf("proto: wrong wireType = %d for field PathOnHost", wireType)
+			}
+			var stringLen uint64
+			for shift := uint(0); ; shift += 7 {
+				if shift >= 64 {
+					return ErrIntOverflowTypes
+				}
+				if iNdEx >= l {
+					return io.ErrUnexpectedEOF
+				}
+				b := dAtA[iNdEx]
+				iNdEx++
+				stringLen |= uint64(b&0x7F) << shift
+				if b < 0x80 {
+					break
+				}
+			}
+			intStringLen := int(stringLen)
+			if intStringLen < 0 {
+				return ErrInvalidLengthTypes
+			}
+			postIndex := iNdEx + intStringLen
+			if postIndex < 0 {
+				return ErrInvalidLengthTypes
+			}
+			if postIndex > l {
+				return io.ErrUnexpectedEOF
+			}
+			m.PathOnHost = string(dAtA[iNdEx:postIndex])
+			iNdEx = postIndex
+		case 5:
+			if wireType != 2 {
+				return fmt.Errorf("proto: wrong wireType = %d for field RateLimiter", wireType)
+			}
+			var msglen int
+			for shift := uint(0); ; shift += 7 {
+				if shift >= 64 {
+					return ErrIntOverflowTypes
+				}
+				if iNdEx >= l {
+					return io.ErrUnexpectedEOF
+				}
+				b := dAtA[iNdEx]
+				iNdEx++
+				msglen |= int(b&0x7F) << shift
+				if b < 0x80 {
+					break
+				}
+			}
+			if msglen < 0 {
+				return ErrInvalidLengthTypes
+			}
+			postIndex := iNdEx + msglen
+			if postIndex < 0 {
+				return ErrInvalidLengthTypes
+			}
+			if postIndex > l {
+				return io.ErrUnexpectedEOF
+			}
+			if m.RateLimiter == nil {
+				m.RateLimiter = &FirecrackerRateLimiter{}
+			}
+			if err := m.RateLimiter.Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
+				return err
+			}
+			iNdEx = postIndex
+		default:
+			iNdEx = preIndex
+			skippy, err := skipTypes(dAtA[iNdEx:])
+			if err != nil {
+				return err
+			}
+			if skippy < 0 {
+				return ErrInvalidLengthTypes
+			}
+			if (iNdEx + skippy) < 0 {
+				return ErrInvalidLengthTypes
+			}
+			if (iNdEx + skippy) > l {
+				return io.ErrUnexpectedEOF
+			}
+			m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...)
+			iNdEx += skippy
+		}
+	}
+
+	if iNdEx > l {
+		return io.ErrUnexpectedEOF
+	}
+	return nil
+}
+func (m *FirecrackerRateLimiter) Unmarshal(dAtA []byte) error {
+	l := len(dAtA)
+	iNdEx := 0
+	for iNdEx < l {
+		preIndex := iNdEx
+		var wire uint64
+		for shift := uint(0); ; shift += 7 {
+			if shift >= 64 {
+				return ErrIntOverflowTypes
+			}
+			if iNdEx >= l {
+				return io.ErrUnexpectedEOF
+			}
+			b := dAtA[iNdEx]
+			iNdEx++
+			wire |= uint64(b&0x7F) << shift
+			if b < 0x80 {
+				break
+			}
+		}
+		fieldNum := int32(wire >> 3)
+		wireType := int(wire & 0x7)
+		if wireType == 4 {
+			return fmt.Errorf("proto: FirecrackerRateLimiter: wiretype end group for non-group")
+		}
+		if fieldNum <= 0 {
+			return fmt.Errorf("proto: FirecrackerRateLimiter: illegal tag %d (wire type %d)", fieldNum, wire)
+		}
+		switch fieldNum {
+		case 1:
+			if wireType != 2 {
+				return fmt.Errorf("proto: wrong wireType = %d for field Bandwidth", wireType)
+			}
+			var msglen int
+			for shift := uint(0); ; shift += 7 {
+				if shift >= 64 {
+					return ErrIntOverflowTypes
+				}
+				if iNdEx >= l {
+					return io.ErrUnexpectedEOF
+				}
+				b := dAtA[iNdEx]
+				iNdEx++
+				msglen |= int(b&0x7F) << shift
+				if b < 0x80 {
+					break
+				}
+			}
+			if msglen < 0 {
+				return ErrInvalidLengthTypes
+			}
+			postIndex := iNdEx + msglen
+			if postIndex < 0 {
+				return ErrInvalidLengthTypes
+			}
+			if postIndex > l {
+				return io.ErrUnexpectedEOF
+			}
+			if m.Bandwidth == nil {
+				m.Bandwidth = &FirecrackerTokenBucket{}
+			}
+			if err := m.Bandwidth.Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
+				return err
+			}
+			iNdEx = postIndex
+		case 2:
+			if wireType != 2 {
+				return fmt.Errorf("proto: wrong wireType = %d for field Ops", wireType)
+			}
+			var msglen int
+			for shift := uint(0); ; shift += 7 {
+				if shift >= 64 {
+					return ErrIntOverflowTypes
+				}
+				if iNdEx >= l {
+					return io.ErrUnexpectedEOF
+				}
+				b := dAtA[iNdEx]
+				iNdEx++
+				msglen |= int(b&0x7F) << shift
+				if b < 0x80 {
+					break
+				}
+			}
+			if msglen < 0 {
+				return ErrInvalidLengthTypes
+			}
+			postIndex := iNdEx + msglen
+			if postIndex < 0 {
+				return ErrInvalidLengthTypes
+			}
+			if postIndex > l {
+				return io.ErrUnexpectedEOF
+			}
+			if m.Ops == nil {
+				m.Ops = &FirecrackerTokenBucket{}
+			}
+			if err := m.Ops.Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
+				return err
+			}
+			iNdEx = postIndex
+		default:
+			iNdEx = preIndex
+			skippy, err := skipTypes(dAtA[iNdEx:])
+			if err != nil {
+				return err
+			}
+			if skippy < 0 {
+				return ErrInvalidLengthTypes
+			}
+			if (iNdEx + skippy) < 0 {
+				return ErrInvalidLengthTypes
+			}
+			if (iNdEx + skippy) > l {
+				return io.ErrUnexpectedEOF
+			}
+			m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...)
+			iNdEx += skippy
+		}
+	}
+
+	if iNdEx > l {
+		return io.ErrUnexpectedEOF
+	}
+	return nil
+}
+func (m *FirecrackerTokenBucket) Unmarshal(dAtA []byte) error {
+	l := len(dAtA)
+	iNdEx := 0
+	for iNdEx < l {
+		preIndex := iNdEx
+		var wire uint64
+		for shift := uint(0); ; shift += 7 {
+			if shift >= 64 {
+				return ErrIntOverflowTypes
+			}
+			if iNdEx >= l {
+				return io.ErrUnexpectedEOF
+			}
+			b := dAtA[iNdEx]
+			iNdEx++
+			wire |= uint64(b&0x7F) << shift
+			if b < 0x80 {
+				break
+			}
+		}
+		fieldNum := int32(wire >> 3)
+		wireType := int(wire & 0x7)
+		if wireType == 4 {
+			return fmt.Errorf("proto: FirecrackerTokenBucket: wiretype end group for non-group")
+		}
+		if fieldNum <= 0 {
+			return fmt.Errorf("proto: FirecrackerTokenBucket: illegal tag %d (wire type %d)", fieldNum, wire)
+		}
+		switch fieldNum {
+		case 1:
+			if wireType != 0 {
+				return fmt.Errorf("proto: wrong wireType = %d for field OneTimeBurst", wireType)
+			}
+			m.OneTimeBurst = 0
+			for shift := uint(0); ; shift += 7 {
+				if shift >= 64 {
+					return ErrIntOverflowTypes
+				}
+				if iNdEx >= l {
+					return io.ErrUnexpectedEOF
+				}
+				b := dAtA[iNdEx]
+				iNdEx++
+				m.OneTimeBurst |= int64(b&0x7F) << shift
+				if b < 0x80 {
+					break
+				}
+			}
+		case 2:
+			if wireType != 0 {
+				return fmt.Errorf("proto: wrong wireType = %d for field RefillTime", wireType)
+			}
+			m.RefillTime = 0
+			for shift := uint(0); ; shift += 7 {
+				if shift >= 64 {
+					return ErrIntOverflowTypes
+				}
+				if iNdEx >= l {
+					return io.ErrUnexpectedEOF
+				}
+				b := dAtA[iNdEx]
+				iNdEx++
+				m.RefillTime |= int64(b&0x7F) << shift
+				if b < 0x80 {
+					break
+				}
+			}
+		case 3:
+			if wireType != 0 {
+				return fmt.Errorf("proto: wrong wireType = %d for field Capacity", wireType)
+			}
+			m.Capacity = 0
+			for shift := uint(0); ; shift += 7 {
+				if shift >= 64 {
+					return ErrIntOverflowTypes
+				}
+				if iNdEx >= l {
+					return io.ErrUnexpectedEOF
+				}
+				b := dAtA[iNdEx]
+				iNdEx++
+				m.Capacity |= int64(b&0x7F) << shift
+				if b < 0x80 {
+					break
+				}
+			}
+		default:
+			iNdEx = preIndex
+			skippy, err := skipTypes(dAtA[iNdEx:])
+			if err != nil {
+				return err
+			}
+			if skippy < 0 {
+				return ErrInvalidLengthTypes
+			}
+			if (iNdEx + skippy) < 0 {
+				return ErrInvalidLengthTypes
+			}
+			if (iNdEx + skippy) > l {
+				return io.ErrUnexpectedEOF
+			}
+			m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...)
+			iNdEx += skippy
+		}
+	}
+
+	if iNdEx > l {
+		return io.ErrUnexpectedEOF
+	}
+	return nil
+}
+func skipTypes(dAtA []byte) (n int, err error) {
+	l := len(dAtA)
+	iNdEx := 0
+	for iNdEx < l {
+		var wire uint64
+		for shift := uint(0); ; shift += 7 {
+			if shift >= 64 {
+				return 0, ErrIntOverflowTypes
+			}
+			if iNdEx >= l {
+				return 0, io.ErrUnexpectedEOF
+			}
+			b := dAtA[iNdEx]
+			iNdEx++
+			wire |= (uint64(b) & 0x7F) << shift
+			if b < 0x80 {
+				break
+			}
+		}
+		wireType := int(wire & 0x7)
+		switch wireType {
+		case 0:
+			for shift := uint(0); ; shift += 7 {
+				if shift >= 64 {
+					return 0, ErrIntOverflowTypes
+				}
+				if iNdEx >= l {
+					return 0, io.ErrUnexpectedEOF
+				}
+				iNdEx++
+				if dAtA[iNdEx-1] < 0x80 {
+					break
+				}
+			}
+			return iNdEx, nil
+		case 1:
+			iNdEx += 8
+			return iNdEx, nil
+		case 2:
+			var length int
+			for shift := uint(0); ; shift += 7 {
+				if shift >= 64 {
+					return 0, ErrIntOverflowTypes
+				}
+				if iNdEx >= l {
+					return 0, io.ErrUnexpectedEOF
+				}
+				b := dAtA[iNdEx]
+				iNdEx++
+				length |= (int(b) & 0x7F) << shift
+				if b < 0x80 {
+					break
+				}
+			}
+			if length < 0 {
+				return 0, ErrInvalidLengthTypes
+			}
+			iNdEx += length
+			if iNdEx < 0 {
+				return 0, ErrInvalidLengthTypes
+			}
+			return iNdEx, nil
+		case 3:
+			for {
+				var innerWire uint64
+				var start int = iNdEx
+				for shift := uint(0); ; shift += 7 {
+					if shift >= 64 {
+						return 0, ErrIntOverflowTypes
+					}
+					if iNdEx >= l {
+						return 0, io.ErrUnexpectedEOF
+					}
+					b := dAtA[iNdEx]
+					iNdEx++
+					innerWire |= (uint64(b) & 0x7F) << shift
+					if b < 0x80 {
+						break
+					}
+				}
+				innerWireType := int(innerWire & 0x7)
+				if innerWireType == 4 {
+					break
+				}
+				next, err := skipTypes(dAtA[start:])
+				if err != nil {
+					return 0, err
+				}
+				iNdEx = start + next
+				if iNdEx < 0 {
+					return 0, ErrInvalidLengthTypes
+				}
+			}
+			return iNdEx, nil
+		case 4:
+			return iNdEx, nil
+		case 5:
+			iNdEx += 4
+			return iNdEx, nil
+		default:
+			return 0, fmt.Errorf("proto: illegal wireType %d", wireType)
+		}
+	}
+	panic("unreachable")
+}
+
+var (
+	ErrInvalidLengthTypes = fmt.Errorf("proto: negative length found during unmarshaling")
+	ErrIntOverflowTypes   = fmt.Errorf("proto: integer overflow")
+)
diff --git a/runtime/service.go b/runtime/service.go
index 2228061..0ff0b0c 100644
--- a/runtime/service.go
+++ b/runtime/service.go
@@ -57,7 +57,7 @@ import (
 
 	"github.com/firecracker-microvm/firecracker-containerd/eventbridge"
 	"github.com/firecracker-microvm/firecracker-containerd/internal"
-	"github.com/firecracker-microvm/firecracker-containerd/proto"
+	proto "github.com/firecracker-microvm/firecracker-containerd/proto/grpc"
 	"github.com/firecracker-microvm/firecracker-containerd/runtime/firecrackeroci"
 )
 
diff --git a/runtime/taskfirecrackeropts.go b/runtime/taskfirecrackeropts.go
index 8d70e4d..7cc2097 100644
--- a/runtime/taskfirecrackeropts.go
+++ b/runtime/taskfirecrackeropts.go
@@ -16,7 +16,7 @@ package main
 import (
 	"time"
 
-	"github.com/firecracker-microvm/firecracker-containerd/proto"
+	proto "github.com/firecracker-microvm/firecracker-containerd/proto/grpc"
 	firecracker "github.com/firecracker-microvm/firecracker-go-sdk"
 	models "github.com/firecracker-microvm/firecracker-go-sdk/client/models"
 	"github.com/pkg/errors"


Test patch:
diff --git a/firecracker-control/helpers_test.go b/firecracker-control/helpers_test.go
index fcb5a6f..c4a56c5 100644
--- a/firecracker-control/helpers_test.go
+++ b/firecracker-control/helpers_test.go
@@ -20,7 +20,7 @@ import (
 	models "github.com/firecracker-microvm/firecracker-go-sdk/client/models"
 	"github.com/stretchr/testify/assert"
 
-	"github.com/firecracker-microvm/firecracker-containerd/proto"
+	proto "github.com/firecracker-microvm/firecracker-containerd/proto/grpc"
 )
 
 const (
diff --git a/firecracker-control/local_test.go b/firecracker-control/local_test.go
index 5bf35f4..1b2a504 100644
--- a/firecracker-control/local_test.go
+++ b/firecracker-control/local_test.go
@@ -25,7 +25,7 @@ import (
 	"github.com/golang/mock/gomock"
 	"github.com/stretchr/testify/assert"
 
-	"github.com/firecracker-microvm/firecracker-containerd/proto"
+	proto "github.com/firecracker-microvm/firecracker-containerd/proto/grpc"
 )
 
 var testCtx = context.Background()
diff --git a/runtime/service_integ_test.go b/runtime/service_integ_test.go
index 39e7683..c905203 100644
--- a/runtime/service_integ_test.go
+++ b/runtime/service_integ_test.go
@@ -41,7 +41,7 @@ import (
 	"github.com/stretchr/testify/require"
 
 	"github.com/firecracker-microvm/firecracker-containerd/internal"
-	"github.com/firecracker-microvm/firecracker-containerd/proto"
+	proto "github.com/firecracker-microvm/firecracker-containerd/proto/grpc"
 	"github.com/firecracker-microvm/firecracker-containerd/runtime/firecrackeroci"
 )
 
diff --git a/runtime/service_test.go b/runtime/service_test.go
index 6731e17..6e6383e 100644
--- a/runtime/service_test.go
+++ b/runtime/service_test.go
@@ -19,7 +19,7 @@ import (
 	"testing"
 
 	"github.com/containerd/typeurl"
-	"github.com/firecracker-microvm/firecracker-containerd/proto"
+	proto "github.com/firecracker-microvm/firecracker-containerd/proto/grpc"
 	"github.com/stretchr/testify/require"
 	"gotest.tools/assert"
 )
diff --git a/runtime/taskfirecrackeropts_test.go b/runtime/taskfirecrackeropts_test.go
index ec00232..12a8f73 100644
--- a/runtime/taskfirecrackeropts_test.go
+++ b/runtime/taskfirecrackeropts_test.go
@@ -16,7 +16,7 @@ package main
 import (
 	"testing"
 
-	"github.com/firecracker-microvm/firecracker-containerd/proto"
+	proto "github.com/firecracker-microvm/firecracker-containerd/proto/grpc"
 	firecracker "github.com/firecracker-microvm/firecracker-go-sdk"
 	models "github.com/firecracker-microvm/firecracker-go-sdk/client/models"
 	"github.com/stretchr/testify/assert"