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

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