cfoundry_helper 0.2.1
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +8 -0
- data/.gitmodules +3 -0
- data/CHANGELOG.textile +10 -0
- data/Gemfile +3 -0
- data/Gemfile.lock +95 -0
- data/README.textile +55 -0
- data/Rakefile +24 -0
- data/VERSION +1 -0
- data/bin/add_users_to_org +94 -0
- data/bin/create_space_for_org +79 -0
- data/bin/delete_orgs_and_users +73 -0
- data/cfoundry_helper.gemspec +39 -0
- data/config/services.yml.example +22 -0
- data/lib/cfoundry_helper.rb +18 -0
- data/lib/cfoundry_helper/helpers.rb +6 -0
- data/lib/cfoundry_helper/helpers/client_helper.rb +106 -0
- data/lib/cfoundry_helper/helpers/organization_helper.rb +148 -0
- data/lib/cfoundry_helper/helpers/space_helper.rb +125 -0
- data/lib/cfoundry_helper/helpers/user_helper.rb +148 -0
- data/lib/cfoundry_helper/models.rb +4 -0
- data/lib/cfoundry_helper/models/organization_role.rb +18 -0
- data/lib/cfoundry_helper/models/space_role.rb +18 -0
- data/lib/cfoundry_helper/version.rb +3 -0
- data/spec/integration_test.rb +11 -0
- data/spec/spec_helper.rb +10 -0
- metadata +273 -0
@@ -0,0 +1,39 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'cfoundry_helper/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = "cfoundry_helper"
|
8
|
+
spec.version = CFoundryHelper::VERSION
|
9
|
+
spec.authors = ["Julian Weber"]
|
10
|
+
spec.email = ["jweber@anynines.com"]
|
11
|
+
spec.description = %q{This gem provides additional helper classes and scripts for the cfoundry gem.}
|
12
|
+
spec.summary = %q{This gem provides additional helper classes and scripts for the cfoundry gem.}
|
13
|
+
spec.homepage = "http://www.anynines.com"
|
14
|
+
spec.license = "MIT"
|
15
|
+
|
16
|
+
spec.files = `git ls-files`.split($/)
|
17
|
+
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
18
|
+
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
19
|
+
spec.require_paths = ["lib"]
|
20
|
+
|
21
|
+
spec.required_ruby_version = '>= 1.9.3'
|
22
|
+
|
23
|
+
spec.add_development_dependency "bundler", "~> 1.3"
|
24
|
+
spec.add_development_dependency "rake"
|
25
|
+
|
26
|
+
# cf integration-test-support dependencies
|
27
|
+
spec.add_development_dependency "nats"
|
28
|
+
spec.add_development_dependency "rspec"
|
29
|
+
spec.add_development_dependency "cf-uaa-lib"
|
30
|
+
spec.add_development_dependency "activesupport"
|
31
|
+
spec.add_development_dependency "httpclient"
|
32
|
+
spec.add_development_dependency "yajl-ruby"
|
33
|
+
|
34
|
+
spec.add_development_dependency "pry"
|
35
|
+
spec.add_development_dependency "pry-debugger"
|
36
|
+
|
37
|
+
spec.add_dependency "cfoundry"
|
38
|
+
spec.add_dependency "activesupport"
|
39
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
production: &defaults
|
2
|
+
uaa:
|
3
|
+
site: "http://uaa.any9app.com"
|
4
|
+
client_id: ""
|
5
|
+
client_secret: ""
|
6
|
+
cloud_controller:
|
7
|
+
site: "http://api.any9app.com"
|
8
|
+
username: ""
|
9
|
+
password: ""
|
10
|
+
|
11
|
+
development:
|
12
|
+
<<: *defaults
|
13
|
+
|
14
|
+
test:
|
15
|
+
uaa:
|
16
|
+
site: ""
|
17
|
+
client_id: ""
|
18
|
+
client_secret: ""
|
19
|
+
cloud_controller:
|
20
|
+
site: ""
|
21
|
+
user: ""
|
22
|
+
password: ""
|
@@ -0,0 +1,18 @@
|
|
1
|
+
require 'bundler'
|
2
|
+
require 'cfoundry'
|
3
|
+
require 'active_support/core_ext/object/try'
|
4
|
+
|
5
|
+
Bundler.require
|
6
|
+
|
7
|
+
module CFoundryHelper
|
8
|
+
autoload :Helpers, File.expand_path('../cfoundry_helper/helpers', __FILE__)
|
9
|
+
autoload :Models, File.expand_path('../cfoundry_helper/models', __FILE__)
|
10
|
+
|
11
|
+
def self.env
|
12
|
+
unless ENV['RAILS_ENV']
|
13
|
+
return :development
|
14
|
+
else
|
15
|
+
ENV['RAILS_ENV'].to_sym
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,6 @@
|
|
1
|
+
module CFoundryHelper::Helpers
|
2
|
+
autoload :OrganizationHelper, File.expand_path('../helpers/organization_helper', __FILE__)
|
3
|
+
autoload :ClientHelper, File.expand_path('../helpers/client_helper', __FILE__)
|
4
|
+
autoload :UserHelper, File.expand_path('../helpers/user_helper', __FILE__)
|
5
|
+
autoload :SpaceHelper, File.expand_path('../helpers/space_helper', __FILE__)
|
6
|
+
end
|
@@ -0,0 +1,106 @@
|
|
1
|
+
require 'yaml'
|
2
|
+
|
3
|
+
module CFoundryHelper::Helpers
|
4
|
+
module ClientHelper
|
5
|
+
@@config = nil
|
6
|
+
@@scim_client = nil
|
7
|
+
@@cloud_controller_client = nil
|
8
|
+
@@config_file_path = nil
|
9
|
+
@@auth_token = nil
|
10
|
+
|
11
|
+
def self.set_config_file_path(path)
|
12
|
+
@@config_file_path = path
|
13
|
+
end
|
14
|
+
|
15
|
+
def self.config_file_path
|
16
|
+
return @@config_file_path
|
17
|
+
end
|
18
|
+
|
19
|
+
def self.get_cc_target_url
|
20
|
+
return self.cloud_controller_client.target
|
21
|
+
end
|
22
|
+
|
23
|
+
def self.get_auth_token
|
24
|
+
self.cloud_controller_client if @@auth_token.nil?
|
25
|
+
return @@auth_token
|
26
|
+
end
|
27
|
+
|
28
|
+
##
|
29
|
+
# Use this client to connect to the uaa-service and
|
30
|
+
# check wether a user alredy exists.
|
31
|
+
#
|
32
|
+
# scim is a "System for Cross-domain Identity Management" and
|
33
|
+
# it is uesd by the uaa service.
|
34
|
+
# see http://www.simplecloud.info/
|
35
|
+
def self.scim_client
|
36
|
+
# just return the already initialized client if present
|
37
|
+
return @@scim_client unless @@scim_client.nil?
|
38
|
+
|
39
|
+
self.read_config_file
|
40
|
+
token_issuer = CF::UAA::TokenIssuer.new(
|
41
|
+
@@config['uaa']['site'],
|
42
|
+
@@config['uaa']['client_id'],
|
43
|
+
@@config['uaa']['client_secret'])
|
44
|
+
|
45
|
+
token_info = token_issuer.client_credentials_grant
|
46
|
+
access_token = token_info.info["access_token"]
|
47
|
+
@@scim_client = CF::UAA::Scim.new(@@config['uaa']['site'], "bEareR #{access_token}")
|
48
|
+
end
|
49
|
+
|
50
|
+
##
|
51
|
+
# Use this client to connect to the cloudcontroller
|
52
|
+
# and register a new user.
|
53
|
+
def self.cloud_controller_client
|
54
|
+
# just return the already initialized client if it was explicit setted.
|
55
|
+
# Don't cache the client in this method because long running apps will
|
56
|
+
# have some trouble with expired auth tokens.
|
57
|
+
# TODO: Refresh the token with the uaa refresh method.
|
58
|
+
return @@cloud_controller_client if @@cloud_controller_client
|
59
|
+
|
60
|
+
self.read_config_file
|
61
|
+
token_issuer = CF::UAA::TokenIssuer.new(@@config['uaa']['site'], "cf")
|
62
|
+
token_info = token_issuer.implicit_grant_with_creds(@@config['cloud_controller'])
|
63
|
+
access_token = token_info.info["access_token"]
|
64
|
+
token = CFoundry::AuthToken.from_hash({:token => "bearer #{access_token}"})
|
65
|
+
@@auth_token = token
|
66
|
+
CFoundry::V2::Client.new(@@config['cloud_controller']['site'], token)
|
67
|
+
end
|
68
|
+
|
69
|
+
|
70
|
+
def self.set_scim_client(client)
|
71
|
+
@@scim_client = client
|
72
|
+
end
|
73
|
+
|
74
|
+
def self.set_cc_client(client)
|
75
|
+
@@cloud_controller_client = client
|
76
|
+
end
|
77
|
+
|
78
|
+
protected
|
79
|
+
|
80
|
+
# reads the uaa and cc configuration from a config file
|
81
|
+
def self.read_config_file
|
82
|
+
# try to set the config file path from the env if not set already
|
83
|
+
self.set_config_file_path_from_env if @@config_file_path.nil?
|
84
|
+
|
85
|
+
if @@config.nil?
|
86
|
+
self.check_config_file_path
|
87
|
+
@@config = YAML.load_file(@@config_file_path)[CFoundryHelper.env.to_s]
|
88
|
+
end
|
89
|
+
@@config
|
90
|
+
end
|
91
|
+
|
92
|
+
def self.check_config_file_path
|
93
|
+
raise "No configuration file path has been set! Please call ClientHelper.set_config_file_path first or set a valid CFOUNDRY_HELPER_CONFIG env variable!" if @@config_file_path.nil?
|
94
|
+
raise "There's no configuration file on #{@@config_file_path}!" if !File.exists? @@config_file_path
|
95
|
+
end
|
96
|
+
|
97
|
+
# sets the configuration file path from reading the CFOUNDRY_HELPER_CONFIG env variable
|
98
|
+
def self.set_config_file_path_from_env
|
99
|
+
config_file_path = ENV["CFOUNDRY_HELPER_CONFIG"]
|
100
|
+
unless config_file_path.nil?
|
101
|
+
self.set_config_file_path config_file_path
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
end
|
106
|
+
end
|
@@ -0,0 +1,148 @@
|
|
1
|
+
module CFoundryHelper::Helpers
|
2
|
+
module OrganizationHelper
|
3
|
+
|
4
|
+
# returns an array of all CFoundry::V2::Organizations
|
5
|
+
def self.get_organizations
|
6
|
+
self.cc_client.organizations
|
7
|
+
end
|
8
|
+
|
9
|
+
def self.exists?(org_name)
|
10
|
+
self.cc_client.organizations.each do |o|
|
11
|
+
return true if o.name.eql? org_name
|
12
|
+
end
|
13
|
+
return false
|
14
|
+
end
|
15
|
+
|
16
|
+
# creates an CFoundry::V2::Organization with the given attributes contained in the hash
|
17
|
+
# returns the created organization
|
18
|
+
# throws an exception when an error occures during creating the organization
|
19
|
+
def self.create_organization(attributes)
|
20
|
+
raise "The given attributes hash is nil!" if attributes.nil?
|
21
|
+
raise "No organization name given!" if attributes[:name].nil?
|
22
|
+
raise "No billing_enabled attribute given!" if attributes[:billing_enabled].nil?
|
23
|
+
|
24
|
+
org = self.cc_client.organization
|
25
|
+
org.name = attributes[:name]
|
26
|
+
org.billing_enabled = attributes[:billing_enabled]
|
27
|
+
org.create!
|
28
|
+
org
|
29
|
+
end
|
30
|
+
|
31
|
+
# deletes an organization recursively (all spaces and their contents)
|
32
|
+
# returns true if the organization was deleted
|
33
|
+
def self.delete_organization_recursive(org)
|
34
|
+
raise "The given organization is nil!" if org.nil?
|
35
|
+
|
36
|
+
org.delete!(recursive: true)
|
37
|
+
end
|
38
|
+
|
39
|
+
# returns the organization with the given name if it exists
|
40
|
+
# throws an exception when the given organization doesn't exist
|
41
|
+
def self.get_organization_by_name(name)
|
42
|
+
cc_client.organization_by_name name
|
43
|
+
end
|
44
|
+
|
45
|
+
# returns an array of Cfoundry::V2::Users registered within the given organization
|
46
|
+
def self.get_users(org)
|
47
|
+
org.users
|
48
|
+
end
|
49
|
+
|
50
|
+
# adds the given user to the given organization
|
51
|
+
# returns the organization
|
52
|
+
def self.add_user(org, user)
|
53
|
+
org.add_user user
|
54
|
+
org.update!
|
55
|
+
org
|
56
|
+
end
|
57
|
+
|
58
|
+
# adds the user with the given email to the given organization
|
59
|
+
# returns the organization
|
60
|
+
def self.add_user_by_email(org, email)
|
61
|
+
user = CFoundryHelper::Helpers::UserHelper.get_user_by_email email
|
62
|
+
self.add_user org, user
|
63
|
+
org
|
64
|
+
end
|
65
|
+
|
66
|
+
# removes the given user from the given organization
|
67
|
+
# returns the user
|
68
|
+
def self.remove_user(org, user)
|
69
|
+
# remove user from all sub-arrays
|
70
|
+
org.remove_auditor user
|
71
|
+
org.remove_manager user
|
72
|
+
org.remove_billing_manager user
|
73
|
+
org.remove_user user
|
74
|
+
org.update!
|
75
|
+
user
|
76
|
+
end
|
77
|
+
|
78
|
+
# takes an array of roles and adds the given user to the according organizations role lists
|
79
|
+
# throws an exception if any of the given arguments is nil or empty
|
80
|
+
# returns the organization
|
81
|
+
def self.add_roles(org, user, roles)
|
82
|
+
raise "No roles given!" if roles.nil? || roles.empty?
|
83
|
+
raise "The given organization is nil!" if org.nil?
|
84
|
+
raise "The given user is nil!" if user.nil?
|
85
|
+
|
86
|
+
roles.each do |r|
|
87
|
+
if r == CFoundryHelper::Models::OrganizationRole::AUDITOR
|
88
|
+
org.add_manager user
|
89
|
+
elsif r == CFoundryHelper::Models::OrganizationRole::MANAGER
|
90
|
+
org.add_auditor user
|
91
|
+
elsif r == CFoundryHelper::Models::OrganizationRole::BILLINGMANAGER
|
92
|
+
org.add_billing_manager user
|
93
|
+
end
|
94
|
+
end
|
95
|
+
org.update!
|
96
|
+
org
|
97
|
+
end
|
98
|
+
|
99
|
+
# takes an array of roles and removes the given user from the according organizations role lists
|
100
|
+
# throws an exception if any of the given arguments is nil or empty
|
101
|
+
# returns the organization
|
102
|
+
def self.remove_roles(org, user, roles)
|
103
|
+
raise "No roles given!" if roles.nil? || roles.empty?
|
104
|
+
raise "The given organization is nil!" if org.nil?
|
105
|
+
raise "The given user is nil!" if user.nil?
|
106
|
+
|
107
|
+
roles.each do |r|
|
108
|
+
if r == CFoundryHelper::Models::OrganizationRole::AUDITOR
|
109
|
+
org.remove_manager user
|
110
|
+
elsif r == CFoundryHelper::Models::OrganizationRole::MANAGER
|
111
|
+
org.remove_auditor user
|
112
|
+
elsif r == CFoundryHelper::Models::OrganizationRole::BILLINGMANAGER
|
113
|
+
org.remove_billing_manager user
|
114
|
+
end
|
115
|
+
end
|
116
|
+
org.update!
|
117
|
+
org
|
118
|
+
end
|
119
|
+
|
120
|
+
# returns an array of space names for the given organization
|
121
|
+
def self.get_space_names(org)
|
122
|
+
return [] if org.nil?
|
123
|
+
names = Array.new
|
124
|
+
org.spaces.each do |s|
|
125
|
+
names << s.name
|
126
|
+
end
|
127
|
+
names
|
128
|
+
end
|
129
|
+
|
130
|
+
# returns an array of all organization names present in the system
|
131
|
+
# use with caution (large dataset)
|
132
|
+
def self.get_all_org_names
|
133
|
+
arr = []
|
134
|
+
orgs = cc_client.organizations
|
135
|
+
orgs.each do |o|
|
136
|
+
arr << o.name
|
137
|
+
end
|
138
|
+
arr.sort!
|
139
|
+
end
|
140
|
+
|
141
|
+
private
|
142
|
+
|
143
|
+
# gets the current cloud controller client from the ClientHelper module
|
144
|
+
def self.cc_client
|
145
|
+
CFoundryHelper::Helpers::ClientHelper.cloud_controller_client
|
146
|
+
end
|
147
|
+
end
|
148
|
+
end
|
@@ -0,0 +1,125 @@
|
|
1
|
+
module CFoundryHelper::Helpers
|
2
|
+
module SpaceHelper
|
3
|
+
|
4
|
+
# creates a space with the given name within the given organization
|
5
|
+
# throws an exception if the given spacename is nil or empty
|
6
|
+
# throws an exception if the given organization is nil
|
7
|
+
# throws an exception if a space with the given name already exists within the given organization
|
8
|
+
def self.create_space(org, spacename)
|
9
|
+
raise "The given organization is nil!" if org.nil?
|
10
|
+
raise "The given spacename is nil!" if spacename.nil?
|
11
|
+
raise "The given spacename is empty!" if spacename.eql?('')
|
12
|
+
raise "The #{spacename} space already exists within #{org.name}!" if self.exists?(org, spacename)
|
13
|
+
|
14
|
+
space = self.cc_client.space
|
15
|
+
space.name = spacename
|
16
|
+
space.organization = org
|
17
|
+
space.create!
|
18
|
+
space
|
19
|
+
end
|
20
|
+
|
21
|
+
# deletes a space
|
22
|
+
# throws an exception if the given space is nil
|
23
|
+
# throws an exception if the given space is not empty
|
24
|
+
# returns true on deletion
|
25
|
+
def self.delete_space(space)
|
26
|
+
raise "The given space is nil!" if space.nil?
|
27
|
+
unless is_empty? space
|
28
|
+
raise "The given space is not empty!"
|
29
|
+
end
|
30
|
+
space.delete!
|
31
|
+
return true
|
32
|
+
end
|
33
|
+
|
34
|
+
# deletes a given space recursively (all apps, services, ....)
|
35
|
+
# returns true if the space was deleted
|
36
|
+
def self.delete_space_recursive(space)
|
37
|
+
raise "The given space is nil!" if space.nil?
|
38
|
+
space.delete!(:recursive => true)
|
39
|
+
end
|
40
|
+
|
41
|
+
# returns true if no apps, service_instances, routes,
|
42
|
+
def self.is_empty?(space)
|
43
|
+
return true if space.nil?
|
44
|
+
if space.apps.count > 0 || space.service_instances.count > 0 || space.domains.count > 0
|
45
|
+
return false
|
46
|
+
else
|
47
|
+
return true
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
# returns the given the space with the given name within the given organization
|
52
|
+
# returns nil of no space has been found
|
53
|
+
def self.get_space(org, spacename)
|
54
|
+
org.space_by_name spacename
|
55
|
+
end
|
56
|
+
|
57
|
+
# returns the space with the given name in the organization with the given name
|
58
|
+
# returns nil if no space has been found
|
59
|
+
def self.get_space_by_name(org_name, space_name)
|
60
|
+
org = CFoundryHelper::Helpers::OrganizationHelper.get_organization_by_name org_name
|
61
|
+
return nil if org.nil?
|
62
|
+
return self.get_space(org, space_name)
|
63
|
+
end
|
64
|
+
|
65
|
+
# returns true if a space with the given name exists within the given organization
|
66
|
+
# returns false if no space with the given name exists within the given organization
|
67
|
+
def self.exists?(org, spacename)
|
68
|
+
return !org.space_by_name(spacename).nil?
|
69
|
+
end
|
70
|
+
|
71
|
+
def self.exists_by_name?(org_name, space_name)
|
72
|
+
return !self.get_space_by_name(org_name, space_name).nil?
|
73
|
+
end
|
74
|
+
|
75
|
+
# takes an array of roles and adds the given user to the according space's role lists
|
76
|
+
# throws an exception if any of the given arguments is nil or empty
|
77
|
+
# throws an exception if the given user is not registered with the space's organization
|
78
|
+
# returns the space
|
79
|
+
def self.add_roles(space, user, roles)
|
80
|
+
raise "No roles given!" if roles.nil? || roles.empty?
|
81
|
+
raise "The given space is nil!" if space.nil?
|
82
|
+
raise "The given user is nil!" if user.nil?
|
83
|
+
|
84
|
+
roles.each do |r|
|
85
|
+
if r == CFoundryHelper::Models::SpaceRole::MANAGER
|
86
|
+
space.add_manager user
|
87
|
+
elsif r == CFoundryHelper::Models::SpaceRole::AUDITOR
|
88
|
+
space.add_auditor user
|
89
|
+
elsif r == CFoundryHelper::Models::SpaceRole::DEVELOPER
|
90
|
+
space.add_developer user
|
91
|
+
end
|
92
|
+
end
|
93
|
+
space.update!
|
94
|
+
space
|
95
|
+
end
|
96
|
+
|
97
|
+
# takes an array of roles and removes the given user from the according space role lists
|
98
|
+
# throws an exception if any of the given arguments is nil or empty
|
99
|
+
# returns the space
|
100
|
+
def self.remove_roles(space, user, roles)
|
101
|
+
raise "No roles given!" if roles.nil? || roles.empty?
|
102
|
+
raise "The given space is nil!" if space.nil?
|
103
|
+
raise "The given user is nil!" if user.nil?
|
104
|
+
|
105
|
+
roles.each do |r|
|
106
|
+
if r == CFoundryHelper::Models::SpaceRole::MANAGER
|
107
|
+
space.remove_manager user
|
108
|
+
elsif r == CFoundryHelper::Models::SpaceRole::AUDITOR
|
109
|
+
space.remove_auditor user
|
110
|
+
elsif r == CFoundryHelper::Models::SpaceRole::DEVELOPER
|
111
|
+
space.remove_developer user
|
112
|
+
end
|
113
|
+
end
|
114
|
+
space.update!
|
115
|
+
space
|
116
|
+
end
|
117
|
+
|
118
|
+
private
|
119
|
+
|
120
|
+
# gets the current cloud controller client from the ClientHelper module
|
121
|
+
def self.cc_client
|
122
|
+
CFoundryHelper::Helpers::ClientHelper.cloud_controller_client
|
123
|
+
end
|
124
|
+
end
|
125
|
+
end
|