Exemplo n.º 1
0
class TestConfigurationNetworkForwardMode(CloubedTestCase):

    def setUp(self):
        self._network_item = valid_network_item
        self._loader = MockConfigurationLoader(conf_minimal)
        self.conf = Configuration(self._loader)
        self.network_conf = ConfigurationNetwork(self.conf, self._network_item)

    def test_parse_forward_mode_ok(self):
        """
            ConfigurationNetwork.__parse_forward_mode() should parse valid
            values without errors and set _forward_mode instance attribute
        """
        conf = {}
        self.network_conf._ConfigurationNetwork__parse_forward_mode(conf)
        self.assertEqual(self.network_conf.forward_mode, None)

        conf = {'forward': 'nat'}
        self.network_conf._ConfigurationNetwork__parse_forward_mode(conf)
        self.assertEqual(self.network_conf.forward_mode, 'nat')

        conf = {'forward': 'none'}
        self.network_conf._ConfigurationNetwork__parse_forward_mode(conf)
        self.assertEqual(self.network_conf.forward_mode, None)

    def test_parse_forward_mode_not_str(self):
        """
            ConfigurationNetwork.__parse_forward_mode() should raise a
            CloubedConfigurationException if the format of forward parameter in
            the configuration is not valid
        """

        invalid_confs = [ { 'forward': None },
                          { 'forward': 42 },
                          { 'forward': [] } ]

        for invalid_conf in invalid_confs:
            self.assertRaisesRegexp(
                     CloubedConfigurationException,
                     "Forward parameter format of network {network} is not " \
                     "valid".format(network=self.network_conf.name),
                     self.network_conf._ConfigurationNetwork__parse_forward_mode,
                     invalid_conf)

    def test_parse_forward_mode_not_valid(self):
        """
            ConfigurationNetwork.__parse_forward_mode() should raise a
            CloubedConfigurationException if the forward parameter in the
            configuration is not valid
        """

        invalid_conf = { 'forward': 'unknown' }

        self.assertRaisesRegexp(
                 CloubedConfigurationException,
                 "Forward parameter of network {network} is not valid" \
                     .format(network=self.network_conf.name),
                 self.network_conf._ConfigurationNetwork__parse_forward_mode,
                 invalid_conf)
Exemplo n.º 2
0
class TestConfigurationNetwork(CloubedTestCase):

    def setUp(self):
        self._network_item = valid_network_item
        self._loader = MockConfigurationLoader(conf_minimal)
        self.conf = Configuration(self._loader)
        self.network_conf = ConfigurationNetwork(self.conf, self._network_item)

    def test_get_type(self):
        """
            ConfigurationNetwork._get_type() should return network
        """
        self.assertEqual(self.network_conf._get_type(), 'network')

    def test_get_templates_dict(self):
        """
            ConfigurationNetwork.get_templates_dict() should return a dict
            with all parameters of the network
        """
        self.assertDictContainsSubset(
                 {'network.test_network_name.forward_mode': 'None'},
                 self.network_conf.get_templates_dict())
Exemplo n.º 3
0
 def setUp(self):
     self._network_item = valid_network_item
     self._loader = MockConfigurationLoader(conf_minimal)
     self.conf = Configuration(self._loader)
     self.network_conf = ConfigurationNetwork(self.conf, self._network_item)
