rna 0.1.7 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
data/Guardfile CHANGED
@@ -4,6 +4,7 @@ end
4
4
 
5
5
  guard 'rspec' do
6
6
  watch(%r{^spec/.+_spec\.rb$})
7
+ watch(%r{^lib/rna/(.+)\.rb$}) { |m| "spec/lib/rna_spec.rb" }
7
8
  watch(%r{^lib/(.+)\.rb$}) { |m| "spec/lib/#{m[1]}_spec.rb" }
8
9
  # watch('spec/spec_helper.rb') { "spec" }
9
10
  end
data/README.md CHANGED
@@ -35,15 +35,14 @@ Example rna.rb file
35
35
  ###################################
36
36
  # Settings
37
37
  default_inherits 'base'
38
- global_attributes(:except => ['base']) do
38
+ global(:except => 'base') do
39
39
  set 'framework_env', 'production'
40
40
  end
41
41
 
42
42
  ###################################
43
- # Post processing rules that run at the end
44
- rule do
45
- set 'framework_env', 'production' if name =~ /^prod/
46
- set 'framework_env', 'staging' if name =~ /^stag/
43
+ pre_rule do
44
+ set 'chef_branch', 'prod' if role =~ /^prod/
45
+ set 'chef_branch', 'master' if role =~ /^stag/
47
46
  end
48
47
 
49
48
  ###################################
@@ -67,21 +66,123 @@ role 'prod-api-resque', 'stag-api-resque' do
67
66
  run_list ['base','api_resque']
68
67
  set 'workers', 8
69
68
  end
69
+
70
+ ###################################
71
+ # Post processing rules that run at the end
72
+ post_rule do
73
+ set 'framework_env', 'production' if role =~ /^prod/
74
+ set 'framework_env', 'staging' if role =~ /^stag/
75
+ end
70
76
  ```
71
77
 
72
78
  <pre>
73
- $ rna build
79
+ $ rna generate
74
80
  </pre>
75
81
 
76
- If you're using the starter config/rna.rb, this should build:
82
+ Here's the example of the output looks like:
83
+
84
+ output/base.json:
85
+
86
+ ```json
87
+ {
88
+ "role": "base",
89
+ "run_list": [
90
+ "base"
91
+ ]
92
+ }
93
+ ```
94
+
95
+ output/prod-api-app.json:
96
+
97
+ ```json
98
+ {
99
+ "framework_env": "production",
100
+ "role": "prod-api-app",
101
+ "run_list": [
102
+ "base",
103
+ "api_app"
104
+ ],
105
+ "application": "api",
106
+ "deploy_code": true,
107
+ "repository": "git@github.com:br/api.git"
108
+ }
109
+ ```
77
110
 
78
- * nodejson/base.json
79
- * nodejson/prod-api-app.json
80
- * nodejson/prod-api-redis.json
81
- * nodejson/prod-api-resque.json
82
- * nodejson/stag-api-app.json
83
- * nodejson/stag-api-redis.json
84
- * nodejson/stag-api-resque.json
111
+ output/prod-api-redis.json:
112
+
113
+ ```json
114
+ {
115
+ "framework_env": "production",
116
+ "role": "prod-api-redis",
117
+ "run_list": [
118
+ "base",
119
+ "api_redis"
120
+ ]
121
+ }
122
+ ```
123
+
124
+ output/prod-api-resque.json:
125
+
126
+ ```json
127
+ {
128
+ "framework_env": "production",
129
+ "role": "prod-api-resque",
130
+ "run_list": [
131
+ "base",
132
+ "api_resque"
133
+ ],
134
+ "application": "api",
135
+ "deploy_code": true,
136
+ "repository": "git@github.com:br/api.git",
137
+ "workers": 8
138
+ }
139
+ ```
140
+
141
+ output/stag-api-app.json:
142
+
143
+ ```json
144
+ {
145
+ "framework_env": "staging",
146
+ "role": "stag-api-app",
147
+ "run_list": [
148
+ "base",
149
+ "api_app"
150
+ ],
151
+ "application": "api",
152
+ "deploy_code": true,
153
+ "repository": "git@github.com:br/api.git"
154
+ }
155
+ ```
156
+
157
+ output/stag-api-redis.json:
158
+
159
+ ```json
160
+ {
161
+ "framework_env": "staging",
162
+ "role": "stag-api-redis",
163
+ "run_list": [
164
+ "base",
165
+ "api_redis"
166
+ ]
167
+ }
168
+ ```
169
+
170
+ output/stag-api-resque.json:
171
+
172
+ ```json
173
+ {
174
+ "framework_env": "staging",
175
+ "role": "stag-api-resque",
176
+ "run_list": [
177
+ "base",
178
+ "api_resque"
179
+ ],
180
+ "application": "api",
181
+ "deploy_code": true,
182
+ "repository": "git@github.com:br/api.git",
183
+ "workers": 8
184
+ }
185
+ ```
85
186
 
86
187
  <pre>
87
188
  $ rna build -o s3 # saves s3 based on config/s3.yml settings
@@ -93,5 +194,5 @@ The config/s3.yml should look like this:
93
194
  access_key_id: hocuspocus
94
195
  secret_access_key: opensesame
95
196
  bucket: my-bucket
96
- folder: chef/nodejson
197
+ folder: chef/rna
97
198
  ```
