Add push VLAN treatment and use it in BgpRouter groups

Change-Id: I8c241fd776cdddd77969413736bd786c0d5a4828
diff --git a/providers/openflow/flow/src/main/java/org/onosproject/provider/of/flow/impl/FlowModBuilderVer13.java b/providers/openflow/flow/src/main/java/org/onosproject/provider/of/flow/impl/FlowModBuilderVer13.java
index d253aef..cf4f490 100644
--- a/providers/openflow/flow/src/main/java/org/onosproject/provider/of/flow/impl/FlowModBuilderVer13.java
+++ b/providers/openflow/flow/src/main/java/org/onosproject/provider/of/flow/impl/FlowModBuilderVer13.java
@@ -345,6 +345,10 @@
                 return factory().actions().decMplsTtl();
             case VLAN_POP:
                 return factory().actions().popVlan();
+            case VLAN_PUSH:
+                PushHeaderInstructions pushVlanInstruction = (PushHeaderInstructions) l2m;
+                return factory().actions().pushVlan(
+                        EthType.of(pushVlanInstruction.ethernetType()));
             default:
                 log.warn("Unimplemented action type {}.", l2m.subtype());
                 break;
diff --git a/providers/openflow/group/src/main/java/org/onosproject/provider/of/group/impl/GroupModBuilder.java b/providers/openflow/group/src/main/java/org/onosproject/provider/of/group/impl/GroupModBuilder.java
index 07ddbec..25ece46 100644
--- a/providers/openflow/group/src/main/java/org/onosproject/provider/of/group/impl/GroupModBuilder.java
+++ b/providers/openflow/group/src/main/java/org/onosproject/provider/of/group/impl/GroupModBuilder.java
@@ -183,6 +183,7 @@
         if (treatment == null) {
             return actions;
         }
+
         for (Instruction i : treatment.instructions()) {
             switch (i.type()) {
                 case DROP:
@@ -254,6 +255,13 @@
                         (L2ModificationInstruction.ModVlanPcpInstruction) l2m;
                 oxm = factory.oxms().vlanPcp(VlanPcp.of(vlanPcp.vlanPcp()));
                 break;
+            case VLAN_POP:
+                return factory.actions().popVlan();
+            case VLAN_PUSH:
+                L2ModificationInstruction.PushHeaderInstructions pushVlanInstruction
+                        = (L2ModificationInstruction.PushHeaderInstructions) l2m;
+                return factory.actions().pushVlan(
+                        EthType.of(pushVlanInstruction.ethernetType()));
             case MPLS_PUSH:
                 L2ModificationInstruction.PushHeaderInstructions pushHeaderInstructions =
                         (L2ModificationInstruction.PushHeaderInstructions) l2m;