Do not use Builders in netconf-testtool
[netconf.git] / netconf / tools / netconf-testtool / src / main / java / org / opendaylight / netconf / test / tool / PayloadCreator.java
1 /*
2  * Copyright (c) 2021 PANTHEON.tech, s.r.o. and others.  All rights reserved.
3  *
4  * This program and the accompanying materials are made available under the
5  * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6  * and is available at http://www.eclipse.org/legal/epl-v10.html
7  */
8 package org.opendaylight.netconf.test.tool;
9
10 import com.google.gson.stream.JsonWriter;
11 import java.io.IOException;
12 import java.io.StringWriter;
13 import java.util.List;
14 import org.opendaylight.mdsal.binding.runtime.spi.BindingRuntimeHelpers;
15 import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.device.rev240120.credentials.Credentials;
16 import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.device.rev240120.credentials.credentials.login.pw.unencrypted.LoginPasswordUnencrypted;
17 import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev231121.NetconfNodeFields;
18 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NetworkTopology;
19 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.Topology;
20 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node;
21 import org.opendaylight.yang.svc.v1.urn.opendaylight.netconf.node.topology.rev231121.YangModuleInfoImpl;
22 import org.opendaylight.yangtools.yang.common.QName;
23 import org.opendaylight.yangtools.yang.common.Uint16;
24 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier;
25 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifierWithPredicates;
26 import org.opendaylight.yangtools.yang.data.api.schema.SystemMapNode;
27 import org.opendaylight.yangtools.yang.data.api.schema.stream.NormalizedNodeStreamWriter;
28 import org.opendaylight.yangtools.yang.data.api.schema.stream.NormalizedNodeWriter;
29 import org.opendaylight.yangtools.yang.data.codec.gson.JSONCodecFactory;
30 import org.opendaylight.yangtools.yang.data.codec.gson.JSONCodecFactorySupplier;
31 import org.opendaylight.yangtools.yang.data.codec.gson.JSONNormalizedNodeStreamWriter;
32 import org.opendaylight.yangtools.yang.data.codec.gson.JsonWriterFactory;
33 import org.opendaylight.yangtools.yang.data.spi.node.ImmutableNodes;
34 import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext;
35 import org.opendaylight.yangtools.yang.model.api.stmt.SchemaNodeIdentifier.Absolute;
36 import org.slf4j.Logger;
37 import org.slf4j.LoggerFactory;
38
39 final class PayloadCreator {
40     private static final Logger LOG = LoggerFactory.getLogger(PayloadCreator.class);
41     private static final EffectiveModelContext NETWORK_TOPOLOGY_SCHEMA_CONTEXT =
42         BindingRuntimeHelpers.createEffectiveModel(List.of(YangModuleInfoImpl.getInstance()));
43     private static final JSONCodecFactory NETWORK_TOPOLOGY_JSON_CODEC_FACTORY =
44         JSONCodecFactorySupplier.RFC7951.getShared(NETWORK_TOPOLOGY_SCHEMA_CONTEXT);
45
46     private static final QName TOPOLOGY_ID_QNAME = QName.create(Topology.QNAME, "topology-id").intern();
47     private static final QName NODE_ID_QNAME = QName.create(Node.QNAME, "node-id").intern();
48
49     private static final NodeIdentifier PORT_NODE_IDENTIFIER =
50         NodeIdentifier.create(QName.create(NetconfNodeFields.QNAME, "port").intern());
51     private static final NodeIdentifier HOST_NODE_IDENTIFIER =
52         NodeIdentifier.create(QName.create(NetconfNodeFields.QNAME,"host").intern());
53     private static final NodeIdentifier USERNAME_NODE_IDENTIFIER =
54         NodeIdentifier.create(QName.create(NetconfNodeFields.QNAME,"username").intern());
55     private static final NodeIdentifier PASSWORD_NODE_IDENTIFIER =
56         NodeIdentifier.create(QName.create(NetconfNodeFields.QNAME, "password").intern());
57     private static final NodeIdentifier CREDENTIALS_NODE_IDENTIFIER =
58         // Note: this is an instantiated container, we need to use the proper namespace
59         NodeIdentifier.create(Credentials.QNAME.bindTo(NetconfNodeFields.QNAME.getModule()).intern());
60     private static final NodeIdentifier LOGIN_PASSWORD_UNENCRYPTED_NODE_IDENTIFIER =
61         // Note: this is an instantiated container, we need to use the proper namespace
62         NodeIdentifier.create(LoginPasswordUnencrypted.QNAME.bindTo(NetconfNodeFields.QNAME.getModule()).intern());
63     private static final NodeIdentifier TCP_ONLY_NODE_IDENTIFIER =
64         NodeIdentifier.create(QName.create(NetconfNodeFields.QNAME, "tcp-only").intern());
65     private static final NodeIdentifier KEEPALIVE_DELAY_NODE_IDENTIFIER =
66         NodeIdentifier.create(QName.create(NetconfNodeFields.QNAME, "keepalive-delay").intern());
67     private static final NodeIdentifier SCHEMALESS_NODE_IDENTIFIER =
68         NodeIdentifier.create(QName.create(NetconfNodeFields.QNAME, "schemaless").intern());
69     private static final String DEFAULT_TOPOLOGY_ID = "topology-netconf";
70     private static final String DEFAULT_NODE_PASSWORD = "admin";
71     private static final String DEFAULT_NODE_USERNAME = "admin";
72
73     private static final boolean DEFAULT_NODE_SCHEMALESS = false;
74     private static final int DEFAULT_NODE_KEEPALIVE_DELAY = 0;
75     private static final int DEFAULT_REQUEST_PAYLOAD_INDENTATION = 2;
76
77     private PayloadCreator() {
78         // hidden on purpose
79     }
80
81     static String createStringPayload(final List<Integer> devices, final TesttoolParameters parameters) {
82         return normalizedNodeToString(createNormalizedNodePayload(devices, parameters));
83     }
84
85     private static String normalizedNodeToString(final SystemMapNode node) {
86         final StringWriter writer = new StringWriter();
87         final JsonWriter jsonWriter = JsonWriterFactory.createJsonWriter(writer, DEFAULT_REQUEST_PAYLOAD_INDENTATION);
88         final NormalizedNodeStreamWriter jsonStream = JSONNormalizedNodeStreamWriter.createExclusiveWriter(
89                 NETWORK_TOPOLOGY_JSON_CODEC_FACTORY, Absolute.of(NetworkTopology.QNAME), null, jsonWriter);
90         try (NormalizedNodeWriter nodeWriter = NormalizedNodeWriter.forStreamWriter(jsonStream)) {
91             nodeWriter.write(node);
92         } catch (final IOException e) {
93             LOG.error("Failed to serialize node: {} to JSON", node, e);
94             throw new IllegalStateException("Failed to serialize node to JSON", e);
95         }
96         return writer.toString();
97     }
98
99     private static SystemMapNode createNormalizedNodePayload(final List<Integer> devices,
100             final TesttoolParameters parameters) {
101         final var nodeBuilder = ImmutableNodes.newSystemMapBuilder()
102             .withNodeIdentifier(NodeIdentifier.create(Node.QNAME));
103         for (final Integer device : devices) {
104             nodeBuilder.withChild(ImmutableNodes.newMapEntryBuilder()
105                 .withNodeIdentifier(NodeIdentifierWithPredicates.of(Node.QNAME, NODE_ID_QNAME, device + "-sim-device"))
106                 .withChild(ImmutableNodes.leafNode(PORT_NODE_IDENTIFIER, Uint16.valueOf(device)))
107                 .withChild(ImmutableNodes.leafNode(HOST_NODE_IDENTIFIER, parameters.generateConfigsAddress))
108                 .withChild(ImmutableNodes.newChoiceBuilder()
109                     .withNodeIdentifier(CREDENTIALS_NODE_IDENTIFIER)
110                     .withChild(ImmutableNodes.newContainerBuilder()
111                         .withNodeIdentifier(LOGIN_PASSWORD_UNENCRYPTED_NODE_IDENTIFIER)
112                         .withChild(ImmutableNodes.leafNode(USERNAME_NODE_IDENTIFIER, DEFAULT_NODE_USERNAME))
113                         .withChild(ImmutableNodes.leafNode(PASSWORD_NODE_IDENTIFIER, DEFAULT_NODE_PASSWORD))
114                         .build())
115                     .build())
116                 .withChild(ImmutableNodes.leafNode(TCP_ONLY_NODE_IDENTIFIER, !parameters.ssh))
117                 .withChild(ImmutableNodes.leafNode(KEEPALIVE_DELAY_NODE_IDENTIFIER, DEFAULT_NODE_KEEPALIVE_DELAY))
118                 .withChild(ImmutableNodes.leafNode(SCHEMALESS_NODE_IDENTIFIER, DEFAULT_NODE_SCHEMALESS))
119                 .build());
120         }
121
122         return ImmutableNodes.newSystemMapBuilder()
123             .withNodeIdentifier(NodeIdentifier.create(Topology.QNAME))
124             .withChild(ImmutableNodes.newMapEntryBuilder()
125                 .withNodeIdentifier(NodeIdentifierWithPredicates.of(Topology.QNAME,
126                     TOPOLOGY_ID_QNAME, DEFAULT_TOPOLOGY_ID))
127                 .withChild(nodeBuilder.build())
128                 .build())
129             .build();
130     }
131 }