Implement --output-file to write the bash script
I will output a sourceable bash script with a capitalized version of the releases dictionary variables. Change-Id: I1fa8cbfd737d22e8d44723e0274d49d268b213e2
This commit is contained in:
parent
dbca28c411
commit
8d4adf4233
|
@ -43,8 +43,8 @@ def load_featureset_file(featureset_file):
|
||||||
def get_dlrn_hash(release, hash_name, retries=10):
|
def get_dlrn_hash(release, hash_name, retries=10):
|
||||||
logger = logging.getLogger('emit-releases')
|
logger = logging.getLogger('emit-releases')
|
||||||
full_hash_pattern = re.compile('[a-z,0-9]{40}_[a-z,0-9]{8}')
|
full_hash_pattern = re.compile('[a-z,0-9]{40}_[a-z,0-9]{8}')
|
||||||
repo_url = ('https://trunk.rdoproject.org/centos7-%s/%s/delorean.repo'
|
repo_url = ('https://trunk.rdoproject.org/centos7-%s/%s/delorean.repo' %
|
||||||
% (release, hash_name))
|
(release, hash_name))
|
||||||
for retry_num in range(retries):
|
for retry_num in range(retries):
|
||||||
repo_file = None
|
repo_file = None
|
||||||
# Timeout if initial connection is longer than default
|
# Timeout if initial connection is longer than default
|
||||||
|
@ -155,6 +155,28 @@ def shim_convert_old_release_names(releases_names):
|
||||||
return releases_names
|
return releases_names
|
||||||
|
|
||||||
|
|
||||||
|
def write_releases_dictionary_to_bash(releases_dictionary, bash_file_name):
|
||||||
|
logger = logging.getLogger('emit-releases')
|
||||||
|
# Make it deterministic, expected constants in the proper order
|
||||||
|
try:
|
||||||
|
bash_script = '''#!/bin/env bash
|
||||||
|
export UNDERCLOUD_INSTALL_RELEASE="{undercloud_install_release}"
|
||||||
|
export UNDERCLOUD_INSTALL_HASH="{undercloud_install_hash}"
|
||||||
|
export UNDERCLOUD_TARGET_RELEASE="{undercloud_target_release}"
|
||||||
|
export UNDERCLOUD_TARGET_HASH="{undercloud_target_hash}"
|
||||||
|
export OVERCLOUD_DEPLOY_RELEASE="{overcloud_deploy_release}"
|
||||||
|
export OVERCLOUD_DEPLOY_HASH="{overcloud_deploy_hash}"
|
||||||
|
export OVERCLOUD_TARGET_RELEASE="{overcloud_target_release}"
|
||||||
|
export OVERCLOUD_TARGET_HASH="{overcloud_target_hash}"
|
||||||
|
'''.format(**releases_dictionary)
|
||||||
|
with open(bash_file_name, 'w') as bash_file:
|
||||||
|
bash_file.write(bash_script)
|
||||||
|
except Exception:
|
||||||
|
logger.exception("Writting releases dictionary")
|
||||||
|
return False
|
||||||
|
return True
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
|
|
||||||
default_log_file = '{}.log'.format(os.path.basename(__file__))
|
default_log_file = '{}.log'.format(os.path.basename(__file__))
|
||||||
|
@ -193,5 +215,8 @@ if __name__ == '__main__':
|
||||||
releases_dictionary = compose_releases_dictionary(args.stable_release,
|
releases_dictionary = compose_releases_dictionary(args.stable_release,
|
||||||
featureset)
|
featureset)
|
||||||
|
|
||||||
releases_dictionary = shim_convert_old_release_names(
|
releases_dictionary = shim_convert_old_release_names(releases_dictionary)
|
||||||
releases_dictionary)
|
|
||||||
|
if not write_releases_dictionary_to_bash(
|
||||||
|
releases_dictionary, args.output_file):
|
||||||
|
exit(1)
|
||||||
|
|
|
@ -7,18 +7,20 @@ import pytest
|
||||||
@mock.patch('requests.get')
|
@mock.patch('requests.get')
|
||||||
def test_get_dlrn_hash(mock_get):
|
def test_get_dlrn_hash(mock_get):
|
||||||
mock_response = mock.Mock()
|
mock_response = mock.Mock()
|
||||||
mock_response.content = ('[delorean]\nname=delorean-openstack-nova-81c23c04'
|
mock_response.content = (
|
||||||
'7e8e0fc03b54164921f49fdb4103202c\nbaseurl=https:/'
|
'[delorean]\nname=delorean-openstack-nova-81c23c04'
|
||||||
'/trunk.rdoproject.org/centos7/81/c2/81c23c047e8e0'
|
'7e8e0fc03b54164921f49fdb4103202c\nbaseurl=https:/'
|
||||||
'fc03b54164921f49fdb4103202c_b333f915\nenabled=1\n'
|
'/trunk.rdoproject.org/centos7/81/c2/81c23c047e8e0'
|
||||||
'gpgcheck=0\npriority=1')
|
'fc03b54164921f49fdb4103202c_b333f915\nenabled=1\n'
|
||||||
|
'gpgcheck=0\npriority=1')
|
||||||
release = 'master'
|
release = 'master'
|
||||||
hash_name = 'current-tripleo'
|
hash_name = 'current-tripleo'
|
||||||
repo_url = ('https://trunk.rdoproject.org/centos7-%s/%s/delorean.repo'
|
repo_url = ('https://trunk.rdoproject.org/centos7-%s/%s/delorean.repo' %
|
||||||
% (release, hash_name))
|
(release, hash_name))
|
||||||
mock_get.return_value = mock_response
|
mock_get.return_value = mock_response
|
||||||
assert (get_dlrn_hash(release, hash_name) ==
|
assert (get_dlrn_hash(
|
||||||
'81c23c047e8e0fc03b54164921f49fdb4103202c_b333f915')
|
release,
|
||||||
|
hash_name) == '81c23c047e8e0fc03b54164921f49fdb4103202c_b333f915')
|
||||||
mock_get.assert_called_once_with(repo_url, timeout=(3.05, 27))
|
mock_get.assert_called_once_with(repo_url, timeout=(3.05, 27))
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,68 @@
|
||||||
|
from emit_releases_file import write_releases_dictionary_to_bash
|
||||||
|
|
||||||
|
import os
|
||||||
|
import mock
|
||||||
|
from mock import mock_open
|
||||||
|
from six import PY2
|
||||||
|
|
||||||
|
import pytest
|
||||||
|
|
||||||
|
if PY2:
|
||||||
|
BUILTINS_OPEN = "__builtin__.open"
|
||||||
|
else:
|
||||||
|
BUILTINS_OPEN = "builtins.open"
|
||||||
|
|
||||||
|
|
||||||
|
def test_empty_relases_dictionary_fails():
|
||||||
|
assert (not write_releases_dictionary_to_bash({}, ""))
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.fixture
|
||||||
|
def releases_dictionary():
|
||||||
|
return {
|
||||||
|
'undercloud_install_release': 'queens',
|
||||||
|
'undercloud_install_hash': 'current-tripleo',
|
||||||
|
'undercloud_target_release': 'master',
|
||||||
|
'undercloud_target_hash': 'current-tripleo',
|
||||||
|
'overcloud_deploy_release': 'master',
|
||||||
|
'overcloud_deploy_hash': 'current-tripleo',
|
||||||
|
'overcloud_target_release': 'master',
|
||||||
|
'overcloud_target_hash': 'current-tripleo',
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.parametrize('deleted_key', [
|
||||||
|
'undercloud_install_release',
|
||||||
|
'undercloud_install_hash',
|
||||||
|
'undercloud_target_release',
|
||||||
|
'undercloud_target_hash',
|
||||||
|
'overcloud_deploy_release',
|
||||||
|
'overcloud_deploy_hash',
|
||||||
|
'overcloud_target_release',
|
||||||
|
'overcloud_target_hash',
|
||||||
|
])
|
||||||
|
def test_missing_key_fails(releases_dictionary, deleted_key):
|
||||||
|
wrong_releases_dictionary = releases_dictionary.pop(deleted_key)
|
||||||
|
assert (not write_releases_dictionary_to_bash(wrong_releases_dictionary,
|
||||||
|
""))
|
||||||
|
|
||||||
|
|
||||||
|
@mock.patch(BUILTINS_OPEN, new_callable=mock_open)
|
||||||
|
def test_open_exception_fails(mock, releases_dictionary):
|
||||||
|
bash_script = '/foo/bar.sh'
|
||||||
|
mock.side_effect = IOError
|
||||||
|
assert (not write_releases_dictionary_to_bash(releases_dictionary,
|
||||||
|
bash_script))
|
||||||
|
|
||||||
|
|
||||||
|
@mock.patch(BUILTINS_OPEN, new_callable=mock_open)
|
||||||
|
def test_output_is_sourceable(mock, releases_dictionary):
|
||||||
|
bash_script = '/foo/bar.sh'
|
||||||
|
assert (write_releases_dictionary_to_bash(releases_dictionary,
|
||||||
|
bash_script))
|
||||||
|
mock.assert_called_once_with(bash_script, 'w')
|
||||||
|
handle = mock()
|
||||||
|
args, _ = handle.write.call_args
|
||||||
|
written_content = args[0]
|
||||||
|
# TODO: check environment variables
|
||||||
|
assert (0 == os.system(written_content))
|
Loading…
Reference in New Issue