~therealmik/+junk/python-ocfra

« back to all changes in this revision

Viewing changes to ocf/resourceagent.py

  • Committer: Michael Samuel
  • Date: 2011-05-05 00:17:01 UTC
  • Revision ID: msamuel@ipsystems.com.au-20110505001701-u6nx46b395fj8923
Cleanup, added PyDummy resource agent

Show diffs side-by-side

added added

removed removed

Lines of Context:
9
9
from parameter import Parameter, STRING, INTEGER, BOOLEAN
10
10
from errors import *
11
11
from xml.etree import ElementTree
 
12
from collections import defaultdict
12
13
import os
13
14
import sys
14
15
import traceback
15
16
 
16
 
class _dictobj(dict):
17
 
        def __getattr__(self, name):
 
17
class _ocf_reskeys(dict):
 
18
        def __init__(self, params):
 
19
                self._params = params
 
20
 
 
21
        def __missing__(self, key):
 
22
                p = self._params[key]
18
23
                try:
19
 
                        return self[name]
 
24
                        return p.datatype.topython(os.environ[p.envname])
20
25
                except KeyError:
21
 
                        return None
22
 
 
23
 
class _ocfenv(object):
24
 
        def __init__(self):
25
 
                self.instance = os.environ.get("OCF_RESOURCE_INSTANCE", "_test_instance")
 
26
                        if p.default is not None:
 
27
                                env.args[p.name] = p.default
 
28
                        else:
 
29
                                raise
 
30
                
 
31
        __getattr__ = dict.__getitem__
 
32
 
 
33
class OCFEnvironment(object):
 
34
        def __init__(self, params):
 
35
                self.instance = os.environ.get("OCF_RESOURCE_INSTANCE", "__noinstance__")
 
36
                self.tempdir = os.environ.get("HA_RSCTMP", "/tmp")
 
37
 
26
38
                try:
27
39
                        self.check_level = int(os.environ["OCF_CHECK_LEVEL"])
28
40
                except KeyError:
29
41
                        pass
30
 
                self.args = _dictobj()
 
42
 
 
43
                self.params = _ocf_reskeys(params)
31
44
 
32
45
class ResourceAgent(object):
 
46
        """ResourceAgent is the main class for creating your OCF resource agent.
 
47
        @name The name of your resource agent (`basename $0` in the shell script wrapper)
 
48
        @version A version string (number?) for this agent.  1.0 would be a good start."""
33
49
        def __init__(self, name, version):
34
50
                self.name = name
35
51
                self.version = version
36
52
                self.actions = {}
37
 
                self.parameters = []
 
53
                self.parameters = {}
38
54
                self.validations = []
39
55
 
40
 
                self.add_action("meta-data", {"timeout": "10s"}, self.meta_data, False)
41
 
                self.add_action("validate-all", {"timeout": "10s"}, self.validate_all, False)
 
56
                self.add_action("meta-data", {"timeout": "10s"}, self.meta_data)
 
57
                self.add_action("validate-all", {"timeout": "10s"}, self.validate_all)
42
58
                self.add_validation(self.validate_parameters)
43
59
 
44
 
        def get_environment(self):
45
 
                env = _ocfenv()
46
 
                for p in self.parameters:
47
 
                        try:
48
 
                                env.args[p.name] = p.datatype.topython(os.environ[p.envname])
49
 
                        except KeyError:
50
 
                                if p.default is not None:
51
 
                                        env.args[p.name] = p.default
52
 
                return env
53
 
 
54
60
        def add_action(self, *args, **kwargs):
 
61
                """Add an action that the script supports
 
62
        @name The name of the action (eg. start) - Must have at-least start, stop. meta-data and validate-all are
 
63
              provided for you
 
64
        @parameters A dict of default parameters for this action.  timeout is mandatory.  example: { "timeout": "10s" }
 
65
        @callback A callable (function or method) to be executed on this action.  Is always an OCFEnvironment object"""
 
66
                
55
67
                a = Action(*args, **kwargs)
56
68
                self.actions[a.name] = a
57
69
 
58
70
        def add_parameter(self, *args, **kwargs):
59
71
                p = Parameter(*args, **kwargs)
60
 
                self.parameters.append(p)
 
72
                self.parameters[p.name] = p
61
73
 
62
74
        def add_validation(self, callback):
63
75
                self.validations.append(callback)
78
90
                        raise OCF_ERR_UNIMPLEMENTED(self.usage())
79
91
                a = self.actions[action]
80
92
                try:
81
 
                        a.callback(a.needenv and self.get_environment() or None)
 
93
                        a.callback(OCFEnvironment(self.parameters))
82
94
                except OcfError, e:
83
95
                        if e.message:
84
96
                                print >>sys.stderr, e.message
92
104
                ElementTree.SubElement(eResourceAgent, "version").text = "1.0"
93
105
 
94
106
                eParameters = ElementTree.SubElement(eResourceAgent, "parameters")
95
 
                for p in (p.getelement() for p in self.parameters):
 
107
                for p in (p.getelement() for p in self.parameters.itervalues()):
96
108
                        eParameters.append(p)
97
109
 
98
110
                eActions = ElementTree.SubElement(eResourceAgent, "actions")
107
119
 
108
120
 
109
121
        def validate_all(self, env=None):
110
 
                for validator in self.validators:
 
122
                for validator in self.validations:
111
123
                        validator(env)
112
124
 
113
125
        def validate_parameters(self, env=None):
114
 
                for parameter in self.parameters:
 
126
                for parameter in self.parameters.itervalues():
115
127
                        if not os.environ.has_key(parameter.envname):
116
128
                                if parameter.required:
117
129
                                        raise OCF_ERR_CONFIGURED("Required parameter \"%s\" missing" % parameter.name)