Delete download_test_build.py
The file was added in 2013, and performs the same function as crosdl.py
but with fewer options. If anyone is still using this, they should
switch to crosdl.py.
BUG=chromium:1031760
TEST=None
Change-Id: Icdb632604dd3d8a2983a9cf245a457e1aa51457d
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/crostestutils/+/1959067
Tested-by: Greg Edelston <gredelston@google.com>
Reviewed-by: Katherine Threlkeld <kathrelkeld@chromium.org>
Reviewed-by: Aviv Keshet <akeshet@chromium.org>
Commit-Queue: Greg Edelston <gredelston@google.com>
diff --git a/provingground/download_test_build.py b/provingground/download_test_build.py
deleted file mode 100755
index 0d9c462..0000000
--- a/provingground/download_test_build.py
+++ /dev/null
@@ -1,398 +0,0 @@
-#!/usr/bin/python
-# -*- coding: utf-8 -*-
-# Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import os
-import subprocess as sub
-import sys
-import xml.parsers.expat
-
-
-"""
-This script can be used to download chromeos test images from the the cloud
-storage. We assume that the cloud storage path remains similar all the time.
-
-eg: gs://chromeos-releases/dev-channel/link/4162.0.0/
- ChromeOS-R29-4162.0.0-link.zip
-
-So passing the above value to 'gstuil cp ' will download
-the relevant CrOS image.
-
-After downloading the file we uzip the file and wait for the user
-to give the path to which the image should be copied.
-
-eg: /dev/sdb
-
-This script will create a build_defaults.xml file with the defaults info in
-the scripts folder. So please run this from a folder with a write permissions.
-
-"""
-
-
-def run_command(command, shell=False):
- """ Run a given command using subprocess.
-
- @param command: The command to run. Should be a list.
- @param shell: Flag to use bash to run the command.
-
- @return out: Output of the process.
- """
- process = sub.Popen(command, stdout=sub.PIPE,
- stderr=sub.PIPE, shell=shell)
- (out, err) = process.communicate()
-
- if err and 'Copying gs://chromeos-releases/' not in err:
- raise Exception('We got an error %s' % err)
- return out
-
-
-class defaults():
- # TODO: Have a defaults file to read/write into it.
- channel_list = ['dev', 'beta', 'stable']
- device_list = ['x86-mario', 'x86-zgb', 'x86-alex', 'daisy', 'stout',
- 'link', 'butterfly', 'stout', 'stumpy', 'parrot', 'lumpy',]
- default_dict = {'channel': None, 'device': None,
- 'branch': None, 'version': None}
- defaults_file = 'build_defaults.xml'
-
-
- def __init__(self):
- if not os.path.exists(self.defaults_file):
- self._create_defaults()
-
-
- def set_defaults(self, channel, device, version, branch):
- """Set the new defaults.
-
- @param channel: default channel to be saved.
- @param device: defalut device to be saved.
- @param version: default version to be saved.
- @param branch: default branch to be saved.
- """
- self.default_dict['channel'] = channel
- self.default_dict['branch'] = branch
- self.default_dict['version'] = version
- self.default_dict['device'] = device
- self._update_defaults()
-
-
- def _create_defaults_element(self, initial=True):
- """Create a defaults element to be added to the xml file.
-
- @param initial: Flag to check if we are creating or updating the
- defaults.
-
- @return defaults_element: Element with defaults attributes to be added.
- """
- defaults_element = '<defaults '
- for key in self.default_dict.keys():
- if initial or self.default_dict[key]:
- defaults_element += '%s="%s" ' % (key, self.default_dict[key])
- defaults_element += ('></defaults>\n')
- return defaults_element
-
-
- def _update_defaults(self):
- """Update the defaults list in database/xml."""
- defaults_element = self._create_defaults_element(initial=False)
- lines = open(self.defaults_file, 'r').readlines()
- os.remove(self.defaults_file)
- fin = open(self.defaults_file, 'w')
- for line in lines:
- if '<defaults ' in line:
- fin.write(defaults_element)
- break # this will always be the last line
- else:
- fin.write(line)
- fin.close()
-
-
- def _create_defaults(self):
- """Create all the defaults."""
- print 'Creating Defaults file.'
- fout = open(self.defaults_file, 'wb')
- root = '<feed xmlns=\'http://www.w3.org/2005/Atom\' xml:lang=\'en\'>\n'
- fout.write(root)
- channel_element = '<channel>'
- for channel in self.channel_list:
- channel_element += '%s, ' % channel
- channel_element += ('</channel>\n')
- fout.write(channel_element)
- device_element = '<device>'
- for device in self.device_list:
- device_element += '%s, ' % device
- device_element += ('</device>\n')
- fout.write(device_element)
- defaults_element = self._create_defaults_element()
- fout.write(defaults_element)
- fout.close()
-
-
- def previous_defaults(self):
- """Get the default values."""
- # Parse and read the xml data
- self.read_xml()
- return self.default_dict
-
-
- def start_element(self, name, attrs):
- if name == 'defaults':
- self.default_dict = attrs
-
-
- def char_data(self, data):
- if 'dev' in data:
- self.add_default_channel(data)
- if 'link' in data:
- self.add_default_devices(data)
-
-
- def read_xml(self):
- """Read and parse the xml file."""
- fin = open(self.defaults_file, 'r')
- parse_data = fin.read()
- parser = xml.parsers.expat.ParserCreate()
- parser.StartElementHandler = self.start_element
- parser.CharacterDataHandler = self.char_data
- parser.Parse(parse_data)
-
-
- def channel(self):
- """Read the default channel from the logs"""
- return self.channel_list
-
-
- def add_default_channel(self, data):
- """Add a channel if it does not exist in defaults."""
- for channel in data.split(','):
- if channel and (channel not in self.channel_list):
- self.channel_list.append(channel)
-
-
- def add_default_devices(self, data):
- """Add a device if it does not exist in defaults."""
- for device in data.split(','):
- if device and device not in self.device_list:
- self.device_list.append(device)
-
-
- def element_in_list(self, element, element_list):
- for old_element in element_list:
- if element in old_element:
- return False
- return True
-
-
-class download_image():
- # This script will work until the image path remains unchanged. If the
- # cloud team decides to change the default path to the images, change this
- # path constant accordingly. This is used build_source.
- image_path = 'gs://chromeos-releases/%s-channel/%s/%s/ChromeOS-%s-%s-%s.zip'
-
- def file_check(self, dest, folder=True, action=False):
- """ Check if a file or folder exists.
- This is used in two places, first to check if we have the test
- folder and second to check if we already have the file to download.
-
- @param dest: The path to look for. Should be a string.
- @param folder: Flag to indicate if the path is a directory or not.
- @param action: Flag to indicate if an action is required.
- eg: Creation or deletion.
- """
- if folder and not os.path.exists(dest):
- if action:
- os.makedirs(dest)
- print 'Created directory %s' % dest
- else:
- raise Exception('The path %s does not exist' % dest)
- elif folder and not os.path.isdir(dest):
- raise Exception('The path %s exists and is not a folder.' % dest)
- elif not folder and os.path.exists(dest):
- zip_file = os.path.basename(dest)
- file_type = 'file'
- if os.path.isdir(zip_file):
- file_type = 'folder'
- if action:
- print ('The %s %s exists or is downloaded in %s' %
- (os.path.basename(dest), file_type, os.path.dirname(dest)))
- delete_flag = raw_input('Do you want to remove the existing?'
- ' (Y/N): ')
- if delete_flag.lower() == 'y':
- print 'Removing the file %s' % dest
- os.remove(dest)
- else:
- print 'Continuing with the download.'
-
-
- def check_download(self, dest, source):
- """Check if the download was successful. Verify the checksum and the
- size of the downloaded file.
-
- @param dest: The complete path to the downloaded file
- @param source: The complete path to the file in cloudstorage.
- """
- out = run_command(['gsutil', 'ls', '-L', source])
- checksum = size = ''
- for line in out.split('\n'):
- if 'ETag:' in line:
- checksum = line.split(':')[1].strip('\t')
- elif 'Content-Length:' in line:
- size = line.split(':')[1].strip('\t')
- sout = run_command(['ls -Sl %s' % dest], shell=True)
- md5out = run_command(['md5sum', dest])
- if not size in sout:
- raise Exception ('File did not download completely. '
- 'It should be %s and we got %s' % (size, sout))
- elif not checksum in md5out:
- raise Exception ('The downloaded file is corrupted. '
- 'The checksum should %s and we got %s' %
- (checksum, md5out))
-
-
- def download(self, device=None, channel=None, version=None, branch=None):
- """Download a zip file containing the test image. The user is
- expected to provide a clean input. A blank input means that
- we use defaults. Defaults will be the last build
- that the script attempted to download.
-
- @param device : The device under test. eg: x86-mario, link. This should
- be the exact name of the device as shown in the
- http://chromeos-images.
- @param channel: The channel under which we can get the test build.
- eg: dev, beta, stable.
- @param version: The version of the build. eg:3701.0.0, 3701.71.0.
- @param branch : The branch under which we can find the version.
- eg: R26, R27.
-
- @return final_dest: The complete downloaded file path.
- """
- # TODO: download stops at 4109631488, check why
- build_info = self.build_source(device=device, channel=channel,
- version=version, branch=branch)
- source = build_info[0]
- dest = '/tmp/%s/test' % build_info[1]
- final_dest = os.path.join(dest, os.path.basename(source))
- self.file_check(dest, folder=True, action=True)
- self.file_check(final_dest, folder=False, action=True)
- print 'Downloading %s, Please wait ...' % source
- run_command(['gsutil', 'cp', source, dest])
- self.file_check(final_dest, folder=False)
- self.check_download(final_dest, source)
- run_command(['nautilus', dest])
- return final_dest
-
-
- def build_source(self, device=None, channel=None,
- version=None, branch=None):
- """Multiple option parser. Allows user to give arguments or options
- or call the function from their module to create the source path
- of the CrOS test build zip file to be downloaded. The user is
- expected to provide a clean input. A blank input means that we
- use defaults. Defaults will be the last build
- that the script attempted to download.
-
- @param device : The device under test. eg: x86-mario, link. This should
- be the exact name of the device as shown in the
- http://chromeos-images.
- @param channel: The channel under which we can get the test build.
- eg: dev, beta, stable.
- @param version: The version of the build. eg:3701.0.0, 3701.71.0.
- @param branch : The branch under which we can find the version.
- eg: R26, R27.
- """
- default = defaults()
- # We save the previous configuration as default
- prev_values = default.previous_defaults()
- defa_channel = prev_values['channel']
- defa_version = prev_values['version']
- defa_branch = prev_values['branch']
- defa_device = prev_values['device']
- if not (channel and branch and version and device):
- channel = raw_input('Enter the channel(default: %s): ' %
- defa_channel)
- device = raw_input('Enter the device(default: %s): ' %
- defa_device)
- branch = raw_input('Enter the branch(default: %s): ' %
- defa_branch)
- version = raw_input('Enter the version(default: %s): ' %
- defa_version)
-
- # Check the inputs again
- if not (channel and branch and version and device):
- if not (defa_channel and defa_branch and defa_version and
- defa_device):
- raise Exception ('Insufficient input to download the build. '
- 'Please use \"build_down.py --help\" to get '
- 'more information about passing arguments.')
- sys.exit(0)
- if not channel: # If no input, we use defaults
- channel = defa_channel
- if not branch:
- branch = defa_branch
- if not version:
- version = defa_version
- if not device:
- device = defa_device
- path = (self.image_path % (channel, device, version, branch,
- version, device))
- default.set_defaults(channel=channel, device=device,
- version=version, branch=branch)
- return [path, device]
-
-
-class unzip_burn():
-
- def unzip_file(self, zip_file):
- """ Unzip the given file into a folder with the same name.
-
- @param zip_file: The file to be unzipped.
-
- @return dest: The folder with unzipped files.
- """
- dest = os.path.splitext(zip_file)[0]
- # We avoid all the unnecesssary files to reduce the unzip time
- command = ['unzip', zip_file, '-d', dest, '-x',
- 'autotest.tar.bz2', 'chromiumos_base_image.bin',
- 'recovery_image.bin']
- large_zips = ['stout', 'link']
- for board in large_zips:
- if board in zip_file:
- command.append('chromiumos_qemu_image.bin')
- break
- if run_command(command):
- return dest
-
-
- def burn(self, image, drive):
- """ Burn the image to the given drive.
-
- @param image: The complete path to the image.
- @param drive: The complete path to the drive.
- """
- print 'Burning the image %s on to drive %s ...' % (image, drive)
- if run_command(['sudo dd if=%s of=%s' % (image, drive)],
- shell=True):
- print 'Image is now on %s drive.'
-
-
-def main():
- download = download_image()
- image = download.download()
- burn = unzip_burn()
- print 'Unzipping the folder, please wait ...'
- dest = burn.unzip_file(image)
- if dest:
- download_path = os.path.join(dest, 'chromiumos_test_image.bin')
- print 'The test image is in %s' % download_path
- drive_path = raw_input('Which drive to use?(default: /dev/sdc): ')
- if '/dev' not in drive_path:
- print 'Using the default drive path /dev/sdc.'
- drive_path = '/dev/sdc'
- if os.path.exists(download_path) and os.path.exists(drive_path):
- burn.burn(download_path, drive_path)
-
-
-if __name__ == '__main__':
- main()
diff --git a/provingground/test_build_download.py b/provingground/test_build_download.py
deleted file mode 100644
index 67b1d80..0000000
--- a/provingground/test_build_download.py
+++ /dev/null
@@ -1,60 +0,0 @@
-#!/usr/sbin/python
-# -*- coding: utf-8 -*-
-# Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import download_test_build
-import os
-import unittest
-
-"""
-This test can be used to download multiple test images using
-download_test_build.
-"""
-
-
-class TestBuilds(unittest.TestCase):
- channel = 'dev'
- branch = 'R28'
- version = '4100.17.0'
- image = []
-
- def setUp(self):
- self.build = download_test_build.download_image()
-
- def tearDown(self):
- """Remove all test paths."""
-# disabled by default
-# for path in self.image:
-# print 'Removing the download %s' % path
-# os.remove(path)
-
- def test_daisy(self):
- """Test downloading daisy."""
- path = self.build.download(channel=self.channel,
- device='daisy', branch=self.branch,
- version=self.version)
- self.image.append(path)
- self.failUnless(os.path.exists(path))
-
-
- def test_link(self):
- """Test downloading link."""
- path = self.build.download(channel=self.channel,
- device='link', version=self.version,
- branch=self.branch)
- self.image.append(path)
- self.failUnless(os.path.exists(path))
-
-
- def test_parrot(self):
- """Test downloading parrot."""
- path = self.build.download(channel=self.channel,
- device='parrot', branch=self.branch,
- version=self.version)
- self.image.append(path)
- self.failUnless(os.path.exists(path))
-
-if __name__ == '__main__':
- unittest.main()