//
// 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/AutoScaleService.go

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

import (
	reflect "reflect"

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

// MockAutoScaleServiceIface is a mock of AutoScaleServiceIface interface.
type MockAutoScaleServiceIface struct {
	ctrl     *gomock.Controller
	recorder *MockAutoScaleServiceIfaceMockRecorder
}

// MockAutoScaleServiceIfaceMockRecorder is the mock recorder for MockAutoScaleServiceIface.
type MockAutoScaleServiceIfaceMockRecorder struct {
	mock *MockAutoScaleServiceIface
}

// NewMockAutoScaleServiceIface creates a new mock instance.
func NewMockAutoScaleServiceIface(ctrl *gomock.Controller) *MockAutoScaleServiceIface {
	mock := &MockAutoScaleServiceIface{ctrl: ctrl}
	mock.recorder = &MockAutoScaleServiceIfaceMockRecorder{mock}
	return mock
}

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

// CreateAutoScalePolicy mocks base method.
func (m *MockAutoScaleServiceIface) CreateAutoScalePolicy(p *CreateAutoScalePolicyParams) (*CreateAutoScalePolicyResponse, error) {
	m.ctrl.T.Helper()
	ret := m.ctrl.Call(m, "CreateAutoScalePolicy", p)
	ret0, _ := ret[0].(*CreateAutoScalePolicyResponse)
	ret1, _ := ret[1].(error)
	return ret0, ret1
}

// CreateAutoScalePolicy indicates an expected call of CreateAutoScalePolicy.
func (mr *MockAutoScaleServiceIfaceMockRecorder) CreateAutoScalePolicy(p interface{}) *gomock.Call {
	mr.mock.ctrl.T.Helper()
	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CreateAutoScalePolicy", reflect.TypeOf((*MockAutoScaleServiceIface)(nil).CreateAutoScalePolicy), p)
}

// CreateAutoScaleVmGroup mocks base method.
func (m *MockAutoScaleServiceIface) CreateAutoScaleVmGroup(p *CreateAutoScaleVmGroupParams) (*CreateAutoScaleVmGroupResponse, error) {
	m.ctrl.T.Helper()
	ret := m.ctrl.Call(m, "CreateAutoScaleVmGroup", p)
	ret0, _ := ret[0].(*CreateAutoScaleVmGroupResponse)
	ret1, _ := ret[1].(error)
	return ret0, ret1
}

// CreateAutoScaleVmGroup indicates an expected call of CreateAutoScaleVmGroup.
func (mr *MockAutoScaleServiceIfaceMockRecorder) CreateAutoScaleVmGroup(p interface{}) *gomock.Call {
	mr.mock.ctrl.T.Helper()
	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CreateAutoScaleVmGroup", reflect.TypeOf((*MockAutoScaleServiceIface)(nil).CreateAutoScaleVmGroup), p)
}

// CreateAutoScaleVmProfile mocks base method.
func (m *MockAutoScaleServiceIface) CreateAutoScaleVmProfile(p *CreateAutoScaleVmProfileParams) (*CreateAutoScaleVmProfileResponse, error) {
	m.ctrl.T.Helper()
	ret := m.ctrl.Call(m, "CreateAutoScaleVmProfile", p)
	ret0, _ := ret[0].(*CreateAutoScaleVmProfileResponse)
	ret1, _ := ret[1].(error)
	return ret0, ret1
}

// CreateAutoScaleVmProfile indicates an expected call of CreateAutoScaleVmProfile.
func (mr *MockAutoScaleServiceIfaceMockRecorder) CreateAutoScaleVmProfile(p interface{}) *gomock.Call {
	mr.mock.ctrl.T.Helper()
	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CreateAutoScaleVmProfile", reflect.TypeOf((*MockAutoScaleServiceIface)(nil).CreateAutoScaleVmProfile), p)
}

// CreateCondition mocks base method.
func (m *MockAutoScaleServiceIface) CreateCondition(p *CreateConditionParams) (*CreateConditionResponse, error) {
	m.ctrl.T.Helper()
	ret := m.ctrl.Call(m, "CreateCondition", p)
	ret0, _ := ret[0].(*CreateConditionResponse)
	ret1, _ := ret[1].(error)
	return ret0, ret1
}

// CreateCondition indicates an expected call of CreateCondition.
func (mr *MockAutoScaleServiceIfaceMockRecorder) CreateCondition(p interface{}) *gomock.Call {
	mr.mock.ctrl.T.Helper()
	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CreateCondition", reflect.TypeOf((*MockAutoScaleServiceIface)(nil).CreateCondition), p)
}

// CreateCounter mocks base method.
func (m *MockAutoScaleServiceIface) CreateCounter(p *CreateCounterParams) (*CreateCounterResponse, error) {
	m.ctrl.T.Helper()
	ret := m.ctrl.Call(m, "CreateCounter", p)
	ret0, _ := ret[0].(*CreateCounterResponse)
	ret1, _ := ret[1].(error)
	return ret0, ret1
}

// CreateCounter indicates an expected call of CreateCounter.
func (mr *MockAutoScaleServiceIfaceMockRecorder) CreateCounter(p interface{}) *gomock.Call {
	mr.mock.ctrl.T.Helper()
	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CreateCounter", reflect.TypeOf((*MockAutoScaleServiceIface)(nil).CreateCounter), p)
}

// DeleteAutoScalePolicy mocks base method.
func (m *MockAutoScaleServiceIface) DeleteAutoScalePolicy(p *DeleteAutoScalePolicyParams) (*DeleteAutoScalePolicyResponse, error) {
	m.ctrl.T.Helper()
	ret := m.ctrl.Call(m, "DeleteAutoScalePolicy", p)
	ret0, _ := ret[0].(*DeleteAutoScalePolicyResponse)
	ret1, _ := ret[1].(error)
	return ret0, ret1
}

// DeleteAutoScalePolicy indicates an expected call of DeleteAutoScalePolicy.
func (mr *MockAutoScaleServiceIfaceMockRecorder) DeleteAutoScalePolicy(p interface{}) *gomock.Call {
	mr.mock.ctrl.T.Helper()
	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DeleteAutoScalePolicy", reflect.TypeOf((*MockAutoScaleServiceIface)(nil).DeleteAutoScalePolicy), p)
}

// DeleteAutoScaleVmGroup mocks base method.
func (m *MockAutoScaleServiceIface) DeleteAutoScaleVmGroup(p *DeleteAutoScaleVmGroupParams) (*DeleteAutoScaleVmGroupResponse, error) {
	m.ctrl.T.Helper()
	ret := m.ctrl.Call(m, "DeleteAutoScaleVmGroup", p)
	ret0, _ := ret[0].(*DeleteAutoScaleVmGroupResponse)
	ret1, _ := ret[1].(error)
	return ret0, ret1
}

// DeleteAutoScaleVmGroup indicates an expected call of DeleteAutoScaleVmGroup.
func (mr *MockAutoScaleServiceIfaceMockRecorder) DeleteAutoScaleVmGroup(p interface{}) *gomock.Call {
	mr.mock.ctrl.T.Helper()
	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DeleteAutoScaleVmGroup", reflect.TypeOf((*MockAutoScaleServiceIface)(nil).DeleteAutoScaleVmGroup), p)
}

// DeleteAutoScaleVmProfile mocks base method.
func (m *MockAutoScaleServiceIface) DeleteAutoScaleVmProfile(p *DeleteAutoScaleVmProfileParams) (*DeleteAutoScaleVmProfileResponse, error) {
	m.ctrl.T.Helper()
	ret := m.ctrl.Call(m, "DeleteAutoScaleVmProfile", p)
	ret0, _ := ret[0].(*DeleteAutoScaleVmProfileResponse)
	ret1, _ := ret[1].(error)
	return ret0, ret1
}

// DeleteAutoScaleVmProfile indicates an expected call of DeleteAutoScaleVmProfile.
func (mr *MockAutoScaleServiceIfaceMockRecorder) DeleteAutoScaleVmProfile(p interface{}) *gomock.Call {
	mr.mock.ctrl.T.Helper()
	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DeleteAutoScaleVmProfile", reflect.TypeOf((*MockAutoScaleServiceIface)(nil).DeleteAutoScaleVmProfile), p)
}

// DeleteCondition mocks base method.
func (m *MockAutoScaleServiceIface) DeleteCondition(p *DeleteConditionParams) (*DeleteConditionResponse, error) {
	m.ctrl.T.Helper()
	ret := m.ctrl.Call(m, "DeleteCondition", p)
	ret0, _ := ret[0].(*DeleteConditionResponse)
	ret1, _ := ret[1].(error)
	return ret0, ret1
}

// DeleteCondition indicates an expected call of DeleteCondition.
func (mr *MockAutoScaleServiceIfaceMockRecorder) DeleteCondition(p interface{}) *gomock.Call {
	mr.mock.ctrl.T.Helper()
	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DeleteCondition", reflect.TypeOf((*MockAutoScaleServiceIface)(nil).DeleteCondition), p)
}

// DeleteCounter mocks base method.
func (m *MockAutoScaleServiceIface) DeleteCounter(p *DeleteCounterParams) (*DeleteCounterResponse, error) {
	m.ctrl.T.Helper()
	ret := m.ctrl.Call(m, "DeleteCounter", p)
	ret0, _ := ret[0].(*DeleteCounterResponse)
	ret1, _ := ret[1].(error)
	return ret0, ret1
}

// DeleteCounter indicates an expected call of DeleteCounter.
func (mr *MockAutoScaleServiceIfaceMockRecorder) DeleteCounter(p interface{}) *gomock.Call {
	mr.mock.ctrl.T.Helper()
	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DeleteCounter", reflect.TypeOf((*MockAutoScaleServiceIface)(nil).DeleteCounter), p)
}

// DisableAutoScaleVmGroup mocks base method.
func (m *MockAutoScaleServiceIface) DisableAutoScaleVmGroup(p *DisableAutoScaleVmGroupParams) (*DisableAutoScaleVmGroupResponse, error) {
	m.ctrl.T.Helper()
	ret := m.ctrl.Call(m, "DisableAutoScaleVmGroup", p)
	ret0, _ := ret[0].(*DisableAutoScaleVmGroupResponse)
	ret1, _ := ret[1].(error)
	return ret0, ret1
}

// DisableAutoScaleVmGroup indicates an expected call of DisableAutoScaleVmGroup.
func (mr *MockAutoScaleServiceIfaceMockRecorder) DisableAutoScaleVmGroup(p interface{}) *gomock.Call {
	mr.mock.ctrl.T.Helper()
	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DisableAutoScaleVmGroup", reflect.TypeOf((*MockAutoScaleServiceIface)(nil).DisableAutoScaleVmGroup), p)
}

// EnableAutoScaleVmGroup mocks base method.
func (m *MockAutoScaleServiceIface) EnableAutoScaleVmGroup(p *EnableAutoScaleVmGroupParams) (*EnableAutoScaleVmGroupResponse, error) {
	m.ctrl.T.Helper()
	ret := m.ctrl.Call(m, "EnableAutoScaleVmGroup", p)
	ret0, _ := ret[0].(*EnableAutoScaleVmGroupResponse)
	ret1, _ := ret[1].(error)
	return ret0, ret1
}

// EnableAutoScaleVmGroup indicates an expected call of EnableAutoScaleVmGroup.
func (mr *MockAutoScaleServiceIfaceMockRecorder) EnableAutoScaleVmGroup(p interface{}) *gomock.Call {
	mr.mock.ctrl.T.Helper()
	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "EnableAutoScaleVmGroup", reflect.TypeOf((*MockAutoScaleServiceIface)(nil).EnableAutoScaleVmGroup), p)
}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// ListAutoScalePolicies mocks base method.
func (m *MockAutoScaleServiceIface) ListAutoScalePolicies(p *ListAutoScalePoliciesParams) (*ListAutoScalePoliciesResponse, error) {
	m.ctrl.T.Helper()
	ret := m.ctrl.Call(m, "ListAutoScalePolicies", p)
	ret0, _ := ret[0].(*ListAutoScalePoliciesResponse)
	ret1, _ := ret[1].(error)
	return ret0, ret1
}

