Move restconf.common.util 79/101879/1
authorRobert Varga <robert.varga@pantheon.tech>
Thu, 28 Jul 2022 15:57:48 +0000 (17:57 +0200)
committerRobert Varga <robert.varga@pantheon.tech>
Thu, 28 Jul 2022 16:03:08 +0000 (18:03 +0200)
The contents of this package is only used by
RestconfOperationsServiceImpl, move them there and mark them as
reprecated.

JIRA: NETCONF-837
Change-Id: I8624be2d6d55f78e01004da718d93c30399f31f1
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
restconf/restconf-common/pom.xml
restconf/restconf-common/src/main/java/org/opendaylight/restconf/common/util/OperationsResourceUtils.java [deleted file]
restconf/restconf-nb-rfc8040/pom.xml
restconf/restconf-nb-rfc8040/src/main/java/org/opendaylight/restconf/nb/rfc8040/rests/services/impl/AbstractOperationDataSchemaNode.java [moved from restconf/restconf-common/src/main/java/org/opendaylight/restconf/common/util/AbstractOperationDataSchemaNode.java with 92% similarity]
restconf/restconf-nb-rfc8040/src/main/java/org/opendaylight/restconf/nb/rfc8040/rests/services/impl/AbstractOperationsModule.java [moved from restconf/restconf-common/src/main/java/org/opendaylight/restconf/common/util/AbstractOperationsModule.java with 90% similarity]
restconf/restconf-nb-rfc8040/src/main/java/org/opendaylight/restconf/nb/rfc8040/rests/services/impl/OperationsContainerSchemaNode.java [moved from restconf/restconf-common/src/main/java/org/opendaylight/restconf/common/util/OperationsContainerSchemaNode.java with 89% similarity]
restconf/restconf-nb-rfc8040/src/main/java/org/opendaylight/restconf/nb/rfc8040/rests/services/impl/OperationsEffectiveModuleContext.java [moved from restconf/restconf-common/src/main/java/org/opendaylight/restconf/common/util/OperationsEffectiveModuleContext.java with 88% similarity]
restconf/restconf-nb-rfc8040/src/main/java/org/opendaylight/restconf/nb/rfc8040/rests/services/impl/OperationsImportedModule.java [moved from restconf/restconf-common/src/main/java/org/opendaylight/restconf/common/util/OperationsImportedModule.java with 93% similarity]
restconf/restconf-nb-rfc8040/src/main/java/org/opendaylight/restconf/nb/rfc8040/rests/services/impl/OperationsLeafSchemaNode.java [moved from restconf/restconf-common/src/main/java/org/opendaylight/restconf/common/util/OperationsLeafSchemaNode.java with 90% similarity]
restconf/restconf-nb-rfc8040/src/main/java/org/opendaylight/restconf/nb/rfc8040/rests/services/impl/OperationsRestconfModule.java [moved from restconf/restconf-common/src/main/java/org/opendaylight/restconf/common/util/OperationsRestconfModule.java with 94% similarity]
restconf/restconf-nb-rfc8040/src/main/java/org/opendaylight/restconf/nb/rfc8040/rests/services/impl/RestconfOperationsServiceImpl.java

index c74ef8bfd0a3ae105c03828f67079670317b3800..ac042efd6043551145ea382eceb4d1ff5a76dfd0 100644 (file)
       <groupId>org.opendaylight.yangtools</groupId>
       <artifactId>yang-data-util</artifactId>
     </dependency>
-    <dependency>
-      <groupId>org.opendaylight.yangtools</groupId>
-      <artifactId>yang-data-impl</artifactId>
-    </dependency>
     <dependency>
       <groupId>org.opendaylight.yangtools</groupId>
       <artifactId>yang-model-api</artifactId>
     </dependency>
-    <dependency>
-      <groupId>org.opendaylight.yangtools</groupId>
-      <artifactId>yang-model-ri</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.opendaylight.yangtools</groupId>
-      <artifactId>yang-model-spi</artifactId>
-    </dependency>
     <dependency>
       <groupId>org.opendaylight.yangtools</groupId>
       <artifactId>yang-model-util</artifactId>
     </dependency>
