forj 1.0.3 → 1.0.4

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.
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.3'
23
- s.date = '2014-12-19'
22
+ s.version = '1.0.4'
23
+ s.date = '2015-02-10'
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,7 @@ 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.19.0'
47
+ s.add_runtime_dependency 'fog', '~>1.26.0'
48
48
  s.add_runtime_dependency 'git', '>=1.2.7'
49
49
  s.add_runtime_dependency 'highline', '>= 1.6.21'
50
50
  s.add_runtime_dependency 'ansi', '>= 1.4.3'
@@ -52,13 +52,10 @@ Gem::Specification.new do |s|
52
52
  s.add_runtime_dependency 'json', '1.7.5'
53
53
  s.add_runtime_dependency 'bundler'
54
54
  s.add_runtime_dependency 'nokogiri','1.5.11'
55
- s.add_runtime_dependency 'lorj', '~> 0.2.0'
55
+ s.add_runtime_dependency 'lorj', '~> 1.0.2'
56
56
 
57
- s.add_development_dependency "bundler"
58
57
  s.add_development_dependency "rake", "~> 10.0"
59
58
  s.add_development_dependency "rspec", "~> 3.1.0"
60
59
  s.rdoc_options << '--title' << 'Lorj - The Process Controllers framework system' <<
61
60
  '--main' << 'README.md'
62
-
63
-
64
61
  end
data/forj/defaults.yaml CHANGED
@@ -184,19 +184,19 @@
184
184
  :desc: "Domain name added to each hosts."
185
185
  :account_exclusive: true
186
186
  :account: true
187
- :post_step_function: :forj_DNS_settings
187
+ :post_step_function: :forj_dns_settings
188
188
  :ask_step: 3
189
189
  :dns_service:
190
190
  :desc: "DNS service region name Maestro will use."
191
191
  :account_exclusive: true
192
192
  :account: true
193
- :pre_step_function: :forj_DNS_settings?
193
+ :pre_step_function: :forj_dns_settings?
194
194
  :ask_step: 3
195
195
  :dns_tenant_id:
196
196
  :desc: "DNS Tenant ID Maestro will use"
197
197
  :account_exclusive: true
198
198
  :account: true
199
- :pre_step_function: :forj_DNS_settings?
199
+ :pre_step_function: :forj_dns_settings?
200
200
  :ask_step: 3
201
201
 
202
202
  :maestro:
data/lib/appinit.rb CHANGED
@@ -14,39 +14,28 @@
14
14
  # See the License for the specific language governing permissions and
15
15
  # limitations under the License.
16
16
 
17
-
18
- require 'lorj'
19
-
20
17
  # Module to initialize the application
21
18
  # TODO: Cleanup about Global variables used. Should be replaced by PrcLib
22
19
  # or other kind of setting.
23
- module AppInit
24
-
25
- def AppInit.forj_initialize()
26
- # Function to create FORJ paths if missing.
27
-
28
- # Defining Global variables
29
- $FORJ_DATA_PATH = File.expand_path(File.join('~', '.forj'))
30
- $FORJ_ACCOUNTS_PATH = File.join($FORJ_DATA_PATH, 'accounts')
31
- $FORJ_KEYPAIRS_PATH = File.join($FORJ_DATA_PATH, 'keypairs')
32
- $FORJ_BUILD_PATH = File.join($FORJ_DATA_PATH, '.build')
33
- $FORJ_CREDS_PATH = File.expand_path(File.join('~', '.cache', 'forj'))
34
-
35
- # TODO: To move to an hpcloud object.
36
- $HPC_KEYPAIRS = File.expand_path(File.join('~', '.hpcloud', 'keypairs'))
37
- $HPC_ACCOUNTS = File.expand_path(File.join('~', '.hpcloud', 'accounts'))
38
-
39
- AppInit.ensure_dir_exists($FORJ_DATA_PATH)
40
- AppInit.ensure_dir_exists($FORJ_ACCOUNTS_PATH)
41
- AppInit.ensure_dir_exists($FORJ_BUILD_PATH)
42
- AppInit.ensure_dir_exists($FORJ_KEYPAIRS_PATH)
43
- FileUtils.chmod(0700, $FORJ_KEYPAIRS_PATH)
44
- AppInit.ensure_dir_exists($FORJ_CREDS_PATH)
45
- end
46
-
47
- def AppInit.ensure_dir_exists(path)
48
- if not PrcLib.dir_exists?(path)
49
- FileUtils.mkpath(path) if not File.directory?(path)
50
- end
51
- end
20
+ module Forj
21
+ class << self
22
+ attr_accessor :build_path, :keypairs_path
23
+ end
24
+
25
+ module_function
26
+
27
+ def keypairs_path=(v)
28
+ @keypairs_path = File.expand_path(v) unless @keypairs_path
29
+ PrcLib.ensure_dir_exists(@keypairs_path)
30
+ begin
31
+ FileUtils.chmod(0700, @keypairs_path) # no-op on windows
32
+ rescue => e
33
+ fatal_error(1, e.message)
34
+ end
35
+ end
36
+
37
+ def build_path=(v)
38
+ @build_path = File.expand_path(v) unless @build_path
39
+ PrcLib.ensure_dir_exists(@build_path)
40
+ end
52
41
  end
