public override async Task <ActionResponse> ExecuteActionAsync(ActionRequest request) { var azureToken = request.DataStore.GetJson("AzureToken", "access_token"); string environmentId = request.DataStore.GetValue("PowerAppEnvironment"); string sqlConnectionId = request.DataStore.GetValue("PowerAppSqlConnectionId"); try { if (environmentId != null && sqlConnectionId != null) { ActionResponse wrangledFile = await RequestUtility.CallAction(request, "Microsoft-WranglePowerApp"); if (wrangledFile.IsSuccess && wrangledFile.Body != null) { string path = wrangledFile.Body.ToString(); AzureHttpClient ahc = new AzureHttpClient(azureToken); PowerAppResourceStorage resourceStorage = await ahc.Request <PowerAppResourceStorage>(HttpMethod.Post, string.Format(PowerAppUtility.URL_POWERAPPS_GENERATE_RESOURCE_STORAGE, JsonUtility.GetWebToken(azureToken, "oid")), JsonUtility.Serialize <PowerAppEnvironmentWrapper>(new PowerAppEnvironmentWrapper(environmentId))); if (!string.IsNullOrEmpty(path) && resourceStorage != null && !string.IsNullOrEmpty(resourceStorage.SharedAccessSignature)) { string uri = resourceStorage.SharedAccessSignature.Replace("?", "/document.msapp?"); CloudBlockBlob blob = new CloudBlockBlob(new Uri(uri)); using (WebClient wc = new WebClient()) { byte[] file = wc.DownloadData(path); await blob.UploadFromStreamAsync(new MemoryStream(file)); PowerAppMetadata metadata = await ahc.Request <PowerAppMetadata>(HttpMethod.Post, PowerAppUtility.URL_POWERAPPS_PUBLISH_APP, JsonUtility.Serialize <PowerAppPublish>(new PowerAppPublish(uri, $"TwitterTemplate{RandomGenerator.GetDateStamp()}", environmentId, sqlConnectionId))); if (metadata != null) { if (await ahc.IsSuccess(HttpMethod.Post, string.Format(PowerAppUtility.URL_POWERAPPS_SQL_CONNECTION_UPDATE, sqlConnectionId, environmentId), JsonUtility.Serialize <PowerAppSqlConnectionUpdate>(new PowerAppSqlConnectionUpdate(metadata.Name)))) { if (await ahc.IsSuccess(HttpMethod.Post, string.Format(PowerAppUtility.URL_POWERAPPS_RECORD_SCOPES_CONSENT, metadata.Name), JsonUtility.Serialize <PowerAppConsents>(new PowerAppConsents(sqlConnectionId)))) { request.DataStore.AddToDataStore("PowerAppUri", string.Format(PowerAppUtility.URL_POWERAPPS_WEB, metadata.Name)); } } } } } } } } catch { PowerAppUtility.SkipPowerApp(request.DataStore); } return(new ActionResponse(ActionStatus.Success)); }
public override async Task <ActionResponse> ExecuteActionAsync(ActionRequest request) { AzureHttpClient ahc = new AzureHttpClient(request.DataStore.GetJson("PBIToken", "access_token")); string pbiClusterUri = request.DataStore.GetValue("PBIClusterUri"); string pbiWorkspaceId = request.DataStore.GetValue("PBIWorkspaceId"); string pbixLocation = request.DataStore.GetValue("PBIXLocation"); pbiWorkspaceId = string.IsNullOrEmpty(pbiWorkspaceId) ? string.Empty : "groups/" + pbiWorkspaceId + "/"; byte[] file = null; using (WebClient wc = new WebClient()) { file = wc.DownloadData(pbixLocation); } string filename = request.Info.AppName + RandomGenerator.GetDateStamp() + ".pbix"; PBIImport pbiImport = JsonUtility.Deserialize <PBIImport>(await ahc.Request(pbiClusterUri + string.Format(PBI_IMPORT_URI, pbiWorkspaceId, filename), file, filename)); PBIImportStatus pbiImportStatus = null; int attempts = 0; bool isImportInProgress = true; while (isImportInProgress && attempts < MAXIMUM_IMPORT_STATUS_ATTEMPTS) { pbiImportStatus = await ahc.Request <PBIImportStatus>(HttpMethod.Get, pbiClusterUri + string.Format(PBI_IMPORT_STATUS_URI, pbiWorkspaceId, pbiImport.Id)); switch (pbiImportStatus.ImportState) { case "Publishing": Thread.Sleep(new TimeSpan(0, 0, WAIT_IMPORT_STATUS)); break; case "Succeeded": isImportInProgress = false; break; default: isImportInProgress = false; break; } attempts++; } string reportUrl = pbiImportStatus == null || pbiImportStatus.Reports == null || pbiImportStatus.Reports.Count == 0 ? string.Empty : pbiImportStatus.Reports[0].WebUrl; string pbixDatasetId = pbiImportStatus == null || pbiImportStatus.Datasets == null || pbiImportStatus.Datasets.Count == 0 ? string.Empty : pbiImportStatus.Datasets[0].Id; request.DataStore.AddToDataStore("PBIXDatasetId", pbixDatasetId, DataStoreType.Public); return(new ActionResponse(ActionStatus.Success, reportUrl)); }
public override async Task <ActionResponse> ExecuteActionAsync(ActionRequest request) { AzureHttpClient client = new AzureHttpClient(request.DataStore.GetJson("PBIToken", "access_token")); PBIWorkspaces pbiWorkspaces = await client.Request <PBIWorkspaces>(HttpMethod.Get, request.DataStore.GetValue("PBIClusterUri") + PBI_ENDPOINT_GROUPS); return(new ActionResponse(ActionStatus.Success, JsonUtility.Serialize <List <PBIWorkspace> >(pbiWorkspaces.Workspaces))); }
public override async Task <ActionResponse> ExecuteActionAsync(ActionRequest request) { AzureHttpClient client = new AzureHttpClient(request.DataStore.GetJson("PBIToken", "access_token")); PBIClusterUri pbiClusterUri = await client.Request <PBIClusterUri>(HttpMethod.Put, PBI_CLUSTER_URIS_URL); request.DataStore.AddToDataStore("PBIClusterUri", pbiClusterUri.FixedClusterUri); return(new ActionResponse(ActionStatus.Success)); }
public override async Task <ActionResponse> ExecuteActionAsync(ActionRequest request) { var azureToken = request.DataStore.GetJson("AzureToken", "access_token"); AzureHttpClient client = new AzureHttpClient(azureToken); string applicationId = GetNewPowerAppGuid(); string applicationName = "TwitterTemplate" + RandomGenerator.GetDateStamp(); string environmentId = request.DataStore.GetValue("PowerAppEnvironment"); string objectId = JsonUtility.GetWebToken(azureToken, "oid"); string sqlConnectionId = request.DataStore.GetValue("PowerAppSqlConnectionId"); JObject resourceStorage = JsonUtility.GetJsonObjectFromJsonString(await client.Request(HttpMethod.Post, $"{BASE_POWER_APPS_URL}/objectIds/{objectId}/generateResourceStorage?api-version=2016-11-01", $"{{\"environment\":{{\"id\":\"/providers/Microsoft.PowerApps/environments/{environmentId}\",\"name\":\"{environmentId}\"}}}}}}")); string sharedAccessSignature = JsonUtility.GetJObjectProperty(resourceStorage, "sharedAccessSignature"); string backgroundImageUri = sharedAccessSignature.Replace("?", "/logoSmallFile?"); string documentUri = sharedAccessSignature.Replace("?", "/document.msapp?"); JObject initiateDocumentServerSession = JsonUtility.GetJsonObjectFromJsonString(await client.Request(HttpMethod.Post, $"{BASE_POWER_APPS_URL}/objectIds/{objectId}/initiateDocumentServerSession?api-version=2016-11-01", string.Empty)); AzureHttpClient clientPA = new AzureHttpClient(azureToken, new Dictionary <string, string>() { { "AuthoringSessionToken", JsonUtility.GetJObjectProperty(initiateDocumentServerSession, "sessionToken") } }); await clientPA.ExecuteGenericRequestWithHeaderAsync(HttpMethod.Post, $"{CREATE_POWER_APPS_URL}/authoringsession/newinstance?requestedLocation=unitedstates", string.Empty); await clientPA.ExecuteGenericRequestWithHeaderAsync(HttpMethod.Get, $"{CREATE_POWER_APPS_URL}/document/util/createdocumentandloadcontext?apptype=0&locale=en-US", string.Empty); await clientPA.ExecuteGenericRequestWithHeaderAsync(HttpMethod.Get, $"{CREATE_POWER_APPS_URL}/document/2/getpublishinfo", string.Empty); await clientPA.ExecuteGenericRequestWithHeaderAsync(HttpMethod.Post, $"{CREATE_POWER_APPS_URL}/document/2/setpublishinfo", $"{{\"applicationName\":\"{applicationName}\",\"backgroundColorString\":\"RGBA(0,176,240,1)\",\"logoFile\":{{\"_path\":\"default_icon.png\"}},\"logoFileName\":\"default_icon.png\",\"publishDataLocally\":false,\"publishResourcesLocally\":false,\"publishTarget\":null}}"); await clientPA.ExecuteGenericRequestWithHeaderAsync(HttpMethod.Post, $"{CREATE_POWER_APPS_URL}/document/2/publishtoblobasync", $"{{\"blobURI\":\"{sharedAccessSignature}\",\"docName\":\"{applicationName}\",\"documentSienaUri\":\"/document.msapp\",\"logoSmallUri\":\"/logoSmallFile\"}}"); await clientPA.ExecuteGenericRequestWithHeaderAsync(HttpMethod.Post, $"{BASE_POWER_APPS_URL}/apps?api-version=2016-11-01", $"{{\"properties\":{{\"appUris\":{{\"documentUri\":{{\"value\":\"{documentUri}\"}}}},\"description\":\"\",\"backgroundColor\":\"RGBA(0,176,240,1)\",\"minClientVersion\":{{\"major\":2,\"minor\":0,\"build\":610,\"majorRevision\":0,\"minorRevision\":0,\"revision\":0}},\"createdByClientVersion\":{{\"major\":2,\"minor\":0,\"build\":610,\"majorRevision\":0,\"minorRevision\":0,\"revision\":0}},\"backgroundImageUri\":\"{backgroundImageUri}\",\"displayName\":\"{applicationName}\",\"environment\":{{\"id\":\"/providers/Microsoft.PowerApps/environments/{environmentId}\",\"name\":\"{environmentId}\"}}}},\"tags\":{{\"sienaVersion\":\"{GetNewPowerAppGuid()}\",\"deviceCapabilities\":\"\",\"supportsPortrait\":\"false\",\"supportsLandscape\":\"true\",\"primaryFormFactor\":\"Tablet\",\"primaryDeviceWidth\":\"1366\",\"primaryDeviceHeight\":\"768\",\"publisherVersion\":\"2.0.610\",\"minimumRequiredApiVersion\":\"2.1.0\"}},\"name\":\"{applicationId}\"}}"); return(new ActionResponse(ActionStatus.Success)); }
public override async Task <ActionResponse> ExecuteActionAsync(ActionRequest request) { BpstAzure ba = new BpstAzure(request.DataStore); AzureHttpClient ahc = new AzureHttpClient(ba.TokenAzure); string nameNamespace = request.DataStore.GetValue("nameNamespace"); string url = $"https://management.azure.com/subscriptions/{ba.IdSubscription}/resourceGroups/{ba.NameResourceGroup}/providers/Microsoft.EventHub/namespaces/{nameNamespace}/AuthorizationRules/RootManageSharedAccessKey/listkeys?api-version=2014-09-01"; EventHubKeys eventHubKeys = await ahc.Request <EventHubKeys>(HttpMethod.Post, url); if (eventHubKeys != null) { request.DataStore.AddToDataStore("EventHubPrimaryConnectionString", eventHubKeys.PrimaryConnectionString, DataStoreType.Private); request.DataStore.AddToDataStore("EventHubPrimaryKey", eventHubKeys.PrimaryKey, DataStoreType.Private); } return(eventHubKeys == null ? new ActionResponse(ActionStatus.Failure, new ActionResponseExceptionDetail("EventHubFailedToQueryKeys")) : new ActionResponse(ActionStatus.Success)); }
private async Task <bool> IsReady(AzureHttpClient client, string sitename) { bool isReady = false; for (int i = 0; i < ATTEMPTS && !isReady; i++) { FunctionStatusWrapper statusWrapper = await client.RequestAzure <FunctionStatusWrapper>(HttpMethod.Get, $"/providers/Microsoft.Web/sites/{sitename}/deployments", "2016-08-01"); if (statusWrapper != null && !statusWrapper.Value.IsNullOrEmpty()) { bool hasFinishedDeployment = true; for (int j = 0; j < statusWrapper.Value.Count && hasFinishedDeployment; j++) { FunctionStatus status = statusWrapper.Value[j]; hasFinishedDeployment = status != null && status.Properties != null && !string.IsNullOrEmpty(status.Properties.LogUrl); if (hasFinishedDeployment) { List <FunctionStatusLog> logs = await client.Request <List <FunctionStatusLog> >(HttpMethod.Get, status.Properties.LogUrl); hasFinishedDeployment = !logs.IsNullOrEmpty(); if (hasFinishedDeployment) { bool isDeployed = false; for (int k = 0; k < logs.Count && !isDeployed; k++) { isDeployed = logs[k].Message.Contains(SUCCESS); } hasFinishedDeployment = isDeployed && status.Properties.Active && status.Properties.Complete && status.Properties.EndTime != null && status.Properties.Status == STATUS; } } } if (hasFinishedDeployment) { FunctionWrapper functionWrapper = await client.RequestAzure <FunctionWrapper>(HttpMethod.Get, $"/providers/Microsoft.Web/sites/{sitename}/functions", "2016-08-01"); if (functionWrapper != null && !functionWrapper.Value.IsNullOrEmpty()) { bool areFunctionsReady = true; for (int j = 0; j < functionWrapper.Value.Count && areFunctionsReady; j++) { Function function = functionWrapper.Value[j]; areFunctionsReady = function != null && function.Properties != null && function.Properties.Config != null && !function.Properties.Config.Disabled; } isReady = areFunctionsReady; } } } if (!isReady) { await Task.Delay(WAIT); } } return(isReady); }
public override async Task<ActionResponse> ExecuteActionAsync(ActionRequest request) { string sqlConn = request.DataStore.GetValue("SqlConnectionString"); string subscription = request.DataStore.GetJson("SelectedSubscription", "SubscriptionId"); string token = request.DataStore.GetJson("AzureToken", "access_token"); System.DateTime now = System.DateTime.UtcNow; System.DateTime days90ago = now.Subtract(new System.TimeSpan(2160, 0, 0)); string days90agoString = days90ago.ToString("yyyy-MM-ddTHH:mm:ss.fffZ"); string nowString = now.ToString("yyyy-MM-ddTHH:mm:ss.fffZ"); string geturi = string.IsNullOrEmpty(request.DataStore.GetValue("NextLink")) ? $"https://management.azure.com/subscriptions/{subscription}/providers/microsoft.insights/eventtypes/management/values?api-version=2015-04-01&$filter=eventTimestamp ge '{days90agoString}' and eventTimestamp le '{nowString}' and eventChannels eq 'Admin, Operation'" : request.DataStore.GetValue("NextLink"); DataTable shTable = CreateServiceHealthTable(); DataTable adminTable = CreateAdministrativeTable(); AzureHttpClient ahc = new AzureHttpClient(token, subscription); ActivityLogResponse response = await ahc.Request<ActivityLogResponse>(HttpMethod.Get, geturi); if (response == null || response.Value.IsNullOrEmpty()) { //return new ActionResponse(ActionStatus.Failure, new ActionResponseExceptionDetail("ActivityLogsGetHistoricalDataError")); // Historical Data is optional - let users continue even if not all their historical data is imported return new ActionResponse(ActionStatus.Success); } foreach (ActivityLogEntry activity in response.Value) { if (activity.Category != null) { if (activity.Category.Value == "ServiceHealth") { DataRow shRow = shTable.NewRow(); shRow["serviceHealthId"] = activity.EventDataId; shRow["correlationId"] = activity.CorrelationId; shRow["description"] = activity.Description; if (activity.Properties != null) { shRow["impact"] = activity.Properties.Impact; shRow["impactedRegions"] = activity.Properties.ImpactedRegions; shRow["impactedServices"] = activity.Properties.ImpactedServices; shRow["incidentType"] = activity.Properties.IncidentType; } shRow["level"] = activity.Level; shRow["operationId"] = activity.OperationId; if (activity.Status != null) { shRow["status"] = activity.Status.LocalizedValue; } shRow["timestamp"] = activity.EventTimestamp; if (activity.Properties != null) { shRow["title"] = activity.Properties.Title; } shTable.Rows.Add(shRow); } } DataRow adminRow = adminTable.NewRow(); if (activity.Claims != null) { adminRow["caller"] = activity.Claims.Upn; } adminRow["correlationId"] = activity.CorrelationId; adminRow["description"] = activity.Description; if (activity.Category != null) { adminRow["eventCategory"] = activity.Category.Value; } adminRow["level"] = activity.Level; if (activity.OperationName != null) { string opName = activity.OperationName.Value; if (!string.IsNullOrEmpty(opName) && opName.Length > 5) { int startidx; if ((startidx = opName.LastIndexOf("/")) != -1) { string opCategory = opName.Substring(startidx + 1); if (opCategory.EqualsIgnoreCase("write")) { adminRow["operationCategory"] = "Write"; } else if (opCategory.EqualsIgnoreCase("delete")) { adminRow["operationCategory"] = "Delete"; } else if (opCategory.EqualsIgnoreCase("action")) { adminRow["operationCategory"] = "Action"; } } } } adminRow["operationId"] = activity.OperationId; if (activity.OperationName != null) { adminRow["operationName"] = activity.OperationName.LocalizedValue; } adminRow["resourceGroup"] = activity.ResourceGroupName; adminRow["resourceId"] = activity.Id; if (activity.ResourceProviderName != null && activity.ResourceProviderName.Value != null) { adminRow["resourceProvider"] = activity.ResourceProviderName.Value.ToUpper(); } if (activity.Status != null) { adminRow["status"] = activity.Status.LocalizedValue; } adminRow["timestamp"] = activity.EventTimestamp; adminTable.Rows.Add(adminRow); } BulkInsert(sqlConn, shTable, "bpst_aal.ServiceHealthData"); BulkInsert(sqlConn, adminTable, "bpst_aal.AdministrativeData"); request.DataStore.AddToDataStore("NextLink", response.NextLink, DataStoreType.Public); return response.NextLink == null ? new ActionResponse(ActionStatus.Success) : new ActionResponse(ActionStatus.InProgress); }
public override async Task <ActionResponse> ExecuteActionAsync(ActionRequest request) { AzureHttpClient client = new AzureHttpClient(request.DataStore.GetJson("PBIToken", "access_token")); string pbiClusterUri = request.DataStore.GetValue("PBIClusterUri"); PBIWorkspaces pbiWorkspaces = JsonUtility.Deserialize <PBIWorkspaces>(await client.Request(HttpMethod.Get, pbiClusterUri + PBI_ENDPOINT_GROUPS)); pbiWorkspaces.Workspaces.Insert(0, new PBIWorkspace(PBI_DEFAULT_WORKSPACE)); return(new ActionResponse(ActionStatus.Success, JsonUtility.Serialize <List <PBIWorkspace> >(pbiWorkspaces.Workspaces))); }