Skip to content

Commit 3f795a9

Browse files
authored
Merge pull request #186777 from MicrosoftDocs/master
Merge master to live, 4 AM
2 parents 9d84d3e + bea25b7 commit 3f795a9

File tree

95 files changed

+1944
-703
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

95 files changed

+1944
-703
lines changed

.openpublishing.redirection.healthcare-apis.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -374,7 +374,7 @@
374374
},
375375
{
376376
"source_path_from_root": "/articles/healthcare-apis/data-transformation/move-to-synapse.md",
377-
"redirect_url": "/azure/healthcare-apis/fhir/move-to-synapse",
377+
"redirect_url": "/azure/healthcare-apis/fhir/copy-to-synapse",
378378
"redirect_document_id": true
379379
},
380380
{
@@ -429,7 +429,7 @@
429429
},
430430
{
431431
"source_path_from_root": "/articles/healthcare-apis/azure-api-for-fhir/access-fhir-postman-tutorial.md",
432-
"redirect_url": "/azure/healthcare-apis/use-postman",
432+
"redirect_url": "/azure/healthcare-apis/fhir/use-postman",
433433
"redirect_document_id": true
434434
},
435435
{

.openpublishing.redirection.json

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45246,6 +45246,16 @@
4524645246
"source_path_from_root": "/articles/azure/virtual-desktop/azure-advisor.md",
4524745247
"redirect_url": "/azure/advisor/advisor-overview",
4524845248
"redirect_document_id": false
45249-
}
45249+
},
45250+
{
45251+
"source_path_from_root": "/articles/azure/cognitive-services/translator/tutorial-wpf-translation-csharp.md",
45252+
"redirect_url": "/ai-builder/flow-text-translation?toc=/azure/cognitive-services/translator/toc.json&bc=/azure/cognitive-services/translator/breadcrumb/toc.json",
45253+
"redirect_document_id": false
45254+
},
45255+
{
45256+
"source_path_from_root": "/articles/azure/cognitive-services/translator/tutorial-build-flask-app-translation-synthesis.md",
45257+
"redirect_url": "/learn/modules/translate-text-with-translator-service?toc=/azure/cognitive-services/translator/toc.json&bc=/azure/cognitive-services/translator/breadcrumb/toc.json",
45258+
"redirect_document_id": false
45259+
}
4525045260
]
4525145261
}

articles/aks/azure-files-volume.md

Lines changed: 32 additions & 73 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ titleSuffix: Azure Kubernetes Service
44
description: Learn how to manually create a volume with Azure Files for use with multiple concurrent pods in Azure Kubernetes Service (AKS)
55
services: container-service
66
ms.topic: article
7-
ms.date: 01/18/2022
7+
ms.date: 01/29/2022
88

99

