blob: 55d88d21bba02b89c8d2b18f78e07f9832cd72d8 [file] [log] [blame]
Michael Enrico584eebd2021-07-22 08:04:13 +00001/*
2 * Copyright 2018-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 */
16
17package org.onosproject.drivers.polatis.netconf;
18
19import org.onosproject.net.PortNumber;
20import org.onosproject.net.behaviour.PortAdmin;
21import org.onosproject.net.driver.AbstractHandlerBehaviour;
22import org.slf4j.Logger;
23
24import java.util.concurrent.CompletableFuture;
25
26import static org.slf4j.LoggerFactory.getLogger;
27
28import static org.onosproject.drivers.polatis.netconf.PolatisUtility.*;
29
30import static org.onosproject.drivers.polatis.netconf.PolatisNetconfUtility.netconfGet;
31import static org.onosproject.drivers.polatis.netconf.PolatisNetconfUtility.netconfRpc;
32import static org.onosproject.drivers.polatis.netconf.PolatisNetconfUtility.KEY_OK;
33
34
35/**
36 * Handles port administration for Polatis switches using NETCONF.
37 */
38public class PolatisPortAdmin extends AbstractHandlerBehaviour implements PortAdmin {
39
40 public static final Logger log = getLogger(PolatisPortAdmin.class);
41
42
43 /**
44 * Sets the administrative state of the given port to the given value.
45 *
46 * @param portNumber Port number
47 * @param state State, PC_ENABLED or PC_DISABLED
48 * @return True if successfully set
49 */
50 private CompletableFuture<Boolean> setAdminState(PortNumber portNumber, String state) {
51
52 boolean result = false;
53 try {
54 log.debug("Sending RPC to {} to set port {} to {}", handler().data().deviceId(), portNumber, state);
55 String cmdBody = getRpcSetPortStateBody(state.equals(PORT_ENABLED) ? KEY_ENABLE : KEY_DISABLE, portNumber);
56 String response = netconfRpc(handler(),
57 getRpcSetPortStateBody(state.equals(PORT_ENABLED) ? KEY_ENABLE : KEY_DISABLE,
58 portNumber));
59 log.trace("Response from RPC: " + response);
60 result = response.contains(KEY_OK);
61 } catch (IllegalStateException e) {
62 log.error("Unable to set port admin state for {}/{} to {}", handler().data().deviceId(), portNumber,
63 state, e);
64 }
65 return CompletableFuture.completedFuture(result);
66 }
67
68 @Override
69 public CompletableFuture<Boolean> enable(PortNumber portNumber) {
70 return setAdminState(portNumber, PORT_ENABLED);
71 }
72
73 @Override
74 public CompletableFuture<Boolean> disable(PortNumber portNumber) {
75 return setAdminState(portNumber, PORT_DISABLED);
76 }
77
78 @Override
79 public CompletableFuture<Boolean> isEnabled(PortNumber portNumber) {
80 boolean result = false;
81 try {
82 log.debug("Querying port state for port {} from device {}", portNumber, handler().data().deviceId());
83 String response = netconfGet(handler(), getPortStatusFilter(portNumber));
84 result = response.equals(PORT_ENABLED);
85 log.debug("Port {}/{} is {}", handler().data().deviceId(), portNumber, result);
86 } catch (IllegalStateException e) {
87 log.error("Unable to query port state for port {} from device {}", portNumber,
88 handler().data().deviceId(), e);
89 }
90 return CompletableFuture.completedFuture(result);
91 }
92}