Add default tags

Tags for rabbitmq, database, keystone and neutron.

Change-Id: I5cbaf58f57845c02550e2b422b269f41eec98322
Implements: blueprint role-decomposition
This commit is contained in:
Mikhail 2016-10-18 15:07:43 +03:00 committed by Valyavskiy Viacheslav
parent 319cb284c5
commit 508dccf9b2
13 changed files with 485 additions and 90 deletions

View File

@ -40,6 +40,87 @@
strategy:
type: parallel
amount: 6
- id: primary-database
type: group
roles: [primary-database]
requires: [deploy_start]
required_for: [deploy_end]
parameters:
strategy:
type: one_by_one
- id: database
type: group
fault_tolerance: 0
roles: [database]
requires: [primary-database]
required_for: [deploy_end]
parameters:
strategy:
type: parallel
amount: 6
- id: primary-keystone
type: group
roles: [primary-keystone]
requires: [deploy_start, primary-database]
required_for: [deploy_end]
parameters:
strategy:
type: one_by_one
- id: keystone
type: group
fault_tolerance: 0
roles: [keystone]
requires: [primary-keystone]
required_for: [deploy_end]
parameters:
strategy:
type: parallel
amount: 6
- id: primary-neutron
type: group
roles: [primary-neutron]
requires: [deploy_start]
required_for: [deploy_end]
parameters:
strategy:
type: one_by_one
- id: neutron
type: group
fault_tolerance: 0
roles: [neutron]
requires: [primary-neutron]
required_for: [deploy_end]
parameters:
strategy:
type: parallel
amount: 6
- id: primary-rabbitmq
type: group
roles: [primary-rabbitmq]
requires: [deploy_start]
required_for: [deploy_end]
parameters:
strategy:
type: one_by_one
- id: rabbitmq
type: group
fault_tolerance: 0
roles: [rabbitmq]
requires: [primary-rabbitmq]
required_for: [deploy_end]
parameters:
strategy:
type: parallel
amount: 6
- id: cinder
type: group
roles: [cinder]
@ -113,7 +194,11 @@
type: puppet
groups: [primary-controller, controller,
cinder, compute, ceph-osd,
primary-mongo, mongo, ironic]
primary-mongo, mongo, ironic,
primary-database, database,
primary-keystone, keystone,
primary-neutron, neutron,
primary-rabbitmq, rabbitmq]
required_for: [deploy_end]
requires: [deploy_start]
reexecute_on: [deploy_changes]
@ -179,7 +264,11 @@
type: puppet
groups: [primary-controller, controller,
cinder, compute, ceph-osd,
primary-mongo, mongo, ironic]
primary-mongo, mongo, ironic,
primary-database, database,
primary-keystone, keystone,
primary-neutron, neutron,
primary-rabbitmq, rabbitmq]
required_for: [deploy_end]
requires: [deploy_start]
reexecute_on: [deploy_changes]

View File

@ -29,6 +29,10 @@
message: "Neutron L3 HA requires at least 2 Controller nodes to function properly."
tags:
- controller
- rabbitmq
- database
- keystone
- neutron
compute:
name: "Compute"
description: "A Compute node creates, manages, and terminates virtual machine instances."
@ -188,8 +192,6 @@
tags_metadata:
controller:
has_primary: True
mysql:
has_primary: True
mongo:
has_primary: True
compute:
@ -198,6 +200,14 @@
has_primary: False
cinder:
has_primary: False
rabbitmq:
has_primary: True
database:
has_primary: True
keystone:
has_primary: True
neutron:
has_primary: True
network_roles_metadata:
-

View File

@ -46,7 +46,10 @@ class DeploymentMultinodeSerializer(object):
neutron_network_serializer = \
neutron_serializers.NeutronNetworkDeploymentSerializer
critical_roles = frozenset(('controller', 'ceph-osd', 'primary-mongo'))
critical_roles = frozenset(('controller', 'ceph-osd', 'primary-mongo',
'primary-database', 'primary-rabbitmq',
'primary-keystone', 'primary-neutron',
'database', 'keystone', 'neutron', 'rabbitmq'))
def __init__(self, tasks_graph=None):
self.task_graph = tasks_graph
@ -334,7 +337,15 @@ class DeploymentHASerializer(DeploymentMultinodeSerializer):
'primary-mongo',
'primary-swift-proxy',
'ceph-osd',
'controller'
'controller',
'primary-database',
'primary-rabbitmq',
'primary-keystone',
'primary-neutron',
'database',
'keystone',
'neutron',
'rabbitmq'
))
def get_last_controller(self, nodes):

