Page MenuHomeClusterLabs Projects

No OneTemporary

diff --git a/agents/openstack/fence_openstack.py b/agents/openstack/fence_openstack.py
index bcb13350..5257ec52 100755
--- a/agents/openstack/fence_openstack.py
+++ b/agents/openstack/fence_openstack.py
@@ -1,147 +1,160 @@
#!@PYTHON@ -tt
import atexit
import logging
import os
import re
import sys
from pipes import quote
sys.path.append("/usr/share/fence")
from fencing import *
from fencing import fail_usage, is_executable, run_command, run_delay
try:
from novaclient import client as novaclient
from keystoneauth1 import session as ksc_session
from keystoneauth1 import loading
legacy_import = False
except ImportError:
try:
from novaclient import client as novaclient
from keystoneclient import session as ksc_session
from keystoneclient.auth.identity import v3
legacy_import = True
except ImportError:
pass
-def get_name_or_uuid(options):
- return options["--uuid"] if "--uuid" in options else options["--plug"]
-
def get_power_status(_, options):
output = nova_run_command(options, "status")
if (output == 'ACTIVE'):
return 'on'
else:
return 'off'
def set_power_status(_, options):
nova_run_command(options, options["--action"])
return
def nova_login(username,password,projectname,auth_url,user_domain_name,project_domain_name):
if not legacy_import:
loader = loading.get_plugin_loader('password')
auth = loader.load_from_options(auth_url=auth_url,
username=username,
password=password,
project_name=projectname,
user_domain_name=user_domain_name,
project_domain_name=project_domain_name)
else:
auth = v3.Password(username=username,
password=password,
project_name=projectname,
user_domain_name=user_domain_name,
project_domain_name=project_domain_name,
auth_url=auth_url)
session = ksc_session.Session(auth=auth)
nova = novaclient.Client("2", session=session)
return nova
def nova_run_command(options,action,timeout=None):
username=options["--username"]
password=options["--password"]
projectname=options["--project-name"]
auth_url=options["--auth-url"]
user_domain_name=options["--user-domain-name"]
project_domain_name=options["--project-domain-name"]
novaclient=nova_login(username,password,projectname,auth_url,user_domain_name,project_domain_name)
- server = novaclient.servers.get(options["--uuid"])
+ server = novaclient.servers.get(options["--plug"])
if action == "status":
return server.status
if action == "on":
server.start()
if action == "off":
server.stop()
if action == "reboot":
server.reboot('REBOOT_HARD')
def define_new_opts():
all_opt["auth-url"] = {
"getopt" : ":",
"longopt" : "auth-url",
- "help" : "--auth-url=[authurl] Keystone Auth URL",
+ "help" : "--auth-url=[authurl] Keystone Auth URL",
"required" : "1",
"shortdesc" : "Keystone Auth URL",
"order": 1
}
all_opt["project-name"] = {
"getopt" : ":",
"longopt" : "project-name",
- "help" : "--project-name=[project] Tenant Or Project Name",
+ "help" : "--project-name=[project] Tenant Or Project Name",
"required" : "1",
"shortdesc" : "Keystone Project",
"default": "admin",
"order": 1
}
all_opt["user-domain-name"] = {
"getopt" : ":",
"longopt" : "user-domain-name",
- "help" : "--user-domain-name=[user-domain] Keystone User Domain Name",
+ "help" : "--user-domain-name=[domain] Keystone User Domain Name",
"required" : "0",
"shortdesc" : "Keystone User Domain Name",
"default": "Default",
"order": 1
}
all_opt["project-domain-name"] = {
"getopt" : ":",
"longopt" : "project-domain-name",
- "help" : "--project-domain-name=[project-domain] Keystone Project Domain Name",
+ "help" : "--project-domain-name=[domain] Keystone Project Domain Name",
"required" : "0",
"shortdesc" : "Keystone Project Domain Name",
"default": "Default",
"order": 1
}
all_opt["uuid"] = {
"getopt" : ":",
"longopt" : "uuid",
- "help" : "--uuid=[uuid] UUID of the nova instance",
- "required" : "1",
- "shortdesc" : "UUID of the nova instance",
+ "help" : "--uuid=[uuid] Replaced by -n, --plug",
+ "required" : "0",
+ "shortdesc" : "Replaced by port",
"order": 1
}
def main():
atexit.register(atexit_handler)
- device_opt = ["login", "passwd", "auth-url", "project-name", "user-domain-name", "project-domain-name", "uuid"]
+ device_opt = [ "login", "passwd", "auth-url", "project-name",
+ "user-domain-name", "project-domain-name",
+ "port", "no_port", "uuid" ]
define_new_opts()
+ all_opt["port"]["help"] = "-n, --plug=[UUID] UUID of the node to be fenced"
+ all_opt["port"]["shortdesc"] = "UUID of the node to be fenced."
+
options = check_input(device_opt, process_input(device_opt))
+ # hack to remove list/list-status actions which are not supported
+ options["device_opt"] = [ o for o in options["device_opt"] if o != "separator" ]
+
+ # workaround to avoid regressions
+ if "--uuid" in options:
+ options["--plug"] = options["--uuid"]
+ del options["--uuid"]
+ elif options["--action"] in ["off", "on", "reboot", "status"] \
+ and "--plug" not in options:
+ fail_usage("Failed: You have to enter plug number or machine identification", stop)
+
docs = {}
docs["shortdesc"] = "Fence agent for OpenStack's Nova service"
docs["longdesc"] = "fence_openstack is a Fencing agent \
which can be used with machines controlled by the Openstack's Nova service. \
This agent calls the python-novaclient and it is mandatory to be installed "
docs["vendorurl"] = "https://wiki.openstack.org/wiki/Nova"
show_docs(options, docs)
run_delay(options)
result = fence_action(None, options, set_power_status, get_power_status,None)
sys.exit(result)
if __name__ == "__main__":
main()
diff --git a/tests/data/metadata/fence_openstack.xml b/tests/data/metadata/fence_openstack.xml
index bdc2e1bc..a7b25940 100644
--- a/tests/data/metadata/fence_openstack.xml
+++ b/tests/data/metadata/fence_openstack.xml
@@ -1,157 +1,167 @@
<?xml version="1.0" ?>
<resource-agent name="fence_openstack" shortdesc="Fence agent for OpenStack's Nova service" >
<longdesc>fence_openstack is a Fencing agent which can be used with machines controlled by the Openstack's Nova service. This agent calls the python-novaclient and it is mandatory to be installed </longdesc>
<vendor-url>https://wiki.openstack.org/wiki/Nova</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="auth-url" unique="0" required="1" deprecated="1">
<getopt mixed="--auth-url=[authurl]" />
<content type="string" />
<shortdesc lang="en">Keystone Auth URL</shortdesc>
</parameter>
<parameter name="auth_url" unique="0" required="1" obsoletes="auth-url">
<getopt mixed="--auth-url=[authurl]" />
<content type="string" />
<shortdesc lang="en">Keystone Auth URL</shortdesc>
</parameter>
<parameter name="login" unique="0" required="1" deprecated="1">
<getopt mixed="-l, --username=[name]" />
<content type="string" />
<shortdesc lang="en">Login name</shortdesc>
</parameter>
<parameter name="passwd" unique="0" required="0" deprecated="1">
<getopt mixed="-p, --password=[password]" />
<content type="string" />
<shortdesc lang="en">Login password or passphrase</shortdesc>
</parameter>
<parameter name="passwd_script" unique="0" required="0" deprecated="1">
<getopt mixed="-S, --password-script=[script]" />
<content type="string" />
<shortdesc lang="en">Script to run to retrieve password</shortdesc>
</parameter>
<parameter name="password" unique="0" required="0" obsoletes="passwd">
<getopt mixed="-p, --password=[password]" />
<content type="string" />
<shortdesc lang="en">Login password or passphrase</shortdesc>
</parameter>
<parameter name="password_script" unique="0" required="0" obsoletes="passwd_script">
<getopt mixed="-S, --password-script=[script]" />
<content type="string" />
<shortdesc lang="en">Script to run to retrieve password</shortdesc>
</parameter>
+ <parameter name="plug" unique="0" required="1" obsoletes="port">
+ <getopt mixed="-n, --plug=[UUID]" />
+ <content type="string" />
+ <shortdesc lang="en">UUID of the node to be fenced.</shortdesc>
+ </parameter>
+ <parameter name="port" unique="0" required="1" deprecated="1">
+ <getopt mixed="-n, --plug=[UUID]" />
+ <content type="string" />
+ <shortdesc lang="en">UUID of the node to be fenced.</shortdesc>
+ </parameter>
<parameter name="project-domain-name" unique="0" required="0" deprecated="1">
- <getopt mixed="--project-domain-name=[project-domain]" />
+ <getopt mixed="--project-domain-name=[domain]" />
<content type="string" default="Default" />
<shortdesc lang="en">Keystone Project Domain Name</shortdesc>
</parameter>
<parameter name="project-name" unique="0" required="1" deprecated="1">
<getopt mixed="--project-name=[project]" />
<content type="string" default="admin" />
<shortdesc lang="en">Keystone Project</shortdesc>
</parameter>
<parameter name="project_domain_name" unique="0" required="0" obsoletes="project-domain-name">
- <getopt mixed="--project-domain-name=[project-domain]" />
+ <getopt mixed="--project-domain-name=[domain]" />
<content type="string" default="Default" />
<shortdesc lang="en">Keystone Project Domain Name</shortdesc>
</parameter>
<parameter name="project_name" unique="0" required="1" obsoletes="project-name">
<getopt mixed="--project-name=[project]" />
<content type="string" default="admin" />
<shortdesc lang="en">Keystone Project</shortdesc>
</parameter>
<parameter name="user-domain-name" unique="0" required="0" deprecated="1">
- <getopt mixed="--user-domain-name=[user-domain]" />
+ <getopt mixed="--user-domain-name=[domain]" />
<content type="string" default="Default" />
<shortdesc lang="en">Keystone User Domain Name</shortdesc>
</parameter>
<parameter name="user_domain_name" unique="0" required="0" obsoletes="user-domain-name">
- <getopt mixed="--user-domain-name=[user-domain]" />
+ <getopt mixed="--user-domain-name=[domain]" />
<content type="string" default="Default" />
<shortdesc lang="en">Keystone User Domain Name</shortdesc>
</parameter>
<parameter name="username" unique="0" required="1" obsoletes="login">
<getopt mixed="-l, --username=[name]" />
<content type="string" />
<shortdesc lang="en">Login name</shortdesc>
</parameter>
- <parameter name="uuid" unique="0" required="1">
+ <parameter name="uuid" unique="0" required="0">
<getopt mixed="--uuid=[uuid]" />
<content type="string" />
- <shortdesc lang="en">UUID of the nova instance</shortdesc>
+ <shortdesc lang="en">Replaced by port</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="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="20" />
<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="monitor" />
<action name="metadata" />
<action name="manpage" />
<action name="validate-all" />
</actions>
</resource-agent>

File Metadata

Mime Type
text/x-diff
Expires
Wed, Feb 26, 5:10 PM (3 h, 22 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
1465586
Default Alt Text
(14 KB)

Event Timeline