*/
package org.opendaylight.netvirt.neutronvpn.evpn.manager;
-import com.google.common.base.Optional;
+import com.google.common.util.concurrent.ListenableFuture;
import com.google.common.util.concurrent.SettableFuture;
import java.util.ArrayList;
import java.util.List;
-import java.util.concurrent.Future;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
-import org.opendaylight.controller.md.sal.common.api.data.ReadFailedException;
+import java.util.Optional;
+import java.util.concurrent.ExecutionException;
+import java.util.function.Consumer;
import org.opendaylight.genius.datastoreutils.SingleTransactionDataBroker;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
import org.opendaylight.netvirt.neutronvpn.NeutronvpnManager;
import org.opendaylight.netvirt.neutronvpn.NeutronvpnUtils;
import org.opendaylight.netvirt.vpnmanager.api.VpnHelper;
-import org.opendaylight.yang.gen.v1.urn.huawei.params.xml.ns.yang.l3vpn.rev140815.vpn.af.config.vpntargets.VpnTarget;
-import org.opendaylight.yang.gen.v1.urn.huawei.params.xml.ns.yang.l3vpn.rev140815.vpn.instances.VpnInstance;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.Uuid;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.neutronvpn.l3vpn.rev200204.vpn.instances.VpnInstance;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.neutronvpn.l3vpn.rev200204.vpn.instances.vpn.instance.vpntargets.VpnTarget;
import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.neutronvpn.rev150602.CreateEVPNInput;
import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.neutronvpn.rev150602.CreateEVPNOutput;
import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.neutronvpn.rev150602.CreateEVPNOutputBuilder;
import org.opendaylight.yangtools.yang.common.RpcResultBuilder;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+import org.slf4j.helpers.FormattingTuple;
+import org.slf4j.helpers.MessageFormatter;
public class NeutronEvpnManager {
}
@SuppressWarnings("checkstyle:IllegalCatch")
- public Future<RpcResult<CreateEVPNOutput>> createEVPN(CreateEVPNInput input) {
+ public ListenableFuture<RpcResult<CreateEVPNOutput>> createEVPN(CreateEVPNInput input) {
CreateEVPNOutputBuilder opBuilder = new CreateEVPNOutputBuilder();
SettableFuture<RpcResult<CreateEVPNOutput>> result = SettableFuture.create();
List<RpcError> errorList = new ArrayList<>();
int failurecount = 0;
- int warningcount = 0;
List<String> existingRDs = neutronvpnUtils.getExistingRDs();
- List<Evpn> vpns = input.getEvpn();
- for (Evpn vpn : vpns) {
+ for (Evpn vpn : input.nonnullEvpn()) {
if (vpn.getRouteDistinguisher() == null || vpn.getImportRT() == null || vpn.getExportRT() == null) {
- String msg = String.format("Creation of EVPN failed for VPN %s due to absence of RD/iRT/eRT input",
- vpn.getId().getValue());
- LOG.warn(msg);
- RpcError error = RpcResultBuilder.newWarning(RpcError.ErrorType.PROTOCOL, "invalid-input", msg);
- errorList.add(error);
- warningcount++;
+ errorList.add(RpcResultBuilder.newWarning(RpcError.ErrorType.PROTOCOL, "invalid-input",
+ formatAndLog(LOG::warn, "Creation of EVPN failed for VPN {} due to absence of RD/iRT/eRT input",
+ vpn.getId().getValue())));
continue;
}
- VpnInstance.Type vpnInstanceType = VpnInstance.Type.L2;
if (vpn.getRouteDistinguisher().size() > 1) {
- String msg = String.format("Creation of EVPN failed for VPN %s due to multiple RD input %s",
- vpn.getId().getValue(), vpn.getRouteDistinguisher());
- LOG.warn(msg);
- RpcError error = RpcResultBuilder.newWarning(RpcError.ErrorType.PROTOCOL, "invalid-input", msg);
- errorList.add(error);
- warningcount++;
+ errorList.add(RpcResultBuilder.newWarning(RpcError.ErrorType.PROTOCOL, "invalid-input",
+ formatAndLog(LOG::warn, "Creation of EVPN failed for VPN {} due to multiple RD input {}",
+ vpn.getId().getValue(), vpn.getRouteDistinguisher())));
continue;
}
if (existingRDs.contains(vpn.getRouteDistinguisher().get(0))) {
- String msg = String.format("Creation of EVPN failed for VPN %s as another VPN with "
- + "the same RD %s is already configured",
- vpn.getId().getValue(), vpn.getRouteDistinguisher().get(0));
- LOG.warn(msg);
- RpcError error = RpcResultBuilder.newWarning(RpcError.ErrorType.PROTOCOL, "invalid-input", msg);
- errorList.add(error);
- warningcount++;
+ errorList.add(RpcResultBuilder.newWarning(RpcError.ErrorType.PROTOCOL, "invalid-input",
+ formatAndLog(LOG::warn,
+ "Creation of EVPN failed for VPN {} as another VPN with the same RD {} is already "
+ + "configured",
+ vpn.getId().getValue(), vpn.getRouteDistinguisher().get(0))));
continue;
}
try {
- neutronvpnManager.createVpn(vpn.getId(), vpn.getName(), vpn.getTenantId(), vpn.getRouteDistinguisher(),
- vpn.getImportRT(), vpn.getExportRT(), null /*router-id*/, null /*network-id*/,
- vpnInstanceType, 0 /*l2vni*/);
+ List<String> rdList = vpn.getRouteDistinguisher() != null
+ ? new ArrayList<>(vpn.getRouteDistinguisher()) : new ArrayList<>();
+ List<String> importRdList = vpn.getImportRT() != null
+ ? new ArrayList<>(vpn.getImportRT()) : new ArrayList<>();
+ List<String> exportRdList = vpn.getExportRT() != null
+ ? new ArrayList<>(vpn.getExportRT()) : new ArrayList<>();
+ neutronvpnManager.createVpn(vpn.getId(), vpn.getName(), vpn.getTenantId(), rdList,
+ importRdList, exportRdList, null /*router-id*/, null /*network-id*/,
+ true /*isL2Vpn*/, 0 /*l2vni*/);
} catch (Exception ex) {
- String msg = String.format("Creation of EVPN failed for VPN %s", vpn.getId().getValue());
- LOG.error(msg, ex);
- RpcError error = RpcResultBuilder.newError(RpcError.ErrorType.APPLICATION, msg, ex.getMessage());
- errorList.add(error);
+ errorList.add(RpcResultBuilder.newError(RpcError.ErrorType.APPLICATION,
+ formatAndLog(LOG::error, "Creation of EVPN failed for VPN {}", vpn.getId().getValue(), ex),
+ ex.getMessage()));
failurecount++;
}
}
List<String> errorResponseList = new ArrayList<>();
if (!errorList.isEmpty()) {
for (RpcError rpcError : errorList) {
- String errorResponse = String.format("ErrorType: %s, ErrorTag: %s, ErrorMessage: %s", rpcError
- .getErrorType(), rpcError.getTag(), rpcError.getMessage());
- errorResponseList.add(errorResponse);
+ errorResponseList.add("ErrorType: " + rpcError.getErrorType() + ", ErrorTag: " + rpcError.getTag()
+ + ", ErrorMessage: " + rpcError.getMessage());
}
} else {
errorResponseList.add("EVPN creation successful with no errors");
}
opBuilder.setResponse(errorResponseList);
- result.set(RpcResultBuilder.<CreateEVPNOutput>success().withResult(opBuilder.build()).build());
+ result.set(RpcResultBuilder.success(opBuilder.build()).build());
}
return result;
}
- public Future<RpcResult<GetEVPNOutput>> getEVPN(GetEVPNInput input) {
+ public ListenableFuture<RpcResult<GetEVPNOutput>> getEVPN(GetEVPNInput input) {
GetEVPNOutputBuilder opBuilder = new GetEVPNOutputBuilder();
SettableFuture<RpcResult<GetEVPNOutput>> result = SettableFuture.create();
Uuid inputVpnId = input.getId();
vpns = VpnHelper.getAllVpnInstances(dataBroker);
if (!vpns.isEmpty()) {
for (VpnInstance vpn : vpns) {
- if (vpn.getIpv4Family().getRouteDistinguisher() != null
- && vpn.getType() == VpnInstance.Type.L2) {
+ if (vpn.getRouteDistinguisher() != null
+ && vpn.isL2vpn()) {
vpns.add(vpn);
}
}
} else {
// No VPN present
- result.set(RpcResultBuilder.<GetEVPNOutput>success().withResult(opBuilder.build()).build());
+ result.set(RpcResultBuilder.success(opBuilder.build()).build());
return result;
}
} else {
String name = inputVpnId.getValue();
VpnInstance vpnInstance = VpnHelper.getVpnInstance(dataBroker, name);
- if (vpnInstance != null && vpnInstance.getIpv4Family().getRouteDistinguisher() != null
- && vpnInstance.getType() == VpnInstance.Type.L2) {
+ if (vpnInstance != null && vpnInstance.getRouteDistinguisher() != null
+ && vpnInstance.isL2vpn()) {
vpns.add(vpnInstance);
} else {
- String message = String.format("GetEVPN failed because VPN %s is not present", name);
- LOG.error(message);
result.set(RpcResultBuilder.<GetEVPNOutput>failed().withWarning(RpcError.ErrorType.PROTOCOL,
- "invalid-value", message).build());
+ "invalid-value",
+ formatAndLog(LOG::error, "GetEVPN failed because VPN {} is not present", name)).build());
}
}
List<EvpnInstances> evpnList = new ArrayList<>();
InstanceIdentifier<VpnMap> vpnMapIdentifier = InstanceIdentifier.builder(VpnMaps.class).child(VpnMap
.class, new VpnMapKey(vpnId)).build();
EvpnInstancesBuilder evpn = new EvpnInstancesBuilder();
- List<String> rd = vpnInstance.getIpv4Family().getRouteDistinguisher();
- List<VpnTarget> vpnTargetList = vpnInstance.getIpv4Family().getVpnTargets().getVpnTarget();
+ List<String> rd = vpnInstance.getRouteDistinguisher();
List<String> ertList = new ArrayList<>();
List<String> irtList = new ArrayList<>();
- for (VpnTarget vpnTarget : vpnTargetList) {
+ for (VpnTarget vpnTarget : vpnInstance.getVpnTargets().nonnullVpnTarget()) {
if (vpnTarget.getVrfRTType() == VpnTarget.VrfRTType.ExportExtcommunity) {
ertList.add(vpnTarget.getVrfRTValue());
}
VpnMap vpnMap = optionalVpnMap.get();
evpn.setTenantId(vpnMap.getTenantId()).setName(vpnMap.getName());
}
- } catch (ReadFailedException e) {
+ } catch (ExecutionException | InterruptedException e) {
LOG.error("Error reading the VPN map for {}", vpnMapIdentifier, e);
result.set(RpcResultBuilder.<GetEVPNOutput>failed().withError(RpcError.ErrorType.APPLICATION,
"Error reading the VPN map for " + vpnMapIdentifier, e).build());
}
opBuilder.setEvpnInstances(evpnList);
- result.set(RpcResultBuilder.<GetEVPNOutput>success().withResult(opBuilder.build()).build());
+ result.set(RpcResultBuilder.success(opBuilder.build()).build());
return result;
}
- public Future<RpcResult<DeleteEVPNOutput>> deleteEVPN(DeleteEVPNInput input) {
- DeleteEVPNOutputBuilder opBuilder = new DeleteEVPNOutputBuilder();
- SettableFuture<RpcResult<DeleteEVPNOutput>> result = SettableFuture.create();
+ public ListenableFuture<RpcResult<DeleteEVPNOutput>> deleteEVPN(DeleteEVPNInput input) {
List<RpcError> errorList = new ArrayList<>();
- int failurecount = 0;
- int warningcount = 0;
- List<Uuid> vpns = input.getId();
- for (Uuid vpn : vpns) {
- RpcError error;
- String msg;
- VpnInstance vpnInstance = VpnHelper.getVpnInstance(dataBroker, vpn.getValue());
- if (vpnInstance != null) {
- neutronvpnManager.removeVpn(vpn);
- } else {
- msg = String.format("EVPN with vpnid: %s does not exist", vpn.getValue());
- LOG.warn(msg);
- error = RpcResultBuilder.newWarning(RpcError.ErrorType.PROTOCOL, "invalid-value", msg);
- errorList.add(error);
- warningcount++;
+ if (input.getId() != null) {
+ for (Uuid vpn : input.getId()) {
+ VpnInstance vpnInstance = VpnHelper.getVpnInstance(dataBroker, vpn.getValue());
+ if (vpnInstance != null) {
+ neutronvpnManager.removeVpn(vpn);
+ } else {
+ errorList.add(RpcResultBuilder.newWarning(RpcError.ErrorType.PROTOCOL, "invalid-value",
+ formatAndLog(LOG::warn, "EVPN with vpnid: {} does not exist", vpn.getValue())));
+ }
}
}
- if (failurecount != 0) {
- result.set(RpcResultBuilder.<DeleteEVPNOutput>failed().withRpcErrors(errorList).build());
- } else {
- List<String> errorResponseList = new ArrayList<>();
- if (!errorList.isEmpty()) {
- for (RpcError rpcError : errorList) {
- String errorResponse = String.format("ErrorType: %s, ErrorTag: %s, ErrorMessage: %s", rpcError
- .getErrorType(), rpcError.getTag(), rpcError.getMessage());
- errorResponseList.add(errorResponse);
- }
- } else {
- errorResponseList.add("Deletion of EVPN operation successful");
+ List<String> errorResponseList = new ArrayList<>();
+ if (!errorList.isEmpty()) {
+ for (RpcError rpcError : errorList) {
+ errorResponseList.add("ErrorType: " + rpcError.getErrorType() + ", ErrorTag: " + rpcError.getTag()
+ + ", ErrorMessage: " + rpcError.getMessage());
}
- opBuilder.setResponse(errorResponseList);
- result.set(RpcResultBuilder.<DeleteEVPNOutput>success().withResult(opBuilder.build()).build());
+ } else {
+ errorResponseList.add("Deletion of EVPN operation successful");
}
+ DeleteEVPNOutputBuilder opBuilder = new DeleteEVPNOutputBuilder();
+ opBuilder.setResponse(errorResponseList);
+ SettableFuture<RpcResult<DeleteEVPNOutput>> result = SettableFuture.create();
+ result.set(RpcResultBuilder.success(opBuilder.build()).build());
return result;
}
+
+ private String formatAndLog(Consumer<String> logger, String template, Object arg) {
+ return logAndReturnMessage(logger, MessageFormatter.format(template, arg));
+ }
+
+ private String formatAndLog(Consumer<String> logger, String template, Object arg1, Object arg2) {
+ return logAndReturnMessage(logger, MessageFormatter.format(template, arg1, arg2));
+ }
+
+ private String logAndReturnMessage(Consumer<String> logger, FormattingTuple tuple) {
+ String message = tuple.getMessage();
+ logger.accept(message);
+ return message;
+ }
}