// ListAutoScalePolicies indicates an expected call of ListAutoScalePolicies.
func (mr *MockAutoScaleServiceIfaceMockRecorder) ListAutoScalePolicies(p interface{}) *gomock.Call {
	mr.mock.ctrl.T.Helper()
	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ListAutoScalePolicies", reflect.TypeOf((*MockAutoScaleServiceIface)(nil).ListAutoScalePolicies), p)
}

// ListAutoScaleVmGroups mocks base method.
func (m *MockAutoScaleServiceIface) ListAutoScaleVmGroups(p *ListAutoScaleVmGroupsParams) (*ListAutoScaleVmGroupsResponse, error) {
	m.ctrl.T.Helper()
	ret := m.ctrl.Call(m, "ListAutoScaleVmGroups", p)
	ret0, _ := ret[0].(*ListAutoScaleVmGroupsResponse)
	ret1, _ := ret[1].(error)
	return ret0, ret1
}

// ListAutoScaleVmGroups indicates an expected call of ListAutoScaleVmGroups.
func (mr *MockAutoScaleServiceIfaceMockRecorder) ListAutoScaleVmGroups(p interface{}) *gomock.Call {
	mr.mock.ctrl.T.Helper()
	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ListAutoScaleVmGroups", reflect.TypeOf((*MockAutoScaleServiceIface)(nil).ListAutoScaleVmGroups), p)
}

