blob: 49f79f9eaf86826554a5c16cc14e05a0925b5fd1 [file] [log] [blame]
Carmelo Casconee3a7c742017-09-01 01:25:52 +02001/*
2 * Copyright 2017-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.p4runtime;
18
Carmelo Casconec2be50a2019-04-10 00:15:39 -070019import org.onosproject.grpc.utils.AbstractGrpcHandlerBehaviour;
Carmelo Casconee3a7c742017-09-01 01:25:52 +020020import org.onosproject.net.pi.model.PiPipeconf;
Carmelo Cascone39c28ca2017-11-15 13:03:57 -080021import org.onosproject.net.pi.service.PiPipeconfService;
22import org.onosproject.net.pi.service.PiTranslationService;
Carmelo Casconee3a7c742017-09-01 01:25:52 +020023import org.onosproject.p4runtime.api.P4RuntimeClient;
24import org.onosproject.p4runtime.api.P4RuntimeController;
Carmelo Casconee5b28722018-06-22 17:28:28 +020025
Carmelo Cascone3da671a2018-02-12 10:43:35 -080026import static com.google.common.base.Preconditions.checkNotNull;
Carmelo Casconec2be50a2019-04-10 00:15:39 -070027import static org.onosproject.drivers.p4runtime.P4RuntimeDriverUtils.extractP4DeviceId;
Carmelo Cascone3da671a2018-02-12 10:43:35 -080028
Carmelo Casconee3a7c742017-09-01 01:25:52 +020029/**
30 * Abstract implementation of a behaviour handler for a P4Runtime device.
31 */
Carmelo Casconec2be50a2019-04-10 00:15:39 -070032public abstract class AbstractP4RuntimeHandlerBehaviour
33 extends AbstractGrpcHandlerBehaviour<P4RuntimeClient, P4RuntimeController> {
Carmelo Casconee3a7c742017-09-01 01:25:52 +020034
35 // Initialized by setupBehaviour()
Carmelo Casconec2be50a2019-04-10 00:15:39 -070036 protected Long p4DeviceId;
Carmelo Casconee3a7c742017-09-01 01:25:52 +020037 protected PiPipeconf pipeconf;
Carmelo Casconec2be50a2019-04-10 00:15:39 -070038 PiTranslationService translationService;
39
40
Daniele Moro464e5ed2019-07-25 14:45:01 -070041 public AbstractP4RuntimeHandlerBehaviour() {
Carmelo Casconec2be50a2019-04-10 00:15:39 -070042 super(P4RuntimeController.class);
43 }
Carmelo Casconee3a7c742017-09-01 01:25:52 +020044
45 /**
Carmelo Cascone3da671a2018-02-12 10:43:35 -080046 * Initializes this behaviour attributes. Returns true if the operation was
Carmelo Casconec32976e2019-04-08 14:50:52 -070047 * successful, false otherwise.
Carmelo Casconee3a7c742017-09-01 01:25:52 +020048 *
Carmelo Casconec32976e2019-04-08 14:50:52 -070049 * @param opName name of the operation
Carmelo Casconee3a7c742017-09-01 01:25:52 +020050 * @return true if successful, false otherwise
51 */
Carmelo Casconec32976e2019-04-08 14:50:52 -070052 protected boolean setupBehaviour(String opName) {
Carmelo Casconec2be50a2019-04-10 00:15:39 -070053 if (!super.setupBehaviour(opName)) {
Carmelo Casconee3a7c742017-09-01 01:25:52 +020054 return false;
55 }
Carmelo Casconee3a7c742017-09-01 01:25:52 +020056
Carmelo Casconec2be50a2019-04-10 00:15:39 -070057 p4DeviceId = extractP4DeviceId(mgmtUriFromNetcfg());
58 if (p4DeviceId == null) {
59 log.warn("Unable to obtain P4Runtime-internal device_id from " +
60 "config of {}, cannot perform {}",
61 deviceId, opName);
62 return false;
63 }
64
65 final PiPipeconfService pipeconfService = handler().get(
66 PiPipeconfService.class);
Carmelo Cascone5505a6d2019-04-17 20:03:24 -070067 pipeconf = pipeconfService.getPipeconf(deviceId).orElse(null);
68 if (pipeconf == null) {
Carmelo Casconec32976e2019-04-08 14:50:52 -070069 log.warn("Missing pipeconf for {}, cannot perform {}", deviceId, opName);
Carmelo Casconee3a7c742017-09-01 01:25:52 +020070 return false;
71 }
Carmelo Casconee3a7c742017-09-01 01:25:52 +020072
Yi Tsengd7716482018-10-31 15:34:30 -070073 translationService = handler().get(PiTranslationService.class);
Carmelo Cascone87b9b392017-10-02 18:33:20 +020074
Carmelo Casconee3a7c742017-09-01 01:25:52 +020075 return true;
76 }
77
78 /**
Carmelo Casconee5b28722018-06-22 17:28:28 +020079 * Returns the value of the given driver property, if present, otherwise
80 * returns the given default value.
Carmelo Cascone3da671a2018-02-12 10:43:35 -080081 *
Carmelo Casconee5b28722018-06-22 17:28:28 +020082 * @param propName property name
Carmelo Cascone3da671a2018-02-12 10:43:35 -080083 * @param defaultVal default value
84 * @return boolean
85 */
Yi Tsengd7716482018-10-31 15:34:30 -070086 boolean driverBoolProperty(String propName, boolean defaultVal) {
Carmelo Cascone3da671a2018-02-12 10:43:35 -080087 checkNotNull(propName);
88 if (handler().driver().getProperty(propName) == null) {
89 return defaultVal;
90 } else {
91 return Boolean.parseBoolean(handler().driver().getProperty(propName));
92 }
93 }
Carmelo Casconee3a7c742017-09-01 01:25:52 +020094}