diff --git a/mistral/actions/openstack/actions.py b/mistral/actions/openstack/actions.py index 931aaf98e..cbeb27fb0 100644 --- a/mistral/actions/openstack/actions.py +++ b/mistral/actions/openstack/actions.py @@ -25,6 +25,7 @@ from ironicclient.v1 import client as ironicclient from keystoneclient.auth import identity from keystoneclient import httpclient from keystoneclient.v3 import client as keystoneclient +from magnumclient.v1 import client as magnumclient from mistralclient.api.v2 import client as mistralclient from neutronclient.v2_0 import client as neutronclient from novaclient import client as novaclient @@ -606,3 +607,28 @@ class DesignateAction(base.OpenStackAction): @classmethod def _get_fake_client(cls): return cls._client_class() + + +class MagnumAction(base.OpenStackAction): + _client_class = magnumclient.Client + + def _get_client(self): + ctx = context.ctx() + + LOG.debug("Magnum action security context: %s" % ctx) + + keystone_endpoint = keystone_utils.get_keystone_endpoint_v2() + auth_url = keystone_endpoint.url + magnum_url = keystone_utils.get_endpoint_for_project('magnum').url + + return self._client_class( + magnum_url=magnum_url, + auth_token=ctx.auth_token, + project_id=ctx.project_id, + user_id=ctx.user_id, + auth_url=auth_url + ) + + @classmethod + def _get_fake_client(cls): + return cls._client_class() diff --git a/mistral/actions/openstack/mapping.json b/mistral/actions/openstack/mapping.json index dae21a58a..4a18e2cea 100644 --- a/mistral/actions/openstack/mapping.json +++ b/mistral/actions/openstack/mapping.json @@ -1118,5 +1118,13 @@ "sync_domain": "sync.sync_domain", "sync_record": "sync.sync_record", "touch_domain": "touch.domain" + }, + "magnum": { + "_comment": "It uses magnumclient.v1.", + "baymodels_create": "baymodels.create", + "baymodels_delete": "baymodels.delete", + "baymodels_get": "baymodels.get", + "baymodels_list": "baymodels.list", + "baymodels_update": "baymodels.update" } } diff --git a/mistral/tests/unit/actions/openstack/test_openstack_actions.py b/mistral/tests/unit/actions/openstack/test_openstack_actions.py index 3108cf2c2..526cd2e43 100644 --- a/mistral/tests/unit/actions/openstack/test_openstack_actions.py +++ b/mistral/tests/unit/actions/openstack/test_openstack_actions.py @@ -199,3 +199,15 @@ class OpenStackActionTest(base.BaseTestCase): self.assertTrue(mocked().domain.get.called) mocked().domain.get.assert_called_once_with(domain="example.com") + + @mock.patch.object(actions.MagnumAction, '_get_client') + def test_magnum_action(self, mocked): + method_name = "baymodels.get" + action_class = actions.MagnumAction + action_class.client_method_name = method_name + params = {'id': '1234-abcd'} + action = action_class(**params) + action.run() + + self.assertTrue(mocked().baymodels.get.called) + mocked().baymodels.get.assert_called_once_with(id="1234-abcd") diff --git a/requirements.txt b/requirements.txt index fcb0c8674..65d94c8fe 100644 --- a/requirements.txt +++ b/requirements.txt @@ -30,6 +30,7 @@ python-glanceclient>=2.0.0 # Apache-2.0 python-heatclient>=1.1.0 # Apache-2.0 python-keystoneclient!=1.8.0,!=2.1.0,>=1.7.0 # Apache-2.0 python-mistralclient>=2.0.0 # Apache-2.0 +python-magnumclient>=2.0.0 # Apache-2.0 python-neutronclient>=4.2.0 # Apache-2.0 python-novaclient!=2.33.0,>=2.29.0 # Apache-2.0 python-swiftclient>=2.2.0 # Apache-2.0 diff --git a/tools/get_action_list.py b/tools/get_action_list.py index eea0cf0a5..93c8d999b 100644 --- a/tools/get_action_list.py +++ b/tools/get_action_list.py @@ -31,6 +31,8 @@ from ironicclient.common import base as ironic_base from ironicclient.v1 import client as ironicclient from keystoneclient import base as keystone_base from keystoneclient.v3 import client as keystoneclient +from magnumclient.common import base as magnum_base +from magnumclient.v1 import client as magnumclient from mistralclient.api import base as mistral_base from mistralclient.api.v2 import client as mistralclient from novaclient import base as nova_base @@ -78,6 +80,7 @@ BASE_MISTRAL_MANAGER = mistral_base.ResourceManager BASE_TROVE_MANAGER = trove_base.Manager BASE_IRONIC_MANAGER = ironic_base.Manager BASE_BARBICAN_MANAGER = barbican_base.BaseEntityManager +BASE_MAGNUM_MANAGER = magnum_base.Manager def get_parser(): @@ -181,6 +184,10 @@ def get_designate_client(**kwargs): return designateclient.Client(1) +def get_magnum_client(**kwargs): + return magnumclient.Client() + + CLIENTS = { 'nova': get_nova_client, 'heat': get_heat_client, @@ -192,7 +199,8 @@ CLIENTS = { 'ironic': get_ironic_client, 'barbican': get_barbican_client, 'mistral': get_mistral_client, - 'designate': get_designate_client + 'designate': get_designate_client, + 'magnum': get_magnum_client, # 'neutron': get_nova_client # 'baremetal_introspection': ... # 'swift': ... @@ -210,6 +218,7 @@ BASE_MANAGERS = { 'barbican': BASE_BARBICAN_MANAGER, 'mistral': BASE_MISTRAL_MANAGER, 'designate': None, + 'magnum': BASE_MAGNUM_MANAGER, # 'neutron': BASE_NOVA_MANAGER # 'baremetal_introspection': ... # 'swift': ...