CLOUDSTACK-8590 - Refactoring NiciraNVP resource

- Refactoring NiciraNvpResource
   - Added NiciraNvpUtilities and NiciraNvpCreateLogicalSwitchCommandWrapper
   - Removing 1 execute methods form NiciraNvpResource
   - Added 1 unit test

Signed-off-by: wilderrodrigues <wrodrigues@schubergphilis.com>
This commit is contained in:
wilderrodrigues 2015-06-23 10:47:23 +02:00
parent 6a51294d19
commit 27c9651b32
4 changed files with 176 additions and 38 deletions

View File

@ -38,8 +38,6 @@ import com.cloud.agent.api.ConfigureStaticNatRulesOnLogicalRouterAnswer;
import com.cloud.agent.api.ConfigureStaticNatRulesOnLogicalRouterCommand;
import com.cloud.agent.api.CreateLogicalRouterAnswer;
import com.cloud.agent.api.CreateLogicalRouterCommand;
import com.cloud.agent.api.CreateLogicalSwitchAnswer;
import com.cloud.agent.api.CreateLogicalSwitchCommand;
import com.cloud.agent.api.CreateLogicalSwitchPortAnswer;
import com.cloud.agent.api.CreateLogicalSwitchPortCommand;
import com.cloud.agent.api.DeleteLogicalRouterAnswer;
@ -64,7 +62,6 @@ import com.cloud.network.nicira.DestinationNatRule;
import com.cloud.network.nicira.L3GatewayAttachment;
import com.cloud.network.nicira.LogicalRouter;
import com.cloud.network.nicira.LogicalRouterPort;
import com.cloud.network.nicira.LogicalSwitch;
import com.cloud.network.nicira.LogicalSwitchPort;
import com.cloud.network.nicira.Match;
import com.cloud.network.nicira.NatRule;
@ -76,21 +73,22 @@ import com.cloud.network.nicira.PatchAttachment;
import com.cloud.network.nicira.RouterNextHop;
import com.cloud.network.nicira.SingleDefaultRouteImplicitRoutingConfig;
import com.cloud.network.nicira.SourceNatRule;
import com.cloud.network.nicira.TransportZoneBinding;
import com.cloud.network.nicira.VifAttachment;
import com.cloud.resource.ServerResource;
public class NiciraNvpResource implements ServerResource {
private static final int NAME_MAX_LEN = 40;
private static final Logger s_logger = Logger.getLogger(NiciraNvpResource.class);
public static final int NAME_MAX_LEN = 40;
private String name;
private String guid;
private String zoneId;
private int numRetries;
private NiciraNvpApi niciraNvpApi;
private NiciraNvpUtilities niciraNvpUtilities;
protected NiciraNvpApi createNiciraNvpApi() {
return new NiciraNvpApi();
@ -131,6 +129,8 @@ public class NiciraNvpResource implements ServerResource {
throw new ConfigurationException("Unable to find admin password");
}
niciraNvpUtilities = NiciraNvpUtilities.getInstance();
niciraNvpApi = createNiciraNvpApi();
niciraNvpApi.setControllerAddress(ip);
niciraNvpApi.setAdminCredentials(adminuser, adminpass);
@ -138,6 +138,18 @@ public class NiciraNvpResource implements ServerResource {
return true;
}
public NiciraNvpApi getNiciraNvpApi() {
return niciraNvpApi;
}
public NiciraNvpUtilities getNiciraNvpUtilities() {
return niciraNvpUtilities;
}
public int getNumRetries() {
return numRetries;
}
@Override
public boolean start() {
return true;
@ -202,9 +214,7 @@ public class NiciraNvpResource implements ServerResource {
// [TODO] Remove when all the commands are refactored.
}
if (cmd instanceof CreateLogicalSwitchCommand) {
return executeRequest((CreateLogicalSwitchCommand)cmd, numRetries);
} else if (cmd instanceof DeleteLogicalSwitchCommand) {
if (cmd instanceof DeleteLogicalSwitchCommand) {
return executeRequest((DeleteLogicalSwitchCommand)cmd, numRetries);
} else if (cmd instanceof CreateLogicalSwitchPortCommand) {
return executeRequest((CreateLogicalSwitchPortCommand)cmd, numRetries);
@ -242,34 +252,6 @@ public class NiciraNvpResource implements ServerResource {
public void setAgentControl(final IAgentControl agentControl) {
}
private Answer executeRequest(final CreateLogicalSwitchCommand cmd, int numRetries) {
LogicalSwitch logicalSwitch = new LogicalSwitch();
logicalSwitch.setDisplayName(truncate("lswitch-" + cmd.getName(), NAME_MAX_LEN));
logicalSwitch.setPortIsolationEnabled(false);
// Set transport binding
final List<TransportZoneBinding> ltzb = new ArrayList<TransportZoneBinding>();
ltzb.add(new TransportZoneBinding(cmd.getTransportUuid(), cmd.getTransportType()));
logicalSwitch.setTransportZones(ltzb);
// Tags set to scope cs_account and account name
final List<NiciraNvpTag> tags = new ArrayList<NiciraNvpTag>();
tags.add(new NiciraNvpTag("cs_account", cmd.getOwnerName()));
logicalSwitch.setTags(tags);
try {
logicalSwitch = niciraNvpApi.createLogicalSwitch(logicalSwitch);
return new CreateLogicalSwitchAnswer(cmd, true, "Logicalswitch " + logicalSwitch.getUuid() + " created", logicalSwitch.getUuid());
} catch (final NiciraNvpApiException e) {
if (numRetries > 0) {
return retry(cmd, --numRetries);
} else {
return new CreateLogicalSwitchAnswer(cmd, e);
}
}
}
private Answer executeRequest(final DeleteLogicalSwitchCommand cmd, int numRetries) {
try {
niciraNvpApi.deleteLogicalSwitch(cmd.getLogicalSwitchUuid());
@ -646,7 +628,7 @@ public class NiciraNvpResource implements ServerResource {
}
private Answer retry(final Command cmd, final int numRetries) {
public Answer retry(final Command cmd, final int numRetries) {
s_logger.warn("Retrying " + cmd.getClass().getSimpleName() + ". Number of retries remaining: " + numRetries);
return executeRequest(cmd, numRetries);
}
@ -687,7 +669,7 @@ public class NiciraNvpResource implements ServerResource {
return natRuleStr.toString();
}
private String truncate(final String string, final int length) {
public String truncate(final String string, final int length) {
if (string.length() <= length) {
return string;
} else {

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.resource;
import com.cloud.network.nicira.LogicalSwitch;
public class NiciraNvpUtilities {
private static NiciraNvpUtilities instance;
static {
instance = new NiciraNvpUtilities();
}
private NiciraNvpUtilities() {
}
public static NiciraNvpUtilities getInstance() {
return instance;
}
public LogicalSwitch createLogicalSwitch() {
final LogicalSwitch logicalSwitch = new LogicalSwitch();
return logicalSwitch;
}
}

View File

@ -0,0 +1,73 @@
//
// 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.resource.wrapper;
import java.util.ArrayList;
import java.util.List;
import com.cloud.agent.api.Answer;
import com.cloud.agent.api.CreateLogicalSwitchAnswer;
import com.cloud.agent.api.CreateLogicalSwitchCommand;
import com.cloud.network.nicira.LogicalSwitch;
import com.cloud.network.nicira.NiciraNvpApi;
import com.cloud.network.nicira.NiciraNvpApiException;
import com.cloud.network.nicira.NiciraNvpTag;
import com.cloud.network.nicira.TransportZoneBinding;
import com.cloud.network.resource.NiciraNvpResource;
import com.cloud.network.resource.NiciraNvpUtilities;
import com.cloud.resource.CommandWrapper;
import com.cloud.resource.ResourceWrapper;
@ResourceWrapper(handles = CreateLogicalSwitchCommand.class)
public final class NiciraNvpCreateLogicalSwitchCommandWrapper extends CommandWrapper<CreateLogicalSwitchCommand, Answer, NiciraNvpResource> {
@Override
public Answer execute(final CreateLogicalSwitchCommand command, final NiciraNvpResource niciraNvpResource) {
final NiciraNvpUtilities niciraNvpUtilities = niciraNvpResource.getNiciraNvpUtilities();
LogicalSwitch logicalSwitch = niciraNvpUtilities.createLogicalSwitch();
logicalSwitch.setDisplayName(niciraNvpResource.truncate("lswitch-" + command.getName(), NiciraNvpResource.NAME_MAX_LEN));
logicalSwitch.setPortIsolationEnabled(false);
// Set transport binding
final List<TransportZoneBinding> ltzb = new ArrayList<TransportZoneBinding>();
ltzb.add(new TransportZoneBinding(command.getTransportUuid(), command.getTransportType()));
logicalSwitch.setTransportZones(ltzb);
// Tags set to scope cs_account and account name
final List<NiciraNvpTag> tags = new ArrayList<NiciraNvpTag>();
tags.add(new NiciraNvpTag("cs_account", command.getOwnerName()));
logicalSwitch.setTags(tags);
try {
final NiciraNvpApi niciraNvpApi = niciraNvpResource.getNiciraNvpApi();
logicalSwitch = niciraNvpApi.createLogicalSwitch(logicalSwitch);
final String switchUuid = logicalSwitch.getUuid();
return new CreateLogicalSwitchAnswer(command, true, "Logicalswitch " + switchUuid + " created", switchUuid);
} catch (final NiciraNvpApiException e) {
int numRetries = niciraNvpResource.getNumRetries();
if (numRetries > 0) {
return niciraNvpResource.retry(command, --numRetries);
} else {
return new CreateLogicalSwitchAnswer(command, e);
}
}
}
}

View File

@ -21,14 +21,20 @@ package com.cloud.network.resource;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import static org.mockito.Mockito.when;
import org.junit.Test;
import org.mockito.Mock;
import org.mockito.Mockito;
import com.cloud.agent.api.Answer;
import com.cloud.agent.api.CreateLogicalSwitchCommand;
import com.cloud.agent.api.MaintainCommand;
import com.cloud.agent.api.ReadyCommand;
import com.cloud.network.nicira.LogicalSwitch;
import com.cloud.network.nicira.NiciraNvpApi;
import com.cloud.network.nicira.NiciraNvpApiException;
public class NiciraNvpRequestWrapperTest {
@ -58,4 +64,39 @@ public class NiciraNvpRequestWrapperTest {
assertTrue(answer.getResult());
}
@Test
public void testCreateLogicalSwitchCommandWrapper() {
final NiciraNvpApi niciraNvpApi = Mockito.mock(NiciraNvpApi.class);
final NiciraNvpUtilities niciraNvpUtilities = Mockito.mock(NiciraNvpUtilities.class);
final LogicalSwitch logicalSwitch = Mockito.mock(LogicalSwitch.class);
final String transportUuid = "d2e05a9e-7120-4487-a5fc-414ab36d9345";
final String transportType = "stt";
final String name = "logicalswitch";
final String ownerName = "owner";
final CreateLogicalSwitchCommand command = new CreateLogicalSwitchCommand(transportUuid, transportType, name, ownerName);
final String truncated = "lswitch-" + command.getName();
when(niciraNvpResource.getNiciraNvpUtilities()).thenReturn(niciraNvpUtilities);
when(niciraNvpUtilities.createLogicalSwitch()).thenReturn(logicalSwitch);
when(niciraNvpResource.truncate("lswitch-" + command.getName(), NiciraNvpResource.NAME_MAX_LEN)).thenReturn(truncated);
when(niciraNvpResource.getNiciraNvpApi()).thenReturn(niciraNvpApi);
try {
when(niciraNvpApi.createLogicalSwitch(logicalSwitch)).thenReturn(logicalSwitch);
when(logicalSwitch.getUuid()).thenReturn(transportUuid);
} catch (final NiciraNvpApiException e) {
fail(e.getMessage());
}
final NiciraNvpRequestWrapper wrapper = NiciraNvpRequestWrapper.getInstance();
assertNotNull(wrapper);
final Answer answer = wrapper.execute(command, niciraNvpResource);
assertTrue(answer.getResult());
}
}