def _Run(benchmark_spec):
    """Runs cloudharmony iperf from cloudharmony harness."""
    vm_groups = benchmark_spec.vm_groups
    client = vm_groups['client'][0]
    servers = vm_groups['server']
    ports = list(range(_PORT, _PORT + _IPERF_CONCURRENCY.value))
    ports_str = ':'.join([str(port) for port in ports])
    server_ports = [f'{server.internal_ip}:{ports_str}' for server in servers]
    endpoints = ''
    for endpoint in server_ports:
        endpoints += f' --iperf_server {endpoint}'

    metadata = {
        'iperf_server_instance_id': servers[0].machine_type,
        'iperf_server_region': FLAGS.zone[0],
        'meta_instance_id': client.machine_type,
        'iperf_time': _IPERF_TIME.value,
        'iperf_warmup': _IPERF_WARMUP.value,
        'iperf_test': _IPERF_TEST.value,
    }

    if _IPERF_PARALLEL.value:
        metadata['iperf_parallel'] = _IPERF_PARALLEL.value
    if _IPERF_BANDWIDTH.value:
        metadata['iperf_bandwidth'] = _IPERF_BANDWIDTH.value
    if _IPERF_ZEROCOPY.value:
        metadata['iperf_zerocopy'] = True
    metadata['tcp_bw_file'] = _BW_SCRATCH_FILE

    ch_warm_up_metadata = cloud_harmony_util.GetCommonMetadata(metadata)
    cmd_path = posixpath.join('iperf', 'run.sh')

    # Do a warmup tcp run (even if test is udp)
    warm_up_cmd = f'{cmd_path} {endpoints} {ch_warm_up_metadata} --wkhtml_xvfb'
    client.RobustRemoteCommand(warm_up_cmd)

    if _IPERF_TEST.value == UDP:
        metadata['iperf_reverse'] = True
        metadata['iperf_udp'] = True
        metadata['skip_bandwidth_graphs'] = True

    ch_metadata = cloud_harmony_util.GetCommonMetadata(metadata)
    cmd = (f'{cmd_path} {endpoints} {ch_metadata} --wkhtml_xvfb --verbose')

    client.RobustRemoteCommand(cmd)

    cmd_path = posixpath.join('iperf', 'save.sh')
    save_command = (f'sudo {cmd_path} ')

    if FLAGS.ch_store_results:
        save_command += cloud_harmony_util.GetSaveCommand()

    client.RemoteCommand(f'{save_command}')

    return cloud_harmony_util.ParseCsvResultsIntoMetadata(client, OUTPUT)
Exemplo n.º 2
0
def _Run(benchmark_spec, test):
    """Runs cloudharmony network and reports the results."""
    vm_groups = benchmark_spec.vm_groups
    metadata = {
        'test_service_type': FLAGS.ch_network_test_service_type,
        'test': test,
        'throughput_size': FLAGS.ch_network_throughput_size,
        'throughput_threads': FLAGS.ch_network_throughput_threads,
        'throughput_samples': FLAGS.ch_network_throughput_samples,
        'tcp_samples': FLAGS.ch_network_tcp_samples,
    }
    client = vm_groups['client'][0]
    endpoints = ''

    if FLAGS.ch_network_test_service_type == COMPUTE:
        vms = vm_groups['server']
        endpoints = ' '.join(
            [f'--test_endpoint={vm.internal_ip}' for vm in vms])
        _AddComputeMetadata(client, vms[0], metadata)
    elif FLAGS.ch_network_test_service_type == STORAGE:
        http_url = f'http://{benchmark_spec.bucket}.storage.googleapis.com/probe'
        endpoints = f'--test_endpoint={http_url}'
        _AddStorageMetadata(client, metadata)
    elif FLAGS.ch_network_test_service_type == DNS:
        vms = vm_groups['server']
        # use GCP zonal internal DNS,
        # but maybe should add domain to vm's data attributes?
        endpoints = ' '.join([
            f'--test_endpoint={vm.name}.{vm.zone}.c.{vm.project}.internal'
            for vm in vms
        ])
        _AddComputeMetadata(client, vms[0], metadata)

    if FLAGS.ch_network_throughput_https:
        metadata['throughput_https'] = True
    if FLAGS.ch_network_throughput_small_file:
        metadata['throughput_small_file'] = True
    if FLAGS.ch_network_throughput_time:
        metadata['throughput_time'] = True
    if FLAGS.ch_network_throughput_slowest_thread:
        metadata['throughput_slowest_thread'] = True
    if FLAGS.ch_network_test == DNS:
        metadata['dns_recursive'] = True
    if FLAGS.ch_network_test in ['rtt', 'ssl', 'ttfb']:
        metadata['throughput_time'] = True

    metadata = cloud_harmony_util.GetCommonMetadata(metadata)
    cmd_path = posixpath.join(cloud_harmony_network.INSTALL_PATH, 'run.sh')
    outdir = vm_util.VM_TMP_DIR
    cmd = f'sudo {cmd_path} {endpoints} {metadata} --output={outdir} --verbose'
    client.RobustRemoteCommand(cmd)
    save_command = posixpath.join(cloud_harmony_network.INSTALL_PATH,
                                  'save.sh')
    client.RemoteCommand(f'{save_command} {outdir}')
    cloud_harmony_metadata = cloud_harmony_util.ParseCsvResultsIntoMetadata(
        client, OUTPUT)
    return ParseOutput(cloud_harmony_metadata)
    def test_GetCommonMetadata(self):
        no_override = cloud_harmony_util.GetCommonMetadata()
        expected_no_override = ('--meta_compute_service Google Compute Engine '
                                '--meta_compute_service_id google:compute '
                                '--meta_instance_id n1-standard-2 '
                                '--meta_provider Google Cloud Platform '
                                '--meta_provider_id google '
                                '--meta_region us-east3 '
                                '--meta_zone us-east3 '
                                '--meta_test_id None')
        self.assertEqual(no_override, expected_no_override)

        expected_override = ('--meta_compute_service Google Compute Engine '
                             '--meta_compute_service_id google:compute '
                             '--meta_instance_id n1-standard-8 '
                             '--meta_provider Google Cloud Platform '
                             '--meta_provider_id google '
                             '--meta_region us-east3 '
                             '--meta_zone us-east3 '
                             '--meta_test_id None')
        override = cloud_harmony_util.GetCommonMetadata(
            {'meta_instance_id': 'n1-standard-8'})
        self.assertEqual(override, expected_override)