Exemple #1
0
        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));
        }
Exemple #7
0
        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)));
        }