[autotest] Create a shard with multiple board labels
'atest shard create' allows only one label for a shard.
Since our sharding architecture allows multiple board labels for
a shard, update atest tool accordingly.
Old code only lists all shards with 'atest shard list' even
in the case a user passes 'shards' parameter.
'shards' parameter didn't work. This CL corrects the feature.
In addition, old code doesn't have '--label' option for
'atest shard list', but there is a code to parse the option.
Removed the parsing code.
BUG=chromium:489914
TEST=Test 'atest' tool on local machine.
DEPLOY=apache
Change-Id: Ia18374d9b8b9d44ead63c98cc13fb47a84ddf70f
Reviewed-on: https://chromium-review.googlesource.com/286194
Trybot-Ready: Mungyung Ryu <mkryu@google.com>
Tested-by: Mungyung Ryu <mkryu@google.com>
Reviewed-by: Dan Shi <dshi@chromium.org>
Reviewed-by: Fang Deng <fdeng@chromium.org>
Commit-Queue: Mungyung Ryu <mkryu@google.com>
diff --git a/frontend/afe/site_rpc_interface.py b/frontend/afe/site_rpc_interface.py
index 3163b8a..a79146d 100644
--- a/frontend/afe/site_rpc_interface.py
+++ b/frontend/afe/site_rpc_interface.py
@@ -442,26 +442,30 @@
return serialized_shards
-def add_shard(hostname, label):
+def add_shard(hostname, labels):
"""Add a shard and start running jobs on it.
@param hostname: The hostname of the shard to be added; needs to be unique.
- @param label: A platform label. Jobs of this label will be assigned to the
- shard.
+ @param labels: Board labels separated by a comma. Jobs of one of the labels
+ will be assigned to the shard.
@raises error.RPCException: If label provided doesn't start with `board:`
@raises model_logic.ValidationError: If a shard with the given hostname
already exists.
@raises models.Label.DoesNotExist: If the label specified doesn't exist.
"""
- if not label.startswith('board:'):
- raise error.RPCException('Sharding only supported for `board:.*` '
- 'labels.')
+ labels = labels.split(',')
+ label_models = []
+ for label in labels:
+ if not label.startswith('board:'):
+ raise error.RPCException('Sharding only supports for `board:.*` '
+ 'labels.')
+ # Fetch label first, so shard isn't created when label doesn't exist.
+ label_models.append(models.Label.smart_get(label))
- # Fetch label first, so shard isn't created when label doesn't exist.
- label = models.Label.smart_get(label)
shard = models.Shard.add_object(hostname=hostname)
- shard.labels.add(label)
+ for label in label_models:
+ shard.labels.add(label)
return shard.id
diff --git a/frontend/afe/site_rpc_interface_unittest.py b/frontend/afe/site_rpc_interface_unittest.py
index 398d013..c7fe91a 100755
--- a/frontend/afe/site_rpc_interface_unittest.py
+++ b/frontend/afe/site_rpc_interface_unittest.py
@@ -747,18 +747,21 @@
"""Retrieve a list of all shards."""
lumpy_label = models.Label.objects.create(name='board:lumpy',
platform=True)
+ stumpy_label = models.Label.objects.create(name='board:stumpy',
+ platform=True)
shard_id = site_rpc_interface.add_shard(
- hostname='host1', label='board:lumpy')
+ hostname='host1', labels='board:lumpy,board:stumpy')
self.assertRaises(model_logic.ValidationError,
site_rpc_interface.add_shard,
- hostname='host1', label='board:lumpy')
+ hostname='host1', labels='board:lumpy,board:stumpy')
shard = models.Shard.objects.get(pk=shard_id)
self.assertEqual(shard.hostname, 'host1')
self.assertEqual(shard.labels.values_list('pk')[0], (lumpy_label.id,))
+ self.assertEqual(shard.labels.values_list('pk')[1], (stumpy_label.id,))
self.assertEqual(site_rpc_interface.get_shards(),
- [{'labels': ['board:lumpy'],
+ [{'labels': ['board:lumpy','board:stumpy'],
'hostname': 'host1',
'id': 1}])