blob: b05044839a28f2d639823538fa1ad5a0d78c7bc7 [file] [log] [blame]
Dimitrios Mavrommatisf0c06322017-10-31 23:49:04 -07001/*
2 * Copyright 2017-present Open Networking Foundation
3 *
4 * 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
7 *
8 * 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.
15 */
16package org.onosproject.artemis.impl;
17
18import com.google.common.collect.Sets;
19import io.netty.channel.ChannelHandlerContext;
Dimitrios Mavrommatisf0c06322017-10-31 23:49:04 -070020import org.json.JSONObject;
21import org.onlab.packet.IpPrefix;
22import org.onosproject.artemis.ArtemisMonitor;
23import org.onosproject.artemis.ArtemisPacketProcessor;
24import org.onosproject.artemis.impl.objects.ArtemisMessage;
25import org.onosproject.event.EventDeliveryService;
26import org.onosproject.net.config.NetworkConfigEvent;
27import org.onosproject.net.config.NetworkConfigListener;
28import org.onosproject.net.config.NetworkConfigService;
Ray Milkeyd84f89b2018-08-17 14:54:17 -070029import org.osgi.service.component.annotations.Activate;
30import org.osgi.service.component.annotations.Component;
31import org.osgi.service.component.annotations.Deactivate;
32import org.osgi.service.component.annotations.Reference;
33import org.osgi.service.component.annotations.ReferenceCardinality;
Dimitrios Mavrommatisf0c06322017-10-31 23:49:04 -070034import org.slf4j.Logger;
35import org.slf4j.LoggerFactory;
36
37import java.util.Map;
38import java.util.Set;
39import java.util.stream.Collectors;
40
Ray Milkeyd84f89b2018-08-17 14:54:17 -070041@Component(immediate = true, service = ArtemisMonitor.class)
Dimitrios Mavrommatisf0c06322017-10-31 23:49:04 -070042public class ArtemisMonitorImpl implements ArtemisMonitor {
43 private final Logger log = LoggerFactory.getLogger(getClass());
44 private static final Class<ArtemisConfig> CONFIG_CLASS = ArtemisConfig.class;
45
Ray Milkeyd84f89b2018-08-17 14:54:17 -070046 @Reference(cardinality = ReferenceCardinality.MANDATORY)
Dimitrios Mavrommatisf0c06322017-10-31 23:49:04 -070047 protected EventDeliveryService eventDispatcher;
48
Ray Milkeyd84f89b2018-08-17 14:54:17 -070049 @Reference(cardinality = ReferenceCardinality.MANDATORY)
Dimitrios Mavrommatisf0c06322017-10-31 23:49:04 -070050 private NetworkConfigService configService;
51
52 /* Variables */
53 private Set<PrefixHandler> prefixHandlers = Sets.newHashSet();
54 private InternalPacketProcessor packetProcessor = new InternalPacketProcessor();
55
56 private final InternalNetworkConfigListener configListener =
57 new InternalNetworkConfigListener();
58
59 @Activate
60 protected void activate() {
61 configService.addListener(configListener);
62 log.info("Artemis Monitor Service Started");
63 }
64
65 @Deactivate
66 protected void deactivate() {
67 configService.removeListener(configListener);
68 prefixHandlers.forEach(PrefixHandler::stopPrefixMonitors);
69 prefixHandlers.clear();
70
71 log.info("Artemis Monitor Service Stopped");
72 }
73
74 private class InternalPacketProcessor implements ArtemisPacketProcessor {
75
76 @Override
77 public void processMoasPacket(ArtemisMessage msg, ChannelHandlerContext ctx) {
78
79 }
80
81 @Override
82 public void processMonitorPacket(JSONObject msg) {
83 // TODO: in future maybe store the BGP Update message and propagate it to the cluster instead of Events
84 eventDispatcher.post(new ArtemisEvent(ArtemisEvent.Type.BGPUPDATE_ADDED, msg));
85 }
86 }
87
88 private class InternalNetworkConfigListener implements NetworkConfigListener {
89
90 @Override
91 public void event(NetworkConfigEvent event) {
92 switch (event.type()) {
93 case CONFIG_REGISTERED:
94 case CONFIG_UNREGISTERED: {
95 break;
96 }
97 case CONFIG_REMOVED: {
98 if (event.configClass() == CONFIG_CLASS) {
99 prefixHandlers.forEach(PrefixHandler::stopPrefixMonitors);
100 prefixHandlers.clear();
101 }
102 break;
103 }
104 case CONFIG_UPDATED:
105 case CONFIG_ADDED: {
106 if (event.configClass() == CONFIG_CLASS) {
107 event.config().ifPresent(config -> {
108 ArtemisConfig artemisConfig = (ArtemisConfig) config;
109 Set<IpPrefix> ipPrefixes = artemisConfig.prefixesToMonitor();
110 Map<String, Set<String>> monitors = artemisConfig.activeMonitors();
111
112 prefixHandlers.forEach(PrefixHandler::stopPrefixMonitors);
113 prefixHandlers.clear();
114 prefixHandlers = ipPrefixes.stream()
115 .map(prefix -> new PrefixHandler(prefix, monitors, packetProcessor))
116 .collect(Collectors.toSet());
117
118 prefixHandlers.forEach(PrefixHandler::startPrefixMonitors);
119 });
120 }
121 break;
122 }
123 default:
124 break;
125 }
126 }
127
128 }
129}