def test_create_sparse_tmp_file(self, mock_exec, mock_temp): tmp_file = mock.Mock() tmp_file.name = 'fake_name' mock_temp.return_value = tmp_file bu.create_sparse_tmp_file('dir', 'suffix', 1) mock_temp.assert_called_once_with(dir='dir', suffix='suffix', delete=False) mock_exec.assert_called_once_with('truncate', '-s', '1M', tmp_file.name)
def install_base_os(self, chroot): """Bootstrap a basic Linux system :param chroot directory where the installed OS can be found For now only Ubuntu is supported. Note: the data gets written to a different location (a set of ext4 images located in the image_build_dir directory) Includes the following steps 1) create temporary sparse files for all images (truncate) 2) attach temporary files to loop devices (losetup) 3) create file systems on these loop devices 4) create temporary chroot directory 5) mount loop devices into chroot directory 6) install operating system (debootstrap and apt-get) """ LOG.info('*** Preparing image space ***') for image in self.driver.image_scheme.images: LOG.debug('Creating temporary sparsed file for the ' 'image: %s', image.uri) img_tmp_file = bu.create_sparse_tmp_file( dir=CONF.image_build_dir, suffix=CONF.image_build_suffix, size=CONF.sparse_file_size) LOG.debug('Temporary file: %s', img_tmp_file) # we need to remember those files # to be able to shrink them and move in the end image.img_tmp_file = img_tmp_file image.target_device.name = \ bu.attach_file_to_free_loop_device( img_tmp_file, max_loop_devices_count=CONF.max_loop_devices_count, loop_device_major_number=CONF.loop_device_major_number, max_attempts=CONF.max_allowed_attempts_attach_image) # find fs with the same loop device object # as image.target_device fs = self.driver.partition_scheme.fs_by_device( image.target_device) LOG.debug('Creating file system on the image') fu.make_fs( fs_type=fs.type, fs_options=fs.options, fs_label=fs.label, dev=six.text_type(fs.device)) if fs.type == 'ext4': LOG.debug('Trying to disable journaling for ext4 ' 'in order to speed up the build') utils.execute('tune2fs', '-O', '^has_journal', six.text_type(fs.device)) # mounting all images into chroot tree self.mount_target(chroot, treat_mtab=False, pseudo=False) LOG.info('Installing BASE operating system into image') # FIXME(kozhukalov): !!! we need this part to be OS agnostic # DEBOOTSTRAP # we use first repo as the main mirror uri = self.driver.operating_system.repos[0].uri suite = self.driver.operating_system.repos[0].suite proxies = self.driver.operating_system.proxies LOG.debug('Preventing services from being get started') bu.suppress_services_start(chroot) LOG.debug('Installing base operating system using debootstrap') bu.run_debootstrap(uri=uri, suite=suite, chroot=chroot, attempts=CONF.fetch_packages_attempts, proxies=proxies.proxies, direct_repo_addr=proxies.direct_repo_addr_list) # APT-GET LOG.debug('Configuring apt inside chroot') LOG.debug('Setting environment variables') bu.set_apt_get_env() LOG.debug('Allowing unauthenticated repos') bu.pre_apt_get(chroot, allow_unsigned_file=CONF.allow_unsigned_file, force_ipv4_file=CONF.force_ipv4_file, proxies=proxies.proxies, direct_repo_addr=proxies.direct_repo_addr_list) # we need /proc to be mounted for apt-get success LOG.debug('Preventing services from being get started') bu.suppress_services_start(chroot) utils.makedirs_if_not_exists(os.path.join(chroot, 'proc')) # we need /proc to be mounted for apt-get success fu.mount_bind(chroot, '/proc') bu.populate_basic_dev(chroot)
def install_base_os(self, chroot): """Bootstrap a basic Linux system :param chroot directory where the installed OS can be found For now only Ubuntu is supported. Note: the data gets written to a different location (a set of ext4 images located in the image_build_dir directory) Includes the following steps 1) create temporary sparse files for all images (truncate) 2) attach temporary files to loop devices (losetup) 3) create file systems on these loop devices 4) create temporary chroot directory 5) mount loop devices into chroot directory 6) install operating system (debootstrap and apt-get) """ LOG.info('*** Preparing image space ***') for image in self.driver.image_scheme.images: LOG.debug('Creating temporary sparsed file for the ' 'image: %s', image.uri) img_tmp_file = bu.create_sparse_tmp_file( dir=CONF.image_build_dir, suffix=CONF.image_build_suffix, size=CONF.sparse_file_size) LOG.debug('Temporary file: %s', img_tmp_file) # we need to remember those files # to be able to shrink them and move in the end image.img_tmp_file = img_tmp_file image.target_device.name = \ bu.attach_file_to_free_loop_device( img_tmp_file, max_loop_devices_count=CONF.max_loop_devices_count, loop_device_major_number=CONF.loop_device_major_number, max_attempts=CONF.max_allowed_attempts_attach_image) # find fs with the same loop device object # as image.target_device fs = self.driver.partition_scheme.fs_by_device(image.target_device) LOG.debug('Creating file system on the image') fu.make_fs(fs_type=fs.type, fs_options=fs.options, fs_label=fs.label, dev=six.text_type(fs.device)) if fs.type == 'ext4': LOG.debug('Trying to disable journaling for ext4 ' 'in order to speed up the build') utils.execute('tune2fs', '-O', '^has_journal', six.text_type(fs.device)) # mounting all images into chroot tree self.mount_target(chroot, treat_mtab=False, pseudo=False) LOG.info('Installing BASE operating system into image') # FIXME(kozhukalov): !!! we need this part to be OS agnostic # DEBOOTSTRAP # we use first repo as the main mirror uri = self.driver.operating_system.repos[0].uri suite = self.driver.operating_system.repos[0].suite proxies = self.driver.operating_system.proxies LOG.debug('Preventing services from being get started') bu.suppress_services_start(chroot) LOG.debug('Installing base operating system using debootstrap') bu.run_debootstrap(uri=uri, suite=suite, chroot=chroot, attempts=CONF.fetch_packages_attempts, proxies=proxies.proxies, direct_repo_addr=proxies.direct_repo_addr_list) # APT-GET LOG.debug('Configuring apt inside chroot') LOG.debug('Setting environment variables') bu.set_apt_get_env() LOG.debug('Allowing unauthenticated repos') bu.pre_apt_get(chroot, allow_unsigned_file=CONF.allow_unsigned_file, force_ipv4_file=CONF.force_ipv4_file, proxies=proxies.proxies, direct_repo_addr=proxies.direct_repo_addr_list) # we need /proc to be mounted for apt-get success LOG.debug('Preventing services from being get started') bu.suppress_services_start(chroot) utils.makedirs_if_not_exists(os.path.join(chroot, 'proc')) # we need /proc to be mounted for apt-get success fu.mount_bind(chroot, '/proc') bu.populate_basic_dev(chroot)