From 859f4e4a8efc92072e24be24aabbf8f3e8fa38f3 Mon Sep 17 00:00:00 2001 From: AzureAhai Date: Thu, 2 Jan 2025 14:57:28 -0800 Subject: [PATCH 1/2] fix: fixing HNS network already exist error in Stateless CNI --- network/network_windows.go | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/network/network_windows.go b/network/network_windows.go index a467b20983..ed5878f418 100644 --- a/network/network_windows.go +++ b/network/network_windows.go @@ -360,10 +360,20 @@ func (nm *networkManager) newNetworkImplHnsV2(nwInfo *EndpointInfo, extIf *exter if errors.As(err, &hcn.NetworkNotFoundError{}) { logger.Info("Creating hcn network", zap.Any("hcnNetwork", hcnNetwork)) hnsResponse, err = Hnsv2.CreateNetwork(hcnNetwork) - if err != nil { - return nil, fmt.Errorf("Failed to create hcn network: %s due to error: %v", hcnNetwork.Name, err) + if err == nil { + logger.Info("Successfully created hcn network with response", zap.Any("hnsResponse", hnsResponse)) + } else { + if strings.Contains(err.Error(), "already exists") { + // fetch the network name again since the parallel CNI Add call has created the HNS network + hnsResponse, err = Hnsv2.GetNetworkByName(hcnNetwork.Name) + if err != nil { + return nil, fmt.Errorf("Failed to get hcn network: %s due to error: %v", hcnNetwork.Name, err) + } + logger.Info("Successfully fetched hcn network with response", zap.Any("hnsResponse", hnsResponse)) + } else { + return nil, fmt.Errorf("Failed to create hcn network: %s due to error: %v", hcnNetwork.Name, err) + } } - logger.Info("Successfully created hcn network with response", zap.Any("hnsResponse", hnsResponse)) } else { // we can't validate if the network already exists, don't continue return nil, fmt.Errorf("Failed to create hcn network: %s, failed to query for existing network with error: %v", hcnNetwork.Name, err) From db1732bbfbfc75c286afd67d547c7e7944fa2bac Mon Sep 17 00:00:00 2001 From: AzureAhai Date: Fri, 3 Jan 2025 13:23:00 -0800 Subject: [PATCH 2/2] fix: addressing the comments --- network/network_windows.go | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/network/network_windows.go b/network/network_windows.go index ed5878f418..8c2ab87669 100644 --- a/network/network_windows.go +++ b/network/network_windows.go @@ -21,6 +21,11 @@ import ( "go.uber.org/zap" ) +var ( + errHcnNetworkCreate = errors.New("failed to create hcn network") + errHcnNetworkGet = errors.New("failed to get hcn network") +) + const ( // HNS network types. hnsL2bridge = "l2bridge" @@ -365,18 +370,19 @@ func (nm *networkManager) newNetworkImplHnsV2(nwInfo *EndpointInfo, extIf *exter } else { if strings.Contains(err.Error(), "already exists") { // fetch the network name again since the parallel CNI Add call has created the HNS network + logger.Error("Failed to create hcn network.due to error:", zap.String("HNS Network Name", hcnNetwork.Name), zap.String("hnsResponse", err.Error())) hnsResponse, err = Hnsv2.GetNetworkByName(hcnNetwork.Name) if err != nil { - return nil, fmt.Errorf("Failed to get hcn network: %s due to error: %v", hcnNetwork.Name, err) + return nil, fmt.Errorf("%w: %s due to error %s", errHcnNetworkGet, hcnNetwork.Name, err.Error()) } - logger.Info("Successfully fetched hcn network with response", zap.Any("hnsResponse", hnsResponse)) + logger.Info("Successfully fetched hcn network with response", zap.Any("HNS Network ID", hnsResponse.Id), zap.String("HNS Network Name", hnsResponse.Name)) } else { - return nil, fmt.Errorf("Failed to create hcn network: %s due to error: %v", hcnNetwork.Name, err) + return nil, fmt.Errorf("%w: %s due to error %s", errHcnNetworkCreate, hcnNetwork.Name, err.Error()) } } } else { // we can't validate if the network already exists, don't continue - return nil, fmt.Errorf("Failed to create hcn network: %s, failed to query for existing network with error: %v", hcnNetwork.Name, err) + return nil, fmt.Errorf("%w: %s due to error %s", errHcnNetworkCreate, hcnNetwork.Name, err.Error()) } } else { if hcnNetwork.Type == hcn.Transparent {