-    <dependency>
-      <groupId>org.opendaylight.yangtools</groupId>
-      <artifactId>yang-xpath-api</artifactId>
-    </dependency>
     <dependency>
       <groupId>org.opendaylight.mdsal</groupId>
       <artifactId>mdsal-dom-api</artifactId>
diff --git a/restconf/restconf-common/src/main/java/org/opendaylight/restconf/common/util/OperationsResourceUtils.java b/restconf/restconf-common/src/main/java/org/opendaylight/restconf/common/util/OperationsResourceUtils.java
deleted file mode 100644 (file)
index ada0442..0000000
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- * Copyright (c) 2020 PANTHEON.tech, s.r.o. and others.  All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v1.0 which accompanies this distribution,
- * and is available at http://www.eclipse.org/legal/epl-v10.html
- */
-package org.opendaylight.restconf.common.util;
-
-import com.google.common.collect.ImmutableSet;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Map;
-import java.util.Map.Entry;
-import org.eclipse.jdt.annotation.NonNull;
-import org.eclipse.jdt.annotation.Nullable;
-import org.opendaylight.mdsal.dom.api.DOMMountPoint;
-import org.opendaylight.restconf.common.context.InstanceIdentifierContext;
-import org.opendaylight.yangtools.yang.common.Empty;
-import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier;
-import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode;
-import org.opendaylight.yangtools.yang.data.api.schema.builder.DataContainerNodeBuilder;
-import org.opendaylight.yangtools.yang.data.impl.schema.Builders;
-import org.opendaylight.yangtools.yang.data.impl.schema.ImmutableNodes;
-import org.opendaylight.yangtools.yang.model.api.Module;
-import org.opendaylight.yangtools.yang.model.api.RpcDefinition;
-import org.opendaylight.yangtools.yang.model.api.SchemaContext;
-import org.opendaylight.yangtools.yang.model.util.SchemaInferenceStack;
-
-
-// FIXME: remove this class
-public final class OperationsResourceUtils {
-    private OperationsResourceUtils() {
-        // Hidden on purpose
-    }
-
-    public static @NonNull Entry<InstanceIdentifierContext, ContainerNode>
-                contextForModelContext(final @NonNull SchemaContext context, final @Nullable DOMMountPoint mountPoint) {
-        // Determine which modules we need and construct leaf schemas to correspond to all RPC definitions
-        final Collection<Module> modules = new ArrayList<>();
-        final ArrayList<OperationsLeafSchemaNode> rpcLeafSchemas = new ArrayList<>();
-        for (final Module m : context.getModules()) {
-            final Collection<? extends RpcDefinition> rpcs = m.getRpcs();
-            if (!rpcs.isEmpty()) {
-                modules.add(new OperationsImportedModule(m));
-                rpcLeafSchemas.ensureCapacity(rpcLeafSchemas.size() + rpcs.size());
-                for (RpcDefinition rpc : rpcs) {
-                    rpcLeafSchemas.add(new OperationsLeafSchemaNode(rpc));
-                }
-            }
-        }
-
-        // Now generate a module for RESTCONF so that operations contain what they need
-        final OperationsContainerSchemaNode operatationsSchema = new OperationsContainerSchemaNode(rpcLeafSchemas);
-        modules.add(new OperationsRestconfModule(operatationsSchema));
-
-        // Now build the operations container and combine it with the context
-        final DataContainerNodeBuilder<NodeIdentifier, ContainerNode> operationsBuilder = Builders.containerBuilder()
-                .withNodeIdentifier(new NodeIdentifier(OperationsContainerSchemaNode.QNAME));
-        for (final OperationsLeafSchemaNode leaf : rpcLeafSchemas) {
-            operationsBuilder.withChild(ImmutableNodes.leafNode(leaf.getQName(), Empty.value()));
-        }
-
-        final var opContext = new OperationsEffectiveModuleContext(ImmutableSet.copyOf(modules));
-        final var stack = SchemaInferenceStack.of(opContext);
-        stack.enterSchemaTree(operatationsSchema.getQName());
-
-        return Map.entry(InstanceIdentifierContext.ofStack(stack, mountPoint), operationsBuilder.build());
-    }
-}
index 7e1859555415068caca148990d9d8c7d6ac4c705..27894c7516999fa81f5af96bb4a68584ab5ed7c3 100644 (file)
       <groupId>org.opendaylight.yangtools</groupId>
       <artifactId>yang-model-api</artifactId>
     </dependency>