Exemplo n.º 4
0
class TestConfigurationNetworkBridgeName(CloubedTestCase):

    def setUp(self):
        self._network_item = valid_network_item
        self._loader = MockConfigurationLoader(conf_minimal)
        self.conf = Configuration(self._loader)
        self.network_conf = ConfigurationNetwork(self.conf, self._network_item)

    def test_parse_bridge_name_ok(self):
        """
            ConfigurationNetwork.__parse_bridge_name() should parse valid
            values without errors and set bridge_name instance attribute
        """

        conf = { 'forward': 'bridge',
                 'bridge': 'test_bridge_name' }

        self.network_conf._ConfigurationNetwork__parse_forward_mode(conf)
        self.network_conf._ConfigurationNetwork__parse_bridge_name(conf)
        self.assertEqual(self.network_conf.bridge_name,
                         'test_bridge_name')

        conf = { 'forward': 'nat' }
        self.network_conf._ConfigurationNetwork__parse_forward_mode(conf)
        self.network_conf._ConfigurationNetwork__parse_bridge_name(conf)
        self.assertEqual(self.network_conf.bridge_name,
                         None)

    def test_parse_bridge_name_wrong_forward(self):
        """
            ConfigurationNetwork.__parse_forward_mode() should raise a
            CloubedConfigurationException if the bridge parameter is defined
            on a network with forward mode != bridge
        """

        invalid_conf = { 'forward': 'nat',
                         'bridge': 'test_bridge_name' }

        self.network_conf._ConfigurationNetwork__parse_forward_mode(invalid_conf)
        self.assertRaisesRegexp(
                 CloubedConfigurationException,
                 "Bridge parameter has no sense on network {network} with " \
                 "forwarding mode nat" \
                     .format(network=self.network_conf.name),
                 self.network_conf._ConfigurationNetwork__parse_bridge_name,
                 invalid_conf)

    def test_parse_bridge_name_missing(self):
        """
            ConfigurationNetwork.__parse_forward_mode() should raise a
            CloubedConfigurationException if the bridge parameter is not defined
            on a network with forward mode == bridge
        """

        invalid_conf = { 'forward': 'bridge' }

        self.network_conf._ConfigurationNetwork__parse_forward_mode(invalid_conf)
        self.assertRaisesRegexp(
                 CloubedConfigurationException,
                 "Bridge parameter is missing on network {network} with " \
                 "bridge forwarding mode" \
                     .format(network=self.network_conf.name),
                 self.network_conf._ConfigurationNetwork__parse_bridge_name,
                 invalid_conf)

    def test_parse_bridge_name_invalid_format(self):
        """
            ConfigurationNetwork.__parse_forward_mode() should raise a
            CloubedConfigurationException if the format bridge parameter is not
            valid
        """

        invalid_confs = [ { 'forward': 'bridge', 'bridge': []   },
                          { 'forward': 'bridge', 'bridge': 42   },
                          { 'forward': 'bridge', 'bridge': None } ]

        for invalid_conf in invalid_confs:
            self.network_conf._ConfigurationNetwork__parse_forward_mode(invalid_conf)
            self.assertRaisesRegexp(
                 CloubedConfigurationException,
                 "Bridge parameter format of network {network} is not valid" \
                     .format(network=self.network_conf.name),
                 self.network_conf._ConfigurationNetwork__parse_bridge_name,
                 invalid_conf)
