Documentation
¶
Index ¶
- Constants
- Variables
- type BlobAttrs
- type BlobInfo
- type BlobPage
- type BlockEntry
- type BlockList
- type BlockRef
- type ConfigProvider
- type ContainerInfo
- type ContainerOptions
- type ContainerPage
- type FindBlobsOptions
- type FindBlobsPage
- type FoundBlob
- type Handler
- func (h *Handler) ExtractOperation(c *echo.Context) string
- func (h *Handler) ExtractResource(c *echo.Context) string
- func (h *Handler) GetSupportedOperations() []string
- func (h *Handler) Handler() echo.HandlerFunc
- func (h *Handler) MatchPriority() int
- func (h *Handler) Name() string
- func (h *Handler) Reset()
- func (h *Handler) Restore(ctx context.Context, data []byte) error
- func (h *Handler) RouteMatcher() service.Matcher
- func (h *Handler) Shutdown(ctx context.Context)
- func (h *Handler) Snapshot(ctx context.Context) []byte
- func (h *Handler) StartWorker(ctx context.Context) error
- type InMemoryBackend
- func (b *InMemoryBackend) CommitBlockList(container, blob string, refs []BlockRef, attrs BlobAttrs, pre ...Precond) (BlobInfo, error)
- func (b *InMemoryBackend) CopyBlob(srcContainer, srcBlob, srcSnapshot, dstContainer, dstBlob string, ...) (BlobInfo, error)
- func (b *InMemoryBackend) CreateContainer(name string) error
- func (b *InMemoryBackend) CreateContainerWith(name string, opts ContainerOptions) (ContainerInfo, error)
- func (b *InMemoryBackend) DeleteBlob(container, blob string) error
- func (b *InMemoryBackend) DeleteBlobAt(container, blob, snapshot, mode string, pre ...Precond) error
- func (b *InMemoryBackend) DeleteContainer(name string, pre ...Precond) error
- func (b *InMemoryBackend) FindBlobsByTags(container string, opts FindBlobsOptions) (FindBlobsPage, error)
- func (b *InMemoryBackend) GetBlob(container, blob string) (BlobInfo, []byte, error)
- func (b *InMemoryBackend) GetBlobAt(container, blob, snapshot string, pre ...Precond) (BlobInfo, []byte, error)
- func (b *InMemoryBackend) GetBlobTags(container, blob, snapshot string, pre ...Precond) (map[string]string, error)
- func (b *InMemoryBackend) GetBlockList(container, blob, snapshot, listType string, pre ...Precond) (BlockList, error)
- func (b *InMemoryBackend) GetContainer(name string, pre ...Precond) (ContainerInfo, error)
- func (b *InMemoryBackend) HeadBlob(container, blob string) (BlobInfo, error)
- func (b *InMemoryBackend) HeadBlobAt(container, blob, snapshot string, pre ...Precond) (BlobInfo, error)
- func (b *InMemoryBackend) LeaseBlob(container, blob string, req LeaseRequest) (LeaseResult, error)
- func (b *InMemoryBackend) LeaseContainer(container string, req LeaseRequest) (LeaseResult, error)
- func (b *InMemoryBackend) ListBlobs(container string) ([]BlobInfo, error)
- func (b *InMemoryBackend) ListBlobsPage(container string, opts ListBlobsOptions) (BlobPage, error)
- func (b *InMemoryBackend) ListContainers() []ContainerInfo
- func (b *InMemoryBackend) ListContainersPage(opts ListContainersOptions) (ContainerPage, error)
- func (b *InMemoryBackend) PutBlob(container, blob string, data []byte, contentType string) (BlobInfo, error)
- func (b *InMemoryBackend) PutBlobWith(container, blob string, data []byte, attrs BlobAttrs, pre ...Precond) (BlobInfo, error)
- func (b *InMemoryBackend) PutBlock(container, blob, blockID string, data []byte, pre ...Precond) error
- func (b *InMemoryBackend) Reset()
- func (b *InMemoryBackend) Restore(ctx context.Context, data []byte) error
- func (b *InMemoryBackend) SetBlobMetadata(container, blob string, md map[string]string, pre ...Precond) (BlobInfo, error)
- func (b *InMemoryBackend) SetBlobProperties(container, blob string, attrs BlobAttrs, pre ...Precond) (BlobInfo, error)
- func (b *InMemoryBackend) SetBlobTags(container, blob, snapshot string, tags map[string]string, pre ...Precond) error
- func (b *InMemoryBackend) SetBlobTier(container, blob, tier string, pre ...Precond) (string, BlobInfo, error)
- func (b *InMemoryBackend) SetContainerACL(name, publicAccess string, ids []SignedIdentifier, pre ...Precond) (ContainerInfo, error)
- func (b *InMemoryBackend) SetContainerMetadata(name string, md map[string]string, pre ...Precond) (ContainerInfo, error)
- func (b *InMemoryBackend) Snapshot(ctx context.Context) []byte
- func (b *InMemoryBackend) SnapshotBlob(container, blob string, md map[string]string, pre ...Precond) (BlobInfo, error)
- type LeaseProps
- type LeaseRequest
- type LeaseResult
- type ListBlobsOptions
- type ListContainersOptions
- type ListEntry
- type Precond
- type Provider
- type Settings
- type SignedIdentifier
- type StorageBackend
- type StorageError
Constants ¶
const ( // UncommittedBlockTTL is how long a staged block lives without a commit. UncommittedBlockTTL = 7 * 24 * time.Hour // MaxBlocksPerBlob is the Put Block List block-count limit. MaxBlocksPerBlob = 50000 // MaxBlockSize is the largest Put Block body (4000 MiB). MaxBlockSize = 4000 << 20 )
const ( BlockKindCommitted = "Committed" BlockKindUncommitted = "Uncommitted" BlockKindLatest = "Latest" BlockListCommitted = "committed" BlockListUncommitted = "uncommitted" BlockListAll = "all" )
Block kinds in a Put Block List request and values of blocklisttype.
const ( LeaseStateAvailable = "available" LeaseStateLeased = "leased" LeaseStateExpired = "expired" LeaseStateBreaking = "breaking" LeaseStateBroken = "broken" LeaseStatusLocked = "locked" LeaseStatusUnlocked = "unlocked" LeaseDurationInfinite = "infinite" LeaseDurationFixed = "fixed" )
Lease states and statuses as reported in x-ms-lease-state / x-ms-lease-status.
const ( LeaseActionAcquire = "acquire" LeaseActionRenew = "renew" LeaseActionChange = "change" LeaseActionRelease = "release" LeaseActionBreak = "break" )
Values of the x-ms-lease-action header.
const ( TierHot = "Hot" TierCool = "Cool" TierCold = "Cold" TierArchive = "Archive" AccessBlob = "blob" AccessContainer = "container" )
Access tiers and public-access levels accepted by the REST API.
const ( DeleteSnapshotsInclude = "include" DeleteSnapshotsOnly = "only" )
DeleteSnapshots values of the x-ms-delete-snapshots header.
const DefaultPort = 10000
DefaultPort is Azure Blob's fixed, protocol-conventional TCP port. This follows the same pattern as services/iot's MQTT broker (also a fixed, protocol-conventional default -- 1883 -- with a CLI/env override and no shared-pool fallback): pick one default and try to bind exactly that, rather than drawing from cli.go's shared --port-range-start/ --port-range-end PortAlloc pool (used for on-demand ephemeral resources like Lambda function URLs and ElastiCache, not fixed service ports) or inventing an alternative numbering scheme. The default value itself (10000) is Azurite's own Blob service port, so unmodified UseDevelopmentStorage=true-style SDK configuration works out of the box; see AZURE.md section 4 for the full rationale, including why this deliberately does NOT fall back into the shared PortAlloc pool if 10000 is taken (StartWorker fails fast instead -- see handler.go).
const LeaseInfinite = -1
LeaseInfinite is the x-ms-lease-duration value of an infinite lease.
Variables ¶
var ( ErrContainerNotFound = errors.New("azureblob: container not found") ErrContainerAlreadyExists = errors.New("azureblob: container already exists") ErrBlobNotFound = errors.New("azureblob: blob not found") ErrSnapshotsPresent = errors.New("azureblob: blob has snapshots") ErrInvalidMarker = errors.New("azureblob: invalid list marker") // ErrSnapshotContainerNull and ErrSnapshotBlobNull are returned by // Restore when a snapshot's "containers" map (or a container's "Blobs" // map) holds a JSON null entry, which decodes to a nil pointer that // would panic on first dereference if stored as-is. See persistence.go. ErrSnapshotContainerNull = errors.New("azureblob: restore snapshot: container is null") ErrSnapshotBlobNull = errors.New("azureblob: restore snapshot: blob is null") )
Sentinel errors for Azure Blob Storage operations.
var ErrNilAppContext = errors.New("azureblob: nil app context")
ErrNilAppContext is returned when Init is called with a nil AppContext.
Functions ¶
This section is empty.
Types ¶
type BlobAttrs ¶
type BlobAttrs struct {
Metadata map[string]string
Tags map[string]string
ContentType string
ContentEncoding string
ContentLanguage string
ContentDisposition string
CacheControl string
ContentMD5 string
AccessTier string
}
BlobAttrs are the client-settable properties of a blob.
type BlobInfo ¶
type BlobInfo struct {
LastModified time.Time
AccessTierChanged time.Time
Metadata map[string]string
Tags map[string]string
Name string
ContentType string
ContentEncoding string
ContentLanguage string
ContentDisposition string
CacheControl string
ContentMD5 string
ETag string
AccessTier string
Snapshot string
Lease LeaseProps
ContentLength int64
AccessTierInferred bool
}
BlobInfo is a read-only snapshot of a blob (or of one of its snapshots), returned by the StorageBackend blob accessors.
type BlockEntry ¶
BlockEntry is one block of a Get Block List response.
type BlockList ¶
type BlockList struct {
Committed []BlockEntry
Uncommitted []BlockEntry
Blob BlobInfo
HasBlob bool
}
BlockList is the Get Block List result. HasBlob is false when only uncommitted blocks exist.
type ConfigProvider ¶
type ConfigProvider interface {
GetAzureBlobSettings() Settings
}
ConfigProvider is a private interface to extract AzureBlob configuration from the abstract AppContext Config, mirroring services/s3.ConfigProvider.
type ContainerInfo ¶
type ContainerInfo struct {
CreatedAt time.Time
LastModified time.Time
Metadata map[string]string
Lease LeaseProps
Name string
ETag string
PublicAccess string
ACL []SignedIdentifier
}
ContainerInfo is a read-only snapshot of a container, returned by the StorageBackend container accessors. It carries no reference to backend storage.
type ContainerOptions ¶
ContainerOptions are the create-time settings of a container.
type ContainerPage ¶
type ContainerPage struct {
NextMarker string
Containers []ContainerInfo
}
ContainerPage is one page of a List Containers response.
type FindBlobsOptions ¶
FindBlobsOptions are the Find Blobs by Tags parameters. Container is empty for account scope; the filter's own @container clause narrows it further.
type FindBlobsPage ¶
FindBlobsPage is one page of a Find Blobs by Tags response.
type Handler ¶
type Handler struct {
Backend StorageBackend
// Endpoint is e.g. "http://127.0.0.1:10000" -- used to build
// ServiceEndpoint in list responses.
Endpoint string
// Port is the TCP port StartWorker binds. Set from Settings at Init time
// (see provider.go); defaults to DefaultPort. Unlike a per-resource
// ephemeral allocation, this is a single fixed, protocol-conventional
// port (mirroring services/iot's MQTT broker) -- there is no fallback
// pool, so StartWorker fails fast if it's unavailable rather than
// silently binding a different port.
Port int
// EnforcePublicAccess makes anonymous requests honour container
// public-access levels; off, anonymous access is unrestricted.
EnforcePublicAccess bool
// contains filtered or unexported fields
}
Handler is the Echo HTTP handler for Azure Blob Storage operations.
func NewHandler ¶
func NewHandler(backend StorageBackend) *Handler
NewHandler creates a new Azure Blob Handler. Port defaults to DefaultPort; callers (typically provider.go) override it from Settings.
func (*Handler) ExtractOperation ¶
ExtractOperation extracts the Azure Blob operation name from the request, for metrics labeling.
func (*Handler) ExtractResource ¶
ExtractResource extracts the container/blob resource identifier from the request path, for metrics labeling.
func (*Handler) GetSupportedOperations ¶
GetSupportedOperations returns the list of supported Azure Blob operations.
func (*Handler) Handler ¶
func (h *Handler) Handler() echo.HandlerFunc
Handler returns the Echo handler function for Azure Blob operations.
func (*Handler) MatchPriority ¶
MatchPriority returns the routing priority for the AzureBlob handler. Irrelevant in practice since RouteMatcher never matches; 0 (lowest) is the safe default.
func (*Handler) Reset ¶
func (h *Handler) Reset()
Reset clears all in-memory state from the backend. It is used by the POST /_gopherstack/reset endpoint for CI pipelines and rapid local development.
func (*Handler) RouteMatcher ¶
RouteMatcher exists only to satisfy service.Registerable's interface contract: AzureBlob deliberately never matches on the shared AWS single-port Router. It runs on its own dedicated listener started by StartWorker (see provider.go for the full rationale). AzureBlob's Provider IS registered in cli.go's getMostRecentServiceProviders like every other service -- startBackgroundWorkers calls StartWorker via the service.BackgroundWorker interface regardless of routing, which is how the dedicated listener comes up. Only RouteMatcher itself is inert, kept so *Handler satisfies service.Registerable.
func (*Handler) Shutdown ¶
Shutdown stops the dedicated Blob listener. A graceful Shutdown error (e.g. its context expiring before active connections finish) is logged and followed by Close, which forcibly closes the listener and any remaining idle/active connections; any Close error is logged too rather than leaving the listener to leak silently.
func (*Handler) Snapshot ¶
Snapshot implements persistence.Persistable by delegating to the backend.
func (*Handler) StartWorker ¶
StartWorker binds the dedicated Blob listener and starts serving on it. See provider.go's Provider doc comment for why AzureBlob needs its own listener instead of registering into the shared AWS Router.
Binding is synchronous: net.Listen returns before StartWorker does, so a bind failure is returned to the caller directly instead of only being logged from the background goroutine after startup has already reported success. This mirrors services/iot's MQTT broker (services/iot/broker.go), gopherstack's existing precedent for a service with a fixed, protocol-conventional default port: bind exactly the configured port (h.Port, from Settings -- see settings.go/provider.go) and fail fast if that's unavailable, rather than silently falling back into the shared --port-range-start/--port-range-end PortAlloc pool used for on-demand ephemeral resources elsewhere (Lambda function URLs, ElastiCache). A fallback there would be just as surprising as picking a different default port number outright: either way, an SDK relying on the well-known default (UseDevelopmentStorage=true-style config) would silently end up talking to the wrong port. Failing fast surfaces the conflict instead.
type InMemoryBackend ¶
type InMemoryBackend struct {
// contains filtered or unexported fields
}
InMemoryBackend implements StorageBackend using in-memory maps guarded by a single RWMutex. Shaped after services/sqs's InMemoryBackend, but simpler: Azure Blob's MVP surface (see AZURE.md/PARITY.md) has no janitor, no metrics emitter, and no cross-resource relationships to track, so a single coarse lock over one map of containers is sufficient.
func NewInMemoryBackend ¶
func NewInMemoryBackend() *InMemoryBackend
NewInMemoryBackend creates a new empty InMemoryBackend.
func NewInMemoryBackendWithClock ¶
func NewInMemoryBackendWithClock(clock func() time.Time) *InMemoryBackend
NewInMemoryBackendWithClock is NewInMemoryBackend with an injectable clock driving timestamps, lease expiry and uncommitted-block expiry.
func (*InMemoryBackend) CommitBlockList ¶
func (b *InMemoryBackend) CommitBlockList( container, blob string, refs []BlockRef, attrs BlobAttrs, pre ...Precond, ) (BlobInfo, error)
CommitBlockList assembles blob from staged and committed blocks, then discards every uncommitted block of the blob.
func (*InMemoryBackend) CopyBlob ¶
func (b *InMemoryBackend) CopyBlob( srcContainer, srcBlob, srcSnapshot, dstContainer, dstBlob string, md, tags map[string]string, pre ...Precond, ) (BlobInfo, error)
CopyBlob copies a blob (or snapshot) within the account. A nil md inherits the source metadata; tags are never inherited, only the given ones apply.
func (*InMemoryBackend) CreateContainer ¶
func (b *InMemoryBackend) CreateContainer(name string) error
CreateContainer creates a new, empty container with default settings.
func (*InMemoryBackend) CreateContainerWith ¶
func (b *InMemoryBackend) CreateContainerWith(name string, opts ContainerOptions) (ContainerInfo, error)
CreateContainerWith creates a container with metadata and a public-access level. Returns ErrContainerAlreadyExists if the name is taken.
func (*InMemoryBackend) DeleteBlob ¶
func (b *InMemoryBackend) DeleteBlob(container, blob string) error
DeleteBlob removes a blob that has no snapshots.
func (*InMemoryBackend) DeleteBlobAt ¶
func (b *InMemoryBackend) DeleteBlobAt(container, blob, snapshot, mode string, pre ...Precond) error
DeleteBlobAt deletes a snapshot (snapshot != ""), or the base blob subject to the x-ms-delete-snapshots mode: with snapshots present, "" fails with ErrSnapshotsPresent, "include" removes all, "only" removes just snapshots.
func (*InMemoryBackend) DeleteContainer ¶
func (b *InMemoryBackend) DeleteContainer(name string, pre ...Precond) error
DeleteContainer removes a container and all of its blobs. Returns ErrContainerNotFound if the container does not exist. An active container lease requires the matching lease id.
func (*InMemoryBackend) FindBlobsByTags ¶
func (b *InMemoryBackend) FindBlobsByTags(container string, opts FindBlobsOptions) (FindBlobsPage, error)
FindBlobsByTags lists base blobs whose tags satisfy the filter, ordered by container then blob name, with marker paging.
func (*InMemoryBackend) GetBlob ¶
func (b *InMemoryBackend) GetBlob(container, blob string) (BlobInfo, []byte, error)
GetBlob returns a blob's metadata and full body; the slice is immutable backend storage and must not be modified.
func (*InMemoryBackend) GetBlobAt ¶
func (b *InMemoryBackend) GetBlobAt(container, blob, snapshot string, pre ...Precond) (BlobInfo, []byte, error)
GetBlobAt is GetBlob for the base blob (snapshot == "") or one snapshot. Conditional headers and an optional lease id are evaluated.
func (*InMemoryBackend) GetBlobTags ¶
func (b *InMemoryBackend) GetBlobTags( container, blob, snapshot string, pre ...Precond, ) (map[string]string, error)
GetBlobTags returns a copy of a blob's or snapshot's tags.
func (*InMemoryBackend) GetBlockList ¶
func (b *InMemoryBackend) GetBlockList( container, blob, snapshot, listType string, pre ...Precond, ) (BlockList, error)
GetBlockList lists committed and/or uncommitted blocks. listType is "committed", "uncommitted" or "all".
func (*InMemoryBackend) GetContainer ¶
func (b *InMemoryBackend) GetContainer(name string, pre ...Precond) (ContainerInfo, error)
GetContainer returns a container's properties, metadata and ACL. A lease id, when given, must match an active lease.
func (*InMemoryBackend) HeadBlob ¶
func (b *InMemoryBackend) HeadBlob(container, blob string) (BlobInfo, error)
HeadBlob returns a blob's metadata without its body.
func (*InMemoryBackend) HeadBlobAt ¶
func (b *InMemoryBackend) HeadBlobAt(container, blob, snapshot string, pre ...Precond) (BlobInfo, error)
HeadBlobAt is HeadBlob for the base blob (snapshot == "") or one snapshot.
func (*InMemoryBackend) LeaseBlob ¶
func (b *InMemoryBackend) LeaseBlob(container, blob string, req LeaseRequest) (LeaseResult, error)
LeaseBlob runs a lease action on a blob. Conditional headers apply.
func (*InMemoryBackend) LeaseContainer ¶
func (b *InMemoryBackend) LeaseContainer(container string, req LeaseRequest) (LeaseResult, error)
LeaseContainer runs a lease action on a container.
func (*InMemoryBackend) ListBlobs ¶
func (b *InMemoryBackend) ListBlobs(container string) ([]BlobInfo, error)
ListBlobs returns every base blob in container, sorted by name. Returns ErrContainerNotFound if the container does not exist.
func (*InMemoryBackend) ListBlobsPage ¶
func (b *InMemoryBackend) ListBlobsPage(container string, opts ListBlobsOptions) (BlobPage, error)
ListBlobsPage lists blobs with prefix/delimiter collapsing and marker paging. Returns ErrContainerNotFound or ErrInvalidMarker.
func (*InMemoryBackend) ListContainers ¶
func (b *InMemoryBackend) ListContainers() []ContainerInfo
ListContainers returns a snapshot of all containers, sorted by name (the order Azure's List Containers returns them in).
func (*InMemoryBackend) ListContainersPage ¶
func (b *InMemoryBackend) ListContainersPage(opts ListContainersOptions) (ContainerPage, error)
ListContainersPage lists containers with prefix filtering and marker paging. Returns ErrInvalidMarker for a marker it did not issue.
func (*InMemoryBackend) PutBlob ¶
func (b *InMemoryBackend) PutBlob(container, blob string, data []byte, contentType string) (BlobInfo, error)
PutBlob stores data as a block blob with only a content type set.
func (*InMemoryBackend) PutBlobWith ¶
func (b *InMemoryBackend) PutBlobWith( container, blob string, data []byte, attrs BlobAttrs, pre ...Precond, ) (BlobInfo, error)
PutBlobWith stores data as a block blob named blob within container, replacing any existing blob but keeping its snapshots and lease, as Azure does. Returns ErrContainerNotFound if the container does not exist.
func (*InMemoryBackend) PutBlock ¶
func (b *InMemoryBackend) PutBlock(container, blob, blockID string, data []byte, pre ...Precond) error
PutBlock stages an uncommitted block for blob. All block ids of a blob must decode to the same length. The blob need not exist yet.
func (*InMemoryBackend) Reset ¶
func (b *InMemoryBackend) Reset()
Reset clears all in-memory state. It is used by the POST /_gopherstack/reset endpoint for CI pipelines and rapid local development.
func (*InMemoryBackend) Restore ¶
func (b *InMemoryBackend) Restore(ctx context.Context, data []byte) error
Restore loads backend state from a JSON snapshot. It implements persistence.Persistable.
func (*InMemoryBackend) SetBlobMetadata ¶
func (b *InMemoryBackend) SetBlobMetadata( container, blob string, md map[string]string, pre ...Precond, ) (BlobInfo, error)
SetBlobMetadata replaces a blob's metadata.
func (*InMemoryBackend) SetBlobProperties ¶
func (b *InMemoryBackend) SetBlobProperties( container, blob string, attrs BlobAttrs, pre ...Precond, ) (BlobInfo, error)
SetBlobProperties replaces the content properties of a blob. Properties absent from attrs are cleared, as in Set Blob Properties.
func (*InMemoryBackend) SetBlobTags ¶
func (b *InMemoryBackend) SetBlobTags( container, blob, snapshot string, tags map[string]string, pre ...Precond, ) error
SetBlobTags replaces all tags of a blob or snapshot. ETag and Last-Modified are unchanged.
func (*InMemoryBackend) SetBlobTier ¶
func (b *InMemoryBackend) SetBlobTier(container, blob, tier string, pre ...Precond) (string, BlobInfo, error)
SetBlobTier sets the access tier and returns the tier it replaced.
func (*InMemoryBackend) SetContainerACL ¶
func (b *InMemoryBackend) SetContainerACL( name, publicAccess string, ids []SignedIdentifier, pre ...Precond, ) (ContainerInfo, error)
SetContainerACL replaces a container's public-access level and stored access policies.
func (*InMemoryBackend) SetContainerMetadata ¶
func (b *InMemoryBackend) SetContainerMetadata( name string, md map[string]string, pre ...Precond, ) (ContainerInfo, error)
SetContainerMetadata replaces a container's metadata.
func (*InMemoryBackend) Snapshot ¶
func (b *InMemoryBackend) Snapshot(ctx context.Context) []byte
Snapshot serialises the backend state to JSON. It implements persistence.Persistable.
func (*InMemoryBackend) SnapshotBlob ¶
func (b *InMemoryBackend) SnapshotBlob(container, blob string, md map[string]string, pre ...Precond) (BlobInfo, error)
SnapshotBlob freezes a copy of the blob. A nil md inherits the blob's metadata; a non-nil md (even empty) replaces it.
type LeaseProps ¶
LeaseProps are the lease fields reported in blob and container properties.
type LeaseRequest ¶
type LeaseRequest struct {
Action string
ID string
ProposedID string
Cond Precond
// Duration is seconds, or LeaseInfinite; used by acquire.
Duration int
// BreakPeriod is seconds; used by break when HasBreakPeriod.
BreakPeriod int
HasBreakPeriod bool
}
LeaseRequest is one Lease Blob / Lease Container call.
type LeaseResult ¶
type LeaseResult struct {
LastModified time.Time
ID string
ETag string
// BreakRemaining is x-ms-lease-time, whole seconds left in the break period.
BreakRemaining int
}
LeaseResult is the outcome of a lease call.
type ListBlobsOptions ¶
type ListBlobsOptions struct {
Prefix string
Delimiter string
Marker string
MaxResults int
IncludeSnapshots bool
IncludeTags bool
}
ListBlobsOptions are the List Blobs query parameters.
type ListContainersOptions ¶
ListContainersOptions are the List Containers query parameters.
type ListEntry ¶
type ListEntry struct {
Prefix string
Blob BlobInfo
// IsPrefix selects Prefix over Blob.
IsPrefix bool
}
ListEntry is one item of a List Blobs page: a blob or a BlobPrefix.
type Precond ¶
type Precond struct {
Source *Precond
IfModifiedSince time.Time
IfUnmodifiedSince time.Time
IfMatch string
IfNoneMatch string
IfTags string
LeaseID string
}
Precond carries the conditional headers and lease id of one request. Zero time and empty string mean "header absent". Source holds the x-ms-source-if-* conditions of copy-style operations.
type Provider ¶
type Provider struct{}
Provider implements service.Provider for the Azure Blob Storage service.
Unlike every other provider in this repo, AzureBlob does not register a RouteMatcher into the shared AWS single-port Router: Azure Blob's path shape (/<account>/<container>/<blob>) has no service-identifying header the way AWS's X-Amz-Target does, so multiplexing it onto the shared port risks exactly the collision the router avoids by construction for AWS services (see AZURE.md section 4). Instead the returned Handler implements service.BackgroundWorker and stands up its own dedicated *echo.Echo/ *http.Server, listening on a fixed, protocol-conventional port -- the same pattern services/iot's MQTT broker already uses in this repo for a well-known port (1883) that isn't part of the shared AWS request/response cycle. It is registered in cli.go's getMostRecentServiceProviders like every other provider; only its RouteMatcher (which always returns false) is inert.
func (*Provider) Init ¶
func (p *Provider) Init(ctx *service.AppContext) (service.Registerable, error)
Init initializes the AzureBlob service backend and handler. The configured port (Settings.Port, default DefaultPort) is only recorded here; the actual TCP bind happens synchronously in Handler.StartWorker, so a port-in-use failure is returned to the caller directly instead of being discovered later from a background goroutine.
type Settings ¶
type Settings struct {
// Port is the fixed TCP port for the dedicated Blob listener. See
// handler.go's StartWorker for what happens when it's unavailable
// (fails fast; no fallback pool, matching services/iot's MQTT broker).
Port int `` //nolint:lll // config struct tags are intentionally verbose
/* 176-byte string literal not displayed */
// EnforcePublicAccess rejects anonymous requests the container's public-access level does not allow.
EnforcePublicAccess bool `` //nolint:lll // config struct tags are intentionally verbose
/* 247-byte string literal not displayed */
}
Settings holds service-level configuration for the Azure Blob backend. Fields are picked up by the Kong CLI parser when this struct is embedded in the root CLI command (see cli.go's CLI.AzureBlob field), mirroring services/s3'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 SignedIdentifier ¶
SignedIdentifier is one stored access policy of a container ACL.
type StorageBackend ¶
type StorageBackend interface {
CreateContainerWith(name string, opts ContainerOptions) (ContainerInfo, error)
DeleteContainer(name string, pre ...Precond) error
ListContainers() []ContainerInfo
ListContainersPage(opts ListContainersOptions) (ContainerPage, error)
GetContainer(name string, pre ...Precond) (ContainerInfo, error)
SetContainerMetadata(name string, md map[string]string, pre ...Precond) (ContainerInfo, error)
SetContainerACL(name, publicAccess string, ids []SignedIdentifier, pre ...Precond) (ContainerInfo, error)
LeaseContainer(container string, req LeaseRequest) (LeaseResult, error)
PutBlobWith(container, blob string, data []byte, attrs BlobAttrs, pre ...Precond) (BlobInfo, error)
GetBlobAt(container, blob, snapshot string, pre ...Precond) (BlobInfo, []byte, error)
HeadBlobAt(container, blob, snapshot string, pre ...Precond) (BlobInfo, error)
DeleteBlobAt(container, blob, snapshot, mode string, pre ...Precond) error
ListBlobsPage(container string, opts ListBlobsOptions) (BlobPage, error)
SetBlobProperties(container, blob string, attrs BlobAttrs, pre ...Precond) (BlobInfo, error)
SetBlobMetadata(container, blob string, md map[string]string, pre ...Precond) (BlobInfo, error)
SetBlobTier(container, blob, tier string, pre ...Precond) (string, BlobInfo, error)
SnapshotBlob(container, blob string, md map[string]string, pre ...Precond) (BlobInfo, error)
CopyBlob(
srcContainer, srcBlob, srcSnapshot, dstContainer, dstBlob string, md, tags map[string]string, pre ...Precond,
) (BlobInfo, error)
LeaseBlob(container, blob string, req LeaseRequest) (LeaseResult, error)
SetBlobTags(container, blob, snapshot string, tags map[string]string, pre ...Precond) error
GetBlobTags(container, blob, snapshot string, pre ...Precond) (map[string]string, error)
FindBlobsByTags(container string, opts FindBlobsOptions) (FindBlobsPage, error)
PutBlock(container, blob, blockID string, data []byte, pre ...Precond) error
CommitBlockList(container, blob string, refs []BlockRef, attrs BlobAttrs, pre ...Precond) (BlobInfo, error)
GetBlockList(container, blob, snapshot, listType string, pre ...Precond) (BlockList, error)
// Reset clears all in-memory state. Used by the
// POST /_gopherstack/reset endpoint for CI pipelines and rapid local development.
Reset()
}
StorageBackend defines the interface for an Azure Blob Storage backend. Shaped after services/sqs's StorageBackend: a narrow, testable seam between the wire handler and storage, so handler tests can substitute a fake.
type StorageError ¶
StorageError is a backend failure that maps one-to-one onto an Azure Storage REST error response. Header is written on 304 responses.
func (*StorageError) Error ¶
func (e *StorageError) Error() string