Procházet zdrojové kódy

option to force destroy network

abhishek9686 před 7 měsíci
rodič
revize
307208690e
2 změnil soubory, kde provedl 45 přidání a 21 odebrání
  1. 2 2
      controllers/network.go
  2. 43 19
      logic/networks.go

+ 2 - 2
controllers/network.go

@@ -441,10 +441,10 @@ func getNetworkACL(w http.ResponseWriter, r *http.Request) {
 func deleteNetwork(w http.ResponseWriter, r *http.Request) {
 	// Set header
 	w.Header().Set("Content-Type", "application/json")
-
+	force := r.URL.Query().Get("force") == "true"
 	var params = mux.Vars(r)
 	network := params["networkname"]
-	err := logic.DeleteNetwork(network)
+	err := logic.DeleteNetwork(network, force)
 	if err != nil {
 		errtype := "badrequest"
 		if strings.Contains(err.Error(), "Node check failed") {

+ 43 - 19
logic/networks.go

@@ -102,8 +102,12 @@ func RemoveIpFromAllocatedIpMap(networkName string, ip string) {
 // AddNetworkToAllocatedIpMap - add network to allocated ip map when network is added
 func AddNetworkToAllocatedIpMap(networkName string) {
 	networkCacheMutex.Lock()
+	defer networkCacheMutex.Unlock()
+	if _, ok := allocatedIpMap[networkName]; !ok {
+		return
+	}
 	allocatedIpMap[networkName] = map[string]net.IP{}
-	networkCacheMutex.Unlock()
+
 }
 
 // RemoveNetworkFromAllocatedIpMap - remove network from allocated ip map when network is deleted
@@ -171,12 +175,43 @@ func GetNetworks() ([]models.Network, error) {
 }
 
 // DeleteNetwork - deletes a network
-func DeleteNetwork(network string) error {
-	// remove ACL for network
-	err := nodeacls.DeleteACLContainer(nodeacls.NetworkID(network))
-	if err != nil {
-		logger.Log(1, "failed to remove the node acls during network delete for network,", network)
+func DeleteNetwork(network string, force bool) error {
+	if !force {
+		nodeCount, err := GetNetworkNonServerNodeCount(network)
+		if nodeCount == 0 || database.IsEmptyRecord(err) {
+			// delete server nodes first then db records
+			err = database.DeleteRecord(database.NETWORKS_TABLE_NAME, network)
+			if err != nil {
+				return err
+			}
+			if servercfg.CacheEnabled() {
+				deleteNetworkFromCache(network)
+			}
+			return nil
+		} else {
+			return errors.New("node check failed. All nodes must be deleted before deleting network")
+		}
 	}
+	// Remove All Nodes
+	go func() {
+		nodes, err := GetNetworkNodes(network)
+		if err == nil {
+			for _, node := range nodes {
+				node := node
+				host, err := GetHost(node.HostID.String())
+				if err != nil {
+					continue
+				}
+				DissasociateNodeFromHost(&node, host)
+			}
+		}
+		// remove ACL for network
+		err = nodeacls.DeleteACLContainer(nodeacls.NetworkID(network))
+		if err != nil {
+			logger.Log(1, "failed to remove the node acls during network delete for network,", network)
+		}
+	}()
+
 	// Delete default network enrollment key
 	keys, _ := GetAllEnrollmentKeys()
 	for _, key := range keys {
@@ -188,19 +223,8 @@ func DeleteNetwork(network string) error {
 
 		}
 	}
-	nodeCount, err := GetNetworkNonServerNodeCount(network)
-	if nodeCount == 0 || database.IsEmptyRecord(err) {
-		// delete server nodes first then db records
-		err = database.DeleteRecord(database.NETWORKS_TABLE_NAME, network)
-		if err != nil {
-			return err
-		}
-		if servercfg.CacheEnabled() {
-			deleteNetworkFromCache(network)
-		}
-		return nil
-	}
-	return errors.New("node check failed. All nodes must be deleted before deleting network")
+
+	return nil
 }
 
 // CreateNetwork - creates a network in database