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.
- checksums.yaml +7 -0
- data/.gitignore +10 -0
- data/.rspec +2 -0
- data/.travis.yml +3 -0
- data/Gemfile +4 -0
- data/LICENSE +13 -0
- data/README.md +39 -0
- data/Rakefile +12 -0
- data/bin/console +14 -0
- data/bin/setup +7 -0
- data/ci/run_specs.sh +11 -0
- data/lib/ops_manager_ui_drivers.rb +10 -0
- data/lib/ops_manager_ui_drivers/page_helpers.rb +52 -0
- data/lib/ops_manager_ui_drivers/version.rb +3 -0
- data/lib/ops_manager_ui_drivers/version11/api_1_1.rb +40 -0
- data/lib/ops_manager_ui_drivers/version11/available_products.rb +24 -0
- data/lib/ops_manager_ui_drivers/version11/install_progress.rb +24 -0
- data/lib/ops_manager_ui_drivers/version11/login.rb +24 -0
- data/lib/ops_manager_ui_drivers/version11/network_configuration.rb +31 -0
- data/lib/ops_manager_ui_drivers/version11/ntp_servers.rb +28 -0
- data/lib/ops_manager_ui_drivers/version11/ops_manager_director.rb +27 -0
- data/lib/ops_manager_ui_drivers/version11/product_dashboard.rb +73 -0
- data/lib/ops_manager_ui_drivers/version11/vcenter_credentials.rb +31 -0
- data/lib/ops_manager_ui_drivers/version11/vsphere_configuration.rb +31 -0
- data/lib/ops_manager_ui_drivers/version11/web_ui.rb +34 -0
- data/lib/ops_manager_ui_drivers/version12/api_1_2.rb +40 -0
- data/lib/ops_manager_ui_drivers/version12/available_products.rb +24 -0
- data/lib/ops_manager_ui_drivers/version12/install_progress.rb +24 -0
- data/lib/ops_manager_ui_drivers/version12/login.rb +24 -0
- data/lib/ops_manager_ui_drivers/version12/network_configuration.rb +32 -0
- data/lib/ops_manager_ui_drivers/version12/ntp_servers.rb +28 -0
- data/lib/ops_manager_ui_drivers/version12/ops_manager_director.rb +27 -0
- data/lib/ops_manager_ui_drivers/version12/product_dashboard.rb +73 -0
- data/lib/ops_manager_ui_drivers/version12/vcenter_credentials.rb +31 -0
- data/lib/ops_manager_ui_drivers/version12/vsphere_configuration.rb +30 -0
- data/lib/ops_manager_ui_drivers/version12/web_ui.rb +34 -0
- data/lib/ops_manager_ui_drivers/version13/api_1_3.rb +40 -0
- data/lib/ops_manager_ui_drivers/version13/availability_zones.rb +55 -0
- data/lib/ops_manager_ui_drivers/version13/available_products.rb +24 -0
- data/lib/ops_manager_ui_drivers/version13/iaas_configuration.rb +65 -0
- data/lib/ops_manager_ui_drivers/version13/install_progress.rb +43 -0
- data/lib/ops_manager_ui_drivers/version13/job_availability_zone_mapping_helper.rb +70 -0
- data/lib/ops_manager_ui_drivers/version13/job_network_mapping_helper.rb +47 -0
- data/lib/ops_manager_ui_drivers/version13/job_status_helper.rb +17 -0
- data/lib/ops_manager_ui_drivers/version13/networks.rb +83 -0
- data/lib/ops_manager_ui_drivers/version13/ops_manager_director.rb +140 -0
- data/lib/ops_manager_ui_drivers/version13/product_availability_zones.rb +38 -0
- data/lib/ops_manager_ui_drivers/version13/product_dashboard.rb +157 -0
- data/lib/ops_manager_ui_drivers/version13/product_logs.rb +53 -0
- data/lib/ops_manager_ui_drivers/version13/product_resource_configuration.rb +46 -0
- data/lib/ops_manager_ui_drivers/version13/product_status_helper.rb +64 -0
- data/lib/ops_manager_ui_drivers/version13/setup.rb +40 -0
- data/lib/ops_manager_ui_drivers/version13/web_ui.rb +106 -0
- data/lib/ops_manager_ui_drivers/version14/api_1_4.rb +40 -0
- data/lib/ops_manager_ui_drivers/version14/availability_zones.rb +59 -0
- data/lib/ops_manager_ui_drivers/version14/available_products.rb +24 -0
- data/lib/ops_manager_ui_drivers/version14/iaas_configuration.rb +89 -0
- data/lib/ops_manager_ui_drivers/version14/job_availability_zone_mapping_helper.rb +70 -0
- data/lib/ops_manager_ui_drivers/version14/job_network_mapping_helper.rb +47 -0
- data/lib/ops_manager_ui_drivers/version14/job_status_helper.rb +17 -0
- data/lib/ops_manager_ui_drivers/version14/networks.rb +58 -0
- data/lib/ops_manager_ui_drivers/version14/ops_manager_director.rb +252 -0
- data/lib/ops_manager_ui_drivers/version14/product_availability_zones.rb +38 -0
- data/lib/ops_manager_ui_drivers/version14/product_configuration.rb +34 -0
- data/lib/ops_manager_ui_drivers/version14/product_dashboard.rb +175 -0
- data/lib/ops_manager_ui_drivers/version14/product_form.rb +47 -0
- data/lib/ops_manager_ui_drivers/version14/product_logs.rb +38 -0
- data/lib/ops_manager_ui_drivers/version14/product_resource_configuration.rb +46 -0
- data/lib/ops_manager_ui_drivers/version14/product_status_helper.rb +64 -0
- data/lib/ops_manager_ui_drivers/version14/setup.rb +40 -0
- data/lib/ops_manager_ui_drivers/version14/state_change_progress.rb +43 -0
- data/lib/ops_manager_ui_drivers/version14/web_ui.rb +104 -0
- data/lib/ops_manager_ui_drivers/version15/availability_zones.rb +59 -0
- data/lib/ops_manager_ui_drivers/version15/available_products.rb +24 -0
- data/lib/ops_manager_ui_drivers/version15/iaas_configuration.rb +105 -0
- data/lib/ops_manager_ui_drivers/version15/job_availability_zone_mapping_helper.rb +70 -0
- data/lib/ops_manager_ui_drivers/version15/job_network_mapping_helper.rb +47 -0
- data/lib/ops_manager_ui_drivers/version15/job_status_helper.rb +17 -0
- data/lib/ops_manager_ui_drivers/version15/networks.rb +55 -0
- data/lib/ops_manager_ui_drivers/version15/ops_manager_director.rb +261 -0
- data/lib/ops_manager_ui_drivers/version15/product_availability_zones.rb +38 -0
- data/lib/ops_manager_ui_drivers/version15/product_configuration.rb +34 -0
- data/lib/ops_manager_ui_drivers/version15/product_dashboard.rb +176 -0
- data/lib/ops_manager_ui_drivers/version15/product_form.rb +47 -0
- data/lib/ops_manager_ui_drivers/version15/product_logs.rb +38 -0
- data/lib/ops_manager_ui_drivers/version15/product_resource_configuration.rb +63 -0
- data/lib/ops_manager_ui_drivers/version15/product_status_helper.rb +64 -0
- data/lib/ops_manager_ui_drivers/version15/setup.rb +44 -0
- data/lib/ops_manager_ui_drivers/version15/state_change_progress.rb +43 -0
- data/lib/ops_manager_ui_drivers/version15/web_ui.rb +104 -0
- data/lib/ops_manager_ui_drivers/wait_helper.rb +51 -0
- data/ops_manager_ui_drivers.gemspec +29 -0
- 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
|