Add bare metal stuff to addHost command

add ipmi.py
This commit is contained in:
Frank 2011-02-22 19:07:07 -08:00
parent e4765fb32b
commit b313b7c852
7 changed files with 168 additions and 3 deletions

View File

@ -190,5 +190,7 @@ public class ApiConstants {
public static final String IS_SYSTEM = "issystem"; public static final String IS_SYSTEM = "issystem";
public static final String AVAILABILITY = "availability"; public static final String AVAILABILITY = "availability";
public static final String NETWORKRATE = "networkrate"; public static final String NETWORKRATE = "networkrate";
public static final String HOST_CPU_CAPACITY = "hostcpucapacity";
public static final String HOST_MEM_CAPACITY = "hostmemcapacity";
} }

View File

@ -65,6 +65,14 @@ public class AddHostCmd extends BaseCmd {
@Parameter(name=ApiConstants.HYPERVISOR, type=CommandType.STRING, required=true, description="hypervisor type of the host") @Parameter(name=ApiConstants.HYPERVISOR, type=CommandType.STRING, required=true, description="hypervisor type of the host")
private String hypervisor; private String hypervisor;
@Parameter(name=ApiConstants.HOST_CPU_CAPACITY, type=CommandType.LONG, description="CPU capacity of host")
private Long cpuCapacity;
@Parameter(name=ApiConstants.HOST_MEM_CAPACITY, type=CommandType.LONG, description="memory capacity of host")
private Long memCapacity;
///////////////////////////////////////////////////// /////////////////////////////////////////////////////
@ -103,6 +111,14 @@ public class AddHostCmd extends BaseCmd {
return hypervisor; return hypervisor;
} }
public Long getCpuCapacity() {
return cpuCapacity;
}
public Long getMemCapacity() {
return memCapacity;
}
///////////////////////////////////////////////////// /////////////////////////////////////////////////////
/////////////// API Implementation/////////////////// /////////////// API Implementation///////////////////
///////////////////////////////////////////////////// /////////////////////////////////////////////////////

View File

@ -27,6 +27,8 @@ public class Hypervisor {
VMware, VMware,
VirtualBox, VirtualBox,
Parralels, Parralels,
BareMetal,
Any; /*If you don't care about the hypervisor type*/ Any; /*If you don't care about the hypervisor type*/
public static HypervisorType getType(String hypervisor) { public static HypervisorType getType(String hypervisor) {
@ -46,9 +48,11 @@ public class Hypervisor {
return HypervisorType.VirtualBox; return HypervisorType.VirtualBox;
} else if (hypervisor.equalsIgnoreCase("Parralels")) { } else if (hypervisor.equalsIgnoreCase("Parralels")) {
return HypervisorType.Parralels; return HypervisorType.Parralels;
}else if (hypervisor.equalsIgnoreCase("BareMetal")) {
return HypervisorType.BareMetal;
} else if (hypervisor.equalsIgnoreCase("Any")) { } else if (hypervisor.equalsIgnoreCase("Any")) {
return HypervisorType.Any; return HypervisorType.Any;
} else { } else {
return HypervisorType.None; return HypervisorType.None;
} }
} }

109
scripts/util/ipmi.py Normal file
View File

@ -0,0 +1,109 @@
#!/usr/bin/python
import sys, os, subprocess, errno, re
from os.path import exists
TOOl_PATH = "/usr/bin/ipmitool"
try:
from subprocess import check_call
from subprocess import CalledProcessError
except ImportError:
def check_call(*popenargs, **kwargs):
import subprocess
retcode = subprocess.call(*popenargs, **kwargs)
cmd = kwargs.get("args")
if cmd is None: cmd = popenargs[0]
if retcode: raise CalledProcessError(retcode, cmd)
return retcode
class CalledProcessError(Exception):
def __init__(self, returncode, cmd):
self.returncode = returncode ; self.cmd = cmd
def __str__(self): return "Command '%s' returned non-zero exit status %d" % (self.cmd, self.returncode)
class Command:
def __init__(self,name,parent=None):
self.__name = name
self.__parent = parent
def __getattr__(self,name):
if name == "_print": name = "print"
return Command(name,self)
def __call__(self,*args):
class CommandOutput:
def __init__(self,ret,stdout,stderr):
self.stdout = stdout
self.stderr = stderr
self.ret = ret
cmd = self.__get_recursive_name() + list(args)
#print " ",cmd
popen = subprocess.Popen(cmd,stdout=subprocess.PIPE,stderr=subprocess.PIPE)
m = popen.communicate()
ret = popen.wait()
return CommandOutput(ret,*m)
def __get_recursive_name(self,sep=None):
m = self
l = []
while m is not None:
l.append(m.__name)
m = m.__parent
l.reverse()
if sep: return sep.join(l)
else: return l
def __str__(self):
return '<Command %r>'%self.__get_recursive_name(sep=" ")
def __repr__(self): return self.__str__()
ipmitool = Command("ipmitool")
def check_tool():
if exists(TOOl_PATH) == False:
print "Can not find ipmitool"
return False
def ping(args):
hostname = args.get("hostname")
usrname = args.get("usrname")
password = args.get("password")
if hostname == None:
print "No hostname"
return 1
o = ipmitool("-H", hostname, "-U", usrname, "-P", password, "chassis", "power", "status")
if o.ret:
print o.stderr
return 1
else:
return 0
call_table = {"ping":ping}
def dispatch(args):
cmd = args[1]
params = args[2:]
func_params = {}
if call_table.has_key(cmd) == False:
print "No function %s" % cmd
return 1
for p in params:
pairs = p.split("=")
if len(pairs) != 2:
print "Invalid parameter %s" % p
return 1
func_params[pairs[0]] = pairs[1]
func = call_table[cmd]
return func(func_params)
if __name__ == "__main__":
if check_tool() == False:
sys.exit(1)
if len(sys.argv) < 2:
print "Not enough arguments, at least one"
sys.exit(1)
sys.exit(dispatch(sys.argv))

