Repository: antrea-io/antrea
Pull request #4367 (2022-11-02 10:55:44)

add trivy to scan CVEs in docker image
Signed-off-by: Bin Liu <biliu@vmware.com>

codecov[bot]: # [Codecov](https://codecov.io/gh/antrea-io/antrea/pull/4367?src=pr&el=h1&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=antrea-io) Report
> Merging [#4367](https://codecov.io/gh/antrea-io/antrea/pull/4367?src=pr&el=desc&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=antrea-io) (0917429) into [main](https://codecov.io/gh/antrea-io/antrea/commit/e7aba77bd595467eb44d6c51c4b5d496efbcbc3e?el=desc&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=antrea-io) (e7aba77) will **increase** coverage by `0.01%`.
> The diff coverage is `n/a`.

[![Impacted file tree graph](https://codecov.io/gh/antrea-io/antrea/pull/4367/graphs/tree.svg?width=650&height=150&src=pr&token=TjWaLL2GoC&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=antrea-io)](https://codecov.io/gh/antrea-io/antrea/pull/4367?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=antrea-io)

```diff
@@            Coverage Diff             @@
##             main    #4367      +/-   ##
==========================================
+ Coverage   64.35%   64.37%   +0.01%     
==========================================
  Files         397      397              
  Lines       56204    56204              
==========================================
+ Hits        36172    36180       +8     
+ Misses      17401    17395       -6     
+ Partials     2631     2629       -2     
```

| Flag | Coverage Δ | | *Carryforward flag |
|---|---|---|---|
| integration-tests | `34.63% <ø> (+0.05%)` | :arrow_up: | |
| kind-e2e-tests | `47.92% <ø> (ø)` | | Carriedforward from [e7aba77](https://codecov.io/gh/antrea-io/antrea/commit/e7aba77bd595467eb44d6c51c4b5d496efbcbc3e?utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=antrea-io) |
| unit-tests | `48.48% <ø> (ø)` | | Carriedforward from [e7aba77](https://codecov.io/gh/antrea-io/antrea/commit/e7aba77bd595467eb44d6c51c4b5d496efbcbc3e?utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=antrea-io) |

*This pull request uses carry forward flags. [Click here](https://docs.codecov.io/docs/carryforward-flags?utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=antrea-io) to find out more.

| [Impacted Files](https://codecov.io/gh/antrea-io/antrea/pull/4367?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=antrea-io) | Coverage Δ | |
|---|---|---|
| [pkg/ovs/openflow/ofctrl\_bridge.go](https://codecov.io/gh/antrea-io/antrea/pull/4367/diff?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=antrea-io#diff-cGtnL292cy9vcGVuZmxvdy9vZmN0cmxfYnJpZGdlLmdv) | `78.71% <0.00%> (+0.37%)` | :arrow_up: |
| [...trollers/multicluster/resourceexport\_controller.go](https://codecov.io/gh/antrea-io/antrea/pull/4367/diff?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=antrea-io#diff-bXVsdGljbHVzdGVyL2NvbnRyb2xsZXJzL211bHRpY2x1c3Rlci9yZXNvdXJjZWV4cG9ydF9jb250cm9sbGVyLmdv) | `79.67% <0.00%> (+1.60%)` | :arrow_up: |


Patch:
diff --git a/.gitignore b/.gitignore
index 8d667890c..a8f97280f 100644
--- a/.gitignore
+++ b/.gitignore
@@ -3,6 +3,7 @@ bin
 .cache
 .golangci-bin
 .coverage/
+.trivy-bin
 
 .DS_Store
 
diff --git a/Makefile b/Makefile
index 57e8a1074..2a5467477 100644
--- a/Makefile
+++ b/Makefile
@@ -15,6 +15,7 @@ NANOSERVER_VERSION := $(shell head -n 1 build/images/deps/nanoserver-version)
 WIN_BUILD_TAG      := $(shell echo $(GO_VERSION) $(CNI_BINARIES_VERSION) $(NANOSERVER_VERSION)|md5sum|head -c 10)
 GIT_HOOKS := $(shell find hack/git_client_side_hooks -type f -print)
 DOCKER_NETWORK     ?= default
+TRIVY_TARGET_IMAGE ?=
 
 DOCKER_BUILD_ARGS = --build-arg OVS_VERSION=$(OVS_VERSION)
 DOCKER_BUILD_ARGS += --build-arg GO_VERSION=$(GO_VERSION)
@@ -50,6 +51,16 @@ bin:
 	@mkdir -p $(BINDIR)
 	GOOS=linux $(GO) build -o $(BINDIR) $(GOFLAGS) -ldflags '$(LDFLAGS)' antrea.io/antrea/cmd/...
 
+.trivy-bin:
+	curl -sfL https://raw.githubusercontent.com/aquasecurity/trivy/main/contrib/install.sh | sh -s -- -b $@ v0.34.0
+
+check-%:
+	@: $(if $(value $*),,$(error $* is undefined))
+
+.PHONY: trivy-scan
+trivy-scan: .trivy-bin check-TRIVY_TARGET_IMAGE
+	$(CURDIR)/.trivy-bin/trivy image --exit-code 1 --severity CRITICAL,HIGH --ignore-unfixed $(TRIVY_TARGET_IMAGE)
+
 .PHONY: antrea-agent
 antrea-agent:
 	@mkdir -p $(BINDIR)
@@ -301,6 +312,7 @@ clean:
 	@rm -rf $(DOCKER_CACHE)
 	@rm -rf .golangci-bin
 	@rm -rf .coverage
+	@rm -rf .trivy-bin
 
 .PHONY: codegen
 codegen:
diff --git a/pkg/agent/multicast/mcast_controller.go b/pkg/agent/multicast/mcast_controller.go
index e04b5dd64..a1df1200e 100644
--- a/pkg/agent/multicast/mcast_controller.go
+++ b/pkg/agent/multicast/mcast_controller.go
@@ -340,16 +340,6 @@ func (c *Controller) Initialize() error {
 	if err != nil {
 		return err
 	}
-	// Install flows on OVS for IGMP packets and multicast traffic forwarding:
-	// 1) send the IGMP report messages to Antrea Agent,
-	// 2) forward the IGMP query messages to all local Pods,
-	// 3) forward the multicast traffic to antrea-gw0 if no local Pods have joined in the group, and this is to ensure
-	//    local Pods can access the external multicast receivers.
-	err = c.ofClient.InstallMulticastInitialFlows(uint8(openflow.PacketInReasonMC))
-	if err != nil {
-		klog.ErrorS(err, "Failed to install multicast initial flows")
-		return err
-	}
 	err = c.initQueryGroup()
 	if err != nil {
 		return err
diff --git a/pkg/agent/openflow/client.go b/pkg/agent/openflow/client.go
index 6634bce61..84aa5081c 100644
--- a/pkg/agent/openflow/client.go
+++ b/pkg/agent/openflow/client.go
@@ -278,9 +278,6 @@ type Client interface {
 	AddAddressToDNSConjunction(id uint32, addrs []types.Address) error
 	// DeleteAddressFromDNSConjunction removes addresses from the toAddresses of the dns packetIn conjunction.
 	DeleteAddressFromDNSConjunction(id uint32, addrs []types.Address) error
-	// InstallMulticastInitialFlows installs OpenFlow to packetIn the IGMP messages and output the Multicast traffic to
-	// antrea-gw0 so that local Pods could access external Multicast servers.
-	InstallMulticastInitialFlows(pktInReason uint8) error
 
 	// InstallMulticastFlows installs the flow to forward Multicast traffic normally, and output it to antrea-gw0
 	// to ensure it can be forwarded to the external addresses.
@@ -1217,19 +1214,6 @@ func (c *client) SendUDPPacketOut(
 	return c.bridge.SendPacketOut(packetOutObj)
 }
 
-func (c *client) InstallMulticastInitialFlows(pktInReason uint8) error {
-	flows := c.featureMulticast.igmpPktInFlows(pktInReason)
-	flows = append(flows, c.featureMulticast.externalMulticastReceiverFlow())
-	flows = append(flows, c.featureMulticast.multicastSkipIGMPMetricFlows()...)
-	if c.enableAntreaPolicy {
-		flows = append(flows, c.featureMulticast.igmpEgressFlow())
-	}
-	cacheKey := "multicast"
-	c.replayMutex.RLock()
-	defer c.replayMutex.RUnlock()
-	return c.addFlows(c.featureMulticast.cachedFlows, cacheKey, flows)
-}
-
 func (c *client) InstallMulticastFlows(multicastIP net.IP, groupID binding.GroupIDType) error {
 	flows := c.featureMulticast.localMulticastForwardFlows(multicastIP, groupID)
 	cacheKey := fmt.Sprintf("multicast_%s", multicastIP.String())
diff --git a/pkg/agent/openflow/multicast.go b/pkg/agent/openflow/multicast.go
index 143a711e8..1d2bfed5a 100644
--- a/pkg/agent/openflow/multicast.go
+++ b/pkg/agent/openflow/multicast.go
@@ -73,8 +73,19 @@ func multicastPipelineClassifyFlow(cookieID uint64, pipeline binding.Pipeline) b
 }
 
 func (f *featureMulticast) initFlows() []binding.Flow {
-	cookieID := f.cookieAllocator.Request(f.category).Raw()
-	return f.multicastOutputFlows(cookieID)
+	// Install flows to send the IGMP report messages to Antrea Agent.
+	flows := f.igmpPktInFlows(uint8(PacketInReasonMC))
+	// Install flow to forward the IGMP query messages to all local Pods.
+	flows = append(flows, f.externalMulticastReceiverFlow())
+	// Install flows to forward the multicast traffic to antrea-gw0 if no local Pods have joined in the group, and this
+	// is to ensure local Pods can access the external multicast receivers.
+	flows = append(flows, f.multicastSkipIGMPMetricFlows()...)
+	if f.enableAntreaPolicy {
+		flows = append(flows, f.igmpEgressFlow())
+	}
+	// Install flows to output multicast packets.
+	flows = append(flows, f.multicastOutputFlows()...)
+	return flows
 }
 
 func (f *featureMulticast) replayFlows() []binding.Flow {
@@ -114,7 +125,8 @@ func (f *featureMulticast) multicastReceiversGroup(groupID binding.GroupIDType,
 	return nil
 }
 
-func (f *featureMulticast) multicastOutputFlows(cookieID uint64) []binding.Flow {
+func (f *featureMulticast) multicastOutputFlows() []binding.Flow {
+	cookieID := f.cookieAllocator.Request(f.category).Raw()
 	flows := []binding.Flow{
 		MulticastOutputTable.ofTable.BuildFlow(priorityNormal).
 			Cookie(cookieID).


Test patch:
diff --git a/pkg/agent/multicast/mcast_controller_test.go b/pkg/agent/multicast/mcast_controller_test.go
index 06fedf573..90e336bac 100644
--- a/pkg/agent/multicast/mcast_controller_test.go
+++ b/pkg/agent/multicast/mcast_controller_test.go
@@ -775,7 +775,6 @@ func newMockMulticastController(t *testing.T, isEncap bool) *Controller {
 }
 
 func (c *Controller) initialize(t *testing.T) error {
-	mockOFClient.EXPECT().InstallMulticastInitialFlows(uint8(0)).Times(1)
 	mockOFClient.EXPECT().InstallMulticastGroup(c.queryGroupId, gomock.Any(), gomock.Any()).Times(1)
 	mockOFClient.EXPECT().InstallMulticastFlows(gomock.Any(), gomock.Any())
 	mockIfaceStore.EXPECT().GetInterfacesByType(interfacestore.InterfaceType(0)).Times(1).Return([]*interfacestore.InterfaceConfig{})
diff --git a/pkg/agent/openflow/multicast_test.go b/pkg/agent/openflow/multicast_test.go
deleted file mode 100644
index 2a6eec7f7..000000000
--- a/pkg/agent/openflow/multicast_test.go
+++ /dev/null
@@ -1,185 +0,0 @@
-// Copyright 2022 Antrea Authors.
-//
-// 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 openflow
-
-import (
-	"sync"
-	"testing"
-
-	"github.com/golang/mock/gomock"
-	"github.com/stretchr/testify/require"
-
-	"antrea.io/antrea/pkg/agent/config"
-	"antrea.io/antrea/pkg/agent/openflow/cookie"
-	oftest "antrea.io/antrea/pkg/agent/openflow/testing"
-	binding "antrea.io/antrea/pkg/ovs/openflow"
-	mocks "antrea.io/antrea/pkg/ovs/openflow/testing"
-)
-
-var (
-	bakMulticastEgressRuleTable       binding.Table
-	bakMulticastEgressPodMetricTable  binding.Table
-	bakMulticastRoutingTable          binding.Table
-	bakMulticastOutputTable           binding.Table
-	bakMulticastIngressPodMetricTable binding.Table
-
-	mockMulticastEgressRuleTable       *mocks.MockTable
-	mockMulticastEgressPodMetricTable  *mocks.MockTable
-	mockMulticastRoutingTable          *mocks.MockTable
-	mockMulticastOutputTable           *mocks.MockTable
-	mockMulticastIngressPodMetricTable *mocks.MockTable
-
-	mockFeatureMulticast = featureMulticast{
-		enableAntreaPolicy: true,
-		cookieAllocator:    cookie.NewAllocator(0),
-		category:           cookie.Multicast,
-		cachedFlows:        newFlowCategoryCache(),
-		groupCache:         sync.Map{},
-	}
-)
-
-func newMockPktInFlowBuilder(ctrl *gomock.Controller) *mocks.MockFlowBuilder {
-	pktInFlowBuilder := mocks.NewMockFlowBuilder(ctrl)
-	pktInFlowBuilder.EXPECT().Cookie(gomock.Any()).Return(pktInFlowBuilder).AnyTimes()
-	pktInFlowBuilder.EXPECT().MatchProtocol(gomock.Any()).Return(pktInFlowBuilder).AnyTimes()
-	pktInFlowBuilder.EXPECT().MatchRegMark(gomock.Any()).Return(pktInFlowBuilder).AnyTimes()
-	action := mocks.NewMockAction(ctrl)
-	action.EXPECT().LoadRegMark(gomock.Any()).Return(pktInFlowBuilder).AnyTimes()
-	pktInFlowBuilder.EXPECT().Action().Return(action).Times(1)
-	action.EXPECT().SendToController(gomock.Any()).Return(pktInFlowBuilder).AnyTimes()
-	pktInFlowBuilder.EXPECT().Action().Return(action).Times(1)
-
-	pktInFlow := mocks.NewMockFlow(ctrl)
-	pktInFlowBuilder.EXPECT().Done().Return(pktInFlow).Times(1)
-	pktInFlow.EXPECT().MatchString().Return("").AnyTimes()
-
-	return pktInFlowBuilder
-}
-
-func newMockExternalMulticastReceiver(ctrl *gomock.Controller) *mocks.MockFlowBuilder {
-	externalMcastReceiverFlowBuilder := mocks.NewMockFlowBuilder(ctrl)
-
-	externalMcastReceiverFlowBuilder.EXPECT().Cookie(gomock.Any()).Return(externalMcastReceiverFlowBuilder).AnyTimes()
-	externalMcastReceiverFlowBuilder.EXPECT().MatchProtocol(gomock.Any()).Return(externalMcastReceiverFlowBuilder).AnyTimes()
-
-	action := mocks.NewMockAction(ctrl)
-	action.EXPECT().LoadRegMark(gomock.Any()).Return(externalMcastReceiverFlowBuilder).AnyTimes()
-	externalMcastReceiverFlowBuilder.EXPECT().Action().Return(action).Times(1)
-	action.EXPECT().LoadToRegField(gomock.Any(), gomock.Any()).Return(externalMcastReceiverFlowBuilder).AnyTimes()
-	externalMcastReceiverFlowBuilder.EXPECT().Action().Return(action).Times(1)
-	action.EXPECT().GotoStage(gomock.Any()).Return(externalMcastReceiverFlowBuilder).AnyTimes()
-	externalMcastReceiverFlowBuilder.EXPECT().Action().Return(action).Times(1)
-
-	externalMcastReceiverFlow := mocks.NewMockFlow(ctrl)
-	externalMcastReceiverFlowBuilder.EXPECT().Done().Return(externalMcastReceiverFlow).Times(1)
-	externalMcastReceiverFlow.EXPECT().MatchString().Return("").AnyTimes()
-
-	return externalMcastReceiverFlowBuilder
-}
-
-func newMockMulticastSkipIGMPMetricFlows(ctrl *gomock.Controller) *mocks.MockFlowBuilder {
-	mockFlowBuilder := mocks.NewMockFlowBuilder(ctrl)
-	mockFlowBuilder.EXPECT().Cookie(gomock.Any()).Return(mockFlowBuilder).AnyTimes()
-	mockFlowBuilder.EXPECT().MatchProtocol(gomock.Any()).Return(mockFlowBuilder).AnyTimes()
-	action := mocks.NewMockAction(ctrl)
-	action.EXPECT().NextTable().Return(mockFlowBuilder).AnyTimes()
-	mockFlowBuilder.EXPECT().Action().Return(action).Times(1)
-	mockFlow := mocks.NewMockFlow(ctrl)
-	mockFlowBuilder.EXPECT().Done().Return(mockFlow).Times(1)
-	mockFlow.EXPECT().MatchString().Return("").AnyTimes()
-	return mockFlowBuilder
-}
-
-func newMockIGMPFlowBuilder(ctrl *gomock.Controller) *mocks.MockFlowBuilder {
-	igmpFlowBuilder := mocks.NewMockFlowBuilder(ctrl)
-	igmpFlowBuilder.EXPECT().Cookie(gomock.Any()).Return(igmpFlowBuilder).Times(1)
-	igmpFlowBuilder.EXPECT().MatchProtocol(gomock.Any()).Return(igmpFlowBuilder).Times(1)
-	igmpFlowBuilder.EXPECT().MatchRegMark(gomock.Any()).Return(igmpFlowBuilder).Times(1)
-	action := mocks.NewMockAction(ctrl)
-	action.EXPECT().GotoStage(gomock.Any()).Return(igmpFlowBuilder).Times(1)
-	igmpFlowBuilder.EXPECT().Action().Return(action).Times(1)
-	igmpFlow := mocks.NewMockFlow(ctrl)
-	igmpFlowBuilder.EXPECT().Done().Return(igmpFlow).Times(1)
-	igmpFlow.EXPECT().MatchString().Return("").AnyTimes()
-	return igmpFlowBuilder
-}
-
-func initMockTables(ctrl *gomock.Controller) {
-	mockMulticastEgressRuleTable = mocks.NewMockTable(ctrl)
-	mockMulticastEgressPodMetricTable = mocks.NewMockTable(ctrl)
-	mockMulticastRoutingTable = mocks.NewMockTable(ctrl)
-	mockMulticastOutputTable = mocks.NewMockTable(ctrl)
-	mockMulticastIngressPodMetricTable = mocks.NewMockTable(ctrl)
-
-	bakMulticastEgressRuleTable = MulticastEgressRuleTable.ofTable
-	bakMulticastEgressPodMetricTable = MulticastEgressPodMetricTable.ofTable
-	bakMulticastRoutingTable = MulticastRoutingTable.ofTable
-	bakMulticastOutputTable = MulticastOutputTable.ofTable
-	bakMulticastIngressPodMetricTable = MulticastIngressPodMetricTable.ofTable
-
-	MulticastEgressRuleTable.ofTable = mockMulticastEgressRuleTable
-	MulticastEgressPodMetricTable.ofTable = mockMulticastEgressPodMetricTable
-	MulticastRoutingTable.ofTable = mockMulticastRoutingTable
-	MulticastOutputTable.ofTable = mockMulticastOutputTable
-	MulticastIngressPodMetricTable.ofTable = mockMulticastIngressPodMetricTable
-}
-
-func resetMulticastTables() {
-	MulticastEgressRuleTable.ofTable = bakMulticastEgressRuleTable
-	MulticastEgressPodMetricTable.ofTable = bakMulticastEgressPodMetricTable
-	MulticastRoutingTable.ofTable = bakMulticastRoutingTable
-	MulticastOutputTable.ofTable = bakMulticastOutputTable
-	MulticastIngressPodMetricTable.ofTable = bakMulticastIngressPodMetricTable
-}
-
-func newMcastClient(ctrl *gomock.Controller) *client {
-	bridge := mocks.NewMockBridge(ctrl)
-	bridge.EXPECT().AddFlowsInBundle(gomock.Any(), gomock.Any(), gomock.Any()).Return(nil).AnyTimes()
-	m := oftest.NewMockOFEntryOperations(ctrl)
-	m.EXPECT().AddAll(gomock.Any()).Return(nil).AnyTimes()
-	return &client{
-		bridge:             bridge,
-		ipProtocols:        []binding.Protocol{binding.ProtocolIP},
-		cookieAllocator:    cookie.NewAllocator(0),
-		ofEntryOperations:  m,
-		featureMulticast:   &mockFeatureMulticast,
-		enableMulticast:    true,
-		enableAntreaPolicy: true,
-	}
-}
-
-func TestInstallMulticastInitialFlows(t *testing.T) {
-	ctrl := gomock.NewController(t)
-	defer ctrl.Finish()
-
-	c = newMcastClient(ctrl)
-	initMockTables(ctrl)
-	defer resetMulticastTables()
-
-	c.enableMulticast = true
-	c.enableAntreaPolicy = true
-	c.featureMulticast = &mockFeatureMulticast
-	mockMulticastRoutingTable.EXPECT().BuildFlow(gomock.Any()).Return(newMockPktInFlowBuilder(ctrl)).Times(1)
-	mockMulticastRoutingTable.EXPECT().BuildFlow(gomock.Any()).Return(newMockExternalMulticastReceiver(ctrl)).Times(1)
-	mockMulticastEgressPodMetricTable.EXPECT().BuildFlow(gomock.Any()).Return(newMockMulticastSkipIGMPMetricFlows(ctrl)).Times(1)
-	mockMulticastIngressPodMetricTable.EXPECT().BuildFlow(gomock.Any()).Return(newMockMulticastSkipIGMPMetricFlows(ctrl)).Times(1)
-	mockMulticastEgressRuleTable.EXPECT().BuildFlow(priorityTopAntreaPolicy).Return(newMockIGMPFlowBuilder(ctrl)).Times(1)
-	c.nodeConfig = &config.NodeConfig{PodIPv4CIDR: podIPv4CIDR, PodIPv6CIDR: nil}
-	c.networkConfig = &config.NetworkConfig{}
-	c.pipelines = pipelineMap
-
-	err := c.InstallMulticastInitialFlows(uint8(PacketInReasonMC))
-	require.NoErrorf(t, err, "Failed to install multicast initial flows")
-}
diff --git a/pkg/agent/openflow/testing/mock_openflow.go b/pkg/agent/openflow/testing/mock_openflow.go
index 393728772..31a2293ef 100644
--- a/pkg/agent/openflow/testing/mock_openflow.go
+++ b/pkg/agent/openflow/testing/mock_openflow.go
@@ -311,20 +311,6 @@ func (mr *MockClientMockRecorder) InstallMulticastGroup(arg0, arg1, arg2 interfa
 	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "InstallMulticastGroup", reflect.TypeOf((*MockClient)(nil).InstallMulticastGroup), arg0, arg1, arg2)
 }
 
-// InstallMulticastInitialFlows mocks base method
-func (m *MockClient) InstallMulticastInitialFlows(arg0 byte) error {
-	m.ctrl.T.Helper()
-	ret := m.ctrl.Call(m, "InstallMulticastInitialFlows", arg0)
-	ret0, _ := ret[0].(error)
-	return ret0
-}
-
-// InstallMulticastInitialFlows indicates an expected call of InstallMulticastInitialFlows
-func (mr *MockClientMockRecorder) InstallMulticastInitialFlows(arg0 interface{}) *gomock.Call {
-	mr.mock.ctrl.T.Helper()
-	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "InstallMulticastInitialFlows", reflect.TypeOf((*MockClient)(nil).InstallMulticastInitialFlows), arg0)
-}
-
 // InstallMulticastRemoteReportFlows mocks base method
 func (m *MockClient) InstallMulticastRemoteReportFlows(arg0 openflow.GroupIDType) error {
 	m.ctrl.T.Helper()