Commit 9ac99fda authored by Guido Trotter's avatar Guido Trotter
Browse files

Add gnt-backup remove functionality

This patch also fixes the LUExportInstance Prereq docstring.

Reviewed-by: iustinp
parent 054a8696
......@@ -4436,7 +4436,7 @@ class LUExportInstance(LogicalUnit):
def CheckPrereq(self):
"""Check prerequisites.
This checks that the instance name is a valid one.
This checks that the instance and node names are valid.
"""
instance_name = self.cfg.ExpandInstanceName(self.op.instance_name)
......@@ -4523,6 +4523,45 @@ class LUExportInstance(LogicalUnit):
" on node %s" % (instance.name, node))
class LURemoveExport(NoHooksLU):
"""Remove exports related to the named instance.
"""
_OP_REQP = ["instance_name"]
def CheckPrereq(self):
"""Check prerequisites.
"""
pass
def Exec(self, feedback_fn):
"""Remove any export.
"""
instance_name = self.cfg.ExpandInstanceName(self.op.instance_name)
# If the instance was not found we'll try with the name that was passed in.
# This will only work if it was an FQDN, though.
fqdn_warn = False
if not instance_name:
fqdn_warn = True
instance_name = self.op.instance_name
op = opcodes.OpQueryExports(nodes=[])
exportlist = self.proc.ChainOpCode(op)
found = False
for node in exportlist:
if instance_name in exportlist[node]:
found = True
if not rpc.call_export_remove(node, instance_name):
logger.Error("could not remove export for instance %s"
" on node %s" % (instance_name, node))
if fqdn_warn and not found:
feedback_fn("Export not found. If trying to remove an export belonging"
" to a deleted instance please use its Fully Qualified"
" Domain Name.")
class TagsLU(NoHooksLU):
"""Generic tags LU.
......
......@@ -80,6 +80,7 @@ class Processor(object):
# exports lu
opcodes.OpQueryExports: cmdlib.LUQueryExports,
opcodes.OpExportInstance: cmdlib.LUExportInstance,
opcodes.OpRemoveExport: cmdlib.LURemoveExport,
# tags lu
opcodes.OpGetTags: cmdlib.LUGetTags,
opcodes.OpSearchTags: cmdlib.LUSearchTags,
......
......@@ -395,6 +395,10 @@ class OpExportInstance(OpCode):
OP_ID = "OP_BACKUP_EXPORT"
__slots__ = ["instance_name", "target_node", "shutdown"]
class OpRemoveExport(OpCode):
"""Remove an instance's export."""
OP_ID = "OP_BACKUP_REMOVE"
__slots__ = ["instance_name"]
# Tags opcodes
class OpGetTags(OpCode):
......
......@@ -105,6 +105,25 @@ def ImportInstance(opts, args):
return 0
def RemoveExport(opts, args):
"""Remove an export from the cluster.
Args:
opts - class with options as members
args - list with a single element, the exported instance to remove
Opts used:
Returns:
1 in case of error, 0 otherwise
"""
instance = args[0]
op = opcodes.OpRemoveExport(instance_name=args[0])
SubmitOpCode(op)
return 0
# this is defined separately due to readability only
import_opts = [
DEBUG_OPT,
......@@ -162,6 +181,10 @@ commands = {
"Exports an instance to an image"),
'import': (ImportInstance, ARGS_ONE, import_opts, "[opts...] <name>",
"Imports an instance from an exported image"),
'remove': (RemoveExport, ARGS_ONE,
[DEBUG_OPT],
"<name>",
"Remove exports of named instance from the filesystem."),
}
if __name__ == '__main__':
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment