blob: e3defdc375ad8b9b23b90f88e28984d4c14f682a [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 */
Brian O'Connorabafb502014-12-02 22:26:20 -080016package org.onosproject.sdnip;
Jonathan Hart039d2b12014-10-10 09:33:04 -070017
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;
Brian O'Connorabafb502014-12-02 22:26:20 -080028import org.onosproject.cluster.ClusterService;
29import org.onosproject.cluster.ControllerNode;
30import org.onosproject.cluster.LeadershipEvent;
31import org.onosproject.cluster.LeadershipEventListener;
32import org.onosproject.cluster.LeadershipService;
33import org.onosproject.core.ApplicationId;
34import org.onosproject.core.CoreService;
35import org.onosproject.net.host.HostService;
36import org.onosproject.net.intent.IntentService;
37import org.onosproject.sdnip.bgp.BgpRouteEntry;
38import org.onosproject.sdnip.bgp.BgpSession;
39import org.onosproject.sdnip.bgp.BgpSessionManager;
40import org.onosproject.sdnip.config.SdnIpConfigurationReader;
Pavlin Radoslavova7243cc2014-11-22 21:38:02 -080041import org.slf4j.Logger;
Pavlin Radoslavov8b752442014-11-18 14:34:37 -080042
Jonathan Hart039d2b12014-10-10 09:33:04 -070043/**
Jonathan Hart0b04bed2014-10-16 16:39:19 -070044 * Component for the SDN-IP peering application.
Jonathan Hart039d2b12014-10-10 09:33:04 -070045 */
46@Component(immediate = true)
Jonathan Hart0b04bed2014-10-16 16:39:19 -070047@Service
48public class SdnIp implements SdnIpService {
Jonathan Hart039d2b12014-10-10 09:33:04 -070049
Brian O'Connorabafb502014-12-02 22:26:20 -080050 private static final String SDN_IP_APP = "org.onosproject.sdnip";
Jonathan Hart039d2b12014-10-10 09:33:04 -070051 private final Logger log = getLogger(getClass());
52
Jonathan Hartdc711bd2014-10-15 11:24:23 -070053 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
Thomas Vachuskab97cf282014-10-20 23:31:12 -070054 protected CoreService coreService;
55
56 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
Jonathan Hartdc711bd2014-10-15 11:24:23 -070057 protected IntentService intentService;
58
59 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
60 protected HostService hostService;
61
Pavlin Radoslavov8b752442014-11-18 14:34:37 -080062 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
Pavlin Radoslavova7243cc2014-11-22 21:38:02 -080063 protected ClusterService clusterService;
64
65 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
Jonathan Hart949c2842014-11-28 23:44:09 -080066 protected LeadershipService leadershipService;
Pavlin Radoslavov8b752442014-11-18 14:34:37 -080067
Pavlin Radoslavova071b1e2014-11-17 13:37:57 -080068 private IntentSynchronizer intentSynchronizer;
Jonathan Hart9965d772014-12-02 10:28:34 -080069 private SdnIpConfigurationReader config;
Jonathan Hartce430a42014-10-16 20:44:29 -070070 private PeerConnectivityManager peerConnectivity;
Jonathan Hart335ef462014-10-16 08:20:46 -070071 private Router router;
Jonathan Hartab63aac2014-10-16 08:52:55 -070072 private BgpSessionManager bgpSessionManager;
Pavlin Radoslavova7243cc2014-11-22 21:38:02 -080073 private LeadershipEventListener leadershipEventListener =
74 new InnerLeadershipEventListener();
Pavlin Radoslavovc91eebe2014-11-25 18:45:46 -080075 private ApplicationId appId;
Pavlin Radoslavova7243cc2014-11-22 21:38:02 -080076 private ControllerNode localControllerNode;
Pavlin Radoslavov8b752442014-11-18 14:34:37 -080077
Jonathan Hart039d2b12014-10-10 09:33:04 -070078 @Activate
79 protected void activate() {
Pavlin Radoslavov8b752442014-11-18 14:34:37 -080080 log.info("SDN-IP started");
Jonathan Hartbac07a02014-10-13 21:29:54 -070081
Pavlin Radoslavova7243cc2014-11-22 21:38:02 -080082 appId = coreService.registerApplication(SDN_IP_APP);
Jonathan Hart9965d772014-12-02 10:28:34 -080083 config = new SdnIpConfigurationReader();
84 config.readConfiguration();
Jonathan Hartdc711bd2014-10-15 11:24:23 -070085
Pavlin Radoslavova7243cc2014-11-22 21:38:02 -080086 localControllerNode = clusterService.getLocalNode();
87
Pavlin Radoslavova071b1e2014-11-17 13:37:57 -080088 InterfaceService interfaceService =
89 new HostToInterfaceAdaptor(hostService);
Jonathan Hartdc711bd2014-10-15 11:24:23 -070090
Pavlin Radoslavova071b1e2014-11-17 13:37:57 -080091 intentSynchronizer = new IntentSynchronizer(appId, intentService);
92 intentSynchronizer.start();
Jonathan Hart31582d12014-10-22 13:52:41 -070093
Pavlin Radoslavova7243cc2014-11-22 21:38:02 -080094 peerConnectivity = new PeerConnectivityManager(appId,
95 intentSynchronizer,
96 config,
97 interfaceService);
Jonathan Hartdc711bd2014-10-15 11:24:23 -070098 peerConnectivity.start();
99
Pavlin Radoslavova7243cc2014-11-22 21:38:02 -0800100 router = new Router(appId, intentSynchronizer, config,
101 interfaceService, hostService);
Jonathan Hart335ef462014-10-16 08:20:46 -0700102 router.start();
103
Pavlin Radoslavova7243cc2014-11-22 21:38:02 -0800104 leadershipService.addListener(leadershipEventListener);
105 leadershipService.runForLeadership(appId.name());
Jonathan Hartec2df012014-10-23 16:40:24 -0700106
Jonathan Hartab63aac2014-10-16 08:52:55 -0700107 bgpSessionManager = new BgpSessionManager(router);
Pavlin Radoslavova071b1e2014-11-17 13:37:57 -0800108 // TODO: the local BGP listen port number should be configurable
109 bgpSessionManager.start(2000);
Jonathan Hartab63aac2014-10-16 08:52:55 -0700110
Jonathan Hart335ef462014-10-16 08:20:46 -0700111 // TODO need to disable link discovery on external ports
Jonathan Hart039d2b12014-10-10 09:33:04 -0700112 }
113
114 @Deactivate
115 protected void deactivate() {
Pavlin Radoslavov8b752442014-11-18 14:34:37 -0800116
Pavlin Radoslavova071b1e2014-11-17 13:37:57 -0800117 bgpSessionManager.stop();
118 router.stop();
119 peerConnectivity.stop();
120 intentSynchronizer.stop();
Jonathan Hart739c8352014-10-29 17:49:26 -0700121
Pavlin Radoslavova7243cc2014-11-22 21:38:02 -0800122 leadershipService.withdraw(appId.name());
123 leadershipService.removeListener(leadershipEventListener);
Pavlin Radoslavov8b752442014-11-18 14:34:37 -0800124
Pavlin Radoslavova7243cc2014-11-22 21:38:02 -0800125 log.info("SDN-IP Stopped");
Jonathan Hart039d2b12014-10-10 09:33:04 -0700126 }
Jonathan Hart0b04bed2014-10-16 16:39:19 -0700127
128 @Override
Pavlin Radoslavov0c84da82014-11-07 17:53:34 -0800129 public Collection<BgpSession> getBgpSessions() {
130 return bgpSessionManager.getBgpSessions();
131 }
132
133 @Override
Jonathan Hart0b04bed2014-10-16 16:39:19 -0700134 public Collection<BgpRouteEntry> getBgpRoutes() {
135 return bgpSessionManager.getBgpRoutes();
136 }
137
138 @Override
139 public Collection<RouteEntry> getRoutes() {
140 return router.getRoutes();
141 }
Jonathan Hartce430a42014-10-16 20:44:29 -0700142
Jonathan Hartec2df012014-10-23 16:40:24 -0700143 @Override
144 public void modifyPrimary(boolean isPrimary) {
Pavlin Radoslavova071b1e2014-11-17 13:37:57 -0800145 intentSynchronizer.leaderChanged(isPrimary);
Jonathan Hartec2df012014-10-23 16:40:24 -0700146 }
147
Jonathan Hartce430a42014-10-16 20:44:29 -0700148 static String dpidToUri(String dpid) {
149 return "of:" + dpid.replace(":", "");
150 }
Pavlin Radoslavov8b752442014-11-18 14:34:37 -0800151
152 /**
Pavlin Radoslavova7243cc2014-11-22 21:38:02 -0800153 * A listener for Leadership Events.
Pavlin Radoslavov8b752442014-11-18 14:34:37 -0800154 */
Pavlin Radoslavova7243cc2014-11-22 21:38:02 -0800155 private class InnerLeadershipEventListener
156 implements LeadershipEventListener {
Pavlin Radoslavov8b752442014-11-18 14:34:37 -0800157
Pavlin Radoslavova7243cc2014-11-22 21:38:02 -0800158 @Override
159 public void event(LeadershipEvent event) {
160 log.debug("Leadership Event: time = {} type = {} event = {}",
161 event.time(), event.type(), event);
Pavlin Radoslavov8b752442014-11-18 14:34:37 -0800162
Pavlin Radoslavova7243cc2014-11-22 21:38:02 -0800163 if (!event.subject().topic().equals(appId.name())) {
164 return; // Not our topic: ignore
165 }
Madan Jampani8d21c792014-12-01 16:31:07 -0800166 if (!event.subject().leader().equals(
Pavlin Radoslavova7243cc2014-11-22 21:38:02 -0800167 localControllerNode.id())) {
168 return; // The event is not about this instance: ignore
169 }
Pavlin Radoslavov8b752442014-11-18 14:34:37 -0800170
Pavlin Radoslavova7243cc2014-11-22 21:38:02 -0800171 switch (event.type()) {
172 case LEADER_ELECTED:
Madan Jampani71582ed2014-11-18 10:06:01 -0800173 log.info("SDN-IP Leader Elected");
174 intentSynchronizer.leaderChanged(true);
Pavlin Radoslavova7243cc2014-11-22 21:38:02 -0800175 break;
176 case LEADER_BOOTED:
177 log.info("SDN-IP Leader Lost Election");
178 intentSynchronizer.leaderChanged(false);
179 break;
180 case LEADER_REELECTED:
181 break;
182 default:
183 break;
Pavlin Radoslavov8b752442014-11-18 14:34:37 -0800184 }
185 }
Pavlin Radoslavov8b752442014-11-18 14:34:37 -0800186 }
Jonathan Hart039d2b12014-10-10 09:33:04 -0700187}