Skip to content

Commit

Permalink
Implemented basic Pause/Resume for orchestrator. Augmented ctriface a…
Browse files Browse the repository at this point in the history
…nd orch tests. Currently using pause_resume branch on ustiugov fork of fccd.

Signed-off-by: Plamen Petrov <plamb0brt@gmail.com>
  • Loading branch information
plamenmpetrov committed Jun 17, 2020
1 parent 86ddb87 commit c9b3c23
Show file tree
Hide file tree
Showing 7 changed files with 241 additions and 3 deletions.
4 changes: 3 additions & 1 deletion ctriface/go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,10 @@ module github.com/ustiugov/fccd-orchestrator/ctriface

go 1.13

replace github.com/firecracker-microvm/firecracker-containerd => github.com/ustiugov/firecracker-containerd v0.0.0-20200617123207-cff37815af4e

require (
github.com/containerd/containerd v1.3.3
github.com/containerd/containerd v1.3.5-0.20200521195814-e655edce10c9
github.com/davecgh/go-spew v1.1.1
github.com/firecracker-microvm/firecracker-containerd v0.0.0-20200331220105-afedbc74f5ee
github.com/pkg/errors v0.9.1
Expand Down
38 changes: 38 additions & 0 deletions ctriface/go.sum

Large diffs are not rendered by default.

30 changes: 30 additions & 0 deletions ctriface/iface.go
Original file line number Diff line number Diff line change
Expand Up @@ -434,3 +434,33 @@ func (o *Orchestrator) setupCloseHandler() {
os.Exit(0)
}()
}

// PauseVM Pauses a VM
func (o *Orchestrator) PauseVM(ctx context.Context, vmID string) (string, error) {
logger := log.WithFields(log.Fields{"vmID": vmID})
logger.Debug("Orchestrator received PauseVM")

ctx = namespaces.WithNamespace(ctx, namespaceName)

if _, err := o.fcClient.PauseVM(ctx, &proto.PauseVMRequest{VMID: vmID}); err != nil {
logger.Warn("failed to pause the VM: ", err)
return "Pausing VM " + vmID + " failed", err
}

return "VM " + vmID + " paused successfully", nil
}

// ResumeVM Resumes a VM
func (o *Orchestrator) ResumeVM(ctx context.Context, vmID string) (string, error) {
logger := log.WithFields(log.Fields{"vmID": vmID})
logger.Debug("Orchestrator received ResumeVM")

ctx = namespaces.WithNamespace(ctx, namespaceName)

if _, err := o.fcClient.ResumeVM(ctx, &proto.ResumeVMRequest{VMID: vmID}); err != nil {
logger.Warn("failed to pause the VM: ", err)
return "Resuming VM " + vmID + " failed", err
}

return "VM " + vmID + " resumed successfully", nil
}
111 changes: 111 additions & 0 deletions ctriface/iface_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,38 @@ func TestStartStopSerial(t *testing.T) {
orch.Cleanup()
}

func TestPauseResumeSerial(t *testing.T) {
log.SetFormatter(&log.TextFormatter{
TimestampFormat: ctrdlog.RFC3339NanoFixed,
FullTimestamp: true,
})
//log.SetReportCaller(true) // FIXME: make sure it's false unless debugging

log.SetOutput(os.Stdout)

log.SetLevel(log.InfoLevel)

testTimeout := 120 * time.Second
ctx, cancel := context.WithTimeout(namespaces.WithNamespace(context.Background(), namespaceName), testTimeout)
defer cancel()

orch := NewOrchestrator("devmapper", 1, true)

message, _, err := orch.StartVM(ctx, "test_vmID", "ustiugov/helloworld:runner_workload")
require.NoError(t, err, "Failed to start VM, "+message)

message, err = orch.PauseVM(ctx, "test_vmID")
require.NoError(t, err, "Failed to pause VM, "+message)

message, err = orch.ResumeVM(ctx, "test_vmID")
require.NoError(t, err, "Failed to resume VM, "+message)

message, err = orch.StopSingleVM(ctx, "test_vmID")
require.NoError(t, err, "Failed to stop VM, "+message)

orch.Cleanup()
}

