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

Revision 894, 11.5 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(parent!= null){
120                        return parent.getFullName() + "/" + name;
121                } else
122                        return name;
123        }
124
125        public ResourceType getType() {
126                return type;
127        }
128
129        public ResourceCharacteristics getResourceCharacteristic() {
130                return resourceCharacteristic;
131        }
132
133        public ResourceStatus getStatus() {
134                return status;
135        }
136
137        public void setStatus(ResourceStatus newStatus) {
138                if(newStatus != status){
139                        status = newStatus;
140                        if(children != null) {
141                                for(ComputingResource child: children){
142                                        child.setStatus(status);
143                                }
144                        }       
145                }
146        }
147       
148        private void triggerEventUp(Event event) {
149                if(parent != null)
150                        parent.handleEvent(event);
151        }
152
153        public void handleEvent(Event event){
154                ResourceEventCommand rec = new ResourceEventCommand(this);
155                rec.execute(event);
156                SchedulingEventCommand sec = new SchedulingEventCommand(this);
157                sec.execute(event);
158
159                //old, correctly working method
160                /*if (extensionList != null) {
161                        for (Extension extension : extensionList) {
162                                if (extension.supportsEvent(event)) {
163                                        extension.handleEvent(event);
164                                }
165                        }
166                }*/
167                //TODO - delete, check in advance
168                //if(scheduler != null && (parent != null && scheduler != parent.getScheduler())/*scheduler.getResources().contains(this)*/){
169                //      String src = event.getSource() != null ? event.getSource() : name;
170                //      scheduler.sendInternal(GridSimTags.SCHEDULE_NOW, DCWormsTags.UPDATE, src);
171                //}
172                //triggerEventUp(event);
173        }
174       
175        public List <? extends ComputingResource> getDescendantsByType(ResourceType type) {
176                List<ResourceValidator> validators = new ArrayList<ResourceValidator>();
177                validators.add(new ResourceTypeValidator(type));
178                return searchDescendants(validators, true);
179        }
180
181        public List<? extends ComputingResource> getDescendantsByTypeAndStatus(ResourceType type, ResourceStatus status) {
182                List<ResourceValidator> validators = new ArrayList<ResourceValidator>();
183                validators.add(new ResourceStatusValidator(status));
184                validators.add(new ResourceTypeValidator(type));
185                return searchDescendants(validators, true);
186        }
187
188        public ComputingResource getDescendantByName(String resourceName) throws ResourceException {
189                List<ResourceValidator> validators = new ArrayList<ResourceValidator>();
190                validators.add(new ResourceNameValidator(resourceName));
191                List<? extends ComputingResource> resources = searchDescendants(validators, true);
192                return resources.size() == 0 ? null : resources.get(0);
193        }
194       
195        public List<? extends ComputingResource> filterDescendants(Properties properties)  {
196                List<ResourceValidator> validators = new ArrayList<ResourceValidator>();
197                validators.add(new ResourcePropertiesValidator(properties));
198                return searchDescendants(validators, false);
199        }
200       
201        protected List<? extends ComputingResource> searchDescendants(List<ResourceValidator> validators, boolean cutOff) {
202
203                List<ComputingResource> descendants = new ArrayList<ComputingResource>();
204                if (children != null) {
205                        LinkedList<ComputingResource> toExamine = new LinkedList<ComputingResource>();
206                        toExamine.push(this);
207
208                        while (!toExamine.isEmpty()) {
209                                ComputingResource resource = toExamine.pop();
210                                List<ComputingResource> resources = resource.getChildren();
211                                int numberOfRes = resources.size();
212                                for (int i = 0; i < numberOfRes; i++) {
213                                        ComputingResource resourceChild = resources.get(i);
214                                        if (resourceChild.match(validators)) {
215                                                descendants.add(resourceChild);
216                                                if(cutOff == false) {
217                                                        toExamine.addLast(resourceChild);
218                                                }
219                                        } else
220                                                //toExamine.insertElementAt(resourceChild, 0);
221                                                toExamine.addLast(resourceChild);
222                                }
223                        }
224                }
225                return descendants;
226        }
227       
228        protected boolean match(List<ResourceValidator> validators){
229                for(ResourceValidator validator: validators){
230                        if(validator.validate(this) == false)
231                                return false;
232                }
233                return true;
234        }
235       
236        public Properties getProperties(){
237                PropertiesDirector propDirector = new PropertiesDirector();
238                propDirector.setPropertiesBuilder(new DefaultPropertiesBuilder());
239                propDirector.constructProperties(this);
240                return propDirector.getProperties();
241        }
242       
243        public String getCategory(){
244                return category;
245        }
246       
247        public PowerInterface getPowerInterface(){
248                Extension extension = getExtension(ExtensionType.ENERGY_EXTENSION);
249                if(extension != null){
250                        EnergyExtension ee = (EnergyExtension)extension;
251                        return ee.getPowerInterface();
252                }
253                return null;
254        }
255       
256        public AirThroughputInterface getAirThroughputInterface(){
257                Extension extension = getExtension(ExtensionType.ENERGY_EXTENSION);
258                if(extension != null){
259                        EnergyExtension ee = (EnergyExtension)extension;
260                        return ee.getAirThroughputInterface();
261                }
262                return null;
263        }
264       
265        public ThermalInterface getThermalInterface(){
266                Extension extension = getExtension(ExtensionType.ENERGY_EXTENSION);
267                if(extension != null){
268                        EnergyExtension ee = (EnergyExtension)extension;
269                        return ee.getThermalInterface();
270                }
271                return null;
272        }
273
274        private Extension getExtension(ExtensionType type){
275                if (extensionList != null) {
276                        for (Extension extension : extensionList) {
277                                if (extension.getType() == type) {
278                                        return extension;
279                                }
280                        }
281                }
282                return null;
283        }
284       
285        public Scheduler getScheduler() {
286                return scheduler;
287        }
288       
289        public void setScheduler(Scheduler scheduler) {
290                this.scheduler = scheduler;
291                if(children != null){
292                        for(ComputingResource child: children){
293                                child.setScheduler(scheduler);
294                        }       
295                }
296        }
297
298        class ComputingResourceEventHandler implements EventHandler{
299               
300                public void handleResourceEvent(Event event){
301                        if (extensionList != null) {
302                                for (Extension extension : extensionList) {
303                                        if (extension.supportsEvent(event)) {
304                                                extension.handleEvent(event);
305                                        }
306                                }
307                        }
308                        if(event.getReason() != EventReason.SIM_INIT)
309                                triggerEventUp(event);
310                }
311               
312                public void handleSchedulingEvent(SchedulingEvent event){
313
314                        if(scheduler != null && (parent != null && scheduler != parent.getScheduler())/*scheduler.getResources().contains(this)*/){
315                                String src = event.getSource() != null ? event.getSource() : name;
316                                scheduler.sendInternal(GridSimTags.SCHEDULE_NOW, DCWormsTags.UPDATE_PROCESSING, src);
317                        } else if(parent != null)
318                                parent.getEventHandler().handleSchedulingEvent(event);
319                       
320                        //TODO - check if needed
321                        //if(event.getReason() != EventReason.SIM_INIT)
322                        //      triggerEventUp(event);
323                }
324        }
325       
326        public EventHandler getEventHandler(){
327                return new ComputingResourceEventHandler();
328        }
329       
330        public void initiate(){
331               
332                ResourceEventCommand rec = new ResourceEventCommand(this);
333                EnergyEvent event = new EnergyEvent(EnergyEventType.AIRFLOW_STATE_CHANGED, "Resource controller");
334                event.setReason(EventReason.SIM_INIT);
335                rec.execute(event);
336                /*ResourceEventCommand*/ rec = new ResourceEventCommand(this);
337                /*EnergyEvent*/ event = new EnergyEvent(EnergyEventType.POWER_STATE_CHANGED, "Resource controller");
338                event.setReason(EventReason.SIM_INIT);
339                rec.execute(event);
340               
341                //alternative way
342                //getEventHandler().handleResourceEvent(new EnergyEvent(EnergyEventType.AIRFLOW_STATE_CHANGED, "Resource controller"));
343                //getEventHandler().handleResourceEvent(new EnergyEvent(EnergyEventType.POWER_STATE_CHANGED, "Resource controller"));
344        }
345       
346       
347        private void accept(EnergyExtension e){
348                extensionList.add(e);
349        }
350}
Note: See TracBrowser for help on using the repository browser.