//
// Licensed to the Apache Software Foundation (ASF) under one
// or more contributor license agreements.  See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership.  The ASF licenses this file
// to you 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.
//

// Code generated by MockGen. DO NOT EDIT.
// Source: ./cloudstack/SecurityGroupService.go
//
// Generated by this command:
//
//	mockgen -destination=./cloudstack/SecurityGroupService_mock.go -package=cloudstack -copyright_file=header.txt -source=./cloudstack/SecurityGroupService.go
//

// Package cloudstack is a generated GoMock package.
package cloudstack

import (
	reflect "reflect"

	gomock "go.uber.org/mock/gomock"
)

// MockSecurityGroupServiceIface is a mock of SecurityGroupServiceIface interface.
type MockSecurityGroupServiceIface struct {
	ctrl     *gomock.Controller
	recorder *MockSecurityGroupServiceIfaceMockRecorder
	isgomock struct{}
}

// MockSecurityGroupServiceIfaceMockRecorder is the mock recorder for MockSecurityGroupServiceIface.
type MockSecurityGroupServiceIfaceMockRecorder struct {
	mock *MockSecurityGroupServiceIface
}

// NewMockSecurityGroupServiceIface creates a new mock instance.
func NewMockSecurityGroupServiceIface(ctrl *gomock.Controller) *MockSecurityGroupServiceIface {
	mock := &MockSecurityGroupServiceIface{ctrl: ctrl}
	mock.recorder = &MockSecurityGroupServiceIfaceMockRecorder{mock}
	return mock
}

// EXPECT returns an object that allows the caller to indicate expected use.
func (m *MockSecurityGroupServiceIface) EXPECT() *MockSecurityGroupServiceIfaceMockRecorder {
	return m.recorder
}

// AuthorizeSecurityGroupEgress mocks base method.
func (m *MockSecurityGroupServiceIface) AuthorizeSecurityGroupEgress(p *AuthorizeSecurityGroupEgressParams) (*AuthorizeSecurityGroupEgressResponse, error) {
	m.ctrl.T.Helper()
	ret := m.ctrl.Call(m, "AuthorizeSecurityGroupEgress", p)
	ret0, _ := ret[0].(*AuthorizeSecurityGroupEgressResponse)
	ret1, _ := ret[1].(error)
	return ret0, ret1
}

// AuthorizeSecurityGroupEgress indicates an expected call of AuthorizeSecurityGroupEgress.
func (mr *MockSecurityGroupServiceIfaceMockRecorder) AuthorizeSecurityGroupEgress(p any) *gomock.Call {
	mr.mock.ctrl.T.Helper()
	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AuthorizeSecurityGroupEgress", reflect.TypeOf((*MockSecurityGroupServiceIface)(nil).AuthorizeSecurityGroupEgress), p)
}

// AuthorizeSecurityGroupIngress mocks base method.
func (m *MockSecurityGroupServiceIface) AuthorizeSecurityGroupIngress(p *AuthorizeSecurityGroupIngressParams) (*AuthorizeSecurityGroupIngressResponse, error) {
	m.ctrl.T.Helper()
	ret := m.ctrl.Call(m, "AuthorizeSecurityGroupIngress", p)
	ret0, _ := ret[0].(*AuthorizeSecurityGroupIngressResponse)
	ret1, _ := ret[1].(error)
	return ret0, ret1
}

// AuthorizeSecurityGroupIngress indicates an expected call of AuthorizeSecurityGroupIngress.
func (mr *MockSecurityGroupServiceIfaceMockRecorder) AuthorizeSecurityGroupIngress(p any) *gomock.Call {
	mr.mock.ctrl.T.Helper()
	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AuthorizeSecurityGroupIngress", reflect.TypeOf((*MockSecurityGroupServiceIface)(nil).AuthorizeSecurityGroupIngress), p)
}

