@@ -3191,6 +3191,118 @@ def test_assert_consistent_regions(self):
31913191 with self .assertRaises (app_builder .AppBuilderException ):
31923192 assert_consistent_regions ({"aws:us-east-1" : None }, ["azure:westus" ], app_builder .AppBuilderException )
31933193
3194+ def test_validate_system_requirements_instance_type_selector (self ):
3195+ """Test that instanceTypeSelector validation works correctly"""
3196+ validate = app_builder ._validate_system_requirements
3197+
3198+ # Valid cases - should not raise exceptions
3199+
3200+ # instanceTypeSelector alone is valid
3201+ validate ({
3202+ "main" : {
3203+ "instanceTypeSelector" : {
3204+ "allowedInstanceTypes" : ["mem1_ssd1_x4" , "mem1_ssd1_x8" ]
3205+ }
3206+ }
3207+ })
3208+
3209+ # instanceType alone is valid
3210+ validate ({
3211+ "main" : {
3212+ "instanceType" : "mem1_ssd1_x4"
3213+ }
3214+ })
3215+
3216+ # clusterSpec alone is valid
3217+ validate ({
3218+ "main" : {
3219+ "clusterSpec" : {
3220+ "type" : "generic" ,
3221+ "numInstances" : 3
3222+ }
3223+ }
3224+ })
3225+
3226+ # instanceType and clusterSpec together is valid
3227+ validate ({
3228+ "main" : {
3229+ "instanceType" : "mem1_ssd1_x4" ,
3230+ "clusterSpec" : {
3231+ "type" : "generic" ,
3232+ "numInstances" : 3
3233+ }
3234+ }
3235+ })
3236+
3237+ # Empty requirements is valid
3238+ validate ({})
3239+
3240+ # None requirements is valid
3241+ validate (None )
3242+
3243+ # Invalid cases - should raise AppBuilderException
3244+
3245+ # instanceType and instanceTypeSelector are mutually exclusive
3246+ with self .assertRaises (app_builder .AppBuilderException ) as cm :
3247+ validate ({
3248+ "main" : {
3249+ "instanceType" : "mem1_ssd1_x4" ,
3250+ "instanceTypeSelector" : {
3251+ "allowedInstanceTypes" : ["mem1_ssd1_x4" , "mem1_ssd1_x8" ]
3252+ }
3253+ }
3254+ })
3255+ self .assertIn ("mutually exclusive" , str (cm .exception ))
3256+ self .assertIn ("instanceType" , str (cm .exception ))
3257+ self .assertIn ("instanceTypeSelector" , str (cm .exception ))
3258+
3259+ # instanceTypeSelector and clusterSpec are mutually exclusive
3260+ with self .assertRaises (app_builder .AppBuilderException ) as cm :
3261+ validate ({
3262+ "main" : {
3263+ "instanceTypeSelector" : {
3264+ "allowedInstanceTypes" : ["mem1_ssd1_x4" , "mem1_ssd1_x8" ]
3265+ },
3266+ "clusterSpec" : {
3267+ "type" : "generic" ,
3268+ "numInstances" : 3
3269+ }
3270+ }
3271+ })
3272+ self .assertIn ("mutually exclusive" , str (cm .exception ))
3273+ self .assertIn ("instanceTypeSelector" , str (cm .exception ))
3274+ self .assertIn ("clusterSpec" , str (cm .exception ))
3275+
3276+ # Test with wildcard entry point
3277+ with self .assertRaises (app_builder .AppBuilderException ) as cm :
3278+ validate ({
3279+ "*" : {
3280+ "instanceType" : "mem1_ssd1_x4" ,
3281+ "instanceTypeSelector" : {
3282+ "allowedInstanceTypes" : ["mem1_ssd1_x4" ]
3283+ }
3284+ }
3285+ })
3286+ self .assertIn ("mutually exclusive" , str (cm .exception ))
3287+
3288+ # Test with multiple entry points - one invalid
3289+ with self .assertRaises (app_builder .AppBuilderException ) as cm :
3290+ validate ({
3291+ "main" : {
3292+ "instanceTypeSelector" : {
3293+ "allowedInstanceTypes" : ["mem1_ssd1_x4" ]
3294+ }
3295+ },
3296+ "process" : {
3297+ "instanceType" : "mem1_ssd1_x4" ,
3298+ "instanceTypeSelector" : {
3299+ "allowedInstanceTypes" : ["mem1_ssd1_x8" ]
3300+ }
3301+ }
3302+ })
3303+ self .assertIn ("mutually exclusive" , str (cm .exception ))
3304+ self .assertIn ("process" , str (cm .exception ))
3305+
31943306class TestWorkflowBuilderUtils (testutil .DXTestCaseBuildWorkflows ):
31953307 def setUp (self ):
31963308 super (TestWorkflowBuilderUtils , self ).setUp ()
0 commit comments