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

package skylab_test_runner

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

// Config defines configuration parameters of skylab_test_runner.
type Config struct {
	Lab     *Config_Lab     `protobuf:"bytes,1,opt,name=lab,proto3" json:"lab,omitempty"`
	Harness *Config_Harness `protobuf:"bytes,2,opt,name=harness,proto3" json:"harness,omitempty"`
	Output  *Config_Output  `protobuf:"bytes,3,opt,name=output,proto3" json:"output,omitempty"`
	// Result flow topic: test_runner publishes messages to this topic at the
	// start and the end of the build.
	// The messages in this topic should be ACKed only by the result_flow
	// pipeline.
	ResultFlowPubsub     *Config_PubSub `protobuf:"bytes,4,opt,name=result_flow_pubsub,json=resultFlowPubsub,proto3" json:"result_flow_pubsub,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_b2c5f9be4f684081, []int{0}
}

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) GetLab() *Config_Lab {
	if m != nil {
		return m.Lab
	}
	return nil
}

func (m *Config) GetHarness() *Config_Harness {
	if m != nil {
		return m.Harness
	}
	return nil
}

func (m *Config) GetOutput() *Config_Output {
	if m != nil {
		return m.Output
	}
	return nil
}

func (m *Config) GetResultFlowPubsub() *Config_PubSub {
	if m != nil {
		return m.ResultFlowPubsub
	}
	return nil
}

// Lab defines configuration parameters related to the lab and the lab
// platform services.
type Config_Lab struct {
	// Admin service host, e.g. foo.appspot.com.
	AdminService string `protobuf:"bytes,1,opt,name=admin_service,json=adminService,proto3" json:"admin_service,omitempty"`
	// Inventory V2 service host, e.g. cros-lab-inventory.appspot.com.
	CrosInventoryService string `protobuf:"bytes,2,opt,name=cros_inventory_service,json=crosInventoryService,proto3" json:"cros_inventory_service,omitempty"`
	// Unified Fleet System service host, e.g. ufs.api.cr.dev.
	CrosUfsService       string   `protobuf:"bytes,3,opt,name=cros_ufs_service,json=crosUfsService,proto3" json:"cros_ufs_service,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_Config_Lab proto.InternalMessageInfo

func (m *Config_Lab) GetAdminService() string {
	if m != nil {
		return m.AdminService
	}
	return ""
}

func (m *Config_Lab) GetCrosInventoryService() string {
	if m != nil {
		return m.CrosInventoryService
	}
	return ""
}

func (m *Config_Lab) GetCrosUfsService() string {
	if m != nil {
		return m.CrosUfsService
	}
	return ""
}

// Harness defines configuration parameters related to the test harness
// (autotest, tast, etc).
type Config_Harness struct {
	// Autotest directory inside the drone container,
	// e.g. "/usr/local/autotest".
	AutotestDir string `protobuf:"bytes,1,opt,name=autotest_dir,json=autotestDir,proto3" json:"autotest_dir,omitempty"`
	// Subdirectory, as relative path from the autotest results directory,
	// to use for synchronous offloads
	SynchOffloadSubdir string `protobuf:"bytes,2,opt,name=synch_offload_subdir,json=synchOffloadSubdir,proto3" json:"synch_offload_subdir,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,3,opt,name=ssp_base_image_name,json=sspBaseImageName,proto3" json:"ssp_base_image_name,omitempty"`
	// The maximum duration for prejobs (e.g. provisioning).
	PrejobDeadlineSeconds int64    `protobuf:"varint,4,opt,name=prejob_deadline_seconds,json=prejobDeadlineSeconds,proto3" json:"prejob_deadline_seconds,omitempty"`
	XXX_NoUnkeyedLiteral  struct{} `json:"-"`
	XXX_unrecognized      []byte   `json:"-"`
	XXX_sizecache         int32    `json:"-"`
}

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

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

var xxx_messageInfo_Config_Harness proto.InternalMessageInfo

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

func (m *Config_Harness) GetSynchOffloadSubdir() string {
	if m != nil {
		return m.SynchOffloadSubdir
	}
	return ""
}

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

func (m *Config_Harness) GetPrejobDeadlineSeconds() int64 {
	if m != nil {
		return m.PrejobDeadlineSeconds
	}
	return 0
}

// Output defines parameters around how the task will deliver output to
// the callers, e.g. Google Storage bucket.
type Config_Output struct {
	// A Google Storage path to upload a specified subset of log-data
	// synchronously.
	// This synchronous upload mechanism is obviated by log_data_gs_dir.
	GsRootDir string `protobuf:"bytes,1,opt,name=gs_root_dir,json=gsRootDir,proto3" json:"gs_root_dir,omitempty"`
	// A Google Storage path prefix to upload all log-data to synchronously.
	// Reflected in the test_platform.skylab_test_runner.Result.log_data
	// returned by the task.
	LogDataGsRoot        string   `protobuf:"bytes,2,opt,name=log_data_gs_root,json=logDataGsRoot,proto3" json:"log_data_gs_root,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_Config_Output proto.InternalMessageInfo

func (m *Config_Output) GetGsRootDir() string {
	if m != nil {
		return m.GsRootDir
	}
	return ""
}

func (m *Config_Output) GetLogDataGsRoot() string {
	if m != nil {
		return m.LogDataGsRoot
	}
	return ""
}

// PubSub defines the configuration parameters for PubSub topic.
type Config_PubSub struct {
	Project              string   `protobuf:"bytes,1,opt,name=project,proto3" json:"project,omitempty"`
	Topic                string   `protobuf:"bytes,2,opt,name=topic,proto3" json:"topic,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_Config_PubSub proto.InternalMessageInfo

func (m *Config_PubSub) GetProject() string {
	if m != nil {
		return m.Project
	}
	return ""
}

func (m *Config_PubSub) GetTopic() string {
	if m != nil {
		return m.Topic
	}
	return ""
}

func init() {
	proto.RegisterType((*Config)(nil), "test_platform.skylab_test_runner.Config")
	proto.RegisterType((*Config_Lab)(nil), "test_platform.skylab_test_runner.Config.Lab")
	proto.RegisterType((*Config_Harness)(nil), "test_platform.skylab_test_runner.Config.Harness")
	proto.RegisterType((*Config_Output)(nil), "test_platform.skylab_test_runner.Config.Output")
	proto.RegisterType((*Config_PubSub)(nil), "test_platform.skylab_test_runner.Config.PubSub")
}

func init() {
	proto.RegisterFile("test_platform/skylab_test_runner/config.proto", fileDescriptor_b2c5f9be4f684081)
}

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