Skip to content

Commit 1879690

Browse files
Merge pull request #71 from commitdev/kubernetes
Kubernetes
2 parents ab8d5d2 + 6c36d53 commit 1879690

File tree

7 files changed

+242
-13
lines changed

7 files changed

+242
-13
lines changed

Dockerfile

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,19 +36,27 @@ RUN mkdir -p /tmp/protoc && \
3636

3737
RUN GO111MODULE=off go get -u github.com/grpc-ecosystem/grpc-gateway/protoc-gen-grpc-gateway
3838

39+
RUN curl -sSLo /tmp/terraform.zip "https://releases.hashicorp.com/terraform/0.12.12/terraform_0.12.12_linux_amd64.zip" && \
40+
unzip -d /usr/local/bin/ /tmp/terraform.zip
41+
3942
RUN chmod +x /usr/local/bin/* && \
4043
upx --lzma /usr/local/bin/*
4144

42-
WORKDIR tmp/commit0
45+
WORKDIR /tmp/commit0
4346
COPY . .
47+
4448
RUN make build-deps && make build && \
4549
mv commit0 /usr/local/bin && \
4650
upx --lzma /usr/local/bin/commit0
4751

4852
FROM alpine:3.10
4953
ENV \
5054
PROTOBUF_VERSION=3.6.1-r1 \
51-
GOPATH=/proto-libs
55+
GOPATH=/proto-libs
56+
57+
RUN apk add --update bash ca-certificates git python && \
58+
apk add --update -t deps make py-pip
59+
5260
RUN mkdir ${GOPATH}
5361
COPY --from=builder /usr/local/bin /usr/local/bin
5462
COPY --from=builder /usr/local/include /usr/local/include

README.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,10 @@ As the templates are embeded into the binary you will need to ensure packr2 is i
7979

8080
You can run `make deps-go` to install this.
8181

82+
As there alot of dependencies it will be easier to use this tool within the provided image, clone the repo and then run `make build-docker-local`.
83+
84+
The best way then to use this is to add an alias, then you can use the CLI as if it was installed as usual on your machine:
85+
`alias commit0='docker run -it -v "$(pwd):/project" commit0:v0'`
8286

8387
### Dependencies
8488

go.mod

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,20 +3,23 @@ module github.com/commitdev/commit0
33
go 1.12
44

55
require (
6+
github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d // indirect
67
github.com/gobuffalo/logger v1.0.1 // indirect
78
github.com/gobuffalo/packr/v2 v2.5.2
89
github.com/gorilla/mux v1.7.3
910
github.com/k0kubun/colorstring v0.0.0-20150214042306-9440f1994b88 // indirect
1011
github.com/k0kubun/pp v3.0.1+incompatible
1112
github.com/kyokomi/emoji v2.1.0+incompatible
1213
github.com/logrusorgru/aurora v0.0.0-20191017060258-dc85c304c434
14+
github.com/manifoldco/promptui v0.3.2
1315
github.com/mattn/go-colorable v0.1.2 // indirect
1416
github.com/rogpeppe/go-internal v1.5.0 // indirect
1517
github.com/spf13/cobra v0.0.5
16-
github.com/stretchr/testify v1.4.0 // indirect
1718
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550 // indirect
19+
golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3 // indirect
1820
golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e // indirect
1921
golang.org/x/sys v0.0.0-20191010194322-b09406accb47 // indirect
22+
gopkg.in/alecthomas/kingpin.v3-unstable v3.0.0-20191105091915-95d230a53780 // indirect
2023
gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 // indirect
2124
gopkg.in/yaml.v2 v2.2.5
22-
)
25+
)

go.sum

Lines changed: 41 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,18 @@
11
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
2+
github.com/alecthomas/gometalinter v2.0.11+incompatible h1:ENdXMllZNSVDTJUUVIzBW9CSEpntTrQa76iRsEFLX/M=
3+
github.com/alecthomas/gometalinter v2.0.11+incompatible/go.mod h1:qfIpQGGz3d+NmgyPBqv+LSh50emm1pt72EtcX2vKYQk=
4+
github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d h1:UQZhZ2O0vMHr2cI+DC1Mbh0TJxzA3RcLoMsFw+aXw7E=
5+
github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho=
26
github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8=
7+
github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8=
8+
github.com/chzyer/logex v1.1.10 h1:Swpa1K6QvQznwJRcfTfQJmTE72DqScAa40E+fbHEXEE=
9+
github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=
10+
github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e h1:fY5BOSpyZCqRo5OhCuC+XN+r/bBCmeuuJtjz+bCNIf8=
11+
github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI=
12+
github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1 h1:q763qf9huN11kDQavWsoZXJNW3xEE4JJyHa5Q25/sd8=
13+
github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=
14+
github.com/client9/misspell v0.3.4 h1:ta993UF76GwbvJcIo3Y68y/M3WxlpEHPWIGDkJYwzJI=
15+
github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
316
github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE=
417
github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk=
518
github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk=
@@ -17,13 +30,21 @@ github.com/gobuffalo/packd v0.3.0 h1:eMwymTkA1uXsqxS0Tpoop3Lc0u3kTfiMBE6nKtQU4g4
1730
github.com/gobuffalo/packd v0.3.0/go.mod h1:zC7QkmNkYVGKPw4tHpBQ+ml7W/3tIebgeo1b36chA3Q=
1831
github.com/gobuffalo/packr/v2 v2.5.2 h1:4EvjeIpQLZuRIljwnidYgbRXbr1yIzVRrESiLjqKj6s=
1932
github.com/gobuffalo/packr/v2 v2.5.2/go.mod h1:sgEE1xNZ6G0FNN5xn9pevVu4nywaxHvgup67xisti08=
33+
github.com/golang/lint v0.0.0-20181026193005-c67002cb31c3 h1:I4BOK3PBMjhWfQM2zPJKK7lOBGsrsvOB7kBELP33hiE=
34+
github.com/golang/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:tluoj9z5200jBnyusfRPU2LqT6J+DAorxEvtC7LHB+E=
35+
github.com/google/shlex v0.0.0-20181106134648-c34317bd91bf h1:7+FW5aGwISbqUtkfmIpZJGRgNFg2ioYPvFaUxdqpDsg=
36+
github.com/google/shlex v0.0.0-20181106134648-c34317bd91bf/go.mod h1:RpwtwJQFrIEPstU94h88MWPXP2ektJZ8cZ0YntAmXiE=
37+
github.com/gordonklaus/ineffassign v0.0.0-20180909121442-1003c8bd00dc h1:cJlkeAx1QYgO5N80aF5xRGstVsRQwgLR7uA2FnP1ZjY=
38+
github.com/gordonklaus/ineffassign v0.0.0-20180909121442-1003c8bd00dc/go.mod h1:cuNKsD1zp2v6XfE/orVX2QE1LC+i254ceGcVeDT3pTU=
2039
github.com/gorilla/mux v1.7.3 h1:gnP5JzjVOuiZD07fKKToCAOjS0yOpj/qPETTXCCS6hw=
2140
github.com/gorilla/mux v1.7.3/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs=
2241
github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ=
2342
github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM=
2443
github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8=
2544
github.com/joho/godotenv v1.3.0 h1:Zjp+RcGpHhGlrMbJzXTrZZPrWj+1vfm90La1wgB6Bhc=
2645
github.com/joho/godotenv v1.3.0/go.mod h1:7hK45KPybAkOC6peb+G5yklZfMxEjkZhHbwpqxOKXbg=
46+
github.com/juju/ansiterm v0.0.0-20180109212912-720a0952cc2a h1:FaWFmfWdAUKbSCtOU2QjDaorUexogfaMgbipgYATUMU=
47+
github.com/juju/ansiterm v0.0.0-20180109212912-720a0952cc2a/go.mod h1:UJSiEoRfvx3hP73CvoARgeLjaIOjybY9vj8PUPPFGeU=
2748
github.com/k0kubun/colorstring v0.0.0-20150214042306-9440f1994b88 h1:uC1QfSlInpQF+M0ao65imhwqKnz3Q2z/d8PWZRMQvDM=
2849
github.com/k0kubun/colorstring v0.0.0-20150214042306-9440f1994b88/go.mod h1:3w7q1U84EfirKl04SVQ/s7nPm1ZPhiXd34z40TNz36k=
2950
github.com/k0kubun/pp v3.0.1+incompatible h1:3tqvf7QgUnZ5tXO6pNAZlrvHgl6DvifjDrd9g2S9Z40=
@@ -42,9 +63,15 @@ github.com/kyokomi/emoji v2.1.0+incompatible h1:+DYU2RgpI6OHG4oQkM5KlqD3Wd3UPEsX
4263
github.com/kyokomi/emoji v2.1.0+incompatible/go.mod h1:mZ6aGCD7yk8j6QY6KICwnZ2pxoszVseX1DNoGtU2tBA=
4364
github.com/logrusorgru/aurora v0.0.0-20191017060258-dc85c304c434 h1:im9kkmH0WWwxzegiv18gSUJbuXR9y028rXrWuPp6Jug=
4465
github.com/logrusorgru/aurora v0.0.0-20191017060258-dc85c304c434/go.mod h1:7rIyQOR62GCctdiQpZ/zOJlFyk6y+94wXzv6RNZgaR4=
66+
github.com/lunixbochs/vtclean v0.0.0-20180621232353-2d01aacdc34a h1:weJVJJRzAJBFRlAiJQROKQs8oC9vOxvm4rZmBBk0ONw=
67+
github.com/lunixbochs/vtclean v0.0.0-20180621232353-2d01aacdc34a/go.mod h1:pHhQNgMf3btfWnGBVipUOjRYhoOsdGqdm/+2c2E2WMI=
4568
github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ=
69+
github.com/manifoldco/promptui v0.3.2 h1:rir7oByTERac6jhpHUPErHuopoRDvO3jxS+FdadEns8=
70+
github.com/manifoldco/promptui v0.3.2/go.mod h1:8JU+igZ+eeiiRku4T5BjtKh2ms8sziGpSYl1gN8Bazw=
71+
github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=
4672
github.com/mattn/go-colorable v0.1.2 h1:/bC9yWikZXAL9uJdulbSfyVNIR3n3trXl+v8+1sx8mU=
4773
github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=
74+
github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=
4875
github.com/mattn/go-isatty v0.0.8 h1:HLtExJ+uU2HOZ+wI0Tt5DtUDrx8yhUqDcp7fYERX4CE=
4976
github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=
5077
github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
@@ -73,19 +100,25 @@ github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXf
73100
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
74101
github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk=
75102
github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
103+
github.com/tsenart/deadcode v0.0.0-20160724212837-210d2dc333e9 h1:vY5WqiEon0ZSTGM3ayVVi+twaHKHDFUVloaQ/wug9/c=
104+
github.com/tsenart/deadcode v0.0.0-20160724212837-210d2dc333e9/go.mod h1:q+QjxYvZ+fpjMXqs+XEriussHjSYqeXVnAdSV1tkMYk=
76105
github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0=
77106
github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q=
78107
golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
79108
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
80109
golang.org/x/crypto v0.0.0-20190621222207-cc06ce4a13d4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
81110
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550 h1:ObdrDkeb4kJdCP557AjRjq69pTHfNouLtWZG7j9rPN8=
82111
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
112+
golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
113+
golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3 h1:XQyxROzUlZH+WIQwySDgnISgOivlhjIEwaQaJEJrrN0=
114+
golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
83115
golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
84116
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3 h1:0GoQqolDA55aaLxZyTzK/Y2ePZzZTUrRacwib7cNsYQ=
85117
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
86118
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
87119
golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e h1:vcxGaoTs7kV8m5Np9uUNQin4BrLOthgV7252N8V+FwY=
88120
golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
121+
golang.org/x/sys v0.0.0-20181122145206-62eef0e2fa9b/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
89122
golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
90123
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
91124
golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
@@ -96,8 +129,14 @@ golang.org/x/sys v0.0.0-20191010194322-b09406accb47 h1:/XfQ9z7ib8eEJX2hdgFTZJ/nt
96129
golang.org/x/sys v0.0.0-20191010194322-b09406accb47/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
97130
golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg=
98131
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
132+
golang.org/x/tools v0.0.0-20181122213734-04b5d21e00f1/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
133+
golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
134+
golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0 h1:Dh6fw+p6FyRl5x/FvNswO1ji0lIGzm3KP8Y9VkS9PTE=
99135
golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0 h1:Dh6fw+p6FyRl5x/FvNswO1ji0lIGzm3KP8Y9VkS9PTE=
100136
golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
137+
golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
138+
gopkg.in/alecthomas/kingpin.v3-unstable v3.0.0-20191105091915-95d230a53780 h1:CEBpW6C191eozfEuWdUmIAHn7lwlLxJ7HVdr2e2Tsrw=
139+
gopkg.in/alecthomas/kingpin.v3-unstable v3.0.0-20191105091915-95d230a53780/go.mod h1:3HH7i1SgMqlzxCcBmUHW657sD4Kvv9sC3HpL3YukzwA=
101140
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
102141
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
103142
gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo=
@@ -106,4 +145,5 @@ gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=
106145
gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw=
107146
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
108147
gopkg.in/yaml.v2 v2.2.5 h1:ymVxjfMaHvXD8RqPRmzHHsB3VvucivSkIAvJFDI5O3c=
109-
gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
148+
gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
149+
gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=

internal/generate/kubernetes/generate.go

Lines changed: 171 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,43 +1,77 @@
11
package kubernetes
22

33
import (
4+
"errors"
5+
"fmt"
46
"io"
7+
"io/ioutil"
58
"log"
69
"os"
710
"os/exec"
811
"path"
12+
"path/filepath"
13+
"regexp"
914
"sync"
1015

1116
"github.com/commitdev/commit0/internal/config"
1217
"github.com/commitdev/commit0/internal/templator"
18+
"github.com/commitdev/commit0/internal/util"
19+
"github.com/manifoldco/promptui"
20+
"gopkg.in/yaml.v2"
1321
)
1422

23+
// Secrets - AWS prompted credentials
24+
type Secrets struct {
25+
Aws struct {
26+
AwsAccessKeyID string
27+
AwsSecretAccessKey string
28+
Region string
29+
}
30+
}
31+
32+
// Generate templates
1533
func Generate(t *templator.Templator, cfg *config.Commit0Config, wg *sync.WaitGroup, pathPrefix string) {
1634
data := templator.GenericTemplateData{*cfg}
1735
t.Kubernetes.TemplateFiles(data, false, wg, pathPrefix)
1836
}
1937

38+
// Execute terrafrom init & plan
2039
func Execute(config *config.Commit0Config, pathPrefix string) {
2140
if config.Infrastructure.AWS.EKS.Deploy {
41+
log.Println("Preparing aws environment...")
42+
43+
dir := util.GetCwd()
44+
45+
if fileExists(fmt.Sprintf("%s/secrets.yaml", dir)) {
46+
log.Println("secrets.yaml exists ...")
47+
} else {
48+
awsSecrets := promptCredentials()
49+
writeSecrets(awsSecrets)
50+
}
51+
52+
envars := getAwsEnvars(readSecrets())
2253
log.Println("Planning infrastructure...")
23-
execute(exec.Command("terraform", "init"), pathPrefix)
24-
execute(exec.Command("terraform", "plan"), pathPrefix)
54+
execute(exec.Command("terraform", "init"), pathPrefix, envars)
55+
execute(exec.Command("terraform", "plan"), pathPrefix, envars)
2556
}
2657
}
2758

28-
func execute(cmd *exec.Cmd, pathPrefix string) {
29-
dir, err := os.Getwd()
30-
if err != nil {
31-
log.Fatalf("Getting working directory failed: %v\n", err)
32-
}
59+
func execute(cmd *exec.Cmd, pathPrefix string, envars []string) {
60+
dir := util.GetCwd()
61+
3362
kubDir := path.Join(pathPrefix, "kubernetes/terraform/environments/staging")
3463
cmd.Dir = path.Join(dir, kubDir)
3564

3665
stdoutPipe, _ := cmd.StdoutPipe()
3766
stderrPipe, _ := cmd.StderrPipe()
3867

3968
var errStdout, errStderr error
40-
err = cmd.Start()
69+
70+
if envars != nil {
71+
cmd.Env = envars
72+
}
73+
74+
err := cmd.Start()
4175
if err != nil {
4276
log.Fatalf("Starting terraform command failed: %v\n", err)
4377
}
@@ -62,3 +96,132 @@ func execute(cmd *exec.Cmd, pathPrefix string) {
6296
log.Printf("Failed to capture stderr: %v\n", errStderr)
6397
}
6498
}
99+
100+
func getAwsEnvars(awsSecrets Secrets) []string {
101+
env := os.Environ()
102+
env = append(env, fmt.Sprintf("AWS_ACCESS_KEY_ID=%s", awsSecrets.Aws.AwsAccessKeyID))
103+
env = append(env, fmt.Sprintf("AWS_SECRET_ACCESS_KEY=%s", awsSecrets.Aws.AwsSecretAccessKey))
104+
env = append(env, fmt.Sprintf("AWS_DEFAULT_REGION=%s", awsSecrets.Aws.Region))
105+
106+
return env
107+
}
108+
109+
func readSecrets() Secrets {
110+
111+
dir := util.GetCwd()
112+
113+
secretsFile := fmt.Sprintf("%s/secrets.yaml", dir)
114+
115+
data, err := ioutil.ReadFile(secretsFile)
116+
if err != nil {
117+
log.Fatalln(err)
118+
}
119+
120+
awsSecrets := Secrets{}
121+
122+
err = yaml.Unmarshal(data, &awsSecrets)
123+
if err != nil {
124+
log.Fatalln(err)
125+
}
126+
127+
return awsSecrets
128+
}
129+
130+
func writeSecrets(s Secrets) {
131+
secretsYaml, err := yaml.Marshal(&s)
132+
133+
if err != nil {
134+
log.Fatalf("error: %v", err)
135+
panic(err)
136+
}
137+
138+
dir := util.GetCwd()
139+
140+
if err != nil {
141+
log.Fatalf("Getting working directory failed: %v\n", err)
142+
panic(err)
143+
}
144+
145+
secretsFile := filepath.Join(dir, "secrets.yaml")
146+
err = ioutil.WriteFile(secretsFile, []byte(secretsYaml), 0644)
147+
148+
if err != nil {
149+
log.Fatalf("error: %v", err)
150+
panic(err)
151+
}
152+
}
153+
154+
func promptCredentials() Secrets {
155+
156+
validateAKID := func(input string) error {
157+
// 20 uppercase alphanumeric characters
158+
var awsAccessKeyIDPat = regexp.MustCompile(`^[A-Z0-9]{20}$`)
159+
if !awsAccessKeyIDPat.MatchString(input) {
160+
return errors.New("Invalid aws_access_key_id")
161+
}
162+
return nil
163+
}
164+
165+
validateSAK := func(input string) error {
166+
// 40 base64 characters
167+
var awsSecretAccessKeyPat = regexp.MustCompile(`^[A-Za-z0-9/+=]{40}$`)
168+
if !awsSecretAccessKeyPat.MatchString(input) {
169+
return errors.New("Invalid aws_secret_access_key")
170+
}
171+
return nil
172+
}
173+
174+
accessKeyIDPrompt := promptui.Prompt{
175+
Label: "Aws Access Key ID ",
176+
Validate: validateAKID,
177+
}
178+
179+
accessKeyIDResult, err := accessKeyIDPrompt.Run()
180+
181+
if err != nil {
182+
log.Fatalf("Prompt failed %v\n", err)
183+
panic(err)
184+
}
185+
186+
secretAccessKeyPrompt := promptui.Prompt{
187+
Label: "Aws Secret Access Key ",
188+
Validate: validateSAK,
189+
Mask: '*',
190+
}
191+
192+
secretAccessKeyResult, err := secretAccessKeyPrompt.Run()
193+
194+
if err != nil {
195+
log.Fatalf("Prompt failed %v\n", err)
196+
panic(err)
197+
}
198+
199+
regionPrompt := promptui.Select{
200+
Label: "Select AWS Region ",
201+
Items: []string{"us-west-1", "us-west-2", "us-east-1", "us-east-2", "ca-central-1",
202+
"eu-central-1", "eu-west-1", "ap-east-1", "ap-south-1"},
203+
}
204+
205+
_, regionResult, err := regionPrompt.Run()
206+
207+
if err != nil {
208+
log.Fatalf("Prompt failed %v\n", err)
209+
panic(err)
210+
}
211+
212+
awsSecrets := Secrets{}
213+
awsSecrets.Aws.AwsAccessKeyID = accessKeyIDResult
214+
awsSecrets.Aws.AwsSecretAccessKey = secretAccessKeyResult
215+
awsSecrets.Aws.Region = regionResult
216+
217+
return awsSecrets
218+
219+
}
220+
221+
func fileExists(filename string) bool {
222+
info, err := os.Stat(filename)
223+
if os.IsNotExist(err) {
224+
return false
225+
}
226+
return !info.IsDir()
227+
}

0 commit comments

Comments
 (0)