kpm 0.5.3 → 0.6.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 9d42c3f647760630bf77cd1b747651801726d523
4
- data.tar.gz: b8bb3427daf343b4b58da5381241bfddda7c038f
3
+ metadata.gz: 1a60374d9426b71862a9dc7deba1f6b196af27ea
4
+ data.tar.gz: 3e72b27242ce530e18eea45961f361ec70e73b0f
5
5
  SHA512:
6
- metadata.gz: 321702e297c7ef18cb523e474e59ba12780d289b336cc541f58964e95fd72b5cb841b66826528b4cbac424cb7c858f307377e4c71fd7ac3d663b4947b7d71417
7
- data.tar.gz: 6c60dceeba121d962c8d71e953ece53f427638be7531f9351174cba8e3824008cf7aedae34eacf0c044c49f1e118ce33071f6696c1151c8382564b69e2c2ddbb
6
+ metadata.gz: 07dd7d2ad53197d3cca095c6c7a4cdc92e14bd7182d0da960611f43b229539b06723a46534b14fd660d8ef1cb9a476a9c4f24c4f54c1a9241bfca29d64d43e9b
7
+ data.tar.gz: 9223ffad42ddadc56feb517b085ff9f1454bf57c12e56e2dd2bc4f43cb64ebc9ebb835f30f37f2ca5c9f950e961c09d0fc0cb199970b5ecd245517ec86083097
data/kpm.gemspec CHANGED
@@ -40,7 +40,6 @@ Gem::Specification.new do |s|
40
40
  s.rdoc_options << '--exclude' << '.'
41
41
 
42
42
  s.add_dependency 'highline', '~> 1.6.21'
43
- s.add_dependency 'nexus_cli', '~> 4.1.0'
44
43
  s.add_dependency 'thor', '~> 0.19.1'
45
44
  s.add_dependency 'rubyzip', '~>1.2.0'
46
45
  s.add_dependency 'killbill-client', '~> 1.0'
data/lib/kpm.rb CHANGED
@@ -20,7 +20,10 @@ module KPM
20
20
  autoload :System, 'kpm/system'
21
21
  autoload :Account, 'kpm/account'
22
22
  autoload :Database, 'kpm/database'
23
- autoload :TenantConfig, 'kpm/tenant_config.rb'
23
+ autoload :TenantConfig, 'kpm/tenant_config'
24
+ autoload :DiagnosticFile, 'kpm/diagnostic_file'
25
+ autoload :NexusFacade, 'kpm/nexus_helper/nexus_facade'
26
+ autoload :TraceLogger, 'kpm/trace_logger'
24
27
 
25
28
  class << self
26
29
  def root
@@ -1,5 +1,4 @@
1
1
  require 'digest/sha1'
2
- require 'nexus_cli'
3
2
  require 'rexml/document'
4
3
 
5
4
  module KPM
@@ -44,8 +43,8 @@ module KPM
44
43
  pull_from_fs_and_put_in_place(logger, file_path, destination_path)
45
44
  end
46
45
 
47
- def nexus_remote(overrides={}, ssl_verify=true)
48
- nexus_remote ||= NexusCli::RemoteFactory.create(nexus_defaults.merge(overrides || {}), ssl_verify)
46
+ def nexus_remote(overrides={}, ssl_verify=true, logger=nil)
47
+ nexus_remote ||= KPM::NexusFacade::RemoteFactory.create(nexus_defaults.merge(overrides || {}), ssl_verify, logger)
49
48
  end
50
49
 
51
50
  def nexus_defaults
@@ -102,6 +101,7 @@ module KPM
102
101
  logger.info " Starting download of #{coordinates} to #{tmp_destination_dir}"
103
102
 
104
103
  downloaded_artifact_info = pull_and_verify(logger, artifact_info[:sha1], coordinates, tmp_destination_dir, sha1_file, verify_sha1, overrides, ssl_verify)
104
+ remove_old_default_bundles(coordinate_map,artifact_info,downloaded_artifact_info)
105
105
  if artifact_info[:is_tgz]
