/**
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.ambari.server.checks;
import java.util.Map;
import org.apache.ambari.server.state.stack.PrereqCheckType;
import com.google.common.collect.ImmutableMap;
/**
* Enum that wraps the various type, text and failure messages for the checks
* done for Stack Upgrades.
*/
public class CheckDescription {
public static CheckDescription CLIENT_RETRY = new CheckDescription("CLIENT_RETRY",
PrereqCheckType.SERVICE,
"Client Retry Properties",
new ImmutableMap.Builder<String, String>()
.put(ClientRetryPropertyCheck.HDFS_CLIENT_RETRY_DISABLED_KEY,
"The hdfs-site.xml property dfs.client.retry.policy.enabled should be set to \"false\" to failover quickly.")
.put(ClientRetryPropertyCheck.HIVE_CLIENT_RETRY_MISSING_KEY,
"The hive-site.xml property hive.metastore.failure.retries should be set to a positive value.")
.put(ClientRetryPropertyCheck.OOZIE_CLIENT_RETRY_MISSING_KEY,
"The oozie-env.sh script must contain a retry count such as export OOZIE_CLIENT_OPTS=\"${OOZIE_CLIENT_OPTS} -Doozie.connection.retry.count=5\"").build());
public static CheckDescription HOSTS_HEARTBEAT = new CheckDescription("HOSTS_HEARTBEAT",
PrereqCheckType.HOST,
"All hosts must be communicating with Ambari. Hosts which are not reachable should be placed in Maintenance Mode.",
new ImmutableMap.Builder<String, String>()
.put(AbstractCheckDescriptor.DEFAULT,
"There are hosts which are not communicating with Ambari.").build());
public static CheckDescription HEALTH = new CheckDescription("HEALTH",
PrereqCheckType.CLUSTER,
"Cluster Health",
new ImmutableMap.Builder<String, String>()
.put(AbstractCheckDescriptor.DEFAULT,
"The following issues have been detected on this cluster and should be addressed before upgrading: %s").build());
public static CheckDescription SERVICE_CHECK = new CheckDescription("SERVICE_CHECK",
PrereqCheckType.SERVICE,
"Last Service Check should be more recent than the last configuration change for the given service",
new ImmutableMap.Builder<String, String>()
.put(AbstractCheckDescriptor.DEFAULT,
"The following service configurations have been updated and their Service Checks should be run again: %s").build());
public static CheckDescription HOSTS_MAINTENANCE_MODE = new CheckDescription("HOSTS_MAINTENANCE_MODE",
PrereqCheckType.HOST,
"Hosts in Maintenance Mode will be excluded from the upgrade.",
new ImmutableMap.Builder<String, String>()
.put(AbstractCheckDescriptor.DEFAULT,
"There are hosts in Maintenance Mode which excludes them from being upgraded.")
.put(HostMaintenanceModeCheck.KEY_CANNOT_START_HOST_ORDERED,
"The following hosts cannot be in Maintenance Mode: {{fails}}.").build());
public static CheckDescription HOSTS_MASTER_MAINTENANCE = new CheckDescription("HOSTS_MASTER_MAINTENANCE",
PrereqCheckType.HOST,
"Hosts in Maintenance Mode must not have any master components",
new ImmutableMap.Builder<String, String>()
.put(AbstractCheckDescriptor.DEFAULT,
"The following hosts must not be in in Maintenance Mode since they host Master components: {{fails}}.")
.put(HostsMasterMaintenanceCheck.KEY_NO_UPGRADE_NAME,
"Could not find suitable upgrade pack for %s %s to version {{version}}.")
.put(HostsMasterMaintenanceCheck.KEY_NO_UPGRADE_PACK,
"Could not find upgrade pack named %s.").build());
public static CheckDescription HOSTS_REPOSITORY_VERSION = new CheckDescription("HOSTS_REPOSITORY_VERSION",
PrereqCheckType.HOST,
"All hosts should have target version installed",
new ImmutableMap.Builder<String, String>()
.put(AbstractCheckDescriptor.DEFAULT,
"The following hosts must have version {{version}} installed: {{fails}}.")
.put(HostsRepositoryVersionCheck.KEY_NO_REPO_VERSION,
"Repository version {{version}} does not exist.").build());
public static CheckDescription SECONDARY_NAMENODE_MUST_BE_DELETED = new CheckDescription("SECONDARY_NAMENODE_MUST_BE_DELETED",
PrereqCheckType.HOST,
"The SNameNode component must be deleted from all hosts",
new ImmutableMap.Builder<String, String>()
.put(AbstractCheckDescriptor.DEFAULT, "The SNameNode component must be deleted from host: %s.").build());
public static CheckDescription SERVICES_HIVE_MULTIPLE_METASTORES = new CheckDescription("SERVICES_HIVE_MULTIPLE_METASTORES",
PrereqCheckType.SERVICE,
"Hive Metastore Availability",
new ImmutableMap.Builder<String, String>()
.put(AbstractCheckDescriptor.DEFAULT,
"Multiple Hive Metastore instances are recommended for Rolling Upgrade. This ensures that there is at least one Metastore running during the upgrade process.").build());
public static CheckDescription SERVICES_MAINTENANCE_MODE = new CheckDescription("SERVICES_MAINTENANCE_MODE",
PrereqCheckType.SERVICE,
"No services can be in Maintenance Mode",
new ImmutableMap.Builder<String, String>()
.put(AbstractCheckDescriptor.DEFAULT,
"The following Services must not be in Maintenance Mode: {{fails}}.").build());
public static CheckDescription SERVICES_MR_DISTRIBUTED_CACHE = new CheckDescription("SERVICES_MR_DISTRIBUTED_CACHE",
PrereqCheckType.SERVICE,
"MapReduce should reference Hadoop libraries from the distributed cache in HDFS",
new ImmutableMap.Builder<String, String>()
.put(ServicesMapReduceDistributedCacheCheck.KEY_APP_CLASSPATH,
"The mapred-site.xml property mapreduce.application.classpath should be set.")
.put(ServicesMapReduceDistributedCacheCheck.KEY_FRAMEWORK_PATH,
"The mapred-site.xml property mapreduce.application.framework.path should be set.")
.put(ServicesMapReduceDistributedCacheCheck.KEY_NOT_DFS,
"The mapred-site.xml property mapreduce.application.framework.path or the core-site.xml property fs.defaultFS should point to *dfs:/ url.").build());
public static CheckDescription SERVICES_NAMENODE_HA = new CheckDescription("SERVICES_NAMENODE_HA",
PrereqCheckType.SERVICE,
"NameNode High Availability must be enabled",
new ImmutableMap.Builder<String, String>()
.put(AbstractCheckDescriptor.DEFAULT,
"NameNode High Availability is not enabled. Verify that dfs.internal.nameservices property is present in hdfs-site.xml.").build());
public static CheckDescription SERVICES_NAMENODE_TRUNCATE = new CheckDescription("SERVICES_NAMENODE_TRUNCATE",
PrereqCheckType.SERVICE,
"NameNode Truncate must not be allowed",
new ImmutableMap.Builder<String, String>()
.put(AbstractCheckDescriptor.DEFAULT,
"NameNode Truncate is allowed. Verify that dfs.allow.truncate is set to 'false' in hdfs-site.xml.").build());
public static CheckDescription SERVICES_TEZ_DISTRIBUTED_CACHE = new CheckDescription("SERVICES_TEZ_DISTRIBUTED_CACHE",
PrereqCheckType.SERVICE,
"Tez should reference Hadoop libraries from the distributed cache in HDFS",
new ImmutableMap.Builder<String, String>()
.put(ServicesTezDistributedCacheCheck.KEY_LIB_URI_MISSING,
"The tez-site.xml property tez.lib.uris should be set.")
.put(ServicesTezDistributedCacheCheck.KEY_USE_HADOOP_LIBS,
"The tez-site.xml property tez.use.cluster-hadoop-libs should be set.")
.put(ServicesTezDistributedCacheCheck.KEY_LIB_NOT_DFS,
"The tez-site.xml property tez.lib.uris or the core-site.xml property fs.defaultFS should point to *dfs:/ url.")
.put(ServicesTezDistributedCacheCheck.KEY_LIB_NOT_TARGZ,
"The tez-site.xml property tez.lib.uris should point to tar.gz file.")
.put(ServicesTezDistributedCacheCheck.KEY_USE_HADOOP_LIBS_FALSE,
"The tez-site.xml property tez.use.cluster.hadoop-libs should be set to false.").build());
public static CheckDescription SERVICES_UP = new CheckDescription("SERVICES_UP",
PrereqCheckType.SERVICE,
"All services must be started",
new ImmutableMap.Builder<String, String>()
.put(AbstractCheckDescriptor.DEFAULT,
"The following Services must be started: {{fails}}. Try to do a Stop & Start in case they were started outside of Ambari.").build());
public static CheckDescription COMPONENTS_INSTALLATION = new CheckDescription("COMPONENTS_INSTALLATION",
PrereqCheckType.SERVICE,
"All service components must be installed",
new ImmutableMap.Builder<String, String>()
.put(AbstractCheckDescriptor.DEFAULT,
"The following Services must be reinstalled: {{fails}}. Try to reinstall the service components in INSTALL_FAILED state.").build());
public static CheckDescription PREVIOUS_UPGRADE_COMPLETED = new CheckDescription("PREVIOUS_UPGRADE_COMPLETED",
PrereqCheckType.CLUSTER,
"A previous upgrade did not complete.",
new ImmutableMap.Builder<String, String>()
.put(AbstractCheckDescriptor.DEFAULT,
"The last upgrade attempt did not complete. {{fails}}").build());
public static CheckDescription INSTALL_PACKAGES_CHECK = new CheckDescription("INSTALL_PACKAGES_CHECK",
PrereqCheckType.CLUSTER,
"Install packages must be re-run",
new ImmutableMap.Builder<String, String>()
.put(AbstractCheckDescriptor.DEFAULT,
"Re-run Install Packages before starting upgrade").build());
public static CheckDescription SERVICES_YARN_WP = new CheckDescription("SERVICES_YARN_WP",
PrereqCheckType.SERVICE,
"YARN work preserving restart should be enabled",
new ImmutableMap.Builder<String, String>()
.put(AbstractCheckDescriptor.DEFAULT,
"YARN should have work preserving restart enabled. The yarn-site.xml property yarn.resourcemanager.work-preserving-recovery.enabled property should be set to true.").build());
public static CheckDescription SERVICES_YARN_RM_HA = new CheckDescription("SERVICES_YARN_RM_HA",
PrereqCheckType.SERVICE,
"YARN ResourceManager High Availability is not enabled.",
new ImmutableMap.Builder<String, String>()
.put(AbstractCheckDescriptor.DEFAULT,
"YARN ResourceManager HA should be enabled to prevent a disruption in service during the upgrade").build());
public static CheckDescription SERVICES_YARN_TIMELINE_ST = new CheckDescription("SERVICES_YARN_TIMELINE_ST",
PrereqCheckType.SERVICE,
"YARN Timeline state preserving restart should be enabled",
new ImmutableMap.Builder<String, String>()
.put(AbstractCheckDescriptor.DEFAULT,
"YARN should have state preserving restart enabled for the Timeline server. The yarn-site.xml property yarn.timeline-service.recovery.enabled should be set to true.").build());
public static CheckDescription SERVICES_MR2_JOBHISTORY_ST = new CheckDescription("SERVICES_MR2_JOBHISTORY_ST",
PrereqCheckType.SERVICE,
"MapReduce2 JobHistory recovery should be enabled",
new ImmutableMap.Builder<String, String>()
.put(MapReduce2JobHistoryStatePreservingCheck.MAPREDUCE2_JOBHISTORY_RECOVERY_ENABLE_KEY,
"MapReduce2 should have recovery enabled for the JobHistory server. The mapred-site.xml property mapreduce.jobhistory.recovery.enable should be set to true.")
.put(MapReduce2JobHistoryStatePreservingCheck.MAPREDUCE2_JOBHISTORY_RECOVERY_STORE_KEY,
"MapReduce2 should have recovery enabled for the JobHistory server. The mapred-site.xml property mapreduce.jobhistory.recovery.store.class should be set to org.apache.hadoop.mapreduce.v2.hs.HistoryServerLeveldbStateStoreService.")
.put(MapReduce2JobHistoryStatePreservingCheck.MAPREDUCE2_JOBHISTORY_RECOVERY_STORE_LEVELDB_PATH_KEY,
"MapReduce2 should have recovery enabled for the JobHistory server. The mapred-site.xml property mapreduce.jobhistory.recovery.store.leveldb.path should be set. Please note that \"mapreduce.jobhistory.recovery.store.leveldb.path\" should be on a mount with ~3 GB of free space.").build());
public static CheckDescription SERVICES_HIVE_DYNAMIC_SERVICE_DISCOVERY = new CheckDescription("SERVICES_HIVE_DYNAMIC_SERVICE_DISCOVERY",
PrereqCheckType.SERVICE,
"Hive Dynamic Service Discovery",
new ImmutableMap.Builder<String, String>()
.put(HiveDynamicServiceDiscoveryCheck.HIVE_DYNAMIC_SERVICE_DISCOVERY_ENABLED_KEY,
"The hive-site.xml property hive.server2.support.dynamic.service.discovery should be set to true.")
.put(HiveDynamicServiceDiscoveryCheck.HIVE_DYNAMIC_SERVICE_ZK_QUORUM_KEY,
"The hive-site.xml property hive.zookeeper.quorum should be set to a comma-separate list of ZooKeeper hosts:port pairs.")
.put(HiveDynamicServiceDiscoveryCheck.HIVE_DYNAMIC_SERVICE_ZK_NAMESPACE_KEY,
"The hive-site.xml property hive.server2.zookeeper.namespace should be set to the value for the root namespace on ZooKeeper.").build());
public static CheckDescription CONFIG_MERGE = new CheckDescription("CONFIG_MERGE",
PrereqCheckType.CLUSTER,
"Configuration Merge Check",
new ImmutableMap.Builder<String, String>()
.put(AbstractCheckDescriptor.DEFAULT,
"The following config types will have values overwritten: %s").build());
public static CheckDescription HARDCODED_STACK_VERSION_PROPERTIES_CHECK = new CheckDescription("HARDCODED_STACK_VERSION_PROPERTIES_CHECK",
PrereqCheckType.CLUSTER,
"Found hardcoded stack version in property value.",
new ImmutableMap.Builder<String, String>()
.put(AbstractCheckDescriptor.DEFAULT,
"Some properties seem to contain hardcoded stack version string \"%s\"." +
" That is a potential problem when doing stack update.").build());
public static CheckDescription VERSION_MISMATCH = new CheckDescription("VERSION_MISMATCH",
PrereqCheckType.HOST,
"All components must be reporting the expected version",
new ImmutableMap.Builder<String, String>()
.put(AbstractCheckDescriptor.DEFAULT,
"There are components which are not reporting the expected stack version: \n%s").build());
public static CheckDescription SERVICES_RANGER_PASSWORD_VERIFY = new CheckDescription("SERVICES_RANGER_PASSWORD_VERIFY",
PrereqCheckType.SERVICE,
"Verify Ambari and Ranger Password Synchronization",
new ImmutableMap.Builder<String, String>()
.put(AbstractCheckDescriptor.DEFAULT,
"There was a problem verifying Ranger and Ambari users")
.put(RangerPasswordCheck.KEY_RANGER_PASSWORD_MISMATCH,
"Credentials for user '%s' in Ambari do not match Ranger.")
.put(RangerPasswordCheck.KEY_RANGER_UNKNOWN_RESPONSE,
"Could not verify credentials for user '%s'. Response code %s received from %s")
.put(RangerPasswordCheck.KEY_RANGER_COULD_NOT_ACCESS,
"Could not access Ranger to verify user '%s' against %s. %s")
.put(RangerPasswordCheck.KEY_RANGER_USERS_ELEMENT_MISSING,
"The response from Ranger received, but there is no users element. Request: %s")
.put(RangerPasswordCheck.KEY_RANGER_OTHER_ISSUE,
"The response from Ranger was malformed. %s. Request: %s")
.put(RangerPasswordCheck.KEY_RANGER_CONFIG_MISSING,
"Could not check credentials. Missing property %s/%s").build());
public static CheckDescription ATLAS_SERVICE_PRESENCE_CHECK = new CheckDescription("ATLAS_SERVICE_PRESENCE_CHECK",
PrereqCheckType.SERVICE,
"Atlas Is Not Supported For Upgrades",
new ImmutableMap.Builder<String, String>()
.put(AbstractCheckDescriptor.DEFAULT,
"The Atlas service is currently installed on the cluster. " +
"This service does not support upgrades and must be removed before the upgrade can continue. " +
"After upgrading, Atlas can be reinstalled").build());
public static CheckDescription SERVICE_PRESENCE_CHECK = new CheckDescription("SERVICE_PRESENCE_CHECK",
PrereqCheckType.SERVICE,
"Service Is Not Supported For Upgrades",
new ImmutableMap.Builder<String, String>()
.put(AbstractCheckDescriptor.DEFAULT,
"The %s service is currently installed on the cluster. " +
"This service does not support upgrades and must be removed before the upgrade can continue. " +
"After upgrading, %s can be reinstalled")
.put(ServicePresenceCheck.KEY_SERVICE_REMOVED,
"The %s service is currently installed on the cluster. " +
"This service is removed from the new release and must be removed before the upgrade can continue.")
.put(ServicePresenceCheck.KEY_SERVICE_REPLACED,
"The %s service is currently installed on the cluster. " +
"This service is removed from the new release and must be removed before the upgrade can continue. " +
"After upgrading, %s can be installed as the replacement.").build());
public static CheckDescription RANGER_SERVICE_AUDIT_DB_CHECK = new CheckDescription("RANGER_SERVICE_AUDIT_DB_CHECK",
PrereqCheckType.SERVICE,
"Remove the Ranger Audit to Database Capability",
new ImmutableMap.Builder<String, String>()
.put(AbstractCheckDescriptor.DEFAULT,
"After upgrading, Ranger will no longer support the Audit to Database feature. Instead, Ranger will audit to Solr. " +
"To migrate the existing audit logs to Solr, follow the steps in Apache Ranger documention for 0.6 release.").build());
public static CheckDescription KAFKA_KERBEROS_CHECK = new CheckDescription("KAFKA_KERBEROS_CHECK",
PrereqCheckType.SERVICE,
"Kafka upgrade on Kerberized cluster",
new ImmutableMap.Builder<String, String>()
.put(AbstractCheckDescriptor.DEFAULT,
"Kafka is currently not Kerberized, but your cluster is. After upgrading, Kafka will automatically be Kerberized for you.").build());
public static CheckDescription SERVICES_HIVE_ROLLING_WARNING = new CheckDescription("SERVICES_HIVE_ROLLING_WARNING",
PrereqCheckType.SERVICE,
"HiveServer2 Downtime",
new ImmutableMap.Builder<String, String>()
.put(AbstractCheckDescriptor.DEFAULT,
"HiveServer2 does not currently support rolling upgrades. HiveServer2 will be upgraded, however existing queries which have not completed will fail and need to be resubmitted after HiveServer2 has been upgraded.").build());
public static CheckDescription SERVICES_STORM_ROLLING_WARNING = new CheckDescription("SERVICES_STORM_ROLLING_WARNING",
PrereqCheckType.SERVICE,
"Storm Downtime During Upgrade",
new ImmutableMap.Builder<String, String>()
.put(AbstractCheckDescriptor.DEFAULT,
"Storm does not support rolling upgrades on this version of the stack. If you proceed, you will be required to stop all running topologies before Storm is restarted.").build());
public static CheckDescription AUTO_START_DISABLED = new CheckDescription("AUTO_START_DISABLED",
PrereqCheckType.CLUSTER,
"Auto-Start Disabled Check",
new ImmutableMap.Builder<String, String>()
.put(AbstractCheckDescriptor.DEFAULT,
"Auto Start must be disabled before performing an Upgrade. To disable Auto Start, navigate to " +
"Admin > Service Auto Start. Turn the toggle switch off to Disabled and hit Save.").build());
public static CheckDescription RANGER_SSL_CONFIG_CHECK = new CheckDescription("RANGER_SSL_CONFIG_CHECK",
PrereqCheckType.SERVICE,
"Change Ranger SSL configuration path for Keystore and Truststore.",
new ImmutableMap.Builder<String, String>()
.put(AbstractCheckDescriptor.DEFAULT,
"As Ranger is SSL enabled, Ranger SSL configurations will need to be changed from default value of /etc/ranger/*/conf folder to /etc/ranger/security. " +
"Since the certificates/keystores/truststores in this path may affect the upgrade/downgrade process, it is recommended to manually move the certificates/keystores/truststores out of the conf folders and change the appropriate config values before proceeding.").build());
private String m_name;
private PrereqCheckType m_type;
private String m_description;
private Map<String, String> m_fails;
public CheckDescription(String name, PrereqCheckType type, String description, Map<String, String> fails) {
m_name = name;
m_type = type;
m_description = description;
m_fails = fails;
}
/**
* @return the name of check
*/
public String name() {
return m_name;
}
/**
* @return the type of check
*/
public PrereqCheckType getType() {
return m_type;
}
/**
* @return the text associated with the description
*/
public String getText() {
return m_description;
}
/**
* @param key the failure text key
* @return the fail text template. Never {@code null}
*/
public String getFail(String key) {
return m_fails.containsKey(key) ? m_fails.get(key) : "";
}
}