// Copyright 2019 The Chromium OS Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// Code generated by protoc-gen-go. DO NOT EDIT.
// versions:
// 	protoc-gen-go v1.25.0-devel
// 	protoc        v3.6.1
// source: lab/device.proto

package lab

import (
	device "go.chromium.org/chromiumos/infra/proto/go/device"
	manufacturing "go.chromium.org/chromiumos/infra/proto/go/manufacturing"
	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
	reflect "reflect"
	sync "sync"
)

const (
	// Verify that this generated code is sufficiently up-to-date.
	_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
	// Verify that runtime/protoimpl is sufficiently up-to-date.
	_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
)

// 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
)

// Enum value maps for DeviceUnderTest_DUTPool.
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",
	}
	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) Enum() *DeviceUnderTest_DUTPool {
	p := new(DeviceUnderTest_DUTPool)
	*p = x
	return p
}

func (x DeviceUnderTest_DUTPool) String() string {
	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
}

func (DeviceUnderTest_DUTPool) Descriptor() protoreflect.EnumDescriptor {
	return file_lab_device_proto_enumTypes[0].Descriptor()
}

func (DeviceUnderTest_DUTPool) Type() protoreflect.EnumType {
	return &file_lab_device_proto_enumTypes[0]
}

func (x DeviceUnderTest_DUTPool) Number() protoreflect.EnumNumber {
	return protoreflect.EnumNumber(x)
}

// Deprecated: Use DeviceUnderTest_DUTPool.Descriptor instead.
func (DeviceUnderTest_DUTPool) EnumDescriptor() ([]byte, []int) {
	return file_lab_device_proto_rawDescGZIP(), []int{1, 0}
}

// Next Tag: 7
type ChromeOSDevice struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// 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 assignable to Device:
	//	*ChromeOSDevice_Dut
	//	*ChromeOSDevice_Labstation
	Device isChromeOSDevice_Device `protobuf_oneof:"device"`
}

func (x *ChromeOSDevice) Reset() {
	*x = ChromeOSDevice{}
	if protoimpl.UnsafeEnabled {
		mi := &file_lab_device_proto_msgTypes[0]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *ChromeOSDevice) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*ChromeOSDevice) ProtoMessage() {}

