autotest: Make 'get_hosts' respect static attributes & labels. BUG=chromium:792309 TEST=Ran unittest. Call RPC 'get_hosts' locally. Change-Id: I1fd5cbe59781fd3c17816c5e386cffc05635c0ff Reviewed-on: https://chromium-review.googlesource.com/929609 Commit-Ready: Xixuan Wu <[email protected]> Tested-by: Xixuan Wu <[email protected]> Reviewed-by: Shuqian Zhao <[email protected]>
diff --git a/frontend/afe/rpc_interface_unittest.py b/frontend/afe/rpc_interface_unittest.py index f134d97..017b122 100755 --- a/frontend/afe/rpc_interface_unittest.py +++ b/frontend/afe/rpc_interface_unittest.py
@@ -246,6 +246,68 @@ self._do_heartbeat_and_assert_response(known_hosts=[host1]) +class RpcInterfaceTestWithStaticAttribute( + mox.MoxTestBase, unittest.TestCase, + frontend_test_utils.FrontendTestMixin): + + def setUp(self): + super(RpcInterfaceTestWithStaticAttribute, self).setUp() + self._frontend_common_setup() + self.god = mock.mock_god() + self.old_respect_static_config = rpc_interface.RESPECT_STATIC_ATTRIBUTES + rpc_interface.RESPECT_STATIC_ATTRIBUTES = True + models.RESPECT_STATIC_ATTRIBUTES = True + + + def tearDown(self): + self.god.unstub_all() + self._frontend_common_teardown() + global_config.global_config.reset_config_values() + rpc_interface.RESPECT_STATIC_ATTRIBUTES = self.old_respect_static_config + models.RESPECT_STATIC_ATTRIBUTES = self.old_respect_static_config + + + def _set_static_attribute(self, host, attribute, value): + """Set static attribute for a host. + + It ensures that all static attributes have a corresponding + entry in afe_host_attributes. + """ + # Get or create the reference object in afe_host_attributes. + model, args = host._get_attribute_model_and_args(attribute) + model.objects.get_or_create(**args) + + attribute_model, get_args = host._get_static_attribute_model_and_args( + attribute) + attribute_object, _ = attribute_model.objects.get_or_create(**get_args) + attribute_object.value = value + attribute_object.save() + + + def _fake_host_with_static_attributes(self): + host1 = models.Host.objects.create(hostname='test_host') + host1.set_attribute('test_attribute1', 'test_value1') + host1.set_attribute('test_attribute2', 'test_value2') + self._set_static_attribute(host1, 'test_attribute1', 'static_value1') + self._set_static_attribute(host1, 'static_attribute1', 'static_value2') + host1.save() + return host1 + + + def test_get_hosts(self): + host1 = self._fake_host_with_static_attributes() + hosts = rpc_interface.get_hosts(hostname=host1.hostname) + host = hosts[0] + + self.assertEquals(host['hostname'], 'test_host') + self.assertEquals(host['acls'], ['Everyone']) + # Respect the value of static attributes. + self.assertEquals(host['attributes'], + {'test_attribute1': 'static_value1', + 'test_attribute2': 'test_value2', + 'static_attribute1': 'static_value2'}) + + class RpcInterfaceTestWithStaticLabel(ShardHeartbeatTest, frontend_test_utils.FrontendTestMixin): @@ -268,6 +330,44 @@ models.RESPECT_STATIC_LABELS = self.old_respect_static_config + def _fake_host_with_static_labels(self): + host1 = models.Host.objects.create(hostname='test_host') + label1 = models.Label.objects.create( + name='non_static_label1', platform=False) + non_static_platform = models.Label.objects.create( + name='static_platform', platform=False) + static_platform = models.StaticLabel.objects.create( + name='static_platform', platform=True) + models.ReplacedLabel.objects.create(label_id=non_static_platform.id) + host1.static_labels.add(static_platform) + host1.labels.add(non_static_platform) + host1.labels.add(label1) + host1.save() + return host1 + + + def test_get_hosts(self): + host1 = self._fake_host_with_static_labels() + hosts = rpc_interface.get_hosts(hostname=host1.hostname) + host = hosts[0] + + self.assertEquals(host['hostname'], 'test_host') + self.assertEquals(host['acls'], ['Everyone']) + # Respect all labels in afe_hosts_labels. + self.assertEquals(host['labels'], + ['non_static_label1', 'static_platform']) + # Respect static labels. + self.assertEquals(host['platform'], 'static_platform') + + + def test_get_hosts_multiple_labels(self): + self._fake_host_with_static_labels() + hosts = rpc_interface.get_hosts( + multiple_labels=['non_static_label1', 'static_platform']) + host = hosts[0] + self.assertEquals(host['hostname'], 'test_host') + + def test_delete_static_label(self): label1 = models.Label.smart_get('static')