// Code generated by protoc-gen-go. DO NOT EDIT.
// source: test_platform/multibot/follower_transitions.proto

package test_platform_multibot

import (
	fmt "fmt"
	proto "github.com/golang/protobuf/proto"
	skylab_local_state "go.chromium.org/chromiumos/infra/proto/go/test_platform/skylab_local_state"
	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

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
)

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",
}

var 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) String() string {
	return proto.EnumName(FollowerStateChange_FollowerState_name, int32(x))
}

func (FollowerStateChange_FollowerState) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_68299ef9013451bf, []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 {
	NewState             FollowerStateChange_FollowerState `protobuf:"varint,1,opt,name=new_state,json=newState,proto3,enum=test_platform.multibot.FollowerStateChange_FollowerState" json:"new_state,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                          `json:"-"`
	XXX_unrecognized     []byte                            `json:"-"`
	XXX_sizecache        int32                             `json:"-"`
}

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

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

var xxx_messageInfo_FollowerStateChange proto.InternalMessageInfo

func (m *FollowerStateChange) GetNewState() FollowerStateChange_FollowerState {
	if m != nil {
		return m.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 {
	// Types that are valid to be assigned to Event:
	//	*FollowerEvent_FinishedPrejob_
	//	*FollowerEvent_Died
	Event                isFollowerEvent_Event `protobuf_oneof:"event"`
	XXX_NoUnkeyedLiteral struct{}              `json:"-"`
	XXX_unrecognized     []byte                `json:"-"`
	XXX_sizecache        int32                 `json:"-"`
}

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

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

var xxx_messageInfo_FollowerEvent proto.InternalMessageInfo

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() {}

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

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

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

// XXX_OneofWrappers is for the internal use of the proto package.
func (*FollowerEvent) XXX_OneofWrappers() []interface{} {
	return []interface{}{
		(*FollowerEvent_FinishedPrejob_)(nil),
		(*FollowerEvent_Died)(nil),
	}
}

type FollowerEvent_FinishedPrejob struct {
	HostInfo             *skylab_local_state.MultiBotHostInfo `protobuf:"bytes,1,opt,name=host_info,json=hostInfo,proto3" json:"host_info,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                             `json:"-"`
	XXX_unrecognized     []byte                               `json:"-"`
	XXX_sizecache        int32                                `json:"-"`
}

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

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

var xxx_messageInfo_FollowerEvent_FinishedPrejob proto.InternalMessageInfo

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

func init() {
	proto.RegisterEnum("test_platform.multibot.FollowerStateChange_FollowerState", FollowerStateChange_FollowerState_name, FollowerStateChange_FollowerState_value)
	proto.RegisterType((*FollowerStateChange)(nil), "test_platform.multibot.FollowerStateChange")
	proto.RegisterType((*FollowerEvent)(nil), "test_platform.multibot.FollowerEvent")
	proto.RegisterType((*FollowerEvent_FinishedPrejob)(nil), "test_platform.multibot.FollowerEvent.FinishedPrejob")
}

func init() {
	proto.RegisterFile("test_platform/multibot/follower_transitions.proto", fileDescriptor_68299ef9013451bf)
}

