diff --git a/SOURCES/bz1214359-1-fence_compute.patch b/SOURCES/bz1214359-1-fence_compute.patch new file mode 100644 index 0000000..60817ea --- /dev/null +++ b/SOURCES/bz1214359-1-fence_compute.patch @@ -0,0 +1,426 @@ +From 563c93016b0581c2f6beea1f3f18e76e25491895 Mon Sep 17 00:00:00 2001 +From: Marek 'marx' Grac +Date: Fri, 5 Jun 2015 18:03:00 +0200 +Subject: [PATCH 1/4] fence_compute: Fence agent for Nova compute machines + +Author: Andrew Beekhof +--- + configure.ac | 2 + + fence/agents/compute/Makefile.am | 17 +++ + fence/agents/compute/fence_compute.py | 218 ++++++++++++++++++++++++++++++++++ + make/fencebuild.mk | 1 + + tests/data/metadata/fence_compute.xml | 121 +++++++++++++++++++ + 5 files changed, 359 insertions(+) + create mode 100644 fence/agents/compute/Makefile.am + create mode 100644 fence/agents/compute/fence_compute.py + create mode 100644 tests/data/metadata/fence_compute.xml + +diff --git a/configure.ac b/configure.ac +index b603878..9d996d3 100644 +--- a/configure.ac ++++ b/configure.ac +@@ -167,6 +167,7 @@ AC_PATH_PROG([COROSYNC_CMAPCTL_PATH], [corosync-cmapctl], [/usr/sbin/corosync-cm + AC_PATH_PROG([SG_PERSIST_PATH], [sg_persist], [/usr/bin/sg_persist]) + AC_PATH_PROG([SG_TURS_PATH], [sg_turs], [/usr/bin/sg_turs]) + AC_PATH_PROG([VGS_PATH], [vgs], [/usr/sbin/vgs]) ++AC_PATH_PROG([NOVA_PATH], [nova], [/usr/bin/nova]) + ## do subst + + AC_SUBST([DEFAULT_CONFIG_DIR]) +@@ -265,6 +266,7 @@ AC_CONFIG_FILES([Makefile + fence/agents/brocade/Makefile + fence/agents/cisco_mds/Makefile + fence/agents/cisco_ucs/Makefile ++ fence/agents/compute/Makefile + fence/agents/docker/Makefile + fence/agents/drac/Makefile + fence/agents/drac5/Makefile +diff --git a/fence/agents/compute/Makefile.am b/fence/agents/compute/Makefile.am +new file mode 100644 +index 0000000..ab21272 +--- /dev/null ++++ b/fence/agents/compute/Makefile.am +@@ -0,0 +1,17 @@ ++MAINTAINERCLEANFILES = Makefile.in ++ ++TARGET = fence_compute ++ ++SRC = $(TARGET).py ++ ++EXTRA_DIST = $(SRC) ++ ++sbin_SCRIPTS = $(TARGET) ++ ++man_MANS = $(TARGET).8 ++ ++FENCE_TEST_ARGS = -l test -p test -n 1 ++ ++include $(top_srcdir)/make/fencebuild.mk ++include $(top_srcdir)/make/fenceman.mk ++include $(top_srcdir)/make/agentpycheck.mk +diff --git a/fence/agents/compute/fence_compute.py b/fence/agents/compute/fence_compute.py +new file mode 100644 +index 0000000..2b37de7 +--- /dev/null ++++ b/fence/agents/compute/fence_compute.py +@@ -0,0 +1,218 @@ ++#!/usr/bin/python -tt ++ ++import sys ++import time ++import atexit ++import logging ++ ++sys.path.append("@FENCEAGENTSLIBDIR@") ++from fencing import * ++from fencing import fail_usage, is_executable, run_command, run_delay ++from novaclient import client as nova_client ++ ++#BEGIN_VERSION_GENERATION ++RELEASE_VERSION="4.0.11" ++BUILD_DATE="(built Wed Nov 12 06:33:38 EST 2014)" ++REDHAT_COPYRIGHT="Copyright (C) Red Hat, Inc. 2004-2010 All rights reserved." ++#END_VERSION_GENERATION ++ ++override_status = "" ++nova = None ++ ++def get_power_status(_, options): ++ global override_status ++ ++ status = "unknown" ++ logging.debug("get action: " + options["--action"]) ++ ++ if len(override_status): ++ logging.debug("Pretending we're " + override_status) ++ return override_status ++ ++ if nova: ++ try: ++ services = nova.services.list(host=options["--plug"]) ++ except Exception, e: ++ fail_usage(str(e)) ++ ++ for service in services: ++ if service.binary == "nova-compute": ++ if service.state == "up": ++ status = "on" ++ elif service.state == "down": ++ status = "down" ++ else: ++ logging.debug("Unknown status detected from nova: " + service.state) ++ break ++ return status ++ ++# NOTE(sbauza); We mimic the host-evacuate module since it's only a contrib ++# module which is not stable ++def _server_evacuate(server, on_shared_storage): ++ success = True ++ error_message = "" ++ try: ++ nova.servers.evacuate(server=server['uuid'], on_shared_storage=on_shared_storage) ++ except Exception as e: ++ success = False ++ error_message = "Error while evacuating instance: %s" % e ++ ++ return { ++ "server_uuid": server['uuid'], ++ "evacuate_accepted": success, ++ "error_message": error_message, ++ } ++ ++def _host_evacuate(host, on_shared_storage): ++ hypervisors = nova.hypervisors.search(host, servers=True) ++ response = [] ++ for hyper in hypervisors: ++ if hasattr(hyper, 'servers'): ++ for server in hyper.servers: ++ response.append(_server_evacuate(server, on_shared_storage)) ++ ++def set_power_status(_, options): ++ global override_status ++ ++ override_status = "" ++ logging.debug("set action: " + options["--action"]) ++ ++ if not nova: ++ return ++ ++ if options["--action"] == "on": ++ if get_power_status(_, options) == "on": ++ nova.services.enable(options["--plug"], 'nova-compute') ++ else: ++ # Pretend we're 'on' so that the fencing library doesn't loop forever waiting for the node to boot ++ override_status = "on" ++ return ++ ++ # need to wait for nova to update its internal status or we ++ # cannot call host-evacuate ++ while get_power_status(_, options) != "off": ++ # Loop forever if need be. ++ # ++ # Some callers (such as Pacemaker) will have a timer ++ # running and kill us if necessary ++ logging.debug("Waiting for nova to update it's internal state") ++ time.sleep(1) ++ ++ if "--no-shared-storage" not in options: ++ # If the admin sets this when they DO have shared ++ # storage in use, then they get what they asked for ++ on_shared_storage = True ++ else: ++ on_shared_storage = False ++ ++ _host_evacuate(options["--plug"], on_shared_storage) ++ return ++ ++def get_plugs_list(_, options): ++ result = {} ++ ++ if nova: ++ hypervisors = nova.hypervisors.list() ++ for hypervisor in hypervisors: ++ longhost = hypervisor.hypervisor_hostname ++ if options["--action"] == "list" and options["--domain"] != "": ++ shorthost = longhost.replace("." + options["--domain"], ++ "") ++ result[shorthost] = ("", None) ++ else: ++ result[longhost] = ("", None) ++ return result ++ ++ ++def define_new_opts(): ++ all_opt["tenant-name"] = { ++ "getopt" : "t:", ++ "longopt" : "tenant-name", ++ "help" : "-t, --tenant-name=[tenant] Keystone Admin Tenant", ++ "required" : "0", ++ "shortdesc" : "Keystone Admin Tenant", ++ "default" : "", ++ "order": 1, ++ } ++ all_opt["auth-url"] = { ++ "getopt" : "k:", ++ "longopt" : "auth-url", ++ "help" : "-k, --auth-url=[tenant] Keystone Admin Auth URL", ++ "required" : "0", ++ "shortdesc" : "Keystone Admin Auth URL", ++ "default" : "", ++ "order": 1, ++ } ++ all_opt["novatool-path"] = { ++ "getopt" : "i:", ++ "longopt" : "novatool-path", ++ "help" : "-i, --novatool-path=[path] Path to nova binary", ++ "required" : "0", ++ "shortdesc" : "Path to nova binary", ++ "default" : "@NOVA_PATH@", ++ "order": 6, ++ } ++ all_opt["domain"] = { ++ "getopt" : "d:", ++ "longopt" : "domain", ++ "help" : "-d, --domain=[string] DNS domain in which hosts live, useful when the cluster uses short names and nova uses FQDN", ++ "required" : "0", ++ "shortdesc" : "DNS domain in which hosts live", ++ "default" : "", ++ "order": 5, ++ } ++ all_opt["no-shared-storage"] = { ++ "getopt" : "", ++ "longopt" : "no-shared-storage", ++ "help" : "--no-shared-storage Disable functionality for shared storage", ++ "required" : "0", ++ "shortdesc" : "Disable functionality for dealing with shared storage", ++ "default" : "False", ++ "order": 5, ++ } ++ ++def main(): ++ global override_status ++ global nova ++ atexit.register(atexit_handler) ++ ++ device_opt = ["login", "passwd", "tenant-name", "auth-url", ++ "novatool-path", "no_login", "no_password", "port", "domain", "no-shared-storage"] ++ define_new_opts() ++ all_opt["shell_timeout"]["default"] = "180" ++ ++ options = check_input(device_opt, process_input(device_opt)) ++ ++ docs = {} ++ docs["shortdesc"] = "Fence agent for nova compute nodes" ++ docs["longdesc"] = "fence_nova_host is a Nova fencing notification agent" ++ docs["vendorurl"] = "" ++ ++ show_docs(options, docs) ++ ++ run_delay(options) ++ ++ # The first argument is the Nova client version ++ nova = nova_client.Client('2', ++ options["--username"], ++ options["--password"], ++ options["--tenant-name"], ++ options["--auth-url"]) ++ ++ if options["--action"] in ["off", "reboot"]: ++ # Pretend we're 'on' so that the fencing library will always call set_power_status(off) ++ override_status = "on" ++ ++ if options["--action"] == "on": ++ # Pretend we're 'off' so that the fencing library will always call set_power_status(on) ++ override_status = "off" ++ ++ # Potentially we should make this a pacemaker feature ++ if options["--action"] != "list" and options["--domain"] != "" and options.has_key("--plug"): ++ options["--plug"] = options["--plug"]+"."+options["--domain"] ++ ++ result = fence_action(None, options, set_power_status, get_power_status, get_plugs_list, None) ++ sys.exit(result) ++ ++if __name__ == "__main__": ++ main() +diff --git a/make/fencebuild.mk b/make/fencebuild.mk +index 1c4be6b..b59c069 100644 +--- a/make/fencebuild.mk ++++ b/make/fencebuild.mk +@@ -16,6 +16,7 @@ $(TARGET): $(SRC) + -e 's#@''SG_PERSIST_PATH@#${SG_PERSIST_PATH}#g' \ + -e 's#@''SG_TURS_PATH@#${SG_TURS_PATH}#g' \ + -e 's#@''VGS_PATH@#${VGS_PATH}#g' \ ++ -e 's#@''NOVA_PATH@#${NOVA_PATH}#g' \ + > $@ + + if [ 0 -eq `echo "$(SRC)" | grep fence_ &> /dev/null; echo $$?` ]; then \ +diff --git a/tests/data/metadata/fence_compute.xml b/tests/data/metadata/fence_compute.xml +new file mode 100644 +index 0000000..ff7c06c +--- /dev/null ++++ b/tests/data/metadata/fence_compute.xml +@@ -0,0 +1,121 @@ ++ ++ ++fence_nova_host is a Nova fencing notification agent ++ ++ ++ ++ ++ ++ Physical plug number, name of virtual machine or UUID ++ ++ ++ ++ ++ Script to retrieve password ++ ++ ++ ++ ++ Keystone Admin Auth URL ++ ++ ++ ++ ++ Login password or passphrase ++ ++ ++ ++ ++ Keystone Admin Tenant ++ ++ ++ ++ ++ Fencing Action ++ ++ ++ ++ ++ Login Name ++ ++ ++ ++ ++ DNS domain in which hosts live ++ ++ ++ ++ ++ Disable functionality for dealing with shared storage ++ ++ ++ ++ ++ Path to nova binary ++ ++ ++ ++ ++ Verbose mode ++ ++ ++ ++ ++ Write debug information to given file ++ ++ ++ ++ ++ Display version information and exit ++ ++ ++ ++ ++ Display help and exit ++ ++ ++ ++ ++ Separator for CSV created by operation list ++ ++ ++ ++ ++ Wait X seconds after issuing ON/OFF ++ ++ ++ ++ ++ Wait X seconds for cmd prompt after login ++ ++ ++ ++ ++ Test X seconds for status change after ON/OFF ++ ++ ++ ++ ++ Wait X seconds before fencing is started ++ ++ ++ ++ ++ Wait X seconds for cmd prompt after issuing command ++ ++ ++ ++ ++ Count of attempts to retry power on ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +-- +1.9.3 + diff --git a/SOURCES/bz1214359-2-fence_compute.patch b/SOURCES/bz1214359-2-fence_compute.patch new file mode 100644 index 0000000..d3246e0 --- /dev/null +++ b/SOURCES/bz1214359-2-fence_compute.patch @@ -0,0 +1,161 @@ +From 21c2154bedceb6ebef1cae369768280d4b0f8652 Mon Sep 17 00:00:00 2001 +From: Marek 'marx' Grac +Date: Fri, 5 Jun 2015 18:07:55 +0200 +Subject: [PATCH 2/4] fence_compute: Improvement of fence agent + +--- + fence/agents/compute/fence_compute.py | 73 ++++++++++++++++++++++------------- + fence/agents/lib/fencing.py.py | 6 ++- + 2 files changed, 50 insertions(+), 29 deletions(-) + +diff --git a/fence/agents/compute/fence_compute.py b/fence/agents/compute/fence_compute.py +index 2b37de7..66cf08f 100644 +--- a/fence/agents/compute/fence_compute.py ++++ b/fence/agents/compute/fence_compute.py +@@ -4,11 +4,11 @@ import sys + import time + import atexit + import logging ++import requests.exceptions + + sys.path.append("@FENCEAGENTSLIBDIR@") + from fencing import * + from fencing import fail_usage, is_executable, run_command, run_delay +-from novaclient import client as nova_client + + #BEGIN_VERSION_GENERATION + RELEASE_VERSION="4.0.11" +@@ -32,18 +32,18 @@ def get_power_status(_, options): + if nova: + try: + services = nova.services.list(host=options["--plug"]) +- except Exception, e: +- fail_usage(str(e)) +- +- for service in services: +- if service.binary == "nova-compute": +- if service.state == "up": +- status = "on" +- elif service.state == "down": +- status = "down" +- else: +- logging.debug("Unknown status detected from nova: " + service.state) +- break ++ ++ for service in services: ++ if service.binary == "nova-compute": ++ if service.state == "up": ++ status = "on" ++ elif service.state == "down": ++ status = "off" ++ else: ++ logging.debug("Unknown status detected from nova: " + service.state) ++ break ++ except ConnectionError as (err): ++ logging.warning("Nova connection failed: " + str(err)) + return status + + # NOTE(sbauza); We mimic the host-evacuate module since it's only a contrib +@@ -143,15 +143,6 @@ def define_new_opts(): + "default" : "", + "order": 1, + } +- all_opt["novatool-path"] = { +- "getopt" : "i:", +- "longopt" : "novatool-path", +- "help" : "-i, --novatool-path=[path] Path to nova binary", +- "required" : "0", +- "shortdesc" : "Path to nova binary", +- "default" : "@NOVA_PATH@", +- "order": 6, +- } + all_opt["domain"] = { + "getopt" : "d:", + "longopt" : "domain", +@@ -177,7 +168,7 @@ def main(): + atexit.register(atexit_handler) + + device_opt = ["login", "passwd", "tenant-name", "auth-url", +- "novatool-path", "no_login", "no_password", "port", "domain", "no-shared-storage"] ++ "no_login", "no_password", "port", "domain", "no-shared-storage"] + define_new_opts() + all_opt["shell_timeout"]["default"] = "180" + +@@ -192,6 +183,15 @@ def main(): + + run_delay(options) + ++ try: ++ from novaclient import client as nova_client ++ except ImportError: ++ fail_usage("nova not found or not accessible") ++ ++ # Potentially we should make this a pacemaker feature ++ if options["--action"] != "list" and options["--domain"] != "" and options.has_key("--plug"): ++ options["--plug"] = options["--plug"] + "." + options["--domain"] ++ + # The first argument is the Nova client version + nova = nova_client.Client('2', + options["--username"], +@@ -199,6 +199,29 @@ def main(): + options["--tenant-name"], + options["--auth-url"]) + ++ if options["--action"] in ["on", "off", "reboot" ]: ++ try: ++ nova.services.list(host=options["--plug"]) ++ except ConnectionError as (err): ++ # Yes, exit(0) ++ # ++ # Its possible that the control plane on which this ++ # agent depends is not functional ++ # ++ # In this situation, fencing is waiting for resource ++ # recovery and resource recovery is waiting for ++ # fencing. ++ # ++ # To break the cycle, we all the fencing agent to ++ # return 'done' immediately so that we can recover the ++ # control plane. We then rely on the NovaCompute RA ++ # to call this agent directly once the control plane ++ # is up. ++ # ++ # Yes its horrible, but still better than nova itself. ++ logging.warning("Nova connection failed: %s " % str(err)) ++ sys.exit(0) ++ + if options["--action"] in ["off", "reboot"]: + # Pretend we're 'on' so that the fencing library will always call set_power_status(off) + override_status = "on" +@@ -207,10 +230,6 @@ def main(): + # Pretend we're 'off' so that the fencing library will always call set_power_status(on) + override_status = "off" + +- # Potentially we should make this a pacemaker feature +- if options["--action"] != "list" and options["--domain"] != "" and options.has_key("--plug"): +- options["--plug"] = options["--plug"]+"."+options["--domain"] +- + result = fence_action(None, options, set_power_status, get_power_status, get_plugs_list, None) + sys.exit(result) + +diff --git a/fence/agents/lib/fencing.py.py b/fence/agents/lib/fencing.py.py +index f893082..29b3a94 100644 +--- a/fence/agents/lib/fencing.py.py ++++ b/fence/agents/lib/fencing.py.py +@@ -1109,9 +1109,11 @@ def fence_login(options, re_login_string=r"(login\s*: )|(Login Name: )|(usernam + conn.log_expect(options, options["--command-prompt"], int(options["--login-timeout"])) + except KeyError: + fail(EC_PASSWORD_MISSING) +- except pexpect.EOF: ++ except pexpect.EOF, exception: ++ logging.debug("%s", str(exception)) + fail(EC_LOGIN_DENIED) +- except pexpect.TIMEOUT: ++ except pexpect.TIMEOUT, exception: ++ logging.debug("%s", str(exception)) + fail(EC_LOGIN_DENIED) + return conn + +-- +1.9.3 + diff --git a/SOURCES/bz1214359-3-fence_compute.patch b/SOURCES/bz1214359-3-fence_compute.patch new file mode 100644 index 0000000..a22ce65 --- /dev/null +++ b/SOURCES/bz1214359-3-fence_compute.patch @@ -0,0 +1,33 @@ +From da2f40c6f7ae8263b4dd27f076a8ffe9d03b1534 Mon Sep 17 00:00:00 2001 +From: "Fabio M. Di Nitto" +Date: Mon, 8 Jun 2015 13:27:47 +0200 +Subject: [PATCH 3/4] fence_compute: fix on-shared-storage option parsing + +Signed-off-by: Fabio M. Di Nitto +--- + fence/agents/compute/fence_compute.py | 8 +++----- + 1 file changed, 3 insertions(+), 5 deletions(-) + +diff --git a/fence/agents/compute/fence_compute.py b/fence/agents/compute/fence_compute.py +index 66cf08f..c2c90fc 100644 +--- a/fence/agents/compute/fence_compute.py ++++ b/fence/agents/compute/fence_compute.py +@@ -98,12 +98,10 @@ def set_power_status(_, options): + logging.debug("Waiting for nova to update it's internal state") + time.sleep(1) + +- if "--no-shared-storage" not in options: +- # If the admin sets this when they DO have shared +- # storage in use, then they get what they asked for +- on_shared_storage = True +- else: ++ if options["--no-shared-storage"] != "False": + on_shared_storage = False ++ else: ++ on_shared_storage = True + + _host_evacuate(options["--plug"], on_shared_storage) + return +-- +1.9.3 + diff --git a/SOURCES/bz1214359-4-fence_compute.patch b/SOURCES/bz1214359-4-fence_compute.patch new file mode 100644 index 0000000..841cef0 --- /dev/null +++ b/SOURCES/bz1214359-4-fence_compute.patch @@ -0,0 +1,52 @@ +From b1e7b610b51c0be23d7adc0e2ab369850d924f87 Mon Sep 17 00:00:00 2001 +From: "Fabio M. Di Nitto" +Date: Mon, 8 Jun 2015 14:43:00 +0200 +Subject: [PATCH 4/4] compute: add support for endpoint-type + +Signed-off-by: Fabio M. Di Nitto +--- + fence/agents/compute/fence_compute.py | 14 ++++++++++++-- + 1 file changed, 12 insertions(+), 2 deletions(-) + +diff --git a/fence/agents/compute/fence_compute.py b/fence/agents/compute/fence_compute.py +index c2c90fc..000aef7 100644 +--- a/fence/agents/compute/fence_compute.py ++++ b/fence/agents/compute/fence_compute.py +@@ -123,6 +123,15 @@ def get_plugs_list(_, options): + + + def define_new_opts(): ++ all_opt["endpoint-type"] = { ++ "getopt" : "e:", ++ "longopt" : "endpoint-type", ++ "help" : "-e, --endpoint-type=[endpoint] Nova Endpoint type (publicURL, internalURL, adminURL)", ++ "required" : "0", ++ "shortdesc" : "Nova Endpoint type", ++ "default" : "internalURL", ++ "order": 1, ++ } + all_opt["tenant-name"] = { + "getopt" : "t:", + "longopt" : "tenant-name", +@@ -166,7 +175,7 @@ def main(): + atexit.register(atexit_handler) + + device_opt = ["login", "passwd", "tenant-name", "auth-url", +- "no_login", "no_password", "port", "domain", "no-shared-storage"] ++ "no_login", "no_password", "port", "domain", "no-shared-storage", "endpoint-type"] + define_new_opts() + all_opt["shell_timeout"]["default"] = "180" + +@@ -195,7 +204,8 @@ def main(): + options["--username"], + options["--password"], + options["--tenant-name"], +- options["--auth-url"]) ++ options["--auth-url"], ++ endpoint_type=options["--endpoint-type"]) + + if options["--action"] in ["on", "off", "reboot" ]: + try: +-- +1.9.3 + diff --git a/SPECS/fence-agents.spec b/SPECS/fence-agents.spec index 05bbee6..7517d0b 100644 --- a/SPECS/fence-agents.spec +++ b/SPECS/fence-agents.spec @@ -16,7 +16,7 @@ Name: fence-agents Summary: Fence Agents for Red Hat Cluster Version: 4.0.11 -Release: 11%{?alphatag:.%{alphatag}}%{?dist} +Release: 13%{?alphatag:.%{alphatag}}%{?dist} License: GPLv2+ and LGPLv2+ Group: System Environment/Base URL: http://sourceware.org/cluster/wiki/ @@ -43,10 +43,14 @@ Patch18: tests-01.patch Patch19: tests-02.patch Patch20: bz1199970-fence_ilo_support_tls10.patch Patch21: bz1203877-fence_ipmilan-default_cipher.patch +Patch22: bz1214359-1-fence_compute.patch +Patch23: bz1214359-2-fence_compute.patch +Patch24: bz1214359-3-fence_compute.patch +Patch25: bz1214359-4-fence_compute.patch %if 0%{?rhel} -%global supportedagents apc apc_snmp bladecenter brocade cisco_mds cisco_ucs drac5 eaton_snmp eps hpblade ibmblade ifmib ilo ilo_mp ilo_ssh intelmodular ipdu ipmilan kdump rhevm rsb scsi vmware_soap wti -%global allfenceagents fence-agents-apc fence-agents-apc-snmp fence-agents-bladecenter fence-agents-brocade fence-agents-cisco-mds fence-agents-cisco-ucs fence-agents-drac5 fence-agents-eaton-snmp fence-agents-eps fence-agents-hpblade fence-agents-ibmblade fence-agents-ifmib fence-agents-ilo2 fence-agents-ilo-mp fence-agents-ilo-ssh fence-agents-intelmodular fence-agents-ipdu fence-agents-ipmilan fence-agents-kdump fence-agents-rhevm fence-agents-rsb fence-agents-scsi fence-agents-vmware-soap fence-agents-wti +%global supportedagents apc apc_snmp bladecenter brocade cisco_mds cisco_ucs compute drac5 eaton_snmp eps hpblade ibmblade ifmib ilo ilo_mp ilo_ssh intelmodular ipdu ipmilan kdump rhevm rsb scsi vmware_soap wti +%global allfenceagents fence-agents-apc fence-agents-apc-snmp fence-agents-bladecenter fence-agents-brocade fence-agents-cisco-mds fence-agents-cisco-ucs fence-agents-compute fence-agents-drac5 fence-agents-eaton-snmp fence-agents-eps fence-agents-hpblade fence-agents-ibmblade fence-agents-ifmib fence-agents-ilo2 fence-agents-ilo-mp fence-agents-ilo-ssh fence-agents-intelmodular fence-agents-ipdu fence-agents-ipmilan fence-agents-kdump fence-agents-rhevm fence-agents-rsb fence-agents-scsi fence-agents-vmware-soap fence-agents-wti %ifarch s390x %global testagents virsh zvm %else @@ -90,6 +94,10 @@ BuildRequires: autoconf automake libtool %patch19 -p1 -b .tests-02 %patch20 -p1 -b .bz1199970-1 %patch21 -p1 -b .bz1203877-1 +%patch22 -p1 -b .bz1214359-1 +%patch23 -p1 -b .bz1214359-2 +%patch24 -p1 -b .bz1214359-3 +%patch25 -p1 -b .bz1214359-4 %build ./autogen.sh @@ -242,6 +250,21 @@ The fence-agents-cisco-ucs package contains a fence agent for Cisco UCS series d %{_sbindir}/fence_cisco_ucs %{_mandir}/man8/fence_cisco_ucs.8* +%package compute +License: GPLv2+ and LGPLv2+ +Group: System Environment/Base +Summary: Fence agent for Nova compute nodes +Requires: fence-agents-common >= %{version}-%{release} +Requires: python-requests +Obsoletes: fence-agents +%description compute +The fence-agents-compute package contains a fence agent for Nova compute nodes. +%files compute +%defattr(-,root,root,-) +%{_sbindir}/fence_compute +%{_mandir}/man8/fence_compute.8* + + %package drac5 License: GPLv2+ and LGPLv2+ Group: System Environment/Base @@ -602,6 +625,10 @@ The fence-agents-zvm package contains a fence agent for z/VM hypervisors %endif %changelog +* Mon Jun 08 2015 Marek Grac - 4.0.11-13 +- New fence agent fence_compute + Resolves: rhbz#1228599 + * Wed Mar 25 2015 Marek Grac - 4.0.11-11 - fence_ipmilan: Unset default cipher Resolves: rhbz#1206294