Exemplo n.º 5
0
class TestConfigurationNetworkPxe(CloubedTestCase):

    def setUp(self):
        self._network_item = valid_network_item
        self._loader = MockConfigurationLoader(conf_minimal)
        self.conf = Configuration(self._loader)
        self.network_conf = ConfigurationNetwork(self.conf, self._network_item)

    def test_parse_pxe_ok(self):
        """
            ConfigurationNetwork.__parse_pxe() should parse valid values
            without errors and set pxe_tftp_dir and pxe_boot_file instance
            attributes properly
        """

        conf = { 'ip_host': '10.0.0.1',
                 'netmask': '255.255.255.0',
                 'dhcp':
                     { 'start': '10.0.0.100',
                       'end'  : '10.0.0.200' } }
        self.network_conf._ConfigurationNetwork__parse_forward_mode(conf)
        self.network_conf._ConfigurationNetwork__parse_ip_host_netmask(conf)
        self.network_conf._ConfigurationNetwork__parse_dhcp(conf)

        conf = { 'pxe': '/test_tftp_dir/test_boot_file' }
        self.network_conf._ConfigurationNetwork__parse_pxe(conf)
        self.assertEqual(self.network_conf.pxe_tftp_dir, '/test_tftp_dir')
        self.assertEqual(self.network_conf.pxe_boot_file, 'test_boot_file')

        conf = { 'pxe': 'test_tftp_dir/test_boot_file' }
        self.network_conf._ConfigurationNetwork__parse_pxe(conf)
        self.assertEqual(self.network_conf.pxe_tftp_dir,
                         os.path.join(os.getcwd(),"test_tftp_dir"))
        self.assertEqual(self.network_conf.pxe_boot_file, 'test_boot_file')

        conf = { 'pxe': 'test_boot_file' }
        self.network_conf._ConfigurationNetwork__parse_pxe(conf)
        self.assertEqual(self.network_conf.pxe_tftp_dir, os.getcwd())
        self.assertEqual(self.network_conf.pxe_boot_file, 'test_boot_file')

        conf = { 'pxe':
                     { 'tftp_dir': '/test_tftp_dir', # absolute path
                       'boot_file': 'test_boot_file' } }
        self.network_conf._ConfigurationNetwork__parse_pxe(conf)
        self.assertEqual(self.network_conf.pxe_tftp_dir, '/test_tftp_dir')
        self.assertEqual(self.network_conf.pxe_boot_file, 'test_boot_file')

        # in this case ConfigurationNetwork.has_pxe() should also return True
        self.assertEqual(self.network_conf.has_pxe(), True)

        conf = { 'pxe':
                     { 'tftp_dir': 'test_tftp_dir', # relative path
                       'boot_file': 'test_boot_file' } }
        self.network_conf._ConfigurationNetwork__parse_pxe(conf)
        self.assertEqual(self.network_conf.pxe_tftp_dir,
                         os.path.join(os.getcwd(),"test_tftp_dir"))
        self.assertEqual(self.network_conf.pxe_boot_file, 'test_boot_file')

        conf = { } 
        self.network_conf._ConfigurationNetwork__parse_pxe(conf)
        self.assertEqual(self.network_conf.pxe_tftp_dir, None)
        self.assertEqual(self.network_conf.pxe_boot_file, None)

        # in this case ConfigurationNetwork.has_pxe() should also return False
        self.assertEqual(self.network_conf.has_pxe(), False)

    def test_parse_pxe_no_dhcp(self):
        """
            ConfigurationNetwork.__parse_pxe() should raise 
            CloubedConfigurationException if pxe parameters are set on a
            network without dhcp
        """
        invalid_conf = { 'ip_host': '10.0.0.1',
                         'netmask': '255.255.255.0',
                         'pxe': 'test_tftp_dir/test_boot_file' }
        self.network_conf._ConfigurationNetwork__parse_forward_mode(invalid_conf)
        self.network_conf._ConfigurationNetwork__parse_ip_host_netmask(invalid_conf)
        self.network_conf._ConfigurationNetwork__parse_dhcp(invalid_conf)
        self.assertRaisesRegexp(
             CloubedConfigurationException,
             "pxe service cannot be set-up on network {network} without dhcp" \
                 .format(network=self.network_conf.name),
             self.network_conf._ConfigurationNetwork__parse_pxe,
             invalid_conf)

    def test_parse_pxe_invalid_format(self):
        """
            ConfigurationNetwork.__parse_pxe() should raise
            CloubedConfigurationException if pxe parameter has an invalid format
        """
        invalid_conf = { 'ip_host': '10.0.0.1',
                         'netmask': '255.255.255.0',
                         'dhcp':
                             { 'start': '10.0.0.100',
                               'end'  : '10.0.0.200' },
                         'pxe': 42 }
        self.network_conf._ConfigurationNetwork__parse_forward_mode(invalid_conf)
        self.network_conf._ConfigurationNetwork__parse_ip_host_netmask(invalid_conf)
        self.network_conf._ConfigurationNetwork__parse_dhcp(invalid_conf)
        self.assertRaisesRegexp(
             CloubedConfigurationException,
             "format of pxe parameter of network {network} is not valid" \
                 .format(network=self.network_conf.name),
             self.network_conf._ConfigurationNetwork__parse_pxe,
             invalid_conf)

    def test_parse_pxe_missing_boot_file(self):
        """
            ConfigurationNetwork.__parse_pxe() should raise
            CloubedConfigurationException if pxe parameter has a missing boot
            file
        """
        invalid_conf = { 'ip_host': '10.0.0.1',
                         'netmask': '255.255.255.0',
                         'dhcp':
                             { 'start': '10.0.0.100',
                               'end'  : '10.0.0.200' },
                         'pxe': 'test_tftp_dir/' }
        self.network_conf._ConfigurationNetwork__parse_forward_mode(invalid_conf)
        self.network_conf._ConfigurationNetwork__parse_ip_host_netmask(invalid_conf)
        self.network_conf._ConfigurationNetwork__parse_dhcp(invalid_conf)
        self.assertRaisesRegexp(
             CloubedConfigurationException,
             "pxe parameter of network {network} must specify a boot file" \
                 .format(network=self.network_conf.name),
             self.network_conf._ConfigurationNetwork__parse_pxe,
             invalid_conf)

    def test_parse_pxe_missing_parameter(self):
        """
            ConfigurationNetwork.__parse_pxe() should raise 
            CloubedConfigurationException if one parameter is missing in the pxe
            dict of a network
        """
        invalid_conf = { 'ip_host': '10.0.0.1',
                         'netmask': '255.255.255.0',
                         'dhcp':
                             { 'start': '10.0.0.100',
                               'end'  : '10.0.0.200' },
                         'pxe':
                             { 'tftp_dir': 'test_tftp_dir' } }
        self.network_conf._ConfigurationNetwork__parse_forward_mode(invalid_conf)
        self.network_conf._ConfigurationNetwork__parse_ip_host_netmask(invalid_conf)
        self.network_conf._ConfigurationNetwork__parse_dhcp(invalid_conf)
        self.assertRaisesRegexp(
             CloubedConfigurationException,
             "boot_file parameter must be defined in pxe section of network " \
             "{network}" \
                 .format(network=self.network_conf.name),
             self.network_conf._ConfigurationNetwork__parse_pxe,
             invalid_conf)

    def test_parse_pxe_invalid_format_parameter(self):
        """
            ConfigurationNetwork.__parse_pxe() should raise 
            CloubedConfigurationException if pxe parameters are set on a
            network without dhcp
        """
        invalid_conf = { 'ip_host': '10.0.0.1',
                         'netmask': '255.255.255.0',
                         'dhcp':
                             { 'start': '10.0.0.100',
                               'end'  : '10.0.0.200' },
                         'pxe':
                             { 'tftp_dir': 'test_tftp_dir',
                               'boot_file': 42 } }
        self.network_conf._ConfigurationNetwork__parse_forward_mode(invalid_conf)
        self.network_conf._ConfigurationNetwork__parse_ip_host_netmask(invalid_conf)
        self.network_conf._ConfigurationNetwork__parse_dhcp(invalid_conf)
        self.assertRaisesRegexp(
             CloubedConfigurationException,
             "boot_file parameter format in pxe section of network {network} " \
             "is not valid" \
                 .format(network=self.network_conf.name),
             self.network_conf._ConfigurationNetwork__parse_pxe,
             invalid_conf)
