base_test.go 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476
  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 testsuites
  14. import (
  15. "testing"
  16. "k8s.io/kubernetes/test/e2e/framework/volume"
  17. )
  18. // getSizeRangesIntersection takes two instances of storage size ranges and determines the
  19. // intersection of the intervals (if it exists) and return the minimum of the intersection
  20. // to be used as the claim size for the test.
  21. // if value not set, that means there's no minimum or maximum size limitation and we set default size for it.
  22. // Considerate all corner case as followed:
  23. // first: A,B is regular value and ? means unspecified
  24. // second: C,D is regular value and ? means unspecified
  25. // ----------------------------------------------------------------
  26. // | \second| min=C,max=?| min=C,max=D| min=?,max=D| min=?,max=?|
  27. // |first\ | | | | |
  28. // |----------------------------------------------------------------
  29. // |min=A,max=?| #1 | #2 | #3 | #4 |
  30. // -----------------------------------------------------------------
  31. // |min=A,max=B| #5 | #6 | #7 | #8 |
  32. // -----------------------------------------------------------------
  33. // |min=?,max=B| #9 | #10 | #11 | #12 |
  34. // -----------------------------------------------------------------
  35. // |min=?,max=?| #13 | #14 | #15 | #16 |
  36. // |---------------------------------------------------------------|
  37. func Test_getSizeRangesIntersection(t *testing.T) {
  38. type args struct {
  39. first volume.SizeRange
  40. second volume.SizeRange
  41. }
  42. tests := []struct {
  43. name string
  44. args args
  45. want string
  46. wantErr bool
  47. }{
  48. {
  49. name: "case #1: first{min=A,max=?} second{min=C,max=?} where C > A ",
  50. args: args{
  51. first: volume.SizeRange{
  52. Min: "5Gi",
  53. },
  54. second: volume.SizeRange{
  55. Min: "10Gi",
  56. },
  57. },
  58. want: "10Gi",
  59. wantErr: false,
  60. },
  61. {
  62. name: "case #1: first{min=A,max=?} second{min=C,max=?} where C < A ",
  63. args: args{
  64. first: volume.SizeRange{
  65. Min: "5Gi",
  66. },
  67. second: volume.SizeRange{
  68. Min: "1Gi",
  69. },
  70. },
  71. want: "5Gi",
  72. wantErr: false,
  73. },
  74. {
  75. name: "case #2: first{min=A,max=?} second{min=C,max=D} where A > D ",
  76. args: args{
  77. first: volume.SizeRange{
  78. Min: "5Gi",
  79. },
  80. second: volume.SizeRange{
  81. Min: "1Gi",
  82. Max: "4Gi",
  83. },
  84. },
  85. want: "",
  86. wantErr: true,
  87. },
  88. {
  89. name: "case #2: first{min=A,max=?} second{min=C,max=D} where D > A > C ",
  90. args: args{
  91. first: volume.SizeRange{
  92. Min: "5Gi",
  93. Max: "",
  94. },
  95. second: volume.SizeRange{
  96. Min: "3Gi",
  97. Max: "10Gi",
  98. },
  99. },
  100. want: "5Gi",
  101. wantErr: false,
  102. },
  103. {
  104. name: "case #2: first{min=A,max=?} second{min=C,max=D} where A < C ",
  105. args: args{
  106. first: volume.SizeRange{
  107. Min: "5Gi",
  108. Max: "",
  109. },
  110. second: volume.SizeRange{
  111. Min: "6Gi",
  112. Max: "10Gi",
  113. },
  114. },
  115. want: "6Gi",
  116. wantErr: false,
  117. },
  118. {
  119. name: "case #3: first{min=A,max=?} second{min=?,max=D} where A > D",
  120. args: args{
  121. first: volume.SizeRange{
  122. Min: "5Gi",
  123. Max: "",
  124. },
  125. second: volume.SizeRange{
  126. Max: "1Gi",
  127. },
  128. },
  129. want: "",
  130. wantErr: true,
  131. },
  132. {
  133. name: "case #3: first{min=A,max=?} second{min=?,max=D} where A < D",
  134. args: args{
  135. first: volume.SizeRange{
  136. Min: "5Gi",
  137. Max: "",
  138. },
  139. second: volume.SizeRange{
  140. Max: "10Gi",
  141. },
  142. },
  143. want: "5Gi",
  144. wantErr: false,
  145. },
  146. {
  147. name: "case #4: first{min=A,max=?} second{min=?,max=?} ",
  148. args: args{
  149. first: volume.SizeRange{
  150. Min: "5Gi",
  151. Max: "",
  152. },
  153. second: volume.SizeRange{},
  154. },
  155. want: "5Gi",
  156. wantErr: false,
  157. },
  158. {
  159. name: "case #5: first{min=A,max=B} second{min=C,max=?} where C < A ",
  160. args: args{
  161. first: volume.SizeRange{
  162. Min: "5Gi",
  163. Max: "10Gi",
  164. },
  165. second: volume.SizeRange{
  166. Min: "1Gi",
  167. },
  168. },
  169. want: "5Gi",
  170. wantErr: false,
  171. },
  172. {
  173. name: "case #5: first{min=A,max=B} second{min=C,max=?} where B > C > A ",
  174. args: args{
  175. first: volume.SizeRange{
  176. Min: "5Gi",
  177. Max: "10Gi",
  178. },
  179. second: volume.SizeRange{
  180. Min: "6Gi",
  181. },
  182. },
  183. want: "6Gi",
  184. wantErr: false,
  185. },
  186. {
  187. name: "case #5: first{min=A,max=B} second{min=C,max=?} where C > B ",
  188. args: args{
  189. first: volume.SizeRange{
  190. Min: "5Gi",
  191. Max: "10Gi",
  192. },
  193. second: volume.SizeRange{
  194. Min: "15Gi",
  195. },
  196. },
  197. want: "",
  198. wantErr: true,
  199. },
  200. {
  201. name: "case #6: first{min=A,max=B} second{min=C,max=D} where A < B < C < D",
  202. args: args{
  203. first: volume.SizeRange{
  204. Min: "5Gi",
  205. Max: "6Gi",
  206. },
  207. second: volume.SizeRange{
  208. Min: "7Gi",
  209. Max: "8Gi",
  210. },
  211. },
  212. want: "",
  213. wantErr: true,
  214. },
  215. {
  216. name: "case #6: first{min=A,max=B} second{min=C,max=D} where A < C < B < D ",
  217. args: args{
  218. first: volume.SizeRange{
  219. Min: "5Gi",
  220. Max: "10Gi",
  221. },
  222. second: volume.SizeRange{
  223. Min: "8Gi",
  224. Max: "15Gi",
  225. },
  226. },
  227. want: "8Gi",
  228. wantErr: false,
  229. },
  230. {
  231. name: "case #7: first{min=A,max=B} second{min=?,max=D} where D < A",
  232. args: args{
  233. first: volume.SizeRange{
  234. Min: "5Gi",
  235. Max: "10Gi",
  236. },
  237. second: volume.SizeRange{
  238. Max: "3Gi",
  239. },
  240. },
  241. want: "",
  242. wantErr: true,
  243. },
  244. {
  245. name: "case #7: first{min=A,max=B} second{min=?,max=D} where B > D > A",
  246. args: args{
  247. first: volume.SizeRange{
  248. Min: "5Gi",
  249. Max: "10Gi",
  250. },
  251. second: volume.SizeRange{
  252. Max: "8Gi",
  253. },
  254. },
  255. want: "5Gi",
  256. wantErr: false,
  257. },
  258. {
  259. name: "case #7: first{min=A,max=B} second{min=?,max=D} where D > B",
  260. args: args{
  261. first: volume.SizeRange{
  262. Min: "5Gi",
  263. Max: "10Gi",
  264. },
  265. second: volume.SizeRange{
  266. Max: "15Gi",
  267. },
  268. },
  269. want: "5Gi",
  270. wantErr: false,
  271. },
  272. {
  273. name: "case #8: first{min=A,max=B} second{min=?,max=?}",
  274. args: args{
  275. first: volume.SizeRange{
  276. Min: "5Gi",
  277. Max: "10Gi",
  278. },
  279. second: volume.SizeRange{},
  280. },
  281. want: "5Gi",
  282. wantErr: false,
  283. },
  284. {
  285. name: "case #9: first{min=?,max=B} second{min=C,max=?} where C > B",
  286. args: args{
  287. first: volume.SizeRange{
  288. Max: "5Gi",
  289. },
  290. second: volume.SizeRange{
  291. Min: "10Gi",
  292. },
  293. },
  294. want: "",
  295. wantErr: true,
  296. },
  297. {
  298. name: "case #9: first{min=?,max=B} second{min=C,max=?} where C < B",
  299. args: args{
  300. first: volume.SizeRange{
  301. Max: "10Gi",
  302. },
  303. second: volume.SizeRange{
  304. Min: "5Gi",
  305. },
  306. },
  307. want: "5Gi",
  308. wantErr: false,
  309. },
  310. {
  311. name: "case #10: first{min=?,max=B} second{min=C,max=D} where B > D",
  312. args: args{
  313. first: volume.SizeRange{
  314. Max: "10Gi",
  315. },
  316. second: volume.SizeRange{
  317. Min: "1Gi",
  318. Max: "5Gi",
  319. },
  320. },
  321. want: "1Gi",
  322. wantErr: false,
  323. },
  324. {
  325. name: "case #10: first{min=?,max=B} second{min=C,max=D} where C < B < D",
  326. args: args{
  327. first: volume.SizeRange{
  328. Max: "10Gi",
  329. },
  330. second: volume.SizeRange{
  331. Min: "5Gi",
  332. Max: "15Gi",
  333. },
  334. },
  335. want: "5Gi",
  336. wantErr: false,
  337. },
  338. {
  339. name: "case #10: first{min=?,max=B} second{min=C,max=D} where B < C",
  340. args: args{
  341. first: volume.SizeRange{
  342. Max: "10Gi",
  343. },
  344. second: volume.SizeRange{
  345. Min: "15Gi",
  346. Max: "20Gi",
  347. },
  348. },
  349. want: "",
  350. wantErr: true,
  351. },
  352. {
  353. name: "case #11: first{min=?,max=B} second{min=?,max=D} where D < B",
  354. args: args{
  355. first: volume.SizeRange{
  356. Max: "10Gi",
  357. },
  358. second: volume.SizeRange{
  359. Max: "5Gi",
  360. },
  361. },
  362. want: minValidSize,
  363. wantErr: false,
  364. },
  365. {
  366. name: "case #11: first{min=?,max=B} second{min=?,max=D} where D > B",
  367. args: args{
  368. first: volume.SizeRange{
  369. Max: "10Gi",
  370. },
  371. second: volume.SizeRange{
  372. Max: "15Gi",
  373. },
  374. },
  375. want: minValidSize,
  376. wantErr: false,
  377. },
  378. {
  379. name: "case #12: first{min=?,max=B} second{min=?,max=?} ",
  380. args: args{
  381. first: volume.SizeRange{
  382. Max: "10Gi",
  383. },
  384. second: volume.SizeRange{},
  385. },
  386. want: minValidSize,
  387. wantErr: false,
  388. },
  389. {
  390. name: "case #13: first{min=?,max=?} second{min=C,max=?} ",
  391. args: args{
  392. first: volume.SizeRange{},
  393. second: volume.SizeRange{
  394. Min: "5Gi",
  395. },
  396. },
  397. want: "5Gi",
  398. wantErr: false,
  399. },
  400. {
  401. name: "case #14: first{min=?,max=?} second{min=C,max=D} where C < D",
  402. args: args{
  403. first: volume.SizeRange{},
  404. second: volume.SizeRange{
  405. Min: "5Gi",
  406. Max: "10Gi",
  407. },
  408. },
  409. want: "5Gi",
  410. wantErr: false,
  411. },
  412. {
  413. name: "case #14: first{min=?,max=?} second{min=C,max=D} where C > D",
  414. args: args{
  415. first: volume.SizeRange{},
  416. second: volume.SizeRange{
  417. Min: "10Gi",
  418. Max: "5Gi",
  419. },
  420. },
  421. want: "",
  422. wantErr: true,
  423. },
  424. {
  425. name: "case #14: first{min=?,max=?} second{min=C,max=D} where C = D",
  426. args: args{
  427. first: volume.SizeRange{},
  428. second: volume.SizeRange{
  429. Min: "1Mi",
  430. Max: "1Mi",
  431. },
  432. },
  433. want: "1Mi",
  434. wantErr: false,
  435. },
  436. {
  437. name: "case #15: first{min=?,max=?} second{min=?,max=D}",
  438. args: args{
  439. first: volume.SizeRange{},
  440. second: volume.SizeRange{
  441. Max: "10Gi",
  442. },
  443. },
  444. want: minValidSize,
  445. wantErr: false,
  446. },
  447. {
  448. name: "case #16: first{min=?,max=?} second{min=?,max=?}",
  449. args: args{
  450. first: volume.SizeRange{},
  451. second: volume.SizeRange{},
  452. },
  453. want: minValidSize,
  454. wantErr: false,
  455. },
  456. }
  457. for _, tt := range tests {
  458. got, err := getSizeRangesIntersection(tt.args.first, tt.args.second)
  459. if (err != nil) != tt.wantErr {
  460. t.Errorf("%q. getSizeRangesIntersection() error = %v, wantErr %v", tt.name, err, tt.wantErr)
  461. continue
  462. }
  463. if got != tt.want {
  464. t.Errorf("%q. getSizeRangesIntersection() = %v, want %v", tt.name, got, tt.want)
  465. }
  466. }
  467. }