yutani 0.1.15 → 0.1.18

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 483c5e58654c42e69d8e7e788857ce69fd1b7e86
4
- data.tar.gz: b54ada05a35257c53244c48c8de8875e177ecc57
3
+ metadata.gz: bb2d4ad0c04c2786185ef8c2fc5dee90be6460a3
4
+ data.tar.gz: f178131e875565618b1ce5d80bec675d2139e2cd
5
5
  SHA512:
6
- metadata.gz: 68fe75b176ce425ec09c835c5156e040b46f5b3ef36f1f34d6c810af6f3ba5055da50902acdc6aafefe8246b9183352164f8f86594a3b6a8f2e4e350c2b0b931
7
- data.tar.gz: dc0b8699b5b7269b02e6c5bee8673d667315394171f38b267ae0acc821d82ff51266aee34481bad849390b889a0bfad0ad75f5b7e55925c69d8c486a7a7034cb
6
+ metadata.gz: 680b9f75c7ac957e049625be0ed4008f4e4ee00806f3877deca9333770692d2d5db3efffade73d7cb945387fc7835facaff6a81704b985f6a15ca2c207aaa99e
7
+ data.tar.gz: ba161b43a65b0f9269964e9f4dc093630762b69986223ac7f50433493c177958193290862f6aeac51c5dac07adb810b280b81616ffc922ae663a742fa92221e1
data/lib/yutani/cli.rb CHANGED
@@ -22,7 +22,7 @@ module Yutani
22
22
 
23
23
  desc 'build', 'Evaluates DSL scripts and creates terraform files'
24
24
  def build
25
- scripts_dir = Yutani::Config::DEFAULTS['scripts_dir']
25
+ scripts_dir = Yutani.config['scripts_dir']
26
26
 
27
27
  files = Dir.glob(File.join(scripts_dir, '*.rb'))
28
28
  if files.empty?
@@ -32,10 +32,6 @@ module Yutani
32
32
  files.each do |script|
33
33
  Yutani.eval_file(script)
34
34
  end
35
-
36
- unless Yutani.stacks.empty?
37
- Yutani.stacks.each {|s| s.to_fs}
38
- end
39
35
  end
40
36
 
41
37
  # we need to know these things:
@@ -45,8 +41,9 @@ module Yutani
45
41
  desc 'watch', 'Run build upon changes to scripts'
46
42
  def watch
47
43
  Listen.to(
48
- Yutani::Config::DEFAULTS['scripts_dir'],
49
- Yutani::Config::DEFAULTS['includes_dir']
44
+ Yutani.config['scripts_dir'],
45
+ Yutani.config['includes_dir'],
46
+ Yutani.config['templates_dir']
50
47
  ) do |m, a, d|
51
48
 
52
49
  Yutani.logger.info "Re-build triggered: #{m} modified" unless m.empty?
@@ -133,6 +130,10 @@ module Yutani
133
130
  FileUtils.mkdir Yutani::Config::DEFAULTS['includes_dir']
134
131
  end
135
132
 
133
+ unless Dir.exists? Yutani::Config::DEFAULTS['templates_dir']
134
+ FileUtils.mkdir Yutani::Config::DEFAULTS['templates_dir']
135
+ end
136
+
136
137
  hiera_dir = Yutani::Config::DEFAULTS['hiera_config'][:yaml][:datadir]
137
138
  FileUtils.mkdir hiera_dir unless Dir.exists? hiera_dir
138
139
 
@@ -0,0 +1,67 @@
1
+ require 'open3'
2
+
3
+ module Yutani
4
+ class TerraformCommandError < StandardError; end
5
+
6
+ class RemoteConfig
7
+ include Hiera
8
+
9
+ def initialize(&block)
10
+ Docile.dsl_eval(self, &block) if block_given?
11
+ end
12
+
13
+ def command
14
+ cmds = []
15
+ cmds << "terraform remote config"
16
+ cmds << "-backend=#{@backend}"
17
+
18
+ @backend_config.fields.each do |k,v|
19
+ cmds << "-backend-config=\"#{k}=#{v}\""
20
+ end
21
+
22
+ cmds << "-pull=false"
23
+
24
+ cmds.join(' ')
25
+ end
26
+
27
+ def execute!
28
+ _, stderr, ret_code = Open3.capture3(command)
29
+
30
+ if ret_code != 0
31
+ raise TerraformCommandError,
32
+ "running the command \"#{command}\" returned error: #{stderr}"
33
+ end
34
+ end
35
+
36
+ def backend(backend_type)
37
+ @backend = backend_type
38
+ end
39
+
40
+ def backend_config(&block)
41
+ @backend_config = BackendConfig.new(&block)
42
+ end
43
+
44
+ class BackendConfig
45
+ attr_reader :fields
46
+
47
+ def initialize(&block)
48
+ @fields = {}
49
+
50
+ Docile.dsl_eval(self, &block)
51
+ end
52
+
53
+ def respond_to_missing?(method_name, include_private = false)
54
+ true
55
+ end
56
+
57
+ def method_missing(name, *args, &block)
58
+ if block_given?
59
+ raise StandardError,
60
+ "backend_config properties do not accept blocks as parameters"
61
+ else
62
+ @fields[name] = args.first
63
+ end
64
+ end
65
+ end
66
+ end
67
+ end
@@ -13,7 +13,7 @@ module Yutani
13
13
  end
