def test_comment(self): string= """\ # junk1 name1: value1 #junk2 name2: value2#junk3 name3: value3 #junk4 name4 # junk5: value4 #junk6 name5: value5 #junk7 """ parsed = """\ name1: value1 name2: value2#junk3 name3: value3 #junk4 name4 # junk5: value4 """ ac(str(corosync_conf.parse_string(string)), parsed) string= """\ # junk1 section1 { # junk2 } section2 # junk2 { } section3 { } #junk3 """ parsed = """\ section1 { } section2 # junk2 { } section3 { } """ ac(str(corosync_conf.parse_string(string)), parsed) string = """\ section { #} """ self.assertRaises( corosync_conf.ParseErrorException, corosync_conf.parse_string, string ) string = """\ #section { } """ self.assertRaises( corosync_conf.ParseErrorException, corosync_conf.parse_string, string )
def test_attributes(self): string = """\ name:value\ """ parsed = """\ name: value """ ac(str(corosync_conf.parse_string(string)), parsed) string = """\ name:value name:value """ parsed = """\ name: value name: value """ ac(str(corosync_conf.parse_string(string)), parsed) string = """\ name1:value1 name2 :value2 name3: value3 name4 : value4 """ parsed = """\ name1: value1 name2: value2 name3: value3 name4: value4 """ ac(str(corosync_conf.parse_string(string)), parsed) string = """\ name:foo:value """ parsed = """\ name: foo:value """ root = corosync_conf.parse_string(string) self.assertEqual(root.get_attributes(), [["name", "foo:value"]]) ac(str(root), parsed) string = """\ name : """ parsed = """\ name: """ root = corosync_conf.parse_string(string) self.assertEqual(root.get_attributes(), [["name", ""]]) ac(str(root), parsed)
def test_full(self): string = """\ # Please read the corosync.conf.5 manual page totem { version: 2 # crypto_cipher and crypto_hash: Used for mutual node authentication. # If you choose to enable this, then do remember to create a shared # secret with "corosync-keygen". # enabling crypto_cipher, requires also enabling of crypto_hash. crypto_cipher: none crypto_hash: none # interface: define at least one interface to communicate # over. If you define more than one interface stanza, you must # also set rrp_mode. interface { # Rings must be consecutively numbered, starting at 0. ringnumber: 0 # This is normally the *network* address of the # interface to bind to. This ensures that you can use # identical instances of this configuration file # across all your cluster nodes, without having to # modify this option. bindnetaddr: 192.168.1.0 # However, if you have multiple physical network # interfaces configured for the same subnet, then the # network address alone is not sufficient to identify # the interface Corosync should bind to. In that case, # configure the *host* address of the interface # instead: # bindnetaddr: 192.168.1.1 # When selecting a multicast address, consider RFC # 2365 (which, among other things, specifies that # 239.255.x.x addresses are left to the discretion of # the network administrator). Do not reuse multicast # addresses across multiple Corosync clusters sharing # the same network. mcastaddr: 239.255.1.1 # Corosync uses the port you specify here for UDP # messaging, and also the immediately preceding # port. Thus if you set this to 5405, Corosync sends # messages over UDP ports 5405 and 5404. mcastport: 5405 # Time-to-live for cluster communication packets. The # number of hops (routers) that this ring will allow # itself to pass. Note that multicast routing must be # specifically enabled on most network routers. ttl: 1 } } logging { # Log the source file and line where messages are being # generated. When in doubt, leave off. Potentially useful for # debugging. fileline: off # Log to standard error. When in doubt, set to no. Useful when # running in the foreground (when invoking "corosync -f") to_stderr: no # Log to a log file. When set to "no", the "logfile" option # must not be set. to_logfile: yes logfile: /var/log/cluster/corosync.log # Log to the system log daemon. When in doubt, set to yes. to_syslog: yes # Log debug messages (very verbose). When in doubt, leave off. debug: off # Log messages with time stamps. When in doubt, set to on # (unless you are only logging to syslog, where double # timestamps can be annoying). timestamp: on logger_subsys { subsys: QUORUM debug: off } } quorum { # Enable and configure quorum subsystem (default: off) # see also corosync.conf.5 and votequorum.5 #provider: corosync_votequorum } """ parsed = """\ totem { version: 2 crypto_cipher: none crypto_hash: none interface { ringnumber: 0 bindnetaddr: 192.168.1.0 mcastaddr: 239.255.1.1 mcastport: 5405 ttl: 1 } } logging { fileline: off to_stderr: no to_logfile: yes logfile: /var/log/cluster/corosync.log to_syslog: yes debug: off timestamp: on logger_subsys { subsys: QUORUM debug: off } } quorum { } """ ac(str(corosync_conf.parse_string(string)), parsed) string = """\ # Please read the corosync.conf.5 manual page totem { version: 2 crypto_cipher: none crypto_hash: none interface { ringnumber: 0 bindnetaddr: 10.16.35.0 mcastport: 5405 ttl: 1 } transport: udpu } logging { fileline: off to_logfile: yes to_syslog: yes logfile: /var/log/cluster/corosync.log debug: off timestamp: on logger_subsys { subsys: QUORUM debug: off } } nodelist { node { ring0_addr: 10.16.35.101 nodeid: 1 } node { ring0_addr: 10.16.35.102 nodeid: 2 } node { ring0_addr: 10.16.35.103 } node { ring0_addr: 10.16.35.104 } node { ring0_addr: 10.16.35.105 } } quorum { # Enable and configure quorum subsystem (default: off) # see also corosync.conf.5 and votequorum.5 #provider: corosync_votequorum } """ parsed = """\ totem { version: 2 crypto_cipher: none crypto_hash: none transport: udpu interface { ringnumber: 0 bindnetaddr: 10.16.35.0 mcastport: 5405 ttl: 1 } } logging { fileline: off to_logfile: yes to_syslog: yes logfile: /var/log/cluster/corosync.log debug: off timestamp: on logger_subsys { subsys: QUORUM debug: off } } nodelist { node { ring0_addr: 10.16.35.101 nodeid: 1 } node { ring0_addr: 10.16.35.102 nodeid: 2 } node { ring0_addr: 10.16.35.103 } node { ring0_addr: 10.16.35.104 } node { ring0_addr: 10.16.35.105 } } quorum { } """ ac(str(corosync_conf.parse_string(string)), parsed)
def test_section(self): string = """\ section1 { }\ """ parsed = """\ section1 { } """ ac(str(corosync_conf.parse_string(string)), parsed) string = """\ section1 { section1a { } section1b { } } """ parsed = """\ section1 { section1a { } section1b { } } """ ac(str(corosync_conf.parse_string(string)), parsed) string = """\ section1 { section1a junk1 { junk2 junk3 } junk4 section1b junk5{junk6 junk7}junk8 } section2 { section2a { } section2b { } } """ parsed = """\ section1 { section1a junk1 { } section1b junk5 { } } section2 { section2a { } section2b { } } """ ac(str(corosync_conf.parse_string(string)), parsed) string = """\ section1 { section1a { } section1b { } } } """ self.assertRaises( corosync_conf.ParseErrorException, corosync_conf.parse_string, string ) string = """\ section1 { section1a { section1b { } } """ self.assertRaises( corosync_conf.ParseErrorException, corosync_conf.parse_string, string ) string = """\ section1 { """ self.assertRaises( corosync_conf.ParseErrorException, corosync_conf.parse_string, string ) string = """\ } """ self.assertRaises( corosync_conf.ParseErrorException, corosync_conf.parse_string, string )
def test_empty(self): ac(str(corosync_conf.parse_string("")), "")