//
// 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)
}

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

// AssignVirtualMachineToBackupOffering indicates an expected call of AssignVirtualMachineToBackupOffering.
func (mr *MockVirtualMachineServiceIfaceMockRecorder) AssignVirtualMachineToBackupOffering(p any) *gomock.Call {
	mr.mock.ctrl.T.Helper()
	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AssignVirtualMachineToBackupOffering", reflect.TypeOf((*MockVirtualMachineServiceIface)(nil).AssignVirtualMachineToBackupOffering), 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)
}

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

// ListImportVmTasks indicates an expected call of ListImportVmTasks.
func (mr *MockVirtualMachineServiceIfaceMockRecorder) ListImportVmTasks(p any) *gomock.Call {
	mr.mock.ctrl.T.Helper()
	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ListImportVmTasks", reflect.TypeOf((*MockVirtualMachineServiceIface)(nil).ListImportVmTasks), 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)
}

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

// NewAssignVirtualMachineToBackupOfferingParams indicates an expected call of NewAssignVirtualMachineToBackupOfferingParams.
func (mr *MockVirtualMachineServiceIfaceMockRecorder) NewAssignVirtualMachineToBackupOfferingParams(backupofferingid, virtualmachineid any) *gomock.Call {
	mr.mock.ctrl.T.Helper()
	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "NewAssignVirtualMachineToBackupOfferingParams", reflect.TypeOf((*MockVirtualMachineServiceIface)(nil).NewAssignVirtualMachineToBackupOfferingParams), backupofferingid, 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)
}

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

// NewListImportVmTasksParams indicates an expected call of NewListImportVmTasksParams.
func (mr *MockVirtualMachineServiceIfaceMockRecorder) NewListImportVmTasksParams(zoneid any) *gomock.Call {
	mr.mock.ctrl.T.Helper()
	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "NewListImportVmTasksParams", reflect.TypeOf((*MockVirtualMachineServiceIface)(nil).NewListImportVmTasksParams), 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)
}

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

// NewRemoveVirtualMachineFromBackupOfferingParams indicates an expected call of NewRemoveVirtualMachineFromBackupOfferingParams.
func (mr *MockVirtualMachineServiceIfaceMockRecorder) NewRemoveVirtualMachineFromBackupOfferingParams(virtualmachineid any) *gomock.Call {
	mr.mock.ctrl.T.Helper()
	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "NewRemoveVirtualMachineFromBackupOfferingParams", reflect.TypeOf((*MockVirtualMachineServiceIface)(nil).NewRemoveVirtualMachineFromBackupOfferingParams), 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)
}

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

// RemoveVirtualMachineFromBackupOffering indicates an expected call of RemoveVirtualMachineFromBackupOffering.
func (mr *MockVirtualMachineServiceIfaceMockRecorder) RemoveVirtualMachineFromBackupOffering(p any) *gomock.Call {
	mr.mock.ctrl.T.Helper()
	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "RemoveVirtualMachineFromBackupOffering", reflect.TypeOf((*MockVirtualMachineServiceIface)(nil).RemoveVirtualMachineFromBackupOffering), 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)
}