14
14
 
15
15
  def resource_name
16
- @namespace.join('_')
16
+ @namespace.to_underscored_string
17
17
  end
18
18
 
19
19
  def to_h
@@ -25,7 +25,8 @@ module Yutani
25
25
  end
26
26
 
27
27
  def ref(resource_type, *namespace, attr)
28
- "${%s}" % [resource_type, namespace.join('_'), attr].join('.')
28
+ "${%s}" % [resource_type, namespace.to_underscored_string, attr].
29
+ join('.')
29
30
  end
30
31
 
31
32
  def template(path, **kv)
data/lib/yutani/stack.rb CHANGED
@@ -1,4 +1,5 @@
1
1
  require 'json'
2
+ require 'fileutils'
2
3
 
3
4
  module Yutani
4
5
  class Stack
@@ -7,17 +8,18 @@ module Yutani
7
8
  attr_accessor :resources, :providers, :outputs, :variables
8
9
 
9
10
  def initialize(*namespace, &block)
10
- @resources = []
11
- @providers = []
12
- @outputs = {}
13
- @variables = {}
14
- @namespace = namespace
11
+ @resources = []
12
+ @providers = []
13
+ @remote_config = nil
14
+ @outputs = {}
15
+ @variables = {}
16
+ @namespace = namespace
15
17
 
16
18
  Docile.dsl_eval(self, &block) if block_given?
17
19
  end
18
20
 
19
21
  def name
20
- @namespace.join('_')
22
+ @namespace.to_underscored_string
21
23
  end
22
24
 
23
25
  def resource(resource_type, *namespace, &block)
@@ -30,6 +32,10 @@ module Yutani
30
32
  Provider.new(name, &block)
31
33
  end
32
34
 
35
+ def remote_config(&block)
36
+ @remote_config = RemoteConfig.new(&block)
37
+ end
38
+
33
39
  # troposphere-like methods
34
40
  def add_resource(resource)
35
41
  @resources << resource
@@ -40,15 +46,14 @@ module Yutani
40
46
  end
41
47
 
42
48
  def inc(&block)
43
- includes_dir = Yutani::Config::DEFAULTS['includes_dir']
44
- path = File.join(includes_dir, yield)
49
+ path = File.join(Yutani.config['includes_dir'], yield)
45
50
 
46
51
  eval File.read(path), block.binding, path
47
52
  end
48
53
 
49
54
  # this generates the contents of *.tf.main
50
55
  def to_h
