blob: 01f52dcbfa770f413f07551cbdcc2433e81222ec [file] [log] [blame]
/*
* Copyright 2016-present Open Networking Laboratory
*
* Licensed 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 org.onosproject.ospf.controller.impl;
import com.fasterxml.jackson.databind.JsonNode;
import com.google.common.collect.Sets;
import org.apache.felix.scr.annotations.Activate;
import org.apache.felix.scr.annotations.Component;
import org.apache.felix.scr.annotations.Deactivate;
import org.apache.felix.scr.annotations.Reference;
import org.apache.felix.scr.annotations.ReferenceCardinality;
import org.apache.felix.scr.annotations.Service;
import org.onosproject.net.driver.DriverService;
import org.onosproject.ospf.controller.OspfAgent;
import org.onosproject.ospf.controller.OspfController;
import org.onosproject.ospf.controller.OspfLinkListener;
import org.onosproject.ospf.controller.OspfLinkTed;
import org.onosproject.ospf.controller.OspfProcess;
import org.onosproject.ospf.controller.OspfRouter;
import org.onosproject.ospf.controller.OspfRouterListener;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
/**
* Representation of an OSPF controller implementation.
* Serves as a one stop shop for obtaining OSPF devices and (un)register listeners on OSPF events
*/
@Component(immediate = true)
@Service
public class OspfControllerImpl implements OspfController {
protected static final Logger log = LoggerFactory.getLogger(OspfControllerImpl.class);
private final Controller ctrl = new Controller();
@Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
protected DriverService driverService;
protected Set<OspfRouterListener> ospfRouterListener = new HashSet<>();
protected Set<OspfLinkListener> ospfLinkListener = Sets.newHashSet();
protected OspfAgent agent = new InternalDeviceConfig();
@Activate
public void activate() {
log.info("OSPFControllerImpl activate...!!!");
ctrl.start(agent, driverService);
log.info("Started");
}
@Deactivate
public void deactivate() {
ctrl.stop();
log.info("Stopped");
}
@Override
public void addRouterListener(OspfRouterListener listener) {
if (!ospfRouterListener.contains(listener)) {
this.ospfRouterListener.add(listener);
}
}
@Override
public void removeRouterListener(OspfRouterListener listener) {
this.ospfRouterListener.remove(listener);
}
@Override
public void addLinkListener(OspfLinkListener listener) {
ospfLinkListener.add(listener);
}
@Override
public void removeLinkListener(OspfLinkListener listener) {
ospfLinkListener.remove(listener);
}
@Override
public Set<OspfRouterListener> listener() {
return ospfRouterListener;
}
@Override
public Set<OspfLinkListener> linkListener() {
return ospfLinkListener;
}
@Override
public List<OspfProcess> getAllConfiguredProcesses() {
List<OspfProcess> processes = ctrl.getAllConfiguredProcesses();
return processes;
}
@Override
public void updateConfig(JsonNode processesNode) {
try {
List<OspfProcess> ospfProcesses = OspfConfigUtil.processes(processesNode);
//if there is interface details then update configuration
if (!ospfProcesses.isEmpty() &&
ospfProcesses.get(0).areas() != null && !ospfProcesses.get(0).areas().isEmpty() &&
ospfProcesses.get(0).areas().get(0) != null &&
!ospfProcesses.get(0).areas().get(0).ospfInterfaceList().isEmpty()) {
ctrl.updateConfig(ospfProcesses);
}
} catch (Exception e) {
log.debug("Error::updateConfig::{}", e.getMessage());
}
}
@Override
public void deleteConfig(List<OspfProcess> processes, String attribute) {
}
/**
* Notifier for internal OSPF device and link changes.
*/
private class InternalDeviceConfig implements OspfAgent {
@Override
public boolean addConnectedRouter(OspfRouter ospfRouter) {
for (OspfRouterListener l : listener()) {
l.routerAdded(ospfRouter);
}
return true;
}
@Override
public void removeConnectedRouter(OspfRouter ospfRouter) {
for (OspfRouterListener l : listener()) {
l.routerRemoved(ospfRouter);
}
}
@Override
public void addLink(OspfRouter ospfRouter, OspfLinkTed ospfLinkTed) {
for (OspfLinkListener l : linkListener()) {
l.addLink(ospfRouter, ospfLinkTed);
}
}
@Override
public void deleteLink(OspfRouter ospfRouter, OspfLinkTed ospfLinkTed) {
for (OspfLinkListener l : linkListener()) {
l.deleteLink(ospfRouter, ospfLinkTed);
}
}
}
}