下面列出了org.springframework.boot.context.properties.source.MapConfigurationPropertySource#io.fabric8.kubernetes.api.model.VolumeMount 实例代码,或者点击链接到github查看源代码,也可以在右侧发表评论。
private List<VolumeMount> getVolumeMounts(ResourceConfig config) {
List<VolumeConfig> volumeConfigs = config.getVolumes();
List<VolumeMount> ret = new ArrayList<>();
if (volumeConfigs != null) {
for (VolumeConfig volumeConfig : volumeConfigs) {
List<String> mounts = volumeConfig.getMounts();
if (mounts != null) {
for (String mount : mounts) {
ret.add(new VolumeMountBuilder()
.withName(volumeConfig.getName())
.withMountPath(mount)
.withReadOnly(false).build());
}
}
}
}
return ret;
}
@Test
public void shouldNotHaveSecretsMountIfNoSecret() {
Pod pod = createPod(
WORKFLOW_INSTANCE,
DockerRunner.RunSpec.simple("eid", "busybox"), EMPTY_SECRET_SPEC);
List<Volume> volumes = pod.getSpec().getVolumes();
List<Container> containers = pod.getSpec().getContainers();
assertThat(volumes.size(), is(0));
assertThat(containers.size(), is(2));
assertThat(containers.get(0).getName(), is(MAIN_CONTAINER_NAME));
Container container = containers.get(0);
List<VolumeMount> volumeMounts = container.getVolumeMounts();
assertThat(volumeMounts.size(), is(0));
}
/**
* Generates volume mounts needed for certificates needed to connect to OAuth server.
* This is used in both OAuth servers and clients.
*
* @param volumeNamePrefix Prefix which was used to name the secret volumes
* @param trustedCertificates List of certificates which should be mounted
* @param baseVolumeMount The Base volume into which the certificates should be mounted
*
* @return List of new VolumeMounts
*/
public static List<VolumeMount> configureOauthCertificateVolumeMounts(String volumeNamePrefix, List<CertSecretSource> trustedCertificates, String baseVolumeMount) {
List<VolumeMount> newVolumeMounts = new ArrayList<>();
if (trustedCertificates != null && trustedCertificates.size() > 0) {
int i = 0;
for (CertSecretSource certSecretSource : trustedCertificates) {
String volumeName = String.format("%s-%d", volumeNamePrefix, i);
newVolumeMounts.add(VolumeUtils.createVolumeMount(volumeName, String.format("%s/%s-%d", baseVolumeMount, certSecretSource.getSecretName(), i)));
i++;
}
}
return newVolumeMounts;
}
protected List<VolumeMount> getVolumeMounts() {
List<VolumeMount> volumeMountList = new ArrayList<>(1);
volumeMountList.add(VolumeUtils.createVolumeMount(logAndMetricsConfigVolumeName, logAndMetricsConfigMountPath));
if (tls != null) {
List<CertSecretSource> trustedCertificates = tls.getTrustedCertificates();
if (trustedCertificates != null && trustedCertificates.size() > 0) {
for (CertSecretSource certSecretSource : trustedCertificates) {
// skipping if a volume mount with same Secret name was already added
if (!volumeMountList.stream().anyMatch(vm -> vm.getName().equals(certSecretSource.getSecretName()))) {
volumeMountList.add(VolumeUtils.createVolumeMount(certSecretSource.getSecretName(),
TLS_CERTS_BASE_VOLUME_MOUNT + certSecretSource.getSecretName()));
}
}
}
}
AuthenticationUtils.configureClientAuthenticationVolumeMounts(authentication, volumeMountList, TLS_CERTS_BASE_VOLUME_MOUNT, PASSWORD_VOLUME_MOUNT, OAUTH_TLS_CERTS_BASE_VOLUME_MOUNT, "oauth-certs");
return volumeMountList;
}
protected List<VolumeMount> getVolumeMounts() {
List<VolumeMount> volumeMountList = new ArrayList<>(1);
volumeMountList.add(VolumeUtils.createVolumeMount(logAndMetricsConfigVolumeName, logAndMetricsConfigMountPath));
if (tls != null) {
List<CertSecretSource> trustedCertificates = tls.getTrustedCertificates();
if (trustedCertificates != null && trustedCertificates.size() > 0) {
for (CertSecretSource certSecretSource : trustedCertificates) {
// skipping if a volume mount with same Secret name was already added
if (!volumeMountList.stream().anyMatch(vm -> vm.getName().equals(certSecretSource.getSecretName()))) {
volumeMountList.add(VolumeUtils.createVolumeMount(certSecretSource.getSecretName(),
TLS_CERTS_BASE_VOLUME_MOUNT + certSecretSource.getSecretName()));
}
}
}
}
AuthenticationUtils.configureClientAuthenticationVolumeMounts(authentication, volumeMountList, TLS_CERTS_BASE_VOLUME_MOUNT, PASSWORD_VOLUME_MOUNT, OAUTH_TLS_CERTS_BASE_VOLUME_MOUNT, "oauth-certs");
volumeMountList.addAll(getExternalConfigurationVolumeMounts());
return volumeMountList;
}
private List<VolumeMount> getExternalConfigurationVolumeMounts() {
List<VolumeMount> volumeMountList = new ArrayList<>(0);
for (ExternalConfigurationVolumeSource volume : externalVolumes) {
String name = volume.getName();
if (name != null) {
if (volume.getConfigMap() != null && volume.getSecret() != null) {
log.warn("Volume {} with external Kafka Connect configuration has to contain exactly one volume source reference to either ConfigMap or Secret", name);
} else if (volume.getConfigMap() != null || volume.getSecret() != null) {
VolumeMount volumeMount = new VolumeMountBuilder()
.withName(EXTERNAL_CONFIGURATION_VOLUME_NAME_PREFIX + name)
.withMountPath(EXTERNAL_CONFIGURATION_VOLUME_MOUNT_BASE_PATH + name)
.build();
volumeMountList.add(volumeMount);
}
}
}
return volumeMountList;
}
@Test
public void testNoExternalConfigurationVolumes() {
ExternalConfigurationVolumeSource volume = new ExternalConfigurationVolumeSourceBuilder()
.withName("my-volume")
.build();
KafkaConnect resource = new KafkaConnectBuilder(this.resource)
.editSpec()
.withNewExternalConfiguration()
.withVolumes(volume)
.endExternalConfiguration()
.endSpec()
.build();
KafkaConnectCluster kc = KafkaConnectCluster.fromCrd(resource, VERSIONS);
// Check Deployment
Deployment dep = kc.generateDeployment(emptyMap(), true, null, null);
List<Volume> volumes = dep.getSpec().getTemplate().getSpec().getVolumes();
List<Volume> selected = volumes.stream().filter(vol -> vol.getName().equals(KafkaConnectCluster.EXTERNAL_CONFIGURATION_VOLUME_NAME_PREFIX + "my-volume")).collect(Collectors.toList());
assertThat(selected.size(), is(0));
List<VolumeMount> volumeMounths = dep.getSpec().getTemplate().getSpec().getContainers().get(0).getVolumeMounts();
List<VolumeMount> selectedVolumeMounths = volumeMounths.stream().filter(vol -> vol.getName().equals(KafkaConnectCluster.EXTERNAL_CONFIGURATION_VOLUME_NAME_PREFIX + "my-volume")).collect(Collectors.toList());
assertThat(selected.size(), is(0));
}
@Test
public void testNoExternalConfigurationVolumes() {
ExternalConfigurationVolumeSource volume = new ExternalConfigurationVolumeSourceBuilder()
.withName("my-volume")
.build();
KafkaMirrorMaker2 resource = new KafkaMirrorMaker2Builder(this.resource)
.editSpec()
.withNewExternalConfiguration()
.withVolumes(volume)
.endExternalConfiguration()
.endSpec()
.build();
KafkaMirrorMaker2Cluster kmm2 = KafkaMirrorMaker2Cluster.fromCrd(resource, VERSIONS);
// Check Deployment
Deployment dep = kmm2.generateDeployment(emptyMap(), true, null, null);
List<Volume> volumes = dep.getSpec().getTemplate().getSpec().getVolumes();
List<Volume> selected = volumes.stream().filter(vol -> vol.getName().equals(KafkaMirrorMaker2Cluster.EXTERNAL_CONFIGURATION_VOLUME_NAME_PREFIX + "my-volume")).collect(Collectors.toList());
assertThat(selected.size(), is(0));
List<VolumeMount> volumeMounths = getContainer(dep).getVolumeMounts();
List<VolumeMount> selectedVolumeMounths = volumeMounths.stream().filter(vol -> vol.getName().equals(KafkaMirrorMaker2Cluster.EXTERNAL_CONFIGURATION_VOLUME_NAME_PREFIX + "my-volume")).collect(Collectors.toList());
assertThat(selected.size(), is(0));
}
@Test
public void testNoExternalConfigurationVolumes() {
ExternalConfigurationVolumeSource volume = new ExternalConfigurationVolumeSourceBuilder()
.withName("my-volume")
.build();
KafkaConnectS2I resource = new KafkaConnectS2IBuilder(this.resource)
.editSpec()
.withNewExternalConfiguration()
.withVolumes(volume)
.endExternalConfiguration()
.endSpec()
.build();
KafkaConnectS2ICluster kc = KafkaConnectS2ICluster.fromCrd(resource, VERSIONS);
// Check Deployment
DeploymentConfig dep = kc.generateDeploymentConfig(Collections.EMPTY_MAP, true, null, null);
List<Volume> volumes = dep.getSpec().getTemplate().getSpec().getVolumes();
List<Volume> selected = volumes.stream().filter(vol -> vol.getName().equals(KafkaConnectCluster.EXTERNAL_CONFIGURATION_VOLUME_NAME_PREFIX + "my-volume")).collect(Collectors.toList());
assertThat(selected.size(), is(0));
List<VolumeMount> volumeMounths = dep.getSpec().getTemplate().getSpec().getContainers().get(0).getVolumeMounts();
List<VolumeMount> selectedVolumeMounths = volumeMounths.stream().filter(vol -> vol.getName().equals(KafkaConnectCluster.EXTERNAL_CONFIGURATION_VOLUME_NAME_PREFIX + "my-volume")).collect(Collectors.toList());
assertThat(selected.size(), is(0));
}
private void mountConfigFile(PodSpec podSpec, String gitConfigMapName, boolean addVolume) {
if (addVolume) {
podSpec
.getVolumes()
.add(
new VolumeBuilder()
.withName(CONFIG_MAP_VOLUME_NAME)
.withConfigMap(
new ConfigMapVolumeSourceBuilder().withName(gitConfigMapName).build())
.build());
}
List<Container> containers = podSpec.getContainers();
containers.forEach(
container -> {
VolumeMount volumeMount =
new VolumeMountBuilder()
.withName(CONFIG_MAP_VOLUME_NAME)
.withMountPath(GIT_CONFIG_PATH)
.withSubPath(GIT_CONFIG)
.withReadOnly(false)
.withNewReadOnly(false)
.build();
container.getVolumeMounts().add(volumeMount);
});
}
@Test
public void shouldPrefixVolumeMountsSubpathsAndUsePvcNameAsVolumeName() {
// when
subpathPrefixes.prefixVolumeMountsSubpaths(k8sEnv, WORKSPACE_ID);
// then
PodSpec podSpec = k8sEnv.getPodsData().get(POD_1_NAME).getSpec();
io.fabric8.kubernetes.api.model.Volume userPodVolume = podSpec.getVolumes().get(0);
assertEquals(userPodVolume.getPersistentVolumeClaim().getClaimName(), USER_DATA_PVC_NAME);
assertEquals(
podSpec.getVolumes().get(0).getPersistentVolumeClaim().getClaimName(), USER_DATA_PVC_NAME);
Container initContainer = podSpec.getInitContainers().get(0);
VolumeMount initVolumeMount = initContainer.getVolumeMounts().get(0);
assertEquals(
initVolumeMount.getSubPath(),
WORKSPACE_ID + "/" + USER_DATA_PVC_NAME + "/tmp/init/userData");
assertEquals(initVolumeMount.getName(), userPodVolume.getName());
Container container = podSpec.getContainers().get(0);
VolumeMount volumeMount = container.getVolumeMounts().get(0);
assertEquals(
volumeMount.getSubPath(), WORKSPACE_ID + "/" + USER_DATA_PVC_NAME + "/home/user/data");
assertEquals(volumeMount.getName(), userPodVolume.getName());
}
@Test
public void shouldNotPrefixNotPVCSourcesVolumes() {
// given
Volume podVolume = pod.getSpec().getVolumes().get(0);
podVolume.setPersistentVolumeClaim(null);
podVolume.setConfigMap(new ConfigMapVolumeSourceBuilder().withName("configMap").build());
// when
subpathPrefixes.prefixVolumeMountsSubpaths(k8sEnv, WORKSPACE_ID);
// then
PodSpec podSpec = k8sEnv.getPodsData().get(POD_1_NAME).getSpec();
io.fabric8.kubernetes.api.model.Volume podDataVolume = podSpec.getVolumes().get(0);
Container initContainer = podSpec.getInitContainers().get(0);
VolumeMount initVolumeMount = initContainer.getVolumeMounts().get(0);
assertEquals(initVolumeMount.getSubPath(), "/tmp/init/userData");
assertEquals(initVolumeMount.getName(), podDataVolume.getName());
Container container = podSpec.getContainers().get(0);
VolumeMount volumeMount = container.getVolumeMounts().get(0);
assertEquals(volumeMount.getSubPath(), "/home/user/data");
assertEquals(volumeMount.getName(), podDataVolume.getName());
}
@Test
public void shouldCombineAllPodMounts() {
VolumeMount vm1 = new VolumeMountBuilder().withMountPath("/host/mnt1").withName("volume-1").withReadOnly(false)
.build();
VolumeMount vm2 = new VolumeMountBuilder().withMountPath("/host/mnt2").withName("volume-2").withReadOnly(false)
.build();
VolumeMount vm3 = new VolumeMountBuilder().withMountPath("/host/mnt3").withName("volume-3").withReadOnly(false)
.build();
VolumeMount vm4 = new VolumeMountBuilder().withMountPath("/host/mnt1").withName("volume-4").withReadOnly(false)
.build();
Container container1 = containerBuilder().withName("jnlp").withVolumeMounts(vm1, vm2).build();
Pod pod1 = podBuilder().withContainers(container1).endSpec().build();
Container container2 = containerBuilder().withName("jnlp").withVolumeMounts(vm3, vm4).build();
Pod pod2 = podBuilder().withContainers(container2).endSpec().build();
Pod result = combine(pod1, pod2);
List<Container> containers = result.getSpec().getContainers();
assertEquals(1, containers.size());
assertEquals(3, containers.get(0).getVolumeMounts().size());
assertThat(containers.get(0).getVolumeMounts(), containsInAnyOrder(vm2, vm3, vm4));
}
@Test
@Issue("JENKINS-50525")
public void testBuildWithCustomWorkspaceVolume() throws Exception {
PodTemplate template = new PodTemplate();
template.setWorkspaceVolume(new EmptyDirWorkspaceVolume(true));
ContainerTemplate containerTemplate = new ContainerTemplate("name", "image");
containerTemplate.setWorkingDir("");
template.getContainers().add(containerTemplate);
setupStubs();
Pod pod = new PodTemplateBuilder(template).withSlave(slave).build();
List<Container> containers = pod.getSpec().getContainers();
assertEquals(2, containers.size());
Container container0 = containers.get(0);
Container container1 = containers.get(1);
ImmutableList<VolumeMount> volumeMounts = ImmutableList.of(new VolumeMountBuilder()
.withMountPath("/home/jenkins/agent").withName("workspace-volume").withReadOnly(false).build());
assertEquals(volumeMounts, container0.getVolumeMounts());
assertEquals(volumeMounts, container1.getVolumeMounts());
assertEquals("Memory", pod.getSpec().getVolumes().get(0).getEmptyDir().getMedium());
}
@Test
public void testBuildWithDynamicPVCWorkspaceVolume(){
PodTemplate template = new PodTemplate();
template.setWorkspaceVolume(new DynamicPVCWorkspaceVolume(
null, null,null));
ContainerTemplate containerTemplate = new ContainerTemplate("name", "image");
containerTemplate.setWorkingDir("");
template.getContainers().add(containerTemplate);
setupStubs();
Pod pod = new PodTemplateBuilder(template).withSlave(slave).build();
List<Container> containers = pod.getSpec().getContainers();
assertEquals(2, containers.size());
Container container0 = containers.get(0);
Container container1 = containers.get(1);
ImmutableList<VolumeMount> volumeMounts = ImmutableList.of(new VolumeMountBuilder()
.withMountPath("/home/jenkins/agent").withName("workspace-volume").withReadOnly(false).build());
assertEquals(volumeMounts, container0.getVolumeMounts());
assertEquals(volumeMounts, container1.getVolumeMounts());
assertNotNull(pod.getSpec().getVolumes().get(0).getPersistentVolumeClaim());
}
@Test
public void testMainContainerWithHadoopConfVolumeMount() throws IOException {
setHadoopConfDirEnv();
generateHadoopConfFileItems();
final FlinkPod resultFlinkPod = hadoopConfMountDecorator.decorateFlinkPod(baseFlinkPod);
final List<VolumeMount> resultVolumeMounts = resultFlinkPod.getMainContainer().getVolumeMounts();
assertEquals(1, resultVolumeMounts.size());
final VolumeMount resultVolumeMount = resultVolumeMounts.get(0);
assertEquals(Constants.HADOOP_CONF_VOLUME, resultVolumeMount.getName());
assertEquals(Constants.HADOOP_CONF_DIR_IN_POD, resultVolumeMount.getMountPath());
final Map<String, String> expectedEnvs = new HashMap<String, String>() {
{
put(Constants.ENV_HADOOP_CONF_DIR, Constants.HADOOP_CONF_DIR_IN_POD);
}
};
final Map<String, String> resultEnvs = resultFlinkPod.getMainContainer().getEnv()
.stream().collect(Collectors.toMap(EnvVar::getName, EnvVar::getValue));
assertEquals(expectedEnvs, resultEnvs);
}
@Test
public void testDecoratedFlinkPodWithoutLog4jAndLogback() {
final FlinkPod resultFlinkPod = flinkConfMountDecorator.decorateFlinkPod(baseFlinkPod);
final List<KeyToPath> expectedKeyToPaths = Collections.singletonList(
new KeyToPathBuilder()
.withKey(FLINK_CONF_FILENAME)
.withPath(FLINK_CONF_FILENAME)
.build());
final List<Volume> expectedVolumes = Collections.singletonList(
new VolumeBuilder()
.withName(Constants.FLINK_CONF_VOLUME)
.withNewConfigMap()
.withName(getFlinkConfConfigMapName(CLUSTER_ID))
.withItems(expectedKeyToPaths)
.endConfigMap()
.build());
assertEquals(expectedVolumes, resultFlinkPod.getPod().getSpec().getVolumes());
final List<VolumeMount> expectedVolumeMounts = Collections.singletonList(
new VolumeMountBuilder()
.withName(Constants.FLINK_CONF_VOLUME)
.withMountPath(FLINK_CONF_DIR_IN_POD)
.build());
assertEquals(expectedVolumeMounts, resultFlinkPod.getMainContainer().getVolumeMounts());
}
@Test
public void shouldConfigureSecretsMount() {
WorkflowConfiguration.Secret secret = WorkflowConfiguration.Secret.create("my-secret", "/etc/secrets");
KubernetesSecretSpec secretSpec = KubernetesSecretSpec.builder()
.customSecret(secret)
.build();
Pod pod = createPod(
WORKFLOW_INSTANCE,
DockerRunner.RunSpec.builder()
.executionId("eid")
.imageName("busybox")
.secret(secret)
.build(),
secretSpec);
List<Volume> volumes = pod.getSpec().getVolumes();
List<Container> containers = pod.getSpec().getContainers();
assertThat(volumes.size(), is(1));
assertThat(containers.size(), is(2));
assertThat(containers.get(0).getName(), is(MAIN_CONTAINER_NAME));
Volume volume = volumes.get(0);
assertThat(volume.getName(), is("my-secret"));
assertThat(volume.getSecret().getSecretName(), is("my-secret"));
Container container = containers.get(0);
List<VolumeMount> volumeMounts = container.getVolumeMounts();
assertThat(volumeMounts.size(), is(1));
VolumeMount volumeMount = volumeMounts.get(0);
assertThat(volumeMount.getName(), is("my-secret"));
assertThat(volumeMount.getMountPath(), is("/etc/secrets"));
assertThat(volumeMount.getReadOnly(), is(true));
}
/**
* Volume mount deployment properties are specified in YAML format:
* <p>
* <code>
* spring.cloud.deployer.kubernetes.volumeMounts=[{name: 'testhostpath', mountPath: '/test/hostPath'},
* {name: 'testpvc', mountPath: '/test/pvc'}, {name: 'testnfs', mountPath: '/test/nfs'}]
* </code>
* <p>
* Volume mounts can be specified as deployer properties as well as app deployment properties.
* Deployment properties override deployer properties.
*
* @param deploymentProperties the deployment properties from {@link AppDeploymentRequest}
* @return the configured volume mounts
*/
List<VolumeMount> getVolumeMounts(Map<String, String> deploymentProperties) {
List<VolumeMount> volumeMounts = new ArrayList<>();
String volumeMountDeploymentProperty = PropertyParserUtils.getDeploymentPropertyValue(deploymentProperties,
this.propertyPrefix + ".volumeMounts");
if (!StringUtils.isEmpty(volumeMountDeploymentProperty)) {
try {
YamlPropertiesFactoryBean properties = new YamlPropertiesFactoryBean();
String tmpYaml = "{ volume-mounts: " + volumeMountDeploymentProperty + " }";
properties.setResources(new ByteArrayResource(tmpYaml.getBytes()));
Properties yaml = properties.getObject();
MapConfigurationPropertySource source = new MapConfigurationPropertySource(yaml);
KubernetesDeployerProperties deployerProperties = new Binder(source)
.bind("", Bindable.of(KubernetesDeployerProperties.class)).get();
volumeMounts.addAll(deployerProperties.getVolumeMounts());
} catch (Exception e) {
throw new IllegalArgumentException(
String.format("Invalid volume mount '%s'", volumeMountDeploymentProperty), e);
}
}
// only add volume mounts that have not already been added, based on the volume mount's name
// i.e. allow provided deployment volume mounts to override deployer defined volume mounts
volumeMounts.addAll(this.properties.getVolumeMounts().stream().filter(volumeMount -> volumeMounts.stream()
.noneMatch(existingVolumeMount -> existingVolumeMount.getName().equals(volumeMount.getName())))
.collect(Collectors.toList()));
return volumeMounts;
}
/**
* Configures the log dirs used by the Kafka brokers. The log dirs contain a broker ID in the path. This is passed
* as template and filled in only in the Kafka container.
*
* @param mounts List of data volume mounts which mount the data volumes into the container
*
* @return Returns the builder instance
*/
public KafkaBrokerConfigurationBuilder withLogDirs(List<VolumeMount> mounts) {
// We take all the data mount points and add the broker specific path
String logDirs = mounts.stream()
.map(volumeMount -> volumeMount.getMountPath() + "/kafka-log${STRIMZI_BROKER_ID}").collect(Collectors.joining(","));
printSectionHeader("Kafka message logs configuration");
writer.println("log.dirs=" + logDirs);
writer.println();
return this;
}
private List<VolumeMount> getVolumeMounts() {
List<VolumeMount> volumeMountList = new ArrayList<>(4);
volumeMountList.add(VolumeUtils.createVolumeMount(VOLUME_NAME, mountPath));
volumeMountList.add(VolumeUtils.createVolumeMount(logAndMetricsConfigVolumeName, logAndMetricsConfigMountPath));
volumeMountList.add(VolumeUtils.createVolumeMount(ZOOKEEPER_NODE_CERTIFICATES_VOLUME_NAME, ZOOKEEPER_NODE_CERTIFICATES_VOLUME_MOUNT));
volumeMountList.add(VolumeUtils.createVolumeMount(ZOOKEEPER_CLUSTER_CA_VOLUME_NAME, ZOOKEEPER_CLUSTER_CA_VOLUME_MOUNT));
return volumeMountList;
}
private List<VolumeMount> getVolumeMounts() {
List<VolumeMount> volumeMountList = new ArrayList<>(2);
volumeMountList.add(VolumeUtils.createVolumeMount(logAndMetricsConfigVolumeName, logAndMetricsConfigMountPath));
volumeMountList.add(VolumeUtils.createVolumeMount(JMXTRANS_VOLUME_NAME, JMX_FILE_PATH));
return volumeMountList;
}
/**
* Creates a Volume mount
*
* @param name Name of the Volume mount
* @param path volume mount path
* @return The Volume mount created
*/
public static VolumeMount createVolumeMount(String name, String path) {
String validName = getValidVolumeName(name);
VolumeMount volumeMount = new VolumeMountBuilder()
.withName(validName)
.withMountPath(path)
.build();
log.trace("Created volume mount {} for volume {}", volumeMount, validName);
return volumeMount;
}
public static List<VolumeMount> getDataVolumeMountPaths(Storage storage, String mountPath) {
List<VolumeMount> volumeMounts = new ArrayList<>();
if (storage != null) {
if (storage instanceof JbodStorage) {
for (SingleVolumeStorage volume : ((JbodStorage) storage).getVolumes()) {
if (volume.getId() == null)
throw new InvalidResourceException("Volumes under JBOD storage type have to have 'id' property");
// it's called recursively for setting the information from the current volume
volumeMounts.addAll(getDataVolumeMountPaths(volume, mountPath));
}
} else {
Integer id;
if (storage instanceof EphemeralStorage) {
id = ((EphemeralStorage) storage).getId();
} else if (storage instanceof PersistentClaimStorage) {
id = ((PersistentClaimStorage) storage).getId();
} else {
throw new IllegalStateException("The declared storage '" + storage.getType() + "' is not supported");
}
String name = getVolumePrefix(id);
String namedMountPath = mountPath + "/" + name;
volumeMounts.add(createVolumeMount(name, namedMountPath));
}
}
return volumeMounts;
}
@Override
protected List<VolumeMount> getVolumeMounts() {
List<VolumeMount> volumeMountList = super.getVolumeMounts();
for (KafkaMirrorMaker2ClusterSpec mirrorMaker2Cluster: clusters) {
String alias = mirrorMaker2Cluster.getAlias();
String tlsVolumeMountPath = buildClusterVolumeMountPath(MIRRORMAKER_2_TLS_CERTS_BASE_VOLUME_MOUNT, alias);
KafkaMirrorMaker2Tls tls = mirrorMaker2Cluster.getTls();
if (tls != null) {
List<CertSecretSource> trustedCertificates = tls.getTrustedCertificates();
if (trustedCertificates != null && trustedCertificates.size() > 0) {
for (CertSecretSource certSecretSource : trustedCertificates) {
String volumeMountName = alias + '-' + certSecretSource.getSecretName();
// skipping if a volume mount with same Secret name was already added
if (!volumeMountList.stream().anyMatch(vm -> vm.getName().equals(volumeMountName))) {
volumeMountList.add(VolumeUtils.createVolumeMount(volumeMountName,
tlsVolumeMountPath + certSecretSource.getSecretName()));
}
}
}
}
String passwordVolumeMountPath = buildClusterVolumeMountPath(MIRRORMAKER_2_PASSWORD_VOLUME_MOUNT, alias);
String oauthTlsVolumeMountPath = buildClusterVolumeMountPath(MIRRORMAKER_2_OAUTH_TLS_CERTS_BASE_VOLUME_MOUNT, alias);
String oauthVolumeMountPath = buildClusterVolumeMountPath(MIRRORMAKER_2_OAUTH_SECRETS_BASE_VOLUME_MOUNT, alias);
AuthenticationUtils.configureClientAuthenticationVolumeMounts(mirrorMaker2Cluster.getAuthentication(), volumeMountList, tlsVolumeMountPath, passwordVolumeMountPath, oauthTlsVolumeMountPath, mirrorMaker2Cluster.getAlias() + "-oauth-certs", mirrorMaker2Cluster.getAlias() + '-', true, oauthVolumeMountPath);
}
return volumeMountList;
}
@Test
public void testExternalConfigurationSecretVolumes() {
ExternalConfigurationVolumeSource volume = new ExternalConfigurationVolumeSourceBuilder()
.withName("my-volume")
.withSecret(new SecretVolumeSourceBuilder().withSecretName("my-secret").build())
.build();
KafkaConnect resource = new KafkaConnectBuilder(this.resource)
.editSpec()
.withNewExternalConfiguration()
.withVolumes(volume)
.endExternalConfiguration()
.endSpec()
.build();
KafkaConnectCluster kc = KafkaConnectCluster.fromCrd(resource, VERSIONS);
// Check Deployment
Deployment dep = kc.generateDeployment(emptyMap(), true, null, null);
List<Volume> volumes = dep.getSpec().getTemplate().getSpec().getVolumes();
List<Volume> selected = volumes.stream().filter(vol -> vol.getName().equals(KafkaConnectCluster.EXTERNAL_CONFIGURATION_VOLUME_NAME_PREFIX + "my-volume")).collect(Collectors.toList());
assertThat(selected.size(), is(1));
assertThat(selected.get(0).getName(), is(KafkaConnectCluster.EXTERNAL_CONFIGURATION_VOLUME_NAME_PREFIX + "my-volume"));
assertThat(selected.get(0).getSecret(), is(volume.getSecret()));
List<VolumeMount> volumeMounths = dep.getSpec().getTemplate().getSpec().getContainers().get(0).getVolumeMounts();
List<VolumeMount> selectedVolumeMounths = volumeMounths.stream().filter(vol -> vol.getName().equals(KafkaConnectCluster.EXTERNAL_CONFIGURATION_VOLUME_NAME_PREFIX + "my-volume")).collect(Collectors.toList());
assertThat(selected.size(), is(1));
assertThat(selectedVolumeMounths.get(0).getName(), is(KafkaConnectCluster.EXTERNAL_CONFIGURATION_VOLUME_NAME_PREFIX + "my-volume"));
assertThat(selectedVolumeMounths.get(0).getMountPath(), is(KafkaConnectCluster.EXTERNAL_CONFIGURATION_VOLUME_MOUNT_BASE_PATH + "my-volume"));
}
@Test
public void testExternalConfigurationConfigVolumes() {
ExternalConfigurationVolumeSource volume = new ExternalConfigurationVolumeSourceBuilder()
.withName("my-volume")
.withConfigMap(new ConfigMapVolumeSourceBuilder().withName("my-map").build())
.build();
KafkaConnect resource = new KafkaConnectBuilder(this.resource)
.editSpec()
.withNewExternalConfiguration()
.withVolumes(volume)
.endExternalConfiguration()
.endSpec()
.build();
KafkaConnectCluster kc = KafkaConnectCluster.fromCrd(resource, VERSIONS);
// Check Deployment
Deployment dep = kc.generateDeployment(emptyMap(), true, null, null);
List<Volume> volumes = dep.getSpec().getTemplate().getSpec().getVolumes();
List<Volume> selected = volumes.stream().filter(vol -> vol.getName().equals(KafkaConnectCluster.EXTERNAL_CONFIGURATION_VOLUME_NAME_PREFIX + "my-volume")).collect(Collectors.toList());
assertThat(selected.size(), is(1));
assertThat(selected.get(0).getName(), is(KafkaConnectCluster.EXTERNAL_CONFIGURATION_VOLUME_NAME_PREFIX + "my-volume"));
assertThat(selected.get(0).getConfigMap(), is(volume.getConfigMap()));
List<VolumeMount> volumeMounths = dep.getSpec().getTemplate().getSpec().getContainers().get(0).getVolumeMounts();
List<VolumeMount> selectedVolumeMounths = volumeMounths.stream().filter(vol -> vol.getName().equals(KafkaConnectCluster.EXTERNAL_CONFIGURATION_VOLUME_NAME_PREFIX + "my-volume")).collect(Collectors.toList());
assertThat(selected.size(), is(1));
assertThat(selectedVolumeMounths.get(0).getName(), is(KafkaConnectCluster.EXTERNAL_CONFIGURATION_VOLUME_NAME_PREFIX + "my-volume"));
assertThat(selectedVolumeMounths.get(0).getMountPath(), is(KafkaConnectCluster.EXTERNAL_CONFIGURATION_VOLUME_MOUNT_BASE_PATH + "my-volume"));
}
@Test
public void testExternalConfigurationInvalidVolumes() {
ExternalConfigurationVolumeSource volume = new ExternalConfigurationVolumeSourceBuilder()
.withName("my-volume")
.withConfigMap(new ConfigMapVolumeSourceBuilder().withName("my-map").build())
.withSecret(new SecretVolumeSourceBuilder().withSecretName("my-secret").build())
.build();
KafkaConnect resource = new KafkaConnectBuilder(this.resource)
.editSpec()
.withNewExternalConfiguration()
.withVolumes(volume)
.endExternalConfiguration()
.endSpec()
.build();
KafkaConnectCluster kc = KafkaConnectCluster.fromCrd(resource, VERSIONS);
// Check Deployment
Deployment dep = kc.generateDeployment(emptyMap(), true, null, null);
List<Volume> volumes = dep.getSpec().getTemplate().getSpec().getVolumes();
List<Volume> selected = volumes.stream().filter(vol -> vol.getName().equals(KafkaConnectCluster.EXTERNAL_CONFIGURATION_VOLUME_NAME_PREFIX + "my-volume")).collect(Collectors.toList());
assertThat(selected.size(), is(0));
List<VolumeMount> volumeMounths = dep.getSpec().getTemplate().getSpec().getContainers().get(0).getVolumeMounts();
List<VolumeMount> selectedVolumeMounths = volumeMounths.stream().filter(vol -> vol.getName().equals(KafkaConnectCluster.EXTERNAL_CONFIGURATION_VOLUME_NAME_PREFIX + "my-volume")).collect(Collectors.toList());
assertThat(selected.size(), is(0));
}
@Test
public void testExternalConfigurationSecretVolumes() {
ExternalConfigurationVolumeSource volume = new ExternalConfigurationVolumeSourceBuilder()
.withName("my-volume")
.withSecret(new SecretVolumeSourceBuilder().withSecretName("my-secret").build())
.build();
KafkaMirrorMaker2 resource = new KafkaMirrorMaker2Builder(this.resource)
.editSpec()
.withNewExternalConfiguration()
.withVolumes(volume)
.endExternalConfiguration()
.endSpec()
.build();
KafkaMirrorMaker2Cluster kmm2 = KafkaMirrorMaker2Cluster.fromCrd(resource, VERSIONS);
// Check Deployment
Deployment dep = kmm2.generateDeployment(emptyMap(), true, null, null);
List<Volume> volumes = dep.getSpec().getTemplate().getSpec().getVolumes();
List<Volume> selected = volumes.stream().filter(vol -> vol.getName().equals(KafkaMirrorMaker2Cluster.EXTERNAL_CONFIGURATION_VOLUME_NAME_PREFIX + "my-volume")).collect(Collectors.toList());
assertThat(selected.size(), is(1));
assertThat(selected.get(0).getName(), is(KafkaMirrorMaker2Cluster.EXTERNAL_CONFIGURATION_VOLUME_NAME_PREFIX + "my-volume"));
assertThat(selected.get(0).getSecret(), is(volume.getSecret()));
List<VolumeMount> volumeMounths = getContainer(dep).getVolumeMounts();
List<VolumeMount> selectedVolumeMounths = volumeMounths.stream().filter(vol -> vol.getName().equals(KafkaMirrorMaker2Cluster.EXTERNAL_CONFIGURATION_VOLUME_NAME_PREFIX + "my-volume")).collect(Collectors.toList());
assertThat(selected.size(), is(1));
assertThat(selectedVolumeMounths.get(0).getName(), is(KafkaMirrorMaker2Cluster.EXTERNAL_CONFIGURATION_VOLUME_NAME_PREFIX + "my-volume"));
assertThat(selectedVolumeMounths.get(0).getMountPath(), is(KafkaMirrorMaker2Cluster.EXTERNAL_CONFIGURATION_VOLUME_MOUNT_BASE_PATH + "my-volume"));
}
@Test
public void testExternalConfigurationConfigVolumes() {
ExternalConfigurationVolumeSource volume = new ExternalConfigurationVolumeSourceBuilder()
.withName("my-volume")
.withConfigMap(new ConfigMapVolumeSourceBuilder().withName("my-map").build())
.build();
KafkaMirrorMaker2 resource = new KafkaMirrorMaker2Builder(this.resource)
.editSpec()
.withNewExternalConfiguration()
.withVolumes(volume)
.endExternalConfiguration()
.endSpec()
.build();
KafkaMirrorMaker2Cluster kmm2 = KafkaMirrorMaker2Cluster.fromCrd(resource, VERSIONS);
// Check Deployment
Deployment dep = kmm2.generateDeployment(emptyMap(), true, null, null);
List<Volume> volumes = dep.getSpec().getTemplate().getSpec().getVolumes();
List<Volume> selected = volumes.stream().filter(vol -> vol.getName().equals(KafkaMirrorMaker2Cluster.EXTERNAL_CONFIGURATION_VOLUME_NAME_PREFIX + "my-volume")).collect(Collectors.toList());
assertThat(selected.size(), is(1));
assertThat(selected.get(0).getName(), is(KafkaMirrorMaker2Cluster.EXTERNAL_CONFIGURATION_VOLUME_NAME_PREFIX + "my-volume"));
assertThat(selected.get(0).getConfigMap(), is(volume.getConfigMap()));
List<VolumeMount> volumeMounths = getContainer(dep).getVolumeMounts();
List<VolumeMount> selectedVolumeMounths = volumeMounths.stream().filter(vol -> vol.getName().equals(KafkaMirrorMaker2Cluster.EXTERNAL_CONFIGURATION_VOLUME_NAME_PREFIX + "my-volume")).collect(Collectors.toList());
assertThat(selected.size(), is(1));
assertThat(selectedVolumeMounths.get(0).getName(), is(KafkaMirrorMaker2Cluster.EXTERNAL_CONFIGURATION_VOLUME_NAME_PREFIX + "my-volume"));
assertThat(selectedVolumeMounths.get(0).getMountPath(), is(KafkaMirrorMaker2Cluster.EXTERNAL_CONFIGURATION_VOLUME_MOUNT_BASE_PATH + "my-volume"));
}