+    <dependency>
+      <groupId>org.opendaylight.yangtools</groupId>
+      <artifactId>yang-model-ri</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.opendaylight.yangtools</groupId>
+      <artifactId>yang-model-spi</artifactId>
+    </dependency>
     <dependency>
       <groupId>org.opendaylight.yangtools</groupId>
       <artifactId>yang-model-util</artifactId>
       <groupId>org.opendaylight.yangtools</groupId>
       <artifactId>yang-repo-api</artifactId>
     </dependency>
+    <dependency>
+      <groupId>org.opendaylight.yangtools</groupId>
+      <artifactId>yang-xpath-api</artifactId>
+    </dependency>
 
     <dependency>
       <groupId>org.opendaylight.mdsal</groupId>
@@ -5,13 +5,14 @@
  * terms of the Eclipse Public License v1.0 which accompanies this distribution,
  * and is available at http://www.eclipse.org/legal/epl-v10.html
  */
-package org.opendaylight.restconf.common.util;
+package org.opendaylight.restconf.nb.rfc8040.rests.services.impl;
 
 import java.util.Optional;
 import org.opendaylight.yangtools.yang.model.api.DataSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.Status;
 import org.opendaylight.yangtools.yang.xpath.api.YangXPathExpression.QualifiedBound;
 
