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

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

import (
	reflect "reflect"

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

// MockVirtualMachineServiceIface is a mock of VirtualMachineServiceIface interface.
type MockVirtualMachineServiceIface struct {
	ctrl     *gomock.Controller
	recorder *MockVirtualMachineServiceIfaceMockRecorder
	isgomock struct{}
}

// MockVirtualMachineServiceIfaceMockRecorder is the mock recorder for MockVirtualMachineServiceIface.
type MockVirtualMachineServiceIfaceMockRecorder struct {
	mock *MockVirtualMachineServiceIface
}

// NewMockVirtualMachineServiceIface creates a new mock instance.
func NewMockVirtualMachineServiceIface(ctrl *gomock.Controller) *MockVirtualMachineServiceIface {
	mock := &MockVirtualMachineServiceIface{ctrl: ctrl}
	mock.recorder = &MockVirtualMachineServiceIfaceMockRecorder{mock}
	return mock
}

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

// AddNicToVirtualMachine mocks base method.
func (m *MockVirtualMachineServiceIface) AddNicToVirtualMachine(p *AddNicToVirtualMachineParams) (*AddNicToVirtualMachineResponse, error) {
	m.ctrl.T.Helper()
	ret := m.ctrl.Call(m, "AddNicToVirtualMachine", p)
	ret0, _ := ret[0].(*AddNicToVirtualMachineResponse)
	ret1, _ := ret[1].(error)
	return ret0, ret1
}

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

// AssignVirtualMachine mocks base method.
func (m *MockVirtualMachineServiceIface) AssignVirtualMachine(p *AssignVirtualMachineParams) (*AssignVirtualMachineResponse, error) {
	m.ctrl.T.Helper()
	ret := m.ctrl.Call(m, "AssignVirtualMachine", p)
	ret0, _ := ret[0].(*AssignVirtualMachineResponse)
	ret1, _ := ret[1].(error)
	return ret0, ret1
}

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

// ChangeServiceForVirtualMachine mocks base method.
func (m *MockVirtualMachineServiceIface) ChangeServiceForVirtualMachine(p *ChangeServiceForVirtualMachineParams) (*ChangeServiceForVirtualMachineResponse, error) {
	m.ctrl.T.Helper()
	ret := m.ctrl.Call(m, "ChangeServiceForVirtualMachine", p)
	ret0, _ := ret[0].(*ChangeServiceForVirtualMachineResponse)
	ret1, _ := ret[1].(error)
	return ret0, ret1
}

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

// CleanVMReservations mocks base method.
func (m *MockVirtualMachineServiceIface) CleanVMReservations(p *CleanVMReservationsParams) (*CleanVMReservationsResponse, error) {
	m.ctrl.T.Helper()
	ret := m.ctrl.Call(m, "CleanVMReservations", p)
	ret0, _ := ret[0].(*CleanVMReservationsResponse)
	ret1, _ := ret[1].(error)
	return ret0, ret1
}

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

// CreateVMSchedule mocks base method.
func (m *MockVirtualMachineServiceIface) CreateVMSchedule(p *CreateVMScheduleParams) (*CreateVMScheduleResponse, error) {
	m.ctrl.T.Helper()
	ret := m.ctrl.Call(m, "CreateVMSchedule", p)
	ret0, _ := ret[0].(*CreateVMScheduleResponse)
	ret1, _ := ret[1].(error)
	return ret0, ret1
}

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

// DeleteVMSchedule mocks base method.
func (m *MockVirtualMachineServiceIface) DeleteVMSchedule(p *DeleteVMScheduleParams) (*DeleteVMScheduleResponse, error) {
	m.ctrl.T.Helper()
	ret := m.ctrl.Call(m, "DeleteVMSchedule", p)
	ret0, _ := ret[0].(*DeleteVMScheduleResponse)
	ret1, _ := ret[1].(error)
	return ret0, ret1
}

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

// DeployVirtualMachine mocks base method.
func (m *MockVirtualMachineServiceIface) DeployVirtualMachine(p *DeployVirtualMachineParams) (*DeployVirtualMachineResponse, error) {
	m.ctrl.T.Helper()
	ret := m.ctrl.Call(m, "DeployVirtualMachine", p)
	ret0, _ := ret[0].(*DeployVirtualMachineResponse)
	ret1, _ := ret[1].(error)
	return ret0, ret1
}

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

// DestroyVirtualMachine mocks base method.
func (m *MockVirtualMachineServiceIface) DestroyVirtualMachine(p *DestroyVirtualMachineParams) (*DestroyVirtualMachineResponse, error) {
	m.ctrl.T.Helper()
	ret := m.ctrl.Call(m, "DestroyVirtualMachine", p)
	ret0, _ := ret[0].(*DestroyVirtualMachineResponse)
	ret1, _ := ret[1].(error)
	return ret0, ret1
}

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

// ExpungeVirtualMachine mocks base method.
func (m *MockVirtualMachineServiceIface) ExpungeVirtualMachine(p *ExpungeVirtualMachineParams) (*ExpungeVirtualMachineResponse, error) {
	m.ctrl.T.Helper()
	ret := m.ctrl.Call(m, "ExpungeVirtualMachine", p)
	ret0, _ := ret[0].(*ExpungeVirtualMachineResponse)
	ret1, _ := ret[1].(error)
	return ret0, ret1
}

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

// GetVMPassword mocks base method.
func (m *MockVirtualMachineServiceIface) GetVMPassword(p *GetVMPasswordParams) (*GetVMPasswordResponse, error) {
	m.ctrl.T.Helper()
	ret := m.ctrl.Call(m, "GetVMPassword", p)
	ret0, _ := ret[0].(*GetVMPasswordResponse)
	ret1, _ := ret[1].(error)
	return ret0, ret1
}

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

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

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

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

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

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

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

// GetVirtualMachineID mocks base method.
func (m *MockVirtualMachineServiceIface) GetVirtualMachineID(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, "GetVirtualMachineID", varargs...)
	ret0, _ := ret[0].(string)
	ret1, _ := ret[1].(int)
	ret2, _ := ret[2].(error)
	return ret0, ret1, ret2
}

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

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

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

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

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

