272 lines
11 KiB
Python
272 lines
11 KiB
Python
# Copyright 2016 Cloudbase Solutions Srl
|
|
# All Rights Reserved.
|
|
#
|
|
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
|
# not use this file except in compliance with the License. You may obtain
|
|
# a copy of the License at
|
|
#
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
#
|
|
# Unless required by applicable law or agreed to in writing, software
|
|
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
|
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
|
# License for the specific language governing permissions and limitations
|
|
# under the License.
|
|
|
|
from unittest import mock
|
|
|
|
from os_win import constants
|
|
from os_win import exceptions
|
|
from os_win.tests.unit import test_base
|
|
from os_win.utils.dns import dnsutils
|
|
|
|
|
|
class DNSUtilsTestCase(test_base.OsWinBaseTestCase):
|
|
"""Unit tests for the Hyper-V DNSUtils class."""
|
|
|
|
def setUp(self):
|
|
super(DNSUtilsTestCase, self).setUp()
|
|
self._dnsutils = dnsutils.DNSUtils()
|
|
self._dnsutils._dns_manager_attr = mock.MagicMock()
|
|
|
|
@mock.patch.object(dnsutils.DNSUtils, '_get_wmi_obj')
|
|
def test_dns_manager(self, mock_get_wmi_obj):
|
|
self._dnsutils._dns_manager_attr = None
|
|
|
|
self.assertEqual(mock_get_wmi_obj.return_value,
|
|
self._dnsutils._dns_manager)
|
|
|
|
mock_get_wmi_obj.assert_called_once_with(
|
|
self._dnsutils._DNS_NAMESPACE % self._dnsutils._host)
|
|
|
|
@mock.patch.object(dnsutils.DNSUtils, '_get_wmi_obj')
|
|
def test_dns_manager_fail(self, mock_get_wmi_obj):
|
|
self._dnsutils._dns_manager_attr = None
|
|
expected_exception = exceptions.DNSException
|
|
mock_get_wmi_obj.side_effect = expected_exception
|
|
|
|
self.assertRaises(expected_exception,
|
|
lambda: self._dnsutils._dns_manager)
|
|
|
|
mock_get_wmi_obj.assert_called_once_with(
|
|
self._dnsutils._DNS_NAMESPACE % self._dnsutils._host)
|
|
|
|
def test_get_zone(self):
|
|
zone_manager = self._dnsutils._dns_manager.MicrosoftDNS_Zone
|
|
zone_manager.return_value = [mock.sentinel.zone]
|
|
|
|
zone_found = self._dnsutils._get_zone(mock.sentinel.zone_name)
|
|
|
|
zone_manager.assert_called_once_with(Name=mock.sentinel.zone_name)
|
|
self.assertEqual(mock.sentinel.zone, zone_found)
|
|
|
|
def test_get_zone_ignore_missing(self):
|
|
zone_manager = self._dnsutils._dns_manager.MicrosoftDNS_Zone
|
|
zone_manager.return_value = []
|
|
|
|
zone_found = self._dnsutils._get_zone(mock.sentinel.zone_name)
|
|
|
|
zone_manager.assert_called_once_with(Name=mock.sentinel.zone_name)
|
|
self.assertIsNone(zone_found)
|
|
|
|
def test_get_zone_missing(self):
|
|
zone_manager = self._dnsutils._dns_manager.MicrosoftDNS_Zone
|
|
zone_manager.return_value = []
|
|
|
|
self.assertRaises(exceptions.DNSZoneNotFound,
|
|
self._dnsutils._get_zone,
|
|
mock.sentinel.zone_name,
|
|
ignore_missing=False)
|
|
zone_manager.assert_called_once_with(Name=mock.sentinel.zone_name)
|
|
|
|
def test_zone_list(self):
|
|
zone_manager = self._dnsutils._dns_manager.MicrosoftDNS_Zone
|
|
zone_manager.return_value = [mock.Mock(Name=mock.sentinel.fake_name1),
|
|
mock.Mock(Name=mock.sentinel.fake_name2)]
|
|
|
|
zone_list = self._dnsutils.zone_list()
|
|
|
|
expected_zone_list = [mock.sentinel.fake_name1,
|
|
mock.sentinel.fake_name2]
|
|
self.assertEqual(expected_zone_list, zone_list)
|
|
zone_manager.assert_called_once_with()
|
|
|
|
@mock.patch.object(dnsutils.DNSUtils, '_get_zone')
|
|
def test_zone_exists(self, mock_get_zone):
|
|
zone_already_exists = self._dnsutils.zone_exists(
|
|
mock.sentinel.zone_name)
|
|
mock_get_zone.assert_called_once_with(mock.sentinel.zone_name)
|
|
|
|
self.assertTrue(zone_already_exists)
|
|
|
|
@mock.patch.object(dnsutils.DNSUtils, '_get_zone')
|
|
def test_zone_exists_false(self, mock_get_zone):
|
|
mock_get_zone.return_value = None
|
|
|
|
zone_already_exists = self._dnsutils.zone_exists(
|
|
mock.sentinel.zone_name)
|
|
mock_get_zone.assert_called_once_with(mock.sentinel.zone_name)
|
|
|
|
self.assertFalse(zone_already_exists)
|
|
|
|
@mock.patch.object(dnsutils.DNSUtils, '_get_zone')
|
|
def test_get_zone_properties(self, mock_get_zone):
|
|
mock_get_zone.return_value = mock.Mock(
|
|
ZoneType=mock.sentinel.zone_type,
|
|
DsIntegrated=mock.sentinel.ds_integrated,
|
|
DataFile=mock.sentinel.data_file_name,
|
|
MasterServers=[mock.sentinel.ip_addrs])
|
|
|
|
zone_properties = self._dnsutils.get_zone_properties(
|
|
mock.sentinel.zone_name)
|
|
expected_zone_props = {
|
|
'zone_type': mock.sentinel.zone_type,
|
|
'ds_integrated': mock.sentinel.ds_integrated,
|
|
'master_servers': [mock.sentinel.ip_addrs],
|
|
'data_file_name': mock.sentinel.data_file_name
|
|
}
|
|
self.assertEqual(expected_zone_props, zone_properties)
|
|
mock_get_zone.assert_called_once_with(mock.sentinel.zone_name,
|
|
ignore_missing=False)
|
|
|
|
@mock.patch.object(dnsutils.DNSUtils, 'zone_exists')
|
|
def test_zone_create(self, mock_zone_exists):
|
|
mock_zone_exists.return_value = False
|
|
zone_manager = self._dnsutils._dns_manager.MicrosoftDNS_Zone
|
|
zone_manager.CreateZone.return_value = (mock.sentinel.zone_path,)
|
|
|
|
zone_path = self._dnsutils.zone_create(
|
|
zone_name=mock.sentinel.zone_name,
|
|
zone_type=mock.sentinel.zone_type,
|
|
ds_integrated=mock.sentinel.ds_integrated,
|
|
data_file_name=mock.sentinel.data_file_name,
|
|
ip_addrs=mock.sentinel.ip_addrs,
|
|
admin_email_name=mock.sentinel.admin_email_name)
|
|
|
|
zone_manager.CreateZone.assert_called_once_with(
|
|
ZoneName=mock.sentinel.zone_name,
|
|
ZoneType=mock.sentinel.zone_type,
|
|
DsIntegrated=mock.sentinel.ds_integrated,
|
|
DataFileName=mock.sentinel.data_file_name,
|
|
IpAddr=mock.sentinel.ip_addrs,
|
|
AdminEmailname=mock.sentinel.admin_email_name)
|
|
mock_zone_exists.assert_called_once_with(mock.sentinel.zone_name)
|
|
self.assertEqual(mock.sentinel.zone_path, zone_path)
|
|
|
|
@mock.patch.object(dnsutils.DNSUtils, 'zone_exists')
|
|
def test_zone_create_existing_zone(self, mock_zone_exists):
|
|
self.assertRaises(exceptions.DNSZoneAlreadyExists,
|
|
self._dnsutils.zone_create,
|
|
zone_name=mock.sentinel.zone_name,
|
|
zone_type=mock.sentinel.zone_type,
|
|
ds_integrated=mock.sentinel.ds_integrated)
|
|
mock_zone_exists.assert_called_once_with(mock.sentinel.zone_name)
|
|
|
|
@mock.patch.object(dnsutils.DNSUtils, '_get_zone')
|
|
def test_zone_delete(self, mock_get_zone):
|
|
self._dnsutils.zone_delete(mock.sentinel.zone_name)
|
|
|
|
mock_get_zone.assert_called_once_with(mock.sentinel.zone_name)
|
|
mock_get_zone.return_value.Delete_.assert_called_once_with()
|
|
|
|
@mock.patch.object(dnsutils.DNSUtils, '_get_zone')
|
|
def test_zone_modify(self, mock_get_zone):
|
|
mock_zone = mock.MagicMock(
|
|
AllowUpdate=mock.sentinel.allowupdate,
|
|
DisableWINSRecordReplication=mock.sentinel.disablewins,
|
|
Notify=mock.sentinel.notify,
|
|
SecureSecondaries=mock.sentinel.securesecondaries)
|
|
mock_get_zone.return_value = mock_zone
|
|
|
|
self._dnsutils.zone_modify(
|
|
mock.sentinel.zone_name,
|
|
allow_update=None,
|
|
disable_wins=mock.sentinel.disable_wins,
|
|
notify=None,
|
|
reverse=mock.sentinel.reverse,
|
|
secure_secondaries=None)
|
|
|
|
self.assertEqual(mock.sentinel.allowupdate, mock_zone.AllowUpdate)
|
|
self.assertEqual(mock.sentinel.disable_wins,
|
|
mock_zone.DisableWINSRecordReplication)
|
|
self.assertEqual(mock.sentinel.notify, mock_zone.Notify)
|
|
self.assertEqual(mock.sentinel.reverse,
|
|
mock_zone.Reverse)
|
|
self.assertEqual(mock.sentinel.securesecondaries,
|
|
mock_zone.SecureSecondaries)
|
|
mock_zone.put.assert_called_once_with()
|
|
|
|
@mock.patch.object(dnsutils.DNSUtils, '_get_zone')
|
|
def test_zone_update_force_refresh(self, mock_get_zone):
|
|
mock_zone = mock.MagicMock(DsIntegrated=False,
|
|
ZoneType=constants.DNS_ZONE_TYPE_SECONDARY)
|
|
mock_get_zone.return_value = mock_zone
|
|
|
|
self._dnsutils.zone_update(mock.sentinel.zone_name)
|
|
|
|
mock_get_zone.assert_called_once_with(
|
|
mock.sentinel.zone_name,
|
|
ignore_missing=False)
|
|
mock_zone.ForceRefresh.assert_called_once_with()
|
|
|
|
@mock.patch.object(dnsutils.DNSUtils, '_get_zone')
|
|
def test_zone_update_from_ds(self, mock_get_zone):
|
|
mock_zone = mock.MagicMock(DsIntegrated=True,
|
|
ZoneType=constants.DNS_ZONE_TYPE_PRIMARY)
|
|
mock_get_zone.return_value = mock_zone
|
|
|
|
self._dnsutils.zone_update(mock.sentinel.zone_name)
|
|
|
|
mock_get_zone.assert_called_once_with(
|
|
mock.sentinel.zone_name,
|
|
ignore_missing=False)
|
|
mock_zone.UpdateFromDS.assert_called_once_with()
|
|
|
|
@mock.patch.object(dnsutils.DNSUtils, '_get_zone')
|
|
def test_zone_update_reload_zone(self, mock_get_zone):
|
|
mock_zone = mock.MagicMock(DsIntegrated=False,
|
|
ZoneType=constants.DNS_ZONE_TYPE_PRIMARY)
|
|
mock_get_zone.return_value = mock_zone
|
|
|
|
self._dnsutils.zone_update(mock.sentinel.zone_name)
|
|
|
|
mock_get_zone.assert_called_once_with(
|
|
mock.sentinel.zone_name,
|
|
ignore_missing=False)
|
|
mock_zone.ReloadZone.assert_called_once_with()
|
|
|
|
@mock.patch.object(dnsutils.DNSUtils, 'zone_exists')
|
|
def test_get_zone_serial(self, mock_zone_exists):
|
|
mock_zone_exists.return_value = True
|
|
fake_serial_number = 1
|
|
msdns_soatype = self._dnsutils._dns_manager.MicrosoftDNS_SOAType
|
|
msdns_soatype.return_value = [
|
|
mock.Mock(SerialNumber=fake_serial_number)]
|
|
|
|
serial_number = self._dnsutils.get_zone_serial(mock.sentinel.zone_name)
|
|
|
|
expected_serial_number = fake_serial_number
|
|
self.assertEqual(expected_serial_number, serial_number)
|
|
msdns_soatype.assert_called_once_with(
|
|
ContainerName=mock.sentinel.zone_name)
|
|
mock_zone_exists.assert_called_once_with(mock.sentinel.zone_name)
|
|
|
|
@mock.patch.object(dnsutils.DNSUtils, 'zone_exists')
|
|
def test_get_zone_serial_zone_not_found(self, mock_zone_exists):
|
|
mock_zone_exists.return_value = False
|
|
|
|
serial_number = self._dnsutils.get_zone_serial(mock.sentinel.zone_name)
|
|
|
|
self.assertIsNone(serial_number)
|
|
mock_zone_exists.assert_called_once_with(mock.sentinel.zone_name)
|
|
|
|
@mock.patch.object(dnsutils.DNSUtils, 'zone_exists')
|
|
def test_get_zone_serial_zone_soatype_not_found(self, mock_zone_exists):
|
|
mock_zone_exists.return_value = True
|
|
self._dnsutils._dns_manager.MicrosoftDNS_SOAType.return_value = []
|
|
|
|
serial_number = self._dnsutils.get_zone_serial(mock.sentinel.zone_name)
|
|
|
|
self.assertIsNone(serial_number)
|
|
mock_zone_exists.assert_called_once_with(mock.sentinel.zone_name)
|