forj 0.0.39 → 0.0.40
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/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
|