// GetVirtualMachinesMetricID mocks base method.
func (m *MockVirtualMachineServiceIface) GetVirtualMachinesMetricID(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, "GetVirtualMachinesMetricID", varargs...)
	ret0, _ := ret[0].(string)
	ret1, _ := ret[1].(int)
	ret2, _ := ret[2].(error)
	return ret0, ret1, ret2
}

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

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

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

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

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

// GetVirtualMachinesUsageHistoryID mocks base method.
func (m *MockVirtualMachineServiceIface) GetVirtualMachinesUsageHistoryID(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, "GetVirtualMachinesUsageHistoryID", varargs...)
	ret0, _ := ret[0].(string)
	ret1, _ := ret[1].(int)
	ret2, _ := ret[2].(error)
	return ret0, ret1, ret2
}

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

// ImportUnmanagedInstance mocks base method.
func (m *MockVirtualMachineServiceIface) ImportUnmanagedInstance(p *ImportUnmanagedInstanceParams) (*ImportUnmanagedInstanceResponse, error) {
	m.ctrl.T.Helper()
	ret := m.ctrl.Call(m, "ImportUnmanagedInstance", p)
	ret0, _ := ret[0].(*ImportUnmanagedInstanceResponse)
	ret1, _ := ret[1].(error)
	return ret0, ret1
}

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

// ImportVm mocks base method.
func (m *MockVirtualMachineServiceIface) ImportVm(p *ImportVmParams) (*ImportVmResponse, error) {
	m.ctrl.T.Helper()
	ret := m.ctrl.Call(m, "ImportVm", p)
	ret0, _ := ret[0].(*ImportVmResponse)
	ret1, _ := ret[1].(error)
	return ret0, ret1
}

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

