// Copyright 2019 The Chromium OS Authors. All rights reserved.
// 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.25.0-devel
// 	protoc        v3.6.1
// source: test_platform/skylab_local_state/save.proto

package skylab_local_state

import (
	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
	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)
)

// SaveRequest defines the input of `skylab_local_state save`.
type SaveRequest struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	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"`
}

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

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

func (*SaveRequest) ProtoMessage() {}

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

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

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

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

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

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

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

var File_test_platform_skylab_local_state_save_proto protoreflect.FileDescriptor

var file_test_platform_skylab_local_state_save_proto_rawDesc = []byte{
	0x0a, 0x2b, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x2f,
	0x73, 0x6b, 0x79, 0x6c, 0x61, 0x62, 0x5f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x5f, 0x73, 0x74, 0x61,
	0x74, 0x65, 0x2f, 0x73, 0x61, 0x76, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x20, 0x74,
	0x65, 0x73, 0x74, 0x5f, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x2e, 0x73, 0x6b, 0x79,
	0x6c, 0x61, 0x62, 0x5f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x1a,
	0x2d, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x2f, 0x73,
	0x6b, 0x79, 0x6c, 0x61, 0x62, 0x5f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x5f, 0x73, 0x74, 0x61, 0x74,
	0x65, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xe9,
	0x01, 0x0a, 0x0b, 0x53, 0x61, 0x76, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x40,
	0x0a, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28,
	0x2e, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x2e, 0x73,
	0x6b, 0x79, 0x6c, 0x61, 0x62, 0x5f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x5f, 0x73, 0x74, 0x61, 0x74,
	0x65, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67,
	0x12, 0x1f, 0x0a, 0x0b, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x5f, 0x64, 0x69, 0x72, 0x18,
	0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x44, 0x69,
	0x72, 0x12, 0x19, 0x0a, 0x08, 0x64, 0x75, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20,
	0x01, 0x28, 0x09, 0x52, 0x07, 0x64, 0x75, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x15, 0x0a, 0x06,
	0x64, 0x75, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x64, 0x75,
	0x74, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x64, 0x75, 0x74, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65,
	0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x75, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65,
	0x12, 0x28, 0x0a, 0x10, 0x73, 0x65, 0x61, 0x6c, 0x5f, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73,
	0x5f, 0x64, 0x69, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x73, 0x65, 0x61, 0x6c,
	0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x44, 0x69, 0x72, 0x42, 0x4c, 0x5a, 0x4a, 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, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x70, 0x6c, 0x61,
	0x74, 0x66, 0x6f, 0x72, 0x6d, 0x2f, 0x73, 0x6b, 0x79, 0x6c, 0x61, 0x62, 0x5f, 0x6c, 0x6f, 0x63,
	0x61, 0x6c, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
}

var (
	file_test_platform_skylab_local_state_save_proto_rawDescOnce sync.Once
	file_test_platform_skylab_local_state_save_proto_rawDescData = file_test_platform_skylab_local_state_save_proto_rawDesc
)

func file_test_platform_skylab_local_state_save_proto_rawDescGZIP() []byte {
	file_test_platform_skylab_local_state_save_proto_rawDescOnce.Do(func() {
		file_test_platform_skylab_local_state_save_proto_rawDescData = protoimpl.X.CompressGZIP(file_test_platform_skylab_local_state_save_proto_rawDescData)
	})
	return file_test_platform_skylab_local_state_save_proto_rawDescData
}

var file_test_platform_skylab_local_state_save_proto_msgTypes = make([]protoimpl.MessageInfo, 1)
var file_test_platform_skylab_local_state_save_proto_goTypes = []interface{}{
	(*SaveRequest)(nil), // 0: test_platform.skylab_local_state.SaveRequest
	(*Config)(nil),      // 1: test_platform.skylab_local_state.Config
}
var file_test_platform_skylab_local_state_save_proto_depIdxs = []int32{
	1, // 0: test_platform.skylab_local_state.SaveRequest.config:type_name -> test_platform.skylab_local_state.Config
	1, // [1:1] is the sub-list for method output_type
	1, // [1:1] is the sub-list for method input_type
	1, // [1:1] is the sub-list for extension type_name
	1, // [1:1] is the sub-list for extension extendee
	0, // [0:1] is the sub-list for field type_name
}

func init() { file_test_platform_skylab_local_state_save_proto_init() }
func file_test_platform_skylab_local_state_save_proto_init() {
	if File_test_platform_skylab_local_state_save_proto != nil {
		return
	}
	file_test_platform_skylab_local_state_common_proto_init()
	if !protoimpl.UnsafeEnabled {
		file_test_platform_skylab_local_state_save_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*SaveRequest); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
	}
	type x struct{}
	out := protoimpl.TypeBuilder{
		File: protoimpl.DescBuilder{
			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
			RawDescriptor: file_test_platform_skylab_local_state_save_proto_rawDesc,
			NumEnums:      0,
			NumMessages:   1,
			NumExtensions: 0,
			NumServices:   0,
		},
		GoTypes:           file_test_platform_skylab_local_state_save_proto_goTypes,
		DependencyIndexes: file_test_platform_skylab_local_state_save_proto_depIdxs,
		MessageInfos:      file_test_platform_skylab_local_state_save_proto_msgTypes,
	}.Build()
	File_test_platform_skylab_local_state_save_proto = out.File
	file_test_platform_skylab_local_state_save_proto_rawDesc = nil
	file_test_platform_skylab_local_state_save_proto_goTypes = nil
	file_test_platform_skylab_local_state_save_proto_depIdxs = nil
}
