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

package side_effects

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

// TKOConfig describes TKO connection params.
type TKOConfig struct {
	// The connection to the TKO CloudSQL instance is done via cloud_sql_proxy.
	// proxy_socket is the UNIX socket used by the cloud_sql_proxy.
	ProxySocket string `protobuf:"bytes,1,opt,name=proxy_socket,proto3" json:"proxy_socket,omitempty"`
	MysqlUser   string `protobuf:"bytes,2,opt,name=mysql_user,proto3" json:"mysql_user,omitempty"`
	// File containing the MySQL password. Populated from the encrypted password.
	MysqlPasswordFile string `protobuf:"bytes,3,opt,name=mysql_password_file,proto3" json:"mysql_password_file,omitempty"`
	// MySQL password encrypted using the Cloud KMS key and encoded as base64
	// string.
	EncryptedMysqlPassword string   `protobuf:"bytes,4,opt,name=encrypted_mysql_password,proto3" json:"encrypted_mysql_password,omitempty"`
	XXX_NoUnkeyedLiteral   struct{} `json:"-"`
	XXX_unrecognized       []byte   `json:"-"`
	XXX_sizecache          int32    `json:"-"`
}

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

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

var xxx_messageInfo_TKOConfig proto.InternalMessageInfo

func (m *TKOConfig) GetProxySocket() string {
	if m != nil {
		return m.ProxySocket
	}
	return ""
}

func (m *TKOConfig) GetMysqlUser() string {
	if m != nil {
		return m.MysqlUser
	}
	return ""
}

func (m *TKOConfig) GetMysqlPasswordFile() string {
	if m != nil {
		return m.MysqlPasswordFile
	}
	return ""
}

func (m *TKOConfig) GetEncryptedMysqlPassword() string {
	if m != nil {
		return m.EncryptedMysqlPassword
	}
	return ""
}

