terraframe 0.1.0 → 0.1.1

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: 2af2c4fd034f13f39c212b92ff6b62b84336238a
4
- data.tar.gz: 879e04c38e9f2257aa5a2d0a5fc6e9429a0ff9d7
3
+ metadata.gz: 0dcd49ea8fc966a851305a7ba0141c7a1f20010c
4
+ data.tar.gz: be6ff6375b82ca3a50dda7b258717ca8f5b41064
5
5
  SHA512:
6
- metadata.gz: 08053ef0830878e586cfaa71050db9ac86cf8a87ea4acfb8d0348f6759b6fec1dc7338444914e74d46746c521f8f5b5577983162bd1eb93c259807c10890a83c
7
- data.tar.gz: 2b81f5742f3e391302a269c4a900a223fac75464cd78a6895ae8b998438fcb6ceecb86289d65d002a58895287e1671cf031dd01ec116806e436366fce1fc2945
6
+ metadata.gz: 75eae91b7b578746992c9c9ec9dcb03e3ce3398a6f69b42b65b146676248bb2101ca2c5941fa60bc120fe982d934650dc3d7ba8b7b6e48e49a5112946026d36a
7
+ data.tar.gz: 2f80d7729c29a43c714d573e4c8552dae0c3482b48c64ec1d5d2ac6700b76c80ae5a7e428446a7bd1a9de98a38dd8b4d63ea91e1d1c600513e3d5b67d848f38f
data/README.md CHANGED
@@ -3,9 +3,7 @@ Terraframe is a processor for a domain-specific language that outputs to the Ter
3
3
 
4
4
  [Terraform][1] is a cool infrastructure-as-code system with a boatload of functionality and a really awesome core that makes building out entire clouds on AWS super easy and super fun. I am a fan.
5
5
 
6
- _But_. But but but. It's not perfect. And personally, ever since HashiCorp went away from Ruby DSLs as configuration, I have been sad. And worse than sad, I have been unproductive as all hell. I'm just not satisfied with the state of the Terraform description language. It's hard to write, its built-in assumptions are gross (the handling of variables is a minor crime in progress), and it's just a huge step back from being able to deploy, say, a Vagrant instance--or, as I have done, [a configurable number of Vagrant instances][2]--in a nice, comprehensible manner.
7
-
8
- The configuration, while not CloudFormation-bad, is pretty bad, and I came close to ditching Terraform because it was really hard to write. I got halfway through some ERB templating monstrosity before I learned of a better way: Terraform supports JSON as a declaration notation, and that makes it really easy to build an external DSL that can be exported for use in Terraform.
6
+ _But_. But but but. It's not perfect. And personally, ever since HashiCorp went away from Ruby DSLs as configuration, I have been sad. And worse than sad, I have been unproductive as all hell. I'm just not satisfied with the state of the Terraform description language. The configuration, while not CloudFormation-bad, is static and limited, and I came close to ditching Terraform because it was really hard to write. I got halfway through some ERB templating monstrosity before I learned of a better way: Terraform supports JSON as a declaration notation, and that makes it really easy to build an external DSL that can be exported for use in Terraform. So everybody wins!
9
7
 
10
8
  ## Installation ##
11
9
  Terraframe is distributed as a RubyGem.
@@ -0,0 +1,42 @@
1
+ require 'terraframe/context'
2
+ require 'terraframe/provider'
3
+
4
+ require 'terraframe/aws/aws_resources'
5
+
6
+ module Terraframe
7
+ module AWS
8
+ class AWSContext < Context
9
+ RESOURCES = {
10
+ :aws_autoscaling_group => Terraframe::AWS::AWSResource,
11
+ :aws_db_instance => Terraframe::AWS::AWSResource,
12
+ :aws_db_security_group => Terraframe::AWS::AWSResource,
13
+ :aws_db_subnet_group => Terraframe::AWS::AWSResource,
14
+ :aws_db_parameter_group => Terraframe::AWS::AWSResource,
15
+ :aws_eip => Terraframe::AWS::AWSResource,
16
+ :aws_elb => Terraframe::AWS::AWSResource,
17
+ :aws_internet_gateway => Terraframe::AWS::AWSResource,
18
+ :aws_launch_configuration => Terraframe::AWS::AWSResource,
19
+ :aws_network_acl => Terraframe::AWS::AWSResource,
20
+ :aws_key_pair => Terraframe::AWS::AWSResource,
21
+ :aws_route_table_association => Terraframe::AWS::AWSResource,
22
+ :aws_route53_record => Terraframe::AWS::AWSResource,
23
+ :aws_route53_zone => Terraframe::AWS::AWSResource,
24
+ :aws_s3_bucket => Terraframe::AWS::AWSResource,
25
+
26
+ :aws_instance => Terraframe::AWS::AWSTaggedResource,
27
+ :aws_route_table => Terraframe::AWS::AWSTaggedResource,
28
+ :aws_security_group => Terraframe::AWS::AWSTaggedResource,
29
+ :aws_subnet => Terraframe::AWS::AWSTaggedResource,
30
+ :aws_vpc => Terraframe::AWS::AWSTaggedResource
31
+ }
32
+
33
+ def provider_type
34
+ Terraframe::Provider
35
+ end
36
+
37
+ def resources
38
+ RESOURCES
39
+ end
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,41 @@
1
+ require 'hashie/mash'
2
+ require 'terraframe/resource'
3
+ require 'pry'
4
+
5
+ module Terraframe
6
+ module AWS
7
+ class AWSResource < Terraframe::Resource
8
+ ## DSL FUNCTIONS BELOW
9
+ def method_missing(method_name, *args, &block)
10
+ if method_name == "tags"
11
+ raise "This resource does not support tags."
12
+ end
13
+ super(method_name, *args, &block)
14
+ end
15
+ end
16
+
17
+ class AWSTaggedResource < Terraframe::Resource
18
+ def initialize(name, vars, &block)
19
+ @fields = {}
20
+ @vars = Hashie::Mash.new(vars)
21
+
22
+ clear_tags!
23
+ @fields["tags"]["Name"] = name
24
+
25
+ instance_eval &block
26
+ end
27
+
28
+ def tags(&block)
29
+ tag_set = Terraframe::AWS::AWSTagBlock.new(@vars, &block)
30
+ @fields["tags"].merge!(tag_set.fields)
31
+ end
32
+
33
+ def clear_tags!
34
+ @fields["tags"] = {}
35
+ end
36
+ end
37
+
38
+ class AWSTagBlock < Terraframe::ScriptItem
39
+ end
40
+ end
41
+ end
@@ -6,7 +6,7 @@ require 'active_support/core_ext/hash'
6
6
  require 'awesome_print'