View File

@ -42,6 +42,79 @@ DEPLOYMENT_51_60 = """
strategy:
type: parallel
amount: 6
- id: primary-database
type: group
role: [primary-database]
required_for: [deploy_end]
requires: [deploy_start]
parameters:
strategy:
type: one_by_one
- id: database
type: group
role: [database]
requires: [primary-database]
required_for: [deploy_end]
parameters:
strategy:
type: one_by_one
- id: primary-keystone
type: group
role: [primary-keystone]
required_for: [deploy_end]
requires: [deploy_start]
parameters:
strategy:
type: one_by_one
- id: keystone
type: group
role: [keystone]
requires: [primary-keystone]
required_for: [deploy_end]
parameters:
strategy:
type: one_by_one
- id: primary-rabbitmq
type: group
role: [primary-rabbitmq]
required_for: [deploy_end]
requires: [deploy_start]
parameters:
strategy:
type: one_by_one
- id: rabbitmq
type: group
role: [rabbitmq]
requires: [primary-rabbitmq]
required_for: [deploy_end]
parameters:
strategy:
type: one_by_one
- id: primary-neutron
type: group
role: [primary-neutron]
required_for: [deploy_end]
requires: [deploy_start]
parameters:
strategy:
type: one_by_one
- id: neutron
type: group
role: [neutron]
requires: [primary-neutron]
required_for: [deploy_end]
parameters:
strategy:
type: one_by_one
- id: cinder
type: group
role: [cinder]
@ -129,6 +202,79 @@ DEPLOYMENT_50 = """
parameters:
strategy:
type: one_by_one
- id: primary-database
type: group
role: [primary-database]
required_for: [deploy_end]
requires: [deploy_start]
parameters:
strategy:
type: one_by_one
- id: database
type: group
role: [database]
requires: [primary-database]
required_for: [deploy_end]
parameters:
strategy:
type: one_by_one
- id: primary-keystone
type: group
role: [primary-keystone]
required_for: [deploy_end]
requires: [deploy_start]
parameters:
strategy:
type: one_by_one
- id: keystone
type: group
role: [keystone]
requires: [primary-keystone]
required_for: [deploy_end]
parameters:
strategy:
type: one_by_one
- id: primary-rabbitmq
type: group
role: [primary-rabbitmq]
required_for: [deploy_end]
requires: [deploy_start]
parameters:
strategy:
type: one_by_one
- id: rabbitmq
type: group
role: [rabbitmq]
requires: [primary-rabbitmq]
required_for: [deploy_end]
parameters:
strategy:
type: one_by_one
- id: primary-neutron
type: group
role: [primary-neutron]
required_for: [deploy_end]
requires: [deploy_start]
parameters:
strategy:
type: one_by_one
- id: neutron
type: group
role: [neutron]
requires: [primary-neutron]
required_for: [deploy_end]
parameters:
strategy:
type: one_by_one
- id: cinder
type: group
role: [cinder]

View File

