From 2c853ce528e446bf34fd8f3ed85e842a0d0cc4ee Mon Sep 17 00:00:00 2001 From: German Ferrero Date: Tue, 23 Mar 2021 13:22:54 -0300 Subject: [PATCH 1/9] shared-state-network-nodes: init package --- packages/shared-state-network_nodes/Makefile | 22 ++++++++ .../shared-state-publish_network_nodes | 1 + .../shared-state-network_nodes-cron | 10 ++++ .../bin/shared-state-publish_network_nodes | 25 +++++++++ .../files/usr/lib/lua/network-nodes.lua | 23 +++++++++ .../files/usr/libexec/rpcd/network-nodes | 51 +++++++++++++++++++ .../usr/share/rpcd/acl.d/network_nodes.json | 18 +++++++ .../tests/test_network_nodes.lua | 43 ++++++++++++++++ 8 files changed, 193 insertions(+) create mode 100644 packages/shared-state-network_nodes/Makefile create mode 120000 packages/shared-state-network_nodes/files/etc/shared-state/publishers/shared-state-publish_network_nodes create mode 100644 packages/shared-state-network_nodes/files/etc/uci-defaults/shared-state-network_nodes-cron create mode 100755 packages/shared-state-network_nodes/files/usr/bin/shared-state-publish_network_nodes create mode 100644 packages/shared-state-network_nodes/files/usr/lib/lua/network-nodes.lua create mode 100644 packages/shared-state-network_nodes/files/usr/libexec/rpcd/network-nodes create mode 100644 packages/shared-state-network_nodes/files/usr/share/rpcd/acl.d/network_nodes.json create mode 100644 packages/shared-state-network_nodes/tests/test_network_nodes.lua diff --git a/packages/shared-state-network_nodes/Makefile b/packages/shared-state-network_nodes/Makefile new file mode 100644 index 000000000..c30bdeb75 --- /dev/null +++ b/packages/shared-state-network_nodes/Makefile @@ -0,0 +1,22 @@ +# +# Copyright (C) 2020 German Ferrero +# +# This is free software, licensed under the GNU General Public License v3. +# + +include ../../libremesh.mk + +define Package/$(PKG_NAME) + SECTION:=utils + CATEGORY:=Utilities + TITLE:=$(PKG_NAME) provides shared state database of all times network nodes + MAINTAINER:=Germán Ferrero + DEPENDS:=+shared-state + PKGARCH:=all +endef + +define Package/$(PKG_NAME)/description + This $(PKG_NAME) provides shared state database of all times network nodes. +endef + +$(eval $(call BuildPackage,$(PKG_NAME))) diff --git a/packages/shared-state-network_nodes/files/etc/shared-state/publishers/shared-state-publish_network_nodes b/packages/shared-state-network_nodes/files/etc/shared-state/publishers/shared-state-publish_network_nodes new file mode 120000 index 000000000..89f1d4422 --- /dev/null +++ b/packages/shared-state-network_nodes/files/etc/shared-state/publishers/shared-state-publish_network_nodes @@ -0,0 +1 @@ +packages/shared-state-network_nodes/files/usr/bin/shared-state-publish_network_nodes \ No newline at end of file diff --git a/packages/shared-state-network_nodes/files/etc/uci-defaults/shared-state-network_nodes-cron b/packages/shared-state-network_nodes/files/etc/uci-defaults/shared-state-network_nodes-cron new file mode 100644 index 000000000..7af452af7 --- /dev/null +++ b/packages/shared-state-network_nodes/files/etc/uci-defaults/shared-state-network_nodes-cron @@ -0,0 +1,10 @@ +#!/bin/sh + +unique_append() +{ + grep -qF "$1" "$2" || echo "$1" >> "$2" +} + +unique_append \ + '*/5 * * * * ((sleep $(($RANDOM % 120)); shared-state-persistent sync network_nodes &> /dev/null)&)'\ + /etc/crontabs/root diff --git a/packages/shared-state-network_nodes/files/usr/bin/shared-state-publish_network_nodes b/packages/shared-state-network_nodes/files/usr/bin/shared-state-publish_network_nodes new file mode 100755 index 000000000..31274604a --- /dev/null +++ b/packages/shared-state-network_nodes/files/usr/bin/shared-state-publish_network_nodes @@ -0,0 +1,25 @@ +#!/usr/bin/lua + +--! LibreMesh +--! Copyright (C) 2021 Germán Ferrero +--! +--! This program is free software: you can redistribute it and/or modify +--! it under the terms of the GNU Affero General Public License as +--! published by the Free Software Foundation, either version 3 of the +--! License, or (at your option) any later version. +--! +--! This program is distributed in the hope that it will be useful, +--! but WITHOUT ANY WARRANTY; without even the implied warranty of +--! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +--! GNU Affero General Public License for more details. +--! +--! You should have received a copy of the GNU Affero General Public License +--! along with this program. If not, see . + +local hostname = io.input("/proc/sys/kernel/hostname"):read("*line") + +local networkNodesTable = { + [hostname] = {true} +} + +io.popen("shared-state-persistent insert network_nodes", "w"):write(JSON.stringify(networkNodesTable)) diff --git a/packages/shared-state-network_nodes/files/usr/lib/lua/network-nodes.lua b/packages/shared-state-network_nodes/files/usr/lib/lua/network-nodes.lua new file mode 100644 index 000000000..b883fca94 --- /dev/null +++ b/packages/shared-state-network_nodes/files/usr/lib/lua/network-nodes.lua @@ -0,0 +1,23 @@ +local shared_state = require("shared-state") +local network_nodes = {} + +function network_nodes.get_nodes() + local sharedState = shared_state.SharedStatePersistent:new("network_nodes") + local result = {} + for key, value in pairs(sharedState:get()) do + local status = value.data and "connected" or "disconnected" + table.insert(result, { hostname = key, status = status}) + end + return result +end + +function network_nodes.mark_nodes_as_gone(hostnames) + local sharedState = shared_state.SharedStatePersistent:new("network_nodes") + local data = {} + for _, hostname in pairs(hostnames or {}) do + data[hostname] = false + end + sharedState:insert(data) +end + +return network_nodes \ No newline at end of file diff --git a/packages/shared-state-network_nodes/files/usr/libexec/rpcd/network-nodes b/packages/shared-state-network_nodes/files/usr/libexec/rpcd/network-nodes new file mode 100644 index 000000000..1d788e207 --- /dev/null +++ b/packages/shared-state-network_nodes/files/usr/libexec/rpcd/network-nodes @@ -0,0 +1,51 @@ +#!/usr/bin/env lua +--[[ + Copyright (C) 2013-2020 LibreMesh.org + This is free software, licensed under the GNU AFFERO GENERAL PUBLIC LICENSE Version 3 + + Copyright 2021 German Ferrero +]]-- + +local ubus = require "ubus" +local json = require 'luci.jsonc' +local utils = require 'lime.utils' +local network_nodes = require 'network-nodes' + +local conn = ubus.connect() +if not conn then + error("Failed to connect to ubus") +end + +local function get_nodes(msg) + local nodes = network_nodes.get_nodes() + utils.printJson({ status = "ok", nodes = nodes }) +end + +local function mark_nodes_as_gone(msg) + if not msg.hostnames then + utils.printJson({ status = "error", message = "missing attribute hostnames" }) + return + end + + network_nodes.mark_nodes_as_gone(msg.hostnames) + utils.printJson({ status = "ok" }) +end + + +local methods = { + get_nodes = { no_params = 0}, + mark_nodes_as_gone = { hostnames = 'value' } +} + +if arg[1] == 'list' then + utils.printJson(methods) +end + +if arg[1] == 'call' then + local msg = utils.rpcd_readline() or '{}' + msg = json.parse(msg) + if arg[2] == 'get_nodes' then get_nodes(msg) + elseif arg[2] == 'mark_nodes_as_gone' then mark_nodes_as_gone(msg) + else utils.printJson({ error = "Method not found" }) + end +end diff --git a/packages/shared-state-network_nodes/files/usr/share/rpcd/acl.d/network_nodes.json b/packages/shared-state-network_nodes/files/usr/share/rpcd/acl.d/network_nodes.json new file mode 100644 index 000000000..b151671e7 --- /dev/null +++ b/packages/shared-state-network_nodes/files/usr/share/rpcd/acl.d/network_nodes.json @@ -0,0 +1,18 @@ +{ + "lime-app": { + "description": "lime-app public access", + "read": { + "ubus": { + "network-nodes": [ "get_nodes" ] + } + } + }, + "root": { + "description": "root privileged access", + "write": { + "ubus": { + "network-nodes": [ "mark_nodes_as_gone" ] + } + } + } +} \ No newline at end of file diff --git a/packages/shared-state-network_nodes/tests/test_network_nodes.lua b/packages/shared-state-network_nodes/tests/test_network_nodes.lua new file mode 100644 index 000000000..5148ec34a --- /dev/null +++ b/packages/shared-state-network_nodes/tests/test_network_nodes.lua @@ -0,0 +1,43 @@ +local network_nodes = require('network-nodes') +local utils = require('lime.utils') +local test_utils = require('tests.utils') +local shared_state = require('shared-state') + +describe('Tests network_nodes #network_nodes', function () + before_each('', function() + test_dir = test_utils.setup_test_dir() + shared_state.PERSISTENT_DATA_DIR = test_dir + end) + + after_each('', function() + test_utils.teardown_test_dir() + end) + + it('test get_nodes return expected format #network_nodes', function() + local sharedState = shared_state.SharedStatePersistent:new('network_nodes') + local data = { + ["node1"] = true, + ["node2"] = false, + ["node3"] = true, + } + sharedState:insert(data) + local expected = { + { hostname = "node1", status = "connected"}, + { hostname = "node2", status = "disconnected"}, + { hostname = "node3", status = "connected"}, + } + assert.are.same(expected, network_nodes.get_nodes()) + end) + + it('test mark_nodes_as_gone marks nodes as gone', function () + network_nodes.mark_nodes_as_gone({ + 'node1', 'node2', 'node3' + }) + local expected = { + { hostname = "node1", status = "disconnected"}, + { hostname = "node2", status = "disconnected"}, + { hostname = "node3", status = "disconnected"}, + } + assert.are.same(expected, network_nodes.get_nodes()) + end) +end) \ No newline at end of file From 9364eda107c566da802b5e096f20c1afe4805746 Mon Sep 17 00:00:00 2001 From: Santiago Piccinini Date: Thu, 25 Mar 2021 23:56:08 -0300 Subject: [PATCH 2/9] shared-state-network-nodes: some fixes --- .../publishers/shared-state-publish_network_nodes | 2 +- .../shared-state-network_nodes/files/usr/bin/network-nodes | 5 +++++ .../files/usr/bin/shared-state-publish_network_nodes | 1 + 3 files changed, 7 insertions(+), 1 deletion(-) create mode 100755 packages/shared-state-network_nodes/files/usr/bin/network-nodes diff --git a/packages/shared-state-network_nodes/files/etc/shared-state/publishers/shared-state-publish_network_nodes b/packages/shared-state-network_nodes/files/etc/shared-state/publishers/shared-state-publish_network_nodes index 89f1d4422..2f9b15147 120000 --- a/packages/shared-state-network_nodes/files/etc/shared-state/publishers/shared-state-publish_network_nodes +++ b/packages/shared-state-network_nodes/files/etc/shared-state/publishers/shared-state-publish_network_nodes @@ -1 +1 @@ -packages/shared-state-network_nodes/files/usr/bin/shared-state-publish_network_nodes \ No newline at end of file +../../../usr/bin/shared-state-publish_network_nodes \ No newline at end of file diff --git a/packages/shared-state-network_nodes/files/usr/bin/network-nodes b/packages/shared-state-network_nodes/files/usr/bin/network-nodes new file mode 100755 index 000000000..3feb48a4c --- /dev/null +++ b/packages/shared-state-network_nodes/files/usr/bin/network-nodes @@ -0,0 +1,5 @@ +#!/usr/bin/lua + +local network_nodes = require('network-nodes') + +io.stdout:write(network_nodes.as_csv()) diff --git a/packages/shared-state-network_nodes/files/usr/bin/shared-state-publish_network_nodes b/packages/shared-state-network_nodes/files/usr/bin/shared-state-publish_network_nodes index 31274604a..00e6bc7c7 100755 --- a/packages/shared-state-network_nodes/files/usr/bin/shared-state-publish_network_nodes +++ b/packages/shared-state-network_nodes/files/usr/bin/shared-state-publish_network_nodes @@ -17,6 +17,7 @@ --! along with this program. If not, see . local hostname = io.input("/proc/sys/kernel/hostname"):read("*line") +local JSON = require("luci.jsonc") local networkNodesTable = { [hostname] = {true} From d3794e9aacaf19755e0c98ea045e74d7b20e2662 Mon Sep 17 00:00:00 2001 From: Santiago Piccinini Date: Tue, 30 Mar 2021 23:16:16 -0300 Subject: [PATCH 3/9] lime.utils: add utils.hostname() --- packages/lime-system/files/usr/lib/lua/lime/utils.lua | 4 ++++ .../ubus-lime-location/files/usr/libexec/rpcd/lime-location | 2 +- packages/ubus-lime-location/tests/test_lime_location.lua | 2 +- packages/ubus-lime-utils/files/usr/libexec/rpcd/lime-utils | 2 +- packages/ubus-lime-utils/tests/test_ubus_lime_utils.lua | 2 +- 5 files changed, 8 insertions(+), 4 deletions(-) diff --git a/packages/lime-system/files/usr/lib/lua/lime/utils.lua b/packages/lime-system/files/usr/lib/lua/lime/utils.lua index 0b1537f1b..8cd664bf7 100644 --- a/packages/lime-system/files/usr/lib/lua/lime/utils.lua +++ b/packages/lime-system/files/usr/lib/lua/lime/utils.lua @@ -182,6 +182,10 @@ function utils.slugify(s) return s end +function utils.hostname() + return io.input("/proc/sys/kernel/hostname"):read("*line") +end + function utils.sanitize_hostname(hostname) hostname = hostname:gsub(' ', '-') hostname = hostname:gsub('[^-a-zA-Z0-9]', '') diff --git a/packages/ubus-lime-location/files/usr/libexec/rpcd/lime-location b/packages/ubus-lime-location/files/usr/libexec/rpcd/lime-location index 35fca4b63..f29dc6b21 100755 --- a/packages/ubus-lime-location/files/usr/libexec/rpcd/lime-location +++ b/packages/ubus-lime-location/files/usr/libexec/rpcd/lime-location @@ -49,7 +49,7 @@ local function set_location(msg) end local function nodes_and_links() - local hostname = io.input("/proc/sys/kernel/hostname"):read("*line") + local hostname = utils.hostname() local result = {} result[hostname] = location.nodes_and_links() utils.printJson(result) diff --git a/packages/ubus-lime-location/tests/test_lime_location.lua b/packages/ubus-lime-location/tests/test_lime_location.lua index 1670171ff..49f151502 100644 --- a/packages/ubus-lime-location/tests/test_lime_location.lua +++ b/packages/ubus-lime-location/tests/test_lime_location.lua @@ -91,7 +91,7 @@ describe('ubus-lime-utils tests #ubuslimelocation', function() stub(network, "get_own_macs", function () return own_macs end) local response = rpcd_call(ubus_lime_loc, {'call', 'nodes_and_links'}, '') - local hostname = io.input("/proc/sys/kernel/hostname"):read("*line") + local hostname = utils.hostname() assert.is.equal(hostname, response[hostname].hostname) assert.are.same(own_macs, response[hostname].macs) diff --git a/packages/ubus-lime-utils/files/usr/libexec/rpcd/lime-utils b/packages/ubus-lime-utils/files/usr/libexec/rpcd/lime-utils index 4b5ba72ea..9e32959cd 100755 --- a/packages/ubus-lime-utils/files/usr/libexec/rpcd/lime-utils +++ b/packages/ubus-lime-utils/files/usr/libexec/rpcd/lime-utils @@ -58,7 +58,7 @@ end local function get_node_status(msg) local result = {} - result.hostname = io.input("/proc/sys/kernel/hostname"):read("*line") + result.hostname = utils.hostname() result.ips = {} local ips = utils.unsafe_shell("ip a s br-lan | grep inet | awk '{ print $1, $2 }'") for line in ips:gmatch("[^\n]+") do diff --git a/packages/ubus-lime-utils/tests/test_ubus_lime_utils.lua b/packages/ubus-lime-utils/tests/test_ubus_lime_utils.lua index 6347e37ec..63132954c 100644 --- a/packages/ubus-lime-utils/tests/test_ubus_lime_utils.lua +++ b/packages/ubus-lime-utils/tests/test_ubus_lime_utils.lua @@ -52,7 +52,7 @@ describe('ubus-lime-utils tests #ubuslimeutils', function() local response = rpcd_call(ubus_lime_utils, {'call', 'get_node_status'}, '') assert.is.equal("ok", response.status) - assert.is.equal(io.input("/proc/sys/kernel/hostname"):read("*line"), response.hostname) + assert.is.equal(utils.hostname(), response.hostname) assert.are.same({}, response.ips) assert.is.equal("123", response.uptime) end) From 8b54080ff47554028eec6aa9325e70ab064128af Mon Sep 17 00:00:00 2001 From: Santiago Piccinini Date: Tue, 30 Mar 2021 23:16:36 -0300 Subject: [PATCH 4/9] lime.utils: add current_board() --- packages/lime-system/files/usr/lib/lua/lime/utils.lua | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/packages/lime-system/files/usr/lib/lua/lime/utils.lua b/packages/lime-system/files/usr/lib/lua/lime/utils.lua index 8cd664bf7..00beac335 100644 --- a/packages/lime-system/files/usr/lib/lua/lime/utils.lua +++ b/packages/lime-system/files/usr/lib/lua/lime/utils.lua @@ -277,6 +277,10 @@ function utils.getBoardAsTable(board_path) return json.parse(fs.readfile(board_path)) end +function utils.current_board() + return utils.read_file("/tmp/sysinfo/board_name"):gsub("\n","") +end + function utils.printJson(obj) print(json.stringify(obj)) end From 55fe592d32b7abd93877de010af878966a501600 Mon Sep 17 00:00:00 2001 From: Santiago Piccinini Date: Tue, 30 Mar 2021 23:20:22 -0300 Subject: [PATCH 5/9] shared-state-network_nodes: many improvements --- packages/shared-state-network_nodes/Makefile | 2 +- .../shared-state-network_nodes-cron | 2 +- .../bin/shared-state-publish_network_nodes | 9 +- .../files/usr/lib/lua/network-nodes.lua | 88 ++++++++++++++++-- .../tests/test_network_nodes.lua | 92 ++++++++++++++----- 5 files changed, 151 insertions(+), 42 deletions(-) diff --git a/packages/shared-state-network_nodes/Makefile b/packages/shared-state-network_nodes/Makefile index c30bdeb75..28fa6b447 100644 --- a/packages/shared-state-network_nodes/Makefile +++ b/packages/shared-state-network_nodes/Makefile @@ -11,7 +11,7 @@ define Package/$(PKG_NAME) CATEGORY:=Utilities TITLE:=$(PKG_NAME) provides shared state database of all times network nodes MAINTAINER:=Germán Ferrero - DEPENDS:=+shared-state + DEPENDS:=+shared-state +shared-state-nodes_and_links +lime-system PKGARCH:=all endef diff --git a/packages/shared-state-network_nodes/files/etc/uci-defaults/shared-state-network_nodes-cron b/packages/shared-state-network_nodes/files/etc/uci-defaults/shared-state-network_nodes-cron index 7af452af7..a46558999 100644 --- a/packages/shared-state-network_nodes/files/etc/uci-defaults/shared-state-network_nodes-cron +++ b/packages/shared-state-network_nodes/files/etc/uci-defaults/shared-state-network_nodes-cron @@ -6,5 +6,5 @@ unique_append() } unique_append \ - '*/5 * * * * ((sleep $(($RANDOM % 120)); shared-state-persistent sync network_nodes &> /dev/null)&)'\ + '*/5 * * * * ((sleep $(($RANDOM % 120)); shared-state-multiwriter sync network_nodes &> /dev/null)&)'\ /etc/crontabs/root diff --git a/packages/shared-state-network_nodes/files/usr/bin/shared-state-publish_network_nodes b/packages/shared-state-network_nodes/files/usr/bin/shared-state-publish_network_nodes index 00e6bc7c7..b4113a46d 100755 --- a/packages/shared-state-network_nodes/files/usr/bin/shared-state-publish_network_nodes +++ b/packages/shared-state-network_nodes/files/usr/bin/shared-state-publish_network_nodes @@ -16,11 +16,6 @@ --! You should have received a copy of the GNU Affero General Public License --! along with this program. If not, see . -local hostname = io.input("/proc/sys/kernel/hostname"):read("*line") -local JSON = require("luci.jsonc") +local network_nodes = require('network-nodes') -local networkNodesTable = { - [hostname] = {true} -} - -io.popen("shared-state-persistent insert network_nodes", "w"):write(JSON.stringify(networkNodesTable)) +network_nodes.publish() diff --git a/packages/shared-state-network_nodes/files/usr/lib/lua/network-nodes.lua b/packages/shared-state-network_nodes/files/usr/lib/lua/network-nodes.lua index b883fca94..fd796db88 100644 --- a/packages/shared-state-network_nodes/files/usr/lib/lua/network-nodes.lua +++ b/packages/shared-state-network_nodes/files/usr/lib/lua/network-nodes.lua @@ -1,23 +1,91 @@ local shared_state = require("shared-state") +local utils = require("lime.utils") + local network_nodes = {} +function network_nodes.node(hostname, member, fw_version, board) + return {hostname=hostname, member=member, fw_version=fw_version, board=board} +end + +function network_nodes.serialize_for_network_nodes(node) + return {hostname=node.hostname, member=node.member, fw_version=node.fw_version, board=node.board} +end + +function network_nodes.deserialize_from_network_nodes(data) + return network_nodes.node(data.hostname, data.member, data.fw_version, data.board) +end + +function network_nodes._nodes_from_db(db) + local nodes = {} + for hostname, value in pairs(db:get()) do + nodes[hostname] = network_nodes.deserialize_from_network_nodes(value.data) + end + return nodes +end + +function network_nodes.create_node() + local hostname = utils.hostname() + local fw_version = utils.release_info()['DISTRIB_RELEASE'] + local board = utils.current_board() + local member = true + local node = network_nodes.node(hostname, member, fw_version, board) + node.status = "recently_connected" + return node +end + +function network_nodes.publish() + local node = network_nodes.create_node() + local data = { + [node.hostname] = network_nodes.serialize_for_network_nodes(node) + } + network_nodes_db = shared_state.SharedStateMultiWriter:new("network_nodes") + network_nodes_db:insert(data) +end + +function network_nodes.as_csv() + local nodes = network_nodes.get_nodes() + local tmpl = "%-30s %-40s %-30s %-20s\n" + local out = string.format(tmpl, "hostname", "board", "fw_version", "status") + for _, node in pairs(nodes) do + if node.member then + out = out .. string.format(tmpl, node.hostname, node.board, node.fw_version, node.status) + end + end + return out +end + + function network_nodes.get_nodes() - local sharedState = shared_state.SharedStatePersistent:new("network_nodes") - local result = {} - for key, value in pairs(sharedState:get()) do - local status = value.data and "connected" or "disconnected" - table.insert(result, { hostname = key, status = status}) + local network_nodes_db = shared_state.SharedStateMultiWriter:new("network_nodes") + local node_and_links_db = shared_state.SharedState:new("nodes_and_links") + + local nodes = {} + -- augment the node information from the network_nodes and the 'nodes_and_links' dbs + for hostname, node in pairs(network_nodes._nodes_from_db(network_nodes_db)) do + if node_and_links_db:get()[hostname] then + node.status = "recently_connected" + elseif node.member then + node.status = "disconnected" + else + node.status = "gone" + end + nodes[hostname] = node end - return result + return nodes end function network_nodes.mark_nodes_as_gone(hostnames) - local sharedState = shared_state.SharedStatePersistent:new("network_nodes") + local network_nodes_db = shared_state.SharedStateMultiWriter:new("network_nodes") + local nodes = network_nodes._nodes_from_db(network_nodes_db) local data = {} for _, hostname in pairs(hostnames or {}) do - data[hostname] = false + local node = nodes[hostname] + if node then + node.member = false + data[hostname] = network_nodes.serialize_for_network_nodes(node) + end end - sharedState:insert(data) + network_nodes_db:insert(data) end -return network_nodes \ No newline at end of file +return network_nodes diff --git a/packages/shared-state-network_nodes/tests/test_network_nodes.lua b/packages/shared-state-network_nodes/tests/test_network_nodes.lua index 5148ec34a..adcc179c4 100644 --- a/packages/shared-state-network_nodes/tests/test_network_nodes.lua +++ b/packages/shared-state-network_nodes/tests/test_network_nodes.lua @@ -1,43 +1,89 @@ -local network_nodes = require('network-nodes') local utils = require('lime.utils') local test_utils = require('tests.utils') local shared_state = require('shared-state') +local network_nodes = require('network-nodes') -describe('Tests network_nodes #network_nodes', function () +describe('Tests network_nodes #network_nodes', function () before_each('', function() test_dir = test_utils.setup_test_dir() shared_state.PERSISTENT_DATA_DIR = test_dir + shared_state.DATA_DIR = test_dir end) after_each('', function() test_utils.teardown_test_dir() end) - it('test get_nodes return expected format #network_nodes', function() - local sharedState = shared_state.SharedStatePersistent:new('network_nodes') + it('test node creation and serialization', function() + stub(utils, "release_info", function () return {DISTRIB_RELEASE='2021.1'} end) + stub(utils, "current_board", function () return 'devboard' end) + local node = network_nodes.create_node() + assert.are.equal('devboard', node.board) + assert.are.equal('2021.1', node.fw_version) + assert.are.equal('recently_connected', node.status) + + local node = network_nodes.node("node1", true, "2021.1", "librerouter-v1") + assert.are.same(node, network_nodes.deserialize_from_network_nodes(network_nodes.serialize_for_network_nodes(node))) + + end) + + it('test get_nodes return expected format #get_nodes', function() + local node1 = network_nodes.node("node1", true, "2021.1", "librerouter-v1") + local node2 = network_nodes.node("node2", true, "2020.3", "librerouter-v1") + local node3 = network_nodes.node("node3", true, "2020.1", "tplink-wdr3600") + local network_nodes_db = shared_state.SharedStateMultiWriter:new('network_nodes') local data = { - ["node1"] = true, - ["node2"] = false, - ["node3"] = true, - } - sharedState:insert(data) - local expected = { - { hostname = "node1", status = "connected"}, - { hostname = "node2", status = "disconnected"}, - { hostname = "node3", status = "connected"}, + ["node1"] = network_nodes.serialize_for_network_nodes(node1), + ["node2"] = network_nodes.serialize_for_network_nodes(node2), + ["node3"] = network_nodes.serialize_for_network_nodes(node3), } - assert.are.same(expected, network_nodes.get_nodes()) + network_nodes_db:insert(data) + + local nodes_and_links_db = shared_state.SharedState:new('nodes_and_links') + nodes_and_links_db:get() + nodes_and_links_db:insert({node1={foo='bar'}}) + + assert.are.same({node1=node1, node2=node2, node3=node3}, network_nodes._nodes_from_db(network_nodes_db)) + + local nodes = network_nodes.get_nodes() + assert.is.equal("recently_connected", nodes["node1"].status) + assert.is.equal("disconnected", nodes["node2"].status) + assert.is.equal("librerouter-v1", nodes["node2"].board) + + local csv = network_nodes.as_csv() end) - + it('test mark_nodes_as_gone marks nodes as gone', function () + local node1 = network_nodes.node("node1", true, "2021.1", "librerouter-v1") + local node2 = network_nodes.node("node2", true, "2020.3", "librerouter-v1") + local node3 = network_nodes.node("node3", true, "2020.1", "tplink-wdr3600") + local network_nodes_db = shared_state.SharedStateMultiWriter:new('network_nodes') + local data = { + ["node1"] = network_nodes.serialize_for_network_nodes(node1), + ["node2"] = network_nodes.serialize_for_network_nodes(node2), + ["node3"] = network_nodes.serialize_for_network_nodes(node3), + } + network_nodes_db:insert(data) + network_nodes.mark_nodes_as_gone({ - 'node1', 'node2', 'node3' + 'node1', 'node2' }) - local expected = { - { hostname = "node1", status = "disconnected"}, - { hostname = "node2", status = "disconnected"}, - { hostname = "node3", status = "disconnected"}, - } - assert.are.same(expected, network_nodes.get_nodes()) + + local nodes = network_nodes.get_nodes() + assert.is.equal("gone", nodes["node1"].status) + assert.is.equal("gone", nodes["node2"].status) + assert.is.equal("disconnected", nodes["node3"].status) + assert.is.equal("2020.1", nodes["node3"].fw_version) end) -end) \ No newline at end of file + + it('test publish', function () + local hostname = 'mydevpc' + stub(utils, "hostname", function () return hostname end) + stub(utils, "release_info", function () return {RELEASE='2021.1'} end) + stub(utils, "current_board", function () return 'devboard' end) + network_nodes.publish() + local nodes = network_nodes.get_nodes() + assert.is.equal("devboard", nodes[hostname].board) + end) + +end) From c6c7e08cf8ee27713418be220cb6ac32b970cb18 Mon Sep 17 00:00:00 2001 From: Santiago Piccinini Date: Mon, 5 Apr 2021 19:00:02 -0300 Subject: [PATCH 6/9] shared-state-network_nodes: add ipv4 and ipv6 data --- .../files/usr/bin/network-nodes | 2 +- .../files/usr/lib/lua/network-nodes.lua | 27 ++++++++++++------- .../files/usr/libexec/rpcd/network-nodes | 0 .../tests/test_network_nodes.lua | 25 ++++++++++++++--- 4 files changed, 40 insertions(+), 14 deletions(-) mode change 100644 => 100755 packages/shared-state-network_nodes/files/usr/libexec/rpcd/network-nodes diff --git a/packages/shared-state-network_nodes/files/usr/bin/network-nodes b/packages/shared-state-network_nodes/files/usr/bin/network-nodes index 3feb48a4c..a7c441983 100755 --- a/packages/shared-state-network_nodes/files/usr/bin/network-nodes +++ b/packages/shared-state-network_nodes/files/usr/bin/network-nodes @@ -2,4 +2,4 @@ local network_nodes = require('network-nodes') -io.stdout:write(network_nodes.as_csv()) +io.stdout:write(network_nodes.as_human_readable_table()) diff --git a/packages/shared-state-network_nodes/files/usr/lib/lua/network-nodes.lua b/packages/shared-state-network_nodes/files/usr/lib/lua/network-nodes.lua index fd796db88..0e739d2ed 100644 --- a/packages/shared-state-network_nodes/files/usr/lib/lua/network-nodes.lua +++ b/packages/shared-state-network_nodes/files/usr/lib/lua/network-nodes.lua @@ -1,18 +1,20 @@ local shared_state = require("shared-state") local utils = require("lime.utils") +local config = require("lime.config") local network_nodes = {} -function network_nodes.node(hostname, member, fw_version, board) - return {hostname=hostname, member=member, fw_version=fw_version, board=board} +function network_nodes.node(hostname, member, fw_version, board, ipv4, ipv6) + return {hostname=hostname, member=member, fw_version=fw_version, board=board, ipv4=ipv4, ipv6=ipv6} end function network_nodes.serialize_for_network_nodes(node) - return {hostname=node.hostname, member=node.member, fw_version=node.fw_version, board=node.board} + return {hostname=node.hostname, member=node.member, fw_version=node.fw_version, board=node.board, + ipv4=node.ipv4, ipv6=node.ipv6} end function network_nodes.deserialize_from_network_nodes(data) - return network_nodes.node(data.hostname, data.member, data.fw_version, data.board) + return network_nodes.node(data.hostname, data.member, data.fw_version, data.board, data.ipv4, data.ipv6) end function network_nodes._nodes_from_db(db) @@ -24,12 +26,18 @@ function network_nodes._nodes_from_db(db) end function network_nodes.create_node() + local uci = config.get_uci_cursor() + local hostname = utils.hostname() local fw_version = utils.release_info()['DISTRIB_RELEASE'] local board = utils.current_board() local member = true - local node = network_nodes.node(hostname, member, fw_version, board) + local ipv4 = uci:get("network", "lan", "ipaddr") + local ipv6 = uci:get("network", "lan", "ip6addr") + if ipv6 then ipv6 = ipv6:gsub("/.*$", "") end -- remove the netmask info + local node = network_nodes.node(hostname, member, fw_version, board, ipv4, ipv6) node.status = "recently_connected" + return node end @@ -42,13 +50,14 @@ function network_nodes.publish() network_nodes_db:insert(data) end -function network_nodes.as_csv() +function network_nodes.as_human_readable_table() local nodes = network_nodes.get_nodes() - local tmpl = "%-30s %-40s %-30s %-20s\n" - local out = string.format(tmpl, "hostname", "board", "fw_version", "status") + local tmpl = "%-26s %-16s %-30s %-20s %-30s %-40s\n" + local out = string.format(tmpl, "hostname", "ipv4", "ipv6", "status", "board", "fw_version") for _, node in pairs(nodes) do if node.member then - out = out .. string.format(tmpl, node.hostname, node.board, node.fw_version, node.status) + out = out .. string.format(tmpl, node.hostname, node.ipv4, node.ipv6, node.status, + node.board, node.fw_version) end end return out diff --git a/packages/shared-state-network_nodes/files/usr/libexec/rpcd/network-nodes b/packages/shared-state-network_nodes/files/usr/libexec/rpcd/network-nodes old mode 100644 new mode 100755 diff --git a/packages/shared-state-network_nodes/tests/test_network_nodes.lua b/packages/shared-state-network_nodes/tests/test_network_nodes.lua index adcc179c4..b9febc0f7 100644 --- a/packages/shared-state-network_nodes/tests/test_network_nodes.lua +++ b/packages/shared-state-network_nodes/tests/test_network_nodes.lua @@ -3,24 +3,34 @@ local test_utils = require('tests.utils') local shared_state = require('shared-state') local network_nodes = require('network-nodes') +local uci = nil + describe('Tests network_nodes #network_nodes', function () before_each('', function() test_dir = test_utils.setup_test_dir() shared_state.PERSISTENT_DATA_DIR = test_dir shared_state.DATA_DIR = test_dir + uci = test_utils.setup_test_uci() end) after_each('', function() test_utils.teardown_test_dir() + test_utils.teardown_test_uci(uci) end) it('test node creation and serialization', function() stub(utils, "release_info", function () return {DISTRIB_RELEASE='2021.1'} end) stub(utils, "current_board", function () return 'devboard' end) + uci:set('network', 'lan', 'interface') + uci:set('network', 'lan', 'ipaddr', '10.5.0.5') + uci:set('network', 'lan', 'ip6addr', 'fd0d:fe46:8ce8::ab:cd00/64') + uci:commit('network') local node = network_nodes.create_node() assert.are.equal('devboard', node.board) assert.are.equal('2021.1', node.fw_version) assert.are.equal('recently_connected', node.status) + assert.are.equal('10.5.0.5', node.ipv4) + assert.are.equal('fd0d:fe46:8ce8::ab:cd00', node.ipv6) local node = network_nodes.node("node1", true, "2021.1", "librerouter-v1") assert.are.same(node, network_nodes.deserialize_from_network_nodes(network_nodes.serialize_for_network_nodes(node))) @@ -28,9 +38,16 @@ describe('Tests network_nodes #network_nodes', function () end) it('test get_nodes return expected format #get_nodes', function() - local node1 = network_nodes.node("node1", true, "2021.1", "librerouter-v1") - local node2 = network_nodes.node("node2", true, "2020.3", "librerouter-v1") - local node3 = network_nodes.node("node3", true, "2020.1", "tplink-wdr3600") + uci:set('network', 'lan', 'interface') + uci:set('network', 'lan', 'ipaddr', '10.5.0.5') + uci:set('network', 'lan', 'ip6addr', 'fd0d:fe46:8ce8::ab:cd00/64') + uci:commit('network') + local node1 = network_nodes.node("node1", true, "2021.1", "librerouter-v1", "10.24.3.97", + "fd0d:fe46:8ce8::ab:cd00") + local node2 = network_nodes.node("node2", true, "2020.3", "librerouter-v1", "10.24.3.98", + "fd0d:fe46:8ce8::ab:cd01") + local node3 = network_nodes.node("node3", true, "2020.1", "tplink-wdr3600", "10.24.3.98", + "fd0d:fe46:8ce8::ab:cd02") local network_nodes_db = shared_state.SharedStateMultiWriter:new('network_nodes') local data = { ["node1"] = network_nodes.serialize_for_network_nodes(node1), @@ -50,7 +67,7 @@ describe('Tests network_nodes #network_nodes', function () assert.is.equal("disconnected", nodes["node2"].status) assert.is.equal("librerouter-v1", nodes["node2"].board) - local csv = network_nodes.as_csv() + local csv = network_nodes.as_human_readable_table() -- ok just some excercise... end) it('test mark_nodes_as_gone marks nodes as gone', function () From 502c8418180a69a050bd71261cea18ca4638458a Mon Sep 17 00:00:00 2001 From: Santiago Piccinini Date: Thu, 17 Jun 2021 15:33:20 -0300 Subject: [PATCH 7/9] shared-state-nework_nodes: rename disconneted to unreachable --- .../files/usr/lib/lua/network-nodes.lua | 6 +++--- .../tests/test_network_nodes.lua | 8 ++++---- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/packages/shared-state-network_nodes/files/usr/lib/lua/network-nodes.lua b/packages/shared-state-network_nodes/files/usr/lib/lua/network-nodes.lua index 0e739d2ed..30666d57d 100644 --- a/packages/shared-state-network_nodes/files/usr/lib/lua/network-nodes.lua +++ b/packages/shared-state-network_nodes/files/usr/lib/lua/network-nodes.lua @@ -36,7 +36,7 @@ function network_nodes.create_node() local ipv6 = uci:get("network", "lan", "ip6addr") if ipv6 then ipv6 = ipv6:gsub("/.*$", "") end -- remove the netmask info local node = network_nodes.node(hostname, member, fw_version, board, ipv4, ipv6) - node.status = "recently_connected" + node.status = "recently_reachable" return node end @@ -72,9 +72,9 @@ function network_nodes.get_nodes() -- augment the node information from the network_nodes and the 'nodes_and_links' dbs for hostname, node in pairs(network_nodes._nodes_from_db(network_nodes_db)) do if node_and_links_db:get()[hostname] then - node.status = "recently_connected" + node.status = "recently_reachable" elseif node.member then - node.status = "disconnected" + node.status = "unreachable" else node.status = "gone" end diff --git a/packages/shared-state-network_nodes/tests/test_network_nodes.lua b/packages/shared-state-network_nodes/tests/test_network_nodes.lua index b9febc0f7..26de7a0de 100644 --- a/packages/shared-state-network_nodes/tests/test_network_nodes.lua +++ b/packages/shared-state-network_nodes/tests/test_network_nodes.lua @@ -28,7 +28,7 @@ describe('Tests network_nodes #network_nodes', function () local node = network_nodes.create_node() assert.are.equal('devboard', node.board) assert.are.equal('2021.1', node.fw_version) - assert.are.equal('recently_connected', node.status) + assert.are.equal('recently_reachable', node.status) assert.are.equal('10.5.0.5', node.ipv4) assert.are.equal('fd0d:fe46:8ce8::ab:cd00', node.ipv6) @@ -63,8 +63,8 @@ describe('Tests network_nodes #network_nodes', function () assert.are.same({node1=node1, node2=node2, node3=node3}, network_nodes._nodes_from_db(network_nodes_db)) local nodes = network_nodes.get_nodes() - assert.is.equal("recently_connected", nodes["node1"].status) - assert.is.equal("disconnected", nodes["node2"].status) + assert.is.equal("recently_reachable", nodes["node1"].status) + assert.is.equal("unreachable", nodes["node2"].status) assert.is.equal("librerouter-v1", nodes["node2"].board) local csv = network_nodes.as_human_readable_table() -- ok just some excercise... @@ -89,7 +89,7 @@ describe('Tests network_nodes #network_nodes', function () local nodes = network_nodes.get_nodes() assert.is.equal("gone", nodes["node1"].status) assert.is.equal("gone", nodes["node2"].status) - assert.is.equal("disconnected", nodes["node3"].status) + assert.is.equal("unreachable", nodes["node3"].status) assert.is.equal("2020.1", nodes["node3"].fw_version) end) From 70446c023afc1f8a7fc3cebd6767ce00aa8500fc Mon Sep 17 00:00:00 2001 From: Santiago Piccinini Date: Wed, 23 Jun 2021 15:23:37 -0300 Subject: [PATCH 8/9] shared-state: remove unsed line in test --- packages/shared-state/tests/test_shared_state.lua | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/shared-state/tests/test_shared_state.lua b/packages/shared-state/tests/test_shared_state.lua index adfe6fd0c..5b344092c 100644 --- a/packages/shared-state/tests/test_shared_state.lua +++ b/packages/shared-state/tests/test_shared_state.lua @@ -129,7 +129,6 @@ describe('Shared State MultiWriter tests #sharedstatemultiwriter', function() it('test insert new data', function() local ss = shared_state.SharedStateMultiWriter:new('foo') - local sharedStateB = shared_state.SharedStateMultiWriter:new('B') stub(shared_state, "_getFortune", function () return 100 end) ss:insert({ bar = '123'}) local db = ss:get() From 1cc901c27ca7e451231e09446c072b9a2ed412f8 Mon Sep 17 00:00:00 2001 From: Santiago Piccinini Date: Thu, 8 Jul 2021 19:07:04 -0300 Subject: [PATCH 9/9] network-nodes: refactor into a public and private api --- .../files/usr/lib/lua/network-nodes.lua | 61 ++++++++++--------- .../tests/test_network_nodes.lua | 30 ++++----- 2 files changed, 46 insertions(+), 45 deletions(-) diff --git a/packages/shared-state-network_nodes/files/usr/lib/lua/network-nodes.lua b/packages/shared-state-network_nodes/files/usr/lib/lua/network-nodes.lua index 30666d57d..ce2787359 100644 --- a/packages/shared-state-network_nodes/files/usr/lib/lua/network-nodes.lua +++ b/packages/shared-state-network_nodes/files/usr/lib/lua/network-nodes.lua @@ -4,28 +4,28 @@ local config = require("lime.config") local network_nodes = {} -function network_nodes.node(hostname, member, fw_version, board, ipv4, ipv6) +function network_nodes._node(hostname, member, fw_version, board, ipv4, ipv6) return {hostname=hostname, member=member, fw_version=fw_version, board=board, ipv4=ipv4, ipv6=ipv6} end -function network_nodes.serialize_for_network_nodes(node) +function network_nodes._serialize_for_network_nodes(node) return {hostname=node.hostname, member=node.member, fw_version=node.fw_version, board=node.board, ipv4=node.ipv4, ipv6=node.ipv6} end -function network_nodes.deserialize_from_network_nodes(data) - return network_nodes.node(data.hostname, data.member, data.fw_version, data.board, data.ipv4, data.ipv6) +function network_nodes._deserialize_from_network_nodes(data) + return network_nodes._node(data.hostname, data.member, data.fw_version, data.board, data.ipv4, data.ipv6) end function network_nodes._nodes_from_db(db) local nodes = {} for hostname, value in pairs(db:get()) do - nodes[hostname] = network_nodes.deserialize_from_network_nodes(value.data) + nodes[hostname] = network_nodes._deserialize_from_network_nodes(value.data) end return nodes end -function network_nodes.create_node() +function network_nodes._create_node() local uci = config.get_uci_cursor() local hostname = utils.hostname() @@ -35,34 +35,13 @@ function network_nodes.create_node() local ipv4 = uci:get("network", "lan", "ipaddr") local ipv6 = uci:get("network", "lan", "ip6addr") if ipv6 then ipv6 = ipv6:gsub("/.*$", "") end -- remove the netmask info - local node = network_nodes.node(hostname, member, fw_version, board, ipv4, ipv6) + local node = network_nodes._node(hostname, member, fw_version, board, ipv4, ipv6) node.status = "recently_reachable" return node end -function network_nodes.publish() - local node = network_nodes.create_node() - local data = { - [node.hostname] = network_nodes.serialize_for_network_nodes(node) - } - network_nodes_db = shared_state.SharedStateMultiWriter:new("network_nodes") - network_nodes_db:insert(data) -end - -function network_nodes.as_human_readable_table() - local nodes = network_nodes.get_nodes() - local tmpl = "%-26s %-16s %-30s %-20s %-30s %-40s\n" - local out = string.format(tmpl, "hostname", "ipv4", "ipv6", "status", "board", "fw_version") - for _, node in pairs(nodes) do - if node.member then - out = out .. string.format(tmpl, node.hostname, node.ipv4, node.ipv6, node.status, - node.board, node.fw_version) - end - end - return out -end - +--! Public API function network_nodes.get_nodes() local network_nodes_db = shared_state.SharedStateMultiWriter:new("network_nodes") @@ -83,6 +62,28 @@ function network_nodes.get_nodes() return nodes end +function network_nodes.as_human_readable_table() + local nodes = network_nodes.get_nodes() + local tmpl = "%-26s %-16s %-30s %-20s %-30s %-40s\n" + local out = string.format(tmpl, "hostname", "ipv4", "ipv6", "status", "board", "fw_version") + for _, node in pairs(nodes) do + if node.member then + out = out .. string.format(tmpl, node.hostname, node.ipv4, node.ipv6, node.status, + node.board, node.fw_version) + end + end + return out +end + +function network_nodes.publish() + local node = network_nodes._create_node() + local data = { + [node.hostname] = network_nodes._serialize_for_network_nodes(node) + } + network_nodes_db = shared_state.SharedStateMultiWriter:new("network_nodes") + network_nodes_db:insert(data) +end + function network_nodes.mark_nodes_as_gone(hostnames) local network_nodes_db = shared_state.SharedStateMultiWriter:new("network_nodes") local nodes = network_nodes._nodes_from_db(network_nodes_db) @@ -91,7 +92,7 @@ function network_nodes.mark_nodes_as_gone(hostnames) local node = nodes[hostname] if node then node.member = false - data[hostname] = network_nodes.serialize_for_network_nodes(node) + data[hostname] = network_nodes._serialize_for_network_nodes(node) end end network_nodes_db:insert(data) diff --git a/packages/shared-state-network_nodes/tests/test_network_nodes.lua b/packages/shared-state-network_nodes/tests/test_network_nodes.lua index 26de7a0de..a432dc8e4 100644 --- a/packages/shared-state-network_nodes/tests/test_network_nodes.lua +++ b/packages/shared-state-network_nodes/tests/test_network_nodes.lua @@ -25,15 +25,15 @@ describe('Tests network_nodes #network_nodes', function () uci:set('network', 'lan', 'ipaddr', '10.5.0.5') uci:set('network', 'lan', 'ip6addr', 'fd0d:fe46:8ce8::ab:cd00/64') uci:commit('network') - local node = network_nodes.create_node() + local node = network_nodes._create_node() assert.are.equal('devboard', node.board) assert.are.equal('2021.1', node.fw_version) assert.are.equal('recently_reachable', node.status) assert.are.equal('10.5.0.5', node.ipv4) assert.are.equal('fd0d:fe46:8ce8::ab:cd00', node.ipv6) - local node = network_nodes.node("node1", true, "2021.1", "librerouter-v1") - assert.are.same(node, network_nodes.deserialize_from_network_nodes(network_nodes.serialize_for_network_nodes(node))) + local node = network_nodes._node("node1", true, "2021.1", "librerouter-v1") + assert.are.same(node, network_nodes._deserialize_from_network_nodes(network_nodes._serialize_for_network_nodes(node))) end) @@ -42,17 +42,17 @@ describe('Tests network_nodes #network_nodes', function () uci:set('network', 'lan', 'ipaddr', '10.5.0.5') uci:set('network', 'lan', 'ip6addr', 'fd0d:fe46:8ce8::ab:cd00/64') uci:commit('network') - local node1 = network_nodes.node("node1", true, "2021.1", "librerouter-v1", "10.24.3.97", + local node1 = network_nodes._node("node1", true, "2021.1", "librerouter-v1", "10.24.3.97", "fd0d:fe46:8ce8::ab:cd00") - local node2 = network_nodes.node("node2", true, "2020.3", "librerouter-v1", "10.24.3.98", + local node2 = network_nodes._node("node2", true, "2020.3", "librerouter-v1", "10.24.3.98", "fd0d:fe46:8ce8::ab:cd01") - local node3 = network_nodes.node("node3", true, "2020.1", "tplink-wdr3600", "10.24.3.98", + local node3 = network_nodes._node("node3", true, "2020.1", "tplink-wdr3600", "10.24.3.98", "fd0d:fe46:8ce8::ab:cd02") local network_nodes_db = shared_state.SharedStateMultiWriter:new('network_nodes') local data = { - ["node1"] = network_nodes.serialize_for_network_nodes(node1), - ["node2"] = network_nodes.serialize_for_network_nodes(node2), - ["node3"] = network_nodes.serialize_for_network_nodes(node3), + ["node1"] = network_nodes._serialize_for_network_nodes(node1), + ["node2"] = network_nodes._serialize_for_network_nodes(node2), + ["node3"] = network_nodes._serialize_for_network_nodes(node3), } network_nodes_db:insert(data) @@ -71,14 +71,14 @@ describe('Tests network_nodes #network_nodes', function () end) it('test mark_nodes_as_gone marks nodes as gone', function () - local node1 = network_nodes.node("node1", true, "2021.1", "librerouter-v1") - local node2 = network_nodes.node("node2", true, "2020.3", "librerouter-v1") - local node3 = network_nodes.node("node3", true, "2020.1", "tplink-wdr3600") + local node1 = network_nodes._node("node1", true, "2021.1", "librerouter-v1") + local node2 = network_nodes._node("node2", true, "2020.3", "librerouter-v1") + local node3 = network_nodes._node("node3", true, "2020.1", "tplink-wdr3600") local network_nodes_db = shared_state.SharedStateMultiWriter:new('network_nodes') local data = { - ["node1"] = network_nodes.serialize_for_network_nodes(node1), - ["node2"] = network_nodes.serialize_for_network_nodes(node2), - ["node3"] = network_nodes.serialize_for_network_nodes(node3), + ["node1"] = network_nodes._serialize_for_network_nodes(node1), + ["node2"] = network_nodes._serialize_for_network_nodes(node2), + ["node3"] = network_nodes._serialize_for_network_nodes(node3), } network_nodes_db:insert(data)