ops_manager_ui_drivers 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
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