blob: 148ab7158ff052974679c6b758deab4a0f3ba13d [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.net.URI;
import java.net.URISyntaxException;
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.common.DataObjectBuilder;
import org.apache.cassandra.sidecar.config.CacheConfiguration;
import org.apache.cassandra.sidecar.config.CassandraInputValidationConfiguration;
import org.apache.cassandra.sidecar.config.DriverConfiguration;
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.TrafficShapingConfiguration;
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 = "driver_parameters")
protected final DriverConfiguration driverConfiguration;
@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(builder());
}
protected SidecarConfigurationImpl(Builder builder)
{
cassandraInstance = builder.cassandraInstance;
cassandraInstances = builder.cassandraInstances;
serviceConfiguration = builder.serviceConfiguration;
sslConfiguration = builder.sslConfiguration;
healthCheckConfiguration = builder.healthCheckConfiguration;
cassandraInputValidationConfiguration = builder.cassandraInputValidationConfiguration;
driverConfiguration = builder.driverConfiguration;
}
/**
* @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;
}
@Override
@JsonProperty("driver_parameters")
public DriverConfiguration driverConfiguration()
{
return driverConfiguration;
}
/**
* @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
{
try
{
return readYamlConfiguration(Paths.get(new URI(yamlConfigurationPath)));
}
catch (URISyntaxException e)
{
throw new IOException("Invalid URI: " + yamlConfigurationPath, e);
}
}
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)
.addAbstractTypeMapping(TrafficShapingConfiguration.class,
TrafficShapingConfigurationImpl.class)
.addAbstractTypeMapping(DriverConfiguration.class,
DriverConfigurationImpl.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);
}
public static Builder builder()
{
return new Builder();
}
/**
* {@code SidecarConfigurationImpl} builder static inner class.
*/
public static class Builder implements DataObjectBuilder<Builder, SidecarConfigurationImpl>
{
private InstanceConfiguration cassandraInstance;
private List<InstanceConfiguration> cassandraInstances;
private ServiceConfiguration serviceConfiguration = new ServiceConfigurationImpl();
private SslConfiguration sslConfiguration = null;
private HealthCheckConfiguration healthCheckConfiguration = new HealthCheckConfigurationImpl();
private CassandraInputValidationConfiguration cassandraInputValidationConfiguration
= new CassandraInputValidationConfigurationImpl();
private DriverConfiguration driverConfiguration = new DriverConfigurationImpl();
protected Builder()
{
}
@Override
public Builder self()
{
return this;
}
/**
* Sets the {@code cassandraInstance} and returns a reference to this Builder enabling method chaining.
*
* @param cassandraInstance the {@code cassandraInstance} to set
* @return a reference to this Builder
*/
public Builder cassandraInstance(InstanceConfiguration cassandraInstance)
{
return update(b -> b.cassandraInstance = cassandraInstance);
}
/**
* Sets the {@code cassandraInstances} and returns a reference to this Builder enabling method chaining.
*
* @param cassandraInstances the {@code cassandraInstances} to set
* @return a reference to this Builder
*/
public Builder cassandraInstances(List<InstanceConfiguration> cassandraInstances)
{
return update(b -> b.cassandraInstances = cassandraInstances);
}
/**
* Sets the {@code serviceConfiguration} and returns a reference to this Builder enabling method chaining.
*
* @param serviceConfiguration the {@code serviceConfiguration} to set
* @return a reference to this Builder
*/
public Builder serviceConfiguration(ServiceConfiguration serviceConfiguration)
{
return update(b -> b.serviceConfiguration = serviceConfiguration);
}
/**
* Sets the {@code sslConfiguration} and returns a reference to this Builder enabling method chaining.
*
* @param sslConfiguration the {@code sslConfiguration} to set
* @return a reference to this Builder
*/
public Builder sslConfiguration(SslConfiguration sslConfiguration)
{
return update(b -> b.sslConfiguration = sslConfiguration);
}
/**
* Sets the {@code healthCheckConfiguration} and returns a reference to this Builder enabling method chaining.
*
* @param healthCheckConfiguration the {@code healthCheckConfiguration} to set
* @return a reference to this Builder
*/
public Builder healthCheckConfiguration(HealthCheckConfiguration healthCheckConfiguration)
{
return update(b -> b.healthCheckConfiguration = healthCheckConfiguration);
}
/**
* Sets the {@code driverConfiguration} and returns a reference to this Builder enabling
* method chaining.
*
* @param driverConfiguration the {@code driverConfiguration} to set
* @return a reference to this Builder
*/
public Builder driverConfiguration(DriverConfiguration driverConfiguration)
{
return update(b -> b.driverConfiguration = driverConfiguration);
}
/**
* Sets the {@code cassandraInputValidationConfiguration} and returns a reference to this Builder enabling
* method chaining.
*
* @param configuration the {@code cassandraInputValidationConfiguration} to set
* @return a reference to this Builder
*/
public Builder cassandraInputValidationConfiguration(CassandraInputValidationConfiguration configuration)
{
return update(b -> b.cassandraInputValidationConfiguration = configuration);
}
/**
* Returns a {@code SidecarConfigurationImpl} built from the parameters previously set.
*
* @return a {@code SidecarConfigurationImpl} built with parameters of this
* {@code SidecarConfigurationImpl.Builder}
*/
@Override
public SidecarConfigurationImpl build()
{
return new SidecarConfigurationImpl(this);
}
}
}