defaults_test.go 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257
  1. /*
  2. Copyright 2017 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 v1_test
  14. import (
  15. "reflect"
  16. "testing"
  17. networkingv1 "k8s.io/api/networking/v1"
  18. apiequality "k8s.io/apimachinery/pkg/api/equality"
  19. metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
  20. "k8s.io/apimachinery/pkg/runtime"
  21. "k8s.io/kubernetes/pkg/api/legacyscheme"
  22. _ "k8s.io/kubernetes/pkg/apis/core/install"
  23. _ "k8s.io/kubernetes/pkg/apis/networking/install"
  24. . "k8s.io/kubernetes/pkg/apis/networking/v1"
  25. )
  26. func TestSetDefaultNetworkPolicy(t *testing.T) {
  27. tests := []struct {
  28. original *networkingv1.NetworkPolicy
  29. expected *networkingv1.NetworkPolicy
  30. }{
  31. { // Empty NetworkPolicy should be set to PolicyTypes Ingress
  32. original: &networkingv1.NetworkPolicy{
  33. Spec: networkingv1.NetworkPolicySpec{
  34. PodSelector: metav1.LabelSelector{
  35. MatchLabels: map[string]string{"a": "b"},
  36. },
  37. },
  38. },
  39. expected: &networkingv1.NetworkPolicy{
  40. Spec: networkingv1.NetworkPolicySpec{
  41. PodSelector: metav1.LabelSelector{
  42. MatchLabels: map[string]string{"a": "b"},
  43. },
  44. PolicyTypes: []networkingv1.PolicyType{networkingv1.PolicyTypeIngress},
  45. },
  46. },
  47. },
  48. { // Empty Ingress NetworkPolicy should be set to PolicyTypes Ingress
  49. original: &networkingv1.NetworkPolicy{
  50. Spec: networkingv1.NetworkPolicySpec{
  51. PodSelector: metav1.LabelSelector{
  52. MatchLabels: map[string]string{"a": "b"},
  53. },
  54. Ingress: []networkingv1.NetworkPolicyIngressRule{},
  55. },
  56. },
  57. expected: &networkingv1.NetworkPolicy{
  58. Spec: networkingv1.NetworkPolicySpec{
  59. PodSelector: metav1.LabelSelector{
  60. MatchLabels: map[string]string{"a": "b"},
  61. },
  62. Ingress: []networkingv1.NetworkPolicyIngressRule{},
  63. PolicyTypes: []networkingv1.PolicyType{networkingv1.PolicyTypeIngress},
  64. },
  65. },
  66. },
  67. { // Defined Ingress and Egress should be set to Ingress,Egress
  68. original: &networkingv1.NetworkPolicy{
  69. Spec: networkingv1.NetworkPolicySpec{
  70. PodSelector: metav1.LabelSelector{
  71. MatchLabels: map[string]string{"a": "b"},
  72. },
  73. Ingress: []networkingv1.NetworkPolicyIngressRule{
  74. {
  75. From: []networkingv1.NetworkPolicyPeer{
  76. {
  77. PodSelector: &metav1.LabelSelector{
  78. MatchLabels: map[string]string{"c": "d"},
  79. },
  80. NamespaceSelector: &metav1.LabelSelector{
  81. MatchLabels: map[string]string{"c": "d"},
  82. },
  83. },
  84. },
  85. },
  86. },
  87. Egress: []networkingv1.NetworkPolicyEgressRule{
  88. {
  89. To: []networkingv1.NetworkPolicyPeer{
  90. {
  91. NamespaceSelector: &metav1.LabelSelector{
  92. MatchLabels: map[string]string{"c": "d"},
  93. },
  94. },
  95. },
  96. },
  97. },
  98. },
  99. },
  100. expected: &networkingv1.NetworkPolicy{
  101. Spec: networkingv1.NetworkPolicySpec{
  102. PodSelector: metav1.LabelSelector{
  103. MatchLabels: map[string]string{"a": "b"},
  104. },
  105. Ingress: []networkingv1.NetworkPolicyIngressRule{
  106. {
  107. From: []networkingv1.NetworkPolicyPeer{
  108. {
  109. PodSelector: &metav1.LabelSelector{
  110. MatchLabels: map[string]string{"c": "d"},
  111. },
  112. NamespaceSelector: &metav1.LabelSelector{
  113. MatchLabels: map[string]string{"c": "d"},
  114. },
  115. },
  116. },
  117. },
  118. },
  119. Egress: []networkingv1.NetworkPolicyEgressRule{
  120. {
  121. To: []networkingv1.NetworkPolicyPeer{
  122. {
  123. NamespaceSelector: &metav1.LabelSelector{
  124. MatchLabels: map[string]string{"c": "d"},
  125. },
  126. },
  127. },
  128. },
  129. },
  130. PolicyTypes: []networkingv1.PolicyType{networkingv1.PolicyTypeIngress, networkingv1.PolicyTypeEgress},
  131. },
  132. },
  133. },
  134. { // Egress only with unset PolicyTypes should be set to Ingress, Egress
  135. original: &networkingv1.NetworkPolicy{
  136. Spec: networkingv1.NetworkPolicySpec{
  137. PodSelector: metav1.LabelSelector{
  138. MatchLabels: map[string]string{"a": "b"},
  139. },
  140. Egress: []networkingv1.NetworkPolicyEgressRule{
  141. {
  142. To: []networkingv1.NetworkPolicyPeer{
  143. {
  144. NamespaceSelector: &metav1.LabelSelector{
  145. MatchLabels: map[string]string{"c": "d"},
  146. },
  147. },
  148. },
  149. },
  150. },
  151. },
  152. },
  153. expected: &networkingv1.NetworkPolicy{
  154. Spec: networkingv1.NetworkPolicySpec{
  155. PodSelector: metav1.LabelSelector{
  156. MatchLabels: map[string]string{"a": "b"},
  157. },
  158. Egress: []networkingv1.NetworkPolicyEgressRule{
  159. {
  160. To: []networkingv1.NetworkPolicyPeer{
  161. {
  162. NamespaceSelector: &metav1.LabelSelector{
  163. MatchLabels: map[string]string{"c": "d"},
  164. },
  165. },
  166. },
  167. },
  168. },
  169. PolicyTypes: []networkingv1.PolicyType{networkingv1.PolicyTypeIngress, networkingv1.PolicyTypeEgress},
  170. },
  171. },
  172. },
  173. { // Egress only with PolicyTypes set to Egress should be set to only Egress
  174. original: &networkingv1.NetworkPolicy{
  175. Spec: networkingv1.NetworkPolicySpec{
  176. PodSelector: metav1.LabelSelector{
  177. MatchLabels: map[string]string{"a": "b"},
  178. },
  179. Egress: []networkingv1.NetworkPolicyEgressRule{
  180. {
  181. To: []networkingv1.NetworkPolicyPeer{
  182. {
  183. NamespaceSelector: &metav1.LabelSelector{
  184. MatchLabels: map[string]string{"Egress": "only"},
  185. },
  186. },
  187. },
  188. },
  189. },
  190. PolicyTypes: []networkingv1.PolicyType{networkingv1.PolicyTypeEgress},
  191. },
  192. },
  193. expected: &networkingv1.NetworkPolicy{
  194. Spec: networkingv1.NetworkPolicySpec{
  195. PodSelector: metav1.LabelSelector{
  196. MatchLabels: map[string]string{"a": "b"},
  197. },
  198. Egress: []networkingv1.NetworkPolicyEgressRule{
  199. {
  200. To: []networkingv1.NetworkPolicyPeer{
  201. {
  202. NamespaceSelector: &metav1.LabelSelector{
  203. MatchLabels: map[string]string{"Egress": "only"},
  204. },
  205. },
  206. },
  207. },
  208. },
  209. PolicyTypes: []networkingv1.PolicyType{networkingv1.PolicyTypeEgress},
  210. },
  211. },
  212. },
  213. }
  214. for i, test := range tests {
  215. original := test.original
  216. expected := test.expected
  217. obj2 := roundTrip(t, runtime.Object(original))
  218. got, ok := obj2.(*networkingv1.NetworkPolicy)
  219. if !ok {
  220. t.Errorf("(%d) unexpected object: %v", i, got)
  221. t.FailNow()
  222. }
  223. if !apiequality.Semantic.DeepEqual(got.Spec, expected.Spec) {
  224. t.Errorf("(%d) got different than expected\ngot:\n\t%+v\nexpected:\n\t%+v", i, got.Spec, expected.Spec)
  225. }
  226. }
  227. }
  228. func roundTrip(t *testing.T, obj runtime.Object) runtime.Object {
  229. data, err := runtime.Encode(legacyscheme.Codecs.LegacyCodec(SchemeGroupVersion), obj)
  230. if err != nil {
  231. t.Errorf("%v\n %#v", err, obj)
  232. return nil
  233. }
  234. obj2, err := runtime.Decode(legacyscheme.Codecs.UniversalDecoder(), data)
  235. if err != nil {
  236. t.Errorf("%v\nData: %s\nSource: %#v", err, string(data), obj)
  237. return nil
  238. }
  239. obj3 := reflect.New(reflect.TypeOf(obj).Elem()).Interface().(runtime.Object)
  240. err = legacyscheme.Scheme.Convert(obj2, obj3, nil)
  241. if err != nil {
  242. t.Errorf("%v\nSource: %#v", err, obj2)
  243. return nil
  244. }
  245. return obj3
  246. }