3db6d30a13e2924e7ccdc73c68a11da2ce6e12d5
[vpp.git] / src / vpp-api / java / jvpp-core / io / fd / vpp / jvpp / core / examples / CreateSubInterfaceExample.java
1 /*
2  * Copyright (c) 2016 Cisco and/or its affiliates.
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
17 package io.fd.vpp.jvpp.core.examples;
18
19 import static java.util.Objects.requireNonNull;
20
21 import io.fd.vpp.jvpp.JVppRegistry;
22 import io.fd.vpp.jvpp.JVppRegistryImpl;
23 import io.fd.vpp.jvpp.core.JVppCoreImpl;
24 import io.fd.vpp.jvpp.core.dto.CreateSubif;
25 import io.fd.vpp.jvpp.core.dto.CreateSubifReply;
26 import io.fd.vpp.jvpp.core.dto.SwInterfaceDetailsReplyDump;
27 import io.fd.vpp.jvpp.core.dto.SwInterfaceDump;
28 import io.fd.vpp.jvpp.core.future.FutureJVppCoreFacade;
29 import java.nio.charset.StandardCharsets;
30
31 /**
32  * <p>Tests sub-interface creation.<br> Equivalent to:<br>
33  *
34  * <pre>{@code
35  * vppctl create sub GigabitEthernet0/9/0 1 dot1q 100 inner-dot1q any
36  * }
37  * </pre>
38  *
39  * To verify invoke:<br>
40  * <pre>{@code
41  * vpp_api_test json
42  * vat# sw_interface_dump
43  * }
44  */
45 public class CreateSubInterfaceExample {
46
47     private static SwInterfaceDump createSwInterfaceDumpRequest(final String ifaceName) {
48         SwInterfaceDump request = new SwInterfaceDump();
49         request.nameFilter = ifaceName.getBytes(StandardCharsets.UTF_8);
50         request.nameFilterValid = 1;
51         return request;
52     }
53
54     private static void requireSingleIface(final SwInterfaceDetailsReplyDump response, final String ifaceName) {
55         if (response.swInterfaceDetails.size() != 1) {
56             throw new IllegalStateException(
57                 String.format("Expected one interface matching filter %s but was %d", ifaceName,
58                     response.swInterfaceDetails.size()));
59         }
60     }
61
62     private static CreateSubif createSubifRequest(final int swIfIndex, final int subId) {
63         CreateSubif request = new CreateSubif();
64         request.swIfIndex = swIfIndex; // super interface id
65         request.subId = subId;
66         request.noTags = 0;
67         request.oneTag = 0;
68         request.twoTags = 1;
69         request.dot1Ad = 0;
70         request.exactMatch = 1;
71         request.defaultSub = 0;
72         request.outerVlanIdAny = 0;
73         request.innerVlanIdAny = 1;
74         request.outerVlanId = 100;
75         request.innerVlanId = 0;
76         return request;
77     }
78
79     private static void print(CreateSubifReply reply) {
80         System.out.printf("CreateSubifReply: %s%n", reply);
81     }
82
83     private static void testCreateSubInterface() throws Exception {
84         System.out.println("Testing sub-interface creation using Java callback API");
85         try (final JVppRegistry registry = new JVppRegistryImpl("CreateSubInterfaceExample");
86              final FutureJVppCoreFacade jvppFacade = new FutureJVppCoreFacade(registry, new JVppCoreImpl())) {
87             System.out.println("Successfully connected to VPP");
88             Thread.sleep(1000);
89
90             final String ifaceName = "Gigabitethernet0/8/0";
91
92             final SwInterfaceDetailsReplyDump swInterfaceDetails =
93                 jvppFacade.swInterfaceDump(createSwInterfaceDumpRequest(ifaceName)).toCompletableFuture().get();
94
95             requireNonNull(swInterfaceDetails, "swInterfaceDump returned null");
96             requireNonNull(swInterfaceDetails.swInterfaceDetails, "swInterfaceDetails is null");
97             requireSingleIface(swInterfaceDetails, ifaceName);
98
99             final int swIfIndex = swInterfaceDetails.swInterfaceDetails.get(0).swIfIndex;
100             final int subId = 1;
101
102             final CreateSubifReply createSubifReply =
103                 jvppFacade.createSubif(createSubifRequest(swIfIndex, subId)).toCompletableFuture().get();
104             print(createSubifReply);
105
106             final String subIfaceName = "Gigabitethernet0/8/0." + subId;
107             final SwInterfaceDetailsReplyDump subIface =
108                 jvppFacade.swInterfaceDump(createSwInterfaceDumpRequest(subIfaceName)).toCompletableFuture().get();
109             requireNonNull(swInterfaceDetails, "swInterfaceDump returned null");
110             requireNonNull(subIface.swInterfaceDetails, "swInterfaceDump returned null");
111             requireSingleIface(swInterfaceDetails, ifaceName);
112
113             System.out.println("Disconnecting...");
114         }
115         Thread.sleep(1000);
116     }
117
118     public static void main(String[] args) throws Exception {
119         testCreateSubInterface();
120     }
121 }