// ListUnmanagedInstances mocks base method.
func (m *MockVirtualMachineServiceIface) ListUnmanagedInstances(p *ListUnmanagedInstancesParams) (*ListUnmanagedInstancesResponse, error) {
	m.ctrl.T.Helper()
	ret := m.ctrl.Call(m, "ListUnmanagedInstances", p)
	ret0, _ := ret[0].(*ListUnmanagedInstancesResponse)
	ret1, _ := ret[1].(error)
	return ret0, ret1
}

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

// ListVMSchedule mocks base method.
func (m *MockVirtualMachineServiceIface) ListVMSchedule(p *ListVMScheduleParams) (*ListVMScheduleResponse, error) {
	m.ctrl.T.Helper()
	ret := m.ctrl.Call(m, "ListVMSchedule", p)
	ret0, _ := ret[0].(*ListVMScheduleResponse)
	ret1, _ := ret[1].(error)
	return ret0, ret1
}

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

// ListVirtualMachines mocks base method.
func (m *MockVirtualMachineServiceIface) ListVirtualMachines(p *ListVirtualMachinesParams) (*ListVirtualMachinesResponse, error) {
	m.ctrl.T.Helper()
	ret := m.ctrl.Call(m, "ListVirtualMachines", p)
	ret0, _ := ret[0].(*ListVirtualMachinesResponse)
	ret1, _ := ret[1].(error)
	return ret0, ret1
}

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

// ListVirtualMachinesMetrics mocks base method.
func (m *MockVirtualMachineServiceIface) ListVirtualMachinesMetrics(p *ListVirtualMachinesMetricsParams) (*ListVirtualMachinesMetricsResponse, error) {
	m.ctrl.T.Helper()
	ret := m.ctrl.Call(m, "ListVirtualMachinesMetrics", p)
	ret0, _ := ret[0].(*ListVirtualMachinesMetricsResponse)
	ret1, _ := ret[1].(error)
	return ret0, ret1
}

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

// ListVirtualMachinesUsageHistory mocks base method.
func (m *MockVirtualMachineServiceIface) ListVirtualMachinesUsageHistory(p *ListVirtualMachinesUsageHistoryParams) (*ListVirtualMachinesUsageHistoryResponse, error) {
	m.ctrl.T.Helper()
	ret := m.ctrl.Call(m, "ListVirtualMachinesUsageHistory", p)
	ret0, _ := ret[0].(*ListVirtualMachinesUsageHistoryResponse)
	ret1, _ := ret[1].(error)
	return ret0, ret1
}

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

// ListVmsForImport mocks base method.
func (m *MockVirtualMachineServiceIface) ListVmsForImport(p *ListVmsForImportParams) (*ListVmsForImportResponse, error) {
	m.ctrl.T.Helper()
	ret := m.ctrl.Call(m, "ListVmsForImport", p)
	ret0, _ := ret[0].(*ListVmsForImportResponse)
	ret1, _ := ret[1].(error)
	return ret0, ret1
}

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

// MigrateVirtualMachine mocks base method.
func (m *MockVirtualMachineServiceIface) MigrateVirtualMachine(p *MigrateVirtualMachineParams) (*MigrateVirtualMachineResponse, error) {
	m.ctrl.T.Helper()
	ret := m.ctrl.Call(m, "MigrateVirtualMachine", p)
	ret0, _ := ret[0].(*MigrateVirtualMachineResponse)
	ret1, _ := ret[1].(error)
	return ret0, ret1
}

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

// MigrateVirtualMachineWithVolume mocks base method.
func (m *MockVirtualMachineServiceIface) MigrateVirtualMachineWithVolume(p *MigrateVirtualMachineWithVolumeParams) (*MigrateVirtualMachineWithVolumeResponse, error) {
	m.ctrl.T.Helper()
	ret := m.ctrl.Call(m, "MigrateVirtualMachineWithVolume", p)
	ret0, _ := ret[0].(*MigrateVirtualMachineWithVolumeResponse)
	ret1, _ := ret[1].(error)
	return ret0, ret1
}

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

// NewAddNicToVirtualMachineParams mocks base method.
func (m *MockVirtualMachineServiceIface) NewAddNicToVirtualMachineParams(networkid, virtualmachineid string) *AddNicToVirtualMachineParams {
	m.ctrl.T.Helper()
	ret := m.ctrl.Call(m, "NewAddNicToVirtualMachineParams", networkid, virtualmachineid)
	ret0, _ := ret[0].(*AddNicToVirtualMachineParams)
	return ret0
}