106
106
  artifact_info[:bundle_dir] = Utils.unpack_tgz(downloaded_artifact_info[:file_path], artifact_info[:dir_name], skip_top_dir)
107
107
  FileUtils.rm downloaded_artifact_info[:file_path]
@@ -172,10 +172,10 @@ module KPM
172
172
 
173
173
  coordinates = KPM::Coordinates.build_coordinates(coordinate_map)
174
174
  begin
175
- nexus_info = nexus_remote(overrides, ssl_verify).get_artifact_info(coordinates)
176
- rescue NexusCli::ArtifactMalformedException => e
177
- raise NexusCli::NexusCliError.new("Invalid coordinates #{coordinate_map}")
178
- rescue NexusCli::NexusCliError => e
175
+ nexus_info = nexus_remote(overrides, ssl_verify, logger).get_artifact_info(coordinates)
176
+ rescue KPM::NexusFacade::ArtifactMalformedException => e
177
+ raise StandardError.new("Invalid coordinates #{coordinate_map}")
178
+ rescue StandardError => e
179
179
  logger.warn("Unable to retrieve coordinates #{coordinate_map}")
180
180
  raise e
181
181
  end
@@ -219,7 +219,7 @@ module KPM
219
219
  end
220
220
 
221
221
  def pull_and_verify(logger, remote_sha1, coordinates, destination_dir, sha1_file, verify_sha1, overrides={}, ssl_verify=true)
222
- info = nexus_remote(overrides, ssl_verify).pull_artifact(coordinates, destination_dir)
222
+ info = nexus_remote(overrides, ssl_verify, logger).pull_artifact(coordinates, destination_dir)
223
223
 
224
224
  # Always verify sha1 and if incorrect either throw or log when we are asked to bypass sha1 verification
225
225
  verified = verify(logger, coordinates, info[:file_path], remote_sha1)
@@ -274,6 +274,22 @@ module KPM
274
274
  # Probably a directory
275
275
  true
276
276
  end
277
+
278
+ def remove_old_default_bundles(coordinate_map, artifact_info, downloaded_artifact_info)
279
+ return unless coordinate_map[:artifact_id] == 'killbill-platform-osgi-bundles-defaultbundles'
280
+
281
+ downloaded_default_bundles = Utils.peek_tgz_file_names(downloaded_artifact_info[:file_path])
282
+ existing_default_bundles = Dir.glob("#{artifact_info[:dir_name]}/*")
283
+
284
+ existing_default_bundles.each do |bundle|
285
+ bundle_name = Utils.get_plugin_name_from_file_path(bundle)
286
+ is_downloaded = downloaded_default_bundles.index {|file_name| file_name.include? bundle_name}
287
+ unless is_downloaded.nil?
288
+ FileUtils.remove(bundle)
289
+ end
290
+ end
291
+
292
+ end
277
293
  end
278
294
  end
279
295
  end
@@ -12,6 +12,7 @@ module KPM
12
12
  @logger = logger
13
13
  @nexus_config = nexus_config
14
14
  @nexus_ssl_verify = nexus_ssl_verify
15
+ @trace_logger = KPM::TraceLogger.new
15
16
  end
16
17
 
17
18
  def install_killbill_server(specified_group_id=nil, specified_artifact_id=nil, specified_packaging=nil, specified_classifier=nil, specified_version=nil, specified_webapp_path=nil, bundles_dir=nil, force_download=false, verify_sha1=true)
@@ -24,8 +25,13 @@ module KPM
24
25
  bundles_dir = Pathname.new(bundles_dir || DEFAULT_BUNDLES_DIR).expand_path
25
26
  sha1_file = "#{bundles_dir}/#{SHA1_FILENAME}"
26
27
 
28
+ if version == LATEST_VERSION
29
+ latest_stable_version = KPM::Installer.get_kb_latest_stable_version
30
+ version = latest_stable_version unless latest_stable_version.nil?
31
+ end
32
+
27
33
  @logger.debug("Installing Kill Bill server: group_id=#{group_id} artifact_id=#{artifact_id} packaging=#{packaging} classifier=#{classifier} version=#{version} webapp_path=#{webapp_path}")
