cfcm 0.0.3 → 0.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/.gitignore CHANGED
@@ -9,6 +9,7 @@ pkg
9
9
  rdoc
10
10
  spec/reports
11
11
  test/tmp
12
+ test/input
12
13
  test/version_tmp
13
14
  tmp
14
15
 
data/Gemfile CHANGED
@@ -1,2 +1,3 @@
1
1
  gem 'vmc', "0.4.0.beta.36"
2
- gem 'eventmachine', "0.12.10"
2
+ gem 'eventmachine', "0.12.10"
3
+ gem 'rbvmomi', "1.5.1"
@@ -1,6 +1,7 @@
1
1
  GEM
2
2
  specs:
3
3
  addressable (2.2.6)
4
+ builder (3.0.0)
4
5
  cfoundry (0.3.23)
5
6
  multi_json (~> 1.3.6)
6
7
  rest-client (~> 1.6.1)
@@ -14,8 +15,13 @@ GEM
14
15
  mime-types (1.19)
15
16
  mothership (0.0.14)
16
17
  multi_json (1.3.6)
18
+ nokogiri (1.5.5)
17
19
  rake (0.9.2.2)
18
20
  rb-readline (0.4.2)
21
+ rbvmomi (1.5.1)
22
+ builder
23
+ nokogiri (>= 1.4.1)
24
+ trollop
19
25
  rest-client (1.6.7)
20
26
  mime-types (>= 1.16)
21
27
  rspec (1.3.2)
@@ -25,6 +31,7 @@ GEM
25
31
  simplecov-html (~> 0.5.3)
26
32
  simplecov-html (0.5.3)
27
33
  terminal-table (1.4.5)
34
+ trollop (2.0)
28
35
  uuidtools (2.1.3)
29
36
  vmc (0.4.0.beta.36)
30
37
  addressable (~> 2.2.6)
@@ -56,4 +63,5 @@ PLATFORMS
56
63
 
57
64
  DEPENDENCIES
58
65
  eventmachine (= 0.12.10)
66
+ rbvmomi (= 1.5.1)
59
67
  vmc (= 0.4.0.beta.36)
data/README.md CHANGED
@@ -1,4 +1,17 @@
1
1
  cloudfoundry-chaos-monkey
2
2
  =========================
3
3
 
4
- Chaos Monkey style service for Cloud Foundry
4
+ Chaos Monkey style service for Cloud Foundry
5
+
6
+ Using Cloud Foundry Chaos Monkey
7
+ --------------------------------
8
+
9
+ First off, grab the Cloud Foundry Chaos Monkey gem
10
+
11
+ `gem install cfcm`
12
+
13
+ and then unleash the monkey! In this example, we'll use CFCM on an application named `myapp`, keeping between 2 and 5 instances. We want CFCM to have a 30% chance of adding or removing an instance every 10 seconds. Adding and removeing instances is known as "soft mode", that is, this is equvilant to doing "vmc instane [app] -1". There is a "hard mode" planned that is a bit more chaotic.
14
+
15
+ `cfcm soft [email] [password] myapp --min 2 --max 5 -p 30 -f 10`
16
+
17
+ It's as easy as that!
@@ -6,11 +6,11 @@ module CFCM
6
6
  class Command < Thor
7
7
 
8
8
  desc "soft USERNAME PASSWORD APP", "Removes/Adds instances via VMC APIs"
9
- method_option :target, :aliases => ["--target", "-t"], :type => :string, :desc => "Cloud Foundry API Target URL"
10
- method_option :min, :alias => ["--min"], :type => :numeric, :desc => "Minimum number of instances"
11
- method_option :max, :alias => ["--max"], :type => :numeric, :desc => "Maximum number of instances"
12
- method_option :probability, :aliases => ["--probability", "-p"], :type => :numeric, :desc => "[1-100] Probablity for the Chaos Monkey to add/remove an instance"
13
- method_option :frequency, :aliases => ["--frequency", "-f"], :type => :numeric, :desc => "Number of times to attempt to add/remove an instance"
9
+ method_option :target, :aliases => ["--target", "-t"], :type => :string, :desc => "Cloud Foundry API Target URL (Default: http://api.cloudfoundry.com)"
10
+ method_option :min, :alias => ["--min"], :type => :numeric, :desc => "Minimum number of instances (Default: 1)"
11
+ method_option :max, :alias => ["--max"], :type => :numeric, :desc => "Maximum number of instances (Default: 5)"
12
+ method_option :probability, :aliases => ["--probability", "-p"], :type => :numeric, :desc => "[1-100] Probablity for the Chaos Monkey to add/remove an instance (Default: 10)"
13
+ method_option :frequency, :aliases => ["--frequency", "-f"], :type => :numeric, :desc => "Number of seconds between attempts to add/remove an instance (Default: 10)"
14
14
  def soft(username, password, app, target = "http://api.cloudfoundry.com", min = 1, max = 5, probability = 10, frequency = 10)
15
15
 
16
16
  if options[:target]
@@ -50,6 +50,34 @@ module CFCM
50
50
  monkey = CFCM::Monkey::SoftMonkey.new(session, app, probability, min, max, frequency)
51
51
  monkey.start
52
52
  end