51
- h = {
56
+ h = {
52
57
  resource: @resources.inject(DeepMergeHash.new){|resources,r|
53
58
  resources.deep_merge!(r.to_h)
54
59
  },
@@ -74,34 +79,18 @@ module Yutani
74
79
  end
75
80
 
76
81
  def dir_path
77
- name
78
- end
79
-
80
- def tar(filename)
81
- File.open(filename, 'w+') do |tarball|
82
- create_dir_tree('./').to_tar(tarball)
83
- end
82
+ File.join(Yutani.config['terraform_dir'], name)
84
83
  end
85
84
 
86
- def to_fs(prefix='./terraform')
87
- create_dir_tree(prefix).to_fs
88
- end
85
+ def to_fs
86
+ FileUtils.mkdir_p(dir_path)
87
+ FileUtils.cd(dir_path) do
88
+ File.open('main.tf.json', 'w+', 0644) do |f|
89
+ f.write pretty_json
90
+ end
89
91
 
90
- def create_dir_tree(prefix)
91
- dir_tree(DirectoryTree.new(prefix), '')
92
- end
93
-
94
- def dir_tree(dt, prefix)
95
- full_dir_path = File.join(prefix, self.dir_path)
96
- main_tf_path = File.join(full_dir_path, 'main.tf.json')
97
-
98
- dt.add_file(
99
- main_tf_path,
100
- 0644,
101
- self.pretty_json
102
- )
103
-
104
- dt
92
+ @remote_config.execute! unless @remote_config.nil?
93
+ end
105
94
  end
106
95
  end
107
96
  end
data/lib/yutani/utils.rb CHANGED
@@ -1,5 +1,11 @@
1
1
  require 'hashie'
2
2
 
3
+ class Array
4
+ def to_underscored_string
5
+ map{|n| n.to_s.gsub('-', '_') }.join('_')
6
+ end
7
+ end
8
+
3
9
  module Yutani
4
10
  class IndifferentHash < Hash
5
11
  include Hashie::Extensions::MergeInitializer
@@ -31,6 +37,6 @@ module Yutani
31
37
  v
32
38
  end
33
39
  end
34
- end
40
+ end
35
41
  end
36
42
  end
@@ -1,3 +1,3 @@
1
1
  module Yutani
2
- VERSION = '0.1.15'
2
+ VERSION = '0.1.18'
3
3
  end
data/lib/yutani.rb CHANGED
@@ -7,19 +7,17 @@ require 'yutani/version'
7
7
  require 'yutani/config'
8
8
  require 'yutani/hiera'
9
9
  require 'yutani/cli'
10
- require 'yutani/directory_tree'
11
10
  require 'yutani/stack'
12
11
  require 'yutani/resource'
12
+ require 'yutani/remote_config'
13
13
  require 'yutani/provider'
14
14
  require 'yutani/template'
15
15
  require 'yutani/utils'
16
16
 
17
17
  module Yutani
18
- @stacks = []
19
-
20
18
  class << self
21
19
  # do we need :logger?
22
- attr_accessor :hiera, :stacks, :logger
20
+ attr_accessor :hiera, :logger
23
21
 
24
22
  def logger
25
23
  @logger ||= (
@@ -32,7 +30,7 @@ module Yutani
32
30
  # DSL statement
33
31
  def stack(*namespace, &block)
34
32
  s = Stack.new(*namespace, &block)
35
- @stacks << s
33
+ s.to_fs
36
34
  s
37
35
  end
38
36
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: yutani
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.15
4
+ version: 0.1.18
5
5
  platform: ruby
6
6
  authors:
7
7
  - Louis Garman
@@ -172,9 +172,9 @@ files:
172
172
  - lib/yutani.rb
173
173
  - lib/yutani/cli.rb
174
174
  - lib/yutani/config.rb
175
- - lib/yutani/directory_tree.rb
176
175
  - lib/yutani/hiera.rb
177
176
  - lib/yutani/provider.rb
177
+ - lib/yutani/remote_config.rb
178
178
  - lib/yutani/resource.rb
179
179
  - lib/yutani/stack.rb
180
180
  - lib/yutani/template.rb
@@ -1,43 +0,0 @@
1
- require 'rubygems/package'
2
- require 'fileutils'
3
-
4
- module Yutani
5
- # An abstraction of a real directory tree on disk
6
- # Permits us to decide later whether this will be written to disk
7
- # or embedded in a tarball, or sent over scp, etc.
8
- class DirectoryTree
9
- File = Struct.new(:path, :permissions, :content)
10
-
11
- attr_reader :files, :prefix
12
-
13
- def initialize(prefix = './')
14
- @prefix = prefix
15
- @files = []
16
- end
17
-
18
- def add_file(path, permissions, content)
19
- @files << File.new(::File.join(@prefix, path), permissions.to_i, content)
20
- end
21
-
22
- def to_fs
23
- @files.each do |f|
24
- FileUtils.mkdir_p(::File.dirname(f.path))
25
- ::File.open(f.path, 'w+', f.permissions) do |new_f|
26
- new_f.write f.content
27
- end
28
- end
29
- end
30
-
31
- def to_tar(io = STDOUT)
32
- Gem::Package::TarWriter.new(io) do |tar|
33
- @files.each do |f|
34
- tar.mkdir(::File.dirname(f.path), '0755')
35
-
36
- tar.add_file_simple(f.path, f.permissions, f.content.bytes.size) do |tar_file|
37
- tar_file.write f.content
38
- end
39
- end
40
- end
41
- end
42
- end
43
- end