// Code generated by protoc-gen-go. DO NOT EDIT.
// source: lab/device.proto

package lab

import (
	fmt "fmt"
	proto "github.com/golang/protobuf/proto"
	device "go.chromium.org/chromiumos/infra/proto/go/device"
	manufacturing "go.chromium.org/chromiumos/infra/proto/go/manufacturing"
	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

// critical_pools are pool labels that the builders are dependent on, and
// that the cros-infra team is responsible for managing explicitly. All other
// pool labels used for adhoc labeling of DUTs go into self_serve_pools.
// TO BE DELETED
type DeviceUnderTest_DUTPool int32

const (
	DeviceUnderTest_DUT_POOL_INVALID       DeviceUnderTest_DUTPool = 0
	DeviceUnderTest_DUT_POOL_CQ            DeviceUnderTest_DUTPool = 1
	DeviceUnderTest_DUT_POOL_BVT           DeviceUnderTest_DUTPool = 2
	DeviceUnderTest_DUT_POOL_SUITES        DeviceUnderTest_DUTPool = 3
	DeviceUnderTest_DUT_POOL_CTS           DeviceUnderTest_DUTPool = 4
	DeviceUnderTest_DUT_POOL_CTS_PERBUILD  DeviceUnderTest_DUTPool = 5
	DeviceUnderTest_DUT_POOL_CONTINUOUS    DeviceUnderTest_DUTPool = 6
	DeviceUnderTest_DUT_POOL_ARC_PRESUBMIT DeviceUnderTest_DUTPool = 7
	DeviceUnderTest_DUT_POOL_QUOTA         DeviceUnderTest_DUTPool = 8
)

var DeviceUnderTest_DUTPool_name = map[int32]string{
	0: "DUT_POOL_INVALID",
	1: "DUT_POOL_CQ",
	2: "DUT_POOL_BVT",
	3: "DUT_POOL_SUITES",
	4: "DUT_POOL_CTS",
	5: "DUT_POOL_CTS_PERBUILD",
	6: "DUT_POOL_CONTINUOUS",
	7: "DUT_POOL_ARC_PRESUBMIT",
	8: "DUT_POOL_QUOTA",
}

var DeviceUnderTest_DUTPool_value = map[string]int32{
	"DUT_POOL_INVALID":       0,
	"DUT_POOL_CQ":            1,
	"DUT_POOL_BVT":           2,
	"DUT_POOL_SUITES":        3,
	"DUT_POOL_CTS":           4,
	"DUT_POOL_CTS_PERBUILD":  5,
	"DUT_POOL_CONTINUOUS":    6,
	"DUT_POOL_ARC_PRESUBMIT": 7,
	"DUT_POOL_QUOTA":         8,
}

func (x DeviceUnderTest_DUTPool) String() string {
	return proto.EnumName(DeviceUnderTest_DUTPool_name, int32(x))
}

func (DeviceUnderTest_DUTPool) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_7e0f9c639061e848, []int{1, 0}
}

// Next Tag: 7
type ChromeOSDevice struct {
	// A unique ID for chromeos device, a randomly generated uuid or AssetTag.
	Id              *ChromeOSDeviceID       `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"`
	SerialNumber    string                  `protobuf:"bytes,2,opt,name=serial_number,json=serialNumber,proto3" json:"serial_number,omitempty"`
	ManufacturingId *manufacturing.ConfigID `protobuf:"bytes,3,opt,name=manufacturing_id,json=manufacturingId,proto3" json:"manufacturing_id,omitempty"`
	// Device config identifiers.
	// These values will be extracted from DUT and joinable to device config.
	DeviceConfigId *device.ConfigId `protobuf:"bytes,4,opt,name=device_config_id,json=deviceConfigId,proto3" json:"device_config_id,omitempty"`
	// Types that are valid to be assigned to Device:
	//	*ChromeOSDevice_Dut
	//	*ChromeOSDevice_Labstation
	Device               isChromeOSDevice_Device `protobuf_oneof:"device"`
	XXX_NoUnkeyedLiteral struct{}                `json:"-"`
	XXX_unrecognized     []byte                  `json:"-"`
	XXX_sizecache        int32                   `json:"-"`
}

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

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

var xxx_messageInfo_ChromeOSDevice proto.InternalMessageInfo

func (m *ChromeOSDevice) GetId() *ChromeOSDeviceID {
	if m != nil {
		return m.Id
	}
	return nil
}

