blob: 962447d658da9a399bb68e2252f49956a749a382 [file] [log] [blame]
#!/usr/bin/env python
# Copyright 2017 The Fuchsia Authors
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
"""A library with functions to start each of the Cobalt processes locally."""
from __future__ import print_function
import os
import shutil
import subprocess
THIS_DIR = os.path.dirname(__file__)
SRC_ROOT_DIR = os.path.abspath(os.path.join(THIS_DIR, os.pardir))
OUT_DIR = os.path.join(SRC_ROOT_DIR, "out")
SYS_ROOT_DIR = os.path.join(SRC_ROOT_DIR, "sysroot")
DEMO_CONFIG_DIR = os.path.abspath(os.path.join(SRC_ROOT_DIR, "config", "demo"))
PRODUCTION_CONFIG_DIR = os.path.abspath(
os.path.join(SRC_ROOT_DIR, "config", "production"))
CONFIG_BINARY_PROTO = os.path.join(OUT_DIR, "third_party", "config",
"cobalt_config.binproto")
SHUFFLER_DEMO_CONFIG_FILE = os.path.abspath(
os.path.join(SRC_ROOT_DIR, "shuffler", "src", "config", "config_demo.txt"))
SHUFFLER_DB_DIR = os.path.join("/tmp/cobalt_shuffler")
SHUFFLER_CONFIG_DIR = os.path.abspath(
os.path.join(SRC_ROOT_DIR, "shuffler", "src", "shuffler_config"))
SHUFFLER_CONFIG_FILE = os.path.join(SHUFFLER_CONFIG_DIR, "config_v0.txt")
SHUFFLER_DEMO_CONFIG_FILE = os.path.join(SHUFFLER_CONFIG_DIR, "config_demo.txt")
SHUFFLER_TMP_DB_DIR = os.path.join("/tmp/cobalt_shuffler")
DEFAULT_SHUFFLER_PORT = 5001
DEFAULT_ANALYZER_SERVICE_PORT = 6001
DEFAULT_REPORT_MASTER_PORT = 7001
DEFAULT_ANALYZER_PUBLIC_KEY_PEM = os.path.join(SRC_ROOT_DIR,
"analyzer_public.pem")
ANALYZER_PRIVATE_KEY_PEM_NAME = "analyzer_private.pem"
DEFAULT_ANALYZER_PRIVATE_KEY_PEM = os.path.join(SRC_ROOT_DIR,
ANALYZER_PRIVATE_KEY_PEM_NAME)
DEFAULT_SHUFFLER_PUBLIC_KEY_PEM = os.path.join(SRC_ROOT_DIR,
"shuffler_public.pem")
SHUFFLER_PRIVATE_KEY_PEM_NAME = "shuffler_private.pem"
DEFAULT_SHUFFLER_PRIVATE_KEY_PEM = os.path.join(SRC_ROOT_DIR,
SHUFFLER_PRIVATE_KEY_PEM_NAME)
LOCALHOST_TLS_CERT_FILE = os.path.join(SRC_ROOT_DIR, "end_to_end_tests",
"localhost.crt")
LOCALHOST_TLS_KEY_FILE = os.path.join(SRC_ROOT_DIR, "end_to_end_tests",
"localhost.key")
def kill_process(process, name):
""" Kills the given process if it is running and waits for it to terminate.
Args:
process {Popen}: A representation of the process to be killed. May be None.
name {String}: Name of the process for use in a user-facing message.
"""
if process and process.poll() is None:
print("Killing %s..." % name)
process.terminate()
process.kill()
process.wait()
def execute_command(cmd, wait):
""" Executes the given command and optionally waits for it to complete.
Args:
cmd {list of strings}: will be passed to Popen().
wait {bool}: If true we will wait for the command to complete and return the
result code. If false we will return immediately and return an instance of
Popen.
Returns:
An instance of Popen if wait is false or an integer return code if
wait is true.
"""
p = subprocess.Popen(cmd)
if not wait:
return p
return_code = p.wait()
if return_code < 0:
print("")
print("****** WARNING Process [%s] terminated by signal %d" %
(cmd[0], -return_code))
return return_code
def start_bigtable_emulator(wait=True):
# Note(rudominer) We can pass -port=n to cbtemulator to run on a different
# port.
print("")
print("Starting the Cloud Bigtable Emulator...")
print("")
path = os.path.abspath(
os.path.join(SYS_ROOT_DIR, "gcloud", "google-cloud-sdk", "platform",
"bigtable-emulator", "cbtemulator"))
cmd = [path]
return execute_command(cmd, wait)
SHUFFLER_PATH = os.path.abspath(os.path.join(OUT_DIR, "shuffler", "shuffler"))
def start_shuffler(port=DEFAULT_SHUFFLER_PORT,
analyzer_uri="localhost:%d" % DEFAULT_ANALYZER_SERVICE_PORT,
use_memstore=False,
erase_db=True,
db_dir=SHUFFLER_TMP_DB_DIR,
config_file=SHUFFLER_DEMO_CONFIG_FILE,
private_key_pem_file=DEFAULT_SHUFFLER_PRIVATE_KEY_PEM,
use_tls=False,
tls_cert_file=LOCALHOST_TLS_CERT_FILE,
tls_key_file=LOCALHOST_TLS_KEY_FILE,
verbose_count=0,
wait=True):
"""Starts the Shuffler.
Args:
port {int}: The port on which the Shuffler should listen.
analyzer_uri {string}: The URI of the Analyzer Service
use_memstore {bool}: If false the Shuffler will use the LevelDB
store emtpy_db {bool}: When using the LevelDB store, should the store be
erased before the shuffler starts?
config_file {string}: The path to the Shuffler's config file.
"""
print("")
cmd = [
SHUFFLER_PATH, "-port",
str(port), "-private_key_pem_file", private_key_pem_file, "-analyzer_uri",
analyzer_uri, "-config_file", config_file, "-logtostderr"
]
if use_tls:
cmd.append("-tls")
cmd.append("-cert_file=%s" % tls_cert_file)
cmd.append("-key_file=%s" % tls_key_file)
if verbose_count > 0:
cmd.append("-v=%d" % verbose_count)
if use_memstore:
cmd.append("-use_memstore")
else:
cmd = cmd + ["-db_dir", db_dir]
if erase_db:
print("Erasing Shuffler's LevelDB store at %s." % db_dir)
shutil.rmtree(db_dir, ignore_errors=True)
print("Starting the shuffler...")
print("")
return execute_command(cmd, wait)
ANALYZER_SERVICE_PATH = os.path.abspath(
os.path.join(OUT_DIR, "analyzer", "analyzer_service", "analyzer_service"))
def start_analyzer_service(
port=DEFAULT_ANALYZER_SERVICE_PORT,
bigtable_project_name="",
bigtable_instance_id="",
private_key_pem_file=DEFAULT_ANALYZER_PRIVATE_KEY_PEM,
verbose_count=0,
vmodule=None,
wait=True):
print("")
print("Starting the analyzer service...")
print("")
cmd = [
ANALYZER_SERVICE_PATH, "-port",
str(port), "-private_key_pem_file", private_key_pem_file, "-logtostderr"
]
if bigtable_project_name != "" and bigtable_instance_id != "":
cmd = cmd + [
"-bigtable_project_name",
bigtable_project_name,
"-bigtable_instance_id",
bigtable_instance_id,
]
else:
print("Will connect to a local Bigtable Emulator instance.")
cmd.append("-for_testing_only_use_bigtable_emulator")
if verbose_count > 0:
cmd.append("-v=%d" % verbose_count)
if vmodule:
cmd.append("-vmodule=%s" % vmodule)
return execute_command(cmd, wait)
REPORT_MASTER_PATH = os.path.abspath(
os.path.join(OUT_DIR, "analyzer", "report_master",
"analyzer_report_master"))
def start_report_master(port=DEFAULT_REPORT_MASTER_PORT,
bigtable_project_name="",
bigtable_instance_id="",
cobalt_registry_proto_path=CONFIG_BINARY_PROTO,
use_tls=False,
tls_cert_file=LOCALHOST_TLS_CERT_FILE,
tls_key_file=LOCALHOST_TLS_KEY_FILE,
verbose_count=0,
vmodule=None,
wait=True):
print("")
print("Starting the analyzer ReportMaster service...")
print("")
cmd = [
REPORT_MASTER_PATH, "-port",
str(port), "-cobalt_registry_proto_path", cobalt_registry_proto_path,
"-logtostderr"
]
if use_tls:
cmd.append("-use_tls")
cmd.append("-tls_cert_file=%s" % tls_cert_file)
cmd.append("-tls_key_file=%s" % tls_key_file)
if bigtable_project_name != "" and bigtable_instance_id != "":
cmd = cmd + [
"-bigtable_project_name",
bigtable_project_name,
"-bigtable_instance_id",
bigtable_instance_id,
]
else:
print("Will connect to a local Bigtable Emulator instance.")
cmd.append("-for_testing_only_use_bigtable_emulator")
if verbose_count > 0:
cmd.append("-v=%d" % verbose_count)
if vmodule:
cmd.append("-vmodule=%s" % vmodule)
return execute_command(cmd, wait)
TEST_APP_PATH = os.path.abspath(
os.path.join(OUT_DIR, "tools", "test_app", "cobalt_test_app"))
def start_test_app(shuffler_uri="",
analyzer_uri="",
use_tls=False,
root_certs_pem_file="",
analyzer_pk_pem_file=DEFAULT_ANALYZER_PUBLIC_KEY_PEM,
shuffler_pk_pem_file=DEFAULT_SHUFFLER_PUBLIC_KEY_PEM,
cobalt_registry_proto_path=CONFIG_BINARY_PROTO,
project_id=1,
automatic=False,
verbose_count=0,
wait=True):
cmd = [
TEST_APP_PATH, "-shuffler_uri", shuffler_uri, "-analyzer_uri",
analyzer_uri, "-analyzer_pk_pem_file", analyzer_pk_pem_file,
"-shuffler_pk_pem_file", shuffler_pk_pem_file, "-config_bin_proto_path",
cobalt_registry_proto_path, "-project",
str(project_id), "-logtostderr"
]
if (use_tls):
cmd.append("-use_tls")
if (root_certs_pem_file):
cmd.append("-root_certs_pem_file")
cmd.append(root_certs_pem_file)
if verbose_count > 0:
cmd.append("-v=%d" % verbose_count)
if automatic:
cmd.append("-mode=automatic")
return execute_command(cmd, wait)
def start_report_client(report_master_uri="",
use_tls=False,
root_certs_pem_file=LOCALHOST_TLS_CERT_FILE,
project_id=1,
verbose_count=0,
wait=True):
path = os.path.abspath(os.path.join(OUT_DIR, "tools", "report_client"))
cmd = [
path, "-report_master_uri", report_master_uri, "-project_id",
str(project_id), "-logtostderr"
]
if (use_tls):
cmd.append("-tls")
if (root_certs_pem_file):
cmd.append("-ca_file")
cmd.append(root_certs_pem_file)
if verbose_count > 0:
cmd.append("-v=%d" % verbose_count)
return execute_command(cmd, wait)
OBSERVATION_QUERIER_PATH = os.path.abspath(
os.path.join(OUT_DIR, "tools", "observation_querier", "query_observations"))
def start_observation_querier(bigtable_project_name="",
bigtable_instance_id="",
verbose_count=0):
cmd = [OBSERVATION_QUERIER_PATH, "-logtostderr"]
if not bigtable_project_name or not bigtable_instance_id:
cmd.append("-for_testing_only_use_bigtable_emulator")
else:
cmd = cmd + [
"-bigtable_project_name", bigtable_project_name,
"-bigtable_instance_id", bigtable_instance_id
]
if verbose_count > 0:
cmd.append("-v=%d" % verbose_count)
return execute_command(cmd, wait=True)