def test_run_command_verbose(self): proc = FakeProc() cmd = ['foo', 'bar'] with patch('subprocess.Popen', autospec=True, return_value=proc) as p_mock: run_command(cmd, verbose=True) p_mock.assert_called_once_with(cmd, stdout=subprocess.PIPE)
def run_test_without_container(host, args, bootstrapped_controllers): logging.debug('Running test without a container.') cwr_options = get_cwr_options(args, host) cwr_path = get_cwr_path(args) cmd = ('{} -F -l DEBUG -v {} {} --test-id {} {}'.format( cwr_path, ' '.join(bootstrapped_controllers), args.test_plan, args.test_id, cwr_options)) run_command(cmd)
def test_run_command_str(self): proc = FakeProc() cmd = ['foo bar'] with patch('subprocess.Popen', autospec=True, return_value=proc) as p_mock: with patch('buildcloud.utility.print_now'): run_command(cmd, verbose=True) p_mock.assert_called_once_with(cmd, stdout=subprocess.PIPE)
def bootstrap(self): run_command('{} --version'.format(self.juju)) logging.info("JUJU_DATA is set to {}".format(self.host.tmp_juju_home)) try: self._bootstrap() yield [self.get_model(x) for x in self.bootstrapped] finally: self.cleanup()
def run_test_without_container(host, args, bootstrapped_controllers): logging.debug('Running test without a container.') cwr_options = get_cwr_options(args, host) cwr_path = get_cwr_path(args) cmd = ('{} -F -l DEBUG -v {} {} --test-id {} {}'. format(cwr_path, ' '.join(bootstrapped_controllers), args.test_plan, args.test_id, cwr_options)) run_command(cmd)
def run_test_with_container(host, container, args, bootstrapped_controllers): logging.debug("Host data: ", host) logging.debug("Container data: ", container) run_command('sudo docker pull {}'.format(container.name)) s3_creds = '' if args.s3_creds: s3_creds = '-v {}:{} '.format( args.s3_creds, os.path.join(container.home, os.path.basename(args.s3_creds))) container_options = ( '--rm ' '--entrypoint bash ' # override jujubox entrypoint '--name {} ' # Assign a name to the container '-u {} ' '-e HOME={} ' '-e JUJU_HOME={} ' '-e JUJU_DATA={} ' '-e PYTHONPATH={} ' '-w {} ' '-v {}:{} ' # Test result location '-v {}:{} ' # Temp Juju home '-v {}/.deployer-store-cache:{}/.deployer-store-cache ' '-v {}:{} ' # Repository location '-v {}:{} ' # Temp location. '-v {}:{} ' # Test plan '{}' # S3 creds '-v {}:{} ' # ssh path '-t {} '.format(CONTAINER_NAME, container.user, container.home, container.juju_home, container.juju_home, os.path.join(container.home, 'cloud-weather-report'), container.home, host.test_results, container.test_results, host.tmp_juju_home, container.juju_home, host.tmp, container.juju_home, host.juju_repository, container.juju_repository, host.tmp, host.tmp, os.path.dirname(args.test_plan), container.test_plans, s3_creds, host.ssh_path, container.ssh_home, container.name)) test_plan = os.path.join(container.test_plans, os.path.basename(args.test_plan)) cwr_options = get_cwr_options(args, host, container=container) cwr_path = os.path.join(container.home, 'cloud-weather-report/cloudweatherreport/run.py') shell_options = ( 'sudo juju --version && sudo -HE env PATH=$PATH PYTHONPATH=$PYTHONPATH' ' python2 {} -F -l DEBUG -v {} {} --test-id {} {}'.format( cwr_path, ' '.join(bootstrapped_controllers), test_plan, args.test_id, cwr_options)) # The '-c [shell_options]' will get passed to to our entrypoint (bash) command = ("sudo docker run {} -c ".format(container_options).split() + [shell_options]) run_command(command) # Copy logs if args.log_dir: copytree_force(host.test_results, args.log_dir, ignore=shutil.ignore_patterns('static'))
def handle_signal(client, no_container, signal, frame): logging.info("Signal detected.") if no_container: logging.info('Cleaning up controllers') client.cleanup() else: logging.info("Cleaning up the container: {}".format(CONTAINER_NAME)) run_command('sudo docker stop {}'.format(CONTAINER_NAME)) run_command('sudo docker rm {}'.format(CONTAINER_NAME))
def _destroy(self): killed = [] for controller in self.bootstrapped: try: run_command('{} --debug kill-controller {} -y'.format( self.juju, controller)) killed.append(controller) except subprocess.CalledProcessError: logging.error( "Error destroy env failed: {}".format(controller)) self.bootstrapped = [x for x in self.bootstrapped if x not in killed]
def _bootstrap(self): for i, controller in enumerate(self.host.controllers): args = self.get_args() cloud = cloud_from_env(controller) if cloud is None: raise ValueError('Unknown cloud: {}'.format(controller)) self.host.controllers[i] = self.get_model(controller) try: run_command('{} bootstrap --show-log {} {} --default-model {} ' '--no-gui{}'.format(self.juju, cloud, controller, controller, args)) except subprocess.CalledProcessError: logging.error('Bootstrapping failed on {}'.format(controller)) continue self.bootstrapped.append(controller)
def _bootstrap(self): for i, controller in enumerate(self.host.controllers): args = self.get_args() cloud = cloud_from_env(controller) if cloud is None: raise ValueError('Unknown cloud: {}'.format(controller)) self.host.controllers[i] = self.get_model(controller) try: run_command( '{} bootstrap --show-log {} {} --default-model {} ' '--no-gui{}'.format( self.juju, cloud, controller, controller, args)) except subprocess.CalledProcessError: logging.error('Bootstrapping failed on {}'.format( controller)) continue self.bootstrapped.append(controller)
def run_container(host, container, args): logging.debug("Host data: ", host) logging.debug("Container data: ", container) run_command('sudo docker pull {}'.format(container.name)) container_options = ( '--rm ' '-u {} ' '-e Home={} ' '-e JUJU_HOME={} ' '-w {} ' '-v {}:{} ' # Test result location '-v {}:{} ' # Temp Juju home '-v {}/.deployer-store-cache:{}.deployer-store-cache ' '-v {}:{} ' # Repository location '-v {}:{} ' # Temp location. '-v {}:{} ' # Test plan '-v {}:{} ' # ssh path '-t {} '.format(container.user, container.home, container.juju_home, container.home, host.test_results, container.test_results, host.tmp_juju_home, container.juju_home, host.tmp, container.juju_home, host.juju_repository, container.juju_repository, host.tmp, host.tmp, os.path.dirname(args.test_plan), container.test_plans, host.ssh_path, container.ssh_home, container.name)) test_plan = os.path.join( container.test_plans, os.path.basename(args.test_plan)) bundle_file = '' if args.bundle_file: bundle_file = '--bundle {}'.format(args.bundle_file) shell_options = ( 'sudo cwr -F -l DEBUG -v {} {} {}'.format( bundle_file, ' '.join(host.models), test_plan)) command = ('sudo docker run {} sh -c'.format( container_options).split() + [shell_options]) run_command(command) print("User id: {} Group id: {}".format(os.getegid(), os.getpgrp())) # Copy logs if args.log_dir: copytree_force(host.test_results, args.log_dir, ignore=shutil.ignore_patterns('static', '*.html'))
def run_container(host, container, args): logging.debug("Host data: ", host) logging.debug("Container data: ", container) run_command('sudo docker pull {}'.format(container.name)) container_options = ( '--rm ' '-u {} ' '-e Home={} ' '-e JUJU_HOME={} ' '-w {} ' '-v {}:{} ' # Test result location '-v {}:{} ' # Temp Juju home '-v {}/.deployer-store-cache:{}.deployer-store-cache ' '-v {}:{} ' # Repository location '-v {}:{} ' # Temp location. '-v {}:{} ' # Test plan '-v {}:{} ' # ssh path '-t {} '.format(container.user, container.home, container.juju_home, container.home, host.test_results, container.test_results, host.tmp_juju_home, container.juju_home, host.tmp, container.juju_home, host.juju_repository, container.juju_repository, host.tmp, host.tmp, os.path.dirname(args.test_plan), container.test_plans, host.ssh_path, container.ssh_home, container.name)) test_plan = os.path.join(container.test_plans, os.path.basename(args.test_plan)) bundle_file = '' if args.bundle_file: bundle_file = '--bundle {}'.format(args.bundle_file) shell_options = ('sudo cwr -F -l DEBUG -v {} {} {} --test-id {}'.format( bundle_file, ' '.join(host.models), test_plan, args.test_id)) command = ('sudo docker run {} sh -c'.format(container_options).split() + [shell_options]) run_command(command) print("User id: {} Group id: {}".format(os.getegid(), os.getpgrp())) # Copy logs if args.log_dir: copytree_force(host.test_results, args.log_dir, ignore=shutil.ignore_patterns('static'))
def make_client(juju_path, host, log_dir, bootstrap_constraints, constraints, config): if juju_path is None: juju_path = 'juju' version = run_command('{} --version'.format(juju_path)).strip() if version.startswith('1.'): raise ValueError('Juju 1.x is not supported.') elif version.startswith('2.'): return JujuClient(juju_path, host, log_dir=log_dir, bootstrap_constraints=bootstrap_constraints, constraints=constraints, config=config) else: raise ValueError('Unknown juju version')
def juju(host, args): run_command('juju --version') logging.info("Juju home is set to {}".format(host.tmp_juju_home)) try: for model in host.models: run_command( 'juju bootstrap --show-log -e {} --constraints mem=4G'.format( model)) run_command('juju set-constraints -e {} mem=2G'.format(model)) yield finally: if os.getegid() == 111: run_command('sudo chown -R jenkins:jenkins {}'.format(host.root)) else: run_command('sudo chown -R {}:{} {}'.format( os.getegid(), os.getpgrp(), host.root)) error = None copy_remote_logs(host.models, args) for model in host.models: try: run_command( 'juju destroy-environment --force --yes {}'.format(model)) except subprocess.CalledProcessError as e: error = e logging.error("Error destroy env failed: {}".format(model)) if error: raise error
def run(self, command, args='', model=''): m = '{} {}'.format(self.operator_flag, model) if model else model return run_command('{} {} {} {}'.format(self.juju, command, m, args))
def run_test_with_container(host, container, args, bootstrapped_controllers): logging.debug("Host data: ", host) logging.debug("Container data: ", container) run_command('sudo docker pull {}'.format(container.name)) s3_creds = '' if args.s3_creds: s3_creds = '-v {}:{} '.format( args.s3_creds, os.path.join(container.home, os.path.basename(args.s3_creds))) container_options = ( '--rm ' '--entrypoint bash ' # override jujubox entrypoint '--name {} ' # Assign a name to the container '-u {} ' '-e HOME={} ' '-e JUJU_HOME={} ' '-e JUJU_DATA={} ' '-e PYTHONPATH={} ' '-w {} ' '-v {}:{} ' # Test result location '-v {}:{} ' # Temp Juju home '-v {}/.deployer-store-cache:{}/.deployer-store-cache ' '-v {}:{} ' # Repository location '-v {}:{} ' # Temp location. '-v {}:{} ' # Test plan '{}' # S3 creds '-v {}:{} ' # ssh path '-t {} '.format(CONTAINER_NAME, container.user, container.home, container.juju_home, container.juju_home, os.path.join(container.home, 'cloud-weather-report'), container.home, host.test_results, container.test_results, host.tmp_juju_home, container.juju_home, host.tmp, container.juju_home, host.juju_repository, container.juju_repository, host.tmp, host.tmp, os.path.dirname(args.test_plan), container.test_plans, s3_creds, host.ssh_path, container.ssh_home, container.name)) test_plan = os.path.join( container.test_plans, os.path.basename(args.test_plan)) cwr_options = get_cwr_options(args, host, container=container) cwr_path = os.path.join( container.home, 'cloud-weather-report/cloudweatherreport/run.py') shell_options = ( 'sudo juju --version && sudo -HE env PATH=$PATH PYTHONPATH=$PYTHONPATH' ' python2 {} -F -l DEBUG -v {} {} --test-id {} {}'.format( cwr_path, ' '.join(bootstrapped_controllers), test_plan, args.test_id, cwr_options)) # The '-c [shell_options]' will get passed to to our entrypoint (bash) command = ("sudo docker run {} -c ".format( container_options).split() + [shell_options]) run_command(command) # Copy logs if args.log_dir: copytree_force(host.test_results, args.log_dir, ignore=shutil.ignore_patterns('static'))
def juju(host, args): run_command('juju --version') logging.info("Juju home is set to {}".format(host.tmp_juju_home)) bootstrapped = [] try: for model in host.models: try: run_command( 'juju bootstrap --show-log -e {} --constraints mem=4G'. format(model)) run_command('juju set-constraints -e {} mem=2G'.format(model)) except subprocess.CalledProcessError: logging.error('Bootstrapping failed on {}'.format(model)) continue bootstrapped.append(model) host.models = bootstrapped yield finally: if os.getegid() == 111: run_command('sudo chown -R jenkins:jenkins {}'.format(host.root)) else: run_command('sudo chown -R {}:{} {}'.format( os.getegid(), os.getpgrp(), host.root)) try: copy_remote_logs(host.models, args) except subprocess.CalledProcessError: logging.error('Getting logs failed.') for model in host.models: try: run_command( 'juju destroy-environment --force --yes {}'.format(model)) except subprocess.CalledProcessError: logging.error("Error destroy env failed: {}".format(model))