function buildVSMigratePlan($new_vs_id, $vs_id_list) { $ret = array('properties' => array('vsconfig' => '', 'rsconfig' => ''), 'ports' => array(), 'vips' => array(), 'triplets' => array(), 'messages' => array()); $config_stat = array('vsconfig' => array(), 'rsconfig' => array()); $gt = array(); // grouped triplets foreach ($vs_id_list as $vs_id) { $vsinfo = spotEntity('ipv4vs', $vs_id); // create nesessary vips and ports if ($vsinfo['proto'] != 'MARK') { $vip_key = $vsinfo['vip_bin']; $port_key = $vsinfo['proto'] . '-' . $vsinfo['vport']; $ret['vips'][$vip_key] = array('vip' => $vsinfo['vip_bin'], 'vsconfig' => '', 'rsconfig' => ''); $ret['ports'][$port_key] = array('proto' => $vsinfo['proto'], 'vport' => $vsinfo['vport'], 'vsconfig' => '', 'rsconfig' => ''); } else { $vip_key = ''; $mark = implode('', unpack('N', $vsinfo['vip_bin'])); $port_key = $vsinfo['proto'] . '-' . $mark; $ret['ports'][$port_key] = array('proto' => $vsinfo['proto'], 'vport' => $mark, 'vsconfig' => '', 'rsconfig' => ''); } // fill triplets foreach (SLBTriplet::getTriplets($vsinfo) as $triplet) { $tr_key = $triplet->lb['id'] . '-' . $triplet->rs['id']; if (!isset($ret['triplets'][$tr_key])) { $ret['triplets'][$tr_key] = array('object_id' => $triplet->lb['id'], 'rspool_id' => $triplet->rs['id'], 'vs_id' => $new_vs_id, 'vips' => array(), 'ports' => array()); } $configs = array('vsconfig' => tokenizeConfig($triplet->vs['vsconfig'] . "\n" . $triplet->slb['vsconfig']), 'rsconfig' => tokenizeConfig($triplet->vs['rsconfig'] . "\n" . $triplet->slb['rsconfig'])); if ($vsinfo['proto'] != 'MARK') { if (!isset($ret['triplets'][$tr_key]['ports'][$port_key])) { $ret['triplets'][$tr_key]['ports'][$port_key] = array('proto' => $vsinfo['proto'], 'vport' => $vsinfo['vport'], 'vsconfig' => '', 'rsconfig' => ''); } if (!isset($ret['triplets'][$tr_key]['vips'][$vip_key])) { $ret['triplets'][$tr_key]['vips'][$vip_key] = array('vip' => $vsinfo['vip_bin'], 'prio' => NULL, 'vsconfig' => '', 'rsconfig' => ''); } if ('' != $triplet->slb['prio']) { $ret['triplets'][$tr_key]['vips'][$vip_key]['prio'] = $triplet->slb['prio']; } } else { $ret['triplets'][$tr_key]['ports'][$port_key] = array('proto' => $vsinfo['proto'], 'vport' => $mark, 'vsconfig' => '', 'rsconfig' => ''); } $old_tr_key = $tr_key . '-' . $vip_key . '-' . $port_key; $gt['all'][$old_tr_key] = $triplet; $gt['ports'][$port_key][$old_tr_key] = $triplet; $gt['vips'][$vip_key][$old_tr_key] = $triplet; $gt['vip_links'][$tr_key][$vip_key][$old_tr_key] = $triplet; $gt['port_links'][$tr_key][$port_key][$old_tr_key] = $triplet; foreach ($configs as $conf_type => $list) { foreach ($list as $line) { $config_stat[$conf_type][$line][$old_tr_key] = $triplet; } } } } // reduce common config lines and move them from $config_stat into $ret foreach ($config_stat as $conf_type => $stat) { foreach ($stat as $line => $used_in_triplets) { $added_to_triplets = array(); $wrong_triplets = array(); if (!array_sub($gt['all'], $used_in_triplets)) { // line used in all triplets concatConfig($ret['properties'][$conf_type], $line); continue; } foreach ($gt['ports'] as $port_key => $port_triplets) { $diff = array_sub($port_triplets, $used_in_triplets); if (count($diff) < count($port_triplets) / 2) { // line used in most triplets of this port $added_to_triplets += $port_triplets; $wrong_triplets += $diff; concatConfig($ret['ports'][$port_key][$conf_type], $line); } } foreach ($gt['vips'] as $vip_key => $vip_triplets) { if (!array_sub($vip_triplets, $used_in_triplets)) { if (count($vip_triplets) == count(array_sub($vip_triplets, $added_to_triplets))) { // if none of the $vip_triplets are in $added_to_triplets, // line used in all triplets of this vip $added_to_triplets += $vip_triplets; concatConfig($ret['vips'][$vip_key][$conf_type], $line); } } } foreach ($used_in_triplets as $old_tr_key => $triplet) { if (isset($added_to_triplets[$old_tr_key])) { continue; } $tr_key = $triplet->lb['id'] . '-' . $triplet->rs['id']; if ($triplet->vs['proto'] != 'MARK') { $vip_key = $triplet->vs['vip_bin']; $port_key = $triplet->vs['proto'] . '-' . $triplet->vs['vport']; } else { $vip_key = ''; $port_key = $triplet->vs['proto'] . '-' . implode('', unpack('N', $triplet->vs['vip_bin'])); } // if all the triplets for a given port contain line, add it to the ports' config if (!array_sub($gt['port_links'][$tr_key][$port_key], $used_in_triplets)) { if (count($gt['port_links'][$tr_key][$port_key]) == count(array_sub($gt['port_links'][$tr_key][$port_key], $added_to_triplets))) { $added_to_triplets += $gt['port_links'][$tr_key][$port_key]; concatConfig($ret['triplets'][$tr_key]['ports'][$port_key][$conf_type], $line); } } // if all the triplets for a given vip contain line, add it to the vips' config if ($vip_key != '') { if (!array_sub($gt['vip_links'][$tr_key][$vip_key], $used_in_triplets)) { if (count($gt['vip_links'][$tr_key][$vip_key]) == count(array_sub($gt['vip_links'][$tr_key][$vip_key], $added_to_triplets))) { $added_to_triplets += $gt['vip_links'][$tr_key][$vip_key]; concatConfig($ret['triplets'][$tr_key]['vips'][$vip_key][$conf_type], $line); } } } } // check for failed-to-insert lines foreach (array_sub($used_in_triplets, $added_to_triplets) as $old_tr_key => $unused_triplet) { $ret['messages'][$old_tr_key][] = "Failed to add {$conf_type} line '{$line}'"; } foreach ($wrong_triplets as $old_tr_key => $triplet) { $ret['messages'][$old_tr_key][] = "Added {$conf_type} line '{$line}'"; } } } // for $line return $ret; }
function renderSLBTripletsEdit($cell) { list($realm1, $realm2) = array_values(array_diff(array('object', 'ipv4vs', 'ipv4rspool'), array($cell['realm']))); if (getConfigVar('ADDNEW_AT_TOP') == 'yes') { callHook('renderNewSLBItemForm', $realm1, $realm2); } $triplets = SLBTriplet::getTriplets($cell); if (count($triplets)) { $cells = array(); foreach ($triplets[0]->display_cells as $field) { $cells[] = $triplets[0]->{$field}; } startPortlet('Manage existing (' . count($triplets) . ')'); echo "<table cellspacing=0 cellpadding=5 align=center class=cooltable>\n"; global $nextorder; $order = 'odd'; foreach ($triplets as $slb) { $cells = array(); foreach ($slb->display_cells as $field) { $cells[] = $slb->{$field}; } $ids = array('object_id' => $slb->lb['id'], 'vs_id' => $slb->vs['id'], 'pool_id' => $slb->rs['id']); $del_params = $ids; $del_params['op'] = 'delLB'; printOpFormIntro('updLB', $ids); echo "<tr valign=top class=row_{$order}><td rowspan=2 class=tdright valign=middle>"; echo getOpLink($del_params, '', 'DELETE', 'Unconfigure'); echo "</td><td class=tdleft valign=bottom>"; renderSLBEntityCell($cells[0]); echo "</td><td>VS config ↓<br><textarea name=vsconfig rows=5 cols=70>" . stringForTextarea($slb->slb['vsconfig']) . "</textarea></td>"; echo '<td class=tdleft rowspan=2 valign=middle>'; printImageHREF('SAVE', 'Save changes', TRUE); echo "</td>"; echo "</tr><tr class=row_{$order}><td class=tdleft valign=top>"; renderSLBEntityCell($cells[1]); echo '</td><td>'; echo "<textarea name=rsconfig rows=5 cols=70>" . stringForTextarea($slb->slb['rsconfig']) . "</textarea><br>RS config ↑"; echo "<div style='float:left; margin-top:10px'><label><input name=prio type=text size=10 value=\"" . htmlspecialchars($slb->slb['prio']) . "\"> ← Priority</label></div>"; echo '</td></tr></form>'; $order = $nextorder[$order]; } echo "</table>\n"; finishPortlet(); } if (getConfigVar('ADDNEW_AT_TOP') != 'yes') { callHook('renderNewSLBItemForm', $realm1, $realm2); } }
function buildEntityLVSConfig($cell) { $ret = "#\n#\n# This configuration has been generated automatically by RackTables\n#\n#\n"; // slbv2 if ($cell['realm'] != 'ipv4vs') { $ret .= generateSLBConfig2(getTriplets($cell)); } // slbv1 if ($cell['realm'] != 'ipvs') { $ret .= generateSLBConfig(SLBTriplet::getTriplets($cell)); } return $ret; }
function buildEntityLVSConfig($cell) { $newconfig = "#\n#\n# This configuration has been generated automatically by RackTables\n#\n#\n"; foreach (SLBTriplet::getTriplets($cell) as $slb) { $newconfig .= $slb->generateConfig(); } return $newconfig; }