public bool AddStorageProvider(Guid nodeId, string nodeName, AzureBlobConfig azureBlobConfig, StorageProviderVisibility visibility) { if (string.IsNullOrWhiteSpace(nodeName)) { throw new ArgumentException("The node name is empty", nameof(nodeName)); } if (azureBlobConfig == null) { throw new ArgumentNullException(nameof(azureBlobConfig)); } lock (StorageProviderInstances) { if (StorageProviderInstances.Any(x => nodeId.Equals(x.RuntimeId) || string.Equals(x.ProviderInfo.Name, nodeName, StringComparison.InvariantCultureIgnoreCase))) { return(false); } var instance = new StorageProviderInstance_AzureBlob(new StorageProviderInfo { Id = nodeId, Type = StorageProviderInstance.TypeAzure, Name = nodeName, Visibility = visibility, Settings = JsonConvert.SerializeObject(azureBlobConfig) }); StorageProviderInstances.Add(instance); ResyncClientListToStorageProviderInstances(); return(true); } }
private void ResyncClientListToStorageProviderInstances() { List <Guid> skips = new List <Guid>(); List <string> removes = new List <string>(); foreach (var client in RootFS.ClientList) { if (client.Value is AliyunOSSFileSystemClient aliyunOssInstance) { if (StorageProviderInstances.Any(x => x.RuntimeId == aliyunOssInstance.RuntimeId)) { skips.Add(aliyunOssInstance.RuntimeId); } else { removes.Add(client.Key); } } else if (client.Value is AzureBlobFileSystemClient azureBlobInstance) { if (StorageProviderInstances.Any(x => x.RuntimeId == azureBlobInstance.RuntimeId)) { skips.Add(azureBlobInstance.RuntimeId); } else { removes.Add(client.Key); } } } foreach (var item in removes) { RootFS.ClientList.TryRemove(item, out _); } foreach (var item in StorageProviderInstances) { if (skips.Contains(item.RuntimeId)) { continue; } if (item.ProviderInfo.Type == StorageProviderInstance.TypeAliYun && item is StorageProviderInstance_AliyunOSS aliyunOssInstance) { InsertRootFS(item.ProviderInfo.Name, new AliyunOSSFileSystemClient(item.RuntimeId, aliyunOssInstance.OssConfig)); } else if (item.ProviderInfo.Type == StorageProviderInstance.TypeAzure && item is StorageProviderInstance_AzureBlob azureBlobInstance) { InsertRootFS(item.ProviderInfo.Name, new AzureBlobFileSystemClient(item.RuntimeId, azureBlobInstance.AzureBlobConfig)); } } }
public bool RemoveStorageProvider(string nodeName) { if (string.IsNullOrWhiteSpace(nodeName)) { throw new ArgumentException("The node name is empty", nameof(nodeName)); } lock (StorageProviderInstances) { var item = StorageProviderInstances .Where(x => string.Equals(x.ProviderInfo.Name, nodeName, StringComparison.InvariantCultureIgnoreCase)) .FirstOrDefault(); if (item != null) { StorageProviderInstances.Remove(item); ResyncClientListToStorageProviderInstances(); return(true); } return(false); } }
internal async Task OnNodeUpdate(NodeInfo ninfo, List <SSDPPCInfo> ssdpinfo) { bool updated = false; bool deleted = false; lock (CachedNodes) { var ssdpin = ssdpinfo.FirstOrDefault(x => x.Id == Id); if (ssdpin != null) { var name = DecryptName(ssdpin.EN); if (name == null) { logger.LogError($"Invalid node from {ninfo.Url}"); return; } NodeInfoForPC info = CachedNodes.FirstOrDefault(x => x.NodeGuid == ninfo.NodeGuid); if (info != null) { if (info.PCTimeStamp < ssdpin.TimeStamp) { CachedNodes.Remove(info); } else { return; } } var newinf = new NodeInfoForPC { NodeGuid = ninfo.NodeGuid, PCVersion = ninfo.PCVersion, PCTimeStamp = ssdpin.TimeStamp, Url = ninfo.Url, Name = name }; CachedNodes.Add(newinf); OnCachedNodesChange(); updated = true; } else { int nremoved = 0; if (CachedNodes.FirstOrDefault(x => x.NodeGuid == ninfo.NodeGuid) != null) { nremoved = CachedNodes.RemoveAll(x => x.NodeGuid == ninfo.NodeGuid); } if (nremoved > 0) { OnCachedNodesChange(); deleted = true; } } } if (updated || deleted) { if (!deleted) { var pci = await GetPeerPCInfo(this, ninfo).ConfigureAwait(false); if ((pci != null) && (pci.StorageProviders != null)) { bool needResync = false; foreach (var sp in pci.StorageProviders) { if (sp.Visibility != StorageProviderVisibility.Public) { continue; } if (sp.Type == StorageProviderInstance.TypeAliYun) { lock (StorageProviderInstances) { if (!StorageProviderInstances.Any(x => sp.Id.Equals(x.RuntimeId))) { var instance = new StorageProviderInstance_AliyunOSS(new StorageProviderInfo { Id = sp.Id, Type = StorageProviderInstance.TypeAliYun, Name = sp.Name, Visibility = sp.Visibility, Settings = sp.Settings }); StorageProviderInstances.Add(instance); needResync = true; } } } if (sp.Type == StorageProviderInstance.TypeAzure) { lock (StorageProviderInstances) { if (!StorageProviderInstances.Any(x => sp.Id.Equals(x.RuntimeId))) { var instance = new StorageProviderInstance_AzureBlob(new StorageProviderInfo { Id = sp.Id, Type = StorageProviderInstance.TypeAzure, Name = sp.Name, Visibility = sp.Visibility, Settings = sp.Settings }); StorageProviderInstances.Add(instance); needResync = true; } } } } if (needResync) { ResyncClientListToStorageProviderInstances(); } } if ((pci != null) && (pci.Apps != null)) { foreach (var ai in pci.Apps) { NodeInfoForPC n = null; lock (CachedNodes) { n = CachedNodes.FirstOrDefault(x => x.NodeGuid == ai.NodeId); } if (n == null) { return; } var a = Apps.FirstOrDefault(x => (x.NodeId == ai.NodeId) && (x.AppId == ai.AppId) && (x.Name == ai.Name)); if (a == null) { lock (Apps) { Apps.Add(ai); } } } } } _ = Task.Run(() => { try { OnNodeChangedEvent?.Invoke(this, EventArgs.Empty); } catch { } }); } }