diff --git a/lib/aviator/core/request.rb b/lib/aviator/core/request.rb index 1fcad0f..132a78f 100644 --- a/lib/aviator/core/request.rb +++ b/lib/aviator/core/request.rb @@ -53,7 +53,7 @@ module Aviator def links self.class.links end - + def optional_params self.class.optional_params @@ -83,7 +83,7 @@ module Aviator def querystring? self.class.querystring? end - + def url? self.class.url? @@ -121,18 +121,34 @@ module Aviator def headers? instance_methods.include? :headers end - - + + def links @links ||= [] end + def param_aliases + @param_aliases ||= {} + end + + def params_class - all_params = required_params + optional_params + all_params = required_params + optional_params + param_aliases = self.param_aliases if all_params.length > 0 - @params_class ||= Struct.new(*all_params) + @params_class ||= Struct.new(*all_params) do + param_aliases.each do |param_alias, param_name| + define_method param_alias do + self[param_name] + end + + define_method "#{ param_alias }=" do |value| + self[param_name] = value + end + end + end end @params_class @@ -147,12 +163,12 @@ module Aviator def querystring? instance_methods.include? :querystring end - + def required_params @required_params ||= [] end - + def url? instance_methods.include? :url @@ -176,12 +192,16 @@ module Aviator self.class.send(attr_name) end end - + def param(param_name, opts={}) opts = opts.with_indifferent_access list = (opts[:required] == false ? optional_params : required_params) list << param_name unless optional_params.include?(param_name) + + if opts[:alias] + self.param_aliases[opts[:alias]] = param_name + end end end diff --git a/lib/aviator/openstack/compute/v2/admin/resize_server.rb b/lib/aviator/openstack/compute/v2/admin/resize_server.rb index 2c6c01f..cc68c9a 100644 --- a/lib/aviator/openstack/compute/v2/admin/resize_server.rb +++ b/lib/aviator/openstack/compute/v2/admin/resize_server.rb @@ -9,7 +9,7 @@ module Aviator param :id, required: true param :name, required: true - param :flavorRef, required: true + param :flavorRef, required: true, alias: :flavor_ref def body diff --git a/lib/aviator/openstack/compute/v2/public/change_admin_password.rb b/lib/aviator/openstack/compute/v2/public/change_admin_password.rb index 13d7ff8..28e7944 100644 --- a/lib/aviator/openstack/compute/v2/public/change_admin_password.rb +++ b/lib/aviator/openstack/compute/v2/public/change_admin_password.rb @@ -10,7 +10,7 @@ module Aviator link 'additional spec', 'https://answers.launchpad.net/nova/+question/228462' - param :adminPass, required: true + param :adminPass, required: true, alias: :admin_pass param :id, required: true diff --git a/lib/aviator/openstack/compute/v2/public/create_server.rb b/lib/aviator/openstack/compute/v2/public/create_server.rb index 24fa68a..baf7c08 100644 --- a/lib/aviator/openstack/compute/v2/public/create_server.rb +++ b/lib/aviator/openstack/compute/v2/public/create_server.rb @@ -7,11 +7,11 @@ module Aviator link 'documentation', 'http://docs.openstack.org/api/openstack-compute/2/content/CreateServers.html' - param :accessIPv4, required: false - param :accessIPv6, required: false - param :adminPass, required: false - param :imageRef, required: true - param :flavorRef, required: true + param :accessIPv4, required: false, alias: :access_ipv4 + param :accessIPv6, required: false, alias: :access_ipv6 + param :adminPass, required: false, alias: :admin_pass + param :imageRef, required: true, alias: :image_ref + param :flavorRef, required: true, alias: :flavor_ref param :metadata, required: false param :name, required: true param :networks, required: false diff --git a/lib/aviator/openstack/compute/v2/public/list_addresses.rb b/lib/aviator/openstack/compute/v2/public/list_addresses.rb index a2c2797..24e93fb 100644 --- a/lib/aviator/openstack/compute/v2/public/list_addresses.rb +++ b/lib/aviator/openstack/compute/v2/public/list_addresses.rb @@ -12,7 +12,7 @@ module Aviator param :id, required: true - param :networkID, required: false + param :networkID, required: false, alias: :network_id def headers diff --git a/lib/aviator/openstack/compute/v2/public/list_flavors.rb b/lib/aviator/openstack/compute/v2/public/list_flavors.rb index 09ec059..2761a53 100644 --- a/lib/aviator/openstack/compute/v2/public/list_flavors.rb +++ b/lib/aviator/openstack/compute/v2/public/list_flavors.rb @@ -8,8 +8,8 @@ module Aviator 'http://docs.openstack.org/api/openstack-compute/2/content/List_Flavors-d1e4188.html' param :details, required: false - param :minDisk, required: false - param :minRam, required: false + param :minDisk, required: false, alias: :min_disk + param :minRam, required: false, alias: :min_ram param :marker, required: false param :limit, required: false diff --git a/lib/aviator/openstack/compute/v2/public/list_images.rb b/lib/aviator/openstack/compute/v2/public/list_images.rb index fd0fb23..699731d 100644 --- a/lib/aviator/openstack/compute/v2/public/list_images.rb +++ b/lib/aviator/openstack/compute/v2/public/list_images.rb @@ -11,7 +11,7 @@ module Aviator param :server, required: false param :name, required: false param :status, required: false - param 'changes-since', required: false + param 'changes-since', required: false, alias: :changes_since param :marker, required: false param :limit, required: false param :type, required: false diff --git a/lib/aviator/openstack/compute/v2/public/list_servers.rb b/lib/aviator/openstack/compute/v2/public/list_servers.rb index 74cad0e..92c0a7c 100644 --- a/lib/aviator/openstack/compute/v2/public/list_servers.rb +++ b/lib/aviator/openstack/compute/v2/public/list_servers.rb @@ -24,7 +24,7 @@ module Aviator param :marker, required: false param :server, required: false param :status, required: false - param 'changes-since', required: false + param 'changes-since', required: false, alias: :changes_since def headers diff --git a/lib/aviator/openstack/compute/v2/public/rebuild_server.rb b/lib/aviator/openstack/compute/v2/public/rebuild_server.rb index ee788c3..b84f138 100644 --- a/lib/aviator/openstack/compute/v2/public/rebuild_server.rb +++ b/lib/aviator/openstack/compute/v2/public/rebuild_server.rb @@ -7,11 +7,11 @@ module Aviator link 'documentation', 'http://docs.openstack.org/api/openstack-compute/2/content/Rebuild_Server-d1e3538.html' - param :accessIPv4, required: false - param :accessIPv6, required: false - param :adminPass, required: true + param :accessIPv4, required: false, alias: :access_ipv4 + param :accessIPv6, required: false, alias: :access_ipv6 + param :adminPass, required: true, alias: :admin_pass param :id, required: true - param :imageRef, required: true + param :imageRef, required: true, alias: :image_ref param :metadata, required: false param :name, required: true param :personality, required: false diff --git a/lib/aviator/openstack/compute/v2/public/update_server.rb b/lib/aviator/openstack/compute/v2/public/update_server.rb index 8406bef..e599ef7 100644 --- a/lib/aviator/openstack/compute/v2/public/update_server.rb +++ b/lib/aviator/openstack/compute/v2/public/update_server.rb @@ -7,8 +7,8 @@ module Aviator link 'documentation', 'http://docs.openstack.org/api/openstack-compute/2/content/ServerUpdate.html' - param :accessIPv4, required: false - param :accessIPv6, required: false + param :accessIPv4, required: false, alias: :access_ipv4 + param :accessIPv6, required: false, alias: :access_ipv6 param :id, required: true param :name, required: false diff --git a/lib/aviator/openstack/identity/v2/admin/create_user.rb b/lib/aviator/openstack/identity/v2/admin/create_user.rb index f695a0e..b5f19ff 100644 --- a/lib/aviator/openstack/identity/v2/admin/create_user.rb +++ b/lib/aviator/openstack/identity/v2/admin/create_user.rb @@ -23,7 +23,7 @@ module Aviator param :email, required: false param :enabled, required: false - param :tenantId, required: false + param :tenantId, required: false, alias: :tenant_id def body diff --git a/lib/aviator/openstack/identity/v2/admin/update_user.rb b/lib/aviator/openstack/identity/v2/admin/update_user.rb index 388f4dd..5c11d19 100644 --- a/lib/aviator/openstack/identity/v2/admin/update_user.rb +++ b/lib/aviator/openstack/identity/v2/admin/update_user.rb @@ -19,7 +19,7 @@ module Aviator param :password, required: false param :email, required: false param :enabled, required: false - param :tenantId, required: false + param :tenantId, required: false, alias: :tenant_id def body diff --git a/lib/aviator/openstack/identity/v2/public/create_token.rb b/lib/aviator/openstack/identity/v2/public/create_token.rb index 60eb39a..ef99e05 100644 --- a/lib/aviator/openstack/identity/v2/public/create_token.rb +++ b/lib/aviator/openstack/identity/v2/public/create_token.rb @@ -14,9 +14,9 @@ module Aviator param :username, required: false param :password, required: false - param :tokenId, required: false - param :tenantName, required: false - param :tenantId, required: false + param :tokenId, required: false, alias: :token_id + param :tenantName, required: false, alias: :tenant_name + param :tenantId, required: false, alias: :tenant_id def body diff --git a/test/aviator/core/request_test.rb b/test/aviator/core/request_test.rb index ca42c4a..3bb37f5 100644 --- a/test/aviator/core/request_test.rb +++ b/test/aviator/core/request_test.rb @@ -211,6 +211,38 @@ class Aviator::Test error.message.wont_be_nil error.message.must_include "private method" end + + + it 'accepts an alias for a given parameter' do + klass = Class.new(Aviator::Request) do + param :the_param, required: true, alias: :the_alias + end + + param_val = 999 + + req = klass.new do |params| + params.the_param = param_val + end + + req.params.the_param.must_equal param_val + req.params.the_alias.must_equal param_val + end + + + it 'makes the param alias assignable' do + klass = Class.new(Aviator::Request) do + param :the_param, required: true, alias: :the_alias + end + + param_val = 999 + + req = klass.new do |params| + params.the_alias = param_val + end + + req.params.the_param.must_equal param_val + req.params.the_alias.must_equal param_val + end end diff --git a/test/aviator/openstack/compute/v2/admin/resize_server_test.rb b/test/aviator/openstack/compute/v2/admin/resize_server_test.rb index 2a979af..b7a3687 100644 --- a/test/aviator/openstack/compute/v2/admin/resize_server_test.rb +++ b/test/aviator/openstack/compute/v2/admin/resize_server_test.rb @@ -117,6 +117,15 @@ class Aviator::Test :flavorRef ] end + + + validate_attr :param_aliases do + aliases = { + flavor_ref: :flavorRef + } + + klass.param_aliases.must_equal aliases + end validate_attr :url do diff --git a/test/aviator/openstack/compute/v2/public/change_admin_password_test.rb b/test/aviator/openstack/compute/v2/public/change_admin_password_test.rb index 2b56e1d..152de5e 100644 --- a/test/aviator/openstack/compute/v2/public/change_admin_password_test.rb +++ b/test/aviator/openstack/compute/v2/public/change_admin_password_test.rb @@ -93,6 +93,15 @@ class Aviator::Test end + validate_attr :param_aliases do + aliases = { + admin_pass: :adminPass + } + + klass.param_aliases.must_equal aliases + end + + validate_attr :url do service_spec = get_session_data[:access][:serviceCatalog].find{|s| s[:type] == 'compute' } server_id = '105b09f0b6500d36168480ad84' diff --git a/test/aviator/openstack/compute/v2/public/create_server_test.rb b/test/aviator/openstack/compute/v2/public/create_server_test.rb index b564f33..ef34ebd 100644 --- a/test/aviator/openstack/compute/v2/public/create_server_test.rb +++ b/test/aviator/openstack/compute/v2/public/create_server_test.rb @@ -119,7 +119,20 @@ class Aviator::Test request.url.must_equal url end - + + + validate_attr :param_aliases do + aliases = { + access_ipv4: :accessIPv4, + access_ipv6: :accessIPv6, + admin_pass: :adminPass, + image_ref: :imageRef, + flavor_ref: :flavorRef + } + + klass.param_aliases.must_equal aliases + end + validate_response 'parameters are provided' do image_id = session.compute_service.request(:list_images).body[:images].first[:id] diff --git a/test/aviator/openstack/compute/v2/public/list_addresses_test.rb b/test/aviator/openstack/compute/v2/public/list_addresses_test.rb index 30acc6e..051ac65 100644 --- a/test/aviator/openstack/compute/v2/public/list_addresses_test.rb +++ b/test/aviator/openstack/compute/v2/public/list_addresses_test.rb @@ -108,6 +108,15 @@ class Aviator::Test end + validate_attr :param_aliases do + aliases = { + network_id: :networkID + } + + klass.param_aliases.must_equal aliases + end + + validate_response 'a valid server id is provided' do server_id = session.compute_service.request(:list_servers).body[:servers].first[:id] diff --git a/test/aviator/openstack/compute/v2/public/list_flavors_test.rb b/test/aviator/openstack/compute/v2/public/list_flavors_test.rb index ffcb94e..429bb5f 100644 --- a/test/aviator/openstack/compute/v2/public/list_flavors_test.rb +++ b/test/aviator/openstack/compute/v2/public/list_flavors_test.rb @@ -17,11 +17,11 @@ class Aviator::Test ) @session.authenticate end - + @session end - - + + def get_session_data session.send :auth_info end @@ -40,38 +40,38 @@ class Aviator::Test validate_attr :anonymous? do klass.anonymous?.must_equal false end - - + + validate_attr :api_version do klass.api_version.must_equal :v2 end - - + + validate_attr :body do - klass.body?.must_equal false + klass.body?.must_equal false create_request.body?.must_equal false end - - + + validate_attr :endpoint_type do klass.endpoint_type.must_equal :public end - - + + validate_attr :headers do headers = { 'X-Auth-Token' => get_session_data[:access][:token][:id] } - + request = create_request(get_session_data) - + request.headers.must_equal headers end - - + + validate_attr :http_method do create_request.http_method.must_equal :get end - - + + validate_attr :optional_params do klass.optional_params.must_equal [ :details, @@ -81,17 +81,17 @@ class Aviator::Test :limit ] end - - + + validate_attr :required_params do klass.required_params.must_equal [] end - - + + validate_attr :url do service_spec = get_session_data[:access][:serviceCatalog].find{|s| s[:type] == 'compute' } url = "#{ service_spec[:endpoints][0][:publicURL] }/flavors" - + params = [ [ :details, true ], [ :minDisk, 2 ], @@ -99,61 +99,71 @@ class Aviator::Test [ :marker, '123456' ], [ :limit, 10 ] ] - + url += "/detail" if params.find{|pair| pair[0] == :details && pair[1] == true } - + filters = [] - + params.select{|pair| pair[0]!=:details }.each{ |pair| filters << "#{ pair[0] }=#{ pair[1] }" } - + url += "?#{ filters.join('&') }" unless filters.empty? - + request = klass.new(get_session_data) do |p| params.each { |pair| p[pair[0]] = pair[1] } end - + request.url.must_equal url end - - + + + validate_attr :param_aliases do + aliases = { + min_disk: :minDisk, + min_ram: :minRam + } + + klass.param_aliases.must_equal aliases + end + + validate_response 'no parameters are provided' do response = session.compute_service.request :list_flavors - + response.status.must_equal 200 response.body.wont_be_nil response.headers.wont_be_nil end - - + + validate_response 'the details filter is provided' do response = session.compute_service.request :list_flavors do |params| params[:details] = true end - + response.status.must_equal 200 response.body.wont_be_nil response.body[:flavors].length.wont_equal 0 response.headers.wont_be_nil - end + end validate_response 'the minDisk filter is provided' do response = session.compute_service.request :list_flavors do |params| params[:details] = true end - + max_disk_size = response.body[:flavors].max{|a,b| a[:disk] <=> b[:disk] }[:disk] total_entries = response.body[:flavors].count{|flv| flv[:disk] == max_disk_size } - + response = session.compute_service.request :list_flavors do |params| params[:minDisk] = max_disk_size end - + response.status.must_equal 200 response.body.wont_be_nil response.body[:flavors].length.must_equal total_entries response.headers.wont_be_nil - end + end end diff --git a/test/aviator/openstack/compute/v2/public/list_images_test.rb b/test/aviator/openstack/compute/v2/public/list_images_test.rb index 15a2863..9fced3a 100644 --- a/test/aviator/openstack/compute/v2/public/list_images_test.rb +++ b/test/aviator/openstack/compute/v2/public/list_images_test.rb @@ -14,14 +14,14 @@ class Aviator::Test provider: 'openstack', service: 'identity' ) - + bootstrap = RequestHelper.admin_bootstrap_session_data - + response = service.request :create_token, session_data: bootstrap do |params| auth_credentials = Environment.openstack_admin[:auth_credentials] auth_credentials.each { |key, value| params[key] = auth_credentials[key] } end - + response.body end @@ -39,35 +39,35 @@ class Aviator::Test validate_attr :anonymous? do klass.anonymous?.must_equal false end - - + + validate_attr :api_version do klass.api_version.must_equal :v2 end validate_attr :body do - klass.body?.must_equal false + klass.body?.must_equal false create_request.body?.must_equal false end - - + + validate_attr :endpoint_type do klass.endpoint_type.must_equal :public end - + validate_attr :headers do session_data = new_session_data - + headers = { 'X-Auth-Token' => session_data[:access][:token][:id] } request = create_request(session_data) request.headers.must_equal headers end - - + + validate_attr :http_method do create_request.http_method.must_equal :get end @@ -96,81 +96,90 @@ class Aviator::Test session_data = new_session_data service_spec = session_data[:access][:serviceCatalog].find{|s| s[:type] == 'compute' } url = "#{ service_spec[:endpoints][0][:publicURL] }/images" - + params = [ [ :details, true ], [ :name, 'cirros-0.3.1-x86_64-uec-ramdisk' ], [ :status, 'ACTIVE' ], [ :type, 'application/vnd.openstack.image' ] ] - + url += "/detail" if params.first[1] - + filters = [] - + params[1, params.length-1].each { |pair| filters << "#{ pair[0] }=#{ pair[1] }" } - + url += "?#{ filters.join('&') }" unless filters.empty? - + request = klass.new(session_data) do |p| params.each { |pair| p[pair[0]] = pair[1] } end - - + + request.url.must_equal url end - - + + + validate_attr :param_aliases do + aliases = { + changes_since: 'changes-since' + } + + klass.param_aliases.must_equal aliases + end + + validate_response 'no parameters are provided' do service = Aviator::Service.new( provider: 'openstack', service: 'compute', default_session_data: new_session_data ) - + response = service.request :list_images - + response.status.must_equal 200 response.body.wont_be_nil response.headers.wont_be_nil end - - + + validate_response 'parameters are invalid' do service = Aviator::Service.new( provider: 'openstack', service: 'compute', default_session_data: new_session_data ) - + response = service.request :list_images do |params| params[:name] = "nonexistentimagenameherpderp" end - + response.status.must_equal 200 response.body.wont_be_nil response.body[:images].length.must_equal 0 response.headers.wont_be_nil end - - + + validate_response 'parameters are valid' do service = Aviator::Service.new( provider: 'openstack', service: 'compute', default_session_data: new_session_data ) - + response = service.request :list_images do |params| params[:details] = true params[:name] = "cirros-0.3.1-x86_64-uec" end - + response.status.must_equal 200 response.body.wont_be_nil response.body[:images].length.must_equal 1 response.headers.wont_be_nil - end + end end diff --git a/test/aviator/openstack/compute/v2/public/list_servers_test.rb b/test/aviator/openstack/compute/v2/public/list_servers_test.rb index 96b80a0..54b94c3 100644 --- a/test/aviator/openstack/compute/v2/public/list_servers_test.rb +++ b/test/aviator/openstack/compute/v2/public/list_servers_test.rb @@ -136,6 +136,15 @@ class Aviator::Test end + validate_attr :param_aliases do + aliases = { + changes_since: 'changes-since' + } + + klass.param_aliases.must_equal aliases + end + + validate_response 'no parameters are provided' do service = Aviator::Service.new( provider: 'openstack', diff --git a/test/aviator/openstack/compute/v2/public/rebuild_server_test.rb b/test/aviator/openstack/compute/v2/public/rebuild_server_test.rb index e1fac64..47809ad 100644 --- a/test/aviator/openstack/compute/v2/public/rebuild_server_test.rb +++ b/test/aviator/openstack/compute/v2/public/rebuild_server_test.rb @@ -118,6 +118,18 @@ class Aviator::Test end + validate_attr :param_aliases do + aliases = { + access_ipv4: :accessIPv4, + access_ipv6: :accessIPv6, + admin_pass: :adminPass, + image_ref: :imageRef + } + + klass.param_aliases.must_equal aliases + end + + validate_response 'valid params are provided' do server = session.compute_service.request(:list_servers).body[:servers].first server_id = server[:id] diff --git a/test/aviator/openstack/compute/v2/public/update_server_test.rb b/test/aviator/openstack/compute/v2/public/update_server_test.rb index 88957b0..1acd6d1 100644 --- a/test/aviator/openstack/compute/v2/public/update_server_test.rb +++ b/test/aviator/openstack/compute/v2/public/update_server_test.rb @@ -107,6 +107,16 @@ class Aviator::Test end + validate_attr :param_aliases do + aliases = { + access_ipv4: :accessIPv4, + access_ipv6: :accessIPv6 + } + + klass.param_aliases.must_equal aliases + end + + validate_response 'valid server id is provided' do server = session.compute_service.request(:list_servers).body[:servers].first server_id = server[:id] diff --git a/test/aviator/openstack/identity/v2/admin/create_user_test.rb b/test/aviator/openstack/identity/v2/admin/create_user_test.rb index 7ff1e2e..7719ac4 100644 --- a/test/aviator/openstack/identity/v2/admin/create_user_test.rb +++ b/test/aviator/openstack/identity/v2/admin/create_user_test.rb @@ -119,6 +119,15 @@ class Aviator::Test end + validate_attr :param_aliases do + aliases = { + tenant_id: :tenantId + } + + klass.param_aliases.must_equal aliases + end + + validate_response 'invalid param is provided' do service = session.identity_service diff --git a/test/aviator/openstack/identity/v2/admin/update_user_test.rb b/test/aviator/openstack/identity/v2/admin/update_user_test.rb index 7943a5f..e08c36c 100644 --- a/test/aviator/openstack/identity/v2/admin/update_user_test.rb +++ b/test/aviator/openstack/identity/v2/admin/update_user_test.rb @@ -105,6 +105,15 @@ class Aviator::Test end + validate_attr :param_aliases do + aliases = { + tenant_id: :tenantId + } + + klass.param_aliases.must_equal aliases + end + + validate_response 'valid user id is provided' do # must be hardcoded so as not to inadvertently alter random resources # in case the corresponding cassette is deleted diff --git a/test/aviator/openstack/identity/v2/public/create_token_test.rb b/test/aviator/openstack/identity/v2/public/create_token_test.rb index 7818718..71e3647 100644 --- a/test/aviator/openstack/identity/v2/public/create_token_test.rb +++ b/test/aviator/openstack/identity/v2/public/create_token_test.rb @@ -78,20 +78,31 @@ class Aviator::Test create_request.url.must_equal url end - - + + validate_attr :url, 'when the host uri contains the api version' do host_uri = 'http://x.y.z:5000/v2.0' - + request = klass.new({ auth_service: { host_uri: host_uri } }) do |params| params[:username] = Environment.openstack_admin[:auth_credentials][:username] params[:password] = Environment.openstack_admin[:auth_credentials][:password] end - + request.url.must_equal "#{ host_uri }/tokens" end + validate_attr :param_aliases do + aliases = { + token_id: :tokenId, + tenant_name: :tenantName, + tenant_id: :tenantId + } + + klass.param_aliases.must_equal aliases + end + + validate_response 'parameters are invalid' do service = Aviator::Service.new( provider: 'openstack',