@@ -10,6 +10,7 @@ import (
1010 "io"
1111 "os"
1212 "path/filepath"
13+ "strings"
1314 "testing"
1415 "time"
1516
@@ -164,6 +165,92 @@ func TestLoadRuntimeConfigFromCloudStorage(t *testing.T) {
164165 require .NoError (t , s .Stop (cortexSvc ))
165166}
166167
168+ func Test_RuntimeConfigLoadValidation (t * testing.T ) {
169+ s , err := e2e .NewScenario (networkName )
170+ require .NoError (t , err )
171+ defer s .Close ()
172+
173+ runtimeConfigYamlFile := `
174+ overrides:
175+ 'user-1':
176+ max_global_series_per_user: 15000
177+ `
178+
179+ require .NoError (t , writeFileToSharedDir (s , runtimeConfigFile , []byte (runtimeConfigYamlFile )))
180+ filePath := filepath .Join (e2e .ContainerSharedDir , runtimeConfigFile )
181+
182+ flags := mergeFlags (BlocksStorageFlags (), map [string ]string {
183+ "-runtime-config.file" : filePath ,
184+ "-runtime-config.backend" : "filesystem" ,
185+
186+ // alert manager
187+ "-alertmanager.web.external-url" : "http://localhost/alertmanager" ,
188+ "-alertmanager-storage.backend" : "local" ,
189+ "-alertmanager-storage.local.path" : filepath .Join (e2e .ContainerSharedDir , "alertmanager_configs" ),
190+
191+ // store-gateway
192+ "-querier.store-gateway-addresses" : "localhost:12345" ,
193+
194+ // distributor.shard-by-all-labels is false
195+ "-distributor.shard-by-all-labels" : "false" ,
196+ })
197+
198+ // Start dependencies.
199+ consul := e2edb .NewConsul ()
200+ minio := e2edb .NewMinio (9000 , flags ["-blocks-storage.s3.bucket-name" ])
201+ require .NoError (t , s .StartAndWaitReady (consul , minio ))
202+
203+ // make alert manager config dir
204+ require .NoError (t , writeFileToSharedDir (s , "alertmanager_configs" , []byte {}))
205+
206+ // Ingester and Store gateway start
207+ ingester := e2ecortex .NewIngester ("ingester" , e2ecortex .RingStoreConsul , consul .NetworkHTTPEndpoint (), flags , "" )
208+ storeGateway := e2ecortex .NewStoreGateway ("store-gateway" , e2ecortex .RingStoreConsul , consul .NetworkHTTPEndpoint (), flags , "" )
209+ require .NoError (t , s .StartAndWaitReady (ingester , storeGateway ))
210+
211+ // Querier start, but fail with "-distributor.shard-by-all-labels": "false"
212+ querier := e2ecortex .NewQuerier ("querier" , e2ecortex .RingStoreConsul , consul .NetworkHTTPEndpoint (), mergeFlags (flags , map [string ]string {
213+ "-querier.store-gateway-addresses" : strings .Join ([]string {storeGateway .NetworkGRPCEndpoint ()}, "," ),
214+ }), "" )
215+ require .Error (t , s .StartAndWaitReady (querier ))
216+
217+ // Start Query frontend
218+ queryFrontend := e2ecortex .NewQueryFrontendWithConfigFile ("query-frontend" , "" , flags , "" )
219+ require .NoError (t , s .Start (queryFrontend ))
220+
221+ // Querier start, should success with "-distributor.shard-by-all-labels": "true"
222+ querier = e2ecortex .NewQuerier ("querier" , e2ecortex .RingStoreConsul , consul .NetworkHTTPEndpoint (), mergeFlags (flags , map [string ]string {
223+ "-querier.store-gateway-addresses" : strings .Join ([]string {storeGateway .NetworkGRPCEndpoint ()}, "," ),
224+ "-distributor.shard-by-all-labels" : "true" ,
225+ "-querier.frontend-address" : queryFrontend .NetworkGRPCEndpoint (),
226+ }), "" )
227+ require .NoError (t , s .StartAndWaitReady (querier ))
228+
229+ // Start Ruler.
230+ ruler := e2ecortex .NewRuler ("ruler" , consul .NetworkHTTPEndpoint (), mergeFlags (flags , RulerFlags ()), "" )
231+ require .NoError (t , s .StartAndWaitReady (ruler ))
232+
233+ // Start the query-scheduler
234+ queryScheduler := e2ecortex .NewQueryScheduler ("query-scheduler" , flags , "" )
235+ require .NoError (t , s .StartAndWaitReady (queryScheduler ))
236+ flags ["-frontend.scheduler-address" ] = queryScheduler .NetworkGRPCEndpoint ()
237+ flags ["-querier.scheduler-address" ] = queryScheduler .NetworkGRPCEndpoint ()
238+
239+ // Start Alertmanager
240+ alertmanager := e2ecortex .NewAlertmanager ("alertmanager" , mergeFlags (flags , AlertmanagerFlags ()), "" )
241+ require .NoError (t , s .StartAndWaitReady (alertmanager ))
242+
243+ // Distributor start, but fail with "-distributor.shard-by-all-labels": "false"
244+ distributor := e2ecortex .NewQuerier ("distributor" , e2ecortex .RingStoreConsul , consul .NetworkHTTPEndpoint (), mergeFlags (flags , map [string ]string {}), "" )
245+ require .Error (t , s .StartAndWaitReady (distributor ))
246+
247+ // Distributor start, should success with "-distributor.shard-by-all-labels": "true"
248+ distributor = e2ecortex .NewQuerier ("distributor" , e2ecortex .RingStoreConsul , consul .NetworkHTTPEndpoint (), mergeFlags (flags , map [string ]string {
249+ "-distributor.shard-by-all-labels" : "true" ,
250+ }), "" )
251+ require .NoError (t , s .StartAndWaitReady (distributor ))
252+ }
253+
167254func assertRuntimeConfigLoadedCorrectly (t * testing.T , cortexSvc * e2ecortex.CortexService ) {
168255 runtimeConfig := getRuntimeConfig (t , cortexSvc )
169256
0 commit comments