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:
258
skills/azure-mgmt-fabric-py/SKILL.md
Normal file
258
skills/azure-mgmt-fabric-py/SKILL.md
Normal file
@@ -0,0 +1,258 @@
|
||||
---
|
||||
name: azure-mgmt-fabric-py
|
||||
description: |
|
||||
Azure Fabric Management SDK for Python. Use for managing Microsoft Fabric capacities and resources.
|
||||
Triggers: "azure-mgmt-fabric", "FabricMgmtClient", "Fabric capacity", "Microsoft Fabric", "Power BI capacity".
|
||||
---
|
||||
|
||||
# Azure Fabric Management SDK for Python
|
||||
|
||||
Manage Microsoft Fabric capacities and resources programmatically.
|
||||
|
||||
## Installation
|
||||
|
||||
```bash
|
||||
pip install azure-mgmt-fabric
|
||||
pip install azure-identity
|
||||
```
|
||||
|
||||
## Environment Variables
|
||||
|
||||
```bash
|
||||
AZURE_SUBSCRIPTION_ID=<your-subscription-id>
|
||||
AZURE_RESOURCE_GROUP=<your-resource-group>
|
||||
```
|
||||
|
||||
## Authentication
|
||||
|
||||
```python
|
||||
from azure.identity import DefaultAzureCredential
|
||||
from azure.mgmt.fabric import FabricMgmtClient
|
||||
import os
|
||||
|
||||
credential = DefaultAzureCredential()
|
||||
client = FabricMgmtClient(
|
||||
credential=credential,
|
||||
subscription_id=os.environ["AZURE_SUBSCRIPTION_ID"]
|
||||
)
|
||||
```
|
||||
|
||||
## Create Fabric Capacity
|
||||
|
||||
```python
|
||||
from azure.mgmt.fabric import FabricMgmtClient
|
||||
from azure.mgmt.fabric.models import FabricCapacity, FabricCapacityProperties, CapacitySku
|
||||
from azure.identity import DefaultAzureCredential
|
||||
import os
|
||||
|
||||
credential = DefaultAzureCredential()
|
||||
client = FabricMgmtClient(
|
||||
credential=credential,
|
||||
subscription_id=os.environ["AZURE_SUBSCRIPTION_ID"]
|
||||
)
|
||||
|
||||
resource_group = os.environ["AZURE_RESOURCE_GROUP"]
|
||||
capacity_name = "myfabriccapacity"
|
||||
|
||||
capacity = client.fabric_capacities.begin_create_or_update(
|
||||
resource_group_name=resource_group,
|
||||
capacity_name=capacity_name,
|
||||
resource=FabricCapacity(
|
||||
location="eastus",
|
||||
sku=CapacitySku(
|
||||
name="F2", # Fabric SKU
|
||||
tier="Fabric"
|
||||
),
|
||||
properties=FabricCapacityProperties(
|
||||
administration=FabricCapacityAdministration(
|
||||
members=["user@contoso.com"]
|
||||
)
|
||||
)
|
||||
)
|
||||
).result()
|
||||
|
||||
print(f"Capacity created: {capacity.name}")
|
||||
```
|
||||
|
||||
## Get Capacity Details
|
||||
|
||||
```python
|
||||
capacity = client.fabric_capacities.get(
|
||||
resource_group_name=resource_group,
|
||||
capacity_name=capacity_name
|
||||
)
|
||||
|
||||
print(f"Capacity: {capacity.name}")
|
||||
print(f"SKU: {capacity.sku.name}")
|
||||
print(f"State: {capacity.properties.state}")
|
||||
print(f"Location: {capacity.location}")
|
||||
```
|
||||
|
||||
## List Capacities in Resource Group
|
||||
|
||||
```python
|
||||
capacities = client.fabric_capacities.list_by_resource_group(
|
||||
resource_group_name=resource_group
|
||||
)
|
||||
|
||||
for capacity in capacities:
|
||||
print(f"Capacity: {capacity.name} - SKU: {capacity.sku.name}")
|
||||
```
|
||||
|
||||
## List All Capacities in Subscription
|
||||
|
||||
```python
|
||||
all_capacities = client.fabric_capacities.list_by_subscription()
|
||||
|
||||
for capacity in all_capacities:
|
||||
print(f"Capacity: {capacity.name} in {capacity.location}")
|
||||
```
|
||||
|
||||
## Update Capacity
|
||||
|
||||
```python
|
||||
from azure.mgmt.fabric.models import FabricCapacityUpdate, CapacitySku
|
||||
|
||||
updated = client.fabric_capacities.begin_update(
|
||||
resource_group_name=resource_group,
|
||||
capacity_name=capacity_name,
|
||||
properties=FabricCapacityUpdate(
|
||||
sku=CapacitySku(
|
||||
name="F4", # Scale up
|
||||
tier="Fabric"
|
||||
),
|
||||
tags={"environment": "production"}
|
||||
)
|
||||
).result()
|
||||
|
||||
print(f"Updated SKU: {updated.sku.name}")
|
||||
```
|
||||
|
||||
## Suspend Capacity
|
||||
|
||||
Pause capacity to stop billing:
|
||||
|
||||
```python
|
||||
client.fabric_capacities.begin_suspend(
|
||||
resource_group_name=resource_group,
|
||||
capacity_name=capacity_name
|
||||
).result()
|
||||
|
||||
print("Capacity suspended")
|
||||
```
|
||||
|
||||
## Resume Capacity
|
||||
|
||||
Resume a paused capacity:
|
||||
|
||||
```python
|
||||
client.fabric_capacities.begin_resume(
|
||||
resource_group_name=resource_group,
|
||||
capacity_name=capacity_name
|
||||
).result()
|
||||
|
||||
print("Capacity resumed")
|
||||
```
|
||||
|
||||
## Delete Capacity
|
||||
|
||||
```python
|
||||
client.fabric_capacities.begin_delete(
|
||||
resource_group_name=resource_group,
|
||||
capacity_name=capacity_name
|
||||
).result()
|
||||
|
||||
print("Capacity deleted")
|
||||
```
|
||||
|
||||
## Check Name Availability
|
||||
|
||||
```python
|
||||
from azure.mgmt.fabric.models import CheckNameAvailabilityRequest
|
||||
|
||||
result = client.fabric_capacities.check_name_availability(
|
||||
location="eastus",
|
||||
body=CheckNameAvailabilityRequest(
|
||||
name="my-new-capacity",
|
||||
type="Microsoft.Fabric/capacities"
|
||||
)
|
||||
)
|
||||
|
||||
if result.name_available:
|
||||
print("Name is available")
|
||||
else:
|
||||
print(f"Name not available: {result.reason}")
|
||||
```
|
||||
|
||||
## List Available SKUs
|
||||
|
||||
```python
|
||||
skus = client.fabric_capacities.list_skus(
|
||||
resource_group_name=resource_group,
|
||||
capacity_name=capacity_name
|
||||
)
|
||||
|
||||
for sku in skus:
|
||||
print(f"SKU: {sku.name} - Tier: {sku.tier}")
|
||||
```
|
||||
|
||||
## Client Operations
|
||||
|
||||
| Operation | Method |
|
||||
|-----------|--------|
|
||||
| `client.fabric_capacities` | Capacity CRUD operations |
|
||||
| `client.operations` | List available operations |
|
||||
|
||||
## Fabric SKUs
|
||||
|
||||
| SKU | Description | CUs |
|
||||
|-----|-------------|-----|
|
||||
| `F2` | Entry level | 2 Capacity Units |
|
||||
| `F4` | Small | 4 Capacity Units |
|
||||
| `F8` | Medium | 8 Capacity Units |
|
||||
| `F16` | Large | 16 Capacity Units |
|
||||
| `F32` | X-Large | 32 Capacity Units |
|
||||
| `F64` | 2X-Large | 64 Capacity Units |
|
||||
| `F128` | 4X-Large | 128 Capacity Units |
|
||||
| `F256` | 8X-Large | 256 Capacity Units |
|
||||
| `F512` | 16X-Large | 512 Capacity Units |
|
||||
| `F1024` | 32X-Large | 1024 Capacity Units |
|
||||
| `F2048` | 64X-Large | 2048 Capacity Units |
|
||||
|
||||
## Capacity States
|
||||
|
||||
| State | Description |
|
||||
|-------|-------------|
|
||||
| `Active` | Capacity is running |
|
||||
| `Paused` | Capacity is suspended (no billing) |
|
||||
| `Provisioning` | Being created |
|
||||
| `Updating` | Being modified |
|
||||
| `Deleting` | Being removed |
|
||||
| `Failed` | Operation failed |
|
||||
|
||||
## Long-Running Operations
|
||||
|
||||
All mutating operations are long-running (LRO). Use `.result()` to wait:
|
||||
|
||||
```python
|
||||
# Synchronous wait
|
||||
capacity = client.fabric_capacities.begin_create_or_update(...).result()
|
||||
|
||||
# Or poll manually
|
||||
poller = client.fabric_capacities.begin_create_or_update(...)
|
||||
while not poller.done():
|
||||
print(f"Status: {poller.status()}")
|
||||
time.sleep(5)
|
||||
capacity = poller.result()
|
||||
```
|
||||
|
||||
## Best Practices
|
||||
|
||||
1. **Use DefaultAzureCredential** for authentication
|
||||
2. **Suspend unused capacities** to reduce costs
|
||||
3. **Start with smaller SKUs** and scale up as needed
|
||||
4. **Use tags** for cost tracking and organization
|
||||
5. **Check name availability** before creating capacities
|
||||
6. **Handle LRO properly** — don't assume immediate completion
|
||||
7. **Set up capacity admins** — specify users who can manage workspaces
|
||||
8. **Monitor capacity usage** via Azure Monitor metrics
|
||||
Reference in New Issue
Block a user