def setUp(self, *args, **kwargs):
     super(OrchestrateTests, self).setUp(*args, **kwargs)
     self.do = DeploymentOrchestrator('somehost', 10000)
class OrchestrateTests(unittest.TestCase):
    def setUp(self, *args, **kwargs):
        super(OrchestrateTests, self).setUp(*args, **kwargs)
        self.do = DeploymentOrchestrator('somehost', 10000)

    def test_local_version(self):
        open_mock = mock.mock_open(read_data='\n54\n')
        with mock.patch('__builtin__.open', open_mock):
            self.do.local_version()

            self.assertEquals(self.do.local_version(), '54')

    def test_local_version_enoent(self):
        with mock.patch('__builtin__.open') as open_mock:
            enoent = IOError()
            enoent.errno = errno.ENOENT
            open_mock.side_effect = enoent

            self.do.local_version()

            self.assertEquals(self.do.local_version(), '')

    def test_local_version_other_ioerror(self):
        with mock.patch('__builtin__.open') as open_mock:
            eperm = IOError()
            eperm.errno = errno.EPERM
            open_mock.side_effect = eperm

            self.assertRaises(IOError, self.do.local_version)

    def test_local_version_set(self):
        open_mock = mock.mock_open()
        with mock.patch('__builtin__.open', open_mock):
            version = 'abc123'
            self.assertEquals(self.do.local_version(version), version)
            open_mock().write.assert_called_with(version)

    def test_verify_hosts(self):
        with mock.patch.object(self.do, 'hosts_at_version') as hav:
            hav.return_value = set(['cp1', 'ctrl1', 'st1'])
            self.assertTrue(self.do.verify_hosts('', ['cp1', 'ctrl1', 'st1']))
            self.assertTrue(self.do.verify_hosts('', ['cp1', 'ctrl1']))
            self.assertFalse(self.do.verify_hosts('', ['cp2', 'ctrl1']))

    def test_hosts_at_version_none(self):
        with mock.patch('jiocloud.orchestrate.DeploymentOrchestrator.consul', new_callable=mock.PropertyMock) as consul:
            consul.return_value.kv.find.side_effect = KeyError

            self.assertEquals(self.do.hosts_at_version('foo'), [])

    def test_hosts_at_version_none_but_dir_exists(self):
        with mock.patch.object(self.do, '_consul') as consul:
            consul.return_value.kv.find.return_value = [
                '/running_version/foo/'
                ]
            self.assertEquals(self.do.hosts_at_version('foo'), set([]))

    def test_hosts_at_version(self):
        with mock.patch('jiocloud.orchestrate.DeploymentOrchestrator.consul', new_callable=mock.PropertyMock) as consul:
            consul.return_value.kv.find.return_value = [
                '/running_version/foo/node1',
                '/running_version/foo/node2'
                ]
            self.assertEquals(self.do.hosts_at_version('foo'), set(['node1', 'node2']))
            consul.return_value.kv.find.assert_called_with('/running_version/foo')

    def test_running_versions(self):
        with mock.patch('jiocloud.orchestrate.DeploymentOrchestrator.consul', new_callable=mock.PropertyMock) as consul:
            consul.return_value.kv.find.return_value = [
                '/running_version/v10',
                '/running_version/v11',
                '/running_version/v12'
                ]
            self.assertEquals(self.do.running_versions(),
                              set(['v10', 'v11', 'v12']))

    def test_running_versions_none(self):
        with mock.patch('jiocloud.orchestrate.DeploymentOrchestrator.consul', new_callable=mock.PropertyMock) as consul:
            consul.return_value.kv.find.return_value = [
                '/running_version',
                ]
            self.assertEquals(self.do.running_versions(), set())

    def test_running_versions_none2(self):
        with mock.patch.object(self.do, '_consul') as consul:
            consul.read.side_effect = KeyError
            self.assertEquals(self.do.running_versions(), set())

    def test_get_failures_failing(self):
        with mock.patch('jiocloud.orchestrate.DeploymentOrchestrator.consul', new_callable=mock.PropertyMock) as consul:
            consul.get_value.health.state.return_value = [1,2]
            self.assertTrue(self.do.get_failures())

    def test_get_failures_passing(self):
        with mock.patch('jiocloud.orchestrate.DeploymentOrchestrator.consul', new_callable=mock.PropertyMock) as consul:
            consul.get_value.health.state.return_value = []
            self.assertTrue(self.do.get_failures())