func TestStartStopParallel(t *testing.T) {
log.SetFormatter(&log.TextFormatter{
TimestampFormat: ctrdlog.RFC3339NanoFixed,
Expand Down Expand Up @@ -72,6 +104,85 @@ func TestStartStopParallel(t *testing.T) {
vmGroup.Wait()
}

{
var vmGroup sync.WaitGroup
for i := 0; i < vmNum; i++ {
vmGroup.Add(1)
go func(i int) {
defer vmGroup.Done()
vmID := fmt.Sprintf("test_%d", i)
message, err := orch.StopSingleVM(ctx, vmID)
require.NoError(t, err, "Failed to stop VM, "+message)
}(i)
}
vmGroup.Wait()
}

orch.Cleanup()
}

func TestPauseResumeParallel(t *testing.T) {
log.SetFormatter(&log.TextFormatter{
TimestampFormat: ctrdlog.RFC3339NanoFixed,
FullTimestamp: true,
})
//log.SetReportCaller(true) // FIXME: make sure it's false unless debugging

log.SetOutput(os.Stdout)

log.SetLevel(log.InfoLevel)

testTimeout := 120 * time.Second
ctx, cancel := context.WithTimeout(namespaces.WithNamespace(context.Background(), namespaceName), testTimeout)
defer cancel()

vmNum := 10
orch := NewOrchestrator("devmapper", vmNum, true)

{
var vmGroup sync.WaitGroup
for i := 0; i < vmNum; i++ {
vmGroup.Add(1)
go func(i int) {
defer vmGroup.Done()
vmID := fmt.Sprintf("test_%d", i)
message, _, err := orch.StartVM(ctx, vmID, "ustiugov/helloworld:runner_workload")
require.NoError(t, err, "Failed to start VM, "+message)
}(i)
}
vmGroup.Wait()
}


{
var vmGroup sync.WaitGroup
for i := 0; i < vmNum; i++ {
vmGroup.Add(1)
go func(i int) {
defer vmGroup.Done()
vmID := fmt.Sprintf("test_%d", i)
message, err := orch.PauseVM(ctx, vmID)
require.NoError(t, err, "Failed to pause VM, "+message)
}(i)
}
vmGroup.Wait()
}

{
var vmGroup sync.WaitGroup
for i := 0; i < vmNum; i++ {
vmGroup.Add(1)
go func(i int) {
defer vmGroup.Done()
vmID := fmt.Sprintf("test_%d", i)
message, err := orch.ResumeVM(ctx, vmID)
require.NoError(t, err, "Failed to resume VM, "+message)
}(i)
}
vmGroup.Wait()
}


{
var vmGroup sync.WaitGroup
for i := 0; i < vmNum; i++ {
Expand Down
32 changes: 32 additions & 0 deletions fccd-orchestrator_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ import (
"os"
"sync"
"testing"
"fmt"

ctrdlog "github.com/containerd/containerd/log"
log "github.com/sirupsen/logrus"
Expand Down Expand Up @@ -61,6 +62,37 @@ func TestMain(m *testing.M) {
os.Exit(ret)
}

func TestSendToFunctionPauseResumeSerial(t *testing.T) {
fID := "pause_resume"
imageName := "ustiugov/helloworld:runner_workload"
funcPool = NewFuncPool(false, 0, 0, true)

resp, err := funcPool.Serve(context.Background(), fID, imageName, "world")
require.NoError(t, err, "Function returned error on 1st run")
require.Equal(t, resp.IsColdStart, true)
require.Equal(t, resp.Payload, "Hello, world!")

// Pause VM here
_, err = orch.PauseVM(context.Background(), fmt.Sprintf(fID+"_0"))
require.NoError(t, err, "Error when pausing VM")

//timeout_ctx, _ := context.WithTimeout(context.Background(), 30*time.Second)
//resp, err = funcPool.Serve(timeout_ctx, fID, imageName, "world")
//require.Error(t, err, "Function did not time out on 2nd run")
//require.Equal(t, resp.Payload, "")

// Resume VM here
_, err = orch.ResumeVM(context.Background(), fmt.Sprintf(fID+"_0"))
require.NoError(t, err, "Error when resuming VM")

resp, err = funcPool.Serve(context.Background(), fID, imageName, "world")
require.NoError(t, err, "Function returned error on 3rd run")
require.Equal(t, resp.Payload, "Hello, world!")

message, err := funcPool.RemoveInstance(fID, imageName)
require.NoError(t, err, "Function returned error, "+message)
}

func TestSendToFunctionSerial(t *testing.T) {
fID := "0"
imageName := "ustiugov/helloworld:runner_workload"
Expand Down
6 changes: 4 additions & 2 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,14 @@ go 1.13
// Workaround for github.com/containerd/containerd issue #3031
replace github.com/docker/distribution v2.7.1+incompatible => github.com/docker/distribution v2.7.1-0.20190205005809-0d3efadf0154+incompatible

replace github.com/firecracker-microvm/firecracker-containerd => github.com/ustiugov/firecracker-containerd v0.0.0-20200617123207-cff37815af4e

require (
github.com/containerd/containerd v1.3.3
github.com/containerd/containerd v1.3.5-0.20200521195814-e655edce10c9
github.com/golang/protobuf v1.3.3
github.com/sirupsen/logrus v1.5.0
github.com/stretchr/testify v1.5.1
github.com/ustiugov/fccd-orchestrator/ctriface v0.0.0-20200609102119-d41874d1bf16
github.com/ustiugov/fccd-orchestrator/ctriface v0.0.0-20200617140736-3c8f0728840a
github.com/ustiugov/fccd-orchestrator/misc v0.0.0-20200608162316-88962af36173
github.com/ustiugov/fccd-orchestrator/proto v0.0.0-20200421101715-3d8808b0d980
golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a
Expand Down
23 changes: 23 additions & 0 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,8 @@ github.com/containerd/containerd v1.3.3 h1:LoIzb5y9x5l8VKAlyrbusNPXqBY0+kviRloxF
github.com/containerd/containerd v1.3.3/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA=
github.com/containerd/containerd v1.3.4 h1:3o0smo5SKY7H6AJCmJhsnCjR2/V2T8VmiHt7seN2/kI=
github.com/containerd/containerd v1.3.4/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA=
github.com/containerd/containerd v1.3.5-0.20200521195814-e655edce10c9 h1:IN459mykxw2bLTRVXUZ7VV+tnrjmeF3wf5awZvrFz14=
github.com/containerd/containerd v1.3.5-0.20200521195814-e655edce10c9/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA=
github.com/containerd/continuity v0.0.0-20181027224239-bea7585dbfac/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y=
github.com/containerd/continuity v0.0.0-20190426062206-aaeac12a7ffc/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y=
github.com/containerd/continuity v0.0.0-20200413184840-d3ef23f19fbb h1:nXPkFq8X1a9ycY3GYQpFNxHh3j2JgY7zDZfq2EXMIzk=
Expand Down Expand Up @@ -271,6 +273,7 @@ github.com/syndtr/gocapability v0.0.0-20170704070218-db04d3cc01c8/go.mod h1:hkRG
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/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk=
github.com/tv42/httpunix v0.0.0-20191220191345-2ba4b9c3382c/go.mod h1:hzIxponao9Kjc7aWznkXaL4U4TWaDSs8zcsY4Ka08nM=
github.com/urfave/cli v0.0.0-20171014202726-7bc6a0acffa5/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA=
github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA=
github.com/ustiugov/fccd-orchestrator v0.0.0-20200416160505-409015e84eac/go.mod h1:stbdPtf4fPytuyUsKEUdDsv1CoCSpG6u2XxypGTonXs=
Expand Down Expand Up @@ -315,6 +318,10 @@ github.com/ustiugov/fccd-orchestrator/ctriface v0.0.0-20200608162316-88962af3617
github.com/ustiugov/fccd-orchestrator/ctriface v0.0.0-20200608162316-88962af36173/go.mod h1:xjaOtN27WDXTlQ1Ujpru/baNX+3XXwY53+b+mk5m9Jk=
github.com/ustiugov/fccd-orchestrator/ctriface v0.0.0-20200609102119-d41874d1bf16 h1:PTvwGSv8KwODGYNAt1aGvUUXvl4mJdDbZUMSpKgl2mI=
github.com/ustiugov/fccd-orchestrator/ctriface v0.0.0-20200609102119-d41874d1bf16/go.mod h1:rGn/x04TzhJqokIGKGSPxwzxWqwK+QaiP1Vdb5xGnbk=
github.com/ustiugov/fccd-orchestrator/ctriface v0.0.0-20200617111938-6765de2430e3 h1:TohrYEnFHRbHanArYuwnM9dvwnX5JPIlgORWAaOh1+0=
github.com/ustiugov/fccd-orchestrator/ctriface v0.0.0-20200617111938-6765de2430e3/go.mod h1:zXFaobRENyOS+0SF/vMrudWmR59MOXN3ZSzQSeo/UVw=
github.com/ustiugov/fccd-orchestrator/ctriface v0.0.0-20200617140736-3c8f0728840a h1:skgpk4eSrJ7a6tmeCSZMBd0nRS3KXyBAM08aEgtSz8c=
github.com/ustiugov/fccd-orchestrator/ctriface v0.0.0-20200617140736-3c8f0728840a/go.mod h1:YTBWO4vRBnp9WWaoSPwLekWS3XwxXVWqO6IO6DQvt48=
github.com/ustiugov/fccd-orchestrator/misc v0.0.0-20200416161510-f6f32fa5d52b h1:HAh2FBZ0QkBGxU/llIVVOhfnqCPEkE353FpZg7Y6sh0=
github.com/ustiugov/fccd-orchestrator/misc v0.0.0-20200416161510-f6f32fa5d52b/go.mod h1:tPZXBU39WgZYegI7Cxm6k2434V9WR/4xyuTBK0MrlBw=
github.com/ustiugov/fccd-orchestrator/misc v0.0.0-20200417111927-c9f33db90a77/go.mod h1:WlEt9PMeV51HejLsw+9EIbgmGMRKyl937AROL/oAOCo=
Expand Down Expand Up @@ -348,6 +355,8 @@ github.com/ustiugov/fccd-orchestrator/proto v0.0.0-20200416161917-c9cd3cf6dbcf h
github.com/ustiugov/fccd-orchestrator/proto v0.0.0-20200416161917-c9cd3cf6dbcf/go.mod h1:aUY+GlW8TqiPIl+pGzjweddprqDLEQyBPNBtbWGieXo=
github.com/ustiugov/fccd-orchestrator/proto v0.0.0-20200421101715-3d8808b0d980 h1:5aODwsQUaVEdhQOtQHWkFdJpW0AvGjxNrozcD/v4XZY=
github.com/ustiugov/fccd-orchestrator/proto v0.0.0-20200421101715-3d8808b0d980/go.mod h1:aUY+GlW8TqiPIl+pGzjweddprqDLEQyBPNBtbWGieXo=
github.com/ustiugov/firecracker-containerd v0.0.0-20200617123207-cff37815af4e h1:5aqGKekpTIwAmZKDSvyT5wzSJJtDnJfhS7PRUiNd9lw=
github.com/ustiugov/firecracker-containerd v0.0.0-20200617123207-cff37815af4e/go.mod h1:348NgoXqABsXbb2M0gaEnawDfLQd5xhjeA+HpS0TSzU=
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=
Expand All @@ -358,6 +367,7 @@ github.com/vishvananda/netns v0.0.0-20191106174202-0a2b9b5464df/go.mod h1:JP3t17
github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU=
github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ=
github.com/xeipuuv/gojsonschema v0.0.0-20180618132009-1d523034197f/go.mod h1:5yf86TLmAcydyeJq5YvxkGPE2fm/u4myDekKRoLuqhs=
github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
go.etcd.io/bbolt v1.3.1-etcd.8 h1:6J7QAKqfFBGnU80KRnuQxfjjeE5xAGE/qB810I3FQHQ=
go.etcd.io/bbolt v1.3.1-etcd.8/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU=
go.mongodb.org/mongo-driver v1.0.3/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM=
Expand All @@ -372,11 +382,15 @@ golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACk
golang.org/x/crypto v0.0.0-20190320223903-b7391e95e576/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20190617133340-57b3e21c3d56/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/lint v0.0.0-20180702182130-06c8688daad7/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=
golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=
golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
Expand All @@ -393,15 +407,19 @@ golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn
golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297 h1:k7pJ2yAPLPgbskkFdhRCsA77k2fySZ1zf2zCjvQCiIM=
golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20200226121028-0de0cce0169b h1:0mm1VjtFUOIlE1SbDlwjYaDxZVDP2S5ou6y0gSgXHu8=
golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20190423024810-112230192c58 h1:8gQV6CLnAEikrhgkHFbMAEhagSSnXWGV915qUMm9mrU=
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a h1:WXEvlFVvvGxCJLG6REjsT03iWnKLEWinaScsxF2Vm2o=
golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
Expand Down Expand Up @@ -437,6 +455,11 @@ golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3
golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
golang.org/x/tools v0.0.0-20190614205625-5aca471b1d59/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
golang.org/x/tools v0.0.0-20190617190820-da514acc4774/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
golang.org/x/tools v0.0.0-20200615222825-6aa8f57aacd9/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
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=
google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
Expand Down

0 comments on commit c9b3c23

Please sign in to comment.