server_others_test.go 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  1. // +build !windows
  2. /*
  3. Copyright 2018 The Kubernetes Authors.
  4. Licensed under the Apache License, Version 2.0 (the "License");
  5. you may not use this file except in compliance with the License.
  6. You may obtain a copy of the License at
  7. http://www.apache.org/licenses/LICENSE-2.0
  8. Unless required by applicable law or agreed to in writing, software
  9. distributed under the License is distributed on an "AS IS" BASIS,
  10. WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  11. See the License for the specific language governing permissions and
  12. limitations under the License.
  13. */
  14. package app
  15. import (
  16. "fmt"
  17. "testing"
  18. "k8s.io/kubernetes/pkg/proxy/ipvs"
  19. "k8s.io/kubernetes/pkg/util/iptables"
  20. )
  21. func Test_getProxyMode(t *testing.T) {
  22. var cases = []struct {
  23. flag string
  24. iptablesVersion string
  25. ipsetVersion string
  26. kmods []string
  27. kernelCompat bool
  28. iptablesError error
  29. ipsetError error
  30. expected string
  31. }{
  32. { // flag says userspace
  33. flag: "userspace",
  34. expected: proxyModeUserspace,
  35. },
  36. { // flag says iptables, error detecting version
  37. flag: "iptables",
  38. iptablesError: fmt.Errorf("flag says iptables, error detecting version"),
  39. expected: proxyModeUserspace,
  40. },
  41. { // flag says iptables, version too low
  42. flag: "iptables",
  43. iptablesVersion: "0.0.0",
  44. expected: proxyModeUserspace,
  45. },
  46. { // flag says iptables, version ok, kernel not compatible
  47. flag: "iptables",
  48. iptablesVersion: iptables.MinCheckVersion,
  49. kernelCompat: false,
  50. expected: proxyModeUserspace,
  51. },
  52. { // flag says iptables, version ok, kernel is compatible
  53. flag: "iptables",
  54. iptablesVersion: iptables.MinCheckVersion,
  55. kernelCompat: true,
  56. expected: proxyModeIPTables,
  57. },
  58. { // detect, error
  59. flag: "",
  60. iptablesError: fmt.Errorf("oops"),
  61. expected: proxyModeUserspace,
  62. },
  63. { // detect, version too low
  64. flag: "",
  65. iptablesVersion: "0.0.0",
  66. expected: proxyModeUserspace,
  67. },
  68. { // detect, version ok, kernel not compatible
  69. flag: "",
  70. iptablesVersion: iptables.MinCheckVersion,
  71. kernelCompat: false,
  72. expected: proxyModeUserspace,
  73. },
  74. { // detect, version ok, kernel is compatible
  75. flag: "",
  76. iptablesVersion: iptables.MinCheckVersion,
  77. kernelCompat: true,
  78. expected: proxyModeIPTables,
  79. },
  80. { // flag says ipvs, ipset version ok, kernel modules installed
  81. flag: "ipvs",
  82. kmods: []string{"ip_vs", "ip_vs_rr", "ip_vs_wrr", "ip_vs_sh", "nf_conntrack_ipv4"},
  83. ipsetVersion: ipvs.MinIPSetCheckVersion,
  84. expected: proxyModeIPVS,
  85. },
  86. { // flag says ipvs, ipset version too low, fallback on iptables mode
  87. flag: "ipvs",
  88. kmods: []string{"ip_vs", "ip_vs_rr", "ip_vs_wrr", "ip_vs_sh", "nf_conntrack_ipv4"},
  89. ipsetVersion: "0.0",
  90. iptablesVersion: iptables.MinCheckVersion,
  91. kernelCompat: true,
  92. expected: proxyModeIPTables,
  93. },
  94. { // flag says ipvs, bad ipset version, fallback on iptables mode
  95. flag: "ipvs",
  96. kmods: []string{"ip_vs", "ip_vs_rr", "ip_vs_wrr", "ip_vs_sh", "nf_conntrack_ipv4"},
  97. ipsetVersion: "a.b.c",
  98. iptablesVersion: iptables.MinCheckVersion,
  99. kernelCompat: true,
  100. expected: proxyModeIPTables,
  101. },
  102. { // flag says ipvs, required kernel modules are not installed, fallback on iptables mode
  103. flag: "ipvs",
  104. kmods: []string{"foo", "bar", "baz"},
  105. ipsetVersion: ipvs.MinIPSetCheckVersion,
  106. iptablesVersion: iptables.MinCheckVersion,
  107. kernelCompat: true,
  108. expected: proxyModeIPTables,
  109. },
  110. { // flag says ipvs, required kernel modules are not installed, iptables version too old, fallback on userspace mode
  111. flag: "ipvs",
  112. kmods: []string{"foo", "bar", "baz"},
  113. ipsetVersion: ipvs.MinIPSetCheckVersion,
  114. iptablesVersion: "0.0.0",
  115. kernelCompat: true,
  116. expected: proxyModeUserspace,
  117. },
  118. { // flag says ipvs, ipset version too low, iptables version too old, kernel not compatible, fallback on userspace mode
  119. flag: "ipvs",
  120. kmods: []string{"ip_vs", "ip_vs_rr", "ip_vs_wrr", "ip_vs_sh", "nf_conntrack_ipv4"},
  121. ipsetVersion: "0.0",
  122. iptablesVersion: iptables.MinCheckVersion,
  123. kernelCompat: false,
  124. expected: proxyModeUserspace,
  125. },
  126. }
  127. for i, c := range cases {
  128. versioner := &fakeIPTablesVersioner{c.iptablesVersion, c.iptablesError}
  129. kcompater := &fakeKernelCompatTester{c.kernelCompat}
  130. ipsetver := &fakeIPSetVersioner{c.ipsetVersion, c.ipsetError}
  131. khandler := &fakeKernelHandler{c.kmods}
  132. r := getProxyMode(c.flag, versioner, khandler, ipsetver, kcompater)
  133. if r != c.expected {
  134. t.Errorf("Case[%d] Expected %q, got %q", i, c.expected, r)
  135. }
  136. }
  137. }