ops_manager_ui_drivers 0.2.0

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 (93) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +10 -0
  3. data/.rspec +2 -0
  4. data/.travis.yml +3 -0
  5. data/Gemfile +4 -0
  6. data/LICENSE +13 -0
  7. data/README.md +39 -0
  8. data/Rakefile +12 -0
  9. data/bin/console +14 -0
  10. data/bin/setup +7 -0
  11. data/ci/run_specs.sh +11 -0
  12. data/lib/ops_manager_ui_drivers.rb +10 -0
  13. data/lib/ops_manager_ui_drivers/page_helpers.rb +52 -0
  14. data/lib/ops_manager_ui_drivers/version.rb +3 -0
  15. data/lib/ops_manager_ui_drivers/version11/api_1_1.rb +40 -0
  16. data/lib/ops_manager_ui_drivers/version11/available_products.rb +24 -0
  17. data/lib/ops_manager_ui_drivers/version11/install_progress.rb +24 -0
  18. data/lib/ops_manager_ui_drivers/version11/login.rb +24 -0
  19. data/lib/ops_manager_ui_drivers/version11/network_configuration.rb +31 -0
  20. data/lib/ops_manager_ui_drivers/version11/ntp_servers.rb +28 -0
  21. data/lib/ops_manager_ui_drivers/version11/ops_manager_director.rb +27 -0
  22. data/lib/ops_manager_ui_drivers/version11/product_dashboard.rb +73 -0
  23. data/lib/ops_manager_ui_drivers/version11/vcenter_credentials.rb +31 -0
  24. data/lib/ops_manager_ui_drivers/version11/vsphere_configuration.rb +31 -0
  25. data/lib/ops_manager_ui_drivers/version11/web_ui.rb +34 -0
  26. data/lib/ops_manager_ui_drivers/version12/api_1_2.rb +40 -0
  27. data/lib/ops_manager_ui_drivers/version12/available_products.rb +24 -0
  28. data/lib/ops_manager_ui_drivers/version12/install_progress.rb +24 -0
  29. data/lib/ops_manager_ui_drivers/version12/login.rb +24 -0
  30. data/lib/ops_manager_ui_drivers/version12/network_configuration.rb +32 -0
  31. data/lib/ops_manager_ui_drivers/version12/ntp_servers.rb +28 -0
  32. data/lib/ops_manager_ui_drivers/version12/ops_manager_director.rb +27 -0
  33. data/lib/ops_manager_ui_drivers/version12/product_dashboard.rb +73 -0
  34. data/lib/ops_manager_ui_drivers/version12/vcenter_credentials.rb +31 -0
  35. data/lib/ops_manager_ui_drivers/version12/vsphere_configuration.rb +30 -0
  36. data/lib/ops_manager_ui_drivers/version12/web_ui.rb +34 -0
  37. data/lib/ops_manager_ui_drivers/version13/api_1_3.rb +40 -0
  38. data/lib/ops_manager_ui_drivers/version13/availability_zones.rb +55 -0
  39. data/lib/ops_manager_ui_drivers/version13/available_products.rb +24 -0
  40. data/lib/ops_manager_ui_drivers/version13/iaas_configuration.rb +65 -0
  41. data/lib/ops_manager_ui_drivers/version13/install_progress.rb +43 -0
  42. data/lib/ops_manager_ui_drivers/version13/job_availability_zone_mapping_helper.rb +70 -0
  43. data/lib/ops_manager_ui_drivers/version13/job_network_mapping_helper.rb +47 -0
  44. data/lib/ops_manager_ui_drivers/version13/job_status_helper.rb +17 -0
  45. data/lib/ops_manager_ui_drivers/version13/networks.rb +83 -0
  46. data/lib/ops_manager_ui_drivers/version13/ops_manager_director.rb +140 -0
  47. data/lib/ops_manager_ui_drivers/version13/product_availability_zones.rb +38 -0
  48. data/lib/ops_manager_ui_drivers/version13/product_dashboard.rb +157 -0
  49. data/lib/ops_manager_ui_drivers/version13/product_logs.rb +53 -0
  50. data/lib/ops_manager_ui_drivers/version13/product_resource_configuration.rb +46 -0
  51. data/lib/ops_manager_ui_drivers/version13/product_status_helper.rb +64 -0
  52. data/lib/ops_manager_ui_drivers/version13/setup.rb +40 -0
  53. data/lib/ops_manager_ui_drivers/version13/web_ui.rb +106 -0
  54. data/lib/ops_manager_ui_drivers/version14/api_1_4.rb +40 -0
  55. data/lib/ops_manager_ui_drivers/version14/availability_zones.rb +59 -0
  56. data/lib/ops_manager_ui_drivers/version14/available_products.rb +24 -0
  57. data/lib/ops_manager_ui_drivers/version14/iaas_configuration.rb +89 -0
  58. data/lib/ops_manager_ui_drivers/version14/job_availability_zone_mapping_helper.rb +70 -0
  59. data/lib/ops_manager_ui_drivers/version14/job_network_mapping_helper.rb +47 -0
  60. data/lib/ops_manager_ui_drivers/version14/job_status_helper.rb +17 -0
  61. data/lib/ops_manager_ui_drivers/version14/networks.rb +58 -0
  62. data/lib/ops_manager_ui_drivers/version14/ops_manager_director.rb +252 -0
  63. data/lib/ops_manager_ui_drivers/version14/product_availability_zones.rb +38 -0
  64. data/lib/ops_manager_ui_drivers/version14/product_configuration.rb +34 -0
  65. data/lib/ops_manager_ui_drivers/version14/product_dashboard.rb +175 -0
  66. data/lib/ops_manager_ui_drivers/version14/product_form.rb +47 -0
  67. data/lib/ops_manager_ui_drivers/version14/product_logs.rb +38 -0
  68. data/lib/ops_manager_ui_drivers/version14/product_resource_configuration.rb +46 -0
  69. data/lib/ops_manager_ui_drivers/version14/product_status_helper.rb +64 -0
  70. data/lib/ops_manager_ui_drivers/version14/setup.rb +40 -0
  71. data/lib/ops_manager_ui_drivers/version14/state_change_progress.rb +43 -0
  72. data/lib/ops_manager_ui_drivers/version14/web_ui.rb +104 -0
  73. data/lib/ops_manager_ui_drivers/version15/availability_zones.rb +59 -0
  74. data/lib/ops_manager_ui_drivers/version15/available_products.rb +24 -0
  75. data/lib/ops_manager_ui_drivers/version15/iaas_configuration.rb +105 -0
  76. data/lib/ops_manager_ui_drivers/version15/job_availability_zone_mapping_helper.rb +70 -0
  77. data/lib/ops_manager_ui_drivers/version15/job_network_mapping_helper.rb +47 -0
  78. data/lib/ops_manager_ui_drivers/version15/job_status_helper.rb +17 -0
  79. data/lib/ops_manager_ui_drivers/version15/networks.rb +55 -0
  80. data/lib/ops_manager_ui_drivers/version15/ops_manager_director.rb +261 -0
  81. data/lib/ops_manager_ui_drivers/version15/product_availability_zones.rb +38 -0
  82. data/lib/ops_manager_ui_drivers/version15/product_configuration.rb +34 -0
  83. data/lib/ops_manager_ui_drivers/version15/product_dashboard.rb +176 -0
  84. data/lib/ops_manager_ui_drivers/version15/product_form.rb +47 -0
  85. data/lib/ops_manager_ui_drivers/version15/product_logs.rb +38 -0
  86. data/lib/ops_manager_ui_drivers/version15/product_resource_configuration.rb +63 -0
  87. data/lib/ops_manager_ui_drivers/version15/product_status_helper.rb +64 -0
  88. data/lib/ops_manager_ui_drivers/version15/setup.rb +44 -0
  89. data/lib/ops_manager_ui_drivers/version15/state_change_progress.rb +43 -0
  90. data/lib/ops_manager_ui_drivers/version15/web_ui.rb +104 -0
  91. data/lib/ops_manager_ui_drivers/wait_helper.rb +51 -0
  92. data/ops_manager_ui_drivers.gemspec +29 -0
  93. metadata +233 -0
