// Code generated by protoc-gen-go. DO NOT EDIT.
// source: chromiumos/bot_scaling.proto

package chromiumos

import (
	fmt "fmt"
	proto "github.com/golang/protobuf/proto"
	math "math"
)

// Reference imports to suppress errors if they are not otherwise used.
var _ = proto.Marshal
var _ = fmt.Errorf
var _ = math.Inf

// This is a compile-time assertion to ensure that this generated file
// is compatible with the proto package it is being compiled against.
// A compilation error at this line likely means your copy of the
// proto package needs to be updated.
const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package

// Specifies mode for a bot policy
type BotPolicy_Mode int32

const (
	BotPolicy_UNKNOWN_MODE BotPolicy_Mode = 0
	// Collect stats only for a bot group.
	BotPolicy_MONITORED BotPolicy_Mode = 1
	// Generate configuration updates for bot group.
	BotPolicy_CONFIGURED BotPolicy_Mode = 2
)

var BotPolicy_Mode_name = map[int32]string{
	0: "UNKNOWN_MODE",
	1: "MONITORED",
	2: "CONFIGURED",
}

var BotPolicy_Mode_value = map[string]int32{
	"UNKNOWN_MODE": 0,
	"MONITORED":    1,
	"CONFIGURED":   2,
}

func (x BotPolicy_Mode) String() string {
	return proto.EnumName(BotPolicy_Mode_name, int32(x))
}

func (BotPolicy_Mode) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_dbe70eabfd64e7ef, []int{2, 0}
}

// Specifies mode for a bot scaling
type BotPolicy_BotScalingMode int32

const (
	BotPolicy_UNKNOWN_SCALING_MODE BotPolicy_BotScalingMode = 0
	// Scale up or down bots by the step size associated with bot group..
	BotPolicy_STEPPED BotPolicy_BotScalingMode = 1
	// Scale up or down bots by the demand on the bot group.
	// For use on smaller bot groups that are susceptible to smaller increases.
	BotPolicy_DEMAND BotPolicy_BotScalingMode = 2
)

var BotPolicy_BotScalingMode_name = map[int32]string{
	0: "UNKNOWN_SCALING_MODE",
	1: "STEPPED",
	2: "DEMAND",
}

var BotPolicy_BotScalingMode_value = map[string]int32{
	"UNKNOWN_SCALING_MODE": 0,
	"STEPPED":              1,
	"DEMAND":               2,
}

func (x BotPolicy_BotScalingMode) String() string {
	return proto.EnumName(BotPolicy_BotScalingMode_name, int32(x))
}

func (BotPolicy_BotScalingMode) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_dbe70eabfd64e7ef, []int{2, 1}
}

// Specifies if there has been a change since the last iteration.
type ScalingAction_Actionable int32

const (
	ScalingAction_UNSPECIFIED ScalingAction_Actionable = 0
	// There is a change since last time.
	ScalingAction_YES ScalingAction_Actionable = 1
	// There is no change since last time.
	ScalingAction_NO ScalingAction_Actionable = 2
)

var ScalingAction_Actionable_name = map[int32]string{
	0: "UNSPECIFIED",
	1: "YES",
	2: "NO",
}

var ScalingAction_Actionable_value = map[string]int32{
	"UNSPECIFIED": 0,
	"YES":         1,
	"NO":          2,
}

func (x ScalingAction_Actionable) String() string {
	return proto.EnumName(ScalingAction_Actionable_name, int32(x))
}

func (ScalingAction_Actionable) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_dbe70eabfd64e7ef, []int{4, 0}
}

// Defines a type of bot associated with a bot group.
type BotType struct {
	// The string bot "shirt size" to be requested for the group.
	BotSize string `protobuf:"bytes,1,opt,name=bot_size,json=botSize,proto3" json:"bot_size,omitempty"`
	// The number of cores per bot. Will be used to limit quota usage.
	CoresPerBot float32 `protobuf:"fixed32,2,opt,name=cores_per_bot,json=coresPerBot,proto3" json:"cores_per_bot,omitempty"`
	// Estimated hourly cost.
	HourlyCost float32 `protobuf:"fixed32,3,opt,name=hourly_cost,json=hourlyCost,proto3" json:"hourly_cost,omitempty"`
	// Amount of memory in GB allocated to bot.
	MemoryGb             float32  `protobuf:"fixed32,4,opt,name=memory_gb,json=memoryGb,proto3" json:"memory_gb,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *BotType) Reset()         { *m = BotType{} }
func (m *BotType) String() string { return proto.CompactTextString(m) }
func (*BotType) ProtoMessage()    {}
func (*BotType) Descriptor() ([]byte, []int) {
	return fileDescriptor_dbe70eabfd64e7ef, []int{0}
}

func (m *BotType) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_BotType.Unmarshal(m, b)
}
func (m *BotType) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_BotType.Marshal(b, m, deterministic)
}
func (m *BotType) XXX_Merge(src proto.Message) {
	xxx_messageInfo_BotType.Merge(m, src)
}
func (m *BotType) XXX_Size() int {
	return xxx_messageInfo_BotType.Size(m)
}
func (m *BotType) XXX_DiscardUnknown() {
	xxx_messageInfo_BotType.DiscardUnknown(m)
}

var xxx_messageInfo_BotType proto.InternalMessageInfo

func (m *BotType) GetBotSize() string {
	if m != nil {
		return m.BotSize
	}
	return ""
}

func (m *BotType) GetCoresPerBot() float32 {
	if m != nil {
		return m.CoresPerBot
	}
	return 0
}

func (m *BotType) GetHourlyCost() float32 {
	if m != nil {
		return m.HourlyCost
	}
	return 0
}

func (m *BotType) GetMemoryGb() float32 {
	if m != nil {
		return m.MemoryGb
	}
	return 0
}

// Defines Swarming dimensions associated with a bot group.
type SwarmingDimension struct {
	// Dimesion name
	Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
	// Dimension value
	Value string `protobuf:"bytes,2,opt,name=value,proto3" json:"value,omitempty"`
	// Dimension multiple values
	Values               []string `protobuf:"bytes,3,rep,name=values,proto3" json:"values,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *SwarmingDimension) Reset()         { *m = SwarmingDimension{} }
func (m *SwarmingDimension) String() string { return proto.CompactTextString(m) }
func (*SwarmingDimension) ProtoMessage()    {}
func (*SwarmingDimension) Descriptor() ([]byte, []int) {
	return fileDescriptor_dbe70eabfd64e7ef, []int{1}
}

func (m *SwarmingDimension) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_SwarmingDimension.Unmarshal(m, b)
}
func (m *SwarmingDimension) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_SwarmingDimension.Marshal(b, m, deterministic)
}
func (m *SwarmingDimension) XXX_Merge(src proto.Message) {
	xxx_messageInfo_SwarmingDimension.Merge(m, src)
}
func (m *SwarmingDimension) XXX_Size() int {
	return xxx_messageInfo_SwarmingDimension.Size(m)
}
func (m *SwarmingDimension) XXX_DiscardUnknown() {
	xxx_messageInfo_SwarmingDimension.DiscardUnknown(m)
}