// NewAddNicToVirtualMachineParams indicates an expected call of NewAddNicToVirtualMachineParams.
func (mr *MockVirtualMachineServiceIfaceMockRecorder) NewAddNicToVirtualMachineParams(networkid, virtualmachineid any) *gomock.Call {
	mr.mock.ctrl.T.Helper()
	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "NewAddNicToVirtualMachineParams", reflect.TypeOf((*MockVirtualMachineServiceIface)(nil).NewAddNicToVirtualMachineParams), networkid, virtualmachineid)
}

// NewAssignVirtualMachineParams mocks base method.
func (m *MockVirtualMachineServiceIface) NewAssignVirtualMachineParams(virtualmachineid string) *AssignVirtualMachineParams {
	m.ctrl.T.Helper()
	ret := m.ctrl.Call(m, "NewAssignVirtualMachineParams", virtualmachineid)
	ret0, _ := ret[0].(*AssignVirtualMachineParams)
	return ret0
}

// NewAssignVirtualMachineParams indicates an expected call of NewAssignVirtualMachineParams.
func (mr *MockVirtualMachineServiceIfaceMockRecorder) NewAssignVirtualMachineParams(virtualmachineid any) *gomock.Call {
	mr.mock.ctrl.T.Helper()
	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "NewAssignVirtualMachineParams", reflect.TypeOf((*MockVirtualMachineServiceIface)(nil).NewAssignVirtualMachineParams), virtualmachineid)
}

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

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

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

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

// NewCreateVMScheduleParams mocks base method.
func (m *MockVirtualMachineServiceIface) NewCreateVMScheduleParams(action, schedule, timezone, virtualmachineid string) *CreateVMScheduleParams {
	m.ctrl.T.Helper()
	ret := m.ctrl.Call(m, "NewCreateVMScheduleParams", action, schedule, timezone, virtualmachineid)
	ret0, _ := ret[0].(*CreateVMScheduleParams)
	return ret0
}

// NewCreateVMScheduleParams indicates an expected call of NewCreateVMScheduleParams.
func (mr *MockVirtualMachineServiceIfaceMockRecorder) NewCreateVMScheduleParams(action, schedule, timezone, virtualmachineid any) *gomock.Call {
	mr.mock.ctrl.T.Helper()
	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "NewCreateVMScheduleParams", reflect.TypeOf((*MockVirtualMachineServiceIface)(nil).NewCreateVMScheduleParams), action, schedule, timezone, virtualmachineid)
}

// NewDeleteVMScheduleParams mocks base method.
func (m *MockVirtualMachineServiceIface) NewDeleteVMScheduleParams(virtualmachineid string) *DeleteVMScheduleParams {
	m.ctrl.T.Helper()
	ret := m.ctrl.Call(m, "NewDeleteVMScheduleParams", virtualmachineid)
	ret0, _ := ret[0].(*DeleteVMScheduleParams)
	return ret0
}

// NewDeleteVMScheduleParams indicates an expected call of NewDeleteVMScheduleParams.
func (mr *MockVirtualMachineServiceIfaceMockRecorder) NewDeleteVMScheduleParams(virtualmachineid any) *gomock.Call {
	mr.mock.ctrl.T.Helper()
	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "NewDeleteVMScheduleParams", reflect.TypeOf((*MockVirtualMachineServiceIface)(nil).NewDeleteVMScheduleParams), virtualmachineid)
}

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

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

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

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

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

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

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

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

// NewImportUnmanagedInstanceParams mocks base method.
func (m *MockVirtualMachineServiceIface) NewImportUnmanagedInstanceParams(clusterid, name, serviceofferingid string) *ImportUnmanagedInstanceParams {
	m.ctrl.T.Helper()
	ret := m.ctrl.Call(m, "NewImportUnmanagedInstanceParams", clusterid, name, serviceofferingid)
	ret0, _ := ret[0].(*ImportUnmanagedInstanceParams)
	return ret0
}

