Example #1
0
 public function preDelete(PropelPDO $con = null)
 {
     /*
      * delete lvs that are not shared....numVgs=1 only
      *
      */
     $criteria = new Criteria();
     $criteria->add(EtvaLogicalvolumePeer::CLUSTER_ID, $this->getClusterId());
     $criteria->addGroupByColumn(EtvaNodeLogicalvolumePeer::LOGICALVOLUME_ID);
     $criteria->addAsColumn('numLvs', 'COUNT(' . EtvaNodeLogicalvolumePeer::LOGICALVOLUME_ID . ')');
     $criteria->addHaving($criteria->getNewCriterion(EtvaNodeLogicalvolumePeer::LOGICALVOLUME_ID, 'numLvs=1', Criteria::CUSTOM));
     $records = EtvaNodeLogicalvolumePeer::doSelectJoinEtvaLogicalvolume($criteria);
     foreach ($records as $record) {
         $etva_lv = $record->getEtvaLogicalvolume();
         if ($record->getNodeId() == $this->getId()) {
             $etva_lv->delete();
         }
     }
     /*
      * delete vgs that are not shared....numVgs=1 only
      *
      */
     $criteria = new Criteria();
     $criteria->add(EtvaVolumegroupPeer::CLUSTER_ID, $this->getClusterId());
     $criteria->addGroupByColumn(EtvaNodeVolumegroupPeer::VOLUMEGROUP_ID);
     $criteria->addAsColumn('numVgs', 'COUNT(' . EtvaNodeVolumegroupPeer::VOLUMEGROUP_ID . ')');
     $criteria->addHaving($criteria->getNewCriterion(EtvaNodeVolumegroupPeer::VOLUMEGROUP_ID, 'numVgs=1', Criteria::CUSTOM));
     $records = EtvaNodeVolumegroupPeer::doSelectJoinEtvaVolumegroup($criteria);
     foreach ($records as $record) {
         $etva_vg = $record->getEtvaVolumegroup();
         if ($record->getNodeId() == $this->getId()) {
             $etva_vg->delete();
         }
     }
     /*
      * delete pvs that are not shared....numVgs=1 only
      *
      */
     $criteria = new Criteria();
     $criteria->add(EtvaPhysicalvolumePeer::CLUSTER_ID, $this->getClusterId());
     $criteria->addGroupByColumn(EtvaNodePhysicalvolumePeer::PHYSICALVOLUME_ID);
     $criteria->addAsColumn('numPvs', 'COUNT(' . EtvaNodePhysicalvolumePeer::PHYSICALVOLUME_ID . ')');
     $criteria->addHaving($criteria->getNewCriterion(EtvaNodePhysicalvolumePeer::PHYSICALVOLUME_ID, 'numPvs=1', Criteria::CUSTOM));
     $records = EtvaNodePhysicalvolumePeer::doSelectJoinEtvaPhysicalvolume($criteria);
     foreach ($records as $record) {
         $etva_pv = $record->getEtvaPhysicalvolume();
         if ($record->getNodeId() == $this->getId()) {
             $etva_pv->delete();
         }
     }
     // delete rra node dir and cpu load rrd
     $this->deleteRRAFiles();
     return true;
 }
