Example #1
0
        public override void ExecuteCmdlet()
        {
            if (!string.IsNullOrWhiteSpace(ResourceGroupName) && !string.IsNullOrWhiteSpace(WebAppName))
            {
                string         certName   = null;
                HttpStatusCode statusCode = HttpStatusCode.OK;
                var            webApp     = new PSSite(WebsitesClient.GetWebApp(ResourceGroupName, WebAppName, Slot));
                var            location   = webApp.Location;

                var certificate = new Certificate(
                    webApp.Location,
                    type: "Microsoft.Web/certificates",
                    canonicalName: HostName,
                    password: "",
                    serverFarmId: webApp.ServerFarmId);

                PSCertificate createdCertdetails = new PSCertificate(certificate);

                if (this.ShouldProcess(this.WebAppName, string.Format($"Creating an App service managed certificate for Web App '{WebAppName}'")))
                {
                    try
                    {
                        //Default certName is HostName
                        certName           = Name != null ? Name : HostName;
                        createdCertdetails = new PSCertificate(WebsitesClient.CreateCertificate(ResourceGroupName, certName, certificate));
                    }
                    catch (DefaultErrorResponseException e)
                    {
                        statusCode = e.Response.StatusCode;
                        // 'Conflict' exception is thrown when certificate already exists. Let's swallow it and continue.
                        //'Accepted' exception is thrown by default for create cert method.
                        if (e.Response.StatusCode != HttpStatusCode.Conflict &&
                            e.Response.StatusCode != HttpStatusCode.Accepted)
                        {
                            throw;
                        }
                        if (e.Response.StatusCode == HttpStatusCode.Accepted)
                        {
                            var        poll_url = e.Response.Headers["Location"].FirstOrDefault();
                            var        token    = WebsitesClient.GetAccessToken(DefaultContext);
                            HttpClient client   = new HttpClient();
                            client.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Bearer", token.AccessToken);

                            HttpResponseMessage r;
                            int numChecks = 0;
                            do
                            {
                                Thread.Sleep(TimeSpan.FromSeconds(5));
                                r = client.GetAsync(poll_url).Result;
                                numChecks++;
                            } while (r.StatusCode == HttpStatusCode.Accepted && numChecks < NumStatusChecks);

                            if (r.StatusCode == HttpStatusCode.Accepted && numChecks >= NumStatusChecks)
                            {
                                var rec = new ErrorRecord(new Exception(string.Format($"The creation of the managed certificate '{this.HostName}' is taking longer than expected." +
                                                                                      $" Please re-try the operation '{CreateInputCommand()}'")),
                                                          string.Empty, ErrorCategory.OperationTimeout, null);
                                WriteError(rec);
                            }
                        }
                    }
                    createdCertdetails = new PSCertificate(WebsitesClient.GetCertificate(ResourceGroupName, certName));

                    //Add only when user is opted for Binding
                    if (AddBinding)
                    {
                        WebsitesClient.UpdateHostNameSslState(ResourceGroupName,
                                                              WebAppName,
                                                              Slot,
                                                              webApp.Location,
                                                              HostName, SslState.HasValue ? SslState.Value : Management.WebSites.Models.SslState.SniEnabled,
                                                              createdCertdetails.Thumbprint);
                    }
                    WriteObject(createdCertdetails);
                }
            }
        }