From daf7c8d6867b38e9733e1f83d91d86f2cc84c357 Mon Sep 17 00:00:00 2001 From: Yifan Gu Date: Wed, 13 May 2015 17:57:54 -0700 Subject: [PATCH] kubelet/rkt: Use RunContainerOptions to get the arguments. --- pkg/kubelet/rkt/rkt.go | 54 ++++++++++++++++++++++++------------------ 1 file changed, 31 insertions(+), 23 deletions(-) diff --git a/pkg/kubelet/rkt/rkt.go b/pkg/kubelet/rkt/rkt.go index 8e4a2c251ec..da0e10fffa2 100644 --- a/pkg/kubelet/rkt/rkt.go +++ b/pkg/kubelet/rkt/rkt.go @@ -148,6 +148,7 @@ func New(config *Config, generator: generator, recorder: recorder, readinessManager: readinessManager, + volumeGetter: volumeGetter, } rkt.prober = prober.New(rkt, readinessManager, containerRefManager, recorder) @@ -174,7 +175,7 @@ func (r *runtime) buildCommand(args ...string) *exec.Cmd { } // runCommand invokes rkt binary with arguments and returns the result -// from stdout in a list of strings. +// from stdout in a list of strings. Each string in the list is a line. func (r *runtime) runCommand(args ...string) ([]string, error) { glog.V(4).Info("rkt: Run command:", args) @@ -285,7 +286,7 @@ func setIsolators(app *appctypes.App, c *api.Container) error { // setApp overrides the app's fields if any of them are specified in the // container's spec. -func setApp(app *appctypes.App, c *api.Container) error { +func setApp(app *appctypes.App, c *api.Container, opts *kubecontainer.RunContainerOptions) error { // Override the exec. // TOOD(yifan): Revisit this for the overriding rule. if len(c.Command) > 0 || len(c.Args) > 0 { @@ -302,8 +303,7 @@ func setApp(app *appctypes.App, c *api.Container) error { } // Override the environment. - // TODO(yifan): Use RunContainerOptions. - if len(c.Env) > 0 { + if len(opts.Envs) > 0 { app.Environment = []appctypes.EnvironmentVariable{} } for _, env := range c.Env { @@ -314,30 +314,31 @@ func setApp(app *appctypes.App, c *api.Container) error { } // Override the mount points. - if len(c.VolumeMounts) > 0 { + if len(opts.Mounts) > 0 { app.MountPoints = []appctypes.MountPoint{} } - for _, m := range c.VolumeMounts { + for _, m := range opts.Mounts { mountPointName, err := appctypes.NewACName(m.Name) if err != nil { return err } app.MountPoints = append(app.MountPoints, appctypes.MountPoint{ Name: *mountPointName, - Path: m.MountPath, + Path: m.ContainerPath, ReadOnly: m.ReadOnly, }) } // Override the ports. - if len(c.Ports) > 0 { + if len(opts.PortMappings) > 0 { app.Ports = []appctypes.Port{} } - for _, p := range c.Ports { - portName, err := appctypes.NewACName(p.Name) + for _, p := range opts.PortMappings { + name, err := appctypes.SanitizeACName(p.Name) if err != nil { return err } + portName := appctypes.MustACName(name) app.Ports = append(app.Ports, appctypes.Port{ Name: *portName, Protocol: string(p.Protocol), @@ -360,7 +361,7 @@ func (r *runtime) getImageManifest(image string) (*appcschema.ImageManifest, err return nil, err } if len(output) != 1 { - return nil, fmt.Errorf("no output") + return nil, fmt.Errorf("invalid output: %v", output) } return &manifest, json.Unmarshal([]byte(output[0]), &manifest) } @@ -368,6 +369,7 @@ func (r *runtime) getImageManifest(image string) (*appcschema.ImageManifest, err // makePodManifest transforms a kubelet pod spec to the rkt pod manifest. // TODO(yifan): Use the RunContainerOptions generated by GenerateRunContainerOptions(). func (r *runtime) makePodManifest(pod *api.Pod) (*appcschema.PodManifest, error) { + var globalPortMappings []kubecontainer.PortMapping manifest := appcschema.BlankPodManifest() for _, c := range pod.Spec.Containers { @@ -389,9 +391,17 @@ func (r *runtime) makePodManifest(pod *api.Pod) (*appcschema.PodManifest, error) return nil, err } - if err := setApp(imgManifest.App, &c); err != nil { + opts, err := r.generator.GenerateRunContainerOptions(pod, &c) + if err != nil { return nil, err } + + globalPortMappings = append(globalPortMappings, opts.PortMappings...) + + if err := setApp(imgManifest.App, &c, opts); err != nil { + return nil, err + } + manifest.Apps = append(manifest.Apps, appcschema.RuntimeApp{ // TODO(yifan): We should allow app name to be different with // image name. See https://github.com/coreos/rkt/pull/640. @@ -420,17 +430,16 @@ func (r *runtime) makePodManifest(pod *api.Pod) (*appcschema.PodManifest, error) } // Set global ports. - for _, c := range pod.Spec.Containers { - for _, port := range c.Ports { - portName, err := appctypes.NewACName(port.Name) - if err != nil { - return nil, fmt.Errorf("cannot use the port's name %q as ACName: %v", port.Name, err) - } - manifest.Ports = append(manifest.Ports, appctypes.ExposedPort{ - Name: *portName, - HostPort: uint(port.HostPort), - }) + for _, port := range globalPortMappings { + name, err := appctypes.SanitizeACName(port.Name) + if err != nil { + return nil, fmt.Errorf("cannot use the port's name %q as ACName: %v", port.Name, err) } + portName := appctypes.MustACName(name) + manifest.Ports = append(manifest.Ports, appctypes.ExposedPort{ + Name: *portName, + HostPort: uint(port.HostPort), + }) } // TODO(yifan): Set pod-level isolators once it's supported in kubernetes. return manifest, nil @@ -811,7 +820,6 @@ func (r *runtime) SyncPod(pod *api.Pod, runningPod kubecontainer.Pod, podStatus podFullName := kubecontainer.GetPodFullName(pod) if len(runningPod.Containers) == 0 { glog.V(4).Infof("Pod %q is not running, will start it", podFullName) - // TODO(yifan): Use RunContainerOptionsGeneratior to get volumeMaps, etc. return r.RunPod(pod) }