diff --git a/doc/source/devref/mano_api.rst b/doc/source/devref/mano_api.rst index e9a10b92d..efd08a3d3 100644 --- a/doc/source/devref/mano_api.rst +++ b/doc/source/devref/mano_api.rst @@ -58,7 +58,7 @@ List vnfds - List vnfds stored in the VNF catalog. "description": "OpenWRT with services", "tenant_id": "4dd6c1d7b6c94af980ca886495bcfed0", "mgmt_driver": "openwrt", - "infra_driver": "heat", + "infra_driver": "", "attributes": { "vnfd": "template_name: OpenWRT\r\ndescription: template_description " @@ -87,7 +87,7 @@ Show vnfd - Show information for a specified vnfd id. "description": "OpenWRT with services", "tenant_id": "4dd6c1d7b6c94af980ca886495bcfed0", "mgmt_driver": "openwrt", - "infra_driver": "heat", + "infra_driver": "", "attributes": { "vnfd": "template_name: OpenWRT\r\ndescription: template_description " @@ -116,8 +116,6 @@ Create vnfd - Create a vnfd entry based on the vnfd template. "service_types": [{"service_type": "vnfd"}], "tenant_id": "bb6a3be1021a4746ab727a6c9296e797", "description": "OpenWRT router", - "mgmt_driver": "noop", - "infra_driver": "heat", "attributes": { "vnfd": "template_name: sample-vnfd\ndescription: demo-example\n\nservice_properties:\n Id: sample-vnfd\n vendor: tacker\n version: 1\n\nvdus:\n vdu1:\n id: vdu1\n vm_image: cirros-0.3.4-x86_64-uec\n instance_type: m1.tiny\n\n network_interfaces:\n management:\n network: net_mgmt\n management: true\n pkt_in:\n network: net0\n pkt_out:\n network: net1\n\n placement_policy:\n availability_zone: nova\n\n auto-scaling: noop\n\n config:\n param0: key0\n param1: key1\n" }, @@ -139,7 +137,7 @@ Create vnfd - Create a vnfd entry based on the vnfd template. "description": "OpenWRT router", "tenant_id": "4dd6c1d7b6c94af980ca886495bcfed0", "mgmt_driver": "noop", - "infra_driver": "heat", + "infra_driver": "", "attributes": { "vnfd": "template_name: OpenWRT \r\ndescription: template_description " diff --git a/etc/config-generator.conf b/etc/config-generator.conf index 33046532d..1913d2d12 100644 --- a/etc/config-generator.conf +++ b/etc/config-generator.conf @@ -10,6 +10,7 @@ namespace = tacker.vnfm.monitor namespace = tacker.vnfm.plugin namespace = tacker.vnfm.vim_client namespace = tacker.vnfm.infra_drivers.heat.heat +namespace = tacker.vnfm.infra_drivers.openstack.openstack namespace = tacker.vnfm.mgmt_drivers.openwrt.openwrt namespace = tacker.vnfm.monitor_drivers.http_ping.http_ping namespace = tacker.vnfm.monitor_drivers.ping.ping diff --git a/setup.cfg b/setup.cfg index 85b95440c..630f2dc01 100644 --- a/setup.cfg +++ b/setup.cfg @@ -50,7 +50,8 @@ tacker.openstack.common.cache.backends = tacker.tacker.device.drivers = noop = tacker.vnfm.infra_drivers.noop:DeviceNoop nova = tacker.vnfm.infra_drivers.nova.nova:DeviceNova - heat = tacker.vnfm.infra_drivers.heat.heat:DeviceHeat + heat = tacker.vnfm.infra_drivers.vim_heat.vim_heat:VimHeat + openstack = tacker.vnfm.infra_drivers.openstack.openstack:OpenStack tacker.tacker.mgmt.drivers = noop = tacker.vnfm.mgmt_drivers.noop:DeviceMgmtNoop openwrt = tacker.vnfm.mgmt_drivers.openwrt.openwrt:DeviceMgmtOpenWRT @@ -66,7 +67,8 @@ oslo.config.opts = tacker.vnfm.monitor = tacker.vnfm.monitor:config_opts tacker.vnfm.plugin = tacker.vm.plugin:config_opts tacker.vnfm.vim_client = tacker.vnfm.vim_client:config_opts - tacker.vnfm.infra_drivers.heat.heat= tacker.vnfm.infra_drivers.heat.heat:config_opts + tacker.vnfm.infra_drivers.heat.heat= tacker.vnfm.infra_drivers.vim_heat.vim_heat:config_opts + tacker.vnfm.infra_drivers.openstack.openstack= tacker.vnfm.infra_drivers.openstack.openstack:config_opts tacker.vnfm.mgmt_drivers.openwrt.openwrt = tacker.vnfm.mgmt_drivers.openwrt.openwrt:config_opts tacker.vnfm.monitor_drivers.http_ping.http_ping = tacker.vnfm.monitor_drivers.http_ping.http_ping:config_opts tacker.vnfm.monitor_drivers.ping.ping = tacker.vnfm.monitor_drivers.ping.ping:config_opts diff --git a/tacker/db/vm/vm_db.py b/tacker/db/vm/vm_db.py index 03b58e4f7..71cdc661b 100644 --- a/tacker/db/vm/vm_db.py +++ b/tacker/db/vm/vm_db.py @@ -17,7 +17,6 @@ import uuid from oslo_log import log as logging -from oslo_log import versionutils from oslo_utils import timeutils import sqlalchemy as sa @@ -230,19 +229,6 @@ class VNFMPluginDb(vnfm.VNFMPluginBase, db_base.CommonDbMixin): mgmt_driver = vnfd.get('mgmt_driver') service_types = vnfd.get('service_types') - if 'infra_driver' in vnfd or 'mgmt_driver' in vnfd: - versionutils.report_deprecated_feature(LOG, "Deriving " - "infra_driver and mgmt_driver from VNFD API is deprecated and" - " will be removed in Ocata. infra_driver will be automatically" - " derived from target vim type. mgmt_driver will be derived " - "from TOSCA template values.") - - if (not attributes.is_attr_set(infra_driver)): - LOG.debug(_('hosting vnf driver unspecified')) - raise vnfm.InfraDriverNotSpecified() - if (not attributes.is_attr_set(mgmt_driver)): - LOG.debug(_('mgmt driver unspecified')) - raise vnfm.MGMTDriverNotSpecified() if (not attributes.is_attr_set(service_types)): LOG.debug(_('service types unspecified')) raise vnfm.ServiceTypesNotSpecified() diff --git a/tacker/extensions/vnfm.py b/tacker/extensions/vnfm.py index 75cbaf78a..9dfe7a8e2 100644 --- a/tacker/extensions/vnfm.py +++ b/tacker/extensions/vnfm.py @@ -56,7 +56,7 @@ class VNFInUse(exceptions.InUse): class InvalidInfraDriver(exceptions.InvalidInput): - message = _('invalid name for infra driver %(infra_driver)s') + message = _('VIM type %(vim_name)s is not supported as a infra driver ') class InvalidServiceType(exceptions.InvalidInput): @@ -220,14 +220,14 @@ RESOURCE_ATTRIBUTE_MAP = { 'allow_put': False, 'validate': {'type:string': None}, 'is_visible': True, - 'default': attr.ATTR_NOT_SPECIFIED, + 'default': "", }, 'mgmt_driver': { 'allow_post': True, 'allow_put': False, 'validate': {'type:string': None}, 'is_visible': True, - 'default': attr.ATTR_NOT_SPECIFIED, + 'default': "", }, 'attributes': { 'allow_post': True, diff --git a/tacker/tests/unit/db/utils.py b/tacker/tests/unit/db/utils.py index 098592d3a..6a7aa6da0 100644 --- a/tacker/tests/unit/db/utils.py +++ b/tacker/tests/unit/db/utils.py @@ -25,7 +25,7 @@ def _get_template(name): f = codecs.open(filename, encoding='utf-8', errors='strict') return f.read() -vnfd_openwrt = _get_template('openwrt.yaml') +vnfd_openwrt = _get_template('test_tosca_openwrt.yaml') vnfd_ipparams_template = _get_template('vnf_cirros_template_ipaddr.yaml') ipparams = _get_template('vnf_cirros_param_values_ipaddr.yaml') vnfd_userdata_template = _get_template('vnf_cirros_template_user_data.yaml') @@ -42,7 +42,6 @@ def get_dummy_vnfd_obj(): 'name': 'dummy_vnfd', 'tenant_id': u'ad7ebc56538745a08ef7c5e97f8bd437', u'mgmt_driver': u'noop', - u'infra_driver': u'fake_driver', u'attributes': {u'vnfd': yaml.safe_load(vnfd_openwrt)}, 'description': 'dummy_vnfd_description'}, u'auth': {u'tenantName': u'admin', u'passwordCredentials': { @@ -73,7 +72,6 @@ def get_dummy_device_obj(): 'description': u'OpenWRT with services', 'tenant_id': u'ad7ebc56538745a08ef7c5e97f8bd437', 'mgmt_driver': u'openwrt', - 'infra_driver': u'heat', 'attributes': {u'vnfd': vnfd_openwrt}, 'id': u'fb048660-dc1b-4f0f-bd89-b023666650ec', 'name': u'openwrt_services'}, @@ -92,7 +90,6 @@ def get_dummy_device_obj_config_attr(): 'description': u'OpenWRT with services', 'tenant_id': u'ad7ebc56538745a08ef7c5e97f8bd437', 'mgmt_driver': u'openwrt', - 'infra_driver': u'heat', 'attributes': {u'vnfd': vnfd_openwrt}, 'id': u'fb048660-dc1b-4f0f-bd89-b023666650ec', 'name': u'openwrt_services'}, 'mgmt_url': None, 'service_context': [], @@ -126,7 +123,6 @@ def get_dummy_device_obj_ipaddr_attr(): 'description': u'Parameterized VNF descriptor for IP addresses', 'tenant_id': u'4dd6c1d7b6c94af980ca886495bcfed0', 'mgmt_driver': u'noop', - 'infra_driver': u'heat', 'attributes': {u'vnfd': vnfd_ipparams_template}, 'id': u'24c31ea1-2e28-4de2-a6cb-8d389a502c75', 'name': u'ip_vnfd'}, 'name': u'test_ip', @@ -152,7 +148,6 @@ def get_dummy_device_obj_userdata_attr(): 'description': u"Parameterized VNF descriptor", 'tenant_id': u'8273659b56fc46b68bd05856d1f08d14', 'mgmt_driver': u'noop', - 'infra_driver': u'heat', 'attributes': {u'vnfd': vnfd_userdata_template}, 'id': u'206e343f-c580-4494-a739-525849edab7f', 'name': u'cirros_user_data'}, 'mgmt_url': None, 'service_context': [], diff --git a/tacker/tests/unit/vm/infra_drivers/heat/test_heat.py b/tacker/tests/unit/vm/infra_drivers/heat/test_heat.py index ca89060c2..841ae377e 100644 --- a/tacker/tests/unit/vm/infra_drivers/heat/test_heat.py +++ b/tacker/tests/unit/vm/infra_drivers/heat/test_heat.py @@ -23,7 +23,7 @@ from tacker import context from tacker.extensions import vnfm from tacker.tests.unit import base from tacker.tests.unit.db import utils -from tacker.vnfm.infra_drivers.heat import heat +from tacker.vnfm.infra_drivers.openstack import openstack class FakeHeatClient(mock.Mock): @@ -47,17 +47,17 @@ def _get_template(name): return f.read() -class TestDeviceHeat(base.TestCase): - hot_template = _get_template('hot_openwrt.yaml') +class TestOpenStack(base.TestCase): + hot_template = _get_template('hot_tosca_openwrt.yaml') hot_param_template = _get_template('hot_openwrt_params.yaml') hot_ipparam_template = _get_template('hot_openwrt_ipparams.yaml') - vnfd_openwrt = _get_template('openwrt.yaml') + vnfd_openwrt = _get_template('test_tosca_openwrt.yaml') config_data = _get_template('config_data.yaml') def setUp(self): - super(TestDeviceHeat, self).setUp() + super(TestOpenStack, self).setUp() self.context = context.get_admin_context() - self.heat_driver = heat.DeviceHeat() + self.infra_driver = openstack.OpenStack() self._mock_heat_client() self.addCleanup(mock.patch.stopall) @@ -66,7 +66,8 @@ class TestDeviceHeat(base.TestCase): fake_heat_client = mock.Mock() fake_heat_client.return_value = self.heat_client self._mock( - 'tacker.vnfm.infra_drivers.heat.heat.HeatClient', fake_heat_client) + 'tacker.vnfm.infra_drivers.openstack.openstack.HeatClient', + fake_heat_client) def _mock(self, target, new=mock.DEFAULT): patcher = mock.patch(target, new) @@ -83,19 +84,20 @@ class TestDeviceHeat(base.TestCase): def _get_expected_fields(self): return {'stack_name': - 'tacker.vnfm.infra_drivers.heat.heat_DeviceHeat-eb84260e' - '-5ff7-4332-b032-50a14d6c1123', 'template': self.hot_template} + 'tacker.vnfm.infra_drivers.openstack.openstack_OpenStack' + '-eb84260e-5ff7-4332-b032-50a14d6c1123', 'template': + self.hot_template} def _get_expected_fields_user_data(self): return {'stack_name': - 'tacker.vnfm.infra_drivers.heat.heat_DeviceHeat-18685f68' - '-2b2a-4185-8566-74f54e548811', + 'tacker.vnfm.infra_drivers.openstack.openstack_OpenStack' + '-18685f68-2b2a-4185-8566-74f54e548811', 'template': self.hot_param_template} def _get_expected_fields_ipaddr_data(self): return {'stack_name': - 'tacker.vnfm.infra_drivers.heat.heat_DeviceHeat-d1337add' - '-d5a1-4fd4-9447-bb9243c8460b', + 'tacker.vnfm.infra_drivers.openstack.openstack_OpenStack' + '-d1337add-d5a1-4fd4-9447-bb9243c8460b', 'template': self.hot_ipparam_template} def _get_expected_vnf_wait_obj(self, param_values=''): @@ -111,7 +113,6 @@ class TestDeviceHeat(base.TestCase): 'description': u'OpenWRT with services', 'tenant_id': u'ad7ebc56538745a08ef7c5e97f8bd437', 'mgmt_driver': u'openwrt', - 'infra_driver': u'heat', 'attributes': {u'vnfd': self.vnfd_openwrt}, 'id': u'fb048660-dc1b-4f0f-bd89-b023666650ec', 'name': u'openwrt_services'}, @@ -130,7 +131,6 @@ class TestDeviceHeat(base.TestCase): u'4a4c2d44-8a52-4895-9a75-9d1c76c3e738'}], 'description': u'OpenWRT with services', 'tenant_id': u'ad7ebc56538745a08ef7c5e97f8bd437', 'mgmt_driver': u'openwrt', - 'infra_driver': u'heat', 'attributes': {u'vnfd': self.vnfd_openwrt}, 'id': u'fb048660-dc1b-4f0f-bd89-b023666650ec', 'name': u'openwrt_services'}, 'mgmt_url': None, 'service_context': [], @@ -170,7 +170,7 @@ class TestDeviceHeat(base.TestCase): vnf_obj = utils.get_dummy_device_obj() expected_result = '4a4c2d44-8a52-4895-9a75-9d1c76c3e738' expected_fields = self._get_expected_fields() - result = self.heat_driver.create(plugin=None, context=self.context, + result = self.infra_driver.create(plugin=None, context=self.context, vnf=vnf_obj, auth_attr=utils.get_vim_auth_obj()) self.heat_client.create.assert_called_once_with(expected_fields) @@ -180,7 +180,7 @@ class TestDeviceHeat(base.TestCase): vnf_obj = utils.get_dummy_device_obj_userdata_attr() expected_result = '4a4c2d44-8a52-4895-9a75-9d1c76c3e738' expected_fields = self._get_expected_fields_user_data() - result = self.heat_driver.create(plugin=None, context=self.context, + result = self.infra_driver.create(plugin=None, context=self.context, vnf=vnf_obj, auth_attr=utils.get_vim_auth_obj()) self.heat_client.create.assert_called_once_with(expected_fields) @@ -190,7 +190,7 @@ class TestDeviceHeat(base.TestCase): vnf_obj = utils.get_dummy_device_obj_ipaddr_attr() expected_result = '4a4c2d44-8a52-4895-9a75-9d1c76c3e738' expected_fields = self._get_expected_fields_ipaddr_data() - result = self.heat_driver.create(plugin=None, context=self.context, + result = self.infra_driver.create(plugin=None, context=self.context, vnf=vnf_obj, auth_attr=utils.get_vim_auth_obj()) self.heat_client.create.assert_called_once_with(expected_fields) @@ -200,7 +200,7 @@ class TestDeviceHeat(base.TestCase): vnf_obj = utils.get_dummy_device_obj() expected_result = self._get_expected_vnf_wait_obj() vnf_id = '4a4c2d44-8a52-4895-9a75-9d1c76c3e738' - self.heat_driver.create_wait(plugin=None, + self.infra_driver.create_wait(plugin=None, context=self.context, vnf_dict=vnf_obj, vnf_id=vnf_id, @@ -209,7 +209,7 @@ class TestDeviceHeat(base.TestCase): def test_delete(self): vnf_id = '4a4c2d44-8a52-4895-9a75-9d1c76c3e738' - self.heat_driver.delete(plugin=None, context=self.context, + self.infra_driver.delete(plugin=None, context=self.context, vnf_id=vnf_id, auth_attr=utils.get_vim_auth_obj()) self.heat_client.delete.assert_called_once_with(vnf_id) @@ -219,22 +219,16 @@ class TestDeviceHeat(base.TestCase): vnf_config_obj = utils.get_dummy_device_update_config_attr() expected_vnf_update = self._get_expected_vnf_update_obj() vnf_id = '4a4c2d44-8a52-4895-9a75-9d1c76c3e738' - self.heat_driver.update(plugin=None, context=self.context, + self.infra_driver.update(plugin=None, context=self.context, vnf_id=vnf_id, vnf_dict=vnf_obj, vnf=vnf_config_obj, auth_attr=utils.get_vim_auth_obj()) self.assertEqual(expected_vnf_update, vnf_obj) - def test_create_vnfd_pre_tosca(self): - tosca_tpl = _get_template('test_tosca_openwrt.yaml') - dtemplate = self._get_vnfd(tosca_tpl) - exp_tmpl = self._get_expected_vnfd(tosca_tpl) - self.heat_driver.create_vnfd_pre(None, None, dtemplate) - self.assertEqual(exp_tmpl, dtemplate) - def _get_expected_fields_tosca(self, template): return {'stack_name': - 'tacker.vnfm.infra_drivers.heat.heat_DeviceHeat-eb84260e' + 'tacker.vnfm.infra_drivers.openstack.openstack_OpenStack' + '-eb84260e' '-5ff7-4332-b032-50a14d6c1123', 'template': _get_template(template)} @@ -299,7 +293,7 @@ class TestDeviceHeat(base.TestCase): hot_tpl_name, input_params, is_monitor) - result = self.heat_driver.create(plugin=None, context=self.context, + result = self.infra_driver.create(plugin=None, context=self.context, vnf=vnf, auth_attr=utils.get_vim_auth_obj()) actual_fields = self.heat_client.create.call_args[0][0] @@ -436,7 +430,7 @@ class TestDeviceHeat(base.TestCase): vnf_obj = self._get_expected_active_vnf() print(vnf_obj) self.assertRaises(vnfm.InfraDriverUnreachable, - self.heat_driver.get_resource_info, + self.infra_driver.get_resource_info, plugin=None, context=self.context, vnf_info=vnf_obj, auth_attr=utils.get_vim_auth_obj(), region_name=None) diff --git a/tacker/tests/unit/vm/test_plugin.py b/tacker/tests/unit/vm/test_plugin.py index e53d5b652..b4e90951c 100644 --- a/tacker/tests/unit/vm/test_plugin.py +++ b/tacker/tests/unit/vm/test_plugin.py @@ -16,6 +16,7 @@ import uuid import mock +import yaml from tacker import context from tacker.db.common_services import common_services_db @@ -88,7 +89,7 @@ class TestVNFMPlugin(db_base.SqlTestCase): 'vim_name': 'fake_vim', 'vim_auth': {'auth_url': 'http://localhost:5000', 'password': 'test_pw', 'username': 'test_user', 'project_name': - 'test_project'}} + 'test_project'}, 'vim_type': 'test_vim'} self.vim_client.get_vim.return_value = vim_obj def _mock_green_pool(self): @@ -141,7 +142,7 @@ class TestVNFMPlugin(db_base.SqlTestCase): tenant_id='ad7ebc56538745a08ef7c5e97f8bd437', name='fake_vim', description='fake_vim_description', - type='openstack', + type='test_vim', status='Active', placement_attr={'regions': ['RegionOne']}) vim_auth_db = nfvo_db.VimAuth( @@ -155,21 +156,30 @@ class TestVNFMPlugin(db_base.SqlTestCase): session.add(vim_auth_db) session.flush() - def test_create_vnfd(self): + @mock.patch('tacker.vm.plugin.toscautils.updateimports') + @mock.patch('tacker.vm.plugin.ToscaTemplate') + @mock.patch('tacker.vm.plugin.toscautils.get_mgmt_driver') + def test_create_vnfd(self, mock_get_mgmt_driver, mock_tosca_template, + mock_update_imports): + mock_get_mgmt_driver.return_value = 'dummy_mgmt_driver' + mock_tosca_template.return_value = mock.ANY + vnfd_obj = utils.get_dummy_vnfd_obj() result = self.vnfm_plugin.create_vnfd(self.context, vnfd_obj) self.assertIsNotNone(result) self.assertIn('id', result) + self.assertEqual('dummy_vnfd', result['name']) + self.assertEqual('dummy_vnfd_description', result['description']) + self.assertEqual('dummy_mgmt_driver', result['mgmt_driver']) self.assertIn('service_types', result) self.assertIn('attributes', result) self.assertIn('created_at', result) self.assertIn('updated_at', result) - self._device_manager.invoke.assert_called_once_with( - mock.ANY, - mock.ANY, - plugin=mock.ANY, - context=mock.ANY, - vnfd=mock.ANY) + yaml_dict = yaml.safe_load(utils.vnfd_openwrt) + mock_tosca_template.assert_called_once_with( + a_file=False, yaml_dict_tpl=yaml_dict) + mock_get_mgmt_driver.assert_called_once_with(mock.ANY) + mock_update_imports.assert_called_once_with(yaml_dict) self._cos_db_plugin.create_event.assert_called_once_with( self.context, evt_type=constants.RES_EVT_CREATE, res_id=mock.ANY, res_state=constants.RES_EVT_VNFD_NA_STATE, @@ -182,13 +192,6 @@ class TestVNFMPlugin(db_base.SqlTestCase): self.vnfm_plugin.create_vnfd, self.context, vnfd_obj) - def test_create_vnfd_no_mgmt_driver(self): - vnfd_obj = utils.get_dummy_vnfd_obj() - vnfd_obj['vnfd'].pop('mgmt_driver') - self.assertRaises(vnfm.MGMTDriverNotSpecified, - self.vnfm_plugin.create_vnfd, - self.context, vnfd_obj) - def test_create_vnf(self): self._insert_dummy_device_template() vnf_obj = utils.get_dummy_vnf_obj() @@ -201,7 +204,8 @@ class TestVNFMPlugin(db_base.SqlTestCase): self.assertIn('mgmt_url', result) self.assertIn('created_at', result) self.assertIn('updated_at', result) - self._device_manager.invoke.assert_called_with(mock.ANY, mock.ANY, + self._device_manager.invoke.assert_called_with('test_vim', + 'create', plugin=mock.ANY, context=mock.ANY, vnf=mock.ANY, @@ -233,7 +237,7 @@ class TestVNFMPlugin(db_base.SqlTestCase): dummy_device_obj = self._insert_dummy_device() self.vnfm_plugin.delete_vnf(self.context, dummy_device_obj[ 'id']) - self._device_manager.invoke.assert_called_with(mock.ANY, mock.ANY, + self._device_manager.invoke.assert_called_with('test_vim', 'delete', plugin=mock.ANY, context=mock.ANY, vnf_id=mock.ANY, @@ -241,7 +245,8 @@ class TestVNFMPlugin(db_base.SqlTestCase): region_name=mock.ANY) self._vnf_monitor.delete_hosting_vnf.assert_called_with(mock.ANY) self._pool.spawn_n.assert_called_once_with(mock.ANY, mock.ANY, - mock.ANY, mock.ANY) + mock.ANY, mock.ANY, + mock.ANY) self._cos_db_plugin.create_event.assert_called_with( self.context, evt_type=constants.RES_EVT_DELETE, res_id=mock.ANY, res_state=mock.ANY, res_type=constants.RES_TYPE_VNF, @@ -261,7 +266,8 @@ class TestVNFMPlugin(db_base.SqlTestCase): self.assertIn('mgmt_url', result) self.assertIn('updated_at', result) self._pool.spawn_n.assert_called_once_with(mock.ANY, mock.ANY, - mock.ANY, mock.ANY) + mock.ANY, mock.ANY, + mock.ANY) self._cos_db_plugin.create_event.assert_called_with( self.context, evt_type=constants.RES_EVT_UPDATE, res_id=mock.ANY, res_state=mock.ANY, res_type=constants.RES_TYPE_VNF, diff --git a/tacker/tests/unit/vm/test_vim_client.py b/tacker/tests/unit/vm/test_vim_client.py index f9119ce07..c6bb183ae 100644 --- a/tacker/tests/unit/vm/test_vim_client.py +++ b/tacker/tests/unit/vm/test_vim_client.py @@ -26,7 +26,7 @@ class TestVIMClient(base.TestCase): def setUp(self): super(TestVIMClient, self).setUp() self.vim_info = {'id': 'aaaa', 'name': 'VIM0', - 'auth_cred': {'password': '****'}} + 'auth_cred': {'password': '****'}, 'type': 'test_vim'} def test_get_vim_without_defined_default_vim(self): cfg.CONF.set_override( diff --git a/tacker/vm/plugin.py b/tacker/vm/plugin.py index 3e4dfb032..c5558e8cb 100644 --- a/tacker/vm/plugin.py +++ b/tacker/vm/plugin.py @@ -23,6 +23,7 @@ from oslo_config import cfg from oslo_log import log as logging from oslo_log import versionutils from oslo_utils import excutils +from toscaparser.tosca_template import ToscaTemplate from tacker._i18n import _LE from tacker.api.v1 import attributes @@ -34,6 +35,7 @@ from tacker.extensions import vnfm from tacker.plugins.common import constants from tacker.vnfm.mgmt_drivers import constants as mgmt_constants from tacker.vnfm import monitor +from tacker.vnfm.tosca import utils as toscautils from tacker.vnfm import vim_client LOG = logging.getLogger(__name__) @@ -112,7 +114,7 @@ class VNFMPlugin(vm_db.VNFMPluginDb, VNFMMgmtMixin): """ OPTS = [ cfg.ListOpt( - 'infra_driver', default=['nova', 'heat', 'noop'], + 'infra_driver', default=['nova', 'heat', 'noop', 'openstack'], help=_('Hosting vnf drivers tacker plugin will use')), ] cfg.CONF.register_opts(OPTS, 'tacker') @@ -149,16 +151,12 @@ class VNFMPlugin(vm_db.VNFMPluginDb, VNFMMgmtMixin): LOG.debug(_('vnfd %s'), vnfd_data) - infra_driver = vnfd_data.get('infra_driver') - if not attributes.is_attr_set(infra_driver): - LOG.debug(_('hosting vnf driver must be specified')) - raise vnfm.InfraDriverNotSpecified() - if infra_driver not in self._vnf_manager: - LOG.debug(_('unknown hosting vnf driver ' - '%(infra_driver)s in %(drivers)s'), - {'infra_driver': infra_driver, - 'drivers': cfg.CONF.tacker.infra_driver}) - raise vnfm.InvalidInfraDriver(infra_driver=infra_driver) + if 'infra_driver' in vnfd_data or 'mgmt_driver' in vnfd_data: + versionutils.report_deprecated_feature(LOG, "Deriving " + "infra_driver and mgmt_driver from VNFD API is deprecated and" + " will be removed in Ocata. infra_driver will be automatically" + " derived from target vim type. mgmt_driver will be derived " + "from TOSCA template values.") service_types = vnfd_data.get('service_types') if not attributes.is_attr_set(service_types): @@ -170,13 +168,68 @@ class VNFMPlugin(vm_db.VNFMPluginDb, VNFMMgmtMixin): # so doesn't check it here yet. pass - self._vnf_manager.invoke( - infra_driver, 'create_vnfd_pre', plugin=self, - context=context, vnfd=vnfd) - + self._parse_template_input(vnfd) return super(VNFMPlugin, self).create_vnfd( context, vnfd) + def _parse_template_input(self, vnfd): + vnfd_dict = vnfd['vnfd'] + vnfd_yaml = vnfd_dict['attributes'].get('vnfd') + if vnfd_yaml is None: + return + + inner_vnfd_dict = yaml.load(vnfd_yaml) + LOG.debug(_('vnfd_dict: %s'), inner_vnfd_dict) + + if 'tosca_definitions_version' in inner_vnfd_dict: + # Prepend the tacker_defs.yaml import file with the full + # path to the file + toscautils.updateimports(inner_vnfd_dict) + + try: + tosca = ToscaTemplate(a_file=False, + yaml_dict_tpl=inner_vnfd_dict) + except Exception as e: + LOG.exception(_("tosca-parser error: %s"), str(e)) + raise vnfm.ToscaParserFailed(error_msg_details=str(e)) + + if ('description' not in vnfd_dict or + vnfd_dict['description'] == ''): + vnfd_dict['description'] = inner_vnfd_dict.get( + 'description', '') + if (('name' not in vnfd_dict or + not len(vnfd_dict['name'])) and + 'metadata' in inner_vnfd_dict): + vnfd_dict['name'] = inner_vnfd_dict['metadata'].get( + 'template_name', '') + + vnfd_dict['mgmt_driver'] = toscautils.get_mgmt_driver( + tosca) + else: + KEY_LIST = (('name', 'template_name'), + ('description', 'description')) + + vnfd_dict.update( + dict((key, inner_vnfd_dict[vnfd_key]) for (key, vnfd_key) + in KEY_LIST + if ((key not in vnfd_dict or + vnfd_dict[key] == '') and + vnfd_key in inner_vnfd_dict and + inner_vnfd_dict[vnfd_key] != ''))) + + service_types = inner_vnfd_dict.get( + 'service_properties', {}).get('type', []) + if service_types: + vnfd_dict.setdefault('service_types', []).extend( + [{'service_type': service_type} + for service_type in service_types]) + # TODO(anyone) - this code assumes one mgmt_driver per VNFD??? + for vdu in inner_vnfd_dict.get('vdus', {}).values(): + mgmt_driver = vdu.get('mgmt_driver') + if mgmt_driver: + vnfd_dict['mgmt_driver'] = mgmt_driver + LOG.debug(_('vnfd %s'), vnfd) + def add_vnf_to_monitor(self, vnf_dict, vim_auth): dev_attrs = vnf_dict['attributes'] mgmt_url = vnf_dict['mgmt_url'] @@ -207,8 +260,11 @@ class VNFMPlugin(vm_db.VNFMPluginDb, VNFMMgmtMixin): } self.update_vnf(context, vnf_id, update) - def _create_vnf_wait(self, context, vnf_dict, auth_attr): - driver_name = self._infra_driver_name(vnf_dict) + def _get_infra_driver(self, context, vnf_info): + vim_res = self.get_vim(context, vnf_info) + return vim_res['vim_type'], vim_res['vim_auth'] + + def _create_vnf_wait(self, context, vnf_dict, auth_attr, driver_name): vnf_id = vnf_dict['id'] instance_id = self._instance_id(vnf_dict) create_failed = False @@ -263,13 +319,12 @@ class VNFMPlugin(vm_db.VNFMPluginDb, VNFMMgmtMixin): region_name) vnf['placement_attr']['vim_name'] = vim_res['vim_name'] vnf['vim_id'] = vim_res['vim_id'] - return vim_res['vim_auth'] + return vim_res - def _create_vnf(self, context, vnf, vim_auth): + def _create_vnf(self, context, vnf, vim_auth, driver_name): vnf_dict = self._create_vnf_pre( context, vnf) if not vnf.get('id') else vnf vnf_id = vnf_dict['id'] - driver_name = self._infra_driver_name(vnf_dict) LOG.debug(_('vnf_dict %s'), vnf_dict) self.mgmt_create_pre(context, vnf_dict) try: @@ -308,11 +363,18 @@ class VNFMPlugin(vm_db.VNFMPluginDb, VNFMMgmtMixin): vnf_attributes['config'] = yaml.safe_dump(config) else: self._report_deprecated_yaml_str() - vim_auth = self.get_vim(context, vnf_info) - vnf_dict = self._create_vnf(context, vnf_info, vim_auth) + infra_driver, vim_auth = self._get_infra_driver(context, vnf_info) + if infra_driver not in self._vnf_manager: + LOG.debug(_('unknown vim driver ' + '%(infra_driver)s in %(drivers)s'), + {'infra_driver': infra_driver, + 'drivers': cfg.CONF.tacker.infra_driver}) + raise vnfm.InvalidInfraDriver(vim_name=infra_driver) + + vnf_dict = self._create_vnf(context, vnf_info, vim_auth, infra_driver) def create_vnf_wait(): - self._create_vnf_wait(context, vnf_dict, vim_auth) + self._create_vnf_wait(context, vnf_dict, vim_auth, infra_driver) if vnf_dict['status'] is not constants.ERROR: self.add_vnf_to_monitor(vnf_dict, vim_auth) self.config_vnf(context, vnf_dict) @@ -322,13 +384,12 @@ class VNFMPlugin(vm_db.VNFMPluginDb, VNFMMgmtMixin): # not for wsgi, but for service to create hosting vnf # the vnf is NOT added to monitor. def create_vnf_sync(self, context, vnf): - vim_auth = self.get_vim(context, vnf) - vnf_dict = self._create_vnf(context, vnf, vim_auth) - self._create_vnf_wait(context, vnf_dict, vim_auth) + infra_driver, vim_auth = self._get_infra_driver(context, vnf) + vnf_dict = self._create_vnf(context, vnf, vim_auth, infra_driver) + self._create_vnf_wait(context, vnf_dict, vim_auth, infra_driver) return vnf_dict - def _update_vnf_wait(self, context, vnf_dict, vim_auth): - driver_name = self._infra_driver_name(vnf_dict) + def _update_vnf_wait(self, context, vnf_dict, vim_auth, driver_name): instance_id = self._instance_id(vnf_dict) kwargs = { mgmt_constants.KEY_ACTION: mgmt_constants.ACTION_UPDATE_VNF, @@ -368,8 +429,7 @@ class VNFMPlugin(vm_db.VNFMPluginDb, VNFMMgmtMixin): else: self._report_deprecated_yaml_str() vnf_dict = self._update_vnf_pre(context, vnf_id) - vim_auth = self.get_vim(context, vnf_dict) - driver_name = self._infra_driver_name(vnf_dict) + driver_name, vim_auth = self._get_infra_driver(context, vnf_dict) instance_id = self._instance_id(vnf_dict) try: @@ -388,11 +448,11 @@ class VNFMPlugin(vm_db.VNFMPluginDb, VNFMMgmtMixin): self.mgmt_update_post(context, vnf_dict) self._update_vnf_post(context, vnf_id, constants.ERROR) - self.spawn_n(self._update_vnf_wait, context, vnf_dict, vim_auth) + self.spawn_n(self._update_vnf_wait, context, vnf_dict, vim_auth, + driver_name) return vnf_dict - def _delete_vnf_wait(self, context, vnf_dict, auth_attr): - driver_name = self._infra_driver_name(vnf_dict) + def _delete_vnf_wait(self, context, vnf_dict, auth_attr, driver_name): instance_id = self._instance_id(vnf_dict) e = None if instance_id: @@ -419,9 +479,8 @@ class VNFMPlugin(vm_db.VNFMPluginDb, VNFMMgmtMixin): def delete_vnf(self, context, vnf_id): vnf_dict = self._delete_vnf_pre(context, vnf_id) - vim_auth = self.get_vim(context, vnf_dict) + driver_name, vim_auth = self._get_infra_driver(context, vnf_dict) self._vnf_monitor.delete_hosting_vnf(vnf_id) - driver_name = self._infra_driver_name(vnf_dict) instance_id = self._instance_id(vnf_dict) placement_attr = vnf_dict['placement_attr'] region_name = placement_attr.get('region_name') @@ -450,7 +509,8 @@ class VNFMPlugin(vm_db.VNFMPluginDb, VNFMMgmtMixin): self.mgmt_delete_post(context, vnf_dict) self._delete_vnf_post(context, vnf_id, e) - self.spawn_n(self._delete_vnf_wait, context, vnf_dict, vim_auth) + self.spawn_n(self._delete_vnf_wait, context, vnf_dict, vim_auth, + driver_name) def _handle_vnf_scaling(self, context, policy): # validate @@ -567,8 +627,7 @@ class VNFMPlugin(vm_db.VNFMPluginDb, VNFMMgmtMixin): vnf = _handle_vnf_scaling_pre() policy['instance_id'] = vnf['instance_id'] - infra_driver = self._infra_driver_name(vnf) - vim_auth = self.get_vim(context, vnf) + infra_driver, vim_auth = self._get_infra_driver(context, vnf) region_name = vnf.get('placement_attr', {}).get('region_name', None) last_event_id = _vnf_policy_action() self.spawn_n(_vnf_policy_action_wait) @@ -637,15 +696,14 @@ class VNFMPlugin(vm_db.VNFMPluginDb, VNFMMgmtMixin): def get_vnf_resources(self, context, vnf_id, fields=None, filters=None): vnf_info = self.get_vnf(context, vnf_id) - infra_driver = vnf_info['vnfd']['infra_driver'] - auth = self.get_vim(context, vnf_info) + infra_driver, vim_auth = self._get_infra_driver(context, vnf_info) if vnf_info['status'] == constants.ACTIVE: vnf_details = self._vnf_manager.invoke(infra_driver, 'get_resource_info', plugin=self, context=context, vnf_info=vnf_info, - auth_attr=auth) + auth_attr=vim_auth) resources = [{'name': name, 'type': info.get('type'), 'id': info.get('id')} diff --git a/tacker/vnfm/infra_drivers/abstract_driver.py b/tacker/vnfm/infra_drivers/abstract_driver.py index f373b1a44..50847ccbb 100644 --- a/tacker/vnfm/infra_drivers/abstract_driver.py +++ b/tacker/vnfm/infra_drivers/abstract_driver.py @@ -38,11 +38,6 @@ class DeviceAbstractDriver(extensions.PluginInterface): def get_description(self): pass - # @abc.abstractmethod - def create_vnfd_pre(self, plugin, context, vnfd): - """Called before creating vnf template.""" - pass - @abc.abstractmethod def create(self, plugin, context, vnf): """Create vnf and return its id.""" diff --git a/tacker/vnfm/infra_drivers/heat/__init__.py b/tacker/vnfm/infra_drivers/openstack/__init__.py similarity index 100% rename from tacker/vnfm/infra_drivers/heat/__init__.py rename to tacker/vnfm/infra_drivers/openstack/__init__.py diff --git a/tacker/vnfm/infra_drivers/heat/heat.py b/tacker/vnfm/infra_drivers/openstack/openstack.py similarity index 91% rename from tacker/vnfm/infra_drivers/heat/heat.py rename to tacker/vnfm/infra_drivers/openstack/openstack.py index be1093914..49e79c090 100644 --- a/tacker/vnfm/infra_drivers/heat/heat.py +++ b/tacker/vnfm/infra_drivers/openstack/openstack.py @@ -52,15 +52,12 @@ OPTS = [ help=_("Flavor Extra Specs")), ] -CONF.register_opts(OPTS, group='tacker_heat') +CONF.register_opts(OPTS, group='openstack_vim') def config_opts(): - return [('tacker_heat', OPTS)] + return [('openstack_vim', OPTS)] -STACK_RETRIES = cfg.CONF.tacker_heat.stack_retries -STACK_RETRY_WAIT = cfg.CONF.tacker_heat.stack_retry_wait -STACK_FLAVOR_EXTRA = cfg.CONF.tacker_heat.flavor_extra_specs # Global map of individual resource type and # incompatible properties, alternate properties pair for @@ -83,80 +80,24 @@ def get_scaling_policy_name(action, policy_name): return '%s_scale_%s' % (policy_name, action) -class DeviceHeat(abstract_driver.DeviceAbstractDriver, - scale_driver.VnfScaleAbstractDriver): - """Heat driver of hosting vnf.""" +class OpenStack(abstract_driver.DeviceAbstractDriver, + scale_driver.VnfScaleAbstractDriver): + """Openstack infra driver for hosting vnfs""" def __init__(self): - super(DeviceHeat, self).__init__() + super(OpenStack, self).__init__() + self.STACK_RETRIES = cfg.CONF.openstack_vim.stack_retries + self.STACK_RETRY_WAIT = cfg.CONF.openstack_vim.stack_retry_wait + self.STACK_FLAVOR_EXTRA = cfg.CONF.openstack_vim.flavor_extra_specs def get_type(self): - return 'heat' + return 'openstack' def get_name(self): - return 'heat' + return 'openstack' def get_description(self): - return 'Heat infra driver' - - @log.log - def create_vnfd_pre(self, plugin, context, vnfd): - vnfd_dict = vnfd['vnfd'] - vnfd_yaml = vnfd_dict['attributes'].get('vnfd') - if vnfd_yaml is None: - return - - inner_vnfd_dict = yaml.load(vnfd_yaml) - LOG.debug(_('vnfd_dict: %s'), inner_vnfd_dict) - - if 'tosca_definitions_version' in inner_vnfd_dict: - # Prepend the tacker_defs.yaml import file with the full - # path to the file - toscautils.updateimports(inner_vnfd_dict) - - try: - tosca = tosca_template.ToscaTemplate( - a_file=False, yaml_dict_tpl=inner_vnfd_dict) - except Exception as e: - LOG.exception(_("tosca-parser error: %s"), str(e)) - raise vnfm.ToscaParserFailed(error_msg_details=str(e)) - - if ('description' not in vnfd_dict or - vnfd_dict['description'] == ''): - vnfd_dict['description'] = inner_vnfd_dict.get( - 'description', '') - if (('name' not in vnfd_dict or - not len(vnfd_dict['name'])) and - 'metadata' in inner_vnfd_dict): - vnfd_dict['name'] = inner_vnfd_dict['metadata'].get( - 'template_name', '') - - vnfd_dict['mgmt_driver'] = toscautils.get_mgmt_driver( - tosca) - else: - KEY_LIST = (('name', 'template_name'), - ('description', 'description')) - - vnfd_dict.update( - dict((key, inner_vnfd_dict[vnfd_key]) for (key, vnfd_key) - in KEY_LIST - if ((key not in vnfd_dict or - vnfd_dict[key] == '') and - vnfd_key in inner_vnfd_dict and - inner_vnfd_dict[vnfd_key] != ''))) - - service_types = inner_vnfd_dict.get( - 'service_properties', {}).get('type', []) - if service_types: - vnfd_dict.setdefault('service_types', []).extend( - [{'service_type': service_type} - for service_type in service_types]) - # TODO(anyone) - this code assumes one mgmt_driver per VNFD??? - for vdu in inner_vnfd_dict.get('vdus', {}).values(): - mgmt_driver = vdu.get('mgmt_driver') - if mgmt_driver: - vnfd_dict['mgmt_driver'] = mgmt_driver - LOG.debug(_('vnfd %s'), vnfd) + return 'Openstack infra driver' @log.log def _update_params(self, original, paramvalues, match=False): @@ -332,7 +273,7 @@ class DeviceHeat(abstract_driver.DeviceAbstractDriver, monitoring_dict = toscautils.get_vdu_monitoring(tosca) mgmt_ports = toscautils.get_mgmt_ports(tosca) res_tpl = toscautils.get_resources_dict(tosca, - STACK_FLAVOR_EXTRA) + self.STACK_FLAVOR_EXTRA) toscautils.post_process_template(tosca) try: translator = tosca_translator.TOSCATranslator(tosca, @@ -611,10 +552,10 @@ class DeviceHeat(abstract_driver.DeviceAbstractDriver, stack = heatclient_.get(vnf_id) status = stack.stack_status - stack_retries = STACK_RETRIES + stack_retries = self.STACK_RETRIES error_reason = None while status == 'CREATE_IN_PROGRESS' and stack_retries > 0: - time.sleep(STACK_RETRY_WAIT) + time.sleep(self.STACK_RETRY_WAIT) try: stack = heatclient_.get(vnf_id) except Exception: @@ -633,7 +574,8 @@ class DeviceHeat(abstract_driver.DeviceAbstractDriver, error_reason = _("Resource creation is not completed within" " {wait} seconds as creation of stack {stack}" " is not completed").format( - wait=(STACK_RETRIES * STACK_RETRY_WAIT), + wait=(self.STACK_RETRIES * + self.STACK_RETRY_WAIT), stack=vnf_id) LOG.warning(_("VNF Creation failed: %(reason)s"), {'reason': error_reason}) @@ -727,9 +669,9 @@ class DeviceHeat(abstract_driver.DeviceAbstractDriver, stack = heatclient_.get(vnf_id) status = stack.stack_status error_reason = None - stack_retries = STACK_RETRIES + stack_retries = self.STACK_RETRIES while (status == 'DELETE_IN_PROGRESS' and stack_retries > 0): - time.sleep(STACK_RETRY_WAIT) + time.sleep(self.STACK_RETRY_WAIT) try: stack = heatclient_.get(vnf_id) except heatException.HTTPNotFound: @@ -748,7 +690,7 @@ class DeviceHeat(abstract_driver.DeviceAbstractDriver, " not completed within {wait} seconds as " "deletion of Stack {stack} is " "not completed").format(stack=vnf_id, - wait=(STACK_RETRIES * STACK_RETRY_WAIT)) + wait=(self.STACK_RETRIES * self.STACK_RETRY_WAIT)) LOG.warning(error_reason) raise vnfm.VNFCreateWaitFailed(vnf_id=vnf_id, reason=error_reason) @@ -832,10 +774,10 @@ class DeviceHeat(abstract_driver.DeviceAbstractDriver, # TODO(kanagaraj-manickam) make wait logic into separate utility method # and make use of it here and other actions like create and delete - stack_retries = STACK_RETRIES + stack_retries = self.STACK_RETRIES while (True): try: - time.sleep(STACK_RETRY_WAIT) + time.sleep(self.STACK_RETRY_WAIT) stack_id = policy['instance_id'] policy_name = get_scaling_policy_name( policy_name=policy['id'], @@ -873,7 +815,8 @@ class DeviceHeat(abstract_driver.DeviceAbstractDriver, "VNF scaling failed to complete within %{wait}s seconds " "while waiting for the stack %(stack)s to be " "scaled.") % {'stack': stack_id, - 'wait': STACK_RETRIES * STACK_RETRY_WAIT} + 'wait': self.STACK_RETRIES * + self.STACK_RETRY_WAIT} LOG.warning(error_reason) raise vnfm.VNFScaleWaitFailed( vnf_id=policy['vnf']['id'], diff --git a/tacker/vnfm/infra_drivers/vim_heat/__init__.py b/tacker/vnfm/infra_drivers/vim_heat/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/tacker/vnfm/infra_drivers/vim_heat/vim_heat.py b/tacker/vnfm/infra_drivers/vim_heat/vim_heat.py new file mode 100644 index 000000000..e1f18b53f --- /dev/null +++ b/tacker/vnfm/infra_drivers/vim_heat/vim_heat.py @@ -0,0 +1,69 @@ +# Copyright 2015 Intel Corporation. +# All Rights Reserved. +# +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. + +from oslo_config import cfg +from oslo_log import log as logging +from oslo_log import versionutils + +from tacker.vnfm.infra_drivers.openstack import openstack + + +LOG = logging.getLogger(__name__) +CONF = cfg.CONF + +OPTS = [ + cfg.IntOpt('stack_retries', + default=60, + help=_("Number of attempts to retry for stack" + " creation/deletion")), + cfg.IntOpt('stack_retry_wait', + default=5, + help=_("Wait time (in seconds) between consecutive stack" + " create/delete retries")), + cfg.DictOpt('flavor_extra_specs', + default={}, + help=_("Flavor Extra Specs")), +] + +CONF.register_opts(OPTS, group='tacker_heat') + + +def config_opts(): + return [('tacker_heat', OPTS)] + + +class VimHeat(openstack.OpenStack): + """Heat driver of hosting vnf.""" + + @versionutils.deprecated( + versionutils.deprecated.NEWTON, + what='infra_driver heat', + in_favor_of='infra_driver openstack', + remove_in=+1) + def __init__(self): + super(VimHeat, self).__init__() + self.STACK_RETRIES = cfg.CONF.tacker_heat.stack_retries + self.STACK_RETRY_WAIT = cfg.CONF.tacker_heat.stack_retry_wait + self.STACK_FLAVOR_EXTRA = cfg.CONF.tacker_heat.flavor_extra_specs + + def get_type(self): + return 'heat' + + def get_name(self): + return 'heat' + + def get_description(self): + return 'Heat infra driver' diff --git a/tacker/vnfm/monitor.py b/tacker/vnfm/monitor.py index fc7794ca9..7673b224d 100644 --- a/tacker/vnfm/monitor.py +++ b/tacker/vnfm/monitor.py @@ -30,7 +30,7 @@ from tacker.common import driver_manager from tacker import context as t_context from tacker.db.common_services import common_services_db from tacker.plugins.common import constants -from tacker.vnfm.infra_drivers.heat import heat +from tacker.vnfm.infra_drivers.openstack import openstack LOG = logging.getLogger(__name__) @@ -279,7 +279,7 @@ class ActionRespawnHeat(ActionPolicy): placement_attr = vnf_dict.get('placement_attr', {}) region_name = placement_attr.get('region_name') # kill heat stack - heatclient = heat.HeatClient(auth_attr=auth_attr, + heatclient = openstack.HeatClient(auth_attr=auth_attr, region_name=region_name) heatclient.delete(vnf_dict['instance_id']) diff --git a/tacker/vnfm/vim_client.py b/tacker/vnfm/vim_client.py index c18ecf675..815ce2c9d 100644 --- a/tacker/vnfm/vim_client.py +++ b/tacker/vnfm/vim_client.py @@ -81,7 +81,8 @@ class VimClient(object): vim_auth = self._build_vim_auth(vim_info) vim_res = {'vim_auth': vim_auth, 'vim_id': vim_info['id'], - 'vim_name': vim_info.get('name', vim_info['id'])} + 'vim_name': vim_info.get('name', vim_info['id']), + 'vim_type': vim_info['type']} return vim_res @staticmethod