// Copyright 2021 The ChromiumOS Authors
// 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.27.1
// 	protoc        v3.17.1
// source: lab/managed_dut.proto

package lab

import (
	_go "go.chromium.org/chromiumos/config/go"
	api1 "go.chromium.org/chromiumos/config/go/api"
	api "go.chromium.org/chromiumos/config/go/test/api"
	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
	timestamppb "google.golang.org/protobuf/types/known/timestamppb"
	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)
)

type ManagedDut_ManagedState int32

const (
	ManagedDut_UNKNOWN   ManagedDut_ManagedState = 0
	ManagedDut_READY     ManagedDut_ManagedState = 1 // AIP says use ACTIVE - but in this context I disagree.
	ManagedDut_PROVISION ManagedDut_ManagedState = 2
	ManagedDut_VERIFY    ManagedDut_ManagedState = 3
	ManagedDut_LEASED    ManagedDut_ManagedState = 4
	ManagedDut_FAILED    ManagedDut_ManagedState = 5
	ManagedDut_RESET     ManagedDut_ManagedState = 6
)

// Enum value maps for ManagedDut_ManagedState.
var (
	ManagedDut_ManagedState_name = map[int32]string{
		0: "UNKNOWN",
		1: "READY",
		2: "PROVISION",
		3: "VERIFY",
		4: "LEASED",
		5: "FAILED",
		6: "RESET",
	}
	ManagedDut_ManagedState_value = map[string]int32{
		"UNKNOWN":   0,
		"READY":     1,
		"PROVISION": 2,
		"VERIFY":    3,
		"LEASED":    4,
		"FAILED":    5,
		"RESET":     6,
	}
)

func (x ManagedDut_ManagedState) Enum() *ManagedDut_ManagedState {
	p := new(ManagedDut_ManagedState)
	*p = x
	return p
}

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

func (ManagedDut_ManagedState) Descriptor() protoreflect.EnumDescriptor {
	return file_lab_managed_dut_proto_enumTypes[0].Descriptor()
}

func (ManagedDut_ManagedState) Type() protoreflect.EnumType {
	return &file_lab_managed_dut_proto_enumTypes[0]
}

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

// Deprecated: Use ManagedDut_ManagedState.Descriptor instead.
func (ManagedDut_ManagedState) EnumDescriptor() ([]byte, []int) {
	return file_lab_managed_dut_proto_rawDescGZIP(), []int{4, 0}
}

type HistoryRecord struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	State      ManagedDut_ManagedState `protobuf:"varint,1,opt,name=state,proto3,enum=lab.ManagedDut_ManagedState" json:"state,omitempty"`
	StartTime  *timestamppb.Timestamp  `protobuf:"bytes,2,opt,name=start_time,json=startTime,proto3" json:"start_time,omitempty"`
	EndTime    *timestamppb.Timestamp  `protobuf:"bytes,3,opt,name=end_time,json=endTime,proto3" json:"end_time,omitempty"`
	Note       string                  `protobuf:"bytes,4,opt,name=note,proto3" json:"note,omitempty"`
	LeaseOwner string                  `protobuf:"bytes,5,opt,name=lease_owner,json=leaseOwner,proto3" json:"lease_owner,omitempty"`
}

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

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

func (*HistoryRecord) ProtoMessage() {}

func (x *HistoryRecord) ProtoReflect() protoreflect.Message {
	mi := &file_lab_managed_dut_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 HistoryRecord.ProtoReflect.Descriptor instead.
func (*HistoryRecord) Descriptor() ([]byte, []int) {
	return file_lab_managed_dut_proto_rawDescGZIP(), []int{0}
}

func (x *HistoryRecord) GetState() ManagedDut_ManagedState {
	if x != nil {
		return x.State
	}
	return ManagedDut_UNKNOWN
}

func (x *HistoryRecord) GetStartTime() *timestamppb.Timestamp {
	if x != nil {
		return x.StartTime
	}
	return nil
}

func (x *HistoryRecord) GetEndTime() *timestamppb.Timestamp {
	if x != nil {
		return x.EndTime
	}
	return nil
}

func (x *HistoryRecord) GetNote() string {
	if x != nil {
		return x.Note
	}
	return ""
}

func (x *HistoryRecord) GetLeaseOwner() string {
	if x != nil {
		return x.LeaseOwner
	}
	return ""
}

type Lock struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	Reason string `protobuf:"bytes,1,opt,name=reason,proto3" json:"reason,omitempty"`
}

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

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

