aboutsummaryrefslogtreecommitdiffstats
path: root/tools
diff options
context:
space:
mode:
authorrac61@labyrinth.cl.cam.ac.uk <rac61@labyrinth.cl.cam.ac.uk>2003-07-15 12:25:38 +0000
committerrac61@labyrinth.cl.cam.ac.uk <rac61@labyrinth.cl.cam.ac.uk>2003-07-15 12:25:38 +0000
commit86ac4fab39ea45e7ff317b8f3f719c77b6f121b4 (patch)
treef1c531ea9fdf0e927a99dabc6cfc8f26bedcda58 /tools
parent321726ff146b7ba0d665549370405d5f26bc345c (diff)
downloadxen-86ac4fab39ea45e7ff317b8f3f719c77b6f121b4.tar.gz
xen-86ac4fab39ea45e7ff317b8f3f719c77b6f121b4.tar.bz2
xen-86ac4fab39ea45e7ff317b8f3f719c77b6f121b4.zip
bitkeeper revision 1.356 (3f13f2c2PyTtgUQ-EMLCir5OE3cd1g)
Add support for usr= argument to xenctl domain new Add better argument construction (ro if root is a disk) Add automatic physical disk access grant if root/usr are disks
Diffstat (limited to 'tools')
-rw-r--r--tools/control/src/org/xenoserver/cmdline/ParseDomainNew.java32
-rw-r--r--tools/control/src/org/xenoserver/control/CommandDomainNew.java67
-rw-r--r--tools/control/src/org/xenoserver/control/Defaults.java5
-rw-r--r--tools/control/src/org/xenoserver/control/StringPattern.java4
4 files changed, 88 insertions, 20 deletions
diff --git a/tools/control/src/org/xenoserver/cmdline/ParseDomainNew.java b/tools/control/src/org/xenoserver/cmdline/ParseDomainNew.java
index 910ffc01ea..ed75aa744d 100644
--- a/tools/control/src/org/xenoserver/cmdline/ParseDomainNew.java
+++ b/tools/control/src/org/xenoserver/cmdline/ParseDomainNew.java
@@ -4,7 +4,10 @@ import java.util.LinkedList;
import org.xenoserver.control.CommandDomainNew;
import org.xenoserver.control.CommandFailedException;
+import org.xenoserver.control.CommandPhysicalGrant;
import org.xenoserver.control.Defaults;
+import org.xenoserver.control.Mode;
+import org.xenoserver.control.StringPattern;
public class ParseDomainNew extends CommandParser {
public void parse(Defaults d, LinkedList args)
@@ -16,6 +19,7 @@ public class ParseDomainNew extends CommandParser {
int vifs = getIntParameter(args, 'v', d.domainVIFs);
String bargs = getStringParameter(args, 'a', d.args) + " ";
String root_dev = getStringParameter(args, 'd', d.rootDevice);
+ String usr_dev = getStringParameter(args, 'u', d.usrDevice);
String nfs_root_path = getStringParameter(args, 'f', d.nwNFSRoot);
String nw_ip = getStringParameter(args, '4', d.nwIP);
String nw_gw = getStringParameter(args, 'g', d.nwGateway);
@@ -40,12 +44,33 @@ public class ParseDomainNew extends CommandParser {
nw_gw,
nw_mask,
nw_nfs_server,
- nw_host);
+ nw_host,
+ usr_dev);
c.execute();
String[] output = c.output();
for (int i = 0; i < output.length; i++) {
System.out.println(output[i]);
}
+
+ if (root_dev.startsWith("/dev/sda") || root_dev.startsWith("/dev/hda")) {
+ String real_root = StringPattern.parse(root_dev).resolve(c.domain_id());
+ String device = real_root.substring(real_root.indexOf('/',1)+1);
+ CommandPhysicalGrant cg = new CommandPhysicalGrant(d,c.domain_id(),device,Mode.READ_WRITE,false);
+ String output2 = cg.execute();
+ if ( output2 != null ) {
+ System.out.println(output2);
+ }
+ }
+
+ if (usr_dev != null && (usr_dev.startsWith("/dev/sda")) || usr_dev.startsWith("/dev/hda")) {
+ String real_usr = StringPattern.parse(usr_dev).resolve(c.domain_id());
+ String device = real_usr.substring(real_usr.indexOf('/',1)+1);
+ CommandPhysicalGrant cg = new CommandPhysicalGrant(d,c.domain_id(),device,Mode.READ_ONLY,false);
+ String output2 = cg.execute();
+ if ( output2 != null ) {
+ System.out.println(output2);
+ }
+ }
}
public String getName() {
@@ -53,7 +78,7 @@ public class ParseDomainNew extends CommandParser {
}
public String getUsage() {
- return "[-n<domain_name>] [-k<size>] [-i<image>] [-v<num_vifs>] [-r<initrd>] [-d<root_device>] [-f<nfs_root>] [-s<nfs_boot_server>] [-4<ipv4_boot_address>] [-g<ipv4_boot_gateway>] [-m<ipv4_boot_netmask>] [-h<hostname>] [-a<args>]";
+ return "[-n<domain_name>] [-k<size>] [-i<image>] [-v<num_vifs>] [-r<initrd>] [-d<root_device>] [-u<usr_device>] [-f<nfs_root>] [-s<nfs_boot_server>] [-4<ipv4_boot_address>] [-g<ipv4_boot_gateway>] [-m<ipv4_boot_netmask>] [-h<hostname>] [-a<args>]";
}
public String getHelpText() {
@@ -68,7 +93,8 @@ public class ParseDomainNew extends CommandParser {
+ " -v Number of VIFs domain_vifs\n"
+ " -r InitRD (if required) domain_init_rd\n"
+ " -d Root device (e.g /dev/nfs, /dev/hda3) root_device\n"
- + " -a Additional boot parameters\n"
+ + " -u Usr dev/path (e.g /dev/hda3, server:path)usr_device\n"
+ + " -a Additional boot parameters args\n"
+ "\n"
+ "Networking options:\n"
+ " -f NFS root (if /dev/nfs specified) nw_nfs_root\n"
diff --git a/tools/control/src/org/xenoserver/control/CommandDomainNew.java b/tools/control/src/org/xenoserver/control/CommandDomainNew.java
index 8bb0c9be44..5600cd04da 100644
--- a/tools/control/src/org/xenoserver/control/CommandDomainNew.java
+++ b/tools/control/src/org/xenoserver/control/CommandDomainNew.java
@@ -31,6 +31,8 @@ public class CommandDomainNew extends Command {
private String bargs;
/** Root device */
private String root_dev;
+ /** Usr device */
+ private String usr_dev;
/** NFS root path */
private String nfs_root_path;
/** IP address */
@@ -45,6 +47,8 @@ public class CommandDomainNew extends Command {
private String nw_host;
/** Output from domain creation */
private String[] output;
+ /** Domain ID created. */
+ private int domain_id;
/**
* @return Output from domain creation.
@@ -52,6 +56,13 @@ public class CommandDomainNew extends Command {
public String[] output() {
return output;
}
+
+ /**
+ * @return The domain id this command created.
+ */
+ public int domain_id() {
+ return domain_id;
+ }
/**
* Constructor for CommandDomainNew.
@@ -85,20 +96,40 @@ public class CommandDomainNew extends Command {
String nw_mask,
String nw_nfs_server,
String nw_host) {
- this.d = d;
- this.name = name;
- this.size = size;
- this.image = image;
- this.initrd = initrd;
- this.vifs = vifs;
- this.bargs = bargs;
- this.root_dev = root_dev;
- this.nfs_root_path = nfs_root_path;
- this.nw_ip = nw_ip;
- this.nw_gw = nw_gw;
- this.nw_mask = nw_mask;
- this.nw_nfs_server = nw_nfs_server;
- this.nw_host = nw_host;
+ this(d,name,size,image,initrd,vifs,bargs,root_dev,nfs_root_path,nw_ip,nw_gw,nw_mask,nw_nfs_server,nw_host,null);
+ }
+
+ public CommandDomainNew(
+ Defaults d,
+ String name,
+ int size,
+ String image,
+ String initrd,
+ int vifs,
+ String bargs,
+ String root_dev,
+ String nfs_root_path,
+ String nw_ip,
+ String nw_gw,
+ String nw_mask,
+ String nw_nfs_server,
+ String nw_host,
+ String usr_dev) {
+ this.d = d;
+ this.name = name;
+ this.size = size;
+ this.image = image;
+ this.initrd = initrd;
+ this.vifs = vifs;
+ this.bargs = bargs;
+ this.root_dev = root_dev;
+ this.nfs_root_path = nfs_root_path;
+ this.nw_ip = nw_ip;
+ this.nw_gw = nw_gw;
+ this.nw_mask = nw_mask;
+ this.nw_nfs_server = nw_nfs_server;
+ this.nw_host = nw_host;
+ this.usr_dev = usr_dev;
}
/**
@@ -189,9 +220,13 @@ public class CommandDomainNew extends Command {
(bargs
+ " root="
+ StringPattern.parse(root_dev).resolve(domain_id)
- + " ");
+ + " ro ");
}
+
+ if (usr_dev != null && !usr_dev.equals("")) {
+ bargs = bargs + " usr=" + StringPattern.parse(usr_dev).resolve(domain_id) + " ";
+ }
if (vifs > 0) {
domain_ip =
@@ -316,6 +351,8 @@ public class CommandDomainNew extends Command {
output[5] += vifinit_cmdarray[i] + " ";
}
}
+
+ this.domain_id = domain_id;
return null;
}
diff --git a/tools/control/src/org/xenoserver/control/Defaults.java b/tools/control/src/org/xenoserver/control/Defaults.java
index 1fba5baeac..d180a3eb91 100644
--- a/tools/control/src/org/xenoserver/control/Defaults.java
+++ b/tools/control/src/org/xenoserver/control/Defaults.java
@@ -29,6 +29,8 @@ public class Defaults {
public int domainVIFs;
/** Default root device. */
public String rootDevice;
+ /** Default usr device. */
+ public String usrDevice;
/** Default IP address pattern. */
public String nwIP;
/** Default gateway pattern. */
@@ -84,6 +86,7 @@ public class Defaults {
System.out.println(" domainImage " + domainImage);
System.out.println(" domainInitRD " + domainInitRD);
System.out.println(" rootDevice " + rootDevice);
+ System.out.println(" usrDevice " + usrDevice);
System.out.println(" NWIP " + nwIP);
System.out.println(" NWGW " + nwGateway);
System.out.println(" NWMask " + nwMask);
@@ -146,6 +149,8 @@ public class Defaults {
domainVIFs = Integer.parseInt(s);
} else if (lastName.equals("root_device")) {
rootDevice = s;
+ } else if (lastName.equals("usr_device")) {
+ usrDevice = s;
} else if (lastName.equals("nw_ip")) {
nwIP =
expandDefault(
diff --git a/tools/control/src/org/xenoserver/control/StringPattern.java b/tools/control/src/org/xenoserver/control/StringPattern.java
index 111a5271fa..664bff0013 100644
--- a/tools/control/src/org/xenoserver/control/StringPattern.java
+++ b/tools/control/src/org/xenoserver/control/StringPattern.java
@@ -18,7 +18,7 @@ public class StringPattern {
* @param t The pattern string to parse.
* @return A usable pattern object.
*/
- static StringPattern parse(String t) {
+ public static StringPattern parse(String t) {
StringPattern result = new StringPattern();
char[] ca = t.toCharArray();
int idx = 0;
@@ -53,7 +53,7 @@ public class StringPattern {
* @param domain The domain number to use.
* @return The expanded pattern for the given domain.
*/
- String resolve(int domain) {
+ public String resolve(int domain) {
if (addDom) {
return base + (bn + domain);
} else if (appendDom) {