defaults_test.go 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756
  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 v1beta1_test
  14. import (
  15. "math"
  16. "reflect"
  17. "testing"
  18. extensionsv1beta1 "k8s.io/api/extensions/v1beta1"
  19. "k8s.io/api/core/v1"
  20. apiequality "k8s.io/apimachinery/pkg/api/equality"
  21. "k8s.io/apimachinery/pkg/api/resource"
  22. metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
  23. "k8s.io/apimachinery/pkg/runtime"
  24. "k8s.io/apimachinery/pkg/util/intstr"
  25. "k8s.io/kubernetes/pkg/api/legacyscheme"
  26. api "k8s.io/kubernetes/pkg/apis/core"
  27. _ "k8s.io/kubernetes/pkg/apis/core/install"
  28. _ "k8s.io/kubernetes/pkg/apis/extensions/install"
  29. . "k8s.io/kubernetes/pkg/apis/extensions/v1beta1"
  30. utilpointer "k8s.io/utils/pointer"
  31. )
  32. func TestSetDefaultDaemonSetSpec(t *testing.T) {
  33. defaultLabels := map[string]string{"foo": "bar"}
  34. period := int64(v1.DefaultTerminationGracePeriodSeconds)
  35. defaultTemplate := v1.PodTemplateSpec{
  36. Spec: v1.PodSpec{
  37. DNSPolicy: v1.DNSClusterFirst,
  38. RestartPolicy: v1.RestartPolicyAlways,
  39. SecurityContext: &v1.PodSecurityContext{},
  40. TerminationGracePeriodSeconds: &period,
  41. SchedulerName: api.DefaultSchedulerName,
  42. },
  43. ObjectMeta: metav1.ObjectMeta{
  44. Labels: defaultLabels,
  45. },
  46. }
  47. templateNoLabel := v1.PodTemplateSpec{
  48. Spec: v1.PodSpec{
  49. DNSPolicy: v1.DNSClusterFirst,
  50. RestartPolicy: v1.RestartPolicyAlways,
  51. SecurityContext: &v1.PodSecurityContext{},
  52. TerminationGracePeriodSeconds: &period,
  53. SchedulerName: api.DefaultSchedulerName,
  54. },
  55. }
  56. tests := []struct {
  57. original *extensionsv1beta1.DaemonSet
  58. expected *extensionsv1beta1.DaemonSet
  59. }{
  60. { // Labels change/defaulting test.
  61. original: &extensionsv1beta1.DaemonSet{
  62. Spec: extensionsv1beta1.DaemonSetSpec{
  63. Template: defaultTemplate,
  64. },
  65. },
  66. expected: &extensionsv1beta1.DaemonSet{
  67. ObjectMeta: metav1.ObjectMeta{
  68. Labels: defaultLabels,
  69. },
  70. Spec: extensionsv1beta1.DaemonSetSpec{
  71. Selector: &metav1.LabelSelector{
  72. MatchLabels: defaultLabels,
  73. },
  74. Template: defaultTemplate,
  75. UpdateStrategy: extensionsv1beta1.DaemonSetUpdateStrategy{
  76. Type: extensionsv1beta1.OnDeleteDaemonSetStrategyType,
  77. },
  78. RevisionHistoryLimit: utilpointer.Int32Ptr(10),
  79. },
  80. },
  81. },
  82. { // Labels change/defaulting test.
  83. original: &extensionsv1beta1.DaemonSet{
  84. ObjectMeta: metav1.ObjectMeta{
  85. Labels: map[string]string{
  86. "bar": "foo",
  87. },
  88. },
  89. Spec: extensionsv1beta1.DaemonSetSpec{
  90. Template: defaultTemplate,
  91. RevisionHistoryLimit: utilpointer.Int32Ptr(1),
  92. },
  93. },
  94. expected: &extensionsv1beta1.DaemonSet{
  95. ObjectMeta: metav1.ObjectMeta{
  96. Labels: map[string]string{
  97. "bar": "foo",
  98. },
  99. },
  100. Spec: extensionsv1beta1.DaemonSetSpec{
  101. Selector: &metav1.LabelSelector{
  102. MatchLabels: defaultLabels,
  103. },
  104. Template: defaultTemplate,
  105. UpdateStrategy: extensionsv1beta1.DaemonSetUpdateStrategy{
  106. Type: extensionsv1beta1.OnDeleteDaemonSetStrategyType,
  107. },
  108. RevisionHistoryLimit: utilpointer.Int32Ptr(1),
  109. },
  110. },
  111. },
  112. { // Update strategy.
  113. original: &extensionsv1beta1.DaemonSet{},
  114. expected: &extensionsv1beta1.DaemonSet{
  115. Spec: extensionsv1beta1.DaemonSetSpec{
  116. Template: templateNoLabel,
  117. UpdateStrategy: extensionsv1beta1.DaemonSetUpdateStrategy{
  118. Type: extensionsv1beta1.OnDeleteDaemonSetStrategyType,
  119. },
  120. RevisionHistoryLimit: utilpointer.Int32Ptr(10),
  121. },
  122. },
  123. },
  124. { // Custom unique label key.
  125. original: &extensionsv1beta1.DaemonSet{
  126. Spec: extensionsv1beta1.DaemonSetSpec{},
  127. },
  128. expected: &extensionsv1beta1.DaemonSet{
  129. Spec: extensionsv1beta1.DaemonSetSpec{
  130. Template: templateNoLabel,
  131. UpdateStrategy: extensionsv1beta1.DaemonSetUpdateStrategy{
  132. Type: extensionsv1beta1.OnDeleteDaemonSetStrategyType,
  133. },
  134. RevisionHistoryLimit: utilpointer.Int32Ptr(10),
  135. },
  136. },
  137. },
  138. }
  139. for i, test := range tests {
  140. original := test.original
  141. expected := test.expected
  142. obj2 := roundTrip(t, runtime.Object(original))
  143. got, ok := obj2.(*extensionsv1beta1.DaemonSet)
  144. if !ok {
  145. t.Errorf("(%d) unexpected object: %v", i, got)
  146. t.FailNow()
  147. }
  148. if !apiequality.Semantic.DeepEqual(got.Spec, expected.Spec) {
  149. t.Errorf("(%d) got different than expected\ngot:\n\t%+v\nexpected:\n\t%+v", i, got.Spec, expected.Spec)
  150. }
  151. }
  152. }
  153. func TestSetDefaultDeployment(t *testing.T) {
  154. defaultIntOrString := intstr.FromInt(1)
  155. differentIntOrString := intstr.FromInt(5)
  156. period := int64(v1.DefaultTerminationGracePeriodSeconds)
  157. defaultTemplate := v1.PodTemplateSpec{
  158. Spec: v1.PodSpec{
  159. DNSPolicy: v1.DNSClusterFirst,
  160. RestartPolicy: v1.RestartPolicyAlways,
  161. SecurityContext: &v1.PodSecurityContext{},
  162. TerminationGracePeriodSeconds: &period,
  163. SchedulerName: api.DefaultSchedulerName,
  164. },
  165. }
  166. tests := []struct {
  167. original *extensionsv1beta1.Deployment
  168. expected *extensionsv1beta1.Deployment
  169. }{
  170. {
  171. original: &extensionsv1beta1.Deployment{},
  172. expected: &extensionsv1beta1.Deployment{
  173. Spec: extensionsv1beta1.DeploymentSpec{
  174. Replicas: utilpointer.Int32Ptr(1),
  175. Strategy: extensionsv1beta1.DeploymentStrategy{
  176. Type: extensionsv1beta1.RollingUpdateDeploymentStrategyType,
  177. RollingUpdate: &extensionsv1beta1.RollingUpdateDeployment{
  178. MaxSurge: &defaultIntOrString,
  179. MaxUnavailable: &defaultIntOrString,
  180. },
  181. },
  182. Template: defaultTemplate,
  183. ProgressDeadlineSeconds: utilpointer.Int32Ptr(math.MaxInt32),
  184. RevisionHistoryLimit: utilpointer.Int32Ptr(math.MaxInt32),
  185. },
  186. },
  187. },
  188. {
  189. original: &extensionsv1beta1.Deployment{
  190. Spec: extensionsv1beta1.DeploymentSpec{
  191. Replicas: utilpointer.Int32Ptr(5),
  192. Strategy: extensionsv1beta1.DeploymentStrategy{
  193. RollingUpdate: &extensionsv1beta1.RollingUpdateDeployment{
  194. MaxSurge: &differentIntOrString,
  195. },
  196. },
  197. },
  198. },
  199. expected: &extensionsv1beta1.Deployment{
  200. Spec: extensionsv1beta1.DeploymentSpec{
  201. Replicas: utilpointer.Int32Ptr(5),
  202. Strategy: extensionsv1beta1.DeploymentStrategy{
  203. Type: extensionsv1beta1.RollingUpdateDeploymentStrategyType,
  204. RollingUpdate: &extensionsv1beta1.RollingUpdateDeployment{
  205. MaxSurge: &differentIntOrString,
  206. MaxUnavailable: &defaultIntOrString,
  207. },
  208. },
  209. Template: defaultTemplate,
  210. ProgressDeadlineSeconds: utilpointer.Int32Ptr(math.MaxInt32),
  211. RevisionHistoryLimit: utilpointer.Int32Ptr(math.MaxInt32),
  212. },
  213. },
  214. },
  215. {
  216. original: &extensionsv1beta1.Deployment{
  217. Spec: extensionsv1beta1.DeploymentSpec{
  218. Replicas: utilpointer.Int32Ptr(3),
  219. Strategy: extensionsv1beta1.DeploymentStrategy{
  220. Type: extensionsv1beta1.RollingUpdateDeploymentStrategyType,
  221. RollingUpdate: nil,
  222. },
  223. },
  224. },
  225. expected: &extensionsv1beta1.Deployment{
  226. Spec: extensionsv1beta1.DeploymentSpec{
  227. Replicas: utilpointer.Int32Ptr(3),
  228. Strategy: extensionsv1beta1.DeploymentStrategy{
  229. Type: extensionsv1beta1.RollingUpdateDeploymentStrategyType,
  230. RollingUpdate: &extensionsv1beta1.RollingUpdateDeployment{
  231. MaxSurge: &defaultIntOrString,
  232. MaxUnavailable: &defaultIntOrString,
  233. },
  234. },
  235. Template: defaultTemplate,
  236. ProgressDeadlineSeconds: utilpointer.Int32Ptr(math.MaxInt32),
  237. RevisionHistoryLimit: utilpointer.Int32Ptr(math.MaxInt32),
  238. },
  239. },
  240. },
  241. {
  242. original: &extensionsv1beta1.Deployment{
  243. Spec: extensionsv1beta1.DeploymentSpec{
  244. Replicas: utilpointer.Int32Ptr(5),
  245. Strategy: extensionsv1beta1.DeploymentStrategy{
  246. Type: extensionsv1beta1.RecreateDeploymentStrategyType,
  247. },
  248. },
  249. },
  250. expected: &extensionsv1beta1.Deployment{
  251. Spec: extensionsv1beta1.DeploymentSpec{
  252. Replicas: utilpointer.Int32Ptr(5),
  253. Strategy: extensionsv1beta1.DeploymentStrategy{
  254. Type: extensionsv1beta1.RecreateDeploymentStrategyType,
  255. },
  256. Template: defaultTemplate,
  257. ProgressDeadlineSeconds: utilpointer.Int32Ptr(math.MaxInt32),
  258. RevisionHistoryLimit: utilpointer.Int32Ptr(math.MaxInt32),
  259. },
  260. },
  261. },
  262. {
  263. original: &extensionsv1beta1.Deployment{
  264. Spec: extensionsv1beta1.DeploymentSpec{
  265. Replicas: utilpointer.Int32Ptr(5),
  266. Strategy: extensionsv1beta1.DeploymentStrategy{
  267. Type: extensionsv1beta1.RecreateDeploymentStrategyType,
  268. },
  269. ProgressDeadlineSeconds: utilpointer.Int32Ptr(30),
  270. },
  271. },
  272. expected: &extensionsv1beta1.Deployment{
  273. Spec: extensionsv1beta1.DeploymentSpec{
  274. Replicas: utilpointer.Int32Ptr(5),
  275. Strategy: extensionsv1beta1.DeploymentStrategy{
  276. Type: extensionsv1beta1.RecreateDeploymentStrategyType,
  277. },
  278. Template: defaultTemplate,
  279. ProgressDeadlineSeconds: utilpointer.Int32Ptr(30),
  280. RevisionHistoryLimit: utilpointer.Int32Ptr(math.MaxInt32),
  281. },
  282. },
  283. },
  284. }
  285. for _, test := range tests {
  286. original := test.original
  287. expected := test.expected
  288. obj2 := roundTrip(t, runtime.Object(original))
  289. got, ok := obj2.(*extensionsv1beta1.Deployment)
  290. if !ok {
  291. t.Errorf("unexpected object: %v", got)
  292. t.FailNow()
  293. }
  294. if !apiequality.Semantic.DeepEqual(got.Spec, expected.Spec) {
  295. t.Errorf("object mismatch!\nexpected:\n\t%+v\ngot:\n\t%+v", got.Spec, expected.Spec)
  296. }
  297. }
  298. }
  299. func TestSetDefaultReplicaSet(t *testing.T) {
  300. tests := []struct {
  301. rs *extensionsv1beta1.ReplicaSet
  302. expectLabels bool
  303. expectSelector bool
  304. }{
  305. {
  306. rs: &extensionsv1beta1.ReplicaSet{
  307. Spec: extensionsv1beta1.ReplicaSetSpec{
  308. Template: v1.PodTemplateSpec{
  309. ObjectMeta: metav1.ObjectMeta{
  310. Labels: map[string]string{
  311. "foo": "bar",
  312. },
  313. },
  314. },
  315. },
  316. },
  317. expectLabels: true,
  318. expectSelector: true,
  319. },
  320. {
  321. rs: &extensionsv1beta1.ReplicaSet{
  322. ObjectMeta: metav1.ObjectMeta{
  323. Labels: map[string]string{
  324. "bar": "foo",
  325. },
  326. },
  327. Spec: extensionsv1beta1.ReplicaSetSpec{
  328. Template: v1.PodTemplateSpec{
  329. ObjectMeta: metav1.ObjectMeta{
  330. Labels: map[string]string{
  331. "foo": "bar",
  332. },
  333. },
  334. },
  335. },
  336. },
  337. expectLabels: false,
  338. expectSelector: true,
  339. },
  340. {
  341. rs: &extensionsv1beta1.ReplicaSet{
  342. ObjectMeta: metav1.ObjectMeta{
  343. Labels: map[string]string{
  344. "bar": "foo",
  345. },
  346. },
  347. Spec: extensionsv1beta1.ReplicaSetSpec{
  348. Selector: &metav1.LabelSelector{
  349. MatchLabels: map[string]string{
  350. "some": "other",
  351. },
  352. },
  353. Template: v1.PodTemplateSpec{
  354. ObjectMeta: metav1.ObjectMeta{
  355. Labels: map[string]string{
  356. "foo": "bar",
  357. },
  358. },
  359. },
  360. },
  361. },
  362. expectLabels: false,
  363. expectSelector: false,
  364. },
  365. {
  366. rs: &extensionsv1beta1.ReplicaSet{
  367. Spec: extensionsv1beta1.ReplicaSetSpec{
  368. Selector: &metav1.LabelSelector{
  369. MatchLabels: map[string]string{
  370. "some": "other",
  371. },
  372. },
  373. Template: v1.PodTemplateSpec{
  374. ObjectMeta: metav1.ObjectMeta{
  375. Labels: map[string]string{
  376. "foo": "bar",
  377. },
  378. },
  379. },
  380. },
  381. },
  382. expectLabels: true,
  383. expectSelector: false,
  384. },
  385. }
  386. for _, test := range tests {
  387. rs := test.rs
  388. obj2 := roundTrip(t, runtime.Object(rs))
  389. rs2, ok := obj2.(*extensionsv1beta1.ReplicaSet)
  390. if !ok {
  391. t.Errorf("unexpected object: %v", rs2)
  392. t.FailNow()
  393. }
  394. if test.expectSelector != reflect.DeepEqual(rs2.Spec.Selector.MatchLabels, rs2.Spec.Template.Labels) {
  395. if test.expectSelector {
  396. t.Errorf("expected: %v, got: %v", rs2.Spec.Template.Labels, rs2.Spec.Selector)
  397. } else {
  398. t.Errorf("unexpected equality: %v", rs.Spec.Selector)
  399. }
  400. }
  401. if test.expectLabels != reflect.DeepEqual(rs2.Labels, rs2.Spec.Template.Labels) {
  402. if test.expectLabels {
  403. t.Errorf("expected: %v, got: %v", rs2.Spec.Template.Labels, rs2.Labels)
  404. } else {
  405. t.Errorf("unexpected equality: %v", rs.Labels)
  406. }
  407. }
  408. }
  409. }
  410. func TestSetDefaultReplicaSetReplicas(t *testing.T) {
  411. tests := []struct {
  412. rs extensionsv1beta1.ReplicaSet
  413. expectReplicas int32
  414. }{
  415. {
  416. rs: extensionsv1beta1.ReplicaSet{
  417. Spec: extensionsv1beta1.ReplicaSetSpec{
  418. Template: v1.PodTemplateSpec{
  419. ObjectMeta: metav1.ObjectMeta{
  420. Labels: map[string]string{
  421. "foo": "bar",
  422. },
  423. },
  424. },
  425. },
  426. },
  427. expectReplicas: 1,
  428. },
  429. {
  430. rs: extensionsv1beta1.ReplicaSet{
  431. Spec: extensionsv1beta1.ReplicaSetSpec{
  432. Replicas: utilpointer.Int32Ptr(0),
  433. Template: v1.PodTemplateSpec{
  434. ObjectMeta: metav1.ObjectMeta{
  435. Labels: map[string]string{
  436. "foo": "bar",
  437. },
  438. },
  439. },
  440. },
  441. },
  442. expectReplicas: 0,
  443. },
  444. {
  445. rs: extensionsv1beta1.ReplicaSet{
  446. Spec: extensionsv1beta1.ReplicaSetSpec{
  447. Replicas: utilpointer.Int32Ptr(3),
  448. Template: v1.PodTemplateSpec{
  449. ObjectMeta: metav1.ObjectMeta{
  450. Labels: map[string]string{
  451. "foo": "bar",
  452. },
  453. },
  454. },
  455. },
  456. },
  457. expectReplicas: 3,
  458. },
  459. }
  460. for _, test := range tests {
  461. rs := &test.rs
  462. obj2 := roundTrip(t, runtime.Object(rs))
  463. rs2, ok := obj2.(*extensionsv1beta1.ReplicaSet)
  464. if !ok {
  465. t.Errorf("unexpected object: %v", rs2)
  466. t.FailNow()
  467. }
  468. if rs2.Spec.Replicas == nil {
  469. t.Errorf("unexpected nil Replicas")
  470. } else if test.expectReplicas != *rs2.Spec.Replicas {
  471. t.Errorf("expected: %d replicas, got: %d", test.expectReplicas, *rs2.Spec.Replicas)
  472. }
  473. }
  474. }
  475. func TestDefaultRequestIsNotSetForReplicaSet(t *testing.T) {
  476. s := v1.PodSpec{}
  477. s.Containers = []v1.Container{
  478. {
  479. Resources: v1.ResourceRequirements{
  480. Limits: v1.ResourceList{
  481. v1.ResourceCPU: resource.MustParse("100m"),
  482. },
  483. },
  484. },
  485. }
  486. rs := &extensionsv1beta1.ReplicaSet{
  487. Spec: extensionsv1beta1.ReplicaSetSpec{
  488. Replicas: utilpointer.Int32Ptr(3),
  489. Template: v1.PodTemplateSpec{
  490. ObjectMeta: metav1.ObjectMeta{
  491. Labels: map[string]string{
  492. "foo": "bar",
  493. },
  494. },
  495. Spec: s,
  496. },
  497. },
  498. }
  499. output := roundTrip(t, runtime.Object(rs))
  500. rs2 := output.(*extensionsv1beta1.ReplicaSet)
  501. defaultRequest := rs2.Spec.Template.Spec.Containers[0].Resources.Requests
  502. requestValue := defaultRequest[v1.ResourceCPU]
  503. if requestValue.String() != "0" {
  504. t.Errorf("Expected 0 request value, got: %s", requestValue.String())
  505. }
  506. }
  507. func TestDefaultAllowPrivilegeEscalationForPodSecurityPolicy(t *testing.T) {
  508. psp := &extensionsv1beta1.PodSecurityPolicy{}
  509. output := roundTrip(t, runtime.Object(psp))
  510. psp2 := output.(*extensionsv1beta1.PodSecurityPolicy)
  511. if psp2.Spec.AllowPrivilegeEscalation == nil || *psp2.Spec.AllowPrivilegeEscalation != true {
  512. t.Errorf("Expected default to true, got: %#v", psp2.Spec.AllowPrivilegeEscalation)
  513. }
  514. }
  515. func TestSetDefaultNetworkPolicy(t *testing.T) {
  516. tests := []struct {
  517. original *extensionsv1beta1.NetworkPolicy
  518. expected *extensionsv1beta1.NetworkPolicy
  519. }{
  520. { // Empty NetworkPolicy should be set to PolicyTypes Ingress
  521. original: &extensionsv1beta1.NetworkPolicy{
  522. Spec: extensionsv1beta1.NetworkPolicySpec{
  523. PodSelector: metav1.LabelSelector{
  524. MatchLabels: map[string]string{"a": "b"},
  525. },
  526. },
  527. },
  528. expected: &extensionsv1beta1.NetworkPolicy{
  529. Spec: extensionsv1beta1.NetworkPolicySpec{
  530. PodSelector: metav1.LabelSelector{
  531. MatchLabels: map[string]string{"a": "b"},
  532. },
  533. PolicyTypes: []extensionsv1beta1.PolicyType{extensionsv1beta1.PolicyTypeIngress},
  534. },
  535. },
  536. },
  537. { // Empty Ingress NetworkPolicy should be set to PolicyTypes Ingress
  538. original: &extensionsv1beta1.NetworkPolicy{
  539. Spec: extensionsv1beta1.NetworkPolicySpec{
  540. PodSelector: metav1.LabelSelector{
  541. MatchLabels: map[string]string{"a": "b"},
  542. },
  543. Ingress: []extensionsv1beta1.NetworkPolicyIngressRule{},
  544. },
  545. },
  546. expected: &extensionsv1beta1.NetworkPolicy{
  547. Spec: extensionsv1beta1.NetworkPolicySpec{
  548. PodSelector: metav1.LabelSelector{
  549. MatchLabels: map[string]string{"a": "b"},
  550. },
  551. Ingress: []extensionsv1beta1.NetworkPolicyIngressRule{},
  552. PolicyTypes: []extensionsv1beta1.PolicyType{extensionsv1beta1.PolicyTypeIngress},
  553. },
  554. },
  555. },
  556. { // Defined Ingress and Egress should be set to Ingress,Egress
  557. original: &extensionsv1beta1.NetworkPolicy{
  558. Spec: extensionsv1beta1.NetworkPolicySpec{
  559. PodSelector: metav1.LabelSelector{
  560. MatchLabels: map[string]string{"a": "b"},
  561. },
  562. Ingress: []extensionsv1beta1.NetworkPolicyIngressRule{
  563. {
  564. From: []extensionsv1beta1.NetworkPolicyPeer{
  565. {
  566. PodSelector: &metav1.LabelSelector{
  567. MatchLabels: map[string]string{"c": "d"},
  568. },
  569. NamespaceSelector: &metav1.LabelSelector{
  570. MatchLabels: map[string]string{"c": "d"},
  571. },
  572. },
  573. },
  574. },
  575. },
  576. Egress: []extensionsv1beta1.NetworkPolicyEgressRule{
  577. {
  578. To: []extensionsv1beta1.NetworkPolicyPeer{
  579. {
  580. NamespaceSelector: &metav1.LabelSelector{
  581. MatchLabels: map[string]string{"c": "d"},
  582. },
  583. },
  584. },
  585. },
  586. },
  587. },
  588. },
  589. expected: &extensionsv1beta1.NetworkPolicy{
  590. Spec: extensionsv1beta1.NetworkPolicySpec{
  591. PodSelector: metav1.LabelSelector{
  592. MatchLabels: map[string]string{"a": "b"},
  593. },
  594. Ingress: []extensionsv1beta1.NetworkPolicyIngressRule{
  595. {
  596. From: []extensionsv1beta1.NetworkPolicyPeer{
  597. {
  598. PodSelector: &metav1.LabelSelector{
  599. MatchLabels: map[string]string{"c": "d"},
  600. },
  601. NamespaceSelector: &metav1.LabelSelector{
  602. MatchLabels: map[string]string{"c": "d"},
  603. },
  604. },
  605. },
  606. },
  607. },
  608. Egress: []extensionsv1beta1.NetworkPolicyEgressRule{
  609. {
  610. To: []extensionsv1beta1.NetworkPolicyPeer{
  611. {
  612. NamespaceSelector: &metav1.LabelSelector{
  613. MatchLabels: map[string]string{"c": "d"},
  614. },
  615. },
  616. },
  617. },
  618. },
  619. PolicyTypes: []extensionsv1beta1.PolicyType{extensionsv1beta1.PolicyTypeIngress, extensionsv1beta1.PolicyTypeEgress},
  620. },
  621. },
  622. },
  623. { // Egress only with unset PolicyTypes should be set to Ingress, Egress
  624. original: &extensionsv1beta1.NetworkPolicy{
  625. Spec: extensionsv1beta1.NetworkPolicySpec{
  626. PodSelector: metav1.LabelSelector{
  627. MatchLabels: map[string]string{"a": "b"},
  628. },
  629. Egress: []extensionsv1beta1.NetworkPolicyEgressRule{
  630. {
  631. To: []extensionsv1beta1.NetworkPolicyPeer{
  632. {
  633. NamespaceSelector: &metav1.LabelSelector{
  634. MatchLabels: map[string]string{"c": "d"},
  635. },
  636. },
  637. },
  638. },
  639. },
  640. },
  641. },
  642. expected: &extensionsv1beta1.NetworkPolicy{
  643. Spec: extensionsv1beta1.NetworkPolicySpec{
  644. PodSelector: metav1.LabelSelector{
  645. MatchLabels: map[string]string{"a": "b"},
  646. },
  647. Egress: []extensionsv1beta1.NetworkPolicyEgressRule{
  648. {
  649. To: []extensionsv1beta1.NetworkPolicyPeer{
  650. {
  651. NamespaceSelector: &metav1.LabelSelector{
  652. MatchLabels: map[string]string{"c": "d"},
  653. },
  654. },
  655. },
  656. },
  657. },
  658. PolicyTypes: []extensionsv1beta1.PolicyType{extensionsv1beta1.PolicyTypeIngress, extensionsv1beta1.PolicyTypeEgress},
  659. },
  660. },
  661. },
  662. { // Egress only with PolicyTypes set to Egress should be set to only Egress
  663. original: &extensionsv1beta1.NetworkPolicy{
  664. Spec: extensionsv1beta1.NetworkPolicySpec{
  665. PodSelector: metav1.LabelSelector{
  666. MatchLabels: map[string]string{"a": "b"},
  667. },
  668. Egress: []extensionsv1beta1.NetworkPolicyEgressRule{
  669. {
  670. To: []extensionsv1beta1.NetworkPolicyPeer{
  671. {
  672. NamespaceSelector: &metav1.LabelSelector{
  673. MatchLabels: map[string]string{"Egress": "only"},
  674. },
  675. },
  676. },
  677. },
  678. },
  679. PolicyTypes: []extensionsv1beta1.PolicyType{extensionsv1beta1.PolicyTypeEgress},
  680. },
  681. },
  682. expected: &extensionsv1beta1.NetworkPolicy{
  683. Spec: extensionsv1beta1.NetworkPolicySpec{
  684. PodSelector: metav1.LabelSelector{
  685. MatchLabels: map[string]string{"a": "b"},
  686. },
  687. Egress: []extensionsv1beta1.NetworkPolicyEgressRule{
  688. {
  689. To: []extensionsv1beta1.NetworkPolicyPeer{
  690. {
  691. NamespaceSelector: &metav1.LabelSelector{
  692. MatchLabels: map[string]string{"Egress": "only"},
  693. },
  694. },
  695. },
  696. },
  697. },
  698. PolicyTypes: []extensionsv1beta1.PolicyType{extensionsv1beta1.PolicyTypeEgress},
  699. },
  700. },
  701. },
  702. }
  703. for i, test := range tests {
  704. original := test.original
  705. expected := test.expected
  706. obj2 := roundTrip(t, runtime.Object(original))
  707. got, ok := obj2.(*extensionsv1beta1.NetworkPolicy)
  708. if !ok {
  709. t.Errorf("(%d) unexpected object: %v", i, got)
  710. t.FailNow()
  711. }
  712. if !apiequality.Semantic.DeepEqual(got.Spec, expected.Spec) {
  713. t.Errorf("(%d) got different than expected\ngot:\n\t%+v\nexpected:\n\t%+v", i, got.Spec, expected.Spec)
  714. }
  715. }
  716. }
  717. func roundTrip(t *testing.T, obj runtime.Object) runtime.Object {
  718. data, err := runtime.Encode(legacyscheme.Codecs.LegacyCodec(SchemeGroupVersion), obj)
  719. if err != nil {
  720. t.Errorf("%v\n %#v", err, obj)
  721. return nil
  722. }
  723. obj2, err := runtime.Decode(legacyscheme.Codecs.UniversalDecoder(), data)
  724. if err != nil {
  725. t.Errorf("%v\nData: %s\nSource: %#v", err, string(data), obj)
  726. return nil
  727. }
  728. obj3 := reflect.New(reflect.TypeOf(obj).Elem()).Interface().(runtime.Object)
  729. err = legacyscheme.Scheme.Convert(obj2, obj3, nil)
  730. if err != nil {
  731. t.Errorf("%v\nSource: %#v", err, obj2)
  732. return nil
  733. }
  734. return obj3
  735. }