Ignore:
Timestamp:
Dec 1, 2008 3:07:40 PM (15 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:
f816079
Parents:
f069052
Message:

All services use authorizer. Global authorization file, shared routine to read simple authorization files. Fixes some more partial state errors in experiment_control.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • fedd/fedd/experiment_control.py

    rf069052 r05191a6  
    15371537            self.state_lock.release()
    15381538
    1539         try:
    1540             self.generate_ssh_keys(gw_secretkey, self.ssh_type)
    1541         except ValueError:
    1542             raise service_error(service_error.server_config,
    1543                     "Bad key type (%s)" % self.ssh_type)
    1544 
    1545         user = req.get('user', None)
    1546         if user == None:
    1547             raise service_error(service_error.req, "No user")
    1548 
    1549         master = req.get('master', None)
    1550         if not master:
    1551             raise service_error(service_error.req, "No master testbed label")
    1552         export_project = req.get('exportProject', None)
    1553         if not export_project:
    1554             raise service_error(service_error.req, "No export project")
    1555        
    1556         if self.splitter_url:
    1557             self.log.debug("Calling remote splitter at %s" % self.splitter_url)
    1558             split_data = self.remote_splitter(self.splitter_url, file_content,
    1559                     master)
    1560         else:
    1561             tclcmd = [self.tclsh, self.tcl_splitter, '-s', '-x',
    1562                 str(self.muxmax), '-m', master]
    1563 
    1564             if self.fedkit:
    1565                 tclcmd.append('-k')
    1566 
    1567             tclcmd.extend([pid, gid, eid, tclfile])
    1568 
    1569             self.log.debug("running local splitter %s", " ".join(tclcmd))
    1570             tclparser = Popen(tclcmd, stdout=PIPE)
    1571             split_data = tclparser.stdout
    1572 
    1573         allocated = { }     # Testbeds we can access
    1574         started = { }       # Testbeds where a sub-experiment started
    1575                             # successfully
    1576 
    1577         # Objects to parse the splitter output (defined above)
    1578         parse_current_testbed = self.current_testbed(eid, tmpdir, self.fedkit)
    1579         parse_allbeds = self.allbeds(self.get_access)
    1580         parse_gateways = self.gateways(eid, master, tmpdir,
    1581                 gw_pubkey_base, gw_secretkey_base, self.copy_file, self.fedkit)
    1582         parse_vtopo = self.shunt_to_string("^#\s+Begin\s+Vtopo",
    1583                     "^#\s+End\s+Vtopo")
    1584         parse_hostnames = self.shunt_to_file("^#\s+Begin\s+hostnames",
    1585                     "^#\s+End\s+hostnames", tmpdir + "/hosts")
    1586         parse_tarfiles = self.shunt_to_list("^#\s+Begin\s+tarfiles",
    1587                 "^#\s+End\s+tarfiles")
    1588         parse_rpms = self.shunt_to_list("^#\s+Begin\s+rpms",
    1589                 "^#\s+End\s+rpms")
    1590 
    15911539        try:
     1540            # This catches exceptions to clear the placeholder if necessary
     1541            try:
     1542                self.generate_ssh_keys(gw_secretkey, self.ssh_type)
     1543            except ValueError:
     1544                raise service_error(service_error.server_config,
     1545                        "Bad key type (%s)" % self.ssh_type)
     1546
     1547            user = req.get('user', None)
     1548            if user == None:
     1549                raise service_error(service_error.req, "No user")
     1550
     1551            master = req.get('master', None)
     1552            if not master:
     1553                raise service_error(service_error.req,
     1554                        "No master testbed label")
     1555            export_project = req.get('exportProject', None)
     1556            if not export_project:
     1557                raise service_error(service_error.req, "No export project")
     1558           
     1559            if self.splitter_url:
     1560                self.log.debug("Calling remote splitter at %s" % \
     1561                        self.splitter_url)
     1562                split_data = self.remote_splitter(self.splitter_url,
     1563                        file_content, master)
     1564            else:
     1565                tclcmd = [self.tclsh, self.tcl_splitter, '-s', '-x',
     1566                    str(self.muxmax), '-m', master]
     1567
     1568                if self.fedkit:
     1569                    tclcmd.append('-k')
     1570
     1571                tclcmd.extend([pid, gid, eid, tclfile])
     1572
     1573                self.log.debug("running local splitter %s", " ".join(tclcmd))
     1574                tclparser = Popen(tclcmd, stdout=PIPE)
     1575                split_data = tclparser.stdout
     1576
     1577            allocated = { }         # Testbeds we can access
     1578            started = { }           # Testbeds where a sub-experiment started
     1579                                # successfully
     1580
     1581            # Objects to parse the splitter output (defined above)
     1582            parse_current_testbed = self.current_testbed(eid, tmpdir,
     1583                    self.fedkit)
     1584            parse_allbeds = self.allbeds(self.get_access)
     1585            parse_gateways = self.gateways(eid, master, tmpdir,
     1586                    gw_pubkey_base, gw_secretkey_base, self.copy_file,
     1587                    self.fedkit)
     1588            parse_vtopo = self.shunt_to_string("^#\s+Begin\s+Vtopo",
     1589                        "^#\s+End\s+Vtopo")
     1590            parse_hostnames = self.shunt_to_file("^#\s+Begin\s+hostnames",
     1591                        "^#\s+End\s+hostnames", tmpdir + "/hosts")
     1592            parse_tarfiles = self.shunt_to_list("^#\s+Begin\s+tarfiles",
     1593                    "^#\s+End\s+tarfiles")
     1594            parse_rpms = self.shunt_to_list("^#\s+Begin\s+rpms",
     1595                    "^#\s+End\s+rpms")
     1596
    15921597            # Working on the split data
    15931598            for line in split_data:
     
    16111616                    raise service_error(service_error.internal,
    16121617                            "Bad tcl parse? %s" % line)
     1618            # Virtual topology and visualization
     1619            vtopo = self.gentopo(parse_vtopo.str)
     1620            if not vtopo:
     1621                raise service_error(service_error.internal,
     1622                        "Failed to generate virtual topology")
     1623
     1624            vis = self.genviz(vtopo)
     1625            if not vis:
     1626                raise service_error(service_error.internal,
     1627                        "Failed to generate visualization")
     1628           
     1629            # save federant information
     1630            for k in allocated.keys():
     1631                tbparams[k]['federant'] = {\
     1632                        'name': [ { 'localname' : eid} ],\
     1633                        'emulab': tbparams[k]['emulab'],\
     1634                        'allocID' : tbparams[k]['allocID'],\
     1635                        'master' : k == master,\
     1636                    }
     1637
     1638
     1639            # Copy tarfiles and rpms needed at remote sites into a staging area
     1640            try:
     1641                if self.fedkit:
     1642                    parse_tarfiles.list.append(self.fedkit)
     1643                for t in parse_tarfiles.list:
     1644                    if not os.path.exists("%s/tarfiles" % tmpdir):
     1645                        os.mkdir("%s/tarfiles" % tmpdir)
     1646                    self.copy_file(t, "%s/tarfiles/%s" % \
     1647                            (tmpdir, os.path.basename(t)))
     1648                for r in parse_rpms.list:
     1649                    if not os.path.exists("%s/rpms" % tmpdir):
     1650                        os.mkdir("%s/rpms" % tmpdir)
     1651                    self.copy_file(r, "%s/rpms/%s" % \
     1652                            (tmpdir, os.path.basename(r)))
     1653            except IOError, e:
     1654                raise service_error(service_error.internal,
     1655                        "Cannot stage tarfile/rpm: %s" % e.strerror)
     1656
    16131657        except service_error, e:
    16141658            # If something goes wrong in the parse (usually an access error)
    1615             # clear the placeholder state
     1659            # clear the placeholder state.  From here on out the code delays
     1660            # exceptions.
    16161661            self.state_lock.acquire()
    16171662            del self.state[eid]
    16181663            self.state_lock.release()
    16191664            raise e
    1620        
    1621         # Virtual topology and visualization
    1622         vtopo = self.gentopo(parse_vtopo.str)
    1623         if not vtopo:
    1624             raise service_error(service_error.internal,
    1625                     "Failed to generate virtual topology")
    1626 
    1627         vis = self.genviz(vtopo)
    1628         if not vis:
    1629             raise service_error(service_error.internal,
    1630                     "Failed to generate visualization")
    1631 
    1632         # save federant information
    1633         for k in allocated.keys():
    1634             tbparams[k]['federant'] = {\
    1635                     'name': [ { 'localname' : eid} ],\
    1636                     'emulab': tbparams[k]['emulab'],\
    1637                     'allocID' : tbparams[k]['allocID'],\
    1638                     'master' : k == master,\
    1639                 }
    1640 
    1641 
    1642         # Copy tarfiles and rpms needed at remote sites into a staging area
    1643         try:
    1644             if self.fedkit:
    1645                 parse_tarfiles.list.append(self.fedkit)
    1646             for t in parse_tarfiles.list:
    1647                 if not os.path.exists("%s/tarfiles" % tmpdir):
    1648                     os.mkdir("%s/tarfiles" % tmpdir)
    1649                 self.copy_file(t, "%s/tarfiles/%s" % \
    1650                         (tmpdir, os.path.basename(t)))
    1651             for r in parse_rpms.list:
    1652                 if not os.path.exists("%s/rpms" % tmpdir):
    1653                     os.mkdir("%s/rpms" % tmpdir)
    1654                 self.copy_file(r, "%s/rpms/%s" % \
    1655                         (tmpdir, os.path.basename(r)))
    1656         except IOError, e:
    1657             raise service_error(service_error.internal,
    1658                     "Cannot stage tarfile/rpm: %s" % e.strerror)
    16591665
    16601666        thread_pool_info = self.thread_pool()
Note: See TracChangeset for help on using the changeset viewer.