@Override public StatefulSet updateImage(String image) { StatefulSet oldRC = get(); if (oldRC == null) { throw new KubernetesClientException("Existing StatefulSet doesn't exist"); } if (oldRC.getSpec().getTemplate().getSpec().getContainers().size() > 1) { throw new KubernetesClientException("Image update is not supported for multicontainer pods"); } if (oldRC.getSpec().getTemplate().getSpec().getContainers().size() == 0) { throw new KubernetesClientException("Pod has no containers!"); } Container updatedContainer = new ContainerBuilder(oldRC.getSpec().getTemplate().getSpec().getContainers().iterator().next()).withImage(image).build(); StatefulSetBuilder newRCBuilder = new StatefulSetBuilder(oldRC); newRCBuilder.editMetadata().withResourceVersion(null).endMetadata() .editSpec().editTemplate().editSpec().withContainers(Collections.singletonList(updatedContainer)) .endSpec().endTemplate().endSpec(); return new StatefulSetRollingUpdater(client, config, namespace).rollUpdate(oldRC, newRCBuilder.build()); }
private void setGeneration(StatefulSet desired, int nextGeneration) { Map<String, String> annotations = Annotations.annotations(desired.getSpec().getTemplate()); annotations.remove(ANNO_OP_STRIMZI_IO_GENERATION); annotations.put(ANNO_STRIMZI_IO_GENERATION, String.valueOf(nextGeneration)); }
public static int getSsGeneration(StatefulSet resource) { if (resource == null) { return NO_GENERATION; } return Annotations.intAnnotation(resource.getSpec().getTemplate(), ANNO_STRIMZI_IO_GENERATION, NO_GENERATION, ANNO_OP_STRIMZI_IO_GENERATION); }
private static ObjectMeta templateMetadata(StatefulSet resource) { return resource.getSpec().getTemplate().getMetadata(); }
protected void incrementGeneration(StatefulSet current, StatefulSet desired) { final int generation = Annotations.intAnnotation(current.getSpec().getTemplate(), ANNO_STRIMZI_IO_GENERATION, INIT_GENERATION, ANNO_OP_STRIMZI_IO_GENERATION); final int nextGeneration = generation + 1; setGeneration(desired, nextGeneration); }
Future<ReconciliationState> zkStatefulSet() { StatefulSet zkSs = zkCluster.generateStatefulSet(isOpenShift); Annotations.annotations(zkSs.getSpec().getTemplate()).put(Ca.ANNO_STRIMZI_IO_CLUSTER_CA_CERT_GENERATION, String.valueOf(getCaCertGeneration(this.clusterCa))); return withZkDiff(zkSetOperations.reconcile(namespace, zkCluster.getName(), zkSs)); }
Future<ReconciliationState> kafkaStatefulSet() { kafkaCluster.setExternalAddresses(kafkaExternalAddresses); StatefulSet kafkaSs = kafkaCluster.generateStatefulSet(isOpenShift); PodTemplateSpec template = kafkaSs.getSpec().getTemplate(); Annotations.annotations(template).put( Ca.ANNO_STRIMZI_IO_CLUSTER_CA_CERT_GENERATION, String.valueOf(getCaCertGeneration(this.clusterCa))); Annotations.annotations(template).put( Ca.ANNO_STRIMZI_IO_CLIENTS_CA_CERT_GENERATION, String.valueOf(getCaCertGeneration(this.clientsCa))); return withKafkaDiff(kafkaSetOperations.reconcile(namespace, kafkaCluster.getName(), kafkaSs)); }
private void revertVolumeChanges(StatefulSet current, StatefulSet desired) { Container currentKafka = current.getSpec().getTemplate().getSpec().getContainers().stream().filter(c -> c.getName().equals("kafka")).findFirst().get(); Container desiredKafka = desired.getSpec().getTemplate().getSpec().getContainers().stream().filter(c -> c.getName().equals("kafka")).findFirst().get(); desiredKafka.setVolumeMounts(currentKafka.getVolumeMounts()); StatefulSet updated = new StatefulSetBuilder(desired) .editSpec() .editTemplate() .editSpec() .editFirstContainer() .editMatchingEnv(e -> e.getName().equals(KafkaCluster.ENV_VAR_KAFKA_LOG_DIRS)) .withValue(desiredKafka.getVolumeMounts().stream() .filter(vm -> vm.getMountPath().contains(AbstractModel.VOLUME_NAME)) .map(vm -> vm.getMountPath()) .collect(Collectors.joining(","))) .endEnv() .endContainer() .endSpec() .endTemplate() .endSpec() .build(); desired.setSpec(updated.getSpec()); }
desired.getSpec().getTemplate().getSpec().setInitContainers(current.getSpec().getTemplate().getSpec().getInitContainers()); desired.getSpec().getTemplate().getSpec().setSecurityContext(current.getSpec().getTemplate().getSpec().getSecurityContext()); List<Volume> volumes = current.getSpec().getTemplate().getSpec().getVolumes(); for (int i = 0; i < volumes.size(); i++) { Volume vol = volumes.get(i); if (vol.getName().startsWith(AbstractModel.VOLUME_NAME) && vol.getEmptyDir() != null) { desired.getSpec().getTemplate().getSpec().getVolumes().add(0, volumes.get(i)); break; List<Volume> volumes = desired.getSpec().getTemplate().getSpec().getVolumes(); for (int i = 0; i < volumes.size(); i++) { Volume vol = volumes.get(i);
public static Map<String, String> getKafkaContainerEnv(StatefulSet ss) { for (Container container : ss.getSpec().getTemplate().getSpec().getContainers()) { if ("kafka".equals(container.getName())) { LinkedHashMap<String, String> map = new LinkedHashMap<>(container.getEnv() == null ? 2 : container.getEnv().size()); if (container.getEnv() != null) { for (EnvVar envVar : container.getEnv()) { map.put(envVar.getName(), envVar.getValue()); } } return map; } } throw new KafkaUpgradeException("Could not find 'kafka' container in StatefulSet " + ss.getMetadata().getName()); }
if (spec.getTemplate() != null && spec.getTemplate().getSpec() != null) { final PodSpec podSpec = spec.getTemplate().getSpec(); builder.accept(new TypedVisitor<PodSpecBuilder>() { @Override