mirror of
https://github.com/apache/cloudstack.git
synced 2025-10-26 08:42:29 +01:00
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:
commit
3eafd0ce52
@ -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;
|
||||||
|
|||||||
@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -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();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@ -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
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -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";
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -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) {
|
||||||
|
|||||||
@ -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);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -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);
|
||||||
|
|||||||
@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -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())) {
|
||||||
|
|||||||
@ -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);
|
||||||
|
|||||||
@ -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")
|
||||||
|
|||||||
@ -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);
|
||||||
|
|||||||
@ -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);
|
||||||
|
|||||||
@ -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
36
pom.xml
@ -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>
|
||||||
|
|||||||
@ -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 "
|
||||||
|
|||||||
@ -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()
|
||||||
@ -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',
|
||||||
|
|||||||
@ -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",
|
||||||
|
|||||||
@ -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) {
|
||||||
|
|||||||
@ -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();
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user