blob: 8ee8c374b118848ff35e0efad8f5d806923e4235 [file] [log] [blame]
/*
* 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.cassandra.sidecar.config.yaml;
import java.io.IOException;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Collections;
import java.util.List;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.module.SimpleModule;
import com.fasterxml.jackson.dataformat.yaml.YAMLFactory;
import org.apache.cassandra.sidecar.config.CacheConfiguration;
import org.apache.cassandra.sidecar.config.CassandraInputValidationConfiguration;
import org.apache.cassandra.sidecar.config.HealthCheckConfiguration;
import org.apache.cassandra.sidecar.config.InstanceConfiguration;
import org.apache.cassandra.sidecar.config.JmxConfiguration;
import org.apache.cassandra.sidecar.config.KeyStoreConfiguration;
import org.apache.cassandra.sidecar.config.SSTableImportConfiguration;
import org.apache.cassandra.sidecar.config.SSTableUploadConfiguration;
import org.apache.cassandra.sidecar.config.ServiceConfiguration;
import org.apache.cassandra.sidecar.config.SidecarConfiguration;
import org.apache.cassandra.sidecar.config.SslConfiguration;
import org.apache.cassandra.sidecar.config.ThrottleConfiguration;
import org.apache.cassandra.sidecar.config.WorkerPoolConfiguration;
/**
* Configuration for this Sidecar process
*/
public class SidecarConfigurationImpl implements SidecarConfiguration
{
@Deprecated
@JsonProperty(value = "cassandra")
protected final InstanceConfiguration cassandraInstance;
@JsonProperty(value = "cassandra_instances")
protected final List<InstanceConfiguration> cassandraInstances;
@JsonProperty(value = "sidecar", required = true)
protected final ServiceConfiguration serviceConfiguration;
@JsonProperty("ssl")
protected final SslConfiguration sslConfiguration;
@JsonProperty("healthcheck")
protected final HealthCheckConfiguration healthCheckConfiguration;
@JsonProperty("cassandra_input_validation")
protected final CassandraInputValidationConfiguration cassandraInputValidationConfiguration;
public SidecarConfigurationImpl()
{
this(Collections.emptyList(),
new ServiceConfigurationImpl(),
null /* sslConfiguration */,
new HealthCheckConfigurationImpl(),
new CassandraInputValidationConfigurationImpl());
}
public SidecarConfigurationImpl(ServiceConfiguration serviceConfiguration)
{
this(Collections.emptyList(),
serviceConfiguration,
null /* sslConfiguration */,
new HealthCheckConfigurationImpl(),
new CassandraInputValidationConfigurationImpl());
}
public SidecarConfigurationImpl(ServiceConfiguration serviceConfiguration,
SslConfiguration sslConfiguration,
HealthCheckConfiguration healthCheckConfiguration)
{
this(Collections.emptyList(),
serviceConfiguration,
sslConfiguration,
healthCheckConfiguration,
new CassandraInputValidationConfigurationImpl());
}
public SidecarConfigurationImpl(List<InstanceConfiguration> cassandraInstances,
ServiceConfiguration serviceConfiguration,
SslConfiguration sslConfiguration,
HealthCheckConfiguration healthCheckConfiguration,
CassandraInputValidationConfiguration cassandraInputValidationConfiguration)
{
this.cassandraInstance = null;
this.cassandraInstances = Collections.unmodifiableList(cassandraInstances);
this.serviceConfiguration = serviceConfiguration;
this.sslConfiguration = sslConfiguration;
this.healthCheckConfiguration = healthCheckConfiguration;
this.cassandraInputValidationConfiguration = cassandraInputValidationConfiguration;
}
/**
* @return a single configured cassandra instance
* @deprecated in favor of configuring multiple instances in the yaml under cassandra_instances
*/
@Override
@JsonProperty(value = "cassandra")
@Deprecated
public InstanceConfiguration cassandra()
{
return cassandraInstance;
}
/**
* @return the configured Cassandra instances that this Sidecar manages
*/
@Override
@JsonProperty(value = "cassandra_instances")
public List<InstanceConfiguration> cassandraInstances()
{
if (cassandraInstance != null)
{
return Collections.singletonList(cassandraInstance);
}
else if (cassandraInstances != null && !cassandraInstances.isEmpty())
{
return Collections.unmodifiableList(cassandraInstances);
}
return Collections.emptyList();
}
/**
* @return the configuration of the REST Services
*/
@Override
@JsonProperty(value = "sidecar", required = true)
public ServiceConfiguration serviceConfiguration()
{
return serviceConfiguration;
}
/**
* @return the SSL configuration
*/
@Override
@JsonProperty("ssl")
public SslConfiguration sslConfiguration()
{
return sslConfiguration;
}
/**
* @return the configuration for the health check service
*/
@Override
@JsonProperty("healthcheck")
public HealthCheckConfiguration healthCheckConfiguration()
{
return healthCheckConfiguration;
}
/**
* @return the configuration for Cassandra input validation
*/
@Override
@JsonProperty("cassandra_input_validation")
public CassandraInputValidationConfiguration cassandraInputValidationConfiguration()
{
return cassandraInputValidationConfiguration;
}
public static SidecarConfigurationImpl readYamlConfiguration(String yamlConfigurationPath) throws IOException
{
return readYamlConfiguration(Paths.get(yamlConfigurationPath));
}
public static SidecarConfigurationImpl readYamlConfiguration(Path yamlConfigurationPath) throws IOException
{
SimpleModule simpleModule = new SimpleModule()
.addAbstractTypeMapping(CacheConfiguration.class,
CacheConfigurationImpl.class)
.addAbstractTypeMapping(CassandraInputValidationConfiguration.class,
CassandraInputValidationConfigurationImpl.class)
.addAbstractTypeMapping(HealthCheckConfiguration.class,
HealthCheckConfigurationImpl.class)
.addAbstractTypeMapping(InstanceConfiguration.class,
InstanceConfigurationImpl.class)
.addAbstractTypeMapping(KeyStoreConfiguration.class,
KeyStoreConfigurationImpl.class)
.addAbstractTypeMapping(SSTableImportConfiguration.class,
SSTableImportConfigurationImpl.class)
.addAbstractTypeMapping(SSTableUploadConfiguration.class,
SSTableUploadConfigurationImpl.class)
.addAbstractTypeMapping(ServiceConfiguration.class,
ServiceConfigurationImpl.class)
.addAbstractTypeMapping(SidecarConfiguration.class,
SidecarConfigurationImpl.class)
.addAbstractTypeMapping(SslConfiguration.class,
SslConfigurationImpl.class)
.addAbstractTypeMapping(ThrottleConfiguration.class,
ThrottleConfigurationImpl.class)
.addAbstractTypeMapping(WorkerPoolConfiguration.class,
WorkerPoolConfigurationImpl.class)
.addAbstractTypeMapping(JmxConfiguration.class,
JmxConfigurationImpl.class);
ObjectMapper mapper = new ObjectMapper(new YAMLFactory())
.configure(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY, true)
.configure(DeserializationFeature.UNWRAP_SINGLE_VALUE_ARRAYS, true)
.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)
.registerModule(simpleModule);
return mapper.readValue(yamlConfigurationPath.toFile(), SidecarConfigurationImpl.class);
}
}