#    def test_update_own_status(self):

    def test_update_own_info(self):
        with nested(mock.patch('jiocloud.orchestrate.DeploymentOrchestrator.consul', new_callable=mock.PropertyMock),
                    mock.patch('time.time')
          ) as (consul, time):
            time.return_value = 12345678

            self.do.update_own_info(hostname='testhost',
                                    version='v13')
            expected_calls = [mock.call('/running_version/v13/testhost',
                                        '12345678')]
            self.assertEquals(consul.return_value.kv.set.call_args_list, expected_calls)

    def test_update_own_info_no_version_noop(self):
        with nested(mock.patch.object(self.do, '_consul'),
                    mock.patch.object(self.do, 'local_version')
                    ) as (consul, local_version):
            local_version.return_value = None

            self.do.update_own_info(hostname='testhost')

            self.assertEquals(consul.write.call_args_list, [])

    def test_update_own_info_defaults_to_local_version(self):
        with nested(mock.patch('jiocloud.orchestrate.DeploymentOrchestrator.consul', new_callable=mock.PropertyMock),
                    mock.patch.object(self.do, 'local_version')
          ) as (consul, local_version):
            local_version.return_value = 'v674'
            self.do.update_own_info(hostname='testhost')
            self.assertEquals(consul.return_value.kv.set.call_args[0][0],
                              '/running_version/v674/testhost')

    def test_ping_succesful(self):
        with mock.patch('jiocloud.orchestrate.DeploymentOrchestrator.consul', new_callable=mock.PropertyMock) as consul:
            consul.return_value.agent.members.return_value = ['foo1', 'foo2']
            self.assertTrue(self.do.ping())

    def test_ping_empty_cluster(self):
        with mock.patch('jiocloud.orchestrate.DeploymentOrchestrator.consul', new_callable=mock.PropertyMock) as consul:
            consul.return_value.agent.members.return_value = []
            self.assertFalse(self.do.ping())

    def test_ping_failed_connection(self):
        with mock.patch('jiocloud.orchestrate.DeploymentOrchestrator.consul', new_callable=mock.PropertyMock) as consul:
            consul.return_value.agent.members.side_effect = IOError
            self.assertFalse(self.do.ping())

    def test_current_version(self):
        with mock.patch('jiocloud.orchestrate.DeploymentOrchestrator.consul', new_callable=mock.PropertyMock) as consul:
            consul.return_value.kv.get.return_value = 'v673 '
            self.assertEquals(self.do.current_version(), 'v673')
            consul.return_value.kv.get.assert_called_with('/current_version')

    def test_pending_update(self):
        with nested(
                mock.patch.object(self.do, 'local_version'),
                mock.patch.object(self.do, 'current_version')
                ) as (local_version, current_version):
            local_version.return_value = 'v123'
            current_version.return_value = 'v123'

            self.assertEquals(self.do.pending_update(),
                              self.do.UP_TO_DATE)

            local_version.return_value = ''
            current_version.return_value = 'v123'

            self.assertEquals(self.do.pending_update(),
                              self.do.UPDATE_AVAILABLE)

            local_version.return_value = 'v1234'
            current_version.return_value = 'v123'

            self.assertEquals(self.do.pending_update(),
                              self.do.UPDATE_AVAILABLE)

            local_version.return_value = 'v123'
            current_version.side_effect = KeyError

            self.assertEquals(self.do.pending_update(),
                              self.do.NO_CLUE)

            local_version.return_value = ''
            current_version.side_effect = KeyError

            self.assertEquals(self.do.pending_update(),
                              self.do.NO_CLUE_BUT_WERE_JUST_GETTING_STARTED)

    def test_trigger_update(self):
        with mock.patch('jiocloud.orchestrate.DeploymentOrchestrator.consul', new_callable=mock.PropertyMock) as consul:
            self.do.trigger_update('v673')

            consul.return_value.kv.set.assert_called_with('/current_version', 'v673')
Exemple #3
0
 def setUp(self, *args, **kwargs):
     super(OrchestrateTests, self).setUp(*args, **kwargs)
     self.do = DeploymentOrchestrator('somehost', 10000)
