// 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: test_platform/common/task.proto

package common

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

// TaskLogData describes the location at which logs of a test_platform task
// are stored.
type TaskLogData struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// gs_url is the full google storage URL at which a task's logs are stored.
	GsUrl string `protobuf:"bytes,1,opt,name=gs_url,json=gsUrl,proto3" json:"gs_url,omitempty"`
	// stainless_url is the full URL to the stainless logs viewer for archived
	// logs.
	StainlessUrl string `protobuf:"bytes,2,opt,name=stainless_url,json=stainlessUrl,proto3" json:"stainless_url,omitempty"`
}

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

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

func (*TaskLogData) ProtoMessage() {}

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

func (x *TaskLogData) GetGsUrl() string {
	if x != nil {
		return x.GsUrl
	}
	return ""
}

func (x *TaskLogData) GetStainlessUrl() string {
	if x != nil {
		return x.StainlessUrl
	}
	return ""
}

var File_test_platform_common_task_proto protoreflect.FileDescriptor

var file_test_platform_common_task_proto_rawDesc = []byte{
	0x0a, 0x1f, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x2f,
	0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2f, 0x74, 0x61, 0x73, 0x6b, 0x2e, 0x70, 0x72, 0x6f, 0x74,
	0x6f, 0x12, 0x14, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d,
	0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x22, 0x49, 0x0a, 0x0b, 0x54, 0x61, 0x73, 0x6b, 0x4c,
	0x6f, 0x67, 0x44, 0x61, 0x74, 0x61, 0x12, 0x15, 0x0a, 0x06, 0x67, 0x73, 0x5f, 0x75, 0x72, 0x6c,
	0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x67, 0x73, 0x55, 0x72, 0x6c, 0x12, 0x23, 0x0a,
	0x0d, 0x73, 0x74, 0x61, 0x69, 0x6e, 0x6c, 0x65, 0x73, 0x73, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x02,
	0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x73, 0x74, 0x61, 0x69, 0x6e, 0x6c, 0x65, 0x73, 0x73, 0x55,
	0x72, 0x6c, 0x42, 0x40, 0x5a, 0x3e, 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,
	0x74, 0x65, 0x73, 0x74, 0x5f, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x2f, 0x63, 0x6f,
	0x6d, 0x6d, 0x6f, 0x6e, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
}

var (
	file_test_platform_common_task_proto_rawDescOnce sync.Once
	file_test_platform_common_task_proto_rawDescData = file_test_platform_common_task_proto_rawDesc
)

func file_test_platform_common_task_proto_rawDescGZIP() []byte {
	file_test_platform_common_task_proto_rawDescOnce.Do(func() {
		file_test_platform_common_task_proto_rawDescData = protoimpl.X.CompressGZIP(file_test_platform_common_task_proto_rawDescData)
	})
	return file_test_platform_common_task_proto_rawDescData
}

var file_test_platform_common_task_proto_msgTypes = make([]protoimpl.MessageInfo, 1)
var file_test_platform_common_task_proto_goTypes = []interface{}{
	(*TaskLogData)(nil), // 0: test_platform.common.TaskLogData
}
var file_test_platform_common_task_proto_depIdxs = []int32{
	0, // [0:0] is the sub-list for method output_type
	0, // [0:0] is the sub-list for method input_type
	0, // [0:0] is the sub-list for extension type_name
	0, // [0:0] is the sub-list for extension extendee
	0, // [0:0] is the sub-list for field type_name
}

func init() { file_test_platform_common_task_proto_init() }
func file_test_platform_common_task_proto_init() {
	if File_test_platform_common_task_proto != nil {
		return
	}
	if !protoimpl.UnsafeEnabled {
		file_test_platform_common_task_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*TaskLogData); 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_test_platform_common_task_proto_rawDesc,
			NumEnums:      0,
			NumMessages:   1,
			NumExtensions: 0,
			NumServices:   0,
		},
		GoTypes:           file_test_platform_common_task_proto_goTypes,
		DependencyIndexes: file_test_platform_common_task_proto_depIdxs,
		MessageInfos:      file_test_platform_common_task_proto_msgTypes,
	}.Build()
	File_test_platform_common_task_proto = out.File
	file_test_platform_common_task_proto_rawDesc = nil
	file_test_platform_common_task_proto_goTypes = nil
	file_test_platform_common_task_proto_depIdxs = nil
}
