fedimg: Place a hotfix for the PR#99, original files

Signed-off-by: Sayan Chowdhury <sayan.chowdhury2012@gmail.com>
This commit is contained in:
Sayan Chowdhury 2018-04-18 01:32:51 +05:30 committed by Sayan Chowdhury
parent c72bca84f4
commit ff88d963b5
2 changed files with 182 additions and 0 deletions

View file

@ -0,0 +1,173 @@
# This file is part of fedimg.
# Copyright (C) 2014-2017 Red Hat, Inc.
#
# fedimg is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as
# published by the Free Software Foundation, either version 3 of the
# License, or (at your option) any later version.
#
# fedimg is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
# Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public
# License along with fedimg; if not, see http://www.gnu.org/licenses,
# or write to the Free Software Foundation, Inc.,
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
#
# Authors: David Gay <dgay@redhat.com>
# Ralph Bean <rbean@redhat.com>
# Sayan Chowdhury <sayanchowdhury@fedoraproject.org>
"""
Utility functions for fedimg.
"""
import logging
_log = logging.getLogger(__name__)
import functools
import os
import re
import socket
import subprocess
import tempfile
import paramiko
from libcloud.compute.types import Provider
from libcloud.compute.providers import get_driver
def get_file_arch(file_name):
""" Takes a file name (probably of a .raw.xz image file) and returns
the suspected architecture of the contained image. If it doesn't look
like a 32-bit or 64-bit image, None is returned. """
if file_name.find('x86_64') != -1:
return 'x86_64'
else:
return None
def get_rawxz_urls(location, images):
""" Iterates through all the images metadata and returns the url of .raw.xz
files.
"""
rawxz_list = [f['path'] for f in images if f['path'].endswith('.raw.xz')]
if not rawxz_list:
return []
return map((lambda path: '{}/{}'.format(location, path)), rawxz_list)
def get_virt_types_from_url(url):
""" Takes a URL to a .raw.xz image file) and returns the suspected
virtualization type that the image file should be registered as. """
return ['hvm']
def region_to_driver(region):
""" Takes a region name (ex. 'eu-west-1') and returns
the appropriate libcloud provider value. """
cls = get_driver(Provider.EC2)
return functools.partial(cls, region=region)
def ssh_connection_works(username, ip, keypath):
""" Returns True if an SSH connection can me made to `username`@`ip`. """
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
works = False
try:
ssh.connect(ip, username=username,
key_filename=keypath)
works = True
except (paramiko.BadHostKeyException,
paramiko.AuthenticationException,
paramiko.SSHException, socket.error):
pass
ssh.close()
return works
def get_value_from_dict(_dict, *keys):
for key in keys:
try:
_dict = _dict[key]
except KeyError:
return None
return _dict
def external_run_command(command):
_log.debug("Starting the command: %r" % command)
ret = subprocess.Popen(' '.join(command), stdin=subprocess.PIPE, shell=True,
stdout=subprocess.PIPE, stderr=subprocess.PIPE,
close_fds=True)
out, err = ret.communicate()
_log.debug("Finished executing the command: %r" % command)
retcode = ret.returncode
return out, err, retcode
def get_item_from_regex(output, regex):
match = re.search(regex, output)
if match is None:
return ''
else:
return match.group(1)
def get_file_name_image(image_url):
return image_url.split('/')[-1]
def get_source_from_image(image_url):
tmpdir = tempfile.mkdtemp()
file_name = get_file_name_image(image_url)
file_path = os.path.join(tmpdir, file_name)
_log.info("[PREP] Preparing temporary directory for download: %r" % tmpdir)
output, error, retcode = external_run_command([
'wget',
image_url,
'-P',
tmpdir
])
if retcode != 0:
return ''
return file_path
def get_volume_type_from_image(image, region):
return image.extra['block_device_mapping'][0]['ebs']['volume_type']
def get_virt_type_from_image(image):
return 'hvm'
def get_image_name_from_image(image_url, virt_type='', region='', respin='0',
volume_type=''):
file_name = get_file_name_image(image_url)
build_name = file_name.replace('.raw.xz', '')
return '-'.join(
[x for x in [build_name, virt_type, region, volume_type, respin] if x])
def get_image_name_from_ami_name(image_name, region):
name_vt_region, volume_type, respin = image_name.rsplit('-', 2)
name_vt = name_vt_region.rsplit('-', 3)[:-3][0]
return '-'.join(
[x for x in [name_vt, region, volume_type, respin] if x])
def get_image_name_from_ami_name_for_fedmsg(image_name):
name_vt_region, volume_type, respin = image_name.rsplit('-', 2)
image_name = name_vt_region.rsplit('-', 4)[:-4][0]
return image_name