data/lib/files/rna.rb CHANGED
@@ -3,15 +3,14 @@
3
3
  ###################################
4
4
  # Settings
5
5
  default_inherits 'base'
6
- global_attributes(:except => ['base']) do
6
+ global(:except => 'base') do
7
7
  set 'framework_env', 'production'
8
8
  end
9
9
 
10
10
  ###################################
11
- # Post processing rules that run at the end
12
- rule do
13
- set 'framework_env', 'production' if name =~ /^prod/
14
- set 'framework_env', 'staging' if name =~ /^stag/
11
+ pre_rule do
12
+ set 'chef_branch', 'prod' if role =~ /^prod/
13
+ set 'chef_branch', 'master' if role =~ /^stag/
15
14
  end
16
15
 
17
16
  ###################################
@@ -34,4 +33,11 @@ role 'prod-api-resque', 'stag-api-resque' do
34
33
  inherits 'prod-api-app'
35
34
  run_list ['base','api_resque']
36
35
  set 'workers', 8
36
+ end
37
+
38
+ ###################################
39
+ # Post processing rules that run at the end
40
+ post_rule do
41
+ set 'framework_env', 'production' if role =~ /^prod/
42
+ set 'framework_env', 'staging' if role =~ /^stag/
37
43
  end
data/lib/rna.rb CHANGED
@@ -7,6 +7,6 @@ require 'pp'
7
7
  $:.unshift File.dirname(__FILE__)
8
8
  require 'rna/version'
9
9
  require 'rna/cli'
10
- require 'rna/tasks'
10
+ require 'rna/task'
11
11
  require 'rna/dsl'
12
12
  require 'rna/outputers'
data/lib/rna/cli.rb CHANGED
@@ -4,24 +4,24 @@ module Rna
4
4
  desc "init", "Setup rna project"
5
5
  long_desc "Sets up config/rna.rb"
6
6
  def init
7
- Rna::Tasks.init
7
+ Rna::Task.init
8
8
  end
9
9
 
10
- desc "build", "Builds node.json files"
10
+ desc "generate", "Builds node.json files"
11
11
  long_desc <<EOL
12
12
  Examples:
13
13
 
14
- 1. rna build
14
+ 1. rna generate
15
15
 
16
16
  Builds the node.json files based on config/rna.rb and writes them to the ouput folder on the filesystem.
17
17
 
18
- 2. rna build -o s3
18
+ 2. rna generate -o s3
19
19
 
20
20
  Builds the node.json files based on config/rna.rb and writes them to s3 based on the s3 settings in config/s3.yml.
21
21
  EOL
22
22
  method_option :output, :aliases => '-o', :desc => "specify where to output the generated files to", :default => 'filesystem'
23
- def build
24
- Rna::Tasks.build(options.dup.merge(:verbose => true))
23
+ def generate
24
+ Rna::Task.generate(options.dup.merge(:verbose => true))
25
25
  end
26
26
  end
27
27
 
data/lib/rna/dsl.rb CHANGED
@@ -1,66 +1,116 @@
1
1
  module Rna
2
2
  class DSL
3
- @@default_inherits = nil
4
- attr_reader :attributes, :rules, :nodejsons
5
- def initialize(config_path='config/rna.rb')
6
- @path = config_path
7
- @scope = nil
8
- @rules = []
3
+ attr_reader :data, :jsons
4
+ def initialize(options={})
5
+ @options = options
6
+
7
+ @path = options[:config_path] || 'config/rna.rb'
8
+ @global_attributes = nil
9
+ @pre_rule = nil
10
+ @post_rule = nil
9
11
  @roles = []
10
- @attributes = {}
11
- @nodejsons = {}
12
12
  end
13
13
 
14
14
  def evaluate
15
15
  instance_eval(File.read(@path), @path)
16
16
  end
17
17
 
18
+ def global(options={},&block)
19
+ @global = {:options => options, :block => block}
20
+ end
21
+
22
+ def default_inherits(role)
23
+ Role.default_inherits = role
24
+ end
25
+
26
+ def pre_rule(&block)
27
+ @pre_rule = {:block => block}
28
+ end
29
+
30
+ def post_rule(&block)
31
+ @post_rule = {:block => block}
32
+ end
33
+
34
+ def role(*names, &block)
35
+ names.each {|name| each_role(name, &block) }
36
+ end
37
+
38
+ def each_role(name, &block)
39
+ @roles << {:name => name, :block => block}
40
+ end
41
+
42
+ def run
43
+ evaluate
44
+ build
45
+ process
46
+ @options.empty? ? output : output(@options)
47
+ end
48
+
18
49
  def build
