vmpooler 1.0.0 → 1.2.0

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 277212a5ca26187ed46a4e6d0ef0716511a3b63097deab1485908c95bb437c5e
4
- data.tar.gz: 36272bc0744f943d88ca3eb0a33a070268f2a0fa45e130a7ee8abb04d4d0243e
3
+ metadata.gz: da4a010ab09d34f4fbfa9993526ad18dec205dfbc72f427a250304b2147bdf31
4
+ data.tar.gz: 61193bec61a1385754487f107e601c1fc76959ae81fc27a47d4f11a881553e91
5
5
  SHA512:
6
- metadata.gz: 8bb11603444163deb47713be137b1da3234096c60c59cbedda58b35d5dafeef80a2f6f733ccd1c1d0eb4db39959f189183937a712139346ccd673a8d1ea7f8d0
7
- data.tar.gz: 4502d6509ac75fc693ca24c9defdb401fc00aff14f3cba2d39143786efe3b0aef6eed0bc3ab6a1adb9cdd925684aa39f8e84c999dbbdd88d121efc052ba6fd84
6
+ metadata.gz: 13399e493bcaaf5c18541c2125366bb88325936746b715550c6e438d31de77eed9b0f42d9e6140c7529eb0dbd27e4335529f368e6b190c1d047f0cd2710f801e
7
+ data.tar.gz: 0f8551abcbb4cfbaf7bbf60d52f6630ce8334fff620ef1e05bad35e53fb7448c69da074494f8df5efa97053ad6b1e3dd2e55c942e97b359156b0ec07b26de912
@@ -56,14 +56,11 @@ module Vmpooler
56
56
  return false
57
57
  end
58
58
 
