Ignore:
Timestamp:
Sep 2, 2009 10:36:18 AM (15 years ago)
Author:
Ted Faber <faber@…>
Branches:
axis_example, compt_changes, info-ops, master, version-2.00, version-3.01, version-3.02
Children:
f9ef40b
Parents:
cc8d8e9
Message:

checkpoint

File:
1 edited

Legend:

Unmodified
Added
Removed
  • fedd/federation/topdl.py

    rcc8d8e9 r6c57fe9  
    11#!/usr/local/bin/python
     2
     3import re
    24
    35class base:
     
    3133        return rv
    3234
    33 
     35    def set_attribute(self, key, value):
     36        attrs = getattr(self, 'attribute', None)
     37        if attrs is None:
     38            return
     39        for a in attrs:
     40            if a.attribute == key:
     41                a.value = value
     42                break
     43        else:
     44            attrs.append(Attribute(key, value))
    3445
    3546class ConsistencyError(RuntimeError): pass
     
    207218        if self.attribute:
    208219            rv['attribute'] = [ a.to_dict() for a in self.attribute ]
     220        return rv
     221
     222class ID(base):
     223    def __init__(self, fedid=None, uuid=None, uri=None, localname=None,
     224            kerberosUsername=None):
     225        self.fedid=fedid
     226        self.uuid = uuid
     227        self.uri = uri
     228        self.localname = localname
     229        self.kerberosUsername = kerberosUsername
     230
     231    def clone(self):
     232        return ID(self.fedid, self.uuid, self.uri, self.localname,
     233                self.kernberosUsername)
     234
     235    def to_dict(self):
     236        rv = { }
     237        if self.fedid: rv['fedid'] = self.fedid
     238        if self.uuid: rv['uuid'] = self.uuid
     239        if self.uri: rv['uri'] = self.uri
     240        if self.localname: rv['localname'] = self.localname
     241        if self.kerberosUsername: rv['kerberosUsername'] = self.kerberosUsername
    209242        return rv
    210243
     
    256289        return { 'computer': rv }
    257290
     291
     292class Testbed(base):
     293    def __init__(self, uri, type, interface=[], attribute=[]):
     294        self.uri = uri
     295        self.type = type
     296        self.interface = [ self.init_class(Interface, c) \
     297                for c in self.make_list(interface) ]
     298        self.attribute = [ self.init_class(Attribute, c) \
     299                for c in self.make_list(attribute) ]
     300
     301    def clone(self):
     302        return Testbed(self.uri, self.type,
     303                interface=[i.clone() for i in self.interface],
     304                attribute=[a.cone() for a in self.attribute])
     305
     306    def to_dict(self):
     307        rv = { }
     308        if self.uri: rv['uri'] = self.uri
     309        if self.type: rv['type'] = self.type
     310        if self.interface:
     311            rv['interface'] = [ i.to_dict() for i in self.interface]
     312        if self.attribute:
     313            rv['attribute'] = [ a.to_dict() for a in self.attribute]
     314        return { 'testbed': rv }
     315
     316class Segment(base):
     317    def __init__(self, id, type, uri, interface=[], attribute=[]):
     318        self.id = self.init_class(ID, id)
     319        self.type = type
     320        self.uri = uri
     321        self.interface = [ self.init_class(Interface, c) \
     322                for c in self.make_list(interface) ]
     323        self.attribute = [ self.init_class(Attribute, c) \
     324                for c in self.make_list(attribute) ]
     325
     326    def clone(self):
     327        return Segment(self.id.clone(), self.type, self.uri,
     328                interface=[i.clone() for i in self.interface],
     329                attribute=[a.clone() for a in attribute])
     330
     331    def to_dict(self):
     332        rv = { }
     333        if self.id: rv['id'] = self.id.to_dict()
     334        if self.type: rv['type'] = self.type
     335        if self.uri: rv['uri'] = self.uri
     336        if self.interface:
     337            rv['interface'] = [ i.to_dict() for i in self.interface ]
     338        if self.attribute:
     339            rv['attribute'] = [ a.to_dict() for a in self.attribute ]
     340        return { 'segment': rv }
     341
     342
    258343class Other(base):
    259344    def __init__(self, interface=[], attribute=[]):
     
    268353
    269354    def to_dict(self):
     355        rv = {}
    270356        if self.interface:
    271357            rv['interface'] = [ i.to_dict() for i in self.interface ]
    272358        if self.attribute:
    273359            rv['attribute'] = [ a.to_dict() for a in self.attribute ]
     360        return {'other': rv }
    274361
    275362
     
    285372        classmap = {
    286373                'computer': Computer,
     374                'testbed': Testbed,
     375                'segment': Segment,
    287376                'other': Other,
    288377            }
     
    489578    return { 'node': nodes, 'lan': lans }
    490579
    491 def topology_to_ns2(t):
     580def to_tcl_name(n):
     581    t = re.subst('-(\d+)', '(\1)', n)
     582    return t
     583
     584def generate_portal_image_filter(image):
     585    def rv(e):
     586        s =""
     587        if isinstance(e, Computer):
     588            gw = e.get_attribute('portal')
     589            if gw:
     590                s = "tb-set-node-os $%s %s" % (to_tcl_name(e.name[0]), image)
     591        return s
     592    return rv
     593
     594def generate_portal_command_filter(cmd):
     595    def rv(e):
     596        s =""
     597        if isinstance(e, Computer):
     598            gw = e.get_attribute('portal')
     599            if gw:
     600                s = "%s $%s" % (cmd, to_tcl_name(e.name[0]))
     601        return s
     602    return rv
     603
     604
     605def topology_to_ns2(t, filters=[]):
    492606    out = """
    493607set ns [new Simulator]
     
    495609
    496610"""
     611
    497612    for e in t.elements:
    498613        rpms = ""
    499614        tarfiles = ""
    500615        if isinstance(e, Computer):
    501             name = e.name[0]
     616            name = to_tcl_name(e.name[0])
    502617            out += "set %s [$ns node]\n" % name
    503618            if e.os and len(e.os) == 1:
     
    517632            if startcmd:
    518633                out+= 'tb-set-node-startcmd $%s "%s"\n' % (name, startcmd)
     634            for f in filters:
     635                out += f(e)
    519636            out+= "\n"
    520637   
     
    525642        else:
    526643            delay = 0
    527         name = s.name or "sub%d" % idx
     644        name = to_tcl_name(s.name or "sub%d" % idx)
    528645
    529646        if len(s.interfaces) > 2:
    530647            # Lan
    531             members = [ i.element.name[0] for i in s.interfaces]
    532             out += 'set %s [$ns make-lan "%s" %f %fms ]\n' % \
     648            members = [ to_tcl_name("$%s") % i.element.name[0] \
     649                    for i in s.interfaces]
     650            out += 'set %s [$ns make-lan "%s" %fkb %fms ]\n' % \
    533651                    (name, " ".join(members), s.capacity.rate, delay)
    534652            if loss:
     
    541659                    out += "tb-set-ip-lan $%s $%s %s\n" % (e.name, name, ip)
    542660                if i.capacity and i.capacity.rate != s.capacity.rate:
    543                     out += "tb-set-node-lan-bandwidth $%s $%s %f\n" % \
    544                             (e.name[0], name, i.capacity.rate)
     661                    out += "tb-set-node-lan-bandwidth $%s $%s %fkb\n" % \
     662                            (to_tcl_name(e.name[0]), name, i.capacity.rate)
    545663                if i.latency and i.latency.time != delay:
    546664                    out += "tb-set-node-lan-delay $%s $%s %fms\n" % \
    547                             (e.name[0], name, i.latency.time)
     665                            (to_tcl_name(e.name[0]), name, i.latency.time)
    548666                iloss = i.get_attribute('loss')
    549667                if loss and iloss != loss :
    550668                    out += "tb-set-node-lan-loss $%s $%s %f" % \
    551                             (e.name[0], name, float(loss))
     669                            (to_tcl_name(e.name[0]), name, float(loss))
    552670            out+= "\n"
    553671        elif len(s.interfaces) == 2:
     
    555673            t = s.interfaces[1]
    556674
    557             out += "set %s [$ns duplex-link $%s $%s %f %fms DropTail]\n" %\
    558                     (name, f.element.name[0], t.element.name[0],
     675            out += "set %s [$ns duplex-link $%s $%s %fkb %fms DropTail]\n" %\
     676                    (name, to_tcl_name(f.element.name[0]),
     677                            to_tcl_name(t.element.name[0]),
    559678                            s.capacity.rate, delay)
    560679            if loss:
     
    577696                    else: loss = loss or 0.0
    578697
    579                     out += "tb-set-link-simplex-params $%s $%s %fms %f %f\n" % \
    580                             (name, i.element.name[0], delay, cap, loss)
     698                    out += "tb-set-link-simplex-params $%s $%s %fms %fkb %f\n"\
     699                            % (name, to_tcl_name(i.element.name[0]),
     700                                    delay, cap, loss)
    581701            out+= "\n"
     702        for f in filters:
     703            out+= f(s)
    582704    out+="""
    583705$ns run
Note: See TracChangeset for help on using the changeset viewer.