Skip to content

Commit 58dcb44

Browse files
committed
Added support for creating and loading snapshots of VM.
Notes: 1. Uses logging-only branch from ustiugov/firecracker-go-sdk 2. Firecracker logs path is hard-coded. Signed-off-by: Plamen Petrov <[email protected]>
1 parent 6856f1b commit 58dcb44

File tree

9 files changed

+566
-26
lines changed

9 files changed

+566
-26
lines changed

firecracker-control/local.go

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -499,3 +499,60 @@ func (s *local) ResumeVM(ctx context.Context, req *proto.ResumeVMRequest) (*empt
499499

500500
return resp, nil
501501
}
502+
503+
// CreateSnapshot Creates a snapshot of a VM
504+
func (s *local) CreateSnapshot(ctx context.Context, req *proto.CreateSnapshotRequest) (*empty.Empty, error) {
505+
client, err := s.shimFirecrackerClient(ctx, req.VMID)
506+
if err != nil {
507+
return nil, err
508+
}
509+
510+
defer client.Close()
511+
512+
resp, err := client.CreateSnapshot(ctx, req)
513+
if err != nil {
514+
s.logger.WithError(err).Error()
515+
return nil, err
516+
}
517+
518+
return resp, nil
519+
}
520+
521+
// LoadSnapshot Loads a snapshot of a VM
522+
func (s *local) LoadSnapshot(ctx context.Context, req *proto.LoadSnapshotRequest) (*empty.Empty, error) {
523+
client, err := s.shimFirecrackerClient(ctx, req.VMID)
524+
if err != nil {
525+
return nil, err
526+
}
527+
528+
defer client.Close()
529+
530+
resp, err := client.LoadSnapshot(ctx, req)
531+
if err != nil {
532+
s.logger.WithError(err).Error()
533+
return nil, err
534+
}
535+
536+
return resp, nil
537+
}
538+
539+
// Offload Shuts down a VM started through the firecracker go sdk and deletes
540+
// the corresponding firecracker socket. All of the other resources (shim, other sockets)
541+
// will persist.
542+
func (s *local) Offload(ctx context.Context, req *proto.OffloadRequest) (*empty.Empty, error) {
543+
client, err := s.shimFirecrackerClient(ctx, req.VMID)
544+
if err != nil {
545+
return nil, err
546+
}
547+
548+
defer client.Close()
549+
550+
resp, err := client.Offload(ctx, req)
551+
if err != nil {
552+
s.logger.WithError(err).Error()
553+
return nil, err
554+
}
555+
556+
return resp, nil
557+
}
558+

firecracker-control/service.go

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -106,3 +106,18 @@ func (s *service) ResumeVM(ctx context.Context, req *proto.ResumeVMRequest) (*em
106106
log.G(ctx).Debugf("resume VM request: %+v", req)
107107
return s.local.ResumeVM(ctx, req)
108108
}
109+
110+
func (s *service) LoadSnapshot(ctx context.Context, req *proto.LoadSnapshotRequest) (*empty.Empty, error) {
111+
log.G(ctx).Debugf("load snapshot request: %+v", req)
112+
return s.local.LoadSnapshot(ctx, req)
113+
}
114+
115+
func (s *service) CreateSnapshot(ctx context.Context, req *proto.CreateSnapshotRequest) (*empty.Empty, error) {
116+
log.G(ctx).Debugf("create snapshot request: %+v", req)
117+
return s.local.CreateSnapshot(ctx, req)
118+
}
119+
120+
func (s *service) Offload(ctx context.Context, req *proto.OffloadRequest) (*empty.Empty, error) {
121+
log.G(ctx).Debugf("offload request: %+v", req)
122+
return s.local.Offload(ctx, req)
123+
}

go.mod

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
module github.com/firecracker-microvm/firecracker-containerd
22

