Changeset 617592b


Ignore:
Timestamp:
Feb 20, 2010 5:27:56 PM (15 years ago)
Author:
Ted Faber <faber@…>
Branches:
axis_example, compt_changes, info-ops, master, version-3.01, version-3.02
Children:
6af3226
Parents:
0f06528
Message:

More dragon cleanup. Config files look right, but need to be tested.

Location:
fedd/federation
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • fedd/federation/emulab_access.py

    r0f06528 r617592b  
    917917
    918918            rv = None
     919            print info
    919920            for i in info:
    920                 if i.get('portal', "") == key:
     921                if key == i.get('portal', "") or \
     922                        key in [e.get('element', "") \
     923                        for e in i.get('member', [])]:
    921924                    rv = i.copy()
    922925                    break
     926
    923927            else:
    924928                return rv
     
    10491053
    10501054
    1051     def generate_ns2(self, topo, expfn, softdir, master):
    1052         def dragon_commands(e):
    1053             s = ""
    1054             if isinstance(e, topdl.Computer):
    1055                 for i in e.interface:
    1056                     vlan = i.get_attribute('dragon_vlan')
    1057                     if vlan:
    1058                         type = i.get_attribute('dragon_type')
    1059                         ip = i.get_attribute('ip4_address')
    1060                         if type == 'link':
    1061                             s = ("tb-allow-external $%s dragonportal " + \
    1062                                     "ip %s vlan %s\n") % \
    1063                                     (topdl.to_tcl_name(e.name[0]), ip, vlan)
    1064                         elif type == 'lan':
    1065                             s = ("tb-allow-external $%s dragonportal " + \
    1066                                     "ip %s vlan %s usurp %s\n") % \
    1067                                     (topdl.to_tcl_name(e.name[0]), ip, vlan,
    1068                                         i.substrate[0])
    1069                         else:
    1070                             raise service_error(service_error_internal,
    1071                                     "Unknown DRAGON type %s" % type)
    1072             return s
    1073 
    1074         def not_dragon(e):
    1075             return all([not i.get_attribute('dragon_vlan') \
    1076                     for i in e.interface])
     1055    def generate_ns2(self, topo, expfn, softdir, master, connInfo):
     1056        class dragon_commands:
     1057            """
     1058            Functor to spit out approrpiate dragon commands for nodes listed in
     1059            the connectivity description.  The constructor makes a dict mapping
     1060            dragon nodes to their parameters and the __call__ checks each
     1061            element in turn for membership.
     1062            """
     1063            def __init__(self, map):
     1064                self.node_info = map
     1065
     1066            def __call__(self, e):
     1067                s = ""
     1068                if isinstance(e, topdl.Computer):
     1069                    if self.node_info.has_key(e.name[0]):
     1070                        i = self.node_info[e.name[0]]
     1071                        for ifname, vlan, type in i:
     1072                            print "Checking %s" % e.name[0]
     1073                            for i in e.interface:
     1074                                print "interface s %s %s" % (i.name, ifname)
     1075                                if i.name == ifname:
     1076                                    addr = i.get_attribute('ip4_address')
     1077                                    subs = i.substrate[0]
     1078                                    break
     1079                            else:
     1080                                raise service_error(service_error.internal,
     1081                                        "No interface %s on element %s" % \
     1082                                                (ifname, e.name[0]))
     1083                            if type =='link':
     1084                                s = ("tb-allow-external $%s dragonportal " + \
     1085                                        "ip %s vlan %s\n") % \
     1086                                        (e.name[0], addr, vlan)
     1087                            elif type =='lan':
     1088                                s = ("tb-allow-external $%s dragonportal " + \
     1089                                        "ip %s vlan %s usurp %s\n") % \
     1090                                        (e.name[0], addr, vlan, subs)
     1091                            else:
     1092                                raise service_error(service_error_internal,
     1093                                        "Unknown DRAGON type %s" % type)
     1094                return s
     1095
     1096        class not_dragon:
     1097            def __init__(self, map):
     1098                self.nodes = set(map.keys())
     1099
     1100            def __call__(self, e):
     1101                return e.name[0] not in self.nodes
    10771102
    10781103        t = topo.clone()
     1104
     1105        dragon_map = { }
     1106        for i in [ i for i in connInfo if i['type'] == 'transit']:
     1107            for a in i.get('fedAttr', []):
     1108                if a['attribute'] == 'vlan_id':
     1109                    vlan = a['value']
     1110                    break
     1111            else:
     1112                raise service_error(service_error.internal,
     1113                        "No vlan tag")
     1114            members = i.get('member', [])
     1115            if len(members) > 1: type = 'lan'
     1116            else: type = 'link'
     1117
     1118            try:
     1119                for m in members:
     1120                    if dragon_map.has_key(m['element']):
     1121                        dragon_map[m['element']].append(( m['interface'],
     1122                            vlan, type))
     1123                    else:
     1124                        dragon_map[m['element']] = [( m['interface'],
     1125                            vlan, type),]
     1126            except KeyError:
     1127                raise service_error(service_error.req,
     1128                        "Missing connectivity info")
    10791129
    10801130        # The startcmds for master and slave testbeds
     
    11091159                        e.set_attribute('startup', node_cmd)
    11101160
     1161                dinf = [i[0] for i in dragon_map.get(e.name[0], []) ]
    11111162                # Remove portal interfaces that do not connect to DRAGON
    11121163                e.interface = [i for i in e.interface \
    1113                         if not i.get_attribute('portal') or \
    1114                             i.get_attribute('dragon_vlan')]
     1164                        if not i.get_attribute('portal') or i.name in dinf ]
    11151165
    11161166        t.substrates = [ s.clone() for s in t.substrates ]
     
    11251175
    11261176        if self.attrs.has_key('dragon'):
    1127             add_filter = not_dragon
    1128             filters.append(dragon_commands)
     1177            add_filter = not_dragon(dragon_map)
     1178            filters.append(dragon_commands(dragon_map))
    11291179        else:
    11301180            add_filter = None
     
    13121362                    services)
    13131363            self.generate_ns2(topo, expfile,
    1314                     "/proj/%s/software/%s/" % (proj, ename), master)
     1364                    "/proj/%s/software/%s/" % (proj, ename), master, connInfo)
    13151365
    13161366            starter = self.start_segment(keyfile=self.ssh_privkey_file,
  • fedd/federation/experiment_control.py

    r0f06528 r617592b  
    831831        # Add attributes to parameter space.  We don't allow attributes to
    832832        # overlay any parameters already installed.
    833         for a in r['fedAttr']:
     833        for a in r.get('fedAttr', []):
    834834            try:
    835835                if a['attribute'] and \
     
    923923            try:
    924924                self.log.debug("Calling StartSegment at %s " % uri)
    925                 print req
    926925                r = self.caller(uri, req, self.cert_file, self.cert_pwd,
    927926                        self.trusted_certs)
     
    10391038                vlan = get_vlan(ss.response)
    10401039                if vlan is not None:
    1041                     for k, t in topo.items():
    1042                         for e in t.elements:
    1043                             for i in e.interface:
    1044                                 vl = i.get_attribute('dragon_vlan')
    1045                                 if vl is not None and vl == to_repl:
    1046                                     i.set_attribute('dragon_vlan', vlan)
     1040                    for v in connInfo.values():
     1041                        for i in v:
     1042                            for a in i.get('fedAttr', []):
     1043                                if a.get('attribute', "") == 'vlan_id' and \
     1044                                        a.get('value', "") == to_repl:
     1045                                    a['value'] = vlan
    10471046            else:
    10481047                break
     
    13551354                    )
    13561355            ifaces.append(inf)
    1357         info = {
    1358                 "type" : conn_type,
    1359                 "portal": myname,
    1360                 'peer': desthost,
    1361                 'fedAttr': [
    1362                         { 'attribute': 'masterdomain', 'value': mdomain},
    1363                         { 'attribute': 'masterexperiment', 'value':
    1364                             "%s/%s" % (mproject, eid)},
    1365                         { 'attribute': 'active', 'value': active},
    1366                         # Move to SMB service description
    1367                         { 'attribute': 'masteruser', 'value': muser},
    1368                         { 'attribute': 'smbshare', 'value': smbshare},
    1369                     ],
    1370                 }
    1371 
    1372         if conn_type == 'transit':
    1373             info['member'] = [ { 'element': myname, 'interface': 'inf000'} ]
    1374         if conn_attrs:
    1375             info['fedAttr'].extend(con_attrs)
     1356        if conn_type == "ssh":
     1357            info = {
     1358                    "type" : conn_type,
     1359                    "portal": myname,
     1360                    'peer': desthost,
     1361                    'fedAttr': [
     1362                            { 'attribute': 'masterdomain', 'value': mdomain},
     1363                            { 'attribute': 'masterexperiment', 'value':
     1364                                "%s/%s" % (mproject, eid)},
     1365                            { 'attribute': 'active', 'value': active},
     1366                            # Move to SMB service description
     1367                            { 'attribute': 'masteruser', 'value': muser},
     1368                            { 'attribute': 'smbshare', 'value': smbshare},
     1369                        ],
     1370                    }
     1371        else:
     1372            info = None
    13761373
    13771374        return (topdl.Computer(
     
    14551452
    14561453    def create_dragon_substrate(self, sub, topo, tbs, tbparams, master, eid,
    1457             connInfo):
     1454            connInfo, peer={ }):
    14581455        """
    14591456        Add attribiutes to the various elements indicating that they are to be
     
    14671464            else: return None
    14681465
     1466        mdomain = tbparams[master].get('domain', '.example.com')
     1467        mproject = tbparams[master].get('project', 'project')
    14691468        # dn is the number of previously created dragon nets.  This routine
    14701469        # creates a net numbered by dn
     
    14731472        # the global topology
    14741473        count = { }
     1474        node = { }
    14751475        for e in [ i.element for i in sub.interfaces ]:
    14761476            tb = e.get_attribute('testbed')
    14771477            count[tb] = count.get(tb, 0) + 1
     1478            node[tb] = i.get_attribute('ip4_address')
     1479
    14781480
    14791481        # Set the attributes in the copies that will allow setup of dragon
     
    14841486                if not connInfo.has_key(tb):
    14851487                    connInfo[tb] = [ ]
     1488
     1489                # This may need another look, but only a service gateway will
     1490                # look at the active parameter, and these are only inserted to
     1491                # connect to the master.
     1492                active = "%s" % ( tb == 'master')
    14861493                info = {
    14871494                        'type': 'transit',
     
    14891496                            'element': i.element.name[0],
    14901497                            'interface': i.name
    1491                             } for i in s.interfaces ],
    1492                         'fedAttr': [ {
    1493                             'attribute': 'vlan_id',
    1494                             'value': 'unassigned%d' % dn
    1495                             } ]
     1498                            } for i in s.interfaces \
     1499                                    if isinstance(i.element, topdl.Computer) ],
     1500                        'fedAttr': [
     1501                            { 'attribute': 'vlan_id',
     1502                                'value': 'unassigned%d' % dn },
     1503                            { 'attribute': 'masterdomain', 'value': mdomain},
     1504                            { 'attribute': 'masterexperiment', 'value':
     1505                                "%s/%s" % (mproject, eid)},
     1506                            { 'attribute': 'active', 'value': active},
     1507                            ],
    14961508                        }
     1509                if peer.has_key(tb):
     1510                    info['peer'] = peer[tb]
    14971511                connInfo[tb].append(info)
    14981512            else:
     
    16311645                    ('portal','true'),
    16321646                    ('ip4_address', "%s" % ip_addr(myip)),)),),
    1633                 conn_type="transit",
    1634                 conn_attrs = [ {
    1635                     'attribute': 'vlan_id', 'value': 'unassigned%d' % idx
    1636                     }])
     1647                conn_type="transit")
    16371648        if self.fedkit:
    16381649            self.add_kit(portal, self.fedkit)
     
    16401651            self.add_kit(portal, self.gatewaykit)
    16411652
    1642         return portal, info
     1653        return portal
    16431654
    16441655    def add_portals(self, top, topo, eid, master, tbparams, ip_allocator,
     
    17211732                                ],
    17221733                            )
    1723                     portal, info = self.new_dragon_portal(tb, master,
     1734                    portal = self.new_dragon_portal(tb, master,
    17241735                            master, eid, dip, mip, idx, csub, tbparams)
    17251736                    topo[tb].substrates.append(csub)
    17261737                    topo[tb].elements.append(portal)
    17271738                    topo[tb].elements.append(seg)
    1728                     if not connInfo.has_key(tb):
    1729                         connInfo[tb] = [info]
    1730                     else:
    1731                         connInfo[tb].append(info)
    17321739
    17331740                    mcsub = csub.clone()
     
    17521759                                ],
    17531760                            )
    1754                     portal, info = self.new_dragon_portal(master, tb, master,
     1761                    portal = self.new_dragon_portal(master, tb, master,
    17551762                            eid, mip, dip, idx, mcsub, tbparams)
    17561763                    topo[master].substrates.append(mcsub)
    17571764                    topo[master].elements.append(portal)
    17581765                    topo[master].elements.append(seg)
    1759                     if not connInfo.has_key(master):
    1760                         connInfo[master] = [info]
    1761                     else:
    1762                         connInfo[master].append(info)
     1766                    for t in (master, tb):
     1767                        topo[t].incorporate_elements()
    17631768
    17641769                    self.create_dragon_substrate(csub, topo,
    1765                             {tb: 1, master:1}, tbparams, master, eid)
     1770                            {tb: 1, master:1}, tbparams, master, eid, connInfo,
     1771                            {tb: ip_addr(mip), master: ip_addr(dip)})
    17661772                else:
    17671773                    self.add_control_portal(master, tb, master, eid, topo,
     
    21042110                tb = t.get_attribute('testbed')
    21052111                if tb:
    2106                     self.get_access(tb, None, user, tbparams, master,
     2112                    self.get_access(tb, None, tbparams, master,
    21072113                            export_project, access_user, services)
    21082114                    tbparams[k] = tbparams[tb]
     
    21962202            ]
    21972203
     2204        # transit and disconnected testbeds may not have a connInfo entry.
     2205        # Fill in the blanks.
     2206        for t in allocated.keys():
     2207            if not connInfo.has_key(t):
     2208                connInfo[t] = { }
     2209
    21982210        # Start a thread to do the resource allocation
    21992211        t  = Thread(target=self.allocate_resources,
Note: See TracChangeset for help on using the changeset viewer.