package org.arquillian.cube.kubernetes.impl.visitor; import io.fabric8.kubernetes.api.builder.v2_2.Visitor; import io.fabric8.kubernetes.api.model.v2_2.PodSpecBuilder; import io.fabric8.kubernetes.clnt.v2_2.KubernetesClient; import org.arquillian.cube.impl.util.Strings; import org.arquillian.cube.kubernetes.api.Configuration; import org.arquillian.cube.kubernetes.api.Logger; import org.jboss.arquillian.core.api.Instance; import org.jboss.arquillian.core.api.annotation.Inject; public class ServiceAccountVisitor implements Visitor { @Inject protected Instance<Logger> logger; @Inject Instance<KubernetesClient> client; @Inject Instance<Configuration> configuration; @Override public void visit(Object element) { if (element instanceof PodSpecBuilder) { PodSpecBuilder builder = (PodSpecBuilder) element; String serviceAccount = builder.getServiceAccountName(); if (Strings.isNotNullOrEmpty(serviceAccount) && !serviceAccountExists(serviceAccount)) { try { createServiceAccount(serviceAccount); } catch (Throwable t) { logger.get().warn("Failed to create ServiceAccount with name:[" + serviceAccount + "]."); } } } } private boolean serviceAccountExists(String serviceAccount) { KubernetesClient client = this.client.get(); Configuration configuration = this.configuration.get(); return client.serviceAccounts().inNamespace(configuration.getNamespace()).withName(serviceAccount).get() != null; } private void createServiceAccount(String serviceAccount) { KubernetesClient client = this.client.get(); Configuration configuration = this.configuration.get(); client.serviceAccounts().inNamespace(configuration.getNamespace()).createNew() .withNewMetadata() .withName(serviceAccount) .endMetadata() .done(); } }