Skip to content

Commit 1d2ae39

Browse files
committed
extension: refresh extension VpcProviders on every getVpcElements() call
The vpcElements list was initialized once and never refreshed, so dynamically registered extensions would be invisible until server restart. Fix: keep caching the static providers (VPCVirtualRouter, JuniperContrailVpcRouter) but re-query extension-backed NetworkOrchestrator providers on every call so that newly registered extensions are picked up immediately.
1 parent 78eda30 commit 1d2ae39

1 file changed

Lines changed: 11 additions & 12 deletions

File tree

server/src/main/java/com/cloud/network/vpc/VpcManagerImpl.java

Lines changed: 11 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2267,6 +2267,7 @@ private void CheckAccountsAccess(Vpc vpc, Account networkAccount) {
22672267
}
22682268

22692269
public List<VpcProvider> getVpcElements() {
2270+
// Static providers (VPCVirtualRouter, JuniperContrailVpcRouter) are initialized once.
22702271
if (vpcElements == null) {
22712272
vpcElements = new ArrayList<VpcProvider>();
22722273
final NetworkElement vpcVirtualRouter = _ntwkModel.getElementImplementingProvider(Provider.VPCVirtualRouter.getName());
@@ -2278,22 +2279,20 @@ public List<VpcProvider> getVpcElements() {
22782279
if (contrailVpcRouter instanceof VpcProvider) {
22792280
vpcElements.add((VpcProvider) contrailVpcRouter);
22802281
}
2281-
2282-
// Add extension-backed network orchestrators that can serve as VPC providers.
2283-
for (final Extension extension : extensionHelper.listExtensionsByType(Extension.Type.NetworkOrchestrator)) {
2284-
final String providerName = extension.getName();
2285-
final NetworkElement element = _ntwkModel.getElementImplementingProvider(providerName);
2286-
if (element instanceof VpcProvider) {
2287-
vpcElements.add((VpcProvider) element);
2288-
}
2289-
}
22902282
}
22912283

2292-
if (vpcElements == null) {
2293-
throw new CloudRuntimeException("Failed to initialize vpc elements");
2284+
// Extension-backed providers are re-fetched every call so that dynamically
2285+
// registered extensions are picked up without requiring a server restart.
2286+
final List<VpcProvider> result = new ArrayList<>(vpcElements);
2287+
for (final Extension extension : extensionHelper.listExtensionsByType(Extension.Type.NetworkOrchestrator)) {
2288+
final String providerName = extension.getName();
2289+
final NetworkElement element = _ntwkModel.getElementImplementingProvider(providerName);
2290+
if (element instanceof VpcProvider) {
2291+
result.add((VpcProvider) element);
2292+
}
22942293
}
22952294

2296-
return vpcElements;
2295+
return result;
22972296
}
22982297

22992298
@Override

0 commit comments

Comments
 (0)