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

package phosphorus

import (
	fmt "fmt"
	proto "github.com/golang/protobuf/proto"
	timestamp "github.com/golang/protobuf/ptypes/timestamp"
	test_platform "go.chromium.org/chromiumos/infra/proto/go/test_platform"
	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

// Values should be consistent with https://aip.dev/216
type PrejobResponse_State int32

const (
	// Should not be used.
	PrejobResponse_STATE_UNSPECIFIED PrejobResponse_State = 0
	// The prejob succeeded.
	//
	// Some prejob failures may not be detectable during execution. These
	// failures will be detected when parsing results off the prejob logs in a
	// later step of test_runner.
	PrejobResponse_SUCCEEDED PrejobResponse_State = 1
	// The prejob failed.
	PrejobResponse_FAILED PrejobResponse_State = 2
	// The prejob hit the requested timeout.
	PrejobResponse_TIMED_OUT PrejobResponse_State = 3
	// The prejob was aborted externally.
	PrejobResponse_ABORTED PrejobResponse_State = 4
)

var PrejobResponse_State_name = map[int32]string{
	0: "STATE_UNSPECIFIED",
	1: "SUCCEEDED",
	2: "FAILED",
	3: "TIMED_OUT",
	4: "ABORTED",
}

var PrejobResponse_State_value = map[string]int32{
	"STATE_UNSPECIFIED": 0,
	"SUCCEEDED":         1,
	"FAILED":            2,
	"TIMED_OUT":         3,
	"ABORTED":           4,
}

func (x PrejobResponse_State) String() string {
	return proto.EnumName(PrejobResponse_State_name, int32(x))
}

func (PrejobResponse_State) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_5d406d24cdb4ff2a, []int{1, 0}
}

