forked from firecracker-microvm/firectl
-
Notifications
You must be signed in to change notification settings - Fork 0
/
main_test.go
121 lines (100 loc) · 3.18 KB
/
main_test.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License"). You may
// not use this file except in compliance with the License. A copy of the
// License is located at
//
// http://aws.amazon.com/apache2.0/
//
// or in the "license" file accompanying this file. This file is distributed
// on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
// express or implied. See the License for the specific language governing
// permissions and limitations under the License.
package main
import (
"context"
"os"
"os/exec"
"syscall"
"testing"
"time"
models "github.com/firecracker-microvm/firecracker-go-sdk/client/models"
"github.com/firecracker-microvm/firecracker-go-sdk"
client "github.com/firecracker-microvm/firecracker-go-sdk/client"
ops "github.com/firecracker-microvm/firecracker-go-sdk/client/operations"
"github.com/go-openapi/strfmt"
"github.com/sirupsen/logrus"
)
const skipIntegrationTest = "SKIP_INTEG_TEST"
var kernelImagePath = "./vmlinux"
func init() {
if v := os.Getenv("KERNELIMAGE"); len(v) != 0 {
kernelImagePath = v
}
}
func TestFireCTL(t *testing.T) {
if len(os.Getenv(skipIntegrationTest)) > 0 {
t.Skip()
}
const firectlName = "./firectl"
if _, err := os.Stat(firectlName); os.IsNotExist(err) {
t.Fatalf("Missing firectl binary, %s", firectlName)
}
if _, err := os.Stat(kernelImagePath); os.IsNotExist(err) {
t.Fatalf("Missing kernel image, %s", kernelImagePath)
}
const rootDrivePath = "/dev/null"
if _, err := os.Stat(rootDrivePath); os.IsNotExist(err) {
t.Fatalf("Missing root drive, %s", rootDrivePath)
}
ctx := context.Background()
ctlCtx, cancelFn := context.WithTimeout(ctx, 500*time.Millisecond)
defer cancelFn()
const socketpath = "./integration_test.sock"
firectlArgs := []string{
"-s",
socketpath,
"--kernel",
kernelImagePath,
"--root-drive",
rootDrivePath,
}
cmd := exec.CommandContext(ctlCtx, firectlName, firectlArgs...)
if err := cmd.Start(); err != nil {
t.Fatalf("Failed to run command: %v", err)
}
defer func() {
if err := os.Remove(socketpath); err != nil {
t.Log("Failed to remove socket path file")
}
// We signal SIGQUIT to the Firecracker process due to the application
// using SIGQUIT to shutdown with
if err := cmd.Process.Signal(syscall.SIGQUIT); err != nil {
t.Log("Failed to kill firectl process")
}
}()
client := client.NewHTTPClient(strfmt.NewFormats())
transport := firecracker.NewUnixSocketTransport(socketpath, logrus.NewEntry(logrus.New()), false)
client.SetTransport(transport)
valid := false
interval := 50 * time.Millisecond
payload := &models.InstanceInfo{}
for i := 0; i < 10; i++ {
resp, err := client.Operations.DescribeInstance(ops.NewDescribeInstanceParams())
if err != nil {
t.Log("Failed to communicate over socket file:", err)
time.Sleep(interval)
continue
}
payload = resp.Payload
if len(*resp.Payload.State) != 0 &&
*payload.State != models.InstanceInfoStateNotStarted {
valid = true
break
}
time.Sleep(interval)
}
if !valid {
t.Errorf("VM failed to initialize with last state of %q. Can firecracker successfully launch a VM?", *payload.State)
}
}