@@ -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