use of io.kubernetes.client.openapi.models.V1Pod in project pravega by pravega.
the class K8SequentialExecutor method startTestExecution.
@Override
public CompletableFuture<Void> startTestExecution(Method testMethod) {
final String className = testMethod.getDeclaringClass().getName();
final String methodName = testMethod.getName();
// pod name is the combination of a test method name and random Alphanumeric. It cannot be more than 63 characters.
final String podName = (methodName + "-" + randomAlphanumeric(5)).toLowerCase();
log.info("Start execution of test {}#{} on the KUBERNETES Cluster", className, methodName);
final K8sClient client = ClientFactory.INSTANCE.getK8sClient();
Map<String, V1ContainerStatus> podStatusBeforeTest = getPravegaPodStatus(client);
final V1Pod pod = getTestPod(className, methodName, podName.toLowerCase());
final AtomicReference<CompletableFuture<Void>> logDownload = new AtomicReference<>(CompletableFuture.completedFuture(null));
return // create service Account, ignore if already present.
client.createServiceAccount(NAMESPACE, getServiceAccount()).thenCompose(// ensure test pod has cluster admin rights.
v -> client.createClusterRoleBinding(getClusterRoleBinding())).thenCompose(// deploy test pod.
v -> client.deployPod(NAMESPACE, pod)).thenCompose(v -> {
// start download of logs.
if (!Utils.isSkipLogDownloadEnabled()) {
logDownload.set(client.downloadLogs(pod, "./build/test-results/" + podName));
}
return client.waitUntilPodCompletes(NAMESPACE, podName);
}).handle((s, t) -> {
Futures.getAndHandleExceptions(logDownload.get(), t1 -> {
log.error("Failed to download logs for {}#{}", className, methodName, t1);
return null;
});
if (t == null) {
log.info("Test {}#{} execution completed with status {}", className, methodName, s);
verifyPravegaPodRestart(podStatusBeforeTest, getPravegaPodStatus(client));
if (s.getExitCode() != 0) {
log.error("Test {}#{} failed. Details: {}", className, methodName, s);
throw new AssertionError(methodName + " test failed due to " + s.getReason() + " with message " + s.getMessage());
} else {
return null;
}
} else {
throw new CompletionException("Error while invoking the test " + podName, t);
}
});
}
use of io.kubernetes.client.openapi.models.V1Pod in project pravega by pravega.
the class K8sClient method deployPod.
/**
* Deploy a pod. This ignores exception when the pod has already been deployed.
* @param namespace Namespace.
* @param pod Pod details.
* @return Future which is completed once the deployemnt has been triggered.
*/
@SneakyThrows(ApiException.class)
public CompletableFuture<V1Pod> deployPod(final String namespace, final V1Pod pod) {
CoreV1Api api = new CoreV1Api();
K8AsyncCallback<V1Pod> callback = new K8AsyncCallback<>("createPod-" + pod.getMetadata().getName());
api.createNamespacedPodAsync(namespace, pod, PRETTY_PRINT, DRY_RUN, FIELD_MANAGER, callback);
return exceptionallyExpecting(callback.getFuture(), isConflict, null);
}
use of io.kubernetes.client.openapi.models.V1Pod in project pravega by pravega.
the class K8sClient method getStatusOfPod.
/**
* Method used to fetch the status of a Pod. V1PodStatus also helps to indicate the container status.
* @param namespace Namespace.
* @param podName Name of the pod.
* @return A future representing the status of the pod.
*/
@SneakyThrows(ApiException.class)
public CompletableFuture<V1PodStatus> getStatusOfPod(final String namespace, final String podName) {
CoreV1Api api = new CoreV1Api();
K8AsyncCallback<V1PodList> callback = new K8AsyncCallback<>("listPods");
api.listNamespacedPodAsync(namespace, PRETTY_PRINT, ALLOW_WATCH_BOOKMARKS, null, null, "POD_NAME=" + podName, null, null, null, false, callback);
return callback.getFuture().thenApply(v1PodList -> {
Optional<V1Pod> vpod = v1PodList.getItems().stream().filter(v1Pod -> v1Pod.getMetadata().getName().equals(podName) && v1Pod.getMetadata().getNamespace().equals(namespace)).findFirst();
return vpod.map(V1Pod::getStatus).orElseThrow(() -> new RuntimeException("pod not found" + podName));
});
}
use of io.kubernetes.client.openapi.models.V1Pod in project java by kubernetes-client.
the class KubectlLabelTest method testKubectlLabelNamespacedResourceShouldWork.
@Test
public void testKubectlLabelNamespacedResourceShouldWork() throws KubectlException {
wireMockRule.stubFor(get(urlPathEqualTo("/api/v1/namespaces/default/pods/foo")).willReturn(aResponse().withStatus(200).withBody("{\"metadata\":{\"name\":\"foo\",\"namespace\":\"default\"}}")));
wireMockRule.stubFor(put(urlPathEqualTo("/api/v1/namespaces/default/pods/foo")).willReturn(aResponse().withStatus(200).withBody("{\"metadata\":{\"name\":\"foo\",\"namespace\":\"default\"}}")));
V1Pod labelledPod = Kubectl.label(V1Pod.class).apiClient(apiClient).skipDiscovery().namespace("default").name("foo").addLabel("k1", "v1").addLabel("k2", "v2").execute();
wireMockRule.verify(1, getRequestedFor(urlPathEqualTo("/api/v1/namespaces/default/pods/foo")));
wireMockRule.verify(1, putRequestedFor(urlPathEqualTo("/api/v1/namespaces/default/pods/foo")));
assertNotNull(labelledPod);
}
use of io.kubernetes.client.openapi.models.V1Pod in project java by kubernetes-client.
the class KubectlAnnotateTest method testKubectlAnnotateNamespacedResourceShouldWork.
@Test
public void testKubectlAnnotateNamespacedResourceShouldWork() throws KubectlException {
wireMockRule.stubFor(get(urlPathEqualTo("/api/v1/namespaces/default/pods/foo")).willReturn(aResponse().withStatus(200).withBody("{\"metadata\":{\"name\":\"foo\",\"namespace\":\"default\"}}")));
wireMockRule.stubFor(put(urlPathEqualTo("/api/v1/namespaces/default/pods/foo")).willReturn(aResponse().withStatus(200).withBody("{\"metadata\":{\"name\":\"foo\",\"namespace\":\"default\"}}")));
V1Pod annotatedPod = Kubectl.annotate(V1Pod.class).apiClient(apiClient).skipDiscovery().namespace("default").name("foo").addAnnotation("k1", "v1").addAnnotation("k2", "v2").execute();
wireMockRule.verify(1, getRequestedFor(urlPathEqualTo("/api/v1/namespaces/default/pods/foo")));
wireMockRule.verify(1, putRequestedFor(urlPathEqualTo("/api/v1/namespaces/default/pods/foo")));
assertNotNull(annotatedPod);
}
Aggregations