def sync_code( cluster_id: str, dcos_checkout_dir: str, verbose: int, ) -> None: """ Sync files from a DC/OS checkout to master nodes. This syncs integration test files and bootstrap files. ``DCOS_CHECKOUT_DIR`` should be set to the path of clone of an open source DC/OS or DC/OS Enterprise repository. By default the ``DCOS_CHECKOUT_DIR`` argument is set to the value of the ``DCOS_CHECKOUT_DIR`` environment variable. If no ``DCOS_CHECKOUT_DIR`` is given, the current working directory is used. """ set_logging(verbosity_level=verbose) check_cluster_id_exists( new_cluster_id=cluster_id, existing_cluster_ids=existing_cluster_ids(), ) cluster_containers = ClusterVMs(cluster_id=cluster_id) cluster = cluster_containers.cluster sync_code_to_masters( cluster=cluster, dcos_checkout_dir=Path(dcos_checkout_dir), )
def run( cluster_id: str, node_args: Tuple[str], sync_dir: Optional[Path], dcos_login_uname: str, dcos_login_pw: str, no_test_env: bool, env: Dict[str, str], aws_region: str, verbose: int, node: str, ) -> None: """ Run an arbitrary command on a node. This command sets up the environment so that ``pytest`` can be run. For example, run ``dcos-aws run --cluster-id 1231599 pytest -k test_tls.py``. Or, with sync: ``dcos-aws run --sync-dir . --cluster-id 1231599 pytest -k test_tls.py``. To use special characters such as single quotes in your command, wrap the whole command in double quotes. """ # noqa: E501 set_logging(verbosity_level=verbose) check_cluster_id_exists( new_cluster_id=cluster_id, existing_cluster_ids=existing_cluster_ids(aws_region=aws_region), ) cluster_instances = ClusterInstances( cluster_id=cluster_id, aws_region=aws_region, ) cluster = cluster_instances.cluster host = _get_node( cluster_id=cluster_id, node_reference=node, aws_region=aws_region, ) if sync_dir is not None: sync_code_to_masters( cluster=cluster, dcos_checkout_dir=sync_dir, ) run_command( args=list(node_args), cluster=cluster, host=host, use_test_env=not no_test_env, dcos_login_uname=dcos_login_uname, dcos_login_pw=dcos_login_pw, env=env, transport=Transport.SSH, )
def destroy(cluster_id: str) -> None: """ Destroy a cluster. """ check_cluster_id_exists( new_cluster_id=cluster_id, existing_cluster_ids=existing_cluster_ids(), ) cluster_vms = ClusterVMs(cluster_id=cluster_id) with click_spinner.spinner(): cluster_vms.destroy() click.echo(cluster_id)
def destroy(cluster_id: str, transport: Transport) -> None: """ Destroy a cluster. """ check_cluster_id_exists( new_cluster_id=cluster_id, existing_cluster_ids=existing_cluster_ids(), ) cluster_containers = ClusterContainers( cluster_id=cluster_id, transport=transport, ) with click_spinner.spinner(): cluster_containers.destroy() click.echo(cluster_id)
def web(cluster_id: str) -> None: """ Open the browser at the web UI. Note that the web UI may not be available at first. Consider using ``dcos-vagrant wait`` before running this command. """ check_cluster_id_exists( new_cluster_id=cluster_id, existing_cluster_ids=existing_cluster_ids(), ) cluster_vms = ClusterVMs(cluster_id=cluster_id) cluster = cluster_vms.cluster master = next(iter(cluster.masters)) web_ui = 'http://' + str(master.public_ip_address) click.launch(web_ui)
def wait( ctx: click.core.Context, cluster_id: str, superuser_username: str, superuser_password: str, transport: Transport, skip_http_checks: bool, verbose: int, ) -> None: """ Wait for DC/OS to start. """ check_cluster_id_exists( new_cluster_id=cluster_id, existing_cluster_ids=existing_cluster_ids(), ) set_logging(verbosity_level=verbose) urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning) cluster_containers = ClusterContainers( cluster_id=cluster_id, transport=transport, ) http_checks = not skip_http_checks parent = ctx.parent assert parent is not None doctor_command_name = '{info_name} {doctor_name}'.format( info_name=parent.info_name, doctor_name=doctor.name, ) show_wait_help( is_enterprise=cluster_containers.is_enterprise, doctor_command_name=doctor_command_name, ) with click_spinner.spinner(): if cluster_containers.is_enterprise: cluster_containers.cluster.wait_for_dcos_ee( superuser_username=superuser_username, superuser_password=superuser_password, http_checks=http_checks, ) return cluster_containers.cluster.wait_for_dcos_oss(http_checks=http_checks)
def web(cluster_id: str) -> None: """ Open the browser at the web UI. Note that the web UI may not be available at first. Consider using ``dcos-docker wait`` before running this command. """ check_cluster_id_exists( new_cluster_id=cluster_id, existing_cluster_ids=existing_cluster_ids(), ) cluster_containers = ClusterContainers( cluster_id=cluster_id, # The transport is not used so does not matter. transport=Transport.DOCKER_EXEC, ) cluster = cluster_containers.cluster master = next(iter(cluster.masters)) web_ui = 'http://' + str(master.public_ip_address) click.launch(web_ui)
def inspect_cluster(cluster_id: str, aws_region: str) -> None: """ Show cluster details. """ check_cluster_id_exists( new_cluster_id=cluster_id, existing_cluster_ids=existing_cluster_ids(aws_region=aws_region), ) cluster_instances = ClusterInstances( cluster_id=cluster_id, aws_region=aws_region, ) keys = { 'masters': cluster_instances.masters, 'agents': cluster_instances.agents, 'public_agents': cluster_instances.public_agents, } master = next(iter(cluster_instances.cluster.masters)) web_ui = 'http://' + str(master.public_ip_address) nodes = { key: [ InstanceInspectView( instance=instance, aws_region=aws_region, ).to_dict() for instance in instances ] for key, instances in keys.items() } data = { 'Cluster ID': cluster_id, 'Web UI': web_ui, 'Nodes': nodes, } # type: Dict[Any, Any] click.echo( json.dumps(data, indent=4, separators=(',', ': '), sort_keys=True), )
def inspect_cluster(cluster_id: str, env: bool) -> None: """ Show cluster details. To quickly get environment variables to use with Docker tooling, use the ``--env`` flag. Run ``eval $(dcos-docker inspect <CLUSTER_ID> --env)``, then run ``docker exec -it $MASTER_0`` to enter the first master, for example. """ check_cluster_id_exists( new_cluster_id=cluster_id, existing_cluster_ids=existing_cluster_ids(), ) cluster_containers = ClusterContainers( cluster_id=cluster_id, # The transport here is not relevant as we do not make calls to the # cluster. transport=Transport.DOCKER_EXEC, ) master = next(iter(cluster_containers.masters)) web_ui = 'http://' + master.attrs['NetworkSettings']['IPAddress'] ssh_key = cluster_containers.workspace_dir / 'ssh' / 'id_rsa' keys = { 'masters': cluster_containers.masters, 'agents': cluster_containers.agents, 'public_agents': cluster_containers.public_agents, } if env: env_dict = {} for _, containers in keys.items(): for container in containers: inspect_view = ContainerInspectView(container=container) inspect_data = inspect_view.to_dict() reference = inspect_data['e2e_reference'].upper() env_dict[reference] = container.id node_ip_key = reference + '_IP' node_ip = container.attrs['NetworkSettings']['IPAddress'] env_dict[node_ip_key] = node_ip env_dict['WEB_UI'] = web_ui env_dict['SSH_KEY'] = ssh_key for key, value in env_dict.items(): click.echo('export {key}={value}'.format(key=key, value=value)) return nodes = { key: [ ContainerInspectView(container).to_dict() for container in containers ] for key, containers in keys.items() } data = { 'Cluster ID': cluster_id, 'Web UI': web_ui, 'Nodes': nodes, 'SSH key': str(ssh_key), } # type: Dict[Any, Any] click.echo( json.dumps(data, indent=4, separators=(',', ': '), sort_keys=True), )