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

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

import (
	reflect "reflect"

	gomock "github.com/golang/mock/gomock"
)

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

// 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 interface{}) *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 interface{}) *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 interface{}) *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 interface{}) *gomock.Call {
	mr.mock.ctrl.T.Helper()
	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CleanVMReservations", reflect.TypeOf((*MockVirtualMachineServiceIface)(nil).CleanVMReservations), 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 interface{}) *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 interface{}) *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 interface{}) *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 interface{}) *gomock.Call {
	mr.mock.ctrl.T.Helper()
	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetVMPassword", reflect.TypeOf((*MockVirtualMachineServiceIface)(nil).GetVMPassword), p)
}

// GetVirtualMachineByID mocks base method.
func (m *MockVirtualMachineServiceIface) GetVirtualMachineByID(id string, opts ...OptionFunc) (*VirtualMachine, int, error) {
	m.ctrl.T.Helper()
	varargs := []interface{}{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 interface{}, opts ...interface{}) *gomock.Call {
	mr.mock.ctrl.T.Helper()
	varargs := append([]interface{}{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 := []interface{}{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 interface{}, opts ...interface{}) *gomock.Call {
	mr.mock.ctrl.T.Helper()
	varargs := append([]interface{}{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 := []interface{}{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 interface{}, opts ...interface{}) *gomock.Call {
	mr.mock.ctrl.T.Helper()
	varargs := append([]interface{}{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 := []interface{}{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 interface{}, opts ...interface{}) *gomock.Call {
	mr.mock.ctrl.T.Helper()
	varargs := append([]interface{}{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 := []interface{}{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 interface{}, opts ...interface{}) *gomock.Call {
	mr.mock.ctrl.T.Helper()
	varargs := append([]interface{}{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 := []interface{}{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 interface{}, opts ...interface{}) *gomock.Call {
	mr.mock.ctrl.T.Helper()
	varargs := append([]interface{}{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 := []interface{}{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 interface{}, opts ...interface{}) *gomock.Call {
	mr.mock.ctrl.T.Helper()
	varargs := append([]interface{}{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 := []interface{}{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 interface{}, opts ...interface{}) *gomock.Call {
	mr.mock.ctrl.T.Helper()
	varargs := append([]interface{}{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 := []interface{}{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 interface{}, opts ...interface{}) *gomock.Call {
	mr.mock.ctrl.T.Helper()
	varargs := append([]interface{}{name}, opts...)
	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetVirtualMachinesUsageHistoryID", reflect.TypeOf((*MockVirtualMachineServiceIface)(nil).GetVirtualMachinesUsageHistoryID), varargs...)
}

// 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 interface{}) *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 interface{}) *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 interface{}) *gomock.Call {
	mr.mock.ctrl.T.Helper()
	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ListVirtualMachinesUsageHistory", reflect.TypeOf((*MockVirtualMachineServiceIface)(nil).ListVirtualMachinesUsageHistory), 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 interface{}) *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 interface{}) *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 interface{}) *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 interface{}) *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 interface{}) *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))
}

// 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 interface{}) *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 interface{}) *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 interface{}) *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 interface{}) *gomock.Call {
	mr.mock.ctrl.T.Helper()
	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "NewGetVMPasswordParams", reflect.TypeOf((*MockVirtualMachineServiceIface)(nil).NewGetVMPasswordParams), id)
}

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

// 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 interface{}) *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 interface{}) *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 interface{}) *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 interface{}) *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 interface{}) *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 interface{}) *gomock.Call {
	mr.mock.ctrl.T.Helper()
	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "NewResetPasswordForVirtualMachineParams", reflect.TypeOf((*MockVirtualMachineServiceIface)(nil).NewResetPasswordForVirtualMachineParams), 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 interface{}) *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 interface{}) *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 interface{}) *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 interface{}) *gomock.Call {
	mr.mock.ctrl.T.Helper()
	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "NewStopVirtualMachineParams", reflect.TypeOf((*MockVirtualMachineServiceIface)(nil).NewStopVirtualMachineParams), 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 interface{}) *gomock.Call {
	mr.mock.ctrl.T.Helper()
	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "NewUpdateDefaultNicForVirtualMachineParams", reflect.TypeOf((*MockVirtualMachineServiceIface)(nil).NewUpdateDefaultNicForVirtualMachineParams), nicid, virtualmachineid)
}

// 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 interface{}) *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 interface{}) *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 interface{}) *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 interface{}) *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 interface{}) *gomock.Call {
	mr.mock.ctrl.T.Helper()
	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ResetPasswordForVirtualMachine", reflect.TypeOf((*MockVirtualMachineServiceIface)(nil).ResetPasswordForVirtualMachine), 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 interface{}) *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 interface{}) *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 interface{}) *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 interface{}) *gomock.Call {
	mr.mock.ctrl.T.Helper()
	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StopVirtualMachine", reflect.TypeOf((*MockVirtualMachineServiceIface)(nil).StopVirtualMachine), 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 interface{}) *gomock.Call {
	mr.mock.ctrl.T.Helper()
	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UpdateDefaultNicForVirtualMachine", reflect.TypeOf((*MockVirtualMachineServiceIface)(nil).UpdateDefaultNicForVirtualMachine), 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 interface{}) *gomock.Call {
	mr.mock.ctrl.T.Helper()
	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UpdateVirtualMachine", reflect.TypeOf((*MockVirtualMachineServiceIface)(nil).UpdateVirtualMachine), p)
}
