source: xssim/trunk/src/test/rewolucja/energy/extension/EnergyExtension.java @ 191

Revision 191, 5.4 KB checked in by wojtekp, 13 years ago (diff)
  • Property svn:mime-type set to text/plain
Line 
1package test.rewolucja.energy.extension;
2
3import java.util.ArrayList;
4import java.util.List;
5import java.util.Properties;
6
7import org.apache.commons.logging.Log;
8import org.apache.commons.logging.LogFactory;
9import org.joda.time.DateTimeUtils;
10
11import schedframe.resources.profile.PowerUsage;
12import simulator.utils.InstanceFactory;
13import test.rewolucja.energy.EnergyEvent;
14import test.rewolucja.energy.EnergyEventType;
15import test.rewolucja.energy.plugin.EnergyEstimationPluginInterface;
16import test.rewolucja.energy.profile.PowerInterface;
17import test.rewolucja.extensions.Extension;
18import test.rewolucja.extensions.ExtensionException;
19import test.rewolucja.extensions.ExtensionType;
20import test.rewolucja.resources.physical.base.ComputingResource;
21import test.rewolucja.resources.test.Event;
22import test.rewolucja.scheduling.JobRegistry;
23import example.energy.DefaultEnergyEstimationPlugin;
24
25public class EnergyExtension implements Extension {
26
27        private Log log = LogFactory.getLog(EnergyExtension.class);
28
29        protected PowerInterface powerInterface;
30        protected List<PowerUsage> powerUsage;
31        protected EnergyEstimationPluginInterface energyEstimationPlugin;
32
33   protected ComputingResource resource;
34
35
36       
37        public EnergyExtension(ComputingResource resource, PowerInterface powerInterface, String energyEstimationPluginClassName) {
38                initPlugin(energyEstimationPluginClassName);
39                this.powerInterface = powerInterface;
40                this.resource = resource;
41                this.powerUsage = new ArrayList<PowerUsage>();
42                //int power = energyEstimationPlugin.estimatePowerConsumption(null, resource);
43                //if(resource.getType()==ResourceType.CPU)
44                //      addToPowerUsageHistory(powerInterface.getPowerConsumption(powerInterface.getPowerState()));
45        }
46       
47        public void initPlugin(String energyEstimationPluginClassName){
48                if(energyEstimationPluginClassName != null) {
49                        energyEstimationPlugin = (EnergyEstimationPluginInterface) InstanceFactory.createInstance(
50                                        energyEstimationPluginClassName, EnergyEstimationPluginInterface.class);
51                        if(energyEstimationPlugin == null){
52                                energyEstimationPlugin = new DefaultEnergyEstimationPlugin();
53                                log.info("Using default energy estimation plugin: " + DefaultEnergyEstimationPlugin.class.getName());
54                               
55                        } else {
56                                energyEstimationPlugin.init(null);
57                        }
58                       
59                } else {
60                        energyEstimationPlugin = new DefaultEnergyEstimationPlugin();
61                        log.info("Using default energy estimation plugin: " + DefaultEnergyEstimationPlugin.class.getName());
62                }
63        }
64
65        @Override
66        public void init(Properties properties) throws ExtensionException {
67                // TODO Auto-generated method stub
68        }
69
70        @Override
71        public void dispose() throws ExtensionException {
72                // TODO Auto-generated method stub
73
74        }
75
76        @Override
77        public ExtensionType getType() {
78                return ExtensionType.ENERGY_EXTENSION;
79        }
80
81        @Override
82        public boolean supportsEvent(Event event) {
83                EnergyEvent enEvent = (EnergyEvent)event;
84                switch (enEvent.getType()) {
85
86                case POWER_STATE_CHANGED:
87                        return true;
88                case FREQUENCY_CHANGED:
89                        return true;
90                case TASK_STARTED:
91                        return true;
92                case TASK_FINISHED:
93                        return true;
94                default:
95                        return false;
96                }
97        }
98
99        public PowerInterface getPowerInterface() {
100                return powerInterface;
101        }
102
103        private void addToPowerUsageHistory(double power) {
104
105                if (powerUsage.size() == 0) {
106                        PowerUsage usage = new PowerUsage(DateTimeUtils.currentTimeMillis(), power);
107                        powerUsage.add(usage);
108                        return;
109                }
110
111                int lastIdx = powerUsage.size() - 1;
112                double lastPower = powerUsage.get(lastIdx).getValue();
113                if (lastPower != power) {
114                        PowerUsage usage = powerUsage.get(lastIdx);
115                        long currentTime = DateTimeUtils.currentTimeMillis();
116                        if (usage.getTimestamp() == currentTime) {
117                                usage.setValue(power);
118                                if(lastIdx > 0 && powerUsage.get(lastIdx - 1).getValue() == power)
119                                        powerUsage.remove(usage);
120
121                                //powerUsage.remove(usage);
122                                //usage = new PowerUsage(DateTimeUtils.currentTimeMillis(), power);
123                                //powerUsage.add(usage);
124                        } else {
125                                usage = new PowerUsage(DateTimeUtils.currentTimeMillis(), power);
126                                powerUsage.add(usage);
127                        }
128                }
129        }
130
131        public List<PowerUsage> getPowerUsageHistory() {
132                if(powerUsage.size() == 0){
133                        double power = energyEstimationPlugin.estimatePowerConsumption(new EnergyEvent(EnergyEventType.POWER_STATE_CHANGED, resource.getName()), new JobRegistry(resource.getName()), resource);
134                        addToPowerUsageHistory(power);
135                }
136                return powerUsage;
137        }
138
139
140        @Override
141        public void handleEvent(Event event) {
142                EnergyEvent enEvent = (EnergyEvent)event;
143                double power = 0;
144                switch (enEvent.getType()) {
145               
146                case POWER_STATE_CHANGED:
147                        power = energyEstimationPlugin.estimatePowerConsumption(enEvent, new JobRegistry(resource.getName()), resource);
148                        addToPowerUsageHistory(power);
149                        break;
150                       
151                case FREQUENCY_CHANGED:
152                        power = energyEstimationPlugin.estimatePowerConsumption(enEvent, new JobRegistry(resource.getName()), resource);
153                        addToPowerUsageHistory(power);
154                        break;
155                       
156                case TASK_STARTED:
157                       
158                        power = energyEstimationPlugin.estimatePowerConsumption(enEvent, new JobRegistry(resource.getName()), resource);
159                        addToPowerUsageHistory(power);
160                        break;
161
162                case TASK_FINISHED:
163                        //System.out.println(this.resource.getName() + " - ENERGY EXTENSION: TASK FINISHED");
164                        power = energyEstimationPlugin.estimatePowerConsumption(enEvent, new JobRegistry(resource.getName()), resource);
165                        //System.out.println(this.resource.getName() + " - ESTIMATED ENERGY:" + power);
166                        addToPowerUsageHistory(power);
167
168                        break;
169
170                }
171        }
172       
173
174        public ComputingResource getResource() {
175                return resource;
176        }
177
178
179}
Note: See TracBrowser for help on using the repository browser.