in shenyu-kubernetes-controller/src/main/java/org/apache/shenyu/k8s/parser/GrpcParser.java [94:148]
public ShenyuMemoryConfig parse(final V1Ingress ingress, final CoreV1Api coreV1Api) {
ShenyuMemoryConfig res = new ShenyuMemoryConfig();
if (Objects.nonNull(ingress.getSpec())) {
// parse the grpc backend
V1IngressBackend grpcBackend = ingress.getSpec().getDefaultBackend();
List<V1IngressRule> rules = ingress.getSpec().getRules();
List<V1IngressTLS> tlsList = ingress.getSpec().getTls();
String namespace = Objects.requireNonNull(ingress.getMetadata()).getNamespace();
List<GrpcUpstream> grpcDefaultUpstreamList = parseDefaultService(grpcBackend, namespace);
if (Objects.isNull(rules) || CollectionUtils.isEmpty(rules)) {
// if rules is null, grpcBackend become global default
if (Objects.nonNull(grpcBackend) && Objects.nonNull(grpcBackend.getService())) {
IngressConfiguration defaultRouteConfig = getRpcRouteConfig(grpcDefaultUpstreamList, ingress.getMetadata().getAnnotations());
res.setGlobalDefaultBackend(Pair.of(Pair.of(namespace + "/" + ingress.getMetadata().getName(), grpcBackend.getService().getName()),
defaultRouteConfig));
}
} else {
// if rules is not null, grpcBackend is default in this ingress
List<IngressConfiguration> routeList = new ArrayList<>(rules.size());
for (V1IngressRule ingressRule : rules) {
List<IngressConfiguration> routes = parseIngressRule(ingressRule,
Objects.requireNonNull(ingress.getMetadata()).getNamespace(),
ingress.getMetadata().getAnnotations(), ingress.getMetadata().getLabels());
routeList.addAll(routes);
}
res.setRouteConfigList(routeList);
}
// Parse tls
if (Objects.nonNull(tlsList) && CollectionUtils.isNotEmpty(tlsList)) {
List<SslCrtAndKeyStream> sslList = new ArrayList<>();
for (V1IngressTLS tls : tlsList) {
if (Objects.nonNull(tls.getSecretName()) && Objects.nonNull(tls.getHosts()) && CollectionUtils.isNotEmpty(tls.getHosts())) {
try {
V1Secret secret = coreV1Api.readNamespacedSecret(tls.getSecretName(), namespace, "ture");
if (Objects.nonNull(secret.getData())) {
InputStream keyCertChainInputStream = new ByteArrayInputStream(secret.getData().get("tls.crt"));
InputStream keyInputStream = new ByteArrayInputStream(secret.getData().get("tls.key"));
tls.getHosts().forEach(host ->
sslList.add(new SslCrtAndKeyStream(host, keyCertChainInputStream, keyInputStream))
);
}
} catch (ApiException e) {
LOG.error("parse tls failed ", e);
}
}
}
res.setTlsConfigList(sslList);
}
}
return res;
}