var xxx_messageInfo_SwarmingDimension proto.InternalMessageInfo

func (m *SwarmingDimension) GetName() string {
	if m != nil {
		return m.Name
	}
	return ""
}

func (m *SwarmingDimension) GetValue() string {
	if m != nil {
		return m.Value
	}
	return ""
}

func (m *SwarmingDimension) GetValues() []string {
	if m != nil {
		return m.Values
	}
	return nil
}

// Bot Policy to apply to a bot group.
type BotPolicy struct {
	// Bot group controlled by this policy, like, 'cq', 'postsubmit',...
	BotGroup string `protobuf:"bytes,1,opt,name=bot_group,json=botGroup,proto3" json:"bot_group,omitempty"`
	// The type of bot to be requested.
	BotType            *BotType                       `protobuf:"bytes,2,opt,name=bot_type,json=botType,proto3" json:"bot_type,omitempty"`
	ScalingRestriction *BotPolicy_ScalingRestriction  `protobuf:"bytes,3,opt,name=scaling_restriction,json=scalingRestriction,proto3" json:"scaling_restriction,omitempty"`
	RegionRestrictions []*BotPolicy_RegionRestriction `protobuf:"bytes,4,rep,name=region_restrictions,json=regionRestrictions,proto3" json:"region_restrictions,omitempty"`
	// A set of dimensions used to validate current Swarming allocations.
	SwarmingDimensions []*SwarmingDimension `protobuf:"bytes,5,rep,name=swarming_dimensions,json=swarmingDimensions,proto3" json:"swarming_dimensions,omitempty"`
	// Set whether a bot group should be configured or only monitored.
	PolicyMode BotPolicy_Mode `protobuf:"varint,6,opt,name=policy_mode,json=policyMode,proto3,enum=chromiumos.BotPolicy_Mode" json:"policy_mode,omitempty"`
	// Number of hours to lookback for Swarming stats.
	LookbackHours int32 `protobuf:"zigzag32,7,opt,name=lookback_hours,json=lookbackHours,proto3" json:"lookback_hours,omitempty"`
	// Set the scaling approach for the bot group being monitored.
	ScalingMode BotPolicy_BotScalingMode `protobuf:"varint,8,opt,name=scaling_mode,json=scalingMode,proto3,enum=chromiumos.BotPolicy_BotScalingMode" json:"scaling_mode,omitempty"`
	// Swarming instance name:  chromeos-swarming.appspot.com
	SwarmingInstance     string   `protobuf:"bytes,9,opt,name=swarming_instance,json=swarmingInstance,proto3" json:"swarming_instance,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *BotPolicy) Reset()         { *m = BotPolicy{} }
func (m *BotPolicy) String() string { return proto.CompactTextString(m) }
func (*BotPolicy) ProtoMessage()    {}
func (*BotPolicy) Descriptor() ([]byte, []int) {
	return fileDescriptor_dbe70eabfd64e7ef, []int{2}
}

func (m *BotPolicy) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_BotPolicy.Unmarshal(m, b)
}
func (m *BotPolicy) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_BotPolicy.Marshal(b, m, deterministic)
}
func (m *BotPolicy) XXX_Merge(src proto.Message) {
	xxx_messageInfo_BotPolicy.Merge(m, src)
}
func (m *BotPolicy) XXX_Size() int {
	return xxx_messageInfo_BotPolicy.Size(m)
}
func (m *BotPolicy) XXX_DiscardUnknown() {
	xxx_messageInfo_BotPolicy.DiscardUnknown(m)
}

var xxx_messageInfo_BotPolicy proto.InternalMessageInfo

func (m *BotPolicy) GetBotGroup() string {
	if m != nil {
		return m.BotGroup
	}
	return ""
}

func (m *BotPolicy) GetBotType() *BotType {
	if m != nil {
		return m.BotType
	}
	return nil
}

func (m *BotPolicy) GetScalingRestriction() *BotPolicy_ScalingRestriction {
	if m != nil {
		return m.ScalingRestriction
	}
	return nil
}

func (m *BotPolicy) GetRegionRestrictions() []*BotPolicy_RegionRestriction {
	if m != nil {
		return m.RegionRestrictions
	}
	return nil
}

func (m *BotPolicy) GetSwarmingDimensions() []*SwarmingDimension {
	if m != nil {
		return m.SwarmingDimensions
	}
	return nil
}

func (m *BotPolicy) GetPolicyMode() BotPolicy_Mode {
	if m != nil {
		return m.PolicyMode
	}
	return BotPolicy_UNKNOWN_MODE
}

func (m *BotPolicy) GetLookbackHours() int32 {
	if m != nil {
		return m.LookbackHours
	}
	return 0
}

func (m *BotPolicy) GetScalingMode() BotPolicy_BotScalingMode {
	if m != nil {
		return m.ScalingMode
	}
	return BotPolicy_UNKNOWN_SCALING_MODE
}

func (m *BotPolicy) GetSwarmingInstance() string {
	if m != nil {
		return m.SwarmingInstance
	}
	return ""
}

// Scaling restriction specifies the limits on how the group can be
// expanded or reduced.
type BotPolicy_ScalingRestriction struct {
	// Hard limit on the maximum number of bots to request.
	BotCeiling int32 `protobuf:"varint,1,opt,name=bot_ceiling,json=botCeiling,proto3" json:"bot_ceiling,omitempty"`
	// Hard limit on the minimum number of bots to request.
	BotFloor int32 `protobuf:"varint,2,opt,name=bot_floor,json=botFloor,proto3" json:"bot_floor,omitempty"`
	// Soft limit on the number of idle bots to maintain.
	MinIdle int32 `protobuf:"varint,3,opt,name=min_idle,json=minIdle,proto3" json:"min_idle,omitempty"`
	// Hard minimum limit on the absolute delta between request amount and
	// existing bot count.
	StepSize int32 `protobuf:"varint,4,opt,name=step_size,json=stepSize,proto3" json:"step_size,omitempty"`
	// Static number to request when demand is not accessible.
	BotFallback          int32    `protobuf:"varint,5,opt,name=bot_fallback,json=botFallback,proto3" json:"bot_fallback,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *BotPolicy_ScalingRestriction) Reset()         { *m = BotPolicy_ScalingRestriction{} }
func (m *BotPolicy_ScalingRestriction) String() string { return proto.CompactTextString(m) }
func (*BotPolicy_ScalingRestriction) ProtoMessage()    {}
func (*BotPolicy_ScalingRestriction) Descriptor() ([]byte, []int) {
	return fileDescriptor_dbe70eabfd64e7ef, []int{2, 0}
}

func (m *BotPolicy_ScalingRestriction) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_BotPolicy_ScalingRestriction.Unmarshal(m, b)
}
func (m *BotPolicy_ScalingRestriction) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_BotPolicy_ScalingRestriction.Marshal(b, m, deterministic)
}
func (m *BotPolicy_ScalingRestriction) XXX_Merge(src proto.Message) {
	xxx_messageInfo_BotPolicy_ScalingRestriction.Merge(m, src)
}
func (m *BotPolicy_ScalingRestriction) XXX_Size() int {
	return xxx_messageInfo_BotPolicy_ScalingRestriction.Size(m)
}
func (m *BotPolicy_ScalingRestriction) XXX_DiscardUnknown() {
	xxx_messageInfo_BotPolicy_ScalingRestriction.DiscardUnknown(m)
}