Exemplo n.º 6
0
class TestConfigurationNetworkDomain(CloubedTestCase):

    def setUp(self):
        self._network_item = valid_network_item
        self._loader = MockConfigurationLoader(conf_minimal)
        self.conf = Configuration(self._loader)
        self.network_conf = ConfigurationNetwork(self.conf, self._network_item)

    def test_parse_domain_ok(self):
        """
            ConfigurationNetwork.__parse_domain() should parse valid values
            without errors and set domain instance attribute properly
        """

        conf = { 'ip_host': '10.0.0.1',
                 'netmask': '255.255.255.0',
                 'dhcp':
                     { 'start': '10.0.0.100',
                       'end'  : '10.0.0.200' } }
        self.network_conf._ConfigurationNetwork__parse_forward_mode(conf)
        self.network_conf._ConfigurationNetwork__parse_ip_host_netmask(conf)
        self.network_conf._ConfigurationNetwork__parse_dhcp(conf)

        conf = { 'domain': 'test_domain' }
        self.network_conf._ConfigurationNetwork__parse_domain(conf)
        self.assertEqual(self.network_conf.domain, 'test_domain')

        conf = { }
        self.network_conf._ConfigurationNetwork__parse_domain(conf)
        self.assertEqual(self.network_conf.domain, None)

    def test_parse_domain_no_dhcp(self):
        """
            ConfigurationNetwork.__parse_domain() should raise
            CloubedConfigurationException if domain parameter is set on a
            network without dhcp
        """
        invalid_conf = { 'ip_host': '10.0.0.1',
                         'netmask': '255.255.255.0',
                         'domain': 'test_domain' }
        self.network_conf._ConfigurationNetwork__parse_forward_mode(invalid_conf)
        self.network_conf._ConfigurationNetwork__parse_ip_host_netmask(invalid_conf)
        self.network_conf._ConfigurationNetwork__parse_dhcp(invalid_conf)
        self.assertRaisesRegexp(
             CloubedConfigurationException,
             "domain parameter cannot be set-up on network {network} without dhcp" \
                 .format(network=self.network_conf.name),
             self.network_conf._ConfigurationNetwork__parse_domain,
             invalid_conf)

    def test_parse_domain_invalid_format(self):
        """
            ConfigurationNetwork.__parse_domain() should raise
            CloubedConfigurationException if the format of the domain parameter
            is not valid
        """
        invalid_conf = { 'ip_host': '10.0.0.1',
                         'netmask': '255.255.255.0',
                         'dhcp':
                             { 'start': '10.0.0.100',
                               'end'  : '10.0.0.200' },
                         'domain': 42 }
        self.network_conf._ConfigurationNetwork__parse_forward_mode(invalid_conf)
        self.network_conf._ConfigurationNetwork__parse_ip_host_netmask(invalid_conf)
        self.network_conf._ConfigurationNetwork__parse_dhcp(invalid_conf)
        self.assertRaisesRegexp(
             CloubedConfigurationException,
             "format of domain parameter of network {network} is not valid" \
                 .format(network=self.network_conf.name),
             self.network_conf._ConfigurationNetwork__parse_domain,
             invalid_conf)
