// Copyright 2019 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/multibot/requests.proto

package multibot

import (
	test_platform "go.chromium.org/chromiumos/infra/proto/go/test_platform"
	phosphorus "go.chromium.org/chromiumos/infra/proto/go/test_platform/phosphorus"
	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)
)

// External API for requesting a multi-bot job
type LeaderRequest struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// What test to run with the multi-bot task
	Payload *test_platform.Request_Test `protobuf:"bytes,1,opt,name=payload,proto3" json:"payload,omitempty"`
	// What attributes to require and provision for follower tasks
	FollowerSpecs []*FollowerSpec `protobuf:"bytes,2,rep,name=follower_specs,json=followerSpecs,proto3" json:"follower_specs,omitempty"`
}

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

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

func (*LeaderRequest) ProtoMessage() {}

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

func (x *LeaderRequest) GetPayload() *test_platform.Request_Test {
	if x != nil {
		return x.Payload
	}
	return nil
}

func (x *LeaderRequest) GetFollowerSpecs() []*FollowerSpec {
	if x != nil {
		return x.FollowerSpecs
	}
	return nil
}

// Internal per-bot request for follower task
type FollowerRequest struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Pubsub subscription to use for this follower task (pre-existing)
	SubscriptionName string `protobuf:"bytes,1,opt,name=subscription_name,json=subscriptionName,proto3" json:"subscription_name,omitempty"`
	// Attribute filter to apply to judge whether incoming messages are 'for you'
	IncomingFilter map[string]string `protobuf:"bytes,2,rep,name=incoming_filter,json=incomingFilter,proto3" json:"incoming_filter,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
	// Attributes to apply to outgoing messages to address them to the leader
	OutgoingAttributes map[string]string `protobuf:"bytes,3,rep,name=outgoing_attributes,json=outgoingAttributes,proto3" json:"outgoing_attributes,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
	// Prejob request parameters
	Prejob *phosphorus.PrejobRequest `protobuf:"bytes,4,opt,name=prejob,proto3" json:"prejob,omitempty"`
}

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

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

func (*FollowerRequest) ProtoMessage() {}

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

func (x *FollowerRequest) GetSubscriptionName() string {
	if x != nil {
		return x.SubscriptionName
	}
	return ""
}

func (x *FollowerRequest) GetIncomingFilter() map[string]string {
	if x != nil {
		return x.IncomingFilter
	}
	return nil
}

func (x *FollowerRequest) GetOutgoingAttributes() map[string]string {
	if x != nil {
		return x.OutgoingAttributes
	}
	return nil
}

func (x *FollowerRequest) GetPrejob() *phosphorus.PrejobRequest {
	if x != nil {
		return x.Prejob
	}
	return nil
}

var File_test_platform_multibot_requests_proto protoreflect.FileDescriptor

var file_test_platform_multibot_requests_proto_rawDesc = []byte{
	0x0a, 0x25, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x2f,
	0x6d, 0x75, 0x6c, 0x74, 0x69, 0x62, 0x6f, 0x74, 0x2f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
	0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x16, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x70, 0x6c,
	0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x2e, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x62, 0x6f, 0x74, 0x1a,
	0x25, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x2f, 0x70,
	0x68, 0x6f, 0x73, 0x70, 0x68, 0x6f, 0x72, 0x75, 0x73, 0x2f, 0x70, 0x72, 0x65, 0x6a, 0x6f, 0x62,
	0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x23, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x70, 0x6c, 0x61,
	0x74, 0x66, 0x6f, 0x72, 0x6d, 0x2f, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x62, 0x6f, 0x74, 0x2f, 0x63,
	0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1b, 0x74, 0x65, 0x73,
	0x74, 0x5f, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x2f, 0x72, 0x65, 0x71, 0x75, 0x65,
	0x73, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x93, 0x01, 0x0a, 0x0d, 0x4c, 0x65, 0x61,
	0x64, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x35, 0x0a, 0x07, 0x70, 0x61,
	0x79, 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x74, 0x65,
	0x73, 0x74, 0x5f, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x2e, 0x52, 0x65, 0x71, 0x75,
	0x65, 0x73, 0x74, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x52, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61,
	0x64, 0x12, 0x4b, 0x0a, 0x0e, 0x66, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x72, 0x5f, 0x73, 0x70,
	0x65, 0x63, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x74, 0x65, 0x73, 0x74,
	0x5f, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x2e, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x62,
	0x6f, 0x74, 0x2e, 0x46, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x72, 0x53, 0x70, 0x65, 0x63, 0x52,
	0x0d, 0x66, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x72, 0x53, 0x70, 0x65, 0x63, 0x73, 0x22, 0xe1,
	0x03, 0x0a, 0x0f, 0x46, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65,
	0x73, 0x74, 0x12, 0x2b, 0x0a, 0x11, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69,
	0x6f, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x73,
	0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x12,
	0x64, 0x0a, 0x0f, 0x69, 0x6e, 0x63, 0x6f, 0x6d, 0x69, 0x6e, 0x67, 0x5f, 0x66, 0x69, 0x6c, 0x74,
	0x65, 0x72, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3b, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x5f,
	0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x2e, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x62, 0x6f,
	0x74, 0x2e, 0x46, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73,
	0x74, 0x2e, 0x49, 0x6e, 0x63, 0x6f, 0x6d, 0x69, 0x6e, 0x67, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72,
	0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0e, 0x69, 0x6e, 0x63, 0x6f, 0x6d, 0x69, 0x6e, 0x67, 0x46,
	0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x70, 0x0a, 0x13, 0x6f, 0x75, 0x74, 0x67, 0x6f, 0x69, 0x6e,
	0x67, 0x5f, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03,
	0x28, 0x0b, 0x32, 0x3f, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f,
	0x72, 0x6d, 0x2e, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x62, 0x6f, 0x74, 0x2e, 0x46, 0x6f, 0x6c, 0x6c,
	0x6f, 0x77, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x4f, 0x75, 0x74, 0x67,
	0x6f, 0x69, 0x6e, 0x67, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x45, 0x6e,
	0x74, 0x72, 0x79, 0x52, 0x12, 0x6f, 0x75, 0x74, 0x67, 0x6f, 0x69, 0x6e, 0x67, 0x41, 0x74, 0x74,
	0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x12, 0x3f, 0x0a, 0x06, 0x70, 0x72, 0x65, 0x6a, 0x6f,
	0x62, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x70,
	0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x2e, 0x70, 0x68, 0x6f, 0x73, 0x70, 0x68, 0x6f, 0x72,
	0x75, 0x73, 0x2e, 0x50, 0x72, 0x65, 0x6a, 0x6f, 0x62, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
	0x52, 0x06, 0x70, 0x72, 0x65, 0x6a, 0x6f, 0x62, 0x1a, 0x41, 0x0a, 0x13, 0x49, 0x6e, 0x63, 0x6f,
	0x6d, 0x69, 0x6e, 0x67, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12,
	0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65,
	0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09,
	0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x45, 0x0a, 0x17, 0x4f,
	0x75, 0x74, 0x67, 0x6f, 0x69, 0x6e, 0x67, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65,
	0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20,
	0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75,
	0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02,
	0x38, 0x01, 0x42, 0x42, 0x5a, 0x40, 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, 0x6d, 0x75,
	0x6c, 0x74, 0x69, 0x62, 0x6f, 0x74, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
}

