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

package lab

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

// Device action is for adding/removing/locking lab devices/servers.
// NEXT TAG: 5
type DeviceAction struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// This field is informational only. Do not assume this as a real user
	// identity in any auth domain.
	By         string               `protobuf:"bytes,1,opt,name=by,proto3" json:"by,omitempty"`
	Reason     string               `protobuf:"bytes,2,opt,name=reason,proto3" json:"reason,omitempty"`
	BeginTime  *timestamp.Timestamp `protobuf:"bytes,3,opt,name=begin_time,json=beginTime,proto3" json:"begin_time,omitempty"`
	ExpireTime *timestamp.Timestamp `protobuf:"bytes,4,opt,name=expire_time,json=expireTime,proto3" json:"expire_time,omitempty"`
}

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

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

func (*DeviceAction) ProtoMessage() {}

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

func (x *DeviceAction) GetBy() string {
	if x != nil {
		return x.By
	}
	return ""
}

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

func (x *DeviceAction) GetBeginTime() *timestamp.Timestamp {
	if x != nil {
		return x.BeginTime
	}
	return nil
}

func (x *DeviceAction) GetExpireTime() *timestamp.Timestamp {
	if x != nil {
		return x.ExpireTime
	}
	return nil
}

var File_lab_device_action_proto protoreflect.FileDescriptor

var file_lab_device_action_proto_rawDesc = []byte{
	0x0a, 0x17, 0x6c, 0x61, 0x62, 0x2f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x61, 0x63, 0x74,
	0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x03, 0x6c, 0x61, 0x62, 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,
	0xae, 0x01, 0x0a, 0x0c, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e,
	0x12, 0x0e, 0x0a, 0x02, 0x62, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x62, 0x79,
	0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09,
	0x52, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x12, 0x39, 0x0a, 0x0a, 0x62, 0x65, 0x67, 0x69,
	0x6e, 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, 0x09, 0x62, 0x65, 0x67, 0x69, 0x6e, 0x54,
	0x69, 0x6d, 0x65, 0x12, 0x3b, 0x0a, 0x0b, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x5f, 0x74, 0x69,
	0x6d, 0x65, 0x18, 0x04, 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, 0x0a, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x54, 0x69, 0x6d, 0x65,
	0x42, 0x2f, 0x5a, 0x2d, 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, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
}

var (
	file_lab_device_action_proto_rawDescOnce sync.Once
	file_lab_device_action_proto_rawDescData = file_lab_device_action_proto_rawDesc
)

func file_lab_device_action_proto_rawDescGZIP() []byte {
	file_lab_device_action_proto_rawDescOnce.Do(func() {
		file_lab_device_action_proto_rawDescData = protoimpl.X.CompressGZIP(file_lab_device_action_proto_rawDescData)
	})
	return file_lab_device_action_proto_rawDescData
}

var file_lab_device_action_proto_msgTypes = make([]protoimpl.MessageInfo, 1)
var file_lab_device_action_proto_goTypes = []interface{}{
	(*DeviceAction)(nil),        // 0: lab.DeviceAction
	(*timestamp.Timestamp)(nil), // 1: google.protobuf.Timestamp
}
var file_lab_device_action_proto_depIdxs = []int32{
	1, // 0: lab.DeviceAction.begin_time:type_name -> google.protobuf.Timestamp
	1, // 1: lab.DeviceAction.expire_time:type_name -> google.protobuf.Timestamp
	2, // [2:2] is the sub-list for method output_type
	2, // [2:2] is the sub-list for method input_type
	2, // [2:2] is the sub-list for extension type_name
	2, // [2:2] is the sub-list for extension extendee
	0, // [0:2] is the sub-list for field type_name
}

func init() { file_lab_device_action_proto_init() }
func file_lab_device_action_proto_init() {
	if File_lab_device_action_proto != nil {
		return
	}
	if !protoimpl.UnsafeEnabled {
		file_lab_device_action_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*DeviceAction); 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_device_action_proto_rawDesc,
			NumEnums:      0,
			NumMessages:   1,
			NumExtensions: 0,
			NumServices:   0,
		},
		GoTypes:           file_lab_device_action_proto_goTypes,
		DependencyIndexes: file_lab_device_action_proto_depIdxs,
		MessageInfos:      file_lab_device_action_proto_msgTypes,
	}.Build()
	File_lab_device_action_proto = out.File
	file_lab_device_action_proto_rawDesc = nil
	file_lab_device_action_proto_goTypes = nil
	file_lab_device_action_proto_depIdxs = nil
}