19
- # process roles
20
- @roles.each do |role|
21
- @nodejsons[role] = process_role(role)
50
+ @data = {
51
+ 'global' => nil,
52
+ 'roles' => []
53
+ }
54
+ # build global attributes
55
+ @data['global'] = Global.new(@global[:options], @global[:block]).build
56
+
57
+ # build roles
58
+ @roles.each do |r|
59
+ @data['roles'] << Role.new(r[:name], r[:block], @options).build
22
60
  end
23
- @nodejsons
61
+
62
+ @data
24
63
  end
25
-
26
- # builds node.json
64
+
65
+ def process
66
+ @jsons = {}
67
+ roles = @data['roles'].collect{|h| h['name']}
68
+ roles.each do |role|
69
+ @jsons[role] = process_role(role)
70
+ end
71
+ @jsons
72
+ end
73
+
74
+ # builds node.json hash
27
75
  # 1. global attributes
28
- # 2. parent inherited attributes all the way up the inheritance chain
29
- # each descendent role overrides it's parent role
30
- # 3. final attributes from the desired role is built last
31
- def process_role(role, exclude_global=nil)
76
+ # 2. pre rule
77
+ # 3. role, going up the inherits chain
78
+ # 4. post rule
79
+ def process_role(role, exclude_global=nil, depth=1)
32
80
  # only compute exclude_global on on top level call and continue passing down recursive stack call
33
81
  if exclude_global.nil?
34
- exclude_global = @attributes['global']['except'].include?(role)
82
+ exclude_global = @data['global']['except'].include?(role)
35
83
  end
36
84
 
37
- inherits = @attributes[role]['inherits']
85
+ role_data = @data['roles'].find {|h| h['name'] == role}
86
+ inherits = role_data['inherits']
38
87
  if inherits
39
- nodejson = process_role(inherits, exclude_global)
88
+ json = process_role(inherits, exclude_global, depth+1)
40
89
  else
41
- if exclude_global
42
- nodejson = {}
43
- else
44
- attributes = @attributes['global']['attributes'] || {}
45
- nodejson = attributes.clone
90
+ json = exclude_global ? {} : @data['global']['attributes'].clone
91
+ if @pre_rule
92
+ pre_data = Rule.new(role, @pre_rule[:block]).build
93
+ json.merge!(pre_data['attributes'])
46
94
  end
47
95
  end
48
96
 
49
- # apply each rule to each role's attributes before we do the merge
50
- @rules.each do |block|
51
- set_scope(role)
52
- self.instance_eval(&block)
97
+ attributes = role_data['attributes'] || {}
98
+ json.merge!(attributes)
99
+ # only process post rule at the very last step
100
+ if @post_rule and depth == 1
101
+ post_data = Rule.new(role, @post_rule[:block]).build
102
+ json.merge!(post_data['attributes'])
53
103
  end
54
-
55
- attributes = @attributes[role]['attributes'] || {}
56
- nodejson.merge!(attributes)
57
- nodejson
104
+ json
58
105
  end
59
106
 
60
107
  def output(options={})
61
108
  jsons = {}
62
- nodejsons.each do |role,data|
63
- jsons[role] = JSON.pretty_generate(data)
109
+ @jsons.each do |role,data|
110
+ role_data = @data['roles'].find {|h| h['name'] == role}
111
+ if role_data['output']
112
+ jsons[role] = JSON.pretty_generate(data)
113
+ end
64
114
  end
65
115
 
66
116
  outputer = options[:output] || 'filesystem'
@@ -69,62 +119,87 @@ module Rna
69
119
  outputer_class.new(options).run(jsons)
70
120
  end
71
121
 
72
- # must be called before every instance_eval of the dsl to set the @scope
73
- def set_scope(scope,type=Hash)
74
- @scope = scope
75
- @attributes[@scope] ||= type.new
76
- end
122
+ class Builder
123
+ def build
124
+ instance_eval(&@block) if @block
125
+ @data
126
+ end
77
127
 
78
- def global_attributes(options={},&block)
79
- set_scope('global')
80
- @attributes['global']['except'] = [options[:except]].flatten
81
- self.instance_eval(&block)
82
- end
83
- def default_inherits(role)
84
- @@default_inherits = role
85
- end
86
- # rules are stored in a different place than attributes
87
- def rule(name=nil,&block)
88
- @rules << block
89
- end
90
- def role(*names,&block)
91
- names.each do |name|
92
- evaluate_role(name,&block)
128
+ def set(key, value)
129
+ @data['attributes'][key] = value
93
130
  end
