blob: f24534a50ba1c01322447da059a9dbfdb4b7e729 [file] [log] [blame]
# Copyright 2018 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
import unittest
from google.protobuf import text_format
from infra.libs.buildbucket.proto.config import project_config_pb2
from infra.libs.buildbucket.swarming import flatten_swarmingcfg
class ProjectCfgTest(unittest.TestCase):
def test_parse_dimensions(self):
dims = ['pool:default', '60:cpu:x86-64']
actual = flatten_swarmingcfg.parse_dimensions(dims)
self.assertEqual({'pool': ('default', 0), 'cpu': ('x86-64', 60)}, actual)
def test_format_dimensions(self):
dims = {'pool': ('default', 0), 'cpu': ('x86-64', 60)}
actual = flatten_swarmingcfg.format_dimensions(dims)
self.assertEqual(['60:cpu:x86-64', 'pool:default'], actual)
def test_flatten_builder(self):
def test(cfg_text, expected_builder_text):
cfg = project_config_pb2.BuildbucketCfg()
text_format.Merge(cfg_text, cfg)
builder = cfg.buckets[0].swarming.builders[0]
flatten_swarmingcfg.flatten_builder(
builder,
cfg.buckets[0].swarming.builder_defaults,
{m.name: m for m in cfg.builder_mixins},
)
expected = project_config_pb2.Builder()
text_format.Merge(expected_builder_text, expected)
self.assertEqual(builder, expected)
test(
'''
buckets {
name: "bucket"
swarming {
hostname: "chromium-swarm.appspot.com"
url_format: "https://example.com/{swarming_hostname}/{task_id}"
builder_defaults {
swarming_tags: "commontag:yes"
dimensions: "cores:8"
dimensions: "pool:default"
dimensions: "cpu:x86-86"
recipe {
repository: "https://example.com/repo"
name: "recipe"
}
caches {
name: "git_chromium"
path: "git_cache"
}
caches {
name: "build_chromium"
path: "out"
}
}
builders {
name: "builder"
swarming_tags: "buildertag:yes"
dimensions: "os:Linux"
dimensions: "pool:Chrome"
dimensions: "cpu:"
priority: 108
recipe {
properties: "predefined-property:x"
properties_j: "predefined-property-bool:true"
}
caches {
name: "a"
path: "a"
}
}
}
}
''', '''
name: "builder"
swarming_tags: "buildertag:yes"
swarming_tags: "commontag:yes"
dimensions: "cores:8"
dimensions: "cpu:"
dimensions: "os:Linux"
dimensions: "pool:Chrome"
priority: 108
recipe {
repository: "https://example.com/repo"
name: "recipe"
properties_j: "predefined-property:\\\"x\\\""
properties_j: "predefined-property-bool:true"
}
caches {
name: "a"
path: "a"
}
caches {
name: "build_chromium"
path: "out"
}
caches {
name: "git_chromium"
path: "git_cache"
}
'''
)
# Diamond merge.
test(
'''
builder_mixins {
name: "base"
dimensions: "d1:base"
dimensions: "d2:base"
dimensions: "d3:base"
dimensions: "60:d4:base"
swarming_tags: "t1:base"
swarming_tags: "t2:base"
swarming_tags: "t3:base"
caches {
name: "c1"
path: "base"
}
caches {
name: "c2"
path: "base"
}
caches {
name: "c3"
path: "base"
}
recipe {
name: "base"
properties: "p1:base"
properties: "p2:base"
properties: "p3:base"
properties_j: "pj1:\\\"base\\\""
properties_j: "pj2:\\\"base\\\""
properties_j: "pj3:\\\"base\\\""
}
}
builder_mixins {
name: "first"
mixins: "base"
dimensions: "d2:first"
dimensions: "d3:first"
dimensions: "120:d4:first"
swarming_tags: "t2:first"
swarming_tags: "t3:first"
caches {
name: "c2"
path: "first"
}
caches {
name: "c3"
path: "first"
}
recipe {
repository: "https://example.com/first"
name: "first"
properties: "p2:first"
properties_j: "pj2:\\\"first\\\""
}
}
builder_mixins {
name: "second"
mixins: "base"
dimensions: "d2:"
dimensions: "d3:second"
swarming_tags: "t3:second"
caches {
name: "c3"
path: "second"
}
recipe {
name: "second"
properties: "p3:second"
# Unset p2 and p2j
properties_j: "p2:null"
properties_j: "pj2:null"
properties_j: "pj3:\\\"second\\\""
}
}
buckets {
name: "bucket"
swarming {
hostname: "chromium-swarm.appspot.com"
builders {
name: "builder"
mixins: "first"
mixins: "second"
}
}
}
''', '''
name: "builder"
dimensions: "60:d4:base"
dimensions: "d1:base"
dimensions: "d2:"
dimensions: "d3:second"
swarming_tags: "t1:base"
swarming_tags: "t2:base"
swarming_tags: "t2:first"
swarming_tags: "t3:base"
swarming_tags: "t3:first"
swarming_tags: "t3:second"
caches {
name: "c1"
path: "base"
}
caches {
name: "c2"
path: "base"
}
caches {
name: "c3"
path: "second"
}
recipe {
repository: "https://example.com/first"
name: "second"
properties_j: "p1:\\\"base\\\""
properties_j: "p2:\\\"first\\\""
properties_j: "p3:\\\"second\\\""
properties_j: "pj1:\\\"base\\\""
properties_j: "pj2:\\\"first\\\""
properties_j: "pj3:\\\"second\\\""
}
'''
)
# builder_defaults, a builder_defaults mixin and a builder mixin.
test(
'''
builder_mixins {
name: "default"
dimensions: "pool:builder_default_mixin"
}
builder_mixins {
name: "builder"
dimensions: "pool:builder_mixin"
}
buckets {
name: "bucket"
swarming {
hostname: "chromium-swarm.appspot.com"
builder_defaults {
mixins: "default"
dimensions: "pool:builder_defaults"
recipe {
repository: "https://x.com"
name: "foo"
}
}
builders {
name: "release"
mixins: "builder"
}
}
}
''', '''
name: "release"
dimensions: "pool:builder_mixin"
recipe {
repository: "https://x.com"
name: "foo"
}
'''
)
# with auto_builder_dimension and mixins and defaults.
test(
'''
builder_mixins {
name: "mixme"
dimensions: "pool:mixed"
}
buckets {
name: "bucket"
swarming {
builder_defaults {
auto_builder_dimension: YES
dimensions: "pool:dedicated"
}
builders {
name: "ng-1000"
mixins: "mixme"
}
}
}
''', '''
name: "ng-1000"
dimensions: "pool:mixed"
auto_builder_dimension: YES
'''
)
def test_merge_toggle(self):
unset = project_config_pb2.Builder()
yes = project_config_pb2.Builder(experimental=project_config_pb2.YES)
no = project_config_pb2.Builder(experimental=project_config_pb2.NO)
b = project_config_pb2.Builder()
flatten_swarmingcfg.merge_builder(b, unset)
flatten_swarmingcfg.merge_builder(b, yes)
self.assertEqual(b.experimental, project_config_pb2.YES)
flatten_swarmingcfg.merge_builder(b, unset)
self.assertEqual(b.experimental, project_config_pb2.YES)
flatten_swarmingcfg.merge_builder(b, no)
self.assertEqual(b.experimental, project_config_pb2.NO)
def test_merge_luci_migration_host(self):
unset = project_config_pb2.Builder()
yes = project_config_pb2.Builder(luci_migration_host='example.com')
no = project_config_pb2.Builder(luci_migration_host='-')
b = project_config_pb2.Builder()
flatten_swarmingcfg.merge_builder(b, unset)
flatten_swarmingcfg.merge_builder(b, yes)
self.assertEqual(b.luci_migration_host, 'example.com')
flatten_swarmingcfg.merge_builder(b, unset)
self.assertEqual(b.luci_migration_host, 'example.com')
flatten_swarmingcfg.merge_builder(b, no)
self.assertEqual(b.luci_migration_host, '-')