in shenyu-kubernetes-controller/src/main/java/org/apache/shenyu/k8s/parser/DubboIngressParser.java [98:154]
public ShenyuMemoryConfig parse(final V1Ingress ingress, final CoreV1Api coreV1Api) {
ShenyuMemoryConfig res = new ShenyuMemoryConfig();
if (Objects.nonNull(ingress.getSpec())) {
// Parse the dubbo backend
V1IngressBackend dubboBackend = ingress.getSpec().getDefaultBackend();
List<V1IngressRule> rules = ingress.getSpec().getRules();
List<V1IngressTLS> tlsList = ingress.getSpec().getTls();
String namespace = Objects.requireNonNull(ingress.getMetadata()).getNamespace();
List<DubboUpstream> dubboUpstreamList = getDefaultDubboRouteConfig(dubboBackend, namespace);
if (Objects.isNull(rules) || CollectionUtils.isEmpty(rules)) {
// if rules is null, dubboBackend become global default
if (Objects.nonNull(dubboBackend) && Objects.nonNull(dubboBackend.getService())) {
IngressConfiguration defaultRouteConfig = getDubboRouteConfig(dubboUpstreamList, ingress.getMetadata().getAnnotations());
res.setGlobalDefaultBackend(Pair.of(Pair.of(namespace + "/" + ingress.getMetadata().getName(), dubboBackend.getService().getName()),
defaultRouteConfig));
}
} else {
// if rules is not null, dubboBackend is default in this ingress
List<IngressConfiguration> routeList = new ArrayList<>(rules.size());
for (V1IngressRule ingressRule : rules) {
List<IngressConfiguration> routes = parseIngressRule(ingressRule, dubboUpstreamList,
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) {
List<String> hosts = tls.getHosts();
String secretName = tls.getSecretName();
if (Objects.nonNull(secretName) && CollectionUtils.isNotEmpty(hosts)) {
try {
V1Secret secret = coreV1Api.readNamespacedSecret(secretName, namespace, "ture");
Map<String, byte[]> secretData = secret.getData();
if (Objects.nonNull(secretData)) {
InputStream keyCertChainInputStream = new ByteArrayInputStream(secretData.get("tls.crt"));
InputStream keyInputStream = new ByteArrayInputStream(secretData.get("tls.key"));
hosts.forEach(host ->
sslList.add(new SslCrtAndKeyStream(host, keyCertChainInputStream, keyInputStream))
);
}
} catch (ApiException e) {
LOG.error("parse tls failed ", e);
}
}
}
res.setTlsConfigList(sslList);
}
}
return res;
}