77 "io"
88 "text/template"
99
10+ . "github.com/onsi/ginkgo/v2"
1011 "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
1112 "k8s.io/apimachinery/pkg/util/yaml"
1213 "sigs.k8s.io/controller-runtime/pkg/client"
@@ -120,9 +121,14 @@ type route struct {
120121
121122// ScaleObjects contains objects for scale testing.
122123type ScaleObjects struct {
123- // BaseObjects contains objects that are common to all scale iterations.
124+ // BaseObjects contains objects that should be created first:
125+ // secrets and other foundational resources.
124126 BaseObjects []client.Object
125- // ScaleIterationGroups contains objects for each scale iteration.
127+ // GatewayAndServiceObjects contains backend services, deployments, and Gateway objects.
128+ // These are created after BaseObjects to ensure endpoints are ready before traffic.
129+ GatewayAndServiceObjects []client.Object
130+ // ScaleIterationGroups contains HTTPRoute objects for each scale iteration.
131+ // These are applied after GatewayAndServiceObjects to start traffic flow incrementally.
126132 ScaleIterationGroups [][]client.Object
127133}
128134
@@ -150,12 +156,15 @@ func decodeObjects(reader io.Reader) ([]client.Object, error) {
150156}
151157
152158// GenerateScaleListenerObjects generates objects for a given number of listeners for the scale test.
159+ // Secrets are created first in BaseObjects, then backend services/deployments and Gateway in GatewayAndServiceObjects,
160+ // and finally HTTPRoutes in ScaleIterationGroups.
153161func GenerateScaleListenerObjects (numListeners int , tls bool ) (ScaleObjects , error ) {
154162 var result ScaleObjects
155163
156164 listeners := make ([]listener , 0 )
157165 backends := make ([]string , 0 )
158166 secrets := make ([]string , 0 )
167+ routes := make ([]route , 0 )
159168
160169 for i := range numListeners {
161170 listenerName := fmt .Sprintf ("listener-%d" , i )
@@ -180,35 +189,40 @@ func GenerateScaleListenerObjects(numListeners int, tls bool) (ScaleObjects, err
180189 HostnamePrefix : hostnamePrefix ,
181190 BackendName : backendName ,
182191 }
192+ routes = append (routes , r )
183193
184194 backends = append (backends , backendName )
185-
186- objects , err := generateManifests (listeners , []route {r })
187- if err != nil {
188- return ScaleObjects {}, err
189- }
190-
191- result .ScaleIterationGroups = append (result .ScaleIterationGroups , objects )
192195 }
193196
194197 secretObjects , err := generateSecrets (secrets )
195198 if err != nil {
196199 return ScaleObjects {}, err
197200 }
198-
199201 result .BaseObjects = append (result .BaseObjects , secretObjects ... )
200202
201203 backendObjects , err := generateBackendAppObjects (backends )
202204 if err != nil {
203205 return ScaleObjects {}, err
204206 }
207+ result .GatewayAndServiceObjects = append (result .GatewayAndServiceObjects , backendObjects ... )
205208
206- result .BaseObjects = append (result .BaseObjects , backendObjects ... )
209+ gatewayObjects , err := generateManifests (listeners , nil )
210+ if err != nil {
211+ return ScaleObjects {}, err
212+ }
213+ result .GatewayAndServiceObjects = append (result .GatewayAndServiceObjects , gatewayObjects ... )
214+
215+ routeObjects , err := generateManifests (nil , routes )
216+ if err != nil {
217+ return ScaleObjects {}, err
218+ }
219+ result .ScaleIterationGroups = append (result .ScaleIterationGroups , routeObjects )
207220
208221 return result , nil
209222}
210223
211224func generateSecrets (secrets []string ) ([]client.Object , error ) {
225+ GinkgoWriter .Printf ("Generating secrets\n " )
212226 objects := make ([]client.Object , 0 , len (secrets ))
213227
214228 for _ , secret := range secrets {
@@ -225,6 +239,7 @@ func generateSecrets(secrets []string) ([]client.Object, error) {
225239
226240 objects = append (objects , objs ... )
227241 }
242+ GinkgoWriter .Printf ("Generated %d secrets\n " , len (objects ))
228243
229244 return objects , nil
230245}
@@ -240,6 +255,21 @@ func GenerateScaleHTTPRouteObjects(numRoutes int) (ScaleObjects, error) {
240255
241256 backendName := "backend"
242257
258+ // Generate backend objects and add to GatewayAndServiceObjects
259+ backendObjects , err := generateBackendAppObjects ([]string {backendName })
260+ if err != nil {
261+ return ScaleObjects {}, err
262+ }
263+ result .GatewayAndServiceObjects = append (result .GatewayAndServiceObjects , backendObjects ... )
264+
265+ // Generate Gateway object and add to GatewayAndServiceObjects
266+ gatewayObjects , err := generateManifests ([]listener {l }, nil )
267+ if err != nil {
268+ return ScaleObjects {}, err
269+ }
270+ result .GatewayAndServiceObjects = append (result .GatewayAndServiceObjects , gatewayObjects ... )
271+
272+ // Generate HTTPRoute objects for each iteration
243273 for i := range numRoutes {
244274 r := route {
245275 Name : fmt .Sprintf ("route-%d" , i ),
@@ -248,27 +278,15 @@ func GenerateScaleHTTPRouteObjects(numRoutes int) (ScaleObjects, error) {
248278 BackendName : backendName ,
249279 }
250280
251- var listeners []listener
252- if i == 0 {
253- // only generate a Gateway on the first iteration
254- listeners = []listener {l }
255- }
256-
257- objects , err := generateManifests (listeners , []route {r })
281+ // Generate only the HTTPRoute (no listeners/gateway)
282+ routeObjects , err := generateManifests (nil , []route {r })
258283 if err != nil {
259284 return ScaleObjects {}, err
260285 }
261286
262- result .ScaleIterationGroups = append (result .ScaleIterationGroups , objects )
287+ result .ScaleIterationGroups = append (result .ScaleIterationGroups , routeObjects )
263288 }
264289
265- backendObjects , err := generateBackendAppObjects ([]string {backendName })
266- if err != nil {
267- return ScaleObjects {}, err
268- }
269-
270- result .BaseObjects = backendObjects
271-
272290 return result , nil
273291}
274292
0 commit comments