data/lib/boot.rb ADDED
@@ -0,0 +1,156 @@
1
+ #!/usr/bin/env ruby
2
+ # encoding: UTF-8
3
+
4
+ # (c) Copyright 2014 Hewlett-Packard Development Company, L.P.
5
+ #
6
+ # Licensed under the Apache License, Version 2.0 (the "License");
7
+ # you may not use this file except in compliance with the License.
8
+ # You may obtain a copy of the License at
9
+ #
10
+ # http://www.apache.org/licenses/LICENSE-2.0
11
+ #
12
+ # Unless required by applicable law or agreed to in writing, software
13
+ # distributed under the License is distributed on an "AS IS" BASIS,
14
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
+ # See the License for the specific language governing permissions and
16
+ # limitations under the License.
17
+
18
+ require 'highline/import'
19
+ require 'cloud_connection.rb'
20
+ #
21
+ # Boot module
22
+ #
23
+ module Forj
24
+ # This module provides the behavior to boot your forge
25
+ module Boot
26
+ @account = nil
27
+ attr_accessor :account
28
+
29
+ def self.deprecated_name?(blueprint, on_or_name,
30
+ old_accountname, as,
31
+ old_name
32
+ )
33
+ # depreciated: <BluePrint> on <AccountName> as <InstanceName>
34
+ if old_accountname && as && old_name
35
+ msg = format(
36
+ "The syntax `forj boot '%s' on '%s' as '%s'`" \
37
+ " is depreciated. \nUse `forj boot '%s' '%s' ",
38
+ blueprint, old_accountname, old_name, blueprint, old_name
39
+ )
40
+
41
+ if account.get('account_name') == old_accountname
42
+ PrcLib.warning('%s` instead.', msg)
43
+ else
44
+ PrcLib.warning("%s -a '%s'` instead.", msg, old_accountname)
45
+ end
46
+ name = old_name
47
+ @account.set(:account_name, old_accountname)
48
+ else
49
+ name = on_or_name
50
+ end
51
+ name
52
+ end
53
+
54
+ def self.load_options(options, options_map)
55
+ options_map.each do |opt_key, ac_key|
56
+ unless options[opt_key].nil?
57
+ value = yield(opt_key, options[opt_key])
58
+ @account.set(ac_key, options[opt_key]) unless value.nil?
59
+ end
60
+ end
61
+ end
62
+
63
+ def self.validate_keypath(options)
64
+ if options[:key_path]
65
+ m_found = options[:key_path].match(/^(.*)(\.pub)?$/)
66
+ if m_found
67
+ key_path = File.expand_path(m_found[1])
68
+ if m_found[2] && !(File.exist?(
69
+ File.expand_path(m_found[1] + m_found[2])
70
+ ))
71
+ PrcLib.fatal(
72
+ 1,
73
+ "'%s' is not a valid keypair files." \
74
+ ' At least the public key (.pub) is have to exist.',
75
+ key_path
76
+ )
77
+ end
78
+ @account.set(:keypair_path, key_path)
79
+ else
80
+ PrcLib.fatal(
81
+ 1,
82
+ "'%s' is not a valid keypair files." \
83
+ 'At least the public key (.pub) is have to exist.',
84
+ key_path
85
+ )
86
+ end
87
+ end
88
+ end
89
+
90
+ def self.install_blueprint?(blueprint, name)
91
+ @account[:instance_name] = name
92
+
93
+ if blueprint == 'maestro'
94
+ PrcLib.info("Starting boot process of '%s'. No blueprint requested.",
95
+ @account[:instance_name])
96
+ else
97
+ @account[:blueprint] = blueprint
98
+ PrcLib.info("Starting boot process of '%s' with blueprint '%s'.",
99
+ @account[:instance_name], @account[:blueprint])
100
+ end
101
+ end
102
+
103
+ def self.boot(blueprint, on_or_name, deprecated_name, options)
104
+ @account = Lorj::Account.new(options[:config])
105
+
106
+ name = deprecated_name?(blueprint, on_or_name, deprecated_name[0],
107
+ deprecated_name[1], deprecated_name[2])
108
+
109
+ PrcLib.fatal(1, "instance name '%s' not supported. Support only lower" \
110
+ ' case, numeric and dash caracters.',
111
+ name) unless /^[\d[[:lower:]]-]+$/ =~ name
112
+
113
+ # Options are added if they are set.
114
+ # Otherwise, get will retrieve the default value.
115
+
116
+ @account[:account_name] = options[:account_name] if options[:account_name]
117
+
118
+ @account.ac_load @account[:account_name]
119
+
120
+ options_map = { :infra => :infra_repo, :key_name => :keypair_name,
121
+ :key_path => :keypair_path,
122
+ :security_group => :security_group,
123
+ :image_name => :image_name, :maestro_flavor => :flavor,
124
+ :bp_flavor => :bp_flavor, :maestro_repo => :maestro_repo,
125
+ :branch => :branch, :test_box => :test_box }
126
+
127
+ load_options(options, options_map) do |key, value|
128
+ case key
129
+ when :test_box
130
+ path = File.expand_path(value)
131
+ return path if File.directory?(path)
132
+ return nil
133
+ end
134
+ value
135
+ end
136
+
137
+ PrcLib.warning(
138
+ 'test_box is currently disabled in this version.' \
139
+ 'It will be re-activated in newer version.'
140
+ ) if options[:test_box]
141
+
142
+ validate_keypath(options)
143
+
144
+ # o_cloud = get_o_cloud(o_forj_account)
145
+ o_cloud = Forj::CloudConnection.connect(@account)
146
+
147
+ install_blueprint?(blueprint, name)
148
+ PrcLib.high_level_msg("Preparing your forge '%s'.Please be patient. "\
149
+ "more output in '%s'\n",
150
+ @account[:instance_name],
151
+ PrcLib.log_file)
152
+
153
+ o_cloud.create(:forge)
154
+ end
155
+ end
156
+ end
@@ -0,0 +1,42 @@
1
+ #!/usr/bin/env ruby
2
+ # encoding: UTF-8
3
+
4
+ # (c) Copyright 2014 Hewlett-Packard Development Company, L.P.
5
+ #
6
+ # Licensed under the Apache License, Version 2.0 (the "License");
7
+ # you may not use this file except in compliance with the License.
8
+ # You may obtain a copy of the License at
9
+ #
10
+ # http://www.apache.org/licenses/LICENSE-2.0
11
+ #
12
+ # Unless required by applicable law or agreed to in writing, software
13
+ # distributed under the License is distributed on an "AS IS" BASIS,
14
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
+ # See the License for the specific language governing permissions and
16
+ # limitations under the License.
17
+
18
+ module Forj
19
+ # Provide cloud object
20
+ module CloudConnection
21
+ def self.connect(account)
22
+ a_processes = []
23
+
24
+ # Defines how to manage Maestro and forges
25
+ # create a maestro box. Identify a forge instance, delete it,...
26
+ a_processes << File.join(LIB_PATH, 'forj', 'ForjCore.rb')
27
+
28
+ # Defines how cli will control FORJ features
29
+ # boot/down/ssh/...
30
+ a_processes << File.join(LIB_PATH, 'forj', 'ForjCli.rb')
31
+
32
+ # Loading CloudCore embedding provider controller + its process.
33
+ o_cloud = Lorj::CloudCore.new(
34
+ account,
35
+ account[:account_name],
36
+ a_processes
37
+ )
38
+
39
+ o_cloud
40
+ end
41
+ end
42
+ end
data/lib/cloud_test.rb CHANGED
@@ -1,121 +1,139 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
- #require 'byebug'
3
+ # require 'byebug'
4
4
 
