Example #1
0
    def test_network_model(self):
        environment = models.Environment.create('test_env')
        group = environment.add_group(group_name='test-group',
                                      driver_name='devops.driver.empty')
        node = models.Node.objects.create(
            group=group,
            name='test_node',
            role='default',
        )
        pool = network.IpNetworksPool(
            networks=[netaddr.IPNetwork('10.1.0.0/24')], prefix=24)
        address_pool = models.AddressPool.address_pool_create(
            environment=environment, name='internal', pool=pool)
        l2_net_dev = models.L2NetworkDevice.objects.create(
            group=None, address_pool=address_pool, name='test_l2_dev')

        interface1 = models.Interface.interface_create(
            l2_network_device=l2_net_dev, node=node, label='eth0')

        assert interface1.model == 'virtio'
        interface2 = models.Interface.interface_create(
            l2_network_device=l2_net_dev,
            node=node,
            label='eth0',
            model='e1000')
        assert interface2.model == 'e1000'
Example #2
0
    def test_safe_create_network_race_condition(self):
        environment = models.Environment.create('test_env1')
        pool = network.IpNetworksPool(
            networks=[netaddr.IPNetwork('10.1.0.0/16')], prefix=24)
        ap1 = models.AddressPool.address_pool_create(environment=environment,
                                                     name='test_ap1',
                                                     pool=pool)
        assert ap1.net == netaddr.IPNetwork('10.1.0.0/24')
        ap2 = models.AddressPool.address_pool_create(environment=environment,
                                                     name='test_ap2',
                                                     pool=pool)
        assert ap2.net == netaddr.IPNetwork('10.1.1.0/24')

        real_create = models.AddressPool.objects.create

        def race_condition_side_effect(*args, **kwargs):
            # create ap with the same net
            e = models.Environment.create('test_env_other')
            real_create(name='test_ap',
                        environment=e,
                        net=netaddr.IPNetwork('10.1.2.0/24'))

            return real_create(*args, **kwargs)

        with mock.patch('devops.models.network.AddressPool.objects.create',
                        side_effect=race_condition_side_effect):

            ap3 = models.AddressPool.address_pool_create(
                environment=environment, name='test_ap3', pool=pool)
            assert ap3.net == netaddr.IPNetwork('10.1.3.0/24')
Example #3
0
 def test_getting_subnetworks(self):
     pool = network.IpNetworksPool([netaddr.IPNetwork('10.1.0.0/22')], 24)
     networks = list(pool)
     assert len(networks) == 4
     assert (netaddr.IPNetwork('10.1.0.0/24') in networks) is True
     assert (netaddr.IPNetwork('10.1.1.0/24') in networks) is True
     assert (netaddr.IPNetwork('10.1.2.0/24') in networks) is True
     assert (netaddr.IPNetwork('10.1.3.0/24') in networks) is True
Example #4
0
    def address_pool_create(cls, name, environment, pool=None, **params):
        """Create network

        :rtype : Network
        """
        if pool is None:
            pool = network.IpNetworksPool(
                networks=[netaddr.IPNetwork('10.0.0.0/16')],
                prefix=24,
                allocated_networks=environment.get_allocated_networks())

        address_pool = cls._safe_create_network(
            environment=environment,
            name=name,
            pool=pool,
            **params
        )

        # Translate indexes into IP addresses for ip_reserved and ip_ranges
        def _relative_to_ip(ip_network, ip_id):
            """Get an IP from IPNetwork ip's list by index

            :param ip_network: IPNetwork object
            :param ip_id: string, if contains '+' or '-' then it is
                          used as index of an IP address in ip_network,
                          else it is considered as IP address.

            :rtype : str(IP)
            """
            if isinstance(ip_id, int):
                return str(ip_network[int(ip_id)])
            else:
                return str(ip_id)

        if 'ip_reserved' in params:
            for ip_res in params['ip_reserved'].keys():
                ip = _relative_to_ip(address_pool.ip_network,
                                     params['ip_reserved'][ip_res])
                params['ip_reserved'][ip_res] = ip      # Store to template
                address_pool.ip_reserved[ip_res] = ip   # Store to the object

        if 'ip_ranges' in params:
            for ip_range in params['ip_ranges']:
                ipr_start = _relative_to_ip(address_pool.ip_network,
                                            params['ip_ranges'][ip_range][0])
                ipr_end = _relative_to_ip(address_pool.ip_network,
                                          params['ip_ranges'][ip_range][1])
                params['ip_ranges'][ip_range] = (ipr_start, ipr_end)
                address_pool.ip_ranges[ip_range] = (ipr_start, ipr_end)

        address_pool.save()
        return address_pool