func (m *ChromeOSDevice) GetSerialNumber() string {
	if m != nil {
		return m.SerialNumber
	}
	return ""
}

func (m *ChromeOSDevice) GetManufacturingId() *manufacturing.ConfigID {
	if m != nil {
		return m.ManufacturingId
	}
	return nil
}

func (m *ChromeOSDevice) GetDeviceConfigId() *device.ConfigId {
	if m != nil {
		return m.DeviceConfigId
	}
	return nil
}

type isChromeOSDevice_Device interface {
	isChromeOSDevice_Device()
}

type ChromeOSDevice_Dut struct {
	Dut *DeviceUnderTest `protobuf:"bytes,5,opt,name=dut,proto3,oneof"`
}

type ChromeOSDevice_Labstation struct {
	Labstation *Labstation `protobuf:"bytes,6,opt,name=labstation,proto3,oneof"`
}

func (*ChromeOSDevice_Dut) isChromeOSDevice_Device() {}

func (*ChromeOSDevice_Labstation) isChromeOSDevice_Device() {}

func (m *ChromeOSDevice) GetDevice() isChromeOSDevice_Device {
	if m != nil {
		return m.Device
	}
	return nil
}

func (m *ChromeOSDevice) GetDut() *DeviceUnderTest {
	if x, ok := m.GetDevice().(*ChromeOSDevice_Dut); ok {
		return x.Dut
	}
	return nil
}

func (m *ChromeOSDevice) GetLabstation() *Labstation {
	if x, ok := m.GetDevice().(*ChromeOSDevice_Labstation); ok {
		return x.Labstation
	}
	return nil
}

// XXX_OneofWrappers is for the internal use of the proto package.
func (*ChromeOSDevice) XXX_OneofWrappers() []interface{} {
	return []interface{}{
		(*ChromeOSDevice_Dut)(nil),
		(*ChromeOSDevice_Labstation)(nil),
	}
}

