source: fedd/fedd_split.py @ 9460b1e

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

move remote_service out of fedd_util

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