// Code generated by protoc-gen-go. DO NOT EDIT.
// versions:
// 	protoc-gen-go v1.25.0-devel
// 	protoc        v3.6.1
// source: cycler/config.proto

package cycler

import (
	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
	reflect "reflect"
	sync "sync"
)

const (
	// Verify that this generated code is sufficiently up-to-date.
	_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
	// Verify that runtime/protoimpl is sufficiently up-to-date.
	_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
)

// Closure of all config for a single cycler run.
type RunConfig struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// The runlog configuration.
	RunLogConfiguration *RunLogConfiguration `protobuf:"bytes,1,opt,name=run_log_configuration,json=runLogConfiguration,proto3" json:"run_log_configuration,omitempty"`
	// The stats configuration for the prefix and the action statistics.
	StatsConfiguration *StatsConfiguration `protobuf:"bytes,2,opt,name=stats_configuration,json=statsConfiguration,proto3" json:"stats_configuration,omitempty"`
	// Policy effect configuration.
	PolicyEffectConfiguration *PolicyEffectConfiguration `protobuf:"bytes,3,opt,name=policy_effect_configuration,json=policyEffectConfiguration,proto3" json:"policy_effect_configuration,omitempty"`
	// Must match the command line argument and policy effect as well.
	MutationAllowed bool `protobuf:"varint,4,opt,name=mutation_allowed,json=mutationAllowed,proto3" json:"mutation_allowed,omitempty"`
	// The bucket to operate on (can be overridden on the command line).
	Bucket string `protobuf:"bytes,5,opt,name=bucket,proto3" json:"bucket,omitempty"`
}

func (x *RunConfig) Reset() {
	*x = RunConfig{}
	if protoimpl.UnsafeEnabled {
		mi := &file_cycler_config_proto_msgTypes[0]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *RunConfig) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*RunConfig) ProtoMessage() {}

func (x *RunConfig) ProtoReflect() protoreflect.Message {
	mi := &file_cycler_config_proto_msgTypes[0]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use RunConfig.ProtoReflect.Descriptor instead.
func (*RunConfig) Descriptor() ([]byte, []int) {
	return file_cycler_config_proto_rawDescGZIP(), []int{0}
}

func (x *RunConfig) GetRunLogConfiguration() *RunLogConfiguration {
	if x != nil {
		return x.RunLogConfiguration
	}
	return nil
}

func (x *RunConfig) GetStatsConfiguration() *StatsConfiguration {
	if x != nil {
		return x.StatsConfiguration
	}
	return nil
}

func (x *RunConfig) GetPolicyEffectConfiguration() *PolicyEffectConfiguration {
	if x != nil {
		return x.PolicyEffectConfiguration
	}
	return nil
}

func (x *RunConfig) GetMutationAllowed() bool {
	if x != nil {
		return x.MutationAllowed
	}
	return false
}

func (x *RunConfig) GetBucket() string {
	if x != nil {
		return x.Bucket
	}
	return ""
}

// Options for the log generation during a cycler run.
type RunLogConfiguration struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// The destination url 'directory' for the logs, can be file:// or gs://.
	DestinationUrl string `protobuf:"bytes,1,opt,name=destination_url,json=destinationUrl,proto3" json:"destination_url,omitempty"`
	// The rough chunk size in bytes to deliver the logs in (before compression).
	ChunkSizeBytes int64 `protobuf:"varint,2,opt,name=chunk_size_bytes,json=chunkSizeBytes,proto3" json:"chunk_size_bytes,omitempty"`
	// How many outstanding log messages can we have before blocking producers.
	ChannelSize int64 `protobuf:"varint,3,opt,name=channel_size,json=channelSize,proto3" json:"channel_size,omitempty"`
	// How many retries we should make to persist logs.
	PersistRetries int64 `protobuf:"varint,4,opt,name=persist_retries,json=persistRetries,proto3" json:"persist_retries,omitempty"`
	// How many logs we'll allow to fail persistence and still continue.
	// Since we do log shipping in goroutines this is also the cap on the number
	// of those.
	MaxUnpersistedLogs int64 `protobuf:"varint,5,opt,name=max_unpersisted_logs,json=maxUnpersistedLogs,proto3" json:"max_unpersisted_logs,omitempty"`
}

