Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
fixing lua console (brain dead) damages to the parser
[simgrid.git] / src / bindings / lua / lua_console.c
index abcc05e..1e8880f 100644 (file)
 
 XBT_LOG_NEW_DEFAULT_SUBCATEGORY(lua_console, bindings, "Lua Bindings");
 
-static p_AS_attr AS;
-//using xbt_dynar_t :
-static xbt_dynar_t host_list_d;
-static xbt_dynar_t link_list_d;
-static xbt_dynar_t route_list_d;
+
+//AS List
+static xbt_dynar_t as_list_d;
 
 /*
  * Initialize platform model routing
@@ -24,7 +22,7 @@ static xbt_dynar_t route_list_d;
 
 static void create_AS(const char *id, const char *mode)
 {
-  surf_AS_new(id, mode);
+  routing_AS_init(id, mode);
 }
 
 /**
@@ -33,9 +31,8 @@ static void create_AS(const char *id, const char *mode)
 
 static void create_host(const char *id, double power_peak, double power_sc,
                         const char *power_tr,int core,int state_init,
-                        const char *state_tr)
+                        const char *state_tr,xbt_dict_t properties)
 {
-
   double power_scale = 1.0;
   int core_nb = 1; //default value
   tmgr_trace_t power_trace = NULL;
@@ -45,7 +42,6 @@ static void create_host(const char *id, double power_peak, double power_sc,
     power_scale = power_sc;
   if (core)
          core_nb = core; //default value
-  else
   if (state_init == -1)
     state_initial = SURF_RESOURCE_OFF;
   else
@@ -58,11 +54,10 @@ static void create_host(const char *id, double power_peak, double power_sc,
     state_trace = tmgr_trace_new(state_tr);
   else
     state_trace = tmgr_trace_new("");
-  current_property_set = xbt_dict_new();
+
   surf_host_create_resource(xbt_strdup(id), power_peak, power_scale,
                             power_trace, core_nb, state_initial, state_trace,
-                            current_property_set);
-
+                            properties);
 }
 
 /**
@@ -104,7 +99,6 @@ static void create_link(const char *name,
                             st_trace, policy_initial_link, xbt_dict_new());
 }
 
-
 /*
  *create host resource via workstation_ptask_L07 model [for SimDag]
  */
