shard_client_integration_tests.py revision 22dd226625255110c079e979113dcda1f4fa5ea8
122dd226625255110c079e979113dcda1f4fa5ea8Prashanth Balasubramanian#!/usr/bin/python 222dd226625255110c079e979113dcda1f4fa5ea8Prashanth Balasubramanian#pylint: disable-msg=C0111 322dd226625255110c079e979113dcda1f4fa5ea8Prashanth Balasubramanian 422dd226625255110c079e979113dcda1f4fa5ea8Prashanth Balasubramanian# Copyright (c) 2014 The Chromium OS Authors. All rights reserved. 522dd226625255110c079e979113dcda1f4fa5ea8Prashanth Balasubramanian# Use of this source code is governed by a BSD-style license that can be 622dd226625255110c079e979113dcda1f4fa5ea8Prashanth Balasubramanian# found in the LICENSE file. 722dd226625255110c079e979113dcda1f4fa5ea8Prashanth Balasubramanian 822dd226625255110c079e979113dcda1f4fa5ea8Prashanth Balasubramanianimport common 922dd226625255110c079e979113dcda1f4fa5ea8Prashanth Balasubramanian 1022dd226625255110c079e979113dcda1f4fa5ea8Prashanth Balasubramanianfrom autotest_lib.client.common_lib import global_config 1122dd226625255110c079e979113dcda1f4fa5ea8Prashanth Balasubramanianfrom autotest_lib.client.common_lib.test_utils import unittest 1222dd226625255110c079e979113dcda1f4fa5ea8Prashanth Balasubramanianfrom autotest_lib.frontend import setup_django_environment 1322dd226625255110c079e979113dcda1f4fa5ea8Prashanth Balasubramanianfrom autotest_lib.frontend.afe import frontend_test_utils 1422dd226625255110c079e979113dcda1f4fa5ea8Prashanth Balasubramanianfrom autotest_lib.frontend.afe import models 1522dd226625255110c079e979113dcda1f4fa5ea8Prashanth Balasubramanianfrom autotest_lib.scheduler import rdb_testing_utils 1622dd226625255110c079e979113dcda1f4fa5ea8Prashanth Balasubramanianfrom autotest_lib.scheduler import scheduler_models 1722dd226625255110c079e979113dcda1f4fa5ea8Prashanth Balasubramanianfrom autotest_lib.scheduler.shard import shard_client 1822dd226625255110c079e979113dcda1f4fa5ea8Prashanth Balasubramanian 1922dd226625255110c079e979113dcda1f4fa5ea8Prashanth Balasubramanian 2022dd226625255110c079e979113dcda1f4fa5ea8Prashanth Balasubramanianclass ShardClientIntegrationTest(rdb_testing_utils.AbstractBaseRDBTester, 2122dd226625255110c079e979113dcda1f4fa5ea8Prashanth Balasubramanian unittest.TestCase): 2222dd226625255110c079e979113dcda1f4fa5ea8Prashanth Balasubramanian """Integration tests for the shard_client.""" 2322dd226625255110c079e979113dcda1f4fa5ea8Prashanth Balasubramanian 2422dd226625255110c079e979113dcda1f4fa5ea8Prashanth Balasubramanian 2522dd226625255110c079e979113dcda1f4fa5ea8Prashanth Balasubramanian def setup_global_config(self): 2622dd226625255110c079e979113dcda1f4fa5ea8Prashanth Balasubramanian """Mock out global_config for shard client creation.""" 2722dd226625255110c079e979113dcda1f4fa5ea8Prashanth Balasubramanian global_config.global_config.override_config_value( 2822dd226625255110c079e979113dcda1f4fa5ea8Prashanth Balasubramanian 'SHARD', 'is_slave_shard', 'True') 2922dd226625255110c079e979113dcda1f4fa5ea8Prashanth Balasubramanian global_config.global_config.override_config_value( 3022dd226625255110c079e979113dcda1f4fa5ea8Prashanth Balasubramanian 'SHARD', 'shard_hostname', 'host1') 3122dd226625255110c079e979113dcda1f4fa5ea8Prashanth Balasubramanian 3222dd226625255110c079e979113dcda1f4fa5ea8Prashanth Balasubramanian 3322dd226625255110c079e979113dcda1f4fa5ea8Prashanth Balasubramanian def testCompleteStatusBasic(self): 3422dd226625255110c079e979113dcda1f4fa5ea8Prashanth Balasubramanian """Test that complete jobs are uploaded properly.""" 3522dd226625255110c079e979113dcda1f4fa5ea8Prashanth Balasubramanian 3622dd226625255110c079e979113dcda1f4fa5ea8Prashanth Balasubramanian self.setup_global_config() 3722dd226625255110c079e979113dcda1f4fa5ea8Prashanth Balasubramanian client = shard_client.get_shard_client() 3822dd226625255110c079e979113dcda1f4fa5ea8Prashanth Balasubramanian job = self.create_job(deps=set(['a']), shard_hostname=client.hostname) 3922dd226625255110c079e979113dcda1f4fa5ea8Prashanth Balasubramanian scheduler_models.initialize() 4022dd226625255110c079e979113dcda1f4fa5ea8Prashanth Balasubramanian hqe = scheduler_models.HostQueueEntry.fetch( 4122dd226625255110c079e979113dcda1f4fa5ea8Prashanth Balasubramanian where='job_id = %s' % job.id)[0] 4222dd226625255110c079e979113dcda1f4fa5ea8Prashanth Balasubramanian 4322dd226625255110c079e979113dcda1f4fa5ea8Prashanth Balasubramanian # This should set both the shard_id and the complete bit. 4422dd226625255110c079e979113dcda1f4fa5ea8Prashanth Balasubramanian hqe.set_status('Completed') 4522dd226625255110c079e979113dcda1f4fa5ea8Prashanth Balasubramanian 4622dd226625255110c079e979113dcda1f4fa5ea8Prashanth Balasubramanian # Only incomplete jobs should be in known ids. 4722dd226625255110c079e979113dcda1f4fa5ea8Prashanth Balasubramanian job_ids, host_ids = client._get_known_ids() 4822dd226625255110c079e979113dcda1f4fa5ea8Prashanth Balasubramanian assert(job_ids == []) 4922dd226625255110c079e979113dcda1f4fa5ea8Prashanth Balasubramanian 5022dd226625255110c079e979113dcda1f4fa5ea8Prashanth Balasubramanian # Jobs that have successfully gone through a set_status should 5122dd226625255110c079e979113dcda1f4fa5ea8Prashanth Balasubramanian # be ready for upload. 5222dd226625255110c079e979113dcda1f4fa5ea8Prashanth Balasubramanian jobs = client._get_jobs_to_upload() 5322dd226625255110c079e979113dcda1f4fa5ea8Prashanth Balasubramanian assert(job.id in [j.id for j in jobs]) 5422dd226625255110c079e979113dcda1f4fa5ea8Prashanth Balasubramanian 5522dd226625255110c079e979113dcda1f4fa5ea8Prashanth Balasubramanian 5622dd226625255110c079e979113dcda1f4fa5ea8Prashanth Balasubramanian def testOnlyShardId(self): 5722dd226625255110c079e979113dcda1f4fa5ea8Prashanth Balasubramanian """Test that setting only the shardid prevents the job from upload.""" 5822dd226625255110c079e979113dcda1f4fa5ea8Prashanth Balasubramanian 5922dd226625255110c079e979113dcda1f4fa5ea8Prashanth Balasubramanian self.setup_global_config() 6022dd226625255110c079e979113dcda1f4fa5ea8Prashanth Balasubramanian client = shard_client.get_shard_client() 6122dd226625255110c079e979113dcda1f4fa5ea8Prashanth Balasubramanian job = self.create_job(deps=set(['a']), shard_hostname=client.hostname) 6222dd226625255110c079e979113dcda1f4fa5ea8Prashanth Balasubramanian scheduler_models.initialize() 6322dd226625255110c079e979113dcda1f4fa5ea8Prashanth Balasubramanian hqe = scheduler_models.HostQueueEntry.fetch( 6422dd226625255110c079e979113dcda1f4fa5ea8Prashanth Balasubramanian where='job_id = %s' % job.id)[0] 6522dd226625255110c079e979113dcda1f4fa5ea8Prashanth Balasubramanian 6622dd226625255110c079e979113dcda1f4fa5ea8Prashanth Balasubramanian def _local_update_field(hqe, field_name, value): 6722dd226625255110c079e979113dcda1f4fa5ea8Prashanth Balasubramanian """Turns update_field on the complete field into a no-op.""" 6822dd226625255110c079e979113dcda1f4fa5ea8Prashanth Balasubramanian if field_name == 'complete': 6922dd226625255110c079e979113dcda1f4fa5ea8Prashanth Balasubramanian return 7022dd226625255110c079e979113dcda1f4fa5ea8Prashanth Balasubramanian models.HostQueueEntry.objects.filter(id=hqe.id).update( 7122dd226625255110c079e979113dcda1f4fa5ea8Prashanth Balasubramanian **{field_name: value}) 7222dd226625255110c079e979113dcda1f4fa5ea8Prashanth Balasubramanian setattr(hqe, field_name, value) 7322dd226625255110c079e979113dcda1f4fa5ea8Prashanth Balasubramanian 7422dd226625255110c079e979113dcda1f4fa5ea8Prashanth Balasubramanian self.god.stub_with(scheduler_models.HostQueueEntry, 'update_field', 7522dd226625255110c079e979113dcda1f4fa5ea8Prashanth Balasubramanian _local_update_field) 7622dd226625255110c079e979113dcda1f4fa5ea8Prashanth Balasubramanian 7722dd226625255110c079e979113dcda1f4fa5ea8Prashanth Balasubramanian # This should only update the shard_id. 7822dd226625255110c079e979113dcda1f4fa5ea8Prashanth Balasubramanian hqe.set_status('Completed') 7922dd226625255110c079e979113dcda1f4fa5ea8Prashanth Balasubramanian 8022dd226625255110c079e979113dcda1f4fa5ea8Prashanth Balasubramanian # Retrieve the hqe along an independent code path so we're assured of 8122dd226625255110c079e979113dcda1f4fa5ea8Prashanth Balasubramanian # freshness, then make sure it has shard=None and an unset complete bit. 8222dd226625255110c079e979113dcda1f4fa5ea8Prashanth Balasubramanian modified_hqe = self.db_helper.get_hqes(job_id=job.id)[0] 8322dd226625255110c079e979113dcda1f4fa5ea8Prashanth Balasubramanian assert(modified_hqe.id == hqe.id and 8422dd226625255110c079e979113dcda1f4fa5ea8Prashanth Balasubramanian modified_hqe.complete == 0 and 8522dd226625255110c079e979113dcda1f4fa5ea8Prashanth Balasubramanian modified_hqe.job.shard == None) 8622dd226625255110c079e979113dcda1f4fa5ea8Prashanth Balasubramanian 8722dd226625255110c079e979113dcda1f4fa5ea8Prashanth Balasubramanian # Make sure the job with a shard but without complete is still 8822dd226625255110c079e979113dcda1f4fa5ea8Prashanth Balasubramanian # in known_ids. 8922dd226625255110c079e979113dcda1f4fa5ea8Prashanth Balasubramanian job_ids, host_ids = client._get_known_ids() 9022dd226625255110c079e979113dcda1f4fa5ea8Prashanth Balasubramanian assert(set(job_ids) == set([job.id])) 9122dd226625255110c079e979113dcda1f4fa5ea8Prashanth Balasubramanian 9222dd226625255110c079e979113dcda1f4fa5ea8Prashanth Balasubramanian # Make sure the job with a shard but without complete is not 9322dd226625255110c079e979113dcda1f4fa5ea8Prashanth Balasubramanian # in uploaded jobs. 9422dd226625255110c079e979113dcda1f4fa5ea8Prashanth Balasubramanian jobs = client._get_jobs_to_upload() 9522dd226625255110c079e979113dcda1f4fa5ea8Prashanth Balasubramanian assert(jobs == []) 9622dd226625255110c079e979113dcda1f4fa5ea8Prashanth Balasubramanian 9722dd226625255110c079e979113dcda1f4fa5ea8Prashanth Balasubramanian 98