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,34 @@
1
+ module OpsManagerUiDrivers
2
+ module Version12
3
+ class WebUi
4
+ def initialize(browser:)
5
+ @browser = browser
6
+ end
7
+
8
+ def login_page
9
+ @login_page ||= Version12::Login.new(browser: browser)
10
+ end
11
+
12
+ def product_dashboard
13
+ @product_dashboard ||= Version12::ProductDashboard.new(browser: browser)
14
+ end
15
+
16
+ def available_products
17
+ @available_products ||= Version12::AvailableProducts.new(browser: browser)
18
+ end
19
+
20
+ def ops_manager_director
21
+ @ops_manager_director ||= Version12::OpsManagerDirector.new(browser: browser)
22
+ end
23
+
24
+ def install_progress
25
+ @install_progress ||= Version12::InstallProgress.new(browser: browser)
26
+ end
27
+
28
+ private
29
+
30
+ attr_reader :browser
31
+
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,40 @@
1
+ require 'net/https'
2
+
3
+ module OpsManagerUiDrivers
4
+ module Version13
5
+ class Api
6
+ def initialize(host: nil, user: nil, password: nil)
7
+ @host = host
8
+ @user = user
9
+ @password = password
10
+ end
11
+
12
+ def export_installation
13
+ response = http.request(get('installation_asset_collection'))
14
+
15
+ Tempfile.new('installation.zip').tap do |tempfile|
16
+ tempfile.write(response.body)
17
+ tempfile.close
18
+ end
19
+ end
20
+
21
+ private
22
+
23
+ def http
24
+ uri = URI(@host)
25
+ Net::HTTP.new(uri.host, uri.port).tap do |http|
26
+ http.use_ssl = true
27
+ http.verify_mode = OpenSSL::SSL::VERIFY_NONE
28
+ http.read_timeout = 900
29
+ end
30
+ end
31
+
32
+ def get(endpoint)
33
+ uri = URI("#{@host}/api/#{endpoint}")
34
+ Net::HTTP::Get.new(uri.request_uri).tap do |get|
35
+ get.basic_auth(@user, @password)
36
+ end
37
+ end
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,55 @@
1
+ module OpsManagerUiDrivers
2
+ module Version13
3
+ class AvailabilityZones
4
+ def initialize(browser:, product:)
5
+ @browser = browser
6
+ @product = product
7
+ end
8
+
9
+ def add_az(name, cluster, resource_pool)
10
+ open_form('availability_zones')
11
+
12
+ browser.click_on 'Add'
13
+ set_fields(
14
+ fields: {
15
+ 'name' => name,
16
+ 'cluster' => cluster,
17
+ 'resource_pool' => resource_pool,
18
+ }
19
+ )
20
+ save_form
21
+ end
22
+
23
+ private
24
+ attr_reader(
25
+ :browser,
26
+ :product,
27
+ )
28
+
29
+ def save_form
30
+ browser.click_on 'Save'
31
+ browser.expect(browser.page).to browser.have_css('.flash-message.success')
32
+ end
33
+
34
+ def open_form(form)
35
+ browser.visit '/'
36
+ browser.click_on "show-#{product}-configure-action"
37
+ browser.click_on "show-#{form}-action"
38
+ end
39
+
40
+ def set_fields(fields:)
41
+ fields.each do |field, value|
42
+ set_field(field, value)
43
+ end
44
+ end
45
+
46
+ def set_field(field, value)
47
+ last_field(field).set(value)
48
+ end
49
+
50
+ def last_field(field)
51
+ browser.all(:field, "availability_zones[availability_zones][][#{field}]").last
52
+ end
53
+ end
54
+ end
55
+ end
@@ -0,0 +1,24 @@
1
+ module OpsManagerUiDrivers
2
+ module Version13
3
+ class AvailableProducts
4
+ def initialize(browser:)
5
+ @browser = browser
6
+ end
7
+
8
+ def add_product_to_install(product_name)
9
+ browser.visit '/'
10
+ browser.click_on "add-#{product_name}"
11
+ end
12
+
13
+ def product_added?(product_name)
14
+ browser.visit '/'
15
+ browser.all("#show-configure-#{product_name}-action").any?
16
+ end
17
+
18
+ private
19
+
20
+ attr_reader :browser
21
+
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,65 @@
1
+ module OpsManagerUiDrivers
2
+ module Version13
3
+ class IaasConfiguration
4
+ def initialize(browser:, product:)
5
+ @browser = browser
6
+ @product = product
7
+ end
8
+
9
+ def configure_iaas
10
+ open_form('iaas_configuration')
11
+
12
+ yield
13
+
14
+ save_form
15
+ end
16
+
17
+ def set_vsphere_credentials(vcenter_ip:, username:, password:)
18
+ set_field('vcenter_ip', vcenter_ip)
19
+ set_field('vcenter_username', username)
20
+ set_field('vcenter_password', password)
21
+ end
22
+
23
+ def set_vcloud_credentials(vcd_url:, organization:, user:, password:)
24
+ set_field('vcd_url', vcd_url)
25
+ set_field('organization', organization)
26
+ set_field('vcd_username', user)
27
+ set_field('vcd_password', password)
28
+ end
29
+
30
+
31
+ def set_datacenter(datacenter)
32
+ set_field('datacenter', datacenter)
33
+ end
34
+
35
+ def set_datastores(datastores)
36
+ set_field('datastores_string', datastores)
37
+ end
38
+
39
+ def set_storage_profile(storage_profile)
40
+ set_field('storage_profile', storage_profile)
41
+ end
42
+
43
+ private
44
+ attr_reader(
45
+ :browser,
46
+ :product,
47
+ )
48
+
49
+ def save_form
50
+ browser.click_on 'Save'
51
+ browser.expect(browser.page).to browser.have_css('.flash-message.success')
52
+ end
53
+
54
+ def open_form(form)
55
+ browser.visit '/'
56
+ browser.click_on "show-#{product}-configure-action"
57
+ browser.click_on "show-#{form}-action"
58
+ end
59
+
60
+ def set_field(field, value)
61
+ browser.find_field("iaas_configuration[#{field}]").set(value)
62
+ end
63
+ end
64
+ end
65
+ end
@@ -0,0 +1,43 @@
1
+ module OpsManagerUiDrivers
2
+ module Version13
3
+ class InstallProgress
4
+ def initialize(browser:)
5
+ @browser = browser
6
+ end
7
+
8
+ def install_success?
9
+ open_install_progress
10
+ browser.all('#install-success-modal').any?
11
+ end
12
+
13
+ def errand_ran?(errand_name)
14
+ open_install_progress
15
+ browser.find('#install-output .output', visible: false).text(:all).
16
+ include?("Errand `#{errand_name}' completed successfully (exit code 0)")
17
+ end
18
+
19
+ def errand_ran_with_text?(errand_name)
20
+ {
21
+ errand_ran: errand_ran?(errand_name),
22
+ output: browser.find('#install-output .output', visible: false).text(:all),
23
+ }
24
+ end
25
+
26
+ private
27
+
28
+ def open_install_progress
29
+ browser.visit '/install' unless install_progress_open?
30
+ browser.fail_early('Install probably aborted immediately') unless install_progress_open?
31
+ browser.fail_early('Install failed') if browser.all('#install-failure-modal').any?
32
+ end
33
+
34
+ def install_progress_open?
35
+ browser.current_path == '/install'
36
+ end
37
+
38
+ private
39
+
40
+ attr_reader :browser
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,70 @@
1
+ module OpsManagerUiDrivers
2
+ module Version13
3
+ class JobAvailabilityZoneMappingHelper
4
+ def initialize(product_name: nil, browser: nil)
5
+ @product_name = product_name
6
+ @browser = browser
7
+ end
8
+
9
+ SINGLETON_AVAILABILITY_ZONE_INPUT_SELECTOR = "input[name='product[singleton_availability_zone_reference]']"
10
+ AVAILABILITY_ZONE_INPUT_SELECTOR = "input[name='product[availability_zone_references][]']"
11
+
12
+ def assign_availability_zones!(singleton_availability_zone:, availability_zones:)
13
+ open_form
14
+
15
+ browser.all(AVAILABILITY_ZONE_INPUT_SELECTOR).each do |checkbox|
16
+ checkbox.set(false)
17
+ end
18
+
19
+ availability_zones.each do |az_name|
20
+ browser.check("#{az_name}")
21
+ end
22
+
23
+ browser.choose("#{singleton_availability_zone}")
24
+
25
+ save_form
26
+ end
27
+
28
+ def singleton_availability_zone
29
+ open_form
30
+
31
+ selected_options = browser.all("#{SINGLETON_AVAILABILITY_ZONE_INPUT_SELECTOR}[selected='selected']").map do |radio|
32
+ browser.find("label[for='#{radio[:id]}']").text
33
+ end
34
+
35
+ raise ArgumentError, 'availability_zone not selected' if selected_options.empty?
36
+ selected_options.first
37
+ end
38
+
39
+ def availability_zones
40
+ open_form
41
+
42
+ browser.all("#{AVAILABILITY_ZONE_INPUT_SELECTOR}[checked='checked']").map do |checkbox|
43
+ browser.find("label[for='#{checkbox[:id]}']").text
44
+ end
45
+ end
46
+
47
+ private
48
+
49
+ attr_reader :browser, :product_name
50
+
51
+ def open_form
52
+ browser.visit '/'
53
+ browser.click_on "show-#{product_name}-configure-action"
54
+ browser.click_on "show-#{product_name}-job-availability-zone-assignment-action"
55
+ end
56
+
57
+ def save_form
58
+ browser.click_on 'Save'
59
+
60
+ unless browser.has_css?('.flash-message.success')
61
+ if browser.has_css?('.flash-message.error')
62
+ raise browser.find('.flash-message.error').text
63
+ else
64
+ raise 'unexpected failure'
65
+ end
66
+ end
67
+ end
68
+ end
69
+ end
70
+ end
@@ -0,0 +1,47 @@
1
+ module OpsManagerUiDrivers
2
+ module Version13
3
+ class JobNetworkMappingHelper
4
+ PRODUCT_NETWORK_FIELD_NAME = 'product_network_assignment'
5
+
6
+ def initialize(product_name:, browser:)
7
+ @product_name = product_name
8
+ @browser = browser
9
+ end
10
+
11
+ def assign_product_to_network(network)
12
+ open_form
13
+ browser.find_field(PRODUCT_NETWORK_FIELD_NAME).find(:option, text: network).select_option
14
+ save_form
15
+ end
16
+
17
+ def product_network
18
+ open_form
19
+ selected_options = browser.find_field(PRODUCT_NETWORK_FIELD_NAME).all('option[selected]')
20
+ raise ArgumentError, "#{PRODUCT_NETWORK_FIELD_NAME} not selected" if selected_options.empty?
21
+ selected_options.first.text
22
+ end
23
+
24
+ private
25
+
26
+ attr_reader :product_name, :browser
27
+
28
+ def open_form
29
+ browser.visit '/'
30
+ browser.click_on "show-#{product_name}-configure-action"
31
+ browser.click_on "show-#{product_name}-job-network-assignment-action"
32
+ end
33
+
34
+ def save_form
35
+ browser.click_on 'Save'
36
+
37
+ unless browser.has_css?('.flash-message.success')
38
+ if browser.has_css?('.flash-message.error')
39
+ raise browser.find('.flash-message.error').text
40
+ else
41
+ raise 'unexpected failure'
42
+ end
43
+ end
44
+ end
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,17 @@
1
+ module OpsManagerUiDrivers
2
+ module Version13
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,83 @@
1
+ module OpsManagerUiDrivers
2
+ module Version13
3
+ class Networks
4
+ def initialize(browser:, product:)
5
+ @browser = browser
6
+ @product = product
7
+
8
+ @allowed_ignorable_errors = []
9
+ end
10
+
11
+ def add_network(name:, iaas_network_identifier:, subnet:, dns:, gateway:, reserved_ip_ranges:)
12
+ open_form('network')
13
+
14
+ browser.click_on 'Add'
15
+ set_fields(
16
+ fields: {
17
+ 'name' => name,
18
+ 'iaas_network_identifier' => iaas_network_identifier,
19
+ 'subnet' => subnet,
20
+ 'dns' => dns,
21
+ 'gateway' => gateway,
22
+ 'reserved_ip_ranges' => reserved_ip_ranges,
23
+ }
24
+ )
25
+
26
+ allow_network_not_found_errors
27
+ save_form
28
+ end
29
+
30
+ private
31
+
32
+ attr_reader :browser, :product
33
+
34
+ def allow_network_not_found_errors
35
+ network_not_found = /not found in datacenter/
36
+ return if @allowed_ignorable_errors.include?(network_not_found)
37
+
38
+ @allowed_ignorable_errors << network_not_found
39
+ end
40
+
41
+ def expect_allowed_ignorable_errors
42
+ flash_errors = browser.all('.flash-message.error')
43
+
44
+ if flash_errors.any?
45
+ unexpected_errors = flash_errors.reject do |error|
46
+ @allowed_ignorable_errors.select do |expected_error|
47
+ error.text =~ expected_error
48
+ end.any?
49
+ end
50
+
51
+ fail "Unexepcted ignorable errors: #{unexpected_errors.map(&:text).inspect}" unless unexpected_errors.empty?
52
+ else
53
+ browser.expect(browser.page).to browser.have_css('.flash-message.success')
54
+ end
55
+ end
56
+
57
+ def save_form
58
+ browser.click_on 'Save'
59
+ expect_allowed_ignorable_errors
60
+ end
61
+
62
+ def open_form(form)
63
+ browser.visit '/'
64
+ browser.click_on "show-#{product}-configure-action"
65
+ browser.click_on "show-#{form}-action"
66
+ end
67
+
68
+ def set_fields(fields:)
69
+ fields.each do |field, value|
70
+ set_field(field, value)
71
+ end
72
+ end
73
+
74
+ def set_field(field, value)
75
+ last_field(field).set(value)
76
+ end
77
+
78
+ def last_field(field)
79
+ browser.all(:field, "network[networks][][#{field}]").last
80
+ end
81
+ end
82
+ end
83
+ end