var xxx_messageInfo_BotPolicy_ScalingRestriction proto.InternalMessageInfo

func (m *BotPolicy_ScalingRestriction) GetBotCeiling() int32 {
	if m != nil {
		return m.BotCeiling
	}
	return 0
}

func (m *BotPolicy_ScalingRestriction) GetBotFloor() int32 {
	if m != nil {
		return m.BotFloor
	}
	return 0
}

func (m *BotPolicy_ScalingRestriction) GetMinIdle() int32 {
	if m != nil {
		return m.MinIdle
	}
	return 0
}

func (m *BotPolicy_ScalingRestriction) GetStepSize() int32 {
	if m != nil {
		return m.StepSize
	}
	return 0
}

func (m *BotPolicy_ScalingRestriction) GetBotFallback() int32 {
	if m != nil {
		return m.BotFallback
	}
	return 0
}

// A set of restrictions on the regions and how to distribute bots
// between them.
type BotPolicy_RegionRestriction struct {
	// Region of the bot sub-group.
	Region string `protobuf:"bytes,1,opt,name=region,proto3" json:"region,omitempty"`
	// Specific prefix of the bot sub-group.
	Prefix string `protobuf:"bytes,2,opt,name=prefix,proto3" json:"prefix,omitempty"`
	// Weight to be applied to this sub-group. The number of bots requested
	// from each region will be proportional to the weight unless a
	// quota limit is violated.
	Weight               float32  `protobuf:"fixed32,3,opt,name=weight,proto3" json:"weight,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *BotPolicy_RegionRestriction) Reset()         { *m = BotPolicy_RegionRestriction{} }
func (m *BotPolicy_RegionRestriction) String() string { return proto.CompactTextString(m) }
func (*BotPolicy_RegionRestriction) ProtoMessage()    {}
func (*BotPolicy_RegionRestriction) Descriptor() ([]byte, []int) {
	return fileDescriptor_dbe70eabfd64e7ef, []int{2, 1}
}

func (m *BotPolicy_RegionRestriction) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_BotPolicy_RegionRestriction.Unmarshal(m, b)
}
func (m *BotPolicy_RegionRestriction) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_BotPolicy_RegionRestriction.Marshal(b, m, deterministic)
}
func (m *BotPolicy_RegionRestriction) XXX_Merge(src proto.Message) {
	xxx_messageInfo_BotPolicy_RegionRestriction.Merge(m, src)
}
func (m *BotPolicy_RegionRestriction) XXX_Size() int {
	return xxx_messageInfo_BotPolicy_RegionRestriction.Size(m)
}
func (m *BotPolicy_RegionRestriction) XXX_DiscardUnknown() {
	xxx_messageInfo_BotPolicy_RegionRestriction.DiscardUnknown(m)
}

var xxx_messageInfo_BotPolicy_RegionRestriction proto.InternalMessageInfo

func (m *BotPolicy_RegionRestriction) GetRegion() string {
	if m != nil {
		return m.Region
	}
	return ""
}

func (m *BotPolicy_RegionRestriction) GetPrefix() string {
	if m != nil {
		return m.Prefix
	}
	return ""
}

func (m *BotPolicy_RegionRestriction) GetWeight() float32 {
	if m != nil {
		return m.Weight
	}
	return 0
}

// Configures the root message.
type BotPolicyCfg struct {
	// All bot policies.
	BotPolicies          []*BotPolicy `protobuf:"bytes,1,rep,name=bot_policies,json=botPolicies,proto3" json:"bot_policies,omitempty"`
	XXX_NoUnkeyedLiteral struct{}     `json:"-"`
	XXX_unrecognized     []byte       `json:"-"`
	XXX_sizecache        int32        `json:"-"`
}

func (m *BotPolicyCfg) Reset()         { *m = BotPolicyCfg{} }
func (m *BotPolicyCfg) String() string { return proto.CompactTextString(m) }
func (*BotPolicyCfg) ProtoMessage()    {}
func (*BotPolicyCfg) Descriptor() ([]byte, []int) {
	return fileDescriptor_dbe70eabfd64e7ef, []int{3}
}

func (m *BotPolicyCfg) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_BotPolicyCfg.Unmarshal(m, b)
}
func (m *BotPolicyCfg) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_BotPolicyCfg.Marshal(b, m, deterministic)
}
func (m *BotPolicyCfg) XXX_Merge(src proto.Message) {
	xxx_messageInfo_BotPolicyCfg.Merge(m, src)
}
func (m *BotPolicyCfg) XXX_Size() int {
	return xxx_messageInfo_BotPolicyCfg.Size(m)
}
func (m *BotPolicyCfg) XXX_DiscardUnknown() {
	xxx_messageInfo_BotPolicyCfg.DiscardUnknown(m)
}

var xxx_messageInfo_BotPolicyCfg proto.InternalMessageInfo

func (m *BotPolicyCfg) GetBotPolicies() []*BotPolicy {
	if m != nil {
		return m.BotPolicies
	}
	return nil
}

// Scaling Action that resulted because of bot demand.
type ScalingAction struct {
	// Bot group modified by the action. Should be the same as BotPolicy.
	BotGroup string `protobuf:"bytes,1,opt,name=bot_group,json=botGroup,proto3" json:"bot_group,omitempty"`
	// The type of bot requested. Should be the same as BotPolicy.
	BotType *BotType `protobuf:"bytes,2,opt,name=bot_type,json=botType,proto3" json:"bot_type,omitempty"`
	// Whether there has been a change in the number of bots requested
	// for this bot group. See step_size for more info.
	Actionable ScalingAction_Actionable `protobuf:"varint,3,opt,name=actionable,proto3,enum=chromiumos.ScalingAction_Actionable" json:"actionable,omitempty"`
	// Total number of bots requested for the group.
	BotsRequested   int32                           `protobuf:"varint,4,opt,name=bots_requested,json=botsRequested,proto3" json:"bots_requested,omitempty"`
	RegionalActions []*ScalingAction_RegionalAction `protobuf:"bytes,5,rep,name=regional_actions,json=regionalActions,proto3" json:"regional_actions,omitempty"`
	// Estimated savings based on current run.
	// Based on current number of bots compared against the max.
	EstimatedSavings float32 `protobuf:"fixed32,6,opt,name=estimated_savings,json=estimatedSavings,proto3" json:"estimated_savings,omitempty"`
	// Minimum number of bots to keep alive for bot group.
	// Repeated for display/reporting purposes
	BotMin int32 `protobuf:"varint,7,opt,name=bot_min,json=botMin,proto3" json:"bot_min,omitempty"`
	// Hard limit on the maximum number of bots that can be requested.
	// Repeated for display/reporting purposes
	BotMax               int32    `protobuf:"varint,8,opt,name=bot_max,json=botMax,proto3" json:"bot_max,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *ScalingAction) Reset()         { *m = ScalingAction{} }
func (m *ScalingAction) String() string { return proto.CompactTextString(m) }
func (*ScalingAction) ProtoMessage()    {}
func (*ScalingAction) Descriptor() ([]byte, []int) {
	return fileDescriptor_dbe70eabfd64e7ef, []int{4}
}

func (m *ScalingAction) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_ScalingAction.Unmarshal(m, b)
}
func (m *ScalingAction) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_ScalingAction.Marshal(b, m, deterministic)
}
func (m *ScalingAction) XXX_Merge(src proto.Message) {
	xxx_messageInfo_ScalingAction.Merge(m, src)
}
func (m *ScalingAction) XXX_Size() int {
	return xxx_messageInfo_ScalingAction.Size(m)
}
func (m *ScalingAction) XXX_DiscardUnknown() {
	xxx_messageInfo_ScalingAction.DiscardUnknown(m)
}

