replace_test.go 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198
  1. /*
  2. Copyright 2015 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 cmd
  14. import (
  15. "bytes"
  16. "net/http"
  17. "strings"
  18. "testing"
  19. "k8s.io/kubernetes/pkg/client/typed/dynamic"
  20. "k8s.io/kubernetes/pkg/client/unversioned/fake"
  21. )
  22. func TestReplaceObject(t *testing.T) {
  23. _, _, rc := testData()
  24. f, tf, codec, _ := NewAPIFactory()
  25. ns := dynamic.ContentConfig().NegotiatedSerializer
  26. tf.Printer = &testPrinter{}
  27. tf.Client = &fake.RESTClient{
  28. NegotiatedSerializer: ns,
  29. Client: fake.CreateHTTPClient(func(req *http.Request) (*http.Response, error) {
  30. switch p, m := req.URL.Path, req.Method; {
  31. case p == "/namespaces/test/replicationcontrollers/redis-master" && (m == http.MethodGet || m == http.MethodPut || m == http.MethodDelete):
  32. return &http.Response{StatusCode: http.StatusOK, Header: defaultHeader(), Body: objBody(codec, &rc.Items[0])}, nil
  33. case p == "/namespaces/test/replicationcontrollers" && m == http.MethodPost:
  34. return &http.Response{StatusCode: http.StatusCreated, Header: defaultHeader(), Body: objBody(codec, &rc.Items[0])}, nil
  35. default:
  36. t.Fatalf("unexpected request: %#v\n%#v", req.URL, req)
  37. return nil, nil
  38. }
  39. }),
  40. }
  41. tf.Namespace = "test"
  42. buf := bytes.NewBuffer([]byte{})
  43. cmd := NewCmdReplace(f, buf)
  44. cmd.Flags().Set("filename", "../../../examples/guestbook/legacy/redis-master-controller.yaml")
  45. cmd.Flags().Set("output", "name")
  46. cmd.Run(cmd, []string{})
  47. // uses the name from the file, not the response
  48. if buf.String() != "replicationcontroller/rc1\n" {
  49. t.Errorf("unexpected output: %s", buf.String())
  50. }
  51. buf.Reset()
  52. cmd.Flags().Set("force", "true")
  53. cmd.Flags().Set("cascade", "false")
  54. cmd.Flags().Set("output", "name")
  55. cmd.Run(cmd, []string{})
  56. if buf.String() != "replicationcontroller/redis-master\nreplicationcontroller/rc1\n" {
  57. t.Errorf("unexpected output: %s", buf.String())
  58. }
  59. }
  60. func TestReplaceMultipleObject(t *testing.T) {
  61. _, svc, rc := testData()
  62. f, tf, codec, _ := NewAPIFactory()
  63. ns := dynamic.ContentConfig().NegotiatedSerializer
  64. tf.Printer = &testPrinter{}
  65. tf.Client = &fake.RESTClient{
  66. NegotiatedSerializer: ns,
  67. Client: fake.CreateHTTPClient(func(req *http.Request) (*http.Response, error) {
  68. switch p, m := req.URL.Path, req.Method; {
  69. case p == "/namespaces/test/replicationcontrollers/redis-master" && (m == http.MethodGet || m == http.MethodPut || m == http.MethodDelete):
  70. return &http.Response{StatusCode: http.StatusOK, Header: defaultHeader(), Body: objBody(codec, &rc.Items[0])}, nil
  71. case p == "/namespaces/test/replicationcontrollers" && m == http.MethodPost:
  72. return &http.Response{StatusCode: http.StatusCreated, Header: defaultHeader(), Body: objBody(codec, &rc.Items[0])}, nil
  73. case p == "/namespaces/test/services/frontend" && (m == http.MethodGet || m == http.MethodPut || m == http.MethodDelete):
  74. return &http.Response{StatusCode: http.StatusOK, Header: defaultHeader(), Body: objBody(codec, &svc.Items[0])}, nil
  75. case p == "/namespaces/test/services" && m == http.MethodPost:
  76. return &http.Response{StatusCode: http.StatusCreated, Header: defaultHeader(), Body: objBody(codec, &svc.Items[0])}, nil
  77. default:
  78. t.Fatalf("unexpected request: %#v\n%#v", req.URL, req)
  79. return nil, nil
  80. }
  81. }),
  82. }
  83. tf.Namespace = "test"
  84. buf := bytes.NewBuffer([]byte{})
  85. cmd := NewCmdReplace(f, buf)
  86. cmd.Flags().Set("filename", "../../../examples/guestbook/legacy/redis-master-controller.yaml")
  87. cmd.Flags().Set("filename", "../../../examples/guestbook/frontend-service.yaml")
  88. cmd.Flags().Set("output", "name")
  89. cmd.Run(cmd, []string{})
  90. if buf.String() != "replicationcontroller/rc1\nservice/baz\n" {
  91. t.Errorf("unexpected output: %s", buf.String())
  92. }
  93. buf.Reset()
  94. cmd.Flags().Set("force", "true")
  95. cmd.Flags().Set("cascade", "false")
  96. cmd.Flags().Set("output", "name")
  97. cmd.Run(cmd, []string{})
  98. if buf.String() != "replicationcontroller/redis-master\nservice/frontend\nreplicationcontroller/rc1\nservice/baz\n" {
  99. t.Errorf("unexpected output: %s", buf.String())
  100. }
  101. }
  102. func TestReplaceDirectory(t *testing.T) {
  103. _, _, rc := testData()
  104. f, tf, codec, _ := NewAPIFactory()
  105. ns := dynamic.ContentConfig().NegotiatedSerializer
  106. tf.Printer = &testPrinter{}
  107. tf.Client = &fake.RESTClient{
  108. NegotiatedSerializer: ns,
  109. Client: fake.CreateHTTPClient(func(req *http.Request) (*http.Response, error) {
  110. switch p, m := req.URL.Path, req.Method; {
  111. case strings.HasPrefix(p, "/namespaces/test/replicationcontrollers/") && (m == http.MethodGet || m == http.MethodPut || m == http.MethodDelete):
  112. return &http.Response{StatusCode: http.StatusOK, Header: defaultHeader(), Body: objBody(codec, &rc.Items[0])}, nil
  113. case strings.HasPrefix(p, "/namespaces/test/replicationcontrollers") && m == http.MethodPost:
  114. return &http.Response{StatusCode: http.StatusCreated, Header: defaultHeader(), Body: objBody(codec, &rc.Items[0])}, nil
  115. default:
  116. t.Fatalf("unexpected request: %#v\n%#v", req.URL, req)
  117. return nil, nil
  118. }
  119. }),
  120. }
  121. tf.Namespace = "test"
  122. buf := bytes.NewBuffer([]byte{})
  123. cmd := NewCmdReplace(f, buf)
  124. cmd.Flags().Set("filename", "../../../examples/guestbook/legacy")
  125. cmd.Flags().Set("namespace", "test")
  126. cmd.Flags().Set("output", "name")
  127. cmd.Run(cmd, []string{})
  128. if buf.String() != "replicationcontroller/rc1\nreplicationcontroller/rc1\nreplicationcontroller/rc1\n" {
  129. t.Errorf("unexpected output: %s", buf.String())
  130. }
  131. buf.Reset()
  132. cmd.Flags().Set("force", "true")
  133. cmd.Flags().Set("cascade", "false")
  134. cmd.Run(cmd, []string{})
  135. if buf.String() != "replicationcontroller/frontend\nreplicationcontroller/redis-master\nreplicationcontroller/redis-slave\n"+
  136. "replicationcontroller/rc1\nreplicationcontroller/rc1\nreplicationcontroller/rc1\n" {
  137. t.Errorf("unexpected output: %s", buf.String())
  138. }
  139. }
  140. func TestForceReplaceObjectNotFound(t *testing.T) {
  141. _, _, rc := testData()
  142. f, tf, codec, _ := NewAPIFactory()
  143. ns := dynamic.ContentConfig().NegotiatedSerializer
  144. tf.Printer = &testPrinter{}
  145. tf.Client = &fake.RESTClient{
  146. NegotiatedSerializer: ns,
  147. Client: fake.CreateHTTPClient(func(req *http.Request) (*http.Response, error) {
  148. switch p, m := req.URL.Path, req.Method; {
  149. case p == "/namespaces/test/replicationcontrollers/redis-master" && m == http.MethodDelete:
  150. return &http.Response{StatusCode: http.StatusNotFound, Header: defaultHeader(), Body: stringBody("")}, nil
  151. case p == "/namespaces/test/replicationcontrollers" && m == http.MethodPost:
  152. return &http.Response{StatusCode: http.StatusCreated, Header: defaultHeader(), Body: objBody(codec, &rc.Items[0])}, nil
  153. default:
  154. t.Fatalf("unexpected request: %#v\n%#v", req.URL, req)
  155. return nil, nil
  156. }
  157. }),
  158. }
  159. tf.Namespace = "test"
  160. buf := bytes.NewBuffer([]byte{})
  161. cmd := NewCmdReplace(f, buf)
  162. cmd.Flags().Set("filename", "../../../examples/guestbook/legacy/redis-master-controller.yaml")
  163. cmd.Flags().Set("force", "true")
  164. cmd.Flags().Set("cascade", "false")
  165. cmd.Flags().Set("output", "name")
  166. cmd.Run(cmd, []string{})
  167. if buf.String() != "replicationcontroller/rc1\n" {
  168. t.Errorf("unexpected output: %s", buf.String())
  169. }
  170. }