Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
K
k3s
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Registry
Registry
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Jacklull
k3s
Commits
fc8ff61e
Commit
fc8ff61e
authored
Feb 22, 2018
by
Mike Danese
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
kms: rename KMSService to KeyManagmentService
KMSService is redundent.
parent
da564ef4
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
56 additions
and
56 deletions
+56
-56
grpc_service.go
...server/pkg/storage/value/encrypt/envelope/grpc_service.go
+3
-3
grpc_service_unix_test.go
.../storage/value/encrypt/envelope/grpc_service_unix_test.go
+1
-1
service.pb.go
.../pkg/storage/value/encrypt/envelope/v1beta1/service.pb.go
+51
-51
service.proto
.../pkg/storage/value/encrypt/envelope/v1beta1/service.proto
+1
-1
No files found.
staging/src/k8s.io/apiserver/pkg/storage/value/encrypt/envelope/grpc_service.go
View file @
fc8ff61e
...
...
@@ -46,7 +46,7 @@ const (
// The gRPC implementation for envelope.Service.
type
gRPCService
struct
{
// gRPC client instance
kmsClient
kmsapi
.
K
MS
ServiceClient
kmsClient
kmsapi
.
K
eyManagement
ServiceClient
connection
*
grpc
.
ClientConn
}
...
...
@@ -64,7 +64,7 @@ func NewGRPCService(endpoint string) (Service, error) {
return
nil
,
fmt
.
Errorf
(
"connect remote KMS provider %q failed, error: %v"
,
addr
,
err
)
}
kmsClient
:=
kmsapi
.
NewK
MS
ServiceClient
(
connection
)
kmsClient
:=
kmsapi
.
NewK
eyManagement
ServiceClient
(
connection
)
err
=
checkAPIVersion
(
kmsClient
)
if
err
!=
nil
{
...
...
@@ -99,7 +99,7 @@ func parseEndpoint(endpoint string) (string, error) {
// Check the KMS provider API version.
// Only matching kmsapiVersion is supported now.
func
checkAPIVersion
(
kmsClient
kmsapi
.
K
MS
ServiceClient
)
error
{
func
checkAPIVersion
(
kmsClient
kmsapi
.
K
eyManagement
ServiceClient
)
error
{
ctx
,
cancel
:=
context
.
WithTimeout
(
context
.
Background
(),
timeout
)
defer
cancel
()
...
...
staging/src/k8s.io/apiserver/pkg/storage/value/encrypt/envelope/grpc_service_unix_test.go
View file @
fc8ff61e
...
...
@@ -124,7 +124,7 @@ func startTestKMSProvider() (*grpc.Server, error) {
}
server
:=
grpc
.
NewServer
()
kmsapi
.
RegisterK
MS
ServiceServer
(
server
,
&
base64Server
{})
kmsapi
.
RegisterK
eyManagement
ServiceServer
(
server
,
&
base64Server
{})
go
server
.
Serve
(
listener
)
return
server
,
nil
}
...
...
staging/src/k8s.io/apiserver/pkg/storage/value/encrypt/envelope/v1beta1/service.pb.go
View file @
fc8ff61e
...
...
@@ -209,9 +209,9 @@ var _ grpc.ClientConn
// is compatible with the grpc package it is being compiled against.
const
_
=
grpc
.
SupportPackageIsVersion4
// Client API for K
MS
Service service
// Client API for K
eyManagement
Service service
type
K
MS
ServiceClient
interface
{
type
K
eyManagement
ServiceClient
interface
{
// Version returns the runtime name and runtime version of the KMS provider.
Version
(
ctx
context
.
Context
,
in
*
VersionRequest
,
opts
...
grpc
.
CallOption
)
(
*
VersionResponse
,
error
)
// Execute decryption operation in KMS provider.
...
...
@@ -220,44 +220,44 @@ type KMSServiceClient interface {
Encrypt
(
ctx
context
.
Context
,
in
*
EncryptRequest
,
opts
...
grpc
.
CallOption
)
(
*
EncryptResponse
,
error
)
}
type
k
MS
ServiceClient
struct
{
type
k
eyManagement
ServiceClient
struct
{
cc
*
grpc
.
ClientConn
}
func
NewK
MSServiceClient
(
cc
*
grpc
.
ClientConn
)
KMS
ServiceClient
{
return
&
k
MS
ServiceClient
{
cc
}
func
NewK
eyManagementServiceClient
(
cc
*
grpc
.
ClientConn
)
KeyManagement
ServiceClient
{
return
&
k
eyManagement
ServiceClient
{
cc
}
}
func
(
c
*
k
MS
ServiceClient
)
Version
(
ctx
context
.
Context
,
in
*
VersionRequest
,
opts
...
grpc
.
CallOption
)
(
*
VersionResponse
,
error
)
{
func
(
c
*
k
eyManagement
ServiceClient
)
Version
(
ctx
context
.
Context
,
in
*
VersionRequest
,
opts
...
grpc
.
CallOption
)
(
*
VersionResponse
,
error
)
{
out
:=
new
(
VersionResponse
)
err
:=
grpc
.
Invoke
(
ctx
,
"/v1beta1.K
MS
Service/Version"
,
in
,
out
,
c
.
cc
,
opts
...
)
err
:=
grpc
.
Invoke
(
ctx
,
"/v1beta1.K
eyManagement
Service/Version"
,
in
,
out
,
c
.
cc
,
opts
...
)
if
err
!=
nil
{
return
nil
,
err
}
return
out
,
nil
}
func
(
c
*
k
MS
ServiceClient
)
Decrypt
(
ctx
context
.
Context
,
in
*
DecryptRequest
,
opts
...
grpc
.
CallOption
)
(
*
DecryptResponse
,
error
)
{
func
(
c
*
k
eyManagement
ServiceClient
)
Decrypt
(
ctx
context
.
Context
,
in
*
DecryptRequest
,
opts
...
grpc
.
CallOption
)
(
*
DecryptResponse
,
error
)
{
out
:=
new
(
DecryptResponse
)
err
:=
grpc
.
Invoke
(
ctx
,
"/v1beta1.K
MS
Service/Decrypt"
,
in
,
out
,
c
.
cc
,
opts
...
)
err
:=
grpc
.
Invoke
(
ctx
,
"/v1beta1.K
eyManagement
Service/Decrypt"
,
in
,
out
,
c
.
cc
,
opts
...
)
if
err
!=
nil
{
return
nil
,
err
}
return
out
,
nil
}
func
(
c
*
k
MS
ServiceClient
)
Encrypt
(
ctx
context
.
Context
,
in
*
EncryptRequest
,
opts
...
grpc
.
CallOption
)
(
*
EncryptResponse
,
error
)
{
func
(
c
*
k
eyManagement
ServiceClient
)
Encrypt
(
ctx
context
.
Context
,
in
*
EncryptRequest
,
opts
...
grpc
.
CallOption
)
(
*
EncryptResponse
,
error
)
{
out
:=
new
(
EncryptResponse
)
err
:=
grpc
.
Invoke
(
ctx
,
"/v1beta1.K
MS
Service/Encrypt"
,
in
,
out
,
c
.
cc
,
opts
...
)
err
:=
grpc
.
Invoke
(
ctx
,
"/v1beta1.K
eyManagement
Service/Encrypt"
,
in
,
out
,
c
.
cc
,
opts
...
)
if
err
!=
nil
{
return
nil
,
err
}
return
out
,
nil
}
// Server API for K
MS
Service service
// Server API for K
eyManagement
Service service
type
K
MS
ServiceServer
interface
{
type
K
eyManagement
ServiceServer
interface
{
// Version returns the runtime name and runtime version of the KMS provider.
Version
(
context
.
Context
,
*
VersionRequest
)
(
*
VersionResponse
,
error
)
// Execute decryption operation in KMS provider.
...
...
@@ -266,79 +266,79 @@ type KMSServiceServer interface {
Encrypt
(
context
.
Context
,
*
EncryptRequest
)
(
*
EncryptResponse
,
error
)
}
func
RegisterK
MSServiceServer
(
s
*
grpc
.
Server
,
srv
KMS
ServiceServer
)
{
s
.
RegisterService
(
&
_K
MS
Service_serviceDesc
,
srv
)
func
RegisterK
eyManagementServiceServer
(
s
*
grpc
.
Server
,
srv
KeyManagement
ServiceServer
)
{
s
.
RegisterService
(
&
_K
eyManagement
Service_serviceDesc
,
srv
)
}
func
_K
MS
Service_Version_Handler
(
srv
interface
{},
ctx
context
.
Context
,
dec
func
(
interface
{})
error
,
interceptor
grpc
.
UnaryServerInterceptor
)
(
interface
{},
error
)
{
func
_K
eyManagement
Service_Version_Handler
(
srv
interface
{},
ctx
context
.
Context
,
dec
func
(
interface
{})
error
,
interceptor
grpc
.
UnaryServerInterceptor
)
(
interface
{},
error
)
{
in
:=
new
(
VersionRequest
)
if
err
:=
dec
(
in
);
err
!=
nil
{
return
nil
,
err
}
if
interceptor
==
nil
{
return
srv
.
(
K
MS
ServiceServer
)
.
Version
(
ctx
,
in
)
return
srv
.
(
K
eyManagement
ServiceServer
)
.
Version
(
ctx
,
in
)
}
info
:=
&
grpc
.
UnaryServerInfo
{
Server
:
srv
,
FullMethod
:
"/v1beta1.K
MS
Service/Version"
,
FullMethod
:
"/v1beta1.K
eyManagement
Service/Version"
,
}
handler
:=
func
(
ctx
context
.
Context
,
req
interface
{})
(
interface
{},
error
)
{
return
srv
.
(
K
MS
ServiceServer
)
.
Version
(
ctx
,
req
.
(
*
VersionRequest
))
return
srv
.
(
K
eyManagement
ServiceServer
)
.
Version
(
ctx
,
req
.
(
*
VersionRequest
))
}
return
interceptor
(
ctx
,
in
,
info
,
handler
)
}
func
_K
MS
Service_Decrypt_Handler
(
srv
interface
{},
ctx
context
.
Context
,
dec
func
(
interface
{})
error
,
interceptor
grpc
.
UnaryServerInterceptor
)
(
interface
{},
error
)
{
func
_K
eyManagement
Service_Decrypt_Handler
(
srv
interface
{},
ctx
context
.
Context
,
dec
func
(
interface
{})
error
,
interceptor
grpc
.
UnaryServerInterceptor
)
(
interface
{},
error
)
{
in
:=
new
(
DecryptRequest
)
if
err
:=
dec
(
in
);
err
!=
nil
{
return
nil
,
err
}
if
interceptor
==
nil
{
return
srv
.
(
K
MS
ServiceServer
)
.
Decrypt
(
ctx
,
in
)
return
srv
.
(
K
eyManagement
ServiceServer
)
.
Decrypt
(
ctx
,
in
)
}
info
:=
&
grpc
.
UnaryServerInfo
{
Server
:
srv
,
FullMethod
:
"/v1beta1.K
MS
Service/Decrypt"
,
FullMethod
:
"/v1beta1.K
eyManagement
Service/Decrypt"
,
}
handler
:=
func
(
ctx
context
.
Context
,
req
interface
{})
(
interface
{},
error
)
{
return
srv
.
(
K
MS
ServiceServer
)
.
Decrypt
(
ctx
,
req
.
(
*
DecryptRequest
))
return
srv
.
(
K
eyManagement
ServiceServer
)
.
Decrypt
(
ctx
,
req
.
(
*
DecryptRequest
))
}
return
interceptor
(
ctx
,
in
,
info
,
handler
)
}
func
_K
MS
Service_Encrypt_Handler
(
srv
interface
{},
ctx
context
.
Context
,
dec
func
(
interface
{})
error
,
interceptor
grpc
.
UnaryServerInterceptor
)
(
interface
{},
error
)
{
func
_K
eyManagement
Service_Encrypt_Handler
(
srv
interface
{},
ctx
context
.
Context
,
dec
func
(
interface
{})
error
,
interceptor
grpc
.
UnaryServerInterceptor
)
(
interface
{},
error
)
{
in
:=
new
(
EncryptRequest
)
if
err
:=
dec
(
in
);
err
!=
nil
{
return
nil
,
err
}
if
interceptor
==
nil
{
return
srv
.
(
K
MS
ServiceServer
)
.
Encrypt
(
ctx
,
in
)
return
srv
.
(
K
eyManagement
ServiceServer
)
.
Encrypt
(
ctx
,
in
)
}
info
:=
&
grpc
.
UnaryServerInfo
{
Server
:
srv
,
FullMethod
:
"/v1beta1.K
MS
Service/Encrypt"
,
FullMethod
:
"/v1beta1.K
eyManagement
Service/Encrypt"
,
}
handler
:=
func
(
ctx
context
.
Context
,
req
interface
{})
(
interface
{},
error
)
{
return
srv
.
(
K
MS
ServiceServer
)
.
Encrypt
(
ctx
,
req
.
(
*
EncryptRequest
))
return
srv
.
(
K
eyManagement
ServiceServer
)
.
Encrypt
(
ctx
,
req
.
(
*
EncryptRequest
))
}
return
interceptor
(
ctx
,
in
,
info
,
handler
)
}
var
_K
MS
Service_serviceDesc
=
grpc
.
ServiceDesc
{
ServiceName
:
"v1beta1.K
MS
Service"
,
HandlerType
:
(
*
K
MS
ServiceServer
)(
nil
),
var
_K
eyManagement
Service_serviceDesc
=
grpc
.
ServiceDesc
{
ServiceName
:
"v1beta1.K
eyManagement
Service"
,
HandlerType
:
(
*
K
eyManagement
ServiceServer
)(
nil
),
Methods
:
[]
grpc
.
MethodDesc
{
{
MethodName
:
"Version"
,
Handler
:
_K
MS
Service_Version_Handler
,
Handler
:
_K
eyManagement
Service_Version_Handler
,
},
{
MethodName
:
"Decrypt"
,
Handler
:
_K
MS
Service_Decrypt_Handler
,
Handler
:
_K
eyManagement
Service_Decrypt_Handler
,
},
{
MethodName
:
"Encrypt"
,
Handler
:
_K
MS
Service_Encrypt_Handler
,
Handler
:
_K
eyManagement
Service_Encrypt_Handler
,
},
},
Streams
:
[]
grpc
.
StreamDesc
{},
...
...
@@ -348,23 +348,23 @@ var _KMSService_serviceDesc = grpc.ServiceDesc{
func
init
()
{
proto
.
RegisterFile
(
"service.proto"
,
fileDescriptorService
)
}
var
fileDescriptorService
=
[]
byte
{
// 2
79
bytes of a gzipped FileDescriptorProto
// 2
87
bytes of a gzipped FileDescriptorProto
0x1f
,
0x8b
,
0x08
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x02
,
0xff
,
0x8c
,
0x52
,
0xcd
,
0x4a
,
0xc4
,
0x30
,
0x10
,
0xde
,
0xae
,
0xb8
,
0xc5
,
0xb1
,
0xb6
,
0x10
,
0x
44
,
0x8b
,
0x27
,
0xcd
,
0x65
,
0xd5
,
0x43
,
0x61
,
0x
f5
,
0x2e
,
0x22
,
0x7a
,
0x12
,
0x3d
,
0x74
,
0xc1
,
0xab
,
0x74
,
0xcb
,
0x80
,
0x01
,
0x9b
,
0xc6
,
0x24
,
0x5b
,
0x
f1
,
0x1d
,
0x7d
,
0x28
,
0xb1
,
0x99
,
0xd6
,
0xb4
,
0x22
,
0xee
,
0x71
,
0x26
,
0xdf
,
0xdf
,
0xcc
,
0x
04
,
0xf6
,
0x0c
,
0xea
,
0x46
,
0x94
,
0x98
,
0x29
,
0x5d
,
0xdb
,
0x9a
,
0x85
,
0xcd
,
0x62
,
0x85
,
0xb6
,
0x
58
,
0xf0
,
0x73
,
0x88
,
0x9f
,
0x50
,
0x1b
,
0x51
,
0xcb
,
0x1c
,
0xdf
,
0xd6
,
0x68
,
0x2c
,
0x4b
,
0x21
,
0x
6c
,
0x5c
,
0x27
,
0x0d
,
0x8e
,
0x83
,
0xd3
,
0x9d
,
0xbc
,
0x2b
,
0xf9
,
0x3b
,
0x24
,
0x3d
,
0xd6
,
0xa8
,
0x5
a
,
0x1a
,
0xfc
,
0x1b
,
0xcc
,
0x4e
,
0x20
,
0xd2
,
0x6b
,
0x69
,
0x45
,
0x85
,
0xcf
,
0xb2
,
0xa8
,
0x30
,
0x
9d
,
0xb6
,
0xcf
,
0xbb
,
0xd4
,
0x7b
,
0x2c
,
0x2a
,
0x64
,
0x73
,
0x48
,
0x3a
,
0x48
,
0x27
,
0xb2
,
0xd5
,
0x
a2
,
0x62
,
0x6a
,
0x93
,
0x1b
,
0xbf
,
0x81
,
0xf8
,
0x16
,
0x4b
,
0xfd
,
0xa1
,
0xec
,
0xbf
,
0x21
,
0xd
9
,
0x
01
,
0xcc
,
0x4a
,
0xa1
,
0x5e
,
0x50
,
0xb7
,
0x8e
,
0x51
,
0x4e
,
0x15
,
0x9f
,
0x43
,
0xd2
,
0x6b
,
0x50
,
0x
f8
,
0x7d
,
0xd8
,
0x56
,
0xaf
,
0x85
,
0x70
,
0x12
,
0x51
,
0xee
,
0x0a
,
0x7e
,
0x0d
,
0xf1
,
0x9d
,
0xdc
,
0x
d0
,
0xac
,
0x57
,
0x98
,
0xfa
,
0x0a
,
0x67
,
0x90
,
0xf4
,
0x0a
,
0x64
,
0xf5
,
0x93
,
0x2a
,
0xf0
,
0x53
,
0x5
d
,
0x7c
,
0x06
,
0x00
,
0xf7
,
0x0f
,
0xcb
,
0xa5
,
0x3b
,
0x0e
,
0xbb
,
0x82
,
0x90
,
0x66
,
0x66
,
0x87
,
0x
19
,
0x9d
,
0x28
,
0x1b
,
0xde
,
0xe7
,
0x28
,
0xfd
,
0xfd
,
0xe0
,
0x4c
,
0xf8
,
0xe4
,
0x9b
,
0x4f
,
0x43
,
0x
7a
,
0xfc
,
0xe1
,
0xea
,
0x3c
,
0xfe
,
0x68
,
0x1f
,
0x8e
,
0x4f
,
0xc9
,
0x3d
,
0xfe
,
0x70
,
0x1b
,
0x1e
,
0x
7f
,
0x34
,
0x24
,
0x9f
,
0xac
,
0x66
,
0xed
,
0xef
,
0xba
,
0xfc
,
0x0a
,
0x00
,
0x00
,
0xff
,
0xff
,
0x28
,
0x
69
,
0xfc
,
0xea
,
0x6e
,
0x02
,
0x00
,
0x00
,
0x10
,
0xde
,
0xae
,
0xb8
,
0xc5
,
0xb1
,
0xb6
,
0x10
,
0x
16
,
0x2d
,
0x9e
,
0x34
,
0x97
,
0x55
,
0x0f
,
0x85
,
0x
d5
,
0xbb
,
0x88
,
0xe8
,
0x49
,
0xf4
,
0x50
,
0xc1
,
0xab
,
0x64
,
0xcb
,
0xa0
,
0x05
,
0x9b
,
0xc6
,
0x24
,
0x5b
,
0x
d9
,
0x17
,
0xf5
,
0x79
,
0xc4
,
0x66
,
0x5a
,
0xd3
,
0x15
,
0x71
,
0x8f
,
0x33
,
0x99
,
0xef
,
0x6f
,
0x
26
,
0xb0
,
0x67
,
0x50
,
0x37
,
0x65
,
0x81
,
0x99
,
0xd2
,
0xb5
,
0xad
,
0x59
,
0xd8
,
0xcc
,
0x17
,
0x68
,
0x
c5
,
0x9c
,
0x9f
,
0x41
,
0xfc
,
0x84
,
0xda
,
0x94
,
0xb5
,
0xcc
,
0xf1
,
0x7d
,
0x89
,
0xc6
,
0xb2
,
0x14
,
0x
c2
,
0xc6
,
0x75
,
0xd2
,
0xe0
,
0x28
,
0x38
,
0xd9
,
0xc9
,
0xbb
,
0x92
,
0x7f
,
0x40
,
0xd2
,
0xcf
,
0x1a
,
0x5
5
,
0x4b
,
0x83
,
0x7f
,
0x0f
,
0xb3
,
0x63
,
0x88
,
0xf4
,
0x52
,
0xda
,
0xb2
,
0xc2
,
0x67
,
0x29
,
0x2a
,
0x
4c
,
0xc7
,
0xed
,
0xf3
,
0x2e
,
0xf5
,
0x1e
,
0x44
,
0x85
,
0x6c
,
0x06
,
0x49
,
0x37
,
0xd2
,
0x91
,
0x6c
,
0x
b5
,
0x53
,
0x31
,
0xb5
,
0x49
,
0x8d
,
0x5f
,
0x43
,
0x7c
,
0x83
,
0x85
,
0x5e
,
0x29
,
0xfb
,
0xaf
,
0x4
9
,
0x
b6
,
0x0f
,
0x93
,
0xa2
,
0x54
,
0xaf
,
0xa8
,
0x5b
,
0xc5
,
0x28
,
0xa7
,
0x8a
,
0xcf
,
0x20
,
0xe9
,
0x39
,
0x
c8
,
0xfc
,
0x14
,
0xb6
,
0xd5
,
0x9b
,
0x28
,
0x1d
,
0x45
,
0x94
,
0xbb
,
0x82
,
0x5f
,
0x41
,
0x7c
,
0x2b
,
0x
37
,
0x14
,
0xeb
,
0x19
,
0xc6
,
0x3e
,
0xc3
,
0x29
,
0x24
,
0x3d
,
0x03
,
0x49
,
0xfd
,
0xb8
,
0x0a
,
0x7c
,
0x5
7
,
0xe7
,
0x9f
,
0x01
,
0x4c
,
0xef
,
0x70
,
0x75
,
0x2f
,
0xa4
,
0x78
,
0xc1
,
0x0a
,
0xa5
,
0x7d
,
0x74
,
0x
67
,
0x62
,
0x97
,
0x10
,
0x52
,
0x7a
,
0x76
,
0x90
,
0xd1
,
0xb1
,
0xb2
,
0xe1
,
0xa5
,
0x0e
,
0xd3
,
0xdf
,
0x
0f
,
0x4e
,
0x8e
,
0x8f
,
0xbe
,
0xf1
,
0x14
,
0xd7
,
0xc3
,
0x0f
,
0x97
,
0xe8
,
0xe1
,
0xd7
,
0x36
,
0xe3
,
0x
f0
,
0x94
,
0xc1
,
0xc3
,
0x0f
,
0xf7
,
0xe2
,
0xe1
,
0xd7
,
0xe2
,
0xf2
,
0xd1
,
0x62
,
0xd2
,
0xfe
,
0xb3
,
0x
8b
,
0xaf
,
0x00
,
0x00
,
0x00
,
0xff
,
0xff
,
0x33
,
0x8d
,
0x09
,
0xe1
,
0x78
,
0x02
,
0x00
,
0x00
,
}
staging/src/k8s.io/apiserver/pkg/storage/value/encrypt/envelope/v1beta1/service.proto
View file @
fc8ff61e
...
...
@@ -4,7 +4,7 @@ syntax = "proto3";
package
v1beta1
;
// This service defines the public APIs for remote KMS provider.
service
K
MS
Service
{
service
K
eyManagement
Service
{
// Version returns the runtime name and runtime version of the KMS provider.
rpc
Version
(
VersionRequest
)
returns
(
VersionResponse
)
{}
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment