Code improvement for pending sonar issues
[cli.git] / profiles / snmp / src / main / java / org / onap / cli / fw / snmp / cmd / OnapSnmpCommand.java
1 /*
2  * Copyright 2017 Huawei Technologies Co., Ltd.
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  */
16
17 package org.onap.cli.fw.snmp.cmd;
18
19 import org.onap.cli.fw.cmd.OnapCommand;
20 import org.onap.cli.fw.error.OnapCommandException;
21 import org.onap.cli.fw.input.OnapCommandParameter;
22 import org.onap.cli.fw.schema.OnapCommandSchema;
23 import org.onap.cli.fw.snmp.conf.OnapCommandSnmpConstants;
24 import org.onap.cli.fw.snmp.exception.OnapSnmpErrorResponse;
25 import org.onap.cli.fw.snmp.schema.OnapCommandSchemaSnmpLoader;
26 import org.snmp4j.CommunityTarget;
27 import org.snmp4j.PDU;
28 import org.snmp4j.Snmp;
29 import org.snmp4j.Target;
30 import org.snmp4j.event.ResponseEvent;
31 import org.snmp4j.mp.SnmpConstants;
32 import org.snmp4j.smi.Address;
33 import org.snmp4j.smi.GenericAddress;
34 import org.snmp4j.smi.OID;
35 import org.snmp4j.smi.OctetString;
36 import org.snmp4j.smi.VariableBinding;
37 import org.snmp4j.transport.DefaultUdpTransportMapping;
38
39 import java.io.IOException;
40 import java.util.ArrayList;
41 import java.util.List;
42 import java.util.Map;
43 import java.util.Optional;
44
45 /**
46  * Oclip snmp Command.
47  *
48  */
49 @OnapCommandSchema(type = OnapCommandSnmpConstants.SNMP_SCHEMA_PROFILE)
50 public class OnapSnmpCommand extends OnapCommand {
51
52     private List<Map<String, String>> resultMap;
53
54     private String version;
55
56     private String command;
57
58     public OnapSnmpCommand() {
59         super.addDefaultSchemas(OnapCommandSnmpConstants.DEFAULT_PARAMETER_SNMP_FILE_NAME);
60     }
61
62     private String getAgent() {
63         OnapCommandParameter onapCommandParameter = this.getParametersMap().get(OnapCommandSnmpConstants.SNMP_AGENT);
64         return (String) onapCommandParameter.getValue();
65     }
66
67     private PDU getPDU(Integer commandType, String[] oids) {
68         PDU pdu = new PDU();
69         for (String oid: oids) {
70             pdu.add(new VariableBinding(new OID(oid)));
71         }
72
73         pdu.setType(commandType);
74         return pdu;
75     }
76
77     private Target getTarget() throws OnapCommandException { //NOSONAR
78         Address targetAddress = GenericAddress.parse(this.getAgent());  //udp:127.0.0.1/161
79         CommunityTarget target = new CommunityTarget();
80         target.setCommunity(new OctetString(OnapCommandSnmpConstants.SNMP_COMMNUNITY_STRING));
81         target.setAddress(targetAddress);
82         target.setRetries(OnapCommandSnmpConstants.RETRY_COUNT);
83         target.setTimeout(OnapCommandSnmpConstants.TIMEOUT);
84
85         switch (this.getSnmpVersion()) {
86             case OnapCommandSnmpConstants.SNMP_VERSION_V1:
87                 target.setVersion(SnmpConstants.version1);
88                 break;
89
90             case OnapCommandSnmpConstants.SNMP_VERSION_V2C:
91                 target.setVersion(SnmpConstants.version2c);
92                 break;
93
94             default:
95                 break;
96         }
97         return target;
98     }
99
100     @Override
101     protected void run() throws OnapCommandException {
102         try {
103
104             // set JVM constant to avoid delay by snmp4j
105             System.setProperty("java.security.egd", "file:data/./urandom");
106
107             DefaultUdpTransportMapping defaultUdpTransportMapping = new DefaultUdpTransportMapping();
108             defaultUdpTransportMapping.listen();
109             Snmp snmp = new Snmp(defaultUdpTransportMapping);
110
111             List<String> oids = new ArrayList<>();
112             for (Map<String, String> map: resultMap) {
113                 oids.addAll(map.values());
114             }
115
116             String[] oidStrArr = oids.toArray(new String[oids.size()]);
117
118             if (OnapCommandSnmpConstants.SNMP_CMD_GET.equals(this.command)) {
119                     ResponseEvent responseEvent = snmp.send(getPDU(PDU.GET, oidStrArr), getTarget(), null);
120                     if ( responseEvent != null) {
121                         if (responseEvent.getResponse().getErrorStatus() == PDU.noError) {
122                             List<? extends VariableBinding> variableBindings = responseEvent.
123                                     getResponse().getVariableBindings();
124                             variableBindings.stream().forEach(varBinding -> { //NOSONAR
125                                 String key = getKeyForValue(varBinding.getOid().toString());
126                                 if (key != null) {
127                                     this.getResult().getRecordsMap().get(key).getValues().add(
128                                             varBinding.getVariable().toString());
129                                 }
130                             });
131                         } else {
132                             throw new OnapSnmpErrorResponse("Error response from SNMP agent",
133                                 responseEvent.getResponse().getErrorStatus());
134                         }
135                     } else {
136                         throw new OnapSnmpErrorResponse("Failed to send SNMP GET command");
137                     }
138             }
139             snmp.close();
140         } catch (IOException ex) {
141             throw new OnapSnmpErrorResponse(ex);
142         }
143     }
144
145     private String getKeyForValue(String value) {
146         Optional<Map<String, String>> mapOptional = resultMap.stream().filter(map -> map.values().contains(value)).findFirst(); //NOSONAR
147         if (!mapOptional.isPresent()) {
148             return null;
149         }
150         return mapOptional.get().keySet().iterator().next();
151     }
152
153     @Override
154     protected List<String> initializeProfileSchema(Map<String, ?> schemaMap, boolean validate) throws OnapCommandException {
155         return OnapCommandSchemaSnmpLoader.parseSnmpSchema(this, schemaMap, validate);
156     }
157
158     public String getSnmpVersion() {
159         return version;
160     }
161
162     public void setSnmpVersion(String version) {
163         this.version = version;
164     }
165
166     public String getCommand() {
167         return command;
168     }
169
170     public void setCommand(String command) {
171         this.command = command;
172     }
173
174
175     public List<Map<String, String>> getResultMap() {
176         return resultMap;
177     }
178
179     public void setResultMap(List<Map<String, String>> resultMap) {
180         this.resultMap = resultMap;
181     }
182
183 }