Add GroupMessageService 25/50925/10
authorTomas Slusny <tomas.slusny@pantheon.tech>
Tue, 24 Jan 2017 09:31:56 +0000 (10:31 +0100)
committerTomas Slusny <tomas.slusny@pantheon.tech>
Wed, 15 Feb 2017 15:13:41 +0000 (16:13 +0100)
Add GroupMessageService that will convert Group to GroupMessage and
send this meesage to serialization.
Update SalGroupServiceImpl to use GroupMessageService if supported
and enabled.

See also: bug 7139

Change-Id: I07c2f8949f4b89d0cb921d82dfaed3159ca7da8e
Signed-off-by: Tomas Slusny <tomas.slusny@pantheon.tech>
openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/services/GroupMessageService.java [new file with mode: 0644]
openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/services/SalGroupServiceImpl.java

diff --git a/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/services/GroupMessageService.java b/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/services/GroupMessageService.java
new file mode 100644 (file)
index 0000000..7f48028
--- /dev/null
@@ -0,0 +1,59 @@
+/**
+ * Copyright (c) 2017 Pantheon Technologies s.r.o. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+
+package org.opendaylight.openflowplugin.impl.services;
+
+import org.opendaylight.openflowplugin.api.OFConstants;
+import org.opendaylight.openflowplugin.api.openflow.device.DeviceContext;
+import org.opendaylight.openflowplugin.api.openflow.device.RequestContextStack;
+import org.opendaylight.openflowplugin.api.openflow.device.Xid;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.group.service.rev130918.AddGroupInput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.group.service.rev130918.RemoveGroupInput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.group.service.rev130918.group.update.OriginalGroup;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.group.service.rev130918.group.update.UpdatedGroup;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.Group;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.GroupMessageBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.GroupModCommand;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.OfHeader;
+import org.opendaylight.yangtools.yang.binding.DataContainer;
+import org.opendaylight.yangtools.yang.binding.DataObject;
+
+final class GroupMessageService<O extends DataObject> extends AbstractMessageService<Group, GroupMessageBuilder, O> {
+
+    protected GroupMessageService(
+            final RequestContextStack requestContextStack,
+            final DeviceContext deviceContext,
+            final Class<O> clazz) {
+        super(requestContextStack, deviceContext, clazz);
+    }
+
+    @Override
+    protected OfHeader buildRequest(final Xid xid, final Group input) throws ServiceException {
+        final GroupMessageBuilder groupMessageBuilder = new GroupMessageBuilder(input);
+        final Class<? extends DataContainer> clazz = input.getImplementedInterface();
+
+        if (clazz.equals(AddGroupInput.class)
+                || clazz.equals(UpdatedGroup.class)) {
+            groupMessageBuilder.setCommand(GroupModCommand.OFPGCADD);
+        } else if (clazz.equals(RemoveGroupInput.class)
+                || clazz.equals(OriginalGroup.class)) {
+            groupMessageBuilder.setCommand(GroupModCommand.OFPGCDELETE);
+        }
+
+        return groupMessageBuilder
+                .setVersion(getVersion())
+                .setXid(xid.getValue())
+                .build();
+    }
+
+    @Override
+    public boolean isSupported() {
+        return super.isSupported() && getVersion() >= OFConstants.OFP_VERSION_1_3;
+    }
+
+}
index a6264a1ba704c68f552197d76712a3970a092121..946c701b3951b006b1834028f08d58b07acaa973 100644 (file)
@@ -42,6 +42,10 @@ public class SalGroupServiceImpl implements SalGroupService, ItemLifeCycleSource
     private final GroupService<AddGroupInput, AddGroupOutput> addGroup;
     private final GroupService<Group, UpdateGroupOutput> updateGroup;
     private final GroupService<RemoveGroupInput, RemoveGroupOutput> removeGroup;
+    private final GroupMessageService<AddGroupOutput> addGroupMessage;
+    private final GroupMessageService<UpdateGroupOutput> updateGroupMessage;
+    private final GroupMessageService<RemoveGroupOutput> removeGroupMessage;
+
     private final DeviceContext deviceContext;
     private ItemLifecycleListener itemLifecycleListener;
 
@@ -50,6 +54,10 @@ public class SalGroupServiceImpl implements SalGroupService, ItemLifeCycleSource
         addGroup = new GroupService<>(requestContextStack, deviceContext, AddGroupOutput.class, convertorExecutor);
         updateGroup = new GroupService<>(requestContextStack, deviceContext, UpdateGroupOutput.class, convertorExecutor);
         removeGroup = new GroupService<>(requestContextStack, deviceContext, RemoveGroupOutput.class, convertorExecutor);
+
+        addGroupMessage = new GroupMessageService<>(requestContextStack, deviceContext, AddGroupOutput.class);
+        updateGroupMessage = new GroupMessageService<>(requestContextStack, deviceContext, UpdateGroupOutput.class);
+        removeGroupMessage = new GroupMessageService<>(requestContextStack, deviceContext, RemoveGroupOutput.class);
     }
 
     @Override
@@ -59,7 +67,10 @@ public class SalGroupServiceImpl implements SalGroupService, ItemLifeCycleSource
 
     @Override
     public Future<RpcResult<AddGroupOutput>> addGroup(final AddGroupInput input) {
-        final ListenableFuture<RpcResult<AddGroupOutput>> resultFuture = addGroup.handleServiceCall(input);
+        final ListenableFuture<RpcResult<AddGroupOutput>> resultFuture = addGroupMessage.isSupported()
+            ? addGroupMessage.handleServiceCall(input)
+            : addGroup.handleServiceCall(input);
+
         Futures.addCallback(resultFuture, new FutureCallback<RpcResult<AddGroupOutput>>() {
             @Override
             public void onSuccess(RpcResult<AddGroupOutput> result) {
@@ -88,7 +99,10 @@ public class SalGroupServiceImpl implements SalGroupService, ItemLifeCycleSource
 
     @Override
     public Future<RpcResult<UpdateGroupOutput>> updateGroup(final UpdateGroupInput input) {
-        final ListenableFuture<RpcResult<UpdateGroupOutput>> resultFuture = updateGroup.handleServiceCall(input.getUpdatedGroup());
+        final ListenableFuture<RpcResult<UpdateGroupOutput>> resultFuture = updateGroupMessage.isSupported()
+            ? updateGroupMessage.handleServiceCall(input.getUpdatedGroup())
+            : updateGroup.handleServiceCall(input.getUpdatedGroup());
+
         Futures.addCallback(resultFuture, new FutureCallback<RpcResult<UpdateGroupOutput>>() {
             @Override
             public void onSuccess(@Nullable RpcResult<UpdateGroupOutput> result) {
@@ -118,7 +132,10 @@ public class SalGroupServiceImpl implements SalGroupService, ItemLifeCycleSource
 
     @Override
     public Future<RpcResult<RemoveGroupOutput>> removeGroup(final RemoveGroupInput input) {
-        final ListenableFuture<RpcResult<RemoveGroupOutput>> resultFuture = removeGroup.handleServiceCall(input);
+        final ListenableFuture<RpcResult<RemoveGroupOutput>> resultFuture = removeGroupMessage.isSupported()
+            ? removeGroupMessage.handleServiceCall(input)
+            : removeGroup.handleServiceCall(input);
+
         Futures.addCallback(resultFuture, new FutureCallback<RpcResult<RemoveGroupOutput>>() {
             @Override
             public void onSuccess(@Nullable RpcResult<RemoveGroupOutput> result) {
@@ -168,4 +185,4 @@ public class SalGroupServiceImpl implements SalGroupService, ItemLifeCycleSource
         return nodePath.augmentation(FlowCapableNode.class).
                 child(org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.groups.Group.class, new GroupKey(groupId));
     }
-}
\ No newline at end of file
+}