blob: 8762af0d473c86d9c90c4e9cb9fdafb137a185bc [file] [log] [blame]
Yi Tsengd7716482018-10-31 15:34:30 -07001/*
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.stratum;
18
Yi Tsengd7716482018-10-31 15:34:30 -070019import org.onosproject.drivers.gnmi.GnmiHandshaker;
20import org.onosproject.drivers.p4runtime.P4RuntimeHandshaker;
Yi Tsengd7716482018-10-31 15:34:30 -070021import org.onosproject.net.MastershipRole;
22import org.onosproject.net.device.DeviceAgentListener;
23import org.onosproject.net.device.DeviceHandshaker;
24import org.onosproject.net.driver.AbstractHandlerBehaviour;
25import org.onosproject.net.driver.DriverData;
26import org.onosproject.net.driver.DriverHandler;
27import org.onosproject.net.provider.ProviderId;
Yi Tsengd7716482018-10-31 15:34:30 -070028
29import java.util.concurrent.CompletableFuture;
Yi Tsengd7716482018-10-31 15:34:30 -070030
31/**
32 * Implementation of DeviceHandshaker for Stratum device.
33 */
34public class StratumHandshaker extends AbstractHandlerBehaviour implements DeviceHandshaker {
35
Carmelo Cascone3977ea42019-02-28 13:43:42 -080036 private P4RuntimeHandshaker p4runtime;
37 private GnmiHandshaker gnmi;
Yi Tsengd7716482018-10-31 15:34:30 -070038
39 public StratumHandshaker() {
Carmelo Cascone3977ea42019-02-28 13:43:42 -080040 p4runtime = new P4RuntimeHandshaker();
41 gnmi = new GnmiHandshaker();
Yi Tsengd7716482018-10-31 15:34:30 -070042 }
43
44 @Override
45 public void setHandler(DriverHandler handler) {
46 super.setHandler(handler);
Carmelo Cascone3977ea42019-02-28 13:43:42 -080047 p4runtime.setHandler(handler);
48 gnmi.setHandler(handler);
Yi Tsengd7716482018-10-31 15:34:30 -070049 }
50
51 @Override
52 public void setData(DriverData data) {
53 super.setData(data);
Carmelo Cascone3977ea42019-02-28 13:43:42 -080054 p4runtime.setData(data);
55 gnmi.setData(data);
Yi Tsengd7716482018-10-31 15:34:30 -070056 }
57
58 @Override
Carmelo Cascone3977ea42019-02-28 13:43:42 -080059 public boolean isReachable() {
60 return p4runtime.isReachable() && gnmi.isReachable();
61 }
62
63 @Override
64 public CompletableFuture<Boolean> probeReachability() {
65 return p4runtime.probeReachability();
66 }
67
68 @Override
69 public boolean isAvailable() {
70 // Availability concerns packet forwarding, hence we consider only
71 // P4Runtime.
72 return p4runtime.isAvailable();
73 }
74
75 @Override
76 public CompletableFuture<Boolean> probeAvailability() {
77 return p4runtime.probeAvailability();
Yi Tsengd7716482018-10-31 15:34:30 -070078 }
79
80 @Override
81 public void roleChanged(MastershipRole newRole) {
Carmelo Cascone3977ea42019-02-28 13:43:42 -080082 p4runtime.roleChanged(newRole);
83 }
84
85 @Override
86 public void roleChanged(int preference, long term) {
87 p4runtime.roleChanged(preference, term);
Yi Tsengd7716482018-10-31 15:34:30 -070088 }
89
90 @Override
91 public MastershipRole getRole() {
Carmelo Cascone3977ea42019-02-28 13:43:42 -080092 return p4runtime.getRole();
Yi Tsengd7716482018-10-31 15:34:30 -070093 }
94
95 @Override
96 public void addDeviceAgentListener(ProviderId providerId, DeviceAgentListener listener) {
Carmelo Cascone3977ea42019-02-28 13:43:42 -080097 p4runtime.addDeviceAgentListener(providerId, listener);
Yi Tsengd7716482018-10-31 15:34:30 -070098 }
99
100 @Override
101 public void removeDeviceAgentListener(ProviderId providerId) {
Carmelo Cascone3977ea42019-02-28 13:43:42 -0800102 p4runtime.removeDeviceAgentListener(providerId);
Yi Tsengd7716482018-10-31 15:34:30 -0700103 }
104
105 @Override
106 public CompletableFuture<Boolean> connect() {
Carmelo Cascone3977ea42019-02-28 13:43:42 -0800107 // We should execute connections in parallel.
108 return p4runtime.connect().thenCombine(gnmi.connect(), Boolean::logicalAnd);
Yi Tsengd7716482018-10-31 15:34:30 -0700109 }
110
111 @Override
112 public boolean isConnected() {
Carmelo Cascone3977ea42019-02-28 13:43:42 -0800113 return p4runtime.isConnected() && gnmi.isConnected();
Yi Tsengd7716482018-10-31 15:34:30 -0700114 }
115
116 @Override
Carmelo Cascone3977ea42019-02-28 13:43:42 -0800117 public void disconnect() {
118 p4runtime.disconnect();
119 gnmi.disconnect();
Yi Tsengd7716482018-10-31 15:34:30 -0700120 }
121}