kite 0.2.0 → 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/CHANGELOG.md +130 -66
- data/LICENSE.md +202 -0
- data/README.md +35 -11
- data/bin/concourse/out +16 -20
- data/docs/kite-concourse-resource.md +45 -0
- data/kite.gemspec +1 -0
- data/lib/kite.rb +3 -1
- data/lib/kite/cloud.rb +1 -0
- data/lib/kite/core.rb +8 -2
- data/lib/kite/generate.rb +12 -46
- data/lib/kite/helpers.rb +0 -72
- data/lib/kite/helpers/concourse.rb +3 -2
- data/lib/kite/module.rb +76 -0
- data/lib/kite/terraform.rb +45 -0
- data/lib/kite/version.rb +1 -1
- data/tpl/aws/environment/main.tf.tt +5 -0
- data/tpl/aws/environment/s3.tf.tt +13 -0
- data/tpl/gcp/environment/gcs.tf.tt +18 -0
- data/tpl/gcp/environment/main.tf.tt +5 -0
- data/tpl/gcp/environment/outputs.tf.tt +5 -0
- data/tpl/service/%output_path%/pipelines/review.yml.tt +55 -37
- data/tpl/service/%output_path%/pipelines/tasks/create-pull-requests-tag.yml.tt +1 -1
- data/tpl/service/%output_path%/pipelines/tasks/create-repository-tag.yml.tt +1 -1
- data/tpl/service/%output_path%/pipelines/tasks/run-unit.yml.tt +7 -0
- data/tpl/service/Makefile.tt +11 -7
- data/tpl/service/docs/getting-started.md +73 -0
- data/tpl/service/docs/service.md +101 -0
- data/tpl/skel/Gemfile.tt +0 -9
- data/tpl/skel/config/cloud.yml +11 -66
- metadata +29 -88
- data/lib/kite/render.rb +0 -116
- data/tpl/aws/README.md +0 -52
- data/tpl/aws/bin/base/bootstrap.sh +0 -35
- data/tpl/aws/bin/base/cleanup.sh.tt +0 -19
- data/tpl/aws/bin/base/set-env.sh.tt +0 -7
- data/tpl/aws/bin/base/setup-tunnel.sh.tt +0 -4
- data/tpl/aws/bin/bosh-install.sh.tt +0 -23
- data/tpl/aws/bin/concourse-deploy.sh.tt +0 -14
- data/tpl/aws/bin/ingress-deploy.sh.tt +0 -7
- data/tpl/aws/bin/ingress-update.sh.tt +0 -7
- data/tpl/aws/bin/kops-delete.sh.erb +0 -5
- data/tpl/aws/bin/kops-deploy.sh.erb +0 -11
- data/tpl/aws/bin/oauth-deploy.sh.tt +0 -17
- data/tpl/aws/bin/prometheus-deploy.sh.tt +0 -23
- data/tpl/aws/bin/vault-deploy.sh.tt +0 -10
- data/tpl/aws/bosh-vars.yml.erb +0 -12
- data/tpl/aws/config/oauth.yml +0 -59
- data/tpl/aws/deployments/bosh/bosh.yml +0 -144
- data/tpl/aws/deployments/bosh/cloud-config.yml.tt +0 -86
- data/tpl/aws/deployments/bosh/cpi.yml +0 -98
- data/tpl/aws/deployments/bosh/jumpbox-user.yml +0 -27
- data/tpl/aws/deployments/concourse/concourse.yml.tt +0 -98
- data/tpl/aws/deployments/ingress/ingress.yml.erb +0 -78
- data/tpl/aws/deployments/oauth/oauth.yml.tt +0 -95
- data/tpl/aws/deployments/prometheus/monitor-bosh.yml +0 -518
- data/tpl/aws/deployments/prometheus/monitor-kubernetes.yml +0 -30
- data/tpl/aws/deployments/prometheus/prometheus.yml.tt +0 -184
- data/tpl/aws/deployments/vault/vault.yml.erb +0 -38
- data/tpl/aws/docs/bosh.md +0 -31
- data/tpl/aws/docs/concourse.md +0 -41
- data/tpl/aws/docs/ingress.md +0 -14
- data/tpl/aws/docs/kops.md +0 -35
- data/tpl/aws/docs/oauth.md +0 -24
- data/tpl/aws/docs/prometheus.md +0 -31
- data/tpl/aws/docs/vault.md +0 -35
- data/tpl/aws/terraform/kite_bucket.tf +0 -8
- data/tpl/aws/terraform/main.tf.tt +0 -36
- data/tpl/aws/terraform/network.tf.tt +0 -252
- data/tpl/aws/terraform/outputs.tf +0 -19
- data/tpl/aws/terraform/terraform.tfvars.tt +0 -21
- data/tpl/aws/terraform/variables.tf +0 -73
- data/tpl/gcp/README.md +0 -54
- data/tpl/gcp/bin/base/bootstrap.sh +0 -35
- data/tpl/gcp/bin/base/cleanup.sh.tt +0 -20
- data/tpl/gcp/bin/base/set-env.sh.tt +0 -10
- data/tpl/gcp/bin/base/setup-tunnel.sh.tt +0 -13
- data/tpl/gcp/bin/bosh-install.sh.tt +0 -22
- data/tpl/gcp/bin/concourse-deploy.sh.tt +0 -14
- data/tpl/gcp/bin/ingress-deploy.sh.tt +0 -7
- data/tpl/gcp/bin/ingress-update.sh.tt +0 -7
- data/tpl/gcp/bin/oauth-deploy.sh.tt +0 -19
- data/tpl/gcp/bin/prometheus-deploy.sh.tt +0 -23
- data/tpl/gcp/bin/vault-deploy.sh.tt +0 -10
- data/tpl/gcp/bosh-vars.yml.erb +0 -9
- data/tpl/gcp/config/oauth.yml +0 -59
- data/tpl/gcp/deployments/bosh/bosh.yml +0 -144
- data/tpl/gcp/deployments/bosh/cloud-config.yml.tt +0 -73
- data/tpl/gcp/deployments/bosh/cpi.yml +0 -69
- data/tpl/gcp/deployments/bosh/jumpbox-user.yml +0 -27
- data/tpl/gcp/deployments/concourse/concourse.yml.tt +0 -104
- data/tpl/gcp/deployments/concourse/test/test-credentials.yml +0 -3
- data/tpl/gcp/deployments/concourse/test/test-pipeline.yml +0 -24
- data/tpl/gcp/deployments/ingress/ingress.yml.erb +0 -111
- data/tpl/gcp/deployments/oauth/oauth.yml.tt +0 -95
- data/tpl/gcp/deployments/prometheus/monitor-bosh.yml +0 -518
- data/tpl/gcp/deployments/prometheus/monitor-kubernetes.yml +0 -30
- data/tpl/gcp/deployments/prometheus/prometheus.yml +0 -183
- data/tpl/gcp/deployments/vault/vault.yml.erb +0 -37
- data/tpl/gcp/docs/bosh.md +0 -36
- data/tpl/gcp/docs/concourse.md +0 -41
- data/tpl/gcp/docs/ingress.md +0 -12
- data/tpl/gcp/docs/oauth.md +0 -24
- data/tpl/gcp/docs/prometheus.md +0 -27
- data/tpl/gcp/docs/vault.md +0 -36
- data/tpl/gcp/terraform/gcs.tf.tt +0 -18
- data/tpl/gcp/terraform/main.tf +0 -70
- data/tpl/gcp/terraform/network.tf +0 -52
- data/tpl/gcp/terraform/outputs.tf +0 -7
- data/tpl/gcp/terraform/terraform.tfvars.tt +0 -15
- data/tpl/gcp/terraform/variables.tf +0 -37
- data/tpl/service/%output_path%/pipelines/tasks/helm-deploy.yml.tt +0 -22
- data/tpl/service/%output_path%/pipelines/tasks/run-master-tests.yml.tt +0 -12
- data/tpl/service/%output_path%/pipelines/tasks/run-pr-tests.yml.tt +0 -12
- data/tpl/skel/docs/index.md.tt +0 -0
- data/tpl/skel/docs/quickstart.md.tt +0 -0
data/bin/concourse/out
CHANGED
@@ -7,33 +7,29 @@ params = Kite::Helpers::Concourse.params(STDIN.read)
|
|
7
7
|
|
8
8
|
Kite::Helpers::Concourse.fatal '`source` missing' unless params['source']
|
9
9
|
|
10
|
-
|
11
|
-
|
10
|
+
token = params['source']['token'] # kubectl service account token
|
11
|
+
endpoint = params['source']['endpoint']
|
12
|
+
cert = params['source']['certificate-authority']
|
12
13
|
command = params['params']['command']
|
13
14
|
|
14
|
-
Kite::Helpers::Concourse.fatal '`kubeconfig` missing' if kubeconfig.to_s.empty?
|
15
15
|
Kite::Helpers::Concourse.fatal '`command` missing' if command.to_s.empty?
|
16
16
|
|
17
|
+
path_certificate = '/tmp/ca.crt'
|
17
18
|
path_key = '/tmp/key.json'
|
18
19
|
path_kubeconfig = '/tmp/kubeconfig'
|
20
|
+
cleaner = [/(token)=[^ ]*/, '\1=REDACTED']
|
19
21
|
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
env =
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
version: { status: 'error' },
|
32
|
-
metadata: ["Failed to execute command #{ command }"]
|
33
|
-
)
|
34
|
-
exit 1
|
35
|
-
end
|
36
|
-
end
|
22
|
+
env = {}
|
23
|
+
|
24
|
+
File.write(path_certificate, cert)
|
25
|
+
env['KUBECONFIG'] = path_kubeconfig
|
26
|
+
|
27
|
+
Kite::Helpers::Concourse.execute("kubectl config set-cluster concourse " \
|
28
|
+
"--embed-certs=true --server=#{ endpoint } " \
|
29
|
+
"--certificate-authority=#{ path_certificate }", env)
|
30
|
+
Kite::Helpers::Concourse.execute("kubectl config set-credentials concourse --token='#{ token }'", env, cleaner)
|
31
|
+
Kite::Helpers::Concourse.execute("kubectl config set-context concourse --cluster=concourse --user=concourse", env)
|
32
|
+
Kite::Helpers::Concourse.execute("kubectl config use-context concourse", env)
|
37
33
|
|
38
34
|
if Kite::Helpers::Concourse.execute(command, env)
|
39
35
|
::Kite::Helpers::Concourse.respond(version: { status: 'ok' })
|
@@ -0,0 +1,45 @@
|
|
1
|
+
# Kite concourse resource
|
2
|
+
|
3
|
+
When you define kite resource you should defind `kubeconfig` or kite can generate it from defined `token`, `endpoint`, `user`, `cluster`, `certificate-authority` parameters.
|
4
|
+
|
5
|
+
Here is description of parameters:
|
6
|
+
- __token__ - service account token for your cluster
|
7
|
+
- __endpoint__ - cluster server adress
|
8
|
+
- __certificate-autority__ - service account certificate for cluster
|
9
|
+
|
10
|
+
### Where to get this parameters ?
|
11
|
+
|
12
|
+
Get secret's name
|
13
|
+
```shell
|
14
|
+
kubectl get serviceAccount <service_account_name> -oyaml
|
15
|
+
echo -n SECRET | base64 -d
|
16
|
+
```
|
17
|
+
|
18
|
+
Then look on secret's yaml. Here you can find certificate-authority and token values:
|
19
|
+
```shell
|
20
|
+
kubectl get secrets <secrets_name> -oyaml
|
21
|
+
echo -n SECRET | base64 -d
|
22
|
+
```
|
23
|
+
|
24
|
+
Find server address:
|
25
|
+
```shell
|
26
|
+
kubectl config view
|
27
|
+
```
|
28
|
+
|
29
|
+
*Example*
|
30
|
+
|
31
|
+
```yaml
|
32
|
+
resource_types:
|
33
|
+
- name: kite
|
34
|
+
type: docker-image
|
35
|
+
source:
|
36
|
+
repository: heliostech/kite
|
37
|
+
|
38
|
+
resources:
|
39
|
+
- name: kite-test
|
40
|
+
type: kite
|
41
|
+
source:
|
42
|
+
token: {{sa_token}}
|
43
|
+
endpoint: {{server_ip}}
|
44
|
+
certificate-autority: {{certificate-autority}}
|
45
|
+
```
|
data/kite.gemspec
CHANGED
@@ -25,6 +25,7 @@ Gem::Specification.new do |spec|
|
|
25
25
|
spec.add_development_dependency "bundler", "~> 1.14"
|
26
26
|
spec.add_development_dependency "rake", "~> 10.0"
|
27
27
|
spec.add_development_dependency "rspec", "~> 3.0"
|
28
|
+
spec.add_development_dependency "git"
|
28
29
|
spec.add_development_dependency "simplecov"
|
29
30
|
spec.add_development_dependency "codecov"
|
30
31
|
end
|
data/lib/kite.rb
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
require 'erb'
|
2
2
|
require 'yaml'
|
3
3
|
require 'ipaddr'
|
4
|
+
require 'git'
|
4
5
|
require 'thor'
|
5
6
|
|
6
7
|
require 'kite/version'
|
@@ -8,7 +9,8 @@ require 'kite/helpers'
|
|
8
9
|
require 'kite/error'
|
9
10
|
|
10
11
|
require 'kite/base'
|
11
|
-
require 'kite/render'
|
12
12
|
require 'kite/generate'
|
13
|
+
require 'kite/module'
|
14
|
+
require 'kite/terraform'
|
13
15
|
require 'kite/core'
|
14
16
|
require 'kite/cloud'
|
data/lib/kite/cloud.rb
CHANGED
data/lib/kite/core.rb
CHANGED
@@ -13,8 +13,14 @@ module Kite
|
|
13
13
|
desc "generate", "Generate IaC from configuration"
|
14
14
|
subcommand "generate", Kite::Generate
|
15
15
|
|
16
|
-
desc '
|
17
|
-
subcommand "
|
16
|
+
desc 'module', 'Use kite modules with environments'
|
17
|
+
subcommand "module", Kite::Module
|
18
|
+
|
19
|
+
desc 'terraform', 'Run Terraform-related commands with environment variables loaded from module vars'
|
20
|
+
method_option :env, type: :string, desc: "Environment", required: true, default: ENV['KITE_ENV']
|
21
|
+
def terraform(command, *args)
|
22
|
+
Kite::Terraform.new(self, options).run(command, *args)
|
23
|
+
end
|
18
24
|
|
19
25
|
desc "version", "Return kite version"
|
20
26
|
# Return kite version
|
data/lib/kite/generate.rb
CHANGED
@@ -1,46 +1,8 @@
|
|
1
1
|
module Kite
|
2
|
-
# Subcommand for
|
2
|
+
# Subcommand for generating environments, services etc.
|
3
3
|
class Generate < Base
|
4
4
|
include Kite::Helpers
|
5
5
|
|
6
|
-
method_option :provider, type: :string, desc: "Cloud provider", enum: %w{aws gcp}, required: true
|
7
|
-
desc "cloud", "Generate cloud IaC from configuration"
|
8
|
-
# Generates Infrastructure as Code and setup scripts for the given cloud using values from <b>config/cloud.yml</b>
|
9
|
-
def cloud()
|
10
|
-
say "Generating cloud #{ options[:provider] } IaC", :green
|
11
|
-
@values = parse_cloud_config
|
12
|
-
|
13
|
-
case options[:provider]
|
14
|
-
when 'aws'
|
15
|
-
directory('aws/terraform', 'terraform')
|
16
|
-
copy_file('aws/README.md', 'README.md', force: true)
|
17
|
-
copy_file('aws/docs/kops.md', 'docs/kops.md')
|
18
|
-
|
19
|
-
directory('aws/bin/base', 'bin')
|
20
|
-
template('aws/bin/kops-deploy.sh.erb', 'bin/kops-deploy.sh')
|
21
|
-
template('aws/bin/kops-delete.sh.erb', 'bin/kops-delete.sh')
|
22
|
-
chmod('bin/bootstrap.sh', 0755)
|
23
|
-
chmod('bin/cleanup.sh', 0755)
|
24
|
-
chmod('bin/setup-tunnel.sh', 0755)
|
25
|
-
chmod('bin/kops-deploy.sh', 0755)
|
26
|
-
chmod('bin/kops-delete.sh', 0755)
|
27
|
-
|
28
|
-
when 'gcp'
|
29
|
-
directory('gcp/terraform', 'terraform')
|
30
|
-
copy_file('gcp/README.md', 'README.md', force: true)
|
31
|
-
|
32
|
-
|
33
|
-
directory('gcp/bin/base', 'bin')
|
34
|
-
chmod('bin/bootstrap.sh', 0755)
|
35
|
-
chmod('bin/cleanup.sh', 0755)
|
36
|
-
chmod('bin/setup-tunnel.sh', 0755)
|
37
|
-
|
38
|
-
else
|
39
|
-
say 'Cloud provider not specified'
|
40
|
-
|
41
|
-
end
|
42
|
-
end
|
43
|
-
|
44
6
|
method_option :name, type: :string, desc: "Task name", required: true
|
45
7
|
desc "task", "Generate task IaC from configuration"
|
46
8
|
def task()
|
@@ -71,15 +33,19 @@ module Kite
|
|
71
33
|
directory('service', path)
|
72
34
|
end
|
73
35
|
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
36
|
+
method_option :provider, type: :string, desc: "Cloud provider", enum: %w{aws gcp}, required: true
|
37
|
+
desc 'environment NAME', 'Generate an environment with base terraform files'
|
38
|
+
def environment(name)
|
39
|
+
say "Generating environment for #{options[:provider]}"
|
78
40
|
|
79
|
-
|
80
|
-
|
41
|
+
unless parse_cloud_config.key? name
|
42
|
+
append_to_file 'config/cloud.yml', "\n#{name}:\n <<: *default\n"
|
81
43
|
end
|
82
|
-
end
|
83
44
|
|
45
|
+
@cloud = parse_cloud_config[name]
|
46
|
+
@env_name = name
|
47
|
+
|
48
|
+
directory("#{options[:provider]}/environment", "config/environments/#{name}")
|
49
|
+
end
|
84
50
|
end
|
85
51
|
end
|
data/lib/kite/helpers.rb
CHANGED
@@ -4,22 +4,6 @@ module Kite::Helpers
|
|
4
4
|
raise Kite::Error, 'The config/cloud.yml is not filled out!' unless config.find { |key, hash| hash.find { |k, v| v.nil? } }.nil?
|
5
5
|
end
|
6
6
|
|
7
|
-
# Check if Terraform IaC was applied
|
8
|
-
def check_terraform_applied
|
9
|
-
raise Kite::Error, 'Did you terraform apply? terraform.tfstate is missing!' unless File.file? "terraform/terraform.tfstate"
|
10
|
-
end
|
11
|
-
|
12
|
-
# Parse Terraform .tfstate file, returning the output hash
|
13
|
-
def parse_tf_state(path)
|
14
|
-
check_terraform_applied
|
15
|
-
|
16
|
-
tf_state = YAML.load(File.read(path))
|
17
|
-
tf_output = tf_state["modules"].first["outputs"]
|
18
|
-
tf_output.map { |k, v| tf_output[k] = v["value"] }
|
19
|
-
|
20
|
-
tf_output
|
21
|
-
end
|
22
|
-
|
23
7
|
# Parse config/cloud.yml, returning the output hash
|
24
8
|
def parse_cloud_config
|
25
9
|
cloud_config = YAML.load(File.read('config/cloud.yml'))
|
@@ -27,60 +11,4 @@ module Kite::Helpers
|
|
27
11
|
|
28
12
|
cloud_config
|
29
13
|
end
|
30
|
-
|
31
|
-
# Return public subnet id depending on
|
32
|
-
# whether it's declared in config/cloud.yml or not
|
33
|
-
def conditional_subnet_id(values)
|
34
|
-
subnet_id = values['aws']['public_subnet']['id']
|
35
|
-
|
36
|
-
if subnet_id.empty?
|
37
|
-
'${aws_subnet.platform_dmz.id}'
|
38
|
-
else
|
39
|
-
subnet_id
|
40
|
-
end
|
41
|
-
end
|
42
|
-
|
43
|
-
# Return vpc id depending on
|
44
|
-
# whether it's declared in config/cloud.yml or not
|
45
|
-
def conditional_vpc_id(values)
|
46
|
-
vpc_id = values['aws']['vpc_id']
|
47
|
-
|
48
|
-
if vpc_id.empty?
|
49
|
-
'${aws_vpc.platform.id}'
|
50
|
-
else
|
51
|
-
vpc_id
|
52
|
-
end
|
53
|
-
end
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
# Returns subnet's IP range slice in a BOSH manifest-compatible way
|
59
|
-
def ip_range(subnet, range)
|
60
|
-
|
61
|
-
subnet = subnet.to_a # Turn subnet into array representation to be DRY
|
62
|
-
|
63
|
-
case range
|
64
|
-
when Integer
|
65
|
-
raise Kite::Error, 'Range number less than one in ip_range()' if range < 1
|
66
|
-
|
67
|
-
subnet[0].to_s + '-' + subnet[range].to_s
|
68
|
-
|
69
|
-
when Array
|
70
|
-
raise Kite::Error, 'Invalid number of elements in ip_range()' unless range.length == 2
|
71
|
-
raise Kite::Error, 'Second index is less than the first one in ip_range()' if range.last < range.first
|
72
|
-
|
73
|
-
subnet[range.first].to_s + '-' + subnet[range.last].to_s
|
74
|
-
|
75
|
-
when Range
|
76
|
-
raise Kite::Error, 'Second index is less than the first one in ip_range()' if range.last < range.first
|
77
|
-
|
78
|
-
range = range.to_a
|
79
|
-
subnet[range.first].to_s + '-' + subnet[range.last].to_s
|
80
|
-
|
81
|
-
else
|
82
|
-
raise Kite::Error, 'Unsupported range type for ip_range()'
|
83
|
-
end
|
84
|
-
end
|
85
|
-
|
86
14
|
end
|
@@ -24,8 +24,9 @@ module Kite
|
|
24
24
|
exit 1
|
25
25
|
end
|
26
26
|
|
27
|
-
def self.execute(command, env = {})
|
28
|
-
|
27
|
+
def self.execute(command, env = {}, gsub_log_args = nil)
|
28
|
+
command_log = gsub_log_args ? command.gsub(*gsub_log_args) : command
|
29
|
+
log("+ #{ command_log }")
|
29
30
|
Open3.popen2e(env, command) do |stdin, stdout, wait_thr|
|
30
31
|
::Kite::Helpers::Concourse.log(stdout.read)
|
31
32
|
return wait_thr.value.exitstatus.zero?
|
data/lib/kite/module.rb
ADDED
@@ -0,0 +1,76 @@
|
|
1
|
+
module Kite
|
2
|
+
class Module < Base
|
3
|
+
include Kite::Helpers
|
4
|
+
|
5
|
+
method_option :env, type: :string, desc: "Environment", required: true, default: ENV['KITE_ENV']
|
6
|
+
desc 'init https://github.com/foo/bar-module', 'Initialize a kite module and render its vars.module.yml'
|
7
|
+
def init(uri)
|
8
|
+
@uri = uri
|
9
|
+
@name = uri.gsub(/(.*:|.git)/, '').split('/').last
|
10
|
+
@path = "modules/#{@name}"
|
11
|
+
@env = options[:env]
|
12
|
+
|
13
|
+
say "Cloning the #{@name} module"
|
14
|
+
clone_module
|
15
|
+
|
16
|
+
say "Rendering vars"
|
17
|
+
render_vars
|
18
|
+
|
19
|
+
say "Use git submodule add #{@path} to be able to commit this module as a submodule", :yellow
|
20
|
+
say "Rendered successfully, please fill out config/environments/#{@env}/vars.#{@name}.yml with correct values", :green
|
21
|
+
end
|
22
|
+
|
23
|
+
method_option :env, type: :string, desc: "Environment", required: true, default: ENV['KITE_ENV']
|
24
|
+
desc 'render PATH', 'Render kite module files using vars.*module*.yml'
|
25
|
+
def render(path)
|
26
|
+
@path = path
|
27
|
+
@name = @path.split('/').last
|
28
|
+
@env = options[:env]
|
29
|
+
@vars = load_vars
|
30
|
+
@cloud = parse_cloud_config[@env]
|
31
|
+
|
32
|
+
say "Rendering files"
|
33
|
+
render_templates
|
34
|
+
end
|
35
|
+
|
36
|
+
no_commands do
|
37
|
+
def kite_env
|
38
|
+
@env
|
39
|
+
end
|
40
|
+
|
41
|
+
def clone_module
|
42
|
+
if File.exist? @path
|
43
|
+
overwrite = ask "#{@path} already contains a module! Overwrite? (y/N)"
|
44
|
+
|
45
|
+
if overwrite.downcase == 'y'
|
46
|
+
remove_dir @path
|
47
|
+
Git.clone(@uri, @path)
|
48
|
+
say "Successfully cloned the fresh version!", :green
|
49
|
+
else
|
50
|
+
say "Keeping the current module"
|
51
|
+
end
|
52
|
+
else
|
53
|
+
Git.clone(@uri, @path)
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
def render_vars
|
58
|
+
create_file "config/environments/#{@env}/vars.#{@name}.yml", YAML.dump(manifest['variables'])
|
59
|
+
end
|
60
|
+
|
61
|
+
def render_templates
|
62
|
+
directory "#{ENV['PWD']}/modules/#{@name}/templates", ".", mode: :preserve
|
63
|
+
chmod "bin", 0755
|
64
|
+
end
|
65
|
+
|
66
|
+
def load_vars
|
67
|
+
YAML.load(File.open("config/environments/#{@env}/vars.#{@name}.yml"))
|
68
|
+
end
|
69
|
+
|
70
|
+
def manifest
|
71
|
+
YAML.load(File.open("modules/#{@name}/manifest.yml"))
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
end
|
76
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
module Kite
|
2
|
+
class Terraform
|
3
|
+
|
4
|
+
def initialize(core, options)
|
5
|
+
@core = core
|
6
|
+
@env_name = options[:env]
|
7
|
+
end
|
8
|
+
|
9
|
+
def run(command, *args)
|
10
|
+
STDERR.puts "Loading env"
|
11
|
+
load_env
|
12
|
+
script = "terraform #{command} #{args.join " "}"
|
13
|
+
STDERR.puts script
|
14
|
+
|
15
|
+
Dir.chdir("config/environments/#{@env_name}") do
|
16
|
+
system(script)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
def load_env
|
21
|
+
load_vars
|
22
|
+
@vars.each do |var, val|
|
23
|
+
key = "TF_VAR_#{var}"
|
24
|
+
ENV[key] = val
|
25
|
+
STDERR.puts "%-25s: %s" % [key, ENV["TF_VAR_#{var}"]]
|
26
|
+
end
|
27
|
+
|
28
|
+
# TODO: Need to be set only in case of GCP
|
29
|
+
# ENV['GOOGLE_APPLICATION_CREDENTIALS'] = @vars["credentials"]
|
30
|
+
end
|
31
|
+
|
32
|
+
def cloud
|
33
|
+
YAML.load(File.read('config/cloud.yml'))[@env_name]
|
34
|
+
end
|
35
|
+
|
36
|
+
def load_vars
|
37
|
+
vars_files = Dir["config/environments/#{@env_name}/vars.*.yml"]
|
38
|
+
@vars = Hash.new
|
39
|
+
vars_files.each do |f|
|
40
|
+
tf_vars = YAML.load(File.read(f))['terraform']
|
41
|
+
@vars.merge!(tf_vars) unless tf_vars.nil?
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|