5
- $APP_PATH = File.dirname(__FILE__)
6
- $LIB_PATH = File.expand_path(File.join(File.dirname($APP_PATH),'lib'))
5
+ APP_PATH = File.dirname(__FILE__)
6
+ LIB_PATH = File.expand_path(File.join(File.dirname(APP_PATH), 'lib'))
7
7
 
8
- $LOAD_PATH << $LIB_PATH
8
+ LOAD_PATH << LIB_PATH
9
9
 
10
- $LOAD_PATH << File.join($LIB_PATH, 'lib-forj', 'lib')
10
+ LOAD_PATH << File.join(LIB_PATH, 'lib-forj', 'lib')
11
11
 
12
12
  require 'appinit.rb'
13
13
 
14
14
  # Initialize forj paths
15
- AppInit::forj_initialize()
15
+ AppInit.forj_initialize
16
16
 
17
17
  # Initialize global Log object
18
- $FORJ_LOGGER=ForjLog.new()
18
+ FORJ_LOGGER = ForjLog.new
19
19
 
20
20
  require 'lib-forj.rb'
21
21
 
22
22
  Logging.set_level(Logger::DEBUG)
23
23
 
24
24
  # Load global Config
25
- oConfig = ForjConfig.new()
25
+ o_config = ForjConfig.new
26
26
 
