From 3d02271058d2e59a71e49afdd866462f7b6ab1c6 Mon Sep 17 00:00:00 2001 From: Aijana Schumann Date: Wed, 12 Aug 2020 12:28:06 +0200 Subject: Switch odlux from Biermann-RestConf to RFC8040 interface Switched rest-calls in odlux to use RFC8040 interface Issue-ID: CCSDK-2565 Signed-off-by: Aijana Schumann Change-Id: Ia59dd02bc6456bad648083146c0256f204e134d1 --- .../configurationApp/src/actions/deviceActions.ts | 46 ++++++++++++++-------- .../configurationApp/src/services/restServices.ts | 20 +++++----- .../odlux/apps/configurationApp/webpack.config.js | 35 ++++++++++------ .../apps/connectApp/src/services/connectService.ts | 28 ++++++------- sdnr/wt/odlux/apps/connectApp/webpack.config.js | 14 ++++--- .../faultApp/src/actions/clearStuckAlarmsAction.ts | 6 +-- .../src/components/clearStuckAlarmsDialog.tsx | 43 ++++++++++---------- .../faultApp/src/handlers/faultAppRootHandler.ts | 1 - sdnr/wt/odlux/apps/faultApp/src/models/fault.ts | 2 - .../faultApp/src/services/faultStatusService.ts | 12 +++--- sdnr/wt/odlux/apps/faultApp/webpack.config.js | 18 +++++---- .../odlux/apps/helpApp/src/services/helpService.ts | 2 +- .../inventoryApp/src/services/inventoryService.ts | 4 +- sdnr/wt/odlux/apps/inventoryApp/webpack.config.js | 22 +++++------ .../src/services/maintenenceService.ts | 8 ++-- .../wt/odlux/apps/maintenanceApp/webpack.config.js | 18 +++++---- .../mediatorApp/src/services/mediatorService.ts | 4 +- .../src/services/performanceHistoryService.ts | 18 ++++----- .../apps/performanceHistoryApp/webpack.config.js | 24 ++++++++--- sdnr/wt/odlux/framework/pom.xml | 15 ++++++- .../wt/odlux/framework/src/models/elasticSearch.ts | 13 ++++-- .../wt/odlux/framework/src/services/restService.ts | 8 ++-- .../odlux/framework/src/utilities/elasticSearch.ts | 10 ++--- sdnr/wt/odlux/framework/src/views/about.tsx | 2 +- .../framework/src2/main/resources/version.json | 4 ++ sdnr/wt/odlux/framework/webpack.config.js | 12 +++--- sdnr/wt/odlux/yarn.lock | 12 +++--- 27 files changed, 235 insertions(+), 166 deletions(-) create mode 100644 sdnr/wt/odlux/framework/src2/main/resources/version.json diff --git a/sdnr/wt/odlux/apps/configurationApp/src/actions/deviceActions.ts b/sdnr/wt/odlux/apps/configurationApp/src/actions/deviceActions.ts index dbe95e0d1..1db66c0d4 100644 --- a/sdnr/wt/odlux/apps/configurationApp/src/actions/deviceActions.ts +++ b/sdnr/wt/odlux/apps/configurationApp/src/actions/deviceActions.ts @@ -89,7 +89,8 @@ export const splitVPath = (vPath: string, vPathParser : RegExp): [string, string const getReferencedDataList = async (refPath: string, dataPath: string, modules: { [name: string]: Module }, views: ViewSpecification[]) => { const pathParts = splitVPath(refPath, /(?:(?:([^\/\:]+):)?([^\/]+))/g); // 1 = opt: namespace / 2 = property - let referencedModule = modules[pathParts[0][0]]; + const defaultNS = pathParts[0][0]; + let referencedModule = modules[defaultNS]; let dataMember: string; let view: ViewSpecification; @@ -121,14 +122,17 @@ const getReferencedDataList = async (refPath: string, dataPath: string, modules: throw new Error(`Server Error. Status: [${restResult.status}]\n${message || restResult.message || ''}`); } - let dataRaw = restResult.data[dataMember!]; + let dataRaw = restResult.data[`${defaultNS}:${dataMember!}`]; + if (dataRaw === undefined) { + dataRaw = restResult.data[dataMember!]; + } dataRaw = dataRaw instanceof Array ? dataRaw[0] : dataRaw; data = dataRaw && dataRaw[viewElement.label] || []; const keys: string[] = data.map((entry: { [key: string]: any } )=> entry[viewElement.key!]); - resultingDataUrls.push(...keys.map(key => `${dataUrl}/${viewElement.label.replace(/\//ig, "%2F")}/${key.replace(/\//ig, "%2F")}`)); + resultingDataUrls.push(...keys.map(key => `${dataUrl}/${viewElement.label.replace(/\//ig, "%2F")}=${key.replace(/\//ig, "%2F")}`)); } dataMember = viewElement.label; } else { @@ -149,7 +153,10 @@ const getReferencedDataList = async (refPath: string, dataPath: string, modules: const message = restResult.data && restResult.data.errors && restResult.data.errors.error && restResult.data.errors.error[0] && restResult.data.errors.error[0]["error-message"] || ""; throw new Error(`Server Error. Status: [${restResult.status}]\n${message || restResult.message || ''}`); } - let dataRaw = restResult.data[dataMember!]; + let dataRaw = restResult.data[`${defaultNS}:${dataMember!}`]; + if (dataRaw === undefined) { + dataRaw = restResult.data[dataMember!]; + } dataRaw = dataRaw instanceof Array ? dataRaw[0] : dataRaw; @@ -227,7 +234,7 @@ const flatenViewElements = (defaultNS: string | null, parentPath: string, elemen export const updateViewActionAsyncCreator = (vPath: string) => async (dispatch: Dispatch, getState: () => IApplicationStoreState) => { const pathParts = splitVPath(vPath, /(?:([^\/\["]+)(?:\[([^\]]*)\])?)/g); // 1 = property / 2 = optional key const { configuration: { deviceDescription: { nodeId, modules, views } }, framework: { navigationState } } = getState(); - let dataPath = `/restconf/config/network-topology:network-topology/topology/topology-netconf/node/${nodeId}/yang-ext:mount`; + let dataPath = `/rests/data/network-topology:network-topology/topology=topology-netconf/node=${nodeId}/yang-ext:mount`; let inputViewSpecification: ViewSpecification | undefined = undefined; let outputViewSpecification: ViewSpecification | undefined = undefined; @@ -302,7 +309,11 @@ export const updateViewActionAsyncCreator = (vPath: string) => async (dispatch: } extractList = true; } else { - dataPath += `/${property}${key ? `/${key.replace(/\//ig, "%2F")}` : ""}`; + // normal case + dataPath += `/${property}${key ? `=${key.replace(/\//ig, "%2F")}` : ""}`; + + // in case of the root element the required namespace will be added later, + // while extracting the data dataMember = namespace === defaultNS ? viewElement.label : `${namespace}:${viewElement.label}`; @@ -352,7 +363,11 @@ export const updateViewActionAsyncCreator = (vPath: string) => async (dispatch: const message = restResult.data.errors && restResult.data.errors.error && restResult.data.errors.error[0] && restResult.data.errors.error[0]["error-message"] || ""; throw new Error(`Server Error. Status: [${restResult.status}]\n${message}`); } else { - data = restResult.data[dataMember!]; // extract dataMember + // https://tools.ietf.org/html/rfc7951#section-4 the root element may countain a namesapce or not ! + data = restResult.data[`${defaultNS}:${dataMember!}`]; + if (data === undefined) { + data = restResult.data[dataMember!]; // extract dataMember w/o namespace + } } // extract the first element list[key] @@ -405,7 +420,7 @@ export const updateViewActionAsyncCreator = (vPath: string) => async (dispatch: export const updateDataActionAsyncCreator = (vPath: string, data: any) => async (dispatch: Dispatch, getState: () => IApplicationStoreState) => { const pathParts = splitVPath(vPath, /(?:([^\/\["]+)(?:\[([^\]]*)\])?)/g); // 1 = property / 2 = optional key const { configuration: { deviceDescription: { nodeId, views } } } = getState(); - let dataPath = `/restconf/config/network-topology:network-topology/topology/topology-netconf/node/${nodeId}/yang-ext:mount`; + let dataPath = `/rests/data/network-topology:network-topology/topology=topology-netconf/node=${nodeId}/yang-ext:mount`; let viewSpecification: ViewSpecification = views[0]; let viewElement: ViewElement; let dataMember: string; @@ -445,7 +460,7 @@ export const updateDataActionAsyncCreator = (vPath: string, data: any) => async } } - dataPath += `/${property}${key ? `/${key.replace(/\//ig, "%2F")}` : ""}`; + dataPath += `/${property}${key ? `=${key.replace(/\//ig, "%2F")}` : ""}`; dataMember = viewElement.label; embedList = false; @@ -466,7 +481,7 @@ export const updateDataActionAsyncCreator = (vPath: string, data: any) => async // do not extract root member (0) if (viewSpecification && viewSpecification.id !== "0") { - const updateResult = await restService.setConfigData(dataPath, { [dataMember!]: data }); // extractDataMember + const updateResult = await restService.setConfigData(dataPath, { [`${defaultNS}:${dataMember!}`]: data }); // addDataMember using defaultNS if (updateResult.status < 200 || updateResult.status > 299) { const message = updateResult.data && updateResult.data.errors && updateResult.data.errors.error && updateResult.data.errors.error[0] && updateResult.data.errors.error[0]["error-message"] || ""; throw new Error(`Server Error. Status: [${updateResult.status}]\n${message || updateResult.message || ''}`); @@ -499,7 +514,7 @@ export const updateDataActionAsyncCreator = (vPath: string, data: any) => async export const removeElementActionAsyncCreator = (vPath: string) => async (dispatch: Dispatch, getState: () => IApplicationStoreState) => { const pathParts = splitVPath(vPath, /(?:([^\/\["]+)(?:\[([^\]]*)\])?)/g); // 1 = property / 2 = optional key const { configuration: { deviceDescription: { nodeId, views } } } = getState(); - let dataPath = `/restconf/config/network-topology:network-topology/topology/topology-netconf/node/${nodeId}/yang-ext:mount`; + let dataPath = `/rests/data/network-topology:network-topology/topology=topology-netconf/node=${nodeId}/yang-ext:mount`; let viewSpecification: ViewSpecification = views[0]; let viewElement: ViewElement; @@ -529,7 +544,7 @@ export const removeElementActionAsyncCreator = (vPath: string) => async (dispatc } } - dataPath += `/${property}${key ? `/${key.replace(/\//ig, "%2F")}` : ""}`; + dataPath += `/${property}${key ? `=${key.replace(/\//ig, "%2F")}` : ""}`; if (viewElement && "viewId" in viewElement) { viewSpecification = views[+viewElement.viewId]; @@ -555,7 +570,7 @@ export const removeElementActionAsyncCreator = (vPath: string) => async (dispatc export const executeRpcActionAsyncCreator = (vPath: string, data: any) => async (dispatch: Dispatch, getState: () => IApplicationStoreState) => { const pathParts = splitVPath(vPath, /(?:([^\/\["]+)(?:\[([^\]]*)\])?)/g); // 1 = property / 2 = optional key const { configuration: { deviceDescription: { nodeId, views }, viewDescription: oldViewDescription } } = getState(); - let dataPath = `/restconf/operations/network-topology:network-topology/topology/topology-netconf/node/${nodeId}/yang-ext:mount`; + let dataPath = `/rests/operations/network-topology:network-topology/topology=topology-netconf/node=${nodeId}/yang-ext:mount`; let viewSpecification: ViewSpecification = views[0]; let viewElement: ViewElement; let dataMember: string; @@ -595,7 +610,7 @@ export const executeRpcActionAsyncCreator = (vPath: string, data: any) => async // } } - dataPath += `/${property}${key ? `/${key.replace(/\//ig, "%2F")}` : ""}`; + dataPath += `/${property}${key ? `=${key.replace(/\//ig, "%2F")}` : ""}`; dataMember = viewElement.label; embedList = false; @@ -637,8 +652,7 @@ export const executeRpcActionAsyncCreator = (vPath: string, data: any) => async const message = updateResult.data && updateResult.data.errors && updateResult.data.errors.error && updateResult.data.errors.error[0] && updateResult.data.errors.error[0]["error-message"] || ""; throw new Error(`Server Error. Status: [${updateResult.status}]\n${message || updateResult.message || ''}`); } - const viewData = { ...oldViewDescription.viewData, output: updateResult.data || null}; - dispatch(new UpdatOutputData(viewData)); + dispatch(new UpdatOutputData(updateResult.data)); } else { throw new Error(`There is NO RPC specified.`); } diff --git a/sdnr/wt/odlux/apps/configurationApp/src/services/restServices.ts b/sdnr/wt/odlux/apps/configurationApp/src/services/restServices.ts index b260f1ffb..eb2c67c26 100644 --- a/sdnr/wt/odlux/apps/configurationApp/src/services/restServices.ts +++ b/sdnr/wt/odlux/apps/configurationApp/src/services/restServices.ts @@ -23,10 +23,10 @@ import { NetworkElementConnection } from "../models/networkElementConnection"; class RestService { public async getCapabilitiesByMoutId(nodeId: string): Promise<{ "capabilityOrigin": string, "capability": string }[] | null> { - const path = `/restconf/operational/network-topology:network-topology/topology/topology-netconf/node/${nodeId}`; - const capabilitiesResult = await requestRest<{ node: { "node-id": string, "netconf-node-topology:available-capabilities": { "available-capability": { "capabilityOrigin": string, "capability": string }[] }}[] }>(path, { method: "GET" }); - return capabilitiesResult && capabilitiesResult.node && capabilitiesResult.node.length > 0 && - capabilitiesResult.node[0]["netconf-node-topology:available-capabilities"]["available-capability"].map(obj => convertPropertyNames(obj, replaceHyphen)) || null; + const path = `/rests/data/network-topology:network-topology/topology=topology-netconf/node=${nodeId}`; + const capabilitiesResult = await requestRest<{"network-topology:node": {"node-id": string, "netconf-node-topology:available-capabilities": { "available-capability": { "capability-origin": string, "capability": string }[] }}[] }>(path, { method: "GET" }); + return capabilitiesResult && capabilitiesResult["network-topology:node"] && capabilitiesResult["network-topology:node"].length > 0 && + capabilitiesResult["network-topology:node"][0]["netconf-node-topology:available-capabilities"]["available-capability"].map(obj => convertPropertyNames(obj, replaceHyphen)) || null; } public async getMountedNetworkElementByMountId(nodeId: string): Promise { @@ -34,13 +34,13 @@ class RestService { // const connectedNetworkElement = await requestRest(path, { method: "GET" }); // return connectedNetworkElement || null; - const path = "/restconf/operations/data-provider:read-network-element-connection-list"; - const body = { "input": { "filter": [{ "property": "node-id", "filtervalue": nodeId }], "sortorder": [], "pagination": { "size": 1, "page": 1 } } }; - const networkElementResult = await requestRest<{ output: { data: NetworkElementConnection[] } }>(path, { method: "POST", body: JSON.stringify(body) }); - return networkElementResult && networkElementResult.output && networkElementResult.output.data && - networkElementResult.output.data.map(obj => convertPropertyNames(obj, replaceHyphen))[0] || null; + const path = "/rests/operations/data-provider:read-network-element-connection-list"; + const body = { "data-provider:input": { "filter": [{ "property": "node-id", "filtervalue": nodeId }], "sortorder": [], "pagination": { "size": 1, "page": 1 } } }; + const networkElementResult = await requestRest<{ "data-provider:output": { data: NetworkElementConnection[] } }>(path, { method: "POST", body: JSON.stringify(body) }); + return networkElementResult && networkElementResult["data-provider:output"] && networkElementResult["data-provider:output"].data && + networkElementResult["data-provider:output"].data.map(obj => convertPropertyNames(obj, replaceHyphen))[0] || null; } - + /** Reads the config data by restconf path. * @param path The restconf path to be used for read. * @returns The data. diff --git a/sdnr/wt/odlux/apps/configurationApp/webpack.config.js b/sdnr/wt/odlux/apps/configurationApp/webpack.config.js index dccf34919..329eb00f4 100644 --- a/sdnr/wt/odlux/apps/configurationApp/webpack.config.js +++ b/sdnr/wt/odlux/apps/configurationApp/webpack.config.js @@ -107,8 +107,11 @@ module.exports = (env) => { ] ], + watchOptions: { + ignored: /node_modules/ + }, + devServer: { - public: "http://localhost:3100", contentBase: frameworkPath, compress: true, @@ -125,31 +128,39 @@ module.exports = (env) => { stats: { colors: true }, - proxy: { - "/oauth2/": { - target: "http://localhost:48181", - secure: false - }, + proxy: { "/yang-schema/": { - target: "http://localhost:48181", + target: "http://10.20.6.29:48181", + secure: false + }, + "/oauth2/": { + target: "http://10.20.6.29:48181", secure: false }, "/database/": { - target: "http://localhost:48181", + target: "http://10.20.6.29:48181", secure: false }, "/restconf/": { - target: "http://localhost:48181", + target: "http://10.20.6.29:48181", + secure: false + }, + "/rests/": { + target: "http://10.20.6.29:48181", secure: false }, "/help/": { - target: "http://localhost:48181", + target: "http://10.20.6.29:48181", + secure: false + }, + "/tree/": { + target: "http://10.20.6.29:48181", secure: false }, "/websocket": { - target: "http://localhost:48181", + target: "http://10.20.6.29:48181", ws: true, - changeOrigin: false, + changeOrigin: true, secure: false } } diff --git a/sdnr/wt/odlux/apps/connectApp/src/services/connectService.ts b/sdnr/wt/odlux/apps/connectApp/src/services/connectService.ts index 41449e83f..2aa9e3958 100644 --- a/sdnr/wt/odlux/apps/connectApp/src/services/connectService.ts +++ b/sdnr/wt/odlux/apps/connectApp/src/services/connectService.ts @@ -33,9 +33,9 @@ class ConnectService { * Inserts a network elements. */ public async createNetworkElement(element: NetworkElementConnection): Promise { - const path = `/restconf/operations/data-provider:create-network-element-connection`; + const path = `/rests/operations/data-provider:create-network-element-connection`; const result = await requestRest(path, { - method: "POST", body: JSON.stringify(convertPropertyNames({ input: element }, replaceUpperCase)) + method: "POST", body: JSON.stringify(convertPropertyNames({ "data-provider:input": element }, replaceUpperCase)) }); return result || null; } @@ -44,9 +44,9 @@ class ConnectService { * Updates a network element. */ public async updateNetworkElement(element: UpdateNetworkElement): Promise { - const path = `/restconf/operations/data-provider:update-network-element-connection`; + const path = `/rests/operations/data-provider:update-network-element-connection`; const result = await requestRest(path, { - method: "POST", body: JSON.stringify(convertPropertyNames({ input: element }, replaceUpperCase)) + method: "POST", body: JSON.stringify(convertPropertyNames({ "data-provider:input": element }, replaceUpperCase)) }); return result || null; } @@ -58,16 +58,16 @@ class ConnectService { const query = { "id": element.id }; - const path = `/restconf/operations/data-provider:delete-network-element-connection`; + const path = `/rests/operations/data-provider:delete-network-element-connection`; const result = await requestRest(path, { - method: "POST", body: JSON.stringify(convertPropertyNames({ input: query }, replaceUpperCase)) + method: "POST", body: JSON.stringify(convertPropertyNames({ "data-provider:input": query }, replaceUpperCase)) }); return result || null; } /** Mounts network element. */ public async mountNetworkElement(networkElement: NetworkElementConnection): Promise { - const path = 'restconf/config/network-topology:network-topology/topology/topology-netconf/node/' + networkElement.nodeId; + const path = '/rests/data/network-topology:network-topology/topology=topology-netconf/node=' + networkElement.nodeId; const mountXml = [ '', `${networkElement.nodeId}`, @@ -106,7 +106,7 @@ class ConnectService { /** Unmounts a network element by its id. */ public async unmountNetworkElement(nodeId: string): Promise { - const path = 'restconf/config/network-topology:network-topology/topology/topology-netconf/node/' + nodeId; + const path = '/rests/data/network-topology:network-topology/topology=topology-netconf/node=' + nodeId; try { const result = await requestRest(path, { @@ -126,7 +126,7 @@ class ConnectService { /** Yang capabilities of the selected network elements. */ public async infoNetworkElement(nodeId: string): Promise { - const path = 'restconf/operational/network-topology:network-topology/topology/topology-netconf/node/' + nodeId; + const path = '/rests/operational/network-topology:network-topology/topology=topology-netconf/node=' + nodeId; const topologyRequestPomise = requestRest(path, { method: "GET" }); return topologyRequestPomise && topologyRequestPomise.then(result => { @@ -138,9 +138,9 @@ class ConnectService { * Get the connection state of the network element. */ public async getNetworkElementConnectionStatus(element: string): Promise<(ConnectionStatus)[] | null> { - const path = `/restconf/operations/data-provider:read-network-element-connection-list`; + const path = `/rests/operations/data-provider:read-network-element-connection-list`; const query = { - "input": { + "data-provider:input": { "filter": [{ "property": "node-id", "filtervalue": element @@ -152,13 +152,13 @@ class ConnectService { } } const result = await requestRest>(path, { method: "POST", body: JSON.stringify(query) }); - return result && result.output && result.output.data && result.output.data.map(ne => ({ + return result && result["data-provider:output"] && result["data-provider:output"].data && result["data-provider:output"].data.map(ne => ({ status: ne.status })) || null; } public async getWebUriExtensionForNetworkElementAsync(ne: string) { - const path = 'restconf/config/network-topology:network-topology/topology/topology-netconf/node/' + ne + '/yang-ext:mount/core-model:network-element'; + const path = '/rests/data/network-topology:network-topology/topology=topology-netconf/node=' + ne + '/yang-ext:mount/core-model:network-element'; try { const result = await requestRest(path, { method: "GET" }); @@ -182,7 +182,7 @@ class ConnectService { let webUris: guiCutThrough[] = [] ne.forEach(nodeId => { - const path = 'restconf/config/network-topology:network-topology/topology/topology-netconf/node/' + nodeId + '/yang-ext:mount/core-model:network-element'; + const path = '/rests/data/network-topology:network-topology/topology=topology-netconf/node=' + nodeId + '/yang-ext:mount/core-model:network-element'; // add search request to array promises.push(requestRest(path, { method: "GET" }) diff --git a/sdnr/wt/odlux/apps/connectApp/webpack.config.js b/sdnr/wt/odlux/apps/connectApp/webpack.config.js index b72f5da76..7b0a51714 100644 --- a/sdnr/wt/odlux/apps/connectApp/webpack.config.js +++ b/sdnr/wt/odlux/apps/connectApp/webpack.config.js @@ -126,23 +126,27 @@ module.exports = (env) => { }, proxy: { "/oauth2/": { - target: "http://localhost:48181", + target: "http://10.20.6.29:48181", secure: false }, "/database/": { - target: "http://localhost:48181", + target: "http://10.20.6.29:48181", secure: false }, "/restconf/": { - target: "http://localhost:48181", + target: "http://10.20.6.29:48181", + secure: false + }, + "/rests/": { + target: "http://10.20.6.29:48181", secure: false }, "/help/": { - target: "http://localhost:48181", + target: "http://10.20.6.29:48181", secure: false }, "/websocket": { - target: "http://localhost:48181", + target: "http://10.20.6.29:48181", ws: true, changeOrigin: true, secure: false diff --git a/sdnr/wt/odlux/apps/faultApp/src/actions/clearStuckAlarmsAction.ts b/sdnr/wt/odlux/apps/faultApp/src/actions/clearStuckAlarmsAction.ts index ba1a24822..fea500dd3 100644 --- a/sdnr/wt/odlux/apps/faultApp/src/actions/clearStuckAlarmsAction.ts +++ b/sdnr/wt/odlux/apps/faultApp/src/actions/clearStuckAlarmsAction.ts @@ -28,9 +28,9 @@ export class AreStuckAlarmsCleared extends FaultApplicationBaseAction { } -export const clearStuckAlarmAsyncAction = (dispatcher: Dispatch) => async (nodeNames: string[]) => { - dispatcher(new AreStuckAlarmsCleared(true)) +export const clearStuckAlarmAsyncAction = (dispatch: Dispatch) => async (nodeNames: string[]) => { + dispatch(new AreStuckAlarmsCleared(true)) const result = await clearStuckAlarms(nodeNames).catch(error => { console.error(error); return undefined }); - dispatcher(new AreStuckAlarmsCleared(false)) + dispatch(new AreStuckAlarmsCleared(false)) return result; } \ No newline at end of file diff --git a/sdnr/wt/odlux/apps/faultApp/src/components/clearStuckAlarmsDialog.tsx b/sdnr/wt/odlux/apps/faultApp/src/components/clearStuckAlarmsDialog.tsx index 3b8b9b684..e131fa619 100644 --- a/sdnr/wt/odlux/apps/faultApp/src/components/clearStuckAlarmsDialog.tsx +++ b/sdnr/wt/odlux/apps/faultApp/src/components/clearStuckAlarmsDialog.tsx @@ -30,25 +30,29 @@ export enum ClearStuckAlarmsDialogMode { const mapDispatch = (dispatcher: IDispatcher) => ({ clearStuckAlarmsAsync: clearStuckAlarmAsyncAction(dispatcher.dispatch), reloadCurrentProblemsAction: () => dispatcher.dispatch(currentProblemsReloadAction) -}) +}); type clearStuckAlarmsProps = Connect & { - numberDevices: Number, - mode: ClearStuckAlarmsDialogMode, - stuckAlarms: string[] - onClose: () => void + numberDevices: Number; + mode: ClearStuckAlarmsDialogMode; + stuckAlarms: string[]; + onClose: () => void; } type ClearStuckAlarmsState = { - clearAlarmsSuccessful: boolean, - errormessage: string, - unclearedAlarms: string[] + clearAlarmsSuccessful: boolean; + errormessage: string; + unclearedAlarms: string[]; } class ClearStuckAlarmsDialogComponent extends React.Component{ constructor(props: clearStuckAlarmsProps) { super(props); - this.state = { clearAlarmsSuccessful: true, errormessage: '', unclearedAlarms: [] } + this.state = { + clearAlarmsSuccessful: true, + errormessage: '', + unclearedAlarms: [] + }; } onClose = (event: React.MouseEvent) => { @@ -62,19 +66,14 @@ class ClearStuckAlarmsDialogComponent extends React.Component !result.output.nodenames.includes(item)) - const error = "The alarms of the following devices couldn't be refreshed: "; - this.setState({ clearAlarmsSuccessful: false, errormessage: error, unclearedAlarms: undeletedAlarm }) - return; - } - } - } - else { //show errormessage if no devices were cleared - this.setState({ clearAlarmsSuccessful: false, errormessage: "Alarms couldn't be refreshed.", unclearedAlarms: [] }) + if (result && result["data-provider:output"].nodenames && result["data-provider:output"].nodenames.length !== this.props.stuckAlarms.length) { //show errormessage if not all devices were cleared + const undeletedAlarm = this.props.stuckAlarms.filter(item => !result["data-provider:output"].nodenames.includes(item)); + const error = "The alarms of the following devices couldn't be refreshed: "; + this.setState({ clearAlarmsSuccessful: false, errormessage: error, unclearedAlarms: undeletedAlarm }); return; + + } else { //show errormessage if no devices were cleared + this.setState({ clearAlarmsSuccessful: false, errormessage: "Alarms couldn't be refreshed.", unclearedAlarms: [] }); } this.props.reloadCurrentProblemsAction(); @@ -132,5 +131,5 @@ class ClearStuckAlarmsDialogComponent extends React.Component => { - const path = 'restconf/operations/data-provider:read-status'; + const path = 'rests/operations/data-provider:read-status'; const result = await requestRest>(path, { method: "POST" }); let faultType: FaultType = { @@ -32,8 +32,8 @@ export const getFaultStateFromDatabase = async (): Promise => } let faults: Faults[] | null = null; - if (result && result.output && result.output.data) { - faults = result.output.data; + if (result && result["data-provider:output"] && result["data-provider:output"].data) { + faults = result["data-provider:output"].data; faultType = { Critical: faults[0].faults.criticals, Major: faults[0].faults.majors, @@ -46,8 +46,8 @@ export const getFaultStateFromDatabase = async (): Promise => } export const clearStuckAlarms = async (nodeNames: string[]) => { - const path = 'restconf/operations/devicemanager:clear-current-fault-by-nodename' - const result = await requestRest(path, { method: 'Post', body: JSON.stringify({ input: { nodenames: nodeNames } }) }) + const path = 'rests/operations/devicemanager:clear-current-fault-by-nodename' + const result = await requestRest>(path, { method: 'Post', body: JSON.stringify({ input: { nodenames: nodeNames } }) }) return result; } \ No newline at end of file diff --git a/sdnr/wt/odlux/apps/faultApp/webpack.config.js b/sdnr/wt/odlux/apps/faultApp/webpack.config.js index c91b1f4cc..8131c9835 100644 --- a/sdnr/wt/odlux/apps/faultApp/webpack.config.js +++ b/sdnr/wt/odlux/apps/faultApp/webpack.config.js @@ -123,25 +123,29 @@ module.exports = (env) => { stats: { colors: true }, - proxy: { + proxy: { "/oauth2/": { - target: "http://localhost:48181", + target: "http://10.20.6.29:48181", secure: false }, "/database/": { - target: "http://localhost:48181", + target: "http://10.20.6.29:48181", secure: false }, "/restconf/": { - target: "http://localhost:48181", + target: "http://10.20.6.29:48181", + secure: false + }, + "/rests/": { + target: "http://10.20.6.29:48181", secure: false }, "/help/": { - target: "http://localhost:48181", + target: "http://10.20.6.29:48181", secure: false }, - "/websocket/": { - target: "http://localhost:48181", + "/websocket": { + target: "http://10.20.6.29:48181", ws: true, changeOrigin: true, secure: false diff --git a/sdnr/wt/odlux/apps/helpApp/src/services/helpService.ts b/sdnr/wt/odlux/apps/helpApp/src/services/helpService.ts index c8b247832..728f243a0 100644 --- a/sdnr/wt/odlux/apps/helpApp/src/services/helpService.ts +++ b/sdnr/wt/odlux/apps/helpApp/src/services/helpService.ts @@ -55,7 +55,7 @@ class HelpService { }, []); } - this.tocNodeCollection = result && mapNodesCollection(result); + this.tocNodeCollection = result && mapNodesCollection(result) || null; } return this.tocNodeCollection || null; } diff --git a/sdnr/wt/odlux/apps/inventoryApp/src/services/inventoryService.ts b/sdnr/wt/odlux/apps/inventoryApp/src/services/inventoryService.ts index b6025d4da..d43d2988d 100644 --- a/sdnr/wt/odlux/apps/inventoryApp/src/services/inventoryService.ts +++ b/sdnr/wt/odlux/apps/inventoryApp/src/services/inventoryService.ts @@ -36,9 +36,9 @@ class InventoryService { } public async getInventoryEntry(id: string): Promise { - const path = `/restconf/operations/data-provider:read-inventory-list`; + const path = `/rests/operations/data-provider:read-inventory-list`; const body = { - "input": { + "data-provider:input": { "filter": [ { property: "id", filtervalue: id }, ], diff --git a/sdnr/wt/odlux/apps/inventoryApp/webpack.config.js b/sdnr/wt/odlux/apps/inventoryApp/webpack.config.js index d81797c1e..66c861389 100644 --- a/sdnr/wt/odlux/apps/inventoryApp/webpack.config.js +++ b/sdnr/wt/odlux/apps/inventoryApp/webpack.config.js @@ -127,33 +127,33 @@ module.exports = (env) => { }, proxy: { "/oauth2/": { - target: "http://localhost:48181", - secure: false - }, - "/yang-schema/": { - target: "http://localhost:48181", + target: "http://10.20.6.29:48181", secure: false }, "/database/": { - target: "http://localhost:48181", + target: "http://10.20.6.29:48181", secure: false }, "/restconf/": { - target: "http://localhost:48181", + target: "http://10.20.6.29:48181", + secure: false + }, + "/rests/": { + target: "http://10.20.6.29:48181", secure: false }, "/help/": { - target: "http://localhost:48181", + target: "http://10.20.6.29:48181", secure: false }, "/tree/": { - target: "http://localhost:48181", + target: "http://10.20.6.29:48181", secure: false }, "/websocket": { - target: "http://localhost:48181", + target: "http://10.20.6.29:48181", ws: true, - changeOrigin: false, + changeOrigin: true, secure: false } } diff --git a/sdnr/wt/odlux/apps/maintenanceApp/src/services/maintenenceService.ts b/sdnr/wt/odlux/apps/maintenanceApp/src/services/maintenenceService.ts index daa6082d7..613b4786d 100644 --- a/sdnr/wt/odlux/apps/maintenanceApp/src/services/maintenenceService.ts +++ b/sdnr/wt/odlux/apps/maintenanceApp/src/services/maintenenceService.ts @@ -34,7 +34,7 @@ class MaintenenceService { * Adds or updates one maintenence entry to the backend. */ public async writeMaintenenceEntry(maintenenceEntry: MaintenenceEntry): Promise { - const path = `/restconf/operations/data-provider:create-maintenance`; + const path = `/rests/operations/data-provider:create-maintenance`; const query = { "id": maintenenceEntry._id, @@ -45,7 +45,7 @@ class MaintenenceService { "start": convertToISODateString(maintenenceEntry.start) }; - const result = await requestRest(path, { method: "POST", body: JSON.stringify(convertPropertyNames({ input: query }, replaceUpperCase)) }); + const result = await requestRest(path, { method: "POST", body: JSON.stringify(convertPropertyNames({ "data-provider:input": query }, replaceUpperCase)) }); return result || null; } @@ -53,7 +53,7 @@ class MaintenenceService { * Deletes one maintenence entry by its mountId from the backend. */ public async deleteMaintenenceEntry(maintenenceEntry: MaintenenceEntry): Promise<(DeleteResponse) | null> { - const path = `/restconf/operations/data-provider:delete-maintenance`; + const path = `/rests/operations/data-provider:delete-maintenance`; const query = { "id": maintenenceEntry._id, @@ -63,7 +63,7 @@ class MaintenenceService { "end": convertToISODateString(maintenenceEntry.end), "start": convertToISODateString(maintenenceEntry.start) }; - const result = await requestRest(path, { method: "POST", body: JSON.stringify(convertPropertyNames({ input: query }, replaceUpperCase)) }); + const result = await requestRest(path, { method: "POST", body: JSON.stringify(convertPropertyNames({ "data-provider:input": query }, replaceUpperCase)) }); return result || null; } } diff --git a/sdnr/wt/odlux/apps/maintenanceApp/webpack.config.js b/sdnr/wt/odlux/apps/maintenanceApp/webpack.config.js index 33a3bed73..eb6f785f3 100644 --- a/sdnr/wt/odlux/apps/maintenanceApp/webpack.config.js +++ b/sdnr/wt/odlux/apps/maintenanceApp/webpack.config.js @@ -125,25 +125,29 @@ module.exports = (env) => { stats: { colors: true }, - proxy: { + proxy: { "/oauth2/": { - target: "http://localhost:48181", + target: "http://10.20.6.29:48181", secure: false }, "/database/": { - target: "http://localhost:48181", + target: "http://10.20.6.29:48181", secure: false }, "/restconf/": { - target: "http://localhost:48181", + target: "http://10.20.6.29:48181", + secure: false + }, + "/rests/": { + target: "http://10.20.6.29:48181", secure: false }, "/help/": { - target: "http://localhost:48181", + target: "http://10.20.6.29:48181", secure: false }, - "/websocket/": { - target: "http://localhost:48181", + "/websocket": { + target: "http://10.20.6.29:48181", ws: true, changeOrigin: true, secure: false diff --git a/sdnr/wt/odlux/apps/mediatorApp/src/services/mediatorService.ts b/sdnr/wt/odlux/apps/mediatorApp/src/services/mediatorService.ts index aee086689..ede681776 100644 --- a/sdnr/wt/odlux/apps/mediatorApp/src/services/mediatorService.ts +++ b/sdnr/wt/odlux/apps/mediatorApp/src/services/mediatorService.ts @@ -83,8 +83,8 @@ class MediatorService { const result = await requestRest>(path, { method: "POST", body: JSON.stringify({ input: data }) }); - if (result && result.output.data[0]) { - const firstResult = result.output.data[0]; + if (result && result["data-provider:output"].data[0]) { + const firstResult = result["data-provider:output"].data[0]; return { id: firstResult.id, diff --git a/sdnr/wt/odlux/apps/performanceHistoryApp/src/services/performanceHistoryService.ts b/sdnr/wt/odlux/apps/performanceHistoryApp/src/services/performanceHistoryService.ts index 685859850..70a8771b7 100644 --- a/sdnr/wt/odlux/apps/performanceHistoryApp/src/services/performanceHistoryService.ts +++ b/sdnr/wt/odlux/apps/performanceHistoryApp/src/services/performanceHistoryService.ts @@ -47,13 +47,13 @@ class PerformanceService { if (selectedTimePeriod === "15min") { - path = '/restconf/operations/data-provider:read-pmdata-15m-ltp-list'; + path = '/rests/operations/data-provider:read-pmdata-15m-ltp-list'; } else { - path = '/restconf/operations/data-provider:read-pmdata-24h-ltp-list'; + path = '/rests/operations/data-provider:read-pmdata-24h-ltp-list'; } const result = await requestRest>(path, { method: "POST", body: JSON.stringify(convertPropertyNames({ input: query }, replaceUpperCase)) }); - return result && result.output && result.output.data && result.output.data.map(ne => ({ key: ne })) || null; + return result && result["data-provider:output"] && result["data-provider:output"].data && result["data-provider:output"].data.map(ne => ({ key: ne })) || null; } @@ -62,9 +62,9 @@ class PerformanceService { * Gets all devices from the performanceHistory 15min backend. */ public async getDeviceListfromPerf15minHistory(): Promise<(DeviceListType)[] | null> { - const path = '/restconf/operations/data-provider:read-pmdata-15m-device-list'; + const path = '/rests/operations/data-provider:read-pmdata-15m-device-list'; const query = { - "input": { + "data-provider:input": { "filter": [], "sortorder": [], "pagination": { @@ -75,7 +75,7 @@ class PerformanceService { }; const result = await requestRest>(path, { method: "POST", body: JSON.stringify(query) }); - return result && result.output && result.output.data && result.output.data.map(ne => ({ + return result && result["data-provider:output"] && result["data-provider:output"].data && result["data-provider:output"].data.map(ne => ({ nodeId: ne })) || null; } @@ -84,9 +84,9 @@ class PerformanceService { * Gets all devices from the performanceHistory 24h backend. */ public async getDeviceListfromPerf24hHistory(): Promise<(DeviceListType)[] | null> { - const path = '/restconf/operations/data-provider:read-pmdata-24h-device-list'; + const path = '/rests/operations/data-provider:read-pmdata-24h-device-list'; const query = { - "input": { + "data-provider:input": { "filter": [], "sortorder": [], "pagination": { @@ -97,7 +97,7 @@ class PerformanceService { }; const result = await requestRest>(path, { method: "POST", body: JSON.stringify(query) }); - return result && result.output && result.output.data && result.output.data.map(ne => ({ + return result && result["data-provider:output"] && result["data-provider:output"].data && result["data-provider:output"].data.map(ne => ({ nodeId: ne })) || null; } diff --git a/sdnr/wt/odlux/apps/performanceHistoryApp/webpack.config.js b/sdnr/wt/odlux/apps/performanceHistoryApp/webpack.config.js index 6579db3ec..5faf69e83 100644 --- a/sdnr/wt/odlux/apps/performanceHistoryApp/webpack.config.js +++ b/sdnr/wt/odlux/apps/performanceHistoryApp/webpack.config.js @@ -126,15 +126,29 @@ module.exports = (env) => { }, proxy: { "/oauth2/": { - target: "http://10.20.6.29:28181", + target: "http://10.20.6.29:48181", secure: false }, - "/restconf": { - target: "http://10.20.6.29:28181", + "/database/": { + target: "http://10.20.6.29:48181", secure: false }, - "/database": { - target: "http://10.20.6.29:28181", + "/restconf/": { + target: "http://10.20.6.29:48181", + secure: false + }, + "/rests/": { + target: "http://10.20.6.29:48181", + secure: false + }, + "/help/": { + target: "http://10.20.6.29:48181", + secure: false + }, + "/websocket": { + target: "http://10.20.6.29:48181", + ws: true, + changeOrigin: true, secure: false } } diff --git a/sdnr/wt/odlux/framework/pom.xml b/sdnr/wt/odlux/framework/pom.xml index c7d9c3295..db42ef1ac 100644 --- a/sdnr/wt/odlux/framework/pom.xml +++ b/sdnr/wt/odlux/framework/pom.xml @@ -46,7 +46,7 @@ ${maven.build.timestamp} ONAP Frankfurt (Neon, mdsal ${odl.mdsal.version}) - 56.139cd6d(20/07/08) + 57.3e1d5cf(20/08/11) ONAP SDN-R | ONF Wireless for ${distversion} - Build: ${buildtime} ${buildno} ${project.version} @@ -56,6 +56,10 @@ dist odlux + + src2/main/resources + odlux + @@ -172,12 +176,21 @@ ${project.build.directory}/classes/odlux app.js + version.json ##odlux.version## ${odlux.version} + + ##buildno## + ${buildno} + + + ##build-timestamp## + ${buildtime} + diff --git a/sdnr/wt/odlux/framework/src/models/elasticSearch.ts b/sdnr/wt/odlux/framework/src/models/elasticSearch.ts index 12cfd7d28..b5f25097c 100644 --- a/sdnr/wt/odlux/framework/src/models/elasticSearch.ts +++ b/sdnr/wt/odlux/framework/src/models/elasticSearch.ts @@ -16,16 +16,21 @@ * ============LICENSE_END========================================================================== */ export type Result = { - output: { + "data-provider:output": { pagination?: { - size: number, - page: number, - total: number + size: number; + page: number; + total: number; }, data: TSource[]; } } +export type SingeResult = { + "data-provider:output": TSource; +} + + export type HitEntry = { _index: string; _type: string; diff --git a/sdnr/wt/odlux/framework/src/services/restService.ts b/sdnr/wt/odlux/framework/src/services/restService.ts index b02d7d19f..19ef34f91 100644 --- a/sdnr/wt/odlux/framework/src/services/restService.ts +++ b/sdnr/wt/odlux/framework/src/services/restService.ts @@ -33,7 +33,7 @@ export const formEncode = (params: { [key: string]: string | number }) => Object /** Sends a rest request to the given path. * @returns The data, or null it there was any error */ -export async function requestRest(path: string = '', init: RequestInit = {}, authenticate: boolean = true, isResource: boolean = false): Promise { +export async function requestRest(path: string = '', init: RequestInit = {}, authenticate: boolean = true, isResource: boolean = false): Promise { const res = await requestRestExt(path, init, authenticate, isResource); if (res && res.status >= 200 && res.status < 300) { return res.data; @@ -42,9 +42,9 @@ export async function requestRest(path: string = '', init: RequestInit = } /** Sends a rest request to the given path and reports the server state. - * @returns An object with the server state, a message and the data. + * @returns An object with the server state, a message and the data or undefined in case of a json parse error. */ -export async function requestRestExt(path: string = '', init: RequestInit = {}, authenticate: boolean = true, isResource: boolean = false): Promise<{ status: number, message?: string, data: TData | null }> { +export async function requestRestExt(path: string = '', init: RequestInit = {}, authenticate: boolean = true, isResource: boolean = false): Promise<{ status: number, message?: string, data: TData | null | undefined }> { const result: { status: number, message?: string, data: TData | null } = { status: -1, data: null, @@ -99,7 +99,7 @@ export async function requestRestExt(path: string = '', init: RequestInit ...result, status: fetchResult.status, message: error && error.message || String(error), - data: null + data: undefined }; } } \ No newline at end of file diff --git a/sdnr/wt/odlux/framework/src/utilities/elasticSearch.ts b/sdnr/wt/odlux/framework/src/utilities/elasticSearch.ts index c18a40b0b..6f4c71ec7 100644 --- a/sdnr/wt/odlux/framework/src/utilities/elasticSearch.ts +++ b/sdnr/wt/odlux/framework/src/utilities/elasticSearch.ts @@ -33,14 +33,14 @@ type dataType = { [prop: string]: propType }; */ export function createSearchDataHandler(typeName: (() => string) | string, additionalFilters?: {} | null | undefined): DataCallback<(TResult)> { const fetchData: DataCallback<(TResult)> = async (pageIndex, rowsPerPage, orderBy, order, filter) => { - const url = `/restconf/operations/data-provider:read-${typeof typeName === "function" ? typeName(): typeName}-list`; + const url = `/rests/operations/data-provider:read-${typeof typeName === "function" ? typeName(): typeName}-list`; filter = { ...filter, ...additionalFilters }; const filterKeys = filter && Object.keys(filter) || []; const query = { - input: { + "data-provider:input": { filter: filterKeys.filter(f => filter![f] != null && filter![f] !== "").map(property => ({ property, filtervalue: filter![property]})), sortorder: orderBy ? [{ property: orderBy, sortorder: order === "desc" ? "descending" : "ascending" }] : [], pagination: { size: rowsPerPage, page: (pageIndex != null && pageIndex > 0 && pageIndex || 0) +1 } @@ -60,12 +60,12 @@ export function createSearchDataHandler(typeName: (() => string) | stri if (result) { let rows: TResult[] = []; - if (result && result.output && result.output.data) { - rows = result.output.data.map(obj => convertPropertyNames(obj, replaceHyphen)) || [] + if (result && result["data-provider:output"] && result["data-provider:output"].data) { + rows = result["data-provider:output"].data.map(obj => convertPropertyNames(obj, replaceHyphen)) || [] } const data = { - page: result.output.pagination && result.output.pagination.page != null && result.output.pagination.page - 1 || 0 , total: result.output.pagination && result.output.pagination.total || 0, rows: rows + page: +(result["data-provider:output"].pagination && result["data-provider:output"].pagination.page != null && result["data-provider:output"].pagination.page - 1 || 0) , total: +(result["data-provider:output"].pagination && result["data-provider:output"].pagination.total || 0), rows: rows }; return data; } diff --git a/sdnr/wt/odlux/framework/src/views/about.tsx b/sdnr/wt/odlux/framework/src/views/about.tsx index ca3953af1..c4a5488e0 100644 --- a/sdnr/wt/odlux/framework/src/views/about.tsx +++ b/sdnr/wt/odlux/framework/src/views/about.tsx @@ -44,7 +44,7 @@ class AboutComponent extends React.Component { requestRestExt('/about').then((response) => { const content = response.status == 200 ? response.data : `${response.status} ${response.message}` || "Server error"; const loadedSucessfully = response.status == 200 ? true : false; - this.setState({ content: content, isContentLoadedSucessfully: loadedSucessfully }); + this.setState({ content: content || null, isContentLoadedSucessfully: loadedSucessfully }); }).catch((error) => { this.setState({ content: error }) }) diff --git a/sdnr/wt/odlux/framework/src2/main/resources/version.json b/sdnr/wt/odlux/framework/src2/main/resources/version.json new file mode 100644 index 000000000..f74d2c966 --- /dev/null +++ b/sdnr/wt/odlux/framework/src2/main/resources/version.json @@ -0,0 +1,4 @@ +{ + "version":"##buildno##", + "build":"##build-timestamp##" +} \ No newline at end of file diff --git a/sdnr/wt/odlux/framework/webpack.config.js b/sdnr/wt/odlux/framework/webpack.config.js index 4887a757e..c7ef72e80 100644 --- a/sdnr/wt/odlux/framework/webpack.config.js +++ b/sdnr/wt/odlux/framework/webpack.config.js @@ -176,7 +176,7 @@ module.exports = (env) => { ], devServer: { - public: "http://localhost:3100", + public: "http://10.20.6.29:3100", contentBase: distPath, compress: true, @@ -195,23 +195,23 @@ module.exports = (env) => { }, proxy: { "/oauth2/": { - target: "http://localhost:48181", + target: "http://10.20.6.29:48181", secure: false }, "/database/": { - target: "http://localhost:48181", + target: "http://10.20.6.29:48181", secure: false }, "/restconf/": { - target: "http://localhost:48181", + target: "http://10.20.6.29:48181", secure: false }, "/help/": { - target: "http://localhost:48181", + target: "http://10.20.6.29:48181", secure: false }, "/websocket": { - target: "http://localhost:48181", + target: "http://10.20.6.29:48181", ws: true, changeOrigin: true, secure: false diff --git a/sdnr/wt/odlux/yarn.lock b/sdnr/wt/odlux/yarn.lock index 71488be68..3db21a253 100644 --- a/sdnr/wt/odlux/yarn.lock +++ b/sdnr/wt/odlux/yarn.lock @@ -1512,9 +1512,9 @@ universal-user-agent "^5.0.0" "@octokit/rest@^16.16.0": - version "16.43.1" - resolved "https://registry.yarnpkg.com/@octokit/rest/-/rest-16.43.1.tgz#3b11e7d1b1ac2bbeeb23b08a17df0b20947eda6b" - integrity sha512-gfFKwRT/wFxq5qlNjnW2dh+qh74XgTQ2B179UX5K1HYCluioWj8Ndbgqw2PVqa1NnVJkGHp2ovMpVn/DImlmkw== + version "16.43.2" + resolved "https://registry.yarnpkg.com/@octokit/rest/-/rest-16.43.2.tgz#c53426f1e1d1044dee967023e3279c50993dd91b" + integrity sha512-ngDBevLbBTFfrHZeiS7SAMAZ6ssuVmXuya+F/7RaVvlysgGa1JKJkKWY+jV6TCJYcW0OALfJ7nTIGXcBXzycfQ== dependencies: "@octokit/auth-token" "^2.4.0" "@octokit/plugin-paginate-rest" "^1.1.1" @@ -7857,9 +7857,9 @@ npm-registry-fetch@^3.9.0: npm-package-arg "^6.1.0" npm-registry-fetch@^4.0.0: - version "4.0.4" - resolved "https://registry.yarnpkg.com/npm-registry-fetch/-/npm-registry-fetch-4.0.4.tgz#2da1ecf3f43d419d96abf313664291a4623d3ea5" - integrity sha512-6jb34hX/iYNQebqWUHtU8YF6Cjb1H6ouTFPClYsyiW6lpFkljTpdeftm53rRojtja1rKAvKNIIiTS5Sjpw4wsA== + version "4.0.5" + resolved "https://registry.yarnpkg.com/npm-registry-fetch/-/npm-registry-fetch-4.0.5.tgz#cb87cf7f25bfb048d6c3ee19d115bebf93ea5bfa" + integrity sha512-yQ0/U4fYpCCqmueB2g8sc+89ckQ3eXpmU4+Yi2j5o/r0WkKvE2+Y0tK3DEILAtn2UaQTkjTHxIXe2/CSdit+/Q== dependencies: JSONStream "^1.3.4" bluebird "^3.5.1" -- cgit 1.2.3-korg