summaryrefslogtreecommitdiff
path: root/openstackclient/network/common.py
diff options
context:
space:
mode:
Diffstat (limited to 'openstackclient/network/common.py')
-rw-r--r--openstackclient/network/common.py199
1 files changed, 101 insertions, 98 deletions
diff --git a/openstackclient/network/common.py b/openstackclient/network/common.py
index d22b2caa..e68628b3 100644
--- a/openstackclient/network/common.py
+++ b/openstackclient/network/common.py
@@ -34,6 +34,10 @@ _required_opt_extensions_map = {
'security_groups': 'security-groups',
}
+_NET_TYPE_NEUTRON = 'neutron'
+_NET_TYPE_COMPUTE = 'nova-network'
+_QUALIFIER_FMT = "%s\n\n*%s*"
+
@contextlib.contextmanager
def check_missing_extension_if_error(client_manager, attrs):
@@ -51,35 +55,87 @@ def check_missing_extension_if_error(client_manager, attrs):
@six.add_metaclass(abc.ABCMeta)
-class NetworkAndComputeCommand(command.Command):
- """Network and Compute Command
+class NetDetectionMixin(object):
+ """Convenience methods for nova-network vs. neutron decisions.
- Command class for commands that support implementation via
- the network or compute endpoint. Such commands have different
- implementations for take_action() and may even have different
- arguments.
- """
+ A live environment detects which network type it is running and creates its
+ parser with only the options relevant to that network type.
- def take_action(self, parsed_args):
- if self.app.client_manager.is_network_endpoint_enabled():
- return self.take_action_network(self.app.client_manager.network,
- parsed_args)
- else:
- return self.take_action_compute(self.app.client_manager.compute,
- parsed_args)
+ But the command classes are used for docs builds as well, and docs must
+ present the options for both network types, often qualified accordingly.
+ """
+ @property
+ def _network_type(self):
+ """Discover whether the running cloud is using neutron or nova-network.
+
+ :return:
+ * ``NET_TYPE_NEUTRON`` if neutron is detected
+ * ``NET_TYPE_COMPUTE`` if running in a cloud but neutron is not
+ detected.
+ * ``None`` if not running in a cloud, which hopefully means we're
+ building docs.
+ """
+ # Have we set it up yet for this command?
+ if not hasattr(self, '_net_type'):
+ # import pdb; pdb.set_trace()
+ try:
+ if self.app.client_manager.is_network_endpoint_enabled():
+ net_type = _NET_TYPE_NEUTRON
+ else:
+ net_type = _NET_TYPE_COMPUTE
+ except AttributeError:
+ LOG.warning(
+ "%s: Could not detect a network type. Assuming we are "
+ "building docs.", self.__class__.__name__)
+ net_type = None
+ self._net_type = net_type
+ return self._net_type
+
+ @property
+ def is_neutron(self):
+ return self._network_type is _NET_TYPE_NEUTRON
+
+ @property
+ def is_nova_network(self):
+ return self._network_type is _NET_TYPE_COMPUTE
+
+ @property
+ def is_docs_build(self):
+ return self._network_type is None
+
+ def enhance_help_neutron(self, _help):
+ if self.is_docs_build:
+ # Why can't we say 'neutron'?
+ return _QUALIFIER_FMT % (_help, _("Network version 2 only"))
+ return _help
+
+ def enhance_help_nova_network(self, _help):
+ if self.is_docs_build:
+ # Why can't we say 'nova-network'?
+ return _QUALIFIER_FMT % (_help, _("Compute version 2 only"))
+ return _help
+
+ @staticmethod
+ def split_help(network_help, compute_help):
+ return (
+ "*%(network_qualifier)s:*\n %(network_help)s\n\n"
+ "*%(compute_qualifier)s:*\n %(compute_help)s" % dict(
+ network_qualifier=_("Network version 2"),
+ network_help=network_help,
+ compute_qualifier=_("Compute version 2"),
+ compute_help=compute_help))
def get_parser(self, prog_name):
LOG.debug('get_parser(%s)', prog_name)
- parser = super(NetworkAndComputeCommand, self).get_parser(prog_name)
+ parser = super(NetDetectionMixin, self).get_parser(prog_name)
parser = self.update_parser_common(parser)
LOG.debug('common parser: %s', parser)
- if (
- self.app is None or
- self.app.client_manager.is_network_endpoint_enabled()
- ):
- return self.update_parser_network(parser)
- else:
- return self.update_parser_compute(parser)
+ if self.is_neutron or self.is_docs_build:
+ parser = self.update_parser_network(parser)
+ if self.is_nova_network or self.is_docs_build:
+ # Add nova-net options if running nova-network or building docs
+ parser = self.update_parser_compute(parser)
+ return parser
def update_parser_common(self, parser):
"""Default is no updates to parser."""
@@ -93,18 +149,36 @@ class NetworkAndComputeCommand(command.Command):
"""Default is no updates to parser."""
return parser
- @abc.abstractmethod
+ def take_action(self, parsed_args):
+ if self.is_neutron:
+ return self.take_action_network(self.app.client_manager.network,
+ parsed_args)
+ elif self.is_nova_network:
+ return self.take_action_compute(self.app.client_manager.compute,
+ parsed_args)
+
def take_action_network(self, client, parsed_args):
"""Override to do something useful."""
pass
- @abc.abstractmethod
def take_action_compute(self, client, parsed_args):
"""Override to do something useful."""
pass
@six.add_metaclass(abc.ABCMeta)
+class NetworkAndComputeCommand(NetDetectionMixin, command.Command):
+ """Network and Compute Command
+
+ Command class for commands that support implementation via
+ the network or compute endpoint. Such commands have different
+ implementations for take_action() and may even have different
+ arguments.
+ """
+ pass
+
+
+@six.add_metaclass(abc.ABCMeta)
class NetworkAndComputeDelete(NetworkAndComputeCommand):
"""Network and Compute Delete
@@ -149,7 +223,7 @@ class NetworkAndComputeDelete(NetworkAndComputeCommand):
@six.add_metaclass(abc.ABCMeta)
-class NetworkAndComputeLister(command.Lister):
+class NetworkAndComputeLister(NetDetectionMixin, command.Lister):
"""Network and Compute Lister
Lister class for commands that support implementation via
@@ -157,50 +231,11 @@ class NetworkAndComputeLister(command.Lister):
implementations for take_action() and may even have different
arguments.
"""
-
- def take_action(self, parsed_args):
- if self.app.client_manager.is_network_endpoint_enabled():
- return self.take_action_network(self.app.client_manager.network,
- parsed_args)
- else:
- return self.take_action_compute(self.app.client_manager.compute,
- parsed_args)
-
- def get_parser(self, prog_name):
- LOG.debug('get_parser(%s)', prog_name)
- parser = super(NetworkAndComputeLister, self).get_parser(prog_name)
- parser = self.update_parser_common(parser)
- LOG.debug('common parser: %s', parser)
- if self.app.client_manager.is_network_endpoint_enabled():
- return self.update_parser_network(parser)
- else:
- return self.update_parser_compute(parser)
-
- def update_parser_common(self, parser):
- """Default is no updates to parser."""
- return parser
-
- def update_parser_network(self, parser):
- """Default is no updates to parser."""
- return parser
-
- def update_parser_compute(self, parser):
- """Default is no updates to parser."""
- return parser
-
- @abc.abstractmethod
- def take_action_network(self, client, parsed_args):
- """Override to do something useful."""
- pass
-
- @abc.abstractmethod
- def take_action_compute(self, client, parsed_args):
- """Override to do something useful."""
- pass
+ pass
@six.add_metaclass(abc.ABCMeta)
-class NetworkAndComputeShowOne(command.ShowOne):
+class NetworkAndComputeShowOne(NetDetectionMixin, command.ShowOne):
"""Network and Compute ShowOne
ShowOne class for commands that support implementation via
@@ -222,35 +257,3 @@ class NetworkAndComputeShowOne(command.ShowOne):
if exc.details:
msg += ", " + six.text_type(exc.details)
raise exceptions.CommandError(msg)
-
- def get_parser(self, prog_name):
- LOG.debug('get_parser(%s)', prog_name)
- parser = super(NetworkAndComputeShowOne, self).get_parser(prog_name)
- parser = self.update_parser_common(parser)
- LOG.debug('common parser: %s', parser)
- if self.app.client_manager.is_network_endpoint_enabled():
- return self.update_parser_network(parser)
- else:
- return self.update_parser_compute(parser)
-
- def update_parser_common(self, parser):
- """Default is no updates to parser."""
- return parser
-
- def update_parser_network(self, parser):
- """Default is no updates to parser."""
- return parser
-
- def update_parser_compute(self, parser):
- """Default is no updates to parser."""
- return parser
-
- @abc.abstractmethod
- def take_action_network(self, client, parsed_args):
- """Override to do something useful."""
- pass
-
- @abc.abstractmethod
- def take_action_compute(self, client, parsed_args):
- """Override to do something useful."""
- pass