94
131
  end
95
- def evaluate_role(name,&block)
96
- @roles << name
97
- set_scope(name)
98
- instance_eval(&default_block)
99
- instance_eval(&block) if block_given?
100
- end
101
132
 
102
- def default_block
103
- Proc.new do
104
- @attributes[@scope]['name'] = @scope
105
- set 'role', name
106
- inherits @@default_inherits
133
+ # rules get processed scoed to a specific role
134
+ class Rule < Builder
135
+ attr_reader :role
136
+ def initialize(role, block)
137
+ @role = role
138
+ @block = block
139
+ @data = {
140
+ 'attributes' => {}
141
+ }
107
142
  end
108
- end
109
143
 
110
- # methods in blocks, right now I'm mixing all the methods from role, rule, global_attributes together, because there's not a lot and its simple this way
111
- # methods rely on @scope being already via set_scope method
112
- def name
113
- @attributes[@scope]['name']
114
- end
115
- def set(key, value)
116
- # puts "%%% @scope #{@scope.inspect}"
117
- # pp @attributes
118
- @attributes[@scope]['attributes'] ||= {}
119
- @attributes[@scope]['attributes'][key] = value
144
+ def name
145
+ @role
146
+ end
120
147
  end
121
- def inherits(role)
122
- role = nil if role == @scope # can't inherit itself
123
- @attributes[@scope]['inherits'] = role
148
+
149
+ class Global < Builder
150
+ def initialize(options, block)
151
+ @options = options
152
+ @block = block
153
+ @data = {
154
+ 'except' => [options[:except]].compact,
155
+ 'attributes' => {}
156
+ }
157
+ end
124
158
  end
125
- def run_list(list)
126
- list = list.collect {|i| "role[#{i}]"}
127
- set('run_list', list)
159
+
160
+ class Role < Builder
161
+ attr_reader :name
162
+ def initialize(name, block, options)
163
+ @name = name
164
+ @block = block
165
+ @options = options
166
+
167
+ @data = {
168
+ 'name' => name,
169
+ 'attributes' => {
170
+ 'role' => name
171
+ },
172
+ 'inherits' => @@default_inherits != name ? @@default_inherits : nil,
173
+ 'output' => true
174
+ }
175
+ end
176
+
177
+ def self.default_inherits=(inherits)
178
+ @@default_inherits = inherits
179
+ end
180
+
181
+ def role
182
+ @name
183
+ end
184
+
185
+ def output(val)
186
+ @data['output'] = val
187
+ end
188
+
189
+ def inherits(role)
190
+ role = nil if role == @name # can't inherit itself
191
+ @data['inherits'] = role
192
+ end
193
+
194
+ def role_list(list)
195
+ list = list.collect {|i| "role[#{i}]"}
196
+ set('run_list', list)
197
+ end
198
+
199
+ def run_list(list)
200
+ set('run_list', list)
201
+ end
128
202
  end
203
+
129
204
  end
130
205
  end
@@ -1,5 +1,5 @@
1
1
  module Rna
2
- class Tasks
2
+ class Task
3
3
  def self.init(project_root=".",options={})
4
4
  puts "Settin up rna project" unless options[:quiet]
5
5
  FileUtils.mkdir("#{project_root}/config") unless File.exist?("#{project_root}/config")
@@ -15,22 +15,16 @@ module Rna
15
15
  end
16
16
  end
17
17
  end
18
- def self.build(options)
19
- new(options).build
18
+ def self.generate(options)
19
+ new(options).generate
20
20
  end
21
21
 
22
22
  def initialize(options={})
23
23
  @options = options
24
- if options[:config_path]
25
- @dsl = DSL.new(options[:config_path])
26
- else
27
- @dsl = DSL.new
28
- end
24
+ @dsl = options[:config_path] ? DSL.new(options) : DSL.new
29
25
  end
30
- def build
31
- @dsl.evaluate
32
- @dsl.build
33
- @dsl.output(@options)
26
+ def generate
27
+ @dsl.run
34
28
  end
35
29
  end
36
30
  end
data/lib/rna/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Rna
2
- VERSION = '0.1.7'
2
+ VERSION = '0.2.0'
3
3
  end
data/spec/lib/rna_spec.rb CHANGED
@@ -6,117 +6,46 @@ describe Rna do
6
6
  before(:each) do
7
7
  @project_root = File.expand_path("../../project", __FILE__)
8
8
  @project2_root = File.expand_path("../../project2", __FILE__)
9
- @dsl = Rna::DSL.new("#{@project_root}/config/rna.rb")
10
- @dsl.evaluate
9
+ @dsl = Rna::DSL.new(
10
+ :config_path => "#{@project_root}/config/rna.rb",
11
+ :output_path => "#{@project_root}/output"
12
+ )
11
13
  end
