Set nodes' statuses to 'error' when their nodegroup is deleted
According to the bug below and the spec, we did not implement
one multirack feature aspect.
https://specs.openstack.org/openstack/fuel-specs/specs/8.0/multi-rack-static.html#notifications-impact
Now we add resetting node to error to node group deletion callback and
send a notification.
Change-Id: I6b2bae5601ba7dbca620bb3861e95b0e554f8699
Closes-bug: #1644630
(cherry picked from commit cd2ee13830
)
This commit is contained in:
parent
0b5b853317
commit
f26a168b72
@ -182,6 +182,18 @@ class NetworkManagerExtension(BaseExtension):
|
|||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def on_nodegroup_delete(cls, ng):
|
def on_nodegroup_delete(cls, ng):
|
||||||
|
netmanager = objects.Cluster.get_network_manager(ng.cluster)
|
||||||
|
default_admin_net = objects.NetworkGroup.get_default_admin_network()
|
||||||
|
for node in ng.nodes:
|
||||||
|
objects.Node.remove_from_cluster(node)
|
||||||
|
if not netmanager.is_same_network(node.ip, default_admin_net.cidr):
|
||||||
|
objects.Node.set_error_status_and_file_notification(
|
||||||
|
node,
|
||||||
|
consts.NODE_ERRORS.discover,
|
||||||
|
"Node '{0}' nodegroup was deleted which means that it may "
|
||||||
|
"not be able to boot correctly unless it is a member of "
|
||||||
|
"another node group admin network".format(node.hostname)
|
||||||
|
)
|
||||||
try:
|
try:
|
||||||
task = UpdateDnsmasqTaskManager().execute()
|
task = UpdateDnsmasqTaskManager().execute()
|
||||||
except errors.TaskAlreadyRunning:
|
except errors.TaskAlreadyRunning:
|
||||||
|
@ -1448,7 +1448,7 @@ class EnvironmentManager(object):
|
|||||||
expect_errors)
|
expect_errors)
|
||||||
|
|
||||||
def _create_network_group(self, expect_errors=False, cluster=None,
|
def _create_network_group(self, expect_errors=False, cluster=None,
|
||||||
**kwargs):
|
group_id=None, **kwargs):
|
||||||
if not cluster:
|
if not cluster:
|
||||||
cluster = self.clusters[0]
|
cluster = self.clusters[0]
|
||||||
ng = {
|
ng = {
|
||||||
@ -1457,7 +1457,7 @@ class EnvironmentManager(object):
|
|||||||
"vlan_start": 50,
|
"vlan_start": 50,
|
||||||
"cidr": "10.3.0.0/24",
|
"cidr": "10.3.0.0/24",
|
||||||
"gateway": "10.3.0.1",
|
"gateway": "10.3.0.1",
|
||||||
"group_id": Cluster.get_default_group(cluster).id,
|
"group_id": group_id or Cluster.get_default_group(cluster).id,
|
||||||
"meta": {
|
"meta": {
|
||||||
"notation": consts.NETWORK_NOTATION.cidr,
|
"notation": consts.NETWORK_NOTATION.cidr,
|
||||||
"use_gateway": True,
|
"use_gateway": True,
|
||||||
|
@ -26,6 +26,7 @@ from nailgun.db import db
|
|||||||
from nailgun.db.sqlalchemy import models
|
from nailgun.db.sqlalchemy import models
|
||||||
from nailgun import errors
|
from nailgun import errors
|
||||||
from nailgun import objects
|
from nailgun import objects
|
||||||
|
from nailgun.rpc.receiver import NailgunReceiver
|
||||||
from nailgun.test.base import BaseIntegrationTest
|
from nailgun.test.base import BaseIntegrationTest
|
||||||
from nailgun.utils import reverse
|
from nailgun.utils import reverse
|
||||||
|
|
||||||
@ -37,7 +38,7 @@ class TestNodeGroups(BaseIntegrationTest):
|
|||||||
def setUp(self):
|
def setUp(self):
|
||||||
super(TestNodeGroups, self).setUp()
|
super(TestNodeGroups, self).setUp()
|
||||||
self.cluster = self.env.create(
|
self.cluster = self.env.create(
|
||||||
release_kwargs={'version': '1111-8.0'},
|
release_kwargs={'version': '1111-9.0'},
|
||||||
cluster_kwargs={
|
cluster_kwargs={
|
||||||
'api': False,
|
'api': False,
|
||||||
'net_provider': consts.CLUSTER_NET_PROVIDERS.neutron,
|
'net_provider': consts.CLUSTER_NET_PROVIDERS.neutron,
|
||||||
@ -159,6 +160,42 @@ class TestNodeGroups(BaseIntegrationTest):
|
|||||||
self.assertEqual(err.exception.message,
|
self.assertEqual(err.exception.message,
|
||||||
'Default node group cannot be deleted.')
|
'Default node group cannot be deleted.')
|
||||||
|
|
||||||
|
@patch('nailgun.task.task.rpc.cast')
|
||||||
|
@patch('objects.Notification.create')
|
||||||
|
def test_delete_non_default_node_group_reset_node_to_error(
|
||||||
|
self, _, notify):
|
||||||
|
node_group = self.env.create_node_group(api=False,
|
||||||
|
cluster_id=self.cluster.id)
|
||||||
|
self.env._create_network_group(cluster=self.cluster,
|
||||||
|
group_id=node_group.id)
|
||||||
|
node2 = self.env.create_node(group_id=node_group.id,
|
||||||
|
roles=['compute'],
|
||||||
|
status=consts.NODE_STATUSES.provisioned,
|
||||||
|
cluster_id=self.cluster.id,
|
||||||
|
ip='10.3.0.42')
|
||||||
|
task = self.env.launch_deployment()
|
||||||
|
NailgunReceiver.deploy_resp(
|
||||||
|
task_uuid=task.uuid,
|
||||||
|
status=consts.TASK_STATUSES.ready,
|
||||||
|
progress=100,
|
||||||
|
nodes=[{'uid': n.uid, 'status': consts.NODE_STATUSES.ready,
|
||||||
|
'progress': 100}
|
||||||
|
for n in self.env.nodes],
|
||||||
|
)
|
||||||
|
reset_task = self.env.reset_environment()
|
||||||
|
NailgunReceiver.reset_environment_resp(
|
||||||
|
task_uuid=reset_task.uuid,
|
||||||
|
status=consts.TASK_STATUSES.ready,
|
||||||
|
progress=100,
|
||||||
|
nodes=[{'uid': n.uid}
|
||||||
|
for n in self.env.nodes],
|
||||||
|
)
|
||||||
|
self.env.delete_node_group(node_group.id)
|
||||||
|
self.assertEqual(node2.status, consts.NODE_STATUSES.error)
|
||||||
|
self.assertEqual(node2.error_type, consts.NODE_ERRORS.discover)
|
||||||
|
self.assertIsNone(node2.cluster)
|
||||||
|
notify.assert_called()
|
||||||
|
|
||||||
def test_delete_non_default_node_group_error(self):
|
def test_delete_non_default_node_group_error(self):
|
||||||
node_group = self.env.create_node_group(api=False,
|
node_group = self.env.create_node_group(api=False,
|
||||||
cluster_id=self.cluster.id)
|
cluster_id=self.cluster.id)
|
||||||
|
Loading…
Reference in New Issue
Block a user