blob: d143b25ee0853f5b1efe5f49cbbd90a28aa3720b [file] [log] [blame]
Thomas Vachuska781d18b2014-10-27 10:31:25 -07001/*
Thomas Vachuska4f1a60c2014-10-28 13:39:07 -07002 * Copyright 2014 Open Networking Laboratory
Thomas Vachuska781d18b2014-10-27 10:31:25 -07003 *
Thomas Vachuska4f1a60c2014-10-28 13:39:07 -07004 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
Thomas Vachuska781d18b2014-10-27 10:31:25 -07007 *
Thomas Vachuska4f1a60c2014-10-28 13:39:07 -07008 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
Thomas Vachuska781d18b2014-10-27 10:31:25 -070015 */
Jonathan Hart039d2b12014-10-10 09:33:04 -070016package org.onlab.onos.sdnip;
17
18import static org.slf4j.LoggerFactory.getLogger;
19
Jonathan Hart0b04bed2014-10-16 16:39:19 -070020import java.util.Collection;
21
Jonathan Hart039d2b12014-10-10 09:33:04 -070022import org.apache.felix.scr.annotations.Activate;
23import org.apache.felix.scr.annotations.Component;
24import org.apache.felix.scr.annotations.Deactivate;
Jonathan Hartdc711bd2014-10-15 11:24:23 -070025import org.apache.felix.scr.annotations.Reference;
26import org.apache.felix.scr.annotations.ReferenceCardinality;
Jonathan Hart0b04bed2014-10-16 16:39:19 -070027import org.apache.felix.scr.annotations.Service;
Pavlin Radoslavova7243cc2014-11-22 21:38:02 -080028import org.onlab.onos.cluster.ClusterService;
29import org.onlab.onos.cluster.ControllerNode;
30import org.onlab.onos.cluster.LeadershipEvent;
31import org.onlab.onos.cluster.LeadershipEventListener;
Pavlin Radoslavovc91eebe2014-11-25 18:45:46 -080032// import org.onlab.onos.cluster.LeadershipService;
Thomas Vachuskae0f804a2014-10-27 23:40:48 -070033import org.onlab.onos.core.ApplicationId;
34import org.onlab.onos.core.CoreService;
Pavlin Radoslavovc91eebe2014-11-25 18:45:46 -080035import org.onlab.onos.event.EventDeliveryService;
Jonathan Hartdc711bd2014-10-15 11:24:23 -070036import org.onlab.onos.net.host.HostService;
37import org.onlab.onos.net.intent.IntentService;
Jonathan Hart0b04bed2014-10-16 16:39:19 -070038import org.onlab.onos.sdnip.bgp.BgpRouteEntry;
Pavlin Radoslavov0c84da82014-11-07 17:53:34 -080039import org.onlab.onos.sdnip.bgp.BgpSession;
Jonathan Hartab63aac2014-10-16 08:52:55 -070040import org.onlab.onos.sdnip.bgp.BgpSessionManager;
Jonathan Hartbac07a02014-10-13 21:29:54 -070041import org.onlab.onos.sdnip.config.SdnIpConfigReader;
Pavlin Radoslavovc91eebe2014-11-25 18:45:46 -080042import org.onlab.onos.store.hz.StoreService;
Jonathan Hart039d2b12014-10-10 09:33:04 -070043
Pavlin Radoslavova7243cc2014-11-22 21:38:02 -080044import org.slf4j.Logger;
Pavlin Radoslavov8b752442014-11-18 14:34:37 -080045
Jonathan Hart039d2b12014-10-10 09:33:04 -070046/**
Jonathan Hart0b04bed2014-10-16 16:39:19 -070047 * Component for the SDN-IP peering application.
Jonathan Hart039d2b12014-10-10 09:33:04 -070048 */
49@Component(immediate = true)
Jonathan Hart0b04bed2014-10-16 16:39:19 -070050@Service
51public class SdnIp implements SdnIpService {
Jonathan Hart039d2b12014-10-10 09:33:04 -070052
Jonathan Hart31582d12014-10-22 13:52:41 -070053 private static final String SDN_IP_APP = "org.onlab.onos.sdnip";
Pavlin Radoslavov8b752442014-11-18 14:34:37 -080054 // NOTE: Must be 5s for now
55 private static final int LEASE_DURATION_MS = 5 * 1000;
56 private static final int LEASE_EXTEND_RETRY_MAX = 3;
Thomas Vachuskab97cf282014-10-20 23:31:12 -070057
Jonathan Hart039d2b12014-10-10 09:33:04 -070058 private final Logger log = getLogger(getClass());
59
Jonathan Hartdc711bd2014-10-15 11:24:23 -070060 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
Thomas Vachuskab97cf282014-10-20 23:31:12 -070061 protected CoreService coreService;
62
63 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
Jonathan Hartdc711bd2014-10-15 11:24:23 -070064 protected IntentService intentService;
65
66 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
67 protected HostService hostService;
68
Pavlin Radoslavov8b752442014-11-18 14:34:37 -080069 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
Pavlin Radoslavova7243cc2014-11-22 21:38:02 -080070 protected ClusterService clusterService;
71
72 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
Pavlin Radoslavovc91eebe2014-11-25 18:45:46 -080073 protected StoreService storeService;
74
75 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
76 protected EventDeliveryService eventDispatcher;
77
78 // @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
79 protected SdnIpLeadershipService leadershipService;
Pavlin Radoslavov8b752442014-11-18 14:34:37 -080080
Pavlin Radoslavova071b1e2014-11-17 13:37:57 -080081 private IntentSynchronizer intentSynchronizer;
Jonathan Hartbac07a02014-10-13 21:29:54 -070082 private SdnIpConfigReader config;
Jonathan Hartce430a42014-10-16 20:44:29 -070083 private PeerConnectivityManager peerConnectivity;
Jonathan Hart335ef462014-10-16 08:20:46 -070084 private Router router;
Jonathan Hartab63aac2014-10-16 08:52:55 -070085 private BgpSessionManager bgpSessionManager;
Pavlin Radoslavova7243cc2014-11-22 21:38:02 -080086 private LeadershipEventListener leadershipEventListener =
87 new InnerLeadershipEventListener();
Pavlin Radoslavovc91eebe2014-11-25 18:45:46 -080088 private ApplicationId appId;
Pavlin Radoslavova7243cc2014-11-22 21:38:02 -080089 private ControllerNode localControllerNode;
Pavlin Radoslavov8b752442014-11-18 14:34:37 -080090
Jonathan Hart039d2b12014-10-10 09:33:04 -070091 @Activate
92 protected void activate() {
Pavlin Radoslavov8b752442014-11-18 14:34:37 -080093 log.info("SDN-IP started");
Jonathan Hartbac07a02014-10-13 21:29:54 -070094
Pavlin Radoslavova7243cc2014-11-22 21:38:02 -080095 appId = coreService.registerApplication(SDN_IP_APP);
Jonathan Hartbac07a02014-10-13 21:29:54 -070096 config = new SdnIpConfigReader();
97 config.init();
Jonathan Hartdc711bd2014-10-15 11:24:23 -070098
Pavlin Radoslavova7243cc2014-11-22 21:38:02 -080099 localControllerNode = clusterService.getLocalNode();
100
Pavlin Radoslavova071b1e2014-11-17 13:37:57 -0800101 InterfaceService interfaceService =
102 new HostToInterfaceAdaptor(hostService);
Jonathan Hartdc711bd2014-10-15 11:24:23 -0700103
Pavlin Radoslavova071b1e2014-11-17 13:37:57 -0800104 intentSynchronizer = new IntentSynchronizer(appId, intentService);
105 intentSynchronizer.start();
Jonathan Hart31582d12014-10-22 13:52:41 -0700106
Pavlin Radoslavova7243cc2014-11-22 21:38:02 -0800107 peerConnectivity = new PeerConnectivityManager(appId,
108 intentSynchronizer,
109 config,
110 interfaceService);
Jonathan Hartdc711bd2014-10-15 11:24:23 -0700111 peerConnectivity.start();
112
Pavlin Radoslavova7243cc2014-11-22 21:38:02 -0800113 router = new Router(appId, intentSynchronizer, config,
114 interfaceService, hostService);
Jonathan Hart335ef462014-10-16 08:20:46 -0700115 router.start();
116
Pavlin Radoslavovc91eebe2014-11-25 18:45:46 -0800117 leadershipService = new SdnIpLeadershipService(clusterService,
118 storeService,
119 eventDispatcher);
120 leadershipService.start();
Pavlin Radoslavova7243cc2014-11-22 21:38:02 -0800121 leadershipService.addListener(leadershipEventListener);
122 leadershipService.runForLeadership(appId.name());
Jonathan Hartec2df012014-10-23 16:40:24 -0700123
Jonathan Hartab63aac2014-10-16 08:52:55 -0700124 bgpSessionManager = new BgpSessionManager(router);
Pavlin Radoslavova071b1e2014-11-17 13:37:57 -0800125 // TODO: the local BGP listen port number should be configurable
126 bgpSessionManager.start(2000);
Jonathan Hartab63aac2014-10-16 08:52:55 -0700127
Jonathan Hart335ef462014-10-16 08:20:46 -0700128 // TODO need to disable link discovery on external ports
Jonathan Hart039d2b12014-10-10 09:33:04 -0700129 }
130
131 @Deactivate
132 protected void deactivate() {
Pavlin Radoslavov8b752442014-11-18 14:34:37 -0800133
Pavlin Radoslavova071b1e2014-11-17 13:37:57 -0800134 bgpSessionManager.stop();
135 router.stop();
136 peerConnectivity.stop();
137 intentSynchronizer.stop();
Jonathan Hart739c8352014-10-29 17:49:26 -0700138
Pavlin Radoslavova7243cc2014-11-22 21:38:02 -0800139 leadershipService.withdraw(appId.name());
140 leadershipService.removeListener(leadershipEventListener);
Pavlin Radoslavovc91eebe2014-11-25 18:45:46 -0800141 leadershipService.stop();
Pavlin Radoslavov8b752442014-11-18 14:34:37 -0800142
Pavlin Radoslavova7243cc2014-11-22 21:38:02 -0800143 log.info("SDN-IP Stopped");
Jonathan Hart039d2b12014-10-10 09:33:04 -0700144 }
Jonathan Hart0b04bed2014-10-16 16:39:19 -0700145
146 @Override
Pavlin Radoslavov0c84da82014-11-07 17:53:34 -0800147 public Collection<BgpSession> getBgpSessions() {
148 return bgpSessionManager.getBgpSessions();
149 }
150
151 @Override
Jonathan Hart0b04bed2014-10-16 16:39:19 -0700152 public Collection<BgpRouteEntry> getBgpRoutes() {
153 return bgpSessionManager.getBgpRoutes();
154 }
155
156 @Override
157 public Collection<RouteEntry> getRoutes() {
158 return router.getRoutes();
159 }
Jonathan Hartce430a42014-10-16 20:44:29 -0700160
Jonathan Hartec2df012014-10-23 16:40:24 -0700161 @Override
162 public void modifyPrimary(boolean isPrimary) {
Pavlin Radoslavova071b1e2014-11-17 13:37:57 -0800163 intentSynchronizer.leaderChanged(isPrimary);
Jonathan Hartec2df012014-10-23 16:40:24 -0700164 }
165
Jonathan Hartce430a42014-10-16 20:44:29 -0700166 static String dpidToUri(String dpid) {
167 return "of:" + dpid.replace(":", "");
168 }
Pavlin Radoslavov8b752442014-11-18 14:34:37 -0800169
170 /**
Pavlin Radoslavova7243cc2014-11-22 21:38:02 -0800171 * A listener for Leadership Events.
Pavlin Radoslavov8b752442014-11-18 14:34:37 -0800172 */
Pavlin Radoslavova7243cc2014-11-22 21:38:02 -0800173 private class InnerLeadershipEventListener
174 implements LeadershipEventListener {
Pavlin Radoslavov8b752442014-11-18 14:34:37 -0800175
Pavlin Radoslavova7243cc2014-11-22 21:38:02 -0800176 @Override
177 public void event(LeadershipEvent event) {
178 log.debug("Leadership Event: time = {} type = {} event = {}",
179 event.time(), event.type(), event);
Pavlin Radoslavov8b752442014-11-18 14:34:37 -0800180
Pavlin Radoslavova7243cc2014-11-22 21:38:02 -0800181 if (!event.subject().topic().equals(appId.name())) {
182 return; // Not our topic: ignore
183 }
184 if (!event.subject().leader().id().equals(
185 localControllerNode.id())) {
186 return; // The event is not about this instance: ignore
187 }
Pavlin Radoslavov8b752442014-11-18 14:34:37 -0800188
Pavlin Radoslavova7243cc2014-11-22 21:38:02 -0800189 switch (event.type()) {
190 case LEADER_ELECTED:
Madan Jampani71582ed2014-11-18 10:06:01 -0800191 log.info("SDN-IP Leader Elected");
192 intentSynchronizer.leaderChanged(true);
Pavlin Radoslavova7243cc2014-11-22 21:38:02 -0800193 break;
194 case LEADER_BOOTED:
195 log.info("SDN-IP Leader Lost Election");
196 intentSynchronizer.leaderChanged(false);
197 break;
198 case LEADER_REELECTED:
199 break;
200 default:
201 break;
Pavlin Radoslavov8b752442014-11-18 14:34:37 -0800202 }
203 }
Pavlin Radoslavov8b752442014-11-18 14:34:37 -0800204 }
Jonathan Hart039d2b12014-10-10 09:33:04 -0700205}