Example #1
0
def main(argv=None):

    if argv is None:
        argv = sys.argv

    # Prepare the Tuskar service and load the database backend.
    service.prepare_service(argv)
    get_backend()

    migration.db_sync()
Example #2
0
def main(argv=None):

    if argv is None:
        argv = sys.argv

    # Prepare the Tuskar service and load the database backend.
    service.prepare_service(argv)
    get_backend()

    migration.db_sync()
Example #3
0
class TestDataCenters(api.FunctionalTest):

    db = dbapi.get_backend()

    # Setup an ResourceClass with some Rack to trigger also bash script
    # generation and to add some Racks into the Heat template
    #
    def setUp(self):
        super(TestDataCenters, self).setUp()
        self.rc = self.db.create_resource_class(ResourceClass(
            name='t1',
            service_type='compute',
        ))
        self.racks = []

    def tearDown(self):
        self.db.delete_resource_class(self.rc.id)
        self.teardown_racks()
        super(TestDataCenters, self).tearDown()

    def setup_racks(self):
        for rack_num in range(1, 4):
            self.racks.append(self.db.create_rack(Rack(
                name='rack-no-{0}'.format(rack_num),
                subnet='192.168.2.{0}/24'.format(rack_num),
                resource_class=Relation(id=self.rc.id),
                nodes=[Node(id='1'), Node(id='2')]
            ))
            )

    def teardown_racks(self):
        for rack in self.racks:
            self.db.delete_rack(rack.id)

    def test_it_returns_the_heat_overcloud_template(self):
        self.setup_racks()
        response = self.app.get('/v1/data_centers/template')
        self.assertEqual(response.status, '200 OK')
        self.assertRegexpMatches(response.body, 'HeatTemplateFormatVersion')
Example #4
0
class TestDbFlavors(db_base.DbTestCase):
    db = dbapi.get_backend()

    def setup(self):
        super(TestDbFlavors, self).setUp()

    def tearDown(self):
        super(TestDbFlavors, self).tearDown()

    #exercises 'def create_resource_class' for flavors
    def test_it_can_create_flavors_during_resource_class_create(self):
        #get a pecan resource_class:
        rc = utils.get_test_resource_class()
        #add some flavors:
        rc.flavors = [utils.get_test_flavor(name='a', value='9'),
                      utils.get_test_flavor(name='b', value='8'),
                      utils.get_test_flavor(name='c', value='7')]
        #create rc with flavors in database
        db_rc = self.db.create_resource_class(rc)
        #check the flavors are ok:
        self.__check_flavor_capacities(db_rc.flavors, ['a', 'b', 'c'],
                                                      ['7', '8', '9'])
        #cleanup
        self.db.delete_resource_class(db_rc.id)

    def test_it_can_update_resource_class_flavors(self):
        #create a resource class
        pecan_rc = utils.get_test_resource_class()
        #give it a flavor:
        pecan_rc.flavors = [utils.get_test_flavor(name='foo', value='99')]
        db_rc = self.db.create_resource_class(pecan_rc)
        #update the resource class with new flavors:
        pecan_rc.flavors = [utils.get_test_flavor(name='one', value='1'),
                            utils.get_test_flavor(name='two', value='2'),
                            utils.get_test_flavor(name='three', value='3')]
        #call the update
        updated_rc = self.db.update_resource_class(db_rc.id, pecan_rc)
        #make test assertions
        self.__check_flavor_capacities(updated_rc.flavors,
                                       ['one', 'two', 'three'],
                                       ['1', '2', '3'])
        #cleanup
        self.db.delete_resource_class(db_rc.id)

    def test_it_can_create_a_resource_class_flavor(self):
        #create a resource class:
        pecan_rc = utils.get_test_resource_class()
        db_rc = self.db.create_resource_class(pecan_rc)
        #get a pecan flavor to add:
        pecan_flavor = utils.get_test_flavor(name='bar', value='333')
        db_flavor = self.db.create_resource_class_flavor(db_rc.id,
                                                         pecan_flavor)
        #make test assertions
        self.__check_flavor_capacities([db_flavor], ['bar'], ['333'])
        #cleanup
        self.db.delete_resource_class(db_rc.id)

    def test_it_can_update_a_resource_class_flavor(self):
        #create a resource class
        pecan_rc = utils.get_test_resource_class()
        #give it a couple flavors and create it
        pecan_rc.flavors = [utils.get_test_flavor(name='xyz', value='123'),
                            utils.get_test_flavor(name='abc', value='456')]
        db_rc = self.db.create_resource_class(pecan_rc)
        # we cannot rely on the order of the db_rc.flavors items
        if db_rc.flavors[0].name == 'xyz':
            xyz_flavor = db_rc.flavors[0]
        else:
            xyz_flavor = db_rc.flavors[1]
        #now update one of the flavors:
        updated_flav = self.db.update_resource_class_flavor(
            db_rc.id,
            xyz_flavor.id,
            utils.get_test_flavor(name='xyz', value='999'))
        #retrieve updated rc and assert:
        updated_rc = self.db.get_resource_class(db_rc.id)
        self.__check_flavor_capacities(updated_rc.flavors,
                                       ['xyz', 'abc'],
                                       ['999', '456'])
        #cleanup
        self.db.delete_resource_class(db_rc.id)

    def test_it_can_retrieve_all_flavors_for_resource_class(self):
        #create a resource class
        pecan_rc = utils.get_test_resource_class()
        #give it a couple flavors and create it
        pecan_rc.flavors = [utils.get_test_flavor(name='xyz', value='123'),
                            utils.get_test_flavor(name='abc', value='456')]
        db_rc = self.db.create_resource_class(pecan_rc)
        #retrieve the flavors:
        flavs = self.db.get_flavors(db_rc.id)
        self.__check_flavor_capacities(flavs, ['xyz', 'abc'], ['123', '456'])
        #cleanup
        self.db.delete_resource_class(db_rc.id)

    def test_it_can_retrieve_a_single_flavor(self):
        #create a resource class
        pecan_rc = utils.get_test_resource_class()
        #give it a couple flavors and create it
        pecan_rc.flavors = [utils.get_test_flavor(name='xyz', value='123'),
                            utils.get_test_flavor(name='abc', value='456')]
        db_rc = self.db.create_resource_class(pecan_rc)
        # we cannot rely on the order of the db_rc.flavors items
        if db_rc.flavors[0].name == 'abc':
            abc_flavor = db_rc.flavors[0]
        else:
            abc_flavor = db_rc.flavors[1]
        #retrieve a specific flavor
        flav = self.db.get_flavor(abc_flavor.id)
        self.__check_flavor_capacities([flav], ['abc'], ['456'])
        #cleanup
        self.db.delete_resource_class(db_rc.id)

    def test_it_explodes_if_get_non_existant_flavor(self):
        self.assertRaises(exception.FlavorNotFound,
                          self.db.get_flavor,
                          'fake_id')

    def __check_flavor_capacities(self, flavors, names, values):
        for flav in flavors:
            self.assertTrue(flav.name in names)
            for capacity in flav.capacities:
                self.assertTrue(capacity.value in values)