Example #5
0
 def test_create_network_name_exists(self):
     environment = models.Environment.create('test_env1')
     pool = network.IpNetworksPool(
         networks=[netaddr.IPNetwork('10.1.0.0/16')], prefix=24)
     models.AddressPool.address_pool_create(environment=environment,
                                            name='test_ap1',
                                            pool=pool)
     with pytest.raises(error.DevopsError) as e:
         models.AddressPool.address_pool_create(environment=environment,
                                                name='test_ap1',
                                                pool=pool)
     assert str(e.value) == \
         'AddressPool with name "test_ap1" already exists'
Example #6
0
 def test_safe_create_network_no_address_avail(self):
     environment = models.Environment.create('test_env1')
     pool = network.IpNetworksPool(
         networks=[netaddr.IPNetwork('10.1.0.0/24')], prefix=24)
     models.AddressPool.address_pool_create(environment=environment,
                                            name='test_ap',
                                            pool=pool)
     with pytest.raises(error.DevopsError) as e:
         models.AddressPool.address_pool_create(environment=environment,
                                                name='test_ap2',
                                                pool=pool)
     assert str(e.value) == ('There is no network pool available '
                             'for creating address pool test_ap2')
Example #7
0
 def test_getting_subnetworks_allocated(self):
     pool = network.IpNetworksPool(
         networks=[netaddr.IPNetwork('10.1.0.0/22')], prefix=24,
         allocated_networks=[
             netaddr.IPNetwork('10.1.1.0/24'),
             netaddr.IPNetwork('10.1.3.0/24'),
         ])
     networks = list(pool)
     assert len(networks) == 2
     assert (netaddr.IPNetwork('10.1.0.0/24') in networks) is True
     assert (netaddr.IPNetwork('10.1.1.0/24') not in networks) is True
     assert (netaddr.IPNetwork('10.1.2.0/24') in networks) is True
     assert (netaddr.IPNetwork('10.1.3.0/24') not in networks) is True
Example #8
0
    def add_address_pool(self, name, net, **params):

        networks, prefix = net.split(':')
        ip_networks = [netaddr.IPNetwork(x) for x in networks.split(',')]

        pool = network_helpers.IpNetworksPool(
            networks=ip_networks,
            prefix=int(prefix),
            allocated_networks=self.get_allocated_networks())

        return network.AddressPool.address_pool_create(environment=self,
                                                       name=name,
                                                       pool=pool,
                                                       **params)
Example #9
0
    def test_node_creation(self):
        environment = models.Environment.create('test_env3')
        pool = network.IpNetworksPool(
            networks=[netaddr.IPNetwork('10.1.0.0/24')], prefix=24)
        address_pool = models.AddressPool.address_pool_create(
            environment=environment, name='internal', pool=pool)
        l2_net_dev = models.L2NetworkDevice.objects.create(
            group=None, address_pool=address_pool, name='test_l2_dev')

        node = models.Node.objects.create(
            group=None,
            name='test_node',
            role='default',
        )
        models.Interface.interface_create(l2_network_device=l2_net_dev,
                                          node=node,
                                          label='eth0')
        environment.define()
Example #10
0
 def test_network_iterator(self):
     environment = models.Environment.create('test_env')
     node = models.Node.objects.create(
         group=None,
         name='test_node',
         role='default',
     )
     pool = network.IpNetworksPool(
         networks=[netaddr.IPNetwork('10.1.0.0/24')], prefix=24)
     address_pool = models.AddressPool.address_pool_create(
         environment=environment, name='internal', pool=pool)
     l2_net_dev = models.L2NetworkDevice.objects.create(
         group=None, address_pool=address_pool, name='test_l2_dev')
     interface = models.Interface.interface_create(
         l2_network_device=l2_net_dev, node=node, label='eth0')
     assert str(address_pool.next_ip()) == '10.1.0.3'
     models.Address.objects.create(ip_address=str('10.1.0.3'),
                                   interface=interface)
     assert str(address_pool.next_ip()) == '10.1.0.4'
     models.Address.objects.create(ip_address=str('10.1.0.4'),
                                   interface=interface)
     assert str(address_pool.next_ip()) == '10.1.0.5'