// 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"`
	// 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 {
	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{
	// 405 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x92, 0xc1, 0x6f, 0xd3, 0x30,
	0x14, 0xc6, 0xd5, 0x75, 0xea, 0x54, 0x77, 0x48, 0xc8, 0x0c, 0x88, 0x7a, 0x40, 0x05, 0x2e, 0x3d,
	0xb0, 0x78, 0x02, 0xc4, 0x91, 0xc3, 0x98, 0x04, 0x9b, 0x2a, 0x26, 0xa5, 0x37, 0x2e, 0xe6, 0x39,
	0x71, 0x52, 0x43, 0xe2, 0x17, 0xf9, 0x39, 0x93, 0xfa, 0x67, 0xf1, 0x47, 0xf0, 0x7f, 0xa1, 0xd8,
	0x09, 0x02, 0xed, 0xb0, 0x1e, 0xfd, 0xfd, 0xbe, 0xef, 0xb3, 0x9f, 0xf5, 0xd8, 0xb9, 0xd7, 0xe4,
	0x65, 0x5b, 0x83, 0x2f, 0xd1, 0x35, 0x82, 0x7e, 0xee, 0x6b, 0x50, 0x32, 0x88, 0xae, 0xb3, 0x56,
	0x3b, 0x91, 0xa3, 0x2d, 0x4d, 0x95, 0xb6, 0x0e, 0x3d, 0xf2, 0xd5, 0x7f, 0xf6, 0xf4, 0xbe, 0xfd,
	0xd5, 0xaf, 0x63, 0x36, 0xfb, 0x14, 0x22, 0xfc, 0x23, 0x9b, 0xd6, 0xa0, 0x92, 0xc9, 0x6a, 0xb2,
	0x5e, 0xbc, 0x7d, 0x93, 0x3e, 0x14, 0x4d, 0x63, 0x2c, 0xdd, 0x80, 0xca, 0xfa, 0x20, 0xbf, 0x61,
	0x27, 0x3b, 0x70, 0x56, 0x13, 0x25, 0x47, 0xa1, 0xe3, 0xe2, 0xe0, 0x8e, 0x2f, 0x31, 0x97, 0x8d,
	0x05, 0xfc, 0x33, 0x9b, 0x61, 0xe7, 0xdb, 0xce, 0x27, 0xd3, 0x50, 0x25, 0x0e, 0xae, 0xba, 0x0d,
	0xb1, 0x6c, 0x88, 0x2f, 0xbf, 0xb3, 0xe9, 0x06, 0x14, 0x7f, 0xcd, 0x1e, 0x41, 0xd1, 0x18, 0x2b,
	0x49, 0xbb, 0x3b, 0x93, 0xeb, 0x30, 0xe5, 0x3c, 0x3b, 0x0d, 0xe2, 0x36, 0x6a, 0xfc, 0x3d, 0x7b,
	0x96, 0x3b, 0x24, 0x69, 0xec, 0x9d, 0xb6, 0x1e, 0xdd, 0xfe, 0xaf, 0xfb, 0x28, 0xb8, 0xcf, 0x7a,
	0x7a, 0x3d, 0xc2, 0x21, 0xb5, 0xfc, 0x3d, 0x61, 0x27, 0xc3, 0xfb, 0xf9, 0x4b, 0x76, 0x0a, 0x9d,
	0xc7, 0xf0, 0xac, 0xc2, 0xb8, 0xe1, 0x96, 0xc5, 0xa8, 0x5d, 0x19, 0xc7, 0x2f, 0xd8, 0x19, 0xed,
	0x6d, 0xbe, 0x93, 0x58, 0x96, 0x35, 0x42, 0x21, 0xa9, 0x53, 0xbd, 0x35, 0x5e, 0xc1, 0x03, 0xbb,
	0x8d, 0x68, 0x1b, 0x08, 0x3f, 0x67, 0x4f, 0x88, 0x5a, 0xa9, 0x80, 0xb4, 0x34, 0x0d, 0x54, 0x5a,
	0x5a, 0x68, 0x74, 0xf8, 0x98, 0x79, 0xf6, 0x98, 0xa8, 0xbd, 0x04, 0xd2, 0xd7, 0x3d, 0xf8, 0x0a,
	0x8d, 0xe6, 0x1f, 0xd8, 0xf3, 0xd6, 0xe9, 0x1f, 0xa8, 0x64, 0xa1, 0xa1, 0xa8, 0x8d, 0xd5, 0x92,
	0x74, 0x8e, 0xb6, 0xa0, 0xe4, 0x78, 0x35, 0x59, 0x4f, 0xb3, 0xa7, 0x11, 0x5f, 0x0d, 0x74, 0x1b,
	0xe1, 0x72, 0xcd, 0x66, 0xf1, 0xef, 0xf8, 0x0b, 0xb6, 0xa8, 0x48, 0x3a, 0xc4, 0x7f, 0x87, 0x98,
	0x57, 0x94, 0x21, 0xf6, 0x23, 0x5c, 0x6e, 0xbe, 0xdd, 0x54, 0x98, 0xe6, 0x3b, 0x87, 0x8d, 0xe9,
	0x9a, 0x14, 0x5d, 0x25, 0xc6, 0x03, 0x92, 0x30, 0xb6, 0x74, 0x20, 0xc2, 0xfe, 0x89, 0x0a, 0xc5,
	0x43, 0x0b, 0xab, 0x66, 0xc1, 0xfa, 0xee, 0x4f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x3b, 0x9e, 0x6b,
	0xa1, 0xdb, 0x02, 0x00, 0x00,
}
