@@ -2453,10 +2453,15 @@ def get_parser(self, prog_name):
24532453 'Defaults to the currently used one.'
24542454 ),
24552455 )
2456+ parser .add_argument (
2457+ '--name' ,
2458+ metavar = '<name>' ,
2459+ help = _ ('Set the new name of the rebuilt server' ),
2460+ )
24562461 parser .add_argument (
24572462 '--password' ,
24582463 metavar = '<password>' ,
2459- help = _ ('Set a password on the rebuilt server' ),
2464+ help = _ ('Set the password on the rebuilt server' ),
24602465 )
24612466 parser .add_argument (
24622467 '--property' ,
@@ -2475,6 +2480,24 @@ def get_parser(self, prog_name):
24752480 '(supported by --os-compute-api-version 2.19 or above)'
24762481 ),
24772482 )
2483+ preserve_ephemeral_group = parser .add_mutually_exclusive_group ()
2484+ preserve_ephemeral_group .add_argument (
2485+ '--preserve-ephemeral' ,
2486+ action = 'store_true' ,
2487+ default = None ,
2488+ help = _ (
2489+ 'Preserve the default ephemeral storage partition on rebuild.'
2490+ ),
2491+ )
2492+ preserve_ephemeral_group .add_argument (
2493+ '--no-preserve-ephemeral' ,
2494+ action = 'store_false' ,
2495+ dest = 'preserve_ephemeral' ,
2496+ help = _ (
2497+ 'Do not preserve the default ephemeral storage partition on '
2498+ 'rebuild.'
2499+ ),
2500+ )
24782501 key_group = parser .add_mutually_exclusive_group ()
24792502 key_group .add_argument (
24802503 '--key-name' ,
@@ -2486,15 +2509,69 @@ def get_parser(self, prog_name):
24862509 ),
24872510 )
24882511 key_group .add_argument (
2489- '--key-unset ' ,
2512+ '--no- key-name ' ,
24902513 action = 'store_true' ,
2491- default = False ,
2514+ dest = 'no_key_name' ,
24922515 help = _ (
24932516 'Unset the key name of key pair on the rebuilt server. '
24942517 'Cannot be specified with the --key-name option. '
24952518 '(supported by --os-compute-api-version 2.54 or above)'
24962519 ),
24972520 )
2521+ # TODO(stephenfin): Remove this in a future major version bump
2522+ key_group .add_argument (
2523+ '--key-unset' ,
2524+ action = 'store_true' ,
2525+ dest = 'no_key_name' ,
2526+ help = argparse .SUPPRESS ,
2527+ )
2528+ user_data_group = parser .add_mutually_exclusive_group ()
2529+ user_data_group .add_argument (
2530+ '--user-data' ,
2531+ metavar = '<user-data>' ,
2532+ help = _ (
2533+ 'Add a new user data file to the rebuilt server. '
2534+ 'Cannot be specified with the --no-user-data option. '
2535+ '(supported by --os-compute-api-version 2.57 or above)'
2536+ ),
2537+ )
2538+ user_data_group .add_argument (
2539+ '--no-user-data' ,
2540+ action = 'store_true' ,
2541+ default = False ,
2542+ help = _ (
2543+ 'Remove existing user data when rebuilding server. '
2544+ 'Cannot be specified with the --user-data option. '
2545+ '(supported by --os-compute-api-version 2.57 or above)'
2546+ ),
2547+ )
2548+ trusted_certs_group = parser .add_mutually_exclusive_group ()
2549+ trusted_certs_group .add_argument (
2550+ '--trusted-image-cert' ,
2551+ metavar = '<trusted-cert-id>' ,
2552+ action = 'append' ,
2553+ dest = 'trusted_image_certs' ,
2554+ help = _ (
2555+ 'Trusted image certificate IDs used to validate certificates '
2556+ 'during the image signature verification process. '
2557+ 'Defaults to env[OS_TRUSTED_IMAGE_CERTIFICATE_IDS]. '
2558+ 'May be specified multiple times to pass multiple trusted '
2559+ 'image certificate IDs. '
2560+ 'Cannot be specified with the --no-trusted-certs option. '
2561+ '(supported by --os-compute-api-version 2.63 or above)'
2562+ ),
2563+ )
2564+ trusted_certs_group .add_argument (
2565+ '--no-trusted-image-certs' ,
2566+ action = 'store_true' ,
2567+ default = False ,
2568+ help = _ (
2569+ 'Remove any existing trusted image certificates from the '
2570+ 'server. '
2571+ 'Cannot be specified with the --trusted-certs option. '
2572+ '(supported by --os-compute-api-version 2.63 or above)'
2573+ ),
2574+ )
24982575 parser .add_argument (
24992576 '--wait' ,
25002577 action = 'store_true' ,
@@ -2525,11 +2602,17 @@ def _show_progress(progress):
25252602
25262603 kwargs = {}
25272604
2605+ if parsed_args .name is not None :
2606+ kwargs ['name' ] = parsed_args .name
2607+
2608+ if parsed_args .preserve_ephemeral is not None :
2609+ kwargs ['preserve_ephemeral' ] = parsed_args .preserve_ephemeral
2610+
25282611 if parsed_args .property :
25292612 kwargs ['meta' ] = parsed_args .property
25302613
25312614 if parsed_args .description :
2532- if server .api_version < api_versions .APIVersion (" 2.19" ):
2615+ if compute_client .api_version < api_versions .APIVersion (' 2.19' ):
25332616 msg = _ (
25342617 '--os-compute-api-version 2.19 or greater is required to '
25352618 'support the --description option'
@@ -2547,7 +2630,7 @@ def _show_progress(progress):
25472630 raise exceptions .CommandError (msg )
25482631
25492632 kwargs ['key_name' ] = parsed_args .key_name
2550- elif parsed_args .key_unset :
2633+ elif parsed_args .no_key_name :
25512634 if compute_client .api_version < api_versions .APIVersion ('2.54' ):
25522635 msg = _ (
25532636 '--os-compute-api-version 2.54 or greater is required to '
@@ -2557,7 +2640,61 @@ def _show_progress(progress):
25572640
25582641 kwargs ['key_name' ] = None
25592642
2560- server = server .rebuild (image , parsed_args .password , ** kwargs )
2643+ userdata = None
2644+ if parsed_args .user_data :
2645+ if compute_client .api_version < api_versions .APIVersion ('2.54' ):
2646+ msg = _ (
2647+ '--os-compute-api-version 2.54 or greater is required to '
2648+ 'support the --user-data option'
2649+ )
2650+ raise exceptions .CommandError (msg )
2651+
2652+ try :
2653+ userdata = io .open (parsed_args .user_data )
2654+ except IOError as e :
2655+ msg = _ ("Can't open '%(data)s': %(exception)s" )
2656+ raise exceptions .CommandError (
2657+ msg % {'data' : parsed_args .user_data , 'exception' : e }
2658+ )
2659+
2660+ kwargs ['userdata' ] = userdata
2661+ elif parsed_args .no_user_data :
2662+ if compute_client .api_version < api_versions .APIVersion ('2.54' ):
2663+ msg = _ (
2664+ '--os-compute-api-version 2.54 or greater is required to '
2665+ 'support the --no-user-data option'
2666+ )
2667+ raise exceptions .CommandError (msg )
2668+
2669+ kwargs ['userdata' ] = None
2670+
2671+ # TODO(stephenfin): Handle OS_TRUSTED_IMAGE_CERTIFICATE_IDS
2672+ if parsed_args .trusted_image_certs :
2673+ if compute_client .api_version < api_versions .APIVersion ('2.63' ):
2674+ msg = _ (
2675+ '--os-compute-api-version 2.63 or greater is required to '
2676+ 'support the --trusted-certs option'
2677+ )
2678+ raise exceptions .CommandError (msg )
2679+
2680+ certs = parsed_args .trusted_image_certs
2681+ kwargs ['trusted_image_certificates' ] = certs
2682+ elif parsed_args .no_trusted_image_certs :
2683+ if compute_client .api_version < api_versions .APIVersion ('2.63' ):
2684+ msg = _ (
2685+ '--os-compute-api-version 2.63 or greater is required to '
2686+ 'support the --no-trusted-certs option'
2687+ )
2688+ raise exceptions .CommandError (msg )
2689+
2690+ kwargs ['trusted_image_certificates' ] = None
2691+
2692+ try :
2693+ server = server .rebuild (image , parsed_args .password , ** kwargs )
2694+ finally :
2695+ if userdata and hasattr (userdata , 'close' ):
2696+ userdata .close ()
2697+
25612698 if parsed_args .wait :
25622699 if utils .wait_for_status (
25632700 compute_client .servers .get ,
0 commit comments