53
+
54
+
55
+ desc "hard", "Removes/Adds DEAs through IaaS commands"
56
+ method_option :iaas, :alias => ["--iaas"], :type => :string, :desc => "IaaS to communicate with [VSPHERE]"
57
+ method_option :input, :aliases => ["--input", "-i"], :type => :string, :desc => "Path to file listing valid DEAs (See Documentation)"
58
+ method_option :config, :aliases => ["--config", "-c"], :type => :string, :desc => "Path to IaaS config YML file (See Documentation)"
59
+ method_option :probability, :aliases => ["--probability", "-p"], :type => :numeric, :desc => "[1-100] Probablity for the Chaos Monkey to add/remove an instance (Default: 10)"
60
+ method_option :frequency, :aliases => ["--frequency", "-f"], :type => :numeric, :desc => "Number of seconds between attempts to add/remove an instance (Default: 10)"
61
+ def hard(probability = 10, frequency = 10)
62
+ if (!options[:iaas] || !options[:input] || !options[:config])
63
+ CFCM::Monkey::HardMonkey.new.show_help
64
+ else
65
+ if options[:probability]
66
+ if options[:probability] < 1 || options[:probability] > 100
67
+ puts "Probability must be between 1 and 100"
68
+ return
69
+ else
70
+ probability = options[:probability]
71
+ end
72
+ end
73
+ if options[:frequency]
74
+ frequency = options[:frequency]
75
+ end
76
+
77
+ monkey = CFCM::Monkey::HardMonkey.new(options[:iaas], options[:config], options[:input], probability, frequency)
78
+ monkey.start
79
+ end
80
+ end
53
81
  end
54
82
  end
55
83
  end
@@ -0,0 +1,20 @@
1
+ require 'rbvmomi'
2
+
3
+ module CFCM
4
+ module IAAS
5
+ class IaaS
6
+
7
+ def initalize(host, user, password, config)
8
+ @host = host
9
+ @user = user
10
+ @password = password
11
+ @config = config
12
+ end
13
+
14
+ def power_off_vm(vm)
15
+ puts "Not Implemented"
16
+ end
17
+
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,24 @@
1
+ require 'rbvmomi'
2
+
3
+ module CFCM
4
+ module IAAS
5
+ class Vsphere
6
+
7
+ def initialize(host, user, password, config)
8
+ @host = host
9
+ @user = user
10
+ @password = password
11
+ @config = config
12
+ end
13
+
14
+ def power_off_vm(vm_name)
15
+ opts = {:host=>@host, :user=>@user, :password=>@password, :insecure=>true}
16
+ vim = RbVmomi::VIM.connect opts
17
+ dc = vim.serviceInstance.content.rootFolder.traverse(config["datacenter"], RbVmomi::VIM::Datacenter) or abort "datacenter not found"
18
+ vm = dc.vmFolder.traverse(vm_name, VIM::VirtualMachine) or abort "VM not found"
19
+ vm.PowerOffVM_Task.wait_for_completion
20
+ end
21
+
22
+ end
23
+ end
24
+ end
@@ -1,4 +1,7 @@
1
- require "eventmachine"
1
+ require 'eventmachine'
2
+ require 'yaml'
3
+ require 'cfcm/iaas/iaas'
4
+ require 'cfcm/iaas/vsphere'
2
5
 
3
6
  module CFCM
4
7
  module Monkey
@@ -50,5 +53,48 @@ module CFCM
50
53
  end
51
54
  end
52
55
  end
56
+
57
+
58
+ class HardMonkey
59
+ def show_help
60
+ puts "Description coming soon"
61
+ end
62
+
63
+ def initialize(iaas, config_file, input_file, probability, frequency)
64
+
65
+ @probability = probability
66
+ @frequency = frequency
67
+
68
+ # Parse the config file
69
+ @config = YAML.load_file(config_file)
70
+
71
+ # Parse the input file
72
+ input_fd = File.open(input_file, "rb")
73
+ @input = input_fd.read.split
74
+
75
+ # Build the IaaS interface
76
+ @iaas_interface = nil
77
+ case iaas.downcase
78
+ when "vsphere"
79
+ @iaas_interface = CFCM::IAAS::Vsphere.new(@config["host"], @config["user"], @config["password"], @config)
80
+ else
81
+ puts "Unknown IaaS -- #{iaas}"
82
+ end
83
+ end
84
+
85
+ def start
86
+ # Start the Eventmachine loop, similar to above and shut down VMs at random
87
+ EventMachine.run do
88
+ EventMachine.add_periodic_timer(@frequency) do
89
+ # Determine if we should unleash the monkey
90
+ if (Random.rand(100) + 1) <= @probability
91
+ vm = @input.sample
92
+ puts "Sending Power Off to #{vm}"
93
+ @iaas_interface.power_off_vm(vm)
94
+ end
95
+ end
96
+ end
97
+ end
98
+ end
53
99
  end
54
100
  end
@@ -1,3 +1,3 @@
1
1
  module CFCM
2
- VERSION = "0.0.3"
2
+ VERSION = "0.0.4"
3
3
  end
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.3
4
+ version: 0.0.4
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-08-31 00:00:00.000000000 Z
12
+ date: 2012-09-05 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: thor
@@ -60,6 +60,8 @@ files:
60
60
  - cfcm.gemspec
61
61
  - lib/cfcm/cf.rb
62
62
  - lib/cfcm/cli.rb
63
+ - lib/cfcm/iaas/iaas.rb
64
+ - lib/cfcm/iaas/vsphere.rb
63
65
  - lib/cfcm/monkey.rb
64
66
  - lib/cfcm/version.rb
65
67
  homepage: https://github.com/BrianMMcClain/cloudfoundry-chaos-monkey