// 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/ctp.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)
)

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

	// The source config for fetching a CTP build.
	Ctp *Source `protobuf:"bytes,1,opt,name=ctp,proto3" json:"ctp,omitempty"`
	// The target to upload the result flow output.
	TestPlanRun *Target `protobuf:"bytes,2,opt,name=test_plan_run,json=testPlanRun,proto3" json:"test_plan_run,omitempty"`
	// Hard deadline for execution.
	//
	// CTP command should abort beyond this deadline.
	Deadline *timestamp.Timestamp `protobuf:"bytes,3,opt,name=deadline,proto3" json:"deadline,omitempty"`
}

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

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

func (*CTPRequest) ProtoMessage() {}

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

func (x *CTPRequest) GetCtp() *Source {
	if x != nil {
		return x.Ctp
	}
	return nil
}

func (x *CTPRequest) GetTestPlanRun() *Target {
	if x != nil {
		return x.TestPlanRun
	}
	return nil
}

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

// CTPResponse defines the output of `result_flow ctp`.
type CTPResponse struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// `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 State `protobuf:"varint,1,opt,name=state,proto3,enum=test_platform.result_flow.State" json:"state,omitempty"`
}

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

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

func (*CTPResponse) ProtoMessage() {}

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

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

var File_test_platform_result_flow_ctp_proto protoreflect.FileDescriptor

var file_test_platform_result_flow_ctp_proto_rawDesc = []byte{
	0x0a, 0x23, 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, 0x74, 0x70, 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, 0xc0, 0x01, 0x0a, 0x0a, 0x43, 0x54,
	0x50, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x33, 0x0a, 0x03, 0x63, 0x74, 0x70, 0x18,
	0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 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, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x03, 0x63, 0x74, 0x70, 0x12, 0x45, 0x0a,
	0x0d, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x70, 0x6c, 0x61, 0x6e, 0x5f, 0x72, 0x75, 0x6e, 0x18, 0x02,
	0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 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, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x0b, 0x74, 0x65, 0x73, 0x74, 0x50, 0x6c, 0x61,
	0x6e, 0x52, 0x75, 0x6e, 0x12, 0x36, 0x0a, 0x08, 0x64, 0x65, 0x61, 0x64, 0x6c, 0x69, 0x6e, 0x65,
	0x18, 0x03, 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, 0x22, 0x45, 0x0a, 0x0b,
	0x43, 0x54, 0x50, 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_ctp_proto_rawDescOnce sync.Once
	file_test_platform_result_flow_ctp_proto_rawDescData = file_test_platform_result_flow_ctp_proto_rawDesc
)

func file_test_platform_result_flow_ctp_proto_rawDescGZIP() []byte {
	file_test_platform_result_flow_ctp_proto_rawDescOnce.Do(func() {
		file_test_platform_result_flow_ctp_proto_rawDescData = protoimpl.X.CompressGZIP(file_test_platform_result_flow_ctp_proto_rawDescData)
	})
	return file_test_platform_result_flow_ctp_proto_rawDescData
}

var file_test_platform_result_flow_ctp_proto_msgTypes = make([]protoimpl.MessageInfo, 2)
var file_test_platform_result_flow_ctp_proto_goTypes = []interface{}{
	(*CTPRequest)(nil),          // 0: test_platform.result_flow.CTPRequest
	(*CTPResponse)(nil),         // 1: test_platform.result_flow.CTPResponse
	(*Source)(nil),              // 2: test_platform.result_flow.Source
	(*Target)(nil),              // 3: test_platform.result_flow.Target
	(*timestamp.Timestamp)(nil), // 4: google.protobuf.Timestamp
	(State)(0),                  // 5: test_platform.result_flow.State
}
var file_test_platform_result_flow_ctp_proto_depIdxs = []int32{
	2, // 0: test_platform.result_flow.CTPRequest.ctp:type_name -> test_platform.result_flow.Source
	3, // 1: test_platform.result_flow.CTPRequest.test_plan_run:type_name -> test_platform.result_flow.Target
	4, // 2: test_platform.result_flow.CTPRequest.deadline:type_name -> google.protobuf.Timestamp
	5, // 3: test_platform.result_flow.CTPResponse.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_ctp_proto_init() }
func file_test_platform_result_flow_ctp_proto_init() {
	if File_test_platform_result_flow_ctp_proto != nil {
		return
	}
	file_test_platform_result_flow_common_proto_init()
	if !protoimpl.UnsafeEnabled {
		file_test_platform_result_flow_ctp_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*CTPRequest); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_test_platform_result_flow_ctp_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*CTPResponse); 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_ctp_proto_rawDesc,
			NumEnums:      0,
			NumMessages:   2,
			NumExtensions: 0,
			NumServices:   0,
		},
		GoTypes:           file_test_platform_result_flow_ctp_proto_goTypes,
		DependencyIndexes: file_test_platform_result_flow_ctp_proto_depIdxs,
		MessageInfos:      file_test_platform_result_flow_ctp_proto_msgTypes,
	}.Build()
	File_test_platform_result_flow_ctp_proto = out.File
	file_test_platform_result_flow_ctp_proto_rawDesc = nil
	file_test_platform_result_flow_ctp_proto_goTypes = nil
	file_test_platform_result_flow_ctp_proto_depIdxs = nil
}
