// 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: 6
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"`
	Licenses             []*License                `protobuf:"bytes,5,rep,name=licenses,proto3" json:"licenses,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
}

func (m *DeviceUnderTest) GetLicenses() []*License {
	if m != nil {
		return m.Licenses
	}
	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{
	// 611 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x93, 0xcd, 0x6e, 0xda, 0x40,
	0x10, 0xc7, 0x03, 0x0e, 0x84, 0x0c, 0x09, 0x6c, 0x37, 0x5f, 0x2e, 0x4a, 0x25, 0x44, 0x55, 0xc9,
	0x97, 0xda, 0x2a, 0xbd, 0xf5, 0x16, 0x70, 0xa4, 0x58, 0x22, 0x40, 0xd6, 0x76, 0x0e, 0xbd, 0x58,
	0xeb, 0x8f, 0x90, 0x95, 0x6c, 0x2f, 0x5a, 0x9b, 0x1c, 0xfb, 0x58, 0x7d, 0x81, 0x9e, 0xfb, 0x4e,
	0x95, 0xd7, 0x8e, 0x81, 0x28, 0xea, 0x71, 0x7e, 0xff, 0xff, 0xcc, 0x78, 0x66, 0xbc, 0x80, 0x62,
	0xea, 0x1b, 0x61, 0xf4, 0xc2, 0x82, 0x48, 0x5f, 0x0b, 0x9e, 0x73, 0xac, 0xc4, 0xd4, 0x1f, 0x5c,
	0x96, 0xc8, 0x08, 0x78, 0xfa, 0xc4, 0x56, 0x1e, 0x0b, 0x4b, 0x71, 0x70, 0x5d, 0xd8, 0x83, 0x67,
	0xc1, 0x93, 0x88, 0x67, 0x5e, 0x69, 0xda, 0xaa, 0x1f, 0x0a, 0x35, 0x66, 0x41, 0x94, 0x66, 0x55,
	0xb5, 0xc1, 0x45, 0x81, 0xd6, 0x91, 0x60, 0xeb, 0xe7, 0x48, 0xd0, 0x38, 0xab, 0x70, 0xbf, 0xc0,
	0x59, 0x24, 0x5e, 0x78, 0x05, 0x3e, 0x25, 0x34, 0xdd, 0x3c, 0xd1, 0x20, 0xdf, 0x08, 0x96, 0xae,
	0xde, 0xf6, 0x1d, 0xfd, 0x69, 0x42, 0x6f, 0x2a, 0xdb, 0x2e, 0x6c, 0x53, 0x76, 0xc5, 0x5f, 0xa0,
	0xc9, 0x42, 0xb5, 0x31, 0x6c, 0x68, 0xdd, 0xf1, 0x85, 0x1e, 0x53, 0x5f, 0xdf, 0x37, 0x58, 0x26,
	0x69, 0xb2, 0x10, 0x7f, 0x86, 0xd3, 0x2c, 0x12, 0x8c, 0xc6, 0x5e, 0xba, 0x49, 0xfc, 0x48, 0xa8,
	0xcd, 0x61, 0x43, 0x3b, 0x26, 0x27, 0x25, 0x9c, 0x4b, 0x86, 0x27, 0x80, 0xf6, 0xfa, 0x7b, 0x2c,
	0x54, 0x15, 0x59, 0xf9, 0x4a, 0xdf, 0x13, 0xf4, 0xa9, 0xfc, 0x30, 0xcb, 0x24, 0xfd, 0x3d, 0x6e,
	0x85, 0xf8, 0x07, 0xa0, 0x6a, 0x1f, 0xf5, 0xc7, 0xab, 0x87, 0xb2, 0x06, 0xd2, 0xab, 0x05, 0x57,
	0xc9, 0x21, 0xe9, 0x95, 0xe0, 0x35, 0xc6, 0x1a, 0x28, 0xe1, 0x26, 0x57, 0x5b, 0xd2, 0x7e, 0x2e,
	0x87, 0x29, 0x87, 0x70, 0xd3, 0x30, 0x12, 0x4e, 0x94, 0xe5, 0x77, 0x07, 0xa4, 0xb0, 0xe0, 0x6f,
	0x00, 0x31, 0xf5, 0xb3, 0x9c, 0xe6, 0x8c, 0xa7, 0x6a, 0x5b, 0x26, 0xf4, 0x65, 0xc2, 0xac, 0xc6,
	0x77, 0x07, 0x64, 0xc7, 0x34, 0xe9, 0x40, 0xbb, 0x6c, 0x37, 0xfa, 0xad, 0x40, 0xff, 0x4d, 0x5d,
	0x3c, 0x80, 0xce, 0x33, 0xcf, 0xf2, 0x94, 0x26, 0x91, 0x5c, 0xe6, 0x31, 0xa9, 0x63, 0x3c, 0x86,
	0xee, 0xce, 0xe9, 0xe4, 0xe6, 0x8a, 0x69, 0x8a, 0x6e, 0xcb, 0x2d, 0x27, 0xbb, 0x26, 0x3c, 0x85,
	0x5e, 0x20, 0x58, 0xce, 0x02, 0x1a, 0x7b, 0x6b, 0xce, 0xe3, 0x4c, 0x55, 0x86, 0x8a, 0xd6, 0x1b,
	0x5f, 0xbf, 0x37, 0x95, 0x6e, 0xba, 0xce, 0x92, 0xf3, 0x98, 0x9c, 0xbe, 0xe6, 0x14, 0x51, 0x86,
	0xcf, 0xa1, 0x55, 0xe6, 0x1e, 0x0e, 0x15, 0xed, 0x98, 0x94, 0x01, 0xd6, 0xa0, 0x53, 0xfd, 0x5c,
	0x99, 0xda, 0x1a, 0x2a, 0x5a, 0x77, 0x7c, 0x52, 0x4e, 0x5e, 0x42, 0x52, 0xab, 0xa3, 0xbf, 0x0d,
	0x38, 0xaa, 0x4a, 0xe3, 0x73, 0x40, 0xa6, 0xeb, 0x78, 0xcb, 0xc5, 0x62, 0xe6, 0x59, 0xf3, 0xc7,
	0x9b, 0x99, 0x65, 0xa2, 0x03, 0xdc, 0x87, 0x6e, 0x4d, 0xa7, 0x0f, 0xa8, 0x81, 0x11, 0x9c, 0xd4,
	0x60, 0xf2, 0xe8, 0xa0, 0x26, 0x3e, 0x83, 0x7e, 0x4d, 0x6c, 0xd7, 0x72, 0x6e, 0x6d, 0xa4, 0xec,
	0xd9, 0xa6, 0x8e, 0x8d, 0x0e, 0xf1, 0x47, 0xb8, 0xd8, 0x25, 0xde, 0xf2, 0x96, 0x4c, 0x5c, 0x6b,
	0x66, 0xa2, 0x16, 0xbe, 0x82, 0xb3, 0xad, 0xb4, 0x98, 0x3b, 0xd6, 0xdc, 0x5d, 0xb8, 0x36, 0x6a,
	0xe3, 0x01, 0x5c, 0xd6, 0xc2, 0x0d, 0x99, 0x7a, 0x4b, 0x72, 0x6b, 0xbb, 0x93, 0x7b, 0xcb, 0x41,
	0x47, 0x18, 0x43, 0xaf, 0xd6, 0x1e, 0xdc, 0x85, 0x73, 0x83, 0x3a, 0xa3, 0x5f, 0x00, 0xdb, 0xf3,
	0xfe, 0xf7, 0x64, 0x23, 0x68, 0xcb, 0x67, 0x55, 0x5c, 0xab, 0xd8, 0x10, 0xc8, 0x0d, 0xd9, 0x05,
	0x22, 0x95, 0x82, 0x07, 0xa0, 0x88, 0x75, 0x52, 0xfd, 0xe0, 0x1d, 0x69, 0x20, 0xcb, 0x7b, 0x52,
	0xc0, 0xf7, 0x37, 0x3f, 0x31, 0x7e, 0x7e, 0x5d, 0x71, 0x5d, 0xbe, 0x7b, 0xb6, 0x49, 0x74, 0x2e,
	0x56, 0xc6, 0x6b, 0xc0, 0x33, 0x83, 0xa5, 0x4f, 0x82, 0x1a, 0xf2, 0xa1, 0x1a, 0x2b, 0x6e, 0xc4,
	0xd4, 0xf7, 0xdb, 0x32, 0xfa, 0xfe, 0x2f, 0x00, 0x00, 0xff, 0xff, 0xd4, 0xeb, 0xa4, 0x27, 0x5f,
	0x04, 0x00, 0x00,
}
