function get_novnc_appliance_link($appliance_id) { global $event; global $OPENQRM_SERVER_BASE_DIR; global $OPENQRM_SERVER_IP_ADDRESS; global $OPENQRM_EXEC_PORT; $p_appliance = new appliance(); $p_appliance->get_instance_by_id($appliance_id); $p_resource = new resource(); $p_resource->get_instance_by_id($p_appliance->resources); $virtualization = new virtualization(); $virtualization->get_instance_by_id($p_appliance->virtualization); $html = new htmlobject($OPENQRM_SERVER_BASE_DIR . '/openqrm/web/base/class/htmlobjects'); $a = $html->a(); $a->label = 'noVNC'; $a->css = 'badge'; $a->handler = 'onclick="wait();"'; $plugin_link = ''; if (strstr($p_appliance->state, "active")) { if (strstr($virtualization->type, '-vm-')) { $a->href = '/openqrm/base/index.php?plugin=novnc&controller=novnc&novnc_action=console&appliance_id=' . $p_appliance->id; } else { $a->href = '/openqrm/base/index.php?plugin=novnc&controller=novnc&novnc_action=login&appliance_id=' . $p_appliance->id; } $plugin_link = $a; } else { if ($p_resource->id === '0') { $a->href = '/openqrm/base/index.php?plugin=novnc&controller=novnc&novnc_action=login&appliance_id=' . $p_appliance->id; $plugin_link = $a; } } return $plugin_link; }
function get_network_manager_appliance_edit($appliance_id, $openqrm, $response) { $appliance = new appliance(); $appliance->get_instance_by_id($appliance_id); $virtualization = new virtualization(); $virtualization->get_instance_by_id($appliance->virtualization); // choose only not vm if (stripos($virtualization->type, '-vm-') === false) { $plugin_title = "Network Manager on " . $appliance->name; $a = $response->html->a(); $a->label = '<image height="24" width="24" alt="' . $plugin_title . '" title="' . $plugin_title . '" src="' . $openqrm->get('baseurl') . '/plugins/network-manager/img/plugin.png">'; $a->href = $openqrm->get('baseurl') . '/index.php?base=appliance&appliance_action=load_edit&aplugin=network-manager&appliance_id=' . $appliance_id; return $a; } }
function set_boot($resource_id, $boot) { global $event; $event->log("set_boot", $_SERVER['REQUEST_TIME'], 5, "linuxcoeresource.class.php", "Setting boot-sequence of resource " . $resource_id . " to " . $boot . ".", "", "", 0, 0, 0); $boot_sequence = "net"; switch ($boot) { case '0': // netboot $boot_sequence = "net"; break; case '1': // local boot $boot_sequence = "local"; break; } $linuxcoe_resource = new resource(); $linuxcoe_resource->get_instance_by_id($resource_id); // is it a vm ? if ($linuxcoe_resource->vhostid == $resource_id) { return; } $linuxcoe_resource_virtualization = new virtualization(); $linuxcoe_resource_virtualization->get_instance_by_id($linuxcoe_resource->vtype); switch ($linuxcoe_resource_virtualization->type) { case 'kvm-vm-net': $linuxcoe_resource_vhost = new resource(); $linuxcoe_resource_vhost->get_instance_by_id($linuxcoe_resource->vhostid); $linuxcoe_resource_set_boot_commmand = $this->_base_dir . "/openqrm/plugins/kvm/bin/openqrm-kvm-vm setboot -m " . $linuxcoe_resource->mac . " -b " . $boot_sequence . " --openqrm-cmd-mode background"; $linuxcoe_resource_vhost->send_command($linuxcoe_resource_vhost->ip, $linuxcoe_resource_set_boot_commmand); $event->log("set_boot", $_SERVER['REQUEST_TIME'], 5, "linuxcoeresource.class.php", "Resource " . $resource_id . " is a KVM VM on Host " . $linuxcoe_resource_vhost->id . ".", "", "", 0, 0, 0); break; case 'kvm-vm-local': $linuxcoe_resource_vhost = new resource(); $linuxcoe_resource_vhost->get_instance_by_id($linuxcoe_resource->vhostid); $linuxcoe_resource_set_boot_commmand = $this->_base_dir . "/openqrm/plugins/kvm/bin/openqrm-kvm-vm setboot -m " . $linuxcoe_resource->mac . " -b " . $boot_sequence . " --openqrm-cmd-mode background"; $linuxcoe_resource_vhost->send_command($linuxcoe_resource_vhost->ip, $linuxcoe_resource_set_boot_commmand); $event->log("set_boot", $_SERVER['REQUEST_TIME'], 5, "linuxcoeresource.class.php", "Resource " . $resource_id . " is a KVM-Storage VM on Host " . $linuxcoe_resource_vhost->id . ".", "", "", 0, 0, 0); break; } }
function get_hybrid_cloud_appliance_link($appliance_id) { global $event; global $OPENQRM_SERVER_BASE_DIR; global $OPENQRM_SERVER_IP_ADDRESS; global $OPENQRM_EXEC_PORT; $p_appliance = new appliance(); $p_appliance->get_instance_by_id($appliance_id); $p_resource = new resource(); $p_resource->get_instance_by_id($p_appliance->resources); $virtualization = new virtualization(); $virtualization->get_instance_by_id($p_appliance->virtualization); if ($virtualization->type != "hybrid-cloud-vm-local") { return; } // get hybrid-cloud account $hybrid_cloud_acl_id = $p_resource->get_resource_capabilities("HCACL"); if ($hybrid_cloud_acl_id == '') { $event->log("get_hybrid_cloud_appliance_link", $_SERVER['REQUEST_TIME'], 2, "openqrm-hybrid-cloud-appliance-link-hook.php", "Could not find Hybrid-Cloud Account for resource " . $p_resource->id, "", "", 0, 0, $appliance_id); return; } $hc = new hybrid_cloud(); $hc->get_instance_by_id($hybrid_cloud_acl_id); $html = new htmlobject($OPENQRM_SERVER_BASE_DIR . '/openqrm/web/base/class/htmlobjects'); $a = $html->a(); $a->label = 'Dashboard'; $a->css = 'badge'; $a->target = '_BLANK'; if ($hc->account_type == 'aws' || $hc->account_type == 'euca') { $a->href = 'https://console.aws.amazon.com/ec2/'; } if ($hc->account_type == 'lc-openstack') { $a->href = 'http://' . $hc->host . '/project/instances/'; } $plugin_link = $a->get_string(); return $plugin_link; }
function openqrm_hybrid_cloud_cloud_product($cmd, $cloud_hook_config) { global $event; global $OPENQRM_SERVER_BASE_DIR; global $OPENQRM_SERVER_IP_ADDRESS; global $OPENQRM_EXEC_PORT; global $RootDir; $openqrm_server = new openqrm_server(); $event->log("openqrm_hybrid_cloud_cloud_product", $_SERVER['REQUEST_TIME'], 5, "openqrm-hybrid-cloud-cloud-product-hook.php", "Handling " . $cmd . " event", "", "", 0, 0, 0); switch ($cmd) { case "add": $event->log("openqrm_hybrid_cloud_cloud_product", $_SERVER['REQUEST_TIME'], 5, "openqrm-hybrid-cloud-cloud-product-hook.php", "Handling cloud-product " . $cmd . " event", "", "", 0, 0, 0); // create resource products $db = openqrm_get_db_connection(); $image = new image(); $checked_virtualization_plugins = array(); $virtualization = new virtualization(); $virtualization_id_ar = $virtualization->get_list(); unset($virtualization_id_ar[0]); foreach ($virtualization_id_ar as $key => $value) { $next_sort_id = 0; $id = $value['value']; $virtualization->get_instance_by_id($id); $pos = strpos($virtualization->type, 'hybrid-cloud-vm-'); if ($pos !== false) { $event->log("openqrm_hybrid_cloud_cloud_product", $_SERVER['REQUEST_TIME'], 5, "openqrm-hybrid-cloud-cloud-product-hook.php", "Adding " . $virtualization->type . " as cloud-product", "", "", 0, 0, 0); $cloud_product_id = (int) str_replace(".", "", str_pad(microtime(true), 15, "0")); $create_resource_cloudselector_config = "insert into cloud_selector (id, type, sort_id, quantity, price, name, description, state) VALUES (" . $cloud_product_id . ", 'resource', " . $next_sort_id . ", '" . $virtualization->id . "', 1, '" . $virtualization->type . "', '" . $virtualization->name . "', 1);"; $recordSet = $db->Execute($create_resource_cloudselector_config); $next_sort_id++; // add all existing images for this virtualization type to private images $virtualization_plugin_name = $virtualization->get_plugin_name(); if (!in_array($virtualization_plugin_name, $checked_virtualization_plugins)) { $checked_virtualization_plugins[] = $virtualization_plugin_name; $deployment = new deployment(); $deployment_id_ar = $deployment->get_id_by_storagetype($virtualization_plugin_name); foreach ($deployment_id_ar as $key => $value) { $did = $value['value']; $deployment->get_instance_by_id($did); $image_id_deployment_ar = $image->get_ids_by_type($deployment->type); foreach ($image_id_deployment_ar as $iid_ar) { // add to private images $image_id = $iid_ar['image_id']; $event->log("openqrm_hybrid_cloud_cloud_product", $_SERVER['REQUEST_TIME'], 5, "openqrm-hybrid-cloud-cloud-product-hook.php", "Adding Image " . $image_id . " as private image", "", "", 0, 0, 0); $cloud_pr_id = (int) str_replace(".", "", str_pad(microtime(true), 15, "0")); $create_private_image_config = "insert into cloud_private_image (co_id, co_image_id, co_cu_id, co_clone_on_deploy, co_state) VALUES (" . $cloud_pr_id . ", " . $image_id . ", 0, 1, 1);"; $recordSet = $db->Execute($create_private_image_config); } } } } } // add host to admin resource pool $admin_project_id = $cloud_hook_config['cloud_admin_procect']; $virtualization->get_instance_by_type('hybrid-cloud'); $appliance = new appliance(); $appliance_id_ar = $appliance->get_ids_per_virtualization($virtualization->id); foreach ($appliance_id_ar as $key => $value) { $appliance_id = $value['appliance_id']; $appliance->get_instance_by_id($appliance_id); $cloud_respool_id = (int) str_replace(".", "", str_pad(microtime(true), 15, "0")); $create_default_resource_pool_config = "insert into cloud_respool(rp_id, rp_resource_id, rp_cg_id) values (" . $cloud_respool_id . ", " . $appliance->resources . ", " . $admin_project_id . ");"; $recordSet = $db->Execute($create_default_resource_pool_config); } break; case "remove": $cloud_product_class = $RootDir . "/plugins/cloud/class/cloudselector.class.php"; if (file_exists($cloud_product_class)) { require_once $cloud_product_class; $cloud_selector = new cloudselector(); $virtualization = new virtualization(); $virtualization->get_instance_by_type('hybrid-cloud-vm-local'); $event->log("openqrm_hybrid_cloud_cloud_product", $_SERVER['REQUEST_TIME'], 5, "openqrm-hybrid-cloud-cloud-product-hook.php", "Removing resource type " . $virtualization->type . " from cloud-products", "", "", 0, 0, 0); $cloud_selector->remove_by_quantity($virtualization->id); } break; } }
function edit() { $resource_icon_default = "/img/resource.png"; $storage_icon = "/plugins/kvm/img/plugin.png"; //$state_icon = $this->openqrm->get('baseurl')."/img/".$this->resource->state.".png"; if ($this->file->exists($this->openqrm->get('webdir') . $storage_icon)) { $resource_icon_default = $storage_icon; } $resource_icon_default = $this->openqrm->get('baseurl') . $resource_icon_default; // check if we have a plugin implementing the remote console $remote_console = false; $plugin = new plugin(); $enabled_plugins = $plugin->enabled(); foreach ($enabled_plugins as $index => $plugin_name) { //$plugin_remote_console_running = $this->openqrm->get('webdir')."/plugins/".$plugin_name."/.running"; $plugin_remote_console_hook = $this->openqrm->get('webdir') . "/plugins/" . $plugin_name . "/openqrm-" . $plugin_name . "-remote-console-hook.php"; if ($this->file->exists($plugin_remote_console_hook)) { require_once "{$plugin_remote_console_hook}"; $link_function = str_replace("-", "_", "openqrm_" . "{$plugin_name}" . "_remote_console"); if (function_exists($link_function)) { $remote_functions[] = $link_function; $remote_console = true; } } } // prepare list of all Host resource id for the migration select // we need a select with the ids/ips from all resources which // are used by appliances with kvm capabilities $kvm_hosts = array(); $appliance_list = new appliance(); $appliance_list_array = $appliance_list->get_list(); foreach ($appliance_list_array as $index => $app) { $appliance_kvm_host_check = new appliance(); $appliance_kvm_host_check->get_instance_by_id($app["value"]); // only active appliances if (!strcmp($appliance_kvm_host_check->state, "active") || $appliance_kvm_host_check->resources == 0) { $virtualization = new virtualization(); $virtualization->get_instance_by_id($appliance_kvm_host_check->virtualization); if (!strcmp($virtualization->type, "kvm") && !strstr($virtualization->type, "kvm-vm")) { $kvm_host_resource = new resource(); $kvm_host_resource->get_instance_by_id($appliance_kvm_host_check->resources); // exclude source host #if ($kvm_host_resource->id == $this->resource->id) { # continue; #} // only active appliances if (!strcmp($kvm_host_resource->state, "active")) { $migration_select_label = "Res. " . $kvm_host_resource->id . "/" . $kvm_host_resource->ip; $kvm_hosts[] = array("value" => $kvm_host_resource->id, "label" => $migration_select_label); } } } } $d['state'] = '<span class="pill ' . $this->resource->state . '">' . $this->resource->state . '</span>'; $d['resource'] = $this->resource->id . ' / ' . $this->resource->ip; $d['name'] = $this->appliance->name; $d['id'] = $this->appliance->id; $a = $this->response->html->a(); $a->label = $this->lang['action_add_local_vm']; $a->css = 'add'; $a->handler = 'onclick="wait();"'; $a->href = $this->response->get_url($this->actions_name, "add") . '&vmtype=kvm-vm-local'; $d['add_local_vm'] = $a->get_string(); $a = $this->response->html->a(); $a->label = $this->lang['action_add_network_vm']; $a->css = 'add'; $a->handler = 'onclick="wait();"'; $a->href = $this->response->get_url($this->actions_name, "add") . '&vmtype=kvm-vm-net'; $d['add_network_vm'] = $a->get_string(); $body = array(); $identifier_disabled = array(); $file = $this->statfile; if ($this->file->exists($file)) { $lines = explode("\n", $this->file->get_contents($file)); if (count($lines) >= 1) { $i = 0; foreach ($lines as $line) { if ($line !== '') { $line = explode('@', $line); $state = $line[0]; $name = $line[1]; $mac = $line[2]; $resource = new resource(); $resource->get_instance_by_mac($mac); if ($resource->vhostid != $this->resource->id) { continue; } $res_virtualization = new virtualization(); $res_virtualization->get_instance_by_id($resource->vtype); $update = ''; $a = $this->response->html->a(); $a->title = $this->lang['action_update']; $a->label = $this->lang['action_update']; $a->handler = 'onclick="wait();"'; $a->css = 'edit'; $a->href = $this->response->get_url($this->actions_name, "update") . '&vm=' . $name . '&vmtype=' . $res_virtualization->type; $update_link = $a->get_string(); $clone = ''; $a = $this->response->html->a(); $a->title = $this->lang['action_clone']; $a->label = $this->lang['action_clone']; $a->handler = 'onclick="wait();"'; $a->css = 'clone'; $a->href = $this->response->get_url($this->actions_name, "clone") . '&vm=' . $name . '&mac=' . $mac; $clone_link = $a->get_string(); if ($res_virtualization->type == 'kvm-vm-local') { if ($state === '0' && $resource->image === 'idle') { $update = $update_link; $clone = $clone_link; } } if ($res_virtualization->type == 'kvm-vm-net') { if ($state !== '2' && $resource->image === 'idle') { $update = $update_link; $clone = $clone_link; } } $migrate = ''; $a = $this->response->html->a(); $a->title = $this->lang['action_migrate']; $a->label = $this->lang['action_migrate']; $a->handler = 'onclick="wait();"'; $a->css = 'migrate'; $a->href = $this->response->get_url($this->actions_name, "migrate") . '&vm=' . $name . '&mac=' . $mac; if (count($kvm_hosts) >= 1 && $state === '1') { $migrate = $a->get_string(); } $data = '<b>' . $this->lang['table_id'] . '</b>: ' . $resource->id . '<br>'; $data .= '<b>' . $this->lang['table_name'] . '</b>: ' . $name . '<br>'; $data .= '<b>' . $this->lang['table_type'] . '</b>: ' . $res_virtualization->name . '<br>'; $data .= '<b>' . $this->lang['table_ip'] . '</b>: ' . $resource->ip . '<br>'; $data .= '<b>' . $this->lang['table_mac'] . '</b>: ' . $mac . '<br>'; $data .= '<b>' . $this->lang['table_vnc'] . '</b>: ' . $line[5] . '<br>'; $data .= '<b>' . $this->lang['table_cpu'] . '</b>: ' . $line[3] . '<br>'; $data .= '<b>' . $this->lang['table_ram'] . '</b>: ' . $line[4] . '<br>'; $data .= '<b>' . $this->lang['table_nics'] . '</b>: ' . $resource->nics; $appliance = new appliance(); $appliance->get_instance_by_virtualization_and_resource($resource->vtype, $resource->id); $server = array(); $server[0] = ''; $server[1] = '1000000000000000000000000'; if ($appliance->id !== '') { $kernel = new kernel(); $kernel->get_instance_by_id($appliance->kernelid); $image = new image(); $image->get_instance_by_id($appliance->imageid); $storage = new storage(); $storage->get_instance_by_id($image->storageid); $s = '<b>' . $this->lang['table_appliance'] . '</b>: ' . $appliance->id . '<br>'; $s .= '<b>' . $this->lang['table_name'] . '</b>: ' . $appliance->name . '<br>'; $s .= '<b>' . $this->lang['table_kernel'] . '</b>: ' . $kernel->name . '<br>'; $s .= '<b>' . $this->lang['table_image'] . '</b>: ' . $image->name . '<br>'; $s .= '<b>' . $this->lang['table_storage'] . '</b>: ' . $storage->name . '<br>'; $server[0] = $s; $server[1] = $appliance->id; } $console = ''; if ($state === '2') { $t = $this->response->html->template($this->openqrm->get('webdir') . '/js/openqrm-progressbar.js'); $identifier_disabled[] = $name; // progressbar $t->add(uniqid('b'), 'id'); $t->add($this->openqrm->get('baseurl') . '/api.php?action=plugin&plugin=kvm&controller=kvm-vm&kvm_vm_action=progress&name=' . $name . '.vm_migration_progress', 'url'); $t->add($this->lang['action_migrate_in_progress'], 'lang_in_progress'); $t->add($this->lang['action_migrate_finished'], 'lang_finished'); $console = $t->get_string(); } else { if ($remote_console === true && $resource->imageid !== 1 && $state === '1') { foreach ($remote_functions as $function) { $a = $function($resource->id); if (is_object($a)) { $console .= $a->get_string(); } } } } $state = array(); $state[0] = '<span class="pill idle">idle</span>'; $state[1] = 'i'; if ($line[0] === '1' && $resource->image !== 'idle') { $state[0] = '<span class="pill active">active</span>'; $state[1] = 'a'; } if ($res_virtualization->type == 'kvm-vm-net' && $line[0] === '0') { $state[0] = '<span class="pill off">off</span>'; $state[1] = 'o'; } $action = ''; if (!in_array($name, $identifier_disabled)) { $action = $update . $clone . $migrate; } $body[$i] = array('state' => $state[0], 'state_s' => $state[1], 'name' => $name, 'id' => $resource->id, 'mac' => $mac, 'cpu' => $line[3], 'ram' => $line[4], 'ip' => $resource->ip, 'vnc' => $line[5], 'data' => $data, 'appliance' => $server[0], 'appliance_s' => $server[1], 'plugins' => $console, 'action' => $action); } $i++; } } } $h['state']['title'] = $this->lang['table_state']; $h['state']['sortable'] = false; $h['state_s']['title'] = $this->lang['table_state']; $h['state_s']['sortable'] = true; $h['state_s']['hidden'] = true; $h['id']['title'] = $this->lang['table_id']; $h['id']['hidden'] = true; $h['name']['title'] = $this->lang['table_name']; $h['name']['hidden'] = true; $h['ip']['title'] = $this->lang['table_ip']; $h['ip']['hidden'] = true; $h['mac']['title'] = $this->lang['table_mac']; $h['mac']['hidden'] = true; $h['vnc']['title'] = $this->lang['table_vnc']; $h['vnc']['hidden'] = true; $h['cpu']['title'] = $this->lang['table_cpu']; $h['cpu']['hidden'] = true; $h['ram']['title'] = $this->lang['table_ram']; $h['ram']['hidden'] = true; $h['nics']['title'] = $this->lang['table_nics']; $h['nics']['hidden'] = true; $h['data']['title'] = ' '; $h['data']['sortable'] = false; $h['appliance']['title'] = ' '; $h['appliance']['sortable'] = false; $h['appliance_s']['title'] = $this->lang['table_appliance']; $h['appliance_s']['sortable'] = true; $h['appliance_s']['hidden'] = true; $h['plugins']['title'] = ' '; $h['plugins']['sortable'] = false; $h['action']['title'] = ' '; $h['action']['sortable'] = false; $table = $this->response->html->tablebuilder('kvm_vm_edit', $this->response->get_array($this->actions_name, 'edit')); $table->sort = 'name'; $table->limit = 10; $table->offset = 0; $table->order = 'ASC'; $table->max = count($body); $table->autosort = true; $table->sort_link = false; $table->id = 'Tabelle'; $table->css = 'htmlobject_table'; $table->border = 1; $table->cellspacing = 0; $table->cellpadding = 3; $table->form_action = $this->response->html->thisfile; $table->head = $h; $table->body = $body; $table->identifier = 'name'; $table->identifier_name = $this->identifier_name; $table->identifier_disabled = $identifier_disabled; $table->actions_name = $this->actions_name; $table->actions = array(array('start' => $this->lang['action_start']), array('stop' => $this->lang['action_stop']), array('reboot' => $this->lang['action_reboot']), array('remove' => $this->lang['action_remove'])); $d['table'] = $table->get_string(); return $d; }
function get_response() { $response = $this->response; $form = $response->get_form($this->actions_name, 'edit'); $id = $this->apliance_id; $submit = $form->get_elements('submit'); $submit->handler = 'onclick="wait();"'; $form->add($submit, 'submit'); $submit = $form->get_elements('cancel'); $submit->handler = 'onclick="cancel();"'; $form->add($submit, 'cancel'); $appliance = new appliance(); $appliance->get_instance_by_id($id); $resource = new resource(); $list = $resource->get_list(); $cpus[0] = array(0, $this->lang['option_auto']); $cspe[0] = array(0, $this->lang['option_auto']); $cmod[0] = array(0, $this->lang['option_auto']); $nics[0] = array(0, $this->lang['option_auto']); $memt[0] = array(0, $this->lang['option_auto']); $swap[0] = array(0, $this->lang['option_auto']); foreach ($list as $v) { $resource->get_instance_by_id($v['resource_id']); $c = $resource->cpunumber; $cs = $resource->cpuspeed; $cm = $resource->cpumodel; $n = $resource->nics; $m = $resource->memtotal; $s = $resource->swaptotal; if (isset($c) && $c != '0') { $cpus[$c] = array($c, $c); } if (isset($cs) && $cs != '0') { $cspe[$cs] = array($cs, $cs); } if (isset($cm) && $cm != '0' && $cm !== '') { $cmod[$cm] = array($cm, $cm); } if (isset($n) && $n != '0') { $nics[$n] = array($n, $n); } if (isset($m) && $m != '0') { $memt[$m] = array($m, $m); } if (isset($s) && $s != '0') { $swap[$s] = array($s, $s); } } ksort($cpus, SORT_NUMERIC); ksort($cspe, SORT_NUMERIC); ksort($cmod, SORT_STRING); ksort($nics, SORT_NUMERIC); ksort($memt, SORT_NUMERIC); ksort($swap, SORT_NUMERIC); $d['cpus']['label'] = $this->lang['form_cpus']; $d['cpus']['object']['type'] = 'htmlobject_select'; $d['cpus']['object']['attrib']['index'] = array(0, 1); $d['cpus']['object']['attrib']['name'] = 'appliance_cpunumber'; $d['cpus']['object']['attrib']['options'] = $cpus; $d['cpus']['object']['attrib']['selected'] = array($appliance->cpunumber); $d['cpuspeed']['label'] = $this->lang['form_cpuspeed']; $d['cpuspeed']['object']['type'] = 'htmlobject_select'; $d['cpuspeed']['object']['attrib']['index'] = array(0, 1); $d['cpuspeed']['object']['attrib']['name'] = 'appliance_cpuspeed'; $d['cpuspeed']['object']['attrib']['options'] = $cspe; $d['cpuspeed']['object']['attrib']['selected'] = array($appliance->cpuspeed); $d['cpumodel']['label'] = $this->lang['form_cpumodel']; $d['cpumodel']['object']['type'] = 'htmlobject_select'; $d['cpumodel']['object']['attrib']['index'] = array(0, 1); $d['cpumodel']['object']['attrib']['name'] = 'appliance_cpumodel'; $d['cpumodel']['object']['attrib']['options'] = $cmod; $d['cpumodel']['object']['attrib']['selected'] = array($appliance->cpumodel); $d['nics']['label'] = $this->lang['form_nics']; $d['nics']['object']['type'] = 'htmlobject_select'; $d['nics']['object']['attrib']['index'] = array(0, 1); $d['nics']['object']['attrib']['name'] = 'appliance_nics'; $d['nics']['object']['attrib']['options'] = $nics; $d['nics']['object']['attrib']['selected'] = array($appliance->nics); $d['memory']['label'] = $this->lang['form_memory']; $d['memory']['object']['type'] = 'htmlobject_select'; $d['memory']['object']['attrib']['index'] = array(0, 1); $d['memory']['object']['attrib']['name'] = 'appliance_memtotal'; $d['memory']['object']['attrib']['options'] = $memt; $d['memory']['object']['attrib']['selected'] = array($appliance->memtotal); $d['swap']['label'] = $this->lang['form_swap']; $d['swap']['object']['type'] = 'htmlobject_select'; $d['swap']['object']['attrib']['index'] = array(0, 1); $d['swap']['object']['attrib']['name'] = 'appliance_swaptotal'; $d['swap']['object']['attrib']['options'] = $swap; $d['swap']['object']['attrib']['selected'] = array($appliance->swaptotal); $resource = new resource(); $resource_hostname = ''; if (isset($appliance->resources) && $appliance->resources !== '') { if ($appliance->resources >= 0) { $res = $resource->get_instance_by_id($appliance->resources); $resource_hostname = $res->hostname; } else { $resource_hostname = 'auto-select'; } } $a = $response->html->a(); $a->name = ''; #$a->label = '<img src="'.$this->controller->get('baseurl').'/img/resource.png"> '.sprintf($this->lang['action_resource'], $resource_hostname); $a->label = $resource_hostname; $a->css = "manage"; $a->title = sprintf($this->lang['action_resource'], $resource_hostname); $a->href = $response->get_url($this->actions_name, 'step2'); $d['resource']['label'] = $this->lang['form_resource']; $d['resource']['object'] = $a; $img = new image(); $img = $img->get_instance_by_id($appliance->imageid); $a = $response->html->a(); $a->name = ''; #$a->label = '<img src="'.$this->controller->get('baseurl').'/img/image.png"> '.sprintf($this->lang['action_image'], $img->name) ; $a->label = $img->name; $a->css = "manage"; $a->title = sprintf($this->lang['action_image'], $img->name); $a->href = $response->get_url($this->actions_name, 'step3'); $d['image']['label'] = $this->lang['form_image']; $d['image']['object'] = $a; $kern = new kernel(); $kern = $kern->get_instance_by_id($appliance->kernelid); $a = $response->html->a(); $a->name = ''; #$a->label = '<img src="'.$this->controller->get('baseurl').'/img/image.png"> '.sprintf($this->lang['action_image'], $img->name) ; $a->label = $kern->name; $a->css = "manage"; $a->title = sprintf($this->lang['action_kernel'], $kern->name); $a->href = $response->get_url($this->actions_name, 'step4'); $d['kernel']['label'] = $this->lang['form_kernel']; $d['kernel']['object'] = $a; $virtualization = new virtualization(); if (isset($appliance->resources) && $appliance->resources !== '') { $resource->get_instance_by_id($appliance->resources); } $vl = array(); $list = $virtualization->get_list(); foreach ($list as $v) { if (strpos($v['label'], ' VM') === false) { $vl[] = array($v['label'], $v['value']); } else { if ($v['value'] === $resource->vtype) { $hide_virtualization = true; break; } } } asort($vl); if (isset($hide_virtualization)) { $virtualization->get_instance_by_id($resource->vtype); $div = $this->response->html->div(); $div->name = ''; $div->add($virtualization->name); $d['virtualization']['label'] = $this->lang['form_virtualization']; $d['virtualization']['object'] = $div; } else { $d['virtualization']['label'] = $this->lang['form_virtualization']; $d['virtualization']['object']['type'] = 'htmlobject_select'; $d['virtualization']['object']['attrib']['index'] = array(1, 0); $d['virtualization']['object']['attrib']['name'] = 'appliance_virtualization'; $d['virtualization']['object']['attrib']['options'] = $vl; $d['virtualization']['object']['attrib']['selected'] = array($appliance->virtualization); } $d['capabilities']['label'] = $this->lang['form_capabilities']; $d['capabilities']['object']['type'] = 'htmlobject_input'; $d['capabilities']['object']['attrib']['type'] = 'text'; $d['capabilities']['object']['attrib']['name'] = 'appliance_capabilities'; $d['capabilities']['object']['attrib']['value'] = $appliance->capabilities; $d['capabilities']['object']['attrib']['maxlength'] = 1000; $d['comment']['label'] = $this->lang['form_comment']; $d['comment']['validate']['regex'] = $this->openqrm->regex['comment']; $d['comment']['validate']['errormsg'] = sprintf($this->lang['error_comment'], $this->openqrm->regex['comment']); $d['comment']['object']['type'] = 'htmlobject_textarea'; $d['comment']['object']['attrib']['name'] = 'appliance_comment'; $d['comment']['object']['attrib']['value'] = $appliance->comment; $d['comment']['object']['attrib']['maxlength'] = 255; $form->add($d); $response->form = $form; return $response; }
function remove($resource_id, $virtualization_type, $name, $mac) { global $OPENQRM_SERVER_BASE_DIR; global $OPENQRM_SERVER_IP_ADDRESS; global $OPENQRM_EXEC_PORT; global $RESOURCE_INFO_TABLE; global $RootDir; global $event; // never remove the openQRM server resource if ($resource_id == 0) { return; } $vtype = new virtualization(); $vtype->get_instance_by_id($virtualization_type); $virtualization_plugin_name = $vtype->get_plugin_name(); // remove the VM from host $auto_resource = new resource(); $auto_resource->get_instance_by_id($resource_id); $host_resource = new resource(); $host_resource->get_instance_by_id($auto_resource->vhostid); $event->log("remove", $_SERVER['REQUEST_TIME'], 5, "cloudvm.class.php", "Trying to remove resource {$resource_id} type {$virtualization_plugin_name} on host {$host_resource->id} ({$mac})", "", "", 0, 0, 0); // we need to have an openQRM server object too since some of the // virtualization commands are sent from openQRM directly $openqrm = new openqrm_server(); // plug in the virtualization cloud hook $virtualization_cloud_hook = "{$RootDir}/plugins/{$virtualization_plugin_name}/openqrm-{$virtualization_plugin_name}-cloud-hook.php"; if (file_exists($virtualization_cloud_hook)) { $event->log("remove", $_SERVER['REQUEST_TIME'], 5, "cloudvm.class", "Found plugin {$virtualization_plugin_name} handling to remove the VM.", "", "", 0, 0, $resource_id); require_once "{$virtualization_cloud_hook}"; $virtualization_method = "remove_" . $vtype->type; $virtualization_method = str_replace("-", "_", $virtualization_method); $virtualization_method($host_resource->id, $name, $mac); } else { $event->log("cloud", $_SERVER['REQUEST_TIME'], 5, "cloudvm.class", "Do not know how to remove VM from type {$virtualization_plugin_name}.", "", "", 0, 0, 0); return false; } // let plugin hooks settle sleep(2); // remove VM from hostlimit current_vms $res_hostlimit = new cloudhostlimit(); $res_hostlimit->get_instance_by_resource($host_resource->id); if (strlen($res_hostlimit->id)) { if ($res_hostlimit->current_vms > 0) { $current_vms = $res_hostlimit->current_vms - 1; $cloud_hostlimit_fields["hl_current_vms"] = $current_vms; $res_hostlimit->update($res_hostlimit->id, $cloud_hostlimit_fields); } } // resource object remove $auto_resource->remove($auto_resource->id, $auto_resource->mac); $event->log("remove", $_SERVER['REQUEST_TIME'], 5, "cloudvm.class.php", "Removed resource {$resource_id}", "", "", 0, 0, 0); }
$g_storage_resource = $g_storage->resource_id; $storage_resources_array[] .= $g_storage_resource; } $restype = 0; $resource = new resource(); $resource_list = $resource->get_list(); foreach ($resource_list as $res) { $res_id = $res['resource_id']; //echo "!! res_id $res_id <br>"; $g_resource = new resource(); $g_resource->get_instance_by_id($res_id); // start gathering $resources_all++; // physical or virtual ? if (strlen($g_resource->vtype) && $g_resource->vtype != "NULL") { $virtualization = new virtualization(); $virtualization->get_instance_by_id($g_resource->vtype); if (strstr($virtualization->type, "-vm")) { // virtual $resources_virtual++; $restype = 1; } else { // physical $resources_physical++; $restype = 0; } } else { // we treat unknown system types as physical $resources_physical++; $restype = 0; }
function VirtualizationGetList($method_parameters) { global $event; $parameter_array = explode(',', $method_parameters); $mode = $parameter_array[0]; $username = $parameter_array[1]; $password = $parameter_array[2]; // check all user input for ($i = 0; $i <= 2; $i++) { if (!$this->check_param($parameter_array[$i])) { $event->log("cloudsoap->VirtualizationGetList", $_SERVER['REQUEST_TIME'], 2, "cloud-soap-server.php", "Not allowing user-intput with special-characters : {$parameter_array[$i]}", "", "", 0, 0, 0); return; } } // check parameter count $parameter_count = count($parameter_array); if ($parameter_count != 3) { $event->log("cloudsoap->VirtualizationGetList", $_SERVER['REQUEST_TIME'], 2, "cloud-soap-server.php", "Wrong parameter count {$parameter_count} ! Exiting.", "", "", 0, 0, 0); return; } // check authentication if (!$this->check_user($mode, $username, $password)) { $event->log("cloudsoap->VirtualizationGetList", $_SERVER['REQUEST_TIME'], 2, "cloud-soap-server.php", "User authentication failed (mode {$mode})", "", "", 0, 0, 0); return; } $event->log("cloudsoap->VirtualizationGetList", $_SERVER['REQUEST_TIME'], 5, "cloud-soap-server.php", "Providing list of available virtualizations", "", "", 0, 0, 0); $virtualization = new virtualization(); $virtualization_list = $virtualization->get_list(); $virtualization_name_list = array(); $virtualization_return_list = array(); foreach ($virtualization_list as $virtualizations) { $virtualization_name_list[] = $virtualizations['label']; } // check if to show physical system type $cc_conf = new cloudconfig(); $cc_request_physical_systems = $cc_conf->get_value(4); // request_physical_systems if (!strcmp($cc_request_physical_systems, "false")) { array_shift($virtualization_name_list); } // filter out the virtualization hosts $cloudselector = new cloudselector(); $cloud_selector_enabled = $cc_conf->get_value(22); // cloudselector foreach ($virtualization_name_list as $virt) { if (!strstr($virt, "Host")) { // check cloudselector if (!strcmp($cloud_selector_enabled, "true")) { // virtualization $cs_virt_type = new virtualization(); $cs_virt_type->get_instance_by_name($virt); if ($cloudselector->product_exists_enabled("resource", $cs_virt_type->id)) { $virtualization_return_list[] = $virt; } } else { $virtualization_return_list[] = $virt; } } } return $virtualization_return_list; }
function select() { $h = array(); $h['appliance_state']['title'] = ' '; $h['appliance_state']['sortable'] = false; /* $h['appliance_icon']['title'] =' '; $h['appliance_icon']['sortable'] = false; */ $h['appliance_id']['title'] = $this->lang['table_id']; $h['appliance_name']['title'] = $this->lang['table_name']; $h['appliance_values']['title'] = ' '; $h['appliance_values']['sortable'] = false; $h['login']['title'] = ' '; $h['login']['sortable'] = false; // use the appliance link hook require_once $this->openqrm->get('webdir') . "/plugins/sshterm/openqrm-sshterm-appliance-link-hook.php"; $appliance = new appliance(); $params = $this->response->get_array($this->actions_name, 'select'); $b = array(); $table = $this->response->html->tablebuilder('login', $params); $table->offset = 0; $table->sort = 'appliance_id'; $table->limit = 10; $table->order = 'ASC'; $table->init(); $appliances = $appliance->display_overview($table->offset, 100000, $table->sort, $table->order); foreach ($appliances as $index => $appliance_db) { $appliance = new appliance(); $appliance->get_instance_by_id($appliance_db["appliance_id"]); $resource = new resource(); $resource->get_instance_by_id($appliance->resources); $kernel = new kernel(); $kernel->get_instance_by_id($appliance_db["appliance_kernelid"]); $image = new image(); $image->get_instance_by_id($appliance_db["appliance_imageid"]); $virtualization = new virtualization(); $virtualization->get_instance_by_id($appliance_db["appliance_virtualization"]); $resource_icon_default = "/openqrm/base/img/appliance.png"; $active_state_icon = "active"; $inactive_state_icon = "inactive"; $login = ''; if ($appliance->stoptime == 0 || $appliance->resources == 0) { $state_icon = $active_state_icon; // login $login = get_sshterm_appliance_link($appliance->id); if (is_object($login)) { $login = $login->get_string(); } } else { $state_icon = $inactive_state_icon; $login = ''; } $str = '<strong>Kernel:</strong> ' . $kernel->name . '<br> <strong>Image:</strong> ' . $image->name . '<br> <strong>Resource:</strong> ' . $resource->id . " / " . $resource->ip . '<br> <strong>Type:</strong> <span class="pill">' . $virtualization->name . "</span>"; $state_pill = $this->response->html->span(); $state_pill->css = "pill"; $state_pill->add($state_icon); $b[] = array('appliance_state' => $state_pill->get_string(), 'appliance_id' => $appliance->id, 'appliance_name' => $appliance->name, 'appliance_values' => $str, 'login' => $login); } $table->id = 'Tabelle'; $table->css = 'htmlobject_table'; $table->border = 1; $table->cellspacing = 0; $table->cellpadding = 3; $table->form_action = $this->response->html->thisfile; $table->autosort = true; $table->sort_link = false; $table->max = count($b); $table->head = $h; $table->body = $b; $table->limit_select = array(array("value" => 5, "text" => 5), array("value" => 10, "text" => 10), array("value" => 20, "text" => 20), array("value" => 30, "text" => 30), array("value" => 50, "text" => 50), array("value" => 100, "text" => 100)); $d = array(); $d['table'] = $table; return $d; }
function remove() { $response = $this->get_response(); $resources = $response->html->request()->get($this->identifier_name); $force_remove = $response->html->request()->get('force_remove'); $form = $response->form; $resource = new resource(); if ($resources !== '') { $submit = $form->get_elements('submit'); $submit->handler = 'onclick="wait();"'; $form->add($submit, 'submit'); $submit = $form->get_elements('cancel'); $submit->handler = 'onclick="cancel();"'; $form->add($submit, 'cancel'); $i = 0; foreach ($resources as $id) { $resource = $resource->get_instance_by_id($id); $d['param_f' . $i]['label'] = $resource->hostname; $d['param_f' . $i]['object']['type'] = 'htmlobject_input'; $d['param_f' . $i]['object']['attrib']['type'] = 'checkbox'; $d['param_f' . $i]['object']['attrib']['name'] = $this->identifier_name . '[' . $i . ']'; $d['param_f' . $i]['object']['attrib']['value'] = $id; $d['param_f' . $i]['object']['attrib']['checked'] = true; $i++; } $d['force_remove']['label'] = $this->lang['msg_force_remove']; $d['force_remove']['object']['type'] = 'htmlobject_input'; $d['force_remove']['object']['attrib']['type'] = 'checkbox'; $d['force_remove']['object']['attrib']['name'] = 'force_remove'; $d['force_remove']['object']['attrib']['value'] = 1; $d['force_remove']['object']['attrib']['checked'] = false; $form->add($d); if (!$form->get_errors() && $response->submit()) { $errors = array(); $message = array(); foreach ($resources as $key => $id) { $resource = $resource->get_instance_by_id($id); if ($force_remove != 1) { // check that the state is poweroff or error if ($resource->state != 'error' && $resource->state != 'off' && $resource->state != 'unknown') { $message[] = sprintf($this->lang['msg_still_active'], $id); continue; } // check that resource is not still used by an appliance $resource_is_used_by_appliance = ""; $remove_error = 0; $appliance = new appliance(); $appliance_id_list = $appliance->get_all_ids(); foreach ($appliance_id_list as $appliance_list) { $appliance_id = $appliance_list['appliance_id']; $app_resource_remove_check = new appliance(); $app_resource_remove_check->get_instance_by_id($appliance_id); if ($app_resource_remove_check->resources == $id) { $resource_is_used_by_appliance .= $appliance_id . " "; $remove_error = 1; } } if ($remove_error == 1) { $message[] = sprintf($this->lang['msg_not_removing'], $id, $resource_is_used_by_appliance); continue; } // check that this is a physical resource, VMs are removed through their VM Manager if ($resource->vtype != 1) { $virtualization = new virtualization(); $virtualization->get_instance_by_id($resource->vtype); $virtualization_name = str_replace('-vm', '', $virtualization->type); $message[] = sprintf($this->lang['msg_not_removing_vm'], $id, $virtualization_name); continue; } } $resource->remove($id, $resource->mac); $form->remove($this->identifier_name . '[' . $key . ']'); $message[] = sprintf($this->lang['msg'], $id); } if (count($errors) === 0) { $response->msg = join('<br>', $message); } else { $msg = array_merge($errors, $message); $response->error = join('<br>', $msg); } } } else { $response->msg = ''; } return $response; }
function import() { $response = ''; $errors = array(); $message = array(); $event = new event(); $instance_command = $this->response->html->request()->get('instance_command'); if ($instance_command !== '') { switch ($instance_command) { case 'add': // instance_command=add // &instance_name='.$name.' // &instance_mac='.$mac.' // &instance_public_ip='.$public_ip.' // &instance_type='.$type.' // &instance_keypair='.$keypair.' // &instance_region='.$region.' // &instance_ami='.$ami; $now = $_SERVER['REQUEST_TIME']; $openqrm = new openqrm_server(); $instance_name = $this->response->html->request()->get('instance_name'); $instance_mac = $this->response->html->request()->get('instance_mac'); $instance_public_ip = $this->response->html->request()->get('instance_public_ip'); $instance_type = $this->response->html->request()->get('instance_type'); $instance_keypair = $this->response->html->request()->get('instance_keypair'); $instance_region = $this->response->html->request()->get('instance_region'); $instance_ami = $this->response->html->request()->get('instance_ami'); // create resource, image and appliance $event->log("import", $_SERVER['REQUEST_TIME'], 5, "hybrid-cloud-vm-import", "Importing " . $instance_name . " - " . $instance_mac . " - " . $instance_public_ip . " - " . $instance_type . " - " . $instance_keypair . " - " . $instance_region . " - " . $instance_ami . ".", "", "", 0, 0, 0); $import_resource = new resource(); $deployment = new deployment(); $deployment->get_instance_by_name('ami-deployment'); $virtualization = new virtualization(); $virtualization->get_instance_by_type("hybrid-cloud-vm-local"); // create resource $resid = (int) str_replace(".", "", str_pad(microtime(true), 15, "0")); // send command to the openQRM-server $openqrm->send_command('openqrm_server_add_resource ' . $resid . ' ' . $instance_mac . ' ' . $instance_public_ip); // add to openQRM database $resource_fields["resource_id"] = $resid; $resource_fields["resource_ip"] = $instance_public_ip; $resource_fields["resource_mac"] = $instance_mac; $resource_fields["resource_kernel"] = 'local'; $resource_fields["resource_kernelid"] = 0; $resource_fields["resource_localboot"] = 0; $resource_fields["resource_hostname"] = $this->hc->account_type . $resid; $resource_fields["resource_vtype"] = $virtualization->id; $resource_fields["resource_vhostid"] = 0; $import_resource->add($resource_fields); $import_resource->get_instance_by_mac($instance_mac); // update stats #if ($state == 'running') { $rfields["resource_state"] = 'idle'; #$rfields["resource_lastgood"]=$now; #} else { # $rfields["resource_state"]='off'; #} #$import_resource->update_info($import_resource->id, $rfields); // set account id in resource capabilities $import_resource->set_resource_capabilities("HCACL", $this->id); // auto create image object $storage = new storage(); $storage->get_instance_by_name('ami-image-storage'); $image = new image(); $image->get_instance_by_name($instance_ami); if (isset($image->id) && $image->id > 0) { $image_exists = true; } else { $image_fields = array(); $vm_image_id = (int) str_replace(".", "", str_pad(microtime(true), 15, "0")); $image_fields["image_id"] = $vm_image_id; $image_fields['image_name'] = $instance_ami; $image_fields['image_type'] = 'ami-deployment'; $image_fields['image_rootfstype'] = 'local'; $image_fields['image_isactive'] = 0; $image_fields['image_storageid'] = $storage->id; $image_fields['image_comment'] = "Image Object for AMI {$instance_ami}"; $image_fields['image_rootdevice'] = $instance_ami; $image->add($image_fields); # update image object $image->get_instance_by_id($vm_image_id); // update resource with image infos $rfields["resource_id"] = $resid; $rfields["resource_image"] = $image->name; $rfields["resource_imageid"] = $image->id; $import_resource->update_info($import_resource->id, $rfields); $import_resource->get_instance_by_mac($instance_mac); } // create the appliance $appliance = new appliance(); $appliance->get_instance_by_name($instance_name); if (isset($appliance->id) && $appliance->id > 0) { $appliance_exists = true; } else { $new_appliance_id = (int) str_replace(".", "", str_pad(microtime(true), 15, "0")); $afields['appliance_id'] = $new_appliance_id; $afields['appliance_name'] = $this->hc->account_type . $resid; $afields['appliance_resources'] = $resid; $afields['appliance_kernelid'] = '1'; $afields['appliance_imageid'] = $image->id; $afields["appliance_virtual"] = 0; $afields["appliance_virtualization"] = $virtualization->id; $afields['appliance_wizard'] = ''; $afields['appliance_comment'] = 'Cloud VM Appliance for Resource ' . $resid; $appliance->add($afields); // update state/start+stoptime $aufields['appliance_stoptime'] = $now; $aufields['appliance_starttime'] = ''; $aufields['appliance_state'] = 'stopped'; $appliance->update($new_appliance_id, $aufields); } $hc_authentication = ''; if ($this->hc->account_type == 'aws' || $this->hc->account_type == 'euca') { $hc_authentication .= ' -O ' . $this->hc->access_key; $hc_authentication .= ' -W ' . $this->hc->secret_key; $hc_authentication .= ' -ir ' . $this->response->html->request()->get('region'); $hc_authentication .= ' -iz ' . $instance_region; } if ($this->hc->account_type == 'lc-openstack') { $hc_authentication .= ' -u ' . $this->hc->username; $hc_authentication .= ' -p ' . $this->hc->password; $hc_authentication .= ' -q ' . $this->hc->host; $hc_authentication .= ' -x ' . $this->hc->port; $hc_authentication .= ' -g ' . $this->hc->tenant; $hc_authentication .= ' -e ' . $this->hc->endpoint; } $command = $this->openqrm->get('basedir') . '/plugins/hybrid-cloud/bin/openqrm-hybrid-cloud-vm create'; $command .= ' -i ' . $this->hc->id; $command .= ' -n ' . $this->hc->account_name; $command .= ' -t ' . $this->hc->account_type; $command .= $hc_authentication; $command .= ' -in ' . $this->hc->account_type . $resid; $command .= ' -im ' . $instance_mac; $command .= ' -a ' . $instance_ami; $command .= ' -it ' . $instance_type; $command .= ' -ik ' . $instance_keypair; if ($this->hc->account_type == 'aws') { $command .= ' -subnet ' . $this->response->html->request()->get('instance_subnet'); } else { # TODO $command .= ' -ig ' . $form->get_request('group'); } $command .= ' --openqrm-ui-user ' . $this->user->name; $command .= ' --openqrm-cmd-mode background'; $openqrm->send_command($command, NULL, true); $message[] = sprintf($this->lang['msg_imported'], $instance_name); break; } if (count($errors) === 0) { $response = join('<br>', $message); } else { $msg = array_merge($errors, $message); $response = join('<br>', $msg); } } else { $response = ''; } return $response; }
function server_list() { require_once $this->controller->openqrm->get('basedir') . '/web/base/class/appliance.class.php'; require_once $this->controller->openqrm->get('basedir') . '/web/base/class/virtualization.class.php'; $virtObj = new virtualization(); $list = $virtObj->get_list(); foreach ($list as $virtualization) { $virtualizationMap[$virtualization['value']] = $virtualization['label']; } $applianceObj = new appliance(); $list = $applianceObj->display_overview(0, 1000, 'appliance_id', ''); $applist = array(); $i = 0; foreach ($list as $appliance) { // check virtualization type exists if (isset($virtualizationMap[$appliance['appliance_virtualization']])) { $applist[$i]['appliance_virtualization'] = $virtualizationMap[$appliance['appliance_virtualization']]; $i++; } } echo json_encode($applist); exit(0); }
if (file_exists($cloud_product_hook)) { $cloud_hook_config = array(); $cloud_hook_config['cloud_admin_procect'] = $cloud_project->id; require_once $cloud_product_hook; openqrm_hybrid_cloud_cloud_product("add", $cloud_hook_config); } } } break; case 'uninstall': $drop_hybrid_cloud_table = "drop table hybrid_cloud_accounts"; $db = openqrm_get_db_connection(); $recordSet = $db->Execute($drop_hybrid_cloud_table); $db->Close(); // remove Cloud Host Server and Storage $virtualization = new virtualization(); $virtualization->get_instance_by_type("hybrid-cloud"); $appliance = new appliance(); $appliance->get_instance_by_virtualization_and_resource($virtualization->id, '0'); if (strlen($appliance->id)) { $appliance->remove($appliance->id); } $deployment = new deployment(); $deployment->get_instance_by_name('ami-deployment'); $storage = new storage(); $hc_id_list = $storage->get_ids_by_storage_type($deployment->id); $found_hc = false; $found_hc_id = -1; foreach ($hc_id_list as $list) { foreach ($list as $hc_id) { $storage->get_instance_by_id($hc_id);
function action() { $virtualization = new virtualization(); $virtualization_list = array(); $virtualization_list = $virtualization->get_list(); $virtualization_link_section = ""; // filter out the virtualization hosts foreach ($virtualization_list as $id => $virt) { $virtualization_id = $virt['value']; $available_virtualization = new virtualization(); $available_virtualization->get_instance_by_id($virtualization_id); if (strstr($available_virtualization->type, "-vm")) { $virtualization_plugin_name = $available_virtualization->get_plugin_name(); $virtualization_name = str_replace(" VM", "", $available_virtualization->name); $a = $this->response->html->a(); $a->href = $this->response->get_url($this->actions_name, 'load') . '&rplugin=' . $virtualization_plugin_name . '&rcontroller=' . $virtualization_plugin_name . "-vm"; $a->label = '<img title="' . sprintf($this->lang['create_vm'], $virtualization_plugin_name) . '" alt="' . sprintf($this->lang['create_vm'], $virtualization_plugin_name) . '" src="/openqrm/base/plugins/' . $virtualization_plugin_name . '/img/plugin.png" border=0>' . $virtualization_name . ' ' . $this->lang['vm']; #$new_vm_link = "/openqrm/base/index.php?plugin=".$virtualization_plugin_name."&controller=".$virtualization_plugin_name."-vm"; #$virtualization_link_section .= "<a href='".$new_vm_link."' style='text-decoration: none'><img title='".sprintf($this->lang['create_vm'], $virtualization_plugin_name)."' alt='".sprintf($this->lang['create_vm'], $virtualization_plugin_name)."' src='/openqrm/base/plugins/".$virtualization_plugin_name."/img/plugin.png' border=0> ".$virtualization_name." ".$this->lang['vm']."</a><br>"; $virtualization_link_section .= $a->get_string() . '<br>'; } } if (!strlen($virtualization_link_section)) { $virtualization_link_section = $this->lang['start_vm_plugin']; } // local-server plugin enabled and started if (file_exists($_SERVER["DOCUMENT_ROOT"] . "/openqrm/base/plugins/local-server/.running")) { $a = $this->response->html->a(); $a->href = $this->response->get_url($this->actions_name, 'load') . '&rplugin=local-server&rcontroller=local-server-about&local_server_about_action=usage'; $a->label = '<img title="' . $this->lang['integrate_local_server'] . '" alt="' . $this->lang['integrate_local_server'] . '" src="/openqrm/base/plugins/local-server/img/plugin.png" border="0">' . $this->lang['integrate_local_server']; $local_server_plugin_link = $a->get_string() . '<br>'; #$local_server_plugin_link = "<a href='/openqrm/base/index.php?plugin=local-server&controller=local-server-about&local_server_about_action=usage' style='text-decoration: none'><img title='".$this->lang['integrate_local_server']."' alt='".$this->lang['integrate_local_server']."' src='/openqrm/base/plugins/local-server/img/plugin.png' border=0> ".$this->lang['integrate_local_server']."</a>"; } else { $local_server_plugin_link = $this->lang['start_local_server']; } // manual add new resource $manual_new_resource_link = "<a href='/openqrm/base/index.php?base=resource&resource_action=new' style='text-decoration: none'><img title='" . $this->lang['manual_new_resource'] . "' alt='" . $this->lang['manual_new_resource'] . "' src='/openqrm/base/img/resource.png' border=0> " . $this->lang['manual_new_resource'] . "</a>"; $t = $this->response->html->template($this->tpldir . '/resource-add.tpl.php'); $t->add($virtualization_link_section, 'resource_virtual'); $t->add($local_server_plugin_link, 'resource_local'); $t->add($manual_new_resource_link, 'resource_new'); $t->add($this->lang['title'], 'label'); $t->add($this->lang['vm_type'], 'vm_type'); $t->add($this->lang['local'], 'local'); $t->add($this->lang['unmanaged'], 'unmanaged'); $t->add($this->openqrm->get('baseurl'), 'baseurl'); $t->add($this->lang['please_wait'], 'please_wait'); $t->add($this->lang['canceled'], 'canceled'); $t->add($this->prefix_tab, 'prefix_tab'); $t->group_elements(array('param_' => 'form')); return $t; }
function openqrm_kvm_resource_virtual_command($cmd, $resource_fields) { global $event; global $OPENQRM_SERVER_BASE_DIR; global $OPENQRM_SERVER_IP_ADDRESS; global $OPENQRM_EXEC_PORT; $resource_id = $resource_fields["resource_id"]; $resource = new resource(); $resource->get_instance_by_id($resource_id); $host_resource = new resource(); $host_resource->get_instance_by_id($resource->vhostid); $virtualization = new virtualization(); $virtualization->get_instance_by_id($resource->vtype); $openqrm_admin_user = new user("openqrm"); $openqrm_admin_user->set_user(); switch ($cmd) { case "reboot": $event->log("openqrm_kvm_resource_virtual_command", $_SERVER['REQUEST_TIME'], 5, "openqrm-kvm-resource-virtual-command-hook.php", "Handling {$cmd} command", "", "", 0, 0, 0); if ($virtualization->type == "kvm-vm-local") { $virtual_command = "{$OPENQRM_SERVER_BASE_DIR}/openqrm/plugins/kvm/bin/openqrm-kvm-vm restart_by_mac -m " . $resource->mac . " -u " . $openqrm_admin_user->name . " -p " . $openqrm_admin_user->password . " -d noop --openqrm-cmd-mode background"; $host_resource->send_command($host_resource->ip, $virtual_command); } if ($virtualization->type == "kvm-vm-net") { // simply add to cmd queue. do not use resource->send_command(ip, reboot) since this will re-trigger this hook $cmd_token = md5(uniqid(rand(), true)); $resource_command = $OPENQRM_SERVER_BASE_DIR . "/openqrm/sbin/openqrm-exec -i " . $resource->ip . " -t " . $cmd_token . " -c reboot"; shell_exec($resource_command); } if ($virtualization->type == "kvm") { $cmd_token = md5(uniqid(rand(), true)); $resource_command = $OPENQRM_SERVER_BASE_DIR . "/openqrm/sbin/openqrm-exec -i " . $resource->ip . " -t " . $cmd_token . " -c reboot"; shell_exec($resource_command); } $resource_reboot_fields = array(); $resource_reboot_fields["resource_state"] = "transition"; $resource_reboot_fields["resource_event"] = "reboot"; $resource->update_info($resource->id, $resource_reboot_fields); break; case "halt": $event->log("openqrm_kvm_resource_virtual_command", $_SERVER['REQUEST_TIME'], 5, "openqrm-kvm-resource-virtual-command-hook.php", "Handling {$cmd} command", "", "", 0, 0, 0); if ($virtualization->type == "kvm-vm-local") { $virtual_command = "{$OPENQRM_SERVER_BASE_DIR}/openqrm/plugins/kvm/bin/openqrm-kvm-vm stop_by_mac -m " . $resource->mac . " -u " . $openqrm_admin_user->name . " -p " . $openqrm_admin_user->password . " --openqrm-cmd-mode background"; $host_resource->send_command($host_resource->ip, $virtual_command); } if ($virtualization->type == "kvm-vm-net") { // simply add to cmd queue. do not use resource->send_command(ip, reboot) since this will re-trigger this hook $cmd_token = md5(uniqid(rand(), true)); $resource_command = $OPENQRM_SERVER_BASE_DIR . "/openqrm/sbin/openqrm-exec -i " . $resource->ip . " -t " . $cmd_token . " -c halt"; shell_exec($resource_command); } if ($virtualization->type == "kvm") { // simply add to cmd queue. do not use resource->send_command(ip, reboot) since this will re-trigger this hook $cmd_token = md5(uniqid(rand(), true)); $resource_command = $OPENQRM_SERVER_BASE_DIR . "/openqrm/sbin/openqrm-exec -i " . $resource->ip . " -t " . $cmd_token . " -c halt"; shell_exec($resource_command); } $resource_reboot_fields = array(); $resource_reboot_fields["resource_state"] = "off"; $resource_reboot_fields["resource_event"] = "reboot"; $resource->update_info($resource->id, $resource_reboot_fields); break; } }
function openqrm_hybrid_cloud_resource_virtual_command($cmd, $resource_fields) { global $event; global $OPENQRM_SERVER_BASE_DIR; global $OPENQRM_SERVER_IP_ADDRESS; global $OPENQRM_EXEC_PORT; $resource_id = $resource_fields["resource_id"]; $resource = new resource(); $resource->get_instance_by_id($resource_id); $virtualization = new virtualization(); $virtualization->get_instance_by_id($resource->vtype); switch ($virtualization->type) { case "hybrid-cloud": $event->log("openqrm_hybrid_cloud_resource_virtual_command", $_SERVER['REQUEST_TIME'], 5, "openqrm-hybrid-cloud-resource-virtual-command-hook.php", "Handling " . $cmd . " command of resource " . $resource->id, "", "", 0, 0, 0); // noop break; case "hybrid-cloud-vm-local": $event->log("openqrm_hybrid_cloud_resource_virtual_command", $_SERVER['REQUEST_TIME'], 5, "openqrm-hybrid-cloud-resource-virtual-command-hook.php", "Handling " . $cmd . " command of resource " . $resource->id, "", "", 0, 0, 0); $openqrm_server = new openqrm_server(); // get hybrid-cloud account $hybrid_cloud_acl_id = $resource->get_resource_capabilities("HCACL"); if ($hybrid_cloud_acl_id == '') { $event->log("openqrm_hybrid_cloud_resource_virtual_command", $_SERVER['REQUEST_TIME'], 2, "openqrm-hybrid-cloud-resource-virtual-command-hook.php", "Could not find Hybrid-Cloud Account for resource " . $resource->id, "", "", 0, 0, $appliance_id); return; } $hc = new hybrid_cloud(); $hc->get_instance_by_id($hybrid_cloud_acl_id); $hc_authentication = ''; if ($hc->account_type == 'aws' || $hc->account_type == 'euca') { $hc_authentication .= ' -O ' . $hc->access_key; $hc_authentication .= ' -W ' . $hc->secret_key; } if ($hc->account_type == 'lc-openstack') { $hc_authentication .= ' -u ' . $hc->username; $hc_authentication .= ' -p ' . $hc->password; $hc_authentication .= ' -q ' . $hc->host; $hc_authentication .= ' -x ' . $hc->port; $hc_authentication .= ' -g ' . $hc->tenant; $hc_authentication .= ' -e ' . $hc->endpoint; } switch ($cmd) { case "reboot": $command = $OPENQRM_SERVER_BASE_DIR . "/openqrm/plugins/hybrid-cloud/bin/openqrm-hybrid-cloud-vm restart "; $command .= ' -i ' . $hc->id; $command .= ' -n ' . $hc->account_name; $command .= ' -t ' . $hc->account_type; $command .= ' -in ' . $resource->hostname; $command .= $hc_authentication; $command .= ' --openqrm-cmd-mode background'; $openqrm_server->send_command($command, NULL, true); break; case "halt": $command = $OPENQRM_SERVER_BASE_DIR . "/openqrm/plugins/hybrid-cloud/bin/openqrm-hybrid-cloud-vm stop "; $command .= ' -i ' . $hc->id; $command .= ' -n ' . $hc->account_name; $command .= ' -t ' . $hc->account_type; $command .= ' -in ' . $resource->hostname; $command .= $hc_authentication; $command .= ' --openqrm-cmd-mode background'; $openqrm_server->send_command($command, NULL, true); break; } break; } }
function get_response() { $response = $this->response; $form = $response->get_form($this->actions_name, 'step3'); $resource = new resource(); $resource->get_instance_by_id($this->appliance->resources); // if not openQRM resource if ($resource->id != 0) { $virtualization = new virtualization(); $virtualization->get_instance_by_id($resource->vtype); } $submit = $form->get_elements('submit'); $submit->handler = 'onclick="wait();"'; $form->add($submit, 'submit'); $submit = $form->get_elements('cancel'); $submit->handler = 'onclick="cancel();"'; $form->add($submit, 'cancel'); // prepare image list according to the resource capabilities + vtype $image = new image(); $list = $image->get_list(); unset($list[0]); unset($list[1]); $images = array(); // openQRM if ($resource->id == 0) { $images[] = array(0, 'Local openQRM Installation'); // local-server integrated resource } else { if (strstr($resource->capabilities, "TYPE=local-server")) { $local_image = new image(); $local_image->get_instance_by_id($resource->imageid); $images[] = array($local_image->id, 'Local OS Installation'); // local-deployment VMs } else { if (strstr($virtualization->type, "-vm-local")) { $virtualization_plugin_name = $virtualization->get_plugin_name(); $deployment = new deployment(); $deployment_id_arr = $deployment->get_deployment_ids(); $possible_deployment_types_arr = ''; foreach ($deployment_id_arr as $deployment_id_db) { $deployment_id = $deployment_id_db['deployment_id']; $deployment->get_instance_by_id($deployment_id); if ($deployment->storagetype === $virtualization_plugin_name) { $possible_deployment_types_arr[] = $deployment->type; } } // filter image list with only the images from the VM deployment type foreach ($list as $value) { $image_id = $value['value']; $image->get_instance_by_id($image_id); // is image active ? then do not show it here if ($image->isactive == 1) { continue; } if (!in_array($image->type, $possible_deployment_types_arr)) { continue; } // filter local-server images $images[] = array($image_id, $image->id . ' / ' . $image->name . ' (' . $image->type . ')'); } // network-deployment - show only network-boot images } else { if (strstr($virtualization->type, "-vm-net")) { foreach ($list as $value) { $image_id = $value['value']; $image->get_instance_by_id($image_id); // is image active ? then do not show it here if ($image->isactive == 1) { continue; } // filter local-server images if (strstr($image->capabilities, "TYPE=local-server")) { continue; } $is_network_deployment = false; if ($image->is_network_deployment() === true) { $is_network_deployment = true; } if ($is_network_deployment) { $images[] = array($image_id, $image->id . ' / ' . $image->name . ' (' . $image->type . ')'); } } // network deployment - physical systems - show only network-boot images } else { foreach ($list as $value) { $image_id = $value['value']; $image->get_instance_by_id($image_id); // is image active ? then do not show it here if ($image->isactive == 1) { continue; } // filter local-server images if (strstr($image->capabilities, "TYPE=local-server")) { continue; } $is_network_deployment = false; if ($image->is_network_deployment() === true) { $is_network_deployment = true; } if ($is_network_deployment) { $images[] = array($image_id, $image->id . ' / ' . $image->name . ' (' . $image->type . ')'); } } } } } } // handle appliance is new or edited $selected = $this->response->html->request()->get('image_id'); if ($selected === '' && isset($this->appliance->imageid)) { $selected = $this->appliance->imageid; } $d['image']['label'] = $this->lang['form_image']; $d['image']['required'] = true; $d['image']['object']['type'] = 'htmlobject_select'; $d['image']['object']['attrib']['index'] = array(0, 1); $d['image']['object']['attrib']['id'] = 'image'; $d['image']['object']['attrib']['name'] = 'image'; $d['image']['object']['attrib']['options'] = $images; $d['image']['object']['attrib']['selected'] = array($selected); $d['image_edit'] = ''; if ($this->appliance->resources != 0) { $d['image_edit']['label'] = $this->lang['form_image_edit']; $d['image_edit']['object']['type'] = 'htmlobject_input'; $d['image_edit']['object']['attrib']['type'] = 'checkbox'; $d['image_edit']['object']['attrib']['id'] = 'image_edit'; $d['image_edit']['object']['attrib']['name'] = 'image_edit'; $d['image_edit']['object']['attrib']['checked'] = true; } $form->add($d); $response->form = $form; return $response; }
function start() { $response = $this->get_response(); $appliances = $response->html->request()->get($this->identifier_name); $form = $response->form; $appliance = new appliance(); if ($appliances !== '') { // auto submit // $_REQUEST[$response->id]['submit'] = true; $submit = $form->get_elements('submit'); $submit->handler = 'onclick="wait();"'; $form->add($submit, 'submit'); $submit = $form->get_elements('cancel'); $submit->handler = 'onclick="cancel();"'; $form->add($submit, 'cancel'); $i = 0; foreach ($appliances as $id) { $appliance = $appliance->get_instance_by_id($id); $d['param_f' . $i]['label'] = $appliance->name; $d['param_f' . $i]['object']['type'] = 'htmlobject_input'; $d['param_f' . $i]['object']['attrib']['type'] = 'checkbox'; $d['param_f' . $i]['object']['attrib']['name'] = $this->identifier_name . '[' . $i . ']'; $d['param_f' . $i]['object']['attrib']['value'] = $id; $d['param_f' . $i]['object']['attrib']['checked'] = true; $i++; } $form->add($d); if (!$form->get_errors() && $response->submit()) { $errors = array(); $message = array(); foreach ($appliances as $key => $id) { $appliance = $appliance->get_instance_by_id($id); $resource = new resource(); if ($appliance->resources < 0) { // an appliance with resource auto-select enabled $appliance_virtualization = $appliance->virtualization; $appliance->find_resource($appliance_virtualization); $appliance->get_instance_by_id($id); if ($appliance->resources < 0) { $errors[] = sprintf($this->lang['msg_no_resource'], $id); continue; } } $resource->get_instance_by_id($appliance->resources); if ($appliance->resources == 0) { $errors[] = sprintf($this->lang['msg_always_active'], $id); continue; } if (!strcmp($appliance->state, "active")) { $errors[] = sprintf($this->lang['msg_already_active'], $id); continue; } // check that resource is idle $app_resource = new resource(); $app_resource->get_instance_by_id($appliance->resources); // resource has ip ? if (!strcmp($app_resource->ip, "0.0.0.0")) { $errors[] = sprintf($this->lang['msg_already_active'], $appliance->resources, $id); continue; } // resource assinged to imageid 1 ? if ($app_resource->imageid != 1) { $errors[] = sprintf($this->lang['msg_already_active'], $appliance->resources, $id); continue; } // resource active if (strcmp($app_resource->state, "active")) { $app_resource_virtualization = new virtualization(); $app_resource_virtualization->get_instance_by_id($app_resource->vtype); // allow waking up physical systems via out-of-band-management plugins if (!strstr($app_resource_virtualization->name, "Host")) { if ($app_resource_virtualization->id != 1) { $errors[] = sprintf($this->lang['msg_already_active'], $appliance->resources, $id); continue; } } } // if no errors then we start the appliance $kernel = new kernel(); $kernel->get_instance_by_id($appliance->kernelid); // send command to the openQRM-server $resource->send_command("127.0.0.1", "openqrm_assign_kernel " . $resource->id . " " . $resource->mac . " " . $kernel->name); $appliance->start(); $form->remove($this->identifier_name . '[' . $key . ']'); $message[] = sprintf($this->lang['msg'], $id); } if (count($errors) === 0) { $response->msg = join('<br>', $message); } else { $msg = array_merge($errors, $message); $response->error = join('<br>', $msg); } } } else { $response->msg = ''; } return $response; }
function select() { $d = array(); $h = array(); $h['resource_state']['title'] = $this->lang['table_state']; $h['resource_state']['sortable'] = false; $h['resource_id']['title'] = $this->lang['table_id']; $h['resource_id']['hidden'] = true; $h['resource_hostname']['title'] = $this->lang['table_name']; $h['resource_hostname']['hidden'] = true; $h['resource_mac']['title'] = $this->lang['table_mac']; $h['resource_mac']['hidden'] = true; $h['resource_ip']['title'] = $this->lang['table_ip']; $h['resource_ip']['hidden'] = true; $h['resource_type']['title'] = $this->lang['table_type']; $h['resource_type']['sortable'] = false; $h['resource_type']['hidden'] = true; $h['resource_memtotal']['title'] = $this->lang['table_memory']; $h['resource_memtotal']['hidden'] = true; $h['resource_cpunumber']['title'] = $this->lang['table_cpu']; $h['resource_cpunumber']['hidden'] = true; $h['resource_nics']['title'] = $this->lang['table_nics']; $h['resource_nics']['hidden'] = true; $h['resource_load']['title'] = $this->lang['table_load']; $h['resource_load']['hidden'] = true; $h['data']['title'] = ' '; $h['data']['sortable'] = false; $h['hw']['title'] = ' '; $h['hw']['sortable'] = false; $resource = new resource(); $params = $this->response->get_array($this->actions_name, 'select'); $b = array(); #$this->response->html->help($resource->find_resource('00:e0:53:13')); // unset unnecessary params unset($params['resource_type_filter']); unset($params['resource_filter']); unset($params['resource[sort]']); unset($params['resource[order]']); unset($params['resource[limit]']); unset($params['resource[offset]']); $table = $this->response->html->tablebuilder('resource', $params); $table->offset = 0; $table->sort = 'resource_id'; $table->limit = 20; $table->order = 'ASC'; $table->max = $resource->get_count('all'); $table->init(); // handle table params $tps = $table->get_params(); $tp = ''; foreach ($tps['resource'] as $k => $v) { $tp .= '&resource[' . $k . ']=' . $v; } $resource_filter = null; if ($this->response->html->request()->get('resource_filter') !== '') { $resource_filter = array(); $ar = $resource->find_resource($this->response->html->request()->get('resource_filter')); if (count($ar) > 0) { foreach ($ar as $k => $v) { $resource_filter[] = $v['resource_id']; } } } $resources = $resource->display_overview(0, 10000, $table->sort, $table->order); foreach ($resources as $index => $resource_db) { // prepare the values for the array $resource = new resource(); $resource->get_instance_by_id($resource_db["resource_id"]); $res_id = $resource->id; if ($this->response->html->request()->get('resource_type_filter') === '' || $this->response->html->request()->get('resource_type_filter') == $resource->vtype) { // Skip all resources not in $resource_filter if (isset($resource_filter)) { if (!in_array($resource->id, $resource_filter)) { continue; } } $mem_total = $resource_db['resource_memtotal']; $mem_used = $resource_db['resource_memused']; $mem = "{$mem_used}/{$mem_total}"; $swap_total = $resource_db['resource_swaptotal']; $swap_used = $resource_db['resource_swapused']; $swap = "{$swap_used}/{$swap_total}"; $resource_mac = $resource_db["resource_mac"]; // the resource_type $link = ''; if (strlen($resource->vtype) && !strstr($resource->vtype, "NULL")) { // find out what should be preselected $virtualization = new virtualization(); $virtualization->get_instance_by_id($resource->vtype); $virtualization_plugin_name = $virtualization->get_plugin_name(); $virtualization_vm_action_name = str_replace("-", "_", $virtualization_plugin_name); if ($virtualization->id == 1) { $resource_type = $virtualization->name; } else { $resource_type_link_text = $virtualization->name; if ($resource->id == $resource->vhostid) { // physical system or host $host_appliance = new appliance(); $host_appliance->get_instance_by_virtualization_and_resource($virtualization->id, $resource->id); if ($virtualization->id > 0 && $resource->id > 0) { $link = '?plugin=' . $virtualization_plugin_name . '&controller=' . $virtualization_plugin_name . '-vm&' . $virtualization_vm_action_name . '_vm_action=edit&appliance_id=' . $host_appliance->id; $resource_type_link_text = "<nobr>" . $virtualization->name . " Server " . $host_appliance->name . "</nobr>"; } } else { // vm $host_virtualization = new virtualization(); $host_virtualization->get_instance_by_type($virtualization_plugin_name); $host_appliance = new appliance(); if ($host_virtualization->id > 0) { $host_appliance->get_instance_by_virtualization_and_resource($host_virtualization->id, $resource->vhostid); $host_resource = new resource(); $host_resource->get_instance_by_id($resource->vhostid); $link = '?plugin=' . $virtualization_plugin_name . '&controller=' . $virtualization_plugin_name . '-vm&' . $virtualization_vm_action_name . '_vm_action=edit&appliance_id=' . $host_appliance->id; $resource_type_link_text = "<nobr>" . $virtualization->name . " on Res. " . $host_resource->hostname . "</nobr>"; } } $resource_type = $resource_type_link_text; } } else { $resource_type = "Unknown"; } // openQRM resource ? if ($resource->id == 0) { $resource_icon_default = "/openqrm/base/img/logo.png"; } else { $resource_icon_default = "/openqrm/base/img/resource.png"; } $state_icon = '<span class="pill ' . $resource->state . '">' . $resource->state . '</span>'; // idle ? if ("{$resource->imageid}" == "1" && "{$resource->state}" == "active") { $state_icon = '<span class="pill idle">idle</span>'; } $resource_cpus = $resource_db["resource_cpunumber"]; if (!strlen($resource_cpus)) { $resource_cpus = '?'; } $resource_nics = $resource_db["resource_nics"]; if (!strlen($resource_nics)) { $resource_nics = '?'; } isset($resource_db["resource_hostname"]) ? $name = $resource_db["resource_hostname"] : ($name = ' '); isset($resource_db["resource_nics"]) ? $nics = $resource_db["resource_nics"] : ($nics = ' '); isset($resource_db["resource_load"]) ? $load = $resource_db["resource_load"] : ($load = ' '); $data = '<b>' . $this->lang['table_id'] . '</b>: ' . $resource_db["resource_id"] . '<br>'; $data .= '<b>' . $this->lang['table_name'] . '</b>: ' . $name . '<br>'; $data .= '<b>' . $this->lang['table_mac'] . '</b>: ' . $resource_mac . '<br>'; $data .= '<b>' . $this->lang['table_ip'] . '</b>: ' . $resource_db["resource_ip"] . '<br>'; $data .= '<b>' . $this->lang['table_type'] . '</b>: ' . $resource_type; $hw = '<b>' . $this->lang['table_cpu'] . '</b>: ' . $resource_cpus . '<br>'; $hw .= '<b>' . $this->lang['table_memory'] . '</b>: ' . $mem . '<br>'; $hw .= '<b>' . $this->lang['table_nics'] . '</b>: ' . $nics . '<br>'; $hw .= '<b>' . $this->lang['table_load'] . '</b>: ' . $load; $b[] = array('resource_state' => $state_icon, 'resource_id' => $resource_db["resource_id"], 'resource_hostname' => $name, 'resource_mac' => $resource_mac, 'resource_ip' => $resource_db["resource_ip"], 'resource_type' => $resource_type, 'resource_memtotal' => $mem, 'resource_cpunumber' => $resource_cpus, 'resource_nics' => $nics, 'resource_load' => $load, 'data' => $data, 'hw' => $hw); } } // Type Filter $virtulization_types = new virtualization(); $list = $virtulization_types->get_list(); $filter = array(); $filter[] = array('', ''); foreach ($list as $l) { $filter[] = array($l['label'], $l['value']); } asort($filter); $select = $this->response->html->select(); $select->add($filter, array(1, 0)); $select->name = 'resource_type_filter'; $select->handler = 'onchange="wait();this.form.submit();return false;"'; $select->selected = array($this->response->html->request()->get('resource_type_filter')); $box1 = $this->response->html->box(); $box1->add($select); $box1->id = 'resource_type_filter'; $box1->css = 'htmlobject_box'; $box1->label = $this->lang['lang_type_filter']; // Resource Filter $input = $this->response->html->input(); $input->name = 'resource_filter'; $input->value = $this->response->html->request()->get('resource_filter'); $input->title = $this->lang['lang_filter_title']; $box2 = $this->response->html->box(); $box2->add($input); $box2->id = 'resource_filter'; $box2->css = 'htmlobject_box'; $box2->label = $this->lang['lang_filter']; $add = $this->response->html->a(); $add->title = $this->lang['action_add']; $add->label = $this->lang['action_add']; $add->handler = 'onclick="wait();"'; $add->css = 'add'; $add->href = $this->response->get_url($this->actions_name, "add") . '' . $tp; $table->id = 'Tabelle'; $table->css = 'htmlobject_table'; $table->border = 1; $table->cellspacing = 0; $table->cellpadding = 3; $table->autosort = false; $table->sort_link = false; $table->head = $h; $table->body = $b; $table->max = count($b); $table->actions_name = $this->actions_name; $table->actions = array(array('reboot' => $this->lang['action_reboot']), array('poweroff' => $this->lang['action_poweroff']), array('remove' => $this->lang['action_remove'])); $table->identifier = 'resource_id'; $table->identifier_name = $this->identifier_name; $table->identifier_disabled = array(0); $table->limit_select = array(array("value" => 10, "text" => 10), array("value" => 20, "text" => 20), array("value" => 30, "text" => 30), array("value" => 50, "text" => 50), array("value" => 100, "text" => 100)); $d['form'] = $this->response->get_form($this->actions_name, 'select', false)->get_elements(); $d['add'] = $add->get_string(); $d['resource_type_filter'] = $box1->get_string(); $d['resource_filter'] = $box2->get_string(); $d['table'] = $table; return $d; }
function add() { $response = $this->get_response(); $form = $response->form; $errors = array(); if (!$form->get_errors() && $this->response->submit()) { $image_id = $form->get_request('ami_image_id'); $image = new image(); if (isset($image_id) && $image_id !== '') { $image->get_instance_by_id($image_id); } else { $errors[] = $this->lang['error_boot']; } if (count($errors) > 0 || $form->get_errors()) { $response->error = join('<br>', $errors); } else { $tables = $this->openqrm->get('table'); $custom_script_parameter = ''; $custom_script = $form->get_request('custom_script'); if (strlen($custom_script)) { $custom_script_parameter = ' -ic ' . $custom_script; } $custom_name = $form->get_request('name'); $resource = new resource(); $id = (int) str_replace(".", "", str_pad(microtime(true), 15, "0")); if (strlen($custom_name)) { $name = $custom_name; } else { $name = $this->hc->account_type . $id; } $ip = "0.0.0.0"; $resource->generate_mac(); $mac = $resource->mac; // send command to the openQRM-server $openqrm = new openqrm_server(); $openqrm->send_command('openqrm_server_add_resource ' . $id . ' ' . $mac . ' ' . $ip); // set resource type $virtualization = new virtualization(); $virtualization->get_instance_by_type("hybrid-cloud-vm-local"); // add to openQRM database $fields["resource_id"] = $id; $fields["resource_ip"] = $ip; $fields["resource_mac"] = $mac; $fields["resource_hostname"] = $name; $fields["resource_localboot"] = 0; $fields["resource_vtype"] = $virtualization->id; $fields["resource_vhostid"] = 0; $fields["resource_image"] = $image->name; $fields["resource_imageid"] = $image->id; $rfields["resource_kernel"] = 'default'; $rfields["resource_kernelid"] = 1; $resource->add($fields); $resource->get_instance_by_mac($mac); // set account id in resource capabilities $resource->set_resource_capabilities("HCACL", $this->hc->id); $hc_authentication = ''; if ($this->hc->account_type == 'aws' || $this->hc->account_type == 'euca') { $hc_authentication .= ' -O ' . $this->hc->access_key; $hc_authentication .= ' -W ' . $this->hc->secret_key; $hc_authentication .= ' -ir ' . $this->region; $hc_authentication .= ' -iz ' . $form->get_request('availability_zone'); } if ($this->hc->account_type == 'lc-openstack') { $hc_authentication .= ' -u ' . $this->hc->username; $hc_authentication .= ' -p ' . $this->hc->password; $hc_authentication .= ' -q ' . $this->hc->host; $hc_authentication .= ' -x ' . $this->hc->port; $hc_authentication .= ' -g ' . $this->hc->tenant; $hc_authentication .= ' -e ' . $this->hc->endpoint; } $command = $this->openqrm->get('basedir') . '/plugins/hybrid-cloud/bin/openqrm-hybrid-cloud-vm create'; $command .= ' -i ' . $this->hc->id; $command .= ' -n ' . $this->hc->account_name; $command .= ' -t ' . $this->hc->account_type; $command .= $hc_authentication; $command .= ' -in ' . $name; $command .= ' -im ' . $mac; $command .= ' -a ' . $image->name; $command .= ' -it ' . $form->get_request('type'); $command .= ' -ik ' . $form->get_request('keypair'); if ($this->hc->account_type == 'aws') { $command .= ' -subnet ' . $form->get_request('subnet'); } else { $command .= ' -ig ' . $form->get_request('group'); } $command .= ' --openqrm-ui-user ' . $this->user->name; $command .= ' --openqrm-cmd-mode background'; $command .= $custom_script_parameter; $openqrm->send_command($command, NULL, true); // check to have a ip from the dhcpd-resource hook while ($resource->ip == "0.0.0.0") { sleep(1); clearstatcache(); $resource->get_instance_by_mac($mac); } // save the mgmt ip in the resource network field $rufields["resource_network"] = $resource->ip; $resource->update_info($resource->id, $rufields); $response->resource_id = $id; $response->msg = sprintf($this->lang['msg_added'], $name); // auto create the appliance for this VM if we are not coming from the wizard if (isset($this->user->wizard_name) && $this->user->wizard_name === 'appliance' && $this->user->wizard_step == 2) { $now = 1; } else { $now = $_SERVER['REQUEST_TIME']; $appliance = new appliance(); $new_appliance_id = (int) str_replace(".", "", str_pad(microtime(true), 15, "0")); $afields['appliance_id'] = $new_appliance_id; $afields['appliance_name'] = $name; $afields['appliance_resources'] = $id; $afields['appliance_kernelid'] = '1'; $afields['appliance_imageid'] = $image->id; $afields["appliance_virtual"] = 0; $afields["appliance_virtualization"] = $virtualization->id; $afields['appliance_wizard'] = ''; $afields['appliance_comment'] = 'Cloud VM Server for Resource ' . $id; $appliance->add($afields); // update state/start+stoptime $aufields['appliance_stoptime'] = $now; $aufields['appliance_starttime'] = ''; $aufields['appliance_state'] = 'stopped'; $appliance->update($new_appliance_id, $aufields); // set image active $image_fields["image_id"] = $image->id; $image_fields['image_isactive'] = 1; $image->update($image->id, $image_fields); } } } return $response; }
function openqrm_cloud_monitor() { global $event; global $APPLIANCE_INFO_TABLE; global $IMAGE_INFO_TABLE; global $CLOUD_IMAGE_TABLE; global $CLOUD_APPLIANCE_TABLE; global $OPENQRM_SERVER_BASE_DIR; global $OPENQRM_SERVER_IP_ADDRESS; global $OPENQRM_EXEC_PORT; global $openqrm_server; global $BaseDir; global $RootDir; global $vm_create_timout; $vmware_mac_address_space = "00:50:56"; $cloud_monitor_lock = "{$OPENQRM_SERVER_BASE_DIR}/openqrm/web/action/cloud-conf/cloud-monitor.lock"; $cloud_monitor_timeout = "600"; $cloud_volume_clone_timeout = "4800"; // lock to prevent running multiple times in parallel if (file_exists($cloud_monitor_lock)) { // check from when it is, if it is too old we remove it and start $cloud_monitor_lock_date = file_get_contents($cloud_monitor_lock); $now = $_SERVER['REQUEST_TIME']; if ($now - $cloud_monitor_lock_date > $cloud_monitor_timeout) { $event->log("cloud", $_SERVER['REQUEST_TIME'], 2, "monitor-hook", "Timeout for the cloud-monitor-lock reached, creating new lock", "", "", 0, 0, 0); $cloud_lock_fp = fopen($cloud_monitor_lock, 'w'); fwrite($cloud_lock_fp, $now); fclose($cloud_lock_fp); } else { return 0; } } else { $now = $_SERVER['REQUEST_TIME']; $cloud_lock_fp = fopen($cloud_monitor_lock, 'w'); fwrite($cloud_lock_fp, $now); fclose($cloud_lock_fp); } // prepare performance parameter $cloud_performance_config = new cloudconfig(); $max_parallel_phase_one_actions = $cloud_performance_config->get_value(27); // 27 max-parallel-phase-one-actions $max_parallel_phase_two_actions = $cloud_performance_config->get_value(28); // 28 max-parallel-phase-two-actions $max_parallel_phase_three_actions = $cloud_performance_config->get_value(29); // 29 max-parallel-phase-three-actions $max_parallel_phase_four_actions = $cloud_performance_config->get_value(30); // 30 max-parallel-phase-four-actions $max_parallel_phase_five_actions = $cloud_performance_config->get_value(31); // 31 max-parallel-phase-five-actions $max_parallel_phase_six_actions = $cloud_performance_config->get_value(32); // 32 max-parallel-phase-six-actions $max_parallel_phase_seven_actions = $cloud_performance_config->get_value(33); // 33 max-parallel-phase-seven-actions $parallel_phase_one_actions = 0; $parallel_phase_two_actions = 0; $parallel_phase_three_actions = 0; $parallel_phase_four_actions = 0; $parallel_phase_five_actions = 0; $parallel_phase_six_actions = 0; $parallel_phase_seven_actions = 0; // appliance hostname $cloud_appliance_hostname_enabled = $cloud_performance_config->get_value(34); // 34 appliance-hostname // $event->log("cloud", $_SERVER['REQUEST_TIME'], 5, "monitor-hook", "Cloud Phase I - Image actions, VM-removal", "", "", 0, 0, 0); // #################### clone-on-deploy image resize / remove ################################ // here we check if we have any clone-on-deploy images to resize or to remove // get cloudimage ids $cil = new cloudimage(); $cloud_image_list = $cil->get_all_ids(); foreach ($cloud_image_list as $ci_list) { $phase_one_actions = 0; $ci_id = $ci_list['ci_id']; $ci = new cloudimage(); $ci->get_instance_by_id($ci_id); $ci_state = $ci->state; $ci_image_id = $ci->image_id; $ci_appliance_id = $ci->appliance_id; $ci_resource_id = $ci->resource_id; $ci_cr_id = $ci->cr_id; $ci_resource = new resource(); $ci_resource->get_instance_by_id($ci_resource_id); $ci_appliance = new appliance(); $ci_appliance->get_instance_by_id($ci->appliance_id); // not the openQRM server resource, accept 0 only for private image remove if ($ci_cr_id != 0) { if ($ci_resource_id == 0) { continue; } // not when the cr is in starting phase $ci_request = new cloudrequest(); $ci_request->get_instance_by_id($ci_cr_id); if ($ci_request->status == 8) { continue; } } // image still in use ? if ($ci_state == 1) { // its resource its active with the idle image ? sounds like pause if (!strcmp($ci_resource->state, "active") && $ci_resource->imageid == 1) { // ####################### remove auto createed vm ################# // check for auto-create vms, if yes remove the resource if it is virtual $app_stop_autovm_remove_conf = new cloudconfig(); $app_stop_auto_remove_vms = $app_stop_autovm_remove_conf->get_value(7); // 7 is auto_create_vms if (!strcmp($app_stop_auto_remove_vms, "true")) { // we only remove virtual machines if ($ci_resource->vtype != 1) { // check if we still wait for the image_authentication stop hook unset($ci_image_authentication); $ci_image_authentication = new image_authentication(); $ci_image_authentication->get_instance_by_image_id($ci_image_id); if (strlen($ci_image_authentication->id)) { // we still wait for the image_authentication hook to run continue; } // cloudvm->remove ..... $event->log("cloud", $_SERVER['REQUEST_TIME'], 5, "monitor-hook", "Auto-removing resource {$ci_resource_id}", "", "", 0, 0, 0); $auto_cloudvm = new cloudvm(); $auto_cloudvm->remove($ci_resource_id, $ci_resource->vtype, $ci_appliance->name, $ci_resource->mac); // update cloudimage with resource -1 $ar_ci_update = array('ci_resource_id' => "-1"); $ci->update($ci->id, $ar_ci_update); $phase_one_actions = 1; } } // ####################### end remove auto createed vm ############# } // the image is still in use continue; } // image not in use any more and resource active (idle) again ? if ($ci_resource_id > 0) { if (strcmp($ci_resource->state, "active")) { // not yet active again continue; } if ($ci_resource->imageid != 1) { // not yet idle continue; } } // get image definition $image = new image(); $image->get_instance_by_id($ci_image_id); $image_name = $image->name; $image_type = $image->type; $image_rootdevice = $image->rootdevice; $image_storageid = $image->storageid; $image_deployment_parameter = $image->deployment_parameter; // get image storage $storage = new storage(); $storage->get_instance_by_id($image_storageid); $storage_resource_id = $storage->resource_id; // get storage resource $resource = new resource(); $resource->get_instance_by_id($storage_resource_id); $resource_id = $resource->id; $resource_ip = $resource->ip; // resize ? if ($ci_state == 2) { // calculate the resize $resize_value = $ci->disk_rsize; $storage_clone_timeout = 60; $cloudstorage = new cloudstorage(); $cloudstorage->resize($ci_id, $resize_value, $storage_clone_timeout); // re-set the cloudimage state to active $ci->set_state($ci->id, "active"); $phase_one_actions = 1; } // private ? if ($ci_state == 3) { // calculate the private disk size $private_disk = $ci->disk_rsize; $private_image_name = $ci->clone_name; $storage_private_timeout = 60; // private storage method returns new rootdevice $cloudstorage = new cloudstorage(); $clone_image_fields["image_rootdevice"] = $cloudstorage->create_private($ci_id, $private_disk, $private_image_name, $storage_private_timeout); // here we logical create the image in openQRM, we have all data available // the private image relation will be created after this step in the private lc if (strlen($clone_image_fields["image_rootdevice"])) { $clone_image = new image(); $clone_image_fields["image_id"] = (int) str_replace(".", "", str_pad(microtime(true), 15, "0")); $clone_image_fields["image_name"] = $ci->clone_name; $clone_image_fields["image_version"] = "Private Cloud"; $clone_image_fields["image_type"] = $image->type; $clone_image_fields["image_rootfstype"] = $image->rootfstype; $clone_image_fields["image_storageid"] = $image->storageid; $clone_image_fields["image_deployment_parameter"] = $image->deployment_parameter; // !! we create the private image as non-shared // this will prevent cloning when it is requested $clone_image_fields["image_isshared"] = 0; $clone_image_fields["image_comment"] = $image->comment; $clone_image_fields["image_capabilities"] = $image->capabilities; $clone_image->add($clone_image_fields); $event->log("cloud", $_SERVER['REQUEST_TIME'], 5, "cloud-monitor", "Created new private Cloud image {$ci->clone_name}", "", "", 0, 0, 0); } // re-set the cloudimage state to active $ci->set_state($ci->id, "active"); $phase_one_actions = 1; } // remove ? if ($ci_state == 0) { $physical_remove = false; // only remove physically if the cr was set to shared $ci_cr = new cloudrequest(); $ci_cr->get_instance_by_id($ci->cr_id); if ($ci_cr->shared_req == 1) { $event->log("cloud", $_SERVER['REQUEST_TIME'], 5, "cloud-monitor", "Cloud request set to shared, removing Image " . $ci_image_id . ".", "", "", 0, 0, 0); $physical_remove = true; } // or if the remove request came from a user for a private image if ($ci_cr_id == 0) { $event->log("cloud", $_SERVER['REQUEST_TIME'], 5, "cloud-monitor", "Cloud user requested to remove Image " . $ci_image_id . ".", "", "", 0, 0, 0); $physical_remove = true; } else { // re-check if this is a private image with clone-on-deploy set to false if ($ci_cr->image_id > 0) { $ci_private_image = new cloudprivateimage(); if ($ci_private_image->exists_by_image_id($ci_cr->image_id)) { $ci_private_image->get_instance_by_image_id($ci_cr->image_id); if ($ci_private_image->clone_on_deploy == 0) { $event->log("cloud", $_SERVER['REQUEST_TIME'], 5, "cloud-monitor", "Image " . $ci_image_id . " is private and set to NOT clone-on-deploy. Not removing.", "", "", 0, 0, 0); $physical_remove = false; } } } } if ($physical_remove) { $event->log("cloud", $_SERVER['REQUEST_TIME'], 5, "cloud-monitor", "Removing Image {$ci_image_id} !", "", "", 0, 0, 0); $storage_remove_timeout = 60; $cloudstorage = new cloudstorage(); $cloudstorage->remove($ci_id, $storage_remove_timeout); // remove any image_authentication for the image // since we remove the image a image_authentication won't // find it anyway $image_authentication = new image_authentication(); $ia_id_ar = $image_authentication->get_all_ids(); foreach ($ia_id_ar as $ia_list) { $ia_auth_id = $ia_list['ia_id']; $ia_auth = new image_authentication(); $ia_auth->get_instance_by_id($ia_auth_id); if ($ia_auth->image_id == $ci_image_id) { // $event->log("cloud", $_SERVER['REQUEST_TIME'], 5, "cloud-monitor", "Removing image_authentication $ia_auth_id for cloud image $ci_image_id since we are on going to remove the image itself", "", "", 0, 0, $resource_id); $ia_auth->remove($ia_auth_id); } } // remove the image in openQRM $image->remove($ci_image_id); $phase_one_actions = 1; // we do not remove non-shared images but just its cloudimage } // ####################### remove auto createed vm ################# // check for auto-create vms, if yes remove the resource if it is virtual $cc_autovm_remove_conf = new cloudconfig(); $cc_auto_remove_vms = $cc_autovm_remove_conf->get_value(7); // 7 is auto_create_vms if (!strcmp($cc_auto_remove_vms, "true")) { // if it had a resource, it has none e.g. in case of cloudappliance pause if ($ci_resource_id > 0) { // check virtualization type $auto_resource = new resource(); $auto_resource->get_instance_by_id($ci_resource_id); $auto_vm_virtualization = $auto_resource->vtype; // we only remove virtual machines if ($auto_vm_virtualization != 1) { // gather name $auto_remove_appliance = new appliance(); $auto_remove_appliance->get_instance_by_id($ci_appliance_id); // cloudvm->remove ..... $event->log("cloud", $_SERVER['REQUEST_TIME'], 5, "monitor-hook", "Auto-removing resource {$ci_resource_id}", "", "", 0, 0, 0); $auto_cloudvm = new cloudvm(); $auto_cloudvm->remove($ci_resource_id, $auto_vm_virtualization, $auto_remove_appliance->name, $auto_resource->mac); } } } // ####################### end remove auto createed vm ############# // remove the appliance if ($ci_appliance_id > 0) { $rapp = new appliance(); $rapp->remove($ci_appliance_id); } // remove the image in the cloud $ci->remove($ci_id); $phase_one_actions = 1; // $event->log("cloud", $_SERVER['REQUEST_TIME'], 5, "cloud-monitor", "Removing the cloned image $ci_image_id and the appliance $ci_appliance_id !", "", "", 0, 0, 0); } // check if we continue or go on if ($phase_one_actions == 1) { $parallel_phase_one_actions++; if ($max_parallel_phase_one_actions > 0 && $parallel_phase_one_actions >= $max_parallel_phase_one_actions) { break; } } // end remove } // end cloudimage loop // $event->log("cloud", $_SERVER['REQUEST_TIME'], 5, "monitor-hook", "Cloud Phase II - Main provisioning loop", "", "", 0, 0, 0); // #################### main cloud request loop ################################ $crl = new cloudrequest(); $cr_list = $crl->get_all_new_and_approved_ids(); foreach ($cr_list as $list) { $cr_id = $list['cr_id']; $cr = new cloudrequest(); $cr->get_instance_by_id($cr_id); $cr_status = $cr->status; // source image // Set Source Image ID $SOURCE_IMAGE_ID = $cr->image_id; $cu = new clouduser(); $cr_cu_id = $cr->cu_id; $cu->get_instance_by_id($cr_cu_id); $cu_name = $cu->name; // #################### auto-provisioning ################################ // here we only care about the requests status new and set them to approved (2) if ($cr_status == 1) { // $event->log("cloud", $_SERVER['REQUEST_TIME'], 5, "cloud-monitor", "Found new request ID $cr_id. Checking if Auto-provisioning is enabled", "", "", 0, 0, 0); $cc_conf = new cloudconfig(); $cc_auto_provision = $cc_conf->get_value(2); // 2 is auto_provision if (!strcmp($cc_auto_provision, "true")) { // $event->log("cloud", $_SERVER['REQUEST_TIME'], 5, "cloud-monitor", "Found new request ID $cr_id. Auto-provisioning is enabled! Approving the request", "", "", 0, 0, 0); $cr->setstatus($cr_id, "approve"); $cr_status = 2; } } // care about the next approved cr in the list if ($cr_status != 2) { continue; } // check for start time $now = $_SERVER['REQUEST_TIME']; $cr_start = $cr->start; if ($cr_start > $now) { continue; } // #################### provisioning ################################ // provision, only care about approved requests $event->log("cloud", $_SERVER['REQUEST_TIME'], 5, "cloud-monitor", "Provisioning request ID {$cr_id}", "", "", 0, 0, 0); // ################################## quantity loop provisioning ############################### // from 4.9 on we do not support more than one appliance per request. // $resource_quantity = $cr->resource_quantity; $resource_quantity = 1; // check for max_apps_per_user $cloud_user_apps_arr = array(); $cloud_user_app = new cloudappliance(); $cloud_user_apps_arr = $cloud_user_app->get_all_ids(); $users_appliance_count = 0; foreach ($cloud_user_apps_arr as $capp) { $tmp_cloud_app = new cloudappliance(); $tmp_cloud_app_id = $capp['ca_id']; $tmp_cloud_app->get_instance_by_id($tmp_cloud_app_id); // active ? if ($tmp_cloud_app->state == 0) { continue; } // check if the cr is ours $rc_tmp_cr = new cloudrequest(); $rc_tmp_cr->get_instance_by_id($tmp_cloud_app->cr_id); if ($rc_tmp_cr->cu_id != $cr_cu_id) { continue; } $users_appliance_count++; } // $event->log("cloud", $_SERVER['REQUEST_TIME'], 5, "cloud-monitor", "User $cr_cu_id has already $users_appliance_count appliance(s) running.", "", "", 0, 0, 0); $cc_max_app = new cloudconfig(); $max_apps_per_user = $cc_max_app->get_value(13); // 13 is max_apps_per_user if ($users_appliance_count + $resource_quantity > $max_apps_per_user) { $event->log("cloud", $_SERVER['REQUEST_TIME'], 2, "cloud-monitor", "Not provisining CR {$cr_id} from user {$cr_cu_id} who has already {$users_appliance_count} appliance(s) running.", "", "", 0, 0, 0); $cr->setstatus($cr_id, 'deny'); continue; } $cr_resource_number = 1; // ################################## create appliance ############################### // set hostname $appliance_name = "cloud-" . $cr_id . "-" . $cr_resource_number . "-x"; if (!strcmp($cloud_appliance_hostname_enabled, "true")) { if (strlen($cr->appliance_hostname)) { $appliance_requested_hostname = $cr->appliance_hostname; // check if the hostname is free, if not return to regular naming convention $appliance_chk_hostname = new appliance(); $appliance_chk_hostname->get_instance_by_name($appliance_requested_hostname); if ($appliance_chk_hostname->id > 0) { $event->log("cloud", $_SERVER['REQUEST_TIME'], 2, "cloud-monitor", "Requested hostname " . $appliance_requested_hostname . " already in use. Reverting to " . $appliance_name . " (CR ID " . $cr_id . ").", "", "", 0, 0, 0); } else { // set requested hostname $appliance_name = $appliance_requested_hostname; } } } // update cr with new hostname $cr_update_hostname_fields = array(); $cr_update_hostname_fields["cr_appliance_hostname"] = $appliance_name; $cr->update($cr->id, $cr_update_hostname_fields); $cr->get_instance_by_id($cr->id); // get new appliance id $appliance_id = (int) str_replace(".", "", str_pad(microtime(true), 15, "0")); // we $user_network_cards = $cr->network_req + 1; // prepare array to add appliance $ar_request = array('appliance_id' => $appliance_id, 'appliance_resources' => "-1", 'appliance_name' => $appliance_name, 'appliance_kernelid' => $cr->kernel_id, 'appliance_imageid' => $cr->image_id, 'appliance_virtualization' => $cr->resource_type_req, 'appliance_cpunumber' => $cr->cpu_req, 'appliance_memtotal' => $cr->ram_req, 'appliance_nics' => $user_network_cards, 'appliance_comment' => "Requested by user {$cu_name}", 'appliance_ssi' => $cr->shared_req, 'appliance_highavailable' => $cr->ha_req, 'appliance_capabilities' => $cr->appliance_capabilities); // create + start the appliance :) $appliance = new appliance(); $appliance->add($ar_request); // first get admin email $cc_acr_conf = new cloudconfig(); $cc_acr_admin_email = $cc_acr_conf->get_value(1); // 1 is admin_email // and the user details $cu_name = $cu->name; $cu_forename = $cu->forename; $cu_lastname = $cu->lastname; $cu_email = $cu->email; // now lets find a resource for this new appliance $appliance->get_instance_by_id($appliance_id); $appliance_virtualization = $cr->resource_type_req; // $event->log("cloud", $_SERVER['REQUEST_TIME'], 5, "monitor-hook", "#### Cloud Phase II-1 - Getting a resource", "", "", 0, 0, 0); // ################################## phys. res. ############################### if ($appliance_virtualization == 1) { $cloud_app_physical_resource = new cloudappliance(); if (!$cloud_app_physical_resource->find_existing_resource($appliance, $appliance_virtualization, $cu->id)) { $event->log("cloud", $_SERVER['REQUEST_TIME'], 2, "cloud-monitor", "Could not find a resource (type physical system) for request ID {$cr_id}!", "", "", 0, 0, 0); $appliance->remove($appliance_id); $cr->setstatus($cr_id, 'no-res'); // send mail to user $rmail = new cloudmailer(); $rmail->to = "{$cu_email}"; $rmail->from = "{$cc_acr_admin_email}"; $rmail->subject = "openQRM Cloud: Not enough resources to provision a system for request " . $cr_id; $rmail->template = $OPENQRM_SERVER_BASE_DIR . "/openqrm/plugins/cloud/etc/mail/not_enough_resources.mail.tmpl"; $arr = array('@@ID@@' => "{$cr_id}", '@@FORENAME@@' => "{$cu_forename}", '@@LASTNAME@@' => "{$cu_lastname}", '@@RESNUMBER@@' => "{$cr_resource_number}", '@@YOUR@@' => "your", '@@CLOUDADMIN@@' => $cc_acr_admin_email); $rmail->var_array = $arr; $rmail->send(); // send mail to admin $rmail_admin = new cloudmailer(); $rmail_admin->to = "{$cc_acr_admin_email}"; $rmail_admin->from = "{$cc_acr_admin_email}"; $rmail_admin->subject = "openQRM Cloud: Not enough resources to provision a system for request " . $cr_id; $rmail_admin->template = $OPENQRM_SERVER_BASE_DIR . "/openqrm/plugins/cloud/etc/mail/not_enough_resources.mail.tmpl"; $arr = array('@@ID@@' => "{$cr_id}", '@@FORENAME@@' => "Cloudadmin", '@@LASTNAME@@' => "", '@@RESNUMBER@@' => "{$cr_resource_number}", '@@YOUR@@' => "the", '@@CLOUDADMIN@@' => $cc_acr_admin_email); $rmail_admin->var_array = $arr; $rmail_admin->send(); continue; } // we have a phys. resource, update object $appliance->get_instance_by_id($appliance_id); } else { // ################################## auto create vm ############################### // check if we should try to create one // request type vm $cc_autovm_conf = new cloudconfig(); $cc_auto_create_vms = $cc_autovm_conf->get_value(7); // 7 is auto_create_vms if (!strcmp($cc_auto_create_vms, "true")) { // check if createvmlc exists for this cr + res-quantity unset($cvmlc); $cvmlc = new cloudcreatevmlc(); $cvmlc->get_instance_by_cr_details($cr_id, $cr_resource_number); if (!strlen($cvmlc->request_time)) { // if no createvmlc exists so far create it and the vm // generate a mac address $mac_res = new resource(); // check if we need to generate the first nics mac address in the vmware address space $new_vm_mac = ""; $vm_virt = new virtualization(); $vm_virt->get_instance_by_id($cr->resource_type_req); $virt_name = $vm_virt->get_plugin_name(); switch ($virt_name) { case 'vmware-esx': case 'vmware-server': case 'vmware-server2': $mac_res->generate_mac(); $suggested_mac = $mac_res->mac; $new_forth_byte_first_bit = rand(1, 3); $new_vm_mac = strtolower($vmware_mac_address_space . ":" . substr($suggested_mac, 9)); $new_vm_mac = substr_replace($new_vm_mac, $new_forth_byte_first_bit, 9, 1); break; default: $mac_res->generate_mac(); $new_vm_mac = $mac_res->mac; break; } // additional_nics $new_additional_nics = $cr->network_req; // cpu $new_vm_cpu = $cr->cpu_req; // memory $new_vm_memory = 256; if ($cr->ram_req != 0) { $new_vm_memory = $cr->ram_req; } // disk size $new_vm_disk = 5000; if ($cr->disk_req != 0) { $new_vm_disk = $cr->disk_req; } // here we generate the password for the Image and optional vnc of the VM resource $image = new image(); $vm_vnc_password = trim($image->generatePassword(12)); // put the password in the cr for the image later $cr_update_fields = array(); $cr_update_fields['cr_image_password'] = $vm_vnc_password; $cr->update($cr_id, $cr_update_fields); // Create VM // here we start the new vm ! $cloudvm = new cloudvm(); // this method returns the resource-id $cloudvm->create($cr_cu_id, $appliance_virtualization, $appliance_name, $new_vm_mac, $new_additional_nics, $new_vm_cpu, $new_vm_memory, $new_vm_disk, $vm_create_timout, $vm_vnc_password, $SOURCE_IMAGE_ID); $new_vm_resource_id = $cloudvm->resource_id; // check if creating the new VM resource failed if ($new_vm_resource_id == 0) { $event->log("cloud", $_SERVER['REQUEST_TIME'], 2, "cloud-monitor", "Failed creating a new resource for request ID {$cr_id}!", "", "", 0, 0, 0); $cr->setstatus($cr_id, 'no-res'); // send mail to user $rmail = new cloudmailer(); $rmail->to = "{$cu_email}"; $rmail->from = "{$cc_acr_admin_email}"; $rmail->subject = "openQRM Cloud: Not enough resources to provision a system for request " . $cr_id; $rmail->template = $OPENQRM_SERVER_BASE_DIR . "/openqrm/plugins/cloud/etc/mail/not_enough_resources.mail.tmpl"; $arr = array('@@ID@@' => "{$cr_id}", '@@FORENAME@@' => "{$cu_forename}", '@@LASTNAME@@' => "{$cu_lastname}", '@@RESNUMBER@@' => "{$cr_resource_number}", '@@YOUR@@' => "your", '@@CLOUDADMIN@@' => $cc_acr_admin_email); $rmail->var_array = $arr; $rmail->send(); // send mail to admin $rmail_admin = new cloudmailer(); $rmail_admin->to = "{$cc_acr_admin_email}"; $rmail_admin->from = "{$cc_acr_admin_email}"; $rmail_admin->subject = "openQRM Cloud: Error creating new resource for request " . $cr_id; $rmail_admin->template = $OPENQRM_SERVER_BASE_DIR . "/openqrm/plugins/cloud/etc/mail/not_enough_resources.mail.tmpl"; $arr = array('@@ID@@' => "{$cr_id}", '@@FORENAME@@' => "Cloudadmin", '@@LASTNAME@@' => "", '@@RESNUMBER@@' => "{$cr_resource_number}", '@@YOUR@@' => "the", '@@CLOUDADMIN@@' => $cc_acr_admin_email); $rmail_admin->var_array = $arr; $rmail_admin->send(); // refresh object $appliance->get_instance_by_id($appliance_id); // remove app and cvmlc $appliance->remove($appliance_id); continue; } $event->log("cloud", $_SERVER['REQUEST_TIME'], 5, "cloud-monitor", "Created VM with resource_id {$new_vm_resource_id}", "", "", 0, 0, 0); // create cvmlc after we got a resource_id $vm_create_time = $_SERVER['REQUEST_TIME']; $cvmlc_resource_fields["vc_resource_id"] = $new_vm_resource_id; $cvmlc_resource_fields["vc_cr_id"] = $cr_id; $cvmlc_resource_fields["vc_cr_resource_number"] = $cr_resource_number; $cvmlc_resource_fields["vc_request_time"] = $vm_create_time; $cvmlc_resource_fields["vc_vm_create_timeout"] = $vm_create_timout; $cvmlc_resource_fields["vc_state"] = 0; // get the new resource id from the db $new_vc_id = (int) str_replace(".", "", str_pad(microtime(true), 15, "0")); $cvmlc_resource_fields["vc_id"] = $new_vc_id; $cvmlc->add($cvmlc_resource_fields); // here we go on to the next cr or resource_number, remove app before $appliance->remove($appliance_id); continue; } else { // we have a cvmlc, check its resource and set its state $cvm_resource = new resource(); $cvm_resource->get_instance_by_id($cvmlc->resource_id); // idle ? if ($cvm_resource->imageid == 1 && $cvm_resource->state == 'active' && strcmp($cvm_resource->ip, "0.0.0.0")) { // we have a new idle vm as resource :) update it in the appliance $new_vm_resource_id = $cvmlc->resource_id; $appliance_fields = array(); $appliance_fields['appliance_resources'] = $new_vm_resource_id; // update and refresh the appliance object $appliance->update($appliance->id, $appliance_fields); $appliance->get_instance_by_id($appliance_id); $event->log("cloud", $_SERVER['REQUEST_TIME'], 5, "cloud-monitor", "Created resource {$new_vm_resource_id} /cr {$cr_id} now idle, continue provisioning.", "", "", 0, 0, 0); // remove cvmlc $cvmlc->remove($cvmlc->id); } else { // check timeout $vm_check_time = $_SERVER['REQUEST_TIME']; $vm_c_timeout = $cvmlc->request_time + $cvmlc->vm_create_timeout; if ($vm_check_time > $vm_c_timeout) { $event->log("cloud", $_SERVER['REQUEST_TIME'], 2, "cloud-monitor", "Could not create a new resource for request ID {$cr_id}!", "", "", 0, 0, 0); $cr->setstatus($cr_id, 'no-res'); // send mail to user $rmail = new cloudmailer(); $rmail->to = "{$cu_email}"; $rmail->from = "{$cc_acr_admin_email}"; $rmail->subject = "openQRM Cloud: Not enough resources to provision a system for request " . $cr_id; $rmail->template = $OPENQRM_SERVER_BASE_DIR . "/openqrm/plugins/cloud/etc/mail/not_enough_resources.mail.tmpl"; $arr = array('@@ID@@' => "{$cr_id}", '@@FORENAME@@' => "{$cu_forename}", '@@LASTNAME@@' => "{$cu_lastname}", '@@RESNUMBER@@' => "{$cr_resource_number}", '@@YOUR@@' => "your", '@@CLOUDADMIN@@' => $cc_acr_admin_email); $rmail->var_array = $arr; $rmail->send(); // send mail to admin $rmail_admin = new cloudmailer(); $rmail_admin->to = "{$cc_acr_admin_email}"; $rmail_admin->from = "{$cc_acr_admin_email}"; $rmail_admin->subject = "openQRM Cloud: Not enough resources to provision a system from request " . $cr_id; $rmail_admin->template = $OPENQRM_SERVER_BASE_DIR . "/openqrm/plugins/cloud/etc/mail/not_enough_resources.mail.tmpl"; $arr = array('@@ID@@' => "{$cr_id}", '@@FORENAME@@' => "Cloudadmin", '@@LASTNAME@@' => "", '@@RESNUMBER@@' => "{$cr_resource_number}", '@@YOUR@@' => "the", '@@CLOUDADMIN@@' => $cc_acr_admin_email); $rmail_admin->var_array = $arr; $rmail_admin->send(); // refresh object $appliance->get_instance_by_id($appliance_id); // try removing the cloudvm $clean_cloudvm = new cloudvm(); $clean_cloudvm->remove($cvm_resource->id, $cvm_resource->vtype, $appliance->name, $cvm_resource->mac); // remove app and cvmlc $appliance->remove($appliance_id); $cvmlc->remove($cvmlc->id); continue; } // still waiting within the timeout // update state to 1 (starting) // $event->log("cloud", $_SERVER['REQUEST_TIME'], 5, "cloud-monitor", "Still waiting for cr $cr_id / res. ".$cvmlc->resource_id." to get idle", "", "", 0, 0, 0); $cvm_state_fields['vc_state'] = 1; $cvmlc->update($cvmlc->id, $cvm_state_fields); // remove app $appliance->remove($appliance_id); // continue with the next cr/res-nr continue; } } // ################################## no auto create vm ############################### } else { // not set to auto-create vms // try to find a fitting idle vm $cloud_app_vm_resource = new cloudappliance(); if (!$cloud_app_vm_resource->find_existing_resource($appliance, $appliance_virtualization, $cu->id)) { $event->log("cloud", $_SERVER['REQUEST_TIME'], 2, "cloud-monitor", "Not creating a new resource for request ID " . $cr_id . " since auto-create-vms is disabled.", "", "", 0, 0, 0); $appliance->remove($appliance_id); $cr->setstatus($cr_id, 'no-res'); // send mail to user $rmail = new cloudmailer(); $rmail->to = "{$cu_email}"; $rmail->from = "{$cc_acr_admin_email}"; $rmail->subject = "openQRM Cloud: Not enough resources to provision a system for request " . $cr_id; $rmail->template = $OPENQRM_SERVER_BASE_DIR . "/openqrm/plugins/cloud/etc/mail/not_enough_resources.mail.tmpl"; $arr = array('@@ID@@' => "{$cr_id}", '@@FORENAME@@' => "{$cu_forename}", '@@LASTNAME@@' => "{$cu_lastname}", '@@RESNUMBER@@' => "{$cr_resource_number}", '@@YOUR@@' => "your", '@@CLOUDADMIN@@' => $cc_acr_admin_email); $rmail->var_array = $arr; $rmail->send(); // send mail to admin $rmail_admin = new cloudmailer(); $rmail_admin->to = "{$cc_acr_admin_email}"; $rmail_admin->from = "{$cc_acr_admin_email}"; $rmail_admin->subject = "openQRM Cloud: Not enough resources to provision a system for request " . $cr_id; $rmail_admin->template = $OPENQRM_SERVER_BASE_DIR . "/openqrm/plugins/cloud/etc/mail/not_enough_resources.mail.tmpl"; $arr = array('@@ID@@' => "{$cr_id}", '@@FORENAME@@' => "Cloudadmin", '@@LASTNAME@@' => "", '@@RESNUMBER@@' => "{$cr_resource_number}", '@@YOUR@@' => "the", '@@CLOUDADMIN@@' => $cc_acr_admin_email); $rmail_admin->var_array = $arr; $rmail_admin->send(); continue; } $appliance->get_instance_by_id($appliance_id); $appliance->remove($appliance_id); } } // ################################## end auto create vm ############################### // $event->log("cloud", $_SERVER['REQUEST_TIME'], 5, "cloud-monitor", "Found resource ".$appliance->resources." (type $appliance_virtualization) for request ID $cr_id", "", "", 0, 0, 0); // $event->log("cloud", $_SERVER['REQUEST_TIME'], 5, "monitor-hook", "#### Cloud Phase II-2 - Got resource, Clone Image", "", "", 0, 0, 0); // ################################## clone on deploy ############################### // here we have a resource but // do we have to clone the image before deployment ? // get image definition $image = new image(); $image->get_instance_by_id($cr->image_id); $image_name = $image->name; $image_type = $image->type; $image_version = $image->version; $image_rootdevice = $image->rootdevice; $image_rootfstype = $image->rootfstype; $image_storageid = $image->storageid; $image_isshared = $image->isshared; $image_comment = $image->comment; $image_capabilities = $image->capabilities; $image_deployment_parameter = $image->deployment_parameter; // check if this is a private cloud image belonging to the user // if yes, check if clone_on_deploy is enabled $provision_private_image = new cloudprivateimage(); $provision_private_image->get_instance_by_image_id($image->id); if ($provision_private_image->cu_id == $cr_cu_id) { $event->log("cloud", $_SERVER['REQUEST_TIME'], 5, "cloud-monitor", "Image " . $image_name . " belongs to cloud user " . $cr_cu_id . ".", "", "", 0, 0, 0); if ($provision_private_image->clone_on_deploy == 0) { $event->log("cloud", $_SERVER['REQUEST_TIME'], 5, "cloud-monitor", "Image " . $image_name . " is private and set to NOT clone-on-deploy.", "", "", 0, 0, 0); $cr->shared_req = 0; // update in the db $cr_update_fields = array(); $cr_update_fields["cr_shared_req"] = "0"; $cr->update($cr->id, $cr_update_fields); } else { $event->log("cloud", $_SERVER['REQUEST_TIME'], 5, "cloud-monitor", "Image " . $image_name . " is private and set to clone-on-deploy.", "", "", 0, 0, 0); } } // we clone ? if ($cr->shared_req == 1) { // $event->log("cloud", $_SERVER['REQUEST_TIME'], 5, "cloud-monitor", "Request ID $cr_id has clone-on-deploy activated. Cloning the image", "", "", 0, 0, 0); // assign new name $image_clone_name = $cr->image_id . ".cloud_" . $cr_id . "_" . $cr_resource_number . "_"; // get new image id $image_id = (int) str_replace(".", "", str_pad(microtime(true), 15, "0")); // add the new image to the openQRM db $ar_request = array('image_id' => $image_id, 'image_name' => $image_clone_name, 'image_version' => $image_version, 'image_type' => $image_type, 'image_rootdevice' => $image_rootdevice, 'image_rootfstype' => $image_rootfstype, 'image_storageid' => $image_storageid, 'image_isshared' => $image_isshared, 'image_comment' => "Requested by user {$cu_name}", 'image_capabilities' => $image_capabilities, 'image_deployment_parameter' => $image_deployment_parameter); $image->add($ar_request); $image->get_instance_by_id($image_id); // set the new image in the appliance ! // prepare array to update appliance $ar_appliance_update = array('appliance_imageid' => $image_id); $appliance->update($appliance_id, $ar_appliance_update); // refresh the appliance object $appliance->get_instance_by_id($appliance_id); // here we put the image + resource definition into an cloudimage // this cares e.g. later to remove the image after the resource gets idle again // -> the check for the resource-idle state happens at the beginning // of every cloud-monitor loop $ci_disk_size = 5000; if (strlen($cr->disk_req)) { $ci_disk_size = $cr->disk_req; } // get a new ci_id $cloud_image_id = (int) str_replace(".", "", str_pad(microtime(true), 15, "0")); $cloud_image_arr = array('ci_id' => $cloud_image_id, 'ci_cr_id' => $cr->id, 'ci_image_id' => $appliance->imageid, 'ci_appliance_id' => $appliance->id, 'ci_resource_id' => $appliance->resources, 'ci_disk_size' => $ci_disk_size, 'ci_state' => 1); $cloud_image = new cloudimage(); $cloud_image->add($cloud_image_arr); // get image storage $storage = new storage(); $storage->get_instance_by_id($image_storageid); $storage_resource_id = $storage->resource_id; // get storage resource $resource = new resource(); $resource->get_instance_by_id($storage_resource_id); $resource_id = $resource->id; $resource_ip = $resource->ip; $event->log("cloud", $_SERVER['REQUEST_TIME'], 5, "cloud-monitor", "Sending clone command to {$resource_ip} to create Image {$image_clone_name}", "", "", 0, 0, 0); $storage_clone_timeout = 60; $cloudstorage = new cloudstorage(); $cloudstorage->create_clone($cloud_image_id, $image_clone_name, $ci_disk_size, $storage_clone_timeout); // be sure to have the create command run before appliance start / storage auth hook sleep(5); } else { // non shared ! $event->log("cloud", $_SERVER['REQUEST_TIME'], 5, "cloud-monitor", "Not cloning Image " . $image_name . ".", "", "", 0, 0, 0); // we put it into an cloudimage too but it won't get removed $ci_disk_size = 5000; if (strlen($cr->disk_req)) { $ci_disk_size = $cr->disk_req; } // get a new ci_id $cloud_image_id = (int) str_replace(".", "", str_pad(microtime(true), 15, "0")); $cloud_image_arr = array('ci_id' => $cloud_image_id, 'ci_cr_id' => $cr->id, 'ci_image_id' => $appliance->imageid, 'ci_appliance_id' => $appliance->id, 'ci_resource_id' => $appliance->resources, 'ci_disk_size' => $ci_disk_size, 'ci_state' => 1); $cloud_image = new cloudimage(); $cloud_image->add($cloud_image_arr); } // $event->log("cloud", $_SERVER['REQUEST_TIME'], 5, "monitor-hook", "#### Cloud Phase II-3 - Appliance start", "", "", 0, 0, 0); // ################################## start appliance ############################### // assign the resource $kernel = new kernel(); $kernel->get_instance_by_id($appliance->kernelid); $resource = new resource(); $resource->get_instance_by_id($appliance->resources); // in case we do not have an external ip-config send the resource ip to the user $resource_external_ip = $resource->ip; // ################################## ip-mgmt assing ############################### // check ip-mgmt $cc_conf = new cloudconfig(); $show_ip_mgmt = $cc_conf->get_value(26); // ip-mgmt enabled ? if (!strcmp($show_ip_mgmt, "true")) { if (file_exists("{$RootDir}/plugins/ip-mgmt/.running")) { require_once "{$RootDir}/plugins/ip-mgmt/class/ip-mgmt.class.php"; $ip_mgmt_array = explode(",", $cr->ip_mgmt); $ip_mgmt_assign_loop = 1; foreach ($ip_mgmt_array as $ip_mgmt_config_str) { $collon_pos = strpos($ip_mgmt_config_str, ":"); $nic_id = substr($ip_mgmt_config_str, 0, $collon_pos); $ip_mgmt_id = substr($ip_mgmt_config_str, $collon_pos + 1); if (!strlen($ip_mgmt_id)) { continue; } $orginal_ip_mgmt_id = $ip_mgmt_id; $ip_mgmt_assign = new ip_mgmt(); $ip_mgmt_id_final = $ip_mgmt_id; // we need to check if the ip is still free $ip_mgmt_object_arr = $ip_mgmt_assign->get_instance('id', $ip_mgmt_id); $ip_app_id = $ip_mgmt_object_arr['ip_mgmt_appliance_id']; if ($ip_app_id > 0) { $event->log("cloud", $_SERVER['REQUEST_TIME'], 5, "cloud-monitor", "WARNING: ip-mgmt id " . $ip_mgmt_id . " is already in use. Trying to find the next free ip..", "", "", 0, 0, 0); $ip_mgmt_id = -2; } else { $event->log("cloud", $_SERVER['REQUEST_TIME'], 5, "cloud-monitor", "SUCCESS: ip-mgmt id " . $ip_mgmt_id . " is free.", "", "", 0, 0, 0); } // if ip_mgmt_id == auto (-2) search the next free ip for the user if ($ip_mgmt_id == -2) { $ip_mgmt_list_per_user = $ip_mgmt_assign->get_list_by_user($cu->cg_id); $next_free_ip_mgmt_id = 0; foreach ($ip_mgmt_list_per_user as $list) { $possible_next_ip_mgmt_id = $list['ip_mgmt_id']; $possible_next_ip_mgmt_object_arr = $ip_mgmt_assign->get_instance('id', $possible_next_ip_mgmt_id); if ($possible_next_ip_mgmt_object_arr['ip_mgmt_appliance_id'] == NULL) { // we have found the next free ip-mgmt id $next_free_ip_mgmt_id = $possible_next_ip_mgmt_id; $ip_mgmt_id_final = $possible_next_ip_mgmt_id; break; } } if ($next_free_ip_mgmt_id == 0) { $event->log("cloud", $_SERVER['REQUEST_TIME'], 5, "cloud-monitor", "WARNING: Could not find the next free ip-mgmt id for appliance " . $appliance_id . ".", "", "", 0, 0, 0); continue; } else { $event->log("cloud", $_SERVER['REQUEST_TIME'], 5, "cloud-monitor", "SUCCESS: Found the next free ip-mgmt id " . $next_free_ip_mgmt_id . " for appliance " . $appliance_id . ".", "", "", 0, 0, 0); $ip_mgmt_id = $next_free_ip_mgmt_id; // here we have to update the cr with the new ip-mgmt-id $new_cr_ip_mgmt_str = str_replace($nic_id . ":" . $orginal_ip_mgmt_id, $nic_id . ":" . $ip_mgmt_id, $cr->ip_mgmt); $new_cr_ip_mgmt_fields = array(); $new_cr_ip_mgmt_fields["cr_ip_mgmt"] = $new_cr_ip_mgmt_str; $cr->update($cr->id, $new_cr_ip_mgmt_fields); $cr->get_instance_by_id($cr->id); } } // here we have a valid ip-mgmt opbject to update $ip_mgmt_fields = array(); $ip_mgmt_fields["ip_mgmt_appliance_id"] = $appliance_id; $ip_mgmt_fields["ip_mgmt_nic_id"] = $nic_id; $ip_mgmt_assign->update_ip($ip_mgmt_id, $ip_mgmt_fields); // set resource_external_ip if ($ip_mgmt_assign_loop == 1) { $ip_mgmt_assign_arr = $ip_mgmt_assign->get_config_by_id($ip_mgmt_id_final); $resource_external_ip = $ip_mgmt_assign_arr[0]['ip_mgmt_address']; } $ip_mgmt_assign_loop++; } } } // ##################################################################################### // assign kernel $openqrm_server->send_command("openqrm_assign_kernel {$resource->id} {$resource->mac} {$kernel->name}"); //refresh the object before in case of clone-on-deploy $appliance->get_instance_by_id($appliance_id); // hybrid-cloud deployment needs image password + application classes set before appliance start // get the password to send to the user from the request $cr->get_instance_by_id($cr_id); $appliance_password = $cr->image_password; $image = new image(); $image->set_root_password($appliance->imageid, $appliance_password); $image->get_instance_by_id($appliance->imageid); $appliance_login_user = "******"; if ($image->version == 'Windows') { $appliance_login_user = "******"; } // add the user + image_password to the request $cr_update_fields = array(); $cr_update_fields['cr_image_password'] = $appliance_login_user . ":" . $appliance_password . ":" . $resource_external_ip; $cr->update($cr_id, $cr_update_fields); // ################################## apply application groups ############################### // check if application is enabled $application_conf = new cloudconfig(); $show_application_groups = $application_conf->get_value(11); // show_puppet_groups if (!strcmp($show_application_groups, "true")) { // check if we have a application config in the request $application_appliance = $appliance->name; if (strlen($cr->puppet_groups)) { $application_groups_str = $cr->puppet_groups; $application_appliance = $appliance->name; $application_debug = "Applying {$application_groups_str} to appliance {$application_appliance}"; $event->log("cloud", $_SERVER['REQUEST_TIME'], 5, "cloud-monitor", $application_debug, "", "", 0, 0, 0); $application_group_array = explode(",", $cr->puppet_groups); $cloudapplication = new cloudapplication(); $cloudapplication->set_applications($appliance->name, $application_group_array); } } // update appliance id in request $cr->get_instance_by_id($cr->id); $cr->setappliance("add", $appliance_id); // update request status to starting $cr->setstatus($cr_id, "starting"); // wait until the resource got the new kernel and application assigned sleep(2); // check if we continue or go on $parallel_phase_two_actions++; if ($max_parallel_phase_two_actions > 0 && $parallel_phase_two_actions >= $max_parallel_phase_two_actions) { break; } } // #################### appliance starting phase ################################ $parallel_phase_two_actions = 0; $crl = new cloudrequest(); $cr_list = $crl->get_all_starting_ids(); foreach ($cr_list as $list) { $cr_id = $list['cr_id']; $cr = new cloudrequest(); $cr->get_instance_by_id($cr_id); $cr_status = $cr->status; $cu = new clouduser(); $cr_cu_id = $cr->cu_id; $cu->get_instance_by_id($cr_cu_id); $cu_name = $cu->name; // update appliance id in request unset($appliance_id); $appliance_id = $cr->appliance_id; if (!strlen($appliance_id)) { continue; } $appliance = new appliance(); $appliance->get_instance_by_id($appliance_id); $image = new image(); $image->get_instance_by_id($appliance->imageid); // run authblocker from plugin hook if existing $deployment = new deployment(); $deployment->get_instance_by_type($image->type); $deployment_type = $deployment->type; $deployment_plugin_name = $deployment->storagetype; $storage_auth_hook = $RootDir . "/plugins/" . $deployment_plugin_name . "/openqrm-" . $deployment_type . "-auth-hook.php"; if (file_exists($storage_auth_hook)) { $event->log("cloud", $_SERVER['REQUEST_TIME'], 5, "cloud-monitor", "Found deployment type " . $deployment_type . " handling the start auth hook.", "", "", 0, 0, $appliance->resources); if ($appliance->ssi == 2) { $event->log("cloud", $_SERVER['REQUEST_TIME'], 5, "cloud-monitor", "Already created authblocker for image " . $image->name . " / app id " . $appliance->id . ".", "", "", 0, 0, $appliance->resources); } else { // create storage_auth_blocker if not existing already unset($authblocker); $authblocker = new authblocker(); $authblocker->get_instance_by_image_name($image->name); if (!strlen($authblocker->id)) { $event->log("cloud", $_SERVER['REQUEST_TIME'], 5, "cloud-monitor", "Creating new authblocker for image " . $image->name . " / app id " . $appliance->id . ".", "", "", 0, 0, $appliance->resources); $ab_start_time = $_SERVER['REQUEST_TIME']; $ab_create_fields['ab_image_id'] = $image->id; $ab_create_fields['ab_image_name'] = $image->name; $ab_create_fields['ab_start_time'] = $ab_start_time; $ab_create_fields['ab_id'] = (int) str_replace(".", "", str_pad(microtime(true), 15, "0")); $authblocker->add($ab_create_fields); // update appliance->ssi saving that the authblocker was created $ab_appliance_update = array('appliance_ssi' => 2); $appliance->update($appliance_id, $ab_appliance_update); $appliance->get_instance_by_id($appliance_id); // run the auth hook require_once "{$storage_auth_hook}"; storage_auth_function("start", $appliance->id); continue; } else { $ab_appliance_update = array('appliance_ssi' => 2); $appliance->update($appliance_id, $ab_appliance_update); $appliance->get_instance_by_id($appliance_id); $event->log("cloud", $_SERVER['REQUEST_TIME'], 5, "cloud-monitor", "Found existing authblocker for image " . $image->name . " / app id " . $appliance->id . ".", "", "", 0, 0, $appliance->resources); } } $storage_auth_blocker_created = true; } else { $event->log("cloud", $_SERVER['REQUEST_TIME'], 5, "cloud-monitor", "No storage-auth hook (" . $storage_auth_hook . ") available for deployment type " . $deployment_type . " for start auth hook.", "", "", 0, 0, $appliance->resources); $storage_auth_blocker_created = false; } // if authblocker was created if ($storage_auth_blocker_created) { if ($appliance->ssi == 2) { unset($check_authblocker); $check_authblocker = new authblocker(); $check_authblocker->get_instance_by_image_name($image->name); if (strlen($check_authblocker->id)) { // ab still existing, check timeout $ab_check_now = $_SERVER['REQUEST_TIME']; $ab_check_timeout = $check_authblocker->start_time + $cloud_volume_clone_timeout; if ($ab_check_now > $ab_check_timeout) { $event->log("cloud", $_SERVER['REQUEST_TIME'], 2, "cloud-monitor", "Failed starting server " . $appliance->id . ". Storage-authentication timed out!", "", "", 0, 0, $appliance->resources); // remove authblocker $check_authblocker->remove($check_authblocker->id); // set cr to dreprovision to automatically clean up the created objects $cr->setstatus($cr_id, 'deprovision'); // send mail to user and admin $ab_check_conf = new cloudconfig(); $ab_check_admin_email = $ab_check_conf->get_value(1); // 1 is admin_email $rmail = new cloudmailer(); $rmail->to = "{$cu->email}"; $rmail->from = "{$ab_check_admin_email}"; $rmail->subject = "openQRM Cloud: Not enough resources to provision storage for request " . $cr_id . ". Deprovisioning request " . $cr_id . "!"; $rmail->template = $OPENQRM_SERVER_BASE_DIR . "/openqrm/plugins/cloud/etc/mail/not_enough_resources.mail.tmpl"; $arr = array('@@ID@@' => "{$cr_id}", '@@FORENAME@@' => "{$cu->forename}", '@@LASTNAME@@' => "{$cu->lastname}", '@@YOUR@@' => "your", '@@CLOUDADMIN@@' => $ab_check_admin_email); $rmail->var_array = $arr; $rmail->send(); $rmail_admin = new cloudmailer(); $rmail_admin->to = "{$ab_check_admin_email}"; $rmail_admin->from = "{$ab_check_admin_email}"; $rmail_admin->subject = "openQRM Cloud: Not enough resources to provision storage for request " . $cr_id . ". Deprovisioning request " . $cr_id . "!"; $rmail_admin->template = $OPENQRM_SERVER_BASE_DIR . "/openqrm/plugins/cloud/etc/mail/not_enough_resources.mail.tmpl"; $arr = array('@@ID@@' => "{$cr_id}", '@@FORENAME@@' => "Cloudadmin", '@@LASTNAME@@' => "", '@@YOUR@@' => "the", '@@CLOUDADMIN@@' => $ab_check_admin_email); $rmail_admin->var_array = $arr; $rmail_admin->send(); continue; } else { // we are still waiting for the auth-blocker to be removed $still_wait = $ab_check_timeout - $ab_check_now; $event->log("cloud", $_SERVER['REQUEST_TIME'], 5, "cloud-monitor", "Still waiting " . $still_wait . " sec. for storage-auth for server " . $appliance->id . ".", "", "", 0, 0, $appliance->resources); continue; } } else { // here we got the remove-auth-blocker message from the storage-auth hook // now we can be sure that storage auth ran before rebooting the resource $event->log("cloud", $_SERVER['REQUEST_TIME'], 5, "cloud-monitor", "Storage authentication for image " . $image->name . " succeeded, assigning the resource now.", "", "", 0, 0, $appliance->resources); } } } // update request status to active $event->log("cloud", $_SERVER['REQUEST_TIME'], 5, "cloud-monitor", "Starting server " . $appliance_id . " for request ID " . $cr_id, "", "", 0, 0, 0); $cr->setstatus($cr_id, "active"); $ab_appliance_update = array('appliance_ssi' => $cr->shared_req); $appliance->update($appliance_id, $ab_appliance_update); $appliance->get_instance_by_id($appliance_id); // run appliance start with no auth hook $appliance->start(false); // here we insert the new appliance into the cloud-appliance table $cloud_appliance_id = (int) str_replace(".", "", str_pad(microtime(true), 15, "0")); $cloud_appliance_arr = array('ca_id' => $cloud_appliance_id, 'ca_cr_id' => $cr->id, 'ca_appliance_id' => $appliance_id, 'ca_cmd' => 0, 'ca_state' => 1); $cloud_appliance = new cloudappliance(); $cloud_appliance->add($cloud_appliance_arr); // ################################## mail user provisioning ############################### // get the user + image_password from the request $appliance_login_credentials = explode(':', $cr->image_password); $login_user = $appliance_login_credentials[0]; $login_password = $appliance_login_credentials[1]; $login_ip = $appliance_login_credentials[2]; // remove user + pass from request $cr_update_fields = array(); $cr_update_fields['cr_image_password'] = ''; $cr->update($cr_id, $cr_update_fields); // send mail to user // get admin email $cc_conf = new cloudconfig(); $cc_admin_email = $cc_conf->get_value(1); // 1 is admin_email $cc_allow_vnc = $cc_conf->get_value(42); // 1 is admin_email // get user + request + appliance details $cu_id = $cr->cu_id; $cu = new clouduser(); $cu->get_instance_by_id($cu_id); $cu_name = $cu->name; $cu_forename = $cu->forename; $cu_lastname = $cu->lastname; $cu_email = $cu->email; // start/stop time $cr_start = $cr->start; $start = date("d-m-Y H-i", $cr_start); $cr_stop = $cr->stop; $stop = date("d-m-Y H-i", $cr_stop); // check for allow_vnc $vnc_informations = ""; if (!strcmp($cc_allow_vnc, "true")) { $vnc_resource = new resource(); $vnc_resource->get_instance_by_id($appliance->resources); $vnc_informations_file = $OPENQRM_SERVER_BASE_DIR . "/openqrm/web/action/cloud-conf/" . $vnc_resource->mac . ".vnc"; if (file_exists($vnc_informations_file)) { $vnc_infos = file_get_contents($vnc_informations_file); $vnc_informations = "You can login to the System console via VNC at " . trim($vnc_infos); unlink($vnc_informations_file); } else { $vnc_informations = "You can login to the System console via VNC using the above password"; } } $arr = array('@@ID@@' => $cr_id, '@@FORENAME@@' => $cu_forename, '@@LASTNAME@@' => $cu_lastname, '@@START@@' => $start, '@@STOP@@' => $stop, '@@PASSWORD@@' => $login_password, '@@LOGINUSER@@' => $login_user, '@@IP@@' => $login_ip, '@@RESNUMBER@@' => '1', '@@HOSTNAME@@' => $appliance->name, '@@VNC@@' => $vnc_informations, '@@CLOUDADMIN@@' => $cc_admin_email); // send mail to the user $rmail = new cloudmailer(); $rmail->to = "{$cu_email}"; $rmail->from = "{$cc_admin_email}"; $rmail->subject = "openQRM Cloud: Your resource for request " . $cr_id . " is now active"; $rmail->template = $OPENQRM_SERVER_BASE_DIR . "/openqrm/plugins/cloud/etc/mail/active_cloud_request.mail.tmpl"; $rmail->var_array = $arr; $rmail->send(); // mail the ip + root password to the cloud admin $rmail_admin = new cloudmailer(); $rmail_admin->to = "{$cc_admin_email}"; $rmail_admin->from = "{$cc_admin_email}"; $rmail_admin->subject = "openQRM Cloud: The resource for request " . $cr_id . " is now active"; $rmail_admin->template = $OPENQRM_SERVER_BASE_DIR . "/openqrm/plugins/cloud/etc/mail/active_cloud_request_admin.mail.tmpl"; $rmail_admin->var_array = $arr; $rmail_admin->send(); // ################################## setup access to collectd graphs #################### // check if collectd is enabled $collectd_conf = new cloudconfig(); $show_collectd_graphs = $collectd_conf->get_value(19); // show_collectd_graphs if (!strcmp($show_collectd_graphs, "true")) { // is collectd enabled ? if (file_exists("{$RootDir}/plugins/collectd/.running")) { // ldap or regular user ? $collectd_appliance = $appliance->name; if (file_exists("{$RootDir}/plugins/ldap/.running")) { $collectd_debug = "Setting up access to the collectd graphs of appliance {$collectd_appliance} for ldap Cloud user {$cu_name}"; $event->log("cloud", $_SERVER['REQUEST_TIME'], 5, "cloud-monitor", $collectd_debug, "", "", 0, 0, 0); // get ldap from db config $ldap_conf = new ldapconfig(); $ldap_conf->get_instance_by_id(1); $ldap_host = $ldap_conf->value; $ldap_conf->get_instance_by_id(2); $ldap_port = $ldap_conf->value; $ldap_conf->get_instance_by_id(3); $ldap_base_dn = $ldap_conf->value; $ldap_conf->get_instance_by_id(4); $ldap_admin = $ldap_conf->value; $ldap_conf->get_instance_by_id(5); $ldap_password = $ldap_conf->value; // send command to the openQRM-server $setup_collectd = $OPENQRM_SERVER_BASE_DIR . "/openqrm/plugins/cloud/bin/openqrm-cloud-manager setup-graph-ldap " . $collectd_appliance . " " . $cu_name . " " . $ldap_host . " " . $ldap_port . " " . $ldap_base_dn . " " . $ldap_password; $openqrm_server->send_command($setup_collectd); } else { // regular basic auth user $collectd_debug = "Setting up access to the collectd graphs of appliance {$collectd_appliance} for Cloud user {$cu_name}"; $event->log("cloud", $_SERVER['REQUEST_TIME'], 5, "cloud-monitor", $collectd_debug, "", "", 0, 0, 0); // here we still have the valid user object, get the password $cu_pass = $cu->password; // send command to the openQRM-server $setup_collectd = $OPENQRM_SERVER_BASE_DIR . "/openqrm/plugins/cloud/bin/openqrm-cloud-manager setup-graph " . $collectd_appliance . " " . $cu_name . " " . $cu_pass; $openqrm_server->send_command($setup_collectd); } } } // ################################## provision finished #################### // $event->log("cloud", $_SERVER['REQUEST_TIME'], 5, "monitor-hook", "#### Cloud Phase II-4 - Provisioning $cr_resource_number finished", "", "", 0, 0, 0); // check if we continue or go on $parallel_phase_two_actions++; if ($max_parallel_phase_two_actions > 0 && $parallel_phase_two_actions >= $max_parallel_phase_two_actions) { break; } } // $event->log("cloud", $_SERVER['REQUEST_TIME'], 5, "monitor-hook", "Cloud Phase III - Billing loop", "", "", 0, 0, 0); // new active cr loop $cr_list = $crl->get_all_active_ids(); foreach ($cr_list as $list) { $phase_three_actions = 0; $cr_id = $list['cr_id']; $cr = new cloudrequest(); $cr->get_instance_by_id($cr_id); $cr_status = $cr->status; // #################### monitoring for billing ################################ // billing, only care about active requests $cb_config = new cloudconfig(); $cloud_billing_enabled = $cb_config->get_value(16); // 16 is cloud_billing_enabled $cloud_deprovision_warning = $cb_config->get_value(38); // 38 is deprovision_warning $cloud_deprovision_pause = $cb_config->get_value(39); // 38 is deprovision_pause if ($cloud_billing_enabled != 'true') { $event->log("cloud", $_SERVER['REQUEST_TIME'], 5, "cloud-monitor", "Cloud-billing is disabled. Not charging User {$cu->name} for request ID {$cr_id}", "", "", 0, 0, 0); } else { $one_hour = 3600; $one_day = 43200; // every 12 hours $now = $_SERVER['REQUEST_TIME']; $cu_id = $cr->cu_id; $cu = new clouduser(); $cu->get_instance_by_id($cu_id); $no_ccu_mail_conf = new cloudconfig(); $no_ccu_mail_admin_email = $no_ccu_mail_conf->get_value(1); // 1 is admin_email $cu_ccunits = $cu->ccunits; // be sure to get a value from the db if (!is_numeric($cu_ccunits)) { $event->log("cloud", $_SERVER['REQUEST_TIME'], 2, "cloud-monitor", "Got empty CCU value /" . $cu_ccunits . "/ for User " . $cu->name . "/" . $cu_id . " request ID " . $cr_id, "", "", 0, 0, 0); continue; } // in case the user has no ccunits any more we set the status to deprovision if ($cu_ccunits <= 0) { $event->log("cloud", $_SERVER['REQUEST_TIME'], 5, "cloud-monitor", "No CCUs left for User {$cu->name}, setting CR {$cr_id} to deprovisioning", "", "", 0, 0, 0); $cr->setstatus($cr_id, "deprovision"); // send mail to user $deprovision_no_ccu_mail = new cloudmailer(); $deprovision_no_ccu_mail->to = $cu->email; $deprovision_no_ccu_mail->from = $no_ccu_mail_admin_email; $deprovision_no_ccu_mail->subject = "openQRM Cloud: No CCUs left! Deprovisioning request " . $cr_id; $deprovision_no_ccu_mail->template = "{$OPENQRM_SERVER_BASE_DIR}/openqrm/plugins/cloud/etc/mail/deprovision_no_ccu.mail.tmpl"; $arr = array('@@ID@@' => "{$cr_id}", '@@FORENAME@@' => "{$cu->forename}", '@@LASTNAME@@' => "{$cu->lastname}", '@@CLOUDADMIN@@' => $no_ccu_mail_admin_email); $deprovision_no_ccu_mail->var_array = $arr; $deprovision_no_ccu_mail->send(); continue; } else { if ($cu_ccunits <= $cloud_deprovision_pause) { $pause_app_array = explode(",", $cr->appliance_id); if (is_array($pause_app_array)) { foreach ($pause_app_array as $pause_app_id) { $pause_app = new appliance(); $pause_app->get_instance_by_id($pause_app_id); if (!strcmp($pause_app->state, "active")) { // inform the user $deprovision_pause_mail = new cloudmailer(); $deprovision_pause_mail->to = $cu->email; $deprovision_pause_mail->from = $no_ccu_mail_admin_email; $deprovision_pause_mail->subject = "openQRM Cloud: Warning! Pausing the Appliance of Cloud request " . $cr_id; $deprovision_pause_mail->template = "{$OPENQRM_SERVER_BASE_DIR}/openqrm/plugins/cloud/etc/mail/deprovision_pause.mail.tmpl"; $arr = array('@@ID@@' => "{$cr_id}", '@@FORENAME@@' => "{$cu->forename}", '@@LASTNAME@@' => "{$cu->lastname}", '@@CCUS@@' => "{$cu_ccunits}", '@@CLOUDADMIN@@' => $no_ccu_mail_admin_email); $deprovision_pause_mail->var_array = $arr; $deprovision_pause_mail->send(); // pause appliance $pause_cloud_appliance = new cloudappliance(); $pause_cloud_appliance->get_instance_by_appliance_id($pause_app_id); if ($pause_cloud_appliance->cmd == 0) { if ($pause_cloud_appliance->state == 1) { $pause_cloud_appliance->set_cmd($pause_cloud_appliance->id, "stop"); $pause_cloud_appliance->set_state($pause_cloud_appliance->id, "paused"); } } } } } } else { if ($cu_ccunits <= $cloud_deprovision_warning) { // once per day per cr we send mail for deprovisioning warning $check_cr_now = false; $cloud_user_lock_per_day = dirname($cloud_monitor_lock) . '/' . $cu->name . '.' . $cr_id . '.per_day.lock'; if (!file_exists($cloud_user_lock_per_day)) { file_put_contents($cloud_user_lock_per_day, time()); $check_cr_now = true; } $lastwarning = file_get_contents($cloud_user_lock_per_day); $currenttimestamp = time(); if ($currenttimestamp - $lastwarning >= $one_day || $check_cr_now == 'true') { file_put_contents($cloud_user_lock_per_day, time()); $deprovision_warning_mail = new cloudmailer(); $deprovision_warning_mail->to = $cu->email; $deprovision_warning_mail->from = $no_ccu_mail_admin_email; $deprovision_warning_mail->subject = "openQRM Cloud: Warning! Your CCUs are running low for Cloud request " . $cr_id; $deprovision_warning_mail->template = "{$OPENQRM_SERVER_BASE_DIR}/openqrm/plugins/cloud/etc/mail/deprovision_warning.mail.tmpl"; $arr = array('@@ID@@' => "{$cr_id}", '@@FORENAME@@' => "{$cu->forename}", '@@LASTNAME@@' => "{$cu->lastname}", '@@CCUS@@' => "{$cu_ccunits}", '@@CLOUDADMIN@@' => $no_ccu_mail_admin_email); $deprovision_warning_mail->var_array = $arr; $deprovision_warning_mail->send(); } } } } // check if to charge $charge = false; $cr_lastbill = $cr->lastbill; if (!strlen($cr_lastbill)) { // we set the last-bill time to now and bill $cr->set_requests_lastbill($cr_id, $now); $charge = true; } else { // we check if we need to bill according the last-bill var $active_cr_time = $now - $cr_lastbill; if ($active_cr_time >= $one_hour) { // set lastbill to now $cr->set_requests_lastbill($cr_id, $now); $charge = true; } } if ($charge) { // here we calculate what to charge // cloudselector enabled ? $show_cloud_selector = $cb_config->get_value(22); // cloud_selector if (!strcmp($show_cloud_selector, "true")) { $ct = new cloudtransaction(); $cloudselector = new cloudselector(); // we need to loop through all appliances of this request // and only charge for active ones $cs_active_apps = 0; $new_cu_ccunits = $cu_ccunits; $cs_app_array = explode(",", $cr->appliance_id); if (is_array($cs_app_array)) { foreach ($cs_app_array as $cs_app_id) { $cs_app = new appliance(); $cs_app->get_instance_by_id($cs_app_id); if (!strcmp($cs_app->state, "active")) { // cpu $cpu_cost = $cloudselector->get_price($cr->cpu_req, "cpu"); $new_cu_ccunits = substract_until_zero($new_cu_ccunits, $cpu_cost); $ct->push($cr->id, $cr->cu_id, $cpu_cost, $new_cu_ccunits, "Cloud Billing", "{$cpu_cost} CCUs for {$cr->cpu_req} CPU(s) Appliance {$cs_app_id} (CR {$cr->id})"); // disk $disk_cost = $cloudselector->get_price($cr->disk_req, "disk"); $new_cu_ccunits = substract_until_zero($new_cu_ccunits, $disk_cost); $ct->push($cr->id, $cr->cu_id, $disk_cost, $new_cu_ccunits, "Cloud Billing", "{$disk_cost} CCUs for {$cr->disk_req} MB Disk Space Appliance {$cs_app_id} (CR {$cr->id})"); // ha if (strlen($cr->ha_req)) { $ha_cost = $cloudselector->get_price($cr->ha_req, "ha"); $new_cu_ccunits = substract_until_zero($new_cu_ccunits, $ha_cost); $ct->push($cr->id, $cr->cu_id, $ha_cost, $new_cu_ccunits, "Cloud Billing", "{$ha_cost} CCUs for High-Availability Appliance {$cs_app_id} (CR {$cr->id})"); } // kernel $kernel_cost = $cloudselector->get_price($cr->kernel_id, "kernel"); $new_cu_ccunits = substract_until_zero($new_cu_ccunits, $kernel_cost); $ct->push($cr->id, $cr->cu_id, $kernel_cost, $new_cu_ccunits, "Cloud Billing", "{$kernel_cost} CCUs for Kernel {$cr->kernel_id} Appliance {$cs_app_id} (CR {$cr->id})"); // memory $memory_cost = $cloudselector->get_price($cr->ram_req, "memory"); $new_cu_ccunits = substract_until_zero($new_cu_ccunits, $memory_cost); $ct->push($cr->id, $cr->cu_id, $memory_cost, $new_cu_ccunits, "Cloud Billing", "{$memory_cost} CCUs for {$cr->ram_req} MB Memory Appliance {$cs_app_id} (CR {$cr->id})"); // network $network_cost = $cloudselector->get_price($cr->network_req, "network"); $new_cu_ccunits = substract_until_zero($new_cu_ccunits, $network_cost); $ct->push($cr->id, $cr->cu_id, $network_cost, $new_cu_ccunits, "Cloud Billing", "{$network_cost} CCUs for {$cr->network_req} Network Card(s) Appliance {$cs_app_id} (CR {$cr->id})"); // application $application_groups_array = explode(",", $cr->puppet_groups); if (is_array($application_groups_array)) { foreach ($application_groups_array as $application_group) { if (strlen($application_group)) { $application_group_cost = $cloudselector->get_price($application_group, "application"); $new_cu_ccunits = substract_until_zero($new_cu_ccunits, $application_group_cost); $ct->push($cr->id, $cr->cu_id, $application_group_cost, $new_cu_ccunits, "Cloud Billing", "{$application_group_cost} CCUs for Application {$application_group} Appliance {$cs_app_id} (CR {$cr->id})"); } } } // resource type $cs_virtualization = new virtualization(); $cs_virtualization->get_instance_by_id($cr->resource_type_req); $resource_cost = $cloudselector->get_price($cr->resource_type_req, "resource"); $new_cu_ccunits = substract_until_zero($new_cu_ccunits, $resource_cost); $ct->push($cr->id, $cr->cu_id, $resource_cost, $new_cu_ccunits, "Cloud Billing", "{$resource_cost} CCUs for Type {$cs_virtualization->name} Appliance {$cs_app_id} (CR {$cr->id})"); $cs_active_apps++; } else { // we only charge for the diskspace used // disk $disk_cost = $cloudselector->get_price($cr->disk_req, "disk"); $new_cu_ccunits = substract_until_zero($new_cu_ccunits, $disk_cost); $ct->push($cr->id, $cr->cu_id, $disk_cost, $new_cu_ccunits, "Cloud Billing", "{$disk_cost} CCUs for {$cr->disk_req} MB Disk Space Appliance {$cs_app_id} (CR {$cr->id})"); } } } } else { // or custom billing $new_cu_ccunits = openqrm_custom_cloud_billing($cr_id, $cu_id, $cu_ccunits); } $cu->set_users_ccunits($cu_id, $new_cu_ccunits); $event->log("cloud", $_SERVER['REQUEST_TIME'], 5, "cloud-monitor", "Charging User {$cu->name} for request ID {$cr_id}", "", "", 0, 0, 0); $phase_three_actions = 1; } } // #################### check for deprovisioning ################################ // de-provision, check if it is time or if status deprovisioning $cr = new cloudrequest(); $cr->get_instance_by_id($cr_id); // check for stop time $now = $_SERVER['REQUEST_TIME']; $cr_stop = $cr->stop; if ($cr_stop < $now) { // set to deprovisioning $event->log("cloud", $_SERVER['REQUEST_TIME'], 5, "cloud-monitor", "CR {$cr_id} stop time reached, setting to deprovisioning", "", "", 0, 0, 0); $cr->setstatus($cr_id, "deprovision"); } // check if we continue or go on if ($phase_three_actions == 1) { $parallel_phase_three_actions++; if ($max_parallel_phase_three_actions > 0 && $parallel_phase_three_actions >= $max_parallel_phase_three_actions) { break; } } } // #################### deprovisioning ################################ // $event->log("cloud", $_SERVER['REQUEST_TIME'], 5, "monitor-hook", "Cloud Phase IV - Deprovisioning", "", "", 0, 0, 0); // new deprovision cr loop $cr_list = $crl->get_all_deprovisioned_ids(); foreach ($cr_list as $list) { $cr_id = $list['cr_id']; $cr = new cloudrequest(); $cr->get_instance_by_id($cr_id); $cu_id = $cr->cu_id; $cu = new clouduser(); $cu->get_instance_by_id($cu_id); $cr_has_appliance = 1; $cloud_user_lock_per_day = dirname($cloud_monitor_lock) . '/' . $cu->name . '.' . $cr_id . '.per_day.lock'; $event->log("cloud", $_SERVER['REQUEST_TIME'], 5, "cloud-monitor", "Deprovisioning of Cloud request ID {$cr_id}", "", "", 0, 0, 0); if (file_exists($cloud_user_lock_per_day)) { unlink($cloud_user_lock_per_day); } // get the requests appliance $cr_appliance_id = $cr->appliance_id; if (!strlen($cr_appliance_id)) { // $event->log("cloud", $_SERVER['REQUEST_TIME'], 5, "cloud-monitor", "Request $cr_id does not have an active appliance!", "", "", 0, 0, 0); $cr_has_appliance = 0; } if ($cr_appliance_id == 0) { // $event->log("cloud", $_SERVER['REQUEST_TIME'], 5, "cloud-monitor", "Request $cr_id does not have an active appliance!", "", "", 0, 0, 0); $cr_has_appliance = 0; } // in case a cr got deprovisioned with an active creaet-vm-lc but no cloud_appliance and/or cloud_image yet // this will remove the left over vm + resource if ($cr_has_appliance == 0) { // check if a vm was requested if ($cr->resource_type_req != 1) { // check if we have a create-vm-lc, if we have one auto-create-vm is true $deprovision_cr_resource = 1; $deprovision_cr_create_vm_lc = new cloudcreatevmlc(); $deprovision_cr_create_vm_lc->get_instance_by_cr_details($cr_id, $deprovision_cr_resource); if (strlen($deprovision_cr_create_vm_lc->id)) { if ($deprovision_cr_create_vm_lc->resource_id != 0) { // remove the vm $auto_deprovision_resource = new resource(); $auto_deprovision_resource->get_instance_by_id($deprovision_cr_create_vm_lc->resource_id); $auto_deprovision_resource_name = "cloud-" . $cr_id . "-" . $deprovision_cr_resource . "-x"; // cloudvm->remove ..... $event->log("cloud", $_SERVER['REQUEST_TIME'], 5, "monitor-hook", "Auto-removing resource {$deprovision_cr_create_vm_lc->resource_id} - {$cr->resource_type_req}, {$auto_deprovision_resource_name}, {$auto_deprovision_resource->mac}", "", "", 0, 0, 0); $auto_cloudvm = new cloudvm(); $auto_cloudvm->remove($deprovision_cr_create_vm_lc->resource_id, $cr->resource_type_req, $auto_deprovision_resource_name, $auto_deprovision_resource->mac); } // remove the create-vm-lx $deprovision_cr_create_vm_lc->remove($deprovision_cr_create_vm_lc->id); } } $cr->setstatus($cr_id, "done"); continue; } // ################################## de-provisioning ############################### // count the resource we deprovision for the request $deprovision_resource_number = 1; // $event->log("cloud", $_SERVER['REQUEST_TIME'], 5, "cloud-monitor", "Deprovisioning appliance $cr_appliance_id from request ID $cr_id", "", "", 0, 0, 0); // stop the appliance, first de-assign its resource $appliance = new appliance(); $appliance->get_instance_by_id($cr_appliance_id); // .. only if active and not stopped already by the user $cloud_appliance = new cloudappliance(); $cloud_appliance->get_instance_by_appliance_id($appliance->id); if ($cloud_appliance->state == 0) { $event->log("cloud", $_SERVER['REQUEST_TIME'], 5, "cloud-monitor", "Appliance {$cr_appliance_id} from request ID {$cr_id} stopped already", "", "", 0, 0, 0); } else { if ($appliance->resources != -1) { $resource = new resource(); $resource->get_instance_by_id($appliance->resources); $resource_external_ip = $resource->ip; $openqrm_server->send_command("openqrm_assign_kernel {$resource->id} {$resource->mac} default"); // let the kernel assign command finish sleep(2); // now stop // $event->log("cloud", $_SERVER['REQUEST_TIME'], 5, "cloud-monitor", "Stopping Appliance $cr_appliance_id from request ID $cr_id", "", "", 0, 0, 0); $appliance->stop(); } } // ################################## de-assign ip-mgmt ############################### // here we free up the ip addresses used by the appliance again // check ip-mgmt $cc_conf = new cloudconfig(); $show_ip_mgmt = $cc_conf->get_value(26); // ip-mgmt enabled ? if (!strcmp($show_ip_mgmt, "true")) { if (file_exists("{$RootDir}/plugins/ip-mgmt/.running")) { require_once "{$RootDir}/plugins/ip-mgmt/class/ip-mgmt.class.php"; $ip_mgmt_array = explode(",", $cr->ip_mgmt); foreach ($ip_mgmt_array as $ip_mgmt_config_str) { $collon_pos = strpos($ip_mgmt_config_str, ":"); $nic_id = substr($ip_mgmt_config_str, 0, $collon_pos); $ip_mgmt_id = substr($ip_mgmt_config_str, $collon_pos + 1); $ip_mgmt_fields = array(); $ip_mgmt_fields["ip_mgmt_appliance_id"] = NULL; $ip_mgmt_fields["ip_mgmt_nic_id"] = NULL; $ip_mgmt_assign = new ip_mgmt(); $ip_mgmt_assign->update_ip($ip_mgmt_id, $ip_mgmt_fields); } } } // ##################################################################################### // here we remove the appliance from the cloud-appliance table $cloud_appliance = new cloudappliance(); $cloud_appliance->get_instance_by_appliance_id($appliance->id); if (strlen($cloud_appliance->id)) { $cloud_appliance->remove($cloud_appliance->id); } // ################################## remove application groups ############################### // check if application is enabled $application_conf = new cloudconfig(); $show_application_groups = $application_conf->get_value(11); // show_puppet_groups if (!strcmp($show_application_groups, "true")) { $application_appliance = $appliance->name; if (strlen($cr->puppet_groups)) { $application_debug = "Removing applications from appliance " . $application_appliance . "."; $event->log("cloud", $_SERVER['REQUEST_TIME'], 5, "cloud-monitor", $application_debug, "", "", 0, 0, 0); $application_group_array = explode(",", $cr->puppet_groups); $cloudapplication = new cloudapplication(); $cloudapplication->remove_applications($appliance->name, $application_group_array); } } // ################################## deprovisioning clone-on-deploy ############################### // $event->log("cloud", $_SERVER['REQUEST_TIME'], 5, "cloud-monitor", "Removing cloudimage for request ID $cr_id", "", "", 0, 0, 0); // here we set the state of the cloud-image to remove // this will check the state of the resource which still has // the image as active rootfs. If the resource is idle again the // image will be removed. // The check for this mechanism is being executed at the beginning // of each cloud-monitor loop if ($appliance->imageid > 0) { $cloud_image = new cloudimage(); $cloud_image->get_instance_by_image_id($appliance->imageid); $cloud_image->set_state($cloud_image->id, "remove"); } // ################################## deprovisioning mail user ############################### // remove appliance_id from request $cr->get_instance_by_id($cr->id); $cr->setappliance("remove", $appliance->id); // when we are at the last resource for the request set status to 6 = done if ($deprovision_resource_number == $cr->resource_quantity) { $cr->setstatus($cr_id, "done"); // set lastbill empty $cr->set_requests_lastbill($cr_id, ''); } // send mail to user for deprovision started // get admin email $cc_conf = new cloudconfig(); $cc_admin_email = $cc_conf->get_value(1); // 1 is admin_email // get user + request + appliance details $cu_name = $cu->name; $cu_forename = $cu->forename; $cu_lastname = $cu->lastname; $cu_email = $cu->email; // start/stop time $cr_start = $cr->start; $start = date("d-m-Y H-i", $cr_start); $cr_stop = $cr->stop; $stop = date("d-m-Y H-i", $cr_stop); $eip = ''; if (isset($resource_external_ip)) { $eip = $resource_external_ip; } $rmail = new cloudmailer(); $rmail->to = "{$cu_email}"; $rmail->from = "{$cc_admin_email}"; $rmail->subject = "openQRM Cloud: Your resource from request {$cr_id} is fully deprovisioned now"; $rmail->template = "{$OPENQRM_SERVER_BASE_DIR}/openqrm/plugins/cloud/etc/mail/done_cloud_request.mail.tmpl"; $arr = array('@@ID@@' => "{$cr_id}", '@@FORENAME@@' => "{$cu_forename}", '@@LASTNAME@@' => "{$cu_lastname}", '@@START@@' => "{$start}", '@@STOP@@' => "{$stop}", '@@IP@@' => "{$eip}", '@@RESNUMBER@@' => "{$deprovision_resource_number}", '@@CLOUDADMIN@@' => $cc_admin_email); $rmail->var_array = $arr; $rmail->send(); // ################################## remove access to collectd graphs #################### // check if collectd is enabled $collectd_conf = new cloudconfig(); $show_collectd_graphs = $collectd_conf->get_value(19); // show_collectd_graphs if (!strcmp($show_collectd_graphs, "true")) { // is collectd enabled ? if (file_exists("{$RootDir}/plugins/collectd/.running")) { // check if we have a collectd config in the request $collectd_appliance = $appliance->name; $collectd_debug = "Removing access to Collectd graphs of appliance {$collectd_appliance} for Cloud user {$cu_name}"; $event->log("cloud", $_SERVER['REQUEST_TIME'], 5, "cloud-monitor", $collectd_debug, "", "", 0, 0, 0); // send command to the openQRM-server $remove_collectd = $OPENQRM_SERVER_BASE_DIR . "/openqrm/plugins/cloud/bin/openqrm-cloud-manager remove-graph {$collectd_appliance} {$cu_name}"; $openqrm_server->send_command($remove_collectd); } } // ################################## finsihed de-provision #################### // we cannot remove the appliance here because its image is still in use // and the appliance (id) is needed for the removal // so the image-remove mechanism also cares to remove the appliance // $event->log("cloud", $_SERVER['REQUEST_TIME'], 5, "cloud-monitor", "Deprovisioning request ID $cr_id finished", "", "", 0, 0, 0); $deprovision_resource_number++; // ################################## end de-provisioning ############################### // #################### end deprovisioning cr-loop ################################ // check if we continue or go on $parallel_phase_four_actions++; if ($max_parallel_phase_four_actions > 0 && $parallel_phase_four_actions >= $max_parallel_phase_four_actions) { break; } } // $event->log("cloud", $_SERVER['REQUEST_TIME'], 5, "monitor-hook", "Cloud Phase V - Cloudappliance commands", "", "", 0, 0, 0); // ################################## run cloudappliance commands ############################### $cloudapp = new cloudappliance(); $cloudapp_list = $cloudapp->get_all_ids(); foreach ($cloudapp_list as $list) { $phase_five_actions = 0; $ca_id = $list['ca_id']; $ca = new cloudappliance(); $ca->get_instance_by_id($ca_id); $ca_appliance_id = $ca->appliance_id; $ca_cr_id = $ca->cr_id; $ca_cmd = $ca->cmd; $ca_state = $ca->state; switch ($ca_cmd) { case 1: // start // $event->log("cloud", $_SERVER['REQUEST_TIME'], 5, "cloud-monitor", "Appliance start (ca $ca_id / app $ca_appliance_id / cr $ca_cr_id)", "", "", 0, 0, 0); $tappliance = new appliance(); $tappliance->get_instance_by_id($ca_appliance_id); $cloud_image_start = new cloudimage(); $cloud_image_start->get_instance_by_image_id($tappliance->imageid); // resource active (idle) again or ci resource set to -1 (removed) if ($cloud_image_start->resource_id != -1) { $ca_resource = new resource(); $ca_resource->get_instance_by_id($cloud_image_start->resource_id); $tcaid = $cloud_image_start->resource_id; if (strcmp($ca_resource->state, "active") || !strcmp($ca_resource->ip, "0.0.0.0")) { // $event->log("cloud", $_SERVER['REQUEST_TIME'], 5, "cloud-monitor", "Appliance start (ca $ca_id / app $ca_appliance_id / cr $ca_cr_id) : resource $tcaid Not yet active again", "", "", 0, 0, 0); // resource not yet automatic removed in case it is ia vm or not yet active again continue; } } // prepare array to update appliance, be sure to set to auto-select resource $ar_update = array('appliance_resources' => "-1"); // update appliance $ca_appliance = new appliance(); $ca_appliance->update($ca_appliance_id, $ar_update); // lets find a resource for this new appliance according the cr, update the object first $ca_appliance->get_instance_by_id($ca_appliance_id); // get the cr $ca_cr = new cloudrequest(); $ca_cr->get_instance_by_id($ca_cr_id); $appliance_virtualization = $ca_cr->resource_type_req; // prepare mail data $unpause_ca_conf = new cloudconfig(); $unpause_ca_admin_email = $unpause_ca_conf->get_value(1); // 1 is admin_email // and the user details $unpause_cloud_user = new clouduser(); $unpause_cloud_user->get_instance_by_id($ca_cr->cu_id); $unpause_cu_forename = $unpause_cloud_user->forename; $unpause_cu_lastname = $unpause_cloud_user->lastname; $unpause_cu_email = $unpause_cloud_user->email; // ################################## phys. res. ############################### if ($appliance_virtualization == 1) { $ca_appliance->find_resource($appliance_virtualization); // check if we got a resource ! $ca_appliance->get_instance_by_id($ca_appliance_id); if ($ca_appliance->resources == -1) { $event->log("cloud", $_SERVER['REQUEST_TIME'], 2, "cloud-monitor", "Could not find a resource (type physical system) for request ID {$ca_cr_id}", "", "", 0, 0, 0); $ca_cr->setstatus($ca_cr_id, 'no-res'); // send mail to user $rmail = new cloudmailer(); $rmail->to = "{$unpause_cu_email}"; $rmail->from = "{$unpause_ca_admin_email}"; $rmail->subject = "openQRM Cloud: Not enough resources to unpause your Cloudappliance " . $ca_id . " from request " . $ca_cr_id; $rmail->template = "{$OPENQRM_SERVER_BASE_DIR}/openqrm/plugins/cloud/etc/mail/not_enough_resources.mail.tmpl"; $arr = array('@@ID@@' => "{$ca_cr_id}", '@@FORENAME@@' => "{$unpause_cu_forename}", '@@LASTNAME@@' => "{$unpause_cu_lastname}", '@@RESNUMBER@@' => "0", '@@YOUR@@' => "your", '@@CLOUDADMIN@@' => $unpause_ca_admin_email); $rmail->var_array = $arr; $rmail->send(); // send mail to admin $rmail_admin = new cloudmailer(); $rmail_admin->to = "{$unpause_ca_admin_email}"; $rmail_admin->from = "{$unpause_ca_admin_email}"; $rmail_admin->subject = "openQRM Cloud: Not enough resources to unpause Cloudappliance " . $ca_id . " from request " . $ca_cr_id; $rmail_admin->template = "{$OPENQRM_SERVER_BASE_DIR}/openqrm/plugins/cloud/etc/mail/not_enough_resources.mail.tmpl"; $arr = array('@@ID@@' => "{$ca_cr_id}", '@@FORENAME@@' => "Cloudadmin", '@@LASTNAME@@' => "", '@@RESNUMBER@@' => "0", '@@YOUR@@' => "the", '@@CLOUDADMIN@@' => $unpause_ca_admin_email); $rmail_admin->var_array = $arr; $rmail_admin->send(); continue; } // we have a phys. resource } else { // ################################## auto create vm ############################### // check if we should try to create one // request type vm $unpause_auto_create_vms = $unpause_ca_conf->get_value(7); // 7 is auto_create_vms if (!strcmp($unpause_auto_create_vms, "true")) { // check if createvmlc exists for this cr + res-quantity unset($cvmlc); // use ca id as res.no $cvmlc = new cloudcreatevmlc(); $cvmlc->get_instance_by_cr_details($ca_cr_id, $ca_appliance_id); if (!strlen($cvmlc->request_time)) { // if no createvmlc exists so far create it and the vm // generate a mac address $mac_res = new resource(); // check if we need to generate the first nics mac address in the vmware address space $new_vm_mac = ""; $vm_virt = new virtualization(); $vm_virt->get_instance_by_type($ca_cr->resource_type_req); $virt_name = $vm_virt->get_plugin_name(); switch ($virt_name) { case 'vmware-esx': case 'vmware-server': case 'vmware-server2': $mac_res->generate_mac(); $suggested_mac = $mac_res->mac; $new_forth_byte_first_bit = rand(1, 3); $new_vm_mac = strtolower($vmware_mac_address_space . ":" . substr($suggested_mac, 9)); $new_vm_mac = substr_replace($new_vm_mac, $new_forth_byte_first_bit, 9, 1); break; default: $mac_res->generate_mac(); $new_vm_mac = $mac_res->mac; break; } // additional_nics $new_additional_nics = $ca_cr->network_req; // cpu $new_vm_cpu = $ca_cr->cpu_req; // memory $new_vm_memory = 256; if ($ca_cr->ram_req != 0) { $new_vm_memory = $ca_cr->ram_req; } // disk size $new_vm_disk = 5000; if ($ca_cr->disk_req != 0) { $new_vm_disk = $ca_cr->disk_req; } // generate vnc password and store in cr $pass_gen_image = new image(); $vm_vnc_password = trim($pass_gen_image->generatePassword(12)); $ca_cr_update_fields = array(); $ca_cr_update_fields['cr_image_password'] = $vm_vnc_password; $ca_cr->update($ca_cr->id, $ca_cr_update_fields); // Create VM // here we start the new vm ! $cloudvm = new cloudvm(); // this method returns the resource-id $cloudvm->create($ca_cr->cu_id, $appliance_virtualization, $ca_appliance->name, $new_vm_mac, $new_additional_nics, $new_vm_cpu, $new_vm_memory, $new_vm_disk, $vm_create_timout, $vm_vnc_password, $SOURCE_IMAGE_ID); $new_vm_resource_id = $cloudvm->resource_id; // if we did not find a host resource id will be 0 if ($new_vm_resource_id == 0) { $event->log("cloud", $_SERVER['REQUEST_TIME'], 2, "cloud-monitor", "Could not find a VM Host for request ID " . $ca_cr_id . "(unpause)", "", "", 0, 0, 0); $ca_cr->setstatus($ca_cr_id, 'no-res'); // send mail to user $rmail = new cloudmailer(); $rmail->to = "{$unpause_cu_email}"; $rmail->from = "{$unpause_ca_admin_email}"; $rmail->subject = "openQRM Cloud: No VM Host available to unpause your Cloudappliance " . $ca_id . " from request " . $ca_cr_id; $rmail->template = "{$OPENQRM_SERVER_BASE_DIR}/openqrm/plugins/cloud/etc/mail/not_enough_resources.mail.tmpl"; $arr = array('@@ID@@' => "{$ca_cr_id}", '@@FORENAME@@' => "{$unpause_cu_forename}", '@@LASTNAME@@' => "{$unpause_cu_lastname}", '@@RESNUMBER@@' => "0", '@@YOUR@@' => "your", '@@CLOUDADMIN@@' => $unpause_ca_admin_email); $rmail->var_array = $arr; $rmail->send(); // send mail to admin $rmail_admin = new cloudmailer(); $rmail_admin->to = "{$unpause_ca_admin_email}"; $rmail_admin->from = "{$unpause_ca_admin_email}"; $rmail_admin->subject = "openQRM Cloud: No VM Host available to unpause Cloudappliance " . $ca_id . " from request " . $ca_cr_id; $rmail_admin->template = "{$OPENQRM_SERVER_BASE_DIR}/openqrm/plugins/cloud/etc/mail/not_enough_resources.mail.tmpl"; $arr = array('@@ID@@' => "{$ca_cr_id}", '@@FORENAME@@' => "Cloudadmin", '@@LASTNAME@@' => "", '@@RESNUMBER@@' => "0", '@@YOUR@@' => "the", '@@CLOUDADMIN@@' => $unpause_ca_admin_email); $rmail_admin->var_array = $arr; $rmail_admin->send(); // reset the cmd field $ca->set_cmd($ca_id, "noop"); // set state to paused $ca->set_state($ca_id, "paused"); continue; } $event->log("cloud", $_SERVER['REQUEST_TIME'], 5, "cloud-monitor", "Auto-created VM with resource_id {$new_vm_resource_id}", "", "", 0, 0, 0); // create cvmlc after we got a resource_id $vm_create_time = $_SERVER['REQUEST_TIME']; $cvmlc_resource_fields["vc_resource_id"] = $new_vm_resource_id; $cvmlc_resource_fields["vc_cr_id"] = $ca_cr_id; $cvmlc_resource_fields["vc_cr_resource_number"] = $ca_appliance_id; $cvmlc_resource_fields["vc_request_time"] = $vm_create_time; $cvmlc_resource_fields["vc_vm_create_timeout"] = $vm_create_timout; $cvmlc_resource_fields["vc_state"] = 0; // get the new resource id from the db $new_vc_id = (int) str_replace(".", "", str_pad(microtime(true), 15, "0")); $cvmlc_resource_fields["vc_id"] = $new_vc_id; $cvmlc->add($cvmlc_resource_fields); // here we go on continue; } else { // we have a cvmlc, check its resource and set its state $cvm_resource = new resource(); $cvm_resource->get_instance_by_id($cvmlc->resource_id); // idle ? if ($cvm_resource->imageid == 1 && $cvm_resource->state == 'active' && strcmp($cvm_resource->ip, "0.0.0.0")) { // we have a new idle vm as resource :) update it in the appliance $new_vm_resource_id = $cvmlc->resource_id; unset($appliance_fields); $appliance_fields = array(); $appliance_fields['appliance_resources'] = $new_vm_resource_id; $ca_appliance->update($ca_appliance_id, $appliance_fields); $ca_appliance->get_instance_by_id($ca_appliance_id); // $event->log("cloud", $_SERVER['REQUEST_TIME'], 5, "cloud-monitor", "Created new resource $new_vm_resource_id for appliance $ca_appliance->name start event", "", "", 0, 0, 0); // update cloudimage with resource -1 $ar_ci_update = array('ci_resource_id' => $new_vm_resource_id, 'ci_state' => 1); $cloud_image_start->update($cloud_image_start->id, $ar_ci_update); // remove cvmlc $cvmlc->remove($cvmlc->id); } else { // check timeout $vm_check_time = $_SERVER['REQUEST_TIME']; $vm_c_timeout = $cvmlc->request_time + $cvmlc->vm_create_timeout; if ($vm_check_time > $vm_c_timeout) { $event->log("cloud", $_SERVER['REQUEST_TIME'], 2, "cloud-monitor", "Could not create a new resource for request ID " . $ca_cr_id . "(unpause)", "", "", 0, 0, 0); $ca_cr->setstatus($ca_cr_id, 'no-res'); // send mail to user $rmail = new cloudmailer(); $rmail->to = "{$unpause_cu_email}"; $rmail->from = "{$unpause_ca_admin_email}"; $rmail->subject = "openQRM Cloud: Not enough resources to unpause your Cloudappliance " . $ca_id . " from request " . $ca_cr_id; $rmail->template = "{$OPENQRM_SERVER_BASE_DIR}/openqrm/plugins/cloud/etc/mail/not_enough_resources.mail.tmpl"; $arr = array('@@ID@@' => "{$ca_cr_id}", '@@FORENAME@@' => "{$unpause_cu_forename}", '@@LASTNAME@@' => "{$unpause_cu_lastname}", '@@RESNUMBER@@' => "0", '@@YOUR@@' => "your", '@@CLOUDADMIN@@' => $unpause_ca_admin_email); $rmail->var_array = $arr; $rmail->send(); // send mail to admin $rmail_admin = new cloudmailer(); $rmail_admin->to = "{$unpause_ca_admin_email}"; $rmail_admin->from = "{$unpause_ca_admin_email}"; $rmail_admin->subject = "openQRM Cloud: Not enough resources to unpause Cloudappliance " . $ca_id . " from request " . $ca_cr_id; $rmail_admin->template = "{$OPENQRM_SERVER_BASE_DIR}/openqrm/plugins/cloud/etc/mail/not_enough_resources.mail.tmpl"; $arr = array('@@ID@@' => "{$ca_cr_id}", '@@FORENAME@@' => "Cloudadmin", '@@LASTNAME@@' => "", '@@RESNUMBER@@' => "0", '@@YOUR@@' => "the", '@@CLOUDADMIN@@' => $unpause_ca_admin_email); $rmail_admin->var_array = $arr; $rmail_admin->send(); // refresh object $ca_appliance->get_instance_by_id($ca_appliance_id); // try removing the cloudvm $clean_cloudvm = new cloudvm(); $clean_cloudvm->remove($cvm_resource->id, $cvm_resource->vtype, $ca_appliance->name, $cvm_resource->mac); // remove cvmlc $cvmlc->remove($cvmlc->id); // reset the cmd field $ca->set_cmd($ca_id, "noop"); // set state to paused $ca->set_state($ca_id, "paused"); // go on continue; } // still waiting within the timeout // update state to 1 (starting) // $event->log("cloud", $_SERVER['REQUEST_TIME'], 5, "cloud-monitor", "Still waiting for cr $ca_cr_id / res. ".$cvmlc->resource_id." to get idle (unpause)", "", "", 0, 0, 0); $cvm_state_fields['vc_state'] = 1; $cvmlc->update($cvmlc->id, $cvm_state_fields); // continue with the next cr/res-nr continue; } } // ################################## no auto create vm ############################### } else { // not set to auto-create vms // try to find a fitting idle vm $ca_appliance->find_resource($appliance_virtualization); // check if we got a resource ! $ca_appliance->get_instance_by_id($ca_appliance_id); if ($ca_appliance->resources == -1) { $event->log("cloud", $_SERVER['REQUEST_TIME'], 2, "cloud-monitor", "Not creating a new resource for request ID {$ca_cr_id}, auto-create-vms is disabled.", "", "", 0, 0, 0); $ca_cr->setstatus($ca_cr_id, 'no-res'); // send mail to user $rmail = new cloudmailer(); $rmail->to = "{$unpause_cu_email}"; $rmail->from = "{$unpause_ca_admin_email}"; $rmail->subject = "openQRM Cloud: Not enough resources to unpause your Cloudappliance " . $ca_id . " from request " . $ca_cr_id; $rmail->template = "{$OPENQRM_SERVER_BASE_DIR}/openqrm/plugins/cloud/etc/mail/not_enough_resources.mail.tmpl"; $arr = array('@@ID@@' => "{$ca_cr_id}", '@@FORENAME@@' => "{$unpause_cu_forename}", '@@LASTNAME@@' => "{$unpause_cu_lastname}", '@@RESNUMBER@@' => "0", '@@YOUR@@' => "your", '@@CLOUDADMIN@@' => $unpause_ca_admin_email); $rmail->var_array = $arr; $rmail->send(); // send mail to admin $rmail_admin = new cloudmailer(); $rmail_admin->to = "{$unpause_ca_admin_email}"; $rmail_admin->from = "{$unpause_ca_admin_email}"; $rmail_admin->subject = "openQRM Cloud: Not enough resources to unpause Cloudappliance " . $ca_id . " from request " . $ca_cr_id; $rmail_admin->template = "{$OPENQRM_SERVER_BASE_DIR}/openqrm/plugins/cloud/etc/mail/not_enough_resources.mail.tmpl"; $arr = array('@@ID@@' => "{$ca_cr_id}", '@@FORENAME@@' => "Cloudadmin", '@@LASTNAME@@' => "", '@@RESNUMBER@@' => "0", '@@YOUR@@' => "the", '@@CLOUDADMIN@@' => $unpause_ca_admin_email); $rmail_admin->var_array = $arr; $rmail_admin->send(); // reset the cmd field $ca->set_cmd($ca_id, "noop"); // set state to paused $ca->set_state($ca_id, "paused"); continue; } } } // ################################## end auto create vm ############################### // assign the resource $ca_appliance->get_instance_by_id($ca_appliance_id); $kernel = new kernel(); $kernel->get_instance_by_id($ca_appliance->kernelid); $resource = new resource(); $resource->get_instance_by_id($ca_appliance->resources); // in case we do not have an external ip-config send the resource ip to the user $resource_external_ip = $resource->ip; // send command to the openQRM-server $openqrm_server->send_command("openqrm_assign_kernel {$resource->id} {$resource->mac} {$kernel->name}"); // wait until the resource got the new kernel assigned sleep(2); //start the appliance, refresh the object before in case of clone-on-deploy $ca_appliance->get_instance_by_id($ca_appliance_id); $ca_appliance->start(); // ######################## ip-mgmt find users ips ############################### // here we check which ip to send to the user // check ip-mgmt $cc_conf = new cloudconfig(); $show_ip_mgmt = $cc_conf->get_value(26); // ip-mgmt enabled ? if (!strcmp($show_ip_mgmt, "true")) { if (file_exists("{$RootDir}/plugins/ip-mgmt/.running")) { require_once "{$RootDir}/plugins/ip-mgmt/class/ip-mgmt.class.php"; $ip_mgmt_array = explode(",", $ca_cr->ip_mgmt); foreach ($ip_mgmt_array as $ip_mgmt_config_str) { $collon_pos = strpos($ip_mgmt_config_str, ":"); $nic_id = substr($ip_mgmt_config_str, 0, $collon_pos); $ip_mgmt_id = substr($ip_mgmt_config_str, $collon_pos + 1); if (!strlen($ip_mgmt_id)) { continue; } $ip_mgmt_unpause = new ip_mgmt(); $ip_mgmt_config_arr = $ip_mgmt_unpause->get_config_by_id($ip_mgmt_id); $cloud_ip = $ip_mgmt_config_arr[0]['ip_mgmt_address']; $resource_external_ip = $cloud_ip . ","; } $resource_external_ip = rtrim($resource_external_ip, ","); } } // ################################################################################ // get the vnc console infos - check for allow_vnc $cc_allow_vnc = $cc_conf->get_value(42); // 1 is admin_email $vnc_informations = ""; if (!strcmp($cc_allow_vnc, "true")) { $vnc_resource = new resource(); $vnc_resource->get_instance_by_id($ca_appliance->resources); $vnc_informations_file = $OPENQRM_SERVER_BASE_DIR . "/openqrm/web/action/cloud-conf/" . $vnc_resource->mac . ".vnc"; if (file_exists($vnc_informations_file)) { $vnc_infos = file_get_contents($vnc_informations_file); $vnc_informations = "You can login to the System console via VNC at " . trim($vnc_infos) . " with the password: "******"You can login to the System console via VNC with the password: "******"noop"); // set state to active $ca->set_state($ca_id, "active"); // make sure the request is set to active again $ca_cr->setstatus($ca_cr_id, 'active'); // send mail to user // get admin email $cc_conf = new cloudconfig(); $cc_admin_email = $cc_conf->get_value(1); // 1 is admin_email // get user + request + appliance details $cu_id = $ca_cr->cu_id; $cu = new clouduser(); $cu->get_instance_by_id($cu_id); $cu_name = $cu->name; $unpause_cu_forename = $cu->forename; $unpause_cu_lastname = $cu->lastname; $unpause_cu_email = $cu->email; // start/stop time $cr_start = $ca_cr->start; $start = date("d-m-Y H-i", $cr_start); $cr_stop = $ca_cr->stop; $stop = date("d-m-Y H-i", $cr_stop); $rmail = new cloudmailer(); $rmail->to = "{$unpause_cu_email}"; $rmail->from = "{$unpause_ca_admin_email}"; $rmail->subject = "openQRM Cloud: Your unpaused appliance {$ca_appliance_id} from request {$ca_cr_id} is now active"; $rmail->template = "{$OPENQRM_SERVER_BASE_DIR}/openqrm/plugins/cloud/etc/mail/active_cloud_request.mail.tmpl"; $arr = array('@@ID@@' => "{$ca_cr_id}", '@@FORENAME@@' => "{$unpause_cu_forename}", '@@LASTNAME@@' => "{$unpause_cu_lastname}", '@@START@@' => "{$start}", '@@STOP@@' => "{$stop}", '@@PASSWORD@@' => "(as before)", '@@LOGINUSER@@' => $cu_name, '@@IP@@' => "{$resource_external_ip}", '@@RESNUMBER@@' => "", '@@HOSTNAME@@' => $ca_appliance->name, '@@VNC@@' => $vnc_informations, '@@CLOUDADMIN@@' => $unpause_ca_admin_email); $rmail->var_array = $arr; $rmail->send(); $phase_five_actions = 1; break; case 2: // stop/pause $ca_appliance = new appliance(); $ca_appliance->get_instance_by_id($ca_appliance_id); $ca_resource_id = $ca_appliance->resources; $ca_resource_stop = new resource(); $ca_resource_stop->get_instance_by_id($ca_appliance->resources); $resource_external_ip = $ca_resource_stop->ip; $event->log("cloud", $_SERVER['REQUEST_TIME'], 5, "cloud-monitor", "Pausing Appliance {$ca_appliance->name}", "", "", 0, 0, 0); $openqrm_server->send_command("openqrm_assign_kernel {$ca_resource_stop->id} {$ca_resource_stop->mac} default"); // now stop $ca_appliance->stop(); // remove resource $ar_update = array('appliance_resources' => "-1"); // update appliance $ca_appliance->update($ca_appliance_id, $ar_update); // reset the cmd field $ca->set_cmd($ca_id, "noop"); // set state to paused $ca->set_state($ca_id, "paused"); $phase_five_actions = 1; break; case 3: // restart $ca_appliance = new appliance(); $ca_appliance->get_instance_by_id($ca_appliance_id); $ca_resource_id = $ca_appliance->resources; $ca_resource_restart = new resource(); $ca_resource_restart->get_instance_by_id($ca_resource_id); $ca_resource_ip = $ca_resource_restart->ip; $event->log("cloud", $_SERVER['REQUEST_TIME'], 5, "cloud-monitor", "Restarting Appliance {$ca_appliance->name}", "", "", 0, 0, 0); $ca_resource_restart->send_command("{$ca_resource_ip}", "reboot"); // reset the cmd field $ca->set_cmd($ca_id, "noop"); sleep(2); // set state to transition $resource_fields = array(); $resource_fields["resource_state"] = "transition"; $ca_resource_restart->update_info($ca_resource_id, $resource_fields); $phase_five_actions = 1; break; } // check if we continue or go on if ($phase_five_actions == 1) { $parallel_phase_five_actions++; if ($max_parallel_phase_five_actions > 0 && $parallel_phase_five_actions >= $max_parallel_phase_five_actions) { break; } } } // ###################### end cloudappliance commands ###################### // ##################### start cloudimage-resize-life-cycle ################ // $event->log("cloud", $_SERVER['REQUEST_TIME'], 5, "monitor-hook", "Cloud Phase VI - Cloud Image resize live-cycle", "", "", 0, 0, 0); $cirlc = new cloudirlc(); $cirlc_list = $cirlc->get_all_ids(); foreach ($cirlc_list as $cdlist) { $cd_id = $cdlist['cd_id']; $cd = new cloudirlc(); $cd->get_instance_by_id($cd_id); $cd_appliance_id = $cd->appliance_id; $cd_state = $cd->state; switch ($cd_state) { case 0: // remove $cd->remove($cd_id); // $event->log("cloud", $_SERVER['REQUEST_TIME'], 5, "cloudirlc", "(REMOVE) Resize life-cycle of Appliance $cd_appliance_id", "", "", 0, 0, 0); break; case 1: // pause // $event->log("cloud", $_SERVER['REQUEST_TIME'], 5, "cloudirlc", "(PAUSE) Resize life-cycle of Appliance $cd_appliance_id", "", "", 0, 0, 0); $cloud_app_resize = new cloudappliance(); $cloud_app_resize->get_instance_by_id($cd_appliance_id); $cloud_app_resize->set_cmd($cloud_app_resize->id, "stop"); $cloud_app_resize->set_state($cloud_app_resize->id, "paused"); $cd->set_state($cd_id, "start_resize"); break; case 2: // start_resize // set the cloudimage to state resize $cloud_app_resize = new cloudappliance(); $cloud_app_resize->get_instance_by_id($cd_appliance_id); $appliance = new appliance(); $appliance->get_instance_by_id($cloud_app_resize->appliance_id); $cloud_im = new cloudimage(); $cloud_im->get_instance_by_image_id($appliance->imageid); // make sure that we wait until the cloud image has no resource, // otherwise we risk doing things while the volume is still in use. if ($cloud_im->resource_id == -1) { $cloud_im->set_state($cloud_im->id, "resizing"); $cd->set_state($cd_id, "resizing"); // $event->log("cloud", $_SERVER['REQUEST_TIME'], 5, "cloudirlc", "(START_RESIZE) Resize life-cycle of Appliance $cd_appliance_id", "", "", 0, 0, 0); } break; case 3: // resizing // $event->log("cloud", $_SERVER['REQUEST_TIME'], 5, "cloudirlc", "(RESIZING) Resize life-cycle of Appliance $cd_appliance_id", "", "", 0, 0, 0); // remove any existing image-authentication to avoid kicking the auth into the resize phase $cloud_app_resize = new cloudappliance(); $cloud_app_resize->get_instance_by_id($cd_appliance_id); $appliance = new appliance(); $appliance->get_instance_by_id($cloud_app_resize->appliance_id); $image_auth = new image_authentication(); $image_auth->get_instance_by_image_id($appliance->imageid); $image_auth->remove($image_auth->id); $cd->set_state($cd_id, "end_resize"); break; case 4: // end_resize // $event->log("cloud", $_SERVER['REQUEST_TIME'], 5, "cloudirlc", "(END_RESIZE) Resize life-cycle of Appliance $cd_appliance_id", "", "", 0, 0, 0); $cd->set_state($cd_id, "unpause"); break; case 5: // unpause // $event->log("cloud", $_SERVER['REQUEST_TIME'], 5, "cloudirlc", "(UNPAUSE) Resize life-cycle of Appliance $cd_appliance_id", "", "", 0, 0, 0); // unpause appliance $cloud_app_resize = new cloudappliance(); $cloud_app_resize->get_instance_by_id($cd_appliance_id); $cloud_app_resize->set_cmd($cloud_app_resize->id, "start"); $cloud_app_resize->set_state($cloud_app_resize->id, "active"); // set new disk size in cloudimage $appliance = new appliance(); $appliance->get_instance_by_id($cloud_app_resize->appliance_id); $cloud_im = new cloudimage(); $cloud_im->get_instance_by_image_id($appliance->imageid); $ar_cl_image_update = array('ci_disk_size' => $cloud_im->disk_rsize, 'ci_disk_rsize' => ""); $cloud_im->update($cloud_im->id, $ar_cl_image_update); $cd->set_state($cd_id, "remove"); break; } // check if we continue or go on $parallel_phase_six_actions++; if ($max_parallel_phase_six_actions > 0 && $parallel_phase_six_actions >= $max_parallel_phase_six_actions) { break; } } // ##################### end cloudimage-resize-life-cycle ################## // ##################### start cloudimage-private-life-cycle ################ // $event->log("cloud", $_SERVER['REQUEST_TIME'], 5, "monitor-hook", "Cloud Phase VII - Cloud Image private live-cycle", "", "", 0, 0, 0); $max_clone_time = 4800; $ciplc = new cloudiplc(); $ciplc_list = $ciplc->get_all_ids(); foreach ($ciplc_list as $cplist) { $cp_id = $cplist['cp_id']; $cp = new cloudiplc(); $cp->get_instance_by_id($cp_id); $cp_appliance_id = $cp->appliance_id; $cp_state = $cp->state; switch ($cp_state) { case 0: // remove $cp->remove($cp_id); $event->log("cloud", $_SERVER['REQUEST_TIME'], 5, "cloudiplc", "(REMOVE) Private life-cycle of Appliance {$cp_appliance_id}", "", "", 0, 0, 0); break; case 1: // pause $event->log("cloud", $_SERVER['REQUEST_TIME'], 5, "cloudiplc", "(PAUSE) Private life-cycle of Appliance {$cp_appliance_id}", "", "", 0, 0, 0); $cloud_app_private = new cloudappliance(); $cloud_app_private->get_instance_by_id($cp_appliance_id); $cloud_app_private->set_cmd($cloud_app_private->id, "stop"); $cloud_app_private->set_state($cloud_app_private->id, "paused"); $cp->set_state($cp_id, "start_private"); break; case 2: // start_private // set the cloudimage to state resize $cloud_app_private = new cloudappliance(); $cloud_app_private->get_instance_by_id($cp_appliance_id); $appliance = new appliance(); $appliance->get_instance_by_id($cloud_app_private->appliance_id); $cloud_im = new cloudimage(); $cloud_im->get_instance_by_image_id($appliance->imageid); // make sure that we wait until the cloud image has no resource, // otherwise we risk doing things while the volume is still in use. if ($cloud_im->resource_id == -1) { $cloud_im->set_state($cloud_im->id, "private"); $cp->set_state($cp_id, "cloning"); $event->log("cloud", $_SERVER['REQUEST_TIME'], 5, "cloudiplc", "(START_PRIVATE) Private life-cycle of Appliance {$cp_appliance_id}", "", "", 0, 0, 0); } break; case 3: // cloning $event->log("cloud", $_SERVER['REQUEST_TIME'], 5, "cloudiplc", "(CLONING) Private life-cycle of Appliance {$cp_appliance_id}", "", "", 0, 0, 0); // remove any existing image-authentication to avoid kicking the auth into the private phase $cloud_app_private = new cloudappliance(); $cloud_app_private->get_instance_by_id($cp_appliance_id); $appliance = new appliance(); $appliance->get_instance_by_id($cloud_app_private->appliance_id); $image_auth = new image_authentication(); $image_auth->get_instance_by_image_id($appliance->imageid); $image_auth->remove($image_auth->id); $cp->set_state($cp_id, "end_private"); break; case 4: // end_private // check timeout $start_private = $cp->start_private; $current_time = $_SERVER['REQUEST_TIME']; $private_runtime = $current_time - $start_private; // check notifcation from storage // get the cloudappliance $cloud_app_private = new cloudappliance(); $cloud_app_private->get_instance_by_id($cp_appliance_id); // get the real appliance $appliance = new appliance(); $appliance->get_instance_by_id($cloud_app_private->appliance_id); // get the cloudimage $cloud_im = new cloudimage(); $cloud_im->get_instance_by_image_id($appliance->imageid); // get image_id $pimage = new image(); $pimage->get_instance_by_name($cloud_im->clone_name); // get deployment type $pdeployment = new deployment(); if (strlen($pimage->type)) { $pdeployment->get_instance_by_type($pimage->type); } // notification filename $clone_notification_file = $_SERVER["DOCUMENT_ROOT"] . '/openqrm/base/plugins/' . $pdeployment->storagetype . '/storage/' . $cloud_im->clone_name . '.clone'; // start checking if ($private_runtime > $max_clone_time) { // ran too long $event->log("cloud", $_SERVER['REQUEST_TIME'], 3, "cloudiplc", "(END_PRIVATE) Time-out private life-cycle of Appliance {$cp_appliance_id}", "", "", 0, 0, 0); $cp->set_state($cp_id, "unpause"); } else { if (file_exists($clone_notification_file)) { // got notification from storage server $event->log("cloud", $_SERVER['REQUEST_TIME'], 5, "cloudiplc", "(END_PRIVATE) Got notified to finsish private life-cycle of Appliance {$cp_appliance_id}", "", "", 0, 0, 0); unlink($clone_notification_file); $cp->set_state($cp_id, "unpause"); } } break; case 5: // unpause $event->log("cloud", $_SERVER['REQUEST_TIME'], 5, "cloudiplc", "(UNPAUSE) Private life-cycle of Appliance {$cp_appliance_id}", "", "", 0, 0, 0); // get the cloudappliance $cloud_app_private = new cloudappliance(); $cloud_app_private->get_instance_by_id($cp_appliance_id); // get the real appliance $appliance = new appliance(); $appliance->get_instance_by_id($cloud_app_private->appliance_id); // get the cloudimage $cloud_im = new cloudimage(); $cloud_im->get_instance_by_image_id($appliance->imageid); // here we create the private cloud image in openQRM after the clone procedure $private_cloud_image = new cloudprivateimage(); // get image_id $pimage = new image(); $pimage->get_instance_by_name($cloud_im->clone_name); // get cu_id $crequest = new cloudrequest(); $crequest->get_instance_by_id($cloud_app_private->cr_id); $cuser = new clouduser(); $cuser->get_instance_by_id($crequest->cu_id); // create array for add $private_cloud_image_fields["co_id"] = (int) str_replace(".", "", str_pad(microtime(true), 15, "0")); $private_cloud_image_fields["co_image_id"] = $pimage->id; $private_cloud_image_fields["co_cu_id"] = $cuser->id; $private_cloud_image_fields["co_state"] = 1; $private_cloud_image->add($private_cloud_image_fields); // unpause appliance $cloud_app_private->set_cmd($cloud_app_private->id, "start"); $cloud_app_private->set_state($cloud_app_private->id, "active"); // array for updating the cloudimage $ar_cl_image_update = array('ci_disk_rsize' => "", 'ci_clone_name' => ""); $cloud_im->update($cloud_im->id, $ar_cl_image_update); $cp->set_state($cp_id, "remove"); break; } // check if we continue or go on $parallel_phase_seven_actions++; if ($max_parallel_phase_seven_actions > 0 && $parallel_phase_seven_actions >= $max_parallel_phase_seven_actions) { break; } } // ##################### end cloudimage-private-life-cycle ################## // ##################### checking for power-saving ################## $cloudpowersaver = new cloudpowersaver(); $cloudpowersaver->trigger(); // $event->log("cloud", $_SERVER['REQUEST_TIME'], 5, "cloud-monitor", "Removing the cloud-monitor lock", "", "", 0, 0, 0); unlink($cloud_monitor_lock); }
function openqrm_kvm_appliance($cmd, $appliance_fields) { global $event; global $OPENQRM_SERVER_BASE_DIR; global $OPENQRM_SERVER_IP_ADDRESS; global $OPENQRM_EXEC_PORT; $appliance_id = $appliance_fields["appliance_id"]; $appliance_name = $appliance_fields["appliance_name"]; $resource = new resource(); $resource->get_instance_by_id($appliance_fields["appliance_resources"]); $appliance_ip = $resource->ip; $appliance = new appliance(); $appliance->get_instance_by_id($appliance_id); // check appliance values, maybe we are in update and they are incomplete if ($appliance->imageid == 1) { return; } if ($resource->id == "-1" || $resource->id == "" || !isset($resource->vtype)) { return; } $openqrm_admin_user = new user("openqrm"); $openqrm_admin_user->set_user(); $event->log("openqrm_kvm_appliance", $_SERVER['REQUEST_TIME'], 5, "openqrm-kvm-appliance-hook.php", "Handling {$cmd} event {$appliance_id}/{$appliance_name}/{$appliance_ip}", "", "", 0, 0, $appliance_id); switch ($cmd) { case "start": // send command to assign image and start vm // NOTICE : please enable this hook only if you are using the ip-mgmt plugin with vlans // check if resource type -> kvm-vm-net // $virtualization = new virtualization(); // $virtualization->get_instance_by_type("kvm-vm-net"); // $kvm_host_resource = new resource(); // $kvm_host_resource->get_instance_by_id($resource->vhostid); // if ($resource->vtype != $virtualization->id) { // $kvm_command="$OPENQRM_SERVER_BASE_DIR/openqrm/plugins/kvm/bin/openqrm-kvm-vm reset_vlans_by_mac -b start -m $resource->mac"; // $kvm_host_resource->send_command($kvm_host_resource->ip, $kvm_command); // return; // } // check resource type -> kvm-vm-local $virtualization = new virtualization(); $virtualization->get_instance_by_type("kvm-vm-local"); if ($resource->vtype != $virtualization->id) { $event->log("openqrm_kvm_appliance", $_SERVER['REQUEST_TIME'], 5, "openqrm-kvm-appliance-hook.php", "{$appliance_id} is not from type kvm-vm, skipping .. {$appliance_name}/{$appliance_ip}", "", "", 0, 0, $appliance_id); return; } // check image is on the same storage server // get the kvm host resource $kvm_host_resource = new resource(); $kvm_host_resource->get_instance_by_id($resource->vhostid); // get the kvm resource $image = new image(); $image->get_instance_by_id($appliance->imageid); $storage = new storage(); $storage->get_instance_by_id($image->storageid); $kvm_resource = new resource(); $kvm_resource->get_instance_by_id($storage->resource_id); if ($kvm_host_resource->id != $kvm_resource->id) { $event->log("openqrm_kvm_appliance", $_SERVER['REQUEST_TIME'], 5, "openqrm-kvm-appliance-hook.php", "Appliance {$appliance_id} image is not available on this kvm host. Assuming SAN-Backend", "", "", 0, 0, $appliance_id); } $kvm_command = $OPENQRM_SERVER_BASE_DIR . "/openqrm/plugins/kvm/bin/openqrm-kvm-vm start_by_mac -m " . $resource->mac . " -d " . $image->rootdevice . " -u " . $openqrm_admin_user->name . " -p " . $openqrm_admin_user->password; $kvm_host_resource->send_command($kvm_host_resource->ip, $kvm_command); break; case "stop": // send command to stop the vm and deassign image // NOTICE : please enable this hook only if you are using the ip-mgmt plugin with vlans // check if resource type -> kvm-vm-net // $virtualization = new virtualization(); // $virtualization->get_instance_by_type("kvm-vm-net"); // $kvm_host_resource = new resource(); // $kvm_host_resource->get_instance_by_id($resource->vhostid); // if ($resource->vtype != $virtualization->id) { // $kvm_command="$OPENQRM_SERVER_BASE_DIR/openqrm/plugins/kvm/bin/openqrm-kvm reset_vlans_by_mac -b stop -m $resource->mac"; // $kvm_host_resource->send_command($kvm_host_resource->ip, $kvm_command); // return; // } // check resource type -> kvm-vm-local $virtualization = new virtualization(); $virtualization->get_instance_by_type("kvm-vm-local"); if ($resource->vtype != $virtualization->id) { $event->log("openqrm_kvm_appliance", $_SERVER['REQUEST_TIME'], 5, "openqrm-kvm-appliance-hook.php", "{$appliance_id} is not from type kvm-vm, skipping .. {$appliance_name}/{$appliance_ip}", "", "", 0, 0, $appliance_id); return; } // check image is on the same storage server // get the kvm host resource $kvm_host_resource = new resource(); $kvm_host_resource->get_instance_by_id($resource->vhostid); // get the kvm resource $image = new image(); $image->get_instance_by_id($appliance->imageid); $storage = new storage(); $storage->get_instance_by_id($image->storageid); $kvm_resource = new resource(); $kvm_resource->get_instance_by_id($storage->resource_id); if ($kvm_host_resource->id != $kvm_resource->id) { $event->log("openqrm_kvm_appliance", $_SERVER['REQUEST_TIME'], 5, "openqrm-kvm-appliance-hook.php", "Appliance {$appliance_id} image is not available on this kvm host. Assuming SAN-Backend", "", "", 0, 0, $appliance_id); } $kvm_command = $OPENQRM_SERVER_BASE_DIR . "/openqrm/plugins/kvm/bin/openqrm-kvm-vm restart_by_mac -m " . $resource->mac . " -u " . $openqrm_admin_user->name . " -p " . $openqrm_admin_user->password . " --openqrm-cmd-mode background"; $kvm_host_resource->send_command($kvm_host_resource->ip, $kvm_command); break; case "update": // check if the appliance was set to a kvm Host, if yes, auto-create the storage objects $virtualization = new virtualization(); $virtualization->get_instance_by_type("kvm"); if ($appliance->virtualization == $virtualization->id) { // KVM LVM Storage $deployment = new deployment(); $deployment->get_instance_by_name('kvm-lvm-deployment'); $storage = new storage(); $kvm_id_list = $storage->get_ids_by_storage_type($deployment->id); $found_kvm = false; $found_kvm_id = -1; foreach ($kvm_id_list as $list) { foreach ($list as $kvm_id) { $storage->get_instance_by_id($kvm_id); if ($storage->resource_id == $appliance->resources) { $found_kvm = true; $found_kvm_id = $storage->id; break; } } } if (!$found_kvm) { $found_kvm_id = (int) str_replace(".", "", str_pad(microtime(true), 15, "0")); $storage_fields['storage_id'] = $found_kvm_id; $storage_fields['storage_name'] = $appliance->name . "-lvm"; $storage_fields['storage_type'] = $deployment->id; $storage_fields['storage_comment'] = 'KVM LVM Storage Object for Appliance ' . $appliance->name; $storage_fields['storage_resource_id'] = $appliance->resources; $storage_fields['storage_capabilities'] = ''; $storage->add($storage_fields); $event->log("openqrm_kvm_appliance", $_SERVER['REQUEST_TIME'], 5, "openqrm-kvm-appliance-hook.php", "Created KVM LVM Storage Object for Appliance " . $appliance_id . "!", "", "", 0, 0, $appliance_id); } else { $event->log("openqrm_kvm_appliance", $_SERVER['REQUEST_TIME'], 5, "openqrm-kvm-appliance-hook.php", "KVM LVM Storage Object for Appliance " . $appliance_id . " already existing.", "", "", 0, 0, $appliance_id); } // KVM Blockfile Storage $deployment = new deployment(); $deployment->get_instance_by_name('kvm-bf-deployment'); $storage = new storage(); $kvm_id_list = $storage->get_ids_by_storage_type($deployment->id); $found_kvm = false; $found_kvm_id = -1; foreach ($kvm_id_list as $list) { foreach ($list as $kvm_id) { $storage->get_instance_by_id($kvm_id); if ($storage->resource_id == $appliance->resources) { $found_kvm = true; $found_kvm_id = $storage->id; break; } } } if (!$found_kvm) { $found_kvm_id = (int) str_replace(".", "", str_pad(microtime(true), 15, "0")); $storage_fields['storage_id'] = $found_kvm_id; $storage_fields['storage_name'] = $appliance->name . "-bf"; $storage_fields['storage_type'] = $deployment->id; $storage_fields['storage_comment'] = 'KVM Blockfile Storage Object for Appliance ' . $appliance->name; $storage_fields['storage_resource_id'] = $appliance->resources; $storage_fields['storage_capabilities'] = ''; $storage->add($storage_fields); $event->log("openqrm_kvm_appliance", $_SERVER['REQUEST_TIME'], 5, "openqrm-kvm-appliance-hook.php", "Created KVM Blockfile Storage Object for Appliance " . $appliance_id . "!", "", "", 0, 0, $appliance_id); } else { $event->log("openqrm_kvm_appliance", $_SERVER['REQUEST_TIME'], 5, "openqrm-kvm-appliance-hook.php", "KVM Blockfile Storage Object for Appliance " . $appliance_id . " already existing.", "", "", 0, 0, $appliance_id); } } break; } }
function select() { $head['cr_status']['title'] = $this->lang['cloud_ui_request_status']; $head['cr_id']['title'] = $this->lang['cloud_ui_request_id']; $head['cr_id']['hidden'] = true; $head['cr_appliance_hostname']['title'] = $this->lang['cloud_ui_request_appliance_name']; $head['cr_appliance_hostname']['hidden'] = true; #$head['cr_start']['title'] = $this->lang['cloud_ui_request_start']; #$head['cr_stop']['title'] = $this->lang['cloud_ui_request_stop']; #$head['cr_kernel_id']['title'] = $this->lang['cloud_ui_request_os']; #$head['cr_image_id']['title'] = $this->lang['cloud_ui_request_template']; #$head['cr_resource_type_req']['title'] = $this->lang['cloud_ui_request_system_type']; $head['cr_req']['title'] = ' '; $head['cr_req']['sortable'] = false; #$head['cr_appliance_id']['title'] = $this->lang['cloud_ui_request_appliance_id']; $head['cr_details']['title'] = $this->lang['cloud_ui_request_details']; $head['cr_details']['sortable'] = false; $table = $this->response->html->tablebuilder('cloud_request_table', $this->response->get_array($this->actions_name, 'requests')); $table->css = 'htmlobject_table'; $table->border = 0; $table->id = 'cloud_requests'; $table->head = $head; $table->sort = 'cr_id'; $table->order = 'DESC'; $table->limit = 5; $table->sort_link = false; $table->autosort = false; $table->max = $this->cloudrequest->get_count_per_user($this->clouduser->id); $table->identifier = 'cr_id'; $table->identifier_name = $this->identifier_name; $table->actions = array('deprovision'); $table->actions_name = $this->actions_name; $table->form_action = $this->response->html->thisfile; $table->limit_select = array(array("value" => 5, "text" => 5), array("value" => 10, "text" => 10), array("value" => 20, "text" => 20), array("value" => 30, "text" => 30), array("value" => 40, "text" => 40), array("value" => 50, "text" => 50)); // $table->form_action = $this->response->html->thisfile; $table->init(); $kernel = new kernel(); $image = new image(); $virtualization = new virtualization(); $cloud_request_array = $this->cloudrequest->display_overview_per_user($this->clouduser->id, $table->offset, $table->limit, $table->sort, $table->order); $ta = ''; foreach ($cloud_request_array as $index => $cz) { $this->cloudrequest->get_instance_by_id($cz['cr_id']); $cr_status = $this->cloudrequest->getstatus($this->cloudrequest->id); if (isset($this->cloudrequest->kernel_id)) { $kernel->get_instance_by_id($this->cloudrequest->kernel_id); } if (isset($this->cloudrequest->image_id)) { $image->get_instance_by_id($this->cloudrequest->image_id); } if (isset($this->cloudrequest->resource_type_req)) { $virtualization->get_instance_by_id($this->cloudrequest->resource_type_req); } #echo '<pre>'; #print_r($this->cloudrequest); #echo '</pre>'; // hostname $appliance_hostname = '-'; if (strlen($this->cloudrequest->appliance_hostname)) { $appliance_hostname = $this->cloudrequest->appliance_hostname; } $cr_req = '<b>' . $this->lang['cloud_ui_request_id'] . '</b>: ' . $this->cloudrequest->id . "<br>"; $cr_req .= '<b>' . $this->lang['cloud_ui_request_appliance_name'] . '</b>: ' . $appliance_hostname . "<br>"; $cr_req .= '<b>' . $this->lang['cloud_ui_request_start'] . '</b>: ' . date("d-m-Y H:i", $this->cloudrequest->start) . "<br>"; $cr_req .= '<b>' . $this->lang['cloud_ui_request_stop'] . '</b>: ' . date("d-m-Y H:i", $this->cloudrequest->stop) . "<br>"; $cr_req .= '<b>' . $this->lang['cloud_ui_request_cpu'] . '</b>: ' . $this->cloudrequest->cpu_req . "<br>"; $cr_req .= '<b>' . $this->lang['cloud_ui_request_memory'] . '</b>: ' . $this->cloudrequest->ram_req . " MB<br>"; $cr_req .= '<b>' . $this->lang['cloud_ui_request_disk'] . '</b>: ' . $this->cloudrequest->disk_req . " MB<br>"; $cr_req .= '<b>' . $this->lang['cloud_ui_request_network'] . '</b>: ' . $this->cloudrequest->network_req . "<br>"; // details action $a = $this->response->html->a(); $a->title = $this->lang['cloud_ui_request_components_details']; $a->label = $this->lang['cloud_ui_request_components_details']; $a->handler = 'onclick="javascript:cloudopenPopup(' . $this->cloudrequest->id . ');"'; $a->css = 'edit'; $a->href = '#'; $ta[] = array('cr_status' => $cr_status, 'cr_id' => $this->cloudrequest->id, 'cr_appliance_hostname' => $appliance_hostname, 'cr_req' => $cr_req, 'cr_details' => $a->get_string()); } $table->body = $ta; return $table; }
function get_response() { $response = $this->response; $form = $response->get_form($this->actions_name, 'migrate'); $submit = $form->get_elements('submit'); $submit->handler = 'onclick="wait();"'; $form->add($submit, 'submit'); $submit = $form->get_elements('cancel'); $submit->handler = 'onclick="cancel();"'; $form->add($submit, 'cancel'); $targets = array(); $list = array(); if (isset($this->appliance)) { $list = $this->appliance->get_list(); } foreach ($list as $key => $app) { $appliance = new appliance(); $appliance->get_instance_by_id($app["value"]); // only active appliances if (!strcmp($appliance->state, "active") || $appliance->resources == 0) { $virtualization = new virtualization(); $virtualization->get_instance_by_id($appliance->virtualization); if (!strcmp($virtualization->type, "kvm") && !strstr($virtualization->type, "kvm-vm")) { $resource = new resource(); $resource->get_instance_by_id($appliance->resources); // exclude source host if ($resource->id === $this->resource->id) { continue; } // only active appliances if (!strcmp($resource->state, "active")) { $label = $resource->id . " / " . $resource->ip; $targets[] = array($resource->id, $label); } } } } if (count($targets) >= 1) { $d['target']['label'] = $this->lang['form_target']; $d['target']['required'] = true; $d['target']['object']['type'] = 'htmlobject_select'; $d['target']['object']['attrib']['name'] = 'target'; $d['target']['object']['attrib']['index'] = array(0, 1); $d['target']['object']['attrib']['options'] = $targets; $form->add($d); $response->form = $form; } else { $response->msg = $this->lang['error_no_hosts']; } return $response; }
function action() { $deployment = new deployment(); $deployment_id_array = $deployment->get_deployment_ids(); $info = '<div class="infotext">' . $this->lang['info'] . '</div>'; $storage_link_section = ''; if (isset($this->appliance)) { $resource = new resource(); $resource->get_instance_by_id($this->appliance->resources); $virtualization = new virtualization(); $virtualization->get_instance_by_id($resource->vtype); #$resourceinfo = '<b>Server:</b> '.$this->appliance->id.' / '.$this->appliance->name.'<br>'; $info = '<b>Resource:</b> ' . $resource->id . ' / ' . $resource->ip . ' ' . $resource->hostname . ' - ' . $virtualization->name . '<br><br>' . $info; foreach ($deployment_id_array as $id) { $new_image_link = ''; $deployment->get_instance_by_id($id['deployment_id']); if ($deployment->storagetype != 'none' && $deployment->storagetype != 'local-server') { if (strstr($resource->capabilities, "TYPE=local-server")) { // disable - local-server already has an image and cannot be re-deployed with a differenet one continue; } else { if (strstr($virtualization->type, "-vm-local")) { // get virt plugin name, check if deployment->storagetype == virt plugin name if ($deployment->storagetype === $virtualization->get_plugin_name()) { $new_image_link = $this->response->get_url($this->actions_name, 'load') . '&iplugin=' . $deployment->storagetype; } } else { if (strstr($virtualization->type, "-vm-net")) { // find with image-deployment type hook if deployment is network-deployment $is_network_deployment = false; $rootdevice_identifier_hook = $this->openqrm->get('basedir') . "/web/boot-service/image." . $deployment->type . ".php"; if (file_exists($rootdevice_identifier_hook)) { require_once "{$rootdevice_identifier_hook}"; $image_is_network_deployment_function = "get_" . $deployment->type . "_is_network_deployment"; $image_is_network_deployment_function = str_replace("-", "_", $image_is_network_deployment_function); if ($image_is_network_deployment_function()) { $new_image_link = $this->response->get_url($this->actions_name, 'load') . '&iplugin=' . $deployment->storagetype; } } } else { // $new_image_link = "/openqrm/base/index.php?plugin=".$deployment->storagetype; // same as vm-net // all network deployment types } } } if ($new_image_link !== '') { $storage_link_section .= "<a href='" . $new_image_link . "' style='text-decoration: none'><img title='" . sprintf($this->lang['create_image'], $deployment->description) . "' alt='" . sprintf($this->lang['create_image'], $deployment->description) . "' src='/openqrm/base/plugins/" . $deployment->storagetype . "/img/plugin.png' border=0> " . $deployment->description . "</a><br>"; } } } } else { foreach ($deployment_id_array as $deployment_id) { $deployment->get_instance_by_id($deployment_id['deployment_id']); if ($deployment->storagetype != 'none' && $deployment->storagetype != 'local-server') { #$new_image_link = "/openqrm/base/index.php?plugin=".$deployment->storagetype; $new_image_link = $this->response->get_url($this->actions_name, 'load') . '&iplugin=' . $deployment->storagetype; switch ($deployment->storagetype) { case 'coraid-storage': case 'equallogic-storage': case 'netapp-storage': $new_image_link = "/openqrm/base/index.php?iframe=/openqrm/base/plugins/" . $deployment->storagetype . "/" . $deployment->storagetype . "-manager.php"; break; } $storage_link_section .= "<a href='" . $new_image_link . "' style='text-decoration: none'><img title='" . sprintf($this->lang['create_image'], $deployment->description) . "' alt='" . sprintf($this->lang['create_image'], $deployment->description) . "' src='/openqrm/base/plugins/" . $deployment->storagetype . "/img/plugin.png' border=0> " . $deployment->description . "</a><br>"; } } } if (!strlen($storage_link_section)) { $storage_link_section = $this->lang['start_storage_plugin']; } $t = $this->response->html->template($this->tpldir . '/image-add.tpl.php'); $t->add($storage_link_section, 'image_new'); $t->add($this->lang['label'], 'label'); $t->add($this->lang['title'], 'title'); $t->add($this->openqrm->get('baseurl'), 'baseurl'); $t->add($this->lang['please_wait'], 'please_wait'); $t->add($this->lang['canceled'], 'canceled'); $t->add($this->prefix_tab, 'prefix_tab'); $t->add($info, 'info'); $t->group_elements(array('param_' => 'form')); return $t; }
// list requires : // nothing case 'list': $resource = new resource(); $resource_list = $resource->get_resource_list(); foreach ($resource_list as $resource_l) { foreach ($resource_l as $key => $val) { print "{$key}={$val} "; } print "\n"; } exit(0); // nothing more to do break; case 'add_virtualization_type': $virtualization = new virtualization(); $virtualization_fields["virtualization_id"] = (int) str_replace(".", "", str_pad(microtime(true), 15, "0")); $virtualization->add($virtualization_fields); break; case 'remove_virtualization_type': $virtualization = new virtualization(); $virtualization->remove_by_type($virtualization_type); break; default: $event->log("{$resource_command}", $_SERVER['REQUEST_TIME'], 3, "resource-action", "No such resource command ({$resource_command})", "", "", 0, 0, 0); break; } ?> </body>
function openqrm_hybrid_cloud_monitor() { global $event; global $OPENQRM_SERVER_BASE_DIR; global $OPENQRM_SERVER_IP_ADDRESS; global $OPENQRM_EXEC_PORT; global $openqrm_server; global $BaseDir; global $RootDir; $now = $_SERVER['REQUEST_TIME']; // $event->log("hybrid_cloud_monitor", $_SERVER['REQUEST_TIME'], 2, "hybrid-cloud-monitor-hook", "Hybrid Cloud monitor hook DISABLED for now!!!", "", "", 0, 0, 0); // return; // $event->log("hybrid_cloud_monitor", $_SERVER['REQUEST_TIME'], 5, "hybrid-cloud-monitor-hook", "Hybrid Cloud monitor hook", "", "", 0, 0, 0); $last_stats = $OPENQRM_SERVER_BASE_DIR . "/openqrm/plugins/hybrid-cloud/web/hybrid-cloud-stat/last_statistics"; if (file_exists($last_stats)) { $last_host_stats = file_get_contents($last_stats); $secs_after_last_host_stat = $now - $last_host_stats; if ($secs_after_last_host_stat > 35) { file_put_contents($last_stats, $now); $server = new openqrm_server(); $hc = new hybrid_cloud(); $hc_account_arr = $hc->get_ids(); foreach ($hc_account_arr as $id) { $hc_account_id = $id['hybrid_cloud_id']; $hc->get_instance_by_id($hc_account_id); $hc_authentication = ''; // for every ec2/euca cloud account monitor every configured region if ($hc->account_type == 'aws' || $hc->account_type == 'euca') { $hybrid_cloud_conf = $OPENQRM_SERVER_BASE_DIR . '/openqrm/plugins/hybrid-cloud/etc/openqrm-plugin-hybrid-cloud.conf'; $hybrid_cloud_conf_arr = openqrm_parse_conf($hybrid_cloud_conf); $region_arr = explode(",", $hybrid_cloud_conf_arr['OPENQRM_PLUGIN_HYBRID_CLOUD_REGIONS']); $hc_authentication .= ' -O ' . $hc->access_key; $hc_authentication .= ' -W ' . $hc->secret_key; } // one region for openstack if ($hc->account_type == 'lc-openstack') { $region_arr = array("OpenStack"); $hc_authentication .= ' -u ' . $hc->username; $hc_authentication .= ' -p ' . $hc->password; $hc_authentication .= ' -q ' . $hc->host; $hc_authentication .= ' -x ' . $hc->port; $hc_authentication .= ' -g ' . $hc->tenant; $hc_authentication .= ' -e ' . $hc->endpoint; } foreach ($region_arr as $region) { $event->log("hybrid_cloud_monitor", $_SERVER['REQUEST_TIME'], 5, "hybrid-cloud-monitor-hook", "Hybrid Cloud monitor - checking Cloud statistics for Account " . $hc->account_name . " - " . $region, "", "", 0, 0, 0); $statfile = $OPENQRM_SERVER_BASE_DIR . "/openqrm/plugins/hybrid-cloud/web/hybrid-cloud-stat/" . $hc_account_id . ".instances_statistics.log"; $command = $OPENQRM_SERVER_BASE_DIR . '/openqrm/plugins/hybrid-cloud/bin/openqrm-hybrid-cloud-vm describe --statistics true'; $command .= ' -i ' . $hc->id; $command .= ' -n ' . $hc->account_name; $command .= ' -t ' . $hc->account_type; $command .= ' -ir ' . $region; $command .= $hc_authentication; $command .= ' --openqrm-cmd-mode background'; if (file_exists($statfile)) { unlink($statfile); } $server->send_command($command, NULL, true); while (!file_exists($statfile)) { usleep(10000); clearstatcache(); } $content = file_get_contents($statfile); $content = explode("\n", $content); $b = array(); foreach ($content as $k => $v) { if ($v !== '') { $tmp = explode('@', $v); $name = $tmp[1]; $ami = $tmp[2]; $public_hostname = $tmp[3]; $private_hostname = $tmp[4]; $state = $tmp[5]; $keypair = $tmp[6]; $unknown1 = $tmp[7]; $unknown2 = $tmp[8]; $type = $tmp[9]; $date = $tmp[10]; $region = $tmp[11]; $unknown4 = $tmp[12]; $unknown5 = $tmp[13]; $unknown6 = $tmp[14]; $monitoring = $tmp[15]; $public_ip = $hc->format_ip_address($tmp[16]); $private_ip = $hc->format_ip_address($tmp[17]); $unknown7 = $tmp[18]; $unknown8 = $tmp[19]; $store = $tmp[20]; $unknown9 = $tmp[21]; $unknown10 = $tmp[22]; $unknown11 = $tmp[23]; $unknown12 = $tmp[24]; $hvm = $tmp[25]; $virt_type = $tmp[26]; $mac = ''; // check for idle instances $resource = new resource(); if ($state == 'idle') { $mac = $tmp[30]; $resource->get_instance_by_mac($mac); $resource_fields["resource_state"] = 'active'; $resource_fields["resource_lastgood"] = $now; $resource_fields["resource_cpunumber"] = $hc->translate_resource_components('cpu', $type); $resource_fields["resource_nics"] = $hc->translate_resource_components('net', $type); $resource_fields["resource_memtotal"] = $hc->translate_resource_components('mem', $type); $resource_fields["resource_memused"] = "0"; $resource_fields["resource_load"] = "0"; // restore mgmt ip $resource_fields["resource_ip"] = $resource->network; $resource->update_info($resource->id, $resource_fields); } else { if ($state == 'running') { // check if existing, if not auto-create resource, image and appliance if ($resource->exists_by_name($name)) { // update stats $resource->get_instance_id_by_hostname($name); $resource->get_instance_by_id($resource->id); $resource_fields["resource_state"] = 'active'; $resource_fields["resource_lastgood"] = $now; $resource_fields["resource_cpunumber"] = $hc->translate_resource_components('cpu', $type); $resource_fields["resource_nics"] = $hc->translate_resource_components('net', $type); $resource_fields["resource_memtotal"] = $hc->translate_resource_components('mem', $type); $resource_fields["resource_memused"] = $resource_fields["resource_memtotal"]; $resource_fields["resource_load"] = "1"; if (strlen($public_ip) && $resource->ip != $public_ip) { // set public ip, update early and run nagios hook $resource_fields["resource_ip"] = $public_ip; $resource->update_info($resource->id, $resource_fields); // nagios enabled and started ? if (file_exists($RootDir . "/plugins/nagios3/.running")) { $virtualization = new virtualization(); $virtualization->get_instance_by_type("hybrid-cloud-vm-local"); $hc_appliance = new appliance(); $hc_appliance->get_instance_by_virtualization_and_resource($virtualization->id, $resource->id); if (strlen($hc_appliance->name)) { // special nagios classes require_once $RootDir . "/plugins/nagios3/class/nagios3_service.class.php"; require_once $RootDir . "/plugins/nagios3/class/nagios3_host.class.php"; // get the nagios service checks $nagios_host = new nagios3_host(); $nagios_host->get_instance_by_appliance_id($hc_appliance->id); $active_nagios_services = explode(',', $nagios_host->appliance_services); $nagios_service_list = ''; foreach ($active_nagios_services as $service_id) { $nagios_service = new nagios3_service(); $nagios_service->get_instance_by_id($service_id); $nagios_service_list = $nagios_service_list . "," . $nagios_service->port; } $nagios_service_list = substr($nagios_service_list, 1); if (strlen($nagios_service_list)) { // appliance has nagios service checks configured $nagios_appliance_stop_cmd = $OPENQRM_SERVER_BASE_DIR . "/openqrm/plugins/nagios3/bin/openqrm-nagios-manager remove_host -n " . $hc_appliance->name . " --openqrm-cmd-mode background"; $server->send_command($nagios_appliance_stop_cmd, NULL, true); sleep(2); $nagios_appliance_start_cmd = $OPENQRM_SERVER_BASE_DIR . "/openqrm/plugins/nagios3/bin/openqrm-nagios-manager add -n " . $hc_appliance->name . " -i " . $public_ip . " -p " . $nagios_service_list . " --openqrm-cmd-mode background"; $server->send_command($nagios_appliance_start_cmd, NULL, true); } } } // nagios finished } $resource->update_info($resource->id, $resource_fields); } else { // through error for now $event->log("hybrid_cloud_monitor", $_SERVER['REQUEST_TIME'], 5, "hybrid-cloud-monitor-hook", "New Resource detected with name " . $name . "!", "", "", 0, 0, 0); } } } } } unlink($statfile); } } } } else { file_put_contents($last_stats, $now); } }
function get_response() { $response = $this->response; $form = $response->get_form($this->actions_name, 'step4'); $resource = new resource(); $resource->get_instance_by_id($this->appliance->resources); // if not openQRM resource if ($resource->id != 0) { $virtualization = new virtualization(); $virtualization->get_instance_by_id($resource->vtype); } $image = new image(); $image->get_instance_by_id($this->appliance->imageid); $deployment = new deployment(); $deployment->get_instance_by_type($image->type); $submit = $form->get_elements('submit'); $submit->handler = 'onclick="wait();"'; $form->add($submit, 'submit'); $submit = $form->get_elements('cancel'); $submit->handler = 'onclick="cancel();"'; $form->add($submit, 'cancel'); $kernel = new kernel(); $list = $kernel->get_list(); unset($list[0]); $kernels = array(); if ($resource->id == 0) { $kernels[] = array(0, 'openQRM'); } else { if (strstr($resource->capabilities, "TYPE=local-server")) { $local_kernel = new kernel(); $local_kernel->get_instance_by_name("resource" . $resource->id); $kernels[] = array($local_kernel->id, 'Local OS Installation'); // local-deployment VMs } else { if (strstr($virtualization->type, "-vm-local")) { $kernels[] = array(1, 'Local OS Installation'); // network-deployment - show only network-boot images } else { if (strstr($virtualization->type, "-vm-net")) { foreach ($list as $value) { $id = $value['value']; $kernel->get_instance_by_id($id); if (!strstr($kernel->capabilities, "TYPE=local-server")) { $kernels[] = array($id, $kernel->id . ' / ' . $kernel->name . ' (' . $kernel->version . ')'); } } // network deployment - physical systems - show only network-boot images } else { foreach ($list as $value) { $id = $value['value']; $kernel->get_instance_by_id($id); if (!strstr($kernel->capabilities, "TYPE=local-server")) { $kernels[] = array($id, $kernel->id . ' / ' . $kernel->name . ' (' . $kernel->version . ')'); } } } } } } $d['kernel']['label'] = $this->lang['form_kernel']; $d['kernel']['required'] = true; $d['kernel']['object']['type'] = 'htmlobject_select'; $d['kernel']['object']['attrib']['index'] = array(0, 1); $d['kernel']['object']['attrib']['id'] = 'kernel'; $d['kernel']['object']['attrib']['name'] = 'kernel'; $d['kernel']['object']['attrib']['options'] = $kernels; $form->add($d); $response->form = $form; return $response; }