// Next Tag: 5
type DeviceUnderTest struct {
	Hostname             string                    `protobuf:"bytes,1,opt,name=hostname,proto3" json:"hostname,omitempty"`
	Peripherals          *Peripherals              `protobuf:"bytes,2,opt,name=peripherals,proto3" json:"peripherals,omitempty"`
	CriticalPools        []DeviceUnderTest_DUTPool `protobuf:"varint,3,rep,packed,name=critical_pools,json=criticalPools,proto3,enum=lab.DeviceUnderTest_DUTPool" json:"critical_pools,omitempty"`
	Pools                []string                  `protobuf:"bytes,4,rep,name=pools,proto3" json:"pools,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                  `json:"-"`
	XXX_unrecognized     []byte                    `json:"-"`
	XXX_sizecache        int32                     `json:"-"`
}

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

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

var xxx_messageInfo_DeviceUnderTest proto.InternalMessageInfo

func (m *DeviceUnderTest) GetHostname() string {
	if m != nil {
		return m.Hostname
	}
	return ""
}

func (m *DeviceUnderTest) GetPeripherals() *Peripherals {
	if m != nil {
		return m.Peripherals
	}
	return nil
}

func (m *DeviceUnderTest) GetCriticalPools() []DeviceUnderTest_DUTPool {
	if m != nil {
		return m.CriticalPools
	}
	return nil
}

func (m *DeviceUnderTest) GetPools() []string {
	if m != nil {
		return m.Pools
	}
	return nil
}

// Next Tag: 5
type Labstation struct {
	Hostname             string   `protobuf:"bytes,1,opt,name=hostname,proto3" json:"hostname,omitempty"`
	Servos               []*Servo `protobuf:"bytes,2,rep,name=servos,proto3" json:"servos,omitempty"`
	Rpm                  *RPM     `protobuf:"bytes,3,opt,name=rpm,proto3" json:"rpm,omitempty"`
	Pools                []string `protobuf:"bytes,4,rep,name=pools,proto3" json:"pools,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_Labstation proto.InternalMessageInfo

func (m *Labstation) GetHostname() string {
	if m != nil {
		return m.Hostname
	}
	return ""
}

func (m *Labstation) GetServos() []*Servo {
	if m != nil {
		return m.Servos
	}
	return nil
}

func (m *Labstation) GetRpm() *RPM {
	if m != nil {
		return m.Rpm
	}
	return nil
}

func (m *Labstation) GetPools() []string {
	if m != nil {
		return m.Pools
	}
	return nil
}

func init() {
	proto.RegisterEnum("lab.DeviceUnderTest_DUTPool", DeviceUnderTest_DUTPool_name, DeviceUnderTest_DUTPool_value)
	proto.RegisterType((*ChromeOSDevice)(nil), "lab.ChromeOSDevice")
	proto.RegisterType((*DeviceUnderTest)(nil), "lab.DeviceUnderTest")
	proto.RegisterType((*Labstation)(nil), "lab.Labstation")
}

func init() { proto.RegisterFile("lab/device.proto", fileDescriptor_7e0f9c639061e848) }

var fileDescriptor_7e0f9c639061e848 = []byte{
	// 585 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x93, 0x4d, 0x6f, 0x9b, 0x4c,
	0x10, 0xc7, 0x63, 0x93, 0x38, 0xce, 0x38, 0xb1, 0x57, 0x9b, 0x37, 0x1e, 0x2b, 0x8f, 0x64, 0xb9,
	0xaa, 0xe4, 0x4b, 0x41, 0x75, 0x6f, 0xbd, 0xc5, 0x26, 0x52, 0x90, 0x1c, 0x43, 0x16, 0xc8, 0xa1,
	0x17, 0xb4, 0xbc, 0xc4, 0x59, 0x09, 0x58, 0x6b, 0xc1, 0x39, 0xf6, 0x13, 0xf4, 0x5b, 0xf5, 0xdc,
	0xef, 0x54, 0xb1, 0x10, 0x6c, 0x47, 0x51, 0x8f, 0xf3, 0xfb, 0xff, 0x67, 0x87, 0x99, 0x61, 0x00,
	0x25, 0x34, 0xd0, 0xa3, 0xf8, 0x95, 0x85, 0xb1, 0xb6, 0x16, 0xbc, 0xe0, 0x58, 0x49, 0x68, 0x30,
	0xbc, 0xaa, 0x90, 0x1e, 0xf2, 0xec, 0x99, 0xad, 0x7c, 0x16, 0x55, 0xe2, 0xf0, 0xa6, 0xb4, 0x87,
	0x2f, 0x82, 0xa7, 0x31, 0xcf, 0xfd, 0xca, 0xb4, 0x55, 0x2f, 0x4b, 0x75, 0x1d, 0x0b, 0xb6, 0x7e,
	0x89, 0x05, 0x4d, 0xf2, 0x1a, 0x0f, 0x4a, 0x9c, 0xc7, 0xe2, 0x95, 0xd7, 0xe0, 0xff, 0x94, 0x66,
	0x9b, 0x67, 0x1a, 0x16, 0x1b, 0xc1, 0xb2, 0xd5, 0xfb, 0x22, 0xe3, 0xdf, 0x6d, 0xe8, 0xcf, 0x65,
	0x0d, 0xcb, 0x31, 0x64, 0x09, 0xfc, 0x19, 0xda, 0x2c, 0x52, 0x5b, 0xa3, 0xd6, 0xa4, 0x37, 0xbd,
	0xd4, 0x12, 0x1a, 0x68, 0xfb, 0x06, 0xd3, 0x20, 0x6d, 0x16, 0xe1, 0x4f, 0x70, 0x96, 0xc7, 0x82,
	0xd1, 0xc4, 0xcf, 0x36, 0x69, 0x10, 0x0b, 0xb5, 0x3d, 0x6a, 0x4d, 0x4e, 0xc8, 0x69, 0x05, 0x97,
	0x92, 0xe1, 0x19, 0xa0, 0xbd, 0xfa, 0x3e, 0x8b, 0x54, 0x45, 0xbe, 0x7c, 0xad, 0xed, 0x09, 0xda,
	0x5c, 0x7e, 0x98, 0x69, 0x90, 0xc1, 0x1e, 0x37, 0x23, 0xfc, 0x1d, 0x50, 0xdd, 0x7c, 0xf3, 0xf1,
	0xea, 0xa1, 0x7c, 0x03, 0x69, 0xf5, 0x34, 0xeb, 0xe4, 0x88, 0xf4, 0x2b, 0xf0, 0x16, 0xe3, 0x09,
	0x28, 0xd1, 0xa6, 0x50, 0x8f, 0xa4, 0xfd, 0x42, 0x36, 0x53, 0x35, 0xe1, 0x65, 0x51, 0x2c, 0xdc,
	0x38, 0x2f, 0xee, 0x0f, 0x48, 0x69, 0xc1, 0x5f, 0x01, 0x12, 0x1a, 0xe4, 0x05, 0x2d, 0x18, 0xcf,
	0xd4, 0x8e, 0x4c, 0x18, 0xc8, 0x84, 0x45, 0x83, 0xef, 0x0f, 0xc8, 0x8e, 0x69, 0xd6, 0x85, 0x4e,
	0x55, 0x6e, 0xfc, 0x4b, 0x81, 0xc1, 0xbb, 0x77, 0xf1, 0x10, 0xba, 0x2f, 0x3c, 0x2f, 0x32, 0x9a,
	0xc6, 0x72, 0x98, 0x27, 0xa4, 0x89, 0xf1, 0x14, 0x7a, 0x3b, 0xab, 0x93, 0x93, 0x2b, 0xbb, 0x29,
	0xab, 0xd9, 0x5b, 0x4e, 0x76, 0x4d, 0x78, 0x0e, 0xfd, 0x50, 0xb0, 0x82, 0x85, 0x34, 0xf1, 0xd7,
	0x9c, 0x27, 0xb9, 0xaa, 0x8c, 0x94, 0x49, 0x7f, 0x7a, 0xf3, 0x51, 0x57, 0x9a, 0xe1, 0xb9, 0x36,
	0xe7, 0x09, 0x39, 0x7b, 0xcb, 0x29, 0xa3, 0x1c, 0x5f, 0xc0, 0x51, 0x95, 0x7b, 0x38, 0x52, 0x26,
	0x27, 0xa4, 0x0a, 0xc6, 0x7f, 0x5a, 0x70, 0x5c, 0x27, 0xe0, 0x0b, 0x40, 0x86, 0xe7, 0xfa, 0xb6,
	0x65, 0x2d, 0x7c, 0x73, 0xf9, 0x74, 0xbb, 0x30, 0x0d, 0x74, 0x80, 0x07, 0xd0, 0x6b, 0xe8, 0xfc,
	0x11, 0xb5, 0x30, 0x82, 0xd3, 0x06, 0xcc, 0x9e, 0x5c, 0xd4, 0xc6, 0xe7, 0x30, 0x68, 0x88, 0xe3,
	0x99, 0xee, 0x9d, 0x83, 0x94, 0x3d, 0xdb, 0xdc, 0x75, 0xd0, 0x21, 0xfe, 0x0f, 0x2e, 0x77, 0x89,
	0x6f, 0xdf, 0x91, 0x99, 0x67, 0x2e, 0x0c, 0x74, 0x84, 0xaf, 0xe1, 0x7c, 0x2b, 0x59, 0x4b, 0xd7,
	0x5c, 0x7a, 0x96, 0xe7, 0xa0, 0x0e, 0x1e, 0xc2, 0x55, 0x23, 0xdc, 0x92, 0xb9, 0x6f, 0x93, 0x3b,
	0xc7, 0x9b, 0x3d, 0x98, 0x2e, 0x3a, 0xc6, 0x18, 0xfa, 0x8d, 0xf6, 0xe8, 0x59, 0xee, 0x2d, 0xea,
	0x8e, 0x7f, 0x02, 0x6c, 0x97, 0xf6, 0xcf, 0x45, 0x8c, 0xa1, 0x23, 0x8f, 0xa5, 0xdc, 0x81, 0x32,
	0xe9, 0x4d, 0x41, 0x0e, 0xd3, 0x29, 0x11, 0xa9, 0x15, 0x3c, 0x04, 0x45, 0xac, 0xd3, 0xfa, 0xb7,
	0xed, 0x4a, 0x03, 0xb1, 0x1f, 0x48, 0x09, 0x3f, 0x9e, 0xe7, 0x4c, 0xff, 0xf1, 0x65, 0xc5, 0x35,
	0x79, 0xba, 0x6c, 0x93, 0x6a, 0x5c, 0xac, 0xf4, 0xb7, 0x80, 0xe7, 0x3a, 0xcb, 0x9e, 0x05, 0xd5,
	0xe5, 0xf9, 0xe9, 0x2b, 0xae, 0x27, 0x34, 0x08, 0x3a, 0x32, 0xfa, 0xf6, 0x37, 0x00, 0x00, 0xff,
	0xff, 0xb2, 0xb7, 0x87, 0x2c, 0x22, 0x04, 0x00, 0x00,
}
