cloud_stack_client 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,155 @@
1
+ # The Connector assists in the interaction with the CloudStack API using a simple interface.
2
+
3
+ require "cloud_stack_client/api.rb"
4
+
5
+ # Simple class to interact with the CloudStack API
6
+ #
7
+ # @example The server URI is passed on instance creation
8
+ # connector = CloudStackClient::Connector.new('http://example.com/client/api')
9
+ # # or
10
+ # connector = CloudStackClient::Connector.new(:api_uri => 'https://example.com/client/api', :api_key => 'MyKeY', :secret_key => 'mYsEcReT')
11
+ # @example Login with Username, Passwort and Domain if API Key and Secret Key are not available
12
+ # connector.login('MyUser', 'MyPassword', 'MyDomain') # => true or false
13
+ # @example Execute an arbitrary command
14
+ # connector.listVirtualMachines # => Raw result record as REXML::Document
15
+ # connector.listVirtualMachines(:response => :json, :state => :running) # => Hash with result record
16
+ class CloudStackClient::Connector
17
+ # Connection credentials and settings. Defaults to {CloudStackClient::API_DEFAULTS}.
18
+ # @return [Hash]
19
+ attr_accessor :config
20
+
21
+ # Create API Connector.
22
+ #
23
+ # Configuration can passed as configuration Hash or as String containing the API URL.
24
+ #
25
+ # @param config [String, Hash] URI of the Service API or Hash with configuration parameters
26
+ # @see CloudStackClient::API_DEFAULTS
27
+ def initialize(config = {})
28
+ if config.is_a? String
29
+ if config.length > 0
30
+ config = {:api_uri => config}
31
+ if config[:api_uri].index("/api")
32
+ config[:web_uri] = config[:api_uri].sub("/api", "")
33
+ end
34
+ else
35
+ config = {}
36
+ end
37
+ end
38
+ @config = CloudStackClient::API_DEFAULTS.dup
39
+ config.each {|key, value| @config[key.to_sym] = value}
40
+ @credentials = {}
41
+ @credentials[:api_key] = @config[:api_key] if @config[:api_key]
42
+ @credentials[:secret_key] = @config[:secret_key] if @config[:secret_key]
43
+ end
44
+
45
+ # Login with username and plain text password
46
+ #
47
+ # @param username [String]
48
+ # @param password [String] Plain text password
49
+ # @param domain [String] Login Domain. The / prefix can be omitted
50
+ # @return [Boolean] true if successful
51
+ def login(username, password, domain = "")
52
+ password ||= ""
53
+ login_hashed username, CloudStackClient::Helpers::hash_password(password), domain
54
+ end
55
+
56
+ # Login with username and hashed password
57
+ #
58
+ # @param username [String]
59
+ # @param password_hash [String] Password hash
60
+ # @param domain [String] Login Domain. The / prefix can be omitted
61
+ # @return [Boolean] true if successful
62
+ # @see CloudStackClient::Helpers::hash_password
63
+ def login_hashed(username, password_hash, domain = "")
64
+ result = CloudStackClient::API::get_credentials @config[:api_uri], username, password_hash, domain, @config[:http_method], @config[:ssl_check]
65
+ if result
66
+ @credentials = result
67
+ true
68
+ else
69
+ false
70
+ end
71
+ end
72
+
73
+ # Login with API Key and Secret Key
74
+ #
75
+ # @param api_key [String]
76
+ # @param secret_key [String]
77
+ # @return [Boolean] true if successful
78
+ def login_with_keys(api_key, secret_key)
79
+ if CloudStackClient::API::verify_keys(@config[:api_uri], api_key, secret_key, @config[:http_method], @config[:ssl_check])
80
+ @credentials[:api_key] = api_key
81
+ @credentials[:secret_key] = secret_key
82
+ true
83
+ else
84
+ false
85
+ end
86
+ end
87
+
88
+ # Check whether valid login credentials are present
89
+ #
90
+ # @return [Boolean]
91
+ def authenticated?
92
+ if @credentials.any? && query({:command => "listCapabilities"})
93
+ true
94
+ else
95
+ false
96
+ end
97
+ end
98
+
99
+ # Send a command
100
+ #
101
+ # @param parameters [Hash, Array] Hash or Array of [Key, Value] pairs containing all query parameters
102
+ # @return [REXML::Document, Hash, String] The query result depending on the HTTP response content type
103
+ def query(parameters)
104
+ CloudStackClient::API::query(@config[:api_uri], parameters, @credentials, @config[:http_method], @config[:ssl_check])
105
+ end
106
+
107
+ # Send a command and merge all result pages
108
+ #
109
+ # If the result spans multiple pages, multiple calls are executed to retrieve all pages. These will be returned as one.
110
+ #
111
+ # @param parameters [Hash, Array] Hash or Array of [Key, Value] pairs containing all query parameters
112
+ # @return [REXML::Document, Hash, String] The query result depending on the HTTP response content type
113
+ def query_all_pages(parameters)
114
+ CloudStackClient::API::query_with_auto_paging(@config[:api_uri], parameters, @credentials, @config[:page_size], @config[:http_method], @config[:ssl_check])
115
+ end
116
+
117
+ private
118
+
119
+ # Dynamic methods are passed as commands to CloudStack
120
+ #
121
+ # @example Use dynamic methods as commands
122
+ # cs_connector = CloudStackClient::Connector.new "https://example.com/client/api"
123
+ # cs_connector.login "Me", "MyPass", "MyDomain"
124
+ # response = cs_connector.listVirtualMachines(:response => :json, :state => :running)
125
+ # if response.has_key? "listvirtualmachinesresponse"
126
+ # vms = response["listvirtualmachinesresponse"]["virtualmachine"]
127
+ # cs_connector.stopVirtualMachine :id => vms.first["id"]
128
+ # end
129
+ #
130
+ # @param method_name [String] Name of the command
131
+ # @param parameters [Hash, Array] command parameters
132
+ # @param disable_auto_paging [Boolean] (optional) If true the command will be executed with manual paging
133
+ # @return [REXML::Document, Hash] Result of the query
134
+ def method_missing(*args)
135
+ name = args.shift
136
+ parameters = args.shift
137
+ auto_paging = !args.shift
138
+ if parameters.is_a?(Hash) && !parameters.has_key?(:command)
139
+ parameters[:command] = name
140
+ elsif parameters.is_a?(Array) && !parameters.find {|pos| pos.is_a?(Array) && pos[0] == :command}
141
+ parameters << [:command => name]
142
+ else
143
+ parameters = {:command => name}
144
+ end
145
+ if auto_paging && name.to_s.downcase.start_with?("list")
146
+ query_all_pages(parameters)
147
+ else
148
+ query(parameters)
149
+ end
150
+ end
151
+
152
+ def respond_to_missing?(name, private)
153
+ true
154
+ end
155
+ end
@@ -0,0 +1,29 @@
1
+ module CloudStackClient
2
+ # Default values used by CloudStackClient
3
+ API_DEFAULTS = {
4
+ :web_uri => "",
5
+ :api_uri => "",
6
+ :ssl_check => true,
7
+ :http_method => :post,
8
+ :login_parameter => "loginUrl",
9
+ :page_size => 500,
10
+ :timestamp_offset => 3600
11
+ }.freeze
12
+
13
+ # Translation of the usage types as returned by getUsageRecords
14
+ USAGE_MAP = {
15
+ 1 => :running_vm,
16
+ 2 => :allocated_vm,
17
+ 3 => :ip_address,
18
+ 4 => :network_bytes_send,
19
+ 5 => :network_bytes_received,
20
+ 6 => :volume,
21
+ 7 => :template,
22
+ 8 => :iso,
23
+ 9 => :snapshot,
24
+ 11 => :load_balancer_policy,
25
+ 12 => :port_forwarding_rule,
26
+ 13 => :network_offering,
27
+ 14 => :vpn_users
28
+ }.freeze
29
+ end
@@ -0,0 +1,7 @@
1
+ # Shared helper functions
2
+ module CloudStackClient::Helpers
3
+ # Default password hash algorithm
4
+ def self.hash_password(password)
5
+ Digest::MD5.hexdigest(password)
6
+ end
7
+ end
@@ -0,0 +1,4 @@
1
+ module CloudStackClient
2
+ # Release version number
3
+ VERSION = "0.0.1"
4
+ end
metadata ADDED
@@ -0,0 +1,66 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: cloud_stack_client
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Roman Messer
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2012-10-24 00:00:00.000000000 Z
13
+ dependencies: []
14
+ description: Execute any command against a CloudStack Infrastructure. Also contains
15
+ a commandline utility with auto paging and support to read credentials from a config
16
+ file.
17
+ email:
18
+ - roman.messer@ict-cloud.com
19
+ executables:
20
+ - cloud-stack.rb
21
+ extensions: []
22
+ extra_rdoc_files: []
23
+ files:
24
+ - .gitignore
25
+ - .hgignore
26
+ - .yardopts
27
+ - Gemfile
28
+ - MIT-LICENSE.txt
29
+ - README.md
30
+ - Rakefile
31
+ - assets/cacert.pem
32
+ - bin/cloud-stack.rb
33
+ - cloud_stack_client.gemspec
34
+ - lib/cloud_stack_client.rb
35
+ - lib/cloud_stack_client/api.rb
36
+ - lib/cloud_stack_client/cli.rb
37
+ - lib/cloud_stack_client/connector.rb
38
+ - lib/cloud_stack_client/definitions.rb
39
+ - lib/cloud_stack_client/helpers.rb
40
+ - lib/cloud_stack_client/version.rb
41
+ homepage:
42
+ licenses: []
43
+ post_install_message:
44
+ rdoc_options: []
45
+ require_paths:
46
+ - lib
47
+ required_ruby_version: !ruby/object:Gem::Requirement
48
+ none: false
49
+ requirements:
50
+ - - ! '>='
51
+ - !ruby/object:Gem::Version
52
+ version: '0'
53
+ required_rubygems_version: !ruby/object:Gem::Requirement
54
+ none: false
55
+ requirements:
56
+ - - ! '>='
57
+ - !ruby/object:Gem::Version
58
+ version: '0'
59
+ requirements: []
60
+ rubyforge_project:
61
+ rubygems_version: 1.8.24
62
+ signing_key:
63
+ specification_version: 3
64
+ summary: A simple library to work with the CloudStack API.
65
+ test_files: []
66
+ has_rdoc: