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

// PublishRequest defines the input of `result_flow publish`.
type PublishRequest struct {
	BuildId       int64 `protobuf:"varint,1,opt,name=build_id,json=buildId,proto3" json:"build_id,omitempty"`
	ParentBuildId int64 `protobuf:"varint,2,opt,name=parent_build_id,json=parentBuildId,proto3" json:"parent_build_id,omitempty"`
	// PubSub endpoint to publish a CTP build.
	Ctp *PubSubConfig `protobuf:"bytes,3,opt,name=ctp,proto3" json:"ctp,omitempty"`
	// PubSub endpoint to publish a test runner build.
	TestRunner *PubSubConfig `protobuf:"bytes,4,opt,name=test_runner,json=testRunner,proto3" json:"test_runner,omitempty"`
	// Hard deadline for execution.
	//
	// Publish command should abort beyond this deadline.
	Deadline             *timestamp.Timestamp `protobuf:"bytes,5,opt,name=deadline,proto3" json:"deadline,omitempty"`
	XXX_NoUnkeyedLiteral struct{}             `json:"-"`
	XXX_unrecognized     []byte               `json:"-"`
	XXX_sizecache        int32                `json:"-"`
}

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

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

var xxx_messageInfo_PublishRequest proto.InternalMessageInfo

func (m *PublishRequest) GetBuildId() int64 {
	if m != nil {
		return m.BuildId
	}
	return 0
}

func (m *PublishRequest) GetParentBuildId() int64 {
	if m != nil {
		return m.ParentBuildId
	}
	return 0
}

func (m *PublishRequest) GetCtp() *PubSubConfig {
	if m != nil {
		return m.Ctp
	}
	return nil
}

func (m *PublishRequest) GetTestRunner() *PubSubConfig {
	if m != nil {
		return m.TestRunner
	}
	return nil
}

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

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

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

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

var xxx_messageInfo_PublishResponse proto.InternalMessageInfo

func (m *PublishResponse) GetState() State {
	if m != nil {
		return m.State
	}
	return State_STATE_UNSPECIFIED
}

func init() {
	proto.RegisterType((*PublishRequest)(nil), "test_platform.result_flow.PublishRequest")
	proto.RegisterType((*PublishResponse)(nil), "test_platform.result_flow.PublishResponse")
}

func init() {
	proto.RegisterFile("test_platform/result_flow/publish.proto", fileDescriptor_c45128fac736122f)
}

var fileDescriptor_c45128fac736122f = []byte{
	// 312 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0xd1, 0x41, 0x6b, 0xc2, 0x30,
	0x14, 0x07, 0x70, 0xd4, 0xb9, 0x49, 0x64, 0x0a, 0x3d, 0x55, 0x2f, 0x13, 0x0f, 0xea, 0x29, 0x01,
	0x07, 0xc2, 0xae, 0xca, 0x60, 0xde, 0xa4, 0xee, 0xb4, 0x4b, 0x69, 0x6d, 0x5a, 0x03, 0x49, 0x5e,
	0x96, 0xbc, 0xb0, 0xaf, 0xb1, 0x8f, 0x3c, 0x4c, 0xa6, 0x6c, 0x07, 0x07, 0x3b, 0xbe, 0xf2, 0x7b,
	0xff, 0xb6, 0xff, 0x47, 0xe6, 0xc8, 0x1d, 0xe6, 0x46, 0x16, 0x58, 0x83, 0x55, 0xcc, 0x72, 0xe7,
	0x25, 0xe6, 0xb5, 0x84, 0x0f, 0x66, 0x7c, 0x29, 0x85, 0x3b, 0x52, 0x63, 0x01, 0x21, 0x19, 0xfd,
	0x82, 0xf4, 0x07, 0x1c, 0xcf, 0xae, 0x67, 0x1c, 0x40, 0x29, 0xd0, 0x31, 0x62, 0xfc, 0xd0, 0x00,
	0x34, 0x92, 0xb3, 0x30, 0x95, 0xbe, 0x66, 0x28, 0x14, 0x77, 0x58, 0x28, 0x13, 0xc1, 0xf4, 0xb3,
	0x4d, 0x06, 0xbb, 0xf8, 0xd6, 0x8c, 0xbf, 0x7b, 0xee, 0x30, 0x19, 0x91, 0x5e, 0xe9, 0x85, 0xac,
	0x72, 0x51, 0xa5, 0xad, 0x49, 0x6b, 0xd1, 0xc9, 0xee, 0xc2, 0xbc, 0xad, 0x92, 0x19, 0x19, 0x9a,
	0xc2, 0x72, 0x8d, 0xf9, 0x45, 0xb4, 0x83, 0xb8, 0x8f, 0x8f, 0xd7, 0xdf, 0xee, 0x89, 0x74, 0x0e,
	0x68, 0xd2, 0xce, 0xa4, 0xb5, 0xe8, 0x2f, 0xe7, 0xf4, 0xea, 0x7f, 0xd0, 0x9d, 0x2f, 0xf7, 0xbe,
	0xdc, 0x80, 0xae, 0x45, 0x93, 0x9d, 0x76, 0x92, 0x17, 0xd2, 0x0f, 0xdc, 0x7a, 0xad, 0xb9, 0x4d,
	0x6f, 0xfe, 0x17, 0x41, 0x4e, 0x2e, 0x0b, 0xab, 0xc9, 0x8a, 0xf4, 0x2a, 0x5e, 0x54, 0x52, 0x68,
	0x9e, 0x76, 0x43, 0xcc, 0x98, 0xc6, 0x3a, 0xe8, 0xb9, 0x0e, 0xfa, 0x7a, 0xae, 0x23, 0xbb, 0xd8,
	0xe9, 0x96, 0x0c, 0x2f, 0x8d, 0x38, 0x03, 0xda, 0xf1, 0x64, 0x45, 0xba, 0x0e, 0x0b, 0xe4, 0xa1,
	0x8f, 0xc1, 0x72, 0xf2, 0xc7, 0xe7, 0xec, 0x4f, 0x2e, 0x8b, 0x7c, 0xfd, 0xfc, 0xb6, 0x69, 0x80,
	0x1e, 0x8e, 0x16, 0x94, 0xf0, 0x8a, 0x82, 0x6d, 0xd8, 0x79, 0x00, 0xc7, 0x84, 0xae, 0x6d, 0x11,
	0x4f, 0xc3, 0x1a, 0x60, 0x57, 0x4f, 0x5a, 0xde, 0x06, 0xf3, 0xf8, 0x15, 0x00, 0x00, 0xff, 0xff,
	0x81, 0x9b, 0xd3, 0x0a, 0x3a, 0x02, 0x00, 0x00,
}
