cfcm 0.0.1 → 0.0.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.
- data/Gemfile +2 -1
- data/Gemfile.lock +2 -0
- data/lib/cfcm/cf.rb +24 -2
- data/lib/cfcm/cli.rb +14 -1
- data/lib/cfcm/monkey.rb +46 -0
- data/lib/cfcm/version.rb +1 -1
- metadata +2 -1
data/Gemfile
CHANGED
@@ -1 +1,2 @@
|
|
1
|
-
gem 'vmc', "0.4.0.beta.36"
|
1
|
+
gem 'vmc', "0.4.0.beta.36"
|
2
|
+
gem 'eventmachine', "0.12.10"
|
data/Gemfile.lock
CHANGED
@@ -6,6 +6,7 @@ GEM
|
|
6
6
|
rest-client (~> 1.6.1)
|
7
7
|
rubyzip (~> 0.9.5)
|
8
8
|
crack (0.3.1)
|
9
|
+
eventmachine (0.12.10)
|
9
10
|
interact (0.4.7)
|
10
11
|
json_pure (1.6.7)
|
11
12
|
manifests-vmc-plugin (0.4.3)
|
@@ -54,4 +55,5 @@ PLATFORMS
|
|
54
55
|
ruby
|
55
56
|
|
56
57
|
DEPENDENCIES
|
58
|
+
eventmachine (= 0.12.10)
|
57
59
|
vmc (= 0.4.0.beta.36)
|
data/lib/cfcm/cf.rb
CHANGED
@@ -8,12 +8,16 @@ module CFCM
|
|
8
8
|
@client = VMC::Client.new(target)
|
9
9
|
@client.login(username, password)
|
10
10
|
rescue
|
11
|
-
puts "Could not login!"
|
11
|
+
#puts "Could not login!"
|
12
12
|
#TODO: Handle error
|
13
13
|
return
|
14
14
|
end
|
15
15
|
end
|
16
16
|
|
17
|
+
def is_logged_in
|
18
|
+
return @client.auth_token != nil
|
19
|
+
end
|
20
|
+
|
17
21
|
def get_app(app_name)
|
18
22
|
if !@client
|
19
23
|
puts "Must be loged in"
|
@@ -27,11 +31,16 @@ module CFCM
|
|
27
31
|
end
|
28
32
|
end
|
29
33
|
|
30
|
-
puts "Application Not Found"
|
34
|
+
#puts "Application Not Found"
|
31
35
|
#TODO: Handle error
|
32
36
|
return nil
|
33
37
|
end
|
34
38
|
|
39
|
+
def app_exists(app_name)
|
40
|
+
app = self.get_app(app_name)
|
41
|
+
return app != nil
|
42
|
+
end
|
43
|
+
|
35
44
|
def remaining_memory
|
36
45
|
if !@client
|
37
46
|
puts "Must be loged in"
|
@@ -57,6 +66,19 @@ module CFCM
|
|
57
66
|
max_new_instances = (remaining_memory / app_memory).floor
|
58
67
|
return max_new_instances
|
59
68
|
end
|
69
|
+
|
70
|
+
def add_instance(app)
|
71
|
+
app[:instances] += 1
|
72
|
+
@client.update_app(app[:name], app)
|
73
|
+
return app
|
74
|
+
end
|
75
|
+
|
76
|
+
def remove_instance(app)
|
77
|
+
app[:instances] -= 1
|
78
|
+
@client.update_app(app[:name], app)
|
79
|
+
return app
|
80
|
+
end
|
81
|
+
|
60
82
|
end
|
61
83
|
end
|
62
84
|
end
|
data/lib/cfcm/cli.rb
CHANGED
@@ -1,9 +1,10 @@
|
|
1
1
|
require "thor"
|
2
|
+
require "cfcm/monkey"
|
2
3
|
|
3
4
|
module CFCM
|
4
5
|
module CLI
|
5
6
|
class Command < Thor
|
6
|
-
|
7
|
+
|
7
8
|
desc "soft USERNAME PASSWORD APP", "Removes/Adds instances via VMC APIs"
|
8
9
|
method_option :target, :alias => ["--target"], :type => :string, :desc => "Cloud Foundry API Target URL"
|
9
10
|
method_option :min, :alias => ["--min"], :type => :numeric, :desc => "Minimum number of instances"
|
@@ -22,6 +23,18 @@ module CFCM
|
|
22
23
|
|
23
24
|
require 'cfcm/cf'
|
24
25
|
session = CFCM::CF::Session.new(target, username, password)
|
26
|
+
if session.is_logged_in
|
27
|
+
if session.app_exists(app)
|
28
|
+
puts "RELEASE THE MONKEY!"
|
29
|
+
else
|
30
|
+
puts "Application not found"
|
31
|
+
end
|
32
|
+
else
|
33
|
+
puts "Could not log in"
|
34
|
+
end
|
35
|
+
|
36
|
+
monkey = CFCM::Monkey::SoftMonkey.new(session, app, 50, 1, 10)
|
37
|
+
monkey.start
|
25
38
|
end
|
26
39
|
end
|
27
40
|
end
|
data/lib/cfcm/monkey.rb
ADDED
@@ -0,0 +1,46 @@
|
|
1
|
+
require "eventmachine"
|
2
|
+
|
3
|
+
module CFCM
|
4
|
+
module Monkey
|
5
|
+
class SoftMonkey
|
6
|
+
def initialize(session, app_name, probability, min, max)
|
7
|
+
@session = session
|
8
|
+
@app_name = app_name
|
9
|
+
@app = @session.get_app(app_name)
|
10
|
+
@probability = probability
|
11
|
+
@min_instances = min
|
12
|
+
@max_instances = max
|
13
|
+
end
|
14
|
+
|
15
|
+
def start
|
16
|
+
EventMachine.run do
|
17
|
+
EventMachine.add_periodic_timer(10) do
|
18
|
+
# Determine if we should unleash the monkey
|
19
|
+
if (Random.rand(100) + 1) <= @probability
|
20
|
+
@app = @session.get_app(@app_name)
|
21
|
+
instances = @app[:instances]
|
22
|
+
max_instances = @session.max_instance_growth(@app_name)
|
23
|
+
if max_instances == 0 || @max_instances == instances
|
24
|
+
# Shrink
|
25
|
+
puts "Shrink due to instance limitations"
|
26
|
+
@app = @session.add_instance(@app)
|
27
|
+
elsif instances == @min_instances
|
28
|
+
# Grow
|
29
|
+
puts "Grow due to instance limitations"
|
30
|
+
@app = @session.add_instance(@app)
|
31
|
+
elsif Random.rand(2) == 0
|
32
|
+
# Shrink
|
33
|
+
puts "Shrink due to randomness"
|
34
|
+
@app = @session.remove_instance(@app)
|
35
|
+
else
|
36
|
+
#Grow
|
37
|
+
puts "Grow due to randomness"
|
38
|
+
@app = @session.add_instance(@app)
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
data/lib/cfcm/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: cfcm
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.2
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -60,6 +60,7 @@ files:
|
|
60
60
|
- cfcm.gemspec
|
61
61
|
- lib/cfcm/cf.rb
|
62
62
|
- lib/cfcm/cli.rb
|
63
|
+
- lib/cfcm/monkey.rb
|
63
64
|
- lib/cfcm/version.rb
|
64
65
|
homepage: https://github.com/BrianMMcClain/cloudfoundry-chaos-monkey
|
65
66
|
licenses: []
|