var xxx_messageInfo_ScalingAction proto.InternalMessageInfo

func (m *ScalingAction) GetBotGroup() string {
	if m != nil {
		return m.BotGroup
	}
	return ""
}

func (m *ScalingAction) GetBotType() *BotType {
	if m != nil {
		return m.BotType
	}
	return nil
}

func (m *ScalingAction) GetActionable() ScalingAction_Actionable {
	if m != nil {
		return m.Actionable
	}
	return ScalingAction_UNSPECIFIED
}

func (m *ScalingAction) GetBotsRequested() int32 {
	if m != nil {
		return m.BotsRequested
	}
	return 0
}

func (m *ScalingAction) GetRegionalActions() []*ScalingAction_RegionalAction {
	if m != nil {
		return m.RegionalActions
	}
	return nil
}

func (m *ScalingAction) GetEstimatedSavings() float32 {
	if m != nil {
		return m.EstimatedSavings
	}
	return 0
}

func (m *ScalingAction) GetBotMin() int32 {
	if m != nil {
		return m.BotMin
	}
	return 0
}

func (m *ScalingAction) GetBotMax() int32 {
	if m != nil {
		return m.BotMax
	}
	return 0
}

// How the bot requests are distributed between regions & prefixes.
type ScalingAction_RegionalAction struct {
	// Region of the bot sub-group.
	Region string `protobuf:"bytes,1,opt,name=region,proto3" json:"region,omitempty"`
	// Specific prefix of the bot sub-group.
	Prefix string `protobuf:"bytes,2,opt,name=prefix,proto3" json:"prefix,omitempty"`
	// Number of bots requested from the sub-group.
	BotsRequested        int32    `protobuf:"varint,3,opt,name=bots_requested,json=botsRequested,proto3" json:"bots_requested,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *ScalingAction_RegionalAction) Reset()         { *m = ScalingAction_RegionalAction{} }
func (m *ScalingAction_RegionalAction) String() string { return proto.CompactTextString(m) }
func (*ScalingAction_RegionalAction) ProtoMessage()    {}
func (*ScalingAction_RegionalAction) Descriptor() ([]byte, []int) {
	return fileDescriptor_dbe70eabfd64e7ef, []int{4, 0}
}

func (m *ScalingAction_RegionalAction) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_ScalingAction_RegionalAction.Unmarshal(m, b)
}
func (m *ScalingAction_RegionalAction) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_ScalingAction_RegionalAction.Marshal(b, m, deterministic)
}
func (m *ScalingAction_RegionalAction) XXX_Merge(src proto.Message) {
	xxx_messageInfo_ScalingAction_RegionalAction.Merge(m, src)
}
func (m *ScalingAction_RegionalAction) XXX_Size() int {
	return xxx_messageInfo_ScalingAction_RegionalAction.Size(m)
}
func (m *ScalingAction_RegionalAction) XXX_DiscardUnknown() {
	xxx_messageInfo_ScalingAction_RegionalAction.DiscardUnknown(m)
}

var xxx_messageInfo_ScalingAction_RegionalAction proto.InternalMessageInfo

func (m *ScalingAction_RegionalAction) GetRegion() string {
	if m != nil {
		return m.Region
	}
	return ""
}

func (m *ScalingAction_RegionalAction) GetPrefix() string {
	if m != nil {
		return m.Prefix
	}
	return ""
}

func (m *ScalingAction_RegionalAction) GetBotsRequested() int32 {
	if m != nil {
		return m.BotsRequested
	}
	return 0
}

// Resource utilization based on regional assignment.
type ResourceUtilization struct {
	// Region of the bot sub-group.
	Region string `protobuf:"bytes,1,opt,name=region,proto3" json:"region,omitempty"`
	// Number of VMs allocated across all bot groups.
	Vms int32 `protobuf:"varint,2,opt,name=vms,proto3" json:"vms,omitempty"`
	// Number of CPUs allocated across all bot groups.
	Cpus float32 `protobuf:"fixed32,3,opt,name=cpus,proto3" json:"cpus,omitempty"`
	// Amount of memory in GB allocated across all bot groups.
	MemoryGb float32 `protobuf:"fixed32,4,opt,name=memory_gb,json=memoryGb,proto3" json:"memory_gb,omitempty"`
	// Amount of disk in GB allocated across all bot groups.
	DiskGb float32 `protobuf:"fixed32,5,opt,name=disk_gb,json=diskGb,proto3" json:"disk_gb,omitempty"`
	// NUmber of CPUs that could be allocated based on max values.
	MaxCpus              float32  `protobuf:"fixed32,6,opt,name=max_cpus,json=maxCpus,proto3" json:"max_cpus,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *ResourceUtilization) Reset()         { *m = ResourceUtilization{} }
func (m *ResourceUtilization) String() string { return proto.CompactTextString(m) }
func (*ResourceUtilization) ProtoMessage()    {}
func (*ResourceUtilization) Descriptor() ([]byte, []int) {
	return fileDescriptor_dbe70eabfd64e7ef, []int{5}
}

func (m *ResourceUtilization) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_ResourceUtilization.Unmarshal(m, b)
}
func (m *ResourceUtilization) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_ResourceUtilization.Marshal(b, m, deterministic)
}
func (m *ResourceUtilization) XXX_Merge(src proto.Message) {
	xxx_messageInfo_ResourceUtilization.Merge(m, src)
}
func (m *ResourceUtilization) XXX_Size() int {
	return xxx_messageInfo_ResourceUtilization.Size(m)
}
func (m *ResourceUtilization) XXX_DiscardUnknown() {
	xxx_messageInfo_ResourceUtilization.DiscardUnknown(m)
}