var (
	file_test_platform_multibot_requests_proto_rawDescOnce sync.Once
	file_test_platform_multibot_requests_proto_rawDescData = file_test_platform_multibot_requests_proto_rawDesc
)

func file_test_platform_multibot_requests_proto_rawDescGZIP() []byte {
	file_test_platform_multibot_requests_proto_rawDescOnce.Do(func() {
		file_test_platform_multibot_requests_proto_rawDescData = protoimpl.X.CompressGZIP(file_test_platform_multibot_requests_proto_rawDescData)
	})
	return file_test_platform_multibot_requests_proto_rawDescData
}

var file_test_platform_multibot_requests_proto_msgTypes = make([]protoimpl.MessageInfo, 4)
var file_test_platform_multibot_requests_proto_goTypes = []interface{}{
	(*LeaderRequest)(nil),              // 0: test_platform.multibot.LeaderRequest
	(*FollowerRequest)(nil),            // 1: test_platform.multibot.FollowerRequest
	nil,                                // 2: test_platform.multibot.FollowerRequest.IncomingFilterEntry
	nil,                                // 3: test_platform.multibot.FollowerRequest.OutgoingAttributesEntry
	(*test_platform.Request_Test)(nil), // 4: test_platform.Request.Test
	(*FollowerSpec)(nil),               // 5: test_platform.multibot.FollowerSpec
	(*phosphorus.PrejobRequest)(nil),   // 6: test_platform.phosphorus.PrejobRequest
}
var file_test_platform_multibot_requests_proto_depIdxs = []int32{
	4, // 0: test_platform.multibot.LeaderRequest.payload:type_name -> test_platform.Request.Test
	5, // 1: test_platform.multibot.LeaderRequest.follower_specs:type_name -> test_platform.multibot.FollowerSpec
	2, // 2: test_platform.multibot.FollowerRequest.incoming_filter:type_name -> test_platform.multibot.FollowerRequest.IncomingFilterEntry
	3, // 3: test_platform.multibot.FollowerRequest.outgoing_attributes:type_name -> test_platform.multibot.FollowerRequest.OutgoingAttributesEntry
	6, // 4: test_platform.multibot.FollowerRequest.prejob:type_name -> test_platform.phosphorus.PrejobRequest
	5, // [5:5] is the sub-list for method output_type
	5, // [5:5] is the sub-list for method input_type
	5, // [5:5] is the sub-list for extension type_name
	5, // [5:5] is the sub-list for extension extendee
	0, // [0:5] is the sub-list for field type_name
}

func init() { file_test_platform_multibot_requests_proto_init() }
func file_test_platform_multibot_requests_proto_init() {
	if File_test_platform_multibot_requests_proto != nil {
		return
	}
	file_test_platform_multibot_common_proto_init()
	if !protoimpl.UnsafeEnabled {
		file_test_platform_multibot_requests_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*LeaderRequest); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_test_platform_multibot_requests_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*FollowerRequest); 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_multibot_requests_proto_rawDesc,
			NumEnums:      0,
			NumMessages:   4,
			NumExtensions: 0,
			NumServices:   0,
		},
		GoTypes:           file_test_platform_multibot_requests_proto_goTypes,
		DependencyIndexes: file_test_platform_multibot_requests_proto_depIdxs,
		MessageInfos:      file_test_platform_multibot_requests_proto_msgTypes,
	}.Build()
	File_test_platform_multibot_requests_proto = out.File
	file_test_platform_multibot_requests_proto_rawDesc = nil
	file_test_platform_multibot_requests_proto_goTypes = nil
	file_test_platform_multibot_requests_proto_depIdxs = nil
}
