From 5f71b54ba4198ba8c2388bfabc187683d11cc3a6 Mon Sep 17 00:00:00 2001 From: Liguang Xie Date: Thu, 29 Apr 2021 09:41:02 -0700 Subject: [PATCH] [Port Mgr] Support multiple ResourceOperation types (#603) --- .../alcor/common/utils/CommonUtil.java | 9 ++++ .../processor/DataPlaneProcessor.java | 44 +++++++++++++++++-- .../portmanager/processor/PortContext.java | 8 ++++ .../entity/dataplane/ResourceOperation.java | 12 ++--- 4 files changed, 63 insertions(+), 10 deletions(-) diff --git a/lib/src/main/java/com/futurewei/alcor/common/utils/CommonUtil.java b/lib/src/main/java/com/futurewei/alcor/common/utils/CommonUtil.java index 207d04119..3fc000829 100644 --- a/lib/src/main/java/com/futurewei/alcor/common/utils/CommonUtil.java +++ b/lib/src/main/java/com/futurewei/alcor/common/utils/CommonUtil.java @@ -90,4 +90,13 @@ public static String[] getBeanNullPropertyNames(Object bean){ } }).toArray(String[]::new); } + + /** + * Determine if a given string is empty or null + * @param an input string + * @return a boolean value, true if null or empty + */ + public static boolean isNullOrEmpty(String string) { + return string == null || string.trim().isEmpty(); + } } diff --git a/services/port_manager/src/main/java/com/futurewei/alcor/portmanager/processor/DataPlaneProcessor.java b/services/port_manager/src/main/java/com/futurewei/alcor/portmanager/processor/DataPlaneProcessor.java index 739d2e175..2383bd710 100644 --- a/services/port_manager/src/main/java/com/futurewei/alcor/portmanager/processor/DataPlaneProcessor.java +++ b/services/port_manager/src/main/java/com/futurewei/alcor/portmanager/processor/DataPlaneProcessor.java @@ -16,6 +16,7 @@ free of charge, to any person obtaining a copy of this software and associated d package com.futurewei.alcor.portmanager.processor; import com.futurewei.alcor.common.enumClass.StatusEnum; +import com.futurewei.alcor.common.utils.CommonUtil; import com.futurewei.alcor.common.utils.SpringContextUtil; import com.futurewei.alcor.portmanager.exception.GetNodeInfoException; import com.futurewei.alcor.portmanager.exception.NodeInfoNotFound; @@ -229,6 +230,38 @@ private void setTheMissingFields(PortContext context, List portEntit } + private List initializeResourceOperationTypes(PortContext context, List portEntities) { + List resourceOperationTypes = new ArrayList<>(); + resourceOperationTypes.add(new ResourceOperation(Common.ResourceType.PORT, Common.OperationType.CREATE)); + resourceOperationTypes.add(new ResourceOperation(Common.ResourceType.NEIGHBOR, Common.OperationType.CREATE)); + + // TODO: to enable full sg support, we will need to add full security group entities to context and check context here + for (PortEntity port : portEntities) { + if (!CommonUtil.isNullOrEmpty(context.getDefaultSgId()) && port.getPortSecurityEnabled()) { + resourceOperationTypes.add(new ResourceOperation(Common.ResourceType.SECURITYGROUP, Common.OperationType.CREATE)); + break; + } + } + + if (context.containRouters()) { + resourceOperationTypes.add(new ResourceOperation(Common.ResourceType.NEIGHBOR, Common.OperationType.CREATE)); + } + + return resourceOperationTypes; + } + + private void markOperationTypes(NetworkConfiguration networkConfig, Common.OperationType operationType) { + if (networkConfig == null || networkConfig.getRsOpTypes() == null) { + return; + } + + List resourceOperationTypes = networkConfig.getRsOpTypes(); + for (ResourceOperation type : resourceOperationTypes) { + type.setOpType(operationType); + } + } + + private NetworkConfiguration buildNetworkConfig(PortContext context, List portEntities) throws Exception { /** DataPlaneProcessor needs to wait for all previous Processor runs to @@ -245,9 +278,11 @@ private NetworkConfiguration buildNetworkConfig(PortContext context, List resourceOperationTypes = initializeResourceOperationTypes(context, portEntities); NetworkConfiguration networkConfiguration = new NetworkConfiguration(); networkConfiguration.setRsType(Common.ResourceType.PORT); + networkConfiguration.setRsOpTypes(resourceOperationTypes); networkConfiguration.setVpcs(networkConfig.getVpcEntities()); networkConfiguration.setSubnets(networkConfig.getSubnetEntities()); networkConfiguration.setSecurityGroups(networkConfig.getSecurityGroups()); @@ -267,8 +302,8 @@ private void createNetworkConfig(PortContext context, NetworkConfiguration netwo networkConfig.setOpType(Common.OperationType.CREATE); IRestRequest createNetworkConfigRequest = new CreateNetworkConfigRequest(context, networkConfig); - context.getRequestManager().sendRequestAsync(createNetworkConfigRequest, request -> portService.updatePortStatus(request,networkConfig,null)); - portService.updatePortStatus(createNetworkConfigRequest,networkConfig, StatusEnum.CREATED.getStatus()); + context.getRequestManager().sendRequestAsync(createNetworkConfigRequest, request -> portService.updatePortStatus(request, networkConfig, null)); + portService.updatePortStatus(createNetworkConfigRequest, networkConfig, StatusEnum.CREATED.getStatus()); } } @@ -278,14 +313,15 @@ private void updateNetworkConfig(PortContext context, NetworkConfiguration netwo networkConfig.setOpType(Common.OperationType.UPDATE); IRestRequest updateNetworkConfigRequest = new UpdateNetworkConfigRequest(context, networkConfig); - context.getRequestManager().sendRequestAsync(updateNetworkConfigRequest, request -> portService.updatePortStatus(request,networkConfig,null)); - portService.updatePortStatus(updateNetworkConfigRequest,networkConfig, StatusEnum.PENDING.getStatus()); + context.getRequestManager().sendRequestAsync(updateNetworkConfigRequest, request -> portService.updatePortStatus(request, networkConfig, null)); + portService.updatePortStatus(updateNetworkConfigRequest, networkConfig, StatusEnum.PENDING.getStatus()); } } private void deleteNetworkConfig(PortContext context, NetworkConfiguration networkConfig) { if (networkConfig != null) { networkConfig.setOpType(Common.OperationType.DELETE); + markOperationTypes(networkConfig, Common.OperationType.DELETE); IRestRequest deleteNetworkConfigRequest = new DeleteNetworkConfigRequest(context, networkConfig); context.getRequestManager().sendRequestAsync(deleteNetworkConfigRequest, null); diff --git a/services/port_manager/src/main/java/com/futurewei/alcor/portmanager/processor/PortContext.java b/services/port_manager/src/main/java/com/futurewei/alcor/portmanager/processor/PortContext.java index 9270207f2..1386252ec 100644 --- a/services/port_manager/src/main/java/com/futurewei/alcor/portmanager/processor/PortContext.java +++ b/services/port_manager/src/main/java/com/futurewei/alcor/portmanager/processor/PortContext.java @@ -175,6 +175,14 @@ public InternalRouterInfo getRouterByVpcOrSubnetId(String vpcOrSubnetId) { return (this.routers != null) ? this.routers.get(vpcOrSubnetId) : null; } + public boolean containRouters() { + if (this.routers == null || this.routers.isEmpty()) { + return false; + } + + return true; + } + public void setRouters(Map routers) { this.routers = routers; } diff --git a/web/src/main/java/com/futurewei/alcor/web/entity/dataplane/ResourceOperation.java b/web/src/main/java/com/futurewei/alcor/web/entity/dataplane/ResourceOperation.java index c15d8716b..ce7c90a23 100644 --- a/web/src/main/java/com/futurewei/alcor/web/entity/dataplane/ResourceOperation.java +++ b/web/src/main/java/com/futurewei/alcor/web/entity/dataplane/ResourceOperation.java @@ -31,6 +31,11 @@ public class ResourceOperation { public ResourceOperation() { } + public ResourceOperation(ResourceType rsType, OperationType opType) { + this.rsType = rsType; + this.opType = opType; + } + public ResourceType getRsType() { return this.rsType; } @@ -43,12 +48,7 @@ public OperationType getOpType() { return this.opType; } - public void setHostId(OperationType opType) { - this.opType = opType; - } - - public ResourceOperation(ResourceType rsType, OperationType opType) { - this.rsType = rsType; + public void setOpType(OperationType opType) { this.opType = opType; } }