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

package skylab_local_state

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_local_state.
type Config 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"`
	// Autotest directory on the drone, e.g. "/usr/local/autotest".
	AutotestDir string `protobuf:"bytes,2,opt,name=autotest_dir,json=autotestDir,proto3" json:"autotest_dir,omitempty"`
	// Inventory V2 service host, e.g. cros-lab-inventory.appspot.com.
	CrosInventoryService string `protobuf:"bytes,3,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,4,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) Reset()         { *m = Config{} }
func (m *Config) String() string { return proto.CompactTextString(m) }
func (*Config) ProtoMessage()    {}
func (*Config) Descriptor() ([]byte, []int) {
	return fileDescriptor_484976b1b807e36b, []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) GetAdminService() string {
	if m != nil {
		return m.AdminService
	}
	return ""
}

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

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

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

func init() {
	proto.RegisterType((*Config)(nil), "test_platform.skylab_local_state.Config")
}

func init() {
	proto.RegisterFile("test_platform/skylab_local_state/common.proto", fileDescriptor_484976b1b807e36b)
}

var fileDescriptor_484976b1b807e36b = []byte{
	// 232 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x84, 0xd0, 0xc1, 0x4a, 0x03, 0x31,
	0x10, 0x06, 0x60, 0x56, 0xa5, 0x60, 0xac, 0x22, 0x8b, 0x48, 0x8f, 0x55, 0x2f, 0xbd, 0xb8, 0x39,
	0xe8, 0x13, 0xa8, 0x17, 0xc5, 0x93, 0xe2, 0xc5, 0x4b, 0x48, 0xd3, 0x64, 0x1d, 0xdc, 0x64, 0xca,
	0xcc, 0x6c, 0xa1, 0x6f, 0xe5, 0x23, 0x4a, 0x47, 0xb7, 0x20, 0x1e, 0x7a, 0xcc, 0xff, 0x7f, 0xf9,
	0x21, 0x31, 0xd7, 0x12, 0x59, 0xdc, 0xb2, 0xf3, 0x92, 0x90, 0xb2, 0xe5, 0xcf, 0x75, 0xe7, 0xe7,
	0xae, 0xc3, 0xe0, 0x3b, 0xc7, 0xe2, 0x25, 0xda, 0x80, 0x39, 0x63, 0x69, 0x96, 0x84, 0x82, 0xf5,
	0xf4, 0x0f, 0x6f, 0xfe, 0xf3, 0xcb, 0xaf, 0xca, 0x8c, 0xee, 0xb1, 0x24, 0x68, 0xeb, 0x2b, 0x73,
	0xec, 0x17, 0x19, 0x8a, 0xe3, 0x48, 0x2b, 0x08, 0x71, 0x52, 0x4d, 0xab, 0xd9, 0xe1, 0xcb, 0x58,
	0xc3, 0xd7, 0x9f, 0xac, 0xbe, 0x30, 0x63, 0xdf, 0x0b, 0xea, 0xee, 0x02, 0x68, 0xb2, 0xa7, 0xe6,
	0x68, 0xc8, 0x1e, 0x80, 0xea, 0x5b, 0x73, 0x1e, 0x08, 0xd9, 0x41, 0x59, 0xc5, 0x22, 0x48, 0xeb,
	0xed, 0xe0, 0xbe, 0xe2, 0xb3, 0x4d, 0xfb, 0x38, 0x94, 0xc3, 0xf0, 0xcc, 0x9c, 0xea, 0xad, 0x3e,
	0xf1, 0xd6, 0x1f, 0xa8, 0x3f, 0xd9, 0xe4, 0x6f, 0x89, 0x7f, 0xe5, 0xdd, 0xf3, 0xfb, 0x53, 0x8b,
	0x4d, 0xf8, 0x20, 0xcc, 0xd0, 0xe7, 0x06, 0xa9, 0xb5, 0xc3, 0x01, 0xd9, 0x42, 0x49, 0xe4, 0xad,
	0x3e, 0xdf, 0xb6, 0x68, 0x77, 0xfd, 0xd7, 0x7c, 0xa4, 0xf4, 0xe6, 0x3b, 0x00, 0x00, 0xff, 0xff,
	0x01, 0x3b, 0xca, 0x40, 0x5a, 0x01, 0x00, 0x00,
}
