FC: func checkVersion should be more independent

func checkVersion could be called anywhere, not always after
DescribeInstance `\` API request, so it should be more independent.
We could also get version number from `firecracker --version` command.

Fixes: #2199

Signed-off-by: Penny Zheng <penny.zheng@arm.com>
This commit is contained in:
Penny Zheng 2019-11-17 18:38:56 -08:00
parent 9ce2113535
commit f2d8d715d3

View File

@ -36,7 +36,6 @@ import (
"github.com/blang/semver" "github.com/blang/semver"
"github.com/containerd/console" "github.com/containerd/console"
"github.com/kata-containers/runtime/virtcontainers/device/config" "github.com/kata-containers/runtime/virtcontainers/device/config"
fcmodels "github.com/kata-containers/runtime/virtcontainers/pkg/firecracker/client/models"
"github.com/kata-containers/runtime/virtcontainers/store" "github.com/kata-containers/runtime/virtcontainers/store"
"github.com/kata-containers/runtime/virtcontainers/types" "github.com/kata-containers/runtime/virtcontainers/types"
"github.com/kata-containers/runtime/virtcontainers/utils" "github.com/kata-containers/runtime/virtcontainers/utils"
@ -108,7 +107,8 @@ func (s vmmState) String() string {
// FirecrackerInfo contains information related to the hypervisor that we // FirecrackerInfo contains information related to the hypervisor that we
// want to store on disk // want to store on disk
type FirecrackerInfo struct { type FirecrackerInfo struct {
PID int PID int
Version string
} }
type firecrackerState struct { type firecrackerState struct {
@ -311,12 +311,27 @@ func (fc *firecracker) vmRunning() bool {
} }
} }
func (fc *firecracker) checkVersion(vmmInfo *fcmodels.InstanceInfo) error { func (fc *firecracker) getVersionNumber() (string, error) {
if vmmInfo == nil || vmmInfo.VmmVersion == nil { args := []string{"--version"}
return fmt.Errorf("Unknown firecracker version") checkCMD := exec.Command(fc.config.HypervisorPath, args...)
data, err := checkCMD.Output()
if err != nil {
return "", fmt.Errorf("Running checking FC version command failed: %v", err)
} }
v, err := semver.Make(*vmmInfo.VmmVersion) var version string
fields := strings.Split(string(data), " ")
if len(fields) > 1 {
version = strings.TrimSpace(fields[1])
return version, nil
}
return "", errors.New("getting FC version failed, the output is malformed")
}
func (fc *firecracker) checkVersion(version string) error {
v, err := semver.Make(version)
if err != nil { if err != nil {
return fmt.Errorf("Malformed firecracker version: %v", err) return fmt.Errorf("Malformed firecracker version: %v", err)
} }
@ -343,7 +358,7 @@ func (fc *firecracker) waitVMM(timeout int) error {
for { for {
vmmInfo, err := fc.client().Operations.DescribeInstance(nil) vmmInfo, err := fc.client().Operations.DescribeInstance(nil)
if err == nil { if err == nil {
if err := fc.checkVersion(vmmInfo.Payload); err != nil { if err := fc.checkVersion(fc.info.Version); err != nil {
return err return err
} }
return nil return nil
@ -388,6 +403,15 @@ func (fc *firecracker) fcInit(timeout int) error {
} }
}() }()
//FC version set and check
if fc.info.Version, err = fc.getVersionNumber(); err != nil {
return err
}
if err := fc.checkVersion(fc.info.Version); err != nil {
return err
}
var args []string var args []string
var cmd *exec.Cmd var cmd *exec.Cmd