Changeset 6469
- Timestamp:
- Dec 19, 2008, 2:19:00 PM (16 years ago)
- Location:
- trunk/exodus
- Files:
-
- 6 edited
Legend:
- Unmodified
- Added
- Removed
-
TabularUnified trunk/exodus/forms.py ¶
r6459 r6469 4 4 link_is_wireless, new_ssid 5 5 from exodus.wllogic import MASTER, MANAGED 6 from exodus.settings import AP_SUBNET 6 7 from exodus.wlipcalc import IPCalc 7 8 … … 34 35 model = Interface 35 36 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 36 55 def clean_link(self): 37 56 link = self.cleaned_data.get('link') … … 41 60 # self.instance raises DoesNotExist, 42 61 # 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 49 65 if link: 50 66 # if link is to self we don't need to check anything else … … 73 89 74 90 # 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 75 95 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 77 100 78 101 # if this elif is True, it means that 'link' is in managed … … 103 126 # calc the new ipaddresses 104 127 ip = IPCalc(new_master.node, 30) 105 new_master.ip 128 new_master.ip, new_slave.ip = ip.ips 106 129 new_master.netmask = new_slave.netmask = 30 107 130 … … 130 153 return link 131 154 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 132 195 #XXX: change SSID when iface.name changes -
TabularUnified trunk/exodus/models.py ¶
r6467 r6469 86 86 return self.name 87 87 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_ip92 # # 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 102 88 class Interface(models.Model): 103 89 node = models.ForeignKey(Node) … … 106 92 iface = models.CharField(max_length=10, verbose_name="interface", 107 93 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) 108 98 ip = models.IPAddressField(unique=True, blank=True) 109 99 netmask = models.IntegerField(default=30) 110 polar = models.CharField(blank=True, max_length=10, choices=POLAR_CHOICES)111 100 ssid = models.CharField(max_length=50, blank=True, null=True) 112 101 mode = models.CharField(max_length=10, choices=WIFI_MODE_CHOICES, 113 102 blank=True) 114 103 channel = models.IntegerField(blank=True, null=True) 115 antenna = models.ForeignKey(Antenna, blank=True, null=True)116 104 shortdesc = models.CharField(blank=True, max_length=10) 117 105 desc = models.CharField(blank=True, max_length=100) 118 accesspoint = models.BooleanField()119 link = models.ForeignKey('self', blank=True, null=True)120 106 121 107 class Meta: -
TabularUnified trunk/exodus/settings.py ¶
r6449 r6469 19 19 # Theses types are compatibale 20 20 COMPAT = ('11b', '11g') 21 # AP subnet size 22 AP_SUBNET = 26 21 23 22 24 -
TabularUnified trunk/exodus/tests.py ¶
r6459 r6469 49 49 50 50 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 51 58 list = ['172.16.0.1', '172.16.0.2', '172.16.0.4', '172.16.0.5', 52 59 '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)) 61 61 self.failUnlessEqual(network_addr, '172.16.0.8') 62 62 -
TabularUnified trunk/exodus/wlipcalc.py ¶
r6459 r6469 9 9 """ 10 10 11 def __init__(self, node, free_netmask ):11 def __init__(self, node, free_netmask, link = None): 12 12 if free_netmask <= MASTERIP_NETMASK or free_netmask > 32: 13 13 raise ValueError, 'Netmask out of bounds.' … … 17 17 master_netmask = MASTERIP_NETMASK 18 18 self.master_network = wl.get_network(self.master_ip, master_netmask) 19 self.link = link 19 20 20 21 # calculate the number of ipaddresses in the subnetmask … … 56 57 for i in self.node.interface_set.all(): 57 58 #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: 59 62 ip_size = self._ip_size(i.netmask) 60 63 network_addr = wl.network(i.ip, i.netmask) 61 for j in range(ip_size):64 for j in xrange(ip_size): 62 65 used_list.append(wl.show_addr(network_addr + j)) 63 return used_list66 return set(used_list) 64 67 65 68 def _get_free_network_addr(self, used_list): 66 69 """Calculate a new network address with a used_list and given netmask. 67 70 """ 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): 69 73 network_addr = wl.parse_addr(self.master_network) + \ 70 74 (self.new_ip_size * i) 71 75 k = 0 72 for j in range(self.new_ip_size):76 for j in xrange(self.new_ip_size): 73 77 new_ip = wl.show_addr(network_addr + j) 74 78 if new_ip not in used_list: -
TabularUnified trunk/exodus/wllogic.py ¶
r6454 r6469 175 175 return 32 176 176 return int(32) - int(ceil(log(number_ifaces+2,2))) 177 178 179
Note:
See TracChangeset
for help on using the changeset viewer.