diff --git a/plugins/inventory/netbird.py b/plugins/inventory/netbird.py index 0534119..f3459da 100644 --- a/plugins/inventory/netbird.py +++ b/plugins/inventory/netbird.py @@ -59,9 +59,8 @@ options: description: Whether or not to fail if a group or variable is not found. compose: description: compose variables for Ansible based on jinja2 expression and inventory vars - default: False required: False - type: boolean + type: dict keyed_groups: description: create groups for plugins based on variable values and add the corresponding hosts to it type: list diff --git a/tests/unit/module_utils/inventories/fixtures/peers_spaces_in_group.json b/tests/unit/module_utils/inventories/fixtures/peers_spaces_in_group.json new file mode 100644 index 0000000..04d765b --- /dev/null +++ b/tests/unit/module_utils/inventories/fixtures/peers_spaces_in_group.json @@ -0,0 +1,74 @@ +[ + { + "accessible_peers_count": 1, + "approval_required": false, + "city_name": "", + "connected": false, + "connection_ip": "", + "country_code": "", + "dns_label": "apple.netbird.cloud", + "geoname_id": 0, + "groups": [ + { + "id": "3aBcD4eF5gHiJ6kLmNoP", + "name": "All", + "peers_count": 2 + }, + { + "id": "2j3k4l5m6n7o8p9q0r1", + "name": "Test Group With Spaces", + "peers_count": 1 + } + ], + "hostname": "apple", + "id": "2j3k4l5m6n7o8p9q0r1", + "ip": "10.10.10.123", + "kernel_version": "", + "last_login": "2024-02-10T22:01:27.744131502Z", + "last_seen": "2024-02-11T03:21:42.202104672Z", + "login_expiration_enabled": true, + "login_expired": false, + "name": "apple", + "os": "Linux Mint 21.3", + "ssh_enabled": false, + "ui_version": "netbird-desktop-ui/0.25.7", + "user_id": "auth0|abc123xyz4567890defg", + "version": "0.25.7" + }, + { + "accessible_peers_count": 1, + "approval_required": false, + "city_name": "New York", + "connected": true, + "connection_ip": "146.123.45.67", + "country_code": "US", + "dns_label": "banana.netbird.cloud", + "geoname_id": 1234567, + "groups": [ + { + "id": "2j3k4l5m6n7o8p9q0r1", + "name": "Development", + "peers_count": 1 + }, + { + "id": "3aBcD4eF5gHiJ6kLmNoP", + "name": "All", + "peers_count": 2 + } + ], + "hostname": "banana", + "id": "hkwJPXNUmGywCLo5S8Wg", + "ip": "10.10.10.124", + "kernel_version": "", + "last_login": "2024-02-02T11:20:05.934889112Z", + "last_seen": "2024-02-24T02:59:35.324496386Z", + "login_expiration_enabled": false, + "login_expired": false, + "name": "docker-manager", + "os": "Alpine Linux 3.19.1", + "ssh_enabled": false, + "ui_version": "", + "user_id": "", + "version": "0.25.5" + } + ] diff --git a/tests/unit/module_utils/inventories/fixtures/spaces_in_group.netbird.yml b/tests/unit/module_utils/inventories/fixtures/spaces_in_group.netbird.yml new file mode 100644 index 0000000..2ee1ec7 --- /dev/null +++ b/tests/unit/module_utils/inventories/fixtures/spaces_in_group.netbird.yml @@ -0,0 +1,18 @@ +--- +plugin: dominion_solutions.netbird.netbird +api_key: nbp_this_is_a_fake_api_key +api_url: https://netbird.example.com/api/v1 +ip_style: plain +netbird_connected: False +leading_separator: No +netbird_groups: +- "Test Group With Spaces" +groups: + connected: connected + ssh_hosts: ssh_enabled +strict: No +keyed_groups: + +compose: + ansible_ssh_host: label + ansible_ssh_port: 22 diff --git a/tests/unit/plugins/inventory/test_netbird.py b/tests/unit/plugins/inventory/test_netbird.py index 8ac4ad2..a68d9fa 100644 --- a/tests/unit/plugins/inventory/test_netbird.py +++ b/tests/unit/plugins/inventory/test_netbird.py @@ -58,6 +58,20 @@ def netbird_api_multigroup(): return mock_netbird_api +@pytest.fixture(scope="module") +def netbird_api_spaces_in_group(): + mock_netbird_api = NetbirdApi(None, None) + response_data = [] + with open('tests/unit/module_utils/inventories/fixtures/peers_spaces_in_group.json') as peers_file: + peers_map = json.load(peers_file) + for data in peers_map: + response_data.append(Peer(data['hostname'], data['dns_label'], data['id'], data)) + + mock_netbird_api.ListPeers = MagicMock(return_value=response_data) + + return mock_netbird_api + + def test_missing_access_token_lookup(inventory): loader = DataLoader() inventory._options = {'api_key': None, 'api_url': None} @@ -137,3 +151,16 @@ def test_use_ip_address(inventory, netbird_api_multigroup): assert inventory.inventory.groups is not None assert 'All' in inventory.inventory.groups assert 'Development' in inventory.inventory.groups + + +def test_use_group_with_spaces(inventory, netbird_api_spaces_in_group): + loader = DataLoader() + path = 'tests/unit/module_utils/inventories/fixtures/spaces_in_group.netbird.yml' + inventory._build_client = MagicMock() + inventory.client = netbird_api_spaces_in_group + inventory.parse(InventoryData(), loader, path, False) + assert inventory.inventory is not None + assert inventory.inventory.hosts is not None + assert inventory.inventory.groups is not None + assert 'All' in inventory.inventory.groups + assert 'Test Group With Spaces' in inventory.inventory.groups