Skip to content

Commit ee7aaf4

Browse files
authored
Dev: migration: implement corosync.conf migration for corosync 3 (jsc#PED-8252) (#1422)
This pull request implements migrating `corosync.conf` from corosync 2 to corosync 3, including: * migrate deprecated transport `udpu` and `udp` to `knet` * replace removed feature _RRP_ with _knet multilink_ * if `crypto_hash` is set to `sha1`, which is the default value in corosync 2, upgrades it to the new default in corosync 3, `sha256`. --- # Use Cases ## Check When All Green for Migration ``` > sudo crm cluster health sles16 ------ node: localhost ------ [INFO] Checking dependency version... [INFO] Checking used corosync features... [WARN] Corosync transport "udpu" will be deprecated in corosync 3. Please use knet. ------ cib ------ [WARN] The CIB is not validated with the latest schema version. * Latest version: 3.10 * Current version: 3.9 [INFO] Checking used resource agents... ------ node: ha-2-2 ------ [WARN] Corosync transport "udpu" will be deprecated in corosync 3. Please use knet. ****** summary ****** [INFO] Please run "crm cluster health sles16 --fix" on on any one of above nodes. [PASS] This cluster is good to migrate to SLES 16. ``` ## Check When Already Migrated ``` > sudo crm cluster health sles16 ------ node: localhost ------ [INFO] Checking dependency version... [INFO] Checking used corosync features... ------ cib ------ [INFO] Checking used resource agents... ------ node: ha-2-2 ------ ****** summary ****** [INFO] This cluster works on SLES 16. No migration is needed. ``` ## Run Migration ``` > sudo crm cluster health sles16 --fix suse@ha-2-1:~> sudo crm cluster health sles16 --fix ------ node: localhost ------ [INFO] Checking dependency version... [INFO] Checking used corosync features... [WARN] Corosync transport "udpu" will be deprecated in corosync 3. Please use knet. ------ cib ------ [WARN] The CIB is not validated with the latest schema version. * Latest version: 3.10 * Current version: 3.9 [INFO] Checking used resource agents... ------ node: ha-2-2 ------ [WARN] Corosync transport "udpu" will be deprecated in corosync 3. Please use knet. INFO: Starting migration... INFO: Migrating corosync configuration... INFO: Upgrade totem.transport to knet. INFO: Upgrade totem.crypto_hash from "sha1" to "sha256". INFO: Finish migrating corosync configuration. The original configuration is renamed to corosync.conf.bak INFO: Finished migration. ``` ## Try to Run Migration When Already Migrated ``` suse@ha-2-1:~> sudo crm cluster health sles16 --fix ------ node: localhost ------ [INFO] Checking dependency version... [INFO] Checking used corosync features... ------ cib ------ [WARN] The CIB is not validated with the latest schema version. * Latest version: 3.10 * Current version: 3.9 [INFO] Checking used resource agents... ------ node: ha-2-2 ------ INFO: This cluster works on SLES 16 with some warnings. Please fix the remaining warnings manually. ```
2 parents e90df9c + 2c7b93f commit ee7aaf4

21 files changed

+1348
-79
lines changed

.github/workflows/crmsh-ci.yml

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -415,6 +415,21 @@ jobs:
415415
token: ${{ secrets.CODECOV_TOKEN }}
416416
flags: integration
417417

418+
functional_test_migration:
419+
runs-on: ubuntu-24.04
420+
timeout-minutes: 40
421+
steps:
422+
- uses: actions/checkout@v4
423+
- name: functional test for migration
424+
run: |
425+
echo '{ "exec-opts": ["native.cgroupdriver=systemd"] }' | sudo tee /etc/docker/daemon.json
426+
sudo systemctl restart docker.service
427+
$CONTAINER_SCRIPT `$GET_INDEX_OF migration` && $CONTAINER_SCRIPT -d && $CONTAINER_SCRIPT -u `$GET_INDEX_OF migration`
428+
- uses: codecov/codecov-action@v4
429+
with:
430+
token: ${{ secrets.CODECOV_TOKEN }}
431+
flags: integration
432+
418433
original_regression_test:
419434
runs-on: ubuntu-24.04
420435
timeout-minutes: 40

MANIFEST.in

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
recursive-include crmsh *.txt

codecov.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ coverage:
88
threshold: 0.35%
99
codecov:
1010
notify:
11-
after_n_builds: 28
11+
after_n_builds: 29
1212
comment:
13-
after_n_builds: 28
13+
after_n_builds: 29
1414
layout: "condensed_header, flags, files, condensed_footer"

crmsh/cibquery.py

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
"""utilities for parsing CIB xml"""
2+
import dataclasses
3+
import typing
4+
5+
import lxml.etree
6+
7+
from crmsh import constants
8+
9+
10+
@dataclasses.dataclass(frozen=True)
11+
class ResourceAgent:
12+
m_class: str
13+
m_provider: typing.Optional[str]
14+
m_type: str
15+
16+
17+
@dataclasses.dataclass(frozen=True)
18+
class ClusterNode:
19+
node_id: int
20+
uname: str
21+
22+
23+
def get_configured_resource_agents(cib: lxml.etree.Element) -> typing.Set[ResourceAgent]:
24+
return set(
25+
ResourceAgent(e.get('class'), e.get('provider'), e.get('type'))
26+
for e in cib.xpath('/cib/configuration/resources//primitive')
27+
)
28+
29+
30+
def has_primitive_filesystem_with_fstype(cib: lxml.etree.Element, fstype: str) -> bool:
31+
return bool(cib.xpath(
32+
'/cib/configuration/resources//primitive[@class="ocf" and @provider="heartbeat" and @type="Filesystem"]'
33+
f'/instance_attributes/nvpair[@name="fstype" and @value="{fstype}"]'
34+
))
35+
36+
def get_cluster_nodes(cib: lxml.etree.Element) -> list[ClusterNode]:
37+
"""Return a list of cluster nodes, excluding pacemaker-remote nodes"""
38+
result = list()
39+
for element in cib.xpath(constants.XML_NODE_PATH):
40+
node_id = element.get('id')
41+
uname = element.get('uname')
42+
if element.get('type') == 'remote':
43+
xpath = "//primitive[@provider='pacemaker' and @type='remote']/instance_attributes/nvpair[@name='server' and @value='{}']".format(
44+
uname if uname is not None else node_id
45+
)
46+
if cib.xpath(xpath):
47+
continue
48+
assert node_id
49+
assert uname
50+
result.append(ClusterNode(int(node_id), uname))
51+
return result

crmsh/corosync.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ def configure_two_node(removing: bool = False, qdevice_adding: bool = False) ->
8585

8686

8787
def conf():
88-
return os.getenv('COROSYNC_MAIN_CONFIG_FILE', '/etc/corosync/corosync.conf')
88+
return os.environ.get('COROSYNC_MAIN_CONFIG_FILE', '/etc/corosync/corosync.conf')
8989

9090

9191
def check_tools():
Lines changed: 147 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,147 @@
1+
ocf:heartbeat:CTDB
2+
ocf:heartbeat:ClusterMon
3+
ocf:heartbeat:Delay
4+
ocf:heartbeat:Dummy
5+
ocf:heartbeat:Filesystem
6+
ocf:heartbeat:IPaddr2
7+
ocf:heartbeat:IPsrcaddr
8+
ocf:heartbeat:IPv6addr
9+
ocf:heartbeat:LVM-activate
10+
ocf:heartbeat:MailTo
11+
ocf:heartbeat:NodeUtilization
12+
ocf:heartbeat:Raid1
13+
ocf:heartbeat:Route
14+
ocf:heartbeat:SAPDatabase
15+
ocf:heartbeat:SAPInstance
16+
ocf:heartbeat:SendArp
17+
ocf:heartbeat:Squid
18+
ocf:heartbeat:Stateful
19+
ocf:heartbeat:VirtualDomain
20+
ocf:heartbeat:WAS
21+
ocf:heartbeat:WAS6
22+
ocf:heartbeat:Xinetd
23+
ocf:heartbeat:aliyun-vpc-move-ip
24+
ocf:heartbeat:apache
25+
ocf:heartbeat:aws-vpc-move-ip
26+
ocf:heartbeat:aws-vpc-route53
27+
ocf:heartbeat:awseip
28+
ocf:heartbeat:awsvip
29+
ocf:heartbeat:azure-events
30+
ocf:heartbeat:azure-events-az
31+
ocf:heartbeat:azure-lb
32+
ocf:heartbeat:conntrackd
33+
ocf:heartbeat:corosync-qnetd
34+
ocf:heartbeat:crypt
35+
ocf:heartbeat:db2
36+
ocf:heartbeat:dhcpd
37+
ocf:heartbeat:docker
38+
ocf:heartbeat:docker-compose
39+
ocf:heartbeat:dummypy
40+
ocf:heartbeat:ethmonitor
41+
ocf:heartbeat:exportfs
42+
ocf:heartbeat:galera
43+
ocf:heartbeat:garbd
44+
ocf:heartbeat:gcp-ilb
45+
ocf:heartbeat:gcp-pd-move
46+
ocf:heartbeat:gcp-vpc-move-ip
47+
ocf:heartbeat:gcp-vpc-move-vip
48+
ocf:heartbeat:iSCSILogicalUnit
49+
ocf:heartbeat:iSCSITarget
50+
ocf:heartbeat:iface-bridge
51+
ocf:heartbeat:iface-macvlan
52+
ocf:heartbeat:iface-vlan
53+
ocf:heartbeat:ldirectord
54+
ocf:heartbeat:lvmlockd
55+
ocf:heartbeat:mariadb
56+
ocf:heartbeat:mdraid
57+
ocf:heartbeat:mpathpersist
58+
ocf:heartbeat:mysql
59+
ocf:heartbeat:mysql-proxy
60+
ocf:heartbeat:named
61+
ocf:heartbeat:nfsnotify
62+
ocf:heartbeat:nfsserver
63+
ocf:heartbeat:nginx
64+
ocf:heartbeat:nvmet-namespace
65+
ocf:heartbeat:nvmet-port
66+
ocf:heartbeat:nvmet-subsystem
67+
ocf:heartbeat:oraasm
68+
ocf:heartbeat:oracle
69+
ocf:heartbeat:oralsnr
70+
ocf:heartbeat:osceip
71+
ocf:heartbeat:ovsmonitor
72+
ocf:heartbeat:pgagent
73+
ocf:heartbeat:pgsql
74+
ocf:heartbeat:podman
75+
ocf:heartbeat:portblock
76+
ocf:heartbeat:postfix
77+
ocf:heartbeat:powervs-subnet
78+
ocf:heartbeat:rabbitmq-cluster
79+
ocf:heartbeat:rabbitmq-server-ha
80+
ocf:heartbeat:redis
81+
ocf:heartbeat:rsyncd
82+
ocf:heartbeat:sfex
83+
ocf:heartbeat:sg_persist
84+
ocf:heartbeat:slapd
85+
ocf:heartbeat:storage-mon
86+
ocf:heartbeat:symlink
87+
ocf:heartbeat:tomcat
88+
ocf:suse:aws-vpc-move-ip
89+
ocf:suse:SAPHanaController
90+
ocf:suse:SAPHanaFilesystem
91+
ocf:suse:SAPHanaTopology
92+
stonith:fence_aliyun
93+
stonith:fence_alom
94+
stonith:fence_apc
95+
stonith:fence_apc-snmp
96+
stonith:fence_aws
97+
stonith:fence_azure-arm
98+
stonith:fence_bladecenter
99+
stonith:fence_brocade
100+
stonith:fence_cisco-mds
101+
stonith:fence_cisco-ucs
102+
stonith:fence_compute
103+
stonith:fence_docker
104+
stonith:fence_drac5
105+
stonith:fence_eaton-snmp
106+
stonith:fence_eaton-ssh
107+
stonith:fence_emerson
108+
stonith:fence_eps
109+
stonith:fence_gce
110+
stonith:fence_hds-cb
111+
stonith:fence_hpblade
112+
stonith:fence_ibm-powervs
113+
stonith:fence_ibm-vpc
114+
stonith:fence_ibmblade
115+
stonith:fence_ibmz
116+
stonith:fence_ifmib
117+
stonith:fence_ilo-moonshot
118+
stonith:fence_ilo-mp
119+
stonith:fence_ilo-ssh
120+
stonith:fence_ilo2
121+
stonith:fence_intelmodular
122+
stonith:fence_ipdu
123+
stonith:fence_ipmilan
124+
stonith:fence_ironic
125+
stonith:fence_kdump
126+
stonith:fence_ldom
127+
stonith:fence_lpar
128+
stonith:fence_mpath
129+
stonith:fence_netio
130+
stonith:fence_openstack
131+
stonith:fence_pve
132+
stonith:fence_raritan
133+
stonith:fence_rcd-serial
134+
stonith:fence_redfish
135+
stonith:fence_rhevm
136+
stonith:fence_rsa
137+
stonith:fence_rsb
138+
stonith:fence_sanbox2
139+
stonith:fence_sbd
140+
stonith:fence_scsi
141+
stonith:fence_vbox
142+
stonith:fence_virsh
143+
stonith:fence_vmware
144+
stonith:fence_vmware-rest
145+
stonith:fence_wti
146+
stonith:fence_xenapi
147+
stonith:fence_zvm

0 commit comments

Comments
 (0)