Exemplo n.º 7
0
class TestConfigurationNetworkDhcp(CloubedTestCase):

    def setUp(self):
        self._network_item = valid_network_item
        self._loader = MockConfigurationLoader(conf_minimal)
        self.conf = Configuration(self._loader)
        self.network_conf = ConfigurationNetwork(self.conf, self._network_item)

    def test_parse_dhcp_ok(self):
        """
            ConfigurationNetwork.__parse_dhcp() should parse valid values
            without errors and set dhcp_start and dhcp_end instance attributes
            properly
        """

        conf = { 'ip_host': '10.0.0.1',
                 'netmask': '255.255.255.0' }
        self.network_conf._ConfigurationNetwork__parse_forward_mode(conf)
        self.network_conf._ConfigurationNetwork__parse_ip_host_netmask(conf)

        conf = { 'dhcp':
                     { 'start': '10.0.0.100',
                       'end'  : '10.0.0.200' } }
        self.network_conf._ConfigurationNetwork__parse_dhcp(conf)
        self.assertEqual(self.network_conf.dhcp_start, '10.0.0.100')
        self.assertEqual(self.network_conf.dhcp_end, '10.0.0.200')

        # in this case ConfigurationNetwork.has_dhcp() should also return True
        self.assertEqual(self.network_conf.has_dhcp(), True)

        conf = { }
        self.network_conf._ConfigurationNetwork__parse_dhcp(conf)
        self.assertEqual(self.network_conf.dhcp_start, None)
        self.assertEqual(self.network_conf.dhcp_end, None)

        # in this case ConfigurationNetwork.has_dhcp() should also return False
        self.assertEqual(self.network_conf.has_dhcp(), False)

    def test_parse_dhcp_no_ip_host(self):
        """
            ConfigurationNetwork.__parse_dhcp() should raise 
            CloubedConfigurationException if dhcp parameters are set on a
            network without ip_host/netmask
        """
        invalid_conf = { 'dhcp':
                             { 'start': '10.0.0.100',
                               'end'  : '10.0.0.200' } }
        self.network_conf._ConfigurationNetwork__parse_forward_mode(invalid_conf)
        self.network_conf._ConfigurationNetwork__parse_ip_host_netmask(invalid_conf)
        self.assertRaisesRegexp(
             CloubedConfigurationException,
             "dhcp service cannot be set-up on network {network} without " \
             "ip_host and netmask" \
                 .format(network=self.network_conf.name),
             self.network_conf._ConfigurationNetwork__parse_dhcp,
             invalid_conf)

    def test_parse_dhcp_missing_parameter(self):
        """
            ConfigurationNetwork.__parse_dhcp() should raise 
            CloubedConfigurationException if there is any missing parameter in
            dhcp section of the network
        """
        invalid_conf = { 'ip_host': '10.0.0.1',
                         'netmask': '255.255.255.0',
                         'dhcp':
                             { 'start': '10.0.0.100' } }
        self.network_conf._ConfigurationNetwork__parse_forward_mode(invalid_conf)
        self.network_conf._ConfigurationNetwork__parse_ip_host_netmask(invalid_conf)
        self.assertRaisesRegexp(
             CloubedConfigurationException,
             "end parameter must be defined in dhcp section of network " \
             "{network}" \
                 .format(network=self.network_conf.name),
             self.network_conf._ConfigurationNetwork__parse_dhcp,
             invalid_conf)

    def test_parse_dhcp_invalid_format(self):
        """
            ConfigurationNetwork.__parse_dhcp() should raise 
            CloubedConfigurationException if the format of any parameter in the
            dhcp section is not valid
        """
        invalid_conf = { 'ip_host': '10.0.0.1',
                         'netmask': '255.255.255.0',
                         'dhcp':
                             { 'start': '10.0.0.100',
                               'end': 42 } }
        self.network_conf._ConfigurationNetwork__parse_forward_mode(invalid_conf)
        self.network_conf._ConfigurationNetwork__parse_ip_host_netmask(invalid_conf)
        self.assertRaisesRegexp(
             CloubedConfigurationException,
             "end parameter format in dhcp section of network {network} is " \
             "not valid" \
                 .format(network=self.network_conf.name),
             self.network_conf._ConfigurationNetwork__parse_dhcp,
             invalid_conf)

    def test_parse_dhcp_invalid_address(self):
        """
            ConfigurationNetwork.__parse_dhcp() should raise 
            CloubedConfigurationException if the format of any parameter in the
            dhcp section is not valid
        """
        invalid_conf = { 'ip_host': '10.0.0.1',
                         'netmask': '255.255.255.0',
                         'dhcp':
                             { 'start': '10.0.0.100',
                               'end': 'fail' } }
        self.network_conf._ConfigurationNetwork__parse_forward_mode(invalid_conf)
        self.network_conf._ConfigurationNetwork__parse_ip_host_netmask(invalid_conf)
        self.assertRaisesRegexp(
             CloubedConfigurationException,
             "end parameter in dhcp section of network {network} is not a " \
             "valid IPv4 address" \
                 .format(network=self.network_conf.name),
             self.network_conf._ConfigurationNetwork__parse_dhcp,
             invalid_conf)