3+
replace github.com/firecracker-microvm/firecracker-go-sdk => github.com/ustiugov/firecracker-go-sdk v0.20.1-0.20200625102438-8edf287b0123
4+
35
require (
46
github.com/Microsoft/go-winio v0.4.14 // indirect
57
github.com/StackExchange/wmi v0.0.0-20181212234831-e0a55b97c705 // indirect
@@ -17,7 +19,8 @@ require (
1719
github.com/docker/distribution v2.7.1+incompatible // indirect
1820
github.com/docker/go-events v0.0.0-20170721190031-9461782956ad // indirect
1921
github.com/docker/go-metrics v0.0.0-20181218153428-b84716841b82 // indirect
20-
github.com/firecracker-microvm/firecracker-go-sdk v0.21.1-0.20200811001213-ee1e7c41b7bd
22+
github.com/docker/go-units v0.4.0 // indirect
23+
github.com/firecracker-microvm/firecracker-go-sdk v0.0.0-00010101000000-000000000000
2124
github.com/go-ole/go-ole v1.2.4 // indirect
2225
github.com/godbus/dbus v0.0.0-20181025153459-66d97aec3384 // indirect
2326
github.com/gofrs/uuid v3.3.0+incompatible

go.sum

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -324,6 +324,9 @@ github.com/tv42/httpunix v0.0.0-20191220191345-2ba4b9c3382c h1:u6SKchux2yDvFQnDH
324324
github.com/tv42/httpunix v0.0.0-20191220191345-2ba4b9c3382c/go.mod h1:hzIxponao9Kjc7aWznkXaL4U4TWaDSs8zcsY4Ka08nM=
325325
github.com/urfave/cli v1.20.0 h1:fDqGv3UG/4jbVl/QkFwEdddtEDjh/5Ov6X+0B/3bPaw=
326326
github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA=
327+
github.com/ustiugov/firecracker-go-sdk v0.20.1-0.20200625102438-8edf287b0123 h1:RmVkdn3XSJSVUy/yStvqVJGQ8yw93mUtJn4N+8Aytlw=
328+
github.com/ustiugov/firecracker-go-sdk v0.20.1-0.20200625102438-8edf287b0123/go.mod h1:zyc9BrKGePpNLbQ5y2ZtdzXEfpMJeHPeFNVpyo0S1WQ=
329+
github.com/vektah/gqlparser v1.1.2/go.mod h1:1ycwN7Ij5njmMkPPAOaRFY4rET2Enx7IkVv3vaXspKw=
327330
github.com/vishvananda/netlink v0.0.0-20181108222139-023a6dafdcdf h1:3J37+NPjNyGW/dbfXtj3yWuF9OEepIdGOXRaJGbORV8=
328331
github.com/vishvananda/netlink v0.0.0-20181108222139-023a6dafdcdf/go.mod h1:+SR5DhBJrl6ZM7CoCKvpw5BKroDKQ+PJqOg65H/2ktk=
329332
github.com/vishvananda/netlink v1.1.0 h1:1iyaYNBLmP6L0220aDnYQpo1QEV4t4hJ+xEEhhJH8j0=
@@ -354,13 +357,16 @@ golang.org/x/crypto v0.0.0-20190617133340-57b3e21c3d56 h1:ZpKuNIejY8P0ExLOVyKhb0
354357
golang.org/x/crypto v0.0.0-20190617133340-57b3e21c3d56/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
355358
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550 h1:ObdrDkeb4kJdCP557AjRjq69pTHfNouLtWZG7j9rPN8=
356359
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
360+
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9 h1:psW17arqaxU48Z5kZ0CQnkZWQJsqcURM6tKiBApRjXI=
361+
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
357362
golang.org/x/lint v0.0.0-20180702182130-06c8688daad7/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
358363
golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3 h1:XQyxROzUlZH+WIQwySDgnISgOivlhjIEwaQaJEJrrN0=
359364
golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
360365
golang.org/x/lint v0.0.0-20200302205851-738671d3881b h1:Wh+f8QHJXR411sJR8/vRBTZ7YapZaRvUcLFFJhusH0k=
361366
golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
362367
golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=
363368
golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
369+
golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
364370
golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
365371
golang.org/x/net v0.0.0-20180926154720-4dfa2610cdf3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
366372
golang.org/x/net v0.0.0-20181005035420-146acd28ed58/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
@@ -389,6 +395,8 @@ golang.org/x/sync v0.0.0-20190423024810-112230192c58 h1:8gQV6CLnAEikrhgkHFbMAEha
389395
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
390396
golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e h1:vcxGaoTs7kV8m5Np9uUNQin4BrLOthgV7252N8V+FwY=
391397
golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
398+
golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208 h1:qwRHBd0NqMbJxfbotnDhm2ByMI1Shq4Y6oRJo21SGJA=
399+
golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
392400
golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
393401
golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
394402
golang.org/x/sys v0.0.0-20180928133829-e4b3c5e90611/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
@@ -433,6 +441,8 @@ golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtn
433441
golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
434442
golang.org/x/tools v0.0.0-20200615222825-6aa8f57aacd9 h1:cwgUY+1ja2qxWb2dyaCoixaA66WGWmrijSlxaM+JM/g=
435443
golang.org/x/tools v0.0.0-20200615222825-6aa8f57aacd9/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
444+
golang.org/x/tools v0.0.0-20200708183856-df98bc6d456c h1:Jt8nybBNSGn80qEV8fQLwCam6RQeX4dsxit8if67Sfc=
445+
golang.org/x/tools v0.0.0-20200708183856-df98bc6d456c/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
436446
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
437447
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
438448
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=

proto/firecracker.pb.go

Lines changed: 150 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

proto/firecracker.proto

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,23 @@ enum DriveExposePolicy {
9090
BIND = 1;
9191
}
9292

93+
message CreateSnapshotRequest {
94+
string VMID = 1;
95+
string SnapshotFilePath = 2;
96+
string MemFilePath = 3;
97+
}
98+
99+
message LoadSnapshotRequest {
100+
string VMID = 1;
101+
string SnapshotFilePath = 2;
102+
string MemFilePath = 3;
103+
}
104+
105+
message OffloadRequest {
106+
string VMID = 1;
107+
}
108+
109+
93110
message JailerConfig {
94111
string NetNS = 1;
95112
// List of the physical numbers of the CPUs on which processes in that

proto/service/fccontrol/fccontrol.proto

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,4 +30,13 @@ service Firecracker {
3030

3131
// Resumes a VM
3232
rpc ResumeVM(ResumeVMRequest) returns (google.protobuf.Empty);
33+
34+
// Loads VM from snapshot
35+
rpc LoadSnapshot(LoadSnapshotRequest) returns (google.protobuf.Empty);
36+
37+
// Make a snapshot of a VM
38+
rpc CreateSnapshot(CreateSnapshotRequest) returns (google.protobuf.Empty);
39+
40+
// Offload a snapshotted VM
41+
rpc Offload(OffloadRequest) returns (google.protobuf.Empty);
3342
}

0 commit comments

Comments
 (0)