Merge pull request #22891 from yifan-gu/rkt_version

Auto commit by PR queue bot
pull/6/head
k8s-merge-robot 2016-03-16 00:04:55 -07:00
commit a4097fa4f1
3 changed files with 74 additions and 40 deletions

View File

@ -122,11 +122,7 @@ type Runtime struct {
volumeGetter volumeGetter volumeGetter volumeGetter
imagePuller kubecontainer.ImagePuller imagePuller kubecontainer.ImagePuller
// Versions versions versions
binVersion rktVersion
apiVersion rktVersion
appcVersion rktVersion
systemdVersion systemdVersion
} }
var _ kubecontainer.Runtime = &Runtime{} var _ kubecontainer.Runtime = &Runtime{}
@ -189,6 +185,10 @@ func New(config *Config,
rkt.imagePuller = kubecontainer.NewImagePuller(recorder, rkt, imageBackOff) rkt.imagePuller = kubecontainer.NewImagePuller(recorder, rkt, imageBackOff)
} }
if err := rkt.getVersions(); err != nil {
return nil, fmt.Errorf("rkt: error getting version info: %v", err)
}
return rkt, nil return rkt, nil
} }
@ -1093,11 +1093,15 @@ func (r *Runtime) Type() string {
} }
func (r *Runtime) Version() (kubecontainer.Version, error) { func (r *Runtime) Version() (kubecontainer.Version, error) {
return r.binVersion, nil r.versions.RLock()
defer r.versions.RUnlock()
return r.versions.binVersion, nil
} }
func (r *Runtime) APIVersion() (kubecontainer.Version, error) { func (r *Runtime) APIVersion() (kubecontainer.Version, error) {
return r.apiVersion, nil r.versions.RLock()
defer r.versions.RUnlock()
return r.versions.apiVersion, nil
} }
// Status returns error if rkt is unhealthy, nil otherwise. // Status returns error if rkt is unhealthy, nil otherwise.

View File

@ -260,9 +260,9 @@ func TestCheckVersion(t *testing.T) {
assert.Equal(t, fs.called, []string{"Version"}, testCaseHint) assert.Equal(t, fs.called, []string{"Version"}, testCaseHint)
} }
if err == nil { if err == nil {
assert.Equal(t, fr.info.RktVersion, r.binVersion.String(), testCaseHint) assert.Equal(t, fr.info.RktVersion, r.versions.binVersion.String(), testCaseHint)
assert.Equal(t, fr.info.AppcVersion, r.appcVersion.String(), testCaseHint) assert.Equal(t, fr.info.AppcVersion, r.versions.appcVersion.String(), testCaseHint)
assert.Equal(t, fr.info.ApiVersion, r.apiVersion.String(), testCaseHint) assert.Equal(t, fr.info.ApiVersion, r.versions.apiVersion.String(), testCaseHint)
} }
fr.CleanCalls() fr.CleanCalls()
fs.CleanCalls() fs.CleanCalls()

View File

