mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-08-01 15:58:37 +00:00
Merge pull request #18773 from ihmccreery/fix-upgrade-proxy
Auto commit by PR queue bot
This commit is contained in:
commit
796cc55663
@ -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
|
||||||
}
|
}
|
||||||
|
@ -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)
|
||||||
}
|
}
|
||||||
|
@ -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
|
||||||
}
|
}
|
||||||
|
@ -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))
|
||||||
|
@ -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}))
|
||||||
|
@ -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))
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user