// ListAutoScaleVmProfiles mocks base method.
func (m *MockAutoScaleServiceIface) ListAutoScaleVmProfiles(p *ListAutoScaleVmProfilesParams) (*ListAutoScaleVmProfilesResponse, error) {
	m.ctrl.T.Helper()
	ret := m.ctrl.Call(m, "ListAutoScaleVmProfiles", p)
	ret0, _ := ret[0].(*ListAutoScaleVmProfilesResponse)
	ret1, _ := ret[1].(error)
	return ret0, ret1
}

// ListAutoScaleVmProfiles indicates an expected call of ListAutoScaleVmProfiles.
func (mr *MockAutoScaleServiceIfaceMockRecorder) ListAutoScaleVmProfiles(p interface{}) *gomock.Call {
	mr.mock.ctrl.T.Helper()
	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ListAutoScaleVmProfiles", reflect.TypeOf((*MockAutoScaleServiceIface)(nil).ListAutoScaleVmProfiles), p)
}

// ListConditions mocks base method.
func (m *MockAutoScaleServiceIface) ListConditions(p *ListConditionsParams) (*ListConditionsResponse, error) {
	m.ctrl.T.Helper()
	ret := m.ctrl.Call(m, "ListConditions", p)
	ret0, _ := ret[0].(*ListConditionsResponse)
	ret1, _ := ret[1].(error)
	return ret0, ret1
}

