Skip to content

Commit f9fd364

Browse files
committed
compute: Add missing options for 'server rebuild'
This accepts a large number of options that we weren't exposing. Add the following options: '--name', '--preserve-ephemeral', '--user-data', '--no-user-data', '--trusted-image-cert' and '--no-trusted-image-certs'. In addition, rename the '--key-unset' parameter to '--no-key-name', to mimic e.g. '--no-property' on other commands. Change-Id: I61c46e18bef1f086b62a015ebdc56be91071b826 Signed-off-by: Stephen Finucane <sfinucan@redhat.com>
1 parent 0edd055 commit f9fd364

3 files changed

Lines changed: 446 additions & 74 deletions

File tree

openstackclient/compute/v2/server.py

Lines changed: 143 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2445,10 +2445,15 @@ def get_parser(self, prog_name):
24452445
'Defaults to the currently used one.'
24462446
),
24472447
)
2448+
parser.add_argument(
2449+
'--name',
2450+
metavar='<name>',
2451+
help=_('Set the new name of the rebuilt server'),
2452+
)
24482453
parser.add_argument(
24492454
'--password',
24502455
metavar='<password>',
2451-
help=_('Set a password on the rebuilt server'),
2456+
help=_('Set the password on the rebuilt server'),
24522457
)
24532458
parser.add_argument(
24542459
'--property',
@@ -2467,6 +2472,24 @@ def get_parser(self, prog_name):
24672472
'(supported by --os-compute-api-version 2.19 or above)'
24682473
),
24692474
)
2475+
preserve_ephemeral_group = parser.add_mutually_exclusive_group()
2476+
preserve_ephemeral_group.add_argument(
2477+
'--preserve-ephemeral',
2478+
action='store_true',
2479+
default=None,
2480+
help=_(
2481+
'Preserve the default ephemeral storage partition on rebuild.'
2482+
),
2483+
)
2484+
preserve_ephemeral_group.add_argument(
2485+
'--no-preserve-ephemeral',
2486+
action='store_false',
2487+
dest='preserve_ephemeral',
2488+
help=_(
2489+
'Do not preserve the default ephemeral storage partition on '
2490+
'rebuild.'
2491+
),
2492+
)
24702493
key_group = parser.add_mutually_exclusive_group()
24712494
key_group.add_argument(
24722495
'--key-name',
@@ -2478,15 +2501,69 @@ def get_parser(self, prog_name):
24782501
),
24792502
)
24802503
key_group.add_argument(
2481-
'--key-unset',
2504+
'--no-key-name',
24822505
action='store_true',
2483-
default=False,
2506+
dest='no_key_name',
24842507
help=_(
24852508
'Unset the key name of key pair on the rebuilt server. '
24862509
'Cannot be specified with the --key-name option. '
24872510
'(supported by --os-compute-api-version 2.54 or above)'
24882511
),
24892512
)
2513+
# TODO(stephenfin): Remove this in a future major version bump
2514+
key_group.add_argument(
2515+
'--key-unset',
2516+
action='store_true',
2517+
dest='no_key_name',
2518+
help=argparse.SUPPRESS,
2519+
)
2520+
user_data_group = parser.add_mutually_exclusive_group()
2521+
user_data_group.add_argument(
2522+
'--user-data',
2523+
metavar='<user-data>',
2524+
help=_(
2525+
'Add a new user data file to the rebuilt server. '
2526+
'Cannot be specified with the --no-user-data option. '
2527+
'(supported by --os-compute-api-version 2.57 or above)'
2528+
),
2529+
)
2530+
user_data_group.add_argument(
2531+
'--no-user-data',
2532+
action='store_true',
2533+
default=False,
2534+
help=_(
2535+
'Remove existing user data when rebuilding server. '
2536+
'Cannot be specified with the --user-data option. '
2537+
'(supported by --os-compute-api-version 2.57 or above)'
2538+
),
2539+
)
2540+
trusted_certs_group = parser.add_mutually_exclusive_group()
2541+
trusted_certs_group.add_argument(
2542+
'--trusted-image-cert',
2543+
metavar='<trusted-cert-id>',
2544+
action='append',
2545+
dest='trusted_image_certs',
2546+
help=_(
2547+
'Trusted image certificate IDs used to validate certificates '
2548+
'during the image signature verification process. '
2549+
'Defaults to env[OS_TRUSTED_IMAGE_CERTIFICATE_IDS]. '
2550+
'May be specified multiple times to pass multiple trusted '
2551+
'image certificate IDs. '
2552+
'Cannot be specified with the --no-trusted-certs option. '
2553+
'(supported by --os-compute-api-version 2.63 or above)'
2554+
),
2555+
)
2556+
trusted_certs_group.add_argument(
2557+
'--no-trusted-image-certs',
2558+
action='store_true',
2559+
default=False,
2560+
help=_(
2561+
'Remove any existing trusted image certificates from the '
2562+
'server. '
2563+
'Cannot be specified with the --trusted-certs option. '
2564+
'(supported by --os-compute-api-version 2.63 or above)'
2565+
),
2566+
)
24902567
parser.add_argument(
24912568
'--wait',
24922569
action='store_true',
@@ -2517,11 +2594,17 @@ def _show_progress(progress):
25172594

25182595
kwargs = {}
25192596

2597+
if parsed_args.name is not None:
2598+
kwargs['name'] = parsed_args.name
2599+
2600+
if parsed_args.preserve_ephemeral is not None:
2601+
kwargs['preserve_ephemeral'] = parsed_args.preserve_ephemeral
2602+
25202603
if parsed_args.property:
25212604
kwargs['meta'] = parsed_args.property
25222605

25232606
if parsed_args.description:
2524-
if server.api_version < api_versions.APIVersion("2.19"):
2607+
if compute_client.api_version < api_versions.APIVersion('2.19'):
25252608
msg = _(
25262609
'--os-compute-api-version 2.19 or greater is required to '
25272610
'support the --description option'
@@ -2539,7 +2622,7 @@ def _show_progress(progress):
25392622
raise exceptions.CommandError(msg)
25402623

25412624
kwargs['key_name'] = parsed_args.key_name
2542-
elif parsed_args.key_unset:
2625+
elif parsed_args.no_key_name:
25432626
if compute_client.api_version < api_versions.APIVersion('2.54'):
25442627
msg = _(
25452628
'--os-compute-api-version 2.54 or greater is required to '
@@ -2549,7 +2632,61 @@ def _show_progress(progress):
25492632

25502633
kwargs['key_name'] = None
25512634

2552-
server = server.rebuild(image, parsed_args.password, **kwargs)
2635+
userdata = None
2636+
if parsed_args.user_data:
2637+
if compute_client.api_version < api_versions.APIVersion('2.54'):
2638+
msg = _(
2639+
'--os-compute-api-version 2.54 or greater is required to '
2640+
'support the --user-data option'
2641+
)
2642+
raise exceptions.CommandError(msg)
2643+
2644+
try:
2645+
userdata = io.open(parsed_args.user_data)
2646+
except IOError as e:
2647+
msg = _("Can't open '%(data)s': %(exception)s")
2648+
raise exceptions.CommandError(
2649+
msg % {'data': parsed_args.user_data, 'exception': e}
2650+
)
2651+
2652+
kwargs['userdata'] = userdata
2653+
elif parsed_args.no_user_data:
2654+
if compute_client.api_version < api_versions.APIVersion('2.54'):
2655+
msg = _(
2656+
'--os-compute-api-version 2.54 or greater is required to '
2657+
'support the --no-user-data option'
2658+
)
2659+
raise exceptions.CommandError(msg)
2660+
2661+
kwargs['userdata'] = None
2662+
2663+
# TODO(stephenfin): Handle OS_TRUSTED_IMAGE_CERTIFICATE_IDS
2664+
if parsed_args.trusted_image_certs:
2665+
if compute_client.api_version < api_versions.APIVersion('2.63'):
2666+
msg = _(
2667+
'--os-compute-api-version 2.63 or greater is required to '
2668+
'support the --trusted-certs option'
2669+
)
2670+
raise exceptions.CommandError(msg)
2671+
2672+
certs = parsed_args.trusted_image_certs
2673+
kwargs['trusted_image_certificates'] = certs
2674+
elif parsed_args.no_trusted_image_certs:
2675+
if compute_client.api_version < api_versions.APIVersion('2.63'):
2676+
msg = _(
2677+
'--os-compute-api-version 2.63 or greater is required to '
2678+
'support the --no-trusted-certs option'
2679+
)
2680+
raise exceptions.CommandError(msg)
2681+
2682+
kwargs['trusted_image_certificates'] = None
2683+
2684+
try:
2685+
server = server.rebuild(image, parsed_args.password, **kwargs)
2686+
finally:
2687+
if userdata and hasattr(userdata, 'close'):
2688+
userdata.close()
2689+
25532690
if parsed_args.wait:
25542691
if utils.wait_for_status(
25552692
compute_client.servers.get,

0 commit comments

Comments
 (0)