// Code generated by protoc-gen-go. DO NOT EDIT.
// source: test_platform/skylab_local_state/load.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

// LoadRequest defines the input of `skylab_local_state load`.
type LoadRequest struct {
	Config *Config `protobuf:"bytes,1,opt,name=config,proto3" json:"config,omitempty"`
	// DUT hostname.
	DutName string `protobuf:"bytes,3,opt,name=dut_name,json=dutName,proto3" json:"dut_name,omitempty"`
	// Swarming run ID. Used in the results directory name.
	RunId string `protobuf:"bytes,4,opt,name=run_id,json=runId,proto3" json:"run_id,omitempty"`
	// DUT ID, used in the name of the DUT state cache file.
	DutId string `protobuf:"bytes,5,opt,name=dut_id,json=dutId,proto3" json:"dut_id,omitempty"`
	// Test ID, used in the results directory name
	TestId               string   `protobuf:"bytes,6,opt,name=test_id,json=testId,proto3" json:"test_id,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_LoadRequest proto.InternalMessageInfo

func (m *LoadRequest) GetConfig() *Config {
	if m != nil {
		return m.Config
	}
	return nil
}

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

func (m *LoadRequest) GetRunId() string {
	if m != nil {
		return m.RunId
	}
	return ""
}

func (m *LoadRequest) GetDutId() string {
	if m != nil {
		return m.DutId
	}
	return ""
}

func (m *LoadRequest) GetTestId() string {
	if m != nil {
		return m.TestId
	}
	return ""
}

// LoadResponse defines the output of `skylab_local_state load`.
type LoadResponse struct {
	// What is currently installed on the DUT, e.g.
	// "cros-version": "reef-release/R77-12345.0.0".
	ProvisionableLabels map[string]string `protobuf:"bytes,1,rep,name=provisionable_labels,json=provisionableLabels,proto3" json:"provisionable_labels,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
	// The path to the newly created directory containing the host info file.
	ResultsDir           string   `protobuf:"bytes,2,opt,name=results_dir,json=resultsDir,proto3" json:"results_dir,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *LoadResponse) Reset()         { *m = LoadResponse{} }
func (m *LoadResponse) String() string { return proto.CompactTextString(m) }
func (*LoadResponse) ProtoMessage()    {}
func (*LoadResponse) Descriptor() ([]byte, []int) {
	return fileDescriptor_8da18a4489bdf85e, []int{1}
}

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

var xxx_messageInfo_LoadResponse proto.InternalMessageInfo

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

func (m *LoadResponse) GetResultsDir() string {
	if m != nil {
		return m.ResultsDir
	}
	return ""
}

func init() {
	proto.RegisterType((*LoadRequest)(nil), "test_platform.skylab_local_state.LoadRequest")
	proto.RegisterType((*LoadResponse)(nil), "test_platform.skylab_local_state.LoadResponse")
	proto.RegisterMapType((map[string]string)(nil), "test_platform.skylab_local_state.LoadResponse.ProvisionableLabelsEntry")
}

func init() {
	proto.RegisterFile("test_platform/skylab_local_state/load.proto", fileDescriptor_8da18a4489bdf85e)
}

var fileDescriptor_8da18a4489bdf85e = []byte{
	// 381 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x84, 0x92, 0xcd, 0x8a, 0xdb, 0x30,
	0x10, 0xc7, 0x71, 0x9c, 0x78, 0xb3, 0x4a, 0x0b, 0x41, 0xdd, 0x52, 0x75, 0x2f, 0x35, 0x7b, 0x32,
	0x94, 0xda, 0xb0, 0xbd, 0x94, 0x9e, 0x4a, 0x3f, 0x49, 0x08, 0xa5, 0xf8, 0xd8, 0x8b, 0x90, 0x2d,
	0xc5, 0x15, 0x2b, 0x6b, 0x5c, 0x7d, 0x2c, 0xb8, 0x4f, 0xd0, 0x07, 0xeb, 0x83, 0x15, 0xcb, 0x2e,
	0xa4, 0x84, 0xc5, 0x37, 0xcd, 0x7f, 0xfe, 0xf3, 0x9b, 0x19, 0x49, 0xe8, 0xa5, 0x13, 0xd6, 0xd1,
	0x4e, 0x31, 0x77, 0x04, 0xd3, 0x16, 0xf6, 0xae, 0x57, 0xac, 0xa2, 0x0a, 0x6a, 0xa6, 0xa8, 0x75,
	0xcc, 0x89, 0x42, 0x01, 0xe3, 0x79, 0x67, 0xc0, 0x01, 0x4e, 0xff, 0x33, 0xe7, 0xe7, 0xe6, 0xeb,
	0x57, 0xb3, 0xb8, 0x1a, 0xda, 0x16, 0xf4, 0x08, 0xbc, 0xf9, 0x13, 0xa1, 0xcd, 0x01, 0x18, 0x2f,
	0xc5, 0x4f, 0x2f, 0xac, 0xc3, 0xef, 0x50, 0x52, 0x83, 0x3e, 0xca, 0x86, 0x44, 0x69, 0x94, 0x6d,
	0x6e, 0xb3, 0x7c, 0xae, 0x63, 0xfe, 0x21, 0xf8, 0xcb, 0xa9, 0x0e, 0x3f, 0x47, 0x6b, 0xee, 0x1d,
	0xd5, 0xac, 0x15, 0x24, 0x4e, 0xa3, 0xec, 0xb2, 0xbc, 0xe0, 0xde, 0x7d, 0x65, 0xad, 0xc0, 0x4f,
	0x51, 0x62, 0xbc, 0xa6, 0x92, 0x93, 0x65, 0x48, 0xac, 0x8c, 0xd7, 0x3b, 0x3e, 0xc8, 0x43, 0x85,
	0xe4, 0x64, 0x35, 0xca, 0xdc, 0xbb, 0x1d, 0xc7, 0xcf, 0xd0, 0x45, 0xe8, 0x2d, 0x39, 0x49, 0x82,
	0x9e, 0x0c, 0xe1, 0x8e, 0xef, 0x97, 0xeb, 0xc5, 0x36, 0x2e, 0x37, 0x46, 0x58, 0xaf, 0x9c, 0xa5,
	0x5c, 0x9a, 0x9b, 0xdf, 0x0b, 0xf4, 0x68, 0x5c, 0xc3, 0x76, 0xa0, 0xad, 0xc0, 0xbf, 0xd0, 0x55,
	0x67, 0xe0, 0x5e, 0x5a, 0x09, 0x9a, 0x55, 0x4a, 0x50, 0xc5, 0x2a, 0xa1, 0x2c, 0x89, 0xd2, 0x38,
	0xdb, 0xdc, 0x7e, 0x99, 0xdf, 0xea, 0x94, 0x96, 0x7f, 0x3b, 0x45, 0x1d, 0x02, 0xe9, 0x93, 0x76,
	0xa6, 0x2f, 0x9f, 0x74, 0xe7, 0x19, 0xfc, 0x02, 0x9d, 0xce, 0x46, 0x16, 0x61, 0x78, 0x34, 0x49,
	0x1f, 0xa5, 0xb9, 0xfe, 0x8c, 0xc8, 0x43, 0x44, 0xbc, 0x45, 0xf1, 0x9d, 0xe8, 0xc3, 0xed, 0x5f,
	0x96, 0xc3, 0x11, 0x5f, 0xa1, 0xd5, 0x3d, 0x53, 0x5e, 0x4c, 0xa0, 0x31, 0x78, 0xbb, 0x78, 0x13,
	0xed, 0x97, 0xeb, 0x78, 0xbb, 0x2c, 0x1f, 0x33, 0xdb, 0xeb, 0x9a, 0x4e, 0xfc, 0xf7, 0x87, 0xef,
	0xfb, 0x06, 0xf2, 0xfa, 0x87, 0x81, 0x56, 0xfa, 0x36, 0x07, 0xd3, 0x14, 0xff, 0x02, 0xb0, 0x85,
	0xd4, 0x47, 0xc3, 0x8a, 0xf0, 0xf6, 0x45, 0x03, 0xc5, 0xdc, 0x67, 0xa9, 0x92, 0x60, 0x7d, 0xfd,
	0x37, 0x00, 0x00, 0xff, 0xff, 0x7b, 0x1a, 0x74, 0xe1, 0xa6, 0x02, 0x00, 0x00,
}