// ListConditions indicates an expected call of ListConditions.
func (mr *MockAutoScaleServiceIfaceMockRecorder) ListConditions(p interface{}) *gomock.Call {
	mr.mock.ctrl.T.Helper()
	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ListConditions", reflect.TypeOf((*MockAutoScaleServiceIface)(nil).ListConditions), p)
}

// ListCounters mocks base method.
func (m *MockAutoScaleServiceIface) ListCounters(p *ListCountersParams) (*ListCountersResponse, error) {
	m.ctrl.T.Helper()
	ret := m.ctrl.Call(m, "ListCounters", p)
	ret0, _ := ret[0].(*ListCountersResponse)
	ret1, _ := ret[1].(error)
	return ret0, ret1
}

// ListCounters indicates an expected call of ListCounters.
func (mr *MockAutoScaleServiceIfaceMockRecorder) ListCounters(p interface{}) *gomock.Call {
	mr.mock.ctrl.T.Helper()
	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ListCounters", reflect.TypeOf((*MockAutoScaleServiceIface)(nil).ListCounters), p)
}

// NewCreateAutoScalePolicyParams mocks base method.
func (m *MockAutoScaleServiceIface) NewCreateAutoScalePolicyParams(action string, conditionids []string, duration int) *CreateAutoScalePolicyParams {
	m.ctrl.T.Helper()
	ret := m.ctrl.Call(m, "NewCreateAutoScalePolicyParams", action, conditionids, duration)
	ret0, _ := ret[0].(*CreateAutoScalePolicyParams)
	return ret0
}