@ -18,6 +18,7 @@ package rkt
import ( import (
"fmt" "fmt"
"sync"
"github.com/coreos/go-semver/semver" "github.com/coreos/go-semver/semver"
rktapi "github.com/coreos/rkt/api/v1alpha" rktapi "github.com/coreos/rkt/api/v1alpha"
@ -25,6 +26,14 @@ import (
"golang.org/x/net/context" "golang.org/x/net/context"
) )
type versions struct {
sync.RWMutex
binVersion rktVersion
apiVersion rktVersion
appcVersion rktVersion
systemdVersion systemdVersion
}
// rktVersion implementes kubecontainer.Version interface by implementing // rktVersion implementes kubecontainer.Version interface by implementing
// Compare() and String() (which is implemented by the underlying semver.Version) // Compare() and String() (which is implemented by the underlying semver.Version)
type rktVersion struct { type rktVersion struct {
@ -54,22 +63,16 @@ func (r rktVersion) Compare(other string) (int, error) {
return 0, nil return 0, nil
} }
// checkVersion tests whether the rkt/systemd/rkt-api-service that meet the version requirement. func (r *Runtime) getVersions() error {
// If all version requirements are met, it returns nil. r.versions.Lock()
func (r *Runtime) checkVersion(minimumRktBinVersion, recommendedRktBinVersion, minimumAppcVersion, minimumRktApiVersion, minimumSystemdVersion string) error { defer r.versions.Unlock()
// Check systemd version.
// Get systemd version.
var err error var err error
r.systemdVersion, err = r.systemd.Version() r.versions.systemdVersion, err = r.systemd.Version()
if err != nil { if err != nil {
return err return err
} }
result, err := r.systemdVersion.Compare(minimumSystemdVersion)
if err != nil {
return err
}
if result < 0 {
return fmt.Errorf("rkt: systemd version(%v) is too old, requires at least %v", r.systemdVersion, minimumSystemdVersion)
}
// Example for the version strings returned by GetInfo(): // Example for the version strings returned by GetInfo():
// RktVersion:"0.10.0+gitb7349b1" AppcVersion:"0.7.1" ApiVersion:"1.0.0-alpha" // RktVersion:"0.10.0+gitb7349b1" AppcVersion:"0.7.1" ApiVersion:"1.0.0-alpha"
@ -78,51 +81,78 @@ func (r *Runtime) checkVersion(minimumRktBinVersion, recommendedRktBinVersion, m
return err return err
} }
// Check rkt binary version. // Get rkt binary version.
r.binVersion, err = newRktVersion(resp.Info.RktVersion) r.versions.binVersion, err = newRktVersion(resp.Info.RktVersion)
if err != nil { if err != nil {
return err return err
} }
result, err = r.binVersion.Compare(minimumRktBinVersion)
// Get Appc version.
r.versions.appcVersion, err = newRktVersion(resp.Info.AppcVersion)
if err != nil {
return err
}
// Get rkt API version.
r.versions.apiVersion, err = newRktVersion(resp.Info.ApiVersion)
if err != nil {
return err
}
return nil
}
// checkVersion tests whether the rkt/systemd/rkt-api-service that meet the version requirement.
// If all version requirements are met, it returns nil.
func (r *Runtime) checkVersion(minimumRktBinVersion, recommendedRktBinVersion, minimumAppcVersion, minimumRktApiVersion, minimumSystemdVersion string) error {
if err := r.getVersions(); err != nil {
return err
}
r.versions.RLock()
defer r.versions.RUnlock()
// Check systemd version.
result, err := r.versions.systemdVersion.Compare(minimumSystemdVersion)
if err != nil { if err != nil {
return err return err
} }
if result < 0 { if result < 0 {
return fmt.Errorf("rkt: binary version is too old(%v), requires at least %v", resp.Info.RktVersion, minimumRktBinVersion) return fmt.Errorf("rkt: systemd version(%v) is too old, requires at least %v", r.versions.systemdVersion, minimumSystemdVersion)
} }
result, err = r.binVersion.Compare(recommendedRktBinVersion)
// Check rkt binary version.
result, err = r.versions.binVersion.Compare(minimumRktBinVersion)
if err != nil {
return err
}
if result < 0 {
return fmt.Errorf("rkt: binary version is too old(%v), requires at least %v", r.versions.binVersion, minimumRktBinVersion)
}
result, err = r.versions.binVersion.Compare(recommendedRktBinVersion)
if err != nil { if err != nil {
return err return err
} }
if result != 0 { if result != 0 {
// TODO(yifan): Record an event to expose the information. // TODO(yifan): Record an event to expose the information.
glog.Warningf("rkt: current binary version %q is not recommended (recommended version %q)", resp.Info.RktVersion, recommendedRktBinVersion) glog.Warningf("rkt: current binary version %q is not recommended (recommended version %q)", r.versions.binVersion, recommendedRktBinVersion)
} }
// Check Appc version. // Check Appc version.
r.appcVersion, err = newRktVersion(resp.Info.AppcVersion) result, err = r.versions.appcVersion.Compare(minimumAppcVersion)
if err != nil {
return err
}
result, err = r.appcVersion.Compare(minimumAppcVersion)
if err != nil { if err != nil {
return err return err
} }
if result < 0 { if result < 0 {
return fmt.Errorf("rkt: appc version is too old(%v), requires at least %v", resp.Info.AppcVersion, minimumAppcVersion) return fmt.Errorf("rkt: appc version is too old(%v), requires at least %v", r.versions.appcVersion, minimumAppcVersion)
} }
// Check rkt API version. // Check rkt API version.
r.apiVersion, err = newRktVersion(resp.Info.ApiVersion) result, err = r.versions.apiVersion.Compare(minimumRktApiVersion)
if err != nil {
return err
}
result, err = r.apiVersion.Compare(minimumRktApiVersion)
if err != nil { if err != nil {
return err return err
} }
if result < 0 { if result < 0 {
return fmt.Errorf("rkt: API version is too old(%v), requires at least %v", resp.Info.ApiVersion, minimumRktApiVersion) return fmt.Errorf("rkt: API version is too old(%v), requires at least %v", r.versions.apiVersion, minimumRktApiVersion)
} }
return nil return nil
} }