Merge pull request #1981 from nuagenetworks/feature/nuage_vpc_selectable_domain_template

CLOUDSTACK-9806: Nuage domain template selection per VPC
This commit is contained in:
Frank Maximus 2017-11-17 11:31:48 +01:00 committed by GitHub
commit 3eafd0ce52
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
28 changed files with 2121 additions and 318 deletions

View File

@ -29,6 +29,7 @@ import org.apache.commons.lang.builder.HashCodeBuilder;
import com.cloud.agent.api.Command; import com.cloud.agent.api.Command;
public class DeallocateVmVspCommand extends Command { public class DeallocateVmVspCommand extends Command {
private final VspNetwork _network; private final VspNetwork _network;

View File

@ -0,0 +1,44 @@
//
// Licensed to the Apache Software Foundation (ASF) under one
// or more contributor license agreements. See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership. The ASF licenses this file
// to you under the Apache License, Version 2.0 (the
// "License"); you may not use this file except in compliance
// with the License. You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing,
// software distributed under the License is distributed on an
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
// KIND, either express or implied. See the License for the
// specific language governing permissions and limitations
// under the License.
//
package com.cloud.agent.api.manager;
import com.cloud.agent.api.Answer;
import net.nuage.vsp.acs.client.api.model.VspDomainTemplate;
import java.util.List;
public class ListVspDomainTemplatesAnswer extends Answer {
private List<VspDomainTemplate> domainTemplates;
public ListVspDomainTemplatesAnswer(ListVspDomainTemplatesCommand command, List<VspDomainTemplate> domainTemplates) {
super(command);
this.domainTemplates = domainTemplates;
}
public ListVspDomainTemplatesAnswer(ListVspDomainTemplatesCommand command, Exception e) {
super(command, e);
}
public List<VspDomainTemplate> getDomainTemplates() {
return domainTemplates;
}
}

View File

@ -0,0 +1,47 @@
//
// Licensed to the Apache Software Foundation (ASF) under one
// or more contributor license agreements. See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership. The ASF licenses this file
// to you under the Apache License, Version 2.0 (the
// "License"); you may not use this file except in compliance
// with the License. You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing,
// software distributed under the License is distributed on an
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
// KIND, either express or implied. See the License for the
// specific language governing permissions and limitations
// under the License.
//
package com.cloud.agent.api.manager;
import com.cloud.agent.api.Command;
import net.nuage.vsp.acs.client.api.model.VspDomain;
public class ListVspDomainTemplatesCommand extends Command {
private final VspDomain _domain;
private final String _name;
public ListVspDomainTemplatesCommand(VspDomain domain, String name) {
this._domain = domain;
this._name = name;
}
public VspDomain getDomain() {
return _domain;
}
public String getName() {
return _name;
}
@Override
public boolean executeInSequence() {
return false;
}
}

View File

@ -0,0 +1,111 @@
//
// Licensed to the Apache Software Foundation (ASF) under one
// or more contributor license agreements. See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership. The ASF licenses this file
// to you under the Apache License, Version 2.0 (the
// "License"); you may not use this file except in compliance
// with the License. You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing,
// software distributed under the License is distributed on an
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
// KIND, either express or implied. See the License for the
// specific language governing permissions and limitations
// under the License.
//
package com.cloud.api.commands;
import com.cloud.exception.ConcurrentOperationException;
import com.cloud.exception.InsufficientCapacityException;
import com.cloud.exception.InvalidParameterValueException;
import com.cloud.exception.ResourceAllocationException;
import com.cloud.exception.ResourceUnavailableException;
import com.cloud.network.manager.NuageVspManager;
import com.cloud.utils.exception.CloudRuntimeException;
import org.apache.cloudstack.acl.RoleType;
import org.apache.cloudstack.api.APICommand;
import org.apache.cloudstack.api.ApiConstants;
import org.apache.cloudstack.api.ApiErrorCode;
import org.apache.cloudstack.api.BaseCmd;
import org.apache.cloudstack.api.Parameter;
import org.apache.cloudstack.api.ServerApiException;
import org.apache.cloudstack.api.response.PhysicalNetworkResponse;
import org.apache.cloudstack.api.response.SuccessResponse;
import org.apache.cloudstack.api.response.VpcResponse;
import org.apache.cloudstack.api.response.ZoneResponse;
import org.apache.cloudstack.context.CallContext;
import javax.inject.Inject;
@APICommand(name = AssociateNuageVspDomainTemplateCmd.APINAME, responseObject = SuccessResponse.class, description = "associate a vpc with a domain template", authorized = {RoleType.Admin, RoleType.DomainAdmin, RoleType.User})
public class AssociateNuageVspDomainTemplateCmd extends BaseCmd {
static final String APINAME = "associateNuageVspDomainTemplate";
@Inject
NuageVspManager _nuageVspManager;
/////////////////////////////////////////////////////
//////////////// API parameters /////////////////////
/////////////////////////////////////////////////////
@Parameter(name = ApiConstants.VPC_ID, type = CommandType.UUID, entityType = VpcResponse.class, required = true, description = "VPC ID")
private Long vpcId;
@Parameter(name = VspConstants.NUAGE_VSP_API_DOMAIN_TEMPLATE, type = CommandType.STRING, required = true, description = "the name of the domain template")
private String domainTemplate;
@Parameter(name = ApiConstants.PHYSICAL_NETWORK_ID, type = CommandType.UUID, entityType = PhysicalNetworkResponse.class, description = "the physical network ID")
private Long physicalNetworkId;
@Parameter(name = ApiConstants.ZONE_ID, type = CommandType.UUID, entityType = ZoneResponse.class, description = "the zone ID")
private Long zoneId;
/////////////////////////////////////////////////////
/////////////////// Accessors ///////////////////////
/////////////////////////////////////////////////////
public Long getVpcId() {
return vpcId;
}
public String getDomainTemplate() { return domainTemplate; }
public Long getZoneId() { return zoneId; }
public Long getPhysicalNetworkId() { return physicalNetworkId; }
/////////////////////////////////////////////////////
/////////////// API Implementation///////////////////
/////////////////////////////////////////////////////
@Override
public void execute() throws ResourceUnavailableException, InsufficientCapacityException, ServerApiException, ConcurrentOperationException, ResourceAllocationException {
try {
boolean result =_nuageVspManager.associateNuageVspDomainTemplate(this);
SuccessResponse response = new SuccessResponse(getCommandName());
response.setResponseName(getCommandName());
response.setSuccess(result);
this.setResponseObject(response);
} catch (InvalidParameterValueException invalidParamExcp) {
throw new ServerApiException(ApiErrorCode.PARAM_ERROR, invalidParamExcp.getMessage());
} catch (CloudRuntimeException runtimeExcp) {
throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, runtimeExcp.getMessage());
}
}
@Override
public String getCommandName() {
return APINAME.toLowerCase() + BaseCmd.RESPONSE_SUFFIX;
}
@Override
public long getEntityOwnerId() {
return CallContext.current().getCallingAccount().getId();
}
}

View File

@ -0,0 +1,120 @@
//
// Licensed to the Apache Software Foundation (ASF) under one
// or more contributor license agreements. See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership. The ASF licenses this file
// to you under the Apache License, Version 2.0 (the
// "License"); you may not use this file except in compliance
// with the License. You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing,
// software distributed under the License is distributed on an
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
// KIND, either express or implied. See the License for the
// specific language governing permissions and limitations
// under the License.
//
package com.cloud.api.commands;
import com.cloud.api.response.NuageVspDomainTemplateResponse;
import com.cloud.exception.ConcurrentOperationException;
import com.cloud.exception.InsufficientCapacityException;
import com.cloud.exception.InvalidParameterValueException;
import com.cloud.exception.ResourceAllocationException;
import com.cloud.exception.ResourceUnavailableException;
import com.cloud.network.manager.NuageVspManager;
import com.cloud.utils.exception.CloudRuntimeException;
import org.apache.cloudstack.acl.RoleType;
import org.apache.cloudstack.api.APICommand;
import org.apache.cloudstack.api.ApiConstants;
import org.apache.cloudstack.api.ApiErrorCode;
import org.apache.cloudstack.api.BaseCmd;
import org.apache.cloudstack.api.BaseResponse;
import org.apache.cloudstack.api.Parameter;
import org.apache.cloudstack.api.ServerApiException;
import org.apache.cloudstack.api.response.DomainResponse;
import org.apache.cloudstack.api.response.ListResponse;
import org.apache.cloudstack.api.response.PhysicalNetworkResponse;
import org.apache.cloudstack.api.response.ZoneResponse;
import javax.inject.Inject;
import java.util.List;
@APICommand(name = ListNuageVspDomainTemplatesCmd.APINAME, responseObject = BaseResponse.class, description = "Lists Nuage VSP domain templates", since = "4.11", responseHasSensitiveInfo = false, authorized = {RoleType.Admin, RoleType.DomainAdmin, RoleType.User})
public class ListNuageVspDomainTemplatesCmd extends BaseCmd {
static final String APINAME = "listNuageVspDomainTemplates";
@Inject
private NuageVspManager _nuageVspManager;
/////////////////////////////////////////////////////
//////////////// API parameters /////////////////////
/////////////////////////////////////////////////////
@Parameter(name = ApiConstants.DOMAIN_ID, type = CommandType.UUID, entityType = DomainResponse.class,
description = "the domain ID")
private Long domainId;
@Parameter(name = ApiConstants.PHYSICAL_NETWORK_ID, type = CommandType.UUID, entityType = PhysicalNetworkResponse.class,
description = "the physical network ID")
private Long physicalNetworkId;
@Parameter(name = ApiConstants.ZONE_ID, type = CommandType.UUID, entityType = ZoneResponse.class,
description = "the zone ID")
private Long zoneId;
@Parameter(name = ApiConstants.KEYWORD, type = CommandType.STRING,
description = "filters the domain templates which contain the keyword")
private String keyword;
/////////////////////////////////////////////////////
/////////////////// Accessors ///////////////////////
/////////////////////////////////////////////////////
public String getKeyword() {
return keyword;
}
public Long getDomainId() {
return domainId;
}
public Long getPhysicalNetworkId() {
return physicalNetworkId;
}
public Long getZoneId() { return zoneId; }
/////////////////////////////////////////////////////
/////////////// API Implementation///////////////////
/////////////////////////////////////////////////////
@Override
public void execute() throws ResourceUnavailableException, InsufficientCapacityException, ServerApiException, ConcurrentOperationException, ResourceAllocationException {
try {
List<NuageVspDomainTemplateResponse> responses = _nuageVspManager.listNuageVspDomainTemplates(this);
ListResponse<NuageVspDomainTemplateResponse> response = new ListResponse<>();
response.setResponses(responses);
response.setResponseName(getCommandName());
this.setResponseObject(response);
} catch (InvalidParameterValueException invalidParamExcp) {
throw new ServerApiException(ApiErrorCode.PARAM_ERROR, invalidParamExcp.getMessage());
} catch (CloudRuntimeException e) {
throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, e.getMessage());
}
}
@Override
public String getCommandName() {
return APINAME.toLowerCase() + BaseCmd.RESPONSE_SUFFIX;
}
@Override public long getEntityOwnerId() {
return 0; //not owned by anyone
}
}

View File

@ -0,0 +1,79 @@
//
// Licensed to the Apache Software Foundation (ASF) under one
// or more contributor license agreements. See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership. The ASF licenses this file
// to you under the Apache License, Version 2.0 (the
// "License"); you may not use this file except in compliance
// with the License. You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing,
// software distributed under the License is distributed on an
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
// KIND, either express or implied. See the License for the
// specific language governing permissions and limitations
// under the License.
//
package com.cloud.api.commands;
import org.apache.cloudstack.acl.RoleType;
import org.apache.cloudstack.api.APICommand;
import org.apache.cloudstack.api.ApiErrorCode;
import org.apache.cloudstack.api.BaseCmd;
import org.apache.cloudstack.api.BaseResponse;
import org.apache.cloudstack.api.ServerApiException;
import org.apache.cloudstack.api.response.ListResponse;
import javax.inject.Inject;
import java.util.LinkedList;
import java.util.List;
import com.cloud.api.response.NuageVspDomainTemplateResponse;
import com.cloud.exception.ConcurrentOperationException;
import com.cloud.exception.InsufficientCapacityException;
import com.cloud.exception.InvalidParameterValueException;
import com.cloud.exception.NetworkRuleConflictException;
import com.cloud.exception.ResourceAllocationException;
import com.cloud.exception.ResourceUnavailableException;
import com.cloud.network.manager.NuageVspManager;
import com.cloud.user.Account;
import com.cloud.utils.exception.CloudRuntimeException;
@APICommand(name = ListNuageVspGlobalDomainTemplateCmd.APINAME, responseObject = BaseResponse.class, description = "Lists Nuage VSP domain templates", authorized = {RoleType.Admin, RoleType.DomainAdmin, RoleType.User})
public class ListNuageVspGlobalDomainTemplateCmd extends BaseCmd {
static final String APINAME = "listNuageVspGlobalDomainTemplate";
@Inject
private NuageVspManager _nuageVspManager;
@Override
public void execute() throws ResourceUnavailableException, InsufficientCapacityException, ServerApiException, ConcurrentOperationException, ResourceAllocationException, NetworkRuleConflictException {
try {
List<NuageVspDomainTemplateResponse> responses = new LinkedList<>();
NuageVspDomainTemplateResponse answer = new NuageVspDomainTemplateResponse(_nuageVspManager.NuageVspVpcDomainTemplateName.value(),_nuageVspManager.NuageVspVpcDomainTemplateName.value());
responses.add(answer);
ListResponse<NuageVspDomainTemplateResponse> response = new ListResponse<>();
response.setResponses(responses);
response.setResponseName(getCommandName());
this.setResponseObject(response);
} catch (InvalidParameterValueException invalidParamExcp) {
throw new ServerApiException(ApiErrorCode.PARAM_ERROR, invalidParamExcp.getMessage());
} catch (CloudRuntimeException e) {
throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, e.getMessage());
}
}
@Override
public String getCommandName() {
return APINAME.toLowerCase() + BaseCmd.RESPONSE_SUFFIX;
}
@Override public long getEntityOwnerId() {
return Account.ACCOUNT_ID_SYSTEM;
}
}

View File

@ -34,4 +34,5 @@ public class VspConstants {
public static final String NUAGE_VSP_API_RESOURCE_INFO = "resourceinfo"; public static final String NUAGE_VSP_API_RESOURCE_INFO = "resourceinfo";
public static final String NUAGE_VSP_CMS_ID = "cmsid"; public static final String NUAGE_VSP_CMS_ID = "cmsid";
public static final String NUAGE_VSP_API_UNDERLAY = "underlay"; public static final String NUAGE_VSP_API_UNDERLAY = "underlay";
public static final String NUAGE_VSP_API_DOMAIN_TEMPLATE = "domaintemplate";
} }

View File

@ -0,0 +1,45 @@
//
// Licensed to the Apache Software Foundation (ASF) under one
// or more contributor license agreements. See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership. The ASF licenses this file
// to you under the Apache License, Version 2.0 (the
// "License"); you may not use this file except in compliance
// with the License. You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing,
// software distributed under the License is distributed on an
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
// KIND, either express or implied. See the License for the
// specific language governing permissions and limitations
// under the License.
//
package com.cloud.api.response;
import com.cloud.serializer.Param;
import org.apache.cloudstack.api.BaseResponse;
public class NuageVspDomainTemplateResponse extends BaseResponse {
@Param(description = "the name of the domain template")
private String name;
@Param(description = "the description of the domain template")
private String description;
public NuageVspDomainTemplateResponse(String name, String description) {
this.name = name;
this.description = description;
this.setObjectName("domaintemplates");
}
public String getName() {
return name;
}
public String getDescription() {
return description;
}
}

View File

@ -29,6 +29,7 @@ import javax.annotation.Nullable;
import javax.inject.Inject; import javax.inject.Inject;
import javax.naming.ConfigurationException; import javax.naming.ConfigurationException;
import org.apache.commons.lang3.StringUtils;
import net.nuage.vsp.acs.client.api.model.VspAclRule; import net.nuage.vsp.acs.client.api.model.VspAclRule;
import net.nuage.vsp.acs.client.api.model.VspDhcpDomainOption; import net.nuage.vsp.acs.client.api.model.VspDhcpDomainOption;
import net.nuage.vsp.acs.client.api.model.VspNetwork; import net.nuage.vsp.acs.client.api.model.VspNetwork;
@ -121,6 +122,7 @@ import com.cloud.util.NuageVspEntityBuilder;
import com.cloud.util.NuageVspUtil; import com.cloud.util.NuageVspUtil;
import com.cloud.utils.Pair; import com.cloud.utils.Pair;
import com.cloud.utils.component.AdapterBase; import com.cloud.utils.component.AdapterBase;
import com.cloud.utils.exception.CloudRuntimeException;
import com.cloud.utils.net.NetUtils; import com.cloud.utils.net.NetUtils;
import com.cloud.vm.DomainRouterVO; import com.cloud.vm.DomainRouterVO;
import com.cloud.vm.NicProfile; import com.cloud.vm.NicProfile;
@ -657,6 +659,12 @@ public class NuageVspElement extends AdapterBase implements ConnectivityProvider
} }
} }
String globalDomainTemplate = _nuageVspManager.NuageVspVpcDomainTemplateName.value();
if (StringUtils.isNotBlank(globalDomainTemplate) && !_nuageVspManager.checkIfDomainTemplateExist(vpc.getDomainId(),globalDomainTemplate,vpc.getZoneId(),null)) {
s_logger.warn("The global pre configured domain template does not exist on the VSD.");
throw new CloudRuntimeException("The global pre configured domain template does not exist on the VSD.");
}
return true; return true;
} }

