Merge branch 'baremetal' to master

modifies:
	api/src/com/cloud/api/ApiConstants.java
	api/src/com/cloud/api/commands/AddHostCmd.java
	api/src/com/cloud/api/commands/CreatePodCmd.java
	api/src/com/cloud/api/commands/DeployVMCmd.java
	api/src/com/cloud/dc/Pod.java
	api/src/com/cloud/network/NetworkService.java
	server/src/com/cloud/agent/manager/AgentManagerImpl.java
	server/src/com/cloud/configuration/ConfigurationManagerImpl.java
	server/src/com/cloud/dc/HostPodVO.java
	server/src/com/cloud/network/NetworkManager.java
	server/src/com/cloud/network/NetworkManagerImpl.java
	server/src/com/cloud/vm/UserVmManagerImpl.java
	setup/db/create-schema.sql
	utils/src/com/cloud/utils/SerialVersionUID.java
This commit is contained in:
Frank 2011-04-11 14:21:41 -07:00
commit 105db3b15a
49 changed files with 919 additions and 204 deletions

View File

@ -9,6 +9,5 @@ public class PrepareLinMinPxeServerAnswer extends Answer {
public PrepareLinMinPxeServerAnswer(PrepareLinMinPxeServerCommand cmd, String details) {
super(cmd, false, details);
}
}
}

View File

