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,38 @@
1
+ module OpsManagerUiDrivers
2
+ module Version15
3
+ class WebUi
4
+ class ProductAvailabilityZones
5
+ def initialize(browser:, product_name:)
6
+ @browser = browser
7
+ @product_name = product_name
8
+ end
9
+
10
+ def assign_availability_zones(singleton_availability_zone:, availability_zones:)
11
+ open_form
12
+ browser.choose(singleton_availability_zone)
13
+ # we don't change the assignments in clean install yet,
14
+ # otherwise we'd want to clear them out first
15
+ availability_zones.each do |az_name|
16
+ browser.check(az_name)
17
+ end
18
+ save_form
19
+ end
20
+
21
+ private
22
+ attr_reader :browser, :product_name
23
+
24
+ def open_form
25
+ browser.visit '/'
26
+ browser.click_on "show-#{product_name}-configure-action"
27
+ browser.click_on "show-#{product_name}-availability-zone-assignment-action"
28
+ end
29
+
30
+ def save_form
31
+ browser.click_on 'Save'
32
+
33
+ browser.expect(browser.page).to browser.have_css('.flash-message.success')
34
+ end
35
+ end
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,34 @@
1
+ module OpsManagerUiDrivers
2
+ module Version15
3
+ class ProductConfiguration
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 upload_stemcell(stemcell_file_path)
12
+ visit_product_page
13
+ browser.click_on "show-#{product_name}-stemcell-assignment-action"
14
+ browser.attach_file('product_stemcell[file]', stemcell_file_path, {visible: false})
15
+ browser.wait {
16
+ browser.has_text?("Stemcell '#{File.basename(stemcell_file_path)}' has been uploaded successfully.")
17
+ }
18
+ end
19
+
20
+ def product_form(form_name)
21
+ Version15::ProductForm.new(browser: browser, product_name: product_name, form_name: form_name)
22
+ end
23
+
24
+ private
25
+
26
+ attr_reader :browser, :product_name
27
+
28
+ def visit_product_page
29
+ browser.visit '/'
30
+ browser.click_on "show-#{product_name}-configure-action"
31
+ end
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,176 @@
1
+ module OpsManagerUiDrivers
2
+ module Version15
3
+ class ProductDashboard
4
+ def initialize(browser:)
5
+ @browser = browser
6
+ @allowed_ignorable_errors = []
7
+ end
8
+
9
+ def apply_updates
10
+ open_dashboard
11
+ browser.click_on 'install-action'
12
+ fail 'Install failed verification' if nonignorable_verification_failed?
13
+ allow_cpu_verification_errors
14
+ allow_privilege_verification_errors
15
+ allow_icmp_verification_errors #this is only for AWS; consider moving out
16
+
17
+ ignore_allowable_errors
18
+ assert_installation_started
19
+ end
20
+
21
+ def import_installation_file(file_path)
22
+ open_dashboard
23
+ browser.click_on 'toggle-installation-dropdown-action'
24
+ browser.click_on 'show-import-backup'
25
+ browser.attach_file 'import[file]', file_path
26
+ browser.click_on 'import-backup'
27
+ browser.wait { browser.has_text?('Successfully imported installation.') }
28
+ end
29
+
30
+ def upgrade_microbosh
31
+ open_dashboard
32
+ browser.find('p', text: 'Ops Manager Director').trigger(:mouseover)
33
+ browser.click_on 'upgrade-microbosh'
34
+ end
35
+
36
+ def delete_product(product_name)
37
+ open_dashboard
38
+ browser.click_on "open-delete-#{product_name}-modal"
39
+ wait_for_modal_css_transition_to_complete
40
+ browser.click_on "delete-#{product_name}-action"
41
+ end
42
+
43
+ def import_product_from(full_path)
44
+ open_dashboard
45
+ browser.attach_file('component_add[file]', full_path, {visible: false})
46
+ end
47
+
48
+ def product_available?(product_name, product_version)
49
+ open_dashboard
50
+ browser.all("li.#{product_name} input#component_version[value='#{product_version}']", {visible: false}).any?
51
+ end
52
+
53
+ def upgrade_product(product_name)
54
+ open_dashboard
55
+ browser.find(".product.#{product_name} p").trigger(:mouseover)
56
+ browser.click_on "upgrade-#{product_name}"
57
+ expect_no_flash_errors
58
+ end
59
+
60
+ def version_for_product(product_name)
61
+ open_dashboard
62
+ browser.find("#show-#{product_name}-configure-action .version").text
63
+ end
64
+
65
+ def delete_whole_installation
66
+ open_dashboard
67
+ browser.click_on 'toggle-installation-dropdown-action'
68
+ browser.click_on 'show-delete-installation-modal-action'
69
+ wait_for_modal_css_transition_to_complete
70
+ browser.click_on 'delete-installation-action'
71
+ apply_updates
72
+ end
73
+
74
+ def wait_for_installation_to_be_deleted
75
+ browser.poll_up_to_mins(10) do
76
+ open_dashboard
77
+ assert_install_action_disabled
78
+ end
79
+ end
80
+
81
+ def delete_installation_available?
82
+ open_dashboard
83
+ browser.click_on 'toggle-installation-dropdown-action'
84
+ browser.all('#show-delete-installation-modal-action').any?
85
+ end
86
+
87
+ def deletion_in_progress?
88
+ open_dashboard
89
+ browser.all('#delete-in-progress-marker').any?
90
+ end
91
+
92
+ def reset_state(ops_manager)
93
+ revert_pending_changes if revert_available?
94
+ if delete_installation_available?
95
+ delete_whole_installation
96
+ browser.poll_up_to_mins(15) do
97
+ browser.expect(ops_manager.state_change_progress).to browser.be_state_change_success
98
+ end
99
+ end
100
+ end
101
+
102
+ private
103
+
104
+ attr_reader :browser
105
+
106
+ def assert_install_action_disabled
107
+ browser.expect(browser.page).to browser.have_css('#install-action.disabled')
108
+ end
109
+
110
+ def assert_installation_started
111
+ browser.expect(browser.page).to browser.have_text('Applying Changes')
112
+ end
113
+
114
+ def nonignorable_verification_failed?
115
+ browser.all('.flash-message.error').any? && browser.all('#ignore-install-action').empty?
116
+ end
117
+
118
+ def allow_cpu_verification_errors
119
+ return if @allowed_ignorable_errors.include?(/Installation requires \d+ CPU cores/)
120
+
121
+ @allowed_ignorable_errors << /Installation requires \d+ CPU cores/
122
+ end
123
+
124
+ def allow_privilege_verification_errors
125
+ return if @allowed_ignorable_errors.include?(/required privileges/i)
126
+
127
+ @allowed_ignorable_errors << /required privileges/i
128
+ end
129
+
130
+ def allow_icmp_verification_errors
131
+ return if @allowed_ignorable_errors.include?(/ignorable if ICMP is disabled/i)
132
+
133
+ @allowed_ignorable_errors << /ignorable if ICMP is disabled/i
134
+ end
135
+
136
+ def ignore_allowable_errors
137
+ flash_errors = browser.all('.flash-message.error')
138
+
139
+ if flash_errors.any?
140
+ unexpected_errors = flash_errors.reject do |error|
141
+ @allowed_ignorable_errors.select do |expected_error|
142
+ error.text =~ expected_error
143
+ end.any?
144
+ end
145
+
146
+ browser.click_on 'ignore-install-action' if unexpected_errors.empty?
147
+ end
148
+ end
149
+
150
+ def expect_no_flash_errors
151
+ if (flash_error = browser.all('.flash-message.error').first)
152
+ fail flash_error.text
153
+ end
154
+ end
155
+
156
+ def wait_for_modal_css_transition_to_complete
157
+ sleep 5 # Have to wait for the CSS shade effect
158
+ end
159
+
160
+ def open_dashboard
161
+ browser.visit '/'
162
+ end
163
+
164
+ def revert_pending_changes
165
+ open_dashboard
166
+ browser.click_on 'open-revert-installation-modal-action'
167
+ wait_for_modal_css_transition_to_complete
168
+ browser.click_on 'revert-installation-action'
169
+ end
170
+
171
+ def revert_available?
172
+ browser.all('#open-revert-installation-modal-action').any?
173
+ end
174
+ end
175
+ end
176
+ end
@@ -0,0 +1,47 @@
1
+ module OpsManagerUiDrivers
2
+ module Version15
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 Version15
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,63 @@
1
+ module OpsManagerUiDrivers
2
+ module Version15
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_instance_type_for_job(job_name, instance_type)
18
+ open_form
19
+ browser.
20
+ find("select[name='product_resources_form[#{job_name}][instance_type_id]']").
21
+ find("option[value='#{instance_type}']").
22
+ select_option
23
+ save_form
24
+ end
25
+
26
+ def set_elb_name_for_job(job_name, elb_name)
27
+ open_form
28
+ browser.find_field("product_resources_form[#{job_name}][elb_name]").set(elb_name)
29
+ save_form
30
+ end
31
+
32
+ def set_resources_for_jobs(resources_by_job, validate: true)
33
+ open_form
34
+ resources_by_job.each do |job, resources|
35
+ resources.each do |resource_or_instance, value|
36
+ browser.fill_in("product_resources_form[#{job}][#{resource_or_instance}][value]", with: value)
37
+ end
38
+ end
39
+ save_form(validate: validate)
40
+ end
41
+
42
+ private
43
+
44
+ attr_reader :browser
45
+
46
+ def open_form
47
+ browser.visit '/'
48
+ browser.click_on "show-#{product_name}-configure-action"
49
+ browser.click_on "show-#{product_name}-resource-sizes-action"
50
+ end
51
+
52
+ def save_form(validate: true)
53
+ browser.click_on 'Save'
54
+
55
+ fail('unexpected failure') unless browser.has_css?('.flash-message')
56
+
57
+ if validate
58
+ fail(browser.find('.flash-message.error').text) unless browser.has_css?('.flash-message.success')
59
+ end
60
+ end
61
+ end
62
+ end
63
+ end
@@ -0,0 +1,64 @@
1
+ module OpsManagerUiDrivers
2
+ module Version15
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
+ Version15::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
+ Version15::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