package com.cattles.virtualClusterManagement.falkonCluster;
import com.cattles.executionservice.falkon.FalkonClusterInitialization;
import com.cattles.resourcePoolManagement.VirtualResourcePool;
import com.cattles.util.Constant;
import com.cattles.util.Tool;
import com.cattles.virtualClusterManagement.VirtualCluster;
import com.cattles.virtualClusterManagement.XMLOperationCluster;
import com.cattles.virtualClusterManagement.interfaces.IVirtualClusterOperation;
import com.cattles.virtualMachineManagement.VirtualMachineInformation;
import org.apache.log4j.Logger;
import java.util.ArrayList;
/**
* Created with IntelliJ IDEA.
* User: youfuli
* To change this template use File | Settings | File Templates.
*/
public class FalkonClusterOperationImpl implements IVirtualClusterOperation {
//TODO:update the operations upon to cluster management
private static Logger logger = Logger.getLogger(FalkonClusterOperationImpl.class);
XMLOperationCluster xmlOperationCluster = XMLOperationCluster.getXmlOperationCluster();
VirtualResourcePool virtualResourcePool = new VirtualResourcePool();
/**
* use getClustersWithState(Constant.VIRTUAL_CLUSTER_STATE_STANDBY) and getClustersWithType(Constant.FALKON_FRAMEWORK_NAME) to find the standby falkon cluster
*
* @return
*/
@Override
public ArrayList<VirtualCluster> getStandbyCluster() {
ArrayList<VirtualCluster> standbyFalkonClusterList = new ArrayList<VirtualCluster>();
ArrayList<VirtualCluster> standbyClusterList = xmlOperationCluster.getClustersWithState(Constant.VIRTUAL_CLUSTER_STATE_STANDBY);
ArrayList<VirtualCluster> falkonClusterList = xmlOperationCluster.getClustersWithType(Constant.FALKON_FRAMEWORK_NAME);
for (int i = 0; i < falkonClusterList.size(); i++) {
for (int j = 0; j < standbyClusterList.size(); j++) {
if (falkonClusterList.get(i).getClusterID().equals(standbyClusterList.get(j).getClusterID())) {
standbyFalkonClusterList.add(falkonClusterList.get(i));
}
}
}
return standbyFalkonClusterList;
}
/**
* launch a falkon cluster, including falkon service start and falkon worker registration
*
* @param virtualCluster
*/
@Override
public void launchCluster(VirtualCluster virtualCluster) {
String serverID = virtualCluster.getClusterServerID();
ArrayList<String> nodeIDList = virtualCluster.getNodesIDList();
FalkonClusterInitialization falkonClusterInitialization = new FalkonClusterInitialization(serverID, nodeIDList);
falkonClusterInitialization.run();
}
/**
* fetch a list of VMs from the resource pool, then generate a virtual machine cluster.
* add the virtual machine cluster to the VirtualCluster.xml
*
* @param _clusterSize
* @return
*/
public VirtualCluster createCluster(int _clusterSize) {
VirtualCluster virtualCluster = new VirtualCluster();
ArrayList<VirtualMachineInformation> virtualMachineList = virtualResourcePool.fetchVMList(_clusterSize);
logger.info("fetched " + virtualMachineList.size() + " virtual machines");
for (VirtualMachineInformation vmInfo : virtualMachineList) {
logger.info("the vm ID is: " + vmInfo.getVmID());
}
//TODO: use a method to generate a cluster based to the VMs list
virtualCluster = this.generateCluster(virtualMachineList);
xmlOperationCluster.addCluster(virtualCluster);
return virtualCluster;
}
/**
* Use the provided virtual machine list to generate a virtual cluster
*
* @param VMList
* @return
*/
public VirtualCluster generateCluster(ArrayList<VirtualMachineInformation> VMList) {
VirtualCluster virtualCluster = new VirtualCluster();
if (VMList.size() >= 1) {
String clusterID = Tool.genUUID();
String clusterState = Constant.VIRTUAL_CLUSTER_STATE_STANDBY;
int clusterSize = VMList.size();
String clusterServerID = VMList.get(0).getVmID();
ArrayList<String> nodesIDList = new ArrayList<String>();
for (int i = 1; i < VMList.size(); i++) {
nodesIDList.add(VMList.get(i).getVmID());
}
virtualCluster.setClusterID(clusterID);
virtualCluster.setClusterType(Constant.FALKON_FRAMEWORK_NAME);
virtualCluster.setClusterState(clusterState);
virtualCluster.setClusterSize(clusterSize);
virtualCluster.setClusterServerID(clusterServerID);
virtualCluster.setNodesIDList(nodesIDList);
} else {
logger.info("we did not get enough virtual machines to generate a cluster");
}
logger.info("the virtual cluster ID is :" + virtualCluster.getClusterID());
return virtualCluster;
}
public boolean addNodes(String _clusterID, ArrayList<String> _nodeIDList) {
boolean success = false;
success = xmlOperationCluster.addNodes(_clusterID, _nodeIDList);
return success;
}
public boolean removeNodes(String _clusterID, ArrayList<String> _nodeIDList) {
boolean success = false;
success = xmlOperationCluster.removeNodes(_clusterID, _nodeIDList);
return success;
}
public boolean modifyServerID(String _clusterID, String _serverID) {
boolean success = false;
success = xmlOperationCluster.modifyServerID(_clusterID, _serverID);
return success;
}
/**
* Modify the state of the specified cluster which ID is _clusterID
*
* @param _clusterID
* @param _state
* @return
*/
public boolean modifyClusterState(String _clusterID, String _state) {
boolean success = false;
xmlOperationCluster.modifyClusterState(_clusterID, _state);
return success;
}
/**
* get the size of a cluster, which is consist of the num of nodes and the server node
*
* @param _clusterID
* @return
*/
public int getClusterSize(String _clusterID) {
int clusterSize = 0;
clusterSize = xmlOperationCluster.getClusterSize(_clusterID);
return clusterSize;
}
public ArrayList<VirtualCluster> getAllClusters() {
ArrayList<VirtualCluster> virtualClusters = new ArrayList<VirtualCluster>();
virtualClusters = xmlOperationCluster.getAllClusters();
return virtualClusters;
}
public ArrayList<VirtualCluster> getClustersWithState(String _state) {
ArrayList<VirtualCluster> virtualClusters = new ArrayList<VirtualCluster>();
virtualClusters = xmlOperationCluster.getClustersWithState(_state);
return virtualClusters;
}
public VirtualCluster getClusterWithID(String _clusterID) {
VirtualCluster virtualCluster = new VirtualCluster();
virtualCluster = xmlOperationCluster.getClusterWithID(_clusterID);
return virtualCluster;
}
/**
* invoke the method in XMLOperationCluster to delete a cluster.
* We also provide a method to delete a list of Clusters
*
* @param _clusterID
* @return
*/
public boolean deleteCluster(String _clusterID) {
boolean success = xmlOperationCluster.deleteCluster(_clusterID);
return success;
}
}