View File

@ -166,6 +166,21 @@ public class NuageVspGuestNetworkGuru extends GuestNetworkGuru {
throw new ConcurrentOperationException("Unable to acquire lock on network " + networkId); throw new ConcurrentOperationException("Unable to acquire lock on network " + networkId);
} }
/* Check if an acl template is used in combination with a pre-configured DT. -> show an error if there is
Rollback of the network fails in core CS -> networkOrchestrator. */
if(network.getVpcId() != null) {
VpcDetailVO detail = _vpcDetailsDao.findDetail(network.getVpcId(), NuageVspManager.nuageDomainTemplateDetailName);
if (detail != null && network.getNetworkACLId() != null) {
s_logger.error("Pre-configured DT are used in combination with ACL lists. Which is not supported.");
throw new IllegalArgumentException("CloudStack ACLs are not supported with Nuage Preconfigured Domain Template");
}
if(detail != null && !_nuageVspManager.checkIfDomainTemplateExist(network.getDomainId(),detail.getValue(),network.getDataCenterId(),null)){
s_logger.error("The provided domain template does not exist on the VSD.");
throw new IllegalArgumentException("The provided domain template does not exist on the VSD anymore.");
}
}
NetworkVO implemented = null; NetworkVO implemented = null;
try { try {
if (offering.getGuestType() == GuestType.Isolated && network.getState() != State.Implementing) { if (offering.getGuestType() == GuestType.Isolated && network.getState() != State.Implementing) {

View File

@ -19,19 +19,26 @@
package com.cloud.network.manager; package com.cloud.network.manager;
import com.cloud.agent.api.manager.EntityExistsCommand;
import com.cloud.api.commands.AddNuageVspDeviceCmd; import com.cloud.api.commands.AddNuageVspDeviceCmd;
import com.cloud.api.commands.AssociateNuageVspDomainTemplateCmd;
import com.cloud.api.commands.DeleteNuageVspDeviceCmd; import com.cloud.api.commands.DeleteNuageVspDeviceCmd;
import com.cloud.api.commands.ListNuageVspDevicesCmd; import com.cloud.api.commands.ListNuageVspDevicesCmd;
import com.cloud.api.commands.ListNuageVspDomainTemplatesCmd;
import com.cloud.api.commands.UpdateNuageVspDeviceCmd; import com.cloud.api.commands.UpdateNuageVspDeviceCmd;
import com.cloud.api.response.NuageVlanIpRangeResponse; import com.cloud.api.response.NuageVlanIpRangeResponse;
import com.cloud.api.response.NuageVspDeviceResponse; import com.cloud.api.response.NuageVspDeviceResponse;
import com.cloud.dc.Vlan; import com.cloud.dc.Vlan;
import com.cloud.api.response.NuageVspDomainTemplateResponse;
import com.cloud.host.HostVO; import com.cloud.host.HostVO;
import com.cloud.network.Network;
import com.cloud.network.NuageVspDeviceVO; import com.cloud.network.NuageVspDeviceVO;
import com.cloud.utils.component.PluggableService; import com.cloud.utils.component.PluggableService;
import org.apache.cloudstack.framework.config.ConfigKey; import org.apache.cloudstack.framework.config.ConfigKey;
import org.apache.cloudstack.framework.config.ConfigKey.Scope; import org.apache.cloudstack.framework.config.ConfigKey.Scope;
import java.util.List; import java.util.List;
public interface NuageVspManager extends PluggableService { public interface NuageVspManager extends PluggableService {
@ -79,6 +86,10 @@ public interface NuageVspManager extends PluggableService {
String NETWORK_METADATA_VSD_SUBNET_ID = "vsdSubnetId"; String NETWORK_METADATA_VSD_SUBNET_ID = "vsdSubnetId";
String CMSID_CONFIG_KEY = "nuagevsp.cms.id";
String NUAGE_VSP_ISOLATION = "VSP";
NuageVspDeviceVO addNuageVspDevice(AddNuageVspDeviceCmd cmd); NuageVspDeviceVO addNuageVspDevice(AddNuageVspDeviceCmd cmd);
NuageVspDeviceVO updateNuageVspDevice(UpdateNuageVspDeviceCmd cmd); NuageVspDeviceVO updateNuageVspDevice(UpdateNuageVspDeviceCmd cmd);
@ -99,4 +110,47 @@ public interface NuageVspManager extends PluggableService {
List<NuageVlanIpRangeResponse> filterNuageVlanIpRanges(List<? extends Vlan> vlanIpRanges, Boolean underlay); List<NuageVlanIpRangeResponse> filterNuageVlanIpRanges(List<? extends Vlan> vlanIpRanges, Boolean underlay);
List<NuageVspDomainTemplateResponse> listNuageVspDomainTemplates(ListNuageVspDomainTemplatesCmd cmd);
List<NuageVspDomainTemplateResponse> listNuageVspDomainTemplates(long domainId, String keyword, Long zoneId, Long physicalNetworkId);
/**
* Associates a Nuage Vsp domain template with a
* @param cmd
* @return
*/
boolean associateNuageVspDomainTemplate(AssociateNuageVspDomainTemplateCmd cmd);
/**
* Queries the VSD to check if the entity provided in the entityCmd exists on the VSD
* @param cmd entityCommand which contains the ACS class of the entity and the UUID
* @param hostId the hostId of the VSD
* @return true if an entity exists with the UUI on the VSD, otherwise false.
*/
boolean entityExist(EntityExistsCommand cmd, Long hostId);
/**
* Sets the preconfigured domain template for a given network
* @param network
* @param domainTemplateName
*/
void setPreConfiguredDomainTemplateName(Network network, String domainTemplateName);
/**
* Returns the current pre configured domain template for a given network
* @param network
* @return
*/
String getPreConfiguredDomainTemplateName(Network network);
/**
* Checks if a given domain template exists or not on the VSD.
* @param domainId
* @param domainTemplate The name of the domain template for which we need to query the VSD.
* @param zoneId zoneId OR PhysicalNetworkId needs to be provided.
* @param physicalNetworkId zoneId OR PhysicalNetworkId needs to be provided.
* @return true if the domain template exists on the VSD else false if it does not exist on the VSD
*/
public boolean checkIfDomainTemplateExist(Long domainId, String domainTemplate, Long zoneId, Long physicalNetworkId);
} }

View File

@ -19,32 +19,6 @@
package com.cloud.network.manager; package com.cloud.network.manager;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.UUID;
import javax.annotation.Nonnull;
import javax.inject.Inject;
import javax.naming.ConfigurationException;
import net.nuage.vsp.acs.client.api.NuageVspPluginClientLoader;
import net.nuage.vsp.acs.client.api.model.VspApiDefaults;
import net.nuage.vsp.acs.client.api.model.VspDomain;
import net.nuage.vsp.acs.client.api.model.VspDomainCleanUp;
import net.nuage.vsp.acs.client.api.model.VspHost;
import net.nuage.vsp.acs.client.common.NuageVspApiVersion;
import net.nuage.vsp.acs.client.common.NuageVspConstants;
import net.nuage.vsp.acs.client.exception.NuageVspException;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.log4j.Logger;
import com.google.common.base.MoreObjects; import com.google.common.base.MoreObjects;
import com.google.common.base.Strings; import com.google.common.base.Strings;
import com.google.common.collect.HashMultimap; import com.google.common.collect.HashMultimap;
@ -53,14 +27,42 @@ import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Lists; import com.google.common.collect.Lists;
import com.google.common.collect.Maps; import com.google.common.collect.Maps;
import com.google.common.collect.Multimap; import com.google.common.collect.Multimap;
import net.nuage.vsp.acs.client.api.NuageVspPluginClientLoader;
import net.nuage.vsp.acs.client.api.model.VspApiDefaults;
import net.nuage.vsp.acs.client.api.model.VspDomain;
import net.nuage.vsp.acs.client.api.model.VspDomainCleanUp;
import net.nuage.vsp.acs.client.api.model.VspDomainTemplate;
import net.nuage.vsp.acs.client.api.model.VspHost;
import net.nuage.vsp.acs.client.common.NuageVspApiVersion;
import net.nuage.vsp.acs.client.common.NuageVspConstants;
import net.nuage.vsp.acs.client.exception.NuageVspException;
import org.apache.cloudstack.api.ResponseGenerator; import org.apache.cloudstack.api.ResponseGenerator;
import org.apache.cloudstack.context.CallContext;
import org.apache.cloudstack.framework.config.ConfigKey; import org.apache.cloudstack.framework.config.ConfigKey;
import org.apache.cloudstack.framework.config.Configurable; import org.apache.cloudstack.framework.config.Configurable;
import org.apache.cloudstack.framework.config.dao.ConfigurationDao; import org.apache.cloudstack.framework.config.dao.ConfigurationDao;
import org.apache.cloudstack.framework.config.impl.ConfigurationVO; import org.apache.cloudstack.framework.config.impl.ConfigurationVO;
import org.apache.cloudstack.framework.messagebus.MessageBus; import org.apache.cloudstack.framework.messagebus.MessageBus;
import org.apache.cloudstack.network.ExternalNetworkDeviceManager; import org.apache.cloudstack.network.ExternalNetworkDeviceManager;
import org.apache.cloudstack.resourcedetail.VpcDetailVO;
import org.apache.cloudstack.resourcedetail.dao.VpcDetailsDao;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.log4j.Logger;
import javax.annotation.Nonnull;
import javax.inject.Inject;
import javax.naming.ConfigurationException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.Set;
import java.util.UUID;
import java.util.stream.Collectors;
import com.cloud.agent.AgentManager; import com.cloud.agent.AgentManager;
import com.cloud.agent.Listener; import com.cloud.agent.Listener;
@ -71,6 +73,8 @@ import com.cloud.agent.api.manager.CleanUpDomainCommand;
import com.cloud.agent.api.manager.EntityExistsCommand; import com.cloud.agent.api.manager.EntityExistsCommand;
import com.cloud.agent.api.manager.GetApiDefaultsAnswer; import com.cloud.agent.api.manager.GetApiDefaultsAnswer;
import com.cloud.agent.api.manager.GetApiDefaultsCommand; import com.cloud.agent.api.manager.GetApiDefaultsCommand;
import com.cloud.agent.api.manager.ListVspDomainTemplatesAnswer;
import com.cloud.agent.api.manager.ListVspDomainTemplatesCommand;
import com.cloud.agent.api.manager.SupportedApiVersionCommand; import com.cloud.agent.api.manager.SupportedApiVersionCommand;
import com.cloud.agent.api.manager.UpdateNuageVspDeviceCommand; import com.cloud.agent.api.manager.UpdateNuageVspDeviceCommand;
import com.cloud.agent.api.sync.SyncDomainCommand; import com.cloud.agent.api.sync.SyncDomainCommand;
@ -78,14 +82,18 @@ import com.cloud.agent.api.sync.SyncNuageVspCmsIdAnswer;
import com.cloud.agent.api.sync.SyncNuageVspCmsIdCommand; import com.cloud.agent.api.sync.SyncNuageVspCmsIdCommand;
import com.cloud.api.ApiDBUtils; import com.cloud.api.ApiDBUtils;
import com.cloud.api.commands.AddNuageVspDeviceCmd; import com.cloud.api.commands.AddNuageVspDeviceCmd;
import com.cloud.api.commands.AssociateNuageVspDomainTemplateCmd;
import com.cloud.api.commands.DeleteNuageVspDeviceCmd; import com.cloud.api.commands.DeleteNuageVspDeviceCmd;
import com.cloud.api.commands.DisableNuageUnderlayVlanIpRangeCmd; import com.cloud.api.commands.DisableNuageUnderlayVlanIpRangeCmd;
import com.cloud.api.commands.EnableNuageUnderlayVlanIpRangeCmd; import com.cloud.api.commands.EnableNuageUnderlayVlanIpRangeCmd;
import com.cloud.api.commands.ListNuageUnderlayVlanIpRangesCmd; import com.cloud.api.commands.ListNuageUnderlayVlanIpRangesCmd;
import com.cloud.api.commands.ListNuageVspDevicesCmd; import com.cloud.api.commands.ListNuageVspDevicesCmd;
import com.cloud.api.commands.ListNuageVspDomainTemplatesCmd;
import com.cloud.api.commands.ListNuageVspGlobalDomainTemplateCmd;
import com.cloud.api.commands.UpdateNuageVspDeviceCmd; import com.cloud.api.commands.UpdateNuageVspDeviceCmd;
import com.cloud.api.response.NuageVlanIpRangeResponse; import com.cloud.api.response.NuageVlanIpRangeResponse;
import com.cloud.api.response.NuageVspDeviceResponse; import com.cloud.api.response.NuageVspDeviceResponse;
import com.cloud.api.response.NuageVspDomainTemplateResponse;
import com.cloud.dc.DataCenterVO; import com.cloud.dc.DataCenterVO;
import com.cloud.dc.Vlan; import com.cloud.dc.Vlan;
import com.cloud.dc.VlanDetailsVO; import com.cloud.dc.VlanDetailsVO;
@ -104,14 +112,13 @@ import com.cloud.host.Status;
import com.cloud.host.dao.HostDao; import com.cloud.host.dao.HostDao;
import com.cloud.host.dao.HostDetailsDao; import com.cloud.host.dao.HostDetailsDao;
import com.cloud.network.Network; import com.cloud.network.Network;
import com.cloud.network.NetworkModel;
import com.cloud.network.Networks; import com.cloud.network.Networks;
import com.cloud.network.NuageVspDeviceVO; import com.cloud.network.NuageVspDeviceVO;
import com.cloud.network.PhysicalNetwork; import com.cloud.network.PhysicalNetwork;
import com.cloud.network.PhysicalNetworkServiceProvider; import com.cloud.network.PhysicalNetworkServiceProvider;
import com.cloud.network.dao.FirewallRulesDao;
import com.cloud.network.dao.IPAddressDao;
import com.cloud.network.dao.NetworkDao; import com.cloud.network.dao.NetworkDao;
import com.cloud.network.dao.NetworkDetailVO;
import com.cloud.network.dao.NetworkDetailsDao;
import com.cloud.network.dao.NetworkVO; import com.cloud.network.dao.NetworkVO;
import com.cloud.network.dao.NuageVspDao; import com.cloud.network.dao.NuageVspDao;
import com.cloud.network.dao.PhysicalNetworkDao; import com.cloud.network.dao.PhysicalNetworkDao;
@ -120,14 +127,13 @@ import com.cloud.network.dao.PhysicalNetworkServiceProviderVO;
import com.cloud.network.dao.PhysicalNetworkVO; import com.cloud.network.dao.PhysicalNetworkVO;
import com.cloud.network.resource.NuageVspResource; import com.cloud.network.resource.NuageVspResource;
import com.cloud.network.resource.NuageVspResourceConfiguration; import com.cloud.network.resource.NuageVspResourceConfiguration;
import com.cloud.network.vpc.VpcManager;
import com.cloud.network.vpc.VpcOffering; import com.cloud.network.vpc.VpcOffering;
import com.cloud.network.vpc.VpcOfferingServiceMapVO; import com.cloud.network.vpc.VpcOfferingServiceMapVO;
import com.cloud.network.vpc.VpcOfferingVO; import com.cloud.network.vpc.VpcOfferingVO;
import com.cloud.network.vpc.VpcVO;
import com.cloud.network.vpc.dao.VpcDao; import com.cloud.network.vpc.dao.VpcDao;
import com.cloud.network.vpc.dao.VpcOfferingDao; import com.cloud.network.vpc.dao.VpcOfferingDao;
import com.cloud.network.vpc.dao.VpcOfferingServiceMapDao; import com.cloud.network.vpc.dao.VpcOfferingServiceMapDao;
import com.cloud.network.vpc.dao.VpcServiceMapDao;
import com.cloud.offering.NetworkOffering; import com.cloud.offering.NetworkOffering;
import com.cloud.offerings.NetworkOfferingServiceMapVO; import com.cloud.offerings.NetworkOfferingServiceMapVO;
import com.cloud.offerings.NetworkOfferingVO; import com.cloud.offerings.NetworkOfferingVO;
@ -135,7 +141,6 @@ import com.cloud.offerings.dao.NetworkOfferingDao;
import com.cloud.offerings.dao.NetworkOfferingServiceMapDao; import com.cloud.offerings.dao.NetworkOfferingServiceMapDao;
import com.cloud.resource.ResourceManager; import com.cloud.resource.ResourceManager;
import com.cloud.resource.ResourceState; import com.cloud.resource.ResourceState;
import com.cloud.user.AccountManager;
import com.cloud.user.DomainManager; import com.cloud.user.DomainManager;
import com.cloud.util.NuageVspEntityBuilder; import com.cloud.util.NuageVspEntityBuilder;
import com.cloud.util.NuageVspUtil; import com.cloud.util.NuageVspUtil;
@ -158,7 +163,7 @@ public class NuageVspManagerImpl extends ManagerBase implements NuageVspManager,
public static final Multimap<Network.Service, Network.Provider> NUAGE_VSP_VPC_SERVICE_MAP; public static final Multimap<Network.Service, Network.Provider> NUAGE_VSP_VPC_SERVICE_MAP;
private static final ConfigKey[] NUAGE_VSP_CONFIG_KEYS = new ConfigKey<?>[] { NuageVspConfigDns, NuageVspDnsExternal, NuageVspConfigGateway, private static final ConfigKey[] NUAGE_VSP_CONFIG_KEYS = new ConfigKey<?>[] { NuageVspConfigDns, NuageVspDnsExternal, NuageVspConfigGateway,
NuageVspSharedNetworkDomainTemplateName, NuageVspVpcDomainTemplateName, NuageVspIsolatedNetworkDomainTemplateName }; NuageVspSharedNetworkDomainTemplateName, NuageVspVpcDomainTemplateName, NuageVspIsolatedNetworkDomainTemplateName };
public static final String CMSID_CONFIG_KEY = "nuagevsp.cms.id";
@Inject @Inject
ResourceManager _resourceMgr; ResourceManager _resourceMgr;
@ -173,13 +178,15 @@ public class NuageVspManagerImpl extends ManagerBase implements NuageVspManager,
@Inject @Inject
NetworkDao _networkDao; NetworkDao _networkDao;
@Inject @Inject
NetworkDetailsDao _networkDetailsDao;
@Inject
VpcOfferingDao _vpcOffDao; VpcOfferingDao _vpcOffDao;
@Inject @Inject
VpcOfferingServiceMapDao _vpcOffSvcMapDao; VpcOfferingServiceMapDao _vpcOffSvcMapDao;
@Inject @Inject
VpcDao _vpcDao; VpcDao _vpcDao;
@Inject @Inject
VpcManager _vpcManager; private VpcDetailsDao _vpcDetailsDao;
@Inject @Inject
NuageVspDao _nuageVspDao; NuageVspDao _nuageVspDao;
@Inject @Inject
@ -187,16 +194,6 @@ public class NuageVspManagerImpl extends ManagerBase implements NuageVspManager,
@Inject @Inject
ConfigurationDao _configDao; ConfigurationDao _configDao;
@Inject @Inject
NetworkModel _ntwkModel;
@Inject
AccountManager _accountMgr;
@Inject
IPAddressDao _ipAddressDao;
@Inject
FirewallRulesDao _firewallDao;
@Inject
VpcServiceMapDao _vpcSrvcDao;
@Inject
AgentManager _agentMgr; AgentManager _agentMgr;
@Inject @Inject
private DomainDao _domainDao; private DomainDao _domainDao;
@ -212,7 +209,6 @@ public class NuageVspManagerImpl extends ManagerBase implements NuageVspManager,
VlanDetailsDao _vlanDetailsDao; VlanDetailsDao _vlanDetailsDao;
@Inject @Inject
ResponseGenerator _responseGenerator; ResponseGenerator _responseGenerator;
@Inject @Inject
MessageBus _messageBus; MessageBus _messageBus;
@ -240,11 +236,16 @@ public class NuageVspManagerImpl extends ManagerBase implements NuageVspManager,
return Lists.<Class<?>>newArrayList( return Lists.<Class<?>>newArrayList(
AddNuageVspDeviceCmd.class, AddNuageVspDeviceCmd.class,
DeleteNuageVspDeviceCmd.class, DeleteNuageVspDeviceCmd.class,
ListNuageVspDevicesCmd.class,
UpdateNuageVspDeviceCmd.class, UpdateNuageVspDeviceCmd.class,
EnableNuageUnderlayVlanIpRangeCmd.class, ListNuageVspDevicesCmd.class,
DisableNuageUnderlayVlanIpRangeCmd.class, DisableNuageUnderlayVlanIpRangeCmd.class,
ListNuageUnderlayVlanIpRangesCmd.class EnableNuageUnderlayVlanIpRangeCmd.class,
ListNuageUnderlayVlanIpRangesCmd.class,
ListNuageVspDomainTemplatesCmd.class,
ListNuageVspGlobalDomainTemplateCmd.class,
AssociateNuageVspDomainTemplateCmd.class
); );
} }
@ -821,6 +822,166 @@ public class NuageVspManagerImpl extends ManagerBase implements NuageVspManager,
return Lists.newArrayList(); return Lists.newArrayList();
} }
@Override
public List<NuageVspDomainTemplateResponse> listNuageVspDomainTemplates(ListNuageVspDomainTemplatesCmd cmd){
long domainId;
if (cmd.getDomainId() != null) {
domainId = cmd.getDomainId();
} else {
domainId = CallContext.current().getCallingAccount().getDomainId();
}
return listNuageVspDomainTemplates(domainId, cmd.getKeyword(), cmd.getZoneId(), cmd.getPhysicalNetworkId());
}
@Override
public List<NuageVspDomainTemplateResponse> listNuageVspDomainTemplates(long domainId, String keyword, Long zoneId, Long passedPhysicalNetworkId) {
Optional<Long> physicalNetworkId;
Domain domain = _domainDao.findById(domainId);
VspDomain vspDomain = _nuageVspEntityBuilder.buildVspDomain(domain);
if (passedPhysicalNetworkId != null) {
physicalNetworkId = Optional.of(passedPhysicalNetworkId);
} else if (zoneId != null) {
physicalNetworkId = Optional.of(getPhysicalNetworkBasedOnZone(zoneId));
} else {
throw new InvalidParameterValueException("No zoneid or physicalnetworkid specified.");
}
List<VspDomainTemplate> domainTemplates;
ListVspDomainTemplatesCommand agentCmd = new ListVspDomainTemplatesCommand(vspDomain, keyword);
Long hostId = getNuageVspHostId(physicalNetworkId.get());
ListVspDomainTemplatesAnswer answer = (ListVspDomainTemplatesAnswer) _agentMgr.easySend(hostId, agentCmd);
domainTemplates = answer.getDomainTemplates();
return domainTemplates.stream()
.map(NuageVspManagerImpl::createDomainTemplateResponse)
.collect(Collectors.toList());
}
private static NuageVspDomainTemplateResponse createDomainTemplateResponse(VspDomainTemplate dt) {
return new NuageVspDomainTemplateResponse(dt.getName(), dt.getDescription());
}
/**
* Returns the PhysicalNetworkId based on a zoneId
* @param zoneId != null, the zone id for which we need to retrieve the PhysicalNetworkId
* @return the physical network id if it's found otherwise null
*/
private Long getPhysicalNetworkBasedOnZone(Long zoneId){
Long physicalNetworkId = null;
List<PhysicalNetworkVO> physicalNetworkVOs = _physicalNetworkDao.listByZoneAndTrafficType(zoneId, Networks.TrafficType.Guest);
for (PhysicalNetworkVO physicalNetwok : physicalNetworkVOs) {
if (physicalNetwok.getIsolationMethods().contains(NUAGE_VSP_ISOLATION)) {
physicalNetworkId = physicalNetwok.getId();
break;
}
}
return physicalNetworkId;
}
@Override
public boolean associateNuageVspDomainTemplate(AssociateNuageVspDomainTemplateCmd cmd){
VpcVO vpc = _vpcDao.findById(cmd.getVpcId());
Long physicalNetworkId;
if (cmd.getPhysicalNetworkId() != null) {
physicalNetworkId = cmd.getPhysicalNetworkId();
} else if (cmd.getZoneId() != null) {
physicalNetworkId = getPhysicalNetworkBasedOnZone(cmd.getZoneId());
} else {
throw new InvalidParameterValueException("No zoneid or physicalnetworkid specified.");
}
EntityExistsCommand entityCmd = new EntityExistsCommand(VpcVO.class, vpc.getUuid());
boolean exists = entityExist(entityCmd, physicalNetworkId);
if (exists) {
throw new CloudRuntimeException("Failed to associate domain template, VPC is already pushed to the Nuage VSP device.");
}
if (!checkIfDomainTemplateExist(vpc.getDomainId(), cmd.getDomainTemplate(), cmd.getZoneId(), cmd.getPhysicalNetworkId())) {
throw new InvalidParameterValueException("Could not find a Domain Template with name: " + cmd.getDomainTemplate());
}
setPreConfiguredDomainTemplateName(cmd.getVpcId(), cmd.getDomainTemplate());
return true;
}
@Override
public boolean checkIfDomainTemplateExist(Long domainId, String domainTemplate, Long zoneId, Long physicalNetworkId){
List<NuageVspDomainTemplateResponse> domainTemplateList = listNuageVspDomainTemplates(domainId, domainTemplate, zoneId, physicalNetworkId);
if (domainTemplateList != null) {
for (NuageVspDomainTemplateResponse val : domainTemplateList) {
if (val.getName().equals(domainTemplate)) {
return true;
}
}
}
return false;
}
@Override
public boolean entityExist(EntityExistsCommand cmd, Long physicalNetworkId){
Long hostId = getNuageVspHostId(physicalNetworkId);
Answer answer = _agentMgr.easySend(hostId, cmd);
if (answer != null) {
return answer.getResult();
}
throw new CloudRuntimeException("No answer received from the client");
}
/**
* Sets the preconfigured domain template of a vpc to the given value.
* @param vpcId
* @param domainTemplateName
*/
private void setPreConfiguredDomainTemplateName(long vpcId, String domainTemplateName) {
//remove the previous nuageDomainTemplate if it is present.
if (_vpcDetailsDao.findDetail(vpcId, NuageVspManager.nuageDomainTemplateDetailName) != null) {
_vpcDetailsDao.removeDetail(vpcId, NuageVspManager.nuageDomainTemplateDetailName);
}
VpcDetailVO vpcDetail = new VpcDetailVO(vpcId, NuageVspManager.nuageDomainTemplateDetailName, domainTemplateName, false);
_vpcDetailsDao.persist(vpcDetail);
}
@Override
public void setPreConfiguredDomainTemplateName(Network network, String domainTemplateName) {
if (network.getVpcId() != null) {
setPreConfiguredDomainTemplateName(network.getVpcId(), domainTemplateName);
} else {
NetworkDetailVO networkDetail = new NetworkDetailVO(network.getId(), NuageVspManager.nuageDomainTemplateDetailName, domainTemplateName, false);
_networkDetailsDao.persist(networkDetail);
}
}
@Override
public String getPreConfiguredDomainTemplateName(Network network) {
if (network.getVpcId() != null) {
VpcDetailVO domainTemplateNetworkDetail = _vpcDetailsDao.findDetail(network.getVpcId(), NuageVspManager.nuageDomainTemplateDetailName);
if (domainTemplateNetworkDetail != null) {
return domainTemplateNetworkDetail.getValue();
}
return NuageVspVpcDomainTemplateName.value();
} else {
NetworkDetailVO domainTemplateNetworkDetail = _networkDetailsDao.findDetail(network.getId(), NuageVspManager.nuageDomainTemplateDetailName);
if (domainTemplateNetworkDetail != null) {
return domainTemplateNetworkDetail.getValue();
}
if (network.getGuestType() == Network.GuestType.Shared) {
return NuageVspSharedNetworkDomainTemplateName.value();
}
return NuageVspIsolatedNetworkDomainTemplateName.value();
}
}
@Override @Override
public HostVO getNuageVspHost(long physicalNetworkId) { public HostVO getNuageVspHost(long physicalNetworkId) {
HostVO nuageVspHost; HostVO nuageVspHost;
@ -830,7 +991,7 @@ public class NuageVspManagerImpl extends ManagerBase implements NuageVspManager,
PhysicalNetwork physicalNetwork = _physicalNetworkDao.findById(physicalNetworkId); PhysicalNetwork physicalNetwork = _physicalNetworkDao.findById(physicalNetworkId);
List<PhysicalNetworkVO> physicalNetworksInZone = _physicalNetworkDao.listByZone(physicalNetwork.getDataCenterId()); List<PhysicalNetworkVO> physicalNetworksInZone = _physicalNetworkDao.listByZone(physicalNetwork.getDataCenterId());
for (PhysicalNetworkVO physicalNetworkInZone : physicalNetworksInZone) { for (PhysicalNetworkVO physicalNetworkInZone : physicalNetworksInZone) {
if (physicalNetworkInZone.getIsolationMethods().contains("VSP")) { if (physicalNetworkInZone.getIsolationMethods().contains(NUAGE_VSP_ISOLATION)) {
nuageVspDevices = _nuageVspDao.listByPhysicalNetwork(physicalNetworkInZone.getId()); nuageVspDevices = _nuageVspDao.listByPhysicalNetwork(physicalNetworkInZone.getId());
break; break;
} }
@ -1000,6 +1161,16 @@ public class NuageVspManagerImpl extends ManagerBase implements NuageVspManager,
}); });
} }
private Long getNuageVspHostId(long physicalNetworkId) {
List<NuageVspDeviceVO> nuageVspDevices = _nuageVspDao.listByPhysicalNetwork(physicalNetworkId);
if (nuageVspDevices != null && (!nuageVspDevices.isEmpty())) {
NuageVspDeviceVO config = nuageVspDevices.iterator().next();
return config.getHostId();
}
throw new CloudRuntimeException("There is no Nuage VSP device configured on physical network " + physicalNetworkId);
}
@DB @DB
private void initNuageVspVpcOffering() { private void initNuageVspVpcOffering() {
//configure default Nuage VSP vpc offering //configure default Nuage VSP vpc offering

View File

@ -23,10 +23,12 @@ import javax.naming.ConfigurationException;
import net.nuage.vsp.acs.client.exception.NuageVspException; import net.nuage.vsp.acs.client.exception.NuageVspException;
import net.nuage.vsp.acs.client.exception.NuageVspUnsupportedRequestException;
import org.apache.log4j.Logger; import org.apache.log4j.Logger;
import com.cloud.agent.api.Answer; import com.cloud.agent.api.Answer;
import com.cloud.agent.api.Command; import com.cloud.agent.api.Command;
import com.cloud.agent.api.UnsupportedAnswer;
import com.cloud.network.resource.NuageVspResource; import com.cloud.network.resource.NuageVspResource;
import com.cloud.resource.CommandWrapper; import com.cloud.resource.CommandWrapper;
@ -40,6 +42,9 @@ public abstract class NuageVspCommandWrapper<T extends Command> extends CommandW
boolean success = executeNuageVspCommand(command, nuageVspResource); boolean success = executeNuageVspCommand(command, nuageVspResource);
String detail = fillDetail(new StringBuilder(), command).append(" on ").append(nuageVspResource.getName()).toString(); String detail = fillDetail(new StringBuilder(), command).append(" on ").append(nuageVspResource.getName()).toString();
return new Answer(command, success, detail); return new Answer(command, success, detail);
} catch (NuageVspUnsupportedRequestException e) {
s_logger.error("Failure during " + command + " on " + nuageVspResource.getName(), e);
return new UnsupportedAnswer(command, e.getMessage()); //New Exception so there is no stacktrace showed in the UI when changing ACL lists.
} catch (NuageVspException | ConfigurationException e) { } catch (NuageVspException | ConfigurationException e) {
s_logger.error("Failure during " + command + " on " + nuageVspResource.getName(), e); s_logger.error("Failure during " + command + " on " + nuageVspResource.getName(), e);
return new Answer(command, e); return new Answer(command, e);

View File

@ -27,6 +27,7 @@ import net.nuage.vsp.acs.client.exception.NuageVspException;
import com.cloud.agent.api.manager.EntityExistsCommand; import com.cloud.agent.api.manager.EntityExistsCommand;
import com.cloud.dc.Vlan; import com.cloud.dc.Vlan;
import com.cloud.network.resource.NuageVspResource; import com.cloud.network.resource.NuageVspResource;
import com.cloud.network.vpc.VpcVO;
import com.cloud.resource.ResourceWrapper; import com.cloud.resource.ResourceWrapper;
@ResourceWrapper(handles = EntityExistsCommand.class) @ResourceWrapper(handles = EntityExistsCommand.class)
@ -44,6 +45,9 @@ public final class NuageVspEntityExistsCommandWrapper extends NuageVspCommandWra
if (Vlan.class.isAssignableFrom(clazz)) { if (Vlan.class.isAssignableFrom(clazz)) {
entityType = NuageVspEntity.SHARED_NETWORK; entityType = NuageVspEntity.SHARED_NETWORK;
} }
else if(VpcVO.class.isAssignableFrom(clazz)){
entityType = NuageVspEntity.ZONE;
}
return entityType; return entityType;
} }

