//
// 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/VirtualNetworkFunctionsService.go
//
// Generated by this command:
//
//	mockgen -destination=./cloudstack/VirtualNetworkFunctionsService_mock.go -package=cloudstack -copyright_file=header.txt -source=./cloudstack/VirtualNetworkFunctionsService.go
//

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

import (
	reflect "reflect"

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

// MockVirtualNetworkFunctionsServiceIface is a mock of VirtualNetworkFunctionsServiceIface interface.
type MockVirtualNetworkFunctionsServiceIface struct {
	ctrl     *gomock.Controller
	recorder *MockVirtualNetworkFunctionsServiceIfaceMockRecorder
	isgomock struct{}
}

// MockVirtualNetworkFunctionsServiceIfaceMockRecorder is the mock recorder for MockVirtualNetworkFunctionsServiceIface.
type MockVirtualNetworkFunctionsServiceIfaceMockRecorder struct {
	mock *MockVirtualNetworkFunctionsServiceIface
}

// NewMockVirtualNetworkFunctionsServiceIface creates a new mock instance.
func NewMockVirtualNetworkFunctionsServiceIface(ctrl *gomock.Controller) *MockVirtualNetworkFunctionsServiceIface {
	mock := &MockVirtualNetworkFunctionsServiceIface{ctrl: ctrl}
	mock.recorder = &MockVirtualNetworkFunctionsServiceIfaceMockRecorder{mock}
	return mock
}

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

// DeleteVnfTemplate mocks base method.
func (m *MockVirtualNetworkFunctionsServiceIface) DeleteVnfTemplate(p *DeleteVnfTemplateParams) (*DeleteVnfTemplateResponse, error) {
	m.ctrl.T.Helper()
	ret := m.ctrl.Call(m, "DeleteVnfTemplate", p)
	ret0, _ := ret[0].(*DeleteVnfTemplateResponse)
	ret1, _ := ret[1].(error)
	return ret0, ret1
}

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

// DeployVnfAppliance mocks base method.
func (m *MockVirtualNetworkFunctionsServiceIface) DeployVnfAppliance(p *DeployVnfApplianceParams) (*DeployVnfApplianceResponse, error) {
	m.ctrl.T.Helper()
	ret := m.ctrl.Call(m, "DeployVnfAppliance", p)
	ret0, _ := ret[0].(*DeployVnfApplianceResponse)
	ret1, _ := ret[1].(error)
	return ret0, ret1
}

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

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

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

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

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

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

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

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

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

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

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

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

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

// ListVnfAppliances mocks base method.
func (m *MockVirtualNetworkFunctionsServiceIface) ListVnfAppliances(p *ListVnfAppliancesParams) (*ListVnfAppliancesResponse, error) {
	m.ctrl.T.Helper()
	ret := m.ctrl.Call(m, "ListVnfAppliances", p)
	ret0, _ := ret[0].(*ListVnfAppliancesResponse)
	ret1, _ := ret[1].(error)
	return ret0, ret1
}

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

// ListVnfTemplates mocks base method.
func (m *MockVirtualNetworkFunctionsServiceIface) ListVnfTemplates(p *ListVnfTemplatesParams) (*ListVnfTemplatesResponse, error) {
	m.ctrl.T.Helper()
	ret := m.ctrl.Call(m, "ListVnfTemplates", p)
	ret0, _ := ret[0].(*ListVnfTemplatesResponse)
	ret1, _ := ret[1].(error)
	return ret0, ret1
}

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

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

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

// NewDeployVnfApplianceParams mocks base method.
func (m *MockVirtualNetworkFunctionsServiceIface) NewDeployVnfApplianceParams(serviceofferingid, templateid, zoneid string) *DeployVnfApplianceParams {
	m.ctrl.T.Helper()
	ret := m.ctrl.Call(m, "NewDeployVnfApplianceParams", serviceofferingid, templateid, zoneid)
	ret0, _ := ret[0].(*DeployVnfApplianceParams)
	return ret0
}

// NewDeployVnfApplianceParams indicates an expected call of NewDeployVnfApplianceParams.
func (mr *MockVirtualNetworkFunctionsServiceIfaceMockRecorder) NewDeployVnfApplianceParams(serviceofferingid, templateid, zoneid any) *gomock.Call {
	mr.mock.ctrl.T.Helper()
	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "NewDeployVnfApplianceParams", reflect.TypeOf((*MockVirtualNetworkFunctionsServiceIface)(nil).NewDeployVnfApplianceParams), serviceofferingid, templateid, zoneid)
}

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

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

// NewListVnfTemplatesParams mocks base method.
func (m *MockVirtualNetworkFunctionsServiceIface) NewListVnfTemplatesParams(templatefilter string) *ListVnfTemplatesParams {
	m.ctrl.T.Helper()
	ret := m.ctrl.Call(m, "NewListVnfTemplatesParams", templatefilter)
	ret0, _ := ret[0].(*ListVnfTemplatesParams)
	return ret0
}

// NewListVnfTemplatesParams indicates an expected call of NewListVnfTemplatesParams.
func (mr *MockVirtualNetworkFunctionsServiceIfaceMockRecorder) NewListVnfTemplatesParams(templatefilter any) *gomock.Call {
	mr.mock.ctrl.T.Helper()
	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "NewListVnfTemplatesParams", reflect.TypeOf((*MockVirtualNetworkFunctionsServiceIface)(nil).NewListVnfTemplatesParams), templatefilter)
}

// NewRegisterVnfTemplateParams mocks base method.
func (m *MockVirtualNetworkFunctionsServiceIface) NewRegisterVnfTemplateParams(format, hypervisor, name, url string) *RegisterVnfTemplateParams {
	m.ctrl.T.Helper()
	ret := m.ctrl.Call(m, "NewRegisterVnfTemplateParams", format, hypervisor, name, url)
	ret0, _ := ret[0].(*RegisterVnfTemplateParams)
	return ret0
}

// NewRegisterVnfTemplateParams indicates an expected call of NewRegisterVnfTemplateParams.
func (mr *MockVirtualNetworkFunctionsServiceIfaceMockRecorder) NewRegisterVnfTemplateParams(format, hypervisor, name, url any) *gomock.Call {
	mr.mock.ctrl.T.Helper()
	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "NewRegisterVnfTemplateParams", reflect.TypeOf((*MockVirtualNetworkFunctionsServiceIface)(nil).NewRegisterVnfTemplateParams), format, hypervisor, name, url)
}

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

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

// RegisterVnfTemplate mocks base method.
func (m *MockVirtualNetworkFunctionsServiceIface) RegisterVnfTemplate(p *RegisterVnfTemplateParams) (*RegisterVnfTemplateResponse, error) {
	m.ctrl.T.Helper()
	ret := m.ctrl.Call(m, "RegisterVnfTemplate", p)
	ret0, _ := ret[0].(*RegisterVnfTemplateResponse)
	ret1, _ := ret[1].(error)
	return ret0, ret1
}

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

// UpdateVnfTemplate mocks base method.
func (m *MockVirtualNetworkFunctionsServiceIface) UpdateVnfTemplate(p *UpdateVnfTemplateParams) (*UpdateVnfTemplateResponse, error) {
	m.ctrl.T.Helper()
	ret := m.ctrl.Call(m, "UpdateVnfTemplate", p)
	ret0, _ := ret[0].(*UpdateVnfTemplateResponse)
	ret1, _ := ret[1].(error)
	return ret0, ret1
}

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