source: DCWoRMS/branches/coolemall/src/test/testSOP/Utility.java @ 1606

Revision 1606, 8.6 KB checked in by wojtekp, 8 years ago (diff)
  • Property svn:mime-type set to text/plain
RevLine 
[1606]1package test.testSOP;
2
3import gridsim.dcworms.DCWormsTags;
4
5import java.io.File;
6import java.io.FileWriter;
7import java.io.IOException;
8import java.io.PrintWriter;
9import java.util.ArrayList;
10import java.util.List;
11
12import org.apache.commons.logging.Log;
13
14import dcworms.schedframe.scheduling.ExecTask;
15
16import schedframe.resources.computing.Node;
17import schedframe.resources.computing.profiles.energy.power.StandardPowerStateName;
18import schedframe.scheduling.manager.resources.ClusterResourceManager;
19import schedframe.scheduling.manager.tasks.JobRegistry;
20
21public class Utility {
22        public static int NUMBER_HOST_PIVOT = 1;
23        public static String HOST_NUMBER_PATH = "src/test/testSOP_results/data/expectedHostNumber.txt";
24       
25       
26        //Retrieve nodes by powerstateNames
27        public static List<Node> getNodesByPowerState(List<Node> nodes, StandardPowerStateName psName) {
28                ArrayList<Node> nodelist = new ArrayList<Node>();
29                for (Node n : nodes) {
30                        if (n.getPowerInterface().getPowerState().equals(psName)) {
31                                nodelist.add(n);
32                        }
33                }
34                return nodelist;
35        }
36
37       
38        public static int getExpectedHostNumber(JobRegistry jr, ClusterResourceManager resourceManager, Log log) {
39                float cpuReq = 0;
40                float memReq = 0;
41
42                synchronized(jr.getTasks()) {
43                        for (ExecTask t : jr.getTasks()) {
44       
45                                if (t.getStatus() != DCWormsTags.SUCCESS && t.getStatus() != DCWormsTags.FAILED
46                                                && t.getStatus() != DCWormsTags.CANCELED) {
47       
48                                        try {
49                                                cpuReq += t.getCpuCntRequest();
50                                                memReq += t.getMemoryRequest();
51                                        } catch (NoSuchFieldException e) {
52                                                // TODO Auto-generated catch block
53                                                e.printStackTrace();
54                                        }
55                                }
56                        }
57                }
58                // Compute total capacity
59                List<Node> nodes = resourceManager.getNodes();
60                float cpuCapacity = 0;
61                float memCapacity = 0;
62                for (Node n : nodes) {
63                        try {
64                                cpuCapacity += n.getProcessorsNumber();
65                                memCapacity += n.getTotalMemory();
66                        } catch (NoSuchFieldException e) {
67                                e.printStackTrace();
68                        }
69                }
70                // log.debug("CPU capacity = "+cpuCapacity);
71                // log.debug("MEM capacity = "+memCapacity);
72                //log.debug("CPU req = " + cpuReq);
73                //log.debug("MEM req = " + memReq);
74                float averageHostCPUCapacity = cpuCapacity / (float) nodes.size();
75                float averageHostMEMCapacity = memCapacity / (float) nodes.size();
76                //log.debug("avgMaxHostCPUCapacity = " + averageHostCPUCapacity);
77                //log.debug("averageHostMEMCapacity = " + averageHostMEMCapacity);
78                int expectedHostNumberCPU = (int) (cpuReq / averageHostCPUCapacity);
79                int expectedHostNumberMEM = (int) (memReq / averageHostMEMCapacity);
80                int expectedHostNumber = Math.max(expectedHostNumberCPU, expectedHostNumberMEM);
81                // log.debug("Expecting needing max ("+expectedHostNumberCPU+","+expectedHostNumberMEM+") Nodes");
82
83                expectedHostNumber = expectedHostNumber + Utility.NUMBER_HOST_PIVOT;
84                log.debug("Host to be on : " + expectedHostNumber);
85                //
86                // PrintWriter writer = null;
87                // try {
88                // writer = new PrintWriter(new FileWriter(HOST_NUMBER_PATH, true));
89                // writer.println(String.format("%d", expectedHostNumber));
90                // writer.close();
91                // } catch (IOException e) {
92                // e.printStackTrace();
93                // } finally {
94                // writer.close();
95                // }
96                return expectedHostNumber;
97        }
98       
99        public static int getAllRunningTasks(JobRegistry jr) {
100                int nb = 0;
101                synchronized(jr.getTasks()) {
102                        for (ExecTask t : jr.getTasks()) {
103                               
104                                if (t.getStatus() != DCWormsTags.SUCCESS && t.getStatus() != DCWormsTags.FAILED && t.getStatus() != DCWormsTags.CANCELED) {
105                                        nb++;
106                                }
107                        }
108                }
109                return nb;
110        }
111       
112        public static void manageHosts(JobRegistry jr, ClusterResourceManager resourceManager, Log log) {
113                List<Node> nodes = resourceManager.getNodes();
114                int expectedHostNumber = getExpectedHostNumber(jr, resourceManager, log);
115
116                //Counting ON and BOOT hosts
117                int nbOnHosts = 0;
118                int nbBootingHosts = 0;
119                for (Node n : nodes) {
120                        if (n.getPowerInterface().getPowerState().equals(StandardPowerStateName.ON)) {
121                                nbOnHosts++;
122                        }
123                        if (n.getPowerInterface().getPowerState().equals(StandardPowerStateName.BOOT)) {
124                                nbBootingHosts++;
125                        }
126                }
127                synchronized(jr.getTasks()) {
128                        for (ExecTask t : jr.getTasks()) {
129       
130                                if (t.getStatus() != DCWormsTags.SUCCESS && t.getStatus() != DCWormsTags.FAILED
131                                                && t.getStatus() != DCWormsTags.CANCELED) {
132                                        log.debug(t.getJobId()+ " is still running");
133                                }
134                        }
135                }
136                log.debug("");
137                //log.debug("There is "+(nbOnHosts+nbBootingHosts)+" powered ON("+nbOnHosts+") or BOOTING("+nbBootingHosts+")");
138                int nbTotal = nbOnHosts+nbBootingHosts;
139               
140                PrintWriter writer = null;
141                try {
142                        writer = new PrintWriter(new FileWriter(HOST_NUMBER_PATH, true));
143                        writer.println(String.format("%d\t%d", nbOnHosts, expectedHostNumber));
144                        log.debug("Wrote in HOST_NUMBER_PATH: "+HOST_NUMBER_PATH);
145                        writer.close();
146                } catch (IOException e) {
147                        e.printStackTrace();
148                } finally {
149                        writer.close();
150                }
151               
152                //We have to power on a host
153                if (nbTotal < expectedHostNumber) {
154                        //log.debug("nbOnHosts < expectedHostNumber : We have to power on a host");
155                        Node n = findNodeToPowerON(resourceManager, log);
156//                      ArrayList<Node> nList = findNodeListToPowerON(resourceManager, log);
157                        if(n != null) {
158                                //log.debug("Powering ON node "+n.getName());
159//                              n.getPowerInterface().setPowerState(StandardPowerStateName.ON);
160                                n.getPowerInterface().turnOn();
161                        }
162                }
163                //We have to power off hosts
164                else if (nbTotal > expectedHostNumber) {
165                        log.debug("nbOnHosts > expectedHostNumber : We have to power off hosts");
166//                      Node n = findNodeToPowerOFF(resourceManager, log);
167                        ArrayList<Node> nList = findNodeListToPowerOFF(resourceManager, log);
168                        if (nList!= null) {
169                                log.debug("Half the hosts nb is :"+Math.ceil((float)nList.size()/(float)2));
170                                for(int i = 0 ; i<Math.ceil((float)nList.size()/(float)2) ; i++) {
171                                        //log.debug("Powering OFF node " +nList.get(i).getName());
172                                        nList.get(i).getPowerInterface().turnOff();
173                                }
174                        }
175                }
176                //We do nothing
177                else {
178                        log.debug("The right number of hosts, do nothing");
179                }
180        }
181       
182        //Find all nodes that we can power off
183        private static ArrayList<Node> findNodeListToPowerOFF(ClusterResourceManager resourceManager, Log log) {
184                List<Node> nodes = resourceManager.getNodes();
185                ArrayList<Node> nodeList = new ArrayList<Node>();
186                for (Node n : nodes) {
187                        if (n.getPowerInterface().getPowerState().equals(StandardPowerStateName.ON)) {
188                                if (nodeIsEmpty(n, log)) {
189                                        nodeList.add(n);
190                                }
191                        }
192                }
193                if (nodeList.size() == 0) {
194                        log.debug("findNodeToPowerOFF() : no host found");
195                        return null;
196                }
197                else {
198                        return nodeList;
199                }
200        }
201
202
203        /**
204         * Finds empty node to power off
205         * @param resourceManager
206         * @return
207         */
208        //TODO: Find best node to poweroff, sort list?
209        private static Node findNodeToPowerOFF(ClusterResourceManager resourceManager, Log log) {
210                List<Node> nodes = resourceManager.getNodes();
211                for (Node n : nodes) {
212                        if (n.getPowerInterface().getPowerState().equals(StandardPowerStateName.ON)) {
213                                if (nodeIsEmpty(n, log)) {
214                                        return n;
215                                }
216                        }
217                }
218                log.debug("findNodeToPowerOFF() : no host found");
219                return null;
220        }
221
222        /**
223         * Find first node to power ON
224         * @param resourceManager
225         * @return
226         */
227        //TODO: Find best node to powerOn, sort list?
228        private static Node findNodeToPowerON(ClusterResourceManager resourceManager, Log log) {
229                List<Node> nodes = resourceManager.getNodes();
230                for (Node n : nodes) {
231                        if (n.getPowerInterface().getPowerState().equals(StandardPowerStateName.OFF))
232                                return n;
233                }
234                //log.debug("findNodeToPowerON() : no host found");
235                return null;
236        }
237
238        public static boolean nodeIsEmpty(Node n, Log log) {
239                try {
240                        boolean ret =  (n.getFreeMemory() == n.getTotalMemory()) && (n.getFreeProcessorsNumber() == n.getProcessorsNumber());
241                        if (ret == false) {
242                                //log.debug("FreeMEM: "+n.getFreeMemory()+" // TotalMEM : " +n.getTotalMemory());
243                        }
244                        return ret;
245                } catch (NoSuchFieldException e) {
246                        e.printStackTrace();
247                }
248                return false;
249        }
250
251
252        public static void deleteFile(String path, Log log) {
253                //Delete migration file
254                File file = new File(path);
255                if (file.delete()) {
256                        log.debug("Successfully deleted file "+path);
257                }
258                else {
259                        log.debug("Failed to delete file "+path);
260                }
261               
262        }
263       
264        /**
265         * Executes an external python program
266         * @param path path to executable
267         */
268        public static void executeExternalProgram(String path) {
269                ProcessBuilder pb = new ProcessBuilder("python",path);
270                try {
271                        Process p = pb.start();
272                        p.waitFor();
273                } catch (IOException e) {
274                        e.printStackTrace();
275                } catch (InterruptedException e) {
276                        e.printStackTrace();
277                }
278        }
279}
Note: See TracBrowser for help on using the repository browser.