blob: d84ef09a6b79e248dbcec4de784164abed6989ce [file] [log] [blame]
Andrea Campanellac2d754b2016-03-29 17:51:07 -07001/*
Brian O'Connora09fe5b2017-08-03 21:12:30 -07002 * Copyright 2016-present Open Networking Foundation
Andrea Campanellac2d754b2016-03-29 17:51:07 -07003 *
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 */
16
17package org.onosproject.snmp.ctl;
18
19import com.btisystems.pronx.ems.core.snmp.DefaultSnmpConfigurationFactory;
20import com.btisystems.pronx.ems.core.snmp.ISnmpConfiguration;
21import com.btisystems.pronx.ems.core.snmp.ISnmpSession;
22import com.btisystems.pronx.ems.core.snmp.ISnmpSessionFactory;
23import com.btisystems.pronx.ems.core.snmp.SnmpSessionFactory;
24import com.btisystems.pronx.ems.core.snmp.V2cSnmpConfiguration;
25import com.google.common.base.Preconditions;
senthil9d33aa22021-10-05 09:59:32 +053026import com.google.common.collect.Maps;
Thomas Vachuska52f2cd12018-11-08 21:20:04 -080027import org.onosproject.alarm.Alarm;
28import org.onosproject.alarm.AlarmId;
29import org.onosproject.alarm.DefaultAlarm;
Andrea Campanellac2d754b2016-03-29 17:51:07 -070030import org.onosproject.net.DeviceId;
31import org.onosproject.snmp.SnmpController;
32import org.onosproject.snmp.SnmpDevice;
senthil9d33aa22021-10-05 09:59:32 +053033import org.onosproject.snmp.SnmpException;
Andrea Campanellac2d754b2016-03-29 17:51:07 -070034import org.osgi.service.component.ComponentContext;
Ray Milkeyd84f89b2018-08-17 14:54:17 -070035import org.osgi.service.component.annotations.Activate;
Andrea Campanellac2d754b2016-03-29 17:51:07 -070036import org.osgi.service.component.annotations.Component;
Ray Milkeyd84f89b2018-08-17 14:54:17 -070037import org.osgi.service.component.annotations.Deactivate;
Andrea Campanellac2d754b2016-03-29 17:51:07 -070038import org.slf4j.Logger;
39import org.slf4j.LoggerFactory;
senthil9d33aa22021-10-05 09:59:32 +053040import org.snmp4j.mp.SnmpConstants;
Andrea Campanellac2d754b2016-03-29 17:51:07 -070041
42import java.io.IOException;
Laszlo Papp9655b182017-01-31 13:01:45 -080043import java.net.URI;
Andrea Campanellac2d754b2016-03-29 17:51:07 -070044import java.util.Collection;
45import java.util.HashMap;
46import java.util.Map;
senthil9d33aa22021-10-05 09:59:32 +053047import java.util.Objects;
Andrea Campanellac2d754b2016-03-29 17:51:07 -070048import java.util.concurrent.ConcurrentHashMap;
49
50/**
51 * Default implementation of the SNMP sub-controller.
52 */
Ray Milkeyd84f89b2018-08-17 14:54:17 -070053@Component(immediate = true, service = SnmpController.class)
Andrea Campanellac2d754b2016-03-29 17:51:07 -070054public class DefaultSnmpController implements SnmpController {
55
56 private final Logger log = LoggerFactory
57 .getLogger(getClass());
58
senthil9d33aa22021-10-05 09:59:32 +053059 protected Map<Integer, ISnmpSessionFactory> factoryMap;
Andrea Campanellac2d754b2016-03-29 17:51:07 -070060
Andrea Campanella58454b92016-04-01 15:19:00 -070061 protected final Map<DeviceId, ISnmpSession> sessionMap = new HashMap<>();
62 protected final Map<DeviceId, SnmpDevice> snmpDeviceMap = new ConcurrentHashMap<>();
Andrea Campanellac2d754b2016-03-29 17:51:07 -070063
64 @Activate
65 public void activate(ComponentContext context) {
senthil9d33aa22021-10-05 09:59:32 +053066 factoryMap = Maps.newHashMap();
67 factoryMap.put(SnmpConstants.version2c, new SnmpSessionFactory(
68 new DefaultSnmpConfigurationFactory(new V2cSnmpConfiguration())));
69 factoryMap.put(SnmpConstants.version3, new SnmpSessionFactory(
70 new DefaultSnmpConfigurationFactory(new V3SnmpConfiguration())));
Andrea Campanellac2d754b2016-03-29 17:51:07 -070071 log.info("Started");
72 }
73
74 @Deactivate
75 public void deactivate() {
Andrea Campanella58454b92016-04-01 15:19:00 -070076 sessionMap.clear();
Andrea Campanellac2d754b2016-03-29 17:51:07 -070077 snmpDeviceMap.clear();
78 log.info("Stopped");
79 }
80
81 @Override
Laszlo Papp9655b182017-01-31 13:01:45 -080082 @Deprecated
Andrea Campanellac2d754b2016-03-29 17:51:07 -070083 public ISnmpSession getSession(DeviceId deviceId) throws IOException {
84 if (!sessionMap.containsKey(deviceId)) {
85 SnmpDevice device = snmpDeviceMap.get(deviceId);
senthil9d33aa22021-10-05 09:59:32 +053086 ISnmpSessionFactory sessionFactory = factoryMap.get(device.getVersion());
87 if (Objects.isNull(sessionFactory)) {
88 log.error("Invalid session factory", deviceId);
89 throw new SnmpException("Invalid session factory");
90 }
Andrea Campanellac2d754b2016-03-29 17:51:07 -070091 String ipAddress = null;
92 int port = -1;
93 if (device != null) {
94 ipAddress = device.getSnmpHost();
95 port = device.getSnmpPort();
96 } else {
97 String[] deviceComponents = deviceId.toString().split(":");
98 if (deviceComponents.length > 1) {
99 ipAddress = deviceComponents[1];
100 port = Integer.parseInt(deviceComponents[2]);
101
102 } else {
103 log.error("Cannot obtain correct information from device id", deviceId);
104 }
105 }
106 Preconditions.checkNotNull(ipAddress, "ip address is empty, cannot start session");
107 Preconditions.checkArgument(port != -1, "port is incorrect, cannot start session");
senthil9d33aa22021-10-05 09:59:32 +0530108 ISnmpConfiguration config;
109 if (device.getVersion() == SnmpConstants.version2c) {
110 config = new V2cSnmpConfiguration();
111 config.setCommunity(device.getCommunity());
112 } else if (device.getVersion() == SnmpConstants.version3) {
113 DefaultSnmpv3Device v3Device = (DefaultSnmpv3Device) device;
114 config = V3SnmpConfiguration.builder()
115 .setAddress(ipAddress)
116 .setSecurityName(v3Device.getSecurityName())
117 .setSecurityLevel(v3Device.getSecurityLevel())
118 .setAuthenticationProtocol(v3Device.getAuthProtocol())
119 .setAuthenticationPassword(v3Device.getAuthPassword())
120 .setPrivacyProtocol(v3Device.getPrivProtocol())
121 .setPrivacyPassword(v3Device.getPrivPassword())
122 .setContextName(v3Device.getContextName())
123 .build();
124 } else {
125 throw new SnmpException(
126 String.format("Invalid snmp version %d", device.getVersion()));
127 }
Andrea Campanellac2d754b2016-03-29 17:51:07 -0700128 config.setPort(port);
129 sessionMap.put(deviceId, sessionFactory.createSession(config, ipAddress));
130 }
131 return sessionMap.get(deviceId);
132 }
133
134 @Override
135 public Collection<SnmpDevice> getDevices() {
136 return snmpDeviceMap.values();
137 }
138
139 @Override
140 public SnmpDevice getDevice(DeviceId did) {
141 return snmpDeviceMap.get(did);
142 }
143
144 @Override
Laszlo Papp9655b182017-01-31 13:01:45 -0800145 public SnmpDevice getDevice(URI uri) {
146 //this assumes that only one device is associated with one deviceId
147 return snmpDeviceMap.entrySet()
148 .stream().filter(p -> p.getValue()
149 .getSnmpHost().equals(uri.toString()))
150 .map(Map.Entry::getValue).findFirst().orElse(null);
151 }
152
153 @Override
Andrea Campanellac2d754b2016-03-29 17:51:07 -0700154 public void removeDevice(DeviceId did) {
155 snmpDeviceMap.remove(did);
156 }
157
158 @Override
Laszlo Papp9655b182017-01-31 13:01:45 -0800159 public void addDevice(SnmpDevice device) {
160 log.info("Adding device {}", device.deviceId());
161 snmpDeviceMap.put(device.deviceId(), device);
162 }
163
164 @Override
Andrea Campanellac2d754b2016-03-29 17:51:07 -0700165 public DefaultAlarm buildWalkFailedAlarm(DeviceId deviceId) {
Ray Milkey0a1a0912018-02-15 11:35:58 -0800166 long timeRaised = System.currentTimeMillis();
Andrea Campanellac2d754b2016-03-29 17:51:07 -0700167 return new DefaultAlarm.Builder(
Ray Milkey0a1a0912018-02-15 11:35:58 -0800168 AlarmId.alarmId(deviceId, Long.toString(timeRaised)),
Andrea Campanellac2d754b2016-03-29 17:51:07 -0700169 deviceId, "SNMP alarm retrieval failed",
Ray Milkey0a1a0912018-02-15 11:35:58 -0800170 Alarm.SeverityLevel.CRITICAL, timeRaised).build();
Andrea Campanellac2d754b2016-03-29 17:51:07 -0700171 }
172}