12
14
 
13
15
  after(:each) do
14
16
  FileUtils.rm_rf("#{@project_root}/output")
15
17
  end
16
18
 
17
- it "evaluate global attributes data to be used later to merge the nodejson structures together" do
18
- attributes = @dsl.attributes
19
- attributes.should be_a(Hash)
20
- # pp attributes
21
- attributes['global']['attributes']['application'].should be_nil
22
- attributes['global']['attributes']['deploy_code'].should be_false
23
- attributes['global']['attributes']['framework_env'].should == 'production'
24
- attributes['global']['attributes']['repository'].should be_nil
25
- end
26
-
27
- it "evaluate base attributes data that does not include the global attributes" do
28
- attributes = @dsl.attributes
29
- attributes.should be_a(Hash)
30
- attributes['base']['attributes'].keys.should_not include('application')
31
- attributes['base']['attributes']['run_list'].should == ["role[base]"]
32
- end
33
-
34
- it "evaluate base attributes data should not inherit itself" do
35
- attributes = @dsl.attributes
36
- attributes.should be_a(Hash)
37
- attributes['base']['inherits'].should be_nil
38
- end
39
-
40
- it "roles without blocks should run the default block" do
41
- attributes = @dsl.attributes
42
- # running the default block will set inherits attribute
43
- attributes['prod-api-redis']['inherits'].should == 'base'
44
- end
45
-
46
- it "roles with blocks should run the default block and then their own block" do
47
- attributes = @dsl.attributes
48
- # hard to read test, but after the default block runs, the passed in role block rusn and overrides the default_blocks inherits attribuute
49
- attributes['prod-api-resque']['inherits'].should == 'prod-api-app'
50
- end
51
-
52
- it "roles with blocks should override the global attributes" do
53
- attributes = @dsl.attributes
54
- attributes['prod-masta-android']['attributes']['application'].should == 'masta'
55
- attributes['prod-masta-android']['attributes']['deploy_code'].should be_true
56
- attributes['prod-masta-android']['attributes']['repository'].should == 'git@github.com:arockwell/masta_blasta.git'
57
- end
58
-
59
- it "base node.json should not include global attributes" do
60
- @dsl.build
61
- @dsl.nodejsons['base']['run_list'].should == ["role[base]"]
62
- @dsl.nodejsons['base']['role'].should == 'base'
63
- @dsl.nodejsons['base'].keys.should_not include('application')
64
- @dsl.nodejsons['base'].keys.should_not include('repository')
65
- end
66
-
67
- it "prod-api-redis node.json should include base plus global attributes" do
68
- @dsl.build
69
- @dsl.nodejsons['prod-api-redis']['run_list'].should == ["role[base]"]
70
- @dsl.nodejsons['prod-api-redis']['deploy_code'].should be_false
71
- end
72
-
73
- it "prod-api-app node.json should include global attributes plus additional attributes" do
74
- @dsl.build
75
- @dsl.nodejsons['prod-api-app']['run_list'].should == ["role[base]", "role[api_app]"]
76
- @dsl.nodejsons['prod-api-app']['deploy_code'].should be_true
77
- @dsl.nodejsons['prod-api-app'].keys.should include('scout')
78
- end
79
-
80
- it "prod-api-resque node.json inherit attributes from prod-api-app" do
81
- @dsl.build
82
- @dsl.nodejsons['prod-api-resque']['run_list'].should == @dsl.nodejsons['prod-api-app']['run_list']
83
- @dsl.nodejsons['prod-api-resque']['deploy_code'].should == @dsl.nodejsons['prod-api-app']['deploy_code']
84
- end
85
-
86
- it "should respect rules and change framework_env" do
87
- @dsl.build
88
- @dsl.nodejsons['stag-masta-android']['application'].should == 'masta'
89
- @dsl.nodejsons['stag-masta-android']['framework_env'].should == 'staging'
90
- @dsl.nodejsons['prod-masta-android']['framework_env'].should == 'production'
91
- @dsl.nodejsons
92
- end
19
+ # it "should build attributes" do
20
+ # @dsl.evaluate
21
+ # @dsl.build
22
+ # pp @dsl.data
23
+ # @dsl.process
24
+ # pp @dsl.jsons
25
+ # end
93
26
 
94
27
  it "should write json files to outputs folder" do
95
- @dsl.build
96
- @dsl.output(:output => 'filesystem', :output_path => "#{@project_root}/output")
28
+ @dsl.run
97
29
  Dir.glob("#{@project_root}/output/*").size.should > 0
98
30
  end
99
31
 
100
32
  # complete end to end tests
101
33
  it "base.json should contain correct attributes" do
102
- @dsl.build
103
- @dsl.output(:output => 'filesystem', :output_path => "#{@project_root}/output")
34
+ @dsl.run
104
35
  base = JSON.load(IO.read("#{@project_root}/output/base.json"))
