Migrating Project Client OSC Plugins to OSC¶
The guide documents the process for migrating project client OSC plugins from
the project client into python-openstackclient. It focuses on neutron client
and clients for special networking services that were previously implemented as
external OSC plugins (e.g., BGP VPN, TaaS, etc.), but it should apply to any
project client’s OSC plugin.
Background¶
Historically, advanced Neutron services provided their CLI commands through
python-neutronclient as OSC plugins. As the old python-xclient libraries
were deprecated and their functionality were moved to python-openstackclient
it was also decided to move these plugins to python-openstackclient, see the
2025 October PTG etherpad:
https://etherpad.opendev.org/p/oct2025-ptg-neutron#L156
These migrated commands become part of the core OSC codebase but are
organized in separate subdirectories under openstackclient/network/v2/
to maintain clear separation and ownership.
Migration Steps¶
1. Create the Command Module Directory¶
Create a new python module under openstackclient/network/v2/ for your
service with appropriate name, for example for tap-as-a-service taas.
2. Migrate the Command Classes¶
Copy or migrate your command implementation files from the neutronclient
plugin to the new directory. Each command should inherit from the appropriate
base class (i.e.: command.Command, command.Lister, or
command.ShowOne).
3. Register Entry Points in pyproject.toml¶
Add entry points for your commands in pyproject.toml under a dedicated
group. The group name should be the same as the module name under
network/v2.
Example for BGP VPN:
[project.entry-points."openstack.network.v2.bgpvpn"]
bgpvpn_create = "openstackclient.network.v2.bgpvpn.bgpvpn:CreateBgpvpn"
bgpvpn_delete = "openstackclient.network.v2.bgpvpn.bgpvpn:DeleteBgpvpn"
bgpvpn_list = "openstackclient.network.v2.bgpvpn.bgpvpn:ListBgpvpn"
bgpvpn_show = "openstackclient.network.v2.bgpvpn.bgpvpn:ShowBgpvpn"
bgpvpn_set = "openstackclient.network.v2.bgpvpn.bgpvpn:SetBgpvpn"
bgpvpn_unset = "openstackclient.network.v2.bgpvpn.bgpvpn:UnsetBgpvpn"
4. Register the Service in API_EXTENSIONS¶
Add your service name to the API_EXTENSIONS tuple in
openstackclient/network/client.py:
API_EXTENSIONS = ('taas', 'bgpvpn', '<your_service>')
This tells OSC to load the entry points from your dedicated group.
5. Ignore the Old Neutronclient Plugin¶
To prevent conflicts with the old neutronclient plugin (if users still have
it installed), add the old plugin module to the IGNORED_MODULES tuple in
openstackclient/shell.py:
IGNORED_MODULES = (
'neutron_taas.taas_client.osc',
'neutronclient.osc.v2.taas',
'neutronclient.osc.v2.networking_bgpvpn',
'neutronclient.osc.v2.<your_old_plugin>',
)
6. Add Unit Tests¶
Create unit tests under openstackclient/tests/unit/network/v2/<service_name>/.