Example #5
0
class TestRacks(api.FunctionalTest):

    test_rack = None
    db = dbapi.get_backend()

    def valid_rack_json(self, rack_json, test_rack=None):
        rack = None

        if test_rack is None:
            rack = self.test_rack
        else:
            rack = test_rack

        self.assertEqual(rack_json['id'], rack.id)
        self.assertEqual(rack_json['name'], rack.name)
        self.assertEqual(rack_json['slots'], rack.slots)
        self.assertEqual(rack_json['subnet'], rack.subnet)
        self.assertTrue(rack_json['nodes'])
        self.assertEqual(rack_json['nodes'][0]['id'],
                         str(rack.nodes[0].id))
        self.assertTrue(rack_json['capacities'])
        self.assertEqual(rack_json['capacities'][0]['name'],
                         rack.capacities[0].name)
        self.assertEqual(rack_json['capacities'][0]['value'],
                         rack.capacities[0].value)
        self.assertTrue(rack_json['links'])
        self.assertEqual(rack_json['links'][0]['rel'], 'self')
        self.assertEqual(rack_json['links'][0]['href'],
                         'http://localhost/v1/racks/' + str(rack.id))

    def setUp(self):
        """Create 'test_rack'."""

        super(TestRacks, self).setUp()
        self.test_resource_class = None
        self.test_rack = self.db.create_rack(
            Rack(name='test-rack',
                 slots=1,
                 subnet='10.0.0.0/24',
                 location='nevada',
                 chassis=Chassis(id='123'),
                 capacities=[Capacity(name='cpu', value='10',
                                      unit='count')],
                 nodes=[Node(id='1')]
                 ))
        # FIXME: For some reason the 'self.test_rack' does not
        #        lazy-load the 'nodes' and other attrs when
        #        having more than 1 test method...
        #
        self.test_rack = self.db.get_rack(self.test_rack.id)

    def tearDown(self):
        self.db.delete_rack(self.test_rack.id)
        if self.test_resource_class:
            self.db.delete_resource_class(self.test_resource_class.id)
        super(TestRacks, self).tearDown()

    def setup_resource_class(self):
        if not self.test_resource_class:
            self.test_resource_class = self.db.create_resource_class(
                ResourceClass(
                    name='test resource class',
                    service_type='compute',
                ))

    def test_it_returns_single_rack(self):
        response = self.get_json('/racks/' + str(self.test_rack.id),
                                 expect_errors=True)

        self.assertEqual(response.status_int, 200)
        self.assertEqual(response.content_type, "application/json")
        self.valid_rack_json(response.json)

    def test_it_returns_rack_list(self):
        response = self.get_json('/racks', expect_errors=True)
        self.assertEqual(response.status_int, 200)
        self.assertEqual(response.content_type, "application/json")

        # The 'test_rack' is present in the racks listing:
        rack_json = filter(lambda r: r['id'] == self.test_rack.id,
                           response.json)
        self.assertEqual(len(rack_json), 1)

        # And the Rack serialization is correct
        self.valid_rack_json(rack_json[0])

    def test_it_updates_rack(self):
        json = {
            'name': 'blabla',
        }
        response = self.put_json('/racks/' + str(self.test_rack.id),
                                 params=json, status=200)
        self.assertEqual(response.content_type, "application/json")
        self.assertEqual(response.json['name'], json['name'])
        updated_rack = self.db.get_rack(self.test_rack.id)
        self.assertEqual(updated_rack.name, json['name'])

    def test_it_allow_to_update_rack_state(self):
        json = {
            'state': 'active',
        }
        response = self.put_json('/racks/' + str(self.test_rack.id),
                                 params=json, status=200)
        self.assertEqual(response.content_type, "application/json")
        self.assertEqual(response.json['state'], json['state'])
        updated_rack = self.db.get_rack(self.test_rack.id)
        self.assertEqual(updated_rack.state, json['state'])

    def test_it_not_allow_to_update_rack_state_with_unknown_state(self):
        json = {
            'state': 'trololo',
        }
        response = self.put_json('/racks/' + str(self.test_rack.id),
                                 params=json, status=200)
        self.assertEqual(response.content_type, "application/json")
        self.assertNotEqual(response.json['state'], json['state'])
        updated_rack = self.db.get_rack(self.test_rack.id)
        self.assertNotEqual(updated_rack.state, json['state'])

    def test_it_creates_and_deletes_new_rack(self):
        json = {
            'name': 'test-rack-create',
            'subnet': '127.0.0./24',
            'slots': '10',
            'location': 'texas',
            'capacities': [
                {'name': 'memory', 'value': '1024', 'unit': 'MB'}
            ],
            'nodes': [
                {'id': '1234567'},
                {'id': '7891011'}
            ]
        }
        response = self.post_json('/racks', params=json, status=201)
        self.assertEqual(response.content_type, "application/json")

        self.assertTrue(response.json['id'])
        self.assertEqual(response.json['name'], json['name'])

        self.assertEqual(response.json['state'], 'unprovisioned')

        self.assertEqual(str(response.json['slots']), json['slots'])
        self.assertEqual(str(response.json['location']), json['location'])
        self.assertEqual(response.json['subnet'], json['subnet'])
        self.assertEqual(len(response.json['nodes']), 2)
        print dict(response.json['capacities'][0])
        self.assertEqual(str(response.json['capacities'][0]['unit']), 'MB')

        # Make sure we delete the Rack we just created
        self.db.delete_rack(response.json['id'])

    def test_it_returns_404_when_getting_unknown_rack(self):
        response = self.get_json('/racks/unknown',
                                 expect_errors=True,
                                 headers={"Accept": "application/json"}
                                 )

        self.assertEqual(response.status_int, 404)

    # FIXME(mfojtik): This test will fail because of Pecan bug, see:
    # https://github.com/tuskar/tuskar/issues/18
    #
    def test_it_returns_404_when_deleting_unknown_rack(self):
        response = self.delete_json('/racks/unknown',
                                    expect_errors=True,
                                    headers={"Accept": "application/json"}
                                    )

        self.assertEqual(response.status_int, 404)

    # this is test for https://github.com/tuskar/tuskar/issues/39
    def test_it_updates_resource_class_id_when_already_present(self):
        # create needed resource_class
        self.setup_resource_class()

        # update precreated rack with resource_class_id for test
        rack_update_json = {
            'resource_class': {
                'id': self.test_resource_class.id
            }
        }
        first_update_response = self.put_json(
            '/racks/' + str(self.test_rack.id),
            rack_update_json)
        self.assertEqual(first_update_response.status_int, 200)
        self.assertEqual(first_update_response.json['resource_class']['id'],
                         rack_update_json['resource_class']['id'])

        # repeat update of rack - simulates updating resource_class_id when
        # already present
        second_update_response = self.put_json(
            '/racks/' + str(self.test_rack.id),
            rack_update_json)
        self.assertEqual(second_update_response.status_int, 200)
        self.assertEqual(second_update_response.json['resource_class']['id'],
                         rack_update_json['resource_class']['id'])