@ -2,62 +2,9 @@ package com.cloud.agent.api.baremetal;
import com.cloud.agent.api.Command;
public class PrepareLinMinPxeServerCommand extends Command {
String ip;
String mac;
String netMask;
String gateway;
String dns;
String template;
String vmName;
String hostName;
@Override
public boolean executeInSequence() {
return true;
}
public class PrepareLinMinPxeServerCommand extends PreparePxeServerCommand {
public PrepareLinMinPxeServerCommand(String ip, String mac, String netMask, String gateway, String dns, String template, String vmName, String hostName) {
this.ip = ip;
this.mac = mac;
this.netMask = netMask;
this.gateway = gateway;
this.dns = dns;
this.template = template;
this.vmName = vmName;
this.hostName = hostName;
super(ip, mac, netMask, gateway, dns, template, vmName, hostName);
}
public String getIp() {
return ip;
}
public String getMac() {
return mac;
}
public String getNetMask() {
return netMask;
}
public String getGateWay() {
return gateway;
}
public String getDns() {
return dns;
}
public String getTemplate() {
return template;
}
public String getVmName() {
return vmName;
}
public String getHostName() {
return hostName;
}
}

View File

@ -0,0 +1,13 @@
package com.cloud.agent.api.baremetal;
import com.cloud.agent.api.Answer;
public class PreparePxeServerAnswer extends Answer {
public PreparePxeServerAnswer(PreparePxeServerCommand cmd) {
super(cmd, true, "SUCCESS");
}
public PreparePxeServerAnswer(PreparePxeServerCommand cmd, String details) {
super(cmd, false, details);
}
}

View File

@ -0,0 +1,64 @@
package com.cloud.agent.api.baremetal;
import com.cloud.agent.api.Command;
public class PreparePxeServerCommand extends Command {
String ip;
String mac;
String netMask;
String gateway;
String dns;
String template;
String vmName;
String hostName;
@Override
public boolean executeInSequence() {
return true;
}
public PreparePxeServerCommand(String ip, String mac, String netMask, String gateway, String dns, String template, String vmName, String hostName) {
this.ip = ip;
this.mac = mac;
this.netMask = netMask;
this.gateway = gateway;
this.dns = dns;
this.template = template;
this.vmName = vmName;
this.hostName = hostName;
}
public String getIp() {
return ip;
}
public String getMac() {
return mac;
}
public String getNetMask() {
return netMask;
}
public String getGateWay() {
return gateway;
}
public String getDns() {
return dns;
}
public String getTemplate() {
return template;
}
public String getVmName() {
return vmName;
}
public String getHostName() {
return hostName;
}
}

View File

@ -24,6 +24,9 @@ public class DhcpEntryCommand extends NetworkElementCommand {
String vmMac;
String vmIpAddress;
String vmName;
String dns;
String gateway;
String nextServer;
protected DhcpEntryCommand() {
@ -40,6 +43,20 @@ public class DhcpEntryCommand extends NetworkElementCommand {
this.vmName = vmName;
}
public DhcpEntryCommand(String vmMac, String vmIpAddress, String vmName, String dns, String gateway) {
this(vmMac, vmIpAddress, vmName);
this.dns = dns;
this.gateway = gateway;
}
public String getDns() {
return dns;
}
public String getGateway() {
return gateway;
}
public String getVmMac() {
return vmMac;
}
@ -52,4 +69,12 @@ public class DhcpEntryCommand extends NetworkElementCommand {
return vmName;
}
public void setNextServer(String ip) {
nextServer = ip;
}
public String getNextServer() {
return nextServer;
}
}

View File

@ -215,5 +215,9 @@ public class ApiConstants {
public static final String PRIVATE_NETWORK_ID = "privatenetworkid";
public static final String ALLOCATION_STATE = "allocationstate";
public static final String STORAGE_ID="storageid";
public static final String PING_STORAGE_SERVER_IP = "pingstorageserverip";
public static final String PING_DIR = "pingdir";
public static final String TFTP_DIR = "tftpdir";
public static final String PING_CIFS_USERNAME = "pingcifsusername";
public static final String PING_CIFS_PASSWORD = "pingcifspassword";
}

View File

@ -68,21 +68,18 @@ public class AddHostCmd extends BaseCmd {
@Parameter(name=ApiConstants.HYPERVISOR, type=CommandType.STRING, required=true, description="hypervisor type of the host")
private String hypervisor;
@Parameter(name=ApiConstants.HOST_CPU_CAPACITY, type=CommandType.LONG, description="Only for hypervisor is BareMetal, HZ per CPU of host")
private Long cpuCapacity;
@Parameter(name=ApiConstants.CPU_SPEED, type=CommandType.LONG, description="Only for hypervisor is BareMetal, HZ per CPU of host")
private Long cpuSpeed;
@Parameter(name=ApiConstants.HOST_CPU_NUM, type=CommandType.LONG, description="Only for hypervisor is BareMetal, number of CPU on host")
@Parameter(name=ApiConstants.CPU_NUMBER, type=CommandType.LONG, description="Only for hypervisor is BareMetal, number of CPU on host")
private Long cpuNum;
@Parameter(name=ApiConstants.HOST_MEM_CAPACITY, type=CommandType.LONG, description="Only for hypervisor is BareMetal, memory capacity of host(in MB)")
@Parameter(name=ApiConstants.MEMORY, type=CommandType.LONG, description="Only for hypervisor is BareMetal, memory capacity of host(in MB)")
private Long memCapacity;
@Parameter(name=ApiConstants.HOST_MAC, type=CommandType.STRING, description="Only for hypervisor is BareMetal, Mac of PXE nic")
private String mac;
@Parameter(name=ApiConstants.HOST_TAG, type=CommandType.STRING, description="Only for hypervisor is BareMetal, Tag of host")
private String hostTag;
@Parameter(name=ApiConstants.ALLOCATION_STATE, type=CommandType.STRING, description="Allocation state of this Host for allocation of new resources")
private String allocationState;
@ -129,8 +126,8 @@ public class AddHostCmd extends BaseCmd {
return hostTags;
}
public Long getCpuCapacity() {
return cpuCapacity;
public Long getCpuSpeed() {
return cpuSpeed;
}
public Long getCpuNum() {
@ -143,11 +140,7 @@ public class AddHostCmd extends BaseCmd {
public String getMac() {
return mac;
}
public String getHostTag() {
return hostTag;
}
}
public String getAllocationState() {
return allocationState;

View File

@ -30,6 +30,8 @@ import com.cloud.api.Parameter;
import com.cloud.api.ServerApiException;
import com.cloud.api.response.IPAddressResponse;
import com.cloud.async.AsyncJob;
import com.cloud.dc.DataCenter;
import com.cloud.dc.DataCenter.NetworkType;
import com.cloud.event.EventTypes;
import com.cloud.exception.ConcurrentOperationException;
import com.cloud.exception.InsufficientAddressCapacityException;
@ -39,6 +41,7 @@ import com.cloud.exception.ResourceAllocationException;
import com.cloud.exception.ResourceUnavailableException;
import com.cloud.network.IpAddress;
import com.cloud.network.Network;
import com.cloud.network.Networks.TrafficType;
import com.cloud.user.Account;
import com.cloud.user.UserContext;
@ -91,12 +94,23 @@ public class AssociateIPAddrCmd extends BaseAsyncCreateCmd {
return networkId;
}
List<? extends Network> networks = _networkService.getVirtualNetworksOwnedByAccountInZone(getAccountName(), getDomainId(), getZoneId());
if (networks.size() == 0) {
throw new InvalidParameterValueException("Account name=" + getAccountName() + " domainId=" + getDomainId() + " doesn't have virtual networks in zone " + getZoneId());
DataCenter zone = _configService.getZone(getZoneId());
if (zone.getNetworkType() == NetworkType.Advanced) {
List<? extends Network> networks = _networkService.getVirtualNetworksOwnedByAccountInZone(getAccountName(), getDomainId(), getZoneId());
if (networks.size() == 0) {
throw new InvalidParameterValueException("Account name=" + getAccountName() + " domainId=" + getDomainId() + " doesn't have virtual networks in zone " + getZoneId());
}
assert (networks.size() <= 1) : "Too many virtual networks. This logic should be obsolete";
return networks.get(0).getId();
} else {
Network defaultGuestNetwork = _networkService.getSystemNetworkByZoneAndTrafficType(zone.getId(), TrafficType.Guest);
if (defaultGuestNetwork == null) {
throw new InvalidParameterValueException("Unable to find a default Guest network for account " + getAccountName() + " in domain id=" + getDomainId());
} else {
return defaultGuestNetwork.getId();
}
}
assert (networks.size() <= 1) : "Too many virtual networks. This logic should be obsolete";
return networks.get(0).getId();
}
@Override

View File

@ -61,7 +61,6 @@ public class CreatePodCmd extends BaseCmd {
@Parameter(name=ApiConstants.ALLOCATION_STATE, type=CommandType.STRING, description="Allocation state of this Pod for allocation of new resources")
private String allocationState;
/////////////////////////////////////////////////////
/////////////////// Accessors ///////////////////////
/////////////////////////////////////////////////////

View File

@ -31,4 +31,6 @@ public interface Pod extends Grouping {
String getName();
AllocationState getAllocationState();
boolean getExternalDhcp();
}

View File

@ -0,0 +1,28 @@
/**
* Copyright (C) 2010 Cloud.com, Inc. All rights reserved.
*
* This software is licensed under the GNU General Public License v3 or later.
*
* It is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or any later version.
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
package com.cloud.exception;
import com.cloud.utils.exception.CloudRuntimeException;
public class UnsupportedServiceException extends CloudRuntimeException{
public UnsupportedServiceException(String message) {
super(message);
}
}

View File

@ -34,6 +34,7 @@ import com.cloud.exception.ResourceAllocationException;
import com.cloud.exception.ResourceUnavailableException;
import com.cloud.network.Network.Capability;
import com.cloud.network.Network.Service;
import com.cloud.network.Networks.TrafficType;
import com.cloud.offering.NetworkOffering;
import com.cloud.user.Account;
import com.cloud.vm.VirtualMachine.Type;
@ -80,4 +81,6 @@ public interface NetworkService {
Network updateNetwork(long networkId, String name, String displayText, Account caller);
Integer getNetworkRate(long networkId, Long vmId);
Network getSystemNetworkByZoneAndTrafficType(long zoneId, TrafficType trafficType);
}

View File

@ -213,6 +213,7 @@
<fileset dir="${scripts.dir}">
<include name="**/*"/>
<exclude name="**/fsimage.so"/>
<exclude name="**/ping.tar.bz2"/>
<exclude name="**/vhd-util"/>
<exclude name="**/.*" />
</fileset>
@ -223,7 +224,8 @@
<copy todir="${scripts.target.dir}">
<fileset dir="${scripts.dir}">
<include name="**/fsimage.so"/>
<include name="**/vhd-util"/>
<include name="**/ping.tar.bz2"/>
<include name="**/vhd-util"/>
</fileset>
</copy>
</target>

View File

@ -304,6 +304,7 @@ Obsoletes: %{name}-premium-plugin-zynga < %{version}-%{release}
Provides: %{name}-premium-vendor-zynga = %{version}-%{release}
Obsoletes: %{name}-premium-vendor-zynga < %{version}-%{release}
Requires: java >= 1.6.0
Requires: ipmitool
Requires: %{name}-utils = %{version}
License: CSL 1.1
Group: System Environment/Libraries

View File

@ -0,0 +1,106 @@
#!/usr/bin/python
# Usage: dhcpd_edithosts.py mac ip hostname dns gateway nextserver
import sys, os
from os.path import exists
from time import sleep
from os import remove
usage = '''dhcpd_edithosts.py mac ip hostname dns gateway nextserver'''
conf_path = "/etc/dhcpd.conf"
file_lock = "/etc/dhcpd.conf_locked"
sleep_max = 20
host_entry = 'host %s { hardware ethernet %s; fixed-address %s; option domain-name-servers %s; option domain-name "%s"; option routers %s; default-lease-time infinite; max-lease-time infinite; min-lease-time infinite; filename "pxelinux.0";}'
host_entry1 = 'host %s { hardware ethernet %s; fixed-address %s; option domain-name-servers %s; option domain-name "%s"; option routers %s; default-lease-time infinite; max-lease-time infinite; min-lease-time infinite; next-server %s; filename "pxelinux.0";}'
def lock():
if exists(file_lock):
count = 0
while(exists(file_lock)):
sleep(1)
count = count + 1
if count > sleep_max:
print "Can not get file lock at %s, time expired" % file_lock
return False
try:
f = open(file_lock, "w")
f.close()
return True
except IOError,e:
print "Cannot create file lock at /etc/dhcpd.conf_locked,", e
return False
def unlock():
if exists(file_lock) == False:
print "Cannot find %s when unlocking, race condition happens" % file_lock
else:
try:
remove(file_lock)
return True
except IOError, e:
print "Cannot remove file lock at %s" % file_lock
return False
def insert_host_entry(mac, ip, hostname, dns, gateway, next_server):
if lock() == False:
return 1
cmd = 'sed -i /"fixed-address %s"/d %s' % (ip, conf_path)
ret = os.system(cmd)
if ret != 0:
print "Command %s failed" % cmd
unlock()
return 1
cmd = 'sed -i /"hardware ethernet %s"/d %s' % (mac, conf_path)
ret = os.system(cmd)
if ret != 0:
print "Command %s failed" % cmd
unlock()
return 1
if next_server != "null":
entry = host_entry1 % (hostname, mac, ip, dns, "cloudnine.internal", gateway, next_server)
else:
entry = host_entry % (hostname, mac, ip, dns, "cloudnine.internal", gateway)
cmd = '''echo '%s' >> %s''' % (entry, conf_path)
ret = os.system(cmd)
if ret != 0:
print "Command %s failed" % cmd
unlock()
return 1
cmd = 'service dhcpd restart'
ret = os.system(cmd)
if ret != 0:
print "Command %s failed" % cmd
unlock()
return 1
if unlock() == False:
return 1
return 0
if __name__ == "__main__":
if len(sys.argv) < 7:
print usage
sys.exit(1)
mac = sys.argv[1]
ip = sys.argv[2]
hostname = sys.argv[3]
dns = sys.argv[4]
gateway = sys.argv[5]
next_server = sys.argv[6]
if exists(conf_path) == False:
conf_path = "/etc/dhcp/dhcpd.conf"
if exists(conf_path) == False:
print "Cannot find dhcpd.conf"
sys.exit(1)
ret = insert_host_entry(mac, ip, hostname, dns, gateway, next_server)
sys.exit(ret)

View File

@ -27,6 +27,8 @@ touch /var/log/dnsmasq.log
[ $? -ne 0 ] && exit_with_error "touch /var/log/dnsmasq.log failed"
touch /etc/dnsmasq-resolv.conf
[ $? -ne 0 ] && exit_with_error "touch /etc/dnsmasq-resolv.conf failed"
echo "nameserver $dns">/etc/dnsmasq-resolv.conf
[ $? -ne 0 ] && exit_with_error "echo \"nameserver $dns\">/etc/dnsmasq-resolv.conf failed"
touch /var/lib/dnsmasq.trace
[ $? -ne 0 ] && exit_with_error "touch /var/lib/dnsmasq.trace failed"
@ -159,13 +161,19 @@ config_dnsmasq "
config_dnsmasq dhcp-script=/usr/bin/echoer.sh
config_dnsmasq dhcp-scriptuser=root
config_dnsmasq dhcp-authoritative
config_dnsmasq "
# Ignore any bootp and pxe boot request
"
config_dnsmasq dhcp-ignore=bootp
config_dnsmasq dhcp-vendorclass=pxestuff,PXEClient
config_dnsmasq dhcp-ignore=pxestuff
[ -f /usr/sbin/setenforce ] && /usr/sbin/setenforce 0
[ $? -ne 0 ] && exit_with_error "Can not set seLinux to passive mode"
# Open DHCP ports in iptable
chkconfig --list iptables | grep "on"
if [ $? -ne 0 ]; then
if [ $? -eq 0 ]; then
iptables-save | grep 'A INPUT -p udp -m udp --dport 67 -j ACCEPT' >/dev/null
if [ $? -ne 0 ]; then
iptables -I INPUT 1 -p udp --dport 67 -j ACCEPT

Binary file not shown.

View File

@ -0,0 +1,64 @@
#!/bin/sh
# usage prepare_ping.sh subnet tftp_dir
dhcpd_conf=
subnet=$1
tftp_dir=$2
exit_with_error() {
echo $1
exit 1
}
exit_if_fail() {
[ $? -ne 0 ] && exit_with_error "$*"
}
config_dhcpd() {
echo "$*" >> $dhcpd_conf
[ $? -ne 0 ] && exit_with_error "echo $* failed"
}
[ $# -ne 2 ] && exit_with_error "Usage:prepare_ping.sh subnet tftp_dir"
if [ -f "/etc/dhcp/dhcpd.conf" ]; then
dhcpd_conf="/etc/dhcp/dhcpd.conf"
fi
if [ x"$dhcpd_conf" == "x" ] && [ -f "/etc/dhcpd.conf" ]; then
dhcpd_conf="/etc/dhcpd.conf"
fi
if [ x"$dhcpd_conf" == "x" ]; then
exit_with_error "Cannot find dhcpd.conf"
fi
signature=`head -n 1 $dhcpd_conf`
if [ x"$signature" != x"# CloudStack" ]; then
# prepare dhcpd
cp $dhcpd_conf /etc/dhcpd.conf.bak -f
exit_if_fail "Cannot back dhcpd.conf"
echo "# CloudStack" > $dhcpd_conf
echo "# This is produced by CloudStack" >> $dhcpd_conf
config_dhcpd ddns-update-style interim\;
config_dhcpd subnet $subnet netmask 255.255.255.0 {}
config_dhcpd allow booting\;
config_dhcpd allow bootp\;
fi
# prepare tftp
pushd $tftp_dir $>/dev/null
[ -f ping.tar.bz2 ] || exit_with_error "Cannot find ping.tar.bz2 at $tftp_dir"
tar xjf ping.tar.bz2
exit_if_fail "tar xjf ping.tar.bz2 failed"
#rm ping.tar.bz2 -f
#exit_if_fail "rm ping.tar.bz2 failed"
if [ ! -d pxelinux.cfg ]; then
mkdir pxelinux.cfg
exit_if_fail "Cannot create pxelinux.cfg"
fi
popd
service dhcpd restart
exit_if_fail "service dhcpd restart failed"
exit 0

View File

@ -0,0 +1,58 @@
#!/usr/bin/python
# Usage: prepare_tftp_bootfile.py tftp_dir mac cifs_server share directory image_to_restore cifs_username cifs_password
import os, sys
from sys import exit
from os import makedirs
from os.path import exists, join
template = '''DEFAULT default
PROMPT 1
TIMEOUT 26
DISPLAY boot.msg
LABEL default
KERNEL kernel
APPEND vga=normal devfs=nomount pxe ramdisk_size=66000 load_ramdisk=1 init=/linuxrc prompt_ramdisk=0 initrd=initrd.gz root=/dev/ram0 rw noapic nolapic lba combined_mode=libata ide0=noprobe nomce pci=nomsi irqpoll quiet Server="%s" Share="%s" Directory="%s" Image_To_Restore="%s" After_Completion="Reboot" CIFS_Preferred="Y" Zsplit_Preferred="Y" AUTO="Y" User="%s" Passwd="%s" Extend_Parts_Whenever_Possible="N" Replace_BIOS="N"
'''
tftp_dir = ''
mac = ''
cifs_server = ''
share = ''
directory = ''
image_to_restore = ''
cifs_username = ''
cifs_password = ''
def prepare_boot_file():
try:
pxelinux = join(tftp_dir, "pxelinux.cfg")
if exists(pxelinux) == False:
makedirs(pxelinux)
cfg_name = "01-" + mac.replace(':','-')
cfg_path = join(pxelinux, cfg_name)
f = open(cfg_path, "w")
stuff = template % (cifs_server, share, directory, image_to_restore, cifs_username, cifs_password)
f.write(stuff)
f.close()
return 0
except IOError, e:
print e
return 1
if __name__ == "__main__":
if len(sys.argv) < 9:
print "Usage: prepare_tftp_bootfile.py tftp_dir mac cifs_server share directory image_to_restor cifs_username cifs_password"
exit(1)
tftp_dir = sys.argv[1]
mac = sys.argv[2]
cifs_server = sys.argv[3]
share = sys.argv[4]
directory = sys.argv[5]
image_to_restore = sys.argv[6]
cifs_username = sys.argv[7]
cifs_password = sys.argv[8]
ret = prepare_boot_file()
exit(ret)

View File

@ -0,0 +1,15 @@
#!/bin/sh
DHCP_CONF="/etc/dhcpd.conf"
err_exit() {
echo "$*"
exit 1
}
[ ! -f $DHCP_CONF ] && err_exit "Cannot find $DHCP_CONF"
cat $DHCP_CONF | tr '\n' '~' > /tmp/dhcpd.tmp && sed -i 's/}/}\n/g' /tmp/dhcpd.tmp && sed -i 's/\(subnet.*netmask.*{\).*\(}\)/\1\2/g' /tmp/dhcpd.tmp && cat /tmp/dhcpd.tmp | tr '~' '\n' > $DHCP_CONF && rm /tmp/dhcpd.tmp -f
[ $? -ne 0 ] && err_exit "Configure dhcpd.conf failed"
service dhcpd restart
[ $? -ne 0 ] && err_exit "restart dhcpd failed"
exit 0

View File

@ -789,10 +789,10 @@ public class AgentManagerImpl implements AgentManager, HandlerFactory, ResourceS
String username = cmd.getUsername();
String password = cmd.getPassword();
Long memCapacity = cmd.getMemCapacity();
Long cpuCapacity = cmd.getCpuCapacity();
Long cpuSpeed = cmd.getCpuSpeed();
Long cpuNum = cmd.getCpuNum();
String mac = cmd.getMac();
String hostTag = cmd.getHostTag();
List<String> hostTags = cmd.getHostTags();
Map<String, String>bareMetalParams = new HashMap<String, String>();
dcId = _accountMgr.checkAccessAndSpecifyAuthority(UserContext.current().getCaller(), dcId);
@ -806,8 +806,8 @@ public class AgentManagerImpl implements AgentManager, HandlerFactory, ResourceS
if (memCapacity == null) {
memCapacity = Long.valueOf(0);
}
if (cpuCapacity == null) {
cpuCapacity = Long.valueOf(0);
if (cpuSpeed == null) {
cpuSpeed = Long.valueOf(0);
}
if (cpuNum == null) {
cpuNum = Long.valueOf(0);
@ -817,15 +817,14 @@ public class AgentManagerImpl implements AgentManager, HandlerFactory, ResourceS
}
bareMetalParams.put("cpuNum", cpuNum.toString());
bareMetalParams.put("cpuCapacity", cpuCapacity.toString());
bareMetalParams.put("cpuCapacity", cpuSpeed.toString());
bareMetalParams.put("memCapacity", memCapacity.toString());
bareMetalParams.put("mac", mac);
if (hostTag != null) {
bareMetalParams.put("hostTag", hostTag);
if (hostTags != null) {
bareMetalParams.put("hostTag", hostTags.get(0));
}
}
List<String> hostTags = cmd.getHostTags();
String allocationState = cmd.getAllocationState();
if (allocationState == null) {
allocationState = Host.HostAllocationState.Enabled.toString();

View File

@ -402,12 +402,17 @@ public class ApiDBUtils {
}
public static VMTemplateHostVO findTemplateHostRef(long templateId, long zoneId) {
HostVO secondaryStorageHost = _storageMgr.getSecondaryStorageHost(zoneId);
if (secondaryStorageHost == null) {
return null;
} else {
return _templateHostDao.findByHostTemplate(secondaryStorageHost.getId(), templateId);
}
VMTemplateVO vmTemplate = findTemplateById(templateId);
if (vmTemplate.getHypervisorType() == HypervisorType.BareMetal) {
return _templateHostDao.findByHostTemplate(zoneId, templateId);
} else {
HostVO secondaryStorageHost = _storageMgr.getSecondaryStorageHost(zoneId);
if (secondaryStorageHost == null) {
return null;
} else {
return _templateHostDao.findByHostTemplate(secondaryStorageHost.getId(), templateId);
}
}
}
public static UploadVO findUploadById(Long id){
@ -453,12 +458,17 @@ public class ApiDBUtils {
public static List<VMTemplateHostVO> listTemplateHostBy(long templateId, Long zoneId) {
if (zoneId != null) {
HostVO secondaryStorageHost = _storageMgr.getSecondaryStorageHost(zoneId);
if (secondaryStorageHost == null) {
return new ArrayList<VMTemplateHostVO>();
} else {
return _templateHostDao.listByHostTemplate(secondaryStorageHost.getId(), templateId);
}
VMTemplateVO vmTemplate = findTemplateById(templateId);
if (vmTemplate.getHypervisorType() == HypervisorType.BareMetal) {
return _templateHostDao.listByHostTemplate(zoneId, templateId);
} else {
HostVO secondaryStorageHost = _storageMgr.getSecondaryStorageHost(zoneId);
if (secondaryStorageHost == null) {
return new ArrayList<VMTemplateHostVO>();
} else {
return _templateHostDao.listByHostTemplate(secondaryStorageHost.getId(), templateId);
}
}
} else {
return _templateHostDao.listByOnlyTemplateId(templateId);
}

View File

@ -143,7 +143,7 @@ public enum Config {
SystemVMAutoReserveCapacity("Advanced", ManagementServer.class, Boolean.class, "system.vm.auto.reserve.capacity", "true", "Indicates whether or not to automatically reserver system VM standby capacity.", null),
CPUOverprovisioningFactor("Advanced", ManagementServer.class, String.class, "cpu.overprovisioning.factor", "1", "Used for CPU overprovisioning calculation; available CPU will be (actualCpuCapacity * cpu.overprovisioning.factor)", null),
LinkLocalIpNums("Advanced", ManagementServer.class, Integer.class, "linkLocalIp.nums", "10", "The number of link local ip that needed by domR(in power of 2)", null),
HypervisorList("Advanced", ManagementServer.class, String.class, "hypervisor.list", HypervisorType.KVM + "," + HypervisorType.XenServer + "," + HypervisorType.VMware, "The list of hypervisors that this deployment will use.", "hypervisorList"),
HypervisorList("Advanced", ManagementServer.class, String.class, "hypervisor.list", HypervisorType.KVM + "," + HypervisorType.XenServer + "," + HypervisorType.VMware + "," + HypervisorType.BareMetal, "The list of hypervisors that this deployment will use.", "hypervisorList"),
ManagementHostIPAdr("Advanced", ManagementServer.class, String.class, "host", "localhost", "The ip address of management server", null),
ManagementNetwork("Advanced", ManagementServer.class, String.class, "management.network.cidr", null, "The cidr of management server network", null),
EventPurgeDelay("Advanced", ManagementServer.class, Integer.class, "event.purge.delay", "15", "Events older than specified number days will be purged. Set this value to 0 to never delete events", null),

View File

@ -1307,7 +1307,7 @@ public class ConfigurationManagerImpl implements ConfigurationManager, Configura
} else if (offering.getTrafficType() == TrafficType.Control) {
broadcastDomainType = BroadcastDomainType.LinkLocal;
} else if (offering.getTrafficType() == TrafficType.Public) {
if (zone.getNetworkType() == NetworkType.Advanced && !zone.isSecurityGroupEnabled()) {
if ((zone.getNetworkType() == NetworkType.Advanced && !zone.isSecurityGroupEnabled()) || zone.getNetworkType() == NetworkType.Basic) {
broadcastDomainType = BroadcastDomainType.Vlan;
} else {
continue;
@ -1898,12 +1898,12 @@ public class ConfigurationManagerImpl implements ConfigurationManager, Configura
// Allow adding untagged direct vlan only for Basic zone
if (zone.getNetworkType() == NetworkType.Advanced && vlanId.equals(Vlan.UNTAGGED) && (!forVirtualNetwork || zone.isSecurityGroupEnabled())) {
throw new InvalidParameterValueException("Direct untagged network is not supported for the zone " + zone.getId() + " of type " + zone.getNetworkType());
} else if (zone.getNetworkType() == NetworkType.Basic && !(vlanId.equals(Vlan.UNTAGGED) && !forVirtualNetwork)) {
throw new InvalidParameterValueException("Only direct untagged network is supported in the zone " + zone.getId() + " of type " + zone.getNetworkType());
} else if (zone.getNetworkType() == NetworkType.Basic && !((vlanId.equals(Vlan.UNTAGGED) && !forVirtualNetwork) || (forVirtualNetwork))) {
throw new InvalidParameterValueException("Only Direct Untagged and Virtual networks are supported in the zone " + zone.getId() + " of type " + zone.getNetworkType());
}
// don't allow to create a virtual vlan when zone's vnet is NULL
if (zone.getVnet() == null && forVirtualNetwork) {
//don't allow to create a virtual vlan when zone's vnet is NULL in Advanced zone
if ((zone.getNetworkType() == NetworkType.Advanced && zone.getVnet() == null) && forVirtualNetwork) {
throw new InvalidParameterValueException("Can't add virtual network to the zone id=" + zone.getId() + " as zone doesn't have guest vlan configured");
}

View File

@ -59,6 +59,9 @@ public class HostPodVO implements Pod {
@Column(name="allocation_state")
@Enumerated(value=EnumType.STRING)
AllocationState allocationState;
@Column(name = "external_dhcp")
private Boolean externalDhcp;
public HostPodVO(String name, long dcId, String gateway, String cidrAddress, int cidrSize, String description) {
this.name = name;
@ -68,8 +71,9 @@ public class HostPodVO implements Pod {
this.cidrSize = cidrSize;
this.description = description;
this.allocationState = Grouping.AllocationState.Enabled;
}
this.externalDhcp = false;
}
/*
* public HostPodVO(String name, long dcId) { this(null, name, dcId); }
*/
@ -150,6 +154,14 @@ public class HostPodVO implements Pod {
return NumbersUtil.hash(id);
}
public boolean getExternalDhcp() {
return externalDhcp;
}
public void setExternalDhcp(boolean use) {
externalDhcp = use;
}
@Override
public boolean equals(Object obj) {
if (obj instanceof HostPodVO) {

View File

@ -1,32 +1,59 @@
package com.cloud.deploy;
import java.util.List;
import java.util.Map;
import javax.ejb.Local;
import javax.naming.ConfigurationException;
import org.apache.log4j.Logger;
import com.cloud.capacity.CapacityManager;
import com.cloud.dc.ClusterVO;
import com.cloud.dc.DataCenter;
import com.cloud.dc.Pod;
import com.cloud.dc.dao.ClusterDao;
import com.cloud.dc.dao.DataCenterDao;
import com.cloud.dc.dao.HostPodDao;
import com.cloud.exception.InsufficientServerCapacityException;
import com.cloud.host.Host;
import com.cloud.host.HostVO;
import com.cloud.host.Status;
import com.cloud.host.dao.HostDao;
import com.cloud.hypervisor.Hypervisor.HypervisorType;
import com.cloud.offering.ServiceOffering;
import com.cloud.service.ServiceOfferingVO;
import com.cloud.org.Cluster;
import com.cloud.utils.component.Inject;
import com.cloud.utils.exception.CloudRuntimeException;
import com.cloud.vm.VirtualMachine;
import com.cloud.vm.VirtualMachineProfile;
import com.cloud.vm.VirtualMachineProfileImpl;
@Local(value=DeploymentPlanner.class)
public class BareMetalPlanner extends FirstFitPlanner implements DeploymentPlanner {
public class BareMetalPlanner implements DeploymentPlanner {
private static final Logger s_logger = Logger.getLogger(BareMetalPlanner.class);
@Inject protected DataCenterDao _dcDao;
@Inject protected HostPodDao _podDao;
@Inject protected ClusterDao _clusterDao;
@Inject protected HostDao _hostDao;
@Inject protected CapacityManager _capacityMgr;
String _name;
@Override
public DeployDestination plan(VirtualMachineProfile<? extends VirtualMachine> vmProfile, DeploymentPlan plan, ExcludeList avoid) throws InsufficientServerCapacityException {
VirtualMachine vm = vmProfile.getVirtualMachine();
ServiceOffering offering = vmProfile.getServiceOffering();
ServiceOffering offering = vmProfile.getServiceOffering();
String hostTag = null;
if (vm.getLastHostId() != null) {
HostVO h = _hostDao.findById(vm.getLastHostId());
DataCenter dc = _dcDao.findById(h.getDataCenterId());
Pod pod = _podDao.findById(h.getPodId());
Cluster c = _clusterDao.findById(h.getClusterId());
s_logger.debug("Start baremetal vm " + vm.getId() + " on last stayed host " + h.getId());
return new DeployDestination(dc, pod, c, h);
}
if (offering.getTags() != null) {
String[] tags = offering.getTags().split(",");
if (tags.length > 0) {
@ -34,9 +61,17 @@ public class BareMetalPlanner extends FirstFitPlanner implements DeploymentPlann
}
}
List<ClusterVO> clusters = _clusterDao.listByDcHyType(vm.getDataCenterId(), HypervisorType.BareMetal.toString());
if (clusters.size() != 1) {
throw new CloudRuntimeException("Invaild baremetal cluster number " + clusters.size());
}
Cluster cluster = clusters.get(0);
int cpu_requested;
long ram_requested;
HostVO target = null;
List<HostVO> hosts = _hostDao.listByCluster(cluster.getId());
if (hostTag != null) {
List<HostVO> hosts = _hostDao.listBy(Host.Type.Routing, vm.getDataCenterId());
HostVO target = null;
for (HostVO h : hosts) {
_hostDao.loadDetails(h);
if (h.getDetail("hostTag") != null && h.getDetail("hostTag").equalsIgnoreCase(hostTag)) {
@ -44,37 +79,61 @@ public class BareMetalPlanner extends FirstFitPlanner implements DeploymentPlann
break;
}
}
if (target == null) {
s_logger.warn("Cannot find host with tag " + hostTag);
return null;
}
int cpu = target.getCpus();
int speed = target.getSpeed().intValue();
Long ramSize = target.getTotalMemory() / (1024L*1024L);
ServiceOfferingVO newOffering = new ServiceOfferingVO(offering.getName(), cpu, ramSize.intValue(), speed, offering.getRateMbps(),
offering.getMulticastRateMbps(), false, offering.getDisplayText(), offering.getUseLocalStorage(), false, offering.getTags(), false);
((VirtualMachineProfileImpl)vmProfile).setServiceOffering(newOffering);
}
if (target == null) {
s_logger.warn("Cannot find host with tag " + hostTag + " use capacity from service offering");
cpu_requested = offering.getCpu() * offering.getSpeed();
ram_requested = offering.getRamSize() * 1024 * 1024;
} else {
cpu_requested = target.getCpus() * target.getSpeed().intValue();
ram_requested = target.getTotalMemory();
}
DeployDestination dest = super.plan(vmProfile, plan, avoid);
if (hostTag == null && dest != null) {
Host h = dest.getHost();
if (h.getCpus() != offering.getCpu() || h.getTotalMemory() != offering.getRamSize() || h.getSpeed() != offering.getSpeed()) {
throw new CloudRuntimeException(String.format("Bare Metal only allows one VM one host, " +
"the offering capcacity doesn't equal to host capacity(offering: cpu number:%$1s, cpu speed:%$2s," +
"ram size:%3$s; host: cpu number:%$4s, cpu speed:%$5s, ram size:%$6s)", offering.getCpu(), offering.getSpeed(),
offering.getRamSize(), h.getCpus(), h.getSpeed(), h.getTotalMemory()));
for (HostVO h : hosts) {
if (h.getStatus() == Status.Up) {
if(_capacityMgr.checkIfHostHasCapacity(h.getId(), cpu_requested, ram_requested, false)){
s_logger.debug("Find host " + h.getId() + " has enough capacity");
DataCenter dc = _dcDao.findById(h.getDataCenterId());
Pod pod = _podDao.findById(h.getPodId());
return new DeployDestination(dc, pod, cluster, h);
}
}
}
return dest;
s_logger.warn(String.format("Cannot find enough capacity(requested cpu=%1$s memory=%2$s)", cpu_requested, ram_requested));
return null;
}
@Override
public boolean canHandle(VirtualMachineProfile<? extends VirtualMachine> vm, DeploymentPlan plan, ExcludeList avoid) {
return vm.getHypervisorType() == HypervisorType.BareMetal;
}
@Override
public boolean configure(String name, Map<String, Object> params) throws ConfigurationException {
_name = name;
return true;
}
@Override
public String getName() {
return _name;
}
@Override
public boolean start() {
return true;
}
@Override
public boolean stop() {
return true;
}
@Override
public boolean check(VirtualMachineProfile<? extends VirtualMachine> vm, DeploymentPlan plan, DeployDestination dest, ExcludeList exclude) {
// TODO Auto-generated method stub
return false;
}
}

View File

@ -139,6 +139,8 @@ public interface HostDao extends GenericDao<HostVO, Long> {
long getNextSequence(long hostId);
void loadDetails(HostVO host);
void saveDetails(HostVO host);
HostVO findConsoleProxyHost(String name, Type type);

View File

@ -598,8 +598,9 @@ public class HostDaoImpl extends GenericDaoBase<HostVO, Long> implements HostDao
sc.setParameters("type", type.toString());
return listBy(sc);
}
protected void saveDetails(HostVO host) {
@Override
public void saveDetails(HostVO host) {
Map<String, String> details = host.getDetails();
if (details == null) {
return;

View File

@ -127,8 +127,6 @@ public interface NetworkManager extends NetworkService {
boolean applyRules(List<? extends FirewallRule> rules, boolean continueOnError) throws ResourceUnavailableException;
NetworkVO getSystemNetworkByZoneAndTrafficType(long zoneId, TrafficType trafficType);
List<? extends RemoteAccessVpnElement> getRemoteAccessVpnElements();
PublicIpAddress getPublicIpAddress(long ipAddressId);
@ -173,7 +171,7 @@ public interface NetworkManager extends NetworkService {
boolean zoneIsConfiguredForExternalNetworking(long zoneId);
Map<Capability, String> getServiceCapability(long zoneId, Service service);
Map<Capability, String> getServiceCapabilities(long zoneId, Service service);
boolean applyIpAssociations(Network network, boolean continueOnError) throws ResourceUnavailableException;

View File

@ -79,6 +79,7 @@ import com.cloud.exception.InvalidParameterValueException;
import com.cloud.exception.PermissionDeniedException;
import com.cloud.exception.ResourceAllocationException;
import com.cloud.exception.ResourceUnavailableException;
import com.cloud.exception.UnsupportedServiceException;
import com.cloud.network.IpAddress.State;
import com.cloud.network.Network.Capability;
import com.cloud.network.Network.GuestIpType;
@ -437,6 +438,7 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag
boolean success = true;
for (NetworkElement element : _networkElements) {
try {
s_logger.trace("Asking " + element + " to apply ip associations");
element.applyIps(network, publicIps);
} catch (ResourceUnavailableException e) {
success = false;
@ -703,8 +705,8 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag
null,
true,
Availability.Required,
//services - all true except for firewall/lb/vpn and gateway services
true, true, true, false, false,false, false, GuestIpType.Direct);
//services - all true except for lb/vpn and gateway services
true, true, true, false, true,false, false, GuestIpType.Direct);
guestNetworkOffering = _networkOfferingDao.persistDefaultNetworkOffering(guestNetworkOffering);
_systemNetworks.put(NetworkOfferingVO.SystemGuestNetwork, guestNetworkOffering);
@ -1788,18 +1790,8 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag
SearchCriteria<NetworkVO> sc = sb.create();
if (!isSystem) {
if (zoneId != null) {
DataCenterVO dc = _dcDao.findById(zoneId);
if (dc != null && !dc.isSecurityGroupEnabled()) {
sc.setJoinParameters("networkOfferingSearch", "systemOnly", false);
}
} else {
sc.setJoinParameters("networkOfferingSearch", "systemOnly", false);
}
} else {
sc.setJoinParameters("networkOfferingSearch", "systemOnly", true);
sc.setJoinParameters("zoneSearch", "networkType", NetworkType.Advanced.toString());
if (isSystem != null) {
sc.setJoinParameters("networkOfferingSearch", "systemOnly", isSystem);
}
if (keyword != null) {
@ -2386,8 +2378,12 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag
}
@Override
public Map<Capability, String> getServiceCapability(long zoneId, Service service) {
public Map<Capability, String> getServiceCapabilities(long zoneId, Service service) {
Map<Service, Map<Capability, String>> networkCapabilities = getZoneCapabilities(zoneId);
if (networkCapabilities.get(service) == null) {
throw new UnsupportedServiceException("Service " + service.getName() + " is not supported in zone id=" + zoneId);
}
return networkCapabilities.get(service);
}
@ -2606,9 +2602,15 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag
@Override
public boolean zoneIsConfiguredForExternalNetworking(long zoneId) {
DataCenterVO zone = _dcDao.findById(zoneId);
return (zone.getGatewayProvider() != null && zone.getGatewayProvider().equals(Network.Provider.JuniperSRX.getName()) && zone.getFirewallProvider().equals(Network.Provider.JuniperSRX.getName()) && zone.getLoadBalancerProvider().equals(
Network.Provider.F5BigIp.getName()));
if (zone.getNetworkType() == NetworkType.Advanced) {
return (zone.getGatewayProvider() != null && zone.getGatewayProvider().equals(Network.Provider.JuniperSRX.getName())
&& zone.getFirewallProvider() != null && zone.getFirewallProvider().equals(Network.Provider.JuniperSRX.getName())
&& zone.getLoadBalancerProvider() != null && zone.getLoadBalancerProvider().equals(
Network.Provider.F5BigIp.getName()));
} else {
return (zone.getFirewallProvider() != null && zone.getFirewallProvider().equals(Network.Provider.JuniperSRX.getName()));
}
}

View File

@ -28,6 +28,7 @@ import org.apache.log4j.Logger;
import com.cloud.configuration.ConfigurationManager;
import com.cloud.dc.DataCenter;
import com.cloud.dc.DataCenter.NetworkType;
import com.cloud.dc.dao.HostPodDao;
import com.cloud.deploy.DeployDestination;
import com.cloud.exception.ConcurrentOperationException;
import com.cloud.exception.InsufficientCapacityException;
@ -73,14 +74,16 @@ public class DhcpElement extends AdapterBase implements NetworkElement, Password
@Inject UserVmDao _userVmDao;
@Inject DomainRouterDao _routerDao;
@Inject ConfigurationManager _configMgr;
@Inject HostPodDao _podDao;
private boolean canHandle(GuestIpType ipType, DeployDestination dest, TrafficType trafficType) {
DataCenter dc = dest.getDataCenter();
String provider = dc.getGatewayProvider();
if (provider != null && provider.equalsIgnoreCase(Provider.JuniperSRX.getName()) && ipType == GuestIpType.Virtual) {
return true;
} else if (dc.getDhcpProvider().equalsIgnoreCase(Provider.ExternalDhcpServer.getName())){
} else if (dest.getPod() != null && dest.getPod().getExternalDhcp()){
//This pod is using external DHCP server
return false;
} else {
if (dc.getNetworkType() == NetworkType.Basic) {

View File

@ -53,7 +53,7 @@ public class PublicNetworkGuru extends AdapterBase implements NetworkGuru {
protected boolean canHandle(NetworkOffering offering, DataCenter dc) {
if (dc.getNetworkType() == NetworkType.Advanced && offering.getTrafficType() == TrafficType.Public && offering.isSystemOnly() && !dc.isSecurityGroupEnabled()) {
if (((dc.getNetworkType() == NetworkType.Advanced && !dc.isSecurityGroupEnabled()) || dc.getNetworkType() == NetworkType.Basic) && offering.getTrafficType() == TrafficType.Public && offering.isSystemOnly()) {
return true;
} else {
s_logger.trace("We only take care of System only Public Virtual Network");

View File

@ -220,8 +220,8 @@ public class RulesManagerImpl implements RulesManager, RulesService, Manager {
}
//Verify that the network guru supports the protocol specified
Map<Network.Capability, String> firewallCapability = _networkMgr.getServiceCapability(network.getDataCenterId(), Service.Firewall);
String supportedProtocols = firewallCapability.get(Capability.SupportedProtocols).toLowerCase();
Map<Network.Capability, String> firewallCapabilities = _networkMgr.getServiceCapabilities(network.getDataCenterId(), Service.Firewall);
String supportedProtocols = firewallCapabilities.get(Capability.SupportedProtocols).toLowerCase();
if (!supportedProtocols.contains(rule.getProtocol().toLowerCase())) {
throw new InvalidParameterValueException("Protocol " + rule.getProtocol() + " is not supported in zone " + network.getDataCenterId());
}
@ -318,7 +318,7 @@ public class RulesManagerImpl implements RulesManager, RulesService, Manager {
}
//Verify that the network guru supports the protocol specified
Map<Network.Capability, String> firewallCapability = _networkMgr.getServiceCapability(network.getDataCenterId(), Service.Firewall);
Map<Network.Capability, String> firewallCapability = _networkMgr.getServiceCapabilities(network.getDataCenterId(), Service.Firewall);
String supportedProtocols = firewallCapability.get(Capability.SupportedProtocols).toLowerCase();
if (!supportedProtocols.contains(rule.getProtocol().toLowerCase())) {
throw new InvalidParameterValueException("Protocol " + rule.getProtocol() + " is not supported in zone " + network.getDataCenterId());

View File

@ -667,8 +667,8 @@ public class ConfigurationServerImpl implements ConfigurationServer {
TrafficType.Guest,
true, false, null, null, null, true,
Availability.Required,
true, true, true, //services - all true except for firewall/lb/vpn and gateway
false, false, false, false, GuestIpType.Direct);
true, true, true, //services - all true except for lb/vpn and gateway
false, true, false, false, GuestIpType.Direct);
guestNetworkOffering = _networkOfferingDao.persistDefaultNetworkOffering(guestNetworkOffering);
@ -729,7 +729,7 @@ public class ConfigurationServerImpl implements ConfigurationServer {
} else if (trafficType == TrafficType.Control) {
broadcastDomainType = BroadcastDomainType.LinkLocal;
} else if (offering.getTrafficType() == TrafficType.Public) {
if (zone.getNetworkType() == NetworkType.Advanced) {
if ((zone.getNetworkType() == NetworkType.Advanced && !zone.isSecurityGroupEnabled()) || zone.getNetworkType() == NetworkType.Basic) {
broadcastDomainType = BroadcastDomainType.Vlan;
} else {
continue;

View File

@ -522,6 +522,8 @@ public class DownloadMonitorImpl implements DownloadMonitor {
}
/*Only download templates whose hypervirsor type is in the zone*/
List<HypervisorType> availHypers = _clusterDao.getAvailableHypervisorInZone(sserver.getDataCenterId());
/* Baremetal need not to download any template */
availHypers.remove(HypervisorType.BareMetal);
for (VMTemplateVO tmplt: toBeDownloaded) {
if (tmplt.getUrl() == null){ // If url is null we cant initiate the download so mark it as an error.

View File

@ -23,6 +23,7 @@ import java.net.URI;
import java.net.URISyntaxException;
import java.net.UnknownHostException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;
@ -62,6 +63,7 @@ import com.cloud.exception.InvalidParameterValueException;
import com.cloud.exception.PermissionDeniedException;
import com.cloud.exception.ResourceAllocationException;
import com.cloud.exception.StorageUnavailableException;
import com.cloud.host.Host;
import com.cloud.host.HostVO;
import com.cloud.host.dao.HostDao;
import com.cloud.hypervisor.Hypervisor;
@ -159,6 +161,7 @@ public class TemplateManagerImpl implements TemplateManager, Manager, TemplateSe
@Inject ConfigurationDao _configDao;
@Inject UsageEventDao _usageEventDao;
@Inject HypervisorGuruManager _hvGuruMgr;
@Inject VMTemplateHostDao _vmTemplateHostDao;
protected SearchBuilder<VMTemplateHostVO> HostTemplateStatesSearch;
@Override
@ -383,8 +386,8 @@ public class TemplateManagerImpl implements TemplateManager, Manager, TemplateSe
}
String uriStr;
if (url.startsWith("baremetal://")) {
uriStr = url.substring("baremetal://".length());
if (hypervisorType == hypervisorType.BareMetal) {
uriStr = url;
} else {
URI uri = new URI(url);
if ((uri.getScheme() == null)
@ -469,7 +472,27 @@ public class TemplateManagerImpl implements TemplateManager, Manager, TemplateSe
_tmpltDao.addTemplateToZone(template, zoneId);
}
_downloadMonitor.downloadTemplateToStorage(id, zoneId);
if (hyperType == HypervisorType.BareMetal) {
// There is no secondary storage vm for baremetal, we use zone id as identifier
VMTemplateHostVO vmTemplateHost = null;
if (zoneId == null) {
List<DataCenterVO> dcs = _dcDao.listAllIncludingRemoved();
for (DataCenterVO dc: dcs) {
vmTemplateHost = _vmTemplateHostDao.findByHostTemplate(dc.getId(), template.getId());
if (vmTemplateHost == null) {
vmTemplateHost = new VMTemplateHostVO(dc.getId(), template.getId(), new Date(), 100, VMTemplateStorageResourceAssoc.Status.DOWNLOADED,
null, null, null, null, template.getUrl());
_vmTemplateHostDao.persist(vmTemplateHost);
}
}
} else {
vmTemplateHost = new VMTemplateHostVO(zoneId, template.getId(), new Date(), 100, VMTemplateStorageResourceAssoc.Status.DOWNLOADED,
null, null, null, null, template.getUrl());
_vmTemplateHostDao.persist(vmTemplateHost);
}
} else {
_downloadMonitor.downloadTemplateToStorage(id, zoneId);
}
_accountMgr.incrementResourceCount(accountId, ResourceType.template);

View File

@ -1922,12 +1922,12 @@ public class UserVmManagerImpl implements UserVmManager, UserVmService, Manager
_accountMgr.checkAccess(caller, owner);
//Get default guest network in Basic zone
NetworkVO defaultNetwork = _networkMgr.getSystemNetworkByZoneAndTrafficType(zone.getId(), TrafficType.Guest);
Network defaultNetwork = _networkMgr.getSystemNetworkByZoneAndTrafficType(zone.getId(), TrafficType.Guest);
if (defaultNetwork == null) {
throw new InvalidParameterValueException("Unable to find a default network to start a vm");
} else {
networkList.add(defaultNetwork);
networkList.add(_networkDao.findById(defaultNetwork.getId()));
}
return createVirtualMachine(zone, serviceOffering, template, hostName, displayName, owner, diskOfferingId,

View File

@ -256,6 +256,7 @@ public class VirtualMachineManagerImpl implements VirtualMachineManager, Listene
if (template.getFormat() == ImageFormat.ISO) {
_storageMgr.allocateRawVolume(Type.ROOT, "ROOT-" + vm.getId(), rootDiskOffering.first(), rootDiskOffering.second(), vm, owner);
} else if (template.getFormat() == ImageFormat.BAREMETAL) {
// Do nothing
}else {
_storageMgr.allocateTemplatedVolume(Type.ROOT, "ROOT-" + vm.getId(), rootDiskOffering.first(), template, vm, owner);
}

View File

@ -534,6 +534,7 @@ CREATE TABLE `cloud`.`host_pod_ref` (
`cidr_size` bigint unsigned NOT NULL COMMENT 'CIDR size for the pod',
`description` varchar(255) COMMENT 'store private ip range in startIP-endIP format',
`allocation_state` varchar(32) NOT NULL DEFAULT 'Enabled' COMMENT 'Is this Pod enabled for allocation for new resources',
`external_dhcp` tinyint NOT NULL DEFAULT 0 COMMENT 'Is this Pod using external DHCP',
PRIMARY KEY (`id`),
UNIQUE KEY (`name`, `data_center_id`),
INDEX `i_host_pod_ref__data_center_id`(`data_center_id`),

View File

@ -217,7 +217,42 @@ dictionary = {
<input class="text" type="text" name="host_vcenter_host" id="host_vcenter_host" />
<div id="host_vcenter_host_errormsg" class="dialog_formcontent_errormsg" style="display: none;">
</div>
</li>
</li>
<li input_group="baremetal" style="display: none;">
<label for="host_baremetal_cpucores">
# of CPU Cores:</label>
<input class="text" type="text" name="host_baremetal_cpucores" id="host_baremetal_cpucores" />
<div id="host_baremetal_cpucores_errormsg" class="dialog_formcontent_errormsg" style="display: none;">
</div>
</li>
<li input_group="baremetal" style="display: none;">
<label for="host_baremetal_cpu">
CPU (in MHz):</label>
<input class="text" type="text" name="host_baremetal_cpu" id="host_baremetal_cpu" />
<div id="host_baremetal_cpu_errormsg" class="dialog_formcontent_errormsg" style="display: none;">
</div>
</li>
<li input_group="baremetal" style="display: none;">
<label for="host_baremetal_memory">
Memory (in MB):</label>
<input class="text" type="text" name="host_baremetal_memory" id="host_baremetal_memory" />
<div id="host_baremetal_memory_errormsg" class="dialog_formcontent_errormsg" style="display: none;">
</div>
</li>
<li input_group="baremetal" style="display: none;">
<label for="host_baremetal_mac">
Host MAC:</label>
<input class="text" type="text" name="host_baremetal_mac" id="host_baremetal_mac" />
<div id="host_baremetal_mac_errormsg" class="dialog_formcontent_errormsg" style="display: none;">
</div>
</li>
<li>
<label input_group="general">
Tags:</label>
<input class="text" type="text" name="host_tags" id="host_tags" />
<div id="host_tags_errormsg" class="dialog_formcontent_errormsg" style="display: none;">
</div>
</li>
</ol>
</form>
</div>

View File

@ -778,7 +778,42 @@ dictionary = {
<input class="text" type="text" name="host_vcenter_host" id="host_vcenter_host" />
<div id="host_vcenter_host_errormsg" class="dialog_formcontent_errormsg" style="display: none;">
</div>
</li>
</li>
<li input_group="baremetal" style="display: none;">
<label for="host_baremetal_cpucores">
# of CPU Cores:</label>
<input class="text" type="text" name="host_baremetal_cpucores" id="host_baremetal_cpucores" />
<div id="host_baremetal_cpucores_errormsg" class="dialog_formcontent_errormsg" style="display: none;">
</div>
</li>
<li input_group="baremetal" style="display: none;">
<label for="host_baremetal_cpu">
CPU (in MHz):</label>
<input class="text" type="text" name="host_baremetal_cpu" id="host_baremetal_cpu" />
<div id="host_baremetal_cpu_errormsg" class="dialog_formcontent_errormsg" style="display: none;">
</div>
</li>
<li input_group="baremetal" style="display: none;">
<label for="host_baremetal_memory">
Memory (in MB):</label>
<input class="text" type="text" name="host_baremetal_memory" id="host_baremetal_memory" />
<div id="host_baremetal_memory_errormsg" class="dialog_formcontent_errormsg" style="display: none;">
</div>
</li>
<li input_group="baremetal" style="display: none;">
<label for="host_baremetal_mac">
Host MAC:</label>
<input class="text" type="text" name="host_baremetal_mac" id="host_baremetal_mac" />
<div id="host_baremetal_mac_errormsg" class="dialog_formcontent_errormsg" style="display: none;">
</div>
</li>
<li>
<label input_group="general">
Tags:</label>
<input class="text" type="text" name="host_tags" id="host_tags" />
<div id="host_tags_errormsg" class="dialog_formcontent_errormsg" style="display: none;">
</div>
</li>
</ol>
</form>
</div>

View File

@ -342,7 +342,42 @@ dictionary = {
<input class="text" type="text" name="host_vcenter_host" id="host_vcenter_host" />
<div id="host_vcenter_host_errormsg" class="dialog_formcontent_errormsg" style="display: none;">
</div>
</li>
</li>
<li input_group="baremetal" style="display: none;">
<label for="host_baremetal_cpucores">
# of CPU Cores:</label>
<input class="text" type="text" name="host_baremetal_cpucores" id="host_baremetal_cpucores" />
<div id="host_baremetal_cpucores_errormsg" class="dialog_formcontent_errormsg" style="display: none;">
</div>
</li>
<li input_group="baremetal" style="display: none;">
<label for="host_baremetal_cpu">
CPU (in MHz):</label>
<input class="text" type="text" name="host_baremetal_cpu" id="host_baremetal_cpu" />
<div id="host_baremetal_cpu_errormsg" class="dialog_formcontent_errormsg" style="display: none;">
</div>
</li>
<li input_group="baremetal" style="display: none;">
<label for="host_baremetal_memory">
Memory (in MB):</label>
<input class="text" type="text" name="host_baremetal_memory" id="host_baremetal_memory" />
<div id="host_baremetal_memory_errormsg" class="dialog_formcontent_errormsg" style="display: none;">
</div>
</li>
<li input_group="baremetal" style="display: none;">
<label for="host_baremetal_mac">
Host MAC:</label>
<input class="text" type="text" name="host_baremetal_mac" id="host_baremetal_mac" />
<div id="host_baremetal_mac_errormsg" class="dialog_formcontent_errormsg" style="display: none;">
</div>
</li>
<li>
<label input_group="general">
Tags:</label>
<input class="text" type="text" name="host_tags" id="host_tags" />
<div id="host_tags_errormsg" class="dialog_formcontent_errormsg" style="display: none;">
</div>
</li>
</ol>
</form>
</div>

View File

@ -866,7 +866,7 @@
<ol>
<li>
<label>
<fmt:message key="label.adding"/>:</label>
<fmt:message key="label.zone"/>:</label>
<select class="select" id="zone_dropdown">
</select>
<div id="zone_dropdown_errormsg" class="dialog_formcontent_errormsg" style="display: none;">
@ -943,7 +943,42 @@
<input class="text" type="text" name="host_vcenter_host" id="host_vcenter_host" />
<div id="host_vcenter_host_errormsg" class="dialog_formcontent_errormsg" style="display: none;">
</div>
</li>
</li>
<li input_group="baremetal" style="display: none;">
<label for="host_baremetal_cpucores">
# of CPU Cores:</label>
<input class="text" type="text" name="host_baremetal_cpucores" id="host_baremetal_cpucores" />
<div id="host_baremetal_cpucores_errormsg" class="dialog_formcontent_errormsg" style="display: none;">
</div>
</li>
<li input_group="baremetal" style="display: none;">
<label for="host_baremetal_cpu">
CPU (in MHz):</label>
<input class="text" type="text" name="host_baremetal_cpu" id="host_baremetal_cpu" />
<div id="host_baremetal_cpu_errormsg" class="dialog_formcontent_errormsg" style="display: none;">
</div>
</li>
<li input_group="baremetal" style="display: none;">
<label for="host_baremetal_memory">
Memory (in MB):</label>
<input class="text" type="text" name="host_baremetal_memory" id="host_baremetal_memory" />
<div id="host_baremetal_memory_errormsg" class="dialog_formcontent_errormsg" style="display: none;">
</div>
</li>
<li input_group="baremetal" style="display: none;">
<label for="host_baremetal_mac">
Host MAC:</label>
<input class="text" type="text" name="host_baremetal_mac" id="host_baremetal_mac" />
<div id="host_baremetal_mac_errormsg" class="dialog_formcontent_errormsg" style="display: none;">
</div>
</li>
<li>
<label input_group="general">
Tags:</label>
<input class="text" type="text" name="host_tags" id="host_tags" />
<div id="host_tags_errormsg" class="dialog_formcontent_errormsg" style="display: none;">
</div>
</li>
</ol>
</form>
</div>

View File

@ -423,6 +423,41 @@ dictionary = {
<input class="text" type="text" name="host_vcenter_host" id="host_vcenter_host" />
<div id="host_vcenter_host_errormsg" class="dialog_formcontent_errormsg" style="display: none;">
</div>
</li>
<li input_group="baremetal" style="display: none;">
<label for="host_baremetal_cpucores">
# of CPU Cores:</label>
<input class="text" type="text" name="host_baremetal_cpucores" id="host_baremetal_cpucores" />
<div id="host_baremetal_cpucores_errormsg" class="dialog_formcontent_errormsg" style="display: none;">
</div>
</li>
<li input_group="baremetal" style="display: none;">
<label for="host_baremetal_cpu">
CPU (in MHz):</label>
<input class="text" type="text" name="host_baremetal_cpu" id="host_baremetal_cpu" />
<div id="host_baremetal_cpu_errormsg" class="dialog_formcontent_errormsg" style="display: none;">
</div>
</li>
<li input_group="baremetal" style="display: none;">
<label for="host_baremetal_memory">
Memory (in MB):</label>
<input class="text" type="text" name="host_baremetal_memory" id="host_baremetal_memory" />
<div id="host_baremetal_memory_errormsg" class="dialog_formcontent_errormsg" style="display: none;">
</div>
</li>
<li input_group="baremetal" style="display: none;">
<label for="host_baremetal_mac">
Host MAC:</label>
<input class="text" type="text" name="host_baremetal_mac" id="host_baremetal_mac" />
<div id="host_baremetal_mac_errormsg" class="dialog_formcontent_errormsg" style="display: none;">
</div>
</li>
<li>
<label input_group="general">
Tags:</label>
<input class="text" type="text" name="host_tags" id="host_tags" />
<div id="host_tags_errormsg" class="dialog_formcontent_errormsg" style="display: none;">
</div>
</li>
</ol>
</form>

View File

@ -461,10 +461,16 @@ function bindAddHostButton($leftmenuItem1) {
if(clusterObj.hypervisortype == "VMware") {
$('li[input_group="vmware"]', dialogAddHost).show();
$('li[input_group="general"]', dialogAddHost).hide();
} else {
$('li[input_group="baremetal"]', dialogAddHost).hide();
} else if (clusterObj.hypervisortype == "BareMetal") {
$('li[input_group="vmware"]', dialogAddHost).hide();
$('li[input_group="general"]', dialogAddHost).show();
$('li[input_group="baremetal"]', dialogAddHost).show();
} else {
$('li[input_group="vmware"]', dialogAddHost).hide();
$('li[input_group="general"]', dialogAddHost).show();
}
$('li[input_group="baremetal"]', dialogAddHost).hide();
}
});
$button.unbind("click").bind("click", function(event) {
@ -521,10 +527,16 @@ function bindAddHostButton($leftmenuItem1) {
isValid &= validateString("vCenter Datacenter", $thisDialog.find("#host_vcenter_dc"), $thisDialog.find("#host_vcenter_dc_errormsg"));
isValid &= validateString("vCenter Host", $thisDialog.find("#host_vcenter_host"), $thisDialog.find("#host_vcenter_host_errormsg"));
} else {
isValid &= validateString("Host name", $thisDialog.find("#host_hostname"), $thisDialog.find("#host_hostname_errormsg"));
isValid &= validateString("User name", $thisDialog.find("#host_username"), $thisDialog.find("#host_username_errormsg"));
isValid &= validateString("Password", $thisDialog.find("#host_password"), $thisDialog.find("#host_password_errormsg"));
}
if (hypervisor == "BareMetal") {
isValid &= validateString("CPU Cores", $thisDialog.find("#host_baremetal_cpucores"), $thisDialog.find("#host_baremetal_cpucores_errormsg"));
isValid &= validateString("CPU", $thisDialog.find("#host_baremetal_cpu"), $thisDialog.find("#host_baremetal_cpu_errormsg"));
isValid &= validateString("Memory", $thisDialog.find("#host_baremetal_memory"), $thisDialog.find("#host_baremetal_memory_errormsg"));
isValid &= validateString("MAC", $thisDialog.find("#host_baremetal_mac"), $thisDialog.find("#host_baremetal_mac_errormsg"));
}
isValid &= validateString("Host name", $thisDialog.find("#host_hostname"), $thisDialog.find("#host_hostname_errormsg"));
isValid &= validateString("User name", $thisDialog.find("#host_username"), $thisDialog.find("#host_username_errormsg"));
isValid &= validateString("Password", $thisDialog.find("#host_password"), $thisDialog.find("#host_password_errormsg"));
}
}
if (!isValid)
return;
@ -537,7 +549,8 @@ function bindAddHostButton($leftmenuItem1) {
array1.push("&clusterid="+clusterId);
array1.push("&hypervisor=" + hypervisor);
var clustertype = clusterObj.clustertype;
array1.push("&clustertype=" + clustertype);
array1.push("&clustertype=" + clustertype);
array1.push("&hosttags=" + todb(trim($thisDialog.find("#host_tags").val())));
if(hypervisor == "VMware") {
var username = trim($thisDialog.find("#host_vcenter_username").val());
@ -557,6 +570,19 @@ function bindAddHostButton($leftmenuItem1) {
url = hostname;
array1.push("&url="+todb(url));
} else {
if (hypervisor == "BareMetal") {
var cpuCores = trim($thisDialog.find("#host_baremetal_cpucores").val());
array1.push("&cpunumber="+todb(cpuCores));
var cpuSpeed = trim($thisDialog.find("#host_baremetal_cpu").val());
array1.push("&cpuspeed="+todb(cpuSpeed));
var memory = trim($thisDialog.find("#host_baremetal_memory").val());
array1.push("&memory="+todb(memory));
var mac = trim($thisDialog.find("#host_baremetal_mac").val());
array1.push("&hostmac="+todb(mac));
}
var username = trim($thisDialog.find("#host_username").val());
array1.push("&username="+todb(username));

View File

@ -838,10 +838,16 @@ function initAddHostShortcut() {
if(clusterObj.hypervisortype == "VMware") {
$('li[input_group="vmware"]', $dialogAddHost).show();
$('li[input_group="general"]', $dialogAddHost).hide();
} else {
$('li[input_group="baremetal"]', $dialogAddHost).hide();
} else if (clusterObj.hypervisortype == "BareMetal") {
$('li[input_group="vmware"]', $dialogAddHost).hide();
$('li[input_group="general"]', $dialogAddHost).show();
$('li[input_group="baremetal"]', $dialogAddHost).show();
} else {
$('li[input_group="vmware"]', $dialogAddHost).hide();
$('li[input_group="general"]', $dialogAddHost).show();
}
$('li[input_group="baremetal"]', $dialogAddHost).hide();
}
});
$("#add_host_shortcut").unbind("click").bind("click", function(event) {
@ -871,11 +877,17 @@ function initAddHostShortcut() {
isValid &= validateString("vCenter Password", $thisDialog.find("#host_vcenter_password"), $thisDialog.find("#host_vcenter_password_errormsg"));
isValid &= validateString("vCenter Datacenter", $thisDialog.find("#host_vcenter_dc"), $thisDialog.find("#host_vcenter_dc_errormsg"));
isValid &= validateString("vCenter Host", $thisDialog.find("#host_vcenter_host"), $thisDialog.find("#host_vcenter_host_errormsg"));
} else {
isValid &= validateString("Host name", $thisDialog.find("#host_hostname"), $thisDialog.find("#host_hostname_errormsg"));
isValid &= validateString("User name", $thisDialog.find("#host_username"), $thisDialog.find("#host_username_errormsg"));
isValid &= validateString("Password", $thisDialog.find("#host_password"), $thisDialog.find("#host_password_errormsg"));
}
} else {
if (hypervisor == "BareMetal") {
isValid &= validateString("CPU Cores", $thisDialog.find("#host_baremetal_cpucores"), $thisDialog.find("#host_baremetal_cpucores_errormsg"));
isValid &= validateString("CPU", $thisDialog.find("#host_baremetal_cpu"), $thisDialog.find("#host_baremetal_cpu_errormsg"));
isValid &= validateString("Memory", $thisDialog.find("#host_baremetal_memory"), $thisDialog.find("#host_baremetal_memory_errormsg"));
isValid &= validateString("MAC", $thisDialog.find("#host_baremetal_mac"), $thisDialog.find("#host_baremetal_mac_errormsg"));
}
isValid &= validateString("Host name", $thisDialog.find("#host_hostname"), $thisDialog.find("#host_hostname_errormsg"));
isValid &= validateString("User name", $thisDialog.find("#host_username"), $thisDialog.find("#host_username_errormsg"));
isValid &= validateString("Password", $thisDialog.find("#host_password"), $thisDialog.find("#host_password_errormsg"));
}
}
if (!isValid)
return;
@ -900,7 +912,8 @@ function initAddHostShortcut() {
array1.push("&hypervisor="+hypervisor);
var clustertype = clusterObj.clustertype;
array1.push("&clustertype=" + clustertype);
array1.push("&clustertype=" + clustertype);
array1.push("&hosttags=" + todb(trim($thisDialog.find("#host_tags").val())));
if(hypervisor == "VMware") {
var username = trim($thisDialog.find("#host_vcenter_username").val());
@ -921,6 +934,19 @@ function initAddHostShortcut() {
array1.push("&url="+todb(url));
} else {
if (hypervisor == "BareMetal") {
var cpuCores = trim($thisDialog.find("#host_baremetal_cpucores").val());
array1.push("&cpunumber="+todb(cpuCores));
var cpuSpeed = trim($thisDialog.find("#host_baremetal_cpu").val());
array1.push("&cpuspeed="+todb(cpuSpeed));
var memory = trim($thisDialog.find("#host_baremetal_memory").val());
array1.push("&memory="+todb(memory));
var mac = trim($thisDialog.find("#host_baremetal_mac").val());
array1.push("&hostmac="+todb(mac));
}
var username = trim($thisDialog.find("#host_username").val());
array1.push("&username="+todb(username));
@ -1904,4 +1930,4 @@ function bindEventHandlerToDialogAddPool($dialogAddPool) {
$dialogAddPool.find("#add_pool_nfs_server").attr("disabled", false).val("");
}
});
}
}

View File

@ -82,6 +82,8 @@ function afterLoadTemplateJSP() {
formatSelect.append("<option value='OVA'>OVA</option>");
else if(selectedHypervisorType == "KVM")
formatSelect.append("<option value='QCOW2'>QCOW2</option>");
else if(selectedHypervisorType == "BareMetal")
formatSelect.append("<option value='BareMetal'>BareMetal</option>");
return false;
});

View File

@ -696,10 +696,16 @@ function bindAddHostButtonOnZonePage($button, zoneId, zoneName) {
if(clusterObj.hypervisortype == "VMware") {
$('li[input_group="vmware"]', $dialogAddHost).show();
$('li[input_group="general"]', $dialogAddHost).hide();
} else {
$('li[input_group="baremetal"]', $dialogAddHost).hide();
} else if (clusterObj.hypervisortype == "BareMetal") {
$('li[input_group="vmware"]', $dialogAddHost).hide();
$('li[input_group="general"]', $dialogAddHost).show();
$('li[input_group="baremetal"]', $dialogAddHost).show();
} else {
$('li[input_group="vmware"]', $dialogAddHost).hide();
$('li[input_group="general"]', $dialogAddHost).show();
}
$('li[input_group="baremetal"]', $dialogAddHost).hide();
}
});
$button.unbind("click").bind("click", function(event) {
@ -730,11 +736,17 @@ function bindAddHostButtonOnZonePage($button, zoneId, zoneName) {
isValid &= validateString("vCenter Password", $thisDialog.find("#host_vcenter_password"), $thisDialog.find("#host_vcenter_password_errormsg"));
isValid &= validateString("vCenter Datacenter", $thisDialog.find("#host_vcenter_dc"), $thisDialog.find("#host_vcenter_dc_errormsg"));
isValid &= validateString("vCenter Host", $thisDialog.find("#host_vcenter_host"), $thisDialog.find("#host_vcenter_host_errormsg"));
} else {
isValid &= validateString("Host name", $thisDialog.find("#host_hostname"), $thisDialog.find("#host_hostname_errormsg"));
isValid &= validateString("User name", $thisDialog.find("#host_username"), $thisDialog.find("#host_username_errormsg"));
isValid &= validateString("Password", $thisDialog.find("#host_password"), $thisDialog.find("#host_password_errormsg"));
}
} else {
if (hypervisor == "BareMetal") {
isValid &= validateString("CPU Cores", $thisDialog.find("#host_baremetal_cpucores"), $thisDialog.find("#host_baremetal_cpucores_errormsg"));
isValid &= validateString("CPU", $thisDialog.find("#host_baremetal_cpu"), $thisDialog.find("#host_baremetal_cpu_errormsg"));
isValid &= validateString("Memory", $thisDialog.find("#host_baremetal_memory"), $thisDialog.find("#host_baremetal_memory_errormsg"));
isValid &= validateString("MAC", $thisDialog.find("#host_baremetal_mac"), $thisDialog.find("#host_baremetal_mac_errormsg"));
}
isValid &= validateString("Host name", $thisDialog.find("#host_hostname"), $thisDialog.find("#host_hostname_errormsg"));
isValid &= validateString("User name", $thisDialog.find("#host_username"), $thisDialog.find("#host_username_errormsg"));
isValid &= validateString("Password", $thisDialog.find("#host_password"), $thisDialog.find("#host_password_errormsg"));
}
}
if (!isValid)
return;
@ -758,7 +770,8 @@ function bindAddHostButtonOnZonePage($button, zoneId, zoneName) {
array1.push("&hypervisor="+hypervisor);
var clustertype = clusterObj.clustertype;
array1.push("&clustertype=" + clustertype);
array1.push("&clustertype=" + clustertype);
array1.push("&hosttags=" + todb(trim($thisDialog.find("#host_tags").val())));
if(hypervisor == "VMware") {
var username = trim($thisDialog.find("#host_vcenter_username").val());
@ -779,6 +792,20 @@ function bindAddHostButtonOnZonePage($button, zoneId, zoneName) {
array1.push("&url="+todb(url));
} else {
if (hypervisor == "BareMetal") {
var cpuCores = trim($thisDialog.find("#host_baremetal_cpucores").val());
array1.push("&cpunumber="+todb(cpuCores));
var cpuSpeed = trim($thisDialog.find("#host_baremetal_cpu").val());
array1.push("&cpuspeed="+todb(cpuSpeed));
var memory = trim($thisDialog.find("#host_baremetal_memory").val());
array1.push("&memory="+todb(memory));
var mac = trim($thisDialog.find("#host_baremetal_mac").val());
array1.push("&hostmac="+todb(mac));
}
var username = trim($thisDialog.find("#host_username").val());
array1.push("&username="+todb(username));
@ -956,4 +983,4 @@ function bindAddPrimaryStorageButtonOnZonePage($button, zoneId, zoneName) {
}).dialog("open");
return false;
});
}
}

View File

@ -60,5 +60,6 @@ public interface SerialVersionUID {
public static final long ConnectionException = Base | 0x20;
public static final long PermissionDeniedException = Base | 0x21;
public static final long sshException = Base | 0x22;
public static final long HttpCallException = Base | 0x23;
public static final long VirtualMachineMigrationException = Base | 0x24;
}