Skip to content

feat: C.2 - Add Azure support (Key Vault + App Configuration) #136

@mpyw

Description

@mpyw

Parent Issue

Part of #128

Summary

Add support for Azure Key Vault (secrets) and Azure App Configuration (parameters).

Prerequisites

CLI Commands

Key Vault (Secrets)

suve azure --resource-group=my-rg keyvault --vault=my-vault show my-secret
suve azure --resource-group=my-rg keyvault --vault=my-vault log my-secret
suve azure --resource-group=my-rg keyvault --vault=my-vault diff my-secret
suve azure --resource-group=my-rg keyvault --vault=my-vault list

# Staging
suve azure --resource-group=my-rg keyvault --vault=my-vault stage add my-secret

# Alias
suve az --resource-group=my-rg keyvault --vault=my-vault show my-secret

App Configuration (Parameters)

suve azure --resource-group=my-rg appconfig --store=my-store show my-key
suve azure --resource-group=my-rg appconfig --store=my-store list

# Staging
suve azure --resource-group=my-rg appconfig --store=my-store stage add my-key

# Alias
suve az --resource-group=my-rg appconfig --store=my-store show my-key

Version Specification

Service Version Format Notes
Key Vault UUID-like (hex) No labels
App Configuration None Snapshots only, no versioning

Directory Structure

internal/
├── provider/
│   └── azure/
│       ├── keyvault/
│       │   ├── adapter.go
│       │   └── convert.go
│       └── appconfig/
│           ├── adapter.go
│           └── convert.go
├── version/
│   └── azurekeyvaultversion/
│       └── parser.go
└── cli/
    └── commands/
        └── azure/
            ├── app.go
            ├── keyvault/
            │   ├── show.go
            │   ├── log.go
            │   ├── diff.go
            │   └── list.go
            └── appconfig/
                ├── show.go
                └── list.go

Flag Resolution

Resource Group

func resolveResourceGroup(flag string) (string, error) {
    if flag != "" {
        return flag, nil
    }
    if v := os.Getenv("AZURE_DEFAULTS_GROUP"); v != "" {
        return v, nil
    }
    out, err := exec.Command("az", "config", "get", "defaults.group", "-o", "tsv").Output()
    if err == nil && len(out) > 0 {
        return strings.TrimSpace(string(out)), nil
    }
    return "", errors.New("--resource-group required")
}

Vault (no default)

func resolveVault(flag string) (string, error) {
    if flag != "" {
        return flag, nil
    }
    return "", errors.New("--vault required")
}

Store

func resolveStore(flag string) (string, error) {
    if flag != "" {
        return flag, nil
    }
    out, err := exec.Command("az", "config", "get", "defaults.app_configuration_store", "-o", "tsv").Output()
    if err == nil && len(out) > 0 {
        return strings.TrimSpace(string(out)), nil
    }
    return "", errors.New("--store required")
}

Scope

Key Vault

  • Implement internal/provider/azure/keyvault/ adapter
  • Add version spec parser for Key Vault
  • Implement staging support

App Configuration

  • Implement internal/provider/azure/appconfig/ adapter
  • Handle lack of versioning (snapshots only)
  • Implement staging support

Common

  • Add azure command with az alias
  • Add E2E tests with emulators

References

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions