azurestoragevhost

package
v1.6.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Sep 14, 2026 License: MIT Imports: 12 Imported by: 0

README

Azurestoragevhost

Parity grade: B · SDK hashicorp/terraform-provider-azurerm@v4.81.0 · last audited 2026-09-11 (cbf859f49)

Coverage

Metric Value
PARITY entries audited 2 (2 ok)
Feature families 1 (1 ok)
Known gaps 2
Deferred items 1
Resource leaks clean
Known gaps
  • This package owns no state of its own (Reset/Snapshot/Restore are no-ops); a snapshot/restore cycle on the wired services fully covers vhost-visible data too, so nothing is missing here specifically -- listed for completeness since most services have real persist behavior to audit.
  • GetSupportedOperations() returns nil (no dedicated metrics-op enum); ExtractOperation/ExtractResource parse the Host header only for basic request-metrics labeling, not the fine-grained per-op accounting the wrapped services' own handlers already do internally once delegated to.
Deferred
  • M8 initial implementation (AZURE.md section 10.8 finding (9)). No prior audit passes to report.

More

Documentation

Overview

Package azurestoragevhost is a thin translation layer, not a storage service in its own right: it owns one dedicated listener that accepts virtual-hosted-style Azure Storage requests (Host: "{account}.blob.host:port", ".queue.", ".table.") and rewrites them into the path-style requests services/azureblob, services/azurequeue, and services/azuretable already serve (Host: anything, path "/{account}/...").

Why this exists: terraform-provider-azurerm's Blob/Queue/Table data-plane SDK (jackofallops/giovanni) hard-requires virtual-hosted-style URLs for every one of azurerm_storage_container/_blob/_queue/_table's post-create Read calls (AZURE.md section 10.8's M8 finding). gopherstack's M0-M2 Blob/Queue/Table services are path-style (Azurite-style, "{host}:{port}/{account}/...") -- an already-shipped, independently correct design this package does not change. Both styles now work simultaneously against the exact same backend state: creating a container through this listener and listing it through services/azureblob's own listener (or vice versa) see the same data, because this package never duplicates business logic -- it only rewrites the request, then calls the real service's own Handler() unchanged.

A structural constraint (not a design choice) is why Blob/Queue/Table must share one port here even though they keep three separate ports for path-style access: terraform-provider-azurerm's StorageDomainSuffix is a single shared string used to parse every one of these resources' account IDs back out of their endpoint URL, and Go's url.URL.Host always includes the port -- so one shared suffix can only match a host:port that is itself shared across all three services. See AZURE.md section 10.8 for the full derivation.

Index

Constants

View Source
const DefaultPort = 10010

DefaultPort is the fixed TCP port for the shared virtual-hosted-style storage listener. Unlike services/azureblob/azurequeue/azuretable's own fixed, protocol-conventional ports (10000/10001/10002, chosen to match Azurite's own defaults), this port has no real-Azure or Azurite equivalent -- it exists purely to satisfy terraform-provider-azurerm's data-plane SDK (jackofallops/giovanni), which requires Blob/Queue/Table to share one domain suffix (and therefore one port, since Go's url.URL.Host always includes the port) -- see AZURE.md section 10.8.

Variables

This section is empty.

Functions

This section is empty.

Types

type ConfigProvider

type ConfigProvider interface {
	GetAzureStorageVHostSettings() Settings
}

ConfigProvider is a private interface to extract this service's configuration from the abstract AppContext Config, mirroring services/azureblob.ConfigProvider.

type Handler

type Handler struct {
	// Blob, Queue, and Table are the real services' handlers, wired in
	// post-construction by cli.go's cross-service wiring (Init() runs
	// before those services' own Init() calls are guaranteed to have
	// happened, so these start nil and are set once all services exist).
	Blob  StorageHandler
	Queue StorageHandler
	Table StorageHandler

	// Port is the TCP port StartWorker binds. Set from Settings at Init
	// time; defaults to DefaultPort. Like services/azureblob, this is a
	// single fixed port with no fallback pool -- StartWorker fails fast if
	// it's unavailable.
	Port int
	// contains filtered or unexported fields
}

Handler is the Echo HTTP handler for the shared virtual-hosted-style Azure Storage listener. It holds no storage state of its own -- Blob, Queue, and Table each remain owned entirely by their own service; see the package doc comment.

func NewHandler

func NewHandler() *Handler

