Moti Asayag has uploaded a new change for review. Change subject: engine: Re-define HostSetupNetworks based on network attachments ......................................................................
engine: Re-define HostSetupNetworks based on network attachments The same old api is being redefined by network attachment and by externalizing the business logic out from the VDS command into the producer of the parameters (will be introduced in a latter patch). Change-Id: I75d02e4be71f00510bc8815c555a94d7efc9252e Signed-off-by: Moti Asayag <masa...@redhat.com> --- M backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/vdscommands/FutureVDSCommandType.java A backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/vdscommands/HostNetwork.java A backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/vdscommands/HostSetupNetworksVdsCommandParameters.java A backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/HostSetupNetworksVDSCommand.java 4 files changed, 381 insertions(+), 1 deletion(-) git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/10/32910/1 diff --git a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/vdscommands/FutureVDSCommandType.java b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/vdscommands/FutureVDSCommandType.java index e90c07d..c27330e 100644 --- a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/vdscommands/FutureVDSCommandType.java +++ b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/vdscommands/FutureVDSCommandType.java @@ -2,7 +2,8 @@ public enum FutureVDSCommandType { SetupNetworks, - Poll; + Poll, + HostSetupNetworks; private static final String DEFAULT_PACKAGE = "org.ovirt.engine.core.vdsbroker.vdsbroker"; String packageName; diff --git a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/vdscommands/HostNetwork.java b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/vdscommands/HostNetwork.java new file mode 100644 index 0000000..5612ba4 --- /dev/null +++ b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/vdscommands/HostNetwork.java @@ -0,0 +1,137 @@ +package org.ovirt.engine.core.common.vdscommands; + +import java.util.Map; + +import org.ovirt.engine.core.common.businessentities.network.IpConfiguration; +import org.ovirt.engine.core.common.businessentities.network.Network; +import org.ovirt.engine.core.common.businessentities.network.NetworkAttachment; +import org.ovirt.engine.core.common.businessentities.network.NetworkBootProtocol; + +public class HostNetwork { + private Network network; + private NetworkAttachment networkAttachment; + private boolean defaultRoute; + private boolean bonding; + + public HostNetwork(Network network, NetworkAttachment networkAttachment) { + setNetwork(network); + setNetworkAttachment(networkAttachment); + } + + public void setNetwork(Network network) { + this.network = network; + } + + public void setNetworkAttachment(NetworkAttachment attachment) { + this.networkAttachment = attachment; + } + + public String getNetworkName() { + return network.getName(); + } + + public String getNicName() { + return networkAttachment.getNicName(); + } + + public boolean isDefaultRoute() { + return defaultRoute; + } + + public void setDefaultRoute(boolean defaultRoute) { + this.defaultRoute = defaultRoute; + } + + public boolean isBonding() { + return bonding; + } + + public void setBonding(boolean bonding) { + this.bonding = bonding; + } + + public Integer getVlan() { + return network.getVlanId(); + } + + public boolean isVlan() { + return network.getVlanId() != null; + } + + public int getMtu() { + return network.getMtu(); + } + + public boolean isVmNetwork() { + return network.isVmNetwork(); + } + + public boolean isStp() { + return network.getStp(); + } + + public Map<String, String> getProperties() { + return networkAttachment.getProperties(); + } + + public boolean hasProperties() { + return getProperties() != null && !getProperties().isEmpty(); + } + + public NetworkBootProtocol getBootProtocol() { + return hasIpConfiguration() ? getIpConfiguration().getBootProtocol() : null; + } + + public String getAddress() { + return hasIpConfiguration() ? getIpConfiguration().getAddress() : null; + } + + public String getNetmask() { + return hasIpConfiguration() ? getIpConfiguration().getNetmask() : null; + } + + public String getGateway() { + return hasIpConfiguration() ? getIpConfiguration().getGateway() : null; + } + + private boolean hasIpConfiguration() { + return getIpConfiguration() != null; + } + + private IpConfiguration getIpConfiguration() { + return networkAttachment.getIpConfiguration(); + } + + @Override + public String toString() { + StringBuilder builder = new StringBuilder(); + builder.append(getNetworkName()) + .append("{") + .append("nicName=") + .append(getNicName()) + .append(", bonding=") + .append(isBonding()) + .append(", vlan=") + .append(getVlan()) + .append(", mtu=") + .append(getMtu()) + .append(", stp=") + .append(isStp()) + .append(", vmNetwork=") + .append(isVmNetwork()) + .append(", bootProtocol=") + .append(getBootProtocol()) + .append(", address=") + .append(getAddress()) + .append(", netmask=") + .append(getNetmask()) + .append(", gateway=") + .append(getGateway()) + .append(", defaultRoute=") + .append(isDefaultRoute()) + .append(", properties=") + .append(getProperties()) + .append("}"); + return builder.toString(); + } +} diff --git a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/vdscommands/HostSetupNetworksVdsCommandParameters.java b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/vdscommands/HostSetupNetworksVdsCommandParameters.java new file mode 100644 index 0000000..1316318 --- /dev/null +++ b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/vdscommands/HostSetupNetworksVdsCommandParameters.java @@ -0,0 +1,98 @@ +package org.ovirt.engine.core.common.vdscommands; + +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +import org.ovirt.engine.core.common.businessentities.Entities; +import org.ovirt.engine.core.common.businessentities.network.Bond; +import org.ovirt.engine.core.compat.Guid; + +public class HostSetupNetworksVdsCommandParameters extends VdsIdVDSCommandParametersBase { + private List<HostNetwork> networks; + private Set<String> removedNetworks; + private List<Bond> bonds; + private Set<String> removedBonds; + private boolean checkConnectivity; + private int conectivityTimeout; + + public HostSetupNetworksVdsCommandParameters(Guid vdsId, + List<HostNetwork> networks, + Set<String> removedNetworks, + List<Bond> bonds, + Set<String> removedBonds) { + super(vdsId); + this.networks = (networks == null) ? new ArrayList<HostNetwork>() : networks; + this.removedNetworks = (removedNetworks == null) ? new HashSet<String>() : removedNetworks; + this.bonds = (bonds == null) ? new ArrayList<Bond>() : bonds; + this.removedBonds = (removedBonds == null) ? new HashSet<String>() : removedBonds; + } + + public HostSetupNetworksVdsCommandParameters() { + } + + public List<HostNetwork> getNetworks() { + return networks; + } + + public void setNetworks(List<HostNetwork> networks) { + this.networks = networks; + } + + public Set<String> getRemovedNetworks() { + return removedNetworks; + } + + public void setRemovedNetworks(Set<String> removedNetworks) { + this.removedNetworks = removedNetworks; + } + + public List<Bond> getBonds() { + return bonds; + } + + public void setBonds(List<Bond> bonds) { + this.bonds = bonds; + } + + public Set<String> getRemovedBonds() { + return removedBonds; + } + + public void setRemovedBonds(Set<String> removedBonds) { + this.removedBonds = removedBonds; + } + + public boolean isCheckConnectivity() { + return checkConnectivity; + } + + public int getConectivityTimeout() { + return conectivityTimeout; + } + + public void setCheckConnectivity(boolean checkConnectivity) { + this.checkConnectivity = checkConnectivity; + } + + public void setConectivityTimeout(int conectivityTimeout) { + this.conectivityTimeout = conectivityTimeout; + } + + @Override + public String toString() { + return String.format("%s, checkConnectivity = %s, conectivityTimeout = %s,%n" + + "\tnetworks = %s,%n" + + "\tremovedNetworks=%s,%n" + + "\tbonds=%s,%n" + + "\tremovedBonds=%s", + super.toString(), + isCheckConnectivity(), + getConectivityTimeout(), + Entities.collectionToString(getNetworks(), "\t\t"), + getRemovedNetworks(), + Entities.collectionToString(getBonds(), "\t\t"), + getRemovedBonds()); + } +} diff --git a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/HostSetupNetworksVDSCommand.java b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/HostSetupNetworksVDSCommand.java new file mode 100644 index 0000000..5e286f7 --- /dev/null +++ b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/HostSetupNetworksVDSCommand.java @@ -0,0 +1,144 @@ +package org.ovirt.engine.core.vdsbroker.vdsbroker; + +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; + +import org.apache.commons.lang.StringUtils; +import org.ovirt.engine.core.common.FeatureSupported; +import org.ovirt.engine.core.common.businessentities.VDS; +import org.ovirt.engine.core.common.businessentities.network.Bond; +import org.ovirt.engine.core.common.businessentities.network.NetworkQoS; +import org.ovirt.engine.core.common.vdscommands.HostNetwork; +import org.ovirt.engine.core.common.vdscommands.HostSetupNetworksVdsCommandParameters; +import org.ovirt.engine.core.compat.Version; +import org.ovirt.engine.core.utils.NetworkUtils; + +public class HostSetupNetworksVDSCommand<T extends HostSetupNetworksVdsCommandParameters> extends FutureVDSCommand<T> { + + protected static final String DHCP_BOOT_PROTOCOL = "dhcp"; + protected static final String BOOT_PROTOCOL = "bootproto"; + protected static final String BONDING_OPTIONS = "options"; + protected static final String SLAVES = "nics"; + private static final String DEFAULT_ROUTE = "defaultRoute"; + private static final Map<String, String> REMOVE_OBJ = Collections.singletonMap("remove", Boolean.TRUE.toString()); + + public HostSetupNetworksVDSCommand(T parameters) { + super(parameters); + } + + @Override + protected void executeVdsBrokerCommand() { + httpTask = getBroker().setupNetworks(generateNetworks(), generateBonds(), generateOptions()); + } + + private Map<String, Object> generateNetworks() { + Map<String, Object> networks = new HashMap<String, Object>(); + + for (HostNetwork attachment : getParameters().getNetworks()) { + Map<String, Object> attributes = new HashMap<String, Object>(); + if (attachment.isBonding()) { + attributes.put("bonding", attachment.getNicName()); + } else { + attributes.put("nic", attachment.getNicName()); + } + + if (attachment.isVlan()) { + attributes.put("vlan", attachment.getVlan().toString()); + } + + if (attachment.getMtu() == 0) { + attributes.put(VdsProperties.MTU, NetworkUtils.getDefaultMtu().toString()); + } else { + attributes.put(VdsProperties.MTU, String.valueOf(attachment.getMtu())); + } + + attributes.put("bridged", Boolean.toString(attachment.isVmNetwork())); + if (attachment.isVmNetwork()) { + attributes.put(VdsProperties.STP, attachment.isStp() ? "yes" : "no"); + } + + if (attachment.getBootProtocol() != null) { + addBootProtocol(attributes, attachment); + } + + // TODO: extract the logic into the producer of HostNetwork, this class shouldn't be aware of DAL/BLL + if (attachment.isDefaultRoute()) { + attributes.put(DEFAULT_ROUTE, Boolean.TRUE); + } + + if (attachment.hasProperties()) { + attributes.put(VdsProperties.NETWORK_CUSTOM_PROPERTIES, attachment.getProperties()); + } + + // TODO: extract the logic into the producer of HostNetwork, this class shouldn't be aware of DAL/BLL + VDS host = getDbFacade().getVdsDao().get(getParameters().getVdsId()); + Version version = host.getVdsGroupCompatibilityVersion(); + if (FeatureSupported.hostNetworkQos(version)) { + NetworkQosMapper qosMapper = + new NetworkQosMapper(attributes, + VdsProperties.HOST_QOS_INBOUND, + VdsProperties.HOST_QOS_OUTBOUND); + qosMapper.serialize(new NetworkQoS()); + } + + networks.put(attachment.getNetworkName(), attributes); + } + + for (String net : getParameters().getRemovedNetworks()) { + networks.put(net, REMOVE_OBJ); + } + + return networks; + } + + private void addBootProtocol(Map<String, Object> opts, HostNetwork attachment) { + switch (attachment.getBootProtocol()) { + case DHCP: + opts.put(BOOT_PROTOCOL, DHCP_BOOT_PROTOCOL); + break; + case STATIC_IP: + putIfNotEmpty(opts, "ipaddr", attachment.getAddress()); + putIfNotEmpty(opts, "netmask", attachment.getNetmask()); + putIfNotEmpty(opts, "gateway", attachment.getGateway()); + break; + default: + break; + } + } + + private Map<String, Object> generateBonds() { + Map<String, Object> bonds = new HashMap<String, Object>(); + + for (Bond bond : getParameters().getBonds()) { + Map<String, Object> attributes = new HashMap<String, Object>(); + attributes.put(SLAVES, bond.getSlaves()); + putIfNotEmpty(attributes, BONDING_OPTIONS, bond.getBondOptions()); + bonds.put(bond.getName(), attributes); + } + + for (String bond : getParameters().getRemovedBonds()) { + bonds.put(bond, REMOVE_OBJ); + } + + return bonds; + } + + private Map<String, Object> generateOptions() { + Map<String, Object> options = new HashMap<String, Object>(); + options.put(VdsProperties.CONNECTIVITY_CHECK, Boolean.toString(getParameters().isCheckConnectivity())); + + // VDSM uses the connectivity timeout only if 'connectivityCheck' is set to true + if (getParameters().isCheckConnectivity()) { + options.put(VdsProperties.CONNECTIVITY_TIMEOUT, getParameters().getConectivityTimeout()); + } + + return options; + } + + private static void putIfNotEmpty(Map<String, Object> map, String key, String value) { + if (StringUtils.isNotEmpty(value)) { + map.put(key, value); + } + } +} -- To view, visit http://gerrit.ovirt.org/32910 To unsubscribe, visit http://gerrit.ovirt.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: I75d02e4be71f00510bc8815c555a94d7efc9252e Gerrit-PatchSet: 1 Gerrit-Project: ovirt-engine Gerrit-Branch: master Gerrit-Owner: Moti Asayag <masa...@redhat.com> _______________________________________________ Engine-patches mailing list Engine-patches@ovirt.org http://lists.ovirt.org/mailman/listinfo/engine-patches