prof 0.29.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (51) hide show
  1. checksums.yaml +7 -0
  2. data/LEGAL +13 -0
  3. data/lib/prof/cloud_foundry.rb +145 -0
  4. data/lib/prof/environment/cloud_foundry.rb +150 -0
  5. data/lib/prof/environment/pcf_drinks.rb +156 -0
  6. data/lib/prof/environment_manager.rb +93 -0
  7. data/lib/prof/external_spec/helpers/capybara.rb +58 -0
  8. data/lib/prof/external_spec/helpers/debug.rb +53 -0
  9. data/lib/prof/external_spec/helpers/file_helper.rb +35 -0
  10. data/lib/prof/external_spec/helpers/product_path.rb +23 -0
  11. data/lib/prof/external_spec/shared_examples/deployment.rb +23 -0
  12. data/lib/prof/external_spec/shared_examples/ops_manager_upgrade.rb +32 -0
  13. data/lib/prof/external_spec/shared_examples/service.rb +105 -0
  14. data/lib/prof/external_spec/shared_examples/service_broker.rb +25 -0
  15. data/lib/prof/external_spec/spec_helper.rb +35 -0
  16. data/lib/prof/marketplace_service.rb +20 -0
  17. data/lib/prof/matchers/metadata.rb +180 -0
  18. data/lib/prof/matchers/only_support_ssl_with_cipher_set.rb +102 -0
  19. data/lib/prof/matchers/ssl.rb +67 -0
  20. data/lib/prof/matchers/tile_configuration.rb +47 -0
  21. data/lib/prof/ops_manager/rails_500_error.rb +15 -0
  22. data/lib/prof/ops_manager/web_app_internals/page/checkbox_field.rb +38 -0
  23. data/lib/prof/ops_manager/web_app_internals/page/click_field.rb +40 -0
  24. data/lib/prof/ops_manager/web_app_internals/page/dashboard.rb +100 -0
  25. data/lib/prof/ops_manager/web_app_internals/page/flash_message.rb +53 -0
  26. data/lib/prof/ops_manager/web_app_internals/page/form.rb +130 -0
  27. data/lib/prof/ops_manager/web_app_internals/page/form_error.rb +43 -0
  28. data/lib/prof/ops_manager/web_app_internals/page/form_field.rb +51 -0
  29. data/lib/prof/ops_manager/web_app_internals/page/form_fields.rb +35 -0
  30. data/lib/prof/ops_manager/web_app_internals/page/installation_progress.rb +149 -0
  31. data/lib/prof/ops_manager/web_app_internals/page/login.rb +53 -0
  32. data/lib/prof/ops_manager/web_app_internals/page/modal.rb +85 -0
  33. data/lib/prof/ops_manager/web_app_internals/page/rails_500.rb +41 -0
  34. data/lib/prof/ops_manager/web_app_internals/page/select_field.rb +27 -0
  35. data/lib/prof/ops_manager/web_app_internals/page/tile_settings.rb +105 -0
  36. data/lib/prof/ops_manager/web_app_internals.rb +63 -0
  37. data/lib/prof/ops_manager.rb +141 -0
  38. data/lib/prof/ops_manager_log_fetcher.rb +30 -0
  39. data/lib/prof/product.rb +59 -0
  40. data/lib/prof/pushed_test_app.rb +40 -0
  41. data/lib/prof/service_instance.rb +21 -0
  42. data/lib/prof/ssh_gateway.rb +104 -0
  43. data/lib/prof/ssl/check.rb +79 -0
  44. data/lib/prof/ssl/cipher_set.rb +56 -0
  45. data/lib/prof/ssl/result.rb +27 -0
  46. data/lib/prof/ssl/results.rb +74 -0
  47. data/lib/prof/test_app.rb +19 -0
  48. data/lib/prof/tile.rb +25 -0
  49. data/lib/prof/uaa_client.rb +66 -0
  50. data/lib/prof/version.rb +13 -0
  51. metadata +403 -0
