From 9e7b767feac5c39c422786ae92fa91d3c515caeb Mon Sep 17 00:00:00 2001 From: Tomokazu Hirai Date: Fri, 22 Feb 2013 16:47:22 +0900 Subject: [PATCH 01/47] supported OpenStack Quantum Router Operation. not include mock code. --- lib/fog/openstack/models/network/router.rb | 53 +++++++++++++++++++ lib/fog/openstack/models/network/routers.rb | 34 ++++++++++++ lib/fog/openstack/network.rb | 10 ++++ .../requests/network/add_router_interface.rb | 47 ++++++++++++++++ .../requests/network/create_router.rb | 46 ++++++++++++++++ .../requests/network/delete_router.rb | 30 +++++++++++ .../openstack/requests/network/get_router.rb | 48 +++++++++++++++++ .../requests/network/list_routers.rb | 27 ++++++++++ .../network/remove_router_interface.rb | 47 ++++++++++++++++ .../requests/network/update_router.rb | 46 ++++++++++++++++ 10 files changed, 388 insertions(+) create mode 100644 lib/fog/openstack/models/network/router.rb create mode 100644 lib/fog/openstack/models/network/routers.rb create mode 100644 lib/fog/openstack/requests/network/add_router_interface.rb create mode 100644 lib/fog/openstack/requests/network/create_router.rb create mode 100644 lib/fog/openstack/requests/network/delete_router.rb create mode 100644 lib/fog/openstack/requests/network/get_router.rb create mode 100644 lib/fog/openstack/requests/network/list_routers.rb create mode 100644 lib/fog/openstack/requests/network/remove_router_interface.rb create mode 100644 lib/fog/openstack/requests/network/update_router.rb diff --git a/lib/fog/openstack/models/network/router.rb b/lib/fog/openstack/models/network/router.rb new file mode 100644 index 000000000..2a19cad69 --- /dev/null +++ b/lib/fog/openstack/models/network/router.rb @@ -0,0 +1,53 @@ +require 'fog/core/model' + +module Fog + module Network + class OpenStack + class Router < Fog::Model + identity :id + + attribute :name + attribute :network_id + attribute :fixed_ips + attribute :mac_address + attribute :status + attribute :admin_state_up + attribute :device_owner + attribute :device_id + attribute :tenant_id + + def initialize(attributes) + # Old 'connection' is renamed as service and should be used instead + prepare_service_value(attributes) + super + end + + def save + requires :name + identity ? update : create + end + + def create + requires :name + merge_attributes(service.create_router(self.name, + self.attributes).body['router']) + self + end + + def update + requires :id + merge_attributes(service.update_router(self.id, + self.attributes).body['router']) + self + end + + def destroy + requires :id + service.delete_router(self.id) + true + end + + end + end + end +end diff --git a/lib/fog/openstack/models/network/routers.rb b/lib/fog/openstack/models/network/routers.rb new file mode 100644 index 000000000..79892a00c --- /dev/null +++ b/lib/fog/openstack/models/network/routers.rb @@ -0,0 +1,34 @@ +require 'fog/core/collection' +require 'fog/openstack/models/network/router' + +module Fog + module Network + class OpenStack + class Routers < Fog::Collection + + attribute :filters + + model Fog::Network::OpenStack::Router + + def initialize(attributes) + self.filters ||= {} + super + end + + def all(filters = filters) + self.filters = filters + load(service.list_routers(filters).body['routers']) + end + + def get(router_id) + if router = service.get_router(router_id).body['router'] + new(router) + end + rescue Fog::Network::OpenStack::NotFound + nil + end + + end + end + end +end diff --git a/lib/fog/openstack/network.rb b/lib/fog/openstack/network.rb index 2d84c0574..a9ee2afa0 100644 --- a/lib/fog/openstack/network.rb +++ b/lib/fog/openstack/network.rb @@ -40,6 +40,15 @@ module Fog request :get_port request :update_port + # Router CRUD + request :list_routers + request :create_router + request :delete_router + request :get_router + request :update_router + request :add_router_interface + request :remove_router_interface + # Subnet CRUD request :list_subnets request :create_subnet @@ -66,6 +75,7 @@ module Fog :ports => {}, :subnets => {}, :floating_ips => {}, + :routers => {}, } end end diff --git a/lib/fog/openstack/requests/network/add_router_interface.rb b/lib/fog/openstack/requests/network/add_router_interface.rb new file mode 100644 index 000000000..88bc7d0d5 --- /dev/null +++ b/lib/fog/openstack/requests/network/add_router_interface.rb @@ -0,0 +1,47 @@ +module Fog + module Network + class OpenStack + + class Real + def add_router_interface(router_id, subnet_id, options = {}) + data = { + 'subnet_id' => subnet_id, + } + + vanilla_options = [:name] + vanilla_options.reject{ |o| options[o].nil? }.each do |key| + data['subnet_id'][key] = options[key] + end + + request( + :body => Fog::JSON.encode(data), + :expects => [200], + :method => 'PUT', + :path => "routers/#{router_id}/add_router_interface" + ) + end + end + + class Mock + def add_router_interface(floating_ip_id, port_id, options = {}) + response = Excon::Response.new + response.status = 201 + data = { + 'id' => '00000000-0000-0000-0000-000000000000', + 'router_id' => '00000000-0000-0000-0000-000000000000', + 'tenant_id' => options["tenant_id"], + 'floating_network_id' => options["floating_network_id"], + 'fixed_ip_address' => options["fixed_ip_address"], + 'floating_ip_address' => options["floating_ip_address"], + 'port_id' => port_id, + } + + self.data[:floating_ips][data['floating_ip_id']] = data + response.body = { 'floating_ip' => data } + response + end + end + + end + end +end diff --git a/lib/fog/openstack/requests/network/create_router.rb b/lib/fog/openstack/requests/network/create_router.rb new file mode 100644 index 000000000..1bf5d2416 --- /dev/null +++ b/lib/fog/openstack/requests/network/create_router.rb @@ -0,0 +1,46 @@ +module Fog + module Network + class OpenStack + + class Real + def create_router(name, options = {}) + data = { + 'router' => { + 'name' => name, + } + } + + vanilla_options = [:admin_state_up, :tenand_id] + vanilla_options.reject{ |o| options[o].nil? }.each do |key| + data['router'][key] = options[key] + end + + request( + :body => Fog::JSON.encode(data), + :expects => [201], + :method => 'POST', + :path => 'routers' + ) + end + end + + class Mock + def create_router(name, options = {}) + response = Excon::Response.new + response.status = 201 + data = { + 'id' => Fog::Mock.random_numbers(6).to_s, + 'name' => options[:name], + 'status' => 'ACTIVE', + 'admin_state_up' => options[:admin_state_up], + 'tenant_id' => options[:tenant_id], + } + self.data[:routers][data['id']] = data + response.body = { 'router' => data } + response + end + end + + end + end +end diff --git a/lib/fog/openstack/requests/network/delete_router.rb b/lib/fog/openstack/requests/network/delete_router.rb new file mode 100644 index 000000000..5f957aab3 --- /dev/null +++ b/lib/fog/openstack/requests/network/delete_router.rb @@ -0,0 +1,30 @@ +module Fog + module Network + class OpenStack + + class Real + def delete_router(router_id) + request( + :expects => 204, + :method => 'DELETE', + :path => "routers/#{router_id}" + ) + end + end + + class Mock + def delete_router(router_id) + response = Excon::Response.new + if list_routers.body['routers'].map { |r| r['id'] }.include? router_id + self.data[:routers].delete(router_id) + response.status = 204 + response + else + raise Fog::Network::OpenStack::NotFound + end + end + end + + end + end +end diff --git a/lib/fog/openstack/requests/network/get_router.rb b/lib/fog/openstack/requests/network/get_router.rb new file mode 100644 index 000000000..a0f720529 --- /dev/null +++ b/lib/fog/openstack/requests/network/get_router.rb @@ -0,0 +1,48 @@ +module Fog + module Network + class OpenStack + + class Real + def get_router(router_id) + request( + :expects => [200], + :method => 'GET', + :path => "routers/#{router_id}" + ) + end + end + + class Mock + def get_router(router_id) + response = Excon::Response.new + if data = self.data[:routers][router_id] + response.status = 200 + response.body = { + 'router' => { + 'id' => '5c81d975-5fea-4674-9c1f-b8aa10bf9a79', + 'name' => 'router_1', + 'network_id' => 'e624a36d-762b-481f-9b50-4154ceb78bbb', + 'fixed_ips' => [ + { + 'ip_address' => '10.2.2.2', + 'subnet_id' => '2e4ec6a4-0150-47f5-8523-e899ac03026e', + } + ], + 'mac_address' => 'fa:16:3e:62:91:7f', + 'status' => 'ACTIVE', + 'admin_state_up' => true, + 'device_id' => 'dhcp724fc160-2b2e-597e-b9ed-7f65313cd73f-e624a36d-762b-481f-9b50-4154ceb78bbb', + 'device_owner' => 'network:dhcp', + 'tenant_id' => 'f8b26a6032bc47718a7702233ac708b9', + } + } + response + else + raise Fog::Network::OpenStack::NotFound + end + end + end + + end + end +end diff --git a/lib/fog/openstack/requests/network/list_routers.rb b/lib/fog/openstack/requests/network/list_routers.rb new file mode 100644 index 000000000..3f692c369 --- /dev/null +++ b/lib/fog/openstack/requests/network/list_routers.rb @@ -0,0 +1,27 @@ +module Fog + module Network + class OpenStack + + class Real + def list_routers(filters = {}) + request( + :expects => 200, + :method => 'GET', + :path => 'routers', + :query => filters + ) + end + end + + class Mock + def list_routers(filters = {}) + Excon::Response.new( + :body => { 'routers' => self.data[:routers].values }, + :status => 200 + ) + end + end + + end + end +end diff --git a/lib/fog/openstack/requests/network/remove_router_interface.rb b/lib/fog/openstack/requests/network/remove_router_interface.rb new file mode 100644 index 000000000..92857dd24 --- /dev/null +++ b/lib/fog/openstack/requests/network/remove_router_interface.rb @@ -0,0 +1,47 @@ +module Fog + module Network + class OpenStack + + class Real + def remove_router_interface(router_id, subnet_id, options = {}) + data = { + 'subnet_id' => subnet_id, + } + + vanilla_options = [:name] + vanilla_options.reject{ |o| options[o].nil? }.each do |key| + data['subnet_id'][key] = options[key] + end + + request( + :body => Fog::JSON.encode(data), + :expects => [200], + :method => 'PUT', + :path => "routers/#{router_id}/remove_router_interface" + ) + end + end + + class Mock + def remove_router_interface(floating_ip_id, port_id, options = {}) + response = Excon::Response.new + response.status = 201 + data = { + 'id' => '00000000-0000-0000-0000-000000000000', + 'router_id' => '00000000-0000-0000-0000-000000000000', + 'tenant_id' => options["tenant_id"], + 'floating_network_id' => options["floating_network_id"], + 'fixed_ip_address' => options["fixed_ip_address"], + 'floating_ip_address' => options["floating_ip_address"], + 'port_id' => port_id, + } + + self.data[:floating_ips][data['floating_ip_id']] = data + response.body = { 'floating_ip' => data } + response + end + end + + end + end +end diff --git a/lib/fog/openstack/requests/network/update_router.rb b/lib/fog/openstack/requests/network/update_router.rb new file mode 100644 index 000000000..74316b896 --- /dev/null +++ b/lib/fog/openstack/requests/network/update_router.rb @@ -0,0 +1,46 @@ +module Fog + module Network + class OpenStack + + class Real + def update_router(router_id, network_id, options = {}) + data = { + 'router' => { + 'external_gateway_info' => { + 'network_id' => network_id, + } + } + } + vanilla_options = [:name, :admin_state_up, :tenand_id] + vanilla_options.select{ |o| options.has_key?(o) }.each do |key| + data['router'][key] = options[key] + end + + request( + :body => Fog::JSON.encode(data), + :expects => 200, + :method => 'PUT', + :path => "routers/#{router_id}.json" + ) + end + end + + class Mock + def update_router(router_id, options = {}) + response = Excon::Response.new + if router = list_routers.body['routers'].detect { |_| _['id'] == router_id } + router['name'] = options[:name] + router['admin_state_up'] = options[:admin_state_up] + router['tenant_id'] = options[:tenant_id] + response.body = { 'router' => router } + response.status = 200 + response + else + raise Fog::Network::OpenStack::NotFound + end + end + end + + end + end +end From 81c67e79c1f7be849df01c72738cd9464c66e7a1 Mon Sep 17 00:00:00 2001 From: Tomokazu Hirai Date: Fri, 22 Feb 2013 18:35:15 +0900 Subject: [PATCH 02/47] added mock code for router operation. --- lib/fog/openstack/models/network/router.rb | 6 +---- lib/fog/openstack/network.rb | 18 ++++++------- .../requests/network/add_router_interface.rb | 26 ++++++++++++------- .../requests/network/create_router.rb | 13 ++++++---- .../openstack/requests/network/get_router.rb | 21 +++++---------- .../network/remove_router_interface.rb | 14 +++------- .../requests/network/update_router.rb | 26 +++++++++++-------- 7 files changed, 60 insertions(+), 64 deletions(-) diff --git a/lib/fog/openstack/models/network/router.rb b/lib/fog/openstack/models/network/router.rb index 2a19cad69..7d87dc6cc 100644 --- a/lib/fog/openstack/models/network/router.rb +++ b/lib/fog/openstack/models/network/router.rb @@ -8,12 +8,8 @@ module Fog attribute :name attribute :network_id - attribute :fixed_ips - attribute :mac_address - attribute :status + attribute :subnet_id attribute :admin_state_up - attribute :device_owner - attribute :device_id attribute :tenant_id def initialize(attributes) diff --git a/lib/fog/openstack/network.rb b/lib/fog/openstack/network.rb index a9ee2afa0..16e3699cb 100644 --- a/lib/fog/openstack/network.rb +++ b/lib/fog/openstack/network.rb @@ -40,15 +40,6 @@ module Fog request :get_port request :update_port - # Router CRUD - request :list_routers - request :create_router - request :delete_router - request :get_router - request :update_router - request :add_router_interface - request :remove_router_interface - # Subnet CRUD request :list_subnets request :create_subnet @@ -64,6 +55,15 @@ module Fog request :associate_floating_ip request :disassociate_floating_ip + # Router CRUD + request :list_routers + request :create_router + request :delete_router + request :get_router + request :update_router + request :add_router_interface + request :remove_router_interface + # Tenant request :set_tenant diff --git a/lib/fog/openstack/requests/network/add_router_interface.rb b/lib/fog/openstack/requests/network/add_router_interface.rb index 88bc7d0d5..ac24ffe46 100644 --- a/lib/fog/openstack/requests/network/add_router_interface.rb +++ b/lib/fog/openstack/requests/network/add_router_interface.rb @@ -23,21 +23,27 @@ module Fog end class Mock - def add_router_interface(floating_ip_id, port_id, options = {}) + def add_router_interface(router_id, subnet_id, options = {}) response = Excon::Response.new response.status = 201 data = { - 'id' => '00000000-0000-0000-0000-000000000000', - 'router_id' => '00000000-0000-0000-0000-000000000000', - 'tenant_id' => options["tenant_id"], - 'floating_network_id' => options["floating_network_id"], - 'fixed_ip_address' => options["fixed_ip_address"], - 'floating_ip_address' => options["floating_ip_address"], - 'port_id' => port_id, + 'status' => 'ACTIVE', + 'name' => '', + 'admin_state_up' => true, + 'network_id' => '5307648b-e836-4658-8f1a-ff7536870c64', + 'tenant_id' => '6b96ff0cb17a4b859e1e575d221683d3', + 'device_owner' => 'network:router_interface', + 'mac_address' => 'fa:16:3e:f7:d1:9c', + 'fixed_ips' => { + 'subnet_id' => 'a2f1f29d-571b-4533-907f-5803ab96ead1', + 'ip_address' => '10.1.1.1' + }, + 'id' => '3a44f4e5-1694-493a-a1fb-393881c673a4', + 'device_id' => '7177abc4-5ae9-4bb7-b0d4-89e94a4abf3b' } - self.data[:floating_ips][data['floating_ip_id']] = data - response.body = { 'floating_ip' => data } + self.data[:routers][data['router_id']] = data + response.body = { 'router' => data } response end end diff --git a/lib/fog/openstack/requests/network/create_router.rb b/lib/fog/openstack/requests/network/create_router.rb index 1bf5d2416..d7c48af9d 100644 --- a/lib/fog/openstack/requests/network/create_router.rb +++ b/lib/fog/openstack/requests/network/create_router.rb @@ -29,11 +29,14 @@ module Fog response = Excon::Response.new response.status = 201 data = { - 'id' => Fog::Mock.random_numbers(6).to_s, - 'name' => options[:name], - 'status' => 'ACTIVE', - 'admin_state_up' => options[:admin_state_up], - 'tenant_id' => options[:tenant_id], + 'router' => { + 'status' => 'ACTIVE', + 'external_gateway_info' => null, + 'name' => 'another_router', + 'admin_state_up' => true, + 'tenant_id' => '6b96ff0cb17a4b859e1e575d221683d3', + 'id' => '8604a0de-7f6b-409a-a47c-a1cc7bc77b2e' + } } self.data[:routers][data['id']] = data response.body = { 'router' => data } diff --git a/lib/fog/openstack/requests/network/get_router.rb b/lib/fog/openstack/requests/network/get_router.rb index a0f720529..8e86817cc 100644 --- a/lib/fog/openstack/requests/network/get_router.rb +++ b/lib/fog/openstack/requests/network/get_router.rb @@ -18,22 +18,15 @@ module Fog if data = self.data[:routers][router_id] response.status = 200 response.body = { - 'router' => { - 'id' => '5c81d975-5fea-4674-9c1f-b8aa10bf9a79', - 'name' => 'router_1', - 'network_id' => 'e624a36d-762b-481f-9b50-4154ceb78bbb', - 'fixed_ips' => [ - { - 'ip_address' => '10.2.2.2', - 'subnet_id' => '2e4ec6a4-0150-47f5-8523-e899ac03026e', - } - ], - 'mac_address' => 'fa:16:3e:62:91:7f', + 'routers' => { 'status' => 'ACTIVE', + 'external_gateway_info' => { + 'network_id' => '3c5bcddd-6af9-4e6b-9c3e-c153e521cab8' + }, + 'name' => 'router1', 'admin_state_up' => true, - 'device_id' => 'dhcp724fc160-2b2e-597e-b9ed-7f65313cd73f-e624a36d-762b-481f-9b50-4154ceb78bbb', - 'device_owner' => 'network:dhcp', - 'tenant_id' => 'f8b26a6032bc47718a7702233ac708b9', + 'tenant_id' => '33a40233088643acb66ff6eb0ebea679', + 'id' => 'a9254bdb-2613-4a13-ac4c-adc581fba50d' } } response diff --git a/lib/fog/openstack/requests/network/remove_router_interface.rb b/lib/fog/openstack/requests/network/remove_router_interface.rb index 92857dd24..d90f83ca6 100644 --- a/lib/fog/openstack/requests/network/remove_router_interface.rb +++ b/lib/fog/openstack/requests/network/remove_router_interface.rb @@ -23,21 +23,15 @@ module Fog end class Mock - def remove_router_interface(floating_ip_id, port_id, options = {}) + def remove_router_interface(router_id, subnet_id, options = {}) response = Excon::Response.new response.status = 201 data = { - 'id' => '00000000-0000-0000-0000-000000000000', - 'router_id' => '00000000-0000-0000-0000-000000000000', - 'tenant_id' => options["tenant_id"], - 'floating_network_id' => options["floating_network_id"], - 'fixed_ip_address' => options["fixed_ip_address"], - 'floating_ip_address' => options["floating_ip_address"], - 'port_id' => port_id, + 'subnet_id' => 'a2f1f29d-571b-4533-907f-5803ab96ead1' } - self.data[:floating_ips][data['floating_ip_id']] = data - response.body = { 'floating_ip' => data } + self.data[:routers][data['router_id']] = data + response.body = { 'router' => data } response end end diff --git a/lib/fog/openstack/requests/network/update_router.rb b/lib/fog/openstack/requests/network/update_router.rb index 74316b896..c19463cb2 100644 --- a/lib/fog/openstack/requests/network/update_router.rb +++ b/lib/fog/openstack/requests/network/update_router.rb @@ -26,18 +26,22 @@ module Fog end class Mock - def update_router(router_id, options = {}) + def update_router(router_id, network_id, options = {}) response = Excon::Response.new - if router = list_routers.body['routers'].detect { |_| _['id'] == router_id } - router['name'] = options[:name] - router['admin_state_up'] = options[:admin_state_up] - router['tenant_id'] = options[:tenant_id] - response.body = { 'router' => router } - response.status = 200 - response - else - raise Fog::Network::OpenStack::NotFound - end + response.status = 201 + data = { + 'status' => 'ACTIVE', + 'external_gateway_info' => { + 'network_id' => '8ca37218-28ff-41cb-9b10-039601ea7e6b' + }, + 'name' => 'another_router', + 'admin_state_up' => true, + 'tenant_id' => '6b96ff0cb17a4b859e1e575d221683d3', + 'id' => '8604a0de-7f6b-409a-a47c-a1cc7bc77b2e' + } + self.data[:router_id][data['router_id']] = data + response.body = { 'router_id' => data } + response end end From 0f3f3994abc7bc78adbc15a6f68483bb6350bf0a Mon Sep 17 00:00:00 2001 From: Tomokazu Hirai Date: Fri, 22 Feb 2013 19:11:13 +0900 Subject: [PATCH 03/47] fixed responce data from mock and removed vanilla options reject code. --- lib/fog/openstack/requests/network/add_router_interface.rb | 5 ----- lib/fog/openstack/requests/network/create_router.rb | 5 ----- .../openstack/requests/network/remove_router_interface.rb | 5 ----- lib/fog/openstack/requests/network/update_router.rb | 6 +----- 4 files changed, 1 insertion(+), 20 deletions(-) diff --git a/lib/fog/openstack/requests/network/add_router_interface.rb b/lib/fog/openstack/requests/network/add_router_interface.rb index ac24ffe46..afa4ca6ae 100644 --- a/lib/fog/openstack/requests/network/add_router_interface.rb +++ b/lib/fog/openstack/requests/network/add_router_interface.rb @@ -8,11 +8,6 @@ module Fog 'subnet_id' => subnet_id, } - vanilla_options = [:name] - vanilla_options.reject{ |o| options[o].nil? }.each do |key| - data['subnet_id'][key] = options[key] - end - request( :body => Fog::JSON.encode(data), :expects => [200], diff --git a/lib/fog/openstack/requests/network/create_router.rb b/lib/fog/openstack/requests/network/create_router.rb index d7c48af9d..31d589475 100644 --- a/lib/fog/openstack/requests/network/create_router.rb +++ b/lib/fog/openstack/requests/network/create_router.rb @@ -10,11 +10,6 @@ module Fog } } - vanilla_options = [:admin_state_up, :tenand_id] - vanilla_options.reject{ |o| options[o].nil? }.each do |key| - data['router'][key] = options[key] - end - request( :body => Fog::JSON.encode(data), :expects => [201], diff --git a/lib/fog/openstack/requests/network/remove_router_interface.rb b/lib/fog/openstack/requests/network/remove_router_interface.rb index d90f83ca6..c822ab1c4 100644 --- a/lib/fog/openstack/requests/network/remove_router_interface.rb +++ b/lib/fog/openstack/requests/network/remove_router_interface.rb @@ -8,11 +8,6 @@ module Fog 'subnet_id' => subnet_id, } - vanilla_options = [:name] - vanilla_options.reject{ |o| options[o].nil? }.each do |key| - data['subnet_id'][key] = options[key] - end - request( :body => Fog::JSON.encode(data), :expects => [200], diff --git a/lib/fog/openstack/requests/network/update_router.rb b/lib/fog/openstack/requests/network/update_router.rb index c19463cb2..64c235824 100644 --- a/lib/fog/openstack/requests/network/update_router.rb +++ b/lib/fog/openstack/requests/network/update_router.rb @@ -11,10 +11,6 @@ module Fog } } } - vanilla_options = [:name, :admin_state_up, :tenand_id] - vanilla_options.select{ |o| options.has_key?(o) }.each do |key| - data['router'][key] = options[key] - end request( :body => Fog::JSON.encode(data), @@ -40,7 +36,7 @@ module Fog 'id' => '8604a0de-7f6b-409a-a47c-a1cc7bc77b2e' } self.data[:router_id][data['router_id']] = data - response.body = { 'router_id' => data } + response.body = { 'router' => data } response end end From 12923ffc4d09272ff863cb576a11d9cf9bd807b1 Mon Sep 17 00:00:00 2001 From: Sergio Rubio Date: Tue, 26 Feb 2013 14:51:28 +0100 Subject: [PATCH 04/47] [openstack|network] create_network provider extensions Implements provider extensions when creating networks. See: http://docs.openstack.org/trunk/openstack-network/admin/content/provider_attributes.html Complements #1581 (Added missing Network model attributes) --- .../requests/network/create_network.rb | 28 +++++++- .../openstack/models/network/network_tests.rb | 17 +++++ .../requests/network/network_tests.rb | 66 ++++++++++++++++--- 3 files changed, 98 insertions(+), 13 deletions(-) diff --git a/lib/fog/openstack/requests/network/create_network.rb b/lib/fog/openstack/requests/network/create_network.rb index 77968b8a5..de0084b60 100644 --- a/lib/fog/openstack/requests/network/create_network.rb +++ b/lib/fog/openstack/requests/network/create_network.rb @@ -6,9 +6,31 @@ module Fog def create_network(options = {}) data = { 'network' => {} } - vanilla_options = [:name, :shared, :admin_state_up, :tenant_id] + vanilla_options = [ + :name, + :shared, + :admin_state_up, + :tenant_id, + :router_external, + :provider_network_type, + :provider_segmentation_id, + :provider_physical_network + ] + + # Advanced Features through API Extensions + # + # @see http://docs.openstack.org/trunk/openstack-network/admin/content/provider_attributes.html + aliases = { + :provider_network_type => 'provider:network_type', + # Not applicable to the "local" or "gre" network types + :provider_physical_network => 'provider:physical_network', + :provider_segmentation_id => 'provider:segmentation_id', + :router_external => 'router:external' + } + vanilla_options.reject{ |o| options[o].nil? }.each do |key| - data['network'][key] = options[key] + aliased_key = aliases[key] || key + data['network'][aliased_key] = options[key] end request( @@ -41,4 +63,4 @@ module Fog end end -end \ No newline at end of file +end diff --git a/tests/openstack/models/network/network_tests.rb b/tests/openstack/models/network/network_tests.rb index 28491f9f2..9aa05bafb 100644 --- a/tests/openstack/models/network/network_tests.rb +++ b/tests/openstack/models/network/network_tests.rb @@ -10,6 +10,23 @@ Shindo.tests("Fog::Network[:openstack] | network", ['openstack']) do !@instance.id.nil? end + tests('#create+extensions').succeeds do + net = Fog::Network[:openstack].networks.create( + :name => 'net_name', + :shared => false, + :admin_state_up => true, + :tenant_id => 'tenant_id', + :router_external => true, + # local, gre, vlan. Depends on the provider. + # May rise an exception if the network_type isn't valid: + # QuantumError: "Invalid input for operation: provider:physical_network" + :provider_network_type => 'gre', + :provider_segmentation_id => 22, + ) + net.destroy + net.provider_network_type == 'gre' + end + tests('have attributes') do attributes = [ :name, diff --git a/tests/openstack/requests/network/network_tests.rb b/tests/openstack/requests/network/network_tests.rb index cb6f4a890..adb9425f4 100644 --- a/tests/openstack/requests/network/network_tests.rb +++ b/tests/openstack/requests/network/network_tests.rb @@ -1,19 +1,44 @@ Shindo.tests('Fog::Network[:openstack] | network requests', ['openstack']) do @network_format = { - 'id' => String, - 'name' => String, - 'subnets' => Array, - 'shared' => Fog::Boolean, - 'status' => String, - 'admin_state_up' => Fog::Boolean, - 'tenant_id' => String, + 'id' => String, + 'name' => String, + 'subnets' => Array, + 'shared' => Fog::Boolean, + 'status' => String, + 'admin_state_up' => Fog::Boolean, + 'tenant_id' => String, + 'router:external' => Fog::Boolean, + 'provider:network_type' => String, + 'provider:physical_network' => Fog::Nullable::String, + 'provider:segmentation_id' => Integer, } tests('success') do tests('#create_network').formats({'network' => @network_format}) do - attributes = {:name => 'net_name', :shared => false, - :admin_state_up => true, :tenant_id => 'tenant_id'} + attributes = { + :name => 'net_name', + :shared => false, + :admin_state_up => true, + :tenant_id => 'tenant_id' + } + Fog::Network[:openstack].create_network(attributes).body + end + tests('#create_network+provider extensions').formats( + {'network' => @network_format} + ) do + attributes = { + :name => 'net_name', + :shared => false, + :admin_state_up => true, + :tenant_id => 'tenant_id', + :router_external => true, + # local, gre, vlan. Depends on the provider. + # May rise an exception if the network_type isn't valid: + # QuantumError: "Invalid input for operation: provider:physical_network" + :provider_network_type => 'gre', + :provider_segmentation_id => 22, + } Fog::Network[:openstack].create_network(attributes).body end @@ -40,6 +65,22 @@ Shindo.tests('Fog::Network[:openstack] | network requests', ['openstack']) do end tests('failure') do + tests('#create_network+provider extensions').raises( + Excon::Errors::BadRequest + ) do + attributes = { + :name => 'net_name', + :shared => false, + :admin_state_up => true, + :tenant_id => 'tenant_id', + :router_external => true, + # QuantumError: "Invalid input for operation: provider:physical_network" + :provider_network_type => 'foobar', + :provider_segmentation_id => 22, + } + Fog::Network[:openstack].create_network(attributes) + end + tests('#get_network').raises(Fog::Network::OpenStack::NotFound) do Fog::Network[:openstack].get_network(0) end @@ -52,5 +93,10 @@ Shindo.tests('Fog::Network[:openstack] | network requests', ['openstack']) do Fog::Network[:openstack].delete_network(0) end end + + # Cleaning up the mess + Fog::Network[:openstack].networks.each do |n| + Fog::Network[:openstack].delete_network(n.id) + end -end \ No newline at end of file +end From 9ae44ffd463021726200f6225b209e1ee61d57b9 Mon Sep 17 00:00:00 2001 From: Sergio Rubio Date: Tue, 26 Feb 2013 17:09:43 +0100 Subject: [PATCH 05/47] [openstack|network] Added missing router model/collection --- lib/fog/openstack/network.rb | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lib/fog/openstack/network.rb b/lib/fog/openstack/network.rb index 16e3699cb..3e35eff81 100644 --- a/lib/fog/openstack/network.rb +++ b/lib/fog/openstack/network.rb @@ -21,6 +21,8 @@ module Fog collection :subnets model :floating_ip collection :floating_ips + model :router + collection :routers ## REQUESTS # From bc6c35b49081f49c452c8ac7cc2b991a2e65a90c Mon Sep 17 00:00:00 2001 From: Sergio Rubio Date: Tue, 26 Feb 2013 17:10:47 +0100 Subject: [PATCH 06/47] [openstack|network] update_router request updates - Filter out invalid options - Add support for additional options: * name * admin_state_up - external_gateway_info can be either a Hash or a Fog::Network::OpenStack::Network (see docs) - Added documentation --- .../requests/network/update_router.rb | 46 +++++++++++++++---- 1 file changed, 38 insertions(+), 8 deletions(-) diff --git a/lib/fog/openstack/requests/network/update_router.rb b/lib/fog/openstack/requests/network/update_router.rb index 64c235824..bdcd74a55 100644 --- a/lib/fog/openstack/requests/network/update_router.rb +++ b/lib/fog/openstack/requests/network/update_router.rb @@ -3,14 +3,44 @@ module Fog class OpenStack class Real - def update_router(router_id, network_id, options = {}) - data = { - 'router' => { - 'external_gateway_info' => { - 'network_id' => network_id, - } - } - } + + # Update Router + # + # Beyond the name and the administrative state, the only + # parameter which can be updated with this operation is + # the external gateway. + # + # router = Fog::Network[:openstack].routers.first + # net = Fog::Network[:openstack].networks.first + # + # # :external_gateway_info can be either a + # # Fog::Network::OpenStack::Network or a Hash + # # like { 'network_id' => network.id } + # Fog::Network[:openstack].update_router router.id, + # :name => 'foo', + # :external_gateway_info => net, + # :admin_state_up => true + # + # @see http://docs.openstack.org/api/openstack-network/2.0/content/router_update.html + def update_router(router_id, options = {}) + data = { 'router' => {} } + + vanilla_options = [:name, :admin_state_up] + + egi = options[:external_gateway_info] + if egi + if egi.is_a?(Fog::Network::OpenStack::Network) + data['router']['external_gateway_info'] = { 'network_id' => egi.id } + elsif egi.is_a?(Hash) and egi['network_id'] + data['router']['external_gateway_info'] = egi + else + raise ArgumentError.new('Invalid external_gateway_info attribute') + end + end + + vanilla_options.reject{ |o| options[o].nil? }.each do |key| + data['router'][key] = options[key] + end request( :body => Fog::JSON.encode(data), From 8476de7f52901248575db7aca1afc0be1859bb8a Mon Sep 17 00:00:00 2001 From: Sergio Rubio Date: Tue, 26 Feb 2013 17:13:43 +0100 Subject: [PATCH 07/47] [openstack|network] router model updates - Added missing attributes - Added documentation --- lib/fog/openstack/models/network/router.rb | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/lib/fog/openstack/models/network/router.rb b/lib/fog/openstack/models/network/router.rb index 7d87dc6cc..6f4f2bcb5 100644 --- a/lib/fog/openstack/models/network/router.rb +++ b/lib/fog/openstack/models/network/router.rb @@ -3,6 +3,13 @@ require 'fog/core/model' module Fog module Network class OpenStack + # The Layer-3 Networking Extensions (router) + # + # A logical entity for forwarding packets across internal + # subnets and NATting them on external networks through + # an appropriate external gateway. + # + # @see http://docs.openstack.org/api/openstack-network/2.0/content/router_ext.html class Router < Fog::Model identity :id @@ -11,6 +18,8 @@ module Fog attribute :subnet_id attribute :admin_state_up attribute :tenant_id + attribute :external_gateway_info + attribute :status def initialize(attributes) # Old 'connection' is renamed as service and should be used instead From 596e54fec2ec50418786004a3b7fbf411f624b19 Mon Sep 17 00:00:00 2001 From: Sergio Rubio Date: Tue, 26 Feb 2013 17:14:33 +0100 Subject: [PATCH 08/47] [openstack|network] create_router request updates - Filter out invalid options --- lib/fog/openstack/requests/network/create_router.rb | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/lib/fog/openstack/requests/network/create_router.rb b/lib/fog/openstack/requests/network/create_router.rb index 31d589475..ca8694d9b 100644 --- a/lib/fog/openstack/requests/network/create_router.rb +++ b/lib/fog/openstack/requests/network/create_router.rb @@ -10,6 +10,19 @@ module Fog } } + vanilla_options = [ + :admin_state_up, + :tenant_id, + :network_id, + :external_gateway_info, + :status, + :subnet_id + ] + + vanilla_options.reject{ |o| options[o].nil? }.each do |key| + data['router'][key] = options[key] + end + request( :body => Fog::JSON.encode(data), :expects => [201], From 55cffa7ad05b7d4621d7c3c7db78f395aa92238c Mon Sep 17 00:00:00 2001 From: Sergio Rubio Date: Tue, 26 Feb 2013 17:16:55 +0100 Subject: [PATCH 09/47] [openstack|network] Added missing router related tests --- .../openstack/models/network/router_tests.rb | 38 ++++++++++ .../openstack/models/network/routers_tests.rb | 21 ++++++ .../requests/network/router_tests.rb | 75 +++++++++++++++++++ 3 files changed, 134 insertions(+) create mode 100644 tests/openstack/models/network/router_tests.rb create mode 100644 tests/openstack/models/network/routers_tests.rb create mode 100644 tests/openstack/requests/network/router_tests.rb diff --git a/tests/openstack/models/network/router_tests.rb b/tests/openstack/models/network/router_tests.rb new file mode 100644 index 000000000..faad48a76 --- /dev/null +++ b/tests/openstack/models/network/router_tests.rb @@ -0,0 +1,38 @@ +Shindo.tests("Fog::Network[:openstack] | router", ['openstack']) do + + tests('success') do + + tests('#create').succeeds do + @instance = Fog::Network[:openstack].routers.create( + :name => 'router_name', + :admin_state_up => true, + ) + !@instance.id.nil? + end + + tests('#update') do + test 'router name' do + @instance.name = 'new_name' + @instance.update.name == 'new_name' + end + # Needs code from issue #1598 + #test 'external_gateway_info' do + # net = Fog::Network[:openstack].networks.create( + # :name => 'net_name', + # :shared => false, + # :admin_state_up => true, + # :tenant_id => 'tenant_id', + # :router_external => true, + # ) + # @instance.external_gateway_info = net + # @instance.update + #end + end + + tests('#destroy').succeeds do + @instance.destroy == true + end + + end + +end diff --git a/tests/openstack/models/network/routers_tests.rb b/tests/openstack/models/network/routers_tests.rb new file mode 100644 index 000000000..9aca47d2c --- /dev/null +++ b/tests/openstack/models/network/routers_tests.rb @@ -0,0 +1,21 @@ +Shindo.tests("Fog::Network[:openstack] | routers", ['openstack']) do + @router = Fog::Network[:openstack].routers.create( + :name => 'router_name', + :admin_state_up => true, + ) + @routers = Fog::Network[:openstack].routers + + tests('success') do + + tests('#all').succeeds do + @routers.all + end + + tests('#get').succeeds do + @routers.get @router.id + end + + end + + @router.destroy +end diff --git a/tests/openstack/requests/network/router_tests.rb b/tests/openstack/requests/network/router_tests.rb new file mode 100644 index 000000000..a0df1a6e2 --- /dev/null +++ b/tests/openstack/requests/network/router_tests.rb @@ -0,0 +1,75 @@ +Shindo.tests('Fog::Network[:openstack] | router requests', ['openstack']) do + + @router_format = { + 'id' => String, + 'name' => String, + 'status' => String, + 'admin_state_up' => Fog::Boolean, + 'tenant_id' => String, + 'external_gateway_info' => Fog::Nullable::Hash, + } + + tests('success') do + tests('#create_router').formats({'router' => @router_format}) do + attributes = { + :admin_state_up => true, + :tenant_id => 'tenant_id' + } + Fog::Network[:openstack].create_router('router_name', attributes).body + end + + tests('#list_routers').formats({'routers' => [@router_format]}) do + Fog::Network[:openstack].list_routers.body + end + + tests('#get_router').formats({'router' => @router_format}) do + router_id = Fog::Network[:openstack].routers.all.first.id + Fog::Network[:openstack].get_router(router_id).body + end + + tests('#update_router').formats({'router' => @router_format}) do + router_id = Fog::Network[:openstack].routers.all.first.id + attributes = {} + { + :name => 'net_name', + :external_gateway_info => { :network_id => 'net_id' }, + :status => 'ACTIVE', + :admin_state_up => 'true' + } + Fog::Network[:openstack].update_router(router_id, attributes).body + end + + tests('#update_router_with_network').formats({'router' => @router_format}) do + router_id = Fog::Network[:openstack].routers.all.first.id + net = Fog::Network[:openstack].networks.first + attributes = {} + { + :name => 'net_name', + :external_gateway_info => net, + :status => 'ACTIVE', + :admin_state_up => 'true' + } + Fog::Network[:openstack].update_router(router_id, attributes).body + end + + tests('#delete_router').succeeds do + router_id = Fog::Network[:openstack].routers.all.last.id + Fog::Network[:openstack].delete_router(router_id) + end + end + + tests('failure') do + tests('#get_router').raises(Fog::Network::OpenStack::NotFound) do + Fog::Network[:openstack].get_router(0) + end + + tests('#update_router').raises(Fog::Network::OpenStack::NotFound) do + Fog::Network[:openstack].update_router(0, {}) + end + + tests('#delete_router').raises(Fog::Network::OpenStack::NotFound) do + Fog::Network[:openstack].delete_router(0) + end + end + +end From 54453be5642a8eb4c90fe5c5941211af12588da1 Mon Sep 17 00:00:00 2001 From: Tomokazu Hirai Date: Thu, 28 Feb 2013 10:44:56 +0900 Subject: [PATCH 10/47] @rubiojr wrote mock code for openstack routers. --- lib/fog/openstack/requests/network/create_router.rb | 6 +++--- lib/fog/openstack/requests/network/get_router.rb | 4 ++-- lib/fog/openstack/requests/network/list_routers.rb | 2 +- lib/fog/openstack/requests/network/update_router.rb | 4 ++-- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/lib/fog/openstack/requests/network/create_router.rb b/lib/fog/openstack/requests/network/create_router.rb index ca8694d9b..dd1386324 100644 --- a/lib/fog/openstack/requests/network/create_router.rb +++ b/lib/fog/openstack/requests/network/create_router.rb @@ -39,15 +39,15 @@ module Fog data = { 'router' => { 'status' => 'ACTIVE', - 'external_gateway_info' => null, + 'external_gateway_info' => nil, 'name' => 'another_router', 'admin_state_up' => true, 'tenant_id' => '6b96ff0cb17a4b859e1e575d221683d3', 'id' => '8604a0de-7f6b-409a-a47c-a1cc7bc77b2e' } } - self.data[:routers][data['id']] = data - response.body = { 'router' => data } + self.data[:routers] = [] + self.data[:routers] << data['router'] response end end diff --git a/lib/fog/openstack/requests/network/get_router.rb b/lib/fog/openstack/requests/network/get_router.rb index 8e86817cc..d489e69c8 100644 --- a/lib/fog/openstack/requests/network/get_router.rb +++ b/lib/fog/openstack/requests/network/get_router.rb @@ -15,10 +15,10 @@ module Fog class Mock def get_router(router_id) response = Excon::Response.new - if data = self.data[:routers][router_id] + if data = (self.data[:routers].find { |r| r['id'] == router_id }) response.status = 200 response.body = { - 'routers' => { + 'router' => { 'status' => 'ACTIVE', 'external_gateway_info' => { 'network_id' => '3c5bcddd-6af9-4e6b-9c3e-c153e521cab8' diff --git a/lib/fog/openstack/requests/network/list_routers.rb b/lib/fog/openstack/requests/network/list_routers.rb index 3f692c369..de575cb31 100644 --- a/lib/fog/openstack/requests/network/list_routers.rb +++ b/lib/fog/openstack/requests/network/list_routers.rb @@ -16,7 +16,7 @@ module Fog class Mock def list_routers(filters = {}) Excon::Response.new( - :body => { 'routers' => self.data[:routers].values }, + :body => { 'routers' => (self.data[:routers] || []) }, :status => 200 ) end diff --git a/lib/fog/openstack/requests/network/update_router.rb b/lib/fog/openstack/requests/network/update_router.rb index bdcd74a55..af25c7768 100644 --- a/lib/fog/openstack/requests/network/update_router.rb +++ b/lib/fog/openstack/requests/network/update_router.rb @@ -52,7 +52,8 @@ module Fog end class Mock - def update_router(router_id, network_id, options = {}) + def update_router(router_id, options = {}) + raise Fog::Network::OpenStack::NotFound if router_id == 0 response = Excon::Response.new response.status = 201 data = { @@ -65,7 +66,6 @@ module Fog 'tenant_id' => '6b96ff0cb17a4b859e1e575d221683d3', 'id' => '8604a0de-7f6b-409a-a47c-a1cc7bc77b2e' } - self.data[:router_id][data['router_id']] = data response.body = { 'router' => data } response end From b9b237b2fcd94647683f48394043d44d6bd9a17a Mon Sep 17 00:00:00 2001 From: Tomokazu Hirai Date: Mon, 4 Mar 2013 10:03:46 +0900 Subject: [PATCH 11/47] @rubiojr fixed mock test failure. --- lib/fog/openstack/requests/network/create_router.rb | 5 +++-- lib/fog/openstack/requests/network/get_router.rb | 2 +- lib/fog/openstack/requests/network/list_routers.rb | 2 +- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/lib/fog/openstack/requests/network/create_router.rb b/lib/fog/openstack/requests/network/create_router.rb index dd1386324..1b9a8dbdc 100644 --- a/lib/fog/openstack/requests/network/create_router.rb +++ b/lib/fog/openstack/requests/network/create_router.rb @@ -46,8 +46,9 @@ module Fog 'id' => '8604a0de-7f6b-409a-a47c-a1cc7bc77b2e' } } - self.data[:routers] = [] - self.data[:routers] << data['router'] + self.data['routers'] ||= [] + self.data['routers'] << data['router'] + response.body = data response end end diff --git a/lib/fog/openstack/requests/network/get_router.rb b/lib/fog/openstack/requests/network/get_router.rb index d489e69c8..7e58a7514 100644 --- a/lib/fog/openstack/requests/network/get_router.rb +++ b/lib/fog/openstack/requests/network/get_router.rb @@ -15,7 +15,7 @@ module Fog class Mock def get_router(router_id) response = Excon::Response.new - if data = (self.data[:routers].find { |r| r['id'] == router_id }) + if data = (self.data['routers'].find { |r| r['id'] == router_id }) response.status = 200 response.body = { 'router' => { diff --git a/lib/fog/openstack/requests/network/list_routers.rb b/lib/fog/openstack/requests/network/list_routers.rb index de575cb31..18172f81b 100644 --- a/lib/fog/openstack/requests/network/list_routers.rb +++ b/lib/fog/openstack/requests/network/list_routers.rb @@ -16,7 +16,7 @@ module Fog class Mock def list_routers(filters = {}) Excon::Response.new( - :body => { 'routers' => (self.data[:routers] || []) }, + :body => { 'routers' => self.data['routers'] }, :status => 200 ) end From 0533db7f1e8a958f24bf9c0c832924524f82b877 Mon Sep 17 00:00:00 2001 From: Tomokazu Hirai Date: Tue, 5 Mar 2013 12:36:27 +0900 Subject: [PATCH 12/47] @rubiojr fixed mock faulure for router(s)_tests.rb --- .../requests/network/update_router.rb | 33 ++++++++++++------- .../openstack/models/network/router_tests.rb | 2 +- .../openstack/models/network/routers_tests.rb | 2 +- 3 files changed, 23 insertions(+), 14 deletions(-) diff --git a/lib/fog/openstack/requests/network/update_router.rb b/lib/fog/openstack/requests/network/update_router.rb index af25c7768..19d5cda47 100644 --- a/lib/fog/openstack/requests/network/update_router.rb +++ b/lib/fog/openstack/requests/network/update_router.rb @@ -53,20 +53,29 @@ module Fog class Mock def update_router(router_id, options = {}) - raise Fog::Network::OpenStack::NotFound if router_id == 0 + router = self.data['routers'].find { |r| r['id'] == router_id } + raise Fog::Network::OpenStack::NotFound unless router + data = { 'router' => router } + + vanilla_options = [:name, :admin_state_up] + + egi = options[:external_gateway_info] + if egi + if egi.is_a?(Fog::Network::OpenStack::Network) + data['router']['external_gateway_info'] = { 'network_id' => egi.id } + elsif egi.is_a?(Hash) and egi['network_id'] + data['router']['external_gateway_info'] = egi + else + raise ArgumentError.new('Invalid external_gateway_info attribute') + end + end + + vanilla_options.reject{ |o| options[o].nil? }.each do |key| + data['router'][key] = options[key] + end response = Excon::Response.new response.status = 201 - data = { - 'status' => 'ACTIVE', - 'external_gateway_info' => { - 'network_id' => '8ca37218-28ff-41cb-9b10-039601ea7e6b' - }, - 'name' => 'another_router', - 'admin_state_up' => true, - 'tenant_id' => '6b96ff0cb17a4b859e1e575d221683d3', - 'id' => '8604a0de-7f6b-409a-a47c-a1cc7bc77b2e' - } - response.body = { 'router' => data } + response.body = data response end end diff --git a/tests/openstack/models/network/router_tests.rb b/tests/openstack/models/network/router_tests.rb index faad48a76..9390fe8ee 100644 --- a/tests/openstack/models/network/router_tests.rb +++ b/tests/openstack/models/network/router_tests.rb @@ -5,7 +5,7 @@ Shindo.tests("Fog::Network[:openstack] | router", ['openstack']) do tests('#create').succeeds do @instance = Fog::Network[:openstack].routers.create( :name => 'router_name', - :admin_state_up => true, + :admin_state_up => true ) !@instance.id.nil? end diff --git a/tests/openstack/models/network/routers_tests.rb b/tests/openstack/models/network/routers_tests.rb index 9aca47d2c..f21014a1d 100644 --- a/tests/openstack/models/network/routers_tests.rb +++ b/tests/openstack/models/network/routers_tests.rb @@ -1,7 +1,7 @@ Shindo.tests("Fog::Network[:openstack] | routers", ['openstack']) do @router = Fog::Network[:openstack].routers.create( :name => 'router_name', - :admin_state_up => true, + :admin_state_up => true ) @routers = Fog::Network[:openstack].routers From 0ce5a9b0ce264e73057161a9a5a72c519003ac13 Mon Sep 17 00:00:00 2001 From: Sergio Rubio Date: Mon, 11 Mar 2013 21:20:09 +0100 Subject: [PATCH 13/47] [openstack|network] create_network provider extensions reworked - Differenciate provider and vanilla options - Fixed mocks --- .../requests/network/create_network.rb | 45 ++++++++++++++++--- .../requests/network/network_tests.rb | 11 +++-- 2 files changed, 47 insertions(+), 9 deletions(-) diff --git a/lib/fog/openstack/requests/network/create_network.rb b/lib/fog/openstack/requests/network/create_network.rb index de0084b60..08902d2fd 100644 --- a/lib/fog/openstack/requests/network/create_network.rb +++ b/lib/fog/openstack/requests/network/create_network.rb @@ -10,16 +10,28 @@ module Fog :name, :shared, :admin_state_up, - :tenant_id, - :router_external, - :provider_network_type, - :provider_segmentation_id, - :provider_physical_network + :tenant_id ] + vanilla_options.reject{ |o| options[o].nil? }.each do |key| + data['network'][key] = options[key] + end + # Advanced Features through API Extensions # + # Not strictly required but commonly found in OpenStack + # installs with Quantum networking. + # # @see http://docs.openstack.org/trunk/openstack-network/admin/content/provider_attributes.html + provider_options = [ + :router_external, + :provider_network_type, + :provider_segmentation_id, + :provider_physical_network + ] + + # Map Fog::Network::OpenStack::Network + # model attributes to OpenStack provider attributes aliases = { :provider_network_type => 'provider:network_type', # Not applicable to the "local" or "gre" network types @@ -28,7 +40,7 @@ module Fog :router_external => 'router:external' } - vanilla_options.reject{ |o| options[o].nil? }.each do |key| + provider_options.reject{ |o| options[o].nil? }.each do |key| aliased_key = aliases[key] || key data['network'][aliased_key] = options[key] end @@ -55,6 +67,27 @@ module Fog 'admin_state_up' => options[:admin_state_up], 'tenant_id' => options[:tenant_id], } + + # Add provider specific attributes when found + # + provider_options = [ + :router_external, + :provider_network_type, + :provider_segmentation_id, + :provider_physical_network + ] + aliases = { + :provider_network_type => 'provider:network_type', + # Not applicable to the "local" or "gre" network types + :provider_physical_network => 'provider:physical_network', + :provider_segmentation_id => 'provider:segmentation_id', + :router_external => 'router:external' + } + provider_options.reject{ |o| options[o].nil? }.each do |key| + aliased_key = aliases[key] || key + data[aliased_key] = options[key] + end + self.data[:networks][data['id']] = data response.body = { 'network' => data } response diff --git a/tests/openstack/requests/network/network_tests.rb b/tests/openstack/requests/network/network_tests.rb index adb9425f4..ad1c32337 100644 --- a/tests/openstack/requests/network/network_tests.rb +++ b/tests/openstack/requests/network/network_tests.rb @@ -7,11 +7,14 @@ Shindo.tests('Fog::Network[:openstack] | network requests', ['openstack']) do 'shared' => Fog::Boolean, 'status' => String, 'admin_state_up' => Fog::Boolean, - 'tenant_id' => String, + 'tenant_id' => String + } + + @network_format_extensions = { 'router:external' => Fog::Boolean, 'provider:network_type' => String, 'provider:physical_network' => Fog::Nullable::String, - 'provider:segmentation_id' => Integer, + 'provider:segmentation_id' => Integer } tests('success') do @@ -25,7 +28,7 @@ Shindo.tests('Fog::Network[:openstack] | network requests', ['openstack']) do Fog::Network[:openstack].create_network(attributes).body end tests('#create_network+provider extensions').formats( - {'network' => @network_format} + {'network' => @network_format.merge(@network_format_extensions)} ) do attributes = { :name => 'net_name', @@ -68,6 +71,8 @@ Shindo.tests('Fog::Network[:openstack] | network requests', ['openstack']) do tests('#create_network+provider extensions').raises( Excon::Errors::BadRequest ) do + pending if Fog.mocking? + attributes = { :name => 'net_name', :shared => false, From e56043a2fc75fa82ea30cd7faaedbb19661aae37 Mon Sep 17 00:00:00 2001 From: Sergio Rubio Date: Mon, 11 Mar 2013 21:49:33 +0100 Subject: [PATCH 14/47] [openstack|network] remove extra trailing comma --- tests/openstack/models/network/network_tests.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/openstack/models/network/network_tests.rb b/tests/openstack/models/network/network_tests.rb index 9aa05bafb..4dca50d2a 100644 --- a/tests/openstack/models/network/network_tests.rb +++ b/tests/openstack/models/network/network_tests.rb @@ -21,7 +21,7 @@ Shindo.tests("Fog::Network[:openstack] | network", ['openstack']) do # May rise an exception if the network_type isn't valid: # QuantumError: "Invalid input for operation: provider:physical_network" :provider_network_type => 'gre', - :provider_segmentation_id => 22, + :provider_segmentation_id => 22 ) net.destroy net.provider_network_type == 'gre' From bb36721cd9f35215ef044f8372b7de73a01bc0e5 Mon Sep 17 00:00:00 2001 From: Chirag Jog Date: Wed, 13 Mar 2013 10:11:18 +0530 Subject: [PATCH 15/47] Remove unecessary print --- lib/fog/vcloud/requests/compute/configure_vm_network.rb | 1 - 1 file changed, 1 deletion(-) diff --git a/lib/fog/vcloud/requests/compute/configure_vm_network.rb b/lib/fog/vcloud/requests/compute/configure_vm_network.rb index 8d657c043..5d18ddb74 100644 --- a/lib/fog/vcloud/requests/compute/configure_vm_network.rb +++ b/lib/fog/vcloud/requests/compute/configure_vm_network.rb @@ -19,7 +19,6 @@ module Fog EOF - print "Request: #{body}" request( :body => body, :expects => 202, From 41376837f319d751d3e7cc54cd02149206adfe5c Mon Sep 17 00:00:00 2001 From: Yauheni Kryudziuk Date: Wed, 13 Mar 2013 12:12:46 +0100 Subject: [PATCH 16/47] Added Content-Disposition attribute for Rackspace file --- lib/fog/rackspace/models/storage/file.rb | 3 +++ tests/rackspace/models/storage/file_tests.rb | 11 ++++++++++- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/lib/fog/rackspace/models/storage/file.rb b/lib/fog/rackspace/models/storage/file.rb index ab24a5f8d..42d5744d0 100644 --- a/lib/fog/rackspace/models/storage/file.rb +++ b/lib/fog/rackspace/models/storage/file.rb @@ -19,6 +19,8 @@ module Fog # @see http://www.iana.org/assignments/media-types attribute :content_type, :aliases => ['content_type', 'Content-Type'] + attribute :content_disposition, :aliases => 'Content-Disposition' + # @!attribute [rw] etag # The MD5 checksum of file. If included file creation request, will ensure integrity of the file. # @return [String] MD5 checksum of file. @@ -170,6 +172,7 @@ module Fog options['Content-Type'] = content_type if content_type options['Access-Control-Allow-Origin'] = access_control_allow_origin if access_control_allow_origin options['Origin'] = origin if origin + options['Content-Disposition'] = content_disposition if content_disposition options.merge!(metadata.to_headers) data = service.put_object(directory.key, key, body, options) diff --git a/tests/rackspace/models/storage/file_tests.rb b/tests/rackspace/models/storage/file_tests.rb index e0c218ad3..399330d54 100644 --- a/tests/rackspace/models/storage/file_tests.rb +++ b/tests/rackspace/models/storage/file_tests.rb @@ -2,8 +2,12 @@ Shindo.tests('Fog::Rackspace::Storage | file', ['rackspace']) do pending if Fog.mocking? + def object_attributes(file=@instance) + @instance.service.head_object(@directory.key, file.key).headers + end + def object_meta_attributes(file=@instance) - @instance.service.head_object(@directory.key, file.key).headers.reject {|k, v| !(k =~ /X-Object-Meta-/)} + object_attributes(file).reject {|k, v| !(k =~ /X-Object-Meta-/)} end def clear_metadata @@ -85,6 +89,11 @@ Shindo.tests('Fog::Rackspace::Storage | file', ['rackspace']) do @file = @directory.files.create :key => 'meta-test', :body => lorem_file, :metadata => {:works => true } object_meta_attributes(@file)["X-Object-Meta-Works"] end + + tests("sets Content-Disposition on create").returns("ho-ho-ho") do + @file = @directory.files.create :key => 'meta-test', :body => lorem_file, :content_disposition => 'ho-ho-ho' + object_attributes(@file)["Content-Disposition"] + end ensure @file.destroy if @file end From d954a16354872b4c87a1a1ad760c5ea366ebe8cd Mon Sep 17 00:00:00 2001 From: Andreas Gerauer Date: Wed, 13 Mar 2013 09:35:12 +0100 Subject: [PATCH 17/47] Removed Zerigo::Models::DNS::Records#find method, moved functionality to all(options) Removed Rackspace::Models::DNS::Zones#find, moved functionality to all(options) --- lib/fog/rackspace/models/dns/zones.rb | 14 +++++--------- lib/fog/zerigo/models/dns/records.rb | 27 +++++++++++++++------------ 2 files changed, 20 insertions(+), 21 deletions(-) diff --git a/lib/fog/rackspace/models/dns/zones.rb b/lib/fog/rackspace/models/dns/zones.rb index b9524cf5b..9de234f25 100644 --- a/lib/fog/rackspace/models/dns/zones.rb +++ b/lib/fog/rackspace/models/dns/zones.rb @@ -8,21 +8,17 @@ module Fog model Fog::DNS::Rackspace::Zone + # List all domains. Return by default a maximum of 100 items + # @param [Hash] options Options to pass to the underlying API call + # @option options [String] :name search for domains containing the given substring + # @option options [Integer] :limit number of records to return + # @option options [Integer] :offset starting offset of records to return def all(options={}) clear data = service.list_domains(options).body['domains'] load(data) end - # Returns all domains containing the given substring. Still limited - # by the 100-domain pagination limit. Returns an empty array if - # no matches. - def find(substring) - clear - data = service.list_domains(:name => substring).body['domains'] - load(data) - end - alias :each_zone_this_page :each def each if !block_given? diff --git a/lib/fog/zerigo/models/dns/records.rb b/lib/fog/zerigo/models/dns/records.rb index 5682a7532..eca25255d 100644 --- a/lib/fog/zerigo/models/dns/records.rb +++ b/lib/fog/zerigo/models/dns/records.rb @@ -10,15 +10,23 @@ module Fog attribute :zone model Fog::DNS::Zerigo::Record - - def all + + # List all domains + # @param [Hash] options Options to pass to the underlying API call + # @option options [String] :fqdn search for the given fqdn + def all(options = {}) requires :zone - parent = zone.collection.get(zone.identity) - if parent - merge_attributes(parent.records.attributes) - load(parent.records.map {|record| record.attributes}) + if options[:fqdn] + hosts = service.find_hosts(options[:fqdn], zone.id).body['hosts'] + load(hosts) else - nil + parent = zone.collection.get(zone.identity) + if parent + merge_attributes(parent.records.attributes) + load(parent.records.map {|record| record.attributes}) + else + nil + end end end @@ -34,11 +42,6 @@ module Fog super({ :zone => zone }.merge!(attributes)) end - def find(fqdn) - hosts = service.find_hosts(fqdn, zone.id).body['hosts'] - hosts.collect { |host| new(host) } - end - end end From 1d45d1fbe23d416b252a7c110775b899668f3901 Mon Sep 17 00:00:00 2001 From: Andreas Gerauer Date: Wed, 13 Mar 2013 09:36:18 +0100 Subject: [PATCH 18/47] fixed infinite loop in each method of AWS Distributions --- lib/fog/aws/models/cdn/distributions.rb | 3 ++- lib/fog/aws/models/cdn/distributions_helper.rb | 3 ++- lib/fog/aws/models/cdn/streaming_distributions.rb | 3 ++- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/lib/fog/aws/models/cdn/distributions.rb b/lib/fog/aws/models/cdn/distributions.rb index d18e00a41..dd76c5726 100644 --- a/lib/fog/aws/models/cdn/distributions.rb +++ b/lib/fog/aws/models/cdn/distributions.rb @@ -23,7 +23,8 @@ module Fog service.get_distribution_list(options) end - alias :each_distribution_this_page :each + alias_method :each_distribution_this_page, :each + alias_method :each, :each_distribution end diff --git a/lib/fog/aws/models/cdn/distributions_helper.rb b/lib/fog/aws/models/cdn/distributions_helper.rb index 3d5d03380..76bb9a177 100644 --- a/lib/fog/aws/models/cdn/distributions_helper.rb +++ b/lib/fog/aws/models/cdn/distributions_helper.rb @@ -5,6 +5,7 @@ module Fog class AWS module DistributionsHelper + def all(options = {}) merge_attributes(options) data = list_distributions(options).body @@ -24,7 +25,7 @@ module Fog nil end - def each + def each_distribution if !block_given? self else diff --git a/lib/fog/aws/models/cdn/streaming_distributions.rb b/lib/fog/aws/models/cdn/streaming_distributions.rb index b084c102a..cc307f178 100644 --- a/lib/fog/aws/models/cdn/streaming_distributions.rb +++ b/lib/fog/aws/models/cdn/streaming_distributions.rb @@ -23,7 +23,8 @@ module Fog service.get_streaming_distribution_list(options) end - alias :each_distribution_this_page :each + alias_method :each_distribution_this_page, :each + alias_method :each, :each_distribution end From 3c517761711419934112fa294a92f32a55da033c Mon Sep 17 00:00:00 2001 From: Andreas Gerauer Date: Wed, 13 Mar 2013 09:39:38 +0100 Subject: [PATCH 19/47] add a test to protect certain Enumerable methods in Fog::Collection subclasses --- tests/helpers/collection_helper.rb | 37 +++++++++++++++++++++++++++++- 1 file changed, 36 insertions(+), 1 deletion(-) diff --git a/tests/helpers/collection_helper.rb b/tests/helpers/collection_helper.rb index c37493fec..b5168a46f 100644 --- a/tests/helpers/collection_helper.rb +++ b/tests/helpers/collection_helper.rb @@ -21,6 +21,8 @@ def collection_tests(collection, params = {}, mocks_implemented = true) pending if Fog.mocking? && !mocks_implemented collection.all end + + if !Fog.mocking? || mocks_implemented @identity = @instance.identity @@ -31,6 +33,39 @@ def collection_tests(collection, params = {}, mocks_implemented = true) collection.get(@identity) end + tests('Enumerable') do + pending if Fog.mocking? && !mocks_implemented + + [ + 'all?', 'any?', 'find', 'detect', 'collect', 'map', + 'find_index', 'flat_map', 'collect_concat', 'group_by', + 'none?', 'one?' + ].each do |enum_method| + if collection.respond_to?(enum_method) + tests("##{enum_method}").succeeds do + block_called = false + collection.send(enum_method) {|x| block_called = true } + block_called + end + end + end + + [ + 'max_by','min_by' + ].each do |enum_method| + if collection.respond_to?(enum_method) + tests("##{enum_method}").succeeds do + block_called = false + collection.send(enum_method) {|x| block_called = true; 0 } + block_called + end + end + + end + + end + + if block_given? yield end @@ -39,7 +74,7 @@ def collection_tests(collection, params = {}, mocks_implemented = true) @instance.destroy end end - + tests('failure') do if !Fog.mocking? || mocks_implemented From 33c75806dee0c751c2e2ad30d707651af3c92e08 Mon Sep 17 00:00:00 2001 From: Sergio Rubio Date: Wed, 13 Mar 2013 18:48:17 +0100 Subject: [PATCH 20/47] [openstack|identity] moved identity example to the examples directory It seems that we're standardizing on adding examples to the examples directory so move previous identity example to this directory. --- lib/fog/openstack/README.identity.md | 69 ------------------- lib/fog/openstack/examples/identity/basics.rb | 69 +++++++++++++++++++ 2 files changed, 69 insertions(+), 69 deletions(-) delete mode 100644 lib/fog/openstack/README.identity.md create mode 100644 lib/fog/openstack/examples/identity/basics.rb diff --git a/lib/fog/openstack/README.identity.md b/lib/fog/openstack/README.identity.md deleted file mode 100644 index 3eea4fb97..000000000 --- a/lib/fog/openstack/README.identity.md +++ /dev/null @@ -1,69 +0,0 @@ -# OpenStack Identity Service (Keystone) Example - - require 'fog' - require 'pp' - - auth_url = "https://example.net/v2.0/tokens" - username = 'admin@example.net' - password = 'secret' - - keystone = Fog::Identity.new :provider => 'OpenStack', - :openstack_auth_url => auth_url, - :openstack_username => username, - :openstack_api_key => password - # Optional, self-signed certs - #:connection_options => { :ssl_verify_peer => false } - - # - # Listing keystone tenants - # - keystone.tenants.each do |tenant| - # - #pp tenant - end - - # - # List users - # - keystone.users.each do |user| - # - # ... - #pp user - end - - # - # Create a new tenant - # - tenant = keystone.tenants.create :name => 'rubiojr@example.net', - :description => 'My foo tenant' - - # - # Create a new user - # - user = keystone.users.create :name => 'rubiojr@example.net', - :tenant_id => tenant.id, - :password => 'rubiojr@example.net', - :email => 'rubiojr@example.net' - - - # Find the recently created tenant - tenant = keystone.tenants.find { |t| t.name == 'rubiojr@example.net' } - # Destroy the tenant - tenant.destroy - - # Find the recently created user - user = keystone.users.find { |u| u.name == 'rubiojr@example.net' } - # Destroy the user - user.destroy diff --git a/lib/fog/openstack/examples/identity/basics.rb b/lib/fog/openstack/examples/identity/basics.rb new file mode 100644 index 000000000..498f9b70a --- /dev/null +++ b/lib/fog/openstack/examples/identity/basics.rb @@ -0,0 +1,69 @@ +# OpenStack Identity Service (Keystone) Example + +require 'fog' +require 'pp' + +auth_url = "https://example.net/v2.0/tokens" +username = 'admin@example.net' +password = 'secret' + +keystone = Fog::Identity.new :provider => 'OpenStack', + :openstack_auth_url => auth_url, + :openstack_username => username, + :openstack_api_key => password + # Optional, self-signed certs + #:connection_options => { :ssl_verify_peer => false } + +# +# Listing keystone tenants +# +keystone.tenants.each do |tenant| + # + pp tenant +end + +# +# List users +# +keystone.users.each do |user| + # + # ... + pp user +end + +# +# Create a new tenant +# +tenant = keystone.tenants.create :name => 'rubiojr@example.net', + :description => 'My foo tenant' + +# +# Create a new user +# +user = keystone.users.create :name => 'rubiojr@example.net', + :tenant_id => tenant.id, + :password => 'rubiojr@example.net', + :email => 'rubiojr@example.net' + + +# Find the recently created tenant +tenant = keystone.tenants.find { |t| t.name == 'rubiojr@example.net' } +# Destroy the tenant +tenant.destroy + +# Find the recently created user +user = keystone.users.find { |u| u.name == 'rubiojr@example.net' } +# Destroy the user +user.destroy From 0e225b97b745060b045cee4c5e06484d8e889da8 Mon Sep 17 00:00:00 2001 From: Andreas Gerauer Date: Wed, 13 Mar 2013 18:36:08 +0000 Subject: [PATCH 21/47] [hp|storage] marker option in each method needs to be a string --- lib/fog/hp/models/storage/files.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/fog/hp/models/storage/files.rb b/lib/fog/hp/models/storage/files.rb index 46718124e..f97f66cf3 100644 --- a/lib/fog/hp/models/storage/files.rb +++ b/lib/fog/hp/models/storage/files.rb @@ -44,7 +44,7 @@ module Fog subset.each_file_this_page {|f| yield f} until subset.empty? || subset.length == (subset.limit || 10000) - subset = subset.all(:marker => subset.last.key) + subset = subset.all('marker' => subset.last.key) subset.each_file_this_page {|f| yield f} end From 907b14c5b481a8e123a86aa90232dd986d6fb315 Mon Sep 17 00:00:00 2001 From: Rupak Ganguly Date: Fri, 25 Jan 2013 14:38:19 -0500 Subject: [PATCH 22/47] Update changelog and bump version. --- lib/fog/hp/CHANGELOG.hp | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/lib/fog/hp/CHANGELOG.hp b/lib/fog/hp/CHANGELOG.hp index 6f188b6b8..aa91d1418 100644 --- a/lib/fog/hp/CHANGELOG.hp +++ b/lib/fog/hp/CHANGELOG.hp @@ -1,8 +1,18 @@ -0.0.19 18/01/2013 +0.0.20 03/13/2013 +================= +- add Accept header with application/json for all requests +- add support for user_data while creating servers in Compute +- add support for one/two way container synchronisation in Object Storage +- merge with upstream fog v1.10.0 + +0.0.19 01/25/2013 ================= - update Block Storage namespace to be Fog::HP::BlockStorage -- merge with upstream fog v1.8.0 +- merge with upstream fog v1.9.0 - deprecate hp_account_id to use hp_access_key instead +- fix temp_url to use signer that is backward compatible to 1.8.7 +- fix issue in Storage provider with service catalog having an invalid CDN endpoint +- Happy New Year to all... 0.0.18 12/04/2012 ================= From b3995a95ed467f0c293fa3ebe787bfc1f62d9cd3 Mon Sep 17 00:00:00 2001 From: howete Date: Thu, 7 Mar 2013 16:49:43 -0700 Subject: [PATCH 23/47] container sync attributes --- lib/fog/hp/models/storage/directories.rb | 2 +- lib/fog/hp/models/storage/directory.rb | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/lib/fog/hp/models/storage/directories.rb b/lib/fog/hp/models/storage/directories.rb index dd24961c3..0e7c9bb12 100644 --- a/lib/fog/hp/models/storage/directories.rb +++ b/lib/fog/hp/models/storage/directories.rb @@ -49,7 +49,7 @@ module Fog write_header = nil directory = new(:key => key) for key, value in data.headers - if ['X-Container-Bytes-Used', 'X-Container-Object-Count'].include?(key) + if ['X-Container-Bytes-Used', 'X-Container-Object-Count', 'X-Container-Sync-To', 'X-Container-Sync-Key'].include?(key) directory.merge_attributes(key => value) end if key == 'X-Container-Read' diff --git a/lib/fog/hp/models/storage/directory.rb b/lib/fog/hp/models/storage/directory.rb index b03977c77..bf1033da0 100644 --- a/lib/fog/hp/models/storage/directory.rb +++ b/lib/fog/hp/models/storage/directory.rb @@ -11,6 +11,8 @@ module Fog attribute :bytes, :aliases => 'X-Container-Bytes-Used' attribute :count, :aliases => 'X-Container-Object-Count' + attribute :syncto, :aliases => 'X-Container-Sync-To' + attribute :synckey, :aliases => 'X-Container-Sync-Key' def initialize(attributes = {}) @read_acl = [] @@ -209,6 +211,8 @@ module Fog requires :key # write out the acls into the headers before save options.merge!(service.perm_acl_to_header(@read_acl, @write_acl)) + options.merge!({'X-Container-Sync-To' => syncto}) unless syncto.nil? + options.merge!({'X-Container-Sync-Key' => synckey}) unless synckey.nil? service.put_container(key, options) # Added an extra check to see if CDN is enabled for the container if (!service.cdn.nil? && service.cdn.enabled?) From fdf49245eeae64ea1578396213ffe9313098e634 Mon Sep 17 00:00:00 2001 From: Rupak Ganguly Date: Fri, 8 Mar 2013 11:45:25 -0500 Subject: [PATCH 24/47] Fix names of the container sync attributes. --- lib/fog/hp/models/storage/directory.rb | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/lib/fog/hp/models/storage/directory.rb b/lib/fog/hp/models/storage/directory.rb index bf1033da0..3efb76291 100644 --- a/lib/fog/hp/models/storage/directory.rb +++ b/lib/fog/hp/models/storage/directory.rb @@ -7,12 +7,12 @@ module Fog class Directory < Fog::Model - identity :key, :aliases => 'name' + identity :key, :aliases => 'name' - attribute :bytes, :aliases => 'X-Container-Bytes-Used' - attribute :count, :aliases => 'X-Container-Object-Count' - attribute :syncto, :aliases => 'X-Container-Sync-To' - attribute :synckey, :aliases => 'X-Container-Sync-Key' + attribute :bytes, :aliases => 'X-Container-Bytes-Used' + attribute :count, :aliases => 'X-Container-Object-Count' + attribute :sync_to, :aliases => 'X-Container-Sync-To' + attribute :sync_key, :aliases => 'X-Container-Sync-Key' def initialize(attributes = {}) @read_acl = [] @@ -211,8 +211,8 @@ module Fog requires :key # write out the acls into the headers before save options.merge!(service.perm_acl_to_header(@read_acl, @write_acl)) - options.merge!({'X-Container-Sync-To' => syncto}) unless syncto.nil? - options.merge!({'X-Container-Sync-Key' => synckey}) unless synckey.nil? + options.merge!({'X-Container-Sync-To' => sync_to}) unless sync_to.nil? + options.merge!({'X-Container-Sync-Key' => sync_key}) unless sync_key.nil? service.put_container(key, options) # Added an extra check to see if CDN is enabled for the container if (!service.cdn.nil? && service.cdn.enabled?) From 01d3c4df44154bd78c89e3be76ddad25716fad2d Mon Sep 17 00:00:00 2001 From: Rupak Ganguly Date: Mon, 11 Mar 2013 16:24:01 -0400 Subject: [PATCH 25/47] Add Object Storage container sync feature. --- lib/fog/hp/models/storage/directory.rb | 25 +++++++++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) diff --git a/lib/fog/hp/models/storage/directory.rb b/lib/fog/hp/models/storage/directory.rb index 3efb76291..a94db0c20 100644 --- a/lib/fog/hp/models/storage/directory.rb +++ b/lib/fog/hp/models/storage/directory.rb @@ -207,12 +207,33 @@ module Fog end end + def sync(target_dir, secret) + requires :key + # do not sync if dir is same as target dir + return false if target_dir.key == key + begin service.head_container(key) + if !target_dir.nil? && target_dir.is_a?(Fog::Storage::HP::Directory) && target_dir.respond_to?(:public_url) && !target_dir.public_url.nil? + # set sync metadata on source dir + self.sync_to = target_dir.public_url + self.sync_key = secret + # set sync metadata on target dir + target_dir.sync_key = secret + target_dir.save + true + else + false + end + rescue Fog::Storage::HP::NotFound + false + end + end + def save(options = {}) requires :key # write out the acls into the headers before save options.merge!(service.perm_acl_to_header(@read_acl, @write_acl)) - options.merge!({'X-Container-Sync-To' => sync_to}) unless sync_to.nil? - options.merge!({'X-Container-Sync-Key' => sync_key}) unless sync_key.nil? + options.merge!({'X-Container-Sync-To' => self.sync_to}) unless self.sync_to.nil? + options.merge!({'X-Container-Sync-Key' => self.sync_key}) unless self.sync_key.nil? service.put_container(key, options) # Added an extra check to see if CDN is enabled for the container if (!service.cdn.nil? && service.cdn.enabled?) From 8ad0bdb4b131d2c6b72fca52581771600fdc6ec7 Mon Sep 17 00:00:00 2001 From: Rupak Ganguly Date: Mon, 11 Mar 2013 16:45:18 -0400 Subject: [PATCH 26/47] [hp|compute] Add user_data option to create server call. --- lib/fog/hp/requests/compute/create_server.rb | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/lib/fog/hp/requests/compute/create_server.rb b/lib/fog/hp/requests/compute/create_server.rb index 4487c5eb3..5e208d900 100644 --- a/lib/fog/hp/requests/compute/create_server.rb +++ b/lib/fog/hp/requests/compute/create_server.rb @@ -101,6 +101,10 @@ module Fog data['server']['config_drive'] = options['config_drive'] end + if options['user_data'] + data['server']['user_data'] = options['user_data'] + end + request( :body => Fog::JSON.encode(data), :expects => 202, From 8c72b78e5f72d62ae7ec2537fb24d995b4c6ff3b Mon Sep 17 00:00:00 2001 From: Rupak Ganguly Date: Mon, 11 Mar 2013 16:49:32 -0400 Subject: [PATCH 27/47] [hp|compute] Consolidate the simple mapped options parameters in the create server call. --- lib/fog/hp/requests/compute/create_server.rb | 22 ++++---------------- 1 file changed, 4 insertions(+), 18 deletions(-) diff --git a/lib/fog/hp/requests/compute/create_server.rb b/lib/fog/hp/requests/compute/create_server.rb index 5e208d900..26e10c652 100644 --- a/lib/fog/hp/requests/compute/create_server.rb +++ b/lib/fog/hp/requests/compute/create_server.rb @@ -63,15 +63,11 @@ module Fog 'name' => name } } - if options['metadata'] - data['server']['metadata'] = options['metadata'] - end - if options['accessIPv4'] - data['server']['accessIPv4'] = options['accessIPv4'] - end - if options['accessIPv6'] - data['server']['accessIPv6'] = options['accessIPv6'] + l_options = ['metadata', 'accessIPv4', 'accessIPv6', 'key_name', 'config_drive', 'user_data'] + l_options.select{|o| options[o]}.each do |key| + data['server'][key] = options[key] end + if options['personality'] data['server']['personality'] = [] for file in options['personality'] @@ -86,9 +82,6 @@ module Fog data['server']['min_count'] = min_count data['server']['max_count'] = max_count - if options['key_name'] - data['server']['key_name'] = options['key_name'] - end if options['security_groups'] data['server']['security_groups'] = [] for sg in options['security_groups'] @@ -97,13 +90,6 @@ module Fog } end end - if options['config_drive'] - data['server']['config_drive'] = options['config_drive'] - end - - if options['user_data'] - data['server']['user_data'] = options['user_data'] - end request( :body => Fog::JSON.encode(data), From e8e5205e1e5978cd2eb20c7bf111152722da027b Mon Sep 17 00:00:00 2001 From: Rupak Ganguly Date: Tue, 12 Mar 2013 14:09:08 -0400 Subject: [PATCH 28/47] [hp|compute] Add the capability to pass in user_data in the server model. --- lib/fog/hp/models/compute/server.rb | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/lib/fog/hp/models/compute/server.rb b/lib/fog/hp/models/compute/server.rb index bce6828b4..87c711a8f 100644 --- a/lib/fog/hp/models/compute/server.rb +++ b/lib/fog/hp/models/compute/server.rb @@ -27,6 +27,7 @@ module Fog attribute :key_name attribute :security_groups attribute :config_drive + attribute :user_data_encoded # these are implemented as methods attribute :image_id attribute :flavor_id @@ -66,6 +67,10 @@ module Fog metadata.load(metas) end + def user_data=(ascii_userdata) + self.user_data_encoded = [ascii_userdata].pack('m') # same as Base64.encode64 + end + def destroy requires :id service.delete_server(id) @@ -216,15 +221,16 @@ module Fog meta_hash = {} metadata.each { |meta| meta_hash.store(meta.key, meta.value) } options = { - 'metadata' => meta_hash, - 'personality' => personality, - 'accessIPv4' => accessIPv4, - 'accessIPv6' => accessIPv6, - 'min_count' => @min_count, - 'max_count' => @max_count, - 'key_name' => key_name, + 'metadata' => meta_hash, + 'personality' => personality, + 'accessIPv4' => accessIPv4, + 'accessIPv6' => accessIPv6, + 'min_count' => @min_count, + 'max_count' => @max_count, + 'key_name' => key_name, 'security_groups' => security_groups, - 'config_drive' => config_drive + 'config_drive' => config_drive, + 'user_data' => user_data_encoded } options = options.reject {|key, value| value.nil?} # either create a regular server or a persistent server based on input From eae0323b0807a1c3d90798b2939b5e2ee2cdbc7e Mon Sep 17 00:00:00 2001 From: Rupak Ganguly Date: Tue, 12 Mar 2013 16:21:43 -0400 Subject: [PATCH 29/47] [hp|compute] Add user_data to the mock data structure. --- lib/fog/hp/requests/compute/create_server.rb | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/fog/hp/requests/compute/create_server.rb b/lib/fog/hp/requests/compute/create_server.rb index 26e10c652..c3a616c97 100644 --- a/lib/fog/hp/requests/compute/create_server.rb +++ b/lib/fog/hp/requests/compute/create_server.rb @@ -131,6 +131,7 @@ module Fog 'tenant_id' => Fog::HP::Mock.user_id.to_s, 'uuid' => "95253a45-9ead-43c6-90b3-65da2ef048b3", 'config_drive' => "", + 'user_data' => "", 'security_groups' => [{"name"=>"#{sec_group_name}", "links"=>[{"href"=>"http://nova1:8774/v1.1/admin//os-security-groups/111", "rel"=>"bookmark"}], "id"=>111}], 'key_name' => options['key_name'] || "" } From 34ca17acc43959309a7b6ecd60515f1a8a56ebb6 Mon Sep 17 00:00:00 2001 From: Rupak Ganguly Date: Wed, 13 Mar 2013 11:33:51 -0400 Subject: [PATCH 30/47] [hp] Add Accept header with application/json for all HP requests. --- lib/fog/hp/block_storage.rb | 1 + lib/fog/hp/cdn.rb | 1 + lib/fog/hp/compute.rb | 1 + lib/fog/hp/storage.rb | 2 ++ 4 files changed, 5 insertions(+) diff --git a/lib/fog/hp/block_storage.rb b/lib/fog/hp/block_storage.rb index 530251772..616f2ff50 100644 --- a/lib/fog/hp/block_storage.rb +++ b/lib/fog/hp/block_storage.rb @@ -144,6 +144,7 @@ module Fog response = @connection.request(params.merge!({ :headers => { 'Content-Type' => 'application/json', + 'Accept' => 'application/json', 'X-Auth-Token' => @auth_token }.merge!(params[:headers] || {}), :host => @host, diff --git a/lib/fog/hp/cdn.rb b/lib/fog/hp/cdn.rb index 16473610c..3ced28ad1 100644 --- a/lib/fog/hp/cdn.rb +++ b/lib/fog/hp/cdn.rb @@ -128,6 +128,7 @@ module Fog response = @connection.request(params.merge!({ :headers => { 'Content-Type' => 'application/json', + 'Accept' => 'application/json', 'X-Auth-Token' => @auth_token }.merge!(params[:headers] || {}), :host => @host, diff --git a/lib/fog/hp/compute.rb b/lib/fog/hp/compute.rb index 312c1e1af..f04e74ba0 100644 --- a/lib/fog/hp/compute.rb +++ b/lib/fog/hp/compute.rb @@ -227,6 +227,7 @@ module Fog response = @connection.request(params.merge!({ :headers => { 'Content-Type' => 'application/json', + 'Accept' => 'application/json', 'X-Auth-Token' => @auth_token }.merge!(params[:headers] || {}), :host => @host, diff --git a/lib/fog/hp/storage.rb b/lib/fog/hp/storage.rb index b42466500..60178d4be 100644 --- a/lib/fog/hp/storage.rb +++ b/lib/fog/hp/storage.rb @@ -291,6 +291,7 @@ module Fog response = @connection.request(params.merge!({ :headers => { 'Content-Type' => 'application/json', + 'Accept' => 'application/json', 'X-Auth-Token' => @auth_token }.merge!(params[:headers] || {}), :host => @host, @@ -316,6 +317,7 @@ module Fog response = @connection.request(params.merge!({ :headers => { 'Content-Type' => 'application/json', + 'Accept' => 'application/json', 'X-Auth-Token' => @auth_token }.merge!(params[:headers] || {}), :host => @host, From 9ea9b8c4eef0058623beaa6a8ed0ea6e8a8b2742 Mon Sep 17 00:00:00 2001 From: Rupak Ganguly Date: Wed, 13 Mar 2013 11:39:49 -0400 Subject: [PATCH 31/47] [hp|compute] Fix mock for create server. --- lib/fog/hp/requests/compute/create_server.rb | 1 - 1 file changed, 1 deletion(-) diff --git a/lib/fog/hp/requests/compute/create_server.rb b/lib/fog/hp/requests/compute/create_server.rb index c3a616c97..26e10c652 100644 --- a/lib/fog/hp/requests/compute/create_server.rb +++ b/lib/fog/hp/requests/compute/create_server.rb @@ -131,7 +131,6 @@ module Fog 'tenant_id' => Fog::HP::Mock.user_id.to_s, 'uuid' => "95253a45-9ead-43c6-90b3-65da2ef048b3", 'config_drive' => "", - 'user_data' => "", 'security_groups' => [{"name"=>"#{sec_group_name}", "links"=>[{"href"=>"http://nova1:8774/v1.1/admin//os-security-groups/111", "rel"=>"bookmark"}], "id"=>111}], 'key_name' => options['key_name'] || "" } From ed461e5b3e9b4ced761be28f7f4328930d3675a1 Mon Sep 17 00:00:00 2001 From: Rupak Ganguly Date: Fri, 25 Jan 2013 14:38:19 -0500 Subject: [PATCH 32/47] Update changelog and bump version. --- lib/fog/hp.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/fog/hp.rb b/lib/fog/hp.rb index 8bd209a84..d90e2747a 100644 --- a/lib/fog/hp.rb +++ b/lib/fog/hp.rb @@ -5,7 +5,7 @@ module Fog # define a specific version for the HP Provider unless const_defined?(:VERSION) - VERSION = '0.0.19' + VERSION = '0.0.20' end extend Fog::Provider From e221e2af6cf61b05b6f52aa326f7f444230fb716 Mon Sep 17 00:00:00 2001 From: Rupak Ganguly Date: Mon, 11 Mar 2013 16:45:18 -0400 Subject: [PATCH 33/47] [hp|compute] Add user_data option to create server call. --- lib/fog/hp/requests/compute/create_server.rb | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/lib/fog/hp/requests/compute/create_server.rb b/lib/fog/hp/requests/compute/create_server.rb index 26e10c652..8bfb15e39 100644 --- a/lib/fog/hp/requests/compute/create_server.rb +++ b/lib/fog/hp/requests/compute/create_server.rb @@ -91,6 +91,10 @@ module Fog end end + if options['user_data'] + data['server']['user_data'] = options['user_data'] + end + request( :body => Fog::JSON.encode(data), :expects => 202, From f0d38d128eb38a75e00393407974656ff5e58166 Mon Sep 17 00:00:00 2001 From: Rupak Ganguly Date: Mon, 11 Mar 2013 16:49:32 -0400 Subject: [PATCH 34/47] [hp|compute] Consolidate the simple mapped options parameters in the create server call. --- lib/fog/hp/requests/compute/create_server.rb | 4 ---- 1 file changed, 4 deletions(-) diff --git a/lib/fog/hp/requests/compute/create_server.rb b/lib/fog/hp/requests/compute/create_server.rb index 8bfb15e39..26e10c652 100644 --- a/lib/fog/hp/requests/compute/create_server.rb +++ b/lib/fog/hp/requests/compute/create_server.rb @@ -91,10 +91,6 @@ module Fog end end - if options['user_data'] - data['server']['user_data'] = options['user_data'] - end - request( :body => Fog::JSON.encode(data), :expects => 202, From 78ad8e6a70e7d8122cbcf1207f23e33aa77b0f50 Mon Sep 17 00:00:00 2001 From: Rupak Ganguly Date: Tue, 12 Mar 2013 16:21:43 -0400 Subject: [PATCH 35/47] [hp|compute] Add user_data to the mock data structure. --- lib/fog/hp/requests/compute/create_server.rb | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/fog/hp/requests/compute/create_server.rb b/lib/fog/hp/requests/compute/create_server.rb index 26e10c652..c3a616c97 100644 --- a/lib/fog/hp/requests/compute/create_server.rb +++ b/lib/fog/hp/requests/compute/create_server.rb @@ -131,6 +131,7 @@ module Fog 'tenant_id' => Fog::HP::Mock.user_id.to_s, 'uuid' => "95253a45-9ead-43c6-90b3-65da2ef048b3", 'config_drive' => "", + 'user_data' => "", 'security_groups' => [{"name"=>"#{sec_group_name}", "links"=>[{"href"=>"http://nova1:8774/v1.1/admin//os-security-groups/111", "rel"=>"bookmark"}], "id"=>111}], 'key_name' => options['key_name'] || "" } From 1b3ec2beef406d84b28a50b150290b1f2ca782e0 Mon Sep 17 00:00:00 2001 From: Rupak Ganguly Date: Wed, 13 Mar 2013 11:39:49 -0400 Subject: [PATCH 36/47] [hp|compute] Fix mock for create server. --- lib/fog/hp/requests/compute/create_server.rb | 1 - 1 file changed, 1 deletion(-) diff --git a/lib/fog/hp/requests/compute/create_server.rb b/lib/fog/hp/requests/compute/create_server.rb index c3a616c97..26e10c652 100644 --- a/lib/fog/hp/requests/compute/create_server.rb +++ b/lib/fog/hp/requests/compute/create_server.rb @@ -131,7 +131,6 @@ module Fog 'tenant_id' => Fog::HP::Mock.user_id.to_s, 'uuid' => "95253a45-9ead-43c6-90b3-65da2ef048b3", 'config_drive' => "", - 'user_data' => "", 'security_groups' => [{"name"=>"#{sec_group_name}", "links"=>[{"href"=>"http://nova1:8774/v1.1/admin//os-security-groups/111", "rel"=>"bookmark"}], "id"=>111}], 'key_name' => options['key_name'] || "" } From a70615cfe4d12c23c61fb2ea99e24b986ac53dd3 Mon Sep 17 00:00:00 2001 From: Ferran Rodenas Date: Thu, 14 Mar 2013 23:40:26 +0100 Subject: [PATCH 37/47] [openstack|compute] Allow booting a VM with NICs (net_id, port_id, fixed_ip) --- lib/fog/openstack/models/compute/server.rb | 8 +++++++- lib/fog/openstack/requests/compute/create_server.rb | 11 +++++++++++ 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/lib/fog/openstack/models/compute/server.rb b/lib/fog/openstack/models/compute/server.rb index 9f2433007..a19004e1f 100644 --- a/lib/fog/openstack/models/compute/server.rb +++ b/lib/fog/openstack/models/compute/server.rb @@ -50,6 +50,7 @@ module Fog self.security_groups = attributes.delete(:security_groups) self.min_count = attributes.delete(:min_count) self.max_count = attributes.delete(:max_count) + self.nics = attributes.delete(:nics) self.os_scheduler_hints = attributes.delete(:os_scheduler_hints) super @@ -238,6 +239,10 @@ module Fog @max_count = new_max_count end + def nics=(new_nics) + @nics = new_nics + end + def networks service.networks(:server => self) end @@ -256,7 +261,8 @@ module Fog 'security_groups' => @security_groups, 'min_count' => @min_count, 'max_count' => @max_count, - 'os:scheduler_hints' => @os_scheduler_hints + 'nics' => @nics, + 'os:scheduler_hints' => @os_scheduler_hints, } options['metadata'] = metadata.to_hash unless @metadata.nil? options = options.reject {|key, value| value.nil?} diff --git a/lib/fog/openstack/requests/compute/create_server.rb b/lib/fog/openstack/requests/compute/create_server.rb index 467bbaec9..4e701196d 100644 --- a/lib/fog/openstack/requests/compute/create_server.rb +++ b/lib/fog/openstack/requests/compute/create_server.rb @@ -41,6 +41,17 @@ module Fog end end + if options['nics'] + data['server']['networks'] = + Array(options['nics']).map do |nic| + { + 'uuid' => nic['net_id'], + 'fixed_ip' => nic['v4_fixed_ip'], + 'port' => nic['port_id'] + } + end + end + if options['os:scheduler_hints'] data['os:scheduler_hints'] = options['os:scheduler_hints'] end From 6c36ac14bc4538250d5474ca111c6abc9ebdf131 Mon Sep 17 00:00:00 2001 From: Ferran Rodenas Date: Fri, 15 Mar 2013 11:37:24 +0100 Subject: [PATCH 38/47] [openstack|compute] Use attribute accessor for nics --- lib/fog/openstack/models/compute/server.rb | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/lib/fog/openstack/models/compute/server.rb b/lib/fog/openstack/models/compute/server.rb index a19004e1f..67aa855ec 100644 --- a/lib/fog/openstack/models/compute/server.rb +++ b/lib/fog/openstack/models/compute/server.rb @@ -40,7 +40,7 @@ module Fog attribute :os_ext_sts_vm_state, :aliases => 'OS-EXT-STS:vm_state' attr_reader :password - attr_writer :image_ref, :flavor_ref, :os_scheduler_hints + attr_writer :image_ref, :flavor_ref, :nics, :os_scheduler_hints def initialize(attributes={}) @@ -239,10 +239,6 @@ module Fog @max_count = new_max_count end - def nics=(new_nics) - @nics = new_nics - end - def networks service.networks(:server => self) end From a3fb60937981fdc34f54ffe52718514feba60546 Mon Sep 17 00:00:00 2001 From: Kyle Rames Date: Fri, 15 Mar 2013 09:11:39 -0500 Subject: [PATCH 39/47] [rackspace|compute_v2] updated compute_v2 to get the appropriate endpoint from the service catalog when an endpoint is specified via :rackspace_endpoint with one of the known constants (DFW_ENDPOINT, ORD_ENDPOINT, LON_ENDPOINT); updated compute examples to use rackspace region --- lib/fog/rackspace/compute_v2.rb | 40 ++++++++++++++----- .../examples/compute_v2/create_image.rb | 2 +- .../examples/compute_v2/create_server.rb | 2 +- .../examples/compute_v2/delete_image.rb | 2 +- .../examples/compute_v2/delete_server.rb | 2 +- .../examples/compute_v2/detach_volume.rb | 2 +- .../examples/compute_v2/resize_server.rb | 2 +- .../examples/compute_v2/server_attachments.rb | 2 +- .../examples/compute_v2/server_metadata.rb | 2 +- tests/rackspace/compute_v2_tests.rb | 6 ++- 10 files changed, 43 insertions(+), 19 deletions(-) diff --git a/lib/fog/rackspace/compute_v2.rb b/lib/fog/rackspace/compute_v2.rb index 41d5ee504..89100b0f1 100644 --- a/lib/fog/rackspace/compute_v2.rb +++ b/lib/fog/rackspace/compute_v2.rb @@ -103,8 +103,7 @@ module Fog @rackspace_api_key = options[:rackspace_api_key] @rackspace_username = options[:rackspace_username] @rackspace_auth_url = options[:rackspace_auth_url] - @rackspace_endpoint = options[:rackspace_compute_url] || options[:rackspace_endpoint] - @rackspace_region = options[:rackspace_region] || :dfw + setup_custom_endpoint(options) @rackspace_must_reauthenticate = false @connection_options = options[:connection_options] || {} @@ -124,7 +123,7 @@ module Fog 'Accept' => 'application/json', 'X-Auth-Token' => auth_token }.merge!(params[:headers] || {}), - :host => @uri.host, + :host => endpoint_uri.host, :path => "#{endpoint_uri.path}/#{params[:path]}" })) rescue Excon::Errors::NotFound => error @@ -170,16 +169,37 @@ module Fog private - def deprecation_warnings(options) - Fog::Logger.deprecation("The :rackspace_endpoint option is deprecated. Please use :rackspace_compute_url for custom endpoints") if options[:rackspace_endpoint] + def setup_custom_endpoint(options) + endpoint = options[:rackspace_compute_url] || options[:rackspace_endpoint] - if [DFW_ENDPOINT, ORD_ENDPOINT, LON_ENDPOINT].include?(@rackspace_endpoint) && v2_authentication? - regions = @identity_service.service_catalog.display_service_regions(:cloudServersOpenStack) - Fog::Logger.deprecation("Please specify region using :rackspace_region rather than :rackspace_endpoint. Valid region for :rackspace_region are #{regions}.") + case endpoint + when DFW_ENDPOINT + @rackspace_region = :dfw + @rackspace_endpoint = nil + when ORD_ENDPOINT + @rackspace_region = :ord + @rackspace_endpoint = nil + when LON_ENDPOINT + @rackspace_region = :lon + @rackspace_endpoint = nil + else + # we are actually using a custom endpoint + @rackspace_endpoint = endpoint + @rackspace_region = options[:rackspace_region] || :dfw end end - def setup_endpoint(credentials) + def deprecation_warnings(options) + Fog::Logger.deprecation("The :rackspace_endpoint option is deprecated. Please use :rackspace_compute_url for custom endpoints") if options[:rackspace_endpoint] + + endpoint = options[:rackspace_compute_url] || options[:rackspace_endpoint] + if [DFW_ENDPOINT, ORD_ENDPOINT, LON_ENDPOINT].include?(endpoint) && v2_authentication? + regions = @identity_service.service_catalog.display_service_regions(service_name) + Fog::Logger.deprecation("Please specify region using :rackspace_region rather than :rackspace_endpoint. Valid regions for :rackspace_region are #{regions}.") + end + end + + def append_tenant_v1(credentials) account_id = credentials['X-Server-Management-Url'].match(/.*\/([\d]+)$/)[1] endpoint = @rackspace_endpoint || credentials['X-Server-Management-Url'] || DFW_ENDPOINT @@ -189,7 +209,7 @@ module Fog def authenticate_v1(options) credentials = Fog::Rackspace.authenticate(options, @connection_options) - setup_endpoint credentials + append_tenant_v1 credentials @auth_token = credentials['X-Auth-Token'] end end diff --git a/lib/fog/rackspace/examples/compute_v2/create_image.rb b/lib/fog/rackspace/examples/compute_v2/create_image.rb index 58048f854..52ded23b5 100644 --- a/lib/fog/rackspace/examples/compute_v2/create_image.rb +++ b/lib/fog/rackspace/examples/compute_v2/create_image.rb @@ -40,7 +40,7 @@ service = Fog::Compute.new({ :rackspace_username => rackspace_username, :rackspace_api_key => rackspace_api_key, :version => :v2, # Use Next Gen Cloud Servers - :rackspace_endpoint => Fog::Compute::RackspaceV2::ORD_ENDPOINT #Use Chicago Region + :rackspace_region => :ord #Use Chicago Region }) # retrieve list of servers diff --git a/lib/fog/rackspace/examples/compute_v2/create_server.rb b/lib/fog/rackspace/examples/compute_v2/create_server.rb index d519d031b..342507937 100644 --- a/lib/fog/rackspace/examples/compute_v2/create_server.rb +++ b/lib/fog/rackspace/examples/compute_v2/create_server.rb @@ -29,7 +29,7 @@ service = Fog::Compute.new({ :rackspace_username => rackspace_username, :rackspace_api_key => rackspace_api_key, :version => :v2, # Use Next Gen Cloud Servers - :rackspace_endpoint => Fog::Compute::RackspaceV2::ORD_ENDPOINT #Use Chicago Region + :rackspace_region => :ord #Use Chicago Region }) # pick the first flavor diff --git a/lib/fog/rackspace/examples/compute_v2/delete_image.rb b/lib/fog/rackspace/examples/compute_v2/delete_image.rb index 779db40d0..9508de2d1 100644 --- a/lib/fog/rackspace/examples/compute_v2/delete_image.rb +++ b/lib/fog/rackspace/examples/compute_v2/delete_image.rb @@ -40,7 +40,7 @@ service = Fog::Compute.new({ :rackspace_username => rackspace_username, :rackspace_api_key => rackspace_api_key, :version => :v2, # Use Next Gen Cloud Servers - :rackspace_endpoint => Fog::Compute::RackspaceV2::ORD_ENDPOINT #Use Chicago Region + :rackspace_region => :ord #Use Chicago Region }) # retrieve list of images diff --git a/lib/fog/rackspace/examples/compute_v2/delete_server.rb b/lib/fog/rackspace/examples/compute_v2/delete_server.rb index cd37d268a..b01419dc4 100644 --- a/lib/fog/rackspace/examples/compute_v2/delete_server.rb +++ b/lib/fog/rackspace/examples/compute_v2/delete_server.rb @@ -40,7 +40,7 @@ service = Fog::Compute.new({ :rackspace_username => rackspace_username, :rackspace_api_key => rackspace_api_key, :version => :v2, # Use Next Gen Cloud Servers - :rackspace_endpoint => Fog::Compute::RackspaceV2::ORD_ENDPOINT #Use Chicago Region + :rackspace_region => :ord #Use Chicago Region }) #retrieve list of servers diff --git a/lib/fog/rackspace/examples/compute_v2/detach_volume.rb b/lib/fog/rackspace/examples/compute_v2/detach_volume.rb index 85f01fbb9..189b4b2a2 100644 --- a/lib/fog/rackspace/examples/compute_v2/detach_volume.rb +++ b/lib/fog/rackspace/examples/compute_v2/detach_volume.rb @@ -52,7 +52,7 @@ compute_service = Fog::Compute.new({ :rackspace_username => rackspace_username, :rackspace_api_key => rackspace_api_key, :version => :v2, # Use Next Gen Cloud Servers - :rackspace_endpoint => Fog::Compute::RackspaceV2::ORD_ENDPOINT #Use Chicago Region + :rackspace_region => :ord #Use Chicago Region }) cbs_service = Fog::Rackspace::BlockStorage.new({ diff --git a/lib/fog/rackspace/examples/compute_v2/resize_server.rb b/lib/fog/rackspace/examples/compute_v2/resize_server.rb index c404a47cd..b909ba153 100644 --- a/lib/fog/rackspace/examples/compute_v2/resize_server.rb +++ b/lib/fog/rackspace/examples/compute_v2/resize_server.rb @@ -51,7 +51,7 @@ service = Fog::Compute.new({ :rackspace_username => rackspace_username, :rackspace_api_key => rackspace_api_key, :version => :v2, # Use Next Gen Cloud Servers - :rackspace_endpoint => Fog::Compute::RackspaceV2::ORD_ENDPOINT #Use Chicago Region + :rackspace_region => :ord #Use Chicago Region }) #retrieve list of servers diff --git a/lib/fog/rackspace/examples/compute_v2/server_attachments.rb b/lib/fog/rackspace/examples/compute_v2/server_attachments.rb index 345ab846e..11a12f197 100644 --- a/lib/fog/rackspace/examples/compute_v2/server_attachments.rb +++ b/lib/fog/rackspace/examples/compute_v2/server_attachments.rb @@ -40,7 +40,7 @@ compute_service = Fog::Compute.new({ :rackspace_username => rackspace_username, :rackspace_api_key => rackspace_api_key, :version => :v2, # Use Next Gen Cloud Servers - :rackspace_endpoint => Fog::Compute::RackspaceV2::ORD_ENDPOINT #Use Chicago Region + :rackspace_region => :ord #Use Chicago Region }) cbs_service = Fog::Rackspace::BlockStorage.new({ diff --git a/lib/fog/rackspace/examples/compute_v2/server_metadata.rb b/lib/fog/rackspace/examples/compute_v2/server_metadata.rb index 1f9bdac18..56e36f7bd 100644 --- a/lib/fog/rackspace/examples/compute_v2/server_metadata.rb +++ b/lib/fog/rackspace/examples/compute_v2/server_metadata.rb @@ -30,7 +30,7 @@ service = Fog::Compute.new({ :rackspace_username => rackspace_username, :rackspace_api_key => rackspace_api_key, :version => :v2, # Use Next Gen Cloud Servers - :rackspace_endpoint => Fog::Compute::RackspaceV2::ORD_ENDPOINT #Use Chicago Region + :rackspace_region => :ord #Use Chicago Region }) # Pick the first flavor diff --git a/tests/rackspace/compute_v2_tests.rb b/tests/rackspace/compute_v2_tests.rb index 0ffc86e31..a9eef9a1f 100644 --- a/tests/rackspace/compute_v2_tests.rb +++ b/tests/rackspace/compute_v2_tests.rb @@ -30,7 +30,7 @@ Shindo.tests('Fog::Compute::RackspaceV2', ['rackspace']) do tests('variables populated') do returns(true, "auth token populated") { !@service.send(:auth_token).nil? } returns(false, "path populated") { @service.instance_variable_get("@uri").path.nil? } - returns(true, "identity_service was not used") { @service.instance_variable_get("@identity_service").nil? } + returns(true, "identity_service was not used") { @service.instance_variable_get("@identity_service").nil? } end tests('custom endpoint') do @@ -76,6 +76,10 @@ Shindo.tests('Fog::Compute::RackspaceV2', ['rackspace']) do returns(true, "auth token populated") { !@service.send(:auth_token).nil? } returns(true) { (@service.instance_variable_get("@uri").host =~ /dfw/) != nil } end + tests('specify old contstant style service endoint').succeeds do + @service = Fog::Compute::RackspaceV2.new :rackspace_endpoint => Fog::Compute::RackspaceV2::ORD_ENDPOINT + @service.list_flavors + end tests('specify region') do @service = Fog::Compute::RackspaceV2.new :rackspace_region => :ord returns(true, "auth token populated") { !@service.send(:auth_token).nil? } From f82b25c986d15c7c45c38b5c2fb844019f3a2a4b Mon Sep 17 00:00:00 2001 From: Kyle Rames Date: Fri, 15 Mar 2013 11:55:40 -0500 Subject: [PATCH 40/47] [rackspace|compute_v2] fixed chef issue --- lib/fog/rackspace/compute_v2.rb | 34 ++++++++++++++--------------- lib/fog/rackspace/service.rb | 9 ++++---- tests/rackspace/cdn_tests.rb | 2 +- tests/rackspace/compute_v2_tests.rb | 2 +- 4 files changed, 23 insertions(+), 24 deletions(-) diff --git a/lib/fog/rackspace/compute_v2.rb b/lib/fog/rackspace/compute_v2.rb index 89100b0f1..f992a0638 100644 --- a/lib/fog/rackspace/compute_v2.rb +++ b/lib/fog/rackspace/compute_v2.rb @@ -170,30 +170,30 @@ module Fog private def setup_custom_endpoint(options) - endpoint = options[:rackspace_compute_url] || options[:rackspace_endpoint] + @rackspace_endpoint = options[:rackspace_compute_url] || options[:rackspace_endpoint] - case endpoint - when DFW_ENDPOINT - @rackspace_region = :dfw - @rackspace_endpoint = nil - when ORD_ENDPOINT - @rackspace_region = :ord - @rackspace_endpoint = nil - when LON_ENDPOINT - @rackspace_region = :lon - @rackspace_endpoint = nil - else - # we are actually using a custom endpoint - @rackspace_endpoint = endpoint - @rackspace_region = options[:rackspace_region] || :dfw + if v2_authentication? + case @rackspace_endpoint + when DFW_ENDPOINT + @rackspace_endpoint = nil + @rackspace_region = :dfw + when ORD_ENDPOINT + @rackspace_endpoint = nil + @rackspace_region = :ord + when LON_ENDPOINT + @rackspace_endpoint = nil + @rackspace_region = :lon + else + # we are actually using a custom endpoint + @rackspace_region = options[:rackspace_region] || :dfw + end end end def deprecation_warnings(options) Fog::Logger.deprecation("The :rackspace_endpoint option is deprecated. Please use :rackspace_compute_url for custom endpoints") if options[:rackspace_endpoint] - endpoint = options[:rackspace_compute_url] || options[:rackspace_endpoint] - if [DFW_ENDPOINT, ORD_ENDPOINT, LON_ENDPOINT].include?(endpoint) && v2_authentication? + if [DFW_ENDPOINT, ORD_ENDPOINT, LON_ENDPOINT].include?(@rackspace_endpoint) && v2_authentication? regions = @identity_service.service_catalog.display_service_regions(service_name) Fog::Logger.deprecation("Please specify region using :rackspace_region rather than :rackspace_endpoint. Valid regions for :rackspace_region are #{regions}.") end diff --git a/lib/fog/rackspace/service.rb b/lib/fog/rackspace/service.rb index 5e75cea5d..3d0256231 100644 --- a/lib/fog/rackspace/service.rb +++ b/lib/fog/rackspace/service.rb @@ -33,22 +33,21 @@ module Fog private def authentication_method - return :authenticate_v2 unless @rackspace_auth_url - if @rackspace_auth_url =~ /v2(\.\d)?\w*$/ + if v2_authentication? :authenticate_v2 else Fog::Logger.deprecation "Authentication using a v1.0/v1.1 endpoint is deprecated. Please specify a v2.0 endpoint using :rackpace_auth_url.\ For a list of v2.0 endpoints refer to http://docs.rackspace.com/auth/api/v2.0/auth-client-devguide/content/Endpoints-d1e180.html" :authenticate_v1 - end + end end def v1_authentication? - @identity_service.nil? + !v2_authentication? end def v2_authentication? - @identity_service != nil + @rackspace_auth_url.nil? || @rackspace_auth_url =~ /v2(\.\d)?\w*$/ end def authenticate_v2(identity_options) diff --git a/tests/rackspace/cdn_tests.rb b/tests/rackspace/cdn_tests.rb index 1ffc1aa8a..66745157a 100644 --- a/tests/rackspace/cdn_tests.rb +++ b/tests/rackspace/cdn_tests.rb @@ -6,7 +6,7 @@ Shindo.tests('Fog::CDN::Rackspace', ['rackspace']) do end tests('#authentication_method') do - @service = Fog::Storage::Rackspace.new + @service = Fog::CDN::Rackspace.new assert_method nil, :authenticate_v2 diff --git a/tests/rackspace/compute_v2_tests.rb b/tests/rackspace/compute_v2_tests.rb index a9eef9a1f..5b5d31763 100644 --- a/tests/rackspace/compute_v2_tests.rb +++ b/tests/rackspace/compute_v2_tests.rb @@ -6,7 +6,7 @@ Shindo.tests('Fog::Compute::RackspaceV2', ['rackspace']) do end tests('#authentication_method') do - @service = Fog::Storage::Rackspace.new + @service = Fog::Compute::RackspaceV2.new assert_method nil, :authenticate_v2 From 99e7a09f785f0d880c359e5c2978372133be55f9 Mon Sep 17 00:00:00 2001 From: Mick Pollard Date: Mon, 18 Mar 2013 08:28:31 +1100 Subject: [PATCH 41/47] fix bug where servers.all was ignoring filters due to hash merging in the wrong direction. --- lib/fog/vsphere/models/compute/servers.rb | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/lib/fog/vsphere/models/compute/servers.rb b/lib/fog/vsphere/models/compute/servers.rb index 46672e4b5..727b873f2 100644 --- a/lib/fog/vsphere/models/compute/servers.rb +++ b/lib/fog/vsphere/models/compute/servers.rb @@ -17,13 +17,15 @@ module Fog # 'folder' => '/Datacenters/vm/Jeff/Templates' will be MUCH faster. # than simply listing everything. def all(filters = { }) - load service.list_virtual_machines(filters.merge( - :datacenter => datacenter, - :cluster => cluster, - :network => network, - :resource_pool => resource_pool, - :folder => folder - )) + f = { + :datacenter => datacenter, + :cluster => cluster, + :network => network, + :resource_pool => resource_pool, + :folder => folder + }.merge(filters) + + load service.list_virtual_machines(f) end def get(id, datacenter = nil) @@ -31,9 +33,7 @@ module Fog rescue Fog::Compute::Vsphere::NotFound nil end - end - end end end From 34f49feade45398383efb4fac250e8126d382b45 Mon Sep 17 00:00:00 2001 From: Dominic Cleal Date: Tue, 19 Mar 2013 15:55:48 +0000 Subject: [PATCH 42/47] [libvirt|compute] handle missing tag in libvirt node info Fixes #1652: libvirt provider requires a field that libvirt specifies as optional --- lib/fog/libvirt/requests/compute/get_node_info.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/fog/libvirt/requests/compute/get_node_info.rb b/lib/fog/libvirt/requests/compute/get_node_info.rb index 1d1d037da..9903d7673 100644 --- a/lib/fog/libvirt/requests/compute/get_node_info.rb +++ b/lib/fog/libvirt/requests/compute/get_node_info.rb @@ -14,7 +14,7 @@ module Fog node_hash[:uri] = client.uri xml = client.sys_info rescue nil [:uuid, :manufacturer, :product, :serial].each do |attr| - node_hash[attr] = node_attr(attr, xml) + node_hash[attr] = node_attr(attr, xml) rescue nil end if xml node_hash[:hostname] = client.hostname From 14b09e82d803e8905c25ff5d8c687631b57aa20e Mon Sep 17 00:00:00 2001 From: Kyle Rames Date: Wed, 20 Mar 2013 09:06:35 -0500 Subject: [PATCH 43/47] [core] Updated to make ssh timeout user configurable. --- lib/fog/core/ssh.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/fog/core/ssh.rb b/lib/fog/core/ssh.rb index 4945416fb..ec5d9ed74 100644 --- a/lib/fog/core/ssh.rb +++ b/lib/fog/core/ssh.rb @@ -46,7 +46,7 @@ module Fog raise ArgumentError.new(':key_data, :keys, :password or a loaded ssh-agent is required to initialize SSH') end - options[:timeout] = 30 + options[:timeout] ||= 30 if options[:key_data] || options[:keys] options[:keys_only] = true #Explicitly set these so net-ssh doesn't add the default keys From 987f6abc8377455e3aa44395951839b625ac8b1b Mon Sep 17 00:00:00 2001 From: Sergio Rubio Date: Wed, 13 Mar 2013 16:56:55 +0100 Subject: [PATCH 44/47] [openstack|glance] Added image service example Download CirrOS 0.3.0 image from launchpad (~6.5MB) to /tmp and upload it to Glance (the OpenStack Image Service). --- .../examples/image/upload-test-image.rb | 77 +++++++++++++++++++ 1 file changed, 77 insertions(+) create mode 100644 lib/fog/openstack/examples/image/upload-test-image.rb diff --git a/lib/fog/openstack/examples/image/upload-test-image.rb b/lib/fog/openstack/examples/image/upload-test-image.rb new file mode 100644 index 000000000..7f7dc1850 --- /dev/null +++ b/lib/fog/openstack/examples/image/upload-test-image.rb @@ -0,0 +1,77 @@ +require 'securerandom' +require 'rubygems/package' +require 'zlib' +require 'fog' + +# +# Download CirrOS 0.3.0 image from launchpad (~6.5MB) to /tmp +# and upload it to Glance (the OpenStack Image Service). +# +# You will need to source OpenStack credentials since the script +# reads the following envionment variables: +# +# OS_PASSWORD +# OS_USERNAME +# OS_AUTH_URL +# OS_TENANT_NAME +# +# Should work with Fog >= 1.9, ruby 1.8.7 and 2.0 +# +image_url = "https://launchpadlibrarian.net/83305869/cirros-0.3.0-x86_64-uec.tar.gz" +image_out = File.open("/tmp/cirros-image-#{SecureRandom.hex}", 'wb') +extract_path = "/tmp/cirros-#{SecureRandom.hex}-dir" +ami = "#{extract_path}/cirros-0.3.0-x86_64-blank.img" +aki = "#{extract_path}/cirros-0.3.0-x86_64-vmlinuz" +ari = "#{extract_path}/cirros-0.3.0-x86_64-initrd" + +FileUtils.mkdir_p extract_path + +# Efficient image write +puts "Downloading Cirros image..." +streamer = lambda do |chunk, remaining_bytes, total_bytes| + image_out.write chunk +end +Excon.get image_url, :response_block => streamer +image_out.close +puts "Image downloaded to #{image_out.path}" + +puts "Extracting image contents to #{extract_path}..." +Gem::Package::TarReader.new(Zlib::GzipReader.open(image_out.path)).each do |entry| + FileUtils.mkdir_p "#{extract_path}/#{File.dirname(entry.full_name)}" + File.open "#{extract_path}/#{entry.full_name}", 'w' do |f| + f.write entry.read + end +end + +image_service = Fog::Image.new({ + :provider => 'OpenStack', + :openstack_api_key => ENV['OS_PASSWORD'], + :openstack_username => ENV["OS_USERNAME"], + :openstack_auth_url => ENV["OS_AUTH_URL"] + "/tokens", + :openstack_tenant => ENV["OS_TENANT_NAME"] +}) + +puts "Uploading AKI..." +aki = image_service.images.create :name => 'cirros-0.3.0-amd64-aki', + :size => File.size(aki), + :disk_format => 'aki', + :container_format => 'aki', + :location => aki + +puts "Uploading ARI..." +ari = image_service.images.create :name => 'cirros-0.3.0-amd64-ari', + :size => File.size(ari), + :disk_format => 'ari', + :container_format => 'ari', + :location => ari + +puts "Uploading AMI..." +image_service.images.create :name => 'cirros-0.3.0-amd64', + :size => File.size(ami), + :disk_format => 'ami', + :container_format => 'ami', + :location => ami, + :properties => { + 'kernel_id' => aki.id, + 'ramdisk_id' => ari.id + } From 09d50c0d33f24a4fe359b6e0996f27d6609692c8 Mon Sep 17 00:00:00 2001 From: Sergio Rubio Date: Wed, 20 Mar 2013 17:50:31 +0100 Subject: [PATCH 45/47] [openstack|network] remove superfluous Router model attributes See #1603 --- lib/fog/openstack/models/network/router.rb | 2 -- 1 file changed, 2 deletions(-) diff --git a/lib/fog/openstack/models/network/router.rb b/lib/fog/openstack/models/network/router.rb index 6f4f2bcb5..047320e83 100644 --- a/lib/fog/openstack/models/network/router.rb +++ b/lib/fog/openstack/models/network/router.rb @@ -14,8 +14,6 @@ module Fog identity :id attribute :name - attribute :network_id - attribute :subnet_id attribute :admin_state_up attribute :tenant_id attribute :external_gateway_info From 426037e87d74aaea6194bc3a4a2d64edb9b19fb4 Mon Sep 17 00:00:00 2001 From: Josh Lane & Ines Sombra Date: Wed, 20 Mar 2013 10:24:11 -0700 Subject: [PATCH 46/47] [aws] mock update_server_certificate --- .../requests/iam/update_server_certificate.rb | 27 ++++++++++++++++ .../requests/iam/server_certificate_tests.rb | 32 +++++++++++++++++++ 2 files changed, 59 insertions(+) diff --git a/lib/fog/aws/requests/iam/update_server_certificate.rb b/lib/fog/aws/requests/iam/update_server_certificate.rb index d7bc6e04e..0b6a9ec2f 100644 --- a/lib/fog/aws/requests/iam/update_server_certificate.rb +++ b/lib/fog/aws/requests/iam/update_server_certificate.rb @@ -32,6 +32,33 @@ module Fog end end + + class Mock + def update_server_certificate(server_certificate_name, options = {}) + new_server_certificate_name = options['NewServerCertificateName'] + if self.data[:server_certificates][new_server_certificate_name] + raise Fog::AWS::IAM::EntityAlreadyExists.new("The Server Certificate with name #{server_certificate_name} already exists.") + end + unless certificate = self.data[:server_certificates].delete(server_certificate_name) + raise Fog::AWS::IAM::NotFound.new("The Server Certificate with name #{server_certificate_name} cannot be found.") + end + + if new_server_certificate_name + certificate['ServerCertificateName'] = new_server_certificate_name + end + + if new_path = options['NewPath'] + certificate['Path'] = new_path + end + + self.data[:server_certificates][certificate['ServerCertificateName']] = certificate + + Excon::Response.new.tap do |response| + response.body = { 'RequestId' => Fog::AWS::Mock.request_id } + response.status = 200 + end + end + end end end end diff --git a/tests/aws/requests/iam/server_certificate_tests.rb b/tests/aws/requests/iam/server_certificate_tests.rb index 6f835863d..aec71b3db 100644 --- a/tests/aws/requests/iam/server_certificate_tests.rb +++ b/tests/aws/requests/iam/server_certificate_tests.rb @@ -13,6 +13,9 @@ Shindo.tests('AWS::IAM | server certificate requests', ['aws']) do 'Certificate' => @certificate_format, 'RequestId' => String } + @update_format = { + 'RequestId' => String + } @get_server_certificate_format = { 'Certificate' => @certificate_format, 'RequestId' => String @@ -64,6 +67,35 @@ Shindo.tests('AWS::IAM | server certificate requests', ['aws']) do end end + tests('#update_server_certificate') do + public_key = AWS::IAM::SERVER_CERT_PUBLIC_KEY + private_key = AWS::IAM::SERVER_CERT_PRIVATE_KEY + key_name = "update-key" + + Fog::AWS::IAM.new.upload_server_certificate(public_key, private_key, key_name) + + tests('duplicate name').raises(Fog::AWS::IAM::EntityAlreadyExists) do + other_key_name = "other-key-name" + Fog::AWS::IAM.new.upload_server_certificate(public_key, private_key, other_key_name) + + Fog::AWS::IAM.new.update_server_certificate(key_name, {'NewServerCertificateName' => other_key_name}) + end + + tests('unknown name').raises(Fog::AWS::IAM::NotFound) do + Fog::AWS::IAM.new.update_server_certificate("unknown-key-name", {'NewServerCertificateName' => "other-keyname"}) + end + + tests('format').formats(@update_format) do + Fog::AWS::IAM.new.update_server_certificate(key_name).body + end + + tests('updates name') do + other_key_name = "successful-update-key-name" + Fog::AWS::IAM.new.update_server_certificate(key_name, {'NewServerCertificateName' => other_key_name}) + returns(true) { Fog::AWS::IAM.new.get_server_certificate(other_key_name).body['Certificate']['ServerCertificateName'] == other_key_name } + end + end + tests('#get_server_certificate').formats(@get_server_certificate_format) do tests('raises NotFound').raises(Fog::AWS::IAM::NotFound) do Fog::AWS::IAM.new.get_server_certificate("#{@key_name}fake") From 7da4fb405fb4a71e51a35aeb022a7f3655fdc8f2 Mon Sep 17 00:00:00 2001 From: Sergio Rubio Date: Thu, 21 Mar 2013 13:42:14 +0100 Subject: [PATCH 47/47] [openstack|network] Fix #connection deprecation replacing it with #service --- lib/fog/openstack/models/network/floating_ip.rb | 4 ++-- lib/fog/openstack/models/network/floating_ips.rb | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/fog/openstack/models/network/floating_ip.rb b/lib/fog/openstack/models/network/floating_ip.rb index b38fc512e..40e2600f3 100644 --- a/lib/fog/openstack/models/network/floating_ip.rb +++ b/lib/fog/openstack/models/network/floating_ip.rb @@ -29,7 +29,7 @@ module Fog def create requires :floating_network_id - merge_attributes(connection.create_floating_ip(self.floating_network_id, + merge_attributes(service.create_floating_ip(self.floating_network_id, self.attributes).body['floatingip']) @@ -42,7 +42,7 @@ module Fog def destroy requires :id - connection.delete_floating_ip(self.id) + service.delete_floating_ip(self.id) true end diff --git a/lib/fog/openstack/models/network/floating_ips.rb b/lib/fog/openstack/models/network/floating_ips.rb index a7e081a65..9a827f015 100644 --- a/lib/fog/openstack/models/network/floating_ips.rb +++ b/lib/fog/openstack/models/network/floating_ips.rb @@ -17,7 +17,7 @@ module Fog def all(filters = filters) self.filters = filters - load(connection.list_floating_ips(filters).body['floatingips']) + load(service.list_floating_ips(filters).body['floatingips']) end def get(floating_network_id)