var xxx_messageInfo_ResourceUtilization proto.InternalMessageInfo

func (m *ResourceUtilization) GetRegion() string {
	if m != nil {
		return m.Region
	}
	return ""
}

func (m *ResourceUtilization) GetVms() int32 {
	if m != nil {
		return m.Vms
	}
	return 0
}

func (m *ResourceUtilization) GetCpus() float32 {
	if m != nil {
		return m.Cpus
	}
	return 0
}

func (m *ResourceUtilization) GetMemoryGb() float32 {
	if m != nil {
		return m.MemoryGb
	}
	return 0
}

func (m *ResourceUtilization) GetDiskGb() float32 {
	if m != nil {
		return m.DiskGb
	}
	return 0
}

func (m *ResourceUtilization) GetMaxCpus() float32 {
	if m != nil {
		return m.MaxCpus
	}
	return 0
}

// All the actions that will be executed by RoboCrop.
type RoboCropAction struct {
	// List of an action per bot group scaled by RoboCrop.
	ScalingActions       []*ScalingAction       `protobuf:"bytes,1,rep,name=scaling_actions,json=scalingActions,proto3" json:"scaling_actions,omitempty"`
	ResourceUtilization  []*ResourceUtilization `protobuf:"bytes,2,rep,name=resource_utilization,json=resourceUtilization,proto3" json:"resource_utilization,omitempty"`
	XXX_NoUnkeyedLiteral struct{}               `json:"-"`
	XXX_unrecognized     []byte                 `json:"-"`
	XXX_sizecache        int32                  `json:"-"`
}