func (*Lock) ProtoMessage() {}

func (x *Lock) ProtoReflect() protoreflect.Message {
	mi := &file_lab_managed_dut_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 Lock.ProtoReflect.Descriptor instead.
func (*Lock) Descriptor() ([]byte, []int) {
	return file_lab_managed_dut_proto_rawDescGZIP(), []int{1}
}

func (x *Lock) GetReason() string {
	if x != nil {
		return x.Reason
	}
	return ""
}

type Pool struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
}

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

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

func (*Pool) ProtoMessage() {}

func (x *Pool) ProtoReflect() protoreflect.Message {
	mi := &file_lab_managed_dut_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 Pool.ProtoReflect.Descriptor instead.
func (*Pool) Descriptor() ([]byte, []int) {
	return file_lab_managed_dut_proto_rawDescGZIP(), []int{2}
}

func (x *Pool) GetName() string {
	if x != nil {
		return x.Name
	}
	return ""
}

type NetworkIdentifier struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Types that are assignable to Identifier:
	//	*NetworkIdentifier_IpAddress
	//	*NetworkIdentifier_Hostname
	Identifier isNetworkIdentifier_Identifier `protobuf_oneof:"identifier"`
}

func (x *NetworkIdentifier) Reset() {
	*x = NetworkIdentifier{}
	if protoimpl.UnsafeEnabled {
		mi := &file_lab_managed_dut_proto_msgTypes[3]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

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

func (*NetworkIdentifier) ProtoMessage() {}

func (x *NetworkIdentifier) ProtoReflect() protoreflect.Message {
	mi := &file_lab_managed_dut_proto_msgTypes[3]
	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 NetworkIdentifier.ProtoReflect.Descriptor instead.
func (*NetworkIdentifier) Descriptor() ([]byte, []int) {
	return file_lab_managed_dut_proto_rawDescGZIP(), []int{3}
}

func (m *NetworkIdentifier) GetIdentifier() isNetworkIdentifier_Identifier {
	if m != nil {
		return m.Identifier
	}
	return nil
}

func (x *NetworkIdentifier) GetIpAddress() string {
	if x, ok := x.GetIdentifier().(*NetworkIdentifier_IpAddress); ok {
		return x.IpAddress
	}
	return ""
}

func (x *NetworkIdentifier) GetHostname() string {
	if x, ok := x.GetIdentifier().(*NetworkIdentifier_Hostname); ok {
		return x.Hostname
	}
	return ""
}

type isNetworkIdentifier_Identifier interface {
	isNetworkIdentifier_Identifier()
}

type NetworkIdentifier_IpAddress struct {
	IpAddress string `protobuf:"bytes,1,opt,name=ip_address,json=ipAddress,proto3,oneof"`
}

type NetworkIdentifier_Hostname struct {
	Hostname string `protobuf:"bytes,2,opt,name=hostname,proto3,oneof"`
}

func (*NetworkIdentifier_IpAddress) isNetworkIdentifier_Identifier() {}

func (*NetworkIdentifier_Hostname) isNetworkIdentifier_Identifier() {}

type ManagedDut struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	Name        *NetworkIdentifier `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` // Hostname or IP address or other network identifier.
	DisplayName string             `protobuf:"bytes,2,opt,name=display_name,json=displayName,proto3" json:"display_name,omitempty"`
	// Arbitrary test fields describing characteristics of a Dut that are used
	// Tests, specify similar tags for test constraints e.g. touchscreen these
	// tags are used to match a Dut to a test.
	Tag *api.DutAttributeList `protobuf:"bytes,3,opt,name=tag,proto3" json:"tag,omitempty"`
	// Pools are just arbitrary groupings of Duts useful for test scheduling.
	// for example allowing a lab to split half the devices for one particular
	// test suite and the rest for a different.
	// Pools are really just arbitrary strings and could be in the tags field,
	// but for better user administration of pools it is better to keep them
	// separate.
	Pool []*Pool `protobuf:"bytes,4,rep,name=pool,proto3" json:"pool,omitempty"`
	// Tags that detail if a Dut has a particular periheral or not, example
	// servo.   These again are kept separate from generic tags for ease of
	// administration.
	Peripheral                 *api.DutAttributeList   `protobuf:"bytes,5,opt,name=peripheral,proto3" json:"peripheral,omitempty"` // Labels that users configure for servo etc.
	MfgConfigId                *api1.MfgConfigId       `protobuf:"bytes,6,opt,name=mfg_config_id,json=mfgConfigId,proto3" json:"mfg_config_id,omitempty"`
	ProvisionedBuild           *_go.StoragePath        `protobuf:"bytes,7,opt,name=provisioned_build,json=provisionedBuild,proto3" json:"provisioned_build,omitempty"` // provision_service.proto
	State                      ManagedDut_ManagedState `protobuf:"varint,8,opt,name=state,proto3,enum=lab.ManagedDut_ManagedState" json:"state,omitempty"`
	Lock                       *Lock                   `protobuf:"bytes,9,opt,name=lock,proto3" json:"lock,omitempty"`                                                                                  // A lock can be in any state, so it is a separate field.
	OperatorNotes              string                  `protobuf:"bytes,10,opt,name=operator_notes,json=operatorNotes,proto3" json:"operator_notes,omitempty"`                                          // Lock reason or any other free text information.
	ProvisionedFirmwareVersion string                  `protobuf:"bytes,11,opt,name=provisioned_firmware_version,json=provisionedFirmwareVersion,proto3" json:"provisioned_firmware_version,omitempty"` // Current Dut RW firmware.
	History                    []*HistoryRecord        `protobuf:"bytes,12,rep,name=history,proto3" json:"history,omitempty"`                                                                           // State changes over time.
	// DUT's that are associated ( close by ) this DUT, the string should
	// be a network identifier and the DUT should be known to the DUT
	// Manager. Schedulers that wish to give the assoiciated Dut to a test
	// must obtain a lease on that Dut.
	AssociatedDut   []*NetworkIdentifier `protobuf:"bytes,13,rep,name=associated_dut,json=associatedDut,proto3" json:"associated_dut,omitempty"`
	IsAssociatedDut bool                 `protobuf:"varint,14,opt,name=is_associated_dut,json=isAssociatedDut,proto3" json:"is_associated_dut,omitempty"` // Associated DUT's should be excluded from general lease requests ?
}

func (x *ManagedDut) Reset() {
	*x = ManagedDut{}
	if protoimpl.UnsafeEnabled {
		mi := &file_lab_managed_dut_proto_msgTypes[4]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

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

func (*ManagedDut) ProtoMessage() {}

func (x *ManagedDut) ProtoReflect() protoreflect.Message {
	mi := &file_lab_managed_dut_proto_msgTypes[4]
	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 ManagedDut.ProtoReflect.Descriptor instead.
func (*ManagedDut) Descriptor() ([]byte, []int) {
	return file_lab_managed_dut_proto_rawDescGZIP(), []int{4}
}

func (x *ManagedDut) GetName() *NetworkIdentifier {
	if x != nil {
		return x.Name
	}
	return nil
}

func (x *ManagedDut) GetDisplayName() string {
	if x != nil {
		return x.DisplayName
	}
	return ""
}

func (x *ManagedDut) GetTag() *api.DutAttributeList {
	if x != nil {
		return x.Tag
	}
	return nil
}

func (x *ManagedDut) GetPool() []*Pool {
	if x != nil {
		return x.Pool
	}
	return nil
}

func (x *ManagedDut) GetPeripheral() *api.DutAttributeList {
	if x != nil {
		return x.Peripheral
	}
	return nil
}

func (x *ManagedDut) GetMfgConfigId() *api1.MfgConfigId {
	if x != nil {
		return x.MfgConfigId
	}
	return nil
}

func (x *ManagedDut) GetProvisionedBuild() *_go.StoragePath {
	if x != nil {
		return x.ProvisionedBuild
	}
	return nil
}

func (x *ManagedDut) GetState() ManagedDut_ManagedState {
	if x != nil {
		return x.State
	}
	return ManagedDut_UNKNOWN
}

func (x *ManagedDut) GetLock() *Lock {
	if x != nil {
		return x.Lock
	}
	return nil
}

func (x *ManagedDut) GetOperatorNotes() string {
	if x != nil {
		return x.OperatorNotes
	}
	return ""
}

func (x *ManagedDut) GetProvisionedFirmwareVersion() string {
	if x != nil {
		return x.ProvisionedFirmwareVersion
	}
	return ""
}

func (x *ManagedDut) GetHistory() []*HistoryRecord {
	if x != nil {
		return x.History
	}
	return nil
}

func (x *ManagedDut) GetAssociatedDut() []*NetworkIdentifier {
	if x != nil {
		return x.AssociatedDut
	}
	return nil
}

func (x *ManagedDut) GetIsAssociatedDut() bool {
	if x != nil {
		return x.IsAssociatedDut
	}
	return false
}

var File_lab_managed_dut_proto protoreflect.FileDescriptor

var file_lab_managed_dut_proto_rawDesc = []byte{
	0x0a, 0x15, 0x6c, 0x61, 0x62, 0x2f, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x64, 0x5f, 0x64, 0x75,
	0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x03, 0x6c, 0x61, 0x62, 0x1a, 0x1f, 0x67, 0x6f,
	0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x74, 0x69,
	0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x27, 0x63,
	0x68, 0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d, 0x6f, 0x73, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x2f, 0x61,
	0x70, 0x69, 0x2f, 0x64, 0x75, 0x74, 0x5f, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65,
	0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1d, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d,
	0x6f, 0x73, 0x2f, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x2e,
	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x29, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d, 0x6f,
	0x73, 0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x6d, 0x66, 0x67,
	0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x5f, 0x69, 0x64, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,
	0x22, 0xea, 0x01, 0x0a, 0x0d, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x63, 0x6f,
	0x72, 0x64, 0x12, 0x32, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28,
	0x0e, 0x32, 0x1c, 0x2e, 0x6c, 0x61, 0x62, 0x2e, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x64, 0x44,
	0x75, 0x74, 0x2e, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52,
	0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x39, 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f,
	0x74, 0x69, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f,
	0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d,
	0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, 0x54, 0x69, 0x6d,
	0x65, 0x12, 0x35, 0x0a, 0x08, 0x65, 0x6e, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x03, 0x20,
	0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f,
	0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52,
	0x07, 0x65, 0x6e, 0x64, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x6f, 0x74, 0x65,
	0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x6f, 0x74, 0x65, 0x12, 0x1f, 0x0a, 0x0b,
	0x6c, 0x65, 0x61, 0x73, 0x65, 0x5f, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28,
	0x09, 0x52, 0x0a, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x22, 0x1e, 0x0a,
	0x04, 0x4c, 0x6f, 0x63, 0x6b, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x18,
	0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x22, 0x1a, 0x0a,
	0x04, 0x50, 0x6f, 0x6f, 0x6c, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20,
	0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x60, 0x0a, 0x11, 0x4e, 0x65, 0x74,
	0x77, 0x6f, 0x72, 0x6b, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x12, 0x1f,
	0x0a, 0x0a, 0x69, 0x70, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01,
	0x28, 0x09, 0x48, 0x00, 0x52, 0x09, 0x69, 0x70, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12,
	0x1c, 0x0a, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28,
	0x09, 0x48, 0x00, 0x52, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x42, 0x0c, 0x0a,
	0x0a, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x22, 0xc3, 0x06, 0x0a, 0x0a,
	0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x64, 0x44, 0x75, 0x74, 0x12, 0x2a, 0x0a, 0x04, 0x6e, 0x61,
	0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6c, 0x61, 0x62, 0x2e, 0x4e,
	0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72,
	0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61,
	0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x69,
	0x73, 0x70, 0x6c, 0x61, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x37, 0x0a, 0x03, 0x74, 0x61, 0x67,
	0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x75,
	0x6d, 0x6f, 0x73, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x44, 0x75, 0x74,
	0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x03, 0x74,
	0x61, 0x67, 0x12, 0x1d, 0x0a, 0x04, 0x70, 0x6f, 0x6f, 0x6c, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b,
	0x32, 0x09, 0x2e, 0x6c, 0x61, 0x62, 0x2e, 0x50, 0x6f, 0x6f, 0x6c, 0x52, 0x04, 0x70, 0x6f, 0x6f,
	0x6c, 0x12, 0x45, 0x0a, 0x0a, 0x70, 0x65, 0x72, 0x69, 0x70, 0x68, 0x65, 0x72, 0x61, 0x6c, 0x18,
	0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d,
	0x6f, 0x73, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x44, 0x75, 0x74, 0x41,
	0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x0a, 0x70, 0x65,
	0x72, 0x69, 0x70, 0x68, 0x65, 0x72, 0x61, 0x6c, 0x12, 0x46, 0x0a, 0x0d, 0x6d, 0x66, 0x67, 0x5f,
	0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x5f, 0x69, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32,
	0x22, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d, 0x6f, 0x73, 0x2e, 0x63, 0x6f, 0x6e,
	0x66, 0x69, 0x67, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4d, 0x66, 0x67, 0x43, 0x6f, 0x6e, 0x66, 0x69,
	0x67, 0x49, 0x64, 0x52, 0x0b, 0x6d, 0x66, 0x67, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x49, 0x64,
	0x12, 0x44, 0x0a, 0x11, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x64, 0x5f,
	0x62, 0x75, 0x69, 0x6c, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x68,
	0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d, 0x6f, 0x73, 0x2e, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65,
	0x50, 0x61, 0x74, 0x68, 0x52, 0x10, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65,
	0x64, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x12, 0x32, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18,
	0x08, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1c, 0x2e, 0x6c, 0x61, 0x62, 0x2e, 0x4d, 0x61, 0x6e, 0x61,
	0x67, 0x65, 0x64, 0x44, 0x75, 0x74, 0x2e, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x64, 0x53, 0x74,
	0x61, 0x74, 0x65, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1d, 0x0a, 0x04, 0x6c, 0x6f,
	0x63, 0x6b, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x09, 0x2e, 0x6c, 0x61, 0x62, 0x2e, 0x4c,
	0x6f, 0x63, 0x6b, 0x52, 0x04, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x25, 0x0a, 0x0e, 0x6f, 0x70, 0x65,
	0x72, 0x61, 0x74, 0x6f, 0x72, 0x5f, 0x6e, 0x6f, 0x74, 0x65, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28,
	0x09, 0x52, 0x0d, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x4e, 0x6f, 0x74, 0x65, 0x73,
	0x12, 0x40, 0x0a, 0x1c, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x64, 0x5f,
	0x66, 0x69, 0x72, 0x6d, 0x77, 0x61, 0x72, 0x65, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e,
	0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x1a, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f,
	0x6e, 0x65, 0x64, 0x46, 0x69, 0x72, 0x6d, 0x77, 0x61, 0x72, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69,
	0x6f, 0x6e, 0x12, 0x2c, 0x0a, 0x07, 0x68, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x18, 0x0c, 0x20,
	0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x6c, 0x61, 0x62, 0x2e, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72,
	0x79, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x52, 0x07, 0x68, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79,
	0x12, 0x3d, 0x0a, 0x0e, 0x61, 0x73, 0x73, 0x6f, 0x63, 0x69, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x64,
	0x75, 0x74, 0x18, 0x0d, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6c, 0x61, 0x62, 0x2e, 0x4e,
	0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72,
	0x52, 0x0d, 0x61, 0x73, 0x73, 0x6f, 0x63, 0x69, 0x61, 0x74, 0x65, 0x64, 0x44, 0x75, 0x74, 0x12,
	0x2a, 0x0a, 0x11, 0x69, 0x73, 0x5f, 0x61, 0x73, 0x73, 0x6f, 0x63, 0x69, 0x61, 0x74, 0x65, 0x64,
	0x5f, 0x64, 0x75, 0x74, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x69, 0x73, 0x41, 0x73,
	0x73, 0x6f, 0x63, 0x69, 0x61, 0x74, 0x65, 0x64, 0x44, 0x75, 0x74, 0x22, 0x64, 0x0a, 0x0c, 0x4d,
	0x61, 0x6e, 0x61, 0x67, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x0b, 0x0a, 0x07, 0x55,
	0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x09, 0x0a, 0x05, 0x52, 0x45, 0x41, 0x44,
	0x59, 0x10, 0x01, 0x12, 0x0d, 0x0a, 0x09, 0x50, 0x52, 0x4f, 0x56, 0x49, 0x53, 0x49, 0x4f, 0x4e,
	0x10, 0x02, 0x12, 0x0a, 0x0a, 0x06, 0x56, 0x45, 0x52, 0x49, 0x46, 0x59, 0x10, 0x03, 0x12, 0x0a,
	0x0a, 0x06, 0x4c, 0x45, 0x41, 0x53, 0x45, 0x44, 0x10, 0x04, 0x12, 0x0a, 0x0a, 0x06, 0x46, 0x41,
	0x49, 0x4c, 0x45, 0x44, 0x10, 0x05, 0x12, 0x09, 0x0a, 0x05, 0x52, 0x45, 0x53, 0x45, 0x54, 0x10,
	0x06, 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_managed_dut_proto_rawDescOnce sync.Once
	file_lab_managed_dut_proto_rawDescData = file_lab_managed_dut_proto_rawDesc
)

func file_lab_managed_dut_proto_rawDescGZIP() []byte {
	file_lab_managed_dut_proto_rawDescOnce.Do(func() {
		file_lab_managed_dut_proto_rawDescData = protoimpl.X.CompressGZIP(file_lab_managed_dut_proto_rawDescData)
	})
	return file_lab_managed_dut_proto_rawDescData
}

var file_lab_managed_dut_proto_enumTypes = make([]protoimpl.EnumInfo, 1)
var file_lab_managed_dut_proto_msgTypes = make([]protoimpl.MessageInfo, 5)
var file_lab_managed_dut_proto_goTypes = []interface{}{
	(ManagedDut_ManagedState)(0),  // 0: lab.ManagedDut.ManagedState
	(*HistoryRecord)(nil),         // 1: lab.HistoryRecord
	(*Lock)(nil),                  // 2: lab.Lock
	(*Pool)(nil),                  // 3: lab.Pool
	(*NetworkIdentifier)(nil),     // 4: lab.NetworkIdentifier
	(*ManagedDut)(nil),            // 5: lab.ManagedDut
	(*timestamppb.Timestamp)(nil), // 6: google.protobuf.Timestamp
	(*api.DutAttributeList)(nil),  // 7: chromiumos.test.api.DutAttributeList
	(*api1.MfgConfigId)(nil),      // 8: chromiumos.config.api.MfgConfigId
	(*_go.StoragePath)(nil),       // 9: chromiumos.StoragePath
}
var file_lab_managed_dut_proto_depIdxs = []int32{
	0,  // 0: lab.HistoryRecord.state:type_name -> lab.ManagedDut.ManagedState
	6,  // 1: lab.HistoryRecord.start_time:type_name -> google.protobuf.Timestamp
	6,  // 2: lab.HistoryRecord.end_time:type_name -> google.protobuf.Timestamp
	4,  // 3: lab.ManagedDut.name:type_name -> lab.NetworkIdentifier
	7,  // 4: lab.ManagedDut.tag:type_name -> chromiumos.test.api.DutAttributeList
	3,  // 5: lab.ManagedDut.pool:type_name -> lab.Pool
	7,  // 6: lab.ManagedDut.peripheral:type_name -> chromiumos.test.api.DutAttributeList
	8,  // 7: lab.ManagedDut.mfg_config_id:type_name -> chromiumos.config.api.MfgConfigId
	9,  // 8: lab.ManagedDut.provisioned_build:type_name -> chromiumos.StoragePath
	0,  // 9: lab.ManagedDut.state:type_name -> lab.ManagedDut.ManagedState
	2,  // 10: lab.ManagedDut.lock:type_name -> lab.Lock
	1,  // 11: lab.ManagedDut.history:type_name -> lab.HistoryRecord
	4,  // 12: lab.ManagedDut.associated_dut:type_name -> lab.NetworkIdentifier
	13, // [13:13] is the sub-list for method output_type
	13, // [13:13] is the sub-list for method input_type
	13, // [13:13] is the sub-list for extension type_name
	13, // [13:13] is the sub-list for extension extendee
	0,  // [0:13] is the sub-list for field type_name
}

func init() { file_lab_managed_dut_proto_init() }
func file_lab_managed_dut_proto_init() {
	if File_lab_managed_dut_proto != nil {
		return
	}
	if !protoimpl.UnsafeEnabled {
		file_lab_managed_dut_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*HistoryRecord); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_lab_managed_dut_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*Lock); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_lab_managed_dut_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*Pool); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_lab_managed_dut_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*NetworkIdentifier); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_lab_managed_dut_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*ManagedDut); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
	}
	file_lab_managed_dut_proto_msgTypes[3].OneofWrappers = []interface{}{
		(*NetworkIdentifier_IpAddress)(nil),
		(*NetworkIdentifier_Hostname)(nil),
	}
	type x struct{}
	out := protoimpl.TypeBuilder{
		File: protoimpl.DescBuilder{
			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
			RawDescriptor: file_lab_managed_dut_proto_rawDesc,
			NumEnums:      1,
			NumMessages:   5,
			NumExtensions: 0,
			NumServices:   0,
		},
		GoTypes:           file_lab_managed_dut_proto_goTypes,
		DependencyIndexes: file_lab_managed_dut_proto_depIdxs,
		EnumInfos:         file_lab_managed_dut_proto_enumTypes,
		MessageInfos:      file_lab_managed_dut_proto_msgTypes,
	}.Build()
	File_lab_managed_dut_proto = out.File
	file_lab_managed_dut_proto_rawDesc = nil
	file_lab_managed_dut_proto_goTypes = nil
	file_lab_managed_dut_proto_depIdxs = nil
}
