// Code generated by protoc-gen-go. DO NOT EDIT.
// source: lab_platform/cros_provision_events.proto

package lab_platform

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

// Status defines the result for each step or the whole provision process to
// be reported.
type ChromeOSProvision_Status int32

const (
	ChromeOSProvision_STATUS_UNKNOWN ChromeOSProvision_Status = 0
	ChromeOSProvision_STATUS_PASS    ChromeOSProvision_Status = 1
	ChromeOSProvision_STATUS_FAIL    ChromeOSProvision_Status = 2
	ChromeOSProvision_STATUS_ABORT   ChromeOSProvision_Status = 3
)

var ChromeOSProvision_Status_name = map[int32]string{
	0: "STATUS_UNKNOWN",
	1: "STATUS_PASS",
	2: "STATUS_FAIL",
	3: "STATUS_ABORT",
}

var ChromeOSProvision_Status_value = map[string]int32{
	"STATUS_UNKNOWN": 0,
	"STATUS_PASS":    1,
	"STATUS_FAIL":    2,
	"STATUS_ABORT":   3,
}

func (x ChromeOSProvision_Status) String() string {
	return proto.EnumName(ChromeOSProvision_Status_name, int32(x))
}

func (ChromeOSProvision_Status) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_b566e42d7f705d02, []int{0, 0}
}

type ChromeOSProvision_Step_Name int32

const (
	ChromeOSProvision_Step_NAME_UNDEFINED     ChromeOSProvision_Step_Name = 0
	ChromeOSProvision_Step_NAME_PRE_PROVISION ChromeOSProvision_Step_Name = 1
	ChromeOSProvision_Step_NAME_ON_KERNEL     ChromeOSProvision_Step_Name = 2
	ChromeOSProvision_Step_NAME_ON_ROOT_FS    ChromeOSProvision_Step_Name = 3
	ChromeOSProvision_Step_NAME_ON_STATEFUL   ChromeOSProvision_Step_Name = 4
	// Post-install process, e.g. update firmware, set next kernel, etc.
	ChromeOSProvision_Step_NAME_POST_INST      ChromeOSProvision_Step_Name = 5
	ChromeOSProvision_Step_NAME_POST_PROVISION ChromeOSProvision_Step_Name = 6
)

var ChromeOSProvision_Step_Name_name = map[int32]string{
	0: "NAME_UNDEFINED",
	1: "NAME_PRE_PROVISION",
	2: "NAME_ON_KERNEL",
	3: "NAME_ON_ROOT_FS",
	4: "NAME_ON_STATEFUL",
	5: "NAME_POST_INST",
	6: "NAME_POST_PROVISION",
}

var ChromeOSProvision_Step_Name_value = map[string]int32{
	"NAME_UNDEFINED":      0,
	"NAME_PRE_PROVISION":  1,
	"NAME_ON_KERNEL":      2,
	"NAME_ON_ROOT_FS":     3,
	"NAME_ON_STATEFUL":    4,
	"NAME_POST_INST":      5,
	"NAME_POST_PROVISION": 6,
}

func (x ChromeOSProvision_Step_Name) String() string {
	return proto.EnumName(ChromeOSProvision_Step_Name_name, int32(x))
}

func (ChromeOSProvision_Step_Name) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_b566e42d7f705d02, []int{0, 0, 0}
}

