// 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/phosphorus/upload_to_gs.proto

package phosphorus

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

// UploadToGSRequest defines the input of `phosphorus upload-to-gs`, for
// uploading to Google Storage.
type UploadToGSRequest struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Deprecated in favor of local_directory, which is the only thing it's used
	// for. Assembling that directory is moving to the 'callers'.
	//
	// Deprecated: Do not use.
	Config *Config `protobuf:"bytes,1,opt,name=config,proto3" json:"config,omitempty"`
	// GS path to upload to, e.g. gs://foo/bar/baz/
	GsDirectory string `protobuf:"bytes,2,opt,name=gs_directory,json=gsDirectory,proto3" json:"gs_directory,omitempty"`
	// Absolute path to local directory to upload to GS, e.g. /usr/local/foo/bar
	LocalDirectory string `protobuf:"bytes,4,opt,name=local_directory,json=localDirectory,proto3" json:"local_directory,omitempty"`
}

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

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

func (*UploadToGSRequest) ProtoMessage() {}

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

// Deprecated: Do not use.
func (x *UploadToGSRequest) GetConfig() *Config {
	if x != nil {
		return x.Config
	}
	return nil
}

func (x *UploadToGSRequest) GetGsDirectory() string {
	if x != nil {
		return x.GsDirectory
	}
	return ""
}

func (x *UploadToGSRequest) GetLocalDirectory() string {
	if x != nil {
		return x.LocalDirectory
	}
	return ""
}

type UploadToGSResponse struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// URL of Google Storage location containing offloaded files
	GsUrl string `protobuf:"bytes,1,opt,name=gs_url,json=gsUrl,proto3" json:"gs_url,omitempty"`
}

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

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

func (*UploadToGSResponse) ProtoMessage() {}

