Skip to content

Commit

Permalink
proper handling of advertisements without any selectors
Browse files Browse the repository at this point in the history
Signed-off-by: Travis Glenn Hansen <travisghansen@yahoo.com>
  • Loading branch information
travisghansen committed Sep 6, 2023
1 parent a227436 commit 21c0582
Show file tree
Hide file tree
Showing 2 changed files with 66 additions and 5 deletions.
6 changes: 6 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -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
Expand Down
65 changes: 60 additions & 5 deletions agent.js
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand All @@ -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;
}

Expand Down

0 comments on commit 21c0582

Please sign in to comment.