1010
#Customer intent: As a developer, I want to learn how to manually create and attach storage using Azure Files to a pod in AKS.
@@ -19,7 +19,7 @@ For more information on Kubernetes volumes, see [Storage options for application
1919

2020
## Before you begin
2121

22-
This article assumes that you have an existing AKS cluster. If you need an AKS cluster, see the AKS quickstart [using the Azure CLI][aks-quickstart-cli] or [using the Azure portal][aks-quickstart-portal].
22+
This article assumes that you have an existing AKS 1.21 or above cluster. If you need an AKS cluster, see the AKS quickstart [using the Azure CLI][aks-quickstart-cli] or [using the Azure portal][aks-quickstart-portal].
2323

2424
You also need the Azure CLI version 2.0.59 or later installed and configured. Run `az --version` to find the version. If you need to install or upgrade, see [Install Azure CLI][install-azure-cli].
2525

@@ -93,10 +93,12 @@ spec:
9393
mountPath: /mnt/azure
9494
volumes:
9595
- name: azure
96-
azureFile:
97-
secretName: azure-secret
98-
shareName: aksshare
99-
readOnly: false
96+
csi:
97+
driver: file.csi.azure.com
98+
volumeAttributes:
99+
secretName: azure-secret # required
100+
shareName: aksshare # required
101+
mountOptions: "dir_mode=0777,file_mode=0777,cache=strict,actimeo=30" # optional
100102
```
101103
102104
Use the `kubectl` command to create the pod.
@@ -105,37 +107,11 @@ Use the `kubectl` command to create the pod.
105107
kubectl apply -f azure-files-pod.yaml
106108
```
107109

108-
You now have a running pod with an Azure Files share mounted at */mnt/azure*. You can use `kubectl describe pod mypod` to verify the share is mounted successfully. The following condensed example output shows the volume mounted in the container:
109-
110-
```
111-
Containers:
112-
mypod:
113-
Container ID: docker://86d244cfc7c4822401e88f55fd75217d213aa9c3c6a3df169e76e8e25ed28166
114-
Image: mcr.microsoft.com/oss/nginx/nginx:1.15.5-alpine
115-
Image ID: docker-pullable://nginx@sha256:9ad0746d8f2ea6df3a17ba89eca40b48c47066dfab55a75e08e2b70fc80d929e
116-
State: Running
117-
Started: Sat, 02 Mar 2019 00:05:47 +0000
118-
Ready: True
119-
Mounts:
120-
/mnt/azure from azure (rw)
121-
/var/run/secrets/kubernetes.io/serviceaccount from default-token-z5sd7 (ro)
122-
[...]
123-
Volumes:
124-
azure:
125-
Type: AzureFile (an Azure File Service mount on the host and bind mount to the pod)
126-
SecretName: azure-secret
127-
ShareName: aksshare
128-
ReadOnly: false
129-
default-token-z5sd7:
130-
Type: Secret (a volume populated by a Secret)
131-
SecretName: default-token-z5sd7
132-
[...]
133-
```
110+
You now have a running pod with an Azure Files share mounted at */mnt/azure*. You can use `kubectl describe pod mypod` to verify the share is mounted successfully.
134111

135112
## Mount file share as a persistent volume
136113
- Mount options
137-
138-
The default value for *fileMode* and *dirMode* is *0777* for Kubernetes version 1.15 and above. The following example sets *0755* on the *PersistentVolume* object:
114+
> The default value for *fileMode* and *dirMode* is *0777* for Kubernetes version 1.15 and above.
139115

140116
```yaml
141117
apiVersion: v1
@@ -147,43 +123,25 @@ spec:
147123
storage: 5Gi
148124
accessModes:
149125
- ReadWriteMany
150-
azureFile:
151-
secretName: azure-secret
152-
secretNamespace: default
153-
shareName: aksshare
154-
readOnly: false
155-
mountOptions:
156-
- dir_mode=0755
157-
- file_mode=0755
158-
- uid=1000
159-
- gid=1000
160-
- mfsymlinks
161-
- nobrl
162-
```
163-
164-
To update your mount options, create a *azurefile-mount-options-pv.yaml* file with a *PersistentVolume*. For example:
165-
166-
```yaml
167-
apiVersion: v1
168-
kind: PersistentVolume
169-
metadata:
170-
name: azurefile
171-
spec:
172-
capacity:
173-
storage: 5Gi
174-
accessModes:
175-
- ReadWriteMany
176-
azureFile:
177-
secretName: azure-secret
178-
shareName: aksshare
126+
persistentVolumeReclaimPolicy: Retain
127+
csi:
128+
driver: file.csi.azure.com
179129
readOnly: false
130+
volumeHandle: unique-volumeid # make sure this volumeid is unique in the cluster
131+
volumeAttributes:
132+
resourceGroup: EXISTING_RESOURCE_GROUP_NAME # optional, only set this when storage account is not in the same resource group as agent node
133+
shareName: aksshare
134+
nodeStageSecretRef:
135+
name: azure-secret
136+
namespace: default
180137
mountOptions:
181-
- dir_mode=0777
182-
- file_mode=0777
183-
- uid=1000
184-
- gid=1000
185-
- mfsymlinks
186-
- nobrl
138+
- dir_mode=0777
139+
- file_mode=0777
140+
- uid=0
141+
- gid=0
142+
- mfsymlinks
143+
- cache=strict
144+
- nosharesock
187145
```
188146

189147
Create a *azurefile-mount-options-pvc.yaml* file with a *PersistentVolumeClaim* that uses the *PersistentVolume*. For example:
@@ -238,11 +196,11 @@ kubectl apply -f azure-files-pod.yaml
238196

239197
## Next steps
240198

241-
For associated best practices, see [Best practices for storage and backups in AKS][operator-best-practices-storage].
199+
For Azure File CSI driver parameters, see [CSI driver parameters][CSI driver parameters].
242200

243-
For more information about AKS clusters interact with Azure Files, see the [Kubernetes plugin for Azure Files][kubernetes-files].
201+
For information about AKS 1.20 or below clusters interact with Azure Files, see the [Kubernetes plugin for Azure Files][kubernetes-files].
244202

245-
For storage class parameters, see [Static Provision(bring your own file share)](https://github.com/kubernetes-sigs/azurefile-csi-driver/blob/master/docs/driver-parameters.md#static-provisionbring-your-own-file-share).
203+
For associated best practices, see [Best practices for storage and backups in AKS][operator-best-practices-storage].
246204

247205
<!-- LINKS - external -->
248206
[kubectl-create]: https://kubernetes.io/docs/user-guide/kubectl/v1.8/#create
@@ -251,11 +209,12 @@ For storage class parameters, see [Static Provision(bring your own file share)](
251209
[kubernetes-volumes]: https://kubernetes.io/docs/concepts/storage/volumes/
252210
[smb-overview]: /windows/desktop/FileIO/microsoft-smb-protocol-and-cifs-protocol-overview
253211
[kubernetes-security-context]: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/
212+
[CSI driver parameters]: https://github.com/kubernetes-sigs/azurefile-csi-driver/blob/master/docs/driver-parameters.md#static-provisionbring-your-own-file-share
254213

255214
<!-- LINKS - internal -->
256215
[aks-quickstart-cli]: kubernetes-walkthrough.md
257216
[aks-quickstart-portal]: kubernetes-walkthrough-portal.md
258217
[install-azure-cli]: /cli/azure/install-azure-cli
259218
[operator-best-practices-storage]: operator-best-practices-storage.md
260219
[concepts-storage]: concepts-storage.md
261-
[persistent-volume-example]: #mount-file-share-as-a-persistent-volume
220+
[persistent-volume-example]: #mount-file-share-as-a-persistent-volume

articles/api-management/TOC.yml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,8 @@
126126
href: edit-api.md
127127
- name: Configure Service Fabric backend
128128
href: how-to-configure-service-fabric-backend.md
129+
- name: Import SAP OData metadata
130+
href: sap-api.md
129131
- name: Provision and scale
130132
items:
131133
- name: Capacity metric
35.9 KB
Loading
45.7 KB
Loading
30.1 KB
Loading

articles/api-management/sap-api.md

Lines changed: 135 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,135 @@
1+
---
2+
title: Import an SAP API using the Azure portal | Microsoft Docs
3+
titleSuffix:
4+
description: Learn how to import OData metadata from SAP as an API to Azure API Management
5+
ms.service: api-management
6+
author: martinpankraz
7+
ms.author: mapankra
8+
ms.topic: how-to
9+
ms.date: 01/26/2022
10+
ms.custom:
11+
---
12+
13+
# Import SAP OData metadata as an API
14+
15+
This article shows how to import an OData service using its metadata description. In this article, [SAP Gateway](https://help.sap.com/viewer/product/SAP_GATEWAY) serves as an example. However, you can apply the approach to any OData-compliant service.
16+
17+
In this article, you'll:
18+
> [!div class="checklist"]
19+
> * Convert OData metadata to an OpenAPI specification
20+
> * Import the OpenAPI specification to API Management
21+
> * Complete API configuration
22+
> * Test the API in the Azure portal
23+
24+
## Prerequisites
25+
26+
- An existing API Management instance. [Create one if you haven't already](get-started-create-service-instance.md).
27+
- An SAP system and service exposed as OData v2 or v4.
28+
- If your SAP backend uses a self-signed certificate (for test purposes), you may need to disable the verification of the trust chain for SSL. To do so, configure a [backend](backends.md) in your API Management instance:
29+
1. In the Azure portal, under **APIs**, select **Backends** > **+ Add**.
30+
1. Add a **Custom URL** pointing to the SAP backend service.
31+
1. Uncheck **Validate certificate chain** and **Validate certificate name**.
32+
33+
> [!NOTE]
34+
> For production scenarios, use proper certificates for end-to-end SSL verification.
35+
36+
## Convert OData metadata to OpenAPI JSON
37+
38+
1. Retrieve metadata XML from your SAP service. Use one of these methods:
39+
40+
* Use the SAP Gateway Client (transaction `/IWFND/GW_CLIENT`), or
41+
* Make a direct HTTP call to retrieve the XML:
42+
`http://<OData server URL>:<port>/<path>/$metadata`.
43+
44+
1. Convert the OData XML to OpenAPI JSON format. Use an OASIS open-source tool for [OData v2](https://github.com/oasis-tcs/odata-openapi/tree/main/tools) or [OData v4](https://github.com/oasis-tcs/odata-openapi/tree/main/lib), depending on your metadata XML.
45+
46+
The following is an example command to convert OData v2 XML for the test service `epm_ref_apps_prod_man_srv`:
47+
48+
```console
49+
odata-openapi -p --basePath '/sap/opu/odata/sap/epm_ref_apps_prod_man_srv' \
50+
--scheme https --host <your IP address>:<your SSL port> \
51+
./epm_ref_apps_prod_man_srv.xml
52+
```
53+
> [!NOTE]
54+
> * For test purposes with a single XML file, you can use a [web-based converter](https://aka.ms/ODataOpenAPI) based on the open-source tool.
55+
> * With the tool or the web-based converter, specifying the \<IP address>:\<port> of your SAP OData server is optional. Alternatively, add this information later in your generated OpenAPI specification or after importing to API Management.
56+
57+
1. Save the `openapi-spec.json` file locally for import to API Management.
58+
59+
[!INCLUDE [api-management-navigate-to-instance](../../includes/api-management-navigate-to-instance.md)]
60+
61+
## Import and publish backend API
62+
63+
1. From the side navigation menu, under the **APIs** section, select **APIs**.
64+
1. Under **Create a new definition**, select **OpenAPI specification**.
65+
66+
:::image type="content" source="./media/import-api-from-oas/oas-api.png" alt-text="OpenAPI specifiction":::
67+
68+
1. Click **Select a file**, and select the `openapi-spec.json` file that you saved locally in a previous step.
69+
70+
1. Enter API settings. You can set the values during creation or configure them later by going to the **Settings** tab.
71+
* In **API URL suffix**, we recommend using the same URL path as in the original SAP service.
72+
73+
* For more information about API settings, see [Import and publish your first API](import-and-publish.md#import-and-publish-a-backend-api) tutorial.
74+
75+
1. Select **Create**.
76+
77+
> [!NOTE]
78+
> The API import limitations are documented in [another article](api-management-api-import-restrictions.md).
79+
80+
81+
## Complete API configuration
82+
83+
[Add](add-api-manually.md#add-and-test-an-operation) the following three operations to the API that you imported.
84+
85+
- `GET /$metadata`
86+
87+
|Operation |Description |Further configuration for operation |
88+
|---------|---------|---------|
89+
|`GET /$metadata` | Enables API Management to reach the `$metadata` endpoint, which is required for client integration with the OData server.<br/><br/>This required operation isn't included in the OpenAPI specification that you generated and imported. | Add a `200 OK` response. |
90+
91+
:::image type="content" source="media/sap-api/get-metadata-operation.png" alt-text="Get metadata operation":::
92+
93+
- `HEAD /`
94+
95+
|Operation |Description |Further configuration for operation |
96+
|---------|---------|---------|
97+
|`HEAD /` | Enables the client to exchange Cross Site Request Forgery (CSRF) tokens with the SAP server, when required.<br/><br/>SAP also allows CSRF token exchange using the GET verb.<br/><br/> CSRF token exchange isn’t covered in this article. See an example API Management [policy snippet](https://github.com/Azure/api-management-policy-snippets/blob/master/examples/Get%20X-CSRF%20token%20from%20SAP%20gateway%20using%20send%20request.policy.xml) to broker token exchange. | N/A |
98+
99+
:::image type="content" source="media/sap-api/head-root-operation.png" alt-text="Operation to fetch tokens":::
100+
101+
- `GET /`
102+
103+
Operation |Description |Further configuration for operation |
104+
|---------|---------|---------|
105+
|`GET /` | Enables policy configuration at service root. | Configure the following inbound [rewrite-uri](api-management-transformation-policies.md#RewriteURL) policy to append a trailing slash to requests that are forwarded to service root:<br/><br> `<rewrite-uri template="/" copy-unmatched-params="true" />` <br/><br/>This policy removes potential ambiguity of requests with or without trailing slashes, which are treated differently by some backends.|
106+
107+
:::image type="content" source="media/sap-api/get-root-operation.png" alt-text="Get operation for service root":::
108+
109+
Also, configure authentication to your backend using an appropriate method for your environment. For examples, see [API Management authentication policies](api-management-authentication-policies.md).
110+
111+
## Test your API
112+
113+
1. Navigate to your API Management instance.
114+
1. From the side navigation menu, under the **APIs** section, select **APIs**.
115+
1. Under **All APIs**, select your imported API.
116+
1. Select the **Test** tab to access the test console.
117+
1. Select an operation, enter any required values, and select **Send**.
118+
119+
For example, test the `GET /$metadata` call to verify connectivity to the SAP backend
120+
1. View the response. To troubleshoot, [trace](api-management-howto-api-inspector.md) the call.
121+
1. When testing is complete, exit the test console.
122+
123+
## Production considerations
124+
125+
* See an [example end-to-end scenario](https://blogs.sap.com/2021/08/12/.net-speaks-odata-too-how-to-implement-azure-app-service-with-sap-odata-gateway/) to integrate API Management with an SAP gateway.
126+
* Control access to an SAP backend using API Management policies. See policy snippets for [SAP principal propagation](https://github.com/Azure/api-management-policy-snippets/blob/master/examples/Request%20OAuth2%20access%20token%20from%20SAP%20using%20AAD%20JWT%20token.xml) and [fetching an X-CSRF token](https://github.com/Azure/api-management-policy-snippets/blob/master/examples/Get%20X-CSRF%20token%20from%20SAP%20gateway%20using%20send%20request.policy.xml).
127+
* For guidance to deploy, manage, and migrate APIs at scale, see:
128+
* [Automated API deployments with APIOps](/architecture/example-scenario/devops/automated-api-deployments-apiops)
129+
* [CI/CD for API Management using Azure Resource Manager templates](devops-api-development-templates.md).
130+
131+
[!INCLUDE [api-management-define-api-topics.md](../../includes/api-management-define-api-topics.md)]
132+
133+
## Next steps
134+
> [!div class="nextstepaction"]
135+
> [Transform and protect a published API](transform-api.md)

articles/app-service/configure-ssl-certificate.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ The free certificate comes with the following limitations:
7575
- All the above must be met for successful certificate issuances and renewals
7676

7777
# [Subdomain](#tab/subdomain)
78-
- Must have CNAME mapped _directly_ to <app-name>.azurewebsites.net; using services that proxy the CNAME value will block certificate issuance and renewal
78+
- Must have CNAME mapped _directly_ to \<app-name\>.azurewebsites.net; using services that proxy the CNAME value will block certificate issuance and renewal
7979
- All the above must be met for successful certificate issuance and renewals
8080

8181
-----

articles/applied-ai-services/form-recognizer/concept-id-document.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ See how data, including name, birth date, machine-readable zone, and expiration
5151
> [!NOTE]
5252
> Form Recognizer studio is available with the preview (v3.0) API.
5353
54-
1. On the Form Recognizer Studio home page, select **Invoices**
54+
1. On the Form Recognizer Studio home page, select **Identity documents**
5555

5656
1. You can analyze the sample invoice or select the **+ Add** button to upload your own sample.
5757

0 commit comments

Comments
 (0)