28
- KPM::KillbillServerArtifact.pull(@logger,
34
+ artifact_info = KPM::KillbillServerArtifact.pull(@logger,
29
35
  group_id,
30
36
  artifact_id,
31
37
  packaging,
@@ -37,6 +43,10 @@ module KPM
37
43
  verify_sha1,
38
44
  @nexus_config,
39
45
  @nexus_ssl_verify)
46
+ # store trace info to be returned as JSON by the KPM::Installer.install method
47
+ @trace_logger.add('killbill',
48
+ artifact_info.merge({'status'=> (artifact_info[:skipped] ? 'UP_TO_DATE': 'INSTALLED'),
49
+ :group_id => group_id, :artifact_id => artifact_id, :packaging => packaging, :classifier => classifier}))
40
50
  end
41
51
 
42
52
  def install_kaui(specified_group_id=nil, specified_artifact_id=nil, specified_packaging=nil, specified_classifier=nil, specified_version=nil, specified_webapp_path=nil, bundles_dir=nil, force_download=false, verify_sha1=true)
@@ -50,7 +60,7 @@ module KPM
50
60
  sha1_file = "#{bundles_dir}/#{SHA1_FILENAME}"
51
61
 
52
62
  @logger.debug("Installing Kaui: group_id=#{group_id} artifact_id=#{artifact_id} packaging=#{packaging} classifier=#{classifier} version=#{version} webapp_path=#{webapp_path}")
53
- KPM::KauiArtifact.pull(@logger,
63
+ artifact_info = KPM::KauiArtifact.pull(@logger,
54
64
  group_id,
55
65
  artifact_id,
56
66
  packaging,
@@ -62,6 +72,12 @@ module KPM
62
72
  verify_sha1,
63
73
  @nexus_config,
64
74
  @nexus_ssl_verify)
75
+ # store trace info to be returned as JSON by the KPM::Installer.install method
76
+ @trace_logger.add('kaui',
77
+ artifact_info.merge({'status'=> (artifact_info[:skipped] ? 'UP_TO_DATE': 'INSTALLED'),
78
+ :group_id => group_id, :artifact_id => artifact_id, :packaging => packaging, :classifier => classifier}))
79
+
80
+
65
81
  end
66
82
 
67
83
  def install_plugin(plugin_key, raw_kb_version=nil, specified_group_id=nil, specified_artifact_id=nil, specified_packaging=nil, specified_classifier=nil, specified_version=nil, bundles_dir=nil, specified_type=nil, force_download=false, verify_sha1=true, verify_jruby_jar=false)
@@ -138,6 +154,10 @@ module KPM
138
154
  verify_sha1,
139
155
  @nexus_config,
140
156
  @nexus_ssl_verify)
157
+ # store trace info to be returned as JSON by the KPM::Installer.install method
158
+ @trace_logger.add('plugins', plugin_key,
159
+ artifact_info.merge({'status'=> (artifact_info[:skipped] ? 'UP_TO_DATE': 'INSTALLED'),
160
+ :group_id => group_id, :artifact_id => artifact_id, :packaging => packaging, :classifier => classifier}))
141
161
 
142
162
  # Update with resolved version
143
163
  coordinate_map[:version] = artifact_info[:version]
@@ -154,8 +174,12 @@ module KPM
154
174
  bundles_dir = Pathname.new(bundles_dir || DEFAULT_BUNDLES_DIR).expand_path
155
175
  plugins_dir = bundles_dir.join('plugins')
156
176
 
177
+ if version.nil?
178
+ version = Utils.get_version_from_file_path(file_path)
179
+ end
180
+
157
181
  if type.to_s == 'java'
158
- plugin_name = name.nil? ? Pathname.new(file_path).basename.to_s.split('-')[0] : name
182
+ plugin_name = name.nil? ? Utils.get_plugin_name_from_file_path(file_path) : name
159
183
  destination = plugins_dir.join('java').join(plugin_name).join(version)
160
184
  else
161
185
  destination = plugins_dir.join('ruby')
@@ -168,6 +192,10 @@ module KPM
168
192
 
169
193
  update_plugin_identifier(plugins_dir, plugin_key, type.to_s, nil, artifact_info)
170
194
 
195
+ # store trace info to be returned as JSON by the KPM::Installer.install method
196
+ @trace_logger.add('plugins', plugin_key,
197
+ artifact_info.merge({'status'=>'INSTALLED'}))
198
+
171
199
  artifact_info
172
200
  end
173
201
 
@@ -218,6 +246,10 @@ module KPM
218
246
  @nexus_config,
219
247
  @nexus_ssl_verify)
