def test_attach_failed_creating_server_group(self): self.spec['properties']['servergroup']['name'] = 'KONGFU' x_profile = mock.Mock() x_profile.type = 'os.nova.server-1.0' x_profile.spec = {'foo': 'bar'} cluster = mock.Mock(id='CLUSTER_ID', user='******', project='P1', rt={'profile': x_profile}) x_nova = mock.Mock() x_nova.server_group_find.return_value = None x_nova.server_group_create.side_effect = Exception() policy = ap.AffinityPolicy('test-policy', self.spec) mock_nova = self.patchobject(policy, 'nova', return_value=x_nova) # do it res, data = policy.attach(cluster) # assertions self.assertEqual('Failed in creating servergroup.', data) self.assertFalse(res) mock_nova.assert_called_once_with('U1', 'P1') x_nova.server_group_find.assert_called_once_with('KONGFU', True) x_nova.server_group_create.assert_called_once_with( name=mock.ANY, policies=[policy.ANTI_AFFINITY])
def test_attach_failed_finding(self): self.spec['properties']['servergroup']['name'] = 'KONGFU' x_profile = mock.Mock() x_profile.type = 'os.nova.server-1.0' x_profile.spec = {'foo': 'bar'} cluster = mock.Mock(id='CLUSTER_ID', user='******', project='PROJ', rt={'profile': x_profile}) x_nova = mock.Mock() err = exc.InternalError(code=500, message='Boom') x_nova.server_group_find.side_effect = err policy = ap.AffinityPolicy('test-policy', self.spec) mock_nova = self.patchobject(policy, 'nova', return_value=x_nova) # do it res, data = policy.attach(cluster) # assertions self.assertFalse(res) self.assertEqual("Failed in retrieving servergroup 'KONGFU'.", data) mock_nova.assert_called_once_with('USER', 'PROJ') x_nova.server_group_find.assert_called_once_with('KONGFU', True)
def test_attach_policies_not_match(self): self.spec['properties']['servergroup']['name'] = 'KONGFU' x_profile = mock.Mock() x_profile.type = 'os.nova.server-1.0' x_profile.spec = {'foo': 'bar'} cluster = mock.Mock(id='CLUSTER_ID', user='******', project='P1', rt={'profile': x_profile}) x_group = mock.Mock(id='GROUP_ID', policies=['affinity']) x_nova = mock.Mock() x_nova.server_group_find.return_value = x_group policy = ap.AffinityPolicy('test-policy', self.spec) mock_nova = self.patchobject(policy, 'nova', return_value=x_nova) # do it res, data = policy.attach(cluster) # assertions self.assertFalse(res) self.assertEqual("Policies specified (anti-affinity) doesn't match " "that of the existing servergroup (affinity).", data) mock_nova.assert_called_once_with('U1', 'P1') x_nova.server_group_find.assert_called_once_with('KONGFU', True)
def test_attach_with_group_name_not_provided(self): x_profile = mock.Mock() x_profile.spec = {'foo': 'bar'} x_profile.type = 'os.nova.server-1.0' cluster = mock.Mock(id='CLUSTER_ID', user='******', project='PROJ', rt={'profile': x_profile}) x_group = mock.Mock(id='GROUP_ID') x_nova = mock.Mock() x_nova.server_group_create.return_value = x_group policy = ap.AffinityPolicy('test-policy', self.spec) mock_nova = self.patchobject(policy, 'nova', return_value=x_nova) x_data = mock.Mock() mock_build = self.patchobject(policy, '_build_policy_data', return_value=x_data) # do it res, data = policy.attach(cluster) # assertions self.assertTrue(res) self.assertEqual(x_data, data) mock_nova.assert_called_once_with('USER', 'PROJ') x_nova.server_group_create.assert_called_once_with( name=mock.ANY, policies=[policy.ANTI_AFFINITY]) mock_build.assert_called_once_with({ 'servergroup_id': 'GROUP_ID', 'inherited_group': False })
def test_policy_init(self): policy = ap.AffinityPolicy('test-policy', self.spec) self.assertIsNone(policy.id) self.assertEqual('test-policy', policy.name) self.assertEqual('senlin.policy.affinity-1.0', policy.type) self.assertFalse(policy.enable_drs) self.assertIsNone(policy._novaclient)
def test_attach_using_profile_hints(self): x_profile = mock.Mock() x_profile.type = 'os.nova.server-1.0' x_profile.spec = { 'scheduler_hints': { 'group': 'KONGFOO', } } cluster = mock.Mock(id='CLUSTER_ID') cluster.rt = {'profile': x_profile} x_group = mock.Mock(id='GROUP_ID', policies=[u'anti-affinity']) x_nova = mock.Mock() x_nova.find_server_group.return_value = x_group policy = ap.AffinityPolicy('test-policy', self.spec) mock_nova = self.patchobject(policy, 'nova', return_value=x_nova) x_data = mock.Mock() mock_build = self.patchobject(policy, '_build_policy_data', return_value=x_data) # do it res, data = policy.attach(cluster) # assertions self.assertEqual(x_data, data) self.assertTrue(res) mock_nova.assert_called_once_with(cluster) x_nova.find_server_group.assert_called_once_with('KONGFOO', True) mock_build.assert_called_once_with({ 'servergroup_id': 'GROUP_ID', 'inherited_group': True })
def test_attach_with_group_found(self): self.spec['properties']['servergroup']['name'] = 'KONGFU' x_profile = mock.Mock() x_profile.type = 'os.nova.server-1.0' x_profile.spec = {'foo': 'bar'} cluster = mock.Mock(id='CLUSTER_ID', user='******', project='PP', rt={'profile': x_profile}) x_group = mock.Mock(id='GROUP_ID', policies=['anti-affinity']) x_nova = mock.Mock() x_nova.server_group_find.return_value = x_group policy = ap.AffinityPolicy('test-policy', self.spec) mock_nova = self.patchobject(policy, 'nova', return_value=x_nova) x_data = mock.Mock() mock_build = self.patchobject(policy, '_build_policy_data', return_value=x_data) # do it res, data = policy.attach(cluster) # assertions self.assertTrue(res) self.assertEqual(x_data, data) mock_nova.assert_called_once_with('UU', 'PP') x_nova.server_group_find.assert_called_once_with('KONGFU', True) mock_build.assert_called_once_with({ 'servergroup_id': 'GROUP_ID', 'inherited_group': True })
def test_detach_failing_delete_sg(self, mock_context, mock_cp): cluster = mock.Mock(id='CLUSTER_ID', user='******', project='PROJ') x_ctx = mock.Mock() mock_context.return_value = x_ctx x_binding = mock.Mock(data={'foo': 'bar'}) mock_cp.return_value = x_binding policy_data = { 'servergroup_id': 'SERVERGROUP_ID', 'inherited_group': False, } policy = ap.AffinityPolicy('test-policy', self.spec) policy.id = 'POLICY_ID' mock_extract = self.patchobject(policy, '_extract_policy_data', return_value=policy_data) x_nova = mock.Mock() x_nova.server_group_delete.side_effect = Exception() mock_nova = self.patchobject(policy, 'nova', return_value=x_nova) # do it res, data = policy.detach(cluster) # assertions self.assertFalse(res) self.assertEqual('Failed in deleting servergroup.', data) mock_context.assert_called_once_with() mock_cp.assert_called_once_with(x_ctx, 'CLUSTER_ID', 'POLICY_ID') mock_extract.assert_called_once_with({'foo': 'bar'}) mock_nova.assert_called_once_with('USER', 'PROJ') x_nova.server_group_delete.assert_called_once_with('SERVERGROUP_ID')
def test_pre_op_for_node_create(self, mock_cp): x_action = mock.Mock() x_action.data = {} x_action.action = consts.NODE_CREATE x_binding = mock.Mock() mock_cp.return_value = x_binding policy_data = { 'servergroup_id': 'SERVERGROUP_ID', 'inherited_group': False, } policy = ap.AffinityPolicy('test-policy', self.spec) policy.id = 'POLICY_ID' mock_extract = self.patchobject(policy, '_extract_policy_data', return_value=policy_data) # do it policy.pre_op('CLUSTER_ID', x_action) mock_cp.assert_called_once_with(x_action.context, 'CLUSTER_ID', 'POLICY_ID') mock_extract.assert_called_once_with(x_binding.data) self.assertEqual( { 'placement': { 'count': 1, 'placements': [ { 'servergroup': 'SERVERGROUP_ID' } ] } }, x_action.data) x_action.store.assert_called_once_with(x_action.context)
def test_pre_op_resize_shrinking(self, mock_cp, mock_cluster, mock_count): def fake_parse_func(action, cluster, current): action.data = { 'deletion': { 'count': 2 } } x_action = mock.Mock() x_action.data = {} x_action.action = consts.CLUSTER_RESIZE x_action.inputs = { 'adjustment_type': consts.EXACT_CAPACITY, 'number': 10 } x_cluster = mock.Mock() mock_cluster.return_value = x_cluster mock_count.return_value = 5 mock_parse = self.patchobject(scaleutils, 'parse_resize_params', side_effect=fake_parse_func) policy = ap.AffinityPolicy('test-policy', self.spec) policy.id = 'POLICY_ID' mock_extract = self.patchobject(policy, '_extract_policy_data') # do it policy.pre_op('CLUSTER_ID', x_action) mock_count.assert_called_once_with(x_action.context, 'CLUSTER_ID') mock_parse.assert_called_once_with(x_action, x_cluster, 5) mock_cluster.assert_called_once_with(x_action.context, 'CLUSTER_ID') self.assertEqual(0, mock_cp.call_count) self.assertEqual(0, mock_extract.call_count)
def test_attach_with_group_not_found(self): self.spec['properties']['servergroup']['name'] = 'KONGFU' x_profile = mock.Mock() x_profile.spec = {'foo': 'bar'} x_profile.type = 'os.nova.server-1.0' cluster = mock.Mock(id='CLUSTER_ID') cluster.rt = {'profile': x_profile} x_group = mock.Mock(id='GROUP_ID') x_nova = mock.Mock() x_nova.find_server_group.return_value = None x_nova.create_server_group.return_value = x_group policy = ap.AffinityPolicy('test-policy', self.spec) mock_nova = self.patchobject(policy, 'nova', return_value=x_nova) x_data = mock.Mock() mock_build = self.patchobject(policy, '_build_policy_data', return_value=x_data) # do it res, data = policy.attach(cluster) # assertions self.assertTrue(res) self.assertEqual(x_data, data) mock_nova.assert_called_once_with(cluster) x_nova.find_server_group.assert_called_once_with('KONGFU', True) x_nova.create_server_group.assert_called_once_with( name='KONGFU', policies=[policy.ANTI_AFFINITY]) mock_build.assert_called_once_with({ 'servergroup_id': 'GROUP_ID', 'inherited_group': False })
def test_detach_not_inherited(self, mock_context, mock_cp): cluster = mock.Mock(id='CLUSTER_ID', user='******', project='PROJECT') x_ctx = mock.Mock() mock_context.return_value = x_ctx x_binding = mock.Mock() mock_cp.return_value = x_binding policy_data = { 'servergroup_id': 'SERVERGROUP_ID', 'inherited_group': False, } policy = ap.AffinityPolicy('test-policy', self.spec) policy.id = 'POLICY_ID' mock_extract = self.patchobject(policy, '_extract_policy_data', return_value=policy_data) x_nova = mock.Mock() x_nova.server_group_delete.return_value = None mock_nova = self.patchobject(policy, 'nova', return_value=x_nova) # do it res, data = policy.detach(cluster) # assertions self.assertTrue(res) self.assertEqual('Servergroup resource deletion succeeded.', data) mock_context.assert_called_once_with() mock_cp.assert_called_once_with(x_ctx, 'CLUSTER_ID', 'POLICY_ID') mock_extract.assert_called_once_with(x_binding.data) mock_nova.assert_called_once_with('USER', 'PROJECT') x_nova.server_group_delete.assert_called_once_with('SERVERGROUP_ID')
def test_pre_op_use_resize_params(self, mock_cp): def fake_parse_func(action, cluster, current): action.data = { 'creation': { 'count': 2 } } x_action = mock.Mock() x_action.data = {} x_action.action = consts.CLUSTER_RESIZE x_action.inputs = { 'adjustment_type': consts.EXACT_CAPACITY, 'number': 4 } x_cluster = mock.Mock() x_cluster.nodes = [mock.Mock(), mock.Mock()] x_action.entity = x_cluster mock_parse = self.patchobject(scaleutils, 'parse_resize_params', side_effect=fake_parse_func) x_binding = mock.Mock() mock_cp.return_value = x_binding policy_data = { 'servergroup_id': 'SERVERGROUP_ID', 'inherited_group': False, } policy = ap.AffinityPolicy('test-policy', self.spec) policy.id = 'POLICY_ID' mock_extract = self.patchobject(policy, '_extract_policy_data', return_value=policy_data) # do it policy.pre_op('CLUSTER_ID', x_action) mock_parse.assert_called_once_with(x_action, x_cluster, 2) mock_cp.assert_called_once_with(x_action.context, 'CLUSTER_ID', 'POLICY_ID') mock_extract.assert_called_once_with(x_binding.data) self.assertEqual( { 'creation': { 'count': 2, }, 'placement': { 'count': 2, 'placements': [ { 'servergroup': 'SERVERGROUP_ID' }, { 'servergroup': 'SERVERGROUP_ID' } ] } }, x_action.data) x_action.store.assert_called_once_with(x_action.context)
def test_validate_no_validate_props(self, mock_base_validate): policy = ap.AffinityPolicy('test-policy', self.spec) ctx = mock.Mock(user='******', project='P1') res = policy.validate(ctx, False) self.assertTrue(res) mock_base_validate.assert_called_once_with(ctx, False)
def test_nova_already_initialized(self): cluster = mock.Mock() policy = ap.AffinityPolicy('test-policy', self.spec) x_nova = mock.Mock() policy._novaclient = x_nova result = policy.nova(cluster) self.assertEqual(x_nova, result)
def test_pre_op_with_drs_enabled(self, mock_cp, mock_cluster): self.spec['properties']['enable_drs_extension'] = True x_action = mock.Mock() x_action.data = {'creation': {'count': 2}} x_binding = mock.Mock() mock_cp.return_value = x_binding policy_data = { 'servergroup_id': 'SERVERGROUP_ID', 'inherited_group': False, } policy = ap.AffinityPolicy('test-policy', self.spec) policy.id = 'POLICY_ID' mock_extract = self.patchobject(policy, '_extract_policy_data', return_value=policy_data) x_cluster = mock.Mock() mock_cluster.return_value = x_cluster x_nova = mock.Mock() mock_nova = self.patchobject(policy, 'nova', return_value=x_nova) x_hypervisors = [ mock.Mock(id='HV_1', hypervisor_hostname='host1'), mock.Mock(id='HV_2', hypervisor_hostname='vsphere_drs1') ] x_nova.hypervisor_list.return_value = x_hypervisors x_hvinfo = {'service': {'host': 'drshost1'}} x_nova.hypervisor_get.return_value = x_hvinfo # do it policy.pre_op('CLUSTER_ID', x_action) mock_cp.assert_called_once_with(x_action.context, 'CLUSTER_ID', 'POLICY_ID') mock_extract.assert_called_once_with(x_binding.data) mock_cluster.assert_called_once_with(x_action.context, 'CLUSTER_ID') mock_nova.assert_called_once_with(x_cluster) x_nova.hypervisor_list.assert_called_once_with() x_nova.hypervisor_get.assert_called_once_with('HV_2') self.assertEqual( { 'creation': { 'count': 2 }, 'placement': { 'count': 2, 'placements': [{ 'zone': 'nova:drshost1', 'servergroup': 'SERVERGROUP_ID' }, { 'zone': 'nova:drshost1', 'servergroup': 'SERVERGROUP_ID' }] } }, x_action.data) x_action.store.assert_called_once_with(x_action.context)
def test_attach_failed_base_return_false(self, mock_attach): cluster = mock.Mock() mock_attach.return_value = (False, 'Something is wrong.') policy = ap.AffinityPolicy('test-policy', self.spec) res, data = policy.attach(cluster) self.assertFalse(res) self.assertEqual('Something is wrong.', data)
def test_validate_az_not_specified(self, mock_base_validate): policy = ap.AffinityPolicy('test-policy', self.spec) nc = mock.Mock() policy._novaclient = nc ctx = mock.Mock(user='******', project='P1') res = policy.validate(ctx, True) self.assertTrue(res) mock_base_validate.assert_called_once_with(ctx, True) self.assertEqual(0, nc.validate_azs.call_count)
def test_validate_okay(self, mock_base_validate): new_spec = copy.deepcopy(self.spec) new_spec['properties']['availability_zone'] = 'NEWAZ' policy = ap.AffinityPolicy('test-policy', new_spec) nc = mock.Mock() nc.validate_azs.return_value = ['NEWAZ'] policy._novaclient = nc ctx = mock.Mock(user='******', project='P1') res = policy.validate(ctx, True) self.assertTrue(res) mock_base_validate.assert_called_once_with(ctx, True) nc.validate_azs.assert_called_once_with(['NEWAZ'])
def test_validate_az_not_found(self, mock_base_validate): new_spec = copy.deepcopy(self.spec) new_spec['properties']['availability_zone'] = 'NEWAZ' policy = ap.AffinityPolicy('test-policy', new_spec) nc = mock.Mock() nc.validate_azs.return_value = [] # this means not found policy._novaclient = nc ctx = mock.Mock(user='******', project='P1') ex = self.assertRaises(exc.InvalidSpec, policy.validate, ctx, True) mock_base_validate.assert_called_once_with(ctx, True) nc.validate_azs.assert_called_once_with(['NEWAZ']) self.assertEqual( "The specified availability_zone 'NEWAZ' could not " "be found.", six.text_type(ex))
def test_nova(self, mock_driver): cluster = mock.Mock() policy = ap.AffinityPolicy('test-policy', self.spec) mock_params = mock.Mock() mock_build = self.patchobject(policy, '_build_conn_params', return_value=mock_params) x_driver = mock.Mock() mock_driver.return_value = x_driver result = policy.nova(cluster) x_nova = x_driver.compute.return_value self.assertEqual(x_nova, result) self.assertEqual(x_nova, policy._novaclient) mock_build.assert_called_once_with(cluster) x_driver.compute.assert_called_once_with(mock_params)
def test_pre_op_with_drs_enabled_no_match(self, mock_cp, mock_cluster): self.spec['properties']['enable_drs_extension'] = True x_action = mock.Mock() x_action.data = {'creation': {'count': 2}} x_binding = mock.Mock() mock_cp.return_value = x_binding policy_data = { 'servergroup_id': 'SERVERGROUP_ID', 'inherited_group': False, } policy = ap.AffinityPolicy('test-policy', self.spec) policy.id = 'POLICY_ID' mock_extract = self.patchobject(policy, '_extract_policy_data', return_value=policy_data) x_cluster = mock.Mock(user='******', project='PROJ') mock_cluster.return_value = x_cluster x_nova = mock.Mock() mock_nova = self.patchobject(policy, 'nova', return_value=x_nova) x_hypervisors = [ mock.Mock(id='HV_1', hypervisor_hostname='host1'), mock.Mock(id='HV_2', hypervisor_hostname='host2') ] x_nova.hypervisor_list.return_value = x_hypervisors # do it policy.pre_op('CLUSTER_ID', x_action) mock_cp.assert_called_once_with(x_action.context, 'CLUSTER_ID', 'POLICY_ID') mock_extract.assert_called_once_with(x_binding.data) mock_cluster.assert_called_once_with(x_action.context, 'CLUSTER_ID') mock_nova.assert_called_once_with('USER', 'PROJ') self.assertEqual( { 'creation': { 'count': 2 }, 'status': 'ERROR', 'status_reason': 'No suitable vSphere host is available.' }, x_action.data) x_action.store.assert_called_once_with(x_action.context)
def test_pre_op_with_zone_name(self, mock_cp): self.spec['properties']['availability_zone'] = 'BLUE_ZONE' x_action = mock.Mock() x_action.data = {'creation': {'count': 2}} x_binding = mock.Mock() mock_cp.return_value = x_binding policy_data = { 'servergroup_id': 'SERVERGROUP_ID', 'inherited_group': False, } policy = ap.AffinityPolicy('test-policy', self.spec) policy.id = 'POLICY_ID' mock_extract = self.patchobject(policy, '_extract_policy_data', return_value=policy_data) # do it policy.pre_op('CLUSTER_ID', x_action) mock_cp.assert_called_once_with(x_action.context, 'CLUSTER_ID', 'POLICY_ID') mock_extract.assert_called_once_with(x_binding.data) self.assertEqual( { 'creation': { 'count': 2 }, 'placement': { 'count': 2, 'placements': [ { 'zone': 'BLUE_ZONE', 'servergroup': 'SERVERGROUP_ID' }, { 'zone': 'BLUE_ZONE', 'servergroup': 'SERVERGROUP_ID' } ] } }, x_action.data) x_action.store.assert_called_once_with(x_action.context)
def test_detach_binding_data_empty(self, mock_context, mock_cp): cluster = mock.Mock(id='CLUSTER_ID') x_ctx = mock.Mock() mock_context.return_value = x_ctx x_binding = mock.Mock(data={}) mock_cp.return_value = x_binding policy = ap.AffinityPolicy('test-policy', self.spec) policy.id = 'POLICY_ID' # do it res, data = policy.detach(cluster) # assertions self.assertTrue(res) self.assertEqual('Servergroup resource deletion succeeded.', data) mock_context.assert_called_once_with() mock_cp.assert_called_once_with(x_ctx, 'CLUSTER_ID', 'POLICY_ID')