diff --git a/pkg/katautils/config.go b/pkg/katautils/config.go index 68e830b4e2..c448421135 100644 --- a/pkg/katautils/config.go +++ b/pkg/katautils/config.go @@ -46,7 +46,8 @@ var ( // The currently supported types are listed below: const ( // supported hypervisor component types - qemuHypervisorTableType = "qemu" + firecrackerHypervisorTableType = "firecracker" + qemuHypervisorTableType = "qemu" // supported proxy component types ccProxyTableType = "cc" @@ -322,6 +323,26 @@ func (h hypervisor) guestHookPath() string { return h.GuestHookPath } +func (h hypervisor) getInitrdAndImage() (initrd string, image string, err error) { + if initrd, err = h.initrd(); err != nil { + return + } + + if image, err = h.image(); err != nil { + return + } + + if image != "" && initrd != "" { + return "", "", errors.New("having both an image and an initrd defined in the configuration file is not supported") + } + + if image == "" && initrd == "" { + return "", "", errors.New("either image or initrd must be defined in the configuration file") + } + + return +} + func (p proxy) path() string { if p.Path == "" { return defaultProxyPath @@ -368,7 +389,7 @@ func (n netmon) debug() bool { return n.Debug } -func newQemuHypervisorConfig(h hypervisor) (vc.HypervisorConfig, error) { +func newFirecrackerHypervisorConfig(h hypervisor) (vc.HypervisorConfig, error) { hypervisor, err := h.path() if err != nil { return vc.HypervisorConfig{}, err @@ -379,12 +400,64 @@ func newQemuHypervisorConfig(h hypervisor) (vc.HypervisorConfig, error) { return vc.HypervisorConfig{}, err } - initrd, err := h.initrd() + initrd, image, err := h.getInitrdAndImage() + if err != nil { + return vc.HypervisorConfig{}, err + } + + firmware, err := h.firmware() if err != nil { return vc.HypervisorConfig{}, err } - image, err := h.image() + kernelParams := h.kernelParams() + + blockDriver, err := h.blockDeviceDriver() + if err != nil { + return vc.HypervisorConfig{}, err + } + + if !utils.SupportsVsocks() { + return vc.HypervisorConfig{}, errors.New("No vsock support, firecracker cannot be used") + } + + return vc.HypervisorConfig{ + HypervisorPath: hypervisor, + KernelPath: kernel, + InitrdPath: initrd, + ImagePath: image, + FirmwarePath: firmware, + KernelParams: vc.DeserializeParams(strings.Fields(kernelParams)), + NumVCPUs: h.defaultVCPUs(), + DefaultMaxVCPUs: h.defaultMaxVCPUs(), + MemorySize: h.defaultMemSz(), + MemSlots: h.defaultMemSlots(), + EntropySource: h.GetEntropySource(), + DefaultBridges: h.defaultBridges(), + DisableBlockDeviceUse: h.DisableBlockDeviceUse, + HugePages: h.HugePages, + Mlock: !h.Swap, + Debug: h.Debug, + DisableNestingChecks: h.DisableNestingChecks, + BlockDeviceDriver: blockDriver, + EnableIOThreads: h.EnableIOThreads, + UseVSock: true, + GuestHookPath: h.guestHookPath(), + }, nil +} + +func newQemuHypervisorConfig(h hypervisor) (vc.HypervisorConfig, error) { + hypervisor, err := h.path() + if err != nil { + return vc.HypervisorConfig{}, err + } + + kernel, err := h.kernel() + if err != nil { + return vc.HypervisorConfig{}, err + } + + initrd, image, err := h.getInitrdAndImage() if err != nil { return vc.HypervisorConfig{}, err } @@ -476,15 +549,22 @@ func newShimConfig(s shim) (vc.ShimConfig, error) { func updateRuntimeConfig(configPath string, tomlConf tomlConfig, config *oci.RuntimeConfig) error { for k, hypervisor := range tomlConf.Hypervisor { + var err error + var hConfig vc.HypervisorConfig + switch k { + case firecrackerHypervisorTableType: + config.HypervisorType = vc.FirecrackerHypervisor + hConfig, err = newFirecrackerHypervisorConfig(hypervisor) case qemuHypervisorTableType: - hConfig, err := newQemuHypervisorConfig(hypervisor) - if err != nil { - return fmt.Errorf("%v: %v", configPath, err) - } + config.HypervisorType = vc.QemuHypervisor + hConfig, err = newQemuHypervisorConfig(hypervisor) + } - config.HypervisorConfig = hConfig + if err != nil { + return fmt.Errorf("%v: %v", configPath, err) } + config.HypervisorConfig = hConfig } for k, proxy := range tomlConf.Proxy {