summaryrefslogtreecommitdiff
path: root/workhorse/internal/config/url_openers.go
diff options
context:
space:
mode:
Diffstat (limited to 'workhorse/internal/config/url_openers.go')
-rw-r--r--workhorse/internal/config/url_openers.go51
1 files changed, 51 insertions, 0 deletions
diff --git a/workhorse/internal/config/url_openers.go b/workhorse/internal/config/url_openers.go
new file mode 100644
index 00000000000..d3c96ee9eef
--- /dev/null
+++ b/workhorse/internal/config/url_openers.go
@@ -0,0 +1,51 @@
+package config
+
+import (
+ "context"
+ "fmt"
+ "net/url"
+
+ "gocloud.dev/blob"
+ "gocloud.dev/blob/azureblob"
+)
+
+// This code can be removed once https://github.com/google/go-cloud/pull/2851 is merged.
+
+// URLOpener opens Azure URLs like "azblob://mybucket".
+//
+// The URL host is used as the bucket name.
+//
+// The following query options are supported:
+// - domain: The domain name used to access the Azure Blob storage (e.g. blob.core.windows.net)
+type azureURLOpener struct {
+ *azureblob.URLOpener
+}
+
+func (o *azureURLOpener) OpenBucketURL(ctx context.Context, u *url.URL) (*blob.Bucket, error) {
+ opts := new(azureblob.Options)
+ *opts = o.Options
+
+ err := setOptionsFromURLParams(u.Query(), opts)
+ if err != nil {
+ return nil, err
+ }
+ return azureblob.OpenBucket(ctx, o.Pipeline, o.AccountName, u.Host, opts)
+}
+
+func setOptionsFromURLParams(q url.Values, opts *azureblob.Options) error {
+ for param, values := range q {
+ if len(values) > 1 {
+ return fmt.Errorf("multiple values of %v not allowed", param)
+ }
+
+ value := values[0]
+ switch param {
+ case "domain":
+ opts.StorageDomain = azureblob.StorageDomain(value)
+ default:
+ return fmt.Errorf("unknown query parameter %q", param)
+ }
+ }
+
+ return nil
+}