def do_put_test(self, vdi_mb, put_data_size, put_offset, check_border_size, unexpose_reexpose=False): self.assert_(put_data_size + put_offset <= vdi_mb * M, 'Test has invalid data offsets.') lower_border_size = min(put_offset, check_border_size) upper_border_size = min(vdi_mb * M - put_offset - put_data_size, check_border_size) put_data = 'abcdefgh' * (put_data_size / 8) expect_data = ('\0' * lower_border_size) + put_data + ('\0' * upper_border_size) hostname, network, vdi = testsetup.setup_host_and_network(templates=1, vdi_mb=vdi_mb) transferclient.expose(hostname, vdi_uuid=vdi, network_uuid=network, transfer_mode='http') record = transferclient.get_record(hostname, vdi_uuid=vdi) put_status, put_headers = http_put(record, put_data, put_offset, vdi_mb * M) self.assertEqual(put_status, 200) if unexpose_reexpose: transferclient.unexpose(hostname, vdi_uuid=vdi) transferclient.expose(hostname, vdi_uuid=vdi, network_uuid=network, transfer_mode='http') record = transferclient.get_record(hostname, vdi_uuid=vdi) get_status, get_headers, get_respdata = http_get(record, (put_offset - lower_border_size, put_offset + put_data_size + upper_border_size)) self.assert_(get_status == 200 or get_status == 206, 'GET status code %d is not success.' % get_status) self.assertEquals(len(get_respdata), len(expect_data)) self.assertEquals(get_respdata, expect_data) clean_up()
def testVdiRecordStatusIsUnusedAfterUnexpose(self): hostname, network, vdi = testsetup.setup_host_and_network(templates=1, vdi_mb=10) transferclient.expose(hostname, vdi_uuid=vdi, network_uuid=network, transfer_mode='http') transferclient.unexpose(hostname, vdi_uuid=vdi) record = transferclient.get_record(hostname, vdi_uuid=vdi) self.assertEqual(record['status'], 'unused')
def testThereAreNoPluggedInVbdsAfterUnexpose(self): hostname, network, vdi = testsetup.setup_host_and_network(templates=1, vdi_mb=10) transferclient.expose(hostname, vdi_uuid=vdi, network_uuid=network, transfer_mode='http') transferclient.unexpose(hostname, vdi_uuid=vdi) vbds = vbd_uuids_and_attached_flags_by_vdi_uuid(hostname, vdi) for vbd, attached in vbds: self.assertFalse(attached, 'VBD %s is still attached' % vbd) if vbds: logging.info('testThereAreNoPluggedInVbdsAfterUnexpose passed because all %d VBDs are unattached.' % len(vbds)) else: logging.info('testThereAreNoPluggedInVbdsAfterUnexpose passed because there are no VBDs.')
def testTargetHostUUIDConfig(self): hostname, network, vdi = testsetup.setup_host_and_network(templates=1, vdi_mb=10) if self.REMOVE_TEMPLATE: #Remove the TVM template to catch errors that would occur on first run (when the template doesn't exist) testsetup.remove_tvm_template(hostname) host_uuid = get_host_uuids(hostname) transfer_mode=self.TRANSFER_MODE asyncexpose = ExposeThread(hostname, network, vdi, transfer_mode=transfer_mode, target_host_uuid=host_uuid) asyncexpose.start() while asyncexpose.isAlive(): time.sleep(1) record = transferclient.get_record(hostname, vdi_uuid=vdi) logging.debug(record) transferclient.unexpose(hostname, vdi_uuid=vdi) testsetup.clean_host(hostname)
def do_put_test(self, vdi_mb, put_data_size, put_offset, check_border_size, unexpose_reexpose=False): self.assert_(put_data_size + put_offset <= vdi_mb * M, 'Test has invalid data offsets.') lower_border_size = min(put_offset, check_border_size) upper_border_size = min(vdi_mb * M - put_offset - put_data_size, check_border_size) put_data = 'abcdefgh' * (put_data_size / 8) expect_data = ('\0' * lower_border_size) + put_data + ('\0' * upper_border_size) hostname, network, vdi = testsetup.setup_host_and_network(templates=1, vdi_mb=vdi_mb) transferclient.expose(hostname, vdi_uuid=vdi, network_uuid=network, transfer_mode='http') record = transferclient.get_record(hostname, vdi_uuid=vdi) put_status, put_headers = http_put(record, put_data, put_offset, vdi_mb * M) self.assertEqual(put_status, 200) if unexpose_reexpose: transferclient.unexpose(hostname, vdi_uuid=vdi) transferclient.expose(hostname, vdi_uuid=vdi, network_uuid=network, transfer_mode='http') record = transferclient.get_record(hostname, vdi_uuid=vdi) get_status, get_headers, get_respdata = http_get( record, (put_offset - lower_border_size, put_offset + put_data_size + upper_border_size)) self.assert_(get_status == 200 or get_status == 206, 'GET status code %d is not success.' % get_status) self.assertEquals(len(get_respdata), len(expect_data)) self.assertEquals(get_respdata, expect_data) clean_up()
def testThereAreNoPluggedInVbdsAfterUnexpose(self): hostname, network, vdi = testsetup.setup_host_and_network(templates=1, vdi_mb=10) transferclient.expose(hostname, vdi_uuid=vdi, network_uuid=network, transfer_mode='http') transferclient.unexpose(hostname, vdi_uuid=vdi) vbds = vbd_uuids_and_attached_flags_by_vdi_uuid(hostname, vdi) for vbd, attached in vbds: self.assertFalse(attached, 'VBD %s is still attached' % vbd) if vbds: logging.info( 'testThereAreNoPluggedInVbdsAfterUnexpose passed because all %d VBDs are unattached.' % len(vbds)) else: logging.info( 'testThereAreNoPluggedInVbdsAfterUnexpose passed because there are no VBDs.' )
def testGetRecordWorksWhenReexposingVDIMultipleTimes(self): hostname, network, vdi = testsetup.setup_host_and_network(templates=1, vdi_mb=10) transferclient.expose(hostname, vdi_uuid=vdi, network_uuid=network, transfer_mode='http') retval = transferclient.unexpose(hostname, vdi_uuid=vdi) self.assertEquals(retval, 'OK', 'Unexpose failed, never got to get_record testing.') transferclient.expose(hostname, vdi_uuid=vdi, network_uuid=network, transfer_mode='http') record = transferclient.get_record(hostname, vdi_uuid=vdi) self.assertVdiStatus(record, vdi, 'exposed') clean_up()
def testUnexposeWaitsUntilPartialExposeHasFinished(self): hostname, network, vdi = testsetup.setup_host_and_network(templates=1, vdi_mb=10) asyncexpose = ExposeThread(hostname, network, vdi) asyncexpose.start() response = None while not response: logging.debug('VDI status still unused, unexposing') try: response = transferclient.unexpose(hostname, vdi_uuid=vdi) except XenAPI.Failure, e: if e.details[2] != 'VDINotInUse': raise
def _doTest(self, src, frag_size, sleep_time, delta, randomise_delta=False): """Tests how we handle the client droping/losing packets when they are POSTing a BITS request""" physize = os.stat(src).st_size vdi_mb = vhd.get_virtual_size(src) #Expose a new VDI record, hostname = create_and_expose(vdi_mb) url_path = record['url_path'] + ".vhd" #Create BITS Session conn, session = create_BITS_session(record) logging.debug("Frag_Size = %d" % frag_size) #Adjust frag size for the case we have small disks if physize < frag_size: frag_size = physize #Initialise Upload variables range_start = 0 range_end = frag_size file_offset = 0 fh = open(src, 'r') count = 0 while file_offset < physize: if randomise_delta: #Generate a random number within the request range delta = random.randint(0, range_end - range_start) logging.debug("Random Delta = %d" % delta) if range_end == physize: delta = 0 logging.debug("Uploading %d-%d/%d" % (range_start, range_end, physize)) data_size = (range_end - range_start - delta) if count == 1: data_size = 10 logging.debug("Actually uploading %d bytes" % data_size) data = fh.read(data_size) logging.debug("Data Read") try: bits.fragment(conn, session, url_path, data, range_start, range_end, physize) except: logging.debug("Fragment Sent partially %d-%d/%d" % (range_start, range_end, physize)) file_offset += (range_end - range_start - delta) range_start = file_offset + 1 count += 1 if count > 1: sys.exit(1) #Condition for last frag upload range_end = file_offset + frag_size if physize < range_end: range_end = physize #Sleep before creating new connection logging.debug("Sleeping for %d seconds" % sleep_time) time.sleep(sleep_time) #Garbage Collect to make sure we don't run out of memory data = '' gc.collect() #Create new connection logging.debug("Get a new connection...") conn = bits.open_connection(get_proto(record), record['ip'], record['port']) #Close file handle fh.close() #Unexpose the transfervm logging.debug("Unexposing the Transfer VM for vdi %s" % record['vdi_uuid']) transferclient.unexpose(hostname, vdi_uuid=record['vdi_uuid']) #Retrieve the blockmap to expose the VDI as a vhd bitmap = transferclient.get_vdi_bitmap(hostname, record['vdi_uuid']) logging.debug("Got bitmap %s" % bitmap) #Expose disk with vhd_block_map args = {'transfer_mode': 'bits', 'vdi_uuid': record['vdi_uuid'], 'network_uuid': 'management', 'vhd_blocks': bitmap, 'vhd_uuid': record['vdi_uuid']} transferclient.expose(hostname, **args) record = transferclient.get_record(hostname, vdi_uuid=record['vdi_uuid']) logging.debug("Got new record: %s" % record) dst = 'test-download.vhd' logging.debug("Destination file will be %s" % dst) request_size = 200*M vhd_tests.bits_download_vhd(record, dst, request_size) #Compare the two VHDs to check they are identical rc = vhd.diff(src, dst) logging.debug("Return Code %s" % rc) #Unexpose the transfervm logging.debug("Unexposing the Transfer VM for vdi %s" % record['vdi_uuid']) transferclient.unexpose(hostname, vdi_uuid=record['vdi_uuid']) #Cleanup Disks transferclient.remove_vdi(hostname, record['vdi_uuid']) #Remove Downloaded File os.unlink(dst)
def unexpose(hostname, record): args= {'record_handle': record['record_handle']} logging.debug("Unexposeing %s" % record['vdi_uuid']) startTime = time.time() transferclient.unexpose(hostname, **args) logging.debug("Unexpose took %.3f seconds" % (time.time() - startTime))
def _unexpose_vdi(self, hostname, record): transferclient.unexpose(hostname, vdi_uuid=record['vdi_uuid']) assertVdiKeyNotOnSR(hostname, record['vdi_uuid'])
def unexpose(hostname, record): args = {'record_handle': record['record_handle']} logging.debug("Unexposeing %s" % record['vdi_uuid']) startTime = time.time() transferclient.unexpose(hostname, **args) logging.debug("Unexpose took %.3f seconds" % (time.time() - startTime))