Use NSX specific RestClient in API implementation (NiciraNvpApi)

- Simplify public API to return Lists instead of NiciraNvpLists
This commit is contained in:
Miguel Ferreira 2015-08-22 17:30:58 +02:00
parent c6602ee151
commit 09f7153378
12 changed files with 542 additions and 620 deletions

View File

@ -0,0 +1,42 @@
//
// 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.nicira;
public class NiciraConstants {
public static final String SEC_PROFILE_URI_PREFIX = "/ws.v1/security-profile";
public static final String ACL_URI_PREFIX = "/ws.v1/acl";
public static final String SWITCH_URI_PREFIX = "/ws.v1/lswitch";
public static final String ROUTER_URI_PREFIX = "/ws.v1/lrouter";
public static final String LOGIN_URL = "/ws.v1/login";
public static final String CONTROL_CLUSTER_STATUS_URL = "/ws.v1/control-cluster/status";
public static final String ATTACHMENT_PATH_SEGMENT = "/attachment";
public static final String NAT_PATH_SEGMENT = "/nat";
public static final String LPORT_PATH_SEGMENT = "/lport";
public static final String ATTACHMENT_VIF_UUID_QUERY_PARAMETER_NAME = "attachment_vif_uuid";
public static final String ATTACHMENT_VLAN_PARAMETER = "attachment_vlan";
public static final String ATTACHMENT_GWSVC_UUID_QUERY_PARAMETER = "attachment_gwsvc_uuid";
public static final String WILDCARD_QUERY_PARAMETER = "*";
public static final String UUID_QUERY_PARAMETER = "uuid";
public static final String FIELDS_QUERY_PARAMETER = "fields";
}

View File