Example #6
0
class TestResourceClasses(api.FunctionalTest):

    db = dbapi.get_backend()

    def setUp(self):
        super(TestResourceClasses, self).setUp()
        self.rc = self.db.create_resource_class(v1.ResourceClass(
            name='test resource class',
            service_type='compute',
        ))
        self.racks = []

    def tearDown(self):
        self.db.delete_resource_class(self.rc.id)
        self.teardown_racks()
        super(TestResourceClasses, self).tearDown()

    def setup_racks(self):
        for rack_num in range(1, 4):
            self.racks.append(self.db.create_rack(v1.Rack(
                name='rack no. {0}'.format(rack_num),
                subnet='192.168.1.{0}/24'.format(rack_num))
            ))

    def teardown_racks(self):
        for rack in self.racks:
            self.db.delete_rack(rack.id)

    @staticmethod
    def sorted_ids(resources):
        if resources and hasattr(resources[0], 'id'):
            sorted([r.id for r in resources])
        else:
            sorted([r['id'] for r in resources])

    def assert_racks_present(self, sent_json, response):
        self.assertEqual(self.sorted_ids(sent_json['racks']),
                         self.sorted_ids(response.json['racks']))
        updated_rc = self.db.get_resource_class(self.rc.id)
        self.assertEqual(self.sorted_ids(sent_json['racks']),
                         self.sorted_ids(updated_rc.racks))

    def test_update_name_only(self):
        json = {'name': 'updated name'}
        response = self.put_json('/resource_classes/' + str(self.rc.id),
                                 params=json, status=200)
        self.assertEqual(response.content_type, 'application/json')
        self.assertEqual(response.json['name'], json['name'])
        updated_rc = self.db.get_resource_class(self.rc.id)
        self.assertEqual(updated_rc.name, json['name'])

    def test_update_racks(self):
        self.setup_racks()

        # Assign racks for the first time
        json = {'racks': [{'id': self.racks[0].id},
                          {'id': self.racks[1].id}]}
        response = self.put_json('/resource_classes/' + str(self.rc.id),
                                 params=json, status=200)
        self.assert_racks_present(json, response)

        # Re-assign racks: remove one, keep one, add one new
        json = {'racks': [{'id': self.racks[1].id},
                          {'id': self.racks[2].id}]}
        response = self.put_json('/resource_classes/' + str(self.rc.id),
                                 params=json, status=200)
        self.assert_racks_present(json, response)
