def test(cfg_text, expected_errors): ctx = config_component.validation.Context() cfg = project_config_pb2.BuildbucketCfg() protobuf.text_format.Merge(cfg_text, cfg) swarmingcfg.validate_builder_mixins(cfg.builder_mixins, ctx) self.assertEqual(map(config_test.errmsg, expected_errors), ctx.result().messages)
def test_validate_buildbucket_cfg_fail(self): self.cfg_validation_test( project_config_pb2.BuildbucketCfg(buckets=[ project_config_pb2.Bucket( name='a', acls=[ project_config_pb2.Acl( group='writers', identity='*****@*****.**', role=project_config_pb2.Acl.READER), project_config_pb2.Acl( role=project_config_pb2.Acl.READER), ]), project_config_pb2.Bucket( name='b', acls=[ project_config_pb2.Acl( identity='ldap', role=project_config_pb2.Acl.READER), project_config_pb2.Acl( group='*****@*****.**', role=project_config_pb2.Acl.READER), ]), project_config_pb2.Bucket(), ]), [ errmsg( 'Bucket a: acl #1: either group or identity must be set, ' 'not both'), errmsg('Bucket a: acl #2: group or identity must be set'), errmsg('Bucket b: acl #1: Identity has invalid format: ldap'), errmsg('Bucket b: acl #2: invalid group: [email protected]'), errmsg('Bucket #3: invalid name: Bucket not specified'), ])
def test_cron_update_buckets_change_reservation(self): config.Bucket( id='bucket', project_id='foo', revision='deadbeef', config_content='name: "bucket"', ).put() buildbucket_cfg = project_config_pb2.BuildbucketCfg( buckets=[project_config_pb2.Bucket(name='bucket')]) self.mock(config_component, 'get_project_configs', mock.Mock()) config_component.get_project_configs.return_value = { 'bar': ('deadbeef', buildbucket_cfg), } config.cron_update_buckets() actual = config.Bucket.query().fetch() expected = [ config.Bucket( id='bucket', project_id='bar', revision='deadbeef', config_content='name: "bucket"\n', ) ] self.assertEqual(actual, expected)
def test_validate_buildbucket_cfg_unsorted(self): self.cfg_validation_test( project_config_pb2.BuildbucketCfg(buckets=[ project_config_pb2.Bucket(name='b'), project_config_pb2.Bucket(name='a') ]), [ validation_context.Message( severity=logging.WARNING, text='Buckets are not sorted by name'), ])
def cfg_test(self, swarming_text, mixins_text, expected_errors): swarming_cfg = project_config_pb2.Swarming() protobuf.text_format.Merge(swarming_text, swarming_cfg) buildbucket_cfg = project_config_pb2.BuildbucketCfg() protobuf.text_format.Merge(mixins_text, buildbucket_cfg) mixins = {m.name: m for m in buildbucket_cfg.builder_mixins} ctx = config_component.validation.Context() swarmingcfg.validate_project_cfg(swarming_cfg, mixins, True, ctx) self.assert_errors(ctx, expected_errors)
def cfg_test(self, swarming_text, mixins_text, expected_errors): ctx = config_component.validation.Context() swarming_cfg = project_config_pb2.Swarming() protobuf.text_format.Merge(swarming_text, swarming_cfg) buildbucket_cfg = project_config_pb2.BuildbucketCfg() protobuf.text_format.Merge(mixins_text, buildbucket_cfg) mixins = {m.name: m for m in buildbucket_cfg.builder_mixins} swarmingcfg.validate_cfg(swarming_cfg, mixins, True, ctx) self.assertEqual(map(config_test.errmsg, expected_errors), ctx.result().messages)
def test(cfg_text, expected_builder_text): cfg = project_config_pb2.BuildbucketCfg() protobuf.text_format.Merge(cfg_text, cfg) builder = cfg.buckets[0].swarming.builders[0] swarmingcfg.flatten_builder( builder, cfg.buckets[0].swarming.builder_defaults, {m.name: m for m in cfg.builder_mixins}, ) expected = project_config_pb2.Builder() protobuf.text_format.Merge(expected_builder_text, expected) self.assertEqual(builder, expected)
def test_validate_buildbucket_cfg_duplicate_names(self): config.Bucket(id='master.tryserver.v8', project_id='v8', revision='deadbeef', config_content=MASTER_TRYSERVER_V8_CONFIG_TEXT).put() self.cfg_validation_test( project_config_pb2.BuildbucketCfg(buckets=[ project_config_pb2.Bucket(name='a'), project_config_pb2.Bucket(name='a'), project_config_pb2.Bucket( name='master.tryserver.chromium.linux'), project_config_pb2.Bucket(name='master.tryserver.v8'), ]), [ errmsg('Bucket a: duplicate bucket name'), errmsg('Bucket master.tryserver.v8: ' 'this name is already reserved by another project'), ])
def test_validate_buildbucket_cfg_success(self): self.cfg_validation_test( project_config_pb2.BuildbucketCfg(buckets=[ project_config_pb2.Bucket( name='good.name', acls=[ project_config_pb2.Acl( group='writers', role=project_config_pb2.Acl.WRITER) ], ), project_config_pb2.Bucket( name='good.name2', acls=[ project_config_pb2.Acl( identity='*****@*****.**', role=project_config_pb2.Acl.READER), project_config_pb2.Acl( identity='user:[email protected]', role=project_config_pb2.Acl.READER), ], ) ]), [])
def parse_cfg(text): cfg = project_config_pb2.BuildbucketCfg() protobuf.text_format.Merge(text, cfg) return cfg
def test_cron_update_buckets_with_existing(self): config.Bucket( id='master.tryserver.chromium.linux', project_id='chromium', revision='deadbeef', config_content=MASTER_TRYSERVER_CHROMIUM_LINUX_CONFIG_TEXT, ).put() # Will not be updated. config.Bucket( id='master.tryserver.v8', project_id='v8', revision='deadbeef', config_content=MASTER_TRYSERVER_V8_CONFIG_TEXT, ).put() # Will be deleted. config.Bucket( id='master.tryserver.chromium.win', project_id='chromium', revision='deadbeef', config_content=MASTER_TRYSERVER_CHROMIUM_WIN_CONFIG_TEXT, ).put() chromium_buildbucket_cfg = project_config_pb2.BuildbucketCfg(buckets=[ project_config_pb2.Bucket( name='master.tryserver.chromium.linux', acls=[ project_config_pb2.Acl(role=project_config_pb2.Acl.READER, group='all'), project_config_pb2.Acl( role=project_config_pb2.Acl.SCHEDULER, group='tryjob-access'), ], ), # Will be added. project_config_pb2.Bucket( name='master.tryserver.chromium.mac', acls=[ project_config_pb2.Acl(role=project_config_pb2.Acl.READER, group='all'), project_config_pb2.Acl( role=project_config_pb2.Acl.SCHEDULER, group='tryjob-access'), ], ), ]) v8_buildbucket_cfg = project_config_pb2.BuildbucketCfg( buckets=[ # Reservation will fail. project_config_pb2.Bucket( name='master.tryserver.chromium.linux', acls=[ project_config_pb2.Acl( role=project_config_pb2.Acl.WRITER, group='v8-team') ], ), # Will not be updated. project_config_pb2.Bucket( name='master.tryserver.v8', acls=[ project_config_pb2.Acl( role=project_config_pb2.Acl.WRITER, group='v8-team') ], ), ], ) self.mock(config_component, 'get_project_configs', mock.Mock()) config_component.get_project_configs.return_value = { 'chromium': ('new!', chromium_buildbucket_cfg), 'v8': ('deadbeef', v8_buildbucket_cfg), } config.cron_update_buckets() actual = config.Bucket.query().fetch() actual = sorted(actual, key=lambda b: b.key.id()) expected = [ config.Bucket( id='master.tryserver.chromium.linux', project_id='chromium', revision='new!', config_content=MASTER_TRYSERVER_CHROMIUM_LINUX_CONFIG_TEXT, ), config.Bucket( id='master.tryserver.chromium.mac', project_id='chromium', revision='new!', config_content=MASTER_TRYSERVER_CHROMIUM_MAC_CONFIG_TEXT, ), config.Bucket( id='master.tryserver.v8', project_id='v8', revision='deadbeef', config_content=MASTER_TRYSERVER_V8_CONFIG_TEXT, ), ] self.assertEqual(actual, expected)
def test_cron_update_buckets(self): chromium_buildbucket_cfg = project_config_pb2.BuildbucketCfg(buckets=[ project_config_pb2.Bucket( name='master.tryserver.chromium.linux', acls=[ project_config_pb2.Acl(role=project_config_pb2.Acl.READER, group='all'), project_config_pb2.Acl( role=project_config_pb2.Acl.SCHEDULER, group='tryjob-access'), ], ), project_config_pb2.Bucket( name='master.tryserver.chromium.win', acls=[ project_config_pb2.Acl(role=project_config_pb2.Acl.READER, group='all'), project_config_pb2.Acl( role=project_config_pb2.Acl.SCHEDULER, group='tryjob-access'), ], ), ]) v8_buildbucket_cfg = project_config_pb2.BuildbucketCfg(buckets=[ project_config_pb2.Bucket( name='master.tryserver.v8', acls=[ project_config_pb2.Acl(role=project_config_pb2.Acl.WRITER, group='v8-team') ], ), ]) test_buildbucket_cfg = project_config_pb2.BuildbucketCfg(buckets=[ project_config_pb2.Bucket( name='master.tryserver.test', acls=[ project_config_pb2.Acl(role=project_config_pb2.Acl.WRITER, identity='*****@*****.**') ], ), ]) self.mock(config_component, 'get_project_configs', mock.Mock()) config_component.get_project_configs.return_value = { 'chromium': ('deadbeef', chromium_buildbucket_cfg), 'v8': (None, v8_buildbucket_cfg), 'test': ('babe', test_buildbucket_cfg), } config.cron_update_buckets() actual = config.Bucket.query().fetch() actual = sorted(actual, key=lambda b: b.key) expected = [ config.Bucket( id='master.tryserver.chromium.linux', project_id='chromium', revision='deadbeef', config_content=MASTER_TRYSERVER_CHROMIUM_LINUX_CONFIG_TEXT, ), config.Bucket( id='master.tryserver.chromium.win', project_id='chromium', revision='deadbeef', config_content=MASTER_TRYSERVER_CHROMIUM_WIN_CONFIG_TEXT, ), config.Bucket(id='master.tryserver.test', project_id='test', revision='babe', config_content=MASTER_TRYSERVER_TEST_CONFIG_TEXT), config.Bucket( id='master.tryserver.v8', project_id='v8', revision='sha1:cfc761d7a953a72ddea8f3d4c9a28e69777ca22c', config_content=MASTER_TRYSERVER_V8_CONFIG_TEXT, ), ] self.assertEqual(actual, expected)