terraframe 0.1.0 → 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
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