[yast-commit] r64376 - in /trunk/cluster: agents/ag_openais src/Cluster.ycp src/dialogs.ycp
![](https://seccdn.libravatar.org/avatar/c4a3ac0c474902b889dac50833b3160d.jpg?s=120&d=mm&r=g)
Author: xwhu Date: Wed Jun 15 05:26:53 2011 New Revision: 64376 URL: http://svn.opensuse.org/viewcvs/yast?rev=64376&view=rev Log: Add support of corosync unicast mode Modified: trunk/cluster/agents/ag_openais trunk/cluster/src/Cluster.ycp trunk/cluster/src/dialogs.ycp Modified: trunk/cluster/agents/ag_openais URL: http://svn.opensuse.org/viewcvs/yast/trunk/cluster/agents/ag_openais?rev=64376&r1=64375&r2=64376&view=diff ============================================================================== --- trunk/cluster/agents/ag_openais (original) +++ trunk/cluster/agents/ag_openais Wed Jun 15 05:26:53 2011 @@ -90,7 +90,8 @@ "type":"int", "default_value":2000}, "rrp_problem_count_threshhold":{"doc":"The number of times a problem is detected with a link before setting the link faulty.", "type":"int", "default_value":10}, - "rrp_token_expired_timeout":{"doc":"This specifies the time in milliseconds to increment the problem counter for the redundant ring protocol after not having received a token from all rings for a particular processor.", "type":"int", "default_value":47} + "rrp_token_expired_timeout":{"doc":"This specifies the time in milliseconds to increment the problem counter for the redundant ring protocol after not having received a token from all rings for a particular processor.", "type":"int", "default_value":47}, + "transport":{"doc":"", "type":"select[udp,udpu]","default_value":"udp"}, } @@ -118,6 +119,10 @@ "default_value":500}, } +member_option_table = { + "memberaddr":{"doc":"", "default_value":0}, +} + amf_option_table = { "mode":{"doc":"Enable or disable AMF ", "default_value":"disable", "suggested_value":"disable"}, } @@ -243,15 +248,22 @@ def print_totem_options(f): f.write("totem {\n") + transport_protocol = totem_options.get("transport", "udp") for key in totem_options.keys(): if key == "interface": for inf in totem_options["interface"]: f.write("\tinterface {\n") for k in inf.keys(): - if inf[k] == "": + if k == "member": + for m in inf[k]: + if m["memberaddr"] != "": + f.write("\t\tmember {\n") + f.write("\t\t\tmemberaddr:\t%s\n\t\t}\n" % m["memberaddr"]) + elif inf[k] == "": continue; - f.write("\t\t#%s\n\n" % (interface_option_table[k]["doc"])) - f.write("\t\t%s:\t%s\n\n" % (k, inf[k])) + else: + f.write("\t\t#%s\n\n" % (interface_option_table[k]["doc"])) + f.write("\t\t%s:\t%s\n\n" % (k, inf[k])) f.write("\t}\n") continue if totem_options[key] == "": @@ -322,6 +334,10 @@ logs = result.get("logger", []) logs.append(opt_parser(file, logger_option_table)) result["logger"] = logs + elif i.lstrip().split(" ")[0] == "member": + members = result.get("member", []) + members.append(opt_parser(file, member_option_table)) + result["member"] = members else: y2warning("Unknown sub-directive %s found. Ignore it" % (i.lstrip().split(" ")[0])) while (i[-1] != "}"): @@ -434,7 +450,7 @@ return '[]' elif path_arr[0] == 'totem': if len(path_arr) == 1: - return '[ "secauth", "autoid", "threads", "nodeid", "rrpmode", "interface" ]' + return '[ "secauth", "autoid", "threads", "nodeid", "rrpmode", "transport", "interface" ]' else: if path_arr[1] == 'interface': if len(path_arr) == 2: @@ -448,9 +464,9 @@ else: if len(path_arr) == 3: if path_arr[2] == "interface0" and get_interface(0) != None: - return '["bindnetaddr", "mcastaddr", "mcastport"]' + return '["bindnetaddr", "mcastaddr", "mcastport", "member"]' elif path_arr[2] == "interface1" and get_interface(1) != None: - return ' ["bindnetaddr", "mcastaddr", "mcastport"]' + return ' ["bindnetaddr", "mcastaddr", "mcastport", "member"]' else: return '[]' else: @@ -485,6 +501,8 @@ return '"%d"' % totem_options.get("threads", 0) elif path[1] == "rrpmode": return '"%s"' % totem_options.get("rrp_mode", "none") + elif path[1] == "transport": + return '"%s"' % totem_options.get("transport", "udp") else: return "nil" elif len(path) == 4: @@ -500,6 +518,11 @@ return '"%s"' % i.get("mcastaddr", "") elif path[3] == "mcastport": return '"%d"' % i.get("mcastport", 5405) + elif path[3] == "member": + member_str = "" + for member in i.get("member", []): + member_str = member_str + member.get("memberaddr", "") + " " + return '"%s"' % member_str.strip() else: return "nil" elif path[2] == "interface1": @@ -513,6 +536,11 @@ return '"%s"' % i.get("mcastaddr", "") elif path[3] == "mcastport": return '"%d"' % i.get("mcastport", 5405) + elif path[3] == "member": + member_str = "" + for member in i.get("member", []): + member_str = member_str + member.get("memberaddr", "") + " " + return '"%s"' % member_str.strip() else: return "nil" else: @@ -595,6 +623,9 @@ elif path[1] == "rrpmode": totem_options["rrp_mode"] = args return "true" + elif path[1] == "transport": + totem_options["transport"] = args + return "true" else: return "false" elif len(path) == 3: @@ -643,6 +674,12 @@ return "true" except ValueError: return "false" + elif path[3] == "member": + member_addr_set = [] + for member_address in args.strip().split(" "): + member_addr_set.append({"memberaddr":member_address}) + i["member"] = member_addr_set + return "true" else: return "false" else: Modified: trunk/cluster/src/Cluster.ycp URL: http://svn.opensuse.org/viewcvs/yast/trunk/cluster/src/Cluster.ycp?rev=64376&r1=64375&r2=64376&view=diff ============================================================================== --- trunk/cluster/src/Cluster.ycp (original) +++ trunk/cluster/src/Cluster.ycp Wed Jun 15 05:26:53 2011 @@ -153,6 +153,10 @@ global boolean global_startopenais = false; global boolean global_startcsync2 = false; +global string transport = ""; +global list<string> memberaddr1 = []; +global list<string> memberaddr2 = []; + global boolean LoadClusterConfig() { if ((string)(SCR::Read(.openais.pacemaker.use_mgmtd)) == "yes") { @@ -169,20 +173,33 @@ threads = (string)SCR::Read(.openais.totem.threads); + transport = (string)SCR::Read(.openais.totem.transport); + if (transport == nil) transport = "udp"; + list <string> interfaces = (list<string>) SCR::Dir(.openais.totem.interface); foreach (string interface, interfaces, { - if (interface == "interface0") { + if (interface == "interface0") { + if (transport == "udpu") { + memberaddr1 = splitstring((string)SCR::Read(.openais.totem.interface.interface0.member), " "); + } else { + mcastaddr1 = (string)SCR::Read(.openais.totem.interface.interface0.mcastaddr); + } bindnetaddr1 = (string)SCR::Read(.openais.totem.interface.interface0.bindnetaddr); - mcastaddr1 = (string)SCR::Read(.openais.totem.interface.interface0.mcastaddr); mcastport1 = (string)SCR::Read(.openais.totem.interface.interface0.mcastport); + } + + if (interface == "interface1") { + if (transport == "udpu") { + memberaddr2 = splitstring((string)SCR::Read(.openais.totem.interface.interface1.member), " "); + } else { + mcastaddr2 = (string)SCR::Read(.openais.totem.interface.interface1.mcastaddr); } - if (interface == "interface1") { - enable2 = true; bindnetaddr2 = (string)SCR::Read(.openais.totem.interface.interface1.bindnetaddr); - mcastaddr2 = (string)SCR::Read(.openais.totem.interface.interface1.mcastaddr); mcastport2 = (string)SCR::Read(.openais.totem.interface.interface1.mcastport); - } - }); + + enable2 = true; + } + }); string ai = (string)SCR::Read(.openais.totem.autoid); if (ai == "yes") { @@ -218,15 +235,29 @@ SCR::Write(.openais.totem.threads, ""); } + SCR::Write(.openais.totem.transport, transport); + + if (transport == "udpu") { + SCR::Write(.openais.totem.interface.interface0.member, mergestring(memberaddr1, " ")); + SCR::Write(.openais.totem.interface.interface0.mcastaddr, ""); + } else { + SCR::Write(.openais.totem.interface.interface0.mcastaddr, mcastaddr1); + SCR::Write(.openais.totem.interface.interface0.member, ""); + } SCR::Write(.openais.totem.interface.interface0.bindnetaddr, bindnetaddr1); - SCR::Write(.openais.totem.interface.interface0.mcastaddr, mcastaddr1); SCR::Write(.openais.totem.interface.interface0.mcastport, mcastport1); if (enable2 == false) { SCR::Write(.openais.totem.interface.interface1, ""); } else { + if (transport == "udpu") { + SCR::Write(.openais.totem.interface.interface1.member, mergestring(memberaddr2, " ")); + SCR::Write(.openais.totem.interface.interface1.mcastaddr, ""); + } else { + SCR::Write(.openais.totem.interface.interface1.mcastaddr, mcastaddr2); + SCR::Write(.openais.totem.interface.interface1.member, ""); + } SCR::Write(.openais.totem.interface.interface1.bindnetaddr, bindnetaddr2); - SCR::Write(.openais.totem.interface.interface1.mcastaddr, mcastaddr2); SCR::Write(.openais.totem.interface.interface1.mcastport, mcastport2); } Modified: trunk/cluster/src/dialogs.ycp URL: http://svn.opensuse.org/viewcvs/yast/trunk/cluster/src/dialogs.ycp?rev=64376&r1=64375&r2=64376&view=diff ============================================================================== --- trunk/cluster/src/dialogs.ycp (original) +++ trunk/cluster/src/dialogs.ycp Wed Jun 15 05:26:53 2011 @@ -80,21 +80,42 @@ boolean ValidateCommunication () { + integer i = 0; if (IP::Check((string)UI::QueryWidget(`id(`bindnetaddr1), `Value)) == false) { Popup::Message("The Bind Network Address has to be fulfilled"); UI::SetFocus(`bindnetaddr1); return false; } - if (IP::Check((string)UI::QueryWidget(`id(`mcastaddr1), `Value)) == false) { - Popup::Message("The Multicast Address has to be fulfilled"); - UI::SetFocus(`mcastaddr1); - return false; + + if (UI::QueryWidget(`id(`transport), `Value) == "udpu") { + i = 0; + foreach(string value, Cluster::memberaddr1, { + if (IP::Check(value) == false) { + UI::ChangeWidget(`memberaddr1, `CurrentItem, i); + i = 0; + break; + } + i = i + 1; + }); + if (i == 0) { + UI::SetFocus(`memberaddr1); + Popup::Message("The Member Address has to be fulfilled"); + return false; + } + } else { + if (IP::Check((string)UI::QueryWidget(`id(`mcastaddr1), `Value)) == false) { + Popup::Message("The Multicast Address has to be fulfilled"); + UI::SetFocus(`mcastaddr1); + return false; + } } + if (!regexpmatch((string)UI::QueryWidget(`id(`mcastport1), `Value), "^[0-9]+$")) { Popup::Message("The Multicast port must be a positive integer"); UI::SetFocus(`id(`mcastport1)); return false; } + if (UI::QueryWidget(`id(`autoid), `Value) == false) { string noid = (string)UI::QueryWidget(`id(`nodeid), `Value); boolean s = regexpmatch(noid, "^[0-9]+$"); @@ -110,23 +131,44 @@ return false; } } + if (UI::QueryWidget(`id(`enable2), `Value) == true) { if (IP::Check((string)UI::QueryWidget(`id(`bindnetaddr2), `Value)) == false) { Popup::Message("The Bind Network Address has to be fulfilled"); UI::SetFocus(`bindnetaddr2); return false; } - if (IP::Check((string)UI::QueryWidget(`id(`mcastaddr2), `Value)) == false) { - Popup::Message("The Multicast Address has to be fulfilled"); - UI::SetFocus(`mcastaddr2); - return false; + + if (UI::QueryWidget(`id(`transport), `Value) == "udpu") { + i = 0; + foreach(string value, Cluster::memberaddr2, { + if (IP::Check(value) == false) { + UI::ChangeWidget(`memberaddr2, `CurrentItem, i); + i = 0; + break; + } + i = i + 1; + }); + if (i == 0) { + UI::SetFocus(`memberaddr2); + Popup::Message("The Member Address has to be fulfilled"); + return false; + } + } else { + if (IP::Check((string)UI::QueryWidget(`id(`mcastaddr2), `Value)) == false) { + Popup::Message("The Multicast Address has to be fulfilled"); + UI::SetFocus(`mcastaddr2); + return false; + } } + if (!regexpmatch((string)UI::QueryWidget(`id(`mcastport2), `Value), "^[0-9]+$")) { Popup::Message("The Multicast port must be a positive integer"); UI::SetFocus(`id(`mcastport2)); return false; } } + return true; } @@ -167,6 +209,7 @@ Cluster::autoid = (boolean)UI::QueryWidget(`id(`autoid), `Value); Cluster::nodeid = (string)UI::QueryWidget(`id(`nodeid), `Value); Cluster::rrpmode = (string)UI::QueryWidget(`id(`rrpmode), `Value); + Cluster::transport = (string)UI::QueryWidget(`id(`transport), `Value); } @@ -180,8 +223,28 @@ } -any CommunicationDialog () { - any ret = nil; +void transport_switch() { + boolean udp = (string)UI::QueryWidget(`id(`transport), `Value) == "udp"; + boolean enable2 = (boolean)UI::QueryWidget(`id(`enable2), `Value); + + boolean enable1 = udp; + enable2 = udp && enable2; + + UI::ChangeWidget(`id(`mcastaddr1), `Enabled, enable1); + UI::ChangeWidget(`id(`memberaddr1), `Enabled, !enable1); + UI::ChangeWidget(`id(`memberaddr1_add), `Enabled, !enable1); + UI::ChangeWidget(`id(`memberaddr1_del), `Enabled, !enable1); + UI::ChangeWidget(`id(`memberaddr1_edit), `Enabled, !enable1); + + UI::ChangeWidget(`id(`mcastaddr2), `Enabled, enable2); + UI::ChangeWidget(`id(`memberaddr2), `Enabled, !enable2); + UI::ChangeWidget(`id(`memberaddr2_add), `Enabled, !enable2); + UI::ChangeWidget(`id(`memberaddr2_del), `Enabled, !enable2); + UI::ChangeWidget(`id(`memberaddr2_edit), `Enabled, !enable2); +} + + +any CommunicationLayout() { map result = $[]; result = (map)SCR::Execute(.target.bash_output, "/sbin/ip addr show scope global | grep inet | awk '{print $2}' | awk -F'/' '{print $1, $2}'"); @@ -201,36 +264,52 @@ }); } - term iface = `Frame ( _("Channel"), + term transport = `ComboBox(`id(`transport), `opt(`hstretch, `notify), _("Transport:"), ["udp", "udpu"]); + + term iface = `Frame( _("Channel"), `VBox( - `ComboBox(`id(`bindnetaddr1), `opt(`editable, `hstretch, `notify), "Bind Network Address:", toset(existing_ips)), + `ComboBox(`id(`bindnetaddr1), `opt(`editable, `hstretch, `notify), _("Bind Network Address:"), toset(existing_ips)), + `InputField(`id(`mcastaddr1), `opt(`hstretch, `notify), _("Multicast Address:")), + `InputField(`id(`mcastport1), `opt(`hstretch), _("Multicast Port:")), + `Left(`Label(_("Member Address:"))), + `SelectionBox(`id(`memberaddr1), ""), `HBox( - `InputField(`id(`mcastaddr1), `opt(`hstretch, `notify), "Multicast Address:"), - `InputField(`id(`mcastport1), `opt(`hstretch), "Multicast Port:") + `PushButton(`id(`memberaddr1_add), "Add"), + `PushButton(`id(`memberaddr1_del), "Del"), + `PushButton(`id(`memberaddr1_edit), "Edit") ) ) ); - term riface = `CheckBoxFrame (`id(`enable2), `opt(`notify), _("Redundant Channel"), false, + term riface = `CheckBoxFrame(`id(`enable2), `opt(`notify), _("Redundant Channel"), false, `VBox( `ComboBox(`id(`bindnetaddr2), `opt(`editable, `hstretch, `notify), "Bind Network Address:", existing_ips), + `InputField(`id(`mcastaddr2), `opt(`hstretch), "Multicast Address:"), + `InputField(`id(`mcastport2), `opt(`hstretch), "Multicast Port:"), + `Left(`Label(_("Member Address:"))), + `SelectionBox(`id(`memberaddr2), ""), `HBox( - `InputField(`id(`mcastaddr2), `opt(`hstretch), "Multicast Address:"), - `InputField(`id(`mcastport2), `opt(`hstretch), "Multicast Port:") + `PushButton(`id(`memberaddr2_add), "Add"), + `PushButton(`id(`memberaddr2_del), "Del"), + `PushButton(`id(`memberaddr2_edit), "Edit") ) ) ); - term nid = `Frame (`id(`nid), _("Node ID"), - `VBox( - `Left(`CheckBox(`id(`autoid), `opt(`notify), "Auto Generate Node ID", true)), - `InputField(`id(`nodeid), `opt(`hstretch), "Node ID:") - ) + term nid = `VBox( + `InputField(`id(`nodeid), `opt(`hstretch), "Node ID:"), + `Left(`CheckBox(`id(`autoid), `opt(`notify), "Auto Generate Node ID", true)) ); term rrpm = `ComboBox(`id(`rrpmode), `opt(`hstretch), "rrp mode:", ["none", "active", "passive"]); - term contents = `VBox (iface, `VSpacing(1), riface, `VSpacing(1), nid, `VSpacing(1), rrpm, `VStretch()); + term contents = `VBox( + transport, + `HBox( + `VBox(iface, nid), + `VBox(riface, rrpm, `VSpacing(1)) + ) + ); my_SetContents("communication", contents); @@ -244,6 +323,7 @@ UI::ChangeWidget(`id(`autoid), `Value, Cluster::autoid); UI::ChangeWidget(`id(`nodeid), `Value, Cluster::nodeid); + UI::ChangeWidget(`id(`transport), `Value, Cluster::transport); UI::ChangeWidget(`id(`rrpmode), `Value, Cluster::rrpmode); @@ -251,7 +331,54 @@ UI::ChangeWidget(`id(`nodeid), `Enabled, false); } + transport_switch(); +} + + +void fill_memberaddr_entries() +{ + integer i = 0; + integer ret = 0; + integer current = 0; + list<term> items = []; + + // remove duplicated elements + Cluster::memberaddr1 = Cluster::memberaddr1 + []; + Cluster::memberaddr2 = Cluster::memberaddr2 + []; + + i = 0; + items = []; + foreach(string value, Cluster::memberaddr1, { + items = add(items, `item(`id(i), value)); + i = i + 1; + }); + current = (integer)UI::QueryWidget(`memberaddr1, `CurrentItem); + if (current == nil) current = 0; + if (current >= i) current = i - 1; + UI::ChangeWidget(`memberaddr1, `Items, items); + UI::ChangeWidget(`memberaddr1, `CurrentItem, current); + + i = 0; + items = []; + foreach(string value, Cluster::memberaddr2, { + items = add(items, `item(`id(i), value)); + i = i + 1; + }); + current = (integer)UI::QueryWidget(`memberaddr2, `CurrentItem); + if (current == nil) current = 0; + if (current >= i) current = i - 1; + UI::ChangeWidget(`memberaddr2, `Items, items); + UI::ChangeWidget(`memberaddr2, `CurrentItem, current); +} + +any CommunicationDialog() { + any ret = nil; + + CommunicationLayout(); + while (true) { + fill_memberaddr_entries(); + transport_switch(); ret = UI::UserInput(); @@ -273,14 +400,59 @@ UI::ChangeWidget(`id(`nodeid), `Enabled, (true != UI::QueryWidget(`id(`autoid), `Value))); continue; } + if (ret == `enable2) { - if ( true == UI::QueryWidget(`id(`enable2), `Value)) { + if (true == UI::QueryWidget(`id(`enable2), `Value)) { UI::ChangeWidget(`id(`rrpmode), `Value , "passive"); } else { UI::ChangeWidget(`id(`rrpmode), `Value , "none"); } } + if (ret == `memberaddr1_add) { + ret = text_input_dialog(_("Enter a member address"), ""); + if (ret == `cancel) continue; + Cluster::memberaddr1 = add(Cluster::memberaddr1, (string)ret); + } + + if (ret == `memberaddr1_edit) { + integer current = 0; + string str = ""; + + current = (integer)UI::QueryWidget(`memberaddr1, `CurrentItem); + ret = text_input_dialog(_("Edit the member address"), Cluster::memberaddr1[current]:""); + if (ret == `cancel) continue; + Cluster::memberaddr1[current] = (string)ret; + } + + if (ret == `memberaddr1_del) { + integer current = 0; + current = (integer)UI::QueryWidget(`memberaddr1, `CurrentItem); + Cluster::memberaddr1= remove(Cluster::memberaddr1, current); + } + + if (ret == `memberaddr2_add) { + ret = text_input_dialog(_("Enter a member address"), ""); + if (ret == `cancel) continue; + Cluster::memberaddr2 = add(Cluster::memberaddr2, (string)ret); + } + + if (ret == `memberaddr2_edit) { + integer current = 0; + string str = ""; + + current = (integer)UI::QueryWidget(`memberaddr2, `CurrentItem); + ret = text_input_dialog(_("Edit the member address"), Cluster::memberaddr2[current]:""); + if (ret == `cancel) continue; + Cluster::memberaddr2[current] = (string)ret; + } + + if (ret == `memberaddr2_del) { + integer current = 0; + current = (integer)UI::QueryWidget(`memberaddr2, `CurrentItem); + Cluster::memberaddr2= remove(Cluster::memberaddr2, current); + } + if (ret == `next || ret == `back) { boolean val = ValidateCommunication(); if (val == true) { -- To unsubscribe, e-mail: yast-commit+unsubscribe@opensuse.org For additional commands, e-mail: yast-commit+help@opensuse.org
participants (1)
-
xwhu@svn2.opensuse.org