From 60d2725113af0c7c07b29febeca75357c6d2effd Mon Sep 17 00:00:00 2001 From: Jerry Keselman Date: Thu, 26 Oct 2017 13:26:04 -0400 Subject: [PATCH 1/2] SmartState Docker Creds for AWS Add a new credentials tab for the Amazon provider that takes a userid and password to be used when performing Smartstate Analysis. These credentials will be passed to the AWS instance actually performing SSA to be used to log in to the Docker Registry. --- .../ems_common/ems_common_form_controller.js | 24 ++++++++++ app/controllers/mixins/ems_common_angular.rb | 16 ++++++- app/helpers/textual_summary_helper.rb | 17 +++---- .../_form_buttons_verify_angular.html.haml | 2 +- .../angular/_multi_auth_credentials.html.haml | 44 ++++++++++++++++++- 5 files changed, 91 insertions(+), 12 deletions(-) diff --git a/app/assets/javascripts/controllers/ems_common/ems_common_form_controller.js b/app/assets/javascripts/controllers/ems_common/ems_common_form_controller.js index 13b17abb02b..99f1b02eb3e 100644 --- a/app/assets/javascripts/controllers/ems_common/ems_common_form_controller.js +++ b/app/assets/javascripts/controllers/ems_common/ems_common_form_controller.js @@ -31,6 +31,8 @@ ManageIQ.angular.app.controller('emsCommonFormController', ['$http', '$scope', ' default_password: '', amqp_userid: '', amqp_password: '', + smartstate_docker_userid: '', + smartstate_docker_password: '', metrics_userid: '', metrics_password: '', metrics_database_name: '', @@ -131,6 +133,7 @@ ManageIQ.angular.app.controller('emsCommonFormController', ['$http', '$scope', ' $scope.emsCommonModel.default_userid = data.default_userid; $scope.emsCommonModel.amqp_userid = data.amqp_userid; $scope.emsCommonModel.metrics_userid = data.metrics_userid; + $scope.emsCommonModel.smartstate_docker_userid = data.smartstate_docker_userid; $scope.emsCommonModel.vmware_cloud_api_version = data.api_version; $scope.emsCommonModel.ssh_keypair_userid = data.ssh_keypair_userid; @@ -170,6 +173,9 @@ ManageIQ.angular.app.controller('emsCommonFormController', ['$http', '$scope', ' if ($scope.emsCommonModel.metrics_userid !== '') { $scope.emsCommonModel.metrics_password = miqService.storedPasswordPlaceholder; } + if ($scope.emsCommonModel.smartstate_docker_userid !== '') { + $scope.emsCommonModel.smartstate_docker_password = miqService.storedPasswordPlaceholder; + } if ($scope.emsCommonModel.ssh_keypair_userid !== '') { $scope.emsCommonModel.ssh_keypair_password = miqService.storedPasswordPlaceholder; } @@ -253,6 +259,10 @@ ManageIQ.angular.app.controller('emsCommonFormController', ['$http', '$scope', ' ($scope.emsCommonModel.amqp_userid != '' && $scope.angularForm.amqp_userid !== undefined && $scope.angularForm.amqp_userid.$valid && $scope.emsCommonModel.amqp_password != '' && $scope.angularForm.amqp_password !== undefined && $scope.angularForm.amqp_password.$valid)) { return true; + } else if(($scope.currentTab == "smartstate_docker") && + ($scope.emsCommonModel.smartstate_docker_userid != '' && $scope.angularForm.smartstate_docker_userid !== undefined && + $scope.emsCommonModel.smartstate_docker_password != '' && $scope.angularForm.smartstate_docker_password !== undefined)) { + return true; } else if(($scope.currentTab == "default" && $scope.emsCommonModel.emstype == "azure") && ($scope.emsCommonModel.azure_tenant_id != '' && $scope.angularForm.azure_tenant_id.$valid) && ($scope.emsCommonModel.default_userid != '' && $scope.angularForm.default_userid.$valid && @@ -470,6 +480,9 @@ ManageIQ.angular.app.controller('emsCommonFormController', ['$http', '$scope', ' if ($scope.emsCommonModel.amqp_auth_status === true) { $scope.postValidationModelRegistry("amqp"); } + if ($scope.emsCommonModel.smartstate_docker_auth_status === true) { + $scope.postValidationModelRegistry("smartstate_docker"); + } if ($scope.emsCommonModel.service_account_auth_status === true) { $scope.postValidationModelRegistry("service_account"); } @@ -489,6 +502,7 @@ ManageIQ.angular.app.controller('emsCommonFormController', ['$http', '$scope', ' $scope.postValidationModel = { default: {}, amqp: {}, + smartstate_docker: {}, metrics: {}, ssh_keypair: {}, prometheus_alerts: {}, @@ -526,6 +540,16 @@ ManageIQ.angular.app.controller('emsCommonFormController', ['$http', '$scope', ' amqp_userid: $scope.emsCommonModel.amqp_userid, amqp_password: amqp_password, }; + } else if (prefix === "smartstate_docker") { + if ($scope.newRecord) { + var smartstate_docker_password = $scope.emsCommonModel.smartstate_docker_password; + } else { + var smartstate_docker_password = $scope.emsCommonModel.smartstate_docker_password === "" ? "" : miqService.storedPasswordPlaceholder; + } + $scope.postValidationModel.smartstate_docker = { + smartstate_docker_userid: $scope.emsCommonModel.smartstate_docker_userid, + smartstate_docker_password: smartstate_docker_password, + }; } else if (prefix === "metrics") { var metricsValidationModel = { metrics_hostname: $scope.emsCommonModel.metrics_hostname, diff --git a/app/controllers/mixins/ems_common_angular.rb b/app/controllers/mixins/ems_common_angular.rb index c57bd92825f..95ab872c623 100644 --- a/app/controllers/mixins/ems_common_angular.rb +++ b/app/controllers/mixins/ems_common_angular.rb @@ -181,6 +181,7 @@ def ems_form_fields amqp_hostname = "" amqp_port = "" amqp_security_protocol = "" + smartstate_docker_userid = "" ssh_keypair_userid = "" metrics_userid = "" metrics_hostname = "" @@ -206,6 +207,11 @@ def ems_form_fields amqp_auth_status = @ems.authentication_status_ok?(:amqp) end + if @ems.has_authentication_type?(:smartstate_docker) + smartstate_docker_userid = @ems.has_authentication_type?(:smartstate_docker) ? @ems.authentication_userid(:smartstate_docker).to_s : "" + smartstate_docker_auth_status = true + end + if @ems.has_authentication_type?(:ssh_keypair) ssh_keypair_userid = @ems.has_authentication_type?(:ssh_keypair) ? @ems.authentication_userid(:ssh_keypair).to_s : "" ssh_keypair_auth_status = @ems.authentication_status_ok?(:ssh_keypair) @@ -296,6 +302,7 @@ def ems_form_fields :openstack_infra_providers_exist => retrieve_openstack_infra_providers.length > 0, :default_userid => @ems.authentication_userid ? @ems.authentication_userid : "", :amqp_userid => amqp_userid, + :smartstate_docker_userid => smartstate_docker_userid, :service_account => service_account ? service_account : "", :azure_tenant_id => azure_tenant_id ? azure_tenant_id : "", :keystone_v3_domain_id => keystone_v3_domain_id, @@ -308,6 +315,7 @@ def ems_form_fields :ems_controller => controller_name, :default_auth_status => default_auth_status, :amqp_auth_status => amqp_auth_status, + :smartstate_docker_auth_status => smartstate_docker_auth_status, :service_account_auth_status => service_account_auth_status } if controller_name == "ems_cloud" || controller_name == "ems_network" @@ -574,6 +582,7 @@ def set_ems_record_vars(ems, mode = nil) endpoints = {:default => default_endpoint, :ceilometer => ceilometer_endpoint, :amqp => amqp_endpoint, + :smartstate_docker => default_endpoint, :ssh_keypair => ssh_keypair_endpoint, :metrics => metrics_endpoint, :hawkular => hawkular_endpoint, @@ -595,7 +604,7 @@ def build_connection(ems, endpoints, mode) authentications = build_credentials(ems, mode) configurations = [] - [:default, :ceilometer, :amqp, :ssh_keypair, :metrics, :hawkular, :prometheus, :prometheus_alerts].each do |role| + [:default, :ceilometer, :amqp, :smartstate_docker, :ssh_keypair, :metrics, :hawkular, :prometheus, :prometheus_alerts].each do |role| configurations << build_configuration(ems, authentications, endpoints, role) end @@ -622,6 +631,11 @@ def build_credentials(ems, mode) amqp_password = params[:amqp_password] ? params[:amqp_password] : ems.authentication_password(:amqp) creds[:amqp] = {:userid => params[:amqp_userid], :password => amqp_password, :save => (mode != :validate)} end + if ems.kind_of?(ManageIQ::Providers::Amazon::CloudManager) && + ems.supports_authentication?(:smartstate_docker) && params[:smartstate_docker_userid] + smartstate_docker_password = params[:smartstate_docker_password] ? params[:smartstate_docker_password] : ems.authentication_password(:smartstate_docker) + creds[:smartstate_docker] = {:userid => params[:smartstate_docker_userid], :password => smartstate_docker_password, :save => true} + end if ems.kind_of?(ManageIQ::Providers::Openstack::InfraManager) && ems.supports_authentication?(:ssh_keypair) && params[:ssh_keypair_userid] ssh_keypair_password = params[:ssh_keypair_password] ? params[:ssh_keypair_password].gsub(/\r\n/, "\n") : ems.authentication_key(:ssh_keypair) diff --git a/app/helpers/textual_summary_helper.rb b/app/helpers/textual_summary_helper.rb index 2c38c69245d..d424e7fde9f 100644 --- a/app/helpers/textual_summary_helper.rb +++ b/app/helpers/textual_summary_helper.rb @@ -183,14 +183,15 @@ def textual_authentications(authentications) authentications.collect do |auth| label = case auth[:authtype] - when "default" then _("Default") - when "metrics" then _("C & U Database") - when "amqp" then _("AMQP") - when "ipmi" then _("IPMI") - when "remote" then _("Remote Login") - when "ws" then _("Web Services") - when "ssh_keypair" then _("SSH Key Pair") - else; _("") + when "default" then _("Default") + when "metrics" then _("C & U Database") + when "amqp" then _("AMQP") + when "ipmi" then _("IPMI") + when "remote" then _("Remote Login") + when "smartstate_docker" then _("SmartState Docker") + when "ws" then _("Web Services") + when "ssh_keypair" then _("SSH Key Pair") + else; _("") end {:label => _("%{label} Credentials") % {:label => label}, diff --git a/app/views/layouts/angular/_form_buttons_verify_angular.html.haml b/app/views/layouts/angular/_form_buttons_verify_angular.html.haml index c220cf4e757..6b7144c435f 100644 --- a/app/views/layouts/angular/_form_buttons_verify_angular.html.haml +++ b/app/views/layouts/angular/_form_buttons_verify_angular.html.haml @@ -9,7 +9,7 @@ - validate = "#{main_scope}.validateClicked({target: '.validate_button:visible'}, '#{valtype}', true, angularForm, '#{url_for_only_path(:action => validate_url, :id => id, :type => valtype, :button => "validate")}')" - else - validate = "#{main_scope}.validateClicked('#{url_for_only_path(:action => validate_url, :id => id, :type => valtype, :button => "validate")}')" -%div{"ng-show" => ng_show} +%div{"ng-if" => "#{main_scope}.currentTab != 'smartstate_docker'"} %miq-button{:class => 'validate_button', :name => _("Validate"), "disabled-title" => verify_title_off, diff --git a/app/views/layouts/angular/_multi_auth_credentials.html.haml b/app/views/layouts/angular/_multi_auth_credentials.html.haml index 20611cc9591..2a6e3b5b199 100644 --- a/app/views/layouts/angular/_multi_auth_credentials.html.haml +++ b/app/views/layouts/angular/_multi_auth_credentials.html.haml @@ -21,6 +21,9 @@ = miq_tab_header('ssh_keypair', nil, {'ng-click' => "changeAuthTab('ssh_keypair')"}) do %i{"error-on-tab" => "ssh_keypair", :style => "color:#cc0000"} = _("RSA key pair") + = miq_tab_header('smartstate_docker', nil, {'ng-click' => "changeAuthTab('smartstate_docker')"}) do + %i{"error-on-tab" => "smartstate_docker", :style => "color:#cc0000"} + = _("SmartState Docker") - elsif controller_name == "ems_container" = miq_tab_header('metrics', nil, 'ng-click' => "changeAuthTab('metrics')") do %div{"ng-if" => "emsCommonModel.metrics_selection == 'prometheus' || emsCommonModel.metrics_selection == 'hawkular'"} @@ -149,6 +152,32 @@ %span{:style => "color:black"} = _("Required. Used to gather Utilization data.") + - if %w(ems_cloud).include?(params[:controller]) + = miq_tab_content('smartstate_docker', 'default') do + .form-group + .col-md-12{"ng-if" => "#{ng_model}" == "emsCommonModel" && "#{ng_model}.emstype == 'ec2'"} + = render :partial => "layouts/angular-bootstrap/auth_credentials_angular_bootstrap", + :locals => {:ng_show => true, + :ng_model => "#{ng_model}", + :ng_reqd_userid => false, + :ng_reqd_password => false, + :ng_show_userid => "true", + :ng_show_password => "true", + :validate_url => validate_url, + :id => record.id, + :prefix => "smartstate_docker", + :userid_label => _("SmartState Docker User Name"), + :password_label => _("SmartState Docker Password"), + :verify_label => _("Confirm SmartState Password"), + :passwd_mismatch => _("SmartState Docker Passwords do not match"), + :change_stored_password => _("Change stored SmartState Docker password"), + :cancel_password_change => _("Cancel SmartState Docker password change"), + :verify_title_off => _("Docker Registry User Name and Password fields are needed to perform SmartState Analysis on AWS"), + :basic_info_needed => true} + .form-group + .col-md-12 + %span{:style => "color:black"} + = _("Used for Docker Registry credentials required to perform SmartState Analysis on AWS.") - if %w(ems_cloud ems_infra ems_network).include?(params[:controller]) = miq_tab_content('metrics', 'default') do .form-group @@ -387,8 +416,7 @@ %div{"ng-if" => "#{ng_model}.emstype == ''"} :javascript $('#auth_tabs').hide(); -%div{"ng-if" => "#{ng_model}.emstype == 'ec2' || " + | - "#{ng_model}.emstype == 'gce' || " + | +%div{"ng-if" => "#{ng_model}.emstype == 'gce' || " + | "#{ng_model}.emstype == 'scvmm' || " + | "#{ng_model}.emstype == 'vmwarews' || " + | "#{ng_model}.emstype == 'lenovo_ph_infra' || " + | @@ -398,6 +426,15 @@ miq_tabs_show_hide("#amqp_tab", false); miq_tabs_show_hide("#metrics_tab", false); miq_tabs_show_hide("#ssh_keypair_tab", false); + miq_tabs_show_hide("#smartstate_docker_tab", false); + miq_tabs_init('#auth_tabs'); + $('#auth_tabs').show(); +%div{"ng-if" => "#{ng_model}.emstype == 'ec2'"} + :javascript + miq_tabs_show_hide("#amqp_tab", false); + miq_tabs_show_hide("#metrics_tab", false); + miq_tabs_show_hide("#ssh_keypair_tab", false); + miq_tabs_show_hide("#smartstate_docker_tab", true); miq_tabs_init('#auth_tabs'); $('#auth_tabs').show(); %div{"ng-if" => "#{ng_model}.emstype == 'rhevm'"} @@ -405,6 +442,7 @@ miq_tabs_show_hide("#amqp_tab", false); miq_tabs_show_hide("#metrics_tab", true); miq_tabs_show_hide("#ssh_keypair_tab", false); + miq_tabs_show_hide("#smartstate_docker_tab", false); miq_tabs_init('#auth_tabs'); $('#auth_tabs').show(); %div{"ng-if" => "#{ng_model}.emstype == 'openstack' || #{ng_model}.emstype == 'vmware_cloud'"} @@ -412,6 +450,7 @@ miq_tabs_show_hide("#amqp_tab", true); miq_tabs_show_hide("#metrics_tab", false); miq_tabs_show_hide("#ssh_keypair_tab", false); + miq_tabs_show_hide("#smartstate_docker_tab", false); miq_tabs_init('#auth_tabs'); $('#auth_tabs').show(); %div{"ng-if" => "#{ng_model}.emstype == 'openstack_infra'"} @@ -419,6 +458,7 @@ miq_tabs_show_hide("#amqp_tab", true); miq_tabs_show_hide("#metrics_tab", false); miq_tabs_show_hide("#ssh_keypair_tab", true); + miq_tabs_show_hide("#smartstate_docker_tab", false); miq_tabs_init('#auth_tabs'); $('#auth_tabs').show(); %div{"ng-if" => "#{ng_model}.emstype == 'nuage_network'"} From d6c88f63725e4f09d89f3fc3ada290f578c62d55 Mon Sep 17 00:00:00 2001 From: Jerry Keselman Date: Thu, 26 Oct 2017 14:13:03 -0400 Subject: [PATCH 2/2] Rubocop Warnings Fix warnings called out by Rubocop. --- app/controllers/mixins/ems_common_angular.rb | 6 +++--- app/views/layouts/angular/_multi_auth_credentials.html.haml | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/app/controllers/mixins/ems_common_angular.rb b/app/controllers/mixins/ems_common_angular.rb index 95ab872c623..a10cc13117b 100644 --- a/app/controllers/mixins/ems_common_angular.rb +++ b/app/controllers/mixins/ems_common_angular.rb @@ -302,7 +302,7 @@ def ems_form_fields :openstack_infra_providers_exist => retrieve_openstack_infra_providers.length > 0, :default_userid => @ems.authentication_userid ? @ems.authentication_userid : "", :amqp_userid => amqp_userid, - :smartstate_docker_userid => smartstate_docker_userid, + :smartstate_docker_userid => smartstate_docker_userid, :service_account => service_account ? service_account : "", :azure_tenant_id => azure_tenant_id ? azure_tenant_id : "", :keystone_v3_domain_id => keystone_v3_domain_id, @@ -315,7 +315,7 @@ def ems_form_fields :ems_controller => controller_name, :default_auth_status => default_auth_status, :amqp_auth_status => amqp_auth_status, - :smartstate_docker_auth_status => smartstate_docker_auth_status, + :smartstate_docker_auth_status => smartstate_docker_auth_status, :service_account_auth_status => service_account_auth_status } if controller_name == "ems_cloud" || controller_name == "ems_network" @@ -582,7 +582,7 @@ def set_ems_record_vars(ems, mode = nil) endpoints = {:default => default_endpoint, :ceilometer => ceilometer_endpoint, :amqp => amqp_endpoint, - :smartstate_docker => default_endpoint, + :smartstate_docker => default_endpoint, :ssh_keypair => ssh_keypair_endpoint, :metrics => metrics_endpoint, :hawkular => hawkular_endpoint, diff --git a/app/views/layouts/angular/_multi_auth_credentials.html.haml b/app/views/layouts/angular/_multi_auth_credentials.html.haml index 2a6e3b5b199..20d00063de1 100644 --- a/app/views/layouts/angular/_multi_auth_credentials.html.haml +++ b/app/views/layouts/angular/_multi_auth_credentials.html.haml @@ -172,7 +172,7 @@ :passwd_mismatch => _("SmartState Docker Passwords do not match"), :change_stored_password => _("Change stored SmartState Docker password"), :cancel_password_change => _("Cancel SmartState Docker password change"), - :verify_title_off => _("Docker Registry User Name and Password fields are needed to perform SmartState Analysis on AWS"), + :verify_title_off => _("Docker Registry User Name and Password for SmartState Analysis on AWS"), :basic_info_needed => true} .form-group .col-md-12