1ffcdf5787ebda681d527098d78b1684823f72a6
[nepi.git] / src / neco / resources / linux / application.py
1 from neco.execution import tags
2 from neco.execution.resource import ResourceManager
3
4 import cStringIO
5 import logging
6
7 class Application(ResourceManager):
8     def __init__(self, box, ec):
9         super(Application, self).__init__(box, ec)
10         self.command = None
11         self.pid = None
12         self.ppid = None
13         self.stdin = None
14         self.del_app_home = True
15         self.env = None
16         
17         self.app_home = "${HOME}/app-%s" % self.box.guid
18         self._node = None
19        
20         # Logging
21         loglevel = "debug"
22         self._logger = logging.getLogger("neco.resources.base.Application.%s" % self.guid)
23         self._logger.setLevel(getattr(logging, loglevel.upper()))
24
25     @property
26     def node(self):
27         if self._node:
28             return self._node
29
30         # XXX: What if it is connected to more than one node?
31         resources = self.find_resources(exact_tags = [tags.NODE])
32         self._node = resources[0] is len(resources) == 1 else None
33         return self._node
34
35     def make_app_home(self):
36         self.node.mkdir(self.app_home)
37
38         if self.stdin:
39             self.node.upload(self.stdin, os.path.join(self.app_home, 'stdin'))
40
41     def cleanup(self):
42         self.kill()
43
44     def run(self):
45         dst = os.path.join(self.app_home, "app.sh")
46         
47         # Create shell script with the command
48         # This way, complex commands and scripts can be ran seamlessly
49         # sync files
50         cmd = ""
51         if self.env:
52             for envkey, envvals in env.iteritems():
53                 for envval in envvals:
54                     cmd += 'export %s=%s\n' % (envkey, envval)
55
56         cmd += self.command
57         self.node.upload(cmd, dst)
58
59         command = 'bash ./app.sh'
60         stdin = 'stdin' if self.stdin else None
61         self.node.run(command, self.app_home, stdin = stdin)
62         self.pid, self.ppid = self.node.checkpid(self.app_home)
63
64     def status(self):
65         return self.node.status(self.pid, self.ppid)
66
67     def kill(self):
68         return self.node.kill(self.pid, self.ppid)
69