cf_light_api 1.3.1 → 1.3.2
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/lib/cf_light_api/worker.rb +61 -57
- metadata +18 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c72fd921339d1874c9b1086404e38afee9f88d5f
|
4
|
+
data.tar.gz: e3f5e8773925d7515b6ecbb917054159fde095d4
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 55bb2150f1c2d22ba2d483ddaea27b26e7649433c097531e9997478147ca06b938e0aa2fbeff2d8a45c20ef755f3e45e8cbbfd4f33e1b18623ca471c079b210b
|
7
|
+
data.tar.gz: 5b30c97ec7f672fc1f50577dbdaab07cdfac22bfdbb5b8dbf2497af72803ab83df76762e2c36c31714a08a74fe05461b7d280908591e32cd0e8b361c55fbd2e5
|
data/lib/cf_light_api/worker.rb
CHANGED
@@ -2,84 +2,89 @@ require 'cfoundry'
|
|
2
2
|
require 'json'
|
3
3
|
require 'rufus-scheduler'
|
4
4
|
require 'parallel'
|
5
|
+
require 'redlock'
|
6
|
+
require 'logger'
|
7
|
+
|
8
|
+
@logger = Logger.new(STDOUT)
|
9
|
+
@logger.formatter = proc do |severity, datetime, progname, msg|
|
10
|
+
"#{datetime} [cf_light_api:worker]: #{msg}\n"
|
11
|
+
end
|
5
12
|
|
6
13
|
['CF_API', 'CF_USER', 'CF_PASSWORD'].each do |env|
|
7
|
-
|
14
|
+
@logger.info "Error: please set the '#{env}' environment variable." unless ENV[env]
|
8
15
|
next
|
9
16
|
end
|
10
17
|
|
18
|
+
lock_manager = Redlock::Client.new([ENV['REDIS_URI']])
|
11
19
|
scheduler = Rufus::Scheduler.new
|
12
20
|
scheduler.every '5m', :first_in => '5s', :overlap => false, :timeout => '5m' do
|
13
21
|
begin
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
end
|
18
|
-
|
19
|
-
lock
|
20
|
-
start_time = Time.now
|
22
|
+
lock_manager.lock("#{ENV['REDIS_KEY_PREFIX']}:lock", 5*60*1000) do |lock|
|
23
|
+
if lock
|
24
|
+
start_time = Time.now
|
21
25
|
|
22
|
-
|
26
|
+
@logger.info "Updating data..."
|
23
27
|
|
24
|
-
|
28
|
+
cf_client = get_client()
|
25
29
|
|
26
|
-
|
27
|
-
|
28
|
-
org_data = Parallel.map( cf_client.organizations, :in_processes => 4) do |org|
|
29
|
-
# The CFoundry client returns memory_limit in MB, so we need to normalise to Bytes to match the Apps.
|
30
|
-
{
|
31
|
-
:name => org.name,
|
32
|
-
:quota => {
|
33
|
-
:total_services => org.quota_definition.total_services,
|
34
|
-
:memory_limit => org.quota_definition.memory_limit * 1024 * 1024
|
35
|
-
}
|
36
|
-
}
|
37
|
-
end.flatten
|
38
|
-
|
39
|
-
app_data = Parallel.map(cf_client.organizations, :in_processes => 4) do |org|
|
40
|
-
Parallel.map(org.spaces, :in_processes => 4) do |space|
|
41
|
-
Parallel.map(space.apps, :in_processes => 4) do |app|
|
42
|
-
begin
|
43
|
-
# It's possible for an app to have been terminated before this stage is reached.
|
44
|
-
format_app_data(app, org.name, space.name)
|
45
|
-
rescue CFoundry::AppNotFound
|
46
|
-
next
|
47
|
-
end
|
48
|
-
end
|
49
|
-
end
|
50
|
-
end.flatten
|
30
|
+
org_data = get_org_data(cf_client)
|
31
|
+
app_data = get_app_data(cf_client)
|
51
32
|
|
52
|
-
|
53
|
-
|
54
|
-
put_in_redis "#{ENV['REDIS_KEY_PREFIX']}:orgs", org_data
|
55
|
-
put_in_redis "#{ENV['REDIS_KEY_PREFIX']}:apps", app_data
|
56
|
-
|
57
|
-
puts "[cf_light_api:worker] Update completed in #{format_duration(Time.now.to_f - start_time.to_f)}..."
|
33
|
+
put_in_redis "#{ENV['REDIS_KEY_PREFIX']}:orgs", org_data
|
34
|
+
put_in_redis "#{ENV['REDIS_KEY_PREFIX']}:apps", app_data
|
58
35
|
|
36
|
+
@logger.info "Update completed in #{format_duration(Time.now.to_f - start_time.to_f)}..."
|
37
|
+
lock_manager.unlock(lock)
|
38
|
+
cf_client.logout
|
39
|
+
else
|
40
|
+
@logger.info "Update already running in another thread!"
|
41
|
+
end
|
42
|
+
end
|
59
43
|
rescue Rufus::Scheduler::TimeoutError
|
60
|
-
|
44
|
+
@logger.info 'Data update took too long and was aborted...'
|
45
|
+
cf_client.logout
|
61
46
|
end
|
62
47
|
end
|
63
48
|
|
64
|
-
def locked?
|
65
|
-
REDIS.get("#{ENV['REDIS_KEY_PREFIX']}:lock") ? true : false
|
66
|
-
end
|
67
|
-
|
68
|
-
def lock
|
69
|
-
REDIS.set "#{ENV['REDIS_KEY_PREFIX']}:lock", true
|
70
|
-
REDIS.expire "#{ENV['REDIS_KEY_PREFIX']}:lock", 900
|
71
|
-
end
|
72
|
-
|
73
|
-
def unlock
|
74
|
-
REDIS.del "#{ENV['REDIS_KEY_PREFIX']}:lock"
|
75
|
-
end
|
76
|
-
|
77
49
|
def get_client(cf_api=ENV['CF_API'], cf_user=ENV['CF_USER'], cf_password=ENV['CF_PASSWORD'])
|
78
50
|
client = CFoundry::Client.get(cf_api)
|
79
51
|
client.login({:username => cf_user, :password => cf_password})
|
80
52
|
client
|
81
53
|
end
|
82
54
|
|
55
|
+
def get_app_data(cf_client)
|
56
|
+
Parallel.map(cf_client.organizations, :in_processes => 4) do |org|
|
57
|
+
org_name = org.name
|
58
|
+
Parallel.map(org.spaces, :in_processes => 4) do |space|
|
59
|
+
space_name = space.name
|
60
|
+
@logger.info "Getting app data for apps in #{org_name}:#{space_name}..."
|
61
|
+
Parallel.map(space.apps, :in_processes => 4) do |app|
|
62
|
+
begin
|
63
|
+
# It's possible for an app to have been terminated before this stage is reached.
|
64
|
+
format_app_data(app, org_name, space_name)
|
65
|
+
rescue CFoundry::AppNotFound
|
66
|
+
next
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end.flatten.compact
|
71
|
+
end
|
72
|
+
|
73
|
+
def get_org_data(cf_client)
|
74
|
+
Parallel.map( cf_client.organizations, :in_processes => 4) do |org|
|
75
|
+
org_name = org.name
|
76
|
+
@logger.info "Getting org data for #{org_name}..."
|
77
|
+
# The CFoundry client returns memory_limit in MB, so we need to normalise to Bytes to match the Apps.
|
78
|
+
{
|
79
|
+
:name => org_name,
|
80
|
+
:quota => {
|
81
|
+
:total_services => org.quota_definition.total_services,
|
82
|
+
:memory_limit => org.quota_definition.memory_limit * 1024 * 1024
|
83
|
+
}
|
84
|
+
}
|
85
|
+
end.flatten.compact
|
86
|
+
end
|
87
|
+
|
83
88
|
def format_app_data(app, org_name, space_name)
|
84
89
|
base_data = {
|
85
90
|
:guid => app.guid,
|
@@ -99,7 +104,7 @@ def format_app_data(app, org_name, space_name)
|
|
99
104
|
:error => nil
|
100
105
|
}
|
101
106
|
rescue => e
|
102
|
-
|
107
|
+
@logger.info " #{org_name} #{space_name}: '#{app.name}'' error: #{e.message}"
|
103
108
|
additional_data = {
|
104
109
|
:running => 'error',
|
105
110
|
:instances => [],
|
@@ -111,7 +116,6 @@ def format_app_data(app, org_name, space_name)
|
|
111
116
|
end
|
112
117
|
|
113
118
|
def put_in_redis(key, data)
|
114
|
-
puts "[cf_light_api:worker] Putting data #{data} into redis key #{key}"
|
115
119
|
REDIS.set key, data.to_json
|
116
120
|
end
|
117
121
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: cf_light_api
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.3.
|
4
|
+
version: 1.3.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Springer Platform Engineering
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-
|
11
|
+
date: 2015-05-27 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: cfoundry
|
@@ -80,6 +80,20 @@ dependencies:
|
|
80
80
|
- - ~>
|
81
81
|
- !ruby/object:Gem::Version
|
82
82
|
version: 1.4.5
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: redlock
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - ~>
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: 0.1.1
|
90
|
+
type: :runtime
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - ~>
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: 0.1.1
|
83
97
|
description: A super lightweight API for reading App and Org data from CloudFoundry,
|
84
98
|
cached in Redis.
|
85
99
|
email: ''
|
@@ -88,9 +102,9 @@ executables:
|
|
88
102
|
extensions: []
|
89
103
|
extra_rdoc_files: []
|
90
104
|
files:
|
91
|
-
- ./lib/sinatra/cf_light_api.rb
|
92
105
|
- ./lib/cf_light_api/redis.rb
|
93
106
|
- ./lib/cf_light_api/worker.rb
|
107
|
+
- ./lib/sinatra/cf_light_api.rb
|
94
108
|
- bin/cf_light_api
|
95
109
|
homepage: https://github.com/springerpe/cf-light-api
|
96
110
|
licenses:
|
@@ -112,7 +126,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
112
126
|
version: '0'
|
113
127
|
requirements: []
|
114
128
|
rubyforge_project:
|
115
|
-
rubygems_version: 2.
|
129
|
+
rubygems_version: 2.4.6
|
116
130
|
signing_key:
|
117
131
|
specification_version: 4
|
118
132
|
summary: A super lightweight API for reading App and Org data from CloudFoundry, cached
|