@ -34,6 +34,9 @@ from nailgun.utils import reverse
class TestHandlers(BaseIntegrationTest):
primary_controller_tags = ['primary-controller', 'primary-database',
'primary-keystone', 'primary-neutron',
'primary-rabbitmq']
@mock_rpc(pass_mock=True)
def test_nova_deploy_cast_with_right_args(self, mocked_rpc):
@ -113,7 +116,7 @@ class TestHandlers(BaseIntegrationTest):
for node in nodes_db:
node_id = node.id
admin_ip = admin_ips.pop()
for role in sorted(node.roles + node.pending_roles):
for role in sorted(node.tag_names):
assigned_ips[node_id] = {}
assigned_ips[node_id]['internal'] = '192.168.0.%d' % (i + 2)
assigned_ips[node_id]['public'] = '172.16.0.%d' % (i + 3)
@ -143,7 +146,9 @@ class TestHandlers(BaseIntegrationTest):
deepcopy(nodes_list))
common_attrs['nodes'] = nodes_list
common_attrs['nodes'][0]['role'] = 'primary-controller'
for node, role in zip(common_attrs['nodes'],
self.primary_controller_tags):
node['role'] = role
common_attrs['last_controller'] = controller_nodes[-1]['name']
common_attrs['storage']['pg_num'] = 128
@ -170,13 +175,17 @@ class TestHandlers(BaseIntegrationTest):
'primary-controller': True,
'controller': True,
'cinder': False,
'compute': False
'compute': False,
'database': True,
'keystone': True,
'rabbitmq': True,
'neutron': True
}
deployment_info = []
for node in nodes_db:
ips = assigned_ips[node.id]
for role in sorted(node.roles):
for role in sorted(node.tag_names):
is_critical = critical_mapping[role]
individual_atts = {
@ -214,11 +223,9 @@ class TestHandlers(BaseIntegrationTest):
individual_atts.update(common_attrs)
deployment_info.append(deepcopy(individual_atts))
controller_nodes = filter(
lambda node: node['role'] == 'controller',
deployment_info)
controller_nodes[0]['role'] = 'primary-controller'
controller_nodes[0]['fail_if_error'] = True
for node, role in zip(deployment_info, self.primary_controller_tags):
node['role'] = role
node['fail_if_error'] = True
supertask = self.env.launch_deployment()
deploy_task_uuid = [x.uuid for x in supertask.subtasks
@ -530,7 +537,7 @@ class TestHandlers(BaseIntegrationTest):
for node in nodes_db:
node_id = node.id
admin_ip = admin_ips.pop()
for role in sorted(node.roles + node.pending_roles):
for role in sorted(node.tag_names):
assigned_ips[node_id] = {}
assigned_ips[node_id]['management'] = '192.168.0.%d' % (i + 2)
assigned_ips[node_id]['public'] = '172.16.0.%d' % (i + 3)
@ -560,8 +567,9 @@ class TestHandlers(BaseIntegrationTest):
deepcopy(nodes_list))
common_attrs['nodes'] = nodes_list
common_attrs['nodes'][0]['role'] = 'primary-controller'
for node, role in zip(common_attrs['nodes'],
self.primary_controller_tags):
node['role'] = role
common_attrs['last_controller'] = controller_nodes[-1]['name']
common_attrs['storage']['pg_num'] = 128
@ -587,13 +595,17 @@ class TestHandlers(BaseIntegrationTest):
'primary-controller': True,
'controller': True,
'cinder': False,
'compute': False
'compute': False,
'database': True,
'keystone': True,
'rabbitmq': True,
'neutron': True
}
deployment_info = []
for node in nodes_db:
ips = assigned_ips[node.id]
for role in sorted(node.roles):
for role in sorted(node.tag_names):
is_critical = critical_mapping[role]
individual_atts = {
@ -682,11 +694,9 @@ class TestHandlers(BaseIntegrationTest):
individual_atts.update(common_attrs)
deployment_info.append(deepcopy(individual_atts))
controller_nodes = filter(
lambda node: node['role'] == 'controller',
deployment_info)
controller_nodes[0]['role'] = 'primary-controller'
controller_nodes[0]['fail_if_error'] = True
for node, role in zip(deployment_info, self.primary_controller_tags):
node['role'] = role
node['fail_if_error'] = True
supertask = self.env.launch_deployment()
deploy_task_uuid = [x.uuid for x in supertask.subtasks
@ -1018,7 +1028,7 @@ class TestHandlers(BaseIntegrationTest):
for node in nodes_db:
node_id = node.id
admin_ip = admin_ips.pop()
for role in sorted(node.roles + node.pending_roles):
for role in sorted(node.tag_names):
assigned_ips[node_id] = {}
assigned_ips[node_id]['management'] = '192.168.0.%d' % (i + 2)
assigned_ips[node_id]['public'] = '172.16.0.%d' % (i + 3)
@ -1048,7 +1058,9 @@ class TestHandlers(BaseIntegrationTest):
deepcopy(nodes_list))
common_attrs['tasks'] = []
common_attrs['nodes'] = nodes_list
common_attrs['nodes'][0]['role'] = 'primary-controller'
for node, role in zip(common_attrs['nodes'],
self.primary_controller_tags):
node['role'] = role
common_attrs['last_controller'] = controller_nodes[-1]['name']
common_attrs['storage']['pg_num'] = 128
@ -1075,17 +1087,20 @@ class TestHandlers(BaseIntegrationTest):
'primary-controller': True,
'controller': True,
'cinder': False,
'compute': False
'compute': False,
'database': True,
'keystone': True,
'rabbitmq': True,
'neutron': True
}
deployment_info = []
nm = objects.Cluster.get_network_manager(node.cluster)
nm = objects.Cluster.get_network_manager(cluster_db)
for node in nodes_db:
ips = assigned_ips[node.id]
other_nets = nm.get_networks_not_on_node(node)
for role in sorted(node.roles):
for role in sorted(node.tag_names):
is_critical = critical_mapping[role]
individual_atts = {
@ -1190,11 +1205,9 @@ class TestHandlers(BaseIntegrationTest):
individual_atts.update(common_attrs)
deployment_info.append(deepcopy(individual_atts))
controller_nodes = filter(
lambda node: node['role'] == 'controller',
deployment_info)
controller_nodes[0]['role'] = 'primary-controller'
controller_nodes[0]['fail_if_error'] = True
for node, role in zip(deployment_info, self.primary_controller_tags):
node['role'] = role
node['fail_if_error'] = True
supertask = self.env.launch_deployment()
deploy_task_uuid = [x.uuid for x in supertask.subtasks
@ -1412,7 +1425,7 @@ class TestHandlers(BaseIntegrationTest):
# deploy method call [1][0][1][1]
n_rpc_deploy = mocked_rpc.call_args_list[
1][0][1][1]['args']['deployment_info']
self.assertEqual(len(n_rpc_deploy), 1)
self.assertEqual(len(n_rpc_deploy), 5)
self.assertEqual(n_rpc_deploy[0]['uid'], str(self.env.nodes[0].id))
@mock_rpc(pass_mock=True)
@ -1444,18 +1457,20 @@ class TestHandlers(BaseIntegrationTest):
self.assertEqual(len(args[1]), 2)
n_rpc_deploy = args[1][1]['args']['deployment_info']
self.assertEqual(len(n_rpc_deploy), 5)
self.assertEqual(len(n_rpc_deploy), 25)
pub_ips = ['172.16.0.11', '172.16.0.12', '172.16.0.13',
'172.16.0.20', '172.16.0.21', '172.16.0.22']
for n in n_rpc_deploy:
self.assertIn('management_vrouter_vip', n)
self.assertIn('public_vrouter_vip', n)
used_ips = []
for n_common_args in n['nodes']:
self.assertIn(n_common_args['public_address'], pub_ips)
self.assertNotIn(n_common_args['public_address'], used_ips)
used_ips.append(n_common_args['public_address'])
self.assertIn('management_vrouter_vip', n)
old_nodes = n_rpc_deploy[0]['nodes']
used_ips = []
for n in {v['uid']: v for v in old_nodes}.values():
self.assertIn(n['public_address'], pub_ips)
self.assertNotIn(n['public_address'], used_ips)
used_ips.append(n['public_address'])
@mock_rpc(pass_mock=True)
def test_deploy_ha_neutron_gre_w_custom_public_ranges(self, mocked_rpc):
@ -1486,16 +1501,18 @@ class TestHandlers(BaseIntegrationTest):
self.assertEqual(len(args[1]), 2)
n_rpc_deploy = args[1][1]['args']['deployment_info']
self.assertEqual(len(n_rpc_deploy), 5)
self.assertEqual(len(n_rpc_deploy), 25)
pub_ips = ['172.16.0.11', '172.16.0.12', '172.16.0.13',
'172.16.0.20', '172.16.0.21', '172.16.0.22']
for n in n_rpc_deploy:
self.assertEqual(n['public_vip'], '172.16.0.10')
used_ips = []
for n_common_args in n['nodes']:
self.assertIn(n_common_args['public_address'], pub_ips)
self.assertNotIn(n_common_args['public_address'], used_ips)
used_ips.append(n_common_args['public_address'])
old_nodes = n_rpc_deploy[0]['nodes']
used_ips = []
for n in {v['uid']: v for v in old_nodes}.values():
self.assertIn(n['public_address'], pub_ips)
self.assertNotIn(n['public_address'], used_ips)
used_ips.append(n['public_address'])
@mock_rpc(pass_mock=True)
def test_deploy_neutron_gre_w_changed_public_cidr(self, mocked_rpc):
@ -1525,7 +1542,7 @@ class TestHandlers(BaseIntegrationTest):
self.assertEqual(len(args[1]), 2)
n_rpc_deploy = args[1][1]['args']['deployment_info']
self.assertEqual(len(n_rpc_deploy), 2)
self.assertEqual(len(n_rpc_deploy), 10)
pub_ips = ['172.16.10.11', '172.16.10.12', '172.16.10.13']
for n in n_rpc_deploy:
for n_common_args in n['nodes']:
@ -1873,8 +1890,8 @@ class TestHandlers(BaseIntegrationTest):
deployment_info = args[1][0]['args']['deployment_info']
self.assertItemsEqual(
[node.uid for node in self.env.nodes],
[node['uid'] for node in deployment_info]
set([node.uid for node in self.env.nodes]),
set([node['uid'] for node in deployment_info])
)
def _test_run(self, mcast, mode='dry_run'):
@ -2146,6 +2163,86 @@ class TestGranularDeployment(BaseIntegrationTest):
'required_for': ['post_deployment_end'],
'reexecute_on': ['deploy_changes'],
},
{
'fault_tolerance': 0,
'id': 'primary-database',
'parameters': {'strategy': {'type': 'one_by_one'}},
'required_for': ['deploy_end'],
'requires': ['deploy_start'],
'roles': ['primary-database'],
'role': 'primary-database',
'type': 'group'
},
{
'fault_tolerance': 0,
'id': 'primary-keystone',
'parameters': {'strategy': {'type': 'one_by_one'}},
'required_for': ['deploy_end'],
'requires': ['deploy_start'],
'roles': ['primary-keystone'],
'role': 'primary-keystone',
'type': 'group'
},
{
'fault_tolerance': 0,
'id': 'primary-rabbitmq',
'parameters': {'strategy': {'type': 'one_by_one'}},
'required_for': ['deploy_end'],
'requires': ['deploy_start'],
'roles': ['primary-rabbitmq'],
'role': 'primary-rabbitmq',
'type': 'group'
},
{
'fault_tolerance': 0,
'id': 'primary-neutron',
'parameters': {'strategy': {'type': 'one_by_one'}},
'required_for': ['deploy_end'],
'requires': ['deploy_start'],
'roles': ['primary-neutron'],
'role': 'primary-neutron',
'type': 'group'
},
{
'fault_tolerance': 0,
'id': 'database',
'parameters': {'strategy': {'amount': 6, 'type': 'parallel'}},
'required_for': ['deploy_end'],
'requires': ['primary-database'],
'roles': ['database'],
'role': 'database',
'type': 'group'
},
{
'fault_tolerance': 0,
'id': 'keystone',
'parameters': {'strategy': {'amount': 6, 'type': 'parallel'}},
'required_for': ['deploy_end'],
'requires': ['primary-keystone'],
'roles': ['keystone'],
'role': 'keystone',
'type': 'group'
},
{
'fault_tolerance': 0,
'id': 'rabbitmq',
'parameters': {'strategy': {'amount': 6, 'type': 'parallel'}},
'required_for': ['deploy_end'],
'requires': ['primary-rabbitmq'],
'roles': ['rabbitmq'],
'role': 'rabbitmq',
'type': 'group'
},
{
'fault_tolerance': 0,
'id': 'neutron',
'parameters': {'strategy': {'amount': 6, 'type': 'parallel'}},
'required_for': ['deploy_end'],
'requires': ['primary-neutron'],
'roles': ['neutron'],
'role': 'neutron',
'type': 'group'
},
]
n1 = self.env.create_node(

View File

@ -625,7 +625,7 @@ class TestReleasePluginsGraphHandler(BaseGraphTasksTests,
headers=self.default_headers,
)
self.assertEqual(resp.status_code, 200)
self.assertEqual(len(resp.json), 24) # default release tasks
self.assertEqual(len(resp.json), 32) # default release tasks
def test_get_existing_custom_deployment_tasks(self):
resp = self.app.get(

View File

@ -163,7 +163,7 @@ class TestDefaultOrchestratorInfoHandlers(BaseIntegrationTest):
self.assertEqual(resp.status_code, 200)
actual_uids = [node['uid'] for node in resp.json_body]
node_ids.append('common')
self.assertItemsEqual(actual_uids, node_ids)
self.assertItemsEqual(set(actual_uids), node_ids)
def test_cluster_provisioning_customization(self):
facts = {'engine': {'1': '2'}}
@ -241,8 +241,8 @@ class BaseSelectedNodesTest(BaseIntegrationTest):
else:
deployed_uids = [n['uid'] for n in
args[1]['args']['deployment_info']]
self.assertEqual(len(nodes_uids), len(deployed_uids))
self.assertItemsEqual(nodes_uids, deployed_uids)
self.assertEqual(len(nodes_uids), len(set(deployed_uids)))
self.assertItemsEqual(nodes_uids, set(deployed_uids))
def check_resp_declined(self, resp):
self.assertEqual(resp.status_code, 400)
@ -627,7 +627,7 @@ class TestDeploymentHandlerSkipTasks(BaseSelectedNodesTest):
args, kwargs = mcast.call_args
deployed_uids = [n['uid'] for n in args[1]['args']['deployment_info']]
deployment_data = args[1]['args']['deployment_info'][0]
self.assertItemsEqual(deployed_uids, self.node_uids)
self.assertItemsEqual(set(deployed_uids), self.node_uids)
self.assertEqual(len(deployment_data['tasks']), 1)
def test_deployment_is_forbidden(self):

View File

@ -209,8 +209,12 @@ class TestNovaOrchestratorSerializer(OrchestratorSerializerTestBase):
return cluster_db
def assert_roles_flattened(self, nodes):
self.assertEqual(len(nodes), 7)
self.assertEqual(len(nodes), 11)
self.assert_nodes_with_role(nodes, 'controller', 1)
self.assert_nodes_with_role(nodes, 'database', 1)
self.assert_nodes_with_role(nodes, 'keystone', 1)
self.assert_nodes_with_role(nodes, 'neutron', 1)
self.assert_nodes_with_role(nodes, 'rabbitmq', 1)
self.assert_nodes_with_role(nodes, 'compute', 2)
self.assert_nodes_with_role(nodes, 'cinder', 3)
self.assert_nodes_with_role(nodes, 'mongo', 1)
@ -447,7 +451,11 @@ class TestNovaOrchestratorSerializer(OrchestratorSerializerTestBase):
{'fail_if_error': False, 'role': 'compute'},
{'fail_if_error': False, 'role': 'compute'},
{'fail_if_error': True, 'role': 'primary-mongo'},
{'fail_if_error': False, 'role': 'cinder'}
{'fail_if_error': False, 'role': 'cinder'},
{'fail_if_error': True, 'role': 'primary-database'},
{'fail_if_error': True, 'role': 'primary-keystone'},
{'fail_if_error': True, 'role': 'primary-neutron'},
{'fail_if_error': True, 'role': 'primary-rabbitmq'}
]
self.assertItemsEqual(
@ -1320,7 +1328,19 @@ class TestNovaOrchestratorHASerializer(OrchestratorSerializerTestBase):
{'fail_if_error': False, 'role': 'compute'},
{'fail_if_error': False, 'role': 'compute'},
{'fail_if_error': True, 'role': 'primary-mongo'},
{'fail_if_error': False, 'role': 'cinder'}
{'fail_if_error': False, 'role': 'cinder'},
{'fail_if_error': True, 'role': 'primary-database'},
{'fail_if_error': True, 'role': 'primary-keystone'},
{'fail_if_error': True, 'role': 'primary-neutron'},
{'fail_if_error': True, 'role': 'primary-rabbitmq'},
{'fail_if_error': True, 'role': u'database'},
{'fail_if_error': True, 'role': u'database'},
{'fail_if_error': True, 'role': u'keystone'},
{'fail_if_error': True, 'role': u'keystone'},
{'fail_if_error': True, 'role': u'neutron'},
{'fail_if_error': True, 'role': u'neutron'},
{'fail_if_error': True, 'role': u'rabbitmq'},
{'fail_if_error': True, 'role': u'rabbitmq'}
]
self.assertItemsEqual(
@ -1489,8 +1509,12 @@ class TestNeutronOrchestratorSerializer(OrchestratorSerializerTestBase):
return serializer.serialize(cluster, cluster.nodes)
def assert_roles_flattened(self, nodes):
self.assertEqual(len(nodes), 6)
self.assertEqual(len(nodes), 10)
self.assert_nodes_with_role(nodes, 'controller', 1)
self.assert_nodes_with_role(nodes, 'database', 1)
self.assert_nodes_with_role(nodes, 'keystone', 1)
self.assert_nodes_with_role(nodes, 'neutron', 1)
self.assert_nodes_with_role(nodes, 'rabbitmq', 1)
self.assert_nodes_with_role(nodes, 'compute', 2)
self.assert_nodes_with_role(nodes, 'cinder', 3)
@ -1638,7 +1662,7 @@ class TestNeutronOrchestratorSerializer(OrchestratorSerializerTestBase):
# We have 6 roles on 4 nodes summarily.
# Only 1 node w 2 roles (controller+cinder) will have public
# when 'assign_to_all_nodes' option is switched off
self.assertEqual(roles_w_public_count, 6 if assign else 2)
self.assertEqual(roles_w_public_count, 10 if assign else 6)
# Check uncommon attrs
node_uids = sorted(set([int(n['uid']) for n in node_list]))

View File

@ -734,6 +734,30 @@ class TestPluginDeploymentTasksInjection70(base.BaseIntegrationTest):
'requires': ['deploy_start'],
'role': ['primary-controller'],
'type': 'group'},
{'id': 'primary-database',
'parameters': {'strategy': {'type': 'one_by_one'}},
'required_for': ['deploy_end'],
'requires': ['deploy_start'],
'role': ['primary-database'],
'type': 'group'},
{'id': 'primary-keystone',
'parameters': {'strategy': {'type': 'one_by_one'}},
'required_for': ['deploy_end'],
'requires': ['deploy_start'],
'role': ['primary-keystone'],
'type': 'group'},
{'id': 'primary-neutron',
'parameters': {'strategy': {'type': 'one_by_one'}},
'required_for': ['deploy_end'],
'requires': ['deploy_start'],
'role': ['primary-neutron'],
'type': 'group'},
{'id': 'primary-rabbitmq',
'parameters': {'strategy': {'type': 'one_by_one'}},
'required_for': ['deploy_end'],
'requires': ['deploy_start'],
'role': ['primary-rabbitmq'],
'type': 'group'},
{'id': 'first-fake-depl-task',
'required_for': ['deploy_end'],
'requires': ['deploy_start'],
@ -1318,8 +1342,8 @@ class TestNetworkTemplateSerializer70(BaseDeploymentSerializer,
serialized_for_astute = deployment_info_to_legacy(
serialized_for_astute)
# 7 node roles on 5 nodes
self.assertEqual(len(serialized_for_astute), 7)
# 15 node roles on 5 nodes
self.assertEqual(len(serialized_for_astute), 15)
for node_data in serialized_for_astute:
node = objects.Node.get_by_uid(node_data['uid'])
for node_roles, net_names in node_roles_vs_net_names:

View File

@ -704,7 +704,7 @@ class TestDeploymentHASerializer90(
def test_serialize_with_customized(self):
cluster = self.env.clusters[0]
serializer = self.create_serializer(cluster)
serializer = deployment_serializers.DeploymentLCMSerializer()
objects.Cluster.prepare_for_deployment(cluster)
serialized = serializer.serialize(cluster, cluster.nodes)

View File

@ -893,7 +893,7 @@ class TestTaskManagers(BaseIntegrationTest):
deployment_info = args[1][0]['args']['deployment_info']
self.assertItemsEqual(
[node.uid for node in self.env.nodes],
[node['uid'] for node in deployment_info]
set([node['uid'] for node in deployment_info])
)
@fake_tasks()

View File

@ -789,11 +789,14 @@ class TestNodeObject(BaseIntegrationTest):
cluster_kwargs={'api': False},
nodes_kwargs=[{'role': 'controller'}])
node = self.env.nodes[0]
self.assertEqual(['controller'], objects.Node.all_tags(node))
node_tags = ['controller', 'database', 'keystone', 'neutron',
'rabbitmq']
self.assertEqual(node_tags, objects.Node.all_tags(node))
objects.Node.update_roles(node, ['controller', 'cinder'])
node_tags.append('cinder')
self.assertItemsEqual(
['controller', 'cinder'], objects.Node.all_tags(node)
node_tags, objects.Node.all_tags(node)
)
t = objects.Tag.create({
@ -806,8 +809,9 @@ class TestNodeObject(BaseIntegrationTest):
node.tags.append(node_tag)
self.db.add(node_tag)
self.db.flush()
node_tags.append('test')
self.assertItemsEqual(
['controller', 'cinder', 'test'], objects.Node.all_tags(node)
node_tags, objects.Node.all_tags(node)
)
objects.Node.update_roles(node, [])

View File

@ -52,10 +52,8 @@ class BasePrimaryRolesAssignmentTestCase(base.BaseTestCase):
objects.Cluster.set_primary_tags(cluster, cluster.nodes)
nodes = sorted(cluster.nodes, key=lambda node: node.id)
# with lowest uid is assigned as primary
self.assertEqual(
objects.Node.all_tags(nodes[0]), [self.primary_role_name])
self.assertEqual(
objects.Node.all_tags(nodes[1]), [self.role_name])
self.assertIn(self.primary_role_name, objects.Node.all_tags(nodes[0]))
self.assertIn(self.role_name, objects.Node.all_tags(nodes[1]))
def test_primary_controller_assigned_for_ready_node(self):
cluster = self.env.create(
@ -75,10 +73,8 @@ class BasePrimaryRolesAssignmentTestCase(base.BaseTestCase):
ready_node = next(n for n in cluster.nodes
if n.status == consts.NODE_STATUSES.ready)
self.assertEqual(nodes[1], ready_node)
self.assertEqual(
objects.Node.all_tags(nodes[1]), [self.primary_role_name])
self.assertEqual(
objects.Node.all_tags(nodes[0]), [self.role_name])
self.assertIn(self.primary_role_name, objects.Node.all_tags(nodes[1]))
self.assertIn(self.role_name, objects.Node.all_tags(nodes[0]))
def test_primary_assignment_multinode(self):
"""Primary should not be assigned in multinode env."""
@ -96,10 +92,8 @@ class BasePrimaryRolesAssignmentTestCase(base.BaseTestCase):
'status': consts.NODE_STATUSES.ready,
'pending_addition': True}])
objects.Cluster.set_primary_tags(cluster, cluster.nodes)
self.assertEqual(
objects.Node.all_tags(cluster.nodes[0]), [self.role_name])
self.assertEqual(
objects.Node.all_tags(cluster.nodes[1]), [self.role_name])
self.assertIn(self.role_name, objects.Node.all_tags(cluster.nodes[0]))
self.assertIn(self.role_name, objects.Node.all_tags(cluster.nodes[1]))
def test_primary_not_assigned_to_pending_deletion(self):
cluster = self.env.create(
@ -111,8 +105,7 @@ class BasePrimaryRolesAssignmentTestCase(base.BaseTestCase):
'status': consts.NODE_STATUSES.ready,
'pending_deletion': True}])
objects.Cluster.set_primary_tags(cluster, cluster.nodes)
self.assertEqual(
objects.Node.all_tags(cluster.nodes[0]), [self.role_name])
self.assertIn(self.role_name, objects.Node.all_tags(cluster.nodes[0]))
@contextmanager
def assert_node_reassigned(self):
@ -129,14 +122,11 @@ class BasePrimaryRolesAssignmentTestCase(base.BaseTestCase):
'pending_addition': True}])
objects.Cluster.set_primary_tags(cluster, cluster.nodes)
nodes = sorted(cluster.nodes, key=lambda node: node.id)
self.assertEqual(
objects.Node.all_tags(nodes[1]), [self.primary_role_name])
self.assertEqual(
objects.Node.all_tags(nodes[0]), [self.role_name])
self.assertIn(self.primary_role_name, objects.Node.all_tags(nodes[1]))
self.assertIn(self.role_name, objects.Node.all_tags(nodes[0]))
yield nodes[1]
objects.Cluster.set_primary_tags(cluster, cluster.nodes)
self.assertEqual(
objects.Node.all_tags(nodes[0]), [self.primary_role_name])
self.assertIn(self.primary_role_name, objects.Node.all_tags(nodes[0]))
def test_primary_assign_after_reset_to_discovery(self):
"""Removing primary roles after resetting node to discovery"""