class TestDbResourceClasses(db_base.DbTestCase):
    db = dbapi.get_backend()

    def setup(self):
        super(TestDbResourceClasses, self).setUp()

    def tearDown(self):
        super(TestDbResourceClasses, self).tearDown()

    def test_it_can_create_and_delete_a_plain_resource_class(self):
        #get a pecan resource_class:
        pecan_rc = utils.get_test_resource_class(
            name='test_plain_resource_class', service_type='compute')
        #create it in db:
        db_rc = self.db.create_resource_class(pecan_rc)
        self.__check_resource_class(db_rc, 'test_plain_resource_class',
                                    'compute')
        #delete it:
        self.db.delete_resource_class(db_rc.id)

    def test_it_can_create_and_delete_resource_class_with_flavors(self):
        #get a pecan resource_class:
        pecan_rc = utils.get_test_resource_class(
            name='test_plain_resource_class', service_type='compute')
        #give it some flavors:
        pecan_rc.flavors = [
            utils.get_test_flavor(name='xyz', value='123'),
            utils.get_test_flavor(name='abc', value='456')
        ]
        #create it in db:
        db_rc = self.db.create_resource_class(pecan_rc)
        self.__check_resource_class(db_rc,
                                    'test_plain_resource_class',
                                    'compute',
                                    flavor_names=['xyz', 'abc'],
                                    flavor_values=['123', '456'])
        #delete it:
        self.db.delete_resource_class(db_rc.id)

    def test_it_can_create_and_delete_resource_class_with_racks(self):
        #get a pecan resource_class:
        pecan_rc = utils.get_test_resource_class(
            name='resource_class_with_racks', service_type='compute')
        #first create racks in database (ids 1 and 2):
        db_rack1 = self.db.create_rack(utils.get_test_rack(name='rack1'))
        db_rack2 = self.db.create_rack(utils.get_test_rack(name='rack2'))
        #add racks to resource class:
        pecan_rc.racks = [
            utils.get_test_resource_class_rack(id=db_rack1.id),
            utils.get_test_resource_class_rack(id=db_rack2.id)
        ]
        #create rc with racks in db:
        db_rc = self.db.create_resource_class(pecan_rc)
        #check it:
        self.__check_resource_class(db_rc,
                                    'resource_class_with_racks',
                                    'compute',
                                    rack_ids=[db_rack1.id, db_rack2.id])
        #delete:
        self.db.delete_resource_class(db_rc.id)
        self.db.delete_rack(db_rack1.id)
        self.db.delete_rack(db_rack2.id)

    def test_it_can_retrieve_all_resource_classes(self):
        created_db_rc_ids = []
        #create a four resource classes
        for i in range(1, 5):
            pecan_rc = utils.get_test_resource_class(name=('rc_' + str(i)),
                                                     service_type='foo')
            db_rc = self.db.create_resource_class(pecan_rc)
            created_db_rc_ids.append(db_rc.id)
        #retrieve the resource classes:
        resource_classes = self.db.get_resource_classes(None)
        self.assertTrue(len(resource_classes) == 4)
        #cleanup
        for rc_id in created_db_rc_ids:
            self.db.delete_resource_class(rc_id)

    def test_it_can_retrieve_single_resource_class(self):
        #get a pecan resource_class:
        pecan_rc = utils.get_test_resource_class(name='retrieve_rc_test',
                                                 service_type='compute')
        #create it:
        created_rc = self.db.create_resource_class(pecan_rc)
        #retrieve and check:
        db_rc = self.db.get_resource_class(created_rc.id)
        self.__check_resource_class(db_rc, 'retrieve_rc_test', 'compute')
        #cleanup
        self.db.delete_resource_class(db_rc.id)

    def test_it_explodes_when_retrieve_non_existant_resource_class(self):
        self.assertRaises(exception.ResourceClassNotFound,
                          self.db.get_resource_class, 'fake_id')

    def test_it_can_update_resource_class_name_and_type(self):
        #get a pecan resource_class:
        pecan_rc = utils.get_test_resource_class(name='a_plain_resource_class',
                                                 service_type='compute')
        #create it:
        db_rc = self.db.create_resource_class(pecan_rc)
        #update:
        pecan_rc.name = 'updated_plain_resource_class'
        pecan_rc.service_type = 'storage'
        updated_db_rc = self.db.update_resource_class(db_rc.id, pecan_rc)
        #check
        self.__check_resource_class(updated_db_rc,
                                    'updated_plain_resource_class', 'storage')
        self.db.delete_resource_class(updated_db_rc.id)

    def test_it_can_update_resource_class_racks_and_flavors(self):
        #get a pecan resource_class:
        pecan_rc = utils.get_test_resource_class(
            name='resource_class_update_racks_flavs', service_type='compute')
        #create racks in database:
        db_rack1 = self.db.create_rack(utils.get_test_rack(name='rack1'))
        db_rack2 = self.db.create_rack(utils.get_test_rack(name='rack2'))
        #add racks to resource class:
        pecan_rc.racks = [
            utils.get_test_resource_class_rack(id=db_rack1.id),
            utils.get_test_resource_class_rack(id=db_rack2.id)
        ]
        #give it a couple of flavors too:
        pecan_rc.flavors = [
            utils.get_test_flavor(name='flav1', value='1'),
            utils.get_test_flavor(name='flav2', value='2')
        ]
        #create rc in db:
        db_rc = self.db.create_resource_class(pecan_rc)
        #update racks and flavors:
        pecan_rc.flavors = [
            utils.get_test_flavor(name='flav3', value='3'),
            utils.get_test_flavor(name='flav4', value='4')
        ]
        db_rack3 = self.db.create_rack(utils.get_test_rack(name='rack3'))
        db_rack4 = self.db.create_rack(utils.get_test_rack(name='rack4'))
        pecan_rc.racks = [
            utils.get_test_resource_class_rack(id=db_rack3.id),
            utils.get_test_resource_class_rack(id=db_rack4.id)
        ]
        #update the resource class:
        updated_db_rc = self.db.update_resource_class(db_rc.id, pecan_rc)
        #check:
        #FIXME: THERE IS A BUG IN UPDATE RESOURCECLASS - it doesn't remove
        #the old racks in update operation - adding all ids here so test passes
        self.__check_resource_class(
            updated_db_rc,
            'resource_class_update_racks_flavs',
            'compute',
            flavor_names=['flav3', 'flav4'],
            flavor_values=['3', '4'],
            rack_ids=[db_rack1.id, db_rack2.id, db_rack3.id, db_rack4.id])
        #FIXME: i.e. remove db_rack1.id and db_rack2.id above
        #as they shouldn't be there
        #delete:
        self.db.delete_resource_class(updated_db_rc.id)
        for rack in [db_rack1, db_rack2, db_rack3, db_rack4]:
            self.db.delete_rack(rack.id)

    def __check_resource_class(self, rc, name, service_type, **kwargs):
        self.assertTrue(rc.name == name)
        self.assertTrue(rc.service_type == service_type)
        #flavors
        if rc.flavors != []:
            names = kwargs.get('flavor_names')
            values = kwargs.get('flavor_values')
            for flav in rc.flavors:
                self.assertTrue(flav.name in names)
                for capacity in flav.capacities:
                    self.assertTrue(capacity.value in values)
        #racks
        if rc.racks != []:
            ids = kwargs.get('rack_ids')
            for rack in rc.racks:
                self.assertTrue(rack.id in ids)
