// 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: lab_platform/cros_provision_events.proto

package lab_platform

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)
)

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

// Enum value maps for ChromeOSProvision_Status.
var (
	ChromeOSProvision_Status_name = map[int32]string{
		0: "STATUS_UNKNOWN",
		1: "STATUS_PASS",
		2: "STATUS_FAIL",
		3: "STATUS_ABORT",
	}
	ChromeOSProvision_Status_value = map[string]int32{
		"STATUS_UNKNOWN": 0,
		"STATUS_PASS":    1,
		"STATUS_FAIL":    2,
		"STATUS_ABORT":   3,
	}
)

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

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

func (ChromeOSProvision_Status) Descriptor() protoreflect.EnumDescriptor {
	return file_lab_platform_cros_provision_events_proto_enumTypes[0].Descriptor()
}

func (ChromeOSProvision_Status) Type() protoreflect.EnumType {
	return &file_lab_platform_cros_provision_events_proto_enumTypes[0]
}

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

// Deprecated: Use ChromeOSProvision_Status.Descriptor instead.
func (ChromeOSProvision_Status) EnumDescriptor() ([]byte, []int) {
	return file_lab_platform_cros_provision_events_proto_rawDescGZIP(), []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 // Operations to prepare DUT before provision.
	ChromeOSProvision_Step_NAME_ON_KERNEL     ChromeOSProvision_Step_Name = 2 // Write to kernel.
	ChromeOSProvision_Step_NAME_ON_ROOT_FS    ChromeOSProvision_Step_Name = 3 // Write to root file system.
	ChromeOSProvision_Step_NAME_ON_STATEFUL   ChromeOSProvision_Step_Name = 4 // Write to stateful partition.
	// 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 // Operations to verify if provision is good.
)

// Enum value maps for ChromeOSProvision_Step_Name.
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",
	}
	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) Enum() *ChromeOSProvision_Step_Name {
	p := new(ChromeOSProvision_Step_Name)
	*p = x
	return p
}

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

func (ChromeOSProvision_Step_Name) Descriptor() protoreflect.EnumDescriptor {
	return file_lab_platform_cros_provision_events_proto_enumTypes[1].Descriptor()
}

func (ChromeOSProvision_Step_Name) Type() protoreflect.EnumType {
	return &file_lab_platform_cros_provision_events_proto_enumTypes[1]
}

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

