ssvm_cli 0.0.2 → 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (4) hide show
  1. data/bin/ssvm +22 -3
  2. data/lib/request_helper.rb +37 -0
  3. data/ssvm_cli.gemspec +1 -1
  4. metadata +4 -4
data/bin/ssvm CHANGED
@@ -17,7 +17,7 @@ class Ssvm < Thor
17
17
  method_option :owners, :aliases => '-o', :desc => "Owners of the VM", :type => :array
18
18
  method_option :env, :aliases => '-e', :required => true, :desc => "Environment for the VM (e.g. prod or np)"
19
19
  method_option :datacenter, :aliases => '-d', :required => true, :desc => "Datacenter for the VM (e.g. dc1 or dc2)"
20
- method_option :build_spec, :required => true, :desc => "Default or customized VM request"
20
+ method_option :build_spec, :aliases => '-b', :required => true, :desc => "Default or customized VM request"
21
21
  method_option :os, :desc => "What OS to use for the VM (e.g. Scientific Linux (Carbon) 6.0 x86_64)"
22
22
  method_option :instances, :desc => "How many instances to make"
23
23
  method_option :start_at, :desc => "What number to start at for multi instances request", :default => 1
@@ -26,14 +26,33 @@ class Ssvm < Thor
26
26
  method_option :memory, :aliases => '-m', :desc => "How much memory for the VM"
27
27
  method_option :cpu, :aliases => '-c', :desc => "How CPU for the VM"
28
28
  method_option :disk, :desc => "How much disk space for the VM"
29
- method_option :no_exp, :type => :boolean, :desc => "No expiration for the VM"
29
+ method_option :no_expiration, :type => :boolean, :desc => "No expiration for the VM"
30
30
  method_option :justifications, :aliases => '-j', :desc => "Justification for any special request"
31
+ method_option :location_specs, :aliases => '-l',
32
+ :desc => "Specificiations for where to create the VM (format [include|exclude]:[rack|chassis|node]:location1,location2)",
33
+ :type => :array
31
34
  def create_vm
32
35
  conf = load_conf(options[:conf_file] || CONFIG_FILE)
33
36
  rhelper = RequestHelper.new(conf)
34
37
  rhelper.create_vm(options)
35
38
  end
36
39
 
40
+ desc 'perform_action', 'perform the action on the specified VMs'
41
+ method_option :hosts, :aliases => '-h', :required => true, :desc => "List of VMs to perform the action on", :type => :array
42
+ method_option :action, :aliases => '-a', :required => true, :desc => "What action to perform. Available actions are rebuild, reboot and delete"
43
+ method_option :silent, :type => :boolean, :desc => "Don't prompt"
44
+ def perform_action
45
+ conf = load_conf(options[:conf_file] || CONFIG_FILE)
46
+ rhelper = RequestHelper.new(conf)
47
+ puts "You're about to #{options['action']} the following VM(s): #{options['hosts'].inspect}"
48
+ if options['silent']
49
+ continue = true
50
+ else
51
+ continue = ask("Are you sure you want to do that? (y/N)? ") == 'y'
52
+ end
53
+ rhelper.perform_action(options) if continue
54
+ end
55
+
37
56
  desc "config", "configuration setup"
38
57
  method_option :conf_file, :aliases => "-c", :desc => "Where to write config to"
39
58
  def config
@@ -42,7 +61,7 @@ class Ssvm < Thor
42
61
  conf = {}
43
62
  conf[:username] = ask("Username: ")
44
63
  conf[:password] = ask("Password: ", true)
45
- conf[:server] = ask("Chefkitchen server: ")
64
+ conf[:server] = ask("SSVM server: ")
46
65
  File.open(config_file, 'w') do |f|
47
66
  YAML.dump(conf, f)
48
67
  end
@@ -18,6 +18,7 @@ class RequestHelper
18
18
  update_owner_field(options)
19
19
  handle_multi_instances(options)
20
20
  handle_custom_request(options)
21
+ handle_location_specs(options)
21
22
 
22
23
  begin
23
24
  response = RestClient.post("http://#{@server}/vm",
@@ -34,6 +35,24 @@ class RequestHelper
34
35
  end
35
36
  end
36
37
 
38
+ def perform_action(options)
39
+ action = options['action']
40
+ hosts = options['hosts']
41
+ begin
42
+ response = RestClient.post("http://#{@server}/vm/#{action}",
43
+ {:id => hosts.first},
44
+ {:cookies => @cookies, :content_type => 'application/json', :accept => :json})
45
+ result = JSON.parse(response)
46
+ if options[:json]
47
+ puts JSON.pretty_generate(result)
48
+ else
49
+ puts result['message']
50
+ end
51
+ rescue => e
52
+ puts e.inspect
53
+ end
54
+ end
55
+
37
56
  private
38
57
  def update_owner_field(options)
39
58
  if options['owners']
@@ -63,4 +82,22 @@ class RequestHelper
63
82
  def handle_custom_request(options)
64
83
  options['processor_count'] = options.delete('cpu')
65
84
  end
85
+
86
+ def handle_location_specs(options)
87
+ location_specs = options.delete('location_specs')
88
+ return unless location_specs
89
+
90
+ location_specs.each_with_index do |location_spec, index|
91
+ tokens = location_spec.split(':')
92
+ raise "Invalid location specs" if tokens.size != 3
93
+ if tokens[0] != "include" and tokens[0] != "exclude"
94
+ raise "Invalid location specs - modifier must be #{include} or #{exclude} but it's #{tokens[0]} instead"
95
+ end
96
+ raise "Invalid location specs" unless ['node', 'chassis', 'rack'].include? tokens[1]
97
+
98
+ options["location_specs_attributes[#{index}][modifier]"] = tokens[0]
99
+ options["location_specs_attributes[#{index}][loc_type]"] = tokens[1]
100
+ options["location_specs_attributes[#{index}][value]"] = tokens[2]
101
+ end
102
+ end
66
103
  end
data/ssvm_cli.gemspec CHANGED
@@ -4,7 +4,7 @@ $LOAD_PATH.push File.expand_path("../lib", __FILE__)
4
4
 
5
5
  Gem::Specification.new do |s|
6
6
  s.name = "ssvm_cli"
7
- s.version = "0.0.2"
7
+ s.version = "0.0.3"
8
8
  s.platform = Gem::Platform::RUBY
9
9
  s.authors = ["Darren Dao"]
10
10
  s.email = ["darrendao@gmail.com"]
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ssvm_cli
3
3
  version: !ruby/object:Gem::Version
4
- hash: 27
4
+ hash: 25
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
8
  - 0
9
- - 2
10
- version: 0.0.2
9
+ - 3
10
+ version: 0.0.3
11
11
  platform: ruby
12
12
  authors:
13
13
  - Darren Dao
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2012-05-30 00:00:00 Z
18
+ date: 2012-06-06 00:00:00 Z
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency
21
21
  name: thor