Example #8
0
class TestResourceClasses(api.FunctionalTest):

    db = dbapi.get_backend()

    def setUp(self):
        super(TestResourceClasses, self).setUp()
        self.rc = self.db.create_resource_class(
            ResourceClass(
                name='test resource class',
                service_type='compute',
            ))
        self.racks = []

    def tearDown(self):
        self.db.delete_resource_class(self.rc.id)
        self.teardown_racks()
        super(TestResourceClasses, self).tearDown()

    def setup_racks(self):
        for rack_num in range(1, 4):
            self.racks.append(
                self.db.create_rack(
                    Rack(name='rack no. {0}'.format(rack_num),
                         subnet='192.168.1.{0}/24'.format(rack_num))))

    def teardown_racks(self):
        for rack in self.racks:
            self.db.delete_rack(rack.id)

    @staticmethod
    def sorted_ids(resources):
        if resources and hasattr(resources[0], 'id'):
            return sorted([r.id for r in resources])
        else:
            return sorted([r['id'] for r in resources])

    def assert_racks_present(self, sent_json, response):
        self.assertEqual(self.sorted_ids(sent_json['racks']),
                         self.sorted_ids(response.json['racks']))
        updated_rc = self.db.get_resource_class(self.rc.id)
        self.assertEqual(self.sorted_ids(sent_json['racks']),
                         self.sorted_ids(updated_rc.racks))

    def test_list_resource_classes(self):
        response = self.get_json('/resource_classes/', expect_errors=True)
        self.assertEqual(response.content_type, 'application/json')
        self.assertEqual(len(response.json), 1)
        row = response.json[0]
        self.assertEqual(row['name'], 'test resource class')

    def test_get_resource_class(self):
        rc_id = '1'
        # without expect_errors, the response type is a list
        response = self.get_json('/resource_classes/' + rc_id,
                                 expect_errors=True)
        self.assertEqual(response.content_type, 'application/json')
        self.assertEqual(response.json['name'], 'test resource class')

    def test_create_resource_class(self):
        json = {'name': 'new', 'service_type': 'compute'}
        response = self.post_json('/resource_classes/', params=json)
        self.assertEqual(response.content_type, 'application/json')
        self.assertEqual(response.json['name'], json['name'])
        row = self.db.get_resource_class(response.json['id'])
        self.assertEqual(row.name, json['name'])

    def test_update_name_only(self):
        json = {'name': 'updated name'}
        response = self.put_json('/resource_classes/' + str(self.rc.id),
                                 params=json,
                                 status=200)
        self.assertEqual(response.content_type, 'application/json')
        self.assertEqual(response.json['name'], json['name'])
        updated_rc = self.db.get_resource_class(self.rc.id)
        self.assertEqual(updated_rc.name, json['name'])

    def test_update_racks(self):
        self.setup_racks()
        # Assign racks for the first time
        json = {'racks': [{'id': self.racks[0].id}, {'id': self.racks[1].id}]}
        response = self.put_json('/resource_classes/' + str(self.rc.id),
                                 params=json,
                                 status=200)
        self.assert_racks_present(json, response)

        # Re-assign racks: remove one, keep one, add one new
        json = {'racks': [{'id': self.racks[1].id}, {'id': self.racks[2].id}]}
        response = self.put_json('/resource_classes/' + str(self.rc.id),
                                 params=json,
                                 status=200)
        self.assert_racks_present(json, response)

    def test_delete_resource_class(self):
        rc_id = '1'
        response = self.delete_json('/resource_classes/' + rc_id)
        self.assertRaises(exception.ResourceClassNotFound,
                          self.db.get_resource_class, rc_id)