// NewImportUnmanagedInstanceParams indicates an expected call of NewImportUnmanagedInstanceParams.
func (mr *MockVirtualMachineServiceIfaceMockRecorder) NewImportUnmanagedInstanceParams(clusterid, name, serviceofferingid any) *gomock.Call {
	mr.mock.ctrl.T.Helper()
	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "NewImportUnmanagedInstanceParams", reflect.TypeOf((*MockVirtualMachineServiceIface)(nil).NewImportUnmanagedInstanceParams), clusterid, name, serviceofferingid)
}

// NewImportVmParams mocks base method.
func (m *MockVirtualMachineServiceIface) NewImportVmParams(clusterid, hypervisor, importsource, name, serviceofferingid, zoneid string) *ImportVmParams {
	m.ctrl.T.Helper()
	ret := m.ctrl.Call(m, "NewImportVmParams", clusterid, hypervisor, importsource, name, serviceofferingid, zoneid)
	ret0, _ := ret[0].(*ImportVmParams)
	return ret0
}

// NewImportVmParams indicates an expected call of NewImportVmParams.
func (mr *MockVirtualMachineServiceIfaceMockRecorder) NewImportVmParams(clusterid, hypervisor, importsource, name, serviceofferingid, zoneid any) *gomock.Call {
	mr.mock.ctrl.T.Helper()
	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "NewImportVmParams", reflect.TypeOf((*MockVirtualMachineServiceIface)(nil).NewImportVmParams), clusterid, hypervisor, importsource, name, serviceofferingid, zoneid)
}

// NewListUnmanagedInstancesParams mocks base method.
func (m *MockVirtualMachineServiceIface) NewListUnmanagedInstancesParams(clusterid string) *ListUnmanagedInstancesParams {
	m.ctrl.T.Helper()
	ret := m.ctrl.Call(m, "NewListUnmanagedInstancesParams", clusterid)
	ret0, _ := ret[0].(*ListUnmanagedInstancesParams)
	return ret0
}

// NewListUnmanagedInstancesParams indicates an expected call of NewListUnmanagedInstancesParams.
func (mr *MockVirtualMachineServiceIfaceMockRecorder) NewListUnmanagedInstancesParams(clusterid any) *gomock.Call {
	mr.mock.ctrl.T.Helper()
	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "NewListUnmanagedInstancesParams", reflect.TypeOf((*MockVirtualMachineServiceIface)(nil).NewListUnmanagedInstancesParams), clusterid)
}

// NewListVMScheduleParams mocks base method.
func (m *MockVirtualMachineServiceIface) NewListVMScheduleParams(virtualmachineid string) *ListVMScheduleParams {
	m.ctrl.T.Helper()
	ret := m.ctrl.Call(m, "NewListVMScheduleParams", virtualmachineid)
	ret0, _ := ret[0].(*ListVMScheduleParams)
	return ret0
}

// NewListVMScheduleParams indicates an expected call of NewListVMScheduleParams.
func (mr *MockVirtualMachineServiceIfaceMockRecorder) NewListVMScheduleParams(virtualmachineid any) *gomock.Call {
	mr.mock.ctrl.T.Helper()
	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "NewListVMScheduleParams", reflect.TypeOf((*MockVirtualMachineServiceIface)(nil).NewListVMScheduleParams), virtualmachineid)
}

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

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

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

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

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

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

// NewListVmsForImportParams mocks base method.
func (m *MockVirtualMachineServiceIface) NewListVmsForImportParams(host, hypervisor, zoneid string) *ListVmsForImportParams {
	m.ctrl.T.Helper()
	ret := m.ctrl.Call(m, "NewListVmsForImportParams", host, hypervisor, zoneid)
	ret0, _ := ret[0].(*ListVmsForImportParams)
	return ret0
}