Example #2
0
 public function get_sync_logicalvolumes($force_sync = false, $sharedonly = false)
 {
     $elements = array();
     $criteria = new Criteria();
     $criteria->add(EtvaNodeLogicalvolumePeer::NODE_ID, $this->etva_node->getId());
     $db_node_lvs = EtvaNodeLogicalvolumePeer::doSelectJoinEtvaLogicalvolume($criteria);
     $force_flag = $force_sync ? 1 : 0;
     $response_lvs = $this->etva_node->soapSend(EtvaLogicalvolume_VA::GET_SYNC_LOGICALVOLUMES, array('force' => $force_flag));
     if ($response_lvs['success']) {
         $lvs = $response_lvs['response'];
         foreach ($lvs as $k => $e) {
             $lv_e = (array) $e;
             if (!$sharedonly || $lv_e[EtvaLogicalvolume::STORAGE_TYPE_MAP] != EtvaLogicalvolume::STORAGE_TYPE_LOCAL_MAP) {
                 $found = false;
                 foreach ($db_node_lvs as $data) {
                     $lv = $data->getEtvaLogicalvolume();
                     if ($lv_e[EtvaLogicalvolume::STORAGE_TYPE_MAP] == $lv->getStorageType()) {
                         if ($lv->getUuid() && $lv_e[EtvaLogicalvolume::UUID_MAP]) {
                             if ($lv->getUuid() == $lv_e[EtvaLogicalvolume::UUID_MAP]) {
                                 $found = true;
                             }
                         } else {
                             if ($lv->getLvdevice() == $lv_e[EtvaLogicalvolume::LVDEVICE_MAP]) {
                                 $found = true;
                             }
                         }
                     }
                 }
                 $etva_lv = new EtvaLogicalvolume();
                 $etva_volgroup = new EtvaVolumegroup();
                 $etva_volgroup->initData((array) $lv_e[EtvaLogicalvolume::VOLUMEGROUP_MAP]);
                 /*$vg_ar = $lv_e[EtvaLogicalvolume::VOLUMEGROUP_MAP];
                   $vg_type = $vg_ar[EtvaVolumegroup::STORAGE_TYPE_MAP];
                   $vg_uuid = $vg_ar[EtvaVolumegroup::UUID_MAP];
                   $vg_name = $vg_ar[EtvaVolumegroup::VG_MAP];
                   $etva_volgroup = EtvaVolumegroupPeer::retrieveByNodeTypeUUIDVg($this->etva_node->getId(), $vg_type, $vg_uuid, $vg_name);*/
                 $etva_lv->initData($lv_e);
                 $etva_lv->setEtvaVolumegroup($etva_volgroup);
                 $arr_e = $etva_lv->_VA();
                 $arr_e['registered'] = $found;
                 $elements[] = $arr_e;
             }
         }
     }
     foreach ($db_node_lvs as $data) {
         $lv = $data->getEtvaLogicalvolume();
         if (!$sharedonly || $lv->getStorageType() != EtvaLogicalvolume::STORAGE_TYPE_LOCAL_MAP) {
             $found = false;
             foreach ($lvs as $k => $e) {
                 $lv_e = (array) $e;
                 if ($lv_e[EtvaLogicalvolume::STORAGE_TYPE_MAP] == $lv->getStorageType()) {
                     if ($lv->getUuid() && $lv_e[EtvaLogicalvolume::UUID_MAP]) {
                         if ($lv->getUuid() == $lv_e[EtvaLogicalvolume::UUID_MAP]) {
                             $found = true;
                         }
                     } else {
                         if ($lv->getLvdevice() == $lv_e[EtvaLogicalvolume::LVDEVICE_MAP]) {
                             $found = true;
                         }
                     }
                 }
             }
             if (!$found) {
                 $arr_e = $lv->_VA();
                 $arr_e['inconsistent'] = true;
                 $arr_e['registered'] = true;
                 $elements[] = $arr_e;
             }
         }
     }
     return $elements;
 }