59
- def authenticate_ldap(port, host, user_object, base, username_str, password_str)
59
+ def authenticate_ldap(port, host, encryption_hash, user_object, base, username_str, password_str)
60
60
  ldap = Net::LDAP.new(
61
61
  :host => host,
62
62
  :port => port,
63
- :encryption => {
64
- :method => :start_tls,
65
- :tls_options => { :ssl_version => 'TLSv1' }
66
- },
63
+ :encryption => encryption_hash,
67
64
  :base => base,
68
65
  :auth => {
69
66
  :method => :simple,
@@ -86,6 +83,10 @@ module Vmpooler
86
83
  ldap_port = auth[:ldap]['port'] || 389
87
84
  ldap_user_obj = auth[:ldap]['user_object']
88
85
  ldap_host = auth[:ldap]['host']
86
+ ldap_encryption_hash = auth[:ldap]['encryption'] || {
87
+ :method => :start_tls,
88
+ :tls_options => { :ssl_version => 'TLSv1' }
89
+ }
89
90
 
90
91
  unless ldap_base.is_a? Array
91
92
  ldap_base = ldap_base.split
@@ -100,6 +101,7 @@ module Vmpooler
100
101
  result = authenticate_ldap(
101
102
  ldap_port,
102
103
  ldap_host,
104
+ ldap_encryption_hash,
103
105
  search_user_obj,
104
106
  search_base,
105
107
  username_str,
@@ -210,6 +210,7 @@ module Vmpooler
210
210
  account_for_starting_vm(vmpool, vmname)
211
211
  vms << [vmpool, vmname, vmtemplate]
212
212
  metrics.increment("checkout.success.#{vmpool}")
213
+ update_user_metrics('allocate', vmname) if Vmpooler::API.settings.config[:config]['usage_stats']
213
214
  else
214
215
  failed = true
215
216
  metrics.increment("checkout.empty.#{requested}")
@@ -235,6 +236,59 @@ module Vmpooler
235
236
  result
236
237
  end
237
238
 
239
+ def component_to_test(match, labels_string)
240
+ return if labels_string.nil?
241
+
242
+ labels_string_parts = labels_string.split(',')
243
+ labels_string_parts.each do |part|
244
+ key, value = part.split('=')
245
+ next if value.nil?
246
+ return value if key == match
247
+ end
248
+ 'none'
249
+ end
250
+
251
+ def update_user_metrics(operation, vmname)
252
+ backend.multi
253
+ backend.hget("vmpooler__vm__#{vmname}", 'tag:jenkins_build_url')
254
+ backend.hget("vmpooler__vm__#{vmname}", 'token:user')
255
+ backend.hget("vmpooler__vm__#{vmname}", 'template')
256
+ jenkins_build_url, user, poolname = backend.exec
257
+ poolname = poolname.gsub('.', '_')
258
+
259
+ if user
260
+ user = user.gsub('.', '_')
261
+ else
262
+ user = 'unauthenticated'
263
+ end
264
+ metrics.increment("user.#{user}.#{operation}.#{poolname}")
265
+
266
+ if jenkins_build_url
267
+ if jenkins_build_url.include? 'litmus'
268
+ # Very simple filter for Litmus jobs - just count them coming through for the moment.
269
+ metrics.increment("usage_litmus.#{user}.#{operation}.#{poolname}")
270
+ return
271
+ end
272
+
273
+ url_parts = jenkins_build_url.split('/')[2..-1]
274
+ jenkins_instance = url_parts[0].gsub('.', '_')
275
+ value_stream_parts = url_parts[2].split('_')
276
+ value_stream_parts = value_stream_parts.map { |s| s.gsub('.', '_') }
277
+ value_stream = value_stream_parts.shift
278
+ branch = value_stream_parts.pop
279
+ project = value_stream_parts.shift
280
+ job_name = value_stream_parts.join('_')
281
+ build_metadata_parts = url_parts[3]
282
+ component_to_test = component_to_test('RMM_COMPONENT_TO_TEST_NAME', build_metadata_parts)
283
+
284
+ metrics.increment("usage_jenkins_instance.#{jenkins_instance}.#{value_stream}.#{operation}.#{poolname}")
285
+ metrics.increment("usage_branch_project.#{branch}.#{project}.#{operation}.#{poolname}")
286
+ metrics.increment("usage_job_component.#{job_name}.#{component_to_test}.#{operation}.#{poolname}")
287
+ end
288
+ rescue StandardError => e
289
+ puts 'd', "[!] [#{poolname}] failed while evaluating usage labels on '#{vmname}' with an error: #{e}"
290
+ end
291
+
238
292
  def update_pool_size(payload)
239
293
  result = { 'ok' => false }
240
294
 
@@ -1169,6 +1223,7 @@ module Vmpooler
1169
1223
  status 200
1170
1224
  result['ok'] = true
1171
1225
  metrics.increment('delete.success')
1226
+ update_user_metrics('destroy', params[:hostname]) if Vmpooler::API.settings.config[:config]['usage_stats']
1172
1227
  else
1173
1228
  metrics.increment('delete.failed')
1174
1229
  end
@@ -165,33 +165,33 @@ module Vmpooler
165
165
  },
166
166
  user: {
167
167
  mtype: M_COUNTER,
168
- torun: %i[manager],
169
- docstring: 'Number of pool instances this user created created',
170
- param_labels: %i[user poolname]
168
+ torun: %i[api],
169
+ docstring: 'Number of pool instances and the operation performed by a user',
170
+ param_labels: %i[user operation poolname]
171
171
  },
172
172
  usage_litmus: {
173
173
  mtype: M_COUNTER,
174
- torun: %i[manager],
175
- docstring: 'Pools by Litmus job usage',
176
- param_labels: %i[user poolname]
174
+ torun: %i[api],
175
+ docstring: 'Number of pool instances and the operation performed by Litmus jobs',
176
+ param_labels: %i[user operation poolname]
177
177
  },
178
178
  usage_jenkins_instance: {
179
179
  mtype: M_COUNTER,
180
- torun: %i[manager],
181
- docstring: 'Pools by Jenkins instance usage',
182
- param_labels: %i[jenkins_instance value_stream poolname]
180
+ torun: %i[api],
181
+ docstring: 'Number of pool instances and the operation performed by Jenkins instances',
182
+ param_labels: %i[jenkins_instance value_stream operation poolname]
183
183
  },
184
184
  usage_branch_project: {
185
185
  mtype: M_COUNTER,
186
- torun: %i[manager],
187
- docstring: 'Pools by branch/project usage',
188
- param_labels: %i[branch project poolname]
186
+ torun: %i[api],
187
+ docstring: 'Number of pool instances and the operation performed by Jenkins branch/project',
188
+ param_labels: %i[branch project operation poolname]
189
189
  },
190
190
  usage_job_component: {
191
191
  mtype: M_COUNTER,
192
- torun: %i[manager],
193
- docstring: 'Pools by job/component usage',
194
- param_labels: %i[job_name component_to_test poolname]
192
+ torun: %i[api],
193
+ docstring: 'Number of pool instances and the operation performed by Jenkins job/component',
194
+ param_labels: %i[job_name component_to_test operation poolname]
195
195
  },
196
196
  checkout: {
197
197
  mtype: M_COUNTER,
@@ -473,66 +473,11 @@ module Vmpooler
473
473
  finish = format('%<time>.2f', time: Time.now - start)
474
474
  $logger.log('s', "[-] [#{pool}] '#{vm}' destroyed in #{finish} seconds")
475
475
  $metrics.timing("destroy.#{pool}", finish)
476
- get_vm_usage_labels(vm, redis)
477
476
  end
478
477
  end
479
478
  dereference_mutex(vm)
480
479
  end
481
480
 
482
- def get_vm_usage_labels(vm, redis)
483
- return unless $config[:config]['usage_stats']
484
-
485
- redis.multi
486
- redis.hget("vmpooler__vm__#{vm}", 'checkout')
487
- redis.hget("vmpooler__vm__#{vm}", 'tag:jenkins_build_url')
488
- redis.hget("vmpooler__vm__#{vm}", 'token:user')
489
- redis.hget("vmpooler__vm__#{vm}", 'template')
490
- checkout, jenkins_build_url, user, poolname = redis.exec
491
- return if checkout.nil?
492
-
493
- user ||= 'unauthenticated'
494
- user = user.gsub('.', '_')
495
- $metrics.increment("user.#{user}.#{poolname}")
496
-
497
- return unless jenkins_build_url
498
-
499
- if jenkins_build_url.include? 'litmus'
500
- # Very simple filter for Litmus jobs - just count them coming through for the moment.
501
- $metrics.increment("usage_litmus.#{user}.#{poolname}")
502
- return
503
- end
504
-
505
- url_parts = jenkins_build_url.split('/')[2..-1]
506
- jenkins_instance = url_parts[0].gsub('.', '_')
507
- value_stream_parts = url_parts[2].split('_')
508
- value_stream_parts = value_stream_parts.map { |s| s.gsub('.', '_') }
509
- value_stream = value_stream_parts.shift
510
- branch = value_stream_parts.pop
511
- project = value_stream_parts.shift
512
- job_name = value_stream_parts.join('_')
513
- build_metadata_parts = url_parts[3]
514
- component_to_test = component_to_test('RMM_COMPONENT_TO_TEST_NAME', build_metadata_parts)
515
-
516
- $metrics.increment("usage_jenkins_instance.#{jenkins_instance}.#{value_stream}.#{poolname}")
517
- $metrics.increment("usage_branch_project.#{branch}.#{project}.#{poolname}")
518
- $metrics.increment("usage_job_component.#{job_name}.#{component_to_test}.#{poolname}")
519
- rescue StandardError => e
520
- $logger.log('d', "[!] [#{poolname}] failed while evaluating usage labels on '#{vm}' with an error: #{e}")
521
- raise
522
- end
523
-
524
- def component_to_test(match, labels_string)
525
- return if labels_string.nil?
526
-
527
- labels_string_parts = labels_string.split(',')
528
- labels_string_parts.each do |part|
529
- key, value = part.split('=')
530
- next if value.nil?
531
- return value if key == match
532
- end
533
- 'none'
534
- end
535
-
536
481
  def purge_unused_vms_and_folders
537
482
  global_purge = $config[:config]['purge_unconfigured_folders']
538
483
  providers = $config[:providers].keys
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Vmpooler
4
- VERSION = '1.0.0'
4
+ VERSION = '1.2.0'
5
5
  end
data/lib/vmpooler.rb CHANGED
@@ -119,6 +119,11 @@ module Vmpooler
119
119
  parsed_config[:auth][:ldap]['port'] = string_to_int(ENV['LDAP_PORT']) if ENV['LDAP_PORT']
120
120
  parsed_config[:auth][:ldap]['base'] = ENV['LDAP_BASE'] if ENV['LDAP_BASE']
121
121
  parsed_config[:auth][:ldap]['user_object'] = ENV['LDAP_USER_OBJECT'] if ENV['LDAP_USER_OBJECT']
122
+ if parsed_config[:auth]['provider'] == 'ldap' && parsed_config[:auth][:ldap].key?('encryption')
123
+ parsed_config[:auth][:ldap]['encryption'] = parsed_config[:auth][:ldap]['encryption']
124
+ elsif parsed_config[:auth]['provider'] == 'ldap'
125
+ parsed_config[:auth][:ldap]['encryption'] = {}
126
+ end
122
127
  end
123
128
 
124
129
  # Create an index of pool aliases
@@ -236,12 +241,12 @@ module Vmpooler
236
241
  if tracing_enabled.eql?('false')
237
242
  puts "Exporting of traces has been disabled so the span processor has been se to a 'NoopSpanExporter'"
238
243
  span_processor = OpenTelemetry::SDK::Trace::Export::BatchSpanProcessor.new(
239
- exporter: OpenTelemetry::SDK::Trace::Export::NoopSpanExporter.new
244
+ OpenTelemetry::SDK::Trace::Export::NoopSpanExporter.new
240
245
  )
241
246
  else
242
247
  puts "Exporting of traces will be done over HTTP in binary Thrift format to #{tracing_jaeger_host}"
243
248
  span_processor = OpenTelemetry::SDK::Trace::Export::BatchSpanProcessor.new(
244
- exporter: OpenTelemetry::Exporter::Jaeger::CollectorExporter.new(endpoint: tracing_jaeger_host)
249
+ OpenTelemetry::Exporter::Jaeger::CollectorExporter.new(endpoint: tracing_jaeger_host)
245
250
  )
246
251
  end
247
252
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: vmpooler
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 1.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Puppet
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-02-02 00:00:00.000000000 Z
11
+ date: 2021-09-15 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: concurrent-ruby
@@ -72,84 +72,84 @@ dependencies:
72
72
  requirements:
73
73
  - - '='
74
74
  - !ruby/object:Gem::Version
75
- version: 0.13.0
75
+ version: 0.17.0
76
76
  type: :runtime
77
77
  prerelease: false
78
78
  version_requirements: !ruby/object:Gem::Requirement
79
79
  requirements:
80
80
  - - '='
81
81
  - !ruby/object:Gem::Version
82
- version: 0.13.0
82
+ version: 0.17.0
83
83
  - !ruby/object:Gem::Dependency
84
84
  name: opentelemetry-instrumentation-concurrent_ruby
85
85
  requirement: !ruby/object:Gem::Requirement
86
86
  requirements:
87
87
  - - '='
88
88
  - !ruby/object:Gem::Version
89
- version: 0.13.0
89
+ version: 0.17.0
90
90
  type: :runtime
91
91
  prerelease: false
92
92
  version_requirements: !ruby/object:Gem::Requirement
93
93
  requirements:
94
94
  - - '='
95
95
  - !ruby/object:Gem::Version
96
- version: 0.13.0
96
+ version: 0.17.0
97
97
  - !ruby/object:Gem::Dependency
98
98
  name: opentelemetry-instrumentation-redis
99
99
  requirement: !ruby/object:Gem::Requirement
100
100
  requirements:
101
101
  - - '='
102
102
  - !ruby/object:Gem::Version
103
- version: 0.13.0
103
+ version: 0.17.0
104
104
  type: :runtime
105
105
  prerelease: false
106
106
  version_requirements: !ruby/object:Gem::Requirement
107
107
  requirements:
108
108
  - - '='
109
109
  - !ruby/object:Gem::Version
110
- version: 0.13.0
110
+ version: 0.17.0
111
111
  - !ruby/object:Gem::Dependency
112
112
  name: opentelemetry-instrumentation-sinatra
113
113
  requirement: !ruby/object:Gem::Requirement
114
114
  requirements:
115
115
  - - '='
116
116
  - !ruby/object:Gem::Version
117
- version: 0.13.0
117
+ version: 0.17.0
118
118
  type: :runtime
119
119
  prerelease: false
120
120
  version_requirements: !ruby/object:Gem::Requirement
121
121
  requirements:
122
122
  - - '='
123
123
  - !ruby/object:Gem::Version
124
- version: 0.13.0
124
+ version: 0.17.0
125
125
  - !ruby/object:Gem::Dependency
126
126
  name: opentelemetry-resource_detectors
127
127
  requirement: !ruby/object:Gem::Requirement
128
128
  requirements:
129
129
  - - '='
130
130
  - !ruby/object:Gem::Version
131
- version: 0.13.0
131
+ version: 0.17.0
132
132
  type: :runtime
133
133
  prerelease: false
134
134
  version_requirements: !ruby/object:Gem::Requirement
135
135
  requirements:
136
136
  - - '='
137
137
  - !ruby/object:Gem::Version
138
- version: 0.13.0
138
+ version: 0.17.0
139
139
  - !ruby/object:Gem::Dependency
140
140
  name: opentelemetry-sdk
141
141
  requirement: !ruby/object:Gem::Requirement
142
142
  requirements:
143
143
  - - '='
144
144
  - !ruby/object:Gem::Version
145
- version: 0.13.1
145
+ version: 0.17.0
146
146
  type: :runtime
147
147
  prerelease: false
148
148
  version_requirements: !ruby/object:Gem::Requirement
149
149
  requirements:
150
150
  - - '='
151
151
  - !ruby/object:Gem::Version
152
- version: 0.13.1
152
+ version: 0.17.0
153
153
  - !ruby/object:Gem::Dependency
154
154
  name: pickup
155
155
  requirement: !ruby/object:Gem::Requirement