View File

@ -0,0 +1,51 @@
//
// Licensed to the Apache Software Foundation (ASF) under one
// or more contributor license agreements. See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership. The ASF licenses this file
// to you under the Apache License, Version 2.0 (the
// "License"); you may not use this file except in compliance
// with the License. You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing,
// software distributed under the License is distributed on an
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
// KIND, either express or implied. See the License for the
// specific language governing permissions and limitations
// under the License.
//
package com.cloud.network.vsp.resource.wrapper;
import com.cloud.agent.api.manager.ListVspDomainTemplatesAnswer;
import com.cloud.agent.api.manager.ListVspDomainTemplatesCommand;
import com.cloud.network.resource.NuageVspResource;
import com.cloud.resource.CommandWrapper;
import com.cloud.resource.ResourceWrapper;
import net.nuage.vsp.acs.client.api.NuageVspManagerClient;
import net.nuage.vsp.acs.client.api.model.VspDomainTemplate;
import net.nuage.vsp.acs.client.exception.NuageVspException;
import javax.naming.ConfigurationException;
import java.util.List;
@ResourceWrapper(handles = ListVspDomainTemplatesCommand.class)
public class NuageVspListDomainTemplatesCommandWrapper extends CommandWrapper<ListVspDomainTemplatesCommand, ListVspDomainTemplatesAnswer, NuageVspResource> {
@Override
public ListVspDomainTemplatesAnswer execute(ListVspDomainTemplatesCommand command, NuageVspResource serverResource) {
NuageVspManagerClient client = null;
try {
client = serverResource.getNuageVspManagerClient();
List<VspDomainTemplate> domainTemplates = client.getDomainTemplates(command.getDomain(), command.getName());
return new ListVspDomainTemplatesAnswer(command, domainTemplates);
} catch (ConfigurationException | NuageVspException e) {
return new ListVspDomainTemplatesAnswer(command, e);
}
}
}

View File

