use of org.onosproject.vpls.api.Vpls in project onos by opennetworkinglab.
the class VplsConfigManager method reloadConfiguration.
/**
* Retrieves the VPLS configuration from network configuration.
* Checks difference between new configuration and old configuration.
*/
private synchronized void reloadConfiguration() {
VplsAppConfig vplsAppConfig = configService.getConfig(appId, VplsAppConfig.class);
if (vplsAppConfig == null) {
log.warn(CONFIG_NULL);
// If the config is null, removes all VPLS.
vpls.removeAllVpls();
return;
}
// If there exists a update time in the configuration; it means the
// configuration was pushed by VPLS store; ignore this configuration.
long updateTime = vplsAppConfig.updateTime();
if (updateTime != -1L) {
return;
}
Collection<VplsData> oldVplses = vpls.getAllVpls();
Collection<VplsData> newVplses;
// Generates collection of new VPLSs
newVplses = vplsAppConfig.vplss().stream().map(vplsConfig -> {
Set<Interface> interfaces = vplsConfig.ifaces().stream().map(this::getInterfaceByName).filter(Objects::nonNull).collect(Collectors.toSet());
VplsData vplsData = VplsData.of(vplsConfig.name(), vplsConfig.encap());
vplsData.addInterfaces(interfaces);
return vplsData;
}).collect(Collectors.toSet());
if (newVplses.containsAll(oldVplses) && oldVplses.containsAll(newVplses)) {
// no update, ignore
return;
}
// To add or update
newVplses.forEach(newVplsData -> {
boolean vplsExists = false;
for (VplsData oldVplsData : oldVplses) {
if (oldVplsData.name().equals(newVplsData.name())) {
vplsExists = true;
// VPLS exists; but need to be updated.
if (!oldVplsData.equals(newVplsData)) {
// Update VPLS
Set<Interface> newInterfaces = newVplsData.interfaces();
Set<Interface> oldInterfaces = oldVplsData.interfaces();
Set<Interface> ifaceToAdd = newInterfaces.stream().filter(iface -> !oldInterfaces.contains(iface)).collect(Collectors.toSet());
Set<Interface> ifaceToRem = oldInterfaces.stream().filter(iface -> !newInterfaces.contains(iface)).collect(Collectors.toSet());
vpls.addInterfaces(oldVplsData, ifaceToAdd);
vpls.removeInterfaces(oldVplsData, ifaceToRem);
vpls.setEncapsulationType(oldVplsData, newVplsData.encapsulationType());
}
}
}
// VPLS not exist; add new VPLS
if (!vplsExists) {
vpls.createVpls(newVplsData.name(), newVplsData.encapsulationType());
vpls.addInterfaces(newVplsData, newVplsData.interfaces());
}
});
// VPLS not exists in old VPLS configuration; remove it.
Set<VplsData> vplsToRemove = Sets.newHashSet();
oldVplses.forEach(oldVpls -> {
Set<String> newVplsNames = newVplses.stream().map(VplsData::name).collect(Collectors.toSet());
if (!newVplsNames.contains(oldVpls.name())) {
// To avoid ConcurrentModificationException; do remove after this
// iteration.
vplsToRemove.add(oldVpls);
}
});
vplsToRemove.forEach(vpls::removeVpls);
}
use of org.onosproject.vpls.api.Vpls in project onos by opennetworkinglab.
the class VplsWebResource method addInterfaces.
/**
* Add new interfaces. Add new interfaces to a Vpls.<br>
*
* @param stream interfaces JSON
* @param vplsName Vpls name
* @return status of the request - CREATED if the JSON is correct,
* BAD_REQUEST if the JSON is invalid
* @onos.rsModel InterfacesPost
*/
@POST
@Path("interfaces/{vplsName}")
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public Response addInterfaces(@PathParam("vplsName") String vplsName, InputStream stream) {
Vpls service = get(Vpls.class);
DeviceService deviceService = get(DeviceService.class);
InterfaceAdminService interfaceService = get(InterfaceAdminService.class);
final VplsData vplsData = nullIsNotFound(service.getVpls(vplsName), VPLS_NOT_FOUND + vplsName);
try {
ObjectNode jsonTree = readTreeFromStream(mapper(), stream);
ArrayNode routesArray = nullIsIllegal((ArrayNode) jsonTree.get(INTERFACES), INTERFACES_KEY_ERROR);
Collection<Interface> interfaceList = new ArrayList<>();
routesArray.forEach(interfJson -> {
Interface inter = codec(Interface.class).decode((ObjectNode) interfJson, this);
nullIsNotFound(deviceService.getDevice(inter.connectPoint().deviceId()), DEVICE_NOT_FOUND + inter.connectPoint().deviceId());
nullIsNotFound(deviceService.getPort(inter.connectPoint()), PORT_NOT_FOUND + inter.connectPoint().port());
interfaceList.add(inter);
interfaceService.add(inter);
});
service.addInterfaces(vplsData, interfaceList);
UriBuilder locationBuilder = uriInfo.getBaseUriBuilder().path(INTERFACES).path(vplsName);
return Response.created(locationBuilder.build()).build();
} catch (IOException e) {
throw new IllegalArgumentException(e.getMessage());
}
}
use of org.onosproject.vpls.api.Vpls in project onos by opennetworkinglab.
the class VplsWebResource method createVpls.
/**
* Creates new vpls. Creates and installs a new Vplps.<br>
*
* @param stream Vpls JSON
* @return status of the request - CREATED if the JSON is correct,
* BAD_REQUEST if the JSON is invalid
* @onos.rsModel VplsPost
*/
@POST
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public Response createVpls(InputStream stream) {
Vpls service = get(Vpls.class);
DeviceService deviceService = get(DeviceService.class);
InterfaceAdminService interfaceService = get(InterfaceAdminService.class);
try {
ObjectNode jsonTree = readTreeFromStream(mapper(), stream);
VplsData vplsData = codec(VplsData.class).decode(jsonTree, this);
vplsData.interfaces().forEach(interf -> {
nullIsNotFound(deviceService.getDevice(interf.connectPoint().deviceId()), DEVICE_NOT_FOUND + interf.connectPoint().deviceId());
nullIsNotFound(deviceService.getPort(interf.connectPoint()), PORT_NOT_FOUND + interf.connectPoint().port());
interfaceService.add(interf);
});
service.addInterfaces(vplsData, vplsData.interfaces());
UriBuilder locationBuilder = uriInfo.getBaseUriBuilder().path(VPLS);
return Response.created(locationBuilder.build()).build();
} catch (IOException e) {
throw new IllegalArgumentException(e.getMessage());
}
}
use of org.onosproject.vpls.api.Vpls in project onos by opennetworkinglab.
the class VplsOptArgCompleter method choices.
@Override
public List<String> choices() {
if (vpls == null) {
vpls = get(Vpls.class);
}
String[] argList = commandLine.getArguments();
if (argList == null) {
return Collections.emptyList();
}
String argOne = argList[1];
VplsCommandEnum vplsCommandEnum = VplsCommandEnum.enumFromString(argOne);
if (vplsCommandEnum != null) {
switch(vplsCommandEnum) {
case ADD_IFACE:
return availableIfaces();
case SET_ENCAP:
return encap();
case REMOVE_IFACE:
return vplsIfaces();
default:
return Collections.emptyList();
}
}
return Collections.emptyList();
}
use of org.onosproject.vpls.api.Vpls in project onos by opennetworkinglab.
the class VplsWebResource method getVplss.
/**
* Gets all Vplss. Returns array of all Vplss in the system.
*
* @return 200 OK with a collection of Vplss
* @onos.rsModel Vplss
*/
@GET
@Produces(MediaType.APPLICATION_JSON)
public Response getVplss() {
ArrayNode vplssNode = root.putArray(VPLSS);
Vpls service = get(Vpls.class);
Collection<VplsData> vplsDatas = service.getAllVpls();
if (!vplsDatas.isEmpty()) {
for (VplsData entry : vplsDatas) {
vplssNode.add(codec(VplsData.class).encode(entry, this));
}
}
return ok(root).build();
}
Aggregations