X-Git-Url: https://review.fuel-infra.org/gitweb?a=blobdiff_plain;f=ext%2Faction_helpers%2Fpython%2Fkwilczynski%2Fmcollective_action.py;fp=ext%2Faction_helpers%2Fpython%2Fkwilczynski%2Fmcollective_action.py;h=84c182a1baabd7a315a84af7f01c02e2ad646a6a;hb=b87d2f4e68281062df1913440ca5753ae63314a9;hp=0000000000000000000000000000000000000000;hpb=ab0ea530b8ac956091f17b104ab2311336cfc250;p=packages%2Fprecise%2Fmcollective.git diff --git a/ext/action_helpers/python/kwilczynski/mcollective_action.py b/ext/action_helpers/python/kwilczynski/mcollective_action.py new file mode 100644 index 0000000..84c182a --- /dev/null +++ b/ext/action_helpers/python/kwilczynski/mcollective_action.py @@ -0,0 +1,112 @@ +#!/usr/bin/env python + +import os +import sys + +class Error(Exception): + pass + +class MissingModule(Error): + pass + +class MissingFiles(Error): + pass + +class MissingEnvironemntVariable(Error): + pass + +class FileReadError(Error): + pass + +class JSONParsingError(Error): + pass + +try: + import simplejson as json +except ImportError: + raise MissingModule('Unable to load JSON module. Missing module?') + +class MCollectiveAction(object): + + _environment_variables = [ 'MCOLLECTIVE_REQUEST_FILE', + 'MCOLLECTIVE_REPLY_FILE' ] + + def __init__(self): + self._info = sys.__stdout__ + self._error = sys.__stderr__ + + for entry in '_reply', '_request': + self.__dict__[entry] = {} + + self._arguments = sys.argv[1:] + + if len(self._arguments) < 2: + try: + for variable in self._environment_variables: + self._arguments.append(os.environ[variable]) + except KeyError: + raise MissingEnvironemntVariable("Environment variable `%s' " + "is not set." % variable) + + self._request_file, self._reply_file = self._arguments + + if len(self._request_file) == 0 or len(self._reply_file) == 0: + raise MissingFiles("Both request and reply files have to be set.") + + def __setattr__(self, name, value): + if name.startswith('_'): + object.__setattr__(self, name, value) + else: + self.__dict__['_reply'][name] = value + + def __getattr__(self, name): + if name.startswith('_'): + return self.__dict__.get(name, None) + else: + return self.__dict__['_reply'].get(name, None) + + def __del__(self): + if self._reply: + try: + file = open(self._reply_file, 'w') + json.dump(self._reply, file) + file.close() + except IOError, error: + raise FileReadError("Unable to open reply file `%s': %s" % + (self._reply_file, error)) + + def info(self, message): + print >> self._info, message + self._info.flush() + + def error(self, message): + print >> self._error, message + self._error.flush() + + def fail(self, message, exit_code=1): + self.error(message) + sys.exit(exit_code) + + def reply(self): + return self._reply + + def request(self): + if self._request: + return self._request + else: + try: + file = open(self._request_file, 'r') + self._request = json.load(file) + file.close() + except IOError, error: + raise FileReadError("Unable to open request file `%s': %s" % + (self._request_file, error)) + except json.JSONDecodeError, error: + raise JSONParsingError("An error occurred during parsing of " + "the JSON data in the file `%s': %s" % + (self._request_file, error)) + file.close() + + return self._request + +# vim: set ts=4 sw=4 et :