Merge pull request #18773 from ihmccreery/fix-upgrade-proxy

Auto commit by PR queue bot
This commit is contained in:
k8s-merge-robot 2015-12-19 21:10:34 -08:00
commit 796cc55663
6 changed files with 207 additions and 62 deletions

View File

@ -44,7 +44,7 @@ func Parse(gitversion string) (semver.Version, error) {
func MustParse(gitversion string) semver.Version { func MustParse(gitversion string) semver.Version {
v, err := Parse(gitversion) v, err := Parse(gitversion)
if err != nil { if err != nil {
glog.Fatalf("failed to parse semver from giversion %q: %v", gitversion, err) glog.Fatalf("failed to parse semver from gitversion %q: %v", gitversion, err)
} }
return v return v
} }

View File

@ -130,14 +130,29 @@ func assertFilesExist(fileNames []string, fileDir string, pod *api.Pod, client *
expectNoError(wait.Poll(time.Second*2, time.Second*60, func() (bool, error) { expectNoError(wait.Poll(time.Second*2, time.Second*60, func() (bool, error) {
failed = []string{} failed = []string{}
subResourceProxyAvailable, err := serverVersionGTE(subResourceProxyVersion, client)
if err != nil {
return false, err
}
for _, fileName := range fileNames { for _, fileName := range fileNames {
if _, err := client.Get(). if subResourceProxyAvailable {
Namespace(pod.Namespace). _, err = client.Get().
Resource("pods"). Namespace(pod.Namespace).
SubResource("proxy"). Resource("pods").
Name(pod.Name). SubResource("proxy").
Suffix(fileDir, fileName). Name(pod.Name).
Do().Raw(); err != nil { Suffix(fileDir, fileName).
Do().Raw()
} else {
_, err = client.Get().
Prefix("proxy").
Resource("pods").
Namespace(pod.Namespace).
Name(pod.Name).
Suffix(fileDir, fileName).
Do().Raw()
}
if err != nil {
Logf("Unable to read %s from pod %s: %v", fileName, pod.Name, err) Logf("Unable to read %s from pod %s: %v", fileName, pod.Name, err)
failed = append(failed, fileName) failed = append(failed, fileName)
} }

View File

@ -258,15 +258,34 @@ var _ = Describe("Kubectl client", func() {
if err != nil { if err != nil {
Failf("unable to create streaming upload. Error: %s", err) Failf("unable to create streaming upload. Error: %s", err)
} }
resp, err := c.Post().
Namespace(ns). subResourceProxyAvailable, err := serverVersionGTE(subResourceProxyVersion, c)
Name("netexec"). if err != nil {
Resource("pods"). Failf("Unable to determine server version. Error: %s", err)
SubResource("proxy"). }
Suffix("upload").
SetHeader("Content-Type", postConfigBodyWriter.FormDataContentType()). var resp []byte
Body(pipeConfigReader). if subResourceProxyAvailable {
Do().Raw() resp, err = c.Post().
Namespace(ns).
Name("netexec").
Resource("pods").
SubResource("proxy").
Suffix("upload").
SetHeader("Content-Type", postConfigBodyWriter.FormDataContentType()).
Body(pipeConfigReader).
Do().Raw()
} else {
resp, err = c.Post().
Prefix("proxy").
Namespace(ns).
Name("netexec").
Resource("pods").
Suffix("upload").
SetHeader("Content-Type", postConfigBodyWriter.FormDataContentType()).
Body(pipeConfigReader).
Do().Raw()
}
if err != nil { if err != nil {
Failf("Unable to upload kubeconfig to the remote exec server due to error: %s", err) Failf("Unable to upload kubeconfig to the remote exec server due to error: %s", err)
} }
@ -285,15 +304,27 @@ var _ = Describe("Kubectl client", func() {
By("uploading kubectl to netexec") By("uploading kubectl to netexec")
var uploadOutput NetexecOutput var uploadOutput NetexecOutput
// Upload the kubectl binary // Upload the kubectl binary
resp, err = c.Post(). if subResourceProxyAvailable {
Namespace(ns). resp, err = c.Post().
Name("netexec"). Namespace(ns).
Resource("pods"). Name("netexec").
SubResource("proxy"). Resource("pods").
Suffix("upload"). SubResource("proxy").
SetHeader("Content-Type", postBodyWriter.FormDataContentType()). Suffix("upload").
Body(pipeReader). SetHeader("Content-Type", postBodyWriter.FormDataContentType()).
Do().Raw() Body(pipeReader).
Do().Raw()
} else {
resp, err = c.Post().
Prefix("proxy").
Namespace(ns).
Name("netexec").
Resource("pods").
Suffix("upload").
SetHeader("Content-Type", postBodyWriter.FormDataContentType()).
Body(pipeReader).
Do().Raw()
}
if err != nil { if err != nil {
Failf("Unable to upload kubectl binary to the remote exec server due to error: %s", err) Failf("Unable to upload kubectl binary to the remote exec server due to error: %s", err)
} }
@ -323,14 +354,26 @@ var _ = Describe("Kubectl client", func() {
shellCommand := fmt.Sprintf("%s=%s .%s --kubeconfig=%s --server=%s --namespace=%s exec nginx echo running in container", proxyVar, proxyAddr, uploadBinaryName, kubecConfigRemotePath, apiServer, ns) shellCommand := fmt.Sprintf("%s=%s .%s --kubeconfig=%s --server=%s --namespace=%s exec nginx echo running in container", proxyVar, proxyAddr, uploadBinaryName, kubecConfigRemotePath, apiServer, ns)
// Execute kubectl on remote exec server. // Execute kubectl on remote exec server.
netexecShellOutput, err := c.Post(). var netexecShellOutput []byte
Namespace(ns). if subResourceProxyAvailable {
Name("netexec"). netexecShellOutput, err = c.Post().
Resource("pods"). Namespace(ns).
SubResource("proxy"). Name("netexec").
Suffix("shell"). Resource("pods").
Param("shellCommand", shellCommand). SubResource("proxy").
Do().Raw() Suffix("shell").
Param("shellCommand", shellCommand).
Do().Raw()
} else {
netexecShellOutput, err = c.Post().
Prefix("proxy").
Namespace(ns).
Name("netexec").
Resource("pods").
Suffix("shell").
Param("shellCommand", shellCommand).
Do().Raw()
}
if err != nil { if err != nil {
Failf("Unable to execute kubectl binary on the remote exec server due to error: %s", err) Failf("Unable to execute kubectl binary on the remote exec server due to error: %s", err)
} }
@ -1145,14 +1188,30 @@ func getUDData(jpgExpected string, ns string) func(*client.Client, string) error
// getUDData validates data.json in the update-demo (returns nil if data is ok). // getUDData validates data.json in the update-demo (returns nil if data is ok).
return func(c *client.Client, podID string) error { return func(c *client.Client, podID string) error {
Logf("validating pod %s", podID) Logf("validating pod %s", podID)
body, err := c.Get(). subResourceProxyAvailable, err := serverVersionGTE(subResourceProxyVersion, c)
Namespace(ns). if err != nil {
Resource("pods"). return err
SubResource("proxy"). }
Name(podID). var body []byte
Suffix("data.json"). if subResourceProxyAvailable {
Do(). body, err = c.Get().
Raw() Namespace(ns).
Resource("pods").
SubResource("proxy").
Name(podID).
Suffix("data.json").
Do().
Raw()
} else {
body, err = c.Get().
Prefix("proxy").
Namespace(ns).
Resource("pods").
Name(podID).
Suffix("data.json").
Do().
Raw()
}
if err != nil { if err != nil {
return err return err
} }

View File

@ -117,13 +117,29 @@ func testPreStop(c *client.Client, ns string) {
// Validate that the server received the web poke. // Validate that the server received the web poke.
err = wait.Poll(time.Second*5, time.Second*60, func() (bool, error) { err = wait.Poll(time.Second*5, time.Second*60, func() (bool, error) {
if body, err := c.Get(). subResourceProxyAvailable, err := serverVersionGTE(subResourceProxyVersion, c)
Namespace(ns). if err != nil {
Resource("pods"). return false, err
SubResource("proxy"). }
Name(podDescr.Name). var body []byte
Suffix("read"). if subResourceProxyAvailable {
DoRaw(); err != nil { body, err = c.Get().
Namespace(ns).
Resource("pods").
SubResource("proxy").
Name(podDescr.Name).
Suffix("read").
DoRaw()
} else {
body, err = c.Get().
Prefix("proxy").
Namespace(ns).
Resource("pods").
Name(podDescr.Name).
Suffix("read").
DoRaw()
}
if err != nil {
By(fmt.Sprintf("Error validating prestop: %v", err)) By(fmt.Sprintf("Error validating prestop: %v", err))
} else { } else {
Logf("Saw: %s", string(body)) Logf("Saw: %s", string(body))

View File

@ -52,8 +52,10 @@ import (
deploymentutil "k8s.io/kubernetes/pkg/util/deployment" deploymentutil "k8s.io/kubernetes/pkg/util/deployment"
"k8s.io/kubernetes/pkg/util/sets" "k8s.io/kubernetes/pkg/util/sets"
"k8s.io/kubernetes/pkg/util/wait" "k8s.io/kubernetes/pkg/util/wait"
"k8s.io/kubernetes/pkg/version"
"k8s.io/kubernetes/pkg/watch" "k8s.io/kubernetes/pkg/watch"
"github.com/blang/semver"
"github.com/davecgh/go-spew/spew" "github.com/davecgh/go-spew/spew"
"golang.org/x/crypto/ssh" "golang.org/x/crypto/ssh"
"golang.org/x/net/websocket" "golang.org/x/net/websocket"
@ -106,6 +108,14 @@ const (
endpointRegisterTimeout = time.Minute endpointRegisterTimeout = time.Minute
) )
// SubResource proxy should have been functional in v1.0.0, but SubResource
// proxy via tunneling is known to be broken in v1.0. See
// https://github.com/kubernetes/kubernetes/pull/15224#issuecomment-146769463
//
// TODO(ihmccreery): remove once we don't care about v1.0 anymore, (tentatively
// in v1.3).
var subResourceProxyVersion = version.MustParse("v1.1.0")
type CloudConfig struct { type CloudConfig struct {
ProjectID string ProjectID string
Zone string Zone string
@ -899,13 +909,28 @@ func (r podResponseChecker) checkAllResponses() (done bool, err error) {
if !isElementOf(pod.UID, currentPods) { if !isElementOf(pod.UID, currentPods) {
return false, fmt.Errorf("pod with UID %s is no longer a member of the replica set. Must have been restarted for some reason. Current replica set: %v", pod.UID, currentPods) return false, fmt.Errorf("pod with UID %s is no longer a member of the replica set. Must have been restarted for some reason. Current replica set: %v", pod.UID, currentPods)
} }
body, err := r.c.Get(). subResourceProxyAvailable, err := serverVersionGTE(subResourceProxyVersion, r.c)
Namespace(r.ns). if err != nil {
Resource("pods"). return false, err
SubResource("proxy"). }
Name(string(pod.Name)). var body []byte
Do(). if subResourceProxyAvailable {
Raw() body, err = r.c.Get().
Namespace(r.ns).
Resource("pods").
SubResource("proxy").
Name(string(pod.Name)).
Do().
Raw()
} else {
body, err = r.c.Get().
Prefix("proxy").
Namespace(r.ns).
Resource("pods").
Name(string(pod.Name)).
Do().
Raw()
}
if err != nil { if err != nil {
Logf("Controller %s: Failed to GET from replica %d [%s]: %v:", r.controllerName, i+1, pod.Name, err) Logf("Controller %s: Failed to GET from replica %d [%s]: %v:", r.controllerName, i+1, pod.Name, err)
continue continue
@ -940,6 +965,22 @@ func (r podResponseChecker) checkAllResponses() (done bool, err error) {
return true, nil return true, nil
} }
// serverVersionGTE returns true if v is greater than or equal to the server
// version.
//
// TODO(18726): This should be incorporated into client.VersionInterface.
func serverVersionGTE(v semver.Version, c client.VersionInterface) (bool, error) {
serverVersion, err := c.ServerVersion()
if err != nil {
return false, fmt.Errorf("Unable to get server version: %v", err)
}
sv, err := version.Parse(serverVersion.GitVersion)
if err != nil {
return false, fmt.Errorf("Unable to parse server version %q: %v", serverVersion.GitVersion, err)
}
return sv.GTE(v), nil
}
func podsResponding(c *client.Client, ns, name string, wantName bool, pods *api.PodList) error { func podsResponding(c *client.Client, ns, name string, wantName bool, pods *api.PodList) error {
By("trying to dial each unique pod") By("trying to dial each unique pod")
label := labels.SelectorFromSet(labels.Set(map[string]string{"name": name})) label := labels.SelectorFromSet(labels.Set(map[string]string{"name": name}))

View File

@ -225,12 +225,26 @@ func testVolumeClient(client *client.Client, config VolumeTestConfig, volume api
expectNoError(waitForPodRunningInNamespace(client, clientPod.Name, config.namespace)) expectNoError(waitForPodRunningInNamespace(client, clientPod.Name, config.namespace))
By("reading a web page from the client") By("reading a web page from the client")
body, err := client.Get(). subResourceProxyAvailable, err := serverVersionGTE(subResourceProxyVersion, client)
Namespace(config.namespace). if err != nil {
Resource("pods"). Failf("Failed to get server version: %v", err)
SubResource("proxy"). }
Name(clientPod.Name). var body []byte
DoRaw() if subResourceProxyAvailable {
body, err = client.Get().
Namespace(config.namespace).
Resource("pods").
SubResource("proxy").
Name(clientPod.Name).
DoRaw()
} else {
body, err = client.Get().
Prefix("proxy").
Namespace(config.namespace).
Resource("pods").
Name(clientPod.Name).
DoRaw()
}
expectNoError(err, "Cannot read web page: %v", err) expectNoError(err, "Cannot read web page: %v", err)
Logf("body: %v", string(body)) Logf("body: %v", string(body))