@ -146,8 +146,7 @@ public class NuageVspEntityBuilder {
List<NetworkVO> allSharedNetworks = _networkDao.listByGuestType(Network.GuestType.Shared); List<NetworkVO> allSharedNetworks = _networkDao.listByGuestType(Network.GuestType.Shared);
for (NetworkVO sharedNetwork : allSharedNetworks) { for (NetworkVO sharedNetwork : allSharedNetworks) {
if (_networkModel.isNetworkAvailableInDomain(sharedNetwork.getId(), domain.getId())) { if (_networkModel.isNetworkAvailableInDomain(sharedNetwork.getId(), domain.getId())) {
NetworkOffering networkOffering = _networkOfferingDao.findById(sharedNetwork.getNetworkOfferingId()); String preConfiguredDomainTemplateName = _nuageVspManager.getPreConfiguredDomainTemplateName(sharedNetwork);
String preConfiguredDomainTemplateName = NuageVspUtil.getPreConfiguredDomainTemplateName(_configurationDao, _networkDetailsDao, sharedNetwork, networkOffering);
if (!sharedNetworkUuids.containsKey(preConfiguredDomainTemplateName)) { if (!sharedNetworkUuids.containsKey(preConfiguredDomainTemplateName)) {
sharedNetworkUuids.put(preConfiguredDomainTemplateName, Lists.<String>newArrayList()); sharedNetworkUuids.put(preConfiguredDomainTemplateName, Lists.<String>newArrayList());
} }
@ -241,7 +240,7 @@ public class NuageVspEntityBuilder {
boolean firewallServiceSupported = _networkModel.areServicesSupportedByNetworkOffering(network.getNetworkOfferingId(), Network.Service.Firewall); boolean firewallServiceSupported = _networkModel.areServicesSupportedByNetworkOffering(network.getNetworkOfferingId(), Network.Service.Firewall);
vspNetworkBuilder.firewallServiceSupported(firewallServiceSupported); vspNetworkBuilder.firewallServiceSupported(firewallServiceSupported);
String preConfiguredDomainTemplateName = NuageVspUtil.getPreConfiguredDomainTemplateName(_configurationDao, _networkDetailsDao, network, networkOffering); String preConfiguredDomainTemplateName = _nuageVspManager.getPreConfiguredDomainTemplateName(network);
vspNetworkBuilder.domainTemplateName(preConfiguredDomainTemplateName); vspNetworkBuilder.domainTemplateName(preConfiguredDomainTemplateName);
if (usesVirtualRouter(networkOffering.getId())) { if (usesVirtualRouter(networkOffering.getId())) {

View File

@ -22,34 +22,12 @@ package com.cloud.util;
import com.cloud.dc.Vlan; import com.cloud.dc.Vlan;
import com.cloud.dc.VlanDetailsVO; import com.cloud.dc.VlanDetailsVO;
import com.cloud.dc.dao.VlanDetailsDao; import com.cloud.dc.dao.VlanDetailsDao;
import com.cloud.network.Network;
import com.cloud.network.dao.NetworkDetailVO;
import com.cloud.network.dao.NetworkDetailsDao;
import com.cloud.network.manager.NuageVspManager; import com.cloud.network.manager.NuageVspManager;
import com.cloud.offering.NetworkOffering;
import com.cloud.utils.StringUtils; import com.cloud.utils.StringUtils;
import org.apache.cloudstack.framework.config.dao.ConfigurationDao;
import org.apache.commons.codec.binary.Base64; import org.apache.commons.codec.binary.Base64;
public class NuageVspUtil { public class NuageVspUtil {
public static String getPreConfiguredDomainTemplateName(ConfigurationDao configDao, NetworkDetailsDao networkDetailsDao, Network network, NetworkOffering networkOffering) {
NetworkDetailVO domainTemplateNetworkDetail = networkDetailsDao.findDetail(network.getId(), NuageVspManager.nuageDomainTemplateDetailName);
if (domainTemplateNetworkDetail != null) {
return domainTemplateNetworkDetail.getValue();
}
String configKey;
if (network.getVpcId() != null) {
configKey = NuageVspManager.NuageVspVpcDomainTemplateName.key();
} else if (networkOffering.getGuestType() == Network.GuestType.Shared) {
configKey = NuageVspManager.NuageVspSharedNetworkDomainTemplateName.key();
} else {
configKey = NuageVspManager.NuageVspIsolatedNetworkDomainTemplateName.key();
}
return configDao.getValue(configKey);
}
public static String encodePassword(String originalPassword) { public static String encodePassword(String originalPassword) {
byte[] passwordBytes = originalPassword.getBytes(StringUtils.getPreferredCharset()); byte[] passwordBytes = originalPassword.getBytes(StringUtils.getPreferredCharset());
byte[] encodedPasswordBytes = Base64.encodeBase64(passwordBytes); byte[] encodedPasswordBytes = Base64.encodeBase64(passwordBytes);

View File

@ -31,7 +31,11 @@ import net.nuage.vsp.acs.client.api.model.VspNic;
import net.nuage.vsp.acs.client.api.model.VspStaticNat; import net.nuage.vsp.acs.client.api.model.VspStaticNat;
import net.nuage.vsp.acs.client.api.model.VspVm; import net.nuage.vsp.acs.client.api.model.VspVm;
import org.apache.cloudstack.framework.config.ConfigKey;
import org.apache.cloudstack.framework.config.impl.ConfigDepotImpl;
import org.apache.cloudstack.framework.config.impl.ConfigurationVO;
import org.junit.Before; import org.junit.Before;
import org.mockito.InjectMocks;
import org.mockito.Mock; import org.mockito.Mock;
import org.mockito.MockitoAnnotations; import org.mockito.MockitoAnnotations;
@ -65,18 +69,24 @@ public class NuageTest {
protected static final long NETWORK_ID = 42L; protected static final long NETWORK_ID = 42L;
@Mock protected NetworkModel _networkModel; @Mock protected NetworkModel _networkModel;
@Mock protected ConfigurationDao _configurationDao; @Mock protected ConfigurationDao _configDao;
@Mock protected NuageVspEntityBuilder _nuageVspEntityBuilder; @Mock protected NuageVspEntityBuilder _nuageVspEntityBuilder;
@InjectMocks
ConfigDepotImpl configDepot = new ConfigDepotImpl();
@Before @Before
public void setUp() throws Exception { public void setUp() throws Exception {
MockitoAnnotations.initMocks(this); MockitoAnnotations.initMocks(this);
// Standard responses // Standard responses
when(_networkModel.isProviderForNetwork(Network.Provider.NuageVsp, NETWORK_ID)).thenReturn(true); when(_networkModel.isProviderForNetwork(Network.Provider.NuageVsp, NETWORK_ID)).thenReturn(true);
when(_configurationDao.getValue(NuageVspIsolatedNetworkDomainTemplateName.key())).thenReturn("IsolatedDomainTemplate");
when(_configurationDao.getValue(NuageVspVpcDomainTemplateName.key())).thenReturn("VpcDomainTemplate"); mockConfigValue(NuageVspIsolatedNetworkDomainTemplateName, "IsolatedDomainTemplate");
when(_configurationDao.getValue(NuageVspSharedNetworkDomainTemplateName.key())).thenReturn("SharedDomainTemplate"); mockConfigValue(NuageVspVpcDomainTemplateName, "VpcDomainTemplate");
mockConfigValue(NuageVspSharedNetworkDomainTemplateName, "SharedDomainTemplate");
ConfigKey.init(configDepot);
when(_nuageVspEntityBuilder.buildVspDomain(any(Domain.class))).thenReturn(buildVspDomain()); when(_nuageVspEntityBuilder.buildVspDomain(any(Domain.class))).thenReturn(buildVspDomain());
when(_nuageVspEntityBuilder.buildVspNetwork(any(Network.class))).thenReturn(buildVspNetwork()); when(_nuageVspEntityBuilder.buildVspNetwork(any(Network.class))).thenReturn(buildVspNetwork());
@ -89,6 +99,13 @@ public class NuageTest {
when(_nuageVspEntityBuilder.buildVspAclRule(any(NetworkACLItem.class))).thenReturn(buildVspAclRule()); when(_nuageVspEntityBuilder.buildVspAclRule(any(NetworkACLItem.class))).thenReturn(buildVspAclRule());
} }
protected <T> void mockConfigValue(ConfigKey<T> configKey, T value) {
ConfigurationVO vo = new ConfigurationVO("test", configKey);
vo.setValue(value.toString());
when(_configDao.getValue(configKey.key())).thenReturn(value.toString());
when(_configDao.findById(configKey.key())).thenReturn(vo);
}
protected VspDomain buildVspDomain() { protected VspDomain buildVspDomain() {
return new VspDomain.Builder() return new VspDomain.Builder()
.uuid("domainUuid") .uuid("domainUuid")

View File

@ -83,9 +83,6 @@ import com.cloud.vm.VirtualMachine;
import com.cloud.vm.VirtualMachineProfile; import com.cloud.vm.VirtualMachineProfile;
import com.cloud.vm.dao.NicDao; import com.cloud.vm.dao.NicDao;
import static com.cloud.network.manager.NuageVspManager.NuageVspIsolatedNetworkDomainTemplateName;
import static com.cloud.network.manager.NuageVspManager.NuageVspSharedNetworkDomainTemplateName;
import static com.cloud.network.manager.NuageVspManager.NuageVspVpcDomainTemplateName;
import static org.hamcrest.Matchers.is; import static org.hamcrest.Matchers.is;
import static org.hamcrest.Matchers.notNullValue; import static org.hamcrest.Matchers.notNullValue;
import static org.hamcrest.Matchers.nullValue; import static org.hamcrest.Matchers.nullValue;
@ -133,10 +130,6 @@ public class NuageVspGuestNetworkGuruTest extends NuageTest {
when(_dataCenterDao.findById((Long)any())).thenReturn(dc); when(_dataCenterDao.findById((Long)any())).thenReturn(dc);
when(_configurationDao.getValue(NuageVspIsolatedNetworkDomainTemplateName.key())).thenReturn("IsolatedDomainTemplate");
when(_configurationDao.getValue(NuageVspVpcDomainTemplateName.key())).thenReturn("VpcDomainTemplate");
when(_configurationDao.getValue(NuageVspSharedNetworkDomainTemplateName.key())).thenReturn("SharedDomainTemplate");
when(_physicalNetworkDao.findById(any(Long.class))).thenReturn(physnet); when(_physicalNetworkDao.findById(any(Long.class))).thenReturn(physnet);
when(physnet.getIsolationMethods()).thenReturn(Arrays.asList("VSP")); when(physnet.getIsolationMethods()).thenReturn(Arrays.asList("VSP"));
when(physnet.getId()).thenReturn(NETWORK_ID); when(physnet.getId()).thenReturn(NETWORK_ID);

View File

@ -19,6 +19,25 @@
package com.cloud.network.manager; package com.cloud.network.manager;
import static org.junit.Assert.assertEquals;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.reset;
import static org.mockito.Mockito.when;
import java.util.ArrayList;
import javax.naming.ConfigurationException;
import org.junit.Test;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.apache.cloudstack.framework.config.impl.ConfigurationVO;
import org.apache.cloudstack.resourcedetail.VpcDetailVO;
import org.apache.cloudstack.resourcedetail.dao.VpcDetailsDao;
import com.cloud.NuageTest; import com.cloud.NuageTest;
import com.cloud.agent.AgentManager; import com.cloud.agent.AgentManager;
import com.cloud.agent.api.Command; import com.cloud.agent.api.Command;
@ -30,6 +49,8 @@ import com.cloud.host.dao.HostDao;
import com.cloud.host.dao.HostDetailsDao; import com.cloud.host.dao.HostDetailsDao;
import com.cloud.network.NuageVspDeviceVO; import com.cloud.network.NuageVspDeviceVO;
import com.cloud.network.dao.NetworkDao; import com.cloud.network.dao.NetworkDao;
import com.cloud.network.dao.NetworkDetailVO;
import com.cloud.network.dao.NetworkDetailsDao;
import com.cloud.network.dao.NetworkVO; import com.cloud.network.dao.NetworkVO;
import com.cloud.network.dao.NuageVspDao; import com.cloud.network.dao.NuageVspDao;
import com.cloud.network.dao.PhysicalNetworkDao; import com.cloud.network.dao.PhysicalNetworkDao;
@ -37,52 +58,69 @@ import com.cloud.network.dao.PhysicalNetworkServiceProviderDao;
import com.cloud.network.dao.PhysicalNetworkVO; import com.cloud.network.dao.PhysicalNetworkVO;
import com.cloud.resource.ResourceManager; import com.cloud.resource.ResourceManager;
import com.cloud.util.NuageVspEntityBuilder; import com.cloud.util.NuageVspEntityBuilder;
import org.apache.cloudstack.framework.config.dao.ConfigurationDao;
import org.apache.cloudstack.framework.config.impl.ConfigurationVO;
import org.junit.Before;
import org.junit.Test;
import javax.naming.ConfigurationException;
import java.util.ArrayList;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
public class NuageVspManagerTest extends NuageTest { public class NuageVspManagerTest extends NuageTest {
private static final long NETWORK_ID = 42L; private static final long NETWORK_ID = 42L;
private static final long VPC_ID = 1L;
private static final long VPC_ID2 = 2L;
private PhysicalNetworkDao _physicalNetworkDao = mock(PhysicalNetworkDao.class); @Mock private PhysicalNetworkDao _physicalNetworkDao ;
private PhysicalNetworkServiceProviderDao _physicalNetworkServiceProviderDao = mock(PhysicalNetworkServiceProviderDao.class); @Mock private PhysicalNetworkServiceProviderDao _physicalNetworkServiceProviderDao;
private ResourceManager _resourceManager = mock(ResourceManager.class); @Mock private ResourceManager _resourceManager;
private HostDetailsDao _hostDetailsDao = mock(HostDetailsDao.class); @Mock private HostDetailsDao _hostDetailsDao;
private NuageVspDao _nuageVspDao = mock(NuageVspDao.class); @Mock private NuageVspDao _nuageVspDao;
private NetworkDao _networkDao = mock(NetworkDao.class); @Mock private NetworkDao _networkDao;
private HostDao _hostDao = mock(HostDao.class); @Mock private HostDao _hostDao;
private AgentManager _agentManager = mock(AgentManager.class); @Mock private AgentManager _agentManager;
private ConfigurationDao _configurationDao = mock(ConfigurationDao.class); @Mock private NuageVspEntityBuilder _nuageVspEntityBuilder;
private NuageVspEntityBuilder _nuageVspEntityBuilder = mock(NuageVspEntityBuilder.class); @Mock private NetworkDetailsDao _networkDetailsDao;
private NuageVspManagerImpl _nuageVspManager; @Mock private VpcDetailsDao _vpcDetailsDao;
@Before @InjectMocks
public void setUp() throws Exception { private NuageVspManagerImpl _nuageVspManager = new NuageVspManagerImpl();
super.setUp();
_nuageVspManager = new NuageVspManagerImpl(); private NetworkVO setUpMockedNetwork(Long vpcId, String domainTemplateName) {
NetworkVO networkToMock = mock(NetworkVO.class);
when(networkToMock.getId()).thenReturn(NETWORK_ID);
_nuageVspManager._physicalNetworkServiceProviderDao = _physicalNetworkServiceProviderDao; reset(_vpcDetailsDao, _networkDetailsDao);
_nuageVspManager._physicalNetworkDao = _physicalNetworkDao;
_nuageVspManager._resourceMgr = _resourceManager; when(networkToMock.getVpcId()).thenReturn(vpcId);
_nuageVspManager._hostDetailsDao = _hostDetailsDao;
_nuageVspManager._nuageVspDao = _nuageVspDao; if (domainTemplateName != null) {
_nuageVspManager._networkDao = _networkDao; if (vpcId != null) {
_nuageVspManager._hostDao = _hostDao; VpcDetailVO detail = new VpcDetailVO(vpcId, NuageVspManager.nuageDomainTemplateDetailName, domainTemplateName, false);
_nuageVspManager._agentMgr = _agentManager; when(_vpcDetailsDao.findDetail(vpcId, NuageVspManager.nuageDomainTemplateDetailName)).thenReturn(detail);
_nuageVspManager._configDao = _configurationDao; } else {
_nuageVspManager._nuageVspEntityBuilder = _nuageVspEntityBuilder; NetworkDetailVO detail = new NetworkDetailVO(NETWORK_ID, NuageVspManager.nuageDomainTemplateDetailName, domainTemplateName, false);
when(_networkDetailsDao.findDetail(NETWORK_ID, NuageVspManager.nuageDomainTemplateDetailName)).thenReturn(detail);
}
}
return networkToMock;
} }
@Test
public void testNuagePreConfiguredDomainTemplates() {
NetworkVO _mockedL2Network = setUpMockedNetwork(VPC_ID, "VpcDomainTemplate2");
String checkDomainTemplate =_nuageVspManager.getPreConfiguredDomainTemplateName(_mockedL2Network);
assertEquals("VpcDomainTemplate2", checkDomainTemplate);
_mockedL2Network = setUpMockedNetwork(VPC_ID2, null);
checkDomainTemplate =_nuageVspManager.getPreConfiguredDomainTemplateName(_mockedL2Network);
assertEquals("VpcDomainTemplate", checkDomainTemplate);
_mockedL2Network = setUpMockedNetwork(null, "IsolatedDomainTemplate2");
checkDomainTemplate =_nuageVspManager.getPreConfiguredDomainTemplateName(_mockedL2Network);
assertEquals("IsolatedDomainTemplate2", checkDomainTemplate);
_mockedL2Network = setUpMockedNetwork(null, null);
checkDomainTemplate =_nuageVspManager.getPreConfiguredDomainTemplateName(_mockedL2Network);
assertEquals("IsolatedDomainTemplate", checkDomainTemplate);
}
@Test @Test
public void testDeleteNuageVspDevice() throws ConfigurationException { public void testDeleteNuageVspDevice() throws ConfigurationException {
@ -107,7 +145,7 @@ public class NuageVspManagerTest extends NuageTest {
ConfigurationVO cmsIdConfig = mock(ConfigurationVO.class); ConfigurationVO cmsIdConfig = mock(ConfigurationVO.class);
when(cmsIdConfig.getValue()).thenReturn("1:1"); when(cmsIdConfig.getValue()).thenReturn("1:1");
when(_configurationDao.findByName("nuagevsp.cms.id")).thenReturn(cmsIdConfig); when(_configDao.findByName("nuagevsp.cms.id")).thenReturn(cmsIdConfig);
final SyncNuageVspCmsIdAnswer answer = mock(SyncNuageVspCmsIdAnswer.class); final SyncNuageVspCmsIdAnswer answer = mock(SyncNuageVspCmsIdAnswer.class);
when(answer.getResult()).thenReturn(true); when(answer.getResult()).thenReturn(true);

View File

@ -19,6 +19,14 @@
package com.cloud.util; package com.cloud.util;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.mockito.Matchers.anyLong;
import static org.mockito.Matchers.anyString;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import net.nuage.vsp.acs.client.api.model.Protocol; import net.nuage.vsp.acs.client.api.model.Protocol;
import net.nuage.vsp.acs.client.api.model.VspAclRule; import net.nuage.vsp.acs.client.api.model.VspAclRule;
import net.nuage.vsp.acs.client.api.model.VspDomain; import net.nuage.vsp.acs.client.api.model.VspDomain;
@ -27,12 +35,15 @@ import net.nuage.vsp.acs.client.api.model.VspNic;
import net.nuage.vsp.acs.client.api.model.VspStaticNat; import net.nuage.vsp.acs.client.api.model.VspStaticNat;
import net.nuage.vsp.acs.client.api.model.VspVm; import net.nuage.vsp.acs.client.api.model.VspVm;
import org.apache.cloudstack.resourcedetail.dao.VpcDetailsDao;
import org.junit.Before; import org.junit.Before;
import org.junit.Test; import org.junit.Test;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import com.google.common.collect.Lists; import com.google.common.collect.Lists;
import org.apache.cloudstack.resourcedetail.dao.VpcDetailsDao;
import com.cloud.NuageTest; import com.cloud.NuageTest;
import com.cloud.dc.VlanDetailsVO; import com.cloud.dc.VlanDetailsVO;
import com.cloud.dc.VlanVO; import com.cloud.dc.VlanVO;
@ -47,6 +58,7 @@ import com.cloud.network.dao.IPAddressVO;
import com.cloud.network.dao.NetworkDao; import com.cloud.network.dao.NetworkDao;
import com.cloud.network.dao.NetworkDetailsDao; import com.cloud.network.dao.NetworkDetailsDao;
import com.cloud.network.dao.NetworkVO; import com.cloud.network.dao.NetworkVO;
import com.cloud.network.manager.NuageVspManager;
import com.cloud.network.rules.FirewallRule; import com.cloud.network.rules.FirewallRule;
import com.cloud.network.vpc.NetworkACLItem; import com.cloud.network.vpc.NetworkACLItem;
import com.cloud.network.vpc.VpcVO; import com.cloud.network.vpc.VpcVO;
@ -61,14 +73,8 @@ import com.cloud.vm.NicProfile;
import com.cloud.vm.NicVO; import com.cloud.vm.NicVO;
import com.cloud.vm.VirtualMachine; import com.cloud.vm.VirtualMachine;
import com.cloud.vm.dao.NicDao; import com.cloud.vm.dao.NicDao;
import com.cloud.vm.dao.NicSecondaryIpDao;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.mockito.Matchers.anyLong;
import static org.mockito.Matchers.anyString;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
public class NuageVspEntityBuilderTest extends NuageTest { public class NuageVspEntityBuilderTest extends NuageTest {
@ -83,18 +89,23 @@ public class NuageVspEntityBuilderTest extends NuageTest {
private static final long VLAN_ID = 5L; private static final long VLAN_ID = 5L;
public static final String VM_IP = "192.168.0.24"; public static final String VM_IP = "192.168.0.24";
private VpcDao _vpcDao = mock(VpcDao.class); @Mock private AccountDao _accountDao;
private VpcDetailsDao _vpcDetailsDao = mock(VpcDetailsDao.class); @Mock private DomainDao _domainDao;
private DomainDao _domainDao = mock(DomainDao.class); @Mock private IPAddressDao _ipAddressDao;
private AccountDao _accountDao = mock(AccountDao.class); @Mock private NetworkDao _networkDao;
private NetworkDao _networkDao = mock(NetworkDao.class); @Mock private NetworkDetailsDao _networkDetailsDao;
private NetworkOfferingDao _networkOfferingDao = mock(NetworkOfferingDao.class); @Mock private NetworkOfferingDao _networkOfferingDao;
private NetworkOfferingServiceMapDao _networkOfferingServiceMapDao = mock(NetworkOfferingServiceMapDao.class); @Mock private NetworkOfferingServiceMapDao _networkOfferingServiceMapDao;
private VlanDao _vlanDao = mock(VlanDao.class); @Mock private NicSecondaryIpDao _nicSecondaryIpDao;
private VlanDetailsDao _vlanDetailsDao = mock(VlanDetailsDao.class); @Mock private NicDao _nicDao;
private IPAddressDao _ipAddressDao = mock(IPAddressDao.class); @Mock private VlanDao _vlanDao;
private NetworkDetailsDao _networkDetailsDao = mock(NetworkDetailsDao.class); @Mock private VlanDetailsDao _vlanDetailsDao;
private NicDao _nicDao = mock(NicDao.class); @Mock private VpcDao _vpcDao;
@Mock private VpcDetailsDao _vpcDetailsDao;
@Mock private NuageVspManager _nuageVspManager;
@InjectMocks
private NuageVspEntityBuilder _nuageVspEntityBuilder = new NuageVspEntityBuilder(); private NuageVspEntityBuilder _nuageVspEntityBuilder = new NuageVspEntityBuilder();
private DomainVO _mockedDomain = mock(DomainVO.class); private DomainVO _mockedDomain = mock(DomainVO.class);
@ -122,21 +133,6 @@ public class NuageVspEntityBuilderTest extends NuageTest {
public void setUp() throws Exception { public void setUp() throws Exception {
super.setUp(); super.setUp();
_nuageVspEntityBuilder._vpcDao = _vpcDao;
_nuageVspEntityBuilder._vpcDetailsDao = _vpcDetailsDao;
_nuageVspEntityBuilder._domainDao = _domainDao;
_nuageVspEntityBuilder._accountDao = _accountDao;
_nuageVspEntityBuilder._networkDao = _networkDao;
_nuageVspEntityBuilder._networkOfferingDao = _networkOfferingDao;
_nuageVspEntityBuilder._networkOfferingServiceMapDao = _networkOfferingServiceMapDao;
_nuageVspEntityBuilder._vlanDao = _vlanDao;
_nuageVspEntityBuilder._vlanDetailsDao = _vlanDetailsDao;
_nuageVspEntityBuilder._configurationDao = _configurationDao;
_nuageVspEntityBuilder._ipAddressDao = _ipAddressDao;
_nuageVspEntityBuilder._networkModel = _networkModel;
_nuageVspEntityBuilder._networkDetailsDao = _networkDetailsDao;
_nuageVspEntityBuilder._nicDao = _nicDao;
setUpMockedDomain(); setUpMockedDomain();
setUpMockedAccount(); setUpMockedAccount();
setUpMockedNetworkOffering(_mockedNetworkOffering, Network.GuestType.Isolated); setUpMockedNetworkOffering(_mockedNetworkOffering, Network.GuestType.Isolated);
@ -169,28 +165,28 @@ public class NuageVspEntityBuilderTest extends NuageTest {
@Test @Test
public void testBuildVspNetwork() { public void testBuildVspNetwork() {
VspNetwork vspNetwork = _nuageVspEntityBuilder.buildVspNetwork(_mockedL2Network); VspNetwork vspNetwork = _nuageVspEntityBuilder.buildVspNetwork(_mockedL2Network);
validateVspNetwork(vspNetwork, true, false, false, false, "IsolatedDomainTemplate"); validateVspNetwork(vspNetwork, true, false, false, false);
vspNetwork = _nuageVspEntityBuilder.buildVspNetwork(_mockedL2Network); vspNetwork = _nuageVspEntityBuilder.buildVspNetwork(_mockedL2Network);
validateVspNetwork(vspNetwork, true, false, false, false, "IsolatedDomainTemplate"); validateVspNetwork(vspNetwork, true, false, false, false);
vspNetwork = _nuageVspEntityBuilder.buildVspNetwork(_mockedNetwork); vspNetwork = _nuageVspEntityBuilder.buildVspNetwork(_mockedNetwork);
validateVspNetwork(vspNetwork, false, true, false, false, "IsolatedDomainTemplate"); validateVspNetwork(vspNetwork, false, true, false, false);
vspNetwork = _nuageVspEntityBuilder.buildVspNetwork(_mockedNetwork); vspNetwork = _nuageVspEntityBuilder.buildVspNetwork(_mockedNetwork);
validateVspNetwork(vspNetwork, false, true, false, false, "IsolatedDomainTemplate"); validateVspNetwork(vspNetwork, false, true, false, false);
vspNetwork = _nuageVspEntityBuilder.buildVspNetwork(_mockedVpcNetwork); vspNetwork = _nuageVspEntityBuilder.buildVspNetwork(_mockedVpcNetwork);
validateVspNetwork(vspNetwork, false, false, true, false, "VpcDomainTemplate"); validateVspNetwork(vspNetwork, false, false, true, false);
vspNetwork = _nuageVspEntityBuilder.buildVspNetwork(_mockedVpcNetwork); vspNetwork = _nuageVspEntityBuilder.buildVspNetwork(_mockedVpcNetwork);
validateVspNetwork(vspNetwork, false, false, true, false, "VpcDomainTemplate"); validateVspNetwork(vspNetwork, false, false, true, false);
vspNetwork = _nuageVspEntityBuilder.buildVspNetwork(_mockedSharedNetwork); vspNetwork = _nuageVspEntityBuilder.buildVspNetwork(_mockedSharedNetwork);
validateVspNetwork(vspNetwork, false, false, false, true, "SharedDomainTemplate"); validateVspNetwork(vspNetwork, false, false, false, true);
vspNetwork = _nuageVspEntityBuilder.buildVspNetwork(_mockedSharedNetwork); vspNetwork = _nuageVspEntityBuilder.buildVspNetwork(_mockedSharedNetwork);
validateVspNetwork(vspNetwork, false, false, false, true, "SharedDomainTemplate"); validateVspNetwork(vspNetwork, false, false, false, true);
} }
@Test @Test
@ -235,8 +231,7 @@ public class NuageVspEntityBuilderTest extends NuageTest {
assertEquals("domainPath", vspDomain.getPath()); assertEquals("domainPath", vspDomain.getPath());
} }
private void validateVspNetwork(VspNetwork vspNetwork, boolean isL2, boolean isL3, boolean isVpc, boolean isShared, private void validateVspNetwork(VspNetwork vspNetwork, boolean isL2, boolean isL3, boolean isVpc, boolean isShared) {
String domainTemplateName) {
assertEquals(NETWORK_ID, vspNetwork.getId()); assertEquals(NETWORK_ID, vspNetwork.getId());
assertEquals("networkUuid", vspNetwork.getUuid()); assertEquals("networkUuid", vspNetwork.getUuid());
assertEquals("networkName", vspNetwork.getName()); assertEquals("networkName", vspNetwork.getName());
@ -260,7 +255,6 @@ public class NuageVspEntityBuilderTest extends NuageTest {
assertEquals(isShared, vspNetwork.isShared()); assertEquals(isShared, vspNetwork.isShared());
assertEquals(true, vspNetwork.isFirewallServiceSupported()); assertEquals(true, vspNetwork.isFirewallServiceSupported());
assertEquals(true, vspNetwork.isEgressDefaultPolicy()); assertEquals(true, vspNetwork.isEgressDefaultPolicy());
assertEquals(domainTemplateName, vspNetwork.getDomainTemplateName());
assertEquals("10.10.10.0/24", vspNetwork.getCidr()); assertEquals("10.10.10.0/24", vspNetwork.getCidr());
assertEquals("10.10.10.1", vspNetwork.getGateway()); assertEquals("10.10.10.1", vspNetwork.getGateway());
} }

36
pom.xml
View File

@ -1,23 +1,21 @@
<!-- <!--
~ Licensed to the Apache Software Foundation (ASF) under one
Licensed to the Apache Software Foundation (ASF) under one ~ or more contributor license agreements. See the NOTICE file
or more contributor license agreements. See the NOTICE file ~ distributed with this work for additional information
distributed with this work for additional information ~ regarding copyright ownership. The ASF licenses this file
regarding copyright ownership. The ASF licenses this file ~ to you under the Apache License, Version 2.0 (the
to you under the Apache License, Version 2.0 (the ~ "License"); you may not use this file except in compliance
"License"); you may not use this file except in compliance ~ with the License. You may obtain a copy of the License at
with the License. You may obtain a copy of the License at ~
~ http://www.apache.org/licenses/LICENSE-2.0
http://www.apache.org/licenses/LICENSE-2.0 ~
~ Unless required by applicable law or agreed to in writing,
Unless required by applicable law or agreed to in writing, ~ software distributed under the License is distributed on an
software distributed under the License is distributed on an ~ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY ~ KIND, either express or implied. See the License for the
KIND, either express or implied. See the License for the ~ specific language governing permissions and limitations
specific language governing permissions and limitations ~ under the License.
under the License. -->
-->
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>

View File

@ -905,7 +905,8 @@ class nuageTestCase(cloudstackTestCase):
# verify_vsd_network - Verifies the given CloudStack domain and network/VPC # verify_vsd_network - Verifies the given CloudStack domain and network/VPC
# against the corresponding installed enterprise, domain, zone, and subnet # against the corresponding installed enterprise, domain, zone, and subnet
# in VSD # in VSD
def verify_vsd_network(self, domain_id, network, vpc=None): def verify_vsd_network(self, domain_id, network, vpc=None,
domain_template_name=None):
self.debug("Verifying the creation and state of Network - %s in VSD" % self.debug("Verifying the creation and state of Network - %s in VSD" %
network.name) network.name)
vsd_enterprise = self.vsd.get_enterprise( vsd_enterprise = self.vsd.get_enterprise(
@ -920,6 +921,18 @@ class nuageTestCase(cloudstackTestCase):
"VSD enterprise name should match CloudStack domain " "VSD enterprise name should match CloudStack domain "
"uuid" "uuid"
) )
if domain_template_name:
vsd_domain_template = self.vsd.get_domain_template(
enterprise=vsd_enterprise,
filter=self.vsd.set_name_filter(domain_template_name))
else:
vsd_domain_template = self.vsd.get_domain_template(
enterprise=vsd_enterprise,
filter=ext_network_filter)
self.assertEqual(vsd_domain.template_id, vsd_domain_template.id,
"VSD domain should be instantiated from appropriate "
"domain template"
)
if vpc: if vpc:
self.assertEqual(vsd_domain.description, "VPC_" + vpc.name, self.assertEqual(vsd_domain.description, "VPC_" + vpc.name,
"VSD domain description should match VPC name in " "VSD domain description should match VPC name in "

View File

@ -0,0 +1,831 @@
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.
""" Component tests for Nuage VSP SDN plugin's Domain Template feature
"""
# Import Local Modules
from nuageTestCase import nuageTestCase
from marvin.lib.base import (Account,
Configurations,
Domain,
Network,
User,
VirtualMachine)
from marvin.cloudstackAPI import (associateNuageVspDomainTemplate,
listNuageVspDomainTemplates,
listNuageVspGlobalDomainTemplate)
# Import System Modules
from nose.plugins.attrib import attr
class TestNuageDomainTemplate(nuageTestCase):
"""Test Nuage VSP SDN plugin's Domain Template feature
"""
@classmethod
def setUpClass(cls):
"""
Create the following domain tree and accounts that are required for
executing Nuage VSP SDN plugin's Domain Template feature test cases:
Under ROOT - Create a domain D1
Under domain D1 - Create a subdomain D11
Under each of the domains - create an admin user and a regular
user account.
Create Nuage VSP VPC and network (tier) offerings
Create a VPC with a VPC network (tier) under each of the admin accounts
of the above domains
Create three pre-configured Nuage VSP domain templates per enterprise
in VSD corresponding to each of the above domains
"""
super(TestNuageDomainTemplate, cls).setUpClass()
cls.domains_accounts_data = cls.test_data["acl"]
try:
# Backup default (ROOT admin user) apikey and secretkey
cls.default_apikey = cls.api_client.connection.apiKey
cls.default_secretkey = cls.api_client.connection.securityKey
# Create domains
cls.domain_1 = Domain.create(
cls.api_client,
cls.domains_accounts_data["domain1"]
)
cls._cleanup.append(cls.domain_1)
cls.domain_11 = Domain.create(
cls.api_client,
cls.domains_accounts_data["domain11"],
parentdomainid=cls.domain_1.id
)
cls._cleanup.append(cls.domain_11)
# Create an admin and an user account under ROOT domain
cls.account_root = Account.create(
cls.api_client,
cls.domains_accounts_data["accountROOT"],
admin=True,
)
user = cls.generateKeysForUser(cls.api_client, cls.account_root)
cls.user_root_apikey = user.apikey
cls.user_root_secretkey = user.secretkey
cls._cleanup.append(cls.account_root)
cls.account_roota = Account.create(
cls.api_client,
cls.domains_accounts_data["accountROOTA"],
admin=False,
)
user = cls.generateKeysForUser(cls.api_client, cls.account_roota)
cls.user_roota_apikey = user.apikey
cls.user_roota_secretkey = user.secretkey
cls._cleanup.append(cls.account_roota)
# Create an admin and an user account under domain D1
cls.account_d1 = Account.create(
cls.api_client,
cls.domains_accounts_data["accountD1"],
admin=True,
domainid=cls.domain_1.id
)
user = cls.generateKeysForUser(cls.api_client, cls.account_d1)
cls.user_d1_apikey = user.apikey
cls.user_d1_secretkey = user.secretkey
cls._cleanup.append(cls.account_d1)
cls.account_d1a = Account.create(
cls.api_client,
cls.domains_accounts_data["accountD1A"],
admin=False,
domainid=cls.domain_1.id
)
user = cls.generateKeysForUser(cls.api_client, cls.account_d1a)
cls.user_d1a_apikey = user.apikey
cls.user_d1a_secretkey = user.secretkey
cls._cleanup.append(cls.account_d1a)
# Create an admin and an user account under subdomain D11
cls.account_d11 = Account.create(
cls.api_client,
cls.domains_accounts_data["accountD11"],
admin=True,
domainid=cls.domain_11.id
)
user = cls.generateKeysForUser(cls.api_client, cls.account_d11)
cls.user_d11_apikey = user.apikey
cls.user_d11_secretkey = user.secretkey
cls._cleanup.append(cls.account_d11)
cls.account_d11a = Account.create(
cls.api_client,
cls.domains_accounts_data["accountD11A"],
admin=False,
domainid=cls.domain_11.id
)
user = cls.generateKeysForUser(cls.api_client, cls.account_d11a)
cls.user_d11a_apikey = user.apikey
cls.user_d11a_secretkey = user.secretkey
cls._cleanup.append(cls.account_d11a)
# Create VPC offering
cls.vpc_offering = cls.create_VpcOffering(
cls.test_data["nuagevsp"]["vpc_offering"])
# Create VPC network (tier) offering
cls.network_offering = cls.create_NetworkOffering(
cls.test_data["nuagevsp"]["vpc_network_offering"])
# Create a VPC with a VPC network (tier) under each of the admin
# accounts of ROOT domain, domain D1, and subdomain D11
# Create 500 pre-configured Nuage VSP domain templates per
# enterprise in VSD corresponding to each of the above domains
cls.cleanup_domain_templates = []
cls.domain_template_list = []
for i in range(0, 3):
cls.domain_template_list.append("domain_template_" + str(i))
for account in [cls.account_root, cls.account_d1, cls.account_d11]:
vpc = cls.create_Vpc(
cls.vpc_offering, cidr='10.1.0.0/16', account=account)
cls.create_Network(
cls.network_offering,
vpc=vpc,
account=account)
for domain_template in cls.domain_template_list:
new_domain_template = cls.vsdk.NUDomainTemplate(
name=domain_template,
description=domain_template)
enterprise = cls._session.user.enterprises.get_first(
filter="externalID BEGINSWITH '%s'" % account.domainid)
enterprise.create_child(new_domain_template)
cls.cleanup_domain_templates.append(
enterprise.domain_templates.get_first(
filter="name is '%s'" % domain_template))
except Exception as e:
cls.tearDownClass()
raise Exception("Failed to create the setup required to execute "
"the test cases: %s" % e)
return
@classmethod
def tearDownClass(cls):
# Restore back default (ROOT admin user) apikey and secretkey
cls.api_client.connection.apiKey = cls.default_apikey
cls.api_client.connection.securityKey = cls.default_secretkey
# Cleanup resources used
cls.debug("Cleaning up the resources")
for domain_template in cls.cleanup_domain_templates:
try:
domain_template.delete()
except Exception as e:
cls.error("Failed to cleanup domain template %s in VSD, got "
"%s" % (domain_template, e))
cls.cleanup_domain_templates = []
for obj in reversed(cls._cleanup):
try:
if isinstance(obj, VirtualMachine):
obj.delete(cls.api_client, expunge=True)
else:
obj.delete(cls.api_client)
except Exception as e:
cls.error("Failed to cleanup %s, got %s" % (obj, e))
try:
cls.vpc_offering.delete(cls.api_client)
cls.network_offering.delete(cls.api_client)
cls.service_offering.delete(cls.api_client)
except Exception as e:
cls.error("Failed to cleanup offerings - %s" % e)
# cleanup_resources(cls.api_client, cls._cleanup)
cls._cleanup = []
cls.debug("Cleanup complete!")
return
def setUp(self):
self.account = self.account_root
self.cleanup = []
return
def tearDown(self):
# Restore back default (ROOT admin user) apikey and secretkey
self.api_client.connection.apiKey = self.default_apikey
self.api_client.connection.securityKey = self.default_secretkey
# Cleanup resources used
self.debug("Cleaning up the resources")
for obj in reversed(self.cleanup):
try:
if isinstance(obj, VirtualMachine):
obj.delete(self.api_client, expunge=True)
else:
obj.delete(self.api_client)
except Exception as e:
self.error("Failed to cleanup %s, got %s" % (obj, e))
# cleanup_resources(self.api_client, self.cleanup)
self.cleanup = []
self.debug("Cleanup complete!")
return
@staticmethod
def generateKeysForUser(api_client, account):
user = User.list(
api_client,
account=account.name,
domainid=account.domainid
)[0]
return (User.registerUserKeys(
api_client,
user.id
))
# list_NuageVspDomainTemplates - Lists pre-configured Nuage VSP domain
# template(s) for the given domain/account user
def list_NuageVspDomainTemplates(self, account=None, name=None):
if not account:
account = self.account
cmd = listNuageVspDomainTemplates.listNuageVspDomainTemplatesCmd()
cmd.domainid = account.domainid
cmd.zoneid = self.zone.id
domain_templates = self.api_client.listNuageVspDomainTemplates(cmd)
if name:
return [domain_template for domain_template in domain_templates
if str(domain_template.name) == name]
else:
return domain_templates
# validate_NuageVspDomainTemplate - Validates the given pre-configured
# Nuage VSP domain template for the given domain/account user
def validate_NuageVspDomainTemplate(self, name, account=None):
"""Validates the pre-configured Nuage VSP domain template"""
if not account:
account = self.account
self.debug("Validating the availability of pre-configured Nuage VSP "
"domain template - %s for domain/account user - %s "
% (name, account))
domain_templates = self.list_NuageVspDomainTemplates(
name=name, account=account)
self.assertEqual(isinstance(domain_templates, list), True,
"List Nuage VSP Domain Templates should return a "
"valid list"
)
self.assertEqual(domain_templates[0].name, name,
"Name of the Nuage VSP Domain Template should "
"be in the returned list"
)
self.debug("Successfully validated the availability of pre-configured "
"Nuage VSP domain template - %s for domain/account user - "
"%s" % (name, account))
# associate_NuageVspDomainTemplate - Associates the given pre-configured
# Nuage VSP domain template to the given VPC
def associate_NuageVspDomainTemplate(self, domain_template_name, vpc):
cmd = associateNuageVspDomainTemplate.\
associateNuageVspDomainTemplateCmd()
cmd.domaintemplate = domain_template_name
cmd.vpcid = vpc.id
cmd.zoneid = self.zone.id
return self.api_client.associateNuageVspDomainTemplate(cmd)
# update_NuageVspGlobalDomainTemplate - Updates the global setting
# nuagevsp.vpc.domaintemplate.name with the given value
def update_NuageVspGlobalDomainTemplate(self, value):
self.debug("Updating global setting nuagevsp.vpc.domaintemplate.name "
"with value - %s" % value)
self.user_apikey = self.api_client.connection.apiKey
self.user_secretkey = self.api_client.connection.securityKey
self.api_client.connection.apiKey = self.default_apikey
self.api_client.connection.securityKey = self.default_secretkey
Configurations.update(self.api_client,
name="nuagevsp.vpc.domaintemplate.name",
value=value)
self.api_client.connection.apiKey = self.user_apikey
self.api_client.connection.securityKey = self.user_secretkey
self.debug("Successfully updated global setting "
"nuagevsp.vpc.domaintemplate.name with value - %s" % value)
# list_NuageVspGlobalDomainTemplate - Lists the name of the global/default
# pre-configured Nuage VSP domain template as mentioned in the global
# setting "nuagevsp.vpc.domaintemplate.name"
def list_NuageVspGlobalDomainTemplate(self):
cmd = listNuageVspGlobalDomainTemplate.\
listNuageVspGlobalDomainTemplateCmd()
return self.api_client.listNuageVspGlobalDomainTemplate(cmd)
@attr(tags=["advanced", "nuagevsp"], required_hardware="false")
def test_01_nuage_Domain_Template_selection_per_VPC(self):
"""Test Nuage VSP Domain Template selection per VPC
"""
# 1. Associate an invalid/non-existing Nuage VSP domain template to a
# VPC; verify that the association fails.
# 2. Associate a valid/existing pre-configured Nuage VSP domain
# template to a VPC; verify that the association is successful, VPC
# networks (domains) are instantiated from the associated domain
# template in VSD.
# 3. Verify that the state of such VPC networks (domains) in VSD is not
# affected with their restarts in CloudStack with and without
# cleanup.
# 4. Verify that multiple associations (update) of domain templates to
# a VPC goes through till the creation of its first VPC network
# (tier).
# 5. Verify that the VPC networks (domains) creation fails in VSD when
# the associated domain templates to their corresponding VPCs have
# been deleted in VSD.
# 6. Verify that the VPC networks (domains) creation fails in VSD when
# an acl list is associated with them after their corresponding VPCs
# have been associated with a pre-configured Nuage VSP domain
# template.
# 7. Delete all the created objects (cleanup).
# Creating VPC
vpc_1 = self.create_Vpc(self.vpc_offering, cidr='10.1.0.0/16')
# Associating pre-configured Nuage VSP Domain Template to VPC
with self.assertRaises(Exception):
self.validate_NuageVspDomainTemplate("invalid_domain_template")
self.debug("There is no domain template with name "
"invalid_domain_template in VSD")
with self.assertRaises(Exception):
self.associate_NuageVspDomainTemplate(
"invalid_domain_template", vpc_1)
self.debug("Association fails as there is no domain template with "
"name invalid_domain_template in VSD")
self.associate_NuageVspDomainTemplate(
self.domain_template_list[0], vpc_1)
# Creating VPC networks (tiers)
vpc_1_tier_1 = self.create_Network(
self.network_offering, gateway='10.1.3.1', vpc=vpc_1)
vpc_1_tier_2 = self.create_Network(
self.network_offering, gateway='10.1.4.1', vpc=vpc_1)
# VSD verification
self.verify_vsd_network(
self.account.domainid, vpc_1_tier_1, vpc_1,
domain_template_name=self.domain_template_list[0])
self.verify_vsd_network(
self.account.domainid, vpc_1_tier_2, vpc_1,
domain_template_name=self.domain_template_list[0])
# Restart VPC networks (tiers) without cleanup
Network.restart(vpc_1_tier_1, self.api_client, cleanup=False)
Network.restart(vpc_1_tier_2, self.api_client, cleanup=False)
# VSD verification
self.verify_vsd_network(
self.account.domainid, vpc_1_tier_1, vpc_1,
domain_template_name=self.domain_template_list[0])
self.verify_vsd_network(
self.account.domainid, vpc_1_tier_2, vpc_1,
domain_template_name=self.domain_template_list[0])
# Restart VPC networks (tiers) with cleanup
Network.restart(vpc_1_tier_1, self.api_client, cleanup=True)
Network.restart(vpc_1_tier_2, self.api_client, cleanup=True)
# VSD verification
self.verify_vsd_network(
self.account.domainid, vpc_1_tier_1, vpc_1,
domain_template_name=self.domain_template_list[0])
self.verify_vsd_network(
self.account.domainid, vpc_1_tier_2, vpc_1,
domain_template_name=self.domain_template_list[0])
# Restart VPC without cleanup
self.restart_Vpc(vpc_1, cleanup=False)
# VSD verification
self.verify_vsd_network(
self.account.domainid, vpc_1_tier_1, vpc_1,
domain_template_name=self.domain_template_list[0])
self.verify_vsd_network(
self.account.domainid, vpc_1_tier_2, vpc_1,
domain_template_name=self.domain_template_list[0])
# Restart VPC with cleanup
self.restart_Vpc(vpc_1, cleanup=True)
# VSD verification
self.verify_vsd_network(
self.account.domainid, vpc_1_tier_1, vpc_1,
domain_template_name=self.domain_template_list[0])
self.verify_vsd_network(
self.account.domainid, vpc_1_tier_2, vpc_1,
domain_template_name=self.domain_template_list[0])
# Creating VPC
vpc_2 = self.create_Vpc(self.vpc_offering, cidr='10.1.0.0/16')
# Associating pre-configured Nuage VSP Domain Template to VPC
self.validate_NuageVspDomainTemplate(self.domain_template_list[0])
self.associate_NuageVspDomainTemplate(
self.domain_template_list[0], vpc_2)
self.validate_NuageVspDomainTemplate(self.domain_template_list[1])
self.associate_NuageVspDomainTemplate(
self.domain_template_list[1], vpc_2)
# Deleting the associated pre-configured Nuage VSP domain template
enterprise = self._session.user.enterprises.get_first(
filter="externalID BEGINSWITH '%s'" % self.account.domainid)
domain_template = enterprise.domain_templates.get_first(
filter="name is '%s'" % self.domain_template_list[1])
domain_template.delete()
# Creating VPC networks (tiers)
with self.assertRaises(Exception):
self.create_Network(
self.network_offering,
gateway='10.1.1.1',
vpc=vpc_2)
self.debug("Corresponding domain creation in VSD fails, but VPC "
"(tier) network gets created on CloudStack as the "
"associated pre-configured Nuage VSP domain template is no "
"longer existing in VSD")
# Re-creating the associated pre-configured Nuage VSP domain template
new_domain_template = self.vsdk.NUDomainTemplate(
name=self.domain_template_list[1],
description=self.domain_template_list[1])
enterprise = self._session.user.enterprises.get_first(
filter="externalID BEGINSWITH '%s'" % self.account.domainid)
enterprise.create_child(new_domain_template)
self.cleanup_domain_templates.append(
enterprise.domain_templates.get_first(
filter="name is '%s'" % self.domain_template_list[1]))
vpc_2_tier_1 = self.create_Network(
self.network_offering, gateway='10.1.2.1', vpc=vpc_2)
vpc_2_tier_2 = self.create_Network(
self.network_offering, gateway='10.1.3.1', vpc=vpc_2)
# VSD verification
self.verify_vsd_network(
self.account.domainid, vpc_2_tier_1, vpc_2,
domain_template_name=self.domain_template_list[1])
self.verify_vsd_network(
self.account.domainid, vpc_2_tier_2, vpc_2,
domain_template_name=self.domain_template_list[1])
# Creating VPC
vpc_3 = self.create_Vpc(self.vpc_offering, cidr='10.1.0.0/16')
# Associating pre-configured Nuage VSP Domain Template to VPC
self.validate_NuageVspDomainTemplate(self.domain_template_list[0])
self.associate_NuageVspDomainTemplate(
self.domain_template_list[0], vpc_3)
# Creating an ACL list and an ACL item
acl_list = self.create_NetworkAclList(
name="acl", description="acl", vpc=vpc_3)
self.create_NetworkAclRule(
self.test_data["ingress_rule"], acl_list=acl_list)
# Creating VPC networks (tiers)
with self.assertRaises(Exception):
self.create_Network(
self.network_offering,
gateway='10.1.1.1',
vpc=vpc_3,
acl_list=acl_list)
self.debug("Corresponding domain creation in VSD fails, but VPC "
"(tier) network gets created on CloudStack as creation of "
"Network ACLs from CloudStack is not supported when the "
"VPC is associated with a Nuage VSP pre-configured domain "
"template")
vpc_3_tier_1 = self.create_Network(
self.network_offering, gateway='10.1.2.1', vpc=vpc_3)
vpc_3_tier_2 = self.create_Network(
self.network_offering, gateway='10.1.3.1', vpc=vpc_3)
# VSD verification
self.verify_vsd_network(
self.account.domainid, vpc_3_tier_1, vpc_3,
domain_template_name=self.domain_template_list[0])
self.verify_vsd_network(
self.account.domainid, vpc_3_tier_2, vpc_3,
domain_template_name=self.domain_template_list[0])
# Creating VPC and VPC network (tier)
vpc = self.create_Vpc(self.vpc_offering, cidr='10.1.0.0/16')
vpc_tier = self.create_Network(self.network_offering, vpc=vpc)
# VSD verification
self.verify_vsd_network(self.account.domainid, vpc_tier, vpc)
# Associating pre-configured Nuage VSP Domain Template to VPC
self.validate_NuageVspDomainTemplate(self.domain_template_list[0])
with self.assertRaises(Exception):
self.associate_NuageVspDomainTemplate(
self.domain_template_list[0], vpc)
self.debug("Association fails as the corresponding domain and domain "
"templates are already created in VSD for the VPC vpc")
@attr(tags=["advanced", "nuagevsp"], required_hardware="false")
def test_02_nuage_Domain_Template_selection_per_VPC_as_ROOT_user(self):
"""Test Nuage VSP Domain Template selection per VPC as ROOT domain
regular user
"""
# Repeat the tests in the testcase
# "test_01_nuage_Domain_Template_selection_per_VPC" as ROOT domain
# regular user
# Setting ROOT domain user account information
self.account = self.account_roota
# Setting ROOT domain user keys in api_client
self.api_client.connection.apiKey = self.user_roota_apikey
self.api_client.connection.securityKey = self.user_roota_secretkey
# Calling testcase "test_01_nuage_Domain_Template_selection_per_VPC"
self.test_01_nuage_Domain_Template_selection_per_VPC()
@attr(tags=["advanced", "nuagevsp"], required_hardware="false")
def test_03_nuage_Domain_Template_selection_per_VPC_as_domain_admin(self):
"""Test Nuage VSP Domain Template selection per VPC as domain admin
user
"""
# Repeat the tests in the testcase
# "test_01_nuage_Domain_Template_selection_per_VPC" as domain admin
# user
# Setting domain D1 admin account information
self.account = self.account_d1
# Setting domain D1 admin keys in api_client
self.api_client.connection.apiKey = self.user_d1_apikey
self.api_client.connection.securityKey = self.user_d1_secretkey
# Calling testcase "test_01_nuage_Domain_Template_selection_per_VPC"
self.test_01_nuage_Domain_Template_selection_per_VPC()
@attr(tags=["advanced", "nuagevsp"], required_hardware="false")
def test_04_nuage_Domain_Template_selection_per_VPC_as_domain_user(self):
"""Test Nuage VSP Domain Template selection per VPC as domain
regular user
"""
# Repeat the tests in the testcase
# "test_01_nuage_Domain_Template_selection_per_VPC" as domain regular
# user
# Setting domain D1 user account information
self.account = self.account_d1a
# Setting domain D1 user keys in api_client
self.api_client.connection.apiKey = self.user_d1a_apikey
self.api_client.connection.securityKey = self.user_d1a_secretkey
# Calling testcase "test_01_nuage_Domain_Template_selection_per_VPC"
self.test_01_nuage_Domain_Template_selection_per_VPC()
@attr(tags=["advanced", "nuagevsp"], required_hardware="false")
def test_05_nuage_Domain_Template_selection_per_VPC_as_subdom_admin(self):
"""Test Nuage VSP Domain Template selection per VPC as subdomain admin
user
"""
# Repeat the tests in the testcase
# "test_01_nuage_Domain_Template_selection_per_VPC" as subdomain admin
# user
# Setting subdomain D11 admin account information
self.account = self.account_d11
# Setting subdomain D1 admin keys in api_client
self.api_client.connection.apiKey = self.user_d11_apikey
self.api_client.connection.securityKey = self.user_d11_secretkey
# Calling testcase "test_01_nuage_Domain_Template_selection_per_VPC"
self.test_01_nuage_Domain_Template_selection_per_VPC()
@attr(tags=["advanced", "nuagevsp"], required_hardware="false")
def test_06_nuage_Domain_Template_selection_per_VPC_as_subdom_user(self):
"""Test Nuage VSP Domain Template selection per VPC as subdomain
regular user
"""
# Repeat the tests in the testcase
# "test_01_nuage_Domain_Template_selection_per_VPC" as subdomain
# regular user
# Setting subdomain D11 user account information
self.account = self.account_d11a
# Setting subdomain D11 user keys in api_client
self.api_client.connection.apiKey = self.user_d11a_apikey
self.api_client.connection.securityKey = self.user_d11a_secretkey
# Calling testcase "test_01_nuage_Domain_Template_selection_per_VPC"
self.test_01_nuage_Domain_Template_selection_per_VPC()
@attr(tags=["advanced", "nuagevsp"], required_hardware="false")
def test_07_nuage_Global_Domain_Template(self):
"""Test Nuage VSP Global Domain Template
"""
# 1. Update the global setting "nuagevsp.vpc.domaintemplate.name" with
# an invalid/non-existing Nuage VSP domain template name; verify
# that a new VPC creation fails, and gets cleaned up.
# 2. Update the global setting "nuagevsp.vpc.domaintemplate.name" with
# a valid/existing pre-configured Nuage VSP domain template name;
# verify that all VPC networks (domains) get instantiated from that
# pre-configured Nuage VSP domain template.
# 3. Verify that multiple associations (update) of domain templates to
# such VPCs goes through till the creation of their first VPC
# networks (tiers).
# 4. Delete all the created objects (cleanup).
# Updating global setting "nuagevsp.vpc.domaintemplate.name"
self.update_NuageVspGlobalDomainTemplate(
value="invalid_domain_template")
domain_template = self.list_NuageVspGlobalDomainTemplate()[0].name
self.assertEqual(domain_template, "invalid_domain_template",
"Global setting nuagevsp.vpc.domaintemplate.name was "
"not updated successfully"
)
with self.assertRaises(Exception):
self.validate_NuageVspDomainTemplate("invalid_domain_template")
self.debug("There is no domain template with name "
"invalid_domain_template in VSD")
# Creating VPC
with self.assertRaises(Exception):
self.create_Vpc(self.vpc_offering, cidr='10.1.0.0/16')
self.debug("VPC creation fails as there is no domain template with "
"name invalid_domain_template in VSD as mentioned in "
"global setting nuagevsp.vpc.domaintemplate.name")
# Updating global setting "nuagevsp.vpc.domaintemplate.name"
self.update_NuageVspGlobalDomainTemplate(
value=self.domain_template_list[0])
domain_template = self.list_NuageVspGlobalDomainTemplate()[0].name
self.assertEqual(domain_template, self.domain_template_list[0],
"Global setting nuagevsp.vpc.domaintemplate.name was "
"not updated successfully"
)
self.validate_NuageVspDomainTemplate(self.domain_template_list[0])
# Creating VPC and VPC networks (tiers)
vpc_1 = self.create_Vpc(self.vpc_offering, cidr='10.1.0.0/16')
vpc_1_tier_1 = self.create_Network(
self.network_offering, gateway='10.1.1.1', vpc=vpc_1)
vpc_1_tier_2 = self.create_Network(
self.network_offering, gateway='10.1.2.1', vpc=vpc_1)
# VSD verification
self.verify_vsd_network(
self.account.domainid, vpc_1_tier_1, vpc_1,
domain_template_name=self.domain_template_list[0])
self.verify_vsd_network(
self.account.domainid, vpc_1_tier_2, vpc_1,
domain_template_name=self.domain_template_list[0])
# Creating VPC and VPC networks (tiers)
vpc_2 = self.create_Vpc(self.vpc_offering, cidr='10.1.0.0/16')
vpc_2_tier_1 = self.create_Network(
self.network_offering, gateway='10.1.1.1', vpc=vpc_2)
vpc_2_tier_2 = self.create_Network(
self.network_offering, gateway='10.1.2.1', vpc=vpc_2)
# VSD verification
self.verify_vsd_network(
self.account.domainid, vpc_2_tier_1, vpc_2,
domain_template_name=self.domain_template_list[0])
self.verify_vsd_network(
self.account.domainid, vpc_2_tier_2, vpc_2,
domain_template_name=self.domain_template_list[0])
# Creating VPC
vpc_3 = self.create_Vpc(self.vpc_offering, cidr='10.1.0.0/16')
# Associating pre-configured Nuage VSP Domain Template to VPC
self.validate_NuageVspDomainTemplate(self.domain_template_list[1])
self.associate_NuageVspDomainTemplate(
self.domain_template_list[1], vpc_3)
# Creating VPC networks (tiers)
vpc_3_tier_1 = self.create_Network(
self.network_offering, gateway='10.1.1.1', vpc=vpc_3)
vpc_3_tier_2 = self.create_Network(
self.network_offering, gateway='10.1.2.1', vpc=vpc_3)
# VSD verification
self.verify_vsd_network(
self.account.domainid, vpc_3_tier_1, vpc_3,
domain_template_name=self.domain_template_list[1])
self.verify_vsd_network(
self.account.domainid, vpc_3_tier_2, vpc_3,
domain_template_name=self.domain_template_list[1])
# Updating global setting "nuagevsp.vpc.domaintemplate.name"
self.update_NuageVspGlobalDomainTemplate(value="")
domain_template = self.list_NuageVspGlobalDomainTemplate()[0].name
self.assertEqual(domain_template, "",
"Global setting nuagevsp.vpc.domaintemplate.name was "
"not updated successfully"
)
@attr(tags=["advanced", "nuagevsp"], required_hardware="false")
def test_08_nuage_Global_Domain_Template_as_ROOT_user(self):
"""Test Nuage VSP Global Domain Template as ROOT domain regular user
"""
# Repeat the tests in the testcase
# "test_07_nuage_Global_Domain_Template" as ROOT domain regular user
# Setting ROOT domain user account information
self.account = self.account_roota
# Setting ROOT domain user keys in api_client
self.api_client.connection.apiKey = self.user_roota_apikey
self.api_client.connection.securityKey = self.user_roota_secretkey
# Calling testcase "test_07_nuage_Global_Domain_Template"
self.test_07_nuage_Global_Domain_Template()
@attr(tags=["advanced", "nuagevsp"], required_hardware="false")
def test_09_nuage_Global_Domain_Template_as_domain_admin(self):
"""Test Nuage VSP Global Domain Template as domain admin user
"""
# Repeat the tests in the testcase
# "test_07_nuage_Global_Domain_Template" as domain admin user
# Setting domain D1 admin account information
self.account = self.account_d1
# Setting domain D1 admin keys in api_client
self.api_client.connection.apiKey = self.user_d1_apikey
self.api_client.connection.securityKey = self.user_d1_secretkey
# Calling testcase "test_07_nuage_Global_Domain_Template"
self.test_07_nuage_Global_Domain_Template()
@attr(tags=["advanced", "nuagevsp"], required_hardware="false")
def test_10_nuage_Global_Domain_Template_as_domain_user(self):
"""Test Nuage VSP Global Domain Template as domain regular user
"""
# Repeat the tests in the testcase
# "test_07_nuage_Global_Domain_Template" as domain regular user
# Setting domain D1 user account information
self.account = self.account_d1a
# Setting domain D1 user keys in api_client
self.api_client.connection.apiKey = self.user_d1a_apikey
self.api_client.connection.securityKey = self.user_d1a_secretkey
# Calling testcase "test_07_nuage_Global_Domain_Template"
self.test_07_nuage_Global_Domain_Template()
@attr(tags=["advanced", "nuagevsp"], required_hardware="false")
def test_11_nuage_Global_Domain_Template_as_subdomain_admin(self):
"""Test Nuage VSP Global Domain Template as subdomain admin user
"""
# Repeat the tests in the testcase
# "test_07_nuage_Global_Domain_Template" as subdomain admin user
# Setting subdomain D11 admin account information
self.account = self.account_d11
# Setting subdomain D1 admin keys in api_client
self.api_client.connection.apiKey = self.user_d11_apikey
self.api_client.connection.securityKey = self.user_d11_secretkey
# Calling testcase "test_07_nuage_Global_Domain_Template"
self.test_07_nuage_Global_Domain_Template()
@attr(tags=["advanced", "nuagevsp"], required_hardware="false")
def test_12_nuage_Global_Domain_Template_as_subdomain_user(self):
"""Test Nuage VSP Global Domain Template as subdomain regular user
"""
# Repeat the tests in the testcase
# "test_07_nuage_Global_Domain_Template" as subdomain regular user
# Setting subdomain D11 user account information
self.account = self.account_d11a
# Setting subdomain D11 user keys in api_client
self.api_client.connection.apiKey = self.user_d11a_apikey
self.api_client.connection.securityKey = self.user_d11a_secretkey
# Calling testcase "test_07_nuage_Global_Domain_Template"
self.test_07_nuage_Global_Domain_Template()

View File

@ -87,6 +87,8 @@ known_categories = {
'OpenDaylight': 'Network', 'OpenDaylight': 'Network',
'createServiceInstance': 'Network', 'createServiceInstance': 'Network',
'addGloboDnsHost': 'Network', 'addGloboDnsHost': 'Network',
'listnuagevspdomaintemplates': 'Network',
'listnuagevspglobaldomaintemplate': 'Network',
'Vpn': 'VPN', 'Vpn': 'VPN',
'Limit': 'Limit', 'Limit': 'Limit',
'ResourceCount': 'Limit', 'ResourceCount': 'Limit',

View File

@ -1194,6 +1194,8 @@ var dictionary = {"ICMP.code":"ICMP Code",
"label.none":"None", "label.none":"None",
"label.not.found":"Not Found", "label.not.found":"Not Found",
"label.notifications":"Notifications", "label.notifications":"Notifications",
"label.nuage.vpc.usedomaintemplate":"Use pre-configured Domain Template",
"label.nuage.vpc.domaintemplatelist":"Domain Template",
"label.num.cpu.cores":"# of CPU Cores", "label.num.cpu.cores":"# of CPU Cores",
"label.number.of.clusters":"Number of Clusters", "label.number.of.clusters":"Number of Clusters",
"label.number.of.cpu.sockets":"The Number of CPU Sockets", "label.number.of.cpu.sockets":"The Number of CPU Sockets",

View File

@ -87,10 +87,10 @@
} else { //non-portable IP which has only one NIC } else { //non-portable IP which has only one NIC
/* /*
var nic = $.grep(instance.nic, function(nic) { var nic = $.grep(instance.nic, function(nic) {
return nic.networkid == network.id; return nic.networkid == network.id;
})[0]; })[0];
*/ */
// Get NIC IPs // Get NIC IPs
$.ajax({ $.ajax({
@ -171,10 +171,10 @@
} else { //non-portable IP which has only one NIC } else { //non-portable IP which has only one NIC
/* /*
var nic = $.grep(instance.nic, function(nic) { var nic = $.grep(instance.nic, function(nic) {
return nic.networkid == network.id; return nic.networkid == network.id;
})[0]; })[0];
*/ */
// Get NIC IPs // Get NIC IPs
$.ajax({ $.ajax({
@ -258,11 +258,11 @@
disallowedActions.push('remove'); disallowedActions.push('remove');
} else { //non-sourceNAT IP supports staticNAT } else { //non-sourceNAT IP supports staticNAT
disallowedActions.push('enableVPN'); disallowedActions.push('enableVPN');
if (ipObj.isstaticnat) { if (ipObj.isstaticnat) {
disallowedActions.push('enableStaticNAT'); disallowedActions.push('enableStaticNAT');
} else { } else {
disallowedActions.push('disableStaticNAT'); disallowedActions.push('disableStaticNAT');
} }
} }
//***** apply to both Isolated Guest Network IP, VPC IP (end) ***** //***** apply to both Isolated Guest Network IP, VPC IP (end) *****
@ -270,20 +270,20 @@
if (!('vpc' in args.context)) { //***** Guest Network section > Guest Network page > IP Address page ***** if (!('vpc' in args.context)) { //***** Guest Network section > Guest Network page > IP Address page *****
if (args.context.networks[0].networkofferingconservemode == false) { if (args.context.networks[0].networkofferingconservemode == false) {
/* /*
(1) If IP is SourceNat, no StaticNat/VPN/PortForwarding/LoadBalancer can be enabled/added. (1) If IP is SourceNat, no StaticNat/VPN/PortForwarding/LoadBalancer can be enabled/added.
*/ */
if (ipObj.issourcenat == true) { if (ipObj.issourcenat == true) {
disallowedActions.push('enableStaticNAT'); disallowedActions.push('enableStaticNAT');
disallowedActions.push('enableVPN'); disallowedActions.push('enableVPN');
} }
/* /*
(2) If IP is non-SourceNat, show StaticNat/VPN/PortForwarding/LoadBalancer at first. (2) If IP is non-SourceNat, show StaticNat/VPN/PortForwarding/LoadBalancer at first.
1. Once StaticNat is enabled, hide VPN/PortForwarding/LoadBalancer. 1. Once StaticNat is enabled, hide VPN/PortForwarding/LoadBalancer.
2. Once VPN is enabled, hide StaticNat/PortForwarding/LoadBalancer. 2. Once VPN is enabled, hide StaticNat/PortForwarding/LoadBalancer.
3. Once a PortForwarding rule is added, hide StaticNat/VPN/LoadBalancer. 3. Once a PortForwarding rule is added, hide StaticNat/VPN/LoadBalancer.
4. Once a LoadBalancer rule is added, hide StaticNat/VPN/PortForwarding. 4. Once a LoadBalancer rule is added, hide StaticNat/VPN/PortForwarding.
*/ */
else { //ipObj.issourcenat == false else { //ipObj.issourcenat == false
if (ipObj.isstaticnat) { //1. Once StaticNat is enabled, hide VPN/PortForwarding/LoadBalancer. if (ipObj.isstaticnat) { //1. Once StaticNat is enabled, hide VPN/PortForwarding/LoadBalancer.
disallowedActions.push('enableVPN'); disallowedActions.push('enableVPN');
@ -712,7 +712,7 @@
}); });
} else { } else {
args.response.success({ args.response.success({
data: null data: null
}); });
} }
} }
@ -1112,7 +1112,7 @@
confirm: function(args) { confirm: function(args) {
return 'message.action.delete.network'; return 'message.action.delete.network';
}, },
isWarning: true, isWarning: true,
notification: function(args) { notification: function(args) {
return 'label.action.delete.network'; return 'label.action.delete.network';
} }
@ -1656,7 +1656,7 @@
async: true, async: true,
success: function(json) { success: function(json) {
var response = json.listnetworkofferingsresponse.networkoffering ? var response = json.listnetworkofferingsresponse.networkoffering ?
json.listnetworkofferingsresponse.networkoffering[0] : null; json.listnetworkofferingsresponse.networkoffering[0] : null;
if (response != null) { if (response != null) {
if (response.egressdefaultpolicy == true) { if (response.egressdefaultpolicy == true) {
@ -2412,7 +2412,7 @@
args.response.success({ args.response.success({
data: $.grep( data: $.grep(
data.listvirtualmachinesresponse.virtualmachine ? data.listvirtualmachinesresponse.virtualmachine ?
data.listvirtualmachinesresponse.virtualmachine : [], data.listvirtualmachinesresponse.virtualmachine : [],
function(instance) { function(instance) {
return $.inArray(instance.state, [ return $.inArray(instance.state, [
'Destroyed', 'Expunging' 'Destroyed', 'Expunging'
@ -2698,7 +2698,7 @@
var network = $.grep( var network = $.grep(
args.context.vpc ? args.context.vpc ?
args.context.vpc[0].network : args.context.networks, args.context.vpc[0].network : args.context.networks,
function(network) { function(network) {
return network.id = ipObj.associatednetworkid; return network.id = ipObj.associatednetworkid;
})[0]; })[0];
@ -2777,8 +2777,8 @@
if (networkObj.networkofferingconservemode == false) { if (networkObj.networkofferingconservemode == false) {
/* /*
(1) If IP is SourceNat, no StaticNat/VPN/PortForwarding/LoadBalancer can be enabled/added. (1) If IP is SourceNat, no StaticNat/VPN/PortForwarding/LoadBalancer can be enabled/added.
*/ */
if (args.context.ipAddresses[0].issourcenat) { if (args.context.ipAddresses[0].issourcenat) {
if (havingFirewallService == false) { //firewall is not supported in IP from VPC section (because ACL has already supported in tier from VPC section) if (havingFirewallService == false) { //firewall is not supported in IP from VPC section (because ACL has already supported in tier from VPC section)
disallowedActions.push("firewall"); disallowedActions.push("firewall");
@ -2789,12 +2789,12 @@
} }
/* /*
(2) If IP is non-SourceNat, show StaticNat/VPN/PortForwarding/LoadBalancer at first. (2) If IP is non-SourceNat, show StaticNat/VPN/PortForwarding/LoadBalancer at first.
1. Once StaticNat is enabled, hide VPN/PortForwarding/LoadBalancer. 1. Once StaticNat is enabled, hide VPN/PortForwarding/LoadBalancer.
2. If VPN service is supported (i.e. IP comes from Guest Network section, not from VPC section), once VPN is enabled, hide StaticNat/PortForwarding/LoadBalancer. 2. If VPN service is supported (i.e. IP comes from Guest Network section, not from VPC section), once VPN is enabled, hide StaticNat/PortForwarding/LoadBalancer.
3. Once a PortForwarding rule is added, hide StaticNat/VPN/LoadBalancer. 3. Once a PortForwarding rule is added, hide StaticNat/VPN/LoadBalancer.
4. Once a LoadBalancer rule is added, hide StaticNat/VPN/PortForwarding. 4. Once a LoadBalancer rule is added, hide StaticNat/VPN/PortForwarding.
*/ */
else { //args.context.ipAddresses[0].issourcenat == false else { //args.context.ipAddresses[0].issourcenat == false
if (havingFirewallService == false) if (havingFirewallService == false)
disallowedActions.push("firewall"); disallowedActions.push("firewall");
@ -3136,7 +3136,7 @@
success: function(data) { success: function(data) {
var vmData = $.grep( var vmData = $.grep(
data.listvirtualmachinesresponse.virtualmachine ? data.listvirtualmachinesresponse.virtualmachine ?
data.listvirtualmachinesresponse.virtualmachine : [], data.listvirtualmachinesresponse.virtualmachine : [],
function(instance) { function(instance) {
//Hiding the autoScale VMs //Hiding the autoScale VMs
var nonAutoScale = 0; var nonAutoScale = 0;
@ -3271,18 +3271,18 @@
isEditable: true, isEditable: true,
select: function(args) { select: function(args) {
var data = [{ var data = [{
id: 'roundrobin', id: 'roundrobin',
name: 'roundrobin', name: 'roundrobin',
description: _l('label.lb.algorithm.roundrobin') description: _l('label.lb.algorithm.roundrobin')
}, { }, {
id: 'leastconn', id: 'leastconn',
name: 'leastconn', name: 'leastconn',
description: _l('label.lb.algorithm.leastconn') description: _l('label.lb.algorithm.leastconn')
}, { }, {
id: 'source', id: 'source',
name: 'source', name: 'source',
description: _l('label.lb.algorithm.source') description: _l('label.lb.algorithm.source')
}]; }];
if (typeof args.context != 'undefined') { if (typeof args.context != 'undefined') {
var lbAlgs = getLBAlgorithms(args.context.networks[0]); var lbAlgs = getLBAlgorithms(args.context.networks[0]);
data = (lbAlgs.length == 0) ? data : lbAlgs; data = (lbAlgs.length == 0) ? data : lbAlgs;
@ -3459,7 +3459,7 @@
var stickyData = $.extend(true, {}, args.data.sticky); var stickyData = $.extend(true, {}, args.data.sticky);
var certificateData = $.extend(true, {}, args.data.sslcertificate); var certificateData = $.extend(true, {}, args.data.sslcertificate);
//***** create new LB rule > Add VMs ***** //***** create new LB rule > Add VMs *****
$.ajax({ $.ajax({
url: createURL('createLoadBalancerRule'), url: createURL('createLoadBalancerRule'),
data: data, data: data,
@ -4027,7 +4027,7 @@
args.response.success({ args.response.success({
data: $.grep( data: $.grep(
data.listvirtualmachinesresponse.virtualmachine ? data.listvirtualmachinesresponse.virtualmachine ?
data.listvirtualmachinesresponse.virtualmachine : [], data.listvirtualmachinesresponse.virtualmachine : [],
function(instance) { function(instance) {
return $.inArray(instance.state, [ return $.inArray(instance.state, [
'Destroyed', 'Expunging' 'Destroyed', 'Expunging'
@ -4295,17 +4295,17 @@
return $('<div>') return $('<div>')
.append( .append(
$('<ul>').addClass('info') $('<ul>').addClass('info')
.append( .append(
// VPN IP // VPN IP
$('<li>').addClass('ip').html(_l('message.enabled.vpn') + ' ') $('<li>').addClass('ip').html(_l('message.enabled.vpn') + ' ')
.append($('<strong>').html(ipAddress)) .append($('<strong>').html(ipAddress))
) )
.append( .append(
// PSK // PSK
$('<li>').addClass('psk').html(_l('message.enabled.vpn.ip.sec') + ' ') $('<li>').addClass('psk').html(_l('message.enabled.vpn.ip.sec') + ' ')
.append($('<strong>').html(psk)) .append($('<strong>').html(psk))
) )
.append( .append(
//Note //Note
$('<li>').html(_l('message.enabled.vpn.note')) $('<li>').html(_l('message.enabled.vpn.note'))
@ -4667,7 +4667,7 @@
args.response.success({ args.response.success({
data: $.map( data: $.map(
data.listsecuritygroupsresponse.securitygroup[0].ingressrule ? data.listsecuritygroupsresponse.securitygroup[0].ingressrule ?
data.listsecuritygroupsresponse.securitygroup[0].ingressrule : [], data.listsecuritygroupsresponse.securitygroup[0].ingressrule : [],
ingressEgressDataMap ingressEgressDataMap
) )
}); });
@ -4877,7 +4877,7 @@
args.response.success({ args.response.success({
data: $.map( data: $.map(
data.listsecuritygroupsresponse.securitygroup[0].egressrule ? data.listsecuritygroupsresponse.securitygroup[0].egressrule ?
data.listsecuritygroupsresponse.securitygroup[0].egressrule : [], data.listsecuritygroupsresponse.securitygroup[0].egressrule : [],
ingressEgressDataMap ingressEgressDataMap
) )
}); });
@ -5069,7 +5069,7 @@
items, items,
function (vpc, i) { function (vpc, i) {
return vpc.regionlevelvpc; return vpc.regionlevelvpc;
}); });
args.response.success({ args.response.success({
data: items data: items
@ -5080,7 +5080,7 @@
message: parseXMLHttpResponse(XMLHttpResponse) message: parseXMLHttpResponse(XMLHttpResponse)
}); });
args.response.error(); args.response.error();
} }
}); });
}, },
actions: { actions: {
@ -5120,6 +5120,7 @@
required: true required: true
}, },
select: function(args) { select: function(args) {
var data = {}; var data = {};
$.ajax({ $.ajax({
url: createURL('listZones'), url: createURL('listZones'),
@ -5129,6 +5130,47 @@
var advZones = $.grep(zones, function(zone) { var advZones = $.grep(zones, function(zone) {
return zone.networktype == 'Advanced' && !zone.securitygroupsenabled; return zone.networktype == 'Advanced' && !zone.securitygroupsenabled;
}); });
//We need to be able to change the visibility of the NuageVspDT checkbox based on the selected zone (if the zone supports nuage)
var nuageDomainTemplateHandler = function(event, zoneid) {
zoneid = zoneid || this.value;
//check if the zone id is already in the cache or not otherwise do a lookup
var cache = args.context.domainTemplateMap;
if (!(cache && cache[zoneid])) {
$.ajax({
url: createURL('listNuageVspDomainTemplates'),
data: { zoneid: zoneid },
success: function(json) {
var domaintemplates = json.listnuagevspdomaintemplatesresponse.domaintemplates ? json.listnuagevspdomaintemplatesresponse.domaintemplates : [];
if (domaintemplates.length) {
args.$form.find("[rel=nuageusedomaintemplate]").show();
} else {
args.$form.find("[rel=nuageusedomaintemplate]").hide();
}
}
});
args.$form.find("[rel=nuageusedomaintemplate]").find("input").attr('checked', false);
} else if (cache[zoneid].length) {
if(args.context.globalDomainTemplateUsed[zoneid]){
args.$form.find("[rel=nuageusedomaintemplate]").show();
args.$form.find("[rel=nuagedomaintemplatelist]").show();
args.$form.find("[rel=nuageusedomaintemplate]").find("input").attr('checked', true);
} else {
args.$form.find("[rel=nuageusedomaintemplate]").find("input").attr('checked', false);
}
args.$form.find("[rel=nuageusedomaintemplate]").show();
} else {
args.$form.find("[rel=nuageusedomaintemplate]").hide();
args.$form.find("[rel=nuageusedomaintemplate]").find("input").attr('checked', false);
}
};
nuageDomainTemplateHandler(null, advZones[0].id);
args.$select.bind('click', nuageDomainTemplateHandler); //bind on both events click, change, change event of dropdown.
args.$select.bind('change', nuageDomainTemplateHandler);
args.$form.find("[rel=nuageusedomaintemplate]").find("input").attr('checked', false);
args.response.success({ args.response.success({
data: $.map(advZones, function(zone) { data: $.map(advZones, function(zone) {
return { return {
@ -5137,6 +5179,9 @@
}; };
}) })
}); });
},
error: function(errorMsg){
args.$form.find("[rel=nuageusedomaintemplate]").hide();
} }
}); });
} }
@ -5159,17 +5204,17 @@
validation: { validation: {
required: true required: true
}, },
dependsOn: "zoneid",
select: function(args) { select: function(args) {
var data = {}; var data = {};
$.ajax({ $.ajax({
url: createURL('listVPCOfferings'), url: createURL('listVPCOfferings'),
data: {}, data: {},
success: function(json) { success: function(json) {
var offerings = json.listvpcofferingsresponse.vpcoffering ? json.listvpcofferingsresponse.vpcoffering : []; var offerings = json.listvpcofferingsresponse.vpcoffering ? json.listvpcofferingsresponse.vpcoffering : [];
var filteredofferings = $.grep(offerings, function(offering) { var filteredofferings = $.grep(offerings, function(offering) {
return offering.state == 'Enabled'; return offering.state == 'Enabled';
}); });
args.response.success({ args.response.success({
data: $.map(filteredofferings, function(vpco) { data: $.map(filteredofferings, function(vpco) {
return { return {
@ -5181,44 +5226,169 @@
} }
}); });
} }
},
nuageusedomaintemplate: {
label: 'label.nuage.vpc.usedomaintemplate',
isBoolean: true,
isChecked: false,
isHidden: function(args){
var cache=args.context.domainTemplateMap;
return !(cache && cache[args.zoneid] && cache[args.zoneid].length);
}
},
nuagedomaintemplatelist: {
label: 'label.nuage.vpc.domaintemplatelist',
isHidden: true,
dependsOn: ["nuageusedomaintemplate","zoneid"],
select: function(args) {
if(!args.context.domainTemplateMap){//create array if it does not exist.
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();
}
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
};
})
});
}
});
}
});
//}
}
} }
} }
}, },
action: function(args) { action: function(args) {
var vpcOfferingName = args.data.vpcoffering var vpcOfferingName = args.data.vpcoffering;
var dataObj = { var dataObj = {
name: args.data.name, name: args.data.name,
displaytext: args.data.displaytext, displaytext: args.data.displaytext,
zoneid: args.data.zoneid, zoneid: args.data.zoneid,
cidr: args.data.cidr, cidr: args.data.cidr,
vpcofferingid: args.data.vpcoffering vpcofferingid: args.data.vpcoffering
}; };
if (args.data.networkdomain != null && args.data.networkdomain.length > 0) if (args.data.networkdomain != null && args.data.networkdomain.length > 0)
$.extend(dataObj, { $.extend(dataObj, {
networkdomain: args.data.networkdomain networkdomain: args.data.networkdomain
}); });
$.ajax({ $.ajax({
url: createURL("createVPC"), url: createURL("createVPC"),
dataType: "json", dataType: "json",
data: dataObj, data: dataObj,
async: true, async: true,
success: function(json) { success: function(vpcjson) {
var jid = json.createvpcresponse.jobid; var jid = vpcjson.createvpcresponse.jobid;
args.response.success({ if(args.data.nuageusedomaintemplate){
_custom: { //Nuagepre-configured DT is chosen
jobId: jid, var dataObj = {
getUpdatedItem: function(json) { domaintemplate: args.data.nuagedomaintemplatelist,
return json.queryasyncjobresultresponse.jobresult.vpc; vpcid: vpcjson.createvpcresponse.id,
zoneid: args.data.zoneid
};
$.ajax({
url: createURL("associateNuageVspDomainTemplate"),
dataType: "json",
data: dataObj,
async: true,
success: function(json) {
args.response.success({
_custom: {
jobId: jid,
getUpdatedItem: function(json) {
return json.queryasyncjobresultresponse.jobresult.vpc;
}
} }
});
},
error: function(errordata) {
$.ajax({
url: createURL("deleteVPC"),
data: {
id: vpcjson.createvpcresponse.id
},
success: function(json) {
},
error: function(data) {
args.response.error(parseXMLHttpResponse(data));
}
});
args.response.error(parseXMLHttpResponse(errordata) + ". Rollback of VPC initiated.");
}
});
} else {
args.response.success({
_custom: {
jobId: jid,
getUpdatedItem: function(json) {
return json.queryasyncjobresultresponse.jobresult.vpc;
} }
}); }
}, });
error: function(data) { }
args.response.error(parseXMLHttpResponse(data));
}
}); },
error: function(data) {
args.response.error(parseXMLHttpResponse(data));
}
});
}, },
notification: { notification: {
@ -5288,45 +5458,45 @@
title: 'label.restart.vpc', title: 'label.restart.vpc',
desc: function(args) { desc: function(args) {
if (Boolean(args.context.vpc[0].redundantvpcrouter)) { if (Boolean(args.context.vpc[0].redundantvpcrouter)) {
return 'message.restart.vpc'; return 'message.restart.vpc';
} else { } else {
return 'message.restart.vpc.remark'; return 'message.restart.vpc.remark';
} }
}, },
preFilter: function(args) { preFilter: function(args) {
var zoneObj; var zoneObj;
$.ajax({ $.ajax({
url: createURL("listZones&id=" + args.context.vpc[0].zoneid), url: createURL("listZones&id=" + args.context.vpc[0].zoneid),
dataType: "json", dataType: "json",
async: false, async: false,
success: function(json) { success: function(json) {
zoneObj = json.listzonesresponse.zone[0]; zoneObj = json.listzonesresponse.zone[0];
} }
}); });
args.$form.find('.form-item[rel=cleanup]').find('input').attr('checked', 'checked'); //checked args.$form.find('.form-item[rel=cleanup]').find('input').attr('checked', 'checked'); //checked
args.$form.find('.form-item[rel=cleanup]').css('display', 'inline-block'); //shown args.$form.find('.form-item[rel=cleanup]').css('display', 'inline-block'); //shown
args.$form.find('.form-item[rel=makeredundant]').find('input').attr('checked', 'checked'); //checked args.$form.find('.form-item[rel=makeredundant]').find('input').attr('checked', 'checked'); //checked
args.$form.find('.form-item[rel=makeredundant]').css('display', 'inline-block'); //shown args.$form.find('.form-item[rel=makeredundant]').css('display', 'inline-block'); //shown
if (Boolean(args.context.vpc[0].redundantvpcrouter)) { if (Boolean(args.context.vpc[0].redundantvpcrouter)) {
args.$form.find('.form-item[rel=makeredundant]').hide(); args.$form.find('.form-item[rel=makeredundant]').hide();
} else { } else {
args.$form.find('.form-item[rel=makeredundant]').show(); args.$form.find('.form-item[rel=makeredundant]').show();
} }
}, },
fields: { fields: {
cleanup: { cleanup: {
label: 'label.clean.up', label: 'label.clean.up',
isBoolean: true isBoolean: true
}, },
makeredundant: { makeredundant: {
label: 'label.make.redundant', label: 'label.make.redundant',
isBoolean: true isBoolean: true
} }
} }
}, },
messages: { messages: {
confirm: function(args) { confirm: function(args) {

View File

@ -271,6 +271,18 @@
$dependsOn.attr('checked', true); $dependsOn.attr('checked', true);
} }
} }
} else if (typeof(field.isHidden) == 'function') {
//If a checkbox depends on a field. Call the isHidden function of the checkbox.
$dependsOn.bind('change', function(event) {
var $target = $(this);
var $dependent = $target.closest('form').find('[depends-on=\'' + dependsOn + '\']');
$dependsOn.attr('checked', isChecked);
if (field.isHidden(args)) {
$dependent.hide();
} else {
$dependent.show();
}
});
} }
} }