kite 0.2.0 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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
|