Example #9
0
class TestFlavors(api.FunctionalTest):

    db = dbapi.get_backend()

    # create a test resource class
    def setUp(self):
        super(TestFlavors, self).setUp()
        self.rc = self.db.create_resource_class(
            ResourceClass(
                name='flavor_test_resource_class',
                service_type='compute',
            ))

    def tearDown(self):
        self.db.delete_resource_class(self.rc.id)
        super(TestFlavors, self).tearDown()

    def test_it_can_create_and_delete_a_flavor(self):
        # create a flavor and inspect response
        request_json = {
            'name':
            'test_flavor',
            'max_vms':
            '10',
            'capacities': [
                {
                    'name': 'memory',
                    'value': '1024',
                    'unit': 'MB'
                },
                {
                    'name': 'cpu',
                    'value': '2',
                    'unit': 'count'
                },
                {
                    'name': 'storage',
                    'value': '1024',
                    'unit': 'GB'
                },
            ]
        }
        response = self.post_json('/resource_classes/' + str(self.rc.id) +
                                  '/flavors',
                                  params=request_json,
                                  status=201)
        self.assertEqual(response.content_type, "application/json")
        self.assertTrue(response.json['id'])
        self.assert_equality(request_json, response.json, ['name', 'max_vms'])
        flav_id = response.json['id']
        # delete the flavor
        response = self.delete_json('/resource_classes/' + str(self.rc.id) +
                                    '/flavors/' + str(flav_id),
                                    status=200)

    def test_it_can_update_a_flavor(self):
        # first create the flavor
        request_json = {
            'name':
            'test_flavor',
            'max_vms':
            '10',
            'capacities': [
                {
                    'name': 'memory',
                    'value': '1024',
                    'unit': 'MB'
                },
                {
                    'name': 'cpu',
                    'value': '2',
                    'unit': 'count'
                },
                {
                    'name': 'storage',
                    'value': '1024',
                    'unit': 'GB'
                },
            ]
        }
        response = self.post_json('/resource_classes/' + str(self.rc.id) +
                                  '/flavors',
                                  params=request_json,
                                  status=201)
        self.assert_equality(request_json, response.json, ['name', 'max_vms'])
        flav_id = response.json['id']
        # now update it:
        update_json = {
            'name':
            'update_test_flavor',
            'max_vms':
            '11',
            'capacities': [
                {
                    'name': 'memory',
                    'value': '1111',
                    'unit': 'MB'
                },
                {
                    'name': 'cpu',
                    'value': '44',
                    'unit': 'count'
                },
                {
                    'name': 'storage',
                    'value': '2222',
                    'unit': 'GB'
                },
            ]
        }
        update_response = self.put_json('/resource_classes/' +
                                        str(self.rc.id) + '/flavors/' +
                                        str(flav_id),
                                        params=update_json,
                                        status=200)
        self.assert_equality(update_json, update_response.json,
                             ['name', 'max_vms'])
        self.assertEqual(update_response.json['id'], flav_id)
        for c in update_response.json['capacities']:
            if c['name'] == 'memory':
                self.assertEqual(c['value'], '1111')
            elif c['name'] == 'cpu':
                self.assertEqual(c['value'], '44')
            elif c['name'] == 'storage':
                self.assertEqual(c['value'], '2222')
        # delete
        response = self.delete_json('/resource_classes/' + str(self.rc.id) +
                                    '/flavors/' + str(flav_id),
                                    status=200)

    def test_it_can_replace_resource_class_flavors(self):
        # first create flavor:
        request_json = {
            'name':
            'test_flavor',
            'max_vms':
            '10',
            'capacities': [
                {
                    'name': 'memory',
                    'value': '1024',
                    'unit': 'MB'
                },
                {
                    'name': 'cpu',
                    'value': '2',
                    'unit': 'count'
                },
                {
                    'name': 'storage',
                    'value': '1024',
                    'unit': 'GB'
                },
            ]
        }
        response = self.post_json('/resource_classes/' + str(self.rc.id) +
                                  '/flavors',
                                  params=request_json,
                                  status=201)
        self.assert_equality(request_json, response.json, ['name', 'max_vms'])
        flav_id = response.json['id']
        # now replace flavors with new ones:
        replace_json = {
            "flavors": [{
                'name':
                'flavor1',
                'max_vms':
                '1',
                'capacities': [{
                    'name': 'memory',
                    'value': '1',
                    'unit': 'MB'
                }, {
                    'name': 'cpu',
                    'value': '1',
                    'unit': 'count'
                }, {
                    'name': 'storage',
                    'value': '1',
                    'unit': 'GB'
                }]
            }, {
                'name':
                'flavor2',
                'max_vms':
                '2',
                'capacities': [{
                    'name': 'memory',
                    'value': '2',
                    'unit': 'MB'
                }, {
                    'name': 'cpu',
                    'value': '2',
                    'unit': 'count'
                }, {
                    'name': 'storage',
                    'value': '2',
                    'unit': 'GB'
                }]
            }]
        }
        update_response = self.put_json('/resource_classes/' + str(self.rc.id),
                                        params=replace_json,
                                        status=200)
        self.assertEqual(response.content_type, "application/json")
        for flav in update_response.json['flavors']:
            self.assertTrue(flav['name'] in ['flavor1', 'flavor2'])
            self.assertTrue(str(flav['max_vms']) in ['1', '2'])
            for c in flav['capacities']:
                self.assertTrue(c['value'] in ['1', '2'])

    def assert_equality(self, req_json, res_json, values):
        for val in values:
            # if type(req_json[val]) == 'str':
            self.assertEqual(str(req_json[val]), str(res_json[val]))
