From 8f35657ac2dcf774a556075406332d6e84615639 Mon Sep 17 00:00:00 2001 From: Sigert Goeminne Date: Thu, 30 Nov 2017 22:09:21 +0100 Subject: [PATCH] CLOUDSTACK-10164: allow users to create a VPC through the UI. (#2345) The listNuageVspDomainTemplat cmd was called by the ui when the create vpc dialog was opened. This command failed when no nuage vsp device was present. As a consequence the ui did not show the dialog. So currently it's not possible to create a vpc through the UI with a native CloudStack deployment. This bugfix, adds robustness to the ui that in case the cmd fails the dialog will appear nonetheless . Furthermore I also changed the listNuageVspDomainTemplateCmd to always return an empty result when there is no nuage zone. --- .../network/manager/NuageVspManagerImpl.java | 22 +++- ui/scripts/network.js | 107 +++++++++--------- 2 files changed, 70 insertions(+), 59 deletions(-) diff --git a/plugins/network-elements/nuage-vsp/src/com/cloud/network/manager/NuageVspManagerImpl.java b/plugins/network-elements/nuage-vsp/src/com/cloud/network/manager/NuageVspManagerImpl.java index 1bbef4ec2c7..96016e6bb53 100644 --- a/plugins/network-elements/nuage-vsp/src/com/cloud/network/manager/NuageVspManagerImpl.java +++ b/plugins/network-elements/nuage-vsp/src/com/cloud/network/manager/NuageVspManagerImpl.java @@ -57,6 +57,7 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.Comparator; import java.util.HashMap; +import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.Optional; @@ -845,18 +846,23 @@ public class NuageVspManagerImpl extends ManagerBase implements NuageVspManager, if (passedPhysicalNetworkId != null) { physicalNetworkId = Optional.of(passedPhysicalNetworkId); } else if (zoneId != null) { - physicalNetworkId = Optional.of(getPhysicalNetworkBasedOnZone(zoneId)); + physicalNetworkId = Optional.ofNullable(getPhysicalNetworkBasedOnZone(zoneId)); } else { throw new InvalidParameterValueException("No zoneid or physicalnetworkid specified."); } - List domainTemplates; + if (!physicalNetworkId.isPresent()) { + return new LinkedList<>(); + } + + Long hostId = getNuageVspHostId(physicalNetworkId.get()); + if (hostId == null) { + return new LinkedList<>(); + } ListVspDomainTemplatesCommand agentCmd = new ListVspDomainTemplatesCommand(vspDomain, keyword); - Long hostId = getNuageVspHostId(physicalNetworkId.get()); - ListVspDomainTemplatesAnswer answer = (ListVspDomainTemplatesAnswer) _agentMgr.easySend(hostId, agentCmd); - domainTemplates = answer.getDomainTemplates(); + List domainTemplates = answer.getDomainTemplates(); return domainTemplates.stream() .map(NuageVspManagerImpl::createDomainTemplateResponse) @@ -926,6 +932,10 @@ public class NuageVspManagerImpl extends ManagerBase implements NuageVspManager, @Override public boolean entityExist(EntityExistsCommand cmd, Long physicalNetworkId){ Long hostId = getNuageVspHostId(physicalNetworkId); + if (hostId == null) { + throw new CloudRuntimeException("There is no Nuage VSP device configured on physical network " + physicalNetworkId); + } + Answer answer = _agentMgr.easySend(hostId, cmd); if (answer != null) { return answer.getResult(); @@ -1168,7 +1178,7 @@ public class NuageVspManagerImpl extends ManagerBase implements NuageVspManager, return config.getHostId(); } - throw new CloudRuntimeException("There is no Nuage VSP device configured on physical network " + physicalNetworkId); + return null; } @DB diff --git a/ui/scripts/network.js b/ui/scripts/network.js index 16feaf1f835..66ab75a42f0 100644 --- a/ui/scripts/network.js +++ b/ui/scripts/network.js @@ -5245,65 +5245,66 @@ args.context.domainTemplateMap = []; args.context.globalDomainTemplateUsed = []; } - $.ajax({ - url: createURL('listNuageVspDomainTemplates'), - dataType: "json", - data: { - zoneid: args.zoneid - }, - async: true, - success: function (json) { - $.ajax({ - url: createURL('listNuageVspGlobalDomainTemplate'), - dataType: "json", - data: { - name: "nuagevsp.vpc.domaintemplate.name" - }, - async: true, - success: function(PDTjson){ - var domaintemplates = json.listnuagevspdomaintemplatesresponse.domaintemplates ? json.listnuagevspdomaintemplatesresponse.domaintemplates : []; - var preConfiguredDomainTemplate = PDTjson.listnuagevspglobaldomaintemplateresponse.count == 1 ? PDTjson.listnuagevspglobaldomaintemplateresponse.domaintemplates[0].name : ""; - if (!domaintemplates.length) { - args.$form.find("[rel=nuageusedomaintemplate]").hide(); - } + $.ajax({ + url: createURL('listNuageVspDomainTemplates'), + dataType: "json", + data: { + zoneid: args.zoneid + }, + async: true, + error: function(XMLHttpRequest, textStatus, errorThrown) { + args.response.success({}); + }, + success: function (json) { + $.ajax({ + url: createURL('listNuageVspGlobalDomainTemplate'), + dataType: "json", + data: { + name: "nuagevsp.vpc.domaintemplate.name" + }, + async: true, + success: function(PDTjson){ + var domaintemplates = json.listnuagevspdomaintemplatesresponse.domaintemplates ? json.listnuagevspdomaintemplatesresponse.domaintemplates : []; + var preConfiguredDomainTemplate = PDTjson.listnuagevspglobaldomaintemplateresponse.count == 1 ? PDTjson.listnuagevspglobaldomaintemplateresponse.domaintemplates[0].name : ""; - var index = -1; - $.each(domaintemplates, function(key,value) { - if (preConfiguredDomainTemplate == value.name) { - index = key; - } - }); - - //Set global pre configured DT as the default by placing it to the top of the drop down list. - if (index != -1) { - domaintemplates.unshift(domaintemplates[index]); - domaintemplates.splice(index + 1, 1); - args.$form.find("[rel=nuageusedomaintemplate]").show(); - args.$form.find("[rel=nuagedomaintemplatelist]").show(); - args.$form.find("[rel=nuageusedomaintemplate]").find("input").attr('checked', true); - args.context.globalDomainTemplateUsed[args.zoneid] = true; - } else { - args.context.globalDomainTemplateUsed[args.zoneid] = false; - } - - args.context.domainTemplateMap[args.zoneid] = domaintemplates; - args.response.success({ - data: $.map(domaintemplates, function (dt) { - return { - id: dt.name, - description: dt.description - }; - }) - }); + if (!domaintemplates.length) { + args.$form.find("[rel=nuageusedomaintemplate]").hide(); } - }); - } - }); + var index = -1; + $.each(domaintemplates, function(key,value) { + if (preConfiguredDomainTemplate == value.name) { + index = key; + } + }); - //} + //Set global pre configured DT as the default by placing it to the top of the drop down list. + if (index != -1) { + domaintemplates.unshift(domaintemplates[index]); + domaintemplates.splice(index + 1, 1); + args.$form.find("[rel=nuageusedomaintemplate]").show(); + args.$form.find("[rel=nuagedomaintemplatelist]").show(); + args.$form.find("[rel=nuageusedomaintemplate]").find("input").attr('checked', true); + args.context.globalDomainTemplateUsed[args.zoneid] = true; + } else { + args.context.globalDomainTemplateUsed[args.zoneid] = false; + } + args.context.domainTemplateMap[args.zoneid] = domaintemplates; + args.response.success({ + data: $.map(domaintemplates, function (dt) { + return { + id: dt.name, + description: dt.description + }; + }) + }); + } + }); + + } + }); } }