blob: 4d84b2aac21e40c4a83f863dc19b219279f8352c [file] [log] [blame]
Andrea Campanella241896c2017-05-10 13:11:04 -07001/*
Brian O'Connora09fe5b2017-08-03 21:12:30 -07002 * Copyright 2017-present Open Networking Foundation
Andrea Campanella241896c2017-05-10 13:11:04 -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
Andrea Campanella0288c872017-08-07 18:32:51 +020017package org.onosproject.drivers.p4runtime;
Andrea Campanella241896c2017-05-10 13:11:04 -070018
Andrea Campanella378e21a2017-06-07 12:09:59 +020019import org.onosproject.net.DeviceId;
Andrea Campanella241896c2017-05-10 13:11:04 -070020import org.onosproject.net.MastershipRole;
Carmelo Casconee5b28722018-06-22 17:28:28 +020021import org.onosproject.net.device.DeviceAgentListener;
Andrea Campanella241896c2017-05-10 13:11:04 -070022import org.onosproject.net.device.DeviceHandshaker;
Carmelo Cascone9e4972c2018-08-30 00:29:16 -070023import org.onosproject.net.provider.ProviderId;
Carmelo Cascone158b8c42018-07-04 19:42:37 +020024import org.onosproject.p4runtime.api.P4RuntimeClient;
Carmelo Cascone59f57de2017-07-11 19:55:09 -040025import org.onosproject.p4runtime.api.P4RuntimeController;
Andrea Campanella241896c2017-05-10 13:11:04 -070026
27import java.util.concurrent.CompletableFuture;
28
Andrea Campanella241896c2017-05-10 13:11:04 -070029/**
Carmelo Casconee3a7c742017-09-01 01:25:52 +020030 * Implementation of DeviceHandshaker for P4Runtime.
Andrea Campanella241896c2017-05-10 13:11:04 -070031 */
Carmelo Casconee3a7c742017-09-01 01:25:52 +020032public class P4RuntimeHandshaker extends AbstractP4RuntimeHandlerBehaviour implements DeviceHandshaker {
Andrea Campanella241896c2017-05-10 13:11:04 -070033
34 @Override
35 public CompletableFuture<Boolean> connect() {
Carmelo Casconee5b28722018-06-22 17:28:28 +020036 return CompletableFuture
37 .supplyAsync(super::createClient)
Carmelo Cascone4c289b72019-01-22 15:30:45 -080038 .thenApplyAsync(client -> {
Carmelo Casconee5b28722018-06-22 17:28:28 +020039 if (client == null) {
Carmelo Cascone4c289b72019-01-22 15:30:45 -080040 return false;
Carmelo Casconee5b28722018-06-22 17:28:28 +020041 }
Carmelo Cascone4c289b72019-01-22 15:30:45 -080042 client.openSession();
43 return true;
Carmelo Casconee5b28722018-06-22 17:28:28 +020044 });
Andrea Campanella241896c2017-05-10 13:11:04 -070045 }
46
47 @Override
Carmelo Cascone9e4972c2018-08-30 00:29:16 -070048 public boolean isConnected() {
49 final P4RuntimeController controller = handler().get(P4RuntimeController.class);
50 final DeviceId deviceId = handler().data().deviceId();
51 final P4RuntimeClient client = controller.getClient(deviceId);
Carmelo Cascone4c289b72019-01-22 15:30:45 -080052 return client != null && client.isSessionOpen();
Carmelo Cascone9e4972c2018-08-30 00:29:16 -070053 }
54
55 @Override
Andrea Campanella241896c2017-05-10 13:11:04 -070056 public CompletableFuture<Boolean> disconnect() {
Carmelo Casconee5b28722018-06-22 17:28:28 +020057 final P4RuntimeController controller = handler().get(P4RuntimeController.class);
58 final DeviceId deviceId = handler().data().deviceId();
Carmelo Cascone158b8c42018-07-04 19:42:37 +020059 final P4RuntimeClient client = controller.getClient(deviceId);
60 if (client == null) {
Carmelo Casconee5b28722018-06-22 17:28:28 +020061 return CompletableFuture.completedFuture(true);
Carmelo Casconee5b28722018-06-22 17:28:28 +020062 }
Carmelo Cascone158b8c42018-07-04 19:42:37 +020063 return client.shutdown()
64 .thenApplyAsync(v -> {
65 controller.removeClient(deviceId);
66 return true;
67 });
Andrea Campanella241896c2017-05-10 13:11:04 -070068 }
69
70 @Override
71 public CompletableFuture<Boolean> isReachable() {
Carmelo Cascone9e4972c2018-08-30 00:29:16 -070072 return CompletableFuture
73 // P4RuntimeController requires a client to be created to
74 // check for reachability.
75 .supplyAsync(super::createClient)
76 .thenApplyAsync(client -> {
77 if (client == null) {
78 return false;
79 }
80 return handler()
81 .get(P4RuntimeController.class)
82 .isReachable(handler().data().deviceId());
83 });
Andrea Campanella241896c2017-05-10 13:11:04 -070084 }
85
86 @Override
Carmelo Casconee5b28722018-06-22 17:28:28 +020087 public void roleChanged(MastershipRole newRole) {
88 if (setupBehaviour() && newRole.equals(MastershipRole.MASTER)) {
Carmelo Cascone4c289b72019-01-22 15:30:45 -080089 client.runForMastership();
Yi Tseng3e7f1452017-10-20 10:31:53 -070090 }
Andrea Campanella241896c2017-05-10 13:11:04 -070091 }
Andrea Campanella1e573442018-05-17 17:07:13 +020092
93 @Override
Carmelo Cascone9e4972c2018-08-30 00:29:16 -070094 public MastershipRole getRole() {
95 final P4RuntimeController controller = handler().get(P4RuntimeController.class);
96 final DeviceId deviceId = handler().data().deviceId();
97 final P4RuntimeClient client = controller.getClient(deviceId);
Carmelo Cascone4c289b72019-01-22 15:30:45 -080098 if (client == null || !client.isSessionOpen()) {
Carmelo Cascone9e4972c2018-08-30 00:29:16 -070099 return MastershipRole.NONE;
100 }
101 return client.isMaster() ? MastershipRole.MASTER : MastershipRole.STANDBY;
Andrea Campanella1e573442018-05-17 17:07:13 +0200102 }
103
104 @Override
Carmelo Cascone9e4972c2018-08-30 00:29:16 -0700105 public void addDeviceAgentListener(ProviderId providerId, DeviceAgentListener listener) {
106 // Don't use controller/deviceId class variables as they might be uninitialized.
107 handler().get(P4RuntimeController.class)
108 .addDeviceAgentListener(data().deviceId(), providerId, listener);
109 }
110
111 @Override
112 public void removeDeviceAgentListener(ProviderId providerId) {
Carmelo Cascone7044efd2018-07-06 13:01:36 +0200113 // Don't use controller/deviceId class variable as they might be uninitialized.
Carmelo Cascone158b8c42018-07-04 19:42:37 +0200114 handler().get(P4RuntimeController.class)
Carmelo Cascone9e4972c2018-08-30 00:29:16 -0700115 .removeDeviceAgentListener(data().deviceId(), providerId);
Andrea Campanella1e573442018-05-17 17:07:13 +0200116 }
Andrea Campanella241896c2017-05-10 13:11:04 -0700117}