Isolating Resource derived classes class-attributes state
[nepi.git] / src / neco / execution / ec.py
1 import logging
2 import os
3 import sys
4 import time
5
6 from neco.util import guid
7 from neco.execution.resource import ResourceFactory
8
9 class ExperimentController(object):
10     def __init__(self, root_dir = "/tmp", loglevel = 'error'):
11         super(ExperimentController, self).__init__()
12         # root directory to store files
13         self._root_dir = root_dir
14
15         # generator of globally unique ids
16         self._guid_generator = guid.GuidGenerator()
17         
18         # Resource managers
19         self._resources = dict()
20
21         # Groups of resources
22         self._groups = dict()
23        
24         # Logging
25         self._logger = logging.getLogger("neco.execution.ec")
26         self._logger.setLevel(getattr(logging, loglevel.upper()))
27
28     def resource(self, guid):
29         return self._resources.get(guid)
30
31     def resources(self):
32         return self._resources.keys()
33
34     def release(self, group = None):
35         # TODO
36         pass
37
38     def deploy(self, group = None):
39         # TODO
40         pass
41
42     def register_resource(self, rtype, guid = None):
43         # Get next available guid
44         guid = self._guid_generator.next(guid)
45         
46         # Instantiate RM
47         rm = ResourceFactory.create(rtype, self, guid)
48
49         # Store RM
50         self._resources[guid] = rm
51
52         return guid
53
54     def get_attributes(self, guid):
55         rm = self._resources[guid]
56         return rm.get_attributes()
57
58     def get_filters(self, guid):
59         rm = self._resources[guid]
60         return rm.get_filters()
61
62     def register_connection(self, guid1, guid2):
63         rm1 = self._resources[guid1]
64         rm2 = self._resources[guid2]
65
66         rm1.connect(guid2)
67         rm2.connect(guid1)
68
69     def register_group(self, guids, gguid = None):
70         gguid = self._guid_generator.next(gguid)
71         self._groups[gguid] = guids
72
73     def discover_resource(self, guid, filters):
74         rm = self._resources[guid]
75         return rm.discover(filters)
76
77     def provision_resource(self, guid, filters):
78         rm = self._resources[guid]
79         return rm.provision(filters)
80
81     def register_start(self, gguid1, time, after_status, gguid2):
82         if isinstance(gguid1, int):
83             gguid1 = list[gguid1]
84         if isinstance(gguid2, int):
85             gguid2 = list[gguid2]
86
87         for guid1 in gguid1:
88             for guid2 in gguid2:
89                 rm = self._resources(guid1)
90                 rm.start_after(time, after_status, guid2)
91
92     def register_stop(self, gguid1, time, after_status, gguid2):
93         if isinstance(gguid1, int):
94             gguid1 = list[gguid1]
95         if isinstance(gguid2, int):
96             gguid2 = list[gguid2]
97
98         for guid1 in gguid1:
99             for guid2 in gguid2:
100                 rm = self._resources(guid1)
101                 rm.stop_after(time, after_status, guid2)
102
103     def register_set(self, name, value, gguid1, time, after_status, gguid2):
104         if isinstance(gguid1, int):
105             gguid1 = list[gguid1]
106         if isinstance(group2, int):
107             gguid2 = list[gguid2]
108
109         for guid1 in gguid1:
110             for guid2 in gguid2:
111                 rm = self._resources(guid1)
112                 rm.set_after(name, value, time, after_status, guid2)
113
114     def get(self, guid, name):
115         rm = self._resources(guid)
116         return rm.get(name)
117
118     def set(self, guid, name, value):
119         rm = self._resources(guid)
120         return rm.set(name, value)
121
122     def status(self, guid):
123         rm = self._resources(guid)
124         return rm.status()
125
126     def stop(self, guid):
127         rm = self._resources(guid)
128         return rm.stop()
129