// CreateSecurityGroup mocks base method.
func (m *MockSecurityGroupServiceIface) CreateSecurityGroup(p *CreateSecurityGroupParams) (*CreateSecurityGroupResponse, error) {
	m.ctrl.T.Helper()
	ret := m.ctrl.Call(m, "CreateSecurityGroup", p)
	ret0, _ := ret[0].(*CreateSecurityGroupResponse)
	ret1, _ := ret[1].(error)
	return ret0, ret1
}

// CreateSecurityGroup indicates an expected call of CreateSecurityGroup.
func (mr *MockSecurityGroupServiceIfaceMockRecorder) CreateSecurityGroup(p any) *gomock.Call {
	mr.mock.ctrl.T.Helper()
	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CreateSecurityGroup", reflect.TypeOf((*MockSecurityGroupServiceIface)(nil).CreateSecurityGroup), p)
}

// DeleteSecurityGroup mocks base method.
func (m *MockSecurityGroupServiceIface) DeleteSecurityGroup(p *DeleteSecurityGroupParams) (*DeleteSecurityGroupResponse, error) {
	m.ctrl.T.Helper()
	ret := m.ctrl.Call(m, "DeleteSecurityGroup", p)
	ret0, _ := ret[0].(*DeleteSecurityGroupResponse)
	ret1, _ := ret[1].(error)
	return ret0, ret1
}

// DeleteSecurityGroup indicates an expected call of DeleteSecurityGroup.
func (mr *MockSecurityGroupServiceIfaceMockRecorder) DeleteSecurityGroup(p any) *gomock.Call {
	mr.mock.ctrl.T.Helper()
	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DeleteSecurityGroup", reflect.TypeOf((*MockSecurityGroupServiceIface)(nil).DeleteSecurityGroup), p)
}

// GetSecurityGroupByID mocks base method.
func (m *MockSecurityGroupServiceIface) GetSecurityGroupByID(id string, opts ...OptionFunc) (*SecurityGroup, int, error) {
	m.ctrl.T.Helper()
	varargs := []any{id}
	for _, a := range opts {
		varargs = append(varargs, a)
	}
	ret := m.ctrl.Call(m, "GetSecurityGroupByID", varargs...)
	ret0, _ := ret[0].(*SecurityGroup)
	ret1, _ := ret[1].(int)
	ret2, _ := ret[2].(error)
	return ret0, ret1, ret2
}

// GetSecurityGroupByID indicates an expected call of GetSecurityGroupByID.
func (mr *MockSecurityGroupServiceIfaceMockRecorder) GetSecurityGroupByID(id any, opts ...any) *gomock.Call {
	mr.mock.ctrl.T.Helper()
	varargs := append([]any{id}, opts...)
	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetSecurityGroupByID", reflect.TypeOf((*MockSecurityGroupServiceIface)(nil).GetSecurityGroupByID), varargs...)
}

// GetSecurityGroupByName mocks base method.
func (m *MockSecurityGroupServiceIface) GetSecurityGroupByName(name string, opts ...OptionFunc) (*SecurityGroup, int, error) {
	m.ctrl.T.Helper()
	varargs := []any{name}
	for _, a := range opts {
		varargs = append(varargs, a)
	}
	ret := m.ctrl.Call(m, "GetSecurityGroupByName", varargs...)
	ret0, _ := ret[0].(*SecurityGroup)
	ret1, _ := ret[1].(int)
	ret2, _ := ret[2].(error)
	return ret0, ret1, ret2
}

// GetSecurityGroupByName indicates an expected call of GetSecurityGroupByName.
func (mr *MockSecurityGroupServiceIfaceMockRecorder) GetSecurityGroupByName(name any, opts ...any) *gomock.Call {
	mr.mock.ctrl.T.Helper()
	varargs := append([]any{name}, opts...)
	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetSecurityGroupByName", reflect.TypeOf((*MockSecurityGroupServiceIface)(nil).GetSecurityGroupByName), varargs...)
}