class OrchestrateTests(unittest.TestCase):
    def setUp(self, *args, **kwargs):
        super(OrchestrateTests, self).setUp(*args, **kwargs)
        self.do = DeploymentOrchestrator('somehost', 10000)

    def test_local_version(self):
        open_mock = mock.mock_open(read_data='\n54\n')
        with mock.patch('__builtin__.open', open_mock):
            self.do.local_version()

            self.assertEquals(self.do.local_version(), '54')

    def test_local_version_enoent(self):
        with mock.patch('__builtin__.open') as open_mock:
            enoent = IOError()
            enoent.errno = errno.ENOENT
            open_mock.side_effect = enoent

            self.do.local_version()

            self.assertEquals(self.do.local_version(), '')

    def test_local_version_other_ioerror(self):
        with mock.patch('__builtin__.open') as open_mock:
            eperm = IOError()
            eperm.errno = errno.EPERM
            open_mock.side_effect = eperm

            self.assertRaises(IOError, self.do.local_version)

    def test_local_version_set(self):
        open_mock = mock.mock_open()
        with mock.patch('__builtin__.open', open_mock):
            version = 'abc123'
            self.assertEquals(self.do.local_version(version), version)
            open_mock().write.assert_called_with(version)

    def test_verify_hosts(self):
        with mock.patch.object(self.do, 'hosts_at_version') as hav:
            hav.return_value = set(['cp1', 'ctrl1', 'st1'])
            self.assertTrue(self.do.verify_hosts('', ['cp1', 'ctrl1', 'st1']))
            self.assertTrue(self.do.verify_hosts('', ['cp1', 'ctrl1']))
            self.assertFalse(self.do.verify_hosts('', ['cp2', 'ctrl1']))

    def test_hosts_at_version_none(self):
        with mock.patch('jiocloud.orchestrate.DeploymentOrchestrator.consul', new_callable=mock.PropertyMock) as consul:
            consul.return_value.kv.find.side_effect = KeyError

            self.assertEquals(self.do.hosts_at_version('foo'), [])

    def test_hosts_at_version_none_but_dir_exists(self):
        with mock.patch.object(self.do, '_consul') as consul:
            consul.kv.find.return_value = [
                '/running_version/foo/'
                ]
            self.assertEquals(self.do.hosts_at_version('foo'), set([]))

    def test_hosts_at_version(self):
        with mock.patch('jiocloud.orchestrate.DeploymentOrchestrator.consul', new_callable=mock.PropertyMock) as consul:
            consul.return_value.kv.find.return_value = [
                '/running_version/foo/node1',
                '/running_version/foo/node2'
                ]
            self.assertEquals(self.do.hosts_at_version('foo'), set(['node1', 'node2']))
            consul.return_value.kv.find.assert_called_with('/running_version/foo')

    def test_running_versions(self):
        with mock.patch('jiocloud.orchestrate.DeploymentOrchestrator.consul', new_callable=mock.PropertyMock) as consul:
            consul.return_value.kv.find.return_value = [
                'running_version/v10',
                'running_version/v11',
                'running_version/v12'
                ]
            self.assertEquals(self.do.running_versions(),
                              set(['v10', 'v11', 'v12']))

    def test_running_versions_none(self):
        with mock.patch('jiocloud.orchestrate.DeploymentOrchestrator.consul', new_callable=mock.PropertyMock) as consul:
            consul.return_value.kv.find.return_value = [
                'running_version',
                ]
            self.assertEquals(self.do.running_versions(), set())

    def test_running_versions_none2(self):
        with mock.patch.object(self.do, '_consul') as consul:
            consul.kv.find.side_effect = KeyError
            self.assertEquals(self.do.running_versions(), set())

    def test_get_failures_failing(self):
        #Test warnings
        def get_warnings(state):
            if state in ['warning']:
                return [{"Name":"puppet"}]
            else:
                return []
        with mock.patch('jiocloud.orchestrate.DeploymentOrchestrator.consul', new_callable=mock.PropertyMock):
            self.do.consul.health.state.side_effect = get_warnings
            self.assertFalse(self.do.get_failures())
        #Test critical failures
        def get_critical_failures(state):
            if state in ['critical']:
                return [{"Name":"Failure"}]
            else:
                return []
        with mock.patch('jiocloud.orchestrate.DeploymentOrchestrator.consul', new_callable=mock.PropertyMock):
            self.do.consul.health.state.side_effect = get_critical_failures
            self.assertFalse(self.do.get_failures())

    def test_get_failures_passing(self):
        with mock.patch('jiocloud.orchestrate.DeploymentOrchestrator.consul', new_callable=mock.PropertyMock):
            self.do.consul.health.state.return_value = []
            self.assertTrue(self.do.get_failures())


