source: DCWoRMS/branches/coolemall/src/schedframe/resources/computing/ComputingResource.java @ 1005

Revision 1005, 11.7 KB checked in by wojtekp, 12 years ago (diff)
  • Property svn:mime-type set to text/plain
Line 
1package schedframe.resources.computing;
2
3import gridsim.GridSimTags;
4import gridsim.dcworms.DCWormsTags;
5
6import java.util.ArrayList;
7import java.util.LinkedList;
8import java.util.List;
9import java.util.Properties;
10
11import schedframe.Initializable;
12import schedframe.events.Event;
13import schedframe.events.EventHandler;
14import schedframe.events.ResourceEventCommand;
15import schedframe.events.scheduling.EventReason;
16import schedframe.events.scheduling.SchedulingEvent;
17import schedframe.events.scheduling.SchedulingEventCommand;
18import schedframe.exceptions.ResourceException;
19import schedframe.resources.Resource;
20import schedframe.resources.ResourceStatus;
21import schedframe.resources.ResourceType;
22import schedframe.resources.computing.description.ComputingResourceDescription;
23import schedframe.resources.computing.extensions.Extension;
24import schedframe.resources.computing.extensions.ExtensionList;
25import schedframe.resources.computing.extensions.ExtensionListImpl;
26import schedframe.resources.computing.extensions.ExtensionType;
27import schedframe.resources.computing.profiles.energy.EnergyEvent;
28import schedframe.resources.computing.profiles.energy.EnergyEventType;
29import schedframe.resources.computing.profiles.energy.EnergyExtension;
30import schedframe.resources.computing.profiles.energy.airthroughput.ui.AirThroughputInterface;
31import schedframe.resources.computing.profiles.energy.power.ui.PowerInterface;
32import schedframe.resources.computing.profiles.energy.thermal.ui.ThermalInterface;
33import schedframe.resources.computing.properties.DefaultPropertiesBuilder;
34import schedframe.resources.computing.properties.PropertiesDirector;
35import schedframe.resources.computing.validator.ResourceNameValidator;
36import schedframe.resources.computing.validator.ResourcePropertiesValidator;
37import schedframe.resources.computing.validator.ResourceStatusValidator;
38import schedframe.resources.computing.validator.ResourceTypeValidator;
39import schedframe.resources.computing.validator.ResourceValidator;
40import schedframe.resources.units.PEUnit;
41import schedframe.resources.units.ResourceUnit;
42import schedframe.resources.units.StandardResourceUnitName;
43import schedframe.scheduling.Scheduler;
44
45public class ComputingResource implements Resource, Initializable{
46       
47        protected String name;
48        protected ResourceType type;
49        protected String category;
50        protected ResourceStatus status;
51
52        protected ComputingResource parent;
53        protected List<ComputingResource> children;
54       
55        protected Scheduler scheduler;
56        protected ResourceCharacteristics resourceCharacteristic;
57        protected ExtensionList extensionList;
58       
59
60        public ExtensionList getExtensionList() {
61                return extensionList;
62        }
63
64        public ComputingResource(ComputingResourceDescription resDesc) {
65                this.type = resDesc.getType();
66                this.name = resDesc.getId();
67                this.category = resDesc.getCategory();
68                this.status = ResourceStatus.FREE;
69                this.extensionList = new ExtensionListImpl(1);
70                initCharacteristics(resDesc);
71                accept(new EnergyExtension(this, resDesc.getPowerProfile(), resDesc.getAirThroughputProfile(), resDesc.getThermalProfile()));   
72                addFakeProcessors();
73        }
74
75        //TODO remove if possible (check if all scenarios can be realized - statistics issue), since it's a temporary method
76        private void addFakeProcessors() {
77                if(getResourceCharacteristic().getResourceUnits().get(StandardResourceUnitName.PE) != null){
78                        for(ResourceUnit resUnit: getResourceCharacteristic().getResourceUnits().get(StandardResourceUnitName.PE)){
79                                PEUnit peUnit = (PEUnit) resUnit;
80                                for(int i = 0; i < peUnit.getAmount(); i++){
81                                        schemas.ComputingResource fakeCompResource = new schemas.ComputingResource();
82                                        fakeCompResource.setClazz("Processor");
83                                        addChild(ResourceFactory.createResource(new ComputingResourceDescription(fakeCompResource)));
84                                }
85                        }
86                }
87        }
88
89        protected void initCharacteristics(ComputingResourceDescription resDesc){
90                resourceCharacteristic = new ResourceCharacteristics.Builder().resourceUnits(resDesc.getResourceUnits()).location(resDesc.getLocation()).parameters(resDesc.getParameters()).build();
91        }
92       
93        public ComputingResource getParent() {
94                return parent;
95        }
96
97        public void setParent(ComputingResource newParent) {
98                parent = newParent;
99        }
100
101        public List<ComputingResource> getChildren() {
102                if (children == null)
103                        return new ArrayList<ComputingResource>(1);
104                return children;
105        }
106
107        public void addChild(ComputingResource child) {
108                child.setParent(this);
109                if (children == null)
110                        children = new ArrayList<ComputingResource>();
111                children.add(child);
112        }
113
114        public String getName() {
115                return name;
116        }
117       
118        public String getFullName() {
119                if(this.getResourceCharacteristic().getParameters().get("fullPath") != null){
120                        String fullPath = this.getResourceCharacteristic().getParameters().get("fullPath").get(0).getContent();
121                        return fullPath;
122                }
123                if(parent!= null){
124                        return parent.getFullName() + "/" + name;
125                } else
126                        return name;
127        }
128
129        public ResourceType getType() {
130                return type;
131        }
132
133        public ResourceCharacteristics getResourceCharacteristic() {
134                return resourceCharacteristic;
135        }
136
137        public ResourceStatus getStatus() {
138                return status;
139        }
140
141        public void setStatus(ResourceStatus newStatus) {
142                if(newStatus != status){
143                        status = newStatus;
144                        if(children != null) {
145                                for(ComputingResource child: children){
146                                        child.setStatus(status);
147                                }
148                        }       
149                }
150        }
151       
152        private void triggerEventUp(Event event) {
153                if(parent != null)
154                        parent.handleEvent(event);
155        }
156
157        public void handleEvent(Event event){
158                ResourceEventCommand rec = new ResourceEventCommand(this);
159                rec.execute(event);
160                SchedulingEventCommand sec = new SchedulingEventCommand(this);
161                sec.execute(event);
162
163                //old, correctly working method
164                /*if (extensionList != null) {
165                        for (Extension extension : extensionList) {
166                                if (extension.supportsEvent(event)) {
167                                        extension.handleEvent(event);
168                                }
169                        }
170                }*/
171                //TODO - delete, check in advance
172                //if(scheduler != null && (parent != null && scheduler != parent.getScheduler())/*scheduler.getResources().contains(this)*/){
173                //      String src = event.getSource() != null ? event.getSource() : name;
174                //      scheduler.sendInternal(GridSimTags.SCHEDULE_NOW, DCWormsTags.UPDATE, src);
175                //}
176                //triggerEventUp(event);
177        }
178       
179        public List <? extends ComputingResource> getDescendantsByType(ResourceType type) {
180                List<ResourceValidator> validators = new ArrayList<ResourceValidator>();
181                validators.add(new ResourceTypeValidator(type));
182                return searchDescendants(validators, true);
183        }
184
185        public List<? extends ComputingResource> getDescendantsByTypeAndStatus(ResourceType type, ResourceStatus status) {
186                List<ResourceValidator> validators = new ArrayList<ResourceValidator>();
187                validators.add(new ResourceStatusValidator(status));
188                validators.add(new ResourceTypeValidator(type));
189                return searchDescendants(validators, true);
190        }
191
192        public ComputingResource getDescendantByName(String resourceName) throws ResourceException {
193                List<ResourceValidator> validators = new ArrayList<ResourceValidator>();
194                validators.add(new ResourceNameValidator(resourceName));
195                List<? extends ComputingResource> resources = searchDescendants(validators, true);
196                return resources.size() == 0 ? null : resources.get(0);
197        }
198       
199        public List<? extends ComputingResource> filterDescendants(Properties properties)  {
200                List<ResourceValidator> validators = new ArrayList<ResourceValidator>();
201                validators.add(new ResourcePropertiesValidator(properties));
202                return searchDescendants(validators, false);
203        }
204       
205        protected List<? extends ComputingResource> searchDescendants(List<ResourceValidator> validators, boolean cutOff) {
206
207                List<ComputingResource> descendants = new ArrayList<ComputingResource>();
208                if (children != null) {
209                        LinkedList<ComputingResource> toExamine = new LinkedList<ComputingResource>();
210                        toExamine.push(this);
211
212                        while (!toExamine.isEmpty()) {
213                                ComputingResource resource = toExamine.pop();
214                                List<ComputingResource> resources = resource.getChildren();
215                                int numberOfRes = resources.size();
216                                for (int i = 0; i < numberOfRes; i++) {
217                                        ComputingResource resourceChild = resources.get(i);
218                                        if (resourceChild.match(validators)) {
219                                                descendants.add(resourceChild);
220                                                if(cutOff == false) {
221                                                        toExamine.addLast(resourceChild);
222                                                }
223                                        } else
224                                                //toExamine.insertElementAt(resourceChild, 0);
225                                                toExamine.addLast(resourceChild);
226                                }
227                        }
228                }
229                return descendants;
230        }
231       
232        protected boolean match(List<ResourceValidator> validators){
233                for(ResourceValidator validator: validators){
234                        if(validator.validate(this) == false)
235                                return false;
236                }
237                return true;
238        }
239       
240        public Properties getProperties(){
241                PropertiesDirector propDirector = new PropertiesDirector();
242                propDirector.setPropertiesBuilder(new DefaultPropertiesBuilder());
243                propDirector.constructProperties(this);
244                return propDirector.getProperties();
245        }
246       
247        public String getCategory(){
248                return category;
249        }
250       
251        public PowerInterface getPowerInterface(){
252                Extension extension = getExtension(ExtensionType.ENERGY_EXTENSION);
253                if(extension != null){
254                        EnergyExtension ee = (EnergyExtension)extension;
255                        return ee.getPowerInterface();
256                }
257                return null;
258        }
259       
260        public AirThroughputInterface getAirThroughputInterface(){
261                Extension extension = getExtension(ExtensionType.ENERGY_EXTENSION);
262                if(extension != null){
263                        EnergyExtension ee = (EnergyExtension)extension;
264                        return ee.getAirThroughputInterface();
265                }
266                return null;
267        }
268       
269        public ThermalInterface getThermalInterface(){
270                Extension extension = getExtension(ExtensionType.ENERGY_EXTENSION);
271                if(extension != null){
272                        EnergyExtension ee = (EnergyExtension)extension;
273                        return ee.getThermalInterface();
274                }
275                return null;
276        }
277
278        private Extension getExtension(ExtensionType type){
279                if (extensionList != null) {
280                        for (Extension extension : extensionList) {
281                                if (extension.getType() == type) {
282                                        return extension;
283                                }
284                        }
285                }
286                return null;
287        }
288       
289        public Scheduler getScheduler() {
290                return scheduler;
291        }
292       
293        public void setScheduler(Scheduler scheduler) {
294                this.scheduler = scheduler;
295                if(children != null){
296                        for(ComputingResource child: children){
297                                child.setScheduler(scheduler);
298                        }       
299                }
300        }
301
302        class ComputingResourceEventHandler implements EventHandler{
303               
304                public void handleResourceEvent(Event event){
305                        if (extensionList != null) {
306                                for (Extension extension : extensionList) {
307                                        if (extension.supportsEvent(event)) {
308                                                extension.handleEvent(event);
309                                        }
310                                }
311                        }
312                        if(event.getReason() != EventReason.SIM_INIT)
313                                triggerEventUp(event);
314                }
315               
316                public void handleSchedulingEvent(SchedulingEvent event){
317
318                        if(scheduler != null && (parent != null && scheduler != parent.getScheduler())/*scheduler.getResources().contains(this)*/){
319                                String src = event.getSource() != null ? event.getSource() : name;
320                                scheduler.sendInternal(GridSimTags.SCHEDULE_NOW, DCWormsTags.UPDATE_PROCESSING, src);
321                        } else if(parent != null)
322                                parent.getEventHandler().handleSchedulingEvent(event);
323                       
324                        //TODO - check if needed
325                        //if(event.getReason() != EventReason.SIM_INIT)
326                        //      triggerEventUp(event);
327                }
328        }
329       
330        public EventHandler getEventHandler(){
331                return new ComputingResourceEventHandler();
332        }
333       
334        public void initiate(){
335               
336                ResourceEventCommand rec = new ResourceEventCommand(this);
337                EnergyEvent event = new EnergyEvent(EnergyEventType.AIRFLOW_STATE_CHANGED, "Resource controller");
338                event.setReason(EventReason.SIM_INIT);
339                rec.execute(event);
340                /*ResourceEventCommand*/ rec = new ResourceEventCommand(this);
341                /*EnergyEvent*/ event = new EnergyEvent(EnergyEventType.POWER_STATE_CHANGED, "Resource controller");
342                event.setReason(EventReason.SIM_INIT);
343                rec.execute(event);
344               
345                //alternative way
346                //getEventHandler().handleResourceEvent(new EnergyEvent(EnergyEventType.AIRFLOW_STATE_CHANGED, "Resource controller"));
347                //getEventHandler().handleResourceEvent(new EnergyEvent(EnergyEventType.POWER_STATE_CHANGED, "Resource controller"));
348        }
349       
350       
351        private void accept(EnergyExtension e){
352                extensionList.add(e);
353        }
354}
Note: See TracBrowser for help on using the repository browser.