func (m *RoboCropAction) Reset()         { *m = RoboCropAction{} }
func (m *RoboCropAction) String() string { return proto.CompactTextString(m) }
func (*RoboCropAction) ProtoMessage()    {}
func (*RoboCropAction) Descriptor() ([]byte, []int) {
	return fileDescriptor_dbe70eabfd64e7ef, []int{6}
}

func (m *RoboCropAction) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_RoboCropAction.Unmarshal(m, b)
}
func (m *RoboCropAction) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_RoboCropAction.Marshal(b, m, deterministic)
}
func (m *RoboCropAction) XXX_Merge(src proto.Message) {
	xxx_messageInfo_RoboCropAction.Merge(m, src)
}
func (m *RoboCropAction) XXX_Size() int {
	return xxx_messageInfo_RoboCropAction.Size(m)
}
func (m *RoboCropAction) XXX_DiscardUnknown() {
	xxx_messageInfo_RoboCropAction.DiscardUnknown(m)
}

var xxx_messageInfo_RoboCropAction proto.InternalMessageInfo

func (m *RoboCropAction) GetScalingActions() []*ScalingAction {
	if m != nil {
		return m.ScalingActions
	}
	return nil
}

func (m *RoboCropAction) GetResourceUtilization() []*ResourceUtilization {
	if m != nil {
		return m.ResourceUtilization
	}
	return nil
}

func init() {
	proto.RegisterEnum("chromiumos.BotPolicy_Mode", BotPolicy_Mode_name, BotPolicy_Mode_value)
	proto.RegisterEnum("chromiumos.BotPolicy_BotScalingMode", BotPolicy_BotScalingMode_name, BotPolicy_BotScalingMode_value)
	proto.RegisterEnum("chromiumos.ScalingAction_Actionable", ScalingAction_Actionable_name, ScalingAction_Actionable_value)
	proto.RegisterType((*BotType)(nil), "chromiumos.BotType")
	proto.RegisterType((*SwarmingDimension)(nil), "chromiumos.SwarmingDimension")
	proto.RegisterType((*BotPolicy)(nil), "chromiumos.BotPolicy")
	proto.RegisterType((*BotPolicy_ScalingRestriction)(nil), "chromiumos.BotPolicy.ScalingRestriction")
	proto.RegisterType((*BotPolicy_RegionRestriction)(nil), "chromiumos.BotPolicy.RegionRestriction")
	proto.RegisterType((*BotPolicyCfg)(nil), "chromiumos.BotPolicyCfg")
	proto.RegisterType((*ScalingAction)(nil), "chromiumos.ScalingAction")
	proto.RegisterType((*ScalingAction_RegionalAction)(nil), "chromiumos.ScalingAction.RegionalAction")
	proto.RegisterType((*ResourceUtilization)(nil), "chromiumos.ResourceUtilization")
	proto.RegisterType((*RoboCropAction)(nil), "chromiumos.RoboCropAction")
}

func init() { proto.RegisterFile("chromiumos/bot_scaling.proto", fileDescriptor_dbe70eabfd64e7ef) }