+@Deprecated(forRemoval = true, since = "4.0.0")
 abstract class AbstractOperationDataSchemaNode implements DataSchemaNode {
     @Override
     public final Status getStatus() {
@@ -5,12 +5,13 @@
  * terms of the Eclipse Public License v1.0 which accompanies this distribution,
  * and is available at http://www.eclipse.org/legal/epl-v10.html
  */
-package org.opendaylight.restconf.common.util;
+package org.opendaylight.restconf.nb.rfc8040.rests.services.impl;
 
 import java.util.Collection;
-import java.util.Collections;
+import java.util.List;
 import java.util.Map;
 import java.util.Optional;
+import java.util.Set;
 import org.eclipse.jdt.annotation.NonNull;
 import org.opendaylight.yangtools.yang.common.QNameModule;
 import org.opendaylight.yangtools.yang.common.UnresolvedQName;
@@ -36,6 +37,7 @@ import org.opendaylight.yangtools.yang.model.api.meta.StatementOrigin;
 import org.opendaylight.yangtools.yang.model.api.stmt.ModuleEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.ModuleStatement;
 
+@Deprecated(forRemoval = true, since = "4.0.0")
 abstract class AbstractOperationsModule implements Module, ModuleEffectiveStatement {
     @Override
     public final ModuleStatement getDeclared() {
@@ -76,7 +78,7 @@ abstract class AbstractOperationsModule implements Module, ModuleEffectiveStatem
     @Override
     public final Collection<? extends @NonNull ModuleImport> getImports() {
         // Yeah, not accurate, but this should not be needed
-        return Collections.emptySet();
+        return Set.of();
     }
 
     @Override
@@ -86,17 +88,17 @@ abstract class AbstractOperationsModule implements Module, ModuleEffectiveStatem
 
     @Override
     public final Collection<? extends TypeDefinition<?>> getTypeDefinitions() {
-        return Collections.emptySet();
+        return Set.of();
     }
 
     @Override
     public final Collection<? extends GroupingDefinition> getGroupings() {
-        return Collections.emptySet();
+        return Set.of();
     }
 
     @Override
     public final Collection<? extends UsesNode> getUses() {
-        return Collections.emptySet();
+        return Set.of();
     }
 
     @Override
@@ -111,7 +113,7 @@ abstract class AbstractOperationsModule implements Module, ModuleEffectiveStatem
 
     @Override
     public final Collection<? extends NotificationDefinition> getNotifications() {
-        return Collections.emptySet();
+        return Set.of();
     }
 
     @Override
@@ -126,37 +128,37 @@ abstract class AbstractOperationsModule implements Module, ModuleEffectiveStatem
 
     @Override
     public final Collection<? extends @NonNull Submodule> getSubmodules() {
-        return Collections.emptySet();
+        return Set.of();
     }
 
     @Override
     public final Collection<? extends @NonNull FeatureDefinition> getFeatures() {
-        return Collections.emptySet();
+        return Set.of();
     }
 
     @Override
     public final Collection<? extends @NonNull AugmentationSchemaNode> getAugmentations() {
-        return Collections.emptySet();
+        return Set.of();
     }
 
     @Override
     public final Collection<? extends @NonNull RpcDefinition> getRpcs() {
-        return Collections.emptySet();
+        return Set.of();
     }
 
     @Override
     public final Collection<? extends @NonNull Deviation> getDeviations() {
-        return Collections.emptySet();
+        return Set.of();
     }
 
     @Override
     public final Collection<? extends @NonNull IdentitySchemaNode> getIdentities() {
-        return Collections.emptySet();
+        return Set.of();
     }
 
     @Override
     public final Collection<? extends @NonNull ExtensionDefinition> getExtensionSchemaNodes() {
-        return Collections.emptyList();
+        return List.of();
     }
 
     @Override
@@ -5,13 +5,12 @@
  * terms of the Eclipse Public License v1.0 which accompanies this distribution,
  * and is available at http://www.eclipse.org/legal/epl-v10.html
  */
-package org.opendaylight.restconf.common.util;
+package org.opendaylight.restconf.nb.rfc8040.rests.services.impl;
 
 import static java.util.Objects.requireNonNull;
 
 import com.google.common.collect.Maps;
 import java.util.Collection;
-import java.util.Collections;
 import java.util.Map;
 import java.util.Set;
 import org.eclipse.jdt.annotation.NonNull;
@@ -27,6 +26,7 @@ import org.opendaylight.yangtools.yang.model.api.TypeDefinition;
 import org.opendaylight.yangtools.yang.model.api.UsesNode;
 import org.opendaylight.yangtools.yang.model.api.stmt.ContainerEffectiveStatement;
 
+@Deprecated(forRemoval = true, since = "4.0.0")
 final class OperationsContainerSchemaNode extends AbstractOperationDataSchemaNode implements ContainerSchemaNode {
     // There is no need to intern this nor add a revision, as we are providing the corresponding context anyway
     static final @NonNull QName QNAME = QName.create(OperationsRestconfModule.NAMESPACE, "operations");
@@ -55,37 +55,37 @@ final class OperationsContainerSchemaNode extends AbstractOperationDataSchemaNod
 
     @Override
     public Set<TypeDefinition<?>> getTypeDefinitions() {
-        return Collections.emptySet();
+        return Set.of();
     }
 
     @Override
     public Set<GroupingDefinition> getGroupings() {
-        return Collections.emptySet();
+        return Set.of();
     }
 
     @Override
     public Set<UsesNode> getUses() {
-        return Collections.emptySet();
+        return Set.of();
     }
 
     @Override
     public Set<AugmentationSchemaNode> getAvailableAugmentations() {
-        return Collections.emptySet();
+        return Set.of();
     }
 
     @Override
     public Set<NotificationDefinition> getNotifications() {
-        return Collections.emptySet();
+        return Set.of();
     }
 
     @Override
     public Set<ActionDefinition> getActions() {
-        return Collections.emptySet();
+        return Set.of();
     }
 
     @Override
     public Collection<@NonNull MustDefinition> getMustConstraints() {
-        return Collections.emptySet();
+        return Set.of();
     }
 
     @Override
@@ -5,7 +5,7 @@
  * terms of the Eclipse Public License v1.0 which accompanies this distribution,
  * and is available at http://www.eclipse.org/legal/epl-v10.html
  */
-package org.opendaylight.restconf.common.util;
+package org.opendaylight.restconf.nb.rfc8040.rests.services.impl;
 
 import static com.google.common.base.Verify.verify;
 
@@ -19,8 +19,9 @@ import org.opendaylight.yangtools.yang.model.api.Module;
 import org.opendaylight.yangtools.yang.model.api.stmt.ModuleEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.spi.SimpleSchemaContext;
 
+@Deprecated(forRemoval = true, since = "4.0.0")
 final class OperationsEffectiveModuleContext extends SimpleSchemaContext implements EffectiveModelContext {
-    private final Map<QNameModule, ModuleEffectiveStatement> modules;
+    private final ImmutableMap<QNameModule, ModuleEffectiveStatement> modules;
 
     OperationsEffectiveModuleContext(final Set<Module> modules) {
         super(modules);
@@ -5,7 +5,7 @@
  * terms of the Eclipse Public License v1.0 which accompanies this distribution,
  * and is available at http://www.eclipse.org/legal/epl-v10.html
  */
-package org.opendaylight.restconf.common.util;
+package org.opendaylight.restconf.nb.rfc8040.rests.services.impl;
 
 import static java.util.Objects.requireNonNull;
 
@@ -17,6 +17,7 @@ import org.opendaylight.yangtools.yang.model.api.DataSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.Module;
 import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement;
 
+@Deprecated(forRemoval = true, since = "4.0.0")
 final class OperationsImportedModule extends AbstractOperationsModule {
     private final Module original;
 
@@ -5,10 +5,10 @@
  * terms of the Eclipse Public License v1.0 which accompanies this distribution,
  * and is available at http://www.eclipse.org/legal/epl-v10.html
  */
-package org.opendaylight.restconf.common.util;
+package org.opendaylight.restconf.nb.rfc8040.rests.services.impl;
 
 import java.util.Collection;
-import java.util.Collections;
+import java.util.Set;
 import org.eclipse.jdt.annotation.NonNull;
 import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.model.api.LeafSchemaNode;
@@ -18,6 +18,7 @@ import org.opendaylight.yangtools.yang.model.api.TypeDefinition;
 import org.opendaylight.yangtools.yang.model.api.stmt.LeafEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.ri.type.BaseTypes;
 
+@Deprecated(forRemoval = true, since = "4.0.0")
 final class OperationsLeafSchemaNode extends AbstractOperationDataSchemaNode implements LeafSchemaNode {
     private final QName qname;
 
@@ -43,7 +44,7 @@ final class OperationsLeafSchemaNode extends AbstractOperationDataSchemaNode imp
 
     @Override
     public Collection<@NonNull MustDefinition> getMustConstraints() {
-        return Collections.emptySet();
+        return Set.of();
     }
 
     @Override
@@ -5,7 +5,7 @@
  * terms of the Eclipse Public License v1.0 which accompanies this distribution,
  * and is available at http://www.eclipse.org/legal/epl-v10.html
  */
-package org.opendaylight.restconf.common.util;
+package org.opendaylight.restconf.nb.rfc8040.rests.services.impl;
 
 import static java.util.Objects.requireNonNull;
 
@@ -18,6 +18,7 @@ import org.opendaylight.yangtools.yang.common.XMLNamespace;
 import org.opendaylight.yangtools.yang.model.api.DataSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement;
 
+@Deprecated(forRemoval = true, since = "4.0.0")
 final class OperationsRestconfModule extends AbstractOperationsModule {
     // There is no need to intern this nor add a revision, as we are providing the corresponding context anyway
     static final @NonNull QNameModule NAMESPACE =
index 8cfa859799cdd6ee6b26d6e2e4ef3cfad391254c..ce95a84fb45125bde34dc31a40325d905a49ad20 100644 (file)
@@ -9,24 +9,39 @@ package org.opendaylight.restconf.nb.rfc8040.rests.services.impl;
 
 import static java.util.Objects.requireNonNull;
 
+import com.google.common.collect.ImmutableSet;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Map;
+import java.util.Map.Entry;
 import java.util.Optional;
 import javax.ws.rs.Path;
 import javax.ws.rs.core.UriInfo;
+import org.eclipse.jdt.annotation.NonNull;
+import org.eclipse.jdt.annotation.Nullable;
 import org.opendaylight.mdsal.dom.api.DOMMountPoint;
 import org.opendaylight.mdsal.dom.api.DOMMountPointService;
 import org.opendaylight.mdsal.dom.api.DOMSchemaService;
 import org.opendaylight.restconf.common.context.InstanceIdentifierContext;
 import org.opendaylight.restconf.common.errors.RestconfDocumentedException;
-import org.opendaylight.restconf.common.util.OperationsResourceUtils;
 import org.opendaylight.restconf.nb.rfc8040.handlers.SchemaContextHandler;
 import org.opendaylight.restconf.nb.rfc8040.legacy.NormalizedNodePayload;
 import org.opendaylight.restconf.nb.rfc8040.rests.services.api.RestconfOperationsService;
 import org.opendaylight.restconf.nb.rfc8040.utils.RestconfConstants;
 import org.opendaylight.restconf.nb.rfc8040.utils.parser.ParserIdentifier;
+import org.opendaylight.yangtools.yang.common.Empty;
 import org.opendaylight.yangtools.yang.common.ErrorTag;
 import org.opendaylight.yangtools.yang.common.ErrorType;
+import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier;
+import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode;
+import org.opendaylight.yangtools.yang.data.api.schema.builder.DataContainerNodeBuilder;
+import org.opendaylight.yangtools.yang.data.impl.schema.Builders;
+import org.opendaylight.yangtools.yang.data.impl.schema.ImmutableNodes;
 import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext;
+import org.opendaylight.yangtools.yang.model.api.Module;
+import org.opendaylight.yangtools.yang.model.api.RpcDefinition;
 import org.opendaylight.yangtools.yang.model.api.SchemaContext;
+import org.opendaylight.yangtools.yang.model.util.SchemaInferenceStack;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -75,7 +90,7 @@ public class RestconfOperationsServiceImpl implements RestconfOperationsService
         final InstanceIdentifierContext mountPointIdentifier = ParserIdentifier.toInstanceIdentifier(identifier,
             schemaContextHandler.get(), Optional.of(mountPointService));
         final DOMMountPoint mountPoint = mountPointIdentifier.getMountPoint();
-        final var entry = OperationsResourceUtils.contextForModelContext(modelContext(mountPoint), mountPoint);
+        final var entry = contextForModelContext(modelContext(mountPoint), mountPoint);
         return NormalizedNodePayload.of(entry.getKey(), entry.getValue());
     }
 
@@ -84,4 +99,41 @@ public class RestconfOperationsServiceImpl implements RestconfOperationsService
             .flatMap(svc -> Optional.ofNullable(svc.getGlobalContext()))
             .orElse(null);
     }
+
+    // FIXME: remove this method and everything it uses
+    @Deprecated(forRemoval = true, since = "4.0.0")
+    private static @NonNull Entry<InstanceIdentifierContext, ContainerNode> contextForModelContext(
+            final @NonNull EffectiveModelContext context, final @Nullable DOMMountPoint mountPoint) {
+        // Determine which modules we need and construct leaf schemas to correspond to all RPC definitions
+        final Collection<Module> modules = new ArrayList<>();
+        final ArrayList<OperationsLeafSchemaNode> rpcLeafSchemas = new ArrayList<>();
+        for (final Module m : context.getModules()) {
+            final Collection<? extends RpcDefinition> rpcs = m.getRpcs();
+            if (!rpcs.isEmpty()) {
+                modules.add(new OperationsImportedModule(m));
+                rpcLeafSchemas.ensureCapacity(rpcLeafSchemas.size() + rpcs.size());
+                for (RpcDefinition rpc : rpcs) {
+                    rpcLeafSchemas.add(new OperationsLeafSchemaNode(rpc));
+                }
+            }
+        }
+
+        // Now generate a module for RESTCONF so that operations contain what they need
+        final OperationsContainerSchemaNode operatationsSchema = new OperationsContainerSchemaNode(rpcLeafSchemas);
+        modules.add(new OperationsRestconfModule(operatationsSchema));
+
+        // Now build the operations container and combine it with the context
+        final DataContainerNodeBuilder<NodeIdentifier, ContainerNode> operationsBuilder = Builders.containerBuilder()
+                .withNodeIdentifier(new NodeIdentifier(OperationsContainerSchemaNode.QNAME));
+        for (final OperationsLeafSchemaNode leaf : rpcLeafSchemas) {
+            operationsBuilder.withChild(ImmutableNodes.leafNode(leaf.getQName(), Empty.value()));
+        }
+
+        final var opContext = new OperationsEffectiveModuleContext(ImmutableSet.copyOf(modules));
+        final var stack = SchemaInferenceStack.of(opContext);
+        stack.enterSchemaTree(operatationsSchema.getQName());
+
+        return Map.entry(InstanceIdentifierContext.ofStack(stack, mountPoint), operationsBuilder.build());
+    }
+
 }