in shenyu-kubernetes-controller/src/main/java/org/apache/shenyu/k8s/parser/SofaParser.java [93:146]
public ShenyuMemoryConfig parse(final V1Ingress ingress, final CoreV1Api coreV1Api) {
ShenyuMemoryConfig res = new ShenyuMemoryConfig();
if (Objects.nonNull(ingress.getSpec())) {
// Parse the sofa backend
V1IngressBackend sofaBackend = ingress.getSpec().getDefaultBackend();
List<V1IngressRule> rules = ingress.getSpec().getRules();
List<V1IngressTLS> tlsList = ingress.getSpec().getTls();
String namespace = Objects.requireNonNull(ingress.getMetadata()).getNamespace();
if (Objects.isNull(rules) || CollectionUtils.isEmpty(rules)) {
// if rules is null, sofaBackend become global default
if (Objects.nonNull(sofaBackend) && Objects.nonNull(sofaBackend.getService())) {
IngressConfiguration defaultRouteConfig = getSofaRouteConfig(ingress.getMetadata().getAnnotations());
res.setGlobalDefaultBackend(Pair.of(Pair.of(namespace + "/" + ingress.getMetadata().getName(), sofaBackend.getService().getName()),
defaultRouteConfig));
}
} else {
// if rules is not null, sofaBackend 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");
Map<String, byte[]> secretData = secret.getData();
if (MapUtils.isNotEmpty(secretData)) {
InputStream keyCertChainInputStream = new ByteArrayInputStream(secretData.get("tls.crt"));
InputStream keyInputStream = new ByteArrayInputStream(secretData.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;
}