refactor: flatten Microsoft skills from nested to flat directory structure
Rewrote sync_microsoft_skills.py (v4) to use each SKILL.md's frontmatter 'name' field as the flat directory name under skills/, replacing the nested skills/official/microsoft/<lang>/<category>/<service>/ hierarchy. This fixes CI failures caused by the indexing, validation, and catalog scripts expecting skills/<id>/SKILL.md (depth 1). Changes: - Rewrite scripts/sync_microsoft_skills.py for flat output with collision detection - Update scripts/tests/inspect_microsoft_repo.py for flat name mapping - Update scripts/tests/test_comprehensive_coverage.py for name uniqueness checks - Delete skills/official/ nested directory - Add 129 Microsoft skills as flat directories (e.g. skills/azure-mgmt-botservice-dotnet/) - Move attribution files to docs/ (LICENSE-MICROSOFT, microsoft-skills-attribution.json) - Rebuild skills_index.json, CATALOG.md, README.md (845 total skills)
This commit is contained in:
278
skills/azure-mgmt-apimanagement-py/SKILL.md
Normal file
278
skills/azure-mgmt-apimanagement-py/SKILL.md
Normal file
@@ -0,0 +1,278 @@
|
||||
---
|
||||
name: azure-mgmt-apimanagement-py
|
||||
description: |
|
||||
Azure API Management SDK for Python. Use for managing APIM services, APIs, products, subscriptions, and policies.
|
||||
Triggers: "azure-mgmt-apimanagement", "ApiManagementClient", "APIM", "API gateway", "API Management".
|
||||
package: azure-mgmt-apimanagement
|
||||
---
|
||||
|
||||
# Azure API Management SDK for Python
|
||||
|
||||
Manage Azure API Management services, APIs, products, and policies.
|
||||
|
||||
## Installation
|
||||
|
||||
```bash
|
||||
pip install azure-mgmt-apimanagement
|
||||
pip install azure-identity
|
||||
```
|
||||
|
||||
## Environment Variables
|
||||
|
||||
```bash
|
||||
AZURE_SUBSCRIPTION_ID=your-subscription-id
|
||||
```
|
||||
|
||||
## Authentication
|
||||
|
||||
```python
|
||||
from azure.identity import DefaultAzureCredential
|
||||
from azure.mgmt.apimanagement import ApiManagementClient
|
||||
import os
|
||||
|
||||
client = ApiManagementClient(
|
||||
credential=DefaultAzureCredential(),
|
||||
subscription_id=os.environ["AZURE_SUBSCRIPTION_ID"]
|
||||
)
|
||||
```
|
||||
|
||||
## Create APIM Service
|
||||
|
||||
```python
|
||||
from azure.mgmt.apimanagement.models import (
|
||||
ApiManagementServiceResource,
|
||||
ApiManagementServiceSkuProperties,
|
||||
SkuType
|
||||
)
|
||||
|
||||
service = client.api_management_service.begin_create_or_update(
|
||||
resource_group_name="my-resource-group",
|
||||
service_name="my-apim",
|
||||
parameters=ApiManagementServiceResource(
|
||||
location="eastus",
|
||||
publisher_email="admin@example.com",
|
||||
publisher_name="My Organization",
|
||||
sku=ApiManagementServiceSkuProperties(
|
||||
name=SkuType.DEVELOPER,
|
||||
capacity=1
|
||||
)
|
||||
)
|
||||
).result()
|
||||
|
||||
print(f"Created APIM: {service.name}")
|
||||
```
|
||||
|
||||
## Import API from OpenAPI
|
||||
|
||||
```python
|
||||
from azure.mgmt.apimanagement.models import (
|
||||
ApiCreateOrUpdateParameter,
|
||||
ContentFormat,
|
||||
Protocol
|
||||
)
|
||||
|
||||
api = client.api.begin_create_or_update(
|
||||
resource_group_name="my-resource-group",
|
||||
service_name="my-apim",
|
||||
api_id="my-api",
|
||||
parameters=ApiCreateOrUpdateParameter(
|
||||
display_name="My API",
|
||||
path="myapi",
|
||||
protocols=[Protocol.HTTPS],
|
||||
format=ContentFormat.OPENAPI_JSON,
|
||||
value='{"openapi": "3.0.0", "info": {"title": "My API", "version": "1.0"}, "paths": {"/health": {"get": {"responses": {"200": {"description": "OK"}}}}}}'
|
||||
)
|
||||
).result()
|
||||
|
||||
print(f"Imported API: {api.display_name}")
|
||||
```
|
||||
|
||||
## Import API from URL
|
||||
|
||||
```python
|
||||
api = client.api.begin_create_or_update(
|
||||
resource_group_name="my-resource-group",
|
||||
service_name="my-apim",
|
||||
api_id="petstore",
|
||||
parameters=ApiCreateOrUpdateParameter(
|
||||
display_name="Petstore API",
|
||||
path="petstore",
|
||||
protocols=[Protocol.HTTPS],
|
||||
format=ContentFormat.OPENAPI_LINK,
|
||||
value="https://petstore.swagger.io/v2/swagger.json"
|
||||
)
|
||||
).result()
|
||||
```
|
||||
|
||||
## List APIs
|
||||
|
||||
```python
|
||||
apis = client.api.list_by_service(
|
||||
resource_group_name="my-resource-group",
|
||||
service_name="my-apim"
|
||||
)
|
||||
|
||||
for api in apis:
|
||||
print(f"{api.name}: {api.display_name} - {api.path}")
|
||||
```
|
||||
|
||||
## Create Product
|
||||
|
||||
```python
|
||||
from azure.mgmt.apimanagement.models import ProductContract
|
||||
|
||||
product = client.product.create_or_update(
|
||||
resource_group_name="my-resource-group",
|
||||
service_name="my-apim",
|
||||
product_id="premium",
|
||||
parameters=ProductContract(
|
||||
display_name="Premium",
|
||||
description="Premium tier with unlimited access",
|
||||
subscription_required=True,
|
||||
approval_required=False,
|
||||
state="published"
|
||||
)
|
||||
)
|
||||
|
||||
print(f"Created product: {product.display_name}")
|
||||
```
|
||||
|
||||
## Add API to Product
|
||||
|
||||
```python
|
||||
client.product_api.create_or_update(
|
||||
resource_group_name="my-resource-group",
|
||||
service_name="my-apim",
|
||||
product_id="premium",
|
||||
api_id="my-api"
|
||||
)
|
||||
```
|
||||
|
||||
## Create Subscription
|
||||
|
||||
```python
|
||||
from azure.mgmt.apimanagement.models import SubscriptionCreateParameters
|
||||
|
||||
subscription = client.subscription.create_or_update(
|
||||
resource_group_name="my-resource-group",
|
||||
service_name="my-apim",
|
||||
sid="my-subscription",
|
||||
parameters=SubscriptionCreateParameters(
|
||||
display_name="My Subscription",
|
||||
scope=f"/products/premium",
|
||||
state="active"
|
||||
)
|
||||
)
|
||||
|
||||
print(f"Subscription key: {subscription.primary_key}")
|
||||
```
|
||||
|
||||
## Set API Policy
|
||||
|
||||
```python
|
||||
from azure.mgmt.apimanagement.models import PolicyContract
|
||||
|
||||
policy_xml = """
|
||||
<policies>
|
||||
<inbound>
|
||||
<rate-limit calls="100" renewal-period="60" />
|
||||
<set-header name="X-Custom-Header" exists-action="override">
|
||||
<value>CustomValue</value>
|
||||
</set-header>
|
||||
</inbound>
|
||||
<backend>
|
||||
<forward-request />
|
||||
</backend>
|
||||
<outbound />
|
||||
<on-error />
|
||||
</policies>
|
||||
"""
|
||||
|
||||
client.api_policy.create_or_update(
|
||||
resource_group_name="my-resource-group",
|
||||
service_name="my-apim",
|
||||
api_id="my-api",
|
||||
policy_id="policy",
|
||||
parameters=PolicyContract(
|
||||
value=policy_xml,
|
||||
format="xml"
|
||||
)
|
||||
)
|
||||
```
|
||||
|
||||
## Create Named Value (Secret)
|
||||
|
||||
```python
|
||||
from azure.mgmt.apimanagement.models import NamedValueCreateContract
|
||||
|
||||
named_value = client.named_value.begin_create_or_update(
|
||||
resource_group_name="my-resource-group",
|
||||
service_name="my-apim",
|
||||
named_value_id="backend-api-key",
|
||||
parameters=NamedValueCreateContract(
|
||||
display_name="Backend API Key",
|
||||
value="secret-key-value",
|
||||
secret=True
|
||||
)
|
||||
).result()
|
||||
```
|
||||
|
||||
## Create Backend
|
||||
|
||||
```python
|
||||
from azure.mgmt.apimanagement.models import BackendContract
|
||||
|
||||
backend = client.backend.create_or_update(
|
||||
resource_group_name="my-resource-group",
|
||||
service_name="my-apim",
|
||||
backend_id="my-backend",
|
||||
parameters=BackendContract(
|
||||
url="https://api.backend.example.com",
|
||||
protocol="http",
|
||||
description="My backend service"
|
||||
)
|
||||
)
|
||||
```
|
||||
|
||||
## Create User
|
||||
|
||||
```python
|
||||
from azure.mgmt.apimanagement.models import UserCreateParameters
|
||||
|
||||
user = client.user.create_or_update(
|
||||
resource_group_name="my-resource-group",
|
||||
service_name="my-apim",
|
||||
user_id="newuser",
|
||||
parameters=UserCreateParameters(
|
||||
email="user@example.com",
|
||||
first_name="John",
|
||||
last_name="Doe"
|
||||
)
|
||||
)
|
||||
```
|
||||
|
||||
## Operation Groups
|
||||
|
||||
| Group | Purpose |
|
||||
|-------|---------|
|
||||
| `api_management_service` | APIM instance management |
|
||||
| `api` | API operations |
|
||||
| `api_operation` | API operation details |
|
||||
| `api_policy` | API-level policies |
|
||||
| `product` | Product management |
|
||||
| `product_api` | Product-API associations |
|
||||
| `subscription` | Subscription management |
|
||||
| `user` | User management |
|
||||
| `named_value` | Named values/secrets |
|
||||
| `backend` | Backend services |
|
||||
| `certificate` | Certificates |
|
||||
| `gateway` | Self-hosted gateways |
|
||||
|
||||
## Best Practices
|
||||
|
||||
1. **Use named values** for secrets and configuration
|
||||
2. **Apply policies** at appropriate scopes (global, product, API, operation)
|
||||
3. **Use products** to bundle APIs and manage access
|
||||
4. **Enable Application Insights** for monitoring
|
||||
5. **Use backends** to abstract backend services
|
||||
6. **Version your APIs** using APIM's versioning features
|
||||
Reference in New Issue
Block a user