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

func (m *PrejobRequest) GetDesiredProvisionableLabels() map[string]string {
	if m != nil {
		return m.DesiredProvisionableLabels
	}
	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{
	// 536 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x94, 0xdf, 0x6e, 0xd3, 0x30,
	0x14, 0xc6, 0x49, 0xbb, 0xa6, 0xeb, 0x29, 0x9b, 0x82, 0x19, 0x22, 0x0a, 0xa0, 0x85, 0x4a, 0x48,
	0xbd, 0x72, 0xa4, 0x22, 0xa1, 0x89, 0x2b, 0xda, 0xc6, 0x65, 0x95, 0xf6, 0xa7, 0x4a, 0xd3, 0x1b,
	0x6e, 0xa2, 0xb4, 0x71, 0xd3, 0x40, 0x12, 0x87, 0xd8, 0x19, 0xec, 0x11, 0x90, 0x78, 0x15, 0xee,
	0x79, 0x3c, 0x54, 0xa7, 0x05, 0xa6, 0x2d, 0xea, 0x76, 0x97, 0x13, 0x7f, 0xe7, 0x3b, 0x3f, 0xf9,
	0x7c, 0x32, 0xbc, 0x11, 0x94, 0x0b, 0x2f, 0x8b, 0x7d, 0xb1, 0x64, 0x79, 0x62, 0x65, 0x2b, 0xc6,
	0xb3, 0x15, 0xcb, 0x0b, 0x6e, 0x65, 0x39, 0xfd, 0xcc, 0xe6, 0x38, 0xcb, 0x99, 0x60, 0x48, 0xbf,
	0x21, 0xc3, 0xff, 0x64, 0xc6, 0x71, 0xc8, 0x58, 0x18, 0x53, 0x4b, 0xea, 0xe6, 0xc5, 0xd2, 0x12,
	0x51, 0x42, 0xb9, 0xf0, 0x93, 0xac, 0x6c, 0x35, 0xaa, 0x27, 0x2c, 0x58, 0x92, 0xb0, 0xb4, 0x94,
	0x75, 0x7e, 0xab, 0x70, 0x30, 0x91, 0x23, 0x1d, 0xfa, 0xb5, 0xa0, 0x5c, 0xa0, 0x13, 0x50, 0x17,
	0x2c, 0x5d, 0x46, 0xa1, 0xae, 0x98, 0x4a, 0xb7, 0xdd, 0x33, 0x71, 0x15, 0x04, 0x1e, 0x4a, 0x9d,
	0xb3, 0xd1, 0xa3, 0xd7, 0xf0, 0x38, 0x28, 0x84, 0xb7, 0x62, 0x5c, 0xa4, 0x7e, 0x42, 0xf5, 0x9a,
	0xa9, 0x74, 0x5b, 0x4e, 0x3b, 0x28, 0xc4, 0xe9, 0xe6, 0x17, 0xfa, 0x06, 0x47, 0x59, 0xce, 0xae,
	0x22, 0x1e, 0xb1, 0xd4, 0x9f, 0xc7, 0xd4, 0x8b, 0xfd, 0x39, 0x8d, 0xb9, 0x5e, 0x37, 0xeb, 0xdd,
	0x76, 0xef, 0x43, 0xf5, 0xa8, 0x1b, 0x8c, 0x78, 0xf2, 0xbf, 0xc7, 0x99, 0xb4, 0x20, 0xa9, 0xc8,
	0xaf, 0x07, 0x35, 0x5d, 0x71, 0x9e, 0x66, 0xb7, 0x4f, 0xd1, 0x0f, 0x05, 0x5e, 0x06, 0x94, 0x47,
	0x39, 0x0d, 0xbc, 0x3b, 0x09, 0xf6, 0x24, 0xc1, 0xc7, 0xfb, 0x12, 0xd8, 0xa5, 0x57, 0x15, 0x88,
	0x63, 0x04, 0x95, 0x02, 0xf4, 0x53, 0x81, 0x57, 0xf4, 0x7b, 0xc4, 0x45, 0x94, 0x86, 0x77, 0xc3,
	0x34, 0x24, 0xcc, 0xe9, 0x7d, 0x61, 0xc8, 0xc6, 0xac, 0x92, 0xe6, 0x05, 0xad, 0x56, 0xa0, 0x77,
	0xb0, 0x1f, 0x50, 0x3f, 0x88, 0xa3, 0x94, 0xea, 0xaa, 0x5c, 0xb9, 0x81, 0xcb, 0x74, 0xe1, 0x6d,
	0xba, 0xb0, 0xbb, 0x4d, 0x97, 0xf3, 0x57, 0x8b, 0x9e, 0x43, 0xb3, 0xe0, 0xd4, 0x13, 0x31, 0xd7,
	0x9b, 0xa6, 0xd2, 0xdd, 0x77, 0xd4, 0x82, 0x53, 0x37, 0xe6, 0xc6, 0x08, 0xf4, 0x2a, 0x12, 0xa4,
	0x41, 0xfd, 0x0b, 0xbd, 0x96, 0xd1, 0x6a, 0x39, 0xeb, 0x4f, 0x74, 0x04, 0x8d, 0x2b, 0x3f, 0x2e,
	0xb6, 0x71, 0x29, 0x8b, 0xf7, 0xb5, 0x13, 0xc5, 0x38, 0x87, 0xe3, 0x1d, 0xd7, 0xfc, 0x20, 0xbb,
	0x0b, 0x30, 0x77, 0x5d, 0xd4, 0x43, 0xfc, 0x3a, 0xbf, 0x14, 0x38, 0xdc, 0xee, 0x81, 0x67, 0x2c,
	0xe5, 0x14, 0xd9, 0xd0, 0xe0, 0xc2, 0x17, 0x54, 0x1a, 0x1c, 0xf6, 0xf0, 0xee, 0x05, 0x96, 0x8d,
	0x78, 0xba, 0xee, 0x72, 0xca, 0xe6, 0xce, 0x0c, 0x1a, 0xb2, 0x46, 0xcf, 0xe0, 0xc9, 0xd4, 0xed,
	0xbb, 0xc4, 0x9b, 0x5d, 0x4c, 0x27, 0x64, 0x38, 0x1e, 0x8d, 0x89, 0xad, 0x3d, 0x42, 0x07, 0xd0,
	0x9a, 0xce, 0x86, 0x43, 0x42, 0x6c, 0x62, 0x6b, 0x0a, 0x02, 0x50, 0x47, 0xfd, 0xf1, 0x19, 0xb1,
	0xb5, 0xda, 0xfa, 0xc8, 0x1d, 0x9f, 0x13, 0xdb, 0xbb, 0x9c, 0xb9, 0x5a, 0x1d, 0xb5, 0xa1, 0xd9,
	0x1f, 0x5c, 0x3a, 0x2e, 0xb1, 0xb5, 0xbd, 0x81, 0xfd, 0x69, 0x10, 0x32, 0xbc, 0x58, 0xe5, 0x2c,
	0x89, 0x8a, 0x04, 0xb3, 0x3c, 0xb4, 0xb6, 0x05, 0xe3, 0x56, 0x94, 0x2e, 0x73, 0xbf, 0x7c, 0x4e,
	0xac, 0x90, 0x59, 0x55, 0xaf, 0xc7, 0x5c, 0x95, 0x92, 0xb7, 0x7f, 0x02, 0x00, 0x00, 0xff, 0xff,
	0xaa, 0x4a, 0x57, 0xa4, 0xc2, 0x04, 0x00, 0x00,
}
