prof 0.29.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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