podlogs_test.go 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  1. /*
  2. Copyright 2018 The Kubernetes Authors.
  3. Licensed under the Apache License, Version 2.0 (the "License");
  4. you may not use this file except in compliance with the License.
  5. You may obtain a copy of the License at
  6. http://www.apache.org/licenses/LICENSE-2.0
  7. Unless required by applicable law or agreed to in writing, software
  8. distributed under the License is distributed on an "AS IS" BASIS,
  9. WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  10. See the License for the specific language governing permissions and
  11. limitations under the License.
  12. */
  13. package podlogs
  14. import (
  15. "context"
  16. "net"
  17. "net/http"
  18. "net/http/httptest"
  19. "net/url"
  20. "strconv"
  21. "strings"
  22. "testing"
  23. corev1 "k8s.io/api/core/v1"
  24. metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
  25. "k8s.io/kubernetes/cmd/kube-apiserver/app/options"
  26. "k8s.io/kubernetes/test/integration/framework"
  27. )
  28. func TestInsecurePodLogs(t *testing.T) {
  29. stopCh := make(chan struct{})
  30. defer close(stopCh)
  31. clientSet, _ := framework.StartTestServer(t, stopCh, framework.TestServerSetup{
  32. ModifyServerRunOptions: func(opts *options.ServerRunOptions) {
  33. opts.GenericServerRunOptions.MaxRequestBodyBytes = 1024 * 1024
  34. // I have no idea what this cert is, but it doesn't matter, we just want something that always fails validation
  35. opts.KubeletConfig.CAData = []byte(` -----BEGIN CERTIFICATE-----
  36. MIIDMDCCAhigAwIBAgIIHNPD7sig7YIwDQYJKoZIhvcNAQELBQAwNjESMBAGA1UE
  37. CxMJb3BlbnNoaWZ0MSAwHgYDVQQDExdhZG1pbi1rdWJlY29uZmlnLXNpZ25lcjAe
  38. Fw0xOTA1MzAxNTA3MzlaFw0yOTA1MjcxNTA3MzlaMDYxEjAQBgNVBAsTCW9wZW5z
  39. aGlmdDEgMB4GA1UEAxMXYWRtaW4ta3ViZWNvbmZpZy1zaWduZXIwggEiMA0GCSqG
  40. SIb3DQEBAQUAA4IBDwAwggEKAoIBAQD0dHk23lHRcuq06FzYDOl9J9+s8pnGxqA3
  41. IPcARI6ag/98aYe3ENwAB5e1i7AU2F2WiDZgj444w374XLdVgIK8zgQEm9yoqrlc
  42. +/ayO7ceKklrKHOMwh63LvGLEOqzhol2nFmBhXAZt+HyIoZHXN0IqlA92196+Dml
  43. 0WOn1F4ce6JbAtEceFHPgLeI7KFmVaPz2796pBXh23ii6r7WvV1Rn9MKlMSBJQR4
  44. 0LZzu9/j+GdnFXewdLAAMfgPzwEqv6h3PzvtUCjgdraHEm8Rs7s15S3PUmLK4RQS
  45. PsThx5BhJEGd/W6EzQ3BKoQfochhu3mnAQtW1J07CullySQ5Gg9fAgMBAAGjQjBA
  46. MA4GA1UdDwEB/wQEAwICpDAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBQkTaaw
  47. YJSZ5k2Wd+OsM4GFMTGdqzANBgkqhkiG9w0BAQsFAAOCAQEAHK7+zBZPLqK+f9DT
  48. UEnpwRmZ0aeGS4YgbGIkqpjxJymVOwkRd5A1wslvVfGZ6yOQthF6KlCmqnPyJJMR
  49. I7FHw8j0h2ci90fEQ6IS90Y/ZJXkcgiK9Ncwa35GFGs8QrBxN4leGhtm84BnnBHN
  50. cTWpa4zcBwru0CRG7iHc66VX16X8jHB1iFeZ5W/FgY4MsE+G1Vze4mCXSPVI4BZ2
  51. /qlAgogjBivvSwQ9SFuCszg7IPjvT2ksm+Cf+8eT4YBqW41F85vBGR+FYK14yIla
  52. Bgqc+dJN9xS9Ah5gLiGQJ6C4niUA11piCpvMsy+j/LQ1Erx47KMar5fuMXYk7iPq
  53. 1vqIwg==
  54. -----END CERTIFICATE-----
  55. `)
  56. },
  57. })
  58. fakeKubeletServer := httptest.NewTLSServer(http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) {
  59. w.Write([]byte("fake-log"))
  60. w.WriteHeader(http.StatusOK)
  61. }))
  62. defer fakeKubeletServer.Close()
  63. fakeKubeletURL, err := url.Parse(fakeKubeletServer.URL)
  64. if err != nil {
  65. t.Fatal(err)
  66. }
  67. fakeKubeletHost, fakeKubeletPortStr, err := net.SplitHostPort(fakeKubeletURL.Host)
  68. if err != nil {
  69. t.Fatal(err)
  70. }
  71. fakeKubeletPort, err := strconv.ParseUint(fakeKubeletPortStr, 10, 32)
  72. if err != nil {
  73. t.Fatal(err)
  74. }
  75. node, err := clientSet.CoreV1().Nodes().Create(context.TODO(), &corev1.Node{
  76. ObjectMeta: metav1.ObjectMeta{Name: "fake"},
  77. }, metav1.CreateOptions{})
  78. if err != nil {
  79. t.Fatal(err)
  80. }
  81. node.Status = corev1.NodeStatus{
  82. Addresses: []corev1.NodeAddress{
  83. {
  84. Type: corev1.NodeExternalIP,
  85. Address: fakeKubeletHost,
  86. },
  87. },
  88. DaemonEndpoints: corev1.NodeDaemonEndpoints{
  89. KubeletEndpoint: corev1.DaemonEndpoint{
  90. Port: int32(fakeKubeletPort),
  91. },
  92. },
  93. }
  94. node, err = clientSet.CoreV1().Nodes().UpdateStatus(context.TODO(), node, metav1.UpdateOptions{})
  95. if err != nil {
  96. t.Fatal(err)
  97. }
  98. _, err = clientSet.CoreV1().Namespaces().Create(context.TODO(), &corev1.Namespace{
  99. ObjectMeta: metav1.ObjectMeta{Name: "ns"},
  100. }, metav1.CreateOptions{})
  101. if err != nil {
  102. t.Fatal(err)
  103. }
  104. _, err = clientSet.CoreV1().ServiceAccounts("ns").Create(context.TODO(), &corev1.ServiceAccount{
  105. ObjectMeta: metav1.ObjectMeta{Name: "default", Namespace: "ns"},
  106. }, metav1.CreateOptions{})
  107. if err != nil {
  108. t.Fatal(err)
  109. }
  110. falseRef := false
  111. pod, err := clientSet.CoreV1().Pods("ns").Create(context.TODO(), &corev1.Pod{
  112. ObjectMeta: metav1.ObjectMeta{Name: "test-pod", Namespace: "ns"},
  113. Spec: corev1.PodSpec{
  114. Containers: []corev1.Container{
  115. {
  116. Name: "foo",
  117. Image: "some/image:latest",
  118. },
  119. },
  120. NodeName: node.Name,
  121. AutomountServiceAccountToken: &falseRef,
  122. },
  123. }, metav1.CreateOptions{})
  124. if err != nil {
  125. t.Fatal(err)
  126. }
  127. insecureResult := clientSet.CoreV1().Pods("ns").GetLogs(pod.Name, &corev1.PodLogOptions{InsecureSkipTLSVerifyBackend: true}).Do(context.TODO())
  128. if err := insecureResult.Error(); err != nil {
  129. t.Fatal(err)
  130. }
  131. insecureStatusCode := 0
  132. insecureResult.StatusCode(&insecureStatusCode)
  133. if insecureStatusCode != http.StatusOK {
  134. t.Fatal(insecureStatusCode)
  135. }
  136. secureResult := clientSet.CoreV1().Pods("ns").GetLogs(pod.Name, &corev1.PodLogOptions{}).Do(context.TODO())
  137. if err := secureResult.Error(); err == nil || !strings.Contains(err.Error(), "x509: certificate signed by unknown authority") {
  138. t.Fatal(err)
  139. }
  140. secureStatusCode := 0
  141. secureResult.StatusCode(&secureStatusCode)
  142. if secureStatusCode == http.StatusOK {
  143. raw, rawErr := secureResult.Raw()
  144. if rawErr != nil {
  145. t.Log(rawErr)
  146. }
  147. t.Log(string(raw))
  148. t.Fatal(secureStatusCode)
  149. }
  150. }