Changeset 6357


Ignore:
Timestamp:
Nov 2, 2008, 9:49:33 PM (16 years ago)
Author:
roland
Message:

Worked on unittests, rewrote a small part of freeMasterIP and made some error
and out of bounds checking

Location:
trunk
Files:
1 added
8 edited

Legend:

Unmodified
Added
Removed
  • trunk/Makefile

    r6353 r6357  
    4848batch: clean debug-init run
    4949#Intended usage for batch runs only e.g. no debug server
    50 
    51 
    52 
  • trunk/exodus/models.py

    r6347 r6357  
    3737    def as_list(self):
    3838        meta = self._meta
    39         values = [(f.verbose_name, getattr(self, f.attname)) for f in meta.local_fields if f.verbose_name not in ( 'ID')]
     39        values = [(f.verbose_name, getattr(self, f.attname))  \
     40                for f in meta.local_fields if f.verbose_name not in ( 'ID')]
    4041        return values
    4142
     
    4950class Location(ExtendedModel):
    5051    description = models.CharField(max_length=200, unique=True)
    51     Longitude = models.DecimalField(max_digits=8,decimal_places=6)
    52     Latitude = models.DecimalField(max_digits=8,decimal_places=6)
     52    longitude = models.DecimalField(max_digits=8,decimal_places=6)
     53    latitude = models.DecimalField(max_digits=8,decimal_places=6)
    5354
    5455    class Meta:
     
    9899class Interface(ExtendedModel):
    99100        node = models.ForeignKey(Node)
    100         type = models.CharField(max_length=10, choices=INTERFACE_TYPE_CHOICES, default=1)
    101         iface = models.CharField(max_length=10, verbose_name="interface", default='eth0')
     101        type = models.CharField(max_length=10, choices=INTERFACE_TYPE_CHOICES, \
     102            default=1)
     103        iface = models.CharField(max_length=10, verbose_name="interface", \
     104            default='eth0')
    102105        ip = models.IPAddressField(unique=True)
    103106        netmask = models.IntegerField(default=30)
  • trunk/exodus/settings.py

    r6351 r6357  
    1212MANAGERS = ADMINS
    1313
     14# Nodes get a /24
     15MASTERIP_NETMASK = 24
     16
    1417# Master super path, set to current working path
    15 EXODUS_ROOT = '/srv/wleiden/exodus/trunk'
     18EXODUS_ROOT =  os.path.dirname(__file__)
     19# EXODUS_ROOT = '/srv/wleiden/exodus/trunk'
    1620
    1721# Whether to find static files which are going to be served by django if running static mode
    18 EXODUS_STATIC_ROOT = EXODUS_ROOT + '/exodus/static'
     22EXODUS_STATIC_ROOT = os.path.join(EXODUS_ROOT, 'static')
     23#EXODUS_STATIC_ROOT = EXODUS_ROOT + 'exodus/static'
    1924
    2025DATABASE_ENGINE = 'sqlite3'           # 'postgresql', 'mysql', 'sqlite3' or 'ado_mssql'.
    21 DATABASE_NAME = EXODUS_ROOT + '/exodus.db' # Or path to database file if using sqlite3.
     26DATABASE_NAME = os.path.join(EXODUS_ROOT, 'exodus.db')
     27#DATABASE_NAME = EXODUS_ROOT + '/exodus.db' # Or path to database file if using sqlite3.
    2228DATABASE_USER = ''             # Not used with sqlite3.
    2329DATABASE_PASSWORD = ''         # Not used with sqlite3.
  • trunk/exodus/templatetags/network.py

    r6257 r6357  
    1010                self.subnet = subnet
    1111        def render(self, context):
    12                 return (wllogic.getNetwork(resolve_variable(self.address, context),resolve_variable(self.subnet,context)))
     12                return (wllogic.getNetwork(resolve_variable(self.address, context), \
     13                resolve_variable(self.subnet,context)))
    1314
    1415class BroadcastNode(template.Node):
     
    1718                self.subnet = subnet
    1819        def render(self, context):
    19                 return (wllogic.getBroadcast(resolve_variable(self.address, context),resolve_variable(self.subnet,context)))
     20                return (wllogic.getBroadcast(resolve_variable(self.address, context), \
     21                resolve_variable(self.subnet,context)))
    2022
    2123@register.tag
     
    2527        tag_name, address, subnet = token.split_contents()
    2628    except ValueError:
    27         raise template.TemplateSyntaxError, "%r tag requires a two arguments" % token.contents.split()[0]
     29        raise template.TemplateSyntaxError, "%r tag requires a two arguments" \
     30                % token.contents.split()[0]
    2831    return NetworkNode(address, subnet)
    2932
     
    3437        tag_name, address, subnet = token.split_contents()
    3538    except ValueError:
    36         raise template.TemplateSyntaxError, "%r tag requires a two arguments" % token.contents.split()[0]
     39        raise template.TemplateSyntaxError, "%r tag requires a two arguments" \
     40                % token.contents.split()[0]
    3741    return BroadcastNode(address, subnet)
    3842
     
    4044def subnet(value):
    4145        return wllogic.getSubnet(value)
    42 
  • trunk/exodus/tests.py

    r6354 r6357  
    1212        #Set up the database
    1313        self.olddbname = settings.DATABASE_NAME
    14         self.dbname = connection.creation.create_test_db()
     14        self.dbname = connection.creation.create_test_db(0)
    1515
    1616    def tearDown(self):
    17         connection.creation.destroy_test_db(self.olddbname)
     17        connection.creation.destroy_test_db(self.olddbname, 0)
    1818
    1919    def test_addlocation(self):
    20         post_data = {'description': 'JohnLaan2', 'Longitude': '34.55', \
    21             'Latitude' : '44.55', 'pro/ceed': 'OK, proceed'}
    22         response = self.client.post('/add/Location/new/', post_data)
     20        post_data = {'description': 'JohnLaan2', 'longitude': '34.55', \
     21            'latitude' : '44.55', 'pro/ceed': 'OK, proceed'}
     22        response = self.client.post('/add/location/new/', post_data)
    2323
    2424        self.failUnlessEqual(response.status_code, 200)
     
    3333
    3434class wllogic(unittest.TestCase):
     35    def setUp(self):
     36        #Set up the client
     37        self.client = Client()
     38       
     39        #Set up the database
     40        self.olddbname = settings.DATABASE_NAME
     41        self.dbname = connection.creation.create_test_db(0)
     42
     43    def tearDown(self):
     44        connection.creation.destroy_test_db(self.olddbname, 0)
     45
    3546    def test_new_SSID_name(self):
    36         node = {}
    37         node['name'] = 'testnode'
    38         #XXX figure out node.name = 'testnode' and node.network.name='iets'
     47        class node(object):
     48            name = 'CeTIM'
     49            class network(object):
     50                name = 'wleiden.net'
     51        nic = 'ath0'
     52        desc = '2cope'
     53        from exodus.wllogic import newSSIDName
     54        ssid = newSSIDName(node(), nic, desc)       
     55       
     56        self.failUnless(ssid, '2cope-ath0.CeTIM.wleiden.net')
    3957
    4058    def test_parse_show_addr(self):
     
    6179        valid_subnet = netmask2subnet(30)
    6280        self.failUnlessEqual(str(valid_subnet), '17179869180')
     81   
     82    def test_getSubnet(self):
     83        from wllogic import getSubnet
     84        self.failUnlessRaises(ValueError, getSubnet, -1)
     85        self.failUnlessRaises(ValueError, getSubnet, 33)
     86       
     87        valid_netmask = getSubnet(30)
     88        self.failUnless(valid_netmask, '255.255.255.252')
     89   
     90    def test_network(self):
     91        from wllogic import network
     92        from wllogic import showaddr
     93        network_addr = showaddr(network('172.18.5.10', 24))
     94        self.failUnlessEqual(network_addr, '172.18.5.0')
    6395
     96    def test_broadcast(self):
     97        from wllogic import broadcast
     98        from wllogic import showaddr
     99       
     100        broadcast_addr = showaddr(broadcast('172.16.5.232', 24))
     101        self.failUnlessEqual(broadcast_addr, '172.16.5.255')
     102
     103        self.failUnlessRaises(ValueError, broadcast, '172.16.5.1', -1)
     104        self.failUnlessRaises(ValueError, broadcast, '172.16.5.1', 33)
     105   
     106    def test_getNetwork(self):
     107        from wllogic import getNetwork
     108        network_addr = getNetwork('172.17.2.2', 30)
     109        self. failUnlessEqual(network_addr, '172.17.2.0')
     110
     111        self.failUnlessRaises(ValueError, getNetwork, '172.17.2.0', -1)
     112        self.failUnlessRaises(ValueError, getNetwork, '172.17.2.0', 33)
     113
     114    def test_getBroadcast(self):
     115        from wllogic import getBroadcast
     116        broadcast_addr = getBroadcast('172.17.2.2', 24)
     117        self.failUnlessEqual(broadcast_addr, '172.17.2.255')
     118       
     119        self.failUnlessRaises(ValueError, getBroadcast, '172.17.2.0', -1)
     120        self.failUnlessRaises(ValueError, getBroadcast, '172.17.2.0', 33)
     121
     122    def test_freeMasterIP(self):
     123        from wllogic import freeMasterIP
     124        from exodus.models import Node, Network
     125
     126        node = Node.objects.create(location_id = 1, \
     127                masterip = '172.16.0.1', name = 'testnode')
     128        network = Network.objects.get(pk=1)
     129        ip = freeMasterIP(network)
     130        self.failIfEqual(ip, '172.16.0.0')
     131        self.failUnlessEqual(ip, '172.16.1.0')
     132       
     133    def test_freePublicAPIP(self):
     134        from wllogic import freePublicAPIP
     135        self.fail('test not implemented')
     136
     137    def test_freeInterlinkIP(self):
     138        from wllogic import freeInterlinkIP
     139        self.fail('Test not implemented')
     140
     141    def test_addInterlinkIP(self):
     142        from wllogic import addInterlinkIP
     143        self.fail('Test not implemented')
     144   
    64145def suite():
    65146    s = unittest.TestSuite()
  • trunk/exodus/urls.py

    r6351 r6357  
    1515urlpatterns = patterns('',
    1616        # generic view
    17         url(r'^$', 'exodus.urls.direct_to_template', {'template': 'index.html'}, "root"),
     17        url(r'^$', 'exodus.urls.direct_to_template', {'template': 'index.html'}, \
     18            "root"),
    1819        (r'^view/nodelist/$', 'exodus.views.viewNodelist'),
    1920        (r'^view/list/(?P<model>.+)/$', 'exodus.views.viewList'),
  • trunk/exodus/views.py

    r6347 r6357  
    1111
    1212from exodus.models import *
    13 from exodus.wllogic import freeMasterIP, newSSIDName, addInterlinkIP, freeInterlinkIP, freePublicAPIP
    14 
    15 def pdebug(level, message):
    16         if level > 0:
    17                 print "DEBUG [%s] %s" % (level, message)
    18 
    19 class GenericHandler():
    20         """Conventions used: type has to to the same name as the dependency object, delet template is named delete<type>.html"""
     13from exodus.wllogic import freeMasterIP, newSSIDName, addInterlinkIP, \
     14                freeInterlinkIP, freePublicAPIP
     15
     16from exodus.utils import pdebug
     17
     18class GenericHandler(object):
     19        """Conventions used: type has to to the same name as the dependency
     20        object, delet template is named delete<type>.html
     21        """
    2122        def __init__(self, request, mode):
    2223                pdebug(100, "Function: GenericHandler.__init__")
     
    5051                                        if self.form.is_valid():
    5152                                                pdebug(100, "Form valid")
    52                                                 # Set response on forehand, to allow override in procedure
     53                                                # Set response on forehand, to allow override \
     54                                                # in procedure
    5355                                                try:
    54                                                         self.response = HttpResponseRedirect(reverse('exodus.views.viewNode', args=[self.node.name]))
     56                                                        self.response = HttpResponseRedirect(reverse( \
     57                                                                'exodus.views.viewNode', args=[self.node.name]))
    5558                                                except (AttributeError, NoReverseMatch):
    56                                                         self.response = HttpResponseRedirect(reverse('exodus.views.viewNodelist'))
     59                                                        self.response = HttpResponseRedirect(reverse( \
     60                                                                'exodus.views.viewNodelist'))
    5761                                               
    5862                                                #Checking whether data did change
     
    6165                                                for key,value in _instance.items():
    6266                                                        if value != _oldInstance[key]:
    63                                                                 pdebug(100, "Key %s changed value '%s' -> '%s'" % (key, _oldInstance[key], value))
     67                                                                pdebug(100, "Key %s changed value '%s' -> '%s'"\
     68                                                                        % (key, _oldInstance[key], value))
    6469                                                                self.is_changed[key] = value
    6570                                               
     
    7580                                except ValueError, message:
    7681                                        self.response = render_to_response('genericForm.html', {
    77                                                 'form': self.form, 'message' : message, 'title' : self.title,
    78                                                 'mode' : mode, 'type' : type, 'object': self.object,
     82                                                'form': self.form, 'message' : message,
     83                                                'title' : self.title, 'mode' : mode,
     84                                                'type' : type, 'object': self.object,
    7985                                                'delInclude' : "delete" + type.capitalize() + ".html",
    8086                                                'addInclude' : "add" + type.capitalize() + ".html",
     
    8389                        message = 'Please edit and submit'
    8490                       
    85                         # Dirty? hack to allow initial form to be filled with date for GET request, no errors raised
     91                        # Dirty? hack to allow initial form to be filled with date \
     92                        # for GET request, no errors raised
    8693                        if request.GET and mode == 'add':
    8794                                self.form = formClass(request.GET, instance=self.object)
     
    108115                pdebug(100, "Function: GenericHandler._delete")
    109116                self.object.delete()
    110                 self.response = HttpResponseRedirect(reverse('exodus.views.viewNode', args=[self.node.name]))
     117                self.response = HttpResponseRedirect(reverse('exodus.views.viewNode',\
     118                                args=[self.node.name]))
    111119       
    112120        def _cancel(self):
    113121                pdebug(100, "Function: GenericHandler._cancel")
    114                 self.response = HttpResponseRedirect(reverse('exodus.views.viewNode', args=[self.node.name]))
     122                self.response = HttpResponseRedirect(reverse('exodus.views.viewNode',\
     123                                 args=[self.node.name]))
    115124                #self.response = HttpResponseRedirect(reverse('exodus.views.viewNodelist'))
    116125       
     
    136145                        self.publicAP = PublicAP(iface=self.interface)
    137146                else:
    138                         self.publicAP =  PublicAP.objects.get(iface=self.interface, pk=publicAP)
    139                 GenericHandler.__init__(self, request, mode)
    140 
     147                        self.publicAP =  PublicAP.objects.get(iface=self.interface, \
     148                                        pk=publicAP)
     149                super(PublicAPHandler, self).__init__(request, mode)
     150                #GenericHandler.__init__(self, request, mode)
    141151
    142152        def _add(self):
     
    148158                _instance.dhcpstop = 2
    149159                # If wireless generate ssid name
    150                 _instance.ssid = newSSIDName(_instance.iface.node, _instance.iface, 'omni')
     160                _instance.ssid = newSSIDName(_instance.iface.node, _instance.iface, \
     161                                'omni')
    151162                _instance.save()
    152163
     
    156167        return handler.render_to_response()
    157168
    158 
    159 
    160169#
    161170# Interface
     
    172181                        self.interface = Interface(node=self.node)
    173182                else:
    174                         self.interface = Interface.objects.get(node=self.node, iface=interface)
    175                 GenericHandler.__init__(self, request, mode)
     183                        self.interface = Interface.objects.get(node=self.node, \
     184                                iface=interface)
     185                super(InterfaceHandler, self).__init__(request, mode)
    176186
    177187        def _add(self):
     
    189199                        raise ValueError,'Type of local and remote interface needs to match'
    190200                if str(_instance.type) != "eth":
    191                         _instance.ssid = newSSIDName(_instance.node, _instance.iface, 'unused')
     201                        _instance.ssid = newSSIDName(_instance.node, _instance.iface, \
     202                                        'unused')
    192203                        _instance.channel = '1'
    193204                        _instance.mode = 1 # set to master
    194205               
    195206                # Only change IP if changes in interface link/mask or new of course :-)
    196                 if self.mode == 'add' or self.is_changed.has_key('link') or self.is_changed.has_key('netmask'):
     207                if self.mode == 'add' or self.is_changed.has_key('link') or \
     208                                self.is_changed.has_key('netmask'):
    197209                        if not _instance.link:
    198210                                _instance.ip = freeInterlinkIP(_instance)
     
    200212                                _instance.ip = addInterlinkIP(_instance.link)
    201213
    202                 # XXX: Change in netmask requires full range of netmask changes on slaves
     214                # XXX: Change in netmask requires full range of netmask changes \
     215                # on slaves
    203216                _instance.save()
    204217                #Dirty to hack to get reference to self working
     
    207220                        _instance.save()
    208221
    209 
    210222def genericInterface(request, node, interface, mode):
    211223        pdebug(100, "Function: genericInterface")
     
    227239                else:
    228240                        self.node = Node.objects.get(name=node)
    229                 GenericHandler.__init__(self, request, mode)
     241                super(NodeHandler, self).__init__(request, mode)
    230242
    231243        def _add(self):
     
    233245                # input a valid master ip into new_data
    234246                _instance  = self.form.save(commit=False)
    235                 _instance.masterip = freeMasterIP(_instance)
     247                import pdb; pdb.set_trace() ;
     248                _instance.masterip = freeMasterIP(_instance.network)
    236249                _instance.save()
    237                 self.response = HttpResponseRedirect(reverse('exodus.views.viewNode', args=[_instance.name]))
     250                self.response = HttpResponseRedirect(reverse('exodus.views.viewNode', \
     251                                args=[_instance.name]))
    238252
    239253        def _delete(self):
     
    246260                self.object.delete()
    247261                # As node is deleted, goto overview page
    248                 self.response = HttpResponseRedirect(reverse('exodus.views.viewNodelist'))
     262                self.response = HttpResponseRedirect(reverse( \
     263                                        'exodus.views.viewNodelist'))
    249264
    250265        def _cancel(self):
    251266                pdebug(100, "Function: NodeHandler._cancel")
    252267                if self.mode == 'new':
    253                         self.response = HttpResponseRedirect(reverse('exodus.views.viewNodelist'))
    254                 else:
    255                         self.response = HttpResponseRedirect(reverse('exodus.views.viewNode', args=[self.node.name]))
     268                        self.response = HttpResponseRedirect(reverse( \
     269                                        'exodus.views.viewNodelist'))
     270                else:
     271                        self.response = HttpResponseRedirect(reverse( \
     272                                        'exodus.views.viewNode', args=[self.node.name]))
    256273
    257274def genericNode(request, node, mode):
     
    261278
    262279#
    263 # Location
     280# location
    264281class LocationForm(forms.ModelForm):
    265282        class Meta:
     
    273290                else:
    274291                        self.location = Location.objects.get(description=location)
    275                 GenericHandler.__init__(self, request, mode)
     292       
     293                super(LocationHandler,self).__init__(request, mode)
    276294
    277295        def _add(self):
     
    279297                _instance = self.form.save()
    280298                # After adding a location, allow adding a Node with this location
    281                 self.response = HttpResponseRedirect(
    282                   reverse('exodus.views.genericNode', args=["add", "new"]) + "?location=%i" % _instance.pk)
     299                self.response = HttpResponseRedirect( \
     300                                reverse('exodus.views.genericNode', args=["add", "new"]) + \
     301                                "?location=%i" % _instance.pk)
    283302
    284303        def _delete(self):
    285304                pdebug(100, "Function: LocationHandler._delete")
    286305                self.object.delete()
    287                 self.response = HttpResponseRedirect(reverse('exodus.views.viewNodelist'))
     306                self.response = HttpResponseRedirect(reverse( \
     307                                'exodus.views.viewNodelist'))
    288308
    289309        def _cancel(self):
    290310                pdebug(100, "Function: LocationHandler._cancel")
    291                 self.response = HttpResponseRedirect(reverse('exodus.views.viewNodelist'))
     311                self.response = HttpResponseRedirect(reverse( \
     312                                'exodus.views.viewNodelist'))
    292313
    293314#
     
    307328                'named.conf',
    308329                'resolv.conf' )
    309         return render_to_response('viewNodelist.html', {'nodes' : nodes, 'configFiles' : configFiles})
     330        return render_to_response('viewNodelist.html', {'nodes' : nodes, \
     331                        'configFiles' : configFiles})
    310332
    311333def configFile(request, version, node, file):
     
    318340       
    319341        templateFile = version + '/' + file
    320         return render_to_response(templateFile, {'node' : node, 'server' : server},
    321           mimetype='text/plain')
     342        return render_to_response(templateFile, {'node' : node, 'server' : server},\
     343                        mimetype='text/plain')
    322344
    323345#
     
    334356                else:
    335357                        self.dnsServer= DnsServer.objects.get(ipaddress=dnsServer)
    336                 GenericHandler.__init__(self, request, mode)
     358                super(DnsServerHandler, self).__init__(request, mode)
    337359
    338360        def _add(self):
    339361                pdebug(100, "Function: DnsServerHandler._add")
    340362                _instance = self.form.save()
    341                 self.response = HttpResponseRedirect(reverse('exodus.views.viewList', args=['dnsServer']))
     363                self.response = HttpResponseRedirect(reverse('exodus.views.viewList', \
     364                                args=['dnsServer']))
    342365
    343366        def _delete(self):
    344367                pdebug(100, "Function: DnsServerHandler._delete")
    345368                self.object.delete()
    346                 self.response = HttpResponseRedirect(reverse('exodus.views.viewList', args=['dnsServer']))
     369                self.response = HttpResponseRedirect(reverse('exodus.views.viewList', \
     370                                args=['dnsServer']))
    347371
    348372        def _cancel(self):
    349373                pdebug(100, "Function: DnsServerHandler._cancel")
    350                 self.response = HttpResponseRedirect(reverse('exodus.views.viewList', args=['dnsServer']))
     374                self.response = HttpResponseRedirect(reverse('exodus.views.viewList', \
     375                                args=['dnsServer']))
    351376
    352377def genericModel(request, model, mode, object):
     
    360385def viewList(request, model):
    361386        pdebug(100, "Function: viewList")
    362         """Standard interface for simple overview pages, with view/edit/delete buttons on it"""
     387        """Standard interface for simple overview pages, with view/edit/delete
     388        buttons on it
     389        """
    363390        modelURL = model
    364391        model = model[0].upper() + model[1::]
     
    366393        model = eval(model)
    367394        objects = model.objects.all()
    368         return render_to_response('viewList.html', {'objects': objects, 'modelURL' : modelURL, 'modelName' : modelName})
     395        return render_to_response('viewList.html', {'objects': objects, \
     396                        'modelURL' : modelURL, 'modelName' : modelName})
  • trunk/exodus/wllogic.py

    r6354 r6357  
    22
    33from exodus.models import Node, Interface, PublicAP
     4from exodus.settings import MASTERIP_NETMASK
    45
    56def newSSIDName(node, nic, desc):
     
    1516#
    1617def parseaddr(s):
     18        """Remember when using an address has a section which is higher than
     19        255, such as 172.16.0.256, the ip address from showaddr turns out as
     20        172.16.1.0
     21        """
    1722        f = s.split('.')
    1823        return (long(f[0]) << 24L) + \
     
    2530
    2631def netmask2subnet(s):
    27     """IPv4 netmask to subnet"""
    28     if s < 0 :
    29         raise ValueError, 'subnet is too small'
    30     return (0xffffffff << (32 - s))
     32        """IPv4 netmask to subnet"""
     33        if s < 0 :
     34                raise ValueError, 'subnet is too small'
     35        return (0xffffffff << (32 - s))
    3136
    3237def getSubnet(netmask):
     
    3944def broadcast(address, netmask):
    4045        """IPv4 network address when address and netmask are given"""
     46        if netmask > 32:
     47                raise ValueError, 'netmask too large'
    4148        return(parseaddr(address) | 0xffffffff >> netmask)
    4249
     
    4855
    4956#XXX: freeMasterIP/addInterlinkIP should be more general by writing a function
    50 #     with finds a range based on a given range, taken ip/netmask and requested subnet
     57#     which finds a range based on a given range, taken ip/netmask and
     58#     requested subnet
    5159
    52 def freeMasterIP(node):
     60def freeMasterIP(city_network, netmask = None):
     61        if netmask == None:
     62                netmask = MASTERIP_NETMASK
     63
     64        if netmask < 0 or netmask > 32 :
     65                raise ValueError, 'netmask out of bounds'       
     66
    5367        taken = {}
    5468
    5569        for node in Node.objects.all():
    56                 addr = network(node.masterip,24)
     70                addr = network(node.masterip, netmask)
    5771                taken[addr] = 1
    58 
    59         #Currently claiming a /24 for every node
    60         size = 24
    61         numaddrs = 1 << (32 - size)
     72   
     73        numaddrs = 1 << (32 - netmask)
    6274
    6375        #XXX: No out of bond checking done yet
    64         i = parseaddr(node.network.ipspacestart)
     76        i = parseaddr(city_network.ipspacestart)
    6577        while taken.has_key(i):
    6678                i = i + numaddrs
     
    6981
    7082#
    71 # XXX: Needs merging with freeInterlinkIP as interface could have both AP, interlink difined on one link
     83# XXX: Needs merging with freeInterlinkIP as interface could have both AP,
     84# interlink defined on one link
    7285def freePublicAPIP(masterLink, netmask):
    7386        taken = {}
Note: See TracChangeset for help on using the changeset viewer.