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

// SaveRequest defines the input of `skylab_local_state save`.
type SaveRequest struct {
	Config *Config `protobuf:"bytes,1,opt,name=config,proto3" json:"config,omitempty"`
	// The path to the directory where the host info file is located.
	ResultsDir string `protobuf:"bytes,2,opt,name=results_dir,json=resultsDir,proto3" json:"results_dir,omitempty"`
	// DUT hostname, used in the name of the host info file.
	DutName string `protobuf:"bytes,3,opt,name=dut_name,json=dutName,proto3" json:"dut_name,omitempty"`
	// DUT ID, used in the name of the DUT state cache file.
	DutId string `protobuf:"bytes,4,opt,name=dut_id,json=dutId,proto3" json:"dut_id,omitempty"`
	// E.g. "needs_repair", "ready" etc.
	DutState string `protobuf:"bytes,5,opt,name=dut_state,json=dutState,proto3" json:"dut_state,omitempty"`
	// If true, mark results directory as ready for offload.
	SealResultsDir       bool     `protobuf:"varint,6,opt,name=seal_results_dir,json=sealResultsDir,proto3" json:"seal_results_dir,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_SaveRequest proto.InternalMessageInfo

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

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

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

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

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

func (m *SaveRequest) GetSealResultsDir() bool {
	if m != nil {
		return m.SealResultsDir
	}
	return false
}

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

func init() {
	proto.RegisterFile("test_platform/skylab_local_state/save.proto", fileDescriptor_ca28d647d1205626)
}

var fileDescriptor_ca28d647d1205626 = []byte{
	// 274 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x84, 0x90, 0xc1, 0x4a, 0xf4, 0x30,
	0x14, 0x85, 0xe9, 0xff, 0x3b, 0x75, 0x26, 0x05, 0x91, 0x80, 0x50, 0x75, 0x61, 0x71, 0x55, 0x10,
	0x13, 0xd0, 0x17, 0x10, 0x75, 0xa3, 0x88, 0x8b, 0xce, 0xce, 0x4d, 0xc8, 0x34, 0x69, 0x0d, 0x26,
	0xbd, 0x63, 0x72, 0x33, 0xe0, 0x23, 0xfb, 0x16, 0xd2, 0x38, 0x8a, 0xe2, 0xa2, 0xcb, 0x7b, 0xce,
	0xb9, 0xe7, 0x83, 0x43, 0xce, 0x50, 0x07, 0x14, 0x6b, 0x2b, 0xb1, 0x03, 0xef, 0x78, 0x78, 0x79,
	0xb3, 0x72, 0x25, 0x2c, 0xb4, 0xd2, 0x8a, 0x80, 0x12, 0x35, 0x0f, 0x72, 0xa3, 0xd9, 0xda, 0x03,
	0x02, 0xad, 0x7e, 0x85, 0xd9, 0xdf, 0xf0, 0xd1, 0xf9, 0x64, 0x5d, 0x0b, 0xce, 0xc1, 0xf0, 0x59,
	0x78, 0xfa, 0x9e, 0x91, 0x62, 0x29, 0x37, 0xba, 0xd1, 0xaf, 0x51, 0x07, 0xa4, 0x57, 0x24, 0x6f,
	0x61, 0xe8, 0x4c, 0x5f, 0x66, 0x55, 0x56, 0x17, 0x17, 0x35, 0x9b, 0x22, 0xb2, 0x9b, 0x94, 0x6f,
	0xb6, 0x7f, 0xf4, 0x84, 0x14, 0x5e, 0x87, 0x68, 0x31, 0x08, 0x65, 0x7c, 0xf9, 0xaf, 0xca, 0xea,
	0x45, 0x43, 0xb6, 0xd2, 0xad, 0xf1, 0xf4, 0x90, 0xcc, 0x55, 0x44, 0x31, 0x48, 0xa7, 0xcb, 0xff,
	0xc9, 0xdd, 0x55, 0x11, 0x1f, 0xa5, 0xd3, 0xf4, 0x80, 0xe4, 0xa3, 0x65, 0x54, 0xb9, 0x93, 0x8c,
	0x99, 0x8a, 0x78, 0xa7, 0xe8, 0x31, 0x59, 0x8c, 0x72, 0xc2, 0x95, 0xb3, 0xe4, 0x8c, 0x15, 0xcb,
	0xf1, 0xa6, 0x35, 0xd9, 0x0f, 0x5a, 0x5a, 0xf1, 0x13, 0x9a, 0x57, 0x59, 0x3d, 0x6f, 0xf6, 0x46,
	0xbd, 0xf9, 0x06, 0x5f, 0x3f, 0x3c, 0xdd, 0xf7, 0xc0, 0xda, 0x67, 0x0f, 0xce, 0x44, 0xc7, 0xc0,
	0xf7, 0xfc, 0xeb, 0x80, 0xc0, 0xcd, 0xd0, 0x79, 0xc9, 0xd3, 0x2a, 0xbc, 0x07, 0x3e, 0x35, 0xe3,
	0x2a, 0x4f, 0xd1, 0xcb, 0x8f, 0x00, 0x00, 0x00, 0xff, 0xff, 0xc9, 0x10, 0x97, 0x58, 0xc0, 0x01,
	0x00, 0x00,
}