@ -20,32 +20,39 @@
package com.cloud.network.nicira; package com.cloud.network.nicira;
import java.lang.reflect.Type; import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.Collections; import java.util.Collections;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.UUID; import java.util.UUID;
import org.apache.http.client.protocol.HttpClientContext;
import org.apache.http.impl.client.CloseableHttpClient;
import com.cloud.utils.rest.CloudstackRESTException; import com.cloud.utils.rest.CloudstackRESTException;
import com.cloud.utils.rest.RESTServiceConnector; import com.cloud.utils.rest.RESTServiceConnector;
import com.cloud.utils.rest.RESTValidationStrategy; import com.google.common.base.Optional;
import com.google.gson.JsonDeserializationContext;
import com.google.gson.JsonDeserializer; import com.google.gson.JsonDeserializer;
import com.google.gson.reflect.TypeToken; import com.google.gson.reflect.TypeToken;
@SuppressWarnings("rawtypes") @SuppressWarnings("rawtypes")
public class NiciraNvpApi { public class NiciraNvpApi {
protected static final String GET_METHOD_TYPE = "get";
protected static final String DELETE_METHOD_TYPE = "delete";
protected static final String PUT_METHOD_TYPE = "put";
protected static final String POST_METHOD_TYPE = "post";
protected static final String SEC_PROFILE_URI_PREFIX = "/ws.v1/security-profile"; private static final Optional<String> ABSENT = Optional.absent();
protected static final String ACL_URI_PREFIX = "/ws.v1/acl";
private static final String SWITCH_URI_PREFIX = "/ws.v1/lswitch"; private static final String SWITCH_URI_PREFIX = NiciraConstants.SWITCH_URI_PREFIX;
private static final String ROUTER_URI_PREFIX = "/ws.v1/lrouter"; private static final String ROUTER_URI_PREFIX = NiciraConstants.ROUTER_URI_PREFIX;
private static final String LOGIN_URL = "/ws.v1/login";
private static final String ATTACHMENT_PATH_SEGMENT = NiciraConstants.ATTACHMENT_PATH_SEGMENT;
private static final String NAT_PATH_SEGMENT = NiciraConstants.NAT_PATH_SEGMENT;
private static final String LPORT_PATH_SEGMENT = NiciraConstants.LPORT_PATH_SEGMENT;
private static final String ATTACHMENT_GWSVC_UUID_QUERY_PARAMETER = NiciraConstants.ATTACHMENT_GWSVC_UUID_QUERY_PARAMETER;
private static final String WILDCARD_QUERY_PARAMETER = NiciraConstants.WILDCARD_QUERY_PARAMETER;
private static final String UUID_QUERY_PARAMETER = NiciraConstants.UUID_QUERY_PARAMETER;
private static final String FIELDS_QUERY_PARAMETER = NiciraConstants.FIELDS_QUERY_PARAMETER;
private static final int DEFAULT_MAX_RETRIES = 5;
private final RESTServiceConnector restConnector; private final RESTServiceConnector restConnector;
@ -57,8 +64,8 @@ public class NiciraNvpApi {
static { static {
prefixMap = new HashMap<Class, String>(); prefixMap = new HashMap<Class, String>();
prefixMap.put(SecurityProfile.class, SEC_PROFILE_URI_PREFIX); prefixMap.put(SecurityProfile.class, NiciraConstants.SEC_PROFILE_URI_PREFIX);
prefixMap.put(Acl.class, ACL_URI_PREFIX); prefixMap.put(Acl.class, NiciraConstants.ACL_URI_PREFIX);
prefixMap.put(LogicalSwitch.class, SWITCH_URI_PREFIX); prefixMap.put(LogicalSwitch.class, SWITCH_URI_PREFIX);
prefixMap.put(LogicalRouter.class, ROUTER_URI_PREFIX); prefixMap.put(LogicalRouter.class, ROUTER_URI_PREFIX);
@ -73,32 +80,31 @@ public class NiciraNvpApi {
}.getType()); }.getType());
defaultListParams = new HashMap<String, String>(); defaultListParams = new HashMap<String, String>();
defaultListParams.put("fields", "*"); defaultListParams.put(FIELDS_QUERY_PARAMETER, WILDCARD_QUERY_PARAMETER);
} }
public NiciraNvpApi() { private NiciraNvpApi(final Builder builder) {
final List<Class<?>> classList = new ArrayList<Class<?>>(); final Map<Class<?>, JsonDeserializer<?>> classToDeserializerMap = new HashMap<>();
classList.add(NatRule.class); classToDeserializerMap.put(NatRule.class, new NatRuleAdapter());
classList.add(RoutingConfig.class); classToDeserializerMap.put(RoutingConfig.class, new RoutingConfigAdapter());
final List<JsonDeserializer<?>> deserializerList = new ArrayList<JsonDeserializer<?>>();
deserializerList.add(new NatRuleAdapter());
deserializerList.add(new RoutingConfigAdapter());
restConnector = new RESTServiceConnector(new RESTValidationStrategy(LOGIN_URL), classList, deserializerList); final NiciraRestClient niciraRestClient = NiciraRestClient.create()
.client(builder.httpClient)
.clientContext(builder.httpClientContext)
.hostname(builder.host)
.username(builder.username)
.password(builder.password)
.loginUrl(NiciraConstants.LOGIN_URL)
.executionLimit(DEFAULT_MAX_RETRIES)
.build();
restConnector = RESTServiceConnector.create()
.classToDeserializerMap(classToDeserializerMap)
.client(niciraRestClient)
.build();
} }
public NiciraNvpApi(final String address, final String username, final String password) { public static Builder create() {
this(); return new Builder();
restConnector.setControllerAddress(address);
restConnector.setAdminCredentials(username, password);
}
public void setControllerAddress(final String address) {
restConnector.setControllerAddress(address);
}
public void setAdminCredentials(final String username, final String password) {
restConnector.setAdminCredentials(username, password);
} }
/** /**
@ -123,8 +129,7 @@ public class NiciraNvpApi {
private <T> T createWithUri(final T entity, final String uri) throws NiciraNvpApiException { private <T> T createWithUri(final T entity, final String uri) throws NiciraNvpApiException {
T createdEntity; T createdEntity;
try { try {
createdEntity = restConnector.executeCreateObject(entity, new TypeToken<T>() { createdEntity = restConnector.executeCreateObject(entity, uri, Collections.<String, String> emptyMap());
}.getType(), uri, Collections.<String, String> emptyMap());
} catch (final CloudstackRESTException e) { } catch (final CloudstackRESTException e) {
throw new NiciraNvpApiException(e); throw new NiciraNvpApiException(e);
} }
@ -145,7 +150,7 @@ public class NiciraNvpApi {
Map<String, String> params = defaultListParams; Map<String, String> params = defaultListParams;
if (uuid.isPresent()) { if (uuid.isPresent()) {
params = new HashMap<String, String>(defaultListParams); params = new HashMap<String, String>(defaultListParams);
params.put("uuid", uuid); params.put(UUID_QUERY_PARAMETER, uuid.get());
} }
NiciraNvpList<T> entities; NiciraNvpList<T> entities;
@ -159,7 +164,7 @@ public class NiciraNvpApi {
throw new NiciraNvpApiException("Unexpected response from API"); throw new NiciraNvpApiException("Unexpected response from API");
} }
return entities; return entities.getResults();
} }
/** /**
@ -231,8 +236,8 @@ public class NiciraNvpApi {
* @return * @return
* @throws NiciraNvpApiException * @throws NiciraNvpApiException
*/ */
public NiciraNvpList<SecurityProfile> findSecurityProfile() throws NiciraNvpApiException { public List<SecurityProfile> findSecurityProfile() throws NiciraNvpApiException {
return findSecurityProfile(null); return find(ABSENT, SecurityProfile.class);
} }
/** /**
@ -244,8 +249,8 @@ public class NiciraNvpApi {
* @return * @return
* @throws NiciraNvpApiException * @throws NiciraNvpApiException
*/ */
public NiciraNvpList<SecurityProfile> findSecurityProfile(final String uuid) throws NiciraNvpApiException { public List<SecurityProfile> findSecurityProfile(final String uuid) throws NiciraNvpApiException {
return find(uuid, SecurityProfile.class); return find(Optional.fromNullable(uuid), SecurityProfile.class);
} }
/** /**
@ -286,7 +291,7 @@ public class NiciraNvpApi {
* @return * @return
* @throws NiciraNvpApiException * @throws NiciraNvpApiException
*/ */
public NiciraNvpList<Acl> findAcl() throws NiciraNvpApiException { public List<Acl> findAcl() throws NiciraNvpApiException {
return findAcl(null); return findAcl(null);
} }
@ -297,8 +302,8 @@ public class NiciraNvpApi {
* @return * @return
* @throws NiciraNvpApiException * @throws NiciraNvpApiException
*/ */
public NiciraNvpList<Acl> findAcl(final String uuid) throws NiciraNvpApiException { public List<Acl> findAcl(final String uuid) throws NiciraNvpApiException {
return find(uuid, Acl.class); return find(Optional.fromNullable(uuid), Acl.class);
} }
/** /**
@ -332,7 +337,7 @@ public class NiciraNvpApi {
* @return * @return
* @throws NiciraNvpApiException * @throws NiciraNvpApiException
*/ */
public NiciraNvpList<LogicalSwitch> findLogicalSwitch() throws NiciraNvpApiException { public List<LogicalSwitch> findLogicalSwitch() throws NiciraNvpApiException {
return findLogicalSwitch(null); return findLogicalSwitch(null);
} }
@ -343,8 +348,8 @@ public class NiciraNvpApi {
* @return * @return
* @throws NiciraNvpApiException * @throws NiciraNvpApiException
*/ */
public NiciraNvpList<LogicalSwitch> findLogicalSwitch(final String uuid) throws NiciraNvpApiException { public List<LogicalSwitch> findLogicalSwitch(final String uuid) throws NiciraNvpApiException {
return find(uuid, LogicalSwitch.class); return find(Optional.fromNullable(uuid), LogicalSwitch.class);
} }
/** /**
@ -363,100 +368,81 @@ public class NiciraNvpApi {
} }
public LogicalSwitchPort createLogicalSwitchPort(final String logicalSwitchUuid, final LogicalSwitchPort logicalSwitchPort) throws NiciraNvpApiException { public LogicalSwitchPort createLogicalSwitchPort(final String logicalSwitchUuid, final LogicalSwitchPort logicalSwitchPort) throws NiciraNvpApiException {
final String uri = SWITCH_URI_PREFIX + "/" + logicalSwitchUuid + "/lport"; return createWithUri(logicalSwitchPort, buildLogicalSwitchElementUri(logicalSwitchUuid, LPORT_PATH_SEGMENT));
return createWithUri(logicalSwitchPort, uri);
} }
public void updateLogicalSwitchPort(final String logicalSwitchUuid, final LogicalSwitchPort logicalSwitchPort) throws NiciraNvpApiException { public void updateLogicalSwitchPort(final String logicalSwitchUuid, final LogicalSwitchPort logicalSwitchPort) throws NiciraNvpApiException {
final String uri = SWITCH_URI_PREFIX + "/" + logicalSwitchUuid + "/lport/" + logicalSwitchPort.getUuid(); updateWithUri(logicalSwitchPort, buildLogicalSwitchElementUri(logicalSwitchUuid, LPORT_PATH_SEGMENT, logicalSwitchPort.getUuid().toString()));
updateWithUri(logicalSwitchPort, uri);
} }
public void updateLogicalSwitchPortAttachment(final String logicalSwitchUuid, final String logicalSwitchPortUuid, final Attachment attachment) throws NiciraNvpApiException { public void updateLogicalSwitchPortAttachment(final String logicalSwitchUuid, final String logicalSwitchPortUuid, final Attachment attachment) throws NiciraNvpApiException {
final String uri = SWITCH_URI_PREFIX + "/" + logicalSwitchUuid + "/lport/" + logicalSwitchPortUuid + "/attachment"; updateWithUri(attachment, buildLogicalSwitchElementUri(logicalSwitchUuid, LPORT_PATH_SEGMENT, logicalSwitchPortUuid) + ATTACHMENT_PATH_SEGMENT);
updateWithUri(attachment, uri);
} }
public void deleteLogicalSwitchPort(final String logicalSwitchUuid, final String logicalSwitchPortUuid) throws NiciraNvpApiException { public void deleteLogicalSwitchPort(final String logicalSwitchUuid, final String logicalSwitchPortUuid) throws NiciraNvpApiException {
final String uri = SWITCH_URI_PREFIX + "/" + logicalSwitchUuid + "/lport/" + logicalSwitchPortUuid; deleteWithUri(buildLogicalSwitchElementUri(logicalSwitchUuid, LPORT_PATH_SEGMENT, logicalSwitchPortUuid));
deleteWithUri(uri);
} }
public String findLogicalSwitchPortUuidByVifAttachmentUuid(final String logicalSwitchUuid, final String vifAttachmentUuid) throws NiciraNvpApiException { public String findLogicalSwitchPortUuidByVifAttachmentUuid(final String logicalSwitchUuid, final String vifAttachmentUuid) throws NiciraNvpApiException {
final String uri = SWITCH_URI_PREFIX + "/" + logicalSwitchUuid + "/lport"; final String uri = buildLogicalSwitchElementUri(logicalSwitchUuid, LPORT_PATH_SEGMENT);
final Map<String, String> params = new HashMap<String, String>(); final Map<String, String> params = buildBasicParametersMap(UUID_QUERY_PARAMETER);
params.put("attachment_vif_uuid", vifAttachmentUuid); params.put(NiciraConstants.ATTACHMENT_VIF_UUID_QUERY_PARAMETER_NAME, vifAttachmentUuid);
params.put("fields", "uuid");
NiciraNvpList<LogicalSwitchPort> lspl; NiciraNvpList<LogicalSwitchPort> niciraList;
try { try {
lspl = restConnector.executeRetrieveObject(new TypeToken<NiciraNvpList<LogicalSwitchPort>>() { final Type niciraListType = new TypeToken<NiciraNvpList<LogicalSwitchPort>>() {
}.getType(), uri, params); }.getType();
niciraList = restConnector.executeRetrieveObject(niciraListType, uri, params);
} catch (final CloudstackRESTException e) { } catch (final CloudstackRESTException e) {
throw new NiciraNvpApiException(e); throw new NiciraNvpApiException(e);
} }
if (lspl == null || lspl.getResultCount() != 1) { final List<LogicalSwitchPort> lspl = niciraList.getResults();
throw new NiciraNvpApiException("Unexpected response from API");
final int listSize = lspl.size();
if (listSize != 1) {
throw new NiciraNvpApiException("Expected 1 LogicalSwitchPort, but got " + listSize);
} }
final LogicalSwitchPort lsp = lspl.getResults().get(0); final LogicalSwitchPort lsp = lspl.get(0);
return lsp.getUuid(); return lsp.getUuid();
} }
public ControlClusterStatus getControlClusterStatus() throws NiciraNvpApiException { public ControlClusterStatus getControlClusterStatus() throws NiciraNvpApiException {
final String uri = "/ws.v1/control-cluster/status"; final String uri = NiciraConstants.CONTROL_CLUSTER_STATUS_URL;
ControlClusterStatus ccs;
try { try {
ccs = restConnector.executeRetrieveObject(new TypeToken<ControlClusterStatus>() { return restConnector.executeRetrieveObject(ControlClusterStatus.class, uri, new HashMap<String, String>());
}.getType(), uri, null);
} catch (final CloudstackRESTException e) { } catch (final CloudstackRESTException e) {
throw new NiciraNvpApiException(e); throw new NiciraNvpApiException(e);
} }
return ccs;
} }
public NiciraNvpList<LogicalSwitchPort> findLogicalSwitchPortsByUuid(final String logicalSwitchUuid, final String logicalSwitchPortUuid) throws NiciraNvpApiException { public List<LogicalSwitchPort> findLogicalSwitchPortsByUuid(final String logicalSwitchUuid, final String logicalSwitchPortUuid) throws NiciraNvpApiException {
final String uri = SWITCH_URI_PREFIX + "/" + logicalSwitchUuid + "/lport"; final String uri = buildLogicalSwitchElementUri(logicalSwitchUuid, LPORT_PATH_SEGMENT);
final Map<String, String> params = new HashMap<String, String>(); final Map<String, String> params = buildBasicParametersMap(UUID_QUERY_PARAMETER);
params.put("uuid", logicalSwitchPortUuid); params.put(UUID_QUERY_PARAMETER, logicalSwitchPortUuid);
params.put("fields", "uuid");
NiciraNvpList<LogicalSwitchPort> lspl;
try { try {
lspl = restConnector.executeRetrieveObject(new TypeToken<NiciraNvpList<LogicalSwitchPort>>() { final Type niciraListType = new TypeToken<NiciraNvpList<LogicalSwitchPort>>() {
}.getType(), uri, params); }.getType();
return restConnector.<NiciraNvpList<LogicalSwitchPort>> executeRetrieveObject(niciraListType, uri, params).getResults();
} catch (final CloudstackRESTException e) { } catch (final CloudstackRESTException e) {
throw new NiciraNvpApiException(e); throw new NiciraNvpApiException(e);
} }
if (lspl == null) {
throw new NiciraNvpApiException("Unexpected response from API");
}
return lspl;
} }
public NiciraNvpList<LogicalRouterPort> findLogicalRouterPortsByUuid(final String logicalRouterUuid, final String logicalRouterPortUuid) throws NiciraNvpApiException { public List<LogicalRouterPort> findLogicalRouterPortsByUuid(final String logicalRouterUuid, final String logicalRouterPortUuid) throws NiciraNvpApiException {
final String uri = ROUTER_URI_PREFIX + "/" + logicalRouterUuid + "/lport"; final String uri = buildLogicalRouterElementUri(logicalRouterUuid, LPORT_PATH_SEGMENT);
final Map<String, String> params = new HashMap<String, String>(); final Map<String, String> params = buildBasicParametersMap(UUID_QUERY_PARAMETER);
params.put("uuid", logicalRouterPortUuid); params.put(UUID_QUERY_PARAMETER, logicalRouterPortUuid);
params.put("fields", "uuid");
NiciraNvpList<LogicalRouterPort> lrpl;
try { try {
lrpl = restConnector.executeRetrieveObject(new TypeToken<NiciraNvpList<LogicalRouterPort>>() { final Type niciraListType = new TypeToken<NiciraNvpList<LogicalRouterPort>>() {
}.getType(), uri, params); }.getType();
return restConnector.<NiciraNvpList<LogicalRouterPort>> executeRetrieveObject(niciraListType, uri, params).getResults();
} catch (final CloudstackRESTException e) { } catch (final CloudstackRESTException e) {
throw new NiciraNvpApiException(e); throw new NiciraNvpApiException(e);
} }
if (lrpl == null) {
throw new NiciraNvpApiException("Unexpected response from API");
}
return lrpl;
} }
public LogicalRouter createLogicalRouter(final LogicalRouter logicalRouter) throws NiciraNvpApiException { public LogicalRouter createLogicalRouter(final LogicalRouter logicalRouter) throws NiciraNvpApiException {
@ -469,7 +455,7 @@ public class NiciraNvpApi {
* @return * @return
* @throws NiciraNvpApiException * @throws NiciraNvpApiException
*/ */
public NiciraNvpList<LogicalRouter> findLogicalRouter() throws NiciraNvpApiException { public List<LogicalRouter> findLogicalRouter() throws NiciraNvpApiException {
return findLogicalRouter(null); return findLogicalRouter(null);
} }
@ -480,12 +466,12 @@ public class NiciraNvpApi {
* @return * @return
* @throws NiciraNvpApiException * @throws NiciraNvpApiException
*/ */
public NiciraNvpList<LogicalRouter> findLogicalRouter(final String uuid) throws NiciraNvpApiException { public List<LogicalRouter> findLogicalRouter(final String uuid) throws NiciraNvpApiException {
return find(uuid, LogicalRouter.class); return find(Optional.fromNullable(uuid), LogicalRouter.class);
} }
public LogicalRouter findOneLogicalRouterByUuid(final String logicalRouterUuid) throws NiciraNvpApiException { public LogicalRouter findOneLogicalRouterByUuid(final String logicalRouterUuid) throws NiciraNvpApiException {
return findLogicalRouter(logicalRouterUuid).getResults().get(0); return findLogicalRouter(logicalRouterUuid).get(0);
} }
public void updateLogicalRouter(final LogicalRouter logicalRouter, final String logicalRouterUuid) throws NiciraNvpApiException { public void updateLogicalRouter(final LogicalRouter logicalRouter, final String logicalRouterUuid) throws NiciraNvpApiException {
@ -493,100 +479,149 @@ public class NiciraNvpApi {
} }
public void deleteLogicalRouter(final String logicalRouterUuid) throws NiciraNvpApiException { public void deleteLogicalRouter(final String logicalRouterUuid) throws NiciraNvpApiException {
final String uri = ROUTER_URI_PREFIX + "/" + logicalRouterUuid; deleteWithUri(buildLogicalRouterUri(logicalRouterUuid));
deleteWithUri(uri);
} }
public LogicalRouterPort createLogicalRouterPort(final String logicalRouterUuid, final LogicalRouterPort logicalRouterPort) throws NiciraNvpApiException { public LogicalRouterPort createLogicalRouterPort(final String logicalRouterUuid, final LogicalRouterPort logicalRouterPort) throws NiciraNvpApiException {
final String uri = ROUTER_URI_PREFIX + "/" + logicalRouterUuid + "/lport"; return createWithUri(logicalRouterPort, buildLogicalRouterElementUri(logicalRouterUuid, LPORT_PATH_SEGMENT));
return createWithUri(logicalRouterPort, uri);
} }
public void deleteLogicalRouterPort(final String logicalRouterUuid, final String logicalRouterPortUuid) throws NiciraNvpApiException { public void deleteLogicalRouterPort(final String logicalRouterUuid, final String logicalRouterPortUuid) throws NiciraNvpApiException {
final String uri = ROUTER_URI_PREFIX + "/" + logicalRouterUuid + "/lport/" + logicalRouterPortUuid; deleteWithUri(buildLogicalRouterElementUri(logicalRouterUuid, LPORT_PATH_SEGMENT, logicalRouterPortUuid));
deleteWithUri(uri);
} }
public void updateLogicalRouterPort(final String logicalRouterUuid, final LogicalRouterPort logicalRouterPort) throws NiciraNvpApiException { public void updateLogicalRouterPort(final String logicalRouterUuid, final LogicalRouterPort logicalRouterPort) throws NiciraNvpApiException {
final String uri = ROUTER_URI_PREFIX + "/" + logicalRouterUuid + "/lport/" + logicalRouterPort.getUuid(); updateWithUri(logicalRouterPort, buildLogicalRouterElementUri(logicalRouterUuid, LPORT_PATH_SEGMENT, logicalRouterPort.getUuid().toString()));
updateWithUri(logicalRouterPort, uri);
} }
public void updateLogicalRouterPortAttachment(final String logicalRouterUuid, final String logicalRouterPortUuid, final Attachment attachment) throws NiciraNvpApiException { public void updateLogicalRouterPortAttachment(final String logicalRouterUuid, final String logicalRouterPortUuid, final Attachment attachment) throws NiciraNvpApiException {
final String uri = ROUTER_URI_PREFIX + "/" + logicalRouterUuid + "/lport/" + logicalRouterPortUuid + "/attachment"; updateWithUri(attachment, buildLogicalRouterElementUri(logicalRouterUuid, LPORT_PATH_SEGMENT, logicalRouterPortUuid) + ATTACHMENT_PATH_SEGMENT);
updateWithUri(attachment, uri);
} }
public NatRule createLogicalRouterNatRule(final String logicalRouterUuid, final NatRule natRule) throws NiciraNvpApiException { public NatRule createLogicalRouterNatRule(final String logicalRouterUuid, final NatRule natRule) throws NiciraNvpApiException {
final String uri = ROUTER_URI_PREFIX + "/" + logicalRouterUuid + "/nat"; return createWithUri(natRule, buildLogicalRouterElementUri(logicalRouterUuid, NAT_PATH_SEGMENT));
return createWithUri(natRule, uri);
} }
public void updateLogicalRouterNatRule(final String logicalRouterUuid, final NatRule natRule) throws NiciraNvpApiException { public void updateLogicalRouterNatRule(final String logicalRouterUuid, final NatRule natRule) throws NiciraNvpApiException {
final String uri = ROUTER_URI_PREFIX + "/" + logicalRouterUuid + "/nat/" + natRule.getUuid(); updateWithUri(natRule, buildLogicalRouterElementUri(logicalRouterUuid, NAT_PATH_SEGMENT, natRule.getUuid().toString()));
updateWithUri(natRule, uri);
} }
public void deleteLogicalRouterNatRule(final String logicalRouterUuid, final UUID natRuleUuid) throws NiciraNvpApiException { public void deleteLogicalRouterNatRule(final String logicalRouterUuid, final UUID natRuleUuid) throws NiciraNvpApiException {
final String uri = ROUTER_URI_PREFIX + "/" + logicalRouterUuid + "/nat/" + natRuleUuid.toString(); deleteWithUri(buildLogicalRouterElementUri(logicalRouterUuid, NAT_PATH_SEGMENT, natRuleUuid.toString()));
deleteWithUri(uri);
} }
public NiciraNvpList<LogicalRouterPort> findLogicalRouterPortByGatewayServiceAndVlanId(final String logicalRouterUuid, final String gatewayServiceUuid, final long vlanId) public List<LogicalRouterPort> findLogicalRouterPortByGatewayServiceAndVlanId(final String logicalRouterUuid, final String gatewayServiceUuid, final long vlanId)
throws NiciraNvpApiException { throws NiciraNvpApiException {
final String uri = ROUTER_URI_PREFIX + "/" + logicalRouterUuid + "/lport"; final String uri = buildLogicalRouterElementUri(logicalRouterUuid, LPORT_PATH_SEGMENT);
final Map<String, String> params = new HashMap<String, String>(); final Map<String, String> params = buildBasicParametersMap(WILDCARD_QUERY_PARAMETER);
params.put("attachment_gwsvc_uuid", gatewayServiceUuid); params.put(ATTACHMENT_GWSVC_UUID_QUERY_PARAMETER, gatewayServiceUuid);
params.put("attachment_vlan", Long.toString(vlanId)); params.put(NiciraConstants.ATTACHMENT_VLAN_PARAMETER, Long.toString(vlanId));
params.put("fields", "*");
try { try {
return restConnector.executeRetrieveObject(new TypeToken<NiciraNvpList<LogicalRouterPort>>() { final Type niciraListType = new TypeToken<NiciraNvpList<LogicalRouterPort>>() {
}.getType(), uri, params); }.getType();
return restConnector.<NiciraNvpList<LogicalRouterPort>> executeRetrieveObject(niciraListType, uri, params).getResults();
} catch (final CloudstackRESTException e) { } catch (final CloudstackRESTException e) {
throw new NiciraNvpApiException(e); throw new NiciraNvpApiException(e);
} }
} }
public NiciraNvpList<NatRule> findNatRulesByLogicalRouterUuid(final String logicalRouterUuid) throws NiciraNvpApiException { public List<NatRule> findNatRulesByLogicalRouterUuid(final String logicalRouterUuid) throws NiciraNvpApiException {
final String uri = ROUTER_URI_PREFIX + "/" + logicalRouterUuid + "/nat"; final String uri = buildLogicalRouterElementUri(logicalRouterUuid, NAT_PATH_SEGMENT);
final Map<String, String> params = new HashMap<String, String>(); final Map<String, String> params = buildBasicParametersMap(WILDCARD_QUERY_PARAMETER);
params.put("fields", "*");
try { try {
return restConnector.executeRetrieveObject(new TypeToken<NiciraNvpList<NatRule>>() { final Type niciraListType = new TypeToken<NiciraNvpList<NatRule>>() {
}.getType(), uri, params); }.getType();
return restConnector.<NiciraNvpList<NatRule>> executeRetrieveObject(niciraListType, uri, params).getResults();
} catch (final CloudstackRESTException e) { } catch (final CloudstackRESTException e) {
throw new NiciraNvpApiException(e); throw new NiciraNvpApiException(e);
} }
} }
public NiciraNvpList<LogicalRouterPort> findLogicalRouterPortByGatewayServiceUuid(final String logicalRouterUuid, final String l3GatewayServiceUuid) public List<LogicalRouterPort> findLogicalRouterPortByGatewayServiceUuid(final String logicalRouterUuid, final String l3GatewayServiceUuid)
throws NiciraNvpApiException { throws NiciraNvpApiException {
final String uri = ROUTER_URI_PREFIX + "/" + logicalRouterUuid + "/lport"; final String uri = buildLogicalRouterElementUri(logicalRouterUuid, LPORT_PATH_SEGMENT);
final Map<String, String> params = new HashMap<String, String>(); final Map<String, String> params = buildBasicParametersMap(WILDCARD_QUERY_PARAMETER);
params.put("fields", "*"); params.put(ATTACHMENT_GWSVC_UUID_QUERY_PARAMETER, l3GatewayServiceUuid);
params.put("attachment_gwsvc_uuid", l3GatewayServiceUuid);
try { try {
return restConnector.executeRetrieveObject(new TypeToken<NiciraNvpList<LogicalRouterPort>>() { final Type niciraListType = new TypeToken<NiciraNvpList<LogicalRouterPort>>() {
}.getType(), uri, params); }.getType();
return restConnector.<NiciraNvpList<LogicalRouterPort>> executeRetrieveObject(niciraListType, uri, params).getResults();
} catch (final CloudstackRESTException e) { } catch (final CloudstackRESTException e) {
throw new NiciraNvpApiException(e); throw new NiciraNvpApiException(e);
} }
} }
private static Map<String, String> buildBasicParametersMap(final String fieldsQueryValue) {
final Map<String, String> params = new HashMap<String, String>();
params.put(FIELDS_QUERY_PARAMETER, fieldsQueryValue);
return params;
} }
private static String buildUri(final String uriPrefix, final String uuid) {
return uriPrefix + "/" + uuid;
}
private static String buildLogicalSwitchUri(final String logicalSwitchUuid) {
return buildUri(SWITCH_URI_PREFIX, logicalSwitchUuid);
}
private static String buildLogicalSwitchElementUri(final String logicalSwitchUuid, final String logicalElementType) {
return buildLogicalSwitchUri(logicalSwitchUuid) + logicalElementType;
}
private static String buildLogicalSwitchElementUri(final String logicalSwitchUuid, final String logicalElementType, final String elementUuid) {
return buildLogicalSwitchElementUri(logicalSwitchUuid, logicalElementType) + "/" + elementUuid.toString();
}
private static String buildLogicalRouterUri(final String logicalRouterUuid) {
return buildUri(ROUTER_URI_PREFIX, logicalRouterUuid);
}
private static String buildLogicalRouterElementUri(final String logicalRouterUuid, final String logicalElementType) {
return buildLogicalRouterUri(logicalRouterUuid) + logicalElementType;
}
private static String buildLogicalRouterElementUri(final String logicalRouterUuid, final String logicalRouterElementType, final String elementUuid) {
return buildLogicalRouterElementUri(logicalRouterUuid, logicalRouterElementType) + "/" + elementUuid.toString();
}
public static class Builder {
private String host;
private String username;
private String password;
private CloseableHttpClient httpClient;
private HttpClientContext httpClientContext = HttpClientContext.create();
public Builder host(final String host) {
this.host = host;
return this;
}
public Builder username(final String username) {
this.username = username;
return this;
}
public Builder password(final String password) {
this.password = password;
return this;
}
public Builder httpClient(final CloseableHttpClient httpClient) {
this.httpClient = httpClient;
return this;
}
public Builder httpClientContext(final HttpClientContext httpClientContext) {
this.httpClientContext = httpClientContext;
return this;
}
public NiciraNvpApi build() {
return new NiciraNvpApi(this);
} }
} }
} }

