def build_agent(container_id=None): logger.info('Rebuilding agent package') container_id = container_id or work.last_container_id quiet_docker('exec', container_id, 'tar', 'czf', configuration.agent_package_path, '-C', path(constants.AGENT_TEMPLATE_DIR).dirname(), path(constants.AGENT_TEMPLATE_DIR).basename())
def _ssh_setup(container_id, container_ip): logger.info('Applying ssh configuration to manager container') try: known_hosts = path('~/.ssh/known_hosts').expanduser() # Known hosts file may not exist ssh_keygen('-R', container_ip) fingerprint = None while not fingerprint: fingerprint = ssh_keyscan(container_ip).stdout.split( '\n')[0].strip() time.sleep(0.01) if fingerprint and known_hosts.exists(): current = known_hosts.text() prefix = '' if not current.endswith('\n'): prefix = '\n' known_hosts.write_text('{}{}\n'.format(prefix, fingerprint), append=True) except sh.ErrorReturnCode: pass quiet_docker('exec', container_id, 'mkdir', '-p', '/root/.ssh') ssh_public_key = ssh_keygen('-y', '-f', configuration.ssh_key_path).strip() with tempfile.NamedTemporaryFile() as f: f.write(ssh_public_key) f.flush() quiet_docker.cp(f.name, '{}:/root/.ssh/authorized_keys'.format(container_id)) # due to a bug in docker 17.06, the file keeps ownership and is not # chowned to the main container user automatically quiet_docker('exec', container_id, 'chown', 'root:root', '/root/.ssh/authorized_keys')
def _create_base_container(label, details_path, tag): docker_tag = tag or configuration.clean_image_docker_tag docker.build('-t', configuration.clean_image_docker_tag, resources.DIR) container_id, container_ip = _run_container(docker_tag=docker_tag, details_path=details_path, label=label) quiet_docker('exec', container_id, 'systemctl', 'start', 'dbus') return container_id, container_ip
def install_docker(version=None, container_id=None): container_id = container_id or work.last_container_id try: quiet_docker('exec', container_id, *'which docker'.split(' ')) logger.info('Docker already installed on container. Doing nothing') return except sh.ErrorReturnCode: pass version = version or _get_docker_version(container_id) install_docker_command = 'yum install -y -q {}'.format(version) docker('exec', container_id, *install_docker_command.split(' '))
def install_docker(version=None, container_id=None): container_id = container_id or work.last_container_id try: quiet_docker('exec', container_id, *'which docker'.split(' ')) logger.info('Docker already installed on container. Doing nothing') return except sh.ErrorReturnCode: pass cp(resources.DIR / 'docker.repo', ':/etc/yum.repos.d/docker.repo', container_id=container_id) if not version: try: version = quiet_docker.version('-f', '{{.Client.Version}}').strip() except sh.ErrorReturnCode as e: version = e.stdout.strip() install_docker_command = 'yum install -y -q docker-engine-{}'.format( version) docker('exec', container_id, *install_docker_command.split(' '))
def _get_manager_credentials(container_id): """ Read the cloudify CLI profile context from the container """ result = quiet_docker('exec', container_id, 'cat', constants.CLOUDIFY_CONTEXT_PATH) context_str = result.strip() # Getting rid of the first line, as it contains !CloudifyProfileContext first_line_break = context_str.find('\n') + 1 context_str = context_str[first_line_break:] return yaml.load(context_str)
def _restart_service(container_id, service): logger.info('Restarting {}'.format(service)) quiet_docker('exec', container_id, 'systemctl', 'restart', service)