#!/usr/bin/env python # Update the base image that is used for devstack VMs. # Copyright (C) 2012 OpenStack LLC. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or # implied. # # See the License for the specific language governing permissions and # limitations under the License. import unittest import vmdatabase import time class testVMDatabase(unittest.TestCase): def setUp(self): self.db = vmdatabase.VMDatabase(':memory:') def test_add_provider(self): provider = vmdatabase.Provider(name='rackspace', driver='rackspace', username='testuser', api_key='testapikey', giftable=False) self.db.session.add(provider) self.db.commit() provider = vmdatabase.Provider(name='hpcloud', driver='openstack', username='testuser', api_key='testapikey', giftable=True) self.db.session.add(provider) self.db.commit() def test_add_base_image(self): self.test_add_provider() provider = self.db.getProvider('rackspace') base_image1 = provider.newBaseImage('oneiric', 1) base_image2 = provider.newBaseImage('precise', 2) provider = self.db.getProvider('hpcloud') base_image1 = provider.newBaseImage('oneiric', 1) base_image2 = provider.newBaseImage('precise', 2) def test_add_snap_image(self): self.test_add_base_image() provider = self.db.getProvider('rackspace') base_image1 = provider.getBaseImage('oneiric') base_image2 = provider.getBaseImage('precise') snapshot_image1 = base_image1.newSnapshotImage('oneiric-1331683549', 1331683549, 201, 301) snapshot_image2 = base_image2.newSnapshotImage('precise-1331683549', 1331683549, 202, 301) hp_provider = self.db.getProvider('hpcloud') hp_base_image1 = hp_provider.getBaseImage('oneiric') hp_base_image2 = hp_provider.getBaseImage('precise') hp_snapshot_image1 = hp_base_image1.newSnapshotImage('oneiric-1331683549', 1331929410, 211, 311) hp_snapshot_image2 = hp_base_image2.newSnapshotImage('precise-1331683549', 1331929410, 212, 311) self.db.print_state() assert(not base_image1.current_snapshot) assert(not base_image2.current_snapshot) snapshot_image1.state=vmdatabase.READY assert(base_image1.current_snapshot) assert(not base_image2.current_snapshot) assert(snapshot_image1 == base_image1.current_snapshot) snapshot_image2.state=vmdatabase.READY assert(base_image1.current_snapshot) assert(base_image2.current_snapshot) assert(snapshot_image1 == base_image1.current_snapshot) assert(snapshot_image2 == base_image2.current_snapshot) snapshot_image2_latest = base_image2.newSnapshotImage('precise-1331683550', 1331683550, 203, 303) assert(base_image1.current_snapshot) assert(base_image2.current_snapshot) assert(snapshot_image1 == base_image1.current_snapshot) assert(snapshot_image2 == base_image2.current_snapshot) snapshot_image2_latest.state=vmdatabase.READY assert(base_image1.current_snapshot) assert(base_image2.current_snapshot) assert(snapshot_image1 == base_image1.current_snapshot) assert(snapshot_image2_latest == base_image2.current_snapshot) def test_add_machine(self): self.test_add_snap_image() provider = self.db.getProvider('rackspace') base_image1 = provider.getBaseImage('oneiric') base_image2 = provider.getBaseImage('precise') snapshot_image1 = base_image1.current_snapshot snapshot_image2 = base_image2.current_snapshot assert(len(provider.machines) == 0) assert(len(provider.ready_machines) == 0) assert(len(provider.building_machines) == 0) assert(len(base_image1.machines) == 0) assert(len(base_image1.ready_machines) == 0) assert(len(base_image1.building_machines) == 0) assert(len(base_image2.machines) == 0) assert(len(base_image2.ready_machines) == 0) assert(len(base_image2.building_machines) == 0) machine1 = base_image1.newMachine('%s-1331683760'%base_image1.name, '20000021', '1.2.3.4', 'uuid1') assert(len(provider.machines) == 1) assert(len(provider.ready_machines) == 0) assert(len(provider.building_machines) == 1) assert(len(base_image1.machines) == 1) assert(len(base_image1.ready_machines) == 0) assert(len(base_image1.building_machines) == 1) assert(len(base_image2.machines) == 0) assert(len(base_image2.ready_machines) == 0) assert(len(base_image2.building_machines) == 0) machine2 = base_image2.newMachine('%s-1331683761'%base_image1.name, '20000022', '1.2.3.5', 'uuid2') assert(len(provider.machines) == 2) assert(len(provider.ready_machines) == 0) assert(len(provider.building_machines) == 2) assert(len(base_image1.machines) == 1) assert(len(base_image1.ready_machines) == 0) assert(len(base_image1.building_machines) == 1) assert(len(base_image2.machines) == 1) assert(len(base_image2.ready_machines) == 0) assert(len(base_image2.building_machines) == 1) machine1.state = vmdatabase.READY assert(len(provider.machines) == 2) assert(len(provider.ready_machines) == 1) assert(len(provider.building_machines) == 1) assert(len(base_image1.machines) == 1) assert(len(base_image1.ready_machines) == 1) assert(len(base_image1.building_machines) == 0) assert(len(base_image2.machines) == 1) assert(len(base_image2.ready_machines) == 0) assert(len(base_image2.building_machines) == 1) machine2.state = vmdatabase.ERROR assert(len(provider.machines) == 2) assert(len(provider.ready_machines) == 1) assert(len(provider.building_machines) == 0) assert(len(base_image1.machines) == 1) assert(len(base_image1.ready_machines) == 1) assert(len(base_image1.building_machines) == 0) assert(len(base_image2.machines) == 1) assert(len(base_image2.ready_machines) == 0) assert(len(base_image2.building_machines) == 0) machine2.state = vmdatabase.READY assert(len(provider.machines) == 2) assert(len(provider.ready_machines) == 2) assert(len(provider.building_machines) == 0) assert(len(base_image1.machines) == 1) assert(len(base_image1.ready_machines) == 1) assert(len(base_image1.building_machines) == 0) assert(len(base_image2.machines) == 1) assert(len(base_image2.ready_machines) == 1) assert(len(base_image2.building_machines) == 0) hp_provider = self.db.getProvider('hpcloud') hp_base_image1 = hp_provider.getBaseImage('oneiric') hp_base_image2 = hp_provider.getBaseImage('precise') hp_snapshot_image1 = hp_base_image1.current_snapshot hp_snapshot_image2 = hp_base_image2.current_snapshot hp_machine1 = hp_base_image1.newMachine('%s-1331683551'%hp_base_image1.name, '21000021', '2.2.3.4', 'hpuuid1') hp_machine2 = hp_base_image2.newMachine('%s-1331683552'%hp_base_image2.name, '21000022', '2.2.3.5', 'hpuuid2') hp_machine1.state = vmdatabase.READY hp_machine2.state = vmdatabase.READY return (machine1, machine2, hp_machine1, hp_machine2) def test_get_machine(self): (machine1, machine2, hp_machine1, hp_machine2) = self.test_add_machine() # order should be rs1, hp1 for oneiric, hp2, rs1 for precise hp_machine2.state_time = machine1.state_time-60 self.db.commit() self.db.print_state() rs_provider = self.db.getProvider('rackspace') hp_provider = self.db.getProvider('hpcloud') assert(len(rs_provider.ready_machines)==2) assert(len(hp_provider.ready_machines)==2) machine = self.db.getMachineForUse('oneiric') print 'got machine', machine.name assert(len(rs_provider.ready_machines)==1) assert(len(hp_provider.ready_machines)==2) assert(machine==machine1) machine = self.db.getMachineForUse('oneiric') print 'got machine', machine.name assert(len(rs_provider.ready_machines)==1) assert(len(hp_provider.ready_machines)==1) assert(machine==hp_machine1) machine = self.db.getMachineForUse('precise') print 'got machine', machine.name assert(len(rs_provider.ready_machines)==1) assert(len(hp_provider.ready_machines)==0) assert(machine==hp_machine2) machine = self.db.getMachineForUse('precise') print 'got machine', machine.name assert(len(rs_provider.ready_machines)==0) assert(len(hp_provider.ready_machines)==0) assert(machine==machine2) def test_result(self): (rs_machine1, rs_machine2, hp_machine1, hp_machine2) = self.test_add_machine() self.db.print_state() machine = self.db.getMachineForUse('oneiric') print 'got machine', machine.name result = machine.newResult('test-job', 82, 1234, 1) time.sleep(2) result.setResult(vmdatabase.RESULT_SUCCESS) self.db.commit() orig_result = result for provider in self.db.getProviders(): for base_image in provider.base_images: if (base_image.name == orig_result.base_image.name and base_image.provider.name == orig_result.base_image.provider.name): assert(len(base_image.results)==1) for result in base_image.results: assert(result.end_time > result.start_time) assert(result.result==vmdatabase.RESULT_SUCCESS) assert(result.machine_id == machine.id) assert(result.jenkins_job_name == 'test-job') assert(result.jenkins_build_number == 82) assert(result.gerrit_change_number == 1234) assert(result.gerrit_patchset_number == 1) else: assert(len(base_image.results)==0)