Example #10
0
class TestDbRacks(db_base.DbTestCase):
    db = dbapi.get_backend()

    def setUp(self):
        super(TestDbRacks, self).setUp()
        #need two resource classes - one for each rack:
        pecan_rc1 = utils.get_test_resource_class(name='rc1', type='compute')
        pecan_rc2 = utils.get_test_resource_class(name='rc2', type='control')
        #create the rc in the db
        self.db_rc1 = self.db.create_resource_class(pecan_rc1)
        self.db_rc2 = self.db.create_resource_class(pecan_rc2)
        #define 2 pecan racks, one without nodes:
        pecan_rack1 = utils.get_test_rack(name='rack_no_nodes',
                                          resource_class=True,
                                          rc_id=self.db_rc1.id)
        pecan_rack2 = utils.get_test_rack(name='rack_has_nodes',
                                          nodes=True,
                                          resource_class=True,
                                          rc_id=self.db_rc2.id)
        #create them in db
        self.rack1 = self.db.create_rack(pecan_rack1)
        self.rack2 = self.db.create_rack(pecan_rack2)

    def tearDown(self):
        super(TestDbRacks, self).tearDown()
        #cleanup
        self.db.delete_resource_class(self.db_rc1.id)
        self.db.delete_resource_class(self.db_rc2.id)
        self.db.delete_rack(self.rack1.id)
        self.db.delete_rack(self.rack2.id)

    def test_it_can_get_all_racks(self):
        db_racks = self.db.get_racks(None)
        self.__check_racks(db_racks, ['rack_no_nodes', 'rack_has_nodes'])
        self.assertTrue(len(db_racks) == 2)

    def test_it_can_get_specific_rack(self):
        rack = self.db.get_rack(self.rack1.id)
        self.__check_racks([rack], ['rack_no_nodes'])

    def test_it_explodes_when_get_non_existant_rack(self):
        self.assertRaises(exception.RackNotFound, self.db.get_rack, 'fack_id')

    def test_it_can_create_a_rack_without_nodes(self):
        #get rack without nodes:
        pecan_rack = utils.get_test_rack(name='rack_without_nodes')
        #create it:
        db_rack = self.db.create_rack(pecan_rack)
        self.__check_racks([db_rack], ['rack_without_nodes'])
        #cleanup
        self.db.delete_rack(db_rack.id)

    def test_it_can_create_a_rack_with_nodes(self):
        #define pecan rack with nodes
        pecan_rack = utils.get_test_rack(name='rack_with_nodes', nodes=True)
        #create:
        db_rack = self.db.create_rack(pecan_rack)
        self.__check_racks([db_rack], ['rack_with_nodes'])
        #cleanup
        self.db.delete_rack(db_rack.id)

    def test_it_can_update_rack_basic_attributes(self):
        #define a pecan rack:
        pecan_rack = utils.get_test_rack(name='a_rack',
                                         slots=1,
                                         subnet='192.168.0.0/16')
        #create in db:
        db_rack = self.db.create_rack(pecan_rack)
        #now update it
        pecan_rack.name = 'b_rack'
        pecan_rack.slots = 2
        pecan_rack.subnet = '10.0.0.0/24'
        db_rack = self.db.update_rack(db_rack.id, pecan_rack)
        self.__check_racks([db_rack], ['b_rack'])
        self.assertTrue(db_rack.slots == 2)
        self.assertTrue(db_rack.subnet == '10.0.0.0/24')
        #cleanup
        self.db.delete_rack(db_rack.id)

    def test_it_can_update_rack_nodes(self):
        #define a pecan rack with nodes:
        pecan_rack = utils.get_test_rack(name='rack_1', nodes=True)
        #create in db
        db_rack = self.db.create_rack(pecan_rack)
        #update nodes:
        pecan_rack.nodes = []
        for i in range(1, 11):
            pecan_rack.nodes.append(utils.get_test_rack_node(id=str(i)))
        db_rack = self.db.update_rack(db_rack.id, pecan_rack)
        self.__check_racks([db_rack], ['rack_1'])
        self.assertTrue(len(db_rack.nodes) == 10)
        #cleanup
        self.db.delete_rack(db_rack.id)

    def __check_racks(self, racks, names):
        for rack in racks:
            self.assertTrue(rack.name in names)
            self.assertTrue(rack.id != None)
            self.assertTrue(rack.slots != None)
            self.assertTrue(len(rack.capacities) > 0)
            self.assertTrue(rack.subnet != None)
            for capacity in rack.capacities:
                self.assertTrue(capacity.name in ['total_cpu', 'total_memory'])