1 from neco.execution import tags
2 from neco.execution.resource import Resource
7 class Application(Resource):
8 def __init__(self, box, ec):
9 super(Application, self).__init__(box, ec)
14 self.del_app_home = True
17 self.app_home = "${HOME}/app-%s" % self.box.guid
22 self._logger = logging.getLogger("neco.resources.base.Application.%s" % self.guid)
23 self._logger.setLevel(getattr(logging, loglevel.upper()))
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
35 def make_app_home(self):
36 self.node.mkdir(self.app_home)
39 self.node.upload(self.stdin, os.path.join(self.app_home, 'stdin'))
45 dst = os.path.join(self.app_home, "app.sh")
47 # Create shell script with the command
48 # This way, complex commands and scripts can be ran seamlessly
52 for envkey, envvals in env.iteritems():
53 for envval in envvals:
54 cmd += 'export %s=%s\n' % (envkey, envval)
57 self.node.upload(cmd, dst)
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)
65 return self.node.status(self.pid, self.ppid)
68 return self.node.kill(self.pid, self.ppid)