552
554
db_api.stack_get_all(self.ctx, sort_keys=sort_keys)
553
555
self.assertEqual(['id'], sort_keys)
557
def test_stack_get_all_hidden_tags(self):
558
cfg.CONF.set_override('hidden_stack_tags', ['hidden'])
560
stacks = [self._setup_test_stack('stack', x)[1] for x in UUIDs]
561
stacks[0].tags = ['hidden']
563
stacks[1].tags = ['random']
566
st_db = db_api.stack_get_all(self.ctx, show_hidden=True)
567
self.assertEqual(3, len(st_db))
569
st_db_visible = db_api.stack_get_all(self.ctx, show_hidden=False)
570
self.assertEqual(2, len(st_db_visible))
572
# Make sure the hidden stack isn't in the stacks returned by
573
# stack_get_all_visible()
574
for stack in st_db_visible:
575
self.assertNotEqual(stacks[0].id, stack.id)
577
def test_stack_get_all_by_tags(self):
578
stacks = [self._setup_test_stack('stack', x)[1] for x in UUIDs]
579
stacks[0].tags = ['tag1']
581
stacks[1].tags = ['tag1', 'tag2']
583
stacks[2].tags = ['tag1', 'tag2', 'tag3']
586
st_db = db_api.stack_get_all(self.ctx, tags=['tag2'])
587
self.assertEqual(2, len(st_db))
589
st_db = db_api.stack_get_all(self.ctx, tags=['tag1', 'tag2'])
590
self.assertEqual(2, len(st_db))
592
st_db = db_api.stack_get_all(self.ctx, tags=['tag1', 'tag2', 'tag3'])
593
self.assertEqual(1, len(st_db))
595
def test_stack_get_all_by_tags_any(self):
596
stacks = [self._setup_test_stack('stack', x)[1] for x in UUIDs]
597
stacks[0].tags = ['tag2']
599
stacks[1].tags = ['tag1', 'tag2']
601
stacks[2].tags = ['tag1', 'tag3']
604
st_db = db_api.stack_get_all(self.ctx, tags_any=['tag1'])
605
self.assertEqual(2, len(st_db))
607
st_db = db_api.stack_get_all(self.ctx, tags_any=['tag1', 'tag2',
609
self.assertEqual(3, len(st_db))
611
def test_stack_get_all_by_not_tags(self):
612
stacks = [self._setup_test_stack('stack', x)[1] for x in UUIDs]
613
stacks[0].tags = ['tag1']
615
stacks[1].tags = ['tag1', 'tag2']
617
stacks[2].tags = ['tag1', 'tag2', 'tag3']
620
st_db = db_api.stack_get_all(self.ctx, not_tags=['tag2'])
621
self.assertEqual(1, len(st_db))
623
st_db = db_api.stack_get_all(self.ctx, not_tags=['tag1', 'tag2'])
624
self.assertEqual(1, len(st_db))
626
st_db = db_api.stack_get_all(self.ctx, not_tags=['tag1', 'tag2',
628
self.assertEqual(2, len(st_db))
630
def test_stack_get_all_by_not_tags_any(self):
631
stacks = [self._setup_test_stack('stack', x)[1] for x in UUIDs]
632
stacks[0].tags = ['tag2']
634
stacks[1].tags = ['tag1', 'tag2']
636
stacks[2].tags = ['tag1', 'tag3']
639
st_db = db_api.stack_get_all(self.ctx, not_tags_any=['tag1'])
640
self.assertEqual(1, len(st_db))
642
st_db = db_api.stack_get_all(self.ctx, not_tags_any=['tag1', 'tag2',
644
self.assertEqual(0, len(st_db))
646
def test_stack_get_all_by_tag_with_pagination(self):
647
stacks = [self._setup_test_stack('stack', x)[1] for x in UUIDs]
648
stacks[0].tags = ['tag1']
650
stacks[1].tags = ['tag2']
652
stacks[2].tags = ['tag1']
655
st_db = db_api.stack_get_all(self.ctx, tags=['tag1'])
656
self.assertEqual(2, len(st_db))
658
st_db = db_api.stack_get_all(self.ctx, tags=['tag1'], limit=1)
659
self.assertEqual(1, len(st_db))
660
self.assertEqual(stacks[2].id, st_db[0].id)
662
st_db = db_api.stack_get_all(self.ctx, tags=['tag1'], limit=1,
664
self.assertEqual(1, len(st_db))
665
self.assertEqual(stacks[0].id, st_db[0].id)
667
def test_stack_get_all_by_tag_with_show_hidden(self):
668
cfg.CONF.set_override('hidden_stack_tags', ['hidden'])
670
stacks = [self._setup_test_stack('stack', x)[1] for x in UUIDs]
671
stacks[0].tags = ['tag1']
673
stacks[1].tags = ['hidden', 'tag1']
676
st_db = db_api.stack_get_all(self.ctx, tags=['tag1'],
678
self.assertEqual(2, len(st_db))
680
st_db = db_api.stack_get_all(self.ctx, tags=['tag1'],
682
self.assertEqual(1, len(st_db))
555
684
def test_stack_count_all(self):
556
685
stacks = [self._setup_test_stack('stack', x)[1] for x in UUIDs]
572
701
st_db = db_api.stack_count_all(self.ctx, show_deleted=True)
573
702
self.assertEqual(3, st_db)
704
def test_count_all_hidden_tags(self):
705
cfg.CONF.set_override('hidden_stack_tags', ['hidden'])
707
stacks = [self._setup_test_stack('stack', x)[1] for x in UUIDs]
708
stacks[0].tags = ['hidden']
710
stacks[1].tags = ['random']
713
st_db = db_api.stack_count_all(self.ctx, show_hidden=True)
714
self.assertEqual(3, st_db)
716
st_db_visible = db_api.stack_count_all(self.ctx, show_hidden=False)
717
self.assertEqual(2, st_db_visible)
719
def test_count_all_by_tags(self):
720
stacks = [self._setup_test_stack('stack', x)[1] for x in UUIDs]
721
stacks[0].tags = ['tag1']
723
stacks[1].tags = ['tag2']
725
stacks[2].tags = ['tag2']
728
st_db = db_api.stack_count_all(self.ctx, tags=['tag1'])
729
self.assertEqual(1, st_db)
731
st_db = db_api.stack_count_all(self.ctx, tags=['tag2'])
732
self.assertEqual(2, st_db)
734
def test_count_all_by_tag_with_show_hidden(self):
735
cfg.CONF.set_override('hidden_stack_tags', ['hidden'])
737
stacks = [self._setup_test_stack('stack', x)[1] for x in UUIDs]
738
stacks[0].tags = ['tag1']
740
stacks[1].tags = ['hidden', 'tag1']
743
st_db = db_api.stack_count_all(self.ctx, tags=['tag1'],
745
self.assertEqual(2, st_db)
747
st_db = db_api.stack_count_all(self.ctx, tags=['tag1'],
749
self.assertEqual(1, st_db)
575
751
def test_stack_count_all_with_filters(self):
576
752
self._setup_test_stack('foo', UUID1)
577
753
self._setup_test_stack('bar', UUID2)
605
781
self.m.UnsetStubs()
607
783
events = db_api.event_get_all_by_stack(self.ctx, UUID1)
608
self.assertEqual(2, len(events))
784
self.assertEqual(4, len(events))
610
786
# test filter by resource_status
611
787
filters = {'resource_status': 'COMPLETE'}
612
788
events = db_api.event_get_all_by_stack(self.ctx, UUID1,
614
self.assertEqual(1, len(events))
790
self.assertEqual(2, len(events))
615
791
self.assertEqual('COMPLETE', events[0].resource_status)
792
self.assertEqual('COMPLETE', events[1].resource_status)
616
793
# test filter by resource_action
617
794
filters = {'resource_action': 'CREATE'}
618
795
events = db_api.event_get_all_by_stack(self.ctx, UUID1,
620
self.assertEqual(2, len(events))
797
self.assertEqual(4, len(events))
621
798
self.assertEqual('CREATE', events[0].resource_action)
622
799
self.assertEqual('CREATE', events[1].resource_action)
800
self.assertEqual('CREATE', events[2].resource_action)
801
self.assertEqual('CREATE', events[3].resource_action)
623
802
# test filter by resource_type
624
803
filters = {'resource_type': 'AWS::EC2::Instance'}
625
804
events = db_api.event_get_all_by_stack(self.ctx, UUID1,
649
828
filters = {'resource_status': 'COMPLETE'}
650
829
events = db_api.event_get_all_by_stack(self.ctx, UUID1,
652
self.assertEqual(2, len(events))
831
self.assertEqual(4, len(events))
653
832
self.assertEqual('COMPLETE', events[0].resource_status)
654
833
self.assertEqual('COMPLETE', events[1].resource_status)
834
self.assertEqual('COMPLETE', events[2].resource_status)
835
self.assertEqual('COMPLETE', events[3].resource_status)
655
836
# test filter by resource_action
656
837
filters = {'resource_action': 'DELETE',
657
838
'resource_status': 'COMPLETE'}
658
839
events = db_api.event_get_all_by_stack(self.ctx, UUID1,
660
self.assertEqual(1, len(events))
841
self.assertEqual(2, len(events))
661
842
self.assertEqual('DELETE', events[0].resource_action)
662
843
self.assertEqual('COMPLETE', events[0].resource_status)
844
self.assertEqual('DELETE', events[1].resource_action)
845
self.assertEqual('COMPLETE', events[1].resource_status)
663
846
# test limit and marker
664
847
events_all = db_api.event_get_all_by_stack(self.ctx, UUID1)
665
self.assertEqual(4, len(events_all))
848
self.assertEqual(8, len(events_all))
667
850
marker = events_all[1].uuid
668
851
events2_uuid = events_all[2].uuid
1016
1199
self.assertEqual(values['status'], snapshot.status)
1017
1200
self.assertIsNotNone(snapshot.created_at)
1202
def test_snapshot_get_by_another_stack(self):
1203
template = create_raw_template(self.ctx)
1204
user_creds = create_user_creds(self.ctx)
1205
stack = create_stack(self.ctx, template, user_creds)
1206
stack1 = create_stack(self.ctx, template, user_creds)
1207
values = {'tenant': self.ctx.tenant_id, 'status': 'IN_PROGRESS',
1208
'stack_id': stack.id}
1209
snapshot = db_api.snapshot_create(self.ctx, values)
1210
self.assertIsNotNone(snapshot)
1211
snapshot_id = snapshot.id
1212
self.assertRaises(exception.SnapshotNotFound,
1213
db_api.snapshot_get_by_stack,
1214
self.ctx, snapshot_id, stack1)
1019
1216
def test_snapshot_get_not_found_invalid_tenant(self):
1020
1217
template = create_raw_template(self.ctx)
1021
1218
user_creds = create_user_creds(self.ctx)
1324
1528
self.assertIn(exp_msg, six.text_type(err))
1531
class DBAPIStackTagTest(common.HeatTestCase):
1533
super(DBAPIStackTagTest, self).setUp()
1534
self.ctx = utils.dummy_context()
1535
self.template = create_raw_template(self.ctx)
1536
self.user_creds = create_user_creds(self.ctx)
1537
self.stack = create_stack(self.ctx, self.template, self.user_creds)
1539
def test_stack_tags_set(self):
1540
tags = db_api.stack_tags_set(self.ctx, self.stack.id, ['tag1', 'tag2'])
1541
self.assertEqual(self.stack.id, tags[0].stack_id)
1542
self.assertEqual('tag1', tags[0].tag)
1544
tags = db_api.stack_tags_set(self.ctx, self.stack.id, [])
1545
self.assertIsNone(tags)
1547
def test_stack_tags_get(self):
1548
db_api.stack_tags_set(self.ctx, self.stack.id, ['tag1', 'tag2'])
1549
tags = db_api.stack_tags_get(self.ctx, self.stack.id)
1550
self.assertEqual(self.stack.id, tags[0].stack_id)
1551
self.assertEqual('tag1', tags[0].tag)
1553
tags = db_api.stack_tags_get(self.ctx, UUID1)
1554
self.assertIsNone(tags)
1556
def test_stack_tags_delete(self):
1557
db_api.stack_tags_set(self.ctx, self.stack.id, ['tag1', 'tag2'])
1558
db_api.stack_tags_delete(self.ctx, self.stack.id)
1559
tags = db_api.stack_tags_get(self.ctx, self.stack.id)
1560
self.assertIsNone(tags)
1327
1563
class DBAPIStackTest(common.HeatTestCase):
1328
1564
def setUp(self):
1329
1565
super(DBAPIStackTest, self).setUp()
1572
1808
self.assertIsNone(db_api.stack_get(ctx, stacks[s].id,
1573
1809
show_deleted=True))
1811
def test_stack_get_root_id(self):
1812
root = create_stack(self.ctx, self.template, self.user_creds,
1814
child_1 = create_stack(self.ctx, self.template, self.user_creds,
1815
name='child 1 stack', owner_id=root.id)
1816
child_2 = create_stack(self.ctx, self.template, self.user_creds,
1817
name='child 2 stack', owner_id=child_1.id)
1818
child_3 = create_stack(self.ctx, self.template, self.user_creds,
1819
name='child 3 stack', owner_id=child_2.id)
1821
self.assertEqual(root.id, db_api.stack_get_root_id(
1822
self.ctx, child_3.id))
1823
self.assertEqual(root.id, db_api.stack_get_root_id(
1824
self.ctx, child_2.id))
1825
self.assertEqual(root.id, db_api.stack_get_root_id(
1827
self.assertEqual(root.id, db_api.stack_get_root_id(
1828
self.ctx, child_1.id))
1830
def test_stack_count_total_resources(self):
1832
def add_resources(stack, count):
1833
for i in range(count):
1835
self.ctx, stack, name='%s-%s' % (stack.name, i))
1837
root = create_stack(self.ctx, self.template, self.user_creds,
1840
# stack with 3 children
1841
s_1 = create_stack(self.ctx, self.template, self.user_creds,
1842
name='s_1', owner_id=root.id)
1843
s_1_1 = create_stack(self.ctx, self.template, self.user_creds,
1844
name='s_1_1', owner_id=s_1.id)
1845
s_1_2 = create_stack(self.ctx, self.template, self.user_creds,
1846
name='s_1_2', owner_id=s_1.id)
1847
s_1_3 = create_stack(self.ctx, self.template, self.user_creds,
1848
name='s_1_3', owner_id=s_1.id)
1850
# stacks 4 ancestors deep
1851
s_2 = create_stack(self.ctx, self.template, self.user_creds,
1852
name='s_2', owner_id=root.id)
1853
s_2_1 = create_stack(self.ctx, self.template, self.user_creds,
1854
name='s_2_1', owner_id=s_2.id)
1855
s_2_1_1 = create_stack(self.ctx, self.template, self.user_creds,
1856
name='s_2_1_1', owner_id=s_2_1.id)
1857
s_2_1_1_1 = create_stack(self.ctx, self.template, self.user_creds,
1858
name='s_2_1_1_1', owner_id=s_2_1_1.id)
1860
s_3 = create_stack(self.ctx, self.template, self.user_creds,
1861
name='s_3', owner_id=root.id)
1862
s_4 = create_stack(self.ctx, self.template, self.user_creds,
1863
name='s_4', owner_id=root.id)
1865
add_resources(root, 3)
1866
add_resources(s_1, 2)
1867
add_resources(s_1_1, 4)
1868
add_resources(s_1_2, 5)
1869
add_resources(s_1_3, 6)
1871
add_resources(s_2, 1)
1872
add_resources(s_2_1_1_1, 1)
1873
add_resources(s_3, 4)
1875
self.assertEqual(26, db_api.stack_count_total_resources(
1878
self.assertEqual(17, db_api.stack_count_total_resources(
1880
self.assertEqual(4, db_api.stack_count_total_resources(
1881
self.ctx, s_1_1.id))
1882
self.assertEqual(5, db_api.stack_count_total_resources(
1883
self.ctx, s_1_2.id))
1884
self.assertEqual(6, db_api.stack_count_total_resources(
1885
self.ctx, s_1_3.id))
1887
self.assertEqual(2, db_api.stack_count_total_resources(
1889
self.assertEqual(1, db_api.stack_count_total_resources(
1890
self.ctx, s_2_1.id))
1891
self.assertEqual(1, db_api.stack_count_total_resources(
1892
self.ctx, s_2_1_1.id))
1893
self.assertEqual(1, db_api.stack_count_total_resources(
1894
self.ctx, s_2_1_1_1.id))
1895
self.assertEqual(4, db_api.stack_count_total_resources(
1897
self.assertEqual(0, db_api.stack_count_total_resources(
1899
self.assertEqual(0, db_api.stack_count_total_resources(
1901
self.assertEqual(0, db_api.stack_count_total_resources(
1576
1905
class DBAPIResourceTest(common.HeatTestCase):
1577
1906
def setUp(self):
2354
2683
self.ctx, self.stack.id, self.stack.current_traversal, True
2356
2685
self.assertEqual(None, ret_sync_point_stack)
2688
class DBAPICryptParamsPropsTest(common.HeatTestCase):
2690
super(DBAPICryptParamsPropsTest, self).setUp()
2691
self.ctx = utils.dummy_context()
2692
t = template_format.parse('''
2693
heat_template_version: 2013-05-23
2697
description: value1.
2700
description: value2.
2704
type: GenericResourceType
2708
'files': {'foo': 'bar'},
2709
'environment': {'parameters': {'param1': 'foo',
2711
self.template = db_api.raw_template_create(self.ctx, template)
2713
def test_db_encrypt_decrypt(self):
2714
session = db_api.get_session()
2716
env = session.query(models.RawTemplate).all()[0].environment
2717
self.assertEqual('bar', env['parameters']['param2'])
2719
db_api.db_encrypt_parameters_and_properties(
2720
self.ctx, cfg.CONF.auth_encryption_key)
2722
env = session.query(models.RawTemplate).all()[0].environment
2723
self.assertEqual('oslo_decrypt_v1',
2724
env['parameters']['param2'][0])
2726
db_api.db_decrypt_parameters_and_properties(
2727
self.ctx, cfg.CONF.auth_encryption_key)
2729
env = session.query(models.RawTemplate).all()[0].environment
2730
self.assertEqual('bar', env['parameters']['param2'])
2732
# Use a different encryption key to decrypt
2733
db_api.db_encrypt_parameters_and_properties(
2734
self.ctx, cfg.CONF.auth_encryption_key)
2735
db_api.db_decrypt_parameters_and_properties(
2736
self.ctx, '774c15be099ea74123a9b9592ff12680')
2738
env = session.query(models.RawTemplate).all()[0].environment
2739
self.assertNotEqual('bar', env['parameters']['param2'])