// Code generated by protoc-gen-go. DO NOT EDIT.
// source: test_platform/phosphorus/common.proto

package phosphorus

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

// BotEnvironment defines bot-specific parameters used by phosphorus.
type BotEnvironment struct {
	// Absolute path to the autotest directory for the bot, e.g.
	// "/usr/local/autotest".
	AutotestDir          string   `protobuf:"bytes,1,opt,name=autotest_dir,json=autotestDir,proto3" json:"autotest_dir,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_BotEnvironment proto.InternalMessageInfo

func (m *BotEnvironment) GetAutotestDir() string {
	if m != nil {
		return m.AutotestDir
	}
	return ""
}

// TaskEnvironment defines task-specific parameters used by phosphorus.
type TaskEnvironment struct {
	// Absolute path to the results directory for a given run. Include results of
	//  both tests and non-test tasks like provision
	ResultsDir string `protobuf:"bytes,2,opt,name=results_dir,json=resultsDir,proto3" json:"results_dir,omitempty"`
	// Absolute path to the results directory for a given run's tests.
	//  MUST be equal to ${results_dir}/autoserv_test if present. This restriction
	//  may be lifted in the future.
	TestResultsDir string `protobuf:"bytes,3,opt,name=test_results_dir,json=testResultsDir,proto3" json:"test_results_dir,omitempty"`
	// The name of the base lxc image used for Server Side Packaging (SSP).
	//
	// autoserv fetches the base image from a hard-coded path on Google
	// Storage: gs://abci-ssp/autotest-containers/{name}.tar.xz
	//
	// See go/ctp-ssp for an overview of SSP.
	SspBaseImageName     string   `protobuf:"bytes,4,opt,name=ssp_base_image_name,json=sspBaseImageName,proto3" json:"ssp_base_image_name,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_TaskEnvironment proto.InternalMessageInfo

func (m *TaskEnvironment) GetResultsDir() string {
	if m != nil {
		return m.ResultsDir
	}
	return ""
}

func (m *TaskEnvironment) GetTestResultsDir() string {
	if m != nil {
		return m.TestResultsDir
	}
	return ""
}

func (m *TaskEnvironment) GetSspBaseImageName() string {
	if m != nil {
		return m.SspBaseImageName
	}
	return ""
}

// Knobs specific to the step that uploads log-data to Google Storage.
type LogDataUploadStep struct {
	// Controls the maximum number of files that may be uploaded concurrently.
	// If unset, a hard-coded constant is used to limit concurrency (i.e., there
	// is no way to request unlimited concurrent uploads).
	MaxConcurrentUploads int32    `protobuf:"varint,1,opt,name=max_concurrent_uploads,json=maxConcurrentUploads,proto3" json:"max_concurrent_uploads,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_LogDataUploadStep proto.InternalMessageInfo

func (m *LogDataUploadStep) GetMaxConcurrentUploads() int32 {
	if m != nil {
		return m.MaxConcurrentUploads
	}
	return 0
}

// Config defines configuration parameters common to phosphorus subcommands.
type Config struct {
	Bot                  *BotEnvironment    `protobuf:"bytes,1,opt,name=bot,proto3" json:"bot,omitempty"`
	Task                 *TaskEnvironment   `protobuf:"bytes,2,opt,name=task,proto3" json:"task,omitempty"`
	LogDataUploadStep    *LogDataUploadStep `protobuf:"bytes,3,opt,name=log_data_upload_step,json=logDataUploadStep,proto3" json:"log_data_upload_step,omitempty"`
	XXX_NoUnkeyedLiteral struct{}           `json:"-"`
	XXX_unrecognized     []byte             `json:"-"`
	XXX_sizecache        int32              `json:"-"`
}

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

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

var xxx_messageInfo_Config proto.InternalMessageInfo

func (m *Config) GetBot() *BotEnvironment {
	if m != nil {
		return m.Bot
	}
	return nil
}

func (m *Config) GetTask() *TaskEnvironment {
	if m != nil {
		return m.Task
	}
	return nil
}

func (m *Config) GetLogDataUploadStep() *LogDataUploadStep {
	if m != nil {
		return m.LogDataUploadStep
	}
	return nil
}

func init() {
	proto.RegisterType((*BotEnvironment)(nil), "test_platform.phosphorus.BotEnvironment")
	proto.RegisterType((*TaskEnvironment)(nil), "test_platform.phosphorus.TaskEnvironment")
	proto.RegisterType((*LogDataUploadStep)(nil), "test_platform.phosphorus.LogDataUploadStep")
	proto.RegisterType((*Config)(nil), "test_platform.phosphorus.Config")
}

func init() {
	proto.RegisterFile("test_platform/phosphorus/common.proto", fileDescriptor_6d57f1c2e65b1971)
}

var fileDescriptor_6d57f1c2e65b1971 = []byte{
	// 384 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x74, 0x92, 0xcf, 0xaa, 0xd3, 0x40,
	0x14, 0xc6, 0xc9, 0xbd, 0xf5, 0xa2, 0x13, 0xb9, 0xb6, 0xb1, 0x68, 0x77, 0x6a, 0x40, 0xa8, 0x88,
	0x09, 0xb4, 0xae, 0x04, 0x37, 0x69, 0x5c, 0x54, 0xc4, 0x45, 0xd4, 0x8d, 0x08, 0xc3, 0x69, 0x3a,
	0x49, 0x87, 0x66, 0xe6, 0x0c, 0x73, 0x26, 0x52, 0x5f, 0xc9, 0xb7, 0xf2, 0x4d, 0x24, 0x63, 0x6b,
	0xff, 0x5c, 0xb2, 0xcc, 0x77, 0x7e, 0xbf, 0x93, 0xe4, 0xe3, 0xb0, 0x97, 0x4e, 0x90, 0xe3, 0xa6,
	0x01, 0x57, 0xa1, 0x55, 0xa9, 0xd9, 0x20, 0x99, 0x0d, 0xda, 0x96, 0xd2, 0x12, 0x95, 0x42, 0x9d,
	0x18, 0x8b, 0x0e, 0xa3, 0xc9, 0x19, 0x96, 0x1c, 0xb1, 0x78, 0xce, 0x6e, 0x33, 0x74, 0x1f, 0xf4,
	0x4f, 0x69, 0x51, 0x2b, 0xa1, 0x5d, 0xf4, 0x82, 0x3d, 0x84, 0xd6, 0xa1, 0x37, 0xd6, 0xd2, 0x4e,
	0x82, 0xe7, 0xc1, 0xf4, 0x41, 0x11, 0x1e, 0xb2, 0x5c, 0xda, 0xf8, 0x77, 0xc0, 0x1e, 0x7d, 0x05,
	0xda, 0x9e, 0x6a, 0xcf, 0x58, 0x68, 0x05, 0xb5, 0x8d, 0x23, 0x6f, 0x5d, 0x79, 0x8b, 0xed, 0xa3,
	0x5c, 0xda, 0x68, 0xca, 0x86, 0x7e, 0xe7, 0x29, 0x75, 0xed, 0xa9, 0xdb, 0x2e, 0x2f, 0x8e, 0xe4,
	0x1b, 0xf6, 0x98, 0xc8, 0xf0, 0x15, 0x90, 0xe0, 0x52, 0x41, 0x2d, 0xb8, 0x06, 0x25, 0x26, 0x03,
	0x0f, 0x0f, 0x89, 0x4c, 0x06, 0x24, 0x96, 0xdd, 0xe0, 0x33, 0x28, 0xf1, 0x71, 0x70, 0x3f, 0x18,
	0x5e, 0x15, 0x4f, 0xe9, 0x97, 0x2e, 0x37, 0x16, 0x35, 0xb6, 0xc4, 0xb1, 0xaa, 0x1a, 0x84, 0x75,
	0xf7, 0x8e, 0x78, 0xc9, 0x46, 0x9f, 0xb0, 0xce, 0xc1, 0xc1, 0x37, 0xd3, 0x85, 0x5f, 0x9c, 0x30,
	0xd1, 0x5b, 0xf6, 0x44, 0xc1, 0x8e, 0x97, 0xa8, 0xcb, 0xd6, 0x5a, 0xa1, 0x1d, 0x6f, 0xfd, 0x90,
	0xfc, 0xef, 0xde, 0x2b, 0xc6, 0x0a, 0x76, 0x8b, 0xff, 0xc3, 0x7f, 0x22, 0xc5, 0x7f, 0x02, 0x76,
	0xb3, 0x40, 0x5d, 0xc9, 0x3a, 0x7a, 0xc7, 0xae, 0x57, 0xe8, 0x3c, 0x1d, 0xce, 0xa6, 0x49, 0x5f,
	0xbf, 0xc9, 0x79, 0xb9, 0x45, 0x27, 0x45, 0xef, 0xd9, 0xc0, 0x01, 0x6d, 0x7d, 0x47, 0xe1, 0xec,
	0x55, 0xbf, 0x7c, 0xd1, 0x71, 0xe1, 0xb5, 0xe8, 0x07, 0x1b, 0x37, 0x58, 0xf3, 0x35, 0x38, 0xd8,
	0x7f, 0x35, 0x27, 0x27, 0x8c, 0x2f, 0x33, 0x9c, 0xbd, 0xee, 0x5f, 0x77, 0xa7, 0x86, 0x62, 0xd4,
	0x5c, 0x46, 0x59, 0xfe, 0x3d, 0xab, 0x31, 0xe9, 0x9a, 0x54, 0xb2, 0x55, 0x09, 0xda, 0x3a, 0x3d,
	0x3c, 0x20, 0xa5, 0x52, 0x57, 0x16, 0x52, 0x7f, 0x54, 0x69, 0x8d, 0x69, 0xdf, 0xf5, 0xad, 0x6e,
	0x3c, 0x32, 0xff, 0x1b, 0x00, 0x00, 0xff, 0xff, 0x24, 0xcc, 0xc7, 0xb7, 0xa0, 0x02, 0x00, 0x00,
}