func (x *RunLogConfiguration) Reset() {
	*x = RunLogConfiguration{}
	if protoimpl.UnsafeEnabled {
		mi := &file_cycler_config_proto_msgTypes[1]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *RunLogConfiguration) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*RunLogConfiguration) ProtoMessage() {}

func (x *RunLogConfiguration) ProtoReflect() protoreflect.Message {
	mi := &file_cycler_config_proto_msgTypes[1]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use RunLogConfiguration.ProtoReflect.Descriptor instead.
func (*RunLogConfiguration) Descriptor() ([]byte, []int) {
	return file_cycler_config_proto_rawDescGZIP(), []int{1}
}

func (x *RunLogConfiguration) GetDestinationUrl() string {
	if x != nil {
		return x.DestinationUrl
	}
	return ""
}

func (x *RunLogConfiguration) GetChunkSizeBytes() int64 {
	if x != nil {
		return x.ChunkSizeBytes
	}
	return 0
}

func (x *RunLogConfiguration) GetChannelSize() int64 {
	if x != nil {
		return x.ChannelSize
	}
	return 0
}

func (x *RunLogConfiguration) GetPersistRetries() int64 {
	if x != nil {
		return x.PersistRetries
	}
	return 0
}

func (x *RunLogConfiguration) GetMaxUnpersistedLogs() int64 {
	if x != nil {
		return x.MaxUnpersistedLogs
	}
	return 0
}

// Options provided to any run providing stats.
type StatsConfiguration struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// When generating a report for a prefix, how deep should the breakdown be.
	PrefixReportMaxDepth int64 `protobuf:"varint,1,opt,name=prefix_report_max_depth,json=prefixReportMaxDepth,proto3" json:"prefix_report_max_depth,omitempty"`
	// Histogram options for the objects ages.
	AgeDaysHistogramOptions *HistogramOptions `protobuf:"bytes,2,opt,name=age_days_histogram_options,json=ageDaysHistogramOptions,proto3" json:"age_days_histogram_options,omitempty"`
	// Histogram options for the objects sizes.
	SizeBytesHistogramOptions *HistogramOptions `protobuf:"bytes,3,opt,name=size_bytes_histogram_options,json=sizeBytesHistogramOptions,proto3" json:"size_bytes_histogram_options,omitempty"`
}

func (x *StatsConfiguration) Reset() {
	*x = StatsConfiguration{}
	if protoimpl.UnsafeEnabled {
		mi := &file_cycler_config_proto_msgTypes[2]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *StatsConfiguration) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*StatsConfiguration) ProtoMessage() {}

func (x *StatsConfiguration) ProtoReflect() protoreflect.Message {
	mi := &file_cycler_config_proto_msgTypes[2]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use StatsConfiguration.ProtoReflect.Descriptor instead.
func (*StatsConfiguration) Descriptor() ([]byte, []int) {
	return file_cycler_config_proto_rawDescGZIP(), []int{2}
}

func (x *StatsConfiguration) GetPrefixReportMaxDepth() int64 {
	if x != nil {
		return x.PrefixReportMaxDepth
	}
	return 0
}

func (x *StatsConfiguration) GetAgeDaysHistogramOptions() *HistogramOptions {
	if x != nil {
		return x.AgeDaysHistogramOptions
	}
	return nil
}

func (x *StatsConfiguration) GetSizeBytesHistogramOptions() *HistogramOptions {
	if x != nil {
		return x.SizeBytesHistogramOptions
	}
	return nil
}

// Options for the Histogram generation during a cycler run.
// See definition in: "google.golang.org/grpc/benchmark/stats"
type HistogramOptions struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// The number of unique buckets in the histrogram.
	NumBuckets int32 `protobuf:"varint,1,opt,name=num_buckets,json=numBuckets,proto3" json:"num_buckets,omitempty"`
	// The growth factor of each bucket to the next.
	GrowthFactor float64 `protobuf:"fixed64,2,opt,name=growth_factor,json=growthFactor,proto3" json:"growth_factor,omitempty"`
	// The base bucket's size.
	BaseBucketSize float64 `protobuf:"fixed64,3,opt,name=base_bucket_size,json=baseBucketSize,proto3" json:"base_bucket_size,omitempty"`
	// The minimum valued bucket's value.
	MinValue int64 `protobuf:"varint,4,opt,name=min_value,json=minValue,proto3" json:"min_value,omitempty"`
}

