Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Merge tag 'v3_9_90' into hypervisor
[simgrid.git] / src / bindings / java / org / simgrid / msg / VM.java
index 5c9c8e3..7b73404 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * JNI interface to Cloud interface in Simgrid
+ * JNI interface to virtual machine in Simgrid
  * 
  * Copyright (c) 2006-2013. The SimGrid Team.
  * All right reserved. 
@@ -13,61 +13,154 @@ package org.simgrid.msg;
 import org.simgrid.msg.Host;
 import org.simgrid.msg.Process;
 
-public class VM {
-       /**
-        * This attribute represents a bind between a java task object and
-        * a native task. Even if this attribute is public you must never
-        * access to it. It is set automatically during the build of the object.
-        */
-       private long bind = 0;
+public class VM extends Host{
+       // Please note that we are not declaring a new bind variable 
+       //(the bind variable has been inherited from the super class Host)
+       
+       /* Static functions */ 
+       // GetByName is inherited from the super class Host
        
-       private int coreAmount;
 
-        private String name;
+        private static VM[] vms=null;    
+    private Host currentHost; 
+
+       /* Constructors / destructors */
+    /**
+        * Create a `basic' VM (i.e. 1 core, 1GB of RAM, other values are not taken into account).
+        */
+       public VM(Host host, String name) {
+               this(host,name,1,1024, -1, null, -1,0 , 0);
+       }
+
        /**
-        * Create a new empty VM.
-        * NOTE: it is expected that in the future, the coreAmount parameter will be used
-        * to add extra constraints on the execution, but the argument is ignored for now.
+        * Create a  VM
+        * @param host, Host node
+        * @param name, name of the machine
+        * @param nCore, number of core
+        * @param ramSize, size of the RAM that should be allocated (in MBytes) 
+        * @param netCap (not used for the moment)
+        * @param diskPath (not used for the moment)
+        * @param diskSize (not used for the moment)
+        * @param migNetSpeed (network bandwith allocated for migrations in MB/s, if you don't know put zero ;))
+        * @param dpIntensity (dirty page percentage according to migNetSpeed, [0-100], if you don't know put zero ;))
         */
-       public VM(Host host, String name, int coreAmount) {
-               this.coreAmount = coreAmount;
-               this.name = name;
-               start(host,name,coreAmount);
+       
+       public VM(Host host, String name, int nCore,  int ramSize, 
+                       int netCap, String diskPath, int diskSize, int migNetSpeed, int dpIntensity){
+               super();
+               super.name = name; 
+               this.currentHost = host; 
+               create(host, name, nCore, ramSize, netCap, diskPath, diskSize, migNetSpeed, dpIntensity);
+               VM.addVM(this);
+       }
+
+       private static void addVM(VM vm){
+               VM[] vmsN=null; 
+               int i=0;
+               if(VM.vms == null)
+                       vmsN = new VM[1]; 
+               else
+                       vmsN = new VM[vms.length+1]; 
+               
+               for (i=0; i<vmsN.length-1 ; i ++){
+                       vmsN[i]=vms[i]; 
+               } 
+               vmsN[i]=vm;
+               vms=vmsN;
+       }
+   public static VM[] all(){
+               return vms;
+       }
+       public static VM getVMByName(String name){
+               for (int i=0 ; i < vms.length ; i++){
+                         if (vms[i].getName().equals(name))
+                                       return vms[i];          
+               }
+               return null; 
        }
        protected void finalize() {
                destroy();
        }
-       /**
-        * Destroy the VM
-        */
-       protected native void destroy();
-       /**
-        * Natively implemented method starting the VM.
-        * @param coreAmount
-        */
-       private native void start(Host host, String name, int coreAmount);
-               
+       
+
+       /* JNI / Native code */
+
+       /* get/set property methods are inherited from the Host class. */
+       
        /** Returns whether the given VM is currently suspended
         */     
-       public native boolean isSuspended();
+       public native int isCreated();
+       
        /** Returns whether the given VM is currently running
         */
-       public native boolean isRunning();
-       /** Add the given process into the VM.
-        * Afterward, when the VM is migrated or suspended or whatever, the process will have the corresponding handling, too.
-        */     
-       public native void bind(Process process);
-       /** Removes the given process from the given VM, and kill it
-        *  Will raise a ProcessNotFound exception if the process were not bound to that VM
+       public native int isRunning();
+
+       /** Returns whether the given VM is currently running
+        */
+       public native int isMigrating();
+       
+       /** Returns whether the given VM is currently suspended
         */     
-       public native void unbind(Process process);
-       /** Immediately change the host on which all processes are running
-        *
-        * No migration cost occurs. If you want to simulate this too, you want to use a
-        * Task.send() before or after, depending on whether you want to do cold or hot
-        * migration.
+       public native int isSuspended();
+               
+       /** Returns whether the given VM is currently saving
+        */
+       public native int isSaving();
+       
+       /** Returns whether the given VM is currently saved
+        */
+       public native int isSaved();
+
+       /** Returns whether the given VM is currently restoring its state
+        */
+       public native boolean isRestoring();
+       
+       /**
+        * Natively implemented method create the VM.
+        * @param nCore, number of core
+        * @param ramSize, size of the RAM that should be allocated (in MB) 
+        * @param netCap (not used for the moment)
+        * @param diskPath (not used for the moment)
+        * @param diskSize (not used for the moment)
+        * @param migNetSpeed (network bandwith allocated for migrations in MB/s, if you don't know put zero ;))
+        * @param dpIntensity (dirty page intensity, a percentage of migNetSpeed [0-100],  if you don't know put zero ;))
+        */
+       private native void create(Host host, String name, int nCore, int ramSize, 
+                        int netCap, String diskPath, int diskSize, int migNetSpeed, int dpIntensity);
+
+
+       /**
+        * Bound the VM to a certain % of its vcpu capability (e.g. 75% of vm.getSpeed())
+        * @param load, percentage (between [0,100]
+        */
+       public native void setBound(int load);
+
+       /**
+        * start the VM
+        */
+       public native void start();
+
+       
+       /**
+        * Immediately kills all processes within the given VM. Any memory that they allocated will be leaked.
+        * No extra delay occurs. If you want to simulate this too, you want to use a MSG_process_sleep() or something
+        */
+       public native void shutdown();
+       
+       /**  
+        * Invoke native migration routine
+       */
+       public native void internalmig(Host destination);
+
+       
+       /** Change the host on which all processes are running
+        * (pre-copy is implemented)
         */     
-       public native void migrate(Host destination);
+       public void migrate(Host destination){
+               this.internalmig(destination);
+               this.currentHost = destination; 
+       }
+       
        /** Immediately suspend the execution of all processes within the given VM
         *
         * No suspension cost occurs. If you want to simulate this too, you want to
@@ -75,6 +168,7 @@ public class VM {
         * of VM suspend to you.
         */     
        public native void suspend();
+       
        /** Immediately resumes the execution of all processes within the given VM
         *
         * No resume cost occurs. If you want to simulate this too, you want to
@@ -82,19 +176,33 @@ public class VM {
         * of VM resume to you.
         */
        public native void resume();
-       /**
-        * Immediately kills all processes within the given VM. Any memory that they allocated will be leaked.
-        * No extra delay occurs. If you want to simulate this too, you want to use a MSG_process_sleep() or something
+       
+       /** Immediately suspend the execution of all processes within the given VM 
+        *  and save its state on the persistent HDD
+        *  Not yet implemented (for the moment it behaves like suspend)
+        *  No suspension cost occurs. If you want to simulate this too, you want to
+        *  use a \ref File.write() before or after, depending on the exact semantic
+        *  of VM suspend to you.
+        */     
+       public native void save();
+       
+       /** Immediately resumes the execution of all processes previously saved 
+        * within the given VM
+        *  Not yet implemented (for the moment it behaves like resume)
+        *
+        * No resume cost occurs. If you want to simulate this too, you want to
+        * use a \ref File.read() before or after, depending on the exact semantic
+        * of VM resume to you.
         */
-       public native void shutdown();
+       public native void restore();
+       
+
        /**
-        * Reboot the VM, restarting all the processes in it.
+        * Destroy the VM
         */
-       public native void reboot();
+       public native void destroy();
 
-       public String getName() {
-               return name;
-       }               
+       
 
        /**
         * Class initializer, to initialize various JNI stuff