@@ -0,0 +1,59 @@
1
+ # Copyright (c) 2014-2015 Pivotal Software, Inc.
2
+ # All rights reserved.
3
+ # THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
4
+ # INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
5
+ # PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
6
+ # LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
7
+ # TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
8
+ # USE OR OTHER DEALINGS IN THE SOFTWARE.
9
+ #
10
+
11
+ require 'yaml'
12
+ require 'zip'
13
+
14
+ module Prof
15
+ class Product
16
+ class InvalidProductPathError < StandardError; end
17
+
18
+ attr_reader :path
19
+
20
+ def initialize(path:)
21
+ raise InvalidProductPathError, "Invalid path given: '#{path}'" unless path && File.exist?(path)
22
+ @path = File.expand_path(path)
23
+ end
24
+
25
+ def name
26
+ metadata.fetch('name')
27
+ end
28
+
29
+ def version
30
+ metadata.fetch('product_version')
31
+ end
32
+
33
+ def to_s
34
+ "#{name} v#{version}"
35
+ end
36
+
37
+ def file
38
+ File.open(path)
39
+ end
40
+
41
+ def ==(other)
42
+ self.class == other.class &&
43
+ self.path == other.path
44
+ end
45
+ alias_method :eql?, :==
46
+
47
+ private
48
+
49
+ def metadata
50
+ @metadata ||= begin
51
+ yaml = Zip::File.open(path) do |zip_file|
52
+ entry = zip_file.glob('metadata/*').first
53
+ entry.get_input_stream.read
54
+ end
55
+ YAML.load(yaml)
56
+ end
57
+ end
58
+ end
59
+ end
@@ -0,0 +1,40 @@
1
+ # Copyright (c) 2014-2015 Pivotal Software, Inc.
2
+ # All rights reserved.
3
+ # THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
4
+ # INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
5
+ # PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
6
+ # LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
7
+ # TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
8
+ # USE OR OTHER DEALINGS IN THE SOFTWARE.
9
+ #
10
+
11
+ require 'faraday'
12
+ require 'faraday_middleware'
13
+
14
+ module Prof
15
+ class PushedTestApp
16
+ def initialize(opts = {})
17
+ @name = opts.fetch(:name)
18
+ @url = opts.fetch(:url)
19
+ end
20
+
21
+ attr_reader :name, :url
22
+
23
+ def write(key, value)
24
+ app_connection.put("/testdata/key/#{key}/value/#{value}")
25
+ end
26
+
27
+ def read(key)
28
+ app_connection.get("/testdata/key/#{key}").body
29
+ end
30
+
31
+ private
32
+
33
+ def app_connection
34
+ Faraday.new(url: url, ssl: { verify: false }) do |faraday|
35
+ faraday.response :json, content_type: /\bjson$/
36
+ faraday.adapter Faraday.default_adapter
37
+ end
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,21 @@
1
+ # Copyright (c) 2014-2015 Pivotal Software, Inc.
2
+ # All rights reserved.
3
+ # THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
4
+ # INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
5
+ # PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
6
+ # LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
7
+ # TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
8
+ # USE OR OTHER DEALINGS IN THE SOFTWARE.
9
+ #
10
+
11
+ require 'securerandom'
12
+
13
+ module Prof
14
+ class ServiceInstance
15
+ def initialize(name = "cf-service-#{SecureRandom.hex(4)}")
16
+ @name = name
17
+ end
18
+
19
+ attr_reader :name
20
+ end
21
+ end
@@ -0,0 +1,104 @@
1
+ # Copyright (c) 2014-2015 Pivotal Software, Inc.
2
+ # All rights reserved.
3
+ # THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
4
+ # INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
5
+ # PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
6
+ # LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
7
+ # TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
8
+ # USE OR OTHER DEALINGS IN THE SOFTWARE.
9
+ #
10
+
11
+ require 'net/ssh'
12
+ require 'net/ssh/gateway'
13
+ require 'net/scp'
14
+ require 'uri'
15
+
16
+ module Prof
17
+ class SshGateway
18
+ def initialize(gateway_host:, gateway_username:, gateway_password: nil, ssh_key: nil)
19
+ @gateway_host = gateway_host
20
+ @gateway_username = gateway_username
21
+ @gateway_password = gateway_password
22
+ @ssh_key = ssh_key
23
+ @forwards = {}
24
+ end
25
+
26
+ def execute_on(host, cmd, options = {})
27
+ user = options.fetch(:user, 'vcap')
28
+ password = options.fetch(:password, 'c1oudc0w')
29
+ run_as_root = options.fetch(:root, false)
30
+ discard_stderr = options.fetch(:discard_stderr, false)
31
+
32
+ cmd = "echo -e \"#{password}\\n\" | sudo -S #{cmd}" if run_as_root
33
+ cmd << ' 2>/dev/null' if discard_stderr
34
+
35
+ ssh_gateway_options = {
36
+ password: password,
37
+ paranoid: false
38
+ }
39
+
40
+ ssh_gateway_options[:key_data] = [@ssh_key] unless @ssh_key.nil?
41
+
42
+ ssh_gateway.ssh(
43
+ host,
44
+ user,
45
+ ssh_gateway_options,
46
+ ) do |ssh|
47
+ ssh.exec!(cmd)
48
+ end
49
+ end
50
+
51
+ def scp_to(host, local_path, remote_path, options = {})
52
+ with_port_forwarded_to(host, 22) do |local_port|
53
+ options[:port] = local_port
54
+ options[:user] ||= 'vcap'
55
+ options[:password] ||= 'c1oudc0w'
56
+ Net::SCP.start('127.0.0.1', options.fetch(:user), options) do |scp|
57
+ scp.upload! local_path, remote_path
58
+ end
59
+ end
60
+ end
61
+
62
+ def scp_from(host, remote_path, local_path, options = {})
63
+ with_port_forwarded_to(host, 22) do |local_port|
64
+ options[:port] = local_port
65
+ options[:user] ||= 'vcap'
66
+ options[:password] ||= 'c1oudc0w'
67
+ Net::SCP.start('127.0.0.1', options.fetch(:user), options) do |scp|
68
+ scp.download! remote_path, local_path
69
+ end
70
+ end
71
+ end
72
+
73
+ def with_port_forwarded_to(remote_host, remote_port, &block)
74
+ ssh_gateway.open(remote_host, remote_port, &block)
75
+ end
76
+
77
+ private
78
+
79
+ attr_reader :gateway_username, :gateway_password, :forwards
80
+
81
+ def ssh_agent
82
+ @ssh_agent ||= Net::SSH::Authentication::Agent.connect
83
+ end
84
+
85
+ def gateway_host
86
+ URI(@gateway_host).host || @gateway_host
87
+ end
88
+
89
+ def ssh_gateway
90
+ @ssh_gateway ||= Net::SSH::Gateway.new(
91
+ gateway_host,
92
+ gateway_username,
93
+ password: gateway_password,
94
+ paranoid: false
95
+ )
96
+ rescue Net::SSH::AuthenticationFailed
97
+ message = [
98
+ "Failed to connect to #{gateway_host}, with #{gateway_username}:#{gateway_password}.",
99
+ "The ssh-agent has #{ssh_agent.identities.size} identities. Please either add a key, or correct password"
100
+ ].join(' ')
101
+ raise Net::SSH::AuthenticationFailed, message
102
+ end
103
+ end
104
+ end
@@ -0,0 +1,79 @@
1
+ # Copyright (c) 2014-2015 Pivotal Software, Inc.
2
+ # All rights reserved.
3
+ # THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
4
+ # INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
5
+ # PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
6
+ # LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
7
+ # TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
8
+ # USE OR OTHER DEALINGS IN THE SOFTWARE.
9
+ #
10
+
11
+ require 'prof/ssl/result'
12
+ require 'prof/ssl/results'
13
+
14
+ require 'uri'
15
+ require 'net/http'
16
+ require 'openssl'
17
+ require 'ostruct'
18
+
19
+ module Prof
20
+ module SSL
21
+ class Check
22
+ def initialize(url, proxy=nil)
23
+ @url = URI.parse(url)
24
+ @proxy = proxy || OpenStruct.new(:http_host => nil, :http_address => nil)
25
+ end
26
+
27
+ def results
28
+ Results.new(protocols.map { |protocol| check_protocol(protocol) })
29
+ end
30
+
31
+ def protocols
32
+ @protocols ||= OpenSSL::SSL::SSLContext::METHODS.reject { |m|
33
+ /_(client|server)$/ =~ m.to_s
34
+ }.reject { |m|
35
+ m == :SSLv23
36
+ }
37
+ end
38
+
39
+ private
40
+
41
+ attr_reader :url, :proxy
42
+
43
+ def port
44
+ url.port
45
+ end
46
+
47
+ def host
48
+ url.host
49
+ end
50
+
51
+ def check_protocol(protocol)
52
+ cipher_names(protocol).map { |cipher_name| check_cipher(protocol, cipher_name) }
53
+ end
54
+
55
+ def cipher_names(protocol)
56
+ OpenSSL::SSL::SSLContext.new(protocol).ciphers.map(&:first)
57
+ end
58
+
59
+ def check_cipher(protocol, cipher_name)
60
+ request = http_request
61
+ request.ssl_version = protocol
62
+ request.ciphers = cipher_name
63
+ begin
64
+ request.get('/')
65
+ Result.new(protocol, cipher_name, true)
66
+ rescue OpenSSL::SSL::SSLError, Errno::ECONNRESET
67
+ Result.new(protocol, cipher_name, false)
68
+ end
69
+ end
70
+
71
+ def http_request
72
+ request = Net::HTTP.new(host, port, proxy.http_host, proxy.http_port)
73
+ request.use_ssl = true
74
+ request.verify_mode = OpenSSL::SSL::VERIFY_NONE
75
+ request
76
+ end
77
+ end
78
+ end
79
+ end
@@ -0,0 +1,56 @@
1
+ # Copyright (c) 2014-2015 Pivotal Software, Inc.
2
+ # All rights reserved.
3
+ # THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
4
+ # INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
5
+ # PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
6
+ # LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
7
+ # TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
8
+ # USE OR OTHER DEALINGS IN THE SOFTWARE.
9
+ #
10
+
11
+ module Prof
12
+ module SSL
13
+ class CipherSet
14
+ def initialize(supported_ciphers: [], supported_protocols: [])
15
+ @supported_ciphers = supported_ciphers
16
+ @supported_protocols = supported_protocols
17
+ end
18
+
19
+ attr_reader :supported_ciphers, :supported_protocols
20
+
21
+ # This list is based on the Mozilla Modern cipher list https://wiki.mozilla.org/Security/Server_Side_TLS 2015-02-05
22
+ # we have removed some of the supported ciphers due to the version of openssl used on the stemcel:
23
+ ##'ECDHE-ECDSA-AES128-GCM-SHA256'
24
+ #'ECDHE-ECDSA-AES256-GCM-SHA384'
25
+ #'DHE-DSS-AES128-GCM-SHA256'
26
+ #'kEDH+AESGCM'
27
+ #'ECDHE-ECDSA-AES128-SHA256'
28
+ #'ECDHE-ECDSA-AES128-SHA'
29
+ #'ECDHE-ECDSA-AES256-SHA384'
30
+ #'ECDHE-ECDSA-AES256-SHA'
31
+ #'DHE-DSS-AES128-SHA256'
32
+ #'DHE-DSS-AES256-SHA'
33
+ #
34
+ # It appears the nginx will enable DHE-RSA-AES256-GCM-SHA384 when ECDHE-RSA-AES256-GCM-SHA384 is specified
35
+ # We believe DHE-RSA-AES256-GCM-SHA384 to be strong, but it is not part of the official mozilla modern lists.
36
+ # This has been added to the list of our supported ciphers
37
+ PIVOTAL_MODERN = new(
38
+ supported_ciphers: [
39
+ 'ECDHE-RSA-AES128-GCM-SHA256',
40
+ 'ECDHE-RSA-AES256-GCM-SHA384',
41
+ 'DHE-RSA-AES128-GCM-SHA256',
42
+ 'ECDHE-RSA-AES128-SHA256',
43
+ 'ECDHE-RSA-AES128-SHA',
44
+ 'ECDHE-RSA-AES256-SHA384',
45
+ 'ECDHE-RSA-AES256-SHA',
46
+ 'DHE-RSA-AES128-SHA256',
47
+ 'DHE-RSA-AES128-SHA',
48
+ 'DHE-RSA-AES256-SHA256',
49
+ 'DHE-RSA-AES256-SHA',
50
+ 'DHE-RSA-AES256-GCM-SHA384'
51
+ ],
52
+ supported_protocols: [:TLSv1_2, :TLSv1_1]
53
+ )
54
+ end
55
+ end
56
+ end
@@ -0,0 +1,27 @@
1
+ # Copyright (c) 2014-2015 Pivotal Software, Inc.
2
+ # All rights reserved.
3
+ # THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
4
+ # INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
5
+ # PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
6
+ # LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
7
+ # TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
8
+ # USE OR OTHER DEALINGS IN THE SOFTWARE.
9
+ #
10
+
11
+ module Prof
12
+ module SSL
13
+ class Result
14
+ def initialize(protocol, cipher, supported)
15
+ @protocol = protocol
16
+ @cipher = String(cipher)
17
+ @supported = supported
18
+ end
19
+
20
+ attr_reader :protocol, :cipher
21
+
22
+ def supported?
23
+ @supported
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,74 @@
1
+ # Copyright (c) 2014-2015 Pivotal Software, Inc.
2
+ # All rights reserved.
3
+ # THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
4
+ # INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
5
+ # PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
6
+ # LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
7
+ # TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
8
+ # USE OR OTHER DEALINGS IN THE SOFTWARE.
9
+ #
10
+
11
+ module Prof
12
+ module SSL
13
+ class Results
14
+ def initialize(results)
15
+ @results = Array(results).flatten
16
+ end
17
+
18
+ def supports_protocol?(protocol)
19
+ results_for_protocol(protocol).any?(&:supported?)
20
+ end
21
+
22
+ def supports_cipher_set?(cipher_set)
23
+ expected_ciphers = cipher_set.supported_ciphers
24
+ expected_protocols = cipher_set.supported_protocols
25
+
26
+ # 1. Every cipher in the set must exist in the results
27
+ valid = expected_ciphers.all? { |expected_cipher| supported_ciphers.include? expected_cipher }
28
+
29
+ # 2. No Ciphers exists in the results but not the cipher set
30
+ valid &= supported_ciphers.all? { |supported_cipher| expected_ciphers.include? supported_cipher }
31
+
32
+ # 3. No protocols in the cipher set that are not supported
33
+ valid &= expected_protocols.all? { |expected_protocol| supported_protocols.include? expected_protocol }
34
+
35
+ # 4. No protocols supported that are not in the cipher set
36
+ valid &= supported_protocols.all? { |supported_protocol| expected_protocols.include? supported_protocol }
37
+ end
38
+
39
+ def protocols
40
+ results.map(&:protocol).uniq
41
+ end
42
+
43
+ def supported_ciphers
44
+ @supported_ciphers ||= supported_results.map(&:cipher).uniq
45
+ end
46
+
47
+ def supported_protocols
48
+ @supported_protocols ||= supported_results.map(&:protocol).uniq
49
+ end
50
+
51
+ def unsupported_protocols
52
+ protocols - supported_protocols
53
+ end
54
+
55
+ private
56
+
57
+ attr_reader :results
58
+
59
+ def supported_results
60
+ results.select(&:supported?)
61
+ end
62
+
63
+ def unsupported_results
64
+ results - supported_results
65
+ end
66
+
67
+ def results_for_protocol(protocol)
68
+ results.select do |result|
69
+ result.protocol == protocol
70
+ end
71
+ end
72
+ end
73
+ end
74
+ end
@@ -0,0 +1,19 @@
1
+ # Copyright (c) 2014-2015 Pivotal Software, Inc.
2
+ # All rights reserved.
3
+ # THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
4
+ # INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
5
+ # PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
6
+ # LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
7
+ # TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
8
+ # USE OR OTHER DEALINGS IN THE SOFTWARE.
9
+ #
10
+
11
+ module Prof
12
+ class TestApp
13
+ def initialize(opts = {})
14
+ @path = opts.fetch(:path)
15
+ end
16
+
17
+ attr_reader :path
18
+ end
19
+ end
data/lib/prof/tile.rb ADDED
@@ -0,0 +1,25 @@
1
+ # Copyright (c) 2014-2015 Pivotal Software, Inc.
2
+ # All rights reserved.
3
+ # THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
4
+ # INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
5
+ # PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
6
+ # LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
7
+ # TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
8
+ # USE OR OTHER DEALINGS IN THE SOFTWARE.
9
+ #
10
+
11
+ module Prof
12
+ class Tile
13
+ def initialize(name:, version: nil, guid: nil)
14
+ @name = name
15
+ @version = version
16
+ @guid = guid
17
+ end
18
+
19
+ def to_s
20
+ version ? "#{name} v#{version}" : name
21
+ end
22
+
23
+ attr_reader :name, :version, :guid
24
+ end
25
+ end
@@ -0,0 +1,66 @@
1
+ # Copyright (c) 2014-2015 Pivotal Software, Inc.
2
+ # All rights reserved.
3
+ # THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
4
+ # INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
5
+ # PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
6
+ # LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
7
+ # TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
8
+ # USE OR OTHER DEALINGS IN THE SOFTWARE.
9
+ #
10
+
11
+ require 'uaa'
12
+
13
+ module Prof
14
+ class UAAClient
15
+ def initialize(system_domain, cloud_controller_username, cloud_controller_password)
16
+ @system_domain = system_domain
17
+ @cloud_controller_username = cloud_controller_username
18
+ @cloud_controller_password = cloud_controller_password
19
+ end
20
+
21
+ def register_user(user)
22
+ scim.add(:user, scim_info(user))
23
+ end
24
+
25
+ def unregister_user(user)
26
+ scim.delete(:user, scim.id(:user, user.username))
27
+ end
28
+
29
+ private
30
+
31
+ attr_reader :system_domain, :cloud_controller_username, :cloud_controller_password
32
+
33
+ def scim_info(user)
34
+ {
35
+ userName: user.username,
36
+ password: user.password,
37
+ emails: [{value: user.email}]
38
+ }
39
+ end
40
+
41
+ def scim
42
+ CF::UAA::Scim.new(
43
+ uaa_url,
44
+ auth_header,
45
+ skip_ssl_validation: true
46
+ )
47
+ end
48
+
49
+ def auth_header
50
+ token_issuer.client_credentials_grant.auth_header
51
+ end
52
+
53
+ def token_issuer
54
+ CF::UAA::TokenIssuer.new(
55
+ uaa_url,
56
+ cloud_controller_username,
57
+ cloud_controller_password,
58
+ skip_ssl_validation: true
59
+ )
60
+ end
61
+
62
+ def uaa_url
63
+ "https://uaa.#{system_domain}"
64
+ end
65
+ end
66
+ end
@@ -0,0 +1,13 @@
1
+ # Copyright (c) 2014-2015 Pivotal Software, Inc.
2
+ # All rights reserved.
3
+ # THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
4
+ # INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
5
+ # PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
6
+ # LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
7
+ # TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
8
+ # USE OR OTHER DEALINGS IN THE SOFTWARE.
9
+ #
10
+
11
+ module Prof
12
+ VERSION = '0.29.3'
13
+ end