Skip to content

Commit 31d6e54

Browse files
author
frank
committed
CloudStack CLOUDSTACK-774
Supporting kickstart in CloudStack baremetal make kikcstart working with ubuntu
1 parent cec4d8b commit 31d6e54

4 files changed

Lines changed: 80 additions & 41 deletions

File tree

plugins/hypervisors/baremetal/src/com/cloud/baremetal/networkservice/BaremetalKickStartPxeResource.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -175,7 +175,7 @@ private Answer execute(PrepareKickstartPxeServerCommand cmd) {
175175
}
176176

177177
String copyTo = String.format("%s/%s", _tftpDir, cmd.getTemplateUuid());
178-
String script = String.format("python /usr/bin/prepare_kickstart_kernel_initrd.py %s %s", cmd.getRepo(), copyTo);
178+
String script = String.format("python /usr/bin/prepare_kickstart_kernel_initrd.py %s %s %s", cmd.getKernel(), cmd.getInitrd(), copyTo);
179179

180180
if (!SSHCmdHelper.sshExecuteCmd(sshConnection, script)) {
181181
return new Answer(cmd, false, "prepare kickstart at pxe server " + _ip + " failed, command:" + script);

plugins/hypervisors/baremetal/src/com/cloud/baremetal/networkservice/BaremetalKickStartServiceImpl.java

Lines changed: 29 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -95,11 +95,36 @@ public boolean prepare(VirtualMachineProfile<UserVmVO> profile, NicProfile nic,
9595
try {
9696
String tpl = profile.getTemplate().getUrl();
9797
assert tpl != null : "How can a null template get here!!!";
98-
String[] tpls = tpl.split(";");
99-
assert tpls.length == 2 : "Template is not correctly encoded. " + tpl;
98+
String[] tpls = tpl.split(";");
99+
CloudRuntimeException err = new CloudRuntimeException(String.format("template url[%s] is not correctly encoded. it must be in format of ks=http_link_to_kickstartfile;kernel=nfs_path_to_pxe_kernel;initrd=nfs_path_to_pxe_initrd", tpl));
100+
if (tpls.length != 3) {
101+
throw err;
102+
}
103+
104+
String ks = null;
105+
String kernel = null;
106+
String initrd = null;
107+
108+
for (String t : tpls) {
109+
String[] kv = t.split("=");
110+
if (kv.length != 2) {
111+
throw err;
112+
}
113+
if (kv[0].equals("ks")) {
114+
ks = kv[1];
115+
} else if (kv[0].equals("kernel")) {
116+
kernel = kv[1];
117+
} else if (kv[0].equals("initrd")) {
118+
initrd = kv[1];
119+
} else {
120+
throw err;
121+
}
122+
}
123+
100124
PrepareKickstartPxeServerCommand cmd = new PrepareKickstartPxeServerCommand();
101-
cmd.setKsFile(tpls[0]);
102-
cmd.setRepo(tpls[1]);
125+
cmd.setKsFile(ks);
126+
cmd.setInitrd(initrd);
127+
cmd.setKernel(kernel);
103128
cmd.setMac(nic.getMacAddress());
104129
cmd.setTemplateUuid(template.getUuid());
105130
Answer aws = _agentMgr.send(pxeVo.getHostId(), cmd);

plugins/hypervisors/baremetal/src/com/cloud/baremetal/networkservice/PrepareKickstartPxeServerCommand.java

Lines changed: 20 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -22,10 +22,11 @@
2222

2323
public class PrepareKickstartPxeServerCommand extends Command {
2424
private String ksFile;
25-
private String repo;
2625
private String templateUuid;
2726
private String mac;
28-
private String ksDevice;
27+
private String ksDevice;
28+
private String kernel;
29+
private String initrd;
2930

3031
@Override
3132
public boolean executeInSequence() {
@@ -39,15 +40,23 @@ public String getKsFile() {
3940
public void setKsFile(String ksFile) {
4041
this.ksFile = ksFile;
4142
}
42-
43-
public String getRepo() {
44-
return repo;
45-
}
46-
47-
public void setRepo(String repo) {
48-
this.repo = repo;
49-
}
50-
43+
44+
public String getKernel() {
45+
return kernel;
46+
}
47+
48+
public void setKernel(String kernel) {
49+
this.kernel = kernel;
50+
}
51+
52+
public String getInitrd() {
53+
return initrd;
54+
}
55+
56+
public void setInitrd(String initrd) {
57+
this.initrd = initrd;
58+
}
59+
5160
public String getTemplateUuid() {
5261
return templateUuid;
5362
}

scripts/network/ping/prepare_kickstart_kernel_initrd.py

Lines changed: 30 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -21,50 +21,55 @@
2121
import os.path
2222
import os
2323

24-
iso_folder = ''
25-
copy_to = ''
24+
kernel = None
25+
initrd = None
26+
copy_to = None
2627

2728
def cmd(cmdstr, err=True):
29+
print cmdstr
2830
if os.system(cmdstr) != 0 and err:
2931
raise Exception("Failed to run shell command: %s" % cmdstr)
3032

3133
def prepare():
34+
global kernel, initrd, copy_to
3235
try:
33-
kernel = os.path.join(copy_to, "vmlinuz")
34-
initrd = os.path.join(copy_to, "initrd.img")
35-
if os.path.exists(kernel) and os.path.exists(initrd):
36+
k = os.path.join(copy_to, "vmlinuz")
37+
i = os.path.join(copy_to, "initrd.img")
38+
if os.path.exists(k) and os.path.exists(i):
3639
print "Having template(%s) prepared already, skip copying" % copy_to
3740
return 0
3841
else:
3942
if not os.path.exists(copy_to):
4043
os.makedirs(copy_to)
4144

42-
mnt_path = tempfile.mkdtemp()
43-
try:
44-
mnt = "mount %s %s" % (iso_folder, mnt_path)
45-
cmd(mnt)
46-
47-
kernel = os.path.join(mnt_path, "vmlinuz")
48-
initrd = os.path.join(mnt_path, "initrd.img")
49-
cp = "cp -f %s %s/" % (kernel, copy_to)
50-
cmd(cp)
51-
cp = "cp -f %s %s/" % (initrd, copy_to)
52-
cmd(cp)
53-
finally:
54-
umnt = "umount %s" % mnt_path
55-
cmd(umnt, False)
56-
rm = "rm -r %s" % mnt_path
57-
cmd(rm, False)
58-
return 0
45+
46+
def copy_from_nfs(src, dst):
47+
mnt_path = tempfile.mkdtemp()
48+
try:
49+
nfs_path = os.path.dirname(src)
50+
filename = os.path.basename(src)
51+
t = os.path.join(mnt_path, filename)
52+
mnt = "mount %s %s" % (nfs_path, mnt_path)
53+
cmd(mnt)
54+
cp = "cp -f %s %s" % (t, dst)
55+
cmd(cp)
56+
finally:
57+
umnt = "umount %s" % mnt_path
58+
cmd(umnt, False)
59+
rm = "rm -r %s" % mnt_path
60+
cmd(rm, False)
61+
62+
copy_from_nfs(kernel, copy_to)
63+
copy_from_nfs(initrd, copy_to)
5964
except Exception, e:
6065
print e
6166
return 1
6267

6368
if __name__ == "__main__":
64-
if len(sys.argv) < 3:
65-
print "Usage: prepare_kickstart_kerneal_initrd.py path_to_kernel_initrd_iso path_kernel_initrd_copy_to"
69+
if len(sys.argv) < 4:
70+
print "Usage: prepare_kickstart_kerneal_initrd.py path_to_kernel path_to_initrd path_kernel_initrd_copy_to"
6671
sys.exit(1)
6772

68-
(iso_folder, copy_to) = sys.argv[1:]
73+
(kernel, initrd, copy_to) = sys.argv[1:]
6974
sys.exit(prepare())
7075

0 commit comments

Comments
 (0)