Skip to content

Commit e79d1e8

Browse files
committed
Expose config to allow for advanced handlers
Exposing the config allows for modification of the machine configuration during the 'Start' method. An example usage of this is using a custom jailer
1 parent dbdcd6d commit e79d1e8

File tree

4 files changed

+50
-50
lines changed

4 files changed

+50
-50
lines changed

handlers.go

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ var ConfigValidationHandler = Handler{
4646
Name: ValidateCfgHandlerName,
4747
Fn: func(ctx context.Context, m *Machine) error {
4848
// ensure that the configuration is valid for the FcInit handlers.
49-
return m.cfg.Validate()
49+
return m.Cfg.Validate()
5050
},
5151
}
5252

@@ -55,12 +55,12 @@ var ConfigValidationHandler = Handler{
5555
var JailerConfigValidationHandler = Handler{
5656
Name: ValidateJailerCfgHandlerName,
5757
Fn: func(ctx context.Context, m *Machine) error {
58-
if m.cfg.JailerCfg == nil {
58+
if m.Cfg.JailerCfg == nil {
5959
return nil
6060
}
6161

6262
hasRoot := false
63-
for _, drive := range m.cfg.Drives {
63+
for _, drive := range m.Cfg.Drives {
6464
if BoolValue(drive.IsRootDevice) {
6565
hasRoot = true
6666
break
@@ -71,27 +71,27 @@ var JailerConfigValidationHandler = Handler{
7171
return fmt.Errorf("A root drive must be present in the drive list")
7272
}
7373

74-
if m.cfg.JailerCfg.ChrootStrategy == nil {
74+
if m.Cfg.JailerCfg.ChrootStrategy == nil {
7575
return fmt.Errorf("ChrootStrategy cannot be nil")
7676
}
7777

78-
if len(m.cfg.JailerCfg.ExecFile) == 0 {
78+
if len(m.Cfg.JailerCfg.ExecFile) == 0 {
7979
return fmt.Errorf("exec file must be specified when using jailer mode")
8080
}
8181

82-
if len(m.cfg.JailerCfg.ID) == 0 {
82+
if len(m.Cfg.JailerCfg.ID) == 0 {
8383
return fmt.Errorf("id must be specified when using jailer mode")
8484
}
8585

86-
if m.cfg.JailerCfg.GID == nil {
86+
if m.Cfg.JailerCfg.GID == nil {
8787
return fmt.Errorf("GID must be specified when using jailer mode")
8888
}
8989

90-
if m.cfg.JailerCfg.UID == nil {
90+
if m.Cfg.JailerCfg.UID == nil {
9191
return fmt.Errorf("UID must be specified when using jailer mode")
9292
}
9393

94-
if m.cfg.JailerCfg.NumaNode == nil {
94+
if m.Cfg.JailerCfg.NumaNode == nil {
9595
return fmt.Errorf("ID must be specified when using jailer mode")
9696
}
9797

@@ -112,8 +112,8 @@ var StartVMMHandler = Handler{
112112
var CreateLogFilesHandler = Handler{
113113
Name: CreateLogFilesHandlerName,
114114
Fn: func(ctx context.Context, m *Machine) error {
115-
logFifoPath := m.cfg.LogFifo
116-
metricsFifoPath := m.cfg.MetricsFifo
115+
logFifoPath := m.Cfg.LogFifo
116+
metricsFifoPath := m.Cfg.MetricsFifo
117117

118118
if len(logFifoPath) == 0 || len(metricsFifoPath) == 0 {
119119
// logging is disabled
@@ -160,7 +160,7 @@ var CreateMachineHandler = Handler{
160160
var CreateBootSourceHandler = Handler{
161161
Name: CreateBootSourceHandlerName,
162162
Fn: func(ctx context.Context, m *Machine) error {
163-
return m.createBootSource(ctx, m.cfg.KernelImagePath, m.cfg.KernelArgs)
163+
return m.createBootSource(ctx, m.Cfg.KernelImagePath, m.Cfg.KernelArgs)
164164
},
165165
}
166166

@@ -169,7 +169,7 @@ var CreateBootSourceHandler = Handler{
169169
var AttachDrivesHandler = Handler{
170170
Name: AttachDrivesHandlerName,
171171
Fn: func(ctx context.Context, m *Machine) error {
172-
return m.attachDrives(ctx, m.cfg.Drives...)
172+
return m.attachDrives(ctx, m.Cfg.Drives...)
173173
},
174174
}
175175

@@ -178,7 +178,7 @@ var AttachDrivesHandler = Handler{
178178
var CreateNetworkInterfacesHandler = Handler{
179179
Name: CreateNetworkInterfacesHandlerName,
180180
Fn: func(ctx context.Context, m *Machine) error {
181-
return m.createNetworkInterfaces(ctx, m.cfg.NetworkInterfaces...)
181+
return m.createNetworkInterfaces(ctx, m.Cfg.NetworkInterfaces...)
182182
},
183183
}
184184

@@ -187,7 +187,7 @@ var CreateNetworkInterfacesHandler = Handler{
187187
var AddVsocksHandler = Handler{
188188
Name: AddVsocksHandlerName,
189189
Fn: func(ctx context.Context, m *Machine) error {
190-
return m.addVsocks(ctx, m.cfg.VsockDevices...)
190+
return m.addVsocks(ctx, m.Cfg.VsockDevices...)
191191
},
192192
}
193193

@@ -234,7 +234,7 @@ type Handlers struct {
234234
// into a single list and running.
235235
func (h Handlers) Run(ctx context.Context, m *Machine) error {
236236
l := HandlerList{}
237-
if !m.cfg.DisableValidation {
237+
if !m.Cfg.DisableValidation {
238238
l = l.Append(h.Validation.list...)
239239
}
240240

jailer.go

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ const (
3535
var (
3636
// ErrMissingJailerConfig will occur when entering jailer logic but the
3737
// jailer config had not been specified.
38-
ErrMissingJailerConfig = fmt.Errorf("JailerConfig was not set for use.")
38+
ErrMissingJailerConfig = fmt.Errorf("jailer config was not set for use")
3939
)
4040

4141
// SeccompLevelValue represents a secure computing level type.
@@ -372,52 +372,52 @@ func LinkFilesHandler(rootfs, kernelImageFileName string) Handler {
372372
return Handler{
373373
Name: LinkFilesToRootFSHandlerName,
374374
Fn: func(ctx context.Context, m *Machine) error {
375-
if m.cfg.JailerCfg == nil {
375+
if m.Cfg.JailerCfg == nil {
376376
return ErrMissingJailerConfig
377377
}
378378

379379
// copy kernel image to root fs
380380
if err := linkFileToRootFS(
381-
m.cfg.JailerCfg,
381+
m.Cfg.JailerCfg,
382382
filepath.Join(rootfs, kernelImageFileName),
383-
m.cfg.KernelImagePath,
383+
m.Cfg.KernelImagePath,
384384
); err != nil {
385385
return err
386386
}
387387

388388
// copy all drives to the root fs
389-
for i, drive := range m.cfg.Drives {
389+
for i, drive := range m.Cfg.Drives {
390390
hostPath := StringValue(drive.PathOnHost)
391391
driveFileName := filepath.Base(hostPath)
392392

393393
if err := linkFileToRootFS(
394-
m.cfg.JailerCfg,
394+
m.Cfg.JailerCfg,
395395
filepath.Join(rootfs, driveFileName),
396396
hostPath,
397397
); err != nil {
398398
return err
399399
}
400400

401-
m.cfg.Drives[i].PathOnHost = String(driveFileName)
401+
m.Cfg.Drives[i].PathOnHost = String(driveFileName)
402402
}
403403

404-
m.cfg.KernelImagePath = kernelImageFileName
404+
m.Cfg.KernelImagePath = kernelImageFileName
405405

406-
for _, fifoPath := range []*string{&m.cfg.LogFifo, &m.cfg.MetricsFifo} {
406+
for _, fifoPath := range []*string{&m.Cfg.LogFifo, &m.Cfg.MetricsFifo} {
407407
if fifoPath == nil || *fifoPath == "" {
408408
continue
409409
}
410410

411411
fileName := filepath.Base(*fifoPath)
412412
if err := linkFileToRootFS(
413-
m.cfg.JailerCfg,
413+
m.Cfg.JailerCfg,
414414
filepath.Join(rootfs, fileName),
415415
*fifoPath,
416416
); err != nil {
417417
return err
418418
}
419419

420-
if err := os.Chown(filepath.Join(rootfs, fileName), *m.cfg.JailerCfg.UID, *m.cfg.JailerCfg.GID); err != nil {
420+
if err := os.Chown(filepath.Join(rootfs, fileName), *m.Cfg.JailerCfg.UID, *m.Cfg.JailerCfg.GID); err != nil {
421421
return err
422422
}
423423

machine.go

Lines changed: 22 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -141,7 +141,7 @@ type Machine struct {
141141
// Handlers holds the set of handlers that are run for validation and start
142142
Handlers Handlers
143143

144-
cfg Config
144+
Cfg Config
145145
client *Client
146146
cmd *exec.Cmd
147147
logger *log.Entry
@@ -209,17 +209,17 @@ type VsockDevice struct {
209209
// SocketPath returns the filesystem path to the socket used for VMM
210210
// communication
211211
func (m *Machine) socketPath() string {
212-
return m.cfg.SocketPath
212+
return m.Cfg.SocketPath
213213
}
214214

215215
// LogFile returns the filesystem path of the VMM log
216216
func (m *Machine) LogFile() string {
217-
return m.cfg.LogFifo
217+
return m.Cfg.LogFifo
218218
}
219219

220220
// LogLevel returns the VMM log level.
221221
func (m *Machine) LogLevel() string {
222-
return m.cfg.LogLevel
222+
return m.Cfg.LogLevel
223223
}
224224

225225
// NewMachine initializes a new Machine instance and performs validation of the
@@ -261,7 +261,7 @@ func NewMachine(ctx context.Context, cfg Config, opts ...Opt) (*Machine, error)
261261
}
262262

263263
m.machineConfig = cfg.MachineCfg
264-
m.cfg = cfg
264+
m.Cfg = cfg
265265

266266
m.logger.Debug("Called NewMachine()")
267267
return m, nil
@@ -309,7 +309,7 @@ func (m *Machine) Wait(ctx context.Context) error {
309309
}
310310

311311
func (m *Machine) addVsocks(ctx context.Context, vsocks ...VsockDevice) error {
312-
for _, dev := range m.cfg.VsockDevices {
312+
for _, dev := range m.Cfg.VsockDevices {
313313
if err := m.addVsock(ctx, dev); err != nil {
314314
return err
315315
}
@@ -342,7 +342,7 @@ func (m *Machine) attachDrives(ctx context.Context, drives ...models.Drive) erro
342342

343343
// startVMM starts the firecracker vmm process and configures logging.
344344
func (m *Machine) startVMM(ctx context.Context) error {
345-
m.logger.Printf("Called startVMM(), setting up a VMM on %s", m.cfg.SocketPath)
345+
m.logger.Printf("Called startVMM(), setting up a VMM on %s", m.Cfg.SocketPath)
346346

347347
errCh := make(chan error)
348348

@@ -352,7 +352,7 @@ func (m *Machine) startVMM(ctx context.Context) error {
352352
close(m.exitCh)
353353
return err
354354
}
355-
m.logger.Debugf("VMM started socket path is %s", m.cfg.SocketPath)
355+
m.logger.Debugf("VMM started socket path is %s", m.Cfg.SocketPath)
356356

357357
go func() {
358358
if err := m.cmd.Wait(); err != nil {
@@ -361,9 +361,9 @@ func (m *Machine) startVMM(ctx context.Context) error {
361361
m.logger.Printf("firecracker exited: status=0")
362362
}
363363

364-
os.Remove(m.cfg.SocketPath)
365-
os.Remove(m.cfg.LogFifo)
366-
os.Remove(m.cfg.MetricsFifo)
364+
os.Remove(m.Cfg.SocketPath)
365+
os.Remove(m.Cfg.LogFifo)
366+
os.Remove(m.Cfg.MetricsFifo)
367367
errCh <- err
368368

369369
// Notify subscribers that there will be no more values.
@@ -390,7 +390,7 @@ func (m *Machine) startVMM(ctx context.Context) error {
390390
// Wait for firecracker to initialize:
391391
err = m.waitForSocket(3*time.Second, errCh)
392392
if err != nil {
393-
msg := fmt.Sprintf("Firecracker did not create API socket %s: %s", m.cfg.SocketPath, err)
393+
msg := fmt.Sprintf("Firecracker did not create API socket %s: %s", m.Cfg.SocketPath, err)
394394
err = errors.New(msg)
395395
close(m.exitCh)
396396
return err
@@ -443,16 +443,16 @@ func createFifos(logFifo, metricsFifo string) error {
443443
}
444444

445445
func (m *Machine) setupLogging(ctx context.Context) error {
446-
if len(m.cfg.LogFifo) == 0 || len(m.cfg.MetricsFifo) == 0 {
446+
if len(m.Cfg.LogFifo) == 0 || len(m.Cfg.MetricsFifo) == 0 {
447447
// No logging configured
448448
m.logger.Printf("VMM logging and metrics disabled.")
449449
return nil
450450
}
451451

452452
l := models.Logger{
453-
LogFifo: String(m.cfg.LogFifo),
454-
Level: String(m.cfg.LogLevel),
455-
MetricsFifo: String(m.cfg.MetricsFifo),
453+
LogFifo: String(m.Cfg.LogFifo),
454+
Level: String(m.Cfg.LogLevel),
455+
MetricsFifo: String(m.Cfg.MetricsFifo),
456456
ShowLevel: Bool(true),
457457
ShowLogOrigin: Bool(false),
458458
Options: []string{},
@@ -464,12 +464,12 @@ func (m *Machine) setupLogging(ctx context.Context) error {
464464
}
465465

466466
m.logger.Debugf("Configured VMM logging to %s, metrics to %s",
467-
m.cfg.LogFifo,
468-
m.cfg.MetricsFifo,
467+
m.Cfg.LogFifo,
468+
m.Cfg.MetricsFifo,
469469
)
470470

471-
if m.cfg.FifoLogWriter != nil {
472-
if err := captureFifoToFile(m.logger, m.cfg.LogFifo, m.cfg.FifoLogWriter); err != nil {
471+
if m.Cfg.FifoLogWriter != nil {
472+
if err := captureFifoToFile(m.logger, m.Cfg.LogFifo, m.Cfg.FifoLogWriter); err != nil {
473473
return err
474474
}
475475
}
@@ -507,7 +507,7 @@ func captureFifoToFile(logger *log.Entry, fifoPath string, fifo io.Writer) error
507507
}
508508

509509
func (m *Machine) createMachine(ctx context.Context) error {
510-
resp, err := m.client.PutMachineConfiguration(ctx, &m.cfg.MachineCfg)
510+
resp, err := m.client.PutMachineConfiguration(ctx, &m.Cfg.MachineCfg)
511511
if err != nil {
512512
m.logger.Errorf("PutMachineConfiguration returned %s", resp.Error())
513513
return err
@@ -699,7 +699,7 @@ func (m *Machine) waitForSocket(timeout time.Duration, exitchan chan error) erro
699699
case err := <-exitchan:
700700
return err
701701
case <-ticker.C:
702-
if _, err := os.Stat(m.cfg.SocketPath); err != nil {
702+
if _, err := os.Stat(m.Cfg.SocketPath); err != nil {
703703
continue
704704
}
705705

machine_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -616,7 +616,7 @@ func TestWaitForSocket(t *testing.T) {
616616
errchan := make(chan error)
617617

618618
m := Machine{
619-
cfg: Config{SocketPath: filename},
619+
Cfg: Config{SocketPath: filename},
620620
logger: fctesting.NewLogEntry(t),
621621
}
622622

0 commit comments

Comments
 (0)