@@ -0,0 +1,47 @@
1
+ module OpsManagerUiDrivers
2
+ module Version14
3
+ class ProductForm
4
+ def initialize(browser:, product_name:, form_name:)
5
+ @browser = browser
6
+ @product_name = product_name
7
+ @form_name = form_name
8
+ end
9
+
10
+ def property(property_reference)
11
+ browser.find_field("#{form_name}[#{property_reference}]")
12
+ end
13
+
14
+ def nested_property(property_reference, nested_reference)
15
+ browser.find_field("#{form_name}[#{property_reference}][#{nested_reference}]")
16
+ end
17
+
18
+ def generate_self_signed_cert(wildcard_domain)
19
+ browser.click_on 'Generate Self-Signed RSA Certificate'
20
+ browser.within '#rsa-certificate-form' do
21
+ browser.fill_in 'rsa_certificate[domains]', with: wildcard_domain
22
+ browser.click_on 'save-rsa-certificate-action'
23
+ end
24
+ end
25
+
26
+ def save_form(validate: true)
27
+ browser.click_on 'Save'
28
+
29
+ fail('unexpected failure') unless browser.has_css?('.flash-message')
30
+
31
+ if validate
32
+ fail(browser.find('.flash-message.error').text) unless browser.has_css?('.flash-message.success')
33
+ end
34
+ end
35
+
36
+ def open_form
37
+ browser.visit '/'
38
+ browser.click_on "show-#{product_name}-configure-action"
39
+ browser.click_on "show-#{form_name}-action"
40
+ end
41
+
42
+ private
43
+
44
+ attr_reader :browser, :product_name, :form_name
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,38 @@
1
+ require 'date'
2
+
3
+ module OpsManagerUiDrivers
4
+ module Version14
5
+ class ProductLogs
6
+ def initialize(browser:, product_name:)
7
+ @browser = browser
8
+ @product_name = product_name
9
+ end
10
+
11
+ def request_job_logs(job_name)
12
+ browser.visit('/')
13
+ browser.click_on("show-#{product_name}-configure-action")
14
+ browser.click_on('show-status-action')
15
+ browser.find(%Q(a[id^="download-#{job_name}-"][id$="-0-log-action"])).click
16
+ end
17
+
18
+ def most_recent_log_creation_time
19
+ browser.visit('/')
20
+ browser.click_on("show-#{product_name}-configure-action")
21
+ browser.click_on('show-logs-action')
22
+
23
+ log_row = browser.all('#downloaded_logs tr').
24
+ select { |e| e.find(%Q(a[href^="/products/#{product_name}"])) }.
25
+ last
26
+
27
+ return unless log_row
28
+
29
+ date_string = log_row.all('td').last.text
30
+ DateTime.parse(date_string)
31
+ end
32
+
33
+ private
34
+
35
+ attr_reader :product_name, :browser
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,46 @@
1
+ module OpsManagerUiDrivers
2
+ module Version14
3
+ class ProductResourceConfiguration
4
+ attr_reader :product_name
5
+
6
+ def initialize(browser:, product_name:)
7
+ @browser = browser
8
+ @product_name = product_name
9
+ end
10
+
11
+ def set_instances_for_job(job_name, instance_count)
12
+ open_form
13
+ browser.find_field("product_resources_form[#{job_name}][instances][value]").set(instance_count)
14
+ save_form
15
+ end
16
+
17
+ def set_elb_for_job(job_name, elb_name)
18
+ open_form
19
+ browser.find_field("product_resources_form[#{job_name}][elb_name]").set(elb_name)
20
+ save_form
21
+ end
22
+
23
+ private
24
+
25
+ attr_reader :browser
26
+
27
+ def open_form
28
+ browser.visit '/'
29
+ browser.click_on "show-#{product_name}-configure-action"
30
+ browser.click_on "show-#{product_name}-resource-sizes-action"
31
+ end
32
+
33
+ def save_form
34
+ browser.click_on 'Save'
35
+
36
+ unless browser.has_css?('.flash-message.success')
37
+ if browser.has_css?('.flash-message.error')
38
+ raise browser.find('.flash-message.error').text
39
+ else
40
+ raise 'unexpected failure'
41
+ end
42
+ end
43
+ end
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,64 @@
1
+ module OpsManagerUiDrivers
2
+ module Version14
3
+ class ProductStatusHelper
4
+ def initialize(product_name:, browser:)
5
+ @product_name = product_name
6
+ @browser = browser
7
+ end
8
+
9
+ def job_status(job_name)
10
+ open_page
11
+
12
+ wait_for_loading_indicator_to_disappear
13
+
14
+ browser.within "##{product_name}-status" do
15
+ job_row = browser.find(:xpath, ".//tr[@data-ip-name = '#{job_name}']")
16
+
17
+ Version14::JobStatusHelper.from_job_row(job_row)
18
+ end
19
+ end
20
+
21
+ def job_status_in_az(job_name, az_guid)
22
+ open_page
23
+
24
+ wait_for_loading_indicator_to_disappear
25
+
26
+ browser.within "##{product_name}-#{az_guid}-status-table" do
27
+ job_row = browser.find(:xpath, ".//tr[@data-ip-name = '#{job_name}']")
28
+
29
+ Version14::JobStatusHelper.from_job_row(job_row)
30
+ end
31
+ end
32
+
33
+ def resource_pool_for_job_in_az(job_name, az_guid, vsphere_connection)
34
+ job_status = job_status_in_az("#{job_name}-partition-#{az_guid}", az_guid)
35
+
36
+ job_ip = job_status.ips.fetch(0)
37
+
38
+ vm = vsphere_connection.searchIndex.FindByIp(ip: job_ip, vmSearch: true)
39
+ vm.resourcePool.name
40
+ end
41
+
42
+ private
43
+
44
+ attr_reader :browser, :product_name
45
+
46
+ def open_page
47
+ browser.visit '/'
48
+
49
+ browser.click_on "show-#{dasherized_product_name}-configure-action"
50
+ browser.click_on 'show-status-action'
51
+ end
52
+
53
+ def wait_for_loading_indicator_to_disappear
54
+ Capybara.using_wait_time 10 do
55
+ browser.all('.status-loading', count: 0) # blocks until there are no spinners
56
+ end
57
+ end
58
+
59
+ def dasherized_product_name
60
+ product_name.to_s.gsub(/[_]/, '-')
61
+ end
62
+ end
63
+ end
64
+ end
@@ -0,0 +1,40 @@
1
+ module OpsManagerUiDrivers
2
+ module Version14
3
+ class Setup
4
+ def initialize(browser: nil)
5
+ @browser = browser
6
+ end
7
+
8
+ def setup_and_login(user:, password:)
9
+ browser.visit '/setup'
10
+ browser.fill_in 'user[user_name]', with: user
11
+ browser.fill_in 'user[password]', with: password
12
+ browser.fill_in 'user[password_confirmation]', with: password
13
+ browser.check 'user_eula_accepted'
14
+ browser.click_on 'create-user-action'
15
+ end
16
+
17
+ def login(user: nil, password: nil)
18
+ browser.visit '/login'
19
+ browser.fill_in 'login[user_name]', with: user
20
+ browser.fill_in 'login[password]', with: password
21
+ browser.click_on 'login-action'
22
+ end
23
+
24
+ def setup_or_login(user:, password:)
25
+ browser.visit '/'
26
+
27
+ if browser.current_path == '/setup'
28
+ setup_and_login(user: user, password: password)
29
+ elsif browser.current_path == '/login'
30
+ login(user: user, password: password)
31
+ end
32
+ end
33
+
34
+ private
35
+
36
+ attr_reader :browser
37
+
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,43 @@
1
+ module OpsManagerUiDrivers
2
+ module Version14
3
+ class StateChangeProgress
4
+ def initialize(browser:)
5
+ @browser = browser
6
+ end
7
+
8
+ def state_change_success?
9
+ open_install_progress
10
+ browser.all('#install-success-modal').any?
11
+ end
12
+
13
+ def errand_ran?(errand_name)
14
+ open_install_progress
15
+ browser.find('#install-output .output', visible: false).text(:all).
16
+ include?("Errand `#{errand_name}' completed successfully (exit code 0)")
17
+ end
18
+
19
+ def errand_ran_with_text?(errand_name)
20
+ {
21
+ errand_ran: errand_ran?(errand_name),
22
+ output: browser.find('#install-output .output', visible: false).text(:all),
23
+ }
24
+ end
25
+
26
+ private
27
+
28
+ def open_install_progress
29
+ browser.visit '/install' unless install_progress_open?
30
+ browser.fail_early('Install probably aborted immediately') unless install_progress_open?
31
+ browser.fail_early('Install failed') if browser.all('#install-failure-modal').any?
32
+ end
33
+
34
+ def install_progress_open?
35
+ browser.current_path =~ %r(^/+install)
36
+ end
37
+
38
+ private
39
+
40
+ attr_reader :browser
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,104 @@
1
+ require 'net/https'
2
+ require 'date'
3
+
4
+ module OpsManagerUiDrivers
5
+ module Version14
6
+ class WebUi
7
+ def initialize(browser: nil)
8
+ @browser = browser
9
+ end
10
+
11
+ def setup_page
12
+ Version14::Setup.new(browser: browser)
13
+ end
14
+
15
+ def product_dashboard
16
+ Version14::ProductDashboard.new(browser: browser)
17
+ end
18
+
19
+ def state_change_progress
20
+ Version14::StateChangeProgress.new(browser: browser)
21
+ end
22
+
23
+ def available_products
24
+ Version14::AvailableProducts.new(browser: browser)
25
+ end
26
+
27
+ def ops_manager_director
28
+ Version14::OpsManagerDirector.new(browser: browser)
29
+ end
30
+
31
+ def product_logs_for(product_name)
32
+ Version14::ProductLogs.new(browser: browser, product_name: product_name)
33
+ end
34
+
35
+ def product_resources_configuration(product_name)
36
+ Version14::ProductResourceConfiguration.new(browser: browser, product_name: product_name)
37
+ end
38
+
39
+ def product(product_name)
40
+ Version14::ProductConfiguration.new(browser: browser, product_name: product_name)
41
+ end
42
+
43
+ def product_status_for(product_name)
44
+ Version14::ProductStatusHelper.new(browser: browser, product_name: product_name)
45
+ end
46
+
47
+ def job_network_mapping_for(product_name)
48
+ Version14::JobNetworkMappingHelper.new(browser: browser, product_name: product_name)
49
+ end
50
+
51
+ def product_availability_zones(product)
52
+ Version14::ProductAvailabilityZones.new(browser: browser, product: product)
53
+ end
54
+
55
+ def assign_availability_zones_for_product(product:, zones:)
56
+ if zones
57
+ Version14::JobAvailabilityZoneMappingHelper.new(
58
+ browser: browser,
59
+ product_name: product,
60
+ ).assign_availability_zones!(
61
+ singleton_availability_zone: zones[0]['name'],
62
+ availability_zones: zones.map { |z| z['name'] },
63
+ )
64
+ end
65
+ end
66
+
67
+ def current_time
68
+ uri = URI(Capybara.app_host)
69
+ uri.path = '/'
70
+ Net::HTTP.start(uri.hostname, uri.port, use_ssl: (uri.scheme == 'https'), verify_mode: OpenSSL::SSL::VERIFY_NONE) do |http|
71
+ response = http.request(Net::HTTP::Get.new(uri))
72
+ DateTime.parse(response['Date'])
73
+ end
74
+ end
75
+
76
+ def flash_message
77
+ browser.find('.flash-message').text
78
+ end
79
+
80
+ def availability_zone_guid_for_name(az_name)
81
+ browser.visit '/'
82
+ browser.click_on 'show-microbosh-configure-action'
83
+ browser.click_on 'show-director-availability-zone-assignment-action'
84
+
85
+ availability_zone_options = browser.find_field('Singleton Availability Zone').all('option')
86
+ availability_zone_options.each do |element|
87
+ if element.text == az_name
88
+ return element[:value]
89
+ end
90
+ end
91
+ end
92
+
93
+ private
94
+
95
+ attr_reader :browser
96
+
97
+ def guid
98
+ # jenkins gives us the job name in an environment variable, otherwise use the hostname
99
+ job_name = ENV['JOB_NAME'] || `hostname`.chomp.split(/\./).first
100
+ job_name.gsub(/[^[:alnum:]]+/, '_')
101
+ end
102
+ end
103
+ end
104
+ end
@@ -0,0 +1,59 @@
1
+ module OpsManagerUiDrivers
2
+ module Version15
3
+ class AvailabilityZones
4
+ def initialize(browser:)
5
+ @browser = browser
6
+ end
7
+
8
+ def add_aws_az(iaas_identifier)
9
+ open_form('availability_zones')
10
+
11
+ set_fields(fields: {'iaas_identifier' => iaas_identifier})
12
+ save_form
13
+ end
14
+
15
+ def add_az(name, cluster, resource_pool)
16
+ open_form('availability_zones')
17
+
18
+ browser.click_on 'Add'
19
+ set_fields(
20
+ fields: {
21
+ 'name' => name,
22
+ 'cluster' => cluster,
23
+ 'resource_pool' => resource_pool,
24
+ }
25
+ )
26
+ save_form
27
+ end
28
+
29
+ private
30
+
31
+ attr_reader :browser
32
+
33
+ def save_form
34
+ browser.click_on 'Save'
35
+ browser.expect(browser.page).to browser.have_css('.flash-message.success')
36
+ end
37
+
38
+ def open_form(form)
39
+ browser.visit '/'
40
+ browser.click_on 'show-microbosh-configure-action'
41
+ browser.click_on "show-#{form}-action"
42
+ end
43
+
44
+ def set_fields(fields:)
45
+ fields.each do |field, value|
46
+ set_field(field, value)
47
+ end
48
+ end
49
+
50
+ def set_field(field, value)
51
+ last_field(field).set(value)
52
+ end
53
+
54
+ def last_field(field)
55
+ browser.all(:field, "availability_zones[availability_zones][][#{field}]").last
56
+ end
57
+ end
58
+ end
59
+ end