105
36
  base['role'].should == 'base'
106
37
  base['run_list'].should == ["role[base]"]
107
38
  end
108
39
 
109
40
  it "base.json should not contain global attributes" do
110
- @dsl.build
111
- @dsl.output(:output => 'filesystem', :output_path => "#{@project_root}/output")
41
+ @dsl.run
112
42
  base = JSON.load(IO.read("#{@project_root}/output/base.json"))
113
43
  base['framework_env'].should be_nil
114
44
  base['deploy_code'].should be_nil
115
45
  end
116
46
 
117
47
  it "prod-api-redis.json should contain base and global attributes" do
118
- @dsl.build
119
- @dsl.output(:output => 'filesystem', :output_path => "#{@project_root}/output")
48
+ @dsl.run
120
49
  json = JSON.load(IO.read("#{@project_root}/output/prod-api-redis.json"))
121
50
  json['role'].should == 'prod-api-redis'
122
51
  json['run_list'].should == ["role[base]"]
@@ -125,8 +54,7 @@ describe Rna do
125
54
  end
126
55
 
127
56
  it "stag-api-redis.json should contain base and global attributes and apply rules" do
128
- @dsl.build
129
- @dsl.output(:output => 'filesystem', :output_path => "#{@project_root}/output")
57
+ @dsl.run
130
58
  json = JSON.load(IO.read("#{@project_root}/output/stag-api-redis.json"))
131
59
  json['role'].should == 'stag-api-redis'
132
60
  json['run_list'].should == ["role[base]"]
@@ -135,8 +63,7 @@ describe Rna do
135
63
  end
136
64
 
137
65
  it "prod-api-app.json should contain base and global attributes" do
138
- @dsl.build
139
- @dsl.output(:output => 'filesystem', :output_path => "#{@project_root}/output")
66
+ @dsl.run
140
67
  json = JSON.load(IO.read("#{@project_root}/output/prod-api-app.json"))
141
68
  json['role'].should == 'prod-api-app'
142
69
  json['run_list'].should == ["role[base]","role[api_app]"]
@@ -145,10 +72,36 @@ describe Rna do
145
72
  json['scout'].should be_a(Hash)
146
73
  end
147
74
 
75
+ it "prod-api-app.json should contain pre and post rules" do
76
+ @dsl.run
77
+ json = JSON.load(IO.read("#{@project_root}/output/prod-api-app.json"))
78
+ json['role'].should == 'prod-api-app'
79
+ json['run_list'].should == ["role[base]","role[api_app]"]
80
+ json['deploy_code'].should == true
81
+ json['framework_env'].should == 'production'
82
+ json['scout'].should be_a(Hash)
83
+ json['pre_rule'].should == 1
84
+ json['post_rule'].should == 2
85
+ end
86
+
87
+ it "masta-app should not generate output file" do
88
+ @dsl.run
89
+ File.exist?("#{@project_root}/output/masta-app.json").should be_false
90
+ File.exist?("#{@project_root}/output/prod-masta-android.json").should be_true
91
+ json = JSON.load(IO.read("#{@project_root}/output/prod-masta-android.json"))
92
+ json['masta_app'].should == 123
93
+ end
94
+
95
+ ###################
96
+
148
97
  # only run when S3=1, will need to setup spec/project/config/s3.yml
149
98
  it "should upload to s3" do
150
- @dsl.build
151
- outputer = @dsl.output(:output => 's3', :s3_config_path => "#{@project_root}/config/s3.yml")
99
+ @dsl = Rna::DSL.new(
100
+ :output => 's3',
101
+ :s3_config_path => "#{@project_root}/config/s3.yml",
102
+ :config_path => "#{@project_root}/config/rna.rb"
103
+ )
104
+ outputer = @dsl.run
152
105
 
153
106
  config = outputer.config
154
107
  s3 = outputer.s3
@@ -171,14 +124,14 @@ describe Rna do
171
124
  it "task init should set up project" do
172
125
  File.exist?("#{@project2_root}/config/s3.yml").should be_false
173
126
  File.exist?("#{@project2_root}/config/rna.rb").should be_false
174
- Rna::Tasks.init(@project2_root, :quiet => true)
127
+ Rna::Task.init(@project2_root, :quiet => true)
175
128
  File.exist?("#{@project2_root}/config/s3.yml").should be_true
176
129
  File.exist?("#{@project2_root}/config/rna.rb").should be_true
177
130
  FileUtils.rm_rf("#{@project2_root}/config")
178
131
  end
179
132
 
180
133
  it "task build should generate node.json files" do