#    def test_update_own_status(self):

    def test_update_own_info(self):
        with nested(mock.patch('jiocloud.orchestrate.DeploymentOrchestrator.consul', new_callable=mock.PropertyMock),
                    mock.patch('time.time')
          ) as (consul, time):
            time.return_value = 12345678
            new_version = 'v14'
            old_version = 'v13'
            hostname = 'testhost'
            consul.return_value.kv.find.return_value = [
                'running_version/%s/%s' %(old_version, hostname),
                ]

            self.do.update_own_info(hostname=hostname,
                                    version=new_version)
            expected_calls = [mock.call('/running_version/%s/%s' %(new_version, hostname),
                                        '12345678')]
            self.assertEquals(consul.return_value.kv.set.call_args_list, expected_calls)
            expected_calls = [mock.call('running_version/%s/%s' %(old_version, hostname))]            
            self.assertEquals(consul.return_value.kv.__delitem__.call_args_list, expected_calls)

    def test_update_own_info_no_version_noop(self):
        with nested(mock.patch.object(self.do, '_consul'),
                    mock.patch.object(self.do, 'local_version')
                    ) as (consul, local_version):
            local_version.return_value = None

            self.do.update_own_info(hostname='testhost')

            self.assertEquals(consul.write.call_args_list, [])

    def test_update_own_info_defaults_to_local_version(self):
        with nested(mock.patch('jiocloud.orchestrate.DeploymentOrchestrator.consul', new_callable=mock.PropertyMock),
                    mock.patch.object(self.do, 'local_version')
          ) as (consul, local_version):
            local_version.return_value = 'v674'
            self.do.update_own_info(hostname='testhost')
            self.assertEquals(consul.return_value.kv.set.call_args[0][0],
                              '/running_version/v674/testhost')

    def test_ping_succesful(self):
        with mock.patch('jiocloud.orchestrate.DeploymentOrchestrator.consul', new_callable=mock.PropertyMock) as consul:
            consul.return_value.agent.members.return_value = ['foo1', 'foo2']
            self.assertTrue(self.do.ping())

    def test_ping_empty_cluster(self):
        with mock.patch('jiocloud.orchestrate.DeploymentOrchestrator.consul', new_callable=mock.PropertyMock) as consul:
            consul.return_value.agent.members.return_value = []
            self.assertFalse(self.do.ping())

    def test_ping_failed_connection(self):
        with mock.patch('jiocloud.orchestrate.DeploymentOrchestrator.consul', new_callable=mock.PropertyMock) as consul:
            consul.return_value.agent.members.side_effect = IOError
            self.assertFalse(self.do.ping())

    def test_current_version(self):
        with mock.patch('jiocloud.orchestrate.DeploymentOrchestrator.consul', new_callable=mock.PropertyMock) as consul:
            consul.return_value.kv.get.return_value = 'v673 '
            self.assertEquals(self.do.current_version(), 'v673')
            consul.return_value.kv.get.assert_called_with('/current_version')

    def test_manage_config(self):
        # test with bad data
        self.assertFalse(self.do.manage_config('bad_type', None, None, None))
        self.assertFalse(self.do.manage_config('state', 'bad_value', None, None))
        self.assertFalse(self.do.manage_config('state', 'role', 'data', None))
        with mock.patch('jiocloud.orchestrate.DeploymentOrchestrator.consul', new_callable=mock.PropertyMock) as consul:
            self.assertEquals(self.do.manage_config('state', 'global', 'key=value', None), 'value')
            consul.return_value.kv.set.assert_called_with('/config_state/global/key', 'value')

    def test_lookup_ordered_data(self):
        with mock.patch('jiocloud.orchestrate.DeploymentOrchestrator.consul', new_callable=mock.PropertyMock) as consul:
            consul.return_value.kv.find.return_value = dict({'key':'v673'})
            self.assertEquals(self.do.lookup_ordered_data('config_version', 'host1'), {'key':'v673'})
            consul.return_value.kv.find.assert_called_with('/config_version/host/host1/')

    def test_get_lookup_hash_from_hostname(self):
        self.assertEqual(self.do.get_lookup_hash_from_hostname('host12'), [['global', ''], ['role', '/host'], ['host', '/host12']])

    def test_check_puppet(self):
        with mock.patch('jiocloud.orchestrate.DeploymentOrchestrator.consul', new_callable=mock.PropertyMock) as consul:
            consul.return_value.kv.find.return_value = dict({'enable_puppet':True})
            self.assertEquals(self.do.check_puppet('node1.jiocloud.com'), 0)
            consul.return_value.kv.find.return_value = dict({'enable_puppet':False})
            self.assertEquals(self.do.check_puppet('node1.jiocloud.com'), 9)
            consul.return_value.kv.find.assert_called_with('/config_state/host/node1.jiocloud.com/')

    def test_enable_puppet(self):
        with mock.patch('jiocloud.orchestrate.DeploymentOrchestrator.consul', new_callable=mock.PropertyMock) as consul:
            consul.return_value.kv.find.return_value = dict({'enable_update':True})
            self.assertEquals(self.do.enable_puppet('True', 'global', None,'set'), 'True')
            consul.return_value.kv.set.assert_called_with('/config_state/global/enable_puppet','True')
            self.assertEquals(self.do.enable_puppet('False', 'host', 'node1.jiocloud.com','set'), 'False')
            consul.return_value.kv.set.assert_called_with('/config_state/host/node1.jiocloud.com/enable_puppet','False')
            self.assertEquals(self.do.enable_puppet('False', 'role', 'cp','set'), 'False')
            consul.return_value.kv.set.assert_called_with('/config_state/role/cp/enable_puppet','False')
            self.assertEquals(self.do.enable_puppet('False', 'role', 'cp','delete'), 'False')
            consul.return_value.kv.__delitem__.assert_called_with('/config_state/role/cp/enable_puppet')

    def test_check_config(self):
        with mock.patch('jiocloud.orchestrate.DeploymentOrchestrator.consul', new_callable=mock.PropertyMock) as consul:
            consul.return_value.kv.find.return_value = dict({'enable_update':True})
            self.assertEquals(self.do.check_config('enable_update', 'global', None), {'enable_update': True})
            consul.return_value.kv.find.assert_called_with('/config_state/global/enable_update')

    def test_set_config(self):
        with mock.patch('jiocloud.orchestrate.DeploymentOrchestrator.consul', new_callable=mock.PropertyMock) as consul:
            consul.return_value.kv.find.return_value = dict({'enable_update':True})
            self.assertEquals(self.do.set_config('enable_update=False', 'host', 'node1.jiocloud.com'), 'False')
            consul.return_value.kv.set.assert_called_with('/config_state/host/node1.jiocloud.com/enable_update','False')
            self.assertEquals(self.do.set_config('enable_update=False', 'host', 'node1.jiocloud.com','state','delete'), 'False')
            consul.return_value.kv.__delitem__.assert_called_with('/config_state/host/node1.jiocloud.com/enable_update')

    def test_pending_update(self):
        with nested(
                mock.patch.object(self.do, 'local_version'),
                mock.patch.object(self.do, 'current_version')
                ) as (local_version, current_version):
            local_version.return_value = 'v123'
            current_version.return_value = 'v123'

            self.assertEquals(self.do.pending_update(),
                              self.do.UP_TO_DATE)

            local_version.return_value = ''
            current_version.return_value = 'v123'

            self.assertEquals(self.do.pending_update(),
                              self.do.UPDATE_AVAILABLE)

            local_version.return_value = 'v1234'
            current_version.return_value = 'v123'

            self.assertEquals(self.do.pending_update(),
                              self.do.UPDATE_AVAILABLE)

            local_version.return_value = 'v123'
            current_version.side_effect = KeyError

            self.assertEquals(self.do.pending_update(),
                              self.do.NO_CLUE)

            local_version.return_value = ''
            current_version.side_effect = KeyError

            self.assertEquals(self.do.pending_update(),
                              self.do.NO_CLUE_BUT_WERE_JUST_GETTING_STARTED)

    def test_trigger_update(self):
        with mock.patch('jiocloud.orchestrate.DeploymentOrchestrator.consul', new_callable=mock.PropertyMock) as consul:
            self.do.trigger_update('v673')

            consul.return_value.kv.set.assert_called_with('/current_version', 'v673')
