// Code generated by protoc-gen-go. DO NOT EDIT.
// source: lab_platform/dut_state.proto

package lab_platform

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

// DutState defines the structure of the file used to cache variable DUT
// information on the drone.
type DutState struct {
	// DUT health description, e.g. "ready", "needs_repair" etc.
	State string `protobuf:"bytes,1,opt,name=state,proto3" json:"state,omitempty"`
	// OS and/or fw versions installed on the DUT, e.g.
	// {"cros-version":"terra-release/R75-12105.108.0"}.
	// Used to construct variable bot dimensions.
	ProvisionableLabels map[string]string `protobuf:"bytes,2,rep,name=provisionable_labels,proto3" json:"provisionable_labels,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
	// Variable DUT attributes, e.g.
	// {"job_repo_url":"http://devserver_ip:8082/static/terra-release/R75-12105.108.0/autotest/packages"}.
	// Are fed into the Autotest harness via the host info file.
	ProvisionableAttributes map[string]string `protobuf:"bytes,3,rep,name=provisionable_attributes,proto3" json:"provisionable_attributes,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
	XXX_NoUnkeyedLiteral    struct{}          `json:"-"`
	XXX_unrecognized        []byte            `json:"-"`
	XXX_sizecache           int32             `json:"-"`
}

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

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

var xxx_messageInfo_DutState proto.InternalMessageInfo

func (m *DutState) GetState() string {
	if m != nil {
		return m.State
	}
	return ""
}

func (m *DutState) GetProvisionableLabels() map[string]string {
	if m != nil {
		return m.ProvisionableLabels
	}
	return nil
}

func (m *DutState) GetProvisionableAttributes() map[string]string {
	if m != nil {
		return m.ProvisionableAttributes
	}
	return nil
}

func init() {
	proto.RegisterType((*DutState)(nil), "lab_platform.DutState")
	proto.RegisterMapType((map[string]string)(nil), "lab_platform.DutState.ProvisionableAttributesEntry")
	proto.RegisterMapType((map[string]string)(nil), "lab_platform.DutState.ProvisionableLabelsEntry")
}

func init() { proto.RegisterFile("lab_platform/dut_state.proto", fileDescriptor_5e0c46a52ec0fb7d) }

var fileDescriptor_5e0c46a52ec0fb7d = []byte{
	// 257 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x92, 0xc9, 0x49, 0x4c, 0x8a,
	0x2f, 0xc8, 0x49, 0x2c, 0x49, 0xcb, 0x2f, 0xca, 0xd5, 0x4f, 0x29, 0x2d, 0x89, 0x2f, 0x2e, 0x49,
	0x2c, 0x49, 0xd5, 0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x17, 0xe2, 0x41, 0x96, 0x55, 0xea, 0x62, 0xe6,
	0xe2, 0x70, 0x29, 0x2d, 0x09, 0x06, 0x29, 0x10, 0x12, 0xe1, 0x62, 0x05, 0xab, 0x94, 0x60, 0x54,
	0x60, 0xd4, 0xe0, 0x0c, 0x82, 0x70, 0x84, 0x92, 0xb9, 0x44, 0x0a, 0x8a, 0xf2, 0xcb, 0x32, 0x8b,
	0x33, 0xf3, 0xf3, 0x12, 0x93, 0x72, 0x52, 0xe3, 0x73, 0x12, 0x93, 0x52, 0x73, 0x8a, 0x25, 0x98,
	0x14, 0x98, 0x35, 0xb8, 0x8d, 0xf4, 0xf5, 0x90, 0xcd, 0xd3, 0x83, 0x99, 0xa5, 0x17, 0x80, 0xac,
	0xc5, 0x07, 0xac, 0xc3, 0x35, 0xaf, 0xa4, 0xa8, 0x32, 0x08, 0xab, 0x61, 0x42, 0xf9, 0x5c, 0x12,
	0xa8, 0xe2, 0x89, 0x25, 0x25, 0x45, 0x99, 0x49, 0xa5, 0x25, 0xa9, 0xc5, 0x12, 0xcc, 0x60, 0x8b,
	0x8c, 0x89, 0xb1, 0xc8, 0x11, 0xae, 0x0b, 0x62, 0x19, 0x4e, 0x43, 0xa5, 0xdc, 0xb8, 0x24, 0x70,
	0x39, 0x51, 0x48, 0x80, 0x8b, 0x39, 0x3b, 0xb5, 0x12, 0x1a, 0x0a, 0x20, 0x26, 0x28, 0x64, 0xca,
	0x12, 0x73, 0x4a, 0x53, 0x25, 0x98, 0x20, 0x21, 0x03, 0xe6, 0x58, 0x31, 0x59, 0x30, 0x4a, 0x79,
	0x71, 0xc9, 0xe0, 0x73, 0x01, 0x29, 0x66, 0x39, 0x59, 0x44, 0x99, 0xa5, 0xe7, 0xeb, 0x25, 0x67,
	0x14, 0xe5, 0xe7, 0x66, 0x96, 0xe6, 0xea, 0xe5, 0x17, 0xa5, 0xeb, 0xc3, 0x38, 0xf9, 0xc5, 0xfa,
	0x99, 0x79, 0x69, 0x45, 0x89, 0xfa, 0xe0, 0x48, 0xd4, 0x4f, 0xcf, 0xd7, 0x47, 0x0e, 0x8d, 0x24,
	0x36, 0xb0, 0xb0, 0x31, 0x20, 0x00, 0x00, 0xff, 0xff, 0xf8, 0xda, 0x19, 0x1c, 0xfb, 0x01, 0x00,
	0x00,
}