181
- Rna::Tasks.build(
134
+ Rna::Task.generate(
182
135
  :config_path => "#{@project_root}/config/rna.rb",
183
136
  :output_path => "#{@project_root}/output"
184
137
  )
@@ -1,7 +1,7 @@
1
1
  ###################################
2
2
  # Settings
3
3
  default_inherits 'base'
4
- global_attributes(:except => 'base') do
4
+ global(:except => 'base') do
5
5
  set 'application', nil
6
6
  set 'deploy_code', false
7
7
  set 'framework_env', 'production'
@@ -9,17 +9,17 @@ global_attributes(:except => 'base') do
9
9
  end
10
10
 
11
11
  ###################################
12
- # Post processing rules that run at the end
13
- rule do
14
- set 'framework_env', 'production' if name =~ /^prod/
15
- set 'framework_env', 'staging' if name =~ /^stag/
12
+ pre_rule do
13
+ set 'pre_rule', 1
14
+ set 'chef_branch', 'prod' if role =~ /^prod/
15
+ set 'chef_branch', 'master' if role =~ /^stag/
16
16
  end
17
17
 
18
18
  ###################################
19
19
  # Roles
20
20
  # base
21
21
  role 'base' do
22
- run_list ['base']
22
+ role_list ['base']
23
23
  end
24
24
  # api
25
25
  role 'prod-api-redis', 'stag-api-redis'
@@ -28,7 +28,7 @@ role 'prod-api-resque', 'stag-api-resque' do
28
28
  set 'workers', 8
29
29
  end
30
30
  role 'prod-api-app', 'stag-api-app' do
31
- run_list ['base','api_app']
31
+ role_list ['base','api_app']
32
32
  set 'application', 'api'
33
33
  set 'deploy_code', true
34
34
  set 'repository', 'git@github.com:br/api.git'
@@ -40,9 +40,22 @@ role 'prod-api-app', 'stag-api-app' do
40
40
  }
41
41
  end
42
42
  # masta
43
+ role 'masta-app' do
44
+ output false
45
+ set 'masta_app', 123
46
+ end
43
47
  role 'prod-masta-redis', 'stag-masta-redis'
44
48
  role 'prod-masta-android', 'stag-masta-android' do
49
+ inherits 'masta-app'
45
50
  set 'application', 'masta'
46
51
  set 'deploy_code', true
47
52
  set 'repository', 'git@github.com:arockwell/masta_blasta.git'
53
+ end
54
+
55
+ ###################################
56
+ # Post processing rules that run at the end
57
+ post_rule do
58
+ set 'post_rule', 2
59
+ set 'framework_env', 'production' if role =~ /^prod/
60
+ set 'framework_env', 'staging' if role =~ /^stag/
48
61
  end
@@ -1,4 +1,4 @@
1
1
  access_key_id: hocuspocus
2
2
  secret_access_key: opensesame
3
3
  bucket: my-bucket
4
- folder: chef/nodejson
4
+ folder: chef/rna
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rna
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.7
4
+ version: 0.2.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-12-06 00:00:00.000000000 Z
12
+ date: 2012-12-17 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rake
@@ -183,23 +183,12 @@ files:
183
183
  - lib/rna/cli.rb
184
184
  - lib/rna/dsl.rb
185
185
  - lib/rna/outputers.rb
186
- - lib/rna/tasks.rb
186
+ - lib/rna/task.rb
187
187
  - lib/rna/version.rb
188
188
  - rna.gemspec
189
189
  - spec/lib/rna_spec.rb
190
190
  - spec/project/config/rna.rb
191
191
  - spec/project/config/s3.example.yml
192
- - spec/project/nodejson/base.json
193
- - spec/project/nodejson/prod-api-app.json
194
- - spec/project/nodejson/prod-api-redis.json
195
- - spec/project/nodejson/prod-api-resque.json
196
- - spec/project/nodejson/prod-masta-android.json
197
- - spec/project/nodejson/prod-masta-redis.json
198
- - spec/project/nodejson/stag-api-app.json
199
- - spec/project/nodejson/stag-api-redis.json
200
- - spec/project/nodejson/stag-api-resque.json
201
- - spec/project/nodejson/stag-masta-android.json
202
- - spec/project/nodejson/stag-masta-redis.json
203
192
  - spec/project2/.gitkeep
204
193
  - spec/project2/Guardfile
205
194
  homepage: ''
@@ -216,7 +205,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
216
205
  version: '0'
217
206
  segments:
218
207
  - 0
219
- hash: -1023493738404014817
208
+ hash: 4553005362745989703
220
209
  required_rubygems_version: !ruby/object:Gem::Requirement
221
210
  none: false
222
211
  requirements:
@@ -225,7 +214,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
225
214
  version: '0'
226
215
  segments:
227
216
  - 0
228
- hash: -1023493738404014817
217
+ hash: 4553005362745989703
229
218
  requirements: []
230
219
  rubyforge_project:
231
220
  rubygems_version: 1.8.24
