def set_up_backend(self, target=None):
        if not target:
            target = self.get_target_fixture()

        self.backend = InfobloxBackend(target)
        self.backend.start()
        self.backend.infoblox = MagicMock()
    def set_up_backend(self, target=None):
        if not target:
            target = self.get_target_fixture()

        self.backend = InfobloxBackend(target)
        self.backend.start()
        self.backend.infoblox = MagicMock()
class InfobloxBackendTestCase(BackendTestCase):

    def get_zone_fixture(self):
        return super(InfobloxBackendTestCase, self).get_zone_fixture(
            values={
                'name': 'test.example.com.'
            }
        )

    def setUp(self):
        super(InfobloxBackendTestCase, self).setUp()

        self.config(group='backend:infoblox',
                    wapi_url=None,
                    username=None,
                    password=None,
                    ns_group=None)

    def get_target_fixture(self, masters=None, options=None):
        if not masters:
            masters = [{'host': '1.1.1.1', 'port': 53}]

        if not options:
            options = [{'key': 'wapi_url', 'value': 'test'},
                       {'key': 'username', 'value': 'test'},
                       {'key': 'password', 'value': 'test'},
                       {'key': 'ns_group', 'value': 'test'}]

        return objects.PoolTarget.from_dict({
            'id': '4588652b-50e7-46b9-b688-a9bad40a873e',
            'type': 'infoblox',
            'masters': masters,
            'options': options
        })

    def set_up_backend(self, target=None):
        if not target:
            target = self.get_target_fixture()

        self.backend = InfobloxBackend(target)
        self.backend.start()
        self.backend.infoblox = MagicMock()

    def test_create_zone(self):
        self.set_up_backend()
        context = self.get_context()
        zone = self.get_zone_fixture()
        self.backend.infoblox.get_dns_view = MagicMock(return_value='default')
        self.backend.create_zone(context, zone)
        self.backend.infoblox.create_zone_auth.assert_called_once_with(
                                fqdn='test.example.com',
                                dns_view='default')

    def test_update_zone(self):
        self.set_up_backend()
        context = self.get_context()
        zone = objects.Zone().from_dict(self.get_zone_fixture())
        self.backend.update_zone(context, zone)

    def test_delete_zone(self):
        self.set_up_backend()
        context = self.get_context()
        zone = self.get_zone_fixture()
        self.backend.create_zone(context, zone)
        self.backend.delete_zone(context, zone)
        self.backend.infoblox.delete_zone_auth.assert_called_once_with(
                                'test.example.com')

    def test_missing_wapi_url(self):
        options = [{'key': 'username', 'value': 'test'},
                   {'key': 'password', 'value': 'test'},
                   {'key': 'ns_group', 'value': 'test'}]

        target = self.get_target_fixture(options=options)
        six.assertRaisesRegex(self, ibexceptions.InfobloxIsMisconfigured,
                              "wapi_url",
                              self.set_up_backend, target)

    def test_missing_username(self):
        options = [{'key': 'wapi_url', 'value': 'test'},
                   {'key': 'password', 'value': 'test'},
                   {'key': 'ns_group', 'value': 'test'}]

        target = self.get_target_fixture(options=options)
        six.assertRaisesRegex(self, ibexceptions.InfobloxIsMisconfigured,
                              "username",
                              self.set_up_backend, target)

    def test_missing_password(self):
        options = [{'key': 'wapi_url', 'value': 'test'},
                   {'key': 'username', 'value': 'test'},
                   {'key': 'ns_group', 'value': 'test'}]

        target = self.get_target_fixture(options=options)
        six.assertRaisesRegex(self, ibexceptions.InfobloxIsMisconfigured,
                              "password",
                              self.set_up_backend, target)

    def test_missing_ns_group(self):
        options = [{'key': 'wapi_url', 'value': 'test'},
                   {'key': 'username', 'value': 'test'},
                   {'key': 'password', 'value': 'test'}]

        target = self.get_target_fixture(options=options)
        six.assertRaisesRegex(self, ibexceptions.InfobloxIsMisconfigured,
                              "ns_group",
                              self.set_up_backend, target)

    def test_wrong_port(self):
        masters = [{'host': '1.1.1.1', 'port': 100}]
        target = self.get_target_fixture(masters=masters)
        six.assertRaisesRegex(self, ConfigurationError,
                              "port 53",
                              self.set_up_backend, target)
