diff --git a/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerApiInterceptor.java b/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerApiInterceptor.java index 999c34ecd0..3a947bbd58 100644 --- a/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerApiInterceptor.java +++ b/plugin/sdnController/src/main/java/org/zstack/sdnController/SdnControllerApiInterceptor.java @@ -200,16 +200,34 @@ private void validate(APISdnControllerChangeHostMsg msg) { msg.setNicNames(new ArrayList<>(nicNamePciAddressMap.keySet())); } - if (msg.getNicNames().size() > 1 && msg.getBondMode() == null) { - msg.setBondMode(refVO.getBondMode()); + if (msg.getBondMode() == null) { + throw new ApiMessageInterceptionException(argerr("could not change host[uuid:%s] of sdn controller[uuid:%s], " + + " because bond mode is not specified", msg.getHostUuid(), msg.getSdnControllerUuid())); + } + + if (msg.getNicNames().isEmpty()) { + throw new ApiMessageInterceptionException(argerr("could not change host[uuid:%s] of sdn controller[uuid:%s], " + + " because nic names is empty", msg.getHostUuid(), msg.getSdnControllerUuid())); } - if (msg.getLacpMode() == null) { + if (msg.getNicNames().size() == 1) { + msg.setBondMode(null); + msg.setLacpMode(null); + return; + } + + if (msg.getBondMode().equals(refVO.getBondMode())) { msg.setLacpMode(refVO.getLacpMode()); } - if (msg.getBondMode() != null && msg.getBondMode().equals(L2NetworkConstant.BONDING_MODE_TCP) && msg.getLacpMode() == null) { + if (msg.getBondMode().equals(L2NetworkConstant.BONDING_MODE_TCP)) { msg.setLacpMode(L2NetworkConstant.LACP_MODE_ACTIVE); + } else if (msg.getBondMode().equals(L2NetworkConstant.BONDING_MODE_SLB)) { + if (!(msg.getLacpMode().equals(L2NetworkConstant.LACP_MODE_PASSIVE) || msg.getLacpMode().equals(L2NetworkConstant.LACP_MODE_OFF))) { + msg.setLacpMode(L2NetworkConstant.LACP_MODE_OFF); + } + } else { + msg.setLacpMode(L2NetworkConstant.LACP_MODE_OFF); } }