From d6c1f531a9686e5fa06c0840dac1a09c55a61928 Mon Sep 17 00:00:00 2001 From: Eric Ernst Date: Tue, 4 Dec 2018 01:41:59 +0000 Subject: [PATCH 1/2] config: Add firecracker configuration support 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 #1042 Depends-on: github.com/kata-containers/runtime#1044 Signed-off-by: Eric Ernst --- pkg/katautils/config.go | 108 ++++++++++++++++++++++++++++++++++------ 1 file changed, 94 insertions(+), 14 deletions(-) diff --git a/pkg/katautils/config.go b/pkg/katautils/config.go index 6c0cd487f1..b0f61c86fa 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,6 +389,63 @@ func (n netmon) debug() bool { return n.Debug } +func newFirecrackerHypervisorConfig(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 + } + + firmware, err := h.firmware() + if err != nil { + return vc.HypervisorConfig{}, err + } + + 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 { @@ -379,12 +457,7 @@ func newQemuHypervisorConfig(h hypervisor) (vc.HypervisorConfig, error) { return vc.HypervisorConfig{}, err } - initrd, err := h.initrd() - if err != nil { - return vc.HypervisorConfig{}, err - } - - image, err := h.image() + 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 { - switch k { - case qemuHypervisorTableType: - hConfig, err := newQemuHypervisorConfig(hypervisor) - if err != nil { - return fmt.Errorf("%v: %v", configPath, err) - } + var err error + var hConfig vc.HypervisorConfig - config.HypervisorConfig = hConfig + switch k { + case firecrackerHypervisorTableType: + config.HypervisorType = vc.FirecrackerHypervisor + hConfig, err = newFirecrackerHypervisorConfig(hypervisor) + case qemuHypervisorTableType: + config.HypervisorType = vc.QemuHypervisor + hConfig, err = newQemuHypervisorConfig(hypervisor) } + + if err != nil { + return fmt.Errorf("%v: %v", configPath, err) + } + config.HypervisorConfig = hConfig } for k, proxy := range tomlConf.Proxy { From 353564abe006961b108f4e1313939bc06de77626 Mon Sep 17 00:00:00 2001 From: Sebastien Boeuf Date: Mon, 17 Dec 2018 13:23:25 -0800 Subject: [PATCH 2/2] config: Reorganize the code to fix code complexity By breaking down updateRuntimeConfig() into smaller functions, this commit prevents the function to grow a Go complexity higher than 15. Signed-off-by: Sebastien Boeuf --- pkg/katautils/config.go | 34 +++++++++++++++++++++++++++++++++- 1 file changed, 33 insertions(+), 1 deletion(-) diff --git a/pkg/katautils/config.go b/pkg/katautils/config.go index b0f61c86fa..88ca34fefd 100644 --- a/pkg/katautils/config.go +++ b/pkg/katautils/config.go @@ -547,7 +547,7 @@ func newShimConfig(s shim) (vc.ShimConfig, error) { }, nil } -func updateRuntimeConfig(configPath string, tomlConf tomlConfig, config *oci.RuntimeConfig) error { +func updateRuntimeConfigHypervisor(configPath string, tomlConf tomlConfig, config *oci.RuntimeConfig) error { for k, hypervisor := range tomlConf.Hypervisor { var err error var hConfig vc.HypervisorConfig @@ -567,6 +567,10 @@ func updateRuntimeConfig(configPath string, tomlConf tomlConfig, config *oci.Run config.HypervisorConfig = hConfig } + return nil +} + +func updateRuntimeConfigProxy(configPath string, tomlConf tomlConfig, config *oci.RuntimeConfig) error { for k, proxy := range tomlConf.Proxy { switch k { case ccProxyTableType: @@ -581,6 +585,10 @@ func updateRuntimeConfig(configPath string, tomlConf tomlConfig, config *oci.Run } } + return nil +} + +func updateRuntimeConfigAgent(configPath string, tomlConf tomlConfig, config *oci.RuntimeConfig) error { for k := range tomlConf.Agent { switch k { case hyperstartAgentTableType: @@ -595,6 +603,10 @@ func updateRuntimeConfig(configPath string, tomlConf tomlConfig, config *oci.Run } } + return nil +} + +func updateRuntimeConfigShim(configPath string, tomlConf tomlConfig, config *oci.RuntimeConfig) error { for k, shim := range tomlConf.Shim { switch k { case ccShimTableType: @@ -611,6 +623,26 @@ func updateRuntimeConfig(configPath string, tomlConf tomlConfig, config *oci.Run config.ShimConfig = shConfig } + return nil +} + +func updateRuntimeConfig(configPath string, tomlConf tomlConfig, config *oci.RuntimeConfig) error { + if err := updateRuntimeConfigHypervisor(configPath, tomlConf, config); err != nil { + return err + } + + if err := updateRuntimeConfigProxy(configPath, tomlConf, config); err != nil { + return err + } + + if err := updateRuntimeConfigAgent(configPath, tomlConf, config); err != nil { + return err + } + + if err := updateRuntimeConfigShim(configPath, tomlConf, config); err != nil { + return err + } + fConfig, err := newFactoryConfig(tomlConf.Factory) if err != nil { return fmt.Errorf("%v: %v", configPath, err)