NewHandler creates a new virtual-hosted storage Handler. Port defaults to DefaultPort; callers (typically provider.go) override it from Settings. Blob/Queue/Table are nil until wired by cli.go's cross-service wiring.

func (*Handler) ExtractOperation

func (h *Handler) ExtractOperation(c *echo.Context) string

ExtractOperation delegates to the resolved service's own ExtractOperation where possible; metrics for requests that don't resolve to a known service/account are labeled "Unknown".

func (*Handler) ExtractResource

func (h *Handler) ExtractResource(c *echo.Context) string

ExtractResource returns the account name resolved from the Host header, for metrics labeling.

func (*Handler) GetSupportedOperations

func (h *Handler) GetSupportedOperations() []string

GetSupportedOperations returns no operations of its own: every request this listener accepts is delegated verbatim to Blob/Queue/Table's own Handler(), which is what actually reports the operation for metrics (see ExtractOperation).

func (*Handler) Handler

func (h *Handler) Handler() echo.HandlerFunc

Handler returns the Echo handler function for the virtual-hosted storage listener: parse the account/service out of the Host header, rewrite the request path to the path-style shape the real service expects, and delegate to it unchanged.

func (*Handler) MatchPriority

func (h *Handler) MatchPriority() int

MatchPriority returns the routing priority for this handler. Irrelevant in practice since RouteMatcher never matches; 0 (lowest) is the safe default.

func (*Handler) Name

func (h *Handler) Name() string

Name returns the service name.

func (*Handler) Reset

func (h *Handler) Reset()

Reset is a no-op: this listener owns no state of its own to clear (see the package doc comment). Blob/Queue/Table each reset their own state independently when the POST /_gopherstack/reset endpoint calls Reset() on every registered service.

func (*Handler) RouteMatcher

func (h *Handler) RouteMatcher() service.Matcher

RouteMatcher exists only to satisfy service.Registerable's interface contract: like services/azureblob/azurequeue/azuretable, this runs on its own dedicated listener started by StartWorker, never on the shared AWS single-port Router.

func (*Handler) Shutdown

func (h *Handler) Shutdown(ctx context.Context)

Shutdown stops the dedicated virtual-hosted storage listener. Mirrors services/azureblob's Shutdown exactly.

func (*Handler) StartWorker

func (h *Handler) StartWorker(ctx context.Context) error

StartWorker binds the dedicated virtual-hosted storage listener. Mirrors services/azureblob's StartWorker exactly (fixed port, fail-fast, no fallback pool) -- see that function's doc comment for the full rationale.

type Provider

type Provider struct{}

Provider implements service.Provider for the shared Azure Storage virtual-hosted-style listener. See handler.go's package doc comment for why this exists.

Like services/azureblob/azurequeue/azuretable, this does not register a RouteMatcher into the shared AWS single-port Router -- it runs on its own dedicated listener. It is registered in cli.go's getServiceProviders like every other provider; Blob/Queue/Table are wired into the returned Handler afterward, by cli.go's cross-service wiring (they aren't guaranteed to exist yet during Init()).

func (*Provider) Init

Init initializes the virtual-hosted storage Handler. The configured port (Settings.Port, default DefaultPort) is only recorded here; the actual TCP bind happens synchronously in Handler.StartWorker.

func (*Provider) Name

func (p *Provider) Name() string

Name returns the service provider name.

type Settings

type Settings struct {
	// Port is the fixed TCP port for the dedicated virtual-hosted-style
	// storage listener. See handler.go's StartWorker for what happens when
	// it's unavailable (fails fast; no fallback pool, matching
	// services/azureblob/azurequeue/azuretable).
	Port int `` //nolint:lll // config struct tags are intentionally verbose
	/* 252-byte string literal not displayed */
}

Settings holds service-level configuration for the shared Azure Storage virtual-hosted listener. Mirrors services/azureblob's Settings pattern.

func DefaultSettings

func DefaultSettings() Settings

DefaultSettings returns the default Settings. Used when no ConfigProvider is available at init time (e.g. tests constructing a Provider directly).

type StorageHandler

type StorageHandler interface {
	Handler() echo.HandlerFunc
}

StorageHandler is the subset of *azureblob.Handler / *azurequeue.Handler / *azuretable.Handler this package needs: just the Echo handler each already exposes. Kept as an interface (rather than importing those three concrete packages) so this package has no compile-time dependency on their internals -- wiring the concrete *Handler values in happens once, in cli.go's cross-service wiring, exactly like every other already-initialized-handler dependency in this repo (e.g. wireSNSToSQS).

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL