PageRenderTime 64ms CodeModel.GetById 18ms RepoModel.GetById 0ms app.codeStats 1ms

/trunk/src/plugins/kvm-storage/web/kvm-storage-vm-create.php

https://github.com/qyjohn/openqrm
PHP | 362 lines | 278 code | 40 blank | 44 comment | 42 complexity | 7dfc36a01f53e9e7e21dc690f05b3b11 MD5 | raw file
  1. <!doctype html>
  2. <html lang="en">
  3. <head>
  4. <title>KVM create vm</title>
  5. <link rel="stylesheet" type="text/css" href="../../css/htmlobject.css" />
  6. <link rel="stylesheet" type="text/css" href="kvm-storage.css" />
  7. <link type="text/css" href="/openqrm/base/js/jquery/development-bundle/themes/smoothness/ui.all.css" rel="stylesheet" />
  8. <script type="text/javascript" src="/openqrm/base/js/jquery/js/jquery-1.3.2.min.js"></script>
  9. <script type="text/javascript" src="/openqrm/base/js/jquery/js/jquery-ui-1.7.1.custom.min.js"></script>
  10. <style type="text/css">
  11. .ui-progressbar-value {
  12. background-image: url(/openqrm/base/img/progress.gif);
  13. }
  14. #progressbar {
  15. position: absolute;
  16. left: 150px;
  17. top: 250px;
  18. width: 400px;
  19. height: 20px;
  20. }
  21. </style>
  22. </head>
  23. <body>
  24. <div id="progressbar">
  25. </div>
  26. <?php
  27. /*
  28. This file is part of openQRM.
  29. openQRM is free software: you can redistribute it and/or modify
  30. it under the terms of the GNU General Public License version 2
  31. as published by the Free Software Foundation.
  32. openQRM is distributed in the hope that it will be useful,
  33. but WITHOUT ANY WARRANTY; without even the implied warranty of
  34. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  35. GNU General Public License for more details.
  36. You should have received a copy of the GNU General Public License
  37. along with openQRM. If not, see <http://www.gnu.org/licenses/>.
  38. Copyright 2009, Matthias Rechenburg <matt@openqrm.com>
  39. */
  40. // error_reporting(E_ALL);
  41. $thisfile = basename($_SERVER['PHP_SELF']);
  42. $RootDir = $_SERVER["DOCUMENT_ROOT"].'/openqrm/base/';
  43. $BaseDir = $_SERVER["DOCUMENT_ROOT"].'/openqrm/';
  44. require_once "$RootDir/include/user.inc.php";
  45. require_once "$RootDir/include/openqrm-server-config.php";
  46. require_once "$RootDir/class/image.class.php";
  47. require_once "$RootDir/class/resource.class.php";
  48. require_once "$RootDir/class/virtualization.class.php";
  49. require_once "$RootDir/class/kernel.class.php";
  50. require_once "$RootDir/class/appliance.class.php";
  51. require_once "$RootDir/class/deployment.class.php";
  52. require_once "$RootDir/include/htmlobject.inc.php";
  53. require_once "$RootDir/class/event.class.php";
  54. require_once "$RootDir/class/openqrm_server.class.php";
  55. global $RESOURCE_INFO_TABLE;
  56. $openqrm_server = new openqrm_server();
  57. $OPENQRM_SERVER_IP_ADDRESS=$openqrm_server->get_ip_address();
  58. global $OPENQRM_SERVER_IP_ADDRESS;
  59. $refresh_delay=1;
  60. $refresh_loop_max=20;
  61. // get the post parmater
  62. $action = htmlobject_request('action');
  63. $kvm_server_id = htmlobject_request('kvm_server_id');
  64. $kvm_server_name = htmlobject_request('kvm_server_name');
  65. $kvm_server_mac = htmlobject_request('kvm_server_mac');
  66. $kvm_server_ram = htmlobject_request('kvm_server_ram');
  67. $kvm_vm_bridge = htmlobject_request('kvm_vm_bridge');
  68. $kvm_vm_boot_iso = htmlobject_request('kvm_vm_boot_iso');
  69. $kvm_vm_boot_dev = htmlobject_request('kvm_vm_boot_dev');
  70. $kvm_nic_model = htmlobject_request('kvm_nic_model');
  71. $kvm_server_cpus = htmlobject_request('kvm_server_cpus');
  72. function redirect_mgmt($strMsg, $file, $kvm_server_id) {
  73. global $thisfile;
  74. global $action;
  75. $url = $file.'?strMsg='.urlencode($strMsg).'&currenttab=tab0&kvm_server_id='.$kvm_server_id;
  76. echo "<meta http-equiv=\"refresh\" content=\"0; URL=$url\">";
  77. exit;
  78. }
  79. function wait_for_statfile($sfile) {
  80. global $refresh_delay;
  81. global $refresh_loop_max;
  82. $refresh_loop=0;
  83. while (!file_exists($sfile)) {
  84. sleep($refresh_delay);
  85. $refresh_loop++;
  86. flush();
  87. if ($refresh_loop > $refresh_loop_max) {
  88. return false;
  89. }
  90. }
  91. return true;
  92. }
  93. function show_progressbar() {
  94. ?>
  95. <script type="text/javascript">
  96. $("#progressbar").progressbar({
  97. value: 100
  98. });
  99. var options = {};
  100. $("#progressbar").effect("shake",options,2000,null);
  101. </script>
  102. <?php
  103. flush();
  104. }
  105. function validate_input($var, $type) {
  106. switch ($type) {
  107. case 'string':
  108. // remove allowed chars
  109. $var = str_replace(".", "", $var);
  110. $var = str_replace("-", "", $var);
  111. $var = str_replace("_", "", $var);
  112. $var = str_replace("/", "", $var);
  113. for ($i = 0; $i<strlen($var); $i++) {
  114. if (!ctype_alpha($var[$i])) {
  115. if (!ctype_digit($var[$i])) {
  116. return false;
  117. }
  118. }
  119. }
  120. return true;
  121. break;
  122. case 'number';
  123. for ($i = 0; $i<strlen($var); $i++) {
  124. if (!ctype_digit($var[$i])) {
  125. return false;
  126. }
  127. }
  128. return true;
  129. break;
  130. }
  131. }
  132. $strMsg = '';
  133. if(htmlobject_request('action') != '') {
  134. $event->log("$action", $_SERVER['REQUEST_TIME'], 5, "kvm-action", "Processing command $action", "", "", 0, 0, 0);
  135. if ($OPENQRM_USER->role == "administrator") {
  136. switch ($action) {
  137. case 'new':
  138. show_progressbar();
  139. // name check
  140. if (!strlen($kvm_server_name)) {
  141. $strMsg .= "Empty vm name. Not creating new vm on KVM Host $kvm_server_id";
  142. redirect_mgmt($strMsg, $thisfile, $kvm_server_id);
  143. } else if (!validate_input($kvm_server_name, 'string')) {
  144. $strMsg .= "Invalid vm name. Not creating new vm on KVM Host $kvm_server_id <br>(allowed characters are [a-z][A-z][0-9].-_)";
  145. redirect_mgmt($strMsg, $thisfile, $kvm_server_id);
  146. }
  147. if (!strlen($kvm_server_mac)) {
  148. $strMsg="Got empty mac-address. Not creating new vm on KVM Host $kvm_server_id";
  149. redirect_mgmt($strMsg, $thisfile, $kvm_server_id);
  150. }
  151. if (!strlen($kvm_server_ram)) {
  152. $strMsg="Got empty Memory size. Not creating new vm on KVM Host $kvm_server_id";
  153. redirect_mgmt($strMsg, $thisfile, $kvm_server_id);
  154. } else if (!validate_input($kvm_server_ram, 'number')) {
  155. $strMsg .= "Invalid vm memory $kvm_server_ram. Not creating new vm on KVM Host $kvm_server_id";
  156. redirect_mgmt($strMsg, $thisfile, $kvm_server_id);
  157. }
  158. // set empty disk + swap
  159. $kvm_server_disk_parameter = "";
  160. $kvm_server_swap_parameter = "";
  161. // check for cpu count is int
  162. if (!strlen($kvm_server_cpus)) {
  163. $strMsg .= "Empty vm cpu number. Not creating new vm on KVM Host $kvm_server_id";
  164. redirect_mgmt($strMsg, $thisfile, $kvm_server_id);
  165. }
  166. if (!validate_input($kvm_server_cpus, 'number')) {
  167. $strMsg .= "Invalid vm cpu number. Not creating new vm on KVM Host $kvm_server_id";
  168. redirect_mgmt($strMsg, $thisfile, $kvm_server_id);
  169. }
  170. // validate network params
  171. if (!strlen($kvm_vm_bridge)) {
  172. $strMsg="Got empty Bridge config. Not creating new vm on KVM Host $kvm_server_id";
  173. redirect_mgmt($strMsg, $thisfile, $kvm_server_id);
  174. } else if (!validate_input($kvm_vm_bridge, 'string')) {
  175. $strMsg .= "Invalid bridge config. Not creating new vm on KVM Host $kvm_server_id";
  176. redirect_mgmt($strMsg, $thisfile, $kvm_server_id);
  177. }
  178. // boot dev
  179. if (!strlen($kvm_vm_boot_dev)) {
  180. $strMsg="Got empty boot-device config. Not creating new vm on KVM Host $kvm_server_id";
  181. redirect_mgmt($strMsg, $thisfile, $kvm_server_id);
  182. } else if (!validate_input($kvm_vm_boot_dev, 'string')) {
  183. $strMsg .= "Invalid boot-device config. Not creating new vm on KVM Host $kvm_server_id";
  184. redirect_mgmt($strMsg, $thisfile, $kvm_server_id);
  185. }
  186. // boot iso / just if boot dev is iso
  187. if (!strcmp($kvm_vm_boot_dev, "iso")) {
  188. if (!strlen($kvm_vm_boot_iso)) {
  189. $strMsg .= "Got empty boot-iso config. Not creating new vm on KVM Host $kvm_server_id";
  190. redirect_mgmt($strMsg, $thisfile, $kvm_server_id);
  191. } else if (!validate_input($kvm_vm_boot_iso, 'string')) {
  192. $strMsg .= "Invalid boot-iso config. Not creating new vm on KVM Host $kvm_server_id";
  193. redirect_mgmt($strMsg, $thisfile, $kvm_server_id);
  194. }
  195. $kvm_vm_boot_iso = "-i ".$kvm_vm_boot_iso;
  196. } else {
  197. $kvm_vm_boot_iso = "";
  198. }
  199. // send command to kvm_server-host to create the new vm
  200. $kvm_appliance = new appliance();
  201. $kvm_appliance->get_instance_by_id($kvm_server_id);
  202. $kvm_server = new resource();
  203. $kvm_server->get_instance_by_id($kvm_appliance->resources);
  204. // final command
  205. $resource_command="$OPENQRM_SERVER_BASE_DIR/openqrm/plugins/kvm-storage/bin/openqrm-kvm-storage-vm create -n $kvm_server_name -m $kvm_server_mac -r $kvm_server_ram -c $kvm_server_cpus -t $kvm_nic_model -z $kvm_vm_bridge -b $kvm_vm_boot_dev $kvm_vm_boot_iso -u $OPENQRM_ADMIN->name -p $OPENQRM_ADMIN->password";
  206. // remove current stat file
  207. $kvm_server_resource_id = $kvm_server->id;
  208. $statfile="kvm-stat/".$kvm_server_resource_id.".vm_list";
  209. if (file_exists($statfile)) {
  210. unlink($statfile);
  211. }
  212. // add resource + type + vhostid
  213. $resource = new resource();
  214. $resource_id=openqrm_db_get_free_id('resource_id', $RESOURCE_INFO_TABLE);
  215. $resource_ip="0.0.0.0";
  216. // send command to the openQRM-server
  217. $openqrm_server->send_command("openqrm_server_add_resource $resource_id $kvm_server_mac $resource_ip");
  218. // set resource type
  219. $virtualization = new virtualization();
  220. $virtualization->get_instance_by_type("kvm-storage-vm");
  221. // add to openQRM database
  222. $resource_fields["resource_id"]=$resource_id;
  223. $resource_fields["resource_ip"]=$resource_ip;
  224. $resource_fields["resource_mac"]=$kvm_server_mac;
  225. $resource_fields["resource_localboot"]=0;
  226. $resource_fields["resource_vtype"]=$virtualization->id;
  227. $resource_fields["resource_vhostid"]=$kvm_server->id;
  228. $resource->add($resource_fields);
  229. // send command
  230. $kvm_server->send_command($kvm_server->ip, $resource_command);
  231. // and wait for the resulting statfile
  232. if (!wait_for_statfile($statfile)) {
  233. $strMsg .= "Error during creating new KVM vm ! Please check the Event-Log<br>";
  234. } else {
  235. $strMsg .="Created new KVM vm resource $resource_id<br>";
  236. }
  237. redirect_mgmt($strMsg, "kvm-storage-vm-manager.php", $kvm_server_id);
  238. break;
  239. }
  240. }
  241. } else {
  242. // refresh config parameter
  243. $kvm_server_appliance = new appliance();
  244. $kvm_server_appliance->get_instance_by_id($kvm_server_id);
  245. $kvm_server = new resource();
  246. $kvm_server->get_instance_by_id($kvm_server_appliance->resources);
  247. $resource_command="$OPENQRM_SERVER_BASE_DIR/openqrm/plugins/kvm-storage/bin/openqrm-kvm-storage-vm post_bridge_config -u $OPENQRM_ADMIN->name -p $OPENQRM_ADMIN->password";
  248. // remove current stat file
  249. $kvm_server_resource_id = $kvm_server->id;
  250. $statfile="kvm-stat/".$kvm_server_resource_id.".bridge_config";
  251. if (file_exists($statfile)) {
  252. unlink($statfile);
  253. }
  254. // send command
  255. $kvm_server->send_command($kvm_server->ip, $resource_command);
  256. // and wait for the resulting statfile
  257. if (!wait_for_statfile($statfile)) {
  258. echo "<b>Could not get bridge config status file! Please checks the event log";
  259. exit(0);
  260. }
  261. }
  262. function kvm_server_create($kvm_server_id) {
  263. global $OPENQRM_SERVER_BASE_DIR;
  264. global $OPENQRM_USER;
  265. global $thisfile;
  266. $kvm_server_appliance = new appliance();
  267. $kvm_server_appliance->get_instance_by_id($kvm_server_id);
  268. $kvm_server = new resource();
  269. $kvm_server->get_instance_by_id($kvm_server_appliance->resources);
  270. $resource_mac_gen = new resource();
  271. $resource_mac_gen->generate_mac();
  272. $suggested_mac = $resource_mac_gen->mac;
  273. // bridge config
  274. $kvm_vm_conf_file="$OPENQRM_SERVER_BASE_DIR/openqrm/plugins/kvm-storage/web/kvm-stat/".$kvm_server->id.".bridge_config";
  275. $store = openqrm_parse_conf($kvm_vm_conf_file);
  276. extract($store);
  277. // cpus array for the select
  278. $cpu_identifier_array = array();
  279. $cpu_identifier_array[] = array("value" => "1", "label" => "1 CPU");
  280. $cpu_identifier_array[] = array("value" => "2", "label" => "2 CPUs");
  281. $cpu_identifier_array[] = array("value" => "3", "label" => "3 CPUs");
  282. $cpu_identifier_array[] = array("value" => "4", "label" => "4 CPUs");
  283. // set template
  284. $t = new Template_PHPLIB();
  285. $t->debug = false;
  286. $t->setFile('tplfile', './tpl/' . 'kvm-storage-vm-create.tpl.php');
  287. $t->setVar(array(
  288. 'formaction' => $thisfile,
  289. 'kvm_server_id' => $kvm_server_id,
  290. 'kvm_server_name' => htmlobject_input('kvm_server_name', array("value" => '', "label" => 'VM name'), 'text', 20),
  291. 'kvm_server_cpus' => htmlobject_select('kvm_server_cpus', $cpu_identifier_array, 'CPUs'),
  292. 'kvm_server_mac' => htmlobject_input('kvm_server_mac', array("value" => $suggested_mac, "label" => 'Mac address'), 'text', 20),
  293. 'kvm_server_ram' => htmlobject_input('kvm_server_ram', array("value" => '512', "label" => 'Memory (MB)'), 'text', 10),
  294. 'hidden_kvm_server_id' => "<input type=hidden name=kvm_server_id value=$kvm_server_id>",
  295. 'kvm_server_bridge_net1' => $store['OPENQRM_PLUGIN_KVM_BRIDGE_NET1'],
  296. 'kvm_server_bridge_net2' => $store['OPENQRM_PLUGIN_KVM_BRIDGE_NET2'],
  297. 'kvm_server_bridge_net3' => $store['OPENQRM_PLUGIN_KVM_BRIDGE_NET3'],
  298. 'kvm_server_bridge_net4' => $store['OPENQRM_PLUGIN_KVM_BRIDGE_NET4'],
  299. 'kvm_server_bridge_net5' => $store['OPENQRM_PLUGIN_KVM_BRIDGE_NET5'],
  300. 'submit' => htmlobject_input('action', array("value" => 'new', "label" => 'Create'), 'submit'),
  301. ));
  302. $disp = $t->parse('out', 'tplfile');
  303. return $disp;
  304. }
  305. $output = array();
  306. // if admin
  307. if ($OPENQRM_USER->role == "administrator") {
  308. if (isset($kvm_server_id)) {
  309. $output[] = array('label' => 'KVM Create VM', 'value' => kvm_server_create($kvm_server_id));
  310. }
  311. }
  312. ?>
  313. <script type="text/javascript">
  314. $("#progressbar").remove();
  315. </script>
  316. <?php
  317. echo htmlobject_tabmenu($output);
  318. ?>