7
7
 
8
8
  require 'terraframe/state'
9
- require 'terraframe/contexts/aws_context'
9
+ require 'terraframe/aws/aws_context'
10
10
 
11
11
  module Terraframe
12
12
  class Processor
@@ -21,7 +21,7 @@ module Terraframe
21
21
  logger.debug "Logger initialized."
22
22
 
23
23
  @contexts = {}
24
- register_context(:aws, Terraframe::Contexts::AWSContext.new)
24
+ register_context(:aws, Terraframe::AWS::AWSContext.new)
25
25
  end
26
26
 
27
27
  def register_context(name, context)
@@ -2,8 +2,11 @@ require 'terraframe/script_item'
2
2
 
3
3
  module Terraframe
4
4
  class Resource < Terraframe::ScriptItem
5
- def resource_type
6
- raise "resource_type must be overridden in inheriting classes."
5
+ attr_reader :resource_name
6
+
7
+ def initialize(resource_name, vars, &block)
8
+ @resource_name = resource_name
9
+ super(vars, &block)
7
10
  end
8
11
  end
9
12
  end
@@ -70,12 +70,18 @@ module Terraframe
70
70
  end
71
71
 
72
72
  def resource(resource_type, resource_name, &block)
73
- unless @__contexts.any? { |k, v| v.resources.include?(resource_type) }
74
- logger.warn "Could not find a context that supports resource type '#{resource_type}'. Continuing, but you've been warned."
73
+ handling_context_pair = @__contexts.find { |k, v| v.resources.include?(resource_type) }
74
+ if handling_context_pair == nil
75
+ msg = "Could not find a context that supports resource type '#{resource_type}'."
76
+ logger.error msg
77
+ raise msg
75
78
  end
76
79
 
80
+ handling_context = handling_context_pair[1]
81
+ resource_class = handling_context.resources[resource_type]
82
+
77
83
  @__output[:resource][resource_type] ||= {}
78
- @__output[:resource][resource_type][resource_name.to_s] = Resource.new(vars, &block)
84
+ @__output[:resource][resource_type][resource_name.to_s] = resource_class.new(resource_name, vars, &block)
79
85
  end
80
86
 
81
87
  # anything that is not a provider or a variable should be interpreted
@@ -1,3 +1,3 @@
1
1
  module Terraframe
2
- VERSION = "0.1.0"
2
+ VERSION = "0.1.1"
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: terraframe
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ed Ropple
@@ -109,8 +109,9 @@ files:
109
109
  - Rakefile
110
110
  - bin/terraframe
111
111
  - lib/terraframe.rb
112
+ - lib/terraframe/aws/aws_context.rb
113
+ - lib/terraframe/aws/aws_resources.rb
112
114
  - lib/terraframe/context.rb
113
- - lib/terraframe/contexts/aws_context.rb
114
115
  - lib/terraframe/processor.rb
115
116
  - lib/terraframe/provider.rb
116
117
  - lib/terraframe/resource.rb
@@ -1,20 +0,0 @@
1
- require 'terraframe/context'
2
- require 'terraframe/provider'
3
-
4
- module Terraframe
5
- module Contexts
6
- class AWSContext < Context
7
- RESOURCES = [
8
- :aws_instance
9
- ]
10
-
11
- def provider_type
12
- Terraframe::Provider
13
- end
14
-
15
- def resources
16
- RESOURCES
17
- end
18
- end
19
- end
20
- end