public static async Task <RtuMap> LoadFromConnectionStringAsync(string container, string filename, string connectionString) { RtuMap rmap = null; CloudStorageAccount acct = CloudStorageAccount.Parse(connectionString); CloudBlobClient client = acct.CreateCloudBlobClient(); CloudBlobContainer containerRef = client.GetContainerReference(container); await containerRef.CreateIfNotExistsAsync(); CloudBlockBlob blobRef = containerRef.GetBlockBlobReference(filename); if (await blobRef.ExistsAsync()) { using (MemoryStream stream = new MemoryStream()) { await blobRef.DownloadToStreamAsync(stream); string jsonString = Encoding.UTF8.GetString(stream.ToArray()); rmap = JsonConvert.DeserializeObject <RtuMap>(jsonString); } return(rmap); } else { return(null); } }
private static async Task <EdgeGatewayConfiguration> ProvisionAsync(string luss) { LussEntity entity = await LussEntity.LoadAsync(luss, config.LussStorageTableName, config.StorageConnectionString); if (entity == null || entity.Success.HasValue || entity.Expires < DateTime.Now) { return(null); } //get the security token to call Piraeus mgmt api IEnumerable <Claim> claims = GetClaims(entity); string accessToken = GetPiraeusAccessToken(); //create the CAPL policies string publishPolicyId = null; string subscribePolicyId = null; AuthorizationPolicy pubPolicy = CreateCaplPolicy(entity, true, out publishPolicyId); AuthorizationPolicy subPolicy = CreateCaplPolicy(entity, false, out subscribePolicyId); //add the CAPL policies to Piraeus AddCaplPolicy(pubPolicy, accessToken); AddCaplPolicy(subPolicy, accessToken); //create the pi-system metadata string inputUriString = GetEventUriString(entity, true); string outputUriString = GetEventUriString(entity, false); EventMetadata inputMetadata = GetEventMetadata(inputUriString, publishPolicyId, subscribePolicyId, (ushort)entity.UnitId, true); EventMetadata outputMetadata = GetEventMetadata(outputUriString, subscribePolicyId, publishPolicyId, (ushort)entity.UnitId, false); //add the pi-systems to Piraeus AddEventMetadata(inputMetadata, accessToken); AddEventMetadata(outputMetadata, accessToken); //update the RTU Map RtuMap map = RtuMap.LoadFromConnectionStringAsync(config.RtuMapStorageContainerName, config.RtuMapFilename, config.StorageConnectionString).GetAwaiter().GetResult(); if (map == null) { map = new RtuMap(); } else { if (map.HasItem((ushort)entity.UnitId)) { map.Remove((ushort)entity.UnitId); } } map.Add((ushort)entity.UnitId, inputUriString, outputUriString); map.UpdateMapAsync(config.RtuMapStorageContainerName, config.RtuMapFilename, config.StorageConnectionString).GetAwaiter(); //update the LUSS entity entity.Access = DateTime.UtcNow; if (!entity.Success.HasValue) { entity.Success = true; } await entity.UpdateAsync(); string edgeSecurityToken = GetEdgeSecurityToken(entity); //create the cofiguration to return EdgeGatewayConfiguration edgeConfig = new EdgeGatewayConfiguration() { Hostname = entity.Hostname, ModBusContainer = entity.ModbusContainer, ModBusPort = entity.ModbusPort, ModBusPath = entity.ModbusPath, RtuInputPiSystem = inputUriString, RtuOutputPiSsytem = outputUriString, SecurityToken = edgeSecurityToken, UnitId = entity.UnitId }; return(edgeConfig); }