java/code/src/com/redhat/rhn/frontend/action/kickstart/ScheduleKickstartWizardAction.java
| 78 ++++++++--
java/code/src/com/redhat/rhn/frontend/strings/java/StringResource_en_US.xml
| 11 +
java/code/src/com/redhat/rhn/frontend/strings/jsp/StringResource_en_US.xml
| 14 +
java/code/src/com/redhat/rhn/manager/kickstart/KickstartScheduleCommand.java
| 52 ++++++
java/code/src/com/redhat/rhn/manager/kickstart/cobbler/CobblerSystemCreateCommand.java
| 53 ++++++
java/code/webapp/WEB-INF/pages/common/fragments/kickstart/schedule/advanced.jspf
| 24 +++
java/code/webapp/WEB-INF/pages/common/fragments/kickstart/schedule/ks-wizard.jspf
| 2
java/code/webapp/WEB-INF/pages/common/fragments/kickstart/schedule/post-network-options.jspf
| 21 ++
java/code/webapp/WEB-INF/struts-config.xml
| 2
9 files changed, 234 insertions(+), 23 deletions(-)
New commits:
commit 9c82179472ed771f436e882afac93edc68b6acf3
Author: Stephen Herr <sherr(a)redhat.com>
Date: Wed Aug 8 15:28:57 2012 -0400
818700 - adding capability for static bond
diff --git
a/java/code/src/com/redhat/rhn/frontend/action/kickstart/ScheduleKickstartWizardAction.java
b/java/code/src/com/redhat/rhn/frontend/action/kickstart/ScheduleKickstartWizardAction.java
index ec80af0..0069d75 100644
---
a/java/code/src/com/redhat/rhn/frontend/action/kickstart/ScheduleKickstartWizardAction.java
+++
b/java/code/src/com/redhat/rhn/frontend/action/kickstart/ScheduleKickstartWizardAction.java
@@ -113,8 +113,11 @@ public class ScheduleKickstartWizardAction extends RhnWizardAction {
public static final String BOND_INTERFACE = "bondInterface";
public static final String BOND_SLAVE_INTERFACES = "bondSlaveInterfaces";
public static final String HIDDEN_BOND_SLAVE_INTERFACES =
"hiddenBondSlaveInterfaces";
+ public static final String BOND_STATIC = "bondStatic";
+ public static final String BOND_IP_ADDRESS = "bondAddress";
public static final String BOND_OPTIONS = "bondOptions";
public static final String CREATE_BOND_VALUE = "bonding";
+ public static final String STATIC_BOND_VALUE = "true";
public static final String DONT_CREATE_BOND_VALUE = "none";
/**
* {@inheritDoc}
@@ -151,6 +154,7 @@ public class ScheduleKickstartWizardAction extends RhnWizardAction {
/**
* {@inheritDoc}
*/
+ @Override
public List getResult(RequestContext ctx) {
Long sid = ctx.getParamAsLong(RequestContext.SID);
User user = ctx.getCurrentUser();
@@ -228,12 +232,21 @@ public class ScheduleKickstartWizardAction extends RhnWizardAction
{
form.set(BOND_TYPE, DONT_CREATE_BOND_VALUE);
}
- if (StringUtils.isBlank(form.getString(BOND_INTERFACE))) {
- for (NetworkInterface nic : nics) {
- if (nic.isBond()) {
- form.set(BOND_INTERFACE, nic.getName());
- break;
- }
+ NetworkInterface oldBond = null;
+ for (NetworkInterface nic : nics) {
+ if (nic.isBond()) {
+ oldBond = nic;
+ break;
+ }
+ }
+
+ if (oldBond != null) {
+ if (StringUtils.isBlank(form.getString(BOND_INTERFACE))) {
+ form.set(BOND_INTERFACE, oldBond.getName());
+ }
+
+ if (StringUtils.isBlank(form.getString(BOND_IP_ADDRESS))) {
+ form.set(BOND_IP_ADDRESS, oldBond.getIpaddr());
}
}
@@ -270,16 +283,11 @@ public class ScheduleKickstartWizardAction extends RhnWizardAction
{
return strings;
}
- private void setupNetworkInfo(DynaActionForm form, RequestContext context,
- KickstartScheduleCommand cmd) {
- Server server = cmd.getServer();
+ private List<NetworkInterface> getPublicNetworkInterfaces(
+ Server server) {
List<NetworkInterface> nics = new LinkedList<NetworkInterface>(
server.getNetworkInterfaces());
- if (nics.isEmpty()) {
- return;
- }
-
for (Iterator<NetworkInterface> itr = nics.iterator(); itr.hasNext();) {
NetworkInterface nic = itr.next();
if (nic.isDisabled() || "127.0.0.1".equals(nic.getIpaddr())) {
@@ -287,6 +295,18 @@ public class ScheduleKickstartWizardAction extends RhnWizardAction {
}
}
+ return nics;
+ }
+
+ private void setupNetworkInfo(DynaActionForm form, RequestContext context,
+ KickstartScheduleCommand cmd) {
+ Server server = cmd.getServer();
+ List<NetworkInterface> nics = getPublicNetworkInterfaces(server);
+
+ if (nics.isEmpty()) {
+ return;
+ }
+
context.getRequest().setAttribute(NETWORK_INTERFACES, nics);
if (StringUtils.isBlank(form.getString(NETWORK_INTERFACE))) {
@@ -549,6 +569,24 @@ public class ScheduleKickstartWizardAction extends RhnWizardAction {
tmp.add(slave);
}
cmd.setBondSlaveInterfaces(tmp);
+ if (STATIC_BOND_VALUE.equals(form.getString(BOND_STATIC))) {
+ cmd.setBondDhcp(false);
+ cmd.setBondAddress(form.getString(BOND_IP_ADDRESS));
+ List<NetworkInterface> nics = getPublicNetworkInterfaces(cmd
+ .getServer());
+ String netmask = "255.255.255.0";
+ for (NetworkInterface nic : nics) {
+ if (nic.isPublic() && nic.getNetmask() != null &&
+ !StringUtils.isEmpty(nic.getNetmask())) {
+ netmask = nic.getNetmask();
+ break;
+ }
+ }
+ cmd.setBondNetmask(netmask);
+ }
+ else {
+ cmd.setBondDhcp(true);
+ }
}
if (form.getString(USE_IPV6_GATEWAY).equals("1")) {
@@ -734,6 +772,20 @@ public class ScheduleKickstartWizardAction extends RhnWizardAction {
return false;
}
+ final String ipaddressPattern = "^([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\."
+
+ "([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\." +
+ "([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\." +
+ "([01]?\\d\\d?|2[0-4]\\d|25[0-5])$";
+
+ if (form.getString(BOND_STATIC).equals(STATIC_BOND_VALUE) &&
+ !form.getString(BOND_IP_ADDRESS).matches(ipaddressPattern)) {
+ ActionErrors errors = new ActionErrors();
+ errors.add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage(
+ "kickstart.bond.bad.ip.address.jsp"));
+ addErrors(ctx.getRequest(), errors);
+ return false;
+ }
+
return true;
}
diff --git a/java/code/src/com/redhat/rhn/frontend/strings/java/StringResource_en_US.xml
b/java/code/src/com/redhat/rhn/frontend/strings/java/StringResource_en_US.xml
index 48a00d5..0fe208b 100644
--- a/java/code/src/com/redhat/rhn/frontend/strings/java/StringResource_en_US.xml
+++ b/java/code/src/com/redhat/rhn/frontend/strings/java/StringResource_en_US.xml
@@ -6367,6 +6367,13 @@ Follow this url to see the full list of inactive systems:
</context-group>
</trans-unit>
+ <trans-unit id="kickstart.bond.bad.ip.address.jsp">
+ <source>The IP address specified for the bonded network interface is not
valid.</source>
+ <context-group name="ctx">
+ <context
context-type="sourcefile">/rhn/systems/details/kickstart/ScheduleWizard.do</context>
+ </context-group>
+ </trans-unit>
+
<!-- Activation Keys -->
<group>
<context-group name="ctx">
@@ -7939,6 +7946,10 @@ Follow this url to see the full list of inactive systems:
<source>MAC Addresses must be unique. This MAC Address has already been
recorded. Please choose a different MAC Address.</source>
</trans-unit>
+ <trans-unit
id="frontend.actions.systems.virt.duplicateipaddressvalue">
+ <source>IP Addresses must be unique. This IP Address has already been
recorded. Please choose a different IP Address.</source>
+ </trans-unit>
+
<trans-unit
id="frontend.actions.channels.manager.add.viewChannels">
<source>View Associated Channels</source>
</trans-unit>
diff --git a/java/code/src/com/redhat/rhn/frontend/strings/jsp/StringResource_en_US.xml
b/java/code/src/com/redhat/rhn/frontend/strings/jsp/StringResource_en_US.xml
index a933b89..b30f15e 100644
--- a/java/code/src/com/redhat/rhn/frontend/strings/jsp/StringResource_en_US.xml
+++ b/java/code/src/com/redhat/rhn/frontend/strings/jsp/StringResource_en_US.xml
@@ -9799,6 +9799,20 @@ Please note that some manual configuration of these scripts may
still be require
</context-group>
</trans-unit>
+ <trans-unit id="kickstart.postnetconn.bondstatic.jsp.label">
+ <source>Use static networking with this IP address:</source>
+ <context-group name="ctx">
+ <context
context-type="sourcefile">/rhn/kickstart/KickstartSystemDetailsEdit</context>
+ </context-group>
+ </trans-unit>
+
+ <trans-unit id="kickstart.postnetconn.bonddhcp.jsp.label">
+ <source>Use DHCP to acquire an IP address</source>
+ <context-group name="ctx">
+ <context
context-type="sourcefile">/rhn/kickstart/KickstartSystemDetailsEdit</context>
+ </context-group>
+ </trans-unit>
+
<trans-unit id="kickstart.selinux.jsp.label">
<source>SELinux</source>
<context-group name="ctx">
diff --git a/java/code/src/com/redhat/rhn/manager/kickstart/KickstartScheduleCommand.java
b/java/code/src/com/redhat/rhn/manager/kickstart/KickstartScheduleCommand.java
index 1abb1ba..cb82f9e 100644
--- a/java/code/src/com/redhat/rhn/manager/kickstart/KickstartScheduleCommand.java
+++ b/java/code/src/com/redhat/rhn/manager/kickstart/KickstartScheduleCommand.java
@@ -161,6 +161,9 @@ public class KickstartScheduleCommand extends BaseSystemOperation {
private String bondInterface;
private List<String> bondSlaveInterfaces;
private String bondOptions;
+ private boolean isBondDhcp;
+ private String bondAddress;
+ private String bondNetmask;
/**
* Constructor for a kickstart where the host and the target are the same system.
@@ -521,6 +524,7 @@ public class KickstartScheduleCommand extends BaseSystemOperation {
/**
* {@inheritDoc}
*/
+ @Override
public ValidatorError store() {
ValidatorError e = this.doValidation();
@@ -608,8 +612,8 @@ public class KickstartScheduleCommand extends BaseSystemOperation {
cmd.setScheduledAction(kickstartAction);
cmd.setNetworkInfo(isDhcp, networkInterface, this.useIpv6Gateway(),
ksdata.getInstallType().getLabel());
- cmd.setBridgeInfo(createBond, bondInterface,
- bondSlaveInterfaces, bondOptions);
+ cmd.setBridgeInfo(createBond, bondInterface, bondSlaveInterfaces,
+ bondOptions, isBondDhcp, bondAddress, bondNetmask);
ValidatorError cobblerError = cmd.store();
if (cobblerError != null) {
return cobblerError;
@@ -695,7 +699,7 @@ public class KickstartScheduleCommand extends BaseSystemOperation {
.equals(regType);
createKickstartActivationKey(this.user, this.ksdata,
reactivation ? getTargetServer() : null,
- this.kickstartSession, 1L, note);
+ this.kickstartSession, 1L, note);
}
this.createdProfile = processProfileType(this.profileType);
log.debug("** profile created: " + createdProfile);
@@ -1401,6 +1405,48 @@ public class KickstartScheduleCommand extends BaseSystemOperation
{
}
/**
+ * @return Returns true if we are using dhcp for the bond
+ */
+ public boolean isBondDhcp() {
+ return isBondDhcp;
+ }
+
+ /**
+ * @param isBondDhcpIn True if we want to use dhcp for the bond
+ */
+ public void setBondDhcp(boolean isBondDhcpIn) {
+ this.isBondDhcp = isBondDhcpIn;
+ }
+
+ /**
+ * @return the bondAddress
+ */
+ public String getBondAddress() {
+ return bondAddress;
+ }
+
+ /**
+ * @param bondAddressIn The bondAddress to set
+ */
+ public void setBondAddress(String bondAddressIn) {
+ this.bondAddress = bondAddressIn;
+ }
+
+ /**
+ * @return The bondNetmask
+ */
+ public String getBondNetmask() {
+ return bondNetmask;
+ }
+
+ /**
+ * @param bondNetmaskIn The bondNetmask to set
+ */
+ public void setBondNetmask(String bondNetmaskIn) {
+ this.bondNetmask = bondNetmaskIn;
+ }
+
+ /**
* @return Returns the user.
*/
@Override
diff --git
a/java/code/src/com/redhat/rhn/manager/kickstart/cobbler/CobblerSystemCreateCommand.java
b/java/code/src/com/redhat/rhn/manager/kickstart/cobbler/CobblerSystemCreateCommand.java
index f8e3040..f9705ab 100644
---
a/java/code/src/com/redhat/rhn/manager/kickstart/cobbler/CobblerSystemCreateCommand.java
+++
b/java/code/src/com/redhat/rhn/manager/kickstart/cobbler/CobblerSystemCreateCommand.java
@@ -34,6 +34,7 @@ import org.apache.log4j.Logger;
import org.cobbler.Network;
import org.cobbler.Profile;
import org.cobbler.SystemRecord;
+import org.cobbler.XmlRpcException;
import java.util.ArrayList;
import java.util.HashMap;
@@ -67,6 +68,9 @@ public class CobblerSystemCreateCommand extends CobblerCommand {
private String bridgeName;
private List<String> bridgeSlaves;
private String bridgeOptions;
+ private String bridgeAddress;
+ private String bridgeNetmask;
+ private boolean isBridgeDhcp;
/**
* @param dhcp true if the network type is dhcp
* @param networkInterfaceIn The name of the network interface
@@ -82,18 +86,24 @@ public class CobblerSystemCreateCommand extends CobblerCommand {
}
/**
- * @param doBridge boolean, wheither or not to set up a bridge post-install
+ * @param doBridge boolean, whether or not to set up a bridge post-install
* @param name string, name of the bridge
* @param slaves string array, nics to use as slaves
* @param options string, bridge options
+ * @param isBridgeDhcpIn boolean, if the bridge will use dhcp to obtain an ip
address
+ * @param address string, ip address for the bridge (if isDhcp is false)
+ * @param netmask string, netmask for the bridge (if isDhcp is false)
*/
public void setBridgeInfo(boolean doBridge, String name,
- List<String> slaves,
- String options) {
+ List<String> slaves, String options, boolean isBridgeDhcpIn,
+ String address, String netmask) {
setupBridge = doBridge;
bridgeName = name;
bridgeSlaves = slaves;
bridgeOptions = options;
+ isBridgeDhcp = isBridgeDhcpIn;
+ bridgeAddress = address;
+ bridgeNetmask = netmask;
}
/**
@@ -254,7 +264,19 @@ public class CobblerSystemCreateCommand extends CobblerCommand {
getCobblerSystemRecordName(),
profile);
}
- processNetworkInterfaces(rec, server);
+ try {
+ processNetworkInterfaces(rec, server);
+ }
+ catch (XmlRpcException e) {
+ if (e.getCause() != null && e.getCause().getMessage() != null
&&
+ e.getCause().getMessage().contains("IP address
duplicated")) {
+ return new ValidatorError(
+
"frontend.actions.systems.virt.duplicateipaddressvalue");
+ }
+ else {
+ throw e;
+ }
+ }
rec.setProfile(profile);
if (isDhcp) {
@@ -301,7 +323,19 @@ public class CobblerSystemCreateCommand extends CobblerCommand {
rec.setKsMeta(ksmeta);
rec.setKernelOptions(kernelOptions);
rec.setKernelPostOptions(postKernelOptions);
- rec.save();
+ try {
+ rec.save();
+ }
+ catch (XmlRpcException e) {
+ if (e.getCause() != null && e.getCause().getMessage() != null
&&
+ e.getCause().getMessage().contains("IP address
duplicated")) {
+ return new ValidatorError(
+
"frontend.actions.systems.virt.duplicateipaddressvalue");
+ }
+ else {
+ throw e;
+ }
+ }
server.setCobblerId(rec.getId());
return null;
}
@@ -342,6 +376,10 @@ public class CobblerSystemCreateCommand extends CobblerCommand {
if (ipv6Addresses.size() > 0) {
net.setIpv6Secondaries(ipv6Addresses);
}
+ if (setupBridge && bridgeSlaves.contains(n.getName())) {
+ net.makeBondingSlave();
+ net.setBondingMaster(bridgeName);
+ }
nics.add(net);
}
@@ -358,6 +396,11 @@ public class CobblerSystemCreateCommand extends CobblerCommand {
Network net = new Network(getCobblerConnection(), bridgeName);
net.makeBondingMaster();
net.setBondingOptions(bridgeOptions);
+ net.setStaticNetwork(!isBridgeDhcp);
+ if (!isBridgeDhcp) {
+ net.setNetmask(bridgeNetmask);
+ net.setIpAddress(bridgeAddress);
+ }
nics.add(net);
}
}
diff --git
a/java/code/webapp/WEB-INF/pages/common/fragments/kickstart/schedule/advanced.jspf
b/java/code/webapp/WEB-INF/pages/common/fragments/kickstart/schedule/advanced.jspf
index 7deca46..88b5b6b 100644
--- a/java/code/webapp/WEB-INF/pages/common/fragments/kickstart/schedule/advanced.jspf
+++ b/java/code/webapp/WEB-INF/pages/common/fragments/kickstart/schedule/advanced.jspf
@@ -19,6 +19,30 @@ function setStep(stepName) {
var field = document.getElementById("wizard-step");
field.value = stepName;
}
+
+function getCheckedValue(radioObj) {
+ if(!radioObj)
+ return "";
+ var radioLength = radioObj.length;
+ if(radioLength == undefined)
+ if(radioObj.checked)
+ return radioObj.value;
+ else
+ return "";
+ for(var i = 0; i < radioLength; i++) {
+ if(radioObj[i].checked) {
+ return radioObj[i].value;
+ }
+ }
+ return "";
+}
+
+function enableBondStaticIpAddress() {
+ var staticBond =
document.getElementById("kickstartScheduleWizardForm").bondStatic
+ if (getCheckedValue(staticBond) == 'true') {
+ document.getElementById("bondAddress").disabled = false
+ }
+}
</script>
</head>
<body>
diff --git
a/java/code/webapp/WEB-INF/pages/common/fragments/kickstart/schedule/ks-wizard.jspf
b/java/code/webapp/WEB-INF/pages/common/fragments/kickstart/schedule/ks-wizard.jspf
index a38f61f..3759da4 100644
--- a/java/code/webapp/WEB-INF/pages/common/fragments/kickstart/schedule/ks-wizard.jspf
+++ b/java/code/webapp/WEB-INF/pages/common/fragments/kickstart/schedule/ks-wizard.jspf
@@ -18,6 +18,8 @@
<input type="hidden" name="bondInterface"
value="${form.bondInterface}" />
<input type="hidden" name="bondOptions"
value="${form.bondOptions}" />
<input type="hidden" name="hiddenBondSlaveInterfaces"
value="${rhn:arrayToString(form.bondSlaveInterfaces)}" />
+ <input type="hidden" name="bondStatic"
value="${form.bondStatic}" />
+ <input type="hidden" name="bondAddress"
value="${form.bondAddress}" />
<!-- Store useful id fields-->
<input type="hidden" name="wizardStep"
value="first" id="wizard-step" />
diff --git
a/java/code/webapp/WEB-INF/pages/common/fragments/kickstart/schedule/post-network-options.jspf
b/java/code/webapp/WEB-INF/pages/common/fragments/kickstart/schedule/post-network-options.jspf
index 25c3aaa..292eb71 100644
---
a/java/code/webapp/WEB-INF/pages/common/fragments/kickstart/schedule/post-network-options.jspf
+++
b/java/code/webapp/WEB-INF/pages/common/fragments/kickstart/schedule/post-network-options.jspf
@@ -6,17 +6,34 @@
<th><bean:message key="kickstart.postnetconn.jsp.label"
/>:</th>
<td>
<input type="radio" name="bondType"
value="none"
- onclick="form.masterInterfaceName.disabled = true;
form.slaveInterfaceNames.disabled = true; form.bondingInterfaceOptions.disabled =
true;"
+ onclick="form.masterInterfaceName.disabled = true;
form.slaveInterfaceNames.disabled = true; form.bondingInterfaceOptions.disabled = true;
+ form.bondStaticTrue.disabled = true; form.bondStaticFalse.disabled = true;
form.bondAddress.disabled = true;"
<c:if test="${form.bondType == null || form.bondType ==
'none'}">checked="checked"</c:if>
/>
<bean:message
key="kickstart.postnetconn.none.jsp.label"/>
<br />
<input type="radio" name="bondType"
value="bonding"
- onclick="form.masterInterfaceName.disabled = false;
form.slaveInterfaceNames.disabled = false; form.bondingInterfaceOptions.disabled =
false;"
+ onclick="form.masterInterfaceName.disabled = false;
form.slaveInterfaceNames.disabled = false; form.bondingInterfaceOptions.disabled = false;
+ form.bondStaticTrue.disabled = false; form.bondStaticFalse.disabled =
false; enableBondStaticIpAddress();"
<c:if test="${form.bondType ==
'bonding'}">checked="checked"</c:if>
/>
<bean:message key="kickstart.postnetconn.bonding.jsp.label"
/>
<br />
+ <input
type="radio" name="bondStatic" id="bondStaticTrue"
value="true"
+ onclick="form.bondAddress.disabled = false;"
+ <c:if test="${form.bondStatic == null || form.bondStatic !=
'false'}">checked="checked"</c:if>
+ <c:if test="${form.bondType ne
'bonding'}">disabled="true"</c:if>/>
+ <bean:message key="kickstart.postnetconn.bondstatic.jsp.label"
/>
+ <input type="test" name="bondAddress"
id="bondAddress" size="15" Maxlength="15"
+ <c:if test="${form.bondType ne 'bonding' &&
form.bondStatic ne 'true'}">disabled="true"</c:if>
+ value="${form.bondAddress}"/>
+ <br />
+ <input
type="radio" name="bondStatic" id="bondStaticFalse"
value="false"
+ onclick="form.bondAddress.disabled = true;"
+ <c:if test="${form.bondStatic ==
'false'}">checked="checked"</c:if>
+ <c:if test="${form.bondType ne
'bonding'}">disabled="true"</c:if>/>
+ <bean:message key="kickstart.postnetconn.bonddhcp.jsp.label"
/>
+ <br />
<bean:message
key="kickstart.postnetconn.bondname.jsp.label" />:
<input type="text" name="bondInterface"
id="masterInterfaceName" size="5" Maxlength="10"
<c:if test="${form.bondType ne
'bonding'}">disabled="true"</c:if>
diff --git a/java/code/webapp/WEB-INF/struts-config.xml
b/java/code/webapp/WEB-INF/struts-config.xml
index cf844bd..1d24faf 100644
--- a/java/code/webapp/WEB-INF/struts-config.xml
+++ b/java/code/webapp/WEB-INF/struts-config.xml
@@ -827,6 +827,8 @@
<form-property name="bondInterface"
type="java.lang.String" />
<form-property name="bondSlaveInterfaces"
type="java.lang.String[]" />
<form-property name="hiddenBondSlaveInterfaces"
type="java.lang.String" />
+ <form-property name="bondStatic"
type="java.lang.String" />
+ <form-property name="bondAddress"
type="java.lang.String" />
<form-property name="bondOptions"
type="java.lang.String" />
<form-property name="networkType"
type="java.lang.String" />
<form-property name="networkInterface"
type="java.lang.String" />