blob: 3119fbd249cc02d32e8e5593ecce718c7c47377d [file] [log] [blame]
package org.apache.helix.model;
/*
* 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.
*/
import java.util.ArrayList;
import java.util.List;
import org.apache.helix.HelixException;
import org.apache.helix.HelixProperty;
import org.apache.helix.cloud.constants.CloudProvider;
import org.apache.helix.zookeeper.datamodel.ZNRecord;
/**
* Cloud configurations
*/
public class CloudConfig extends HelixProperty {
public static final String CLOUD_CONFIG_KW = "CloudConfig";
/**
* Configurable characteristics of a cloud.
* NOTE: Do NOT use this field name directly, use its corresponding getter/setter in the
* CloudConfig.
*/
public enum CloudConfigProperty {
CLOUD_ENABLED, // determine whether the cluster is inside cloud environment.
CLOUD_PROVIDER, // the environment the cluster is in, e.g. Azure, AWS, or Customized
CLOUD_ID, // the cloud Id that belongs to this cluster.
// If user uses Helix supported default provider, the below entries will not be shown in
// CloudConfig.
CLOUD_INFO_SOURCE, // the source for retrieving the cloud information.
CLOUD_INFO_PROCESSOR_NAME // the name of the function that processes the fetching and parsing of
// cloud information.
}
/* Default values */
private static final boolean DEFAULT_CLOUD_ENABLED = false;
/**
* Instantiate the CloudConfig for the cloud
*/
public CloudConfig() {
super(CLOUD_CONFIG_KW);
setCloudEnabled(false);
}
/**
* The constructor from the ZNRecord.
* @param record
*/
public CloudConfig(ZNRecord record) {
super(CLOUD_CONFIG_KW);
_record.setSimpleFields(record.getSimpleFields());
_record.setListFields(record.getListFields());
_record.setMapFields(record.getMapFields());
}
/**
* Instantiate the config using each field individually.
* Users should use CloudConfig.Builder to create CloudConfig.
* @param cluster
* @param enabled
* @param cloudID
*/
public CloudConfig(String cluster, boolean enabled, CloudProvider cloudProvider, String cloudID,
List<String> cloudInfoSource, String cloudProcessorName) {
super(cluster);
_record.setBooleanField(CloudConfigProperty.CLOUD_ENABLED.name(), enabled);
if (enabled == true) {
_record.setSimpleField(CloudConfigProperty.CLOUD_PROVIDER.name(), cloudProvider.name());
_record.setSimpleField(CloudConfigProperty.CLOUD_ID.name(), cloudID);
if (cloudProvider.equals(CloudProvider.CUSTOMIZED)) {
_record.setSimpleField(CloudConfigProperty.CLOUD_INFO_PROCESSOR_NAME.name(), cloudProcessorName);
_record.setListField(CloudConfigProperty.CLOUD_INFO_SOURCE.name(), cloudInfoSource);
}
}
}
/**
* Enable/Disable the CLOUD_ENABLED field.
* @param enabled
*/
public void setCloudEnabled(boolean enabled) {
_record.setBooleanField(CloudConfigProperty.CLOUD_ENABLED.name(), enabled);
}
/**
* Whether CLOUD_ENABLED field is enabled or not.
* @return
*/
public boolean isCloudEnabled() {
return _record.getBooleanField(CloudConfigProperty.CLOUD_ENABLED.name(), false);
}
/**
* Set the cloudID field.
* @param cloudID
*/
public void setCloudID(String cloudID) {
_record.setSimpleField(CloudConfigProperty.CLOUD_ID.name(), cloudID);
}
/**
* Get the CloudID field.
* @return CloudID
*/
public String getCloudID() {
return _record.getSimpleField(CloudConfigProperty.CLOUD_ID.name());
}
/**
* Set the CLOUD_INFO_SOURCE field.
* @param cloudInfoSources
*/
public void setCloudInfoSource(List<String> cloudInfoSources) {
_record.setListField(CloudConfigProperty.CLOUD_INFO_SOURCE.name(), cloudInfoSources);
}
/**
* Get the CLOUD_INFO_SOURCE field.
* @return CLOUD_INFO_SOURCE field.
*/
public List<String> getCloudInfoSources() {
return _record.getListField(CloudConfigProperty.CLOUD_INFO_SOURCE.name());
}
/**
* Get the CLOUD_INFO_PROCESSOR_NAME field.
* @return CLOUD_INFO_PROCESSOR_NAME field.
*/
public String getCloudInfoProcessorName() {
return _record.getSimpleField(CloudConfigProperty.CLOUD_INFO_PROCESSOR_NAME.name());
}
/**
* Get the CLOUD_PROVIDER field.
* @return CLOUD_PROVIDER field.
*/
public String getCloudProvider() {
return _record.getSimpleField(CloudConfigProperty.CLOUD_PROVIDER.name());
}
public static class Builder {
private ZNRecord _record;
public CloudConfig build() {
validate();
return new CloudConfig(_record);
}
/**
* Default constructor
*/
public Builder() {
_record = new ZNRecord(CLOUD_CONFIG_KW);
}
/**
* Instantiate with a pre-populated record
* @param record a ZNRecord corresponding to a cloud configuration
*/
public Builder(ZNRecord record) {
_record = record;
}
/**
* Constructor with CloudConfig as input
* @param cloudConfig
*/
public Builder(CloudConfig cloudConfig) {
_record = cloudConfig.getRecord();
}
public Builder setCloudEnabled(boolean isEnabled) {
_record.setBooleanField(CloudConfigProperty.CLOUD_ENABLED.name(), isEnabled);
return this;
}
public Builder setCloudProvider(CloudProvider cloudProvider) {
_record.setSimpleField(CloudConfigProperty.CLOUD_PROVIDER.name(), cloudProvider.name());
return this;
}
public Builder setCloudID(String cloudID) {
_record.setSimpleField(CloudConfigProperty.CLOUD_ID.name(), cloudID);
return this;
}
public Builder setCloudInfoSources(List<String> cloudInfoSources) {
_record.setListField(CloudConfigProperty.CLOUD_INFO_SOURCE.name(), cloudInfoSources);
return this;
}
public Builder addCloudInfoSource(String cloudInfoSource) {
if (_record.getListField(CloudConfigProperty.CLOUD_INFO_SOURCE.name()) == null) {
_record.setListField(CloudConfigProperty.CLOUD_INFO_SOURCE.name(), new ArrayList<String>());
}
List<String> cloudInfoSourcesList = _record.getListField(CloudConfigProperty.CLOUD_INFO_SOURCE.name());
cloudInfoSourcesList.add(cloudInfoSource);
_record.setListField(CloudConfigProperty.CLOUD_INFO_SOURCE.name(), cloudInfoSourcesList);
return this;
}
public Builder setCloudInfoProcessorName(String cloudInfoProcessorName) {
_record.setSimpleField(CloudConfigProperty.CLOUD_INFO_PROCESSOR_NAME.name(),
cloudInfoProcessorName);
return this;
}
public String getCloudProvider() {
return _record.getSimpleField(CloudConfigProperty.CLOUD_PROVIDER.name());
}
public boolean getCloudEnabled() {
return _record.getBooleanField(CloudConfigProperty.CLOUD_ENABLED.name(),
DEFAULT_CLOUD_ENABLED);
}
public String getCloudID() {
return _record.getSimpleField(CloudConfigProperty.CLOUD_ID.name());
}
public List<String> getCloudInfoSources() {
return _record.getListField(CloudConfigProperty.CLOUD_INFO_SOURCE.name());
}
public String getCloudInfoProcessorName() {
return _record.getSimpleField(CloudConfigProperty.CLOUD_INFO_PROCESSOR_NAME.name());
}
private void validate() {
if (this.getCloudEnabled()) {
if (this.getCloudProvider() == null) {
throw new HelixException(
"This Cloud Configuration is Invalid. The Cloud Provider is missing from the config.");
} else if (this.getCloudProvider().equals(CloudProvider.CUSTOMIZED.name())) {
if (this.getCloudInfoProcessorName() == null || this.getCloudInfoSources() == null
|| this.getCloudInfoSources().size() == 0) {
throw new HelixException(
"This Cloud Configuration is Invalid. CUSTOMIZED provider has been chosen without defining CloudInfoProcessorName or CloudInfoSources");
}
}
}
}
}
}