Skip to content

Commit

Permalink
config: Add firecracker configuration support
Browse files Browse the repository at this point in the history
In order to let the user choose firecracker hypervisor instead of
QEMU (from the configuration.toml), let's add it to the list of
supported hypervisors.

Fixes kata-containers#1042

Depends-on: github.com/kata-containers#1044

Signed-off-by: Eric Ernst <[email protected]>
  • Loading branch information
Eric Ernst authored and mcastelino committed Dec 18, 2018
1 parent c6baade commit a4b823c
Showing 1 changed file with 89 additions and 9 deletions.
98 changes: 89 additions & 9 deletions pkg/katautils/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand All @@ -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
}
Expand Down Expand Up @@ -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 {
Expand Down

0 comments on commit a4b823c

Please sign in to comment.