From 5eed75120bfb961d8b86102184416cd9be8da764 Mon Sep 17 00:00:00 2001 From: Nitesh Sarda Date: Tue, 23 May 2017 13:08:10 +0530 Subject: [PATCH] CLOUDSTACK-9740 : Search for secondary IP of NIC that is attached to an instance is not working --- api/src/com/cloud/network/NetworkService.java | 2 + .../api/command/user/vm/ListNicsCmd.java | 56 +++++++++++++------ .../api/response/NicSecondaryIpResponse.java | 13 ++++- .../service/NetworkOrchestrationService.java | 2 +- .../orchestration/NetworkOrchestrator.java | 13 +++-- .../schema/src/com/cloud/vm/dao/NicDao.java | 2 + .../src/com/cloud/vm/dao/NicDaoImpl.java | 10 +++- .../com/cloud/vm/dao/NicSecondaryIpDao.java | 2 + .../cloud/vm/dao/NicSecondaryIpDaoImpl.java | 11 +++- .../com/cloud/network/NetworkServiceImpl.java | 22 +++++++- .../com/cloud/vpc/MockNetworkManagerImpl.java | 7 ++- ui/scripts/network.js | 7 ++- 12 files changed, 120 insertions(+), 27 deletions(-) diff --git a/api/src/com/cloud/network/NetworkService.java b/api/src/com/cloud/network/NetworkService.java index 7a8a9498780..598b77fc5e3 100644 --- a/api/src/com/cloud/network/NetworkService.java +++ b/api/src/com/cloud/network/NetworkService.java @@ -180,4 +180,6 @@ public interface NetworkService { IpAddress updateIP(Long id, String customId, Boolean displayIp); boolean configureNicSecondaryIp(NicSecondaryIp secIp, boolean isZoneSgEnabled); + + List listVmNicSecondaryIps(ListNicsCmd listNicsCmd); } diff --git a/api/src/org/apache/cloudstack/api/command/user/vm/ListNicsCmd.java b/api/src/org/apache/cloudstack/api/command/user/vm/ListNicsCmd.java index ccec3e6ac13..30a3b8cce90 100644 --- a/api/src/org/apache/cloudstack/api/command/user/vm/ListNicsCmd.java +++ b/api/src/org/apache/cloudstack/api/command/user/vm/ListNicsCmd.java @@ -18,7 +18,8 @@ package org.apache.cloudstack.api.command.user.vm; import java.util.ArrayList; import java.util.List; - +import com.cloud.vm.NicSecondaryIp; +import org.apache.cloudstack.api.response.NicSecondaryIpResponse; import org.apache.cloudstack.acl.RoleType; import org.apache.cloudstack.api.APICommand; import org.apache.cloudstack.api.ApiCommandJobType; @@ -122,22 +123,45 @@ public class ListNicsCmd extends BaseListCmd { public void execute() throws ResourceUnavailableException, ResourceAllocationException, ConcurrentOperationException, InsufficientCapacityException { try { - List results = _networkService.listNics(this); - ListResponse response = new ListResponse(); - List resList = null; - if (results != null) { - resList = new ArrayList(results.size()); - for (Nic r : results) { - NicResponse resp = _responseGenerator.createNicResponse(r); - resp.setObjectName("nic"); - resList.add(resp); - } - response.setResponses(resList); - } - response.setResponses(resList); - response.setResponseName(getCommandName()); - this.setResponseObject(response); + if (this.getKeyword() != null && !this.getKeyword().isEmpty() && this.getNicId() != null) { + List results = _networkService.listVmNicSecondaryIps(this); + ListResponse response = new ListResponse(); + List resList = new ArrayList(); + NicSecondaryIpResponse res = new NicSecondaryIpResponse(); + List res_List = new ArrayList(); + if (results != null) { + for (NicSecondaryIp r : results) { + NicSecondaryIpResponse ipRes = _responseGenerator.createSecondaryIPToNicResponse(r); + resList.add(ipRes); + res.setSecondaryIpsList(resList); + res.setObjectName("nic"); + } + res_List.add(res); + response.setResponses(res_List); + } + response.setResponses(res_List); + response.setResponseName(getCommandName()); + this.setResponseObject(response); + + } else { + List results = _networkService.listNics(this); + ListResponse response = new ListResponse(); + List resList = null; + if (results != null) { + resList = new ArrayList(results.size()); + for (Nic r : results) { + NicResponse resp = _responseGenerator.createNicResponse(r); + resp.setObjectName("nic"); + resList.add(resp); + } + response.setResponses(resList); + } + + response.setResponses(resList); + response.setResponseName(getCommandName()); + this.setResponseObject(response); + } } catch (Exception e) { s_logger.warn("Failed to list secondary ip address per nic "); throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, e.getMessage()); diff --git a/api/src/org/apache/cloudstack/api/response/NicSecondaryIpResponse.java b/api/src/org/apache/cloudstack/api/response/NicSecondaryIpResponse.java index e0884c08df1..467a1c9e987 100644 --- a/api/src/org/apache/cloudstack/api/response/NicSecondaryIpResponse.java +++ b/api/src/org/apache/cloudstack/api/response/NicSecondaryIpResponse.java @@ -17,7 +17,7 @@ package org.apache.cloudstack.api.response; import com.google.gson.annotations.SerializedName; - +import java.util.List; import org.apache.cloudstack.api.ApiConstants; import org.apache.cloudstack.api.BaseResponse; import org.apache.cloudstack.api.EntityReference; @@ -33,6 +33,10 @@ public class NicSecondaryIpResponse extends BaseResponse { @Param(description = "the ID of the secondary private IP addr") private String id; + @SerializedName("secondaryip") + @Param(description = "the list of Secondary ipv4 addr of nic") + private List secondaryIpsList; + @SerializedName(ApiConstants.IP_ADDRESS) @Param(description = "Secondary IP address") private String ipAddr; @@ -94,4 +98,11 @@ public class NicSecondaryIpResponse extends BaseResponse { this.id = id; } + public List getSecondaryIpsList() { + return secondaryIpsList; + } + + public void setSecondaryIpsList(List secondaryIpsList) { + this.secondaryIpsList = secondaryIpsList; + } } diff --git a/engine/api/src/org/apache/cloudstack/engine/orchestration/service/NetworkOrchestrationService.java b/engine/api/src/org/apache/cloudstack/engine/orchestration/service/NetworkOrchestrationService.java index ed573006b24..b59c9ca5b4b 100644 --- a/engine/api/src/org/apache/cloudstack/engine/orchestration/service/NetworkOrchestrationService.java +++ b/engine/api/src/org/apache/cloudstack/engine/orchestration/service/NetworkOrchestrationService.java @@ -213,7 +213,7 @@ public interface NetworkOrchestrationService { boolean isSecondaryIpSetForNic(long nicId); - List listVmNics(long vmId, Long nicId, Long networkId); + List listVmNics(long vmId, Long nicId, Long networkId, String keyword); Nic savePlaceholderNic(Network network, String ip4Address, String ip6Address, Type vmType); diff --git a/engine/orchestration/src/org/apache/cloudstack/engine/orchestration/NetworkOrchestrator.java b/engine/orchestration/src/org/apache/cloudstack/engine/orchestration/NetworkOrchestrator.java index e9df9c71a08..37f53302455 100644 --- a/engine/orchestration/src/org/apache/cloudstack/engine/orchestration/NetworkOrchestrator.java +++ b/engine/orchestration/src/org/apache/cloudstack/engine/orchestration/NetworkOrchestrator.java @@ -2894,12 +2894,17 @@ public class NetworkOrchestrator extends ManagerBase implements NetworkOrchestra } @Override - public List listVmNics(final long vmId, final Long nicId, final Long networkId) { + public List listVmNics(final long vmId, final Long nicId, final Long networkId, String keyword) { List result = null; - if (nicId == null && networkId == null) { - result = _nicDao.listByVmId(vmId); + + if (keyword == null || keyword.isEmpty()) { + if (nicId == null && networkId == null) { + result = _nicDao.listByVmId(vmId); + } else { + result = _nicDao.listByVmIdAndNicIdAndNtwkId(vmId, nicId, networkId); + } } else { - result = _nicDao.listByVmIdAndNicIdAndNtwkId(vmId, nicId, networkId); + result = _nicDao.listByVmIdAndKeyword(vmId, keyword); } for (final NicVO nic : result) { diff --git a/engine/schema/src/com/cloud/vm/dao/NicDao.java b/engine/schema/src/com/cloud/vm/dao/NicDao.java index b82b0d51ade..d31a165955f 100644 --- a/engine/schema/src/com/cloud/vm/dao/NicDao.java +++ b/engine/schema/src/com/cloud/vm/dao/NicDao.java @@ -76,4 +76,6 @@ public interface NicDao extends GenericDao { int countNicsForStartingVms(long networkId); NicVO getControlNicForVM(long vmId); + + List listByVmIdAndKeyword(long instanceId, String keyword); } diff --git a/engine/schema/src/com/cloud/vm/dao/NicDaoImpl.java b/engine/schema/src/com/cloud/vm/dao/NicDaoImpl.java index 218c50aab07..a5edf581f2b 100644 --- a/engine/schema/src/com/cloud/vm/dao/NicDaoImpl.java +++ b/engine/schema/src/com/cloud/vm/dao/NicDaoImpl.java @@ -60,7 +60,7 @@ public class NicDaoImpl extends GenericDaoBase implements NicDao { AllFieldsSearch.and("network", AllFieldsSearch.entity().getNetworkId(), Op.EQ); AllFieldsSearch.and("gateway", AllFieldsSearch.entity().getIPv4Gateway(), Op.EQ); AllFieldsSearch.and("vmType", AllFieldsSearch.entity().getVmType(), Op.EQ); - AllFieldsSearch.and("address", AllFieldsSearch.entity().getIPv4Address(), Op.EQ); + AllFieldsSearch.and("address", AllFieldsSearch.entity().getIPv4Address(), Op.LIKE); AllFieldsSearch.and("isDefault", AllFieldsSearch.entity().isDefaultNic(), Op.EQ); AllFieldsSearch.and("broadcastUri", AllFieldsSearch.entity().getBroadcastUri(), Op.EQ); AllFieldsSearch.and("secondaryip", AllFieldsSearch.entity().getSecondaryIp(), Op.EQ); @@ -311,4 +311,12 @@ public class NicDaoImpl extends GenericDaoBase implements NicDao { List results = customSearch(sc, null); return results.get(0); } + + @Override + public List listByVmIdAndKeyword(long instanceId, String keyword) { + SearchCriteria sc = AllFieldsSearch.create(); + sc.setParameters("instance", instanceId); + sc.setParameters("address", "%" + keyword + "%"); + return listBy(sc); + } } diff --git a/engine/schema/src/com/cloud/vm/dao/NicSecondaryIpDao.java b/engine/schema/src/com/cloud/vm/dao/NicSecondaryIpDao.java index 39b8470b8c2..2a0f751b404 100644 --- a/engine/schema/src/com/cloud/vm/dao/NicSecondaryIpDao.java +++ b/engine/schema/src/com/cloud/vm/dao/NicSecondaryIpDao.java @@ -53,4 +53,6 @@ public interface NicSecondaryIpDao extends GenericDao { List getSecondaryIpAddressesForNic(long nicId); Long countByNicId(long nicId); + + List listSecondaryIpUsingKeyword(long nicId, String keyword); } diff --git a/engine/schema/src/com/cloud/vm/dao/NicSecondaryIpDaoImpl.java b/engine/schema/src/com/cloud/vm/dao/NicSecondaryIpDaoImpl.java index 8cd61953a73..55c3c8a5146 100644 --- a/engine/schema/src/com/cloud/vm/dao/NicSecondaryIpDaoImpl.java +++ b/engine/schema/src/com/cloud/vm/dao/NicSecondaryIpDaoImpl.java @@ -40,7 +40,7 @@ public class NicSecondaryIpDaoImpl extends GenericDaoBase listSecondaryIpUsingKeyword(long nicId, String keyword) + { + SearchCriteria sc = AllFieldsSearch.create(); + sc.setParameters("nicId", nicId); + sc.setParameters("address", "%" + keyword + "%"); + return listBy(sc); + } } diff --git a/server/src/com/cloud/network/NetworkServiceImpl.java b/server/src/com/cloud/network/NetworkServiceImpl.java index 7fc51b76054..26ad1db5796 100644 --- a/server/src/com/cloud/network/NetworkServiceImpl.java +++ b/server/src/com/cloud/network/NetworkServiceImpl.java @@ -4140,6 +4140,7 @@ public class NetworkServiceImpl extends ManagerBase implements NetworkService { Account caller = CallContext.current().getCallingAccount(); Long nicId = cmd.getNicId(); long vmId = cmd.getVmId(); + String keyword = cmd.getKeyword(); Long networkId = cmd.getNetworkId(); UserVmVO userVm = _userVmDao.findById(vmId); @@ -4150,7 +4151,26 @@ public class NetworkServiceImpl extends ManagerBase implements NetworkService { } _accountMgr.checkAccess(caller, null, true, userVm); - return _networkMgr.listVmNics(vmId, nicId, networkId); + return _networkMgr.listVmNics(vmId, nicId, networkId, keyword); + } + + @Override + public List listVmNicSecondaryIps(ListNicsCmd cmd) + { + Account caller = CallContext.current().getCallingAccount(); + Long nicId = cmd.getNicId(); + long vmId = cmd.getVmId(); + String keyword = cmd.getKeyword(); + UserVmVO userVm = _userVmDao.findById(vmId); + + if (userVm == null || (!userVm.isDisplayVm() && caller.getType() == Account.ACCOUNT_TYPE_NORMAL)) { + InvalidParameterValueException ex = new InvalidParameterValueException("Virtual mahine id does not exist"); + ex.addProxyObject(Long.valueOf(vmId).toString(), "vmId"); + throw ex; + } + + _accountMgr.checkAccess(caller, null, true, userVm); + return _nicSecondaryIpDao.listSecondaryIpUsingKeyword(nicId, keyword); } public List getNetworkGurus() { diff --git a/server/test/com/cloud/vpc/MockNetworkManagerImpl.java b/server/test/com/cloud/vpc/MockNetworkManagerImpl.java index eabb3bcfef2..d61378b3fdf 100644 --- a/server/test/com/cloud/vpc/MockNetworkManagerImpl.java +++ b/server/test/com/cloud/vpc/MockNetworkManagerImpl.java @@ -800,7 +800,7 @@ public class MockNetworkManagerImpl extends ManagerBase implements NetworkOrches } @Override - public List listVmNics(long vmId, Long nicId, Long networkId) { + public List listVmNics(long vmId, Long nicId, Long networkId, String keyword) { // TODO Auto-generated method stub return null; } @@ -906,4 +906,9 @@ public class MockNetworkManagerImpl extends ManagerBase implements NetworkOrches return false; //To change body of implemented methods use File | Settings | File Templates. } + @Override + public List listVmNicSecondaryIps(ListNicsCmd listNicsCmd) { + return null; + } + } diff --git a/ui/scripts/network.js b/ui/scripts/network.js index 1f85a6309a2..a31fafd66e6 100755 --- a/ui/scripts/network.js +++ b/ui/scripts/network.js @@ -1710,11 +1710,16 @@ dataProvider: function(args) { var data = {}; + if (args.filterBy.search.value != null) { + data.keyword = args.filterBy.search.value; + } + $.ajax({ url: createURL('listNics'), data: { nicId: args.context.nics[0].id, - virtualmachineid: args.context.instances[0].id + virtualmachineid: args.context.instances[0].id, + keyword: args.filterBy.search.value }, success: function(json) { var ips = json.listnicsresponse.nic ? json.listnicsresponse.nic[0].secondaryip : [];