// NewListVmsForImportParams indicates an expected call of NewListVmsForImportParams.
func (mr *MockVirtualMachineServiceIfaceMockRecorder) NewListVmsForImportParams(host, hypervisor, zoneid any) *gomock.Call {
	mr.mock.ctrl.T.Helper()
	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "NewListVmsForImportParams", reflect.TypeOf((*MockVirtualMachineServiceIface)(nil).NewListVmsForImportParams), host, hypervisor, zoneid)
}

// NewMigrateVirtualMachineParams mocks base method.
func (m *MockVirtualMachineServiceIface) NewMigrateVirtualMachineParams(virtualmachineid string) *MigrateVirtualMachineParams {
	m.ctrl.T.Helper()
	ret := m.ctrl.Call(m, "NewMigrateVirtualMachineParams", virtualmachineid)
	ret0, _ := ret[0].(*MigrateVirtualMachineParams)
	return ret0
}

// NewMigrateVirtualMachineParams indicates an expected call of NewMigrateVirtualMachineParams.
func (mr *MockVirtualMachineServiceIfaceMockRecorder) NewMigrateVirtualMachineParams(virtualmachineid any) *gomock.Call {
	mr.mock.ctrl.T.Helper()
	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "NewMigrateVirtualMachineParams", reflect.TypeOf((*MockVirtualMachineServiceIface)(nil).NewMigrateVirtualMachineParams), virtualmachineid)
}

// NewMigrateVirtualMachineWithVolumeParams mocks base method.
func (m *MockVirtualMachineServiceIface) NewMigrateVirtualMachineWithVolumeParams(virtualmachineid string) *MigrateVirtualMachineWithVolumeParams {
	m.ctrl.T.Helper()
	ret := m.ctrl.Call(m, "NewMigrateVirtualMachineWithVolumeParams", virtualmachineid)
	ret0, _ := ret[0].(*MigrateVirtualMachineWithVolumeParams)
	return ret0
}

// NewMigrateVirtualMachineWithVolumeParams indicates an expected call of NewMigrateVirtualMachineWithVolumeParams.
func (mr *MockVirtualMachineServiceIfaceMockRecorder) NewMigrateVirtualMachineWithVolumeParams(virtualmachineid any) *gomock.Call {
	mr.mock.ctrl.T.Helper()
	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "NewMigrateVirtualMachineWithVolumeParams", reflect.TypeOf((*MockVirtualMachineServiceIface)(nil).NewMigrateVirtualMachineWithVolumeParams), virtualmachineid)
}

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

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

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

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

// NewRemoveNicFromVirtualMachineParams mocks base method.
func (m *MockVirtualMachineServiceIface) NewRemoveNicFromVirtualMachineParams(nicid, virtualmachineid string) *RemoveNicFromVirtualMachineParams {
	m.ctrl.T.Helper()
	ret := m.ctrl.Call(m, "NewRemoveNicFromVirtualMachineParams", nicid, virtualmachineid)
	ret0, _ := ret[0].(*RemoveNicFromVirtualMachineParams)
	return ret0
}

// NewRemoveNicFromVirtualMachineParams indicates an expected call of NewRemoveNicFromVirtualMachineParams.
func (mr *MockVirtualMachineServiceIfaceMockRecorder) NewRemoveNicFromVirtualMachineParams(nicid, virtualmachineid any) *gomock.Call {
	mr.mock.ctrl.T.Helper()
	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "NewRemoveNicFromVirtualMachineParams", reflect.TypeOf((*MockVirtualMachineServiceIface)(nil).NewRemoveNicFromVirtualMachineParams), nicid, virtualmachineid)
}

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

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

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

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

// NewRestoreVirtualMachineParams mocks base method.
func (m *MockVirtualMachineServiceIface) NewRestoreVirtualMachineParams(virtualmachineid string) *RestoreVirtualMachineParams {
	m.ctrl.T.Helper()
	ret := m.ctrl.Call(m, "NewRestoreVirtualMachineParams", virtualmachineid)
	ret0, _ := ret[0].(*RestoreVirtualMachineParams)
	return ret0
}

