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

package test_platform

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

// ServiceVersion denotes the version of services (e.g. the skylab CLI) that
// can trigger Test Platform's Buildbucket builders (e.g. cros_test_platform
// and dut_leaser). It is used to ensure that users keep their local versions
// of such services up-to-date.
type ServiceVersion struct {
	SkylabTool           int64    `protobuf:"varint,2,opt,name=skylab_tool,json=skylabTool,proto3" json:"skylab_tool,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_ServiceVersion proto.InternalMessageInfo

func (m *ServiceVersion) GetSkylabTool() int64 {
	if m != nil {
		return m.SkylabTool
	}
	return 0
}

func init() {
	proto.RegisterType((*ServiceVersion)(nil), "test_platform.ServiceVersion")
}

func init() {
	proto.RegisterFile("test_platform/service_version.proto", fileDescriptor_418c2109a1e5e267)
}

var fileDescriptor_418c2109a1e5e267 = []byte{
	// 162 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x52, 0x2e, 0x49, 0x2d, 0x2e,
	0x89, 0x2f, 0xc8, 0x49, 0x2c, 0x49, 0xcb, 0x2f, 0xca, 0xd5, 0x2f, 0x4e, 0x2d, 0x2a, 0xcb, 0x4c,
	0x4e, 0x8d, 0x2f, 0x4b, 0x2d, 0x2a, 0xce, 0xcc, 0xcf, 0xd3, 0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x17,
	0xe2, 0x45, 0x51, 0xa4, 0x64, 0xcf, 0xc5, 0x17, 0x0c, 0x51, 0x17, 0x06, 0x51, 0x26, 0x24, 0xcf,
	0xc5, 0x5d, 0x9c, 0x5d, 0x99, 0x93, 0x98, 0x14, 0x5f, 0x92, 0x9f, 0x9f, 0x23, 0xc1, 0xa4, 0xc0,
	0xa8, 0xc1, 0x1c, 0xc4, 0x05, 0x11, 0x0a, 0xc9, 0xcf, 0xcf, 0xf1, 0x62, 0xe1, 0x60, 0x14, 0x60,
	0x0a, 0x62, 0x4b, 0xcf, 0xc9, 0x4f, 0x4a, 0xcc, 0x71, 0xb2, 0x8c, 0x32, 0x4f, 0xcf, 0xd7, 0x4b,
	0xce, 0x28, 0xca, 0xcf, 0xcd, 0x2c, 0xcd, 0xd5, 0xcb, 0x2f, 0x4a, 0xd7, 0x87, 0x71, 0xf2, 0x8b,
	0xf5, 0x33, 0xf3, 0xd2, 0x8a, 0x12, 0xf5, 0xc1, 0x36, 0xeb, 0xa7, 0xe7, 0xeb, 0xa3, 0xd8, 0x9d,
	0xc4, 0x06, 0x16, 0x37, 0x06, 0x04, 0x00, 0x00, 0xff, 0xff, 0x19, 0x6a, 0x2a, 0xf1, 0xb8, 0x00,
	0x00, 0x00,
}
