Changeset 6469


Ignore:
Timestamp:
Dec 19, 2008, 2:19:00 PM (16 years ago)
Author:
roland
Message:

Added tests, and worked on clean_ip for interfaces.

Location:
trunk/exodus
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • TabularUnified trunk/exodus/forms.py

    r6459 r6469  
    44        link_is_wireless, new_ssid
    55from exodus.wllogic import MASTER, MANAGED
     6from exodus.settings import AP_SUBNET
    67from exodus.wlipcalc import IPCalc
    78
     
    3435        model = Interface
    3536
     37    def clean_polar(self):
     38        polar = self.cleaned_data.get('polar')
     39        self.type = self.cleaned_data.get('type')
     40       
     41        if polar and not link_is_wireless(self):
     42            raise forms.ValidationError(
     43                    "An ethernet interface can't have a polarization.")
     44        else:
     45            return polar
     46
     47    def clean_antenna(self):
     48        self.type = self.cleaned_data.get('type')
     49        antenna = self.cleaned_data.get('antenna')
     50        if antenna and not link_is_wireless(self):
     51            raise forms.ValidationError(
     52                    "An ethernet interface can't have an antenna.")
     53        return antenna
     54
    3655    def clean_link(self):
    3756        link = self.cleaned_data.get('link')
     
    4160        # self.instance raises DoesNotExist,
    4261        # but self.instance.[pk, ssid, polar, etc] doesn't
    43         # Primary Keys's always start at 1.
    44         if self.instance.pk:
    45             edit = True
    46         else:
    47             edit = False
    48            
     62
     63        edit = bool(self.instance.pk)
     64
    4965        if link:
    5066            # if link is to self we don't need to check anything else
     
    7389
    7490            # if link is ethernet, don't worry about master and managed.
     91            # but we do want every link to link to one 'master' in the
     92            # subnet.
     93            # We assume that the link of a link is always the master.
     94            # if link is to self, link.link_id == link.id
    7595            elif not link_is_wireless(link):
    76                 return link
     96                if link.id == link.link_id:
     97                    return link
     98                else:
     99                    return link.link
    77100
    78101            # if this elif is True, it means that 'link' is in managed
     
    103126                # calc the new ipaddresses
    104127                ip = IPCalc(new_master.node, 30) 
    105                 new_master.ip , new_slave.ip = ip.ips
     128                new_master.ip, new_slave.ip = ip.ips
    106129                new_master.netmask = new_slave.netmask = 30
    107130                   
     
    130153            return link
    131154
     155    def clean_ip(self):
     156        """Cleans the ip.
     157
     158        We calculate the ipaddresses of this link and the ones linked to it.
     159        We also define the netmask in this routine.
     160        """
     161        #XXX: check if there is a free ip in the subnet
     162        #XXX: if not generate a new ip
     163        #XXX: Do we get here eventhough a validation error is raised
     164        node = self.cleaned_data.get('node')
     165        ip = self.cleaned_data.get('ip')
     166        link = self.cleaned_data.get('link')   
     167        ap = self.cleaned_data.get('accesspoint')
     168        edit = bool(self.instance.pk)
     169        # if we have an error, we don't calculate new ip addresses.
     170        import pdb; pdb.set_trace() ;
     171        if self._errors:
     172            return ip
     173       
     174        if ap:
     175            try:
     176                new_ip = IPCalc(node, AP_SUBNET, link)
     177            except Exception:
     178                return ip   
     179            ip = new_ip.ips[0]
     180            if edit:
     181                pass       
     182            self.data['netmask'] = AP_SUBNET
     183            #XXX: distribute ipaddresses
     184            #XXX: add ips for links to.
     185           
     186        # if link is not defined, the link can have it's own ip.
     187        #XXX: and not accespoint
     188        if not link and not ap:
     189            ip = IPCalc(node, 32)
     190            self.data['netmask'] = 32
     191            return ip
     192
     193        return ip
     194       
    132195    #XXX: change SSID when iface.name changes   
  • TabularUnified trunk/exodus/models.py

    r6467 r6469  
    8686        return self.name
    8787
    88    # def save(self, force_insert=False, force_update=False):
    89    #     #XXX: could there be racing conditions?
    90    #     #XXX: Maybe move this to a model form,
    91    #     from wllogic import free_master_ip
    92    #     # check if there is a masterip, if not generate one.
    93    #     # check if there is a network change, if so, generate a new masterip.
    94    #     if self.masterip:
    95    #         old = Node.objects.get(pk=self.pk)
    96    #         if old.network != self.network:
    97    #             self.masterip = free_master_ip(self.network)
    98    #     else:
    99    #         self.masterip = free_master_ip(self.network)
    100    #     super(Node, self).save(force_insert, force_update)
    101 
    10288class Interface(models.Model):
    10389    node = models.ForeignKey(Node)
     
    10692    iface = models.CharField(max_length=10, verbose_name="interface",
    10793            default='eth0')
     94    accesspoint = models.BooleanField()
     95    polar = models.CharField(blank=True, max_length=10, choices=POLAR_CHOICES)
     96    antenna = models.ForeignKey(Antenna, blank=True, null=True)
     97    link = models.ForeignKey('self', blank=True, null=True)
    10898    ip = models.IPAddressField(unique=True, blank=True)
    10999    netmask = models.IntegerField(default=30)
    110     polar = models.CharField(blank=True, max_length=10, choices=POLAR_CHOICES)
    111100    ssid = models.CharField(max_length=50, blank=True, null=True)
    112101    mode = models.CharField(max_length=10, choices=WIFI_MODE_CHOICES,
    113102            blank=True)
    114103    channel = models.IntegerField(blank=True, null=True)
    115     antenna = models.ForeignKey(Antenna, blank=True, null=True)
    116104    shortdesc = models.CharField(blank=True, max_length=10)
    117105    desc = models.CharField(blank=True, max_length=100)
    118     accesspoint = models.BooleanField()
    119     link = models.ForeignKey('self', blank=True, null=True)
    120106   
    121107    class Meta:
  • TabularUnified trunk/exodus/settings.py

    r6449 r6469  
    1919# Theses types are compatibale
    2020COMPAT = ('11b', '11g')
     21# AP subnet size
     22AP_SUBNET = 26
    2123
    2224
  • TabularUnified trunk/exodus/tests.py

    r6459 r6469  
    4949
    5050    def test_ipcalc_get_used_ips(self):
     51        list = set(['172.16.0.1', '172.16.0.2', '172.16.0.4', '172.16.0.5',
     52                '172.16.0.6', '172.16.0.7'])
     53        used_list = self.ipcalc(30)._get_used_ips()
     54        self.failUnlessEqual( list, used_list)
     55
     56    def test_ipcalc_get_free_network_addr(self):
     57        from exodus.wllogic import show_addr
    5158        list = ['172.16.0.1', '172.16.0.2', '172.16.0.4', '172.16.0.5',
    5259                '172.16.0.6', '172.16.0.7']
    53         used_list = self.ipcalc(30)._get_used_ips()
    54         used_list.sort()
    55         self.failUnlessEqual( list, used_list)
    56 
    57     def test_ipcalc_get_free_network_addr(self):
    58         list = ['172.16.0.1', '172.16.0.2', '172.16.0.4', '172.16.0.5',
    59                 '172.16.0.6', '172.16.0.7']
    60         network_addr = self.ipcalc(30)._get_free_network_addr(list)
     60        network_addr = show_addr(self.ipcalc(30)._get_free_network_addr(list))
    6161        self.failUnlessEqual(network_addr, '172.16.0.8')
    6262
  • TabularUnified trunk/exodus/wlipcalc.py

    r6459 r6469  
    99    """
    1010
    11     def __init__(self, node, free_netmask):
     11    def __init__(self, node, free_netmask, link = None):
    1212        if free_netmask <= MASTERIP_NETMASK or free_netmask > 32:
    1313            raise ValueError, 'Netmask out of bounds.'
     
    1717        master_netmask = MASTERIP_NETMASK
    1818        self.master_network = wl.get_network(self.master_ip, master_netmask)
     19        self.link = link
    1920
    2021        # calculate the number of ipaddresses in the subnetmask
     
    5657        for i in self.node.interface_set.all():
    5758            #XXX: rewrite to if i.ip in masterip??
    58             if i.id == i.link_id:
     59            # not i.id == self.link.id, don't populate used_list
     60            # with ips from it's own netmask
     61            if i.id == i.link_id and not i.id == self.link.id:
    5962                ip_size = self._ip_size(i.netmask)
    6063                network_addr = wl.network(i.ip, i.netmask)
    61                 for j in range(ip_size):
     64                for j in xrange(ip_size):
    6265                    used_list.append(wl.show_addr(network_addr + j))
    63         return used_list
     66        return set(used_list)
    6467
    6568    def _get_free_network_addr(self, used_list):
    6669        """Calculate a new network address with a used_list and given netmask.
    6770        """
    68         for i in range(self.master_ip_size/self.new_ip_size):
     71        #XXX: network_addr in for loop(generator expression)/list comprehension
     72        for i in xrange(self.master_ip_size/self.new_ip_size):
    6973            network_addr = wl.parse_addr(self.master_network) + \
    7074                    (self.new_ip_size * i)
    7175            k = 0
    72             for j in range(self.new_ip_size):
     76            for j in xrange(self.new_ip_size):
    7377                new_ip = wl.show_addr(network_addr + j)
    7478                if new_ip not in used_list:
  • TabularUnified trunk/exodus/wllogic.py

    r6454 r6469  
    175175                return 32       
    176176        return int(32) - int(ceil(log(number_ifaces+2,2)))
    177 
    178 
    179 
Note: See TracChangeset for help on using the changeset viewer.