// Code generated by protoc-gen-go. DO NOT EDIT.
// source: test_platform/skylab_local_state/multihost.proto

package skylab_local_state

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

// Host info and other necessary info to be shared by follower tasks in a
// multi-bot job
type MultiBotHostInfo struct {
	HostInfo *AutotestHostInfo `protobuf:"bytes,1,opt,name=host_info,json=hostInfo,proto3" json:"host_info,omitempty"`
	// DUT hostname.
	DutName              string   `protobuf:"bytes,2,opt,name=dut_name,json=dutName,proto3" json:"dut_name,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_MultiBotHostInfo proto.InternalMessageInfo

func (m *MultiBotHostInfo) GetHostInfo() *AutotestHostInfo {
	if m != nil {
		return m.HostInfo
	}
	return nil
}

func (m *MultiBotHostInfo) GetDutName() string {
	if m != nil {
		return m.DutName
	}
	return ""
}

func init() {
	proto.RegisterType((*MultiBotHostInfo)(nil), "test_platform.skylab_local_state.MultiBotHostInfo")
}

func init() {
	proto.RegisterFile("test_platform/skylab_local_state/multihost.proto", fileDescriptor_6bd165c2d6769b05)
}

var fileDescriptor_6bd165c2d6769b05 = []byte{
	// 211 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x84, 0x8f, 0x3f, 0x4f, 0x85, 0x30,
	0x14, 0xc5, 0x83, 0x83, 0x42, 0x5d, 0x0c, 0x13, 0x3a, 0x11, 0x27, 0xa6, 0xd6, 0xe0, 0x27, 0x90,
	0x49, 0x8d, 0x7f, 0x12, 0x46, 0x97, 0xa6, 0x40, 0x0b, 0x8d, 0x6d, 0x2f, 0x69, 0x6f, 0x07, 0x17,
	0x3f, 0xfb, 0x0b, 0xbc, 0xf0, 0x92, 0x97, 0x37, 0x30, 0xde, 0xe4, 0x77, 0x7e, 0xe7, 0x1e, 0xf2,
	0x84, 0x32, 0x20, 0x9f, 0x8d, 0x40, 0x05, 0xde, 0xb2, 0xf0, 0xfb, 0x67, 0x44, 0xc7, 0x0d, 0xf4,
	0xc2, 0xf0, 0x80, 0x02, 0x25, 0xb3, 0xd1, 0xa0, 0x9e, 0x20, 0x20, 0x9d, 0x3d, 0x20, 0xe4, 0xe5,
	0x59, 0x82, 0x5e, 0x26, 0x1e, 0xf6, 0x9d, 0x8b, 0x8e, 0x6b, 0xa7, 0xe0, 0xe8, 0x7c, 0xfc, 0x27,
	0x77, 0x9f, 0x4b, 0x4d, 0x03, 0xf8, 0x0a, 0x01, 0xdf, 0x9c, 0x82, 0xfc, 0x9b, 0x64, 0x27, 0xac,
	0x48, 0xca, 0xa4, 0xba, 0xad, 0x6b, 0xba, 0xd7, 0x4d, 0x5f, 0x22, 0xc2, 0x02, 0x6d, 0x9a, 0x36,
	0x9d, 0x36, 0xe1, 0x3d, 0x49, 0x87, 0x88, 0xdc, 0x09, 0x2b, 0x8b, 0xab, 0x32, 0xa9, 0xb2, 0xf6,
	0x66, 0x88, 0xf8, 0x25, 0xac, 0x6c, 0x3e, 0x7e, 0xde, 0x47, 0xa0, 0xfd, 0xe4, 0xc1, 0xea, 0x68,
	0x29, 0xf8, 0x91, 0x6d, 0x07, 0x04, 0xa6, 0x9d, 0xf2, 0x82, 0xad, 0x9f, 0xb2, 0x11, 0xd8, 0xde,
	0xba, 0xee, 0x7a, 0x45, 0x9f, 0x0f, 0x01, 0x00, 0x00, 0xff, 0xff, 0xb9, 0x2a, 0x29, 0xcb, 0x5c,
	0x01, 0x00, 0x00,
}