Example #3
0
 /**
  * Return pre-formatted data for tree-column extjs
  *
  * $request may contain the following keys:
  * - nid: nid (virtAgent node ID)
  * @return array json array
  */
 public function executeJsonLvsTree(sfWebRequest $request)
 {
     $lvs = array();
     $etva_node = EtvaNodePeer::retrieveByPK($request->getParameter('nid'));
     if (!$etva_node) {
         $msg_i18n = $this->getContext()->getI18N()->__('No data found');
         $lvs[] = array('expanded' => true, 'text' => $msg_i18n, 'qtip' => $msg_i18n, 'leaf' => true);
         $return = json_encode($lvs);
         $this->getResponse()->setHttpHeader('Content-type', 'application/json');
         return $this->renderText($return);
     }
     $criteria = new Criteria();
     //$node_lvs = $etva_node->getEtvaLogicalvolumes($criteria);
     $criteria->add(EtvaNodeLogicalvolumePeer::NODE_ID, $request->getParameter('nid'));
     $criteria->addAnd(EtvaLogicalvolumePeer::LV, 'etva-isos', Criteria::NOT_EQUAL);
     $criteria->addAnd(EtvaLogicalvolumePeer::LV, 'etva_isos', Criteria::NOT_EQUAL);
     $criteria->addAnd(EtvaLogicalvolumePeer::LV, 'etvaisos', Criteria::NOT_EQUAL);
     //$criteria->addJoin(EtvaNodeLogicalvolumePeer::LOGICALVOLUME_ID, EtvaLogicalvolumePeer::ID);
     $criteria->addAscendingOrderByColumn(EtvaLogicalvolumePeer::LV);
     $node_data_lvs = EtvaNodeLogicalvolumePeer::doSelectJoinEtvaLogicalvolume($criteria);
     //$node_data_lvs = EtvaLogicalvolumePeer::doSelect($criteria);
     $snapshots = array();
     foreach ($node_data_lvs as $data_lv) {
         $etva_lv = $data_lv->getEtvaLogicalvolume();
         $vm_name = '';
         $vm_state = '';
         $etva_vg = $etva_lv->getEtvaVolumegroup();
         $etva_server = $etva_lv->getEtvaServer();
         if ($etva_server) {
             $vm_name = $etva_server->getName();
             $vm_state = $etva_server->getVmState();
         }
         //check data consistency....should be fine
         if ($etva_vg) {
             $id = $etva_lv->getId();
             $text = $etva_lv->getLv();
             $disabled = false;
             if ($etva_lv->getInUse()) {
                 $qtip = $this->getContext()->getI18N()->__(EtvaLogicalvolumePeer::_ERR_INUSE_, array('%name%' => $text, '%server%' => $vm_name));
             } else {
                 if ($etva_lv->getMounted()) {
                     $qtip = $this->getContext()->getI18N()->__(EtvaLogicalvolumePeer::_ERR_SYSTEM_LV_, array('%name%' => $text));
                     $disabled = true;
                 } else {
                     if ($etva_lv->getSnapshotNodeId() && $etva_lv->getSnapshotNodeId() != $etva_node->getId()) {
                         $qtip = $this->getContext()->getI18N()->__(EtvaLogicalvolumePeer::_SNAPSHOT_INOTHERNODE_, array('%name%' => $text));
                         $disabled = true;
                     } else {
                         if ($etva_lv->getSnapshot()) {
                             $qtip = $this->getContext()->getI18N()->__(EtvaLogicalvolumePeer::_SNAPSHOT_LV_, array('%name%' => $text));
                             #$disabled = true;
                         } else {
                             if ($etva_lv->getInconsistent() || $data_lv->getInconsistent()) {
                                 $qtip = $this->getContext()->getI18N()->__('Inconsistent');
                                 $disabled = true;
                             } else {
                                 $qtip = $this->getContext()->getI18N()->__(EtvaLogicalvolumePeer::_NOTINUSE_, array('%name%' => $text));
                             }
                         }
                     }
                 }
             }
             $pretty_size = $etva_lv->getSize();
             $size = $etva_lv->getSize();
             $vg = $etva_vg->getVg();
             $vg_size = $etva_vg->getSize();
             $vg_freesize = $etva_vg->getFreesize();
             $cls = 'lv';
             if ($etva_lv->getSnapshot()) {
                 $snapshots[] = array('id' => $id, 'cls' => $cls, 'iconCls' => 'task', 'text' => $text, 'size' => $size, 'prettysize' => $pretty_size, 'vgsize' => $vg_size, 'singleClickExpand' => true, 'type' => 'lv-snapshot', 'vg' => $vg, 'vgfreesize' => $vg_freesize, 'snapshot' => $etva_lv->getSnapshot(), 'vm_state' => $vm_state, 'disabled' => $disabled, 'origin' => $etva_lv->getOrigin(), 'format' => $etva_lv->getFormat(), 'storagetype' => $etva_vg->getStorageType(), 'snapshot_node_id' => $etva_lv->getSnapshotNodeId(), 'inconsistent' => $etva_lv->getInconsistent() || $data_lv->getInconsistent(), 'vm_name' => $vm_name, 'qtip' => $qtip, 'leaf' => true);
             } else {
                 $per_usage = $etva_lv->getVirtualSize() / $etva_lv->getSize();
                 $lv_iconCls = 'devices-folder';
                 if ($etva_lv->getPerUsageSnapshots() >= EtvaLogicalvolume::PER_USAGESNAPSHOTS_CRITICAL) {
                     $lv_iconCls = 'devices-folder-error';
                 }
                 $lvs[] = array('id' => $id, 'cls' => $cls, 'iconCls' => $lv_iconCls, 'text' => $text, 'size' => $size, 'prettysize' => $pretty_size, 'vgsize' => $vg_size, 'singleClickExpand' => true, 'type' => 'lv', 'vg' => $vg, 'vgfreesize' => $vg_freesize, 'format' => $etva_lv->getFormat(), 'storagetype' => $etva_vg->getStorageType(), 'vm_state' => $vm_state, 'disabled' => $disabled, 'inconsistent' => $etva_lv->getInconsistent() || $data_lv->getInconsistent(), 'virtual_size' => $etva_lv->getVirtualSize(), 'size_snapshots' => $etva_lv->getSizeSnapshots(), 'per_usage' => $per_usage, 'per_usage_snapshots' => $etva_lv->getPerUsageSnapshots(), 'vm_name' => $vm_name, 'qtip' => $qtip, 'leaf' => true);
             }
         }
     }
     foreach ($snapshots as $sn) {
         for ($i = 0; $i < sizeof($lvs); $i++) {
             if ($sn['vg'] == $lvs[$i]['vg'] && $sn['origin'] == $lvs[$i]['text']) {
                 $lvs[$i]['leaf'] = false;
                 $lvs[$i]['expanded'] = true;
                 $lvs[$i]['children'][] = $sn;
                 $lvs[$i]['havesnapshots'] = true;
                 if ($sn['vm_name']) {
                     $lvs[$i]['havesnapshots_inuse'] = true;
                 }
                 if ($sn['vm_state'] == 'running') {
                     $lvs[$i]['havesnapshots_inuse_inrunningvm'] = true;
                 }
                 if ($sn['snapshot_node_id']) {
                     $lvs[$i]['snapshot_node_id'];
                 }
                 if ($sn['snapshot_node_id'] && $sn['snapshot_node_id'] != $etva_node->getId()) {
                     $lvs[$i]['qtip'] = $this->getContext()->getI18N()->__(EtvaLogicalvolumePeer::_LV_HAVESNAPSHOTS_INOTHERNODE_, array('%name%' => $lvs[$i]['text']));
                     $lvs[$i]['disabled'] = true;
                 }
             }
         }
     }
     //$return = json_encode(array(array('text'=>'Lvs','expanded'=>true,'children'=>$lvs)));
     if (empty($lvs)) {
         $msg_i18n = $this->getContext()->getI18N()->__('No data found');
         $lvs[] = array('expanded' => true, 'text' => $msg_i18n, 'qtip' => $msg_i18n, 'leaf' => true);
     }
     $return = json_encode($lvs);
     $this->getResponse()->setHttpHeader('Content-type', 'application/json');
     return $this->renderText($return);
 }
 public function check_consistency(EtvaNode $etva_node, $sync_node_lvs, $sync_node_dtable, $sync_bulk_dtable)
 {
     $errors = array();
     $etva_node->getId();
     $etva_cluster = $etva_node->getEtvaCluster();
     // get node database LVs
     $node_lvs = $etva_node->getEtvaLogicalvolumes();
     $node_inconsistent = 0;
     foreach ($node_lvs as $lv) {
         $error = array();
         $uuid = $lv->getUuid();
         $device = $lv->getLvdevice();
         $etva_vg = $lv->getEtvaVolumegroup();
         $vgname = $etva_vg->getVg();
         $is_FileDiskVG = $vgname == sfConfig::get('app_volgroup_disk_flag') ? true : false;
         // init
         $inconsistent = 0;
         // look at logical volumes list
         $found_lvm = 0;
         foreach ($sync_node_lvs as $hlv) {
             $arr_hlv = (array) $hlv;
             if ($arr_hlv[EtvaLogicalvolume::STORAGE_TYPE_MAP] == $lv->getStorageType()) {
                 if ($arr_hlv[EtvaLogicalvolume::UUID_MAP]) {
                     if ($arr_hlv[EtvaLogicalvolume::UUID_MAP] == $uuid) {
                         $found_lvm = 1;
                     }
                 } else {
                     if ($arr_hlv[EtvaLogicalvolume::LVDEVICE_MAP] == $device) {
                         $found_lvm = 1;
                     }
                 }
             }
         }
         $inconsistent = $inconsistent || !$found_lvm;
         if (!$found_lvm) {
             $error['not_found_lvm'] = 1;
         }
         if (!$is_FileDiskVG) {
             // if not file disk volume
             // look at devices table
             $clvdev = $device;
             $clvdev = str_replace("/dev/", "", $clvdev);
             $clvdev = str_replace("-", "--", $clvdev);
             $clvdev = str_replace("/", "-", $clvdev);
             $re_clvdev = "/" . $clvdev . ":/";
             // found device table of node
             $node_lv_dtable_aux = preg_grep($re_clvdev, $sync_node_dtable);
             // ignore snapshots
             $node_lv_dtable = preg_grep("/(?:(?! snapshot ).)/", $node_lv_dtable_aux);
             // check if found
             $found_node_dt = empty($node_lv_dtable) ? 0 : 1;
             $inconsistent = $inconsistent || !$found_node_dt;
             if (!$found_node_dt) {
                 $error['not_found_node_device_table'] = 1;
             }
         }
         // update data-base
         $etva_logicalvol = EtvaLogicalvolumePeer::retrieveByNodeTypeUUIDLv($etva_node->getId(), $lv->getStorageType(), $lv->getUuid(), $lv->getLv());
         if ($etva_logicalvol) {
             $etva_logicalvol->setInconsistent($inconsistent);
             $etva_logicalvol->save();
         }
         $etva_node_logicalvol = EtvaNodeLogicalvolumePeer::retrieveByPK($etva_node->getId(), $lv->getId());
         if ($etva_node_logicalvol) {
             $etva_node_logicalvol->setInconsistent($inconsistent);
             $etva_node_logicalvol->save();
         }
         if ($inconsistent) {
             $message = sfContext::getInstance()->getI18N()->__(EtvaLogicalvolumePeer::_ERR_INCONSISTENT_, array('%info%' => sprintf('device "%s" with uuid "%s"', $lv->getLvdevice(), $lv->getUuid())));
             sfContext::getInstance()->getEventDispatcher()->notify(new sfEvent($etva_node->getName(), 'event.log', array('message' => $message, 'priority' => EtvaEventLogger::ERR)));
             $error['node'] = array('name' => $etva_node->getName(), 'id' => $etva_node->getId(), 'uuid' => $etva_node->getUuid());
             $error['device'] = $lv->getLvdevice();
             $error['uuid'] = $lv->getUuid();
             $error['message'] = $message;
         }
         if (!empty($error)) {
             $errors[] = $error;
         }
         $node_inconsistent = $node_inconsistent || $inconsistent;
     }
     // get shared database LVs
     $shared_lvs = $etva_cluster->getSharedLvs();
     // check consistency for shared LVs
     foreach ($shared_lvs as $lv) {
         $error = array();
         $uuid = $lv->getUuid();
         $device = $lv->getLvdevice();
         $etva_vg = $lv->getEtvaVolumegroup();
         $vgname = $etva_vg->getVg();
         // init
         $inconsistent = 0;
         // look at logical volumes list
         $found_lvm = 0;
         foreach ($sync_node_lvs as $hlv) {
             $arr_hlv = (array) $hlv;
             if ($arr_hlv[EtvaLogicalvolume::STORAGE_TYPE_MAP] == $lv->getStorageType()) {
                 if (isset($arr_hlv[EtvaLogicalvolume::UUID_MAP])) {
                     if ($arr_hlv[EtvaLogicalvolume::UUID_MAP] == $uuid) {
                         $found_lvm = 1;
                     }
                 } else {
                     if ($arr_hlv[EtvaLogicalvolume::LVDEVICE_MAP] == $device) {
                         $found_lvm = 1;
                     }
                 }
             }
         }
         $inconsistent = $inconsistent || !$found_lvm;
         if (!$found_lvm) {
             $error['not_found_lvm'] = 1;
         }
         // look at devices table
         $clvdev = $device;
         $clvdev = str_replace("/dev/", "", $clvdev);
         $clvdev = str_replace("-", "--", $clvdev);
         $clvdev = str_replace("/", "-", $clvdev);
         $re_clvdev = "/" . $clvdev . ":/";
         // found device table of node
         $node_lv_dtable_aux = preg_grep($re_clvdev, $sync_node_dtable);
         // ignore snapshots
         $node_lv_dtable = preg_grep("/(?:(?! snapshot ).)/", $node_lv_dtable_aux);
         // check if found
         $found_node_dt = empty($node_lv_dtable) ? 0 : 1;
         $inconsistent = $inconsistent || !$found_node_dt;
         if (!$found_node_dt) {
             $error['not_found_node_device_table'] = 1;
         }
         // look at all nodes devices table
         $found_all_nodes_dt = 1;
         foreach ($sync_bulk_dtable as $e_id => $e_response) {
             if ($e_response['success']) {
                 //response received ok
                 $dtable = (array) $e_response['response'];
                 // found device table of node
                 $lv_dtable = preg_grep($re_clvdev, $dtable);
                 $found = empty($lv_dtable) ? 0 : 1;
                 $is_eq = count($lv_dtable) == count($node_lv_dtable) ? 1 : 0;
                 if ($is_eq) {
                     foreach ($lv_dtable as $e_line) {
                         // TODO fix this
                         if (!in_array($e_line, $node_lv_dtable)) {
                             $is_eq = 0;
                         }
                     }
                 }
                 $found_all_nodes_dt = $found_all_nodes_dt && $found && $is_eq;
             }
         }
         $inconsistent = $inconsistent || !$found_all_nodes_dt;
         if (!$found_all_nodes_dt) {
             $error['not_found_all_nodes_device_table'] = 1;
         }
         // update data-base
         $etva_logicalvol = EtvaLogicalvolumePeer::retrieveByNodeTypeUUIDLv($etva_node->getId(), $lv->getStorageType(), $lv->getUuid(), $lv->getLv());
         if ($etva_logicalvol) {
             $etva_logicalvol->setInconsistent($inconsistent);
             $etva_logicalvol->save();
         }
         $etva_node_logicalvol = EtvaNodeLogicalvolumePeer::retrieveByPK($etva_node->getId(), $lv->getId());
         if ($etva_node_logicalvol) {
             $etva_node_logicalvol->setInconsistent($inconsistent);
             $etva_node_logicalvol->save();
         }
         if ($inconsistent) {
             $message = sfContext::getInstance()->getI18N()->__(EtvaLogicalvolumePeer::_ERR_SHARED_INCONSISTENT_, array('%info%' => sprintf('device "%s" with uuid "%s"', $lv->getLvdevice(), $lv->getUuid())));
             sfContext::getInstance()->getEventDispatcher()->notify(new sfEvent($etva_node->getName(), 'event.log', array('message' => $message, 'priority' => EtvaEventLogger::ERR)));
             $error['node'] = array('name' => $etva_node->getName(), 'id' => $etva_node->getId(), 'uuid' => $etva_node->getUuid());
             $error['device'] = $lv->getLvdevice();
             $error['uuid'] = $lv->getUuid();
             $error['message'] = $message;
         }
         if (!empty($error)) {
             $errors[] = $error;
         }
         $node_inconsistent = $node_inconsistent || $inconsistent;
     }
     $return = array();
     if ($node_inconsistent) {
         $etva_node->setErrorMessage(self::LVINIT);
         $return = array('success' => false, 'errors' => $errors);
     } else {
         $etva_node->clearErrorMessage(self::LVINIT);
         $return = array('success' => true);
     }
     return $return;
 }