def setUp(self):
        CONF.set_override('api_port', 31337, 'VROUTER')
        CONF.set_override('api_public_key', 'public-key', 'VROUTER')
        CONF.set_override('api_private_key', 'private-key', 'VROUTER')
        CONF.set_override('tenant', 'fake-tenant-id', 'VROUTER')
        CONF.set_override('tenant_admin_name', 'admin', 'VROUTER')
        CONF.set_override('tenant_admin_password', 'password', 'VROUTER')
        CONF.set_override('keystone_url', 'http://keystone.com/v2', 'VROUTER')
        CONF.set_override('image_id', 'fake-image-id', 'VROUTER')
        CONF.set_override('flavor', 1234, 'VROUTER')
        CONF.set_override('management_network_id', 'fake-net-id', 'VROUTER')
        CONF.set_override('management_network_cidr', '10.0.0.0/24', 'VROUTER')

        self.driver = VyattaVRouterDriver()
        self.novaclient_cls = self._mock('novaclient.v1_1.client.Client')
        self.novaclient = self.novaclient_cls.return_value
        self.httpconn_cls = self._mock('httplib.HTTPConnection')
        self.httpconn = self.httpconn_cls.return_value

        self.time = self._mock('time.time')
        self.time.return_value = 1
        self.sleep = self._mock('eventlet.greenthread.sleep')

        super(VrouterDriverTestCase, self).setUp()
