diff --git a/api/src/com/cloud/agent/api/baremetal/PrepareLinMinPxeServerAnswer.java b/api/src/com/cloud/agent/api/baremetal/PrepareLinMinPxeServerAnswer.java
index 94d1b284667..b231529f1f0 100644
--- a/api/src/com/cloud/agent/api/baremetal/PrepareLinMinPxeServerAnswer.java
+++ b/api/src/com/cloud/agent/api/baremetal/PrepareLinMinPxeServerAnswer.java
@@ -9,6 +9,5 @@ public class PrepareLinMinPxeServerAnswer extends Answer {
public PrepareLinMinPxeServerAnswer(PrepareLinMinPxeServerCommand cmd, String details) {
super(cmd, false, details);
- }
-
+ }
}
diff --git a/api/src/com/cloud/agent/api/baremetal/PrepareLinMinPxeServerCommand.java b/api/src/com/cloud/agent/api/baremetal/PrepareLinMinPxeServerCommand.java
index 33a65377eff..b9a66473f39 100644
--- a/api/src/com/cloud/agent/api/baremetal/PrepareLinMinPxeServerCommand.java
+++ b/api/src/com/cloud/agent/api/baremetal/PrepareLinMinPxeServerCommand.java
@@ -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;
- }
-
}
diff --git a/api/src/com/cloud/agent/api/baremetal/PreparePxeServerAnswer.java b/api/src/com/cloud/agent/api/baremetal/PreparePxeServerAnswer.java
new file mode 100644
index 00000000000..06066b85d87
--- /dev/null
+++ b/api/src/com/cloud/agent/api/baremetal/PreparePxeServerAnswer.java
@@ -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);
+ }
+}
diff --git a/api/src/com/cloud/agent/api/baremetal/PreparePxeServerCommand.java b/api/src/com/cloud/agent/api/baremetal/PreparePxeServerCommand.java
new file mode 100644
index 00000000000..a7bb84475e0
--- /dev/null
+++ b/api/src/com/cloud/agent/api/baremetal/PreparePxeServerCommand.java
@@ -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;
+ }
+
+}
diff --git a/api/src/com/cloud/agent/api/routing/DhcpEntryCommand.java b/api/src/com/cloud/agent/api/routing/DhcpEntryCommand.java
index e070cd8adf1..cc55cb23287 100644
--- a/api/src/com/cloud/agent/api/routing/DhcpEntryCommand.java
+++ b/api/src/com/cloud/agent/api/routing/DhcpEntryCommand.java
@@ -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;
+ }
+
}
diff --git a/api/src/com/cloud/api/ApiConstants.java b/api/src/com/cloud/api/ApiConstants.java
index 19f299dc367..fd526db0e2c 100755
--- a/api/src/com/cloud/api/ApiConstants.java
+++ b/api/src/com/cloud/api/ApiConstants.java
@@ -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";
}
-
diff --git a/api/src/com/cloud/api/commands/AddHostCmd.java b/api/src/com/cloud/api/commands/AddHostCmd.java
index ee739cc5cc7..3b08bda95ce 100644
--- a/api/src/com/cloud/api/commands/AddHostCmd.java
+++ b/api/src/com/cloud/api/commands/AddHostCmd.java
@@ -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;
diff --git a/api/src/com/cloud/api/commands/AssociateIPAddrCmd.java b/api/src/com/cloud/api/commands/AssociateIPAddrCmd.java
index 5894e2aaf76..fe5a2838be1 100644
--- a/api/src/com/cloud/api/commands/AssociateIPAddrCmd.java
+++ b/api/src/com/cloud/api/commands/AssociateIPAddrCmd.java
@@ -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
diff --git a/api/src/com/cloud/api/commands/CreatePodCmd.java b/api/src/com/cloud/api/commands/CreatePodCmd.java
index 4cffbf10153..173eb78d383 100644
--- a/api/src/com/cloud/api/commands/CreatePodCmd.java
+++ b/api/src/com/cloud/api/commands/CreatePodCmd.java
@@ -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 ///////////////////////
/////////////////////////////////////////////////////
diff --git a/api/src/com/cloud/dc/Pod.java b/api/src/com/cloud/dc/Pod.java
index 14a82e4fee0..c7d3667a257 100644
--- a/api/src/com/cloud/dc/Pod.java
+++ b/api/src/com/cloud/dc/Pod.java
@@ -31,4 +31,6 @@ public interface Pod extends Grouping {
String getName();
AllocationState getAllocationState();
+
+ boolean getExternalDhcp();
}
diff --git a/api/src/com/cloud/exception/UnsupportedServiceException.java b/api/src/com/cloud/exception/UnsupportedServiceException.java
new file mode 100644
index 00000000000..d6da7a11fae
--- /dev/null
+++ b/api/src/com/cloud/exception/UnsupportedServiceException.java
@@ -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 .
+ *
+ */
+
+package com.cloud.exception;
+
+import com.cloud.utils.exception.CloudRuntimeException;
+
+public class UnsupportedServiceException extends CloudRuntimeException{
+
+ public UnsupportedServiceException(String message) {
+ super(message);
+ }
+}
diff --git a/api/src/com/cloud/network/NetworkService.java b/api/src/com/cloud/network/NetworkService.java
index 4594ddfd5a6..139c75f3299 100644
--- a/api/src/com/cloud/network/NetworkService.java
+++ b/api/src/com/cloud/network/NetworkService.java
@@ -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);
}
diff --git a/build/build-cloud.xml b/build/build-cloud.xml
index a6af30d6335..fd2c48cfacb 100755
--- a/build/build-cloud.xml
+++ b/build/build-cloud.xml
@@ -213,6 +213,7 @@
+
@@ -223,7 +224,8 @@
-
+
+
diff --git a/cloud.spec b/cloud.spec
index e91fcae696f..a71171efd4f 100644
--- a/cloud.spec
+++ b/cloud.spec
@@ -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
diff --git a/scripts/network/exdhcp/dhcpd_edithosts.py b/scripts/network/exdhcp/dhcpd_edithosts.py
new file mode 100644
index 00000000000..652cdbeb3b1
--- /dev/null
+++ b/scripts/network/exdhcp/dhcpd_edithosts.py
@@ -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)
+
diff --git a/scripts/network/exdhcp/prepare_dnsmasq.sh b/scripts/network/exdhcp/prepare_dnsmasq.sh
index 3a94e94f96b..61fda158dcc 100644
--- a/scripts/network/exdhcp/prepare_dnsmasq.sh
+++ b/scripts/network/exdhcp/prepare_dnsmasq.sh
@@ -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
diff --git a/scripts/network/ping/ping.tar.bz2 b/scripts/network/ping/ping.tar.bz2
new file mode 100644
index 00000000000..97bcfeea88e
Binary files /dev/null and b/scripts/network/ping/ping.tar.bz2 differ
diff --git a/scripts/network/ping/prepare_ping.sh b/scripts/network/ping/prepare_ping.sh
new file mode 100644
index 00000000000..a9d868065e7
--- /dev/null
+++ b/scripts/network/ping/prepare_ping.sh
@@ -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
diff --git a/scripts/network/ping/prepare_tftp_bootfile.py b/scripts/network/ping/prepare_tftp_bootfile.py
new file mode 100644
index 00000000000..581ddd82b65
--- /dev/null
+++ b/scripts/network/ping/prepare_tftp_bootfile.py
@@ -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)
diff --git a/scripts/util/prepare_linmin.sh b/scripts/util/prepare_linmin.sh
new file mode 100644
index 00000000000..34a9a68ac00
--- /dev/null
+++ b/scripts/util/prepare_linmin.sh
@@ -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
diff --git a/server/src/com/cloud/agent/manager/AgentManagerImpl.java b/server/src/com/cloud/agent/manager/AgentManagerImpl.java
index 60831c70a37..11bdde5cb6d 100755
--- a/server/src/com/cloud/agent/manager/AgentManagerImpl.java
+++ b/server/src/com/cloud/agent/manager/AgentManagerImpl.java
@@ -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 hostTags = cmd.getHostTags();
MapbareMetalParams = new HashMap();
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 hostTags = cmd.getHostTags();
String allocationState = cmd.getAllocationState();
if (allocationState == null) {
allocationState = Host.HostAllocationState.Enabled.toString();
diff --git a/server/src/com/cloud/api/ApiDBUtils.java b/server/src/com/cloud/api/ApiDBUtils.java
index 015bc217db1..954b18d1c0a 100755
--- a/server/src/com/cloud/api/ApiDBUtils.java
+++ b/server/src/com/cloud/api/ApiDBUtils.java
@@ -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 listTemplateHostBy(long templateId, Long zoneId) {
if (zoneId != null) {
- HostVO secondaryStorageHost = _storageMgr.getSecondaryStorageHost(zoneId);
- if (secondaryStorageHost == null) {
- return new ArrayList();
- } 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();
+ } else {
+ return _templateHostDao.listByHostTemplate(secondaryStorageHost.getId(), templateId);
+ }
+ }
} else {
return _templateHostDao.listByOnlyTemplateId(templateId);
}
diff --git a/server/src/com/cloud/configuration/Config.java b/server/src/com/cloud/configuration/Config.java
index dc9c9cd275f..87bb766d830 100755
--- a/server/src/com/cloud/configuration/Config.java
+++ b/server/src/com/cloud/configuration/Config.java
@@ -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),
diff --git a/server/src/com/cloud/configuration/ConfigurationManagerImpl.java b/server/src/com/cloud/configuration/ConfigurationManagerImpl.java
index 1f7db2aa0c0..da12193b622 100755
--- a/server/src/com/cloud/configuration/ConfigurationManagerImpl.java
+++ b/server/src/com/cloud/configuration/ConfigurationManagerImpl.java
@@ -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");
}
diff --git a/server/src/com/cloud/dc/HostPodVO.java b/server/src/com/cloud/dc/HostPodVO.java
index 3c9ea73832f..5f3a0622119 100644
--- a/server/src/com/cloud/dc/HostPodVO.java
+++ b/server/src/com/cloud/dc/HostPodVO.java
@@ -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) {
diff --git a/server/src/com/cloud/deploy/BareMetalPlanner.java b/server/src/com/cloud/deploy/BareMetalPlanner.java
index e75f661bc4b..f42cc5325d6 100644
--- a/server/src/com/cloud/deploy/BareMetalPlanner.java
+++ b/server/src/com/cloud/deploy/BareMetalPlanner.java
@@ -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 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 hosts = _hostDao.listByCluster(cluster.getId());
if (hostTag != null) {
- List 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 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;
+ }
}
diff --git a/server/src/com/cloud/host/dao/HostDao.java b/server/src/com/cloud/host/dao/HostDao.java
index 3cc6f9990c5..83696773aa7 100644
--- a/server/src/com/cloud/host/dao/HostDao.java
+++ b/server/src/com/cloud/host/dao/HostDao.java
@@ -139,6 +139,8 @@ public interface HostDao extends GenericDao {
long getNextSequence(long hostId);
void loadDetails(HostVO host);
+
+ void saveDetails(HostVO host);
HostVO findConsoleProxyHost(String name, Type type);
diff --git a/server/src/com/cloud/host/dao/HostDaoImpl.java b/server/src/com/cloud/host/dao/HostDaoImpl.java
index 77d14abe832..c1d8acc9e07 100644
--- a/server/src/com/cloud/host/dao/HostDaoImpl.java
+++ b/server/src/com/cloud/host/dao/HostDaoImpl.java
@@ -598,8 +598,9 @@ public class HostDaoImpl extends GenericDaoBase implements HostDao
sc.setParameters("type", type.toString());
return listBy(sc);
}
-
- protected void saveDetails(HostVO host) {
+
+ @Override
+ public void saveDetails(HostVO host) {
Map details = host.getDetails();
if (details == null) {
return;
diff --git a/server/src/com/cloud/network/NetworkManager.java b/server/src/com/cloud/network/NetworkManager.java
index 51b77317809..a294954ca04 100644
--- a/server/src/com/cloud/network/NetworkManager.java
+++ b/server/src/com/cloud/network/NetworkManager.java
@@ -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 getServiceCapability(long zoneId, Service service);
+ Map getServiceCapabilities(long zoneId, Service service);
boolean applyIpAssociations(Network network, boolean continueOnError) throws ResourceUnavailableException;
diff --git a/server/src/com/cloud/network/NetworkManagerImpl.java b/server/src/com/cloud/network/NetworkManagerImpl.java
index 5e3b0df292b..2fa5efb575f 100755
--- a/server/src/com/cloud/network/NetworkManagerImpl.java
+++ b/server/src/com/cloud/network/NetworkManagerImpl.java
@@ -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 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 getServiceCapability(long zoneId, Service service) {
+ public Map getServiceCapabilities(long zoneId, Service service) {
Map> 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()));
+ }
}
diff --git a/server/src/com/cloud/network/element/DhcpElement.java b/server/src/com/cloud/network/element/DhcpElement.java
index 8d2c23ad436..1a3f649cc27 100644
--- a/server/src/com/cloud/network/element/DhcpElement.java
+++ b/server/src/com/cloud/network/element/DhcpElement.java
@@ -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) {
diff --git a/server/src/com/cloud/network/guru/PublicNetworkGuru.java b/server/src/com/cloud/network/guru/PublicNetworkGuru.java
index e86bf9bf671..635abe7da62 100644
--- a/server/src/com/cloud/network/guru/PublicNetworkGuru.java
+++ b/server/src/com/cloud/network/guru/PublicNetworkGuru.java
@@ -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");
diff --git a/server/src/com/cloud/network/rules/RulesManagerImpl.java b/server/src/com/cloud/network/rules/RulesManagerImpl.java
index 7c79ee1dd8a..c3df8310dc9 100755
--- a/server/src/com/cloud/network/rules/RulesManagerImpl.java
+++ b/server/src/com/cloud/network/rules/RulesManagerImpl.java
@@ -220,8 +220,8 @@ public class RulesManagerImpl implements RulesManager, RulesService, Manager {
}
//Verify that the network guru supports the protocol specified
- Map firewallCapability = _networkMgr.getServiceCapability(network.getDataCenterId(), Service.Firewall);
- String supportedProtocols = firewallCapability.get(Capability.SupportedProtocols).toLowerCase();
+ Map 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 firewallCapability = _networkMgr.getServiceCapability(network.getDataCenterId(), Service.Firewall);
+ Map 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());
diff --git a/server/src/com/cloud/server/ConfigurationServerImpl.java b/server/src/com/cloud/server/ConfigurationServerImpl.java
index 8065205b827..6c57d4fcb32 100644
--- a/server/src/com/cloud/server/ConfigurationServerImpl.java
+++ b/server/src/com/cloud/server/ConfigurationServerImpl.java
@@ -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;
diff --git a/server/src/com/cloud/storage/download/DownloadMonitorImpl.java b/server/src/com/cloud/storage/download/DownloadMonitorImpl.java
index 959f0f89b19..95750f0458b 100755
--- a/server/src/com/cloud/storage/download/DownloadMonitorImpl.java
+++ b/server/src/com/cloud/storage/download/DownloadMonitorImpl.java
@@ -522,6 +522,8 @@ public class DownloadMonitorImpl implements DownloadMonitor {
}
/*Only download templates whose hypervirsor type is in the zone*/
List 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.
diff --git a/server/src/com/cloud/template/TemplateManagerImpl.java b/server/src/com/cloud/template/TemplateManagerImpl.java
index 65199b3c378..3a1de5cdd09 100755
--- a/server/src/com/cloud/template/TemplateManagerImpl.java
+++ b/server/src/com/cloud/template/TemplateManagerImpl.java
@@ -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 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 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);
diff --git a/server/src/com/cloud/vm/UserVmManagerImpl.java b/server/src/com/cloud/vm/UserVmManagerImpl.java
index 0b6732cf8ae..7f4ab11d444 100755
--- a/server/src/com/cloud/vm/UserVmManagerImpl.java
+++ b/server/src/com/cloud/vm/UserVmManagerImpl.java
@@ -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,
diff --git a/server/src/com/cloud/vm/VirtualMachineManagerImpl.java b/server/src/com/cloud/vm/VirtualMachineManagerImpl.java
index 6990968dea7..d9a32c4dc80 100755
--- a/server/src/com/cloud/vm/VirtualMachineManagerImpl.java
+++ b/server/src/com/cloud/vm/VirtualMachineManagerImpl.java
@@ -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);
}
diff --git a/setup/db/create-schema.sql b/setup/db/create-schema.sql
index 668a6e80c40..3a16b4586f4 100755
--- a/setup/db/create-schema.sql
+++ b/setup/db/create-schema.sql
@@ -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`),
diff --git a/ui/jsp/cluster.jsp b/ui/jsp/cluster.jsp
index 8649d43a172..237cb7e5b00 100644
--- a/ui/jsp/cluster.jsp
+++ b/ui/jsp/cluster.jsp
@@ -217,7 +217,42 @@ dictionary = {
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/ui/jsp/host.jsp b/ui/jsp/host.jsp
index 0b30e568efe..8a7d1aa054d 100644
--- a/ui/jsp/host.jsp
+++ b/ui/jsp/host.jsp
@@ -778,7 +778,42 @@ dictionary = {
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/ui/jsp/pod.jsp b/ui/jsp/pod.jsp
index 922277dd049..f32c18e6e71 100644
--- a/ui/jsp/pod.jsp
+++ b/ui/jsp/pod.jsp
@@ -342,7 +342,42 @@ dictionary = {
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/ui/jsp/resource.jsp b/ui/jsp/resource.jsp
index 3369749a34a..c6362314da2 100644
--- a/ui/jsp/resource.jsp
+++ b/ui/jsp/resource.jsp
@@ -866,7 +866,7 @@
-
+ :
diff --git a/ui/jsp/zone.jsp b/ui/jsp/zone.jsp
index fb8628c0b7f..970ce96815b 100644
--- a/ui/jsp/zone.jsp
+++ b/ui/jsp/zone.jsp
@@ -423,6 +423,41 @@ dictionary = {
+
+ -
+
+
+
+
+
+ -
+
+
+
+
+
+ -
+
+
+
+
+
+ -
+
+
+
+
+
+ -
+
+
+
+
diff --git a/ui/scripts/cloud.core.pod.js b/ui/scripts/cloud.core.pod.js
index 9e3d3aff787..2b063f39813 100644
--- a/ui/scripts/cloud.core.pod.js
+++ b/ui/scripts/cloud.core.pod.js
@@ -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));
diff --git a/ui/scripts/cloud.core.resource.js b/ui/scripts/cloud.core.resource.js
index ff6ca1516c3..fe896b20b65 100644
--- a/ui/scripts/cloud.core.resource.js
+++ b/ui/scripts/cloud.core.resource.js
@@ -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("");
}
});
-}
\ No newline at end of file
+}
diff --git a/ui/scripts/cloud.core.template.js b/ui/scripts/cloud.core.template.js
index ce9515b28f5..7e93fb3b288 100644
--- a/ui/scripts/cloud.core.template.js
+++ b/ui/scripts/cloud.core.template.js
@@ -82,6 +82,8 @@ function afterLoadTemplateJSP() {
formatSelect.append("");
else if(selectedHypervisorType == "KVM")
formatSelect.append("");
+ else if(selectedHypervisorType == "BareMetal")
+ formatSelect.append("");
return false;
});
diff --git a/ui/scripts/cloud.core.zone.js b/ui/scripts/cloud.core.zone.js
index 401d5841b1f..be4938e89a0 100644
--- a/ui/scripts/cloud.core.zone.js
+++ b/ui/scripts/cloud.core.zone.js
@@ -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;
});
-}
\ No newline at end of file
+}
diff --git a/utils/src/com/cloud/utils/SerialVersionUID.java b/utils/src/com/cloud/utils/SerialVersionUID.java
index fd8abffb5c1..a1a578fbd67 100755
--- a/utils/src/com/cloud/utils/SerialVersionUID.java
+++ b/utils/src/com/cloud/utils/SerialVersionUID.java
@@ -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;
}