func (x *HistogramOptions) Reset() {
	*x = HistogramOptions{}
	if protoimpl.UnsafeEnabled {
		mi := &file_cycler_config_proto_msgTypes[3]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *HistogramOptions) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*HistogramOptions) ProtoMessage() {}

func (x *HistogramOptions) ProtoReflect() protoreflect.Message {
	mi := &file_cycler_config_proto_msgTypes[3]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use HistogramOptions.ProtoReflect.Descriptor instead.
func (*HistogramOptions) Descriptor() ([]byte, []int) {
	return file_cycler_config_proto_rawDescGZIP(), []int{3}
}

func (x *HistogramOptions) GetNumBuckets() int32 {
	if x != nil {
		return x.NumBuckets
	}
	return 0
}

func (x *HistogramOptions) GetGrowthFactor() float64 {
	if x != nil {
		return x.GrowthFactor
	}
	return 0
}

func (x *HistogramOptions) GetBaseBucketSize() float64 {
	if x != nil {
		return x.BaseBucketSize
	}
	return 0
}

func (x *HistogramOptions) GetMinValue() int64 {
	if x != nil {
		return x.MinValue
	}
	return 0
}

// A policy effect configuration defines the policy and the resulting effect.
type PolicyEffectConfiguration struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// The effect configuration must be one of the following configs.
	//
	// Types that are assignable to EffectConfiguration:
	//	*PolicyEffectConfiguration_Noop
	//	*PolicyEffectConfiguration_Move
	//	*PolicyEffectConfiguration_Chill
	//	*PolicyEffectConfiguration_Duplicate
	//	*PolicyEffectConfiguration_Delete
	EffectConfiguration isPolicyEffectConfiguration_EffectConfiguration `protobuf_oneof:"effect_configuration"`
	// The policy document to be parsed by rego and executed to determine if an
	// effect is going to be taken upon the object.
	PolicyDocumentPath string `protobuf:"bytes,5,opt,name=policy_document_path,json=policyDocumentPath,proto3" json:"policy_document_path,omitempty"`
	// Constrain the prefix iterators to paths that match the following go regexp.
	PrefixRegexp string `protobuf:"bytes,6,opt,name=prefix_regexp,json=prefixRegexp,proto3" json:"prefix_regexp,omitempty"`
}

func (x *PolicyEffectConfiguration) Reset() {
	*x = PolicyEffectConfiguration{}
	if protoimpl.UnsafeEnabled {
		mi := &file_cycler_config_proto_msgTypes[4]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *PolicyEffectConfiguration) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*PolicyEffectConfiguration) ProtoMessage() {}

