// Copyright 2020 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/result_flow/publish.proto

package result_flow

import (
	timestamp "github.com/golang/protobuf/ptypes/timestamp"
	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)
)

// PublishRequest defines the input of `result_flow publish`.
type PublishRequest struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Subscribers call Buildbucket to fetch the build information via this ID.
	BuildId int64 `protobuf:"varint,1,opt,name=build_id,json=buildId,proto3" json:"build_id,omitempty"`
	// Should not be used, as the parent CTP build may contain multiple TestPlanRuns.
	// Use parent_uid below.
	//
	// Deprecated: Do not use.
	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"`
	// True if subscribers should fetch the build's final status from
	// Buildbucket. The message may be earlier than the build's completion. If
	// the Buildbucket's response does not contain its final status, subscribers
	// should retry. Otherwise, subscribers should expect an intermediate status
	// of the build.
	ShouldPollForCompletion bool `protobuf:"varint,6,opt,name=should_poll_for_completion,json=shouldPollForCompletion,proto3" json:"should_poll_for_completion,omitempty"`
	// The UID of the parent test plan run, which kicks off this test run.
	// Placed inside the pubsub message for test_runner builds.
	ParentUid string `protobuf:"bytes,7,opt,name=parent_uid,json=parentUid,proto3" json:"parent_uid,omitempty"`
}

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

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

func (*PublishRequest) ProtoMessage() {}

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

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

// Deprecated: Do not use.
func (x *PublishRequest) GetParentBuildId() int64 {
	if x != nil {
		return x.ParentBuildId
	}
	return 0
}

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

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

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

func (x *PublishRequest) GetShouldPollForCompletion() bool {
	if x != nil {
		return x.ShouldPollForCompletion
	}
	return false
}

func (x *PublishRequest) GetParentUid() string {
	if x != nil {
		return x.ParentUid
	}
	return ""
}

// PublishRequest defines the output of `result_flow publish`.
type PublishResponse struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

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

