diff --git a/cmd/integration/integration.go b/cmd/integration/integration.go index 06ddad6d843..1eb73720a80 100644 --- a/cmd/integration/integration.go +++ b/cmd/integration/integration.go @@ -780,7 +780,7 @@ func main() { // 1 pod infra container + 2 pods from the URL + // 1 pod infra container + 1 pod from the service test. if len(createdPods) != 9 { - glog.Fatalf("Unexpected list of created pods:\n\n%#v\n\n%#v\n\n%#v\n\n", createdPods.List(), fakeDocker1.Created, fakeDocker2.Created) + glog.Fatalf("Expected 9 pods; got %v\n\nlist of created pods:\n\n%#v\n\nDocker 1 Created:\n\n%#v\n\nDocker 2 Created:\n\n%#v\n\n", len(createdPods), createdPods.List(), fakeDocker1.Created, fakeDocker2.Created) } glog.Infof("OK - found created pods: %#v", createdPods.List()) } diff --git a/pkg/api/conversion.go b/pkg/api/conversion.go index 372adb76099..f6a6204563a 100644 --- a/pkg/api/conversion.go +++ b/pkg/api/conversion.go @@ -40,6 +40,10 @@ func init() { return nil }, // Convert ContainerManifest to BoundPod + // + // This function generates a dummy selfLink using the same method as the + // boundPod registry, in order for the Kubelet to work with well-formed + // boundPods during the integration test. func(in *ContainerManifest, out *BoundPod, s conversion.Scope) error { out.Spec.Containers = in.Containers out.Spec.Volumes = in.Volumes @@ -47,6 +51,11 @@ func init() { out.Spec.DNSPolicy = in.DNSPolicy out.Name = in.ID out.UID = in.UUID + + if in.ID != "" { + out.SelfLink = "/api/v1beta1/boundPods/" + in.ID + } + return nil }, func(in *BoundPod, out *ContainerManifest, s conversion.Scope) error { diff --git a/pkg/kubelet/config/http_test.go b/pkg/kubelet/config/http_test.go index 7c1196e1d2c..f556774cc10 100644 --- a/pkg/kubelet/config/http_test.go +++ b/pkg/kubelet/config/http_test.go @@ -137,6 +137,7 @@ func TestExtractFromHTTP(t *testing.T) { UID: "111", Name: "foo" + "-" + hostname, Namespace: "foobar", + SelfLink: "/api/v1beta1/boundPods/foo", }, Spec: api.PodSpec{ RestartPolicy: api.RestartPolicy{Always: &api.RestartPolicyAlways{}}, @@ -177,6 +178,7 @@ func TestExtractFromHTTP(t *testing.T) { UID: "111", Name: "foo" + "-" + hostname, Namespace: "foobar", + SelfLink: "/api/v1beta1/boundPods/foo", }, Spec: api.PodSpec{ RestartPolicy: api.RestartPolicy{Always: &api.RestartPolicyAlways{}}, @@ -204,6 +206,7 @@ func TestExtractFromHTTP(t *testing.T) { UID: "111", Name: "foo" + "-" + hostname, Namespace: "foobar", + SelfLink: "/api/v1beta1/boundPods/foo", }, Spec: api.PodSpec{ RestartPolicy: api.RestartPolicy{Always: &api.RestartPolicyAlways{}}, @@ -220,6 +223,7 @@ func TestExtractFromHTTP(t *testing.T) { UID: "222", Name: "bar" + "-" + hostname, Namespace: "foobar", + SelfLink: "/api/v1beta1/boundPods/bar", }, Spec: api.PodSpec{ RestartPolicy: api.RestartPolicy{Always: &api.RestartPolicyAlways{}}, diff --git a/pkg/kubelet/volume/empty_dir/empty_dir.go b/pkg/kubelet/volume/empty_dir/empty_dir.go index d48fae9e5a0..2e7fb1db290 100644 --- a/pkg/kubelet/volume/empty_dir/empty_dir.go +++ b/pkg/kubelet/volume/empty_dir/empty_dir.go @@ -69,12 +69,12 @@ func (plugin *emptyDirPlugin) CanSupport(spec *api.Volume) bool { return false } -func (plugin *emptyDirPlugin) NewBuilder(spec *api.Volume, podUID types.UID) (volume.Builder, error) { +func (plugin *emptyDirPlugin) NewBuilder(spec *api.Volume, podRef *api.ObjectReference) (volume.Builder, error) { if plugin.legacyMode { // Legacy mode instances can be cleaned up but not created anew. return nil, fmt.Errorf("legacy mode: can not create new instances") } - return &emptyDir{podUID, spec.Name, plugin, false}, nil + return &emptyDir{podRef.UID, spec.Name, plugin, false}, nil } func (plugin *emptyDirPlugin) NewCleaner(volName string, podUID types.UID) (volume.Cleaner, error) { diff --git a/pkg/kubelet/volume/empty_dir/empty_dir_test.go b/pkg/kubelet/volume/empty_dir/empty_dir_test.go index 15c1e335e87..bbfda9e4414 100644 --- a/pkg/kubelet/volume/empty_dir/empty_dir_test.go +++ b/pkg/kubelet/volume/empty_dir/empty_dir_test.go @@ -56,7 +56,7 @@ func TestPlugin(t *testing.T) { Name: "vol1", VolumeSource: api.VolumeSource{EmptyDir: &api.EmptyDirVolumeSource{}}, } - builder, err := plug.NewBuilder(spec, types.UID("poduid")) + builder, err := plug.NewBuilder(spec, &api.ObjectReference{UID: types.UID("poduid")}) if err != nil { t.Errorf("Failed to make a new Builder: %v", err) } @@ -109,7 +109,7 @@ func TestPluginBackCompat(t *testing.T) { spec := &api.Volume{ Name: "vol1", } - builder, err := plug.NewBuilder(spec, types.UID("poduid")) + builder, err := plug.NewBuilder(spec, &api.ObjectReference{UID: types.UID("poduid")}) if err != nil { t.Errorf("Failed to make a new Builder: %v", err) } @@ -138,7 +138,7 @@ func TestPluginLegacy(t *testing.T) { t.Errorf("Expected false") } - if _, err := plug.NewBuilder(&api.Volume{VolumeSource: api.VolumeSource{EmptyDir: &api.EmptyDirVolumeSource{}}}, types.UID("poduid")); err == nil { + if _, err := plug.NewBuilder(&api.Volume{VolumeSource: api.VolumeSource{EmptyDir: &api.EmptyDirVolumeSource{}}}, &api.ObjectReference{UID: types.UID("poduid")}); err == nil { t.Errorf("Expected failiure") } diff --git a/pkg/kubelet/volume/gce_pd/gce_pd.go b/pkg/kubelet/volume/gce_pd/gce_pd.go index cd01fde3faa..dc89c12f328 100644 --- a/pkg/kubelet/volume/gce_pd/gce_pd.go +++ b/pkg/kubelet/volume/gce_pd/gce_pd.go @@ -70,9 +70,9 @@ func (plugin *gcePersistentDiskPlugin) CanSupport(spec *api.Volume) bool { return false } -func (plugin *gcePersistentDiskPlugin) NewBuilder(spec *api.Volume, podUID types.UID) (volume.Builder, error) { +func (plugin *gcePersistentDiskPlugin) NewBuilder(spec *api.Volume, podRef *api.ObjectReference) (volume.Builder, error) { // Inject real implementations here, test through the internal function. - return plugin.newBuilderInternal(spec, podUID, &GCEDiskUtil{}, mount.New()) + return plugin.newBuilderInternal(spec, podRef.UID, &GCEDiskUtil{}, mount.New()) } func (plugin *gcePersistentDiskPlugin) newBuilderInternal(spec *api.Volume, podUID types.UID, manager pdManager, mounter mount.Interface) (volume.Builder, error) { diff --git a/pkg/kubelet/volume/gce_pd/gce_pd_test.go b/pkg/kubelet/volume/gce_pd/gce_pd_test.go index 9ebb13d81e9..5a90cb3d8cd 100644 --- a/pkg/kubelet/volume/gce_pd/gce_pd_test.go +++ b/pkg/kubelet/volume/gce_pd/gce_pd_test.go @@ -145,7 +145,7 @@ func TestPluginLegacy(t *testing.T) { t.Errorf("Expected false") } - if _, err := plug.NewBuilder(&api.Volume{VolumeSource: api.VolumeSource{GCEPersistentDisk: &api.GCEPersistentDiskVolumeSource{}}}, types.UID("poduid")); err == nil { + if _, err := plug.NewBuilder(&api.Volume{VolumeSource: api.VolumeSource{GCEPersistentDisk: &api.GCEPersistentDiskVolumeSource{}}}, &api.ObjectReference{UID: types.UID("poduid")}); err == nil { t.Errorf("Expected failiure") } diff --git a/pkg/kubelet/volume/git_repo/git_repo.go b/pkg/kubelet/volume/git_repo/git_repo.go index 5ac06b7d5c7..65546251ed9 100644 --- a/pkg/kubelet/volume/git_repo/git_repo.go +++ b/pkg/kubelet/volume/git_repo/git_repo.go @@ -69,13 +69,13 @@ func (plugin *gitRepoPlugin) CanSupport(spec *api.Volume) bool { return false } -func (plugin *gitRepoPlugin) NewBuilder(spec *api.Volume, podUID types.UID) (volume.Builder, error) { +func (plugin *gitRepoPlugin) NewBuilder(spec *api.Volume, podRef *api.ObjectReference) (volume.Builder, error) { if plugin.legacyMode { // Legacy mode instances can be cleaned up but not created anew. return nil, fmt.Errorf("legacy mode: can not create new instances") } return &gitRepo{ - podUID: podUID, + podUID: podRef.UID, volName: spec.Name, source: spec.GitRepo.Repository, revision: spec.GitRepo.Revision, diff --git a/pkg/kubelet/volume/git_repo/git_repo_test.go b/pkg/kubelet/volume/git_repo/git_repo_test.go index 626b50ecdfa..76f44e71d83 100644 --- a/pkg/kubelet/volume/git_repo/git_repo_test.go +++ b/pkg/kubelet/volume/git_repo/git_repo_test.go @@ -117,7 +117,7 @@ func TestPlugin(t *testing.T) { }, }, } - builder, err := plug.NewBuilder(spec, types.UID("poduid")) + builder, err := plug.NewBuilder(spec, &api.ObjectReference{UID: types.UID("poduid")}) if err != nil { t.Errorf("Failed to make a new Builder: %v", err) } @@ -172,7 +172,7 @@ func TestPluginLegacy(t *testing.T) { t.Errorf("Expected false") } - if _, err := plug.NewBuilder(&api.Volume{VolumeSource: api.VolumeSource{GitRepo: &api.GitRepoVolumeSource{}}}, types.UID("poduid")); err == nil { + if _, err := plug.NewBuilder(&api.Volume{VolumeSource: api.VolumeSource{GitRepo: &api.GitRepoVolumeSource{}}}, &api.ObjectReference{UID: types.UID("poduid")}); err == nil { t.Errorf("Expected failiure") } diff --git a/pkg/kubelet/volume/host_path/host_path.go b/pkg/kubelet/volume/host_path/host_path.go index 2f06a62b324..314c8d42c8f 100644 --- a/pkg/kubelet/volume/host_path/host_path.go +++ b/pkg/kubelet/volume/host_path/host_path.go @@ -52,7 +52,7 @@ func (plugin *hostPathPlugin) CanSupport(spec *api.Volume) bool { return false } -func (plugin *hostPathPlugin) NewBuilder(spec *api.Volume, podUID types.UID) (volume.Builder, error) { +func (plugin *hostPathPlugin) NewBuilder(spec *api.Volume, podRef *api.ObjectReference) (volume.Builder, error) { return &hostPath{spec.HostPath.Path}, nil } diff --git a/pkg/kubelet/volume/host_path/host_path_test.go b/pkg/kubelet/volume/host_path/host_path_test.go index 22b64984d3d..2fd6681b572 100644 --- a/pkg/kubelet/volume/host_path/host_path_test.go +++ b/pkg/kubelet/volume/host_path/host_path_test.go @@ -55,7 +55,7 @@ func TestPlugin(t *testing.T) { Name: "vol1", VolumeSource: api.VolumeSource{HostPath: &api.HostPathVolumeSource{"/vol1"}}, } - builder, err := plug.NewBuilder(spec, types.UID("poduid")) + builder, err := plug.NewBuilder(spec, &api.ObjectReference{UID: types.UID("poduid")}) if err != nil { t.Errorf("Failed to make a new Builder: %v", err) } diff --git a/pkg/kubelet/volume/plugins.go b/pkg/kubelet/volume/plugins.go index 9c159862024..dbd2baf765f 100644 --- a/pkg/kubelet/volume/plugins.go +++ b/pkg/kubelet/volume/plugins.go @@ -49,8 +49,8 @@ type Plugin interface { // NewBuilder creates a new volume.Builder from an API specification. // Ownership of the spec pointer in *not* transferred. // - spec: The api.Volume spec - // - podUID: The UID of the enclosing pod - NewBuilder(spec *api.Volume, podUID types.UID) (Builder, error) + // - podRef: a reference to the enclosing pod + NewBuilder(spec *api.Volume, podRef *api.ObjectReference) (Builder, error) // NewCleaner creates a new volume.Cleaner from recoverable state. // - name: The volume name, as per the api.Volume spec. diff --git a/pkg/kubelet/volume/secret/secret.go b/pkg/kubelet/volume/secret/secret.go index 73d6fc4ab29..6a8bfc7ee75 100644 --- a/pkg/kubelet/volume/secret/secret.go +++ b/pkg/kubelet/volume/secret/secret.go @@ -58,12 +58,12 @@ func (plugin *secretPlugin) CanSupport(spec *api.Volume) bool { return false } -func (plugin *secretPlugin) NewBuilder(spec *api.Volume, podUID types.UID) (volume.Builder, error) { - return plugin.newBuilderInternal(spec, podUID) +func (plugin *secretPlugin) NewBuilder(spec *api.Volume, podRef *api.ObjectReference) (volume.Builder, error) { + return plugin.newBuilderInternal(spec, podRef) } -func (plugin *secretPlugin) newBuilderInternal(spec *api.Volume, podUID types.UID) (volume.Builder, error) { - return &secretVolume{spec.Name, podUID, plugin, &spec.Secret.Target}, nil +func (plugin *secretPlugin) newBuilderInternal(spec *api.Volume, podRef *api.ObjectReference) (volume.Builder, error) { + return &secretVolume{spec.Name, podRef, plugin, &spec.Secret.Target}, nil } func (plugin *secretPlugin) NewCleaner(volName string, podUID types.UID) (volume.Cleaner, error) { @@ -71,14 +71,14 @@ func (plugin *secretPlugin) NewCleaner(volName string, podUID types.UID) (volume } func (plugin *secretPlugin) newCleanerInternal(volName string, podUID types.UID) (volume.Cleaner, error) { - return &secretVolume{volName, podUID, plugin, nil}, nil + return &secretVolume{volName, &api.ObjectReference{UID: podUID}, plugin, nil}, nil } // secretVolume handles retrieving secrets from the API server // and placing them into the volume on the host. type secretVolume struct { volName string - podUID types.UID + podRef *api.ObjectReference plugin *secretPlugin secretRef *api.ObjectReference } @@ -86,7 +86,7 @@ type secretVolume struct { func (sv *secretVolume) SetUp() error { // TODO: explore tmpfs for secret volumes hostPath := sv.GetPath() - glog.V(3).Infof("Setting up volume %v for pod %v at %v", sv.volName, sv.podUID, hostPath) + glog.V(3).Infof("Setting up volume %v for pod %v at %v", sv.volName, sv.podRef.UID, hostPath) err := os.MkdirAll(hostPath, 0777) if err != nil { return err @@ -97,7 +97,7 @@ func (sv *secretVolume) SetUp() error { return fmt.Errorf("Cannot setup secret volume %v because kube client is not configured", sv) } - secret, err := kubeClient.Secrets(sv.secretRef.Namespace).Get(sv.secretRef.Name) + secret, err := kubeClient.Secrets(sv.podRef.Namespace).Get(sv.secretRef.Name) if err != nil { glog.Errorf("Couldn't get secret %v/%v", sv.secretRef.Namespace, sv.secretRef.Name) return err @@ -116,11 +116,11 @@ func (sv *secretVolume) SetUp() error { } func (sv *secretVolume) GetPath() string { - return sv.plugin.host.GetPodVolumeDir(sv.podUID, volume.EscapePluginName(secretPluginName), sv.volName) + return sv.plugin.host.GetPodVolumeDir(sv.podRef.UID, volume.EscapePluginName(secretPluginName), sv.volName) } func (sv *secretVolume) TearDown() error { - glog.V(3).Infof("Tearing down volume %v for pod %v at %v", sv.volName, sv.podUID, sv.GetPath()) + glog.V(3).Infof("Tearing down volume %v for pod %v at %v", sv.volName, sv.podRef.UID, sv.GetPath()) tmpDir, err := volume.RenameDirectory(sv.GetPath(), sv.volName+".deleting~") if err != nil { return err diff --git a/pkg/kubelet/volume/secret/secret_test.go b/pkg/kubelet/volume/secret/secret_test.go index 057840e415f..d770ae9b352 100644 --- a/pkg/kubelet/volume/secret/secret_test.go +++ b/pkg/kubelet/volume/secret/secret_test.go @@ -99,7 +99,7 @@ func TestPlugin(t *testing.T) { t.Errorf("Can't find the plugin by name") } - builder, err := plugin.NewBuilder(volumeSpec, types.UID(testPodUID)) + builder, err := plugin.NewBuilder(volumeSpec, &api.ObjectReference{UID: types.UID(testPodUID)}) if err != nil { t.Errorf("Failed to make a new Builder: %v", err) } diff --git a/pkg/kubelet/volume/testing.go b/pkg/kubelet/volume/testing.go index 84aa4724648..0e727e8ce20 100644 --- a/pkg/kubelet/volume/testing.go +++ b/pkg/kubelet/volume/testing.go @@ -71,8 +71,8 @@ func (plugin *FakePlugin) CanSupport(spec *api.Volume) bool { return true } -func (plugin *FakePlugin) NewBuilder(spec *api.Volume, podUID types.UID) (Builder, error) { - return &FakeVolume{podUID, spec.Name, plugin}, nil +func (plugin *FakePlugin) NewBuilder(spec *api.Volume, podRef *api.ObjectReference) (Builder, error) { + return &FakeVolume{podRef.UID, spec.Name, plugin}, nil } func (plugin *FakePlugin) NewCleaner(volName string, podUID types.UID) (Cleaner, error) { diff --git a/pkg/kubelet/volumes.go b/pkg/kubelet/volumes.go index 461e37c60ce..1c82db2093a 100644 --- a/pkg/kubelet/volumes.go +++ b/pkg/kubelet/volumes.go @@ -53,7 +53,7 @@ func (vh *volumeHost) GetKubeClient() client.Interface { return vh.kubelet.kubeClient } -func (kl *Kubelet) newVolumeBuilderFromPlugins(spec *api.Volume, podUID types.UID) volume.Builder { +func (kl *Kubelet) newVolumeBuilderFromPlugins(spec *api.Volume, podRef *api.ObjectReference) volume.Builder { plugin, err := kl.volumePluginMgr.FindPluginBySpec(spec) if err != nil { glog.Warningf("Can't use volume plugins for %s: %v", spew.Sprintf("%#v", *spec), err) @@ -63,7 +63,7 @@ func (kl *Kubelet) newVolumeBuilderFromPlugins(spec *api.Volume, podUID types.UI glog.Errorf("No error, but nil volume plugin for %s", spew.Sprintf("%#v", *spec)) return nil } - builder, err := plugin.NewBuilder(spec, podUID) + builder, err := plugin.NewBuilder(spec, podRef) if err != nil { glog.Warningf("Error instantiating volume plugin for %s: %v", spew.Sprintf("%#v", *spec), err) return nil @@ -77,12 +77,18 @@ func (kl *Kubelet) mountExternalVolumes(pod *api.BoundPod) (volumeMap, error) { for i := range pod.Spec.Volumes { volSpec := &pod.Spec.Volumes[i] + podRef, err := api.GetReference(pod) + if err != nil { + glog.Errorf("Error getting object reference for pod: %v", pod, err) + return nil, err + } + // Try to use a plugin for this volume. - builder := kl.newVolumeBuilderFromPlugins(volSpec, pod.UID) + builder := kl.newVolumeBuilderFromPlugins(volSpec, podRef) if builder == nil { return nil, errUnsupportedVolumeType } - err := builder.SetUp() + err = builder.SetUp() if err != nil { return nil, err }