Exemple #5
0
class OrchestrateTests(unittest.TestCase):
    def setUp(self, *args, **kwargs):
        super(OrchestrateTests, self).setUp(*args, **kwargs)
        self.do = DeploymentOrchestrator('somehost', 10000)

    def test_local_version(self):
        open_mock = mock.mock_open(read_data='\n54\n')
        with mock.patch('__builtin__.open', open_mock):
            self.do.local_version()

            self.assertEquals(self.do.local_version(), '54')

    def test_local_version_enoent(self):
        with mock.patch('__builtin__.open') as open_mock:
            enoent = IOError()
            enoent.errno = errno.ENOENT
            open_mock.side_effect = enoent

            self.do.local_version()

            self.assertEquals(self.do.local_version(), '')

    def test_local_version_other_ioerror(self):
        with mock.patch('__builtin__.open') as open_mock:
            eperm = IOError()
            eperm.errno = errno.EPERM
            open_mock.side_effect = eperm

            self.assertRaises(IOError, self.do.local_version)

    def test_local_version_set(self):
        open_mock = mock.mock_open()
        with mock.patch('__builtin__.open', open_mock):
            version = 'abc123'
            self.assertEquals(self.do.local_version(version), version)
            open_mock().write.assert_called_with(version)

    def test_verify_hosts(self):
        with mock.patch.object(self.do, 'hosts_at_version') as hav:
            hav.return_value = set(['cp1', 'ctrl1', 'st1'])
            self.assertTrue(self.do.verify_hosts('', ['cp1', 'ctrl1', 'st1']))
            self.assertTrue(self.do.verify_hosts('', ['cp1', 'ctrl1']))
            self.assertFalse(self.do.verify_hosts('', ['cp2', 'ctrl1']))

    def test_hosts_at_version_none(self):
        with mock.patch('jiocloud.orchestrate.DeploymentOrchestrator.consul',
                        new_callable=mock.PropertyMock) as consul:
            consul.return_value.kv.find.side_effect = KeyError

            self.assertEquals(self.do.hosts_at_version('foo'), [])

    def test_hosts_at_version_none_but_dir_exists(self):
        with mock.patch.object(self.do, '_consul') as consul:
            consul.kv.find.return_value = ['/running_version/foo/']
            self.assertEquals(self.do.hosts_at_version('foo'), set([]))

    def test_hosts_at_version(self):
        with mock.patch('jiocloud.orchestrate.DeploymentOrchestrator.consul',
                        new_callable=mock.PropertyMock) as consul:
            consul.return_value.kv.find.return_value = [
                '/running_version/foo/node1', '/running_version/foo/node2'
            ]
            self.assertEquals(self.do.hosts_at_version('foo'),
                              set(['node1', 'node2']))
            consul.return_value.kv.find.assert_called_with(
                '/running_version/foo')

    def test_running_versions(self):
        with mock.patch('jiocloud.orchestrate.DeploymentOrchestrator.consul',
                        new_callable=mock.PropertyMock) as consul:
            consul.return_value.kv.find.return_value = [
                'running_version/v10', 'running_version/v11',
                'running_version/v12'
            ]
            self.assertEquals(self.do.running_versions(),
                              set(['v10', 'v11', 'v12']))

    def test_running_versions_none(self):
        with mock.patch('jiocloud.orchestrate.DeploymentOrchestrator.consul',
                        new_callable=mock.PropertyMock) as consul:
            consul.return_value.kv.find.return_value = [
                'running_version',
            ]
            self.assertEquals(self.do.running_versions(), set())

    def test_running_versions_none2(self):
        with mock.patch.object(self.do, '_consul') as consul:
            consul.kv.find.side_effect = KeyError
            self.assertEquals(self.do.running_versions(), set())

    def test_get_failures_failing(self):
        #Test warnings
        def get_warnings(state):
            if state in ['warning']:
                return [{"Name": "puppet"}]
            else:
                return []

        with mock.patch('jiocloud.orchestrate.DeploymentOrchestrator.consul',
                        new_callable=mock.PropertyMock):
            self.do.consul.health.state.side_effect = get_warnings
            self.assertFalse(self.do.get_failures())
        #Test critical failures
        def get_critical_failures(state):
            if state in ['critical']:
                return [{"Name": "Failure"}]
            else:
                return []

        with mock.patch('jiocloud.orchestrate.DeploymentOrchestrator.consul',
                        new_callable=mock.PropertyMock):
            self.do.consul.health.state.side_effect = get_critical_failures
            self.assertFalse(self.do.get_failures())

    def test_get_failures_passing(self):
        with mock.patch('jiocloud.orchestrate.DeploymentOrchestrator.consul',
                        new_callable=mock.PropertyMock):
            self.do.consul.health.state.return_value = []
            self.assertTrue(self.do.get_failures())