View File

@ -19,6 +19,9 @@
package com.cloud.network.resource; package com.cloud.network.resource;
import java.security.KeyManagementException;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
import java.util.Map; import java.util.Map;
import javax.naming.ConfigurationException; import javax.naming.ConfigurationException;
@ -42,6 +45,8 @@ import com.cloud.network.nicira.NiciraNvpApiException;
import com.cloud.network.nicira.SourceNatRule; import com.cloud.network.nicira.SourceNatRule;
import com.cloud.network.utils.CommandRetryUtility; import com.cloud.network.utils.CommandRetryUtility;
import com.cloud.resource.ServerResource; import com.cloud.resource.ServerResource;
import com.cloud.utils.rest.CloudstackRESTException;
import com.cloud.utils.rest.HttpClientHelper;
public class NiciraNvpResource implements ServerResource { public class NiciraNvpResource implements ServerResource {
@ -49,6 +54,7 @@ public class NiciraNvpResource implements ServerResource {
public static final int NAME_MAX_LEN = 40; public static final int NAME_MAX_LEN = 40;
public static final int NUM_RETRIES = 2; public static final int NUM_RETRIES = 2;
private static final int MAX_REDIRECTS = 5;
private String name; private String name;
private String guid; private String guid;
@ -58,8 +64,16 @@ public class NiciraNvpResource implements ServerResource {
private NiciraNvpUtilities niciraNvpUtilities; private NiciraNvpUtilities niciraNvpUtilities;
private CommandRetryUtility retryUtility; private CommandRetryUtility retryUtility;
protected NiciraNvpApi createNiciraNvpApi() { protected NiciraNvpApi createNiciraNvpApi(final String host, final String username, final String password) throws CloudstackRESTException {
return new NiciraNvpApi(); try {
return NiciraNvpApi.create().host(host).username(username).password(password).httpClient(HttpClientHelper.createHttpClient(MAX_REDIRECTS)).build();
} catch (final KeyManagementException e) {
throw new CloudstackRESTException("Could not create HTTP client", e);
} catch (final NoSuchAlgorithmException e) {
throw new CloudstackRESTException("Could not create HTTP client", e);
} catch (final KeyStoreException e) {
throw new CloudstackRESTException("Could not create HTTP client", e);
}
} }
@Override @Override
@ -99,9 +113,11 @@ public class NiciraNvpResource implements ServerResource {
retryUtility = CommandRetryUtility.getInstance(); retryUtility = CommandRetryUtility.getInstance();
retryUtility.setServerResource(this); retryUtility.setServerResource(this);
niciraNvpApi = createNiciraNvpApi(); try {
niciraNvpApi.setControllerAddress(ip); niciraNvpApi = createNiciraNvpApi(ip, adminuser, adminpass);
niciraNvpApi.setAdminCredentials(adminuser, adminpass); } catch (final CloudstackRESTException e) {
throw new ConfigurationException("Could not create a Nicira Nvp API client: " + e.getMessage());
}
return true; return true;
} }

View File

@ -21,6 +21,8 @@ package com.cloud.network.resource.wrapper;
import static com.cloud.network.resource.NiciraNvpResource.NUM_RETRIES; import static com.cloud.network.resource.NiciraNvpResource.NUM_RETRIES;
import java.util.List;
import org.apache.log4j.Logger; import org.apache.log4j.Logger;
import com.cloud.agent.api.Answer; import com.cloud.agent.api.Answer;
@ -30,7 +32,6 @@ import com.cloud.agent.api.to.PortForwardingRuleTO;
import com.cloud.network.nicira.NatRule; import com.cloud.network.nicira.NatRule;
import com.cloud.network.nicira.NiciraNvpApi; import com.cloud.network.nicira.NiciraNvpApi;
import com.cloud.network.nicira.NiciraNvpApiException; import com.cloud.network.nicira.NiciraNvpApiException;
import com.cloud.network.nicira.NiciraNvpList;
import com.cloud.network.resource.NiciraNvpResource; import com.cloud.network.resource.NiciraNvpResource;
import com.cloud.network.utils.CommandRetryUtility; import com.cloud.network.utils.CommandRetryUtility;
import com.cloud.resource.CommandWrapper; import com.cloud.resource.CommandWrapper;
@ -45,7 +46,7 @@ public final class NiciraNvpConfigurePortForwardingRulesCommandWrapper extends C
public Answer execute(final ConfigurePortForwardingRulesOnLogicalRouterCommand command, final NiciraNvpResource niciraNvpResource) { public Answer execute(final ConfigurePortForwardingRulesOnLogicalRouterCommand command, final NiciraNvpResource niciraNvpResource) {
final NiciraNvpApi niciraNvpApi = niciraNvpResource.getNiciraNvpApi(); final NiciraNvpApi niciraNvpApi = niciraNvpResource.getNiciraNvpApi();
try { try {
final NiciraNvpList<NatRule> existingRules = niciraNvpApi.findNatRulesByLogicalRouterUuid(command.getLogicalRouterUuid()); final List<NatRule> existingRules = niciraNvpApi.findNatRulesByLogicalRouterUuid(command.getLogicalRouterUuid());
// Rules of the game (also known as assumptions-that-will-make-stuff-break-later-on) // Rules of the game (also known as assumptions-that-will-make-stuff-break-later-on)
// A SourceNat rule with a match other than a /32 cidr is assumed to be the "main" SourceNat rule // A SourceNat rule with a match other than a /32 cidr is assumed to be the "main" SourceNat rule
// Any other SourceNat rule should have a corresponding DestinationNat rule // Any other SourceNat rule should have a corresponding DestinationNat rule
@ -66,7 +67,7 @@ public final class NiciraNvpConfigurePortForwardingRulesCommandWrapper extends C
NatRule incoming = null; NatRule incoming = null;
NatRule outgoing = null; NatRule outgoing = null;
for (final NatRule storedRule : existingRules.getResults()) { for (final NatRule storedRule : existingRules) {
if (storedRule.equalsIgnoreUuid(rulepair[1])) { if (storedRule.equalsIgnoreUuid(rulepair[1])) {
// The outgoing rule exists // The outgoing rule exists
outgoing = storedRule; outgoing = storedRule;

View File

@ -21,13 +21,14 @@ package com.cloud.network.resource.wrapper;
import static com.cloud.network.resource.NiciraNvpResource.NUM_RETRIES; import static com.cloud.network.resource.NiciraNvpResource.NUM_RETRIES;
import java.util.List;
import com.cloud.agent.api.Answer; import com.cloud.agent.api.Answer;
import com.cloud.agent.api.ConfigurePublicIpsOnLogicalRouterAnswer; import com.cloud.agent.api.ConfigurePublicIpsOnLogicalRouterAnswer;
import com.cloud.agent.api.ConfigurePublicIpsOnLogicalRouterCommand; import com.cloud.agent.api.ConfigurePublicIpsOnLogicalRouterCommand;
import com.cloud.network.nicira.LogicalRouterPort; import com.cloud.network.nicira.LogicalRouterPort;
import com.cloud.network.nicira.NiciraNvpApi; import com.cloud.network.nicira.NiciraNvpApi;
import com.cloud.network.nicira.NiciraNvpApiException; import com.cloud.network.nicira.NiciraNvpApiException;
import com.cloud.network.nicira.NiciraNvpList;
import com.cloud.network.resource.NiciraNvpResource; import com.cloud.network.resource.NiciraNvpResource;
import com.cloud.network.utils.CommandRetryUtility; import com.cloud.network.utils.CommandRetryUtility;
import com.cloud.resource.CommandWrapper; import com.cloud.resource.CommandWrapper;
@ -41,11 +42,11 @@ public final class NiciraNvpConfigurePublicIpsCommandWrapper extends CommandWrap
final NiciraNvpApi niciraNvpApi = niciraNvpResource.getNiciraNvpApi(); final NiciraNvpApi niciraNvpApi = niciraNvpResource.getNiciraNvpApi();
try { try {
final NiciraNvpList<LogicalRouterPort> ports = niciraNvpApi.findLogicalRouterPortByGatewayServiceUuid(command.getLogicalRouterUuid(), command.getL3GatewayServiceUuid()); final List<LogicalRouterPort> ports = niciraNvpApi.findLogicalRouterPortByGatewayServiceUuid(command.getLogicalRouterUuid(), command.getL3GatewayServiceUuid());
if (ports.getResultCount() != 1) { if (ports.size() != 1) {
return new ConfigurePublicIpsOnLogicalRouterAnswer(command, false, "No logical router ports found, unable to set ip addresses"); return new ConfigurePublicIpsOnLogicalRouterAnswer(command, false, "No logical router ports found, unable to set ip addresses");
} }
final LogicalRouterPort lrp = ports.getResults().get(0); final LogicalRouterPort lrp = ports.get(0);
lrp.setIpAddresses(command.getPublicCidrs()); lrp.setIpAddresses(command.getPublicCidrs());
niciraNvpApi.updateLogicalRouterPort(command.getLogicalRouterUuid(), lrp); niciraNvpApi.updateLogicalRouterPort(command.getLogicalRouterUuid(), lrp);

View File

@ -21,6 +21,8 @@ package com.cloud.network.resource.wrapper;
import static com.cloud.network.resource.NiciraNvpResource.NUM_RETRIES; import static com.cloud.network.resource.NiciraNvpResource.NUM_RETRIES;
import java.util.List;
import org.apache.log4j.Logger; import org.apache.log4j.Logger;
import com.cloud.agent.api.Answer; import com.cloud.agent.api.Answer;
@ -30,7 +32,6 @@ import com.cloud.agent.api.to.StaticNatRuleTO;
import com.cloud.network.nicira.NatRule; import com.cloud.network.nicira.NatRule;
import com.cloud.network.nicira.NiciraNvpApi; import com.cloud.network.nicira.NiciraNvpApi;
import com.cloud.network.nicira.NiciraNvpApiException; import com.cloud.network.nicira.NiciraNvpApiException;
import com.cloud.network.nicira.NiciraNvpList;
import com.cloud.network.resource.NiciraNvpResource; import com.cloud.network.resource.NiciraNvpResource;
import com.cloud.network.utils.CommandRetryUtility; import com.cloud.network.utils.CommandRetryUtility;
import com.cloud.resource.CommandWrapper; import com.cloud.resource.CommandWrapper;
@ -46,7 +47,7 @@ public final class NiciraNvpConfigureStaticNatRulesCommandWrapper extends Comman
final NiciraNvpApi niciraNvpApi = niciraNvpResource.getNiciraNvpApi(); final NiciraNvpApi niciraNvpApi = niciraNvpResource.getNiciraNvpApi();
try { try {
final NiciraNvpList<NatRule> existingRules = niciraNvpApi.findNatRulesByLogicalRouterUuid(command.getLogicalRouterUuid()); final List<NatRule> existingRules = niciraNvpApi.findNatRulesByLogicalRouterUuid(command.getLogicalRouterUuid());
// Rules of the game (also known as assumptions-that-will-make-stuff-break-later-on) // Rules of the game (also known as assumptions-that-will-make-stuff-break-later-on)
// A SourceNat rule with a match other than a /32 cidr is assumed to be the "main" SourceNat rule // A SourceNat rule with a match other than a /32 cidr is assumed to be the "main" SourceNat rule
// Any other SourceNat rule should have a corresponding DestinationNat rule // Any other SourceNat rule should have a corresponding DestinationNat rule
@ -58,7 +59,7 @@ public final class NiciraNvpConfigureStaticNatRulesCommandWrapper extends Comman
NatRule incoming = null; NatRule incoming = null;
NatRule outgoing = null; NatRule outgoing = null;
for (final NatRule storedRule : existingRules.getResults()) { for (final NatRule storedRule : existingRules) {
if (storedRule.equalsIgnoreUuid(rulepair[1])) { if (storedRule.equalsIgnoreUuid(rulepair[1])) {
// The outgoing rule exists // The outgoing rule exists
outgoing = storedRule; outgoing = storedRule;

View File

@ -21,13 +21,14 @@ package com.cloud.network.resource.wrapper;
import static com.cloud.network.resource.NiciraNvpResource.NUM_RETRIES; import static com.cloud.network.resource.NiciraNvpResource.NUM_RETRIES;
import java.util.List;
import com.cloud.agent.api.Answer; import com.cloud.agent.api.Answer;
import com.cloud.agent.api.FindLogicalSwitchPortAnswer; import com.cloud.agent.api.FindLogicalSwitchPortAnswer;
import com.cloud.agent.api.FindLogicalSwitchPortCommand; import com.cloud.agent.api.FindLogicalSwitchPortCommand;
import com.cloud.network.nicira.LogicalSwitchPort; import com.cloud.network.nicira.LogicalSwitchPort;
import com.cloud.network.nicira.NiciraNvpApi; import com.cloud.network.nicira.NiciraNvpApi;
import com.cloud.network.nicira.NiciraNvpApiException; import com.cloud.network.nicira.NiciraNvpApiException;
import com.cloud.network.nicira.NiciraNvpList;
import com.cloud.network.resource.NiciraNvpResource; import com.cloud.network.resource.NiciraNvpResource;
import com.cloud.network.utils.CommandRetryUtility; import com.cloud.network.utils.CommandRetryUtility;
import com.cloud.resource.CommandWrapper; import com.cloud.resource.CommandWrapper;
@ -44,8 +45,8 @@ public final class NiciraNvpFindLogicalSwitchPortCommandWrapper extends CommandW
final NiciraNvpApi niciraNvpApi = niciraNvpResource.getNiciraNvpApi(); final NiciraNvpApi niciraNvpApi = niciraNvpResource.getNiciraNvpApi();
try { try {
final NiciraNvpList<LogicalSwitchPort> ports = niciraNvpApi.findLogicalSwitchPortsByUuid(logicalSwitchUuid, logicalSwitchPortUuid); final List<LogicalSwitchPort> ports = niciraNvpApi.findLogicalSwitchPortsByUuid(logicalSwitchUuid, logicalSwitchPortUuid);
if (ports.getResultCount() == 0) { if (ports.size() == 0) {
return new FindLogicalSwitchPortAnswer(command, false, "Logical switchport " + logicalSwitchPortUuid + " not found", null); return new FindLogicalSwitchPortAnswer(command, false, "Logical switchport " + logicalSwitchPortUuid + " not found", null);
} else { } else {
return new FindLogicalSwitchPortAnswer(command, true, "Logical switchport " + logicalSwitchPortUuid + " found", logicalSwitchPortUuid); return new FindLogicalSwitchPortAnswer(command, true, "Logical switchport " + logicalSwitchPortUuid + " found", logicalSwitchPortUuid);

View File

@ -22,16 +22,15 @@ package com.cloud.network.nicira;
import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue; import static org.junit.Assert.assertTrue;
import java.io.IOException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Properties;
import java.util.UUID; import java.util.UUID;
import org.junit.Before; import org.junit.Before;
import org.junit.Test; import org.junit.Test;
import com.cloud.utils.PropertiesUtil; import com.cloud.utils.PropertiesUtil;
import com.cloud.utils.rest.HttpClientHelper;
public class NiciraNvpApiIT { public class NiciraNvpApiIT {
@ -40,18 +39,23 @@ public class NiciraNvpApiIT {
protected long timestamp = System.currentTimeMillis(); protected long timestamp = System.currentTimeMillis();
@Before @Before
public void setup() throws IOException { public void setup() throws Exception {
final Properties properties = PropertiesUtil.loadFromFile(PropertiesUtil.findConfigFile("config.properties")); PropertiesUtil.loadFromFile(PropertiesUtil.findConfigFile("config.properties"));
api = new NiciraNvpApi(); final String host = System.getProperty("nvp.host");
api.setControllerAddress(properties.getProperty("nvp.host")); final String user = System.getProperty("nvp.admin.user");
api.setAdminCredentials(properties.getProperty("nvp.admin.user"), final String pass = System.getProperty("nvp.admin.pwd");
properties.getProperty("nvp.admin.pwd")); api = NiciraNvpApi.create()
.host(host)
.username(user)
.password(pass)
.httpClient(HttpClientHelper.createHttpClient(5))
.build();
} }
@Test @Test
public void testCRUDSecurityProfile() throws NiciraNvpApiException { public void testCRUDSecurityProfile() {
SecurityProfile sProfile = new SecurityProfile(); SecurityProfile sProfile = new SecurityProfile();
sProfile.setDisplayName("SecProfile"+timestamp); sProfile.setDisplayName("SecProfile" + timestamp);
final List<SecurityRule> egressRules = new ArrayList<SecurityRule>(); final List<SecurityRule> egressRules = new ArrayList<SecurityRule>();
sProfile.setLogicalPortEgressRules(egressRules); sProfile.setLogicalPortEgressRules(egressRules);
@ -73,27 +77,23 @@ public class NiciraNvpApiIT {
sProfile = api.createSecurityProfile(sProfile); sProfile = api.createSecurityProfile(sProfile);
// We can now update the new entity // We can now update the new entity
sProfile.setDisplayName("UpdatedSecProfile"+timestamp); sProfile.setDisplayName("UpdatedSecProfile" + timestamp);
api.updateSecurityProfile(sProfile, sProfile.getUuid()); api.updateSecurityProfile(sProfile, sProfile.getUuid());
// Read them all // Read them all
NiciraNvpList<SecurityProfile> profiles = api.findSecurityProfile(); List<SecurityProfile> profiles = api.findSecurityProfile();
SecurityProfile scInList = null; SecurityProfile scInList = null;
for(final SecurityProfile iProfile : profiles.getResults()) { for (final SecurityProfile iProfile : profiles) {
if (iProfile.getUuid().equalsIgnoreCase(sProfile.getUuid())) { if (iProfile.getUuid().equalsIgnoreCase(sProfile.getUuid())) {
scInList = iProfile; scInList = iProfile;
} }
} }
assertEquals("Read a Security Profile different from the one just created and updated", assertEquals("Read a Security Profile different from the one just created and updated", sProfile, scInList);
sProfile, scInList);
// Read them filtered by uuid (get one) // Read them filtered by uuid (get one)
profiles = api.findSecurityProfile(sProfile.getUuid()); profiles = api.findSecurityProfile(sProfile.getUuid());
assertEquals("Read a Security Profile different from the one just created and updated", assertEquals("Read a Security Profile different from the one just created and updated", sProfile, profiles.get(0));
sProfile, assertEquals("Read a Security Profile filtered by unique id (UUID) with more than one item", 1, profiles.size());
profiles.getResults().get(0));
assertEquals("Read a Security Profile filtered by unique id (UUID) with more than one item",
1, profiles.getResults().size());
// We can now delete the new entity // We can now delete the new entity
api.deleteSecurityProfile(sProfile.getUuid()); api.deleteSecurityProfile(sProfile.getUuid());
@ -104,25 +104,21 @@ public class NiciraNvpApiIT {
} }
@Test @Test
public void testCRUDAcl() throws NiciraNvpApiException { public void testCRUDAcl() {
Acl acl = new Acl(); Acl acl = new Acl();
acl.setDisplayName("Acl"+timestamp); acl.setDisplayName("Acl" + timestamp);
// Note that if the protocol is 6 (TCP) then you cannot put ICMP code and type // Note that if the protocol is 6 (TCP) then you cannot put ICMP code and type
// Note that if the protocol is 1 (ICMP) then you cannot put ports // Note that if the protocol is 1 (ICMP) then you cannot put ports
final List<AclRule> egressRules = new ArrayList<AclRule>(); final List<AclRule> egressRules = new ArrayList<AclRule>();
acl.setLogicalPortEgressRules(egressRules); acl.setLogicalPortEgressRules(egressRules);
egressRules.add(new AclRule(AclRule.ETHERTYPE_IPV4, 1, "allow", null, null, egressRules.add(new AclRule(AclRule.ETHERTYPE_IPV4, 1, "allow", null, null, "1.10.10.0", "1.10.10.1", null, null, null, null, 0, 0, 5));
"1.10.10.0", "1.10.10.1", null, null, null, null, 0, 0, 5)); egressRules.add(new AclRule(AclRule.ETHERTYPE_IPV4, 6, "allow", null, null, "1.10.10.6", "1.10.10.7", 80, 80, 80, 80, 1, null, null));
egressRules.add(new AclRule(AclRule.ETHERTYPE_IPV4, 6, "allow", null, null,
"1.10.10.6", "1.10.10.7", 80, 80, 80, 80, 1, null, null));
final List<AclRule> ingressRules = new ArrayList<AclRule>(); final List<AclRule> ingressRules = new ArrayList<AclRule>();
acl.setLogicalPortIngressRules(ingressRules); acl.setLogicalPortIngressRules(ingressRules);
ingressRules.add(new AclRule(AclRule.ETHERTYPE_IPV4, 1, "allow", null, null, ingressRules.add(new AclRule(AclRule.ETHERTYPE_IPV4, 1, "allow", null, null, "1.10.10.0", "1.10.10.1", null, null, null, null, 0, 0, 5));
"1.10.10.0", "1.10.10.1", null, null, null, null, 0, 0, 5)); ingressRules.add(new AclRule(AclRule.ETHERTYPE_IPV4, 6, "allow", null, null, "1.10.10.6", "1.10.10.7", 80, 80, 80, 80, 1, null, null));
ingressRules.add(new AclRule(AclRule.ETHERTYPE_IPV4, 6, "allow", null, null,
"1.10.10.6", "1.10.10.7", 80, 80, 80, 80, 1, null, null));
final List<NiciraNvpTag> tags = new ArrayList<NiciraNvpTag>(); final List<NiciraNvpTag> tags = new ArrayList<NiciraNvpTag>();
acl.setTags(tags); acl.setTags(tags);
@ -134,27 +130,23 @@ public class NiciraNvpApiIT {
acl = api.createAcl(acl); acl = api.createAcl(acl);
// We can now update the new entity // We can now update the new entity
acl.setDisplayName("UpdatedAcl"+timestamp); acl.setDisplayName("UpdatedAcl" + timestamp);
api.updateAcl(acl, acl.getUuid()); api.updateAcl(acl, acl.getUuid());
// Read them all // Read them all
NiciraNvpList<Acl> acls = api.findAcl(); List<Acl> acls = api.findAcl();
Acl scInList = null; Acl scInList = null;
for(final Acl iAcl : acls.getResults()) { for (final Acl iAcl : acls) {
if (iAcl.getUuid().equalsIgnoreCase(acl.getUuid())) { if (iAcl.getUuid().equalsIgnoreCase(acl.getUuid())) {
scInList = iAcl; scInList = iAcl;
} }
} }
assertEquals("Read a ACL different from the one just created and updated", assertEquals("Read a ACL different from the one just created and updated", acl, scInList);
acl, scInList);
// Read them filtered by uuid (get one) // Read them filtered by uuid (get one)
acls = api.findAcl(acl.getUuid()); acls = api.findAcl(acl.getUuid());
assertEquals("Read a ACL different from the one just created and updated", assertEquals("Read a ACL different from the one just created and updated", acl, acls.get(0));
acl, assertEquals("Read a ACL filtered by unique id (UUID) with more than one item", 1, acls.size());
acls.getResults().get(0));
assertEquals("Read a ACL filtered by unique id (UUID) with more than one item",
1, acls.getResults().size());
// We can now delete the new entity // We can now delete the new entity
api.deleteAcl(acl.getUuid()); api.deleteAcl(acl.getUuid());
@ -165,9 +157,9 @@ public class NiciraNvpApiIT {
} }
@Test @Test
public void testCRUDLogicalSwitch() throws NiciraNvpApiException { public void testCRUDLogicalSwitch() throws Exception {
LogicalSwitch logicalSwitch = new LogicalSwitch(); LogicalSwitch logicalSwitch = new LogicalSwitch();
logicalSwitch.setDisplayName("LogicalSwitch"+timestamp); logicalSwitch.setDisplayName("LogicalSwitch" + timestamp);
logicalSwitch.setPortIsolationEnabled(true); logicalSwitch.setPortIsolationEnabled(true);
logicalSwitch.setReplicationMode("service"); logicalSwitch.setReplicationMode("service");
logicalSwitch.setTags(new ArrayList<NiciraNvpTag>()); logicalSwitch.setTags(new ArrayList<NiciraNvpTag>());
@ -175,78 +167,65 @@ public class NiciraNvpApiIT {
// In the creation we don't get to specify UUID, href or schema: they don't exist yet // In the creation we don't get to specify UUID, href or schema: they don't exist yet
try { logicalSwitch = api.createLogicalSwitch(logicalSwitch);
logicalSwitch = api.createLogicalSwitch(logicalSwitch);
// We can now update the new entity // We can now update the new entity
logicalSwitch.setDisplayName("UpdatedLogicalSwitch"+timestamp); logicalSwitch.setDisplayName("UpdatedLogicalSwitch" + timestamp);
api.updateLogicalSwitch(logicalSwitch, logicalSwitch.getUuid()); api.updateLogicalSwitch(logicalSwitch, logicalSwitch.getUuid());
// Read them all // Read them all
NiciraNvpList<LogicalSwitch> logicalSwitches = api.findLogicalSwitch(); List<LogicalSwitch> logicalSwitches = api.findLogicalSwitch();
for(final LogicalSwitch iLogicalSwitch : logicalSwitches.getResults()) { for (final LogicalSwitch iLogicalSwitch : logicalSwitches) {
if (iLogicalSwitch.getUuid().equalsIgnoreCase(logicalSwitch.getUuid())) { if (iLogicalSwitch.getUuid().equalsIgnoreCase(logicalSwitch.getUuid())) {
assertEquals("Read a LogicalSwitch different from the one just created and updated", assertEquals("Read a LogicalSwitch different from the one just created and updated", logicalSwitch, iLogicalSwitch);
logicalSwitch, iLogicalSwitch);
}
} }
// Read them filtered by uuid (get one)
logicalSwitches = api.findLogicalSwitch(logicalSwitch.getUuid());
assertEquals("Read a LogicalSwitch different from the one just created and updated",
logicalSwitch,
logicalSwitches.getResults().get(0));
assertEquals("Read a LogicalSwitch filtered by unique id (UUID) with more than one item",
1, logicalSwitches.getResults().size());
// Before deleting the test LogicalSwitch, test its ports
final List<NiciraNvpTag> tags = new ArrayList<NiciraNvpTag>();
tags.add(new NiciraNvpTag("cs_account", "OwnerName"));
LogicalSwitchPort logicalSwitchPort = new LogicalSwitchPort("LSwitchPort"+timestamp, tags, true);
logicalSwitchPort = api.createLogicalSwitchPort(logicalSwitch.getUuid(), logicalSwitchPort);
logicalSwitchPort.setDisplayName("UpdatedLSwitchPort"+timestamp);
api.updateLogicalSwitchPort(logicalSwitch.getUuid(), logicalSwitchPort);
final NiciraNvpList<LogicalSwitchPort> logicalSwitchePorts =
api.findLogicalSwitchPortsByUuid(logicalSwitch.getUuid(), logicalSwitchPort.getUuid());
for(final LogicalSwitchPort iLSwitchPort : logicalSwitchePorts.getResults()) {
if (iLSwitchPort.getUuid().equalsIgnoreCase(logicalSwitchPort.getUuid())) {
assertEquals("Read a LogicalSwitchPort different from the one just created and updated",
logicalSwitchPort, iLSwitchPort);
}
}
// And finally test attachments
final String attachmentUuid = UUID.randomUUID().toString();
final VifAttachment vifAttachment = new VifAttachment(attachmentUuid);
api.updateLogicalSwitchPortAttachment(logicalSwitch.getUuid(), logicalSwitchPort.getUuid(),
vifAttachment);
assertEquals("Read a LogicalSwitchPort by vifAttachment different than expected",
api.findLogicalSwitchPortUuidByVifAttachmentUuid(logicalSwitch.getUuid(), vifAttachment.getVifUuid()),
logicalSwitchPort.getUuid());
api.deleteLogicalSwitchPort(logicalSwitch.getUuid(), logicalSwitchPort.getUuid());
// We can now delete the new entity
api.deleteLogicalSwitch(logicalSwitch.getUuid());
} catch (final NiciraNvpApiException e) {
e.printStackTrace();
assertTrue("Errors in LogicalSwitch CRUD", false);
} }
// Read them filtered by uuid (get one)
logicalSwitches = api.findLogicalSwitch(logicalSwitch.getUuid());
assertEquals("Read a LogicalSwitch different from the one just created and updated", logicalSwitch, logicalSwitches.get(0));
assertEquals("Read a LogicalSwitch filtered by unique id (UUID) with more than one item", 1, logicalSwitches.size());
// Before deleting the test LogicalSwitch, test its ports
final List<NiciraNvpTag> tags = new ArrayList<NiciraNvpTag>();
tags.add(new NiciraNvpTag("cs_account", "OwnerName"));
LogicalSwitchPort logicalSwitchPort = new LogicalSwitchPort("LSwitchPort" + timestamp, tags, true);
logicalSwitchPort = api.createLogicalSwitchPort(logicalSwitch.getUuid(), logicalSwitchPort);
logicalSwitchPort.setDisplayName("UpdatedLSwitchPort" + timestamp);
api.updateLogicalSwitchPort(logicalSwitch.getUuid(), logicalSwitchPort);
final List<LogicalSwitchPort> logicalSwitchePorts = api.findLogicalSwitchPortsByUuid(logicalSwitch.getUuid(), logicalSwitchPort.getUuid());
for (final LogicalSwitchPort iLSwitchPort : logicalSwitchePorts) {
if (iLSwitchPort.getUuid().equalsIgnoreCase(logicalSwitchPort.getUuid())) {
assertEquals("Read a LogicalSwitchPort different from the one just created and updated", logicalSwitchPort, iLSwitchPort);
}
}
// And finally test attachments
final String attachmentUuid = UUID.randomUUID().toString();
final VifAttachment vifAttachment = new VifAttachment(attachmentUuid);
api.updateLogicalSwitchPortAttachment(logicalSwitch.getUuid(), logicalSwitchPort.getUuid(), vifAttachment);
assertEquals("Read a LogicalSwitchPort by vifAttachment different than expected",
api.findLogicalSwitchPortUuidByVifAttachmentUuid(logicalSwitch.getUuid(), vifAttachment.getVifUuid()), logicalSwitchPort.getUuid());
api.deleteLogicalSwitchPort(logicalSwitch.getUuid(), logicalSwitchPort.getUuid());
// We can now delete the new entity
api.deleteLogicalSwitch(logicalSwitch.getUuid());
} }
@Test @Test
public void testCRUDLogicalRouter() throws NiciraNvpApiException { public void testCRUDLogicalRouter() {
LogicalRouter logicalRouter = new LogicalRouter(); LogicalRouter logicalRouter = new LogicalRouter();
logicalRouter.setDisplayName("LogicalRouter"+timestamp); logicalRouter.setDisplayName("LogicalRouter" + timestamp);
logicalRouter.setDistributed(true); logicalRouter.setDistributed(true);
logicalRouter.setNatSynchronizationEnabled(true); logicalRouter.setNatSynchronizationEnabled(true);
logicalRouter.setReplicationMode(LogicalRouter.REPLICATION_MODE_SERVICE); logicalRouter.setReplicationMode(LogicalRouter.REPLICATION_MODE_SERVICE);
final RoutingConfig routingConfig = new SingleDefaultRouteImplicitRoutingConfig( final RoutingConfig routingConfig = new SingleDefaultRouteImplicitRoutingConfig(
new RouterNextHop("192.168.10.20")); new RouterNextHop("192.168.10.20"));
logicalRouter.setRoutingConfig(routingConfig); logicalRouter.setRoutingConfig(routingConfig);
// In the creation we don't get to specify UUID, href or schema: they don't exist yet // In the creation we don't get to specify UUID, href or schema: they don't exist yet
@ -255,37 +234,32 @@ public class NiciraNvpApiIT {
logicalRouter = api.createLogicalRouter(logicalRouter); logicalRouter = api.createLogicalRouter(logicalRouter);
// We can now update the new entity // We can now update the new entity
logicalRouter.setDisplayName("UpdatedLogicalSwitch"+timestamp); logicalRouter.setDisplayName("UpdatedLogicalSwitch" + timestamp);
api.updateLogicalRouter(logicalRouter, logicalRouter.getUuid()); api.updateLogicalRouter(logicalRouter, logicalRouter.getUuid());
// Read them all // Read them all
NiciraNvpList<LogicalRouter> logicalRouters = api.findLogicalRouter(); List<LogicalRouter> logicalRouters = api.findLogicalRouter();
LogicalRouter lsInList = null; LogicalRouter lsInList = null;
for(final LogicalRouter iLogicalRouter : logicalRouters.getResults()) { for (final LogicalRouter iLogicalRouter : logicalRouters) {
if (iLogicalRouter.getUuid().equalsIgnoreCase(logicalRouter.getUuid())) { if (iLogicalRouter.getUuid().equalsIgnoreCase(logicalRouter.getUuid())) {
lsInList = iLogicalRouter; lsInList = iLogicalRouter;
} }
} }
assertEquals("Read a LogicalRouter different from the one just created and updated", assertEquals("Read a LogicalRouter different from the one just created and updated", logicalRouter, lsInList);
logicalRouter, lsInList);
// Read them filtered by uuid (get one) // Read them filtered by uuid (get one)
logicalRouters = api.findLogicalRouter(logicalRouter.getUuid()); logicalRouters = api.findLogicalRouter(logicalRouter.getUuid());
assertEquals("Read a LogicalRouter different from the one just created and updated", assertEquals("Read a LogicalRouter different from the one just created and updated", logicalRouter, logicalRouters.get(0));
logicalRouter, assertEquals("Read a LogicalRouter filtered by unique id (UUID) with more than one item", 1, logicalRouters.size());
logicalRouters.getResults().get(0));
assertEquals("Read a LogicalRouter filtered by unique id (UUID) with more than one item",
1, logicalRouters.getResults().size());
assertEquals("", logicalRouters.getResults().get(0), assertEquals(logicalRouters.get(0), api.findOneLogicalRouterByUuid(logicalRouter.getUuid()));
api.findOneLogicalRouterByUuid(logicalRouter.getUuid()));
// Before deleting the test LogicalRouter, test its ports // Before deleting the test LogicalRouter, test its ports
final List<NiciraNvpTag> tags = new ArrayList<NiciraNvpTag>(); final List<NiciraNvpTag> tags = new ArrayList<NiciraNvpTag>();
tags.add(new NiciraNvpTag("cs_account", "OwnerName")); tags.add(new NiciraNvpTag("cs_account", "OwnerName"));
LogicalRouterPort logicalRouterPort = new LogicalRouterPort(); LogicalRouterPort logicalRouterPort = new LogicalRouterPort();
logicalRouterPort.setDisplayName("LRouterPort"+timestamp); logicalRouterPort.setDisplayName("LRouterPort" + timestamp);
logicalRouterPort.setTags(tags); logicalRouterPort.setTags(tags);
logicalRouterPort.setAdminStatusEnabled(true); logicalRouterPort.setAdminStatusEnabled(true);
logicalRouterPort.setPortno(1024); logicalRouterPort.setPortno(1024);
@ -296,15 +270,13 @@ public class NiciraNvpApiIT {
logicalRouterPort.setIpAddresses(ipAddresses); logicalRouterPort.setIpAddresses(ipAddresses);
logicalRouterPort = api.createLogicalRouterPort(logicalRouter.getUuid(), logicalRouterPort); logicalRouterPort = api.createLogicalRouterPort(logicalRouter.getUuid(), logicalRouterPort);
logicalRouterPort.setDisplayName("UpdatedLRouterPort"+timestamp); logicalRouterPort.setDisplayName("UpdatedLRouterPort" + timestamp);
api.updateLogicalRouterPort(logicalRouter.getUuid(), logicalRouterPort); api.updateLogicalRouterPort(logicalRouter.getUuid(), logicalRouterPort);
final NiciraNvpList<LogicalRouterPort> logicalRouterePorts = final List<LogicalRouterPort> logicalRouterePorts = api.findLogicalRouterPortsByUuid(logicalRouter.getUuid(), logicalRouterPort.getUuid());
api.findLogicalRouterPortsByUuid(logicalRouter.getUuid(), logicalRouterPort.getUuid()); for (final LogicalRouterPort iLRouterPort : logicalRouterePorts) {
for(final LogicalRouterPort iLRouterPort : logicalRouterePorts.getResults()) {
if (iLRouterPort.getUuid().equalsIgnoreCase(logicalRouterPort.getUuid())) { if (iLRouterPort.getUuid().equalsIgnoreCase(logicalRouterPort.getUuid())) {
assertEquals("Read a LogicalRouterPort different from the one just created and updated", assertEquals("Read a LogicalRouterPort different from the one just created and updated", logicalRouterPort, iLRouterPort);
logicalRouterPort, iLRouterPort);
} }
} }
@ -339,8 +311,8 @@ public class NiciraNvpApiIT {
public void testGetControlClusterStatus() throws NiciraNvpApiException { public void testGetControlClusterStatus() throws NiciraNvpApiException {
final ControlClusterStatus controlClusterStatus = api.getControlClusterStatus(); final ControlClusterStatus controlClusterStatus = api.getControlClusterStatus();
final String clusterStatus = controlClusterStatus.getClusterStatus(); final String clusterStatus = controlClusterStatus.getClusterStatus();
final boolean correctStatus = (clusterStatus.equalsIgnoreCase("stable") || final boolean correctStatus = clusterStatus.equalsIgnoreCase("stable") ||
clusterStatus.equalsIgnoreCase("joining") || clusterStatus.equalsIgnoreCase("unstable")); clusterStatus.equalsIgnoreCase("joining") || clusterStatus.equalsIgnoreCase("unstable");
assertTrue("Not recognizable cluster status", correctStatus); assertTrue("Not recognizable cluster status", correctStatus);
} }

View File

@ -19,321 +19,180 @@
package com.cloud.network.nicira; package com.cloud.network.nicira;
import static org.junit.Assert.assertEquals; import static org.hamcrest.MatcherAssert.assertThat;
import static org.junit.Assert.assertTrue; import static org.hamcrest.Matchers.equalTo;
import static org.hamcrest.Matchers.hasProperty;
import static org.hamcrest.Matchers.hasSize;
import static org.mockito.Matchers.any;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.mock; import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.times; import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when; import static org.mockito.Mockito.when;
import static org.mockito.Mockito.doAnswer;
import static org.mockito.Matchers.any;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List; import java.util.List;
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.HttpMethod;
import org.apache.commons.httpclient.HttpStatus; import org.apache.commons.httpclient.HttpStatus;
import org.apache.commons.httpclient.NameValuePair; import org.apache.http.HttpHost;
import org.apache.commons.httpclient.methods.DeleteMethod; import org.apache.http.HttpRequest;
import org.apache.commons.httpclient.methods.GetMethod; import org.apache.http.ProtocolVersion;
import org.apache.commons.httpclient.methods.PostMethod; import org.apache.http.StatusLine;
import org.apache.commons.httpclient.methods.PutMethod; import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.commons.httpclient.params.HttpClientParams; import org.apache.http.client.protocol.HttpClientContext;
import org.junit.Before; import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.message.BasicStatusLine;
import org.hamcrest.Matchers;
import org.junit.Test; import org.junit.Test;
import org.mockito.invocation.InvocationOnMock;
import org.mockito.stubbing.Answer;
import com.google.gson.Gson; import com.cloud.utils.rest.HttpClientHelper;
import com.google.gson.JsonParseException; import com.cloud.utils.rest.HttpUriRequestMethodMatcher;
import com.cloud.utils.rest.RESTServiceConnector; import com.cloud.utils.rest.HttpUriRequestPathMatcher;
import com.cloud.utils.rest.RESTValidationStrategy; import com.cloud.utils.rest.HttpUriRequestQueryMatcher;
public class NiciraNvpApiTest { public class NiciraNvpApiTest {
private static final StatusLine HTTP_200_REPSONSE = new BasicStatusLine(new ProtocolVersion("HTTPS", 1, 1), HttpStatus.SC_OK, "OK");
private static final StatusLine HTTP_201_REPSONSE = new BasicStatusLine(new ProtocolVersion("HTTPS", 1, 1), HttpStatus.SC_CREATED, "Created");
protected static final String UUID = "aaaa"; protected static final String UUID = "aaaa";
protected static final String UUID2 = "bbbb"; protected static final String UUID2 = "bbbb";
protected static final String UUID_SEC_PROFILE_URI = NiciraNvpApi.SEC_PROFILE_URI_PREFIX + "/aaaa"; protected static final String UUID_SEC_PROFILE_URI = NiciraConstants.SEC_PROFILE_URI_PREFIX + "/aaaa";
protected static final String SCHEMA = "myTestSchema"; protected static final String SCHEMA = "myTestSchema";
protected static final String SCHEMA2 = "myTestSchema2"; protected static final String SCHEMA2 = "myTestSchema2";
protected static final String HREF = "myTestHref"; protected static final String HREF = "myTestHref";
protected static final String HREF2 = "myTestHref2"; protected static final String HREF2 = "myTestHref2";
protected static final String SEC_PROFILE_JSON_RESPONSE = protected static final String SEC_PROFILE_JSON_RESPONSE =
"{\"uuid\" : \"aaaa\"," "{\"uuid\" : \"aaaa\","
+ "\"display_name\" : \"myTestName\"," + "\"display_name\" : \"myTestName\","
+ "\"href\" : \"myTestHref\"," + "\"href\" : \"myTestHref\","
+ "\"schema\" : \"myTestSchema\"}"; + "\"schema\" : \"myTestSchema\"}";
protected static final String SEC_PROFILE_LIST_JSON_RESPONSE = "{\"results\" : [{\"uuid\" : \"aaaa\"," protected static final String SEC_PROFILE_LIST_JSON_RESPONSE = "{\"results\" : [{\"uuid\" : \"aaaa\","
+ "\"display_name\" : \"myTestName\"," + "\"display_name\" : \"myTestName\","
+ "\"href\" : \"myTestHref\"," + "\"href\" : \"myTestHref\","
+ "\"schema\" : \"myTestSchema\"}," + "\"schema\" : \"myTestSchema\"},"
+ "{ \"uuid\" : \"bbbb\"," + "{ \"uuid\" : \"bbbb\","
+ "\"display_name\" : \"myTestName2\"," + "\"display_name\" : \"myTestName2\","
+ "\"href\" : \"myTestHref2\"," + "\"href\" : \"myTestHref2\","
+ "\"schema\" : \"myTestSchema2\"}]," + "\"schema\" : \"myTestSchema2\"}],"
+ "\"result_count\": 2}"; + "\"result_count\": 2}";
NiciraNvpApi api; private static NiciraNvpApi buildApi(final CloseableHttpClient httpClient) {
HttpClient client = mock(HttpClient.class); return NiciraNvpApi.create()
HttpMethod method; .host("localhost")
String type; .username("admin")
String uri; .password("adminpassword")
.httpClient(httpClient)
@Before .build();
public void setUp() {
final HttpClientParams hmp = mock(HttpClientParams.class);
when(client.getParams()).thenReturn(hmp);
api = new NiciraNvpApi();
api.restConnector = new RESTServiceConnector(new RESTValidationStrategy()) {
@Override
public HttpClient createHttpClient() {
return client;
}
@Override
public HttpMethod createMethod(final String newType, final String newUri) {
type = newType;
uri = newUri;
return method;
}
};
api.setAdminCredentials("admin", "adminpass");
api.setControllerAddress("localhost");
} }
@Test @Test
public void testFindSecurityProfile() throws NiciraNvpApiException, IOException { @SuppressWarnings("unchecked")
// Prepare public void testFindSecurityProfile() throws Exception {
method = mock(GetMethod.class); final CloseableHttpResponse response = mock(CloseableHttpResponse.class);
when(method.getStatusCode()).thenReturn(HttpStatus.SC_OK); when(response.getStatusLine()).thenReturn(HTTP_200_REPSONSE);
when(method.getResponseBodyAsString()).thenReturn(SEC_PROFILE_LIST_JSON_RESPONSE); when(response.getEntity()).thenReturn(new StringEntity(SEC_PROFILE_LIST_JSON_RESPONSE));
final NameValuePair[] queryString = new NameValuePair[]{ final CloseableHttpClient httpClient = spy(HttpClientHelper.createHttpClient(2));
new NameValuePair("fields","*")}; doReturn(response).when(httpClient).execute(any(HttpHost.class), any(HttpRequest.class), any(HttpClientContext.class));
final NiciraNvpApi api = buildApi(httpClient);
// Execute final List<SecurityProfile> actualProfiles = api.findSecurityProfile();
final NiciraNvpList<SecurityProfile> actualProfiles = api.findSecurityProfile();
// Assert assertThat("Wrong number of results", actualProfiles, hasSize(2));
verify(method, times(1)).releaseConnection(); assertThat("Wrong Uuid in the newly created SecurityProfile", actualProfiles, Matchers.<SecurityProfile> contains(
verify(method, times(1)).setQueryString(queryString); hasProperty("uuid", equalTo(UUID)),
assertEquals("Wrong Uuid in the newly created SecurityProfile", hasProperty("uuid", equalTo(UUID2))));
UUID, actualProfiles.getResults().get(0).getUuid()); assertThat("Wrong HREF in the newly created SecurityProfile", actualProfiles, Matchers.<SecurityProfile> contains(
assertEquals("Wrong Uuid in the newly created SecurityProfile", hasProperty("href", equalTo(HREF)),
HREF, actualProfiles.getResults().get(0).getHref()); hasProperty("href", equalTo(HREF2))));
assertEquals("Wrong Schema in the newly created SecurityProfile", assertThat("Wrong Schema in the newly created SecurityProfile", actualProfiles, Matchers.<SecurityProfile> contains(
SCHEMA, actualProfiles.getResults().get(0).getSchema()); hasProperty("schema", equalTo(SCHEMA)),
assertEquals("Wrong Uuid in the newly created SecurityProfile", hasProperty("schema", equalTo(SCHEMA2))));
UUID2, actualProfiles.getResults().get(1).getUuid()); verify(response, times(1)).close();
assertEquals("Wrong Uuid in the newly created SecurityProfile", verify(httpClient).execute(any(HttpHost.class), HttpUriRequestMethodMatcher.aMethod("GET"), any(HttpClientContext.class));
HREF2, actualProfiles.getResults().get(1).getHref()); verify(httpClient).execute(any(HttpHost.class), HttpUriRequestQueryMatcher.aQuery("fields=*"), any(HttpClientContext.class));
assertEquals("Wrong Schema in the newly created SecurityProfile", verify(httpClient).execute(any(HttpHost.class), HttpUriRequestPathMatcher.aPath(NiciraConstants.SEC_PROFILE_URI_PREFIX), any(HttpClientContext.class));
SCHEMA2, actualProfiles.getResults().get(1).getSchema());
assertEquals("Wrong Schema in the newly created SecurityProfile",
2, actualProfiles.getResultCount());
assertEquals("Wrong URI for SecurityProfile creation REST service",
NiciraNvpApi.SEC_PROFILE_URI_PREFIX, uri);
assertEquals("Wrong URI for SecurityProfile creation REST service",
NiciraNvpApi.GET_METHOD_TYPE, type);
} }
@Test @Test
public void testFindSecurityProfileByUuid() throws NiciraNvpApiException, IOException { @SuppressWarnings("unchecked")
// Prepare public void testFindSecurityProfileByUuid() throws Exception {
method = mock(GetMethod.class); final CloseableHttpResponse response = mock(CloseableHttpResponse.class);
when(method.getStatusCode()).thenReturn(HttpStatus.SC_OK); when(response.getStatusLine()).thenReturn(HTTP_200_REPSONSE);
when(method.getResponseBodyAsString()).thenReturn(SEC_PROFILE_LIST_JSON_RESPONSE); when(response.getEntity()).thenReturn(new StringEntity(SEC_PROFILE_LIST_JSON_RESPONSE));
final NameValuePair[] queryString = new NameValuePair[]{ final CloseableHttpClient httpClient = spy(HttpClientHelper.createHttpClient(2));
new NameValuePair("uuid", UUID), doReturn(response).when(httpClient).execute(any(HttpHost.class), any(HttpRequest.class), any(HttpClientContext.class));
new NameValuePair("fields","*") final NiciraNvpApi api = buildApi(httpClient);
};
final List<NameValuePair> queryStringNvps = new ArrayList<>();
doAnswer(new Answer<Void>() {
@Override final List<SecurityProfile> actualProfiles = api.findSecurityProfile(UUID);
public Void answer(InvocationOnMock invocation) throws Throwable {
final NameValuePair[] arguments = (NameValuePair[]) invocation.getArguments()[0];
queryStringNvps.addAll(Arrays.asList(arguments));
return null;
}}).when(method).setQueryString(any(NameValuePair[].class));
// Execute assertThat("Wrong number of results", actualProfiles, hasSize(2));
final NiciraNvpList<SecurityProfile> actualProfiles = api.findSecurityProfile(UUID); assertThat("Wrong Uuid in the newly created SecurityProfile", actualProfiles, Matchers.<SecurityProfile> contains(
hasProperty("uuid", equalTo(UUID)),
// Assert hasProperty("uuid", equalTo(UUID2))));
verify(method, times(1)).releaseConnection(); assertThat("Wrong HREF in the newly created SecurityProfile", actualProfiles, Matchers.<SecurityProfile> contains(
assertTrue(queryStringNvps.containsAll(Arrays.asList(queryString))); hasProperty("href", equalTo(HREF)),
assertEquals(queryString.length, queryStringNvps.size()); hasProperty("href", equalTo(HREF2))));
assertEquals("Wrong Uuid in the newly created SecurityProfile", assertThat("Wrong Schema in the newly created SecurityProfile", actualProfiles, Matchers.<SecurityProfile> contains(
UUID, actualProfiles.getResults().get(0).getUuid()); hasProperty("schema", equalTo(SCHEMA)),
assertEquals("Wrong Uuid in the newly created SecurityProfile", hasProperty("schema", equalTo(SCHEMA2))));
HREF, actualProfiles.getResults().get(0).getHref()); verify(response, times(1)).close();
assertEquals("Wrong Schema in the newly created SecurityProfile", verify(httpClient).execute(any(HttpHost.class), HttpUriRequestMethodMatcher.aMethod("GET"), any(HttpClientContext.class));
SCHEMA, actualProfiles.getResults().get(0).getSchema()); verify(httpClient).execute(any(HttpHost.class), HttpUriRequestQueryMatcher.aQueryThatContains("uuid=" + UUID), any(HttpClientContext.class));
assertEquals("Wrong Uuid in the newly created SecurityProfile", verify(httpClient).execute(any(HttpHost.class), HttpUriRequestQueryMatcher.aQueryThatContains("fields=*"), any(HttpClientContext.class));
UUID2, actualProfiles.getResults().get(1).getUuid()); verify(httpClient).execute(any(HttpHost.class), HttpUriRequestPathMatcher.aPath(NiciraConstants.SEC_PROFILE_URI_PREFIX), any(HttpClientContext.class));
assertEquals("Wrong Uuid in the newly created SecurityProfile",
HREF2, actualProfiles.getResults().get(1).getHref());
assertEquals("Wrong Schema in the newly created SecurityProfile",
SCHEMA2, actualProfiles.getResults().get(1).getSchema());
assertEquals("Wrong Schema in the newly created SecurityProfile",
2, actualProfiles.getResultCount());
assertEquals("Wrong URI for SecurityProfile creation REST service",
NiciraNvpApi.SEC_PROFILE_URI_PREFIX, uri);
assertEquals("Wrong HTTP method for SecurityProfile creation REST service",
NiciraNvpApi.GET_METHOD_TYPE, type);
} }
@Test @Test
public void testCreateSecurityProfile() throws NiciraNvpApiException, IOException { public void testCreateSecurityProfile() throws Exception {
// Prepare final CloseableHttpResponse response = mock(CloseableHttpResponse.class);
final SecurityProfile inputSecProfile = new SecurityProfile(); when(response.getStatusLine()).thenReturn(HTTP_201_REPSONSE);
method = mock(PostMethod.class); when(response.getEntity()).thenReturn(new StringEntity(SEC_PROFILE_JSON_RESPONSE));
when(method.getStatusCode()).thenReturn(HttpStatus.SC_CREATED); final CloseableHttpClient httpClient = spy(HttpClientHelper.createHttpClient(2));
when(method.getResponseBodyAsString()).thenReturn(SEC_PROFILE_JSON_RESPONSE); doReturn(response).when(httpClient).execute(any(HttpHost.class), any(HttpRequest.class), any(HttpClientContext.class));
final NiciraNvpApi api = buildApi(httpClient);
// Execute final SecurityProfile actualSecProfile = api.createSecurityProfile(new SecurityProfile());
final SecurityProfile actualSecProfile = api.createSecurityProfile(inputSecProfile);
// Assert assertThat("Wrong Uuid in the newly created SecurityProfile", actualSecProfile, hasProperty("uuid", equalTo(UUID)));
verify(method, times(1)).releaseConnection(); assertThat("Wrong Href in the newly created SecurityProfile", actualSecProfile, hasProperty("href", equalTo(HREF)));
assertEquals("Wrong Uuid in the newly created SecurityProfile", assertThat("Wrong Schema in the newly created SecurityProfile", actualSecProfile, hasProperty("schema", equalTo(SCHEMA)));
UUID, actualSecProfile.getUuid()); verify(response, times(1)).close();
assertEquals("Wrong Uuid in the newly created SecurityProfile", verify(httpClient).execute(any(HttpHost.class), HttpUriRequestMethodMatcher.aMethod("POST"), any(HttpClientContext.class));
HREF, actualSecProfile.getHref()); verify(httpClient).execute(any(HttpHost.class), HttpUriRequestPathMatcher.aPath(NiciraConstants.SEC_PROFILE_URI_PREFIX), any(HttpClientContext.class));
assertEquals("Wrong Schema in the newly created SecurityProfile",
SCHEMA, actualSecProfile.getSchema());
assertEquals("Wrong URI for SecurityProfile creation REST service",
NiciraNvpApi.SEC_PROFILE_URI_PREFIX, uri);
assertEquals("Wrong HTTP method for SecurityProfile creation REST service",
NiciraNvpApi.POST_METHOD_TYPE, type);
} }
@Test @Test
public void testUpdateSecurityProfile() throws NiciraNvpApiException, IOException { public void testUpdateSecurityProfile() throws Exception {
// Prepare final CloseableHttpResponse response = mock(CloseableHttpResponse.class);
final SecurityProfile inputSecProfile = new SecurityProfile(); when(response.getStatusLine()).thenReturn(HTTP_201_REPSONSE);
method = mock(PutMethod.class); when(response.getEntity()).thenReturn(new StringEntity(SEC_PROFILE_JSON_RESPONSE));
when(method.getStatusCode()).thenReturn(HttpStatus.SC_OK); final CloseableHttpClient httpClient = spy(HttpClientHelper.createHttpClient(2));
doReturn(response).when(httpClient).execute(any(HttpHost.class), any(HttpRequest.class), any(HttpClientContext.class));
final NiciraNvpApi api = buildApi(httpClient);
// Execute api.updateSecurityProfile(new SecurityProfile(), UUID);
api.updateSecurityProfile(inputSecProfile, UUID);
// Assert verify(response, times(1)).close();
verify(method, times(1)).releaseConnection(); verify(httpClient).execute(any(HttpHost.class), HttpUriRequestMethodMatcher.aMethod("PUT"), any(HttpClientContext.class));
assertEquals("Wrong URI for SecurityProfile creation REST service", verify(httpClient).execute(any(HttpHost.class), HttpUriRequestPathMatcher.aPath(NiciraConstants.SEC_PROFILE_URI_PREFIX + "/" + UUID), any(HttpClientContext.class));
UUID_SEC_PROFILE_URI, uri);
assertEquals("Wrong HTTP method for SecurityProfile creation REST service",
NiciraNvpApi.PUT_METHOD_TYPE, type);
} }
@Test @Test
public void testDeleteSecurityProfile() throws NiciraNvpApiException, IOException { public void testDeleteSecurityProfile() throws Exception {
// Prepare final CloseableHttpResponse response = mock(CloseableHttpResponse.class);
method = mock(DeleteMethod.class); when(response.getStatusLine()).thenReturn(HTTP_201_REPSONSE);
when(method.getStatusCode()).thenReturn(HttpStatus.SC_NO_CONTENT); when(response.getEntity()).thenReturn(new StringEntity(SEC_PROFILE_JSON_RESPONSE));
final CloseableHttpClient httpClient = spy(HttpClientHelper.createHttpClient(2));
doReturn(response).when(httpClient).execute(any(HttpHost.class), any(HttpRequest.class), any(HttpClientContext.class));
final NiciraNvpApi api = buildApi(httpClient);
// Execute
api.deleteSecurityProfile(UUID); api.deleteSecurityProfile(UUID);
// Assert verify(response, times(1)).close();
verify(method, times(1)).releaseConnection(); verify(httpClient).execute(any(HttpHost.class), HttpUriRequestMethodMatcher.aMethod("DELETE"), any(HttpClientContext.class));
assertEquals("Wrong URI for SecurityProfile deletion REST service", UUID_SEC_PROFILE_URI, uri); verify(httpClient).execute(any(HttpHost.class), HttpUriRequestPathMatcher.aPath(NiciraConstants.SEC_PROFILE_URI_PREFIX + "/" + UUID), any(HttpClientContext.class));
assertEquals("Wrong HTTP method for SecurityProfile deletion REST service", NiciraNvpApi.DELETE_METHOD_TYPE, type);
}
@Test(expected = JsonParseException.class)
public void testRoutingConfigAdapterNoType() throws NiciraNvpApiException, IOException {
// Prepare
final NiciraNvpApi api = new NiciraNvpApi();
final Gson gson = api.restConnector.getGson();
// Execute
gson.fromJson("{}", RoutingConfig.class);
// Assert: JsonParseException should be thrown
}
@Test(expected = JsonParseException.class)
public void testRoutingConfigAdapterWrongType() throws NiciraNvpApiException, IOException {
// Prepare
final NiciraNvpApi api = new NiciraNvpApi();
final Gson gson = api.restConnector.getGson();
// Execute
gson.fromJson("{type : \"WrongType\"}", RoutingConfig.class);
// Assert: JsonParseException should be thrown
}
@Test()
public void testRoutingConfigAdapter() throws NiciraNvpApiException, IOException {
// Prepare
final NiciraNvpApi api = new NiciraNvpApi();
final Gson gson = api.restConnector.getGson();
// Execute
final SingleDefaultRouteImplicitRoutingConfig singleDefaultRouteImplicitRoutingConfig =
(SingleDefaultRouteImplicitRoutingConfig) gson.fromJson("{type : \"SingleDefaultRouteImplicitRoutingConfig\"}", RoutingConfig.class);
// Assert: JsonParseException should be thrown
assertEquals("", SingleDefaultRouteImplicitRoutingConfig.class, singleDefaultRouteImplicitRoutingConfig.getClass());
}
@Test(expected = JsonParseException.class)
public void testNatRuleAdapterNoType() throws NiciraNvpApiException, IOException {
// Prepare
final NiciraNvpApi api = new NiciraNvpApi();
final Gson gson = api.restConnector.getGson();
// Execute
gson.fromJson("{}", NatRule.class);
// Assert: JsonParseException should be thrown
}
@Test(expected = JsonParseException.class)
public void testNatRuleAdapterWrongType() throws NiciraNvpApiException, IOException {
// Prepare
final NiciraNvpApi api = new NiciraNvpApi();
final Gson gson = api.restConnector.getGson();
// Execute
gson.fromJson("{type : \"WrongType\"}", NatRule.class);
// Assert: JsonParseException should be thrown
}
@Test()
public void testRoutingConfigAdapterWithSourceNatRule() throws NiciraNvpApiException, IOException {
// Prepare
final NiciraNvpApi api = new NiciraNvpApi();
final Gson gson = api.restConnector.getGson();
// Execute
final SourceNatRule sourceNatRule =
(SourceNatRule) gson.fromJson("{type : \"SourceNatRule\"}", NatRule.class);
// Assert: JsonParseException should be thrown
assertEquals("", SourceNatRule.class, sourceNatRule.getClass());
}
@Test()
public void testRoutingConfigAdapterWithDestinationNatRule() throws NiciraNvpApiException, IOException {
// Prepare
final NiciraNvpApi api = new NiciraNvpApi();
final Gson gson = api.restConnector.getGson();
// Execute
final DestinationNatRule destinationNatRule =
(DestinationNatRule) gson.fromJson("{type : \"DestinationNatRule\"}", NatRule.class);
// Assert: JsonParseException should be thrown
assertEquals("", DestinationNatRule.class, destinationNatRule.getClass());
} }
} }

View File

@ -45,7 +45,6 @@ import com.cloud.network.nicira.LogicalRouterPort;
import com.cloud.network.nicira.LogicalSwitch; import com.cloud.network.nicira.LogicalSwitch;
import com.cloud.network.nicira.NiciraNvpApi; import com.cloud.network.nicira.NiciraNvpApi;
import com.cloud.network.nicira.NiciraNvpApiException; import com.cloud.network.nicira.NiciraNvpApiException;
import com.cloud.network.nicira.NiciraNvpList;
import com.cloud.network.nicira.VifAttachment; import com.cloud.network.nicira.VifAttachment;
public class NiciraNvpRequestWrapperTest { public class NiciraNvpRequestWrapperTest {
@ -144,10 +143,6 @@ public class NiciraNvpRequestWrapperTest {
final List<LogicalRouterPort> listPorts = new ArrayList<LogicalRouterPort>(); final List<LogicalRouterPort> listPorts = new ArrayList<LogicalRouterPort>();
listPorts.add(port1); listPorts.add(port1);
final NiciraNvpList<LogicalRouterPort> ports = new NiciraNvpList<LogicalRouterPort>();
ports.setResults(listPorts);
ports.setResultCount(1);
final String logicalRouterUuid = "d2e05a9e-7120-4487-a5fc-414ab36d9345"; final String logicalRouterUuid = "d2e05a9e-7120-4487-a5fc-414ab36d9345";
final String l3GatewayServiceUuid = "d2e05a9e-7120-4487-a5fc-414ab36d9345"; final String l3GatewayServiceUuid = "d2e05a9e-7120-4487-a5fc-414ab36d9345";
final List<String> publicCidrs = new ArrayList<String>(); final List<String> publicCidrs = new ArrayList<String>();
@ -158,7 +153,7 @@ public class NiciraNvpRequestWrapperTest {
when(niciraNvpResource.getNiciraNvpApi()).thenReturn(niciraNvpApi); when(niciraNvpResource.getNiciraNvpApi()).thenReturn(niciraNvpApi);
try { try {
when(niciraNvpApi.findLogicalRouterPortByGatewayServiceUuid(command.getLogicalRouterUuid(), command.getL3GatewayServiceUuid())).thenReturn(ports); when(niciraNvpApi.findLogicalRouterPortByGatewayServiceUuid(command.getLogicalRouterUuid(), command.getL3GatewayServiceUuid())).thenReturn(listPorts);
doNothing().when(niciraNvpApi).updateLogicalRouterPort(command.getLogicalRouterUuid(), port1); doNothing().when(niciraNvpApi).updateLogicalRouterPort(command.getLogicalRouterUuid(), port1);
} catch (final NiciraNvpApiException e) { } catch (final NiciraNvpApiException e) {
fail(e.getMessage()); fail(e.getMessage());

View File

@ -83,7 +83,6 @@ import com.cloud.network.nicira.LogicalSwitchPort;
import com.cloud.network.nicira.NatRule; import com.cloud.network.nicira.NatRule;
import com.cloud.network.nicira.NiciraNvpApi; import com.cloud.network.nicira.NiciraNvpApi;
import com.cloud.network.nicira.NiciraNvpApiException; import com.cloud.network.nicira.NiciraNvpApiException;
import com.cloud.network.nicira.NiciraNvpList;
import com.cloud.network.nicira.SourceNatRule; import com.cloud.network.nicira.SourceNatRule;
import com.cloud.network.utils.CommandRetryUtility; import com.cloud.network.utils.CommandRetryUtility;
@ -95,10 +94,10 @@ public class NiciraNvpResourceTest {
private CommandRetryUtility retryUtility; private CommandRetryUtility retryUtility;
@Before @Before
public void setUp() throws ConfigurationException { public void setUp() {
resource = new NiciraNvpResource() { resource = new NiciraNvpResource() {
@Override @Override
protected NiciraNvpApi createNiciraNvpApi() { protected NiciraNvpApi createNiciraNvpApi(final String host, final String username, final String password) {
return nvpApi; return nvpApi;
} }
}; };
@ -120,20 +119,6 @@ public class NiciraNvpResourceTest {
resource.configure("NiciraNvpResource", Collections.<String, Object> emptyMap()); resource.configure("NiciraNvpResource", Collections.<String, Object> emptyMap());
} }
@Test
public void resourceConfigure() throws ConfigurationException {
resource.configure("NiciraNvpResource", parameters);
verify(nvpApi).setAdminCredentials("adminuser", "adminpass");
verify(nvpApi).setControllerAddress("127.0.0.1");
assertTrue("Incorrect resource name", "nvptestdevice".equals(resource.getName()));
/* Pretty lame test, but here to assure this plugin fails
* if the type name ever changes from L2Networking
*/
assertTrue("Incorrect resource type", resource.getType() == Host.Type.L2Networking);
}
@Test @Test
public void testInitialization() throws ConfigurationException { public void testInitialization() throws ConfigurationException {
resource.configure("NiciraNvpResource", parameters); resource.configure("NiciraNvpResource", parameters);
@ -309,10 +294,7 @@ public class NiciraNvpResourceTest {
public void testFindLogicalSwitchPort() throws ConfigurationException, NiciraNvpApiException { public void testFindLogicalSwitchPort() throws ConfigurationException, NiciraNvpApiException {
resource.configure("NiciraNvpResource", parameters); resource.configure("NiciraNvpResource", parameters);
@SuppressWarnings("unchecked") final List<LogicalSwitchPort> lspl = Arrays.asList(new LogicalSwitchPort());
final
NiciraNvpList<LogicalSwitchPort> lspl = mock(NiciraNvpList.class);
when(lspl.getResultCount()).thenReturn(1);
when(nvpApi.findLogicalSwitchPortsByUuid("aaaa", "bbbb")).thenReturn(lspl); when(nvpApi.findLogicalSwitchPortsByUuid("aaaa", "bbbb")).thenReturn(lspl);
final FindLogicalSwitchPortAnswer flspa = (FindLogicalSwitchPortAnswer) resource.executeRequest(new FindLogicalSwitchPortCommand("aaaa", "bbbb")); final FindLogicalSwitchPortAnswer flspa = (FindLogicalSwitchPortAnswer) resource.executeRequest(new FindLogicalSwitchPortCommand("aaaa", "bbbb"));
@ -324,9 +306,7 @@ public class NiciraNvpResourceTest {
resource.configure("NiciraNvpResource", parameters); resource.configure("NiciraNvpResource", parameters);
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
final final List<LogicalSwitchPort> lspl = Collections.EMPTY_LIST;
NiciraNvpList<LogicalSwitchPort> lspl = mock(NiciraNvpList.class);
when(lspl.getResultCount()).thenReturn(0);
when(nvpApi.findLogicalSwitchPortsByUuid("aaaa", "bbbb")).thenReturn(lspl); when(nvpApi.findLogicalSwitchPortsByUuid("aaaa", "bbbb")).thenReturn(lspl);
final FindLogicalSwitchPortAnswer flspa = (FindLogicalSwitchPortAnswer) resource.executeRequest(new FindLogicalSwitchPortCommand("aaaa", "bbbb")); final FindLogicalSwitchPortAnswer flspa = (FindLogicalSwitchPortAnswer) resource.executeRequest(new FindLogicalSwitchPortCommand("aaaa", "bbbb"));
@ -427,8 +407,7 @@ public class NiciraNvpResourceTest {
final ConfigurePublicIpsOnLogicalRouterCommand cmd = mock(ConfigurePublicIpsOnLogicalRouterCommand.class); final ConfigurePublicIpsOnLogicalRouterCommand cmd = mock(ConfigurePublicIpsOnLogicalRouterCommand.class);
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
final final List<LogicalRouterPort> list = Collections.EMPTY_LIST;
NiciraNvpList<LogicalRouterPort> list = mock(NiciraNvpList.class);
when(cmd.getLogicalRouterUuid()).thenReturn("aaaaa"); when(cmd.getLogicalRouterUuid()).thenReturn("aaaaa");
when(cmd.getL3GatewayServiceUuid()).thenReturn("bbbbb"); when(cmd.getL3GatewayServiceUuid()).thenReturn("bbbbb");
@ -472,8 +451,7 @@ public class NiciraNvpResourceTest {
// Mock the api find call // Mock the api find call
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
final final List<NatRule> storedRules = Collections.EMPTY_LIST;
NiciraNvpList<NatRule> storedRules = mock(NiciraNvpList.class);
when(nvpApi.findNatRulesByLogicalRouterUuid("aaaaa")).thenReturn(storedRules); when(nvpApi.findNatRulesByLogicalRouterUuid("aaaaa")).thenReturn(storedRules);
// Mock the api create calls // Mock the api create calls
@ -522,11 +500,7 @@ public class NiciraNvpResourceTest {
when(nvpApi.createLogicalRouterNatRule(eq("aaaaa"), (NatRule) any())).thenReturn(rulepair[0]).thenReturn(rulepair[1]); when(nvpApi.createLogicalRouterNatRule(eq("aaaaa"), (NatRule) any())).thenReturn(rulepair[0]).thenReturn(rulepair[1]);
// Mock the api find call // Mock the api find call
@SuppressWarnings("unchecked") final List<NatRule> storedRules = Arrays.asList(rulepair);
final
NiciraNvpList<NatRule> storedRules = mock(NiciraNvpList.class);
when(storedRules.getResultCount()).thenReturn(2);
when(storedRules.getResults()).thenReturn(Arrays.asList(rulepair));
when(nvpApi.findNatRulesByLogicalRouterUuid("aaaaa")).thenReturn(storedRules); when(nvpApi.findNatRulesByLogicalRouterUuid("aaaaa")).thenReturn(storedRules);
final ConfigureStaticNatRulesOnLogicalRouterAnswer a = (ConfigureStaticNatRulesOnLogicalRouterAnswer) resource.executeRequest(cmd); final ConfigureStaticNatRulesOnLogicalRouterAnswer a = (ConfigureStaticNatRulesOnLogicalRouterAnswer) resource.executeRequest(cmd);
@ -571,11 +545,7 @@ public class NiciraNvpResourceTest {
when(nvpApi.createLogicalRouterNatRule(eq("aaaaa"), (NatRule) any())).thenReturn(rulepair[0]).thenReturn(rulepair[1]); when(nvpApi.createLogicalRouterNatRule(eq("aaaaa"), (NatRule) any())).thenReturn(rulepair[0]).thenReturn(rulepair[1]);
// Mock the api find call // Mock the api find call
@SuppressWarnings("unchecked") final List<NatRule> storedRules = Arrays.asList(rulepair);
final
NiciraNvpList<NatRule> storedRules = mock(NiciraNvpList.class);
when(storedRules.getResultCount()).thenReturn(2);
when(storedRules.getResults()).thenReturn(Arrays.asList(rulepair));
when(nvpApi.findNatRulesByLogicalRouterUuid("aaaaa")).thenReturn(storedRules); when(nvpApi.findNatRulesByLogicalRouterUuid("aaaaa")).thenReturn(storedRules);
final ConfigureStaticNatRulesOnLogicalRouterAnswer a = (ConfigureStaticNatRulesOnLogicalRouterAnswer) resource.executeRequest(cmd); final ConfigureStaticNatRulesOnLogicalRouterAnswer a = (ConfigureStaticNatRulesOnLogicalRouterAnswer) resource.executeRequest(cmd);
@ -616,9 +586,7 @@ public class NiciraNvpResourceTest {
// Mock the api find call // Mock the api find call
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
final final List<NatRule> storedRules = Collections.EMPTY_LIST;
NiciraNvpList<NatRule> storedRules = mock(NiciraNvpList.class);
when(storedRules.getResultCount()).thenReturn(0);
when(nvpApi.findNatRulesByLogicalRouterUuid("aaaaa")).thenReturn(storedRules); when(nvpApi.findNatRulesByLogicalRouterUuid("aaaaa")).thenReturn(storedRules);
final ConfigureStaticNatRulesOnLogicalRouterAnswer a = (ConfigureStaticNatRulesOnLogicalRouterAnswer) resource.executeRequest(cmd); final ConfigureStaticNatRulesOnLogicalRouterAnswer a = (ConfigureStaticNatRulesOnLogicalRouterAnswer) resource.executeRequest(cmd);
@ -644,8 +612,7 @@ public class NiciraNvpResourceTest {
// Mock the api find call // Mock the api find call
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
final final List<NatRule> storedRules = Collections.EMPTY_LIST;
NiciraNvpList<NatRule> storedRules = mock(NiciraNvpList.class);
when(nvpApi.findNatRulesByLogicalRouterUuid("aaaaa")).thenReturn(storedRules); when(nvpApi.findNatRulesByLogicalRouterUuid("aaaaa")).thenReturn(storedRules);
// Mock the api create calls // Mock the api create calls
@ -694,11 +661,7 @@ public class NiciraNvpResourceTest {
when(nvpApi.createLogicalRouterNatRule(eq("aaaaa"), (NatRule) any())).thenReturn(rulepair[0]).thenReturn(rulepair[1]); when(nvpApi.createLogicalRouterNatRule(eq("aaaaa"), (NatRule) any())).thenReturn(rulepair[0]).thenReturn(rulepair[1]);
// Mock the api find call // Mock the api find call
@SuppressWarnings("unchecked") final List<NatRule> storedRules = Arrays.asList(rulepair);
final
NiciraNvpList<NatRule> storedRules = mock(NiciraNvpList.class);
when(storedRules.getResultCount()).thenReturn(2);
when(storedRules.getResults()).thenReturn(Arrays.asList(rulepair));
when(nvpApi.findNatRulesByLogicalRouterUuid("aaaaa")).thenReturn(storedRules); when(nvpApi.findNatRulesByLogicalRouterUuid("aaaaa")).thenReturn(storedRules);
final ConfigurePortForwardingRulesOnLogicalRouterAnswer a = (ConfigurePortForwardingRulesOnLogicalRouterAnswer) resource.executeRequest(cmd); final ConfigurePortForwardingRulesOnLogicalRouterAnswer a = (ConfigurePortForwardingRulesOnLogicalRouterAnswer) resource.executeRequest(cmd);
@ -743,11 +706,7 @@ public class NiciraNvpResourceTest {
when(nvpApi.createLogicalRouterNatRule(eq("aaaaa"), (NatRule) any())).thenReturn(rulepair[0]).thenReturn(rulepair[1]); when(nvpApi.createLogicalRouterNatRule(eq("aaaaa"), (NatRule) any())).thenReturn(rulepair[0]).thenReturn(rulepair[1]);
// Mock the api find call // Mock the api find call
@SuppressWarnings("unchecked") final List<NatRule> storedRules = Arrays.asList(rulepair);
final
NiciraNvpList<NatRule> storedRules = mock(NiciraNvpList.class);
when(storedRules.getResultCount()).thenReturn(2);
when(storedRules.getResults()).thenReturn(Arrays.asList(rulepair));
when(nvpApi.findNatRulesByLogicalRouterUuid("aaaaa")).thenReturn(storedRules); when(nvpApi.findNatRulesByLogicalRouterUuid("aaaaa")).thenReturn(storedRules);
final ConfigurePortForwardingRulesOnLogicalRouterAnswer a = (ConfigurePortForwardingRulesOnLogicalRouterAnswer) resource.executeRequest(cmd); final ConfigurePortForwardingRulesOnLogicalRouterAnswer a = (ConfigurePortForwardingRulesOnLogicalRouterAnswer) resource.executeRequest(cmd);
@ -788,9 +747,7 @@ public class NiciraNvpResourceTest {
// Mock the api find call // Mock the api find call
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
final final List<NatRule> storedRules = Collections.EMPTY_LIST;
NiciraNvpList<NatRule> storedRules = mock(NiciraNvpList.class);
when(storedRules.getResultCount()).thenReturn(0);
when(nvpApi.findNatRulesByLogicalRouterUuid("aaaaa")).thenReturn(storedRules); when(nvpApi.findNatRulesByLogicalRouterUuid("aaaaa")).thenReturn(storedRules);
final ConfigurePortForwardingRulesOnLogicalRouterAnswer a = (ConfigurePortForwardingRulesOnLogicalRouterAnswer) resource.executeRequest(cmd); final ConfigurePortForwardingRulesOnLogicalRouterAnswer a = (ConfigurePortForwardingRulesOnLogicalRouterAnswer) resource.executeRequest(cmd);
@ -816,8 +773,7 @@ public class NiciraNvpResourceTest {
// Mock the api find call // Mock the api find call
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
final final List<NatRule> storedRules = Collections.EMPTY_LIST;
NiciraNvpList<NatRule> storedRules = mock(NiciraNvpList.class);
when(nvpApi.findNatRulesByLogicalRouterUuid("aaaaa")).thenReturn(storedRules); when(nvpApi.findNatRulesByLogicalRouterUuid("aaaaa")).thenReturn(storedRules);
// Mock the api create calls // Mock the api create calls

View File

@ -0,0 +1,43 @@
//
// 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.utils.rest;
import static org.hamcrest.Matchers.equalTo;
import static org.mockito.Matchers.argThat;
import org.apache.http.client.methods.HttpUriRequest;
import org.hamcrest.FeatureMatcher;
import org.hamcrest.Matcher;
public class HttpUriRequestPathMatcher extends FeatureMatcher<HttpUriRequest, String> {
public static HttpUriRequest aPath(final String path) {
return argThat(new HttpUriRequestPathMatcher(equalTo(path), "path", "path"));
}
public HttpUriRequestPathMatcher(final Matcher<? super String> subMatcher, final String featureDescription, final String featureName) {
super(subMatcher, featureDescription, featureName);
}
@Override
protected String featureValueOf(final HttpUriRequest actual) {
return actual.getURI().getPath();
}
}