source: fedd/fedd_split.py @ 51cc9df

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

split fedid out

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