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,40 @@
1
+ module OpsManagerUiDrivers
2
+ module Version13
3
+ class Setup
4
+ def initialize(browser: nil)
5
+ @browser = browser
6
+ end
7
+
8
+ def setup_and_login(user:, password:)
9
+ browser.visit '/setup'
10
+ browser.fill_in 'user[user_name]', with: user
11
+ browser.fill_in 'user[password]', with: password
12
+ browser.fill_in 'user[password_confirmation]', with: password
13
+ browser.check 'user_eula_accepted'
14
+ browser.click_on 'create-user-action'
15
+ end
16
+
17
+ def login(user: nil, password: nil)
18
+ browser.visit '/login'
19
+ browser.fill_in 'login[user_name]', with: user
20
+ browser.fill_in 'login[password]', with: password
21
+ browser.click_on 'login-action'
22
+ end
23
+
24
+ def setup_or_login(user:, password:)
25
+ browser.visit '/'
26
+
27
+ if browser.current_path == '/setup'
28
+ setup_and_login(user: user, password: password)
29
+ elsif browser.current_path == '/login'
30
+ login(user: user, password: password)
31
+ end
32
+ end
33
+
34
+ private
35
+
36
+ attr_reader :browser
37
+
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,106 @@
1
+ require 'net/https'
2
+ require 'date'
3
+
4
+ module OpsManagerUiDrivers
5
+ module Version13
6
+ class WebUi
7
+ def initialize(browser: nil)
8
+ @browser = browser
9
+ end
10
+
11
+ def setup_page
12
+ @setup_page ||= Version13::Setup.new(browser: browser)
13
+ end
14
+
15
+ def product_dashboard
16
+ @product_dashboard ||= Version13::ProductDashboard.new(browser: browser)
17
+ end
18
+
19
+ def install_progress
20
+ @install_progress ||= Version13::InstallProgress.new(browser: browser)
21
+ end
22
+
23
+ def available_products
24
+ @available_products ||= Version13::AvailableProducts.new(browser: browser)
25
+ end
26
+
27
+ def product_logs_for(product_name)
28
+ Version13::ProductLogs.new(browser: browser, product_name: product_name)
29
+ end
30
+
31
+ def current_time
32
+ uri = URI(Capybara.app_host)
33
+ uri.path = '/'
34
+ Net::HTTP.start(uri.hostname, uri.port, use_ssl: (uri.scheme == 'https'), verify_mode: OpenSSL::SSL::VERIFY_NONE) do |http|
35
+ response = http.request(Net::HTTP::Get.new(uri))
36
+ DateTime.parse(response['Date'])
37
+ end
38
+ end
39
+
40
+ def product_status_for(product_name)
41
+ Version13::ProductStatusHelper.new(
42
+ product_name: product_name,
43
+ browser: browser,
44
+ )
45
+ end
46
+
47
+ def job_network_mapping_for(product_name)
48
+ Version13::JobNetworkMappingHelper.new(
49
+ product_name: product_name,
50
+ browser: browser,
51
+ )
52
+ end
53
+
54
+ def assign_availability_zones_for_product(product:, zones:)
55
+ if zones
56
+ Version13::JobAvailabilityZoneMappingHelper.new(
57
+ product_name: product,
58
+ browser: browser,
59
+ ).assign_availability_zones!(
60
+ singleton_availability_zone: zones[0]['name'],
61
+ availability_zones: zones.map { |z| z['name'] },
62
+ )
63
+ end
64
+ end
65
+
66
+ def ops_manager_director
67
+ @ops_manager_director ||= Version13::OpsManagerDirector.new(browser: browser)
68
+ end
69
+
70
+ def product_availability_zones(product)
71
+ @product_availability_zones ||= Version13::ProductAvailabilityZones.new(browser: browser, product: product)
72
+ end
73
+
74
+ def flash_message
75
+ browser.find('.flash-message').text
76
+ end
77
+
78
+ def availability_zone_guid_for_name(az_name)
79
+ browser.visit '/'
80
+ browser.click_on 'show-microbosh-configure-action'
81
+ browser.click_on 'show-director-availability-zone-assignment-action'
82
+
83
+ availability_zone_options = browser.find_field('Singleton Availability Zone').all('option')
84
+ availability_zone_options.each do |element|
85
+ if element.text == az_name
86
+ return element[:value]
87
+ end
88
+ end
89
+ end
90
+
91
+ def product_resources_configuration(product_name)
92
+ Version13::ProductResourceConfiguration.new(browser: browser, product_name: product_name)
93
+ end
94
+
95
+ private
96
+
97
+ attr_reader :browser
98
+
99
+ def guid
100
+ # jenkins gives us the job name in an environment variable, otherwise use the hostname
101
+ job_name = ENV['JOB_NAME'] || `hostname`.chomp.split(/\./).first
102
+ job_name.gsub(/[^[:alnum:]]+/, '_')
103
+ end
104
+ end
105
+ end
106
+ end
@@ -0,0 +1,40 @@
1
+ require 'net/https'
2
+
3
+ module OpsManagerUiDrivers
4
+ module Version14
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,59 @@
1
+ module OpsManagerUiDrivers
2
+ module Version14
3
+ class AvailabilityZones
4
+ def initialize(browser:, product:)
5
+ @browser = browser
6
+ @product = product
7
+ end
8
+
9
+ def add_aws_az(iaas_identifier)
10
+ open_form('availability_zones')
11
+
12
+ set_fields(fields: {'iaas_identifier' => iaas_identifier})
13
+ save_form
14
+ end
15
+
16
+ def add_az(name, cluster, resource_pool)
17
+ open_form('availability_zones')
18
+
19
+ browser.click_on 'Add'
20
+ set_fields(
21
+ fields: {
22
+ 'name' => name,
23
+ 'cluster' => cluster,
24
+ 'resource_pool' => resource_pool,
25
+ }
26
+ )
27
+ save_form
28
+ end
29
+
30
+ private
31
+ attr_reader :browser, :product
32
+
33
+ def save_form
34
+ browser.click_on 'Save'
35
+ browser.expect(browser.page).to browser.have_css('.flash-message.success')
36
+ end
37
+
38
+ def open_form(form)
39
+ browser.visit '/'
40
+ browser.click_on "show-#{product}-configure-action"
41
+ browser.click_on "show-#{form}-action"
42
+ end
43
+
44
+ def set_fields(fields:)
45
+ fields.each do |field, value|
46
+ set_field(field, value)
47
+ end
48
+ end
49
+
50
+ def set_field(field, value)
51
+ last_field(field).set(value)
52
+ end
53
+
54
+ def last_field(field)
55
+ browser.all(:field, "availability_zones[availability_zones][][#{field}]").last
56
+ end
57
+ end
58
+ end
59
+ end
@@ -0,0 +1,24 @@
1
+ module OpsManagerUiDrivers
2
+ module Version14
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,89 @@
1
+ module OpsManagerUiDrivers
2
+ module Version14
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
+ def set_aws_credentials(access_key_id:, secret_access_key:, vpc_id:, security_group:, key_pair_name:, ssh_private_key:)
31
+ set_field('access_key_id', access_key_id)
32
+ set_field('secret_access_key', secret_access_key)
33
+ set_field('vpc_id', vpc_id)
34
+ set_field('security_group', security_group)
35
+ set_field('key_pair_name', key_pair_name)
36
+ set_field('ssh_private_key', ssh_private_key)
37
+ end
38
+
39
+ def set_openstack_credentials(
40
+ identity_endpoint:,
41
+ username:,
42
+ password:,
43
+ tenant:,
44
+ security_group_name:,
45
+ key_pair_name:,
46
+ ssh_private_key:
47
+ )
48
+ set_field('identity_endpoint', identity_endpoint)
49
+ set_field('username', username)
50
+ set_field('password', password)
51
+ set_field('tenant', tenant)
52
+ set_field('security_group', security_group_name)
53
+ set_field('key_pair_name', key_pair_name)
54
+ set_field('ssh_private_key', ssh_private_key)
55
+ end
56
+
57
+
58
+ def set_datacenter(datacenter)
59
+ set_field('datacenter', datacenter)
60
+ end
61
+
62
+ def set_datastores(datastores)
63
+ set_field('datastores_string', datastores)
64
+ end
65
+
66
+ def set_storage_profile(storage_profile)
67
+ set_field('storage_profile', storage_profile)
68
+ end
69
+
70
+ private
71
+ attr_reader :browser, :product
72
+
73
+ def save_form
74
+ browser.click_on 'Save'
75
+ browser.expect(browser.page).to browser.have_css('.flash-message.success')
76
+ end
77
+
78
+ def open_form(form)
79
+ browser.visit '/'
80
+ browser.click_on "show-#{product}-configure-action"
81
+ browser.click_on "show-#{form}-action"
82
+ end
83
+
84
+ def set_field(field, value)
85
+ browser.find_field("iaas_configuration[#{field}]").set(value)
86
+ end
87
+ end
88
+ end
89
+ end
@@ -0,0 +1,70 @@
1
+ module OpsManagerUiDrivers
2
+ module Version14
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}-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 Version14
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}-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