// 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"`
	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
}

// 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"`
	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 ""
}

// 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"`
	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 ""
}

// Output defines parameters around how the task will deliver output to
// the callers, e.g. Google Storage bucket.
type Config_Output struct {
	GsRootDir            string   `protobuf:"bytes,1,opt,name=gs_root_dir,json=gsRootDir,proto3" json:"gs_root_dir,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 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")
}

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

var fileDescriptor_b2c5f9be4f684081 = []byte{
	// 369 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x92, 0x41, 0x6b, 0xdb, 0x30,
	0x1c, 0xc5, 0x49, 0x0c, 0x0e, 0x51, 0x32, 0x18, 0x5a, 0x18, 0x21, 0x87, 0x91, 0x6d, 0x97, 0x1c,
	0x16, 0x2b, 0x6c, 0x3b, 0xf7, 0x90, 0x16, 0xda, 0x84, 0xd0, 0x80, 0x73, 0xeb, 0x45, 0x95, 0x1d,
	0xd9, 0x11, 0xb5, 0xf5, 0x37, 0xfa, 0xcb, 0x81, 0x7c, 0x88, 0x7e, 0xe0, 0xde, 0x8a, 0x65, 0xbb,
	0xb4, 0xf4, 0x90, 0x1c, 0xfd, 0xde, 0xfb, 0x3d, 0x3d, 0x0b, 0x91, 0xb9, 0x95, 0x68, 0x79, 0x91,
	0x09, 0x9b, 0x80, 0xc9, 0x19, 0x3e, 0x9d, 0x32, 0x11, 0x71, 0x27, 0x9a, 0x52, 0x6b, 0x69, 0x58,
	0x0c, 0x3a, 0x51, 0x69, 0x50, 0x18, 0xb0, 0x40, 0xa7, 0x1f, 0xe2, 0xc1, 0xe7, 0xf8, 0xaf, 0x17,
	0x8f, 0xf8, 0xd7, 0x0e, 0xa1, 0x57, 0xc4, 0xcb, 0x44, 0x34, 0xee, 0x4c, 0x3b, 0xb3, 0xc1, 0xdf,
	0x3f, 0xc1, 0x39, 0x34, 0xa8, 0xb1, 0x60, 0x23, 0xa2, 0xb0, 0x02, 0xe9, 0x9a, 0xf4, 0x0e, 0xc2,
	0x68, 0x89, 0x38, 0xee, 0xba, 0x8e, 0xc5, 0xc5, 0x1d, 0x77, 0x35, 0x17, 0xb6, 0x05, 0xf4, 0x96,
	0xf8, 0x50, 0xda, 0xa2, 0xb4, 0x63, 0xcf, 0x55, 0xb1, 0x8b, 0xab, 0xb6, 0x0e, 0x0b, 0x1b, 0x7c,
	0xf2, 0x48, 0xbc, 0x8d, 0x88, 0xe8, 0x6f, 0xf2, 0x45, 0xec, 0x73, 0xa5, 0x39, 0x4a, 0x73, 0x54,
	0xb1, 0x74, 0x7f, 0xd9, 0x0f, 0x87, 0x4e, 0xdc, 0xd5, 0x1a, 0xfd, 0x4f, 0xbe, 0xc7, 0x06, 0x90,
	0x2b, 0x7d, 0x94, 0xda, 0x82, 0x39, 0xbd, 0xa5, 0xbb, 0x2e, 0x3d, 0xaa, 0xdc, 0x55, 0x6b, 0x36,
	0xd4, 0xe4, 0xb9, 0x43, 0x7a, 0xcd, 0x7e, 0xfa, 0x93, 0x0c, 0x45, 0x69, 0xc1, 0xcd, 0xda, 0x2b,
	0xd3, 0x9c, 0x32, 0x68, 0xb5, 0x1b, 0x65, 0xe8, 0x82, 0x8c, 0xf0, 0xa4, 0xe3, 0x03, 0x87, 0x24,
	0xc9, 0x40, 0xec, 0x39, 0x96, 0x51, 0x15, 0xad, 0x8f, 0xa0, 0xce, 0xdb, 0xd6, 0xd6, 0xce, 0x39,
	0x74, 0x4e, 0xbe, 0x21, 0x16, 0x3c, 0x12, 0x28, 0xb9, 0xca, 0x45, 0x2a, 0xb9, 0x16, 0xb9, 0x74,
	0x17, 0xd3, 0x0f, 0xbf, 0x22, 0x16, 0x4b, 0x81, 0x72, 0x55, 0x19, 0xf7, 0x22, 0x97, 0x93, 0x19,
	0xf1, 0xeb, 0x3b, 0xa0, 0x3f, 0xc8, 0x20, 0x45, 0x6e, 0x00, 0xde, 0x8f, 0xe9, 0xa7, 0x18, 0x02,
	0x54, 0x53, 0x96, 0x9b, 0x87, 0x75, 0x0a, 0x41, 0x7c, 0x30, 0x90, 0xab, 0x32, 0x0f, 0xc0, 0xa4,
	0xac, 0xfd, 0x00, 0x64, 0x4a, 0x27, 0x46, 0x30, 0xf7, 0x8e, 0x58, 0x0a, 0xec, 0xdc, 0xc3, 0x8b,
	0x7c, 0x17, 0xfd, 0xf7, 0x1a, 0x00, 0x00, 0xff, 0xff, 0xf0, 0xf3, 0xc3, 0xe3, 0xa3, 0x02, 0x00,
	0x00,
}
