From 21c0582e68c4d3bad6679f778a3a72c84a5ee02f Mon Sep 17 00:00:00 2001 From: Travis Glenn Hansen Date: Wed, 6 Sep 2023 12:07:34 -0600 Subject: [PATCH] proper handling of advertisements without any selectors Signed-off-by: Travis Glenn Hansen --- CHANGELOG.md | 6 +++++ agent.js | 65 ++++++++++++++++++++++++++++++++++++++++++++++++---- 2 files changed, 66 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7c72d59..a50d808 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,9 @@ +# v0.4.6 + +Released 2023-09-06 + +- properly handle advertisements which no selectors/pools + # v0.4.5 Released 2023-07-22 diff --git a/agent.js b/agent.js index 33993f4..94977e6 100644 --- a/agent.js +++ b/agent.js @@ -607,7 +607,7 @@ async function processMetalLBCRDData() { peerAllowed = false; let i = 0; do { - logger.debug(`asserting labelSelector %j`, nodeSelectors[i]); + logger.debug(`asserting peer labelSelector %j`, nodeSelectors[i]); peerAllowed = await kc.assertLabelSelector(node, nodeSelectors[i]); i++; } while (!peerAllowed && i < nodeSelectors.length); @@ -627,15 +627,70 @@ async function processMetalLBCRDData() { * NOTE: purposely ignoring spec.nodeSelectors here for DSR-like scenarios */ for (const advertisement of advertisements) { - for (const poolName of advertisement.spec.ipAddressPools) { - for (const pool of pools) { - if (poolName == pool.metadata.name) { - metallb_addresses.push(...pool.spec.addresses); + let add_all = false; + + const ipAddressPools = _.get(advertisement, 'spec.ipAddressPools', []); + const ipAddressPoolSelectors = _.get( + advertisement, + 'spec.ipAddressPoolSelectors', + [] + ); + + // empty selectors means select all pools + if (!ipAddressPools && !ipAddressPoolSelectors) { + add_all = true; + } + + if (!add_all) { + // NOTE: ipAddressPools and ipAddressPoolSelectors are combined logically so if *either* passes the pool should be included + + if (ipAddressPools.length > 0) { + for (const poolName of ipAddressPools) { + for (const pool of pools) { + if (poolName == pool.metadata.name) { + metallb_addresses.push(...pool.spec.addresses); + } + } + } + } + + if (ipAddressPoolSelectors.length > 0) { + for (const pool of pools) { + let poolAllowed = false; + let i = 0; + do { + logger.debug( + `asserting pool labelSelector %j`, + ipAddressPoolSelectors[i] + ); + poolAllowed = await kc.assertLabelSelector( + pool, + ipAddressPoolSelectors[i] + ); + i++; + } while (!poolAllowed && i < ipAddressPoolSelectors.length); + + if (poolAllowed) { + metallb_addresses.push(...pool.spec.addresses); + } else { + logger.debug( + `pool %s does not match ipAddressPoolSelectors`, + pool.metadata.name + ); + } } } } + + if (add_all) { + for (const pool of pools) { + metallb_addresses.push(...pool.spec.addresses); + } + } } + metallb_peers = [...new Set(metallb_peers)]; + metallb_addresses = [...new Set(metallb_addresses)]; metallb_loaded = true; }