chapp 0.1.0 → 0.2.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 +4 -4
- data/lib/chapp.rb +8 -0
- data/lib/chapp/app.rb +30 -164
- data/lib/chapp/app_config.rb +206 -0
- data/lib/chapp/database.rb +32 -35
- data/lib/chapp/provisioner.rb +11 -0
- data/lib/chapp/provisioner/property_provisioner.rb +18 -0
- data/lib/chapp/wiring.rb +26 -58
- data/lib/chef/knife/app_instance_create.rb +92 -0
- data/lib/chef/knife/app_show.rb +22 -15
- data/lib/chef/knife/app_upload.rb +6 -6
- metadata +6 -30
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a51ed604ba69b97122ede6837feabd660040fdaf
|
4
|
+
data.tar.gz: 10a9df7ee7b29d9329dc1ca0e1c87bc34934f5bc
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4e0d79f04a2f028b409a16c4d49f1662102bf038d4b3424960735b8e01b01dccde14fe9643d1b906d406b52b0f809b4772bb0b36ee5e977006f1d7190fb094cc
|
7
|
+
data.tar.gz: 43503eda5bf4c0d2ed83804225e01cd9c33c61d313a8a9dc8b12a35a8b5721b336d1d522218a5dd988d46226df1d788c8b294dd8935155aee758a3cab3eef408
|
data/lib/chapp.rb
CHANGED
@@ -1,7 +1,10 @@
|
|
1
1
|
require 'chapp/app'
|
2
2
|
require 'chapp/app_instance'
|
3
|
+
require 'chapp/app_config'
|
3
4
|
require 'chapp/wiring'
|
4
5
|
require 'chapp/database'
|
6
|
+
require 'chapp/provisioner'
|
7
|
+
require 'chapp/provisioner/property_provisioner'
|
5
8
|
|
6
9
|
module Chapp
|
7
10
|
|
@@ -9,4 +12,9 @@ module Chapp
|
|
9
12
|
Chapp::Database.new
|
10
13
|
end
|
11
14
|
|
15
|
+
def self.provisioner
|
16
|
+
# TODO: Make configurable
|
17
|
+
Chapp::PropertyProvisioner.new
|
18
|
+
end
|
19
|
+
|
12
20
|
end
|
data/lib/chapp/app.rb
CHANGED
@@ -3,188 +3,54 @@ require 'chef/node/attribute'
|
|
3
3
|
|
4
4
|
module Chapp
|
5
5
|
class App
|
6
|
-
|
7
|
-
# TODO: Define allowed characters (.)
|
8
6
|
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
app = App.new
|
18
|
-
app.instance_eval appString
|
19
|
-
|
20
|
-
app
|
21
|
-
end
|
22
|
-
|
23
|
-
def self.from_hash app_hash
|
24
|
-
app = App.new
|
25
|
-
|
26
|
-
app.group app_hash["group"]
|
27
|
-
app.name app_hash["name"]
|
28
|
-
|
29
|
-
app.pre_run_list app_hash["pre_run_list"]
|
30
|
-
app.post_run_list app_hash["post_run_list"]
|
31
|
-
|
32
|
-
app.run_list app_hash["run_list"]
|
33
|
-
|
34
|
-
app_hash["dependencies"].each do |cookbook, version_constraint|
|
35
|
-
app.depends cookbook, version_constraint
|
36
|
-
end
|
37
|
-
|
38
|
-
app_hash["used_apps"].each do |app_name|
|
39
|
-
app.uses app_name
|
40
|
-
end
|
41
|
-
|
42
|
-
app.node Chef::Node::Attribute.new({}, app_hash["node"], {}, {}).default
|
43
|
-
app.environment app_hash["environment"]
|
44
|
-
|
45
|
-
if app_hash.include? "type"
|
46
|
-
app.type app_hash["type"]
|
47
|
-
end
|
48
|
-
|
49
|
-
if app_hash.include? "recipe"
|
50
|
-
app.recipe app_hash["recipe"]
|
51
|
-
end
|
52
|
-
|
53
|
-
if app_hash.include? "cookbook"
|
54
|
-
app.cookbook app_hash["cookbook"]
|
55
|
-
end
|
56
|
-
|
57
|
-
app
|
58
|
-
end
|
59
|
-
|
60
|
-
def initialize
|
61
|
-
@group = nil
|
62
|
-
@name = nil
|
63
|
-
@used_apps = Array.new
|
64
|
-
@dependencies = Hash.new
|
65
|
-
@pre_run_list = Array.new
|
66
|
-
@post_run_list = Array.new
|
67
|
-
@environment = nil
|
68
|
-
@node = Chef::Node::Attribute.new({}, {}, {}, {}).default
|
69
|
-
@run_list = nil
|
70
|
-
@type = nil
|
71
|
-
@recipe = nil
|
72
|
-
@cookbook = nil
|
73
|
-
end
|
74
|
-
|
75
|
-
def group group=nil
|
76
|
-
set_or_return :group, group
|
77
|
-
end
|
78
|
-
|
79
|
-
def name name=nil
|
80
|
-
set_or_return :name, name
|
7
|
+
def initialize id, db, config=nil, attributes=nil
|
8
|
+
@id = id
|
9
|
+
@db = db
|
10
|
+
@config = config
|
11
|
+
@attributes = attributes
|
12
|
+
@instances = nil
|
13
|
+
@connected_apps = nil
|
81
14
|
end
|
82
15
|
|
83
16
|
def id
|
84
|
-
|
85
|
-
end
|
86
|
-
|
87
|
-
def uses app=nil
|
88
|
-
@used_apps.push app
|
89
|
-
end
|
90
|
-
|
91
|
-
def cookbook cookbook=nil
|
92
|
-
set_or_return_with_default :cookbook, @name, cookbook
|
93
|
-
end
|
94
|
-
|
95
|
-
def recipe recipe=nil
|
96
|
-
set_or_return_with_default :recipe, DEFAULT_RECIPE, recipe
|
97
|
-
end
|
98
|
-
|
99
|
-
def type type=nil
|
100
|
-
set_or_return_with_default :type, cookbook, type
|
101
|
-
end
|
102
|
-
|
103
|
-
def depends cookbook, version_constraint
|
104
|
-
@dependencies.store cookbook, version_constraint
|
17
|
+
@id
|
105
18
|
end
|
106
19
|
|
107
|
-
def
|
108
|
-
|
109
|
-
@
|
110
|
-
else
|
111
|
-
@pre_run_list
|
20
|
+
def config
|
21
|
+
unless @config
|
22
|
+
@config = @db.app_config @id
|
112
23
|
end
|
24
|
+
|
25
|
+
@config
|
113
26
|
end
|
114
27
|
|
115
|
-
def
|
116
|
-
|
117
|
-
@
|
118
|
-
else
|
119
|
-
@post_run_list
|
120
|
-
end
|
121
|
-
end
|
122
|
-
|
123
|
-
def node node=nil
|
124
|
-
set_or_return :node, node
|
125
|
-
end
|
126
|
-
|
127
|
-
def run_list run_list=nil
|
128
|
-
set_or_return :run_list, run_list
|
129
|
-
end
|
130
|
-
|
131
|
-
def environment environment=nil
|
132
|
-
set_or_return :environment, environment
|
133
|
-
end
|
134
|
-
|
135
|
-
def to_hash
|
136
|
-
hash = Hash.new
|
137
|
-
|
138
|
-
hash.store "group", group
|
139
|
-
hash.store "name", name
|
140
|
-
hash.store "used_apps", used_apps
|
141
|
-
|
142
|
-
hash.store "pre_run_list", pre_run_list
|
143
|
-
hash.store "post_run_list", post_run_list
|
144
|
-
|
145
|
-
hash.store "dependencies", dependencies
|
146
|
-
|
147
|
-
hash.store "node", node.to_hash
|
148
|
-
hash.store "environment", environment
|
149
|
-
|
150
|
-
if @type
|
151
|
-
hash.store "type", type
|
28
|
+
def instances
|
29
|
+
unless @instances
|
30
|
+
@instances = @db.app_instances @id
|
152
31
|
end
|
153
32
|
|
154
|
-
|
155
|
-
hash.store "recipe", recipe
|
156
|
-
end
|
157
|
-
|
158
|
-
if @cookbook
|
159
|
-
hash.store "cookbook", cookbook
|
160
|
-
end
|
161
|
-
|
162
|
-
hash
|
33
|
+
@instances
|
163
34
|
end
|
164
35
|
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
iv_symbol = "@#{symbol.to_s}".to_sym
|
169
|
-
if arg == nil
|
170
|
-
self.instance_variable_get(iv_symbol)
|
171
|
-
else
|
172
|
-
self.instance_variable_set(iv_symbol, arg)
|
36
|
+
def attributes
|
37
|
+
unless @attributes
|
38
|
+
@attributes = @db.app_attributes @id
|
173
39
|
end
|
40
|
+
|
41
|
+
@attributes
|
174
42
|
end
|
175
43
|
|
176
|
-
def
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
else
|
183
|
-
default_val
|
44
|
+
def connected_apps
|
45
|
+
unless @connected_apps
|
46
|
+
@connected_apps = Array.new
|
47
|
+
|
48
|
+
@db.connected_app_ids(@id).each do |app_id|
|
49
|
+
@connected_apps << App.new(app_id, @db)
|
184
50
|
end
|
185
|
-
else
|
186
|
-
self.instance_variable_set(iv_symbol, arg)
|
187
51
|
end
|
52
|
+
|
53
|
+
@connected_apps
|
188
54
|
end
|
189
55
|
|
190
56
|
end
|
@@ -0,0 +1,206 @@
|
|
1
|
+
require 'chapp'
|
2
|
+
require 'chef/node/attribute'
|
3
|
+
|
4
|
+
module Chapp
|
5
|
+
class AppConfig
|
6
|
+
|
7
|
+
# TODO: Define allowed characters (.)
|
8
|
+
|
9
|
+
DEFAULT_RECIPE = "default"
|
10
|
+
|
11
|
+
attr_reader :used_apps
|
12
|
+
attr_reader :dependencies
|
13
|
+
|
14
|
+
def self.from_file app_file
|
15
|
+
appString = IO.read app_file
|
16
|
+
|
17
|
+
app = AppConfig.new
|
18
|
+
app.instance_eval appString
|
19
|
+
|
20
|
+
app
|
21
|
+
end
|
22
|
+
|
23
|
+
def self.from_hash app_hash
|
24
|
+
app = AppConfig.new
|
25
|
+
|
26
|
+
app.group app_hash["group"]
|
27
|
+
app.name app_hash["name"]
|
28
|
+
|
29
|
+
app.pre_run_list app_hash["pre_run_list"]
|
30
|
+
app.post_run_list app_hash["post_run_list"]
|
31
|
+
|
32
|
+
app.run_list app_hash["run_list"]
|
33
|
+
|
34
|
+
app_hash["dependencies"].each do |cookbook, version_constraint|
|
35
|
+
app.depends cookbook, version_constraint
|
36
|
+
end
|
37
|
+
|
38
|
+
app_hash["used_apps"].each do |type, app_ids|
|
39
|
+
app_ids.each do |app_id|
|
40
|
+
app.uses type, app_id
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
app.node Chef::Node::Attribute.new({}, app_hash["node"], {}, {}).default
|
45
|
+
app.environment app_hash["environment"]
|
46
|
+
|
47
|
+
if app_hash.include? "type"
|
48
|
+
app.type app_hash["type"]
|
49
|
+
end
|
50
|
+
|
51
|
+
if app_hash.include? "recipe"
|
52
|
+
app.recipe app_hash["recipe"]
|
53
|
+
end
|
54
|
+
|
55
|
+
if app_hash.include? "cookbook"
|
56
|
+
app.cookbook app_hash["cookbook"]
|
57
|
+
end
|
58
|
+
|
59
|
+
app
|
60
|
+
end
|
61
|
+
|
62
|
+
def initialize
|
63
|
+
@group = nil
|
64
|
+
@name = nil
|
65
|
+
@used_apps = Hash.new
|
66
|
+
@dependencies = Hash.new
|
67
|
+
@pre_run_list = Array.new
|
68
|
+
@post_run_list = Array.new
|
69
|
+
@environment = nil
|
70
|
+
@node = Chef::Node::Attribute.new({}, {}, {}, {}).default
|
71
|
+
@run_list = nil
|
72
|
+
@type = nil
|
73
|
+
@recipe = nil
|
74
|
+
@cookbook = nil
|
75
|
+
end
|
76
|
+
|
77
|
+
def group group=nil
|
78
|
+
set_or_return :group, group
|
79
|
+
end
|
80
|
+
|
81
|
+
def name name=nil
|
82
|
+
set_or_return :name, name
|
83
|
+
end
|
84
|
+
|
85
|
+
def id
|
86
|
+
"#{group}_#{name}"
|
87
|
+
end
|
88
|
+
|
89
|
+
def role_name
|
90
|
+
"chapp_#{id}"
|
91
|
+
end
|
92
|
+
|
93
|
+
def environment_name
|
94
|
+
"chapp_#{id}"
|
95
|
+
end
|
96
|
+
|
97
|
+
def uses type, app
|
98
|
+
|
99
|
+
unless @used_apps.has_key? type
|
100
|
+
@used_apps[type] = Array.new
|
101
|
+
end
|
102
|
+
|
103
|
+
@used_apps[type].push app
|
104
|
+
end
|
105
|
+
|
106
|
+
def cookbook cookbook=nil
|
107
|
+
set_or_return_with_default :cookbook, @name, cookbook
|
108
|
+
end
|
109
|
+
|
110
|
+
def recipe recipe=nil
|
111
|
+
set_or_return_with_default :recipe, DEFAULT_RECIPE, recipe
|
112
|
+
end
|
113
|
+
|
114
|
+
def type type=nil
|
115
|
+
set_or_return_with_default :type, cookbook, type
|
116
|
+
end
|
117
|
+
|
118
|
+
def depends cookbook, version_constraint
|
119
|
+
@dependencies.store cookbook, version_constraint
|
120
|
+
end
|
121
|
+
|
122
|
+
def pre_run_list *recipes
|
123
|
+
if recipes.length > 0
|
124
|
+
@pre_run_list = recipes
|
125
|
+
else
|
126
|
+
@pre_run_list
|
127
|
+
end
|
128
|
+
end
|
129
|
+
|
130
|
+
def post_run_list *recipes
|
131
|
+
if recipes.length > 0
|
132
|
+
@post_run_list = recipes
|
133
|
+
else
|
134
|
+
@post_run_list
|
135
|
+
end
|
136
|
+
end
|
137
|
+
|
138
|
+
def node node=nil
|
139
|
+
set_or_return :node, node
|
140
|
+
end
|
141
|
+
|
142
|
+
def run_list run_list=nil
|
143
|
+
set_or_return :run_list, run_list
|
144
|
+
end
|
145
|
+
|
146
|
+
def environment environment=nil
|
147
|
+
set_or_return :environment, environment
|
148
|
+
end
|
149
|
+
|
150
|
+
def to_hash
|
151
|
+
hash = Hash.new
|
152
|
+
|
153
|
+
hash.store "group", group
|
154
|
+
hash.store "name", name
|
155
|
+
hash.store "used_apps", used_apps
|
156
|
+
|
157
|
+
hash.store "pre_run_list", pre_run_list
|
158
|
+
hash.store "post_run_list", post_run_list
|
159
|
+
|
160
|
+
hash.store "dependencies", dependencies
|
161
|
+
|
162
|
+
hash.store "node", node.to_hash
|
163
|
+
hash.store "environment", environment
|
164
|
+
|
165
|
+
if @type
|
166
|
+
hash.store "type", type
|
167
|
+
end
|
168
|
+
|
169
|
+
if @recipe
|
170
|
+
hash.store "recipe", recipe
|
171
|
+
end
|
172
|
+
|
173
|
+
if @cookbook
|
174
|
+
hash.store "cookbook", cookbook
|
175
|
+
end
|
176
|
+
|
177
|
+
hash
|
178
|
+
end
|
179
|
+
|
180
|
+
private
|
181
|
+
|
182
|
+
def set_or_return(symbol, arg)
|
183
|
+
iv_symbol = "@#{symbol.to_s}".to_sym
|
184
|
+
if arg.nil?
|
185
|
+
self.instance_variable_get(iv_symbol)
|
186
|
+
else
|
187
|
+
self.instance_variable_set(iv_symbol, arg)
|
188
|
+
end
|
189
|
+
end
|
190
|
+
|
191
|
+
def set_or_return_with_default(symbol, default_val, arg)
|
192
|
+
iv_symbol = "@#{symbol.to_s}".to_sym
|
193
|
+
if arg.nil?
|
194
|
+
val = self.instance_variable_get(iv_symbol)
|
195
|
+
if val
|
196
|
+
val
|
197
|
+
else
|
198
|
+
default_val
|
199
|
+
end
|
200
|
+
else
|
201
|
+
self.instance_variable_set(iv_symbol, arg)
|
202
|
+
end
|
203
|
+
end
|
204
|
+
|
205
|
+
end
|
206
|
+
end
|
data/lib/chapp/database.rb
CHANGED
@@ -8,87 +8,85 @@ require 'chef/search/query'
|
|
8
8
|
module Chapp
|
9
9
|
class Database
|
10
10
|
|
11
|
-
|
11
|
+
APPS_CONFIG_DATA_BAG_NAME = "chapp_apps_config"
|
12
12
|
APP_ATTRIBUTES_DATA_BAG_NAME = "chapp_app_attributes"
|
13
13
|
|
14
|
-
PREFIX = "chapp"
|
15
|
-
|
16
14
|
def app_ids
|
17
|
-
|
15
|
+
apps_config_databag.keys
|
18
16
|
end
|
19
17
|
|
20
|
-
def
|
18
|
+
def app_config app_id
|
21
19
|
|
22
20
|
unless app_exists? app_id
|
23
|
-
raise
|
21
|
+
raise AppNotExistsException.new, "App [#{app_id}] does not exist"
|
24
22
|
end
|
25
23
|
|
26
|
-
|
24
|
+
AppConfig.from_hash apps_config_databag_item(app_id).raw_data["app"]
|
27
25
|
end
|
28
26
|
|
29
27
|
def app_exists? app_id
|
30
|
-
|
28
|
+
apps_config_databag.has_key? app_id
|
31
29
|
end
|
32
30
|
|
33
31
|
def connected_app_ids app_id
|
34
32
|
app_ids = Array.new
|
35
33
|
|
36
34
|
query = Chef::Search::Query.new
|
37
|
-
query.search
|
38
|
-
|
39
|
-
app_ids.push
|
35
|
+
query.search APPS_CONFIG_DATA_BAG_NAME, "used_apps:#{app_id}" do |databag_item|
|
36
|
+
app_config = AppConfig.from_hash databag_item.raw_data["app"]
|
37
|
+
app_ids.push app_config.id
|
40
38
|
end
|
41
39
|
|
42
40
|
app_ids
|
43
41
|
end
|
44
42
|
|
45
|
-
def
|
43
|
+
def write_app_config app_config
|
46
44
|
|
47
45
|
# TODO Verify used_apps exist
|
48
46
|
# TODO Verify cookbooks exist
|
49
47
|
|
50
|
-
app_role_name = role_name
|
48
|
+
app_role_name = app_config.role_name
|
51
49
|
|
52
|
-
attributes =
|
53
|
-
attributes["chapp"]["app_id"] =
|
50
|
+
attributes = app_config.node
|
51
|
+
attributes["chapp"]["app_id"] = app_config.id
|
54
52
|
|
55
53
|
# Build/Save role
|
56
54
|
role = Chef::Role.new
|
57
55
|
role.name app_role_name
|
58
|
-
role.description "Used to define the App [#{
|
56
|
+
role.description "Used to define the App [#{app_config.id}]"
|
59
57
|
role.default_attributes attributes.to_hash
|
60
|
-
role.run_list "recipe[chapp]", *
|
58
|
+
role.run_list "recipe[chapp]", *app_config.pre_run_list, "recipe[#{app_config.cookbook}::#{app_config.recipe}]", *app_config.post_run_list, "recipe[chapp::publish_app_attributes]"
|
61
59
|
role.save
|
62
60
|
|
63
61
|
# Set run_list of app to role
|
64
|
-
|
62
|
+
app_config.run_list ["role[#{app_role_name}]"]
|
65
63
|
|
66
|
-
environment_name =
|
64
|
+
environment_name = app_config.environment_name
|
67
65
|
|
68
66
|
# Build/Save environment
|
69
67
|
environment = Chef::Environment.new
|
70
|
-
environment.name
|
71
|
-
environment.description "Used to define the dependencies of App [#{
|
68
|
+
environment.name environment_name
|
69
|
+
environment.description "Used to define the dependencies of App [#{app_config.id}]"
|
72
70
|
|
73
|
-
|
71
|
+
app_config.dependencies.each do |cookbook, version|
|
74
72
|
environment.cookbook cookbook, version
|
75
73
|
end
|
76
74
|
|
77
75
|
environment.save
|
78
76
|
|
79
77
|
# Set environment of app
|
80
|
-
|
78
|
+
app_config.environment environment_name
|
81
79
|
|
82
80
|
# Update app databag item
|
83
|
-
databag_item =
|
84
|
-
databag_item.raw_data["app"] =
|
81
|
+
databag_item = apps_config_databag_item app_config.id
|
82
|
+
databag_item.raw_data["app"] = app_config.to_hash
|
85
83
|
databag_item.save
|
86
84
|
|
87
85
|
end
|
88
86
|
|
89
87
|
def delete_app app_name
|
90
88
|
# TODO (not necessary for now)
|
91
|
-
# Delete role/environment, app databag item, app attribute databag item, app instances
|
89
|
+
# Delete role/environment, app config databag item, app attribute databag item, app instances
|
92
90
|
end
|
93
91
|
|
94
92
|
def app_instances app_id
|
@@ -114,7 +112,7 @@ module Chapp
|
|
114
112
|
databag = app_attributes_databag
|
115
113
|
|
116
114
|
unless databag.has_key? app_id
|
117
|
-
raise
|
115
|
+
raise AppAttributesNotExistsException.new, "Attributes for app [#{app_id}] do not exist"
|
118
116
|
end
|
119
117
|
|
120
118
|
app_attributes_databag_item(app_id).raw_data["app_attributes"]
|
@@ -135,18 +133,17 @@ module Chapp
|
|
135
133
|
|
136
134
|
end
|
137
135
|
|
138
|
-
|
136
|
+
class AppAttributesNotExistsException < StandardError; end
|
137
|
+
class AppNotExistsException < StandardError; end
|
139
138
|
|
140
|
-
|
141
|
-
"#{PREFIX}_role_#{app_id}"
|
142
|
-
end
|
139
|
+
private
|
143
140
|
|
144
|
-
def
|
145
|
-
get_or_create_databag
|
141
|
+
def apps_config_databag
|
142
|
+
get_or_create_databag APPS_CONFIG_DATA_BAG_NAME
|
146
143
|
end
|
147
144
|
|
148
|
-
def
|
149
|
-
load_or_build_databag_item
|
145
|
+
def apps_config_databag_item app_id
|
146
|
+
load_or_build_databag_item apps_config_databag, APPS_CONFIG_DATA_BAG_NAME, app_id
|
150
147
|
end
|
151
148
|
|
152
149
|
def app_attributes_databag
|
@@ -0,0 +1,18 @@
|
|
1
|
+
require 'chapp'
|
2
|
+
|
3
|
+
module Chapp
|
4
|
+
class PropertyProvisioner < Chapp::Provisioner
|
5
|
+
|
6
|
+
HOST_KEY = "host"
|
7
|
+
|
8
|
+
def build_server app_config, properties
|
9
|
+
|
10
|
+
unless properties.has_key? HOST_KEY
|
11
|
+
raise "Unable to find #{HOST_KEY} in provided properties"
|
12
|
+
end
|
13
|
+
|
14
|
+
properties[HOST_KEY]
|
15
|
+
end
|
16
|
+
|
17
|
+
end
|
18
|
+
end
|
data/lib/chapp/wiring.rb
CHANGED
@@ -7,79 +7,47 @@ module Chapp
|
|
7
7
|
attr_reader :announcements
|
8
8
|
attr_reader :node
|
9
9
|
|
10
|
-
def initialize
|
11
|
-
@node = node
|
10
|
+
def initialize app_config, db, node
|
12
11
|
@announcements = Hash.new
|
12
|
+
@used_apps = Hash.new
|
13
13
|
|
14
|
-
@app = app
|
15
14
|
@db = db
|
16
15
|
@node = node
|
16
|
+
@app = App.new app_config.id, db, app_config, @announcements
|
17
17
|
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
used_app = db.app app_id
|
22
|
-
|
23
|
-
unless @used_apps.has_key? used_app.type
|
24
|
-
@used_apps[used_app.type] = Array.new
|
18
|
+
app_config.used_apps.each do |type, app_ids|
|
19
|
+
unless @used_apps.has_key? type
|
20
|
+
@used_apps[type] = Array.new
|
25
21
|
end
|
26
22
|
|
27
|
-
|
23
|
+
app_ids.each do |app_id|
|
24
|
+
@used_apps[type] << App.new(app_id, db)
|
25
|
+
end
|
28
26
|
end
|
29
27
|
end
|
30
28
|
|
31
|
-
def
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
app_attributes = Hash.new
|
46
|
-
|
47
|
-
# TODO: Cache these values?
|
48
|
-
@used_apps[type].each do |app|
|
49
|
-
app_attributes[app.id] = @db.app_attributes app.id
|
29
|
+
def app type=nil
|
30
|
+
if type.nil?
|
31
|
+
@app
|
32
|
+
else
|
33
|
+
unless @used_apps.has_key? type
|
34
|
+
raise "App does not use app of type [#{type}]"
|
35
|
+
end
|
36
|
+
|
37
|
+
if @used_apps[type].size > 1
|
38
|
+
raise "App uses many apps of [#{type}]"
|
39
|
+
end
|
40
|
+
|
41
|
+
@used_apps[type].first
|
50
42
|
end
|
51
|
-
|
52
|
-
app_attributes
|
53
43
|
end
|
54
44
|
|
55
|
-
def
|
56
|
-
|
57
|
-
|
58
|
-
# TODO: Cache these values?
|
59
|
-
@used_apps[type].each do |app|
|
60
|
-
app_instances[app.id] = @db.app_instances app.id
|
45
|
+
def apps type
|
46
|
+
unless @used_apps.has_key? type
|
47
|
+
raise "App does not use app of type [#{type}]"
|
61
48
|
end
|
62
49
|
|
63
|
-
|
64
|
-
end
|
65
|
-
|
66
|
-
def is_app_used? type
|
67
|
-
@used_apps.has_key? type
|
68
|
-
end
|
69
|
-
|
70
|
-
def connected_app_ids
|
71
|
-
# TODO: Cache these values?
|
72
|
-
@db.connected_app_ids @app.id
|
73
|
-
end
|
74
|
-
|
75
|
-
def app_instances app_id
|
76
|
-
# TODO: Cache these values?
|
77
|
-
@db.app_instances app_id
|
78
|
-
end
|
79
|
-
|
80
|
-
def app_attributes app_id
|
81
|
-
# TODO: Cache these values?
|
82
|
-
@db.app_attributes app_id
|
50
|
+
@used_apps[type]
|
83
51
|
end
|
84
52
|
|
85
53
|
end
|
@@ -0,0 +1,92 @@
|
|
1
|
+
require 'chef/knife/bootstrap'
|
2
|
+
require 'chef/node'
|
3
|
+
require 'chef/run_list'
|
4
|
+
require 'chapp'
|
5
|
+
|
6
|
+
class Chef
|
7
|
+
class Knife
|
8
|
+
class AppInstanceCreate < Chef::Knife::Bootstrap
|
9
|
+
|
10
|
+
banner "knife app instance create app_id [properties] (options)"
|
11
|
+
category "app instance"
|
12
|
+
|
13
|
+
def initialize arguments
|
14
|
+
bootstrap = Chef::Knife::Bootstrap.new
|
15
|
+
|
16
|
+
bootstrap.options.each do |name, args|
|
17
|
+
AppInstanceCreate.option name, args
|
18
|
+
end
|
19
|
+
|
20
|
+
Chef::Knife::Bootstrap.load_deps
|
21
|
+
|
22
|
+
super arguments
|
23
|
+
end
|
24
|
+
|
25
|
+
# This method will be executed when you run this knife command.
|
26
|
+
def run
|
27
|
+
|
28
|
+
# Get Arguments
|
29
|
+
if @name_args.size < 1
|
30
|
+
ui.info("Please specify an app_id")
|
31
|
+
show_usage
|
32
|
+
exit 1
|
33
|
+
end
|
34
|
+
|
35
|
+
app_id = @name_args[0]
|
36
|
+
properties = parse_properties @name_args[1, @name_args.size]
|
37
|
+
|
38
|
+
db = Chapp.database
|
39
|
+
provisioner = Chapp.provisioner
|
40
|
+
|
41
|
+
app_config = db.app_config app_id
|
42
|
+
|
43
|
+
# TODO: May need something better than Time
|
44
|
+
node_name = "chapp_#{app_id}_#{Time.now.to_i}"
|
45
|
+
|
46
|
+
# Provision the server and retrieve the host name
|
47
|
+
host = provisioner.build_server app_config, properties
|
48
|
+
|
49
|
+
# Tells bootstrap what environment to use
|
50
|
+
Chef::Config[:environment] = app_config.environment_name
|
51
|
+
|
52
|
+
# Tells bootstrap what run_list to use
|
53
|
+
@config[:run_list] = "role[#{app_config.role_name}]"
|
54
|
+
|
55
|
+
# Tells bootstrap what node name to use
|
56
|
+
@config[:chef_node_name] = node_name
|
57
|
+
|
58
|
+
# Tells bootstrap what ip/fqdn to use
|
59
|
+
@name_args = host
|
60
|
+
|
61
|
+
# Runs bootstrap
|
62
|
+
super
|
63
|
+
|
64
|
+
# We have to save the node here since bootstrap wont actually assign the run_list
|
65
|
+
node = Node.new
|
66
|
+
node.name node_name
|
67
|
+
node.run_list = Chef::RunList.new "role[#{app_config.role_name}]"
|
68
|
+
node.chef_environment = app_config.environment_name
|
69
|
+
node.save
|
70
|
+
end
|
71
|
+
|
72
|
+
private
|
73
|
+
|
74
|
+
def parse_properties properties
|
75
|
+
hash = Hash.new
|
76
|
+
|
77
|
+
properties.each do |property|
|
78
|
+
key_value = property.split "="
|
79
|
+
|
80
|
+
unless key_value.size == 2
|
81
|
+
raise "Property #{property} is missing ="
|
82
|
+
end
|
83
|
+
|
84
|
+
hash[key_value.first] = key_value[1]
|
85
|
+
end
|
86
|
+
|
87
|
+
hash
|
88
|
+
end
|
89
|
+
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
data/lib/chef/knife/app_show.rb
CHANGED
@@ -22,44 +22,51 @@ class Chef
|
|
22
22
|
|
23
23
|
db = Chapp.database
|
24
24
|
|
25
|
-
|
26
|
-
attributes = db.app_attributes app_id
|
25
|
+
app_config = db.app_config app_id
|
27
26
|
|
28
27
|
puts "App :"
|
29
|
-
puts " id : #{
|
30
|
-
puts " group : #{
|
31
|
-
puts " name : #{
|
32
|
-
puts " type : #{
|
33
|
-
puts " cookbook : #{
|
34
|
-
puts " recipe : #{
|
28
|
+
puts " id : #{app_config.id}"
|
29
|
+
puts " group : #{app_config.group}"
|
30
|
+
puts " name : #{app_config.name}"
|
31
|
+
puts " type : #{app_config.type}"
|
32
|
+
puts " cookbook : #{app_config.cookbook}"
|
33
|
+
puts " recipe : #{app_config.recipe}"
|
35
34
|
|
36
35
|
puts " used_apps :"
|
37
|
-
|
38
|
-
puts " #{
|
36
|
+
app_config.used_apps.each do |type, used_app_ids|
|
37
|
+
puts " #{type} :"
|
38
|
+
used_app_ids.each do |used_app_id|
|
39
|
+
puts " #{used_app_id}"
|
40
|
+
end
|
39
41
|
end
|
40
42
|
|
41
43
|
puts " node :"
|
42
|
-
print_hash
|
44
|
+
print_hash app_config.node
|
43
45
|
|
44
46
|
puts " dependencies :"
|
45
|
-
|
47
|
+
app_config.dependencies.each do |cookbook, version_constraint|
|
46
48
|
puts " #{cookbook} #{version_constraint}"
|
47
49
|
end
|
48
50
|
|
49
51
|
puts " pre_run_list :"
|
50
|
-
|
52
|
+
app_config.pre_run_list.each do |run_list_item|
|
51
53
|
puts " #{run_list_item}"
|
52
54
|
end
|
53
55
|
|
54
56
|
puts " post_run_list :"
|
55
|
-
|
57
|
+
app_config.post_run_list.each do |run_list_item|
|
56
58
|
puts " #{run_list_item}"
|
57
59
|
end
|
58
60
|
|
59
61
|
puts ""
|
60
62
|
|
61
63
|
puts "App Attributes :"
|
62
|
-
|
64
|
+
begin
|
65
|
+
attributes = db.app_attributes app_id
|
66
|
+
print_hash attributes, 2
|
67
|
+
rescue Chapp::Database::AppAttributesNotExistsException => e
|
68
|
+
puts " NONE"
|
69
|
+
end
|
63
70
|
|
64
71
|
puts "App Instances :"
|
65
72
|
db.app_instances(app_id).each do |app_instance|
|
@@ -18,15 +18,15 @@ class Chef
|
|
18
18
|
exit 1
|
19
19
|
end
|
20
20
|
|
21
|
-
|
21
|
+
app_config_file = @name_args[0]
|
22
22
|
|
23
|
-
# Build app from file
|
24
|
-
|
23
|
+
# Build app config from file
|
24
|
+
app_config = Chapp::AppConfig.from_file app_config_file
|
25
25
|
|
26
|
-
# Write the app
|
27
|
-
Chapp.database.
|
26
|
+
# Write the app config
|
27
|
+
Chapp.database.write_app_config app_config
|
28
28
|
|
29
|
-
puts "Uploaded app [#{
|
29
|
+
puts "Uploaded app [#{app_config.id}]"
|
30
30
|
end
|
31
31
|
|
32
32
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: chapp
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Bryan Baugher
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-
|
11
|
+
date: 2014-04-24 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: chef
|
@@ -24,34 +24,6 @@ dependencies:
|
|
24
24
|
- - ~>
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '11.0'
|
27
|
-
- !ruby/object:Gem::Dependency
|
28
|
-
name: uuid
|
29
|
-
requirement: !ruby/object:Gem::Requirement
|
30
|
-
requirements:
|
31
|
-
- - ~>
|
32
|
-
- !ruby/object:Gem::Version
|
33
|
-
version: '2.3'
|
34
|
-
type: :runtime
|
35
|
-
prerelease: false
|
36
|
-
version_requirements: !ruby/object:Gem::Requirement
|
37
|
-
requirements:
|
38
|
-
- - ~>
|
39
|
-
- !ruby/object:Gem::Version
|
40
|
-
version: '2.3'
|
41
|
-
- !ruby/object:Gem::Dependency
|
42
|
-
name: yajl-ruby
|
43
|
-
requirement: !ruby/object:Gem::Requirement
|
44
|
-
requirements:
|
45
|
-
- - ~>
|
46
|
-
- !ruby/object:Gem::Version
|
47
|
-
version: '1.1'
|
48
|
-
type: :runtime
|
49
|
-
prerelease: false
|
50
|
-
version_requirements: !ruby/object:Gem::Requirement
|
51
|
-
requirements:
|
52
|
-
- - ~>
|
53
|
-
- !ruby/object:Gem::Version
|
54
|
-
version: '1.1'
|
55
27
|
- !ruby/object:Gem::Dependency
|
56
28
|
name: rake
|
57
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -76,9 +48,13 @@ files:
|
|
76
48
|
- Gemfile
|
77
49
|
- lib/chapp.rb
|
78
50
|
- lib/chapp/app.rb
|
51
|
+
- lib/chapp/app_config.rb
|
79
52
|
- lib/chapp/app_instance.rb
|
80
53
|
- lib/chapp/database.rb
|
54
|
+
- lib/chapp/provisioner.rb
|
55
|
+
- lib/chapp/provisioner/property_provisioner.rb
|
81
56
|
- lib/chapp/wiring.rb
|
57
|
+
- lib/chef/knife/app_instance_create.rb
|
82
58
|
- lib/chef/knife/app_list.rb
|
83
59
|
- lib/chef/knife/app_show.rb
|
84
60
|
- lib/chef/knife/app_upload.rb
|