var fileDescriptor_dbe70eabfd64e7ef = []byte{
	// 1026 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x56, 0xdd, 0x6e, 0x2b, 0x35,
	0x17, 0x3d, 0x93, 0xdf, 0x66, 0xa7, 0x4d, 0x53, 0xa7, 0xdf, 0xc7, 0x9c, 0x02, 0x3a, 0x21, 0x02,
	0x11, 0x09, 0x29, 0x95, 0x0a, 0x02, 0x24, 0xae, 0x9a, 0x9f, 0xe6, 0x44, 0xd0, 0x24, 0x72, 0x5a,
	0xc1, 0x81, 0x8b, 0xd1, 0xcc, 0xc4, 0x9d, 0x5a, 0x9d, 0x19, 0x0f, 0xb6, 0xd3, 0xd3, 0xf6, 0x01,
	0x78, 0x04, 0x9e, 0x80, 0x0b, 0x6e, 0x78, 0x09, 0x9e, 0x0c, 0xd9, 0xe3, 0xc9, 0x4f, 0x93, 0x73,
	0x24, 0x24, 0xee, 0xbc, 0xd7, 0xb6, 0xb7, 0xf7, 0x5e, 0x5e, 0x6b, 0x12, 0xf8, 0xc8, 0xbf, 0xe5,
	0x2c, 0xa2, 0x8b, 0x88, 0x89, 0x53, 0x8f, 0x49, 0x47, 0xf8, 0x6e, 0x48, 0xe3, 0xa0, 0x93, 0x70,
	0x26, 0x19, 0x82, 0x55, 0xb6, 0xf5, 0x9b, 0x05, 0xe5, 0x2e, 0x93, 0x57, 0x8f, 0x09, 0x41, 0x2f,
	0x61, 0x4f, 0x6f, 0xa6, 0x4f, 0xc4, 0xb6, 0x9a, 0x56, 0xbb, 0x82, 0xcb, 0x1e, 0x93, 0x33, 0xfa,
	0x44, 0x50, 0x0b, 0x0e, 0x7c, 0xc6, 0x89, 0x70, 0x12, 0xc2, 0x1d, 0x8f, 0x49, 0x3b, 0xd7, 0xb4,
	0xda, 0x39, 0x5c, 0xd5, 0xe0, 0x94, 0xf0, 0x2e, 0x93, 0xe8, 0x15, 0x54, 0x6f, 0xd9, 0x82, 0x87,
	0x8f, 0x8e, 0xcf, 0x84, 0xb4, 0xf3, 0x7a, 0x07, 0xa4, 0x50, 0x8f, 0x09, 0x89, 0x3e, 0x84, 0x4a,
	0x44, 0x22, 0xc6, 0x1f, 0x9d, 0xc0, 0xb3, 0x0b, 0x3a, 0xbd, 0x97, 0x02, 0x43, 0xaf, 0x75, 0x0d,
	0x47, 0xb3, 0xb7, 0x2e, 0x8f, 0x68, 0x1c, 0xf4, 0x69, 0x44, 0x62, 0x41, 0x59, 0x8c, 0x10, 0x14,
	0x62, 0x37, 0xca, 0xba, 0xd1, 0x6b, 0x74, 0x0c, 0xc5, 0x7b, 0x37, 0x5c, 0x10, 0xdd, 0x42, 0x05,
	0xa7, 0x01, 0xfa, 0x3f, 0x94, 0xf4, 0x42, 0xd8, 0xf9, 0x66, 0xbe, 0x5d, 0xc1, 0x26, 0x6a, 0xfd,
	0x5d, 0x86, 0x4a, 0x97, 0xc9, 0x29, 0x0b, 0xa9, 0xff, 0xa8, 0x3a, 0x50, 0x13, 0x06, 0x9c, 0x2d,
	0x12, 0x53, 0x54, 0x8d, 0x3c, 0x54, 0x31, 0xea, 0xa4, 0xe3, 0xcb, 0xc7, 0x24, 0xad, 0x5d, 0x3d,
	0x6b, 0x74, 0x56, 0x4c, 0x75, 0x0c, 0x4b, 0x9a, 0x13, 0x4d, 0xd7, 0x1b, 0x68, 0x18, 0x5e, 0x1d,
	0x4e, 0x84, 0xe4, 0xd4, 0x97, 0x94, 0xc5, 0x7a, 0xee, 0xea, 0x59, 0xfb, 0xd9, 0xd1, 0xb4, 0x81,
	0xce, 0x2c, 0x3d, 0x80, 0x57, 0xfb, 0x31, 0x12, 0x5b, 0x18, 0xfa, 0x09, 0x1a, 0x9c, 0x04, 0x94,
	0xc5, 0xeb, 0x95, 0x85, 0x5d, 0x68, 0xe6, 0xdb, 0xd5, 0xb3, 0xcf, 0x77, 0x97, 0xc6, 0xfa, 0xc0,
	0x46, 0x65, 0xfe, 0x1c, 0x12, 0x68, 0x0c, 0x0d, 0x61, 0x68, 0x76, 0xe6, 0x19, 0xcf, 0xc2, 0x2e,
	0xea, 0xca, 0x1f, 0xaf, 0x57, 0xde, 0x7a, 0x0d, 0x8c, 0xc4, 0x73, 0x48, 0xa0, 0xef, 0xa0, 0x9a,
	0xe8, 0xfb, 0x9d, 0x88, 0xcd, 0x89, 0x5d, 0x6a, 0x5a, 0xed, 0xda, 0xd9, 0xc9, 0xee, 0x0e, 0x2f,
	0xd9, 0x9c, 0x60, 0x48, 0xb7, 0xab, 0x35, 0xfa, 0x0c, 0x6a, 0x21, 0x63, 0x77, 0x9e, 0xeb, 0xdf,
	0x39, 0x4a, 0x27, 0xc2, 0x2e, 0x37, 0xad, 0xf6, 0x11, 0x3e, 0xc8, 0xd0, 0xd7, 0x0a, 0x44, 0x43,
	0xd8, 0xcf, 0x88, 0xd6, 0x97, 0xec, 0xe9, 0x4b, 0x3e, 0xdd, 0x7d, 0x49, 0x97, 0x49, 0x43, 0xb2,
	0xbe, 0xae, 0x2a, 0x56, 0x01, 0xfa, 0x02, 0x8e, 0x96, 0xc3, 0xd3, 0x58, 0x48, 0x37, 0xf6, 0x89,
	0x5d, 0xd1, 0x32, 0xa8, 0x67, 0x89, 0x91, 0xc1, 0x4f, 0xfe, 0xb2, 0x00, 0x6d, 0x3f, 0x97, 0x52,
	0xb9, 0x52, 0x89, 0x4f, 0xa8, 0xca, 0x68, 0x11, 0x15, 0x31, 0x78, 0x4c, 0xf6, 0x52, 0x24, 0xd3,
	0xd8, 0x4d, 0xc8, 0x18, 0xd7, 0x3a, 0x2a, 0x6a, 0x8d, 0x5d, 0xa8, 0x58, 0x59, 0x2c, 0xa2, 0xb1,
	0x43, 0xe7, 0x21, 0xd1, 0x42, 0x29, 0xe2, 0x72, 0x44, 0xe3, 0xd1, 0x3c, 0x24, 0xea, 0x9c, 0x90,
	0x24, 0x49, 0xed, 0x57, 0x48, 0xcf, 0x29, 0x40, 0xfb, 0xef, 0x13, 0xd8, 0xd7, 0x45, 0xdd, 0x30,
	0x54, 0xbc, 0xd8, 0x45, 0x9d, 0x57, 0x9d, 0x5c, 0x18, 0xe8, 0xe4, 0x17, 0x38, 0xda, 0x92, 0x80,
	0xb2, 0x45, 0x2a, 0x02, 0xa3, 0x76, 0x13, 0x29, 0x3c, 0xe1, 0xe4, 0x86, 0x3e, 0x18, 0x17, 0x99,
	0x48, 0xe1, 0x6f, 0x09, 0x0d, 0x6e, 0x33, 0xfb, 0x9a, 0xa8, 0xf5, 0x0d, 0x14, 0x34, 0x83, 0x75,
	0xd8, 0xbf, 0x1e, 0x7f, 0x3f, 0x9e, 0xfc, 0x38, 0x76, 0x2e, 0x27, 0xfd, 0x41, 0xfd, 0x05, 0x3a,
	0x80, 0xca, 0xe5, 0x64, 0x3c, 0xba, 0x9a, 0xe0, 0x41, 0xbf, 0x6e, 0xa1, 0x1a, 0x40, 0x6f, 0x32,
	0xbe, 0x18, 0x0d, 0xaf, 0x55, 0x9c, 0x6b, 0xf5, 0xa0, 0xb6, 0xf9, 0x22, 0xc8, 0x86, 0xe3, 0xac,
	0xc4, 0xac, 0x77, 0xfe, 0xc3, 0x68, 0x3c, 0xcc, 0x4a, 0x55, 0xa1, 0x3c, 0xbb, 0x1a, 0x4c, 0xa7,
	0xba, 0x10, 0x40, 0xa9, 0x3f, 0xb8, 0x3c, 0x1f, 0xab, 0x22, 0xaf, 0x61, 0x7f, 0xf9, 0xc0, 0xbd,
	0x9b, 0x00, 0x7d, 0x9b, 0xb2, 0xa1, 0x95, 0x44, 0x89, 0xb0, 0x2d, 0xad, 0xde, 0xff, 0xed, 0x14,
	0x84, 0x26, 0x69, 0x6a, 0x76, 0xb6, 0x7e, 0x2f, 0xc0, 0x81, 0x69, 0xe6, 0x3c, 0x65, 0xe8, 0x3f,
	0xfd, 0x24, 0xf4, 0x01, 0x5c, 0x5d, 0xd6, 0xf5, 0xcc, 0x03, 0x3f, 0xd3, 0xe9, 0xc6, 0xdd, 0x9d,
	0xf3, 0xe5, 0x5e, 0xbc, 0x76, 0x4e, 0xd9, 0xc2, 0x63, 0x52, 0x38, 0x9c, 0xfc, 0xba, 0x20, 0x42,
	0x92, 0xb9, 0x91, 0xc3, 0x81, 0x42, 0x71, 0x06, 0xa2, 0x19, 0xd4, 0xd3, 0xd7, 0x74, 0x43, 0xc7,
	0x35, 0x5f, 0x88, 0xd4, 0xc7, 0xed, 0x77, 0x5f, 0x89, 0xcd, 0x89, 0x34, 0xc4, 0x87, 0x7c, 0x23,
	0x16, 0xca, 0x22, 0x44, 0x48, 0x1a, 0xb9, 0x92, 0xcc, 0x1d, 0xe1, 0xde, 0xd3, 0x38, 0x10, 0xda,
	0xd5, 0x39, 0x5c, 0x5f, 0x26, 0x66, 0x29, 0x8e, 0x3e, 0x00, 0x35, 0xb9, 0x13, 0xd1, 0x58, 0x1b,
	0xb7, 0x88, 0x4b, 0x1e, 0x93, 0x97, 0x34, 0x5e, 0x26, 0xdc, 0x07, 0x6d, 0x56, 0x93, 0x70, 0x1f,
	0x4e, 0x02, 0xa8, 0x6d, 0x76, 0xf0, 0xaf, 0x15, 0xba, 0x4d, 0x4e, 0x7e, 0x07, 0x39, 0xad, 0x0e,
	0xc0, 0x8a, 0x5d, 0x74, 0x08, 0xd5, 0xeb, 0xf1, 0x6c, 0x3a, 0xe8, 0x8d, 0x2e, 0x46, 0x83, 0x7e,
	0xfd, 0x05, 0x2a, 0x43, 0xfe, 0xcd, 0x60, 0x56, 0xb7, 0x50, 0x09, 0x72, 0xe3, 0x49, 0x3d, 0xd7,
	0xfa, 0xc3, 0x82, 0x06, 0x26, 0x82, 0x2d, 0xb8, 0x4f, 0xae, 0x25, 0x0d, 0xe9, 0x93, 0xfb, 0xde,
	0xf6, 0xea, 0x90, 0xbf, 0x8f, 0x84, 0xf1, 0xb7, 0x5a, 0xaa, 0xdf, 0x2a, 0x3f, 0x59, 0x08, 0x63,
	0x1c, 0xbd, 0x7e, 0xef, 0x2f, 0x9e, 0x22, 0x69, 0x4e, 0xc5, 0x9d, 0x4a, 0x15, 0x53, 0xb3, 0xa9,
	0x70, 0xe8, 0xe9, 0x8f, 0x84, 0xfb, 0xe0, 0xe8, 0x6a, 0x29, 0xf5, 0xe5, 0xc8, 0x7d, 0xe8, 0x25,
	0x0b, 0xd1, 0xfa, 0xd3, 0x82, 0x1a, 0x66, 0x1e, 0xeb, 0x71, 0x96, 0x18, 0x02, 0xbb, 0x70, 0x98,
	0x7d, 0x1d, 0x33, 0x15, 0xa4, 0x7e, 0x78, 0xf9, 0x4e, 0x15, 0xe0, 0x9a, 0x58, 0x0f, 0x05, 0xc2,
	0x70, 0xcc, 0xcd, 0xf0, 0xce, 0x62, 0x35, 0xbd, 0x9d, 0xd3, 0x85, 0x5e, 0xad, 0x17, 0xda, 0x41,
	0x12, 0x6e, 0xf0, 0x6d, 0xb0, 0xfb, 0xf5, 0xcf, 0x5f, 0x05, 0x6c, 0x79, 0xb2, 0xc3, 0x78, 0x70,
	0xba, 0xf6, 0xaf, 0x84, 0xc6, 0x37, 0xdc, 0x3d, 0xd5, 0xff, 0x47, 0x4e, 0x03, 0xb6, 0x96, 0xf1,
	0x4a, 0x1a, 0xfc, 0xf2, 0x9f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x07, 0xae, 0x68, 0x82, 0xc4, 0x08,
	0x00, 0x00,
}
