def _modify_host_helper(self, on_shard=False, host_on_shard=False): shard_hostname = 'shard1' if on_shard: global_config.global_config.override_config_value( 'SHARD', 'shard_hostname', shard_hostname) host = models.Host.objects.all()[0] if host_on_shard: shard = models.Shard.objects.create(hostname=shard_hostname) host.shard = shard host.save() self.assertFalse(host.locked) self.god.stub_class_method(frontend.AFE, 'run') if host_on_shard and not on_shard: mock_afe = self.god.create_mock_class_obj( frontend_wrappers.RetryingAFE, 'MockAFE') self.god.stub_with(frontend_wrappers, 'RetryingAFE', mock_afe) mock_afe2 = frontend_wrappers.RetryingAFE.expect_new( server=shard_hostname, user=None) mock_afe2.run.expect_call('modify_host_local', id=host.id, locked=True, lock_reason='_modify_host_helper lock', lock_time=datetime.datetime( 2015, 12, 15)) elif on_shard: mock_afe = self.god.create_mock_class_obj( frontend_wrappers.RetryingAFE, 'MockAFE') self.god.stub_with(frontend_wrappers, 'RetryingAFE', mock_afe) mock_afe2 = frontend_wrappers.RetryingAFE.expect_new( server=server_utils.get_global_afe_hostname(), user=None) mock_afe2.run.expect_call('modify_host', id=host.id, locked=True, lock_reason='_modify_host_helper lock', lock_time=datetime.datetime( 2015, 12, 15)) rpc_interface.modify_host(id=host.id, locked=True, lock_reason='_modify_host_helper lock', lock_time=datetime.datetime(2015, 12, 15)) host = models.Host.objects.get(pk=host.id) if on_shard: # modify_host on shard does nothing but routing the RPC to master. self.assertFalse(host.locked) else: self.assertTrue(host.locked) self.god.check_playback()
def get_shard_client(): """Instantiate a shard client instance. Configuration values will be read from the global configuration. @returns A shard client instance. """ global_afe_hostname = server_utils.get_global_afe_hostname() shard_hostname = _get_shard_hostname_and_ensure_running_on_shard() tick_pause_sec = _get_tick_pause_sec() return ShardClient(global_afe_hostname, shard_hostname, tick_pause_sec)
def replacement(*args, **kwargs): """We need special handling when decorating an RPC that can be called directly using positional arguments. One example is rpc_interface.create_job(). rpc_interface.create_job_page_handler() calls the function using both positional and keyword arguments. Since frontend.RpcClient.run() takes only keyword arguments for an RPC, positional arguments of the RPC function need to be transformed into keyword arguments. """ kwargs = _convert_to_kwargs_only(func, args, kwargs) if server_utils.is_shard(): afe = frontend_wrappers.RetryingAFE( server=server_utils.get_global_afe_hostname(), user=thread_local.get_user()) return afe.run(func.func_name, **kwargs) return func(**kwargs)
# A list of commands that only applies to primary server. For example, # test_importer should only be run in primary master scheduler. If two servers # are both running test_importer, there is a chance to fail as both try to # update the same table. PRIMARY_ONLY_COMMANDS = ['test_importer'] # A dict to map update_commands defined in config file to repos or files that # decide whether need to update these commands. E.g. if no changes under # frontend repo, no need to update afe. COMMANDS_TO_REPOS_DICT = {'afe': 'frontend/', 'tko': 'tko/'} BUILD_EXTERNALS_COMMAND = 'build_externals' # Services present on all hosts. UNIVERSAL_SERVICES = ['sysmon'] AFE = frontend_wrappers.RetryingAFE( server=server_utils.get_global_afe_hostname(), timeout_min=5, delay_sec=10) class DirtyTreeException(Exception): """Raised when the tree has been modified in an unexpected way.""" class UnknownCommandException(Exception): """Raised when we try to run a command name with no associated command.""" class UnstableServices(Exception): """Raised if a service appears unstable after restart.""" def strip_terminal_codes(text):