var fileDescriptor_68299ef9013451bf = []byte{
	// 375 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x84, 0x91, 0x41, 0x4f, 0xfa, 0x40,
	0x10, 0xc5, 0xe9, 0x3f, 0x7f, 0x15, 0xd6, 0x50, 0xea, 0xa2, 0x06, 0x89, 0x87, 0x86, 0x13, 0xa7,
	0x82, 0xe8, 0xc5, 0x9b, 0x85, 0x16, 0x69, 0x82, 0x85, 0x94, 0xa2, 0xf1, 0xb4, 0x69, 0x65, 0x6b,
	0xab, 0x65, 0x97, 0x74, 0x57, 0x89, 0xdf, 0xc0, 0xcf, 0xeb, 0xc9, 0xa3, 0x69, 0xb7, 0x24, 0x56,
	0x49, 0xbc, 0xed, 0xbe, 0x37, 0xbf, 0x99, 0x37, 0x19, 0x70, 0xc6, 0x31, 0xe3, 0x68, 0x15, 0x7b,
	0x3c, 0xa0, 0xc9, 0xb2, 0xb3, 0x7c, 0x89, 0x79, 0xe4, 0x53, 0xde, 0x09, 0x68, 0x1c, 0xd3, 0x35,
	0x4e, 0x10, 0x4f, 0x3c, 0xc2, 0x22, 0x1e, 0x51, 0xc2, 0xb4, 0x55, 0x42, 0x39, 0x85, 0xc7, 0x05,
	0x44, 0xdb, 0x20, 0xcd, 0x6e, 0xb1, 0x15, 0x7b, 0x7e, 0x8b, 0x3d, 0x1f, 0xc5, 0xf4, 0xc1, 0x8b,
	0x11, 0xe3, 0x1e, 0xc7, 0xa2, 0x7b, 0x48, 0x19, 0x17, 0x9d, 0x5a, 0x9f, 0x12, 0xa8, 0x0f, 0xf3,
	0x41, 0xb3, 0xb4, 0x62, 0x10, 0x7a, 0xe4, 0x11, 0xc3, 0x5b, 0x50, 0x21, 0x78, 0x2d, 0xa0, 0x86,
	0xa4, 0x4a, 0x6d, 0xb9, 0x77, 0xa9, 0x6d, 0x9f, 0xaa, 0x6d, 0xe1, 0x8b, 0x9a, 0x53, 0x26, 0x78,
	0x9d, 0xbd, 0x5a, 0xef, 0x12, 0xa8, 0x16, 0x3c, 0x58, 0x07, 0xb5, 0x99, 0xab, 0xbb, 0x26, 0x9a,
	0xdb, 0x86, 0x39, 0xb4, 0x6c, 0xd3, 0x50, 0x4a, 0xf0, 0x00, 0x54, 0x85, 0x38, 0x73, 0x75, 0xc7,
	0x35, 0x0d, 0x45, 0x81, 0x2a, 0x38, 0x15, 0xd2, 0x9d, 0x6e, 0xb9, 0x96, 0x7d, 0x8d, 0xdc, 0x09,
	0x72, 0xe6, 0x36, 0x9a, 0xea, 0xf7, 0xe3, 0x89, 0x6e, 0x28, 0x2a, 0x3c, 0x01, 0x47, 0xa2, 0xc2,
	0x99, 0xdb, 0x76, 0x5a, 0xb1, 0xb1, 0xba, 0x10, 0x02, 0x59, 0x58, 0x83, 0xb1, 0xa9, 0xa7, 0x9e,
	0x72, 0xd5, 0xfa, 0xf8, 0x16, 0xc5, 0x7c, 0xc5, 0x84, 0x43, 0x04, 0x6a, 0x41, 0x44, 0x22, 0x16,
	0xe2, 0x05, 0x5a, 0x25, 0xf8, 0x89, 0xfa, 0xd9, 0xea, 0xfb, 0xbd, 0x8b, 0xbf, 0x56, 0xcf, 0x78,
	0x6d, 0x98, 0xc3, 0xd3, 0x8c, 0x1d, 0x95, 0x1c, 0x39, 0x28, 0x28, 0xf0, 0x10, 0xfc, 0x5f, 0x44,
	0x78, 0xd1, 0xf8, 0xa7, 0x4a, 0xed, 0xf2, 0xa8, 0xe4, 0x64, 0xbf, 0xa6, 0x07, 0xe4, 0x22, 0x09,
	0x27, 0xa0, 0x92, 0xde, 0x08, 0x45, 0x24, 0xa0, 0x79, 0x84, 0xde, 0x8f, 0x08, 0xbf, 0x6f, 0xab,
	0xdd, 0xa4, 0xa9, 0xfa, 0x94, 0x8f, 0x28, 0xe3, 0x16, 0x09, 0xa8, 0x53, 0x0e, 0xf3, 0x57, 0x7f,
	0x0f, 0xec, 0xe0, 0x34, 0xa2, 0xbf, 0x9b, 0x9d, 0xfd, 0xfc, 0x2b, 0x00, 0x00, 0xff, 0xff, 0x59,
	0xa7, 0xcb, 0x4a, 0x75, 0x02, 0x00, 0x00,
}
