Addressing review comments for 7920
[ovsdb.git] / library / src / test / java / org / opendaylight / ovsdb / lib / OvsDBClientTestIT.java
1 /*
2  * Copyright (C) 2014 EBay Software Foundation
3  *
4  * This program and the accompanying materials are made available under the
5  * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6  * and is available at http://www.eclipse.org/legal/epl-v10.html
7  *
8  * Authors : Ashwin Raveendran
9  */
10 package org.opendaylight.ovsdb.lib;
11
12 import static org.opendaylight.ovsdb.lib.operations.Operations.op;
13
14 import java.io.IOException;
15 import java.util.List;
16 import java.util.Set;
17 import java.util.concurrent.ExecutionException;
18 import java.util.concurrent.ExecutorService;
19 import java.util.concurrent.Executors;
20
21 import junit.framework.Assert;
22
23 import org.junit.After;
24 import org.junit.Before;
25 import org.junit.Test;
26 import org.opendaylight.ovsdb.lib.message.MonitorRequest;
27 import org.opendaylight.ovsdb.lib.message.MonitorRequestBuilder;
28 import org.opendaylight.ovsdb.lib.message.MonitorSelect;
29 import org.opendaylight.ovsdb.lib.message.OvsdbRPC;
30 import org.opendaylight.ovsdb.lib.message.TableUpdates;
31 import org.opendaylight.ovsdb.lib.message.UpdateNotification;
32 import org.opendaylight.ovsdb.lib.notation.Column;
33 import org.opendaylight.ovsdb.lib.notation.Mutator;
34 import org.opendaylight.ovsdb.lib.notation.Row;
35 import org.opendaylight.ovsdb.lib.notation.UUID;
36 import org.opendaylight.ovsdb.lib.operations.OperationResult;
37 import org.opendaylight.ovsdb.lib.schema.ColumnSchema;
38 import org.opendaylight.ovsdb.lib.schema.DatabaseSchema;
39 import org.opendaylight.ovsdb.lib.schema.GenericTableSchema;
40 import org.opendaylight.ovsdb.lib.schema.TableSchema;
41 import org.slf4j.Logger;
42 import org.slf4j.LoggerFactory;
43
44 import com.google.common.collect.Lists;
45 import com.google.common.collect.Sets;
46 import com.google.common.util.concurrent.ListenableFuture;
47
48
49 public class OvsDBClientTestIT extends OvsdbTestBase {
50     Logger logger = LoggerFactory.getLogger(OvsDBClientTestIT.class);
51
52     OvsDBClientImpl ovs;
53     DatabaseSchema dbSchema = null;
54     static String testBridgeName = "br-test";
55     static UUID testBridgeUuid = null;
56     @Test
57     public void testTransact() throws IOException, InterruptedException, ExecutionException {
58         Assert.assertNotNull(dbSchema);
59         TableSchema<GenericTableSchema> bridge = dbSchema.table("Bridge", GenericTableSchema.class);
60         ColumnSchema<GenericTableSchema, String> name = bridge.column("name", String.class);
61
62         createBridgeTransaction();
63         abortTransaction();
64         assertTransaction();
65     }
66
67     @Test
68     public void testMonitorRequest() throws ExecutionException, InterruptedException, IOException {
69         Assert.assertNotNull(dbSchema);
70         // Create Test Bridge before testing the Monitor operation
71         createBridgeTransaction();
72
73         GenericTableSchema bridge = dbSchema.table("Bridge", GenericTableSchema.class);
74
75         List<MonitorRequest<GenericTableSchema>> monitorRequests = Lists.newArrayList();
76         ColumnSchema<GenericTableSchema, Set<Integer>> flood_vlans = bridge.multiValuedColumn("flood_vlans", Integer.class);
77
78         monitorRequests.add(
79                 MonitorRequestBuilder.builder(bridge)
80                         .addColumn(bridge.column("name"))
81                         .addColumn(bridge.column("fail_mode", String.class))
82                         .addColumn(flood_vlans)
83                         .with(new MonitorSelect(true, true, true, true))
84                         .build());
85
86         final List<Object> results = Lists.newArrayList();
87
88         MonitorHandle monitor = ovs.monitor(dbSchema, monitorRequests, new MonitorCallBack() {
89             @Override
90             public void update(TableUpdates result) {
91                 results.add(result);
92                 System.out.println("result = " + result);
93             }
94
95             @Override
96             public void exception(Throwable t) {
97                 results.add(t);
98                 System.out.println("t = " + t);
99             }
100         });
101
102         for (int i = 0; i < 5 ; i++) { //wait 5 seconds to get a result
103             System.out.println("waiting");
104             Thread.sleep(1000);
105         }
106
107         Assert.assertTrue(!results.isEmpty());
108         Object result = results.get(0);
109         Assert.assertTrue(result instanceof TableUpdates);
110         TableUpdates updates = (TableUpdates) result;
111         org.opendaylight.ovsdb.lib.message.TableUpdate<GenericTableSchema> update = updates.getUpdate(bridge);
112         Row<GenericTableSchema> aNew = update.getNew();
113         for (Column<GenericTableSchema, ?> column: aNew.getColumns()) {
114             if (column.getSchema().equals(flood_vlans)) {
115                 Set<Integer> data = column.getData(flood_vlans);
116                 Assert.assertTrue(!data.isEmpty());
117             }
118         }
119     }
120
121     private void createBridgeTransaction() throws IOException, InterruptedException, ExecutionException {
122         Assert.assertNotNull(dbSchema);
123         TableSchema<GenericTableSchema> bridge = dbSchema.table("Bridge", GenericTableSchema.class);
124         GenericTableSchema ovsTable = dbSchema.table("Open_vSwitch", GenericTableSchema.class);
125
126         ColumnSchema<GenericTableSchema, String> name = bridge.column("name", String.class);
127         ColumnSchema<GenericTableSchema, String> fail_mode = bridge.column("fail_mode", String.class);
128         ColumnSchema<GenericTableSchema, Set<Integer>> flood_vlans = bridge.multiValuedColumn("flood_vlans", Integer.class);
129         ColumnSchema<GenericTableSchema, Set<UUID>> bridges = ovsTable.multiValuedColumn("bridges", UUID.class);
130
131         String namedUuid = "br_test";
132         int nOperations = 7;
133         int insertOperationIndex = 0;
134         ListenableFuture<List<OperationResult>> results = ovs.transactBuilder()
135                  /*
136                   * Make sure that the position of insert operation matches the insertOperationIndex.
137                   * This will be used later when the Results are processed.
138                   */
139                 .add(op.insert(bridge)
140                         .withId(namedUuid)
141                         .value(name, testBridgeName)
142                         .value(flood_vlans, Sets.newHashSet(100, 101, 4001)))
143                 .add(op.comment("Inserting Bridge br-int"))
144                 .add(op.update(bridge)
145                         .set(fail_mode, "secure")
146                         .where(name.opEqual(testBridgeName))
147                         .build())
148                 .add(op.select(bridge)
149                         .column(name)
150                         .where(name.opEqual(testBridgeName))
151                         .build())
152                 .add(op.mutate(bridge)
153                         .addMutation(flood_vlans, Mutator.INSERT, Sets.newHashSet(200,400))
154                         .where(name.opEqual(testBridgeName))
155                         .build())
156                 .add(op.mutate(ovsTable)
157                         .addMutation(bridges, Mutator.INSERT, Sets.newHashSet(new UUID(namedUuid))))
158                 .add(op.commit(true))
159                 .execute();
160
161         List<OperationResult> operationResults = results.get();
162         Assert.assertFalse(operationResults.isEmpty());
163         // Check if Results matches the number of operations in transaction
164         Assert.assertEquals(nOperations, operationResults.size());
165         System.out.println("Insert & Update operation results = " + operationResults);
166         testBridgeUuid = operationResults.get(insertOperationIndex).getUuid();
167     }
168
169     private void assertTransaction() throws InterruptedException, ExecutionException {
170         Assert.assertNotNull(dbSchema);
171         TableSchema<GenericTableSchema> bridge = dbSchema.table("Bridge", GenericTableSchema.class);
172         ColumnSchema<GenericTableSchema, String> name = bridge.column("name", String.class);
173
174         /*
175          * Adding a separate Assert operation in a transaction. Lets not mix this with other
176          * valid transactions as above.
177          */
178         ListenableFuture<List<OperationResult>> results = ovs.transactBuilder()
179                 .add(op.delete(bridge)
180                         .where(name.opEqual(testBridgeName))
181                         .build())
182                 .add(op.assertion("Assert12345")) // Failing intentionally
183                 .execute();
184
185         List<OperationResult> operationResults = results.get();
186         Assert.assertFalse(operationResults.isEmpty());
187         /* Testing for an Assertion Error */
188         Assert.assertFalse(operationResults.get(1).getError() == null);
189         System.out.println("Assert operation results = " + operationResults);
190     }
191
192     private void abortTransaction() throws InterruptedException, ExecutionException {
193         Assert.assertNotNull(dbSchema);
194         TableSchema<GenericTableSchema> bridge = dbSchema.table("Bridge", GenericTableSchema.class);
195         ColumnSchema<GenericTableSchema, String> name = bridge.column("name", String.class);
196
197         /*
198          * Adding a separate Abort operation in a transaction. Lets not mix this with other
199          * valid transactions as above.
200          */
201         ListenableFuture<List<OperationResult>> results = ovs.transactBuilder()
202                 .add(op.delete(bridge)
203                         .where(name.opEqual(testBridgeName))
204                         .build())
205                 .add(op.abort())
206                 .execute();
207
208         List<OperationResult> operationResults = results.get();
209         Assert.assertFalse(operationResults.isEmpty());
210         /* Testing for Abort Error */
211         Assert.assertFalse(operationResults.get(1).getError() == null);
212         System.out.println("Abort operation results = " + operationResults);
213     }
214
215     public void testGetDBs() throws ExecutionException, InterruptedException {
216         ListenableFuture<List<String>> databases = ovs.getDatabases();
217         List<String> dbNames = databases.get();
218         Assert.assertNotNull(dbNames);
219         boolean hasOpenVswitchSchema = false;
220         for(String dbName : dbNames) {
221            if (dbName.equals(OPEN_VSWITCH_SCHEMA)) {
222                 hasOpenVswitchSchema = true;
223                 break;
224            }
225         }
226         Assert.assertTrue(OPEN_VSWITCH_SCHEMA+" schema is not supported by the switch", hasOpenVswitchSchema);
227     }
228
229     @Before
230     public  void setUp() throws IOException, ExecutionException, InterruptedException {
231         if (ovs != null) {
232             return;
233         }
234         OvsdbRPC rpc = getTestConnection();
235         if (rpc == null) {
236             System.out.println("Unable to Establish Test Connection");
237         }
238         ExecutorService executorService = Executors.newFixedThreadPool(3);
239         ovs = new OvsDBClientImpl(rpc, executorService);
240         testGetDBs();
241         dbSchema = ovs.getSchema(OPEN_VSWITCH_SCHEMA, true).get();
242     }
243
244     @After
245     public void tearDown() throws InterruptedException, ExecutionException {
246         TableSchema<GenericTableSchema> bridge = dbSchema.table("Bridge", GenericTableSchema.class);
247         ColumnSchema<GenericTableSchema, String> name = bridge.column("name", String.class);
248         GenericTableSchema ovsTable = dbSchema.table("Open_vSwitch", GenericTableSchema.class);
249         ColumnSchema<GenericTableSchema, Set<UUID>> bridges = ovsTable.multiValuedColumn("bridges", UUID.class);
250
251         ListenableFuture<List<OperationResult>> results = ovs.transactBuilder()
252                 .add(op.delete(bridge)
253                         .where(name.opEqual(testBridgeName))
254                         .build())
255                 .add(op.mutate(ovsTable)
256                         .addMutation(bridges, Mutator.DELETE, Sets.newHashSet(testBridgeUuid)))
257                 .add(op.commit(true))
258                 .execute();
259
260         List<OperationResult> operationResults = results.get();
261         System.out.println("Delete operation results = " + operationResults);
262     }
263
264
265     @Override
266     public void update(Object node, UpdateNotification upadateNotification) {
267         // TODO Auto-generated method stub
268
269     }
270
271     @Override
272     public void locked(Object node, List<String> ids) {
273         // TODO Auto-generated method stub
274
275     }
276     @Override
277     public void stolen(Object node, List<String> ids) {
278         // TODO Auto-generated method stub
279
280     }
281 }