source: fedd/fedd/split.py @ 6a0c9f4

axis_examplecompt_changesinfo-opsversion-1.30version-2.00version-3.01version-3.02
Last change on this file since 6a0c9f4 was 6a0c9f4, checked in by Ted Faber <faber@…>, 15 years ago

More namespace cleanup

  • Property mode set to 100644
File size: 3.7 KB
Line 
1#!/usr/local/bin/python
2
3import os,sys
4import subprocess
5import tempfile
6import logging
7
8from fedd_services import *
9from fedd_internal_services import *
10from util import *
11from fedid import fedid
12from remote_service import xmlrpc_handler, soap_handler
13from service_error import *
14
15
16class nullHandler(logging.Handler):
17    def emit(self, record): pass
18
19fl = logging.getLogger("fedd.splitter")
20fl.addHandler(nullHandler())
21
22class split_local:
23    def __init__(self, config=None, auth=None):
24        """
25        Intialize the various attributes, most from the config object
26        """
27        if config.has_section("splitter"):
28            self.debug = config.getboolean("splitter", "debug")
29            self.muxmax = config.getint("splitter", "muxmax", 3)
30            self.tclsh = config.get("splitter", "tclsh", 
31                    "/usr/local/bin/otclsh")
32            self.tcl_splitter = config.get("splitter", "tcl_splitter",
33                    "/usr/testbed/lib/ns2ir/parse.tcl")
34        else:
35            self.debug = False
36            self.muxmax = 3
37            self.tclsh = "/usr/local/bin/otclsh"
38            self.tcl_splitter = "/usr/testbed/lib/ns2ir/parse.tcl"
39
40        self.log = logging.getLogger("fedd.splitter")
41        set_log_level(config, "splitter", self.log)
42        self.trace_file = sys.stderr
43
44        set_log_level(config, "splitter", self.log)
45        # Dispatch tables
46        self.soap_services = {\
47                'Ns2Split': soap_handler(\
48                        Ns2SplitRequestMessage.typecode,
49                        getattr(self, "run_splitter"), 
50                        Ns2SplitResponseMessage,
51                        "Ns2SplitResponseBody"),
52        }
53
54        self.xmlrpc_services = {\
55                'Ns2Split': xmlrpc_handler(\
56                        getattr(self, "run_splitter"), 
57                        "Ns2SplitResponseBody"),
58        }
59
60    def run_splitter(self, req, fid):
61        """
62        The external interface to experiment creation called from the
63        dispatcher.
64
65        Creates a working directory, splits the incoming description using the
66        splitter script and parses out the avrious subsections using the
67        lcasses above.  Once each sub-experiment is created, use pooled threads
68        to instantiate them and start it all up.
69        """
70        try:
71            tmpdir = tempfile.mkdtemp(prefix="split-")
72        except IOError:
73            raise service_error(service_error.internal, "Cannot create tmp dir")
74
75        tclfile = tmpdir + "/experiment.tcl"
76        pid = "dummy"
77        gid = "dummy"
78        eid = "dummy"
79
80        req = req.get('Ns2SplitRequestBody', None)
81        if not req:
82            raise service_error(service_error.req,
83                    "Bad request format (no Ns2SplitRequestBody)")
84        # The tcl parser needs to read a file so put the content into that file
85        descr=req.get('description', None)
86        if descr:
87            file_content=descr.get('ns2description', None)
88            if file_content:
89                try:
90                    f = open(tclfile, 'w')
91                    f.write(file_content)
92                    f.close()
93                except IOError:
94                    raise service_error(service_error.internal,
95                            "Cannot write temp experiment description")
96            else:
97                raise service_error(service_error.req, 
98                        "Only ns2descriptions supported")
99        else:
100            raise service_error(service_error.req, "No description")
101
102        master = req.get('master', None)
103        if master == None:
104            raise service_error(service_error.req, "No master testbed label")
105       
106        include_fedkit = req.get('include_fedkit', None)
107        if include_fedkit == None:
108            raise service_error(service_error.req, 
109                    "No federation kit inclusion directive")
110       
111       
112        tclcmd = [self.tclsh, self.tcl_splitter, '-s', '-x', 
113            str(self.muxmax), '-m', master]
114        if include_fedkit: tclcmd.append('-k')
115        tclcmd.extend([pid, gid, eid, tclfile])
116        self.log.debug("Calling splitter %s" % " ".join(tclcmd))
117        tclparser = subprocess.Popen(tclcmd, stdout=subprocess.PIPE)
118
119        out = ""
120        # Package up the split data
121        for line in tclparser.stdout:
122            out += line
123
124        # Walk up tmpdir, deleting as we go
125        for path, dirs, files in os.walk(tmpdir, topdown=False):
126            for f in files:
127                os.remove(os.path.join(path, f))
128            for d in dirs:
129                os.rmdir(os.path.join(path, d))
130        os.rmdir(tmpdir)
131
132        resp = { 'output' : out }
133
134        return resp
135
136
Note: See TracBrowser for help on using the repository browser.