From 3f6caec5abaf93bab2a0d4f5286aadc4d7935f7e Mon Sep 17 00:00:00 2001 From: CentOS Sources Date: May 07 2019 19:24:23 +0000 Subject: import pcs-0.10.1-4.el8_0.2 --- diff --git a/SOURCES/bz1690290-GUI-cannot-create-a-cluster-if-k.patch b/SOURCES/bz1690290-GUI-cannot-create-a-cluster-if-k.patch new file mode 100644 index 0000000..ba4dfcc --- /dev/null +++ b/SOURCES/bz1690290-GUI-cannot-create-a-cluster-if-k.patch @@ -0,0 +1,98 @@ +From 77760bdeb1642e30f109ba88a98fff8b1faba206 Mon Sep 17 00:00:00 2001 +From: Ivan Devat +Date: Tue, 19 Mar 2019 10:05:40 +0100 +Subject: [PATCH] squash bz1690290 GUI cannot create a cluster if k + +fix missing addrs field in cluster setup in webUi + +fix transport options in cluster setup in webui +--- + pcsd/public/js/api.js | 41 ++++++++++++++++++++++++--------- + pcsd/public/js/cluster-setup.js | 8 +++---- + 2 files changed, 33 insertions(+), 16 deletions(-) + +diff --git a/pcsd/public/js/api.js b/pcsd/public/js/api.js +index 6c433b54..b9c94720 100644 +--- a/pcsd/public/js/api.js ++++ b/pcsd/public/js/api.js +@@ -209,10 +209,39 @@ api.checkAuthAgainstNodes = function(nodesNames){ + + api.clusterSetup = function(submitData, processOptions){ + var setupData = submitData.setupData; ++ var transportOptions = {}; ++ if (setupData.transportType === "knet") { ++ transportOptions = { ++ ip_version: setupData.transportOptions.ip_version, ++ knet_pmtud_interval: setupData.transportOptions.knet_pmtud_interval, ++ link_mode: setupData.transportOptions.link_mode, ++ }; ++ } else if(setupData.transportType !== undefined) { ++ transportOptions = { ++ ip_version: setupData.transportOptions.ip_version, ++ netmtu: setupData.transportOptions.netmtu, ++ }; ++ } + var data = { + cluster_name: setupData.clusterName, + nodes: setupData.nodeList.map(function(node){ + apiNode = { name: node.name }; ++ // The backend defaults addresses. But for the defaulting addresses there ++ // must be no key "addrs". ++ // There can be following (valid) scenarios: ++ // 1 User uses no link. We omit key "addrs" for every node. The backend ++ // defaults addresses. ++ // 2 User uses 1 link and keep all addresses fields empty. We omit key ++ // "addrs" for every node. The backend defaults addresses. ++ // 3 User uses 1 link and keep some addresses fields empty. We omit key ++ // "addrs" for respective nodes. The backend then refuses it because ++ // nodes addreses are inconsistent. ++ // 4 User uses more links. We omit key "addrs" when no address for node is ++ // filled. The backend then refuses it because nodes addresses count ++ // is inconsistent with links count. ++ // Because we need to support scenario 2 and the backend defaults ++ // addresses only when key "addrs" is not specified we cannot simply ++ // sent empty addresses or empty address list (i.e. key "addrs"). + var addrs = node.addrs.filter(function(addr){return addr.length > 0}); + if (addrs.length > 0) { + apiNode["addrs"] = addrs; +@@ -220,17 +249,7 @@ api.clusterSetup = function(submitData, processOptions){ + return apiNode; + }), + transport_type: setupData.transportType, +- transport_options: setupData.transportType == "knet" +- ? { +- ip_version: setupData.transportOptions.ip_version, +- knet_pmtud_interval: setupData.transportOptions.knet_pmtud_interval, +- link_mode: setupData.transportOptions.link_mode, +- } +- : { +- ip_version: setupData.transportOptions.ip_version, +- netmtu: setupData.transportOptions.netmtu, +- } +- , ++ transport_options: transportOptions, + link_list: setupData.linkList.map(function(link){ + return setupData.transportType == "knet" + ? { +diff --git a/pcsd/public/js/cluster-setup.js b/pcsd/public/js/cluster-setup.js +index 2b7b0a4e..be0a22d5 100644 +--- a/pcsd/public/js/cluster-setup.js ++++ b/pcsd/public/js/cluster-setup.js +@@ -322,11 +322,9 @@ clusterSetup.data.validateNameAndNodes = function(formData){ + + clusterSetup.data.nodes = function(nodesNames, getAddrs){ + return nodesNames.map(function(nodeName){ +- addrs = getAddrs ? getAddrs(nodeName) : []; +- return addrs.length > 0 +- ? { name: nodeName, addrs: addrs } +- : { name: nodeName } +- ; ++ // The field addrs is here always. The details of backend is solved within ++ // api.js module. ++ return { name: nodeName, addrs: getAddrs ? getAddrs(nodeName) : [] }; + }); + }; + +-- +2.20.1 + diff --git a/SOURCES/bz1690304-GUI-submitting-of-create-cluster.patch b/SOURCES/bz1690304-GUI-submitting-of-create-cluster.patch new file mode 100644 index 0000000..7a5d8b8 --- /dev/null +++ b/SOURCES/bz1690304-GUI-submitting-of-create-cluster.patch @@ -0,0 +1,48 @@ +From f0ee2b03681f192c4779e934108eabf771b65c3c Mon Sep 17 00:00:00 2001 +From: Ivan Devat +Date: Tue, 19 Mar 2019 10:48:10 +0100 +Subject: [PATCH] squash bz1690304 GUI submitting of create cluster + +add quotes around html attribute value + +It fixes issue with node names containg dots. JQuery parsing failed when +quotes were not around html attribute value in the case of value +containing dots. + +fix omitting link/quorum opts: webui cluster setup +--- + pcsd/public/js/cluster-setup.js | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +diff --git a/pcsd/public/js/cluster-setup.js b/pcsd/public/js/cluster-setup.js +index be0a22d5..fc927507 100644 +--- a/pcsd/public/js/cluster-setup.js ++++ b/pcsd/public/js/cluster-setup.js +@@ -82,7 +82,7 @@ clusterSetup.link.detail.refreshNodesNames = function(linkDetail, nodesNames){ + + var newAddresses = nodesNames.map(function(nodeName){ + return previousNodesNames.contains(nodeName) +- ? linkDetail.find("[data-transport-addr-host="+nodeName+"]") ++ ? linkDetail.find("[data-transport-addr-host='"+nodeName+"']") + : clusterSetup.link.detail.createAddress(nodeName) + ; + }); +@@ -391,6 +391,7 @@ clusterSetup.data.settings = function(clusterName, nodesNames){ + ) { + return value == "on" ? "1" : "0"; + } ++ return value; + }, + ), + }, +@@ -450,6 +451,7 @@ clusterSetup.data.settings = function(clusterName, nodesNames){ + if (name === "broadcast"){ + return value == "yes" ? "1" : "0"; + } ++ return value; + }, + ); + }) +-- +2.20.1 + diff --git a/SOURCES/fix-web-UI-dashboard-data-loading-timeout.patch b/SOURCES/fix-web-UI-dashboard-data-loading-timeout.patch new file mode 100644 index 0000000..5c70020 --- /dev/null +++ b/SOURCES/fix-web-UI-dashboard-data-loading-timeout.patch @@ -0,0 +1,163 @@ +From 45732498ed6d77ee783b6713a50190098b1678ac Mon Sep 17 00:00:00 2001 +From: Ivan Devat +Date: Thu, 7 Feb 2019 11:08:11 +0100 +Subject: [PATCH] squash, fix web UI dashboard data loading timeout + +load systemctl/chkconfig services list only once + +Systemctl/chkconfig services have been retrived repeatedly for each +service (pacemaker, pacemaker_remote, corosync, pcsd, sbd). It had +a performace impact on loading clusters overview. + +clean up a check whether services are installed +--- + pcsd/cluster_entity.rb | 3 +- + pcsd/pcs.rb | 81 ++++++++++++++++++++++++++++++------------ + pcsd/remote.rb | 4 ++- + 3 files changed, 64 insertions(+), 24 deletions(-) + +diff --git a/pcsd/cluster_entity.rb b/pcsd/cluster_entity.rb +index 79f25450..861dd0c5 100644 +--- a/pcsd/cluster_entity.rb ++++ b/pcsd/cluster_entity.rb +@@ -1177,10 +1177,11 @@ module ClusterEntity + + def self.load_current_node(crm_dom=nil) + node = ClusterEntity::Node.new ++ service_checker = get_service_installed_checker() + node.services.each do |service, info| + info[:running] = is_service_running?(service.to_s) + info[:enabled] = is_service_enabled?(service.to_s) +- info[:installed] = is_service_installed?(service.to_s) ++ info[:installed] = service_checker.is_installed?(service.to_s) + end + node.corosync = node.services[:corosync][:running] + node.corosync_enabled = node.services[:corosync][:enabled] +diff --git a/pcsd/pcs.rb b/pcsd/pcs.rb +index 1f86ae04..7035f4f2 100644 +--- a/pcsd/pcs.rb ++++ b/pcsd/pcs.rb +@@ -1728,35 +1728,72 @@ def is_service_running?(service) + return (retcode == 0) + end + +-def is_service_installed?(service) +- unless ISSYSTEMCTL +- stdout, _, retcode = run_cmd(PCSAuth.getSuperuserAuth(), 'chkconfig') +- if retcode != 0 ++class ServiceInstalledChecker ++ def initialize() ++ @list_unit_files_output = self.load_unit_files_list() ++ end ++ ++ def is_installed?(service) ++ if @list_unit_files_output.nil? + return nil + end +- stdout.each { |line| +- if line.split(' ')[0] == service ++ ++ @list_unit_files_output.each { |line| ++ if self.contains_line_service?(line, service) + return true + end + } + return false + end + +- # currently we are not using systemd instances (service_name@instance) in pcsd +- # for proper implementation of is_service_installed see +- # pcs/lib/external.py:is_service_installed +- stdout, _, retcode = run_cmd( +- PCSAuth.getSuperuserAuth(), 'systemctl', 'list-unit-files', '--full' +- ) +- if retcode != 0 +- return nil +- end +- stdout.each { |line| +- if line.strip().start_with?("#{service}.service") +- return true ++ protected ++ def load_unit_files_list() ++ stdout, _, retcode = self.run_command() ++ if retcode != 0 ++ return nil + end +- } +- return false ++ return stdout ++ end ++end ++ ++class ServiceInstalledCheckerSystemctl < ServiceInstalledChecker ++ protected ++ def run_command ++ # currently we are not using systemd instances (service_name@instance) in pcsd ++ # for proper implementation of is_service_installed see ++ # pcs/lib/external.py:is_service_installed ++ return run_cmd( ++ PCSAuth.getSuperuserAuth(), 'systemctl', 'list-unit-files', '--full' ++ ) ++ end ++ ++ def contains_line_service?(line, service) ++ return line.strip().start_with?("#{service}.service") ++ end ++end ++ ++class ServiceInstalledCheckerChkconfig < ServiceInstalledChecker ++ protected ++ def run_command ++ return run_cmd(PCSAuth.getSuperuserAuth(), 'chkconfig') ++ end ++ ++ def contains_line_service?(line, service) ++ return line.split(' ')[0] == service ++ end ++end ++ ++def get_service_installed_checker ++ if ISSYSTEMCTL ++ return ServiceInstalledCheckerSystemctl.new ++ else ++ return ServiceInstalledCheckerChkconfig.new ++ end ++end ++ ++ ++def is_service_installed?(service) ++ return get_service_installed_checker().is_installed?(service) + end + + def enable_service(service) +@@ -1888,9 +1925,9 @@ def get_alerts(auth_user) + end + end + +-def get_service_info(service_name) ++def get_service_info(service_name, service_checker) + return { +- :installed => is_service_installed?(service_name), ++ :installed => service_checker.is_installed?(service_name), + :enabled => is_service_enabled?(service_name), + :running => is_service_running?(service_name), + :version => nil, +diff --git a/pcsd/remote.rb b/pcsd/remote.rb +index 0154c78c..6f454681 100644 +--- a/pcsd/remote.rb ++++ b/pcsd/remote.rb +@@ -2911,8 +2911,10 @@ def check_host(params, request, auth_user) + File.exist?(Cfgsync::CorosyncConf.file_path) or File.exist?(CIB_PATH) + ) + } ++ ++ service_checker = get_service_installed_checker + service_list.each do |service| +- output[:services][service] = get_service_info(service.to_s) ++ output[:services][service] = get_service_info(service.to_s, service_checker) + end + service_version_getter.each do |service, version_getter| + version = version_getter.call() +-- +2.20.1 + diff --git a/SPECS/pcs.spec b/SPECS/pcs.spec index 62fa301..26faff4 100644 --- a/SPECS/pcs.spec +++ b/SPECS/pcs.spec @@ -1,6 +1,6 @@ Name: pcs Version: 0.10.1 -Release: 4%{?dist} +Release: 4%{?dist}.2 # https://fedoraproject.org/wiki/Licensing:Main?rd=Licensing#Good_Licenses # GPLv2: pcs # ASL 2.0: tornado @@ -86,6 +86,9 @@ Patch4: bz1661059-01-re-add-and-deprecate-pcs-resource-show.patch # downstream patches Patch100: bz1668422-01-fix-crashes-when-using-unsupported-options.patch Patch101: do-not-support-cluster-setup-with-udp-u-transport.patch +Patch102: bz1690290-GUI-cannot-create-a-cluster-if-k.patch +Patch103: bz1690304-GUI-submitting-of-create-cluster.patch +Patch104: fix-web-UI-dashboard-data-loading-timeout.patch # git for patches BuildRequires: git @@ -462,6 +465,15 @@ run_all_tests %license pyagentx_LICENSE.txt %changelog +* Mon Apr 8 2019 Ondrej Mular - 0.10.1-4.el8_0.2 +- Fixed web UI dashboard data loading +- Resolves: rhbz#1690304 + +* Thu Mar 28 2019 Ivan Devat - 0.10.1-4.el8_0.1 +- Fixed crash of the cluster create without knet links specified in webUI +- Fixed submitting of 'create cluster' form when full domain names are used +- Resolves: rhbz#1690290 rhbz#1690304 + * Wed Jan 30 2019 Ivan Devat - 0.10.1-4 - Fixed crash when using unsupported options in commands `pcs status` and `pcs config` - Resolves: rhbz#1668422