// 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/follower_transitions.proto

package multibot

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

type FollowerStateChange_FollowerState int32

const (
	FollowerStateChange_STATE_UNDEFINED FollowerStateChange_FollowerState = 0
	// Follower task has started executing. Note: follower will enter this state
	// automatically once it starts.
	FollowerStateChange_STATE_STARTED FollowerStateChange_FollowerState = 16
	// Follower task is waiting; payload has not started running.
	// Note: follower will enter this state automatically after finishing
	// prejob work and informing leader.
	FollowerStateChange_STATE_WAITING_TO_RUN_PAYLOAD FollowerStateChange_FollowerState = 32
	// Follower task is waiting; payload is running on leader.
	FollowerStateChange_STATE_RUNNING_PAYLOAD FollowerStateChange_FollowerState = 48
	// Follower task is running any necessary cleanup, after which it will
	// terminate.
	FollowerStateChange_STATE_CLEANING FollowerStateChange_FollowerState = 64
)

// Enum value maps for FollowerStateChange_FollowerState.
var (
	FollowerStateChange_FollowerState_name = map[int32]string{
		0:  "STATE_UNDEFINED",
		16: "STATE_STARTED",
		32: "STATE_WAITING_TO_RUN_PAYLOAD",
		48: "STATE_RUNNING_PAYLOAD",
		64: "STATE_CLEANING",
	}
	FollowerStateChange_FollowerState_value = map[string]int32{
		"STATE_UNDEFINED":              0,
		"STATE_STARTED":                16,
		"STATE_WAITING_TO_RUN_PAYLOAD": 32,
		"STATE_RUNNING_PAYLOAD":        48,
		"STATE_CLEANING":               64,
	}
)

func (x FollowerStateChange_FollowerState) Enum() *FollowerStateChange_FollowerState {
	p := new(FollowerStateChange_FollowerState)
	*p = x
	return p
}

func (x FollowerStateChange_FollowerState) String() string {
	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
}

func (FollowerStateChange_FollowerState) Descriptor() protoreflect.EnumDescriptor {
	return file_test_platform_multibot_follower_transitions_proto_enumTypes[0].Descriptor()
}

func (FollowerStateChange_FollowerState) Type() protoreflect.EnumType {
	return &file_test_platform_multibot_follower_transitions_proto_enumTypes[0]
}

func (x FollowerStateChange_FollowerState) Number() protoreflect.EnumNumber {
	return protoreflect.EnumNumber(x)
}

// Deprecated: Use FollowerStateChange_FollowerState.Descriptor instead.
func (FollowerStateChange_FollowerState) EnumDescriptor() ([]byte, []int) {
	return file_test_platform_multibot_follower_transitions_proto_rawDescGZIP(), []int{0, 0}
}

// FollowerStateChange is sent over the multibot Leader->Follower channel, to
// carry state change information. The follower will only respect forward state
// changes. The same message is used internally between follower states.
type FollowerStateChange struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	NewState FollowerStateChange_FollowerState `protobuf:"varint,1,opt,name=new_state,json=newState,proto3,enum=test_platform.multibot.FollowerStateChange_FollowerState" json:"new_state,omitempty"`
}

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

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

func (*FollowerStateChange) ProtoMessage() {}

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

func (x *FollowerStateChange) GetNewState() FollowerStateChange_FollowerState {
	if x != nil {
		return x.NewState
	}
	return FollowerStateChange_STATE_UNDEFINED
}

// FollowerEvent is sent over the multibot Follower->Leader channel, to carry
// follower event information. The leader may use this to change state,
// depending on leader-specific logic and its internal state.
type FollowerEvent struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Types that are assignable to Event:
	//	*FollowerEvent_FinishedPrejob_
	//	*FollowerEvent_Died
	Event isFollowerEvent_Event `protobuf_oneof:"event"`
}

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

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

func (*FollowerEvent) ProtoMessage() {}

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

func (m *FollowerEvent) GetEvent() isFollowerEvent_Event {
	if m != nil {
		return m.Event
	}
	return nil
}

func (x *FollowerEvent) GetFinishedPrejob() *FollowerEvent_FinishedPrejob {
	if x, ok := x.GetEvent().(*FollowerEvent_FinishedPrejob_); ok {
		return x.FinishedPrejob
	}
	return nil
}

func (x *FollowerEvent) GetDied() bool {
	if x, ok := x.GetEvent().(*FollowerEvent_Died); ok {
		return x.Died
	}
	return false
}

type isFollowerEvent_Event interface {
	isFollowerEvent_Event()
}

type FollowerEvent_FinishedPrejob_ struct {
	FinishedPrejob *FollowerEvent_FinishedPrejob `protobuf:"bytes,1,opt,name=finished_prejob,json=finishedPrejob,proto3,oneof"`
}

type FollowerEvent_Died struct {
	Died bool `protobuf:"varint,2,opt,name=died,proto3,oneof"`
}

func (*FollowerEvent_FinishedPrejob_) isFollowerEvent_Event() {}