// PrejobRequest defines the input of `phosphorus prejob`.
type PrejobRequest struct {
	Config      *Config `protobuf:"bytes,1,opt,name=config,proto3" json:"config,omitempty"`
	DutHostname string  `protobuf:"bytes,2,opt,name=dut_hostname,json=dutHostname,proto3" json:"dut_hostname,omitempty"`
	// TODO(crbug.com/1162347): Delete this post-migration.
	ProvisionableLabels map[string]string `protobuf:"bytes,3,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"` // Deprecated: Do not use.
	// What needs to be installed onto the DUT at the end of prejob, e.g.
	// "cros-version": "reef-release/R77-12345.0.0".
	// TODO(crbug.com/1162347): Delete this post-migration.
	DesiredProvisionableLabels map[string]string `protobuf:"bytes,4,rep,name=desired_provisionable_labels,json=desiredProvisionableLabels,proto3" json:"desired_provisionable_labels,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // Deprecated: Do not use.
	// What needs to be installed onto the DUT at the end of prejob, as specified
	// in the cros_test_platform request.
	SoftwareDependencies []*test_platform.Request_Params_SoftwareDependency `protobuf:"bytes,8,rep,name=software_dependencies,json=softwareDependencies,proto3" json:"software_dependencies,omitempty"`
	// What is installed on the DUT before the prejob, e.g.
	// "cros-version": "reef-release/R77-12345.0.0".
	ExistingProvisionableLabels map[string]string `protobuf:"bytes,5,rep,name=existing_provisionable_labels,json=existingProvisionableLabels,proto3" json:"existing_provisionable_labels,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
	// Hard deadline for execution.
	//
	// All prejob execution should abort beyond this deadline.
	Deadline *timestamp.Timestamp `protobuf:"bytes,6,opt,name=deadline,proto3" json:"deadline,omitempty"`
	// If set, use the Provision TLS API for the prejob.
	// See go/cros-prover go/cros-tls
	//
	// crbug.com/1137444: This is a transitional argument. Once go/cros-prover
	// migration is complete, all prejobs will use the TLS API and this argument
	// will be dropped.
	UseTls               bool     `protobuf:"varint,7,opt,name=use_tls,json=useTls,proto3" json:"use_tls,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_PrejobRequest proto.InternalMessageInfo

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

func (m *PrejobRequest) GetDutHostname() string {
	if m != nil {
		return m.DutHostname
	}
	return ""
}

// Deprecated: Do not use.
func (m *PrejobRequest) GetProvisionableLabels() map[string]string {
	if m != nil {
		return m.ProvisionableLabels
	}
	return nil
}

// Deprecated: Do not use.
func (m *PrejobRequest) GetDesiredProvisionableLabels() map[string]string {
	if m != nil {
		return m.DesiredProvisionableLabels
	}
	return nil
}

func (m *PrejobRequest) GetSoftwareDependencies() []*test_platform.Request_Params_SoftwareDependency {
	if m != nil {
		return m.SoftwareDependencies
	}
	return nil
}

func (m *PrejobRequest) GetExistingProvisionableLabels() map[string]string {
	if m != nil {
		return m.ExistingProvisionableLabels
	}
	return nil
}

func (m *PrejobRequest) GetDeadline() *timestamp.Timestamp {
	if m != nil {
		return m.Deadline
	}
	return nil
}

func (m *PrejobRequest) GetUseTls() bool {
	if m != nil {
		return m.UseTls
	}
	return false
}

// PrejobResponse defines the output of `phosphorus prejob`.
type PrejobResponse struct {
	// `phosphorus prejob` exits with exit code 0 unless there is an
	// infrastructure failure. When the exit code is 0, `state` indicates the
	// best known state of the prejob execution (see comments on State enum).
	State                PrejobResponse_State `protobuf:"varint,1,opt,name=state,proto3,enum=test_platform.phosphorus.PrejobResponse_State" json:"state,omitempty"`
	XXX_NoUnkeyedLiteral struct{}             `json:"-"`
	XXX_unrecognized     []byte               `json:"-"`
	XXX_sizecache        int32                `json:"-"`
}

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

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

var xxx_messageInfo_PrejobResponse proto.InternalMessageInfo

func (m *PrejobResponse) GetState() PrejobResponse_State {
	if m != nil {
		return m.State
	}
	return PrejobResponse_STATE_UNSPECIFIED
}

func init() {
	proto.RegisterEnum("test_platform.phosphorus.PrejobResponse_State", PrejobResponse_State_name, PrejobResponse_State_value)
	proto.RegisterType((*PrejobRequest)(nil), "test_platform.phosphorus.PrejobRequest")
	proto.RegisterMapType((map[string]string)(nil), "test_platform.phosphorus.PrejobRequest.DesiredProvisionableLabelsEntry")
	proto.RegisterMapType((map[string]string)(nil), "test_platform.phosphorus.PrejobRequest.ExistingProvisionableLabelsEntry")
	proto.RegisterMapType((map[string]string)(nil), "test_platform.phosphorus.PrejobRequest.ProvisionableLabelsEntry")
	proto.RegisterType((*PrejobResponse)(nil), "test_platform.phosphorus.PrejobResponse")
}

func init() {
	proto.RegisterFile("test_platform/phosphorus/prejob.proto", fileDescriptor_5d406d24cdb4ff2a)
}

var fileDescriptor_5d406d24cdb4ff2a = []byte{
	// 588 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x54, 0x5f, 0x6f, 0xd3, 0x3e,
	0x14, 0xfd, 0xa5, 0x5d, 0xdb, 0xcd, 0xfd, 0x6d, 0x2a, 0x66, 0x13, 0x51, 0x07, 0x5a, 0x98, 0x84,
	0xd4, 0x27, 0x07, 0x0d, 0x09, 0x4d, 0x3c, 0xb1, 0x36, 0x19, 0xab, 0xb4, 0x7f, 0x4a, 0xd3, 0x17,
	0x5e, 0x22, 0xb7, 0xb9, 0x4d, 0x0d, 0x49, 0x1c, 0x6c, 0x67, 0x63, 0xdf, 0x01, 0x3e, 0x05, 0xcf,
	0x7c, 0x47, 0x34, 0xa7, 0x19, 0x6c, 0x2c, 0x74, 0x7b, 0x8b, 0x7d, 0xcf, 0x39, 0xf7, 0xdc, 0xdc,
	0x23, 0xa3, 0x57, 0x0a, 0xa4, 0x0a, 0xb2, 0x98, 0xaa, 0x19, 0x17, 0x89, 0x9d, 0xcd, 0xb9, 0xcc,
	0xe6, 0x5c, 0xe4, 0xd2, 0xce, 0x04, 0x7c, 0xe2, 0x13, 0x92, 0x09, 0xae, 0x38, 0x36, 0x6f, 0xc1,
	0xc8, 0x6f, 0x58, 0x77, 0x27, 0xe2, 0x3c, 0x8a, 0xc1, 0xd6, 0xb8, 0x49, 0x3e, 0xb3, 0x15, 0x4b,
	0x40, 0x2a, 0x9a, 0x64, 0x05, 0xb5, 0x5b, 0xdd, 0x61, 0xca, 0x93, 0x84, 0xa7, 0x0b, 0xd8, 0xf6,
	0x6d, 0x98, 0x80, 0x2f, 0x39, 0x48, 0x55, 0x14, 0x77, 0x7f, 0xb4, 0xd0, 0xfa, 0xb9, 0xf6, 0xe3,
	0x15, 0xf7, 0x78, 0x1f, 0x35, 0xa7, 0x3c, 0x9d, 0xb1, 0xc8, 0x34, 0x2c, 0xa3, 0xd7, 0xde, 0xb3,
	0x48, 0x95, 0x43, 0x32, 0xd0, 0x38, 0x6f, 0x81, 0xc7, 0x2f, 0xd1, 0xff, 0x61, 0xae, 0x82, 0x39,
	0x97, 0x2a, 0xa5, 0x09, 0x98, 0x35, 0xcb, 0xe8, 0xad, 0x79, 0xed, 0x30, 0x57, 0x47, 0x8b, 0x2b,
	0x7c, 0x89, 0x36, 0x33, 0xc1, 0x2f, 0x98, 0x64, 0x3c, 0xa5, 0x93, 0x18, 0x82, 0x98, 0x4e, 0x20,
	0x96, 0x66, 0xdd, 0xaa, 0xf7, 0xda, 0x7b, 0xef, 0xab, 0x5b, 0xdd, 0xf2, 0x48, 0xce, 0xff, 0xd4,
	0x38, 0xd6, 0x12, 0x6e, 0xaa, 0xc4, 0x55, 0xbf, 0x66, 0x1a, 0xde, 0xd3, 0xec, 0xef, 0x2a, 0xfe,
	0x6e, 0xa0, 0xe7, 0x21, 0x48, 0x26, 0x20, 0x0c, 0xee, 0x75, 0xb0, 0xa2, 0x1d, 0x7c, 0x78, 0xa8,
	0x03, 0xa7, 0xd0, 0xfa, 0xa7, 0x91, 0x6e, 0x58, 0x09, 0xc2, 0x80, 0xb6, 0x24, 0x9f, 0xa9, 0x4b,
	0x2a, 0x20, 0x08, 0x21, 0x83, 0x34, 0x84, 0x74, 0xca, 0x40, 0x9a, 0xab, 0xda, 0xc7, 0xeb, 0x3b,
	0x3e, 0x6e, 0x06, 0xa7, 0x82, 0x26, 0x92, 0x8c, 0x16, 0x54, 0xa7, 0x64, 0x5e, 0x79, 0x9b, 0xf2,
	0xee, 0x1d, 0x03, 0x89, 0xbf, 0x19, 0xe8, 0x05, 0x7c, 0x65, 0x52, 0xb1, 0x34, 0xba, 0x7f, 0xee,
	0x86, 0xee, 0x77, 0xf4, 0xd0, 0xb9, 0xdd, 0x85, 0x58, 0xd5, 0xe0, 0xde, 0x36, 0x54, 0x23, 0xf0,
	0x5b, 0xb4, 0x1a, 0x02, 0x0d, 0x63, 0x96, 0x82, 0xd9, 0xd4, 0xe9, 0xea, 0x92, 0x22, 0xe5, 0xa4,
	0x4c, 0x39, 0xf1, 0xcb, 0x94, 0x7b, 0x37, 0x58, 0xfc, 0x0c, 0xb5, 0x72, 0x09, 0x81, 0x8a, 0xa5,
	0xd9, 0xb2, 0x8c, 0xde, 0xaa, 0xd7, 0xcc, 0x25, 0xf8, 0xb1, 0xec, 0x1e, 0x22, 0xb3, 0xca, 0x09,
	0xee, 0xa0, 0xfa, 0x67, 0xb8, 0xd2, 0x29, 0x5e, 0xf3, 0xae, 0x3f, 0xf1, 0x26, 0x6a, 0x5c, 0xd0,
	0x38, 0x2f, 0x93, 0x59, 0x1c, 0xde, 0xd5, 0xf6, 0x8d, 0xee, 0x09, 0xda, 0x59, 0xb2, 0xd1, 0x47,
	0xc9, 0x9d, 0x22, 0x6b, 0xd9, 0x8f, 0x7a, 0x8c, 0xde, 0xee, 0x4f, 0x03, 0x6d, 0x94, 0x7b, 0x90,
	0x19, 0x4f, 0x25, 0x60, 0x07, 0x35, 0xa4, 0xa2, 0x0a, 0xb4, 0xc0, 0xc6, 0x1e, 0x59, 0xbe, 0xc0,
	0x82, 0x48, 0x46, 0xd7, 0x2c, 0xaf, 0x20, 0xef, 0x8e, 0x51, 0x43, 0x9f, 0xf1, 0x16, 0x7a, 0x32,
	0xf2, 0x0f, 0x7c, 0x37, 0x18, 0x9f, 0x8e, 0xce, 0xdd, 0xc1, 0xf0, 0x70, 0xe8, 0x3a, 0x9d, 0xff,
	0xf0, 0x3a, 0x5a, 0x1b, 0x8d, 0x07, 0x03, 0xd7, 0x75, 0x5c, 0xa7, 0x63, 0x60, 0x84, 0x9a, 0x87,
	0x07, 0xc3, 0x63, 0xd7, 0xe9, 0xd4, 0xae, 0x4b, 0xfe, 0xf0, 0xc4, 0x75, 0x82, 0xb3, 0xb1, 0xdf,
	0xa9, 0xe3, 0x36, 0x6a, 0x1d, 0xf4, 0xcf, 0x3c, 0xdf, 0x75, 0x3a, 0x2b, 0x7d, 0xe7, 0x63, 0x3f,
	0xe2, 0x64, 0x3a, 0x17, 0x3c, 0x61, 0x79, 0x42, 0xb8, 0x88, 0xec, 0xf2, 0xc0, 0xa5, 0xcd, 0xd2,
	0x99, 0xa0, 0xc5, 0xb3, 0x66, 0x47, 0xdc, 0xae, 0x7a, 0xc5, 0x26, 0x4d, 0x0d, 0x79, 0xf3, 0x2b,
	0x00, 0x00, 0xff, 0xff, 0xa7, 0x80, 0xb4, 0x95, 0x4a, 0x05, 0x00, 0x00,
}
