ONOS-6626 OFAgent - handle RoleRequest

Change-Id: I31b2f701a566a06126fa47fb5dd726779e625184
diff --git a/apps/ofagent/src/main/java/org/onosproject/ofagent/impl/DefaultOFSwitch.java b/apps/ofagent/src/main/java/org/onosproject/ofagent/impl/DefaultOFSwitch.java
index 116e1cf..8aa6b49 100644
--- a/apps/ofagent/src/main/java/org/onosproject/ofagent/impl/DefaultOFSwitch.java
+++ b/apps/ofagent/src/main/java/org/onosproject/ofagent/impl/DefaultOFSwitch.java
@@ -33,6 +33,8 @@
 import org.projectfloodlight.openflow.protocol.OFHello;
 import org.projectfloodlight.openflow.protocol.OFMessage;
 import org.projectfloodlight.openflow.protocol.OFMeterFeatures;
+import org.projectfloodlight.openflow.protocol.OFRoleReply;
+import org.projectfloodlight.openflow.protocol.OFRoleRequest;
 import org.projectfloodlight.openflow.protocol.OFSetConfig;
 import org.projectfloodlight.openflow.protocol.OFStatsReply;
 import org.projectfloodlight.openflow.protocol.OFStatsRequest;
@@ -219,8 +221,21 @@
 
     @Override
     public void processRoleRequest(Channel channel, OFMessage msg) {
-        // TODO process role request and send reply
-        log.debug("Functionality not yet supported for {}", msg);
+        OFRoleRequest ofRoleRequest = (OFRoleRequest) msg;
+        OFControllerRole oldRole = role(channel);
+        OFControllerRole newRole = ofRoleRequest.getRole();
+        if (oldRole.equals(newRole)) {
+            log.trace("No change needed to existing role {}", oldRole);
+        } else {
+            log.trace("Changing role from {} to {}", oldRole, newRole);
+            setRole(channel, newRole);
+        }
+        OFRoleReply ofRoleReply = FACTORY.buildRoleReply()
+                .setRole(role(channel))
+                .setXid(msg.getXid())
+                .build();
+        channel.writeAndFlush(Collections.singletonList(ofRoleReply));
+        log.trace("request {}; reply {}", msg, ofRoleReply);
     }
 
     @Override
diff --git a/apps/ofagent/src/main/java/org/onosproject/ofagent/impl/OFChannelHandler.java b/apps/ofagent/src/main/java/org/onosproject/ofagent/impl/OFChannelHandler.java
index 9d49982..4e57083 100644
--- a/apps/ofagent/src/main/java/org/onosproject/ofagent/impl/OFChannelHandler.java
+++ b/apps/ofagent/src/main/java/org/onosproject/ofagent/impl/OFChannelHandler.java
@@ -121,6 +121,9 @@
                     case ECHO_REQUEST:
                         handler.ofSwitch.processEchoRequest(handler.channel, msg);
                         break;
+                    case ROLE_REQUEST:
+                        handler.ofSwitch.processRoleRequest(handler.channel, msg);
+                        break;
                     case ERROR:
                         handler.logErrorClose((OFErrorMsg) msg);
                         break;