// Code generated by protoc-gen-go. DO NOT EDIT.
// source: lab/device_action.proto

package lab

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

// Device action is for adding/removing/locking lab devices/servers.
// NEXT TAG: 5
type DeviceAction struct {
	// 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"`
	XXX_NoUnkeyedLiteral struct{}             `json:"-"`
	XXX_unrecognized     []byte               `json:"-"`
	XXX_sizecache        int32                `json:"-"`
}

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

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

var xxx_messageInfo_DeviceAction proto.InternalMessageInfo

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

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

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

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

func init() {
	proto.RegisterType((*DeviceAction)(nil), "lab.DeviceAction")
}

func init() { proto.RegisterFile("lab/device_action.proto", fileDescriptor_0a63336a987fe581) }

var fileDescriptor_0a63336a987fe581 = []byte{
	// 219 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x84, 0x8f, 0xb1, 0x4e, 0xc3, 0x30,
	0x10, 0x86, 0x95, 0x14, 0x55, 0xea, 0x15, 0x31, 0x78, 0x80, 0xa8, 0x0b, 0x15, 0x53, 0x17, 0x7c,
	0x12, 0x4c, 0x88, 0x09, 0xc4, 0x13, 0x54, 0x4c, 0x2c, 0x95, 0x2f, 0x5c, 0x8d, 0xa5, 0xd8, 0x17,
	0x39, 0x2e, 0x22, 0x2f, 0xc5, 0x33, 0xa2, 0xd8, 0x64, 0xee, 0xf8, 0xfd, 0xfa, 0xbf, 0xfb, 0x75,
	0x70, 0xd3, 0x19, 0xc2, 0x4f, 0xfe, 0x76, 0x2d, 0x1f, 0x4c, 0x9b, 0x9c, 0x04, 0xdd, 0x47, 0x49,
	0xa2, 0x16, 0x9d, 0xa1, 0xcd, 0xad, 0x15, 0xb1, 0x1d, 0x63, 0x8e, 0xe8, 0x74, 0xc4, 0xe4, 0x3c,
	0x0f, 0xc9, 0xf8, 0xbe, 0xb4, 0xee, 0x7e, 0x2b, 0xb8, 0x7c, 0xcb, 0xf6, 0x4b, 0x96, 0xd5, 0x15,
	0xd4, 0x34, 0x36, 0xd5, 0xb6, 0xda, 0xad, 0xf6, 0x35, 0x8d, 0xea, 0x1a, 0x96, 0x91, 0xcd, 0x20,
	0xa1, 0xa9, 0x73, 0xf6, 0x4f, 0xea, 0x09, 0x80, 0xd8, 0xba, 0x70, 0x98, 0x2e, 0x36, 0x8b, 0x6d,
	0xb5, 0x5b, 0x3f, 0x6c, 0x74, 0x99, 0xd3, 0xf3, 0x9c, 0x7e, 0x9f, 0xe7, 0xf6, 0xab, 0xdc, 0x9e,
	0x58, 0x3d, 0xc3, 0x9a, 0x7f, 0x7a, 0x17, 0xb9, 0xb8, 0x17, 0x67, 0x5d, 0x28, 0xf5, 0x29, 0x78,
	0xc5, 0x8f, 0x7b, 0x2b, 0xba, 0xfd, 0x8a, 0xe2, 0xdd, 0xc9, 0x6b, 0x89, 0x16, 0x67, 0x90, 0x01,
	0x5d, 0x38, 0x46, 0x53, 0xbe, 0x45, 0x2b, 0xd8, 0x19, 0xa2, 0x65, 0xa6, 0xc7, 0xbf, 0x00, 0x00,
	0x00, 0xff, 0xff, 0x4a, 0x42, 0xe8, 0x3f, 0x29, 0x01, 0x00, 0x00,
}
