Open MohammadNC opened 3 weeks ago
And also noticed that with the below code snippet thread is getting stuck.
private boolean checkConfigFilesPresent(String nameSpace, String secretName, ArrayList
try {
V1SecretList listSecret = new CoreV1Api().listNamespacedSecret(nameSpace, null, null, null, null,
null, null, null, null, null, null, Boolean.TRUE);
for (V1Secret secret : listSecret.getItems()) {
if (secret.getMetadata().getName().equals(secretName)) {
Map<String, byte[]> map = secret.getData();
for (String fileName : fileNameList) {
if (map.get(fileName) == null) {
return false;
}
}
}
}
} catch (ApiException e) {
e.printStackTrace();
}
return true;
}
please check this one also.
Getting watches right is tricky, I would strongly encourage you to use the Informer
class instead of trying to roll your own watch code, there is an example here:
Hi @brendandburns
Thank you for your suggestion.
I implemented the following code snippet to monitor Kubernetes secrets. However, when performing different operations like adding, modifying, and deleting a secret, no events were triggered.
`package com.example.demo.informer;
import io.kubernetes.client.informer.ResourceEventHandler; import io.kubernetes.client.informer.SharedIndexInformer; import io.kubernetes.client.informer.SharedInformerFactory; import io.kubernetes.client.openapi.ApiClient; import io.kubernetes.client.openapi.apis.CoreV1Api; import io.kubernetes.client.openapi.models.V1Secret; import io.kubernetes.client.openapi.models.V1SecretList; import okhttp3.OkHttpClient; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger;
import java.util.concurrent.TimeUnit;
public class SecretWatcher implements Runnable {
private static final Logger logger = LogManager.getLogger(SecretWatcher.class);
String nameSpace;
private final CoreV1Api api;
SharedInformerFactory informerFactory;
public SecretWatcher(String nameSpace) {
this.nameSpace = nameSpace;
this.api = new CoreV1Api();
ApiClient apiClient = this.api.getApiClient();
OkHttpClient httpClient =
apiClient.getHttpClient().newBuilder().readTimeout(0, TimeUnit.SECONDS).build();
apiClient.setHttpClient(httpClient);
this.informerFactory = new SharedInformerFactory(apiClient);
}
@Override
public void run() {
logger.info("Starting ConfigWatchProcess ");
while (true) {
try {
SharedIndexInformer<V1Secret> secretInformer =
this.informerFactory.sharedIndexInformerFor(
(CallGeneratorParams) -> {
return this.api.listNamespacedSecretCall(nameSpace, null, null,
null, null, null, null, null,
null, Boolean.TRUE, null, Boolean.TRUE, null);
},
V1Secret.class,
V1SecretList.class);
secretInformer.addEventHandler(
new ResourceEventHandler<V1Secret>() {
@Override
public void onAdd(V1Secret secret) {
String secretName = getSecretName(secret);
logger.warn("Add event is triggered for Secret : {}", secretName);
handleEventAdded(secret);
}
@Override
public void onUpdate(V1Secret oldSecret, V1Secret newSecret) {
String olSecretName = getSecretName(newSecret);
String newSecretName = getSecretName(newSecret);
logger.warn("olSecretName: {}, newSecretName:{}", olSecretName, newSecretName);
handleEventModified(newSecret);
}
@Override
public void onDelete(V1Secret secret, boolean deletedFinalStateUnknown) {
String secretName = getSecretName(secret);
logger.warn("Delete event is triggered for Secret : {}", secretName);
handleEventDeleted(secret);
}
});
logger.warn("Starting the informer..");
informerFactory.startAllRegisteredInformers();
Thread.sleep(1000);
} catch (Exception e) {
logger.error("Exception occurred while monitorning...");
}
}
}
private void handleEventAdded(V1Secret secret) {
logger.warn("Handling of Add secret ....");
}
private void handleEventModified(V1Secret secret) {
logger.warn("Handling of Modified secret ....");
}
private void handleEventDeleted(V1Secret secret) {
logger.warn("Handling of deleted secret ....");
}
private String getSecretName(V1Secret secret) {
return secret.getMetadata().getName();
}
} `
Could you please suggest how to resolve this issue so that all events are properly triggered?
My request is to continuously monitor Kubernetes secrets, ensuring that whenever any action is performed on a secret, the appropriate event is triggered.
Please review the InformerExample here:
Describe the bug I am watching kubernate secret in infine loop, in any change happened to secret, watch should trigger appropriate events like ADDED or MODIFIED or DELETED. but in my case DELETE event is not triggered and most important point is that Thread is getting struck.
Client Version 19.0.0
Kubernetes Version
1.23.10
Java Version . Java 17
below is code snippet to reproduce the issue.
import io.kubernetes.client.openapi.ApiClient; import io.kubernetes.client.openapi.ApiException; import io.kubernetes.client.openapi.Configuration; import io.kubernetes.client.openapi.apis.CoreV1Api; import io.kubernetes.client.openapi.models.V1Secret; import io.kubernetes.client.openapi.models.V1SecretList; import io.kubernetes.client.util.Config; import io.kubernetes.client.util.Watch; import com.google.gson.reflect.TypeToken;
import java.io.IOException; import java.util.List;
public class SecretWatcher {
}
Kindly suggest how we can achieve all event triggered correctly.