def test_conductor_destroy(self, mock_check_call): args = Arguments(tests='dummy') with cd('tests_functional/charms/test/'): c = juju_test.Conductor(args) c.juju_version = juju_test.JujuVersion(major=1, minor=1, patch=1) good_env = 'valid' c.destroy(good_env) mock_check_call.assert_called_once_with( ['juju', 'destroy-environment', '-y', '-e', good_env], env=c.env) mock_check_call.reset_mock() c.juju_version = juju_test.JujuVersion(major=1, minor=17, patch=0) c.destroy(good_env) mock_check_call.assert_called_once_with( ['juju', 'destroy-environment', '-y', good_env], env=c.env) mock_check_call.reset_mock() c.juju_version = juju_test.JujuVersion(major=0, minor=8, patch=0) c.destroy(good_env) expected_cmd = 'echo y | juju destroy-environment -e %s' % good_env mock_check_call.assert_called_once_with(expected_cmd, shell=True, env=c.env)
def test_conductor_destroy_failed(self, mock_check_call): from subprocess import CalledProcessError mock_check_call.side_effect = CalledProcessError('err', 'err', 'err') bad_env = 'invalid' args = Arguments(tests='dummy') c = juju_test.Conductor(args) c.juju_version = juju_test.JujuVersion(major=1, minor=8, patch=0) self.assertRaises(juju_test.DestroyUnreliable, c.destroy, bad_env) mock_check_call.reset_mock() c.juju_version = juju_test.JujuVersion(major=0, minor=8, patch=0) self.assertRaises(juju_test.DestroyUnreliable, c.destroy, bad_env)
def test_conductor_bootstrap(self, mock_status, mcheck_output, msleep): goyml_output = ''' machines: '0': agent-state: started agent-version: 999.999.999 dns-name: juju-xx-xx-xx-xx.compute.cloudprovider.tld instance-id: j-xxxxxx series: world services: {}''' pyyml_output = ''' machines: 0: agent-state: running instance-state: exists dns-name: juju-xx-xx-xx-xx.compute.cloudprovider.tld instance-id: j-xxxxxx series: world services: {}''' gostatus_output = yaml.safe_load(goyml_output) pystatus_output = yaml.safe_load(pyyml_output) mock_status.side_effect = [None, gostatus_output, pystatus_output] juju_env = 'test-env' expected_cmd = ['juju', 'bootstrap', '-e', juju_env] args = Arguments(tests='dummy', upload_tools=False, constraints=False) with cd('tests_functional/charms/test/'): c = juju_test.Conductor(args) c.juju_version = juju_test.JujuVersion(major=1, minor=8, patch=0) c.bootstrap(juju_env) mcheck_output.assert_called_once_with(expected_cmd, env=c.env) # Cover python as well. mcheck_output.reset_mock() juju_env = 'test-env' expected_cmd = ['juju', 'bootstrap', '-e', juju_env] args = Arguments(tests='dummy', upload_tools=False, constraints=False) c = juju_test.Conductor(args) c.juju_version = juju_test.JujuVersion(major=0, minor=8, patch=0) c.bootstrap(juju_env) mcheck_output.assert_called_once_with(expected_cmd, env=c.env)
def test_orchestra_archive_logs_rsync_fails(self, mstatus, rsync): from subprocess import CalledProcessError mstatus.return_value = { 'services': { 'dummy': { 'units': { 'dummy/0': { 'machine': '1' } } } }, 'machines': {} } args = Arguments(tests='dummy', juju_env='testing', logdir='/tmp') with cd('tests_functional/charms/test/'): c = juju_test.Conductor(args) c.juju_version = juju_test.JujuVersion(major=1, minor=7, patch=0) o = juju_test.Orchestra(c, 'test/dummy') o.log.warn = MagicMock() o.build_env() rsync.side_effect = CalledProcessError('err', 'err', 'err') o.archive_logs() expected_warns = [ call('Failed to fetch logs for bootstrap node'), call('Failed to grab logs for dummy/0') ] o.log.warn.assert_has_calls(expected_warns)
def test_conductor_bootstrap_error(self, mcheck_output): from subprocess import CalledProcessError mcheck_output.side_effect = CalledProcessError('err', 'err', 'err') juju_env = 'bad-env' args = Arguments(tests='dummy', upload_tools=True, constraints=False) c = juju_test.Conductor(args) c.juju_version = juju_test.JujuVersion(major=1, minor=8, patch=0) self.assertRaises(juju_test.BootstrapError, c.bootstrap, juju_env)
def test_conductor_bootstrap_go_opts(self, mstatus, mcheck_output, msleep): goyml_output = ''' machines: '0': agent-state: started agent-version: 999.999.999 dns-name: juju-xx-xx-xx-xx.compute.cloudprovider.tld instance-id: j-xxxxxx series: world services: {}''' gostatus_output = yaml.safe_load(goyml_output) mstatus.return_value = gostatus_output juju_env = 'test-env' expected_cmd = ['juju', 'bootstrap', '--upload-tools', '-e', juju_env] args = Arguments(tests='dummy', upload_tools=True, constraints=False) with cd('tests_functional/charms/test/'): c = juju_test.Conductor(args) c.juju_version = juju_test.JujuVersion(major=1, minor=8, patch=0) c.bootstrap(juju_env) mcheck_output.assert_called_once_with(expected_cmd, env=c.env) mcheck_output.reset_mock() const_cmd = [ 'juju', 'bootstrap', '--constraints', 'mem=8G,arch=arm', '-e', juju_env ] args = Arguments(tests='dummy', upload_tools=False, constraints='mem=8G,arch=arm') c = juju_test.Conductor(args) c.juju_version = juju_test.JujuVersion(major=1, minor=8, patch=0) c.bootstrap(juju_env) mcheck_output.assert_called_once_with(const_cmd, env=c.env)
def test_orchestra_rsync_go(self, mstatus, mcheck_call): goyml_output = ''' machines: "0": agent-state: started agent-version: 1.10.0 dns-name: juju-yy-yy-yy-yy.compute.cloudprovider.tld instance-id: j-yyyyyy series: precise "1": agent-state: started agent-version: 1.10.0 dns-name: juju-xx-xx-xx-xx.compute.cloudprovider.tld instance-id: j-xxxxxx series: precise services: dummy: charm: cs:precise/dummy-999 exposed: false units: dummy/0: agent-state: started agent-version: 1.10.0 machine: "1" public-address: juju-xx-xx-xx-xx.compute.cloudprovider.tld''' goyml_parsed = yaml.safe_load(goyml_output) mstatus.return_value = goyml_parsed machine = '1' dns_name = goyml_parsed['machines']['1']['dns-name'] juju_env = 'test' path = '/var/log/./juju/*' logdir = '/tmp/' args = Arguments(tests='dummy', juju_env=juju_env) with cd('tests_functional/charms/test/'): c = juju_test.Conductor(args) c.juju_version = juju_test.JujuVersion(major=1, minor=10, patch=0) o = juju_test.Orchestra(c, 'test/dummy') expected_cmd = [ 'rsync', '-a', '-v', '-z', '-R', '-e', 'ssh', 'ubuntu@%s:%s' % (dns_name, path), logdir ] o.build_env() o.rsync(machine, path, logdir) mcheck_call.assert_called_once_with(expected_cmd, env=o.env)
def test_orchestra_archive_logs_go(self, mstatus, rsync): goyml_output = ''' machines: "0": agent-state: started agent-version: 1.10.0 dns-name: juju-yy-yy-yy-yy.compute.cloudprovider.tld instance-id: j-yyyyyy series: precise "1": agent-state: started agent-version: 1.10.0 dns-name: juju-xx-xx-xx-xx.compute.cloudprovider.tld instance-id: j-xxxxxx series: precise services: dummy: charm: cs:precise/dummy-999 exposed: false units: dummy/0: agent-state: started agent-version: 1.10.0 machine: "1" public-address: juju-xx-xx-xx-xx.compute.cloudprovider.tld''' goyml_parsed = yaml.safe_load(goyml_output) mstatus.return_value = goyml_parsed juju_env = 'testing' args = Arguments(tests='dummy', juju_env=juju_env, logdir='/tmp') with cd('tests_functional/charms/test/'): c = juju_test.Conductor(args) c.juju_version = juju_test.JujuVersion(major=1, minor=10, patch=0) o = juju_test.Orchestra(c, 'test/dummy') o.build_env() o.archive_logs() rsync.assert_has_calls([ call(0, '/var/./log/juju/*', os.path.join(args.logdir, 'bootstrap', '')), call('1', '/var/./log/juju/*', os.path.join(args.logdir, 'dummy', '')) ])
def test_orchestra_rsync_py(self, mcheck_call): machine = 0 juju_env = 'test' path = '/var/log/./juju/*' logdir = '/tmp/' args = Arguments(tests='dummy', juju_env=juju_env) c = juju_test.Conductor(args) c.juju_version = juju_test.JujuVersion(major=0, minor=8, patch=2) o = juju_test.Orchestra(c, 'test/dummy') expected_cmd = [ 'rsync', '-a', '-v', '-z', '-R', '-e', 'juju ssh -e %s' % juju_env, '%s:%s' % (machine, path), logdir ] o.build_env() o.rsync(machine, path, logdir) mcheck_call.assert_called_once_with(expected_cmd, env=o.env)
def test_orchestra_archive_logs_py(self, mstatus, rsync): pyyml_output = ''' machines: 0: agent-state: running dns-name: juju-yy-yy-yy-yy.compute.cloudprovider.tld instance-id: i-yyyyyy instance-state: running 1: agent-state: running dns-name: juju-xx-xx-xx-xx.compute.cloudprovider.tld instance-id: i-xxxxxx instance-state: running services: dummy: charm: cs:precise/dummy-19 relations: {} units: dummy/0: agent-state: started machine: 1 public-address: juju-xx-xx-xx-xx.compute.cloudprovider.tld''' pyyml_parsed = yaml.safe_load(pyyml_output) mstatus.return_value = pyyml_parsed juju_env = 'testing' args = Arguments(tests='dummy', juju_env=juju_env, logdir='/tmp') with cd('tests_functional/charms/test/'): c = juju_test.Conductor(args) c.juju_version = juju_test.JujuVersion(major=0, minor=7, patch=0) o = juju_test.Orchestra(c, 'test/dummy') o.build_env() o.archive_logs() rsync.assert_has_calls([ call(0, '/var/./log/juju/*', os.path.join(args.logdir, 'bootstrap', '')), call(1, '/var/./log/juju/*', os.path.join(args.logdir, 'dummy', '')), call(1, '/var/lib/juju/units/./*/charm.log', os.path.join(args.logdir, 'dummy', '')) ])
def test_conductor_bootstrap_unreliable(self, mock_status, mtimeout, mcheck_output): goyml_output = ''' machines: '0': agent-state: pending agent-version: 999.999.999 dns-name: juju-xx-xx-xx-xx.compute.cloudprovider.tld instance-id: j-xxxxxx series: world services: {}''' gostatus_output = yaml.safe_load(goyml_output) mtimeout.side_effect = juju_test.TimeoutError mock_status.return_value = gostatus_output jenv = 'test-env' args = Arguments(tests='dummy', upload_tools=False, constraints=False) c = juju_test.Conductor(args) c.juju_version = juju_test.JujuVersion(major=1, minor=8, patch=0) self.assertRaises(juju_test.BootstrapUnreliable, c.bootstrap, jenv, 1)