source: fedd/fedd_split.py @ f4f4117

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

add remote splitter interface

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