// GetSecurityGroupID mocks base method.
func (m *MockSecurityGroupServiceIface) GetSecurityGroupID(keyword string, opts ...OptionFunc) (string, int, error) {
	m.ctrl.T.Helper()
	varargs := []any{keyword}
	for _, a := range opts {
		varargs = append(varargs, a)
	}
	ret := m.ctrl.Call(m, "GetSecurityGroupID", varargs...)
	ret0, _ := ret[0].(string)
	ret1, _ := ret[1].(int)
	ret2, _ := ret[2].(error)
	return ret0, ret1, ret2
}

// GetSecurityGroupID indicates an expected call of GetSecurityGroupID.
func (mr *MockSecurityGroupServiceIfaceMockRecorder) GetSecurityGroupID(keyword any, opts ...any) *gomock.Call {
	mr.mock.ctrl.T.Helper()
	varargs := append([]any{keyword}, opts...)
	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetSecurityGroupID", reflect.TypeOf((*MockSecurityGroupServiceIface)(nil).GetSecurityGroupID), varargs...)
}

// ListSecurityGroups mocks base method.
func (m *MockSecurityGroupServiceIface) ListSecurityGroups(p *ListSecurityGroupsParams) (*ListSecurityGroupsResponse, error) {
	m.ctrl.T.Helper()
	ret := m.ctrl.Call(m, "ListSecurityGroups", p)
	ret0, _ := ret[0].(*ListSecurityGroupsResponse)
	ret1, _ := ret[1].(error)
	return ret0, ret1
}

// ListSecurityGroups indicates an expected call of ListSecurityGroups.
func (mr *MockSecurityGroupServiceIfaceMockRecorder) ListSecurityGroups(p any) *gomock.Call {
	mr.mock.ctrl.T.Helper()
	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ListSecurityGroups", reflect.TypeOf((*MockSecurityGroupServiceIface)(nil).ListSecurityGroups), p)
}

// NewAuthorizeSecurityGroupEgressParams mocks base method.
func (m *MockSecurityGroupServiceIface) NewAuthorizeSecurityGroupEgressParams() *AuthorizeSecurityGroupEgressParams {
	m.ctrl.T.Helper()
	ret := m.ctrl.Call(m, "NewAuthorizeSecurityGroupEgressParams")
	ret0, _ := ret[0].(*AuthorizeSecurityGroupEgressParams)
	return ret0
}

// NewAuthorizeSecurityGroupEgressParams indicates an expected call of NewAuthorizeSecurityGroupEgressParams.
func (mr *MockSecurityGroupServiceIfaceMockRecorder) NewAuthorizeSecurityGroupEgressParams() *gomock.Call {
	mr.mock.ctrl.T.Helper()
	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "NewAuthorizeSecurityGroupEgressParams", reflect.TypeOf((*MockSecurityGroupServiceIface)(nil).NewAuthorizeSecurityGroupEgressParams))
}

// NewAuthorizeSecurityGroupIngressParams mocks base method.
func (m *MockSecurityGroupServiceIface) NewAuthorizeSecurityGroupIngressParams() *AuthorizeSecurityGroupIngressParams {
	m.ctrl.T.Helper()
	ret := m.ctrl.Call(m, "NewAuthorizeSecurityGroupIngressParams")
	ret0, _ := ret[0].(*AuthorizeSecurityGroupIngressParams)
	return ret0
}

// NewAuthorizeSecurityGroupIngressParams indicates an expected call of NewAuthorizeSecurityGroupIngressParams.
func (mr *MockSecurityGroupServiceIfaceMockRecorder) NewAuthorizeSecurityGroupIngressParams() *gomock.Call {
	mr.mock.ctrl.T.Helper()
	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "NewAuthorizeSecurityGroupIngressParams", reflect.TypeOf((*MockSecurityGroupServiceIface)(nil).NewAuthorizeSecurityGroupIngressParams))
}

// NewCreateSecurityGroupParams mocks base method.
func (m *MockSecurityGroupServiceIface) NewCreateSecurityGroupParams(name string) *CreateSecurityGroupParams {
	m.ctrl.T.Helper()
	ret := m.ctrl.Call(m, "NewCreateSecurityGroupParams", name)
	ret0, _ := ret[0].(*CreateSecurityGroupParams)
	return ret0
}

