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'
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')
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
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
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'
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')
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
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)
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()
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'