func (x *PublishResponse) Reset() {
	*x = PublishResponse{}
	if protoimpl.UnsafeEnabled {
		mi := &file_test_platform_result_flow_publish_proto_msgTypes[1]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

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

func (*PublishResponse) ProtoMessage() {}

func (x *PublishResponse) ProtoReflect() protoreflect.Message {
	mi := &file_test_platform_result_flow_publish_proto_msgTypes[1]
	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 PublishResponse.ProtoReflect.Descriptor instead.
func (*PublishResponse) Descriptor() ([]byte, []int) {
	return file_test_platform_result_flow_publish_proto_rawDescGZIP(), []int{1}
}

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

var File_test_platform_result_flow_publish_proto protoreflect.FileDescriptor

var file_test_platform_result_flow_publish_proto_rawDesc = []byte{
	0x0a, 0x27, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x2f,
	0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x5f, 0x66, 0x6c, 0x6f, 0x77, 0x2f, 0x70, 0x75, 0x62, 0x6c,
	0x69, 0x73, 0x68, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x19, 0x74, 0x65, 0x73, 0x74, 0x5f,
	0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x2e, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x5f,
	0x66, 0x6c, 0x6f, 0x77, 0x1a, 0x26, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x70, 0x6c, 0x61, 0x74, 0x66,
	0x6f, 0x72, 0x6d, 0x2f, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x5f, 0x66, 0x6c, 0x6f, 0x77, 0x2f,
	0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1f, 0x67, 0x6f,
	0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x74, 0x69,
	0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xf0, 0x02,
	0x0a, 0x0e, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
	0x12, 0x19, 0x0a, 0x08, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01,
	0x28, 0x03, 0x52, 0x07, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x49, 0x64, 0x12, 0x2a, 0x0a, 0x0f, 0x70,
	0x61, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x5f, 0x69, 0x64, 0x18, 0x02,
	0x20, 0x01, 0x28, 0x03, 0x42, 0x02, 0x18, 0x01, 0x52, 0x0d, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74,
	0x42, 0x75, 0x69, 0x6c, 0x64, 0x49, 0x64, 0x12, 0x39, 0x0a, 0x03, 0x63, 0x74, 0x70, 0x18, 0x03,
	0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x70, 0x6c, 0x61, 0x74,
	0x66, 0x6f, 0x72, 0x6d, 0x2e, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x5f, 0x66, 0x6c, 0x6f, 0x77,
	0x2e, 0x50, 0x75, 0x62, 0x53, 0x75, 0x62, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x03, 0x63,
	0x74, 0x70, 0x12, 0x48, 0x0a, 0x0b, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x72, 0x75, 0x6e, 0x6e, 0x65,
	0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x70,
	0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x2e, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x5f, 0x66,
	0x6c, 0x6f, 0x77, 0x2e, 0x50, 0x75, 0x62, 0x53, 0x75, 0x62, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67,
	0x52, 0x0a, 0x74, 0x65, 0x73, 0x74, 0x52, 0x75, 0x6e, 0x6e, 0x65, 0x72, 0x12, 0x36, 0x0a, 0x08,
	0x64, 0x65, 0x61, 0x64, 0x6c, 0x69, 0x6e, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a,
	0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66,
	0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x08, 0x64, 0x65, 0x61, 0x64,
	0x6c, 0x69, 0x6e, 0x65, 0x12, 0x3b, 0x0a, 0x1a, 0x73, 0x68, 0x6f, 0x75, 0x6c, 0x64, 0x5f, 0x70,
	0x6f, 0x6c, 0x6c, 0x5f, 0x66, 0x6f, 0x72, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x69,
	0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x17, 0x73, 0x68, 0x6f, 0x75, 0x6c, 0x64,
	0x50, 0x6f, 0x6c, 0x6c, 0x46, 0x6f, 0x72, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x69, 0x6f,
	0x6e, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x75, 0x69, 0x64, 0x18,
	0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x55, 0x69, 0x64,
	0x22, 0x49, 0x0a, 0x0f, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f,
	0x6e, 0x73, 0x65, 0x12, 0x36, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01,
	0x28, 0x0e, 0x32, 0x20, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f,
	0x72, 0x6d, 0x2e, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x5f, 0x66, 0x6c, 0x6f, 0x77, 0x2e, 0x53,
	0x74, 0x61, 0x74, 0x65, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x42, 0x45, 0x5a, 0x43, 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, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x5f, 0x66, 0x6c,
	0x6f, 0x77, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
}

var (
	file_test_platform_result_flow_publish_proto_rawDescOnce sync.Once
	file_test_platform_result_flow_publish_proto_rawDescData = file_test_platform_result_flow_publish_proto_rawDesc
)

func file_test_platform_result_flow_publish_proto_rawDescGZIP() []byte {
	file_test_platform_result_flow_publish_proto_rawDescOnce.Do(func() {
		file_test_platform_result_flow_publish_proto_rawDescData = protoimpl.X.CompressGZIP(file_test_platform_result_flow_publish_proto_rawDescData)
	})
	return file_test_platform_result_flow_publish_proto_rawDescData
}

var file_test_platform_result_flow_publish_proto_msgTypes = make([]protoimpl.MessageInfo, 2)
var file_test_platform_result_flow_publish_proto_goTypes = []interface{}{
	(*PublishRequest)(nil),      // 0: test_platform.result_flow.PublishRequest
	(*PublishResponse)(nil),     // 1: test_platform.result_flow.PublishResponse
	(*PubSubConfig)(nil),        // 2: test_platform.result_flow.PubSubConfig
	(*timestamp.Timestamp)(nil), // 3: google.protobuf.Timestamp
	(State)(0),                  // 4: test_platform.result_flow.State
}
var file_test_platform_result_flow_publish_proto_depIdxs = []int32{
	2, // 0: test_platform.result_flow.PublishRequest.ctp:type_name -> test_platform.result_flow.PubSubConfig
	2, // 1: test_platform.result_flow.PublishRequest.test_runner:type_name -> test_platform.result_flow.PubSubConfig
	3, // 2: test_platform.result_flow.PublishRequest.deadline:type_name -> google.protobuf.Timestamp
	4, // 3: test_platform.result_flow.PublishResponse.state:type_name -> test_platform.result_flow.State
	4, // [4:4] is the sub-list for method output_type
	4, // [4:4] is the sub-list for method input_type
	4, // [4:4] is the sub-list for extension type_name
	4, // [4:4] is the sub-list for extension extendee
	0, // [0:4] is the sub-list for field type_name
}

func init() { file_test_platform_result_flow_publish_proto_init() }
func file_test_platform_result_flow_publish_proto_init() {
	if File_test_platform_result_flow_publish_proto != nil {
		return
	}
	file_test_platform_result_flow_common_proto_init()
	if !protoimpl.UnsafeEnabled {
		file_test_platform_result_flow_publish_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*PublishRequest); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_test_platform_result_flow_publish_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*PublishResponse); 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_result_flow_publish_proto_rawDesc,
			NumEnums:      0,
			NumMessages:   2,
			NumExtensions: 0,
			NumServices:   0,
		},
		GoTypes:           file_test_platform_result_flow_publish_proto_goTypes,
		DependencyIndexes: file_test_platform_result_flow_publish_proto_depIdxs,
		MessageInfos:      file_test_platform_result_flow_publish_proto_msgTypes,
	}.Build()
	File_test_platform_result_flow_publish_proto = out.File
	file_test_platform_result_flow_publish_proto_rawDesc = nil
	file_test_platform_result_flow_publish_proto_goTypes = nil
	file_test_platform_result_flow_publish_proto_depIdxs = nil
}
