mirror of
https://github.com/kata-containers/kata-containers.git
synced 2025-07-01 17:52:40 +00:00
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 <eric.ernst@intel.com>
This commit is contained in:
parent
8764fc1467
commit
d6c1f531a9
@ -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 {
|
||||
|
Loading…
Reference in New Issue
Block a user