forj 0.0.40 → 0.0.41
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/README.md +28 -9
- data/bin/forj +263 -59
- data/lib/boot.rb +42 -37
- data/lib/compute.rb +4 -1
- data/lib/connection.rb +1 -1
- data/lib/defaults.yaml +93 -31
- data/lib/down.rb +10 -8
- data/lib/forj-account.rb +84 -20
- data/lib/forj-config.rb +105 -31
- data/lib/network.rb +28 -28
- data/lib/repositories.rb +1 -1
- data/lib/security.rb +8 -8
- data/lib/setup.rb +1 -1
- data/lib/ssh.rb +13 -9
- data/lib/ssh.sh +7 -6
- data/spec/forj-config_spec.rb +43 -29
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 01a8a3f3825a0b5242367c3ff69a83675588800e
|
4
|
+
data.tar.gz: 2f78609c995ebf36be3f4becfc6b7bccbd3d42c4
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f8bcda70764cf154d9762ac21f560965317d526c49e120f0469567ef8bd7238abc88638fd786bd5cb1e2bc539a3b4643f40f186c4e01de2bf1912cafc20f5f1d
|
7
|
+
data.tar.gz: cb6e149758f4111c93012df9f3fa6b4cecd865f408cf23ccca71d516685d630fdee6f57df4cf6a4d0f7169aeb73b6df2c8c4d58f9ce584432c8ec34737a8c435
|
data/README.md
CHANGED
@@ -83,16 +83,35 @@ Commands:
|
|
83
83
|
forj help [action] # Describe available FORJ actions or one specific action
|
84
84
|
forj setup # set the credentials for forj cli
|
85
85
|
forj show defaults # Show list of predefined value you can update in your ~/.forj/config.yaml
|
86
|
-
forj ssh
|
86
|
+
forj ssh
|
87
87
|
|
88
88
|
|
89
|
-
####
|
89
|
+
#### Configuration
|
90
90
|
|
91
|
-
While building your forge, forj needs to load some data by default. Those are listed in
|
91
|
+
While building your forge, forj needs to load some data by default. Those are listed in the application.
|
92
92
|
|
93
|
-
|
93
|
+
You can show them with :
|
94
94
|
|
95
|
-
|
95
|
+
$ forj show defaults
|
96
|
+
|
97
|
+
If you need to change one of them:
|
98
|
+
|
99
|
+
$ forj set "keypair_name=MyKeypairName"
|
100
|
+
|
101
|
+
ex:
|
102
|
+
forj set keypair_name=nova
|
103
|
+
|
104
|
+
You can check what kind of value, forj will use to boot/access your forge:
|
105
|
+
|
106
|
+
$ forj get -a dev
|
107
|
+
|
108
|
+
|
109
|
+
#### Your config.yaml
|
110
|
+
|
111
|
+
The following list gives you some details about keys/values required to boot/access your forge.
|
112
|
+
|
113
|
+
|
114
|
+
~/.forj/config.yaml:
|
96
115
|
|
97
116
|
default:
|
98
117
|
account_name: name # Default forj account used to connect to your cloud. This setting is automatically set to the first account created with forj setup <CloudProvider>
|
@@ -107,8 +126,8 @@ Here are the variables list you can set:
|
|
107
126
|
ports: [Port1,Port2,...] # list of additional ports to add in your cloud security group.
|
108
127
|
# This list is added to the default one in defaults.yaml
|
109
128
|
keypair_path: path # Define the file path to your OpenSSH private key. Useful to access your box with ssh command line.
|
110
|
-
# By default. ~/.forj
|
111
|
-
keypair_name: name # keypair name defined in your cloud to access your server. By default we named it '
|
129
|
+
# By default. ~/.ssh/forj-id_rsa
|
130
|
+
keypair_name: name # keypair name defined in your cloud to access your server. By default we named it 'forj'. If it doesn't exist, it will be created.
|
112
131
|
router: name # Router name used by your forge boxes will use to access internet.
|
113
132
|
security_group: name # Security group name to configure and attach to each forge boxes.
|
114
133
|
network: name # Network name to attach to each forge boxes. By default we use 'private'. If it doesn't exist, it will be created.
|
@@ -143,12 +162,12 @@ Development installation:
|
|
143
162
|
**Fedora/CentOS/Redhat rpm like package system**
|
144
163
|
|
145
164
|
$ sudo yum install git gcc ruby-devel libxml2-devel rubygem-rspec libxslt-devel python-yaml rubygem-nokogiri -y
|
146
|
-
$ gem install rspec-rake rspec-mocks rspec-expectations
|
165
|
+
$ gem install rspec-rake rspec-mocks rspec-expectations
|
147
166
|
|
148
167
|
**Ubuntu/Debian deb like package system (not tested)**
|
149
168
|
|
150
169
|
$ sudo apt-get install git ruby-dev build-essential libopenssl-ruby1.9.1 libssl-dev zlib1g-dev -y
|
151
|
-
$ gem install rspec rspec-rake rspec-mocks rspec-expectations
|
170
|
+
$ gem install rspec rspec-rake rspec-mocks rspec-expectations
|
152
171
|
|
153
172
|
Then execute the following:
|
154
173
|
|
data/bin/forj
CHANGED
@@ -68,7 +68,7 @@ class Forj < Thor
|
|
68
68
|
Quick steps: How to create a forj?
|
69
69
|
----------------------------------
|
70
70
|
|
71
|
-
To test a forj blueprint, you will need an account on a cloud solution.
|
71
|
+
To test a forj blueprint, you will need an account on a cloud solution.
|
72
72
|
Currently forj cli supports only HPHelion (https://horizon.hp.com) but will be expanded to support most of known clouds supported by FOG. (http://fog.io)
|
73
73
|
|
74
74
|
1. Setup your FORJ account.
|
@@ -91,26 +91,34 @@ forj command line details:
|
|
91
91
|
end
|
92
92
|
end
|
93
93
|
|
94
|
+
desc 'version', 'get GEM version of forj.'
|
95
|
+
|
96
|
+
def version()
|
97
|
+
if Gem.loaded_specs['forj']
|
98
|
+
puts Gem.loaded_specs['forj'].version.to_s
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
|
94
103
|
################################# BOOT
|
95
|
-
desc 'boot <
|
104
|
+
desc 'boot <blueprint> <InstanceName> [options]', 'boot a Maestro box and instruct it to provision the blueprint'
|
96
105
|
|
97
106
|
long_desc <<-LONGDESC
|
98
107
|
This task boot a new forge with the following options
|
99
|
-
\x5- blueprint : Is the name of the blueprint
|
108
|
+
\x5- blueprint : Is the name of the blueprint
|
100
109
|
\x5- InstanceName : name of the forge
|
101
110
|
|
102
|
-
Ex: forj boot redstone
|
111
|
+
Ex: forj boot redstone maestro_test -a dev
|
103
112
|
|
104
|
-
`forj boot`
|
105
|
-
The list of predefined values can be retrieved with forj show defaults
|
113
|
+
When `forj boot` starts, some variables are loaded. If you want to check/updated them, use `forj get [-a account]`
|
106
114
|
|
107
115
|
LONGDESC
|
108
116
|
|
109
|
-
method_option :account_name, :aliases => '-a', :desc => "Set the forj account name to use. By default, uses the default account set in your local config file.
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
117
|
+
method_option :account_name, :aliases => '-a', :desc => "Set the forj account name to use. By default, uses the default account set in your local config file.
|
118
|
+
|
119
|
+
Following options superseed your Account, config file or forj defaults."
|
120
|
+
method_option :maestro_repo, :aliases => '-m', :desc => "config: maestro_repo : To use a different Maestro repository already cloned.
|
121
|
+
By default, Maestro is systematically cloned to ~/.forj/maestro from github."
|
114
122
|
method_option :infra, :aliases => '-r', :desc => 'config: infra_repo : Defines your Infra directory to use while booting. You can also set FORJ_INFRA_DIR.'
|
115
123
|
method_option :key_name, :aliases => '-k', :desc => "config: keypair_name : Keypair name to use."
|
116
124
|
method_option :key_path, :aliases => '-p', :desc => "config: keypair_path : Private or Public key file to use."
|
@@ -122,15 +130,15 @@ Following options superseed your config file or forj defaults."
|
|
122
130
|
Build system options:"
|
123
131
|
method_option :boothook, :aliases => '-H', :desc => 'By default, boothook file used is build/bin/build-tools/boothook.sh. Use this option to set another one.'
|
124
132
|
method_option :build, :aliases => '-B', :desc => 'Replace the default build.sh'
|
125
|
-
method_option :branch, :aliases => '-R', :desc => "Branch name to clone for maestro.
|
133
|
+
method_option :branch, :aliases => '-R', :desc => "Branch name to clone for maestro.
|
126
134
|
|
127
135
|
Maestro/infra bootstrap debugging:"
|
128
|
-
method_option :test_box, :aliases => '-T', :desc => "Identify a path to become your test-box repository.
|
129
|
-
Ex: if your maestro is in ~/src/forj-oss, --test_box ~/src/forj-oss/maestro build.sh and
|
136
|
+
method_option :test_box, :aliases => '-T', :desc => "Identify a path to become your test-box repository.
|
137
|
+
Ex: if your maestro is in ~/src/forj-oss, --test_box ~/src/forj-oss/maestro build.sh and
|
130
138
|
test-box will send your local maestro repo to your box, for boot."
|
131
139
|
|
132
140
|
def boot(blueprint, on_or_name, old_accountname = nil, as = nil, old_name = nil)
|
133
|
-
|
141
|
+
|
134
142
|
Logging.set_level(Logger::INFO) if options[:verbose]
|
135
143
|
Logging.set_level(Logger::DEBUG) if options[:debug]
|
136
144
|
|
@@ -142,30 +150,30 @@ Maestro/infra bootstrap debugging:"
|
|
142
150
|
msg = "The syntax `forj boot '%s' on '%s' as '%s'` is depreciated.\nUse `forj boot '%s' '%s'" % [blueprint, old_accountname, old_name, blueprint, old_name]
|
143
151
|
if oConfig.get('account_name') == old_accountname
|
144
152
|
Logging.warning("%s` instead." % msg)
|
145
|
-
else
|
153
|
+
else
|
146
154
|
Logging.warning("%s -a '%s'` instead." % [msg, old_accountname])
|
147
155
|
end
|
148
156
|
name = old_name
|
149
|
-
oConfig.set(
|
157
|
+
oConfig.set(:account_name, old_accountname)
|
150
158
|
else
|
151
159
|
name = on_or_name
|
152
160
|
end
|
153
161
|
|
154
|
-
Logging.fatal(1, "instance name '%s' not supported. Support only lower case, numeric and dash caracters." % [name]) if not /^[\d[[:lower:]]-]+$/ =~ name
|
162
|
+
Logging.fatal( 1, "instance name '%s' not supported. Support only lower case, numeric and dash caracters." % [name]) if not (/^[\d[[:lower:]]-]+$/ =~ name)
|
155
163
|
|
156
164
|
# Options are added if they are set. Otherwise, get will retrieve the default value.
|
157
|
-
oConfig.set(
|
158
|
-
oConfig.set(
|
159
|
-
oConfig.set(
|
160
|
-
oConfig.set(
|
161
|
-
oConfig.set(
|
162
|
-
oConfig.set(
|
163
|
-
oConfig.set(
|
164
|
-
oConfig.set(
|
165
|
-
oConfig.set(:maestro_repo ,
|
165
|
+
oConfig.set(:account_name, options[:account_name]) if options[:account_name]
|
166
|
+
oConfig.set(:infra_repo, options[:infra])
|
167
|
+
oConfig.set(:keypair_name, options[:key_name])
|
168
|
+
oConfig.set(:keypair_path, options[:key_path])
|
169
|
+
oConfig.set(:security_group, options[:security_group])
|
170
|
+
oConfig.set(:image, options[:image])
|
171
|
+
oConfig.set(:flavor, options[:maestro_flavor])
|
172
|
+
oConfig.set(:bp_flavor, options[:bp_flavor])
|
173
|
+
oConfig.set(:maestro_repo , options[:maestro_repo])
|
166
174
|
oConfig.set(:test_box, File.expand_path(options[:test_box])) if options[:test_box] and File.directory?(File.expand_path(options[:test_box]))
|
167
|
-
|
168
|
-
|
175
|
+
|
176
|
+
|
169
177
|
if options[:key_path]
|
170
178
|
mFound = options[:key_path].match(/^(.*)(\.pub)?$/)
|
171
179
|
if mFound
|
@@ -173,75 +181,271 @@ Maestro/infra bootstrap debugging:"
|
|
173
181
|
if mFound[2] and not File.exists?(File.expand_path(mFound[1]+mFound[2]))
|
174
182
|
Logging.fatal(1, "'%s' is not a valid keypair files. At least the public key (.pub) is have to exist.")
|
175
183
|
end
|
176
|
-
oConfig.set(
|
184
|
+
oConfig.set(:keypair_path, key_path)
|
177
185
|
else
|
178
186
|
Logging.fatal(1, "'%s' is not a valid keypair files. At least the public key (.pub) is have to exist.")
|
179
187
|
end
|
180
188
|
end
|
181
189
|
|
182
|
-
Boot.boot(blueprint, name, options[:build],
|
183
|
-
options[:build_config], options[:branch],
|
190
|
+
Boot.boot(blueprint, name, options[:build],options[:branch],
|
184
191
|
options[:boothook], options[:box_name], oConfig)
|
185
192
|
end
|
186
193
|
|
187
194
|
################################# Show defaults
|
188
|
-
desc 'show
|
189
|
-
|
195
|
+
desc 'show <Object> [name]', 'Show Object (default valuesr, account data, etc...) values.'
|
196
|
+
long_desc <<-LONGDESC
|
197
|
+
This command helps to show values used by 'forj' to boot a blueprint (account data, default values, etc...)
|
190
198
|
|
191
|
-
|
192
|
-
|
199
|
+
queriable Objects:
|
200
|
+
|
201
|
+
- defaults : Provide the list of predefined values, configured by forj, or by you in your ~/.forj/config.yaml (or another config file with -c)
|
202
|
+
- account [name] : without name, forj will give you the list of account saved. Otherwise print 'name' account data.
|
203
|
+
LONGDESC
|
204
|
+
|
205
|
+
def show(object, name = nil)
|
206
|
+
case object
|
193
207
|
when 'defaults'
|
194
208
|
oConfig=ForjConfig.new()
|
195
|
-
oConfig.set('account_name', options[:account_name])
|
196
|
-
oForjAccount = ForjAccount.new(oConfig)
|
197
|
-
oForjAccount.ac_load()
|
198
209
|
|
199
210
|
puts 'List of default values: (local refer to your config file. hash refer to your FORJ account data)'
|
200
|
-
puts
|
201
|
-
puts
|
202
|
-
puts '-----------------------'
|
211
|
+
puts oConfig.default_dump().to_yaml
|
212
|
+
puts '---'
|
203
213
|
puts "To change default values, update your ~/.forj/config.yaml and add the key/value entry under 'default' section."
|
214
|
+
when 'account'
|
215
|
+
oConfig=ForjConfig.new()
|
216
|
+
if not name
|
217
|
+
puts "List of FORJ accounts: Use 'forj account YourAccount' to see one account details."
|
218
|
+
oAccounts = ForjAccounts.new()
|
219
|
+
puts oAccounts.dump().to_yaml
|
220
|
+
else
|
221
|
+
oConfig.set(:account_name, name)
|
222
|
+
oAccount = ForjAccount.new(oConfig)
|
223
|
+
oAccount.ac_load()
|
224
|
+
|
225
|
+
puts "Account value for '%s':" % name
|
226
|
+
puts oAccount.dump().to_yaml
|
227
|
+
puts '---'
|
228
|
+
puts "To change those values, execute 'forj setup -a %s'." % options[:account_name]
|
229
|
+
end
|
230
|
+
|
204
231
|
else
|
205
232
|
Logging.error("object '%s' unknown." % name)
|
206
233
|
end
|
207
234
|
end
|
208
235
|
|
209
236
|
################################# DOWN
|
210
|
-
|
237
|
+
desc 'down <InstanceName>', 'delete the Maestro box and all systems installed by the blueprint'
|
238
|
+
long_desc <<-LONGDESC
|
239
|
+
This action all servers that has been created under the instance name.
|
240
|
+
|
241
|
+
Warning! This action don't removed any network/security groups cloud object.
|
242
|
+
LONGDESC
|
243
|
+
|
244
|
+
def down(name)
|
245
|
+
Logging.set_level(Logger::INFO) if options[:verbose]
|
246
|
+
Logging.set_level(Logger::DEBUG) if options[:debug]
|
247
|
+
oConfig = ForjConfig.new(options[:config])
|
248
|
+
oConfig.set(:account_name, options[:account_name]) if options[:account_name]
|
249
|
+
|
250
|
+
Down.down(oConfig, name)
|
251
|
+
end
|
252
|
+
|
253
|
+
################################# SET
|
254
|
+
desc 'set [key=value] [options]', 'Set some variables in defaults or account.'
|
211
255
|
long_desc <<-LONGDESC
|
212
|
-
|
256
|
+
You can set some variables to change 'forj' defaults or specifically for a FORJ account.
|
257
|
+
|
258
|
+
Ex: By default, forj use ~/.ssh/forj-id_rsa as keypair for all forge instance. During setup, if this keypair doesn't exist, it proposes to create it for you, with ssh-keygen.
|
259
|
+
If you want to use a keypair that already exists, you can set it as your default, with:
|
260
|
+
|
261
|
+
`forj set keypair_name=~/.ssh/id_rsa`
|
262
|
+
|
263
|
+
If you want to set this key only for your account 'dev':
|
264
|
+
|
265
|
+
`forj set keypair_name=~/.ssh/id_rsa -a dev`
|
266
|
+
|
267
|
+
If you want to get the list of possible key to set:
|
268
|
+
|
269
|
+
`forj set`
|
270
|
+
|
271
|
+
If you want to remove the key from dev, and ask for to re-use defaults (from your config or application default)
|
272
|
+
|
273
|
+
`forj set keypair_name= -a dev`
|
274
|
+
|
275
|
+
If you want to remove the key from your default, and re-use application default
|
276
|
+
|
277
|
+
`forj set keypair_name=`
|
278
|
+
|
213
279
|
LONGDESC
|
214
280
|
|
215
|
-
|
281
|
+
method_option :account_name, :aliases => '-a', :desc => "Set the forj account name to use. By default, uses the default account set in your local config file."
|
282
|
+
|
283
|
+
def set(key_val = nil)
|
216
284
|
Logging.set_level(Logger::INFO) if options[:verbose]
|
217
285
|
Logging.set_level(Logger::DEBUG) if options[:debug]
|
218
|
-
|
219
|
-
|
286
|
+
|
287
|
+
oConfig=ForjConfig.new()
|
288
|
+
if not key_val
|
289
|
+
puts "List of FORJ settings: Use 'forj set KeyName=Value [-a YourAccount]' to set one. Use `forj show defaults` / `account` to check values."
|
290
|
+
hMaps = oConfig.getAppDefault(:account_section_mapping)
|
291
|
+
hMaps.each_key { | key |
|
292
|
+
sDesc = rhGet(hMaps, key, :desc)
|
293
|
+
puts "%-15s : %s" % [key, sDesc]
|
294
|
+
}
|
295
|
+
else
|
296
|
+
mkey_val = key_val.match(/^(.*) *= *(.*)$/)
|
297
|
+
if mkey_val
|
298
|
+
if not options[:account_name]
|
299
|
+
if oConfig.exist?(mkey_val[1])
|
300
|
+
sBef = "%s: '%s'" % [oConfig.exist?(mkey_val[1]), oConfig.get(mkey_val[1])]
|
301
|
+
else
|
302
|
+
sBef = "unset"
|
303
|
+
end
|
304
|
+
if mkey_val[2] != ""
|
305
|
+
oConfig.LocalSet(mkey_val[1], mkey_val[2])
|
306
|
+
else
|
307
|
+
oConfig.LocalDel(mkey_val[1])
|
308
|
+
end
|
309
|
+
oConfig.SaveConfig()
|
310
|
+
if oConfig.exist?(mkey_val[1])
|
311
|
+
sAft = "%s: '%s'" % [oConfig.exist?(mkey_val[1]), oConfig.get(mkey_val[1])]
|
312
|
+
else
|
313
|
+
sAft = "unset"
|
314
|
+
end
|
315
|
+
puts "Updated:\n%s: %s => %s" % [mkey_val[1], sBef, sAft]
|
316
|
+
else
|
317
|
+
account_name = options[:account_name]
|
318
|
+
oConfig.set(:account_name, account_name)
|
319
|
+
oForjAccount = ForjAccount.new(oConfig)
|
320
|
+
oForjAccount.ac_load()
|
321
|
+
if oForjAccount.exist?(mkey_val[1])
|
322
|
+
sBef = "%s: '%s'" % [oForjAccount.exist?(mkey_val[1]).sub("hash", account_name), oForjAccount.get(mkey_val[1])]
|
323
|
+
else
|
324
|
+
sBef = "unset"
|
325
|
+
end
|
326
|
+
if mkey_val[2] == ""
|
327
|
+
oForjAccount.del(mkey_val[1])
|
328
|
+
else
|
329
|
+
oForjAccount.set(mkey_val[1], mkey_val[2])
|
330
|
+
end
|
331
|
+
oForjAccount.ac_save()
|
332
|
+
if oForjAccount.exist?(mkey_val[1])
|
333
|
+
sAft = "%s: '%s'" % [oForjAccount.exist?(mkey_val[1]).sub("hash", account_name), oForjAccount.get(mkey_val[1])]
|
334
|
+
else
|
335
|
+
sAft = "unset"
|
336
|
+
end
|
337
|
+
puts "Updated:\n%s: %s => %s" % [mkey_val[1], sBef, sAft]
|
338
|
+
end
|
339
|
+
else
|
340
|
+
Logging.fatal(1 ,"Syntax error. Please set your value like: 'key=value' and retry.")
|
341
|
+
end
|
342
|
+
end
|
343
|
+
end
|
344
|
+
|
345
|
+
################################# GET
|
346
|
+
desc 'get', 'Get data from defaults or account values.'
|
347
|
+
long_desc <<-LONGDESC
|
348
|
+
forj cli maintain a list of key/value at 3 Levels:
|
349
|
+
\x5- Application defaults
|
350
|
+
\x5- Local config defaults
|
351
|
+
\x5- Account data
|
352
|
+
|
353
|
+
This function will help you identify which value has been retrieved from which level.
|
354
|
+
|
355
|
+
Ex: To get the default keypair_name, from your ~/.forj/config.yaml, or if not found, from application defaults.
|
356
|
+
|
357
|
+
`forj get keypair_name`
|
358
|
+
|
359
|
+
Ex: To get the keypair_name defined from the account, or from your ~/.forj/config.yaml, or if not found, from application defaults.
|
360
|
+
|
361
|
+
`forj get keypair_name -a dev`
|
362
|
+
|
363
|
+
|
364
|
+
LONGDESC
|
365
|
+
|
366
|
+
method_option :account_name, :aliases => '-a', :desc => "Set the forj account name to use. By default, uses the default account set in your local config file."
|
367
|
+
|
368
|
+
def get(key = nil)
|
369
|
+
Logging.set_level(Logger::INFO) if options[:verbose]
|
370
|
+
Logging.set_level(Logger::DEBUG) if options[:debug]
|
371
|
+
|
372
|
+
oConfig=ForjConfig.new()
|
373
|
+
if not options[:account_name]
|
374
|
+
if key
|
375
|
+
if oConfig.exist?(key)
|
376
|
+
puts "%s:'%s'" % [oConfig.exist?(key), oConfig.get(key)]
|
377
|
+
else
|
378
|
+
Logging.message("key '%s' not found" % [key])
|
379
|
+
end
|
380
|
+
else
|
381
|
+
puts "legend: default = Application defaults, local = Local default config\n\n" % [options[:account_name], options[:account_name]]
|
382
|
+
puts "%-15s(%-7s) %-12s:\n--------------------------------------" % ['key', 'origin', 'section name']
|
383
|
+
hMaps = oConfig.getAppDefault(:account_section_mapping)
|
384
|
+
hMaps.each { |map_key, value|
|
385
|
+
if oConfig.exist?(map_key)
|
386
|
+
puts "%-15s(%-7s) %-12s: '%s'" % [map_key, oConfig.exist?(map_key), value[:section], oConfig.get(map_key)]
|
387
|
+
else
|
388
|
+
puts "%-15s( ) %-12s: unset" % [map_key, value[:section]]
|
389
|
+
end
|
390
|
+
|
391
|
+
}
|
392
|
+
end
|
393
|
+
puts "\nUse 'forj set <key>=<value>' to update defaults"
|
394
|
+
else
|
395
|
+
oConfig.set(:account_name, options[:account_name])
|
396
|
+
oForjAccount = ForjAccount.new(oConfig)
|
397
|
+
Logging.fatal(1, "Unable to load account '%s'. Not found." % options[:account_name]) if not oForjAccount.ac_load
|
398
|
+
if key
|
399
|
+
if oForjAccount.exist?(key)
|
400
|
+
puts "%s: '%s'" % [oForjAccount.exist?(key).sub("hash", options[:account_name]), oForjAccount.get(key)]
|
401
|
+
elsif oForjAccount.exist?(key.parameterize.underscore.to_sym)
|
402
|
+
key_symb = key.parameterize.underscore.to_sym
|
403
|
+
puts "%s: '%s'" % [oForjAccount.exist?(key_symb).sub("hash", options[:account_name]), oForjAccount.get(key_symb)]
|
404
|
+
else
|
405
|
+
Logging.message("key '%s' not found"% [key])
|
406
|
+
end
|
407
|
+
else
|
408
|
+
puts "legend: default = Application defaults, local = Local default config, %s = '%s' account config\n\n" % [options[:account_name], options[:account_name]]
|
409
|
+
puts "%-15s(%-7s) %-12s:\n--------------------------------------" % ['key', 'origin', 'section name']
|
410
|
+
hMaps = oConfig.getAppDefault(:account_section_mapping)
|
411
|
+
hMaps.each { |map_key, value|
|
412
|
+
if oForjAccount.exist?(map_key)
|
413
|
+
puts "%-15s(%-7s) %-12s: '%s'" % [map_key, oForjAccount.exist?(map_key).sub("hash", options[:account_name]), value[:section], oForjAccount.get(map_key)]
|
414
|
+
else
|
415
|
+
puts "%-15s( ) %12s: unset" % [map_key, value[:section]]
|
416
|
+
end
|
417
|
+
}
|
418
|
+
end
|
419
|
+
puts "\nUse 'forj set <key>=<value> -a %s' to update account data.\nOr 'forj set <key>= -a %s' to restore key default value." % [options[:account_name], options[:account_name]]
|
420
|
+
end
|
421
|
+
end
|
220
422
|
|
221
423
|
################################# SSH
|
222
|
-
desc 'ssh', 'connect to your forge thru ssh'
|
424
|
+
desc 'ssh <Instance> <Server> [options]', 'connect to your forge thru ssh'
|
223
425
|
long_desc <<-LONGDESC
|
224
|
-
Connect through ssh to an
|
426
|
+
Connect through ssh to a node attached to an instance
|
225
427
|
|
226
|
-
|
428
|
+
ex: forj ssh myforge review
|
227
429
|
LONGDESC
|
228
430
|
|
229
431
|
def ssh(name, server)
|
230
432
|
Logging.set_level(Logger::INFO) if options[:verbose]
|
231
433
|
Logging.set_level(Logger::DEBUG) if options[:debug]
|
232
|
-
|
434
|
+
oConfig = ForjConfig.new(options[:config])
|
435
|
+
oConfig.set(:account_name, options[:account_name]) if options[:account_name]
|
436
|
+
Ssh.connect(name, server, oConfig)
|
233
437
|
end
|
234
438
|
|
235
439
|
################################# SETUP
|
236
440
|
method_option :keypair_name, :aliases => '-k', :desc => "config keypair_name : Keypair name attached as default to your FORJ account."
|
237
|
-
method_option :keypair_path, :aliases => '-p', :desc => "config keypair_path : SSH key file (private or public) to attach as default to your FORJ account.
|
238
|
-
It will attach any detected private/public key thanks to the file name
|
441
|
+
method_option :keypair_path, :aliases => '-p', :desc => "config keypair_path : SSH key file (private or public) to attach as default to your FORJ account.
|
442
|
+
It will attach any detected private/public key thanks to the file name
|
239
443
|
(without extension/.pem = private, .pub = public)"
|
240
444
|
|
241
445
|
desc 'setup [AccountName [Provider]] [options]', "Setup FORJ cloud account credentials and information."
|
242
446
|
long_desc <<-LONGDESC
|
243
447
|
This setup will configure a FORJ account used to connect to your cloud system.
|
244
|
-
\x5It will ask for your cloud provider credentials and services.
|
448
|
+
\x5It will ask for your cloud provider credentials and services.
|
245
449
|
|
246
450
|
If AccountName is not set, 'hpcloud' will be used for AccountName and provider name, by default.
|
247
451
|
\x5If AccountName is not set without provider, 'hpcloud' provider will be used, by default.
|
@@ -252,16 +456,16 @@ Several data will be requested like:
|
|
252
456
|
\x5- Cloud provider credentials and services.
|
253
457
|
\x5- user/password (password is encrypted)
|
254
458
|
\x5- DNS settings if you want Maestro to manage it.
|
255
|
-
\x5- domain name to add to each boxes hostname
|
459
|
+
\x5- domain name to add to each boxes hostname
|
256
460
|
LONGDESC
|
257
461
|
def setup(sAccountName = 'hpcloud', sProvider = "hpcloud")
|
258
462
|
Logging.set_level(Logger::INFO) if options[:verbose]
|
259
463
|
Logging.set_level(Logger::DEBUG) if options[:debug]
|
260
464
|
oConfig=ForjConfig.new(options[:config])
|
261
|
-
oConfig.set(
|
262
|
-
oConfig.set(
|
263
|
-
oConfig.set(
|
264
|
-
oConfig.set(
|
465
|
+
oConfig.set(:provider, sProvider)
|
466
|
+
oConfig.set(:account_name, sAccountName)
|
467
|
+
oConfig.set(:keypair_path, options[:keypair_path]) if options[:keypair_path]
|
468
|
+
oConfig.set(:keypair_name, options[:keypair_name]) if options[:keypair_name]
|
265
469
|
Setup.setup(oConfig)
|
266
470
|
end
|
267
471
|
|