Changeset 5334044


Ignore:
Timestamp:
May 27, 2010 2:25:36 AM (14 years ago)
Author:
Ted Faber <faber@…>
Branches:
axis_example, compt_changes, info-ops, master, version-3.01, version-3.02
Children:
1962a5b
Parents:
0de1b94
Message:

Add service to selectively hide hosts from other testbeds

Location:
fedd/federation
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • fedd/federation/emulab_access.py

    r0de1b94 r5334044  
    131131        # XXX: Configurable
    132132        self.exports = set(('SMB', 'seer', 'tmcd', 'userconfig',
    133             'project_export', 'local_seer_control', 'seer_master'))
    134         self.imports = set(('SMB', 'seer', 'userconfig', 'seer_master'))
     133            'project_export', 'local_seer_control', 'seer_master',
     134            'hide_hosts'))
     135        self.imports = set(('SMB', 'seer', 'userconfig', 'seer_master',
     136            'hide_hosts'))
    135137
    136138        if not self.local_seer_image or not self.local_seer_software:
     
    583585        return confid, confcert
    584586
    585     def export_SMB(self, id, state, project, user):
     587    def export_SMB(self, id, state, project, user, attrs):
    586588        return {
    587589                'id': id,
     
    596598                }
    597599
    598     def export_seer(self, id, state, project, user):
     600    def export_seer(self, id, state, project, user, attrs):
    599601        return {
    600602                'id': id,
     
    604606                }
    605607
    606     def export_local_seer(self, id, state, project, user):
     608    def export_local_seer(self, id, state, project, user, attrs):
    607609        return {
    608610                'id': id,
     
    612614                }
    613615
    614     def export_seer_master(self, id, state, project, user):
     616    def export_seer_master(self, id, state, project, user, attrs):
    615617        return {
    616618                'id': id,
     
    620622                }
    621623
    622     def export_tmcd(self, id, state, project, user):
     624    def export_tmcd(self, id, state, project, user, attrs):
    623625        return {
    624626                'id': id,
     
    628630                }
    629631
    630     def export_userconfig(self, id, state, project, user):
     632    def export_userconfig(self, id, state, project, user, attrs):
    631633        if self.userconfdir and self.userconfcmd \
    632634                and self.userconfurl:
     
    645647            return None
    646648
     649    def export_hide_hosts(self, id, state, project, user, attrs):
     650        return {
     651                'id': id,
     652                'name': 'hide_hosts',
     653                'visibility': 'export',
     654                'fedAttr': [ x for x in attrs \
     655                        if x.get('attribute', "") == 'hosts'],
     656                }
     657
    647658    def export_services(self, sreq, project, user):
    648659        exp = [ ]
     
    653664            sname = s.get('name', '')
    654665            svis = s.get('visibility', '')
     666            sattrs = s.get('fedAttr', [])
    655667            if svis == 'export':
    656668                if sname in self.exports:
    657669                    id = s.get('id', 'no_id')
    658670                    if sname == 'SMB':
    659                         exp.append(self.export_SMB(id, state, project, user))
     671                        exp.append(self.export_SMB(id, state, project, user,
     672                            sattrs))
    660673                    elif sname == 'seer':
    661                         exp.append(self.export_seer(id, state, project, user))
     674                        exp.append(self.export_seer(id, state, project, user,
     675                            sattrs))
    662676                    elif sname == 'tmcd':
    663                         exp.append(self.export_tmcd(id, state, project, user))
     677                        exp.append(self.export_tmcd(id, state, project, user,
     678                            sattrs))
    664679                    elif sname == 'userconfig':
    665680                        exp.append(self.export_userconfig(id, state,
    666                             project, user))
     681                            project, user, sattrs))
    667682                    elif sname == 'project_export':
    668                         exp.append(self.export_SMB(id, state, project, user))
    669                         #exp.append(self.export_seer(id, state, project, user))
     683                        exp.append(self.export_SMB(id, state, project, user,
     684                            sattrs))
     685                        #exp.append(self.export_seer(id, state, project, user,
     686                        #sattrs))
    670687                        exp.append(self.export_userconfig(id, state,
    671                             project, user))
     688                            project, user, sattrs))
    672689                    elif sname == 'local_seer_control':
    673690                        exp.append(self.export_local_seer(id, state, project,
    674                             user))
     691                            user, sattrs))
    675692                    elif sname == 'seer_master':
    676693                        exp.append(self.export_seer_master(id, state, project,
    677                             user))
     694                            user, sattrs))
     695                    elif sname == 'hide_hosts':
     696                        exp.append(self.export_hide_hosts(id, state, project,
     697                            user, sattrs))
    678698        return (exp, state)
    679699
     
    10941114                print >>f, "ProjectName: %s" % smbproj
    10951115
     1116        def client_hide_hosts(f, s):
     1117            for a in s.get('fedAttr', [ ]):
     1118                if a.get('attribute', "") == 'hosts':
     1119                    print >>f, "Hide: %s" % a.get('value', "")
     1120
    10961121        client_service_out = {
    10971122                'SMB': client_smb,
     
    11011126                'project_export': client_null,
    11021127                'seer_master': client_seer_master,
     1128                'hide_hosts': client_hide_hosts,
    11031129            }
    11041130
     
    11301156                'seer': server_seer,
    11311157                'seer_master': server_port,
     1158                'hide_hosts': server_null,
    11321159            }
    11331160        # XXX: end un hardcode this
  • fedd/federation/experiment_control.py

    r0de1b94 r5334044  
    4646# Right now, no support for composition.
    4747class federated_service:
    48     def __init__(self, name, exporter=None, importers=[], params={ }, reqs=[]):
     48    def __init__(self, name, exporter=None, importers=None, params=None,
     49            reqs=None, portal=None):
    4950        self.name=name
    5051        self.exporter=exporter
    51         self.importers=importers
    52         self.params = params
    53         self.reqs = reqs
     52        if importers is None: self.importers = []
     53        else: self.importers=importers
     54        if params is None: self.params = { }
     55        else: self.params = params
     56        if reqs is None: self.reqs = []
     57        else: self.reqs = reqs
     58
     59        if portal is not None:
     60            self.portal = portal
     61        else:
     62            self.portal = (name in federated_service.needs_portal)
    5463
    5564    def __str__(self):
     
    5766                (self.name, self.exporter, self.importers, self.params,
    5867                        [ (r['name'], r['visibility']) for r in self.reqs] )
     68
     69    needs_portal = ('SMB', 'seer', 'tmcd', 'project_export', 'seer_master')
    5970
    6071class experiment_control_local:
     
    16891700                        if a.attribute == 'testbed'])
    16901701
     1702            tb_hosts = { }
     1703            for tb in testbeds:
     1704                tb_hosts[tb] = [ e.name for e in top.elements \
     1705                        if isinstance(e, topdl.Computer) and \
     1706                            e.get_attribute('testbed') and \
     1707                            e.get_attribute('testbed') == tb]
     1708
    16911709            masters = { }           # testbeds exporting services
     1710            pmasters = { }          # Testbeds exporting services that
     1711                                    # need portals
    16921712            for s in tb_services:
    1693                 # If this is a project_export request with the importall field
     1713                # If this is a service request with the importall field
    16941714                # set, fill it out.
    16951715
     
    17111731                                        a.get('value','')
    17121732
    1713                         masters[tb].append(federated_service(name=s['name'],
     1733                        fser = federated_service(name=s['name'],
    17141734                                exporter=tb, importers=s.get('import',[]),
    1715                                 params=params, reqs=[]))
     1735                                params=params)
     1736                        if fser.name == 'hide_hosts' \
     1737                                and 'hosts' not in fser.params:
     1738                            fser.params['hosts'] = \
     1739                                    ",".join(tb_hosts.get(fser.exporter, []))
     1740                        masters[tb].append(fser)
     1741
     1742                        if fser.portal:
     1743                            if tb not in pmasters: pmasters[tb] = [ fser ]
     1744                            else: pmasters[tb].append(fser)
    17161745                    else:
    17171746                        self.log.error('Testbed service does not have name " + \
     
    17221751            topo ={ }               # Sub topologies
    17231752            connInfo = { }          # Connection information
     1753
    17241754            self.get_access_to_testbeds(testbeds, access_user, allocated,
    17251755                    tbparams, masters)
     
    17611791            part = experiment_partition(self.auth, self.store_url, self.tbmap,
    17621792                    self.muxmax, self.direct_transit)
    1763             part.add_portals(top, topo, eid, masters, tbparams, ip_allocator,
     1793            part.add_portals(top, topo, eid, pmasters, tbparams, ip_allocator,
    17641794                    connInfo, expid)
    17651795            # Now get access to the dynamic testbeds (those added above)
Note: See TracChangeset for help on using the changeset viewer.