// DeleteEndpointGroup handles endpoint group deletes func DeleteEndpointGroup(tenantName, groupName string) error { // Get the state driver stateDriver, err := utils.GetStateDriver() if err != nil { return err } epgKey := mastercfg.GetEndpointGroupKey(groupName, tenantName) epgCfg := &mastercfg.EndpointGroupState{} epgCfg.StateDriver = stateDriver err = epgCfg.Read(epgKey) if err != nil { log.Errorf("error reading EPG key %s. Error: %s", epgKey, err) return err } if epgCfg.EpCount != 0 { return core.Errorf("Error: EPG %s has active endpoints", groupName) } // Delete the endpoint group state gstate.GlobalMutex.Lock() defer gstate.GlobalMutex.Unlock() gCfg := gstate.Cfg{} gCfg.StateDriver = stateDriver err = gCfg.Read(epgCfg.TenantName) if err != nil { log.Errorf("error reading tenant cfg state. Error: %s", err) return err } // if aci mode we allocate per-epg vlan. free it here. aciMode, aErr := IsAciConfigured() if aErr != nil { return aErr } if aciMode { if epgCfg.PktTagType == "vlan" { err = gCfg.FreeVLAN(uint(epgCfg.PktTag)) if err != nil { return err } log.Debugf("Freed vlan %v\n", epgCfg.PktTag) } } // Delete endpoint group err = epgCfg.Clear() if err != nil { log.Errorf("error writing epGroup config. Error: %v", err) return err } if GetClusterMode() == "docker" { return docknet.DeleteDockNet(epgCfg.TenantName, epgCfg.NetworkName, epgCfg.GroupName) } return nil }
// DeleteEndpointGroup handles endpoint group deletes func DeleteEndpointGroup(epgID int) error { // Get the state driver stateDriver, err := utils.GetStateDriver() if err != nil { return err } epgCfg := &mastercfg.EndpointGroupState{} epgCfg.StateDriver = stateDriver err = epgCfg.Read(strconv.Itoa(epgID)) if err != nil { log.Errorf("EpGroup %v is not configured", epgID) return err } gCfg := gstate.Cfg{} gCfg.StateDriver = stateDriver err = gCfg.Read(epgCfg.Tenant) if err != nil { log.Errorf("error reading tenant cfg state. Error: %s", err) return err } // if aci mode we allocate per-epg vlan. free it here. aciMode, aErr := IsAciConfigured() if aErr != nil { return aErr } if aciMode { if epgCfg.PktTagType == "vlan" { err = gCfg.FreeVLAN(uint(epgCfg.PktTag)) if err != nil { return err } log.Debugf("Freed vlan %v\n", epgCfg.PktTag) } } // Delete endpoint group err = epgCfg.Clear() if err != nil { log.Errorf("error writing epGroup config. Error: %v", err) return err } return docknet.DeleteDockNet(epgCfg.Tenant, epgCfg.NetworkName, epgCfg.Name) }
// DeleteNetworkID removes a network by ID. func DeleteNetworkID(stateDriver core.StateDriver, netID string) error { nwCfg := &mastercfg.CfgNetworkState{} nwCfg.StateDriver = stateDriver err := nwCfg.Read(netID) if err != nil { log.Errorf("network %s is not operational", netID) return err } aci, _ := IsAciConfigured() if aci { // Skip docker network deletion for ACI fabric mode. return nil } if nwCfg.NwType != "infra" { // For Infra nw, endpoint delete initiated by netplugin // Check if there are any active endpoints if hasActiveEndpoints(nwCfg) { return core.Errorf("Error: Network has active endpoints") } if IsDNSEnabled() { // detach Dns container err = detachServiceContainer(nwCfg.Tenant, nwCfg.NetworkName) if err != nil { log.Errorf("Error detaching service container. Err: %v", err) } } if GetClusterMode() == "docker" { // Delete the docker network err = docknet.DeleteDockNet(nwCfg.Tenant, nwCfg.NetworkName, "") if err != nil { log.Errorf("Error deleting network %s. Err: %v", netID, err) // DeleteDockNet will fail when network has active endpoints. // No damage is done yet. It is safe to fail. // We do not have to call attachServiceContainer here, // as detachServiceContainer detaches only when there are no // endpoints remaining. return err } } } gCfg := &gstate.Cfg{} gCfg.StateDriver = stateDriver err = gCfg.Read("") if err != nil { log.Errorf("error reading tenant info for %q. Error: %s", nwCfg.Tenant, err) return err } // Free resource associated with the network err = freeNetworkResources(stateDriver, nwCfg, gCfg) if err != nil { // Error while freeing up vlan/vxlan/subnet/gateway resources // This can only happen because of defects in code // No need of any corrective handling here return err } err = nwCfg.Clear() if err != nil { log.Errorf("error writing nw config. Error: %s", err) return err } return err }