// Deprecated: Use ChromeOSProvision_Step_Name.Descriptor instead.
func (ChromeOSProvision_Step_Name) EnumDescriptor() ([]byte, []int) {
	return file_lab_platform_cros_provision_events_proto_rawDescGZIP(), []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 {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// 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"`
}

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

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

func (*ChromeOSProvision) ProtoMessage() {}

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

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

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

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

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

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

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

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

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

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

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

// Step defines the detail operations in a provision.
type ChromeOSProvision_Step struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

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

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

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

func (*ChromeOSProvision_Step) ProtoMessage() {}

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

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

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

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

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

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

var File_lab_platform_cros_provision_events_proto protoreflect.FileDescriptor

var file_lab_platform_cros_provision_events_proto_rawDesc = []byte{
	0x0a, 0x28, 0x6c, 0x61, 0x62, 0x5f, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x2f, 0x63,
	0x72, 0x6f, 0x73, 0x5f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x65, 0x76,
	0x65, 0x6e, 0x74, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0c, 0x6c, 0x61, 0x62, 0x5f,
	0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 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, 0xcd, 0x07, 0x0a, 0x11, 0x43, 0x68,
	0x72, 0x6f, 0x6d, 0x65, 0x4f, 0x53, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12,
	0x19, 0x0a, 0x08, 0x74, 0x61, 0x73, 0x6b, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28,
	0x09, 0x52, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x55, 0x72, 0x6c, 0x12, 0x1a, 0x0a, 0x08, 0x68, 0x6f,
	0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x68, 0x6f,
	0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x18,
	0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x12, 0x25, 0x0a, 0x0e,
	0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x61, 0x6c, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x18, 0x04,
	0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x61, 0x6c, 0x49, 0x6d,
	0x61, 0x67, 0x65, 0x12, 0x3d, 0x0a, 0x0c, 0x73, 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, 0x5f, 0x74,
	0x69, 0x6d, 0x65, 0x18, 0x05, 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, 0x0b, 0x73, 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, 0x54, 0x69,
	0x6d, 0x65, 0x12, 0x3f, 0x0a, 0x0d, 0x66, 0x69, 0x6e, 0x69, 0x73, 0x68, 0x65, 0x64, 0x5f, 0x74,
	0x69, 0x6d, 0x65, 0x18, 0x06, 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, 0x0c, 0x66, 0x69, 0x6e, 0x69, 0x73, 0x68, 0x65, 0x64, 0x54,
	0x69, 0x6d, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76,
	0x65, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x66, 0x69, 0x6c, 0x65, 0x53, 0x65,
	0x72, 0x76, 0x65, 0x72, 0x12, 0x38, 0x0a, 0x04, 0x73, 0x74, 0x65, 0x70, 0x18, 0x08, 0x20, 0x03,
	0x28, 0x0b, 0x32, 0x24, 0x2e, 0x6c, 0x61, 0x62, 0x5f, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72,
	0x6d, 0x2e, 0x43, 0x68, 0x72, 0x6f, 0x6d, 0x65, 0x4f, 0x53, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73,
	0x69, 0x6f, 0x6e, 0x2e, 0x53, 0x74, 0x65, 0x70, 0x52, 0x04, 0x73, 0x74, 0x65, 0x70, 0x12, 0x3e,
	0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x26,
	0x2e, 0x6c, 0x61, 0x62, 0x5f, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x2e, 0x43, 0x68,
	0x72, 0x6f, 0x6d, 0x65, 0x4f, 0x53, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x2e,
	0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x16,
	0x0a, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06,
	0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x1a, 0xbe, 0x03, 0x0a, 0x04, 0x53, 0x74, 0x65, 0x70, 0x12,
	0x3d, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x29, 0x2e,
	0x6c, 0x61, 0x62, 0x5f, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x2e, 0x43, 0x68, 0x72,
	0x6f, 0x6d, 0x65, 0x4f, 0x53, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x53,
	0x74, 0x65, 0x70, 0x2e, 0x4e, 0x61, 0x6d, 0x65, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x3d,
	0x0a, 0x0c, 0x73, 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x02,
	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, 0x0b, 0x73, 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x3f, 0x0a,
	0x0d, 0x66, 0x69, 0x6e, 0x69, 0x73, 0x68, 0x65, 0x64, 0x5f, 0x74, 0x69, 0x6d, 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, 0x0c, 0x66, 0x69, 0x6e, 0x69, 0x73, 0x68, 0x65, 0x64, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x3e,
	0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x26,
	0x2e, 0x6c, 0x61, 0x62, 0x5f, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x2e, 0x43, 0x68,
	0x72, 0x6f, 0x6d, 0x65, 0x4f, 0x53, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x2e,
	0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x16,
	0x0a, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06,
	0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x22, 0x9e, 0x01, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12,
	0x12, 0x0a, 0x0e, 0x4e, 0x41, 0x4d, 0x45, 0x5f, 0x55, 0x4e, 0x44, 0x45, 0x46, 0x49, 0x4e, 0x45,
	0x44, 0x10, 0x00, 0x12, 0x16, 0x0a, 0x12, 0x4e, 0x41, 0x4d, 0x45, 0x5f, 0x50, 0x52, 0x45, 0x5f,
	0x50, 0x52, 0x4f, 0x56, 0x49, 0x53, 0x49, 0x4f, 0x4e, 0x10, 0x01, 0x12, 0x12, 0x0a, 0x0e, 0x4e,
	0x41, 0x4d, 0x45, 0x5f, 0x4f, 0x4e, 0x5f, 0x4b, 0x45, 0x52, 0x4e, 0x45, 0x4c, 0x10, 0x02, 0x12,
	0x13, 0x0a, 0x0f, 0x4e, 0x41, 0x4d, 0x45, 0x5f, 0x4f, 0x4e, 0x5f, 0x52, 0x4f, 0x4f, 0x54, 0x5f,
	0x46, 0x53, 0x10, 0x03, 0x12, 0x14, 0x0a, 0x10, 0x4e, 0x41, 0x4d, 0x45, 0x5f, 0x4f, 0x4e, 0x5f,
	0x53, 0x54, 0x41, 0x54, 0x45, 0x46, 0x55, 0x4c, 0x10, 0x04, 0x12, 0x12, 0x0a, 0x0e, 0x4e, 0x41,
	0x4d, 0x45, 0x5f, 0x50, 0x4f, 0x53, 0x54, 0x5f, 0x49, 0x4e, 0x53, 0x54, 0x10, 0x05, 0x12, 0x17,
	0x0a, 0x13, 0x4e, 0x41, 0x4d, 0x45, 0x5f, 0x50, 0x4f, 0x53, 0x54, 0x5f, 0x50, 0x52, 0x4f, 0x56,
	0x49, 0x53, 0x49, 0x4f, 0x4e, 0x10, 0x06, 0x22, 0x50, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75,
	0x73, 0x12, 0x12, 0x0a, 0x0e, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x55, 0x4e, 0x4b, 0x4e,
	0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x0f, 0x0a, 0x0b, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f,
	0x50, 0x41, 0x53, 0x53, 0x10, 0x01, 0x12, 0x0f, 0x0a, 0x0b, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53,
	0x5f, 0x46, 0x41, 0x49, 0x4c, 0x10, 0x02, 0x12, 0x10, 0x0a, 0x0c, 0x53, 0x54, 0x41, 0x54, 0x55,
	0x53, 0x5f, 0x41, 0x42, 0x4f, 0x52, 0x54, 0x10, 0x03, 0x42, 0x38, 0x5a, 0x36, 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, 0x6c, 0x61, 0x62, 0x5f, 0x70, 0x6c, 0x61, 0x74, 0x66,
	0x6f, 0x72, 0x6d, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
}

var (
	file_lab_platform_cros_provision_events_proto_rawDescOnce sync.Once
	file_lab_platform_cros_provision_events_proto_rawDescData = file_lab_platform_cros_provision_events_proto_rawDesc
)

func file_lab_platform_cros_provision_events_proto_rawDescGZIP() []byte {
	file_lab_platform_cros_provision_events_proto_rawDescOnce.Do(func() {
		file_lab_platform_cros_provision_events_proto_rawDescData = protoimpl.X.CompressGZIP(file_lab_platform_cros_provision_events_proto_rawDescData)
	})
	return file_lab_platform_cros_provision_events_proto_rawDescData
}

var file_lab_platform_cros_provision_events_proto_enumTypes = make([]protoimpl.EnumInfo, 2)
var file_lab_platform_cros_provision_events_proto_msgTypes = make([]protoimpl.MessageInfo, 2)
var file_lab_platform_cros_provision_events_proto_goTypes = []interface{}{
	(ChromeOSProvision_Status)(0),    // 0: lab_platform.ChromeOSProvision.Status
	(ChromeOSProvision_Step_Name)(0), // 1: lab_platform.ChromeOSProvision.Step.Name
	(*ChromeOSProvision)(nil),        // 2: lab_platform.ChromeOSProvision
	(*ChromeOSProvision_Step)(nil),   // 3: lab_platform.ChromeOSProvision.Step
	(*timestamp.Timestamp)(nil),      // 4: google.protobuf.Timestamp
}
var file_lab_platform_cros_provision_events_proto_depIdxs = []int32{
	4, // 0: lab_platform.ChromeOSProvision.started_time:type_name -> google.protobuf.Timestamp
	4, // 1: lab_platform.ChromeOSProvision.finished_time:type_name -> google.protobuf.Timestamp
	3, // 2: lab_platform.ChromeOSProvision.step:type_name -> lab_platform.ChromeOSProvision.Step
	0, // 3: lab_platform.ChromeOSProvision.status:type_name -> lab_platform.ChromeOSProvision.Status
	1, // 4: lab_platform.ChromeOSProvision.Step.name:type_name -> lab_platform.ChromeOSProvision.Step.Name
	4, // 5: lab_platform.ChromeOSProvision.Step.started_time:type_name -> google.protobuf.Timestamp
	4, // 6: lab_platform.ChromeOSProvision.Step.finished_time:type_name -> google.protobuf.Timestamp
	0, // 7: lab_platform.ChromeOSProvision.Step.status:type_name -> lab_platform.ChromeOSProvision.Status
	8, // [8:8] is the sub-list for method output_type
	8, // [8:8] is the sub-list for method input_type
	8, // [8:8] is the sub-list for extension type_name
	8, // [8:8] is the sub-list for extension extendee
	0, // [0:8] is the sub-list for field type_name
}

func init() { file_lab_platform_cros_provision_events_proto_init() }
func file_lab_platform_cros_provision_events_proto_init() {
	if File_lab_platform_cros_provision_events_proto != nil {
		return
	}
	if !protoimpl.UnsafeEnabled {
		file_lab_platform_cros_provision_events_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*ChromeOSProvision); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_lab_platform_cros_provision_events_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*ChromeOSProvision_Step); 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_lab_platform_cros_provision_events_proto_rawDesc,
			NumEnums:      2,
			NumMessages:   2,
			NumExtensions: 0,
			NumServices:   0,
		},
		GoTypes:           file_lab_platform_cros_provision_events_proto_goTypes,
		DependencyIndexes: file_lab_platform_cros_provision_events_proto_depIdxs,
		EnumInfos:         file_lab_platform_cros_provision_events_proto_enumTypes,
		MessageInfos:      file_lab_platform_cros_provision_events_proto_msgTypes,
	}.Build()
	File_lab_platform_cros_provision_events_proto = out.File
	file_lab_platform_cros_provision_events_proto_rawDesc = nil
	file_lab_platform_cros_provision_events_proto_goTypes = nil
	file_lab_platform_cros_provision_events_proto_depIdxs = nil
}