// GoogleStorageConfig describes GS offloading params.
type GoogleStorageConfig struct {
	// Google Storage bucket where the results will be offloaded.
	// E.g. "chromeos-autotest-results".
	Bucket string `protobuf:"bytes,1,opt,name=bucket,proto3" json:"bucket,omitempty"`
	// File containing the gsutil credentials, e.g. a key file of a service
	// acccount.
	CredentialsFile      string   `protobuf:"bytes,2,opt,name=credentials_file,proto3" json:"credentials_file,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *GoogleStorageConfig) Reset()         { *m = GoogleStorageConfig{} }
func (m *GoogleStorageConfig) String() string { return proto.CompactTextString(m) }
func (*GoogleStorageConfig) ProtoMessage()    {}
func (*GoogleStorageConfig) Descriptor() ([]byte, []int) {
	return fileDescriptor_8fdf5a17a3e842d5, []int{1}
}

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

var xxx_messageInfo_GoogleStorageConfig proto.InternalMessageInfo

func (m *GoogleStorageConfig) GetBucket() string {
	if m != nil {
		return m.Bucket
	}
	return ""
}

func (m *GoogleStorageConfig) GetCredentialsFile() string {
	if m != nil {
		return m.CredentialsFile
	}
	return ""
}

// ChromePerfConfig describes the params for uploading Chrome performance
// results to https://chromeperf.appspot.com. These results are displayed on
// the perf dashboard: go/crosbolt.
type ChromePerfConfig struct {
	// Iff true, tko/parse uploads perf results to ChromePerf in addition to
	// uploading results to TKO.
	Enabled              bool     `protobuf:"varint,1,opt,name=enabled,proto3" json:"enabled,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *ChromePerfConfig) Reset()         { *m = ChromePerfConfig{} }
func (m *ChromePerfConfig) String() string { return proto.CompactTextString(m) }
func (*ChromePerfConfig) ProtoMessage()    {}
func (*ChromePerfConfig) Descriptor() ([]byte, []int) {
	return fileDescriptor_8fdf5a17a3e842d5, []int{2}
}

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

var xxx_messageInfo_ChromePerfConfig proto.InternalMessageInfo

func (m *ChromePerfConfig) GetEnabled() bool {
	if m != nil {
		return m.Enabled
	}
	return false
}

// CTSConfig describes CTS results offload params.
type CTSConfig struct {
	// Iff true, gs_offloader offloads CTS results to CTS-specific locations
	// in addition to regular offloading.
	Enabled              bool     `protobuf:"varint,1,opt,name=enabled,proto3" json:"enabled,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *CTSConfig) Reset()         { *m = CTSConfig{} }
func (m *CTSConfig) String() string { return proto.CompactTextString(m) }
func (*CTSConfig) ProtoMessage()    {}
func (*CTSConfig) Descriptor() ([]byte, []int) {
	return fileDescriptor_8fdf5a17a3e842d5, []int{3}
}

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

var xxx_messageInfo_CTSConfig proto.InternalMessageInfo

func (m *CTSConfig) GetEnabled() bool {
	if m != nil {
		return m.Enabled
	}
	return false
}

// Config defines configuration for side effects.
type Config struct {
	Tko                  *TKOConfig           `protobuf:"bytes,1,opt,name=tko,proto3" json:"tko,omitempty"`
	GoogleStorage        *GoogleStorageConfig `protobuf:"bytes,2,opt,name=google_storage,proto3" json:"google_storage,omitempty"`
	ChromePerf           *ChromePerfConfig    `protobuf:"bytes,3,opt,name=chrome_perf,proto3" json:"chrome_perf,omitempty"`
	Cts                  *CTSConfig           `protobuf:"bytes,4,opt,name=cts,proto3" json:"cts,omitempty"`
	XXX_NoUnkeyedLiteral struct{}             `json:"-"`
	XXX_unrecognized     []byte               `json:"-"`
	XXX_sizecache        int32                `json:"-"`
}

func (m *Config) Reset()         { *m = Config{} }
func (m *Config) String() string { return proto.CompactTextString(m) }
func (*Config) ProtoMessage()    {}
func (*Config) Descriptor() ([]byte, []int) {
	return fileDescriptor_8fdf5a17a3e842d5, []int{4}
}

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

var xxx_messageInfo_Config proto.InternalMessageInfo

func (m *Config) GetTko() *TKOConfig {
	if m != nil {
		return m.Tko
	}
	return nil
}

func (m *Config) GetGoogleStorage() *GoogleStorageConfig {
	if m != nil {
		return m.GoogleStorage
	}
	return nil
}

func (m *Config) GetChromePerf() *ChromePerfConfig {
	if m != nil {
		return m.ChromePerf
	}
	return nil
}

func (m *Config) GetCts() *CTSConfig {
	if m != nil {
		return m.Cts
	}
	return nil
}

func init() {
	proto.RegisterType((*TKOConfig)(nil), "test_platform.side_effects.TKOConfig")
	proto.RegisterType((*GoogleStorageConfig)(nil), "test_platform.side_effects.GoogleStorageConfig")
	proto.RegisterType((*ChromePerfConfig)(nil), "test_platform.side_effects.ChromePerfConfig")
	proto.RegisterType((*CTSConfig)(nil), "test_platform.side_effects.CTSConfig")
	proto.RegisterType((*Config)(nil), "test_platform.side_effects.Config")
}

func init() {
	proto.RegisterFile("test_platform/side_effects/config.proto", fileDescriptor_8fdf5a17a3e842d5)
}

var fileDescriptor_8fdf5a17a3e842d5 = []byte{
	// 381 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x84, 0x93, 0xcf, 0x6a, 0xdb, 0x40,
	0x10, 0x87, 0xb1, 0x5d, 0xdc, 0x7a, 0x54, 0x8a, 0x59, 0x43, 0x11, 0x3d, 0x94, 0x22, 0x30, 0x2d,
	0xc5, 0x68, 0x8b, 0x7b, 0x28, 0xf4, 0x58, 0x97, 0xf6, 0x50, 0x68, 0x82, 0x6c, 0x08, 0xc9, 0x65,
	0x91, 0xa5, 0x59, 0x45, 0x58, 0xd2, 0x28, 0xbb, 0x6b, 0x12, 0x3f, 0x4f, 0x9e, 0x23, 0xef, 0x16,
	0xbc, 0x92, 0x8d, 0xec, 0xf8, 0xcf, 0x71, 0x66, 0xbf, 0xf9, 0xe1, 0x6f, 0xc6, 0x82, 0xcf, 0x06,
	0xb5, 0x11, 0x65, 0x16, 0x1a, 0x49, 0x2a, 0xe7, 0x3a, 0x8d, 0x51, 0xa0, 0x94, 0x18, 0x19, 0xcd,
	0x23, 0x2a, 0x64, 0x9a, 0xf8, 0xa5, 0x22, 0x43, 0xec, 0xc3, 0x0e, 0xe8, 0x37, 0x41, 0xef, 0xa9,
	0x05, 0xbd, 0xd9, 0xbf, 0x8b, 0x89, 0xe5, 0x99, 0x07, 0x6f, 0x4b, 0x45, 0x0f, 0x2b, 0xa1, 0x29,
	0x5a, 0xa0, 0x71, 0x5b, 0x9f, 0x5a, 0x5f, 0x7a, 0xc1, 0x4e, 0x8f, 0x7d, 0x04, 0xc8, 0x57, 0xfa,
	0x2e, 0x13, 0x4b, 0x8d, 0xca, 0x6d, 0x5b, 0xa2, 0xd1, 0x61, 0xdf, 0x60, 0x50, 0x55, 0x65, 0xa8,
	0xf5, 0x3d, 0xa9, 0x58, 0xc8, 0x34, 0x43, 0xb7, 0x63, 0xc1, 0x43, 0x4f, 0xec, 0x27, 0xb8, 0x58,
	0x44, 0x6a, 0x55, 0x1a, 0x8c, 0xc5, 0x2e, 0xe0, 0xbe, 0xb2, 0x63, 0x47, 0xdf, 0xbd, 0x6b, 0x18,
	0xfc, 0x25, 0x4a, 0x32, 0x9c, 0x1a, 0x52, 0x61, 0x82, 0xb5, 0xc8, 0x7b, 0xe8, 0xce, 0x97, 0x0d,
	0x85, 0xba, 0x62, 0x5f, 0xa1, 0x1f, 0x29, 0x8c, 0xb1, 0x30, 0x69, 0x98, 0xe9, 0xea, 0x97, 0x55,
	0x0a, 0x2f, 0xfa, 0xde, 0x08, 0xfa, 0x93, 0x5b, 0x45, 0x39, 0x5e, 0xa2, 0x92, 0x75, 0xae, 0x0b,
	0xaf, 0xb1, 0x08, 0xe7, 0x19, 0xc6, 0x36, 0xf8, 0x4d, 0xb0, 0x29, 0xbd, 0x21, 0xf4, 0x26, 0xb3,
	0xe9, 0x59, 0xec, 0xb1, 0x0d, 0xdd, 0x1a, 0xfa, 0x01, 0x1d, 0xb3, 0x20, 0x0b, 0x38, 0xe3, 0xa1,
	0x7f, 0xfc, 0x48, 0xfe, 0xf6, 0x40, 0xc1, 0x7a, 0x82, 0x5d, 0xc1, 0xbb, 0xc4, 0x3a, 0x0b, 0x5d,
	0x49, 0x5b, 0x05, 0x67, 0xcc, 0x4f, 0x65, 0x1c, 0xd8, 0x52, 0xb0, 0x17, 0xc3, 0xfe, 0x83, 0x13,
	0x59, 0x63, 0x51, 0xa2, 0x92, 0xf6, 0x64, 0xce, 0x78, 0x74, 0x2a, 0x75, 0x7f, 0x41, 0x41, 0x33,
	0x60, 0x6d, 0x18, 0x19, 0x6d, 0x6f, 0x78, 0xc6, 0x70, 0xbb, 0xba, 0x60, 0x3d, 0xf1, 0xeb, 0xcf,
	0xcd, 0xef, 0x84, 0x7c, 0x1b, 0x95, 0x2e, 0x73, 0x9f, 0x54, 0xc2, 0x37, 0x05, 0x69, 0x9e, 0x16,
	0x52, 0x85, 0xdc, 0xfe, 0xb7, 0x79, 0x42, 0xfc, 0xf8, 0x67, 0x30, 0xef, 0x5a, 0xe8, 0xfb, 0x73,
	0x00, 0x00, 0x00, 0xff, 0xff, 0xd8, 0x6e, 0x9e, 0xfc, 0x2b, 0x03, 0x00, 0x00,
}