220
248
 
249
+ @trace_logger.add('default_bundles',
250
+ info.merge({'status'=> (info[:skipped] ? 'UP_TO_DATE': 'INSTALLED'),
251
+ :group_id => group_id, :artifact_id => artifact_id, :packaging => packaging, :classifier => classifier}))
252
+
221
253
  # The special JRuby bundle needs to be called jruby.jar
222
254
  # TODO .first - code smell
223
255
  unless info[:skipped]
@@ -0,0 +1,187 @@
1
+ require 'yaml'
2
+ require 'tmpdir'
3
+ require 'zip'
4
+ require 'json'
5
+ require 'fileutils'
6
+ require 'date'
7
+
8
+
9
+ module KPM
10
+
11
+ class DiagnosticFile
12
+
13
+ # Temporary directory
14
+ TMP_DIR_PREFIX = 'killbill-diagnostics-'
15
+ TMP_DIR = Dir.mktmpdir(TMP_DIR_PREFIX)
16
+ TMP_LOGS_DIR = TMP_DIR + File::Separator + 'logs'
17
+
18
+ TENANT_FILE = 'tenant_config.data'
19
+ SYSTEM_FILE = 'system_configuration.data'
20
+ ACCOUNT_FILE = 'account.data'
21
+
22
+ TODAY_DATE = Date.today.strftime('%m-%d-%y')
23
+ ZIP_FILE = 'killbill-diagnostics-' + TODAY_DATE + '.zip'
24
+ ZIP_LOG_FILE = 'logs.zip'
25
+
26
+ def initialize(config_file = nil, killbill_api_credentials = nil, killbill_credentials = nil, killbill_url = nil,
27
+ database_name = nil, database_credentials = nil, database_host = nil, kaui_web_path = nil,
28
+ killbill_web_path = nil, logger = nil)
29
+ @killbill_api_credentials = killbill_api_credentials
30
+ @killbill_credentials = killbill_credentials
31
+ @killbill_url = killbill_url
32
+ @database_name = database_name
33
+ @database_credentials = database_credentials
34
+ @database_host = database_host
35
+ @config_file = config_file
36
+ @kaui_web_path = kaui_web_path;
37
+ @killbill_web_path = killbill_web_path;
38
+ @logger = logger
39
+ @original_logger_level = logger.level;
40
+ @catalina_base = nil
41
+ end
42
+
43
+ def export_data(account_id = nil, log_dir = nil)
44
+ set_config(@config_file)
45
+
46
+ tenant_export_file = get_tenant_config
47
+ system_export_file = get_system_config
48
+ account_export_file = get_account_data(account_id) unless account_id.nil?
49
+ log_files = get_log_files(log_dir)
50
+
51
+ if File.exist?(system_export_file) && File.exist?(tenant_export_file)
52
+
53
+
54
+ zip_file_name = TMP_DIR + File::Separator + ZIP_FILE
55
+
56
+ Zip::File.open(zip_file_name, Zip::File::CREATE) do |zipFile|
57
+
58
+ zipFile.add(TENANT_FILE, tenant_export_file)
59
+ zipFile.add(SYSTEM_FILE, system_export_file)
60
+ zipFile.add(ACCOUNT_FILE, account_export_file) unless account_id.nil?
61
+ zipFile.add(ZIP_LOG_FILE, log_files)
62
+
63
+ end
64
+
65
+ @logger.info "\e[32mDiagnostic data exported under #{zip_file_name} \e[0m"
66
+
67
+ else
68
+ raise Interrupt, 'Account id or configuration file not found'
69
+ end
70
+
71
+ end
72
+
73
+ # Private methods
74
+
75
+ private
76
+
77
+ def get_tenant_config
78
+
79
+ @logger.info 'Retrieving tenant configuration'
80
+ # this suppress the message of where it put the account file, this is to avoid confusion
81
+ @logger.level = Logger::WARN
82
+
83
+ @killbill_api_credentials ||= [get_config('killbill', 'api_key'), get_config('killbill','api_secret')] unless @config_file.nil?
84
+ @killbill_credentials ||= [get_config('killbill', 'user'), get_config('killbill','password')] unless @config_file.nil?
85
+ @killbill_url ||= 'http://' + get_config('killbill', 'host').to_s + ':' + get_config('killbill','port').to_s unless @config_file.nil?
86
+
87
+ tenant_config = KPM::TenantConfig.new(@killbill_api_credentials,
88
+ @killbill_credentials, @killbill_url, @logger)
89
+ export_file = tenant_config.export
90
+
91
+ final = TMP_DIR + File::Separator + TENANT_FILE
92
+ FileUtils.move(export_file, final)
93
+ @logger.level = @original_logger_level
94
+
95
+ final
96
+ end
97
+
98
+ def get_system_config
99
+
100
+ @logger.info 'Retrieving system configuration'
101
+ system = KPM::System.new
102
+ export_data = system.information(nil, true, @config_file, @kaui_web_path, @killbill_web_path)
103
+
104
+ get_system_catalina_base(export_data)
105
+
106
+ export_file = TMP_DIR + File::SEPARATOR + SYSTEM_FILE
107
+ File.open(export_file, 'w') { |io| io.puts export_data }
108
+ export_file
109
+ end
110
+
111
+
112
+ def get_account_data(account_id)
113
+
114
+ @logger.info 'Retrieving account data for id: ' + account_id
115
+ # this suppress the message of where it put the account file, this is to avoid confusion
116
+ @logger.level = Logger::WARN
117
+
118
+ account = KPM::Account.new(@config_file, @killbill_api_credentials, @killbill_credentials,
119
+ @killbill_url, @database_name,
120
+ @database_credentials,@database_host,nil, @logger)
121
+ export_file = account.export_data(account_id)
122
+
123
+ final = TMP_DIR + File::Separator + ACCOUNT_FILE
124
+ FileUtils.move(export_file, final)
125
+ @logger.level = @original_logger_level
126
+ final
127
+ end
128
+
129
+ def get_log_files(log_dir)
130
+
131
+ @logger.info 'Collecting log files'
132
+ log_base = log_dir || (@catalina_base + File::Separator + 'logs')
133
+ log_items = Dir.glob(log_base + File::Separator + '*')
134
+
135
+ zip_file_name = TMP_DIR + File::Separator + ZIP_LOG_FILE
136
+
137
+ Zip::File.open(zip_file_name, Zip::File::CREATE) do |zipFile|
138
+
139
+ log_items.each do |file|
140
+ name = file.split('/').last
141
+ zipFile.add(name, file)
142
+ end
143
+
144
+ end
145
+
146
+ zip_file_name
147
+ end
148
+
149
+ # Helpers
150
+
151
+ def get_system_catalina_base(export_data)
152
+ system_json = JSON.parse(export_data)
153
+ @catalina_base = system_json['java_system_information']['catalina.base']['value']
154
+
155
+ end
156
+
157
+ # Utils
158
+
159
+ def get_config(parent, child)
160
+ item = nil;
161
+
162
+ if not @config.nil?
163
+
164
+ config_parent = @config[parent]
165
+
166
+ if not config_parent.nil?
167
+ item =config_parent[child]
168
+ end
169
+
170
+ end
171
+
172
+ item
173
+ end
174
+
175
+ def set_config(config_file = nil)
176
+ @config = nil
177
+
178
+ if not config_file.nil?
179
+ if not Dir[config_file][0].nil?
180
+ @config = YAML::load_file(config_file)
181
+ end
182
+ end
183
+
184
+ end
185
+
186
+ end
187
+ end
data/lib/kpm/installer.rb CHANGED
@@ -16,6 +16,13 @@ module KPM
16
16
  end
