Repository: firecracker-microvm/firecracker-containerd
Pull request #493 (2021-04-06 18:37:54)

Memory ballooning support on firecracker-containerd
Signed-off-by: Royce Zhao <qiqinzha@amazon.com>

*Issue #, if available:*

*Description of changes:*
Implement the memory ballooning APIs on firecracker-containerd. The swagger definition can be found [HERE](https://github.com/firecracker-microvm/firecracker/blob/master/src/api_server/swagger/firecracker.yaml#L63-L128).


By submitting this pull request, I confirm that my contribution is made under the terms of the Apache 2.0 license.


FFMMM: overall this LGTM!! Quick nit

* Do we want to include instructions on how to use/ configure the mem ballon device in one of our `.md`s ?
RoyceDavison: > overall this LGTM!! Quick nit
> 
> * Do we want to include instructions on how to use/ configure the mem ballon device in one of our `.md`s ?

Good catch.
I think we may want to add some details about balloon's behaviors? But all of these can be found in [Firecracker balloon docs](https://github.com/firecracker-microvm/firecracker/blob/main/docs/ballooning.md). 
I am not sure if it is worth to repeat again?

Patch:
diff --git a/_submodules/firecracker b/_submodules/firecracker
index 5ba819d..fc2a7ed 160000
--- a/_submodules/firecracker
+++ b/_submodules/firecracker
@@ -1,1 +1,1 @@
-Subproject commit 5ba819d7b7a684107f5434bcbd1617bc94565478
+Subproject commit fc2a7ed50e2c5c6df9572f54bcf2a1cc161dd321
diff --git a/firecracker-control/local.go b/firecracker-control/local.go
index 2e76168..fca7314 100644
--- a/firecracker-control/local.go
+++ b/firecracker-control/local.go
@@ -377,6 +377,78 @@ func (s *local) GetVMMetadata(requestCtx context.Context, req *proto.GetVMMetada
 	return resp, nil
 }
 
+// GetBalloonConfig get balloon configuration, before or after machine startup.
+func (s *local) GetBalloonConfig(requestCtx context.Context, req *proto.GetBalloonConfigRequest) (*proto.GetBalloonConfigResponse, error) {
+	client, err := s.shimFirecrackerClient(requestCtx, req.VMID)
+	if err != nil {
+		return nil, err
+	}
+
+	defer client.Close()
+	resp, err := client.GetBalloonConfig(requestCtx, req)
+	if err != nil {
+		err = errors.Wrap(err, "shim client failed to get balloon config")
+		s.logger.WithError(err).Error()
+		return nil, err
+	}
+
+	return resp, nil
+}
+
+// UpdateBalloon updates memory size for an existing balloon device, before or after machine startup.
+func (s *local) UpdateBalloon(requestCtx context.Context, req *proto.UpdateBalloonRequest) (*empty.Empty, error) {
+	client, err := s.shimFirecrackerClient(requestCtx, req.VMID)
+	if err != nil {
+		return nil, err
+	}
+
+	defer client.Close()
+	resp, err := client.UpdateBalloon(requestCtx, req)
+	if err != nil {
+		err = errors.Wrap(err, "shim client failed to update balloon")
+		s.logger.WithError(err).Error()
+		return nil, err
+	}
+
+	return resp, nil
+}
+
+// GetBalloonStats will return the latest balloon device statistics, only if enabled pre-boot.
+func (s *local) GetBalloonStats(requestCtx context.Context, req *proto.GetBalloonStatsRequest) (*proto.GetBalloonStatsResponse, error) {
+	client, err := s.shimFirecrackerClient(requestCtx, req.VMID)
+	if err != nil {
+		return nil, err
+	}
+
+	defer client.Close()
+	resp, err := client.GetBalloonStats(requestCtx, req)
+	if err != nil {
+		err = errors.Wrap(err, "shim client failed to get balloon statistics")
+		s.logger.WithError(err).Error()
+		return nil, err
+	}
+
+	return resp, nil
+}
+
+// UpdateBalloonStats updates an existing balloon device statistics interval, before or after machine startup.
+func (s *local) UpdateBalloonStats(requestCtx context.Context, req *proto.UpdateBalloonStatsRequest) (*empty.Empty, error) {
+	client, err := s.shimFirecrackerClient(requestCtx, req.VMID)
+	if err != nil {
+		return nil, err
+	}
+
+	defer client.Close()
+	resp, err := client.UpdateBalloonStats(requestCtx, req)
+	if err != nil {
+		err = errors.Wrap(err, "shim client failed to update balloon interval")
+		s.logger.WithError(err).Error()
+		return nil, err
+	}
+
+	return resp, nil
+}
+
 func (s *local) newShim(ns, vmID, containerdAddress string, shimSocket *net.UnixListener, fcSocket *net.UnixListener) (*exec.Cmd, error) {
 	logger := s.logger.WithField("vmID", vmID)
 
diff --git a/firecracker-control/service.go b/firecracker-control/service.go
index 35660f7..4d9c804 100644
--- a/firecracker-control/service.go
+++ b/firecracker-control/service.go
@@ -106,3 +106,23 @@ func (s *service) GetVMMetadata(ctx context.Context, req *proto.GetVMMetadataReq
 	log.G(ctx).Debug("Getting vm metadata")
 	return s.local.GetVMMetadata(ctx, req)
 }
+
+func (s *service) GetBalloonConfig(ctx context.Context, req *proto.GetBalloonConfigRequest) (*proto.GetBalloonConfigResponse, error) {
+	log.G(ctx).Debug("Getting balloon configuration")
+	return s.local.GetBalloonConfig(ctx, req)
+}
+
+func (s *service) UpdateBalloon(ctx context.Context, req *proto.UpdateBalloonRequest) (*empty.Empty, error) {
+	log.G(ctx).Debug("Updating balloon memory size")
+	return s.local.UpdateBalloon(ctx, req)
+}
+
+func (s *service) GetBalloonStats(ctx context.Context, req *proto.GetBalloonStatsRequest) (*proto.GetBalloonStatsResponse, error) {
+	log.G(ctx).Debug("Getting balloon statistics")
+	return s.local.GetBalloonStats(ctx, req)
+}
+
+func (s *service) UpdateBalloonStats(ctx context.Context, req *proto.UpdateBalloonStatsRequest) (*empty.Empty, error) {
+	log.G(ctx).Debug("Updating balloon device statistics polling interval")
+	return s.local.UpdateBalloonStats(ctx, req)
+}
diff --git a/go.mod b/go.mod
index 4df6d23..9647fa5 100644
--- a/go.mod
+++ b/go.mod
@@ -10,7 +10,7 @@ require (
 	github.com/containerd/typeurl v1.0.2
 	github.com/containernetworking/cni v0.8.1
 	github.com/containernetworking/plugins v0.9.1
-	github.com/firecracker-microvm/firecracker-go-sdk v0.22.1-0.20201117001223-cd822c0d457c
+	github.com/firecracker-microvm/firecracker-go-sdk v0.22.1-0.20210520223842-abd0815b8bf9
 	github.com/go-ole/go-ole v1.2.4 // indirect
 	github.com/gofrs/uuid v3.3.0+incompatible
 	github.com/gogo/protobuf v1.3.2
@@ -23,7 +23,7 @@ require (
 	github.com/pkg/errors v0.9.1
 	github.com/shirou/gopsutil v2.18.12+incompatible
 	github.com/shirou/w32 v0.0.0-20160930032740-bb4de0191aa4 // indirect
-	github.com/sirupsen/logrus v1.7.0
+	github.com/sirupsen/logrus v1.8.0
 	github.com/stretchr/testify v1.6.1
 	github.com/vishvananda/netlink v1.1.1-0.20201029203352-d40f9887b852
 	golang.org/x/sync v0.0.0-20201207232520-09787c993a3a
diff --git a/go.sum b/go.sum
index a011d8b..fbc2574 100644
--- a/go.sum
+++ b/go.sum
@@ -33,20 +33,17 @@ github.com/Azure/go-autorest/autorest/mocks v0.4.0/go.mod h1:LTp+uSrOhSkaKrUy935
 github.com/Azure/go-autorest/autorest/mocks v0.4.1/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k=
 github.com/Azure/go-autorest/logger v0.2.0/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8=
 github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU=
-github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ=
 github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
 github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=
 github.com/Microsoft/go-winio v0.4.11/go.mod h1:VhR8bwka0BXejwEJY73c50VrPtXAaKcyvVC4A4RozmA=
 github.com/Microsoft/go-winio v0.4.14/go.mod h1:qXqCSQ3Xa7+6tgxaGTIe4Kpcdsi+P8jBhyzoq1bpyYA=
 github.com/Microsoft/go-winio v0.4.15-0.20190919025122-fc70bd9a86b5/go.mod h1:tTuCMEN+UleMWgg9dVx4Hu52b1bJo+59jBh3ajtinzw=
-github.com/Microsoft/go-winio v0.4.16-0.20201130162521-d1ffc52c7331 h1:3YnB7Hpmh1lPecPE8doMOtYCrMdrpedZOvxfuNES/Vk=
 github.com/Microsoft/go-winio v0.4.16-0.20201130162521-d1ffc52c7331/go.mod h1:XB6nPKklQyQ7GC9LdcBEcBl8PF76WugXOPRXwdLnMv0=
 github.com/Microsoft/go-winio v0.4.16/go.mod h1:XB6nPKklQyQ7GC9LdcBEcBl8PF76WugXOPRXwdLnMv0=
 github.com/Microsoft/go-winio v0.4.17-0.20210211115548-6eac466e5fa3/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84=
 github.com/Microsoft/go-winio v0.4.17-0.20210324224401-5516f17a5958/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84=
 github.com/Microsoft/go-winio v0.4.17 h1:iT12IBVClFevaf8PuVyi3UmZOVh4OqnaLxDTW2O6j3w=
 github.com/Microsoft/go-winio v0.4.17/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84=
-github.com/Microsoft/hcsshim v0.8.6 h1:ZfF0+zZeYdzMIVMZHKtDKJvLHj76XCuVae/jNkjj0IA=
 github.com/Microsoft/hcsshim v0.8.6/go.mod h1:Op3hHsoHPAvb6lceZHDtd9OkTew38wNoXnJs8iY7rUg=
 github.com/Microsoft/hcsshim v0.8.7-0.20190325164909-8abdbb8205e4/go.mod h1:Op3hHsoHPAvb6lceZHDtd9OkTew38wNoXnJs8iY7rUg=
 github.com/Microsoft/hcsshim v0.8.7/go.mod h1:OHd7sQqRFrYd3RmSgbgji+ctCwkbq2wbEYNSzOYtcBQ=
@@ -59,7 +56,6 @@ github.com/Microsoft/hcsshim/test v0.0.0-20201218223536-d3e5debf77da/go.mod h1:5
 github.com/Microsoft/hcsshim/test v0.0.0-20210227013316-43a75bb4edd3/go.mod h1:mw7qgWloBUl75W/gVH3cQszUg1+gUITj7D6NY7ywVnY=
 github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ=
 github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU=
-github.com/PuerkitoBio/purell v1.1.0 h1:rmGxhojJlM0tuKtfdvliR84CFHljx9ag64t2xmVkjK4=
 github.com/PuerkitoBio/purell v1.1.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0=
 github.com/PuerkitoBio/purell v1.1.1 h1:WEQqlqaGbrPkxLJWfBwQmfEAE1Z7ONdDLqrN38tNFfI=
 github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0=
@@ -76,9 +72,7 @@ github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRF
 github.com/alexflint/go-filemutex v0.0.0-20171022225611-72bdc8eae2ae/go.mod h1:CgnQgUtFrFz9mxFNtED3jI5tLDjKlOM+oUF/sTk6ps0=
 github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883/go.mod h1:rCTlJbsFo29Kk6CurOXKm700vrz8f0KW0JNfpkRJY/8=
 github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8=
-github.com/asaskevich/govalidator v0.0.0-20180720115003-f9ffefc3facf h1:eg0MeVzsP1G42dRafH3vf+al2vQIJU0YHX+1Tw87oco=
 github.com/asaskevich/govalidator v0.0.0-20180720115003-f9ffefc3facf/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY=
-github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a h1:idn718Q4B6AGu/h5Sxe66HYVdqdGu2l9Iebqhi/AEoA=
 github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY=
 github.com/asaskevich/govalidator v0.0.0-20200108200545-475eaeb16496/go.mod h1:oGkLhpf+kjZl6xBf758TQhh5XrAeiJv/7FRz/2spLIg=
 github.com/asaskevich/govalidator v0.0.0-20200428143746-21a406dcc535 h1:4daAzAu0S6Vi7/lbWECcX0j45yZReDZ56BQsrVBOEEY=
@@ -88,7 +82,6 @@ github.com/aws/aws-sdk-go v1.34.28/go.mod h1:H7NKnBqNVzoTJpGfLrQkkD+ytBA93eiDYi/
 github.com/awslabs/tc-redirect-tap v0.0.0-20200708224642-a0300978797d h1:AZYARHUEwaWIITYIuBxUoastJ1t+aHom/6ZwEhfZzwo=
 github.com/awslabs/tc-redirect-tap v0.0.0-20200708224642-a0300978797d/go.mod h1:kQGbgU5sye2xV5J0ruPiscqz3Cj30VtoWRrhBeIo7dM=
 github.com/beorn7/perks v0.0.0-20160804104726-4c0e84591b9a/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=
-github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973 h1:xJ4a3vCFaGF/jqvzLMYoU8P317H5OQ+Via4RmuPwCS0=
 github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=
 github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=
 github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=
@@ -108,14 +101,12 @@ github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko=
 github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc=
 github.com/cespare/xxhash/v2 v2.1.1 h1:6MnRN8NT7+YBpUIWxHtefFZOKTAPgGjpQSxqLNn0+qY=
 github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
-github.com/checkpoint-restore/go-criu/v4 v4.1.0 h1:WW2B2uxx9KWF6bGlHqhm8Okiafwwx7Y2kcpn8lCpjgo=
 github.com/checkpoint-restore/go-criu/v4 v4.1.0/go.mod h1:xUQBLp4RLc5zJtWY++yjOoMoB5lihDt7fai+75m+rGw=
 github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=
 github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI=
 github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=
 github.com/cilium/ebpf v0.0.0-20200110133405-4032b1d8aae3/go.mod h1:MA5e5Lr8slmEg9bt0VpxxWqJlO4iwu3FBdHUzV7wQVg=
 github.com/cilium/ebpf v0.0.0-20200702112145-1c8d4c9ef775/go.mod h1:7cR51M8ViRLIdUjrmSXlK9pkrsDlLHbO8jiB8X8JnOc=
-github.com/cilium/ebpf v0.2.0 h1:Fv93L3KKckEcEHR3oApXVzyBTDA8WAm6VXhPE00N3f8=
 github.com/cilium/ebpf v0.2.0/go.mod h1:To2CFviqOWL/M0gIMsvSMlqe7em/l1ALkX1PyjrX2Qs=
 github.com/cilium/ebpf v0.4.0 h1:QlHdikaxALkqWasW8hAC1mfR0jdmvbfaBdBPFmRSglA=
 github.com/cilium/ebpf v0.4.0/go.mod h1:4tRaxcgiL706VnOzHOdBlY8IEAIdxINsQBcU4xJJXRs=
@@ -155,7 +146,6 @@ github.com/containerd/containerd v1.5.0-beta.4/go.mod h1:GmdgZd2zA2GYIBZ0w09Zvgq
 github.com/containerd/containerd v1.5.0-rc.0/go.mod h1:V/IXoMqNGgBlabz3tHD2TWDoTJseu1FGOKuoA4nNb2s=
 github.com/containerd/containerd v1.5.2 h1:MG/Bg1pbmMb61j3wHCFWPxESXHieiKr2xG64px/k8zQ=
 github.com/containerd/containerd v1.5.2/go.mod h1:0DOxVqwDy2iZvrZp2JUx/E+hS0UNTVn7dJnIOwtYR4g=
-github.com/containerd/continuity v0.0.0-20190426062206-aaeac12a7ffc h1:TP+534wVlf61smEIq1nwLLAjQVEK2EADoW3CX9AuT+8=
 github.com/containerd/continuity v0.0.0-20190426062206-aaeac12a7ffc/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y=
 github.com/containerd/continuity v0.0.0-20190815185530-f2a389ac0a02/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y=
 github.com/containerd/continuity v0.0.0-20191127005431-f65d91d395eb/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y=
@@ -166,19 +156,17 @@ github.com/containerd/continuity v0.1.0 h1:UFRRY5JemiAhPZrr/uE0n8fMTLcZsUvySPr1+
 github.com/containerd/continuity v0.1.0/go.mod h1:ICJu0PwR54nI0yPEnJ6jcS+J7CZAUXrLh8lPo2knzsM=
 github.com/containerd/fifo v0.0.0-20180307165137-3d5202aec260/go.mod h1:ODA38xgv3Kuk8dQz2ZQXpnv/UZZUHUCL7pnLehbXgQI=
 github.com/containerd/fifo v0.0.0-20190226154929-a9fb20d87448/go.mod h1:ODA38xgv3Kuk8dQz2ZQXpnv/UZZUHUCL7pnLehbXgQI=
-github.com/containerd/fifo v0.0.0-20191213151349-ff969a566b00 h1:lsjC5ENBl+Zgf38+B0ymougXFp0BaubeIVETltYZTQw=
 github.com/containerd/fifo v0.0.0-20191213151349-ff969a566b00/go.mod h1:jPQ2IAeZRCYxpS/Cm1495vGFww6ecHmMk1YJH2Q5ln0=
-github.com/containerd/fifo v0.0.0-20200410184934-f15a3290365b h1:qUtCegLdOUVfVJOw+KDg6eJyE1TGvLlkGEd1091kSSQ=
 github.com/containerd/fifo v0.0.0-20200410184934-f15a3290365b/go.mod h1:jPQ2IAeZRCYxpS/Cm1495vGFww6ecHmMk1YJH2Q5ln0=
 github.com/containerd/fifo v0.0.0-20201026212402-0724c46b320c/go.mod h1:jPQ2IAeZRCYxpS/Cm1495vGFww6ecHmMk1YJH2Q5ln0=
 github.com/containerd/fifo v0.0.0-20210316144830-115abcc95a1d/go.mod h1:ocF/ME1SX5b1AOlWi9r677YJmCPSwwWnQ9O123vzpE4=
 github.com/containerd/fifo v1.0.0 h1:6PirWBr9/L7GDamKr+XM0IeUFXu5mf3M/BPpH9gaLBU=
 github.com/containerd/fifo v1.0.0/go.mod h1:ocF/ME1SX5b1AOlWi9r677YJmCPSwwWnQ9O123vzpE4=
 github.com/containerd/go-cni v1.0.1/go.mod h1:+vUpYxKvAF72G9i1WoDOiPGRtQpqsNW/ZHtSlv++smU=
+github.com/containerd/go-cni v1.0.2 h1:YbJAhpTevL2v6u8JC1NhCYRwf+3Vzxcc5vGnYoJ7VeE=
 github.com/containerd/go-cni v1.0.2/go.mod h1:nrNABBHzu0ZwCug9Ije8hL2xBCYh/pjfMb1aZGrrohk=
 github.com/containerd/go-runc v0.0.0-20180907222934-5a6d9f37cfa3/go.mod h1:IV7qH3hrUgRmyYrtgEeGWJfWbgcHL9CSRruz2Vqcph0=
 github.com/containerd/go-runc v0.0.0-20190911050354-e029b79d8cda/go.mod h1:IV7qH3hrUgRmyYrtgEeGWJfWbgcHL9CSRruz2Vqcph0=
-github.com/containerd/go-runc v0.0.0-20200220073739-7016d3ce2328 h1:PRTagVMbJcCezLcHXe8UJvR1oBzp2lG3CEumeFOLOds=
 github.com/containerd/go-runc v0.0.0-20200220073739-7016d3ce2328/go.mod h1:PpyHrqVs8FTi9vpyHwPwiNEGaACDxT/N/pLcvMSRA9g=
 github.com/containerd/go-runc v0.0.0-20201020171139-16b287bc67d0/go.mod h1:cNU0ZbCgCQVZK4lgG3P+9tn9/PaJNmoDXPpoJhDR+Ok=
 github.com/containerd/go-runc v1.0.0 h1:oU+lLv1ULm5taqgV/CJivypVODI4SUz1znWjv3nNYS0=
@@ -193,13 +181,11 @@ github.com/containerd/nri v0.1.0/go.mod h1:lmxnXF6oMkbqs39FiCt1s0R2HSMhcLel9vNL3
 github.com/containerd/ttrpc v0.0.0-20190828154514-0e0f228740de/go.mod h1:PvCDdDGpgqzQIzDW1TphrGLssLDZp2GuS+X5DkEJB8o=
 github.com/containerd/ttrpc v0.0.0-20190828172938-92c8520ef9f8/go.mod h1:PvCDdDGpgqzQIzDW1TphrGLssLDZp2GuS+X5DkEJB8o=
 github.com/containerd/ttrpc v0.0.0-20191028202541-4f1b8fe65a5c/go.mod h1:LPm1u0xBw8r8NOKoOdNMeVHSawSsltak+Ihv+etqsE8=
-github.com/containerd/ttrpc v1.0.1 h1:IfVOxKbjyBn9maoye2JN95pgGYOmPkQVqxtOu7rtNIc=
 github.com/containerd/ttrpc v1.0.1/go.mod h1:UAxOpgT9ziI0gJrmKvgcZivgxOp8iFPSk8httJEt98Y=
 github.com/containerd/ttrpc v1.0.2 h1:2/O3oTZN36q2xRolk0a2WWGgh7/Vf/liElg5hFYLX9U=
 github.com/containerd/ttrpc v1.0.2/go.mod h1:UAxOpgT9ziI0gJrmKvgcZivgxOp8iFPSk8httJEt98Y=
 github.com/containerd/typeurl v0.0.0-20180627222232-a93fcdb778cd/go.mod h1:Cm3kwCdlkCfMSHURc+r6fwoGH6/F1hH3S4sg0rLFWPc=
 github.com/containerd/typeurl v0.0.0-20190911142611-5eb25027c9fd/go.mod h1:GeKYzf2pQcqv7tJ0AoCuuhtnqhva5LNU3U+OyKxxJpk=
-github.com/containerd/typeurl v1.0.1 h1:PvuK4E3D5S5q6IqsPDCy928FhP0LUIGcmZ/Yhgp5Djw=
 github.com/containerd/typeurl v1.0.1/go.mod h1:TB1hUtrpaiO88KEK56ijojHS1+NeF0izUACaJW2mdXg=
 github.com/containerd/typeurl v1.0.2 h1:Chlt8zIieDbzQFzXzAeBEF92KhExuE4p9p92/QmY7aY=
 github.com/containerd/typeurl v1.0.2/go.mod h1:9trJWW2sRlGub4wZJRTW83VtbOLS6hwcDZXTn6oPz9s=
@@ -209,14 +195,11 @@ github.com/containerd/zfs v0.0.0-20210315114300-dde8f0fda960/go.mod h1:m+m51S1Dv
 github.com/containerd/zfs v0.0.0-20210324211415-d5c4544f0433/go.mod h1:m+m51S1DvAP6r3FcmYCp54bQ34pyOwTieQDNRIRHsFY=
 github.com/containerd/zfs v1.0.0/go.mod h1:m+m51S1DvAP6r3FcmYCp54bQ34pyOwTieQDNRIRHsFY=
 github.com/containernetworking/cni v0.7.1/go.mod h1:LGwApLUm2FpoOfxTDEeq8T9ipbpZ61X79hmU3w8FmsY=
-github.com/containernetworking/cni v0.8.0 h1:BT9lpgGoH4jw3lFC7Odz2prU5ruiYKcgAjMCbgybcKI=
 github.com/containernetworking/cni v0.8.0/go.mod h1:LGwApLUm2FpoOfxTDEeq8T9ipbpZ61X79hmU3w8FmsY=
 github.com/containernetworking/cni v0.8.1 h1:7zpDnQ3T3s4ucOuJ/ZCLrYBxzkg0AELFfII3Epo9TmI=
 github.com/containernetworking/cni v0.8.1/go.mod h1:LGwApLUm2FpoOfxTDEeq8T9ipbpZ61X79hmU3w8FmsY=
-github.com/containernetworking/plugins v0.8.6 h1:npZTLiMa4CRn6m5P9+1Dz4O1j0UeFbm8VYN6dlsw568=
 github.com/containernetworking/plugins v0.8.6/go.mod h1:qnw5mN19D8fIwkqW7oHHYDHVlzhJpcY6TQxn/fUyDDM=
-github.com/containernetworking/plugins v0.8.7 h1:bU7QieuAp+sACI2vCzESJ3FoT860urYP+lThyZkb/2M=
-github.com/containernetworking/plugins v0.8.7/go.mod h1:R7lXeZaBzpfqapcAbHRW8/CYwm0dHzbz0XEjofx0uB0=
+github.com/containernetworking/plugins v0.9.0/go.mod h1:dbWv4dI0QrBGuVgj+TuVQ6wJRZVOhrCQj91YyC92sxg=
 github.com/containernetworking/plugins v0.9.1 h1:FD1tADPls2EEi3flPc2OegIY1M9pUa9r2Quag7HMLV8=
 github.com/containernetworking/plugins v0.9.1/go.mod h1:xP/idU2ldlzN6m4p5LmGiwRDjeJr6FLK6vuiUwoH7P8=
 github.com/containers/ocicrypt v1.0.1/go.mod h1:MeJDzk1RJHv89LjsH0Sp5KTY3ZYkjXO/C+bKAeWFIrc=
@@ -230,7 +213,6 @@ github.com/coreos/go-oidc v2.1.0+incompatible/go.mod h1:CgnwVTmzoESiwO9qyAFEMiHo
 github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk=
 github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk=
 github.com/coreos/go-systemd v0.0.0-20161114122254-48702e0da86b/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=
-github.com/coreos/go-systemd v0.0.0-20180511133405-39ca1b05acc7 h1:u9SHYsPQNyt5tgDm3YN7+9dYrpK96E5wFilTFWIDZOM=
 github.com/coreos/go-systemd v0.0.0-20180511133405-39ca1b05acc7/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=
 github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e h1:Wf6HqHfScWJN9/ZjdUKyjop4mf3Qdd+1TvvltAvM3m8=
 github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=
@@ -244,7 +226,6 @@ github.com/cpuguy83/go-md2man/v2 v2.0.0 h1:EoUDS0afbrsXAZ9YQ9jdu/mZ2sXgT1/2yyNng
 github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU=
 github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY=
 github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
-github.com/cyphar/filepath-securejoin v0.2.2 h1:jCwT2GTP+PY5nBz3c/YL5PAIbusElVrPujOBSCj8xRg=
 github.com/cyphar/filepath-securejoin v0.2.2/go.mod h1:FpkQEhXnPnOthhzymB7CGsFk2G9VLXONKD9G7QGMM+4=
 github.com/d2g/dhcp4 v0.0.0-20170904100407-a1d1b6c41b1c/go.mod h1:Ct2BUK8SB0YC1SMSibvLzxjeJLnrYEVLULFNiHY9YfQ=
 github.com/d2g/dhcp4client v1.0.0/go.mod h1:j0hNfjhrt2SxUOw55nL0ATM/z4Yt3t2Kd1mW34z5W5s=
@@ -267,7 +248,6 @@ github.com/docker/go-events v0.0.0-20190806004212-e31b211e4f1c/go.mod h1:Uw6Uezg
 github.com/docker/go-metrics v0.0.0-20180209012529-399ea8c73916/go.mod h1:/u0gXw0Gay3ceNrsHubL3BtdOL2fHf93USgMTe0W5dI=
 github.com/docker/go-metrics v0.0.1 h1:AgB/0SvBxihN0X8OR4SjsblXkbMvalQ8cjmtKQ2rQV8=
 github.com/docker/go-metrics v0.0.1/go.mod h1:cG1hvH2utMXtqgqqYE9plW6lDxS3/5ayHzueweSI3Vw=
-github.com/docker/go-units v0.3.3 h1:Xk8S3Xj5sLGlG5g67hJmYMmUgXv5N4PhkjJHHqrwnTk=
 github.com/docker/go-units v0.3.3/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk=
 github.com/docker/go-units v0.4.0 h1:3uh0PgVws3nIA0Q+MwDC8yjEPf9zjRfZZWXZYDct3Tw=
 github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk=
@@ -283,8 +263,8 @@ github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.m
 github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
 github.com/evanphx/json-patch v4.9.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk=
 github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=
-github.com/firecracker-microvm/firecracker-go-sdk v0.22.1-0.20201117001223-cd822c0d457c h1:OVDRQkCg0SvAYg3bhL6YDjdF6c8TBpQF6kQ8qwO2nA4=
-github.com/firecracker-microvm/firecracker-go-sdk v0.22.1-0.20201117001223-cd822c0d457c/go.mod h1:AY+NnSajCqPOB59l4rseMETsDM0tcpTd+st3T9ko/cA=
+github.com/firecracker-microvm/firecracker-go-sdk v0.22.1-0.20210520223842-abd0815b8bf9 h1:IKjNicWBHpNyJ/vWO+yPYjFQ0ma2W6+hQrGkNGSzsIQ=
+github.com/firecracker-microvm/firecracker-go-sdk v0.22.1-0.20210520223842-abd0815b8bf9/go.mod h1:Dbh2OFp/p0Obqp7An+3ktnfC6/a5DKUkMQ5zA/Qmb+0=
 github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k=
 github.com/frankban/quicktest v1.11.3 h1:8sXhOn0uLys67V8EsXLc6eszDs8VXWxL3iRvebPhedY=
 github.com/frankban/quicktest v1.11.3/go.mod h1:wRf/ReqHper53s+kmmSZizM8NamnL3IM0I9ntUbOk+k=
@@ -295,7 +275,6 @@ github.com/fullsailor/pkcs7 v0.0.0-20190404230743-d7302db945fa/go.mod h1:KnogPXt
 github.com/garyburd/redigo v0.0.0-20150301180006-535138d7bcd7/go.mod h1:NR3MbYisc3/PwhQ00EMzDiPmrwpPxAn5GI05/YaO1SY=
 github.com/ghodss/yaml v0.0.0-20150909031657-73d445a93680/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
 github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
-github.com/globalsign/mgo v0.0.0-20180905125535-1ca0a4f7cbcb h1:D4uzjWwKYQ5XnAvUbuvHW93esHg7F8N/OYeBBcJoTr0=
 github.com/globalsign/mgo v0.0.0-20180905125535-1ca0a4f7cbcb/go.mod h1:xkRDCp4j0OGD1HRkm4kmhM+pmpv3AKq5SU7GMg4oO/Q=
 github.com/globalsign/mgo v0.0.0-20181015135952-eeefdecb41b8/go.mod h1:xkRDCp4j0OGD1HRkm4kmhM+pmpv3AKq5SU7GMg4oO/Q=
 github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=
@@ -311,38 +290,31 @@ github.com/go-logr/logr v0.2.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTg
 github.com/go-ole/go-ole v1.2.4 h1:nNBDSCOigTSiarFpYE9J/KtEA1IOW4CNeqT9TQDqCxI=
 github.com/go-ole/go-ole v1.2.4/go.mod h1:XCwSNxSkXRo4vlyPy93sltvi/qJq0jqQhjqQNIwKuxM=
 github.com/go-openapi/analysis v0.0.0-20180825180245-b006789cd277/go.mod h1:k70tL6pCuVxPJOHXQ+wIac1FUrvNkHolPie/cLEU6hI=
-github.com/go-openapi/analysis v0.17.0 h1:8JV+dzJJiK46XqGLqqLav8ZfEiJECp8jlOFhpiCdZ+0=
 github.com/go-openapi/analysis v0.17.0/go.mod h1:IowGgpVeD0vNm45So8nr+IcQ3pxVtpRoBWb8PVZO0ik=
 github.com/go-openapi/analysis v0.18.0/go.mod h1:IowGgpVeD0vNm45So8nr+IcQ3pxVtpRoBWb8PVZO0ik=
 github.com/go-openapi/analysis v0.19.2/go.mod h1:3P1osvZa9jKjb8ed2TPng3f0i/UY9snX6gxi44djMjk=
 github.com/go-openapi/analysis v0.19.4/go.mod h1:3P1osvZa9jKjb8ed2TPng3f0i/UY9snX6gxi44djMjk=
-github.com/go-openapi/analysis v0.19.5 h1:8b2ZgKfKIUTVQpTb77MoRDIMEIwvDVw40o3aOXdfYzI=
 github.com/go-openapi/analysis v0.19.5/go.mod h1:hkEAkxagaIvIP7VTn8ygJNkd4kAYON2rCu0v0ObL0AU=
 github.com/go-openapi/analysis v0.19.10 h1:5BHISBAXOc/aJK25irLZnx2D3s6WyYaY9D4gmuz9fdE=
 github.com/go-openapi/analysis v0.19.10/go.mod h1:qmhS3VNFxBlquFJ0RGoDtylO9y4pgTAUNE9AEEMdlJQ=
 github.com/go-openapi/errors v0.17.0/go.mod h1:LcZQpmvG4wyF5j4IhA73wkLFQg+QJXOQHVjmcZxhka0=
 github.com/go-openapi/errors v0.18.0/go.mod h1:LcZQpmvG4wyF5j4IhA73wkLFQg+QJXOQHVjmcZxhka0=
 github.com/go-openapi/errors v0.19.2/go.mod h1:qX0BLWsyaKfvhluLejVpVNwNRdXZhEbTA4kxxpKBC94=
-github.com/go-openapi/errors v0.19.3 h1:7MGZI1ibQDLasvAz8HuhvYk9eNJbJkCOXWsSjjMS+Zc=
 github.com/go-openapi/errors v0.19.3/go.mod h1:qX0BLWsyaKfvhluLejVpVNwNRdXZhEbTA4kxxpKBC94=
-github.com/go-openapi/errors v0.19.6 h1:xZMThgv5SQ7SMbWtKFkCf9bBdvR2iEyw9k3zGZONuys=
 github.com/go-openapi/errors v0.19.6/go.mod h1:cM//ZKUKyO06HSwqAelJ5NsEMMcpa6VpXe8DOa1Mi1M=
 github.com/go-openapi/errors v0.19.7/go.mod h1:cM//ZKUKyO06HSwqAelJ5NsEMMcpa6VpXe8DOa1Mi1M=
-github.com/go-openapi/errors v0.19.8 h1:doM+tQdZbUm9gydV9yR+iQNmztbjj7I3sW4sIcAwIzc=
-github.com/go-openapi/errors v0.19.8/go.mod h1:cM//ZKUKyO06HSwqAelJ5NsEMMcpa6VpXe8DOa1Mi1M=
-github.com/go-openapi/jsonpointer v0.17.0 h1:nH6xp8XdXHx8dqveo0ZuJBluCO2qGrPbDNZ0dwoRHP0=
+github.com/go-openapi/errors v0.20.0 h1:Sxpo9PjEHDzhs3FbnGNonvDgWcMW2U7wGTcDDSFSceM=
+github.com/go-openapi/errors v0.20.0/go.mod h1:cM//ZKUKyO06HSwqAelJ5NsEMMcpa6VpXe8DOa1Mi1M=
 github.com/go-openapi/jsonpointer v0.17.0/go.mod h1:cOnomiV+CVVwFLk0A/MExoFMjwdsUdVpsRhURCKh+3M=
 github.com/go-openapi/jsonpointer v0.18.0/go.mod h1:cOnomiV+CVVwFLk0A/MExoFMjwdsUdVpsRhURCKh+3M=
 github.com/go-openapi/jsonpointer v0.19.2/go.mod h1:3akKfEdA7DF1sugOqz1dVQHBcuDBPKZGEoHC/NkiQRg=
 github.com/go-openapi/jsonpointer v0.19.3 h1:gihV7YNZK1iK6Tgwwsxo2rJbD1GTbdm72325Bq8FI3w=
 github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg=
-github.com/go-openapi/jsonreference v0.17.0 h1:yJW3HCkTHg7NOA+gZ83IPHzUSnUzGXhGmsdiCcMexbA=
 github.com/go-openapi/jsonreference v0.17.0/go.mod h1:g4xxGn04lDIRh0GJb5QlpE3HfopLOL6uZrK/VgnsK9I=
 github.com/go-openapi/jsonreference v0.18.0/go.mod h1:g4xxGn04lDIRh0GJb5QlpE3HfopLOL6uZrK/VgnsK9I=
 github.com/go-openapi/jsonreference v0.19.2/go.mod h1:jMjeRr2HHw6nAVajTXJ4eiUwohSTlpa0o73RUL1owJc=
 github.com/go-openapi/jsonreference v0.19.3 h1:5cxNfTy0UVC3X8JL5ymxzyoUZmo8iZb+jeTWn7tUa8o=
 github.com/go-openapi/jsonreference v0.19.3/go.mod h1:rjx6GuL8TTa9VaixXglHmQmIL98+wF9xc8zWvFonSJ8=
-github.com/go-openapi/loads v0.17.0 h1:H22nMs3GDQk4SwAaFQ+jLNw+0xoFeCueawhZlv8MBYs=
 github.com/go-openapi/loads v0.17.0/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU=
 github.com/go-openapi/loads v0.18.0/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU=
 github.com/go-openapi/loads v0.19.0/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU=
@@ -355,13 +327,11 @@ github.com/go-openapi/runtime v0.19.0/go.mod h1:OwNfisksmmaZse4+gpV3Ne9AyMOlP1lt
 github.com/go-openapi/runtime v0.19.4/go.mod h1:X277bwSUBxVlCYR3r7xgZZGKVvBd/29gLDlFGtJ8NL4=
 github.com/go-openapi/runtime v0.19.15/go.mod h1:dhGWCTKRXlAfGnQG0ONViOZpjfg0m2gUt9nTQPQZuoo=
 github.com/go-openapi/runtime v0.19.16/go.mod h1:5P9104EJgYcizotuXhEuUrzVc+j1RiSjahULvYmlv98=
-github.com/go-openapi/runtime v0.19.24 h1:TqagMVlRAOTwllE/7hNKx6rQ10O6T8ZzeJdMjSTKaD4=
-github.com/go-openapi/runtime v0.19.24/go.mod h1:Lm9YGCeecBnUUkFTxPC4s1+lwrkJ0pthx8YvyjCfkgk=
-github.com/go-openapi/spec v0.17.0 h1:XNvrt8FlSVP8T1WuhbAFF6QDhJc0zsoWzX4wXARhhpE=
+github.com/go-openapi/runtime v0.19.26 h1:K/6PoVNj5WJXUnMk+VEbELeXjtBkCS1UxTDa04tdXE0=
+github.com/go-openapi/runtime v0.19.26/go.mod h1:BvrQtn6iVb2QmiVXRsFAm6ZCAZBpbVKFfN6QWCp582M=
 github.com/go-openapi/spec v0.17.0/go.mod h1:XkF/MOi14NmjsfZ8VtAKf8pIlbZzyoTvZsdfssdxcBI=
 github.com/go-openapi/spec v0.18.0/go.mod h1:XkF/MOi14NmjsfZ8VtAKf8pIlbZzyoTvZsdfssdxcBI=
 github.com/go-openapi/spec v0.19.2/go.mod h1:sCxk3jxKgioEJikev4fgkNmwS+3kuYdJtcsZsD5zxMY=
-github.com/go-openapi/spec v0.19.3 h1:0XRyw8kguri6Yw4SxhsQA/atC88yqrk0+G4YhI2wabc=
 github.com/go-openapi/spec v0.19.3/go.mod h1:FpwSN1ksY1eteniUU7X0N/BgJ7a4WvBFVA8Lj9mJglo=
 github.com/go-openapi/spec v0.19.6/go.mod h1:Hm2Jr4jv8G1ciIAo+frC/Ft+rR2kQDh8JHKHb3gWUSk=
 github.com/go-openapi/spec v0.19.8 h1:qAdZLh1r6QF/hI/gTq+TJTvsQUodZsM7KLqkAJdiJNg=
@@ -371,9 +341,7 @@ github.com/go-openapi/strfmt v0.18.0/go.mod h1:P82hnJI0CXkErkXi8IKjPbNBM6lV6+5pL
 github.com/go-openapi/strfmt v0.19.0/go.mod h1:+uW+93UVvGGq2qGaZxdDeJqSAqBqBdl+ZPMF/cC8nDY=
 github.com/go-openapi/strfmt v0.19.2/go.mod h1:0yX7dbo8mKIvc3XSKp7MNfxw4JytCfCD6+bY1AVL9LU=
 github.com/go-openapi/strfmt v0.19.3/go.mod h1:0yX7dbo8mKIvc3XSKp7MNfxw4JytCfCD6+bY1AVL9LU=
-github.com/go-openapi/strfmt v0.19.4 h1:eRvaqAhpL0IL6Trh5fDsGnGhiXndzHFuA05w6sXH6/g=
 github.com/go-openapi/strfmt v0.19.4/go.mod h1:eftuHTlB/dI8Uq8JJOyRlieZf+WkkxUuk0dgdHXr2Qk=
-github.com/go-openapi/strfmt v0.19.5 h1:0utjKrw+BAh8s57XE9Xz8DUBsVvPmRUB6styvl9wWIM=
 github.com/go-openapi/strfmt v0.19.5/go.mod h1:eftuHTlB/dI8Uq8JJOyRlieZf+WkkxUuk0dgdHXr2Qk=
 github.com/go-openapi/strfmt v0.19.10 h1:FEv6Pt/V4wLwP4vOCZbWlpfmi8kj4UiRip34IDE6SGw=
 github.com/go-openapi/strfmt v0.19.10/go.mod h1:qBBipho+3EoIqn6YDI+4RnQEtj6jT/IdKm+PAlXxSUc=
@@ -381,16 +349,13 @@ github.com/go-openapi/swag v0.17.0/go.mod h1:AByQ+nYG6gQg71GINrmuDXCPWdL640yX49/
 github.com/go-openapi/swag v0.18.0/go.mod h1:AByQ+nYG6gQg71GINrmuDXCPWdL640yX49/kXLo40Tg=
 github.com/go-openapi/swag v0.19.2/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk=
 github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk=
-github.com/go-openapi/swag v0.19.7 h1:VRuXN2EnMSsZdauzdss6JBC29YotDqG59BZ+tdlIL1s=
 github.com/go-openapi/swag v0.19.7/go.mod h1:ao+8BpOPyKdpQz3AOJfbeEVpLmWAvlT1IfTe5McPyhY=
-github.com/go-openapi/swag v0.19.9 h1:1IxuqvBUU3S2Bi4YC7tlP9SJF1gVpCvqN0T2Qof4azE=
 github.com/go-openapi/swag v0.19.9/go.mod h1:ao+8BpOPyKdpQz3AOJfbeEVpLmWAvlT1IfTe5McPyhY=
-github.com/go-openapi/swag v0.19.11 h1:RFTu/dlFySpyVvJDfp/7674JY4SDglYWKztbiIGFpmc=
-github.com/go-openapi/swag v0.19.11/go.mod h1:Uc0gKkdR+ojzsEpjh39QChyu92vPgIr72POcgHMAgSY=
+github.com/go-openapi/swag v0.19.14 h1:gm3vOOXfiuw5i9p5N9xJvfjvuofpyvLA9Wr6QfK5Fng=
+github.com/go-openapi/swag v0.19.14/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ=
 github.com/go-openapi/validate v0.18.0/go.mod h1:Uh4HdOzKt19xGIGm1qHf/ofbX1YQ4Y+MYsct2VUrAJ4=
 github.com/go-openapi/validate v0.19.2/go.mod h1:1tRCw7m3jtI8eNWEEliiAqUIcBztB2KDnRCRMUi7GTA=
 github.com/go-openapi/validate v0.19.3/go.mod h1:90Vh6jjkTn+OT1Eefm0ZixWNFjhtOH7vS9k0lo6zwJo=
-github.com/go-openapi/validate v0.19.10 h1:tG3SZ5DC5KF4cyt7nqLVcQXGj5A7mpaYkAcNPlDK+Yk=
 github.com/go-openapi/validate v0.19.10/go.mod h1:RKEZTUWDkxKQxN2jDT7ZnZi2bhZlbNMAuKvKB+IaGx8=
 github.com/go-openapi/validate v0.19.12 h1:mPLM/bfbd00PGOCJlU0yJL7IulkZ+q9VjPv7U11RMQQ=
 github.com/go-openapi/validate v0.19.12/go.mod h1:Rzou8hA/CBw8donlS6WNEUQupNvUZ0waH08tGe6kAQ4=
@@ -422,7 +387,6 @@ github.com/gobuffalo/packr/v2 v2.0.9/go.mod h1:emmyGweYTm6Kdper+iywB6YK5YzuKchGt
 github.com/gobuffalo/packr/v2 v2.2.0/go.mod h1:CaAwI0GPIAv+5wKLtv8Afwl+Cm78K/I/VCm/3ptBN+0=
 github.com/gobuffalo/syncx v0.0.0-20190224160051-33c29581e754/go.mod h1:HhnNqWY95UYwwW3uSASeV7vtgYkT2t16hJgV3AEPUpw=
 github.com/godbus/dbus v0.0.0-20151105175453-c7fdd8b5cd55/go.mod h1:/YcGZj5zSblfDWMMoOzV4fas9FZnQYTkDnsGvmh2Grw=
-github.com/godbus/dbus v0.0.0-20180201030542-885f9cc04c9c h1:RBUpb2b14UnmRHNd2uHz20ZHLDK+SW5Us/vWF5IHRaY=
 github.com/godbus/dbus v0.0.0-20180201030542-885f9cc04c9c/go.mod h1:/YcGZj5zSblfDWMMoOzV4fas9FZnQYTkDnsGvmh2Grw=
 github.com/godbus/dbus v0.0.0-20190422162347-ade71ed3457e h1:BWhy2j3IXJhjCbC68FptL43tDKIq8FladmaTs3Xs7Z8=
 github.com/godbus/dbus v0.0.0-20190422162347-ade71ed3457e/go.mod h1:bBOAhwG1umN6/6ZUMtDFBMQR8jRg9O75tm9K00oMsK4=
@@ -436,7 +400,6 @@ github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7a
 github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4=
 github.com/gogo/protobuf v1.2.2-0.20190723190241-65acae22fc9d/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o=
 github.com/gogo/protobuf v1.3.0/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o=
-github.com/gogo/protobuf v1.3.1 h1:DqDEcV5aeaTmdFBePNpYsp3FlcVH/2ISVVM9Qf8PSls=
 github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o=
 github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q=
 github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=
@@ -448,7 +411,6 @@ github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4er
 github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
 github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e h1:1r7pUrabqp18hOBcwBwiTsbnFeTZHV9eER/QT5JVZxY=
 github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
-github.com/golang/mock v1.1.1 h1:G5FRp8JnTd7RQH5kemVNlMeyXQAztQ3mOWV95KxsXH8=
 github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
 github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
 github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y=
@@ -459,15 +421,12 @@ github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgj
 github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
 github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
 github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
-github.com/google/go-cmp v0.2.0 h1:+dTQ8DZQJz0Mb/HjFlkptS1FeQ4cWSnN941F8aEG4SQ=
 github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
-github.com/google/go-cmp v0.3.0 h1:crn/baboCvb5fXaQ0IJ1SGTsTVrWpDsCWC8EGETZijY=
 github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
 github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
 github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
 github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
 github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
-github.com/google/go-cmp v0.5.2 h1:X2ev0eStA3AbceY54o37/0PQ/UWqKEiiO2dKL5OPaFM=
 github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
 github.com/google/go-cmp v0.5.4 h1:L8R9j+yAqZuZjsqh/z+F1NCffTKKLShY6zXTItVIZ8M=
 github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
@@ -481,7 +440,6 @@ github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hf
 github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
 github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=
 github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
-github.com/google/uuid v1.1.1 h1:Gkbcsh/GbpXz7lPftLA3P6TYMwjCLYm83jiFQZF/3gY=
 github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
 github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
 github.com/google/uuid v1.2.0 h1:qJYtXnJRWmpe7m/3XlyhrsLrEURqHRM2kxzoxXqyUDs=
@@ -510,13 +468,11 @@ github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHh
 github.com/hashicorp/go-multierror v1.1.0 h1:B9UzwGQJehnUY1yNrnwREHc3fGbC2xefo8g4TbElacI=
 github.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA=
 github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
-github.com/hashicorp/golang-lru v0.5.1 h1:0hERBMJE1eitiLkihrMvRVBYAkpHzc/J3QdDN+dAcgU=
 github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
 github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ=
 github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
 github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=
 github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA=
-github.com/imdario/mergo v0.3.8 h1:CGgOkSJeqMRmt0D9XLWExdT4m4F1vd3FV3VPt+0VxkQ=
 github.com/imdario/mergo v0.3.8/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA=
 github.com/imdario/mergo v0.3.10/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA=
 github.com/imdario/mergo v0.3.11 h1:3tnifQM4i+fbajXKBHXWEH+KvNHqojZ778UH75j3bGA=
@@ -529,6 +485,8 @@ github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHW
 github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U=
 github.com/joho/godotenv v1.3.0/go.mod h1:7hK45KPybAkOC6peb+G5yklZfMxEjkZhHbwpqxOKXbg=
 github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo=
+github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY=
+github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y=
 github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=
 github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
 github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
@@ -559,14 +517,17 @@ github.com/kr/pty v1.1.5/go.mod h1:9r2w37qlBe7rQ6e1fg1S/9xpWHSnaqNdHD3WcMdbPDA=
 github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
 github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
 github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
+github.com/magefile/mage v1.10.0 h1:3HiXzCUY12kh9bIuyXShaVe529fJfyqoVM42o/uom2g=
+github.com/magefile/mage v1.10.0/go.mod h1:z5UZb/iS3GoOSn0JgWuiw7dxlurVYTu+/jHXqQg881A=
 github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ=
 github.com/mailru/easyjson v0.0.0-20180823135443-60711f1a8329/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
 github.com/mailru/easyjson v0.0.0-20190312143242-1de009706dbe/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
 github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
 github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
 github.com/mailru/easyjson v0.7.0/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7ldAVICs=
-github.com/mailru/easyjson v0.7.1 h1:mdxE1MF9o53iCb2Ghj1VfWvh7ZOwHpnVG/xwXrV90U8=
 github.com/mailru/easyjson v0.7.1/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7ldAVICs=
+github.com/mailru/easyjson v0.7.6 h1:8yTIVnZgCoiM1TgqoeTl+LfU5Jg6/xL3QhGQnimLYnA=
+github.com/mailru/easyjson v0.7.6/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc=
 github.com/markbates/oncer v0.0.0-20181203154359-bf2de49a0be2/go.mod h1:Ld9puTsIW75CHf65OeIOkyKbteujpZVXDpWK6YGZbxE=
 github.com/markbates/safe v1.0.1/go.mod h1:nAqgmRi7cY2nqMc92/bSEeQA+R4OheNU2T1kNSCBdG0=
 github.com/marstr/guid v1.1.0/go.mod h1:74gB1z2wpxxInTG6yaqA7KrtM0NZ+RbrcqDvYHefzho=
@@ -574,7 +535,6 @@ github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaO
 github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=
 github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU=
 github.com/mattn/go-shellwords v1.0.3/go.mod h1:3xCvwCdWdlDJUrvuMn7Wuy9eWs4pE8vqg+NOMyg4B2o=
-github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU=
 github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
 github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 h1:I0XW9+e1XWDxdcEniV4rQAIOPUGDq67JSCiRCgGCZLI=
 github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4=
@@ -613,7 +573,6 @@ github.com/nxadm/tail v1.4.4 h1:DQuhQpB1tVlglWS2hLQ5OV6B5r8aGxSrPc5Qo6uTN78=
 github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A=
 github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U=
 github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo=
-github.com/onsi/ginkgo v0.0.0-20151202141238-7f8ab55aaf3b h1:Ey6yH0acn50T/v6CB75bGP4EMJqnv9WvnjN7oZaj+xE=
 github.com/onsi/ginkgo v0.0.0-20151202141238-7f8ab55aaf3b/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
 github.com/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
 github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
@@ -622,7 +581,6 @@ github.com/onsi/ginkgo v1.10.3/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+
 github.com/onsi/ginkgo v1.11.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
 github.com/onsi/ginkgo v1.12.1 h1:mFwc4LvZ0xpSvDZ3E+k8Yte0hLOMxXUlP+yXtJqkYfQ=
 github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk=
-github.com/onsi/gomega v0.0.0-20151007035656-2152b45fa28a h1:KfNOeFvoAssuZLT7IntKZElKwi/5LRuxY71k+t6rfaM=
 github.com/onsi/gomega v0.0.0-20151007035656-2152b45fa28a/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA=
 github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA=
 github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=
@@ -631,7 +589,6 @@ github.com/onsi/gomega v1.10.3 h1:gph6h/qe9GSUw1NhH1gp+qb+h8rXD8Cy60Z32Qw3ELA=
 github.com/onsi/gomega v1.10.3/go.mod h1:V9xEwhxec5O8UDM77eCW8vLymOMltsqPVYWrpDsH8xc=
 github.com/opencontainers/go-digest v0.0.0-20170106003457-a6d0ee40d420/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s=
 github.com/opencontainers/go-digest v0.0.0-20180430190053-c9281466c8b2/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s=
-github.com/opencontainers/go-digest v1.0.0-rc1 h1:WzifXhOVOEOuFYOJAW6aQqW0TooG2iki3E3Ii+WN7gQ=
 github.com/opencontainers/go-digest v1.0.0-rc1/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s=
 github.com/opencontainers/go-digest v1.0.0-rc1.0.20180430190053-c9281466c8b2/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s=
 github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U=
@@ -655,6 +612,8 @@ github.com/opencontainers/runtime-tools v0.0.0-20181011054405-1d69bd0f9c39/go.mo
 github.com/opencontainers/selinux v1.6.0/go.mod h1:VVGKuOLlE7v4PJyT6h7mNWvq1rzqiriPsEqVhc+svHE=
 github.com/opencontainers/selinux v1.8.0 h1:+77ba4ar4jsCbL1GLbFL8fFM57w6suPfSS9PDLDY7KM=
 github.com/opencontainers/selinux v1.8.0/go.mod h1:RScLhm78qiWa2gbVCcGkC7tCGdgk3ogry1nUQF8Evvo=
+github.com/opentracing/opentracing-go v1.2.0 h1:uEJPy/1a5RIPAJ0Ov+OIO8OxWu77jEv+1B0VhjKrZUs=
+github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc=
 github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k=
 github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic=
 github.com/pelletier/go-toml v1.4.0/go.mod h1:PN7xzY2wHTK0K9p34ErDQMlFxa51Fk0OUruD3k1mMwo=
@@ -680,7 +639,6 @@ github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP
 github.com/prometheus/client_model v0.0.0-20171117100541-99fa1f4be8e5/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
 github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
 github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
-github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4 h1:gQz4mCbXsO+nc9n1hCxHcGA3Zx3Eo+UHZoInFGUIXNM=
 github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
 github.com/prometheus/client_model v0.2.0 h1:uq5h0d+GuxiXLJLNABMgp2qUWDPiLvgCzz2dUR+/W/M=
 github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
@@ -697,7 +655,6 @@ github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7z
 github.com/prometheus/procfs v0.0.0-20190522114515-bc1a522cf7b1/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=
 github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=
 github.com/prometheus/procfs v0.0.3/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ=
-github.com/prometheus/procfs v0.0.5 h1:3+auTFlqw+ZaQYJARz6ArODtkaIwtvBTx3N2NehQlL8=
 github.com/prometheus/procfs v0.0.5/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ=
 github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A=
 github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU=
@@ -728,8 +685,9 @@ github.com/sirupsen/logrus v1.4.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPx
 github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q=
 github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=
 github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88=
-github.com/sirupsen/logrus v1.7.0 h1:ShrD1U9pZB12TX0cVy0DtePoCH97K8EtX+mg7ZARUtM=
 github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0=
+github.com/sirupsen/logrus v1.8.0 h1:nfhvjKcUMhBMVqbKHJlk5RPrrfYr/NMo3692g0dwfWU=
+github.com/sirupsen/logrus v1.8.0/go.mod h1:4GuYW9TZmE769R5STWrRakJc4UqQ3+QQ95fyz7ENv1A=
 github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=
 github.com/smartystreets/goconvey v0.0.0-20190330032615-68dc04aab96a/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=
 github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM=
@@ -761,7 +719,6 @@ github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81P
 github.com/stretchr/testify v1.6.1 h1:hDPOHmpOpP40lSULcqw7IrRb/u7w6RpDC9399XyoNd0=
 github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
 github.com/syndtr/gocapability v0.0.0-20170704070218-db04d3cc01c8/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww=
-github.com/syndtr/gocapability v0.0.0-20180916011248-d98352740cb2 h1:b6uOv7YOFK0TYG7HtkIgExQo+2RdLuwRft63jn2HWj8=
 github.com/syndtr/gocapability v0.0.0-20180916011248-d98352740cb2/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww=
 github.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww=
 github.com/tchap/go-patricia v2.2.6+incompatible/go.mod h1:bmLyhP68RS6kStMGxByiQ23RP/odRBOTVjwp2cDyi6I=
@@ -777,12 +734,10 @@ github.com/urfave/cli v1.22.2 h1:gsqYFH8bb9ekPA12kRo0hfjngWQjkJPlN9R0N78BoUo=
 github.com/urfave/cli v1.22.2/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0=
 github.com/vektah/gqlparser v1.1.2/go.mod h1:1ycwN7Ij5njmMkPPAOaRFY4rET2Enx7IkVv3vaXspKw=
 github.com/vishvananda/netlink v0.0.0-20181108222139-023a6dafdcdf/go.mod h1:+SR5DhBJrl6ZM7CoCKvpw5BKroDKQ+PJqOg65H/2ktk=
-github.com/vishvananda/netlink v1.1.0 h1:1iyaYNBLmP6L0220aDnYQpo1QEV4t4hJ+xEEhhJH8j0=
 github.com/vishvananda/netlink v1.1.0/go.mod h1:cTgwzPIzzgDAYoQrMm0EdrjRUBkTqKYppBueQtXaqoE=
 github.com/vishvananda/netlink v1.1.1-0.20201029203352-d40f9887b852 h1:cPXZWzzG0NllBLdjWoD1nDfaqu98YMv+OneaKc8sPOA=
 github.com/vishvananda/netlink v1.1.1-0.20201029203352-d40f9887b852/go.mod h1:twkDnbuQxJYemMlGd4JFIcuhgX83tXhKS2B/PRMpOho=
 github.com/vishvananda/netns v0.0.0-20180720170159-13995c7128cc/go.mod h1:ZjcWmFBXmLKZu9Nxj3WKYEafiSqer2rnvPr0en9UNpI=
-github.com/vishvananda/netns v0.0.0-20191106174202-0a2b9b5464df h1:OviZH7qLw/7ZovXvuNyL3XQl8UFofeikI1NW1Gypu7k=
 github.com/vishvananda/netns v0.0.0-20191106174202-0a2b9b5464df/go.mod h1:JP3t17pCcGlemwknint6hfoeCVQrEMVwxRLRjXpq+BU=
 github.com/vishvananda/netns v0.0.0-20200728191858-db3c7e526aae h1:4hwBBUfQCFe3Cym0ZtKyq7L16eZUtYKs+BaHDN6mAns=
 github.com/vishvananda/netns v0.0.0-20200728191858-db3c7e526aae/go.mod h1:DD4vA1DwXk04H54A1oHXtwZmA0grkVMdPxx/VGLCah0=
@@ -802,7 +757,6 @@ github.com/yvasiyarov/go-metrics v0.0.0-20140926110328-57bccd1ccd43/go.mod h1:aX
 github.com/yvasiyarov/gorelic v0.0.0-20141212073537-a9bba5b9ab50/go.mod h1:NUSPSUX/bi6SeDMUh6brw0nXpxHnc96TguQh0+r/ssA=
 github.com/yvasiyarov/newrelic_platform_go v0.0.0-20140908184405-b21fdbd4370f/go.mod h1:GlGEuHIJweS1mbCqG+7vt2nvWLzLLnRHbXz5JKd/Qbg=
 go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU=
-go.etcd.io/bbolt v1.3.3 h1:MUGmc65QhB3pIlaQ5bB4LwqSj6GIonVJXpZiaKNyaKk=
 go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU=
 go.etcd.io/bbolt v1.3.5 h1:XAzx9gjCb0Rxj7EoqcClPD1d5ZBxZJk0jbuoPHenBt0=
 go.etcd.io/bbolt v1.3.5/go.mod h1:G5EMThwa9y8QZGBClrRx5EY+Yw9kAhnjy3bSjsnlVTQ=
@@ -815,7 +769,6 @@ go.mongodb.org/mongo-driver v1.4.2 h1:WlnEglfTg/PfPq4WXs2Vkl/5ICC6hoG8+r+LraPmGk
 go.mongodb.org/mongo-driver v1.4.2/go.mod h1:WcMNYLx/IlOxLe6JRJiv2uXuCz6zBLndR4SoGjYphSc=
 go.mozilla.org/pkcs7 v0.0.0-20200128120323-432b2356ecb1/go.mod h1:SNgMg+EgDFwmvSmLRTNKC5fegJjB7v23qTQ0XLGUNHk=
 go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU=
-go.opencensus.io v0.22.0 h1:C9hSCOW830chIVkdja34wa6Ky+IzWllkUinR+BtRZd4=
 go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8=
 go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
 go.opencensus.io v0.22.3 h1:8sGtKOrtQqkN1bp2AtX+misvLIlOmsEsNd+9NIcPEm8=
@@ -835,7 +788,6 @@ golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8U
 golang.org/x/crypto v0.0.0-20190530122614-20be4c3c3ed5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
 golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
 golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
-golang.org/x/crypto v0.0.0-20190617133340-57b3e21c3d56 h1:ZpKuNIejY8P0ExLOVyKhb0WsgG8UdvHXe6TWjY7eL6k=
 golang.org/x/crypto v0.0.0-20190617133340-57b3e21c3d56/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
 golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
 golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
@@ -902,7 +854,6 @@ golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLL
 golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
 golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
 golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
-golang.org/x/net v0.0.0-20200602114024-627f9648deb9 h1:pNX+40auqi2JqRfOP1akLGtYcn15TUbkhwuCO3foqqM=
 golang.org/x/net v0.0.0-20200602114024-627f9648deb9/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
 golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
 golang.org/x/net v0.0.0-20201006153459-a7d1128ccaa0/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
@@ -922,7 +873,6 @@ golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJ
 golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sync v0.0.0-20190412183630-56d357773e84/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
-golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e h1:vcxGaoTs7kV8m5Np9uUNQin4BrLOthgV7252N8V+FwY=
 golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
@@ -988,7 +938,6 @@ golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7w
 golang.org/x/sys v0.0.0-20201112073958-5cba982894dd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20201117170446-d9b008d0a637/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3 h1:kzM6+9dur93BcC2kVlYl34cHU+TYZLanmpSJHVMmL64=
 golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20201202213521-69691e467435/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
@@ -999,7 +948,6 @@ golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fq
 golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
 golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
 golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
-golang.org/x/text v0.3.3 h1:cokOdA+Jmi5PJGXLlLllQSgYigAEfHXJAERHVMaCc2k=
 golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
 golang.org/x/text v0.3.4 h1:0YWbFKbhXG/wIiuHDSKpS0Iy7FSA+u45VtBMfQcFTTc=
 golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
@@ -1051,7 +999,6 @@ golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roY
 golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
 golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
 golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
-golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4=
 golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
 golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE=
 golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
@@ -1075,7 +1022,6 @@ google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63 h1:YzfoEYWbODU5Fbt
 google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
 google.golang.org/grpc v1.27.1 h1:zvIju4sqAGvwKspUQOhwnpcqSbzi7/H6QomNNjTL4sk=
 google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
-google.golang.org/protobuf v1.25.0 h1:Ejskq+SyPohKW+1uil0JJMtmHCgJPJ/qWTxr8qp+R4c=
 google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=
 gopkg.in/airbrake/gobrake.v2 v2.0.9/go.mod h1:/h5ZAUhDkGaJfjzjKLSjv6zCL6O0LLBxU4K+aSYdM/U=
 gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=
@@ -1103,7 +1049,6 @@ gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
 gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
 gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
 gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
-gopkg.in/yaml.v2 v2.3.0 h1:clyUAQHOM3G0M3f5vQj7LuJrETvjVot3Z5el9nffUtU=
 gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
 gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
 gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
diff --git a/proto/firecracker.pb.go b/proto/firecracker.pb.go
index b2f1536..4cd8c2f 100644
--- a/proto/firecracker.pb.go
+++ b/proto/firecracker.pb.go
@@ -68,14 +68,15 @@ type CreateVMRequest struct {
 	// 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"`
 	// Whether the VM should exit after all tasks running in it have been deleted.
-	ExitAfterAllTasksDeleted bool          `protobuf:"varint,9,opt,name=ExitAfterAllTasksDeleted,json=exitAfterAllTasksDeleted,proto3" json:"ExitAfterAllTasksDeleted,omitempty"`
-	JailerConfig             *JailerConfig `protobuf:"bytes,10,opt,name=JailerConfig,json=jailerConfig,proto3" json:"JailerConfig,omitempty"`
-	TimeoutSeconds           uint32        `protobuf:"varint,11,opt,name=TimeoutSeconds,json=timeoutSeconds,proto3" json:"TimeoutSeconds,omitempty"`
-	LogFifoPath              string        `protobuf:"bytes,12,opt,name=LogFifoPath,json=logFifoPath,proto3" json:"LogFifoPath,omitempty"`
-	MetricsFifoPath          string        `protobuf:"bytes,13,opt,name=MetricsFifoPath,json=metricsFifoPath,proto3" json:"MetricsFifoPath,omitempty"`
-	XXX_NoUnkeyedLiteral     struct{}      `json:"-"`
-	XXX_unrecognized         []byte        `json:"-"`
-	XXX_sizecache            int32         `json:"-"`
+	ExitAfterAllTasksDeleted bool                      `protobuf:"varint,9,opt,name=ExitAfterAllTasksDeleted,json=exitAfterAllTasksDeleted,proto3" json:"ExitAfterAllTasksDeleted,omitempty"`
+	JailerConfig             *JailerConfig             `protobuf:"bytes,10,opt,name=JailerConfig,json=jailerConfig,proto3" json:"JailerConfig,omitempty"`
+	TimeoutSeconds           uint32                    `protobuf:"varint,11,opt,name=TimeoutSeconds,json=timeoutSeconds,proto3" json:"TimeoutSeconds,omitempty"`
+	LogFifoPath              string                    `protobuf:"bytes,12,opt,name=LogFifoPath,json=logFifoPath,proto3" json:"LogFifoPath,omitempty"`
+	MetricsFifoPath          string                    `protobuf:"bytes,13,opt,name=MetricsFifoPath,json=metricsFifoPath,proto3" json:"MetricsFifoPath,omitempty"`
+	BalloonDevice            *FirecrackerBalloonDevice `protobuf:"bytes,14,opt,name=BalloonDevice,json=balloonDevice,proto3" json:"BalloonDevice,omitempty"`
+	XXX_NoUnkeyedLiteral     struct{}                  `json:"-"`
+	XXX_unrecognized         []byte                    `json:"-"`
+	XXX_sizecache            int32                     `json:"-"`
 }
 
 func (m *CreateVMRequest) Reset()         { *m = CreateVMRequest{} }
@@ -193,6 +194,13 @@ func (m *CreateVMRequest) GetMetricsFifoPath() string {
 	return ""
 }
 
+func (m *CreateVMRequest) GetBalloonDevice() *FirecrackerBalloonDevice {
+	if m != nil {
+		return m.BalloonDevice
+	}
+	return nil
+}
+
 type CreateVMResponse struct {
 	VMID                 string   `protobuf:"bytes,1,opt,name=VMID,json=vMID,proto3" json:"VMID,omitempty"`
 	SocketPath           string   `protobuf:"bytes,2,opt,name=SocketPath,json=socketPath,proto3" json:"SocketPath,omitempty"`
@@ -770,6 +778,369 @@ func (m *JailerConfig) GetDriveExposePolicy() DriveExposePolicy {
 	return DriveExposePolicy_COPY
 }
 
+type UpdateBalloonRequest struct {
+	VMID                 string   `protobuf:"bytes,1,opt,name=VMID,json=vMID,proto3" json:"VMID,omitempty"`
+	AmountMib            int64    `protobuf:"varint,2,opt,name=AmountMib,json=amountMib,proto3" json:"AmountMib,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *UpdateBalloonRequest) Reset()         { *m = UpdateBalloonRequest{} }
+func (m *UpdateBalloonRequest) String() string { return proto.CompactTextString(m) }
+func (*UpdateBalloonRequest) ProtoMessage()    {}
+func (*UpdateBalloonRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_a73317e9fb8da571, []int{12}
+}
+func (m *UpdateBalloonRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_UpdateBalloonRequest.Unmarshal(m, b)
+}
+func (m *UpdateBalloonRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_UpdateBalloonRequest.Marshal(b, m, deterministic)
+}
+func (m *UpdateBalloonRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_UpdateBalloonRequest.Merge(m, src)
+}
+func (m *UpdateBalloonRequest) XXX_Size() int {
+	return xxx_messageInfo_UpdateBalloonRequest.Size(m)
+}
+func (m *UpdateBalloonRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_UpdateBalloonRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_UpdateBalloonRequest proto.InternalMessageInfo
+
+func (m *UpdateBalloonRequest) GetVMID() string {
+	if m != nil {
+		return m.VMID
+	}
+	return ""
+}
+
+func (m *UpdateBalloonRequest) GetAmountMib() int64 {
+	if m != nil {
+		return m.AmountMib
+	}
+	return 0
+}
+
+type GetBalloonConfigRequest 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 *GetBalloonConfigRequest) Reset()         { *m = GetBalloonConfigRequest{} }
+func (m *GetBalloonConfigRequest) String() string { return proto.CompactTextString(m) }
+func (*GetBalloonConfigRequest) ProtoMessage()    {}
+func (*GetBalloonConfigRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_a73317e9fb8da571, []int{13}
+}
+func (m *GetBalloonConfigRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_GetBalloonConfigRequest.Unmarshal(m, b)
+}
+func (m *GetBalloonConfigRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_GetBalloonConfigRequest.Marshal(b, m, deterministic)
+}
+func (m *GetBalloonConfigRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_GetBalloonConfigRequest.Merge(m, src)
+}
+func (m *GetBalloonConfigRequest) XXX_Size() int {
+	return xxx_messageInfo_GetBalloonConfigRequest.Size(m)
+}
+func (m *GetBalloonConfigRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_GetBalloonConfigRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_GetBalloonConfigRequest proto.InternalMessageInfo
+
+func (m *GetBalloonConfigRequest) GetVMID() string {
+	if m != nil {
+		return m.VMID
+	}
+	return ""
+}
+
+type GetBalloonConfigResponse struct {
+	BalloonConfig        *FirecrackerBalloonDevice `protobuf:"bytes,1,opt,name=BalloonConfig,json=balloonConfig,proto3" json:"BalloonConfig,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}                  `json:"-"`
+	XXX_unrecognized     []byte                    `json:"-"`
+	XXX_sizecache        int32                     `json:"-"`
+}
+
+func (m *GetBalloonConfigResponse) Reset()         { *m = GetBalloonConfigResponse{} }
+func (m *GetBalloonConfigResponse) String() string { return proto.CompactTextString(m) }
+func (*GetBalloonConfigResponse) ProtoMessage()    {}
+func (*GetBalloonConfigResponse) Descriptor() ([]byte, []int) {
+	return fileDescriptor_a73317e9fb8da571, []int{14}
+}
+func (m *GetBalloonConfigResponse) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_GetBalloonConfigResponse.Unmarshal(m, b)
+}
+func (m *GetBalloonConfigResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_GetBalloonConfigResponse.Marshal(b, m, deterministic)
+}
+func (m *GetBalloonConfigResponse) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_GetBalloonConfigResponse.Merge(m, src)
+}
+func (m *GetBalloonConfigResponse) XXX_Size() int {
+	return xxx_messageInfo_GetBalloonConfigResponse.Size(m)
+}
+func (m *GetBalloonConfigResponse) XXX_DiscardUnknown() {
+	xxx_messageInfo_GetBalloonConfigResponse.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_GetBalloonConfigResponse proto.InternalMessageInfo
+
+func (m *GetBalloonConfigResponse) GetBalloonConfig() *FirecrackerBalloonDevice {
+	if m != nil {
+		return m.BalloonConfig
+	}
+	return nil
+}
+
+type GetBalloonStatsRequest 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 *GetBalloonStatsRequest) Reset()         { *m = GetBalloonStatsRequest{} }
+func (m *GetBalloonStatsRequest) String() string { return proto.CompactTextString(m) }
+func (*GetBalloonStatsRequest) ProtoMessage()    {}
+func (*GetBalloonStatsRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_a73317e9fb8da571, []int{15}
+}
+func (m *GetBalloonStatsRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_GetBalloonStatsRequest.Unmarshal(m, b)
+}
+func (m *GetBalloonStatsRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_GetBalloonStatsRequest.Marshal(b, m, deterministic)
+}
+func (m *GetBalloonStatsRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_GetBalloonStatsRequest.Merge(m, src)
+}
+func (m *GetBalloonStatsRequest) XXX_Size() int {
+	return xxx_messageInfo_GetBalloonStatsRequest.Size(m)
+}
+func (m *GetBalloonStatsRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_GetBalloonStatsRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_GetBalloonStatsRequest proto.InternalMessageInfo
+
+func (m *GetBalloonStatsRequest) GetVMID() string {
+	if m != nil {
+		return m.VMID
+	}
+	return ""
+}
+
+type GetBalloonStatsResponse struct {
+	// Actual amount of memory (in MiB) the device is holding.
+	ActualMib int64 `protobuf:"varint,1,opt,name=ActualMib,json=actualMib,proto3" json:"ActualMib,omitempty"`
+	// Actual number of pages the device is holding.
+	ActualPages int64 `protobuf:"varint,2,opt,name=ActualPages,json=actualPages,proto3" json:"ActualPages,omitempty"`
+	// An estimate of how much memory is available (in bytes) for starting new applications, without pushing the system to swap.
+	AvailableMemory int64 `protobuf:"varint,3,opt,name=AvailableMemory,json=availableMemory,proto3" json:"AvailableMemory,omitempty"`
+	// The amount of memory, in bytes, that can be quickly reclaimed without additional I/O.
+	// Typically these pages are used for caching files from disk.
+	DiskCaches int64 `protobuf:"varint,4,opt,name=DiskCaches,json=diskCaches,proto3" json:"DiskCaches,omitempty"`
+	// The amount of memory not being used for any purpose (in bytes).
+	FreeMemory int64 `protobuf:"varint,5,opt,name=FreeMemory,json=freeMemory,proto3" json:"FreeMemory,omitempty"`
+	// The number of successful hugetlb page allocations in the guest.
+	HugetlbAllocations int64 `protobuf:"varint,6,opt,name=HugetlbAllocations,json=hugetlbAllocations,proto3" json:"HugetlbAllocations,omitempty"`
+	// The number of failed hugetlb page allocations in the guest.
+	HugetlbFailures int64 `protobuf:"varint,7,opt,name=HugetlbFailures,json=hugetlbFailures,proto3" json:"HugetlbFailures,omitempty"`
+	// The number of major page faults that have occurred.
+	MajorFaults int64 `protobuf:"varint,8,opt,name=MajorFaults,json=majorFaults,proto3" json:"MajorFaults,omitempty"`
+	// The number of minor page faults that have occurred.
+	MinorFaults int64 `protobuf:"varint,9,opt,name=MinorFaults,json=minorFaults,proto3" json:"MinorFaults,omitempty"`
+	// The amount of memory that has been swapped in (in bytes).
+	SwapIn int64 `protobuf:"varint,10,opt,name=SwapIn,json=swapIn,proto3" json:"SwapIn,omitempty"`
+	// The amount of memory that has been swapped out to disk (in bytes).
+	SwapOut int64 `protobuf:"varint,11,opt,name=SwapOut,json=swapOut,proto3" json:"SwapOut,omitempty"`
+	// Target amount of memory (in MiB) the device aims to hold.
+	TargetMib int64 `protobuf:"varint,12,opt,name=TargetMib,json=targetMib,proto3" json:"TargetMib,omitempty"`
+	// Target number of pages the device aims to hold.
+	TargetPages int64 `protobuf:"varint,13,opt,name=TargetPages,json=targetPages,proto3" json:"TargetPages,omitempty"`
+	// The total amount of memory available (in bytes).
+	TotalMemory          int64    `protobuf:"varint,14,opt,name=TotalMemory,json=totalMemory,proto3" json:"TotalMemory,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *GetBalloonStatsResponse) Reset()         { *m = GetBalloonStatsResponse{} }
+func (m *GetBalloonStatsResponse) String() string { return proto.CompactTextString(m) }
+func (*GetBalloonStatsResponse) ProtoMessage()    {}
+func (*GetBalloonStatsResponse) Descriptor() ([]byte, []int) {
+	return fileDescriptor_a73317e9fb8da571, []int{16}
+}
+func (m *GetBalloonStatsResponse) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_GetBalloonStatsResponse.Unmarshal(m, b)
+}
+func (m *GetBalloonStatsResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_GetBalloonStatsResponse.Marshal(b, m, deterministic)
+}
+func (m *GetBalloonStatsResponse) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_GetBalloonStatsResponse.Merge(m, src)
+}
+func (m *GetBalloonStatsResponse) XXX_Size() int {
+	return xxx_messageInfo_GetBalloonStatsResponse.Size(m)
+}
+func (m *GetBalloonStatsResponse) XXX_DiscardUnknown() {
+	xxx_messageInfo_GetBalloonStatsResponse.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_GetBalloonStatsResponse proto.InternalMessageInfo
+
+func (m *GetBalloonStatsResponse) GetActualMib() int64 {
+	if m != nil {
+		return m.ActualMib
+	}
+	return 0
+}
+
+func (m *GetBalloonStatsResponse) GetActualPages() int64 {
+	if m != nil {
+		return m.ActualPages
+	}
+	return 0
+}
+
+func (m *GetBalloonStatsResponse) GetAvailableMemory() int64 {
+	if m != nil {
+		return m.AvailableMemory
+	}
+	return 0
+}
+
+func (m *GetBalloonStatsResponse) GetDiskCaches() int64 {
+	if m != nil {
+		return m.DiskCaches
+	}
+	return 0
+}
+
+func (m *GetBalloonStatsResponse) GetFreeMemory() int64 {
+	if m != nil {
+		return m.FreeMemory
+	}
+	return 0
+}
+
+func (m *GetBalloonStatsResponse) GetHugetlbAllocations() int64 {
+	if m != nil {
+		return m.HugetlbAllocations
+	}
+	return 0
+}
+
+func (m *GetBalloonStatsResponse) GetHugetlbFailures() int64 {
+	if m != nil {
+		return m.HugetlbFailures
+	}
+	return 0
+}
+
+func (m *GetBalloonStatsResponse) GetMajorFaults() int64 {
+	if m != nil {
+		return m.MajorFaults
+	}
+	return 0
+}
+
+func (m *GetBalloonStatsResponse) GetMinorFaults() int64 {
+	if m != nil {
+		return m.MinorFaults
+	}
+	return 0
+}
+
+func (m *GetBalloonStatsResponse) GetSwapIn() int64 {
+	if m != nil {
+		return m.SwapIn
+	}
+	return 0
+}
+
+func (m *GetBalloonStatsResponse) GetSwapOut() int64 {
+	if m != nil {
+		return m.SwapOut
+	}
+	return 0
+}
+
+func (m *GetBalloonStatsResponse) GetTargetMib() int64 {
+	if m != nil {
+		return m.TargetMib
+	}
+	return 0
+}
+
+func (m *GetBalloonStatsResponse) GetTargetPages() int64 {
+	if m != nil {
+		return m.TargetPages
+	}
+	return 0
+}
+
+func (m *GetBalloonStatsResponse) GetTotalMemory() int64 {
+	if m != nil {
+		return m.TotalMemory
+	}
+	return 0
+}
+
+type UpdateBalloonStatsRequest struct {
+	VMID                  string   `protobuf:"bytes,1,opt,name=VMID,json=vMID,proto3" json:"VMID,omitempty"`
+	StatsPollingIntervals int64    `protobuf:"varint,2,opt,name=StatsPollingIntervals,json=statsPollingIntervals,proto3" json:"StatsPollingIntervals,omitempty"`
+	XXX_NoUnkeyedLiteral  struct{} `json:"-"`
+	XXX_unrecognized      []byte   `json:"-"`
+	XXX_sizecache         int32    `json:"-"`
+}
+
+func (m *UpdateBalloonStatsRequest) Reset()         { *m = UpdateBalloonStatsRequest{} }
+func (m *UpdateBalloonStatsRequest) String() string { return proto.CompactTextString(m) }
+func (*UpdateBalloonStatsRequest) ProtoMessage()    {}
+func (*UpdateBalloonStatsRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_a73317e9fb8da571, []int{17}
+}
+func (m *UpdateBalloonStatsRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_UpdateBalloonStatsRequest.Unmarshal(m, b)
+}
+func (m *UpdateBalloonStatsRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_UpdateBalloonStatsRequest.Marshal(b, m, deterministic)
+}
+func (m *UpdateBalloonStatsRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_UpdateBalloonStatsRequest.Merge(m, src)
+}
+func (m *UpdateBalloonStatsRequest) XXX_Size() int {
+	return xxx_messageInfo_UpdateBalloonStatsRequest.Size(m)
+}
+func (m *UpdateBalloonStatsRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_UpdateBalloonStatsRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_UpdateBalloonStatsRequest proto.InternalMessageInfo
+
+func (m *UpdateBalloonStatsRequest) GetVMID() string {
+	if m != nil {
+		return m.VMID
+	}
+	return ""
+}
+
+func (m *UpdateBalloonStatsRequest) GetStatsPollingIntervals() int64 {
+	if m != nil {
+		return m.StatsPollingIntervals
+	}
+	return 0
+}
+
 func init() {
 	proto.RegisterEnum("DriveExposePolicy", DriveExposePolicy_name, DriveExposePolicy_value)
 	proto.RegisterType((*CreateVMRequest)(nil), "CreateVMRequest")
@@ -784,54 +1155,81 @@ func init() {
 	proto.RegisterType((*GetVMMetadataRequest)(nil), "GetVMMetadataRequest")
 	proto.RegisterType((*GetVMMetadataResponse)(nil), "GetVMMetadataResponse")
 	proto.RegisterType((*JailerConfig)(nil), "JailerConfig")
+	proto.RegisterType((*UpdateBalloonRequest)(nil), "UpdateBalloonRequest")
+	proto.RegisterType((*GetBalloonConfigRequest)(nil), "GetBalloonConfigRequest")
+	proto.RegisterType((*GetBalloonConfigResponse)(nil), "GetBalloonConfigResponse")
+	proto.RegisterType((*GetBalloonStatsRequest)(nil), "GetBalloonStatsRequest")
+	proto.RegisterType((*GetBalloonStatsResponse)(nil), "GetBalloonStatsResponse")
+	proto.RegisterType((*UpdateBalloonStatsRequest)(nil), "UpdateBalloonStatsRequest")
 }
 
 func init() { proto.RegisterFile("firecracker.proto", fileDescriptor_a73317e9fb8da571) }
 
 var fileDescriptor_a73317e9fb8da571 = []byte{
-	// 693 bytes of a gzipped FileDescriptorProto
-	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xd4, 0x55, 0xdf, 0x4f, 0xdb, 0x48,
-	0x10, 0x3e, 0x13, 0x07, 0x92, 0x31, 0xf9, 0xb5, 0x82, 0x3b, 0x0b, 0x9d, 0x90, 0x15, 0xdd, 0x71,
-	0x16, 0x0f, 0x91, 0x0e, 0x5e, 0x4e, 0xf7, 0x04, 0xc4, 0x80, 0x0c, 0x75, 0x1a, 0x6d, 0x08, 0x52,
-	0xfb, 0xe6, 0x3a, 0x93, 0xe0, 0x26, 0xf6, 0xa6, 0xbb, 0x6b, 0x0a, 0xff, 0x56, 0xfb, 0x9f, 0xf4,
-	0x9f, 0xe9, 0x6b, 0xe5, 0x4d, 0x48, 0x9c, 0x90, 0xa6, 0x48, 0x7d, 0xea, 0x53, 0x76, 0xbf, 0xf9,
-	0x66, 0xe6, 0xd3, 0x7c, 0xb3, 0x31, 0xd4, 0xfa, 0x21, 0xc7, 0x80, 0xfb, 0xc1, 0x10, 0x79, 0x63,
-	0xcc, 0x99, 0x64, 0x7b, 0x86, 0x7c, 0x1c, 0xa3, 0x98, 0x5c, 0xea, 0x5f, 0x75, 0xa8, 0x34, 0x39,
-	0xfa, 0x12, 0x6f, 0x3d, 0x8a, 0x1f, 0x12, 0x14, 0x92, 0x10, 0xd0, 0x6f, 0x3d, 0xd7, 0x31, 0x35,
-	0x4b, 0xb3, 0x8b, 0x54, 0xbf, 0xf7, 0x5c, 0x87, 0x9c, 0x00, 0x78, 0x7e, 0x70, 0x17, 0xc6, 0xd8,
-	0xec, 0x0f, 0xcc, 0x0d, 0x4b, 0xb3, 0x8d, 0x23, 0xab, 0x71, 0x31, 0x2f, 0xfe, 0x14, 0x65, 0x71,
-	0x3f, 0x1c, 0x24, 0xdc, 0x97, 0x21, 0x8b, 0x29, 0x44, 0xb3, 0x1c, 0x62, 0x43, 0xe5, 0x1a, 0x79,
-	0x8c, 0x23, 0x37, 0xf2, 0x07, 0xd8, 0xf6, 0xe5, 0x9d, 0x99, 0x53, 0x0d, 0x2a, 0xc3, 0x45, 0x98,
-	0xec, 0x03, 0x4c, 0x98, 0xa7, 0x7c, 0x20, 0x4c, 0x5d, 0x91, 0x60, 0x38, 0x43, 0xc8, 0x31, 0x14,
-	0x29, 0x63, 0xd2, 0xe1, 0xe1, 0x3d, 0x9a, 0x79, 0x25, 0x65, 0x37, 0x2b, 0x65, 0x16, 0xa4, 0x45,
-	0xfe, 0x74, 0x24, 0xff, 0x81, 0xa1, 0x0e, 0x1e, 0x4b, 0x62, 0x29, 0xcc, 0x4d, 0x2b, 0x67, 0x1b,
-	0x47, 0xbf, 0x67, 0xd3, 0xe6, 0x61, 0x6a, 0xf4, 0xe6, 0x54, 0x72, 0x05, 0xb5, 0x16, 0xca, 0x8f,
-	0x8c, 0x0f, 0xdd, 0x58, 0x22, 0xef, 0xfb, 0x01, 0x0a, 0x73, 0x4b, 0xe5, 0xff, 0x99, 0xcd, 0x5f,
-	0x26, 0xd1, 0x5a, 0xbc, 0x9c, 0x46, 0x0e, 0xa0, 0xdc, 0x64, 0xb1, 0xf4, 0xc3, 0x18, 0x79, 0x33,
-	0x2d, 0x6f, 0x16, 0x2c, 0xcd, 0xce, 0xd3, 0x72, 0xb0, 0x80, 0x92, 0xff, 0xc1, 0x3c, 0x7f, 0x08,
-	0xe5, 0x69, 0x5f, 0x22, 0x3f, 0x1d, 0x8d, 0x6e, 0x7c, 0x31, 0x14, 0x0e, 0x8e, 0x50, 0x62, 0xcf,
-	0x2c, 0x5a, 0x9a, 0x5d, 0xa0, 0x26, 0x7e, 0x27, 0x4e, 0xfe, 0x85, 0xed, 0x2b, 0x3f, 0x1c, 0xa5,
-	0xa5, 0x52, 0x2f, 0x4c, 0x50, 0x13, 0x2a, 0x35, 0xb2, 0x20, 0xdd, 0x7e, 0x9f, 0xb9, 0xa5, 0xb2,
-	0x6e, 0xc2, 0x08, 0x59, 0x22, 0x3b, 0x18, 0xb0, 0xb8, 0x27, 0x4c, 0xc3, 0xd2, 0xec, 0x12, 0x2d,
-	0xcb, 0x05, 0x94, 0x58, 0x60, 0xbc, 0x62, 0x83, 0x8b, 0xb0, 0xcf, 0x94, 0x7f, 0xdb, 0xca, 0x1a,
-	0x63, 0x34, 0x87, 0x52, 0x97, 0x3d, 0x94, 0x3c, 0x0c, 0xc4, 0x8c, 0x55, 0x9a, 0xb8, 0x1c, 0x2d,
-	0xc2, 0xf5, 0x4f, 0x1a, 0x54, 0xe7, 0x9b, 0x27, 0xc6, 0x2c, 0x16, 0xb8, 0x72, 0xf5, 0xf6, 0x01,
-	0x3a, 0x2c, 0x18, 0xa2, 0x54, 0xd5, 0x36, 0x26, 0xeb, 0x20, 0x66, 0xc8, 0xb2, 0xa8, 0xdc, 0x8b,
-	0x44, 0xe9, 0x2b, 0x45, 0xa5, 0xbd, 0x9a, 0x03, 0xce, 0x92, 0xb1, 0x22, 0xe5, 0x27, 0xbd, 0x82,
-	0x19, 0x52, 0xff, 0x0b, 0xca, 0x6d, 0x3f, 0x11, 0xeb, 0x1f, 0x4b, 0xfd, 0x6f, 0xa8, 0x50, 0x14,
-	0x49, 0xf4, 0x03, 0xda, 0x35, 0x94, 0x3a, 0x92, 0x8d, 0xd7, 0x3f, 0xbc, 0xe7, 0xd6, 0x6c, 0xac,
-	0xb2, 0xa6, 0x7e, 0x00, 0xd5, 0x4b, 0x94, 0xb7, 0x9e, 0x1b, 0xf7, 0xd9, 0xba, 0xa6, 0x9f, 0x35,
-	0xa8, 0x65, 0x88, 0xbf, 0xc8, 0xdc, 0x2f, 0x60, 0xa7, 0x93, 0x8a, 0xf6, 0x50, 0xfa, 0x3d, 0x5f,
-	0xfa, 0xeb, 0x26, 0xb6, 0x07, 0x85, 0x27, 0xda, 0x54, 0x75, 0x21, 0x9a, 0xde, 0xeb, 0x2e, 0xfc,
-	0xd1, 0x1d, 0xf7, 0xd4, 0xce, 0xfd, 0x6c, 0xa9, 0x43, 0xd8, 0xb9, 0x7c, 0xa1, 0xa4, 0xfa, 0x31,
-	0xec, 0x2e, 0x71, 0xa7, 0x73, 0xcf, 0x36, 0xd0, 0x96, 0x1a, 0x7c, 0xd1, 0x16, 0x1f, 0x32, 0xd9,
-	0x81, 0x7c, 0x0b, 0x65, 0xab, 0x33, 0x65, 0xe6, 0xe3, 0xf4, 0x92, 0xf6, 0x6b, 0xb6, 0xbb, 0x62,
-	0xaa, 0x4f, 0x0f, 0xda, 0x5d, 0x91, 0x62, 0x1e, 0x46, 0x62, 0xea, 0x89, 0x1e, 0x61, 0x24, 0x48,
-	0x15, 0x72, 0x5d, 0xd7, 0x51, 0x06, 0x94, 0x68, 0x2e, 0x71, 0x9d, 0x14, 0xb9, 0x74, 0x1d, 0x35,
-	0xed, 0x12, 0xcd, 0x0d, 0x26, 0x96, 0x67, 0x6c, 0xd8, 0x5c, 0xb6, 0x81, 0x9c, 0x40, 0x4d, 0xfd,
-	0x4b, 0x9e, 0x3f, 0x8c, 0x99, 0xc0, 0x36, 0x1b, 0x85, 0xc1, 0xa3, 0xb9, 0x65, 0x69, 0x76, 0xf9,
-	0x88, 0x34, 0x9e, 0x45, 0x68, 0xad, 0xb7, 0x0c, 0x1d, 0xfe, 0xb3, 0xa2, 0x02, 0x29, 0x80, 0xde,
-	0x7c, 0xdd, 0x7e, 0x53, 0xfd, 0x2d, 0x3d, 0x9d, 0xb9, 0x2d, 0xa7, 0xaa, 0x9d, 0x6d, 0xbd, 0xcd,
-	0xab, 0x2f, 0xd4, 0xbb, 0x4d, 0xf5, 0x73, 0xfc, 0x2d, 0x00, 0x00, 0xff, 0xff, 0x9a, 0x74, 0xd8,
-	0x91, 0xca, 0x06, 0x00, 0x00,
+	// 1032 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xd4, 0x56, 0xdf, 0x6e, 0xdb, 0xb6,
+	0x17, 0xfe, 0xa9, 0xb2, 0x93, 0xf8, 0x38, 0x76, 0x62, 0x22, 0x69, 0xd5, 0xa2, 0x08, 0x0c, 0xe1,
+	0xb7, 0xce, 0x28, 0xb6, 0x00, 0x4b, 0x76, 0x31, 0xec, 0x66, 0x75, 0xec, 0x3a, 0x55, 0x3b, 0xa5,
+	0x06, 0x9d, 0x04, 0xd8, 0x76, 0xc5, 0xc8, 0xc7, 0x8a, 0x6a, 0x49, 0xf4, 0x44, 0x2a, 0x6d, 0x5e,
+	0x6b, 0xbb, 0xd9, 0x73, 0xec, 0x5d, 0x76, 0x3f, 0x90, 0x92, 0x2d, 0xd9, 0xc9, 0xdc, 0x00, 0xbb,
+	0xda, 0x95, 0xcd, 0xef, 0x7c, 0xe4, 0xf9, 0xf3, 0x1d, 0x1e, 0x0a, 0x5a, 0x93, 0x20, 0x41, 0x2f,
+	0x61, 0xde, 0x14, 0x93, 0xc3, 0x59, 0xc2, 0x25, 0x7f, 0x56, 0x97, 0xb7, 0x33, 0x14, 0xd9, 0xc2,
+	0xfe, 0xa3, 0x0a, 0x3b, 0xbd, 0x04, 0x99, 0xc4, 0x4b, 0x97, 0xe2, 0xaf, 0x29, 0x0a, 0x49, 0x08,
+	0x54, 0x2e, 0x5d, 0xa7, 0x6f, 0x19, 0x6d, 0xa3, 0x53, 0xa3, 0x95, 0x1b, 0xd7, 0xe9, 0x93, 0x57,
+	0x00, 0x2e, 0xf3, 0xae, 0x83, 0x18, 0x7b, 0x13, 0xdf, 0x7a, 0xd4, 0x36, 0x3a, 0xf5, 0xa3, 0xf6,
+	0xe1, 0xa0, 0x38, 0x7c, 0x6e, 0xe5, 0xf1, 0x24, 0xf0, 0xd3, 0x84, 0xc9, 0x80, 0xc7, 0x14, 0xa2,
+	0xc5, 0x1e, 0xd2, 0x81, 0x9d, 0x77, 0x98, 0xc4, 0x18, 0x3a, 0x11, 0xf3, 0x71, 0xc8, 0xe4, 0xb5,
+	0x65, 0x6a, 0x07, 0x3b, 0xd3, 0x65, 0x98, 0x1c, 0x00, 0x64, 0xcc, 0x6e, 0xe2, 0x0b, 0xab, 0xa2,
+	0x49, 0x30, 0x5d, 0x20, 0xe4, 0x18, 0x6a, 0x94, 0x73, 0xd9, 0x4f, 0x82, 0x1b, 0xb4, 0xaa, 0x3a,
+	0x94, 0xfd, 0x72, 0x28, 0x0b, 0x23, 0xad, 0x25, 0xf3, 0xbf, 0xe4, 0x3b, 0xa8, 0xeb, 0x3f, 0x2e,
+	0x4f, 0x63, 0x29, 0xac, 0x8d, 0xb6, 0xd9, 0xa9, 0x1f, 0x3d, 0x2e, 0x6f, 0x2b, 0xcc, 0xb4, 0x3e,
+	0x2e, 0xa8, 0xe4, 0x2d, 0xb4, 0xce, 0x50, 0x7e, 0xe4, 0xc9, 0xd4, 0x89, 0x25, 0x26, 0x13, 0xe6,
+	0xa1, 0xb0, 0x36, 0xf5, 0xfe, 0xe7, 0xe5, 0xfd, 0xab, 0x24, 0xda, 0x8a, 0x57, 0xb7, 0x91, 0x17,
+	0xd0, 0xec, 0xf1, 0x58, 0xb2, 0x20, 0xc6, 0xa4, 0xa7, 0x8e, 0xb7, 0xb6, 0xda, 0x46, 0xa7, 0x4a,
+	0x9b, 0xde, 0x12, 0x4a, 0xbe, 0x07, 0xeb, 0xf5, 0xa7, 0x40, 0x76, 0x27, 0x12, 0x93, 0x6e, 0x18,
+	0x9e, 0x33, 0x31, 0x15, 0x7d, 0x0c, 0x51, 0xe2, 0xd8, 0xaa, 0xb5, 0x8d, 0xce, 0x16, 0xb5, 0xf0,
+	0x1f, 0xec, 0xe4, 0x1b, 0xd8, 0x7e, 0xcb, 0x82, 0x50, 0x1d, 0xa5, 0xb4, 0xb0, 0x40, 0x57, 0xa8,
+	0x71, 0x58, 0x06, 0xe9, 0xf6, 0x87, 0xd2, 0x4a, 0x85, 0x75, 0x1e, 0x44, 0xc8, 0x53, 0x39, 0x42,
+	0x8f, 0xc7, 0x63, 0x61, 0xd5, 0xdb, 0x46, 0xa7, 0x41, 0x9b, 0x72, 0x09, 0x25, 0x6d, 0xa8, 0xff,
+	0xc8, 0xfd, 0x41, 0x30, 0xe1, 0x5a, 0xbf, 0x6d, 0x2d, 0x4d, 0x3d, 0x2c, 0x20, 0xa5, 0xb2, 0x8b,
+	0x32, 0x09, 0x3c, 0xb1, 0x60, 0x35, 0x32, 0x95, 0xa3, 0x65, 0x98, 0xfc, 0x00, 0x8d, 0x13, 0x16,
+	0x86, 0x9c, 0xc7, 0x7d, 0xbc, 0x09, 0x3c, 0xb4, 0x9a, 0x3a, 0xce, 0xa7, 0xe5, 0x92, 0x2e, 0x11,
+	0x68, 0xe3, 0xaa, 0xbc, 0xb4, 0x7f, 0x33, 0x60, 0xb7, 0x68, 0x5d, 0x31, 0xe3, 0xb1, 0xc0, 0x7b,
+	0x7b, 0xf7, 0x00, 0x60, 0xc4, 0xbd, 0x29, 0x4a, 0x1d, 0xce, 0xa3, 0xac, 0x9f, 0xc4, 0x02, 0x59,
+	0xcd, 0xca, 0x7c, 0x50, 0x56, 0x95, 0xfb, 0xb3, 0x3a, 0x00, 0xe8, 0xf9, 0x09, 0x4f, 0x67, 0x9a,
+	0x54, 0xcd, 0x7c, 0x79, 0x0b, 0xc4, 0xfe, 0x3f, 0x34, 0x87, 0x2c, 0x15, 0xeb, 0x6f, 0x9b, 0xfd,
+	0x05, 0xec, 0x50, 0x14, 0x69, 0xf4, 0x19, 0xda, 0x3b, 0x68, 0x8c, 0x24, 0x9f, 0xad, 0xbf, 0xb9,
+	0x77, 0xb5, 0x7d, 0x74, 0x9f, 0xb6, 0xf6, 0x0b, 0xd8, 0x3d, 0x45, 0x79, 0xe9, 0x3a, 0xf1, 0x84,
+	0xaf, 0x73, 0xfa, 0xbb, 0x01, 0xad, 0x12, 0xf1, 0x3f, 0x52, 0xf7, 0x01, 0xec, 0x8d, 0x54, 0xd0,
+	0x2e, 0x4a, 0x36, 0x66, 0x92, 0xad, 0xab, 0xd8, 0x33, 0xd8, 0x9a, 0xd3, 0xf2, 0xa8, 0xb7, 0xa2,
+	0x7c, 0x6d, 0x3b, 0xf0, 0xe4, 0x62, 0x36, 0xd6, 0x3d, 0xf7, 0x6f, 0x8f, 0x7a, 0x09, 0x7b, 0xa7,
+	0x0f, 0x0c, 0xc9, 0x3e, 0x86, 0xfd, 0x15, 0x6e, 0x5e, 0xf7, 0xb2, 0x03, 0x63, 0xc5, 0xc1, 0x9f,
+	0xc6, 0xf2, 0x24, 0x20, 0x7b, 0x50, 0x3d, 0x43, 0x79, 0x36, 0xca, 0x99, 0xd5, 0x58, 0x2d, 0x94,
+	0xbf, 0xde, 0xf0, 0x42, 0xe4, 0xf1, 0x55, 0xbc, 0xe1, 0x85, 0x50, 0x98, 0x8b, 0x91, 0xc8, 0x35,
+	0xa9, 0x44, 0x18, 0x09, 0xb2, 0x0b, 0xe6, 0x85, 0xd3, 0xd7, 0x02, 0x34, 0xa8, 0x99, 0x3a, 0x7d,
+	0x85, 0x9c, 0x3a, 0x7d, 0x5d, 0xed, 0x06, 0x35, 0xfd, 0x4c, 0xf2, 0x92, 0x0c, 0x1b, 0xab, 0x32,
+	0x90, 0x57, 0xd0, 0xd2, 0x63, 0xf6, 0xf5, 0xa7, 0x19, 0x17, 0x38, 0xe4, 0x61, 0xe0, 0xdd, 0x5a,
+	0x9b, 0x6d, 0xa3, 0xd3, 0x3c, 0x22, 0x87, 0x77, 0x2c, 0xb4, 0x35, 0x5e, 0x85, 0xec, 0x37, 0xb0,
+	0x97, 0x09, 0x90, 0xcf, 0x86, 0x75, 0xd5, 0x7f, 0x0e, 0xb5, 0x6e, 0xa4, 0xe6, 0xa9, 0x1b, 0x5c,
+	0xe9, 0xf4, 0x4c, 0x5a, 0x63, 0x73, 0xc0, 0xfe, 0x1a, 0x9e, 0x9c, 0xa2, 0xcc, 0x8f, 0xc9, 0xc7,
+	0xe2, 0x1a, 0x09, 0x7e, 0x01, 0xeb, 0x2e, 0x3d, 0x57, 0xa1, 0x98, 0x65, 0xf9, 0xcc, 0x35, 0x1e,
+	0x3a, 0xcb, 0x32, 0xbe, 0xfd, 0x15, 0x3c, 0x2e, 0x0e, 0x1f, 0x49, 0x26, 0xc5, 0xba, 0x50, 0xfe,
+	0x32, 0xcb, 0xa1, 0xe7, 0xf4, 0x3c, 0x14, 0x95, 0xb3, 0x27, 0x53, 0x16, 0xaa, 0x9c, 0x8d, 0x3c,
+	0xe7, 0x39, 0xa0, 0xae, 0x5c, 0x66, 0x1d, 0x32, 0x1f, 0x45, 0x5e, 0x93, 0x3a, 0x2b, 0x20, 0x75,
+	0xe5, 0xba, 0x37, 0x2c, 0x08, 0xd9, 0x55, 0x88, 0x2e, 0x46, 0x3c, 0xb9, 0xd5, 0x4d, 0x60, 0xd2,
+	0x1d, 0xb6, 0x0c, 0x2b, 0xad, 0xfb, 0x81, 0x98, 0xf6, 0x98, 0x77, 0x8d, 0xd9, 0x33, 0x6d, 0x52,
+	0x18, 0x2f, 0x10, 0x65, 0x1f, 0x24, 0x38, 0x3f, 0xa4, 0x9a, 0xd9, 0x27, 0x0b, 0x84, 0x1c, 0x02,
+	0x79, 0x93, 0xfa, 0x28, 0xc3, 0xab, 0x6e, 0x18, 0x72, 0x4f, 0x7f, 0x31, 0x08, 0xdd, 0x33, 0x26,
+	0x25, 0xd7, 0x77, 0x2c, 0x2a, 0xb2, 0x9c, 0x3f, 0x60, 0x41, 0x98, 0x26, 0xfa, 0x15, 0xd6, 0x91,
+	0x5d, 0x2f, 0xc3, 0x2a, 0x4b, 0x97, 0x7d, 0xe0, 0xc9, 0x80, 0xa5, 0xa1, 0x14, 0xfa, 0x89, 0x35,
+	0x69, 0x3d, 0x2a, 0x20, 0xcd, 0x08, 0xe2, 0x05, 0xa3, 0x96, 0x33, 0x0a, 0x88, 0x3c, 0x86, 0x8d,
+	0xd1, 0x47, 0x36, 0x73, 0x62, 0xfd, 0x7e, 0x9a, 0x74, 0x43, 0xe8, 0x15, 0xb1, 0x60, 0x53, 0xe1,
+	0xef, 0x53, 0xa9, 0xdf, 0x48, 0x93, 0x6e, 0x8a, 0x6c, 0xa9, 0x2a, 0x7f, 0xce, 0x12, 0x1f, 0x75,
+	0xb7, 0x6d, 0x67, 0x95, 0x97, 0x73, 0x40, 0x79, 0xcc, 0xac, 0x59, 0xe5, 0x1b, 0x99, 0x47, 0x59,
+	0x40, 0x9a, 0xc1, 0x25, 0x0b, 0xf3, 0x82, 0x35, 0x73, 0x46, 0x01, 0xd9, 0x08, 0x4f, 0x97, 0x7a,
+	0xff, 0x73, 0x8d, 0x42, 0xbe, 0x85, 0x7d, 0xcd, 0x19, 0xf2, 0x30, 0x0c, 0x62, 0x5f, 0x7f, 0x88,
+	0xdc, 0xb0, 0x70, 0x2e, 0xfc, 0xbe, 0xb8, 0xcf, 0xf8, 0xf2, 0xcb, 0x7b, 0x2e, 0x29, 0xd9, 0x82,
+	0x4a, 0xef, 0xfd, 0xf0, 0xa7, 0xdd, 0xff, 0xa9, 0x7f, 0x27, 0xce, 0x59, 0x7f, 0xd7, 0x38, 0xd9,
+	0xfc, 0xb9, 0xaa, 0xbf, 0x22, 0xaf, 0x36, 0xf4, 0xcf, 0xf1, 0xdf, 0x01, 0x00, 0x00, 0xff, 0xff,
+	0x28, 0xec, 0xce, 0x6b, 0x6e, 0x0a, 0x00, 0x00,
 }
diff --git a/proto/firecracker.proto b/proto/firecracker.proto
index f077234..7d42aef 100644
--- a/proto/firecracker.proto
+++ b/proto/firecracker.proto
@@ -39,6 +39,8 @@ message CreateVMRequest {
 
     string LogFifoPath = 12;
     string MetricsFifoPath = 13;
+
+    FirecrackerBalloonDevice BalloonDevice = 14;
 }
 
 message CreateVMResponse {
@@ -135,3 +137,69 @@ message JailerConfig {
     DriveExposePolicy DriveExposePolicy = 7;
 }
 
+message UpdateBalloonRequest {
+    string VMID = 1;
+    int64 AmountMib = 2;
+}
+
+message GetBalloonConfigRequest {
+    string VMID = 1;
+}
+
+message GetBalloonConfigResponse {
+    FirecrackerBalloonDevice BalloonConfig = 1;
+}
+
+message GetBalloonStatsRequest {
+    string VMID = 1;
+}
+
+message GetBalloonStatsResponse {
+    // Actual amount of memory (in MiB) the device is holding.
+    int64 ActualMib = 1;
+
+    // Actual number of pages the device is holding.
+    int64 ActualPages = 2; 
+
+    // An estimate of how much memory is available (in bytes) for starting new applications, without pushing the system to swap.
+    int64 AvailableMemory = 3;  
+
+    // The amount of memory, in bytes, that can be quickly reclaimed without additional I/O. 
+    // Typically these pages are used for caching files from disk.
+    int64 DiskCaches = 4;
+
+    // The amount of memory not being used for any purpose (in bytes).
+    int64 FreeMemory = 5; 
+
+    // The number of successful hugetlb page allocations in the guest.
+    int64 HugetlbAllocations = 6; 	
+
+    // The number of failed hugetlb page allocations in the guest.
+    int64 HugetlbFailures = 7; 	
+
+    // The number of major page faults that have occurred.
+    int64 MajorFaults = 8; 
+    
+    // The number of minor page faults that have occurred.
+    int64 MinorFaults = 9; 
+
+    // The amount of memory that has been swapped in (in bytes).
+    int64 SwapIn = 10; 	
+
+    // The amount of memory that has been swapped out to disk (in bytes).
+    int64 SwapOut = 11;	
+
+    // Target amount of memory (in MiB) the device aims to hold.
+    int64 TargetMib = 12; 
+
+    // Target number of pages the device aims to hold.
+    int64 TargetPages = 13;	
+
+    // The total amount of memory available (in bytes).
+    int64 TotalMemory = 14; 
+}
+
+message UpdateBalloonStatsRequest {
+    string VMID = 1;
+    int64 StatsPollingIntervals = 2;
+}
diff --git a/proto/service/fccontrol/fccontrol.proto b/proto/service/fccontrol/fccontrol.proto
index 526fe59..8306e7c 100644
--- a/proto/service/fccontrol/fccontrol.proto
+++ b/proto/service/fccontrol/fccontrol.proto
@@ -29,5 +29,17 @@ service Firecracker {
     rpc UpdateVMMetadata(UpdateVMMetadataRequest) returns (google.protobuf.Empty);
 
     // Get Vm's instance metadata
-    rpc GetVMMetadata(GetVMMetadataRequest) returns (GetVMMetadataResponse);
+    rpc GetVMMetadata(GetVMMetadataRequest) returns (GetVMMetadataResponse);    
+
+    // Get balloon configuration
+    rpc GetBalloonConfig(GetBalloonConfigRequest) returns (GetBalloonConfigResponse); 
+
+    // Update balloon's memory
+    rpc UpdateBalloon(UpdateBalloonRequest) returns (google.protobuf.Empty); 
+    
+    // Gets a balloon device statistics
+    rpc GetBalloonStats(GetBalloonStatsRequest) returns(GetBalloonStatsResponse);
+
+    // Updates a balloon device statistics polling interval.
+    rpc UpdateBalloonStats(UpdateBalloonStatsRequest) returns(google.protobuf.Empty);
 }
diff --git a/proto/service/fccontrol/ttrpc/fccontrol.pb.go b/proto/service/fccontrol/ttrpc/fccontrol.pb.go
index 7200644..c6409dc 100644
--- a/proto/service/fccontrol/ttrpc/fccontrol.pb.go
+++ b/proto/service/fccontrol/ttrpc/fccontrol.pb.go
@@ -27,26 +27,30 @@ const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package
 func init() { proto.RegisterFile("fccontrol.proto", fileDescriptor_b99f53e2bf82c5ef) }
 
 var fileDescriptor_b99f53e2bf82c5ef = []byte{
-	// 290 bytes of a gzipped FileDescriptorProto
-	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0xe2, 0x4f, 0x4b, 0x4e, 0xce,
-	0xcf, 0x2b, 0x29, 0xca, 0xcf, 0xd1, 0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x97, 0x92, 0x4e, 0xcf, 0xcf,
-	0x4f, 0xcf, 0x49, 0xd5, 0x07, 0xf3, 0x92, 0x4a, 0xd3, 0xf4, 0x53, 0x73, 0x0b, 0x4a, 0x2a, 0xa1,
-	0x92, 0x82, 0x69, 0x99, 0x45, 0xa9, 0xc9, 0x45, 0x89, 0xc9, 0xd9, 0xa9, 0x45, 0x10, 0x21, 0xa3,
-	0x2b, 0xcc, 0x5c, 0xdc, 0x6e, 0x08, 0x51, 0x21, 0x7d, 0x2e, 0x0e, 0xe7, 0xa2, 0xd4, 0xc4, 0x92,
-	0xd4, 0x30, 0x5f, 0x21, 0x01, 0x3d, 0x18, 0x33, 0x28, 0xb5, 0xb0, 0x34, 0xb5, 0xb8, 0x44, 0x4a,
-	0x10, 0x49, 0xa4, 0xb8, 0x20, 0x3f, 0xaf, 0x38, 0x55, 0xc8, 0x88, 0x8b, 0x3d, 0x20, 0xb1, 0xb4,
-	0x18, 0xa4, 0x9e, 0x5f, 0x0f, 0xca, 0x82, 0x29, 0x17, 0xd3, 0x83, 0xb8, 0x46, 0x0f, 0xe6, 0x1a,
-	0x3d, 0x57, 0x90, 0x6b, 0x84, 0x4c, 0xb8, 0x38, 0x82, 0x52, 0x8b, 0x4b, 0x73, 0x21, 0x96, 0xc0,
-	0x98, 0x84, 0x74, 0x19, 0x70, 0xb1, 0x05, 0x97, 0xe4, 0x17, 0x84, 0xf9, 0x0a, 0xf1, 0xe9, 0x41,
-	0x18, 0x84, 0x74, 0x18, 0x71, 0x71, 0xba, 0xa7, 0x96, 0x84, 0xf9, 0x7a, 0xe6, 0xa5, 0xe5, 0x0b,
-	0x09, 0xea, 0xc1, 0xd9, 0x30, 0x7d, 0x42, 0xc8, 0x42, 0x50, 0xff, 0xd8, 0x71, 0xf1, 0x06, 0x83,
-	0x04, 0x7d, 0x53, 0x4b, 0x12, 0x53, 0x12, 0x4b, 0x12, 0x85, 0x44, 0xf5, 0x50, 0xf8, 0x84, 0xec,
-	0x74, 0xe1, 0x12, 0x08, 0x2d, 0x48, 0x01, 0x87, 0x11, 0xdc, 0x08, 0x09, 0x3d, 0x74, 0x21, 0x42,
-	0xa6, 0xd8, 0x71, 0xf1, 0xba, 0xa3, 0xb9, 0xc2, 0x1d, 0xbb, 0x2b, 0xd0, 0x84, 0x21, 0xbe, 0x70,
-	0x52, 0x3e, 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, 0x14, 0x27, 0x3c, 0xc5, 0x24,
-	0xb1, 0x81, 0x2d, 0x35, 0x06, 0x04, 0x00, 0x00, 0xff, 0xff, 0x9e, 0x26, 0xe6, 0x13, 0x45, 0x02,
-	0x00, 0x00,
+	// 357 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x84, 0x93, 0x3f, 0x4f, 0xf2, 0x50,
+	0x14, 0xc6, 0xe9, 0xf0, 0xf2, 0xc2, 0x35, 0x08, 0xdc, 0x04, 0x45, 0x4c, 0xba, 0xb8, 0x1f, 0x0c,
+	0x3a, 0x33, 0x80, 0x5a, 0x1d, 0x9a, 0x18, 0x88, 0x0c, 0x6e, 0x97, 0x72, 0x4a, 0x88, 0xa5, 0xb7,
+	0xb6, 0xa7, 0x83, 0x9b, 0x1f, 0x8f, 0xd1, 0xd1, 0x51, 0xba, 0xfb, 0x1d, 0x0c, 0xb4, 0x97, 0x3f,
+	0x85, 0xe4, 0x6e, 0xcf, 0xf9, 0x9d, 0x9e, 0xe7, 0x3c, 0xf7, 0x24, 0x65, 0x55, 0xd7, 0x71, 0xa4,
+	0x4f, 0xa1, 0xf4, 0x20, 0x08, 0x25, 0xc9, 0xd6, 0xe5, 0x54, 0xca, 0xa9, 0x87, 0xed, 0x75, 0x35,
+	0x8e, 0xdd, 0x36, 0xce, 0x03, 0xfa, 0xc8, 0x9a, 0x75, 0x77, 0x16, 0xa2, 0x13, 0x0a, 0xe7, 0x0d,
+	0xc3, 0x14, 0x75, 0x7e, 0xff, 0xb1, 0x93, 0x87, 0x2d, 0xe5, 0x6d, 0x56, 0xea, 0x87, 0x28, 0x08,
+	0x47, 0x36, 0xaf, 0x81, 0x92, 0x03, 0x7c, 0x8f, 0x31, 0xa2, 0x56, 0x7d, 0x87, 0x44, 0x81, 0xf4,
+	0x23, 0xe4, 0x1d, 0xf6, 0xff, 0x59, 0xc4, 0xd1, 0xea, 0xfb, 0x2a, 0x64, 0x4a, 0x7d, 0x7e, 0x06,
+	0x69, 0x1a, 0x50, 0x69, 0xe0, 0x7e, 0x95, 0x86, 0xdf, 0xb2, 0xd2, 0x00, 0xa3, 0x78, 0x9e, 0x2e,
+	0x51, 0x52, 0x37, 0x75, 0xcd, 0x8a, 0x43, 0x92, 0xc1, 0xc8, 0xe6, 0xa7, 0x90, 0x0a, 0xdd, 0x44,
+	0x87, 0x95, 0x2d, 0xa4, 0x91, 0xfd, 0xe4, 0xbb, 0x92, 0xd7, 0x61, 0xa3, 0xd5, 0x1c, 0xdf, 0x45,
+	0xd9, 0x7b, 0xba, 0xac, 0x32, 0x5c, 0x41, 0x1b, 0x49, 0x4c, 0x04, 0x09, 0xde, 0x80, 0xbd, 0x5a,
+	0xb7, 0xf3, 0x8e, 0xd5, 0x5e, 0x82, 0xc9, 0xfa, 0x46, 0x1b, 0x8b, 0x26, 0xe4, 0x91, 0xce, 0xa5,
+	0xcb, 0x2a, 0x56, 0x2e, 0x85, 0x75, 0x3c, 0x45, 0x0e, 0x67, 0xaf, 0xb0, 0x58, 0xcd, 0x42, 0xea,
+	0x09, 0xcf, 0x93, 0xd2, 0xef, 0x4b, 0xdf, 0x9d, 0x4d, 0x79, 0x13, 0xf2, 0x48, 0xb9, 0x5c, 0x1c,
+	0xe9, 0x6c, 0xcf, 0x91, 0x66, 0xcf, 0xda, 0xbc, 0x01, 0x7b, 0xb5, 0xfe, 0x1c, 0xd5, 0xad, 0xf7,
+	0x90, 0x04, 0x45, 0xfc, 0x1c, 0x72, 0x44, 0x79, 0x34, 0x0f, 0x1b, 0x59, 0x8a, 0x47, 0xc6, 0xf7,
+	0xb6, 0xa6, 0x46, 0x2d, 0x38, 0x84, 0x9a, 0x3c, 0xbd, 0xab, 0xc5, 0xd2, 0x2c, 0x7c, 0x2f, 0xcd,
+	0xc2, 0x67, 0x62, 0x1a, 0x8b, 0xc4, 0x34, 0xbe, 0x12, 0xd3, 0xf8, 0x49, 0x4c, 0xe3, 0xb5, 0xbc,
+	0xf9, 0x95, 0xc6, 0xc5, 0xf5, 0xd0, 0xcd, 0x5f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x66, 0x43, 0x0c,
+	0x39, 0x5e, 0x03, 0x00, 0x00,
 }
 
 type FirecrackerService interface {
@@ -58,6 +62,10 @@ type FirecrackerService interface {
 	SetVMMetadata(ctx context.Context, req *proto1.SetVMMetadataRequest) (*empty.Empty, error)
 	UpdateVMMetadata(ctx context.Context, req *proto1.UpdateVMMetadataRequest) (*empty.Empty, error)
 	GetVMMetadata(ctx context.Context, req *proto1.GetVMMetadataRequest) (*proto1.GetVMMetadataResponse, error)
+	GetBalloonConfig(ctx context.Context, req *proto1.GetBalloonConfigRequest) (*proto1.GetBalloonConfigResponse, error)
+	UpdateBalloon(ctx context.Context, req *proto1.UpdateBalloonRequest) (*empty.Empty, error)
+	GetBalloonStats(ctx context.Context, req *proto1.GetBalloonStatsRequest) (*proto1.GetBalloonStatsResponse, error)
+	UpdateBalloonStats(ctx context.Context, req *proto1.UpdateBalloonStatsRequest) (*empty.Empty, error)
 }
 
 func RegisterFirecrackerService(srv *github_com_containerd_ttrpc.Server, svc FirecrackerService) {
@@ -118,6 +126,34 @@ func RegisterFirecrackerService(srv *github_com_containerd_ttrpc.Server, svc Fir
 			}
 			return svc.GetVMMetadata(ctx, &req)
 		},
+		"GetBalloonConfig": func(ctx context.Context, unmarshal func(interface{}) error) (interface{}, error) {
+			var req proto1.GetBalloonConfigRequest
+			if err := unmarshal(&req); err != nil {
+				return nil, err
+			}
+			return svc.GetBalloonConfig(ctx, &req)
+		},
+		"UpdateBalloon": func(ctx context.Context, unmarshal func(interface{}) error) (interface{}, error) {
+			var req proto1.UpdateBalloonRequest
+			if err := unmarshal(&req); err != nil {
+				return nil, err
+			}
+			return svc.UpdateBalloon(ctx, &req)
+		},
+		"GetBalloonStats": func(ctx context.Context, unmarshal func(interface{}) error) (interface{}, error) {
+			var req proto1.GetBalloonStatsRequest
+			if err := unmarshal(&req); err != nil {
+				return nil, err
+			}
+			return svc.GetBalloonStats(ctx, &req)
+		},
+		"UpdateBalloonStats": func(ctx context.Context, unmarshal func(interface{}) error) (interface{}, error) {
+			var req proto1.UpdateBalloonStatsRequest
+			if err := unmarshal(&req); err != nil {
+				return nil, err
+			}
+			return svc.UpdateBalloonStats(ctx, &req)
+		},
 	})
 }
 
@@ -194,3 +230,35 @@ func (c *firecrackerClient) GetVMMetadata(ctx context.Context, req *proto1.GetVM
 	}
 	return &resp, nil
 }
+
+func (c *firecrackerClient) GetBalloonConfig(ctx context.Context, req *proto1.GetBalloonConfigRequest) (*proto1.GetBalloonConfigResponse, error) {
+	var resp proto1.GetBalloonConfigResponse
+	if err := c.client.Call(ctx, "Firecracker", "GetBalloonConfig", req, &resp); err != nil {
+		return nil, err
+	}
+	return &resp, nil
+}
+
+func (c *firecrackerClient) UpdateBalloon(ctx context.Context, req *proto1.UpdateBalloonRequest) (*empty.Empty, error) {
+	var resp empty.Empty
+	if err := c.client.Call(ctx, "Firecracker", "UpdateBalloon", req, &resp); err != nil {
+		return nil, err
+	}
+	return &resp, nil
+}
+
+func (c *firecrackerClient) GetBalloonStats(ctx context.Context, req *proto1.GetBalloonStatsRequest) (*proto1.GetBalloonStatsResponse, error) {
+	var resp proto1.GetBalloonStatsResponse
+	if err := c.client.Call(ctx, "Firecracker", "GetBalloonStats", req, &resp); err != nil {
+		return nil, err
+	}
+	return &resp, nil
+}
+
+func (c *firecrackerClient) UpdateBalloonStats(ctx context.Context, req *proto1.UpdateBalloonStatsRequest) (*empty.Empty, error) {
+	var resp empty.Empty
+	if err := c.client.Call(ctx, "Firecracker", "UpdateBalloonStats", req, &resp); err != nil {
+		return nil, err
+	}
+	return &resp, nil
+}
diff --git a/proto/types.pb.go b/proto/types.pb.go
index 80991a8..5d0068f 100644
--- a/proto/types.pb.go
+++ b/proto/types.pb.go
@@ -765,6 +765,60 @@ func (m *FirecrackerTokenBucket) GetCapacity() int64 {
 	return 0
 }
 
+type FirecrackerBalloonDevice struct {
+	AmountMib             int64    `protobuf:"varint,1,opt,name=AmountMib,json=amountMib,proto3" json:"AmountMib,omitempty"`
+	DeflateOnOom          bool     `protobuf:"varint,2,opt,name=DeflateOnOom,json=deflateOnOom,proto3" json:"DeflateOnOom,omitempty"`
+	StatsPollingIntervals int64    `protobuf:"varint,3,opt,name=StatsPollingIntervals,json=statsPollingIntervals,proto3" json:"StatsPollingIntervals,omitempty"`
+	XXX_NoUnkeyedLiteral  struct{} `json:"-"`
+	XXX_unrecognized      []byte   `json:"-"`
+	XXX_sizecache         int32    `json:"-"`
+}
+
+func (m *FirecrackerBalloonDevice) Reset()         { *m = FirecrackerBalloonDevice{} }
+func (m *FirecrackerBalloonDevice) String() string { return proto.CompactTextString(m) }
+func (*FirecrackerBalloonDevice) ProtoMessage()    {}
+func (*FirecrackerBalloonDevice) Descriptor() ([]byte, []int) {
+	return fileDescriptor_d938547f84707355, []int{10}
+}
+func (m *FirecrackerBalloonDevice) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_FirecrackerBalloonDevice.Unmarshal(m, b)
+}
+func (m *FirecrackerBalloonDevice) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_FirecrackerBalloonDevice.Marshal(b, m, deterministic)
+}
+func (m *FirecrackerBalloonDevice) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_FirecrackerBalloonDevice.Merge(m, src)
+}
+func (m *FirecrackerBalloonDevice) XXX_Size() int {
+	return xxx_messageInfo_FirecrackerBalloonDevice.Size(m)
+}
+func (m *FirecrackerBalloonDevice) XXX_DiscardUnknown() {
+	xxx_messageInfo_FirecrackerBalloonDevice.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_FirecrackerBalloonDevice proto.InternalMessageInfo
+
+func (m *FirecrackerBalloonDevice) GetAmountMib() int64 {
+	if m != nil {
+		return m.AmountMib
+	}
+	return 0
+}
+
+func (m *FirecrackerBalloonDevice) GetDeflateOnOom() bool {
+	if m != nil {
+		return m.DeflateOnOom
+	}
+	return false
+}
+
+func (m *FirecrackerBalloonDevice) GetStatsPollingIntervals() int64 {
+	if m != nil {
+		return m.StatsPollingIntervals
+	}
+	return 0
+}
+
 func init() {
 	proto.RegisterType((*ExtraData)(nil), "ExtraData")
 	proto.RegisterType((*FirecrackerNetworkInterface)(nil), "FirecrackerNetworkInterface")
@@ -777,66 +831,71 @@ func init() {
 	proto.RegisterType((*FirecrackerDriveMount)(nil), "FirecrackerDriveMount")
 	proto.RegisterType((*FirecrackerRateLimiter)(nil), "FirecrackerRateLimiter")
 	proto.RegisterType((*FirecrackerTokenBucket)(nil), "FirecrackerTokenBucket")
+	proto.RegisterType((*FirecrackerBalloonDevice)(nil), "FirecrackerBalloonDevice")
 }
 
 func init() { proto.RegisterFile("types.proto", fileDescriptor_d938547f84707355) }
 
 var fileDescriptor_d938547f84707355 = []byte{
-	// 885 bytes of a gzipped FileDescriptorProto
-	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x55, 0xdd, 0x8e, 0xe3, 0x44,
-	0x13, 0x55, 0xc6, 0xf9, 0xb1, 0xcb, 0x99, 0xf9, 0xe6, 0x6b, 0x0d, 0x4b, 0x98, 0x45, 0x10, 0x59,
-	0x08, 0x05, 0x69, 0x95, 0x41, 0x83, 0x40, 0xe2, 0x02, 0xad, 0xf2, 0xb3, 0xcb, 0x06, 0xc8, 0x4c,
-	0xe4, 0x0c, 0x83, 0xc4, 0x5d, 0xc7, 0xe9, 0x24, 0x4d, 0xe2, 0x6e, 0xab, 0xbb, 0x9d, 0xac, 0xf7,
-	0x11, 0x10, 0xef, 0xc0, 0x35, 0x17, 0x3c, 0x02, 0xef, 0xc3, 0x63, 0xa0, 0x6e, 0xb7, 0x13, 0x4f,
-	0x76, 0x19, 0x71, 0x15, 0xd5, 0x39, 0x55, 0xae, 0xaa, 0x53, 0xd5, 0x15, 0xf0, 0x55, 0x96, 0x10,
-	0xd9, 0x4d, 0x04, 0x57, 0xfc, 0xf2, 0x83, 0x25, 0xe7, 0xcb, 0x0d, 0xb9, 0x32, 0xd6, 0x2c, 0x5d,
-	0x5c, 0x61, 0x96, 0xe5, 0x54, 0xf0, 0x57, 0x05, 0xbc, 0x17, 0xaf, 0x95, 0xc0, 0x43, 0xac, 0x30,
-	0xba, 0x04, 0xf7, 0x3b, 0xc9, 0xd9, 0x34, 0x21, 0x51, 0xab, 0xd2, 0xae, 0x74, 0x9a, 0xa1, 0xfb,
-	0x8b, 0xb5, 0xd1, 0x57, 0xe0, 0x87, 0x29, 0x8b, 0x6e, 0x13, 0x45, 0x39, 0x93, 0xad, 0x93, 0x76,
-	0xa5, 0xe3, 0x5f, 0x5f, 0x74, 0xf3, 0x4f, 0x77, 0x8b, 0x4f, 0x77, 0x7b, 0x2c, 0x0b, 0x7d, 0x71,
-	0x70, 0x44, 0x1f, 0x82, 0x37, 0x55, 0x73, 0xca, 0x26, 0x5c, 0xa8, 0x96, 0xd3, 0xae, 0x74, 0x4e,
-	0x43, 0x4f, 0x16, 0x00, 0xfa, 0x08, 0x60, 0xaa, 0xe6, 0x3c, 0x55, 0x86, 0xae, 0x1a, 0x1a, 0xe4,
-	0x1e, 0xb1, 0x3c, 0x11, 0xc2, 0xf0, 0xb5, 0x3d, 0x6f, 0x91, 0xe0, 0xcf, 0x13, 0x78, 0xfa, 0x92,
-	0x0a, 0x12, 0x09, 0x1c, 0xad, 0x89, 0xb8, 0x21, 0x6a, 0xc7, 0xc5, 0x7a, 0xc4, 0x14, 0x11, 0x0b,
-	0x1c, 0x11, 0x9d, 0xbd, 0xb7, 0xd9, 0xf0, 0xdd, 0x78, 0x3c, 0x9c, 0x9a, 0x96, 0xdc, 0xd0, 0xc3,
-	0x05, 0x80, 0xbe, 0x81, 0xd3, 0x11, 0x0b, 0xb1, 0x22, 0x3f, 0xd0, 0x98, 0x2a, 0x22, 0x6c, 0x57,
-	0xef, 0x77, 0x4b, 0x9f, 0x2c, 0xd1, 0xe1, 0x29, 0x2d, 0x7b, 0xa3, 0xe7, 0x70, 0x76, 0x9b, 0xaa,
-	0x72, 0xbc, 0xf3, 0x78, 0xfc, 0x19, 0x7f, 0xe0, 0x8e, 0xae, 0xc0, 0x1b, 0xdc, 0x8c, 0x06, 0x9c,
-	0x2d, 0xe8, 0xd2, 0x34, 0xef, 0x5f, 0xff, 0xbf, 0xbb, 0x47, 0x52, 0x81, 0xb5, 0x84, 0xa1, 0x17,
-	0x15, 0x08, 0x7a, 0x0e, 0xcd, 0xa9, 0xc2, 0x8a, 0x46, 0x36, 0xa6, 0x66, 0x62, 0x9e, 0x76, 0x73,
-	0xd0, 0x76, 0xff, 0x30, 0xba, 0x29, 0x4b, 0x01, 0xc1, 0xaf, 0x27, 0x70, 0x7e, 0x9c, 0x00, 0xb5,
-	0xc1, 0xb7, 0xa1, 0x37, 0x38, 0x26, 0x46, 0x26, 0x2f, 0xf4, 0xd9, 0x01, 0x42, 0x9f, 0x68, 0xa1,
-	0xac, 0xa6, 0xc6, 0xe7, 0xc4, 0xf8, 0x9c, 0xd2, 0x32, 0x88, 0x5a, 0xd0, 0xe8, 0x53, 0x36, 0xc1,
-	0x6a, 0xd5, 0x72, 0xda, 0x4e, 0xc7, 0x0b, 0x1b, 0xb3, 0xdc, 0xd4, 0x8c, 0x4e, 0x39, 0xa4, 0xc2,
-	0xb4, 0xe9, 0x85, 0x8d, 0x28, 0x37, 0xf5, 0xca, 0x0d, 0x70, 0xb4, 0x22, 0x9a, 0xaa, 0x19, 0xca,
-	0x8d, 0xac, 0x8d, 0x9e, 0x41, 0xb5, 0x27, 0x96, 0xb2, 0x55, 0x6f, 0x3b, 0x1d, 0xff, 0xba, 0xf5,
-	0x96, 0x32, 0x1a, 0xe8, 0x89, 0x65, 0x58, 0xc5, 0x62, 0x29, 0x2f, 0x3f, 0x87, 0x7a, 0x6e, 0xa3,
-	0x73, 0x70, 0xbe, 0x27, 0x99, 0xed, 0xc3, 0x59, 0x93, 0x0c, 0x5d, 0x40, 0xed, 0x1e, 0x6f, 0xd2,
-	0xa2, 0xee, 0xda, 0x56, 0x1b, 0xc1, 0x6f, 0x15, 0xb8, 0xfc, 0x77, 0xe5, 0xf4, 0xee, 0x8d, 0x71,
-	0xd4, 0x9b, 0xcf, 0x05, 0x91, 0xd2, 0x7e, 0x0d, 0xe2, 0x3d, 0xa2, 0x65, 0x7b, 0xc5, 0xa5, 0x1a,
-	0x92, 0x6d, 0x49, 0x12, 0x7f, 0x75, 0x80, 0xd0, 0x33, 0x70, 0x47, 0x13, 0x3b, 0xaa, 0x7c, 0x35,
-	0xce, 0xbb, 0x05, 0x50, 0xcc, 0xc7, 0xa5, 0x16, 0x08, 0x76, 0xf0, 0xbf, 0x23, 0x52, 0xa7, 0x98,
-	0x08, 0x1a, 0x63, 0x91, 0xe9, 0xa4, 0xc5, 0x64, 0x92, 0x03, 0xa4, 0x3d, 0xbe, 0xc5, 0x8a, 0xec,
-	0x70, 0xee, 0xe1, 0xe4, 0x1e, 0xcb, 0x03, 0x64, 0xa6, 0x8b, 0x63, 0x22, 0x89, 0xd8, 0x12, 0x21,
-	0x5b, 0x55, 0x33, 0x19, 0x9f, 0x1d, 0xa0, 0xe0, 0xf7, 0x0a, 0x7c, 0x5c, 0xda, 0xd8, 0x31, 0x8e,
-	0x56, 0x94, 0x91, 0xb7, 0x2a, 0x19, 0x4c, 0x7e, 0xbc, 0x23, 0x71, 0xb2, 0xc1, 0x6a, 0xbf, 0x23,
-	0xd1, 0x01, 0xd2, 0x4f, 0xed, 0x95, 0x7a, 0xc1, 0xf0, 0x6c, 0x43, 0xe6, 0x46, 0x0c, 0x37, 0xf4,
-	0x56, 0x05, 0x60, 0xc4, 0x24, 0xf1, 0x94, 0xbe, 0x21, 0x63, 0x3a, 0xb3, 0x77, 0x00, 0xe2, 0x3d,
-	0xa2, 0xa3, 0xef, 0xa3, 0x24, 0x1d, 0xf0, 0x94, 0x15, 0x77, 0xc0, 0xdb, 0x16, 0x40, 0xf0, 0x47,
-	0x05, 0x2e, 0xca, 0x6f, 0x8a, 0x73, 0x35, 0x14, 0x74, 0x4b, 0xf4, 0xfa, 0xe8, 0x19, 0x98, 0x9d,
-	0xcb, 0x6b, 0x72, 0x57, 0xd6, 0xd6, 0xdc, 0x04, 0x0b, 0x95, 0xa6, 0x74, 0x6e, 0x87, 0xe3, 0x26,
-	0xd6, 0xd6, 0xe5, 0x8c, 0xe4, 0x4f, 0x82, 0x2a, 0x5d, 0x9d, 0x29, 0xc7, 0x0d, 0x81, 0xee, 0x11,
-	0xf4, 0x35, 0xf8, 0xe5, 0x77, 0x5d, 0x7d, 0xfc, 0x5d, 0xfb, 0xe2, 0x60, 0x04, 0x7f, 0x57, 0xe0,
-	0xbd, 0x92, 0x9f, 0xa9, 0x73, 0xac, 0xbb, 0x78, 0xb4, 0xd8, 0x27, 0x50, 0xbf, 0x1f, 0x1b, 0x26,
-	0x2f, 0xb5, 0xbe, 0x35, 0x16, 0xfa, 0x14, 0xce, 0x5e, 0xd2, 0x0d, 0x91, 0x99, 0x54, 0x24, 0xbe,
-	0xcb, 0x12, 0x62, 0x47, 0x7c, 0xb6, 0x78, 0x80, 0xea, 0x17, 0x56, 0x9c, 0xe6, 0x7c, 0xc2, 0x0d,
-	0x6e, 0x0f, 0xf0, 0x51, 0x2b, 0xb5, 0xff, 0xde, 0xca, 0x91, 0x4a, 0xf5, 0x63, 0x95, 0x82, 0x37,
-	0xf0, 0xe4, 0xdd, 0x9f, 0x41, 0x5f, 0x82, 0xd7, 0xc7, 0x6c, 0xbe, 0xa3, 0x73, 0xdb, 0xeb, 0x51,
-	0xca, 0x3b, 0xbe, 0x26, 0xac, 0x9f, 0x46, 0x6b, 0xa2, 0x42, 0x6f, 0x56, 0x78, 0xa2, 0xcf, 0xc0,
-	0xb9, 0x4d, 0xe4, 0xbb, 0xce, 0x70, 0x39, 0xc0, 0xe1, 0x89, 0x0c, 0x5e, 0x3f, 0xc8, 0x5d, 0xa2,
-	0x51, 0x00, 0xcd, 0x5b, 0x46, 0xee, 0x68, 0x4c, 0xfa, 0xa9, 0x90, 0xca, 0xa4, 0x77, 0xc2, 0x26,
-	0x2f, 0x61, 0xba, 0xb3, 0x90, 0x2c, 0xe8, 0x66, 0xa3, 0x21, 0x93, 0xcf, 0x09, 0x41, 0xec, 0x91,
-	0xfc, 0x2c, 0x25, 0x38, 0xa2, 0x2a, 0x33, 0x82, 0x3b, 0xfa, 0x2c, 0xe5, 0x76, 0xbf, 0xf1, 0x73,
-	0x2d, 0xff, 0xbb, 0xab, 0x9b, 0x9f, 0x2f, 0xfe, 0x09, 0x00, 0x00, 0xff, 0xff, 0xc9, 0x27, 0x3b,
-	0x3e, 0x6d, 0x07, 0x00, 0x00,
+	// 947 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x55, 0xdd, 0x6e, 0xe3, 0x44,
+	0x14, 0x96, 0xeb, 0x26, 0xb5, 0x8f, 0xd3, 0x52, 0x46, 0xed, 0x12, 0xba, 0x08, 0x22, 0x0b, 0xa1,
+	0x22, 0xad, 0x52, 0x54, 0x7e, 0x24, 0x2e, 0xd0, 0xaa, 0x69, 0x76, 0xd9, 0x00, 0x69, 0x22, 0xa7,
+	0x14, 0x89, 0xbb, 0x89, 0x33, 0x49, 0x86, 0xd8, 0x33, 0xd6, 0xcc, 0x38, 0xd9, 0xec, 0x23, 0x20,
+	0xae, 0x78, 0x01, 0xae, 0xb9, 0xe0, 0x11, 0x78, 0x1f, 0x1e, 0x03, 0xcd, 0x78, 0x9c, 0xb8, 0xd9,
+	0x52, 0x71, 0x65, 0x9d, 0xef, 0x3b, 0x67, 0xce, 0xff, 0x31, 0x04, 0x6a, 0x9d, 0x11, 0xd9, 0xce,
+	0x04, 0x57, 0xfc, 0xec, 0xfd, 0x19, 0xe7, 0xb3, 0x84, 0x5c, 0x18, 0x69, 0x9c, 0x4f, 0x2f, 0x30,
+	0x5b, 0x17, 0x54, 0xf8, 0xb7, 0x03, 0xfe, 0x8b, 0xd7, 0x4a, 0xe0, 0x2e, 0x56, 0x18, 0x9d, 0x81,
+	0xf7, 0x9d, 0xe4, 0x6c, 0x94, 0x91, 0xb8, 0xe9, 0xb4, 0x9c, 0xf3, 0x46, 0xe4, 0xfd, 0x62, 0x65,
+	0xf4, 0x15, 0x04, 0x51, 0xce, 0xe2, 0x41, 0xa6, 0x28, 0x67, 0xb2, 0xb9, 0xd7, 0x72, 0xce, 0x83,
+	0xcb, 0x93, 0x76, 0xf1, 0x74, 0xbb, 0x7c, 0xba, 0x7d, 0xc5, 0xd6, 0x51, 0x20, 0xb6, 0x8a, 0xe8,
+	0x03, 0xf0, 0x47, 0x6a, 0x42, 0xd9, 0x90, 0x0b, 0xd5, 0x74, 0x5b, 0xce, 0xf9, 0x61, 0xe4, 0xcb,
+	0x12, 0x40, 0x1f, 0x02, 0x8c, 0xd4, 0x84, 0xe7, 0xca, 0xd0, 0xfb, 0x86, 0x06, 0xb9, 0x41, 0x2c,
+	0x4f, 0x84, 0x30, 0x7c, 0x6d, 0xc3, 0x5b, 0x24, 0xfc, 0x6b, 0x0f, 0x9e, 0xbe, 0xa4, 0x82, 0xc4,
+	0x02, 0xc7, 0x0b, 0x22, 0x6e, 0x88, 0x5a, 0x71, 0xb1, 0xe8, 0x31, 0x45, 0xc4, 0x14, 0xc7, 0x44,
+	0x7b, 0xbf, 0x4a, 0x12, 0xbe, 0xea, 0xf7, 0xbb, 0x23, 0x93, 0x92, 0x17, 0xf9, 0xb8, 0x04, 0xd0,
+	0x37, 0x70, 0xd8, 0x63, 0x11, 0x56, 0xe4, 0x07, 0x9a, 0x52, 0x45, 0x84, 0xcd, 0xea, 0xbd, 0x76,
+	0xe5, 0xc9, 0x0a, 0x1d, 0x1d, 0xd2, 0xaa, 0x36, 0x7a, 0x0e, 0x47, 0x83, 0x5c, 0x55, 0xed, 0xdd,
+	0xc7, 0xed, 0x8f, 0xf8, 0x3d, 0x75, 0x74, 0x01, 0xfe, 0xf5, 0x4d, 0xef, 0x9a, 0xb3, 0x29, 0x9d,
+	0x99, 0xe4, 0x83, 0xcb, 0x77, 0xdb, 0x1b, 0x24, 0x17, 0x58, 0x97, 0x30, 0xf2, 0xe3, 0x12, 0x41,
+	0xcf, 0xa1, 0x31, 0x52, 0x58, 0xd1, 0xd8, 0xda, 0xd4, 0x8c, 0xcd, 0xd3, 0x76, 0x01, 0xda, 0xec,
+	0xef, 0x5b, 0x37, 0x64, 0xc5, 0x20, 0xfc, 0x75, 0x0f, 0x8e, 0x77, 0x1d, 0xa0, 0x16, 0x04, 0xd6,
+	0xf4, 0x06, 0xa7, 0xc4, 0x94, 0xc9, 0x8f, 0x02, 0xb6, 0x85, 0xd0, 0xc7, 0xba, 0x50, 0xb6, 0xa6,
+	0x46, 0x67, 0xcf, 0xe8, 0x1c, 0xd2, 0x2a, 0x88, 0x9a, 0x70, 0xd0, 0xa1, 0x6c, 0x88, 0xd5, 0xbc,
+	0xe9, 0xb6, 0xdc, 0x73, 0x3f, 0x3a, 0x18, 0x17, 0xa2, 0x66, 0xb4, 0xcb, 0x2e, 0x15, 0x26, 0x4d,
+	0x3f, 0x3a, 0x88, 0x0b, 0x51, 0x8f, 0xdc, 0x35, 0x8e, 0xe7, 0x44, 0x53, 0x35, 0x43, 0x79, 0xb1,
+	0x95, 0xd1, 0x33, 0xd8, 0xbf, 0x12, 0x33, 0xd9, 0xac, 0xb7, 0xdc, 0xf3, 0xe0, 0xb2, 0xf9, 0x56,
+	0x65, 0x34, 0x70, 0x25, 0x66, 0xd1, 0x3e, 0x16, 0x33, 0x79, 0xf6, 0x19, 0xd4, 0x0b, 0x19, 0x1d,
+	0x83, 0xfb, 0x3d, 0x59, 0xdb, 0x3c, 0xdc, 0x05, 0x59, 0xa3, 0x13, 0xa8, 0xdd, 0xe1, 0x24, 0x2f,
+	0xe3, 0xae, 0x2d, 0xb5, 0x10, 0xfe, 0xe6, 0xc0, 0xd9, 0x7f, 0x57, 0x4e, 0xcf, 0x5e, 0x1f, 0xc7,
+	0x57, 0x93, 0x89, 0x20, 0x52, 0xda, 0xd7, 0x20, 0xdd, 0x20, 0xba, 0x6c, 0xaf, 0xb8, 0x54, 0x5d,
+	0xb2, 0xac, 0x94, 0x24, 0x98, 0x6f, 0x21, 0xf4, 0x0c, 0xbc, 0xde, 0xd0, 0xb6, 0xaa, 0x18, 0x8d,
+	0xe3, 0x76, 0x09, 0x94, 0xfd, 0xf1, 0xa8, 0x05, 0xc2, 0x15, 0xbc, 0xb3, 0x43, 0x6a, 0x17, 0x43,
+	0x41, 0x53, 0x2c, 0xd6, 0xda, 0x69, 0xd9, 0x99, 0x6c, 0x0b, 0x69, 0x8d, 0x6f, 0xb1, 0x22, 0x2b,
+	0x5c, 0x68, 0xb8, 0x85, 0xc6, 0x6c, 0x0b, 0x99, 0xee, 0xe2, 0x94, 0x48, 0x22, 0x96, 0x44, 0xc8,
+	0xe6, 0xbe, 0xe9, 0x4c, 0xc0, 0xb6, 0x50, 0xf8, 0x87, 0x03, 0x1f, 0x55, 0x26, 0xb6, 0x8f, 0xe3,
+	0x39, 0x65, 0xe4, 0xad, 0x48, 0xae, 0x87, 0x3f, 0xde, 0x92, 0x34, 0x4b, 0xb0, 0xda, 0xcc, 0x48,
+	0xbc, 0x85, 0xf4, 0xaa, 0xbd, 0x52, 0x2f, 0x18, 0x1e, 0x27, 0x64, 0x62, 0x8a, 0xe1, 0x45, 0xfe,
+	0xbc, 0x04, 0x4c, 0x31, 0x49, 0x3a, 0xa2, 0x6f, 0x48, 0x9f, 0x8e, 0xed, 0x1d, 0x80, 0x74, 0x83,
+	0x68, 0xeb, 0xbb, 0x38, 0xcb, 0xaf, 0x79, 0xce, 0xca, 0x3b, 0xe0, 0x2f, 0x4b, 0x20, 0xfc, 0xd3,
+	0x81, 0x93, 0xea, 0x4e, 0x71, 0xae, 0xba, 0x82, 0x2e, 0x89, 0x1e, 0x1f, 0xdd, 0x03, 0x33, 0x73,
+	0x45, 0x4c, 0xde, 0xdc, 0xca, 0x9a, 0x1b, 0x62, 0xa1, 0xf2, 0x9c, 0x4e, 0x6c, 0x73, 0xbc, 0xcc,
+	0xca, 0x3a, 0x9c, 0x9e, 0xfc, 0x49, 0x50, 0xa5, 0xa3, 0x33, 0xe1, 0x78, 0x11, 0xd0, 0x0d, 0x82,
+	0xbe, 0x86, 0xa0, 0xba, 0xd7, 0xfb, 0x8f, 0xef, 0x75, 0x20, 0xb6, 0x42, 0xf8, 0x8f, 0x03, 0xa7,
+	0x15, 0x3d, 0x13, 0x67, 0x5f, 0x67, 0xf1, 0x68, 0xb0, 0x4f, 0xa0, 0x7e, 0xd7, 0x37, 0x4c, 0x11,
+	0x6a, 0x7d, 0x69, 0x24, 0xf4, 0x09, 0x1c, 0xbd, 0xa4, 0x09, 0x91, 0x6b, 0xa9, 0x48, 0x7a, 0xbb,
+	0xce, 0x88, 0x6d, 0xf1, 0xd1, 0xf4, 0x1e, 0xaa, 0x37, 0xac, 0x3c, 0xcd, 0x45, 0x87, 0x0f, 0xb8,
+	0x3d, 0xc0, 0x3b, 0xa9, 0xd4, 0xfe, 0x7f, 0x2a, 0x3b, 0x55, 0xaa, 0xef, 0x56, 0x29, 0x7c, 0x03,
+	0x4f, 0x1e, 0x7e, 0x06, 0x7d, 0x09, 0x7e, 0x07, 0xb3, 0xc9, 0x8a, 0x4e, 0x6c, 0xae, 0x3b, 0x2e,
+	0x6f, 0xf9, 0x82, 0xb0, 0x4e, 0x1e, 0x2f, 0x88, 0x8a, 0xfc, 0x71, 0xa9, 0x89, 0x3e, 0x05, 0x77,
+	0x90, 0xc9, 0x87, 0xce, 0x70, 0xd5, 0xc0, 0xe5, 0x99, 0x0c, 0x5f, 0xdf, 0xf3, 0x5d, 0xa1, 0x51,
+	0x08, 0x8d, 0x01, 0x23, 0xb7, 0x34, 0x25, 0x9d, 0x5c, 0x48, 0x65, 0xdc, 0xbb, 0x51, 0x83, 0x57,
+	0x30, 0x9d, 0x59, 0x44, 0xa6, 0x34, 0x49, 0x34, 0x64, 0xfc, 0xb9, 0x11, 0x88, 0x0d, 0x52, 0x9c,
+	0xa5, 0x0c, 0xc7, 0x54, 0xad, 0x4d, 0xc1, 0x5d, 0x7d, 0x96, 0x0a, 0x39, 0xfc, 0xdd, 0x81, 0x66,
+	0xc5, 0x75, 0x47, 0xff, 0x4f, 0x38, 0xeb, 0x92, 0x25, 0xb5, 0x3f, 0x9c, 0x54, 0x77, 0x5b, 0x8f,
+	0x79, 0xe1, 0xd9, 0xc7, 0x25, 0xa0, 0x43, 0xeb, 0x92, 0xa9, 0x5e, 0x97, 0x01, 0x1b, 0xf0, 0xd4,
+	0xae, 0x49, 0x63, 0x52, 0xc1, 0xd0, 0x17, 0x70, 0xaa, 0x8f, 0x92, 0x1c, 0xf2, 0x24, 0xa1, 0x6c,
+	0x66, 0xee, 0xee, 0x12, 0x27, 0xd2, 0xc6, 0x71, 0x2a, 0x1f, 0x22, 0x3b, 0x07, 0x3f, 0xd7, 0x8a,
+	0x7f, 0x70, 0xdd, 0x7c, 0x3e, 0xff, 0x37, 0x00, 0x00, 0xff, 0xff, 0x2b, 0x38, 0xea, 0xdd, 0x02,
+	0x08, 0x00, 0x00,
 }
diff --git a/proto/types.proto b/proto/types.proto
index 81a1755..2f420ee 100644
--- a/proto/types.proto
+++ b/proto/types.proto
@@ -167,3 +167,9 @@ message FirecrackerTokenBucket {
 	int64 RefillTime = 2; // Specifies the amount of millis it takes for the bucket to fill
 	int64 Capacity = 3; // Specifies the number of tokens this bucket can hold
 }
+
+message FirecrackerBalloonDevice {
+    int64 AmountMib = 1; //Target balloon size in MiB.
+    bool DeflateOnOom = 2; // Whether the balloon should deflate when the guest has memory pressure.
+    int64 StatsPollingIntervals = 3; // Interval in seconds between refreshing statistics.
+}
diff --git a/runtime/service.go b/runtime/service.go
index adbb6e6..8f05ce2 100644
--- a/runtime/service.go
+++ b/runtime/service.go
@@ -571,6 +571,22 @@ func (s *service) createVM(requestCtx context.Context, request *proto.CreateVMRe
 	if err != nil {
 		return errors.Wrap(err, "failed to build jailed machine options")
 	}
+
+	if request.BalloonDevice == nil {
+		s.logger.Debug("No balloon device is setup")
+	} else {
+		// Creates a new balloon device if one does not already exist, otherwise updates it, before machine startup.
+		balloon, err := s.createBalloon(requestCtx, request)
+		if err != nil {
+			return errors.Wrap(err, "failed to create balloon device")
+		}
+		balloonOpts, err := s.buildBalloonDeviceOpt(balloon)
+		if err != nil {
+			return errors.Wrap(err, "failed to create balloon device options")
+		}
+		opts = append(opts, balloonOpts...)
+	}
+
 	opts = append(opts, jailedOpts...)
 
 	// In the event that a noop jailer is used, we will pass in the shim context
@@ -772,6 +788,140 @@ func (s *service) GetVMMetadata(requestCtx context.Context, request *proto.GetVM
 	return &proto.GetVMMetadataResponse{Metadata: string(metadata)}, nil
 }
 
+func (s *service) createBalloon(requestCtx context.Context, request *proto.CreateVMRequest) (models.Balloon, error) {
+	amountMiB := request.BalloonDevice.AmountMib
+	deflateOnOom := request.BalloonDevice.DeflateOnOom
+	statsPollingIntervals := request.BalloonDevice.StatsPollingIntervals
+
+	balloonDevice := firecracker.NewBalloonDevice(amountMiB, deflateOnOom, firecracker.WithStatsPollingIntervals(statsPollingIntervals))
+	balloon := balloonDevice.Build()
+	if balloon.AmountMib == nil || balloon.DeflateOnOom == nil {
+		return balloon, errors.Errorf("One of balloon properties is nil, please check %+v: ", balloon)
+	}
+	s.logger.Infof("Creating a balloon device: AmountMib=%d, DeflateOnOom=%t and statsPollingIntervals=%d ", *balloon.AmountMib, *balloon.DeflateOnOom, balloon.StatsPollingIntervals)
+	return balloon, nil
+}
+
+func (s *service) buildBalloonDeviceOpt(balloon models.Balloon) ([]firecracker.Opt, error) {
+	handler := firecracker.NewCreateBalloonHandler(*balloon.AmountMib, *balloon.DeflateOnOom, balloon.StatsPollingIntervals)
+	opt := []firecracker.Opt{
+		func(m *firecracker.Machine) {
+			m.Handlers.FcInit = m.Handlers.FcInit.AppendAfter(firecracker.CreateMachineHandlerName, handler)
+		},
+	}
+	return opt, nil
+}
+
+// GetBalloonConfig will get configuration for an existing balloon device, before or after machine startup
+func (s *service) GetBalloonConfig(requestCtx context.Context, req *proto.GetBalloonConfigRequest) (*proto.GetBalloonConfigResponse, error) {
+	defer logPanicAndDie(s.logger)
+
+	err := s.waitVMReady()
+	if err != nil {
+		s.logger.WithError(err).Error()
+		return nil, err
+	}
+
+	s.logger.Info("Getting configuration for the balloon device")
+	balloon, err := s.machine.GetBalloonConfig(requestCtx)
+	if err != nil {
+		return nil, errors.Errorf("Fail to get balloon configuration. Please check if you have successfully created a balloon device")
+	}
+	balloonConfig := &proto.FirecrackerBalloonDevice{
+		AmountMib:             *balloon.AmountMib,
+		DeflateOnOom:          *balloon.DeflateOnOom,
+		StatsPollingIntervals: balloon.StatsPollingIntervals,
+	}
+	return &proto.GetBalloonConfigResponse{BalloonConfig: balloonConfig}, err
+}
+
+// UpdateBalloon will update an existing balloon device, before or after machine startup
+func (s *service) UpdateBalloon(requestCtx context.Context, req *proto.UpdateBalloonRequest) (*empty.Empty, error) {
+	defer logPanicAndDie(s.logger)
+
+	err := s.waitVMReady()
+	if err != nil {
+		s.logger.WithError(err).Error()
+		return nil, err
+	}
+
+	s.logger.Infof("Updating balloon memory size, the new amount memory is %d MiB", req.AmountMib)
+	if err := s.machine.UpdateBalloon(requestCtx, req.AmountMib); err != nil {
+		err = errors.Wrap(err, "failed to update memory balloon")
+		s.logger.WithError(err).Error()
+		return nil, err
+	}
+
+	return &empty.Empty{}, nil
+}
+
+// GetBalloonStats will return the latest balloon device statistics, only if enabled pre-boot.
+func (s *service) GetBalloonStats(requestCtx context.Context, req *proto.GetBalloonStatsRequest) (*proto.GetBalloonStatsResponse, error) {
+	defer logPanicAndDie(s.logger)
+
+	err := s.waitVMReady()
+	if err != nil {
+		s.logger.WithError(err).Error()
+		return nil, err
+	}
+
+	s.logger.Info("Getting statistics for the balloon device")
+	balloonStats, err := s.machine.GetBalloonStats(requestCtx)
+	if err != nil {
+		err = errors.Wrap(err, "failed to get balloon statistics")
+		s.logger.WithError(err).Error()
+		return nil, err
+	}
+
+	if balloonStats.ActualMib == nil ||
+		balloonStats.ActualPages == nil ||
+		balloonStats.TargetMib == nil ||
+		balloonStats.TargetPages == nil {
+		return nil, errors.Errorf("One of BalloonStats properties is nil, please check %+v: ", balloonStats)
+	}
+
+	resp := &proto.GetBalloonStatsResponse{
+		ActualMib:          *balloonStats.ActualMib,
+		ActualPages:        *balloonStats.ActualPages,
+		AvailableMemory:    balloonStats.AvailableMemory,
+		DiskCaches:         balloonStats.DiskCaches,
+		FreeMemory:         balloonStats.FreeMemory,
+		HugetlbAllocations: balloonStats.HugetlbAllocations,
+		HugetlbFailures:    balloonStats.HugetlbFailures,
+		MajorFaults:        balloonStats.MajorFaults,
+		MinorFaults:        balloonStats.MinorFaults,
+		SwapIn:             balloonStats.SwapIn,
+		SwapOut:            balloonStats.SwapOut,
+		TargetMib:          *balloonStats.TargetMib,
+		TargetPages:        *balloonStats.TargetPages,
+		TotalMemory:        balloonStats.TotalMemory,
+	}
+
+	s.logger.Info("GetBalloonStatsResponse: ", resp)
+
+	return resp, nil
+}
+
+//UpdateBalloonStats will update an existing balloon device statistics interval, before or after machine startup.
+func (s *service) UpdateBalloonStats(requestCtx context.Context, req *proto.UpdateBalloonStatsRequest) (*empty.Empty, error) {
+	defer logPanicAndDie(s.logger)
+
+	err := s.waitVMReady()
+	if err != nil {
+		s.logger.WithError(err).Error()
+		return nil, err
+	}
+
+	s.logger.Info("updating balloon device statistics interval")
+	if err := s.machine.UpdateBalloonStats(requestCtx, req.StatsPollingIntervals); err != nil {
+		err = errors.Wrap(err, "failed to update balloon device statistics interval")
+		s.logger.WithError(err).Error()
+		return nil, err
+	}
+
+	return &empty.Empty{}, nil
+}
+
 func (s *service) buildVMConfiguration(req *proto.CreateVMRequest) (*firecracker.Config, error) {
 	for _, driveMount := range req.DriveMounts {
 		// Verify the request specified an absolute path for the source/dest of drives.


Test patch:
diff --git a/runtime/drive_handler_test.go b/runtime/drive_handler_test.go
index bcf4aa9..636cfe9 100644
--- a/runtime/drive_handler_test.go
+++ b/runtime/drive_handler_test.go
@@ -95,7 +95,7 @@ func TestContainerStubs(t *testing.T) {
 		mockMachine, err := firecracker.NewMachine(ctx, firecracker.Config{}, firecracker.WithClient(
 			firecracker.NewClient("/path/to/socket", nil, false, firecracker.WithOpsClient(&fctesting.MockClient{
 				PatchGuestDriveByIDFn: func(params *ops.PatchGuestDriveByIDParams) (*ops.PatchGuestDriveByIDNoContent, error) {
-					assert.Equal(t, hostPath, firecracker.StringValue(params.Body.PathOnHost))
+					assert.Equal(t, hostPath, firecracker.StringValue(&params.Body.PathOnHost))
 					return nil, nil
 				},
 			}))))
@@ -240,7 +240,7 @@ func TestDriveMountStubs(t *testing.T) {
 		mockMachine, err := firecracker.NewMachine(ctx, firecracker.Config{}, firecracker.WithClient(
 			firecracker.NewClient("/path/to/socket", nil, false, firecracker.WithOpsClient(&fctesting.MockClient{
 				PatchGuestDriveByIDFn: func(params *ops.PatchGuestDriveByIDParams) (*ops.PatchGuestDriveByIDNoContent, error) {
-					assert.Equal(t, hostPath, firecracker.StringValue(params.Body.PathOnHost))
+					assert.Equal(t, hostPath, firecracker.StringValue(&params.Body.PathOnHost))
 					return nil, nil
 				},
 			}))))
diff --git a/runtime/service_integ_test.go b/runtime/service_integ_test.go
index dfe05cf..01e0a4d 100644
--- a/runtime/service_integ_test.go
+++ b/runtime/service_integ_test.go
@@ -69,6 +69,9 @@ const (
 	numberOfVmsEnvName  = "NUMBER_OF_VMS"
 	defaultNumberOfVms  = 5
 
+	defaultBalloonMemory         = int64(66)
+	defaultStatsPollingIntervals = int64(1)
+
 	containerdSockPathEnvVar = "CONTAINERD_SOCKET"
 )
 
@@ -1282,6 +1285,91 @@ func TestUpdateVMMetadata_Isolated(t *testing.T) {
 	assert.Equalf(t, "45", stdout, "container %q did not emit expected stdout", containerName)
 }
 
+func TestMemoryBalloon_Isolated(t *testing.T) {
+	prepareIntegTest(t)
+	ctx := namespaces.WithNamespace(context.Background(), defaultNamespace)
+
+	numberOfVms := defaultNumberOfVms
+	if str := os.Getenv(numberOfVmsEnvName); str != "" {
+		_, err := strconv.Atoi(str)
+		require.NoError(t, err, "failed to get NUMBER_OF_VMS env")
+	}
+	t.Logf("TestMemoryBalloon_Isolated: will run %d vm's", numberOfVms)
+
+	var vmGroup sync.WaitGroup
+	for i := 0; i < numberOfVms; i++ {
+		vmGroup.Add(1)
+		go func(vmID int) {
+			defer vmGroup.Done()
+
+			tapName := fmt.Sprintf("tap%d", vmID)
+			err := createTapDevice(ctx, tapName)
+			defer deleteTapDevice(ctx, tapName)
+			require.NoError(t, err, "failed to create tap device for vm %d", vmID)
+
+			fcClient, err := newFCControlClient(containerdSockPath)
+			require.NoError(t, err, "failed to create fccontrol client")
+
+			_, err = fcClient.CreateVM(ctx, &proto.CreateVMRequest{
+				VMID: strconv.Itoa(vmID),
+				MachineCfg: &proto.FirecrackerMachineConfiguration{
+					MemSizeMib: 512,
+				},
+				NetworkInterfaces: []*proto.FirecrackerNetworkInterface{
+					{
+						AllowMMDS: true,
+						StaticConfig: &proto.StaticNetworkConfiguration{
+							HostDevName: tapName,
+							MacAddress:  vmIDtoMacAddr(uint(vmID)),
+						},
+					},
+				},
+				BalloonDevice: &proto.FirecrackerBalloonDevice{
+					AmountMib:             defaultBalloonMemory,
+					DeflateOnOom:          true,
+					StatsPollingIntervals: defaultStatsPollingIntervals,
+				},
+			})
+			require.NoError(t, err, "failed to create vm")
+
+			// Test UpdateBalloon correctly updates amount of memory for the balloon device
+			vmIDStr := strconv.Itoa(vmID)
+			newAmountMib := int64(50)
+			_, err = fcClient.UpdateBalloon(ctx, &proto.UpdateBalloonRequest{
+				VMID:      vmIDStr,
+				AmountMib: newAmountMib,
+			})
+			require.NoError(t, err, "failed to update balloon's AmountMib for VM %d", vmID)
+
+			expectedBalloonDevice := &proto.FirecrackerBalloonDevice{
+				AmountMib:             newAmountMib,
+				DeflateOnOom:          true,
+				StatsPollingIntervals: defaultStatsPollingIntervals,
+			}
+
+			// Test GetBalloonConfig gets correct configuration for the balloon device
+			resp, err := fcClient.GetBalloonConfig(ctx, &proto.GetBalloonConfigRequest{VMID: vmIDStr})
+			require.NoError(t, err, "failed to get balloon configuration for VM %d", vmID)
+			require.Equal(t, resp.BalloonConfig, expectedBalloonDevice)
+
+			// Test GetBalloonStats gets correct balloon statistics for the balloon device
+			balloonStatResp, err := fcClient.GetBalloonStats(ctx, &proto.GetBalloonStatsRequest{VMID: vmIDStr})
+			require.NoError(t, err, "failed to get balloon statistics for VM %d", vmID)
+			require.Equal(t, newAmountMib, balloonStatResp.TargetMib)
+
+			// Test UpdateBalloonStats correctly updates statistics polling interval for the balloon device
+			newStatsPollingIntervals := int64(6)
+			_, err = fcClient.UpdateBalloonStats(ctx, &proto.UpdateBalloonStatsRequest{VMID: vmIDStr, StatsPollingIntervals: newStatsPollingIntervals})
+			require.NoError(t, err, "failed to update balloon's statistics polling interval for VM %d", vmID)
+
+			balloonConfigResp, err := fcClient.GetBalloonConfig(ctx, &proto.GetBalloonConfigRequest{VMID: vmIDStr})
+			require.NoError(t, err, "failed to get balloon configuration for VM %d", vmID)
+			require.Equal(t, newStatsPollingIntervals, balloonConfigResp.BalloonConfig.StatsPollingIntervals)
+		}(i)
+	}
+	vmGroup.Wait()
+}
+
 func exitCode(err *exec.ExitError) int {
 	if status, ok := err.Sys().(syscall.WaitStatus); ok {
 		// As like Go 1.12's ExitStatus and WEXITSTATUS()