Skip to content

Commit b912042

Browse files
authored
Merge pull request #21 from xibz/logging_file
flags log-stdout-file and log-stderr-file are optional
2 parents 8b22e08 + 0f1f56b commit b912042

File tree

8 files changed

+219
-266
lines changed

8 files changed

+219
-266
lines changed

cmd/firectl/main.go

Lines changed: 52 additions & 94 deletions
Original file line numberDiff line numberDiff line change
@@ -19,12 +19,10 @@ import (
1919
"errors"
2020
"fmt"
2121
"os"
22-
"os/exec"
2322
"strconv"
2423
"strings"
2524

2625
"github.com/firecracker-microvm/firecracker-go-sdk"
27-
"github.com/hashicorp/go-multierror"
2826
"github.com/jessevdk/go-flags"
2927
log "github.com/sirupsen/logrus"
3028
)
@@ -39,6 +37,10 @@ const (
3937
consoleFile = "file"
4038
// consoleNone indicates that the machine's console IO should be discarded
4139
consoleNone = "none"
40+
41+
// executableMask is the mask needed to check whether or not a file's
42+
// permissions are executable.
43+
executableMask = 0111
4244
)
4345

4446
func parseBlockDevices(entries []string) ([]firecracker.BlockDevice, error) {
@@ -104,27 +106,24 @@ func parseVsocks(devices []string) ([]firecracker.VsockDevice, error) {
104106
}
105107

106108
type options struct {
107-
FcBinary string `long:"firecracker-binary" description:"Path to firecracker binary"`
108-
FcConsole string `long:"firecracker-console" description:"Console type (stdio|file|xterm|none)" default:"stdio"`
109-
FcKernelImage string `long:"kernel" description:"Path to the kernel image" default:"./vmlinux"`
110-
FcKernelCmdLine string `long:"kernel-opts" description:"Kernel commandline" default:"ro console=ttyS0 noapic reboot=k panic=1 pci=off nomodules"`
111-
FcRootDrivePath string `long:"root-drive" description:"Path to root disk image"`
112-
FcRootPartUUID string `long:"root-partition" description:"Root partition UUID"`
113-
FcAdditionalDrives []string `long:"add-drive" description:"Path to additional drive, suffixed with :ro or :rw, can be specified multiple times"`
114-
FcNicConfig string `long:"tap-device" description:"NIC info, specified as DEVICE/MAC"`
115-
FcVsockDevices []string `long:"vsock-device" description:"Vsock interface, specified as PATH:CID. Multiple OK"`
116-
FcLogFifo string `long:"vmm-log-fifo" description:"FIFO for firecracker logs"`
117-
FcLogLevel string `long:"log-level" description:"vmm log level" default:"Debug"`
118-
FcLogStdoutFilePath string `long:"log-stdout-file" description:"Specifies where stdout logs should be placed"`
119-
FcLogStderrFilePath string `long:"log-stderr-file" description:"Specifies where stderr logs should be placed"`
120-
FcMetricsFifo string `long:"metrics-fifo" description:"FIFO for firecracker metrics"`
121-
FcDisableHt bool `long:"disable-hyperthreading" short:"t" description:"Disable CPU Hyperthreading"`
122-
FcCPUCount int64 `long:"ncpus" short:"c" description:"Number of CPUs" default:"1"`
123-
FcCPUTemplate string `long:"cpu-template" description:"Firecracker CPU Template (C3 or T2)"`
124-
FcMemSz int64 `long:"memory" short:"m" description:"VM memory, in MiB" default:"512"`
125-
FcMetadata string `long:"metadata" description:"Firecracker Meatadata for MMDS (json)"`
126-
Debug bool `long:"debug" short:"d" description:"Enable debug output"`
127-
Help bool `long:"help" short:"h" description:"Show usage"`
109+
FcBinary string `long:"firecracker-binary" description:"Path to firecracker binary"`
110+
FcKernelImage string `long:"kernel" description:"Path to the kernel image" default:"./vmlinux"`
111+
FcKernelCmdLine string `long:"kernel-opts" description:"Kernel commandline" default:"ro console=ttyS0 noapic reboot=k panic=1 pci=off nomodules"`
112+
FcRootDrivePath string `long:"root-drive" description:"Path to root disk image"`
113+
FcRootPartUUID string `long:"root-partition" description:"Root partition UUID"`
114+
FcAdditionalDrives []string `long:"add-drive" description:"Path to additional drive, suffixed with :ro or :rw, can be specified multiple times"`
115+
FcNicConfig string `long:"tap-device" description:"NIC info, specified as DEVICE/MAC"`
116+
FcVsockDevices []string `long:"vsock-device" description:"Vsock interface, specified as PATH:CID. Multiple OK"`
117+
FcLogFifo string `long:"vmm-log-fifo" description:"FIFO for firecracker logs"`
118+
FcLogLevel string `long:"log-level" description:"vmm log level" default:"Debug"`
119+
FcMetricsFifo string `long:"metrics-fifo" description:"FIFO for firecracker metrics"`
120+
FcDisableHt bool `long:"disable-hyperthreading" short:"t" description:"Disable CPU Hyperthreading"`
121+
FcCPUCount int64 `long:"ncpus" short:"c" description:"Number of CPUs" default:"1"`
122+
FcCPUTemplate string `long:"cpu-template" description:"Firecracker CPU Template (C3 or T2)"`
123+
FcMemSz int64 `long:"memory" short:"m" description:"VM memory, in MiB" default:"512"`
124+
FcMetadata string `long:"metadata" description:"Firecracker Meatadata for MMDS (json)"`
125+
Debug bool `long:"debug" short:"d" description:"Enable debug output"`
126+
Help bool `long:"help" short:"h" description:"Show usage"`
128127
}
129128

130129
func main() {
@@ -201,7 +200,6 @@ func main() {
201200
AdditionalDrives: blockDevices,
202201
NetworkInterfaces: NICs,
203202
VsockDevices: vsocks,
204-
Console: opts.FcConsole,
205203
CPUCount: opts.FcCPUCount,
206204
CPUTemplate: firecracker.CPUTemplate(opts.FcCPUTemplate),
207205
HtEnabled: !opts.FcDisableHt,
@@ -218,16 +216,38 @@ func main() {
218216
vmmCtx, vmmCancel := context.WithCancel(ctx)
219217
defer vmmCancel()
220218

221-
cmd, cleanup, err := buildCommand(vmmCtx, fcCfg.SocketPath, opts)
222-
if err != nil {
223-
log.Fatalf("Failed to build command: %v", err)
219+
machineOpts := []firecracker.Opt{
220+
firecracker.WithLogger(log.NewEntry(logger)),
224221
}
225-
defer cleanup()
226222

227-
m, err := firecracker.NewMachine(fcCfg,
228-
firecracker.WithLogger(log.NewEntry(logger)),
229-
firecracker.WithProcessRunner(cmd),
230-
)
223+
if len(opts.FcBinary) != 0 {
224+
finfo, err := os.Stat(opts.FcBinary)
225+
if os.IsNotExist(err) {
226+
log.Fatalf("Binary, %q, does not exist: %v", opts.FcBinary, err)
227+
}
228+
229+
if err != nil {
230+
log.Fatalf("Failed to stat binary, %q: %v", opts.FcBinary, err)
231+
}
232+
233+
if finfo.IsDir() {
234+
log.Fatalf("Binary, %q, is a directory", opts.FcBinary)
235+
} else if finfo.Mode()&executableMask == 0 {
236+
log.Fatalf("Binary, %q, is not executable. Check permissions of binary", opts.FcBinary)
237+
}
238+
239+
cmd := firecracker.VMCommandBuilder{}.
240+
WithBin(opts.FcBinary).
241+
WithSocketPath(fcCfg.SocketPath).
242+
WithStdin(os.Stdin).
243+
WithStdout(os.Stdout).
244+
WithStderr(os.Stderr).
245+
Build(ctx)
246+
247+
machineOpts = append(machineOpts, firecracker.WithProcessRunner(cmd))
248+
}
249+
250+
m, err := firecracker.NewMachine(fcCfg, machineOpts...)
231251
if err != nil {
232252
log.Fatalf("Failed creating machine: %s", err)
233253
}
@@ -254,65 +274,3 @@ func main() {
254274
}
255275
log.Printf("startVMM was happy")
256276
}
257-
258-
func buildCommand(ctx context.Context, socketPath string, opts options) (*exec.Cmd, func() error, error) {
259-
var cmd *exec.Cmd
260-
b := firecracker.VMCommandBuilder{}
261-
262-
fn := func() error {
263-
return nil
264-
}
265-
266-
switch opts.FcConsole {
267-
case consoleXterm:
268-
cmd = b.WithBin(terminalProgram).
269-
AddArgs("-e", opts.FcBinary, "--api-sock", socketPath).
270-
Build(ctx)
271-
case consoleStdio:
272-
cmd = b.WithBin(opts.FcBinary).
273-
WithSocketPath(socketPath).
274-
WithStdin(os.Stdin).
275-
WithStdout(os.Stdout).
276-
WithStderr(os.Stderr).
277-
Build(ctx)
278-
case consoleFile:
279-
stdout, err := generateLogFile(opts.FcLogStdoutFilePath)
280-
if err != nil {
281-
return nil, nil, err
282-
}
283-
284-
stderr, err := generateLogFile(opts.FcLogStderrFilePath)
285-
if err != nil {
286-
return nil, nil, err
287-
}
288-
289-
fn = func() error {
290-
var merr *multierror.Error
291-
if err := stdout.Close(); err != nil {
292-
merr = multierror.Append(merr, err)
293-
}
294-
295-
if err := stderr.Close(); err != nil {
296-
merr = multierror.Append(merr, err)
297-
}
298-
299-
return merr.ErrorOrNil()
300-
}
301-
302-
cmd = b.WithBin(opts.FcBinary).
303-
WithSocketPath(socketPath).
304-
WithStdout(stdout).
305-
WithStderr(stderr).
306-
Build(ctx)
307-
default:
308-
cmd = b.WithBin(opts.FcBinary).
309-
WithSocketPath(socketPath).
310-
Build(ctx)
311-
}
312-
313-
return cmd, fn, nil
314-
}
315-
316-
func generateLogFile(filename string) (*os.File, error) {
317-
return os.OpenFile(filename, os.O_CREATE|os.O_APPEND|os.O_WRONLY, 0644)
318-
}

cmd/firectl/main_test.go

Lines changed: 0 additions & 165 deletions
This file was deleted.

command_builder.go

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,15 @@ package firecracker
1616
import (
1717
"context"
1818
"io"
19+
"os"
1920
"os/exec"
2021
)
2122

2223
var defaultFirecrackerVMMCommandBuilder = VMCommandBuilder{}.
23-
WithBin("firecracker")
24+
WithBin("firecracker").
25+
WithStdin(os.Stdin).
26+
WithStdout(os.Stdout).
27+
WithStderr(os.Stderr)
2428

2529
// VMCommandBuilder is a command builder that builds a command specific
2630
// to the firecracker command using exec.Command.

0 commit comments

Comments
 (0)