Changeset 08329f4


Ignore:
Timestamp:
Dec 2, 2008 3:49:25 PM (16 years ago)
Author:
Ted Faber <faber@…>
Branches:
axis_example, compt_changes, info-ops, master, version-1.30, version-2.00, version-3.01, version-3.02
Children:
b0b9499
Parents:
5a6b75b
Message:

dynamic projects and multiple keys

Location:
fedd
Files:
1 added
2 edited

Legend:

Unmodified
Added
Removed
  • fedd/federation/allocate_project.py

    r5a6b75b r08329f4  
    1010from util import *
    1111from fedid import fedid
    12 from fixed_resource import read_key_db, read_project_db
     12from fixed_resource import read_key_db, read_project_db, read_user_db
    1313from remote_service import xmlrpc_handler, soap_handler, service_caller
    1414from service_error import service_error
     
    5656        self.rmproj = config.get('allocate', 'rmproj',
    5757                '/usr/testbed/sbin/rmproj')
     58        self.rmuser = config.get('allocate', 'rmuser',
     59                '/usr/testbed/sbin/rmuser')
     60        self.newuser = config.get('allocate', 'newuser',
     61                '/usr/testbed/sbin/newuser')
    5862        self.addpubkey = config.get('allocate', 'addpubkey',
    5963                '/usr/testbed/sbin/taddpubkey')
     
    6266        self.confirmkey = config.get('allocate', 'confirmkey',
    6367                '/usr/testbed/sbin/taddpubkey')
     68        self.user_to_project=config.get("allocate", 'user_to_project',
     69                '/usr/local/bin/user_to_project.py')
    6470        self.allocation_level = config.get("allocate", "allocation_level",
    6571                "none")
     
    94100        fixed_key_db = config.get("allocate", "fixed_keys", None)
    95101        fixed_project_db = config.get("allocate", "fixed_projects", None)
     102        fixed_user_db = config.get("allocate", "fixed_users", None)
    96103        self.fixed_keys = set()
    97104        self.fixed_projects = set()
     105        self.fixed_users = set()
    98106
    99107        # initialize the fixed resource sets
    100108        for db, rset, fcn in (\
    101109                (fixed_key_db, self.fixed_keys, read_key_db), \
    102                 (fixed_project_db, self.fixed_projects, read_project_db)):
     110                (fixed_project_db, self.fixed_projects, read_project_db),
     111                (fixed_user_db, self.fixed_users, read_user_db)):
    103112            if db:
    104113                try:
     
    160169                            "permitted: check allocation level")
    161170        # tempfiles for the parameter files
    162         uf, userfile = tempfile.mkstemp(prefix="usr", suffix=".xml",
     171        cuf, create_userfile = tempfile.mkstemp(prefix="usr", suffix=".xml",
     172                dir="/tmp")
     173        suf, service_userfile = tempfile.mkstemp(prefix="usr", suffix=".xml",
    163174                dir="/tmp")
    164175        pf, projfile = tempfile.mkstemp(prefix="proj", suffix=".xml",
     
    173184        # Take the first user and ssh key
    174185        name = proj.get('name', None) or self.random_string("proj",4)
    175         user = proj.get('user', None)
    176         if user != None:
    177             user = user[0]      # User is a list, take the first entry
    178             if not user.has_key("userID"):
    179                 uname = self.random_string("user", 3)
    180             else:
    181                 uid = proj['userID']
    182                 # XXX: fedid
    183                 uname = uid.get('localname', None) or \
     186        user = proj.get('user', [])
     187
     188        uname = { }
     189        ssh = { }
     190        for u in user:
     191            role = u.get('role', None)
     192            if not role: continue
     193            if u.has_key('userID'):
     194                uid = u['userID']
     195                uname[role] = uid.get('localname', None) or \
    184196                        uid.get('kerberosUsername', None) or \
    185197                        uid.get('uri', None)
    186                 if uname == None:
    187                     raise service_error(service_error.req, "No ID for user");
    188 
    189             access = user.get('access', None)
    190             if access != None:
    191                 ssh = access[0].get('sshPubkey', None)
    192                 if ssh == None:
    193                     raise service_error(service_error.req,
    194                             "No ssh key for user");
    195         else:
    196             raise service_error(service_error.req,
    197                     "No access information for project");
    198 
    199         # uname, name and ssh are set
    200         user_fields = [
    201                 ("name", "Federation User %s" % uname),
    202                 ("email", "%s-fed@isi.deterlab.net" % uname),
     198                if uname[role] == None:
     199                    raise service_error(service_error.req, "No ID for user")
     200            else:
     201                uname[role] = self.random_string("user", 3)
     202
     203            access = u.get('access', None)
     204            if access:
     205                # XXX collect and call addpubkey later, for now use first one.
     206                for a in access:
     207                    ssh[role] = a.get('sshPubkey', None)
     208                    if ssh: break
     209                else:
     210                    raise service_error(service_error.req,
     211                            "No SSH key for user %s" % uname[role])
     212            else:
     213                raise service_error(service_error.req,
     214                        "No access mechanisms for for user %s" % uname[role])
     215
     216        if not (uname.has_key('experimentCreation') and \
     217                uname.has_key('serviceAccess')):
     218            raise service_error(service_error.req,
     219                    "Must specify both user roles")
     220       
     221
     222        create_user_fields = [
     223                ("name", "Federation User %s" % uname['experimentCreation']),
     224                ("email", "%s-fed@isi.deterlab.net" % \
     225                        uname['experimentCreation']),
    203226                ("password", self.random_string("", 8)),
    204                 ("login", uname),
     227                ("login", uname['experimentCreation']),
    205228                ("address", "4676 Admiralty"),
    206229                ("city", "Marina del Rey"),
     
    211234                ("title", "None"),
    212235                ("affiliation", "USC/ISI"),
    213                 ("pubkey", ssh)
     236                ("pubkey", ssh['experimentCreation'])
     237        ]
     238
     239        service_user_fields = [
     240                ("name", "Federation User %s" % uname['serviceAccess']),
     241                ("email", "%s-fed@isi.deterlab.net" % uname['serviceAccess']),
     242                ("password", self.random_string("", 8)),
     243                ("login", uname['serviceAccess']),
     244                ("address", "4676 Admiralty"),
     245                ("city", "Marina del Rey"),
     246                ("state", "CA"),
     247                ("zip", "90292"),
     248                ("country", "USA"),
     249                ("phone", "310-448-9190"),
     250                ("title", "None"),
     251                ("affiliation", "USC/ISI"),
     252                ("pubkey", ssh['serviceAccess'])
    214253        ]
    215254
     
    223262                ("num_pcs", "100"),
    224263                ("linkedtous", "1"),
    225                 ("newuser_xml", userfile)
     264                ("newuser_xml", create_userfile)
    226265        ]
    227266       
    228267
    229268        # Write out the files
    230         self.write_attr_xml(uf, "user", user_fields)
     269        self.write_attr_xml(cuf, "user", create_user_fields)
     270        self.write_attr_xml(suf, "user", service_user_fields)
    231271        self.write_attr_xml(pf, "project", proj_fields)
    232272
     
    234274        cmds = [
    235275                (self.wap, self.newproj, projfile),
    236                 (self.wap, self.mkproj, name)
     276                (self.wap, self.mkproj, name),
     277                (self.wap, self.newuser, service_userfile),
     278                (self.wap, self.user_to_project, uname['serviceAccess'], name),
    237279                ]
    238280
     
    260302                                "[%s] (%d)" % (cmd[1], rc))
    261303        # Clean up tempfiles
    262         os.unlink(userfile)
    263         os.unlink(projfile)
     304        #os.unlink(create_userfile)
     305        #os.unlink(service_userfile)
     306        #os.unlink(projfile)
    264307        rv = {\
    265308            'project': {\
    266309                'name': { 'localname': name },
    267                 'user' : [ {\
    268                     'userID': { 'localname' : uname },
    269                     'access': [ { 'sshPubkey' : ssh } ],
    270                 } ]\
     310                'user' : [\
     311                    {\
     312                        'userID': { 'localname' : uname['experimentCreation'] },
     313                        'access': [ {'sshPubkey': ssh['experimentCreation'] } ],
     314                        'role': 'experimentCreation',
     315                    }, \
     316                    {\
     317                        'userID': { 'localname' : uname['serviceAccess'] },
     318                        'access': [ { 'sshPubkey' : ssh['serviceAccess'] } ],
     319                        'role': 'serviceAccess',
     320                    } \
     321                ]\
    271322            }\
    272323        }
     
    370421            raise service_error(service_error.req, "Badly formed request")
    371422
     423        if pname and pname not in self.fixed_projects and \
     424                self.allocation_level >= self.dynamic_projects:
     425            cmds.append((self.wap, self.rmproj, pname))
     426
    372427        for u in users:
    373428            try:
     
    375430            except KeyError:
    376431                raise service_error(service_error.req, "Badly formed user")
    377             for sk in [ k['sshPubkey'] for k in u.get('access', []) \
    378                     if k.has_key('sshPubkey')]:
    379                 if (name.rstrip(), sk.rstrip()) not in self.fixed_keys:
    380                     if self.allocation_level >= self.dynamic_keys:
    381                         cmds.append((self.wap, self.addpubkey, '-R', '-w', \
    382                                 '-u', name, '-k', sk))
    383         if pname and pname not in self.fixed_projects and \
    384                 self.allocation_level >= self.dynamic_projects:
    385             cmds.append((self.wap, self.rmproj, pname))
     432            if self.allocation_level >= self.dynamic_projects and \
     433                    name not in self.fixed_users:
     434                cmds.append((self.wap, self.rmuser, name))
     435            else:
     436                for sk in [ k['sshPubkey'] for k in u.get('access', []) \
     437                        if k.has_key('sshPubkey')]:
     438                    if (name.rstrip(), sk.rstrip()) not in self.fixed_keys:
     439                        if self.allocation_level >= self.dynamic_keys:
     440                            cmds.append((self.wap, self.addpubkey, '-R', '-w', \
     441                                    '-u', name, '-k', sk))
    386442
    387443        # Run the commands
  • fedd/federation/fixed_resource.py

    r5a6b75b r08329f4  
    4848        print >>f, "%s" % p
    4949    f.close()
     50
     51read_user_db = read_project_db
     52write_user_db = write_project_db
Note: See TracChangeset for help on using the changeset viewer.