Exemplo n.º 8
0
class TestConfigurationNetworkIpHostNetmask(CloubedTestCase):

    def setUp(self):
        self._network_item = valid_network_item
        self._loader = MockConfigurationLoader(conf_minimal)
        self.conf = Configuration(self._loader)
        self.network_conf = ConfigurationNetwork(self.conf, self._network_item)

    def test_parse_ip_host_netmask_ok(self):
        """
            ConfigurationNetwork.__parse_ip_host_netmask() should parse valid
            values without errors and set ip_host and netmask instance
            attributes properly
        """

        conf = { 'address': '10.0.0.1/24' }
        self.network_conf._ConfigurationNetwork__parse_forward_mode(conf)
        self.network_conf._ConfigurationNetwork__parse_ip_host_netmask(conf)
        self.assertEqual(self.network_conf.ip_host, '10.0.0.1')
        self.assertEqual(self.network_conf.netmask, '255.255.255.0')

        # old deprecated parameters
        conf = { 'ip_host': '10.0.0.1',
                 'netmask': '255.255.255.0' }
        self.network_conf._ConfigurationNetwork__parse_forward_mode(conf)
        self.network_conf._ConfigurationNetwork__parse_ip_host_netmask(conf)
        self.assertEqual(self.network_conf.ip_host, '10.0.0.1')
        self.assertEqual(self.network_conf.netmask, '255.255.255.0')

        # in this case ConfigurationNetwork.has_local_settings() should also
        # return True
        self.assertEqual(self.network_conf.has_local_settings(), True)

        conf = { }
        self.network_conf._ConfigurationNetwork__parse_forward_mode(conf)
        self.network_conf._ConfigurationNetwork__parse_ip_host_netmask(conf)
        self.assertEqual(self.network_conf.ip_host, None)
        self.assertEqual(self.network_conf.netmask, None)

        # in this case ConfigurationNetwork.has_local_settings() should also
        # return False
        self.assertEqual(self.network_conf.has_local_settings(), False)

    def test_parse_address_bridge_mode(self):
        """
            ConfigurationNetwork.__parse_ip_host_netmask() should raise
            CloubedConfigurationException if address is set on network in
            bridge forwarding mode
        """

        invalid_conf = { 'forward': 'bridge',
                         'address': '10.0.0.1/24' }
        self.network_conf._ConfigurationNetwork__parse_forward_mode(invalid_conf)
        self.assertRaisesRegexp(
             CloubedConfigurationException,
             "address parameter has no sense on network {network} with " \
             "bridge forwarding mode" \
                 .format(network=self.network_conf.name),
             self.network_conf._ConfigurationNetwork__parse_ip_host_netmask,
             invalid_conf)
    def test_parse_ip_host_netmask_bridge_mode(self):
        """
            ConfigurationNetwork.__parse_ip_host_netmask() should raise
            CloubedConfigurationException if ip_host and netmask are set
            on network in bridge forwarding mode
        """

        invalid_conf = { 'forward': 'bridge',
                         'ip_host': '10.0.0.1',
                         'netmask': '255.255.255.0' }
        self.network_conf._ConfigurationNetwork__parse_forward_mode(invalid_conf)
        self.assertRaisesRegexp(
             CloubedConfigurationException,
             "ip_host and netmask parameters have no sense on network " \
             "{network} with bridge forwarding mode" \
                 .format(network=self.network_conf.name),
             self.network_conf._ConfigurationNetwork__parse_ip_host_netmask,
             invalid_conf)

    def test_parse_ip_host_netmask_no_netmask(self):
        """
            ConfigurationNetwork.__parse_ip_host_netmask() should raise
            CloubedConfigurationException if ip_host is set without netmask
        """

        invalid_conf = { 'ip_host': '10.0.0.1' }
        self.network_conf._ConfigurationNetwork__parse_forward_mode(invalid_conf)
        self.assertRaisesRegexp(
             CloubedConfigurationException,
             "ip_host cannot be set without netmask parameter on network " \
             "{network}" \
                 .format(network=self.network_conf.name),
             self.network_conf._ConfigurationNetwork__parse_ip_host_netmask,
             invalid_conf)

    def test_parse_ip_host_netmask_no_ip_host(self):
        """
            ConfigurationNetwork.__parse_ip_host_netmask() should raise
            CloubedConfigurationException if netmask is set without ip_host
        """

        invalid_conf = { 'netmask': '255.255.255.0' }
        self.network_conf._ConfigurationNetwork__parse_forward_mode(invalid_conf)
        self.assertRaisesRegexp(
             CloubedConfigurationException,
             "netmask cannot be set without ip_host parameter on network " \
             "{network}" \
                 .format(network=self.network_conf.name),
             self.network_conf._ConfigurationNetwork__parse_ip_host_netmask,
             invalid_conf)

    def test_parse_ip_host_address_invalid_format(self):
        """
            ConfigurationNetwork.__parse_ip_host_netmask() should raise
            CloubedConfigurationException if the format of the address
            parameter is not valid
        """

        invalid_conf = { 'address': [] }
        self.network_conf._ConfigurationNetwork__parse_forward_mode(invalid_conf)
        self.assertRaisesRegexp(
             CloubedConfigurationException,
             "address parameter format on network {network} is not valid" \
                 .format(network=self.network_conf.name),
             self.network_conf._ConfigurationNetwork__parse_ip_host_netmask,
             invalid_conf)

    def test_parse_ip_host_netmask_invalid_format(self):
        """
            ConfigurationNetwork.__parse_ip_host_netmask() should raise
            CloubedConfigurationException if the formats of the ip_host and
            netmask parameters are not valid
        """

        invalid_conf = { 'ip_host': [], 'netmask': 'str' }
        self.network_conf._ConfigurationNetwork__parse_forward_mode(invalid_conf)
        self.assertRaisesRegexp(
             CloubedConfigurationException,
             "ip_host parameter format on network {network} is not valid" \
                 .format(network=self.network_conf.name),
             self.network_conf._ConfigurationNetwork__parse_ip_host_netmask,
             invalid_conf)

        invalid_conf = { 'ip_host': 'str', 'netmask': 42 }
        self.network_conf._ConfigurationNetwork__parse_forward_mode(invalid_conf)
        self.assertRaisesRegexp(
             CloubedConfigurationException,
             "netmask parameter format on network {network} is not valid" \
                 .format(network=self.network_conf.name),
             self.network_conf._ConfigurationNetwork__parse_ip_host_netmask,
             invalid_conf)

    def test_parse_ip_host_address_invalid_value(self):
        """
            ConfigurationNetwork.__parse_ip_host_netmask() should raise
            CloubedConfigurationException if the value of address parameter
            is not a valid network address in CIDR syntax
        """

        invalid_confs = [ { 'address': 'fail'           },
                          { 'address': '192.168.0.1/35' },
                          { 'address': '260.0.0.0/24'   } ]

        for invalid_conf in invalid_confs:

            self.network_conf._ConfigurationNetwork__parse_forward_mode(invalid_conf)
            self.assertRaisesRegexp(
                 CloubedConfigurationException,
                 "address parameter on network {network} is not a valid " \
                 "network address".format(network=self.network_conf.name),
                 self.network_conf._ConfigurationNetwork__parse_ip_host_netmask,
                 invalid_conf)

    def test_parse_ip_host_netmask_invalid_addresss(self):
        """
            ConfigurationNetwork.__parse_ip_host_netmask() should raise
            CloubedConfigurationException if the type of ip_host and netmask
            parameters are not respectively valid IPv4 address and netmask
        """

        invalid_conf = { 'ip_host': 'fail', 'netmask': '255.255.255.0' }
        self.network_conf._ConfigurationNetwork__parse_forward_mode(invalid_conf)
        self.assertRaisesRegexp(
             CloubedConfigurationException,
             "ip_host parameter on network {network} is not a valid IPv4 " \
             "address" \
                 .format(network=self.network_conf.name),
             self.network_conf._ConfigurationNetwork__parse_ip_host_netmask,
             invalid_conf)

        invalid_conf = { 'ip_host': '10.0.0.1', 'netmask': 'fail' }
        self.network_conf._ConfigurationNetwork__parse_forward_mode(invalid_conf)
        self.assertRaisesRegexp(
             CloubedConfigurationException,
             "netmask parameter on network {network} is not a valid IPv4 " \
             "netmask" \
                 .format(network=self.network_conf.name),
             self.network_conf._ConfigurationNetwork__parse_ip_host_netmask,
             invalid_conf)