// NewCreateAutoScalePolicyParams indicates an expected call of NewCreateAutoScalePolicyParams.
func (mr *MockAutoScaleServiceIfaceMockRecorder) NewCreateAutoScalePolicyParams(action, conditionids, duration interface{}) *gomock.Call {
	mr.mock.ctrl.T.Helper()
	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "NewCreateAutoScalePolicyParams", reflect.TypeOf((*MockAutoScaleServiceIface)(nil).NewCreateAutoScalePolicyParams), action, conditionids, duration)
}

// NewCreateAutoScaleVmGroupParams mocks base method.
func (m *MockAutoScaleServiceIface) NewCreateAutoScaleVmGroupParams(lbruleid string, maxmembers, minmembers int, scaledownpolicyids, scaleuppolicyids []string, vmprofileid string) *CreateAutoScaleVmGroupParams {
	m.ctrl.T.Helper()
	ret := m.ctrl.Call(m, "NewCreateAutoScaleVmGroupParams", lbruleid, maxmembers, minmembers, scaledownpolicyids, scaleuppolicyids, vmprofileid)
	ret0, _ := ret[0].(*CreateAutoScaleVmGroupParams)
	return ret0
}

// NewCreateAutoScaleVmGroupParams indicates an expected call of NewCreateAutoScaleVmGroupParams.
func (mr *MockAutoScaleServiceIfaceMockRecorder) NewCreateAutoScaleVmGroupParams(lbruleid, maxmembers, minmembers, scaledownpolicyids, scaleuppolicyids, vmprofileid interface{}) *gomock.Call {
	mr.mock.ctrl.T.Helper()
	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "NewCreateAutoScaleVmGroupParams", reflect.TypeOf((*MockAutoScaleServiceIface)(nil).NewCreateAutoScaleVmGroupParams), lbruleid, maxmembers, minmembers, scaledownpolicyids, scaleuppolicyids, vmprofileid)
}

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

// NewCreateAutoScaleVmProfileParams indicates an expected call of NewCreateAutoScaleVmProfileParams.
func (mr *MockAutoScaleServiceIfaceMockRecorder) NewCreateAutoScaleVmProfileParams(serviceofferingid, templateid, zoneid interface{}) *gomock.Call {
	mr.mock.ctrl.T.Helper()
	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "NewCreateAutoScaleVmProfileParams", reflect.TypeOf((*MockAutoScaleServiceIface)(nil).NewCreateAutoScaleVmProfileParams), serviceofferingid, templateid, zoneid)
}

// NewCreateConditionParams mocks base method.
func (m *MockAutoScaleServiceIface) NewCreateConditionParams(counterid, relationaloperator string, threshold int64) *CreateConditionParams {
	m.ctrl.T.Helper()
	ret := m.ctrl.Call(m, "NewCreateConditionParams", counterid, relationaloperator, threshold)
	ret0, _ := ret[0].(*CreateConditionParams)
	return ret0
}

// NewCreateConditionParams indicates an expected call of NewCreateConditionParams.
func (mr *MockAutoScaleServiceIfaceMockRecorder) NewCreateConditionParams(counterid, relationaloperator, threshold interface{}) *gomock.Call {
	mr.mock.ctrl.T.Helper()
	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "NewCreateConditionParams", reflect.TypeOf((*MockAutoScaleServiceIface)(nil).NewCreateConditionParams), counterid, relationaloperator, threshold)
}

// NewCreateCounterParams mocks base method.
func (m *MockAutoScaleServiceIface) NewCreateCounterParams(name, source, value string) *CreateCounterParams {
	m.ctrl.T.Helper()
	ret := m.ctrl.Call(m, "NewCreateCounterParams", name, source, value)
	ret0, _ := ret[0].(*CreateCounterParams)
	return ret0
}