func (*FollowerEvent_Died) isFollowerEvent_Event() {}

type FollowerEvent_FinishedPrejob struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	HostInfo *skylab_local_state.MultiBotHostInfo `protobuf:"bytes,1,opt,name=host_info,json=hostInfo,proto3" json:"host_info,omitempty"`
}

func (x *FollowerEvent_FinishedPrejob) Reset() {
	*x = FollowerEvent_FinishedPrejob{}
	if protoimpl.UnsafeEnabled {
		mi := &file_test_platform_multibot_follower_transitions_proto_msgTypes[2]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

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

func (*FollowerEvent_FinishedPrejob) ProtoMessage() {}

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

func (x *FollowerEvent_FinishedPrejob) GetHostInfo() *skylab_local_state.MultiBotHostInfo {
	if x != nil {
		return x.HostInfo
	}
	return nil
}

var File_test_platform_multibot_follower_transitions_proto protoreflect.FileDescriptor

var file_test_platform_multibot_follower_transitions_proto_rawDesc = []byte{
	0x0a, 0x31, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x2f,
	0x6d, 0x75, 0x6c, 0x74, 0x69, 0x62, 0x6f, 0x74, 0x2f, 0x66, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x65,
	0x72, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 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, 0x30, 0x74, 0x65, 0x73,
	0x74, 0x5f, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x2f, 0x73, 0x6b, 0x79, 0x6c, 0x61,
	0x62, 0x5f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2f, 0x6d, 0x75,
	0x6c, 0x74, 0x69, 0x68, 0x6f, 0x73, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xf8, 0x01,
	0x0a, 0x13, 0x46, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x65, 0x43,
	0x68, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x56, 0x0a, 0x09, 0x6e, 0x65, 0x77, 0x5f, 0x73, 0x74, 0x61,
	0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x39, 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, 0x74, 0x61, 0x74, 0x65, 0x43,
	0x68, 0x61, 0x6e, 0x67, 0x65, 0x2e, 0x46, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x72, 0x53, 0x74,
	0x61, 0x74, 0x65, 0x52, 0x08, 0x6e, 0x65, 0x77, 0x53, 0x74, 0x61, 0x74, 0x65, 0x22, 0x88, 0x01,
	0x0a, 0x0d, 0x46, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12,
	0x13, 0x0a, 0x0f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x55, 0x4e, 0x44, 0x45, 0x46, 0x49, 0x4e,
	0x45, 0x44, 0x10, 0x00, 0x12, 0x11, 0x0a, 0x0d, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x53, 0x54,
	0x41, 0x52, 0x54, 0x45, 0x44, 0x10, 0x10, 0x12, 0x20, 0x0a, 0x1c, 0x53, 0x54, 0x41, 0x54, 0x45,
	0x5f, 0x57, 0x41, 0x49, 0x54, 0x49, 0x4e, 0x47, 0x5f, 0x54, 0x4f, 0x5f, 0x52, 0x55, 0x4e, 0x5f,
	0x50, 0x41, 0x59, 0x4c, 0x4f, 0x41, 0x44, 0x10, 0x20, 0x12, 0x19, 0x0a, 0x15, 0x53, 0x54, 0x41,
	0x54, 0x45, 0x5f, 0x52, 0x55, 0x4e, 0x4e, 0x49, 0x4e, 0x47, 0x5f, 0x50, 0x41, 0x59, 0x4c, 0x4f,
	0x41, 0x44, 0x10, 0x30, 0x12, 0x12, 0x0a, 0x0e, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x43, 0x4c,
	0x45, 0x41, 0x4e, 0x49, 0x4e, 0x47, 0x10, 0x40, 0x22, 0xf2, 0x01, 0x0a, 0x0d, 0x46, 0x6f, 0x6c,
	0x6c, 0x6f, 0x77, 0x65, 0x72, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x5f, 0x0a, 0x0f, 0x66, 0x69,
	0x6e, 0x69, 0x73, 0x68, 0x65, 0x64, 0x5f, 0x70, 0x72, 0x65, 0x6a, 0x6f, 0x62, 0x18, 0x01, 0x20,
	0x01, 0x28, 0x0b, 0x32, 0x34, 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, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x46, 0x69, 0x6e, 0x69, 0x73,
	0x68, 0x65, 0x64, 0x50, 0x72, 0x65, 0x6a, 0x6f, 0x62, 0x48, 0x00, 0x52, 0x0e, 0x66, 0x69, 0x6e,
	0x69, 0x73, 0x68, 0x65, 0x64, 0x50, 0x72, 0x65, 0x6a, 0x6f, 0x62, 0x12, 0x14, 0x0a, 0x04, 0x64,
	0x69, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, 0x04, 0x64, 0x69, 0x65,
	0x64, 0x1a, 0x61, 0x0a, 0x0e, 0x46, 0x69, 0x6e, 0x69, 0x73, 0x68, 0x65, 0x64, 0x50, 0x72, 0x65,
	0x6a, 0x6f, 0x62, 0x12, 0x4f, 0x0a, 0x09, 0x68, 0x6f, 0x73, 0x74, 0x5f, 0x69, 0x6e, 0x66, 0x6f,
	0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x70, 0x6c,
	0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x2e, 0x73, 0x6b, 0x79, 0x6c, 0x61, 0x62, 0x5f, 0x6c, 0x6f,
	0x63, 0x61, 0x6c, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x42,
	0x6f, 0x74, 0x48, 0x6f, 0x73, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x08, 0x68, 0x6f, 0x73, 0x74,
	0x49, 0x6e, 0x66, 0x6f, 0x42, 0x07, 0x0a, 0x05, 0x65, 0x76, 0x65, 0x6e, 0x74, 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_follower_transitions_proto_rawDescOnce sync.Once
	file_test_platform_multibot_follower_transitions_proto_rawDescData = file_test_platform_multibot_follower_transitions_proto_rawDesc
)

func file_test_platform_multibot_follower_transitions_proto_rawDescGZIP() []byte {
	file_test_platform_multibot_follower_transitions_proto_rawDescOnce.Do(func() {
		file_test_platform_multibot_follower_transitions_proto_rawDescData = protoimpl.X.CompressGZIP(file_test_platform_multibot_follower_transitions_proto_rawDescData)
	})
	return file_test_platform_multibot_follower_transitions_proto_rawDescData
}

var file_test_platform_multibot_follower_transitions_proto_enumTypes = make([]protoimpl.EnumInfo, 1)
var file_test_platform_multibot_follower_transitions_proto_msgTypes = make([]protoimpl.MessageInfo, 3)
var file_test_platform_multibot_follower_transitions_proto_goTypes = []interface{}{
	(FollowerStateChange_FollowerState)(0),      // 0: test_platform.multibot.FollowerStateChange.FollowerState
	(*FollowerStateChange)(nil),                 // 1: test_platform.multibot.FollowerStateChange
	(*FollowerEvent)(nil),                       // 2: test_platform.multibot.FollowerEvent
	(*FollowerEvent_FinishedPrejob)(nil),        // 3: test_platform.multibot.FollowerEvent.FinishedPrejob
	(*skylab_local_state.MultiBotHostInfo)(nil), // 4: test_platform.skylab_local_state.MultiBotHostInfo
}
var file_test_platform_multibot_follower_transitions_proto_depIdxs = []int32{
	0, // 0: test_platform.multibot.FollowerStateChange.new_state:type_name -> test_platform.multibot.FollowerStateChange.FollowerState
	3, // 1: test_platform.multibot.FollowerEvent.finished_prejob:type_name -> test_platform.multibot.FollowerEvent.FinishedPrejob
	4, // 2: test_platform.multibot.FollowerEvent.FinishedPrejob.host_info:type_name -> test_platform.skylab_local_state.MultiBotHostInfo
	3, // [3:3] is the sub-list for method output_type
	3, // [3:3] is the sub-list for method input_type
	3, // [3:3] is the sub-list for extension type_name
	3, // [3:3] is the sub-list for extension extendee
	0, // [0:3] is the sub-list for field type_name
}

func init() { file_test_platform_multibot_follower_transitions_proto_init() }
func file_test_platform_multibot_follower_transitions_proto_init() {
	if File_test_platform_multibot_follower_transitions_proto != nil {
		return
	}
	if !protoimpl.UnsafeEnabled {
		file_test_platform_multibot_follower_transitions_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*FollowerStateChange); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_test_platform_multibot_follower_transitions_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*FollowerEvent); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_test_platform_multibot_follower_transitions_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*FollowerEvent_FinishedPrejob); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
	}
	file_test_platform_multibot_follower_transitions_proto_msgTypes[1].OneofWrappers = []interface{}{
		(*FollowerEvent_FinishedPrejob_)(nil),
		(*FollowerEvent_Died)(nil),
	}
	type x struct{}
	out := protoimpl.TypeBuilder{
		File: protoimpl.DescBuilder{
			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
			RawDescriptor: file_test_platform_multibot_follower_transitions_proto_rawDesc,
			NumEnums:      1,
			NumMessages:   3,
			NumExtensions: 0,
			NumServices:   0,
		},
		GoTypes:           file_test_platform_multibot_follower_transitions_proto_goTypes,
		DependencyIndexes: file_test_platform_multibot_follower_transitions_proto_depIdxs,
		EnumInfos:         file_test_platform_multibot_follower_transitions_proto_enumTypes,
		MessageInfos:      file_test_platform_multibot_follower_transitions_proto_msgTypes,
	}.Build()
	File_test_platform_multibot_follower_transitions_proto = out.File
	file_test_platform_multibot_follower_transitions_proto_rawDesc = nil
	file_test_platform_multibot_follower_transitions_proto_goTypes = nil
	file_test_platform_multibot_follower_transitions_proto_depIdxs = nil
}
