blob: aa84747e6ff1113a94f233e93491eb3c6c2e2758 [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;
Thomas Vachuskae0f804a2014-10-27 23:40:48 -070028import org.onlab.onos.core.ApplicationId;
29import org.onlab.onos.core.CoreService;
Jonathan Hartdc711bd2014-10-15 11:24:23 -070030import org.onlab.onos.net.host.HostService;
31import org.onlab.onos.net.intent.IntentService;
Jonathan Hart0b04bed2014-10-16 16:39:19 -070032import org.onlab.onos.sdnip.bgp.BgpRouteEntry;
Pavlin Radoslavov0c84da82014-11-07 17:53:34 -080033import org.onlab.onos.sdnip.bgp.BgpSession;
Jonathan Hartab63aac2014-10-16 08:52:55 -070034import org.onlab.onos.sdnip.bgp.BgpSessionManager;
Jonathan Hartbac07a02014-10-13 21:29:54 -070035import org.onlab.onos.sdnip.config.SdnIpConfigReader;
Jonathan Hart039d2b12014-10-10 09:33:04 -070036import org.slf4j.Logger;
37
38/**
Jonathan Hart0b04bed2014-10-16 16:39:19 -070039 * Component for the SDN-IP peering application.
Jonathan Hart039d2b12014-10-10 09:33:04 -070040 */
41@Component(immediate = true)
Jonathan Hart0b04bed2014-10-16 16:39:19 -070042@Service
43public class SdnIp implements SdnIpService {
Jonathan Hart039d2b12014-10-10 09:33:04 -070044
Jonathan Hart31582d12014-10-22 13:52:41 -070045 private static final String SDN_IP_APP = "org.onlab.onos.sdnip";
Thomas Vachuskab97cf282014-10-20 23:31:12 -070046
Jonathan Hart039d2b12014-10-10 09:33:04 -070047 private final Logger log = getLogger(getClass());
48
Jonathan Hartdc711bd2014-10-15 11:24:23 -070049 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
Thomas Vachuskab97cf282014-10-20 23:31:12 -070050 protected CoreService coreService;
51
52 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
Jonathan Hartdc711bd2014-10-15 11:24:23 -070053 protected IntentService intentService;
54
55 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
56 protected HostService hostService;
57
Pavlin Radoslavova071b1e2014-11-17 13:37:57 -080058 private IntentSynchronizer intentSynchronizer;
Jonathan Hartbac07a02014-10-13 21:29:54 -070059 private SdnIpConfigReader config;
Jonathan Hartce430a42014-10-16 20:44:29 -070060 private PeerConnectivityManager peerConnectivity;
Jonathan Hart335ef462014-10-16 08:20:46 -070061 private Router router;
Jonathan Hartab63aac2014-10-16 08:52:55 -070062 private BgpSessionManager bgpSessionManager;
Jonathan Hartbac07a02014-10-13 21:29:54 -070063
Jonathan Hart039d2b12014-10-10 09:33:04 -070064 @Activate
65 protected void activate() {
66 log.debug("SDN-IP started");
Jonathan Hartbac07a02014-10-13 21:29:54 -070067
Pavlin Radoslavova071b1e2014-11-17 13:37:57 -080068 ApplicationId appId = coreService.registerApplication(SDN_IP_APP);
Jonathan Hartbac07a02014-10-13 21:29:54 -070069 config = new SdnIpConfigReader();
70 config.init();
Jonathan Hartdc711bd2014-10-15 11:24:23 -070071
Pavlin Radoslavova071b1e2014-11-17 13:37:57 -080072 InterfaceService interfaceService =
73 new HostToInterfaceAdaptor(hostService);
Jonathan Hartdc711bd2014-10-15 11:24:23 -070074
Pavlin Radoslavova071b1e2014-11-17 13:37:57 -080075 intentSynchronizer = new IntentSynchronizer(appId, intentService);
76 intentSynchronizer.start();
Jonathan Hart31582d12014-10-22 13:52:41 -070077
78 peerConnectivity = new PeerConnectivityManager(appId, config,
79 interfaceService, intentService);
Jonathan Hartdc711bd2014-10-15 11:24:23 -070080 peerConnectivity.start();
81
Pavlin Radoslavova071b1e2014-11-17 13:37:57 -080082 router = new Router(appId, intentSynchronizer, hostService, config,
83 interfaceService);
Jonathan Hart335ef462014-10-16 08:20:46 -070084 router.start();
85
Pavlin Radoslavova071b1e2014-11-17 13:37:57 -080086 // Manually set the instance as the leader to allow testing
Jonathan Hartec2df012014-10-23 16:40:24 -070087 // TODO change this when we get a leader election
Pavlin Radoslavova071b1e2014-11-17 13:37:57 -080088 intentSynchronizer.leaderChanged(true);
Jonathan Hartec2df012014-10-23 16:40:24 -070089
Jonathan Hartab63aac2014-10-16 08:52:55 -070090 bgpSessionManager = new BgpSessionManager(router);
Pavlin Radoslavova071b1e2014-11-17 13:37:57 -080091 // TODO: the local BGP listen port number should be configurable
92 bgpSessionManager.start(2000);
Jonathan Hartab63aac2014-10-16 08:52:55 -070093
Jonathan Hart335ef462014-10-16 08:20:46 -070094 // TODO need to disable link discovery on external ports
Jonathan Hart039d2b12014-10-10 09:33:04 -070095 }
96
97 @Deactivate
98 protected void deactivate() {
Pavlin Radoslavova071b1e2014-11-17 13:37:57 -080099 bgpSessionManager.stop();
100 router.stop();
101 peerConnectivity.stop();
102 intentSynchronizer.stop();
Jonathan Hart739c8352014-10-29 17:49:26 -0700103
Jonathan Hart039d2b12014-10-10 09:33:04 -0700104 log.info("Stopped");
105 }
Jonathan Hart0b04bed2014-10-16 16:39:19 -0700106
107 @Override
Pavlin Radoslavov0c84da82014-11-07 17:53:34 -0800108 public Collection<BgpSession> getBgpSessions() {
109 return bgpSessionManager.getBgpSessions();
110 }
111
112 @Override
Jonathan Hart0b04bed2014-10-16 16:39:19 -0700113 public Collection<BgpRouteEntry> getBgpRoutes() {
114 return bgpSessionManager.getBgpRoutes();
115 }
116
117 @Override
118 public Collection<RouteEntry> getRoutes() {
119 return router.getRoutes();
120 }
Jonathan Hartce430a42014-10-16 20:44:29 -0700121
Jonathan Hartec2df012014-10-23 16:40:24 -0700122 @Override
123 public void modifyPrimary(boolean isPrimary) {
Pavlin Radoslavova071b1e2014-11-17 13:37:57 -0800124 intentSynchronizer.leaderChanged(isPrimary);
Jonathan Hartec2df012014-10-23 16:40:24 -0700125 }
126
Jonathan Hartce430a42014-10-16 20:44:29 -0700127 static String dpidToUri(String dpid) {
128 return "of:" + dpid.replace(":", "");
129 }
Jonathan Hart039d2b12014-10-10 09:33:04 -0700130}