blob: 5d74947e791cd977e72a2eb3e59a80a70b5c1201 [file] [log] [blame]
Andrea Campanella241896c2017-05-10 13:11:04 -07001/*
2 * Copyright 2017-present Open Networking Laboratory
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.bmv2;
18
Carmelo Cascone59f57de2017-07-11 19:55:09 -040019import io.grpc.ManagedChannelBuilder;
20import io.grpc.netty.NettyChannelBuilder;
Andrea Campanella378e21a2017-06-07 12:09:59 +020021import org.onosproject.net.DeviceId;
Andrea Campanella241896c2017-05-10 13:11:04 -070022import org.onosproject.net.MastershipRole;
23import org.onosproject.net.device.DeviceHandshaker;
24import org.onosproject.net.driver.AbstractHandlerBehaviour;
25import org.onosproject.net.driver.DriverData;
Carmelo Cascone59f57de2017-07-11 19:55:09 -040026import org.onosproject.p4runtime.api.P4RuntimeController;
Andrea Campanella241896c2017-05-10 13:11:04 -070027import org.slf4j.Logger;
28
29import java.util.concurrent.CompletableFuture;
30
31import static org.slf4j.LoggerFactory.getLogger;
32
33/**
Carmelo Cascone59f57de2017-07-11 19:55:09 -040034 * Implementation of DeviceHandshaker for BMv2.
Andrea Campanella241896c2017-05-10 13:11:04 -070035 */
Andrea Campanella241896c2017-05-10 13:11:04 -070036public class Bmv2Handshaker extends AbstractHandlerBehaviour
37 implements DeviceHandshaker {
38
39 private final Logger log = getLogger(getClass());
40
Carmelo Cascone59f57de2017-07-11 19:55:09 -040041 // TODO: consider abstract class with empty connect method and implementation into a protected one for reusability.
42
Andrea Campanella241896c2017-05-10 13:11:04 -070043 @Override
44 public CompletableFuture<Boolean> connect() {
Carmelo Cascone59f57de2017-07-11 19:55:09 -040045 return CompletableFuture.supplyAsync(this::doConnect);
46 }
47
48 private boolean doConnect() {
49
50 P4RuntimeController controller = handler().get(P4RuntimeController.class);
51
Andrea Campanella378e21a2017-06-07 12:09:59 +020052 DeviceId deviceId = handler().data().deviceId();
Carmelo Cascone59f57de2017-07-11 19:55:09 -040053 // DeviceKeyService deviceKeyService = handler().get(DeviceKeyService.class);
Andrea Campanella241896c2017-05-10 13:11:04 -070054 DriverData data = data();
Andrea Campanella241896c2017-05-10 13:11:04 -070055
Carmelo Cascone59f57de2017-07-11 19:55:09 -040056 String serverAddr = data.value("p4runtime_ip");
57 int serverPort = Integer.valueOf(data.value("p4runtime_port"));
58 int p4DeviceId = Integer.valueOf(data.value("p4runtime_deviceId"));
Andrea Campanella378e21a2017-06-07 12:09:59 +020059
Carmelo Cascone59f57de2017-07-11 19:55:09 -040060 ManagedChannelBuilder channelBuilder = NettyChannelBuilder
61 .forAddress(serverAddr, serverPort)
62 .usePlaintext(true);
63
64 if (!controller.createClient(deviceId, p4DeviceId, channelBuilder)) {
65 log.warn("Unable to create P4runtime client for {}", deviceId);
66 return false;
67 }
68
69 // TODO: gNMI handling
70
71 return true;
Andrea Campanella241896c2017-05-10 13:11:04 -070072 }
73
74 @Override
75 public CompletableFuture<Boolean> disconnect() {
Carmelo Cascone59f57de2017-07-11 19:55:09 -040076 return CompletableFuture.supplyAsync(() -> {
77 P4RuntimeController controller = handler().get(P4RuntimeController.class);
78 DeviceId deviceId = handler().data().deviceId();
79 controller.removeClient(deviceId);
80 return true;
81 });
Andrea Campanella241896c2017-05-10 13:11:04 -070082 }
83
84 @Override
85 public CompletableFuture<Boolean> isReachable() {
Carmelo Cascone59f57de2017-07-11 19:55:09 -040086 return CompletableFuture.supplyAsync(() -> {
87 P4RuntimeController controller = handler().get(P4RuntimeController.class);
88 DeviceId deviceId = handler().data().deviceId();
89 return controller.isReacheable(deviceId);
90 });
Andrea Campanella241896c2017-05-10 13:11:04 -070091 }
92
93 @Override
94 public CompletableFuture<MastershipRole> roleChanged(MastershipRole newRole) {
95 CompletableFuture<MastershipRole> result = new CompletableFuture<>();
Carmelo Cascone59f57de2017-07-11 19:55:09 -040096 log.warn("roleChanged not implemented");
Andrea Campanella241896c2017-05-10 13:11:04 -070097 result.complete(MastershipRole.MASTER);
Carmelo Cascone59f57de2017-07-11 19:55:09 -040098 // TODO.
Andrea Campanella241896c2017-05-10 13:11:04 -070099 return result;
100 }
Andrea Campanella241896c2017-05-10 13:11:04 -0700101}