public override async Task <ActionResponse> ExecuteActionAsync(ActionRequest request)
        {
            var azureToken   = request.DataStore.GetJson("AzureToken", "access_token");
            var subscription = request.DataStore.GetJson("SelectedSubscription", "SubscriptionId");

            string server = request.DataStore.GetJson("SqlCredentials", "Server");

            AzureHttpClient httpClient = new AzureHttpClient(azureToken, subscription);
            dynamic         payload    = new ExpandoObject();

            payload.name = server.Replace(".database.windows.net", "");
            payload.type = "Microsoft.Sql/servers";


            HttpResponseMessage response = await httpClient.ExecuteWithSubscriptionAsync(HttpMethod.Post, $"/providers/Microsoft.Sql/checkNameAvailability", "2014-04-01-preview",
                                                                                         JsonUtility.GetJsonStringFromObject(payload));

            string content = await response.Content.ReadAsStringAsync();

            var    json        = JsonUtility.GetJObjectFromJsonString(content);
            bool   isAvailable = json["available"].ToString().EqualsIgnoreCase("True");
            string reason      = json["reason"].ToString();
            string message     = json["message"].ToString();

            if (isAvailable)
            {
                return(new ActionResponse(ActionStatus.Success, ""));
            }
            else
            {
                // Handle basic errorcases here
                return(new ActionResponse(ActionStatus.FailureExpected, json, null, SqlErrorCodes.DatabaseAlreadyExists));
            }
        }
        public override async Task <ActionResponse> ExecuteActionAsync(ActionRequest request)
        {
            var azureToken     = request.DataStore.GetJson("AzureToken", "access_token");
            var idSubscription = request.DataStore.GetJson("SelectedSubscription", "SubscriptionId");

            AzureHttpClient client = new AzureHttpClient(azureToken, idSubscription);

            var response = await client.ExecuteWithSubscriptionAsync(HttpMethod.Get, $"providers/Microsoft.Storage/storageAccounts", "2017-06-01", string.Empty);

            if (response.IsSuccessStatusCode)
            {
                var storageAccounts = JsonUtility.GetJObjectFromJsonString(await response.Content.ReadAsStringAsync());

                JArray array = new JArray();

                var tasks = storageAccounts["value"].Select(async item =>
                {
                    var storageAccountId   = item["id"].ToString();
                    var storageAccountName = item["name"].ToString();

                    var connectionString = await this.GetStorageAccountConnectionStringAsync(azureToken, idSubscription, storageAccountName, storageAccountId);
                    var containers       = await this.GetContainersAsync(connectionString);

                    return(new JObject
                    {
                        { "StorageAccountId", storageAccountId },
                        { "StorageAccountName", storageAccountName },
                        { "StorageAccountConnectionString", connectionString },
                        { "Containers", containers }
                    });
                }).ToArray();

                await Task.WhenAll(tasks);

                foreach (var task in tasks)
                {
                    array.Add(task.Result);
                }

                request.Logger.LogEvent("GetAzureStorages-result", new Dictionary <string, string>()
                {
                    { "Storages", array.ToString() }
                });

                request.DataStore.AddToDataStore("StorageAccounts", array);
                return(new ActionResponse(ActionStatus.Success, array, true));
            }

            var error = await response.Content.ReadAsStringAsync();

            return(new ActionResponse(ActionStatus.Failure, error, null, DefaultErrorCodes.DefaultErrorCode, "GetAzureStorages"));
        }
        public override async Task <ActionResponse> ExecuteActionAsync(ActionRequest request)
        {
            string azureToken   = request.DataStore.GetJson("AzureTokenAS", "access_token");
            string subscription = request.DataStore.GetJson("SelectedSubscription", "SubscriptionId");
            string name         = request.DataStore.GetValue("ASServerName");
            string location     = request.DataStore.GetValue("ASLocation") ?? "westus";

            dynamic payload = new ExpandoObject();

            payload.name = name;
            payload.type = "Microsoft.AnalysisServices/servers";
            AzureHttpClient     client   = new AzureHttpClient(azureToken, subscription);
            HttpResponseMessage response = await client.ExecuteWithSubscriptionAsync(
                HttpMethod.Post,
                $"providers/Microsoft.AnalysisServices/locations/{location}/checkNameAvailability",
                "2016-05-16",
                JsonUtility.GetJsonStringFromObject(payload));

            if (response.IsSuccessStatusCode)
            {
                string body = await response.Content.ReadAsStringAsync();

                var json = JsonUtility.GetJsonObjectFromJsonString(body);
                if (json["nameAvailable"].ToString().ToLower() == "false")
                {
                    return(new ActionResponse(ActionStatus.FailureExpected, json, null, null, json["reason"].ToString() + ": " + json["message"].ToString()));
                }

                if (json["nameAvailable"].ToString().ToLower() == "true")
                {
                    return(new ActionResponse(ActionStatus.Success, json));
                }
            }

            return(new ActionResponse(ActionStatus.Failure, null, null, null, "Unable to query Azure for name availability"));
        }
        public override async Task <ActionResponse> ExecuteActionAsync(ActionRequest request)
        {
            string azureToken    = request.DataStore.GetJson("AzureToken", "access_token");
            string subscription  = request.DataStore.GetJson("SelectedSubscription", "SubscriptionId");
            string resourceGroup = request.DataStore.GetValue("SelectedResourceGroup");

            request.DataStore.AddToDataStore("requestparameters", "AzureProvider", "Microsoft.CognitiveServices");
            var    location           = request.DataStore.GetValue("CognitiveLocation");
            string permissionsToCheck = request.DataStore.GetValue("CognitiveServices");

            if (!(await RequestUtility.CallAction(request, "Microsoft-RegisterProviderBeta")).IsSuccess)
            {
                return(new ActionResponse(ActionStatus.Failure, null, null, null, "Unable to register Cognitive Services"));
            }


            List <string>   cognitiveServicesToCheck = permissionsToCheck.Split(',').Select(p => p.Trim()).ToList();
            AzureHttpClient client = new AzureHttpClient(azureToken, subscription, resourceGroup);

            bool passPermissionCheck = true;
            // Check if permissions are fine
            var getPermissionsResponse = await client.ExecuteWithSubscriptionAsync(HttpMethod.Get,
                                                                                   $"providers/Microsoft.CognitiveServices/locations/{location}/settings/accounts", "2016-02-01-preview",
                                                                                   string.Empty);

            var getPermissionsBody = JsonUtility.GetJsonObjectFromJsonString(await getPermissionsResponse.Content.ReadAsStringAsync());

            foreach (var permission in getPermissionsBody["settings"])
            {
                if (cognitiveServicesToCheck.Contains(permission["kind"].ToString()) && permission["allowCreate"].ToString().ToLowerInvariant() == "false")
                {
                    passPermissionCheck = false;
                }

                if (cognitiveServicesToCheck.Contains(permission["kind"].ToString()) && permission["allowCreate"].ToString().ToLowerInvariant() == "true")
                {
                    cognitiveServicesToCheck.Remove(permission["kind"].ToString());
                }
            }



            if (passPermissionCheck && cognitiveServicesToCheck.Count == 0)
            {
                return(new ActionResponse(ActionStatus.Success));
            }


            // IF not then check if user can enable
            var getOwnerResponse = await client.ExecuteWithSubscriptionAsync(HttpMethod.Post,
                                                                             $"providers/Microsoft.CognitiveServices/locations/{location}/checkAccountOwner", "2016-02-01-preview",
                                                                             JsonUtility.GetEmptyJObject().ToString());

            var getOwnerBody = JsonUtility.GetJsonObjectFromJsonString(await getOwnerResponse.Content.ReadAsStringAsync());

            if (getOwnerBody["isAccountOwner"].ToString().ToLowerInvariant() == "false")
            {
                return(new ActionResponse(ActionStatus.Failure, getOwnerBody, null, null, $"Your account admin ({getOwnerBody["accountOwnerEmail"].ToString()}) needs to enable cognitive services for this subscription. Ensure the account admin has at least contributor privileges to the Azure subscription. " +
                                          $"The following cognitive service should be enabled in order to proceed- {permissionsToCheck}"));
            }

            // User does not have permission but we can enable permission for the user as they are the admin
            dynamic obj = new ExpandoObject();

            obj.resourceType = "accounts";
            obj.settings     = new ExpandoObject[cognitiveServicesToCheck.Count];
            for (int i = 0; i < cognitiveServicesToCheck.Count; i++)
            {
                obj.settings[i]             = new ExpandoObject();
                obj.settings[i].kind        = cognitiveServicesToCheck[i];
                obj.settings[i].allowCreate = true;
            }

            var setPermissionsResponse = await client.ExecuteWithSubscriptionAsync(HttpMethod.Post,
                                                                                   $"providers/Microsoft.CognitiveServices/locations/{location}/updateSettings", "2016-02-01-preview",
                                                                                   JsonUtility.GetJObjectFromObject(obj).ToString());

            if (!setPermissionsResponse.IsSuccessStatusCode)
            {
                return(new ActionResponse(ActionStatus.Failure, await setPermissionsResponse.Content.ReadAsStringAsync(), null, null, $"Unable to assign permissions for the cogntivie services {permissionsToCheck}. Use the Azure Portal to enable these services. Ensure you have at least contributor privilige to the subscription"));
            }

            return(new ActionResponse(ActionStatus.Success));
        }