forj 1.0.9 → 1.0.10
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +17 -0
- data/bin/forj +63 -23
- data/forj/defaults.yaml +2 -1
- data/forj.gemspec +4 -5
- data/lib/appinit.rb +5 -1
- data/lib/boot.rb +19 -7
- data/lib/cloud_connection.rb +13 -7
- data/lib/cloud_test.rb +5 -7
- data/lib/destroy.rb +7 -2
- data/lib/forj/ForjCli.rb +1 -1
- data/lib/forj/process/ForjProcess.rb +87 -28
- data/lib/forj-settings.rb +28 -15
- data/lib/ssh.rb +1 -1
- data/vagrant/README.md +40 -0
- data/vagrant/fedora/Vagrantfile +17 -1
- data/vagrant/ubuntu/Vagrantfile +22 -1
- metadata +7 -21
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 104016c81c311f9a0f4454a0f50aadeb9e2810a2
|
4
|
+
data.tar.gz: 07452ff472445eed9d882d1d8e153c75b7b27182
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: dc95fd28f3de676003c62a1804725ca4225199391c78096a200a048c92d02207324d19ffd6a127b9a446baafe6b16a28ca3a49c90d676e2a6db33fbf35dd75a0
|
7
|
+
data.tar.gz: f1f431e9d6ebb546d1f524b921db1098ce537ec5a263ea310a87f2b6ff36fc35261d37552f8b4e0fe8568d551ee5beb9daf115b8042f689a4ca26ea0c508688f
|
data/README.md
CHANGED
@@ -176,6 +176,23 @@ To ssh into a server
|
|
176
176
|
forj ssh <name> <node>
|
177
177
|
e.g. forj ssh maestro_01 [maestro, ci, util, review] # the nodes from your blueprint
|
178
178
|
|
179
|
+
Excon and SSL Issue
|
180
|
+
===================
|
181
|
+
|
182
|
+
If you are connecting to a private cloud, you may need to provide some additional certificate data:
|
183
|
+
|
184
|
+
Excon env variables:
|
185
|
+
* SSL_CERT_DIR : path_to_certs
|
186
|
+
* SSL_CERT_FILE: path_to_file
|
187
|
+
|
188
|
+
Ex:
|
189
|
+
|
190
|
+
export SSL_CERT_FILE=~/ca.crt
|
191
|
+
forj setup myAccount openstack
|
192
|
+
|
193
|
+
or
|
194
|
+
|
195
|
+
SSL_CERT_FILE=~/ca.crt forj setup myAccount openstack
|
179
196
|
|
180
197
|
Contributing to Forj
|
181
198
|
=====================
|
data/bin/forj
CHANGED
@@ -34,6 +34,7 @@ PrcLib.pdata_path = File.expand_path(File.join('~', '.cache', PrcLib.app_name))
|
|
34
34
|
require 'appinit.rb' # Load Application settings features
|
35
35
|
Forj.keypairs_path = File.join(PrcLib.data_path, 'keypairs')
|
36
36
|
Forj.build_path = File.join(PrcLib.data_path, '.build')
|
37
|
+
Forj.file_version = '1.0.0'
|
37
38
|
|
38
39
|
require 'forj-settings.rb' # Settings features
|
39
40
|
|
@@ -57,27 +58,43 @@ Quick steps: How to create a forj?
|
|
57
58
|
----------------------------------
|
58
59
|
|
59
60
|
To test a forj blueprint, you will need an account on a cloud solution.
|
60
|
-
Currently forj cli supports
|
61
|
-
|
61
|
+
Currently forj cli supports folowing providers:
|
62
|
+
|
63
|
+
- openstack: openstack cloud and hp helion cloud (Fog)
|
64
|
+
- hpcloud : HP Public cloud (Fog)
|
65
|
+
|
66
|
+
This list can be expanded to more clouds.
|
67
|
+
|
68
|
+
If you want to contribute to support your cloud, check out:
|
69
|
+
http://github.com/forj-oss/lorj_cloud
|
62
70
|
|
63
71
|
1. Setup your FORJ account.
|
64
|
-
`$ forj setup [AccountName] [--provider Provider]`
|
65
72
|
|
66
|
-
|
67
|
-
|
68
|
-
|
73
|
+
`$ forj setup`
|
74
|
+
|
75
|
+
This will create an account 'hpcloud' configured with 'hpcloud' provider
|
76
|
+
|
77
|
+
If you want another provider:
|
78
|
+
|
79
|
+
`$ forj setup MyAccountName openstack`
|
69
80
|
|
70
|
-
|
71
|
-
on HPHelion (provider 'hpcloud').
|
72
|
-
If AccountName is not set, the account name will be proposed to be name
|
73
|
-
'hpcloud' as well!
|
81
|
+
The first time you setup an account, it will become the default one.
|
74
82
|
|
75
83
|
2. Create your forge on your default account
|
76
84
|
`$ forj boot <blueprint> <InstanceName>`
|
77
85
|
|
78
86
|
Ex: `forj boot redstone MyForge`. In this example:
|
79
87
|
Forj will create a `redstone` blueprint forge named `MyForge`,
|
80
|
-
using the default
|
88
|
+
using the default account.
|
89
|
+
|
90
|
+
If you want to create your forge on another cloud account, do the following:
|
91
|
+
|
92
|
+
`$ forj boot <blueprint> <InstanceName> [-a account]`
|
93
|
+
|
94
|
+
Ex: `forj boot redstone MyForge -a MyAccountName`. In this example:
|
95
|
+
Forj will create a `redstone` blueprint forge named `MyForge`,
|
96
|
+
using the 'MyAccountName' account.
|
97
|
+
|
81
98
|
|
82
99
|
forj command line details:
|
83
100
|
--------------------------
|
@@ -130,16 +147,15 @@ If you want to check/updated them, use `forj get [-a account]`
|
|
130
147
|
method_option :maestro_flavor, :aliases => '-f', :desc => 'config:' \
|
131
148
|
' flavor : Maestro flavor to use.'
|
132
149
|
method_option :bp_flavor, :aliases => '-b', :desc => 'config:' \
|
133
|
-
' bp_flavor : Blueprint nodes default flavor to use.'
|
134
|
-
|
150
|
+
' bp_flavor : Blueprint nodes default flavor to use.'\
|
151
|
+
"\n\n Build system options:"
|
135
152
|
method_option :boothook, :aliases => '-H', :desc => 'By default, ' \
|
136
153
|
' boothook file used is build/bin/build-tools/boothook.sh. ' \
|
137
154
|
' Use this option to set another one.'
|
138
155
|
method_option :build, :aliases => '-B', :desc => 'Replace' \
|
139
156
|
' the default build.sh'
|
140
157
|
method_option :branch, :aliases => '-R', :desc => 'Branch' \
|
141
|
-
|
142
|
-
+ "\n\n" + 'Maestro/infra bootstrap debugging:'
|
158
|
+
"name to clone for maestro.\n\nMaestro/infra bootstrap debugging:"
|
143
159
|
method_option :test_box, :aliases => '-T', :desc => 'Identify a' \
|
144
160
|
' path to become your test-box repository.' \
|
145
161
|
"\n " \
|
@@ -192,10 +208,16 @@ queriable Objects:
|
|
192
208
|
" and update with 'forj set'"
|
193
209
|
when 'account'
|
194
210
|
unless name
|
195
|
-
puts "List of FORJ accounts: Use 'forj account YourAccount' " \
|
196
|
-
' to see one account details.'
|
197
211
|
o_accounts = Lorj::Accounts.new
|
198
|
-
|
212
|
+
accounts = o_accounts.dump
|
213
|
+
if accounts.length == 0
|
214
|
+
PrcLib.message 'No accounts found. Use forj setup [Account '\
|
215
|
+
'[provider]] to create your first account.'
|
216
|
+
return
|
217
|
+
end
|
218
|
+
PrcLib.message "List of FORJ accounts: Use 'forj account YourAccount'" \
|
219
|
+
' to see one account details.'
|
220
|
+
puts accounts.to_yaml
|
199
221
|
return
|
200
222
|
end
|
201
223
|
o_config = Lorj::Account.new
|
@@ -336,6 +358,9 @@ ex: forj ssh myforge -n review
|
|
336
358
|
' create ssh connection'
|
337
359
|
method_option :identity, :aliases => '-i', :desc => 'Private key' \
|
338
360
|
' file name.'
|
361
|
+
method_option :account_name, :aliases => '-a', :desc => 'Set the forj' \
|
362
|
+
' account name to use. By default, uses the default account set in your' \
|
363
|
+
' local config file.'
|
339
364
|
|
340
365
|
def ssh(oInstanceName)
|
341
366
|
Forj::Settings.common_options(options)
|
@@ -345,8 +370,13 @@ ex: forj ssh myforge -n review
|
|
345
370
|
|
346
371
|
# Setting account at runtime layer
|
347
372
|
account[:account_name] = options[:account_name] if options[:account_name]
|
373
|
+
|
348
374
|
# Setting account at account layer
|
349
|
-
account.ac_load account[:account_name]
|
375
|
+
unless account.ac_load account[:account_name]
|
376
|
+
PrcLib.fatal(1, "Invalid account '%s'. Use `forj show account` "\
|
377
|
+
'to get the list of valid accounts.',
|
378
|
+
account[:account_name])
|
379
|
+
end
|
350
380
|
|
351
381
|
account.set(:box_ssh, options[:box_name]) if options[:box_name]
|
352
382
|
account.set(:identity, options[:identity]) if options[:identity]
|
@@ -380,13 +410,23 @@ Several data will be requested like:
|
|
380
410
|
Forj::Settings.common_options(options)
|
381
411
|
require 'cloud_connection.rb'
|
382
412
|
|
383
|
-
account = Lorj::Account.new(options[:config])
|
384
|
-
account.
|
385
|
-
account.set(:account_name, sAccountName)
|
413
|
+
account = Lorj::Account.new(options[:config], Forj.file_version)
|
414
|
+
account.ac_new(sAccountName, sProvider) unless account.ac_load(sAccountName)
|
386
415
|
|
387
416
|
o_cloud = Forj::CloudConnection.connect(account)
|
388
|
-
|
417
|
+
|
418
|
+
PrcLib.high_level_msg("Setting up '%s' with provider '%s'\n",
|
419
|
+
sAccountName, account[:provider])
|
420
|
+
|
421
|
+
o_cloud.setup(:forge)
|
422
|
+
|
389
423
|
o_cloud.config.ac_save
|
424
|
+
unless o_cloud.config.local_exist?(:account_name)
|
425
|
+
PrcLib.info("Setting account '%s' as default. You can change it with "\
|
426
|
+
'`forj set account_name=<new account>`', sAccountName)
|
427
|
+
o_cloud.config.local_set(:account_name, sAccountName)
|
428
|
+
end
|
429
|
+
o_cloud.config.save_local_config
|
390
430
|
PrcLib.high_level_msg("\nAccount %s '%s' saved.\n", sProvider, sAccountName)
|
391
431
|
end
|
392
432
|
end
|
data/forj/defaults.yaml
CHANGED
@@ -135,6 +135,7 @@
|
|
135
135
|
:default_value: "<%= Forj.keypairs_path %>"
|
136
136
|
:keypair_base:
|
137
137
|
:desc: "Contains the key file base name without .pem/.pub."
|
138
|
+
:default_value: "<%= config[:keypair_name] %>"
|
138
139
|
:keypair_name:
|
139
140
|
:desc: "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."
|
140
141
|
:required: true
|
@@ -208,7 +209,7 @@
|
|
208
209
|
:tenant_name:
|
209
210
|
:desc: "Tenant name required by fog/openstack on gardener"
|
210
211
|
:account: true
|
211
|
-
:validate: !ruby/regexp /^\w?[\w_
|
212
|
+
:validate: !ruby/regexp /^\w?[\w_:-]*$/
|
212
213
|
:ask_step: 1
|
213
214
|
:ask_sort: 0
|
214
215
|
:default_value: "<%= (config[:provider_name] == 'openstack')?config[:tenant]:nil %>"
|
data/forj.gemspec
CHANGED
@@ -19,8 +19,8 @@ Gem::Specification.new do |s|
|
|
19
19
|
s.name = 'forj'
|
20
20
|
s.homepage = 'https://www.forj.io'
|
21
21
|
|
22
|
-
s.version = '1.0.
|
23
|
-
s.date = '2015-
|
22
|
+
s.version = '1.0.10'
|
23
|
+
s.date = '2015-04-17'
|
24
24
|
s.summary = 'forj command line'
|
25
25
|
s.description = 'forj cli - See https://www.forj.io for documentation/information'
|
26
26
|
|
@@ -44,7 +44,6 @@ Gem::Specification.new do |s|
|
|
44
44
|
s.require_paths = %w[lib]
|
45
45
|
|
46
46
|
s.add_runtime_dependency 'thor', '>=0.16.0'
|
47
|
-
s.add_runtime_dependency 'fog', '~>1.26.0'
|
48
47
|
s.add_runtime_dependency 'git', '>=1.2.7'
|
49
48
|
s.add_runtime_dependency 'highline', '>= 1.6.21'
|
50
49
|
s.add_runtime_dependency 'ansi', '>= 1.4.3'
|
@@ -52,11 +51,11 @@ Gem::Specification.new do |s|
|
|
52
51
|
s.add_runtime_dependency 'json', '1.7.5'
|
53
52
|
s.add_runtime_dependency 'bundler'
|
54
53
|
s.add_runtime_dependency 'nokogiri','1.5.11'
|
55
|
-
s.add_runtime_dependency '
|
54
|
+
s.add_runtime_dependency 'lorj_cloud', '~> 0.1.0'
|
56
55
|
|
57
56
|
s.add_development_dependency "rake", "~> 10.0"
|
58
57
|
s.add_development_dependency "rspec", "~> 3.1.0"
|
59
|
-
s.add_development_dependency "rubocop", ">=0.
|
58
|
+
s.add_development_dependency "rubocop", ">=0.30.0"
|
60
59
|
s.rdoc_options << '--title' << 'Lorj - The Process Controllers framework system' <<
|
61
60
|
'--main' << 'README.md'
|
62
61
|
end
|
data/lib/appinit.rb
CHANGED
@@ -19,7 +19,7 @@
|
|
19
19
|
# or other kind of setting.
|
20
20
|
module Forj
|
21
21
|
class << self
|
22
|
-
attr_accessor :build_path, :keypairs_path
|
22
|
+
attr_accessor :build_path, :keypairs_path, :file_version
|
23
23
|
end
|
24
24
|
|
25
25
|
module_function
|
@@ -38,4 +38,8 @@ module Forj
|
|
38
38
|
@build_path = File.expand_path(v) unless @build_path
|
39
39
|
PrcLib.ensure_dir_exists(@build_path)
|
40
40
|
end
|
41
|
+
|
42
|
+
def file_version=(v)
|
43
|
+
@file_version = v unless @file_version
|
44
|
+
end
|
41
45
|
end
|
data/lib/boot.rb
CHANGED
@@ -29,7 +29,7 @@ module Forj
|
|
29
29
|
def self.deprecated_name?(blueprint, on_or_name,
|
30
30
|
old_accountname, as,
|
31
31
|
old_name
|
32
|
-
|
32
|
+
)
|
33
33
|
# depreciated: <BluePrint> on <AccountName> as <InstanceName>
|
34
34
|
if old_accountname && as && old_name
|
35
35
|
msg = format(
|
@@ -100,6 +100,10 @@ module Forj
|
|
100
100
|
end
|
101
101
|
end
|
102
102
|
|
103
|
+
# rubocop: disable Metrics/CyclomaticComplexity
|
104
|
+
# rubocop: disable Metrics/MethodLength
|
105
|
+
|
106
|
+
# Boot process
|
103
107
|
def self.boot(blueprint, on_or_name, deprecated_name, options)
|
104
108
|
@account = Lorj::Account.new(options[:config])
|
105
109
|
|
@@ -115,14 +119,22 @@ module Forj
|
|
115
119
|
|
116
120
|
@account[:account_name] = options[:account_name] if options[:account_name]
|
117
121
|
|
118
|
-
@account.ac_load @account[:account_name]
|
122
|
+
unless @account.ac_load @account[:account_name]
|
123
|
+
PrcLib.fatal(1, "Account '%s' not loaded. You need to call "\
|
124
|
+
'`forj setup %s [provider]` to use this account.',
|
125
|
+
@account[:account_name], @account[:account_name])
|
126
|
+
end
|
119
127
|
|
120
|
-
options_map = { :infra
|
121
|
-
:
|
128
|
+
options_map = { :infra => :infra_repo,
|
129
|
+
:key_name => :keypair_name,
|
130
|
+
:key_path => :keypair_path,
|
122
131
|
:security_group => :security_group,
|
123
|
-
:image_name
|
124
|
-
:
|
125
|
-
:
|
132
|
+
:image_name => :image_name,
|
133
|
+
:maestro_flavor => :flavor,
|
134
|
+
:bp_flavor => :bp_flavor,
|
135
|
+
:maestro_repo => :maestro_repo,
|
136
|
+
:branch => :branch,
|
137
|
+
:test_box => :test_box,
|
126
138
|
:extra_metadata => :extra_metadata }
|
127
139
|
|
128
140
|
load_options(options, options_map) do |key, value|
|
data/lib/cloud_connection.rb
CHANGED
@@ -15,26 +15,32 @@
|
|
15
15
|
# See the License for the specific language governing permissions and
|
16
16
|
# limitations under the License.
|
17
17
|
|
18
|
+
require 'lorj_cloud'
|
19
|
+
|
18
20
|
module Forj
|
19
21
|
# Provide cloud object
|
20
22
|
module CloudConnection
|
21
23
|
def self.connect(account)
|
22
24
|
a_processes = []
|
23
25
|
|
26
|
+
provider = account[:provider]
|
27
|
+
|
24
28
|
# Defines how to manage Maestro and forges
|
29
|
+
# Uses 'cloud' module process provided by 'lorj_cloud'
|
30
|
+
a_processes << { :process_module => :cloud,
|
31
|
+
:controller_name => provider }
|
32
|
+
|
25
33
|
# create a maestro box. Identify a forge instance, delete it,...
|
26
|
-
a_processes << File.join(LIB_PATH, 'forj',
|
34
|
+
a_processes << { :process_path => File.join(LIB_PATH, 'forj',
|
35
|
+
'ForjCore.rb') }
|
27
36
|
|
28
37
|
# Defines how cli will control FORJ features
|
29
38
|
# boot/down/ssh/...
|
30
|
-
a_processes << File.join(LIB_PATH, 'forj',
|
39
|
+
a_processes << { :process_path => File.join(LIB_PATH, 'forj',
|
40
|
+
'ForjCli.rb') }
|
31
41
|
|
32
42
|
# Loading CloudCore embedding provider controller + its process.
|
33
|
-
o_cloud = Lorj::
|
34
|
-
account,
|
35
|
-
account[:account_name],
|
36
|
-
a_processes
|
37
|
-
)
|
43
|
+
o_cloud = Lorj::Core.new(account, a_processes)
|
38
44
|
|
39
45
|
o_cloud
|
40
46
|
end
|
data/lib/cloud_test.rb
CHANGED
@@ -56,7 +56,7 @@ If you already have an existing infra workspace,
|
|
56
56
|
Otherwise, we will build a new one with some predefined data,
|
57
57
|
you can review and update later.
|
58
58
|
END
|
59
|
-
|
59
|
+
)
|
60
60
|
s_ask = format(
|
61
61
|
'Do you want to create a new one from Maestro (yes/no)?',
|
62
62
|
infra_dir
|
@@ -90,11 +90,9 @@ server_id_length = 0
|
|
90
90
|
server_name_length = 0
|
91
91
|
|
92
92
|
o_forge[:server].each do |server|
|
93
|
-
if server[:id].length >
|
94
|
-
server_id_length = server[:id].length
|
95
|
-
end
|
93
|
+
server_id_length = server[:id].length if server[:id].length > server_id_length
|
96
94
|
|
97
|
-
if server[:name].length >
|
95
|
+
if server[:name].length > server_name_length
|
98
96
|
server_name_length = server[:name].length
|
99
97
|
end
|
100
98
|
end
|
@@ -106,7 +104,7 @@ puts format(
|
|
106
104
|
'Index '.ljust(6),
|
107
105
|
'Name'.ljust(server_name_length),
|
108
106
|
'ID'.ljust(server_id_length)
|
109
|
-
|
107
|
+
)
|
110
108
|
# Display Forge servers detail
|
111
109
|
o_forge[:server].each do |server|
|
112
110
|
puts format(
|
@@ -114,7 +112,7 @@ o_forge[:server].each do |server|
|
|
114
112
|
server_index.to_s.ljust(6),
|
115
113
|
server[:name].to_s.ljust(server_name_length),
|
116
114
|
server[:id].to_s.ljust(server_id_length)
|
117
|
-
|
115
|
+
)
|
118
116
|
server_index += 1
|
119
117
|
end
|
120
118
|
|
data/lib/destroy.rb
CHANGED
@@ -28,8 +28,13 @@ module Forj
|
|
28
28
|
|
29
29
|
# Setting account at runtime layer
|
30
30
|
account[:account_name] = options[:account_name] if options[:account_name]
|
31
|
-
|
32
|
-
account
|
31
|
+
|
32
|
+
# Loading account at account layer
|
33
|
+
unless account.ac_load account[:account_name]
|
34
|
+
PrcLib.fatal(1, "Invalid account '%s'. Use `forj show account` "\
|
35
|
+
'to get the list of valid accounts.',
|
36
|
+
account[:account_name])
|
37
|
+
end
|
33
38
|
|
34
39
|
o_cloud = Forj::CloudConnection.connect(account)
|
35
40
|
|
data/lib/forj/ForjCli.rb
CHANGED
@@ -57,7 +57,7 @@ class ForjCoreProcess
|
|
57
57
|
s_status = active_server?(server, o_address, boot_options[:keys],
|
58
58
|
boot_options[:coherent], s_status)
|
59
59
|
|
60
|
-
till_server_active(s_status,
|
60
|
+
till_server_active(s_status, hParams, o_address, boot_options)
|
61
61
|
|
62
62
|
o_forge = get_forge(sObjectType, config[:instance_name], hParams)
|
63
63
|
|
@@ -154,7 +154,7 @@ class ForjCoreProcess
|
|
154
154
|
|
155
155
|
def active_server?(o_server, o_address, private_key_file,
|
156
156
|
keypair_coherent, s_status
|
157
|
-
|
157
|
+
)
|
158
158
|
if o_server[:attrs][:status] == :active
|
159
159
|
image = server_get_image o_server
|
160
160
|
|
@@ -191,10 +191,14 @@ class ForjCoreProcess
|
|
191
191
|
end
|
192
192
|
end
|
193
193
|
|
194
|
+
# rubocop:disable Metrics/ClassLength
|
195
|
+
|
194
196
|
# Functions for boot - build_forge
|
195
197
|
class ForjCoreProcess
|
198
|
+
# TODO: Rewrite this function to break it for rubocop.
|
196
199
|
# rubocop:disable CyclomaticComplexity
|
197
200
|
|
201
|
+
# Function displaying the server status
|
198
202
|
def maestro_create_status(sStatus, iCurAct = 4, pending_count = 0)
|
199
203
|
s_activity = '/-\\|?'
|
200
204
|
if iCurAct < 4
|
@@ -228,12 +232,16 @@ class ForjCoreProcess
|
|
228
232
|
# TODO: Rewrite this function to break it for rubocop.
|
229
233
|
# rubocop: disable PerceivedComplexity
|
230
234
|
# rubocop: disable Metrics/MethodLength
|
235
|
+
# rubocop: disable Metrics/AbcSize
|
231
236
|
|
232
|
-
|
237
|
+
# Loop until server is active
|
238
|
+
def till_server_active(s_status, hParams, o_address, boot_options)
|
233
239
|
m_cloud_init_error = []
|
234
240
|
i_cur_act = 0
|
235
241
|
o_old_log = ''
|
236
242
|
pending_count = 0
|
243
|
+
server_error = 0
|
244
|
+
o_server = hParams.refresh[:server, :ObjectData]
|
237
245
|
|
238
246
|
while s_status != :active
|
239
247
|
if i_cur_act == 4
|
@@ -244,10 +252,34 @@ class ForjCoreProcess
|
|
244
252
|
maestro_create_status(s_status, i_cur_act, pending_count)
|
245
253
|
i_cur_act += 1
|
246
254
|
i_cur_act = i_cur_act % 4
|
255
|
+
|
256
|
+
if s_status == :restart
|
257
|
+
process_delete(:server)
|
258
|
+
PrcLib.message("Bad server '%s' removed. Creating a new one...",
|
259
|
+
o_server[:name])
|
260
|
+
sleep(5)
|
261
|
+
process_create(:internet_server)
|
262
|
+
s_status = :starting
|
263
|
+
o_server = hParams.refresh[:server, :ObjectData]
|
264
|
+
next
|
265
|
+
end
|
266
|
+
|
247
267
|
o_server = load_server(o_server)
|
248
|
-
|
268
|
+
|
269
|
+
if o_server[:status] == :error
|
270
|
+
if server_error == 1
|
271
|
+
PrcLib.fatal(1, 'Server tried to be rebuilt but failed again.')
|
272
|
+
end
|
273
|
+
server_error = 1
|
274
|
+
PrcLib.warning("The creation of server '%s' has currently failed. "\
|
275
|
+
'Trying to rebuild it, once before give up.',
|
276
|
+
o_server[:name])
|
277
|
+
s_status = :restart
|
278
|
+
next
|
279
|
+
end
|
280
|
+
|
249
281
|
if s_status == :starting
|
250
|
-
s_status = :assign_ip if o_server[:
|
282
|
+
s_status = :assign_ip if o_server[:status] == :active
|
251
283
|
elsif s_status == :assign_ip
|
252
284
|
s_status = assign_ip_boot(o_address, boot_options, s_status, o_server)
|
253
285
|
else # analyze the log output
|
@@ -342,7 +374,7 @@ done
|
|
342
374
|
END
|
343
375
|
s_msg = format(s_msg, o_server[:name], image[:ssh_user],
|
344
376
|
o_address[:public_ip], boot_options[:keys]
|
345
|
-
|
377
|
+
)
|
346
378
|
unless boot_options[:coherent]
|
347
379
|
s_msg += ANSI.bold("\nUnfortunatelly") + " your current keypair' \
|
348
380
|
' is not usable to connect to your server.\nYou need to fix' \
|
@@ -496,7 +528,7 @@ class ForjCoreProcess
|
|
496
528
|
:salt => Time.now.to_i.to_s,
|
497
529
|
:iv => Base64.strict_encode64(
|
498
530
|
OpenSSL::Cipher::Cipher.new('aes-256-cbc').random_iv
|
499
|
-
|
531
|
+
)
|
500
532
|
}
|
501
533
|
|
502
534
|
PrcLib.debug("Writing '%s' key file", key_file)
|
@@ -644,14 +676,15 @@ class ForjCoreProcess
|
|
644
676
|
clone_maestro_repo(maestro_url, path_maestro, config)
|
645
677
|
end
|
646
678
|
rescue => e
|
647
|
-
PrcLib.error(
|
648
|
-
|
649
|
-
|
650
|
-
|
651
|
-
|
679
|
+
PrcLib.error("Error while cloning the repo from %s\n%s\n%s"\
|
680
|
+
"\nIf this error persist you could clone the repo manually"\
|
681
|
+
" in '%s'",
|
682
|
+
maestro_url, e.message, e.backtrace.join("\n"),
|
683
|
+
h_result[:maestro_repo])
|
652
684
|
end
|
653
685
|
o_maestro = register(h_result, sObjectType)
|
654
686
|
o_maestro[:maestro_repo] = h_result[:maestro_repo]
|
687
|
+
o_maestro[:maestro_repo_exist?] = File.directory?(h_result[:maestro_repo])
|
655
688
|
o_maestro
|
656
689
|
end
|
657
690
|
end
|
@@ -896,7 +929,7 @@ class ForjCoreProcess
|
|
896
929
|
) unless File.exist?(mime)
|
897
930
|
end
|
898
931
|
|
899
|
-
def build_userdata(sObjectType, hParams)
|
932
|
+
def build_userdata(sObjectType, hParams) # rubocop: disable Metrics/AbcSize
|
900
933
|
# get the paths for maestro and infra repositories
|
901
934
|
# maestro_path = hParams[:maestro_repository].values
|
902
935
|
# infra_path = hParams[:infra_repository].values
|
@@ -911,6 +944,13 @@ class ForjCoreProcess
|
|
911
944
|
format('userdata.mime.%s', rand(36**5).to_s(36))
|
912
945
|
)
|
913
946
|
|
947
|
+
unless hParams[:maestro_repository, :maestro_repo_exist?]
|
948
|
+
PrcLib.fatal(1, "Maestro repository doesn't exist. This is required for "\
|
949
|
+
"cloud_init user_data build. Check why '%s' "\
|
950
|
+
"doesn't exist.",
|
951
|
+
hParams[:maestro_repository, :maestro_repo])
|
952
|
+
end
|
953
|
+
|
914
954
|
meta_data = JSON.generate(hParams[:metadata, :meta_data])
|
915
955
|
|
916
956
|
build_tmpl_dir = File.expand_path(File.join(LIB_PATH, 'build_tmpl'))
|
@@ -1091,7 +1131,7 @@ class ForjCoreProcess
|
|
1091
1131
|
# forj keypair storage. Otherwise this update is ignored.
|
1092
1132
|
def save_sequences(private_key_file, forj_private_key_file,
|
1093
1133
|
public_key_file, forj_public_key_file, key_name
|
1094
|
-
|
1134
|
+
)
|
1095
1135
|
PrcLib.info('Importing key pair to FORJ keypairs list.')
|
1096
1136
|
|
1097
1137
|
FileUtils.copy(private_key_file, forj_private_key_file)
|
@@ -1107,7 +1147,7 @@ class ForjCoreProcess
|
|
1107
1147
|
# forj keypair storage. Otherwise this update is ignored.
|
1108
1148
|
def save_md5(private_key_file, forj_private_key_file,
|
1109
1149
|
public_key_file, forj_public_key_file
|
1110
|
-
|
1150
|
+
)
|
1111
1151
|
# Checking source/dest files content
|
1112
1152
|
if Digest::MD5.file(private_key_file).hexdigest !=
|
1113
1153
|
Digest::MD5.file(forj_private_key_file).hexdigest
|
@@ -1138,7 +1178,7 @@ class ForjCoreProcess
|
|
1138
1178
|
PrcLib.info("Configured forj keypair '%s' with '%s'",
|
1139
1179
|
keys[:keypair_name],
|
1140
1180
|
File.join(keys[:keypair_path], keys[:key_basename])
|
1141
|
-
|
1181
|
+
)
|
1142
1182
|
end
|
1143
1183
|
|
1144
1184
|
# keypair_files post setup
|
@@ -1214,16 +1254,16 @@ class ForjCoreProcess
|
|
1214
1254
|
#
|
1215
1255
|
def update_keypair_config(_ = nil)
|
1216
1256
|
%w(local account).each do |config_name|
|
1217
|
-
next if config.
|
1218
|
-
|
1257
|
+
next if config.latest_version?(config_name)
|
1219
1258
|
keypair_path = config.get(:keypair_path, nil, :name => config_name)
|
1220
1259
|
|
1221
|
-
|
1222
|
-
|
1223
|
-
|
1224
|
-
|
1225
|
-
|
1226
|
-
|
1260
|
+
unless keypair_path.nil?
|
1261
|
+
options = { :name => config_name }
|
1262
|
+
options.merge!(:section => :default) if config_name == 'local'
|
1263
|
+
config.set(:keypair_base, File.basename(keypair_path), options)
|
1264
|
+
config.set(:keypair_path, File.dirname(keypair_path), options)
|
1265
|
+
end
|
1266
|
+
config.version_set(config_name, Forj.file_version)
|
1227
1267
|
end
|
1228
1268
|
true
|
1229
1269
|
end
|
@@ -1296,6 +1336,7 @@ class ForjCoreProcess
|
|
1296
1336
|
return true if key_name.nil?
|
1297
1337
|
config[:key_cloud_coherence] = false
|
1298
1338
|
cloud_key = process_get(:keypairs, key_name)
|
1339
|
+
register(cloud_key)
|
1299
1340
|
if !cloud_key.empty?
|
1300
1341
|
if cloud_key[:coherent]
|
1301
1342
|
config[:key_cloud_coherence] = true
|
@@ -1305,10 +1346,15 @@ class ForjCoreProcess
|
|
1305
1346
|
return true
|
1306
1347
|
end
|
1307
1348
|
keypair_display(cloud_key)
|
1308
|
-
|
1309
|
-
|
1310
|
-
|
1311
|
-
|
1349
|
+
|
1350
|
+
return true unless cloud_key[:public_key_exist?]
|
1351
|
+
|
1352
|
+
PrcLib.message("You need to create a new keypair instead of '%s'"\
|
1353
|
+
'or quit the setup to get the original key and retry.',
|
1354
|
+
key_name)
|
1355
|
+
s_ask = 'Do you want to create new keypair?'
|
1356
|
+
|
1357
|
+
PrcLib.fatal(1, 'Quitting setup per your request.') unless agree(s_ask)
|
1312
1358
|
false
|
1313
1359
|
end
|
1314
1360
|
|
@@ -1316,11 +1362,24 @@ class ForjCoreProcess
|
|
1316
1362
|
# return true continue to ask keypair files
|
1317
1363
|
# return false skip asking keypair files
|
1318
1364
|
def forj_cloud_keypair_coherent?(_keypair_files)
|
1365
|
+
return true unless config.exist?(:key_cloud_coherence)
|
1366
|
+
|
1367
|
+
keypair = data_objects(:keypairs)
|
1368
|
+
|
1369
|
+
return true unless keypair.nil? || keypair[:private_key_exist?]
|
1370
|
+
|
1319
1371
|
if config[:key_cloud_coherence]
|
1320
1372
|
PrcLib.message('Your local ssh keypair is detected ' \
|
1321
1373
|
'and valid to access the box.')
|
1322
1374
|
return false
|
1323
1375
|
end
|
1376
|
+
match = ANSI.bold(format('matching %s keypair name previously set',
|
1377
|
+
ANSI.red(config[:keypair_name])))
|
1378
|
+
desc = 'the base keypair file name (with absolute path) ' + match
|
1379
|
+
|
1380
|
+
Lorj.data.set(:sections, :credentials, :keypair_files,
|
1381
|
+
{ :desc => desc }, 'setup')
|
1382
|
+
|
1324
1383
|
true
|
1325
1384
|
end
|
1326
1385
|
end
|
data/lib/forj-settings.rb
CHANGED
@@ -24,6 +24,19 @@ module Forj
|
|
24
24
|
PrcLib.core_level = options[:lorj_debug].to_i
|
25
25
|
PrcLib.level = Logger::DEBUG
|
26
26
|
end
|
27
|
+
latest_version?(options[:account_name]) if options[:account_name]
|
28
|
+
end
|
29
|
+
|
30
|
+
def self.latest_version?(account_name)
|
31
|
+
config = Lorj::Account.new(nil, Forj.file_version)
|
32
|
+
|
33
|
+
config.ac_load account_name
|
34
|
+
|
35
|
+
PrcLib.fatal(1,
|
36
|
+
"Your account '%s' is obsolete, use `forj setup`," \
|
37
|
+
' to update it.',
|
38
|
+
account_name) \
|
39
|
+
unless config.latest_version?('account')
|
27
40
|
end
|
28
41
|
|
29
42
|
def self.account_show_all(account_name)
|
@@ -35,12 +48,12 @@ module Forj
|
|
35
48
|
puts format(
|
36
49
|
"List of account settings for provider '%s': ",
|
37
50
|
config.get(:provider)
|
38
|
-
|
51
|
+
)
|
39
52
|
puts format(
|
40
53
|
"%-15s %-12s :\n------------------------------",
|
41
54
|
'key',
|
42
55
|
'section name'
|
43
|
-
|
56
|
+
)
|
44
57
|
|
45
58
|
config.meta_each do |section, found_key, hValue|
|
46
59
|
next if hValue.rh_get(:readonly)
|
@@ -50,11 +63,11 @@ module Forj
|
|
50
63
|
puts format(
|
51
64
|
"\nUse `forj set KeyName=Value -a %s` to set one.",
|
52
65
|
[account_name]
|
53
|
-
|
66
|
+
)
|
54
67
|
puts format(
|
55
68
|
'Use `forj get -a %s` to check current values.',
|
56
69
|
account_name
|
57
|
-
|
70
|
+
)
|
58
71
|
end
|
59
72
|
|
60
73
|
def self.config_show_all
|
@@ -64,7 +77,7 @@ module Forj
|
|
64
77
|
"%-15s %-12s :\n------------------------------",
|
65
78
|
'key',
|
66
79
|
'section name'
|
67
|
-
|
80
|
+
)
|
68
81
|
config.meta_each do |section, found_key, hValue|
|
69
82
|
next if hValue.rh_get(:readonly)
|
70
83
|
s_desc = hValue.rh_get(:desc)
|
@@ -157,7 +170,7 @@ module Forj
|
|
157
170
|
full_key,
|
158
171
|
s_bef,
|
159
172
|
ANSI.bold + s_aft + ANSI.clear
|
160
|
-
|
173
|
+
)
|
161
174
|
end
|
162
175
|
config.ac_save if b_dirty
|
163
176
|
end
|
@@ -271,7 +284,7 @@ module Forj
|
|
271
284
|
s_upd_msg,
|
272
285
|
mykey,
|
273
286
|
section
|
274
|
-
|
287
|
+
)
|
275
288
|
end
|
276
289
|
end
|
277
290
|
end
|
@@ -293,7 +306,7 @@ module Forj
|
|
293
306
|
'--------------', 'U',
|
294
307
|
'key', 'origin',
|
295
308
|
'section name'
|
296
|
-
|
309
|
+
)
|
297
310
|
|
298
311
|
get_account_values(oConfig, account_name)
|
299
312
|
|
@@ -302,12 +315,12 @@ module Forj
|
|
302
315
|
puts format(
|
303
316
|
'Use `forj set <key>=<value> -a %s` to update account data.',
|
304
317
|
account_name
|
305
|
-
|
318
|
+
)
|
306
319
|
puts format(
|
307
320
|
'Or `forj set <key>= -a %s` '\
|
308
321
|
'to restore key default value.',
|
309
322
|
account_name
|
310
|
-
|
323
|
+
)
|
311
324
|
end
|
312
325
|
|
313
326
|
def self.config_get_all(oConfig)
|
@@ -318,7 +331,7 @@ module Forj
|
|
318
331
|
'-----', 'U',
|
319
332
|
'''key', 'origin',
|
320
333
|
'section name'
|
321
|
-
|
334
|
+
)
|
322
335
|
|
323
336
|
oConfig.meta_each do |section, found_key, hValue|
|
324
337
|
s_upd_msg = '+'
|
@@ -339,14 +352,14 @@ module Forj
|
|
339
352
|
ANSI.clear,
|
340
353
|
section,
|
341
354
|
oConfig.get(found_key)
|
342
|
-
|
355
|
+
)
|
343
356
|
else
|
344
357
|
puts format(
|
345
358
|
'%s %-19s( ) %-12s: unset',
|
346
359
|
s_upd_msg,
|
347
360
|
found_key,
|
348
361
|
section
|
349
|
-
|
362
|
+
)
|
350
363
|
end
|
351
364
|
end
|
352
365
|
puts "\nUse 'forj set <key>=<value>' to update defaults on values" \
|
@@ -364,14 +377,14 @@ module Forj
|
|
364
377
|
"%s: '%s'",
|
365
378
|
oConfig.where?(key)[0],
|
366
379
|
oConfig.get(key)
|
367
|
-
|
380
|
+
)
|
368
381
|
elsif oConfig.where?(key.parameterize.underscore.to_sym)
|
369
382
|
key_symb = key.parameterize.underscore.to_sym
|
370
383
|
puts format(
|
371
384
|
"%s: '%s'",
|
372
385
|
oConfig.where?(key_symb)[0],
|
373
386
|
oConfig.get(key_symb)
|
374
|
-
|
387
|
+
)
|
375
388
|
else
|
376
389
|
PrcLib.message("key '%s' not found", key)
|
377
390
|
end
|
data/lib/ssh.rb
CHANGED
data/vagrant/README.md
CHANGED
@@ -49,3 +49,43 @@ Example use cases:
|
|
49
49
|
1. update your code under your host, on in vagrant, /srv/forj/...
|
50
50
|
2. update the installation with sources. This will execute rubocop and rspec, before any install.
|
51
51
|
sudo /srv/forj/vagrant/configure/install.sh
|
52
|
+
|
53
|
+
# fog openstack V3 auth
|
54
|
+
|
55
|
+
To use the latest openstack authentication v3 (including domain), you need to get fog 1.30 or get it from source. hphelion 1.1 uses openstack authentication V3.
|
56
|
+
|
57
|
+
Currently, gem fog 1.30 doesn't exist. So, this section will explain what needs to be done to get the latest patch from github
|
58
|
+
|
59
|
+
We assume vagrant is installed and working perfectly.
|
60
|
+
|
61
|
+
1. clone fog, cli and lorj patches from source.
|
62
|
+
|
63
|
+
$ mkdir -p ~/tmp/src
|
64
|
+
$ cd ~/tmp/src
|
65
|
+
$ git clone https://github.com/clarsonneur/fog.git
|
66
|
+
$ cd fog
|
67
|
+
$ sed -i 's/1.29/1.30/g' fog.gemspec
|
68
|
+
$ cd -
|
69
|
+
$ git clone https://github.com/forj-oss/lorj.git
|
70
|
+
$ cd lorj
|
71
|
+
$ git fetch https://review.forj.io/forj-oss/lorj refs/changes/55/2555/4 && git cherry-pick FETCH_HEAD
|
72
|
+
$ cd -
|
73
|
+
$ git clone https://github.com/forj-oss/cli.git
|
74
|
+
$ cd cli
|
75
|
+
$ git fetch https://review.forj.io/forj-oss/cli refs/changes/47/2547/6 && git cherry-pick FETCH_HEAD
|
76
|
+
$ cd -
|
77
|
+
|
78
|
+
2. set some tasks to execute before install forj cli
|
79
|
+
|
80
|
+
$ src="~/tmp/src/fog:bundler install ;gem build fog.gemspec ;gem install fog-1.30.0.gem"
|
81
|
+
$ src="$src;|~/tmp/src/lorj/:bundler install ;rake install"
|
82
|
+
$ export src
|
83
|
+
$ cd ~/tmp/src/cli/vagrant/fedora # You can try ubuntu as well in ../ubuntu
|
84
|
+
$ vagrant up # The box is going to be created and provisionned.
|
85
|
+
$ vagrant ssh # You are in!
|
86
|
+
|
87
|
+
3. if needed, you can set the SSL_CERT_FILE, or SSL_CERT_PATH if you having trouble with https certificates.
|
88
|
+
We assume you are still in your vagrant box.
|
89
|
+
$ export
|
90
|
+
|
91
|
+
4. Do any forj task, like forj setup, boot or destroy...
|
data/vagrant/fedora/Vagrantfile
CHANGED
@@ -52,6 +52,17 @@ Vagrant.configure(2) do |config|
|
|
52
52
|
end
|
53
53
|
end
|
54
54
|
|
55
|
+
src_data = {}
|
56
|
+
if ENV.key?('src')
|
57
|
+
# Support '<path1>:cmd1[;cmd2[;...]];|[path2:cmd3...]'
|
58
|
+
src_list = ENV['src'].split(';|')
|
59
|
+
src_list.each do |src|
|
60
|
+
src_name, cmd = src.split(':')
|
61
|
+
src_data[src_name] = cmd
|
62
|
+
config.vm.synced_folder src_name, File.join('/srv', File.basename(src_name))
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
55
66
|
# Provider-specific configuration so you can fine-tune various
|
56
67
|
# backing providers for Vagrant. These expose provider-specific options.
|
57
68
|
# Example for VirtualBox:
|
@@ -86,10 +97,15 @@ Vagrant.configure(2) do |config|
|
|
86
97
|
config.proxy.no_proxy = ENV['no_proxy'] if ENV.key?('no_proxy')
|
87
98
|
end
|
88
99
|
priv = { privileged: true }
|
89
|
-
config.vm.provision "shell", priv.merge(inline: "yum install ruby-devel libxml2-devel libxslt-devel python-yaml gcc git -y")
|
100
|
+
config.vm.provision "shell", priv.merge(inline: "yum install ruby-devel libxml2-devel libxslt-devel python-yaml gcc git tar patch gcc-c++ -y")
|
90
101
|
config.vm.provision "shell", inline: "gem install bundler --no-rdoc --no-ri"
|
91
102
|
config.vm.provision "shell", inline: "gem install rake --no-rdoc --no-ri"
|
92
103
|
config.vm.provision "shell", inline: "echo 'PATH=$PATH:/usr/local/bin' >> /etc/profile.d/local.sh"
|
104
|
+
src_data.each do |key, value|
|
105
|
+
path = File.join('/srv', File.basename(key))
|
106
|
+
value = "echo 'Nothing more to do in #{path}'" if value.nil?
|
107
|
+
config.vm.provision "shell", inline: "cd #{path} ; #{value}"
|
108
|
+
end
|
93
109
|
config.vm.provision "shell", inline: "/srv/forj/vagrant/configure/install.sh"
|
94
110
|
config.vm.provision "shell", inline: "echo \"echo 'Call sudo /srv/forj/vagrant/configure/install.sh to reinstall forj/lorj from source'\" >> ~vagrant/.bash_profile"
|
95
111
|
end
|
data/vagrant/ubuntu/Vagrantfile
CHANGED
@@ -5,6 +5,8 @@
|
|
5
5
|
# configures the configuration version (we support older styles for
|
6
6
|
# backwards compatibility). Please don't change it unless you know what
|
7
7
|
# you're doing.
|
8
|
+
|
9
|
+
|
8
10
|
Vagrant.configure(2) do |config|
|
9
11
|
# The most common configuration options are documented and commented below.
|
10
12
|
# For a complete reference, please see the online documentation at
|
@@ -40,11 +42,24 @@ Vagrant.configure(2) do |config|
|
|
40
42
|
# config.vm.synced_folder "../data", "/vagrant_data"
|
41
43
|
config.vm.synced_folder "../../", "/srv/forj"
|
42
44
|
|
45
|
+
lorj = false
|
43
46
|
if ENV.key?('lorj_src')
|
44
47
|
lorj_src = File.expand_path(ENV['lorj_src'])
|
45
48
|
git_data = File.join(lorj_src, '.git', 'config')
|
46
49
|
if File.exist?(git_data) && open(git_data) { |f| f.grep(/forj-oss\/lorj/) }
|
47
50
|
config.vm.synced_folder ENV['lorj_src'], "/srv/lorj"
|
51
|
+
lorj=true
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
src_data = {}
|
56
|
+
if ENV.key?('src')
|
57
|
+
# Support '<path1>:cmd1[;cmd2[;...]];|[path2:cmd3...]'
|
58
|
+
src_list = ENV['src'].split(';|')
|
59
|
+
src_list.each do |src|
|
60
|
+
src_name, cmd = src.split(':')
|
61
|
+
src_data[src_name] = cmd
|
62
|
+
config.vm.synced_folder src_name, File.join('/srv', File.basename(src_name))
|
48
63
|
end
|
49
64
|
end
|
50
65
|
|
@@ -86,6 +101,12 @@ Vagrant.configure(2) do |config|
|
|
86
101
|
config.vm.provision "shell", priv.merge(inline: "apt-get install ruby1.9.1 ruby1.9.1-dev rubygems1.9.1 build-essential libopenssl-ruby1.9.1 libssl-dev zlib1g-dev libxml2-dev libxslt-dev git -y")
|
87
102
|
config.vm.provision "shell", priv.merge(inline: "gem install bundler --no-rdoc --no-ri")
|
88
103
|
config.vm.provision "shell", priv.merge(inline: "gem install rake --no-rdoc --no-ri")
|
104
|
+
config.vm.provision "shell", inline: "echo 'PATH=$PATH:/usr/local/bin' >> /etc/profile.d/local.sh"
|
105
|
+
src_data.each do |key, value|
|
106
|
+
path = File.join('/srv', File.basename(key))
|
107
|
+
value = "echo 'Nothing more to do in #{path}'" if value.nil?
|
108
|
+
config.vm.provision "shell", inline: "cd #{path} ; #{value}"
|
109
|
+
end
|
89
110
|
config.vm.provision "shell", inline: "/srv/forj/vagrant/configure/install.sh"
|
90
|
-
config.vm.provision "shell", inline: "echo
|
111
|
+
config.vm.provision "shell", inline: "echo \"echo 'Call sudo /srv/forj/vagrant/configure/install.sh to reinstall forj/lorj from source'\" >> ~vagrant/.bash_profile"
|
91
112
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: forj
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
4
|
+
version: 1.0.10
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- forj team
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-
|
11
|
+
date: 2015-04-17 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: thor
|
@@ -24,20 +24,6 @@ dependencies:
|
|
24
24
|
- - '>='
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: 0.16.0
|
27
|
-
- !ruby/object:Gem::Dependency
|
28
|
-
name: fog
|
29
|
-
requirement: !ruby/object:Gem::Requirement
|
30
|
-
requirements:
|
31
|
-
- - ~>
|
32
|
-
- !ruby/object:Gem::Version
|
33
|
-
version: 1.26.0
|
34
|
-
type: :runtime
|
35
|
-
prerelease: false
|
36
|
-
version_requirements: !ruby/object:Gem::Requirement
|
37
|
-
requirements:
|
38
|
-
- - ~>
|
39
|
-
- !ruby/object:Gem::Version
|
40
|
-
version: 1.26.0
|
41
27
|
- !ruby/object:Gem::Dependency
|
42
28
|
name: git
|
43
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -137,19 +123,19 @@ dependencies:
|
|
137
123
|
- !ruby/object:Gem::Version
|
138
124
|
version: 1.5.11
|
139
125
|
- !ruby/object:Gem::Dependency
|
140
|
-
name:
|
126
|
+
name: lorj_cloud
|
141
127
|
requirement: !ruby/object:Gem::Requirement
|
142
128
|
requirements:
|
143
129
|
- - ~>
|
144
130
|
- !ruby/object:Gem::Version
|
145
|
-
version: 1.0
|
131
|
+
version: 0.1.0
|
146
132
|
type: :runtime
|
147
133
|
prerelease: false
|
148
134
|
version_requirements: !ruby/object:Gem::Requirement
|
149
135
|
requirements:
|
150
136
|
- - ~>
|
151
137
|
- !ruby/object:Gem::Version
|
152
|
-
version: 1.0
|
138
|
+
version: 0.1.0
|
153
139
|
- !ruby/object:Gem::Dependency
|
154
140
|
name: rake
|
155
141
|
requirement: !ruby/object:Gem::Requirement
|
@@ -184,14 +170,14 @@ dependencies:
|
|
184
170
|
requirements:
|
185
171
|
- - '>='
|
186
172
|
- !ruby/object:Gem::Version
|
187
|
-
version: 0.
|
173
|
+
version: 0.30.0
|
188
174
|
type: :development
|
189
175
|
prerelease: false
|
190
176
|
version_requirements: !ruby/object:Gem::Requirement
|
191
177
|
requirements:
|
192
178
|
- - '>='
|
193
179
|
- !ruby/object:Gem::Version
|
194
|
-
version: 0.
|
180
|
+
version: 0.30.0
|
195
181
|
description: forj cli - See https://www.forj.io for documentation/information
|
196
182
|
email:
|
197
183
|
- forj@forj.io
|