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

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

import (
	reflect "reflect"

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

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

// 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 any) *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 any) *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 any) *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 any) *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 any) *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 any) *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 any) *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 any) *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 any) *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 any) *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 any) *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 any) *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 := []any{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 any, opts ...any) *gomock.Call {
	mr.mock.ctrl.T.Helper()
	varargs := append([]any{id}, opts...)
	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetAutoScalePolicyByID", reflect.TypeOf((*MockAutoScaleServiceIface)(nil).GetAutoScalePolicyByID), varargs...)
}

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

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

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

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

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

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

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

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

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

// GetAutoScaleVmProfileByID mocks base method.
func (m *MockAutoScaleServiceIface) GetAutoScaleVmProfileByID(id string, opts ...OptionFunc) (*AutoScaleVmProfile, int, error) {
	m.ctrl.T.Helper()
	varargs := []any{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 any, opts ...any) *gomock.Call {
	mr.mock.ctrl.T.Helper()
	varargs := append([]any{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 := []any{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 any, opts ...any) *gomock.Call {
	mr.mock.ctrl.T.Helper()
	varargs := append([]any{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 := []any{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 any, opts ...any) *gomock.Call {
	mr.mock.ctrl.T.Helper()
	varargs := append([]any{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 := []any{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 any, opts ...any) *gomock.Call {
	mr.mock.ctrl.T.Helper()
	varargs := append([]any{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 := []any{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 any, opts ...any) *gomock.Call {
	mr.mock.ctrl.T.Helper()
	varargs := append([]any{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 any) *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 any) *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 any) *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 any) *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 any) *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 any) *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 any) *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 any) *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 any) *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, provider, source, value string) *CreateCounterParams {
	m.ctrl.T.Helper()
	ret := m.ctrl.Call(m, "NewCreateCounterParams", name, provider, source, value)
	ret0, _ := ret[0].(*CreateCounterParams)
	return ret0
}

// NewCreateCounterParams indicates an expected call of NewCreateCounterParams.
func (mr *MockAutoScaleServiceIfaceMockRecorder) NewCreateCounterParams(name, provider, source, value any) *gomock.Call {
	mr.mock.ctrl.T.Helper()
	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "NewCreateCounterParams", reflect.TypeOf((*MockAutoScaleServiceIface)(nil).NewCreateCounterParams), name, provider, 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 any) *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 any) *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 any) *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 any) *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 any) *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 any) *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 any) *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 any) *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 any) *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 any) *gomock.Call {
	mr.mock.ctrl.T.Helper()
	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "NewUpdateAutoScaleVmProfileParams", reflect.TypeOf((*MockAutoScaleServiceIface)(nil).NewUpdateAutoScaleVmProfileParams), id)
}

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

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

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

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

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