Skip to content
This repository was archived by the owner on Sep 30, 2020. It is now read-only.

Commit 7b8cbe9

Browse files
authored
Merge pull request #590 from mumoshu/fix-etcd-snapshot-s3-loc
Fix etcd snapshots locations in S3
2 parents c748850 + e6a3cc5 commit 7b8cbe9

File tree

7 files changed

+96
-21
lines changed

7 files changed

+96
-21
lines changed

core/controlplane/cluster/cluster.go

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import (
1717
"github.com/aws/aws-sdk-go/service/s3"
1818
"github.com/kubernetes-incubator/kube-aws/cfnstack"
1919
"github.com/kubernetes-incubator/kube-aws/core/controlplane/config"
20+
"github.com/kubernetes-incubator/kube-aws/model"
2021
)
2122

2223
// VERSION set by build script
@@ -116,7 +117,8 @@ func (c *ClusterRef) validateExistingVPCState(ec2Svc ec2Service) error {
116117

117118
func NewCluster(cfg *config.Cluster, opts config.StackTemplateOptions, awsDebug bool) (*Cluster, error) {
118119
cluster := NewClusterRef(cfg, awsDebug)
119-
cluster.KubeResourcesAutosave.S3Path = fmt.Sprintf("%s/kube-aws/clusters/%s/backup", strings.TrimPrefix(opts.S3URI, "s3://"), cfg.ClusterName)
120+
// TODO Do this in a cleaner way e.g. in config.go
121+
cluster.KubeResourcesAutosave.S3Path = model.NewS3Folders(opts.S3URI, cluster.ClusterName).ClusterBackups().Path()
120122
stackConfig, err := cluster.StackConfig(opts)
121123
if err != nil {
122124
return nil, err
@@ -137,7 +139,7 @@ func (c *Cluster) Assets() (cfnstack.Assets, error) {
137139
return nil, fmt.Errorf("Error while rendering template : %v", err)
138140
}
139141

140-
return cfnstack.NewAssetsBuilder(c.StackName(), c.StackConfig.S3URI, c.StackConfig.Region).
142+
return cfnstack.NewAssetsBuilder(c.StackName(), c.StackConfig.ClusterExportedStacksS3URI(), c.StackConfig.Region).
141143
Add(c.UserDataControllerFileName(), c.UserDataController).
142144
Add(c.UserDataEtcdFileName(), c.UserDataEtcd).
143145
Add(STACK_TEMPLATE_FILENAME, stackTemplate).
@@ -199,7 +201,7 @@ func (c *Cluster) stackProvisioner() *cfnstack.Provisioner {
199201
return cfnstack.NewProvisioner(
200202
c.StackName(),
201203
c.StackTags,
202-
c.S3URI,
204+
c.ClusterExportedStacksS3URI(),
203205
c.Region,
204206
stackPolicyBody,
205207
c.session)

core/controlplane/config/config.go

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1036,8 +1036,7 @@ func (c Cluster) StackConfig(opts StackTemplateOptions) (*StackConfig, error) {
10361036

10371037
stackConfig.StackTemplateOptions = opts
10381038

1039-
baseS3URI := strings.TrimSuffix(opts.S3URI, "/")
1040-
stackConfig.S3URI = fmt.Sprintf("%s/kube-aws/clusters/%s/exported/stacks", baseS3URI, c.ClusterName)
1039+
stackConfig.S3URI = strings.TrimSuffix(opts.S3URI, "/")
10411040

10421041
if opts.SkipWait {
10431042
enabled := false

core/controlplane/config/stack_config.go

Lines changed: 25 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import (
55
"github.com/kubernetes-incubator/kube-aws/coreos/userdatavalidation"
66
"github.com/kubernetes-incubator/kube-aws/filereader/jsontemplate"
77
"github.com/kubernetes-incubator/kube-aws/fingerprint"
8+
"github.com/kubernetes-incubator/kube-aws/model"
89
"net/url"
910
"strings"
1011
)
@@ -33,7 +34,7 @@ func (c *StackConfig) UserDataControllerS3Prefix() (string, error) {
3334
}
3435

3536
func (c *StackConfig) userDataControllerS3Directory() (string, error) {
36-
s3uri, err := url.Parse(c.S3URI)
37+
s3uri, err := url.Parse(c.ClusterExportedStacksS3URI())
3738
if err != nil {
3839
return "", fmt.Errorf("Error in userDataControllerS3Directory : %v", err)
3940
}
@@ -66,7 +67,7 @@ func (c *StackConfig) UserDataEtcdS3Prefix() (string, error) {
6667
}
6768

6869
func (c *StackConfig) userDataEtcdS3Directory() (string, error) {
69-
s3uri, err := url.Parse(c.S3URI)
70+
s3uri, err := url.Parse(c.ClusterExportedStacksS3URI())
7071
if err != nil {
7172
return "", fmt.Errorf("Error in userDataEtcdS3Directory : %v", err)
7273
}
@@ -88,28 +89,42 @@ func (c *StackConfig) UserDataEtcdFileName() string {
8889
return "userdata-etcd-" + fingerprint.SHA256(c.UserDataEtcd)
8990
}
9091

91-
func (c *StackConfig) EtcdSnapshotsS3Path() (string, error) {
92-
s3uri, err := url.Parse(c.S3URI)
92+
func (c *StackConfig) s3Folders() model.S3Folders {
93+
return model.NewS3Folders(c.S3URI, c.ClusterName)
94+
}
95+
96+
func (c *StackConfig) ClusterS3URI() string {
97+
return c.s3Folders().Cluster().URI()
98+
}
99+
100+
func (c *StackConfig) ClusterExportedStacksS3URI() string {
101+
return c.s3Folders().ClusterExportedStacks().URI()
102+
}
103+
104+
// EtcdSnapshotsS3Path is a pair of a S3 bucket and a key of an S3 object containing an etcd cluster snapshot
105+
func (c *StackConfig) EtcdSnapshotsS3PathRef() (string, error) {
106+
s3uri, err := url.Parse(c.ClusterS3URI())
93107
if err != nil {
94-
return "", fmt.Errorf("Error in EtcdSnapshotsS3Path : %v", err)
108+
return "", fmt.Errorf("Error in EtcdSnapshotsS3PathRef : %v", err)
95109
}
96-
return fmt.Sprintf("%s%s/etcd-snapshots", s3uri.Host, s3uri.Path), nil
110+
return fmt.Sprintf(`{ "Fn::Join" : [ "", [ "%s%s/instances/", { "Fn::Select" : [ "2", { "Fn::Split": [ "/", { "Ref": "AWS::StackId" }]} ]}, "/etcd-snapshots" ]]}`, s3uri.Host, s3uri.Path), nil
97111
}
98112

99113
func (c *StackConfig) EtcdSnapshotsS3Bucket() (string, error) {
100-
s3uri, err := url.Parse(c.S3URI)
114+
s3uri, err := url.Parse(c.ClusterS3URI())
101115
if err != nil {
102116
return "", fmt.Errorf("Error in EtcdSnapshotsS3Bucket : %v", err)
103117
}
104118
return s3uri.Host, nil
105119
}
106120

107-
func (c *StackConfig) EtcdSnapshotsS3Prefix() (string, error) {
108-
s3uri, err := url.Parse(c.S3URI)
121+
func (c *StackConfig) EtcdSnapshotsS3PrefixRef() (string, error) {
122+
s3uri, err := url.Parse(c.ClusterS3URI())
109123
if err != nil {
110124
return "", fmt.Errorf("Error in EtcdSnapshotsS3Prefix : %v", err)
111125
}
112-
return strings.TrimLeft(s3uri.Path, "/"), nil
126+
s3path := fmt.Sprintf(`{ "Fn::Join" : [ "", [ "%s/instances/", { "Fn::Select" : [ "2", { "Fn::Split": [ "/", { "Ref": "AWS::StackId" }]} ]}, "/etcd-snapshots" ]]}`, s3uri.Path)
127+
return strings.TrimLeft(s3path, "/"), nil
113128
}
114129

115130
func (c *StackConfig) ValidateUserData() error {

core/controlplane/config/templates/stack-template.json

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -374,7 +374,7 @@
374374
"Resource": "arn:{{.Region.Partition}}:s3:::{{$.EtcdSnapshotsS3Bucket}}",
375375
"Condition": {
376376
"StringLike": {
377-
"s3:prefix": "{{$.EtcdSnapshotsS3Prefix}}/*"
377+
"s3:prefix": { "Fn::Join" : [ "", [{{$.EtcdSnapshotsS3PrefixRef}}, "/*" ]]}
378378
}
379379
}
380380
},
@@ -384,7 +384,7 @@
384384
"Action": [
385385
"s3:*"
386386
],
387-
"Resource": "arn:{{.Region.Partition}}:s3:::{{$.EtcdSnapshotsS3Path}}/*"
387+
"Resource": { "Fn::Join" : [ "", ["arn:{{.Region.Partition}}:s3:::", {{$.EtcdSnapshotsS3PathRef}}, "/*" ]]}
388388
},
389389
{{/* Required for `etcdadm reconfigure` to determine the number of active etcd nodes */}}
390390
{
@@ -614,7 +614,7 @@
614614
"etcd-member",
615615
"'\n",
616616
"ETCDADM_CLUSTER_SNAPSHOTS_S3_URI='",
617-
"s3://{{$.EtcdSnapshotsS3Path}}",
617+
{ "Fn::Join" : [ "", ["s3://", {{$.EtcdSnapshotsS3PathRef}} ]] },
618618
"'\n",
619619
"ETCDADM_STATE_FILES_DIR='",
620620
"/var/run/coreos/etcdadm",

core/nodepool/config/config.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -117,9 +117,9 @@ func (c ProvidedConfig) StackConfig(opts StackTemplateOptions) (*StackConfig, er
117117

118118
stackConfig.StackTemplateOptions = opts
119119

120-
baseS3URI := strings.TrimSuffix(opts.S3URI, "/")
121-
stackConfig.S3URI = fmt.Sprintf("%s/kube-aws/clusters/%s/exported/stacks", baseS3URI, c.ClusterName)
122-
stackConfig.KubeResourcesAutosave.S3Path = fmt.Sprintf("%s/kube-aws/clusters/%s/backup", strings.TrimPrefix(baseS3URI, "s3://"), c.ClusterName)
120+
s3Folders := model.NewS3Folders(opts.S3URI, c.ClusterName)
121+
stackConfig.S3URI = s3Folders.ClusterExportedStacks().URI()
122+
stackConfig.KubeResourcesAutosave.S3Path = s3Folders.ClusterBackups().Path()
123123

124124
if opts.SkipWait {
125125
enabled := false

e2e/run

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -235,6 +235,8 @@ controller:
235235
count: $CONTROLLER_COUNT
236236
waitSignal:
237237
enabled: true
238+
kubeResourcesAutosave:
239+
enabled: true
238240
experimental:
239241
awsNodeLabels:
240242
enabled: true

model/s3_folders.go

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
package model
2+
3+
import (
4+
"fmt"
5+
"strings"
6+
)
7+
8+
type S3Folders struct {
9+
clusterName string
10+
s3URI string
11+
}
12+
13+
func NewS3Folders(s3URI string, clusterName string) S3Folders {
14+
return S3Folders{
15+
s3URI: s3URI,
16+
clusterName: clusterName,
17+
}
18+
}
19+
20+
func (n S3Folders) root() S3Folder {
21+
return newS3Folder(n.s3URI)
22+
}
23+
24+
func (n S3Folders) Cluster() S3Folder {
25+
return n.root().subFolder(fmt.Sprintf("kube-aws/clusters/%s", n.clusterName))
26+
}
27+
28+
func (n S3Folders) ClusterBackups() S3Folder {
29+
return n.Cluster().subFolder("backup")
30+
}
31+
32+
func (n S3Folders) ClusterExportedStacks() S3Folder {
33+
return n.Cluster().subFolder("exported/stacks")
34+
}
35+
36+
type S3Folder struct {
37+
s3URI string
38+
}
39+
40+
func newS3Folder(uri string) S3Folder {
41+
return S3Folder{
42+
s3URI: strings.TrimSuffix(uri, "/"),
43+
}
44+
}
45+
46+
func (f S3Folder) Path() string {
47+
uri := strings.TrimSuffix(f.s3URI, "/")
48+
return strings.TrimPrefix(uri, "s3://")
49+
}
50+
51+
func (f S3Folder) URI() string {
52+
return f.s3URI
53+
}
54+
55+
func (f S3Folder) subFolder(name string) S3Folder {
56+
return newS3Folder(fmt.Sprintf("%s/%s", f.s3URI, name))
57+
}

0 commit comments

Comments
 (0)