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,17 @@
1
+ module OpsManagerUiDrivers
2
+ module Version14
3
+ class JobStatusHelper
4
+ def self.from_job_row(job_row)
5
+ ips_string = job_row.find('.actual-ips').text
6
+ ips = ips_string.split(', ')
7
+ new(ips: ips)
8
+ end
9
+
10
+ def initialize(ips:)
11
+ @ips = ips
12
+ end
13
+
14
+ attr_reader :ips
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,58 @@
1
+ module OpsManagerUiDrivers
2
+ module Version14
3
+ class Networks
4
+ def initialize(browser:, product:)
5
+ @browser = browser
6
+ @product = product
7
+ end
8
+
9
+ def add_network(name:, iaas_network_identifier:, subnet:, dns:, gateway:, reserved_ip_ranges:)
10
+ open_form('network')
11
+
12
+ browser.click_on 'Add'
13
+ set_fields(
14
+ fields: {
15
+ 'name' => name,
16
+ 'iaas_network_identifier' => iaas_network_identifier,
17
+ 'subnet' => subnet,
18
+ 'dns' => dns,
19
+ 'gateway' => gateway,
20
+ 'reserved_ip_ranges' => reserved_ip_ranges,
21
+ }
22
+ )
23
+ save_form
24
+ end
25
+
26
+ private
27
+ attr_reader(
28
+ :browser,
29
+ :product,
30
+ )
31
+
32
+ def save_form
33
+ browser.click_on 'Save'
34
+ browser.expect(browser.page).to browser.have_css('.flash-message.success')
35
+ end
36
+
37
+ def open_form(form)
38
+ browser.visit '/'
39
+ browser.click_on "show-#{product}-configure-action"
40
+ browser.click_on "show-#{form}-action"
41
+ end
42
+
43
+ def set_fields(fields:)
44
+ fields.each do |field, value|
45
+ set_field(field, value)
46
+ end
47
+ end
48
+
49
+ def set_field(field, value)
50
+ last_field(field).set(value)
51
+ end
52
+
53
+ def last_field(field)
54
+ browser.all(:field, "network[networks][][#{field}]").last
55
+ end
56
+ end
57
+ end
58
+ end
@@ -0,0 +1,252 @@
1
+ module OpsManagerUiDrivers
2
+ module Version14
3
+ class OpsManagerDirector
4
+ def initialize(browser:)
5
+ @browser = browser
6
+ end
7
+
8
+ def configure_microbosh(test_settings)
9
+ configure_iaas(test_settings)
10
+
11
+ config_director(test_settings.ops_manager)
12
+
13
+ add_azs(test_settings.iaas_type, test_settings.ops_manager.availability_zones)
14
+
15
+ assign_availability_zone(test_settings.iaas_type, test_settings.ops_manager.availability_zones)
16
+
17
+ add_networks(test_settings)
18
+
19
+ assign_networks(test_settings.ops_manager)
20
+ end
21
+
22
+ def configure_iaas(test_settings)
23
+ case test_settings.iaas_type
24
+ when OpsManagerUiDrivers::VCLOUD_IAAS_TYPE then
25
+ configure_vcloud(
26
+ vcd_url: test_settings.ops_manager.vcloud.creds.url,
27
+ organization: test_settings.ops_manager.vcloud.creds.organization,
28
+ user: test_settings.ops_manager.vcloud.creds.user,
29
+ password: test_settings.ops_manager.vcloud.creds.password,
30
+ datacenter: test_settings.ops_manager.vcloud.vdc.name,
31
+ storage_profile: test_settings.ops_manager.vcloud.vdc.storage_profile,
32
+ )
33
+ when OpsManagerUiDrivers::VSPHERE_IAAS_TYPE then
34
+ configure_vcenter(
35
+ ip: test_settings.ops_manager.vcenter.creds.ip,
36
+ username: test_settings.ops_manager.vcenter.creds.username,
37
+ password: test_settings.ops_manager.vcenter.creds.password,
38
+ datacenter: test_settings.ops_manager.vcenter.datacenter,
39
+ datastores: test_settings.ops_manager.vcenter.datastore,
40
+ )
41
+ when OpsManagerUiDrivers::AWS_IAAS_TYPE then
42
+ configure_aws(
43
+ aws_access_key: test_settings.ops_manager.aws.aws_access_key,
44
+ aws_secret_key: test_settings.ops_manager.aws.aws_secret_key,
45
+ vpc_id: test_settings.ops_manager.aws.vpc_id,
46
+ security_group: test_settings.ops_manager.aws.security_group,
47
+ key_pair_name: test_settings.ops_manager.aws.key_pair_name,
48
+ ssh_private_key: test_settings.ops_manager.aws.ssh_key
49
+ )
50
+ when OpsManagerUiDrivers::OPENSTACK_IAAS_TYPE then
51
+ configure_openstack(
52
+ identity_endpoint: test_settings.ops_manager.openstack.identity_endpoint,
53
+ username: test_settings.ops_manager.openstack.username,
54
+ password: test_settings.ops_manager.openstack.password,
55
+ tenant: test_settings.ops_manager.openstack.tenant,
56
+ security_group_name: test_settings.ops_manager.openstack.security_group_name,
57
+ key_pair_name: test_settings.ops_manager.openstack.key_pair_name,
58
+ ssh_private_key: test_settings.ops_manager.openstack.ssh_private_key
59
+ )
60
+ end
61
+ end
62
+
63
+ def add_azs(iaas_type, iaas_availability_zones)
64
+ case iaas_type
65
+ when OpsManagerUiDrivers::AWS_IAAS_TYPE then
66
+ return unless iaas_availability_zones
67
+ availability_zones.add_aws_az(iaas_availability_zones.first['iaas_identifier'])
68
+ else
69
+ iaas_availability_zones && iaas_availability_zones.each do |az|
70
+ availability_zones.add_az(az['name'], az['cluster'], az['resource_pool'])
71
+ end
72
+ end
73
+ end
74
+
75
+ def add_networks(test_settings)
76
+ iaas_networks = test_settings.ops_manager.networks
77
+
78
+ case test_settings.iaas_type
79
+ when OpsManagerUiDrivers::AWS_IAAS_TYPE, OpsManagerUiDrivers::OPENSTACK_IAAS_TYPE then
80
+ first_network = iaas_networks.first
81
+ browser.click_on 'show-network-action'
82
+ browser.fill_in 'network[networks][][name]', with: first_network['name']
83
+ browser.fill_in 'network[networks][][iaas_network_identifier]', with: first_network['identifier']
84
+ browser.fill_in 'network[networks][][subnet]', with: first_network['subnet']
85
+ browser.fill_in 'network[networks][][reserved_ip_ranges]', with: first_network['reserved_ips']
86
+ browser.fill_in 'network[networks][][dns]', with: first_network['dns']
87
+ browser.fill_in 'network[networks][][gateway]', with: first_network['gateway']
88
+ browser.click_on 'Save'
89
+ flash_errors = browser.all('.flash-message.error ul.message li').to_a
90
+ flash_errors.reject! { |node| node.text =~ /cannot reach gateway/i }
91
+
92
+ if (flash_errors.length > 0)
93
+ fail flash_errors.collect(&:text).inspect
94
+ end
95
+ else
96
+ iaas_networks && iaas_networks.each do |network|
97
+ networks.add_network(
98
+ name: network['name'],
99
+ iaas_network_identifier: network['identifier'],
100
+ subnet: network['subnet'],
101
+ reserved_ip_ranges: network['reserved_ips'],
102
+ dns: network['dns'],
103
+ gateway: network['gateway'],
104
+ )
105
+ end
106
+ end
107
+ end
108
+
109
+ def config_director(ops_manager)
110
+ browser.click_on 'Director Config'
111
+ browser.fill_in('director_configuration[ntp_servers_string]', with: ops_manager.ntp_servers)
112
+
113
+ s3_blobstore = ops_manager.s3_blobstore
114
+ if s3_blobstore
115
+ browser.choose('S3 Compatible Blobstore')
116
+ browser.fill_in('director_configuration[s3_blobstore_options][bucket_name]', with: s3_blobstore.bucket_name)
117
+ browser.fill_in('director_configuration[s3_blobstore_options][access_key]', with: s3_blobstore.access_key_id)
118
+ browser.fill_in('director_configuration[s3_blobstore_options][secret_key]', with: s3_blobstore.secret_access_key)
119
+ end
120
+
121
+ mysql = ops_manager.mysql
122
+ if mysql
123
+ browser.choose('External MySQL Database')
124
+ browser.fill_in('director_configuration[external_database_options][host]', with: mysql.host)
125
+ browser.fill_in('director_configuration[external_database_options][port]', with: mysql.port)
126
+ browser.fill_in('director_configuration[external_database_options][user]', with: mysql.user)
127
+ browser.fill_in('director_configuration[external_database_options][password]', with: mysql.password)
128
+ browser.fill_in('director_configuration[external_database_options][database]', with: mysql.dbname)
129
+ end
130
+
131
+ browser.click_on 'Save'
132
+ end
133
+
134
+ def assign_availability_zone(iaas_type, iaas_availability_zones)
135
+ return unless iaas_availability_zones
136
+ case iaas_type
137
+ when OpsManagerUiDrivers::AWS_IAAS_TYPE then
138
+ browser.click_on 'Assign Availability Zones'
139
+ browser.select(iaas_availability_zones.first['iaas_identifier'])
140
+ browser.click_on 'Save'
141
+ when OpsManagerUiDrivers::VSPHERE_IAAS_TYPE
142
+ browser.click_on 'Assign Availability Zones'
143
+ browser.select(iaas_availability_zones.first['name'])
144
+ browser.click_on 'Save'
145
+ end
146
+
147
+ end
148
+
149
+ def assign_networks(ops_manager)
150
+ if ops_manager.vcenter
151
+ deployment_network = ops_manager.networks[0]
152
+
153
+ infrastructure_network =
154
+ ops_manager.networks[1] ? ops_manager.networks[1] : ops_manager.networks[0]
155
+
156
+ assign_networks_vsphere(
157
+ deployment_network: deployment_network['name'],
158
+ infrastructure_network: infrastructure_network['name'],
159
+ )
160
+ else
161
+ assign_network(deployment_network: ops_manager.networks[0]['name'])
162
+ end
163
+ end
164
+
165
+ def assign_networks_vsphere(infrastructure_network:, deployment_network:)
166
+ browser.click_on 'Assign Networks'
167
+
168
+ browser.within browser.find '#director_network_assignments_infrastructure_network' do
169
+ browser.select infrastructure_network
170
+ end
171
+
172
+ browser.within browser.find '#director_network_assignments_deployment_network' do
173
+ browser.select deployment_network
174
+ end
175
+ browser.click_on 'Save'
176
+ end
177
+
178
+ def assign_network(deployment_network:)
179
+ browser.click_on 'Assign Networks'
180
+
181
+ browser.select(deployment_network, from: 'Network')
182
+ browser.click_on 'Save'
183
+ end
184
+
185
+ private
186
+ attr_reader :browser
187
+
188
+ def configure_vcenter(ip:, username:, password:, datacenter:, datastores:)
189
+ iaas_configuration.configure_iaas do
190
+ iaas_configuration.set_vsphere_credentials(vcenter_ip: ip, username: username, password: password)
191
+ iaas_configuration.set_datacenter(datacenter)
192
+ iaas_configuration.set_datastores(datastores)
193
+ end
194
+ end
195
+
196
+ def configure_vcloud(vcd_url:, organization:, user:, password:, datacenter:, storage_profile:)
197
+ iaas_configuration.configure_iaas do
198
+ iaas_configuration.set_vcloud_credentials(vcd_url: vcd_url, organization: organization, user: user, password: password)
199
+ iaas_configuration.set_datacenter(datacenter)
200
+ iaas_configuration.set_storage_profile(storage_profile)
201
+ end
202
+ end
203
+
204
+ def configure_aws(aws_access_key:, aws_secret_key:, vpc_id:, security_group:, key_pair_name:, ssh_private_key:)
205
+ iaas_configuration.configure_iaas do
206
+ iaas_configuration.set_aws_credentials(
207
+ access_key_id: aws_access_key,
208
+ secret_access_key: aws_secret_key,
209
+ vpc_id: vpc_id,
210
+ security_group: security_group,
211
+ key_pair_name: key_pair_name,
212
+ ssh_private_key: ssh_private_key
213
+ )
214
+ end
215
+ end
216
+
217
+ def configure_openstack(
218
+ identity_endpoint:,
219
+ username:,
220
+ password:,
221
+ tenant:,
222
+ security_group_name:,
223
+ key_pair_name:,
224
+ ssh_private_key:
225
+ )
226
+ iaas_configuration.configure_iaas do
227
+ iaas_configuration.set_openstack_credentials(
228
+ identity_endpoint: identity_endpoint,
229
+ username: username,
230
+ password: password,
231
+ tenant: tenant,
232
+ security_group_name: security_group_name,
233
+ key_pair_name: key_pair_name,
234
+ ssh_private_key: ssh_private_key
235
+ )
236
+ end
237
+ end
238
+
239
+ def iaas_configuration
240
+ @iaas_configuration ||= Version14::IaasConfiguration.new(browser: browser, product: 'microbosh')
241
+ end
242
+
243
+ def availability_zones
244
+ @availability_zones ||= Version14::AvailabilityZones.new(browser: browser, product: 'microbosh')
245
+ end
246
+
247
+ def networks
248
+ @networks ||= Version14::Networks.new(browser: browser, product: 'microbosh')
249
+ end
250
+ end
251
+ end
252
+ end
@@ -0,0 +1,38 @@
1
+ module OpsManagerUiDrivers
2
+ module Version14
3
+ class WebUi
4
+ class ProductAvailabilityZones
5
+ def initialize(browser:, product:)
6
+ @browser = browser
7
+ @product = product
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
23
+
24
+ def open_form
25
+ browser.visit '/'
26
+ browser.click_on "show-#{product}-configure-action"
27
+ browser.click_on "show-#{product}-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 Version14
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
+ Version14::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,175 @@
1
+ module OpsManagerUiDrivers
2
+ module Version14
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
+ end
28
+
29
+ def upgrade_microbosh
30
+ open_dashboard
31
+ browser.find('p', text: 'Ops Manager Director').trigger(:mouseover)
32
+ browser.click_on 'upgrade-microbosh'
33
+ end
34
+
35
+ def delete_product(product_name)
36
+ open_dashboard
37
+ browser.click_on "open-delete-#{product_name}-modal"
38
+ wait_for_modal_css_transition_to_complete
39
+ browser.click_on "delete-#{product_name}-action"
40
+ end
41
+
42
+ def import_product_from(full_path)
43
+ open_dashboard
44
+ browser.attach_file('component_add[file]', full_path, {visible: false})
45
+ end
46
+
47
+ def product_available?(product_name, product_version)
48
+ open_dashboard
49
+ browser.all("li.#{product_name} input#component_version[value='#{product_version}']", {visible: false}).any?
50
+ end
51
+
52
+ def upgrade_product(product_name)
53
+ open_dashboard
54
+ browser.find(".product.#{product_name} p").trigger(:mouseover)
55
+ browser.click_on "upgrade-#{product_name}"
56
+ expect_no_flash_errors
57
+ end
58
+
59
+ def version_for_product(product_name)
60
+ open_dashboard
61
+ browser.find("#show-#{product_name}-configure-action .version").text
62
+ end
63
+
64
+ def delete_whole_installation
65
+ open_dashboard
66
+ browser.click_on 'toggle-installation-dropdown-action'
67
+ browser.click_on 'show-delete-installation-modal-action'
68
+ wait_for_modal_css_transition_to_complete
69
+ browser.click_on 'delete-installation-action'
70
+ apply_updates
71
+ end
72
+
73
+ def wait_for_installation_to_be_deleted
74
+ browser.poll_up_to_mins(10) do
75
+ open_dashboard
76
+ assert_install_action_disabled
77
+ end
78
+ end
79
+
80
+ def delete_installation_available?
81
+ open_dashboard
82
+ browser.click_on 'toggle-installation-dropdown-action'
83
+ browser.all('#show-delete-installation-modal-action').any?
84
+ end
85
+
86
+ def deletion_in_progress?
87
+ open_dashboard
88
+ browser.all('#delete-in-progress-marker').any?
89
+ end
90
+
91
+ def reset_state(ops_manager)
92
+ revert_pending_changes if revert_available?
93
+ if delete_installation_available?
94
+ delete_whole_installation
95
+ browser.poll_up_to_mins(15) do
96
+ browser.expect(ops_manager.state_change_progress).to browser.be_state_change_success
97
+ end
98
+ end
99
+ end
100
+
101
+ private
102
+
103
+ attr_reader :browser
104
+
105
+ def assert_install_action_disabled
106
+ browser.expect(browser.page).to browser.have_css('#install-action.disabled')
107
+ end
108
+
109
+ def assert_installation_started
110
+ browser.expect(browser.page).to browser.have_text('Applying Changes')
111
+ end
112
+
113
+ def nonignorable_verification_failed?
114
+ browser.all('.flash-message.error').any? && browser.all('#ignore-install-action').empty?
115
+ end
116
+
117
+ def allow_cpu_verification_errors
118
+ return if @allowed_ignorable_errors.include?(/Installation requires \d+ CPU cores/)
119
+
120
+ @allowed_ignorable_errors << /Installation requires \d+ CPU cores/
121
+ end
122
+
123
+ def allow_privilege_verification_errors
124
+ return if @allowed_ignorable_errors.include?(/required privileges/i)
125
+
126
+ @allowed_ignorable_errors << /required privileges/i
127
+ end
128
+
129
+ def allow_icmp_verification_errors
130
+ return if @allowed_ignorable_errors.include?(/ignorable if ICMP is disabled/i)
131
+
132
+ @allowed_ignorable_errors << /ignorable if ICMP is disabled/i
133
+ end
134
+
135
+ def ignore_allowable_errors
136
+ flash_errors = browser.all('.flash-message.error')
137
+
138
+ if flash_errors.any?
139
+ unexpected_errors = flash_errors.reject do |error|
140
+ @allowed_ignorable_errors.select do |expected_error|
141
+ error.text =~ expected_error
142
+ end.any?
143
+ end
144
+
145
+ browser.click_on 'ignore-install-action' if unexpected_errors.empty?
146
+ end
147
+ end
148
+
149
+ def expect_no_flash_errors
150
+ if (flash_error = browser.all('.flash-message.error').first)
151
+ fail flash_error.text
152
+ end
153
+ end
154
+
155
+ def wait_for_modal_css_transition_to_complete
156
+ sleep 5 # Have to wait for the CSS shade effect
157
+ end
158
+
159
+ def open_dashboard
160
+ browser.visit '/'
161
+ end
162
+
163
+ def revert_pending_changes
164
+ open_dashboard
165
+ browser.click_on 'open-revert-installation-modal-action'
166
+ wait_for_modal_css_transition_to_complete
167
+ browser.click_on 'revert-installation-action'
168
+ end
169
+
170
+ def revert_available?
171
+ browser.all('#open-revert-installation-modal-action').any?
172
+ end
173
+ end
174
+ end
175
+ end