// NewCreateSecurityGroupParams indicates an expected call of NewCreateSecurityGroupParams.
func (mr *MockSecurityGroupServiceIfaceMockRecorder) NewCreateSecurityGroupParams(name any) *gomock.Call {
	mr.mock.ctrl.T.Helper()
	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "NewCreateSecurityGroupParams", reflect.TypeOf((*MockSecurityGroupServiceIface)(nil).NewCreateSecurityGroupParams), name)
}

// NewDeleteSecurityGroupParams mocks base method.
func (m *MockSecurityGroupServiceIface) NewDeleteSecurityGroupParams() *DeleteSecurityGroupParams {
	m.ctrl.T.Helper()
	ret := m.ctrl.Call(m, "NewDeleteSecurityGroupParams")
	ret0, _ := ret[0].(*DeleteSecurityGroupParams)
	return ret0
}

// NewDeleteSecurityGroupParams indicates an expected call of NewDeleteSecurityGroupParams.
func (mr *MockSecurityGroupServiceIfaceMockRecorder) NewDeleteSecurityGroupParams() *gomock.Call {
	mr.mock.ctrl.T.Helper()
	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "NewDeleteSecurityGroupParams", reflect.TypeOf((*MockSecurityGroupServiceIface)(nil).NewDeleteSecurityGroupParams))
}

// NewListSecurityGroupsParams mocks base method.
func (m *MockSecurityGroupServiceIface) NewListSecurityGroupsParams() *ListSecurityGroupsParams {
	m.ctrl.T.Helper()
	ret := m.ctrl.Call(m, "NewListSecurityGroupsParams")
	ret0, _ := ret[0].(*ListSecurityGroupsParams)
	return ret0
}

// NewListSecurityGroupsParams indicates an expected call of NewListSecurityGroupsParams.
func (mr *MockSecurityGroupServiceIfaceMockRecorder) NewListSecurityGroupsParams() *gomock.Call {
	mr.mock.ctrl.T.Helper()
	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "NewListSecurityGroupsParams", reflect.TypeOf((*MockSecurityGroupServiceIface)(nil).NewListSecurityGroupsParams))
}

// NewRevokeSecurityGroupEgressParams mocks base method.
func (m *MockSecurityGroupServiceIface) NewRevokeSecurityGroupEgressParams(id string) *RevokeSecurityGroupEgressParams {
	m.ctrl.T.Helper()
	ret := m.ctrl.Call(m, "NewRevokeSecurityGroupEgressParams", id)
	ret0, _ := ret[0].(*RevokeSecurityGroupEgressParams)
	return ret0
}

// NewRevokeSecurityGroupEgressParams indicates an expected call of NewRevokeSecurityGroupEgressParams.
func (mr *MockSecurityGroupServiceIfaceMockRecorder) NewRevokeSecurityGroupEgressParams(id any) *gomock.Call {
	mr.mock.ctrl.T.Helper()
	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "NewRevokeSecurityGroupEgressParams", reflect.TypeOf((*MockSecurityGroupServiceIface)(nil).NewRevokeSecurityGroupEgressParams), id)
}

// NewRevokeSecurityGroupIngressParams mocks base method.
func (m *MockSecurityGroupServiceIface) NewRevokeSecurityGroupIngressParams(id string) *RevokeSecurityGroupIngressParams {
	m.ctrl.T.Helper()
	ret := m.ctrl.Call(m, "NewRevokeSecurityGroupIngressParams", id)
	ret0, _ := ret[0].(*RevokeSecurityGroupIngressParams)
	return ret0
}

// NewRevokeSecurityGroupIngressParams indicates an expected call of NewRevokeSecurityGroupIngressParams.
func (mr *MockSecurityGroupServiceIfaceMockRecorder) NewRevokeSecurityGroupIngressParams(id any) *gomock.Call {
	mr.mock.ctrl.T.Helper()
	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "NewRevokeSecurityGroupIngressParams", reflect.TypeOf((*MockSecurityGroupServiceIface)(nil).NewRevokeSecurityGroupIngressParams), id)
}

