diff options
Diffstat (limited to 'openstackclient/network/common.py')
| -rw-r--r-- | openstackclient/network/common.py | 199 |
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 |
