AMBARI-20532 Ambari-server CLI to setup Database Options Broken (dsen)
Project: http://git-wip-us.apache.org/repos/asf/ambari/repo Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/772be786 Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/772be786 Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/772be786 Branch: refs/heads/branch-feature-AMBARI-14714 Commit: 772be786d930322e4a95e4755c36ffece24d30e4 Parents: 735c413 Author: Dmytro Sen <[email protected]> Authored: Wed May 17 19:07:44 2017 +0300 Committer: Dmytro Sen <[email protected]> Committed: Wed May 17 19:07:44 2017 +0300 ---------------------------------------------------------------------- ambari-server/src/main/python/ambari-server.py | 299 ++++++++------ .../main/python/ambari_server/setupMpacks.py | 7 +- .../src/test/python/TestAmbariServer.py | 409 ++++++++++--------- 3 files changed, 389 insertions(+), 326 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/ambari/blob/772be786/ambari-server/src/main/python/ambari-server.py ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/python/ambari-server.py b/ambari-server/src/main/python/ambari-server.py index 737be6a..4f680cb 100755 --- a/ambari-server/src/main/python/ambari-server.py +++ b/ambari-server/src/main/python/ambari-server.py @@ -367,7 +367,7 @@ def print_action_arguments_help(action): ";".join([print_opt for print_opt, _ in optional_options])) @OsFamilyFuncImpl(OSConst.WINSRV_FAMILY) -def init_parser_options(parser): +def init_action_parser(action, parser): parser.add_option('-k', '--service-user-name', dest="svc_user", default=None, help="User account under which the Ambari Server service will run") @@ -455,31 +455,58 @@ def init_parser_options(parser): # -h reserved for help @OsFamilyFuncImpl(OsFamilyImpl.DEFAULT) -def init_parser_options(parser): - parser.add_option('-f', '--init-script-file', default=None, - help="File with setup script") - parser.add_option('-r', '--drop-script-file', default=None, - help="File with drop script") - parser.add_option('-u', '--upgrade-script-file', default=AmbariPath.get("/var/lib/" - "ambari-server/resources/upgrade/ddl/" - "Ambari-DDL-Postgres-UPGRADE-1.3.0.sql"), - help="File with upgrade script") - parser.add_option('-t', '--upgrade-stack-script-file', default=AmbariPath.get("/var/lib/" - "ambari-server/resources/upgrade/dml/" - "Ambari-DML-Postgres-UPGRADE_STACK.sql"), - help="File with stack upgrade script") - parser.add_option('-j', '--java-home', default=None, - help="Use specified java_home. Must be valid on all hosts") - parser.add_option("-v", "--verbose", - action="store_true", dest="verbose", default=False, - help="Print verbose status messages") - parser.add_option("-s", "--silent", - action="store_true", dest="silent", default=False, - help="Silently accepts default prompt values. For db-cleanup command, silent mode will stop ambari server.") +def init_setup_parser_options(parser): + database_group = optparse.OptionGroup(parser, 'Database options (command need to include all options)') + database_group.add_option('--database', default=None, help="Database to use embedded|oracle|mysql|mssql|postgres|sqlanywhere", dest="dbms") + database_group.add_option('--databasehost', default=None, help="Hostname of database server", dest="database_host") + database_group.add_option('--databaseport', default=None, help="Database port", dest="database_port") + database_group.add_option('--databasename', default=None, help="Database/Service name or ServiceID", + dest="database_name") + database_group.add_option('--databaseusername', default=None, help="Database user login", dest="database_username") + database_group.add_option('--databasepassword', default=None, help="Database user password", dest="database_password") + parser.add_option_group(database_group) + + jdbc_group = optparse.OptionGroup(parser, 'JDBC options (command need to include all options)') + jdbc_group.add_option('--jdbc-driver', default=None, help="Specifies the path to the JDBC driver JAR file or archive " \ + "with all required files(jdbc jar, libraries and etc), for the " \ + "database type specified with the --jdbc-db option. " \ + "Used only with --jdbc-db option. Archive is supported only for" \ + " sqlanywhere database." , + dest="jdbc_driver") + jdbc_group.add_option('--jdbc-db', default=None, help="Specifies the database type [postgres|mysql|mssql|oracle|hsqldb|sqlanywhere] for the " \ + "JDBC driver specified with the --jdbc-driver option. Used only with --jdbc-driver option.", + dest="jdbc_db") + parser.add_option_group(jdbc_group) + + other_group = optparse.OptionGroup(parser, 'Other options') + + other_group.add_option('-j', '--java-home', default=None, + help="Use specified java_home. Must be valid on all hosts") + other_group.add_option('--skip-view-extraction', action="store_true", default=False, help="Skip extraction of system views", dest="skip_view_extraction") + other_group.add_option('--postgresschema', default=None, help="Postgres database schema name", + dest="postgres_schema") + other_group.add_option('--sqla-server-name', default=None, help="SQL Anywhere server name", dest="sqla_server_name") + other_group.add_option('--sidorsname', default="sname", help="Oracle database identifier type, Service ID/Service " + "Name sid|sname", dest="sid_or_sname") + + parser.add_option_group(other_group) + +@OsFamilyFuncImpl(OsFamilyImpl.DEFAULT) +def init_start_parser_options(parser): parser.add_option('-g', '--debug', action="store_true", dest='debug', default=False, help="Start ambari-server in debug mode") parser.add_option('-y', '--suspend-start', action="store_true", dest='suspend_start', default=False, help="Freeze ambari-server Java process at startup in debug mode") + parser.add_option('--skip-properties-validation', action="store_true", default=False, help="Skip properties file validation", dest="skip_properties_validation") + parser.add_option('--skip-database-check', action="store_true", default=False, help="Skip database consistency check", dest="skip_database_check") + parser.add_option('--auto-fix-database', action="store_true", default=False, help="Automatically fix database consistency issues", dest="fix_database_consistency") + +@OsFamilyFuncImpl(OsFamilyImpl.DEFAULT) +def init_empty_parser_options(parser): + pass + +@OsFamilyFuncImpl(OsFamilyImpl.DEFAULT) +def init_ldap_sync_parser_options(parser): parser.add_option('--all', action="store_true", default=False, help="LDAP sync all option. Synchronize all LDAP users and groups.", dest="ldap_sync_all") parser.add_option('--existing', action="store_true", default=False, @@ -488,79 +515,11 @@ def init_parser_options(parser): dest="ldap_sync_users") parser.add_option('--groups', default=None, help="LDAP sync groups option. Specifies the path to a CSV file of group names to be synchronized.", dest="ldap_sync_groups") - parser.add_option('--database', default=None, help="Database to use embedded|oracle|mysql|mssql|postgres|sqlanywhere", dest="dbms") - parser.add_option('--databasehost', default=None, help="Hostname of database server", dest="database_host") - parser.add_option('--databaseport', default=None, help="Database port", dest="database_port") - parser.add_option('--databasename', default=None, help="Database/Service name or ServiceID", - dest="database_name") - parser.add_option('--postgresschema', default=None, help="Postgres database schema name", - dest="postgres_schema") - parser.add_option('--databaseusername', default=None, help="Database user login", dest="database_username") - parser.add_option('--databasepassword', default=None, help="Database user password", dest="database_password") - parser.add_option('--sidorsname', default="sname", help="Oracle database identifier type, Service ID/Service " - "Name sid|sname", dest="sid_or_sname") - parser.add_option('--sqla-server-name', default=None, help="SQL Anywhere server name", dest="sqla_server_name") - parser.add_option('--jdbc-driver', default=None, help="Specifies the path to the JDBC driver JAR file or archive " \ - "with all required files(jdbc jar, libraries and etc), for the " \ - "database type specified with the --jdbc-db option. " \ - "Used only with --jdbc-db option. Archive is supported only for" \ - " sqlanywhere database." , - dest="jdbc_driver") - parser.add_option('--jdbc-db', default=None, help="Specifies the database type [postgres|mysql|mssql|oracle|hsqldb|sqlanywhere] for the " \ - "JDBC driver specified with the --jdbc-driver option. Used only with --jdbc-driver option.", - dest="jdbc_db") - parser.add_option('--cluster-name', default=None, help="Cluster name", dest="cluster_name") - parser.add_option('--version-display-name', default=None, help="Display name of desired repo version", dest="desired_repo_version") - parser.add_option('--skip-properties-validation', action="store_true", default=False, help="Skip properties file validation", dest="skip_properties_validation") - parser.add_option('--skip-database-check', action="store_true", default=False, help="Skip database consistency check", dest="skip_database_check") - parser.add_option('--skip-view-extraction', action="store_true", default=False, help="Skip extraction of system views", dest="skip_view_extraction") - parser.add_option('--auto-fix-database', action="store_true", default=False, help="Automatically fix database consistency issues", dest="fix_database_consistency") - parser.add_option('--force-version', action="store_true", default=False, help="Force version to current", dest="force_repo_version") - parser.add_option('--version', dest="stack_versions", default=None, action="append", type="string", - help="Specify stack version that needs to be enabled. All other stacks versions will be disabled") - parser.add_option('--stack', dest="stack_name", default=None, type="string", - help="Specify stack name for the stack versions that needs to be enabled") - parser.add_option("-d", "--from-date", dest="cleanup_from_date", default=None, type="string", help="Specify date for the cleanup process in 'yyyy-MM-dd' format") - add_parser_options('--mpack', - default=None, - help="Specify the path for management pack to be installed/upgraded", - dest="mpack_path", - parser=parser, - required_for_actions=[INSTALL_MPACK_ACTION, UPGRADE_MPACK_ACTION] - ) - add_parser_options('--mpack-name', - default=None, - help="Specify the management pack name to be uninstalled", - dest="mpack_name", - parser=parser, - required_for_actions=[UNINSTALL_MPACK_ACTION] - ) - add_parser_options('--purge', - action="store_true", - default=False, - help="Purge existing resources specified in purge-list", - dest="purge", - parser=parser, - optional_for_actions=[INSTALL_MPACK_ACTION] - ) - purge_resources = ",".join([STACK_DEFINITIONS_RESOURCE_NAME, SERVICE_DEFINITIONS_RESOURCE_NAME, MPACKS_RESOURCE_NAME]) - default_purge_resources = ",".join([STACK_DEFINITIONS_RESOURCE_NAME, MPACKS_RESOURCE_NAME]) - add_parser_options('--purge-list', - default=default_purge_resources, - help="Comma separated list of resources to purge ({0}). By default ({1}) will be purged.".format(purge_resources, default_purge_resources), - dest="purge_list", - parser=parser, - optional_for_actions=[INSTALL_MPACK_ACTION] - ) - add_parser_options('--force', - action="store_true", - default=False, - help="Force install management pack", - dest="force", - parser=parser, - optional_for_actions=[INSTALL_MPACK_ACTION] - ) + parser.add_option('--ldap-sync-admin-name', default=None, help="Username for LDAP sync", dest="ldap_sync_admin_name") + parser.add_option('--ldap-sync-admin-password', default=None, help="Password for LDAP sync", dest="ldap_sync_admin_password") +@OsFamilyFuncImpl(OsFamilyImpl.DEFAULT) +def init_ldap_setup_parser_options(parser): parser.add_option('--ldap-url', default=None, help="Primary url for LDAP", dest="ldap_url") parser.add_option('--ldap-secondary-url', default=None, help="Secondary url for LDAP", dest="ldap_secondary_url") parser.add_option('--ldap-ssl', default=None, help="Use SSL [true/false] for LDAP", dest="ldap_ssl") @@ -576,29 +535,83 @@ def init_parser_options(parser): parser.add_option('--ldap-save-settings', action="store_true", default=None, help="Save without review for LDAP", dest="ldap_save_settings") parser.add_option('--ldap-referral', default=None, help="Referral method [follow/ignore] for LDAP", dest="ldap_referral") parser.add_option('--ldap-bind-anonym', default=None, help="Bind anonymously [true/false] for LDAP", dest="ldap_bind_anonym") - parser.add_option('--ldap-sync-admin-name', default=None, help="Username for LDAP sync", dest="ldap_sync_admin_name") - parser.add_option('--ldap-sync-admin-password', default=None, help="Password for LDAP sync", dest="ldap_sync_admin_password") parser.add_option('--ldap-sync-username-collisions-behavior', default=None, help="Handling behavior for username collisions [convert/skip] for LDAP sync", dest="ldap_sync_username_collisions_behavior") - parser.add_option('--truststore-type', default=None, help="Type of TrustStore (jks|jceks|pkcs12)", dest="trust_store_type") - parser.add_option('--truststore-path', default=None, help="Path of TrustStore", dest="trust_store_path") - parser.add_option('--truststore-password', default=None, help="Password for TrustStore", dest="trust_store_password") - parser.add_option('--truststore-reconfigure', action="store_true", default=None, help="Force to reconfigure TrustStore if exits", dest="trust_store_reconfigure") +@OsFamilyFuncImpl(OsFamilyImpl.DEFAULT) +def init_set_current_parser_options(parser): + parser.add_option('--cluster-name', default=None, help="Cluster name", dest="cluster_name") + parser.add_option('--version-display-name', default=None, help="Display name of desired repo version", dest="desired_repo_version") + parser.add_option('--force-version', action="store_true", default=False, help="Force version to current", dest="force_repo_version") +@OsFamilyFuncImpl(OsFamilyImpl.DEFAULT) +def init_setup_security_parser_options(parser): parser.add_option('--security-option', default=None, help="Setup security option (setup-https|encrypt-password|setup-kerberos-jaas|setup-truststore|import-certificate)", dest="security_option") - parser.add_option('--api-ssl', default=None, help="Enable SSL for Ambari API [true/false]", dest="api_ssl") - parser.add_option('--api-ssl-port', default=None, help="Client API SSL port", dest="api_ssl_port") - parser.add_option('--import-cert-path', default=None, help="Path to Certificate (import)", dest="import_cert_path") - parser.add_option('--import-cert-alias', default=None, help="Alias for the imported certificate", dest="import_cert_alias") - parser.add_option('--import-key-path', default=None, help="Path to Private Key (import)", dest="import_key_path") - parser.add_option('--pem-password', default=None, help="Password for Private Key", dest="pem_password") - parser.add_option('--master-key', default=None, help="Master key for encrypting passwords", dest="master_key") - parser.add_option('--master-key-persist', default=None, help="Persist master key [true/false]", dest="master_key_persist") - parser.add_option('--jaas-principal', default=None, help="Kerberos principal for ambari server", dest="jaas_principal") - parser.add_option('--jaas-keytab', default=None, help="Keytab path for Kerberos principal", dest="jaas_keytab") + https_group = optparse.OptionGroup(parser, "setup-https options") + https_group.add_option('--api-ssl', default=None, help="Enable SSL for Ambari API [true/false]", dest="api_ssl") + https_group.add_option('--api-ssl-port', default=None, help="Client API SSL port", dest="api_ssl_port") + https_group.add_option('--import-key-path', default=None, help="Path to Private Key (import)", dest="import_key_path") + https_group.add_option('--pem-password', default=None, help="Password for Private Key", dest="pem_password") + parser.add_option_group(https_group) + + encrypt_passwords_group = optparse.OptionGroup(parser, "encrypt-passwords options") + encrypt_passwords_group.add_option('--master-key', default=None, help="Master key for encrypting passwords", dest="master_key") + encrypt_passwords_group.add_option('--master-key-persist', default=None, help="Persist master key [true/false]", dest="master_key_persist") + parser.add_option_group(encrypt_passwords_group) + + setup_kerberos_jaas_group = optparse.OptionGroup(parser, "setup-kerberos-jaas options") + setup_kerberos_jaas_group.add_option('--jaas-principal', default=None, help="Kerberos principal for ambari server", dest="jaas_principal") + setup_kerberos_jaas_group.add_option('--jaas-keytab', default=None, help="Keytab path for Kerberos principal", dest="jaas_keytab") + parser.add_option_group(setup_kerberos_jaas_group) + + setup_truststore_group = optparse.OptionGroup(parser, "setup-truststore options, uses encrypt-passwords options if configured") + setup_truststore_group.add_option('--truststore-type', default=None, help="Type of TrustStore (jks|jceks|pkcs12)", dest="trust_store_type") + setup_truststore_group.add_option('--truststore-path', default=None, help="Path of TrustStore", dest="trust_store_path") + setup_truststore_group.add_option('--truststore-password', default=None, help="Password for TrustStore", dest="trust_store_password") + setup_truststore_group.add_option('--truststore-reconfigure', action="store_true", default=None, help="Force to reconfigure TrustStore if exits", dest="trust_store_reconfigure") + parser.add_option_group(setup_truststore_group) + + import_certificate_group = optparse.OptionGroup(parser, "import-certificate options, uses --truststore-path option") + import_certificate_group.add_option('--import-cert-path', default=None, help="Path to Certificate (import)", dest="import_cert_path") + import_certificate_group.add_option('--import-cert-alias', default=None, help="Alias for the imported certificate", dest="import_cert_alias") + parser.add_option_group(import_certificate_group) + +@OsFamilyFuncImpl(OsFamilyImpl.DEFAULT) +def init_enable_stack_parser_options(parser): + parser.add_option('--version', dest="stack_versions", default=None, action="append", type="string", + help="Specify stack version that needs to be enabled. All other stacks versions will be disabled") + parser.add_option('--stack', dest="stack_name", default=None, type="string", + help="Specify stack name for the stack versions that needs to be enabled") + +@OsFamilyFuncImpl(OsFamilyImpl.DEFAULT) +def init_db_cleanup_parser_options(parser): + parser.add_option('--cluster-name', default=None, help="Cluster name", dest="cluster_name") + parser.add_option("-d", "--from-date", dest="cleanup_from_date", default=None, type="string", help="Specify date for the cleanup process in 'yyyy-MM-dd' format") + +@OsFamilyFuncImpl(OsFamilyImpl.DEFAULT) +def init_install_mpack_parser_options(parser): + parser.add_option('--mpack', default=None, help="Specify the path for management pack to be installed", dest="mpack_path") + parser.add_option('--purge', action="store_true", default=False, help="Purge existing resources specified in purge-list", dest="purge") + purge_resources = ",".join([STACK_DEFINITIONS_RESOURCE_NAME, SERVICE_DEFINITIONS_RESOURCE_NAME, MPACKS_RESOURCE_NAME]) + default_purge_resources = ",".join([STACK_DEFINITIONS_RESOURCE_NAME, MPACKS_RESOURCE_NAME]) + + parser.add_option('--purge-list', default=default_purge_resources, + help="Comma separated list of resources to purge ({0}). By default ({1}) will be purged.".format(purge_resources, default_purge_resources), + dest="purge_list") + parser.add_option('--force', action="store_true", default=False, help="Force install management pack", dest="force") + +@OsFamilyFuncImpl(OsFamilyImpl.DEFAULT) +def init_uninstall_mpack_parser_options(parser): + parser.add_option('--mpack-name', default=None, help="Specify the management pack name to be uninstalled", dest="mpack_name") + +@OsFamilyFuncImpl(OsFamilyImpl.DEFAULT) +def init_upgrade_mpack_parser_options(parser): + parser.add_option('--mpack', default=None, help="Specify the path for management pack to be updated", dest="mpack_path") + +@OsFamilyFuncImpl(OsFamilyImpl.DEFAULT) +def init_kerberos_setup_parser_options(parser): parser.add_option('--kerberos-setup', default=None, help="Setup Kerberos Authentication", dest="kerberos_setup") parser.add_option('--kerberos-enabled', default=False, help="Kerberos enabled", dest="kerberos_enabled") parser.add_option('--kerberos-spnego-principal', default="HTTP/_HOST", help="Kerberos SPNEGO principal", dest="kerberos_spnego_principal") @@ -774,6 +787,46 @@ def create_user_action_map(args, options): } return action_map +@OsFamilyFuncImpl(OsFamilyImpl.DEFAULT) +def init_action_parser(action, parser): + action_parser_map = { + SETUP_ACTION: init_setup_parser_options, + SETUP_JCE_ACTION: init_empty_parser_options, + START_ACTION: init_start_parser_options, + STOP_ACTION: init_empty_parser_options, + RESTART_ACTION: init_start_parser_options, + RESET_ACTION: init_empty_parser_options, + STATUS_ACTION: init_empty_parser_options, + UPGRADE_ACTION: init_empty_parser_options, + UPGRADE_STACK_ACTION:init_empty_parser_options, + LDAP_SETUP_ACTION: init_ldap_setup_parser_options, + LDAP_SYNC_ACTION: init_ldap_sync_parser_options, + SET_CURRENT_ACTION: init_set_current_parser_options, + SETUP_SECURITY_ACTION: init_setup_security_parser_options, + REFRESH_STACK_HASH_ACTION: init_empty_parser_options, + BACKUP_ACTION: init_empty_parser_options, + RESTORE_ACTION: init_empty_parser_options, + UPDATE_HOST_NAMES_ACTION: init_empty_parser_options, + CHECK_DATABASE_ACTION: init_empty_parser_options, + ENABLE_STACK_ACTION: init_enable_stack_parser_options, + SETUP_SSO_ACTION: init_empty_parser_options, + DB_CLEANUP_ACTION: init_db_cleanup_parser_options, + INSTALL_MPACK_ACTION: init_install_mpack_parser_options, + UNINSTALL_MPACK_ACTION: init_uninstall_mpack_parser_options, + UPGRADE_MPACK_ACTION: init_upgrade_mpack_parser_options, + PAM_SETUP_ACTION: init_empty_parser_options, + KERBEROS_SETUP_ACTION: init_kerberos_setup_parser_options, + } + parser.add_option("-v", "--verbose", + action="store_true", dest="verbose", default=False, + help="Print verbose status messages") + parser.add_option("-s", "--silent", + action="store_true", dest="silent", default=False, + help="Silently accepts default prompt values. For db-cleanup command, silent mode will stop ambari server.") + try: + action_parser_map[action](parser) + except KeyError: + parser.error("Invalid action: " + action) def setup_logging(logger, filename, logging_level): formatter = logging.Formatter(formatstr) @@ -825,16 +878,6 @@ def main(options, args, parser): options.warnings = [] - if are_cmd_line_db_args_blank(options): - options.must_set_database_options = True - elif not are_cmd_line_db_args_valid(options): - parser.error('All database options should be set. Please see help for the options.') - else: - options.must_set_database_options = False - - #correct database - fix_database_options(options, parser) - if len(args) == 0: print parser.print_help() parser.error("No action entered") @@ -848,6 +891,17 @@ def main(options, args, parser): except KeyError: parser.error("Invalid action: " + action) + if action == SETUP_ACTION: + if are_cmd_line_db_args_blank(options): + options.must_set_database_options = True + elif not are_cmd_line_db_args_valid(options): + parser.error('All database options should be set. Please see help for the options.') + else: + options.must_set_database_options = False + + #correct database + fix_database_options(options, parser) + matches = 0 for args_number_required in action_obj.possible_args_numbers: matches += int(len(args) == args_number_required) @@ -900,8 +954,9 @@ def main(options, args, parser): sys.exit(options.exit_code) def mainBody(): - parser = optparse.OptionParser(usage="usage: %prog [options] action [stack_id os]",) - init_parser_options(parser) + parser = optparse.OptionParser(usage="usage: %prog action [options]",) + action = sys.argv[1] + init_action_parser(action, parser) (options, args) = parser.parse_args() # check if only silent key set http://git-wip-us.apache.org/repos/asf/ambari/blob/772be786/ambari-server/src/main/python/ambari_server/setupMpacks.py ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/python/ambari_server/setupMpacks.py b/ambari-server/src/main/python/ambari_server/setupMpacks.py index aaf9c10..625e428 100755 --- a/ambari-server/src/main/python/ambari_server/setupMpacks.py +++ b/ambari-server/src/main/python/ambari_server/setupMpacks.py @@ -714,7 +714,7 @@ def _install_mpack(options, replay_mode=False, is_upgrade=False): _execute_hook(mpack_metadata, BEFORE_INSTALL_HOOK_NAME, tmp_root_dir) # Purge previously installed stacks and management packs - if options.purge and options.purge_list: + if not is_upgrade and options.purge and options.purge_list: purge_resources = options.purge_list.split(",") validate_purge(options, purge_resources, tmp_root_dir, mpack_metadata, replay_mode) purge_stacks_and_mpacks(purge_resources, replay_mode) @@ -934,9 +934,6 @@ def upgrade_mpack(options, replay_mode=False): """ logger.info("Upgrade mpack.") mpack_path = options.mpack_path - if options.purge: - print_error_msg("Purge is not supported with upgrade_mpack action!") - raise FatalException(-1, "Purge is not supported with upgrade_mpack action!") if not mpack_path: print_error_msg("Management pack not specified!") @@ -962,7 +959,7 @@ def upgrade_mpack(options, replay_mode=False): print_info_msg("Management pack {0}-{1} successfully upgraded!".format(mpack_name, mpack_version)) if not replay_mode: - add_replay_log(UPGRADE_MPACK_ACTION, mpack_archive_path, options.purge, options.purge_list, options.force, options.verbose) + add_replay_log(UPGRADE_MPACK_ACTION, mpack_archive_path, False, [], options.force, options.verbose) def replay_mpack_logs(): """ http://git-wip-us.apache.org/repos/asf/ambari/blob/772be786/ambari-server/src/test/python/TestAmbariServer.py ---------------------------------------------------------------------- diff --git a/ambari-server/src/test/python/TestAmbariServer.py b/ambari-server/src/test/python/TestAmbariServer.py index 9579c22..66b5ac5 100644 --- a/ambari-server/src/test/python/TestAmbariServer.py +++ b/ambari-server/src/test/python/TestAmbariServer.py @@ -85,7 +85,7 @@ with patch.object(platform, "linux_distribution", return_value = MagicMock(retur print_info_msg, print_warning_msg, print_error_msg from ambari_commons.os_utils import run_os_command, search_file, set_file_permissions, remove_file, copy_file, \ is_valid_filepath - from ambari_server.dbConfiguration import DBMSConfigFactory, check_jdbc_drivers + from ambari_server.dbConfiguration import DBMSConfigFactory, check_jdbc_drivers, DBMSConfig from ambari_server.dbConfiguration_linux import PGConfig, LinuxDBMSConfig, OracleConfig from ambari_server.properties import Properties from ambari_server.resourceFilesKeeper import ResourceFilesKeeper, KeeperException @@ -302,30 +302,27 @@ class TestAmbariServer(TestCase): @patch.object(OSCheck, "os_distribution", new = MagicMock(return_value = os_distro_value)) @patch.object(_ambari_server_, "setup_security") - @patch("optparse.OptionParser") @patch.object(_ambari_server_, "logger") @patch("ambari_server.serverConfiguration.get_ambari_properties") @patch.object(_ambari_server_, "setup_logging") @patch.object(_ambari_server_, "init_logging") def test_main_test_setup_security(self, init_logging_mock, setup_logging_mock, get_ambari_properties_mock, - logger_mock, OptionParserMock, - setup_security_method): - opm = OptionParserMock.return_value - options = MagicMock() - args = ["setup-security"] - opm.parse_args.return_value = (options, args) - options.dbms = None - options.security_option = "setup-security" - options.sid_or_sname = "sid" - setup_security_method.return_value = None + logger_mock, setup_security_method): + import sys + tmp_argv = sys.argv + try: + sys.argv = ['ambari-server', 'setup-security', '--security-option=setup-security'] + setup_security_method.return_value = None - _ambari_server_.mainBody() + _ambari_server_.mainBody() - _ambari_server_.mainBody() - self.assertTrue(setup_security_method.called) - self.assertFalse(False, get_verbose()) - self.assertFalse(False, get_silent()) - pass + _ambari_server_.mainBody() + self.assertTrue(setup_security_method.called) + self.assertFalse(False, get_verbose()) + self.assertFalse(False, get_silent()) + finally: + sys.argv = tmp_argv + pass @patch.object(OSCheck, "os_distribution", new = MagicMock(return_value = os_distro_value)) @patch.object(_ambari_server_, "setup_ambari_krb5_jaas") @@ -404,148 +401,147 @@ class TestAmbariServer(TestCase): @patch.object(_ambari_server_, "start") @patch.object(_ambari_server_, "stop") @patch.object(_ambari_server_, "reset") - @patch("optparse.OptionParser") @patch.object(_ambari_server_, "logger") @patch("ambari_server.serverConfiguration.get_ambari_properties") @patch.object(_ambari_server_, "setup_logging") @patch.object(_ambari_server_, "init_logging") def test_main_test_setup(self, init_logging_mock, setup_logging_mock, get_ambari_properties_mock, - logger_mock, OptionParserMock, reset_method, stop_method, + logger_mock, reset_method, stop_method, start_method, setup_method, exit_mock): - opm = OptionParserMock.return_value - options = self._create_empty_options_mock() - args = ["setup"] - opm.parse_args.return_value = (options, args) + import sys + tmp_argv = sys.argv + try: + sys.argv = ["ambari-server", "setup"] - options.dbms = None - options.sid_or_sname = "sid" - _ambari_server_.mainBody() + _ambari_server_.mainBody() - self.assertTrue(setup_method.called) - self.assertFalse(start_method.called) - self.assertFalse(stop_method.called) - self.assertFalse(reset_method.called) + self.assertTrue(setup_method.called) + self.assertFalse(start_method.called) + self.assertFalse(stop_method.called) + self.assertFalse(reset_method.called) - self.assertFalse(False, get_verbose()) - self.assertFalse(False, get_silent()) + self.assertFalse(False, get_verbose()) + self.assertFalse(False, get_silent()) - setup_method.reset_mock() - start_method.reset_mock() - stop_method.reset_mock() - reset_method.reset_mock() - exit_mock.reset_mock() - args = ["setup", "-v"] - options = self._create_empty_options_mock() - opm.parse_args.return_value = (options, args) - options.dbms = None - options.sid_or_sname = "sid" - setup_method.side_effect = Exception("Unexpected error") - try: + setup_method.reset_mock() + start_method.reset_mock() + stop_method.reset_mock() + reset_method.reset_mock() + exit_mock.reset_mock() + sys.argv = ["ambari-server", "setup", "-v"] + setup_method.side_effect = Exception("Unexpected error") + try: + _ambari_server_.mainBody() + except Exception: + self.assertTrue(True) + self.assertTrue(setup_method.called) + self.assertFalse(start_method.called) + self.assertFalse(stop_method.called) + self.assertFalse(reset_method.called) + self.assertTrue(get_verbose()) + + setup_method.reset_mock() + start_method.reset_mock() + stop_method.reset_mock() + reset_method.reset_mock() + exit_mock.reset_mock() + sys.argv = ["ambari-server", "setup"] + setup_method.side_effect = Exception("Unexpected error") _ambari_server_.mainBody() - except Exception: - self.assertTrue(True) - self.assertTrue(setup_method.called) - self.assertFalse(start_method.called) - self.assertFalse(stop_method.called) - self.assertFalse(reset_method.called) - self.assertTrue(get_verbose()) - - setup_method.reset_mock() - start_method.reset_mock() - stop_method.reset_mock() - reset_method.reset_mock() - exit_mock.reset_mock() - args = ["setup"] - options = self._create_empty_options_mock() - opm.parse_args.return_value = (options, args) - options.dbms = None - options.sid_or_sname = "sid" - options.verbose = False - setup_method.side_effect = Exception("Unexpected error") - _ambari_server_.mainBody() - self.assertTrue(exit_mock.called) - self.assertTrue(setup_method.called) - self.assertFalse(start_method.called) - self.assertFalse(stop_method.called) - self.assertFalse(reset_method.called) - self.assertFalse(get_verbose()) + self.assertTrue(exit_mock.called) + self.assertTrue(setup_method.called) + self.assertFalse(start_method.called) + self.assertFalse(stop_method.called) + self.assertFalse(reset_method.called) + self.assertFalse(get_verbose()) - pass + pass + finally: + sys.argv = tmp_argv @patch.object(OSCheck, "os_distribution", new = MagicMock(return_value = os_distro_value)) - @patch.object(_ambari_server_, "setup") - @patch("optparse.OptionParser") + @patch.object(PGConfig, "_setup_local_server") @patch.object(_ambari_server_, "logger") @patch("ambari_server.serverConfiguration.get_ambari_properties") @patch.object(_ambari_server_, "setup_logging") @patch.object(_ambari_server_, "init_logging") - def test_main_with_preset_dbms(self, init_logging_mock, setup_logging_mock, get_ambari_properties_mock, - logger_mock, optionParserMock, setup_method): - opm = optionParserMock.return_value - options = self._create_empty_options_mock() - args = ["setup"] - opm.parse_args.return_value = (options, args) + @patch("ambari_server.serverSetup.check_ambari_user") + @patch('ambari_server.serverSetup.download_and_install_jdk') + @patch("ambari_server.serverSetup.configure_os_settings") + @patch.object(DBMSConfig, "setup_database") + @patch("ambari_server.serverSetup.check_jdbc_drivers") + @patch("ambari_server.serverSetup.extract_views") + @patch("ambari_server.serverSetup.adjust_directory_permissions") + @patch("ambari_server.serverSetup.service_setup") + def test_main_with_preset_dbms(self, service_setup_mock, adjust_directory_permissions_mock, extract_views_mock, check_jdbc_drivers_mock, setup_database_mock, configure_os_settings_mock, download_and_install_jdk_mock, check_ambari_user_mock, init_logging_mock, setup_logging_mock, get_ambari_properties_mock, + logger_mock, setup_local_db_method): + extract_views_mock.return_value = 0 + check_ambari_user_mock.return_value = (0, False, 'user', None) + configure_os_settings_mock.return_value = 0 + import sys + tmp_argv = sys.argv + try: + sys.argv = ["ambari-server", "setup", "-s"] - options.dbms = "sqlanywhere" - options.sid_or_sname = "sname" - _ambari_server_.mainBody() + _ambari_server_.mainBody() - self.assertTrue(setup_method.called) - self.assertEquals(options.database_index, 5) - pass + self.assertTrue(setup_local_db_method.called) + pass + finally: + sys.argv = tmp_argv @patch.object(OSCheck, "os_distribution", new = MagicMock(return_value = os_distro_value)) @patch.object(_ambari_server_, "setup") @patch.object(_ambari_server_, "fix_database_options") - @patch("optparse.OptionParser") @patch.object(_ambari_server_, "logger") @patch("ambari_server.serverConfiguration.get_ambari_properties") @patch.object(_ambari_server_, "setup_logging") @patch.object(_ambari_server_, "init_logging") - def test_fix_database_options_called(self, init_logging_mock, setup_logging_mock, get_ambari_properties_mock, logger_mock, optionParserMock, + def test_fix_database_options_called(self, init_logging_mock, setup_logging_mock, get_ambari_properties_mock, logger_mock, fixDBOptionsMock, setup_method): - opm = optionParserMock.return_value - options = self._create_empty_options_mock() - args = ["setup"] - opm.parse_args.return_value = (options, args) + import sys + tmp_argv = sys.argv + try: + sys.argv = ['ambari-server', 'setup'] - _ambari_server_.mainBody() + _ambari_server_.mainBody() - self.assertTrue(setup_method.called) - self.assertTrue(fixDBOptionsMock.called) - set_silent(False) - pass + self.assertTrue(setup_method.called) + self.assertTrue(fixDBOptionsMock.called) + set_silent(False) + pass + finally: + sys.argv = tmp_argv @patch.object(OSCheck, "os_distribution", new = MagicMock(return_value = os_distro_value)) @patch.object(_ambari_server_, "setup") @patch.object(_ambari_server_, "start") @patch.object(_ambari_server_, "stop") @patch.object(_ambari_server_, "reset") - @patch("optparse.OptionParser") @patch.object(_ambari_server_, "logger") @patch("ambari_server.serverConfiguration.get_ambari_properties") @patch.object(_ambari_server_, "setup_logging") @patch.object(_ambari_server_, "init_logging") def test_main_test_start(self, init_logging_mock, setup_logging_mock, get_ambari_properties_mock, logger_mock, - optionParserMock, reset_method, stop_method, + reset_method, stop_method, start_method, setup_method): - opm = optionParserMock.return_value - options = self._create_empty_options_mock() - args = ["setup"] - opm.parse_args.return_value = (options, args) + import sys + tmp_argv = sys.argv + try: + sys.argv = ['ambari-server', "setup"] - options.dbms = None - options.sid_or_sname = "sname" - _ambari_server_.mainBody() + _ambari_server_.mainBody() - self.assertTrue(setup_method.called) - self.assertFalse(start_method.called) - self.assertFalse(stop_method.called) - self.assertFalse(reset_method.called) + self.assertTrue(setup_method.called) + self.assertFalse(start_method.called) + self.assertFalse(stop_method.called) + self.assertFalse(reset_method.called) - self.assertFalse(False, get_verbose()) - self.assertFalse(False, get_silent()) - pass + self.assertFalse(False, get_verbose()) + self.assertFalse(False, get_silent()) + pass + finally: + sys.argv = tmp_argv @not_for_platform(PLATFORM_WINDOWS) @patch.object(OSCheck, "os_distribution", new = MagicMock(return_value = os_distro_value)) @@ -656,33 +652,32 @@ class TestAmbariServer(TestCase): @patch.object(_ambari_server_, "reset") @patch.object(_ambari_server_, "backup") @patch.object(_ambari_server_, "restore") - @patch("optparse.OptionParser") @patch.object(_ambari_server_, "logger") @patch("ambari_server.serverConfiguration.get_ambari_properties") @patch.object(_ambari_server_, "setup_logging") @patch.object(_ambari_server_, "init_logging") def test_main_test_backup(self, init_logging_mock, setup_logging_mock, get_ambari_properties_mock, logger_mock, - optionParserMock, restore_mock, backup_mock, reset_method, stop_method, + restore_mock, backup_mock, reset_method, stop_method, start_method, setup_method): - opm = optionParserMock.return_value - options = self._create_empty_options_mock() - args = ["backup"] - opm.parse_args.return_value = (options, args) + import sys + tmp_argv = sys.argv + try: + sys.argv = ['ambari-server', "backup"] - options.dbms = None - options.sid_or_sname = "sname" - _ambari_server_.mainBody() + _ambari_server_.mainBody() - self.assertTrue(backup_mock.called) - self.assertFalse(restore_mock.called) - self.assertFalse(setup_method.called) - self.assertFalse(start_method.called) - self.assertFalse(stop_method.called) - self.assertFalse(reset_method.called) + self.assertTrue(backup_mock.called) + self.assertFalse(restore_mock.called) + self.assertFalse(setup_method.called) + self.assertFalse(start_method.called) + self.assertFalse(stop_method.called) + self.assertFalse(reset_method.called) - self.assertFalse(False, get_verbose()) - self.assertFalse(False, get_silent()) - pass + self.assertFalse(False, get_verbose()) + self.assertFalse(False, get_silent()) + pass + finally: + sys.argv = tmp_argv #Restore is not yet supported on Windows @not_for_platform(PLATFORM_WINDOWS) @@ -693,33 +688,31 @@ class TestAmbariServer(TestCase): @patch.object(_ambari_server_, "reset") @patch.object(_ambari_server_, "backup") @patch.object(_ambari_server_, "restore") - @patch("optparse.OptionParser") @patch.object(_ambari_server_, "logger") @patch("ambari_server.serverConfiguration.get_ambari_properties") @patch.object(_ambari_server_, "setup_logging") @patch.object(_ambari_server_, "init_logging") def test_main_test_restore(self, init_logging_mock, setup_logging_mock, get_ambari_properties_mock, logger_mock, - optionParserMock, restore_mock, backup_mock, reset_method, stop_method, + restore_mock, backup_mock, reset_method, stop_method, start_method, setup_method): - opm = optionParserMock.return_value - options = self._create_empty_options_mock() - args = ["restore"] - opm.parse_args.return_value = (options, args) - - options.dbms = None - options.sid_or_sname = "sname" - _ambari_server_.mainBody() + import sys + tmp_argv = sys.argv + try: + sys.argv = ['ambari-server', "restore"] + _ambari_server_.mainBody() - self.assertTrue(restore_mock.called) - self.assertFalse(backup_mock.called) - self.assertFalse(setup_method.called) - self.assertFalse(start_method.called) - self.assertFalse(stop_method.called) - self.assertFalse(reset_method.called) + self.assertTrue(restore_mock.called) + self.assertFalse(backup_mock.called) + self.assertFalse(setup_method.called) + self.assertFalse(start_method.called) + self.assertFalse(stop_method.called) + self.assertFalse(reset_method.called) - self.assertFalse(False, get_verbose()) - self.assertFalse(False, get_silent()) - pass + self.assertFalse(False, get_verbose()) + self.assertFalse(False, get_silent()) + pass + finally: + sys.argv = tmp_argv @not_for_platform(PLATFORM_WINDOWS) @patch.object(OSCheck, "os_distribution", new = MagicMock(return_value = os_distro_value)) @@ -791,32 +784,30 @@ class TestAmbariServer(TestCase): @patch.object(_ambari_server_, "start") @patch.object(_ambari_server_, "stop") @patch.object(_ambari_server_, "reset") - @patch("optparse.OptionParser") @patch.object(_ambari_server_, "logger") @patch("ambari_server.serverConfiguration.get_ambari_properties") @patch.object(_ambari_server_, "setup_logging") @patch.object(_ambari_server_, "init_logging") def test_main_test_reset(self, init_logging_mock, setup_logging_mock, get_ambari_properties_mock, - logger_mock, optionParserMock, reset_method, stop_method, + logger_mock, reset_method, stop_method, start_method, setup_method): - opm = optionParserMock.return_value - - options = self._create_empty_options_mock() - args = ["reset"] - opm.parse_args.return_value = (options, args) - options.dbms = None - options.sid_or_sname = "sid" + import sys + tmp_argv = sys.argv + try: + sys.argv = ['ambari-server', "reset"] - _ambari_server_.mainBody() + _ambari_server_.mainBody() - self.assertFalse(setup_method.called) - self.assertFalse(start_method.called) - self.assertFalse(stop_method.called) - self.assertTrue(reset_method.called) + self.assertFalse(setup_method.called) + self.assertFalse(start_method.called) + self.assertFalse(stop_method.called) + self.assertTrue(reset_method.called) - self.assertFalse(False, get_verbose()) - self.assertFalse(False, get_silent()) - pass + self.assertFalse(False, get_verbose()) + self.assertFalse(False, get_silent()) + pass + finally: + sys.argv = tmp_argv @not_for_platform(PLATFORM_WINDOWS) @@ -8497,64 +8488,84 @@ class TestAmbariServer(TestCase): @not_for_platform(PLATFORM_WINDOWS) @patch.object(OSCheck, "os_distribution", new = MagicMock(return_value = os_distro_value)) @patch.object(_ambari_server_, "is_server_runing") - @patch("optparse.OptionParser") @patch.object(_ambari_server_, "logger") @patch("ambari_server.serverConfiguration.get_ambari_properties") @patch.object(_ambari_server_, "setup_logging") @patch.object(_ambari_server_, "init_logging") def test_main_test_status_running(self, init_logging_mock, setup_logging_mock, get_ambari_properties_mock, - logger_mock, optionParserMock, is_server_runing_method): - opm = optionParserMock.return_value - options = self._create_empty_options_mock() - del options.exit_message + logger_mock, is_server_runing_method): - args = ["status"] - opm.parse_args.return_value = (options, args) + import sys + tmp_argv = sys.argv + try: + sys.argv = ['ambari-server', "status"] - is_server_runing_method.return_value = (True, 100) + is_server_runing_method.return_value = (True, 100) - options.dbms = None - options.sid_or_sname = "sid" - try: - _ambari_server_.mainBody() - except SystemExit as e: - self.assertTrue(e.code == 0) + try: + _ambari_server_.mainBody() + except SystemExit as e: + self.assertTrue(e.code == 0) - self.assertTrue(is_server_runing_method.called) - pass + self.assertTrue(is_server_runing_method.called) + pass + finally: + sys.argv = tmp_argv @not_for_platform(PLATFORM_WINDOWS) @patch.object(OSCheck, "os_distribution", new = MagicMock(return_value = os_distro_value)) @patch.object(_ambari_server_, "is_server_runing") - @patch("optparse.OptionParser") @patch.object(_ambari_server_, "logger") @patch("ambari_server.serverConfiguration.get_ambari_properties") @patch.object(_ambari_server_, "setup_logging") @patch.object(_ambari_server_, "init_logging") def test_main_test_status_not_running(self, init_logging_mock, setup_logging_mock, get_ambari_properties_mock, - logger_mock, optionParserMock, is_server_runing_method): - opm = optionParserMock.return_value - options = self._create_empty_options_mock() - del options.exit_message + logger_mock, is_server_runing_method): - args = ["status"] - opm.parse_args.return_value = (options, args) + import sys + tmp_argv = sys.argv + try: + sys.argv = ['ambari-server', "status"] - is_server_runing_method.return_value = (False, None) + is_server_runing_method.return_value = (False, None) - options.dbms = None - options.sid_or_sname = "sid" + try: + _ambari_server_.mainBody() + except SystemExit as e: + self.assertTrue(e.code == 3) + self.assertTrue(is_server_runing_method.called) + pass + finally: + sys.argv = tmp_argv + + @not_for_platform(PLATFORM_WINDOWS) + @patch.object(OSCheck, "os_distribution", new = MagicMock(return_value = os_distro_value)) + @patch.object(_ambari_server_, "logger") + @patch("ambari_server.serverConfiguration.get_ambari_properties") + @patch.object(_ambari_server_, "setup_logging") + @patch.object(_ambari_server_, "init_logging") + def test_status_extra_option(self, init_logging_mock, setup_logging_mock, get_ambari_properties_mock, + logger_mock): + + import sys + tmp_argv = sys.argv try: - _ambari_server_.mainBody() - except SystemExit as e: - self.assertTrue(e.code == 3) + sys.argv = ['ambari-server', "status", '--skip-database-check'] + flag = False + try: + _ambari_server_.mainBody() + except SystemExit as e: + self.assertEquals(e.code, 2) + flag = True - self.assertTrue(is_server_runing_method.called) - pass + self.assertTrue(flag) + pass + finally: + sys.argv = tmp_argv def test_web_server_startup_timeout(self): from ambari_server.serverConfiguration import get_web_server_startup_timeout
