VOL-2153 remove flow_utils.go from voltha-go

Change-Id: I81bdc9ed78e6a6b00a176f9c8366ff56fb7777b0
diff --git a/Makefile b/Makefile
index 649b10b..e719891 100644
--- a/Makefile
+++ b/Makefile
@@ -90,7 +90,7 @@
 	@mkdir -p python/local_imports
 ifdef LOCAL_PROTOS
 	mkdir -p vendor/github.com/opencord/voltha-protos/go
-	cp -r ${GOPATH}/src/github.com/opencord/voltha-protos/go/* vendor/github.com/opencord/voltha-protos/go
+	cp -r ${LOCAL_PROTOS}/go/* vendor/github.com/opencord/voltha-protos/go
 	rm -rf python/local_imports/voltha-protos
 	mkdir -p python/local_imports/voltha-protos/dist
 	cp ../voltha-protos/dist/*.tar.gz python/local_imports/voltha-protos/dist/
@@ -100,7 +100,7 @@
 local-lib-go:
 ifdef LOCAL_LIB_GO
 	mkdir -p vendor/github.com/opencord/voltha-lib-go/pkg
-	cp -r ${GOPATH}/src/github.com/opencord/voltha-lib-go/pkg/* vendor/github.com/opencord/voltha-lib-go/pkg/
+	cp -r ${LOCAL_LIB_GO}/pkg/* vendor/github.com/opencord/voltha-lib-go/pkg/
 endif
 
 local-pyvoltha:
diff --git a/go.mod b/go.mod
index 6595e62..514830e 100644
--- a/go.mod
+++ b/go.mod
@@ -4,12 +4,11 @@
 
 require (
 	github.com/bclicn/color v0.0.0-20180711051946-108f2023dc84
-	github.com/cevaris/ordered_map v0.0.0-20190319150403-3adeae072e73
 	github.com/gogo/protobuf v1.3.0
 	github.com/golang/protobuf v1.3.2
 	github.com/google/uuid v1.1.1
 	github.com/gyuho/goraph v0.0.0-20160328020532-d460590d53a9
-	github.com/opencord/voltha-lib-go v0.0.0-20191023185531-80258b36a64b
+	github.com/opencord/voltha-lib-go v0.0.0-20191024175357-456b893dc42c
 	github.com/opencord/voltha-protos v1.0.3
 	github.com/stretchr/testify v1.4.0
 	google.golang.org/grpc v1.24.0
diff --git a/go.sum b/go.sum
index 5331e02..4831e35 100644
--- a/go.sum
+++ b/go.sum
@@ -192,8 +192,8 @@
 github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
 github.com/onsi/gomega v1.4.2 h1:3mYCb7aPxS/RU7TI1y4rkEn1oKmPRjNJLNEXgw7MH2I=
 github.com/onsi/gomega v1.4.2/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=
-github.com/opencord/voltha-lib-go v0.0.0-20191023185531-80258b36a64b h1:s3zvCa27RhpVy+wCk5R4iKa9H61B1MzbSL2164B1w68=
-github.com/opencord/voltha-lib-go v0.0.0-20191023185531-80258b36a64b/go.mod h1:+bjwfm5bbP1j6liscpn3UFqbh6hHDkmLDWU3AdYLDY4=
+github.com/opencord/voltha-lib-go v0.0.0-20191024175357-456b893dc42c h1:+8iex9a0qDyuNqCXfy2SBHOK0Cfiev38RhQqkIitpew=
+github.com/opencord/voltha-lib-go v0.0.0-20191024175357-456b893dc42c/go.mod h1:VDb+kLjSvAm4iaArzXB143fug199CG0/wv+Bseh1mcM=
 github.com/opencord/voltha-protos v1.0.3 h1:9v+R/QGF1xK+HKTqFM0IqCABoGCAxC8iKH4VzNBJDto=
 github.com/opencord/voltha-protos v1.0.3/go.mod h1:myfFIkJdA+rCXmKdLImhh79MfabN4ZOKQ4grk32DnPQ=
 github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=
diff --git a/rw_core/core/device_agent.go b/rw_core/core/device_agent.go
index 4a5274b..c8e07a9 100755
--- a/rw_core/core/device_agent.go
+++ b/rw_core/core/device_agent.go
@@ -19,8 +19,9 @@
 	"context"
 	"fmt"
 	"github.com/gogo/protobuf/proto"
-	fu "github.com/opencord/voltha-go/rw_core/utils"
+	coreutils "github.com/opencord/voltha-go/rw_core/utils"
 	"github.com/opencord/voltha-lib-go/pkg/db/model"
+	fu "github.com/opencord/voltha-lib-go/pkg/flows"
 	"github.com/opencord/voltha-lib-go/pkg/log"
 	ic "github.com/opencord/voltha-protos/go/inter_container"
 	ofp "github.com/opencord/voltha-protos/go/openflow_13"
@@ -323,7 +324,7 @@
 	device.FlowGroups = &voltha.FlowGroups{Items: updatedGroups}
 	go agent.updateDeviceWithoutLockAsync(device, chdB)
 
-	if res := fu.WaitForNilOrErrorResponses(agent.defaultTimeout, chAdapters, chdB); res != nil {
+	if res := coreutils.WaitForNilOrErrorResponses(agent.defaultTimeout, chAdapters, chdB); res != nil {
 		log.Debugw("Failed to get response from adapter[or] DB", log.Fields{"result": res})
 		return status.Errorf(codes.Aborted, "errors-%s", res)
 	}
@@ -414,7 +415,7 @@
 	device.FlowGroups = &voltha.FlowGroups{Items: groupsToKeep}
 	go agent.updateDeviceWithoutLockAsync(device, chdB)
 
-	if res := fu.WaitForNilOrErrorResponses(agent.defaultTimeout, chAdapters, chdB); res != nil {
+	if res := coreutils.WaitForNilOrErrorResponses(agent.defaultTimeout, chAdapters, chdB); res != nil {
 		return status.Errorf(codes.Aborted, "errors-%s", res)
 	}
 	return nil
@@ -522,7 +523,7 @@
 	device.FlowGroups = &voltha.FlowGroups{Items: updatedGroups}
 	go agent.updateDeviceWithoutLockAsync(device, chdB)
 
-	if res := fu.WaitForNilOrErrorResponses(agent.defaultTimeout, chAdapters, chdB); res != nil {
+	if res := coreutils.WaitForNilOrErrorResponses(agent.defaultTimeout, chAdapters, chdB); res != nil {
 		return status.Errorf(codes.Aborted, "errors-%s", res)
 	}
 	return nil
diff --git a/rw_core/core/logical_device_agent.go b/rw_core/core/logical_device_agent.go
index 21f65fa..c36e1a2 100644
--- a/rw_core/core/logical_device_agent.go
+++ b/rw_core/core/logical_device_agent.go
@@ -22,8 +22,9 @@
 	"github.com/gogo/protobuf/proto"
 	fd "github.com/opencord/voltha-go/rw_core/flow_decomposition"
 	"github.com/opencord/voltha-go/rw_core/graph"
-	fu "github.com/opencord/voltha-go/rw_core/utils"
+	coreutils "github.com/opencord/voltha-go/rw_core/utils"
 	"github.com/opencord/voltha-lib-go/pkg/db/model"
+	fu "github.com/opencord/voltha-lib-go/pkg/flows"
 	"github.com/opencord/voltha-lib-go/pkg/log"
 	ic "github.com/opencord/voltha-protos/go/inter_container"
 	ofp "github.com/opencord/voltha-protos/go/openflow_13"
@@ -406,7 +407,7 @@
 			}(child, ch)
 		}
 		// Wait for completion
-		if res := fu.WaitForNilOrErrorResponses(agent.defaultTimeout, chnlsList...); res != nil {
+		if res := coreutils.WaitForNilOrErrorResponses(agent.defaultTimeout, chnlsList...); res != nil {
 			return status.Errorf(codes.Aborted, "errors-%s", res)
 		}
 	}
@@ -1034,7 +1035,7 @@
 		}(deviceId, value.ListFlows(), value.ListGroups())
 	}
 	// Wait for completion
-	if res := fu.WaitForNilOrErrorResponses(agent.defaultTimeout, chnlsList...); res != nil {
+	if res := coreutils.WaitForNilOrErrorResponses(agent.defaultTimeout, chnlsList...); res != nil {
 		return status.Errorf(codes.Aborted, "errors-%s", res)
 	}
 	return nil
@@ -1056,7 +1057,7 @@
 		}(deviceId, value.ListFlows(), value.ListGroups())
 	}
 	// Wait for completion
-	if res := fu.WaitForNilOrErrorResponses(agent.defaultTimeout, chnlsList...); res != nil {
+	if res := coreutils.WaitForNilOrErrorResponses(agent.defaultTimeout, chnlsList...); res != nil {
 		return status.Errorf(codes.Aborted, "errors-%s", res)
 	}
 	return nil
@@ -1078,7 +1079,7 @@
 		}(deviceId, value.ListFlows(), value.ListGroups())
 	}
 	// Wait for completion
-	if res := fu.WaitForNilOrErrorResponses(agent.defaultTimeout, chnlsList...); res != nil {
+	if res := coreutils.WaitForNilOrErrorResponses(agent.defaultTimeout, chnlsList...); res != nil {
 		return status.Errorf(codes.Aborted, "errors-%s", res)
 	}
 	return nil
diff --git a/rw_core/flow_decomposition/flow_decomposer.go b/rw_core/flow_decomposition/flow_decomposer.go
index d28a803..ff9225c 100644
--- a/rw_core/flow_decomposition/flow_decomposer.go
+++ b/rw_core/flow_decomposition/flow_decomposer.go
@@ -20,7 +20,7 @@
 	"github.com/gogo/protobuf/proto"
 	"github.com/opencord/voltha-go/rw_core/coreIf"
 	"github.com/opencord/voltha-go/rw_core/graph"
-	fu "github.com/opencord/voltha-go/rw_core/utils"
+	fu "github.com/opencord/voltha-lib-go/pkg/flows"
 	"github.com/opencord/voltha-lib-go/pkg/log"
 	ofp "github.com/opencord/voltha-protos/go/openflow_13"
 	"github.com/opencord/voltha-protos/go/voltha"
diff --git a/rw_core/flow_decomposition/flow_decomposer_test.go b/rw_core/flow_decomposition/flow_decomposer_test.go
index 3264c12..37faa25 100644
--- a/rw_core/flow_decomposition/flow_decomposer_test.go
+++ b/rw_core/flow_decomposition/flow_decomposer_test.go
@@ -18,7 +18,7 @@
 import (
 	"errors"
 	"github.com/opencord/voltha-go/rw_core/graph"
-	fu "github.com/opencord/voltha-go/rw_core/utils"
+	fu "github.com/opencord/voltha-lib-go/pkg/flows"
 	"github.com/opencord/voltha-lib-go/pkg/log"
 	ofp "github.com/opencord/voltha-protos/go/openflow_13"
 	"github.com/opencord/voltha-protos/go/voltha"
diff --git a/rw_core/utils/flow_utils_test.go b/rw_core/utils/flow_utils_test.go
deleted file mode 100644
index c51a778..0000000
--- a/rw_core/utils/flow_utils_test.go
+++ /dev/null
@@ -1,689 +0,0 @@
-/*
- * Copyright 2019-present Open Networking Foundation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package utils
-
-import (
-	"github.com/opencord/voltha-lib-go/pkg/log"
-	ofp "github.com/opencord/voltha-protos/go/openflow_13"
-	"github.com/stretchr/testify/assert"
-	"google.golang.org/grpc/codes"
-	"google.golang.org/grpc/status"
-	"strings"
-	"testing"
-)
-
-func init() {
-	log.AddPackage(log.JSON, log.WarnLevel, nil)
-	timeoutError = status.Errorf(codes.Aborted, "timeout")
-	taskFailureError = status.Error(codes.Internal, "test failure task")
-}
-
-func TestFlowsAndGroups_AddFlow(t *testing.T) {
-	fg := NewFlowsAndGroups()
-	allFlows := fg.ListFlows()
-	assert.Equal(t, 0, len(allFlows))
-	fg.AddFlow(nil)
-	allFlows = fg.ListFlows()
-	assert.Equal(t, 0, len(allFlows))
-
-	var fa *FlowArgs
-	fa = &FlowArgs{
-		KV: OfpFlowModArgs{"priority": 500},
-		MatchFields: []*ofp.OfpOxmOfbField{
-			InPort(1),
-			VlanVid(uint32(ofp.OfpVlanId_OFPVID_PRESENT) | 1),
-			TunnelId(uint64(1)),
-			EthType(0x0800),
-			Ipv4Dst(0xffffffff),
-			IpProto(17),
-			UdpSrc(68),
-			UdpDst(67),
-		},
-		Actions: []*ofp.OfpAction{
-			PushVlan(0x8100),
-			SetField(VlanVid(uint32(ofp.OfpVlanId_OFPVID_PRESENT) | 4000)),
-			Output(uint32(ofp.OfpPortNo_OFPP_CONTROLLER)),
-		},
-	}
-	flow := MkFlowStat(fa)
-	fg.AddFlow(flow)
-
-	allFlows = fg.ListFlows()
-	assert.Equal(t, 1, len(allFlows))
-	assert.True(t, FlowMatch(flow, allFlows[0]))
-}
-
-func TestFlowsAndGroups_AddGroup(t *testing.T) {
-	var ga *GroupArgs
-
-	fg := NewFlowsAndGroups()
-	allGroups := fg.ListGroups()
-	assert.Equal(t, 0, len(allGroups))
-	fg.AddGroup(nil)
-	allGroups = fg.ListGroups()
-	assert.Equal(t, 0, len(allGroups))
-
-	ga = &GroupArgs{
-		GroupId: 10,
-		Buckets: []*ofp.OfpBucket{
-			{Actions: []*ofp.OfpAction{
-				PopVlan(),
-				Output(1),
-			},
-			},
-		},
-	}
-	group := MkGroupStat(ga)
-	fg.AddGroup(group)
-
-	allGroups = fg.ListGroups()
-	assert.Equal(t, 1, len(allGroups))
-	assert.Equal(t, ga.GroupId, allGroups[0].Desc.GroupId)
-}
-
-func TestFlowsAndGroups_Copy(t *testing.T) {
-	fg := NewFlowsAndGroups()
-	var fa *FlowArgs
-	var ga *GroupArgs
-
-	fa = &FlowArgs{
-		KV: OfpFlowModArgs{"priority": 500},
-		MatchFields: []*ofp.OfpOxmOfbField{
-			InPort(2),
-			VlanVid(uint32(ofp.OfpVlanId_OFPVID_PRESENT) | 0),
-		},
-		Actions: []*ofp.OfpAction{
-			SetField(VlanVid(uint32(ofp.OfpVlanId_OFPVID_PRESENT) | 10)),
-			Output(1),
-		},
-	}
-	flow := MkFlowStat(fa)
-	fg.AddFlow(flow)
-
-	ga = &GroupArgs{
-		GroupId: 10,
-		Buckets: []*ofp.OfpBucket{
-			{Actions: []*ofp.OfpAction{
-				PopVlan(),
-				Output(1),
-			},
-			},
-		},
-	}
-	group := MkGroupStat(ga)
-	fg.AddGroup(group)
-
-	fgCopy := fg.Copy()
-
-	allFlows := fgCopy.ListFlows()
-	assert.Equal(t, 1, len(allFlows))
-	assert.True(t, FlowMatch(flow, allFlows[0]))
-
-	allGroups := fgCopy.ListGroups()
-	assert.Equal(t, 1, len(allGroups))
-	assert.Equal(t, ga.GroupId, allGroups[0].Desc.GroupId)
-
-	fg = NewFlowsAndGroups()
-	fgCopy = fg.Copy()
-	allFlows = fgCopy.ListFlows()
-	allGroups = fgCopy.ListGroups()
-	assert.Equal(t, 0, len(allFlows))
-	assert.Equal(t, 0, len(allGroups))
-}
-
-func TestFlowsAndGroups_GetFlow(t *testing.T) {
-	fg := NewFlowsAndGroups()
-	var fa1 *FlowArgs
-	var fa2 *FlowArgs
-	var ga *GroupArgs
-
-	fa1 = &FlowArgs{
-		KV: OfpFlowModArgs{"priority": 500},
-		MatchFields: []*ofp.OfpOxmOfbField{
-			InPort(2),
-			Metadata_ofp((1000 << 32) | 1),
-			VlanPcp(0),
-		},
-		Actions: []*ofp.OfpAction{
-			PopVlan(),
-		},
-	}
-	flow1 := MkFlowStat(fa1)
-
-	fa2 = &FlowArgs{
-		KV: OfpFlowModArgs{"priority": 1500},
-		MatchFields: []*ofp.OfpOxmOfbField{
-			InPort(5),
-			VlanVid(uint32(ofp.OfpVlanId_OFPVID_PRESENT) | 0),
-		},
-		Actions: []*ofp.OfpAction{
-			PushVlan(0x8100),
-			SetField(VlanVid(uint32(ofp.OfpVlanId_OFPVID_PRESENT) | 1000)),
-			SetField(VlanPcp(0)),
-			Output(2),
-		},
-	}
-	flow2 := MkFlowStat(fa2)
-
-	fg.AddFlow(flow1)
-	fg.AddFlow(flow2)
-
-	ga = &GroupArgs{
-		GroupId: 10,
-		Buckets: []*ofp.OfpBucket{
-			{Actions: []*ofp.OfpAction{
-				PopVlan(),
-				Output(1),
-			},
-			},
-		},
-	}
-	group := MkGroupStat(ga)
-	fg.AddGroup(group)
-
-	gf1 := fg.GetFlow(0)
-	assert.True(t, FlowMatch(flow1, gf1))
-
-	gf2 := fg.GetFlow(1)
-	assert.True(t, FlowMatch(flow2, gf2))
-
-	gf3 := fg.GetFlow(2)
-	assert.Nil(t, gf3)
-
-	allFlows := fg.ListFlows()
-	assert.True(t, FlowMatch(flow1, allFlows[0]))
-	assert.True(t, FlowMatch(flow2, allFlows[1]))
-}
-
-func TestFlowsAndGroups_String(t *testing.T) {
-	fg := NewFlowsAndGroups()
-	var fa *FlowArgs
-	var ga *GroupArgs
-
-	str := fg.String()
-	assert.True(t, str == "")
-
-	fa = &FlowArgs{
-		KV: OfpFlowModArgs{"priority": 500},
-		MatchFields: []*ofp.OfpOxmOfbField{
-			InPort(2),
-			VlanVid(uint32(ofp.OfpVlanId_OFPVID_PRESENT) | 0),
-			VlanPcp(0),
-			EthType(0x800),
-			Ipv4Dst(0xe00a0a0a),
-		},
-		Actions: []*ofp.OfpAction{
-			Group(10),
-		},
-	}
-	flow := MkFlowStat(fa)
-	fg.AddFlow(flow)
-
-	ga = &GroupArgs{
-		GroupId: 10,
-		Buckets: []*ofp.OfpBucket{
-			{Actions: []*ofp.OfpAction{
-				PopVlan(),
-				Output(1),
-			},
-			},
-		},
-	}
-	group := MkGroupStat(ga)
-	fg.AddGroup(group)
-
-	str = fg.String()
-	assert.True(t, strings.Contains(str, "id: 1143307409938767207"))
-	assert.True(t, strings.Contains(str, "group_id: 10"))
-	assert.True(t, strings.Contains(str, "oxm_class: OFPXMC_OPENFLOW_BASICOFPXMC_OPENFLOW_BASIC"))
-	assert.True(t, strings.Contains(str, "type: OFPXMT_OFB_VLAN_VIDOFPXMT_OFB_VLAN_VID"))
-	assert.True(t, strings.Contains(str, "vlan_vid: 4096"))
-	assert.True(t, strings.Contains(str, "buckets:"))
-}
-
-func TestFlowsAndGroups_AddFrom(t *testing.T) {
-	fg := NewFlowsAndGroups()
-	var fa *FlowArgs
-	var ga *GroupArgs
-
-	str := fg.String()
-	assert.True(t, str == "")
-
-	fa = &FlowArgs{
-		KV: OfpFlowModArgs{"priority": 500},
-		MatchFields: []*ofp.OfpOxmOfbField{
-			InPort(2),
-			VlanVid(uint32(ofp.OfpVlanId_OFPVID_PRESENT) | 0),
-			Metadata_ofp(1000),
-			TunnelId(uint64(1)),
-			VlanPcp(0),
-		},
-		Actions: []*ofp.OfpAction{
-			PopVlan(),
-			Output(1),
-		},
-	}
-	flow := MkFlowStat(fa)
-	fg.AddFlow(flow)
-
-	ga = &GroupArgs{
-		GroupId: 10,
-		Buckets: []*ofp.OfpBucket{
-			{Actions: []*ofp.OfpAction{
-				PopVlan(),
-				Output(1),
-			},
-			},
-		},
-	}
-	group := MkGroupStat(ga)
-	fg.AddGroup(group)
-
-	fg1 := NewFlowsAndGroups()
-	fg1.AddFrom(fg)
-
-	allFlows := fg1.ListFlows()
-	allGroups := fg1.ListGroups()
-	assert.Equal(t, 1, len(allFlows))
-	assert.Equal(t, 1, len(allGroups))
-	assert.True(t, FlowMatch(flow, allFlows[0]))
-	assert.Equal(t, group.Desc.GroupId, allGroups[0].Desc.GroupId)
-}
-
-func TestDeviceRules_AddFlow(t *testing.T) {
-	dr := NewDeviceRules()
-	rules := dr.GetRules()
-	assert.True(t, len(rules) == 0)
-
-	dr.AddFlow("123456", nil)
-	rules = dr.GetRules()
-	assert.True(t, len(rules) == 1)
-	val, ok := rules["123456"]
-	assert.True(t, ok)
-	assert.Equal(t, 0, len(val.ListFlows()))
-	assert.Equal(t, 0, len(val.ListGroups()))
-
-	var fa *FlowArgs
-	fa = &FlowArgs{
-		KV: OfpFlowModArgs{"priority": 500},
-		MatchFields: []*ofp.OfpOxmOfbField{
-			InPort(2),
-			VlanVid(uint32(ofp.OfpVlanId_OFPVID_PRESENT) | 0),
-			Metadata_ofp(1000),
-			TunnelId(uint64(1)),
-			VlanPcp(0),
-		},
-		Actions: []*ofp.OfpAction{
-			PopVlan(),
-			Output(1),
-		},
-	}
-	flow := MkFlowStat(fa)
-	dr.AddFlow("123456", flow)
-	rules = dr.GetRules()
-	assert.True(t, len(rules) == 1)
-	val, ok = rules["123456"]
-	assert.True(t, ok)
-	assert.Equal(t, 1, len(val.ListFlows()))
-	assert.True(t, FlowMatch(flow, val.ListFlows()[0]))
-	assert.Equal(t, 0, len(val.ListGroups()))
-}
-
-func TestDeviceRules_AddFlowsAndGroup(t *testing.T) {
-	fg := NewFlowsAndGroups()
-	var fa *FlowArgs
-	var ga *GroupArgs
-
-	str := fg.String()
-	assert.True(t, str == "")
-
-	fa = &FlowArgs{
-		KV: OfpFlowModArgs{"priority": 2000},
-		MatchFields: []*ofp.OfpOxmOfbField{
-			InPort(2),
-			VlanVid(uint32(ofp.OfpVlanId_OFPVID_PRESENT) | 0),
-			Metadata_ofp(1000),
-			TunnelId(uint64(1)),
-			VlanPcp(0),
-		},
-		Actions: []*ofp.OfpAction{
-			PopVlan(),
-			Output(1),
-		},
-	}
-	flow := MkFlowStat(fa)
-	fg.AddFlow(flow)
-
-	ga = &GroupArgs{
-		GroupId: 10,
-		Buckets: []*ofp.OfpBucket{
-			{Actions: []*ofp.OfpAction{
-				PopVlan(),
-				Output(1),
-			},
-			},
-		},
-	}
-	group := MkGroupStat(ga)
-	fg.AddGroup(group)
-
-	dr := NewDeviceRules()
-	dr.AddFlowsAndGroup("123456", fg)
-	rules := dr.GetRules()
-	assert.True(t, len(rules) == 1)
-	val, ok := rules["123456"]
-	assert.True(t, ok)
-	assert.Equal(t, 1, len(val.ListFlows()))
-	assert.Equal(t, 1, len(val.ListGroups()))
-	assert.True(t, FlowMatch(flow, val.ListFlows()[0]))
-	assert.Equal(t, 10, int(val.ListGroups()[0].Desc.GroupId))
-}
-
-func TestFlowHasOutPort(t *testing.T) {
-	var flow *ofp.OfpFlowStats
-	assert.False(t, FlowHasOutPort(flow, 1))
-
-	fa := &FlowArgs{
-		KV: OfpFlowModArgs{"priority": 2000},
-		MatchFields: []*ofp.OfpOxmOfbField{
-			InPort(2),
-			VlanVid(uint32(ofp.OfpVlanId_OFPVID_PRESENT) | 0),
-			Metadata_ofp(1000),
-			TunnelId(uint64(1)),
-			VlanPcp(0),
-		},
-		Actions: []*ofp.OfpAction{
-			PopVlan(),
-			Output(1),
-		},
-	}
-	flow = MkFlowStat(fa)
-	assert.True(t, FlowHasOutPort(flow, 1))
-	assert.False(t, FlowHasOutPort(flow, 2))
-
-	fa = &FlowArgs{
-		KV: OfpFlowModArgs{"priority": 2000},
-		MatchFields: []*ofp.OfpOxmOfbField{
-			InPort(2),
-			VlanVid(uint32(ofp.OfpVlanId_OFPVID_PRESENT) | 0),
-		},
-	}
-	flow = MkFlowStat(fa)
-	assert.False(t, FlowHasOutPort(flow, 1))
-}
-
-func TestFlowHasOutGroup(t *testing.T) {
-	var flow *ofp.OfpFlowStats
-	assert.False(t, FlowHasOutGroup(flow, 10))
-
-	fa := &FlowArgs{
-		KV: OfpFlowModArgs{"priority": 500},
-		MatchFields: []*ofp.OfpOxmOfbField{
-			InPort(2),
-			VlanVid(uint32(ofp.OfpVlanId_OFPVID_PRESENT) | 0),
-			VlanPcp(0),
-			EthType(0x800),
-			Ipv4Dst(0xe00a0a0a),
-		},
-		Actions: []*ofp.OfpAction{
-			Group(10),
-		},
-	}
-	flow = MkFlowStat(fa)
-	assert.True(t, FlowHasOutGroup(flow, 10))
-	assert.False(t, FlowHasOutGroup(flow, 11))
-
-	fa = &FlowArgs{
-		KV: OfpFlowModArgs{"priority": 500},
-		MatchFields: []*ofp.OfpOxmOfbField{
-			InPort(2),
-			VlanVid(uint32(ofp.OfpVlanId_OFPVID_PRESENT) | 0),
-			VlanPcp(0),
-			EthType(0x800),
-			Ipv4Dst(0xe00a0a0a),
-		},
-		Actions: []*ofp.OfpAction{
-			Output(1),
-		},
-	}
-	flow = MkFlowStat(fa)
-	assert.False(t, FlowHasOutGroup(flow, 1))
-}
-
-func TestMatchFlow(t *testing.T) {
-	assert.False(t, FlowMatch(nil, nil))
-	fa := &FlowArgs{
-		KV: OfpFlowModArgs{"priority": 500, "table_id": 1, "cookie": 38268468, "flags": 12},
-		MatchFields: []*ofp.OfpOxmOfbField{
-			InPort(2),
-			VlanVid(uint32(ofp.OfpVlanId_OFPVID_PRESENT) | 0),
-			VlanPcp(0),
-			EthType(0x800),
-			Ipv4Dst(0xe00a0a0a),
-		},
-		Actions: []*ofp.OfpAction{
-			Group(10),
-		},
-	}
-	flow1 := MkFlowStat(fa)
-	assert.False(t, FlowMatch(flow1, nil))
-
-	fa = &FlowArgs{
-		KV: OfpFlowModArgs{"priority": 500},
-		MatchFields: []*ofp.OfpOxmOfbField{
-			InPort(2),
-			VlanVid(uint32(ofp.OfpVlanId_OFPVID_PRESENT) | 0),
-			VlanPcp(0),
-			EthType(0x800),
-			Ipv4Dst(0xe00a0a0a),
-		},
-		Actions: []*ofp.OfpAction{
-			Group(10),
-		},
-	}
-	flow2 := MkFlowStat(fa)
-	assert.False(t, FlowMatch(flow1, flow2))
-	assert.False(t, FlowMatch(nil, flow2))
-
-	fa = &FlowArgs{
-		KV: OfpFlowModArgs{"priority": 500, "table_id": 1, "cookie": 38268468, "flags": 12},
-		MatchFields: []*ofp.OfpOxmOfbField{
-			InPort(2),
-			VlanVid(uint32(ofp.OfpVlanId_OFPVID_PRESENT) | 0),
-			VlanPcp(0),
-			EthType(0x800),
-			Ipv4Dst(0xe00a0a0a),
-		},
-	}
-	flow2 = MkFlowStat(fa)
-	assert.True(t, FlowMatch(flow1, flow2))
-
-	fa = &FlowArgs{
-		KV: OfpFlowModArgs{"priority": 501, "table_id": 1, "cookie": 38268468, "flags": 12},
-		MatchFields: []*ofp.OfpOxmOfbField{
-			InPort(2),
-			VlanVid(uint32(ofp.OfpVlanId_OFPVID_PRESENT) | 0),
-			VlanPcp(0),
-			EthType(0x800),
-			Ipv4Dst(0xe00a0a0a),
-		},
-		Actions: []*ofp.OfpAction{
-			Group(10),
-		},
-	}
-	flow2 = MkFlowStat(fa)
-	assert.False(t, FlowMatch(flow1, flow2))
-
-	fa = &FlowArgs{
-		KV: OfpFlowModArgs{"priority": 500, "table_id": 2, "cookie": 38268468, "flags": 12},
-		MatchFields: []*ofp.OfpOxmOfbField{
-			InPort(2),
-			VlanVid(uint32(ofp.OfpVlanId_OFPVID_PRESENT) | 0),
-			VlanPcp(0),
-			EthType(0x800),
-			Ipv4Dst(0xe00a0a0a),
-		},
-	}
-	flow2 = MkFlowStat(fa)
-	assert.False(t, FlowMatch(flow1, flow2))
-
-	fa = &FlowArgs{
-		KV: OfpFlowModArgs{"priority": 500, "table_id": 1, "cookie": 38268467, "flags": 12},
-		MatchFields: []*ofp.OfpOxmOfbField{
-			InPort(2),
-			VlanVid(uint32(ofp.OfpVlanId_OFPVID_PRESENT) | 0),
-			VlanPcp(0),
-			EthType(0x800),
-			Ipv4Dst(0xe00a0a0a),
-		},
-	}
-	flow2 = MkFlowStat(fa)
-	assert.False(t, FlowMatch(flow1, flow2))
-
-	fa = &FlowArgs{
-		KV: OfpFlowModArgs{"priority": 500, "table_id": 1, "cookie": 38268468, "flags": 14},
-		MatchFields: []*ofp.OfpOxmOfbField{
-			InPort(2),
-			VlanVid(uint32(ofp.OfpVlanId_OFPVID_PRESENT) | 0),
-			VlanPcp(0),
-			EthType(0x800),
-			Ipv4Dst(0xe00a0a0a),
-		},
-	}
-	flow2 = MkFlowStat(fa)
-	assert.False(t, FlowMatch(flow1, flow2))
-
-	fa = &FlowArgs{
-		KV: OfpFlowModArgs{"priority": 500, "table_id": 1, "cookie": 38268468, "flags": 12},
-		MatchFields: []*ofp.OfpOxmOfbField{
-			InPort(4),
-			VlanVid(uint32(ofp.OfpVlanId_OFPVID_PRESENT) | 0),
-			VlanPcp(0),
-			EthType(0x800),
-			Ipv4Dst(0xe00a0a0a),
-		},
-	}
-	flow2 = MkFlowStat(fa)
-	assert.False(t, FlowMatch(flow1, flow2))
-
-	fa = &FlowArgs{
-		KV: OfpFlowModArgs{"priority": 500, "table_id": 1, "cookie": 38268468, "flags": 12},
-		MatchFields: []*ofp.OfpOxmOfbField{
-			InPort(2),
-			VlanVid(uint32(ofp.OfpVlanId_OFPVID_PRESENT) | 0),
-			VlanPcp(0),
-			EthType(0x800),
-		},
-	}
-	flow2 = MkFlowStat(fa)
-	assert.False(t, FlowMatch(flow1, flow2))
-
-	fa = &FlowArgs{
-		KV: OfpFlowModArgs{"priority": 500, "table_id": 1, "cookie": 38268468, "flags": 12},
-		MatchFields: []*ofp.OfpOxmOfbField{
-			InPort(2),
-			VlanVid(uint32(ofp.OfpVlanId_OFPVID_PRESENT) | 0),
-			VlanPcp(0),
-			EthType(0x800),
-			Ipv4Dst(0xe00a0a0a),
-		},
-		Actions: []*ofp.OfpAction{
-			PopVlan(),
-			Output(1),
-		},
-	}
-	flow2 = MkFlowStat(fa)
-	assert.True(t, FlowMatch(flow1, flow2))
-}
-
-func TestFlowMatchesMod(t *testing.T) {
-	assert.False(t, FlowMatchesMod(nil, nil))
-	fa := &FlowArgs{
-		KV: OfpFlowModArgs{"priority": 500, "table_id": 1},
-		MatchFields: []*ofp.OfpOxmOfbField{
-			InPort(2),
-			VlanVid(uint32(ofp.OfpVlanId_OFPVID_PRESENT) | 0),
-			VlanPcp(0),
-			EthType(0x800),
-			Ipv4Dst(0xe00a0a0a),
-		},
-		Actions: []*ofp.OfpAction{
-			Output(1),
-			Group(10),
-		},
-	}
-	flow := MkFlowStat(fa)
-	assert.False(t, FlowMatchesMod(flow, nil))
-
-	fa = &FlowArgs{
-		KV: OfpFlowModArgs{"priority": 500, "table_id": 1},
-		MatchFields: []*ofp.OfpOxmOfbField{
-			InPort(2),
-			VlanVid(uint32(ofp.OfpVlanId_OFPVID_PRESENT) | 0),
-			VlanPcp(0),
-			EthType(0x800),
-			Ipv4Dst(0xe00a0a0a),
-		},
-		Actions: []*ofp.OfpAction{
-			PopVlan(),
-			Output(1),
-		},
-	}
-	flowMod := MkSimpleFlowMod(ToOfpOxmField(fa.MatchFields), fa.Actions, fa.Command, fa.KV)
-	assert.False(t, FlowMatchesMod(nil, flowMod))
-	assert.False(t, FlowMatchesMod(flow, flowMod))
-	assert.True(t, FlowMatch(flow, FlowStatsEntryFromFlowModMessage(flowMod)))
-
-	fa = &FlowArgs{
-		KV: OfpFlowModArgs{"table_id": uint64(ofp.OfpTable_OFPTT_ALL),
-			"cookie_mask": 0,
-			"out_port":    uint64(ofp.OfpPortNo_OFPP_ANY),
-			"out_group":   uint64(ofp.OfpGroup_OFPG_ANY),
-		},
-	}
-	flowMod = MkSimpleFlowMod(ToOfpOxmField(fa.MatchFields), fa.Actions, fa.Command, fa.KV)
-	assert.True(t, FlowMatchesMod(flow, flowMod))
-
-	fa = &FlowArgs{
-		KV: OfpFlowModArgs{"table_id": 1,
-			"cookie_mask": 0,
-			"out_port":    uint64(ofp.OfpPortNo_OFPP_ANY),
-			"out_group":   uint64(ofp.OfpGroup_OFPG_ANY),
-		},
-	}
-	flowMod = MkSimpleFlowMod(ToOfpOxmField(fa.MatchFields), fa.Actions, fa.Command, fa.KV)
-	assert.True(t, FlowMatchesMod(flow, flowMod))
-
-	fa = &FlowArgs{
-		KV: OfpFlowModArgs{"table_id": 1,
-			"cookie_mask": 0,
-			"out_port":    1,
-			"out_group":   uint64(ofp.OfpGroup_OFPG_ANY),
-		},
-	}
-	flowMod = MkSimpleFlowMod(ToOfpOxmField(fa.MatchFields), fa.Actions, fa.Command, fa.KV)
-	assert.True(t, FlowMatchesMod(flow, flowMod))
-
-	fa = &FlowArgs{
-		KV: OfpFlowModArgs{"table_id": 1,
-			"cookie_mask": 0,
-			"out_port":    1,
-			"out_group":   10,
-		},
-	}
-	flowMod = MkSimpleFlowMod(ToOfpOxmField(fa.MatchFields), fa.Actions, fa.Command, fa.KV)
-	assert.True(t, FlowMatchesMod(flow, flowMod))
-}
diff --git a/rw_core/utils/flow_utils.go b/vendor/github.com/opencord/voltha-lib-go/pkg/flows/flow_utils.go
similarity index 99%
rename from rw_core/utils/flow_utils.go
rename to vendor/github.com/opencord/voltha-lib-go/pkg/flows/flow_utils.go
index 7cb718e..2dbf52d 100644
--- a/rw_core/utils/flow_utils.go
+++ b/vendor/github.com/opencord/voltha-lib-go/pkg/flows/flow_utils.go
@@ -13,7 +13,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package utils
+package flows
 
 import (
 	"bytes"
diff --git a/vendor/modules.txt b/vendor/modules.txt
index d52f030..bedca4f 100644
--- a/vendor/modules.txt
+++ b/vendor/modules.txt
@@ -62,7 +62,7 @@
 github.com/mitchellh/go-homedir
 # github.com/mitchellh/mapstructure v1.1.2
 github.com/mitchellh/mapstructure
-# github.com/opencord/voltha-lib-go v0.0.0-20191023185531-80258b36a64b
+# github.com/opencord/voltha-lib-go v0.0.0-20191024175357-456b893dc42c
 github.com/opencord/voltha-lib-go/pkg/log
 github.com/opencord/voltha-lib-go/pkg/db/kvstore
 github.com/opencord/voltha-lib-go/pkg/grpc
@@ -70,6 +70,7 @@
 github.com/opencord/voltha-lib-go/pkg/version
 github.com/opencord/voltha-lib-go/pkg/db/model
 github.com/opencord/voltha-lib-go/pkg/kafka
+github.com/opencord/voltha-lib-go/pkg/flows
 github.com/opencord/voltha-lib-go/pkg/adapters/common
 github.com/opencord/voltha-lib-go/pkg/adapters
 github.com/opencord/voltha-lib-go/pkg/adapters/adapterif