cloudstack_helper 0.1
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/README.md +26 -0
- data/bin/cloudstack_rb +46 -0
- data/lib/cloudstack_helper.rb +74 -0
- metadata +98 -0
data/README.md
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
# cloudstack_helper
|
2
|
+
cloudstack_helper is a simple ruby library that helps making request to CloudStack API easier. With cloudstack_helper, you only have to specify the command the parameters for the request and it will handle everything for you.
|
3
|
+
|
4
|
+
## Library Usage
|
5
|
+
|
6
|
+
```ruby
|
7
|
+
require 'cloudstack_helper'
|
8
|
+
|
9
|
+
API_URL = "http://mycloudstack:8080/client/api"
|
10
|
+
API_KEY = "WiUVlx74PpVE8w7z7hasgJjiOQvMsMWLFL3A054D_IPeSxxcm1PoNlpYlA2ujGSJBGiS2uBcG0GoLwLisosDCA"
|
11
|
+
SECRET_KEY = "uqzgrfMXnYSVvUi2XahgiDgvtXBemILs_npqi90KiYw0OKjyETOvQTtYg093EUrHSLZJEnI3lV1z9PrQmv2SxQ"
|
12
|
+
cs_helper = CloudStackHelper.new(:api_key => API_KEY, :secret_key => SECRET_KEY, :api_url => API_URL)
|
13
|
+
|
14
|
+
params = {:command => "listZones"}
|
15
|
+
puts cs_helper.get(params).body
|
16
|
+
|
17
|
+
params[:response] = "json"
|
18
|
+
puts cs_helper.get(params).body
|
19
|
+
ehelper.request :post, 'http://api.enstratus.com/api/enstratus/2011-02-24/admin/BillingCode', :data => json_data, :header => {'Accept' => 'application/json'}
|
20
|
+
```
|
21
|
+
|
22
|
+
## Executable Script Usage
|
23
|
+
```
|
24
|
+
cloudstack_rb -x listUsers domainid=1
|
25
|
+
cloudstack_rb -x deployVirtualMachine serviceofferingid=12 templateid=4 zoneid=1 displayname=ohyea
|
26
|
+
```
|
data/bin/cloudstack_rb
ADDED
@@ -0,0 +1,46 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
require 'optparse'
|
3
|
+
require 'yaml'
|
4
|
+
|
5
|
+
$:.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
|
6
|
+
require 'cloudstack_helper'
|
7
|
+
|
8
|
+
options = []
|
9
|
+
command = nil
|
10
|
+
conf_file = "cloudstack.yaml"
|
11
|
+
opts = OptionParser.new(nil, 24, ' ')
|
12
|
+
opts.banner = 'Usage: cloudstack_rb -c conf -x command param1=value1 param2=value2'
|
13
|
+
opts.on('-x', '--execute COMMAND', 'command to execute. See CloudStack API for list of commands.') do |opt|
|
14
|
+
command = opt
|
15
|
+
end
|
16
|
+
opts.on('-c', '--conf FILE', 'YAML config file that stores api and secret key') do |opt|
|
17
|
+
conf_file = opt
|
18
|
+
end
|
19
|
+
opts.on_tail('-h', '--help', 'Show this message.') do
|
20
|
+
puts opts
|
21
|
+
exit
|
22
|
+
end
|
23
|
+
|
24
|
+
params = opts.parse(ARGV)
|
25
|
+
|
26
|
+
if ARGV.length == 0
|
27
|
+
puts opts
|
28
|
+
exit
|
29
|
+
end
|
30
|
+
|
31
|
+
# Read config file for key and api url
|
32
|
+
unless File.exists?(conf_file)
|
33
|
+
abort("Unable to read config file")
|
34
|
+
end
|
35
|
+
conf = YAML.load(File.read(conf_file))
|
36
|
+
|
37
|
+
cs_helper = CloudStackHelper.new(:api_key => conf['api_key'], :secret_key => conf['secret_key'], :api_url => conf['api_url'])
|
38
|
+
|
39
|
+
params_hash= {:command => command}
|
40
|
+
params.each do |param|
|
41
|
+
tokens = param.split("=")
|
42
|
+
next unless tokens.size == 2
|
43
|
+
params_hash[tokens[0]] = tokens[1]
|
44
|
+
end
|
45
|
+
|
46
|
+
puts cs_helper.get(params_hash).body
|
@@ -0,0 +1,74 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'base64'
|
3
|
+
require 'rest_client'
|
4
|
+
require 'openssl'
|
5
|
+
require 'cgi'
|
6
|
+
|
7
|
+
class CloudStackHelper
|
8
|
+
CONFIGURABLE_ATTRIBUTES = [
|
9
|
+
:response,
|
10
|
+
:secret_key,
|
11
|
+
:api_key,
|
12
|
+
:api_url
|
13
|
+
]
|
14
|
+
attr_accessor *CONFIGURABLE_ATTRIBUTES
|
15
|
+
|
16
|
+
def initialize(options = {})
|
17
|
+
CONFIGURABLE_ATTRIBUTES.each do |attribute_name|
|
18
|
+
self.send("#{attribute_name}=", options[attribute_name]) if options.has_key?(attribute_name)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
# To generate the signature:
|
23
|
+
# 1. For each field-value pair (as separated by a ‘&’) in the Command String, URL encode each value so that it can be safely sent via HTTP GET.
|
24
|
+
# NOTE: Make sure all spaces are encoded as “%20” rather than “+”.
|
25
|
+
# 2. Lower case the entire Command String and sort it alphabetically via the field for each field-value pair.
|
26
|
+
# 3. Take the sorted Command String and run it through the HMAC SHA-1 hashing algorithm
|
27
|
+
# with the user’s Secret Key.
|
28
|
+
# 4. Base64 encode the resulting byte array in UTF-8 so that it can be safely transmitted via HTTP.
|
29
|
+
def generate_signature(params)
|
30
|
+
params.each { |k,v| params[k] = CGI.escape(v).gsub('+', '%20').downcase }
|
31
|
+
sorted_params = params.sort_by{|key,value| key.to_s}
|
32
|
+
|
33
|
+
data = parameterize(sorted_params, false)
|
34
|
+
|
35
|
+
hash = OpenSSL::HMAC.digest('sha1', @secret_key, data)
|
36
|
+
signature = Base64.b64encode(hash).chomp
|
37
|
+
end
|
38
|
+
|
39
|
+
def parameterize(params, escape=true)
|
40
|
+
params = params.collect do |k,v|
|
41
|
+
if escape
|
42
|
+
"#{CGI.escape(k.to_s)}=#{CGI.escape(v.to_s)}"
|
43
|
+
else
|
44
|
+
"#{k}=#{v}"
|
45
|
+
end
|
46
|
+
end
|
47
|
+
params.join('&')
|
48
|
+
end
|
49
|
+
|
50
|
+
def generate_params_str(params)
|
51
|
+
unless params[:response]
|
52
|
+
params[:response] = @response if @response
|
53
|
+
end
|
54
|
+
params[:apikey] = @api_key
|
55
|
+
params[:signature] = generate_signature(params.clone)
|
56
|
+
str = parameterize(params)
|
57
|
+
end
|
58
|
+
|
59
|
+
def request(params, api_url, method = :get)
|
60
|
+
case method
|
61
|
+
when :get
|
62
|
+
url = api_url + "?" + generate_params_str(params.clone)
|
63
|
+
response = RestClient.send(method, url)
|
64
|
+
else
|
65
|
+
raise "HTTP method #{method} not supported"
|
66
|
+
end
|
67
|
+
response
|
68
|
+
end
|
69
|
+
|
70
|
+
def get(params, api_url = nil)
|
71
|
+
api_url ||= @api_url
|
72
|
+
request(params, api_url, :get)
|
73
|
+
end
|
74
|
+
end
|
metadata
ADDED
@@ -0,0 +1,98 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: cloudstack_helper
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
hash: 9
|
5
|
+
prerelease:
|
6
|
+
segments:
|
7
|
+
- 0
|
8
|
+
- 1
|
9
|
+
version: "0.1"
|
10
|
+
platform: ruby
|
11
|
+
authors:
|
12
|
+
- Darren Dao
|
13
|
+
autorequire:
|
14
|
+
bindir: bin
|
15
|
+
cert_chain: []
|
16
|
+
|
17
|
+
date: 2012-02-03 00:00:00 Z
|
18
|
+
dependencies:
|
19
|
+
- !ruby/object:Gem::Dependency
|
20
|
+
name: rest-client
|
21
|
+
prerelease: false
|
22
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
23
|
+
none: false
|
24
|
+
requirements:
|
25
|
+
- - ~>
|
26
|
+
- !ruby/object:Gem::Version
|
27
|
+
hash: 1
|
28
|
+
segments:
|
29
|
+
- 1
|
30
|
+
- 6
|
31
|
+
- 7
|
32
|
+
version: 1.6.7
|
33
|
+
type: :runtime
|
34
|
+
version_requirements: *id001
|
35
|
+
- !ruby/object:Gem::Dependency
|
36
|
+
name: yard
|
37
|
+
prerelease: false
|
38
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
39
|
+
none: false
|
40
|
+
requirements:
|
41
|
+
- - ~>
|
42
|
+
- !ruby/object:Gem::Version
|
43
|
+
hash: 5
|
44
|
+
segments:
|
45
|
+
- 0
|
46
|
+
- 7
|
47
|
+
version: "0.7"
|
48
|
+
type: :development
|
49
|
+
version_requirements: *id002
|
50
|
+
description: cloudstack_helper is a simple ruby library that helps making request to CloudStack API easier. With cloudstack_helper, you only have to specify the command the parameters for the request and it will handle everything for you.
|
51
|
+
email:
|
52
|
+
- darrendao@gmail.com
|
53
|
+
executables:
|
54
|
+
- cloudstack_rb
|
55
|
+
extensions: []
|
56
|
+
|
57
|
+
extra_rdoc_files:
|
58
|
+
- README.md
|
59
|
+
files:
|
60
|
+
- README.md
|
61
|
+
- bin/cloudstack_rb
|
62
|
+
- lib/cloudstack_helper.rb
|
63
|
+
homepage: https://github.com/darrendao/cloudstack_helper
|
64
|
+
licenses: []
|
65
|
+
|
66
|
+
post_install_message:
|
67
|
+
rdoc_options: []
|
68
|
+
|
69
|
+
require_paths:
|
70
|
+
- lib
|
71
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
72
|
+
none: false
|
73
|
+
requirements:
|
74
|
+
- - ">="
|
75
|
+
- !ruby/object:Gem::Version
|
76
|
+
hash: 3
|
77
|
+
segments:
|
78
|
+
- 0
|
79
|
+
version: "0"
|
80
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
81
|
+
none: false
|
82
|
+
requirements:
|
83
|
+
- - ">="
|
84
|
+
- !ruby/object:Gem::Version
|
85
|
+
hash: 3
|
86
|
+
segments:
|
87
|
+
- 0
|
88
|
+
version: "0"
|
89
|
+
requirements: []
|
90
|
+
|
91
|
+
rubyforge_project:
|
92
|
+
rubygems_version: 1.8.11
|
93
|
+
signing_key:
|
94
|
+
specification_version: 3
|
95
|
+
summary: cloudstack_helper is a simple ruby library that helps making request to CloudStack API easier.
|
96
|
+
test_files: []
|
97
|
+
|
98
|
+
has_rdoc:
|