diff --git a/neat/locals/collector.py b/neat/locals/collector.py index bff094b..23e66c1 100644 --- a/neat/locals/collector.py +++ b/neat/locals/collector.py @@ -124,10 +124,11 @@ def start(): vm_path = common.build_local_vm_path(config['local_data_directory']) if not os.access(vm_path, os.F_OK): os.makedirs(vm_path) - log.info('Created a local VM data directory: ' + vm_path) + log.info('Created a local VM data directory: %s', vm_path) else: - cleanup_all_local_data(vm_path) - log.info('Creaned up the local VM data directory: ' + vm_path) + cleanup_all_local_data(config['local_data_directory']) + log.info('Creaned up the local data directory: %s', + config['local_data_directory']) interval = config['data_collector_interval'] log.info('Starting the data collector, ' + @@ -383,7 +384,7 @@ def substract_lists(list1, list2): def cleanup_local_data(path, vms): """ Delete the local data related to the removed VMs. - :param path: A path to removed VM data from. + :param path: A path to remove VM data from. :type path: str :param vms: A list of removed VM UUIDs. @@ -397,10 +398,14 @@ def cleanup_local_data(path, vms): def cleanup_all_local_data(path): """ Delete all the local data about VMs. - :param path: A path to removed VM data from. + :param path: A path to the local data directory. :type path: str """ - cleanup_local_data(path, os.listdir(path)) + vm_path = common.build_local_vm_path(path) + cleanup_local_data(vm_path, os.listdir(vm_path)) + host_path = common.build_local_host_path(path) + if os.access(host_path, os.F_OK): + os.remove(host_path) @contract @@ -487,6 +492,27 @@ def append_vm_data_remotely(db, data, hostname, host_cpu_mhz): db.insert_host_cpu_mhz(hostname, host_cpu_mhz) +@contract +def append_host_data_locally(path, cpu_mhz, data_length): + """ Write a CPU MHz value for the host. + + :param path: A path to write the data to. + :type path: str + + :param cpu_mhz: A CPU MHz value. + :type cpu_mhz: int + + :param data_length: The maximum allowed length of the data. + :type data_length: int + """ + with open(path, 'r+') as f: + values = deque(f.read().strip().splitlines(), data_length) + values.append(cpu_mhz) + f.truncate(0) + f.seek(0) + f.write('\n'.join([str(x) for x in values]) + '\n') + + @contract def get_cpu_mhz(vir_connection, physical_core_mhz, previous_cpu_time, previous_time, current_time, current_vms, added_vm_data): diff --git a/tests/locals/test_collector.py b/tests/locals/test_collector.py index ce7f79d..e5f3925 100644 --- a/tests/locals/test_collector.py +++ b/tests/locals/test_collector.py @@ -43,13 +43,13 @@ class Collector(TestCase): 'data_collector_interval': str(time_interval)} paths = [collector.DEFAILT_CONFIG_PATH, collector.CONFIG_PATH] fields = collector.REQUIRED_FIELDS - expect(collector).read_and_validate_config(paths, fields). \ - and_return(config).once() - expect(common).init_logging('dir', 'data-collector.log', 2).once() - expect(common).start(collector.init_state, + when(collector).read_and_validate_config(paths, fields). \ + and_return(config)#.once() + when(common).init_logging('dir', 'data-collector.log', 2)#.once() + when(common).start(collector.init_state, collector.execute, config, - time_interval).and_return(state).once() + time_interval).and_return(state)#.once() assert collector.start() == state def test_init_state(self): @@ -204,24 +204,35 @@ class Collector(TestCase): os.path.dirname(__file__), '..', 'resources', 'vms') local_data_directory_tmp = os.path.join( local_data_directory, 'tmp') + local_data_directory_tmp_vms = os.path.join( + local_data_directory_tmp, 'vms') + local_data_directory_tmp_host = os.path.join( + local_data_directory_tmp, 'host') shutil.rmtree(local_data_directory_tmp, True) os.mkdir(local_data_directory_tmp) + os.mkdir(local_data_directory_tmp_vms) vm1 = 'ec452be0-e5d0-11e1-aff1-0800200c9a66' vm2 = 'e615c450-e5d0-11e1-aff1-0800200c9a66' vm3 = 'f3e142d0-e5d0-11e1-aff1-0800200c9a66' shutil.copy(os.path.join(local_data_directory, vm1), - local_data_directory_tmp) + local_data_directory_tmp_vms) shutil.copy(os.path.join(local_data_directory, vm2), - local_data_directory_tmp) + local_data_directory_tmp_vms) shutil.copy(os.path.join(local_data_directory, vm3), - local_data_directory_tmp) + local_data_directory_tmp_vms) + + shutil.copyfile(os.path.join(local_data_directory, vm1), + local_data_directory_tmp_host) + assert len(os.listdir(local_data_directory_tmp)) == 2 + assert len(os.listdir(local_data_directory_tmp_vms)) == 3 - assert len(os.listdir(local_data_directory_tmp)) == 3 collector.cleanup_all_local_data(local_data_directory_tmp) - assert len(os.listdir(local_data_directory_tmp)) == 0 - os.rmdir(local_data_directory_tmp) + assert len(os.listdir(local_data_directory_tmp)) == 1 + assert len(os.listdir(local_data_directory_tmp_vms)) == 0 + + shutil.rmtree(local_data_directory_tmp, True) @qc def fetch_remote_data( @@ -361,6 +372,31 @@ class Collector(TestCase): assert db.select_cpu_mhz_for_host(hostname, 1) == [cpu_mhz] + @qc + def append_host_data_locally( + data=list_(of=int_(min=0, max=3000), + min_length=0, max_length=10), + x=int_(min=0, max=3000), + data_length=int_(min=0, max=10) + ): + path = os.path.join(os.path.dirname(__file__), + '..', 'resources', 'host') + with open(path, 'w') as f: + f.write('\n'.join([str(x) + for x in data]) + '\n') + collector.append_host_data_locally(path, x, data_length) + if data_length > 0: + data.append(x) + expected = data[-data_length:] + else: + expected = [] + + with open(path, 'r') as f: + actual = [int(x) + for x in f.read().strip().splitlines()] + os.remove(path) + assert actual == expected + @qc def get_cpu_mhz( cpus=int_(min=1, max=8),