#    def test_update_own_status(self):

    def test_update_own_info(self):
        with nested(
                mock.patch(
                    'jiocloud.orchestrate.DeploymentOrchestrator.consul',
                    new_callable=mock.PropertyMock),
                mock.patch('time.time')) as (consul, time):
            time.return_value = 12345678
            new_version = 'v14'
            old_version = 'v13'
            hostname = 'testhost'
            consul.return_value.kv.find.return_value = [
                'running_version/%s/%s' % (old_version, hostname),
            ]

            self.do.update_own_info(hostname=hostname, version=new_version)
            expected_calls = [
                mock.call('/running_version/%s/%s' % (new_version, hostname),
                          '12345678')
            ]
            self.assertEquals(consul.return_value.kv.set.call_args_list,
                              expected_calls)
            expected_calls = [
                mock.call('running_version/%s/%s' % (old_version, hostname))
            ]
            self.assertEquals(
                consul.return_value.kv.__delitem__.call_args_list,
                expected_calls)

    def test_update_own_info_no_version_noop(self):
        with nested(mock.patch.object(self.do, '_consul'),
                    mock.patch.object(self.do,
                                      'local_version')) as (consul,
                                                            local_version):
            local_version.return_value = None

            self.do.update_own_info(hostname='testhost')

            self.assertEquals(consul.write.call_args_list, [])

    def test_update_own_info_defaults_to_local_version(self):
        with nested(
                mock.patch(
                    'jiocloud.orchestrate.DeploymentOrchestrator.consul',
                    new_callable=mock.PropertyMock),
                mock.patch.object(self.do,
                                  'local_version')) as (consul, local_version):
            local_version.return_value = 'v674'
            self.do.update_own_info(hostname='testhost')
            self.assertEquals(consul.return_value.kv.set.call_args[0][0],
                              '/running_version/v674/testhost')

    def test_ping_succesful(self):
        with mock.patch('jiocloud.orchestrate.DeploymentOrchestrator.consul',
                        new_callable=mock.PropertyMock) as consul:
            consul.return_value.agent.members.return_value = ['foo1', 'foo2']
            self.assertTrue(self.do.ping())

    def test_ping_empty_cluster(self):
        with mock.patch('jiocloud.orchestrate.DeploymentOrchestrator.consul',
                        new_callable=mock.PropertyMock) as consul:
            consul.return_value.agent.members.return_value = []
            self.assertFalse(self.do.ping())

    def test_ping_failed_connection(self):
        with mock.patch('jiocloud.orchestrate.DeploymentOrchestrator.consul',
                        new_callable=mock.PropertyMock) as consul:
            consul.return_value.agent.members.side_effect = IOError
            self.assertFalse(self.do.ping())

    def test_current_version(self):
        with mock.patch('jiocloud.orchestrate.DeploymentOrchestrator.consul',
                        new_callable=mock.PropertyMock) as consul:
            consul.return_value.kv.get.return_value = 'v673 '
            self.assertEquals(self.do.current_version(), 'v673')
            consul.return_value.kv.get.assert_called_with('/current_version')

    def test_manage_config(self):
        # test with bad data
        self.assertFalse(self.do.manage_config('bad_type', None, None, None))
        self.assertFalse(
            self.do.manage_config('state', 'bad_value', None, None))
        self.assertFalse(self.do.manage_config('state', 'role', 'data', None))
        with mock.patch('jiocloud.orchestrate.DeploymentOrchestrator.consul',
                        new_callable=mock.PropertyMock) as consul:
            self.assertEquals(
                self.do.manage_config('state', 'global', 'key=value', None),
                'value')
            consul.return_value.kv.set.assert_called_with(
                '/config_state/global/key', 'value')

    def test_lookup_ordered_data(self):
        with mock.patch('jiocloud.orchestrate.DeploymentOrchestrator.consul',
                        new_callable=mock.PropertyMock) as consul:
            consul.return_value.kv.find.return_value = dict({'key': 'v673'})
            self.assertEquals(
                self.do.lookup_ordered_data('config_version', 'host1'),
                {'key': 'v673'})
            consul.return_value.kv.find.assert_called_with(
                '/config_version/host/host1/')

    def test_get_lookup_hash_from_hostname(self):
        self.assertEqual(
            self.do.get_lookup_hash_from_hostname('host12'),
            [['global', ''], ['role', '/host'], ['host', '/host12']])

    def test_check_puppet(self):
        with mock.patch('jiocloud.orchestrate.DeploymentOrchestrator.consul',
                        new_callable=mock.PropertyMock) as consul:
            consul.return_value.kv.find.return_value = dict(
                {'enable_puppet': True})
            self.assertEquals(self.do.check_puppet('node1.jiocloud.com'), 0)
            consul.return_value.kv.find.return_value = dict(
                {'enable_puppet': False})
            self.assertEquals(self.do.check_puppet('node1.jiocloud.com'), 9)
            consul.return_value.kv.find.assert_called_with(
                '/config_state/host/node1.jiocloud.com/')

    def test_enable_puppet(self):
        with mock.patch('jiocloud.orchestrate.DeploymentOrchestrator.consul',
                        new_callable=mock.PropertyMock) as consul:
            consul.return_value.kv.find.return_value = dict(
                {'enable_update': True})
            self.assertEquals(
                self.do.enable_puppet('True', 'global', None, 'set'), 'True')
            consul.return_value.kv.set.assert_called_with(
                '/config_state/global/enable_puppet', 'True')
            self.assertEquals(
                self.do.enable_puppet('False', 'host', 'node1.jiocloud.com',
                                      'set'), 'False')
            consul.return_value.kv.set.assert_called_with(
                '/config_state/host/node1.jiocloud.com/enable_puppet', 'False')
            self.assertEquals(
                self.do.enable_puppet('False', 'role', 'cp', 'set'), 'False')
            consul.return_value.kv.set.assert_called_with(
                '/config_state/role/cp/enable_puppet', 'False')
            self.assertEquals(
                self.do.enable_puppet('False', 'role', 'cp', 'delete'),
                'False')
            consul.return_value.kv.__delitem__.assert_called_with(
                '/config_state/role/cp/enable_puppet')

    def test_check_config(self):
        with mock.patch('jiocloud.orchestrate.DeploymentOrchestrator.consul',
                        new_callable=mock.PropertyMock) as consul:
            consul.return_value.kv.find.return_value = dict(
                {'enable_update': True})
            self.assertEquals(
                self.do.check_config('enable_update', 'global', None),
                {'enable_update': True})
            consul.return_value.kv.find.assert_called_with(
                '/config_state/global/enable_update')

    def test_set_config(self):
        with mock.patch('jiocloud.orchestrate.DeploymentOrchestrator.consul',
                        new_callable=mock.PropertyMock) as consul:
            consul.return_value.kv.find.return_value = dict(
                {'enable_update': True})
            self.assertEquals(
                self.do.set_config('enable_update=False', 'host',
                                   'node1.jiocloud.com'), 'False')
            consul.return_value.kv.set.assert_called_with(
                '/config_state/host/node1.jiocloud.com/enable_update', 'False')
            self.assertEquals(
                self.do.set_config('enable_update=False', 'host',
                                   'node1.jiocloud.com', 'state', 'delete'),
                'False')
            consul.return_value.kv.__delitem__.assert_called_with(
                '/config_state/host/node1.jiocloud.com/enable_update')

    def test_pending_update(self):
        with nested(mock.patch.object(self.do, 'local_version'),
                    mock.patch.object(self.do,
                                      'current_version')) as (local_version,
                                                              current_version):
            local_version.return_value = 'v123'
            current_version.return_value = 'v123'

            self.assertEquals(self.do.pending_update(), self.do.UP_TO_DATE)

            local_version.return_value = ''
            current_version.return_value = 'v123'

            self.assertEquals(self.do.pending_update(),
                              self.do.UPDATE_AVAILABLE)

            local_version.return_value = 'v1234'
            current_version.return_value = 'v123'

            self.assertEquals(self.do.pending_update(),
                              self.do.UPDATE_AVAILABLE)

            local_version.return_value = 'v123'
            current_version.side_effect = KeyError

            self.assertEquals(self.do.pending_update(), self.do.NO_CLUE)

            local_version.return_value = ''
            current_version.side_effect = KeyError

            self.assertEquals(self.do.pending_update(),
                              self.do.NO_CLUE_BUT_WERE_JUST_GETTING_STARTED)

    def test_trigger_update(self):
        with mock.patch('jiocloud.orchestrate.DeploymentOrchestrator.consul',
                        new_callable=mock.PropertyMock) as consul:
            self.do.trigger_update('v673')

            consul.return_value.kv.set.assert_called_with(
                '/current_version', 'v673')