// NewRestoreVirtualMachineParams indicates an expected call of NewRestoreVirtualMachineParams.
func (mr *MockVirtualMachineServiceIfaceMockRecorder) NewRestoreVirtualMachineParams(virtualmachineid any) *gomock.Call {
	mr.mock.ctrl.T.Helper()
	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "NewRestoreVirtualMachineParams", reflect.TypeOf((*MockVirtualMachineServiceIface)(nil).NewRestoreVirtualMachineParams), virtualmachineid)
}

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

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

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

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

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

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

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

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

// NewUpdateDefaultNicForVirtualMachineParams mocks base method.
func (m *MockVirtualMachineServiceIface) NewUpdateDefaultNicForVirtualMachineParams(nicid, virtualmachineid string) *UpdateDefaultNicForVirtualMachineParams {
	m.ctrl.T.Helper()
	ret := m.ctrl.Call(m, "NewUpdateDefaultNicForVirtualMachineParams", nicid, virtualmachineid)
	ret0, _ := ret[0].(*UpdateDefaultNicForVirtualMachineParams)
	return ret0
}

// NewUpdateDefaultNicForVirtualMachineParams indicates an expected call of NewUpdateDefaultNicForVirtualMachineParams.
func (mr *MockVirtualMachineServiceIfaceMockRecorder) NewUpdateDefaultNicForVirtualMachineParams(nicid, virtualmachineid any) *gomock.Call {
	mr.mock.ctrl.T.Helper()
	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "NewUpdateDefaultNicForVirtualMachineParams", reflect.TypeOf((*MockVirtualMachineServiceIface)(nil).NewUpdateDefaultNicForVirtualMachineParams), nicid, virtualmachineid)
}

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

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

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

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

// RebootVirtualMachine mocks base method.
func (m *MockVirtualMachineServiceIface) RebootVirtualMachine(p *RebootVirtualMachineParams) (*RebootVirtualMachineResponse, error) {
	m.ctrl.T.Helper()
	ret := m.ctrl.Call(m, "RebootVirtualMachine", p)
	ret0, _ := ret[0].(*RebootVirtualMachineResponse)
	ret1, _ := ret[1].(error)
	return ret0, ret1
}

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

// RecoverVirtualMachine mocks base method.
func (m *MockVirtualMachineServiceIface) RecoverVirtualMachine(p *RecoverVirtualMachineParams) (*RecoverVirtualMachineResponse, error) {
	m.ctrl.T.Helper()
	ret := m.ctrl.Call(m, "RecoverVirtualMachine", p)
	ret0, _ := ret[0].(*RecoverVirtualMachineResponse)
	ret1, _ := ret[1].(error)
	return ret0, ret1
}

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

// RemoveNicFromVirtualMachine mocks base method.
func (m *MockVirtualMachineServiceIface) RemoveNicFromVirtualMachine(p *RemoveNicFromVirtualMachineParams) (*RemoveNicFromVirtualMachineResponse, error) {
	m.ctrl.T.Helper()
	ret := m.ctrl.Call(m, "RemoveNicFromVirtualMachine", p)
	ret0, _ := ret[0].(*RemoveNicFromVirtualMachineResponse)
	ret1, _ := ret[1].(error)
	return ret0, ret1
}

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

// ResetPasswordForVirtualMachine mocks base method.
func (m *MockVirtualMachineServiceIface) ResetPasswordForVirtualMachine(p *ResetPasswordForVirtualMachineParams) (*ResetPasswordForVirtualMachineResponse, error) {
	m.ctrl.T.Helper()
	ret := m.ctrl.Call(m, "ResetPasswordForVirtualMachine", p)
	ret0, _ := ret[0].(*ResetPasswordForVirtualMachineResponse)
	ret1, _ := ret[1].(error)
	return ret0, ret1
}

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

// ResetUserDataForVirtualMachine mocks base method.
func (m *MockVirtualMachineServiceIface) ResetUserDataForVirtualMachine(p *ResetUserDataForVirtualMachineParams) (*ResetUserDataForVirtualMachineResponse, error) {
	m.ctrl.T.Helper()
	ret := m.ctrl.Call(m, "ResetUserDataForVirtualMachine", p)
	ret0, _ := ret[0].(*ResetUserDataForVirtualMachineResponse)
	ret1, _ := ret[1].(error)
	return ret0, ret1
}

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