@@ -237,16 +226,5 @@ test_files:
237
226
  - spec/lib/rna_spec.rb
238
227
  - spec/project/config/rna.rb
239
228
  - spec/project/config/s3.example.yml
240
- - spec/project/nodejson/base.json
241
- - spec/project/nodejson/prod-api-app.json
242
- - spec/project/nodejson/prod-api-redis.json
243
- - spec/project/nodejson/prod-api-resque.json
244
- - spec/project/nodejson/prod-masta-android.json
245
- - spec/project/nodejson/prod-masta-redis.json
246
- - spec/project/nodejson/stag-api-app.json
247
- - spec/project/nodejson/stag-api-redis.json
248
- - spec/project/nodejson/stag-api-resque.json
249
- - spec/project/nodejson/stag-masta-android.json
250
- - spec/project/nodejson/stag-masta-redis.json
251
229
  - spec/project2/.gitkeep
252
230
  - spec/project2/Guardfile
@@ -1,6 +0,0 @@
1
- {
2
- "role": "base",
3
- "run_list": [
4
- "role[base]"
5
- ]
6
- }
@@ -1,17 +0,0 @@
1
- {
2
- "application": "api",
3
- "deploy_code": true,
4
- "framework_env": "production",
5
- "repository": "git@github.com:br/api.git",
6
- "role": "prod-api-app",
7
- "run_list": [
8
- "role[base]",
9
- "role[api_app]"
10
- ],
11
- "scout": {
12
- "key": "abc",
13
- "gems": {
14
- "redis": null
15
- }
16
- }
17
- }
@@ -1,10 +0,0 @@
1
- {
2
- "application": null,
3
- "deploy_code": false,
4
- "framework_env": "production",
5
- "repository": null,
6
- "role": "prod-api-redis",
7
- "run_list": [
8
- "role[base]"
9
- ]
10
- }
@@ -1,18 +0,0 @@
1
- {
2
- "application": "api",
3
- "deploy_code": true,
4
- "framework_env": "production",
5
- "repository": "git@github.com:br/api.git",
6
- "role": "prod-api-resque",
7
- "run_list": [
8
- "role[base]",
9
- "role[api_app]"
10
- ],
11
- "scout": {
12
- "key": "abc",
13
- "gems": {
14
- "redis": null
15
- }
16
- },
17
- "workers": 8
18
- }
@@ -1,10 +0,0 @@
1
- {
2
- "application": "masta",
3
- "deploy_code": true,
4
- "framework_env": "production",
5
- "repository": "git@github.com:arockwell/masta_blasta.git",
6
- "role": "prod-masta-android",
7
- "run_list": [
8
- "role[base]"
9
- ]
10
- }
@@ -1,10 +0,0 @@
1
- {
2
- "application": null,
3
- "deploy_code": false,
4
- "framework_env": "production",
5
- "repository": null,
6
- "role": "prod-masta-redis",
7
- "run_list": [
8
- "role[base]"
9
- ]
10
- }
@@ -1,17 +0,0 @@
1
- {
2
- "application": "api",
3
- "deploy_code": true,
4
- "framework_env": "staging",
5
- "repository": "git@github.com:br/api.git",
6
- "role": "stag-api-app",
7
- "run_list": [
8
- "role[base]",
9
- "role[api_app]"
10
- ],
11
- "scout": {
12
- "key": "abc",
13
- "gems": {
14
- "redis": null
15
- }
16
- }
17
- }
@@ -1,10 +0,0 @@
1
- {
2
- "application": null,
3
- "deploy_code": false,
4
- "framework_env": "staging",
5
- "repository": null,
6
- "role": "stag-api-redis",
7
- "run_list": [
8
- "role[base]"
9
- ]
10
- }
@@ -1,18 +0,0 @@
1
- {
2
- "application": "api",
3
- "deploy_code": true,
4
- "framework_env": "staging",
5
- "repository": "git@github.com:br/api.git",
6
- "role": "stag-api-resque",
7
- "run_list": [
8
- "role[base]",
9
- "role[api_app]"
10
- ],
11
- "scout": {
12
- "key": "abc",
13
- "gems": {
14
- "redis": null
15
- }
16
- },
17
- "workers": 8
18
- }
@@ -1,10 +0,0 @@
1
- {
2
- "application": "masta",
3
- "deploy_code": true,
4
- "framework_env": "staging",
5
- "repository": "git@github.com:arockwell/masta_blasta.git",
6
- "role": "stag-masta-android",
7
- "run_list": [
8
- "role[base]"
9
- ]
10
- }
@@ -1,10 +0,0 @@
1
- {
2
- "application": null,
3
- "deploy_code": false,
4
- "framework_env": "staging",
5
- "repository": null,
6
- "role": "stag-masta-redis",
7
- "run_list": [
8
- "role[base]"
9
- ]
10
- }