package com.cattles.virtualClusterManagement; import com.cattles.util.Constant; import org.w3c.dom.Document; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import org.xml.sax.SAXException; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import javax.xml.transform.Transformer; import javax.xml.transform.TransformerConfigurationException; import javax.xml.transform.TransformerException; import javax.xml.transform.TransformerFactory; import javax.xml.transform.dom.DOMSource; import javax.xml.transform.stream.StreamResult; import java.io.FileNotFoundException; import java.io.IOException; import java.util.ArrayList; /** * Created with IntelliJ IDEA. * User: youfuli * read and modify the VirtualClusters.xml */ public class XMLOperationCluster { public Document xmlDocument; private static XMLOperationCluster xmlOperationCluster = null; private XMLOperationCluster() { } public static synchronized XMLOperationCluster getXmlOperationCluster() { if (xmlOperationCluster == null) { xmlOperationCluster = new XMLOperationCluster(); xmlOperationCluster.init(); } return xmlOperationCluster; } /** * initialize the xml operation object */ private void init() { // TODO Auto-generated method stub try { DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = factory.newDocumentBuilder(); this.xmlDocument = builder.parse(Constant.VIRTUAL_CLUSTERS_XML_PATH); xmlDocument.normalize(); } catch (FileNotFoundException e) { System.out.println(e.getMessage()); } catch (ParserConfigurationException e) { System.out.println(e.getMessage()); } catch (SAXException e) { System.out.println(e.getMessage()); } catch (IOException e) { System.out.println(e.getMessage()); } } /** * add a cluster to the VirtualClusters.xml * * @param _virtualCluster * @return */ public boolean addCluster(VirtualCluster _virtualCluster) { boolean success = false; Node virtualClusters = xmlDocument.getChildNodes().item(0); Node virtualClusterNode = xmlDocument.createElement("VirtualCluster"); Node clusterID = xmlDocument.createElement("clusterID"); Node clusterType = xmlDocument.createElement("clusterType"); Node clusterState = xmlDocument.createElement("clusterState"); Node clusterSize = xmlDocument.createElement("clusterSize"); Node serverID = xmlDocument.createElement("serverID"); Node nodes = xmlDocument.createElement("nodes"); clusterID.setTextContent(_virtualCluster.getClusterID()); clusterType.setTextContent(_virtualCluster.getClusterType()); clusterState.setTextContent(_virtualCluster.getClusterState()); clusterSize.setTextContent(String.valueOf(_virtualCluster.getClusterSize())); serverID.setTextContent(_virtualCluster.getClusterServerID()); for (int nodeNum = 0; nodeNum < _virtualCluster.getNodesIDList().size(); nodeNum++) { Node node = xmlDocument.createElement("node"); node.setTextContent(_virtualCluster.getNodesIDList().get(nodeNum)); nodes.appendChild(node); } virtualClusterNode.appendChild(clusterID); virtualClusterNode.appendChild(clusterType); virtualClusterNode.appendChild(clusterState); virtualClusterNode.appendChild(clusterSize); virtualClusterNode.appendChild(serverID); virtualClusterNode.appendChild(nodes); virtualClusters.appendChild(virtualClusterNode); try { TransformerFactory tFactory = TransformerFactory.newInstance(); Transformer transformer; transformer = tFactory.newTransformer(); DOMSource source = new DOMSource(xmlDocument); StreamResult result = new StreamResult(new java.io.File(Constant.VIRTUAL_CLUSTERS_XML_PATH)); transformer.transform(source, result); } catch (TransformerConfigurationException e) { System.out.println(e.getMessage()); } catch (TransformerException e) { System.out.println(e.getMessage()); } return success; } /** * call addCluster() method to add a list of clusters * * @param _virtualClusterArrayList * @return */ public boolean addClusters(ArrayList<VirtualCluster> _virtualClusterArrayList) { boolean success = false; for (VirtualCluster virtualCluster : _virtualClusterArrayList) { success = addCluster(virtualCluster); } return success; } /** * delete a cluster from the VirtualClusters.xml * * @param _clusterID * @return */ public boolean deleteCluster(String _clusterID) { boolean success = false; Node virtualClusters = xmlDocument.getChildNodes().item(0); NodeList virtualClusterList = virtualClusters.getChildNodes(); for (int i = 0; i < virtualClusterList.getLength(); i++) { NodeList virtualClusterInfoList = virtualClusterList.item(i).getChildNodes(); if (virtualClusterInfoList.item(0).getTextContent().equals(_clusterID)) { //xmlDocument.getChildNodes().item(0).removeChild(xmlDocument.getChildNodes().item(0).getChildNodes().item(i)); virtualClusters.removeChild(virtualClusterList.item(i)); } } try { TransformerFactory tFactory = TransformerFactory.newInstance(); Transformer transformer; transformer = tFactory.newTransformer(); DOMSource source = new DOMSource(xmlDocument); StreamResult result = new StreamResult(new java.io.File(Constant.VIRTUAL_CLUSTERS_XML_PATH)); transformer.transform(source, result); success = true; } catch (TransformerConfigurationException e) { System.out.println(e.getMessage()); } catch (TransformerException e) { System.out.println(e.getMessage()); } return success; } /** * call the deleteCluster() method to delete a list of clusters * * @param _clusterIDList * @return */ public boolean deleteClusters(ArrayList<String> _clusterIDList) { boolean success = false; for (String clusterID : _clusterIDList) { success = deleteCluster(clusterID); } return success; } /** * add a node to the VirtualClusters.xml * * @param _clusterID * @param _nodeID * @return */ public boolean addNode(String _clusterID, String _nodeID) { boolean success = false; Node virtualClusters = xmlDocument.getChildNodes().item(0); NodeList virtualClusterList = virtualClusters.getChildNodes(); for (int i = 0; i < virtualClusterList.getLength(); i++) { NodeList virtualClusterInfoList = virtualClusterList.item(i).getChildNodes(); if (virtualClusterInfoList.item(0).getTextContent().equals(_clusterID)) { Node node = xmlDocument.createElement("node"); node.setTextContent(_nodeID); virtualClusterInfoList.item(5).appendChild(node); //modify the cluster size after adding a node int clusterSize = Integer.parseInt(virtualClusterInfoList.item(3).getTextContent()); clusterSize++; virtualClusterInfoList.item(3).setTextContent(String.valueOf(clusterSize)); } } try { TransformerFactory tFactory = TransformerFactory.newInstance(); Transformer transformer; transformer = tFactory.newTransformer(); DOMSource source = new DOMSource(xmlDocument); StreamResult result = new StreamResult(new java.io.File(Constant.VIRTUAL_CLUSTERS_XML_PATH)); transformer.transform(source, result); success = true; } catch (TransformerConfigurationException e) { System.out.println(e.getMessage()); } catch (TransformerException e) { System.out.println(e.getMessage()); } return success; } /** * call addNode() method to add a list of nodes * * @param _clusterID * @param _nodeIDList * @return */ public boolean addNodes(String _clusterID, ArrayList<String> _nodeIDList) { boolean success = false; for (String nodeID : _nodeIDList) { success = addNode(_clusterID, nodeID); } return success; } /** * remove a node from the VirtualClusters.xml * * @param _clusterID * @param _nodeID * @return */ public boolean removeNode(String _clusterID, String _nodeID) { boolean success = false; Node virtualClusters = xmlDocument.getChildNodes().item(0); NodeList virtualClusterList = virtualClusters.getChildNodes(); for (int i = 0; i < virtualClusterList.getLength(); i++) { NodeList virtualClusterInfoList = virtualClusterList.item(i).getChildNodes(); if (virtualClusterInfoList.item(0).getTextContent().equals(_clusterID)) { NodeList nodeList = virtualClusterInfoList.item(5).getChildNodes(); for (int j = 0; j < nodeList.getLength(); j++) { if (nodeList.item(j).getTextContent().equals(_nodeID)) { virtualClusterInfoList.item(5).removeChild(nodeList.item(j)); //modify the cluster size after adding a node int clusterSize = Integer.parseInt(virtualClusterInfoList.item(3).getTextContent()); clusterSize--; virtualClusterInfoList.item(3).setTextContent(String.valueOf(clusterSize)); } } } } try { TransformerFactory tFactory = TransformerFactory.newInstance(); Transformer transformer; transformer = tFactory.newTransformer(); DOMSource source = new DOMSource(xmlDocument); StreamResult result = new StreamResult(new java.io.File(Constant.VIRTUAL_CLUSTERS_XML_PATH)); transformer.transform(source, result); success = true; } catch (TransformerConfigurationException e) { System.out.println(e.getMessage()); } catch (TransformerException e) { System.out.println(e.getMessage()); } return success; } /** * call removeNode() method to remove a list of nodes * * @param _clusterID * @param _nodeIDList * @return */ public boolean removeNodes(String _clusterID, ArrayList<String> _nodeIDList) { boolean success = false; for (String nodeID : _nodeIDList) { success = removeNode(_clusterID, nodeID); } return success; } /** * modify the serverID parameter according to the _clusterID * * @param _clusterID * @return */ public boolean modifyServerID(String _clusterID, String _serverID) { boolean success = false; Node virtualClusters = xmlDocument.getChildNodes().item(0); NodeList virtualClusterList = virtualClusters.getChildNodes(); for (int i = 0; i < virtualClusterList.getLength(); i++) { NodeList virtualClusterInfoList = virtualClusterList.item(i).getChildNodes(); if (virtualClusterInfoList.item(0).getTextContent().equals(_clusterID)) { virtualClusterInfoList.item(4).setTextContent(_serverID); } } try { TransformerFactory tFactory = TransformerFactory.newInstance(); Transformer transformer; transformer = tFactory.newTransformer(); DOMSource source = new DOMSource(xmlDocument); StreamResult result = new StreamResult(new java.io.File(Constant.VIRTUAL_CLUSTERS_XML_PATH)); transformer.transform(source, result); success = true; } catch (TransformerConfigurationException e) { System.out.println(e.getMessage()); } catch (TransformerException e) { System.out.println(e.getMessage()); } return success; } /** * modify the state of cluster, such as "activated", "standby" * * @param _clusterID * @param _clusterState * @return */ public boolean modifyClusterState(String _clusterID, String _clusterState) { boolean success = false; Node virtualClusters = xmlDocument.getChildNodes().item(0); NodeList virtualClusterList = virtualClusters.getChildNodes(); for (int i = 0; i < virtualClusterList.getLength(); i++) { NodeList virtualClusterInfoList = virtualClusterList.item(i).getChildNodes(); if (virtualClusterInfoList.item(0).getTextContent().equals(_clusterID)) { virtualClusterInfoList.item(2).setTextContent(_clusterState); } } try { TransformerFactory tFactory = TransformerFactory.newInstance(); Transformer transformer; transformer = tFactory.newTransformer(); DOMSource source = new DOMSource(xmlDocument); StreamResult result = new StreamResult(new java.io.File(Constant.VIRTUAL_CLUSTERS_XML_PATH)); transformer.transform(source, result); success = true; } catch (TransformerConfigurationException e) { System.out.println(e.getMessage()); } catch (TransformerException e) { System.out.println(e.getMessage()); } return success; } /** * get the cluster size, which is the number of nodes,except the server node * * @param _clusterID * @return */ public int getClusterSize(String _clusterID) { int clusterSize = 0; Node virtualClusters = xmlDocument.getChildNodes().item(0); NodeList virtualClusterList = virtualClusters.getChildNodes(); for (int i = 0; i < virtualClusterList.getLength(); i++) { NodeList virtualClusterInfoList = virtualClusterList.item(i).getChildNodes(); if (virtualClusterInfoList.item(0).getTextContent().equals(_clusterID)) { clusterSize = Integer.parseInt(virtualClusterInfoList.item(3).getTextContent()); } } return clusterSize; } /** * get all the clusters in the VirtualClusters.xml * * @return */ public ArrayList<VirtualCluster> getAllClusters() { ArrayList<VirtualCluster> virtualClusters = new ArrayList<VirtualCluster>(); Node virtualClustersXML = xmlDocument.getChildNodes().item(0); NodeList virtualClusterList = virtualClustersXML.getChildNodes(); for (int i = 0; i < virtualClusterList.getLength(); i++) { NodeList virtualClusterInfoList = virtualClusterList.item(i).getChildNodes(); VirtualCluster virtualCluster = new VirtualCluster(); virtualCluster.setClusterID(virtualClusterInfoList.item(0).getTextContent()); virtualCluster.setClusterType(virtualClusterInfoList.item(1).getTextContent()); virtualCluster.setClusterState(virtualClusterInfoList.item(2).getTextContent()); virtualCluster.setClusterSize(Integer.parseInt(virtualClusterInfoList.item(3).getTextContent())); virtualCluster.setClusterServerID(virtualClusterInfoList.item(4).getTextContent()); NodeList nodeList = virtualClusterInfoList.item(5).getChildNodes(); ArrayList<String> nodes = new ArrayList<String>(); for (int j = 0; j < nodeList.getLength(); j++) { nodes.add(nodeList.item(j).getTextContent()); } virtualCluster.setNodesIDList(nodes); virtualClusters.add(virtualCluster); } return virtualClusters; } /** * get a cluster according to the clusterID specified * * @param _clusterID * @return */ public VirtualCluster getClusterWithID(String _clusterID) { VirtualCluster virtualCluster = new VirtualCluster(); Node virtualClustersXML = xmlDocument.getChildNodes().item(0); NodeList virtualClusterList = virtualClustersXML.getChildNodes(); for (int i = 0; i < virtualClusterList.getLength(); i++) { NodeList virtualClusterInfoList = virtualClusterList.item(i).getChildNodes(); if (virtualClusterInfoList.item(0).getTextContent().equals(_clusterID)) { virtualCluster.setClusterID(virtualClusterInfoList.item(0).getTextContent()); virtualCluster.setClusterType(virtualClusterInfoList.item(1).getTextContent()); virtualCluster.setClusterState(virtualClusterInfoList.item(2).getTextContent()); virtualCluster.setClusterSize(Integer.parseInt(virtualClusterInfoList.item(3).getTextContent())); virtualCluster.setClusterServerID(virtualClusterInfoList.item(4).getTextContent()); NodeList nodeList = virtualClusterInfoList.item(5).getChildNodes(); ArrayList<String> nodes = new ArrayList<String>(); for (int j = 0; j < nodeList.getLength(); j++) { nodes.add(nodeList.item(j).getTextContent()); } virtualCluster.setNodesIDList(nodes); } } return virtualCluster; } /** * get the cluster list according to the cluster type(falkon, gearman) * * @param _clusterType * @return */ public ArrayList<VirtualCluster> getClustersWithType(String _clusterType) { ArrayList<VirtualCluster> virtualClusters = new ArrayList<VirtualCluster>(); Node virtualClustersXML = xmlDocument.getChildNodes().item(0); NodeList virtualClusterList = virtualClustersXML.getChildNodes(); for (int i = 0; i < virtualClusterList.getLength(); i++) { NodeList virtualClusterInfoList = virtualClusterList.item(i).getChildNodes(); if (virtualClusterInfoList.item(1).getTextContent().equals(_clusterType)) { VirtualCluster virtualCluster = new VirtualCluster(); virtualCluster.setClusterID(virtualClusterInfoList.item(0).getTextContent()); virtualCluster.setClusterType(virtualClusterInfoList.item(1).getTextContent()); virtualCluster.setClusterState(virtualClusterInfoList.item(2).getTextContent()); virtualCluster.setClusterSize(Integer.parseInt(virtualClusterInfoList.item(3).getTextContent())); virtualCluster.setClusterServerID(virtualClusterInfoList.item(4).getTextContent()); NodeList nodeList = virtualClusterInfoList.item(5).getChildNodes(); ArrayList<String> nodes = new ArrayList<String>(); for (int j = 0; j < nodeList.getLength(); j++) { nodes.add(nodeList.item(j).getTextContent()); } virtualCluster.setNodesIDList(nodes); virtualClusters.add(virtualCluster); } } return virtualClusters; } /** * get the cluster list according to the cluster state(activated, standby) * * @param _state * @return */ public ArrayList<VirtualCluster> getClustersWithState(String _state) { ArrayList<VirtualCluster> virtualClusters = new ArrayList<VirtualCluster>(); Node virtualClustersXML = xmlDocument.getChildNodes().item(0); NodeList virtualClusterList = virtualClustersXML.getChildNodes(); for (int i = 0; i < virtualClusterList.getLength(); i++) { NodeList virtualClusterInfoList = virtualClusterList.item(i).getChildNodes(); if (virtualClusterInfoList.item(2).getTextContent().equals(_state)) { VirtualCluster virtualCluster = new VirtualCluster(); virtualCluster.setClusterID(virtualClusterInfoList.item(0).getTextContent()); virtualCluster.setClusterType(virtualClusterInfoList.item(1).getTextContent()); virtualCluster.setClusterState(virtualClusterInfoList.item(2).getTextContent()); virtualCluster.setClusterSize(Integer.parseInt(virtualClusterInfoList.item(3).getTextContent())); virtualCluster.setClusterServerID(virtualClusterInfoList.item(4).getTextContent()); NodeList nodeList = virtualClusterInfoList.item(5).getChildNodes(); ArrayList<String> nodes = new ArrayList<String>(); for (int j = 0; j < nodeList.getLength(); j++) { nodes.add(nodeList.item(j).getTextContent()); } virtualCluster.setNodesIDList(nodes); virtualClusters.add(virtualCluster); } } return virtualClusters; } public static void main(String[] args) { XMLOperationCluster xmlOperationCluster = XMLOperationCluster.getXmlOperationCluster(); //add a cluster /*VirtualCluster virtualCluster=new VirtualCluster(); virtualCluster.setClusterID("ti4325cs"); virtualCluster.setClusterState("activated"); virtualCluster.setClusterSize(2); virtualCluster.setClusterServerID("i-ba4534d"); ArrayList<String> nodeList=new ArrayList<String>(); nodeList.add("i-sf453wr"); nodeList.add("i-yu4536i"); virtualCluster.setNodesIDList(nodeList); xmlOperationCluster.addCluster(virtualCluster);*/ //add a list of clusters /*ArrayList<VirtualCluster> virtualClusterArrayList=new ArrayList<VirtualCluster>(); for(int i=0;i<2;i++){ VirtualCluster virtualCluster=new VirtualCluster(); virtualCluster.setClusterID("ti4325cs"); virtualCluster.setClusterState("activated"); virtualCluster.setClusterSize(2); virtualCluster.setClusterServerID("i-ba4534d"); ArrayList<String> nodeList=new ArrayList<String>(); nodeList.add("i-ba4534d"); nodeList.add("i-ba4534d"); virtualCluster.setNodesIDList(nodeList); virtualClusterArrayList.add(virtualCluster); } xmlOperationCluster.addClusters(virtualClusterArrayList);*/ //delete a cluster //xmlOperationCluster.deleteCluster("ti4325cs"); //delete a list of clusters /*ArrayList<String> clusterIDList=new ArrayList<String>(); clusterIDList.add("ti4325cs"); clusterIDList.add("ti4325cs"); xmlOperationCluster.deleteClusters(clusterIDList);*/ //add a node /*String clusterID="ti4325cs"; String nodeID="node-idsgst" ; xmlOperationCluster.addNode(clusterID,nodeID);*/ //add a list of nodes /*String clusterID="ti4325cs"; ArrayList<String> nodeIDList=new ArrayList<String>(); String nodeID="node-idsgst"; String nodeID2="node-222222"; nodeIDList.add(nodeID); nodeIDList.add(nodeID2); xmlOperationCluster.addNodes(clusterID,nodeIDList);*/ //remove a node /*String clusterID="ti4325cs"; String nodeID="node-idsgst" ; xmlOperationCluster.removeNode(clusterID,nodeID);*/ //remove a list of nodes /*String clusterID="ti4325cs"; ArrayList<String> nodeIDList=new ArrayList<String>(); String nodeID="node-idsgst"; String nodeID2="node-222222"; nodeIDList.add(nodeID); nodeIDList.add(nodeID2); xmlOperationCluster.removeNodes(clusterID,nodeIDList);*/ //modify serverID /*String clusterID="ti4325cs"; String serverID="server-idsgst" ; xmlOperationCluster.modifyServerID(clusterID,serverID);*/ //modify clusterState /*String clusterID="ti4325cs"; String clusterState="standby" ; xmlOperationCluster.modifyClusterState(clusterID,clusterState);*/ //get clusters with the state /*String state="activated"; ArrayList<VirtualCluster> virtualClusterArrayList=new ArrayList<VirtualCluster>(); virtualClusterArrayList=xmlOperationCluster.getClustersWithState(state); System.out.println(virtualClusterArrayList.get(1).getClusterID());*/ //get cluster with the clusterID /*String clusterID="ti4325cs"; VirtualCluster virtualCluster=xmlOperationCluster.getClusterWithID(clusterID); System.out.println(virtualCluster.getClusterID());*/ //get all clusters /*ArrayList<VirtualCluster> virtualClusterArrayList=new ArrayList<VirtualCluster>(); virtualClusterArrayList=xmlOperationCluster.getAllClusters(); System.out.println(virtualClusterArrayList.get(3).getClusterID()); */ //get cluster size System.out.println(xmlOperationCluster.getClusterSize("ti4325cs")); } }