From d7fee1edbad915718e28d1c7acfae3e7be28a655 Mon Sep 17 00:00:00 2001 From: lubos-cicut Date: Wed, 17 Jan 2024 17:53:30 +0100 Subject: [PATCH] Fix wrong path reference - schema for actions After rewrite we lost reference to parent node in some of actions paths. This patch repairs it. JIRA: NETCONF-938 Change-Id: I90d048a3157e0cf07b52621eee351ee6119790af Signed-off-by: lubos-cicut --- .../restconf/openapi/impl/PathsStream.java | 12 +++++------ .../restconf/openapi/model/PostEntity.java | 20 +++++++++++++++---- 2 files changed, 22 insertions(+), 10 deletions(-) diff --git a/restconf/restconf-openapi/src/main/java/org/opendaylight/restconf/openapi/impl/PathsStream.java b/restconf/restconf-openapi/src/main/java/org/opendaylight/restconf/openapi/impl/PathsStream.java index 61b3e37983..514f992fdf 100644 --- a/restconf/restconf-openapi/src/main/java/org/opendaylight/restconf/openapi/impl/PathsStream.java +++ b/restconf/restconf-openapi/src/main/java/org/opendaylight/restconf/openapi/impl/PathsStream.java @@ -146,7 +146,7 @@ public final class PathsStream extends InputStream { final var localName = moduleName + ":" + nodeLocalName; final var path = urlPrefix + "/" + processPath(node, pathParams, localName); processChildNode(node, pathParams, moduleName, result, path, nodeLocalName, isConfig, schemaContext, - deviceName, basePath); + deviceName, basePath, node); } } } @@ -156,7 +156,7 @@ public final class PathsStream extends InputStream { private static void processChildNode(final DataSchemaNode node, final List pathParams, final String moduleName, final Deque result, final String path, final String refPath, final boolean isConfig, final EffectiveModelContext schemaContext, final String deviceName, - final String basePath) { + final String basePath, final SchemaNode parentNode) { final var resourcePath = basePath + DATA + path; final var fullName = resolveFullNameFromNode(node.getQName(), schemaContext); final var firstChild = getListOrContainerChildNode((DataNodeContainer) node); @@ -175,7 +175,7 @@ public final class PathsStream extends InputStream { node.getQName(), schemaContext); final var childPath = basePath + OPERATIONS + resourceActionPath; result.add(processRootAndActionPathEntity(actionDef, childPath, actionParams, moduleName, - refPath, deviceName)); + refPath, deviceName, parentNode)); }); } for (final var childNode : childNodes) { @@ -186,7 +186,7 @@ public final class PathsStream extends InputStream { final var resourceDataPath = path + "/" + processPath(childNode, childParams, localName); final var newConfig = isConfig && childNode.isConfiguration(); processChildNode(childNode, childParams, moduleName, result, resourceDataPath, newRefPath, newConfig, - schemaContext, deviceName, basePath); + schemaContext, deviceName, basePath, node); } } } @@ -234,9 +234,9 @@ public final class PathsStream extends InputStream { private static PathEntity processRootAndActionPathEntity(final SchemaNode node, final String resourcePath, final List pathParams, final String moduleName, final String refPath, - final String deviceName) { + final String deviceName, final SchemaNode parentNode) { return new PathEntity(resourcePath, - new PostEntity(node, deviceName, moduleName, pathParams, refPath, null), + new PostEntity(node, deviceName, moduleName, pathParams, refPath, parentNode), null, null, null, null); } diff --git a/restconf/restconf-openapi/src/main/java/org/opendaylight/restconf/openapi/model/PostEntity.java b/restconf/restconf-openapi/src/main/java/org/opendaylight/restconf/openapi/model/PostEntity.java index 11172bfd57..7dceda734f 100644 --- a/restconf/restconf-openapi/src/main/java/org/opendaylight/restconf/openapi/model/PostEntity.java +++ b/restconf/restconf-openapi/src/main/java/org/opendaylight/restconf/openapi/model/PostEntity.java @@ -18,6 +18,7 @@ import javax.ws.rs.HttpMethod; import javax.ws.rs.core.MediaType; import org.eclipse.jdt.annotation.NonNull; import org.eclipse.jdt.annotation.Nullable; +import org.opendaylight.yangtools.yang.model.api.ActionDefinition; import org.opendaylight.yangtools.yang.model.api.ContainerSchemaNode; import org.opendaylight.yangtools.yang.model.api.DataNodeContainer; import org.opendaylight.yangtools.yang.model.api.DataSchemaNode; @@ -53,7 +54,7 @@ public final class PostEntity extends OperationEntity { if (parentNode instanceof Module) { return SUMMARY_TEMPLATE.formatted(HttpMethod.POST, deviceName(), moduleName(), moduleName()); } - if (parentNode != null) { + if (parentNode != null && !(schema() instanceof OperationDefinition)) { return SUMMARY_TEMPLATE.formatted(HttpMethod.POST, deviceName(), moduleName(), ((DataSchemaNode) parentNode).getQName().getLocalName()); } @@ -68,7 +69,7 @@ public final class PostEntity extends OperationEntity { final var operationName = rpc.getQName().getLocalName(); if (!output.getChildNodes().isEmpty()) { // TODO: add proper discriminator from DefinitionNames when schemas re-implementation is done - final var ref = COMPONENTS_PREFIX + moduleName() + "_" + operationName + "_output"; + final var ref = processOperationsRef(rpc, operationName, "_output"); generator.writeObjectFieldStart(String.valueOf(OK.getStatusCode())); generator.writeStringField(DESCRIPTION, String.format("RPC %s success", operationName)); @@ -103,7 +104,7 @@ public final class PostEntity extends OperationEntity { generator.writeObjectFieldStart(CONTENT); if (!input.getChildNodes().isEmpty()) { // TODO: add proper discriminator from DefinitionNames when schemas re-implementation is done - final var ref = COMPONENTS_PREFIX + moduleName() + "_" + operationName + INPUT_SUFFIX; + final var ref = processOperationsRef(rpc, operationName, INPUT_SUFFIX); generator.writeObjectFieldStart(MediaType.APPLICATION_JSON); generator.writeObjectFieldStart(SCHEMA); generator.writeObjectFieldStart("properties"); @@ -202,10 +203,21 @@ public final class PostEntity extends OperationEntity { @Override @Nullable String description() { - if (parentNode != null) { + if (parentNode != null && !(schema() instanceof OperationDefinition)) { return parentNode.getDescription().orElse(""); } else { return super.description(); } } + + private String processOperationsRef(final OperationDefinition def, final String operationName, final String suf) { + final var ref = COMPONENTS_PREFIX + moduleName() + "_" + operationName + suf; + if (def instanceof ActionDefinition && parentNode != null) { + final var parentName = ((DataSchemaNode) parentNode).getQName().getLocalName(); + if (!operationName.contains(parentName)) { + return COMPONENTS_PREFIX + moduleName() + "_" + parentName + "_" + operationName + suf; + } + } + return ref; + } } -- 2.36.6