@@ -130,11 +124,11 @@ static void create_host_wsL07(const char *id, double power_peak,
     state_trace = tmgr_trace_new(state_tr);
   else
     state_trace = tmgr_trace_new("");
-  current_property_set = xbt_dict_new();
+
   surf_wsL07_host_create_resource(xbt_strdup(id), power_peak, power_scale,
                                   power_trace, state_initial, state_trace,
                                   current_property_set);
-
+  current_property_set = NULL;
 }
 
 /**
@@ -180,11 +174,16 @@ static void create_link_wsL07(const char *name,
 
 
 /*
- * init AS
+ * Append new AS to the Platform
  */
 
 static int AS_new(lua_State * L)
 {
+
+   if (xbt_dynar_is_empty(as_list_d))
+           as_list_d = xbt_dynar_new(sizeof(p_AS_attr), &xbt_free_ref);
+
+  p_AS_attr AS;
   const char *id;
   const char *mode;
   if (lua_istable(L, 1)) {
@@ -205,20 +204,69 @@ static int AS_new(lua_State * L)
   AS = malloc(sizeof(AS_attr));
   AS->id = id;
   AS->mode = mode;
+  AS->host_list_d = xbt_dynar_new(sizeof(p_host_attr),&xbt_free_ref);
+  AS->link_list_d = xbt_dynar_new(sizeof(p_link_attr),&xbt_free_ref);
+  AS->route_list_d = xbt_dynar_new(sizeof(p_route_attr),&xbt_free_ref);
+  AS->router_list_d = xbt_dynar_new(sizeof(p_router_attr),&xbt_free_ref);
+  AS->sub_as_list_id = xbt_dynar_new(sizeof(p_AS_attr),&xbt_free_ref);
+  xbt_dynar_push(as_list_d, &AS);
 
   return 0;
 }
 
+/**
+ * add sub AS to the Parent AS
+ */
+static int AS_add(lua_State *L)
+{
+       unsigned int i;
+       p_AS_attr AS;
+       p_AS_attr super_as,p_as;
+       const char *super_AS_id;
+       const char *sub_AS_id = NULL;
+       const char *sub_AS_routing= NULL;
+       if(lua_istable(L, -1))
+       {
+               lua_pushstring(L, "AS");
+               lua_gettable(L, -2);
+               super_AS_id = lua_tostring(L, -1);
+               lua_pop(L,1);
+
+               lua_pushstring(L, "id");
+               lua_gettable(L, -2);
+               sub_AS_id = lua_tostring(L, -1);
+               lua_pop(L,1);
+
+       }
+
+       xbt_dynar_foreach(as_list_d, i, p_as){
+                 if (p_as->id == super_AS_id){
+                         super_as = p_as;
+                         break;
+                 }
+       }
+       AS = malloc(sizeof(AS_attr));
+       AS->id = sub_AS_id;
+       AS->mode = sub_AS_routing;
+       AS->host_list_d = xbt_dynar_new(sizeof(p_host_attr),&xbt_free_ref);
+       AS->link_list_d = xbt_dynar_new(sizeof(p_link_attr),&xbt_free_ref);
+       AS->route_list_d = xbt_dynar_new(sizeof(p_route_attr),&xbt_free_ref);
+       AS->sub_as_list_id = xbt_dynar_new(sizeof(p_AS_attr),&xbt_free_ref);
+       xbt_dynar_push(super_as->sub_as_list_id, &AS);
+
+       return 0;
+}
+
+
 /*
  * add new host to platform hosts list
  */
 static int Host_new(lua_State * L)
 {
-
-  if (xbt_dynar_is_empty(host_list_d))
-    host_list_d = xbt_dynar_new(sizeof(p_host_attr), &xbt_free_ref);
-
   p_host_attr host;
+  unsigned int i;
+  p_AS_attr p_as,current_as = NULL;
+  const char *AS_id;
   const char *id;
   const char *power_trace;
   const char *state_trace;
@@ -226,6 +274,11 @@ static int Host_new(lua_State * L)
   int state_initial,core;
   //get values from the table passed as argument
   if (lua_istable(L, -1)) {
+       // get AS id
+       lua_pushstring(L, "AS");
+       lua_gettable(L, -2);
+       AS_id = lua_tostring(L, -1);
+       lua_pop(L,1);
 
     // get Id Value
     lua_pushstring(L, "id");
@@ -273,6 +326,18 @@ static int Host_new(lua_State * L)
         ("Bad Arguments to create host, Should be a table with named arguments");
     return -1;
   }
+  xbt_dynar_foreach(as_list_d, i, p_as){
+         if (p_as->id == AS_id){
+                 current_as = p_as;
+                 break;
+         }
+  }
+
+  if (!current_as)
+  {
+         XBT_ERROR("No AS_id :%s found",AS_id);
+         return -2;
+  }
 
   host = malloc(sizeof(host_attr));
   host->id = id;
@@ -283,21 +348,20 @@ static int Host_new(lua_State * L)
   host->state_initial = state_initial;
   host->state_trace = state_trace;
   host->function = NULL;
-  xbt_dynar_push(host_list_d, &host);
+  host->properties = xbt_dict_new();
+  xbt_dynar_push(current_as->host_list_d, &host);
 
   return 0;
 }
 
 /**
- * add link to platform links list
+ * add link to AS links list
  */
 static int Link_new(lua_State * L)      // (id,bandwidth,latency)
 {
-
-  if (xbt_dynar_is_empty(link_list_d))
-    link_list_d = xbt_dynar_new(sizeof(p_link_attr), &xbt_free_ref);
-
-
+  const char *AS_id;
+  unsigned int i;
+  p_AS_attr p_as,current_as = NULL;
   const char* id;
   double bandwidth, latency;
   const char *bandwidth_trace;
@@ -307,6 +371,13 @@ static int Link_new(lua_State * L)      // (id,bandwidth,latency)
 
   //get values from the table passed as argument
   if (lua_istable(L, -1)) {
+
+       //get AS id
+       lua_pushstring(L, "AS");
+       lua_gettable(L, -2);
+       AS_id = lua_tostring(L, -1);
+       lua_pop(L, 1);
+
     // get Id Value
     lua_pushstring(L, "id");
     lua_gettable(L, -2);
@@ -362,7 +433,18 @@ static int Link_new(lua_State * L)      // (id,bandwidth,latency)
         ("Bad Arguments to create link, Should be a table with named arguments");
     return -1;
   }
+  xbt_dynar_foreach(as_list_d, i, p_as){
+         if (p_as->id == AS_id){
+                 current_as = p_as;
+                 break;
+         }
+  }
 
+  if (!current_as)
+  {
+         XBT_ERROR("No AS_id :%s found",AS_id);
+         return -2;
+  }
   p_link_attr link = malloc(sizeof(link_attr));
   link->id = id;
   link->bandwidth = bandwidth;
@@ -372,26 +454,45 @@ static int Link_new(lua_State * L)      // (id,bandwidth,latency)
   link->state_trace = state_trace;
   link->state_initial = state_initial;
   link->policy = policy;
-  xbt_dynar_push(link_list_d, &link);
+  xbt_dynar_push(current_as->link_list_d, &link);
 
   return 0;
 }
 
 /**
- * add route to platform routes list
+ * add route to AS routes list
  */
 static int Route_new(lua_State * L)     // (src_id,dest_id,links_number,link_table)
 {
- if (xbt_dynar_is_empty(route_list_d))
-           route_list_d = xbt_dynar_new(sizeof(p_route_attr), &xbt_free_ref);
+  const char* AS_id;
+  unsigned int i;
+  p_AS_attr p_as,current_as = NULL;
+  const char *links;
+  const char* link_id;
+  p_route_attr route = malloc(sizeof(route_attr));
 
-        const char *links;
-        const char* link_id;
-        p_route_attr route = malloc(sizeof(route_attr));
 
+  if (!lua_istable(L, 4)) { // if Route.new is declared as an indexed table (FIXME : we check the third arg if it's not a table)
 
-  if (!lua_istable(L, 3)) { // if Route.new is declared as an indexed table (FIXME : we check the third arg if it's not a table)
-     // get Source Value
+        //get AS_id
+        lua_pushstring(L, "AS");
+        lua_gettable(L, -2);
+        AS_id = lua_tostring(L, -1);
+        lua_pop(L, 1);
+
+        xbt_dynar_foreach(as_list_d, i, p_as){
+         if (p_as->id == AS_id){
+                 current_as = p_as;
+                 break;
+         }
+        }
+
+        if (!current_as)
+        {
+         XBT_ERROR("addRoute: No AS_id :%s found",AS_id);
+         return -2;
+        }
+        // get Source Value
      lua_pushstring(L, "src");
      lua_gettable(L, -2);
      route->src_id = lua_tostring(L, -1);
@@ -411,25 +512,35 @@ static int Route_new(lua_State * L)     // (src_id,dest_id,links_number,link_tab
 
      route->links_id = xbt_dynar_new(sizeof(char *), &xbt_free_ref);
 
-     char *tmp_links = malloc(sizeof(char)*strlen(links)+1);//use xbt
-     strcpy(tmp_links,links);
+     char *tmp_links = xbt_strdup(links);
      link_id = strtok(tmp_links,",");   //tmp_link = strtok((char*)links,",");
      while(link_id != NULL)
        {
           xbt_dynar_push(route->links_id, &link_id);
-          link_id = strtok(NULL,","); //Alternativelly, a null pointer may be specified, in which case the function continues scanning where a previous successful call to the function ended.
+          link_id = strtok(NULL,","); //Alternatively, a null pointer may be specified, in which case the function continues scanning where a previous successful call to the function ended.
         }
-     xbt_dynar_push(route_list_d, &route);
+     xbt_dynar_push(current_as->route_list_d, &route);
      return 0;
-
       }
   else { // Route.new is declared as a function
-     //const char* link_id;
-     route->src_id = luaL_checkstring(L, 1);
-     route->dest_id = luaL_checkstring(L, 2);
+        AS_id = luaL_checkstring(L, 1);
+        xbt_dynar_foreach(as_list_d, i, p_as){
+                 if (p_as->id == AS_id){
+                         current_as = p_as;
+                         break;
+                 }
+                }
+
+        if (!current_as)
+        {
+               XBT_ERROR("addRoute: No AS_id :%s found",AS_id);
+               return -2;
+        }
+     route->src_id = luaL_checkstring(L, 2);
+     route->dest_id = luaL_checkstring(L, 3);
      route->links_id = xbt_dynar_new(sizeof(char *), &xbt_free_ref);
      lua_pushnil(L);
-     while (lua_next(L, 3) != 0)
+     while (lua_next(L, 4) != 0)
                {
         link_id = lua_tostring(L, -1);
         xbt_dynar_push(route->links_id, &link_id);
@@ -437,36 +548,78 @@ static int Route_new(lua_State * L)     // (src_id,dest_id,links_number,link_tab
         lua_tostring(L, -1));
         lua_pop(L, 1);
        }
-        lua_pop(L, 1);
-         //add route to platform's route list
-         xbt_dynar_push(route_list_d, &route);
-         return 0;
+    lua_pop(L, 1);
+    //add route to platform's route list
+    xbt_dynar_push(current_as->route_list_d, &route);
+    return 0;
     }
 
   return -1;
 }
+/**
+ * add Router to AS components
+ */
+static int Router_new(lua_State* L)
+{
+       p_router_attr router;
+       const char* AS_id;
+       unsigned int i;
+       p_AS_attr p_as,current_as = NULL;
+       const char* id;
+       if (lua_istable(L, -1)) {
+               // get AS id
+               lua_pushstring(L, "AS");
+               lua_gettable(L, -2);
+               AS_id = lua_tostring(L, -1);
+               lua_pop(L,1);
+
+               lua_pushstring(L, "id");
+               lua_gettable(L, -2);
+               id = lua_tostring(L, -1);
+               lua_pop(L,1);
+       }
+       xbt_dynar_foreach(as_list_d, i, p_as){
+                 if (p_as->id == AS_id){
+                         current_as = p_as;
+                         break;
+                 }
+         }
+
+         if (!current_as)
+         {
+                 XBT_ERROR("No AS_id :%s found",AS_id);
+                 return -2;
+         }
+       router = malloc(sizeof(router_attr));
+       router->id = id;
+       xbt_dynar_push(current_as->router_list_d, &router);
+       return 0;
+
+}
+
 /**
  * set function to process
  */
 static int Host_set_function(lua_State * L)     //(host,function,nb_args,list_args)
 {
+       p_AS_attr p_as;
        p_host_attr p_host;
-       const char *host;
-       const char *function;
+       unsigned int i,j;
+       const char *host_id ;
+       const char *function_id;
        const char *args;
        char * tmp_arg;
-       unsigned int i;
 
    if (lua_istable(L, -1)) {
         // get Host id
         lua_pushstring(L, "host");
         lua_gettable(L, -2);
-        host = lua_tostring(L, -1);
+        host_id = lua_tostring(L, -1);
         lua_pop(L, 1);
         // get Function Name
         lua_pushstring(L, "fct");
         lua_gettable(L, -2);
-     function = lua_tostring(L, -1);
+     function_id = lua_tostring(L, -1);
      lua_pop(L, 1);
      //get args
      lua_pushstring(L,"args");
@@ -479,23 +632,63 @@ static int Host_set_function(lua_State * L)     //(host,function,nb_args,list_ar
           return -1;
    }
 
-  // look for the index of host in host_list
-  xbt_dynar_foreach(host_list_d, i, p_host) {
-         if (p_host->id == host) {
-      p_host->function = function;
-      p_host->args_list = xbt_dynar_new(sizeof(char *), &xbt_free_ref);
-      // split & fill the args list
-      tmp_arg = strtok((char*)args,",");
-      while (tmp_arg != NULL) {
-          xbt_dynar_push(p_host->args_list, &tmp_arg);
-          tmp_arg = strtok(NULL,",");
-        }
-      return 0;
-          }
-      }
-         XBT_ERROR("Host : %s Not Found !!", host);
+  // look for the index of host in host_list for each AS
+   xbt_dynar_foreach(as_list_d, i, p_as)
+   {
+          xbt_dynar_foreach(p_as->host_list_d, j, p_host) {
+                  if (p_host->id == host_id) {
+                          p_host->function = function_id;
+                          p_host->args_list = xbt_dynar_new(sizeof(char *), &xbt_free_ref);
+                          // split & fill the args list
+                          tmp_arg = strtok((char*)args,",");
+                          while (tmp_arg != NULL) {
+                                  xbt_dynar_push(p_host->args_list, &tmp_arg);
+                                  tmp_arg = strtok(NULL,",");
+                          }
+                          return 0;
+                  }
+       }
+   }
+         XBT_ERROR("Host : %s Not Found !!", host_id);
          return 1;
 
+}
+
+static int Host_set_property(lua_State* L)
+{
+       p_AS_attr p_as;
+       p_host_attr p_host;
+       unsigned int i,j;
+       const char* host_id ="";
+       const char* prop_id = "";
+       const char* prop_value = "";
+       if (lua_istable(L, -1)) {
+                // get Host id
+                lua_pushstring(L, "host");
+                lua_gettable(L, -2);
+                host_id = lua_tostring(L, -1);
+                lua_pop(L, 1);
+                // get Function Name
+                lua_pushstring(L, "prop_id");
+                lua_gettable(L, -2);
+            prop_id = lua_tostring(L, -1);
+            lua_pop(L, 1);
+            //get args
+            lua_pushstring(L,"prop_value");
+            lua_gettable(L, -2);
+            prop_value = lua_tostring(L,-1);
+            lua_pop(L, 1);
+        }
+       xbt_dynar_foreach(as_list_d, i, p_as)
+          {
+                  xbt_dynar_foreach(p_as->host_list_d, j, p_host) {
+                          if (p_host->id == host_id) {
+                                  xbt_dict_set(p_host->properties, prop_id, xbt_strdup(prop_value), free);
+                          }
+                  }
+      }
+       return 1;
+
 }
 /*
  * surf parse bypass platform
@@ -504,40 +697,43 @@ static int Host_set_function(lua_State * L)     //(host,function,nb_args,list_ar
 
 static int surf_parse_bypass_platform()
 {
-  unsigned int i;
+  unsigned int i,j;
+  p_AS_attr p_as;
   p_host_attr p_host;
   p_link_attr p_link;
   p_route_attr p_route;
 
-  // Init routing mode
-  create_AS(AS->id, AS->mode);
 
-  // Add Hosts
-  xbt_dynar_foreach(host_list_d, i, p_host) {
-    create_host(p_host->id, p_host->power_peak, p_host->power_scale,
-                p_host->power_trace, p_host->core, p_host->state_initial,
-                p_host->state_trace);
-    //add to routing model host list
-    surf_route_add_host((char *) p_host->id);
-
-  }
-
-  //add Links
-  xbt_dynar_foreach(link_list_d, i, p_link) {
-    create_link(p_link->id, p_link->bandwidth, p_link->bandwidth_trace,
-                p_link->latency, p_link->latency_trace,
-                p_link->state_initial, p_link->state_trace,
-                p_link->policy);
+  // Add AS
+  xbt_dynar_foreach(as_list_d, i,p_as)
+  {
+         create_AS(p_as->id, p_as->mode);
+         // add associated Hosts
+         xbt_dynar_foreach(p_as->host_list_d, j, p_host){
+                 create_host(p_host->id, p_host->power_peak, p_host->power_scale,
+                                 p_host->power_trace, p_host->core, p_host->state_initial,
+                                 p_host->state_trace, p_host->properties);
+
+
+                  //add to routing model host list
+                  surf_route_add_host((char *) p_host->id);
+         }
+         // add associated Links
+         xbt_dynar_foreach(p_as->link_list_d, j, p_link){
+                 create_link(p_link->id, p_link->bandwidth, p_link->bandwidth_trace,
+                                 p_link->latency, p_link->latency_trace,
+                                 p_link->state_initial, p_link->state_trace,
+                                 p_link->policy);
+         }
+         // add associated Routes
+         xbt_dynar_foreach(p_as->route_list_d, j, p_route){
+                 surf_routing_add_route((char *) p_route->src_id,
+                                            (char *) p_route->dest_id, p_route->links_id);
+         }
+
+         // Finalize AS
+         routing_AS_end(p_as->id);
   }
-  // add route
-  xbt_dynar_foreach(route_list_d, i, p_route) {
-    surf_routing_add_route((char *) p_route->src_id,
-                           (char *) p_route->dest_id, p_route->links_id);
-  }
-  /* </platform> */
-
-  // Finalize AS
-  surf_AS_finalize(AS->id);
 
   // add traces
   surf_add_host_traces();
@@ -555,43 +751,48 @@ static int surf_parse_bypass_platform()
 
 static int surf_wsL07_parse_bypass_platform()
 {
-
-  unsigned int i;
+  unsigned int i,j;
+  p_AS_attr p_as, p_sub_as;
   p_host_attr p_host;
   p_link_attr p_link;
   p_route_attr p_route;
 
-  // Init routing mode
-  create_AS(AS->id, AS->mode);
-
-  // Add Hosts
-  xbt_dynar_foreach(host_list_d, i, p_host) {
-    create_host_wsL07(p_host->id, p_host->power_peak, p_host->power_scale,
-                      p_host->power_trace, p_host->state_initial,
-                      p_host->state_trace);
-    //add to routing model host list
-    surf_route_add_host((char *) p_host->id);
-  }
-
-  //add Links
-  xbt_dynar_foreach(link_list_d, i, p_link) {
-    create_link_wsL07(p_link->id, p_link->bandwidth,
-                      p_link->bandwidth_trace, p_link->latency,
-                      p_link->latency_trace, p_link->state_initial,
-                      p_link->state_trace, p_link->policy);
-  }
-  // add route
-  xbt_dynar_foreach(route_list_d, i, p_route) {
-    surf_routing_add_route((char *) p_route->src_id,
-                           (char *) p_route->dest_id, p_route->links_id);
+  xbt_dynar_foreach(as_list_d, i, p_as)
+  {
+         // Init AS
+         create_AS(p_as->id, p_as->mode);
+
+         // add Sub AS
+
+         // Add Hosts
+         xbt_dynar_foreach(p_as->sub_as_list_id, j, p_sub_as) {
+                         //...
+         }
+         xbt_dynar_foreach(p_as->host_list_d, j, p_host) {
+           create_host_wsL07(p_host->id, p_host->power_peak, p_host->power_scale,
+                             p_host->power_trace, p_host->state_initial,
+                             p_host->state_trace);
+           //add to routing model host list
+           surf_route_add_host((char *) p_host->id);
+         }
+         //add Links
+         xbt_dynar_foreach(p_as->link_list_d, j, p_link) {
+             create_link_wsL07(p_link->id, p_link->bandwidth,
+                               p_link->bandwidth_trace, p_link->latency,
+                               p_link->latency_trace, p_link->state_initial,
+                               p_link->state_trace, p_link->policy);
+           }
+           // add route
+         xbt_dynar_foreach(p_as->route_list_d, j, p_route) {
+               surf_routing_add_route((char *) p_route->src_id,
+                                      (char *) p_route->dest_id, p_route->links_id);
+             }
+         /* </AS> */
+         // Finalize AS
+         routing_AS_end(p_as->id);
   }
-  /* </platform> */
-
-  // Finalize AS
-  surf_AS_finalize(AS->id);
   // add traces
   surf_wsL07_add_traces();
-
   return 0;
 }
 
@@ -600,11 +801,15 @@ static int surf_wsL07_parse_bypass_platform()
  */
 static int surf_parse_bypass_application()
 {
-  unsigned int i;
+  unsigned int i,j;
+  p_AS_attr p_as;
   p_host_attr p_host;
-  xbt_dynar_foreach(host_list_d, i, p_host) {
-    if (p_host->function)
-      MSG_set_function(p_host->id, p_host->function, p_host->args_list);
+  xbt_dynar_foreach(as_list_d, i, p_as)
+  {
+         xbt_dynar_foreach(p_as->host_list_d, j, p_host) {
+                 if (p_host->function)
+                         MSG_set_function(p_host->id, p_host->function, p_host->args_list);
+         }
   }
   return 0;
 }
@@ -612,7 +817,6 @@ static int surf_parse_bypass_application()
 /*
  * Public Methods
  */
-
 int console_add_host(lua_State *L)
 {
        return Host_new(L);
@@ -638,6 +842,11 @@ int console_set_function(lua_State *L)
        return Host_set_function(L);
 }
 
+int console_host_set_property(lua_State *L)
+{
+       return Host_set_property(L);
+}
+
 int console_parse_platform()
 {
        return surf_parse_bypass_platform();