@@ -1963,3 +1963,115 @@ func Test_growSlice(t *testing.T) {
1963
1963
})
1964
1964
}
1965
1965
}
1966
+
1967
+ // fancyTransformer creates next object on each call to
1968
+ // TransformFromStorage call.
1969
+ type fancyTransformer struct {
1970
+ transformer value.Transformer
1971
+ store * store
1972
+
1973
+ lock sync.Mutex
1974
+ index int
1975
+ }
1976
+
1977
+ func (t * fancyTransformer ) TransformFromStorage (b []byte , ctx value.Context ) ([]byte , bool , error ) {
1978
+ if err := t .createObject (); err != nil {
1979
+ return nil , false , err
1980
+ }
1981
+ return t .transformer .TransformFromStorage (b , ctx )
1982
+ }
1983
+
1984
+ func (t * fancyTransformer ) TransformToStorage (b []byte , ctx value.Context ) ([]byte , error ) {
1985
+ return t .transformer .TransformToStorage (b , ctx )
1986
+ }
1987
+
1988
+ func (t * fancyTransformer ) createObject () error {
1989
+ t .lock .Lock ()
1990
+ defer t .lock .Unlock ()
1991
+
1992
+ t .index ++
1993
+ key := fmt .Sprintf ("pod-%d" , t .index )
1994
+ obj := & example.Pod {
1995
+ ObjectMeta : metav1.ObjectMeta {
1996
+ Name : key ,
1997
+ Labels : map [string ]string {
1998
+ "even" : strconv .FormatBool (t .index % 2 == 0 ),
1999
+ },
2000
+ },
2001
+ }
2002
+ out := & example.Pod {}
2003
+ return t .store .Create (context .TODO (), key , obj , out , 0 )
2004
+ }
2005
+
2006
+ func TestConsistentList (t * testing.T ) {
2007
+ codec := apitesting .TestCodec (codecs , examplev1 .SchemeGroupVersion )
2008
+ cluster := integration .NewClusterV3 (t , & integration.ClusterConfig {Size : 1 })
2009
+ defer cluster .Terminate (t )
2010
+
2011
+ transformer := & fancyTransformer {
2012
+ transformer : & prefixTransformer {prefix : []byte (defaultTestPrefix )},
2013
+ }
2014
+ store := newStore (cluster .RandClient (), true , codec , "" , transformer )
2015
+ transformer .store = store
2016
+
2017
+ for i := 0 ; i < 5 ; i ++ {
2018
+ if err := transformer .createObject (); err != nil {
2019
+ t .Fatalf ("failed to create object: %v" , err )
2020
+ }
2021
+ }
2022
+
2023
+ getAttrs := func (obj runtime.Object ) (labels.Set , fields.Set , error ) {
2024
+ pod , ok := obj .(* example.Pod )
2025
+ if ! ok {
2026
+ return nil , nil , fmt .Errorf ("invalid object" )
2027
+ }
2028
+ return labels .Set (pod .Labels ), nil , nil
2029
+ }
2030
+ predicate := storage.SelectionPredicate {
2031
+ Label : labels.Set {"even" : "true" }.AsSelector (),
2032
+ GetAttrs : getAttrs ,
2033
+ Limit : 4 ,
2034
+ }
2035
+
2036
+ result1 := example.PodList {}
2037
+ if err := store .List (context .TODO (), "/" , storage.ListOptions {Predicate : predicate }, & result1 ); err != nil {
2038
+ t .Fatalf ("failed to list objects: %v" , err )
2039
+ }
2040
+
2041
+ // List objects from the returned resource version.
2042
+ options := storage.ListOptions {
2043
+ Predicate : predicate ,
2044
+ ResourceVersion : result1 .ResourceVersion ,
2045
+ ResourceVersionMatch : metav1 .ResourceVersionMatchExact ,
2046
+ }
2047
+
2048
+ result2 := example.PodList {}
2049
+ if err := store .List (context .TODO (), "/" , options , & result2 ); err != nil {
2050
+ t .Fatalf ("failed to list objects: %v" , err )
2051
+ }
2052
+
2053
+ if ! reflect .DeepEqual (result1 , result2 ) {
2054
+ t .Errorf ("inconsistent lists: %#v, %#v" , result1 , result2 )
2055
+ }
2056
+
2057
+ // Now also verify the ResourceVersionMatchNotOlderThan.
2058
+ options .ResourceVersionMatch = metav1 .ResourceVersionMatchNotOlderThan
2059
+
2060
+ result3 := example.PodList {}
2061
+ if err := store .List (context .TODO (), "/" , options , & result3 ); err != nil {
2062
+ t .Fatalf ("failed to list objects: %v" , err )
2063
+ }
2064
+
2065
+ options .ResourceVersion = result3 .ResourceVersion
2066
+ options .ResourceVersionMatch = metav1 .ResourceVersionMatchExact
2067
+
2068
+ result4 := example.PodList {}
2069
+ if err := store .List (context .TODO (), "/" , options , & result4 ); err != nil {
2070
+ t .Fatalf ("failed to list objects: %v" , err )
2071
+ }
2072
+
2073
+ if ! reflect .DeepEqual (result3 , result4 ) {
2074
+ t .Errorf ("inconsistent lists: %#v, %#v" , result3 , result4 )
2075
+ }
2076
+
2077
+ }
0 commit comments