class VrouterDriverTestCase(base.BaseTestCase):
    """Vyatta vRouter driver test case."""

    def setUp(self):
        CONF.set_override('api_port', 31337, 'VROUTER')
        CONF.set_override('api_public_key', 'public-key', 'VROUTER')
        CONF.set_override('api_private_key', 'private-key', 'VROUTER')
        CONF.set_override('tenant', 'fake-tenant-id', 'VROUTER')
        CONF.set_override('tenant_admin_name', 'admin', 'VROUTER')
        CONF.set_override('tenant_admin_password', 'password', 'VROUTER')
        CONF.set_override('keystone_url', 'http://keystone.com/v2', 'VROUTER')
        CONF.set_override('image_id', 'fake-image-id', 'VROUTER')
        CONF.set_override('flavor', 1234, 'VROUTER')
        CONF.set_override('management_network_id', 'fake-net-id', 'VROUTER')
        CONF.set_override('management_network_cidr', '10.0.0.0/24', 'VROUTER')

        self.driver = VyattaVRouterDriver()
        self.novaclient_cls = self._mock('novaclient.v1_1.client.Client')
        self.novaclient = self.novaclient_cls.return_value
        self.httpconn_cls = self._mock('httplib.HTTPConnection')
        self.httpconn = self.httpconn_cls.return_value

        self.time = self._mock('time.time')
        self.time.return_value = 1
        self.sleep = self._mock('eventlet.greenthread.sleep')

        super(VrouterDriverTestCase, self).setUp()

    def _check_novaclient(self):
        self.novaclient_cls.assert_called_with('admin', 'password', None,
                                               'http://keystone.com/v2',
                                               service_type='compute',
                                               tenant_id='fake-tenant-id')

    @contextlib.contextmanager
    def _check_check_instance(self, address, status=401):
        response = mock.MagicMock()
        response.status = status
        self.httpconn.getresponse.return_value = response
        yield
        if self.httpconn_cls.mock_calls:
            self.httpconn_cls.assert_called_with(address, 31337)

    @contextlib.contextmanager
    def _check_init(self, instance_state='ACTIVE', num_ifaces=1, num_ips=1):
        server = mock.MagicMock()
        server.id = 'inst-id'
        server.status = instance_state
        self.novaclient.servers.create.return_value = server
        self.novaclient.servers.get.return_value = server

        interface = mock.MagicMock()
        fixed_ip = dict(ip_address='10.0.0.1')
        interface.fixed_ips = [fixed_ip] * num_ips
        server.interface_list.return_value = [interface] * num_ifaces

        with self._check_check_instance(fixed_ip['ip_address']):
            yield

        self.novaclient.servers.create.assert_called_once_with(
            mock.ANY, 'fake-image-id', 1234, nics=[{'net-id': 'fake-net-id'}])
        if self.novaclient.servers.get.mock_calls:
            self.novaclient.servers.get.assert_called_with('inst-id')

    def _mock(self, function):
        patcher = mock.patch(function)
        self.addCleanup(patcher.stop)
        return patcher.start()

    def test_resource_stop_resource(self):
        resource = make_resource(instance_id='inst-id')
        self.driver.stop(resource)
        self._check_novaclient()
        self.novaclient.servers.delete.assert_called_once_with('inst-id')

    def test_check(self):
        resource = make_resource(address='10.0.0.1')
        with self._check_check_instance(resource['address']):
            self.driver.check(resource)

    def test_check_fail_invalid_ip1(self):
        resource = make_resource(address='10.0.1.1')
        self.assertRaises(
            exceptions.ResourceCheckFailed, self.driver.check, resource)

    def test_check_fail_invalid_ip2(self):
        resource = make_resource(address='chubaca')
        self.assertRaises(
            exceptions.ResourceCheckFailed, self.driver.check, resource)

    def test_check_fail_not_connected(self):
        resource = make_resource()
        with self._check_check_instance(resource['address']):
            self.httpconn_cls.return_value = None
            self.assertRaises(
                exceptions.ResourceCheckFailed, self.driver.check, resource)

    def test_check_fail_socket_timeout(self):
        resource = make_resource()
        with self._check_check_instance(resource['address']):
            self.httpconn.getresponse.side_effect = socket.timeout()
            self.assertRaises(
                exceptions.ResourceCheckFailed, self.driver.check, resource)

    def test_check_fail_socket_error(self):
        resource = make_resource()
        with self._check_check_instance(resource['address']):
            self.httpconn.getresponse.side_effect = socket.error()
            self.assertRaises(
                exceptions.ResourceCheckFailed, self.driver.check, resource)

    def test_check_non_started(self):
        resource = make_resource(state=resources.STATE_ERROR)
        self.httpconn_cls.side_effect = AssertionError(
            "Shouldn't check resources in error state.")
        self.driver.check(resource)

    def test_init(self):
        resource = make_resource(state=resources.STATE_STOPPED, address=None,
                                 instance_id=None)
        with self._check_init():
            self.driver.init(resource)

    def test_init_instance_error_state(self):
        resource = make_resource(state=resources.STATE_STOPPED, address=None,
                                 instance_id=None)
        with self._check_init(instance_state='ERROR'):
            self.assertRaises(
                exceptions.DriverException, self.driver.init, resource)

    def test_init_initial_get_raises(self):
        resource = make_resource(state=resources.STATE_STOPPED, address=None,
                                 instance_id=None)
        with self._check_init():
            server = self.novaclient.servers.create.return_value
            self.novaclient.servers.get.side_effect = [RuntimeError(), server]
            self.driver.init(resource)

    def test_init_too_much_interfaces(self):
        resource = make_resource(state=resources.STATE_STOPPED, address=None,
                                 instance_id=None)
        with self._check_init(num_ifaces=2):
            self.assertRaises(
                exceptions.DriverException, self.driver.init, resource)

    def test_init_too_much_ips(self):
        resource = make_resource(state=resources.STATE_STOPPED, address=None,
                                 instance_id=None)
        with self._check_init(num_ips=2):
            self.assertRaises(
                exceptions.DriverException, self.driver.init, resource)

    def test_init_two_get_instance_calls(self):
        resource = make_resource(state=resources.STATE_STOPPED, address=None,
                                 instance_id=None)
        with self._check_init():
            server = self.novaclient.servers.create.return_value
            spawning_server = mock.MagicMock()
            spawning_server.status = 'BUILD'
            self.novaclient.servers.get.side_effect = [spawning_server, server]
            self.httpconn = mock.MagicMock()
            self.httpconn_cls.side_effect = [None, self.httpconn]
            self.driver.init(resource)

    def test_init_nova_timeout(self):
        resource = make_resource(state=resources.STATE_STOPPED, address=None,
                                 instance_id=None)
        with self._check_init(instance_state='BUILD'):
            self.time.side_effect = [1, 1 << 31]
            self.assertRaises(
                exceptions.DriverException, self.driver.init, resource)

    def test_makes_100_coverage(self):
        self.driver.wipe(None)