class InfobloxBackendTestCase(BackendTestCase):
    def get_zone_fixture(self):
        return super(
            InfobloxBackendTestCase,
            self).get_zone_fixture(values={'name': 'test.example.com.'})

    def setUp(self):
        super(InfobloxBackendTestCase, self).setUp()

        self.config(group='backend:infoblox',
                    wapi_url=None,
                    username=None,
                    password=None,
                    ns_group=None)

    def get_target_fixture(self, masters=None, options=None):
        if not masters:
            masters = [{'host': '1.1.1.1', 'port': 53}]

        if not options:
            options = [{
                'key': 'wapi_url',
                'value': 'test'
            }, {
                'key': 'username',
                'value': 'test'
            }, {
                'key': 'password',
                'value': 'test'
            }, {
                'key': 'ns_group',
                'value': 'test'
            }]

        return objects.PoolTarget.from_dict({
            'id': '4588652b-50e7-46b9-b688-a9bad40a873e',
            'type': 'infoblox',
            'masters': masters,
            'options': options
        })

    def set_up_backend(self, target=None):
        if not target:
            target = self.get_target_fixture()

        self.backend = InfobloxBackend(target)
        self.backend.start()
        self.backend.infoblox = MagicMock()

    def test_create_zone(self):
        self.set_up_backend()
        context = self.get_context()
        zone = self.get_zone_fixture()
        self.backend.infoblox.get_dns_view = MagicMock(return_value='default')
        self.backend.create_zone(context, zone)
        self.backend.infoblox.create_zone_auth.assert_called_once_with(
            fqdn='test.example.com', dns_view='default')

    def test_update_zone(self):
        self.set_up_backend()
        context = self.get_context()
        zone = objects.Zone().from_dict(self.get_zone_fixture())
        self.backend.update_zone(context, zone)

    def test_delete_zone(self):
        self.set_up_backend()
        context = self.get_context()
        zone = self.get_zone_fixture()
        self.backend.create_zone(context, zone)
        self.backend.delete_zone(context, zone)
        self.backend.infoblox.delete_zone_auth.assert_called_once_with(
            'test.example.com')

    def test_missing_wapi_url(self):
        options = [{
            'key': 'username',
            'value': 'test'
        }, {
            'key': 'password',
            'value': 'test'
        }, {
            'key': 'ns_group',
            'value': 'test'
        }]

        target = self.get_target_fixture(options=options)
        six.assertRaisesRegex(self, ibexceptions.InfobloxIsMisconfigured,
                              "wapi_url", self.set_up_backend, target)

    def test_missing_username(self):
        options = [{
            'key': 'wapi_url',
            'value': 'test'
        }, {
            'key': 'password',
            'value': 'test'
        }, {
            'key': 'ns_group',
            'value': 'test'
        }]

        target = self.get_target_fixture(options=options)
        six.assertRaisesRegex(self, ibexceptions.InfobloxIsMisconfigured,
                              "username", self.set_up_backend, target)

    def test_missing_password(self):
        options = [{
            'key': 'wapi_url',
            'value': 'test'
        }, {
            'key': 'username',
            'value': 'test'
        }, {
            'key': 'ns_group',
            'value': 'test'
        }]

        target = self.get_target_fixture(options=options)
        six.assertRaisesRegex(self, ibexceptions.InfobloxIsMisconfigured,
                              "password", self.set_up_backend, target)

    def test_missing_ns_group(self):
        options = [{
            'key': 'wapi_url',
            'value': 'test'
        }, {
            'key': 'username',
            'value': 'test'
        }, {
            'key': 'password',
            'value': 'test'
        }]

        target = self.get_target_fixture(options=options)
        six.assertRaisesRegex(self, ibexceptions.InfobloxIsMisconfigured,
                              "ns_group", self.set_up_backend, target)

    def test_wrong_port(self):
        masters = [{'host': '1.1.1.1', 'port': 100}]
        target = self.get_target_fixture(masters=masters)
        six.assertRaisesRegex(self, ConfigurationError, "port 53",
                              self.set_up_backend, target)