hashicorp / go-azure-sdk

An opinionated Go SDK for Azure Resource Manager
Mozilla Public License 2.0
34 stars 44 forks source link

Issue with [app service] / API Version [2023-01-01] #957

Open xiaxyi opened 6 months ago

xiaxyi commented 6 months ago

Is there an existing issue for this?

Community Note

Service Used

Microsoft.Web

API Versions Used

2023-01-01

Description

The api "/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.Web/sites/{name}" supports both LRO/ non-LRO.

the LRO is for function app on container app environment, however, the LRO poller returns error(check code #1) if the result of the polling uri is statusCode 200 + actual function app object. (we only take 200 + empty body as a succeeded polling op: see code #2) 1.

if op.Properties.ProvisioningState == "" && op.Status == "" {
            return nil, fmt.Errorf("expected either `provisioningState` or `status` to be returned from the LRO API but both were empty")
        }
  1. // Automation@2022-08-08 - Runbooks - returns a 200 OK with no Body
        if result.HttpResponse.StatusCode == http.StatusOK && result.HttpResponse.ContentLength == 0 {
            result.Status = pollers.PollingStatusSucceeded
            return
        }

    It makes sense to return the actual provisioned object by the polling uri endpoint, shall we add this scenario as well?

related issue: https://github.com/hashicorp/go-azure-sdk/issues/542

References

No response

tombuildsstuff commented 6 months ago

@xiaxyi can you provide the HTTP Requests/Responses involved here?

xiaxyi commented 6 months ago

sure @tombuildsstuff , here you go: The PUT request to create the function app on container: https://management.azure.com/subscriptions/85xxx/resourcegroups/xiaxintestrg-linuxOnContainer/providers/Microsoft.Web/sites/xiaxintest-tf-acr130-api?api-version=2023-01-01

{
  "name": "xiaxintest-tf-acr130-api",
  "kind": "functionapp,linux,container,azurecontainerapps",
  "location": "eastus",
  "properties": {
    "managedEnvironmentId": "/subscriptions/85bxxx/resourceGroups/xiaxintestrg-linuxOnContainer/providers/Microsoft.App/managedEnvironments/xiaxintest-CAEnv",
    "siteConfig": {
      "appSettings": [
        { "name": "FUNCTIONS_EXTENSION_VERSION", "value": "~4" },
        {
          "name": "AzureWebJobsStorage",
          "value": "DefaultEndpointsProtocol=https;AccountName=xiaxintestsafacontainer;AccountKey=Dxxx;EndpointSuffix=core.windows.net"
        },
        {
          "name": "DOCKER_REGISTRY_SERVER_URL",
          "value": "xiaxintestacr.azurecr.io"
        },
        { "name": "DOCKER_REGISTRY_SERVER_USERNAME", "value": "xiaxintestacr" },
        { "name": "DOCKER_REGISTRY_SERVER_PASSWORD", "value": "xxxx },
        {
          "name": "AzureWebJobsDashboard",
          "value": "DefaultEndpointsProtocol=https;AccountName=xiaxintestsafacontainer;AccountKey=xxx;EndpointSuffix=core.windows.net"
        }
      ],
      "ftpsState": "Disabled",
      "linuxFxVersion": "DOCKER|xiaxintestacr.azurecr.io/azurefunctionsimage:v1.0.0",
      "use32BitWorkerProcess": false
    }
  },
  "tags": null
}

response body of the original URI is the function app object itself

when trying to get the Location in header, request:

https://management.azure.com/subscriptions/85bxxx/resourceGroups/xiaxintestrg-linuxOnContainer/providers/Microsoft.Web/sites/xiaxintest-tf-acr130-api/operationresults/0e10d606-58fe-4842-babd-844a7ac76d6e?api-version=2023-01-01&t=638479026176663501&c=MIIHADCCBeigAwIBAgITHgPpxUXboRMa1MKXpgAAA-nFRTANBgkqhkiG9w0BAQsFADBEMRMwEQYKCZImiZPyLGQBGRYDR0JMMRMwEQYKCZImiZPyLGQBGRYDQU1FMRgwFgYDVQQDEw9BTUUgSW5mcmEgQ0EgMDYwHhcNMjQwMTMxMDEyODE0WhcNMjUwMTI1MDEyODE0WjBAMT4wPAYDVQQDEzVhc3luY29wZXJhdGlvbnNpZ25pbmdjZXJ0aWZpY2F0ZS5tYW5hZ2VtZW50LmF6dXJlLmNvbTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALigL_YnYGZkISCK9BFT_dzpf963u9bRlY_IhMLl8TQ-....

Before function app is provisioned the response is 202+empty body, after the function app is provisioned, response is 200 + actual function app object: image

image

tombuildsstuff commented 6 months ago

@xiaxyi have you got the full headers for both requests too?

xiaxyi commented 6 months ago

Sure @tombuildsstuff This is the header of the PUT request:

[
  {
    "key": "Cache-Control",
    "value": "no-cache"
  },
  {
    "key": "Pragma",
    "value": "no-cache"
  },
  {
    "key": "Expires",
    "value": "-1"
  },
  {
    "key": "Location",
    "value": "https://management.azure.com/subscriptions/85b3xxx/resourceGroups/xiaxintestrg-linuxOnContainer/providers/Microsoft.Web/sites/xiaxintest-tf-acr130-api/operationresults/caa81acc-27cc-4936-98eb-820d1390b080?api-version=2023-01-01&t=638481622558841711&c=MIIHADCCBeigAwIBAgITHgPr-xxx"
  },
  {
    "key": "Retry-After",
    "value": "15",
    "description": "Indicates how many seconds to wait before making a follow-up request.",
    "enabled": true,
    "disableEdit": true,
    "info": "Indicates how many seconds to wait before making a follow-up request."
  },
  {
    "key": "Strict-Transport-Security",
    "value": "max-age=31536000; includeSubDomains",
    "description": "Lets websites tell a browser that they should only be accessed via HTTPS.",
    "enabled": true,
    "disableEdit": true,
    "info": "Lets websites tell a browser that they should only be accessed via HTTPS."
  },
  {
    "key": "X-AspNet-Version",
    "value": "4.0.30319",
    "description": "Custom header",
    "enabled": true,
    "disableEdit": true,
    "info": "Custom header"
  },
  {
    "key": "X-Powered-By",
    "value": "ASP.NET"
  },
  {
    "key": "x-ms-ratelimit-remaining-subscription-resource-requests",
    "value": "499"
  },
  {
    "key": "x-ms-request-id",
    "value": "xxx"
  },
  {
    "key": "x-ms-correlation-request-id",
    "value": "xxx"
  },
  {
    "key": "x-ms-routing-request-id",
    "value": "xxx"
  },
  {
    "key": "X-Content-Type-Options",
    "value": "nosniff"
  },
  {
    "key": "X-Cache",
    "value": "CONFIG_NOCACHE"
  },
  {
    "key": "X-MSEdge-Ref",
    "value": "Ref A: xxx Ref B: xx Ref C: 2024-04-08T08:37:31Z"
  },
  {
    "key": "Date",
    "value": "Mon, 08 Apr 2024 08:37:35 GMT"
  },
  {
    "key": "Date",
    "value": "Mon, 08 Apr 2024 08:37:35 GMT"
  },
  {
    "key": "Content-Length",
    "value": "0"
  }
]

This is the header of the get async location :

[
  {
    "key": "Cache-Control",
    "value": "no-cache"
  },
  {
    "key": "Pragma",
    "value": "no-cache"
  },
  {
    "key": "Expires",
    "value": "-1"
  },
  {
    "key": "Location",
    "value": "https://management.azure.com/subscriptions/85xxx/resourceGroups/xiaxintestrg-linuxOnContainer/providers/Microsoft.Web/sites/xiaxintest-tf-acr130-api/operationresults/2d229b38-0695-4db4-a1fa-fabb3907dfb8?api-version=2023-01-01&t=638481627257729625&c=zMIIHADCCBeigAw"
  },
  {
    "key": "Retry-After",
    "value": "15"
  },
  {
    "key": "Strict-Transport-Security",
    "value": "max-age=31536000; includeSubDomains"
  },
  {
    "key": "X-AspNet-Version",
    "value": "4.0.30319"
  },
  {
    "key": "X-Powered-By",
    "value": "ASP.NET"
  },
  {
    "key": "x-ms-ratelimit-remaining-subscription-reads",
    "value": "11999"
  },
  {
    "key": "x-ms-request-id",
    "value": "xxx"
  },
  {
    "key": "x-ms-correlation-request-id",
    "value": "xxx"
  },
  {
    "key": "x-ms-routing-request-id",
    "value": "xxx"
  },
  {
    "key": "X-Content-Type-Options",
    "value": "nosniff"
  },
  {
    "key": "X-Cache",
    "value": "CONFIG_NOCACHE"
  },
  {
    "key": "X-MSEdge-Ref",
    "value": "Ref A: xxx Ref B: xxx Ref C: 2024-04-08T08:45:24Z"
  },
  {
    "key": "Date",
    "value": "Mon, 08 Apr 2024 08:45:25 GMT"
  },
  {
    "key": "Content-Length",
    "value": "0"
  }
]