1
0
Fork 0
mirror of https://github.com/fog/fog.git synced 2022-11-09 13:51:43 -05:00

Merge pull request #3637 from dhague/master

[openstack] hierarchical projects: Array of Project instead of Array of Hash.
This commit is contained in:
Wesley Beary 2015-08-10 14:46:29 -05:00
commit fe043621da
5 changed files with 708 additions and 339 deletions

View file

@ -69,38 +69,19 @@ module Fog
attr_reader :openstack_project_domain_id
def initialize_identity options
@openstack_auth_token = options[:openstack_auth_token]
# Create @openstack_* instance variables from all :openstack_* options
options.select{|x|x.to_s.start_with? 'openstack'}.each do |openstack_param, value|
instance_variable_set "@#{openstack_param}".to_sym, value
end
@auth_token ||= options[:openstack_auth_token]
@openstack_identity_public_endpoint = options[:openstack_identity_endpoint]
@openstack_username = options[:openstack_username]
@openstack_userid = options[:openstack_userid]
@openstack_domain_name = options[:openstack_domain_name]
@openstack_user_domain = options[:openstack_user_domain]
@openstack_project_domain = options[:openstack_project_domain]
@openstack_domain_id = options[:openstack_domain_id]
@openstack_user_domain_id = options[:openstack_user_domain_id]
@openstack_project_domain_id = options[:openstack_project_domain_id]
@openstack_project_name = options[:openstack_project_name]
@openstack_tenant = options[:openstack_tenant]
@openstack_tenant_id = options[:openstack_tenant_id]
@openstack_auth_uri = URI.parse(options[:openstack_auth_url])
@openstack_management_url = options[:openstack_management_url]
@openstack_must_reauthenticate = false
@openstack_endpoint_type = options[:openstack_endpoint_type] || 'publicURL'
@openstack_region = options[:openstack_region]
unless @auth_token
missing_credentials = Array.new
@openstack_api_key = options[:openstack_api_key]
@openstack_username = options[:openstack_username]
@openstack_userid = options[:openstack_userid]
missing_credentials << :openstack_api_key unless @openstack_api_key
unless @openstack_username || @openstack_userid
@ -116,47 +97,34 @@ module Fog
end
def credentials
{ :provider => 'openstack',
:openstack_domain_name => @openstack_domain_name,
:openstack_user_domain => @openstack_user_domain,
:openstack_project_domain => @openstack_project_domain,
:openstack_domain_id => @openstack_domain_id,
:openstack_user_domain_id => @openstack_user_domain_id,
:openstack_project_domain_id => @openstack_project_domain_id,
options = { :provider => 'openstack',
:openstack_auth_url => @openstack_auth_uri.to_s,
:openstack_auth_token => @auth_token,
:openstack_management_url => @openstack_management_url,
:openstack_identity_endpoint => @openstack_identity_public_endpoint,
:openstack_region => @openstack_region,
:current_user => @current_user,
:current_user_id => @current_user_id,
:current_tenant => @current_tenant }
openstack_options.merge options
end
private
def openstack_options
options={}
# Create a hash of (:openstack_*, value) of all the @openstack_* instance variables
self.instance_variables.select{|x|x.to_s.start_with? '@openstack'}.each do |openstack_param|
option_name = openstack_param.to_s[1..-1]
options[option_name.to_sym] = instance_variable_get openstack_param
end
options
end
def authenticate
if !@openstack_management_url || @openstack_must_reauthenticate
options = {
:openstack_tenant => @openstack_tenant,
:openstack_tenant_id => @openstack_tenant_id,
:openstack_api_key => @openstack_api_key,
:openstack_username => @openstack_username,
:openstack_userid => @openstack_userid,
:openstack_user_domain => @openstack_user_domain,
:openstack_project_domain => @openstack_project_domain,
:openstack_user_domain_id => @openstack_user_domain_id,
:openstack_project_domain_id => @openstack_project_domain_id,
:openstack_domain_name => @openstack_domain_name,
:openstack_project_name => @openstack_project_name,
:openstack_domain_id => @openstack_domain_id,
:openstack_project_id => @openstack_project_id,
:openstack_auth_uri => @openstack_auth_uri,
:openstack_auth_token => @openstack_must_reauthenticate ? nil : @openstack_auth_token,
:openstack_service_type => @openstack_service_type,
:openstack_service_name => @openstack_service_name,
:openstack_endpoint_type => @openstack_endpoint_type,
:openstack_region => @openstack_region
}
options = openstack_options
options[:openstack_auth_token] = @openstack_must_reauthenticate ? nil : @openstack_auth_token
credentials = Fog::OpenStack.authenticate(options, @connection_options)

View file

@ -13,6 +13,8 @@ module Fog
attribute :name
attribute :links
attribute :parent_id
attribute :subtree
attribute :parents
def to_s
self.name
@ -87,13 +89,6 @@ module Fog
service.revoke_project_group_role(self.id, group_id, role_id)
end
def subtree
@attributes['subtree']
end
def parents
@attributes['parents']
end
end
end
end

View file

@ -23,10 +23,20 @@ module Fog
cached_project = self.find { |project| project.id == id } if options.empty?
return cached_project if cached_project
project_hash = service.get_project(id, options).body['project']
Fog::Identity::OpenStack::V3::Project.new(
project_hash.merge(:service => service))
top_project = project_from_hash(project_hash, service)
if options.include? :subtree_as_list
top_project.subtree.map! {|proj_hash| project_from_hash(proj_hash['project'], service)}
end
if options.include? :parents_as_list
top_project.parents.map! {|proj_hash| project_from_hash(proj_hash['project'], service)}
end
return top_project
end
private
def project_from_hash(project_hash, service)
Fog::Identity::OpenStack::V3::Project.new(project_hash.merge(:service => service))
end
end
end
end

View file

@ -649,9 +649,16 @@ RSpec.describe Fog::Identity::OpenStack::V3 do
# Get the children of foobar, as a list of objects
foobar_kids = @service.projects.find_by_id(foobar_id, :subtree_as_list).subtree
expect(foobar_kids.length).to eq 3
expect([foobar_kids[0]['project']['id'],foobar_kids[1]['project']['id'],foobar_kids[2]['project']['id']].sort
expect([foobar_kids[0].id,foobar_kids[1].id,foobar_kids[2].id].sort
).to eq [baz_id, boo_id, booboo_id].sort
# Create a another sub-project of boo called fooboo and check that it appears in the parent's subtree
fooboo_project = @service.projects.create(:name => 'p-fooboo67', :parent_id => boo_id)
fooboo_id = fooboo_project.id
fooboo_project.grant_role_to_user(prj_role.id, @service.current_user_id)
foobar_new_kids = @service.projects.find_by_id(foobar_id, :subtree_as_list).subtree
expect(foobar_new_kids.length).to eq 4
# Get the parents of booboo, as a tree of IDs
booboo_parents = @service.projects.find_by_id(booboo_id, :parents_as_ids).parents
expect(booboo_parents.keys.length).to eq 1
@ -664,10 +671,10 @@ RSpec.describe Fog::Identity::OpenStack::V3 do
# Get the parents of booboo, as a list of objects
booboo_parents = @service.projects.find_by_id(booboo_id, :parents_as_list).parents
expect(booboo_parents.length).to eq 2
expect([booboo_parents[0]['project']['id'],booboo_parents[1]['project']['id']].sort
).to eq [foobar_id, boo_id].sort
expect([booboo_parents[0].id,booboo_parents[1].id].sort).to eq [foobar_id, boo_id].sort
ensure
# Delete the projects
fooboo_project.destroy if fooboo_project
booboo_project.destroy if booboo_project
boo_project.destroy if boo_project
baz_project.destroy if baz_project
@ -675,8 +682,10 @@ RSpec.describe Fog::Identity::OpenStack::V3 do
prj_role = @service.roles.all(:name => 'r-project67').first unless prj_role
prj_role.destroy if prj_role
# Check that the deletion worked
expect { @service.projects.find_by_id foobar_id }.to raise_error(Fog::Identity::OpenStack::NotFound)
['p-foobar67', 'p-baz67', 'p-boo67', 'p-booboo67'].each do |project_name|
expect { @service.projects.find_by_id foobar_id }.to raise_error(Fog::Identity::OpenStack::NotFound) if foobar_id
['p-booboo67', 'p-fooboo67', 'p-boo67', 'p-baz67', 'p-foobar67'].each do |project_name|
prj = @service.projects.all(:name => project_name).first
prj.destroy if prj
expect(@service.projects.all(:name => project_name).length).to be 0
end
end