27
- aProcesses = []
27
+ a_processes = []
28
28
 
29
29
  # Defines how to manage Maestro and forges
30
30
  # create a maestro box. Identify a forge instance, delete it,...
31
- aProcesses << File.join($LIB_PATH, 'forj', 'ForjCore.rb')
31
+ a_processes << File.join(LIB_PATH, 'forj', 'ForjCore.rb')
32
32
 
33
33
  # Defines how cli will control FORJ features
34
34
  # boot/down/ssh/...
35
- aProcesses << File.join($LIB_PATH, 'forj', 'ForjCli.rb')
35
+ a_processes << File.join(LIB_PATH, 'forj', 'ForjCli.rb')
36
36
 
37
- $LIB_FORJ_DEBUG = 3 # verbose
37
+ # PrcLib.core_level = 3 # verbose
38
38
 
39
- infra_dir = File.expand_path(oConfig.get(:infra_repo))
39
+ infra_dir = File.expand_path(o_config.get(:infra_repo))
40
40
 
41
41
  # Ask information if needed.
42
- if not Dir.exist?(File.expand_path(infra_dir))
43
- Logging.warning(<<-END
42
+ unless Dir.exist?(File.expand_path(infra_dir))
43
+ Logging.warning(<<-END
44
44
  Your infra workspace directory is missing.
45
45
 
46
- Forj uses an infra workspace directory to store any kind of data that are private to you.
47
- We provides ways to send those data securily to your new Forge instance, as metadata.
48
- In production case, we suggest you to keep it safe in your SCM preferred database.
46
+ Forj uses an infra workspace directory to store any kind of data that are
47
+ private to you.
48
+ We provides ways to send those data securily to your new Forge instance,
49
+ as metadata.
50
+ In production case, we suggest you to keep it safe in your SCM preferred
51
+ database.
49
52
 
50
- If you already have an existing infra workspace, use 'forj set infra_repo=<PathToYourRepo>' to set it and restart.
53
+ If you already have an existing infra workspace,
54
+ use 'forj set infra_repo=<PathToYourRepo>' to set it and restart.
51
55
 
52
- Otherwise, we will build a new one with some predefined data, you can review and update later.
56
+ Otherwise, we will build a new one with some predefined data,
57
+ you can review and update later.
53
58
  END
54
- )
55
- sAsk = "Do you want to create a new one from Maestro (yes/no)?" % [infra_dir]
56
- bBuildInfra=agree(sAsk)
57
- if not bBuildInfra
58
- puts 'Process aborted on your demand.'
59
- exit 0
60
- end
59
+ )
60
+ s_ask = format(
61
+ 'Do you want to create a new one from Maestro (yes/no)?',
62
+ infra_dir
63
+ )
64
+ b_build_infra = agree(s_ask)
65
+ unless b_build_infra
66
+ puts 'Process aborted on your demand.'
67
+ exit 0
68
+ end
61
69
  end
62
70
 
63
- oCloud = ForjCloud.new(oConfig, 'hpcloud', aProcesses)
64
-
65
- #oConfig.set(:instance_name, "test")
66
- #oCloud.Create(:metadata)
67
- #oCloud.Create(:infra_repository)
68
- #oCloud.Create(:userdata)
71
+ o_cloud = ForjCloud.new(o_config, 'hpcloud', a_processes)
69
72
 
