/* * 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.state; import java.util.ArrayList; import java.util.List; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlElementWrapper; import javax.xml.bind.annotation.XmlElements; import org.apache.commons.lang.builder.ToStringBuilder; import org.apache.commons.lang.builder.ToStringStyle; @XmlAccessorType(XmlAccessType.FIELD) public class ComponentInfo { private String name; private String displayName; private String category; private boolean deleted; private String cardinality; @XmlElement(name="versionAdvertised") private Boolean versionAdvertisedField; /** * Technically, no component is required to advertise a version. In practice, * Components should advertise a version through a mechanism like hdp-select. * The version must be present the structured output.in the {"version": "#.#.#.#-###"} * For example, Masters will typically advertise the version upon a RESTART. * Whereas clients will advertise the version when INSTALLED. * Some components do not need to advertise a version because it is either redundant, or they don't have a mechanism * at the moment. For instance, ZKFC has the same version as NameNode, while AMBARI_METRICS and KERBEROS do not have a mechanism. * * This is the translation of the xml element ["true", "false", null] (note that if a value is not specified, * it will inherit from the parent) into a boolean after actually resolving it. */ private boolean versionAdvertisedInternal = false; /** * Used to determine if decommission is allowed * */ @XmlElements(@XmlElement(name = "decommissionAllowed")) private String decommissionAllowed; @XmlElement(name="unlimitedKeyJCERequired") private UnlimitedKeyJCERequirement unlimitedKeyJCERequired; /** * Added at schema ver 2 */ private CommandScriptDefinition commandScript; /** * List of the logs that the component writes */ @XmlElementWrapper(name = "logs") @XmlElements(@XmlElement(name = "log")) private List<LogDefinition> logs; /** * List of clients which configs are updated with master component. * If clientsToUpdateConfigs is not specified all clients are considered to be updated. * If clientsToUpdateConfigs is empty no clients are considered to be updated */ @XmlElementWrapper(name = "clientsToUpdateConfigs") @XmlElements(@XmlElement(name = "client")) private List<String> clientsToUpdateConfigs; /** * Client configuration files * List of files to download in client configuration tar */ @XmlElementWrapper(name = "configFiles") @XmlElements(@XmlElement(name = "configFile")) private List<ClientConfigFileDefinition> clientConfigFiles; /** * Added at schema ver 2 */ @XmlElementWrapper(name="customCommands") @XmlElements(@XmlElement(name="customCommand")) private List<CustomCommandDefinition> customCommands; /** * bulk commands shown in the Hosts actions * */ @XmlElement(name="bulkCommands") private BulkCommandDefinition bulkCommandDefinition; /** * Component dependencies to other components. */ @XmlElementWrapper(name="dependencies") @XmlElements(@XmlElement(name="dependency")) private List<DependencyInfo> dependencies = new ArrayList<>(); @XmlElementWrapper(name="configuration-dependencies") @XmlElements(@XmlElement(name="config-type")) private List<String> configDependencies; /** * Auto-deployment information. * If auto-deployment is enabled and the component doesn't meet the cardinality requirement, * the component is auto-deployed to the cluster topology. */ @XmlElement(name="auto-deploy") private AutoDeployInfo autoDeploy; @XmlElements(@XmlElement(name = "recovery_enabled")) private boolean recoveryEnabled = false; /** * Used to determine if reassign is allowed * */ @XmlElements(@XmlElement(name = "reassignAllowed")) private String reassignAllowed; private String timelineAppid; @XmlElement(name="customFolder") private String customFolder; public ComponentInfo() { } /** * Copy constructor. */ public ComponentInfo(ComponentInfo prototype) { name = prototype.name; category = prototype.category; deleted = prototype.deleted; cardinality = prototype.cardinality; versionAdvertisedField = prototype.versionAdvertisedField; versionAdvertisedInternal = prototype.versionAdvertisedInternal; decommissionAllowed = prototype.decommissionAllowed; unlimitedKeyJCERequired = prototype.unlimitedKeyJCERequired; clientsToUpdateConfigs = prototype.clientsToUpdateConfigs; commandScript = prototype.commandScript; logs = prototype.logs; customCommands = prototype.customCommands; bulkCommandDefinition = prototype.bulkCommandDefinition; dependencies = prototype.dependencies; autoDeploy = prototype.autoDeploy; configDependencies = prototype.configDependencies; clientConfigFiles = prototype.clientConfigFiles; timelineAppid = prototype.timelineAppid; reassignAllowed = prototype.reassignAllowed; customFolder = prototype.customFolder; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getDisplayName() { return displayName; } public void setDisplayName(String displayName) { this.displayName = displayName; } public String getCategory() { return category; } public void setCategory(String category) { this.category = category; } public boolean isClient() { return "CLIENT".equals(category); } public boolean isMaster() { return "MASTER".equals(category); } public boolean isSlave() { return "SLAVE".equals(category); } public boolean isDeleted() { return deleted; } public void setDeleted(boolean deleted) { this.deleted = deleted; } public CommandScriptDefinition getCommandScript() { return commandScript; } public void setCommandScript(CommandScriptDefinition commandScript) { this.commandScript = commandScript; } public List<LogDefinition> getLogs() { if (logs == null) { logs = new ArrayList<>(); } return logs; } public LogDefinition getPrimaryLog() { for (LogDefinition log : getLogs()) { if (log.isPrimary()) { return log; } } return null; } public void setLogs(List<LogDefinition> logs) { this.logs = logs; } public List<ClientConfigFileDefinition> getClientConfigFiles() { return clientConfigFiles; } public void setClientConfigFiles(List<ClientConfigFileDefinition> clientConfigFiles) { this.clientConfigFiles = clientConfigFiles; } public List<CustomCommandDefinition> getCustomCommands() { if (customCommands == null) { customCommands = new ArrayList<>(); } return customCommands; } public void setCustomCommands(List<CustomCommandDefinition> customCommands) { this.customCommands = customCommands; } public boolean isCustomCommand(String commandName) { if (customCommands != null && commandName != null) { for (CustomCommandDefinition cc: customCommands) { if (commandName.equals(cc.getName())){ return true; } } } return false; } public CustomCommandDefinition getCustomCommandByName(String commandName){ for(CustomCommandDefinition ccd : getCustomCommands()){ if (ccd.getName().equals(commandName)){ return ccd; } } return null; } public BulkCommandDefinition getBulkCommandDefinition() { return bulkCommandDefinition; } public void setBulkCommands(BulkCommandDefinition bulkCommandDefinition) { this.bulkCommandDefinition = bulkCommandDefinition; } public List<DependencyInfo> getDependencies() { return dependencies; } public List<String> getConfigDependencies() { return configDependencies; } public void setConfigDependencies(List<String> configDependencies) { this.configDependencies = configDependencies; } public boolean hasConfigType(String type) { return configDependencies != null && configDependencies.contains(type); } public void setDependencies(List<DependencyInfo> dependencies) { this.dependencies = dependencies; } public void setAutoDeploy(AutoDeployInfo autoDeploy) { this.autoDeploy = autoDeploy; } public AutoDeployInfo getAutoDeploy() { return autoDeploy; } public void setCardinality(String cardinality) { this.cardinality = cardinality; } public String getCardinality() { return cardinality; } /** * WARNING: only call this method from unit tests to set the Boolean that would have been read from the xml file. * If you call this function, you must still call {@see org.apache.ambari.server.stack.ComponentModule#resolve()}. * @param versionAdvertisedField */ public void setVersionAdvertisedField(Boolean versionAdvertisedField) { this.versionAdvertisedField = versionAdvertisedField; } /** * WARNING: only call this from ComponentModule to resolve the boolean (true|false). * In all other classes, use {@seealso isVersionAdvertised} * @return The Boolean for versionAdvertised from the xml file in order to resolve it into a boolean. */ public Boolean getVersionAdvertisedField() { return this.versionAdvertisedField; } /** * WARNING: only call this from ComponentModule to resolve the boolean (true|false). * @param versionAdvertised Final resolution of whether version is advertised or not. */ public void setVersionAdvertised(boolean versionAdvertised) { this.versionAdvertisedInternal = versionAdvertised; } /** * Determine if this component advertises a version. This Boolean has already resolved to true|false depending * on explicitly overriding the value or inheriting from an ancestor. * @return boolean of whether this component advertises a version. */ public boolean isVersionAdvertised() { if (null != versionAdvertisedField) { return versionAdvertisedField.booleanValue(); } // If set to null and has a parent, then the value would have already been resolved and set. // Otherwise, return the default value (false). return this.versionAdvertisedInternal; } public String getDecommissionAllowed() { return decommissionAllowed; } public void setDecommissionAllowed(String decommissionAllowed) { this.decommissionAllowed = decommissionAllowed; } public UnlimitedKeyJCERequirement getUnlimitedKeyJCERequired() { return unlimitedKeyJCERequired; } public void setUnlimitedKeyJCERequired(UnlimitedKeyJCERequirement unlimitedKeyJCERequired) { this.unlimitedKeyJCERequired = unlimitedKeyJCERequired; } public void setRecoveryEnabled(boolean recoveryEnabled) { this.recoveryEnabled = recoveryEnabled; } public boolean isRecoveryEnabled() { return recoveryEnabled; } public List<String> getClientsToUpdateConfigs() { return clientsToUpdateConfigs; } public void setClientsToUpdateConfigs(List<String> clientsToUpdateConfigs) { this.clientsToUpdateConfigs = clientsToUpdateConfigs; } public String getTimelineAppid() { return timelineAppid; } public void setTimelineAppid(String timelineAppid) { this.timelineAppid = timelineAppid; } public String getReassignAllowed() { return reassignAllowed; } public void setReassignAllowed(String reassignAllowed) { this.reassignAllowed = reassignAllowed; } public String getCustomFolder() { return customFolder; } public void setCustomFolder(String customFolder) { this.customFolder = customFolder; } @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; ComponentInfo that = (ComponentInfo) o; if (deleted != that.deleted) return false; if (autoDeploy != null ? !autoDeploy.equals(that.autoDeploy) : that.autoDeploy != null) return false; if (cardinality != null ? !cardinality.equals(that.cardinality) : that.cardinality != null) return false; if (versionAdvertisedField != null ? !versionAdvertisedField.equals(that.versionAdvertisedField) : that.versionAdvertisedField != null) return false; if (versionAdvertisedInternal != that.versionAdvertisedInternal) return false; if (decommissionAllowed != null ? !decommissionAllowed.equals(that.decommissionAllowed) : that.decommissionAllowed != null) return false; if (unlimitedKeyJCERequired != null ? !unlimitedKeyJCERequired.equals(that.unlimitedKeyJCERequired) : that.unlimitedKeyJCERequired != null) return false; if (reassignAllowed != null ? !reassignAllowed.equals(that.reassignAllowed) : that.reassignAllowed != null) return false; if (category != null ? !category.equals(that.category) : that.category != null) return false; if (clientConfigFiles != null ? !clientConfigFiles.equals(that.clientConfigFiles) : that.clientConfigFiles != null) return false; if (commandScript != null ? !commandScript.equals(that.commandScript) : that.commandScript != null) return false; if (logs != null ? !logs.equals(that.logs) : that.logs != null) return false; if (configDependencies != null ? !configDependencies.equals(that.configDependencies) : that.configDependencies != null) return false; if (customCommands != null ? !customCommands.equals(that.customCommands) : that.customCommands != null) return false; if (bulkCommandDefinition != null ? !bulkCommandDefinition.equals(that.bulkCommandDefinition) : that.bulkCommandDefinition != null) return false; if (dependencies != null ? !dependencies.equals(that.dependencies) : that.dependencies != null) return false; if (displayName != null ? !displayName.equals(that.displayName) : that.displayName != null) return false; if (name != null ? !name.equals(that.name) : that.name != null) return false; if (clientConfigFiles != null ? !clientConfigFiles.equals(that.clientConfigFiles) : that.clientConfigFiles != null) return false; if (customFolder != null ? !customFolder.equals(that.customFolder) : that.customFolder != null) return false; return true; } @Override public int hashCode() { int result = name != null ? name.hashCode() : 0; result = 31 * result + (displayName != null ? displayName.hashCode() : 0); result = 31 * result + (category != null ? category.hashCode() : 0); result = 31 * result + (deleted ? 1 : 0); result = 31 * result + (cardinality != null ? cardinality.hashCode() : 0); result = 31 * result + (decommissionAllowed != null ? decommissionAllowed.hashCode() : 0); result = 31 * result + (unlimitedKeyJCERequired != null ? unlimitedKeyJCERequired.hashCode() : 0); result = 31 * result + (reassignAllowed != null ? reassignAllowed.hashCode() : 0); result = 31 * result + (commandScript != null ? commandScript.hashCode() : 0); result = 31 * result + (logs != null ? logs.hashCode() : 0); result = 31 * result + (clientConfigFiles != null ? clientConfigFiles.hashCode() : 0); result = 31 * result + (customCommands != null ? customCommands.hashCode() : 0); result = 31 * result + (bulkCommandDefinition != null ? bulkCommandDefinition.hashCode(): 0); result = 31 * result + (dependencies != null ? dependencies.hashCode() : 0); result = 31 * result + (autoDeploy != null ? autoDeploy.hashCode() : 0); result = 31 * result + (configDependencies != null ? configDependencies.hashCode() : 0); result = 31 * result + (clientConfigFiles != null ? clientConfigFiles.hashCode() : 0); // NULL = 0, TRUE = 2, FALSE = 1 result = 31 * result + (versionAdvertisedField != null ? (versionAdvertisedField.booleanValue() ? 2 : 1) : 0); result = 31 * result + (customFolder != null ? customFolder.hashCode() : 0); return result; } @Override public String toString() { return ToStringBuilder.reflectionToString(this, ToStringStyle.MULTI_LINE_STYLE); } }