func (x *UploadToGSResponse) ProtoReflect() protoreflect.Message {
	mi := &file_test_platform_phosphorus_upload_to_gs_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 UploadToGSResponse.ProtoReflect.Descriptor instead.
func (*UploadToGSResponse) Descriptor() ([]byte, []int) {
	return file_test_platform_phosphorus_upload_to_gs_proto_rawDescGZIP(), []int{1}
}

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

var File_test_platform_phosphorus_upload_to_gs_proto protoreflect.FileDescriptor

var file_test_platform_phosphorus_upload_to_gs_proto_rawDesc = []byte{
	0x0a, 0x2b, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x2f,
	0x70, 0x68, 0x6f, 0x73, 0x70, 0x68, 0x6f, 0x72, 0x75, 0x73, 0x2f, 0x75, 0x70, 0x6c, 0x6f, 0x61,
	0x64, 0x5f, 0x74, 0x6f, 0x5f, 0x67, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x18, 0x74,
	0x65, 0x73, 0x74, 0x5f, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x2e, 0x70, 0x68, 0x6f,
	0x73, 0x70, 0x68, 0x6f, 0x72, 0x75, 0x73, 0x1a, 0x25, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x70, 0x6c,
	0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x2f, 0x70, 0x68, 0x6f, 0x73, 0x70, 0x68, 0x6f, 0x72, 0x75,
	0x73, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xa3,
	0x01, 0x0a, 0x11, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x54, 0x6f, 0x47, 0x53, 0x52, 0x65, 0x71,
	0x75, 0x65, 0x73, 0x74, 0x12, 0x3c, 0x0a, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x01,
	0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x70, 0x6c, 0x61, 0x74,
	0x66, 0x6f, 0x72, 0x6d, 0x2e, 0x70, 0x68, 0x6f, 0x73, 0x70, 0x68, 0x6f, 0x72, 0x75, 0x73, 0x2e,
	0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x42, 0x02, 0x18, 0x01, 0x52, 0x06, 0x63, 0x6f, 0x6e, 0x66,
	0x69, 0x67, 0x12, 0x21, 0x0a, 0x0c, 0x67, 0x73, 0x5f, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f,
	0x72, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x67, 0x73, 0x44, 0x69, 0x72, 0x65,
	0x63, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x27, 0x0a, 0x0f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x5f, 0x64,
	0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e,
	0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x4a, 0x04,
	0x08, 0x03, 0x10, 0x04, 0x22, 0x2b, 0x0a, 0x12, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x54, 0x6f,
	0x47, 0x53, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x15, 0x0a, 0x06, 0x67, 0x73,
	0x5f, 0x75, 0x72, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x67, 0x73, 0x55, 0x72,
	0x6c, 0x42, 0x44, 0x5a, 0x42, 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, 0x70, 0x68, 0x6f,
	0x73, 0x70, 0x68, 0x6f, 0x72, 0x75, 0x73, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
}

var (
	file_test_platform_phosphorus_upload_to_gs_proto_rawDescOnce sync.Once
	file_test_platform_phosphorus_upload_to_gs_proto_rawDescData = file_test_platform_phosphorus_upload_to_gs_proto_rawDesc
)

func file_test_platform_phosphorus_upload_to_gs_proto_rawDescGZIP() []byte {
	file_test_platform_phosphorus_upload_to_gs_proto_rawDescOnce.Do(func() {
		file_test_platform_phosphorus_upload_to_gs_proto_rawDescData = protoimpl.X.CompressGZIP(file_test_platform_phosphorus_upload_to_gs_proto_rawDescData)
	})
	return file_test_platform_phosphorus_upload_to_gs_proto_rawDescData
}

var file_test_platform_phosphorus_upload_to_gs_proto_msgTypes = make([]protoimpl.MessageInfo, 2)
var file_test_platform_phosphorus_upload_to_gs_proto_goTypes = []interface{}{
	(*UploadToGSRequest)(nil),  // 0: test_platform.phosphorus.UploadToGSRequest
	(*UploadToGSResponse)(nil), // 1: test_platform.phosphorus.UploadToGSResponse
	(*Config)(nil),             // 2: test_platform.phosphorus.Config
}
var file_test_platform_phosphorus_upload_to_gs_proto_depIdxs = []int32{
	2, // 0: test_platform.phosphorus.UploadToGSRequest.config:type_name -> test_platform.phosphorus.Config
	1, // [1:1] is the sub-list for method output_type
	1, // [1:1] is the sub-list for method input_type
	1, // [1:1] is the sub-list for extension type_name
	1, // [1:1] is the sub-list for extension extendee
	0, // [0:1] is the sub-list for field type_name
}

func init() { file_test_platform_phosphorus_upload_to_gs_proto_init() }
func file_test_platform_phosphorus_upload_to_gs_proto_init() {
	if File_test_platform_phosphorus_upload_to_gs_proto != nil {
		return
	}
	file_test_platform_phosphorus_common_proto_init()
	if !protoimpl.UnsafeEnabled {
		file_test_platform_phosphorus_upload_to_gs_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*UploadToGSRequest); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_test_platform_phosphorus_upload_to_gs_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*UploadToGSResponse); 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_phosphorus_upload_to_gs_proto_rawDesc,
			NumEnums:      0,
			NumMessages:   2,
			NumExtensions: 0,
			NumServices:   0,
		},
		GoTypes:           file_test_platform_phosphorus_upload_to_gs_proto_goTypes,
		DependencyIndexes: file_test_platform_phosphorus_upload_to_gs_proto_depIdxs,
		MessageInfos:      file_test_platform_phosphorus_upload_to_gs_proto_msgTypes,
	}.Build()
	File_test_platform_phosphorus_upload_to_gs_proto = out.File
	file_test_platform_phosphorus_upload_to_gs_proto_rawDesc = nil
	file_test_platform_phosphorus_upload_to_gs_proto_goTypes = nil
	file_test_platform_phosphorus_upload_to_gs_proto_depIdxs = nil
}
