Bug 8208 - bare metal provisioning

Work with PING
This commit is contained in:
Frank 2011-04-04 19:19:42 -07:00
parent ab643851c5
commit 5819e8fee0
10 changed files with 219 additions and 61 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

@ -213,5 +213,10 @@ public class ApiConstants {
public static final String PRIVATE_NETMASK = "privatenetmask";
public static final String PRIVATE_NETWORK_ID = "privatenetworkid";
public static final String USE_EXTERNAL_DHCP = "useexternaldhcp";
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

@ -212,6 +212,7 @@
<fileset dir="${scripts.dir}">
<include name="**/*"/>
<exclude name="**/fsimage.so"/>
<exclude name="**/ping.tar.bz2"/>
<exclude name="**/vhd-util"/>
<exclude name="**/.*" />
</fileset>
@ -222,7 +223,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

@ -10,8 +10,8 @@ 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;}'
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;}'
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
@ -95,6 +95,12 @@ if __name__ == "__main__":
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)

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)