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

package result_flow

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 CTPResponse_State int32

const (
	// Should not be used.
	CTPResponse_STATE_UNSPECIFIED CTPResponse_State = 0
	// Successfully pulled the CTP build IDs from Pub/Sub.
	CTPResponse_SUCCEEDED CTPResponse_State = 1
	// Failed to pull the CTP build IDs.
	CTPResponse_FAILED CTPResponse_State = 2
	// CTP command has hit the predefined timeout.
	CTPResponse_TIMED_OUT CTPResponse_State = 3
	// CTP command was aborted externally.
	CTPResponse_ABORTED CTPResponse_State = 4
)

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

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

func (x CTPResponse_State) String() string {
	return proto.EnumName(CTPResponse_State_name, int32(x))
}

func (CTPResponse_State) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_0cd3889564661eb4, []int{1, 0}
}

// CTPRequest defines the input of `result_flow ctp`.
type CTPRequest struct {
	// How long the client could subscribe to the Pub/Sub.
	// It should stop the subscription before the overall
	// deadline.
	SubscriptionDeadline *timestamp.Timestamp `protobuf:"bytes,1,opt,name=subscription_deadline,json=subscriptionDeadline,proto3" json:"subscription_deadline,omitempty"`
	// Hard deadline for execution.
	//
	// CTP command should abort beyond this deadline.
	Deadline             *timestamp.Timestamp `protobuf:"bytes,2,opt,name=deadline,proto3" json:"deadline,omitempty"`
	XXX_NoUnkeyedLiteral struct{}             `json:"-"`
	XXX_unrecognized     []byte               `json:"-"`
	XXX_sizecache        int32                `json:"-"`
}

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

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

var xxx_messageInfo_CTPRequest proto.InternalMessageInfo

func (m *CTPRequest) GetSubscriptionDeadline() *timestamp.Timestamp {
	if m != nil {
		return m.SubscriptionDeadline
	}
	return nil
}

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

// CTPResponse defines the output of `result_flow ctp`.
type CTPResponse struct {
	// `result_flow ctp` 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 ctp command execution (see comments on State enum).
	State                CTPResponse_State `protobuf:"varint,1,opt,name=state,proto3,enum=test_platform.result_flow.CTPResponse_State" json:"state,omitempty"`
	XXX_NoUnkeyedLiteral struct{}          `json:"-"`
	XXX_unrecognized     []byte            `json:"-"`
	XXX_sizecache        int32             `json:"-"`
}

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

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

var xxx_messageInfo_CTPResponse proto.InternalMessageInfo

func (m *CTPResponse) GetState() CTPResponse_State {
	if m != nil {
		return m.State
	}
	return CTPResponse_STATE_UNSPECIFIED
}

func init() {
	proto.RegisterEnum("test_platform.result_flow.CTPResponse_State", CTPResponse_State_name, CTPResponse_State_value)
	proto.RegisterType((*CTPRequest)(nil), "test_platform.result_flow.CTPRequest")
	proto.RegisterType((*CTPResponse)(nil), "test_platform.result_flow.CTPResponse")
}

func init() {
	proto.RegisterFile("test_platform/result_flow/ctp.proto", fileDescriptor_0cd3889564661eb4)
}

var fileDescriptor_0cd3889564661eb4 = []byte{
	// 319 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x84, 0x91, 0x41, 0x4b, 0xf3, 0x30,
	0x18, 0x80, 0xbf, 0xee, 0x73, 0x53, 0x33, 0x94, 0x1a, 0x1c, 0xe8, 0x2e, 0xca, 0xbc, 0x78, 0x90,
	0x04, 0x26, 0x78, 0xdf, 0x9a, 0x0c, 0x0a, 0xea, 0x46, 0x9b, 0x5e, 0xbc, 0x94, 0x6e, 0x4b, 0x6b,
	0xa1, 0xed, 0x5b, 0x93, 0x14, 0x7f, 0x89, 0xff, 0xc1, 0x9f, 0x29, 0x6b, 0xb7, 0x51, 0x0f, 0xc3,
	0xe3, 0x4b, 0x9e, 0xe7, 0xe1, 0x4d, 0x82, 0xee, 0x8c, 0xd4, 0x26, 0x2c, 0xb3, 0xc8, 0xc4, 0xa0,
	0x72, 0xaa, 0xa4, 0xae, 0x32, 0x13, 0xc6, 0x19, 0x7c, 0xd2, 0x95, 0x29, 0x49, 0xa9, 0xc0, 0x00,
	0xbe, 0xfe, 0x05, 0x91, 0x16, 0x34, 0xbc, 0x49, 0x00, 0x92, 0x4c, 0xd2, 0x1a, 0x5c, 0x56, 0x31,
	0x35, 0x69, 0x2e, 0xb5, 0x89, 0xf2, 0xad, 0x3b, 0xfa, 0xb2, 0x10, 0x72, 0xc4, 0xc2, 0x93, 0x1f,
	0x95, 0xd4, 0x06, 0xcf, 0xd1, 0x40, 0x57, 0x4b, 0xbd, 0x52, 0x69, 0x69, 0x52, 0x28, 0xc2, 0xb5,
	0x8c, 0xd6, 0x59, 0x5a, 0xc8, 0x2b, 0xeb, 0xd6, 0xba, 0xef, 0x8f, 0x87, 0xa4, 0xe9, 0x91, 0x5d,
	0x8f, 0x88, 0x5d, 0xcf, 0xbb, 0x6c, 0x8b, 0x6c, 0xeb, 0xe1, 0x27, 0x74, 0xb2, 0x6f, 0x74, 0xfe,
	0x6c, 0xec, 0xd9, 0xd1, 0xb7, 0x85, 0xfa, 0xf5, 0x5e, 0xba, 0x84, 0x42, 0x4b, 0x3c, 0x45, 0x5d,
	0x6d, 0x22, 0xd3, 0x2c, 0x72, 0x3e, 0x7e, 0x20, 0x07, 0xef, 0x4c, 0x5a, 0x1a, 0xf1, 0x37, 0x8e,
	0xd7, 0xa8, 0xa3, 0x00, 0x75, 0xeb, 0x19, 0x0f, 0xd0, 0x85, 0x2f, 0x26, 0x82, 0x87, 0xc1, 0xab,
	0xbf, 0xe0, 0x8e, 0x3b, 0x73, 0x39, 0xb3, 0xff, 0xe1, 0x33, 0x74, 0xea, 0x07, 0x8e, 0xc3, 0x39,
	0xe3, 0xcc, 0xb6, 0x30, 0x42, 0xbd, 0xd9, 0xc4, 0x7d, 0xe6, 0xcc, 0xee, 0x6c, 0x8e, 0x84, 0xfb,
	0xc2, 0x59, 0x38, 0x0f, 0x84, 0xfd, 0x1f, 0xf7, 0xd1, 0xf1, 0x64, 0x3a, 0xf7, 0x04, 0x67, 0xf6,
	0xd1, 0x94, 0xbf, 0x39, 0x09, 0x90, 0xd5, 0xbb, 0x82, 0x3c, 0xad, 0x72, 0x02, 0x2a, 0xa1, 0xbb,
	0x01, 0x34, 0x4d, 0x8b, 0x58, 0x45, 0xcd, 0xfb, 0xd3, 0x04, 0xe8, 0xc1, 0xff, 0x5c, 0xf6, 0x6a,
	0xe6, 0xf1, 0x27, 0x00, 0x00, 0xff, 0xff, 0x2f, 0x02, 0x27, 0x77, 0xf3, 0x01, 0x00, 0x00,
}
