Fix broken command prompt

Interactive editing of the command line was broken due to the usage of
$PROMPT_COMMAND. The cursor would often be placed at the wrong location
when editing history due to prompt length confusion. We already had the
OS_CLOUDNAME variable for this purpose, and I took the prompt setting
logic from what we previously used in tripleo-incubator:

http://git.openstack.org/cgit/openstack/tripleo-incubator/tree/cloudprompt

Change-Id: I85d6a2be597477ff74ba72ffa4c4aefc42c0df3c
Partial-Bug: #1673459
This commit is contained in:
James Slagle 2017-03-28 13:15:33 -04:00
parent 1273381062
commit 2d376f1367
3 changed files with 14 additions and 6 deletions

View File

@ -3,5 +3,5 @@ features:
- |
When sourcing the overcloudrc on the undercloud, the command prompt will
show that the credentials have been loaded by being preprended with
the overcloud stack name in all capital letters. For example,
'(OVERCLOUD) [stack@undercloud ~]$'
the overcloud stack name. For example,
'(overcloud) [stack@undercloud ~]$'

View File

@ -40,8 +40,7 @@ class OvercloudRcTest(base.TestCase):
self.assertIn("OS_PASSWORD=AdminPassword", result['overcloudrc.v3'])
self.assertNotIn("OS_IDENTITY_API_VERSION=3", result['overcloudrc'])
self.assertIn("OS_IDENTITY_API_VERSION=3", result['overcloudrc.v3'])
expected_prompt = 'export PROMPT_COMMAND="echo -n \'(OVERCAST) \'"'
self.assertIn(expected_prompt, result['overcloudrc'])
self.assertIn(expected_prompt, result['overcloudrc.v3'])
self.assertIn(overcloudrc.CLOUDPROMPT, result['overcloudrc'])
self.assertIn(overcloudrc.CLOUDPROMPT, result['overcloudrc.v3'])
self.assertIn("OS_AUTH_TYPE=password", result['overcloudrc'])
self.assertIn("OS_AUTH_TYPE=password", result['overcloudrc.v3'])

View File

@ -63,6 +63,14 @@ def bracket_ipv6(address):
CLEAR_ENV = """# Clear any old environment that may conflict.
for key in $( set | awk '{FS=\"=\"} /^OS_/ {print $1}' ); do unset $key ; done
"""
CLOUDPROMPT = """
# Add OS_CLOUDNAME to PS1
if [ -z "${CLOUDPROMPT_ENABLED:-}" ]; then
export PS1=${PS1:-""}
export PS1=\${OS_CLOUDNAME:+"(\$OS_CLOUDNAME)"}\ $PS1
export CLOUDPROMPT_ENABLED=1
fi
"""
def create_overcloudrc(stack, no_proxy, admin_password):
@ -79,7 +87,6 @@ def create_overcloudrc(stack, no_proxy, admin_password):
[no_proxy, overcloud_host, overcloud_admin_vip])
rc_params = {
'PROMPT_COMMAND': '"echo -n \'(%s) \'"' % stack.stack_name.upper(),
'NOVA_VERSION': '1.1',
'COMPUTE_API_VERSION': '1.1',
'OS_USERNAME': 'admin',
@ -100,6 +107,7 @@ def create_overcloudrc(stack, no_proxy, admin_password):
for key, value in rc_params.items():
line = "export %(key)s=%(value)s\n" % {'key': key, 'value': value}
overcloudrc = overcloudrc + line
overcloudrc = overcloudrc + CLOUDPROMPT
rc_params.update({
'OS_AUTH_URL': overcloud_endpoint.replace('/v2.0', '') + '/v3',
@ -112,6 +120,7 @@ def create_overcloudrc(stack, no_proxy, admin_password):
for key, value in rc_params.items():
line = "export %(key)s=%(value)s\n" % {'key': key, 'value': value}
overcloudrc_v3 = overcloudrc_v3 + line
overcloudrc_v3 = overcloudrc_v3 + CLOUDPROMPT
return {
"overcloudrc": overcloudrc,