package org.arquillian.cube.openshift.impl.feedback; import io.fabric8.kubernetes.api.model.v2_2.Endpoints; import io.fabric8.kubernetes.api.model.v2_2.HasMetadata; import io.fabric8.kubernetes.api.model.v2_2.Pod; import io.fabric8.kubernetes.api.model.v2_2.PodList; import io.fabric8.kubernetes.api.model.v2_2.PodListBuilder; import io.fabric8.kubernetes.api.model.v2_2.ReplicationController; import io.fabric8.kubernetes.api.model.v2_2.Service; import io.fabric8.kubernetes.api.model.v2_2.extensions.Deployment; import io.fabric8.kubernetes.api.model.v2_2.extensions.ReplicaSet; import io.fabric8.kubernetes.clnt.v2_2.KubernetesClient; import io.fabric8.openshift.api.model.v2_2.DeploymentConfig; import org.arquillian.cube.kubernetes.api.FeedbackProvider; import org.arquillian.cube.kubernetes.api.Logger; import org.arquillian.cube.kubernetes.api.WithToImmutable; import org.arquillian.cube.kubernetes.impl.feedback.DefaultFeedbackProvider; import org.jboss.arquillian.core.api.Instance; import org.jboss.arquillian.core.api.annotation.Inject; public class OpenshiftFeedbackProvider implements FeedbackProvider { protected FeedbackProvider delegate; @Inject protected Instance<KubernetesClient> client; @Inject protected Instance<Logger> logger; @Override public <T extends HasMetadata> void onResourceNotReady(T resource) { } @Override public FeedbackProvider toImmutable() { if (delegate != null) { return delegate; } synchronized (this) { if (delegate == null) { delegate = new ImmutableFeedbackProvider(client.get(), logger.get().toImmutable()); } } return delegate; } public static class ImmutableFeedbackProvider extends DefaultFeedbackProvider.ImmutableFeedbackProvider implements FeedbackProvider, WithToImmutable<FeedbackProvider> { public ImmutableFeedbackProvider(KubernetesClient client, Logger logger) { super(client, logger); } public <T extends HasMetadata> PodList podsOf(T resource) { if (resource instanceof Pod) { return new PodListBuilder().withItems((Pod) resource).build(); } else if (resource instanceof Endpoints) { return podsOf(client.services() .inNamespace(resource.getMetadata().getNamespace()) .withName(resource.getMetadata().getName()) .get()); } else if (resource instanceof Service) { return client.pods() .inNamespace(resource.getMetadata().getNamespace()) .withLabels(((Service) resource).getSpec().getSelector()) .list(); } else if (resource instanceof ReplicationController) { return client.pods() .inNamespace(resource.getMetadata().getNamespace()) .withLabels(((ReplicationController) resource).getSpec().getSelector()) .list(); } else if (resource instanceof ReplicaSet) { return findMatching((ReplicaSet) resource); } else if (resource instanceof Deployment) { return findMatching((Deployment) resource); } else if (resource instanceof DeploymentConfig) { return client.pods().inNamespace(resource.getMetadata().getName()).withLabel("deploymentconfig", resource.getMetadata().getName()).list(); } else { return new PodListBuilder().build(); } } @Override public FeedbackProvider toImmutable() { return this; } } }