Hello community, here is the log from the commit of package fence-agents for openSUSE:Factory checked in at 2018-08-15 10:33:09 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/fence-agents (Old) and /work/SRC/openSUSE:Factory/.fence-agents.new (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "fence-agents" Wed Aug 15 10:33:09 2018 rev:43 rq:628434 version:4.2.1+git.1532964592.3ae5b58e Changes: -------- --- /work/SRC/openSUSE:Factory/fence-agents/fence-agents.changes 2018-06-28 15:13:23.311596238 +0200 +++ /work/SRC/openSUSE:Factory/.fence-agents.new/fence-agents.changes 2018-08-15 10:33:14.411729885 +0200 @@ -1,0 +2,14 @@ +Thu Aug 09 13:25:09 UTC 2018 - [email protected] + +- Update to version 4.2.1+git.1532964592.3ae5b58e: + * fence_aliyun: Add Aliyun fence agent. (fate#326557) + * fence_gce: add power cycle as default method + * fence_gce: set project and zone as not required + * fence_gce: add support for stackdriver logging + * fence_ilo3/fence_ipmilan: show correct default method (onoff) in help + * fence_mpath: add watchdog support + * fence_amt_ws: create metadata without agent specific libs +- Drop obsolete patch: + * Remove 0002-Build-without-openwsman-installed.patch + +------------------------------------------------------------------- Old: ---- 0002-Build-without-openwsman-installed.patch fence-agents-4.2.1+git.1529316875.1a39345b.tar.xz New: ---- fence-agents-4.2.1+git.1532964592.3ae5b58e.tar.xz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ fence-agents.spec ++++++ --- /var/tmp/diff_new_pack.WkOY5P/_old 2018-08-15 10:33:15.179731273 +0200 +++ /var/tmp/diff_new_pack.WkOY5P/_new 2018-08-15 10:33:15.179731273 +0200 @@ -29,12 +29,11 @@ Summary: Fence Agents for High Availability License: GPL-2.0-only AND LGPL-2.1-only Group: Productivity/Clustering/HA -Version: 4.2.1+git.1529316875.1a39345b +Version: 4.2.1+git.1532964592.3ae5b58e Release: 0 Url: https://github.com/ClusterLabs/fence-agents Source0: %{name}-%{version}.tar.xz Patch1: 0001-Use-Python-3-for-all-scripts-bsc-1065966.patch -Patch2: 0002-Build-without-openwsman-installed.patch BuildRoot: %{_tmppath}/%{name}-%{version}-build BuildRequires: %{python_version} @@ -126,8 +125,6 @@ %setup -q -n %{name}-%{version} %if %{python_version} == "python3" %patch1 -p1 -%else -%patch2 -p1 %endif %build ++++++ _servicedata ++++++ --- /var/tmp/diff_new_pack.WkOY5P/_old 2018-08-15 10:33:15.223731353 +0200 +++ /var/tmp/diff_new_pack.WkOY5P/_new 2018-08-15 10:33:15.223731353 +0200 @@ -1,4 +1,4 @@ <servicedata> <service name="tar_scm"> <param name="url">git://github.com/ClusterLabs/fence-agents.git</param> - <param name="changesrevision">9b763accb5c4c4a1cf60a19592a4033bcedec500</param></service></servicedata> \ No newline at end of file + <param name="changesrevision">790cbaa66f3927a84739af4a1f0e8bba295cdc36</param></service></servicedata> \ No newline at end of file ++++++ fence-agents-4.2.1+git.1529316875.1a39345b.tar.xz -> fence-agents-4.2.1+git.1532964592.3ae5b58e.tar.xz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fence-agents-4.2.1+git.1529316875.1a39345b/agents/Makefile.am new/fence-agents-4.2.1+git.1532964592.3ae5b58e/agents/Makefile.am --- old/fence-agents-4.2.1+git.1529316875.1a39345b/agents/Makefile.am 2018-06-18 12:14:35.000000000 +0200 +++ new/fence-agents-4.2.1+git.1532964592.3ae5b58e/agents/Makefile.am 2018-07-30 17:29:52.000000000 +0200 @@ -50,6 +50,11 @@ zvm_fence_zvm_CFLAGS = -D_GNU_SOURCE -Izvm endif +if BUILD_FENCE_MPATH +mpathdatadir = $(CLUSTERDATA) +mpathdata_SCRIPTS = mpath/fence_mpath_check mpath/fence_mpath_check_hardreboot +endif + if BUILD_FENCE_SCSI scsidatadir = $(CLUSTERDATA) scsidata_SCRIPTS = scsi/fence_scsi_check scsi/fence_scsi_check_hardreboot @@ -72,6 +77,12 @@ -e 's#@clustervarrun@#${CLUSTERVARRUN}#g' \ > $@ +mpath/fence_mpath_check: mpath/fence_mpath + cp $^ $@ + +mpath/fence_mpath_check_hardreboot: mpath/fence_mpath + cp $^ $@ + scsi/fence_scsi_check: scsi/fence_scsi cp $^ $@ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fence-agents-4.2.1+git.1529316875.1a39345b/agents/aliyun/fence_aliyun.py new/fence-agents-4.2.1+git.1532964592.3ae5b58e/agents/aliyun/fence_aliyun.py --- old/fence-agents-4.2.1+git.1529316875.1a39345b/agents/aliyun/fence_aliyun.py 1970-01-01 01:00:00.000000000 +0100 +++ new/fence-agents-4.2.1+git.1532964592.3ae5b58e/agents/aliyun/fence_aliyun.py 2018-07-30 17:29:52.000000000 +0200 @@ -0,0 +1,157 @@ +#!@PYTHON@ -tt + +import sys, re +import logging +import atexit +import json +sys.path.append("@FENCEAGENTSLIBDIR@") +from fencing import * +from fencing import fail, fail_usage, EC_TIMED_OUT, run_delay + +try: + from aliyunsdkcore import client + + from aliyunsdkecs.request.v20140526.DescribeInstancesRequest import DescribeInstancesRequest + from aliyunsdkecs.request.v20140526.StartInstanceRequest import StartInstanceRequest + from aliyunsdkecs.request.v20140526.StopInstanceRequest import StopInstanceRequest + from aliyunsdkecs.request.v20140526.RebootInstanceRequest import RebootInstanceRequest +except ImportError: + pass + +def _send_request(conn, request): + request.set_accept_format('json') + try: + response_str = conn.do_action_with_exception(request) + response_detail = json.loads(response_str) + logging.debug("_send_request reponse: %s" % response_detail) + return response_detail + except Exception as e: + fail_usage("Failed: _send_request failed: %s" % e) + +def start_instance(conn, instance_id): + request = StartInstanceRequest() + request.set_InstanceId(instance_id) + _send_request(conn, request) + +def stop_instance(conn, instance_id): + request = StopInstanceRequest() + request.set_InstanceId(instance_id) + request.set_ForceStop('true') + _send_request(conn, request) + +def reboot_instance(conn, instance_id): + request = RebootInstanceRequest() + request.set_InstanceId(instance_id) + request.set_ForceStop('true') + _send_request(conn, request) + +def get_status(conn, instance_id): + request = DescribeInstancesRequest() + request.set_InstanceIds(json.dumps([instance_id])) + response = _send_request(conn, request) + instance_status = None + if response is not None: + instance_list = response.get('Instances').get('Instance') + for item in instance_list: + instance_status = item.get('Status') + return instance_status + +def get_nodes_list(conn, options): + result = {} + request = DescribeInstancesRequest() + response = _send_request(conn, request) + instance_status = None + if response is not None: + instance_list = response.get('Instances').get('Instance') + for item in instance_list: + instance_id = item.get('InstanceId') + result[instance_id] = ("", None) + return result + +def get_power_status(conn, options): + state = get_status(conn, options["--plug"]) + + if state == "Running": + status = "on" + elif state == "Stopped": + status = "off" + else: + status = "unknown" + + logging.info("get_power_status: %s" % status) + + return status + + +def set_power_status(conn, options): + logging.info("set_power_status: %s" % options["--action"]) + + if (options["--action"]=="off"): + stop_instance(conn, options["--plug"]) + elif (options["--action"]=="on"): + start_instance(conn, options["--plug"]) + elif (options["--action"]=="reboot"): + reboot_instance(conn, options["--plug"]) + + +def define_new_opts(): + all_opt["region"] = { + "getopt" : "r:", + "longopt" : "region", + "help" : "-r, --region=[name] Region, e.g. cn-hangzhou", + "shortdesc" : "Region.", + "required" : "0", + "order" : 2 + } + all_opt["access_key"] = { + "getopt" : "a:", + "longopt" : "access-key", + "help" : "-a, --access-key=[name] Access Key", + "shortdesc" : "Access Key.", + "required" : "0", + "order" : 3 + } + all_opt["secret_key"] = { + "getopt" : "s:", + "longopt" : "secret-key", + "help" : "-s, --secret-key=[name] Secret Key", + "shortdesc" : "Secret Key.", + "required" : "0", + "order" : 4 + } + +# Main agent method +def main(): + conn = None + + device_opt = ["port", "no_password", "region", "access_key", "secret_key"] + + atexit.register(atexit_handler) + + define_new_opts() + + all_opt["power_timeout"]["default"] = "60" + + options = check_input(device_opt, process_input(device_opt)) + + docs = {} + docs["shortdesc"] = "Fence agent for Aliyun (Aliyun Web Services)" + docs["longdesc"] = "fence_aliyun is an I/O Fencing agent for Aliyun" + docs["vendorurl"] = "http://www.aliyun.com" + show_docs(options, docs) + + run_delay(options) + + if "--region" in options and "--access-key" in options and "--secret-key" in options: + region = options["--region"] + access_key = options["--access-key"] + secret_key = options["--secret-key"] + conn = client.AcsClient(access_key, secret_key, region) + + + # Operate the fencing device + result = fence_action(conn, options, set_power_status, get_power_status, get_nodes_list) + sys.exit(result) + +if __name__ == "__main__": + main() diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fence-agents-4.2.1+git.1529316875.1a39345b/agents/amt_ws/fence_amt_ws.py new/fence-agents-4.2.1+git.1532964592.3ae5b58e/agents/amt_ws/fence_amt_ws.py --- old/fence-agents-4.2.1+git.1529316875.1a39345b/agents/amt_ws/fence_amt_ws.py 2018-06-18 12:14:35.000000000 +0200 +++ new/fence-agents-4.2.1+git.1532964592.3ae5b58e/agents/amt_ws/fence_amt_ws.py 2018-07-30 17:29:52.000000000 +0200 @@ -24,9 +24,13 @@ from fencing import * from fencing import run_delay, fail_usage, fail, EC_STATUS -import pywsman from xml.etree import ElementTree +try: + import pywsman +except ImportError: + pass + POWER_ON='2' POWER_OFF='8' POWER_CYCLE='10' diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fence-agents-4.2.1+git.1529316875.1a39345b/agents/gce/fence_gce.py new/fence-agents-4.2.1+git.1532964592.3ae5b58e/agents/gce/fence_gce.py --- old/fence-agents-4.2.1+git.1529316875.1a39345b/agents/gce/fence_gce.py 2018-06-18 12:14:35.000000000 +0200 +++ new/fence-agents-4.2.1+git.1532964592.3ae5b58e/agents/gce/fence_gce.py 2018-07-30 17:29:52.000000000 +0200 @@ -1,12 +1,28 @@ #!@PYTHON@ -tt import atexit +import logging +import os import sys +import time +if sys.version_info >= (3, 0): + # Python 3 imports. + import urllib.parse as urlparse + import urllib.request as urlrequest +else: + # Python 2 imports. + import urllib as urlparse + import urllib2 as urlrequest sys.path.append("@FENCEAGENTSLIBDIR@") import googleapiclient.discovery from fencing import fail_usage, run_delay, all_opt, atexit_handler, check_input, process_input, show_docs, fence_action + +METADATA_SERVER = 'http://metadata.google.internal/computeMetadata/v1/' +METADATA_HEADERS = {'Metadata-Flavor': 'Google'} + + def translate_status(instance_status): "Returns on | off | unknown." if instance_status == "RUNNING": @@ -27,6 +43,7 @@ return result + def get_power_status(conn, options): try: instance = conn.instances().get( @@ -38,29 +55,107 @@ fail_usage("Failed: get_power_status: {}".format(str(err))) +def wait_for_operation(conn, project, zone, operation): + while True: + result = conn.zoneOperations().get( + project=project, + zone=zone, + operation=operation['name']).execute() + if result['status'] == 'DONE': + if 'error' in result: + raise Exception(result['error']) + return + time.sleep(1) + + def set_power_status(conn, options): try: if options["--action"] == "off": - conn.instances().stop( + logging.info("Issuing poweroff of %s in zone %s" % (options["--plug"], options["--zone"])) + operation = conn.instances().stop( project=options["--project"], zone=options["--zone"], instance=options["--plug"]).execute() + wait_for_operation(conn, options["--project"], options["--zone"], operation) + logging.info("Poweroff of %s in zone %s complete" % (options["--plug"], options["--zone"])) elif options["--action"] == "on": - conn.instances().start( + logging.info("Issuing poweron of %s in zone %s" % (options["--plug"], options["--zone"])) + operation = conn.instances().start( project=options["--project"], zone=options["--zone"], instance=options["--plug"]).execute() + wait_for_operation(conn, options["--project"], options["--zone"], operation) + logging.info("Poweron of %s in zone %s complete" % (options["--plug"], options["--zone"])) except Exception as err: fail_usage("Failed: set_power_status: {}".format(str(err))) +def power_cycle(conn, options): + try: + logging.info('Issuing reset of %s in zone %s' % (options["--plug"], options["--zone"])) + operation = conn.instances().reset( + project=options["--project"], + zone=options["--zone"], + instance=options["--plug"]).execute() + wait_for_operation(conn, options["--project"], options["--zone"], operation) + logging.info('Reset of %s in zone %s complete' % (options["--plug"], options["--zone"])) + return True + except Exception as err: + logging.error("Failed: power_cycle: {}".format(str(err))) + return False + + +def get_instance(conn, project, zone, instance): + request = conn.instances().get( + project=project, zone=zone, instance=instance) + return request.execute() + + +def get_zone(conn, project, instance): + fl = 'name="%s"' % instance + request = conn.instances().aggregatedList(project=project, filter=fl) + while request is not None: + response = request.execute() + zones = response.get('items', {}) + for zone in zones.values(): + for inst in zone.get('instances', []): + if inst['name'] == instance: + return inst['zone'].split("/")[-1] + request = conn.instances().aggregatedList_next( + previous_request=request, previous_response=response) + raise Exception("Unable to find instance %s" % (instance)) + + +def get_metadata(metadata_key, params=None, timeout=None): + """Performs a GET request with the metadata headers. + + Args: + metadata_key: string, the metadata to perform a GET request on. + params: dictionary, the query parameters in the GET request. + timeout: int, timeout in seconds for metadata requests. + + Returns: + HTTP response from the GET request. + + Raises: + urlerror.HTTPError: raises when the GET request fails. + """ + timeout = timeout or 60 + metadata_url = os.path.join(METADATA_SERVER, metadata_key) + params = urlparse.urlencode(params or {}) + url = '%s?%s' % (metadata_url, params) + request = urlrequest.Request(url, headers=METADATA_HEADERS) + request_opener = urlrequest.build_opener(urlrequest.ProxyHandler({})) + return request_opener.open(request, timeout=timeout * 1.1).read() + + def define_new_opts(): all_opt["zone"] = { "getopt" : ":", "longopt" : "zone", "help" : "--zone=[name] Zone, e.g. us-central1-b", "shortdesc" : "Zone.", - "required" : "1", + "required" : "0", "order" : 2 } all_opt["project"] = { @@ -68,20 +163,32 @@ "longopt" : "project", "help" : "--project=[name] Project ID", "shortdesc" : "Project ID.", - "required" : "1", + "required" : "0", "order" : 3 } + all_opt["stackdriver-logging"] = { + "getopt" : "", + "longopt" : "stackdriver-logging", + "help" : "--stackdriver-logging Enable Logging to Stackdriver", + "shortdesc" : "Stackdriver-logging support.", + "longdesc" : "If enabled IP failover logs will be posted to stackdriver logging.", + "required" : "0", + "order" : 4 + } + def main(): conn = None - device_opt = ["port", "no_password", "zone", "project"] + device_opt = ["port", "no_password", "zone", "project", "stackdriver-logging", "method"] atexit.register(atexit_handler) define_new_opts() all_opt["power_timeout"]["default"] = "60" + all_opt["method"]["default"] = "cycle" + all_opt["method"]["help"] = "-m, --method=[method] Method to fence (onoff|cycle) (Default: cycle)" options = check_input(device_opt, process_input(device_opt)) @@ -97,6 +204,27 @@ run_delay(options) + # Prepare logging + if options.get('--verbose') is None: + logging.getLogger('googleapiclient').setLevel(logging.ERROR) + logging.getLogger('oauth2client').setLevel(logging.ERROR) + if options.get('--stackdriver-logging') is not None and options.get('--plug'): + try: + import google.cloud.logging.handlers + client = google.cloud.logging.Client() + handler = google.cloud.logging.handlers.CloudLoggingHandler(client, name=options['--plug']) + handler.setLevel(logging.INFO) + formatter = logging.Formatter('gcp:stonith "%(message)s"') + handler.setFormatter(formatter) + root_logger = logging.getLogger() + if options.get('--verbose') is None: + root_logger.setLevel(logging.INFO) + root_logger.addHandler(handler) + except ImportError: + logging.error('Couldn\'t import google.cloud.logging, ' + 'disabling Stackdriver-logging support') + + # Prepare cli try: credentials = None if tuple(googleapiclient.__version__) < tuple("1.6.0"): @@ -106,8 +234,21 @@ except Exception as err: fail_usage("Failed: Create GCE compute v1 connection: {}".format(str(err))) + # Get project and zone + if not options.get("--project"): + try: + options["--project"] = get_metadata('project/project-id') + except Exception as err: + fail_usage("Failed retrieving GCE project. Please provide --project option: {}".format(str(err))) + + if not options.get("--zone"): + try: + options["--zone"] = get_zone(conn, options['--project'], options['--plug']) + except Exception as err: + fail_usage("Failed retrieving GCE zone. Please provide --zone option: {}".format(str(err))) + # Operate the fencing device - result = fence_action(conn, options, set_power_status, get_power_status, get_nodes_list) + result = fence_action(conn, options, set_power_status, get_power_status, get_nodes_list, power_cycle) sys.exit(result) if __name__ == "__main__": diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fence-agents-4.2.1+git.1529316875.1a39345b/agents/ipmilan/fence_ipmilan.py new/fence-agents-4.2.1+git.1532964592.3ae5b58e/agents/ipmilan/fence_ipmilan.py --- old/fence-agents-4.2.1+git.1529316875.1a39345b/agents/ipmilan/fence_ipmilan.py 2018-06-18 12:14:35.000000000 +0200 +++ new/fence-agents-4.2.1+git.1532964592.3ae5b58e/agents/ipmilan/fence_ipmilan.py 2018-07-30 17:29:52.000000000 +0200 @@ -171,7 +171,7 @@ all_opt["lanplus"]["default"] = "1" all_opt["ipport"]["default"] = "623" - all_opt["method"]["help"] = "-m, --method=[method] Method to fence (onoff|cycle) (Default: cycle)\n" \ + all_opt["method"]["help"] = "-m, --method=[method] Method to fence (onoff|cycle) (Default: onoff)\n" \ "WARNING! This fence agent might report success before the node is powered off. " \ "You should use -m/method onoff if your fence device works correctly with that option." diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fence-agents-4.2.1+git.1529316875.1a39345b/agents/mpath/fence_mpath.py new/fence-agents-4.2.1+git.1532964592.3ae5b58e/agents/mpath/fence_mpath.py --- old/fence-agents-4.2.1+git.1529316875.1a39345b/agents/mpath/fence_mpath.py 2018-06-18 12:14:35.000000000 +0200 +++ new/fence-agents-4.2.1+git.1532964592.3ae5b58e/agents/mpath/fence_mpath.py 2018-07-30 17:29:52.000000000 +0200 @@ -143,25 +143,63 @@ store_fh.write(dev + "\t" + options["--key"] + "\n") store_fh.close() -def dev_read(options): +def dev_read(options, fail=True): dev_key = {} file_path = options["--store-path"] + "/mpath.devices" try: store_fh = open(file_path, "r") except IOError: - fail_usage("Failed: Cannot open file \"" + file_path + "\"") + if fail: + fail_usage("Failed: Cannot open file \"" + file_path + "\"") + else: + return None # get not empty lines from file for (device, key) in [line.strip().split() for line in store_fh if line.strip()]: dev_key[device] = key store_fh.close() return dev_key +def mpath_check_get_verbose(): + try: + f = open("/etc/sysconfig/watchdog", "r") + except IOError: + return False + match = re.search(r"^\s*verbose=yes", "".join(f.readlines()), re.MULTILINE) + f.close() + return bool(match) + +def mpath_check(hardreboot=False): + if len(sys.argv) >= 3 and sys.argv[1] == "repair": + return int(sys.argv[2]) + options = {} + options["--mpathpersist-path"] = "/usr/sbin/mpathpersist" + options["--store-path"] = "/var/run/cluster" + options["--power-timeout"] = "5" + if mpath_check_get_verbose(): + logging.getLogger().setLevel(logging.DEBUG) + devs = dev_read(options, fail=False) + if not devs: + logging.error("No devices found") + return 0 + for dev, key in list(devs.items()): + if key in get_registration_keys(options, dev): + logging.debug("key " + key + " registered with device " + dev) + return 0 + else: + logging.debug("key " + key + " not registered with device " + dev) + logging.debug("key " + key + " registered with any devices") + + if hardreboot == True: + libc = ctypes.cdll['libc.so.6'] + libc.reboot(0x1234567) + return 2 + def define_new_opts(): all_opt["devices"] = { "getopt" : "d:", "longopt" : "devices", "help" : "-d, --devices=[devices] List of devices to use for current operation", - "required" : "1", + "required" : "0", "shortdesc" : "List of devices to use for current operation. Devices can \ be comma-separated list of device-mapper multipath devices (eg. /dev/mapper/3600508b400105df70000e00000ac0000 or /dev/mapper/mpath1). \ Each device must support SCSI-3 persistent reservations.", @@ -205,6 +243,12 @@ define_new_opts() + # fence_mpath_check + if os.path.basename(sys.argv[0]) == "fence_mpath_check": + sys.exit(mpath_check()) + elif os.path.basename(sys.argv[0]) == "fence_mpath_check_hardreboot": + sys.exit(mpath_check(hardreboot=True)) + options = check_input(device_opt, process_input(device_opt), other_conditions=True) docs = {} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fence-agents-4.2.1+git.1529316875.1a39345b/configure.ac new/fence-agents-4.2.1+git.1532964592.3ae5b58e/configure.ac --- old/fence-agents-4.2.1+git.1529316875.1a39345b/configure.ac 2018-06-18 12:14:35.000000000 +0200 +++ new/fence-agents-4.2.1+git.1532964592.3ae5b58e/configure.ac 2018-07-30 17:29:52.000000000 +0200 @@ -148,6 +148,11 @@ AGENTS_LIST=$(echo "$AGENTS_LIST" | sed -E "s/manual( |$)//") fi +FENCE_MPATH=0 +if echo "$AGENTS_LIST" | grep -q -E "all|mpath"; then + FENCE_MPATH=1 +fi + FENCE_SCSI=0 if echo "$AGENTS_LIST" | grep -q -E "all|scsi"; then FENCE_SCSI=1 @@ -312,6 +317,7 @@ AC_SUBST([AGENTS_LIST]) AM_CONDITIONAL(BUILD_FENCE_KDUMP, test $FENCE_KDUMP -eq 1) AM_CONDITIONAL(BUILD_FENCE_MANUAL, test $FENCE_MANUAL -eq 1) +AM_CONDITIONAL(BUILD_FENCE_MPATH, test $FENCE_MPATH -eq 1) AM_CONDITIONAL(BUILD_FENCE_SCSI, test $FENCE_SCSI -eq 1) AM_CONDITIONAL(BUILD_FENCE_ZVM, test $FENCE_ZVM -eq 1) AM_CONDITIONAL(BUILD_XENAPILIB, test $XENAPILIB -eq 1) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fence-agents-4.2.1+git.1529316875.1a39345b/make/fencebuild.mk new/fence-agents-4.2.1+git.1532964592.3ae5b58e/make/fencebuild.mk --- old/fence-agents-4.2.1+git.1529316875.1a39345b/make/fencebuild.mk 2018-06-18 12:14:35.000000000 +0200 +++ new/fence-agents-4.2.1+git.1532964592.3ae5b58e/make/fencebuild.mk 2018-07-30 17:29:52.000000000 +0200 @@ -51,7 +51,7 @@ $(call gen_agent_from_py) clean: clean-man - rm -f $(CLEAN_TARGET:%.8=%) $(CLEAN_TARGET_ADDITIONAL) $(scsidata_SCRIPTS) */*.pyc *.pyc */*.wiki + rm -f $(CLEAN_TARGET:%.8=%) $(CLEAN_TARGET_ADDITIONAL) $(mpathdata_SCRIPTS) $(scsidata_SCRIPTS) */*.pyc *.pyc */*.wiki if [ "$(abs_builddir)" = "$(abs_top_builddir)/lib" ]; then \ rm -f $(TARGET); \ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fence-agents-4.2.1+git.1529316875.1a39345b/tests/data/metadata/fence_aliyun.xml new/fence-agents-4.2.1+git.1532964592.3ae5b58e/tests/data/metadata/fence_aliyun.xml --- old/fence-agents-4.2.1+git.1529316875.1a39345b/tests/data/metadata/fence_aliyun.xml 1970-01-01 01:00:00.000000000 +0100 +++ new/fence-agents-4.2.1+git.1532964592.3ae5b58e/tests/data/metadata/fence_aliyun.xml 2018-07-30 17:29:52.000000000 +0200 @@ -0,0 +1,114 @@ +<?xml version="1.0" ?> +<resource-agent name="fence_aliyun" shortdesc="Fence agent for Aliyun (Aliyun Web Services)" > +<longdesc>fence_aliyun is an I/O Fencing agent for Aliyun</longdesc> +<vendor-url>http://www.aliyun.com</vendor-url> +<parameters> + <parameter name="action" unique="0" required="1"> + <getopt mixed="-o, --action=[action]" /> + <content type="string" default="reboot" /> + <shortdesc lang="en">Fencing action</shortdesc> + </parameter> + <parameter name="plug" unique="0" required="1" obsoletes="port"> + <getopt mixed="-n, --plug=[id]" /> + <content type="string" /> + <shortdesc lang="en">Physical plug number on device, UUID or identification of machine</shortdesc> + </parameter> + <parameter name="port" unique="0" required="1" deprecated="1"> + <getopt mixed="-n, --plug=[id]" /> + <content type="string" /> + <shortdesc lang="en">Physical plug number on device, UUID or identification of machine</shortdesc> + </parameter> + <parameter name="region" unique="0" required="0"> + <getopt mixed="-r, --region=[name]" /> + <content type="string" /> + <shortdesc lang="en">Region.</shortdesc> + </parameter> + <parameter name="access_key" unique="0" required="0"> + <getopt mixed="-a, --access-key=[name]" /> + <content type="string" /> + <shortdesc lang="en">Access Key.</shortdesc> + </parameter> + <parameter name="secret_key" unique="0" required="0"> + <getopt mixed="-s, --secret-key=[name]" /> + <content type="string" /> + <shortdesc lang="en">Secret Key.</shortdesc> + </parameter> + <parameter name="quiet" unique="0" required="0"> + <getopt mixed="-q, --quiet" /> + <content type="boolean" /> + <shortdesc lang="en">Disable logging to stderr. Does not affect --verbose or --debug-file or logging to syslog.</shortdesc> + </parameter> + <parameter name="verbose" unique="0" required="0"> + <getopt mixed="-v, --verbose" /> + <content type="boolean" /> + <shortdesc lang="en">Verbose mode</shortdesc> + </parameter> + <parameter name="debug" unique="0" required="0" deprecated="1"> + <getopt mixed="-D, --debug-file=[debugfile]" /> + <content type="string" /> + <shortdesc lang="en">Write debug information to given file</shortdesc> + </parameter> + <parameter name="debug_file" unique="0" required="0" obsoletes="debug"> + <getopt mixed="-D, --debug-file=[debugfile]" /> + <content type="string" /> + <shortdesc lang="en">Write debug information to given file</shortdesc> + </parameter> + <parameter name="version" unique="0" required="0"> + <getopt mixed="-V, --version" /> + <content type="boolean" /> + <shortdesc lang="en">Display version information and exit</shortdesc> + </parameter> + <parameter name="help" unique="0" required="0"> + <getopt mixed="-h, --help" /> + <content type="boolean" /> + <shortdesc lang="en">Display help and exit</shortdesc> + </parameter> + <parameter name="separator" unique="0" required="0"> + <getopt mixed="-C, --separator=[char]" /> + <content type="string" default="," /> + <shortdesc lang="en">Separator for CSV created by 'list' operation</shortdesc> + </parameter> + <parameter name="delay" unique="0" required="0"> + <getopt mixed="--delay=[seconds]" /> + <content type="second" default="0" /> + <shortdesc lang="en">Wait X seconds before fencing is started</shortdesc> + </parameter> + <parameter name="login_timeout" unique="0" required="0"> + <getopt mixed="--login-timeout=[seconds]" /> + <content type="second" default="5" /> + <shortdesc lang="en">Wait X seconds for cmd prompt after login</shortdesc> + </parameter> + <parameter name="power_timeout" unique="0" required="0"> + <getopt mixed="--power-timeout=[seconds]" /> + <content type="second" default="60" /> + <shortdesc lang="en">Test X seconds for status change after ON/OFF</shortdesc> + </parameter> + <parameter name="power_wait" unique="0" required="0"> + <getopt mixed="--power-wait=[seconds]" /> + <content type="second" default="0" /> + <shortdesc lang="en">Wait X seconds after issuing ON/OFF</shortdesc> + </parameter> + <parameter name="shell_timeout" unique="0" required="0"> + <getopt mixed="--shell-timeout=[seconds]" /> + <content type="second" default="3" /> + <shortdesc lang="en">Wait X seconds for cmd prompt after issuing command</shortdesc> + </parameter> + <parameter name="retry_on" unique="0" required="0"> + <getopt mixed="--retry-on=[attempts]" /> + <content type="integer" default="1" /> + <shortdesc lang="en">Count of attempts to retry power on</shortdesc> + </parameter> +</parameters> +<actions> + <action name="on" automatic="0"/> + <action name="off" /> + <action name="reboot" /> + <action name="status" /> + <action name="list" /> + <action name="list-status" /> + <action name="monitor" /> + <action name="metadata" /> + <action name="manpage" /> + <action name="validate-all" /> +</actions> +</resource-agent> diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fence-agents-4.2.1+git.1529316875.1a39345b/tests/data/metadata/fence_gce.xml new/fence-agents-4.2.1+git.1532964592.3ae5b58e/tests/data/metadata/fence_gce.xml --- old/fence-agents-4.2.1+git.1529316875.1a39345b/tests/data/metadata/fence_gce.xml 2018-06-18 12:14:35.000000000 +0200 +++ new/fence-agents-4.2.1+git.1532964592.3ae5b58e/tests/data/metadata/fence_gce.xml 2018-07-30 17:29:52.000000000 +0200 @@ -10,6 +10,14 @@ <content type="string" default="reboot" /> <shortdesc lang="en">Fencing action</shortdesc> </parameter> + <parameter name="method" unique="0" required="0"> + <getopt mixed="-m, --method=[method]" /> + <content type="select" default="cycle" > + <option value="onoff" /> + <option value="cycle" /> + </content> + <shortdesc lang="en">Method to fence</shortdesc> + </parameter> <parameter name="plug" unique="0" required="1" obsoletes="port"> <getopt mixed="-n, --plug=[id]" /> <content type="string" /> @@ -20,16 +28,26 @@ <content type="string" /> <shortdesc lang="en">Physical plug number on device, UUID or identification of machine</shortdesc> </parameter> - <parameter name="zone" unique="0" required="1"> + <parameter name="zone" unique="0" required="0"> <getopt mixed="--zone=[name]" /> <content type="string" /> <shortdesc lang="en">Zone.</shortdesc> </parameter> - <parameter name="project" unique="0" required="1"> + <parameter name="project" unique="0" required="0"> <getopt mixed="--project=[name]" /> <content type="string" /> <shortdesc lang="en">Project ID.</shortdesc> </parameter> + <parameter name="stackdriver-logging" unique="0" required="0" deprecated="1"> + <getopt mixed="--stackdriver-logging" /> + <content type="boolean" /> + <shortdesc lang="en">Stackdriver-logging support.</shortdesc> + </parameter> + <parameter name="stackdriver_logging" unique="0" required="0" obsoletes="stackdriver-logging"> + <getopt mixed="--stackdriver-logging" /> + <content type="boolean" /> + <shortdesc lang="en">Stackdriver-logging support.</shortdesc> + </parameter> <parameter name="quiet" unique="0" required="0"> <getopt mixed="-q, --quiet" /> <content type="boolean" /> diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fence-agents-4.2.1+git.1529316875.1a39345b/tests/data/metadata/fence_mpath.xml new/fence-agents-4.2.1+git.1532964592.3ae5b58e/tests/data/metadata/fence_mpath.xml --- old/fence-agents-4.2.1+git.1529316875.1a39345b/tests/data/metadata/fence_mpath.xml 2018-06-18 12:14:35.000000000 +0200 +++ new/fence-agents-4.2.1+git.1532964592.3ae5b58e/tests/data/metadata/fence_mpath.xml 2018-07-30 17:29:52.000000000 +0200 @@ -9,7 +9,7 @@ <content type="string" default="off" /> <shortdesc lang="en">Fencing action</shortdesc> </parameter> - <parameter name="devices" unique="0" required="1"> + <parameter name="devices" unique="0" required="0"> <getopt mixed="-d, --devices=[devices]" /> <content type="string" /> <shortdesc lang="en">List of devices to use for current operation. Devices can be comma-separated list of device-mapper multipath devices (eg. /dev/mapper/3600508b400105df70000e00000ac0000 or /dev/mapper/mpath1). Each device must support SCSI-3 persistent reservations.</shortdesc>
