9
9
//! For details on Kubernetes quantities see: <https://github.com/kubernetes/apimachinery/blob/master/pkg/api/resource/quantity.go>
10
10
11
11
use k8s_openapi:: apimachinery:: pkg:: api:: resource:: Quantity ;
12
+ use serde:: { de:: Visitor , Deserialize , Serialize } ;
12
13
13
14
use crate :: error:: { Error , OperatorResult } ;
14
15
use std:: {
@@ -301,6 +302,66 @@ impl MemoryQuantity {
301
302
}
302
303
}
303
304
305
+ impl Serialize for MemoryQuantity {
306
+ fn serialize < S > ( & self , serializer : S ) -> Result < S :: Ok , S :: Error >
307
+ where
308
+ S : serde:: Serializer ,
309
+ {
310
+ serializer. serialize_str ( & self . to_string ( ) )
311
+ }
312
+ }
313
+
314
+ impl < ' de > Deserialize < ' de > for MemoryQuantity {
315
+ fn deserialize < D > ( deserializer : D ) -> Result < Self , D :: Error >
316
+ where
317
+ D : serde:: Deserializer < ' de > ,
318
+ {
319
+ struct MemoryQuantityVisitor ;
320
+
321
+ impl < ' de > Visitor < ' de > for MemoryQuantityVisitor {
322
+ type Value = MemoryQuantity ;
323
+
324
+ fn expecting ( & self , formatter : & mut std:: fmt:: Formatter ) -> std:: fmt:: Result {
325
+ formatter. write_str ( "a valid memory quantity" )
326
+ }
327
+
328
+ fn visit_str < E > ( self , v : & str ) -> Result < Self :: Value , E >
329
+ where
330
+ E : serde:: de:: Error ,
331
+ {
332
+ MemoryQuantity :: from_str ( v) . map_err ( serde:: de:: Error :: custom)
333
+ }
334
+ }
335
+
336
+ deserializer. deserialize_str ( MemoryQuantityVisitor )
337
+ }
338
+ }
339
+
340
+ impl FromStr for MemoryQuantity {
341
+ type Err = Error ;
342
+
343
+ fn from_str ( q : & str ) -> OperatorResult < Self > {
344
+ let start_of_unit =
345
+ q. find ( |c : char | c != '.' && !c. is_numeric ( ) )
346
+ . ok_or ( Error :: NoQuantityUnit {
347
+ value : q. to_owned ( ) ,
348
+ } ) ?;
349
+ let ( value, unit) = q. split_at ( start_of_unit) ;
350
+ Ok ( MemoryQuantity {
351
+ value : value. parse :: < f32 > ( ) . map_err ( |_| Error :: InvalidQuantity {
352
+ value : q. to_owned ( ) ,
353
+ } ) ?,
354
+ unit : unit. parse ( ) ?,
355
+ } )
356
+ }
357
+ }
358
+
359
+ impl Display for MemoryQuantity {
360
+ fn fmt ( & self , f : & mut std:: fmt:: Formatter < ' _ > ) -> std:: fmt:: Result {
361
+ write ! ( f, "{}{}" , self . value, self . unit)
362
+ }
363
+ }
364
+
304
365
impl Mul < f32 > for MemoryQuantity {
305
366
type Output = MemoryQuantity ;
306
367
@@ -395,31 +456,6 @@ impl PartialEq for MemoryQuantity {
395
456
396
457
impl Eq for MemoryQuantity { }
397
458
398
- impl FromStr for MemoryQuantity {
399
- type Err = Error ;
400
-
401
- fn from_str ( q : & str ) -> OperatorResult < Self > {
402
- let start_of_unit =
403
- q. find ( |c : char | c != '.' && !c. is_numeric ( ) )
404
- . ok_or ( Error :: NoQuantityUnit {
405
- value : q. to_owned ( ) ,
406
- } ) ?;
407
- let ( value, unit) = q. split_at ( start_of_unit) ;
408
- Ok ( MemoryQuantity {
409
- value : value. parse :: < f32 > ( ) . map_err ( |_| Error :: InvalidQuantity {
410
- value : q. to_owned ( ) ,
411
- } ) ?,
412
- unit : unit. parse ( ) ?,
413
- } )
414
- }
415
- }
416
-
417
- impl Display for MemoryQuantity {
418
- fn fmt ( & self , f : & mut std:: fmt:: Formatter < ' _ > ) -> std:: fmt:: Result {
419
- write ! ( f, "{}{}" , self . value, self . unit)
420
- }
421
- }
422
-
423
459
impl TryFrom < Quantity > for MemoryQuantity {
424
460
type Error = Error ;
425
461
@@ -474,7 +510,7 @@ mod test {
474
510
#[ case( "1.2Gi" ) ]
475
511
#[ case( "1.6Gi" ) ]
476
512
#[ case( "1Gi" ) ]
477
- pub fn test_fmt ( #[ case] q : String ) {
513
+ fn test_try_from_quantity ( #[ case] q : String ) {
478
514
let m = MemoryQuantity :: try_from ( Quantity ( q. clone ( ) ) ) . unwrap ( ) ;
479
515
let actual = format ! ( "{m}" ) ;
480
516
assert_eq ! ( q, actual) ;
@@ -486,7 +522,7 @@ mod test {
486
522
#[ case( "2Mi" , 0.8 , "-Xmx1638k" ) ]
487
523
#[ case( "1.5Gi" , 0.8 , "-Xmx1229m" ) ]
488
524
#[ case( "2Gi" , 0.8 , "-Xmx1638m" ) ]
489
- pub fn test_to_java_heap ( #[ case] q : & str , #[ case] factor : f32 , #[ case] heap : & str ) {
525
+ fn test_to_java_heap ( #[ case] q : & str , #[ case] factor : f32 , #[ case] heap : & str ) {
490
526
#[ allow( deprecated) ] // allow use of the deprecated 'to_java_heap' function to test it
491
527
let actual = to_java_heap ( & Quantity ( q. to_owned ( ) ) , factor) . unwrap ( ) ;
492
528
assert_eq ! ( heap, actual) ;
@@ -498,7 +534,7 @@ mod test {
498
534
#[ case( "1.2Gi" , "1228m" ) ]
499
535
#[ case( "1.6Gi" , "1638m" ) ]
500
536
#[ case( "1Gi" , "1g" ) ]
501
- pub fn test_format_java ( #[ case] q : String , #[ case] expected : String ) {
537
+ fn test_format_java ( #[ case] q : String , #[ case] expected : String ) {
502
538
let m = MemoryQuantity :: try_from ( Quantity ( q) ) . unwrap ( ) ;
503
539
let actual = m. format_for_java ( ) . unwrap ( ) ;
504
540
assert_eq ! ( expected, actual) ;
@@ -513,7 +549,7 @@ mod test {
513
549
#[ case( 2000f32 , BinaryMultiple :: Pebi , BinaryMultiple :: Mebi , 2000f32 * 1024f32 * 1024f32 * 1024f32 ) ]
514
550
#[ case( 2000f32 , BinaryMultiple :: Pebi , BinaryMultiple :: Kibi , 2000f32 * 1024f32 * 1024f32 * 1024f32 * 1024f32 ) ]
515
551
#[ case( 2000f32 , BinaryMultiple :: Exbi , BinaryMultiple :: Pebi , 2000f32 * 1024f32 ) ]
516
- pub fn test_scale_to (
552
+ fn test_scale_to (
517
553
#[ case] value : f32 ,
518
554
#[ case] unit : BinaryMultiple ,
519
555
#[ case] target_unit : BinaryMultiple ,
@@ -537,7 +573,7 @@ mod test {
537
573
#[ case( "2000Ki" , 1.0 , BinaryMultiple :: Mebi , 1 ) ]
538
574
#[ case( "4000Mi" , 1.0 , BinaryMultiple :: Gibi , 3 ) ]
539
575
#[ case( "4000Mi" , 0.8 , BinaryMultiple :: Gibi , 3 ) ]
540
- pub fn test_to_java_heap_value (
576
+ fn test_to_java_heap_value (
541
577
#[ case] q : & str ,
542
578
#[ case] factor : f32 ,
543
579
#[ case] target_unit : BinaryMultiple ,
@@ -555,7 +591,7 @@ mod test {
555
591
#[ case( "1000Mi" , 1.0 , BinaryMultiple :: Gibi ) ]
556
592
#[ case( "1023Mi" , 1.0 , BinaryMultiple :: Gibi ) ]
557
593
#[ case( "1024Mi" , 0.8 , BinaryMultiple :: Gibi ) ]
558
- pub fn test_to_java_heap_value_failure (
594
+ fn test_to_java_heap_value_failure (
559
595
#[ case] q : & str ,
560
596
#[ case] factor : f32 ,
561
597
#[ case] target_unit : BinaryMultiple ,
@@ -570,7 +606,7 @@ mod test {
570
606
#[ case( "1Mi" , "512Ki" , "512Ki" ) ]
571
607
#[ case( "2Mi" , "512Ki" , "1536Ki" ) ]
572
608
#[ case( "2048Ki" , "1Mi" , "1024Ki" ) ]
573
- pub fn test_subtraction ( #[ case] lhs : & str , #[ case] rhs : & str , #[ case] res : & str ) {
609
+ fn test_subtraction ( #[ case] lhs : & str , #[ case] rhs : & str , #[ case] res : & str ) {
574
610
let lhs = MemoryQuantity :: try_from ( Quantity ( lhs. to_owned ( ) ) ) . unwrap ( ) ;
575
611
let rhs = MemoryQuantity :: try_from ( Quantity ( rhs. to_owned ( ) ) ) . unwrap ( ) ;
576
612
let expected = MemoryQuantity :: try_from ( Quantity ( res. to_owned ( ) ) ) . unwrap ( ) ;
@@ -587,7 +623,7 @@ mod test {
587
623
#[ case( "1Mi" , "512Ki" , "1536Ki" ) ]
588
624
#[ case( "2Mi" , "512Ki" , "2560Ki" ) ]
589
625
#[ case( "2048Ki" , "1Mi" , "3072Ki" ) ]
590
- pub fn test_addition ( #[ case] lhs : & str , #[ case] rhs : & str , #[ case] res : & str ) {
626
+ fn test_addition ( #[ case] lhs : & str , #[ case] rhs : & str , #[ case] res : & str ) {
591
627
let lhs = MemoryQuantity :: try_from ( Quantity ( lhs. to_owned ( ) ) ) . unwrap ( ) ;
592
628
let rhs = MemoryQuantity :: try_from ( Quantity ( rhs. to_owned ( ) ) ) . unwrap ( ) ;
593
629
let expected = MemoryQuantity :: try_from ( Quantity ( res. to_owned ( ) ) ) . unwrap ( ) ;
@@ -608,7 +644,7 @@ mod test {
608
644
#[ case( "100Ki" , "101Ki" , false ) ]
609
645
#[ case( "1Mi" , "100Ki" , true ) ]
610
646
#[ case( "2000Ki" , "1Mi" , true ) ]
611
- pub fn test_comparison ( #[ case] lhs : & str , #[ case] rhs : & str , #[ case] res : bool ) {
647
+ fn test_comparison ( #[ case] lhs : & str , #[ case] rhs : & str , #[ case] res : bool ) {
612
648
let lhs = MemoryQuantity :: try_from ( Quantity ( lhs. to_owned ( ) ) ) . unwrap ( ) ;
613
649
let rhs = MemoryQuantity :: try_from ( Quantity ( rhs. to_owned ( ) ) ) . unwrap ( ) ;
614
650
assert_eq ! ( lhs > rhs, res)
@@ -619,9 +655,41 @@ mod test {
619
655
#[ case( "100Ki" , "200Ki" , false ) ]
620
656
#[ case( "1Mi" , "1024Ki" , true ) ]
621
657
#[ case( "1024Ki" , "1Mi" , true ) ]
622
- pub fn test_eq ( #[ case] lhs : & str , #[ case] rhs : & str , #[ case] res : bool ) {
658
+ fn test_eq ( #[ case] lhs : & str , #[ case] rhs : & str , #[ case] res : bool ) {
623
659
let lhs = MemoryQuantity :: try_from ( Quantity ( lhs. to_owned ( ) ) ) . unwrap ( ) ;
624
660
let rhs = MemoryQuantity :: try_from ( Quantity ( rhs. to_owned ( ) ) ) . unwrap ( ) ;
625
661
assert_eq ! ( lhs == rhs, res)
626
662
}
663
+
664
+ #[ rstest]
665
+ #[ case( MemoryQuantity :: from_mebi( 1536.0 ) , "memory: 1536Mi\n " ) ]
666
+ #[ case( MemoryQuantity :: from_mebi( 100.0 ) , "memory: 100Mi\n " ) ]
667
+ #[ case( MemoryQuantity :: from_gibi( 10.0 ) , "memory: 10Gi\n " ) ]
668
+ #[ case( MemoryQuantity :: from_gibi( 1.0 ) , "memory: 1Gi\n " ) ]
669
+ fn test_serialize ( #[ case] memory : MemoryQuantity , #[ case] expected : & str ) {
670
+ #[ derive( Serialize ) ]
671
+ struct Memory {
672
+ memory : MemoryQuantity ,
673
+ }
674
+
675
+ let memory = Memory { memory } ;
676
+ let output = serde_yaml:: to_string ( & memory) . unwrap ( ) ;
677
+
678
+ assert_eq ! ( output, expected) ;
679
+ }
680
+
681
+ #[ rstest]
682
+ #[ case( "memory: 1536Mi" , MemoryQuantity :: from_mebi( 1536.0 ) ) ]
683
+ #[ case( "memory: 100Mi" , MemoryQuantity :: from_mebi( 100.0 ) ) ]
684
+ #[ case( "memory: 10Gi" , MemoryQuantity :: from_gibi( 10.0 ) ) ]
685
+ #[ case( "memory: 1Gi" , MemoryQuantity :: from_gibi( 1.0 ) ) ]
686
+ fn test_deserialize ( #[ case] input : & str , #[ case] expected : MemoryQuantity ) {
687
+ #[ derive( Deserialize ) ]
688
+ struct Memory {
689
+ memory : MemoryQuantity ,
690
+ }
691
+
692
+ let memory: Memory = serde_yaml:: from_str ( input) . unwrap ( ) ;
693
+ assert_eq ! ( memory. memory, expected) ;
694
+ }
627
695
}
0 commit comments