Adapt to new netconf-topology model 17/142517/1
authorRavi Pendurty <ravi.pendurty@highstreet-technologies.com>
Wed, 26 Nov 2025 05:24:06 +0000 (10:54 +0530)
committerRavi Pendurty <ravi.pendurty@highstreet-technologies.com>
Wed, 26 Nov 2025 05:24:49 +0000 (10:54 +0530)
ConnectApp and ConfigApp now support new netconf-topology yang

Issue-ID: CCSDK-4137
Change-Id: Id9502fe3edadf6b1ce9494694c239b2a579d1fdc
Signed-off-by: Ravi Pendurty <ravi.pendurty@highstreet-technologies.com>
sdnr/wt-odlux/odlux/apps/configurationApp/src/services/restServices.ts
sdnr/wt-odlux/odlux/apps/connectApp/src/components/infoNetworkElementDialog.tsx
sdnr/wt-odlux/odlux/apps/connectApp/src/handlers/infoNetworkElementHandler.ts
sdnr/wt-odlux/odlux/apps/connectApp/src/models/topologyNetconf.ts
sdnr/wt-odlux/odlux/apps/connectApp/src/services/connectService.ts

index 0fcd945..56eb38b 100644 (file)
@@ -36,17 +36,19 @@ type ImportOnlyResponse = {
 type CapabilityResponse = {
   'network-topology:node': {
     'node-id': string;
-    'netconf-node-topology:available-capabilities': {
-      'available-capability': {
-        'capability-origin': string;
-        'capability': string;
-      }[];
-    };
-    'netconf-node-topology:unavailable-capabilities': {
-      'unavailable-capability': {
-        'capability': string;
-        'failure-reason': string;
-      }[];
+    'netconf-node-topology:netconf-node':{
+      'available-capabilities': {
+        'available-capability': {
+          'capability-origin': string;
+          'capability': string;
+        }[];
+      };
+      'unavailable-capabilities': {
+        'unavailable-capability': {
+          'capability': string;
+          'failure-reason': string;
+        }[];
+      };
     };
   }[];
 };
@@ -86,9 +88,9 @@ class RestService {
     const path = this.getNetworkElementUri(nodeId);
     const capabilitiesResult = await requestRest<CapabilityResponse>(path, { method: 'GET' });
     const availableCapabilities = capabilitiesResult && capabilitiesResult['network-topology:node'] && capabilitiesResult['network-topology:node'].length > 0 &&
-      (capabilitiesResult['network-topology:node'][0]['netconf-node-topology:available-capabilities'] &&
-        capabilitiesResult['network-topology:node'][0]['netconf-node-topology:available-capabilities']['available-capability'] &&
-        capabilitiesResult['network-topology:node'][0]['netconf-node-topology:available-capabilities']['available-capability'].map<any>(obj => convertPropertyNames(obj, replaceHyphen)) || [])
+      (capabilitiesResult['network-topology:node'][0]['netconf-node-topology:netconf-node']['available-capabilities'] &&
+        capabilitiesResult['network-topology:node'][0]['netconf-node-topology:netconf-node']['available-capabilities']['available-capability'] &&
+        capabilitiesResult['network-topology:node'][0]['netconf-node-topology:netconf-node']['available-capabilities']['available-capability'].map<any>(obj => convertPropertyNames(obj, replaceHyphen)) || [])
         .map(cap => {
           const capMatch = cap && capParser.exec(cap.capability);
           return capMatch ? {
@@ -99,9 +101,9 @@ class RestService {
         }).filter((cap) => cap != null) || [] as any;
 
     const unavailableCapabilities = capabilitiesResult && capabilitiesResult['network-topology:node'] && capabilitiesResult['network-topology:node'].length > 0 &&
-      (capabilitiesResult['network-topology:node'][0]['netconf-node-topology:unavailable-capabilities'] &&
-      capabilitiesResult['network-topology:node'][0]['netconf-node-topology:unavailable-capabilities']['unavailable-capability'] &&
-      capabilitiesResult['network-topology:node'][0]['netconf-node-topology:unavailable-capabilities']['unavailable-capability'].map<any>(obj => convertPropertyNames(obj, replaceHyphen)) || [])
+      (capabilitiesResult['network-topology:node'][0]['netconf-node-topology:netconf-node']['unavailable-capabilities'] &&
+      capabilitiesResult['network-topology:node'][0]['netconf-node-topology:netconf-node']['unavailable-capabilities']['unavailable-capability'] &&
+      capabilitiesResult['network-topology:node'][0]['netconf-node-topology:netconf-node']['unavailable-capabilities']['unavailable-capability'].map<any>(obj => convertPropertyNames(obj, replaceHyphen)) || [])
         .map(cap => {
           const capMatch = cap && capParser.exec(cap.capability);
           return capMatch ? {
index 4841b93..5a33a28 100644 (file)
@@ -79,7 +79,7 @@ class InfoNetworkElementDialogComponent extends React.Component<InfoNetworkEleme
 
   render(): JSX.Element {
     const setting = settings[this.props.mode];
-    const availableCapabilities = this.props.state.connect.elementInfo.elementInfo['netconf-node-topology:available-capabilities']['available-capability'];
+    const availableCapabilities = this.props.state.connect.elementInfo.elementInfo['netconf-node-topology:netconf-node']['available-capabilities']['available-capability'];
     let yangFeatures = this.props.state.connect.elementFeatureInfo.elementFeatureInfo;
     let yangCapabilities: AvailableCapabilities[] = [];
 
index 692e63a..3cae320 100644 (file)
@@ -33,8 +33,10 @@ export interface IInfoNetworkElementFeaturesState {
 const infoNetworkElementsStateInit: IInfoNetworkElementsState = {
   elementInfo: {
     'node-id': '',
-    'netconf-node-topology:available-capabilities': {
+    'netconf-node-topology:netconf-node':{
+      'available-capabilities': {
       'available-capability': [],
+      },
     },
   },
   busy: false,
index 85a1a71..5a806df 100644 (file)
@@ -27,7 +27,9 @@ export interface NetconfNodeTopologyAvailableCapabilities {
 
 export interface TopologyNode {
   'node-id': string;
-  'netconf-node-topology:available-capabilities': NetconfNodeTopologyAvailableCapabilities;
+  'netconf-node-topology:netconf-node':{
+    'available-capabilities': NetconfNodeTopologyAvailableCapabilities;
+  };
 }
 
 export interface Topology {
index 1d74f85..10f8567 100644 (file)
@@ -79,37 +79,41 @@ class ConnectService {
     const mountXml = [
       '<node xmlns="urn:TBD:params:xml:ns:yang:network-topology">',
       `<node-id>${networkElement.nodeId}</node-id>`,
+      `<netconf-node xmlns="urn:opendaylight:netconf-node-topology">`,
       `<host xmlns="urn:opendaylight:netconf-node-topology">${networkElement.host}</host>`,
       `<port xmlns="urn:opendaylight:netconf-node-topology">${networkElement.port}</port>`,
+      `<login-password-unencrypted xmlns="urn:opendaylight:netconf-node-topology">`,
       `<username xmlns="urn:opendaylight:netconf-node-topology">${networkElement.username}</username>`,
       `<password xmlns="urn:opendaylight:netconf-node-topology">${networkElement.password}</password>`,
+      `</login-password-unencrypted>`,
       '  <tcp-only xmlns="urn:opendaylight:netconf-node-topology">false</tcp-only>',
-
       '  <!-- non-mandatory fields with default values, you can safely remove these if you do not wish to override any of these values-->',
       '  <reconnect-on-changed-schema xmlns="urn:opendaylight:netconf-node-topology">false</reconnect-on-changed-schema>',
       '  <connection-timeout-millis xmlns="urn:opendaylight:netconf-node-topology">20000</connection-timeout-millis>',
       '  <max-connection-attempts xmlns="urn:opendaylight:netconf-node-topology">100</max-connection-attempts>',
-      '  <between-attempts-timeout-millis xmlns="urn:opendaylight:netconf-node-topology">2000</between-attempts-timeout-millis>',
-      '  <sleep-factor xmlns="urn:opendaylight:netconf-node-topology">1.5</sleep-factor>',
-
+      '  <min-backoff-millis xmlns="urn:opendaylight:netconf-node-topology">2000</min-backoff-millis>',
+      '  <backoff-multiplier xmlns="urn:opendaylight:netconf-node-topology">1.5</backoff-multiplier>',
       '  <!-- keepalive-delay set to 0 turns off keepalives-->',
       '  <keepalive-delay xmlns="urn:opendaylight:netconf-node-topology">120</keepalive-delay>',
+      '</netconf-node>',
       '</node>'].join('');
 
     const tlsXml = [
       '<node xmlns="urn:TBD:params:xml:ns:yang:network-topology">',
       `<node-id>${networkElement.nodeId}</node-id>`,
-      '<key-based xmlns="urn:opendaylight:netconf-node-topology">',
+      `<netconf-node xmlns="urn:opendaylight:netconf-node-topology">`,
+      `<key-based xmlns="urn:opendaylight:netconf-node-topology">`,
       `<key-id xmlns="urn:opendaylight:netconf-node-topology">${networkElement.tlsKey}</key-id>`,
       `<username xmlns="urn:opendaylight:netconf-node-topology">${networkElement.username}</username>`,
-      '</key-based>',
+      `</key-based>`,
       `<host xmlns="urn:opendaylight:netconf-node-topology">${networkElement.host}</host>`,
       `<port xmlns="urn:opendaylight:netconf-node-topology">${networkElement.port}</port>`,
-      '<tcp-only xmlns="urn:opendaylight:netconf-node-topology">false</tcp-only>',
-      '<protocol xmlns="urn:opendaylight:netconf-node-topology">',
-      '<name xmlns="urn:opendaylight:netconf-node-topology">TLS</name>',
-      ' </protocol>',
-      '<max-connection-attempts xmlns="urn:opendaylight:netconf-node-topology">2</max-connection-attempts>',
+      `<tcp-only xmlns="urn:opendaylight:netconf-node-topology">false</tcp-only>`,
+      `<protocol xmlns="urn:opendaylight:netconf-node-topology">`,
+      `<name xmlns="urn:opendaylight:netconf-node-topology">TLS</name>`,
+      ` </protocol>`,
+      `<max-connection-attempts xmlns="urn:opendaylight:netconf-node-topology">2</max-connection-attempts>`,
+      `</netconf-node>`,
       '</node>'].join('');
     let bodyXml;
     if (networkElement.password) {