17
17
 
18
18
  def self.build_default_config(all_kb_versions=nil)
19
+ latest_stable_version = get_kb_latest_stable_version(all_kb_versions)
20
+
21
+ # Note: we assume no unstable version of Kaui is published today
22
+ {'killbill' => {'version' => latest_stable_version.to_s, 'plugins' => {'ruby' => [{'name' => 'kpm'}]}}, 'kaui' => {'version' => 'LATEST'}}
23
+ end
24
+
25
+ def self.get_kb_latest_stable_version(all_kb_versions=nil)
19
26
  all_kb_versions ||= KillbillServerArtifact.versions(KillbillServerArtifact::KILLBILL_ARTIFACT_ID,
20
27
  KillbillServerArtifact::KILLBILL_PACKAGING,
21
28
  KillbillServerArtifact::KILLBILL_CLASSIFIER,
@@ -32,8 +39,7 @@ module KPM
32
39
  latest_stable_version = version if version > latest_stable_version
33
40
  end
34
41
 
35
- # Note: we assume no unstable version of Kaui is published today
36
- {'killbill' => {'version' => latest_stable_version.to_s, 'plugins' => {'ruby' => [{'name' => 'kpm'}]}}, 'kaui' => {'version' => 'LATEST'}}
42
+ latest_stable_version
37
43
  end
38
44
 
39
45
  def initialize(raw_config, logger=nil)
@@ -75,7 +81,8 @@ module KPM
75
81
  install_kaui(@kaui_config['group_id'], @kaui_config['artifact_id'], @kaui_config['packaging'], @kaui_config['classifier'], @kaui_config['version'], @kaui_config['webapp_path'], bundles_dir, force_download, verify_sha1)
76
82
  end
77
83
 
78
- help
84
+ @trace_logger.add('help',help)
85
+ @trace_logger.to_json
79
86
  end
80
87
 
81
88
  private
@@ -11,7 +11,7 @@ module KPM
11
11
  coordinates = KPM::Coordinates.build_coordinates(coordinate_map)
12
12
  response = REXML::Document.new nexus_remote(overrides, ssl_verify).search_for_artifacts(coordinates)
13
13
  versions = SortedSet.new
14
- response.elements.each('search-results/data/artifact/version') { |element| versions << element.text }
14
+ response.elements.each('searchNGResponse/data/artifact/version') { |element| versions << element.text }
15
15
  versions
16
16
  end
17
17
  end
@@ -16,7 +16,7 @@ module KPM
16
16
 
17
17
  [[:java, KPM::BaseArtifact::KILLBILL_JAVA_PLUGIN_GROUP_ID], [:ruby, KPM::BaseArtifact::KILLBILL_RUBY_PLUGIN_GROUP_ID]].each do |type_and_group_id|
18
18
  response = REXML::Document.new nexus.search_for_artifacts(type_and_group_id[1])
19
- response.elements.each('search-results/data/artifact') do |element|
19
+ response.elements.each('searchNGResponse/data/artifact') do |element|
20
20
  artifact_id = element.elements['artifactId'].text
21
21
  plugins[type_and_group_id[0]][artifact_id] ||= SortedSet.new
22
22
  plugins[type_and_group_id[0]][artifact_id] << element.elements['version'].text
@@ -9,7 +9,7 @@ module KPM
9
9
  coordinates = KPM::Coordinates.build_coordinates(coordinate_map)
10
10
  response = REXML::Document.new nexus_remote(overrides, ssl_verify).search_for_artifacts(coordinates)
11
11
  versions = SortedSet.new
12
- response.elements.each('search-results/data/artifact/version') { |element| versions << element.text }
12
+ response.elements.each('searchNGResponse/data/artifact/version') { |element| versions << element.text }
13
13
  versions
14
14
  end
15
15