// RestoreVirtualMachine mocks base method.
func (m *MockVirtualMachineServiceIface) RestoreVirtualMachine(p *RestoreVirtualMachineParams) (*RestoreVirtualMachineResponse, error) {
	m.ctrl.T.Helper()
	ret := m.ctrl.Call(m, "RestoreVirtualMachine", p)
	ret0, _ := ret[0].(*RestoreVirtualMachineResponse)
	ret1, _ := ret[1].(error)
	return ret0, ret1
}

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

// ScaleVirtualMachine mocks base method.
func (m *MockVirtualMachineServiceIface) ScaleVirtualMachine(p *ScaleVirtualMachineParams) (*ScaleVirtualMachineResponse, error) {
	m.ctrl.T.Helper()
	ret := m.ctrl.Call(m, "ScaleVirtualMachine", p)
	ret0, _ := ret[0].(*ScaleVirtualMachineResponse)
	ret1, _ := ret[1].(error)
	return ret0, ret1
}

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

// StartVirtualMachine mocks base method.
func (m *MockVirtualMachineServiceIface) StartVirtualMachine(p *StartVirtualMachineParams) (*StartVirtualMachineResponse, error) {
	m.ctrl.T.Helper()
	ret := m.ctrl.Call(m, "StartVirtualMachine", p)
	ret0, _ := ret[0].(*StartVirtualMachineResponse)
	ret1, _ := ret[1].(error)
	return ret0, ret1
}

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

// StopVirtualMachine mocks base method.
func (m *MockVirtualMachineServiceIface) StopVirtualMachine(p *StopVirtualMachineParams) (*StopVirtualMachineResponse, error) {
	m.ctrl.T.Helper()
	ret := m.ctrl.Call(m, "StopVirtualMachine", p)
	ret0, _ := ret[0].(*StopVirtualMachineResponse)
	ret1, _ := ret[1].(error)
	return ret0, ret1
}

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

// UnmanageVirtualMachine mocks base method.
func (m *MockVirtualMachineServiceIface) UnmanageVirtualMachine(p *UnmanageVirtualMachineParams) (*UnmanageVirtualMachineResponse, error) {
	m.ctrl.T.Helper()
	ret := m.ctrl.Call(m, "UnmanageVirtualMachine", p)
	ret0, _ := ret[0].(*UnmanageVirtualMachineResponse)
	ret1, _ := ret[1].(error)
	return ret0, ret1
}

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

// UpdateDefaultNicForVirtualMachine mocks base method.
func (m *MockVirtualMachineServiceIface) UpdateDefaultNicForVirtualMachine(p *UpdateDefaultNicForVirtualMachineParams) (*UpdateDefaultNicForVirtualMachineResponse, error) {
	m.ctrl.T.Helper()
	ret := m.ctrl.Call(m, "UpdateDefaultNicForVirtualMachine", p)
	ret0, _ := ret[0].(*UpdateDefaultNicForVirtualMachineResponse)
	ret1, _ := ret[1].(error)
	return ret0, ret1
}

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

// UpdateVMSchedule mocks base method.
func (m *MockVirtualMachineServiceIface) UpdateVMSchedule(p *UpdateVMScheduleParams) (*UpdateVMScheduleResponse, error) {
	m.ctrl.T.Helper()
	ret := m.ctrl.Call(m, "UpdateVMSchedule", p)
	ret0, _ := ret[0].(*UpdateVMScheduleResponse)
	ret1, _ := ret[1].(error)
	return ret0, ret1
}

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

// UpdateVirtualMachine mocks base method.
func (m *MockVirtualMachineServiceIface) UpdateVirtualMachine(p *UpdateVirtualMachineParams) (*UpdateVirtualMachineResponse, error) {
	m.ctrl.T.Helper()
	ret := m.ctrl.Call(m, "UpdateVirtualMachine", p)
	ret0, _ := ret[0].(*UpdateVirtualMachineResponse)
	ret1, _ := ret[1].(error)
	return ret0, ret1
}

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