summaryrefslogtreecommitdiff
path: root/ironic/tests/unit
diff options
context:
space:
mode:
authorZuul <zuul@review.opendev.org>2020-05-19 19:10:30 +0000
committerGerrit Code Review <review@openstack.org>2020-05-19 19:10:30 +0000
commitff8a0c71b03d5f4b8d16b46a1801e4a7ccf97181 (patch)
treece4ab45a1d6fa80ac9719c12f817e045348f836a /ironic/tests/unit
parent4688d62fd4f644e07f7e0f6693a77639fc57bd25 (diff)
parent653d4e4ef55bf5acb315339eb79018c0e432c210 (diff)
downloadironic-ff8a0c71b03d5f4b8d16b46a1801e4a7ccf97181.tar.gz
Merge "Add `network_data` field to ironic node object"
Diffstat (limited to 'ironic/tests/unit')
-rw-r--r--ironic/tests/unit/api/controllers/v1/test_node.py55
-rw-r--r--ironic/tests/unit/db/sqlalchemy/test_migrations.py7
-rw-r--r--ironic/tests/unit/db/utils.py1
-rw-r--r--ironic/tests/unit/objects/test_objects.py2
4 files changed, 64 insertions, 1 deletions
diff --git a/ironic/tests/unit/api/controllers/v1/test_node.py b/ironic/tests/unit/api/controllers/v1/test_node.py
index fa10846c9..99f3cf34f 100644
--- a/ironic/tests/unit/api/controllers/v1/test_node.py
+++ b/ironic/tests/unit/api/controllers/v1/test_node.py
@@ -16,6 +16,7 @@ Tests for the API /nodes/ methods.
import datetime
from http import client as http_client
import json
+import os
from urllib import parse as urlparse
import fixtures
@@ -42,12 +43,20 @@ from ironic.common import states
from ironic.conductor import rpcapi
from ironic import objects
from ironic.objects import fields as obj_fields
+from ironic import tests as tests_root
from ironic.tests import base
from ironic.tests.unit.api import base as test_api_base
from ironic.tests.unit.api import utils as test_api_utils
from ironic.tests.unit.objects import utils as obj_utils
+with open(
+ os.path.join(
+ os.path.dirname(tests_root.__file__),
+ 'json_samples', 'network_data.json')) as fl:
+ NETWORK_DATA = json.load(fl)
+
+
class TestNodeObject(base.TestCase):
def test_node_init(self):
@@ -138,6 +147,7 @@ class TestListNodes(test_api_base.BaseApiTest):
self.assertNotIn('retired', data['nodes'][0])
self.assertNotIn('retired_reason', data['nodes'][0])
self.assertNotIn('lessee', data['nodes'][0])
+ self.assertNotIn('network_data', data['nodes'][0])
def test_get_one(self):
node = obj_utils.create_test_node(self.context,
@@ -403,6 +413,19 @@ class TestListNodes(test_api_base.BaseApiTest):
headers={api_base.Version.string: '1.65'})
self.assertEqual(data['lessee'], "some-lucky-project")
+ def test_node_network_data_hidden_in_lower_version(self):
+ self._test_node_field_hidden_in_lower_version('network_data',
+ '1.65', '1.66')
+
+ def test_node_network_data(self):
+ node = obj_utils.create_test_node(
+ self.context, network_data=NETWORK_DATA,
+ provision_state='active',
+ uuid=uuidutils.generate_uuid())
+ data = self.get_json('/nodes/%s' % node.uuid,
+ headers={api_base.Version.string: '1.66'})
+ self.assertEqual(data['network_data'], NETWORK_DATA)
+
def test_get_one_custom_fields(self):
node = obj_utils.create_test_node(self.context,
chassis_id=self.chassis.id)
@@ -684,6 +707,7 @@ class TestListNodes(test_api_base.BaseApiTest):
self.assertIn('allocation_uuid', data['nodes'][0])
self.assertIn('retired', data['nodes'][0])
self.assertIn('retired_reason', data['nodes'][0])
+ self.assertIn('network_data', data['nodes'][0])
def test_detail_using_query(self):
node = obj_utils.create_test_node(self.context,
@@ -722,6 +746,7 @@ class TestListNodes(test_api_base.BaseApiTest):
self.assertNotIn('chassis_id', data['nodes'][0])
self.assertIn('retired', data['nodes'][0])
self.assertIn('retired_reason', data['nodes'][0])
+ self.assertIn('network_data', data['nodes'][0])
def test_detail_query_false(self):
obj_utils.create_test_node(self.context)
@@ -3655,6 +3680,36 @@ class TestPatch(test_api_base.BaseApiTest):
self.assertEqual('application/json', response.content_type)
self.assertEqual(http_client.NOT_ACCEPTABLE, response.status_code)
+ def test_update_network_data(self):
+ node = obj_utils.create_test_node(self.context,
+ uuid=uuidutils.generate_uuid(),
+ provision_state='active')
+ self.mock_update_node.return_value = node
+ headers = {api_base.Version.string: '1.66'}
+
+ response = self.patch_json('/nodes/%s' % node.uuid,
+ [{'path': '/network_data',
+ 'value': NETWORK_DATA,
+ 'op': 'replace'}],
+ headers=headers)
+ self.assertEqual('application/json', response.content_type)
+ self.assertEqual(http_client.OK, response.status_code)
+
+ def test_update_network_data_old_api(self):
+ node = obj_utils.create_test_node(self.context,
+ uuid=uuidutils.generate_uuid())
+ self.mock_update_node.return_value = node
+ headers = {api_base.Version.string: '1.62'}
+
+ response = self.patch_json('/nodes/%s' % node.uuid,
+ [{'path': '/network_data',
+ 'value': NETWORK_DATA,
+ 'op': 'replace'}],
+ headers=headers,
+ expect_errors=True)
+ self.assertEqual('application/json', response.content_type)
+ self.assertEqual(http_client.NOT_ACCEPTABLE, response.status_code)
+
@mock.patch.object(api_utils, 'check_multiple_node_policies_and_retrieve',
autospec=True)
def test_patch_policy_update(self, mock_cmnpar):
diff --git a/ironic/tests/unit/db/sqlalchemy/test_migrations.py b/ironic/tests/unit/db/sqlalchemy/test_migrations.py
index fdffe4b99..39293c6ac 100644
--- a/ironic/tests/unit/db/sqlalchemy/test_migrations.py
+++ b/ironic/tests/unit/db/sqlalchemy/test_migrations.py
@@ -969,6 +969,13 @@ class MigrationCheckersMixin(object):
col_names = [column.name for column in allocations.c]
self.assertIn('owner', col_names)
+ def _check_cf1a80fdb352(self, engine, data):
+ nodes = db_utils.get_table(engine, 'nodes')
+ col_names = [column.name for column in nodes.c]
+ self.assertIn('network_data', col_names)
+ self.assertIsInstance(
+ nodes.c.network_data.type, sqlalchemy.types.String)
+
def _pre_upgrade_cd2c80feb331(self, engine):
data = {
'node_uuid': uuidutils.generate_uuid(),
diff --git a/ironic/tests/unit/db/utils.py b/ironic/tests/unit/db/utils.py
index a7b720f4b..96254889d 100644
--- a/ironic/tests/unit/db/utils.py
+++ b/ironic/tests/unit/db/utils.py
@@ -228,6 +228,7 @@ def get_test_node(**kw):
'retired': kw.get('retired', False),
'retired_reason': kw.get('retired_reason', None),
'lessee': kw.get('lessee', None),
+ 'network_data': kw.get('network_data'),
}
for iface in drivers_base.ALL_INTERFACES:
diff --git a/ironic/tests/unit/objects/test_objects.py b/ironic/tests/unit/objects/test_objects.py
index 3e2b9a8d4..1320d96d3 100644
--- a/ironic/tests/unit/objects/test_objects.py
+++ b/ironic/tests/unit/objects/test_objects.py
@@ -676,7 +676,7 @@ class TestObject(_LocalTest, _TestObject):
# version bump. It is an MD5 hash of the object fields and remotable methods.
# The fingerprint values should only be changed if there is a version bump.
expected_object_fingerprints = {
- 'Node': '1.34-ae873e627cf30bf28fe9f98a807b6200',
+ 'Node': '1.35-aee8ecf5c4d0ed590eb484762aee7fca',
'MyObj': '1.5-9459d30d6954bffc7a9afd347a807ca6',
'Chassis': '1.3-d656e039fd8ae9f34efc232ab3980905',
'Port': '1.9-0cb9202a4ec442e8c0d87a324155eaaf',