View File

@ -749,12 +749,30 @@ public class AgentManagerImpl implements AgentManager, HandlerFactory,
String url = cmd.getUrl(); String url = cmd.getUrl();
String username = cmd.getUsername(); String username = cmd.getUsername();
String password = cmd.getPassword(); String password = cmd.getPassword();
Long memCapacity = cmd.getMemCapacity();
Long cpuCapacity = cmd.getCpuCapacity();
Map<String, String>bareMetalParams = new HashMap<String, String>();
// this is for standalone option // this is for standalone option
if (clusterName == null && clusterId == null) { if (clusterName == null && clusterId == null) {
clusterName = "Standalone-" + url; clusterName = "Standalone-" + url;
} }
return discoverHosts(dcId, podId, clusterId, clusterName, url,
username, password, cmd.getHypervisor()); if (cmd.getHypervisor().equalsIgnoreCase(Hypervisor.HypervisorType.BareMetal.toString())) {
if (memCapacity == null) {
memCapacity = Long.valueOf(0);
}
if (cpuCapacity == null) {
cpuCapacity = Long.valueOf(0);
}
bareMetalParams.put("cpuCapacity", cpuCapacity.toString());
bareMetalParams.put("memCapacity", memCapacity.toString());
}
return discoverHostsFull(dcId, podId, clusterId, clusterName, url,
username, password, cmd.getHypervisor(), bareMetalParams);
} }
@Override @Override
@ -772,6 +790,14 @@ public class AgentManagerImpl implements AgentManager, HandlerFactory,
String clusterName, String url, String username, String password, String clusterName, String url, String username, String password,
String hypervisorType) throws IllegalArgumentException, String hypervisorType) throws IllegalArgumentException,
DiscoveryException, InvalidParameterValueException { DiscoveryException, InvalidParameterValueException {
return discoverHostsFull(dcId, podId, clusterId, clusterName, url, username, password, hypervisorType, null);
}
private List<HostVO> discoverHostsFull(Long dcId, Long podId, Long clusterId,
String clusterName, String url, String username, String password,
String hypervisorType, Map<String, String>params) throws IllegalArgumentException,
DiscoveryException, InvalidParameterValueException {
URI uri = null; URI uri = null;
// Check if the zone exists in the system // Check if the zone exists in the system
@ -865,6 +891,8 @@ public class AgentManagerImpl implements AgentManager, HandlerFactory,
boolean isHypervisorTypeSupported = false; boolean isHypervisorTypeSupported = false;
while (en.hasMoreElements()) { while (en.hasMoreElements()) {
Discoverer discoverer = en.nextElement(); Discoverer discoverer = en.nextElement();
discoverer.putParam(params);
if (!discoverer.matchHypervisor(hypervisorType)) { if (!discoverer.matchHypervisor(hypervisorType)) {
continue; continue;
} }

View File

@ -45,4 +45,5 @@ public interface Discoverer extends Adapter {
boolean matchHypervisor(String hypervisor); boolean matchHypervisor(String hypervisor);
Hypervisor.HypervisorType getHypervisorType(); Hypervisor.HypervisorType getHypervisorType();
public void putParam(Map<String, String> params);
} }

View File

@ -44,6 +44,11 @@ public abstract class DiscovererBase implements Discoverer {
return null; return null;
} }
@Override
public void putParam(Map<String, String> params) {
_params.putAll(params);
}
@Override @Override
public String getName() { public String getName() {