73
+ # o_config.set(:instance_name, "test")
74
+ # o_cloud.Create(:metadata)
75
+ # o_cloud.Create(:infra_repository)
76
+ # o_cloud.Create(:userdata)
70
77
 
71
- #oCloud.Setup(:server, 'hpcloud')
72
- #oCloud.Setup(:forge, 'hpcloud')
78
+ # o_cloud.Setup(:server, 'hpcloud')
79
+ # o_cloud.Setup(:forge, 'hpcloud')
73
80
 
74
- #oCloud.Create(:forge)
81
+ # o_cloud.Create(:forge)
75
82
 
76
- #oConfig.set(:instance_name, 'servertestluis')
77
- #oCloud.Create(:forge)
83
+ # o_config.set(:instance_name, 'servertestluis')
84
+ # o_cloud.Create(:forge)
78
85
 
79
- oForge = oCloud.Get(:forge, "luistest")
86
+ o_forge = o_cloud.Get(:forge, 'luistest')
80
87
 
81
- #Ask the user to get server(s) to destroy
88
+ # Ask the user to get server(s) to destroy
82
89
  server_id_length = 0
83
90
  server_name_length = 0
84
91
 
85
- oForge[:server].each{ |server|
86
- if server[:id].length() > server_id_length
87
- server_id_length = server[:id].length()
92
+ o_forge[:server].each do |server|
93
+ if server[:id].length > server_id_length
94
+ server_id_length = server[:id].length
88
95
  end
89
96
 
90
- if server[:name].length() > server_name_length
91
- server_name_length = server[:name].length()
97
+ if server[:name].length > server_name_length
98
+ server_name_length = server[:name].length
92
99
  end
93
- }
100
+ end
94
101
 
95
102
  server_index = 1
96
- #Display headers
97
- puts "|%s |%s |%s |" % ["Index ".ljust(6), "Name".ljust(server_name_length), "ID".ljust(server_id_length) ]
98
- #puts "|%s |%s |%s |" % ["0", "all".ljust(server_name_length), " ".ljust(server_id_length) ]
99
- #Display Forge servers detail
100
- oForge[:server].each{ |server|
101
- puts "|%s |%s |%s |" % [server_index.to_s().ljust(6), server[:name].to_s().ljust(server_name_length), server[:id].to_s().ljust(server_id_length) ]
102
- server_index = server_index + 1
103
- }
104
-
105
- oHighLine = HighLine.new()
106
-
107
- index = oHighLine.ask("Select the index of the server to create the ssh connection", Integer)do |q|
108
- q.below=oForge[:server].count + 1
109
- q.above=0
103
+ # Display headers
104
+ puts format(
105
+ '|%s |%s |%s |',
106
+ 'Index '.ljust(6),
107
+ 'Name'.ljust(server_name_length),
108
+ 'ID'.ljust(server_id_length)
109
+ )
110
+ # Display Forge servers detail
111
+ o_forge[:server].each do |server|
112
+ puts format(
113
+ '|%s |%s |%s |',
114
+ server_index.to_s.ljust(6),
115
+ server[:name].to_s.ljust(server_name_length),
116
+ server[:id].to_s.ljust(server_id_length)
117
+ )
118
+ server_index += 1
110
119
  end
111
120
 
121
+ o_high_line = HighLine.new
122
+
123
+ index = o_high_line.ask(
124
+ 'Select the index of the server to create the ssh connection',
125
+ Integer
126
+ ) do |q|
127
+ q.below = o_forge[:server].count + 1
128
+ q.above = 0
129
+ end
112
130
 
113
- oConfig.set(:instance_name, 'luistest')
114
- oConfig.set(:forge_server, oForge[:server][index - 1][:id])
115
- oConfig.set(:server_name, oForge[:server][index - 1][:name])
116
- #oConfig.set(:box, 'maestro')
117
- #oConfig.set(:instance_name, 'luistest')
118
- #oConfig.Create(:server)
119
- oCloud.Create(:ssh)
131
+ o_config.set(:instance_name, 'luistest')
132
+ o_config.set(:forge_server, o_forge[:server][index - 1][:id])
133
+ o_config.set(:server_name, o_forge[:server][index - 1][:name])
134
+ # o_config.set(:box, 'maestro')
135
+ # o_config.set(:instance_name, 'luistest')
136
+ # o_config.Create(:server)
137
+ o_cloud.Create(:ssh)
120
138
 
121
- #oCloud.Query(:server, 'maestro')
139
+ # o_cloud.Query(:server, 'maestro')