// NewUpdateSecurityGroupParams mocks base method.
func (m *MockSecurityGroupServiceIface) NewUpdateSecurityGroupParams(id string) *UpdateSecurityGroupParams {
	m.ctrl.T.Helper()
	ret := m.ctrl.Call(m, "NewUpdateSecurityGroupParams", id)
	ret0, _ := ret[0].(*UpdateSecurityGroupParams)
	return ret0
}

// NewUpdateSecurityGroupParams indicates an expected call of NewUpdateSecurityGroupParams.
func (mr *MockSecurityGroupServiceIfaceMockRecorder) NewUpdateSecurityGroupParams(id any) *gomock.Call {
	mr.mock.ctrl.T.Helper()
	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "NewUpdateSecurityGroupParams", reflect.TypeOf((*MockSecurityGroupServiceIface)(nil).NewUpdateSecurityGroupParams), id)
}

// RevokeSecurityGroupEgress mocks base method.
func (m *MockSecurityGroupServiceIface) RevokeSecurityGroupEgress(p *RevokeSecurityGroupEgressParams) (*RevokeSecurityGroupEgressResponse, error) {
	m.ctrl.T.Helper()
	ret := m.ctrl.Call(m, "RevokeSecurityGroupEgress", p)
	ret0, _ := ret[0].(*RevokeSecurityGroupEgressResponse)
	ret1, _ := ret[1].(error)
	return ret0, ret1
}

// RevokeSecurityGroupEgress indicates an expected call of RevokeSecurityGroupEgress.
func (mr *MockSecurityGroupServiceIfaceMockRecorder) RevokeSecurityGroupEgress(p any) *gomock.Call {
	mr.mock.ctrl.T.Helper()
	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "RevokeSecurityGroupEgress", reflect.TypeOf((*MockSecurityGroupServiceIface)(nil).RevokeSecurityGroupEgress), p)
}

// RevokeSecurityGroupIngress mocks base method.
func (m *MockSecurityGroupServiceIface) RevokeSecurityGroupIngress(p *RevokeSecurityGroupIngressParams) (*RevokeSecurityGroupIngressResponse, error) {
	m.ctrl.T.Helper()
	ret := m.ctrl.Call(m, "RevokeSecurityGroupIngress", p)
	ret0, _ := ret[0].(*RevokeSecurityGroupIngressResponse)
	ret1, _ := ret[1].(error)
	return ret0, ret1
}

// RevokeSecurityGroupIngress indicates an expected call of RevokeSecurityGroupIngress.
func (mr *MockSecurityGroupServiceIfaceMockRecorder) RevokeSecurityGroupIngress(p any) *gomock.Call {
	mr.mock.ctrl.T.Helper()
	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "RevokeSecurityGroupIngress", reflect.TypeOf((*MockSecurityGroupServiceIface)(nil).RevokeSecurityGroupIngress), p)
}

// UpdateSecurityGroup mocks base method.
func (m *MockSecurityGroupServiceIface) UpdateSecurityGroup(p *UpdateSecurityGroupParams) (*UpdateSecurityGroupResponse, error) {
	m.ctrl.T.Helper()
	ret := m.ctrl.Call(m, "UpdateSecurityGroup", p)
	ret0, _ := ret[0].(*UpdateSecurityGroupResponse)
	ret1, _ := ret[1].(error)
	return ret0, ret1
}

// UpdateSecurityGroup indicates an expected call of UpdateSecurityGroup.
func (mr *MockSecurityGroupServiceIfaceMockRecorder) UpdateSecurityGroup(p any) *gomock.Call {
	mr.mock.ctrl.T.Helper()
	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UpdateSecurityGroup", reflect.TypeOf((*MockSecurityGroupServiceIface)(nil).UpdateSecurityGroup), p)
}