// ChromeOSProvision defines the provision events. It contains DUT and image
// information, as well as the details operations done on the DUT.
// Next Tag: 11
type ChromeOSProvision struct {
	// The URL of either AFE job or Swarming task.
	TaskUrl string `protobuf:"bytes,1,opt,name=task_url,json=taskUrl,proto3" json:"task_url,omitempty"`
	// The hostname of the DUT.
	Hostname string `protobuf:"bytes,2,opt,name=hostname,proto3" json:"hostname,omitempty"`
	// The image version to be provisioned, e.g. board-release/R12-34567.0.0.
	Image string `protobuf:"bytes,3,opt,name=image,proto3" json:"image,omitempty"`
	// The original image version before provisioning.
	OriginalImage string               `protobuf:"bytes,4,opt,name=original_image,json=originalImage,proto3" json:"original_image,omitempty"`
	StartedTime   *timestamp.Timestamp `protobuf:"bytes,5,opt,name=started_time,json=startedTime,proto3" json:"started_time,omitempty"`
	FinishedTime  *timestamp.Timestamp `protobuf:"bytes,6,opt,name=finished_time,json=finishedTime,proto3" json:"finished_time,omitempty"`
	// file_server describes the hostname:port of devserver/gs_cache server, e.g.
	// 'chromeos6-devserver4:8888'.
	FileServer           string                    `protobuf:"bytes,7,opt,name=file_server,json=fileServer,proto3" json:"file_server,omitempty"`
	Step                 []*ChromeOSProvision_Step `protobuf:"bytes,8,rep,name=step,proto3" json:"step,omitempty"`
	Status               ChromeOSProvision_Status  `protobuf:"varint,9,opt,name=status,proto3,enum=lab_platform.ChromeOSProvision_Status" json:"status,omitempty"`
	Reason               string                    `protobuf:"bytes,10,opt,name=reason,proto3" json:"reason,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                  `json:"-"`
	XXX_unrecognized     []byte                    `json:"-"`
	XXX_sizecache        int32                     `json:"-"`
}

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

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

var xxx_messageInfo_ChromeOSProvision proto.InternalMessageInfo

func (m *ChromeOSProvision) GetTaskUrl() string {
	if m != nil {
		return m.TaskUrl
	}
	return ""
}

func (m *ChromeOSProvision) GetHostname() string {
	if m != nil {
		return m.Hostname
	}
	return ""
}

func (m *ChromeOSProvision) GetImage() string {
	if m != nil {
		return m.Image
	}
	return ""
}

func (m *ChromeOSProvision) GetOriginalImage() string {
	if m != nil {
		return m.OriginalImage
	}
	return ""
}

func (m *ChromeOSProvision) GetStartedTime() *timestamp.Timestamp {
	if m != nil {
		return m.StartedTime
	}
	return nil
}

func (m *ChromeOSProvision) GetFinishedTime() *timestamp.Timestamp {
	if m != nil {
		return m.FinishedTime
	}
	return nil
}

func (m *ChromeOSProvision) GetFileServer() string {
	if m != nil {
		return m.FileServer
	}
	return ""
}

func (m *ChromeOSProvision) GetStep() []*ChromeOSProvision_Step {
	if m != nil {
		return m.Step
	}
	return nil
}

func (m *ChromeOSProvision) GetStatus() ChromeOSProvision_Status {
	if m != nil {
		return m.Status
	}
	return ChromeOSProvision_STATUS_UNKNOWN
}

func (m *ChromeOSProvision) GetReason() string {
	if m != nil {
		return m.Reason
	}
	return ""
}

// Step defines the detail operations in a provision.
type ChromeOSProvision_Step struct {
	Name                 ChromeOSProvision_Step_Name `protobuf:"varint,1,opt,name=name,proto3,enum=lab_platform.ChromeOSProvision_Step_Name" json:"name,omitempty"`
	StartedTime          *timestamp.Timestamp        `protobuf:"bytes,2,opt,name=started_time,json=startedTime,proto3" json:"started_time,omitempty"`
	FinishedTime         *timestamp.Timestamp        `protobuf:"bytes,3,opt,name=finished_time,json=finishedTime,proto3" json:"finished_time,omitempty"`
	Status               ChromeOSProvision_Status    `protobuf:"varint,4,opt,name=status,proto3,enum=lab_platform.ChromeOSProvision_Status" json:"status,omitempty"`
	Reason               string                      `protobuf:"bytes,5,opt,name=reason,proto3" json:"reason,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                    `json:"-"`
	XXX_unrecognized     []byte                      `json:"-"`
	XXX_sizecache        int32                       `json:"-"`
}

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

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

var xxx_messageInfo_ChromeOSProvision_Step proto.InternalMessageInfo

func (m *ChromeOSProvision_Step) GetName() ChromeOSProvision_Step_Name {
	if m != nil {
		return m.Name
	}
	return ChromeOSProvision_Step_NAME_UNDEFINED
}

func (m *ChromeOSProvision_Step) GetStartedTime() *timestamp.Timestamp {
	if m != nil {
		return m.StartedTime
	}
	return nil
}

func (m *ChromeOSProvision_Step) GetFinishedTime() *timestamp.Timestamp {
	if m != nil {
		return m.FinishedTime
	}
	return nil
}

func (m *ChromeOSProvision_Step) GetStatus() ChromeOSProvision_Status {
	if m != nil {
		return m.Status
	}
	return ChromeOSProvision_STATUS_UNKNOWN
}

