forj 0.0.39 → 0.0.40
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile +11 -2
- data/README.md +30 -16
- data/Rakefile +6 -1
- data/bin/forj +113 -54
- data/lib/boot.rb +37 -36
- data/lib/connection.rb +3 -3
- data/lib/defaults.yaml +5 -3
- data/lib/forj-account.rb +454 -0
- data/lib/forj-config.rb +181 -132
- data/lib/log.rb +6 -5
- data/lib/network.rb +4 -4
- data/lib/repositories.rb +1 -1
- data/lib/security.rb +55 -26
- data/lib/setup.rb +7 -291
- data/spec/connection_spec.rb +5 -1
- data/spec/forj-config_spec.rb +121 -19
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: bf55692c422122d563704df71be87e18427bcdf2
|
4
|
+
data.tar.gz: ffc9da6135f46720256dbabb3f8a9bf277a3d848
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 29d4e63ea42e92a8b2225a550146e692afd76b95911a1d74ae257e1c5823483473774b3e5d1e3049f02bb2f189dac8a35a1f8ec32d8a2d52f55aa7f99b19730d
|
7
|
+
data.tar.gz: 3a39d5dd6bed1d7cc75607e726625979a37dda94b59f337105b9479cf37228efff4bac5cd15442b1686b2e45fb5e815c18da326e82e7deaa4841f173fffc4dac
|
data/Gemfile
CHANGED
@@ -16,10 +16,15 @@
|
|
16
16
|
# limitations under the License.
|
17
17
|
|
18
18
|
source 'https://rubygems.org'
|
19
|
+
group(:development, :test) do
|
20
|
+
gem 'rake'
|
21
|
+
gem 'debugger'
|
22
|
+
gem 'rspec', "~> 2.10.0", :require => false
|
23
|
+
end
|
19
24
|
|
20
25
|
gem 'mime-types','1.25.1'
|
21
|
-
gem 'excon','0.
|
22
|
-
gem 'json'
|
26
|
+
gem 'excon','0.31.0'
|
27
|
+
gem 'json','~>1.7.5'
|
23
28
|
gem 'nokogiri','1.5.11'
|
24
29
|
gem 'fog', '1.19.0'
|
25
30
|
gem 'git', '>=1.2.7'
|
@@ -27,3 +32,7 @@ gem 'rainbow'
|
|
27
32
|
gem 'rbx-require-relative', '~> 0.0.7'
|
28
33
|
gem 'thor', '>=0.16.0'
|
29
34
|
gem 'hpcloud', '~>2.0.8'
|
35
|
+
gem 'highline','>=1.6.21'
|
36
|
+
gem 'ansi','>=1.4.3'
|
37
|
+
gem 'encryptor','>=1.3.0'
|
38
|
+
|
data/README.md
CHANGED
@@ -16,13 +16,14 @@ Installation
|
|
16
16
|
|
17
17
|
**For ruby 1.9**
|
18
18
|
|
19
|
-
$
|
19
|
+
$ apt-get -y update
|
20
|
+
$ sudo 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
|
20
21
|
$ sudo gem install forj
|
21
22
|
|
22
23
|
|
23
24
|
**For ruby 1.8**
|
24
25
|
|
25
|
-
$ sudo apt-get install ruby1.8-dev ruby1.8 ri1.8 rdoc1.8 irb1.8 -y
|
26
|
+
$ sudo apt-get install ruby1.8-dev ruby1.8 ri1.8 rdoc1.8 irb1.8 rubygems -y
|
26
27
|
$ sudo apt-get install libreadline-ruby1.8 libruby1.8 libopenssl-ruby -y
|
27
28
|
$ sudo apt-get install libxslt-dev libxml2-dev -y
|
28
29
|
$ sudo gem install nokogiri
|
@@ -31,6 +32,18 @@ Installation
|
|
31
32
|
$ sudo gem install hpcloud
|
32
33
|
$ sudo gem install forj
|
33
34
|
|
35
|
+
**Installation from source**
|
36
|
+
Perform one of the ruby installation steps without `gem install forj`.
|
37
|
+
|
38
|
+
$ sudo apt-get -y install build-essential make libxslt-dev libxml2-dev
|
39
|
+
$ sudo mkdir -p /opt/config/production/git
|
40
|
+
$ cd /opt/config/production/git
|
41
|
+
$ git clone https://review.forj.io/forj-oss/cli
|
42
|
+
$ cd cli
|
43
|
+
$ gem install bundler --no-rdoc --no-ri
|
44
|
+
$ gem install rake --no-rdoc --no-ri
|
45
|
+
$ bundle install --gemfile Gemfile
|
46
|
+
$ rake install
|
34
47
|
|
35
48
|
Quick steps: How to create a forj?
|
36
49
|
----------------------------------
|
@@ -39,16 +52,17 @@ Quick steps: How to create a forj?
|
|
39
52
|
|
40
53
|
1. Setup your first forj account.
|
41
54
|
|
42
|
-
`$ forj setup [
|
55
|
+
`$ forj setup [AccountName]`
|
43
56
|
|
44
|
-
Ex: `forj setup
|
57
|
+
Ex: `forj setup MyAccount`. In this example, your account will be named 'MyAccount'.
|
58
|
+
The first time you setup your account, it will become the default one.
|
45
59
|
**WARNING!!!** [Provider] is currently not supported. By default, it is using hpcloud as default provider.
|
46
60
|
|
47
61
|
2. Create your forge on your default account
|
48
62
|
|
49
|
-
`$ forj boot <blueprint>
|
63
|
+
`$ forj boot <blueprint> <InstanceName>`
|
50
64
|
|
51
|
-
Ex: `forj boot redstone
|
65
|
+
Ex: `forj boot redstone myforge` - This command will start a Redstone forge named 'myforge' with the default FORJ account. Previous, we set it to be MyAccount.
|
52
66
|
|
53
67
|
|
54
68
|
###Forj options:
|
@@ -64,11 +78,11 @@ To get help on specific action, just type:
|
|
64
78
|
Examples of possible actions:
|
65
79
|
|
66
80
|
Commands:
|
67
|
-
forj boot <Blueprint>
|
68
|
-
forj down
|
69
|
-
forj help [action]
|
70
|
-
forj setup
|
71
|
-
forj show defaults
|
81
|
+
forj boot <Blueprint> <InstanceName> [options] # boot a Maestro box and instruct it to provision the blueprint
|
82
|
+
forj down # delete the Maestro box and all systems installed by the blueprint
|
83
|
+
forj help [action] # Describe available FORJ actions or one specific action
|
84
|
+
forj setup # set the credentials for forj cli
|
85
|
+
forj show defaults # Show list of predefined value you can update in your ~/.forj/config.yaml
|
72
86
|
forj ssh
|
73
87
|
|
74
88
|
|
@@ -84,12 +98,12 @@ Here are the variables list you can set:
|
|
84
98
|
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>
|
85
99
|
maestro_url: url # Maestro GIT repository for clone.
|
86
100
|
infra_repo: path # Path to the default Infra repository used to store your specific bootstrap/build environment. By default: ~/.forj/infra
|
87
|
-
image: imageName #
|
88
|
-
# Image used to create Maestro and all forge boxes. By default, it is 'Ubuntu Precise 12.04.4 LTS Server 64-bit 20140414 (Rescue Image)'
|
101
|
+
image: imageName # Image used to create Maestro and all forge boxes. By default, it is 'Ubuntu Precise 12.04.4 LTS Server 64-bit 20140414 (Rescue Image)'
|
89
102
|
# If you have created the generic proto2b image, you can set it here.
|
90
|
-
flavor: flavorName #
|
91
|
-
#
|
92
|
-
|
103
|
+
flavor: flavorName # Maestro Flavor name. This flavor is for Maestro only. Your blueprint layout defines each node flavors on needs.
|
104
|
+
# By default: standard.medium
|
105
|
+
bp_flavor: flavorName # Blueprint nodes default flavor. Usually, blueprint node are smaller than Maestro.
|
106
|
+
# By default: standard.small
|
93
107
|
ports: [Port1,Port2,...] # list of additional ports to add in your cloud security group.
|
94
108
|
# This list is added to the default one in defaults.yaml
|
95
109
|
keypair_path: path # Define the file path to your OpenSSH private key. Useful to access your box with ssh command line.
|
data/Rakefile
CHANGED
@@ -15,9 +15,14 @@
|
|
15
15
|
# See the License for the specific language governing permissions and
|
16
16
|
# limitations under the License.
|
17
17
|
|
18
|
-
|
18
|
+
require 'rubygems'
|
19
|
+
require 'bundler/setup'
|
19
20
|
require 'rspec/core/rake_task'
|
20
21
|
|
22
|
+
$stdout.sync = true
|
23
|
+
$stderr.sync = true
|
24
|
+
Bundler::GemHelper.install_task
|
25
|
+
|
21
26
|
task :default => [:spec]
|
22
27
|
|
23
28
|
desc 'Run the specs.'
|
data/bin/forj
CHANGED
@@ -36,6 +36,7 @@ include Setup
|
|
36
36
|
include Ssh
|
37
37
|
|
38
38
|
require 'forj-config.rb' # Load class ForjConfig
|
39
|
+
require 'forj-account.rb' # Load class ForjAccount
|
39
40
|
require 'log.rb' # Load default loggers
|
40
41
|
require 'connection.rb' # Load class ForjConnection
|
41
42
|
|
@@ -67,18 +68,21 @@ class Forj < Thor
|
|
67
68
|
Quick steps: How to create a forj?
|
68
69
|
----------------------------------
|
69
70
|
|
70
|
-
|
71
|
-
|
71
|
+
To test a forj blueprint, you will need an account on a cloud solution.
|
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)
|
72
73
|
|
73
|
-
|
74
|
+
1. Setup your FORJ account.
|
75
|
+
`$ forj setup [AccountName] [--provider Provider]`
|
74
76
|
|
75
|
-
|
76
|
-
|
77
|
+
Ex: `forj setup MyForjAccount`. In this example, you will setup 'MyForjAccount' with your HPHelion account. The first time, this account will become the default one.
|
78
|
+
|
79
|
+
**IMPORTANT NOTE** By default, forj setup will propose you to create your forge on HPHelion (provider 'hpcloud').
|
80
|
+
If AccountName is not set, the account name will be proposed to be name 'hpcloud' as well!
|
77
81
|
|
78
82
|
2. Create your forge on your default account
|
79
|
-
`$ forj boot <blueprint>
|
83
|
+
`$ forj boot <blueprint> <InstanceName>`
|
80
84
|
|
81
|
-
Ex: `forj boot redstone
|
85
|
+
Ex: `forj boot redstone MyForge`. In this example, forj will create a `redstone` blueprint forge named `MyForge`, using the default `MyForjAccount`
|
82
86
|
|
83
87
|
forj command line details:
|
84
88
|
--------------------------
|
@@ -87,44 +91,81 @@ forj command line details:
|
|
87
91
|
end
|
88
92
|
end
|
89
93
|
|
90
|
-
|
94
|
+
################################# BOOT
|
91
95
|
desc 'boot <Blueprint> on <Provider> as <InstanceName> [options]', 'boot a Maestro box and instruct it to provision the blueprint'
|
92
96
|
|
93
97
|
long_desc <<-LONGDESC
|
94
98
|
This task boot a new forge with the following options
|
95
99
|
\x5- blueprint : Is the name of the blueprint (currently cli only supports redstone)
|
96
|
-
\x5- Provider : in which cloud provider to deploy the forge
|
97
100
|
\x5- InstanceName : name of the forge
|
98
101
|
|
99
102
|
Ex: forj boot redstone on hpcloud as maestro_test
|
100
103
|
|
101
|
-
`forj boot` load
|
104
|
+
`forj boot` load predefined forj values from `lib/defaults.yaml`. If you need to change one of them, add the key/value in your local config (-c or `~/.forj/config.yaml`).
|
102
105
|
The list of predefined values can be retrieved with forj show defaults
|
103
106
|
|
104
107
|
LONGDESC
|
105
108
|
|
106
|
-
method_option :account_name, :aliases => '-a', :desc =>
|
107
|
-
method_option :
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
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
|
+
method_option :maestro_repo, :aliases => '-m', :desc => "To use a different Maestro repository already cloned.
|
111
|
+
By default, Maestro is systematically cloned to ~/.forj/maestro from github.
|
112
|
+
|
113
|
+
Following options superseed your config file or forj defaults."
|
114
|
+
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
|
+
method_option :key_name, :aliases => '-k', :desc => "config: keypair_name : Keypair name to use."
|
116
|
+
method_option :key_path, :aliases => '-p', :desc => "config: keypair_path : Private or Public key file to use."
|
117
|
+
method_option :security_group, :aliases => '-s', :desc => "config: security_group: Security group name to use and configure."
|
118
|
+
method_option :image, :aliases => '-i', :desc => "config: image : Image name to use to build Maestro and blueprint nodes."
|
119
|
+
method_option :maestro_flavor, :aliases => '-f', :desc => "config: flavor : Maestro flavor to use."
|
120
|
+
method_option :bp_flavor, :aliases => '-b', :desc => "config: bp_flavor : Blueprint nodes default flavor to use.
|
121
|
+
|
122
|
+
Build system options:"
|
112
123
|
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.'
|
113
124
|
method_option :build, :aliases => '-B', :desc => 'Replace the default build.sh'
|
114
|
-
method_option :branch, :aliases => '-
|
115
|
-
method_option :test_box, :aliases => '-T', :desc => 'Create test.rb-box meta from the repository path provided.'
|
125
|
+
method_option :branch, :aliases => '-R', :desc => "Branch name to clone for maestro.
|
116
126
|
|
117
|
-
|
127
|
+
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
|
130
|
+
test-box will send your local maestro repo to your box, for boot."
|
131
|
+
|
132
|
+
def boot(blueprint, on_or_name, old_accountname = nil, as = nil, old_name = nil)
|
133
|
+
|
118
134
|
Logging.set_level(Logger::INFO) if options[:verbose]
|
119
135
|
Logging.set_level(Logger::DEBUG) if options[:debug]
|
120
|
-
|
136
|
+
|
137
|
+
oConfig = ForjConfig.new(options[:config])
|
138
|
+
|
139
|
+
|
140
|
+
# depreciated: <BluePrint> on <AccountName> as <InstanceName>
|
141
|
+
if old_accountname and as and old_name
|
142
|
+
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
|
+
if oConfig.get('account_name') == old_accountname
|
144
|
+
Logging.warning("%s` instead." % msg)
|
145
|
+
else
|
146
|
+
Logging.warning("%s -a '%s'` instead." % [msg, old_accountname])
|
147
|
+
end
|
148
|
+
name = old_name
|
149
|
+
oConfig.set('account_name', old_accountname)
|
150
|
+
else
|
151
|
+
name = on_or_name
|
152
|
+
end
|
121
153
|
|
122
154
|
Logging.fatal(1, "instance name '%s' not supported. Support only lower case, numeric and dash caracters." % [name]) if not /^[\d[[:lower:]]-]+$/ =~ name
|
123
155
|
|
124
156
|
# Options are added if they are set. Otherwise, get will retrieve the default value.
|
125
|
-
oConfig.set('account_name', options[:account_name]
|
126
|
-
oConfig.set('infra_repo',
|
127
|
-
oConfig.set('keypair_name',
|
157
|
+
oConfig.set('account_name', options[:account_name]) if options[:account_name]
|
158
|
+
oConfig.set('infra_repo', options[:infra])
|
159
|
+
oConfig.set('keypair_name', options[:key_name])
|
160
|
+
oConfig.set('keypair_path', options[:key_path])
|
161
|
+
oConfig.set('security_group', options[:security_group])
|
162
|
+
oConfig.set('image', options[:image])
|
163
|
+
oConfig.set('flavor', options[:maestro_flavor])
|
164
|
+
oConfig.set('bp_flavor', options[:bp_flavor])
|
165
|
+
oConfig.set(:maestro_repo , options[:maestro_repo])
|
166
|
+
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
|
+
|
128
169
|
if options[:key_path]
|
129
170
|
mFound = options[:key_path].match(/^(.*)(\.pub)?$/)
|
130
171
|
if mFound
|
@@ -138,27 +179,34 @@ The list of predefined values can be retrieved with forj show defaults
|
|
138
179
|
end
|
139
180
|
end
|
140
181
|
|
141
|
-
|
142
|
-
oConfig.set('provider', cloud_provider)
|
143
|
-
Boot.boot(blueprint, name,
|
144
|
-
options[:build],
|
182
|
+
Boot.boot(blueprint, name, options[:build],
|
145
183
|
options[:build_config], options[:branch],
|
146
|
-
options[:
|
147
|
-
options[:box_name], oConfig)
|
184
|
+
options[:boothook], options[:box_name], oConfig)
|
148
185
|
end
|
149
186
|
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
187
|
+
################################# Show defaults
|
188
|
+
desc 'show defaults', 'Show list of predefined value you can update in your ~/.forj/config.yaml'
|
189
|
+
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."
|
190
|
+
|
191
|
+
def show(name)
|
192
|
+
case name
|
193
|
+
when 'defaults'
|
194
|
+
oConfig=ForjConfig.new()
|
195
|
+
oConfig.set('account_name', options[:account_name])
|
196
|
+
oForjAccount = ForjAccount.new(oConfig)
|
197
|
+
oForjAccount.ac_load()
|
198
|
+
|
199
|
+
puts 'List of default values: (local refer to your config file. hash refer to your FORJ account data)'
|
200
|
+
puts '-----------------------'
|
201
|
+
puts oConfig.default_dump([oForjAccount.hAccountData]).to_yaml
|
202
|
+
puts '-----------------------'
|
203
|
+
puts "To change default values, update your ~/.forj/config.yaml and add the key/value entry under 'default' section."
|
204
|
+
else
|
205
|
+
Logging.error("object '%s' unknown." % name)
|
206
|
+
end
|
207
|
+
end
|
154
208
|
|
155
|
-
|
156
|
-
--------------------------'
|
157
|
-
puts rhGet(oConfig.yConfig,'default').to_yaml()
|
158
|
-
puts '--------------------------'
|
159
|
-
puts "You can change any of those variables by editing/adding them in your ~/.forj/config.yaml, under section 'default:'"
|
160
|
-
end
|
161
|
-
# DOWN
|
209
|
+
################################# DOWN
|
162
210
|
desc 'down', 'delete the Maestro box and all systems installed by the blueprint'
|
163
211
|
long_desc <<-LONGDESC
|
164
212
|
Not yet implemented
|
@@ -166,11 +214,11 @@ The list of predefined values can be retrieved with forj show defaults
|
|
166
214
|
|
167
215
|
def down(name)
|
168
216
|
Logging.set_level(Logger::INFO) if options[:verbose]
|
169
|
-
|
170
|
-
|
217
|
+
Logging.set_level(Logger::DEBUG) if options[:debug]
|
218
|
+
Down.down(name)
|
171
219
|
end
|
172
220
|
|
173
|
-
|
221
|
+
################################# SSH
|
174
222
|
desc 'ssh', 'connect to your forge thru ssh'
|
175
223
|
long_desc <<-LONGDESC
|
176
224
|
Connect through ssh to an existing instance
|
@@ -184,26 +232,37 @@ Connect through ssh to an existing instance
|
|
184
232
|
Ssh.connect(name, server)
|
185
233
|
end
|
186
234
|
|
187
|
-
|
188
|
-
method_option :
|
235
|
+
################################# SETUP
|
236
|
+
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
|
239
|
+
(without extension/.pem = private, .pub = public)"
|
189
240
|
|
190
|
-
desc 'setup [Provider] [options]',
|
241
|
+
desc 'setup [AccountName [Provider]] [options]', "Setup FORJ cloud account credentials and information."
|
191
242
|
long_desc <<-LONGDESC
|
192
|
-
|
243
|
+
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.
|
245
|
+
|
246
|
+
If AccountName is not set, 'hpcloud' will be used for AccountName and provider name, by default.
|
247
|
+
\x5If AccountName is not set without provider, 'hpcloud' provider will be used, by default.
|
248
|
+
|
249
|
+
WARNING! Currently supports only hpcloud provider.
|
193
250
|
|
194
251
|
Several data will be requested like:
|
195
|
-
\x5-
|
196
|
-
\x5-
|
197
|
-
\x5-
|
198
|
-
\x5-
|
199
|
-
\x5- availability_zone: which availability zone will be deployed
|
252
|
+
\x5- Cloud provider credentials and services.
|
253
|
+
\x5- user/password (password is encrypted)
|
254
|
+
\x5- DNS settings if you want Maestro to manage it.
|
255
|
+
\x5- domain name to add to each boxes hostname
|
200
256
|
LONGDESC
|
201
|
-
def setup(
|
257
|
+
def setup(sAccountName = 'hpcloud', sProvider = "hpcloud")
|
202
258
|
Logging.set_level(Logger::INFO) if options[:verbose]
|
203
259
|
Logging.set_level(Logger::DEBUG) if options[:debug]
|
204
260
|
oConfig=ForjConfig.new(options[:config])
|
205
261
|
oConfig.set('provider', sProvider)
|
206
|
-
|
262
|
+
oConfig.set('account_name', sAccountName)
|
263
|
+
oConfig.set('keypair_path', options[:keypair_path]) if options[:keypair_path]
|
264
|
+
oConfig.set('keypair_name', options[:keypair_name]) if options[:keypair_name]
|
265
|
+
Setup.setup(oConfig)
|
207
266
|
end
|
208
267
|
|
209
268
|
end
|
data/lib/boot.rb
CHANGED
@@ -35,21 +35,28 @@ include Helpers
|
|
35
35
|
#
|
36
36
|
module Boot
|
37
37
|
def boot(blueprint, name, build, build_config,
|
38
|
-
branch,
|
39
|
-
oConfig)
|
38
|
+
branch, boothook, box_name, oConfig)
|
40
39
|
begin
|
41
40
|
|
41
|
+
Logging.fatal(1, 'FORJ account not specified. Did you used `forj setup`, before?') if not oConfig.get('account_name')
|
42
|
+
|
43
|
+
oForjAccount = ForjAccount.new(oConfig)
|
44
|
+
|
45
|
+
oForjAccount.ac_load()
|
46
|
+
|
47
|
+
|
48
|
+
# Load Forj account data
|
49
|
+
forjAccountFile = File.join($FORJ_ACCOUNTS_PATH, oConfig.get('account_name'))
|
50
|
+
oConfig.ExtraLoad(forjAccountFile, :forj_accounts, oConfig.get('account_name'))
|
51
|
+
|
42
52
|
# Check options and set data
|
43
|
-
cloud_provider=
|
44
|
-
Logging.fatal(1, 'No provider specified.') if not cloud_provider
|
53
|
+
cloud_provider = oForjAccount.get(:account, :provider, 'hpcloud')
|
45
54
|
|
46
55
|
if cloud_provider != 'hpcloud'
|
47
56
|
Logging.fatal(1, "forj setup support only hpcloud. '%s' is currently not supported." % cloud_provider)
|
48
57
|
end
|
49
58
|
|
50
|
-
|
51
|
-
|
52
|
-
initial_msg = 'booting %s on %s (~/.forj/forj.log)' % [blueprint , cloud_provider]
|
59
|
+
initial_msg = "booting %s on %s\nCheck log with `tail -f ~/.forj/forj.log`.\nUse --verbose or --debug for more boot status on screen" % [blueprint , cloud_provider]
|
53
60
|
Logging.high_level_msg(initial_msg) #################
|
54
61
|
|
55
62
|
# Initialize defaults
|
@@ -57,9 +64,6 @@ module Boot
|
|
57
64
|
|
58
65
|
infra_dir = File.expand_path(oConfig.get('infra_repo'))
|
59
66
|
|
60
|
-
# Load Forj account data
|
61
|
-
forjAccountFile = File.join($FORJ_ACCOUNTS_PATH, oConfig.get('account_name'))
|
62
|
-
oConfig.ExtraLoad(forjAccountFile, :forj_accounts, oConfig.get('account_name'))
|
63
67
|
|
64
68
|
# Check about infra repo compatibility with forj cli
|
65
69
|
bBuildInfra = Repositories.infra_rebuild_required?(oConfig, infra_dir)
|
@@ -77,18 +81,19 @@ module Boot
|
|
77
81
|
end
|
78
82
|
|
79
83
|
# Get FORJ DNS setting
|
80
|
-
yDNS =
|
81
|
-
Logging.fatal(1, "DNS or domain name are missing. Please execute forj setup %s" %
|
84
|
+
yDNS = rhGet(oForjAccount.hAccountData, :dns)
|
85
|
+
Logging.fatal(1, "DNS or domain name are missing. Please execute forj setup %s" % oForjAccount.get(:account, 'name')) if not yDNS
|
86
|
+
|
87
|
+
branch = oConfig.get('branch') unless branch
|
82
88
|
|
83
89
|
# Step Maestro Clone
|
84
|
-
if not maestro_repo
|
85
|
-
Logging.high_level_msg('cloning maestro repo ...' ) #################
|
90
|
+
if not oConfig.get(:maestro_repo)
|
86
91
|
Logging.info('cloning maestro repo from \'%s\'...' % maestro_url)
|
87
92
|
Repositories.clone_repo(maestro_url)
|
88
93
|
maestro_repo=File.expand_path('~/.forj/maestro')
|
89
94
|
else
|
90
|
-
maestro_repo=File.expand_path(maestro_repo)
|
91
|
-
if not File.exists?('%s/templates/infra
|
95
|
+
maestro_repo=File.expand_path(oConfig.get(:maestro_repo))
|
96
|
+
if not File.exists?('%s/templates/infra/maestro.box.%s.env' % [maestro_repo, branch])
|
92
97
|
Logging.fatal(1, "'%s' is not a recognized Maestro repository. forj cli searched for templates/infra/%s-maestro.box.GITBRANCH.env.tmpl" % [maestro_repo, cloud_provider])
|
93
98
|
end
|
94
99
|
Logging.info('Using your maestro cloned repo \'%s\'...' % maestro_repo)
|
@@ -102,27 +107,23 @@ module Boot
|
|
102
107
|
# Connect to services
|
103
108
|
oFC=ForjConnection.new(oConfig)
|
104
109
|
|
105
|
-
Logging.high_level_msg('Configuring network...') #################
|
106
110
|
Logging.info('Configuring network \'%s\'' % [oConfig.get('network')])
|
107
111
|
begin
|
108
112
|
network = Network.get_or_create_network(oFC, oConfig.get('network'))
|
109
113
|
subnet = Network.get_or_create_subnet(oFC, network.id, network.name)
|
110
114
|
router = Network.get_or_create_router(oFC, network, subnet)
|
111
115
|
rescue => e
|
112
|
-
Logging.fatal(1, "Network properly configured is required
|
116
|
+
Logging.fatal(1, "Network properly configured is required.", e)
|
113
117
|
end
|
114
118
|
|
115
|
-
Logging.
|
116
|
-
|
117
|
-
SecurityGroup.hpc_import_key(oConfig, oFC.sAccountName)
|
119
|
+
Logging.info('Configuring keypair \'%s\'' % [oForjAccount.get(:credentials, 'keypair_name')])
|
120
|
+
SecurityGroup.hpc_import_key(oForjAccount)
|
118
121
|
|
119
|
-
Logging.state('Configuring security group...') #################
|
120
122
|
|
121
123
|
Logging.info('Configuring Security Group \'%s\'' % [oConfig.get('security_group')])
|
122
124
|
security_group = SecurityGroup.get_or_create_security_group(oFC, oConfig.get('security_group'))
|
123
125
|
ports = oConfig.get('ports')
|
124
126
|
|
125
|
-
Logging.state('Configuring security group ports...') #################
|
126
127
|
ports.each do |port|
|
127
128
|
port = port.to_s if port.class != String
|
128
129
|
if not /^\d+(-\d+)?$/ =~ port
|
@@ -139,13 +140,14 @@ module Boot
|
|
139
140
|
ENV['FORJ_CLI_ENV'] = oBuildEnv.sBuildEnvFile
|
140
141
|
oBuildEnv.set('FORJ_HPC', oFC.sAccountName)
|
141
142
|
oBuildEnv.set('FORJ_HPC_NET', network.name)
|
142
|
-
oBuildEnv.set('FORJ_SECURITY_GROUP',
|
143
|
-
oBuildEnv.set('FORJ_KEYPAIR',
|
144
|
-
oBuildEnv.set('FORJ_HPC_NOVA_KEYPUB',
|
145
|
-
oBuildEnv.set('FORJ_BASE_IMG',
|
146
|
-
oBuildEnv.set('FORJ_FLAVOR',
|
147
|
-
oBuildEnv.set('
|
148
|
-
oBuildEnv.set('
|
143
|
+
oBuildEnv.set('FORJ_SECURITY_GROUP', oForjAccount.get(:maestro, 'security_group'))
|
144
|
+
oBuildEnv.set('FORJ_KEYPAIR', oForjAccount.get(:credentials,'keypair_name'))
|
145
|
+
oBuildEnv.set('FORJ_HPC_NOVA_KEYPUB', oForjAccount.get(:credentials,'keypair_path') + '.pub')
|
146
|
+
oBuildEnv.set('FORJ_BASE_IMG', oForjAccount.get(:maestro, 'image'))
|
147
|
+
oBuildEnv.set('FORJ_FLAVOR', oForjAccount.get(:maestro, 'flavor'))
|
148
|
+
oBuildEnv.set('FORJ_BP_FLAVOR', oForjAccount.get(:maestro, 'bp_flavor'))
|
149
|
+
oBuildEnv.set('FORJ_TENANT_NAME', oForjAccount.get(:compute, :tenant_name))
|
150
|
+
oBuildEnv.set('FORJ_HPC_COMPUTE', rhGet(oConfig.ExtraGet(:hpc_accounts, oFC.sAccountName, :regions), :compute))
|
149
151
|
|
150
152
|
|
151
153
|
oBuildEnv.set('FORJ_DOMAIN', yDNS[:domain_name])
|
@@ -162,12 +164,12 @@ module Boot
|
|
162
164
|
build = 'bin/build.sh' unless build
|
163
165
|
|
164
166
|
build_config = oConfig.get('build_config')
|
165
|
-
branch = oConfig.get('branch') unless branch
|
166
167
|
box_name = oConfig.get('box_name')
|
167
168
|
|
168
|
-
|
169
|
+
arg = '--meta blueprint=%s ' % [blueprint]
|
170
|
+
arg += "--test-box '%s' " % oConfig.get(:test_box) if oConfig.exist?(:test_box)
|
169
171
|
|
170
|
-
command = '%s --build_ID %s --box-name %s --build-conf-dir %s --build-config %s --gitBranch %s --debug-box %s' % [build, name, box_name, infra_dir, build_config, branch,
|
172
|
+
command = '%s --build_ID %s --box-name %s --build-conf-dir %s --build-config %s --gitBranch %s --debug-box %s' % [build, name, box_name, infra_dir, build_config, branch, arg]
|
171
173
|
|
172
174
|
maestro_build_path = File.join(maestro_repo, 'build')
|
173
175
|
|
@@ -227,9 +229,8 @@ class BuildEnv
|
|
227
229
|
begin
|
228
230
|
File.open(@sBuildEnvFile, 'w') do |out|
|
229
231
|
@yBuildEnvVar.each do | key, value |
|
230
|
-
|
231
|
-
|
232
|
-
end
|
232
|
+
desc = @oConfig.getAppDefault(:description, key)
|
233
|
+
out.write("# %s - %s\n" % [key, desc]) if desc
|
233
234
|
value = "" if not value
|
234
235
|
out.write("%s='%s'\n\n" % [key, value])
|
235
236
|
end
|