func (x *PolicyEffectConfiguration) ProtoReflect() protoreflect.Message {
	mi := &file_cycler_config_proto_msgTypes[4]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use PolicyEffectConfiguration.ProtoReflect.Descriptor instead.
func (*PolicyEffectConfiguration) Descriptor() ([]byte, []int) {
	return file_cycler_config_proto_rawDescGZIP(), []int{4}
}

func (m *PolicyEffectConfiguration) GetEffectConfiguration() isPolicyEffectConfiguration_EffectConfiguration {
	if m != nil {
		return m.EffectConfiguration
	}
	return nil
}

func (x *PolicyEffectConfiguration) GetNoop() *NoopEffectConfiguration {
	if x, ok := x.GetEffectConfiguration().(*PolicyEffectConfiguration_Noop); ok {
		return x.Noop
	}
	return nil
}

func (x *PolicyEffectConfiguration) GetMove() *MoveEffectConfiguration {
	if x, ok := x.GetEffectConfiguration().(*PolicyEffectConfiguration_Move); ok {
		return x.Move
	}
	return nil
}

func (x *PolicyEffectConfiguration) GetChill() *ChillEffectConfiguration {
	if x, ok := x.GetEffectConfiguration().(*PolicyEffectConfiguration_Chill); ok {
		return x.Chill
	}
	return nil
}

func (x *PolicyEffectConfiguration) GetDuplicate() *DuplicateEffectConfiguration {
	if x, ok := x.GetEffectConfiguration().(*PolicyEffectConfiguration_Duplicate); ok {
		return x.Duplicate
	}
	return nil
}

func (x *PolicyEffectConfiguration) GetDelete() *DeleteEffectConfiguration {
	if x, ok := x.GetEffectConfiguration().(*PolicyEffectConfiguration_Delete); ok {
		return x.Delete
	}
	return nil
}

func (x *PolicyEffectConfiguration) GetPolicyDocumentPath() string {
	if x != nil {
		return x.PolicyDocumentPath
	}
	return ""
}

func (x *PolicyEffectConfiguration) GetPrefixRegexp() string {
	if x != nil {
		return x.PrefixRegexp
	}
	return ""
}

type isPolicyEffectConfiguration_EffectConfiguration interface {
	isPolicyEffectConfiguration_EffectConfiguration()
}

type PolicyEffectConfiguration_Noop struct {
	// Do nothing, will still gather stats.
	Noop *NoopEffectConfiguration `protobuf:"bytes,1,opt,name=noop,proto3,oneof"`
}

type PolicyEffectConfiguration_Move struct {
	// Move the object to another location (same bucket or another).
	Move *MoveEffectConfiguration `protobuf:"bytes,2,opt,name=move,proto3,oneof"`
}

type PolicyEffectConfiguration_Chill struct {
	// Change the storage class of the objects.
	Chill *ChillEffectConfiguration `protobuf:"bytes,3,opt,name=chill,proto3,oneof"`
}

type PolicyEffectConfiguration_Duplicate struct {
	// Duplicate the object to another location (same bucket or another).
	Duplicate *DuplicateEffectConfiguration `protobuf:"bytes,4,opt,name=duplicate,proto3,oneof"`
}

type PolicyEffectConfiguration_Delete struct {
	// Delete the object.
	Delete *DeleteEffectConfiguration `protobuf:"bytes,7,opt,name=delete,proto3,oneof"`
}

func (*PolicyEffectConfiguration_Noop) isPolicyEffectConfiguration_EffectConfiguration() {}

func (*PolicyEffectConfiguration_Move) isPolicyEffectConfiguration_EffectConfiguration() {}

func (*PolicyEffectConfiguration_Chill) isPolicyEffectConfiguration_EffectConfiguration() {}

func (*PolicyEffectConfiguration_Duplicate) isPolicyEffectConfiguration_EffectConfiguration() {}

func (*PolicyEffectConfiguration_Delete) isPolicyEffectConfiguration_EffectConfiguration() {}

var File_cycler_config_proto protoreflect.FileDescriptor

var file_cycler_config_proto_rawDesc = []byte{
	0x0a, 0x13, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x72, 0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e,
	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x06, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x72, 0x1a, 0x13, 0x63,
	0x79, 0x63, 0x6c, 0x65, 0x72, 0x2f, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x2e, 0x70, 0x72, 0x6f,
	0x74, 0x6f, 0x22, 0xcf, 0x02, 0x0a, 0x09, 0x52, 0x75, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67,
	0x12, 0x4f, 0x0a, 0x15, 0x72, 0x75, 0x6e, 0x5f, 0x6c, 0x6f, 0x67, 0x5f, 0x63, 0x6f, 0x6e, 0x66,
	0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32,
	0x1b, 0x2e, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x72, 0x2e, 0x52, 0x75, 0x6e, 0x4c, 0x6f, 0x67, 0x43,
	0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x13, 0x72, 0x75,
	0x6e, 0x4c, 0x6f, 0x67, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f,
	0x6e, 0x12, 0x4b, 0x0a, 0x13, 0x73, 0x74, 0x61, 0x74, 0x73, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69,
	0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a,
	0x2e, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x72, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x73, 0x43, 0x6f, 0x6e,
	0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x12, 0x73, 0x74, 0x61, 0x74,
	0x73, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x61,
	0x0a, 0x1b, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x5f,
	0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20,
	0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x72, 0x2e, 0x50, 0x6f, 0x6c,
	0x69, 0x63, 0x79, 0x45, 0x66, 0x66, 0x65, 0x63, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75,
	0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x19, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x45, 0x66,
	0x66, 0x65, 0x63, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f,
	0x6e, 0x12, 0x29, 0x0a, 0x10, 0x6d, 0x75, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x61, 0x6c,
	0x6c, 0x6f, 0x77, 0x65, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x6d, 0x75, 0x74,
	0x61, 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x12, 0x16, 0x0a, 0x06,
	0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x62, 0x75,
	0x63, 0x6b, 0x65, 0x74, 0x22, 0xe6, 0x01, 0x0a, 0x13, 0x52, 0x75, 0x6e, 0x4c, 0x6f, 0x67, 0x43,
	0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x27, 0x0a, 0x0f,
	0x64, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x75, 0x72, 0x6c, 0x18,
	0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x64, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69,
	0x6f, 0x6e, 0x55, 0x72, 0x6c, 0x12, 0x28, 0x0a, 0x10, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x5f, 0x73,
	0x69, 0x7a, 0x65, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52,
	0x0e, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x53, 0x69, 0x7a, 0x65, 0x42, 0x79, 0x74, 0x65, 0x73, 0x12,
	0x21, 0x0a, 0x0c, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18,
	0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x53, 0x69,
	0x7a, 0x65, 0x12, 0x27, 0x0a, 0x0f, 0x70, 0x65, 0x72, 0x73, 0x69, 0x73, 0x74, 0x5f, 0x72, 0x65,
	0x74, 0x72, 0x69, 0x65, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0e, 0x70, 0x65, 0x72,
	0x73, 0x69, 0x73, 0x74, 0x52, 0x65, 0x74, 0x72, 0x69, 0x65, 0x73, 0x12, 0x30, 0x0a, 0x14, 0x6d,
	0x61, 0x78, 0x5f, 0x75, 0x6e, 0x70, 0x65, 0x72, 0x73, 0x69, 0x73, 0x74, 0x65, 0x64, 0x5f, 0x6c,
	0x6f, 0x67, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x12, 0x6d, 0x61, 0x78, 0x55, 0x6e,
	0x70, 0x65, 0x72, 0x73, 0x69, 0x73, 0x74, 0x65, 0x64, 0x4c, 0x6f, 0x67, 0x73, 0x22, 0xfd, 0x01,
	0x0a, 0x12, 0x53, 0x74, 0x61, 0x74, 0x73, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61,
	0x74, 0x69, 0x6f, 0x6e, 0x12, 0x35, 0x0a, 0x17, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x5f, 0x72,
	0x65, 0x70, 0x6f, 0x72, 0x74, 0x5f, 0x6d, 0x61, 0x78, 0x5f, 0x64, 0x65, 0x70, 0x74, 0x68, 0x18,
	0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x14, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x52, 0x65, 0x70,
	0x6f, 0x72, 0x74, 0x4d, 0x61, 0x78, 0x44, 0x65, 0x70, 0x74, 0x68, 0x12, 0x55, 0x0a, 0x1a, 0x61,
	0x67, 0x65, 0x5f, 0x64, 0x61, 0x79, 0x73, 0x5f, 0x68, 0x69, 0x73, 0x74, 0x6f, 0x67, 0x72, 0x61,
	0x6d, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32,
	0x18, 0x2e, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x72, 0x2e, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x67, 0x72,
	0x61, 0x6d, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x17, 0x61, 0x67, 0x65, 0x44, 0x61,
	0x79, 0x73, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x4f, 0x70, 0x74, 0x69, 0x6f,
	0x6e, 0x73, 0x12, 0x59, 0x0a, 0x1c, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73,
	0x5f, 0x68, 0x69, 0x73, 0x74, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f,
	0x6e, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x63, 0x79, 0x63, 0x6c, 0x65,
	0x72, 0x2e, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x4f, 0x70, 0x74, 0x69, 0x6f,
	0x6e, 0x73, 0x52, 0x19, 0x73, 0x69, 0x7a, 0x65, 0x42, 0x79, 0x74, 0x65, 0x73, 0x48, 0x69, 0x73,
	0x74, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x9f, 0x01,
	0x0a, 0x10, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x4f, 0x70, 0x74, 0x69, 0x6f,
	0x6e, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x6e, 0x75, 0x6d, 0x5f, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74,
	0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x6e, 0x75, 0x6d, 0x42, 0x75, 0x63, 0x6b,
	0x65, 0x74, 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x67, 0x72, 0x6f, 0x77, 0x74, 0x68, 0x5f, 0x66, 0x61,
	0x63, 0x74, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0c, 0x67, 0x72, 0x6f, 0x77,
	0x74, 0x68, 0x46, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x28, 0x0a, 0x10, 0x62, 0x61, 0x73, 0x65,
	0x5f, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x03, 0x20, 0x01,
	0x28, 0x01, 0x52, 0x0e, 0x62, 0x61, 0x73, 0x65, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x53, 0x69,
	0x7a, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x6d, 0x69, 0x6e, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18,
	0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x6d, 0x69, 0x6e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x22,
	0xb5, 0x03, 0x0a, 0x19, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x45, 0x66, 0x66, 0x65, 0x63, 0x74,
	0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x35, 0x0a,
	0x04, 0x6e, 0x6f, 0x6f, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x63, 0x79,
	0x63, 0x6c, 0x65, 0x72, 0x2e, 0x4e, 0x6f, 0x6f, 0x70, 0x45, 0x66, 0x66, 0x65, 0x63, 0x74, 0x43,
	0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x00, 0x52, 0x04,
	0x6e, 0x6f, 0x6f, 0x70, 0x12, 0x35, 0x0a, 0x04, 0x6d, 0x6f, 0x76, 0x65, 0x18, 0x02, 0x20, 0x01,
	0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x72, 0x2e, 0x4d, 0x6f, 0x76, 0x65,
	0x45, 0x66, 0x66, 0x65, 0x63, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74,
	0x69, 0x6f, 0x6e, 0x48, 0x00, 0x52, 0x04, 0x6d, 0x6f, 0x76, 0x65, 0x12, 0x38, 0x0a, 0x05, 0x63,
	0x68, 0x69, 0x6c, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x63, 0x79, 0x63,
	0x6c, 0x65, 0x72, 0x2e, 0x43, 0x68, 0x69, 0x6c, 0x6c, 0x45, 0x66, 0x66, 0x65, 0x63, 0x74, 0x43,
	0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x00, 0x52, 0x05,
	0x63, 0x68, 0x69, 0x6c, 0x6c, 0x12, 0x44, 0x0a, 0x09, 0x64, 0x75, 0x70, 0x6c, 0x69, 0x63, 0x61,
	0x74, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x63, 0x79, 0x63, 0x6c, 0x65,
	0x72, 0x2e, 0x44, 0x75, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x65, 0x45, 0x66, 0x66, 0x65, 0x63,
	0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x00,
	0x52, 0x09, 0x64, 0x75, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x65, 0x12, 0x3b, 0x0a, 0x06, 0x64,
	0x65, 0x6c, 0x65, 0x74, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x63, 0x79,
	0x63, 0x6c, 0x65, 0x72, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x45, 0x66, 0x66, 0x65, 0x63,
	0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x00,
	0x52, 0x06, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x30, 0x0a, 0x14, 0x70, 0x6f, 0x6c, 0x69,
	0x63, 0x79, 0x5f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x70, 0x61, 0x74, 0x68,
	0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x44, 0x6f,
	0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x61, 0x74, 0x68, 0x12, 0x23, 0x0a, 0x0d, 0x70, 0x72,
	0x65, 0x66, 0x69, 0x78, 0x5f, 0x72, 0x65, 0x67, 0x65, 0x78, 0x70, 0x18, 0x06, 0x20, 0x01, 0x28,
	0x09, 0x52, 0x0c, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x52, 0x65, 0x67, 0x65, 0x78, 0x70, 0x42,
	0x16, 0x0a, 0x14, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67,
	0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x32, 0x5a, 0x30, 0x67, 0x6f, 0x2e, 0x63, 0x68,
	0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x63, 0x68, 0x72, 0x6f, 0x6d,
	0x69, 0x75, 0x6d, 0x6f, 0x73, 0x2f, 0x69, 0x6e, 0x66, 0x72, 0x61, 0x2f, 0x70, 0x72, 0x6f, 0x74,
	0x6f, 0x2f, 0x67, 0x6f, 0x2f, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x72, 0x62, 0x06, 0x70, 0x72, 0x6f,
	0x74, 0x6f, 0x33,
}

var (
	file_cycler_config_proto_rawDescOnce sync.Once
	file_cycler_config_proto_rawDescData = file_cycler_config_proto_rawDesc
)

func file_cycler_config_proto_rawDescGZIP() []byte {
	file_cycler_config_proto_rawDescOnce.Do(func() {
		file_cycler_config_proto_rawDescData = protoimpl.X.CompressGZIP(file_cycler_config_proto_rawDescData)
	})
	return file_cycler_config_proto_rawDescData
}

var file_cycler_config_proto_msgTypes = make([]protoimpl.MessageInfo, 5)
var file_cycler_config_proto_goTypes = []interface{}{
	(*RunConfig)(nil),                    // 0: cycler.RunConfig
	(*RunLogConfiguration)(nil),          // 1: cycler.RunLogConfiguration
	(*StatsConfiguration)(nil),           // 2: cycler.StatsConfiguration
	(*HistogramOptions)(nil),             // 3: cycler.HistogramOptions
	(*PolicyEffectConfiguration)(nil),    // 4: cycler.PolicyEffectConfiguration
	(*NoopEffectConfiguration)(nil),      // 5: cycler.NoopEffectConfiguration
	(*MoveEffectConfiguration)(nil),      // 6: cycler.MoveEffectConfiguration
	(*ChillEffectConfiguration)(nil),     // 7: cycler.ChillEffectConfiguration
	(*DuplicateEffectConfiguration)(nil), // 8: cycler.DuplicateEffectConfiguration
	(*DeleteEffectConfiguration)(nil),    // 9: cycler.DeleteEffectConfiguration
}
var file_cycler_config_proto_depIdxs = []int32{
	1,  // 0: cycler.RunConfig.run_log_configuration:type_name -> cycler.RunLogConfiguration
	2,  // 1: cycler.RunConfig.stats_configuration:type_name -> cycler.StatsConfiguration
	4,  // 2: cycler.RunConfig.policy_effect_configuration:type_name -> cycler.PolicyEffectConfiguration
	3,  // 3: cycler.StatsConfiguration.age_days_histogram_options:type_name -> cycler.HistogramOptions
	3,  // 4: cycler.StatsConfiguration.size_bytes_histogram_options:type_name -> cycler.HistogramOptions
	5,  // 5: cycler.PolicyEffectConfiguration.noop:type_name -> cycler.NoopEffectConfiguration
	6,  // 6: cycler.PolicyEffectConfiguration.move:type_name -> cycler.MoveEffectConfiguration
	7,  // 7: cycler.PolicyEffectConfiguration.chill:type_name -> cycler.ChillEffectConfiguration
	8,  // 8: cycler.PolicyEffectConfiguration.duplicate:type_name -> cycler.DuplicateEffectConfiguration
	9,  // 9: cycler.PolicyEffectConfiguration.delete:type_name -> cycler.DeleteEffectConfiguration
	10, // [10:10] is the sub-list for method output_type
	10, // [10:10] is the sub-list for method input_type
	10, // [10:10] is the sub-list for extension type_name
	10, // [10:10] is the sub-list for extension extendee
	0,  // [0:10] is the sub-list for field type_name
}

func init() { file_cycler_config_proto_init() }
func file_cycler_config_proto_init() {
	if File_cycler_config_proto != nil {
		return
	}
	file_cycler_effect_proto_init()
	if !protoimpl.UnsafeEnabled {
		file_cycler_config_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*RunConfig); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_cycler_config_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*RunLogConfiguration); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_cycler_config_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*StatsConfiguration); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_cycler_config_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*HistogramOptions); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_cycler_config_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*PolicyEffectConfiguration); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
	}
	file_cycler_config_proto_msgTypes[4].OneofWrappers = []interface{}{
		(*PolicyEffectConfiguration_Noop)(nil),
		(*PolicyEffectConfiguration_Move)(nil),
		(*PolicyEffectConfiguration_Chill)(nil),
		(*PolicyEffectConfiguration_Duplicate)(nil),
		(*PolicyEffectConfiguration_Delete)(nil),
	}
	type x struct{}
	out := protoimpl.TypeBuilder{
		File: protoimpl.DescBuilder{
			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
			RawDescriptor: file_cycler_config_proto_rawDesc,
			NumEnums:      0,
			NumMessages:   5,
			NumExtensions: 0,
			NumServices:   0,
		},
		GoTypes:           file_cycler_config_proto_goTypes,
		DependencyIndexes: file_cycler_config_proto_depIdxs,
		MessageInfos:      file_cycler_config_proto_msgTypes,
	}.Build()
	File_cycler_config_proto = out.File
	file_cycler_config_proto_rawDesc = nil
	file_cycler_config_proto_goTypes = nil
	file_cycler_config_proto_depIdxs = nil
}
