occi-api 4.0.0.alpha.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/.gitignore +15 -0
- data/.rspec +1 -0
- data/.travis.yml +43 -0
- data/.yardopts +1 -0
- data/AUTHORS +9 -0
- data/Gemfile +16 -0
- data/LICENSE +13 -0
- data/README.md +344 -0
- data/Rakefile +37 -0
- data/examples/dsl_example.rb +167 -0
- data/examples/x509auth_example.rb +161 -0
- data/ext/mkrf_conf.rb +34 -0
- data/features/cassettes/Create_an_OCCI_Resource/_http_http___141_5_99_69__text_plain_201_.yml +288 -0
- data/features/cassettes/Delete_an_OCCI_Resource/_http_http___141_5_99_69__text_plain_201_.yml +288 -0
- data/features/cassettes/Discovery_Interface/Retrieving_all_OCCI_Categories_supported_by_the_OCCI_Server/_http_http___141_5_99_69__application_json_200_.yml +333 -0
- data/features/cassettes/Discovery_Interface/Retrieving_all_OCCI_Categories_supported_by_the_OCCI_Server/_http_http___141_5_99_69__text_plain_200_.yml +529 -0
- data/features/cassettes/Discovery_Interface/Retrieving_all_OCCI_Categories_supported_by_the_OCCI_Server/_http_http___141_5_99_69__text_plain_200_action_.yml +288 -0
- data/features/cassettes/Miscellaneous_operation_on_an_OCCI_Resource/_http_http___141_5_99_69__text_plain_201_.yml +288 -0
- data/features/cassettes/Read_an_OCCI_Resource/_http_http___141_5_99_69__text_plain_201_.yml +288 -0
- data/features/cassettes/Update_an_OCCI_Resource/_http_http___141_5_99_69__text_plain_201_.yml +288 -0
- data/features/common/step_definitions/common_steps.rb +32 -0
- data/features/occi/core/create/create.feature +18 -0
- data/features/occi/core/create/step_definitions/create_steps.rb +0 -0
- data/features/occi/core/delete/delete.feature +18 -0
- data/features/occi/core/delete/step_definitions/delete_steps.rb +0 -0
- data/features/occi/core/discovery_interface/discovery_interface.feature +37 -0
- data/features/occi/core/discovery_interface/step_definitions/discovery_interface_steps.rb +19 -0
- data/features/occi/core/miscellaneous/miscellaneous.feature +18 -0
- data/features/occi/core/miscellaneous/step_definitions/miscellaneous_steps.rb +0 -0
- data/features/occi/core/read/read.feature +18 -0
- data/features/occi/core/read/step_definitions/read_steps.rb +0 -0
- data/features/occi/core/update/step_definitions/update_steps.rb +0 -0
- data/features/occi/core/update/update.feature +18 -0
- data/features/occi/infrastructure/create/create.feature +18 -0
- data/features/occi/infrastructure/create/step_definitions/create_steps.rb +0 -0
- data/features/support/env.rb +16 -0
- data/lib/occi/api/client/client_amqp.rb +766 -0
- data/lib/occi/api/client/client_base.rb +689 -0
- data/lib/occi/api/client/client_http.rb +541 -0
- data/lib/occi/api/client/errors/authn_error.rb +7 -0
- data/lib/occi/api/client/errors.rb +1 -0
- data/lib/occi/api/client/http/authn_plugins/base.rb +27 -0
- data/lib/occi/api/client/http/authn_plugins/basic.rb +22 -0
- data/lib/occi/api/client/http/authn_plugins/digest.rb +22 -0
- data/lib/occi/api/client/http/authn_plugins/dummy.rb +13 -0
- data/lib/occi/api/client/http/authn_plugins/keystone.rb +61 -0
- data/lib/occi/api/client/http/authn_plugins/x509.rb +46 -0
- data/lib/occi/api/client/http/authn_plugins.rb +6 -0
- data/lib/occi/api/client/http/authn_utils.rb +87 -0
- data/lib/occi/api/client/http/httparty_fix.rb +53 -0
- data/lib/occi/api/client/http/net_http_fix.rb +21 -0
- data/lib/occi/api/dsl.rb +146 -0
- data/lib/occi/api/version.rb +5 -0
- data/lib/occi-api.rb +14 -0
- data/occi-api.gemspec +38 -0
- data/spec/cassettes/Occi_Api_Client_ClientHttp/using_media_type_text_plain/creates_a_new_compute_resource.yml +266 -0
- data/spec/cassettes/Occi_Api_Client_ClientHttp/using_media_type_text_plain/creates_a_new_network_resource.yml +266 -0
- data/spec/cassettes/Occi_Api_Client_ClientHttp/using_media_type_text_plain/creates_a_new_storage_resource.yml +266 -0
- data/spec/cassettes/Occi_Api_Client_ClientHttp/using_media_type_text_plain/deletes_a_compute_resource.yml +266 -0
- data/spec/cassettes/Occi_Api_Client_ClientHttp/using_media_type_text_plain/deletes_a_network_resource.yml +266 -0
- data/spec/cassettes/Occi_Api_Client_ClientHttp/using_media_type_text_plain/deletes_a_storage_resource.yml +266 -0
- data/spec/cassettes/Occi_Api_Client_ClientHttp/using_media_type_text_plain/deploys_an_instance_based_on_OVF_OVA_file.yml +266 -0
- data/spec/cassettes/Occi_Api_Client_ClientHttp/using_media_type_text_plain/describes_compute_resources.yml +368 -0
- data/spec/cassettes/Occi_Api_Client_ClientHttp/using_media_type_text_plain/describes_network_resources.yml +370 -0
- data/spec/cassettes/Occi_Api_Client_ClientHttp/using_media_type_text_plain/describes_storage_resources.yml +430 -0
- data/spec/cassettes/Occi_Api_Client_ClientHttp/using_media_type_text_plain/establishes_connection.yml +266 -0
- data/spec/cassettes/Occi_Api_Client_ClientHttp/using_media_type_text_plain/finds_and_describes_scoped_os_tpl_mixin.yml +266 -0
- data/spec/cassettes/Occi_Api_Client_ClientHttp/using_media_type_text_plain/finds_and_describes_scoped_resource_tpl_mixin.yml +266 -0
- data/spec/cassettes/Occi_Api_Client_ClientHttp/using_media_type_text_plain/finds_and_describes_unscoped_mixin.yml +266 -0
- data/spec/cassettes/Occi_Api_Client_ClientHttp/using_media_type_text_plain/instantiates_a_compute_resource_using_type_identifier.yml +266 -0
- data/spec/cassettes/Occi_Api_Client_ClientHttp/using_media_type_text_plain/instantiates_a_compute_resource_using_type_name.yml +266 -0
- data/spec/cassettes/Occi_Api_Client_ClientHttp/using_media_type_text_plain/instantiates_a_network_resource_using_type_identifier.yml +266 -0
- data/spec/cassettes/Occi_Api_Client_ClientHttp/using_media_type_text_plain/instantiates_a_network_resource_using_type_name.yml +266 -0
- data/spec/cassettes/Occi_Api_Client_ClientHttp/using_media_type_text_plain/instantiates_a_storage_resource_using_type_identifier.yml +266 -0
- data/spec/cassettes/Occi_Api_Client_ClientHttp/using_media_type_text_plain/instantiates_a_storage_resource_using_type_name.yml +266 -0
- data/spec/cassettes/Occi_Api_Client_ClientHttp/using_media_type_text_plain/lists_all_available_entity_type_identifiers.yml +266 -0
- data/spec/cassettes/Occi_Api_Client_ClientHttp/using_media_type_text_plain/lists_all_available_entity_types.yml +266 -0
- data/spec/cassettes/Occi_Api_Client_ClientHttp/using_media_type_text_plain/lists_all_available_link_type_identifiers.yml +266 -0
- data/spec/cassettes/Occi_Api_Client_ClientHttp/using_media_type_text_plain/lists_all_available_link_types.yml +266 -0
- data/spec/cassettes/Occi_Api_Client_ClientHttp/using_media_type_text_plain/lists_all_available_mixin_type_identifiers.yml +266 -0
- data/spec/cassettes/Occi_Api_Client_ClientHttp/using_media_type_text_plain/lists_all_available_mixin_types.yml +266 -0
- data/spec/cassettes/Occi_Api_Client_ClientHttp/using_media_type_text_plain/lists_all_available_mixins.yml +266 -0
- data/spec/cassettes/Occi_Api_Client_ClientHttp/using_media_type_text_plain/lists_all_available_resource_type_identifiers.yml +266 -0
- data/spec/cassettes/Occi_Api_Client_ClientHttp/using_media_type_text_plain/lists_all_available_resource_types.yml +266 -0
- data/spec/cassettes/Occi_Api_Client_ClientHttp/using_media_type_text_plain/lists_compute_resources.yml +308 -0
- data/spec/cassettes/Occi_Api_Client_ClientHttp/using_media_type_text_plain/lists_network_resources.yml +308 -0
- data/spec/cassettes/Occi_Api_Client_ClientHttp/using_media_type_text_plain/lists_os_tpl_mixins.yml +266 -0
- data/spec/cassettes/Occi_Api_Client_ClientHttp/using_media_type_text_plain/lists_resource_tpl_mixins.yml +266 -0
- data/spec/cassettes/Occi_Api_Client_ClientHttp/using_media_type_text_plain/lists_storage_resources.yml +310 -0
- data/spec/cassettes/Occi_Api_Client_ClientHttp/using_media_type_text_plain/refreshes_its_model.yml +485 -0
- data/spec/cassettes/Occi_Api_Client_ClientHttp/using_media_type_text_plain/triggers_an_action_on_a_compute_resource.yml +266 -0
- data/spec/cassettes/Occi_Api_Client_ClientHttp/using_media_type_text_plain/triggers_an_action_on_a_network_resource.yml +266 -0
- data/spec/cassettes/Occi_Api_Client_ClientHttp/using_media_type_text_plain/triggers_an_action_on_a_storage_resource.yml +266 -0
- data/spec/occi/api/client/client_amqp_spec.rb +158 -0
- data/spec/occi/api/client/client_http_spec.rb +292 -0
- data/spec/occi/api/client/http/authn_utils_spec.rb +55 -0
- data/spec/occi/api/client/http/httparty_fix_spec.rb +0 -0
- data/spec/occi/api/client/http/net_http_fix_spec.rb +0 -0
- data/spec/occi/api/client/http/rocci-cred-cert.pem +3 -0
- data/spec/occi/api/client/http/rocci-cred-key-jruby.pem +3 -0
- data/spec/occi/api/client/http/rocci-cred-key.pem +3 -0
- data/spec/occi/api/client/http/rocci-cred.p12 +0 -0
- data/spec/occi/api/dsl_spec.rb +21 -0
- data/spec/spec_helper.rb +38 -0
- metadata +379 -0
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
module Occi::Api::Client
|
|
2
|
+
module Http
|
|
3
|
+
module AuthnPlugins
|
|
4
|
+
|
|
5
|
+
class Keystone < Base
|
|
6
|
+
|
|
7
|
+
def setup(options = {})
|
|
8
|
+
response = @env_ref.class.head @env_ref.endpoint
|
|
9
|
+
Occi::Log.debug response.inspect
|
|
10
|
+
|
|
11
|
+
return if response.success?
|
|
12
|
+
raise ::Occi::Api::Client::Errors::AuthnError, "Keystone AuthN failed with #{response.code.to_s}!" unless response.code == 401
|
|
13
|
+
|
|
14
|
+
unless response.headers['www-authenticate'] && response.headers['www-authenticate'].start_with?('Keystone')
|
|
15
|
+
raise ::Occi::Api::Client::Errors::AuthnError, "Target endpoint is probably not OpenStack!"
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
keystone_uri = /^Keystone uri='(.+)'$/.match(response.headers['www-authenticate'])[1]
|
|
19
|
+
|
|
20
|
+
raise ::Occi::Api::Client::Errors::AuthnError, "Unable to get Keystone's URL from the response!" unless keystone_uri
|
|
21
|
+
|
|
22
|
+
headers = @env_ref.class.headers.clone
|
|
23
|
+
headers['Content-Type'] = "application/json"
|
|
24
|
+
headers['Accept'] = headers['Content-Type']
|
|
25
|
+
|
|
26
|
+
response = @env_ref.class.post(keystone_uri + "/v2.0/tokens", :body => get_keystone_req, :headers => headers)
|
|
27
|
+
Occi::Log.debug response.inspect
|
|
28
|
+
|
|
29
|
+
if response.success?
|
|
30
|
+
@env_ref.class.headers['X-Auth-Token'] = response['access']['token']['id']
|
|
31
|
+
else
|
|
32
|
+
raise ::Occi::Api::Client::Errors::AuthnError, "Unable to get a token from Keystone!"
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
private
|
|
37
|
+
|
|
38
|
+
def get_keystone_req(json = true)
|
|
39
|
+
if @options[:original_type] == "x509"
|
|
40
|
+
body = { "auth" => { "voms" => true } }
|
|
41
|
+
elsif @options[:username] && @options[:password]
|
|
42
|
+
body = {
|
|
43
|
+
"auth" => {
|
|
44
|
+
"passwordCredentials" => {
|
|
45
|
+
"username" => @options[:username],
|
|
46
|
+
"password" => @options[:password]
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
else
|
|
51
|
+
raise ::Occi::Api::Client::Errors::AuthnError, "Unable to request a token from Keystone! Chosen AuthN not supported."
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
json ? body.to_json : body
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
end
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
module Occi::Api::Client
|
|
2
|
+
module Http
|
|
3
|
+
module AuthnPlugins
|
|
4
|
+
|
|
5
|
+
class X509 < Base
|
|
6
|
+
|
|
7
|
+
def initialize(env_ref, options = {})
|
|
8
|
+
super env_ref, options
|
|
9
|
+
@fallbacks = %w(keystone)
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def setup(options = {})
|
|
13
|
+
# set up pem and optionally pem_password and ssl_ca_path
|
|
14
|
+
raise ArgumentError, "Missing required option 'user_cert' for x509 auth!" unless @options[:user_cert]
|
|
15
|
+
raise ArgumentError, "The file specified in 'user_cert' does not exist!" unless File.exists? @options[:user_cert]
|
|
16
|
+
|
|
17
|
+
# handle PKCS#12 credentials before passing them
|
|
18
|
+
# to httparty
|
|
19
|
+
if /\A(.)+\.p12\z/ =~ @options[:user_cert]
|
|
20
|
+
pem_cert = ::Occi::Api::Client::AuthnUtils.extract_pem_from_pkcs12(@options[:user_cert], @options[:user_cert_password])
|
|
21
|
+
@env_ref.class.pem pem_cert, ''
|
|
22
|
+
else
|
|
23
|
+
# httparty will handle ordinary PEM formatted credentials
|
|
24
|
+
# TODO: Issue #49, check PEM credentials in jRuby
|
|
25
|
+
pem_cert = File.open(@options[:user_cert], 'rb').read
|
|
26
|
+
@env_ref.class.pem pem_cert, @options[:user_cert_password]
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
@env_ref.class.ssl_ca_path @options[:ca_path] if @options[:ca_path]
|
|
30
|
+
@env_ref.class.ssl_ca_file @options[:ca_file] if @options[:ca_file]
|
|
31
|
+
|
|
32
|
+
if @options[:voms]
|
|
33
|
+
cert_ary = ::Occi::Api::Client::AuthnUtils.certs_to_file_ary @options[:user_cert]
|
|
34
|
+
|
|
35
|
+
# remove the first cert since it was already used as pem_cert
|
|
36
|
+
# use the rest to establish the chain of trust
|
|
37
|
+
cert_ary.shift
|
|
38
|
+
@env_ref.class.ssl_extra_chain_cert cert_ary unless cert_ary.empty?
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
end
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
require 'occi/api/client/http/authn_plugins/base'
|
|
2
|
+
require 'occi/api/client/http/authn_plugins/dummy'
|
|
3
|
+
require 'occi/api/client/http/authn_plugins/basic'
|
|
4
|
+
require 'occi/api/client/http/authn_plugins/digest'
|
|
5
|
+
require 'occi/api/client/http/authn_plugins/x509'
|
|
6
|
+
require 'occi/api/client/http/authn_plugins/keystone'
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
require 'openssl'
|
|
2
|
+
|
|
3
|
+
if defined? JRUBY_VERSION
|
|
4
|
+
require 'java'
|
|
5
|
+
end
|
|
6
|
+
|
|
7
|
+
module Occi
|
|
8
|
+
module Api
|
|
9
|
+
module Client
|
|
10
|
+
|
|
11
|
+
class AuthnUtils
|
|
12
|
+
CERT_REGEXP = /\n?(-----BEGIN CERTIFICATE-----\n.+?\n-----END CERTIFICATE-----)\n/m
|
|
13
|
+
|
|
14
|
+
# Reads credentials from a PKCS#12 compliant file. Returns
|
|
15
|
+
# X.509 certificate and decrypted private key in PEM
|
|
16
|
+
# formatted string.
|
|
17
|
+
#
|
|
18
|
+
# @example
|
|
19
|
+
# extract_pem_from_pkcs12 "~/.globus/usercert.p12", "123456"
|
|
20
|
+
# # => #<String>
|
|
21
|
+
#
|
|
22
|
+
# @param [String] Path to a PKCS#12 file with credentials
|
|
23
|
+
# @param [String] Password needed to unlock the PKCS#12 file
|
|
24
|
+
# @return [String] Decrypted credentials in a PEM formatted string
|
|
25
|
+
def self.extract_pem_from_pkcs12(path_to_p12_file, p12_password)
|
|
26
|
+
# decode certificate and its private key
|
|
27
|
+
pem_from_pkcs12 = ""
|
|
28
|
+
if defined? JRUBY_VERSION
|
|
29
|
+
# Java-based Ruby, read PKCS12 manually
|
|
30
|
+
# using KeyStore
|
|
31
|
+
keystore = Java::JavaSecurity::KeyStore.getInstance("PKCS12")
|
|
32
|
+
p12_input_stream = Java::JavaIo::FileInputStream.new(path_to_p12_file)
|
|
33
|
+
pass_char_array = Java::JavaLang::String.new(p12_password).to_char_array
|
|
34
|
+
|
|
35
|
+
# load and unlock PKCS#12 store
|
|
36
|
+
keystore.load p12_input_stream, pass_char_array
|
|
37
|
+
|
|
38
|
+
# read the first certificate and PK
|
|
39
|
+
cert = keystore.getCertificate("1")
|
|
40
|
+
pk = keystore.getKey("1", pass_char_array)
|
|
41
|
+
|
|
42
|
+
pem_from_pkcs12 << "-----BEGIN CERTIFICATE-----\n"
|
|
43
|
+
pem_from_pkcs12 << Java::JavaxXmlBind::DatatypeConverter.printBase64Binary(cert.getEncoded())
|
|
44
|
+
pem_from_pkcs12 << "\n-----END CERTIFICATE-----"
|
|
45
|
+
|
|
46
|
+
pem_from_pkcs12 << "\n"
|
|
47
|
+
|
|
48
|
+
pem_from_pkcs12 << "-----BEGIN PRIVATE KEY-----\n"
|
|
49
|
+
pem_from_pkcs12 << Java::JavaxXmlBind::DatatypeConverter.printBase64Binary(pk.getEncoded())
|
|
50
|
+
pem_from_pkcs12 << "\n-----END PRIVATE KEY-----"
|
|
51
|
+
else
|
|
52
|
+
# C-based Ruby, use OpenSSL::PKCS12
|
|
53
|
+
pkcs12 = OpenSSL::PKCS12.new(
|
|
54
|
+
File.open(
|
|
55
|
+
path_to_p12_file,
|
|
56
|
+
'rb'
|
|
57
|
+
),
|
|
58
|
+
p12_password
|
|
59
|
+
)
|
|
60
|
+
|
|
61
|
+
# store cert and private key in a single PEM formatted string
|
|
62
|
+
pem_from_pkcs12 << pkcs12.certificate.to_pem << pkcs12.key.to_pem
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
pem_from_pkcs12
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
# Reads X.509 certificates from a file to an array.
|
|
69
|
+
#
|
|
70
|
+
# @example
|
|
71
|
+
# certs_to_file_ary "~/.globus/usercert.pem"
|
|
72
|
+
# # => [#<String>, #<String>, ...]
|
|
73
|
+
#
|
|
74
|
+
# @param [String] Path to a PEM file containing certificates
|
|
75
|
+
# @return [Array<String>] An array of read certificates
|
|
76
|
+
def self.certs_to_file_ary(ca_file)
|
|
77
|
+
# TODO: read and separate multiple certificates
|
|
78
|
+
certs_str = File.open(ca_file).read
|
|
79
|
+
|
|
80
|
+
certs_ary = certs_str.scan(CERT_REGEXP)
|
|
81
|
+
certs_ary ? certs_ary.flatten : []
|
|
82
|
+
end
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
end
|
|
86
|
+
end
|
|
87
|
+
end
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
module HTTParty
|
|
2
|
+
class ConnectionAdapter
|
|
3
|
+
|
|
4
|
+
private
|
|
5
|
+
|
|
6
|
+
def attach_ssl_certificates(http, options)
|
|
7
|
+
if http.use_ssl?
|
|
8
|
+
http.verify_mode = OpenSSL::SSL::VERIFY_NONE
|
|
9
|
+
|
|
10
|
+
# Client certificate authentication
|
|
11
|
+
if options[:pem]
|
|
12
|
+
http.cert = OpenSSL::X509::Certificate.new(options[:pem])
|
|
13
|
+
http.key = OpenSSL::PKey::RSA.new(options[:pem], options[:pem_password])
|
|
14
|
+
http.verify_mode = OpenSSL::SSL::VERIFY_PEER
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
# Set chain of client certificates
|
|
18
|
+
if options[:ssl_extra_chain_cert]
|
|
19
|
+
http.extra_chain_cert = []
|
|
20
|
+
|
|
21
|
+
options[:ssl_extra_chain_cert].each do |p_ca|
|
|
22
|
+
http.extra_chain_cert << OpenSSL::X509::Certificate.new(p_ca)
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
# SSL certificate authority file and/or directory
|
|
27
|
+
if options[:ssl_ca_file]
|
|
28
|
+
http.ca_file = options[:ssl_ca_file]
|
|
29
|
+
http.verify_mode = OpenSSL::SSL::VERIFY_PEER
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
if options[:ssl_ca_path]
|
|
33
|
+
http.ca_path = options[:ssl_ca_path]
|
|
34
|
+
http.verify_mode = OpenSSL::SSL::VERIFY_PEER
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
# This is only Ruby 1.9+
|
|
38
|
+
if options[:ssl_version] && http.respond_to?(:ssl_version=)
|
|
39
|
+
http.ssl_version = options[:ssl_version]
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
module ClassMethods
|
|
47
|
+
|
|
48
|
+
def ssl_extra_chain_cert(ary_of_certs)
|
|
49
|
+
default_options[:ssl_extra_chain_cert] = ary_of_certs
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
end
|
|
53
|
+
end
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
##############################################################################
|
|
2
|
+
## Net::HTTP hack allowing the use of X.509 proxy certificates.
|
|
3
|
+
##############################################################################
|
|
4
|
+
|
|
5
|
+
module Net
|
|
6
|
+
class HTTP
|
|
7
|
+
|
|
8
|
+
if defined? SSL_ATTRIBUTES
|
|
9
|
+
# For Rubies 1.9.x
|
|
10
|
+
old_verbose, $VERBOSE = $VERBOSE, nil
|
|
11
|
+
SSL_ATTRIBUTES = SSL_ATTRIBUTES.concat %w(extra_chain_cert)
|
|
12
|
+
$VERBOSE = old_verbose
|
|
13
|
+
|
|
14
|
+
attr_accessor :extra_chain_cert
|
|
15
|
+
else
|
|
16
|
+
# For legacy Rubies 1.8.x
|
|
17
|
+
ssl_context_accessor :extra_chain_cert
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
end
|
|
21
|
+
end
|
data/lib/occi/api/dsl.rb
ADDED
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
module Occi
|
|
2
|
+
module Api
|
|
3
|
+
module Dsl
|
|
4
|
+
|
|
5
|
+
def connect(protocol, *args)
|
|
6
|
+
|
|
7
|
+
case protocol
|
|
8
|
+
when :http
|
|
9
|
+
@client = Occi::Api::Client::ClientHttp.new(*args)
|
|
10
|
+
when :amqp
|
|
11
|
+
@client = Occi::Api::Client::ClientAmqp.new(*args)
|
|
12
|
+
else
|
|
13
|
+
raise "Protocol #{protocol.to_s} is not supported!"
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
true
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def list(*args)
|
|
20
|
+
check
|
|
21
|
+
|
|
22
|
+
@client.list(*args)
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def describe(*args)
|
|
26
|
+
check
|
|
27
|
+
|
|
28
|
+
@client.describe(*args)
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def create(*args)
|
|
32
|
+
check
|
|
33
|
+
|
|
34
|
+
@client.create(*args)
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def delete(*args)
|
|
38
|
+
check
|
|
39
|
+
|
|
40
|
+
@client.delete(*args)
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
def trigger(*args)
|
|
44
|
+
check
|
|
45
|
+
|
|
46
|
+
@client.trigger(*args)
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
def refresh
|
|
50
|
+
check
|
|
51
|
+
|
|
52
|
+
@client.refresh
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
def model
|
|
56
|
+
check
|
|
57
|
+
|
|
58
|
+
@client.model
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
###
|
|
62
|
+
|
|
63
|
+
def resource_types
|
|
64
|
+
check
|
|
65
|
+
|
|
66
|
+
@client.get_resource_types
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
def resource_type_identifiers
|
|
70
|
+
check
|
|
71
|
+
|
|
72
|
+
@client.get_resource_type_identifiers
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
def mixin_type_identifiers
|
|
76
|
+
check
|
|
77
|
+
|
|
78
|
+
@client.get_mixin_type_identifiers
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
def mixin_types
|
|
82
|
+
check
|
|
83
|
+
|
|
84
|
+
@client.get_mixin_types
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
def entity_types
|
|
88
|
+
check
|
|
89
|
+
|
|
90
|
+
@client.get_entity_types
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
def entity_type_identifiers
|
|
94
|
+
check
|
|
95
|
+
|
|
96
|
+
@client.get_entity_type_identifiers
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
def entity_types_related_to(*args)
|
|
100
|
+
check
|
|
101
|
+
|
|
102
|
+
@client.get_entity_types_related_to(*args)
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
def link_types
|
|
106
|
+
check
|
|
107
|
+
|
|
108
|
+
@client.get_link_types
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
def link_type_identifiers
|
|
112
|
+
check
|
|
113
|
+
|
|
114
|
+
@client.get_link_type_identifiers
|
|
115
|
+
end
|
|
116
|
+
|
|
117
|
+
###
|
|
118
|
+
|
|
119
|
+
def mixins(*args)
|
|
120
|
+
check
|
|
121
|
+
|
|
122
|
+
@client.get_mixins(*args)
|
|
123
|
+
end
|
|
124
|
+
|
|
125
|
+
def resource(*args)
|
|
126
|
+
check
|
|
127
|
+
|
|
128
|
+
@client.get_resource(*args)
|
|
129
|
+
end
|
|
130
|
+
|
|
131
|
+
def mixin(*args)
|
|
132
|
+
check
|
|
133
|
+
|
|
134
|
+
@client.find_mixin(*args)
|
|
135
|
+
end
|
|
136
|
+
|
|
137
|
+
private
|
|
138
|
+
|
|
139
|
+
def check
|
|
140
|
+
raise "You have to issue 'connect' first!" if @client.nil?
|
|
141
|
+
raise "Client is disconnected!" unless @client.connected
|
|
142
|
+
end
|
|
143
|
+
|
|
144
|
+
end
|
|
145
|
+
end
|
|
146
|
+
end
|
data/lib/occi-api.rb
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
require 'rubygems'
|
|
2
|
+
require 'rubygems/package'
|
|
3
|
+
|
|
4
|
+
require 'occi-core'
|
|
5
|
+
|
|
6
|
+
module Occi::Api; end
|
|
7
|
+
|
|
8
|
+
require 'occi/api/version'
|
|
9
|
+
require 'occi/api/client/client_base'
|
|
10
|
+
require 'occi/api/client/errors'
|
|
11
|
+
require 'occi/api/client/http/authn_plugins'
|
|
12
|
+
require 'occi/api/client/client_http'
|
|
13
|
+
require 'occi/api/client/client_amqp'
|
|
14
|
+
require 'occi/api/dsl'
|
data/occi-api.gemspec
ADDED
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
# coding: utf-8
|
|
2
|
+
lib = File.expand_path('../lib/', __FILE__)
|
|
3
|
+
$:.unshift lib unless $:.include?(lib)
|
|
4
|
+
|
|
5
|
+
require 'occi/api/version'
|
|
6
|
+
|
|
7
|
+
Gem::Specification.new do |gem|
|
|
8
|
+
gem.name = "occi-api"
|
|
9
|
+
gem.version = Occi::Api::VERSION
|
|
10
|
+
gem.authors = ["Florian Feldhaus","Piotr Kasprzak", "Boris Parak"]
|
|
11
|
+
gem.email = ["florian.feldhaus@gwdg.de", "piotr.kasprzak@gwdg.de", "xparak@mail.muni.cz"]
|
|
12
|
+
gem.description = %q{OCCI is a collection of classes to simplify the implementation of the Open Cloud Computing API in Ruby}
|
|
13
|
+
gem.summary = %q{OCCI toolkit}
|
|
14
|
+
gem.homepage = 'https://github.com/gwdg/rOCCI-api'
|
|
15
|
+
|
|
16
|
+
gem.files = `git ls-files`.split("\n")
|
|
17
|
+
gem.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
|
18
|
+
gem.require_paths = ["lib"]
|
|
19
|
+
gem.extensions = 'ext/mkrf_conf.rb'
|
|
20
|
+
|
|
21
|
+
gem.add_dependency 'occi-core'
|
|
22
|
+
gem.add_dependency 'httparty'
|
|
23
|
+
gem.add_dependency 'amqp'
|
|
24
|
+
gem.add_dependency 'json'
|
|
25
|
+
|
|
26
|
+
gem.add_development_dependency "rspec"
|
|
27
|
+
gem.add_development_dependency "rake"
|
|
28
|
+
gem.add_development_dependency "builder"
|
|
29
|
+
gem.add_development_dependency "simplecov"
|
|
30
|
+
gem.add_development_dependency "yard"
|
|
31
|
+
gem.add_development_dependency "yard-sinatra"
|
|
32
|
+
gem.add_development_dependency "yard-rspec"
|
|
33
|
+
gem.add_development_dependency "yard-cucumber"
|
|
34
|
+
gem.add_development_dependency "rspec-http"
|
|
35
|
+
gem.add_development_dependency "webmock", "~>1.9.3"
|
|
36
|
+
|
|
37
|
+
gem.required_ruby_version = ">= 1.8.7"
|
|
38
|
+
end
|