// NewCreateCounterParams indicates an expected call of NewCreateCounterParams.
func (mr *MockAutoScaleServiceIfaceMockRecorder) NewCreateCounterParams(name, source, value interface{}) *gomock.Call {
	mr.mock.ctrl.T.Helper()
	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "NewCreateCounterParams", reflect.TypeOf((*MockAutoScaleServiceIface)(nil).NewCreateCounterParams), name, source, value)
}

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

// NewDeleteAutoScalePolicyParams indicates an expected call of NewDeleteAutoScalePolicyParams.
func (mr *MockAutoScaleServiceIfaceMockRecorder) NewDeleteAutoScalePolicyParams(id interface{}) *gomock.Call {
	mr.mock.ctrl.T.Helper()
	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "NewDeleteAutoScalePolicyParams", reflect.TypeOf((*MockAutoScaleServiceIface)(nil).NewDeleteAutoScalePolicyParams), id)
}

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

// NewDeleteAutoScaleVmGroupParams indicates an expected call of NewDeleteAutoScaleVmGroupParams.
func (mr *MockAutoScaleServiceIfaceMockRecorder) NewDeleteAutoScaleVmGroupParams(id interface{}) *gomock.Call {
	mr.mock.ctrl.T.Helper()
	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "NewDeleteAutoScaleVmGroupParams", reflect.TypeOf((*MockAutoScaleServiceIface)(nil).NewDeleteAutoScaleVmGroupParams), id)
}

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

// NewDeleteAutoScaleVmProfileParams indicates an expected call of NewDeleteAutoScaleVmProfileParams.
func (mr *MockAutoScaleServiceIfaceMockRecorder) NewDeleteAutoScaleVmProfileParams(id interface{}) *gomock.Call {
	mr.mock.ctrl.T.Helper()
	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "NewDeleteAutoScaleVmProfileParams", reflect.TypeOf((*MockAutoScaleServiceIface)(nil).NewDeleteAutoScaleVmProfileParams), id)
}

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

// NewDeleteConditionParams indicates an expected call of NewDeleteConditionParams.
func (mr *MockAutoScaleServiceIfaceMockRecorder) NewDeleteConditionParams(id interface{}) *gomock.Call {
	mr.mock.ctrl.T.Helper()
	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "NewDeleteConditionParams", reflect.TypeOf((*MockAutoScaleServiceIface)(nil).NewDeleteConditionParams), id)
}

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

// NewDeleteCounterParams indicates an expected call of NewDeleteCounterParams.
func (mr *MockAutoScaleServiceIfaceMockRecorder) NewDeleteCounterParams(id interface{}) *gomock.Call {
	mr.mock.ctrl.T.Helper()
	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "NewDeleteCounterParams", reflect.TypeOf((*MockAutoScaleServiceIface)(nil).NewDeleteCounterParams), id)
}

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

// NewDisableAutoScaleVmGroupParams indicates an expected call of NewDisableAutoScaleVmGroupParams.
func (mr *MockAutoScaleServiceIfaceMockRecorder) NewDisableAutoScaleVmGroupParams(id interface{}) *gomock.Call {
	mr.mock.ctrl.T.Helper()
	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "NewDisableAutoScaleVmGroupParams", reflect.TypeOf((*MockAutoScaleServiceIface)(nil).NewDisableAutoScaleVmGroupParams), id)
}

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

// NewEnableAutoScaleVmGroupParams indicates an expected call of NewEnableAutoScaleVmGroupParams.
func (mr *MockAutoScaleServiceIfaceMockRecorder) NewEnableAutoScaleVmGroupParams(id interface{}) *gomock.Call {
	mr.mock.ctrl.T.Helper()
	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "NewEnableAutoScaleVmGroupParams", reflect.TypeOf((*MockAutoScaleServiceIface)(nil).NewEnableAutoScaleVmGroupParams), id)
}

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

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

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

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

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

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

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

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

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

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

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

// NewUpdateAutoScalePolicyParams indicates an expected call of NewUpdateAutoScalePolicyParams.
func (mr *MockAutoScaleServiceIfaceMockRecorder) NewUpdateAutoScalePolicyParams(id interface{}) *gomock.Call {
	mr.mock.ctrl.T.Helper()
	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "NewUpdateAutoScalePolicyParams", reflect.TypeOf((*MockAutoScaleServiceIface)(nil).NewUpdateAutoScalePolicyParams), id)
}

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

// NewUpdateAutoScaleVmGroupParams indicates an expected call of NewUpdateAutoScaleVmGroupParams.
func (mr *MockAutoScaleServiceIfaceMockRecorder) NewUpdateAutoScaleVmGroupParams(id interface{}) *gomock.Call {
	mr.mock.ctrl.T.Helper()
	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "NewUpdateAutoScaleVmGroupParams", reflect.TypeOf((*MockAutoScaleServiceIface)(nil).NewUpdateAutoScaleVmGroupParams), id)
}

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

// NewUpdateAutoScaleVmProfileParams indicates an expected call of NewUpdateAutoScaleVmProfileParams.
func (mr *MockAutoScaleServiceIfaceMockRecorder) NewUpdateAutoScaleVmProfileParams(id interface{}) *gomock.Call {
	mr.mock.ctrl.T.Helper()
	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "NewUpdateAutoScaleVmProfileParams", reflect.TypeOf((*MockAutoScaleServiceIface)(nil).NewUpdateAutoScaleVmProfileParams), id)
}

// UpdateAutoScalePolicy mocks base method.
func (m *MockAutoScaleServiceIface) UpdateAutoScalePolicy(p *UpdateAutoScalePolicyParams) (*UpdateAutoScalePolicyResponse, error) {
	m.ctrl.T.Helper()
	ret := m.ctrl.Call(m, "UpdateAutoScalePolicy", p)
	ret0, _ := ret[0].(*UpdateAutoScalePolicyResponse)
	ret1, _ := ret[1].(error)
	return ret0, ret1
}

// UpdateAutoScalePolicy indicates an expected call of UpdateAutoScalePolicy.
func (mr *MockAutoScaleServiceIfaceMockRecorder) UpdateAutoScalePolicy(p interface{}) *gomock.Call {
	mr.mock.ctrl.T.Helper()
	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UpdateAutoScalePolicy", reflect.TypeOf((*MockAutoScaleServiceIface)(nil).UpdateAutoScalePolicy), p)
}

// UpdateAutoScaleVmGroup mocks base method.
func (m *MockAutoScaleServiceIface) UpdateAutoScaleVmGroup(p *UpdateAutoScaleVmGroupParams) (*UpdateAutoScaleVmGroupResponse, error) {
	m.ctrl.T.Helper()
	ret := m.ctrl.Call(m, "UpdateAutoScaleVmGroup", p)
	ret0, _ := ret[0].(*UpdateAutoScaleVmGroupResponse)
	ret1, _ := ret[1].(error)
	return ret0, ret1
}

// UpdateAutoScaleVmGroup indicates an expected call of UpdateAutoScaleVmGroup.
func (mr *MockAutoScaleServiceIfaceMockRecorder) UpdateAutoScaleVmGroup(p interface{}) *gomock.Call {
	mr.mock.ctrl.T.Helper()
	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UpdateAutoScaleVmGroup", reflect.TypeOf((*MockAutoScaleServiceIface)(nil).UpdateAutoScaleVmGroup), p)
}

// UpdateAutoScaleVmProfile mocks base method.
func (m *MockAutoScaleServiceIface) UpdateAutoScaleVmProfile(p *UpdateAutoScaleVmProfileParams) (*UpdateAutoScaleVmProfileResponse, error) {
	m.ctrl.T.Helper()
	ret := m.ctrl.Call(m, "UpdateAutoScaleVmProfile", p)
	ret0, _ := ret[0].(*UpdateAutoScaleVmProfileResponse)
	ret1, _ := ret[1].(error)
	return ret0, ret1
}

// UpdateAutoScaleVmProfile indicates an expected call of UpdateAutoScaleVmProfile.
func (mr *MockAutoScaleServiceIfaceMockRecorder) UpdateAutoScaleVmProfile(p interface{}) *gomock.Call {
	mr.mock.ctrl.T.Helper()
	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UpdateAutoScaleVmProfile", reflect.TypeOf((*MockAutoScaleServiceIface)(nil).UpdateAutoScaleVmProfile), p)
}
