Use permanent identifier as a node key

Using permanent identifier instead of hostname based identifier fixes
problems which might be caused by renaming a host

Change-Id: I17d84da97296144acbf5983ea18139ffdee0db8a
Closes-bug: #1548332
This commit is contained in:
Kyrylo Galanov 2016-03-17 01:29:07 +01:00 committed by Georgy Kibardin
parent 32afbeb2f8
commit 235c1622f2
5 changed files with 36 additions and 4 deletions

View File

@ -1054,6 +1054,10 @@ class Node(NailgunObject):
@classmethod
def default_slave_name(cls, instance):
return cls.permanent_id(instance)
@classmethod
def permanent_id(cls, instance):
return u"node-{node_id}".format(node_id=instance.id)
@classmethod

View File

@ -585,7 +585,7 @@ class DeploymentHASerializer90(DeploymentHASerializer80):
attrs = super(DeploymentHASerializer90, self).get_common_attrs(cluster)
for node in objects.Cluster.get_nodes_not_for_deletion(cluster):
name = objects.Node.get_slave_name(node)
name = objects.Node.permanent_id(node)
node_attrs = attrs['network_metadata']['nodes'][name]
node_attrs['nova_cpu_pinning_enabled'] = \

View File

@ -1066,8 +1066,10 @@ class NeutronNetworkDeploymentSerializer70(
name = objects.Node.get_slave_name(node)
node_roles = objects.Node.all_roles(node)
network_roles = cls.get_network_role_mapping_to_ip(node)
# Use permanent identifier as a node key
key = objects.Node.permanent_id(node)
nodes[name] = {
nodes[key] = {
"uid": node.uid,
"fqdn": objects.Node.get_node_fqdn(node),
"name": name,

View File

@ -363,6 +363,8 @@ class NovaNetworkDeploymentSerializer70(NovaNetworkDeploymentSerializer61):
for n in Cluster.get_nodes_not_for_deletion(cluster):
name = Node.get_slave_name(n)
node_roles = Node.all_roles(n)
# Use permanent identifier as a node key
key = Node.permanent_id(n)
ip_by_net = {
'fuelweb_admin': None,
@ -412,7 +414,7 @@ class NovaNetworkDeploymentSerializer70(NovaNetworkDeploymentSerializer61):
'ceph/radosgw': ip_by_net['public'],
}
nodes[name] = {
nodes[key] = {
"uid": n.uid,
"fqdn": Node.get_node_fqdn(n),
"name": name,

View File

@ -17,10 +17,13 @@
import mock
import six
from oslo_serialization import jsonutils
from nailgun import consts
from nailgun import objects
from nailgun.orchestrator import deployment_serializers
from nailgun.plugins import adapters
from nailgun.utils import reverse
from nailgun.orchestrator.neutron_serializers import \
NeutronNetworkDeploymentSerializer90
@ -430,6 +433,26 @@ class TestDeploymentAttributesSerialization90(
for node_attrs in six.itervalues(nodes_attrs):
self.assertFalse(node_attrs['nova_hugepages_enabled'])
def test_immutable_metadata_key(self):
node = self.env.create_node(
api=True,
cluster_id=self.cluster_db.id,
pending_roles=['controller'],
pending_addition=True)
self.db.flush()
resp = self.app.put(
reverse('NodeHandler', kwargs={'obj_id': node['id']}),
jsonutils.dumps({'hostname': 'new-name'}),
headers=self.default_headers)
self.assertEqual(200, resp.status_code)
objects.Cluster.prepare_for_deployment(self.cluster_db)
serialized_for_astute = self.serializer.serialize(
self.cluster_db, self.cluster_db.nodes)
for node_data in serialized_for_astute:
for k, v in six.iteritems(node_data['network_metadata']['nodes']):
node = objects.Node.get_by_uid(v['uid'])
self.assertEqual(objects.Node.permanent_id(node), k)
class TestDeploymentLCMSerialization90(
TestSerializer90Mixin,
@ -717,7 +740,7 @@ class TestSriovSerialization90(
):
def setUp(self, *args):
super(TestSriovSerialization90, self).setUp()
self.env.create(
cluster = self.env.create(
release_kwargs={'version': self.env_version},
cluster_kwargs={
'mode': consts.CLUSTER_MODES.ha_compact,
@ -725,6 +748,7 @@ class TestSriovSerialization90(
'net_segment_type': consts.NEUTRON_SEGMENT_TYPES.vlan,
'status': consts.CLUSTER_STATUSES.new},
)
self.cluster_db = objects.Cluster.get_by_uid(cluster['id'])
self.env.create_nodes_w_interfaces_count(
nodes_count=1, if_count=3, cluster_id=self.env.clusters[0].id,
pending_roles=['compute'], pending_addition=True)