func (m *ChromeOSProvision_Step) GetReason() string {
	if m != nil {
		return m.Reason
	}
	return ""
}

func init() {
	proto.RegisterEnum("lab_platform.ChromeOSProvision_Status", ChromeOSProvision_Status_name, ChromeOSProvision_Status_value)
	proto.RegisterEnum("lab_platform.ChromeOSProvision_Step_Name", ChromeOSProvision_Step_Name_name, ChromeOSProvision_Step_Name_value)
	proto.RegisterType((*ChromeOSProvision)(nil), "lab_platform.ChromeOSProvision")
	proto.RegisterType((*ChromeOSProvision_Step)(nil), "lab_platform.ChromeOSProvision.Step")
}

func init() {
	proto.RegisterFile("lab_platform/cros_provision_events.proto", fileDescriptor_b566e42d7f705d02)
}

var fileDescriptor_b566e42d7f705d02 = []byte{
	// 554 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa4, 0x94, 0xc1, 0x4e, 0xdb, 0x40,
	0x10, 0x86, 0x31, 0x71, 0x0c, 0x4c, 0x02, 0xb8, 0x0b, 0xa2, 0x6e, 0x2e, 0x44, 0xa8, 0xad, 0xd2,
	0x8b, 0x2d, 0x51, 0xa9, 0xe2, 0x42, 0xab, 0x50, 0x1c, 0xc9, 0x82, 0xda, 0x91, 0xed, 0xb4, 0x52,
	0x2f, 0xab, 0x85, 0x6e, 0x8c, 0x55, 0xdb, 0x6b, 0xed, 0x6e, 0x78, 0x9c, 0x3e, 0x4a, 0xdf, 0xa0,
	0xef, 0x54, 0xed, 0x3a, 0x26, 0x91, 0x38, 0xd0, 0x8a, 0x43, 0x0e, 0xf3, 0xcd, 0xff, 0xcf, 0xce,
	0xfc, 0x91, 0x0c, 0xa3, 0x82, 0xdc, 0xe0, 0xba, 0x20, 0x72, 0xce, 0x78, 0xe9, 0xdd, 0x72, 0x26,
	0x70, 0xcd, 0xd9, 0x7d, 0x2e, 0x72, 0x56, 0x61, 0x7a, 0x4f, 0x2b, 0x29, 0xdc, 0x9a, 0x33, 0xc9,
	0x50, 0x7f, 0x5d, 0x39, 0x38, 0xce, 0x18, 0xcb, 0x0a, 0xea, 0xe9, 0xde, 0xcd, 0x62, 0xee, 0xc9,
	0xbc, 0xa4, 0x42, 0x92, 0xb2, 0x6e, 0xe4, 0x27, 0x7f, 0xb6, 0xe0, 0xc5, 0xe7, 0x3b, 0xce, 0x4a,
	0x1a, 0x25, 0xd3, 0x76, 0x22, 0x7a, 0x05, 0xdb, 0x92, 0x88, 0x9f, 0x78, 0xc1, 0x0b, 0xc7, 0x18,
	0x1a, 0xa3, 0x9d, 0x78, 0x4b, 0xd5, 0x33, 0x5e, 0xa0, 0x01, 0x6c, 0xdf, 0x31, 0x21, 0x2b, 0x52,
	0x52, 0x67, 0x53, 0xb7, 0x1e, 0x6a, 0x74, 0x08, 0xdd, 0xbc, 0x24, 0x19, 0x75, 0x3a, 0xba, 0xd1,
	0x14, 0xe8, 0x0d, 0xec, 0x31, 0x9e, 0x67, 0x79, 0x45, 0x0a, 0xdc, 0xb4, 0x4d, 0xdd, 0xde, 0x6d,
	0x69, 0xa0, 0x65, 0xe7, 0xd0, 0x17, 0x92, 0x70, 0x49, 0x7f, 0x60, 0xb5, 0xa4, 0xd3, 0x1d, 0x1a,
	0xa3, 0xde, 0xe9, 0xc0, 0x6d, 0x2e, 0x70, 0xdb, 0x0b, 0xdc, 0xb4, 0xbd, 0x20, 0xee, 0x2d, 0xf5,
	0x8a, 0xa0, 0x4f, 0xb0, 0x3b, 0xcf, 0xab, 0x5c, 0xdc, 0xb5, 0x7e, 0xeb, 0x49, 0x7f, 0xbf, 0x35,
	0xe8, 0x01, 0xc7, 0xd0, 0x9b, 0xe7, 0x05, 0xc5, 0x82, 0xf2, 0x7b, 0xca, 0x9d, 0x2d, 0xbd, 0x23,
	0x28, 0x94, 0x68, 0x82, 0xce, 0xc0, 0x14, 0x92, 0xd6, 0xce, 0xf6, 0xb0, 0x33, 0xea, 0x9d, 0xbe,
	0x76, 0xd7, 0x83, 0x76, 0x1f, 0x65, 0xe8, 0x26, 0x92, 0xd6, 0xb1, 0x76, 0xa0, 0x8f, 0x60, 0x09,
	0x49, 0xe4, 0x42, 0x38, 0x3b, 0x43, 0x63, 0xb4, 0x77, 0xfa, 0xf6, 0x69, 0xaf, 0x52, 0xc7, 0x4b,
	0x17, 0x3a, 0x02, 0x8b, 0x53, 0x22, 0x58, 0xe5, 0x80, 0xde, 0x6a, 0x59, 0x0d, 0x7e, 0x77, 0xc0,
	0x54, 0xcf, 0xa0, 0x73, 0x30, 0xf5, 0x1f, 0x62, 0xe8, 0xf1, 0xef, 0xfe, 0x65, 0x35, 0x37, 0x24,
	0x25, 0x8d, 0xb5, 0xed, 0x51, 0xf4, 0x9b, 0xcf, 0x8c, 0xbe, 0xf3, 0x9f, 0xd1, 0xaf, 0xf2, 0x31,
	0x9f, 0x99, 0x4f, 0x77, 0x3d, 0x9f, 0x93, 0x5f, 0x06, 0x98, 0xea, 0x4c, 0x84, 0x60, 0x2f, 0x1c,
	0x7f, 0xf1, 0xf1, 0x2c, 0xbc, 0xf4, 0x27, 0x41, 0xe8, 0x5f, 0xda, 0x1b, 0xe8, 0x08, 0x90, 0x66,
	0xd3, 0x58, 0xfd, 0xa2, 0xaf, 0x41, 0x12, 0x44, 0xa1, 0x6d, 0x3c, 0x68, 0xa3, 0x10, 0x5f, 0xf9,
	0x71, 0xe8, 0x5f, 0xdb, 0x9b, 0xe8, 0x00, 0xf6, 0x5b, 0x16, 0x47, 0x51, 0x8a, 0x27, 0x89, 0xdd,
	0x41, 0x87, 0x60, 0xb7, 0x30, 0x49, 0xc7, 0xa9, 0x3f, 0x99, 0x5d, 0xdb, 0xe6, 0x83, 0x7d, 0x1a,
	0x25, 0x29, 0x0e, 0xc2, 0x24, 0xb5, 0xbb, 0xe8, 0x25, 0x1c, 0xac, 0xd8, 0xea, 0x2d, 0xeb, 0x64,
	0x0a, 0x56, 0x73, 0x8a, 0xb2, 0xa9, 0x21, 0xb3, 0x04, 0xcf, 0xc2, 0xab, 0x30, 0xfa, 0x16, 0xda,
	0x1b, 0x68, 0x1f, 0x7a, 0x4b, 0x36, 0x1d, 0x27, 0x89, 0x6d, 0xac, 0x81, 0xc9, 0x38, 0x50, 0x7b,
	0xd9, 0xd0, 0x5f, 0x82, 0xf1, 0x45, 0x14, 0xa7, 0x76, 0xe7, 0xe2, 0xec, 0xfb, 0x87, 0x8c, 0xb9,
	0xb7, 0x2a, 0xb1, 0x7c, 0x51, 0xba, 0x8c, 0x67, 0x5e, 0x5b, 0x30, 0xe1, 0xe5, 0xd5, 0x9c, 0x93,
	0xe6, 0x63, 0xe0, 0x65, 0xcc, 0x5b, 0x4f, 0xf9, 0xc6, 0xd2, 0xf8, 0xfd, 0xdf, 0x00, 0x00, 0x00,
	0xff, 0xff, 0x23, 0x6d, 0x5a, 0x6a, 0x6b, 0x04, 0x00, 0x00,
}
