/**
* 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.stack.upgrade;
import java.util.Map;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlEnum;
import javax.xml.bind.annotation.XmlEnumValue;
import javax.xml.bind.annotation.XmlType;
import org.apache.ambari.server.state.Cluster;
import org.apache.ambari.server.state.Config;
import org.apache.ambari.server.state.UpgradeContext;
import org.apache.commons.lang.StringUtils;
import com.google.common.base.Objects;
/**
* The {@link ConfigurationCondition} class is used to represent a condition on
* a property.
*/
@XmlType(name = "config")
@XmlAccessorType(XmlAccessType.FIELD)
public final class ConfigurationCondition extends Condition {
/**
* The type of comparison to make.
*/
@XmlEnum
public enum ComparisonType {
/**
* Equals comparison.
*/
@XmlEnumValue("equals")
EQUALS,
/**
* Not equals comparison.
*/
@XmlEnumValue("not-equals")
NOT_EQUALS,
/**
* String contains.
*/
@XmlEnumValue("contains")
CONTAINS,
/**
* Does not contain.
*/
@XmlEnumValue("not-contains")
NOT_CONTAINS,
/**
* Exists with any value.
*/
@XmlEnumValue("exists")
EXISTS,
/**
* Does not exist.
*/
@XmlEnumValue("not-exists")
NOT_EXISTS;
}
/**
* The configuration type, such as {@code hdfs-site}.
*/
@XmlAttribute(name = "type")
public String type;
/**
* The configuration property key.
*/
@XmlAttribute(name = "property")
public String property;
/**
* The value to compare against; only valid if comparison type is in (=, !=, contains, !contains).
*/
@XmlAttribute(name = "value")
public String value;
/**
* The value to return if comparison type is in (=, !=, contains, !contains) and the config is missing.
*/
@XmlAttribute(name = "return_value_if_config_missing")
public boolean returnValueIfConfigMissing;
/**
* The type of comparison to make.
*/
@XmlAttribute(name = "comparison")
public ComparisonType comparisonType;
/**
* {@inheritDoc}
*/
@Override
public String toString() {
return Objects.toStringHelper(this).add("type", type).add("property", property).add("value",
value).add("comparison", comparisonType).omitNullValues().toString();
}
/**
* {@inheritDoc}
*/
@Override
public boolean isSatisfied(UpgradeContext upgradeContext) {
Cluster cluster = upgradeContext.getCluster();
boolean propertyExists = false;
Config config = cluster.getDesiredConfigByType(type);
Map<String, String> properties = null;
if (null != config) {
properties = config.getProperties();
if (properties.containsKey(property)) {
propertyExists = true;
}
}
if (comparisonType == ComparisonType.EXISTS) {
return propertyExists;
}
if (comparisonType == ComparisonType.NOT_EXISTS) {
return !propertyExists;
}
// If property doesn't exist, we cannot make any claims using =, !=, contains !contains.
// Therefore, check if the Upgrade Pack provided a default return value when the config is missing.
if (!propertyExists) {
return returnValueIfConfigMissing;
}
String propertyValue = properties.get(property);
switch (comparisonType) {
case EQUALS:
return StringUtils.equals(propertyValue, value);
case NOT_EQUALS:
return !StringUtils.equals(propertyValue, value);
case CONTAINS:
return StringUtils.contains(propertyValue, value);
case NOT_CONTAINS:
return !StringUtils.contains(propertyValue, value);
default:
return false;
}
}
}