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

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

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

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