func (x *ChromeOSDevice) ProtoReflect() protoreflect.Message {
	mi := &file_lab_device_proto_msgTypes[0]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use ChromeOSDevice.ProtoReflect.Descriptor instead.
func (*ChromeOSDevice) Descriptor() ([]byte, []int) {
	return file_lab_device_proto_rawDescGZIP(), []int{0}
}

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

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

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

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

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

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

func (x *ChromeOSDevice) GetLabstation() *Labstation {
	if x, ok := x.GetDevice().(*ChromeOSDevice_Labstation); ok {
		return x.Labstation
	}
	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() {}

// Next Tag: 6
type DeviceUnderTest struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

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

func (x *DeviceUnderTest) Reset() {
	*x = DeviceUnderTest{}
	if protoimpl.UnsafeEnabled {
		mi := &file_lab_device_proto_msgTypes[1]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *DeviceUnderTest) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*DeviceUnderTest) ProtoMessage() {}

func (x *DeviceUnderTest) ProtoReflect() protoreflect.Message {
	mi := &file_lab_device_proto_msgTypes[1]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use DeviceUnderTest.ProtoReflect.Descriptor instead.
func (*DeviceUnderTest) Descriptor() ([]byte, []int) {
	return file_lab_device_proto_rawDescGZIP(), []int{1}
}

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

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

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

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

func (x *DeviceUnderTest) GetLicenses() []*License {
	if x != nil {
		return x.Licenses
	}
	return nil
}

// Next Tag: 5
type Labstation struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

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

func (x *Labstation) Reset() {
	*x = Labstation{}
	if protoimpl.UnsafeEnabled {
		mi := &file_lab_device_proto_msgTypes[2]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *Labstation) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*Labstation) ProtoMessage() {}

func (x *Labstation) ProtoReflect() protoreflect.Message {
	mi := &file_lab_device_proto_msgTypes[2]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use Labstation.ProtoReflect.Descriptor instead.
func (*Labstation) Descriptor() ([]byte, []int) {
	return file_lab_device_proto_rawDescGZIP(), []int{2}
}

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

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

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

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

var File_lab_device_proto protoreflect.FileDescriptor

var file_lab_device_proto_rawDesc = []byte{
	0x0a, 0x10, 0x6c, 0x61, 0x62, 0x2f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x70, 0x72, 0x6f,
	0x74, 0x6f, 0x12, 0x03, 0x6c, 0x61, 0x62, 0x1a, 0x16, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x2f,
	0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x5f, 0x69, 0x64, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a,
	0x1c, 0x6c, 0x61, 0x62, 0x2f, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x65, 0x6f, 0x73, 0x5f, 0x64, 0x65,
	0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x11, 0x6c,
	0x61, 0x62, 0x2f, 0x6c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,
	0x1a, 0x15, 0x6c, 0x61, 0x62, 0x2f, 0x70, 0x65, 0x72, 0x69, 0x70, 0x68, 0x65, 0x72, 0x61, 0x6c,
	0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x0f, 0x6c, 0x61, 0x62, 0x2f, 0x73, 0x65, 0x72,
	0x76, 0x6f, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1d, 0x6d, 0x61, 0x6e, 0x75, 0x66, 0x61,
	0x63, 0x74, 0x75, 0x72, 0x69, 0x6e, 0x67, 0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x5f, 0x69,
	0x64, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xc3, 0x02, 0x0a, 0x0e, 0x43, 0x68, 0x72, 0x6f,
	0x6d, 0x65, 0x4f, 0x53, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x12, 0x25, 0x0a, 0x02, 0x69, 0x64,
	0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x6c, 0x61, 0x62, 0x2e, 0x43, 0x68, 0x72,
	0x6f, 0x6d, 0x65, 0x4f, 0x53, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x44, 0x52, 0x02, 0x69,
	0x64, 0x12, 0x23, 0x0a, 0x0d, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x5f, 0x6e, 0x75, 0x6d, 0x62,
	0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c,
	0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x42, 0x0a, 0x10, 0x6d, 0x61, 0x6e, 0x75, 0x66, 0x61,
	0x63, 0x74, 0x75, 0x72, 0x69, 0x6e, 0x67, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b,
	0x32, 0x17, 0x2e, 0x6d, 0x61, 0x6e, 0x75, 0x66, 0x61, 0x63, 0x74, 0x75, 0x72, 0x69, 0x6e, 0x67,
	0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x49, 0x44, 0x52, 0x0f, 0x6d, 0x61, 0x6e, 0x75, 0x66,
	0x61, 0x63, 0x74, 0x75, 0x72, 0x69, 0x6e, 0x67, 0x49, 0x64, 0x12, 0x3a, 0x0a, 0x10, 0x64, 0x65,
	0x76, 0x69, 0x63, 0x65, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x5f, 0x69, 0x64, 0x18, 0x04,
	0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x43, 0x6f,
	0x6e, 0x66, 0x69, 0x67, 0x49, 0x64, 0x52, 0x0e, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x43, 0x6f,
	0x6e, 0x66, 0x69, 0x67, 0x49, 0x64, 0x12, 0x28, 0x0a, 0x03, 0x64, 0x75, 0x74, 0x18, 0x05, 0x20,
	0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x6c, 0x61, 0x62, 0x2e, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65,
	0x55, 0x6e, 0x64, 0x65, 0x72, 0x54, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x03, 0x64, 0x75, 0x74,
	0x12, 0x31, 0x0a, 0x0a, 0x6c, 0x61, 0x62, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x06,
	0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x6c, 0x61, 0x62, 0x2e, 0x4c, 0x61, 0x62, 0x73, 0x74,
	0x61, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x00, 0x52, 0x0a, 0x6c, 0x61, 0x62, 0x73, 0x74, 0x61, 0x74,
	0x69, 0x6f, 0x6e, 0x42, 0x08, 0x0a, 0x06, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x22, 0xb6, 0x03,
	0x0a, 0x0f, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x55, 0x6e, 0x64, 0x65, 0x72, 0x54, 0x65, 0x73,
	0x74, 0x12, 0x1a, 0x0a, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20,
	0x01, 0x28, 0x09, 0x52, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x32, 0x0a,
	0x0b, 0x70, 0x65, 0x72, 0x69, 0x70, 0x68, 0x65, 0x72, 0x61, 0x6c, 0x73, 0x18, 0x02, 0x20, 0x01,
	0x28, 0x0b, 0x32, 0x10, 0x2e, 0x6c, 0x61, 0x62, 0x2e, 0x50, 0x65, 0x72, 0x69, 0x70, 0x68, 0x65,
	0x72, 0x61, 0x6c, 0x73, 0x52, 0x0b, 0x70, 0x65, 0x72, 0x69, 0x70, 0x68, 0x65, 0x72, 0x61, 0x6c,
	0x73, 0x12, 0x43, 0x0a, 0x0e, 0x63, 0x72, 0x69, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x5f, 0x70, 0x6f,
	0x6f, 0x6c, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x1c, 0x2e, 0x6c, 0x61, 0x62, 0x2e,
	0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x55, 0x6e, 0x64, 0x65, 0x72, 0x54, 0x65, 0x73, 0x74, 0x2e,
	0x44, 0x55, 0x54, 0x50, 0x6f, 0x6f, 0x6c, 0x52, 0x0d, 0x63, 0x72, 0x69, 0x74, 0x69, 0x63, 0x61,
	0x6c, 0x50, 0x6f, 0x6f, 0x6c, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x6f, 0x6f, 0x6c, 0x73, 0x18,
	0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x70, 0x6f, 0x6f, 0x6c, 0x73, 0x12, 0x28, 0x0a, 0x08,
	0x6c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0c,
	0x2e, 0x6c, 0x61, 0x62, 0x2e, 0x4c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x52, 0x08, 0x6c, 0x69,
	0x63, 0x65, 0x6e, 0x73, 0x65, 0x73, 0x22, 0xcd, 0x01, 0x0a, 0x07, 0x44, 0x55, 0x54, 0x50, 0x6f,
	0x6f, 0x6c, 0x12, 0x14, 0x0a, 0x10, 0x44, 0x55, 0x54, 0x5f, 0x50, 0x4f, 0x4f, 0x4c, 0x5f, 0x49,
	0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x10, 0x00, 0x12, 0x0f, 0x0a, 0x0b, 0x44, 0x55, 0x54, 0x5f,
	0x50, 0x4f, 0x4f, 0x4c, 0x5f, 0x43, 0x51, 0x10, 0x01, 0x12, 0x10, 0x0a, 0x0c, 0x44, 0x55, 0x54,
	0x5f, 0x50, 0x4f, 0x4f, 0x4c, 0x5f, 0x42, 0x56, 0x54, 0x10, 0x02, 0x12, 0x13, 0x0a, 0x0f, 0x44,
	0x55, 0x54, 0x5f, 0x50, 0x4f, 0x4f, 0x4c, 0x5f, 0x53, 0x55, 0x49, 0x54, 0x45, 0x53, 0x10, 0x03,
	0x12, 0x10, 0x0a, 0x0c, 0x44, 0x55, 0x54, 0x5f, 0x50, 0x4f, 0x4f, 0x4c, 0x5f, 0x43, 0x54, 0x53,
	0x10, 0x04, 0x12, 0x19, 0x0a, 0x15, 0x44, 0x55, 0x54, 0x5f, 0x50, 0x4f, 0x4f, 0x4c, 0x5f, 0x43,
	0x54, 0x53, 0x5f, 0x50, 0x45, 0x52, 0x42, 0x55, 0x49, 0x4c, 0x44, 0x10, 0x05, 0x12, 0x17, 0x0a,
	0x13, 0x44, 0x55, 0x54, 0x5f, 0x50, 0x4f, 0x4f, 0x4c, 0x5f, 0x43, 0x4f, 0x4e, 0x54, 0x49, 0x4e,
	0x55, 0x4f, 0x55, 0x53, 0x10, 0x06, 0x12, 0x1a, 0x0a, 0x16, 0x44, 0x55, 0x54, 0x5f, 0x50, 0x4f,
	0x4f, 0x4c, 0x5f, 0x41, 0x52, 0x43, 0x5f, 0x50, 0x52, 0x45, 0x53, 0x55, 0x42, 0x4d, 0x49, 0x54,
	0x10, 0x07, 0x12, 0x12, 0x0a, 0x0e, 0x44, 0x55, 0x54, 0x5f, 0x50, 0x4f, 0x4f, 0x4c, 0x5f, 0x51,
	0x55, 0x4f, 0x54, 0x41, 0x10, 0x08, 0x22, 0x7e, 0x0a, 0x0a, 0x4c, 0x61, 0x62, 0x73, 0x74, 0x61,
	0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65,
	0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65,
	0x12, 0x22, 0x0a, 0x06, 0x73, 0x65, 0x72, 0x76, 0x6f, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b,
	0x32, 0x0a, 0x2e, 0x6c, 0x61, 0x62, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x6f, 0x52, 0x06, 0x73, 0x65,
	0x72, 0x76, 0x6f, 0x73, 0x12, 0x1a, 0x0a, 0x03, 0x72, 0x70, 0x6d, 0x18, 0x03, 0x20, 0x01, 0x28,
	0x0b, 0x32, 0x08, 0x2e, 0x6c, 0x61, 0x62, 0x2e, 0x52, 0x50, 0x4d, 0x52, 0x03, 0x72, 0x70, 0x6d,
	0x12, 0x14, 0x0a, 0x05, 0x70, 0x6f, 0x6f, 0x6c, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52,
	0x05, 0x70, 0x6f, 0x6f, 0x6c, 0x73, 0x42, 0x2f, 0x5a, 0x2d, 0x67, 0x6f, 0x2e, 0x63, 0x68, 0x72,
	0x6f, 0x6d, 0x69, 0x75, 0x6d, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69,
	0x75, 0x6d, 0x6f, 0x73, 0x2f, 0x69, 0x6e, 0x66, 0x72, 0x61, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f,
	0x2f, 0x67, 0x6f, 0x2f, 0x6c, 0x61, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
}

var (
	file_lab_device_proto_rawDescOnce sync.Once
	file_lab_device_proto_rawDescData = file_lab_device_proto_rawDesc
)

func file_lab_device_proto_rawDescGZIP() []byte {
	file_lab_device_proto_rawDescOnce.Do(func() {
		file_lab_device_proto_rawDescData = protoimpl.X.CompressGZIP(file_lab_device_proto_rawDescData)
	})
	return file_lab_device_proto_rawDescData
}

var file_lab_device_proto_enumTypes = make([]protoimpl.EnumInfo, 1)
var file_lab_device_proto_msgTypes = make([]protoimpl.MessageInfo, 3)
var file_lab_device_proto_goTypes = []interface{}{
	(DeviceUnderTest_DUTPool)(0),   // 0: lab.DeviceUnderTest.DUTPool
	(*ChromeOSDevice)(nil),         // 1: lab.ChromeOSDevice
	(*DeviceUnderTest)(nil),        // 2: lab.DeviceUnderTest
	(*Labstation)(nil),             // 3: lab.Labstation
	(*ChromeOSDeviceID)(nil),       // 4: lab.ChromeOSDeviceID
	(*manufacturing.ConfigID)(nil), // 5: manufacturing.ConfigID
	(*device.ConfigId)(nil),        // 6: device.ConfigId
	(*Peripherals)(nil),            // 7: lab.Peripherals
	(*License)(nil),                // 8: lab.License
	(*Servo)(nil),                  // 9: lab.Servo
	(*RPM)(nil),                    // 10: lab.RPM
}
var file_lab_device_proto_depIdxs = []int32{
	4,  // 0: lab.ChromeOSDevice.id:type_name -> lab.ChromeOSDeviceID
	5,  // 1: lab.ChromeOSDevice.manufacturing_id:type_name -> manufacturing.ConfigID
	6,  // 2: lab.ChromeOSDevice.device_config_id:type_name -> device.ConfigId
	2,  // 3: lab.ChromeOSDevice.dut:type_name -> lab.DeviceUnderTest
	3,  // 4: lab.ChromeOSDevice.labstation:type_name -> lab.Labstation
	7,  // 5: lab.DeviceUnderTest.peripherals:type_name -> lab.Peripherals
	0,  // 6: lab.DeviceUnderTest.critical_pools:type_name -> lab.DeviceUnderTest.DUTPool
	8,  // 7: lab.DeviceUnderTest.licenses:type_name -> lab.License
	9,  // 8: lab.Labstation.servos:type_name -> lab.Servo
	10, // 9: lab.Labstation.rpm:type_name -> lab.RPM
	10, // [10:10] is the sub-list for method output_type
	10, // [10:10] is the sub-list for method input_type
	10, // [10:10] is the sub-list for extension type_name
	10, // [10:10] is the sub-list for extension extendee
	0,  // [0:10] is the sub-list for field type_name
}

func init() { file_lab_device_proto_init() }
func file_lab_device_proto_init() {
	if File_lab_device_proto != nil {
		return
	}
	file_lab_chromeos_device_id_proto_init()
	file_lab_license_proto_init()
	file_lab_peripherals_proto_init()
	file_lab_servo_proto_init()
	if !protoimpl.UnsafeEnabled {
		file_lab_device_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*ChromeOSDevice); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_lab_device_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*DeviceUnderTest); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_lab_device_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*Labstation); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
	}
	file_lab_device_proto_msgTypes[0].OneofWrappers = []interface{}{
		(*ChromeOSDevice_Dut)(nil),
		(*ChromeOSDevice_Labstation)(nil),
	}
	type x struct{}
	out := protoimpl.TypeBuilder{
		File: protoimpl.DescBuilder{
			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
			RawDescriptor: file_lab_device_proto_rawDesc,
			NumEnums:      1,
			NumMessages:   3,
			NumExtensions: 0,
			NumServices:   0,
		},
		GoTypes:           file_lab_device_proto_goTypes,
		DependencyIndexes: file_lab_device_proto_depIdxs,
		EnumInfos:         file_lab_device_proto_enumTypes,
		MessageInfos:      file_lab_device_proto_msgTypes,
	}.Build()
	File_lab_device_proto = out.File
	file_lab_device_proto_rawDesc = nil
	file_lab_device_proto_goTypes = nil
	file_lab_device_proto_depIdxs = nil
}
