Compare commits
43 Commits
Author | SHA1 | Date | |
---|---|---|---|
![]() |
121edf0467 | ||
![]() |
b5abfe1858 | ||
![]() |
33633da64c | ||
![]() |
e08abbeae4 | ||
![]() |
bdc3ed1970 | ||
![]() |
1b3ac99e8a | ||
![]() |
fd4595aa04 | ||
![]() |
e5f63b64c3 | ||
![]() |
68d27b2d84 | ||
![]() |
7c4274be05 | ||
![]() |
fb5cd6f1c7 | ||
![]() |
6999bbb47b | ||
![]() |
df4036ab73 | ||
![]() |
848590e99e | ||
![]() |
95a726a27e | ||
![]() |
288ef7d6fc | ||
![]() |
7b7722ed97 | ||
![]() |
8a358f832a | ||
![]() |
2a63909648 | ||
![]() |
7fb1fafe0c | ||
![]() |
7025d7c665 | ||
![]() |
4ab213a4ec | ||
![]() |
bb27a63e64 | ||
![]() |
b19dae0065 | ||
![]() |
c8915bdb04 | ||
![]() |
b6896aa951 | ||
![]() |
452ccd693d | ||
![]() |
348b25f3dc | ||
![]() |
c67e6d5f5e | ||
![]() |
e82f0557ac | ||
![]() |
4cebdd274c | ||
![]() |
0363c4b1ef | ||
![]() |
5579dc200d | ||
![]() |
3fd6e7e1de | ||
![]() |
1fa227da71 | ||
![]() |
47f6d32e3e | ||
![]() |
0265457183 | ||
![]() |
04ec94f8d1 | ||
![]() |
ed4d70888c | ||
![]() |
b9aa507f66 | ||
![]() |
4ed57689cb | ||
![]() |
a2850218b2 | ||
![]() |
fc25300cf0 |
6
.gitignore
vendored
6
.gitignore
vendored
@@ -1,16 +1,22 @@
|
|||||||
/agent-*
|
/agent-*
|
||||||
/coverage
|
/coverage
|
||||||
|
/covdir
|
||||||
/gopath
|
/gopath
|
||||||
/gopath.proto
|
/gopath.proto
|
||||||
/go-bindata
|
/go-bindata
|
||||||
|
/release
|
||||||
/machine*
|
/machine*
|
||||||
/bin
|
/bin
|
||||||
|
.Dockerfile-test
|
||||||
.vagrant
|
.vagrant
|
||||||
*.etcd
|
*.etcd
|
||||||
|
*.log
|
||||||
/etcd
|
/etcd
|
||||||
*.swp
|
*.swp
|
||||||
/hack/insta-discovery/.env
|
/hack/insta-discovery/.env
|
||||||
*.test
|
*.test
|
||||||
tools/functional-tester/docker/bin
|
tools/functional-tester/docker/bin
|
||||||
|
hack/scripts-dev/docker-dns/.Dockerfile
|
||||||
|
hack/scripts-dev/docker-dns-srv/.Dockerfile
|
||||||
hack/tls-setup/certs
|
hack/tls-setup/certs
|
||||||
.idea
|
.idea
|
||||||
|
@@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
TEST_SUFFIX=$(date +%s | base64 | head -c 15)
|
TEST_SUFFIX=$(date +%s | base64 | head -c 15)
|
||||||
|
|
||||||
TEST_OPTS="RELEASE_TEST=y INTEGRATION=y PASSES='build unit release integration_e2e functional' MANUAL_VER=v3.2.9"
|
TEST_OPTS="RELEASE_TEST=y INTEGRATION=y PASSES='build unit release integration_e2e functional' MANUAL_VER=v3.2.11"
|
||||||
if [ "$TEST_ARCH" == "386" ]; then
|
if [ "$TEST_ARCH" == "386" ]; then
|
||||||
TEST_OPTS="GOARCH=386 PASSES='build unit integration_e2e'"
|
TEST_OPTS="GOARCH=386 PASSES='build unit integration_e2e'"
|
||||||
fi
|
fi
|
||||||
@@ -13,4 +13,4 @@ docker run \
|
|||||||
gcr.io/etcd-development/etcd-test:go1.8.5 \
|
gcr.io/etcd-development/etcd-test:go1.8.5 \
|
||||||
/bin/bash -c "${TEST_OPTS} ./test 2>&1 | tee test-${TEST_SUFFIX}.log"
|
/bin/bash -c "${TEST_OPTS} ./test 2>&1 | tee test-${TEST_SUFFIX}.log"
|
||||||
|
|
||||||
! egrep "(--- FAIL:|panic: test timed out|appears to have leaked|Too many goroutines)" -B50 -A10 test-${TEST_SUFFIX}.log
|
! egrep "(--- FAIL:|panic: test timed out|appears to have leaked)" -B50 -A10 test-${TEST_SUFFIX}.log
|
||||||
|
@@ -101,60 +101,65 @@ type Auth interface {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type auth struct {
|
type auth struct {
|
||||||
remote pb.AuthClient
|
remote pb.AuthClient
|
||||||
|
callOpts []grpc.CallOption
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewAuth(c *Client) Auth {
|
func NewAuth(c *Client) Auth {
|
||||||
return &auth{remote: RetryAuthClient(c)}
|
api := &auth{remote: RetryAuthClient(c)}
|
||||||
|
if c != nil {
|
||||||
|
api.callOpts = c.callOpts
|
||||||
|
}
|
||||||
|
return api
|
||||||
}
|
}
|
||||||
|
|
||||||
func (auth *auth) AuthEnable(ctx context.Context) (*AuthEnableResponse, error) {
|
func (auth *auth) AuthEnable(ctx context.Context) (*AuthEnableResponse, error) {
|
||||||
resp, err := auth.remote.AuthEnable(ctx, &pb.AuthEnableRequest{})
|
resp, err := auth.remote.AuthEnable(ctx, &pb.AuthEnableRequest{}, auth.callOpts...)
|
||||||
return (*AuthEnableResponse)(resp), toErr(ctx, err)
|
return (*AuthEnableResponse)(resp), toErr(ctx, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (auth *auth) AuthDisable(ctx context.Context) (*AuthDisableResponse, error) {
|
func (auth *auth) AuthDisable(ctx context.Context) (*AuthDisableResponse, error) {
|
||||||
resp, err := auth.remote.AuthDisable(ctx, &pb.AuthDisableRequest{})
|
resp, err := auth.remote.AuthDisable(ctx, &pb.AuthDisableRequest{}, auth.callOpts...)
|
||||||
return (*AuthDisableResponse)(resp), toErr(ctx, err)
|
return (*AuthDisableResponse)(resp), toErr(ctx, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (auth *auth) UserAdd(ctx context.Context, name string, password string) (*AuthUserAddResponse, error) {
|
func (auth *auth) UserAdd(ctx context.Context, name string, password string) (*AuthUserAddResponse, error) {
|
||||||
resp, err := auth.remote.UserAdd(ctx, &pb.AuthUserAddRequest{Name: name, Password: password})
|
resp, err := auth.remote.UserAdd(ctx, &pb.AuthUserAddRequest{Name: name, Password: password}, auth.callOpts...)
|
||||||
return (*AuthUserAddResponse)(resp), toErr(ctx, err)
|
return (*AuthUserAddResponse)(resp), toErr(ctx, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (auth *auth) UserDelete(ctx context.Context, name string) (*AuthUserDeleteResponse, error) {
|
func (auth *auth) UserDelete(ctx context.Context, name string) (*AuthUserDeleteResponse, error) {
|
||||||
resp, err := auth.remote.UserDelete(ctx, &pb.AuthUserDeleteRequest{Name: name})
|
resp, err := auth.remote.UserDelete(ctx, &pb.AuthUserDeleteRequest{Name: name}, auth.callOpts...)
|
||||||
return (*AuthUserDeleteResponse)(resp), toErr(ctx, err)
|
return (*AuthUserDeleteResponse)(resp), toErr(ctx, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (auth *auth) UserChangePassword(ctx context.Context, name string, password string) (*AuthUserChangePasswordResponse, error) {
|
func (auth *auth) UserChangePassword(ctx context.Context, name string, password string) (*AuthUserChangePasswordResponse, error) {
|
||||||
resp, err := auth.remote.UserChangePassword(ctx, &pb.AuthUserChangePasswordRequest{Name: name, Password: password})
|
resp, err := auth.remote.UserChangePassword(ctx, &pb.AuthUserChangePasswordRequest{Name: name, Password: password}, auth.callOpts...)
|
||||||
return (*AuthUserChangePasswordResponse)(resp), toErr(ctx, err)
|
return (*AuthUserChangePasswordResponse)(resp), toErr(ctx, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (auth *auth) UserGrantRole(ctx context.Context, user string, role string) (*AuthUserGrantRoleResponse, error) {
|
func (auth *auth) UserGrantRole(ctx context.Context, user string, role string) (*AuthUserGrantRoleResponse, error) {
|
||||||
resp, err := auth.remote.UserGrantRole(ctx, &pb.AuthUserGrantRoleRequest{User: user, Role: role})
|
resp, err := auth.remote.UserGrantRole(ctx, &pb.AuthUserGrantRoleRequest{User: user, Role: role}, auth.callOpts...)
|
||||||
return (*AuthUserGrantRoleResponse)(resp), toErr(ctx, err)
|
return (*AuthUserGrantRoleResponse)(resp), toErr(ctx, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (auth *auth) UserGet(ctx context.Context, name string) (*AuthUserGetResponse, error) {
|
func (auth *auth) UserGet(ctx context.Context, name string) (*AuthUserGetResponse, error) {
|
||||||
resp, err := auth.remote.UserGet(ctx, &pb.AuthUserGetRequest{Name: name})
|
resp, err := auth.remote.UserGet(ctx, &pb.AuthUserGetRequest{Name: name}, auth.callOpts...)
|
||||||
return (*AuthUserGetResponse)(resp), toErr(ctx, err)
|
return (*AuthUserGetResponse)(resp), toErr(ctx, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (auth *auth) UserList(ctx context.Context) (*AuthUserListResponse, error) {
|
func (auth *auth) UserList(ctx context.Context) (*AuthUserListResponse, error) {
|
||||||
resp, err := auth.remote.UserList(ctx, &pb.AuthUserListRequest{})
|
resp, err := auth.remote.UserList(ctx, &pb.AuthUserListRequest{}, auth.callOpts...)
|
||||||
return (*AuthUserListResponse)(resp), toErr(ctx, err)
|
return (*AuthUserListResponse)(resp), toErr(ctx, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (auth *auth) UserRevokeRole(ctx context.Context, name string, role string) (*AuthUserRevokeRoleResponse, error) {
|
func (auth *auth) UserRevokeRole(ctx context.Context, name string, role string) (*AuthUserRevokeRoleResponse, error) {
|
||||||
resp, err := auth.remote.UserRevokeRole(ctx, &pb.AuthUserRevokeRoleRequest{Name: name, Role: role})
|
resp, err := auth.remote.UserRevokeRole(ctx, &pb.AuthUserRevokeRoleRequest{Name: name, Role: role}, auth.callOpts...)
|
||||||
return (*AuthUserRevokeRoleResponse)(resp), toErr(ctx, err)
|
return (*AuthUserRevokeRoleResponse)(resp), toErr(ctx, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (auth *auth) RoleAdd(ctx context.Context, name string) (*AuthRoleAddResponse, error) {
|
func (auth *auth) RoleAdd(ctx context.Context, name string) (*AuthRoleAddResponse, error) {
|
||||||
resp, err := auth.remote.RoleAdd(ctx, &pb.AuthRoleAddRequest{Name: name})
|
resp, err := auth.remote.RoleAdd(ctx, &pb.AuthRoleAddRequest{Name: name}, auth.callOpts...)
|
||||||
return (*AuthRoleAddResponse)(resp), toErr(ctx, err)
|
return (*AuthRoleAddResponse)(resp), toErr(ctx, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -164,27 +169,27 @@ func (auth *auth) RoleGrantPermission(ctx context.Context, name string, key, ran
|
|||||||
RangeEnd: []byte(rangeEnd),
|
RangeEnd: []byte(rangeEnd),
|
||||||
PermType: authpb.Permission_Type(permType),
|
PermType: authpb.Permission_Type(permType),
|
||||||
}
|
}
|
||||||
resp, err := auth.remote.RoleGrantPermission(ctx, &pb.AuthRoleGrantPermissionRequest{Name: name, Perm: perm})
|
resp, err := auth.remote.RoleGrantPermission(ctx, &pb.AuthRoleGrantPermissionRequest{Name: name, Perm: perm}, auth.callOpts...)
|
||||||
return (*AuthRoleGrantPermissionResponse)(resp), toErr(ctx, err)
|
return (*AuthRoleGrantPermissionResponse)(resp), toErr(ctx, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (auth *auth) RoleGet(ctx context.Context, role string) (*AuthRoleGetResponse, error) {
|
func (auth *auth) RoleGet(ctx context.Context, role string) (*AuthRoleGetResponse, error) {
|
||||||
resp, err := auth.remote.RoleGet(ctx, &pb.AuthRoleGetRequest{Role: role})
|
resp, err := auth.remote.RoleGet(ctx, &pb.AuthRoleGetRequest{Role: role}, auth.callOpts...)
|
||||||
return (*AuthRoleGetResponse)(resp), toErr(ctx, err)
|
return (*AuthRoleGetResponse)(resp), toErr(ctx, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (auth *auth) RoleList(ctx context.Context) (*AuthRoleListResponse, error) {
|
func (auth *auth) RoleList(ctx context.Context) (*AuthRoleListResponse, error) {
|
||||||
resp, err := auth.remote.RoleList(ctx, &pb.AuthRoleListRequest{})
|
resp, err := auth.remote.RoleList(ctx, &pb.AuthRoleListRequest{}, auth.callOpts...)
|
||||||
return (*AuthRoleListResponse)(resp), toErr(ctx, err)
|
return (*AuthRoleListResponse)(resp), toErr(ctx, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (auth *auth) RoleRevokePermission(ctx context.Context, role string, key, rangeEnd string) (*AuthRoleRevokePermissionResponse, error) {
|
func (auth *auth) RoleRevokePermission(ctx context.Context, role string, key, rangeEnd string) (*AuthRoleRevokePermissionResponse, error) {
|
||||||
resp, err := auth.remote.RoleRevokePermission(ctx, &pb.AuthRoleRevokePermissionRequest{Role: role, Key: key, RangeEnd: rangeEnd})
|
resp, err := auth.remote.RoleRevokePermission(ctx, &pb.AuthRoleRevokePermissionRequest{Role: role, Key: key, RangeEnd: rangeEnd}, auth.callOpts...)
|
||||||
return (*AuthRoleRevokePermissionResponse)(resp), toErr(ctx, err)
|
return (*AuthRoleRevokePermissionResponse)(resp), toErr(ctx, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (auth *auth) RoleDelete(ctx context.Context, role string) (*AuthRoleDeleteResponse, error) {
|
func (auth *auth) RoleDelete(ctx context.Context, role string) (*AuthRoleDeleteResponse, error) {
|
||||||
resp, err := auth.remote.RoleDelete(ctx, &pb.AuthRoleDeleteRequest{Role: role})
|
resp, err := auth.remote.RoleDelete(ctx, &pb.AuthRoleDeleteRequest{Role: role}, auth.callOpts...)
|
||||||
return (*AuthRoleDeleteResponse)(resp), toErr(ctx, err)
|
return (*AuthRoleDeleteResponse)(resp), toErr(ctx, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -197,12 +202,13 @@ func StrToPermissionType(s string) (PermissionType, error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type authenticator struct {
|
type authenticator struct {
|
||||||
conn *grpc.ClientConn // conn in-use
|
conn *grpc.ClientConn // conn in-use
|
||||||
remote pb.AuthClient
|
remote pb.AuthClient
|
||||||
|
callOpts []grpc.CallOption
|
||||||
}
|
}
|
||||||
|
|
||||||
func (auth *authenticator) authenticate(ctx context.Context, name string, password string) (*AuthenticateResponse, error) {
|
func (auth *authenticator) authenticate(ctx context.Context, name string, password string) (*AuthenticateResponse, error) {
|
||||||
resp, err := auth.remote.Authenticate(ctx, &pb.AuthenticateRequest{Name: name, Password: password})
|
resp, err := auth.remote.Authenticate(ctx, &pb.AuthenticateRequest{Name: name, Password: password}, auth.callOpts...)
|
||||||
return (*AuthenticateResponse)(resp), toErr(ctx, err)
|
return (*AuthenticateResponse)(resp), toErr(ctx, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -210,14 +216,18 @@ func (auth *authenticator) close() {
|
|||||||
auth.conn.Close()
|
auth.conn.Close()
|
||||||
}
|
}
|
||||||
|
|
||||||
func newAuthenticator(endpoint string, opts []grpc.DialOption) (*authenticator, error) {
|
func newAuthenticator(endpoint string, opts []grpc.DialOption, c *Client) (*authenticator, error) {
|
||||||
conn, err := grpc.Dial(endpoint, opts...)
|
conn, err := grpc.Dial(endpoint, opts...)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
return &authenticator{
|
api := &authenticator{
|
||||||
conn: conn,
|
conn: conn,
|
||||||
remote: pb.NewAuthClient(conn),
|
remote: pb.NewAuthClient(conn),
|
||||||
}, nil
|
}
|
||||||
|
if c != nil {
|
||||||
|
api.callOpts = c.callOpts
|
||||||
|
}
|
||||||
|
return api, nil
|
||||||
}
|
}
|
||||||
|
@@ -56,7 +56,7 @@ type Client struct {
|
|||||||
cfg Config
|
cfg Config
|
||||||
creds *credentials.TransportCredentials
|
creds *credentials.TransportCredentials
|
||||||
balancer *healthBalancer
|
balancer *healthBalancer
|
||||||
mu sync.Mutex
|
mu *sync.Mutex
|
||||||
|
|
||||||
ctx context.Context
|
ctx context.Context
|
||||||
cancel context.CancelFunc
|
cancel context.CancelFunc
|
||||||
@@ -67,6 +67,8 @@ type Client struct {
|
|||||||
Password string
|
Password string
|
||||||
// tokenCred is an instance of WithPerRPCCredentials()'s argument
|
// tokenCred is an instance of WithPerRPCCredentials()'s argument
|
||||||
tokenCred *authTokenCredential
|
tokenCred *authTokenCredential
|
||||||
|
|
||||||
|
callOpts []grpc.CallOption
|
||||||
}
|
}
|
||||||
|
|
||||||
// New creates a new etcdv3 client from a given configuration.
|
// New creates a new etcdv3 client from a given configuration.
|
||||||
@@ -295,7 +297,7 @@ func (c *Client) getToken(ctx context.Context) error {
|
|||||||
endpoint := c.cfg.Endpoints[i]
|
endpoint := c.cfg.Endpoints[i]
|
||||||
host := getHost(endpoint)
|
host := getHost(endpoint)
|
||||||
// use dial options without dopts to avoid reusing the client balancer
|
// use dial options without dopts to avoid reusing the client balancer
|
||||||
auth, err = newAuthenticator(host, c.dialSetupOpts(endpoint))
|
auth, err = newAuthenticator(host, c.dialSetupOpts(endpoint), c)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
@@ -385,11 +387,30 @@ func newClient(cfg *Config) (*Client, error) {
|
|||||||
creds: creds,
|
creds: creds,
|
||||||
ctx: ctx,
|
ctx: ctx,
|
||||||
cancel: cancel,
|
cancel: cancel,
|
||||||
|
mu: new(sync.Mutex),
|
||||||
|
callOpts: defaultCallOpts,
|
||||||
}
|
}
|
||||||
if cfg.Username != "" && cfg.Password != "" {
|
if cfg.Username != "" && cfg.Password != "" {
|
||||||
client.Username = cfg.Username
|
client.Username = cfg.Username
|
||||||
client.Password = cfg.Password
|
client.Password = cfg.Password
|
||||||
}
|
}
|
||||||
|
if cfg.MaxCallSendMsgSize > 0 || cfg.MaxCallRecvMsgSize > 0 {
|
||||||
|
if cfg.MaxCallRecvMsgSize > 0 && cfg.MaxCallSendMsgSize > cfg.MaxCallRecvMsgSize {
|
||||||
|
return nil, fmt.Errorf("gRPC message recv limit (%d bytes) must be greater than send limit (%d bytes)", cfg.MaxCallRecvMsgSize, cfg.MaxCallSendMsgSize)
|
||||||
|
}
|
||||||
|
callOpts := []grpc.CallOption{
|
||||||
|
defaultFailFast,
|
||||||
|
defaultMaxCallSendMsgSize,
|
||||||
|
defaultMaxCallRecvMsgSize,
|
||||||
|
}
|
||||||
|
if cfg.MaxCallSendMsgSize > 0 {
|
||||||
|
callOpts[1] = grpc.MaxCallSendMsgSize(cfg.MaxCallSendMsgSize)
|
||||||
|
}
|
||||||
|
if cfg.MaxCallRecvMsgSize > 0 {
|
||||||
|
callOpts[2] = grpc.MaxCallRecvMsgSize(cfg.MaxCallRecvMsgSize)
|
||||||
|
}
|
||||||
|
client.callOpts = callOpts
|
||||||
|
}
|
||||||
|
|
||||||
client.balancer = newHealthBalancer(cfg.Endpoints, cfg.DialTimeout, func(ep string) (bool, error) {
|
client.balancer = newHealthBalancer(cfg.Endpoints, cfg.DialTimeout, func(ep string) (bool, error) {
|
||||||
return grpcHealthCheck(client, ep)
|
return grpcHealthCheck(client, ep)
|
||||||
|
@@ -16,8 +16,10 @@ package clientv3
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
pb "github.com/coreos/etcd/etcdserver/etcdserverpb"
|
pb "github.com/coreos/etcd/etcdserver/etcdserverpb"
|
||||||
|
"github.com/coreos/etcd/pkg/types"
|
||||||
|
|
||||||
"golang.org/x/net/context"
|
"golang.org/x/net/context"
|
||||||
|
"google.golang.org/grpc"
|
||||||
)
|
)
|
||||||
|
|
||||||
type (
|
type (
|
||||||
@@ -43,20 +45,34 @@ type Cluster interface {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type cluster struct {
|
type cluster struct {
|
||||||
remote pb.ClusterClient
|
remote pb.ClusterClient
|
||||||
|
callOpts []grpc.CallOption
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewCluster(c *Client) Cluster {
|
func NewCluster(c *Client) Cluster {
|
||||||
return &cluster{remote: RetryClusterClient(c)}
|
api := &cluster{remote: RetryClusterClient(c)}
|
||||||
|
if c != nil {
|
||||||
|
api.callOpts = c.callOpts
|
||||||
|
}
|
||||||
|
return api
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewClusterFromClusterClient(remote pb.ClusterClient) Cluster {
|
func NewClusterFromClusterClient(remote pb.ClusterClient, c *Client) Cluster {
|
||||||
return &cluster{remote: remote}
|
api := &cluster{remote: remote}
|
||||||
|
if c != nil {
|
||||||
|
api.callOpts = c.callOpts
|
||||||
|
}
|
||||||
|
return api
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *cluster) MemberAdd(ctx context.Context, peerAddrs []string) (*MemberAddResponse, error) {
|
func (c *cluster) MemberAdd(ctx context.Context, peerAddrs []string) (*MemberAddResponse, error) {
|
||||||
|
// fail-fast before panic in rafthttp
|
||||||
|
if _, err := types.NewURLs(peerAddrs); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
r := &pb.MemberAddRequest{PeerURLs: peerAddrs}
|
r := &pb.MemberAddRequest{PeerURLs: peerAddrs}
|
||||||
resp, err := c.remote.MemberAdd(ctx, r)
|
resp, err := c.remote.MemberAdd(ctx, r, c.callOpts...)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, toErr(ctx, err)
|
return nil, toErr(ctx, err)
|
||||||
}
|
}
|
||||||
@@ -65,7 +81,7 @@ func (c *cluster) MemberAdd(ctx context.Context, peerAddrs []string) (*MemberAdd
|
|||||||
|
|
||||||
func (c *cluster) MemberRemove(ctx context.Context, id uint64) (*MemberRemoveResponse, error) {
|
func (c *cluster) MemberRemove(ctx context.Context, id uint64) (*MemberRemoveResponse, error) {
|
||||||
r := &pb.MemberRemoveRequest{ID: id}
|
r := &pb.MemberRemoveRequest{ID: id}
|
||||||
resp, err := c.remote.MemberRemove(ctx, r)
|
resp, err := c.remote.MemberRemove(ctx, r, c.callOpts...)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, toErr(ctx, err)
|
return nil, toErr(ctx, err)
|
||||||
}
|
}
|
||||||
@@ -73,9 +89,14 @@ func (c *cluster) MemberRemove(ctx context.Context, id uint64) (*MemberRemoveRes
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (c *cluster) MemberUpdate(ctx context.Context, id uint64, peerAddrs []string) (*MemberUpdateResponse, error) {
|
func (c *cluster) MemberUpdate(ctx context.Context, id uint64, peerAddrs []string) (*MemberUpdateResponse, error) {
|
||||||
|
// fail-fast before panic in rafthttp
|
||||||
|
if _, err := types.NewURLs(peerAddrs); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
// it is safe to retry on update.
|
// it is safe to retry on update.
|
||||||
r := &pb.MemberUpdateRequest{ID: id, PeerURLs: peerAddrs}
|
r := &pb.MemberUpdateRequest{ID: id, PeerURLs: peerAddrs}
|
||||||
resp, err := c.remote.MemberUpdate(ctx, r)
|
resp, err := c.remote.MemberUpdate(ctx, r, c.callOpts...)
|
||||||
if err == nil {
|
if err == nil {
|
||||||
return (*MemberUpdateResponse)(resp), nil
|
return (*MemberUpdateResponse)(resp), nil
|
||||||
}
|
}
|
||||||
@@ -84,7 +105,7 @@ func (c *cluster) MemberUpdate(ctx context.Context, id uint64, peerAddrs []strin
|
|||||||
|
|
||||||
func (c *cluster) MemberList(ctx context.Context) (*MemberListResponse, error) {
|
func (c *cluster) MemberList(ctx context.Context) (*MemberListResponse, error) {
|
||||||
// it is safe to retry on list.
|
// it is safe to retry on list.
|
||||||
resp, err := c.remote.MemberList(ctx, &pb.MemberListRequest{})
|
resp, err := c.remote.MemberList(ctx, &pb.MemberListRequest{}, c.callOpts...)
|
||||||
if err == nil {
|
if err == nil {
|
||||||
return (*MemberListResponse)(resp), nil
|
return (*MemberListResponse)(resp), nil
|
||||||
}
|
}
|
||||||
|
@@ -41,6 +41,19 @@ type Config struct {
|
|||||||
// keep-alive probe. If the response is not received in this time, the connection is closed.
|
// keep-alive probe. If the response is not received in this time, the connection is closed.
|
||||||
DialKeepAliveTimeout time.Duration `json:"dial-keep-alive-timeout"`
|
DialKeepAliveTimeout time.Duration `json:"dial-keep-alive-timeout"`
|
||||||
|
|
||||||
|
// MaxCallSendMsgSize is the client-side request send limit in bytes.
|
||||||
|
// If 0, it defaults to 2.0 MiB (2 * 1024 * 1024).
|
||||||
|
// Make sure that "MaxCallSendMsgSize" < server-side default send/recv limit.
|
||||||
|
// ("--max-request-bytes" flag to etcd or "embed.Config.MaxRequestBytes").
|
||||||
|
MaxCallSendMsgSize int
|
||||||
|
|
||||||
|
// MaxCallRecvMsgSize is the client-side response receive limit.
|
||||||
|
// If 0, it defaults to "math.MaxInt32", because range response can
|
||||||
|
// easily exceed request send limits.
|
||||||
|
// Make sure that "MaxCallRecvMsgSize" >= server-side default send/recv limit.
|
||||||
|
// ("--max-request-bytes" flag to etcd or "embed.Config.MaxRequestBytes").
|
||||||
|
MaxCallRecvMsgSize int
|
||||||
|
|
||||||
// TLS holds the client secure credentials, if any.
|
// TLS holds the client secure credentials, if any.
|
||||||
TLS *tls.Config
|
TLS *tls.Config
|
||||||
|
|
||||||
|
46
clientv3/grpc_options.go
Normal file
46
clientv3/grpc_options.go
Normal file
@@ -0,0 +1,46 @@
|
|||||||
|
// Copyright 2017 The etcd Authors
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
|
package clientv3
|
||||||
|
|
||||||
|
import (
|
||||||
|
"math"
|
||||||
|
|
||||||
|
"google.golang.org/grpc"
|
||||||
|
)
|
||||||
|
|
||||||
|
var (
|
||||||
|
// Disable gRPC internal retrial logic
|
||||||
|
// TODO: enable when gRPC retry is stable (FailFast=false)
|
||||||
|
// Reference:
|
||||||
|
// - https://github.com/grpc/grpc-go/issues/1532
|
||||||
|
// - https://github.com/grpc/proposal/blob/master/A6-client-retries.md
|
||||||
|
defaultFailFast = grpc.FailFast(true)
|
||||||
|
|
||||||
|
// client-side request send limit, gRPC default is math.MaxInt32
|
||||||
|
// Make sure that "client-side send limit < server-side default send/recv limit"
|
||||||
|
// Same value as "embed.DefaultMaxRequestBytes" plus gRPC overhead bytes
|
||||||
|
defaultMaxCallSendMsgSize = grpc.MaxCallSendMsgSize(2 * 1024 * 1024)
|
||||||
|
|
||||||
|
// client-side response receive limit, gRPC default is 4MB
|
||||||
|
// Make sure that "client-side receive limit >= server-side default send/recv limit"
|
||||||
|
// because range response can easily exceed request send limits
|
||||||
|
// Default to math.MaxInt32; writes exceeding server-side send limit fails anyway
|
||||||
|
defaultMaxCallRecvMsgSize = grpc.MaxCallRecvMsgSize(math.MaxInt32)
|
||||||
|
)
|
||||||
|
|
||||||
|
// defaultCallOpts defines a list of default "gRPC.CallOption".
|
||||||
|
// Some options are exposed to "clientv3.Config".
|
||||||
|
// Defaults will be overridden by the settings in "clientv3.Config".
|
||||||
|
var defaultCallOpts = []grpc.CallOption{defaultFailFast, defaultMaxCallSendMsgSize, defaultMaxCallRecvMsgSize}
|
@@ -127,3 +127,36 @@ func TestMemberUpdate(t *testing.T) {
|
|||||||
t.Errorf("urls = %v, want %v", urls, resp.Members[0].PeerURLs)
|
t.Errorf("urls = %v, want %v", urls, resp.Members[0].PeerURLs)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestMemberAddUpdateWrongURLs(t *testing.T) {
|
||||||
|
defer testutil.AfterTest(t)
|
||||||
|
|
||||||
|
clus := integration.NewClusterV3(t, &integration.ClusterConfig{Size: 1})
|
||||||
|
defer clus.Terminate(t)
|
||||||
|
|
||||||
|
capi := clus.RandClient()
|
||||||
|
tt := [][]string{
|
||||||
|
// missing protocol scheme
|
||||||
|
{"://127.0.0.1:2379"},
|
||||||
|
// unsupported scheme
|
||||||
|
{"mailto://127.0.0.1:2379"},
|
||||||
|
// not conform to host:port
|
||||||
|
{"http://127.0.0.1"},
|
||||||
|
// contain a path
|
||||||
|
{"http://127.0.0.1:2379/path"},
|
||||||
|
// first path segment in URL cannot contain colon
|
||||||
|
{"127.0.0.1:1234"},
|
||||||
|
// URL scheme must be http, https, unix, or unixs
|
||||||
|
{"localhost:1234"},
|
||||||
|
}
|
||||||
|
for i := range tt {
|
||||||
|
_, err := capi.MemberAdd(context.Background(), tt[i])
|
||||||
|
if err == nil {
|
||||||
|
t.Errorf("#%d: MemberAdd err = nil, but error", i)
|
||||||
|
}
|
||||||
|
_, err = capi.MemberUpdate(context.Background(), 0, tt[i])
|
||||||
|
if err == nil {
|
||||||
|
t.Errorf("#%d: MemberUpdate err = nil, but error", i)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@@ -183,7 +183,7 @@ func TestDialForeignEndpoint(t *testing.T) {
|
|||||||
|
|
||||||
// grpc can return a lazy connection that's not connected yet; confirm
|
// grpc can return a lazy connection that's not connected yet; confirm
|
||||||
// that it can communicate with the cluster.
|
// that it can communicate with the cluster.
|
||||||
kvc := clientv3.NewKVFromKVClient(pb.NewKVClient(conn))
|
kvc := clientv3.NewKVFromKVClient(pb.NewKVClient(conn), clus.Client(0))
|
||||||
ctx, cancel := context.WithTimeout(context.TODO(), 5*time.Second)
|
ctx, cancel := context.WithTimeout(context.TODO(), 5*time.Second)
|
||||||
defer cancel()
|
defer cancel()
|
||||||
if _, gerr := kvc.Get(ctx, "abc"); gerr != nil {
|
if _, gerr := kvc.Get(ctx, "abc"); gerr != nil {
|
||||||
|
@@ -30,6 +30,7 @@ import (
|
|||||||
|
|
||||||
"golang.org/x/net/context"
|
"golang.org/x/net/context"
|
||||||
"google.golang.org/grpc"
|
"google.golang.org/grpc"
|
||||||
|
"google.golang.org/grpc/codes"
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestKVPutError(t *testing.T) {
|
func TestKVPutError(t *testing.T) {
|
||||||
@@ -39,7 +40,7 @@ func TestKVPutError(t *testing.T) {
|
|||||||
maxReqBytes = 1.5 * 1024 * 1024 // hard coded max in v3_server.go
|
maxReqBytes = 1.5 * 1024 * 1024 // hard coded max in v3_server.go
|
||||||
quota = int64(int(maxReqBytes) + 8*os.Getpagesize())
|
quota = int64(int(maxReqBytes) + 8*os.Getpagesize())
|
||||||
)
|
)
|
||||||
clus := integration.NewClusterV3(t, &integration.ClusterConfig{Size: 1, QuotaBackendBytes: quota})
|
clus := integration.NewClusterV3(t, &integration.ClusterConfig{Size: 1, QuotaBackendBytes: quota, ClientMaxCallSendMsgSize: 100 * 1024 * 1024})
|
||||||
defer clus.Terminate(t)
|
defer clus.Terminate(t)
|
||||||
|
|
||||||
kv := clus.RandClient()
|
kv := clus.RandClient()
|
||||||
@@ -861,3 +862,95 @@ func TestKVPutAtMostOnce(t *testing.T) {
|
|||||||
t.Fatalf("expected version <= 10, got %+v", resp.Kvs[0])
|
t.Fatalf("expected version <= 10, got %+v", resp.Kvs[0])
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TestKVLargeRequests tests various client/server side request limits.
|
||||||
|
func TestKVLargeRequests(t *testing.T) {
|
||||||
|
defer testutil.AfterTest(t)
|
||||||
|
tests := []struct {
|
||||||
|
// make sure that "MaxCallSendMsgSize" < server-side default send/recv limit
|
||||||
|
maxRequestBytesServer uint
|
||||||
|
maxCallSendBytesClient int
|
||||||
|
maxCallRecvBytesClient int
|
||||||
|
|
||||||
|
valueSize int
|
||||||
|
expectError error
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
maxRequestBytesServer: 1,
|
||||||
|
maxCallSendBytesClient: 0,
|
||||||
|
maxCallRecvBytesClient: 0,
|
||||||
|
valueSize: 1024,
|
||||||
|
expectError: rpctypes.ErrRequestTooLarge,
|
||||||
|
},
|
||||||
|
|
||||||
|
// without proper client-side receive size limit
|
||||||
|
// "code = ResourceExhausted desc = grpc: received message larger than max (5242929 vs. 4194304)"
|
||||||
|
{
|
||||||
|
|
||||||
|
maxRequestBytesServer: 7*1024*1024 + 512*1024,
|
||||||
|
maxCallSendBytesClient: 7 * 1024 * 1024,
|
||||||
|
maxCallRecvBytesClient: 0,
|
||||||
|
valueSize: 5 * 1024 * 1024,
|
||||||
|
expectError: nil,
|
||||||
|
},
|
||||||
|
|
||||||
|
{
|
||||||
|
maxRequestBytesServer: 10 * 1024 * 1024,
|
||||||
|
maxCallSendBytesClient: 100 * 1024 * 1024,
|
||||||
|
maxCallRecvBytesClient: 0,
|
||||||
|
valueSize: 10 * 1024 * 1024,
|
||||||
|
expectError: rpctypes.ErrRequestTooLarge,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
maxRequestBytesServer: 10 * 1024 * 1024,
|
||||||
|
maxCallSendBytesClient: 10 * 1024 * 1024,
|
||||||
|
maxCallRecvBytesClient: 0,
|
||||||
|
valueSize: 10 * 1024 * 1024,
|
||||||
|
expectError: grpc.Errorf(codes.ResourceExhausted, "grpc: trying to send message larger than max "),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
maxRequestBytesServer: 10 * 1024 * 1024,
|
||||||
|
maxCallSendBytesClient: 100 * 1024 * 1024,
|
||||||
|
maxCallRecvBytesClient: 0,
|
||||||
|
valueSize: 10*1024*1024 + 5,
|
||||||
|
expectError: rpctypes.ErrRequestTooLarge,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
maxRequestBytesServer: 10 * 1024 * 1024,
|
||||||
|
maxCallSendBytesClient: 10 * 1024 * 1024,
|
||||||
|
maxCallRecvBytesClient: 0,
|
||||||
|
valueSize: 10*1024*1024 + 5,
|
||||||
|
expectError: grpc.Errorf(codes.ResourceExhausted, "grpc: trying to send message larger than max "),
|
||||||
|
},
|
||||||
|
}
|
||||||
|
for i, test := range tests {
|
||||||
|
clus := integration.NewClusterV3(t,
|
||||||
|
&integration.ClusterConfig{
|
||||||
|
Size: 1,
|
||||||
|
MaxRequestBytes: test.maxRequestBytesServer,
|
||||||
|
ClientMaxCallSendMsgSize: test.maxCallSendBytesClient,
|
||||||
|
ClientMaxCallRecvMsgSize: test.maxCallRecvBytesClient,
|
||||||
|
},
|
||||||
|
)
|
||||||
|
cli := clus.Client(0)
|
||||||
|
_, err := cli.Put(context.TODO(), "foo", strings.Repeat("a", test.valueSize))
|
||||||
|
|
||||||
|
if _, ok := err.(rpctypes.EtcdError); ok {
|
||||||
|
if err != test.expectError {
|
||||||
|
t.Errorf("#%d: expected %v, got %v", i, test.expectError, err)
|
||||||
|
}
|
||||||
|
} else if err != nil && !strings.HasPrefix(err.Error(), test.expectError.Error()) {
|
||||||
|
t.Errorf("#%d: expected %v, got %v", i, test.expectError, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
// put request went through, now expects large response back
|
||||||
|
if err == nil {
|
||||||
|
_, err = cli.Get(context.TODO(), "foo")
|
||||||
|
if err != nil {
|
||||||
|
t.Errorf("#%d: get expected no error, got %v", i, err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
clus.Terminate(t)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@@ -18,6 +18,7 @@ import (
|
|||||||
pb "github.com/coreos/etcd/etcdserver/etcdserverpb"
|
pb "github.com/coreos/etcd/etcdserver/etcdserverpb"
|
||||||
|
|
||||||
"golang.org/x/net/context"
|
"golang.org/x/net/context"
|
||||||
|
"google.golang.org/grpc"
|
||||||
)
|
)
|
||||||
|
|
||||||
type (
|
type (
|
||||||
@@ -88,15 +89,24 @@ func (resp *TxnResponse) OpResponse() OpResponse {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type kv struct {
|
type kv struct {
|
||||||
remote pb.KVClient
|
remote pb.KVClient
|
||||||
|
callOpts []grpc.CallOption
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewKV(c *Client) KV {
|
func NewKV(c *Client) KV {
|
||||||
return &kv{remote: RetryKVClient(c)}
|
api := &kv{remote: RetryKVClient(c)}
|
||||||
|
if c != nil {
|
||||||
|
api.callOpts = c.callOpts
|
||||||
|
}
|
||||||
|
return api
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewKVFromKVClient(remote pb.KVClient) KV {
|
func NewKVFromKVClient(remote pb.KVClient, c *Client) KV {
|
||||||
return &kv{remote: remote}
|
api := &kv{remote: remote}
|
||||||
|
if c != nil {
|
||||||
|
api.callOpts = c.callOpts
|
||||||
|
}
|
||||||
|
return api
|
||||||
}
|
}
|
||||||
|
|
||||||
func (kv *kv) Put(ctx context.Context, key, val string, opts ...OpOption) (*PutResponse, error) {
|
func (kv *kv) Put(ctx context.Context, key, val string, opts ...OpOption) (*PutResponse, error) {
|
||||||
@@ -115,7 +125,7 @@ func (kv *kv) Delete(ctx context.Context, key string, opts ...OpOption) (*Delete
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (kv *kv) Compact(ctx context.Context, rev int64, opts ...CompactOption) (*CompactResponse, error) {
|
func (kv *kv) Compact(ctx context.Context, rev int64, opts ...CompactOption) (*CompactResponse, error) {
|
||||||
resp, err := kv.remote.Compact(ctx, OpCompact(rev, opts...).toRequest())
|
resp, err := kv.remote.Compact(ctx, OpCompact(rev, opts...).toRequest(), kv.callOpts...)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, toErr(ctx, err)
|
return nil, toErr(ctx, err)
|
||||||
}
|
}
|
||||||
@@ -124,8 +134,9 @@ func (kv *kv) Compact(ctx context.Context, rev int64, opts ...CompactOption) (*C
|
|||||||
|
|
||||||
func (kv *kv) Txn(ctx context.Context) Txn {
|
func (kv *kv) Txn(ctx context.Context) Txn {
|
||||||
return &txn{
|
return &txn{
|
||||||
kv: kv,
|
kv: kv,
|
||||||
ctx: ctx,
|
ctx: ctx,
|
||||||
|
callOpts: kv.callOpts,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -134,27 +145,27 @@ func (kv *kv) Do(ctx context.Context, op Op) (OpResponse, error) {
|
|||||||
switch op.t {
|
switch op.t {
|
||||||
case tRange:
|
case tRange:
|
||||||
var resp *pb.RangeResponse
|
var resp *pb.RangeResponse
|
||||||
resp, err = kv.remote.Range(ctx, op.toRangeRequest())
|
resp, err = kv.remote.Range(ctx, op.toRangeRequest(), kv.callOpts...)
|
||||||
if err == nil {
|
if err == nil {
|
||||||
return OpResponse{get: (*GetResponse)(resp)}, nil
|
return OpResponse{get: (*GetResponse)(resp)}, nil
|
||||||
}
|
}
|
||||||
case tPut:
|
case tPut:
|
||||||
var resp *pb.PutResponse
|
var resp *pb.PutResponse
|
||||||
r := &pb.PutRequest{Key: op.key, Value: op.val, Lease: int64(op.leaseID), PrevKv: op.prevKV, IgnoreValue: op.ignoreValue, IgnoreLease: op.ignoreLease}
|
r := &pb.PutRequest{Key: op.key, Value: op.val, Lease: int64(op.leaseID), PrevKv: op.prevKV, IgnoreValue: op.ignoreValue, IgnoreLease: op.ignoreLease}
|
||||||
resp, err = kv.remote.Put(ctx, r)
|
resp, err = kv.remote.Put(ctx, r, kv.callOpts...)
|
||||||
if err == nil {
|
if err == nil {
|
||||||
return OpResponse{put: (*PutResponse)(resp)}, nil
|
return OpResponse{put: (*PutResponse)(resp)}, nil
|
||||||
}
|
}
|
||||||
case tDeleteRange:
|
case tDeleteRange:
|
||||||
var resp *pb.DeleteRangeResponse
|
var resp *pb.DeleteRangeResponse
|
||||||
r := &pb.DeleteRangeRequest{Key: op.key, RangeEnd: op.end, PrevKv: op.prevKV}
|
r := &pb.DeleteRangeRequest{Key: op.key, RangeEnd: op.end, PrevKv: op.prevKV}
|
||||||
resp, err = kv.remote.DeleteRange(ctx, r)
|
resp, err = kv.remote.DeleteRange(ctx, r, kv.callOpts...)
|
||||||
if err == nil {
|
if err == nil {
|
||||||
return OpResponse{del: (*DeleteResponse)(resp)}, nil
|
return OpResponse{del: (*DeleteResponse)(resp)}, nil
|
||||||
}
|
}
|
||||||
case tTxn:
|
case tTxn:
|
||||||
var resp *pb.TxnResponse
|
var resp *pb.TxnResponse
|
||||||
resp, err = kv.remote.Txn(ctx, op.toTxnRequest())
|
resp, err = kv.remote.Txn(ctx, op.toTxnRequest(), kv.callOpts...)
|
||||||
if err == nil {
|
if err == nil {
|
||||||
return OpResponse{txn: (*TxnResponse)(resp)}, nil
|
return OpResponse{txn: (*TxnResponse)(resp)}, nil
|
||||||
}
|
}
|
||||||
|
@@ -22,6 +22,7 @@ import (
|
|||||||
pb "github.com/coreos/etcd/etcdserver/etcdserverpb"
|
pb "github.com/coreos/etcd/etcdserver/etcdserverpb"
|
||||||
|
|
||||||
"golang.org/x/net/context"
|
"golang.org/x/net/context"
|
||||||
|
"google.golang.org/grpc"
|
||||||
"google.golang.org/grpc/metadata"
|
"google.golang.org/grpc/metadata"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -139,6 +140,8 @@ type lessor struct {
|
|||||||
|
|
||||||
// firstKeepAliveOnce ensures stream starts after first KeepAlive call.
|
// firstKeepAliveOnce ensures stream starts after first KeepAlive call.
|
||||||
firstKeepAliveOnce sync.Once
|
firstKeepAliveOnce sync.Once
|
||||||
|
|
||||||
|
callOpts []grpc.CallOption
|
||||||
}
|
}
|
||||||
|
|
||||||
// keepAlive multiplexes a keepalive for a lease over multiple channels
|
// keepAlive multiplexes a keepalive for a lease over multiple channels
|
||||||
@@ -154,10 +157,10 @@ type keepAlive struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func NewLease(c *Client) Lease {
|
func NewLease(c *Client) Lease {
|
||||||
return NewLeaseFromLeaseClient(RetryLeaseClient(c), c.cfg.DialTimeout+time.Second)
|
return NewLeaseFromLeaseClient(RetryLeaseClient(c), c, c.cfg.DialTimeout+time.Second)
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewLeaseFromLeaseClient(remote pb.LeaseClient, keepAliveTimeout time.Duration) Lease {
|
func NewLeaseFromLeaseClient(remote pb.LeaseClient, c *Client, keepAliveTimeout time.Duration) Lease {
|
||||||
l := &lessor{
|
l := &lessor{
|
||||||
donec: make(chan struct{}),
|
donec: make(chan struct{}),
|
||||||
keepAlives: make(map[LeaseID]*keepAlive),
|
keepAlives: make(map[LeaseID]*keepAlive),
|
||||||
@@ -167,6 +170,9 @@ func NewLeaseFromLeaseClient(remote pb.LeaseClient, keepAliveTimeout time.Durati
|
|||||||
if l.firstKeepAliveTimeout == time.Second {
|
if l.firstKeepAliveTimeout == time.Second {
|
||||||
l.firstKeepAliveTimeout = defaultTTL
|
l.firstKeepAliveTimeout = defaultTTL
|
||||||
}
|
}
|
||||||
|
if c != nil {
|
||||||
|
l.callOpts = c.callOpts
|
||||||
|
}
|
||||||
reqLeaderCtx := WithRequireLeader(context.Background())
|
reqLeaderCtx := WithRequireLeader(context.Background())
|
||||||
l.stopCtx, l.stopCancel = context.WithCancel(reqLeaderCtx)
|
l.stopCtx, l.stopCancel = context.WithCancel(reqLeaderCtx)
|
||||||
return l
|
return l
|
||||||
@@ -174,7 +180,7 @@ func NewLeaseFromLeaseClient(remote pb.LeaseClient, keepAliveTimeout time.Durati
|
|||||||
|
|
||||||
func (l *lessor) Grant(ctx context.Context, ttl int64) (*LeaseGrantResponse, error) {
|
func (l *lessor) Grant(ctx context.Context, ttl int64) (*LeaseGrantResponse, error) {
|
||||||
r := &pb.LeaseGrantRequest{TTL: ttl}
|
r := &pb.LeaseGrantRequest{TTL: ttl}
|
||||||
resp, err := l.remote.LeaseGrant(ctx, r)
|
resp, err := l.remote.LeaseGrant(ctx, r, l.callOpts...)
|
||||||
if err == nil {
|
if err == nil {
|
||||||
gresp := &LeaseGrantResponse{
|
gresp := &LeaseGrantResponse{
|
||||||
ResponseHeader: resp.GetHeader(),
|
ResponseHeader: resp.GetHeader(),
|
||||||
@@ -189,7 +195,7 @@ func (l *lessor) Grant(ctx context.Context, ttl int64) (*LeaseGrantResponse, err
|
|||||||
|
|
||||||
func (l *lessor) Revoke(ctx context.Context, id LeaseID) (*LeaseRevokeResponse, error) {
|
func (l *lessor) Revoke(ctx context.Context, id LeaseID) (*LeaseRevokeResponse, error) {
|
||||||
r := &pb.LeaseRevokeRequest{ID: int64(id)}
|
r := &pb.LeaseRevokeRequest{ID: int64(id)}
|
||||||
resp, err := l.remote.LeaseRevoke(ctx, r)
|
resp, err := l.remote.LeaseRevoke(ctx, r, l.callOpts...)
|
||||||
if err == nil {
|
if err == nil {
|
||||||
return (*LeaseRevokeResponse)(resp), nil
|
return (*LeaseRevokeResponse)(resp), nil
|
||||||
}
|
}
|
||||||
@@ -198,7 +204,7 @@ func (l *lessor) Revoke(ctx context.Context, id LeaseID) (*LeaseRevokeResponse,
|
|||||||
|
|
||||||
func (l *lessor) TimeToLive(ctx context.Context, id LeaseID, opts ...LeaseOption) (*LeaseTimeToLiveResponse, error) {
|
func (l *lessor) TimeToLive(ctx context.Context, id LeaseID, opts ...LeaseOption) (*LeaseTimeToLiveResponse, error) {
|
||||||
r := toLeaseTimeToLiveRequest(id, opts...)
|
r := toLeaseTimeToLiveRequest(id, opts...)
|
||||||
resp, err := l.remote.LeaseTimeToLive(ctx, r)
|
resp, err := l.remote.LeaseTimeToLive(ctx, r, l.callOpts...)
|
||||||
if err == nil {
|
if err == nil {
|
||||||
gresp := &LeaseTimeToLiveResponse{
|
gresp := &LeaseTimeToLiveResponse{
|
||||||
ResponseHeader: resp.GetHeader(),
|
ResponseHeader: resp.GetHeader(),
|
||||||
@@ -350,7 +356,7 @@ func (l *lessor) keepAliveOnce(ctx context.Context, id LeaseID) (*LeaseKeepAlive
|
|||||||
cctx, cancel := context.WithCancel(ctx)
|
cctx, cancel := context.WithCancel(ctx)
|
||||||
defer cancel()
|
defer cancel()
|
||||||
|
|
||||||
stream, err := l.remote.LeaseKeepAlive(cctx)
|
stream, err := l.remote.LeaseKeepAlive(cctx, l.callOpts...)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, toErr(ctx, err)
|
return nil, toErr(ctx, err)
|
||||||
}
|
}
|
||||||
@@ -421,7 +427,7 @@ func (l *lessor) recvKeepAliveLoop() (gerr error) {
|
|||||||
// resetRecv opens a new lease stream and starts sending keep alive requests.
|
// resetRecv opens a new lease stream and starts sending keep alive requests.
|
||||||
func (l *lessor) resetRecv() (pb.Lease_LeaseKeepAliveClient, error) {
|
func (l *lessor) resetRecv() (pb.Lease_LeaseKeepAliveClient, error) {
|
||||||
sctx, cancel := context.WithCancel(l.stopCtx)
|
sctx, cancel := context.WithCancel(l.stopCtx)
|
||||||
stream, err := l.remote.LeaseKeepAlive(sctx)
|
stream, err := l.remote.LeaseKeepAlive(sctx, l.callOpts...)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
cancel()
|
cancel()
|
||||||
return nil, err
|
return nil, err
|
||||||
|
@@ -20,6 +20,7 @@ import (
|
|||||||
pb "github.com/coreos/etcd/etcdserver/etcdserverpb"
|
pb "github.com/coreos/etcd/etcdserver/etcdserverpb"
|
||||||
|
|
||||||
"golang.org/x/net/context"
|
"golang.org/x/net/context"
|
||||||
|
"google.golang.org/grpc"
|
||||||
)
|
)
|
||||||
|
|
||||||
type (
|
type (
|
||||||
@@ -53,12 +54,13 @@ type Maintenance interface {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type maintenance struct {
|
type maintenance struct {
|
||||||
dial func(endpoint string) (pb.MaintenanceClient, func(), error)
|
dial func(endpoint string) (pb.MaintenanceClient, func(), error)
|
||||||
remote pb.MaintenanceClient
|
remote pb.MaintenanceClient
|
||||||
|
callOpts []grpc.CallOption
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewMaintenance(c *Client) Maintenance {
|
func NewMaintenance(c *Client) Maintenance {
|
||||||
return &maintenance{
|
api := &maintenance{
|
||||||
dial: func(endpoint string) (pb.MaintenanceClient, func(), error) {
|
dial: func(endpoint string) (pb.MaintenanceClient, func(), error) {
|
||||||
conn, err := c.dial(endpoint)
|
conn, err := c.dial(endpoint)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@@ -69,15 +71,23 @@ func NewMaintenance(c *Client) Maintenance {
|
|||||||
},
|
},
|
||||||
remote: RetryMaintenanceClient(c, c.conn),
|
remote: RetryMaintenanceClient(c, c.conn),
|
||||||
}
|
}
|
||||||
|
if c != nil {
|
||||||
|
api.callOpts = c.callOpts
|
||||||
|
}
|
||||||
|
return api
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewMaintenanceFromMaintenanceClient(remote pb.MaintenanceClient) Maintenance {
|
func NewMaintenanceFromMaintenanceClient(remote pb.MaintenanceClient, c *Client) Maintenance {
|
||||||
return &maintenance{
|
api := &maintenance{
|
||||||
dial: func(string) (pb.MaintenanceClient, func(), error) {
|
dial: func(string) (pb.MaintenanceClient, func(), error) {
|
||||||
return remote, func() {}, nil
|
return remote, func() {}, nil
|
||||||
},
|
},
|
||||||
remote: remote,
|
remote: remote,
|
||||||
}
|
}
|
||||||
|
if c != nil {
|
||||||
|
api.callOpts = c.callOpts
|
||||||
|
}
|
||||||
|
return api
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *maintenance) AlarmList(ctx context.Context) (*AlarmResponse, error) {
|
func (m *maintenance) AlarmList(ctx context.Context) (*AlarmResponse, error) {
|
||||||
@@ -86,7 +96,7 @@ func (m *maintenance) AlarmList(ctx context.Context) (*AlarmResponse, error) {
|
|||||||
MemberID: 0, // all
|
MemberID: 0, // all
|
||||||
Alarm: pb.AlarmType_NONE, // all
|
Alarm: pb.AlarmType_NONE, // all
|
||||||
}
|
}
|
||||||
resp, err := m.remote.Alarm(ctx, req)
|
resp, err := m.remote.Alarm(ctx, req, m.callOpts...)
|
||||||
if err == nil {
|
if err == nil {
|
||||||
return (*AlarmResponse)(resp), nil
|
return (*AlarmResponse)(resp), nil
|
||||||
}
|
}
|
||||||
@@ -116,7 +126,7 @@ func (m *maintenance) AlarmDisarm(ctx context.Context, am *AlarmMember) (*AlarmR
|
|||||||
return &ret, nil
|
return &ret, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
resp, err := m.remote.Alarm(ctx, req)
|
resp, err := m.remote.Alarm(ctx, req, m.callOpts...)
|
||||||
if err == nil {
|
if err == nil {
|
||||||
return (*AlarmResponse)(resp), nil
|
return (*AlarmResponse)(resp), nil
|
||||||
}
|
}
|
||||||
@@ -129,7 +139,7 @@ func (m *maintenance) Defragment(ctx context.Context, endpoint string) (*Defragm
|
|||||||
return nil, toErr(ctx, err)
|
return nil, toErr(ctx, err)
|
||||||
}
|
}
|
||||||
defer cancel()
|
defer cancel()
|
||||||
resp, err := remote.Defragment(ctx, &pb.DefragmentRequest{})
|
resp, err := remote.Defragment(ctx, &pb.DefragmentRequest{}, m.callOpts...)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, toErr(ctx, err)
|
return nil, toErr(ctx, err)
|
||||||
}
|
}
|
||||||
@@ -142,7 +152,7 @@ func (m *maintenance) Status(ctx context.Context, endpoint string) (*StatusRespo
|
|||||||
return nil, toErr(ctx, err)
|
return nil, toErr(ctx, err)
|
||||||
}
|
}
|
||||||
defer cancel()
|
defer cancel()
|
||||||
resp, err := remote.Status(ctx, &pb.StatusRequest{})
|
resp, err := remote.Status(ctx, &pb.StatusRequest{}, m.callOpts...)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, toErr(ctx, err)
|
return nil, toErr(ctx, err)
|
||||||
}
|
}
|
||||||
@@ -150,7 +160,7 @@ func (m *maintenance) Status(ctx context.Context, endpoint string) (*StatusRespo
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (m *maintenance) Snapshot(ctx context.Context) (io.ReadCloser, error) {
|
func (m *maintenance) Snapshot(ctx context.Context) (io.ReadCloser, error) {
|
||||||
ss, err := m.remote.Snapshot(ctx, &pb.SnapshotRequest{})
|
ss, err := m.remote.Snapshot(ctx, &pb.SnapshotRequest{}, m.callOpts...)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, toErr(ctx, err)
|
return nil, toErr(ctx, err)
|
||||||
}
|
}
|
||||||
|
@@ -20,6 +20,7 @@ import (
|
|||||||
pb "github.com/coreos/etcd/etcdserver/etcdserverpb"
|
pb "github.com/coreos/etcd/etcdserver/etcdserverpb"
|
||||||
|
|
||||||
"golang.org/x/net/context"
|
"golang.org/x/net/context"
|
||||||
|
"google.golang.org/grpc"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Txn is the interface that wraps mini-transactions.
|
// Txn is the interface that wraps mini-transactions.
|
||||||
@@ -66,6 +67,8 @@ type txn struct {
|
|||||||
|
|
||||||
sus []*pb.RequestOp
|
sus []*pb.RequestOp
|
||||||
fas []*pb.RequestOp
|
fas []*pb.RequestOp
|
||||||
|
|
||||||
|
callOpts []grpc.CallOption
|
||||||
}
|
}
|
||||||
|
|
||||||
func (txn *txn) If(cs ...Cmp) Txn {
|
func (txn *txn) If(cs ...Cmp) Txn {
|
||||||
@@ -140,7 +143,7 @@ func (txn *txn) Commit() (*TxnResponse, error) {
|
|||||||
|
|
||||||
var resp *pb.TxnResponse
|
var resp *pb.TxnResponse
|
||||||
var err error
|
var err error
|
||||||
resp, err = txn.kv.remote.Txn(txn.ctx, r)
|
resp, err = txn.kv.remote.Txn(txn.ctx, r, txn.callOpts...)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, toErr(txn.ctx, err)
|
return nil, toErr(txn.ctx, err)
|
||||||
}
|
}
|
||||||
|
@@ -106,7 +106,8 @@ func (wr *WatchResponse) IsProgressNotify() bool {
|
|||||||
|
|
||||||
// watcher implements the Watcher interface
|
// watcher implements the Watcher interface
|
||||||
type watcher struct {
|
type watcher struct {
|
||||||
remote pb.WatchClient
|
remote pb.WatchClient
|
||||||
|
callOpts []grpc.CallOption
|
||||||
|
|
||||||
// mu protects the grpc streams map
|
// mu protects the grpc streams map
|
||||||
mu sync.RWMutex
|
mu sync.RWMutex
|
||||||
@@ -117,8 +118,9 @@ type watcher struct {
|
|||||||
|
|
||||||
// watchGrpcStream tracks all watch resources attached to a single grpc stream.
|
// watchGrpcStream tracks all watch resources attached to a single grpc stream.
|
||||||
type watchGrpcStream struct {
|
type watchGrpcStream struct {
|
||||||
owner *watcher
|
owner *watcher
|
||||||
remote pb.WatchClient
|
remote pb.WatchClient
|
||||||
|
callOpts []grpc.CallOption
|
||||||
|
|
||||||
// ctx controls internal remote.Watch requests
|
// ctx controls internal remote.Watch requests
|
||||||
ctx context.Context
|
ctx context.Context
|
||||||
@@ -189,14 +191,18 @@ type watcherStream struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func NewWatcher(c *Client) Watcher {
|
func NewWatcher(c *Client) Watcher {
|
||||||
return NewWatchFromWatchClient(pb.NewWatchClient(c.conn))
|
return NewWatchFromWatchClient(pb.NewWatchClient(c.conn), c)
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewWatchFromWatchClient(wc pb.WatchClient) Watcher {
|
func NewWatchFromWatchClient(wc pb.WatchClient, c *Client) Watcher {
|
||||||
return &watcher{
|
w := &watcher{
|
||||||
remote: wc,
|
remote: wc,
|
||||||
streams: make(map[string]*watchGrpcStream),
|
streams: make(map[string]*watchGrpcStream),
|
||||||
}
|
}
|
||||||
|
if c != nil {
|
||||||
|
w.callOpts = c.callOpts
|
||||||
|
}
|
||||||
|
return w
|
||||||
}
|
}
|
||||||
|
|
||||||
// never closes
|
// never closes
|
||||||
@@ -215,6 +221,7 @@ func (w *watcher) newWatcherGrpcStream(inctx context.Context) *watchGrpcStream {
|
|||||||
wgs := &watchGrpcStream{
|
wgs := &watchGrpcStream{
|
||||||
owner: w,
|
owner: w,
|
||||||
remote: w.remote,
|
remote: w.remote,
|
||||||
|
callOpts: w.callOpts,
|
||||||
ctx: ctx,
|
ctx: ctx,
|
||||||
ctxKey: streamKeyFromCtx(inctx),
|
ctxKey: streamKeyFromCtx(inctx),
|
||||||
cancel: cancel,
|
cancel: cancel,
|
||||||
@@ -775,7 +782,7 @@ func (w *watchGrpcStream) openWatchClient() (ws pb.Watch_WatchClient, err error)
|
|||||||
return nil, err
|
return nil, err
|
||||||
default:
|
default:
|
||||||
}
|
}
|
||||||
if ws, err = w.remote.Watch(w.ctx, grpc.FailFast(false)); ws != nil && err == nil {
|
if ws, err = w.remote.Watch(w.ctx, w.callOpts...); ws != nil && err == nil {
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
if isHaltErr(w.ctx, err) {
|
if isHaltErr(w.ctx, err) {
|
||||||
|
2
cmd/vendor/google.golang.org/grpc/rpc_util.go
generated
vendored
2
cmd/vendor/google.golang.org/grpc/rpc_util.go
generated
vendored
@@ -567,6 +567,6 @@ const SupportPackageIsVersion3 = true
|
|||||||
const SupportPackageIsVersion4 = true
|
const SupportPackageIsVersion4 = true
|
||||||
|
|
||||||
// Version is the current grpc version.
|
// Version is the current grpc version.
|
||||||
const Version = "1.7.4"
|
const Version = "1.7.5"
|
||||||
|
|
||||||
const grpcUA = "grpc-go/" + Version
|
const grpcUA = "grpc-go/" + Version
|
||||||
|
@@ -105,7 +105,7 @@ func (t *Periodic) Run() {
|
|||||||
last = clock.Now()
|
last = clock.Now()
|
||||||
plog.Noticef("Finished auto-compaction at revision %d", rev)
|
plog.Noticef("Finished auto-compaction at revision %d", rev)
|
||||||
} else {
|
} else {
|
||||||
plog.Noticef("Failed auto-compaction at revision %d (%v)", err, rev)
|
plog.Noticef("Failed auto-compaction at revision %d (%v)", rev, err)
|
||||||
plog.Noticef("Retry after %v", checkCompactionInterval)
|
plog.Noticef("Retry after %v", checkCompactionInterval)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
168
embed/etcd.go
168
embed/etcd.go
@@ -29,12 +29,15 @@ import (
|
|||||||
"github.com/coreos/etcd/etcdserver"
|
"github.com/coreos/etcd/etcdserver"
|
||||||
"github.com/coreos/etcd/etcdserver/api/etcdhttp"
|
"github.com/coreos/etcd/etcdserver/api/etcdhttp"
|
||||||
"github.com/coreos/etcd/etcdserver/api/v2http"
|
"github.com/coreos/etcd/etcdserver/api/v2http"
|
||||||
|
"github.com/coreos/etcd/etcdserver/api/v3rpc"
|
||||||
"github.com/coreos/etcd/pkg/cors"
|
"github.com/coreos/etcd/pkg/cors"
|
||||||
"github.com/coreos/etcd/pkg/debugutil"
|
"github.com/coreos/etcd/pkg/debugutil"
|
||||||
runtimeutil "github.com/coreos/etcd/pkg/runtime"
|
runtimeutil "github.com/coreos/etcd/pkg/runtime"
|
||||||
"github.com/coreos/etcd/pkg/transport"
|
"github.com/coreos/etcd/pkg/transport"
|
||||||
"github.com/coreos/etcd/pkg/types"
|
"github.com/coreos/etcd/pkg/types"
|
||||||
"github.com/coreos/etcd/rafthttp"
|
"github.com/coreos/etcd/rafthttp"
|
||||||
|
|
||||||
|
"github.com/cockroachdb/cmux"
|
||||||
"github.com/coreos/pkg/capnslog"
|
"github.com/coreos/pkg/capnslog"
|
||||||
"google.golang.org/grpc"
|
"google.golang.org/grpc"
|
||||||
"google.golang.org/grpc/keepalive"
|
"google.golang.org/grpc/keepalive"
|
||||||
@@ -60,12 +63,14 @@ const (
|
|||||||
type Etcd struct {
|
type Etcd struct {
|
||||||
Peers []*peerListener
|
Peers []*peerListener
|
||||||
Clients []net.Listener
|
Clients []net.Listener
|
||||||
Server *etcdserver.EtcdServer
|
// a map of contexts for the servers that serves client requests.
|
||||||
|
sctxs map[string]*serveCtx
|
||||||
|
|
||||||
|
Server *etcdserver.EtcdServer
|
||||||
|
|
||||||
cfg Config
|
cfg Config
|
||||||
stopc chan struct{}
|
stopc chan struct{}
|
||||||
errc chan error
|
errc chan error
|
||||||
sctxs map[string]*serveCtx
|
|
||||||
|
|
||||||
closeOnce sync.Once
|
closeOnce sync.Once
|
||||||
}
|
}
|
||||||
@@ -91,9 +96,9 @@ func StartEtcd(inCfg *Config) (e *Etcd, err error) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
if !serving {
|
if !serving {
|
||||||
// errored before starting gRPC server for serveCtx.grpcServerC
|
// errored before starting gRPC server for serveCtx.serversC
|
||||||
for _, sctx := range e.sctxs {
|
for _, sctx := range e.sctxs {
|
||||||
close(sctx.grpcServerC)
|
close(sctx.serversC)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
e.Close()
|
e.Close()
|
||||||
@@ -101,10 +106,10 @@ func StartEtcd(inCfg *Config) (e *Etcd, err error) {
|
|||||||
}()
|
}()
|
||||||
|
|
||||||
if e.Peers, err = startPeerListeners(cfg); err != nil {
|
if e.Peers, err = startPeerListeners(cfg); err != nil {
|
||||||
return
|
return e, err
|
||||||
}
|
}
|
||||||
if e.sctxs, err = startClientListeners(cfg); err != nil {
|
if e.sctxs, err = startClientListeners(cfg); err != nil {
|
||||||
return
|
return e, err
|
||||||
}
|
}
|
||||||
for _, sctx := range e.sctxs {
|
for _, sctx := range e.sctxs {
|
||||||
e.Clients = append(e.Clients, sctx.l)
|
e.Clients = append(e.Clients, sctx.l)
|
||||||
@@ -146,40 +151,27 @@ func StartEtcd(inCfg *Config) (e *Etcd, err error) {
|
|||||||
StrictReconfigCheck: cfg.StrictReconfigCheck,
|
StrictReconfigCheck: cfg.StrictReconfigCheck,
|
||||||
ClientCertAuthEnabled: cfg.ClientTLSInfo.ClientCertAuth,
|
ClientCertAuthEnabled: cfg.ClientTLSInfo.ClientCertAuth,
|
||||||
AuthToken: cfg.AuthToken,
|
AuthToken: cfg.AuthToken,
|
||||||
|
Debug: cfg.Debug,
|
||||||
}
|
}
|
||||||
|
|
||||||
if e.Server, err = etcdserver.NewServer(srvcfg); err != nil {
|
if e.Server, err = etcdserver.NewServer(srvcfg); err != nil {
|
||||||
return
|
return e, err
|
||||||
}
|
|
||||||
|
|
||||||
// configure peer handlers after rafthttp.Transport started
|
|
||||||
ph := etcdhttp.NewPeerHandler(e.Server)
|
|
||||||
for _, p := range e.Peers {
|
|
||||||
srv := &http.Server{
|
|
||||||
Handler: ph,
|
|
||||||
ReadTimeout: 5 * time.Minute,
|
|
||||||
ErrorLog: defaultLog.New(ioutil.Discard, "", 0), // do not log user error
|
|
||||||
}
|
|
||||||
|
|
||||||
l := p.Listener
|
|
||||||
p.serve = func() error { return srv.Serve(l) }
|
|
||||||
p.close = func(ctx context.Context) error {
|
|
||||||
// gracefully shutdown http.Server
|
|
||||||
// close open listeners, idle connections
|
|
||||||
// until context cancel or time-out
|
|
||||||
return srv.Shutdown(ctx)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// buffer channel so goroutines on closed connections won't wait forever
|
// buffer channel so goroutines on closed connections won't wait forever
|
||||||
e.errc = make(chan error, len(e.Peers)+len(e.Clients)+2*len(e.sctxs))
|
e.errc = make(chan error, len(e.Peers)+len(e.Clients)+2*len(e.sctxs))
|
||||||
|
|
||||||
e.Server.Start()
|
e.Server.Start()
|
||||||
if err = e.serve(); err != nil {
|
|
||||||
return
|
if err = e.servePeers(); err != nil {
|
||||||
|
return e, err
|
||||||
}
|
}
|
||||||
|
if err = e.serveClients(); err != nil {
|
||||||
|
return e, err
|
||||||
|
}
|
||||||
|
|
||||||
serving = true
|
serving = true
|
||||||
return
|
return e, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// Config returns the current configuration.
|
// Config returns the current configuration.
|
||||||
@@ -187,38 +179,29 @@ func (e *Etcd) Config() Config {
|
|||||||
return e.cfg
|
return e.cfg
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Close gracefully shuts down all servers/listeners.
|
||||||
|
// Client requests will be terminated with request timeout.
|
||||||
|
// After timeout, enforce remaning requests be closed immediately.
|
||||||
func (e *Etcd) Close() {
|
func (e *Etcd) Close() {
|
||||||
e.closeOnce.Do(func() { close(e.stopc) })
|
e.closeOnce.Do(func() { close(e.stopc) })
|
||||||
|
|
||||||
|
// close client requests with request timeout
|
||||||
timeout := 2 * time.Second
|
timeout := 2 * time.Second
|
||||||
if e.Server != nil {
|
if e.Server != nil {
|
||||||
timeout = e.Server.Cfg.ReqTimeout()
|
timeout = e.Server.Cfg.ReqTimeout()
|
||||||
}
|
}
|
||||||
for _, sctx := range e.sctxs {
|
for _, sctx := range e.sctxs {
|
||||||
for gs := range sctx.grpcServerC {
|
for ss := range sctx.serversC {
|
||||||
ch := make(chan struct{})
|
ctx, cancel := context.WithTimeout(context.Background(), timeout)
|
||||||
go func() {
|
stopServers(ctx, ss)
|
||||||
defer close(ch)
|
cancel()
|
||||||
// close listeners to stop accepting new connections,
|
|
||||||
// will block on any existing transports
|
|
||||||
gs.GracefulStop()
|
|
||||||
}()
|
|
||||||
// wait until all pending RPCs are finished
|
|
||||||
select {
|
|
||||||
case <-ch:
|
|
||||||
case <-time.After(timeout):
|
|
||||||
// took too long, manually close open transports
|
|
||||||
// e.g. watch streams
|
|
||||||
gs.Stop()
|
|
||||||
// concurrent GracefulStop should be interrupted
|
|
||||||
<-ch
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, sctx := range e.sctxs {
|
for _, sctx := range e.sctxs {
|
||||||
sctx.cancel()
|
sctx.cancel()
|
||||||
}
|
}
|
||||||
|
|
||||||
for i := range e.Clients {
|
for i := range e.Clients {
|
||||||
if e.Clients[i] != nil {
|
if e.Clients[i] != nil {
|
||||||
e.Clients[i].Close()
|
e.Clients[i].Close()
|
||||||
@@ -240,6 +223,43 @@ func (e *Etcd) Close() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func stopServers(ctx context.Context, ss *servers) {
|
||||||
|
shutdownNow := func() {
|
||||||
|
// first, close the http.Server
|
||||||
|
ss.http.Shutdown(ctx)
|
||||||
|
// then close grpc.Server; cancels all active RPCs
|
||||||
|
ss.grpc.Stop()
|
||||||
|
}
|
||||||
|
|
||||||
|
// do not grpc.Server.GracefulStop with TLS enabled etcd server
|
||||||
|
// See https://github.com/grpc/grpc-go/issues/1384#issuecomment-317124531
|
||||||
|
// and https://github.com/coreos/etcd/issues/8916
|
||||||
|
if ss.secure {
|
||||||
|
shutdownNow()
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
ch := make(chan struct{})
|
||||||
|
go func() {
|
||||||
|
defer close(ch)
|
||||||
|
// close listeners to stop accepting new connections,
|
||||||
|
// will block on any existing transports
|
||||||
|
ss.grpc.GracefulStop()
|
||||||
|
}()
|
||||||
|
|
||||||
|
// wait until all pending RPCs are finished
|
||||||
|
select {
|
||||||
|
case <-ch:
|
||||||
|
case <-ctx.Done():
|
||||||
|
// took too long, manually close open transports
|
||||||
|
// e.g. watch streams
|
||||||
|
shutdownNow()
|
||||||
|
|
||||||
|
// concurrent GracefulStop should be interrupted
|
||||||
|
<-ch
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func (e *Etcd) Err() <-chan error { return e.errc }
|
func (e *Etcd) Err() <-chan error { return e.errc }
|
||||||
|
|
||||||
func startPeerListeners(cfg *Config) (peers []*peerListener, err error) {
|
func startPeerListeners(cfg *Config) (peers []*peerListener, err error) {
|
||||||
@@ -268,7 +288,9 @@ func startPeerListeners(cfg *Config) (peers []*peerListener, err error) {
|
|||||||
for i := range peers {
|
for i := range peers {
|
||||||
if peers[i] != nil && peers[i].close != nil {
|
if peers[i] != nil && peers[i].close != nil {
|
||||||
plog.Info("stopping listening for peers on ", cfg.LPUrls[i].String())
|
plog.Info("stopping listening for peers on ", cfg.LPUrls[i].String())
|
||||||
peers[i].close(context.Background())
|
ctx, cancel := context.WithTimeout(context.Background(), time.Second)
|
||||||
|
peers[i].close(ctx)
|
||||||
|
cancel()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}()
|
}()
|
||||||
@@ -296,6 +318,45 @@ func startPeerListeners(cfg *Config) (peers []*peerListener, err error) {
|
|||||||
return peers, nil
|
return peers, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// configure peer handlers after rafthttp.Transport started
|
||||||
|
func (e *Etcd) servePeers() (err error) {
|
||||||
|
ph := etcdhttp.NewPeerHandler(e.Server)
|
||||||
|
var peerTLScfg *tls.Config
|
||||||
|
if !e.cfg.PeerTLSInfo.Empty() {
|
||||||
|
if peerTLScfg, err = e.cfg.PeerTLSInfo.ServerConfig(); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, p := range e.Peers {
|
||||||
|
gs := v3rpc.Server(e.Server, peerTLScfg)
|
||||||
|
m := cmux.New(p.Listener)
|
||||||
|
go gs.Serve(m.Match(cmux.HTTP2()))
|
||||||
|
srv := &http.Server{
|
||||||
|
Handler: grpcHandlerFunc(gs, ph),
|
||||||
|
ReadTimeout: 5 * time.Minute,
|
||||||
|
ErrorLog: defaultLog.New(ioutil.Discard, "", 0), // do not log user error
|
||||||
|
}
|
||||||
|
go srv.Serve(m.Match(cmux.Any()))
|
||||||
|
p.serve = func() error { return m.Serve() }
|
||||||
|
p.close = func(ctx context.Context) error {
|
||||||
|
// gracefully shutdown http.Server
|
||||||
|
// close open listeners, idle connections
|
||||||
|
// until context cancel or time-out
|
||||||
|
stopServers(ctx, &servers{secure: peerTLScfg != nil, grpc: gs, http: srv})
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// start peer servers in a goroutine
|
||||||
|
for _, pl := range e.Peers {
|
||||||
|
go func(l *peerListener) {
|
||||||
|
e.errHandler(l.serve())
|
||||||
|
}(pl)
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
func startClientListeners(cfg *Config) (sctxs map[string]*serveCtx, err error) {
|
func startClientListeners(cfg *Config) (sctxs map[string]*serveCtx, err error) {
|
||||||
if cfg.ClientAutoTLS && cfg.ClientTLSInfo.Empty() {
|
if cfg.ClientAutoTLS && cfg.ClientTLSInfo.Empty() {
|
||||||
chosts := make([]string, len(cfg.LCUrls))
|
chosts := make([]string, len(cfg.LCUrls))
|
||||||
@@ -387,7 +448,7 @@ func startClientListeners(cfg *Config) (sctxs map[string]*serveCtx, err error) {
|
|||||||
return sctxs, nil
|
return sctxs, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (e *Etcd) serve() (err error) {
|
func (e *Etcd) serveClients() (err error) {
|
||||||
var ctlscfg *tls.Config
|
var ctlscfg *tls.Config
|
||||||
if !e.cfg.ClientTLSInfo.Empty() {
|
if !e.cfg.ClientTLSInfo.Empty() {
|
||||||
plog.Infof("ClientTLS: %s", e.cfg.ClientTLSInfo)
|
plog.Infof("ClientTLS: %s", e.cfg.ClientTLSInfo)
|
||||||
@@ -400,13 +461,6 @@ func (e *Etcd) serve() (err error) {
|
|||||||
plog.Infof("cors = %s", e.cfg.CorsInfo)
|
plog.Infof("cors = %s", e.cfg.CorsInfo)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Start the peer server in a goroutine
|
|
||||||
for _, pl := range e.Peers {
|
|
||||||
go func(l *peerListener) {
|
|
||||||
e.errHandler(l.serve())
|
|
||||||
}(pl)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Start a client server goroutine for each listen address
|
// Start a client server goroutine for each listen address
|
||||||
var h http.Handler
|
var h http.Handler
|
||||||
if e.Config().EnableV2 {
|
if e.Config().EnableV2 {
|
||||||
@@ -432,6 +486,8 @@ func (e *Etcd) serve() (err error) {
|
|||||||
Timeout: e.cfg.GRPCKeepAliveTimeout,
|
Timeout: e.cfg.GRPCKeepAliveTimeout,
|
||||||
}))
|
}))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// start client servers in a goroutine
|
||||||
for _, sctx := range e.sctxs {
|
for _, sctx := range e.sctxs {
|
||||||
go func(s *serveCtx) {
|
go func(s *serveCtx) {
|
||||||
e.errHandler(s.serve(e.Server, ctlscfg, h, e.errHandler, gopts...))
|
e.errHandler(s.serve(e.Server, ctlscfg, h, e.errHandler, gopts...))
|
||||||
|
@@ -53,13 +53,22 @@ type serveCtx struct {
|
|||||||
|
|
||||||
userHandlers map[string]http.Handler
|
userHandlers map[string]http.Handler
|
||||||
serviceRegister func(*grpc.Server)
|
serviceRegister func(*grpc.Server)
|
||||||
grpcServerC chan *grpc.Server
|
serversC chan *servers
|
||||||
|
}
|
||||||
|
|
||||||
|
type servers struct {
|
||||||
|
secure bool
|
||||||
|
grpc *grpc.Server
|
||||||
|
http *http.Server
|
||||||
}
|
}
|
||||||
|
|
||||||
func newServeCtx() *serveCtx {
|
func newServeCtx() *serveCtx {
|
||||||
ctx, cancel := context.WithCancel(context.Background())
|
ctx, cancel := context.WithCancel(context.Background())
|
||||||
return &serveCtx{ctx: ctx, cancel: cancel, userHandlers: make(map[string]http.Handler),
|
return &serveCtx{
|
||||||
grpcServerC: make(chan *grpc.Server, 2), // in case sctx.insecure,sctx.secure true
|
ctx: ctx,
|
||||||
|
cancel: cancel,
|
||||||
|
userHandlers: make(map[string]http.Handler),
|
||||||
|
serversC: make(chan *servers, 2), // in case sctx.insecure,sctx.secure true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -83,7 +92,6 @@ func (sctx *serveCtx) serve(
|
|||||||
|
|
||||||
if sctx.insecure {
|
if sctx.insecure {
|
||||||
gs := v3rpc.Server(s, nil, gopts...)
|
gs := v3rpc.Server(s, nil, gopts...)
|
||||||
sctx.grpcServerC <- gs
|
|
||||||
v3electionpb.RegisterElectionServer(gs, servElection)
|
v3electionpb.RegisterElectionServer(gs, servElection)
|
||||||
v3lockpb.RegisterLockServer(gs, servLock)
|
v3lockpb.RegisterLockServer(gs, servLock)
|
||||||
if sctx.serviceRegister != nil {
|
if sctx.serviceRegister != nil {
|
||||||
@@ -92,9 +100,7 @@ func (sctx *serveCtx) serve(
|
|||||||
grpcl := m.Match(cmux.HTTP2())
|
grpcl := m.Match(cmux.HTTP2())
|
||||||
go func() { errHandler(gs.Serve(grpcl)) }()
|
go func() { errHandler(gs.Serve(grpcl)) }()
|
||||||
|
|
||||||
opts := []grpc.DialOption{
|
opts := []grpc.DialOption{grpc.WithInsecure()}
|
||||||
grpc.WithInsecure(),
|
|
||||||
}
|
|
||||||
gwmux, err := sctx.registerGateway(opts)
|
gwmux, err := sctx.registerGateway(opts)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
@@ -108,12 +114,13 @@ func (sctx *serveCtx) serve(
|
|||||||
}
|
}
|
||||||
httpl := m.Match(cmux.HTTP1())
|
httpl := m.Match(cmux.HTTP1())
|
||||||
go func() { errHandler(srvhttp.Serve(httpl)) }()
|
go func() { errHandler(srvhttp.Serve(httpl)) }()
|
||||||
|
|
||||||
|
sctx.serversC <- &servers{grpc: gs, http: srvhttp}
|
||||||
plog.Noticef("serving insecure client requests on %s, this is strongly discouraged!", sctx.l.Addr().String())
|
plog.Noticef("serving insecure client requests on %s, this is strongly discouraged!", sctx.l.Addr().String())
|
||||||
}
|
}
|
||||||
|
|
||||||
if sctx.secure {
|
if sctx.secure {
|
||||||
gs := v3rpc.Server(s, tlscfg, gopts...)
|
gs := v3rpc.Server(s, tlscfg, gopts...)
|
||||||
sctx.grpcServerC <- gs
|
|
||||||
v3electionpb.RegisterElectionServer(gs, servElection)
|
v3electionpb.RegisterElectionServer(gs, servElection)
|
||||||
v3lockpb.RegisterLockServer(gs, servLock)
|
v3lockpb.RegisterLockServer(gs, servLock)
|
||||||
if sctx.serviceRegister != nil {
|
if sctx.serviceRegister != nil {
|
||||||
@@ -142,10 +149,11 @@ func (sctx *serveCtx) serve(
|
|||||||
}
|
}
|
||||||
go func() { errHandler(srv.Serve(tlsl)) }()
|
go func() { errHandler(srv.Serve(tlsl)) }()
|
||||||
|
|
||||||
|
sctx.serversC <- &servers{secure: true, grpc: gs, http: srv}
|
||||||
plog.Infof("serving client requests on %s", sctx.l.Addr().String())
|
plog.Infof("serving client requests on %s", sctx.l.Addr().String())
|
||||||
}
|
}
|
||||||
|
|
||||||
close(sctx.grpcServerC)
|
close(sctx.serversC)
|
||||||
return m.Serve()
|
return m.Serve()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -32,19 +32,19 @@ func New(s *etcdserver.EtcdServer) *clientv3.Client {
|
|||||||
c := clientv3.NewCtxClient(context.Background())
|
c := clientv3.NewCtxClient(context.Background())
|
||||||
|
|
||||||
kvc := adapter.KvServerToKvClient(v3rpc.NewQuotaKVServer(s))
|
kvc := adapter.KvServerToKvClient(v3rpc.NewQuotaKVServer(s))
|
||||||
c.KV = clientv3.NewKVFromKVClient(kvc)
|
c.KV = clientv3.NewKVFromKVClient(kvc, c)
|
||||||
|
|
||||||
lc := adapter.LeaseServerToLeaseClient(v3rpc.NewQuotaLeaseServer(s))
|
lc := adapter.LeaseServerToLeaseClient(v3rpc.NewQuotaLeaseServer(s))
|
||||||
c.Lease = clientv3.NewLeaseFromLeaseClient(lc, time.Second)
|
c.Lease = clientv3.NewLeaseFromLeaseClient(lc, c, time.Second)
|
||||||
|
|
||||||
wc := adapter.WatchServerToWatchClient(v3rpc.NewWatchServer(s))
|
wc := adapter.WatchServerToWatchClient(v3rpc.NewWatchServer(s))
|
||||||
c.Watcher = &watchWrapper{clientv3.NewWatchFromWatchClient(wc)}
|
c.Watcher = &watchWrapper{clientv3.NewWatchFromWatchClient(wc, c)}
|
||||||
|
|
||||||
mc := adapter.MaintenanceServerToMaintenanceClient(v3rpc.NewMaintenanceServer(s))
|
mc := adapter.MaintenanceServerToMaintenanceClient(v3rpc.NewMaintenanceServer(s))
|
||||||
c.Maintenance = clientv3.NewMaintenanceFromMaintenanceClient(mc)
|
c.Maintenance = clientv3.NewMaintenanceFromMaintenanceClient(mc, c)
|
||||||
|
|
||||||
clc := adapter.ClusterServerToClusterClient(v3rpc.NewClusterServer(s))
|
clc := adapter.ClusterServerToClusterClient(v3rpc.NewClusterServer(s))
|
||||||
c.Cluster = clientv3.NewClusterFromClusterClient(clc)
|
c.Cluster = clientv3.NewClusterFromClusterClient(clc, c)
|
||||||
|
|
||||||
// TODO: implement clientv3.Auth interface?
|
// TODO: implement clientv3.Auth interface?
|
||||||
|
|
||||||
|
@@ -16,7 +16,10 @@ package v3rpc
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"crypto/tls"
|
"crypto/tls"
|
||||||
|
"io/ioutil"
|
||||||
"math"
|
"math"
|
||||||
|
"os"
|
||||||
|
"sync"
|
||||||
|
|
||||||
"github.com/coreos/etcd/etcdserver"
|
"github.com/coreos/etcd/etcdserver"
|
||||||
pb "github.com/coreos/etcd/etcdserver/etcdserverpb"
|
pb "github.com/coreos/etcd/etcdserver/etcdserverpb"
|
||||||
@@ -31,9 +34,8 @@ const (
|
|||||||
maxSendBytes = math.MaxInt32
|
maxSendBytes = math.MaxInt32
|
||||||
)
|
)
|
||||||
|
|
||||||
func init() {
|
// integration tests call this multiple times, which is racey in gRPC side
|
||||||
grpclog.SetLogger(plog)
|
var grpclogOnce sync.Once
|
||||||
}
|
|
||||||
|
|
||||||
func Server(s *etcdserver.EtcdServer, tls *tls.Config, gopts ...grpc.ServerOption) *grpc.Server {
|
func Server(s *etcdserver.EtcdServer, tls *tls.Config, gopts ...grpc.ServerOption) *grpc.Server {
|
||||||
var opts []grpc.ServerOption
|
var opts []grpc.ServerOption
|
||||||
@@ -55,5 +57,15 @@ func Server(s *etcdserver.EtcdServer, tls *tls.Config, gopts ...grpc.ServerOptio
|
|||||||
pb.RegisterAuthServer(grpcServer, NewAuthServer(s))
|
pb.RegisterAuthServer(grpcServer, NewAuthServer(s))
|
||||||
pb.RegisterMaintenanceServer(grpcServer, NewMaintenanceServer(s))
|
pb.RegisterMaintenanceServer(grpcServer, NewMaintenanceServer(s))
|
||||||
|
|
||||||
|
grpclogOnce.Do(func() {
|
||||||
|
if s.Cfg.Debug {
|
||||||
|
grpc.EnableTracing = true
|
||||||
|
// enable info, warning, error
|
||||||
|
grpclog.SetLoggerV2(grpclog.NewLoggerV2(os.Stderr, os.Stderr, os.Stderr))
|
||||||
|
} else {
|
||||||
|
// only discard info
|
||||||
|
grpclog.SetLoggerV2(grpclog.NewLoggerV2(ioutil.Discard, os.Stderr, os.Stderr))
|
||||||
|
}
|
||||||
|
})
|
||||||
return grpcServer
|
return grpcServer
|
||||||
}
|
}
|
||||||
|
@@ -92,7 +92,11 @@ func (ls *LeaseServer) leaseKeepAlive(stream pb.Lease_LeaseKeepAliveServer) erro
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
if err != nil {
|
if err != nil {
|
||||||
plog.Warningf("failed to receive lease keepalive request from gRPC stream (%q)", err.Error())
|
if isClientCtxErr(stream.Context().Err(), err) {
|
||||||
|
plog.Debugf("failed to receive lease keepalive request from gRPC stream (%q)", err.Error())
|
||||||
|
} else {
|
||||||
|
plog.Warningf("failed to receive lease keepalive request from gRPC stream (%q)", err.Error())
|
||||||
|
}
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -118,7 +122,11 @@ func (ls *LeaseServer) leaseKeepAlive(stream pb.Lease_LeaseKeepAliveServer) erro
|
|||||||
resp.TTL = ttl
|
resp.TTL = ttl
|
||||||
err = stream.Send(resp)
|
err = stream.Send(resp)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
plog.Warningf("failed to send lease keepalive response to gRPC stream (%q)", err.Error())
|
if isClientCtxErr(stream.Context().Err(), err) {
|
||||||
|
plog.Debugf("failed to send lease keepalive response to gRPC stream (%q)", err.Error())
|
||||||
|
} else {
|
||||||
|
plog.Warningf("failed to send lease keepalive response to gRPC stream (%q)", err.Error())
|
||||||
|
}
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -15,14 +15,18 @@
|
|||||||
package v3rpc
|
package v3rpc
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"strings"
|
||||||
|
|
||||||
"github.com/coreos/etcd/auth"
|
"github.com/coreos/etcd/auth"
|
||||||
"github.com/coreos/etcd/etcdserver"
|
"github.com/coreos/etcd/etcdserver"
|
||||||
"github.com/coreos/etcd/etcdserver/api/v3rpc/rpctypes"
|
"github.com/coreos/etcd/etcdserver/api/v3rpc/rpctypes"
|
||||||
"github.com/coreos/etcd/etcdserver/membership"
|
"github.com/coreos/etcd/etcdserver/membership"
|
||||||
"github.com/coreos/etcd/lease"
|
"github.com/coreos/etcd/lease"
|
||||||
"github.com/coreos/etcd/mvcc"
|
"github.com/coreos/etcd/mvcc"
|
||||||
|
|
||||||
"google.golang.org/grpc"
|
"google.golang.org/grpc"
|
||||||
"google.golang.org/grpc/codes"
|
"google.golang.org/grpc/codes"
|
||||||
|
"google.golang.org/grpc/status"
|
||||||
)
|
)
|
||||||
|
|
||||||
func togRPCError(err error) error {
|
func togRPCError(err error) error {
|
||||||
@@ -101,3 +105,35 @@ func togRPCError(err error) error {
|
|||||||
return grpc.Errorf(codes.Unknown, err.Error())
|
return grpc.Errorf(codes.Unknown, err.Error())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func isClientCtxErr(ctxErr error, err error) bool {
|
||||||
|
if ctxErr != nil {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
ev, ok := status.FromError(err)
|
||||||
|
if !ok {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
switch ev.Code() {
|
||||||
|
case codes.Canceled, codes.DeadlineExceeded:
|
||||||
|
// client-side context cancel or deadline exceeded
|
||||||
|
// "rpc error: code = Canceled desc = context canceled"
|
||||||
|
// "rpc error: code = DeadlineExceeded desc = context deadline exceeded"
|
||||||
|
return true
|
||||||
|
case codes.Unavailable:
|
||||||
|
msg := ev.Message()
|
||||||
|
// client-side context cancel or deadline exceeded with TLS ("http2.errClientDisconnected")
|
||||||
|
// "rpc error: code = Unavailable desc = client disconnected"
|
||||||
|
if msg == "client disconnected" {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
// "grpc/transport.ClientTransport.CloseStream" on canceled streams
|
||||||
|
// "rpc error: code = Unavailable desc = stream error: stream ID 21; CANCEL")
|
||||||
|
if strings.HasPrefix(msg, "stream error: ") && strings.HasSuffix(msg, "; CANCEL") {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
@@ -141,7 +141,11 @@ func (ws *watchServer) Watch(stream pb.Watch_WatchServer) (err error) {
|
|||||||
// deadlock when calling sws.close().
|
// deadlock when calling sws.close().
|
||||||
go func() {
|
go func() {
|
||||||
if rerr := sws.recvLoop(); rerr != nil {
|
if rerr := sws.recvLoop(); rerr != nil {
|
||||||
plog.Warningf("failed to receive watch request from gRPC stream (%q)", rerr.Error())
|
if isClientCtxErr(stream.Context().Err(), rerr) {
|
||||||
|
plog.Debugf("failed to receive watch request from gRPC stream (%q)", rerr.Error())
|
||||||
|
} else {
|
||||||
|
plog.Warningf("failed to receive watch request from gRPC stream (%q)", rerr.Error())
|
||||||
|
}
|
||||||
errc <- rerr
|
errc <- rerr
|
||||||
}
|
}
|
||||||
}()
|
}()
|
||||||
@@ -338,7 +342,11 @@ func (sws *serverWatchStream) sendLoop() {
|
|||||||
|
|
||||||
mvcc.ReportEventReceived(len(evs))
|
mvcc.ReportEventReceived(len(evs))
|
||||||
if err := sws.gRPCStream.Send(wr); err != nil {
|
if err := sws.gRPCStream.Send(wr); err != nil {
|
||||||
plog.Warningf("failed to send watch response to gRPC stream (%q)", err.Error())
|
if isClientCtxErr(sws.gRPCStream.Context().Err(), err) {
|
||||||
|
plog.Debugf("failed to send watch response to gRPC stream (%q)", err.Error())
|
||||||
|
} else {
|
||||||
|
plog.Warningf("failed to send watch response to gRPC stream (%q)", err.Error())
|
||||||
|
}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -355,7 +363,11 @@ func (sws *serverWatchStream) sendLoop() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if err := sws.gRPCStream.Send(c); err != nil {
|
if err := sws.gRPCStream.Send(c); err != nil {
|
||||||
plog.Warningf("failed to send watch control response to gRPC stream (%q)", err.Error())
|
if isClientCtxErr(sws.gRPCStream.Context().Err(), err) {
|
||||||
|
plog.Debugf("failed to send watch control response to gRPC stream (%q)", err.Error())
|
||||||
|
} else {
|
||||||
|
plog.Warningf("failed to send watch control response to gRPC stream (%q)", err.Error())
|
||||||
|
}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -371,7 +383,11 @@ func (sws *serverWatchStream) sendLoop() {
|
|||||||
for _, v := range pending[wid] {
|
for _, v := range pending[wid] {
|
||||||
mvcc.ReportEventReceived(len(v.Events))
|
mvcc.ReportEventReceived(len(v.Events))
|
||||||
if err := sws.gRPCStream.Send(v); err != nil {
|
if err := sws.gRPCStream.Send(v); err != nil {
|
||||||
plog.Warningf("failed to send pending watch response to gRPC stream (%q)", err.Error())
|
if isClientCtxErr(sws.gRPCStream.Context().Err(), err) {
|
||||||
|
plog.Debugf("failed to send pending watch response to gRPC stream (%q)", err.Error())
|
||||||
|
} else {
|
||||||
|
plog.Warningf("failed to send pending watch response to gRPC stream (%q)", err.Error())
|
||||||
|
}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -64,6 +64,8 @@ type ServerConfig struct {
|
|||||||
ClientCertAuthEnabled bool
|
ClientCertAuthEnabled bool
|
||||||
|
|
||||||
AuthToken string
|
AuthToken string
|
||||||
|
|
||||||
|
Debug bool
|
||||||
}
|
}
|
||||||
|
|
||||||
// VerifyBootstrap sanity-checks the initial config for bootstrap case
|
// VerifyBootstrap sanity-checks the initial config for bootstrap case
|
||||||
|
6
glide.lock
generated
6
glide.lock
generated
@@ -1,5 +1,5 @@
|
|||||||
hash: 94008ff434d6e211d8dbd412d81f123c5f43bb41b5267a50612ff34b8879b796
|
hash: 57308341a6ff76ce7960119ca6f589d2f5476c056f1f38f9a32552d9e68509d8
|
||||||
updated: 2017-12-04T14:22:51.678346-08:00
|
updated: 2017-12-19T13:02:46.509863-08:00
|
||||||
imports:
|
imports:
|
||||||
- name: github.com/beorn7/perks
|
- name: github.com/beorn7/perks
|
||||||
version: 4c0e84591b9aa9e6dcfdf3e020114cd81f89d5f9
|
version: 4c0e84591b9aa9e6dcfdf3e020114cd81f89d5f9
|
||||||
@@ -149,7 +149,7 @@ imports:
|
|||||||
- googleapis/api/annotations
|
- googleapis/api/annotations
|
||||||
- googleapis/rpc/status
|
- googleapis/rpc/status
|
||||||
- name: google.golang.org/grpc
|
- name: google.golang.org/grpc
|
||||||
version: 9a2334748bab9638f1480ad4f0ac6ac0c6c3a486
|
version: 5b3c4e850e90a4cf6a20ebd46c8b32a0a3afcb9e
|
||||||
subpackages:
|
subpackages:
|
||||||
- balancer
|
- balancer
|
||||||
- codes
|
- codes
|
||||||
|
@@ -40,7 +40,7 @@ import:
|
|||||||
- package: github.com/google/btree
|
- package: github.com/google/btree
|
||||||
version: 925471ac9e2131377a91e1595defec898166fe49
|
version: 925471ac9e2131377a91e1595defec898166fe49
|
||||||
- package: github.com/grpc-ecosystem/grpc-gateway
|
- package: github.com/grpc-ecosystem/grpc-gateway
|
||||||
version: v1.3
|
version: v1.3.0
|
||||||
subpackages:
|
subpackages:
|
||||||
- runtime
|
- runtime
|
||||||
- runtime/internal
|
- runtime/internal
|
||||||
@@ -97,7 +97,7 @@ import:
|
|||||||
subpackages:
|
subpackages:
|
||||||
- rate
|
- rate
|
||||||
- package: google.golang.org/grpc
|
- package: google.golang.org/grpc
|
||||||
version: v1.7.4
|
version: v1.7.5
|
||||||
subpackages:
|
subpackages:
|
||||||
- codes
|
- codes
|
||||||
- credentials
|
- credentials
|
||||||
|
37
hack/patch/README.md
Normal file
37
hack/patch/README.md
Normal file
@@ -0,0 +1,37 @@
|
|||||||
|
# ./hack/patch/cherrypick.sh
|
||||||
|
|
||||||
|
Handles cherry-picks of PR(s) from etcd master to a stable etcd release branch automatically.
|
||||||
|
|
||||||
|
## Setup
|
||||||
|
|
||||||
|
Set the `UPSTREAM_REMOTE` and `FORK_REMOTE` environment variables.
|
||||||
|
`UPSTREAM_REMOTE` should be set to git remote name of `github.com/coreos/etcd`,
|
||||||
|
and `FORK_REMOTE` should be set to the git remote name of the forked etcd
|
||||||
|
repo (`github.com/${github-username}/etcd`). Use `git remotes -v` to
|
||||||
|
look up the git remote names. If etcd has not been forked, create
|
||||||
|
one on github.com and register it locally with `git remote add ...`.
|
||||||
|
|
||||||
|
|
||||||
|
```
|
||||||
|
export UPSTREAM_REMOTE=origin
|
||||||
|
export FORK_REMOTE=${github-username}
|
||||||
|
export GITHUB_USER=${github-username}
|
||||||
|
```
|
||||||
|
|
||||||
|
Next, install hub from https://github.com/github/hub
|
||||||
|
|
||||||
|
## Usage
|
||||||
|
|
||||||
|
To cherry pick PR 12345 onto release-3.2 and propose is as a PR, run:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
./hack/patch/cherrypick.sh ${UPSTREAM_REMOTE}/release-3.2 12345
|
||||||
|
```
|
||||||
|
|
||||||
|
To cherry pick 12345 then 56789 and propose them togther as a single PR, run:
|
||||||
|
|
||||||
|
```
|
||||||
|
./hack/patch/cherrypick.sh ${UPSTREAM_REMOTE}/release-3.2 12345 56789
|
||||||
|
```
|
||||||
|
|
||||||
|
|
229
hack/patch/cherrypick.sh
Executable file
229
hack/patch/cherrypick.sh
Executable file
@@ -0,0 +1,229 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
# Based on github.com/kubernetes/kubernetes/blob/v1.8.2/hack/cherry_pick_pull.sh
|
||||||
|
|
||||||
|
# Checkout a PR from GitHub. (Yes, this is sitting in a Git tree. How
|
||||||
|
# meta.) Assumes you care about pulls from remote "upstream" and
|
||||||
|
# checks thems out to a branch named:
|
||||||
|
# automated-cherry-pick-of-<pr>-<target branch>-<timestamp>
|
||||||
|
|
||||||
|
set -o errexit
|
||||||
|
set -o nounset
|
||||||
|
set -o pipefail
|
||||||
|
|
||||||
|
declare -r ETCD_ROOT="$(dirname "${BASH_SOURCE}")/../.."
|
||||||
|
cd "${ETCD_ROOT}"
|
||||||
|
|
||||||
|
declare -r STARTINGBRANCH=$(git symbolic-ref --short HEAD)
|
||||||
|
declare -r REBASEMAGIC="${ETCD_ROOT}/.git/rebase-apply"
|
||||||
|
DRY_RUN=${DRY_RUN:-""}
|
||||||
|
REGENERATE_DOCS=${REGENERATE_DOCS:-""}
|
||||||
|
UPSTREAM_REMOTE=${UPSTREAM_REMOTE:-upstream}
|
||||||
|
FORK_REMOTE=${FORK_REMOTE:-origin}
|
||||||
|
|
||||||
|
if [[ -z ${GITHUB_USER:-} ]]; then
|
||||||
|
echo "Please export GITHUB_USER=<your-user> (or GH organization, if that's where your fork lives)"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ! which hub > /dev/null; then
|
||||||
|
echo "Can't find 'hub' tool in PATH, please install from https://github.com/github/hub"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ "$#" -lt 2 ]]; then
|
||||||
|
echo "${0} <remote branch> <pr-number>...: cherry pick one or more <pr> onto <remote branch> and leave instructions for proposing pull request"
|
||||||
|
echo
|
||||||
|
echo " Checks out <remote branch> and handles the cherry-pick of <pr> (possibly multiple) for you."
|
||||||
|
echo " Examples:"
|
||||||
|
echo " $0 upstream/release-3.14 12345 # Cherry-picks PR 12345 onto upstream/release-3.14 and proposes that as a PR."
|
||||||
|
echo " $0 upstream/release-3.14 12345 56789 # Cherry-picks PR 12345, then 56789 and proposes the combination as a single PR."
|
||||||
|
echo
|
||||||
|
echo " Set the DRY_RUN environment var to skip git push and creating PR."
|
||||||
|
echo " This is useful for creating patches to a release branch without making a PR."
|
||||||
|
echo " When DRY_RUN is set the script will leave you in a branch containing the commits you cherry-picked."
|
||||||
|
echo
|
||||||
|
echo " Set the REGENERATE_DOCS environment var to regenerate documentation for the target branch after picking the specified commits."
|
||||||
|
echo " This is useful when picking commits containing changes to API documentation."
|
||||||
|
echo
|
||||||
|
echo " Set UPSTREAM_REMOTE (default: upstream) and FORK_REMOTE (default: origin)"
|
||||||
|
echo " To override the default remote names to what you have locally."
|
||||||
|
exit 2
|
||||||
|
fi
|
||||||
|
|
||||||
|
if git_status=$(git status --porcelain --untracked=no 2>/dev/null) && [[ -n "${git_status}" ]]; then
|
||||||
|
echo "!!! Dirty tree. Clean up and try again."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ -e "${REBASEMAGIC}" ]]; then
|
||||||
|
echo "!!! 'git rebase' or 'git am' in progress. Clean up and try again."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
declare -r BRANCH="$1"
|
||||||
|
shift 1
|
||||||
|
declare -r PULLS=( "$@" )
|
||||||
|
|
||||||
|
function join { local IFS="$1"; shift; echo "$*"; }
|
||||||
|
declare -r PULLDASH=$(join - "${PULLS[@]/#/#}") # Generates something like "#12345-#56789"
|
||||||
|
declare -r PULLSUBJ=$(join " " "${PULLS[@]/#/#}") # Generates something like "#12345 #56789"
|
||||||
|
|
||||||
|
echo "+++ Updating remotes..."
|
||||||
|
git remote update "${UPSTREAM_REMOTE}" "${FORK_REMOTE}"
|
||||||
|
|
||||||
|
if ! git log -n1 --format=%H "${BRANCH}" >/dev/null 2>&1; then
|
||||||
|
echo "!!! '${BRANCH}' not found. The second argument should be something like ${UPSTREAM_REMOTE}/release-0.21."
|
||||||
|
echo " (In particular, it needs to be a valid, existing remote branch that I can 'git checkout'.)"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
declare -r NEWBRANCHREQ="automated-cherry-pick-of-${PULLDASH}" # "Required" portion for tools.
|
||||||
|
declare -r NEWBRANCH="$(echo "${NEWBRANCHREQ}-${BRANCH}" | sed 's/\//-/g')"
|
||||||
|
declare -r NEWBRANCHUNIQ="${NEWBRANCH}-$(date +%s)"
|
||||||
|
echo "+++ Creating local branch ${NEWBRANCHUNIQ}"
|
||||||
|
|
||||||
|
cleanbranch=""
|
||||||
|
prtext=""
|
||||||
|
gitamcleanup=false
|
||||||
|
function return_to_kansas {
|
||||||
|
if [[ "${gitamcleanup}" == "true" ]]; then
|
||||||
|
echo
|
||||||
|
echo "+++ Aborting in-progress git am."
|
||||||
|
git am --abort >/dev/null 2>&1 || true
|
||||||
|
fi
|
||||||
|
|
||||||
|
# return to the starting branch and delete the PR text file
|
||||||
|
if [[ -z "${DRY_RUN}" ]]; then
|
||||||
|
echo
|
||||||
|
echo "+++ Returning you to the ${STARTINGBRANCH} branch and cleaning up."
|
||||||
|
git checkout -f "${STARTINGBRANCH}" >/dev/null 2>&1 || true
|
||||||
|
if [[ -n "${cleanbranch}" ]]; then
|
||||||
|
git branch -D "${cleanbranch}" >/dev/null 2>&1 || true
|
||||||
|
fi
|
||||||
|
if [[ -n "${prtext}" ]]; then
|
||||||
|
rm "${prtext}"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
trap return_to_kansas EXIT
|
||||||
|
|
||||||
|
SUBJECTS=()
|
||||||
|
function make-a-pr() {
|
||||||
|
local rel="$(basename "${BRANCH}")"
|
||||||
|
echo
|
||||||
|
echo "+++ Creating a pull request on GitHub at ${GITHUB_USER}:${NEWBRANCH}"
|
||||||
|
|
||||||
|
# This looks like an unnecessary use of a tmpfile, but it avoids
|
||||||
|
# https://github.com/github/hub/issues/976 Otherwise stdin is stolen
|
||||||
|
# when we shove the heredoc at hub directly, tickling the ioctl
|
||||||
|
# crash.
|
||||||
|
prtext="$(mktemp -t prtext.XXXX)" # cleaned in return_to_kansas
|
||||||
|
cat >"${prtext}" <<EOF
|
||||||
|
Automated cherry pick of ${PULLSUBJ}
|
||||||
|
|
||||||
|
Cherry pick of ${PULLSUBJ} on ${rel}.
|
||||||
|
|
||||||
|
$(printf '%s\n' "${SUBJECTS[@]}")
|
||||||
|
EOF
|
||||||
|
|
||||||
|
hub pull-request -F "${prtext}" -h "${GITHUB_USER}:${NEWBRANCH}" -b "coreos:${rel}"
|
||||||
|
}
|
||||||
|
|
||||||
|
git checkout -b "${NEWBRANCHUNIQ}" "${BRANCH}"
|
||||||
|
cleanbranch="${NEWBRANCHUNIQ}"
|
||||||
|
|
||||||
|
gitamcleanup=true
|
||||||
|
for pull in "${PULLS[@]}"; do
|
||||||
|
echo "+++ Downloading patch to /tmp/${pull}.patch (in case you need to do this again)"
|
||||||
|
curl -o "/tmp/${pull}.patch" -sSL "http://github.com/coreos/etcd/pull/${pull}.patch"
|
||||||
|
echo
|
||||||
|
echo "+++ About to attempt cherry pick of PR. To reattempt:"
|
||||||
|
echo " $ git am -3 /tmp/${pull}.patch"
|
||||||
|
echo
|
||||||
|
git am -3 "/tmp/${pull}.patch" || {
|
||||||
|
conflicts=false
|
||||||
|
while unmerged=$(git status --porcelain | grep ^U) && [[ -n ${unmerged} ]] \
|
||||||
|
|| [[ -e "${REBASEMAGIC}" ]]; do
|
||||||
|
conflicts=true # <-- We should have detected conflicts once
|
||||||
|
echo
|
||||||
|
echo "+++ Conflicts detected:"
|
||||||
|
echo
|
||||||
|
(git status --porcelain | grep ^U) || echo "!!! None. Did you git am --continue?"
|
||||||
|
echo
|
||||||
|
echo "+++ Please resolve the conflicts in another window (and remember to 'git add / git am --continue')"
|
||||||
|
read -p "+++ Proceed (anything but 'y' aborts the cherry-pick)? [y/n] " -r
|
||||||
|
echo
|
||||||
|
if ! [[ "${REPLY}" =~ ^[yY]$ ]]; then
|
||||||
|
echo "Aborting." >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
if [[ "${conflicts}" != "true" ]]; then
|
||||||
|
echo "!!! git am failed, likely because of an in-progress 'git am' or 'git rebase'"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# set the subject
|
||||||
|
subject=$(grep -m 1 "^Subject" "/tmp/${pull}.patch" | sed -e 's/Subject: \[PATCH//g' | sed 's/.*] //')
|
||||||
|
SUBJECTS+=("#${pull}: ${subject}")
|
||||||
|
|
||||||
|
# remove the patch file from /tmp
|
||||||
|
rm -f "/tmp/${pull}.patch"
|
||||||
|
done
|
||||||
|
gitamcleanup=false
|
||||||
|
|
||||||
|
# Re-generate docs (if needed)
|
||||||
|
if [[ -n "${REGENERATE_DOCS}" ]]; then
|
||||||
|
echo
|
||||||
|
echo "Regenerating docs..."
|
||||||
|
if ! hack/generate-docs.sh; then
|
||||||
|
echo
|
||||||
|
echo "hack/generate-docs.sh FAILED to complete."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ -n "${DRY_RUN}" ]]; then
|
||||||
|
echo "!!! Skipping git push and PR creation because you set DRY_RUN."
|
||||||
|
echo "To return to the branch you were in when you invoked this script:"
|
||||||
|
echo
|
||||||
|
echo " git checkout ${STARTINGBRANCH}"
|
||||||
|
echo
|
||||||
|
echo "To delete this branch:"
|
||||||
|
echo
|
||||||
|
echo " git branch -D ${NEWBRANCHUNIQ}"
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
if git remote -v | grep ^${FORK_REMOTE} | grep etcd/etcd.git; then
|
||||||
|
echo "!!! You have ${FORK_REMOTE} configured as your etcd/etcd.git"
|
||||||
|
echo "This isn't normal. Leaving you with push instructions:"
|
||||||
|
echo
|
||||||
|
echo "+++ First manually push the branch this script created:"
|
||||||
|
echo
|
||||||
|
echo " git push REMOTE ${NEWBRANCHUNIQ}:${NEWBRANCH}"
|
||||||
|
echo
|
||||||
|
echo "where REMOTE is your personal fork (maybe ${UPSTREAM_REMOTE}? Consider swapping those.)."
|
||||||
|
echo "OR consider setting UPSTREAM_REMOTE and FORK_REMOTE to different values."
|
||||||
|
echo
|
||||||
|
make-a-pr
|
||||||
|
cleanbranch=""
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo
|
||||||
|
echo "+++ I'm about to do the following to push to GitHub (and I'm assuming ${FORK_REMOTE} is your personal fork):"
|
||||||
|
echo
|
||||||
|
echo " git push ${FORK_REMOTE} ${NEWBRANCHUNIQ}:${NEWBRANCH}"
|
||||||
|
echo
|
||||||
|
read -p "+++ Proceed (anything but 'y' aborts the cherry-pick)? [y/n] " -r
|
||||||
|
if ! [[ "${REPLY}" =~ ^[yY]$ ]]; then
|
||||||
|
echo "Aborting." >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
git push "${FORK_REMOTE}" -f "${NEWBRANCHUNIQ}:${NEWBRANCH}"
|
||||||
|
make-a-pr
|
@@ -12,6 +12,7 @@ build:
|
|||||||
|
|
||||||
clean:
|
clean:
|
||||||
rm -f ./codecov
|
rm -f ./codecov
|
||||||
|
rm -rf ./agent-*
|
||||||
rm -rf ./covdir
|
rm -rf ./covdir
|
||||||
rm -f ./*.log
|
rm -f ./*.log
|
||||||
rm -f ./bin/Dockerfile-release
|
rm -f ./bin/Dockerfile-release
|
||||||
@@ -30,7 +31,7 @@ endif
|
|||||||
# Example:
|
# Example:
|
||||||
# GO_VERSION=1.8.5 make build-docker-test -f ./hack/scripts-dev/Makefile
|
# GO_VERSION=1.8.5 make build-docker-test -f ./hack/scripts-dev/Makefile
|
||||||
# make build-docker-test -f ./hack/scripts-dev/Makefile
|
# make build-docker-test -f ./hack/scripts-dev/Makefile
|
||||||
# gcloud docker -- login -u _json_key -p "$(cat /etc/gcp-key-etcd.json)" https://gcr.io
|
# gcloud docker -- login -u _json_key -p "$(cat /etc/gcp-key-etcd-development.json)" https://gcr.io
|
||||||
# GO_VERSION=1.8.5 make push-docker-test -f ./hack/scripts-dev/Makefile
|
# GO_VERSION=1.8.5 make push-docker-test -f ./hack/scripts-dev/Makefile
|
||||||
# make push-docker-test -f ./hack/scripts-dev/Makefile
|
# make push-docker-test -f ./hack/scripts-dev/Makefile
|
||||||
# gsutil -m acl ch -u allUsers:R -r gs://artifacts.etcd-development.appspot.com
|
# gsutil -m acl ch -u allUsers:R -r gs://artifacts.etcd-development.appspot.com
|
||||||
@@ -94,7 +95,7 @@ test:
|
|||||||
$(info TEST_OPTS: $(_TEST_OPTS))
|
$(info TEST_OPTS: $(_TEST_OPTS))
|
||||||
$(info log-file: test-$(TEST_SUFFIX).log)
|
$(info log-file: test-$(TEST_SUFFIX).log)
|
||||||
$(_TEST_OPTS) ./test 2>&1 | tee test-$(TEST_SUFFIX).log
|
$(_TEST_OPTS) ./test 2>&1 | tee test-$(TEST_SUFFIX).log
|
||||||
! egrep "(--- FAIL:|leak)" -A10 -B50 test-$(TEST_SUFFIX).log
|
! egrep "(--- FAIL:|panic: test timed out|appears to have leaked|Too many goroutines)" -B50 -A10 test-$(TEST_SUFFIX).log
|
||||||
|
|
||||||
docker-test:
|
docker-test:
|
||||||
$(info GO_VERSION: $(_GO_VERSION))
|
$(info GO_VERSION: $(_GO_VERSION))
|
||||||
@@ -102,20 +103,22 @@ docker-test:
|
|||||||
$(info log-file: test-$(TEST_SUFFIX).log)
|
$(info log-file: test-$(TEST_SUFFIX).log)
|
||||||
docker run \
|
docker run \
|
||||||
--rm \
|
--rm \
|
||||||
|
--volume=/tmp:/tmp \
|
||||||
--volume=`pwd`:/go/src/github.com/coreos/etcd \
|
--volume=`pwd`:/go/src/github.com/coreos/etcd \
|
||||||
gcr.io/etcd-development/etcd-test:go$(_GO_VERSION) \
|
gcr.io/etcd-development/etcd-test:go$(_GO_VERSION) \
|
||||||
/bin/bash -c "$(_TEST_OPTS) ./test 2>&1 | tee test-$(TEST_SUFFIX).log"
|
/bin/bash -c "$(_TEST_OPTS) ./test 2>&1 | tee test-$(TEST_SUFFIX).log"
|
||||||
! egrep "(--- FAIL:|leak)" -A10 -B50 test-$(TEST_SUFFIX).log
|
! egrep "(--- FAIL:|panic: test timed out|appears to have leaked|Too many goroutines)" -B50 -A10 test-$(TEST_SUFFIX).log
|
||||||
|
|
||||||
docker-test-coverage:
|
docker-test-coverage:
|
||||||
$(info GO_VERSION: $(_GO_VERSION))
|
$(info GO_VERSION: $(_GO_VERSION))
|
||||||
$(info log-file: docker-test-coverage-$(TEST_SUFFIX).log)
|
$(info log-file: docker-test-coverage-$(TEST_SUFFIX).log)
|
||||||
docker run \
|
docker run \
|
||||||
--rm \
|
--rm \
|
||||||
|
--volume=/tmp:/tmp \
|
||||||
--volume=`pwd`:/go/src/github.com/coreos/etcd \
|
--volume=`pwd`:/go/src/github.com/coreos/etcd \
|
||||||
gcr.io/etcd-development/etcd-test:go$(_GO_VERSION) \
|
gcr.io/etcd-development/etcd-test:go$(_GO_VERSION) \
|
||||||
/bin/bash -c "COVERDIR=covdir PASSES='build build_cov cov' ./test 2>&1 | tee docker-test-coverage-$(TEST_SUFFIX).log && /codecov -t 6040de41-c073-4d6f-bbf8-d89256ef31e1"
|
/bin/bash -c "COVERDIR=covdir PASSES='build build_cov cov' ./test 2>&1 | tee docker-test-coverage-$(TEST_SUFFIX).log && /codecov -t 6040de41-c073-4d6f-bbf8-d89256ef31e1"
|
||||||
! egrep "(--- FAIL:|leak)" -A10 -B50 docker-test-coverage-$(TEST_SUFFIX).log
|
! egrep "(--- FAIL:|panic: test timed out|appears to have leaked|Too many goroutines)" -B50 -A10 docker-test-coverage-$(TEST_SUFFIX).log
|
||||||
|
|
||||||
# build release container image with Linux
|
# build release container image with Linux
|
||||||
_ETCD_VERSION ?= $(shell git rev-parse --short HEAD || echo "GitNotFound")
|
_ETCD_VERSION ?= $(shell git rev-parse --short HEAD || echo "GitNotFound")
|
||||||
@@ -150,13 +153,14 @@ push-docker-release-master:
|
|||||||
# make build-docker-test -f ./hack/scripts-dev/Makefile
|
# make build-docker-test -f ./hack/scripts-dev/Makefile
|
||||||
# make compile-with-docker-test -f ./hack/scripts-dev/Makefile
|
# make compile-with-docker-test -f ./hack/scripts-dev/Makefile
|
||||||
# make build-docker-dns-test -f ./hack/scripts-dev/Makefile
|
# make build-docker-dns-test -f ./hack/scripts-dev/Makefile
|
||||||
# gcloud docker -- login -u _json_key -p "$(cat /etc/gcp-key-etcd.json)" https://gcr.io
|
# gcloud docker -- login -u _json_key -p "$(cat /etc/gcp-key-etcd-development.json)" https://gcr.io
|
||||||
# make push-docker-dns-test -f ./hack/scripts-dev/Makefile
|
# make push-docker-dns-test -f ./hack/scripts-dev/Makefile
|
||||||
# gsutil -m acl ch -u allUsers:R -r gs://artifacts.etcd-development.appspot.com
|
# gsutil -m acl ch -u allUsers:R -r gs://artifacts.etcd-development.appspot.com
|
||||||
# make pull-docker-dns-test -f ./hack/scripts-dev/Makefile
|
# make pull-docker-dns-test -f ./hack/scripts-dev/Makefile
|
||||||
# make docker-dns-test-run -f ./hack/scripts-dev/Makefile
|
# make docker-dns-test-certs-run -f ./hack/scripts-dev/Makefile
|
||||||
|
# make docker-dns-test-certs-gateway-run -f ./hack/scripts-dev/Makefile
|
||||||
|
# make docker-dns-test-certs-wildcard-run -f ./hack/scripts-dev/Makefile
|
||||||
|
|
||||||
# build base container image for DNS testing
|
|
||||||
build-docker-dns-test:
|
build-docker-dns-test:
|
||||||
$(info GO_VERSION: $(_GO_VERSION))
|
$(info GO_VERSION: $(_GO_VERSION))
|
||||||
@cat ./hack/scripts-dev/docker-dns/Dockerfile | sed s/REPLACE_ME_GO_VERSION/$(_GO_VERSION)/ \
|
@cat ./hack/scripts-dev/docker-dns/Dockerfile | sed s/REPLACE_ME_GO_VERSION/$(_GO_VERSION)/ \
|
||||||
@@ -181,29 +185,54 @@ pull-docker-dns-test:
|
|||||||
$(info GO_VERSION: $(_GO_VERSION))
|
$(info GO_VERSION: $(_GO_VERSION))
|
||||||
docker pull gcr.io/etcd-development/etcd-dns-test:go$(_GO_VERSION)
|
docker pull gcr.io/etcd-development/etcd-dns-test:go$(_GO_VERSION)
|
||||||
|
|
||||||
# run DNS tests inside container
|
docker-dns-test-certs-run:
|
||||||
docker-dns-test-run:
|
|
||||||
$(info GO_VERSION: $(_GO_VERSION))
|
$(info GO_VERSION: $(_GO_VERSION))
|
||||||
docker run \
|
docker run \
|
||||||
--rm \
|
--rm \
|
||||||
--tty \
|
--tty \
|
||||||
--dns 127.0.0.1 \
|
--dns 127.0.0.1 \
|
||||||
|
--volume=/tmp:/tmp \
|
||||||
--volume=`pwd`/bin:/etcd \
|
--volume=`pwd`/bin:/etcd \
|
||||||
--volume=`pwd`/integration/fixtures:/certs \
|
--volume=`pwd`/hack/scripts-dev/docker-dns/certs:/certs \
|
||||||
gcr.io/etcd-development/etcd-dns-test:go$(_GO_VERSION) \
|
gcr.io/etcd-development/etcd-dns-test:go$(_GO_VERSION) \
|
||||||
/bin/bash -c "cd /etcd && /run.sh && rm -rf m*.etcd"
|
/bin/bash -c "cd /etcd && /certs/run.sh && rm -rf m*.etcd"
|
||||||
|
|
||||||
|
docker-dns-test-certs-gateway-run:
|
||||||
|
$(info GO_VERSION: $(_GO_VERSION))
|
||||||
|
docker run \
|
||||||
|
--rm \
|
||||||
|
--tty \
|
||||||
|
--dns 127.0.0.1 \
|
||||||
|
--volume=/tmp:/tmp \
|
||||||
|
--volume=`pwd`/bin:/etcd \
|
||||||
|
--volume=`pwd`/hack/scripts-dev/docker-dns/certs-gateway:/certs-gateway \
|
||||||
|
gcr.io/etcd-development/etcd-dns-test:go$(_GO_VERSION) \
|
||||||
|
/bin/bash -c "cd /etcd && /certs-gateway/run.sh && rm -rf m*.etcd"
|
||||||
|
|
||||||
|
docker-dns-test-certs-wildcard-run:
|
||||||
|
$(info GO_VERSION: $(_GO_VERSION))
|
||||||
|
docker run \
|
||||||
|
--rm \
|
||||||
|
--tty \
|
||||||
|
--dns 127.0.0.1 \
|
||||||
|
--volume=/tmp:/tmp \
|
||||||
|
--volume=`pwd`/bin:/etcd \
|
||||||
|
--volume=`pwd`/hack/scripts-dev/docker-dns/certs-wildcard:/certs-wildcard \
|
||||||
|
gcr.io/etcd-development/etcd-dns-test:go$(_GO_VERSION) \
|
||||||
|
/bin/bash -c "cd /etcd && /certs-wildcard/run.sh && rm -rf m*.etcd"
|
||||||
|
|
||||||
# Example:
|
# Example:
|
||||||
# make build-docker-test -f ./hack/scripts-dev/Makefile
|
# make build-docker-test -f ./hack/scripts-dev/Makefile
|
||||||
# make compile-with-docker-test -f ./hack/scripts-dev/Makefile
|
# make compile-with-docker-test -f ./hack/scripts-dev/Makefile
|
||||||
# make build-docker-dns-srv-test -f ./hack/scripts-dev/Makefile
|
# make build-docker-dns-srv-test -f ./hack/scripts-dev/Makefile
|
||||||
# gcloud docker -- login -u _json_key -p "$(cat /etc/gcp-key-etcd.json)" https://gcr.io
|
# gcloud docker -- login -u _json_key -p "$(cat /etc/gcp-key-etcd-development.json)" https://gcr.io
|
||||||
# make push-docker-dns-srv-test -f ./hack/scripts-dev/Makefile
|
# make push-docker-dns-srv-test -f ./hack/scripts-dev/Makefile
|
||||||
# gsutil -m acl ch -u allUsers:R -r gs://artifacts.etcd-development.appspot.com
|
# gsutil -m acl ch -u allUsers:R -r gs://artifacts.etcd-development.appspot.com
|
||||||
# make pull-docker-dns-srv-test -f ./hack/scripts-dev/Makefile
|
# make pull-docker-dns-srv-test -f ./hack/scripts-dev/Makefile
|
||||||
# make docker-dns-srv-test-run -f ./hack/scripts-dev/Makefile
|
# make docker-dns-srv-test-certs-run -f ./hack/scripts-dev/Makefile
|
||||||
|
# make docker-dns-srv-test-certs-gateway-run -f ./hack/scripts-dev/Makefile
|
||||||
|
# make docker-dns-srv-test-certs-wildcard-run -f ./hack/scripts-dev/Makefile
|
||||||
|
|
||||||
# build base container image for DNS/SRV testing
|
|
||||||
build-docker-dns-srv-test:
|
build-docker-dns-srv-test:
|
||||||
$(info GO_VERSION: $(_GO_VERSION))
|
$(info GO_VERSION: $(_GO_VERSION))
|
||||||
@cat ./hack/scripts-dev/docker-dns-srv/Dockerfile | sed s/REPLACE_ME_GO_VERSION/$(_GO_VERSION)/ \
|
@cat ./hack/scripts-dev/docker-dns-srv/Dockerfile | sed s/REPLACE_ME_GO_VERSION/$(_GO_VERSION)/ \
|
||||||
@@ -228,16 +257,38 @@ pull-docker-dns-srv-test:
|
|||||||
$(info GO_VERSION: $(_GO_VERSION))
|
$(info GO_VERSION: $(_GO_VERSION))
|
||||||
docker pull gcr.io/etcd-development/etcd-dns-srv-test:go$(_GO_VERSION)
|
docker pull gcr.io/etcd-development/etcd-dns-srv-test:go$(_GO_VERSION)
|
||||||
|
|
||||||
# run DNS/SRV tests inside container
|
docker-dns-srv-test-certs-run:
|
||||||
docker-dns-srv-test-run:
|
|
||||||
$(info GO_VERSION: $(_GO_VERSION))
|
$(info GO_VERSION: $(_GO_VERSION))
|
||||||
docker run \
|
docker run \
|
||||||
--rm \
|
--rm \
|
||||||
--tty \
|
--tty \
|
||||||
--dns 127.0.0.1 \
|
--dns 127.0.0.1 \
|
||||||
|
--volume=/tmp:/tmp \
|
||||||
--volume=`pwd`/bin:/etcd \
|
--volume=`pwd`/bin:/etcd \
|
||||||
--volume=`pwd`/integration/fixtures:/certs \
|
--volume=`pwd`/hack/scripts-dev/docker-dns-srv/certs:/certs \
|
||||||
gcr.io/etcd-development/etcd-dns-srv-test:go$(_GO_VERSION) \
|
gcr.io/etcd-development/etcd-dns-srv-test:go$(_GO_VERSION) \
|
||||||
/bin/bash -c "cd /etcd && /run.sh && rm -rf m*.etcd"
|
/bin/bash -c "cd /etcd && /certs/run.sh && rm -rf m*.etcd"
|
||||||
|
|
||||||
# TODO: add DNS integration tests
|
docker-dns-srv-test-certs-gateway-run:
|
||||||
|
$(info GO_VERSION: $(_GO_VERSION))
|
||||||
|
docker run \
|
||||||
|
--rm \
|
||||||
|
--tty \
|
||||||
|
--dns 127.0.0.1 \
|
||||||
|
--volume=/tmp:/tmp \
|
||||||
|
--volume=`pwd`/bin:/etcd \
|
||||||
|
--volume=`pwd`/hack/scripts-dev/docker-dns-srv/certs-gateway:/certs-gateway \
|
||||||
|
gcr.io/etcd-development/etcd-dns-srv-test:go$(_GO_VERSION) \
|
||||||
|
/bin/bash -c "cd /etcd && /certs-gateway/run.sh && rm -rf m*.etcd"
|
||||||
|
|
||||||
|
docker-dns-srv-test-certs-wildcard-run:
|
||||||
|
$(info GO_VERSION: $(_GO_VERSION))
|
||||||
|
docker run \
|
||||||
|
--rm \
|
||||||
|
--tty \
|
||||||
|
--dns 127.0.0.1 \
|
||||||
|
--volume=/tmp:/tmp \
|
||||||
|
--volume=`pwd`/bin:/etcd \
|
||||||
|
--volume=`pwd`/hack/scripts-dev/docker-dns-srv/certs-wildcard:/certs-wildcard \
|
||||||
|
gcr.io/etcd-development/etcd-dns-srv-test:go$(_GO_VERSION) \
|
||||||
|
/bin/bash -c "cd /etcd && /certs-wildcard/run.sh && rm -rf m*.etcd"
|
@@ -1,48 +0,0 @@
|
|||||||
FROM ubuntu:16.10
|
|
||||||
|
|
||||||
RUN rm /bin/sh && ln -s /bin/bash /bin/sh
|
|
||||||
RUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections
|
|
||||||
|
|
||||||
RUN apt-get -y update \
|
|
||||||
&& apt-get -y install \
|
|
||||||
build-essential \
|
|
||||||
gcc \
|
|
||||||
apt-utils \
|
|
||||||
pkg-config \
|
|
||||||
software-properties-common \
|
|
||||||
apt-transport-https \
|
|
||||||
libssl-dev \
|
|
||||||
sudo \
|
|
||||||
bash \
|
|
||||||
curl \
|
|
||||||
tar \
|
|
||||||
git \
|
|
||||||
netcat \
|
|
||||||
bind9 \
|
|
||||||
dnsutils \
|
|
||||||
&& apt-get -y update \
|
|
||||||
&& apt-get -y upgrade \
|
|
||||||
&& apt-get -y autoremove \
|
|
||||||
&& apt-get -y autoclean
|
|
||||||
|
|
||||||
ENV GOROOT /usr/local/go
|
|
||||||
ENV GOPATH /go
|
|
||||||
ENV PATH ${GOPATH}/bin:${GOROOT}/bin:${PATH}
|
|
||||||
ENV GO_VERSION 1.9.2
|
|
||||||
ENV GO_DOWNLOAD_URL https://storage.googleapis.com/golang
|
|
||||||
RUN rm -rf ${GOROOT} \
|
|
||||||
&& curl -s ${GO_DOWNLOAD_URL}/go${GO_VERSION}.linux-amd64.tar.gz | tar -v -C /usr/local/ -xz \
|
|
||||||
&& mkdir -p ${GOPATH}/src ${GOPATH}/bin \
|
|
||||||
&& go version
|
|
||||||
|
|
||||||
RUN mkdir -p /var/bind /etc/bind
|
|
||||||
RUN chown root:bind /var/bind /etc/bind
|
|
||||||
ADD Procfile /Procfile
|
|
||||||
ADD run.sh /run.sh
|
|
||||||
|
|
||||||
ADD named.conf etcd.zone rdns.zone /etc/bind/
|
|
||||||
RUN chown root:bind /etc/bind/named.conf /etc/bind/etcd.zone /etc/bind/rdns.zone
|
|
||||||
ADD resolv.conf /etc/resolv.conf
|
|
||||||
|
|
||||||
RUN go get github.com/mattn/goreman
|
|
||||||
CMD ["/run.sh"]
|
|
@@ -33,16 +33,12 @@ ENV GO_DOWNLOAD_URL https://storage.googleapis.com/golang
|
|||||||
RUN rm -rf ${GOROOT} \
|
RUN rm -rf ${GOROOT} \
|
||||||
&& curl -s ${GO_DOWNLOAD_URL}/go${GO_VERSION}.linux-amd64.tar.gz | tar -v -C /usr/local/ -xz \
|
&& curl -s ${GO_DOWNLOAD_URL}/go${GO_VERSION}.linux-amd64.tar.gz | tar -v -C /usr/local/ -xz \
|
||||||
&& mkdir -p ${GOPATH}/src ${GOPATH}/bin \
|
&& mkdir -p ${GOPATH}/src ${GOPATH}/bin \
|
||||||
&& go version
|
&& go version \
|
||||||
|
&& go get -v -u github.com/mattn/goreman
|
||||||
|
|
||||||
RUN mkdir -p /var/bind /etc/bind
|
RUN mkdir -p /var/bind /etc/bind
|
||||||
RUN chown root:bind /var/bind /etc/bind
|
RUN chown root:bind /var/bind /etc/bind
|
||||||
ADD Procfile /Procfile
|
|
||||||
ADD run.sh /run.sh
|
|
||||||
|
|
||||||
ADD named.conf etcd.zone rdns.zone /etc/bind/
|
ADD named.conf etcd.zone rdns.zone /etc/bind/
|
||||||
RUN chown root:bind /etc/bind/named.conf /etc/bind/etcd.zone /etc/bind/rdns.zone
|
RUN chown root:bind /etc/bind/named.conf /etc/bind/etcd.zone /etc/bind/rdns.zone
|
||||||
ADD resolv.conf /etc/resolv.conf
|
ADD resolv.conf /etc/resolv.conf
|
||||||
|
|
||||||
RUN go get github.com/mattn/goreman
|
|
||||||
CMD ["/run.sh"]
|
|
||||||
|
@@ -1,5 +0,0 @@
|
|||||||
etcd1: ./etcd --name m1 --listen-client-urls https://127.0.0.1:2379 --advertise-client-urls https://m1.etcd.local:2379 --listen-peer-urls https://127.0.0.1:2380 --initial-advertise-peer-urls=https://m1.etcd.local:2380 --initial-cluster-token tkn --discovery-srv=etcd.local --initial-cluster-state new --peer-cert-file=/certs/server-wildcard.crt --peer-key-file=/certs/server-wildcard.key.insecure --peer-trusted-ca-file=/certs/ca.crt --peer-client-cert-auth --cert-file=/certs/server-wildcard.crt --key-file=/certs/server-wildcard.key.insecure --trusted-ca-file=/certs/ca.crt --client-cert-auth
|
|
||||||
|
|
||||||
etcd2: ./etcd --name m2 --listen-client-urls https://127.0.0.1:22379 --advertise-client-urls https://m2.etcd.local:22379 --listen-peer-urls https://127.0.0.1:22380 --initial-advertise-peer-urls=https://m2.etcd.local:22380 --initial-cluster-token tkn --discovery-srv=etcd.local --initial-cluster-state new --peer-cert-file=/certs/server-wildcard.crt --peer-key-file=/certs/server-wildcard.key.insecure --peer-trusted-ca-file=/certs/ca.crt --peer-client-cert-auth --cert-file=/certs/server-wildcard.crt --key-file=/certs/server-wildcard.key.insecure --trusted-ca-file=/certs/ca.crt --client-cert-auth
|
|
||||||
|
|
||||||
etcd3: ./etcd --name m3 --listen-client-urls https://127.0.0.1:32379 --advertise-client-urls https://m3.etcd.local:32379 --listen-peer-urls https://127.0.0.1:32380 --initial-advertise-peer-urls=https://m3.etcd.local:32380 --initial-cluster-token tkn --discovery-srv=etcd.local --initial-cluster-state new --peer-cert-file=/certs/server-wildcard.crt --peer-key-file=/certs/server-wildcard.key.insecure --peer-trusted-ca-file=/certs/ca.crt --peer-client-cert-auth --cert-file=/certs/server-wildcard.crt --key-file=/certs/server-wildcard.key.insecure --trusted-ca-file=/certs/ca.crt --client-cert-auth
|
|
7
hack/scripts-dev/docker-dns-srv/certs-gateway/Procfile
Normal file
7
hack/scripts-dev/docker-dns-srv/certs-gateway/Procfile
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
etcd1: ./etcd --name m1 --data-dir /tmp/m1.data --listen-client-urls https://127.0.0.1:2379 --advertise-client-urls https://m1.etcd.local:2379 --listen-peer-urls https://127.0.0.1:2380 --initial-advertise-peer-urls=https://m1.etcd.local:2380 --initial-cluster-token tkn --discovery-srv=etcd.local --initial-cluster-state new --peer-cert-file=/certs-gateway/server.crt --peer-key-file=/certs-gateway/server.key.insecure --peer-trusted-ca-file=/certs-gateway/ca.crt --peer-client-cert-auth --cert-file=/certs-gateway/server.crt --key-file=/certs-gateway/server.key.insecure --trusted-ca-file=/certs-gateway/ca.crt --client-cert-auth
|
||||||
|
|
||||||
|
etcd2: ./etcd --name m2 --data-dir /tmp/m2.data --listen-client-urls https://127.0.0.1:22379 --advertise-client-urls https://m2.etcd.local:22379 --listen-peer-urls https://127.0.0.1:22380 --initial-advertise-peer-urls=https://m2.etcd.local:22380 --initial-cluster-token tkn --discovery-srv=etcd.local --initial-cluster-state new --peer-cert-file=/certs-gateway/server.crt --peer-key-file=/certs-gateway/server.key.insecure --peer-trusted-ca-file=/certs-gateway/ca.crt --peer-client-cert-auth --cert-file=/certs-gateway/server.crt --key-file=/certs-gateway/server.key.insecure --trusted-ca-file=/certs-gateway/ca.crt --client-cert-auth
|
||||||
|
|
||||||
|
etcd3: ./etcd --name m3 --data-dir /tmp/m3.data --listen-client-urls https://127.0.0.1:32379 --advertise-client-urls https://m3.etcd.local:32379 --listen-peer-urls https://127.0.0.1:32380 --initial-advertise-peer-urls=https://m3.etcd.local:32380 --initial-cluster-token tkn --discovery-srv=etcd.local --initial-cluster-state new --peer-cert-file=/certs-gateway/server.crt --peer-key-file=/certs-gateway/server.key.insecure --peer-trusted-ca-file=/certs-gateway/ca.crt --peer-client-cert-auth --cert-file=/certs-gateway/server.crt --key-file=/certs-gateway/server.key.insecure --trusted-ca-file=/certs-gateway/ca.crt --client-cert-auth
|
||||||
|
|
||||||
|
gateway: ./etcd gateway start --discovery-srv etcd.local --trusted-ca-file /certs-gateway/ca.crt --listen-addr 127.0.0.1:23790
|
19
hack/scripts-dev/docker-dns-srv/certs-gateway/ca-csr.json
Normal file
19
hack/scripts-dev/docker-dns-srv/certs-gateway/ca-csr.json
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
{
|
||||||
|
"key": {
|
||||||
|
"algo": "rsa",
|
||||||
|
"size": 2048
|
||||||
|
},
|
||||||
|
"names": [
|
||||||
|
{
|
||||||
|
"O": "etcd",
|
||||||
|
"OU": "etcd Security",
|
||||||
|
"L": "San Francisco",
|
||||||
|
"ST": "California",
|
||||||
|
"C": "USA"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"CN": "ca",
|
||||||
|
"ca": {
|
||||||
|
"expiry": "87600h"
|
||||||
|
}
|
||||||
|
}
|
22
hack/scripts-dev/docker-dns-srv/certs-gateway/ca.crt
Normal file
22
hack/scripts-dev/docker-dns-srv/certs-gateway/ca.crt
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
-----BEGIN CERTIFICATE-----
|
||||||
|
MIIDsTCCApmgAwIBAgIUbQA3lX1hcR1W8D5wmmAwaLp4AWQwDQYJKoZIhvcNAQEL
|
||||||
|
BQAwbzEMMAoGA1UEBhMDVVNBMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQH
|
||||||
|
Ew1TYW4gRnJhbmNpc2NvMQ0wCwYDVQQKEwRldGNkMRYwFAYDVQQLEw1ldGNkIFNl
|
||||||
|
Y3VyaXR5MQswCQYDVQQDEwJjYTAeFw0xNzEyMDExOTI5MDBaFw0yNzExMjkxOTI5
|
||||||
|
MDBaMG8xDDAKBgNVBAYTA1VTQTETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UE
|
||||||
|
BxMNU2FuIEZyYW5jaXNjbzENMAsGA1UEChMEZXRjZDEWMBQGA1UECxMNZXRjZCBT
|
||||||
|
ZWN1cml0eTELMAkGA1UEAxMCY2EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK
|
||||||
|
AoIBAQDdZjG+dJixdUuZLIlPVE/qvqNqbgIQy3Hrgq9OlPevLu3FAKIgTHoSKugq
|
||||||
|
jOuBjzAtmbGTky3PPmkjWrOUWKEUYMuJJzXA1fO2NALXle47NVyVVfuwCmDnaAAL
|
||||||
|
Sw4QTZKREoe3EwswbeYguQinCqazRwbXMzzfypIfaHAyGrqFCq12IvarrjfDcamm
|
||||||
|
egtPkxNNdj1QHbkeYXcp76LOSBRjD2B3bzZvyVv/wPORaGTFXQ0feGz/93/Y/E0z
|
||||||
|
BL5TdZ84qmgKxW04hxkhhuuxsL5zDNpbXcGm//Zw9qzO/AvtEux6ag9t0JziiEtj
|
||||||
|
zLz5M7yXivfG4oxEeLKTieS/1ZkbAgMBAAGjRTBDMA4GA1UdDwEB/wQEAwIBBjAS
|
||||||
|
BgNVHRMBAf8ECDAGAQH/AgECMB0GA1UdDgQWBBR7XtZP3fc6ElgHl6hdSHLmrFWj
|
||||||
|
MzANBgkqhkiG9w0BAQsFAAOCAQEAPy3ol3CPyFxuWD0IGKde26p1mT8cdoaeRbOa
|
||||||
|
2Z3GMuRrY2ojaKMfXuroOi+5ZbR9RSvVXhVX5tEMOSy81tb5OGPZP24Eroh4CUfK
|
||||||
|
bw7dOeBNCm9tcmHkV+5frJwOgjN2ja8W8jBlV1flLx+Jpyk2PSGun5tQPsDlqzor
|
||||||
|
E8QQ2FzCzxoGiEpB53t5gKeX+mH6gS1c5igJ5WfsEGXBC4xJm/u8/sg30uCGP6kT
|
||||||
|
tCoQ8gnvGen2OqYJEfCIEk28/AZJvJ90TJFS3ExXJpyfImK9j5VcTohW+KvcX5xF
|
||||||
|
W7M6KCGVBQtophobt3v/Zs4f11lWck9xVFCPGn9+LI1dbJUIIQ==
|
||||||
|
-----END CERTIFICATE-----
|
13
hack/scripts-dev/docker-dns-srv/certs-gateway/gencert.json
Normal file
13
hack/scripts-dev/docker-dns-srv/certs-gateway/gencert.json
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
{
|
||||||
|
"signing": {
|
||||||
|
"default": {
|
||||||
|
"usages": [
|
||||||
|
"signing",
|
||||||
|
"key encipherment",
|
||||||
|
"server auth",
|
||||||
|
"client auth"
|
||||||
|
],
|
||||||
|
"expiry": "87600h"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
26
hack/scripts-dev/docker-dns-srv/certs-gateway/gencerts.sh
Executable file
26
hack/scripts-dev/docker-dns-srv/certs-gateway/gencerts.sh
Executable file
@@ -0,0 +1,26 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
if ! [[ "$0" =~ "./gencerts.sh" ]]; then
|
||||||
|
echo "must be run from 'fixtures'"
|
||||||
|
exit 255
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ! which cfssl; then
|
||||||
|
echo "cfssl is not installed"
|
||||||
|
exit 255
|
||||||
|
fi
|
||||||
|
|
||||||
|
cfssl gencert --initca=true ./ca-csr.json | cfssljson --bare ./ca
|
||||||
|
mv ca.pem ca.crt
|
||||||
|
openssl x509 -in ca.crt -noout -text
|
||||||
|
|
||||||
|
# generate wildcard certificates DNS: *.etcd.local
|
||||||
|
cfssl gencert \
|
||||||
|
--ca ./ca.crt \
|
||||||
|
--ca-key ./ca-key.pem \
|
||||||
|
--config ./gencert.json \
|
||||||
|
./server-ca-csr.json | cfssljson --bare ./server
|
||||||
|
mv server.pem server.crt
|
||||||
|
mv server-key.pem server.key.insecure
|
||||||
|
|
||||||
|
rm -f *.csr *.pem *.stderr *.txt
|
47
hack/scripts-dev/docker-dns-srv/certs-gateway/run.sh
Executable file
47
hack/scripts-dev/docker-dns-srv/certs-gateway/run.sh
Executable file
@@ -0,0 +1,47 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
rm -rf /tmp/m1.data /tmp/m2.data /tmp/m3.data
|
||||||
|
|
||||||
|
/etc/init.d/bind9 start
|
||||||
|
|
||||||
|
# get rid of hosts so go lookup won't resolve 127.0.0.1 to localhost
|
||||||
|
cat /dev/null >/etc/hosts
|
||||||
|
|
||||||
|
goreman -f /certs-gateway/Procfile start &
|
||||||
|
|
||||||
|
# TODO: remove random sleeps
|
||||||
|
sleep 7s
|
||||||
|
|
||||||
|
ETCDCTL_API=3 ./etcdctl \
|
||||||
|
--cacert=/certs-gateway/ca.crt \
|
||||||
|
--cert=/certs-gateway/server.crt \
|
||||||
|
--key=/certs-gateway/server.key.insecure \
|
||||||
|
--discovery-srv etcd.local \
|
||||||
|
endpoint health --cluster
|
||||||
|
|
||||||
|
ETCDCTL_API=3 ./etcdctl \
|
||||||
|
--cacert=/certs-gateway/ca.crt \
|
||||||
|
--cert=/certs-gateway/server.crt \
|
||||||
|
--key=/certs-gateway/server.key.insecure \
|
||||||
|
--discovery-srv etcd.local \
|
||||||
|
put abc def
|
||||||
|
|
||||||
|
ETCDCTL_API=3 ./etcdctl \
|
||||||
|
--cacert=/certs-gateway/ca.crt \
|
||||||
|
--cert=/certs-gateway/server.crt \
|
||||||
|
--key=/certs-gateway/server.key.insecure \
|
||||||
|
--discovery-srv etcd.local \
|
||||||
|
get abc
|
||||||
|
|
||||||
|
ETCDCTL_API=3 ./etcdctl \
|
||||||
|
--cacert=/certs-gateway/ca.crt \
|
||||||
|
--cert=/certs-gateway/server.crt \
|
||||||
|
--key=/certs-gateway/server.key.insecure \
|
||||||
|
--endpoints=127.0.0.1:23790 \
|
||||||
|
put ghi jkl
|
||||||
|
|
||||||
|
ETCDCTL_API=3 ./etcdctl \
|
||||||
|
--cacert=/certs-gateway/ca.crt \
|
||||||
|
--cert=/certs-gateway/server.crt \
|
||||||
|
--key=/certs-gateway/server.key.insecure \
|
||||||
|
--endpoints=127.0.0.1:23790 \
|
||||||
|
get ghi
|
@@ -0,0 +1,23 @@
|
|||||||
|
{
|
||||||
|
"key": {
|
||||||
|
"algo": "rsa",
|
||||||
|
"size": 2048
|
||||||
|
},
|
||||||
|
"names": [
|
||||||
|
{
|
||||||
|
"O": "etcd",
|
||||||
|
"OU": "etcd Security",
|
||||||
|
"L": "San Francisco",
|
||||||
|
"ST": "California",
|
||||||
|
"C": "USA"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"hosts": [
|
||||||
|
"m1.etcd.local",
|
||||||
|
"m2.etcd.local",
|
||||||
|
"m3.etcd.local",
|
||||||
|
"etcd.local",
|
||||||
|
"127.0.0.1",
|
||||||
|
"localhost"
|
||||||
|
]
|
||||||
|
}
|
25
hack/scripts-dev/docker-dns-srv/certs-gateway/server.crt
Normal file
25
hack/scripts-dev/docker-dns-srv/certs-gateway/server.crt
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
-----BEGIN CERTIFICATE-----
|
||||||
|
MIIENTCCAx2gAwIBAgIUcviGEkA57QgUUFUIuB23kO/jHWIwDQYJKoZIhvcNAQEL
|
||||||
|
BQAwbzEMMAoGA1UEBhMDVVNBMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQH
|
||||||
|
Ew1TYW4gRnJhbmNpc2NvMQ0wCwYDVQQKEwRldGNkMRYwFAYDVQQLEw1ldGNkIFNl
|
||||||
|
Y3VyaXR5MQswCQYDVQQDEwJjYTAeFw0xNzEyMDExOTI5MDBaFw0yNzExMjkxOTI5
|
||||||
|
MDBaMGIxDDAKBgNVBAYTA1VTQTETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UE
|
||||||
|
BxMNU2FuIEZyYW5jaXNjbzENMAsGA1UEChMEZXRjZDEWMBQGA1UECxMNZXRjZCBT
|
||||||
|
ZWN1cml0eTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL6rB1Kh08Fo
|
||||||
|
FieWqzB4WvKxSFjLWlNfAXbSC1IEPEc/2JOSTF/VfsEX7Xf4eDlTUIZ/TpMS4nUE
|
||||||
|
Jn0rOIxDJWieQgF99a88CKCwVeqyiQ1iGlI/Ls78P7712QJ1QvcYPBRCvAFo2VLg
|
||||||
|
TSNhq4taRtAnP690TJVKMSxHg7qtMIpiBLc8ryNbtNUkQHl7/puiBZVVFwHQZm6d
|
||||||
|
ZRkfMqXWs4+VKLTx0pqJaM0oWVISQlLWQV83buVsuDVyLAZu2MjRYZwBj9gQwZDO
|
||||||
|
15VGvacjMU+l1+nLRuODrpGeGlxwfT57jqipbUtTsoZFsGxPdIWn14M6Pzw/mML4
|
||||||
|
guYLKv3UqkkCAwEAAaOB1TCB0jAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYI
|
||||||
|
KwYBBQUHAwEGCCsGAQUFBwMCMAwGA1UdEwEB/wQCMAAwHQYDVR0OBBYEFKYKYVPu
|
||||||
|
XPnZ2j0NORiNPUJpBnhkMB8GA1UdIwQYMBaAFHte1k/d9zoSWAeXqF1IcuasVaMz
|
||||||
|
MFMGA1UdEQRMMEqCDW0xLmV0Y2QubG9jYWyCDW0yLmV0Y2QubG9jYWyCDW0zLmV0
|
||||||
|
Y2QubG9jYWyCCmV0Y2QubG9jYWyCCWxvY2FsaG9zdIcEfwAAATANBgkqhkiG9w0B
|
||||||
|
AQsFAAOCAQEAK40lD6Nx/V6CaShL95fQal7mFp/LXiyrlFTqCqrCruVnntwpukSx
|
||||||
|
I864bNMxVSTStEA3NM5V4mGuYjRvdjS65LBhaS1MQDPb4ofPj0vnxDOx6fryRIsB
|
||||||
|
wYKDuT4LSQ7pV/hBfL/bPb+itvb24G4/ECbduOprrywxmZskeEm/m0WqUb1A08Hv
|
||||||
|
6vDleyt382Wnxahq8txhMU+gNLTGVne60hhfLR+ePK7MJ4oyk3yeUxsmsnBkYaOu
|
||||||
|
gYOak5nWzRa09dLq6/vHQLt6n0AB0VurMAjshzO2rsbdOkD233sdkvKiYpayAyEf
|
||||||
|
Iu7S5vNjP9jiUgmws6G95wgJOd2xv54D4Q==
|
||||||
|
-----END CERTIFICATE-----
|
@@ -0,0 +1,27 @@
|
|||||||
|
-----BEGIN RSA PRIVATE KEY-----
|
||||||
|
MIIEowIBAAKCAQEAvqsHUqHTwWgWJ5arMHha8rFIWMtaU18BdtILUgQ8Rz/Yk5JM
|
||||||
|
X9V+wRftd/h4OVNQhn9OkxLidQQmfSs4jEMlaJ5CAX31rzwIoLBV6rKJDWIaUj8u
|
||||||
|
zvw/vvXZAnVC9xg8FEK8AWjZUuBNI2Gri1pG0Cc/r3RMlUoxLEeDuq0wimIEtzyv
|
||||||
|
I1u01SRAeXv+m6IFlVUXAdBmbp1lGR8ypdazj5UotPHSmolozShZUhJCUtZBXzdu
|
||||||
|
5Wy4NXIsBm7YyNFhnAGP2BDBkM7XlUa9pyMxT6XX6ctG44OukZ4aXHB9PnuOqKlt
|
||||||
|
S1OyhkWwbE90hafXgzo/PD+YwviC5gsq/dSqSQIDAQABAoIBAEAOsb0fRUdbMuZG
|
||||||
|
BmmYZeXXjdjXKReNea5zzv3VEnNVjeu2YRZpYdZ5tXxy6+FGjm1BZCKhW5e4tz2i
|
||||||
|
QbNN88l8MezSZrJi1vs1gwgAx27JoNI1DALaWIhNjIT45HCjobuk2AkZMrpXRVM3
|
||||||
|
wyxkPho8tXa6+efGL1MTC7yx5vb2dbhnEsjrPdUO0GLVP56bgrz7vRk+hE772uq2
|
||||||
|
QDenZg+PcH+hOhptbY1h9CYotGWYXCpi0+yoHhsh5PTcEpyPmLWSkACsHovm3MIn
|
||||||
|
a5oU0uh28nVBfYE0Sk6I9XBERHVO/OrCvz4Y3ZbVyGpCdLcaMB5wI1P4a5ULV52+
|
||||||
|
VPrALQkCgYEA+w85KYuL+eUjHeMqa8V8A9xgcl1+dvB8SXgfRRm5QTqxgetzurD9
|
||||||
|
G7vgMex42nqgoW1XUx6i9roRk3Qn3D2NKvBJcpMohYcY3HcGkCsBwtNUCyOWKasS
|
||||||
|
Oj2q9LzPjVqTFII0zzarQ85XuuZyTRieFAMoYmsS8O/GcapKqYhPIDMCgYEAwmuR
|
||||||
|
ctnCNgoEj1NaLBSAcq7njONvYUFvbXO8BCyd1WeLZyz/krgXxuhQh9oXIccWAKX2
|
||||||
|
uxIDaoWV8F5c8bNOkeebHzVHfaLpwl4IlLa/i5WTIc+IZmpBR0aiS021k/M3KkDg
|
||||||
|
KnQXAer6jEymT3lUL0AqZd+GX6DjFw61zPOFH5MCgYAnCiv6YN/IYTA/woZjMddi
|
||||||
|
Bk/dGNrEhgrdpdc++IwNL6JQsJtTaZhCSsnHGZ2FY9I8p/MPUtFGipKXGlXkcpHU
|
||||||
|
Hn9dWLLRaLud9MhJfNaORCxqewMrwZVZByPhYMbplS8P3lt16WtiZODRiGo3wN87
|
||||||
|
/221OC8+1hpGrJNln3OmbwKBgDV8voEoY4PWcba0qcQix8vFTrK2B3hsNimYg4tq
|
||||||
|
cum5GOMDwDQvLWttkmotl9uVF/qJrj19ES+HHN8KNuvP9rexTj3hvI9V+JWepSG0
|
||||||
|
vTG7rsTIgbAbX2Yqio/JC0Fu0ihvvLwxP/spGFDs7XxD1uNA9ekc+6znaFJ5m46N
|
||||||
|
GHy9AoGBAJmGEv5+rM3cucRyYYhE7vumXeCLXyAxxaf0f7+1mqRVO6uNGNGbNY6U
|
||||||
|
Heq6De4yc1VeAXUpkGQi/afPJNMU+fy8paCjFyzID1yLvdtFOG38KDbgMmj4t+cH
|
||||||
|
xTp2RT3MkcCWPq2+kXZeQjPdesPkzdB+nA8ckaSursV908n6AHcM
|
||||||
|
-----END RSA PRIVATE KEY-----
|
5
hack/scripts-dev/docker-dns-srv/certs-wildcard/Procfile
Normal file
5
hack/scripts-dev/docker-dns-srv/certs-wildcard/Procfile
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
etcd1: ./etcd --name m1 --data-dir /tmp/m1.data --listen-client-urls https://127.0.0.1:2379 --advertise-client-urls https://m1.etcd.local:2379 --listen-peer-urls https://127.0.0.1:2380 --initial-advertise-peer-urls=https://m1.etcd.local:2380 --initial-cluster-token tkn --discovery-srv=etcd.local --initial-cluster-state new --peer-cert-file=/certs-wildcard/server.crt --peer-key-file=/certs-wildcard/server.key.insecure --peer-trusted-ca-file=/certs-wildcard/ca.crt --peer-client-cert-auth --cert-file=/certs-wildcard/server.crt --key-file=/certs-wildcard/server.key.insecure --trusted-ca-file=/certs-wildcard/ca.crt --client-cert-auth
|
||||||
|
|
||||||
|
etcd2: ./etcd --name m2 --data-dir /tmp/m2.data --listen-client-urls https://127.0.0.1:22379 --advertise-client-urls https://m2.etcd.local:22379 --listen-peer-urls https://127.0.0.1:22380 --initial-advertise-peer-urls=https://m2.etcd.local:22380 --initial-cluster-token tkn --discovery-srv=etcd.local --initial-cluster-state new --peer-cert-file=/certs-wildcard/server.crt --peer-key-file=/certs-wildcard/server.key.insecure --peer-trusted-ca-file=/certs-wildcard/ca.crt --peer-client-cert-auth --cert-file=/certs-wildcard/server.crt --key-file=/certs-wildcard/server.key.insecure --trusted-ca-file=/certs-wildcard/ca.crt --client-cert-auth
|
||||||
|
|
||||||
|
etcd3: ./etcd --name m3 --data-dir /tmp/m3.data --listen-client-urls https://127.0.0.1:32379 --advertise-client-urls https://m3.etcd.local:32379 --listen-peer-urls https://127.0.0.1:32380 --initial-advertise-peer-urls=https://m3.etcd.local:32380 --initial-cluster-token tkn --discovery-srv=etcd.local --initial-cluster-state new --peer-cert-file=/certs-wildcard/server.crt --peer-key-file=/certs-wildcard/server.key.insecure --peer-trusted-ca-file=/certs-wildcard/ca.crt --peer-client-cert-auth --cert-file=/certs-wildcard/server.crt --key-file=/certs-wildcard/server.key.insecure --trusted-ca-file=/certs-wildcard/ca.crt --client-cert-auth
|
19
hack/scripts-dev/docker-dns-srv/certs-wildcard/ca-csr.json
Normal file
19
hack/scripts-dev/docker-dns-srv/certs-wildcard/ca-csr.json
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
{
|
||||||
|
"key": {
|
||||||
|
"algo": "rsa",
|
||||||
|
"size": 2048
|
||||||
|
},
|
||||||
|
"names": [
|
||||||
|
{
|
||||||
|
"O": "etcd",
|
||||||
|
"OU": "etcd Security",
|
||||||
|
"L": "San Francisco",
|
||||||
|
"ST": "California",
|
||||||
|
"C": "USA"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"CN": "ca",
|
||||||
|
"ca": {
|
||||||
|
"expiry": "87600h"
|
||||||
|
}
|
||||||
|
}
|
22
hack/scripts-dev/docker-dns-srv/certs-wildcard/ca.crt
Normal file
22
hack/scripts-dev/docker-dns-srv/certs-wildcard/ca.crt
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
-----BEGIN CERTIFICATE-----
|
||||||
|
MIIDsTCCApmgAwIBAgIUWzsBehxAkgLLYBUZEUpSjHkIaMowDQYJKoZIhvcNAQEL
|
||||||
|
BQAwbzEMMAoGA1UEBhMDVVNBMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQH
|
||||||
|
Ew1TYW4gRnJhbmNpc2NvMQ0wCwYDVQQKEwRldGNkMRYwFAYDVQQLEw1ldGNkIFNl
|
||||||
|
Y3VyaXR5MQswCQYDVQQDEwJjYTAeFw0xNzExMTUxODAyMDBaFw0yNzExMTMxODAy
|
||||||
|
MDBaMG8xDDAKBgNVBAYTA1VTQTETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UE
|
||||||
|
BxMNU2FuIEZyYW5jaXNjbzENMAsGA1UEChMEZXRjZDEWMBQGA1UECxMNZXRjZCBT
|
||||||
|
ZWN1cml0eTELMAkGA1UEAxMCY2EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK
|
||||||
|
AoIBAQCxjHVNtcCSCz1w9AiN7zAql0ZsPN6MNQWJ2j3iPCvmy9oi0wqSfYXTs+xw
|
||||||
|
Y4Q+j0dfA54+PcyIOSBQCZBeLLIwCaXN+gLkMxYEWCCVgWYUa6UY+NzPKRCfkbwG
|
||||||
|
oE2Ilv3R1FWIpMqDVE2rLmTb3YxSiw460Ruv4l16kodEzfs4BRcqrEiobBwaIMLd
|
||||||
|
0rDJju7Q2TcioNji+HFoXV2aLN58LDgKO9AqszXxW88IKwUspfGBcsA4Zti/OHr+
|
||||||
|
W+i/VxsxnQSJiAoKYbv9SkS8fUWw2hQ9SBBCKqE3jLzI71HzKgjS5TiQVZJaD6oK
|
||||||
|
cw8FjexOELZd4r1+/p+nQdKqwnb5AgMBAAGjRTBDMA4GA1UdDwEB/wQEAwIBBjAS
|
||||||
|
BgNVHRMBAf8ECDAGAQH/AgECMB0GA1UdDgQWBBRLfPxmhlZix1eTdBMAzMVlAnOV
|
||||||
|
gTANBgkqhkiG9w0BAQsFAAOCAQEAeT2NfOt3WsBLUVcnyGMeVRQ0gXazxJXD/Z+3
|
||||||
|
2RF3KClqBLuGmPUZVl0FU841J6hLlwNjS33mye7k2OHrjJcouElbV3Olxsgh/EV0
|
||||||
|
J7b7Wf4zWYHFNZz/VxwGHunsEZ+SCXUzU8OiMrEcHkOVzhtbC2veVPJzrESqd88z
|
||||||
|
m1MseGW636VIcrg4fYRS9EebRPFvlwfymMd+bqLky9KsUbjNupYd/TlhpAudrIzA
|
||||||
|
wO9ZUDb/0P44iOo+xURCoodxDTM0vvfZ8eJ6VZ/17HIf/a71kvk1oMqEhf060nmF
|
||||||
|
IxnbK6iUqqhV8DLE1869vpFvgbDdOxP7BeabN5FXEnZFDTLDqg==
|
||||||
|
-----END CERTIFICATE-----
|
13
hack/scripts-dev/docker-dns-srv/certs-wildcard/gencert.json
Normal file
13
hack/scripts-dev/docker-dns-srv/certs-wildcard/gencert.json
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
{
|
||||||
|
"signing": {
|
||||||
|
"default": {
|
||||||
|
"usages": [
|
||||||
|
"signing",
|
||||||
|
"key encipherment",
|
||||||
|
"server auth",
|
||||||
|
"client auth"
|
||||||
|
],
|
||||||
|
"expiry": "87600h"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
26
hack/scripts-dev/docker-dns-srv/certs-wildcard/gencerts.sh
Executable file
26
hack/scripts-dev/docker-dns-srv/certs-wildcard/gencerts.sh
Executable file
@@ -0,0 +1,26 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
if ! [[ "$0" =~ "./gencerts.sh" ]]; then
|
||||||
|
echo "must be run from 'fixtures'"
|
||||||
|
exit 255
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ! which cfssl; then
|
||||||
|
echo "cfssl is not installed"
|
||||||
|
exit 255
|
||||||
|
fi
|
||||||
|
|
||||||
|
cfssl gencert --initca=true ./ca-csr.json | cfssljson --bare ./ca
|
||||||
|
mv ca.pem ca.crt
|
||||||
|
openssl x509 -in ca.crt -noout -text
|
||||||
|
|
||||||
|
# generate wildcard certificates DNS: *.etcd.local
|
||||||
|
cfssl gencert \
|
||||||
|
--ca ./ca.crt \
|
||||||
|
--ca-key ./ca-key.pem \
|
||||||
|
--config ./gencert.json \
|
||||||
|
./server-ca-csr.json | cfssljson --bare ./server
|
||||||
|
mv server.pem server.crt
|
||||||
|
mv server-key.pem server.key.insecure
|
||||||
|
|
||||||
|
rm -f *.csr *.pem *.stderr *.txt
|
33
hack/scripts-dev/docker-dns-srv/certs-wildcard/run.sh
Executable file
33
hack/scripts-dev/docker-dns-srv/certs-wildcard/run.sh
Executable file
@@ -0,0 +1,33 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
rm -rf /tmp/m1.data /tmp/m2.data /tmp/m3.data
|
||||||
|
|
||||||
|
/etc/init.d/bind9 start
|
||||||
|
|
||||||
|
# get rid of hosts so go lookup won't resolve 127.0.0.1 to localhost
|
||||||
|
cat /dev/null >/etc/hosts
|
||||||
|
|
||||||
|
goreman -f /certs-wildcard/Procfile start &
|
||||||
|
|
||||||
|
# TODO: remove random sleeps
|
||||||
|
sleep 7s
|
||||||
|
|
||||||
|
ETCDCTL_API=3 ./etcdctl \
|
||||||
|
--cacert=/certs-wildcard/ca.crt \
|
||||||
|
--cert=/certs-wildcard/server.crt \
|
||||||
|
--key=/certs-wildcard/server.key.insecure \
|
||||||
|
--discovery-srv etcd.local \
|
||||||
|
endpoint health --cluster
|
||||||
|
|
||||||
|
ETCDCTL_API=3 ./etcdctl \
|
||||||
|
--cacert=/certs-wildcard/ca.crt \
|
||||||
|
--cert=/certs-wildcard/server.crt \
|
||||||
|
--key=/certs-wildcard/server.key.insecure \
|
||||||
|
--discovery-srv etcd.local \
|
||||||
|
put abc def
|
||||||
|
|
||||||
|
ETCDCTL_API=3 ./etcdctl \
|
||||||
|
--cacert=/certs-wildcard/ca.crt \
|
||||||
|
--cert=/certs-wildcard/server.crt \
|
||||||
|
--key=/certs-wildcard/server.key.insecure \
|
||||||
|
--discovery-srv etcd.local \
|
||||||
|
get abc
|
@@ -0,0 +1,21 @@
|
|||||||
|
{
|
||||||
|
"key": {
|
||||||
|
"algo": "rsa",
|
||||||
|
"size": 2048
|
||||||
|
},
|
||||||
|
"names": [
|
||||||
|
{
|
||||||
|
"O": "etcd",
|
||||||
|
"OU": "etcd Security",
|
||||||
|
"L": "San Francisco",
|
||||||
|
"ST": "California",
|
||||||
|
"C": "USA"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"hosts": [
|
||||||
|
"*.etcd.local",
|
||||||
|
"etcd.local",
|
||||||
|
"127.0.0.1",
|
||||||
|
"localhost"
|
||||||
|
]
|
||||||
|
}
|
24
hack/scripts-dev/docker-dns-srv/certs-wildcard/server.crt
Normal file
24
hack/scripts-dev/docker-dns-srv/certs-wildcard/server.crt
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
-----BEGIN CERTIFICATE-----
|
||||||
|
MIIEFjCCAv6gAwIBAgIUCIUuNuEPRjp/EeDBNHipRI/qoAcwDQYJKoZIhvcNAQEL
|
||||||
|
BQAwbzEMMAoGA1UEBhMDVVNBMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQH
|
||||||
|
Ew1TYW4gRnJhbmNpc2NvMQ0wCwYDVQQKEwRldGNkMRYwFAYDVQQLEw1ldGNkIFNl
|
||||||
|
Y3VyaXR5MQswCQYDVQQDEwJjYTAeFw0xNzExMTUxODAyMDBaFw0yNzExMTMxODAy
|
||||||
|
MDBaMGIxDDAKBgNVBAYTA1VTQTETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UE
|
||||||
|
BxMNU2FuIEZyYW5jaXNjbzENMAsGA1UEChMEZXRjZDEWMBQGA1UECxMNZXRjZCBT
|
||||||
|
ZWN1cml0eTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMzoOebyKdXF
|
||||||
|
5QiVs0mB3cVqMRgRoRGWt9emIOsYCX89SBaRNOIAByop98Vb1GmUDNDv1qR4Oq+m
|
||||||
|
4JlWhgZniABWpekFw8mpN8wMIT86DoNnTe64ouLkDQRZDYOBO9I2+r4EuschRxNs
|
||||||
|
+Hh5W9JzX/eOomnOhaZfTp6EaxczRHnVmgkWuFUnacfUf7W2FE/HAYfjYpvXw5/+
|
||||||
|
eT9AW+Jg/b9SkyU9XKEpWZT7NMqF9OXDXYdxHtRNTGxasLEqPZnG58mqR2QFU2me
|
||||||
|
/motY24faZpHo8i9ASb03Vy6xee2/FlS6cj2POCGQx3oLZsiQdgIOva7JrQtRsCn
|
||||||
|
e5P0Wk4qk+cCAwEAAaOBtjCBszAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYI
|
||||||
|
KwYBBQUHAwEGCCsGAQUFBwMCMAwGA1UdEwEB/wQCMAAwHQYDVR0OBBYEFCI+fP2T
|
||||||
|
xgvJG68Xdgamg4lzGRX1MB8GA1UdIwQYMBaAFEt8/GaGVmLHV5N0EwDMxWUCc5WB
|
||||||
|
MDQGA1UdEQQtMCuCDCouZXRjZC5sb2NhbIIKZXRjZC5sb2NhbIIJbG9jYWxob3N0
|
||||||
|
hwR/AAABMA0GCSqGSIb3DQEBCwUAA4IBAQASub3+YZAXJ8x8b55Hl7FkkIt+rML1
|
||||||
|
LdgPHsolNntNXeSqVJ4oi4KvuaM0ueFf/+AlTusTAbXWbi/qiG5Tw24xyzY6NGgV
|
||||||
|
/vCs56YqNlFyr3bNp1QJlnV3JQ4d3KqosulJ5jk+InhjAKJKomMH01pYhhStRAKg
|
||||||
|
1fNwSyD34oyZpSQL0Z7X7wdaMGdOmzxwE99EG6jmYl/P7MiP6rC0WP1elIF4sCGM
|
||||||
|
jY6oewvIMj0zWloBf/NlzrcY7VKpPqvBnV65Tllyo5n4y1sc8y2uzgJO/QnVKqhp
|
||||||
|
Sdd/74mU8dSh3ALSOqkbmIBhqig21jP7GBgNCNdmsaR2LvPI97n1PYE7
|
||||||
|
-----END CERTIFICATE-----
|
@@ -0,0 +1,27 @@
|
|||||||
|
-----BEGIN RSA PRIVATE KEY-----
|
||||||
|
MIIEowIBAAKCAQEAzOg55vIp1cXlCJWzSYHdxWoxGBGhEZa316Yg6xgJfz1IFpE0
|
||||||
|
4gAHKin3xVvUaZQM0O/WpHg6r6bgmVaGBmeIAFal6QXDyak3zAwhPzoOg2dN7rii
|
||||||
|
4uQNBFkNg4E70jb6vgS6xyFHE2z4eHlb0nNf946iac6Fpl9OnoRrFzNEedWaCRa4
|
||||||
|
VSdpx9R/tbYUT8cBh+Nim9fDn/55P0Bb4mD9v1KTJT1coSlZlPs0yoX05cNdh3Ee
|
||||||
|
1E1MbFqwsSo9mcbnyapHZAVTaZ7+ai1jbh9pmkejyL0BJvTdXLrF57b8WVLpyPY8
|
||||||
|
4IZDHegtmyJB2Ag69rsmtC1GwKd7k/RaTiqT5wIDAQABAoIBAF0nTfuCKCa5WtA2
|
||||||
|
TlWippGzHzKUASef32A4dEqsmNSxpW4tAV+lJ5yxi6S7hKui1Ni/0FLhHbzxHrZX
|
||||||
|
MYMD2j5dJfvz1Ph+55DqCstVt3dhpXpbkiGYD5rkaVJZlDqTKBbuy4LvzAI2zhbn
|
||||||
|
BSl9rik7PPbhHr1uIq3KAW2Arya7dlpPZiEX04Dg9xqZvxZkxt9IM25E+uzTWKSR
|
||||||
|
v5BRmijWiGJ6atujgmP7KcYtgBC5EDR9yZf2uK+hnsKEcH94TUkTnJriTcOCKVbb
|
||||||
|
isAuzsxStLpmyibfiLXD55aYjzr7KRVzQpoVXGJ4vJfs7lTxqxXBjUIsBJMPBcck
|
||||||
|
ATabIcECgYEA8C8JeKPmcA4KaGFSusF5OsXt4SM9jz5Kr7larA+ozuuR/z0m4pnx
|
||||||
|
AdjwQiGlhXaMtyziZ7Uwx+tmfnJDijpE/hUnkcAIKheDLXB/r1VpJdj/mqXtK49Y
|
||||||
|
mnOxV66TcWAmXav31TgmLVSj0SYLGEnvV4MPbgJroMg3VO7LnNbNL7cCgYEA2maB
|
||||||
|
Edbn4pJqUjVCZG68m0wQHmFZFOaoYZLeR3FgH+PQYIzUj96TP9XFpOwBmYAl2jiM
|
||||||
|
kQZ3Q6VQY37rwu0M+2BVFkQFnFbelH5jXbHDLdoeFDGCRnJkH2VG1kE/rPfzVsiz
|
||||||
|
NFDJD+17kPw3tTdHwDYGHwxyNuEoBQw3q6hfXVECgYBEUfzttiGMalIHkveHbBVh
|
||||||
|
5H9f9ThDkMKJ7b2fB+1KvrOO2QRAnO1zSxQ8m3mL10b7q+bS/TVdCNbkzPftT9nk
|
||||||
|
NHxG90rbPkjwGfoYE8GPJITApsYqB+J6PMKLYHtMWr9PEeWzXv9tEZBvo9SwGgfc
|
||||||
|
6sjuz/1xhMJIhIyilm9TTQKBgHRsYDGaVlK5qmPYcGQJhBFlItKPImW579jT6ho7
|
||||||
|
nfph/xr49/cZt3U4B/w6sz+YyJTjwEsvHzS4U3o2lod6xojaeYE9EaCdzllqZp3z
|
||||||
|
vRAcThyFp+TV5fm2i2R7s+4I33dL1fv1dLlA57YKPcgkh+M26Vxzzg7jR+oo8SRY
|
||||||
|
xT2BAoGBAKNR60zpSQZ2SuqEoWcj1Nf+KloZv2tZcnsHhqhiugbYhZOQVyTCNipa
|
||||||
|
Ib3/BGERCyI7oWMk0yTTQK4wg3+0EsxQX10hYJ5+rd4btWac7G/tjo2+BSaTnWSW
|
||||||
|
0vWM/nu33Pq0JHYIo0q0Jee0evTgizqH9UJ3wI5LG29LKwurXxPW
|
||||||
|
-----END RSA PRIVATE KEY-----
|
5
hack/scripts-dev/docker-dns-srv/certs/Procfile
Normal file
5
hack/scripts-dev/docker-dns-srv/certs/Procfile
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
etcd1: ./etcd --name m1 --data-dir /tmp/m1.data --listen-client-urls https://127.0.0.1:2379 --advertise-client-urls https://m1.etcd.local:2379 --listen-peer-urls https://127.0.0.1:2380 --initial-advertise-peer-urls=https://m1.etcd.local:2380 --initial-cluster-token tkn --discovery-srv=etcd.local --initial-cluster-state new --peer-cert-file=/certs/server.crt --peer-key-file=/certs/server.key.insecure --peer-trusted-ca-file=/certs/ca.crt --peer-client-cert-auth --cert-file=/certs/server.crt --key-file=/certs/server.key.insecure --trusted-ca-file=/certs/ca.crt --client-cert-auth
|
||||||
|
|
||||||
|
etcd2: ./etcd --name m2 --data-dir /tmp/m2.data --listen-client-urls https://127.0.0.1:22379 --advertise-client-urls https://m2.etcd.local:22379 --listen-peer-urls https://127.0.0.1:22380 --initial-advertise-peer-urls=https://m2.etcd.local:22380 --initial-cluster-token tkn --discovery-srv=etcd.local --initial-cluster-state new --peer-cert-file=/certs/server.crt --peer-key-file=/certs/server.key.insecure --peer-trusted-ca-file=/certs/ca.crt --peer-client-cert-auth --cert-file=/certs/server.crt --key-file=/certs/server.key.insecure --trusted-ca-file=/certs/ca.crt --client-cert-auth
|
||||||
|
|
||||||
|
etcd3: ./etcd --name m3 --data-dir /tmp/m3.data --listen-client-urls https://127.0.0.1:32379 --advertise-client-urls https://m3.etcd.local:32379 --listen-peer-urls https://127.0.0.1:32380 --initial-advertise-peer-urls=https://m3.etcd.local:32380 --initial-cluster-token tkn --discovery-srv=etcd.local --initial-cluster-state new --peer-cert-file=/certs/server.crt --peer-key-file=/certs/server.key.insecure --peer-trusted-ca-file=/certs/ca.crt --peer-client-cert-auth --cert-file=/certs/server.crt --key-file=/certs/server.key.insecure --trusted-ca-file=/certs/ca.crt --client-cert-auth
|
19
hack/scripts-dev/docker-dns-srv/certs/ca-csr.json
Normal file
19
hack/scripts-dev/docker-dns-srv/certs/ca-csr.json
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
{
|
||||||
|
"key": {
|
||||||
|
"algo": "rsa",
|
||||||
|
"size": 2048
|
||||||
|
},
|
||||||
|
"names": [
|
||||||
|
{
|
||||||
|
"O": "etcd",
|
||||||
|
"OU": "etcd Security",
|
||||||
|
"L": "San Francisco",
|
||||||
|
"ST": "California",
|
||||||
|
"C": "USA"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"CN": "ca",
|
||||||
|
"ca": {
|
||||||
|
"expiry": "87600h"
|
||||||
|
}
|
||||||
|
}
|
22
hack/scripts-dev/docker-dns-srv/certs/ca.crt
Normal file
22
hack/scripts-dev/docker-dns-srv/certs/ca.crt
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
-----BEGIN CERTIFICATE-----
|
||||||
|
MIIDsTCCApmgAwIBAgIUfPEaJnrBzeHM8echLjsPOsV1IzUwDQYJKoZIhvcNAQEL
|
||||||
|
BQAwbzEMMAoGA1UEBhMDVVNBMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQH
|
||||||
|
Ew1TYW4gRnJhbmNpc2NvMQ0wCwYDVQQKEwRldGNkMRYwFAYDVQQLEw1ldGNkIFNl
|
||||||
|
Y3VyaXR5MQswCQYDVQQDEwJjYTAeFw0xNzExMjIxNzMzMDBaFw0yNzExMjAxNzMz
|
||||||
|
MDBaMG8xDDAKBgNVBAYTA1VTQTETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UE
|
||||||
|
BxMNU2FuIEZyYW5jaXNjbzENMAsGA1UEChMEZXRjZDEWMBQGA1UECxMNZXRjZCBT
|
||||||
|
ZWN1cml0eTELMAkGA1UEAxMCY2EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK
|
||||||
|
AoIBAQDDU14WMuV1AC+6wDWRF6itx71EljW7Prw2drhuxOC3bE+QQx4LGcY2OP9N
|
||||||
|
9MC9u9M0s8waGDAbZvdLmCMfAAJoJ05rLcO7F2XEr7Ww7jUWl7+B/sW8ENQiqtUY
|
||||||
|
1JqLVjwducxmfHspAmSkhEpDBTiTFsya/i1Ic+ctfxDLtsNGgQuA9mCiBvuUhbWG
|
||||||
|
CkB0JpuL4s6LMuDukQHpZZCDnq0Y26M9sZnjmowbdRoQlhVId6Tl5b5b4Y3qLLbe
|
||||||
|
r1E+VChcPpOYrKhXBOW/dT5ph/fIQDuVKN6E5Z54AMm3fKsP3MLGBCMfFqIVg1+s
|
||||||
|
BZA5/Jau+US8Ll4bn8sy/HK1xoy/AgMBAAGjRTBDMA4GA1UdDwEB/wQEAwIBBjAS
|
||||||
|
BgNVHRMBAf8ECDAGAQH/AgECMB0GA1UdDgQWBBSZZ+PEsPywCRKo/fxY2eSnI0wQ
|
||||||
|
IDANBgkqhkiG9w0BAQsFAAOCAQEAFU4QXMGx8zr8rKAp/IyGipDp/aQ49qYXPjIt
|
||||||
|
c92rzbYo11sJmBEXiYIOGuZdBBeawIzYsM8dW59LFO8ZcMq/gISBcS5ilqllw6SG
|
||||||
|
20UrFEKNzcPoRwXp3GSbSGr5PxTgWYWpwJaDa0j2qiM4PB9/IuTBqr6Vu1Olhx06
|
||||||
|
mXztYl4UL0HPkuB4Td+BIhjc+ZpxCfBOOBpiwAyeh4SpJ3cpZrbyz7JAsCTtywzy
|
||||||
|
lVO4lfcmxTWwruRyYAnexHdBvnqa8GZw1gufZoSbMTsN4Zz/j3j9T2LG1Q0Agi7o
|
||||||
|
MhqPqhG/9ISjA0G3bu2B/jHbmWMVbb+ueEYtAz5JHFik2snRtA==
|
||||||
|
-----END CERTIFICATE-----
|
13
hack/scripts-dev/docker-dns-srv/certs/gencert.json
Normal file
13
hack/scripts-dev/docker-dns-srv/certs/gencert.json
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
{
|
||||||
|
"signing": {
|
||||||
|
"default": {
|
||||||
|
"usages": [
|
||||||
|
"signing",
|
||||||
|
"key encipherment",
|
||||||
|
"server auth",
|
||||||
|
"client auth"
|
||||||
|
],
|
||||||
|
"expiry": "87600h"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
26
hack/scripts-dev/docker-dns-srv/certs/gencerts.sh
Executable file
26
hack/scripts-dev/docker-dns-srv/certs/gencerts.sh
Executable file
@@ -0,0 +1,26 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
if ! [[ "$0" =~ "./gencerts.sh" ]]; then
|
||||||
|
echo "must be run from 'fixtures'"
|
||||||
|
exit 255
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ! which cfssl; then
|
||||||
|
echo "cfssl is not installed"
|
||||||
|
exit 255
|
||||||
|
fi
|
||||||
|
|
||||||
|
cfssl gencert --initca=true ./ca-csr.json | cfssljson --bare ./ca
|
||||||
|
mv ca.pem ca.crt
|
||||||
|
openssl x509 -in ca.crt -noout -text
|
||||||
|
|
||||||
|
# generate wildcard certificates DNS: *.etcd.local
|
||||||
|
cfssl gencert \
|
||||||
|
--ca ./ca.crt \
|
||||||
|
--ca-key ./ca-key.pem \
|
||||||
|
--config ./gencert.json \
|
||||||
|
./server-ca-csr.json | cfssljson --bare ./server
|
||||||
|
mv server.pem server.crt
|
||||||
|
mv server-key.pem server.key.insecure
|
||||||
|
|
||||||
|
rm -f *.csr *.pem *.stderr *.txt
|
33
hack/scripts-dev/docker-dns-srv/certs/run.sh
Executable file
33
hack/scripts-dev/docker-dns-srv/certs/run.sh
Executable file
@@ -0,0 +1,33 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
rm -rf /tmp/m1.data /tmp/m2.data /tmp/m3.data
|
||||||
|
|
||||||
|
/etc/init.d/bind9 start
|
||||||
|
|
||||||
|
# get rid of hosts so go lookup won't resolve 127.0.0.1 to localhost
|
||||||
|
cat /dev/null >/etc/hosts
|
||||||
|
|
||||||
|
goreman -f /certs/Procfile start &
|
||||||
|
|
||||||
|
# TODO: remove random sleeps
|
||||||
|
sleep 7s
|
||||||
|
|
||||||
|
ETCDCTL_API=3 ./etcdctl \
|
||||||
|
--cacert=/certs/ca.crt \
|
||||||
|
--cert=/certs/server.crt \
|
||||||
|
--key=/certs/server.key.insecure \
|
||||||
|
--discovery-srv etcd.local \
|
||||||
|
endpoint health --cluster
|
||||||
|
|
||||||
|
ETCDCTL_API=3 ./etcdctl \
|
||||||
|
--cacert=/certs/ca.crt \
|
||||||
|
--cert=/certs/server.crt \
|
||||||
|
--key=/certs/server.key.insecure \
|
||||||
|
--discovery-srv etcd.local \
|
||||||
|
put abc def
|
||||||
|
|
||||||
|
ETCDCTL_API=3 ./etcdctl \
|
||||||
|
--cacert=/certs/ca.crt \
|
||||||
|
--cert=/certs/server.crt \
|
||||||
|
--key=/certs/server.key.insecure \
|
||||||
|
--discovery-srv etcd.local \
|
||||||
|
get abc
|
23
hack/scripts-dev/docker-dns-srv/certs/server-ca-csr.json
Normal file
23
hack/scripts-dev/docker-dns-srv/certs/server-ca-csr.json
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
{
|
||||||
|
"key": {
|
||||||
|
"algo": "rsa",
|
||||||
|
"size": 2048
|
||||||
|
},
|
||||||
|
"names": [
|
||||||
|
{
|
||||||
|
"O": "etcd",
|
||||||
|
"OU": "etcd Security",
|
||||||
|
"L": "San Francisco",
|
||||||
|
"ST": "California",
|
||||||
|
"C": "USA"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"hosts": [
|
||||||
|
"m1.etcd.local",
|
||||||
|
"m2.etcd.local",
|
||||||
|
"m3.etcd.local",
|
||||||
|
"etcd.local",
|
||||||
|
"127.0.0.1",
|
||||||
|
"localhost"
|
||||||
|
]
|
||||||
|
}
|
25
hack/scripts-dev/docker-dns-srv/certs/server.crt
Normal file
25
hack/scripts-dev/docker-dns-srv/certs/server.crt
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
-----BEGIN CERTIFICATE-----
|
||||||
|
MIIENTCCAx2gAwIBAgIUPr4J62m04v7Sr5rFop1P0+VbN+8wDQYJKoZIhvcNAQEL
|
||||||
|
BQAwbzEMMAoGA1UEBhMDVVNBMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQH
|
||||||
|
Ew1TYW4gRnJhbmNpc2NvMQ0wCwYDVQQKEwRldGNkMRYwFAYDVQQLEw1ldGNkIFNl
|
||||||
|
Y3VyaXR5MQswCQYDVQQDEwJjYTAeFw0xNzExMjIxNzMzMDBaFw0yNzExMjAxNzMz
|
||||||
|
MDBaMGIxDDAKBgNVBAYTA1VTQTETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UE
|
||||||
|
BxMNU2FuIEZyYW5jaXNjbzENMAsGA1UEChMEZXRjZDEWMBQGA1UECxMNZXRjZCBT
|
||||||
|
ZWN1cml0eTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOZuU1wqUMoI
|
||||||
|
/Vkxo5ep8vGxgCg38c0PdxAJX4ViEBRIsKxnjMUmgMWEes9bJ14wrqQ2G3l0tSSr
|
||||||
|
nOtRPRGeSBAsiFKU41sRdHZQgZKhWXKvOqLlll9tgTmAypXeYt1zrtV8zPan3AWn
|
||||||
|
OYz+FdO41BESmg00SctcIVoP57keSkr/binJuwy+e1w6Z8Prnoc+OqsFvjp6RPNH
|
||||||
|
ZJYKsBziYVldg3RN0K/1MQBP587AhF0Dh+iTqnMWhJwbAGw82j7b7jgJnatMvj0L
|
||||||
|
e/nunxB9BgWaRl4Xq0WueFBfVSLIYUspTogpaz2bUsIAxV3xbRRbpiFY/eqT6nSK
|
||||||
|
grR6Qc8oOVsCAwEAAaOB1TCB0jAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYI
|
||||||
|
KwYBBQUHAwEGCCsGAQUFBwMCMAwGA1UdEwEB/wQCMAAwHQYDVR0OBBYEFE4dpGTp
|
||||||
|
+hE0TR9Ku1wf1/GQ9zVjMB8GA1UdIwQYMBaAFJln48Sw/LAJEqj9/FjZ5KcjTBAg
|
||||||
|
MFMGA1UdEQRMMEqCDW0xLmV0Y2QubG9jYWyCDW0yLmV0Y2QubG9jYWyCDW0zLmV0
|
||||||
|
Y2QubG9jYWyCCmV0Y2QubG9jYWyCCWxvY2FsaG9zdIcEfwAAATANBgkqhkiG9w0B
|
||||||
|
AQsFAAOCAQEADDh4aThZsXaXkAluZP1yC+gc+z+gJT88SeBgIX11++3SqzERCcWv
|
||||||
|
71boMeYGDa/TuvDtAXQcZAtfNdjcZCxPGPoDuOYMksEMk/+oekb8JR1Nfd9jgRr+
|
||||||
|
0MD2Hh6ElM9F/FXO+NHavAbtbTjbEGXGXCciGqL/fPw4AF0bAIQjiIE69wiZgCfM
|
||||||
|
1/+wR2+paZ+CxE3QZZKUhgoDRPY91J8KCiDPHvZRafQEulzb8w4G7h8TUy1xjZPw
|
||||||
|
UQfHsquLQHIfCHVHSn2yubMrlMbdJPhnJT35APBa7Uj0TYwb1tuFQ/xbO2GKoq3f
|
||||||
|
T7Rad1T50qRTqsRZzPdG4lZjAgnybjJUIQ==
|
||||||
|
-----END CERTIFICATE-----
|
27
hack/scripts-dev/docker-dns-srv/certs/server.key.insecure
Normal file
27
hack/scripts-dev/docker-dns-srv/certs/server.key.insecure
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
-----BEGIN RSA PRIVATE KEY-----
|
||||||
|
MIIEpAIBAAKCAQEA5m5TXCpQygj9WTGjl6ny8bGAKDfxzQ93EAlfhWIQFEiwrGeM
|
||||||
|
xSaAxYR6z1snXjCupDYbeXS1JKuc61E9EZ5IECyIUpTjWxF0dlCBkqFZcq86ouWW
|
||||||
|
X22BOYDKld5i3XOu1XzM9qfcBac5jP4V07jUERKaDTRJy1whWg/nuR5KSv9uKcm7
|
||||||
|
DL57XDpnw+uehz46qwW+OnpE80dklgqwHOJhWV2DdE3Qr/UxAE/nzsCEXQOH6JOq
|
||||||
|
cxaEnBsAbDzaPtvuOAmdq0y+PQt7+e6fEH0GBZpGXherRa54UF9VIshhSylOiClr
|
||||||
|
PZtSwgDFXfFtFFumIVj96pPqdIqCtHpBzyg5WwIDAQABAoIBAQDBdpk4RTLFHV0P
|
||||||
|
uLRfzkjxkRRHMAksIDLXXPc8tkNHtGvYo6u1jokIzByL4T0hQIAv0Fmq1EiNfCPo
|
||||||
|
EbHTC+/23Fyr8OMdf38nIppW8G538hSp1VY10mtvSulLgIXC5bBA/2HaKL56ZJbW
|
||||||
|
ADF1K7Woi9SZB3B5c2VxBu+HJZ48bbZLFoKMw+48998K/S0Msh4NeZ3Lq75i2LmZ
|
||||||
|
GhPmeR2d922UAO72hgP8h771Cejz3bd0mdFGtbwSS+1vpseFsZHu8yQjBAbP13o2
|
||||||
|
e6+SpZf7Yndeg1Wv/WALiKFFTIfqnpVtVhMqD+nx/0DweW1b1vdDVz+LmPPUyvxR
|
||||||
|
owhQV9b5AoGBAPNPSgMxlMvsaoTo08AU6YjZgfqMAxJNgVU/KsyK9qhq/O9Q9O8d
|
||||||
|
OKt/kehdeYQOkkM77mLTtcDlFfbg6NmNnN7iBMY9v5iZP8U14avjmvjDKrwigsK+
|
||||||
|
HWuFlA7RpmecIwHH17ya32PydnoM7MMH46N28fSnAR7bIgZC3USmUfYtAoGBAPJz
|
||||||
|
E8Gcf9eVox5o5hhhocLtjFQcXxjcL3Bxz1qFPNvQ440s/7ubGORPoDzOf1lPyxI9
|
||||||
|
HewZTJ/aP8lyhPwGC0+O3mH6Gwr2YflaoLdZxBAX0gliPKI0OWsH73RGkBxUte46
|
||||||
|
ugTgKXpwtvM9R7pENJbP8lOFKdg5EoA6ZjIKCmqnAoGBAMMXT4wyBFJi9aIuoiNB
|
||||||
|
YWQmq47/FzNkzBBTfvjVcCPo7Xji3BKixp7UwmSkFtxpZqPceS/q+7B4v9zdyDcw
|
||||||
|
0pjwd82RE4DDWJvDsXjHHqraqviBX4HROPvO9sHPHvOzAWrbF8QWFosojhEdLfbP
|
||||||
|
65pVtHpsMnzQTn7gvFTgW5XdAoGAepDYfPlL28Wm99mZ8NtydmO2nFLXdG7jgJnY
|
||||||
|
dG+E6683SghkpAftVoY2gGb4FEN1apwBA3lqtikUNBezyOCZWTfljmxsvWb+8prx
|
||||||
|
Qp+bsXMJWHsUIf/6wvP5BrQhaGEes/d2UL6t2Vsf8emZ2D1gxJkNbVGVbNy1UKO1
|
||||||
|
RDi1OWMCgYB+DZ/CvJ8i6VwzOm/SXtycuDJZ96NGwjpK4A71HoocrVi1phGMlOp+
|
||||||
|
c48XR0Xr2/AEfFsmcTIilI2ShsjN4u9YDXJK8Efek2EX77pP6MsUXuSZ6i1OS9wP
|
||||||
|
5WPYypGxNXsZU99D78UBV9PohWqp4LkBSP/55sFBcd3iyLbdHlthLA==
|
||||||
|
-----END RSA PRIVATE KEY-----
|
@@ -1,16 +1,21 @@
|
|||||||
etcd.local. IN SOA bindhostname. admin.etcd.local. (
|
$TTL 86400
|
||||||
1452607488
|
@ IN SOA etcdns.local. root.etcdns.local. (
|
||||||
10800
|
100500 ; Serial
|
||||||
3600
|
604800 ; Refresh
|
||||||
604800
|
86400 ; Retry
|
||||||
38400 )
|
2419200 ; Expire
|
||||||
etcd.local. IN NS bindhostname.
|
86400 ) ; Negative Cache TTL
|
||||||
m1.etcd.local. 300 IN A 127.0.0.1
|
IN NS ns.etcdns.local.
|
||||||
m2.etcd.local. 300 IN A 127.0.0.1
|
IN A 127.0.0.1
|
||||||
m3.etcd.local. 300 IN A 127.0.0.1
|
|
||||||
_etcd-client-ssl._tcp 300 IN SRV 0 0 2379 m1.etcd.local.
|
ns IN A 127.0.0.1
|
||||||
_etcd-client-ssl._tcp 300 IN SRV 0 0 22379 m2.etcd.local.
|
m1 IN A 127.0.0.1
|
||||||
_etcd-client-ssl._tcp 300 IN SRV 0 0 32379 m3.etcd.local.
|
m2 IN A 127.0.0.1
|
||||||
_etcd-server-ssl._tcp 300 IN SRV 0 0 2380 m1.etcd.local.
|
m3 IN A 127.0.0.1
|
||||||
_etcd-server-ssl._tcp 300 IN SRV 0 0 22380 m2.etcd.local.
|
|
||||||
_etcd-server-ssl._tcp 300 IN SRV 0 0 32380 m3.etcd.local.
|
_etcd-client-ssl._tcp IN SRV 0 0 2379 m1.etcd.local.
|
||||||
|
_etcd-server-ssl._tcp IN SRV 0 0 2380 m1.etcd.local.
|
||||||
|
_etcd-client-ssl._tcp IN SRV 0 0 22379 m2.etcd.local.
|
||||||
|
_etcd-server-ssl._tcp IN SRV 0 0 22380 m2.etcd.local.
|
||||||
|
_etcd-client-ssl._tcp IN SRV 0 0 32379 m3.etcd.local.
|
||||||
|
_etcd-server-ssl._tcp IN SRV 0 0 32380 m3.etcd.local.
|
||||||
|
@@ -1,16 +0,0 @@
|
|||||||
#!/bin/sh
|
|
||||||
|
|
||||||
/etc/init.d/bind9 start
|
|
||||||
|
|
||||||
# get rid of hosts so go lookup won't resolve 127.0.0.1 to localhost
|
|
||||||
cat /dev/null >/etc/hosts
|
|
||||||
|
|
||||||
goreman -f /Procfile start &
|
|
||||||
sleep 7s
|
|
||||||
|
|
||||||
ETCDCTL_API=3 ./etcdctl \
|
|
||||||
--cacert=/certs/ca.crt \
|
|
||||||
--cert=/certs/server-wildcard.crt \
|
|
||||||
--key=/certs//server-wildcard.key.insecure \
|
|
||||||
--discovery-srv etcd.local \
|
|
||||||
put foo bar
|
|
@@ -33,16 +33,12 @@ ENV GO_DOWNLOAD_URL https://storage.googleapis.com/golang
|
|||||||
RUN rm -rf ${GOROOT} \
|
RUN rm -rf ${GOROOT} \
|
||||||
&& curl -s ${GO_DOWNLOAD_URL}/go${GO_VERSION}.linux-amd64.tar.gz | tar -v -C /usr/local/ -xz \
|
&& curl -s ${GO_DOWNLOAD_URL}/go${GO_VERSION}.linux-amd64.tar.gz | tar -v -C /usr/local/ -xz \
|
||||||
&& mkdir -p ${GOPATH}/src ${GOPATH}/bin \
|
&& mkdir -p ${GOPATH}/src ${GOPATH}/bin \
|
||||||
&& go version
|
&& go version \
|
||||||
|
&& go get -v -u github.com/mattn/goreman
|
||||||
|
|
||||||
RUN mkdir -p /var/bind /etc/bind
|
RUN mkdir -p /var/bind /etc/bind
|
||||||
RUN chown root:bind /var/bind /etc/bind
|
RUN chown root:bind /var/bind /etc/bind
|
||||||
ADD Procfile.tls /Procfile.tls
|
|
||||||
ADD run.sh /run.sh
|
|
||||||
|
|
||||||
ADD named.conf etcd.zone rdns.zone /etc/bind/
|
ADD named.conf etcd.zone rdns.zone /etc/bind/
|
||||||
RUN chown root:bind /etc/bind/named.conf /etc/bind/etcd.zone /etc/bind/rdns.zone
|
RUN chown root:bind /etc/bind/named.conf /etc/bind/etcd.zone /etc/bind/rdns.zone
|
||||||
ADD resolv.conf /etc/resolv.conf
|
ADD resolv.conf /etc/resolv.conf
|
||||||
|
|
||||||
RUN go get github.com/mattn/goreman
|
|
||||||
CMD ["/run.sh"]
|
|
||||||
|
@@ -1,6 +0,0 @@
|
|||||||
# Use goreman to run `go get github.com/mattn/goreman`
|
|
||||||
etcd1: ./etcd --name m1 --listen-client-urls https://127.0.0.1:2379 --advertise-client-urls https://m1.etcd.local:2379 --listen-peer-urls https://127.0.0.1:2380 --initial-advertise-peer-urls=https://m1.etcd.local:2380 --initial-cluster-token tkn --initial-cluster=m1=https://m1.etcd.local:2380,m2=https://m2.etcd.local:22380,m3=https://m3.etcd.local:32380 --initial-cluster-state new --peer-cert-file=/certs/server-wildcard.crt --peer-key-file=/certs/server-wildcard.key.insecure --peer-trusted-ca-file=/certs/ca.crt --peer-client-cert-auth --cert-file=/certs/server-wildcard.crt --key-file=/certs/server-wildcard.key.insecure --trusted-ca-file=/certs/ca.crt --client-cert-auth
|
|
||||||
|
|
||||||
etcd2: ./etcd --name m2 --listen-client-urls https://127.0.0.1:22379 --advertise-client-urls https://m2.etcd.local:22379 --listen-peer-urls https://127.0.0.1:22380 --initial-advertise-peer-urls=https://m2.etcd.local:22380 --initial-cluster-token tkn --initial-cluster=m1=https://m1.etcd.local:2380,m2=https://m2.etcd.local:22380,m3=https://m3.etcd.local:32380 --initial-cluster-state new --peer-cert-file=/certs/server-wildcard.crt --peer-key-file=/certs/server-wildcard.key.insecure --peer-trusted-ca-file=/certs/ca.crt --peer-client-cert-auth --cert-file=/certs/server-wildcard.crt --key-file=/certs/server-wildcard.key.insecure --trusted-ca-file=/certs/ca.crt --client-cert-auth
|
|
||||||
|
|
||||||
etcd3: ./etcd --name m3 --listen-client-urls https://127.0.0.1:32379 --advertise-client-urls https://m3.etcd.local:32379 --listen-peer-urls https://127.0.0.1:32380 --initial-advertise-peer-urls=https://m3.etcd.local:32380 --initial-cluster-token tkn --initial-cluster=m1=https://m1.etcd.local:2380,m2=https://m2.etcd.local:22380,m3=https://m3.etcd.local:32380 --initial-cluster-state new --peer-cert-file=/certs/server-wildcard.crt --peer-key-file=/certs/server-wildcard.key.insecure --peer-trusted-ca-file=/certs/ca.crt --peer-client-cert-auth --cert-file=/certs/server-wildcard.crt --key-file=/certs/server-wildcard.key.insecure --trusted-ca-file=/certs/ca.crt --client-cert-auth
|
|
6
hack/scripts-dev/docker-dns/certs-common-name/Procfile
Normal file
6
hack/scripts-dev/docker-dns/certs-common-name/Procfile
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
# Use goreman to run `go get github.com/mattn/goreman`
|
||||||
|
etcd1: ./etcd --name m1 --data-dir /tmp/m1.data --listen-client-urls https://127.0.0.1:2379 --advertise-client-urls https://m1.etcd.local:2379 --listen-peer-urls https://127.0.0.1:2380 --initial-advertise-peer-urls=https://m1.etcd.local:2380 --initial-cluster-token tkn --initial-cluster=m1=https://m1.etcd.local:2380,m2=https://m2.etcd.local:22380,m3=https://m3.etcd.local:32380 --initial-cluster-state new --peer-cert-file=/certs-common-name/server.crt --peer-key-file=/certs-common-name/server.key.insecure --peer-trusted-ca-file=/certs-common-name/ca.crt --peer-client-cert-auth --peer-cert-allowed-cn test-common-name --cert-file=/certs-common-name/server.crt --key-file=/certs-common-name/server.key.insecure --trusted-ca-file=/certs-common-name/ca.crt --client-cert-auth
|
||||||
|
|
||||||
|
etcd2: ./etcd --name m2 --data-dir /tmp/m2.data --listen-client-urls https://127.0.0.1:22379 --advertise-client-urls https://m2.etcd.local:22379 --listen-peer-urls https://127.0.0.1:22380 --initial-advertise-peer-urls=https://m2.etcd.local:22380 --initial-cluster-token tkn --initial-cluster=m1=https://m1.etcd.local:2380,m2=https://m2.etcd.local:22380,m3=https://m3.etcd.local:32380 --initial-cluster-state new --peer-cert-file=/certs-common-name/server.crt --peer-key-file=/certs-common-name/server.key.insecure --peer-trusted-ca-file=/certs-common-name/ca.crt --peer-client-cert-auth --peer-cert-allowed-cn test-common-name --cert-file=/certs-common-name/server.crt --key-file=/certs-common-name/server.key.insecure --trusted-ca-file=/certs-common-name/ca.crt --client-cert-auth
|
||||||
|
|
||||||
|
etcd3: ./etcd --name m3 --data-dir /tmp/m3.data --listen-client-urls https://127.0.0.1:32379 --advertise-client-urls https://m3.etcd.local:32379 --listen-peer-urls https://127.0.0.1:32380 --initial-advertise-peer-urls=https://m3.etcd.local:32380 --initial-cluster-token tkn --initial-cluster=m1=https://m1.etcd.local:2380,m2=https://m2.etcd.local:22380,m3=https://m3.etcd.local:32380 --initial-cluster-state new --peer-cert-file=/certs-common-name/server.crt --peer-key-file=/certs-common-name/server.key.insecure --peer-trusted-ca-file=/certs-common-name/ca.crt --peer-client-cert-auth --peer-cert-allowed-cn test-common-name --cert-file=/certs-common-name/server.crt --key-file=/certs-common-name/server.key.insecure --trusted-ca-file=/certs-common-name/ca.crt --client-cert-auth
|
19
hack/scripts-dev/docker-dns/certs-common-name/ca-csr.json
Normal file
19
hack/scripts-dev/docker-dns/certs-common-name/ca-csr.json
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
{
|
||||||
|
"key": {
|
||||||
|
"algo": "rsa",
|
||||||
|
"size": 2048
|
||||||
|
},
|
||||||
|
"names": [
|
||||||
|
{
|
||||||
|
"O": "etcd",
|
||||||
|
"OU": "etcd Security",
|
||||||
|
"L": "San Francisco",
|
||||||
|
"ST": "California",
|
||||||
|
"C": "USA"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"CN": "ca",
|
||||||
|
"ca": {
|
||||||
|
"expiry": "87600h"
|
||||||
|
}
|
||||||
|
}
|
22
hack/scripts-dev/docker-dns/certs-common-name/ca.crt
Normal file
22
hack/scripts-dev/docker-dns/certs-common-name/ca.crt
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
-----BEGIN CERTIFICATE-----
|
||||||
|
MIIDsTCCApmgAwIBAgIUdASu5zT1US/6LPyKmczbC3NgdY4wDQYJKoZIhvcNAQEL
|
||||||
|
BQAwbzEMMAoGA1UEBhMDVVNBMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQH
|
||||||
|
Ew1TYW4gRnJhbmNpc2NvMQ0wCwYDVQQKEwRldGNkMRYwFAYDVQQLEw1ldGNkIFNl
|
||||||
|
Y3VyaXR5MQswCQYDVQQDEwJjYTAeFw0xNzExMTQwNjIzMDBaFw0yNzExMTIwNjIz
|
||||||
|
MDBaMG8xDDAKBgNVBAYTA1VTQTETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UE
|
||||||
|
BxMNU2FuIEZyYW5jaXNjbzENMAsGA1UEChMEZXRjZDEWMBQGA1UECxMNZXRjZCBT
|
||||||
|
ZWN1cml0eTELMAkGA1UEAxMCY2EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK
|
||||||
|
AoIBAQDBbE44RP/Tk9l7KShzxQAypatoqDJQL32hyw8plZIfni5XFIlG2GwyjNvX
|
||||||
|
wiP6u0YcsApZKc58ytqcHQqMyk68OTTxcM+HVWvKHMKOBPBYgXeeVnD+7Ixuinq/
|
||||||
|
X6RK3n2jEipFgE9FiAXDNICF3ZQz+HVNBSbzwCjBtIcYkinWHX+kgnQkFT1NnmuZ
|
||||||
|
uloz6Uh7/Ngn/XPNSsoMyLrh4TwDsx/fQEpVcrXMbxWux1xEHmfDzRKvE7VhSo39
|
||||||
|
/mcpKBOwTg4jwh9tDjxWX4Yat+/cX0cGxQ7JSrdy14ESV5AGBmesGHd2SoWhZK9l
|
||||||
|
tWm1Eq0JYWD+Cd5yNrODTUxWRNs9AgMBAAGjRTBDMA4GA1UdDwEB/wQEAwIBBjAS
|
||||||
|
BgNVHRMBAf8ECDAGAQH/AgECMB0GA1UdDgQWBBSZMjlLnc7Vv2mxRMebo5ezJ7gt
|
||||||
|
pzANBgkqhkiG9w0BAQsFAAOCAQEAA2d2nV4CXjp7xpTQrh8sHzSBDYUNr9DY5hej
|
||||||
|
52X6q8WV0N3QC7Utvv2Soz6Ol72/xoGajIJvqorsIBB5Ms3dgCzPMy3R01Eb3MzI
|
||||||
|
7KG/4AGVEiAKUBkNSD8PWD7bREnnv1g9tUftE7jWsgMaPIpi6KhzhyJsClT4UsKQ
|
||||||
|
6Lp+Be80S293LrlmUSdZ/v7FAvMzDGOLd2iTlTr1fXK6YJJEXpk3+HIi8nbUPvYQ
|
||||||
|
6O8iOtf5QoCm1yMLJQMFvNr51Z1EeF935HRj8U2MJP5jXPW4/UY2TAUBcWEhlNsK
|
||||||
|
6od+f1B8xGe/6KHvF0C8bg23kj8QphM/E7HCZiVgdm6FNf54AQ==
|
||||||
|
-----END CERTIFICATE-----
|
13
hack/scripts-dev/docker-dns/certs-common-name/gencert.json
Normal file
13
hack/scripts-dev/docker-dns/certs-common-name/gencert.json
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
{
|
||||||
|
"signing": {
|
||||||
|
"default": {
|
||||||
|
"usages": [
|
||||||
|
"signing",
|
||||||
|
"key encipherment",
|
||||||
|
"server auth",
|
||||||
|
"client auth"
|
||||||
|
],
|
||||||
|
"expiry": "87600h"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
26
hack/scripts-dev/docker-dns/certs-common-name/gencerts.sh
Executable file
26
hack/scripts-dev/docker-dns/certs-common-name/gencerts.sh
Executable file
@@ -0,0 +1,26 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
if ! [[ "$0" =~ "./gencerts.sh" ]]; then
|
||||||
|
echo "must be run from 'fixtures'"
|
||||||
|
exit 255
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ! which cfssl; then
|
||||||
|
echo "cfssl is not installed"
|
||||||
|
exit 255
|
||||||
|
fi
|
||||||
|
|
||||||
|
cfssl gencert --initca=true ./ca-csr.json | cfssljson --bare ./ca
|
||||||
|
mv ca.pem ca.crt
|
||||||
|
openssl x509 -in ca.crt -noout -text
|
||||||
|
|
||||||
|
# generate wildcard certificates DNS: *.etcd.local
|
||||||
|
cfssl gencert \
|
||||||
|
--ca ./ca.crt \
|
||||||
|
--ca-key ./ca-key.pem \
|
||||||
|
--config ./gencert.json \
|
||||||
|
./server-ca-csr.json | cfssljson --bare ./server
|
||||||
|
mv server.pem server.crt
|
||||||
|
mv server-key.pem server.key.insecure
|
||||||
|
|
||||||
|
rm -f *.csr *.pem *.stderr *.txt
|
255
hack/scripts-dev/docker-dns/certs-common-name/run.sh
Executable file
255
hack/scripts-dev/docker-dns/certs-common-name/run.sh
Executable file
@@ -0,0 +1,255 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
rm -rf /tmp/m1.data /tmp/m2.data /tmp/m3.data
|
||||||
|
|
||||||
|
/etc/init.d/bind9 start
|
||||||
|
|
||||||
|
# get rid of hosts so go lookup won't resolve 127.0.0.1 to localhost
|
||||||
|
cat /dev/null >/etc/hosts
|
||||||
|
|
||||||
|
goreman -f /certs-common-name/Procfile start &
|
||||||
|
sleep 7s
|
||||||
|
|
||||||
|
ETCDCTL_API=3 ./etcdctl \
|
||||||
|
--cacert=/certs-common-name/ca.crt \
|
||||||
|
--cert=/certs-common-name/server.crt \
|
||||||
|
--key=/certs-common-name/server.key.insecure \
|
||||||
|
--endpoints=https://m1.etcd.local:2379 \
|
||||||
|
endpoint health --cluster
|
||||||
|
|
||||||
|
sleep 2s
|
||||||
|
ETCDCTL_API=3 ./etcdctl \
|
||||||
|
--cacert=/certs-common-name/ca.crt \
|
||||||
|
--cert=/certs-common-name/server.crt \
|
||||||
|
--key=/certs-common-name/server.key.insecure \
|
||||||
|
--endpoints=https://m1.etcd.local:2379,https://m2.etcd.local:22379,https://m3.etcd.local:32379 \
|
||||||
|
put abc def
|
||||||
|
|
||||||
|
sleep 2s
|
||||||
|
ETCDCTL_API=3 ./etcdctl \
|
||||||
|
--cacert=/certs-common-name/ca.crt \
|
||||||
|
--cert=/certs-common-name/server.crt \
|
||||||
|
--key=/certs-common-name/server.key.insecure \
|
||||||
|
--endpoints=https://m1.etcd.local:2379,https://m2.etcd.local:22379,https://m3.etcd.local:32379 \
|
||||||
|
get abc
|
||||||
|
|
||||||
|
sleep 1s && printf "\n"
|
||||||
|
echo "Step 1. creating root role"
|
||||||
|
ETCDCTL_API=3 ./etcdctl \
|
||||||
|
--cacert=/certs-common-name/ca.crt \
|
||||||
|
--cert=/certs-common-name/server.crt \
|
||||||
|
--key=/certs-common-name/server.key.insecure \
|
||||||
|
--endpoints=https://m1.etcd.local:2379,https://m2.etcd.local:22379,https://m3.etcd.local:32379 \
|
||||||
|
role add root
|
||||||
|
|
||||||
|
sleep 1s && printf "\n"
|
||||||
|
echo "Step 2. granting readwrite 'foo' permission to role 'root'"
|
||||||
|
ETCDCTL_API=3 ./etcdctl \
|
||||||
|
--cacert=/certs-common-name/ca.crt \
|
||||||
|
--cert=/certs-common-name/server.crt \
|
||||||
|
--key=/certs-common-name/server.key.insecure \
|
||||||
|
--endpoints=https://m1.etcd.local:2379,https://m2.etcd.local:22379,https://m3.etcd.local:32379 \
|
||||||
|
role grant-permission root readwrite foo
|
||||||
|
|
||||||
|
sleep 1s && printf "\n"
|
||||||
|
echo "Step 3. getting role 'root'"
|
||||||
|
ETCDCTL_API=3 ./etcdctl \
|
||||||
|
--cacert=/certs-common-name/ca.crt \
|
||||||
|
--cert=/certs-common-name/server.crt \
|
||||||
|
--key=/certs-common-name/server.key.insecure \
|
||||||
|
--endpoints=https://m1.etcd.local:2379,https://m2.etcd.local:22379,https://m3.etcd.local:32379 \
|
||||||
|
role get root
|
||||||
|
|
||||||
|
sleep 1s && printf "\n"
|
||||||
|
echo "Step 4. creating user 'root'"
|
||||||
|
ETCDCTL_API=3 ./etcdctl \
|
||||||
|
--cacert=/certs-common-name/ca.crt \
|
||||||
|
--cert=/certs-common-name/server.crt \
|
||||||
|
--key=/certs-common-name/server.key.insecure \
|
||||||
|
--endpoints=https://m1.etcd.local:2379,https://m2.etcd.local:22379,https://m3.etcd.local:32379 \
|
||||||
|
--interactive=false \
|
||||||
|
user add root:123
|
||||||
|
|
||||||
|
sleep 1s && printf "\n"
|
||||||
|
echo "Step 5. granting role 'root' to user 'root'"
|
||||||
|
ETCDCTL_API=3 ./etcdctl \
|
||||||
|
--cacert=/certs-common-name/ca.crt \
|
||||||
|
--cert=/certs-common-name/server.crt \
|
||||||
|
--key=/certs-common-name/server.key.insecure \
|
||||||
|
--endpoints=https://m1.etcd.local:2379,https://m2.etcd.local:22379,https://m3.etcd.local:32379 \
|
||||||
|
user grant-role root root
|
||||||
|
|
||||||
|
sleep 1s && printf "\n"
|
||||||
|
echo "Step 6. getting user 'root'"
|
||||||
|
ETCDCTL_API=3 ./etcdctl \
|
||||||
|
--cacert=/certs-common-name/ca.crt \
|
||||||
|
--cert=/certs-common-name/server.crt \
|
||||||
|
--key=/certs-common-name/server.key.insecure \
|
||||||
|
--endpoints=https://m1.etcd.local:2379,https://m2.etcd.local:22379,https://m3.etcd.local:32379 \
|
||||||
|
user get root
|
||||||
|
|
||||||
|
sleep 1s && printf "\n"
|
||||||
|
echo "Step 7. enabling auth"
|
||||||
|
ETCDCTL_API=3 ./etcdctl \
|
||||||
|
--cacert=/certs-common-name/ca.crt \
|
||||||
|
--cert=/certs-common-name/server.crt \
|
||||||
|
--key=/certs-common-name/server.key.insecure \
|
||||||
|
--endpoints=https://m1.etcd.local:2379,https://m2.etcd.local:22379,https://m3.etcd.local:32379 \
|
||||||
|
auth enable
|
||||||
|
|
||||||
|
sleep 1s && printf "\n"
|
||||||
|
echo "Step 8. writing 'foo' with 'root:123'"
|
||||||
|
ETCDCTL_API=3 ./etcdctl \
|
||||||
|
--cacert=/certs-common-name/ca.crt \
|
||||||
|
--cert=/certs-common-name/server.crt \
|
||||||
|
--key=/certs-common-name/server.key.insecure \
|
||||||
|
--endpoints=https://m1.etcd.local:2379,https://m2.etcd.local:22379,https://m3.etcd.local:32379 \
|
||||||
|
--user=root:123 \
|
||||||
|
put foo bar
|
||||||
|
|
||||||
|
sleep 1s && printf "\n"
|
||||||
|
echo "Step 9. writing 'aaa' with 'root:123'"
|
||||||
|
ETCDCTL_API=3 ./etcdctl \
|
||||||
|
--cacert=/certs-common-name/ca.crt \
|
||||||
|
--cert=/certs-common-name/server.crt \
|
||||||
|
--key=/certs-common-name/server.key.insecure \
|
||||||
|
--endpoints=https://m1.etcd.local:2379,https://m2.etcd.local:22379,https://m3.etcd.local:32379 \
|
||||||
|
--user=root:123 \
|
||||||
|
put aaa bbb
|
||||||
|
|
||||||
|
sleep 1s && printf "\n"
|
||||||
|
echo "Step 10. writing 'foo' without 'root:123'"
|
||||||
|
ETCDCTL_API=3 ./etcdctl \
|
||||||
|
--cacert=/certs-common-name/ca.crt \
|
||||||
|
--cert=/certs-common-name/server.crt \
|
||||||
|
--key=/certs-common-name/server.key.insecure \
|
||||||
|
--endpoints=https://m1.etcd.local:2379,https://m2.etcd.local:22379,https://m3.etcd.local:32379 \
|
||||||
|
put foo bar
|
||||||
|
|
||||||
|
sleep 1s && printf "\n"
|
||||||
|
echo "Step 11. reading 'foo' with 'root:123'"
|
||||||
|
ETCDCTL_API=3 ./etcdctl \
|
||||||
|
--cacert=/certs-common-name/ca.crt \
|
||||||
|
--cert=/certs-common-name/server.crt \
|
||||||
|
--key=/certs-common-name/server.key.insecure \
|
||||||
|
--endpoints=https://m1.etcd.local:2379,https://m2.etcd.local:22379,https://m3.etcd.local:32379 \
|
||||||
|
--user=root:123 \
|
||||||
|
get foo
|
||||||
|
|
||||||
|
sleep 1s && printf "\n"
|
||||||
|
echo "Step 12. reading 'aaa' with 'root:123'"
|
||||||
|
ETCDCTL_API=3 ./etcdctl \
|
||||||
|
--cacert=/certs-common-name/ca.crt \
|
||||||
|
--cert=/certs-common-name/server.crt \
|
||||||
|
--key=/certs-common-name/server.key.insecure \
|
||||||
|
--endpoints=https://m1.etcd.local:2379,https://m2.etcd.local:22379,https://m3.etcd.local:32379 \
|
||||||
|
--user=root:123 \
|
||||||
|
get aaa
|
||||||
|
|
||||||
|
sleep 1s && printf "\n"
|
||||||
|
echo "Step 13. creating a new user 'test-common-name:test-pass'"
|
||||||
|
ETCDCTL_API=3 ./etcdctl \
|
||||||
|
--cacert=/certs-common-name/ca.crt \
|
||||||
|
--cert=/certs-common-name/server.crt \
|
||||||
|
--key=/certs-common-name/server.key.insecure \
|
||||||
|
--endpoints=https://m1.etcd.local:2379,https://m2.etcd.local:22379,https://m3.etcd.local:32379 \
|
||||||
|
--user=root:123 \
|
||||||
|
--interactive=false \
|
||||||
|
user add test-common-name:test-pass
|
||||||
|
|
||||||
|
sleep 1s && printf "\n"
|
||||||
|
echo "Step 14. creating a role 'test-role'"
|
||||||
|
ETCDCTL_API=3 ./etcdctl \
|
||||||
|
--cacert=/certs-common-name/ca.crt \
|
||||||
|
--cert=/certs-common-name/server.crt \
|
||||||
|
--key=/certs-common-name/server.key.insecure \
|
||||||
|
--endpoints=https://m1.etcd.local:2379,https://m2.etcd.local:22379,https://m3.etcd.local:32379 \
|
||||||
|
--user=root:123 \
|
||||||
|
role add test-role
|
||||||
|
|
||||||
|
sleep 1s && printf "\n"
|
||||||
|
echo "Step 15. granting readwrite 'aaa' --prefix permission to role 'test-role'"
|
||||||
|
ETCDCTL_API=3 ./etcdctl \
|
||||||
|
--cacert=/certs-common-name/ca.crt \
|
||||||
|
--cert=/certs-common-name/server.crt \
|
||||||
|
--key=/certs-common-name/server.key.insecure \
|
||||||
|
--endpoints=https://m1.etcd.local:2379,https://m2.etcd.local:22379,https://m3.etcd.local:32379 \
|
||||||
|
--user=root:123 \
|
||||||
|
role grant-permission test-role readwrite aaa --prefix
|
||||||
|
|
||||||
|
sleep 1s && printf "\n"
|
||||||
|
echo "Step 16. getting role 'test-role'"
|
||||||
|
ETCDCTL_API=3 ./etcdctl \
|
||||||
|
--cacert=/certs-common-name/ca.crt \
|
||||||
|
--cert=/certs-common-name/server.crt \
|
||||||
|
--key=/certs-common-name/server.key.insecure \
|
||||||
|
--endpoints=https://m1.etcd.local:2379,https://m2.etcd.local:22379,https://m3.etcd.local:32379 \
|
||||||
|
--user=root:123 \
|
||||||
|
role get test-role
|
||||||
|
|
||||||
|
sleep 1s && printf "\n"
|
||||||
|
echo "Step 17. granting role 'test-role' to user 'test-common-name'"
|
||||||
|
ETCDCTL_API=3 ./etcdctl \
|
||||||
|
--cacert=/certs-common-name/ca.crt \
|
||||||
|
--cert=/certs-common-name/server.crt \
|
||||||
|
--key=/certs-common-name/server.key.insecure \
|
||||||
|
--endpoints=https://m1.etcd.local:2379,https://m2.etcd.local:22379,https://m3.etcd.local:32379 \
|
||||||
|
--user=root:123 \
|
||||||
|
user grant-role test-common-name test-role
|
||||||
|
|
||||||
|
sleep 1s && printf "\n"
|
||||||
|
echo "Step 18. writing 'aaa' with 'test-common-name:test-pass'"
|
||||||
|
ETCDCTL_API=3 ./etcdctl \
|
||||||
|
--cacert=/certs-common-name/ca.crt \
|
||||||
|
--cert=/certs-common-name/server.crt \
|
||||||
|
--key=/certs-common-name/server.key.insecure \
|
||||||
|
--endpoints=https://m1.etcd.local:2379,https://m2.etcd.local:22379,https://m3.etcd.local:32379 \
|
||||||
|
--user=test-common-name:test-pass \
|
||||||
|
put aaa bbb
|
||||||
|
|
||||||
|
sleep 1s && printf "\n"
|
||||||
|
echo "Step 19. writing 'bbb' with 'test-common-name:test-pass'"
|
||||||
|
ETCDCTL_API=3 ./etcdctl \
|
||||||
|
--cacert=/certs-common-name/ca.crt \
|
||||||
|
--cert=/certs-common-name/server.crt \
|
||||||
|
--key=/certs-common-name/server.key.insecure \
|
||||||
|
--endpoints=https://m1.etcd.local:2379,https://m2.etcd.local:22379,https://m3.etcd.local:32379 \
|
||||||
|
--user=test-common-name:test-pass \
|
||||||
|
put bbb bbb
|
||||||
|
|
||||||
|
sleep 1s && printf "\n"
|
||||||
|
echo "Step 20. reading 'aaa' with 'test-common-name:test-pass'"
|
||||||
|
ETCDCTL_API=3 ./etcdctl \
|
||||||
|
--cacert=/certs-common-name/ca.crt \
|
||||||
|
--cert=/certs-common-name/server.crt \
|
||||||
|
--key=/certs-common-name/server.key.insecure \
|
||||||
|
--endpoints=https://m1.etcd.local:2379,https://m2.etcd.local:22379,https://m3.etcd.local:32379 \
|
||||||
|
--user=test-common-name:test-pass \
|
||||||
|
get aaa
|
||||||
|
|
||||||
|
sleep 1s && printf "\n"
|
||||||
|
echo "Step 21. reading 'bbb' with 'test-common-name:test-pass'"
|
||||||
|
ETCDCTL_API=3 ./etcdctl \
|
||||||
|
--cacert=/certs-common-name/ca.crt \
|
||||||
|
--cert=/certs-common-name/server.crt \
|
||||||
|
--key=/certs-common-name/server.key.insecure \
|
||||||
|
--endpoints=https://m1.etcd.local:2379,https://m2.etcd.local:22379,https://m3.etcd.local:32379 \
|
||||||
|
--user=test-common-name:test-pass \
|
||||||
|
get bbb
|
||||||
|
|
||||||
|
sleep 1s && printf "\n"
|
||||||
|
echo "Step 22. writing 'aaa' with CommonName 'test-common-name'"
|
||||||
|
ETCDCTL_API=3 ./etcdctl \
|
||||||
|
--cacert=/certs-common-name/ca.crt \
|
||||||
|
--cert=/certs-common-name/server.crt \
|
||||||
|
--key=/certs-common-name/server.key.insecure \
|
||||||
|
--endpoints=https://m1.etcd.local:2379,https://m2.etcd.local:22379,https://m3.etcd.local:32379 \
|
||||||
|
put aaa ccc
|
||||||
|
|
||||||
|
sleep 1s && printf "\n"
|
||||||
|
echo "Step 23. reading 'aaa' with CommonName 'test-common-name'"
|
||||||
|
ETCDCTL_API=3 ./etcdctl \
|
||||||
|
--cacert=/certs-common-name/ca.crt \
|
||||||
|
--cert=/certs-common-name/server.crt \
|
||||||
|
--key=/certs-common-name/server.key.insecure \
|
||||||
|
--endpoints=https://m1.etcd.local:2379,https://m2.etcd.local:22379,https://m3.etcd.local:32379 \
|
||||||
|
get aaa
|
@@ -0,0 +1,23 @@
|
|||||||
|
{
|
||||||
|
"key": {
|
||||||
|
"algo": "rsa",
|
||||||
|
"size": 2048
|
||||||
|
},
|
||||||
|
"names": [
|
||||||
|
{
|
||||||
|
"O": "etcd",
|
||||||
|
"OU": "etcd Security",
|
||||||
|
"L": "San Francisco",
|
||||||
|
"ST": "California",
|
||||||
|
"C": "USA"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"CN": "test-common-name",
|
||||||
|
"hosts": [
|
||||||
|
"m1.etcd.local",
|
||||||
|
"m2.etcd.local",
|
||||||
|
"m3.etcd.local",
|
||||||
|
"127.0.0.1",
|
||||||
|
"localhost"
|
||||||
|
]
|
||||||
|
}
|
25
hack/scripts-dev/docker-dns/certs-common-name/server.crt
Normal file
25
hack/scripts-dev/docker-dns/certs-common-name/server.crt
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
-----BEGIN CERTIFICATE-----
|
||||||
|
MIIERDCCAyygAwIBAgIUO500NxhwBHJsodbGKbo5NsW9/p8wDQYJKoZIhvcNAQEL
|
||||||
|
BQAwbzEMMAoGA1UEBhMDVVNBMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQH
|
||||||
|
Ew1TYW4gRnJhbmNpc2NvMQ0wCwYDVQQKEwRldGNkMRYwFAYDVQQLEw1ldGNkIFNl
|
||||||
|
Y3VyaXR5MQswCQYDVQQDEwJjYTAeFw0xNzExMTQwNjIzMDBaFw0yNzExMTIwNjIz
|
||||||
|
MDBaMH0xDDAKBgNVBAYTA1VTQTETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UE
|
||||||
|
BxMNU2FuIEZyYW5jaXNjbzENMAsGA1UEChMEZXRjZDEWMBQGA1UECxMNZXRjZCBT
|
||||||
|
ZWN1cml0eTEZMBcGA1UEAxMQdGVzdC1jb21tb24tbmFtZTCCASIwDQYJKoZIhvcN
|
||||||
|
AQEBBQADggEPADCCAQoCggEBAMRvVMj3+5jAhRng4izVm4zrvMBnHNMh2MOFVTp7
|
||||||
|
wdhEF2en7pFsKzWgczewil6v4d6QzJpgB9yQzPT2q0SOvetpbqP950y6MdPHAF9D
|
||||||
|
qZd0+wC+RLdSmK5oQKzgZER/vH3eSbTa1UdwaLBHlT6PiTzGm+gEYL43gr3kle+A
|
||||||
|
9c7aT9pkJWQFTCSdqwcQopyHEwgrfPHC8Bdn804soG4HtR9Gg/R4xtlu7ir6LTHn
|
||||||
|
vpPBScaMZDUQ5UNrEMh8TM8/sXG6oxqo86r5wpVQt6vscnTMrTTUqq+Mo/OJnDAf
|
||||||
|
plaqkWX5NfIJ9tmE2V06hq1/ptQkl714Wb+ske+aJ2Poc/UCAwEAAaOByTCBxjAO
|
||||||
|
BgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMAwG
|
||||||
|
A1UdEwEB/wQCMAAwHQYDVR0OBBYEFEG2hXyVTpxLXTse3fXe0U/g0F8kMB8GA1Ud
|
||||||
|
IwQYMBaAFJkyOUudztW/abFEx5ujl7MnuC2nMEcGA1UdEQRAMD6CDW0xLmV0Y2Qu
|
||||||
|
bG9jYWyCDW0yLmV0Y2QubG9jYWyCDW0zLmV0Y2QubG9jYWyCCWxvY2FsaG9zdIcE
|
||||||
|
fwAAATANBgkqhkiG9w0BAQsFAAOCAQEADtH0NZBrWfXTUvTa3WDsa/JPBhiPu/kH
|
||||||
|
+gRxOD5UNeDX9+QAx/gxGHrCh4j51OUx55KylUe0qAPHHZ4vhgD2lCRBqFLYx69m
|
||||||
|
xRIzVnt5NCruriskxId1aFTZ5pln5KK5tTVkAp04MBHZOgv8giXdRWn+7TtMyJxj
|
||||||
|
wVGf8R7/bwJGPPJFrLNtN4EWwXv/a2/SEoZd8fkTxzw12TeJ8w1PnkH4Zer+nzNb
|
||||||
|
dH5f+OIBGGZ2fIWANX5g9JEJvvsxBBL8uoCrFE/YdnD0fLyhoplSOVEIvncQLHd8
|
||||||
|
3QoIVQ5GXnreMF9vuuEU5LlSsqd/Zv5mAQNrbEAfAL+QZQsnHY12qQ==
|
||||||
|
-----END CERTIFICATE-----
|
@@ -0,0 +1,27 @@
|
|||||||
|
-----BEGIN RSA PRIVATE KEY-----
|
||||||
|
MIIEpAIBAAKCAQEAxG9UyPf7mMCFGeDiLNWbjOu8wGcc0yHYw4VVOnvB2EQXZ6fu
|
||||||
|
kWwrNaBzN7CKXq/h3pDMmmAH3JDM9ParRI6962luo/3nTLox08cAX0Opl3T7AL5E
|
||||||
|
t1KYrmhArOBkRH+8fd5JtNrVR3BosEeVPo+JPMab6ARgvjeCveSV74D1ztpP2mQl
|
||||||
|
ZAVMJJ2rBxCinIcTCCt88cLwF2fzTiygbge1H0aD9HjG2W7uKvotMee+k8FJxoxk
|
||||||
|
NRDlQ2sQyHxMzz+xcbqjGqjzqvnClVC3q+xydMytNNSqr4yj84mcMB+mVqqRZfk1
|
||||||
|
8gn22YTZXTqGrX+m1CSXvXhZv6yR75onY+hz9QIDAQABAoIBABiq+nS6X4gRNSXI
|
||||||
|
zd5ffMc3m152FHKXH4d+KPPNMsyb0Gyd9CGi+dIkMhPeQaIeaDjw6iDAynvyWyqw
|
||||||
|
B1X2rvbvKIvDiNZj03oK1YshDh0M/bBcNHjpEG9mfCi5jR3lBKCx14O0r2/nN95b
|
||||||
|
Puy6TbuqHU4HrrZ0diCuof2Prk6pd0EhQC+C3bZCcoWXOaRTqrMBTT6DdSMQrVKD
|
||||||
|
eGTXYqCzs/AlGKkOiErKtKWouNpkPpPiba1qp7YWXUasrXqPgPi4d97TmOShGIfc
|
||||||
|
zXNJT+e2rDX4OEVAJtOt6U2l9QG+PIhpH4P/ZYsvindm4VZBs+Vysrj4xkLgGBBP
|
||||||
|
ygOfBIECgYEA0IfP9Z9mzvCXiGrkrx2tN/k31cX674P/KwxPgSWM/AdXenYYzsmj
|
||||||
|
rVcoFx2eCFnBFdPz4BAqEfH70gtsG7OoTmoJSwN6wurIdGcFQwItrghgt9Qp46Dq
|
||||||
|
AIT9RXSpcB9AjM6p2reCjWcNeBVMrrHU3eaQitCxZbzuxvMMhMs/zzECgYEA8Sak
|
||||||
|
UhXFtNjxBW6EMNmTpjhShIZmxtPNzTJ5DtmARr8F+SMELp3JGJj/9Bm4TsvqJmGs
|
||||||
|
j9g/MVvSTjJlOuYPGJ5DBl3egZ5ZlRJx3I2qA4lFFCb71OJzuoR8YdHRlHnhJOu9
|
||||||
|
2Jyrki1wrAefby8Fe/+5vswxq2u+Qurjya716AUCgYB+E06ZGzmmLfH/6Vi/wzqC
|
||||||
|
F+w5FAzGGNECbtv2ogReL/YktRgElgaee45ig2aTd+h0UQQmWL+Gv/3XHU7MZM+C
|
||||||
|
MTvTHZRwGlD9h3e37q49hRUsr1pwJE6157HU91al0k9NknlBIigNY9vR2VbWW+/u
|
||||||
|
BUMomkpWz2ax5CqScuvuUQKBgQCE+zYqPe9kpy1iPWuQNKuDQhPfGO6cPjiDK44u
|
||||||
|
biqa2MRGetTXkBNRCS48QeKtMS3SNJKgUDOo2GXE0W2ZaTxx6vQzEpidCeGEn0NC
|
||||||
|
yKw0fwIk9spwvt/qvxyIJNhZ9Ev/vDBYvyyt03kKpLl66ocvtfmMCbZqPWQSKs2q
|
||||||
|
bl0UsQKBgQDDrsPnuVQiv6l0J9VrZc0f5DYZIJmQij1Rcg/fL1Dv2mEpADrH2hkY
|
||||||
|
HI27Q15dfgvccAGbGXbZt3xi7TCLDDm+Kl9V9bR2e2EhqA84tFryiBZ5XSDRAWPU
|
||||||
|
UIjejblTgtzrTqUd75XUkNoKvJIGrLApmQiBJRQbcbwtmt2pWbziyQ==
|
||||||
|
-----END RSA PRIVATE KEY-----
|
8
hack/scripts-dev/docker-dns/certs-gateway/Procfile
Normal file
8
hack/scripts-dev/docker-dns/certs-gateway/Procfile
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
# Use goreman to run `go get github.com/mattn/goreman`
|
||||||
|
etcd1: ./etcd --name m1 --data-dir /tmp/m1.data --listen-client-urls https://127.0.0.1:2379 --advertise-client-urls https://m1.etcd.local:2379 --listen-peer-urls https://127.0.0.1:2380 --initial-advertise-peer-urls=https://m1.etcd.local:2380 --initial-cluster-token tkn --initial-cluster=m1=https://m1.etcd.local:2380,m2=https://m2.etcd.local:22380,m3=https://m3.etcd.local:32380 --initial-cluster-state new --peer-cert-file=/certs-gateway/server.crt --peer-key-file=/certs-gateway/server.key.insecure --peer-trusted-ca-file=/certs-gateway/ca.crt --peer-client-cert-auth --cert-file=/certs-gateway/server.crt --key-file=/certs-gateway/server.key.insecure --trusted-ca-file=/certs-gateway/ca.crt --client-cert-auth
|
||||||
|
|
||||||
|
etcd2: ./etcd --name m2 --data-dir /tmp/m2.data --listen-client-urls https://127.0.0.1:22379 --advertise-client-urls https://m2.etcd.local:22379 --listen-peer-urls https://127.0.0.1:22380 --initial-advertise-peer-urls=https://m2.etcd.local:22380 --initial-cluster-token tkn --initial-cluster=m1=https://m1.etcd.local:2380,m2=https://m2.etcd.local:22380,m3=https://m3.etcd.local:32380 --initial-cluster-state new --peer-cert-file=/certs-gateway/server.crt --peer-key-file=/certs-gateway/server.key.insecure --peer-trusted-ca-file=/certs-gateway/ca.crt --peer-client-cert-auth --cert-file=/certs-gateway/server.crt --key-file=/certs-gateway/server.key.insecure --trusted-ca-file=/certs-gateway/ca.crt --client-cert-auth
|
||||||
|
|
||||||
|
etcd3: ./etcd --name m3 --data-dir /tmp/m3.data --listen-client-urls https://127.0.0.1:32379 --advertise-client-urls https://m3.etcd.local:32379 --listen-peer-urls https://127.0.0.1:32380 --initial-advertise-peer-urls=https://m3.etcd.local:32380 --initial-cluster-token tkn --initial-cluster=m1=https://m1.etcd.local:2380,m2=https://m2.etcd.local:22380,m3=https://m3.etcd.local:32380 --initial-cluster-state new --peer-cert-file=/certs-gateway/server.crt --peer-key-file=/certs-gateway/server.key.insecure --peer-trusted-ca-file=/certs-gateway/ca.crt --peer-client-cert-auth --cert-file=/certs-gateway/server.crt --key-file=/certs-gateway/server.key.insecure --trusted-ca-file=/certs-gateway/ca.crt --client-cert-auth
|
||||||
|
|
||||||
|
gateway: ./etcd gateway start --endpoints https://m1.etcd.local:2379,https://m2.etcd.local:22379,https://m3.etcd.local:32379 --trusted-ca-file /certs-gateway/ca.crt --listen-addr 127.0.0.1:23790
|
19
hack/scripts-dev/docker-dns/certs-gateway/ca-csr.json
Normal file
19
hack/scripts-dev/docker-dns/certs-gateway/ca-csr.json
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
{
|
||||||
|
"key": {
|
||||||
|
"algo": "rsa",
|
||||||
|
"size": 2048
|
||||||
|
},
|
||||||
|
"names": [
|
||||||
|
{
|
||||||
|
"O": "etcd",
|
||||||
|
"OU": "etcd Security",
|
||||||
|
"L": "San Francisco",
|
||||||
|
"ST": "California",
|
||||||
|
"C": "USA"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"CN": "ca",
|
||||||
|
"ca": {
|
||||||
|
"expiry": "87600h"
|
||||||
|
}
|
||||||
|
}
|
22
hack/scripts-dev/docker-dns/certs-gateway/ca.crt
Normal file
22
hack/scripts-dev/docker-dns/certs-gateway/ca.crt
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
-----BEGIN CERTIFICATE-----
|
||||||
|
MIIDsTCCApmgAwIBAgIUClliB9ECLPuQpOrlqLkeI1ib7zYwDQYJKoZIhvcNAQEL
|
||||||
|
BQAwbzEMMAoGA1UEBhMDVVNBMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQH
|
||||||
|
Ew1TYW4gRnJhbmNpc2NvMQ0wCwYDVQQKEwRldGNkMRYwFAYDVQQLEw1ldGNkIFNl
|
||||||
|
Y3VyaXR5MQswCQYDVQQDEwJjYTAeFw0xNzEyMDExOTE3MDBaFw0yNzExMjkxOTE3
|
||||||
|
MDBaMG8xDDAKBgNVBAYTA1VTQTETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UE
|
||||||
|
BxMNU2FuIEZyYW5jaXNjbzENMAsGA1UEChMEZXRjZDEWMBQGA1UECxMNZXRjZCBT
|
||||||
|
ZWN1cml0eTELMAkGA1UEAxMCY2EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK
|
||||||
|
AoIBAQCjClF0TCk2qrHUTjFgFv2jmV0yUqnP3SG/7eVCptcFKE7kcGAx+j06GfEP
|
||||||
|
UXmCV13cgE0dYYLtz7/g29BiZzlBLlLsmpBMM+S4nfVH9BGLbKCSnwp5ba816AuS
|
||||||
|
rc8+qmJ0fAo56snLQWoAlnZxZ1tVjAtj5ZrQP9QDK2djgyviPS4kqWQ7Ulbeqgs7
|
||||||
|
rGz56xAsyMTWYlotgZTnnZ3Pckr1FHXhwkO1rFK5+oMZPh2HhvXL9wv0/TMAypUv
|
||||||
|
oQqDzUfUvYeaKr6qy1ADc53SQjqeTXg0jOShmnWM2zC7MwX+VPh+6ZApk3NLXwgv
|
||||||
|
6wT0U1tNfvctp8JvC7FqqCEny9hdAgMBAAGjRTBDMA4GA1UdDwEB/wQEAwIBBjAS
|
||||||
|
BgNVHRMBAf8ECDAGAQH/AgECMB0GA1UdDgQWBBQWI6eUGqKWkCjOKGAYd+5K6eh5
|
||||||
|
GTANBgkqhkiG9w0BAQsFAAOCAQEAS3nIyLoGMsioLb89T1KMq+0NDDCx7R20EguT
|
||||||
|
qUvFUYKjzdxDA1RlZ2HzPxBJRwBc0Vf98pNtkWCkwUl5hxthndNQo7F9lLs/zNzp
|
||||||
|
bL4agho6kadIbcb4v/3g9XPSzqJ/ysfrwxZoBd7D+0PVGJjRTIJiN83Kt68IMx2b
|
||||||
|
8mFEBiMZiSJW+sRuKXMSJsubJE3QRn862y2ktq/lEJyYR6zC0MOeYR6BPIs/B6vU
|
||||||
|
8/iUbyk5ULc7NzWGytC+QKC3O9RTuA8MGF1aFaNSK7wDyrAlBZdxjWi52Mz3lJCK
|
||||||
|
ffBaVfvG55WKjwAqgNU17jK/Rxw1ev9mp4aCkXkD0KUTGLcoZw==
|
||||||
|
-----END CERTIFICATE-----
|
13
hack/scripts-dev/docker-dns/certs-gateway/gencert.json
Normal file
13
hack/scripts-dev/docker-dns/certs-gateway/gencert.json
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
{
|
||||||
|
"signing": {
|
||||||
|
"default": {
|
||||||
|
"usages": [
|
||||||
|
"signing",
|
||||||
|
"key encipherment",
|
||||||
|
"server auth",
|
||||||
|
"client auth"
|
||||||
|
],
|
||||||
|
"expiry": "87600h"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
26
hack/scripts-dev/docker-dns/certs-gateway/gencerts.sh
Executable file
26
hack/scripts-dev/docker-dns/certs-gateway/gencerts.sh
Executable file
@@ -0,0 +1,26 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
if ! [[ "$0" =~ "./gencerts.sh" ]]; then
|
||||||
|
echo "must be run from 'fixtures'"
|
||||||
|
exit 255
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ! which cfssl; then
|
||||||
|
echo "cfssl is not installed"
|
||||||
|
exit 255
|
||||||
|
fi
|
||||||
|
|
||||||
|
cfssl gencert --initca=true ./ca-csr.json | cfssljson --bare ./ca
|
||||||
|
mv ca.pem ca.crt
|
||||||
|
openssl x509 -in ca.crt -noout -text
|
||||||
|
|
||||||
|
# generate wildcard certificates DNS: *.etcd.local
|
||||||
|
cfssl gencert \
|
||||||
|
--ca ./ca.crt \
|
||||||
|
--ca-key ./ca-key.pem \
|
||||||
|
--config ./gencert.json \
|
||||||
|
./server-ca-csr.json | cfssljson --bare ./server
|
||||||
|
mv server.pem server.crt
|
||||||
|
mv server-key.pem server.key.insecure
|
||||||
|
|
||||||
|
rm -f *.csr *.pem *.stderr *.txt
|
47
hack/scripts-dev/docker-dns/certs-gateway/run.sh
Executable file
47
hack/scripts-dev/docker-dns/certs-gateway/run.sh
Executable file
@@ -0,0 +1,47 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
rm -rf /tmp/m1.data /tmp/m2.data /tmp/m3.data
|
||||||
|
|
||||||
|
/etc/init.d/bind9 start
|
||||||
|
|
||||||
|
# get rid of hosts so go lookup won't resolve 127.0.0.1 to localhost
|
||||||
|
cat /dev/null >/etc/hosts
|
||||||
|
|
||||||
|
goreman -f /certs-gateway/Procfile start &
|
||||||
|
|
||||||
|
# TODO: remove random sleeps
|
||||||
|
sleep 7s
|
||||||
|
|
||||||
|
ETCDCTL_API=3 ./etcdctl \
|
||||||
|
--cacert=/certs-gateway/ca.crt \
|
||||||
|
--cert=/certs-gateway/server.crt \
|
||||||
|
--key=/certs-gateway/server.key.insecure \
|
||||||
|
--endpoints=https://m1.etcd.local:2379 \
|
||||||
|
endpoint health --cluster
|
||||||
|
|
||||||
|
ETCDCTL_API=3 ./etcdctl \
|
||||||
|
--cacert=/certs-gateway/ca.crt \
|
||||||
|
--cert=/certs-gateway/server.crt \
|
||||||
|
--key=/certs-gateway/server.key.insecure \
|
||||||
|
--endpoints=https://m1.etcd.local:2379,https://m2.etcd.local:22379,https://m3.etcd.local:32379 \
|
||||||
|
put abc def
|
||||||
|
|
||||||
|
ETCDCTL_API=3 ./etcdctl \
|
||||||
|
--cacert=/certs-gateway/ca.crt \
|
||||||
|
--cert=/certs-gateway/server.crt \
|
||||||
|
--key=/certs-gateway/server.key.insecure \
|
||||||
|
--endpoints=https://m1.etcd.local:2379,https://m2.etcd.local:22379,https://m3.etcd.local:32379 \
|
||||||
|
get abc
|
||||||
|
|
||||||
|
ETCDCTL_API=3 ./etcdctl \
|
||||||
|
--cacert=/certs-gateway/ca.crt \
|
||||||
|
--cert=/certs-gateway/server.crt \
|
||||||
|
--key=/certs-gateway/server.key.insecure \
|
||||||
|
--endpoints=127.0.0.1:23790 \
|
||||||
|
put ghi jkl
|
||||||
|
|
||||||
|
ETCDCTL_API=3 ./etcdctl \
|
||||||
|
--cacert=/certs-gateway/ca.crt \
|
||||||
|
--cert=/certs-gateway/server.crt \
|
||||||
|
--key=/certs-gateway/server.key.insecure \
|
||||||
|
--endpoints=127.0.0.1:23790 \
|
||||||
|
get ghi
|
22
hack/scripts-dev/docker-dns/certs-gateway/server-ca-csr.json
Normal file
22
hack/scripts-dev/docker-dns/certs-gateway/server-ca-csr.json
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
{
|
||||||
|
"key": {
|
||||||
|
"algo": "rsa",
|
||||||
|
"size": 2048
|
||||||
|
},
|
||||||
|
"names": [
|
||||||
|
{
|
||||||
|
"O": "etcd",
|
||||||
|
"OU": "etcd Security",
|
||||||
|
"L": "San Francisco",
|
||||||
|
"ST": "California",
|
||||||
|
"C": "USA"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"hosts": [
|
||||||
|
"m1.etcd.local",
|
||||||
|
"m2.etcd.local",
|
||||||
|
"m3.etcd.local",
|
||||||
|
"127.0.0.1",
|
||||||
|
"localhost"
|
||||||
|
]
|
||||||
|
}
|
25
hack/scripts-dev/docker-dns/certs-gateway/server.crt
Normal file
25
hack/scripts-dev/docker-dns/certs-gateway/server.crt
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
-----BEGIN CERTIFICATE-----
|
||||||
|
MIIEKTCCAxGgAwIBAgIUDOkW+H3KLeHEwsovqOUMKKfEuqQwDQYJKoZIhvcNAQEL
|
||||||
|
BQAwbzEMMAoGA1UEBhMDVVNBMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQH
|
||||||
|
Ew1TYW4gRnJhbmNpc2NvMQ0wCwYDVQQKEwRldGNkMRYwFAYDVQQLEw1ldGNkIFNl
|
||||||
|
Y3VyaXR5MQswCQYDVQQDEwJjYTAeFw0xNzEyMDExOTE3MDBaFw0yNzExMjkxOTE3
|
||||||
|
MDBaMGIxDDAKBgNVBAYTA1VTQTETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UE
|
||||||
|
BxMNU2FuIEZyYW5jaXNjbzENMAsGA1UEChMEZXRjZDEWMBQGA1UECxMNZXRjZCBT
|
||||||
|
ZWN1cml0eTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANfu298kCxFY
|
||||||
|
KXAmdG5BeqnFoezAJQCtgv+ZRS0+OB4hVsahnNSsztEfIJnVSvYJTr1u+TGSbzBZ
|
||||||
|
q85ua3S92Mzo/71yoDlFjj1JfBmPdL1Ij1256LAwUYoPXgcACyiKpI1DnTlhwTvU
|
||||||
|
G41teQBo+u4sxr9beuNpLlehVbknH9JkTNaTbF9/B5hy5hQPomGvzPzzBNAfrb2B
|
||||||
|
EyqabnzoX4qv6cMsQSJrcOYQ8znnTPWa5WFP8rWujsvxOUjxikQn8d7lkzy+PHwq
|
||||||
|
zx69L9VzdoWyJgQ3m73SIMTgP+HL+OsxDfmbu++Ds+2i2Dgf/vdJku/rP+Wka7vn
|
||||||
|
yCM807xi96kCAwEAAaOByTCBxjAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYI
|
||||||
|
KwYBBQUHAwEGCCsGAQUFBwMCMAwGA1UdEwEB/wQCMAAwHQYDVR0OBBYEFAH+dsuv
|
||||||
|
L6qvUmB/w9eKl83+MGTtMB8GA1UdIwQYMBaAFBYjp5QaopaQKM4oYBh37krp6HkZ
|
||||||
|
MEcGA1UdEQRAMD6CDW0xLmV0Y2QubG9jYWyCDW0yLmV0Y2QubG9jYWyCDW0zLmV0
|
||||||
|
Y2QubG9jYWyCCWxvY2FsaG9zdIcEfwAAATANBgkqhkiG9w0BAQsFAAOCAQEAh049
|
||||||
|
srxFkiH9Lp8le3fJkuY25T/MUrmfa10RdNSKgj3qcpCMnf9nQjIWtaQsjoZJ5MQc
|
||||||
|
VIT3gWDWK8SWlpx+O2cVEQDG0ccv7gc38YGywVhMoQ5HthTAjLCbNk4TdKJOIk7D
|
||||||
|
hmfs7BHDvjRPi38CFklLzdUQaVCcvB43TNA3Y9M75oP/UGOSe3lJz1KKXOI/t+vA
|
||||||
|
5U3yxwXlVNJVsZgeWAbXN9F6WbCZDsz+4Obpk/LV1NLqgLd/hHXzoOOWNw977S2b
|
||||||
|
+dOd95OJ/cq09OzKn/g26NgtHOl0xqol7wIwqJhweEEiVueyFxXD04jcsxdAFZSJ
|
||||||
|
9H6q3inNQaLyJHSYWQ==
|
||||||
|
-----END CERTIFICATE-----
|
@@ -0,0 +1,27 @@
|
|||||||
|
-----BEGIN RSA PRIVATE KEY-----
|
||||||
|
MIIEpAIBAAKCAQEA1+7b3yQLEVgpcCZ0bkF6qcWh7MAlAK2C/5lFLT44HiFWxqGc
|
||||||
|
1KzO0R8gmdVK9glOvW75MZJvMFmrzm5rdL3YzOj/vXKgOUWOPUl8GY90vUiPXbno
|
||||||
|
sDBRig9eBwALKIqkjUOdOWHBO9QbjW15AGj67izGv1t642kuV6FVuScf0mRM1pNs
|
||||||
|
X38HmHLmFA+iYa/M/PME0B+tvYETKppufOhfiq/pwyxBImtw5hDzOedM9ZrlYU/y
|
||||||
|
ta6Oy/E5SPGKRCfx3uWTPL48fCrPHr0v1XN2hbImBDebvdIgxOA/4cv46zEN+Zu7
|
||||||
|
74Oz7aLYOB/+90mS7+s/5aRru+fIIzzTvGL3qQIDAQABAoIBABO8azA79R8Ctdbg
|
||||||
|
TOf+6B04SRKAhWFIep6t/ZqjAzINzgadot31ZXnLpIkq640NULsTt4cGYU9EAuX9
|
||||||
|
RakH6RbhfO5t2aMiblu/qa4UZJEgXqosYc4ovGsn+GofYOW1tlCLC4XBH44+Vr5Y
|
||||||
|
cSTOc5DtWsUGsXazmF6+Cj3AC7KI+VWegHexGezyO0not8Q5L55TuH2lCW4sx9th
|
||||||
|
W4Q7jg2lrCvz4x8ZRIAXOGmBaDTZmMtVlEjezu+7xr8QDQsvUwj7a87HPjgXFesj
|
||||||
|
CbbCr8kaqEdZ23AVDZuLAKS4hWQlbacRhRAxMkomZkg5U6J/PC3ikIqfOda1zu1D
|
||||||
|
MTIOuwECgYEA8hFkISWVEzbaIZgO1BZl36wNaOLYIpX0CzlycptcEssbefLy7Nxo
|
||||||
|
TZ+m9AjF6TBPl4fO4edo00iiJMy6ZdhItduNWLO+usJEY9UdzHex7fCUeG8usUXQ
|
||||||
|
g4VGEvPGg88VEM45pkAgbga7kzkG2Ihfu6La5apbXeOpNpuC58DdlzkCgYEA5Fxl
|
||||||
|
/qGzLlTwioaaE+qpEX46MfbJl38nkeSf9B7J1ISc/fnDPcBPvcHaYELqyHM+7OFa
|
||||||
|
Gt9oBDrLgyP4ZgOTaHKHdofXjAMC97b9oa/Lrors5dMrf/fxTTe2X+Kab94E1Wbo
|
||||||
|
39kA3qzV/CT7EZWuqbHO3Bqkv/qe6ks0Tbahc/ECgYBuB2OpAWkyc6NQ08ohsxCZ
|
||||||
|
S55Ix5uQlPJ5y6Hu4BlI3ZNeqgSrjz/F0MTVdctnxDLZYLyzyDjImOJCseAj/NyH
|
||||||
|
9QTZhdIzF6x4aF2EG///dHQ4Del+YIp3zbNdV/sq3Izpt6NSoyFagarvL2OiNtK0
|
||||||
|
+kBfVkDze1Dl5mfpKaxPWQKBgQC+gXqxJxKE92VIGyxUqzHqHwTLg9b/ZJuNMU5j
|
||||||
|
aH/1o8AYfJFtZY7gfeUA4zJckRAQq5rwyilLRgVbXNmvuRHzU4BA2OhvrF+Aag9D
|
||||||
|
IJXqAYnJ3RXwBtcuFOk3KqKt6mjb4qMpgy4flc5aMDunmtiARo6MvklswtZqHN0A
|
||||||
|
a/ha8QKBgQCqF/xCf5ORzVkikYYGsO910QXlzsyPdRJbhrBCRTsdhz/paT5GQQXr
|
||||||
|
y3ToUuKEoHfjFudUeGNOstjchWw+WgT9iqMJhtwV1nU1lkPyjmCQ2ONIP+13dZ+i
|
||||||
|
I/LDyMngtOKzvD5qpswY1Er+84+RVrtseQjXDC2NlrvDr5LnZDtGag==
|
||||||
|
-----END RSA PRIVATE KEY-----
|
6
hack/scripts-dev/docker-dns/certs-wildcard/Procfile
Normal file
6
hack/scripts-dev/docker-dns/certs-wildcard/Procfile
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
# Use goreman to run `go get github.com/mattn/goreman`
|
||||||
|
etcd1: ./etcd --name m1 --data-dir /tmp/m1.data --listen-client-urls https://127.0.0.1:2379 --advertise-client-urls https://m1.etcd.local:2379 --listen-peer-urls https://127.0.0.1:2380 --initial-advertise-peer-urls=https://m1.etcd.local:2380 --initial-cluster-token tkn --initial-cluster=m1=https://m1.etcd.local:2380,m2=https://m2.etcd.local:22380,m3=https://m3.etcd.local:32380 --initial-cluster-state new --peer-cert-file=/certs-wildcard/server.crt --peer-key-file=/certs-wildcard/server.key.insecure --peer-trusted-ca-file=/certs-wildcard/ca.crt --peer-client-cert-auth --cert-file=/certs-wildcard/server.crt --key-file=/certs-wildcard/server.key.insecure --trusted-ca-file=/certs-wildcard/ca.crt --client-cert-auth
|
||||||
|
|
||||||
|
etcd2: ./etcd --name m2 --data-dir /tmp/m2.data --listen-client-urls https://127.0.0.1:22379 --advertise-client-urls https://m2.etcd.local:22379 --listen-peer-urls https://127.0.0.1:22380 --initial-advertise-peer-urls=https://m2.etcd.local:22380 --initial-cluster-token tkn --initial-cluster=m1=https://m1.etcd.local:2380,m2=https://m2.etcd.local:22380,m3=https://m3.etcd.local:32380 --initial-cluster-state new --peer-cert-file=/certs-wildcard/server.crt --peer-key-file=/certs-wildcard/server.key.insecure --peer-trusted-ca-file=/certs-wildcard/ca.crt --peer-client-cert-auth --cert-file=/certs-wildcard/server.crt --key-file=/certs-wildcard/server.key.insecure --trusted-ca-file=/certs-wildcard/ca.crt --client-cert-auth
|
||||||
|
|
||||||
|
etcd3: ./etcd --name m3 --data-dir /tmp/m3.data --listen-client-urls https://127.0.0.1:32379 --advertise-client-urls https://m3.etcd.local:32379 --listen-peer-urls https://127.0.0.1:32380 --initial-advertise-peer-urls=https://m3.etcd.local:32380 --initial-cluster-token tkn --initial-cluster=m1=https://m1.etcd.local:2380,m2=https://m2.etcd.local:22380,m3=https://m3.etcd.local:32380 --initial-cluster-state new --peer-cert-file=/certs-wildcard/server.crt --peer-key-file=/certs-wildcard/server.key.insecure --peer-trusted-ca-file=/certs-wildcard/ca.crt --peer-client-cert-auth --cert-file=/certs-wildcard/server.crt --key-file=/certs-wildcard/server.key.insecure --trusted-ca-file=/certs-wildcard/ca.crt --client-cert-auth
|
19
hack/scripts-dev/docker-dns/certs-wildcard/ca-csr.json
Normal file
19
hack/scripts-dev/docker-dns/certs-wildcard/ca-csr.json
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
{
|
||||||
|
"key": {
|
||||||
|
"algo": "rsa",
|
||||||
|
"size": 2048
|
||||||
|
},
|
||||||
|
"names": [
|
||||||
|
{
|
||||||
|
"O": "etcd",
|
||||||
|
"OU": "etcd Security",
|
||||||
|
"L": "San Francisco",
|
||||||
|
"ST": "California",
|
||||||
|
"C": "USA"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"CN": "ca",
|
||||||
|
"ca": {
|
||||||
|
"expiry": "87600h"
|
||||||
|
}
|
||||||
|
}
|
22
hack/scripts-dev/docker-dns/certs-wildcard/ca.crt
Normal file
22
hack/scripts-dev/docker-dns/certs-wildcard/ca.crt
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
-----BEGIN CERTIFICATE-----
|
||||||
|
MIIDsTCCApmgAwIBAgIUanA77pXfEz2idrPSlIoPrSo6MmcwDQYJKoZIhvcNAQEL
|
||||||
|
BQAwbzEMMAoGA1UEBhMDVVNBMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQH
|
||||||
|
Ew1TYW4gRnJhbmNpc2NvMQ0wCwYDVQQKEwRldGNkMRYwFAYDVQQLEw1ldGNkIFNl
|
||||||
|
Y3VyaXR5MQswCQYDVQQDEwJjYTAeFw0xNzExMTMwNDA5MDBaFw0yNzExMTEwNDA5
|
||||||
|
MDBaMG8xDDAKBgNVBAYTA1VTQTETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UE
|
||||||
|
BxMNU2FuIEZyYW5jaXNjbzENMAsGA1UEChMEZXRjZDEWMBQGA1UECxMNZXRjZCBT
|
||||||
|
ZWN1cml0eTELMAkGA1UEAxMCY2EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK
|
||||||
|
AoIBAQDqtw5G6XZ4N2uuc7TAoiXI+IXA/H+IJIbHrVFQ3LIzLDaS6AmVWw4yT4o2
|
||||||
|
X/1IbR5TU6dCnGxuHPutnfnG87is5Oxk1HfIy5cfpf75St3uQycJRcr3Bui/fEZ0
|
||||||
|
IZaoRyklcYGI8Y+VfaSADl++EP7UU0X7cc263rZulJXkqp4HihDTPixBgVDruNWf
|
||||||
|
Yfa2K/Zhiq+zj3hE6s/cBn2pIdY6SMlQ1P0uT/Y5oBTTJFBxeqw+Sz/NXgKgErQg
|
||||||
|
Za/gNHQWzyRoYHiOGQylvsiXr6tgdk29f0Z6gTQy8FQpwOXYERJr45zh8KvE+FJK
|
||||||
|
MaWUhGW7hkv85JDZSsmDZ6lVYIfhAgMBAAGjRTBDMA4GA1UdDwEB/wQEAwIBBjAS
|
||||||
|
BgNVHRMBAf8ECDAGAQH/AgECMB0GA1UdDgQWBBS+p7B3RLjI8HOOPvVhqtBQNRmH
|
||||||
|
ZTANBgkqhkiG9w0BAQsFAAOCAQEAFWHLvzzTRQJYjVDxBuXrNZkhFsGAoCYoXhAK
|
||||||
|
1nXmqLb9/dPMxjkB4ptkQNuP8cMCMPMlapoLkHxEihN1sWZwJRfWShRTK2cQ2kd6
|
||||||
|
IKH/M3/ido1PqN/CxhfqvMj3ap3ZkV81nvwn3XhciCGca1CyLzij9RroO0Ee+R3h
|
||||||
|
mK5A38I1YeRMNOnNAJAW+5scaVtPe6famG2p/OcswobF+ojeZIQJcuk7/FP5iXGA
|
||||||
|
UfG5WaW3bVfSr5aUGtf/RYZvYu3kWZlAzGaey5iLutRc7f63Ma4jjEEauiGLqQ+6
|
||||||
|
F17Feafs2ibRr1wes11O0B/9Ivx9qM/CFgEYhJfp/nBgY/UZXw==
|
||||||
|
-----END CERTIFICATE-----
|
13
hack/scripts-dev/docker-dns/certs-wildcard/gencert.json
Normal file
13
hack/scripts-dev/docker-dns/certs-wildcard/gencert.json
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
{
|
||||||
|
"signing": {
|
||||||
|
"default": {
|
||||||
|
"usages": [
|
||||||
|
"signing",
|
||||||
|
"key encipherment",
|
||||||
|
"server auth",
|
||||||
|
"client auth"
|
||||||
|
],
|
||||||
|
"expiry": "87600h"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
26
hack/scripts-dev/docker-dns/certs-wildcard/gencerts.sh
Executable file
26
hack/scripts-dev/docker-dns/certs-wildcard/gencerts.sh
Executable file
@@ -0,0 +1,26 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
if ! [[ "$0" =~ "./gencerts.sh" ]]; then
|
||||||
|
echo "must be run from 'fixtures'"
|
||||||
|
exit 255
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ! which cfssl; then
|
||||||
|
echo "cfssl is not installed"
|
||||||
|
exit 255
|
||||||
|
fi
|
||||||
|
|
||||||
|
cfssl gencert --initca=true ./ca-csr.json | cfssljson --bare ./ca
|
||||||
|
mv ca.pem ca.crt
|
||||||
|
openssl x509 -in ca.crt -noout -text
|
||||||
|
|
||||||
|
# generate wildcard certificates DNS: *.etcd.local
|
||||||
|
cfssl gencert \
|
||||||
|
--ca ./ca.crt \
|
||||||
|
--ca-key ./ca-key.pem \
|
||||||
|
--config ./gencert.json \
|
||||||
|
./server-ca-csr.json | cfssljson --bare ./server
|
||||||
|
mv server.pem server.crt
|
||||||
|
mv server-key.pem server.key.insecure
|
||||||
|
|
||||||
|
rm -f *.csr *.pem *.stderr *.txt
|
33
hack/scripts-dev/docker-dns/certs-wildcard/run.sh
Executable file
33
hack/scripts-dev/docker-dns/certs-wildcard/run.sh
Executable file
@@ -0,0 +1,33 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
rm -rf /tmp/m1.data /tmp/m2.data /tmp/m3.data
|
||||||
|
|
||||||
|
/etc/init.d/bind9 start
|
||||||
|
|
||||||
|
# get rid of hosts so go lookup won't resolve 127.0.0.1 to localhost
|
||||||
|
cat /dev/null >/etc/hosts
|
||||||
|
|
||||||
|
goreman -f /certs-wildcard/Procfile start &
|
||||||
|
|
||||||
|
# TODO: remove random sleeps
|
||||||
|
sleep 7s
|
||||||
|
|
||||||
|
ETCDCTL_API=3 ./etcdctl \
|
||||||
|
--cacert=/certs-wildcard/ca.crt \
|
||||||
|
--cert=/certs-wildcard/server.crt \
|
||||||
|
--key=/certs-wildcard/server.key.insecure \
|
||||||
|
--endpoints=https://m1.etcd.local:2379 \
|
||||||
|
endpoint health --cluster
|
||||||
|
|
||||||
|
ETCDCTL_API=3 ./etcdctl \
|
||||||
|
--cacert=/certs-wildcard/ca.crt \
|
||||||
|
--cert=/certs-wildcard/server.crt \
|
||||||
|
--key=/certs-wildcard/server.key.insecure \
|
||||||
|
--endpoints=https://m1.etcd.local:2379,https://m2.etcd.local:22379,https://m3.etcd.local:32379 \
|
||||||
|
put abc def
|
||||||
|
|
||||||
|
ETCDCTL_API=3 ./etcdctl \
|
||||||
|
--cacert=/certs-wildcard/ca.crt \
|
||||||
|
--cert=/certs-wildcard/server.crt \
|
||||||
|
--key=/certs-wildcard/server.key.insecure \
|
||||||
|
--endpoints=https://m1.etcd.local:2379,https://m2.etcd.local:22379,https://m3.etcd.local:32379 \
|
||||||
|
get abc
|
@@ -0,0 +1,20 @@
|
|||||||
|
{
|
||||||
|
"key": {
|
||||||
|
"algo": "rsa",
|
||||||
|
"size": 2048
|
||||||
|
},
|
||||||
|
"names": [
|
||||||
|
{
|
||||||
|
"O": "etcd",
|
||||||
|
"OU": "etcd Security",
|
||||||
|
"L": "San Francisco",
|
||||||
|
"ST": "California",
|
||||||
|
"C": "USA"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"hosts": [
|
||||||
|
"*.etcd.local",
|
||||||
|
"127.0.0.1",
|
||||||
|
"localhost"
|
||||||
|
]
|
||||||
|
}
|
24
hack/scripts-dev/docker-dns/certs-wildcard/server.crt
Normal file
24
hack/scripts-dev/docker-dns/certs-wildcard/server.crt
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
-----BEGIN CERTIFICATE-----
|
||||||
|
MIIECjCCAvKgAwIBAgIUQ0AgAKntDzHW4JxYheDkVMow5ykwDQYJKoZIhvcNAQEL
|
||||||
|
BQAwbzEMMAoGA1UEBhMDVVNBMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQH
|
||||||
|
Ew1TYW4gRnJhbmNpc2NvMQ0wCwYDVQQKEwRldGNkMRYwFAYDVQQLEw1ldGNkIFNl
|
||||||
|
Y3VyaXR5MQswCQYDVQQDEwJjYTAeFw0xNzExMTMwNDA5MDBaFw0yNzExMTEwNDA5
|
||||||
|
MDBaMGIxDDAKBgNVBAYTA1VTQTETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UE
|
||||||
|
BxMNU2FuIEZyYW5jaXNjbzENMAsGA1UEChMEZXRjZDEWMBQGA1UECxMNZXRjZCBT
|
||||||
|
ZWN1cml0eTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANMqNEozhdLm
|
||||||
|
K5ATSkgIOyQmBmoUCgiWB+P52YWzfmwaWwQP2FFs3qih2c3DHHH7s2zdceXKT2ZN
|
||||||
|
lvSO8yj08slLPYSC4LQ3su8njGJlasJ28JMjRqshnH3umxFXf9+aPcZ5yYkoXE9V
|
||||||
|
fzsnBMJz8hI6K2j4Q6sJe+v/0pdz8MpbdIPnmL9qfVpuD6JqmDCZiQOJ8lpMuqqD
|
||||||
|
60uLjtLv/JKjgdqe5C4psERVm09fg3vOZckv9CC6a4MupeXo2il6femZnPrxC8LX
|
||||||
|
u2KT3njEjoyzEu2NSdy+BUJDVLgKSh8s2TC8ViNfiFONQo6L1y78ZAyCDrRbTgN9
|
||||||
|
Nu1Ou/yzqHkCAwEAAaOBqjCBpzAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYI
|
||||||
|
KwYBBQUHAwEGCCsGAQUFBwMCMAwGA1UdEwEB/wQCMAAwHQYDVR0OBBYEFC83cRfE
|
||||||
|
/EKcz7GJKmgDLUBi3kRSMB8GA1UdIwQYMBaAFL6nsHdEuMjwc44+9WGq0FA1GYdl
|
||||||
|
MCgGA1UdEQQhMB+CDCouZXRjZC5sb2NhbIIJbG9jYWxob3N0hwR/AAABMA0GCSqG
|
||||||
|
SIb3DQEBCwUAA4IBAQCI7estG86E9IEGREfYul1ej8hltpiAxucmsI0i0lyRHOGa
|
||||||
|
dss3CKs6TWe5LWXThCIJ2WldI/VgPe63Ezz7WuP3EJxt9QclYArIklS/WN+Bjbn7
|
||||||
|
6b8KAtGQkFh7hhjoyilBixpGjECcc7lbriXoEpmUZj9DYQymXWtjKeUJCfQjseNS
|
||||||
|
V/fmsPph8QveN+pGCypdQ9EA4LGXErg4DQMIo40maYf9/uGBMIrddi930llB0wAh
|
||||||
|
lsGNUDkrKKJVs2PiVsy8p8sF1h7zAQ+gSqk3ZuWjrTqIIMHtRfIaNICimc7wEy1t
|
||||||
|
u5fbySMusy1PRAwHVdl5yPxx++KlHyBNowh/9OJh
|
||||||
|
-----END CERTIFICATE-----
|
@@ -0,0 +1,27 @@
|
|||||||
|
-----BEGIN RSA PRIVATE KEY-----
|
||||||
|
MIIEowIBAAKCAQEA0yo0SjOF0uYrkBNKSAg7JCYGahQKCJYH4/nZhbN+bBpbBA/Y
|
||||||
|
UWzeqKHZzcMccfuzbN1x5cpPZk2W9I7zKPTyyUs9hILgtDey7yeMYmVqwnbwkyNG
|
||||||
|
qyGcfe6bEVd/35o9xnnJiShcT1V/OycEwnPyEjoraPhDqwl76//Sl3Pwylt0g+eY
|
||||||
|
v2p9Wm4PomqYMJmJA4nyWky6qoPrS4uO0u/8kqOB2p7kLimwRFWbT1+De85lyS/0
|
||||||
|
ILprgy6l5ejaKXp96Zmc+vELwte7YpPeeMSOjLMS7Y1J3L4FQkNUuApKHyzZMLxW
|
||||||
|
I1+IU41CjovXLvxkDIIOtFtOA3027U67/LOoeQIDAQABAoIBAH/sM104NTv8QCu5
|
||||||
|
4+gbRGizuHMOzL1C1mjfdU0v3chzduvRBYTeZUzXL/Ec3+CVUK8Ev/krREp/epGQ
|
||||||
|
//Gx4lrbf9sExkem7nk/Biadtb00/KzGVAtcA0evArXQwiCdegsAwHycvL861ibp
|
||||||
|
jlKWlvE/2AhxTd0Rk8b2ZYdmr1qGTesIy7S4ilj1B8aYWnZglhSyyU7TqLhYmsWo
|
||||||
|
3B1ufNpkPCzo97bJmc1/bqXCIQXi/HkkDxJRFa/vESebiy2wdgkWflybW37vLaN0
|
||||||
|
mox44uXpVYtZuuGyxdKjX6T2EOglZztXlC8gdxrnFS5leyBEu+7ABS5OvHgnlOX5
|
||||||
|
80MyUpkCgYEA/4xpEBltbeJPH52Lla8VrcW3nGWPnfY8xUSnjKBspswTQPu389EO
|
||||||
|
ayM3DewcpIfxFu/BlMzKz0lm77QQZIu3gIJoEu8IXzUa3fJ2IavRKPSvbNFj5Icl
|
||||||
|
kVX+mE4BtF+tnAjDWiX9qaNXZcU7b0/q0yXzL35WB4H7Op4axqBir/sCgYEA04m3
|
||||||
|
4LtRKWgObQXqNaw+8yEvznWdqVlJngyKoJkSVnqwWRuin9eZDfc84genxxT0rGI9
|
||||||
|
/3Fw8enfBVIYGLR5V5aYmGfYyRCkN4aeRc0zDlInm0x2UcZShT8D0LktufwRYZh8
|
||||||
|
Ui6+iiIBELwxyyWfuybH5hhstbdFazfu1yNA+xsCgYB47tORYNceVyimh4HU9iRG
|
||||||
|
NfjsNEvArxSXLiQ0Mn74eD7sU7L72QT/wox9NC1h10tKVW/AoSGg8tWZvha73jqa
|
||||||
|
wBvMSf4mQBVUzzcEPDEhNpoF3xlsvmAS5SU0okXAPD8GRkdcU/o02y2y5aF4zdMM
|
||||||
|
1Tq+UQUZTHO9i7CUKrZJHQKBgQC+FueRn0ITv1oXRlVs3dfDi3L2SGLhJ0csK4D3
|
||||||
|
SBZed+m4aUj98jOrhRzE0LRIBeDId4/W2A3ylYK/uUHGEYdo2f9OFSONqtKmwuW/
|
||||||
|
O+JBYDoPJ+q7GUhWTIYVLhKVKppD5U7yWucGIgBrFXJ5Ztnex76iWhh2Qray3pRV
|
||||||
|
52whOQKBgHVBI4F7pkn6id9W4sx2LqrVjpjw6vTDepIRK0SXBIQp34WnCL5CERDJ
|
||||||
|
pks203i42Ww7IadufepkGQOfwuik9wVRNWrNp4oKle6oNK9oK3ihuyb+5DtyKwDm
|
||||||
|
5sQUYUXc5E3qDQhHCGDzbT7wP+bCDnWKgvV6smshuQSW8M+tFIOQ
|
||||||
|
-----END RSA PRIVATE KEY-----
|
6
hack/scripts-dev/docker-dns/certs/Procfile
Normal file
6
hack/scripts-dev/docker-dns/certs/Procfile
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
# Use goreman to run `go get github.com/mattn/goreman`
|
||||||
|
etcd1: ./etcd --name m1 --data-dir /tmp/m1.data --listen-client-urls https://127.0.0.1:2379 --advertise-client-urls https://m1.etcd.local:2379 --listen-peer-urls https://127.0.0.1:2380 --initial-advertise-peer-urls=https://m1.etcd.local:2380 --initial-cluster-token tkn --initial-cluster=m1=https://m1.etcd.local:2380,m2=https://m2.etcd.local:22380,m3=https://m3.etcd.local:32380 --initial-cluster-state new --peer-cert-file=/certs/server.crt --peer-key-file=/certs/server.key.insecure --peer-trusted-ca-file=/certs/ca.crt --peer-client-cert-auth --cert-file=/certs/server.crt --key-file=/certs/server.key.insecure --trusted-ca-file=/certs/ca.crt --client-cert-auth
|
||||||
|
|
||||||
|
etcd2: ./etcd --name m2 --data-dir /tmp/m2.data --listen-client-urls https://127.0.0.1:22379 --advertise-client-urls https://m2.etcd.local:22379 --listen-peer-urls https://127.0.0.1:22380 --initial-advertise-peer-urls=https://m2.etcd.local:22380 --initial-cluster-token tkn --initial-cluster=m1=https://m1.etcd.local:2380,m2=https://m2.etcd.local:22380,m3=https://m3.etcd.local:32380 --initial-cluster-state new --peer-cert-file=/certs/server.crt --peer-key-file=/certs/server.key.insecure --peer-trusted-ca-file=/certs/ca.crt --peer-client-cert-auth --cert-file=/certs/server.crt --key-file=/certs/server.key.insecure --trusted-ca-file=/certs/ca.crt --client-cert-auth
|
||||||
|
|
||||||
|
etcd3: ./etcd --name m3 --data-dir /tmp/m3.data --listen-client-urls https://127.0.0.1:32379 --advertise-client-urls https://m3.etcd.local:32379 --listen-peer-urls https://127.0.0.1:32380 --initial-advertise-peer-urls=https://m3.etcd.local:32380 --initial-cluster-token tkn --initial-cluster=m1=https://m1.etcd.local:2380,m2=https://m2.etcd.local:22380,m3=https://m3.etcd.local:32380 --initial-cluster-state new --peer-cert-file=/certs/server.crt --peer-key-file=/certs/server.key.insecure --peer-trusted-ca-file=/certs/ca.crt --peer-client-cert-auth --cert-file=/certs/server.crt --key-file=/certs/server.key.insecure --trusted-ca-file=/certs/ca.crt --client-cert-auth
|
19
hack/scripts-dev/docker-dns/certs/ca-csr.json
Normal file
19
hack/scripts-dev/docker-dns/certs/ca-csr.json
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
{
|
||||||
|
"key": {
|
||||||
|
"algo": "rsa",
|
||||||
|
"size": 2048
|
||||||
|
},
|
||||||
|
"names": [
|
||||||
|
{
|
||||||
|
"O": "etcd",
|
||||||
|
"OU": "etcd Security",
|
||||||
|
"L": "San Francisco",
|
||||||
|
"ST": "California",
|
||||||
|
"C": "USA"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"CN": "ca",
|
||||||
|
"ca": {
|
||||||
|
"expiry": "87600h"
|
||||||
|
}
|
||||||
|
}
|
22
hack/scripts-dev/docker-dns/certs/ca.crt
Normal file
22
hack/scripts-dev/docker-dns/certs/ca.crt
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
-----BEGIN CERTIFICATE-----
|
||||||
|
MIIDsTCCApmgAwIBAgIUCeu/ww6+XbCM3m8m6fp17t8bjOcwDQYJKoZIhvcNAQEL
|
||||||
|
BQAwbzEMMAoGA1UEBhMDVVNBMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQH
|
||||||
|
Ew1TYW4gRnJhbmNpc2NvMQ0wCwYDVQQKEwRldGNkMRYwFAYDVQQLEw1ldGNkIFNl
|
||||||
|
Y3VyaXR5MQswCQYDVQQDEwJjYTAeFw0xNzExMTMwNDA2MDBaFw0yNzExMTEwNDA2
|
||||||
|
MDBaMG8xDDAKBgNVBAYTA1VTQTETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UE
|
||||||
|
BxMNU2FuIEZyYW5jaXNjbzENMAsGA1UEChMEZXRjZDEWMBQGA1UECxMNZXRjZCBT
|
||||||
|
ZWN1cml0eTELMAkGA1UEAxMCY2EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK
|
||||||
|
AoIBAQCgH8KMvldAoQjWA5YQoEOQgRyjZ3hkKdTQcFBj3OR8OyhiNJ+4oEJ/AqyJ
|
||||||
|
b41G9NGd+88hRSrcCeUBrUY3nWVhqzclCe7mQ1IyordmuKxekmPD/uvzcbySzpJT
|
||||||
|
qGEwNEiiBcr4mSQiGA5yMgBLKLpKw27t0ncVn/Qt0rKtqwLUYYWGEfADLw7+6iDK
|
||||||
|
xzCxLeXV/cB1VtFZa62j3KRJR4XQ/QosqwZw2dRGF/jUZgmsRYYK8noOvqY/uRPV
|
||||||
|
sqwGAKq0B0zOMp185dFrzJVD+LHZgSS9GLGmvRgttwayDuYSOny7WXugQ28fCaRX
|
||||||
|
p+53s1eBb5cHCGSko48f2329cnlFAgMBAAGjRTBDMA4GA1UdDwEB/wQEAwIBBjAS
|
||||||
|
BgNVHRMBAf8ECDAGAQH/AgECMB0GA1UdDgQWBBSgglhjDWaAJm9ju5x1YMArtH7c
|
||||||
|
yjANBgkqhkiG9w0BAQsFAAOCAQEAK6IGimbnP9oFSvwNGmXjEtn/vE82dDhQJv8k
|
||||||
|
oiAsx0JurXBYybvu/MLaBJVQ6bF77hW/fzvhMOzLNEMGY1ql80TmfaTqyPpTN85I
|
||||||
|
6YhXOViZEQJvH17lVA8d57aSve0WPZqBqS3xI0dGpn/Ji6JPrjKCrgjeukXXHR+L
|
||||||
|
MScK1lpxaCjD45SMJCzANsMnIKTiKN8RnIcSmnrr/gGl7bC6Y7P84xUGgYu2hvNG
|
||||||
|
1DZBcelmzbZYk2DtbrR0Ed6IFD1Tz4RAEuKJfInjgAP2da41j4smoecXOsJMGVl5
|
||||||
|
5RX7ba3Hohys6la8jSS3opCPKkwEN9mQaB++iN1qoZFY4qB9gg==
|
||||||
|
-----END CERTIFICATE-----
|
13
hack/scripts-dev/docker-dns/certs/gencert.json
Normal file
13
hack/scripts-dev/docker-dns/certs/gencert.json
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
{
|
||||||
|
"signing": {
|
||||||
|
"default": {
|
||||||
|
"usages": [
|
||||||
|
"signing",
|
||||||
|
"key encipherment",
|
||||||
|
"server auth",
|
||||||
|
"client auth"
|
||||||
|
],
|
||||||
|
"expiry": "87600h"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
26
hack/scripts-dev/docker-dns/certs/gencerts.sh
Executable file
26
hack/scripts-dev/docker-dns/certs/gencerts.sh
Executable file
@@ -0,0 +1,26 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
if ! [[ "$0" =~ "./gencerts.sh" ]]; then
|
||||||
|
echo "must be run from 'fixtures'"
|
||||||
|
exit 255
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ! which cfssl; then
|
||||||
|
echo "cfssl is not installed"
|
||||||
|
exit 255
|
||||||
|
fi
|
||||||
|
|
||||||
|
cfssl gencert --initca=true ./ca-csr.json | cfssljson --bare ./ca
|
||||||
|
mv ca.pem ca.crt
|
||||||
|
openssl x509 -in ca.crt -noout -text
|
||||||
|
|
||||||
|
# generate wildcard certificates DNS: *.etcd.local
|
||||||
|
cfssl gencert \
|
||||||
|
--ca ./ca.crt \
|
||||||
|
--ca-key ./ca-key.pem \
|
||||||
|
--config ./gencert.json \
|
||||||
|
./server-ca-csr.json | cfssljson --bare ./server
|
||||||
|
mv server.pem server.crt
|
||||||
|
mv server-key.pem server.key.insecure
|
||||||
|
|
||||||
|
rm -f *.csr *.pem *.stderr *.txt
|
33
hack/scripts-dev/docker-dns/certs/run.sh
Executable file
33
hack/scripts-dev/docker-dns/certs/run.sh
Executable file
@@ -0,0 +1,33 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
rm -rf /tmp/m1.data /tmp/m2.data /tmp/m3.data
|
||||||
|
|
||||||
|
/etc/init.d/bind9 start
|
||||||
|
|
||||||
|
# get rid of hosts so go lookup won't resolve 127.0.0.1 to localhost
|
||||||
|
cat /dev/null >/etc/hosts
|
||||||
|
|
||||||
|
goreman -f /certs/Procfile start &
|
||||||
|
|
||||||
|
# TODO: remove random sleeps
|
||||||
|
sleep 7s
|
||||||
|
|
||||||
|
ETCDCTL_API=3 ./etcdctl \
|
||||||
|
--cacert=/certs/ca.crt \
|
||||||
|
--cert=/certs/server.crt \
|
||||||
|
--key=/certs/server.key.insecure \
|
||||||
|
--endpoints=https://m1.etcd.local:2379 \
|
||||||
|
endpoint health --cluster
|
||||||
|
|
||||||
|
ETCDCTL_API=3 ./etcdctl \
|
||||||
|
--cacert=/certs/ca.crt \
|
||||||
|
--cert=/certs/server.crt \
|
||||||
|
--key=/certs/server.key.insecure \
|
||||||
|
--endpoints=https://m1.etcd.local:2379,https://m2.etcd.local:22379,https://m3.etcd.local:32379 \
|
||||||
|
put abc def
|
||||||
|
|
||||||
|
ETCDCTL_API=3 ./etcdctl \
|
||||||
|
--cacert=/certs/ca.crt \
|
||||||
|
--cert=/certs/server.crt \
|
||||||
|
--key=/certs/server.key.insecure \
|
||||||
|
--endpoints=https://m1.etcd.local:2379,https://m2.etcd.local:22379,https://m3.etcd.local:32379 \
|
||||||
|
get abc
|
22
hack/scripts-dev/docker-dns/certs/server-ca-csr.json
Normal file
22
hack/scripts-dev/docker-dns/certs/server-ca-csr.json
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
{
|
||||||
|
"key": {
|
||||||
|
"algo": "rsa",
|
||||||
|
"size": 2048
|
||||||
|
},
|
||||||
|
"names": [
|
||||||
|
{
|
||||||
|
"O": "etcd",
|
||||||
|
"OU": "etcd Security",
|
||||||
|
"L": "San Francisco",
|
||||||
|
"ST": "California",
|
||||||
|
"C": "USA"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"hosts": [
|
||||||
|
"m1.etcd.local",
|
||||||
|
"m2.etcd.local",
|
||||||
|
"m3.etcd.local",
|
||||||
|
"127.0.0.1",
|
||||||
|
"localhost"
|
||||||
|
]
|
||||||
|
}
|
25
hack/scripts-dev/docker-dns/certs/server.crt
Normal file
25
hack/scripts-dev/docker-dns/certs/server.crt
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
-----BEGIN CERTIFICATE-----
|
||||||
|
MIIEKTCCAxGgAwIBAgIUUwtQlOqMccWY8MOaSaWutEjlMrgwDQYJKoZIhvcNAQEL
|
||||||
|
BQAwbzEMMAoGA1UEBhMDVVNBMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQH
|
||||||
|
Ew1TYW4gRnJhbmNpc2NvMQ0wCwYDVQQKEwRldGNkMRYwFAYDVQQLEw1ldGNkIFNl
|
||||||
|
Y3VyaXR5MQswCQYDVQQDEwJjYTAeFw0xNzExMTMwNDA2MDBaFw0yNzExMTEwNDA2
|
||||||
|
MDBaMGIxDDAKBgNVBAYTA1VTQTETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UE
|
||||||
|
BxMNU2FuIEZyYW5jaXNjbzENMAsGA1UEChMEZXRjZDEWMBQGA1UECxMNZXRjZCBT
|
||||||
|
ZWN1cml0eTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALyYH7bL79If
|
||||||
|
75AezzSpkuTOPAGBzPlGFLM5QS4jrt6fJBpElAUV2VmZm+isVsTs2X63md1t4s3Y
|
||||||
|
44soYK02HONUxUXxbeW7S8yJYSplG5hCJpFiSVP0GyVojQ04OLO1yI5m82fWJNi6
|
||||||
|
9PgTmb3+/YD08TKbjjJ4FB0kqoFJE4qoUNNpbkpQxHW4cx9iyWbE9gwyGoC76ftr
|
||||||
|
DC4J5HavmZ/y51rq1VWrO/d9rmCEUN++M8FcGt6D4WVQ54sWafl4Q1HafBq3FAT5
|
||||||
|
swpqi6aDDFKYYTdvjFEmJ2uWacak8NO+vjTt8fTfSFBUYcxweVWIDm6xU8kR8Lwy
|
||||||
|
aNxD26jQ9GMCAwEAAaOByTCBxjAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYI
|
||||||
|
KwYBBQUHAwEGCCsGAQUFBwMCMAwGA1UdEwEB/wQCMAAwHQYDVR0OBBYEFELi+Ig+
|
||||||
|
uxXrOvjoacXjcCjtfHcsMB8GA1UdIwQYMBaAFKCCWGMNZoAmb2O7nHVgwCu0ftzK
|
||||||
|
MEcGA1UdEQRAMD6CDW0xLmV0Y2QubG9jYWyCDW0yLmV0Y2QubG9jYWyCDW0zLmV0
|
||||||
|
Y2QubG9jYWyCCWxvY2FsaG9zdIcEfwAAATANBgkqhkiG9w0BAQsFAAOCAQEAn6e8
|
||||||
|
LPd53xQGiicDHN8+WkUS7crr+A+bIfY0nbWUf1H7zwNxpHHnKgVRHc4MKpRY4f+E
|
||||||
|
M2bEYdNJZDrjFYIWWlFDteVKZevH2dB3weiCAYWPYuiR9dGH6NvVbPcEMwarPBW4
|
||||||
|
mLsm9Nl/r7YBxXx73rhfxyBbhTuDwKtY/BAMi+ZO4msnuWiiSiQEUrEmzm9PWhAD
|
||||||
|
CgNjxCL3xoGyIJGj1xev0PYo+iFrAd9Pkfg2+FaSYXtNPbZX229yHmxU7GbOJumx
|
||||||
|
5vGQMRtzByq7wqw1dZpITlgbDPJc5jdIRKGnusQ96GXLORSQcP+tfG4NhreYYpI1
|
||||||
|
69Y78gNCTl0uGmI21g==
|
||||||
|
-----END CERTIFICATE-----
|
27
hack/scripts-dev/docker-dns/certs/server.key.insecure
Normal file
27
hack/scripts-dev/docker-dns/certs/server.key.insecure
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
-----BEGIN RSA PRIVATE KEY-----
|
||||||
|
MIIEpAIBAAKCAQEAvJgftsvv0h/vkB7PNKmS5M48AYHM+UYUszlBLiOu3p8kGkSU
|
||||||
|
BRXZWZmb6KxWxOzZfreZ3W3izdjjiyhgrTYc41TFRfFt5btLzIlhKmUbmEImkWJJ
|
||||||
|
U/QbJWiNDTg4s7XIjmbzZ9Yk2Lr0+BOZvf79gPTxMpuOMngUHSSqgUkTiqhQ02lu
|
||||||
|
SlDEdbhzH2LJZsT2DDIagLvp+2sMLgnkdq+Zn/LnWurVVas7932uYIRQ374zwVwa
|
||||||
|
3oPhZVDnixZp+XhDUdp8GrcUBPmzCmqLpoMMUphhN2+MUSYna5ZpxqTw076+NO3x
|
||||||
|
9N9IUFRhzHB5VYgObrFTyRHwvDJo3EPbqND0YwIDAQABAoIBAQC0YCbM9YZ9CRBe
|
||||||
|
Xik9rAYTknBv3I6Hx5BaziLaF0TUJY8pFHgh2QDVooYsZlBi7kki2kVuNAAdcxhG
|
||||||
|
ayrz33KHtvcq6zt54sYfbTGik6tt1679k+ygQDOKdtGZWDFbKD0Wfb7FjFoXc9CC
|
||||||
|
SHTd9DjPkvXxujepa5GJQh1Vo+ftz2I+8e6LeoiBZJM1IosfrpxKg02UnWrLia7o
|
||||||
|
i8eoXIyMAJHuNUGpGl33WnckyMGDsVKMc2DVG2exfVBZ37lAemYOLRKmd4AwUk2l
|
||||||
|
ztd71sXQodLk++1BqaS9cc9yvsNiBjGL3Ehm7uUcLH1k3VHd4ArcGhiqffKzQuSE
|
||||||
|
Dhm8GXNZAoGBAMrXOAdnfLlxYKCqOaj0JwN0RusWBP3cC7jluS5UmeTROPnBa0Fb
|
||||||
|
219YtiXkDrWtoiwLvvPXobem0/juPkiGnprGcOsPUGa6pV3TPJ40BiIfh9/vt7fr
|
||||||
|
Bko2SqEA9U0FxredcOFoCPxX9k9EDWxhF/nD20amvRHKK/wv995iXKxHAoGBAO4F
|
||||||
|
GILNxBHlH5F++dbSSSTcZUTXvuBr7JQkbMK+luSikEtaSW9IO2bf65LtqjaWp4Ds
|
||||||
|
rENCQAB3PmI111Rjwrk7925W0JCHw/+UArlVoM3K2q1zhYUWAn9L3v+qUTN2TLu1
|
||||||
|
Tso3OkCrQ5aa812tffW3hZHOWJ+aZp2nnBnruDEFAoGAGJDCD1uAJnFNs4eKHiUb
|
||||||
|
iHaPlC8BgcEhhk4EBFFopeaU0OKU28CFK+HxhVs+UNBrgIwXny5xPm2s5EvuLRho
|
||||||
|
ovP/fuhG43odRuSrRbmlOIK7EOrWRCbphxlWJnOYQbC+ZURjBFl2JSF+ChGC0qpb
|
||||||
|
nfsTVlYhNcNXWl5w1XTyJkcCgYEAp07XquJeh0GqTgiWL8XC+nEdkiWhG3lhY8Sy
|
||||||
|
2rVDtdT7XqxJYDrC3o5Ztf7vnc2KUpqKgACqomkvZbN49+3j63bWdy35Dw8P27A7
|
||||||
|
tfEVxnJoAnJokWMmQDqhts8OowDt8SgCCSyG+vwn10518QxJtRXaguIr84yBwyIV
|
||||||
|
HTdPUs0CgYBIAxoPD9/6R2swClvln15sjaIXDp5rYLbm6mWU8fBURU2fdUw3VBlJ
|
||||||
|
7YVgQ4GnKiCI7NueBBNRhjXA3KDkFyZw0/oKe2uc/4Gdyx1/L40WbYOaxJD2vIAf
|
||||||
|
FZ4pK9Yq5Rp3XiCNm0eURBlNM+fwXOQin2XdzDRoEq1B5JalQO87lA==
|
||||||
|
-----END RSA PRIVATE KEY-----
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user