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

Revision 1207, 9.9 KB checked in by wojtekp, 11 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.events.Event;
12import schedframe.events.EventHandler;
13import schedframe.events.ResourceEventCommand;
14import schedframe.events.scheduling.EventReason;
15import schedframe.events.scheduling.SchedulingEvent;
16import schedframe.events.scheduling.SchedulingEventCommand;
17import schedframe.exceptions.ResourceException;
18import schedframe.resources.ResourceStatus;
19import schedframe.resources.ResourceType;
20import schedframe.resources.computing.description.ComputingResourceDescription;
21import schedframe.resources.computing.extensions.Extension;
22import schedframe.resources.computing.extensions.ExtensionListImpl;
23import schedframe.resources.computing.profiles.energy.EnergyEvent;
24import schedframe.resources.computing.profiles.energy.EnergyEventType;
25import schedframe.resources.computing.profiles.energy.EnergyExtension;
26import schedframe.resources.computing.properties.DefaultPropertiesBuilder;
27import schedframe.resources.computing.properties.PropertiesDirector;
28import schedframe.resources.computing.validator.ResourceNameValidator;
29import schedframe.resources.computing.validator.ResourcePropertiesValidator;
30import schedframe.resources.computing.validator.ResourceStatusValidator;
31import schedframe.resources.computing.validator.ResourceTypeValidator;
32import schedframe.resources.computing.validator.ResourceValidator;
33import schedframe.resources.devices.Device;
34import schedframe.resources.devices.PhysicalResource;
35import schedframe.scheduling.Scheduler;
36
37public class ComputingResource extends PhysicalResource{
38
39        protected ComputingResource parent;
40        protected List<ComputingResource> children;
41       
42        protected Scheduler scheduler;
43        //protected ResourceCharacteristics resourceCharacteristic;
44
45
46        public ComputingResource(ComputingResourceDescription resDesc) {
47                this.type = resDesc.getType();
48                this.name = resDesc.getId();
49                this.category = resDesc.getCategory();
50                this.status = ResourceStatus.FREE;
51                this.extensionList = new ExtensionListImpl(1);
52                initCharacteristics(resDesc);
53                accept(new EnergyExtension.Builder().resource(this).powerProfile(resDesc.getPowerProfile()).airFlowProfile(resDesc.getAirThroughputProfile()).thermalProfile(resDesc.getThermalProfile()).build());     
54        }
55
56        protected void initCharacteristics(ComputingResourceDescription resDesc){
57                resourceCharacteristic = ComputingResourceCharacteristics.builder().resourceUnits(resDesc.getResourceUnits()).location(resDesc.getLocation()).parameters(resDesc.getParameters()).device(resDesc.getDevices()).build();
58                for(Device device: ((ComputingResourceCharacteristics)resourceCharacteristic).getDevices()){
59                        device.setComputingResource(this);
60                }
61        }
62       
63        public ComputingResource getParent() {
64                return parent;
65        }
66
67        public void setParent(ComputingResource newParent) {
68                parent = newParent;
69        }
70
71        public List<ComputingResource> getChildren() {
72                if (children == null)
73                        return new ArrayList<ComputingResource>(1);
74                return children;
75        }
76
77        public void addChild(ComputingResource child) {
78                child.setParent(this);
79                if (children == null)
80                        children = new ArrayList<ComputingResource>();
81                children.add(child);
82        }
83
84        public String getFullName() {
85                if(this.getResourceCharacteristic().getParameters().get("fullPath") != null){
86                        String fullPath = this.getResourceCharacteristic().getParameters().get("fullPath").get(0).getContent();
87                        return fullPath;
88                }
89                if(parent!= null){
90                        return parent.getFullName() + "/" + name;
91                } else
92                        return name;
93        }
94
95        public ComputingResourceCharacteristics getResourceCharacteristic() {
96                return (ComputingResourceCharacteristics)resourceCharacteristic;
97        }
98
99        public void setStatus(ResourceStatus newStatus) {
100                if(newStatus != status){
101                        status = newStatus;
102                        if(children != null) {
103                                for(ComputingResource child: children){
104                                        child.setStatus(status);
105                                }
106                        }       
107                }
108        }
109       
110        private void triggerEventUp(Event event) {
111                if(parent != null)
112                        parent.handleEvent(event);
113        }
114
115        public void handleEvent(Event event){
116                ResourceEventCommand rec = new ResourceEventCommand(this);
117                rec.execute(event);
118                SchedulingEventCommand sec = new SchedulingEventCommand(this);
119                sec.execute(event);
120
121                //old, correctly working method
122                /*if (extensionList != null) {
123                        for (Extension extension : extensionList) {
124                                if (extension.supportsEvent(event)) {
125                                        extension.handleEvent(event);
126                                }
127                        }
128                }*/
129                //TODO - delete, check in advance
130                //if(scheduler != null && (parent != null && scheduler != parent.getScheduler())/*scheduler.getResources().contains(this)*/){
131                //      String src = event.getSource() != null ? event.getSource() : name;
132                //      scheduler.sendInternal(GridSimTags.SCHEDULE_NOW, DCWormsTags.UPDATE, src);
133                //}
134                //triggerEventUp(event);
135        }
136       
137        public List <? extends ComputingResource> getDescendantsByType(ResourceType type) {
138                List<ResourceValidator> validators = new ArrayList<ResourceValidator>();
139                validators.add(new ResourceTypeValidator(type));
140                return searchDescendants(validators, true);
141        }
142
143        public List<? extends ComputingResource> getDescendantsByTypeAndStatus(ResourceType type, ResourceStatus status) {
144                List<ResourceValidator> validators = new ArrayList<ResourceValidator>();
145                validators.add(new ResourceStatusValidator(status));
146                validators.add(new ResourceTypeValidator(type));
147                return searchDescendants(validators, true);
148        }
149
150        public ComputingResource getDescendantByName(String resourceName) throws ResourceException {
151                List<ResourceValidator> validators = new ArrayList<ResourceValidator>();
152                validators.add(new ResourceNameValidator(resourceName));
153                List<? extends ComputingResource> resources = searchDescendants(validators, true);
154                return resources.size() == 0 ? null : resources.get(0);
155        }
156       
157        public List<? extends ComputingResource> filterDescendants(Properties properties)  {
158                List<ResourceValidator> validators = new ArrayList<ResourceValidator>();
159                validators.add(new ResourcePropertiesValidator(properties));
160                return searchDescendants(validators, false);
161        }
162       
163        protected List<? extends ComputingResource> searchDescendants(List<ResourceValidator> validators, boolean cutOff) {
164
165                List<ComputingResource> descendants = new ArrayList<ComputingResource>();
166                if (children != null) {
167                        LinkedList<ComputingResource> toExamine = new LinkedList<ComputingResource>();
168                        toExamine.push(this);
169
170                        while (!toExamine.isEmpty()) {
171                                ComputingResource resource = toExamine.pop();
172                                List<ComputingResource> resources = resource.getChildren();
173                                int numberOfRes = resources.size();
174                                for (int i = 0; i < numberOfRes; i++) {
175                                        ComputingResource resourceChild = resources.get(i);
176                                        if (resourceChild.match(validators)) {
177                                                descendants.add(resourceChild);
178                                                if(cutOff == false) {
179                                                        toExamine.addLast(resourceChild);
180                                                }
181                                        } else
182                                                //toExamine.insertElementAt(resourceChild, 0);
183                                                toExamine.addLast(resourceChild);
184                                }
185                        }
186                }
187                return descendants;
188        }
189       
190        protected boolean match(List<ResourceValidator> validators){
191                for(ResourceValidator validator: validators){
192                        if(validator.validate(this) == false)
193                                return false;
194                }
195                return true;
196        }
197       
198        public Properties getProperties(){
199                PropertiesDirector propDirector = new PropertiesDirector();
200                propDirector.setPropertiesBuilder(new DefaultPropertiesBuilder());
201                propDirector.constructProperties(this);
202                return propDirector.getProperties();
203        }
204       
205        public Scheduler getScheduler() {
206                return scheduler;
207        }
208       
209        public void setScheduler(Scheduler scheduler) {
210                this.scheduler = scheduler;
211                if(children != null){
212                        for(ComputingResource child: children){
213                                child.setScheduler(scheduler);
214                        }       
215                }
216        }
217
218        class ComputingResourceEventHandler implements EventHandler{
219               
220                public void handleResourceEvent(Event event){
221                        if (extensionList != null) {
222                                for (Extension extension : extensionList) {
223                                        if (extension.supportsEvent(event)) {
224                                                extension.handleEvent(event);
225                                        }
226                                }
227                               
228                                for (Device device: ((ComputingResourceCharacteristics)resourceCharacteristic).getDevices()) {
229                                        for (Extension extension : device.getExtensionList()) {
230                                                if (extension.supportsEvent(event)) {
231                                                        //extension.handleEvent(event);
232                                                }
233                                        }
234                                }
235                        }
236                        if(event.getReason() != EventReason.SIM_INIT)
237                                triggerEventUp(event);
238                }
239               
240                public void handleSchedulingEvent(SchedulingEvent event){
241
242                        if(scheduler != null && (parent != null && scheduler != parent.getScheduler())/*scheduler.getResources().contains(this)*/){
243                                String src = event.getSource() != null ? event.getSource() : name;
244                                scheduler.sendInternal(GridSimTags.SCHEDULE_NOW, DCWormsTags.UPDATE_PROCESSING, src);
245                        } else if(parent != null)
246                                parent.getEventHandler().handleSchedulingEvent(event);
247                       
248                        //TODO - check if needed
249                        //if(event.getReason() != EventReason.SIM_INIT)
250                        //      triggerEventUp(event);
251                }
252        }
253       
254        public EventHandler getEventHandler(){
255                return new ComputingResourceEventHandler();
256        }
257       
258        public final void initiate(){
259                for(Device dev: this.getResourceCharacteristic().getDevices()){
260                        dev.initiate();
261                }
262                ResourceEventCommand rec = new ResourceEventCommand(this);
263                EnergyEvent event = new EnergyEvent(EnergyEventType.AIRFLOW_STATE_CHANGED, "Resource controller");
264                event.setReason(EventReason.SIM_INIT);
265                rec.execute(event);
266                /*ResourceEventCommand*/ rec = new ResourceEventCommand(this);
267                /*EnergyEvent*/ event = new EnergyEvent(EnergyEventType.POWER_STATE_CHANGED, "Resource controller");
268                event.setReason(EventReason.SIM_INIT);
269                rec.execute(event);
270               
271                rec = new ResourceEventCommand(this);
272                event = new EnergyEvent(EnergyEventType.TEMPERATURE_CHANGED, "Resource controller");
273                event.setReason(EventReason.SIM_INIT);
274                rec.execute(event);
275               
276                //alternative way
277                //getEventHandler().handleResourceEvent(new EnergyEvent(EnergyEventType.AIRFLOW_STATE_CHANGED, "Resource controller"));
278                //getEventHandler().handleResourceEvent(new EnergyEvent(EnergyEventType.POWER_STATE_CHANGED, "Resource controller"));
279        }
280
281
282}
Note: See TracBrowser for help on using the repository browser.