From c1d3587ad78ee67ad0ddd3cd66d3b4411f16f083 Mon Sep 17 00:00:00 2001 From: Itai Gilo Date: Wed, 15 Jan 2025 13:41:21 +0000 Subject: [PATCH 01/26] Add StorageID to Repository entity --- api/swagger.yml | 6 + clients/java/api/openapi.yaml | 10 + clients/java/docs/Repository.md | 1 + clients/java/docs/RepositoryCreation.md | 1 + .../lakefs/clients/sdk/model/Repository.java | 33 +- .../clients/sdk/model/RepositoryCreation.java | 33 +- .../sdk/model/RepositoryCreationTest.java | 8 + .../clients/sdk/model/RepositoryTest.java | 8 + clients/python/docs/Repository.md | 1 + clients/python/docs/RepositoryCreation.md | 1 + .../python/lakefs_sdk/models/repository.py | 4 +- .../lakefs_sdk/models/repository_creation.py | 4 +- clients/python/test/test_repository.py | 1 + .../python/test/test_repository_creation.py | 1 + clients/python/test/test_repository_list.py | 2 + clients/rust/docs/Repository.md | 1 + clients/rust/docs/RepositoryCreation.md | 1 + clients/rust/src/models/repository.rs | 4 + .../rust/src/models/repository_creation.rs | 4 + docs/assets/js/swagger.yml | 6 + pkg/api/controller.go | 10 +- pkg/api/controller_test.go | 179 +++++----- pkg/catalog/catalog.go | 16 +- pkg/catalog/catalog_test.go | 55 +-- pkg/catalog/fake_graveler_test.go | 4 +- pkg/catalog/model.go | 1 + pkg/gateway/testutil/gateway_setup.go | 3 +- pkg/graveler/graveler.go | 23 +- pkg/graveler/graveler.pb.go | 334 +++++++++--------- pkg/graveler/graveler.proto | 1 + pkg/graveler/model.go | 2 + pkg/graveler/validate.go | 10 + 32 files changed, 470 insertions(+), 298 deletions(-) diff --git a/api/swagger.yml b/api/swagger.yml index 8bbd763c01f..039303747f9 100644 --- a/api/swagger.yml +++ b/api/swagger.yml @@ -184,6 +184,9 @@ components: description: Unix Epoch in seconds default_branch: type: string + storage_id: + type: string + description: Unique identifier of the underlying data store storage_namespace: type: string description: Filesystem URI to store the underlying data in (e.g. "s3://my-bucket/some/path/") @@ -264,6 +267,9 @@ components: name: type: string pattern: "^[a-z0-9][a-z0-9-]{2,62}$" + storage_id: + type: string + description: Unique identifier of the underlying data store storage_namespace: type: string description: 'Filesystem URI to store the underlying data in (e.g. "s3://my-bucket/some/path/")' diff --git a/clients/java/api/openapi.yaml b/clients/java/api/openapi.yaml index 6e89ca447db..458f93d2741 100644 --- a/clients/java/api/openapi.yaml +++ b/clients/java/api/openapi.yaml @@ -7501,6 +7501,7 @@ components: Repository: example: read_only: true + storage_id: storage_id default_branch: default_branch id: id creation_date: 0 @@ -7514,6 +7515,9 @@ components: type: integer default_branch: type: string + storage_id: + description: Unique identifier of the underlying data store + type: string storage_namespace: description: Filesystem URI to store the underlying data in (e.g. "s3://my-bucket/some/path/") type: string @@ -7566,11 +7570,13 @@ components: results: 0 results: - read_only: true + storage_id: storage_id default_branch: default_branch id: id creation_date: 0 storage_namespace: storage_namespace - read_only: true + storage_id: storage_id default_branch: default_branch id: id creation_date: 0 @@ -7619,6 +7625,7 @@ components: example: sample_data: true read_only: true + storage_id: storage_id name: name default_branch: main storage_namespace: s3://example-bucket/ @@ -7626,6 +7633,9 @@ components: name: pattern: "^[a-z0-9][a-z0-9-]{2,62}$" type: string + storage_id: + description: Unique identifier of the underlying data store + type: string storage_namespace: description: Filesystem URI to store the underlying data in (e.g. "s3://my-bucket/some/path/") example: s3://example-bucket/ diff --git a/clients/java/docs/Repository.md b/clients/java/docs/Repository.md index e5e9808dbf6..eb00c5451e9 100644 --- a/clients/java/docs/Repository.md +++ b/clients/java/docs/Repository.md @@ -10,6 +10,7 @@ |**id** | **String** | | | |**creationDate** | **Long** | Unix Epoch in seconds | | |**defaultBranch** | **String** | | | +|**storageId** | **String** | Unique identifier of the underlying data store | [optional] | |**storageNamespace** | **String** | Filesystem URI to store the underlying data in (e.g. \"s3://my-bucket/some/path/\") | | |**readOnly** | **Boolean** | Whether the repository is a read-only repository- not relevant for bare repositories | [optional] | diff --git a/clients/java/docs/RepositoryCreation.md b/clients/java/docs/RepositoryCreation.md index c44ad50dbf7..d104df63524 100644 --- a/clients/java/docs/RepositoryCreation.md +++ b/clients/java/docs/RepositoryCreation.md @@ -8,6 +8,7 @@ | Name | Type | Description | Notes | |------------ | ------------- | ------------- | -------------| |**name** | **String** | | | +|**storageId** | **String** | Unique identifier of the underlying data store | [optional] | |**storageNamespace** | **String** | Filesystem URI to store the underlying data in (e.g. \"s3://my-bucket/some/path/\") | | |**defaultBranch** | **String** | | [optional] | |**sampleData** | **Boolean** | | [optional] | diff --git a/clients/java/src/main/java/io/lakefs/clients/sdk/model/Repository.java b/clients/java/src/main/java/io/lakefs/clients/sdk/model/Repository.java index 4978119e72b..82f960d76c8 100644 --- a/clients/java/src/main/java/io/lakefs/clients/sdk/model/Repository.java +++ b/clients/java/src/main/java/io/lakefs/clients/sdk/model/Repository.java @@ -64,6 +64,10 @@ public class Repository { @SerializedName(SERIALIZED_NAME_DEFAULT_BRANCH) private String defaultBranch; + public static final String SERIALIZED_NAME_STORAGE_ID = "storage_id"; + @SerializedName(SERIALIZED_NAME_STORAGE_ID) + private String storageId; + public static final String SERIALIZED_NAME_STORAGE_NAMESPACE = "storage_namespace"; @SerializedName(SERIALIZED_NAME_STORAGE_NAMESPACE) private String storageNamespace; @@ -138,6 +142,27 @@ public void setDefaultBranch(String defaultBranch) { } + public Repository storageId(String storageId) { + + this.storageId = storageId; + return this; + } + + /** + * Unique identifier of the underlying data store + * @return storageId + **/ + @javax.annotation.Nullable + public String getStorageId() { + return storageId; + } + + + public void setStorageId(String storageId) { + this.storageId = storageId; + } + + public Repository storageNamespace(String storageNamespace) { this.storageNamespace = storageNamespace; @@ -237,6 +262,7 @@ public boolean equals(Object o) { return Objects.equals(this.id, repository.id) && Objects.equals(this.creationDate, repository.creationDate) && Objects.equals(this.defaultBranch, repository.defaultBranch) && + Objects.equals(this.storageId, repository.storageId) && Objects.equals(this.storageNamespace, repository.storageNamespace) && Objects.equals(this.readOnly, repository.readOnly)&& Objects.equals(this.additionalProperties, repository.additionalProperties); @@ -244,7 +270,7 @@ public boolean equals(Object o) { @Override public int hashCode() { - return Objects.hash(id, creationDate, defaultBranch, storageNamespace, readOnly, additionalProperties); + return Objects.hash(id, creationDate, defaultBranch, storageId, storageNamespace, readOnly, additionalProperties); } @Override @@ -254,6 +280,7 @@ public String toString() { sb.append(" id: ").append(toIndentedString(id)).append("\n"); sb.append(" creationDate: ").append(toIndentedString(creationDate)).append("\n"); sb.append(" defaultBranch: ").append(toIndentedString(defaultBranch)).append("\n"); + sb.append(" storageId: ").append(toIndentedString(storageId)).append("\n"); sb.append(" storageNamespace: ").append(toIndentedString(storageNamespace)).append("\n"); sb.append(" readOnly: ").append(toIndentedString(readOnly)).append("\n"); sb.append(" additionalProperties: ").append(toIndentedString(additionalProperties)).append("\n"); @@ -282,6 +309,7 @@ private String toIndentedString(Object o) { openapiFields.add("id"); openapiFields.add("creation_date"); openapiFields.add("default_branch"); + openapiFields.add("storage_id"); openapiFields.add("storage_namespace"); openapiFields.add("read_only"); @@ -319,6 +347,9 @@ public static void validateJsonElement(JsonElement jsonElement) throws IOExcepti if (!jsonObj.get("default_branch").isJsonPrimitive()) { throw new IllegalArgumentException(String.format("Expected the field `default_branch` to be a primitive type in the JSON string but got `%s`", jsonObj.get("default_branch").toString())); } + if ((jsonObj.get("storage_id") != null && !jsonObj.get("storage_id").isJsonNull()) && !jsonObj.get("storage_id").isJsonPrimitive()) { + throw new IllegalArgumentException(String.format("Expected the field `storage_id` to be a primitive type in the JSON string but got `%s`", jsonObj.get("storage_id").toString())); + } if (!jsonObj.get("storage_namespace").isJsonPrimitive()) { throw new IllegalArgumentException(String.format("Expected the field `storage_namespace` to be a primitive type in the JSON string but got `%s`", jsonObj.get("storage_namespace").toString())); } diff --git a/clients/java/src/main/java/io/lakefs/clients/sdk/model/RepositoryCreation.java b/clients/java/src/main/java/io/lakefs/clients/sdk/model/RepositoryCreation.java index fdbf5b1e8ec..dbfa5f29e41 100644 --- a/clients/java/src/main/java/io/lakefs/clients/sdk/model/RepositoryCreation.java +++ b/clients/java/src/main/java/io/lakefs/clients/sdk/model/RepositoryCreation.java @@ -56,6 +56,10 @@ public class RepositoryCreation { @SerializedName(SERIALIZED_NAME_NAME) private String name; + public static final String SERIALIZED_NAME_STORAGE_ID = "storage_id"; + @SerializedName(SERIALIZED_NAME_STORAGE_ID) + private String storageId; + public static final String SERIALIZED_NAME_STORAGE_NAMESPACE = "storage_namespace"; @SerializedName(SERIALIZED_NAME_STORAGE_NAMESPACE) private String storageNamespace; @@ -96,6 +100,27 @@ public void setName(String name) { } + public RepositoryCreation storageId(String storageId) { + + this.storageId = storageId; + return this; + } + + /** + * Unique identifier of the underlying data store + * @return storageId + **/ + @javax.annotation.Nullable + public String getStorageId() { + return storageId; + } + + + public void setStorageId(String storageId) { + this.storageId = storageId; + } + + public RepositoryCreation storageNamespace(String storageNamespace) { this.storageNamespace = storageNamespace; @@ -235,6 +260,7 @@ public boolean equals(Object o) { } RepositoryCreation repositoryCreation = (RepositoryCreation) o; return Objects.equals(this.name, repositoryCreation.name) && + Objects.equals(this.storageId, repositoryCreation.storageId) && Objects.equals(this.storageNamespace, repositoryCreation.storageNamespace) && Objects.equals(this.defaultBranch, repositoryCreation.defaultBranch) && Objects.equals(this.sampleData, repositoryCreation.sampleData) && @@ -244,7 +270,7 @@ public boolean equals(Object o) { @Override public int hashCode() { - return Objects.hash(name, storageNamespace, defaultBranch, sampleData, readOnly, additionalProperties); + return Objects.hash(name, storageId, storageNamespace, defaultBranch, sampleData, readOnly, additionalProperties); } @Override @@ -252,6 +278,7 @@ public String toString() { StringBuilder sb = new StringBuilder(); sb.append("class RepositoryCreation {\n"); sb.append(" name: ").append(toIndentedString(name)).append("\n"); + sb.append(" storageId: ").append(toIndentedString(storageId)).append("\n"); sb.append(" storageNamespace: ").append(toIndentedString(storageNamespace)).append("\n"); sb.append(" defaultBranch: ").append(toIndentedString(defaultBranch)).append("\n"); sb.append(" sampleData: ").append(toIndentedString(sampleData)).append("\n"); @@ -280,6 +307,7 @@ private String toIndentedString(Object o) { // a set of all properties/fields (JSON key names) openapiFields = new HashSet(); openapiFields.add("name"); + openapiFields.add("storage_id"); openapiFields.add("storage_namespace"); openapiFields.add("default_branch"); openapiFields.add("sample_data"); @@ -314,6 +342,9 @@ public static void validateJsonElement(JsonElement jsonElement) throws IOExcepti if (!jsonObj.get("name").isJsonPrimitive()) { throw new IllegalArgumentException(String.format("Expected the field `name` to be a primitive type in the JSON string but got `%s`", jsonObj.get("name").toString())); } + if ((jsonObj.get("storage_id") != null && !jsonObj.get("storage_id").isJsonNull()) && !jsonObj.get("storage_id").isJsonPrimitive()) { + throw new IllegalArgumentException(String.format("Expected the field `storage_id` to be a primitive type in the JSON string but got `%s`", jsonObj.get("storage_id").toString())); + } if (!jsonObj.get("storage_namespace").isJsonPrimitive()) { throw new IllegalArgumentException(String.format("Expected the field `storage_namespace` to be a primitive type in the JSON string but got `%s`", jsonObj.get("storage_namespace").toString())); } diff --git a/clients/java/src/test/java/io/lakefs/clients/sdk/model/RepositoryCreationTest.java b/clients/java/src/test/java/io/lakefs/clients/sdk/model/RepositoryCreationTest.java index 7fc4f4a7746..40baad5ebc4 100644 --- a/clients/java/src/test/java/io/lakefs/clients/sdk/model/RepositoryCreationTest.java +++ b/clients/java/src/test/java/io/lakefs/clients/sdk/model/RepositoryCreationTest.java @@ -45,6 +45,14 @@ public void nameTest() { // TODO: test name } + /** + * Test the property 'storageId' + */ + @Test + public void storageIdTest() { + // TODO: test storageId + } + /** * Test the property 'storageNamespace' */ diff --git a/clients/java/src/test/java/io/lakefs/clients/sdk/model/RepositoryTest.java b/clients/java/src/test/java/io/lakefs/clients/sdk/model/RepositoryTest.java index ba349e17a31..aebd28faca0 100644 --- a/clients/java/src/test/java/io/lakefs/clients/sdk/model/RepositoryTest.java +++ b/clients/java/src/test/java/io/lakefs/clients/sdk/model/RepositoryTest.java @@ -61,6 +61,14 @@ public void defaultBranchTest() { // TODO: test defaultBranch } + /** + * Test the property 'storageId' + */ + @Test + public void storageIdTest() { + // TODO: test storageId + } + /** * Test the property 'storageNamespace' */ diff --git a/clients/python/docs/Repository.md b/clients/python/docs/Repository.md index 9a26acf43dd..34c8b4b83ff 100644 --- a/clients/python/docs/Repository.md +++ b/clients/python/docs/Repository.md @@ -8,6 +8,7 @@ Name | Type | Description | Notes **id** | **str** | | **creation_date** | **int** | Unix Epoch in seconds | **default_branch** | **str** | | +**storage_id** | **str** | Unique identifier of the underlying data store | [optional] **storage_namespace** | **str** | Filesystem URI to store the underlying data in (e.g. \"s3://my-bucket/some/path/\") | **read_only** | **bool** | Whether the repository is a read-only repository- not relevant for bare repositories | [optional] diff --git a/clients/python/docs/RepositoryCreation.md b/clients/python/docs/RepositoryCreation.md index f63db7b4a2d..dca25858a08 100644 --- a/clients/python/docs/RepositoryCreation.md +++ b/clients/python/docs/RepositoryCreation.md @@ -6,6 +6,7 @@ Name | Type | Description | Notes ------------ | ------------- | ------------- | ------------- **name** | **str** | | +**storage_id** | **str** | Unique identifier of the underlying data store | [optional] **storage_namespace** | **str** | Filesystem URI to store the underlying data in (e.g. \"s3://my-bucket/some/path/\") | **default_branch** | **str** | | [optional] **sample_data** | **bool** | | [optional] [default to False] diff --git a/clients/python/lakefs_sdk/models/repository.py b/clients/python/lakefs_sdk/models/repository.py index 44bfd179541..df34e6034ca 100644 --- a/clients/python/lakefs_sdk/models/repository.py +++ b/clients/python/lakefs_sdk/models/repository.py @@ -32,9 +32,10 @@ class Repository(BaseModel): id: StrictStr = Field(...) creation_date: StrictInt = Field(..., description="Unix Epoch in seconds") default_branch: StrictStr = Field(...) + storage_id: Optional[StrictStr] = Field(None, description="Unique identifier of the underlying data store") storage_namespace: StrictStr = Field(..., description="Filesystem URI to store the underlying data in (e.g. \"s3://my-bucket/some/path/\")") read_only: Optional[StrictBool] = Field(None, description="Whether the repository is a read-only repository- not relevant for bare repositories") - __properties = ["id", "creation_date", "default_branch", "storage_namespace", "read_only"] + __properties = ["id", "creation_date", "default_branch", "storage_id", "storage_namespace", "read_only"] class Config: """Pydantic configuration""" @@ -75,6 +76,7 @@ def from_dict(cls, obj: dict) -> Repository: "id": obj.get("id"), "creation_date": obj.get("creation_date"), "default_branch": obj.get("default_branch"), + "storage_id": obj.get("storage_id"), "storage_namespace": obj.get("storage_namespace"), "read_only": obj.get("read_only") }) diff --git a/clients/python/lakefs_sdk/models/repository_creation.py b/clients/python/lakefs_sdk/models/repository_creation.py index c53ace2d59b..88452c5edfe 100644 --- a/clients/python/lakefs_sdk/models/repository_creation.py +++ b/clients/python/lakefs_sdk/models/repository_creation.py @@ -30,11 +30,12 @@ class RepositoryCreation(BaseModel): RepositoryCreation """ name: constr(strict=True) = Field(...) + storage_id: Optional[StrictStr] = Field(None, description="Unique identifier of the underlying data store") storage_namespace: constr(strict=True) = Field(..., description="Filesystem URI to store the underlying data in (e.g. \"s3://my-bucket/some/path/\")") default_branch: Optional[StrictStr] = None sample_data: Optional[StrictBool] = False read_only: Optional[StrictBool] = False - __properties = ["name", "storage_namespace", "default_branch", "sample_data", "read_only"] + __properties = ["name", "storage_id", "storage_namespace", "default_branch", "sample_data", "read_only"] @validator('name') def name_validate_regular_expression(cls, value): @@ -87,6 +88,7 @@ def from_dict(cls, obj: dict) -> RepositoryCreation: _obj = RepositoryCreation.parse_obj({ "name": obj.get("name"), + "storage_id": obj.get("storage_id"), "storage_namespace": obj.get("storage_namespace"), "default_branch": obj.get("default_branch"), "sample_data": obj.get("sample_data") if obj.get("sample_data") is not None else False, diff --git a/clients/python/test/test_repository.py b/clients/python/test/test_repository.py index 7ba2d7937fa..34fc696a290 100644 --- a/clients/python/test/test_repository.py +++ b/clients/python/test/test_repository.py @@ -42,6 +42,7 @@ def make_instance(self, include_optional): id = '', creation_date = 56, default_branch = '', + storage_id = '', storage_namespace = '', read_only = True ) diff --git a/clients/python/test/test_repository_creation.py b/clients/python/test/test_repository_creation.py index 731d0d188f4..4d69f26d3be 100644 --- a/clients/python/test/test_repository_creation.py +++ b/clients/python/test/test_repository_creation.py @@ -40,6 +40,7 @@ def make_instance(self, include_optional): if include_optional : return RepositoryCreation( name = 'wr1c2v7s6djuy1zmeto', + storage_id = '', storage_namespace = 's3://example-bucket/', default_branch = 'main', sample_data = True, diff --git a/clients/python/test/test_repository_list.py b/clients/python/test/test_repository_list.py index 72beb45a0b5..6667a001ae7 100644 --- a/clients/python/test/test_repository_list.py +++ b/clients/python/test/test_repository_list.py @@ -49,6 +49,7 @@ def make_instance(self, include_optional): id = '', creation_date = 56, default_branch = '', + storage_id = '', storage_namespace = '', read_only = True, ) ] @@ -65,6 +66,7 @@ def make_instance(self, include_optional): id = '', creation_date = 56, default_branch = '', + storage_id = '', storage_namespace = '', read_only = True, ) ], diff --git a/clients/rust/docs/Repository.md b/clients/rust/docs/Repository.md index 66325f4be96..8ed0507d956 100644 --- a/clients/rust/docs/Repository.md +++ b/clients/rust/docs/Repository.md @@ -7,6 +7,7 @@ Name | Type | Description | Notes **id** | **String** | | **creation_date** | **i64** | Unix Epoch in seconds | **default_branch** | **String** | | +**storage_id** | Option<**String**> | Unique identifier of the underlying data store | [optional] **storage_namespace** | **String** | Filesystem URI to store the underlying data in (e.g. \"s3://my-bucket/some/path/\") | **read_only** | Option<**bool**> | Whether the repository is a read-only repository- not relevant for bare repositories | [optional] diff --git a/clients/rust/docs/RepositoryCreation.md b/clients/rust/docs/RepositoryCreation.md index e046f41463c..feed234e0ed 100644 --- a/clients/rust/docs/RepositoryCreation.md +++ b/clients/rust/docs/RepositoryCreation.md @@ -5,6 +5,7 @@ Name | Type | Description | Notes ------------ | ------------- | ------------- | ------------- **name** | **String** | | +**storage_id** | Option<**String**> | Unique identifier of the underlying data store | [optional] **storage_namespace** | **String** | Filesystem URI to store the underlying data in (e.g. \"s3://my-bucket/some/path/\") | **default_branch** | Option<**String**> | | [optional] **sample_data** | Option<**bool**> | | [optional][default to false] diff --git a/clients/rust/src/models/repository.rs b/clients/rust/src/models/repository.rs index 0c1eb05c539..c1917fe1b4e 100644 --- a/clients/rust/src/models/repository.rs +++ b/clients/rust/src/models/repository.rs @@ -19,6 +19,9 @@ pub struct Repository { pub creation_date: i64, #[serde(rename = "default_branch")] pub default_branch: String, + /// Unique identifier of the underlying data store + #[serde(rename = "storage_id", skip_serializing_if = "Option::is_none")] + pub storage_id: Option, /// Filesystem URI to store the underlying data in (e.g. \"s3://my-bucket/some/path/\") #[serde(rename = "storage_namespace")] pub storage_namespace: String, @@ -33,6 +36,7 @@ impl Repository { id, creation_date, default_branch, + storage_id: None, storage_namespace, read_only: None, } diff --git a/clients/rust/src/models/repository_creation.rs b/clients/rust/src/models/repository_creation.rs index fe5b8286445..43a0b4c1396 100644 --- a/clients/rust/src/models/repository_creation.rs +++ b/clients/rust/src/models/repository_creation.rs @@ -14,6 +14,9 @@ use crate::models; pub struct RepositoryCreation { #[serde(rename = "name")] pub name: String, + /// Unique identifier of the underlying data store + #[serde(rename = "storage_id", skip_serializing_if = "Option::is_none")] + pub storage_id: Option, /// Filesystem URI to store the underlying data in (e.g. \"s3://my-bucket/some/path/\") #[serde(rename = "storage_namespace")] pub storage_namespace: String, @@ -29,6 +32,7 @@ impl RepositoryCreation { pub fn new(name: String, storage_namespace: String) -> RepositoryCreation { RepositoryCreation { name, + storage_id: None, storage_namespace, default_branch: None, sample_data: None, diff --git a/docs/assets/js/swagger.yml b/docs/assets/js/swagger.yml index 8bbd763c01f..039303747f9 100644 --- a/docs/assets/js/swagger.yml +++ b/docs/assets/js/swagger.yml @@ -184,6 +184,9 @@ components: description: Unix Epoch in seconds default_branch: type: string + storage_id: + type: string + description: Unique identifier of the underlying data store storage_namespace: type: string description: Filesystem URI to store the underlying data in (e.g. "s3://my-bucket/some/path/") @@ -264,6 +267,9 @@ components: name: type: string pattern: "^[a-z0-9][a-z0-9-]{2,62}$" + storage_id: + type: string + description: Unique identifier of the underlying data store storage_namespace: type: string description: 'Filesystem URI to store the underlying data in (e.g. "s3://my-bucket/some/path/")' diff --git a/pkg/api/controller.go b/pkg/api/controller.go index 79a0447635c..190e3f05f92 100644 --- a/pkg/api/controller.go +++ b/pkg/api/controller.go @@ -1907,6 +1907,7 @@ func (c *Controller) ListRepositories(w http.ResponseWriter, r *http.Request, pa creationDate := repo.CreationDate.Unix() r := apigen.Repository{ Id: repo.Name, + StorageId: swag.String(repo.StorageNamespace), StorageNamespace: repo.StorageNamespace, CreationDate: creationDate, DefaultBranch: repo.DefaultBranch, @@ -1976,6 +1977,8 @@ func (c *Controller) CreateRepository(w http.ResponseWriter, r *http.Request, bo defaultBranch = "main" } + storageID := swag.StringValue(body.StorageId) + if !swag.BoolValue(body.ReadOnly) { if err := c.ensureStorageNamespace(ctx, body.StorageNamespace); err != nil { var ( @@ -2010,7 +2013,7 @@ func (c *Controller) CreateRepository(w http.ResponseWriter, r *http.Request, bo if swag.BoolValue(params.Bare) { // create a bare repository. This is useful in conjunction with refs-restore to create a copy // of another repository by e.g. copying the _lakefs/ directory and restoring its refs - repo, err := c.Catalog.CreateBareRepository(ctx, body.Name, body.StorageNamespace, defaultBranch, swag.BoolValue(body.ReadOnly)) + repo, err := c.Catalog.CreateBareRepository(ctx, body.Name, storageID, body.StorageNamespace, defaultBranch, swag.BoolValue(body.ReadOnly)) if c.handleAPIError(ctx, w, r, err) { return } @@ -2018,13 +2021,14 @@ func (c *Controller) CreateRepository(w http.ResponseWriter, r *http.Request, bo CreationDate: repo.CreationDate.Unix(), DefaultBranch: repo.DefaultBranch, Id: repo.Name, + StorageId: swag.String(repo.StorageNamespace), StorageNamespace: repo.StorageNamespace, } writeResponse(w, r, http.StatusCreated, response) return } - newRepo, err := c.Catalog.CreateRepository(ctx, body.Name, body.StorageNamespace, defaultBranch, swag.BoolValue(body.ReadOnly)) + newRepo, err := c.Catalog.CreateRepository(ctx, body.Name, storageID, body.StorageNamespace, defaultBranch, swag.BoolValue(body.ReadOnly)) if err != nil { c.handleAPIError(ctx, w, r, fmt.Errorf("error creating repository: %w", err)) return @@ -2055,6 +2059,7 @@ func (c *Controller) CreateRepository(w http.ResponseWriter, r *http.Request, bo CreationDate: newRepo.CreationDate.Unix(), DefaultBranch: newRepo.DefaultBranch, Id: newRepo.Name, + StorageId: swag.String(newRepo.StorageNamespace), StorageNamespace: newRepo.StorageNamespace, ReadOnly: swag.Bool(newRepo.ReadOnly), } @@ -2164,6 +2169,7 @@ func (c *Controller) GetRepository(w http.ResponseWriter, r *http.Request, repos CreationDate: repo.CreationDate.Unix(), DefaultBranch: repo.DefaultBranch, Id: repo.Name, + StorageId: swag.String(repo.StorageNamespace), StorageNamespace: repo.StorageNamespace, ReadOnly: swag.Bool(repo.ReadOnly), } diff --git a/pkg/api/controller_test.go b/pkg/api/controller_test.go index 173dad9cac3..c09892fb6f1 100644 --- a/pkg/api/controller_test.go +++ b/pkg/api/controller_test.go @@ -101,11 +101,11 @@ func TestController_ListRepositoriesHandler(t *testing.T) { t.Run("list some repos", func(t *testing.T) { // write some repos ctx := context.Background() - _, err := deps.catalog.CreateRepository(ctx, "foo1", onBlock(deps, "foo1"), "main", false) + _, err := deps.catalog.CreateRepository(ctx, "foo1", "storage", onBlock(deps, "foo1"), "main", false) testutil.Must(t, err) - _, err = deps.catalog.CreateRepository(ctx, "foo2", onBlock(deps, "foo1"), "main", false) + _, err = deps.catalog.CreateRepository(ctx, "foo2", "storage", onBlock(deps, "foo1"), "main", false) testutil.Must(t, err) - _, err = deps.catalog.CreateRepository(ctx, "foo3", onBlock(deps, "foo1"), "main", false) + _, err = deps.catalog.CreateRepository(ctx, "foo3", "storage", onBlock(deps, "foo1"), "main", false) testutil.Must(t, err) resp, err := clt.ListRepositoriesWithResponse(ctx, &apigen.ListRepositoriesParams{}) @@ -186,7 +186,7 @@ func TestController_GetRepoHandler(t *testing.T) { t.Run("get existing repo", func(t *testing.T) { const testBranchName = "non-default" - _, err := deps.catalog.CreateRepository(context.Background(), "foo1", onBlock(deps, "foo1"), testBranchName, false) + _, err := deps.catalog.CreateRepository(context.Background(), "foo1", "storage", onBlock(deps, "foo1"), testBranchName, false) testutil.Must(t, err) resp, err := clt.GetRepositoryWithResponse(ctx, "foo1") @@ -240,7 +240,7 @@ func TestController_LogCommitsMissingBranch(t *testing.T) { ctx := context.Background() repo := testUniqueRepoName() - _, err := deps.catalog.CreateRepository(ctx, repo, onBlock(deps, "ns1"), "main", false) + _, err := deps.catalog.CreateRepository(ctx, repo, "storage", onBlock(deps, "ns1"), "main", false) testutil.Must(t, err) resp, err := clt.LogCommitsWithResponse(ctx, repo, "otherbranch", &apigen.LogCommitsParams{}) @@ -297,7 +297,7 @@ func TestController_LogCommitsHandler(t *testing.T) { tt := ttt t.Run(tt.name, func(t *testing.T) { repo := testUniqueRepoName() - _, err := deps.catalog.CreateRepository(ctx, repo, onBlock(deps, repo), "main", false) + _, err := deps.catalog.CreateRepository(ctx, repo, "storage", onBlock(deps, repo), "main", false) testutil.Must(t, err) const prefix = "foo/bar" @@ -338,7 +338,7 @@ func TestController_LogCommitsParallelHandler(t *testing.T) { ctx := context.Background() repo := testUniqueRepoName() - _, err := deps.catalog.CreateRepository(ctx, repo, onBlock(deps, repo), "main", false) + _, err := deps.catalog.CreateRepository(ctx, repo, "storage", onBlock(deps, repo), "main", false) testutil.Must(t, err) commits := 100 @@ -386,7 +386,7 @@ func TestController_LogCommitsPredefinedData(t *testing.T) { // prepare test data repo := testUniqueRepoName() - _, err := deps.catalog.CreateRepository(ctx, repo, onBlock(deps, repo), "main", false) + _, err := deps.catalog.CreateRepository(ctx, repo, "storage", onBlock(deps, repo), "main", false) testutil.Must(t, err) const prefix = "foo/bar" const totalCommits = 10 @@ -580,7 +580,7 @@ func TestController_CommitsGetBranchCommitLogByPath(t *testing.T) { */ repo := testUniqueRepoName() - _, err := deps.catalog.CreateRepository(ctx, repo, onBlock(deps, "ns1"), "main", false) + _, err := deps.catalog.CreateRepository(ctx, repo, "storage", onBlock(deps, "ns1"), "main", false) testutil.Must(t, err) commitsMap := make(map[string]string) @@ -743,7 +743,7 @@ func TestController_GetCommitHandler(t *testing.T) { t.Run("get existing commit", func(t *testing.T) { ctx := context.Background() - _, err := deps.catalog.CreateRepository(ctx, "foo1", onBlock(deps, "foo1"), "main", false) + _, err := deps.catalog.CreateRepository(ctx, "foo1", "storage", onBlock(deps, "foo1"), "main", false) testutil.Must(t, err) testutil.MustDo(t, "create entry bar1", deps.catalog.CreateEntry(ctx, "foo1", "main", catalog.DBEntry{Path: "foo/bar1", PhysicalAddress: "bar1addr", CreationDate: time.Now(), Size: 1, Checksum: "cksum1"})) commit1, err := deps.catalog.Commit(ctx, "foo1", "main", "some message", DefaultUserID, nil, nil, nil, false) @@ -767,7 +767,7 @@ func TestController_GetCommitHandler(t *testing.T) { t.Run("branch commit", func(t *testing.T) { ctx := context.Background() repo := testUniqueRepoName() - _, err := deps.catalog.CreateRepository(ctx, repo, onBlock(deps, repo), "main", false) + _, err := deps.catalog.CreateRepository(ctx, repo, "storage", onBlock(deps, repo), "main", false) testutil.Must(t, err) testutil.MustDo(t, "create entry bar1", deps.catalog.CreateEntry(ctx, repo, "main", catalog.DBEntry{Path: "foo/bar1", PhysicalAddress: "bar1addr", CreationDate: time.Now(), Size: 1, Checksum: "cksum1"})) commit1, err := deps.catalog.Commit(ctx, repo, "main", "some message", DefaultUserID, nil, nil, nil, false) @@ -795,7 +795,7 @@ func TestController_GetCommitHandler(t *testing.T) { t.Run("tag commit", func(t *testing.T) { ctx := context.Background() repo := testUniqueRepoName() - _, err := deps.catalog.CreateRepository(ctx, repo, onBlock(deps, repo), "main", false) + _, err := deps.catalog.CreateRepository(ctx, repo, "storage", onBlock(deps, repo), "main", false) testutil.Must(t, err) testutil.MustDo(t, "create entry bar1", deps.catalog.CreateEntry(ctx, repo, "main", catalog.DBEntry{Path: "foo/bar1", PhysicalAddress: "bar1addr", CreationDate: time.Now(), Size: 1, Checksum: "cksum1"})) commit1, err := deps.catalog.Commit(ctx, repo, "main", "some message", DefaultUserID, nil, nil, nil, false) @@ -820,7 +820,7 @@ func TestController_GetCommitHandler(t *testing.T) { t.Run("initial commit", func(t *testing.T) { // validate a new repository's initial commit existence and structure ctx := context.Background() - _, err := deps.catalog.CreateRepository(ctx, "foo2", onBlock(deps, "foo2"), "main", false) + _, err := deps.catalog.CreateRepository(ctx, "foo2", "storage", onBlock(deps, "foo2"), "main", false) testutil.Must(t, err) resp, err := clt.GetCommitWithResponse(ctx, "foo2", "main") verifyResponseOK(t, resp, err) @@ -871,7 +871,7 @@ func TestController_CommitHandler(t *testing.T) { t.Run("commit success", func(t *testing.T) { repo := testUniqueRepoName() - _, err := deps.catalog.CreateRepository(ctx, repo, onBlock(deps, repo), "main", false) + _, err := deps.catalog.CreateRepository(ctx, repo, "storage", onBlock(deps, repo), "main", false) testutil.MustDo(t, fmt.Sprintf("create repo %s", repo), err) testutil.MustDo(t, fmt.Sprintf("commit bar on %s", repo), deps.catalog.CreateEntry(ctx, repo, "main", catalog.DBEntry{Path: "foo/bar", PhysicalAddress: "pa", CreationDate: time.Now(), Size: 666, Checksum: "cs", Metadata: nil})) resp, err := clt.CommitWithResponse(ctx, repo, "main", &apigen.CommitParams{}, apigen.CommitJSONRequestBody{ @@ -882,7 +882,7 @@ func TestController_CommitHandler(t *testing.T) { t.Run("commit success with source metarange", func(t *testing.T) { repo := testUniqueRepoName() - _, err := deps.catalog.CreateRepository(ctx, repo, onBlock(deps, repo), "main", false) + _, err := deps.catalog.CreateRepository(ctx, repo, "storage", onBlock(deps, repo), "main", false) testutil.MustDo(t, fmt.Sprintf("create repo %s", repo), err) _, err = deps.catalog.CreateBranch(ctx, repo, "foo-branch", "main") @@ -901,7 +901,7 @@ func TestController_CommitHandler(t *testing.T) { t.Run("commit failure with source metarange and dirty branch", func(t *testing.T) { repo := testUniqueRepoName() - _, err := deps.catalog.CreateRepository(ctx, repo, onBlock(deps, repo), "main", false) + _, err := deps.catalog.CreateRepository(ctx, repo, "storage", onBlock(deps, repo), "main", false) testutil.MustDo(t, fmt.Sprintf("create repo %s", repo), err) _, err = deps.catalog.CreateBranch(ctx, repo, "foo-branch", "main") @@ -926,7 +926,7 @@ func TestController_CommitHandler(t *testing.T) { t.Run("commit failure empty branch", func(t *testing.T) { repo := testUniqueRepoName() - _, err := deps.catalog.CreateRepository(ctx, repo, onBlock(deps, repo), "main", false) + _, err := deps.catalog.CreateRepository(ctx, repo, "storage", onBlock(deps, repo), "main", false) testutil.MustDo(t, fmt.Sprintf("create repo %s", repo), err) _, err = deps.catalog.CreateBranch(ctx, repo, "foo-branch", "main") @@ -944,7 +944,7 @@ func TestController_CommitHandler(t *testing.T) { t.Run("commit success - with creation date", func(t *testing.T) { repo := testUniqueRepoName() - _, err := deps.catalog.CreateRepository(ctx, repo, onBlock(deps, repo), "main", false) + _, err := deps.catalog.CreateRepository(ctx, repo, "storage", onBlock(deps, repo), "main", false) testutil.MustDo(t, fmt.Sprintf("create repo %s", repo), err) testutil.MustDo(t, fmt.Sprintf("commit bar on %s", repo), deps.catalog.CreateEntry(ctx, repo, "main", catalog.DBEntry{Path: "foo/bar", PhysicalAddress: "pa", CreationDate: time.Now(), Size: 666, Checksum: "cs", Metadata: nil})) date := int64(1642626109) @@ -960,7 +960,7 @@ func TestController_CommitHandler(t *testing.T) { t.Run("protected branch", func(t *testing.T) { repo := testUniqueRepoName() - _, err := deps.catalog.CreateRepository(ctx, repo, onBlock(deps, repo), "main", false) + _, err := deps.catalog.CreateRepository(ctx, repo, "storage", onBlock(deps, repo), "main", false) testutil.MustDo(t, "create repository", err) rules := map[string]*graveler.BranchProtectionBlockedActions{ "main": { @@ -985,7 +985,7 @@ func TestController_CommitHandler(t *testing.T) { }) t.Run("read only repo", func(t *testing.T) { repo := testUniqueRepoName() - _, err := deps.catalog.CreateRepository(ctx, repo, onBlock(deps, repo), "main", true) + _, err := deps.catalog.CreateRepository(ctx, repo, "storage", onBlock(deps, repo), "main", true) testutil.MustDo(t, "create repository", err) err = deps.catalog.CreateEntry(ctx, repo, "main", catalog.DBEntry{Path: "foo/bar", PhysicalAddress: "pa", CreationDate: time.Now(), Size: 666, Checksum: "cs", Metadata: nil}) require.Error(t, err, "read-only repository") @@ -1052,7 +1052,7 @@ func TestController_CreateRepositoryHandler(t *testing.T) { t.Run("create repo duplicate", func(t *testing.T) { repo := testUniqueRepoName() - _, err := deps.catalog.CreateRepository(ctx, repo, onBlock(deps, "foo1"), "main", false) + _, err := deps.catalog.CreateRepository(ctx, repo, "storage", onBlock(deps, "foo1"), "main", false) if err != nil { t.Fatal(err) } @@ -1153,7 +1153,7 @@ func TestController_DeleteRepositoryHandler(t *testing.T) { t.Run("delete repo success", func(t *testing.T) { repo := testUniqueRepoName() - _, err := deps.catalog.CreateRepository(ctx, repo, onBlock(deps, "foo1"), "main", false) + _, err := deps.catalog.CreateRepository(ctx, repo, "storage", onBlock(deps, "foo1"), "main", false) testutil.Must(t, err) resp, err := clt.DeleteRepositoryWithResponse(ctx, repo, &apigen.DeleteRepositoryParams{}) @@ -1179,7 +1179,7 @@ func TestController_DeleteRepositoryHandler(t *testing.T) { t.Run("delete repo doesnt delete other repos", func(t *testing.T) { names := []string{"rr0", "rr1", "rr11", "rr2"} for _, name := range names { - _, err := deps.catalog.CreateRepository(ctx, name, onBlock(deps, "foo1"), "main", false) + _, err := deps.catalog.CreateRepository(ctx, name, "storage", onBlock(deps, "foo1"), "main", false) testutil.Must(t, err) } @@ -1199,7 +1199,7 @@ func TestController_DeleteRepositoryHandler(t *testing.T) { t.Run("delete read-only repository", func(t *testing.T) { repo := testUniqueRepoName() - _, err := deps.catalog.CreateRepository(ctx, repo, onBlock(deps, "foo1"), "main", true) + _, err := deps.catalog.CreateRepository(ctx, repo, "storage", onBlock(deps, "foo1"), "main", true) testutil.Must(t, err) resp, err := clt.DeleteRepositoryWithResponse(ctx, repo, &apigen.DeleteRepositoryParams{}) @@ -1457,7 +1457,7 @@ func TestController_ListBranchesHandler(t *testing.T) { t.Run("list branches only default", func(t *testing.T) { ctx := context.Background() repo := testUniqueRepoName() - _, err := deps.catalog.CreateRepository(ctx, repo, onBlock(deps, "foo1"), "main", false) + _, err := deps.catalog.CreateRepository(ctx, repo, "storage", onBlock(deps, "foo1"), "main", false) testutil.Must(t, err) resp, err := clt.ListBranchesWithResponse(ctx, repo, &apigen.ListBranchesParams{ Amount: apiutil.Ptr(apigen.PaginationAmount(-1)), @@ -1474,7 +1474,7 @@ func TestController_ListBranchesHandler(t *testing.T) { t.Run("list branches pagination", func(t *testing.T) { ctx := context.Background() repo := testUniqueRepoName() - _, err := deps.catalog.CreateRepository(ctx, repo, onBlock(deps, "foo2"), "main", false) + _, err := deps.catalog.CreateRepository(ctx, repo, "storage", onBlock(deps, "foo2"), "main", false) testutil.Must(t, err) // create the first "dummy" commit on main so that we can create branches from it @@ -1544,7 +1544,7 @@ func TestController_ListTagsHandler(t *testing.T) { // setup test data repo := testUniqueRepoName() - _, err := deps.catalog.CreateRepository(ctx, repo, onBlock(deps, "foo1"), "main", false) + _, err := deps.catalog.CreateRepository(ctx, repo, "storage", onBlock(deps, "foo1"), "main", false) testutil.Must(t, err) testutil.Must(t, deps.catalog.CreateEntry(ctx, repo, "main", catalog.DBEntry{Path: "obj1"})) commitLog, err := deps.catalog.Commit(ctx, repo, "main", "first commit", "test", nil, nil, nil, false) @@ -1626,7 +1626,7 @@ func TestController_GetBranchHandler(t *testing.T) { const testBranch = "main" repo := testUniqueRepoName() - _, err := deps.catalog.CreateRepository(ctx, repo, onBlock(deps, "foo1"), testBranch, false) + _, err := deps.catalog.CreateRepository(ctx, repo, "storage", onBlock(deps, "foo1"), testBranch, false) testutil.Must(t, err) t.Run("get default branch", func(t *testing.T) { @@ -1670,7 +1670,7 @@ func TestController_BranchesDiffBranchHandler(t *testing.T) { ctx := context.Background() const testBranch = "main" repo := testUniqueRepoName() - _, err := deps.catalog.CreateRepository(ctx, repo, onBlock(deps, "foo1"), testBranch, false) + _, err := deps.catalog.CreateRepository(ctx, repo, "storage", onBlock(deps, "foo1"), testBranch, false) if err != nil { t.Fatal(err) } @@ -1722,7 +1722,7 @@ func TestController_CreateBranchHandler(t *testing.T) { t.Run(fmt.Sprintf("hidden=%v", hidden), func(t *testing.T) { t.Run("create branch and diff refs success", func(t *testing.T) { repo := testUniqueRepoName() - _, err := deps.catalog.CreateRepository(ctx, repo, onBlock(deps, "foo1"), "main", false) + _, err := deps.catalog.CreateRepository(ctx, repo, "storage", onBlock(deps, "foo1"), "main", false) testutil.Must(t, err) testutil.Must(t, deps.catalog.CreateEntry(ctx, repo, "main", catalog.DBEntry{Path: "a/b"})) _, err = deps.catalog.Commit(ctx, repo, "main", "first commit", "test", nil, nil, nil, false) @@ -1761,7 +1761,7 @@ func TestController_CreateBranchHandler(t *testing.T) { t.Run("create branch missing commit", func(t *testing.T) { repo := testUniqueRepoName() - _, err := deps.catalog.CreateRepository(ctx, repo, onBlock(deps, "foo1"), "main", false) + _, err := deps.catalog.CreateRepository(ctx, repo, "storage", onBlock(deps, "foo1"), "main", false) testutil.Must(t, err) resp, err := clt.CreateBranchWithResponse(ctx, repo, apigen.CreateBranchJSONRequestBody{ Name: "main3", @@ -1793,7 +1793,7 @@ func TestController_CreateBranchHandler(t *testing.T) { t.Run("create branch conflict with branch", func(t *testing.T) { repo := testUniqueRepoName() - _, err := deps.catalog.CreateRepository(ctx, repo, onBlock(deps, "foo1"), "main", false) + _, err := deps.catalog.CreateRepository(ctx, repo, "storage", onBlock(deps, "foo1"), "main", false) testutil.Must(t, err) resp, err := clt.CreateBranchWithResponse(ctx, repo, apigen.CreateBranchJSONRequestBody{ @@ -1811,7 +1811,7 @@ func TestController_CreateBranchHandler(t *testing.T) { t.Run("create branch conflict with tag", func(t *testing.T) { repo := testUniqueRepoName() - _, err := deps.catalog.CreateRepository(ctx, repo, onBlock(deps, "foo1"), "main", false) + _, err := deps.catalog.CreateRepository(ctx, repo, "storage", onBlock(deps, "foo1"), "main", false) testutil.Must(t, err) name := "tag123" @@ -1833,7 +1833,7 @@ func TestController_CreateBranchHandler(t *testing.T) { t.Run("create branch conflict with commit", func(t *testing.T) { repo := testUniqueRepoName() - _, err := deps.catalog.CreateRepository(ctx, repo, onBlock(deps, "foo1"), "main", false) + _, err := deps.catalog.CreateRepository(ctx, repo, "storage", onBlock(deps, "foo1"), "main", false) testutil.Must(t, err) log, err := deps.catalog.GetCommit(ctx, repo, "main") @@ -1854,7 +1854,7 @@ func TestController_CreateBranchHandler(t *testing.T) { t.Run("read-only repository", func(t *testing.T) { repo := testUniqueRepoName() - _, err := deps.catalog.CreateRepository(ctx, repo, onBlock(deps, "foo1"), "main", true) + _, err := deps.catalog.CreateRepository(ctx, repo, "storage", onBlock(deps, "foo1"), "main", true) testutil.Must(t, err) testutil.Must(t, deps.catalog.CreateEntry(ctx, repo, "main", catalog.DBEntry{Path: "a/b"}, graveler.WithForce(true))) _, err = deps.catalog.Commit(ctx, repo, "main", "first commit", "test", nil, nil, nil, false, graveler.WithForce(true)) @@ -1889,7 +1889,7 @@ func TestController_DiffRefsHandler(t *testing.T) { t.Run("diff prefix with and without delimiter", func(t *testing.T) { repoName := testUniqueRepoName() const newBranchName = "main2" - _, err := deps.catalog.CreateRepository(ctx, repoName, onBlock(deps, "foo1"), "main", false) + _, err := deps.catalog.CreateRepository(ctx, repoName, "storage", onBlock(deps, "foo1"), "main", false) testutil.Must(t, err) resp, err := clt.CreateBranchWithResponse(ctx, repoName, apigen.CreateBranchJSONRequestBody{ @@ -1975,7 +1975,7 @@ func TestController_UploadObjectHandler(t *testing.T) { clt, deps := setupClientWithAdmin(t) ctx := context.Background() - _, err := deps.catalog.CreateRepository(ctx, "my-new-repo", onBlock(deps, "foo1"), "main", false) + _, err := deps.catalog.CreateRepository(ctx, "my-new-repo", "storage", onBlock(deps, "foo1"), "main", false) testutil.Must(t, err) t.Run("upload object", func(t *testing.T) { @@ -2120,7 +2120,7 @@ func TestController_UploadObjectHandler(t *testing.T) { t.Run("read-only repository", func(t *testing.T) { repoName := "my-new-read-only-repo" - _, err := deps.catalog.CreateRepository(ctx, repoName, onBlock(deps, "foo2"), "main", true) + _, err := deps.catalog.CreateRepository(ctx, repoName, "storage", onBlock(deps, "foo2"), "main", true) testutil.Must(t, err) // write contentType, buf := writeMultipart("content", "bar", "hello world!") @@ -2151,7 +2151,7 @@ func TestController_DeleteBranchHandler(t *testing.T) { ctx := context.Background() t.Run("delete branch success", func(t *testing.T) { - _, err := deps.catalog.CreateRepository(ctx, "my-new-repo", onBlock(deps, "foo1"), "main", false) + _, err := deps.catalog.CreateRepository(ctx, "my-new-repo", "storage", onBlock(deps, "foo1"), "main", false) testutil.Must(t, err) testutil.Must(t, deps.catalog.CreateEntry(ctx, "my-new-repo", "main", catalog.DBEntry{Path: "a/b"})) _, err = deps.catalog.Commit(ctx, "my-new-repo", "main", "first commit", "test", nil, nil, nil, false) @@ -2172,7 +2172,7 @@ func TestController_DeleteBranchHandler(t *testing.T) { }) t.Run("delete default branch", func(t *testing.T) { - _, err := deps.catalog.CreateRepository(ctx, "my-new-repo2", onBlock(deps, "foo2"), "main", false) + _, err := deps.catalog.CreateRepository(ctx, "my-new-repo2", "storage", onBlock(deps, "foo2"), "main", false) testutil.Must(t, err) resp, err := clt.DeleteBranchWithResponse(ctx, "my-new-repo2", "main", &apigen.DeleteBranchParams{}) if err != nil { @@ -2195,7 +2195,7 @@ func TestController_DeleteBranchHandler(t *testing.T) { t.Run("read-only repository", func(t *testing.T) { repoName := "read-only-repo" - _, err := deps.catalog.CreateRepository(ctx, repoName, onBlock(deps, "foo1"), "main", true) + _, err := deps.catalog.CreateRepository(ctx, repoName, "storage", onBlock(deps, "foo1"), "main", true) testutil.Must(t, err) testutil.Must(t, deps.catalog.CreateEntry(ctx, repoName, "main", catalog.DBEntry{Path: "a/b"}, graveler.WithForce(true))) _, err = deps.catalog.Commit(ctx, repoName, "main", "first commit", "test", nil, nil, nil, false, graveler.WithForce(true)) @@ -2226,7 +2226,7 @@ func TestController_ObjectsStatObjectHandler(t *testing.T) { ctx := context.Background() repo := testUniqueRepoName() - _, err := deps.catalog.CreateRepository(ctx, repo, onBlock(deps, "some-bucket"), "main", false) + _, err := deps.catalog.CreateRepository(ctx, repo, "storage", onBlock(deps, "some-bucket"), "main", false) if err != nil { t.Fatal(err) } @@ -2323,7 +2323,7 @@ func TestController_UpdateObjectUserMetadataHander(t *testing.T) { ctx := context.Background() repo := testUniqueRepoName() - _, err := deps.catalog.CreateRepository(ctx, repo, onBlock(deps, "some-bucket"), "main", false) + _, err := deps.catalog.CreateRepository(ctx, repo, "storage", onBlock(deps, "some-bucket"), "main", false) if err != nil { t.Fatal(err) } @@ -2426,7 +2426,7 @@ func TestController_ObjectsListObjectsHandler(t *testing.T) { ctx := context.Background() repo := testUniqueRepoName() - _, err := deps.catalog.CreateRepository(ctx, repo, onBlock(deps, "bucket/prefix"), "main", false) + _, err := deps.catalog.CreateRepository(ctx, repo, "storage", onBlock(deps, "bucket/prefix"), "main", false) testutil.Must(t, err) dbEntries := []catalog.DBEntry{ { @@ -2521,7 +2521,7 @@ func TestController_ObjectsHeadObjectHandler(t *testing.T) { ctx := context.Background() repo := testUniqueRepoName() - _, err := deps.catalog.CreateRepository(ctx, repo, onBlock(deps, "ns1"), "main", false) + _, err := deps.catalog.CreateRepository(ctx, repo, "storage", onBlock(deps, "ns1"), "main", false) if err != nil { t.Fatal(err) } @@ -2597,7 +2597,7 @@ func TestController_ObjectsGetObjectHandler(t *testing.T) { ctx := context.Background() repo := testUniqueRepoName() - _, err := deps.catalog.CreateRepository(ctx, repo, onBlock(deps, "ns1"), "main", false) + _, err := deps.catalog.CreateRepository(ctx, repo, "storage", onBlock(deps, "ns1"), "main", false) if err != nil { t.Fatal(err) } @@ -2757,7 +2757,7 @@ func TestController_ObjectsUploadObjectHandler(t *testing.T) { ctx := context.Background() repo := testUniqueRepoName() - _, err := deps.catalog.CreateRepository(ctx, repo, onBlock(deps, "bucket/prefix"), "main", false) + _, err := deps.catalog.CreateRepository(ctx, repo, "storage", onBlock(deps, "bucket/prefix"), "main", false) if err != nil { t.Fatal(err) } @@ -2818,7 +2818,7 @@ func TestController_ObjectsUploadObjectHandler(t *testing.T) { t.Run("read-only repository", func(t *testing.T) { readOnlyRepo := testUniqueRepoName() path := "foo/bar" - _, err := deps.catalog.CreateRepository(ctx, readOnlyRepo, onBlock(deps, "bucket/prefix"), "main", true) + _, err := deps.catalog.CreateRepository(ctx, readOnlyRepo, "storage", onBlock(deps, "bucket/prefix"), "main", true) if err != nil { t.Fatal(err) } @@ -2891,7 +2891,7 @@ func TestController_ObjectsStageObjectHandler(t *testing.T) { ctx := context.Background() ns := onBlock(deps, "bucket/prefix") repo := testUniqueRepoName() - _, err := deps.catalog.CreateRepository(ctx, repo, ns, "main", false) + _, err := deps.catalog.CreateRepository(ctx, repo, "storage", ns, "main", false) if err != nil { t.Fatal(err) } @@ -2981,7 +2981,7 @@ func TestController_ObjectsStageObjectHandler(t *testing.T) { t.Run("read-only repository", func(t *testing.T) { readOnlyRepo := testUniqueRepoName() - _, err := deps.catalog.CreateRepository(ctx, readOnlyRepo, onBlock(deps, "bucket/prefix"), "main", true) + _, err := deps.catalog.CreateRepository(ctx, readOnlyRepo, "storage", onBlock(deps, "bucket/prefix"), "main", true) if err != nil { t.Fatal(err) } @@ -3077,7 +3077,7 @@ func TestController_ObjectsDeleteObjectHandler(t *testing.T) { repo := testUniqueRepoName() const branch = "main" - _, err := deps.catalog.CreateRepository(ctx, repo, onBlock(deps, "some-bucket/prefix"), branch, false) + _, err := deps.catalog.CreateRepository(ctx, repo, "storage", onBlock(deps, "some-bucket/prefix"), branch, false) if err != nil { t.Fatal(err) } @@ -3240,7 +3240,7 @@ func TestController_ObjectsDeleteObjectHandler(t *testing.T) { t.Run("read-only repository", func(t *testing.T) { readOnlyRepo := testUniqueRepoName() const branch = "main" - _, err := deps.catalog.CreateRepository(ctx, readOnlyRepo, onBlock(deps, "some-bucket/prefix2"), branch, true) + _, err := deps.catalog.CreateRepository(ctx, readOnlyRepo, "storage", onBlock(deps, "some-bucket/prefix2"), branch, true) if err != nil { t.Fatal(err) } @@ -3770,7 +3770,7 @@ func TestController_MergeIntoExplicitBranch(t *testing.T) { // setup env repo := testUniqueRepoName() - _, err := deps.catalog.CreateRepository(ctx, repo, onBlock(deps, repo), "main", false) + _, err := deps.catalog.CreateRepository(ctx, repo, "storage", onBlock(deps, repo), "main", false) testutil.Must(t, err) _, err = deps.catalog.CreateBranch(ctx, repo, "branch1", "main") testutil.Must(t, err) @@ -3812,7 +3812,7 @@ func TestController_MergeSquashing(t *testing.T) { // setup env repo := testUniqueRepoName() - _, err := deps.catalog.CreateRepository(ctx, repo, onBlock(deps, repo), "main", false) + _, err := deps.catalog.CreateRepository(ctx, repo, "storage", onBlock(deps, repo), "main", false) testutil.Must(t, err) base, err := deps.catalog.CreateBranch(ctx, repo, "branch", "main") testutil.Must(t, err) @@ -3882,7 +3882,7 @@ func TestController_MergeDirtyBranch(t *testing.T) { // setup env repo := testUniqueRepoName() - _, err := deps.catalog.CreateRepository(ctx, repo, onBlock(deps, repo), "main", false) + _, err := deps.catalog.CreateRepository(ctx, repo, "storage", onBlock(deps, repo), "main", false) testutil.Must(t, err) err = deps.catalog.CreateEntry(ctx, repo, "main", catalog.DBEntry{Path: "foo/bar1", PhysicalAddress: "bar1addr", CreationDate: time.Now(), Size: 1, Checksum: "cksum1"}) testutil.Must(t, err) @@ -3945,7 +3945,7 @@ func TestController_CreateTag(t *testing.T) { ctx := context.Background() // setup env repo := testUniqueRepoName() - _, err := deps.catalog.CreateRepository(ctx, repo, onBlock(deps, repo), "main", false) + _, err := deps.catalog.CreateRepository(ctx, repo, "storage", onBlock(deps, repo), "main", false) testutil.Must(t, err) testutil.MustDo(t, "create entry bar1", deps.catalog.CreateEntry(ctx, repo, "main", catalog.DBEntry{Path: "foo/bar1", PhysicalAddress: "bar1addr", CreationDate: time.Now(), Size: 1, Checksum: "cksum1"})) commit1, err := deps.catalog.Commit(ctx, repo, "main", "some message", DefaultUserID, nil, nil, nil, false) @@ -4055,7 +4055,7 @@ func TestController_CreateTag(t *testing.T) { t.Run("read-only repository", func(t *testing.T) { readOnlyRepo := testUniqueRepoName() - _, err := deps.catalog.CreateRepository(ctx, readOnlyRepo, onBlock(deps, readOnlyRepo), "main", true) + _, err := deps.catalog.CreateRepository(ctx, readOnlyRepo, "storage", onBlock(deps, readOnlyRepo), "main", true) testutil.Must(t, err) testutil.MustDo(t, "create entry bar1", deps.catalog.CreateEntry(ctx, readOnlyRepo, "main", catalog.DBEntry{Path: "foo/bar2", PhysicalAddress: "bar2addr", CreationDate: time.Now(), Size: 1, Checksum: "cksum1"}, graveler.WithForce(true))) commit1, err := deps.catalog.Commit(ctx, readOnlyRepo, "main", "some message", DefaultUserID, nil, nil, nil, false, graveler.WithForce(true)) @@ -4086,7 +4086,7 @@ func TestController_Revert(t *testing.T) { ctx := context.Background() // setup env repo := testUniqueRepoName() - _, err := deps.catalog.CreateRepository(ctx, repo, onBlock(deps, repo), "main", false) + _, err := deps.catalog.CreateRepository(ctx, repo, "storage", onBlock(deps, repo), "main", false) testutil.Must(t, err) testutil.MustDo(t, "create entry bar1", deps.catalog.CreateEntry(ctx, repo, "main", catalog.DBEntry{Path: "foo/bar1", PhysicalAddress: "bar1addr", CreationDate: time.Now(), Size: 1, Checksum: "cksum1"})) _, err = deps.catalog.Commit(ctx, repo, "main", "some message", DefaultUserID, nil, nil, nil, false) @@ -4135,7 +4135,7 @@ func TestController_Revert(t *testing.T) { t.Run("revert_no_parent", func(t *testing.T) { repo := testUniqueRepoName() // setup data - repo with one object committed - _, err := deps.catalog.CreateRepository(ctx, repo, onBlock(deps, repo), "main", false) + _, err := deps.catalog.CreateRepository(ctx, repo, "storage", onBlock(deps, repo), "main", false) testutil.Must(t, err) err = deps.catalog.CreateEntry(ctx, repo, "main", catalog.DBEntry{Path: "merge/foo/bar1", PhysicalAddress: "merge1bar1addr", CreationDate: time.Now(), Size: 1, Checksum: "cksum1"}) testutil.Must(t, err) @@ -4162,7 +4162,7 @@ func TestController_Revert(t *testing.T) { t.Run("read-only repository", func(t *testing.T) { readOnlyRepository := testUniqueRepoName() - _, err := deps.catalog.CreateRepository(ctx, readOnlyRepository, onBlock(deps, readOnlyRepository), "main", true) + _, err := deps.catalog.CreateRepository(ctx, readOnlyRepository, "storage", onBlock(deps, readOnlyRepository), "main", true) testutil.Must(t, err) testutil.MustDo(t, "create entry bar1", deps.catalog.CreateEntry(ctx, readOnlyRepository, "main", catalog.DBEntry{Path: "foo/bar2", PhysicalAddress: "bar2addr", CreationDate: time.Now(), Size: 1, Checksum: "cksum1"}, graveler.WithForce(true))) _, err = deps.catalog.Commit(ctx, readOnlyRepository, "main", "some message", DefaultUserID, nil, nil, nil, false, graveler.WithForce(true)) @@ -4182,7 +4182,7 @@ func TestController_RevertConflict(t *testing.T) { ctx := context.Background() // setup env repo := testUniqueRepoName() - _, err := deps.catalog.CreateRepository(ctx, repo, onBlock(deps, repo), "main", false) + _, err := deps.catalog.CreateRepository(ctx, repo, "storage", onBlock(deps, repo), "main", false) testutil.Must(t, err) testutil.MustDo(t, "create entry bar1", deps.catalog.CreateEntry(ctx, repo, "main", catalog.DBEntry{Path: "foo/bar1", PhysicalAddress: "bar1addr", CreationDate: time.Now(), Size: 1, Checksum: "cksum1"})) firstCommit, err := deps.catalog.Commit(ctx, repo, "main", "some message", DefaultUserID, nil, nil, nil, false) @@ -4203,7 +4203,7 @@ func TestController_CherryPick(t *testing.T) { ctx := context.Background() // setup env repo := testUniqueRepoName() - _, err := deps.catalog.CreateRepository(ctx, repo, onBlock(deps, repo), "main", false) + _, err := deps.catalog.CreateRepository(ctx, repo, "storage", onBlock(deps, repo), "main", false) testutil.Must(t, err) testutil.MustDo(t, "create entry bar1", deps.catalog.CreateEntry(ctx, repo, "main", catalog.DBEntry{Path: "foo/bar1", PhysicalAddress: "bar1addr", CreationDate: time.Now(), Size: 1, Checksum: "cksum1"})) _, err = deps.catalog.Commit(ctx, repo, "main", "message1", DefaultUserID, nil, nil, nil, false) @@ -4361,7 +4361,7 @@ func TestController_CherryPick(t *testing.T) { t.Run("read-only repository", func(t *testing.T) { readOnlyRepository := testUniqueRepoName() - _, err := deps.catalog.CreateRepository(ctx, readOnlyRepository, onBlock(deps, readOnlyRepository), "main", true) + _, err := deps.catalog.CreateRepository(ctx, readOnlyRepository, "storage", onBlock(deps, readOnlyRepository), "main", true) testutil.Must(t, err) for _, name := range []string{"branch1", "dest-branch1"} { _, err = deps.catalog.CreateBranch(ctx, readOnlyRepository, name, "main", graveler.WithForce(true)) @@ -4439,10 +4439,11 @@ func TestController_GetPhysicalAddress(t *testing.T) { t.Run("physical_address_format", func(t *testing.T) { repo := testUniqueRepoName() const ( + sid = "storage" ns = "s3://foo-bucket1" branch = "main" ) - _, err := deps.catalog.CreateRepository(ctx, repo, ns, branch, false) + _, err := deps.catalog.CreateRepository(ctx, repo, sid, ns, branch, false) if err != nil { t.Fatal(err) } @@ -4553,7 +4554,7 @@ func TestController_PrepareGarbageCollectionUncommitted(t *testing.T) { t.Run("uncommitted_data", func(t *testing.T) { repo := testUniqueRepoName() - _, err := deps.catalog.CreateRepository(ctx, repo, onBlock(deps, repo), "main", false) + _, err := deps.catalog.CreateRepository(ctx, repo, "storage", onBlock(deps, repo), "main", false) testutil.Must(t, err) const items = 3 for i := 0; i < items; i++ { @@ -4566,7 +4567,7 @@ func TestController_PrepareGarbageCollectionUncommitted(t *testing.T) { t.Run("committed_data", func(t *testing.T) { repo := testUniqueRepoName() - _, err := deps.catalog.CreateRepository(ctx, repo, onBlock(deps, repo), "main", false) + _, err := deps.catalog.CreateRepository(ctx, repo, "storage", onBlock(deps, repo), "main", false) testutil.Must(t, err) const items = 3 for i := 0; i < items; i++ { @@ -4582,7 +4583,7 @@ func TestController_PrepareGarbageCollectionUncommitted(t *testing.T) { t.Run("uncommitted_copy", func(t *testing.T) { repo := testUniqueRepoName() - _, err := deps.catalog.CreateRepository(ctx, repo, onBlock(deps, repo), "main", false) + _, err := deps.catalog.CreateRepository(ctx, repo, "storage", onBlock(deps, repo), "main", false) testutil.Must(t, err) const items = 3 for i := 0; i < items; i++ { @@ -4602,7 +4603,7 @@ func TestController_PrepareGarbageCollectionUncommitted(t *testing.T) { t.Run("read_only_repo", func(t *testing.T) { repo := testUniqueRepoName() - _, err := deps.catalog.CreateRepository(ctx, repo, onBlock(deps, repo), "main", true) + _, err := deps.catalog.CreateRepository(ctx, repo, "storage", onBlock(deps, repo), "main", true) testutil.Must(t, err) resp, err := clt.PrepareGarbageCollectionUncommittedWithResponse(ctx, repo, apigen.PrepareGarbageCollectionUncommittedJSONRequestBody{}) if err != nil { @@ -4620,7 +4621,7 @@ func TestController_PrepareGarbageCollectionCommitted(t *testing.T) { t.Run("read_only_repo", func(t *testing.T) { repo := testUniqueRepoName() - _, err := deps.catalog.CreateRepository(ctx, repo, onBlock(deps, repo), "main", true) + _, err := deps.catalog.CreateRepository(ctx, repo, "storage", onBlock(deps, repo), "main", true) testutil.Must(t, err) resp, err := clt.PrepareGarbageCollectionCommitsWithResponse(ctx, repo) if err != nil { @@ -4643,7 +4644,7 @@ func TestController_ClientDisconnect(t *testing.T) { // setup repository ctx := context.Background() repo := testUniqueRepoName() - _, err := deps.catalog.CreateRepository(ctx, repo, onBlock(deps, repo), "main", false) + _, err := deps.catalog.CreateRepository(ctx, repo, "storage", onBlock(deps, repo), "main", false) testutil.Must(t, err) // prepare a client that will not wait for a response and timeout @@ -4923,7 +4924,7 @@ func TestController_CopyObjectHandler(t *testing.T) { ctx := context.Background() repo := testUniqueRepoName() - _, err := deps.catalog.CreateRepository(ctx, repo, onBlock(deps, "bucket/prefix"), "main", false) + _, err := deps.catalog.CreateRepository(ctx, repo, "storage", onBlock(deps, "bucket/prefix"), "main", false) require.NoError(t, err) _, err = deps.catalog.CreateBranch(ctx, repo, "alt", "main") require.NoError(t, err) @@ -5070,7 +5071,7 @@ func TestController_CopyObjectHandler(t *testing.T) { t.Run("read-only repository", func(t *testing.T) { readOnlyRepository := testUniqueRepoName() - _, err = deps.catalog.CreateRepository(ctx, readOnlyRepository, onBlock(deps, "bucket/prefix"), "main", true) + _, err = deps.catalog.CreateRepository(ctx, readOnlyRepository, "storage", onBlock(deps, "bucket/prefix"), "main", true) require.NoError(t, err) _, err = deps.catalog.CreateBranch(ctx, readOnlyRepository, "alt", "main", graveler.WithForce(true)) require.NoError(t, err) @@ -5145,7 +5146,7 @@ func TestController_LocalAdapter_StageObject(t *testing.T) { ctx := context.Background() repo := testUniqueRepoName() - _, err := deps.catalog.CreateRepository(ctx, repo, onBlock(deps, "bucket/prefix"), "main", false) + _, err := deps.catalog.CreateRepository(ctx, repo, "storage", onBlock(deps, "bucket/prefix"), "main", false) require.NoError(t, err) _, err = deps.catalog.CreateBranch(ctx, repo, "alt", "main") require.NoError(t, err) @@ -5167,7 +5168,7 @@ func TestController_BranchProtectionRules(t *testing.T) { t.Run("admin", func(t *testing.T) { currCtx := context.Background() repo := testUniqueRepoName() - _, err := deps.catalog.CreateRepository(currCtx, repo, onBlock(deps, repo), "main", false) + _, err := deps.catalog.CreateRepository(currCtx, repo, "storage", onBlock(deps, repo), "main", false) testutil.MustDo(t, "create repository", err) respPreflight, err := adminClt.CreateBranchProtectionRulePreflightWithResponse(currCtx, repo) @@ -5185,7 +5186,7 @@ func TestController_BranchProtectionRules(t *testing.T) { t.Run("read-only repo", func(t *testing.T) { currCtx := context.Background() repo := testUniqueRepoName() - _, err := deps.catalog.CreateRepository(currCtx, repo, onBlock(deps, repo), "main", true) + _, err := deps.catalog.CreateRepository(currCtx, repo, "storage", onBlock(deps, repo), "main", true) testutil.MustDo(t, "create repository", err) resp, err := adminClt.SetBranchProtectionRulesWithResponse(currCtx, repo, &apigen.SetBranchProtectionRulesParams{}, apigen.SetBranchProtectionRulesJSONRequestBody{}) @@ -5207,7 +5208,7 @@ func TestController_GarbageCollectionRules(t *testing.T) { t.Run("admin", func(t *testing.T) { currCtx := context.Background() repo := testUniqueRepoName() - _, err := deps.catalog.CreateRepository(currCtx, repo, onBlock(deps, repo), "main", false) + _, err := deps.catalog.CreateRepository(currCtx, repo, "storage", onBlock(deps, repo), "main", false) testutil.MustDo(t, "create repository", err) respPreflight, err := adminClt.SetGarbageCollectionRulesPreflightWithResponse(currCtx, repo) @@ -5225,7 +5226,7 @@ func TestController_GarbageCollectionRules(t *testing.T) { t.Run("read-only repo", func(t *testing.T) { currCtx := context.Background() repo := testUniqueRepoName() - _, err := deps.catalog.CreateRepository(currCtx, repo, onBlock(deps, repo), "main", true) + _, err := deps.catalog.CreateRepository(currCtx, repo, "storage", onBlock(deps, repo), "main", true) testutil.MustDo(t, "create repository", err) resp, err := adminClt.SetGCRulesWithResponse(currCtx, repo, apigen.SetGCRulesJSONRequestBody{ @@ -5249,7 +5250,7 @@ func TestController_DumpRestoreRepository(t *testing.T) { // setup repository with some commits repo := testUniqueRepoName() - _, err := deps.catalog.CreateRepository(ctx, repo, onBlock(deps, repo), "main", false) + _, err := deps.catalog.CreateRepository(ctx, repo, "storage", onBlock(deps, repo), "main", false) testutil.Must(t, err) const commits = 3 @@ -5312,7 +5313,7 @@ func TestController_DumpRestoreRepository(t *testing.T) { } newRepo := testUniqueRepoName() - _, err = deps.catalog.CreateBareRepository(ctx, newRepo, onBlock(deps, repo), "main", false) + _, err = deps.catalog.CreateBareRepository(ctx, newRepo, "storage", onBlock(deps, repo), "main", false) testutil.MustDo(t, "create bare repository", err) submitResponse, err := clt.RestoreSubmitWithResponse(ctx, newRepo, apigen.RestoreSubmitJSONRequestBody{ @@ -5337,7 +5338,7 @@ func TestController_DumpRestoreRepository(t *testing.T) { t.Run("restore_invalid_refs", func(t *testing.T) { // delete and recreate repository as bare for restore newRepo := testUniqueRepoName() - _, err = deps.catalog.CreateBareRepository(ctx, newRepo, onBlock(deps, repo), "main", false) + _, err = deps.catalog.CreateBareRepository(ctx, newRepo, "storage", onBlock(deps, repo), "main", false) testutil.MustDo(t, "create bare repository", err) submitResponse, err := clt.RestoreSubmitWithResponse(ctx, newRepo, apigen.RestoreSubmitJSONRequestBody{ @@ -5390,7 +5391,7 @@ func TestController_CreateCommitRecord(t *testing.T) { t.Run("create commit record", func(t *testing.T) { repo := testUniqueRepoName() - _, err := deps.catalog.CreateRepository(ctx, repo, onBlock(deps, repo), "main", false) + _, err := deps.catalog.CreateRepository(ctx, repo, "storage", onBlock(deps, repo), "main", false) testutil.Must(t, err) resp, err := clt.CreateCommitRecordWithResponse(ctx, repo, body) testutil.MustDo(t, "create commit record", err) @@ -5417,7 +5418,7 @@ func TestController_CreateCommitRecord(t *testing.T) { t.Run("create commit record with wrong commitID", func(t *testing.T) { repo := testUniqueRepoName() - _, err := deps.catalog.CreateRepository(ctx, repo, onBlock(deps, repo), "main", false) + _, err := deps.catalog.CreateRepository(ctx, repo, "storage", onBlock(deps, repo), "main", false) testutil.Must(t, err) bodyCpy := body bodyCpy.CommitId = "wrong" @@ -5430,7 +5431,7 @@ func TestController_CreateCommitRecord(t *testing.T) { t.Run("read only repository", func(t *testing.T) { repo := testUniqueRepoName() - _, err := deps.catalog.CreateRepository(ctx, repo, onBlock(deps, repo), "main", true) + _, err := deps.catalog.CreateRepository(ctx, repo, "storage", onBlock(deps, repo), "main", true) testutil.Must(t, err) resp, err := clt.CreateCommitRecordWithResponse(ctx, repo, body) testutil.Must(t, err) @@ -5447,7 +5448,7 @@ func TestController_CreateCommitRecord(t *testing.T) { t.Run("already existing commit", func(t *testing.T) { repo := testUniqueRepoName() - _, err := deps.catalog.CreateRepository(ctx, repo, onBlock(deps, repo), "main", false) + _, err := deps.catalog.CreateRepository(ctx, repo, "storage", onBlock(deps, repo), "main", false) testutil.Must(t, err) resp, err := clt.CreateCommitRecordWithResponse(ctx, repo, body) testutil.MustDo(t, "create commit record", err) @@ -5611,7 +5612,7 @@ func TestController_CreatePullRequest(t *testing.T) { clt, deps := setupClientWithAdmin(t) ctx := context.Background() repo := testUniqueRepoName() - _, err := deps.catalog.CreateRepository(ctx, repo, onBlock(deps, repo), "main", false) + _, err := deps.catalog.CreateRepository(ctx, repo, "storage", onBlock(deps, repo), "main", false) require.NoError(t, err) t.Run("invalid source", func(t *testing.T) { @@ -5716,7 +5717,7 @@ func TestController_GetPullRequest(t *testing.T) { clt, deps := setupClientWithAdmin(t) ctx := context.Background() repo := testUniqueRepoName() - _, err := deps.catalog.CreateRepository(ctx, repo, onBlock(deps, repo), "main", false) + _, err := deps.catalog.CreateRepository(ctx, repo, "storage", onBlock(deps, repo), "main", false) require.NoError(t, err) t.Run("invalid xid", func(t *testing.T) { @@ -5737,7 +5738,7 @@ func TestController_ListPullRequestsHandler(t *testing.T) { clt, deps := setupClientWithAdmin(t) ctx := context.Background() repo := testUniqueRepoName() - _, err := deps.catalog.CreateRepository(ctx, repo, onBlock(deps, "foo1"), "main", false) + _, err := deps.catalog.CreateRepository(ctx, repo, "storage", onBlock(deps, "foo1"), "main", false) require.NoError(t, err) t.Run("no pull requests", func(t *testing.T) { @@ -5872,7 +5873,7 @@ func TestController_UpdatePullRequest(t *testing.T) { clt, deps := setupClientWithAdmin(t) ctx := context.Background() repo := testUniqueRepoName() - _, err := deps.catalog.CreateRepository(ctx, repo, onBlock(deps, repo), "main", false) + _, err := deps.catalog.CreateRepository(ctx, repo, "storage", onBlock(deps, repo), "main", false) require.NoError(t, err) t.Run("invalid xid", func(t *testing.T) { @@ -6024,7 +6025,7 @@ func TestController_MergePullRequest(t *testing.T) { clt, deps := setupClientWithAdmin(t) ctx := context.Background() repo := testUniqueRepoName() - _, err := deps.catalog.CreateRepository(ctx, repo, onBlock(deps, repo), "main", false) + _, err := deps.catalog.CreateRepository(ctx, repo, "storage", onBlock(deps, repo), "main", false) require.NoError(t, err) t.Run("invalid xid", func(t *testing.T) { diff --git a/pkg/catalog/catalog.go b/pkg/catalog/catalog.go index 79df3ad50dc..b0270124390 100644 --- a/pkg/catalog/catalog.go +++ b/pkg/catalog/catalog.go @@ -446,22 +446,25 @@ func (c *Catalog) log(ctx context.Context) logging.Logger { } // CreateRepository create a new repository pointing to 'storageNamespace' (ex: s3://bucket1/repo) with default branch name 'branch' -func (c *Catalog) CreateRepository(ctx context.Context, repository string, storageNamespace string, branch string, readOnly bool) (*Repository, error) { +func (c *Catalog) CreateRepository(ctx context.Context, repository string, storageID string, storageNamespace string, branch string, readOnly bool) (*Repository, error) { repositoryID := graveler.RepositoryID(repository) + storageIdentifier := graveler.StorageID(storageID) storageNS := graveler.StorageNamespace(storageNamespace) branchID := graveler.BranchID(branch) if err := validator.Validate([]validator.ValidateArg{ {Name: "name", Value: repositoryID, Fn: graveler.ValidateRepositoryID}, + {Name: "storageID", Value: storageIdentifier, Fn: graveler.ValidateStorageID}, {Name: "storageNamespace", Value: storageNS, Fn: graveler.ValidateStorageNamespace}, }); err != nil { return nil, err } - repo, err := c.Store.CreateRepository(ctx, repositoryID, storageNS, branchID, readOnly) + repo, err := c.Store.CreateRepository(ctx, repositoryID, storageIdentifier, storageNS, branchID, readOnly) if err != nil { return nil, err } catalogRepo := &Repository{ Name: repositoryID.String(), + StorageID: storageIdentifier.String(), StorageNamespace: storageNS.String(), DefaultBranch: branchID.String(), CreationDate: repo.CreationDate, @@ -472,22 +475,25 @@ func (c *Catalog) CreateRepository(ctx context.Context, repository string, stora // CreateBareRepository create a new repository pointing to 'storageNamespace' (ex: s3://bucket1/repo) with no initial branch or commit // defaultBranchID will point to a non-existent branch on creation, it is up to the caller to eventually create it. -func (c *Catalog) CreateBareRepository(ctx context.Context, repository string, storageNamespace string, defaultBranchID string, readOnly bool) (*Repository, error) { +func (c *Catalog) CreateBareRepository(ctx context.Context, repository string, storageID string, storageNamespace string, defaultBranchID string, readOnly bool) (*Repository, error) { repositoryID := graveler.RepositoryID(repository) + storageIdentifier := graveler.StorageID(storageID) storageNS := graveler.StorageNamespace(storageNamespace) branchID := graveler.BranchID(defaultBranchID) if err := validator.Validate([]validator.ValidateArg{ {Name: "name", Value: repositoryID, Fn: graveler.ValidateRepositoryID}, + {Name: "storageID", Value: storageIdentifier, Fn: graveler.ValidateStorageID}, {Name: "storageNamespace", Value: storageNS, Fn: graveler.ValidateStorageNamespace}, }); err != nil { return nil, err } - repo, err := c.Store.CreateBareRepository(ctx, repositoryID, storageNS, branchID, readOnly) + repo, err := c.Store.CreateBareRepository(ctx, repositoryID, storageIdentifier, storageNS, branchID, readOnly) if err != nil { return nil, err } catalogRepo := &Repository{ Name: repositoryID.String(), + StorageID: storageIdentifier.String(), StorageNamespace: storageNS.String(), DefaultBranch: branchID.String(), CreationDate: repo.CreationDate, @@ -516,6 +522,7 @@ func (c *Catalog) GetRepository(ctx context.Context, repository string) (*Reposi catalogRepository := &Repository{ Name: repositoryID.String(), + StorageID: repo.StorageID.String(), StorageNamespace: repo.StorageNamespace.String(), DefaultBranch: repo.DefaultBranchID.String(), CreationDate: repo.CreationDate, @@ -623,6 +630,7 @@ func (c *Catalog) ListRepositories(ctx context.Context, limit int, prefix, searc } repos = append(repos, &Repository{ Name: record.RepositoryID.String(), + StorageID: record.StorageID.String(), StorageNamespace: record.StorageNamespace.String(), DefaultBranch: record.DefaultBranchID.String(), CreationDate: record.CreationDate, diff --git a/pkg/catalog/catalog_test.go b/pkg/catalog/catalog_test.go index bd9d2215988..5ac6daa6ca1 100644 --- a/pkg/catalog/catalog_test.go +++ b/pkg/catalog/catalog_test.go @@ -72,12 +72,12 @@ func TestCatalog_ListRepositories(t *testing.T) { // prepare data tests now := time.Now() gravelerData := []*graveler.RepositoryRecord{ - {RepositoryID: "re", Repository: &graveler.Repository{StorageNamespace: "storage1", CreationDate: now, DefaultBranchID: "main1"}}, - {RepositoryID: "repo1", Repository: &graveler.Repository{StorageNamespace: "storage2", CreationDate: now, DefaultBranchID: "main2"}}, - {RepositoryID: "repo2", Repository: &graveler.Repository{StorageNamespace: "storage3", CreationDate: now, DefaultBranchID: "main3"}}, - {RepositoryID: "repo22", Repository: &graveler.Repository{StorageNamespace: "storage4", CreationDate: now, DefaultBranchID: "main4"}}, - {RepositoryID: "repo23", Repository: &graveler.Repository{StorageNamespace: "storage5", CreationDate: now, DefaultBranchID: "main5"}}, - {RepositoryID: "repo3", Repository: &graveler.Repository{StorageNamespace: "storage6", CreationDate: now, DefaultBranchID: "main6"}}, + {RepositoryID: "re", Repository: &graveler.Repository{StorageID: "storage", StorageNamespace: "storageNS1", CreationDate: now, DefaultBranchID: "main1"}}, + {RepositoryID: "repo1", Repository: &graveler.Repository{StorageID: "storage", StorageNamespace: "storageNS2", CreationDate: now, DefaultBranchID: "main2"}}, + {RepositoryID: "repo2", Repository: &graveler.Repository{StorageID: "storage", StorageNamespace: "storageNS3", CreationDate: now, DefaultBranchID: "main3"}}, + {RepositoryID: "repo22", Repository: &graveler.Repository{StorageID: "storage", StorageNamespace: "storageNS4", CreationDate: now, DefaultBranchID: "main4"}}, + {RepositoryID: "repo23", Repository: &graveler.Repository{StorageID: "storage", StorageNamespace: "storageNS5", CreationDate: now, DefaultBranchID: "main5"}}, + {RepositoryID: "repo3", Repository: &graveler.Repository{StorageID: "storage", StorageNamespace: "storageNS6", CreationDate: now, DefaultBranchID: "main6"}}, } type args struct { limit int @@ -101,12 +101,12 @@ func TestCatalog_ListRepositories(t *testing.T) { searchString: "", }, want: []*catalog.Repository{ - {Name: "re", StorageNamespace: "storage1", DefaultBranch: "main1", CreationDate: now}, - {Name: "repo1", StorageNamespace: "storage2", DefaultBranch: "main2", CreationDate: now}, - {Name: "repo2", StorageNamespace: "storage3", DefaultBranch: "main3", CreationDate: now}, - {Name: "repo22", StorageNamespace: "storage4", DefaultBranch: "main4", CreationDate: now}, - {Name: "repo23", StorageNamespace: "storage5", DefaultBranch: "main5", CreationDate: now}, - {Name: "repo3", StorageNamespace: "storage6", DefaultBranch: "main6", CreationDate: now}, + {Name: "re", StorageID: "storage", StorageNamespace: "storageNS1", DefaultBranch: "main1", CreationDate: now}, + {Name: "repo1", StorageID: "storage", StorageNamespace: "storageNS2", DefaultBranch: "main2", CreationDate: now}, + {Name: "repo2", StorageID: "storage", StorageNamespace: "storageNS3", DefaultBranch: "main3", CreationDate: now}, + {Name: "repo22", StorageID: "storage", StorageNamespace: "storageNS4", DefaultBranch: "main4", CreationDate: now}, + {Name: "repo23", StorageID: "storage", StorageNamespace: "storageNS5", DefaultBranch: "main5", CreationDate: now}, + {Name: "repo3", StorageID: "storage", StorageNamespace: "storageNS6", DefaultBranch: "main6", CreationDate: now}, }, wantHasMore: false, wantErr: false, @@ -120,7 +120,7 @@ func TestCatalog_ListRepositories(t *testing.T) { searchString: "", }, want: []*catalog.Repository{ - {Name: "re", StorageNamespace: "storage1", DefaultBranch: "main1", CreationDate: now}, + {Name: "re", StorageID: "storage", StorageNamespace: "storageNS1", DefaultBranch: "main1", CreationDate: now}, }, wantHasMore: true, wantErr: false, @@ -134,7 +134,7 @@ func TestCatalog_ListRepositories(t *testing.T) { searchString: "", }, want: []*catalog.Repository{ - {Name: "repo1", StorageNamespace: "storage2", DefaultBranch: "main2", CreationDate: now}, + {Name: "repo1", StorageID: "storage", StorageNamespace: "storageNS2", DefaultBranch: "main2", CreationDate: now}, }, wantHasMore: true, wantErr: false, @@ -148,8 +148,8 @@ func TestCatalog_ListRepositories(t *testing.T) { searchString: "", }, want: []*catalog.Repository{ - {Name: "repo2", StorageNamespace: "storage3", DefaultBranch: "main3", CreationDate: now}, - {Name: "repo22", StorageNamespace: "storage4", DefaultBranch: "main4", CreationDate: now}, + {Name: "repo2", StorageID: "storage", StorageNamespace: "storageNS3", DefaultBranch: "main3", CreationDate: now}, + {Name: "repo22", StorageID: "storage", StorageNamespace: "storageNS4", DefaultBranch: "main4", CreationDate: now}, }, wantHasMore: true, wantErr: false, @@ -163,7 +163,7 @@ func TestCatalog_ListRepositories(t *testing.T) { searchString: "", }, want: []*catalog.Repository{ - {Name: "repo1", StorageNamespace: "storage2", DefaultBranch: "main2", CreationDate: now}, + {Name: "repo1", StorageID: "storage", StorageNamespace: "storageNS2", DefaultBranch: "main2", CreationDate: now}, }, wantHasMore: true, wantErr: false, @@ -177,8 +177,8 @@ func TestCatalog_ListRepositories(t *testing.T) { searchString: "", }, want: []*catalog.Repository{ - {Name: "repo23", StorageNamespace: "storage5", DefaultBranch: "main5", CreationDate: now}, - {Name: "repo3", StorageNamespace: "storage6", DefaultBranch: "main6", CreationDate: now}, + {Name: "repo23", StorageID: "storage", StorageNamespace: "storageNS5", DefaultBranch: "main5", CreationDate: now}, + {Name: "repo3", StorageID: "storage", StorageNamespace: "storageNS6", DefaultBranch: "main6", CreationDate: now}, }, wantHasMore: false, wantErr: false, @@ -192,9 +192,9 @@ func TestCatalog_ListRepositories(t *testing.T) { searchString: "o2", }, want: []*catalog.Repository{ - {Name: "repo2", StorageNamespace: "storage3", DefaultBranch: "main3", CreationDate: now}, - {Name: "repo22", StorageNamespace: "storage4", DefaultBranch: "main4", CreationDate: now}, - {Name: "repo23", StorageNamespace: "storage5", DefaultBranch: "main5", CreationDate: now}, + {Name: "repo2", StorageID: "storage", StorageNamespace: "storageNS3", DefaultBranch: "main3", CreationDate: now}, + {Name: "repo22", StorageID: "storage", StorageNamespace: "storageNS4", DefaultBranch: "main4", CreationDate: now}, + {Name: "repo23", StorageID: "storage", StorageNamespace: "storageNS5", DefaultBranch: "main5", CreationDate: now}, }, wantHasMore: false, wantErr: false, @@ -208,8 +208,8 @@ func TestCatalog_ListRepositories(t *testing.T) { searchString: "o2", }, want: []*catalog.Repository{ - {Name: "repo2", StorageNamespace: "storage3", DefaultBranch: "main3", CreationDate: now}, - {Name: "repo22", StorageNamespace: "storage4", DefaultBranch: "main4", CreationDate: now}, + {Name: "repo2", StorageID: "storage", StorageNamespace: "storageNS3", DefaultBranch: "main3", CreationDate: now}, + {Name: "repo22", StorageID: "storage", StorageNamespace: "storageNS4", DefaultBranch: "main4", CreationDate: now}, }, wantHasMore: true, wantErr: false, @@ -223,7 +223,7 @@ func TestCatalog_ListRepositories(t *testing.T) { searchString: "o2", }, want: []*catalog.Repository{ - {Name: "repo23", StorageNamespace: "storage5", DefaultBranch: "main5", CreationDate: now}, + {Name: "repo23", StorageID: "storage", StorageNamespace: "storageNS5", DefaultBranch: "main5", CreationDate: now}, }, wantHasMore: false, wantErr: false, @@ -237,8 +237,8 @@ func TestCatalog_ListRepositories(t *testing.T) { searchString: "o2", }, want: []*catalog.Repository{ - {Name: "repo22", StorageNamespace: "storage4", DefaultBranch: "main4", CreationDate: now}, - {Name: "repo23", StorageNamespace: "storage5", DefaultBranch: "main5", CreationDate: now}, + {Name: "repo22", StorageID: "storage", StorageNamespace: "storageNS4", DefaultBranch: "main4", CreationDate: now}, + {Name: "repo23", StorageID: "storage", StorageNamespace: "storageNS5", DefaultBranch: "main5", CreationDate: now}, }, wantHasMore: false, wantErr: false, @@ -871,6 +871,7 @@ func createPrepareUncommittedTestScenario(t *testing.T, repositoryID string, num repository := &graveler.RepositoryRecord{ RepositoryID: graveler.RepositoryID(repositoryID), Repository: &graveler.Repository{ + StorageID: "storage", StorageNamespace: graveler.StorageNamespace("mem://" + repositoryID), CreationDate: time.Now(), DefaultBranchID: "main", diff --git a/pkg/catalog/fake_graveler_test.go b/pkg/catalog/fake_graveler_test.go index 869f25fdaf6..644b1a3d813 100644 --- a/pkg/catalog/fake_graveler_test.go +++ b/pkg/catalog/fake_graveler_test.go @@ -51,7 +51,7 @@ func (g *FakeGraveler) SetGarbageCollectionRules(_ context.Context, _ *graveler. panic("implement me") } -func (g *FakeGraveler) CreateBareRepository(_ context.Context, _ graveler.RepositoryID, _ graveler.StorageNamespace, _ graveler.BranchID, _ bool) (*graveler.RepositoryRecord, error) { +func (g *FakeGraveler) CreateBareRepository(_ context.Context, _ graveler.RepositoryID, _ graveler.StorageID, _ graveler.StorageNamespace, _ graveler.BranchID, _ bool) (*graveler.RepositoryRecord, error) { panic("implement me") } @@ -148,7 +148,7 @@ func (g *FakeGraveler) GetRepository(ctx context.Context, repositoryID graveler. return &graveler.RepositoryRecord{RepositoryID: repositoryID}, nil } -func (g *FakeGraveler) CreateRepository(ctx context.Context, repositoryID graveler.RepositoryID, storageNamespace graveler.StorageNamespace, branchID graveler.BranchID, readOnly bool) (*graveler.RepositoryRecord, error) { +func (g *FakeGraveler) CreateRepository(ctx context.Context, repositoryID graveler.RepositoryID, storageID graveler.StorageID, storageNamespace graveler.StorageNamespace, branchID graveler.BranchID, readOnly bool) (*graveler.RepositoryRecord, error) { panic("implement me") } diff --git a/pkg/catalog/model.go b/pkg/catalog/model.go index 502ab0c5bbf..3f78adf392c 100644 --- a/pkg/catalog/model.go +++ b/pkg/catalog/model.go @@ -19,6 +19,7 @@ type CommitGeneration int64 type Repository struct { Name string + StorageID string StorageNamespace string DefaultBranch string CreationDate time.Time diff --git a/pkg/gateway/testutil/gateway_setup.go b/pkg/gateway/testutil/gateway_setup.go index d112b5aec95..033e1414788 100644 --- a/pkg/gateway/testutil/gateway_setup.go +++ b/pkg/gateway/testutil/gateway_setup.go @@ -60,7 +60,8 @@ func GetBasicHandler(t *testing.T, authService *FakeAuthService, repoName string storageNamespace = "replay" } - _, err = c.CreateRepository(ctx, repoName, storageNamespace, "main", false) + // TODO (gilo): test storageID here? + _, err = c.CreateRepository(ctx, repoName, "", storageNamespace, "main", false) testutil.Must(t, err) handler := gateway.NewHandler(authService.Region, c, multipartTracker, blockAdapter, authService, []string{authService.BareDomain}, &stats.NullCollector{}, upload.DefaultPathProvider, nil, config.DefaultLoggingAuditLogLevel, true, false, false) diff --git a/pkg/graveler/graveler.go b/pkg/graveler/graveler.go index 6cfac69f9ce..c7e3389e59f 100644 --- a/pkg/graveler/graveler.go +++ b/pkg/graveler/graveler.go @@ -265,6 +265,9 @@ func WithShowHidden(v bool) ListOptionsFunc { // function/methods receiving the following basic types could assume they passed validation +// StorageID is the storage location identifier +type StorageID string + // StorageNamespace is the URI to the storage location type StorageNamespace string @@ -355,6 +358,7 @@ type Metadata map[string]string // Repository represents repository metadata type Repository struct { + StorageID StorageID StorageNamespace StorageNamespace CreationDate time.Time DefaultBranchID BranchID @@ -374,8 +378,9 @@ type RepositoryMetadata map[string]string const MetadataKeyLastImportTimeStamp = ".lakefs.last.import.timestamp" -func NewRepository(storageNamespace StorageNamespace, defaultBranchID BranchID, readOnly bool) Repository { +func NewRepository(storageID StorageID, storageNamespace StorageNamespace, defaultBranchID BranchID, readOnly bool) Repository { return Repository{ + StorageID: storageID, StorageNamespace: storageNamespace, CreationDate: time.Now().UTC(), DefaultBranchID: defaultBranchID, @@ -600,10 +605,10 @@ type VersionController interface { GetRepository(ctx context.Context, repositoryID RepositoryID) (*RepositoryRecord, error) // CreateRepository stores a new Repository under RepositoryID with the given Branch as default branch - CreateRepository(ctx context.Context, repositoryID RepositoryID, storageNamespace StorageNamespace, branchID BranchID, readOnly bool) (*RepositoryRecord, error) + CreateRepository(ctx context.Context, repositoryID RepositoryID, storageID StorageID, storageNamespace StorageNamespace, branchID BranchID, readOnly bool) (*RepositoryRecord, error) // CreateBareRepository stores a new Repository under RepositoryID with no initial branch or commit - CreateBareRepository(ctx context.Context, repositoryID RepositoryID, storageNamespace StorageNamespace, defaultBranchID BranchID, readOnly bool) (*RepositoryRecord, error) + CreateBareRepository(ctx context.Context, repositoryID RepositoryID, storageID StorageID, storageNamespace StorageNamespace, defaultBranchID BranchID, readOnly bool) (*RepositoryRecord, error) // ListRepositories returns iterator to scan repositories ListRepositories(ctx context.Context) (RepositoryIterator, error) @@ -1095,6 +1100,10 @@ func (id RepositoryID) String() string { return string(id) } +func (id StorageID) String() string { + return string(id) +} + func (ns StorageNamespace) String() string { return string(ns) } @@ -1185,13 +1194,13 @@ func (g *Graveler) GetRepository(ctx context.Context, repositoryID RepositoryID) return g.RefManager.GetRepository(ctx, repositoryID) } -func (g *Graveler) CreateRepository(ctx context.Context, repositoryID RepositoryID, storageNamespace StorageNamespace, branchID BranchID, readOnly bool) (*RepositoryRecord, error) { +func (g *Graveler) CreateRepository(ctx context.Context, repositoryID RepositoryID, storageID StorageID, storageNamespace StorageNamespace, branchID BranchID, readOnly bool) (*RepositoryRecord, error) { _, err := g.RefManager.GetRepository(ctx, repositoryID) if err != nil && !errors.Is(err, ErrRepositoryNotFound) { return nil, err } - repo := NewRepository(storageNamespace, branchID, readOnly) + repo := NewRepository(storageID, storageNamespace, branchID, readOnly) repository, err := g.RefManager.CreateRepository(ctx, repositoryID, repo) if err != nil { return nil, err @@ -1199,13 +1208,13 @@ func (g *Graveler) CreateRepository(ctx context.Context, repositoryID Repository return repository, nil } -func (g *Graveler) CreateBareRepository(ctx context.Context, repositoryID RepositoryID, storageNamespace StorageNamespace, defaultBranchID BranchID, readOnly bool) (*RepositoryRecord, error) { +func (g *Graveler) CreateBareRepository(ctx context.Context, repositoryID RepositoryID, storageID StorageID, storageNamespace StorageNamespace, defaultBranchID BranchID, readOnly bool) (*RepositoryRecord, error) { _, err := g.RefManager.GetRepository(ctx, repositoryID) if err != nil && !errors.Is(err, ErrRepositoryNotFound) { return nil, err } - repo := NewRepository(storageNamespace, defaultBranchID, readOnly) + repo := NewRepository(storageID, storageNamespace, defaultBranchID, readOnly) repository, err := g.RefManager.CreateBareRepository(ctx, repositoryID, repo) if err != nil { return nil, err diff --git a/pkg/graveler/graveler.pb.go b/pkg/graveler/graveler.pb.go index 0ac0bf7bc63..914e45e84e6 100644 --- a/pkg/graveler/graveler.pb.go +++ b/pkg/graveler/graveler.pb.go @@ -174,6 +174,7 @@ type RepositoryData struct { State RepositoryState `protobuf:"varint,5,opt,name=state,proto3,enum=io.treeverse.lakefs.graveler.RepositoryState" json:"state,omitempty"` InstanceUid string `protobuf:"bytes,6,opt,name=instance_uid,json=instanceUid,proto3" json:"instance_uid,omitempty"` ReadOnly bool `protobuf:"varint,7,opt,name=read_only,json=readOnly,proto3" json:"read_only,omitempty"` + StorageId string `protobuf:"bytes,8,opt,name=storage_id,json=storageId,proto3" json:"storage_id,omitempty"` } func (x *RepositoryData) Reset() { @@ -257,6 +258,13 @@ func (x *RepositoryData) GetReadOnly() bool { return false } +func (x *RepositoryData) GetStorageId() string { + if x != nil { + return x.StorageId + } + return "" +} + type BranchData struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -1034,7 +1042,7 @@ var file_graveler_graveler_proto_rawDesc = []byte{ 0x65, 0x65, 0x76, 0x65, 0x72, 0x73, 0x65, 0x2e, 0x6c, 0x61, 0x6b, 0x65, 0x66, 0x73, 0x2e, 0x67, 0x72, 0x61, 0x76, 0x65, 0x6c, 0x65, 0x72, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, - 0x6d, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xbf, 0x02, 0x0a, 0x0e, 0x52, 0x65, 0x70, + 0x6d, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xde, 0x02, 0x0a, 0x0e, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x44, 0x61, 0x74, 0x61, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x2b, 0x0a, 0x11, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, @@ -1054,170 +1062,172 @@ var file_graveler_graveler_proto_rawDesc = []byte{ 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x75, 0x69, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x55, 0x69, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x6f, 0x6e, 0x6c, 0x79, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x08, 0x72, 0x65, 0x61, 0x64, 0x4f, 0x6e, 0x6c, 0x79, 0x22, 0x9b, 0x01, 0x0a, 0x0a, 0x42, - 0x72, 0x61, 0x6e, 0x63, 0x68, 0x44, 0x61, 0x74, 0x61, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x63, 0x6f, 0x6d, - 0x6d, 0x69, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x63, 0x6f, - 0x6d, 0x6d, 0x69, 0x74, 0x49, 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x73, 0x74, 0x61, 0x67, 0x69, 0x6e, - 0x67, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x73, - 0x74, 0x61, 0x67, 0x69, 0x6e, 0x67, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x23, 0x0a, 0x0d, 0x73, - 0x65, 0x61, 0x6c, 0x65, 0x64, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x18, 0x04, 0x20, 0x03, - 0x28, 0x09, 0x52, 0x0c, 0x73, 0x65, 0x61, 0x6c, 0x65, 0x64, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x73, - 0x12, 0x16, 0x0a, 0x06, 0x68, 0x69, 0x64, 0x64, 0x65, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x06, 0x68, 0x69, 0x64, 0x64, 0x65, 0x6e, 0x22, 0x36, 0x0a, 0x07, 0x54, 0x61, 0x67, 0x44, - 0x61, 0x74, 0x61, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x02, 0x69, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x5f, 0x69, 0x64, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x49, 0x64, - 0x22, 0x9e, 0x03, 0x0a, 0x0a, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x44, 0x61, 0x74, 0x61, 0x12, - 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, - 0x1c, 0x0a, 0x09, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x09, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x72, 0x12, 0x18, 0x0a, - 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, - 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x3f, 0x0a, 0x0d, 0x63, 0x72, 0x65, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x5f, 0x64, 0x61, 0x74, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, - 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, - 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0c, 0x63, 0x72, 0x65, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x65, 0x12, 0x22, 0x0a, 0x0d, 0x6d, 0x65, 0x74, 0x61, - 0x5f, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0b, 0x6d, 0x65, 0x74, 0x61, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x49, 0x64, 0x12, 0x52, 0x0a, 0x08, - 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x36, - 0x2e, 0x69, 0x6f, 0x2e, 0x74, 0x72, 0x65, 0x65, 0x76, 0x65, 0x72, 0x73, 0x65, 0x2e, 0x6c, 0x61, - 0x6b, 0x65, 0x66, 0x73, 0x2e, 0x67, 0x72, 0x61, 0x76, 0x65, 0x6c, 0x65, 0x72, 0x2e, 0x43, 0x6f, - 0x6d, 0x6d, 0x69, 0x74, 0x44, 0x61, 0x74, 0x61, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, - 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, - 0x12, 0x18, 0x0a, 0x07, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, - 0x09, 0x52, 0x07, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, - 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, 0x05, 0x52, 0x07, 0x76, 0x65, 0x72, - 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x18, 0x09, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0x3b, 0x0a, 0x0d, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, - 0x01, 0x22, 0x9a, 0x02, 0x0a, 0x16, 0x47, 0x61, 0x72, 0x62, 0x61, 0x67, 0x65, 0x43, 0x6f, 0x6c, - 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x12, 0x34, 0x0a, 0x16, - 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5f, 0x72, 0x65, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, - 0x6e, 0x5f, 0x64, 0x61, 0x79, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x14, 0x64, 0x65, - 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x61, - 0x79, 0x73, 0x12, 0x81, 0x01, 0x0a, 0x15, 0x62, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x5f, 0x72, 0x65, - 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x64, 0x61, 0x79, 0x73, 0x18, 0x02, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x4d, 0x2e, 0x69, 0x6f, 0x2e, 0x74, 0x72, 0x65, 0x65, 0x76, 0x65, 0x72, 0x73, - 0x65, 0x2e, 0x6c, 0x61, 0x6b, 0x65, 0x66, 0x73, 0x2e, 0x67, 0x72, 0x61, 0x76, 0x65, 0x6c, 0x65, - 0x72, 0x2e, 0x47, 0x61, 0x72, 0x62, 0x61, 0x67, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x52, + 0x52, 0x08, 0x72, 0x65, 0x61, 0x64, 0x4f, 0x6e, 0x6c, 0x79, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x74, + 0x6f, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, + 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x49, 0x64, 0x22, 0x9b, 0x01, 0x0a, 0x0a, 0x42, 0x72, + 0x61, 0x6e, 0x63, 0x68, 0x44, 0x61, 0x74, 0x61, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x63, 0x6f, 0x6d, 0x6d, + 0x69, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x63, 0x6f, 0x6d, + 0x6d, 0x69, 0x74, 0x49, 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x73, 0x74, 0x61, 0x67, 0x69, 0x6e, 0x67, + 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x73, 0x74, + 0x61, 0x67, 0x69, 0x6e, 0x67, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x23, 0x0a, 0x0d, 0x73, 0x65, + 0x61, 0x6c, 0x65, 0x64, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, + 0x09, 0x52, 0x0c, 0x73, 0x65, 0x61, 0x6c, 0x65, 0x64, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x12, + 0x16, 0x0a, 0x06, 0x68, 0x69, 0x64, 0x64, 0x65, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x06, 0x68, 0x69, 0x64, 0x64, 0x65, 0x6e, 0x22, 0x36, 0x0a, 0x07, 0x54, 0x61, 0x67, 0x44, 0x61, + 0x74, 0x61, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, + 0x69, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x5f, 0x69, 0x64, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x49, 0x64, 0x22, + 0x9e, 0x03, 0x0a, 0x0a, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x44, 0x61, 0x74, 0x61, 0x12, 0x0e, + 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1c, + 0x0a, 0x09, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x09, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x72, 0x12, 0x18, 0x0a, 0x07, + 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, + 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x3f, 0x0a, 0x0d, 0x63, 0x72, 0x65, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x5f, 0x64, 0x61, 0x74, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, + 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, + 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0c, 0x63, 0x72, 0x65, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x65, 0x12, 0x22, 0x0a, 0x0d, 0x6d, 0x65, 0x74, 0x61, 0x5f, + 0x72, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, + 0x6d, 0x65, 0x74, 0x61, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x49, 0x64, 0x12, 0x52, 0x0a, 0x08, 0x6d, + 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x36, 0x2e, + 0x69, 0x6f, 0x2e, 0x74, 0x72, 0x65, 0x65, 0x76, 0x65, 0x72, 0x73, 0x65, 0x2e, 0x6c, 0x61, 0x6b, + 0x65, 0x66, 0x73, 0x2e, 0x67, 0x72, 0x61, 0x76, 0x65, 0x6c, 0x65, 0x72, 0x2e, 0x43, 0x6f, 0x6d, + 0x6d, 0x69, 0x74, 0x44, 0x61, 0x74, 0x61, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, + 0x18, 0x0a, 0x07, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x09, + 0x52, 0x07, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, + 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, 0x05, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, + 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x18, 0x09, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x1a, 0x3b, 0x0a, 0x0d, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, + 0x22, 0x9a, 0x02, 0x0a, 0x16, 0x47, 0x61, 0x72, 0x62, 0x61, 0x67, 0x65, 0x43, 0x6f, 0x6c, 0x6c, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x12, 0x34, 0x0a, 0x16, 0x64, + 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5f, 0x72, 0x65, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, + 0x5f, 0x64, 0x61, 0x79, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x14, 0x64, 0x65, 0x66, + 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x79, + 0x73, 0x12, 0x81, 0x01, 0x0a, 0x15, 0x62, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x5f, 0x72, 0x65, 0x74, + 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x64, 0x61, 0x79, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x4d, 0x2e, 0x69, 0x6f, 0x2e, 0x74, 0x72, 0x65, 0x65, 0x76, 0x65, 0x72, 0x73, 0x65, + 0x2e, 0x6c, 0x61, 0x6b, 0x65, 0x66, 0x73, 0x2e, 0x67, 0x72, 0x61, 0x76, 0x65, 0x6c, 0x65, 0x72, + 0x2e, 0x47, 0x61, 0x72, 0x62, 0x61, 0x67, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x52, 0x65, + 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x79, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x52, 0x13, 0x62, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x52, 0x65, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, + 0x6e, 0x44, 0x61, 0x79, 0x73, 0x1a, 0x46, 0x0a, 0x18, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x52, 0x65, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x79, 0x73, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x52, 0x13, 0x62, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x52, 0x65, 0x74, 0x65, 0x6e, 0x74, 0x69, - 0x6f, 0x6e, 0x44, 0x61, 0x79, 0x73, 0x1a, 0x46, 0x0a, 0x18, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, - 0x52, 0x65, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x79, 0x73, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x05, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x73, - 0x0a, 0x1e, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x50, 0x72, 0x6f, 0x74, 0x65, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x12, 0x51, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0e, 0x32, - 0x3b, 0x2e, 0x69, 0x6f, 0x2e, 0x74, 0x72, 0x65, 0x65, 0x76, 0x65, 0x72, 0x73, 0x65, 0x2e, 0x6c, - 0x61, 0x6b, 0x65, 0x66, 0x73, 0x2e, 0x67, 0x72, 0x61, 0x76, 0x65, 0x6c, 0x65, 0x72, 0x2e, 0x42, - 0x72, 0x61, 0x6e, 0x63, 0x68, 0x50, 0x72, 0x6f, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x42, - 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x22, 0xcb, 0x02, 0x0a, 0x15, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x50, 0x72, - 0x6f, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x12, 0xa0, 0x01, - 0x0a, 0x21, 0x62, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x5f, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, - 0x5f, 0x74, 0x6f, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x5f, 0x61, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x56, 0x2e, 0x69, 0x6f, 0x2e, 0x74, - 0x72, 0x65, 0x65, 0x76, 0x65, 0x72, 0x73, 0x65, 0x2e, 0x6c, 0x61, 0x6b, 0x65, 0x66, 0x73, 0x2e, - 0x67, 0x72, 0x61, 0x76, 0x65, 0x6c, 0x65, 0x72, 0x2e, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x50, - 0x72, 0x6f, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x42, - 0x72, 0x61, 0x6e, 0x63, 0x68, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x54, 0x6f, 0x42, 0x6c, - 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x52, 0x1d, 0x62, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, - 0x54, 0x6f, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x1a, 0x8e, 0x01, 0x0a, 0x22, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x50, 0x61, 0x74, 0x74, 0x65, - 0x72, 0x6e, 0x54, 0x6f, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x41, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x52, 0x0a, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3c, 0x2e, 0x69, 0x6f, 0x2e, 0x74, 0x72, + 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, + 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x05, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x73, 0x0a, + 0x1e, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x50, 0x72, 0x6f, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, + 0x51, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x3b, + 0x2e, 0x69, 0x6f, 0x2e, 0x74, 0x72, 0x65, 0x65, 0x76, 0x65, 0x72, 0x73, 0x65, 0x2e, 0x6c, 0x61, + 0x6b, 0x65, 0x66, 0x73, 0x2e, 0x67, 0x72, 0x61, 0x76, 0x65, 0x6c, 0x65, 0x72, 0x2e, 0x42, 0x72, + 0x61, 0x6e, 0x63, 0x68, 0x50, 0x72, 0x6f, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x6c, + 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x22, 0xcb, 0x02, 0x0a, 0x15, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x50, 0x72, 0x6f, + 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x12, 0xa0, 0x01, 0x0a, + 0x21, 0x62, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x5f, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x5f, + 0x74, 0x6f, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x5f, 0x61, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x56, 0x2e, 0x69, 0x6f, 0x2e, 0x74, 0x72, 0x65, 0x65, 0x76, 0x65, 0x72, 0x73, 0x65, 0x2e, 0x6c, 0x61, 0x6b, 0x65, 0x66, 0x73, 0x2e, 0x67, 0x72, 0x61, 0x76, 0x65, 0x6c, 0x65, 0x72, 0x2e, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x50, 0x72, - 0x6f, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x41, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, - 0x01, 0x22, 0x53, 0x0a, 0x0f, 0x53, 0x74, 0x61, 0x67, 0x65, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x44, 0x61, 0x74, 0x61, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0c, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x1a, 0x0a, 0x08, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, - 0x74, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x08, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, - 0x74, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, - 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x22, 0x2b, 0x0a, 0x0f, 0x4c, 0x69, 0x6e, 0x6b, 0x41, 0x64, - 0x64, 0x72, 0x65, 0x73, 0x73, 0x44, 0x61, 0x74, 0x61, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x64, 0x64, - 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, - 0x65, 0x73, 0x73, 0x22, 0x92, 0x02, 0x0a, 0x10, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x53, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x44, 0x61, 0x74, 0x61, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x6f, 0x6d, 0x70, - 0x6c, 0x65, 0x74, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x63, 0x6f, 0x6d, - 0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x12, 0x39, 0x0a, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, - 0x64, 0x5f, 0x61, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, - 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, - 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, - 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x03, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x12, 0x21, 0x0a, - 0x0c, 0x6d, 0x65, 0x74, 0x61, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0b, 0x6d, 0x65, 0x74, 0x61, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x49, 0x64, - 0x12, 0x40, 0x0a, 0x06, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x28, 0x2e, 0x69, 0x6f, 0x2e, 0x74, 0x72, 0x65, 0x65, 0x76, 0x65, 0x72, 0x73, 0x65, 0x2e, - 0x6c, 0x61, 0x6b, 0x65, 0x66, 0x73, 0x2e, 0x67, 0x72, 0x61, 0x76, 0x65, 0x6c, 0x65, 0x72, 0x2e, - 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x44, 0x61, 0x74, 0x61, 0x52, 0x06, 0x63, 0x6f, 0x6d, 0x6d, - 0x69, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0xa1, 0x01, 0x0a, 0x0c, 0x52, 0x65, 0x70, - 0x6f, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x54, 0x0a, 0x08, 0x6d, 0x65, 0x74, - 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x69, 0x6f, - 0x2e, 0x74, 0x72, 0x65, 0x65, 0x76, 0x65, 0x72, 0x73, 0x65, 0x2e, 0x6c, 0x61, 0x6b, 0x65, 0x66, - 0x73, 0x2e, 0x67, 0x72, 0x61, 0x76, 0x65, 0x6c, 0x65, 0x72, 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x4d, - 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x1a, - 0x3b, 0x0a, 0x0d, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, - 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xc5, 0x03, 0x0a, - 0x0f, 0x50, 0x75, 0x6c, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x44, 0x61, 0x74, 0x61, - 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, - 0x12, 0x47, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, - 0x32, 0x2f, 0x2e, 0x69, 0x6f, 0x2e, 0x74, 0x72, 0x65, 0x65, 0x76, 0x65, 0x72, 0x73, 0x65, 0x2e, - 0x6c, 0x61, 0x6b, 0x65, 0x66, 0x73, 0x2e, 0x67, 0x72, 0x61, 0x76, 0x65, 0x6c, 0x65, 0x72, 0x2e, - 0x50, 0x75, 0x6c, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, - 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, - 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x64, 0x41, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x61, 0x75, - 0x74, 0x68, 0x6f, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x61, 0x75, 0x74, 0x68, - 0x6f, 0x72, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, - 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, - 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x23, 0x0a, 0x0d, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x62, - 0x72, 0x61, 0x6e, 0x63, 0x68, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x73, 0x6f, 0x75, - 0x72, 0x63, 0x65, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x12, 0x2d, 0x0a, 0x12, 0x64, 0x65, 0x73, - 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x62, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x18, - 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x64, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x12, 0x20, 0x0a, 0x09, 0x63, 0x6f, 0x6d, 0x6d, - 0x69, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x08, 0x63, - 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, 0x3c, 0x0a, 0x09, 0x63, 0x6c, - 0x6f, 0x73, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, - 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, - 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x48, 0x01, 0x52, 0x08, 0x63, 0x6c, 0x6f, - 0x73, 0x65, 0x64, 0x41, 0x74, 0x88, 0x01, 0x01, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x63, 0x6f, 0x6d, - 0x6d, 0x69, 0x74, 0x5f, 0x69, 0x64, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x63, 0x6c, 0x6f, 0x73, 0x65, - 0x64, 0x5f, 0x61, 0x74, 0x2a, 0x2e, 0x0a, 0x0f, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, - 0x72, 0x79, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x0a, 0x0a, 0x06, 0x41, 0x43, 0x54, 0x49, 0x56, - 0x45, 0x10, 0x00, 0x12, 0x0f, 0x0a, 0x0b, 0x49, 0x4e, 0x5f, 0x44, 0x45, 0x4c, 0x45, 0x54, 0x49, - 0x4f, 0x4e, 0x10, 0x01, 0x2a, 0x3e, 0x0a, 0x1d, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x50, 0x72, - 0x6f, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x41, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x11, 0x0a, 0x0d, 0x53, 0x54, 0x41, 0x47, 0x49, 0x4e, 0x47, - 0x5f, 0x57, 0x52, 0x49, 0x54, 0x45, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x43, 0x4f, 0x4d, 0x4d, - 0x49, 0x54, 0x10, 0x01, 0x2a, 0x35, 0x0a, 0x11, 0x50, 0x75, 0x6c, 0x6c, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x08, 0x0a, 0x04, 0x4f, 0x50, 0x45, - 0x4e, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x43, 0x4c, 0x4f, 0x53, 0x45, 0x44, 0x10, 0x01, 0x12, - 0x0a, 0x0a, 0x06, 0x4d, 0x45, 0x52, 0x47, 0x45, 0x44, 0x10, 0x02, 0x42, 0x26, 0x5a, 0x24, 0x67, - 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x74, 0x72, 0x65, 0x65, 0x76, 0x65, - 0x72, 0x73, 0x65, 0x2f, 0x6c, 0x61, 0x6b, 0x65, 0x66, 0x73, 0x2f, 0x67, 0x72, 0x61, 0x76, 0x65, - 0x6c, 0x65, 0x72, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x6f, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x42, 0x72, + 0x61, 0x6e, 0x63, 0x68, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x54, 0x6f, 0x42, 0x6c, 0x6f, + 0x63, 0x6b, 0x65, 0x64, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x52, 0x1d, 0x62, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x54, + 0x6f, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, + 0x8e, 0x01, 0x0a, 0x22, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, + 0x6e, 0x54, 0x6f, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x52, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3c, 0x2e, 0x69, 0x6f, 0x2e, 0x74, 0x72, 0x65, + 0x65, 0x76, 0x65, 0x72, 0x73, 0x65, 0x2e, 0x6c, 0x61, 0x6b, 0x65, 0x66, 0x73, 0x2e, 0x67, 0x72, + 0x61, 0x76, 0x65, 0x6c, 0x65, 0x72, 0x2e, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x50, 0x72, 0x6f, + 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x41, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, + 0x22, 0x53, 0x0a, 0x0f, 0x53, 0x74, 0x61, 0x67, 0x65, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x44, + 0x61, 0x74, 0x61, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, + 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x1a, 0x0a, 0x08, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, + 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x08, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, + 0x79, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, + 0x04, 0x64, 0x61, 0x74, 0x61, 0x22, 0x2b, 0x0a, 0x0f, 0x4c, 0x69, 0x6e, 0x6b, 0x41, 0x64, 0x64, + 0x72, 0x65, 0x73, 0x73, 0x44, 0x61, 0x74, 0x61, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, + 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, + 0x73, 0x73, 0x22, 0x92, 0x02, 0x0a, 0x10, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x53, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x44, 0x61, 0x74, 0x61, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x6f, 0x6d, 0x70, 0x6c, + 0x65, 0x74, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x63, 0x6f, 0x6d, 0x70, + 0x6c, 0x65, 0x74, 0x65, 0x64, 0x12, 0x39, 0x0a, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, + 0x5f, 0x61, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, + 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, + 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, + 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x03, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x12, 0x21, 0x0a, 0x0c, + 0x6d, 0x65, 0x74, 0x61, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0b, 0x6d, 0x65, 0x74, 0x61, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x49, 0x64, 0x12, + 0x40, 0x0a, 0x06, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x28, 0x2e, 0x69, 0x6f, 0x2e, 0x74, 0x72, 0x65, 0x65, 0x76, 0x65, 0x72, 0x73, 0x65, 0x2e, 0x6c, + 0x61, 0x6b, 0x65, 0x66, 0x73, 0x2e, 0x67, 0x72, 0x61, 0x76, 0x65, 0x6c, 0x65, 0x72, 0x2e, 0x43, + 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x44, 0x61, 0x74, 0x61, 0x52, 0x06, 0x63, 0x6f, 0x6d, 0x6d, 0x69, + 0x74, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0xa1, 0x01, 0x0a, 0x0c, 0x52, 0x65, 0x70, 0x6f, + 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x54, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, + 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x69, 0x6f, 0x2e, + 0x74, 0x72, 0x65, 0x65, 0x76, 0x65, 0x72, 0x73, 0x65, 0x2e, 0x6c, 0x61, 0x6b, 0x65, 0x66, 0x73, + 0x2e, 0x67, 0x72, 0x61, 0x76, 0x65, 0x6c, 0x65, 0x72, 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x4d, 0x65, + 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x1a, 0x3b, + 0x0a, 0x0d, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, + 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, + 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xc5, 0x03, 0x0a, 0x0f, + 0x50, 0x75, 0x6c, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x44, 0x61, 0x74, 0x61, 0x12, + 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, + 0x47, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, + 0x2f, 0x2e, 0x69, 0x6f, 0x2e, 0x74, 0x72, 0x65, 0x65, 0x76, 0x65, 0x72, 0x73, 0x65, 0x2e, 0x6c, + 0x61, 0x6b, 0x65, 0x66, 0x73, 0x2e, 0x67, 0x72, 0x61, 0x76, 0x65, 0x6c, 0x65, 0x72, 0x2e, 0x50, + 0x75, 0x6c, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, + 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, + 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x64, 0x41, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x61, 0x75, 0x74, + 0x68, 0x6f, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x61, 0x75, 0x74, 0x68, 0x6f, + 0x72, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x12, 0x23, 0x0a, 0x0d, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x62, 0x72, + 0x61, 0x6e, 0x63, 0x68, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x73, 0x6f, 0x75, 0x72, + 0x63, 0x65, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x12, 0x2d, 0x0a, 0x12, 0x64, 0x65, 0x73, 0x74, + 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x62, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x18, 0x08, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x64, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x12, 0x20, 0x0a, 0x09, 0x63, 0x6f, 0x6d, 0x6d, 0x69, + 0x74, 0x5f, 0x69, 0x64, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x08, 0x63, 0x6f, + 0x6d, 0x6d, 0x69, 0x74, 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, 0x3c, 0x0a, 0x09, 0x63, 0x6c, 0x6f, + 0x73, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, + 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, + 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x48, 0x01, 0x52, 0x08, 0x63, 0x6c, 0x6f, 0x73, + 0x65, 0x64, 0x41, 0x74, 0x88, 0x01, 0x01, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, + 0x69, 0x74, 0x5f, 0x69, 0x64, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x64, + 0x5f, 0x61, 0x74, 0x2a, 0x2e, 0x0a, 0x0f, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, + 0x79, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x0a, 0x0a, 0x06, 0x41, 0x43, 0x54, 0x49, 0x56, 0x45, + 0x10, 0x00, 0x12, 0x0f, 0x0a, 0x0b, 0x49, 0x4e, 0x5f, 0x44, 0x45, 0x4c, 0x45, 0x54, 0x49, 0x4f, + 0x4e, 0x10, 0x01, 0x2a, 0x3e, 0x0a, 0x1d, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x50, 0x72, 0x6f, + 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x41, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x11, 0x0a, 0x0d, 0x53, 0x54, 0x41, 0x47, 0x49, 0x4e, 0x47, 0x5f, + 0x57, 0x52, 0x49, 0x54, 0x45, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x43, 0x4f, 0x4d, 0x4d, 0x49, + 0x54, 0x10, 0x01, 0x2a, 0x35, 0x0a, 0x11, 0x50, 0x75, 0x6c, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x08, 0x0a, 0x04, 0x4f, 0x50, 0x45, 0x4e, + 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x43, 0x4c, 0x4f, 0x53, 0x45, 0x44, 0x10, 0x01, 0x12, 0x0a, + 0x0a, 0x06, 0x4d, 0x45, 0x52, 0x47, 0x45, 0x44, 0x10, 0x02, 0x42, 0x26, 0x5a, 0x24, 0x67, 0x69, + 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x74, 0x72, 0x65, 0x65, 0x76, 0x65, 0x72, + 0x73, 0x65, 0x2f, 0x6c, 0x61, 0x6b, 0x65, 0x66, 0x73, 0x2f, 0x67, 0x72, 0x61, 0x76, 0x65, 0x6c, + 0x65, 0x72, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/pkg/graveler/graveler.proto b/pkg/graveler/graveler.proto index 7f48453bf50..54cfbaaf35a 100644 --- a/pkg/graveler/graveler.proto +++ b/pkg/graveler/graveler.proto @@ -18,6 +18,7 @@ message RepositoryData { RepositoryState state = 5; string instance_uid = 6; bool read_only = 7; + string storage_id = 8; } message BranchData { diff --git a/pkg/graveler/model.go b/pkg/graveler/model.go index e3977aea54c..32d78f5a43a 100644 --- a/pkg/graveler/model.go +++ b/pkg/graveler/model.go @@ -118,6 +118,7 @@ func RepoFromProto(pb *RepositoryData) *RepositoryRecord { return &RepositoryRecord{ RepositoryID: RepositoryID(pb.Id), Repository: &Repository{ + StorageID: StorageID(pb.StorageId), StorageNamespace: StorageNamespace(pb.StorageNamespace), DefaultBranchID: BranchID(pb.DefaultBranchId), CreationDate: pb.CreationDate.AsTime(), @@ -131,6 +132,7 @@ func RepoFromProto(pb *RepositoryData) *RepositoryRecord { func ProtoFromRepo(repo *RepositoryRecord) *RepositoryData { return &RepositoryData{ Id: repo.RepositoryID.String(), + StorageId: repo.Repository.StorageID.String(), StorageNamespace: repo.Repository.StorageNamespace.String(), DefaultBranchId: repo.Repository.DefaultBranchID.String(), CreationDate: timestamppb.New(repo.Repository.CreationDate), diff --git a/pkg/graveler/validate.go b/pkg/graveler/validate.go index 71ccf860210..b02a04c65b0 100644 --- a/pkg/graveler/validate.go +++ b/pkg/graveler/validate.go @@ -7,6 +7,16 @@ import ( "github.com/treeverse/lakefs/pkg/validator" ) +func ValidateStorageID(v interface{}) error { + _, ok := v.(StorageID) + if !ok { + panic(ErrInvalidType) + } + + // TODO (gilo): Any other validations? + return nil +} + func ValidateStorageNamespace(v interface{}) error { s, ok := v.(StorageNamespace) if !ok { From 4e5198110d4c61d4b2dbe9b27e2abf41e908f6b5 Mon Sep 17 00:00:00 2001 From: Itai Gilo Date: Wed, 15 Jan 2025 20:11:54 +0000 Subject: [PATCH 02/26] Bug fixes --- pkg/api/controller.go | 6 +++--- pkg/graveler/mock/graveler.go | 16 ++++++++-------- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/pkg/api/controller.go b/pkg/api/controller.go index 190e3f05f92..0cc8cd57947 100644 --- a/pkg/api/controller.go +++ b/pkg/api/controller.go @@ -1907,7 +1907,7 @@ func (c *Controller) ListRepositories(w http.ResponseWriter, r *http.Request, pa creationDate := repo.CreationDate.Unix() r := apigen.Repository{ Id: repo.Name, - StorageId: swag.String(repo.StorageNamespace), + StorageId: swag.String(repo.StorageID), StorageNamespace: repo.StorageNamespace, CreationDate: creationDate, DefaultBranch: repo.DefaultBranch, @@ -2021,7 +2021,7 @@ func (c *Controller) CreateRepository(w http.ResponseWriter, r *http.Request, bo CreationDate: repo.CreationDate.Unix(), DefaultBranch: repo.DefaultBranch, Id: repo.Name, - StorageId: swag.String(repo.StorageNamespace), + StorageId: swag.String(repo.StorageID), StorageNamespace: repo.StorageNamespace, } writeResponse(w, r, http.StatusCreated, response) @@ -2169,7 +2169,7 @@ func (c *Controller) GetRepository(w http.ResponseWriter, r *http.Request, repos CreationDate: repo.CreationDate.Unix(), DefaultBranch: repo.DefaultBranch, Id: repo.Name, - StorageId: swag.String(repo.StorageNamespace), + StorageId: swag.String(repo.StorageID), StorageNamespace: repo.StorageNamespace, ReadOnly: swag.Bool(repo.ReadOnly), } diff --git a/pkg/graveler/mock/graveler.go b/pkg/graveler/mock/graveler.go index 2998afe71a7..61c7523eac4 100644 --- a/pkg/graveler/mock/graveler.go +++ b/pkg/graveler/mock/graveler.go @@ -276,18 +276,18 @@ func (mr *MockVersionControllerMockRecorder) Compare(ctx, repository, left, righ } // CreateBareRepository mocks base method. -func (m *MockVersionController) CreateBareRepository(ctx context.Context, repositoryID graveler.RepositoryID, storageNamespace graveler.StorageNamespace, defaultBranchID graveler.BranchID, readOnly bool) (*graveler.RepositoryRecord, error) { +func (m *MockVersionController) CreateBareRepository(ctx context.Context, repositoryID graveler.RepositoryID, storageID graveler.StorageID, storageNamespace graveler.StorageNamespace, defaultBranchID graveler.BranchID, readOnly bool) (*graveler.RepositoryRecord, error) { m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "CreateBareRepository", ctx, repositoryID, storageNamespace, defaultBranchID, readOnly) + ret := m.ctrl.Call(m, "CreateBareRepository", ctx, repositoryID, storageID, storageNamespace, defaultBranchID, readOnly) ret0, _ := ret[0].(*graveler.RepositoryRecord) ret1, _ := ret[1].(error) return ret0, ret1 } // CreateBareRepository indicates an expected call of CreateBareRepository. -func (mr *MockVersionControllerMockRecorder) CreateBareRepository(ctx, repositoryID, storageNamespace, defaultBranchID, readOnly interface{}) *gomock.Call { +func (mr *MockVersionControllerMockRecorder) CreateBareRepository(ctx, repositoryID, storageID, storageNamespace, defaultBranchID, readOnly interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CreateBareRepository", reflect.TypeOf((*MockVersionController)(nil).CreateBareRepository), ctx, repositoryID, storageNamespace, defaultBranchID, readOnly) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CreateBareRepository", reflect.TypeOf((*MockVersionController)(nil).CreateBareRepository), ctx, repositoryID, storageID, storageNamespace, defaultBranchID, readOnly) } // CreateBranch mocks base method. @@ -330,18 +330,18 @@ func (mr *MockVersionControllerMockRecorder) CreateCommitRecord(ctx, repository, } // CreateRepository mocks base method. -func (m *MockVersionController) CreateRepository(ctx context.Context, repositoryID graveler.RepositoryID, storageNamespace graveler.StorageNamespace, branchID graveler.BranchID, readOnly bool) (*graveler.RepositoryRecord, error) { +func (m *MockVersionController) CreateRepository(ctx context.Context, repositoryID graveler.RepositoryID, storageID graveler.StorageID, storageNamespace graveler.StorageNamespace, branchID graveler.BranchID, readOnly bool) (*graveler.RepositoryRecord, error) { m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "CreateRepository", ctx, repositoryID, storageNamespace, branchID, readOnly) + ret := m.ctrl.Call(m, "CreateRepository", ctx, repositoryID, storageID, storageNamespace, branchID, readOnly) ret0, _ := ret[0].(*graveler.RepositoryRecord) ret1, _ := ret[1].(error) return ret0, ret1 } // CreateRepository indicates an expected call of CreateRepository. -func (mr *MockVersionControllerMockRecorder) CreateRepository(ctx, repositoryID, storageNamespace, branchID, readOnly interface{}) *gomock.Call { +func (mr *MockVersionControllerMockRecorder) CreateRepository(ctx, repositoryID, storageID, storageNamespace, branchID, readOnly interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CreateRepository", reflect.TypeOf((*MockVersionController)(nil).CreateRepository), ctx, repositoryID, storageNamespace, branchID, readOnly) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CreateRepository", reflect.TypeOf((*MockVersionController)(nil).CreateRepository), ctx, repositoryID, storageID, storageNamespace, branchID, readOnly) } // CreateTag mocks base method. From 30b3849b2b982c9873d21e1815b748ab45fb2076 Mon Sep 17 00:00:00 2001 From: Itai Gilo Date: Wed, 15 Jan 2025 20:27:40 +0000 Subject: [PATCH 03/26] Remove API changes --- api/swagger.yml | 3 -- clients/java/api/openapi.yaml | 6 ---- clients/java/docs/Repository.md | 1 - .../lakefs/clients/sdk/model/Repository.java | 33 +------------------ .../clients/sdk/model/RepositoryTest.java | 8 ----- clients/python/docs/Repository.md | 1 - .../python/lakefs_sdk/models/repository.py | 4 +-- clients/python/test/test_repository.py | 1 - clients/python/test/test_repository_list.py | 2 -- clients/rust/docs/Repository.md | 1 - clients/rust/src/models/repository.rs | 4 --- docs/assets/js/swagger.yml | 3 -- pkg/api/controller.go | 10 ++---- 13 files changed, 4 insertions(+), 73 deletions(-) diff --git a/api/swagger.yml b/api/swagger.yml index 039303747f9..470f260b991 100644 --- a/api/swagger.yml +++ b/api/swagger.yml @@ -184,9 +184,6 @@ components: description: Unix Epoch in seconds default_branch: type: string - storage_id: - type: string - description: Unique identifier of the underlying data store storage_namespace: type: string description: Filesystem URI to store the underlying data in (e.g. "s3://my-bucket/some/path/") diff --git a/clients/java/api/openapi.yaml b/clients/java/api/openapi.yaml index 458f93d2741..ed985e4b3ef 100644 --- a/clients/java/api/openapi.yaml +++ b/clients/java/api/openapi.yaml @@ -7501,7 +7501,6 @@ components: Repository: example: read_only: true - storage_id: storage_id default_branch: default_branch id: id creation_date: 0 @@ -7515,9 +7514,6 @@ components: type: integer default_branch: type: string - storage_id: - description: Unique identifier of the underlying data store - type: string storage_namespace: description: Filesystem URI to store the underlying data in (e.g. "s3://my-bucket/some/path/") type: string @@ -7570,13 +7566,11 @@ components: results: 0 results: - read_only: true - storage_id: storage_id default_branch: default_branch id: id creation_date: 0 storage_namespace: storage_namespace - read_only: true - storage_id: storage_id default_branch: default_branch id: id creation_date: 0 diff --git a/clients/java/docs/Repository.md b/clients/java/docs/Repository.md index eb00c5451e9..e5e9808dbf6 100644 --- a/clients/java/docs/Repository.md +++ b/clients/java/docs/Repository.md @@ -10,7 +10,6 @@ |**id** | **String** | | | |**creationDate** | **Long** | Unix Epoch in seconds | | |**defaultBranch** | **String** | | | -|**storageId** | **String** | Unique identifier of the underlying data store | [optional] | |**storageNamespace** | **String** | Filesystem URI to store the underlying data in (e.g. \"s3://my-bucket/some/path/\") | | |**readOnly** | **Boolean** | Whether the repository is a read-only repository- not relevant for bare repositories | [optional] | diff --git a/clients/java/src/main/java/io/lakefs/clients/sdk/model/Repository.java b/clients/java/src/main/java/io/lakefs/clients/sdk/model/Repository.java index 82f960d76c8..4978119e72b 100644 --- a/clients/java/src/main/java/io/lakefs/clients/sdk/model/Repository.java +++ b/clients/java/src/main/java/io/lakefs/clients/sdk/model/Repository.java @@ -64,10 +64,6 @@ public class Repository { @SerializedName(SERIALIZED_NAME_DEFAULT_BRANCH) private String defaultBranch; - public static final String SERIALIZED_NAME_STORAGE_ID = "storage_id"; - @SerializedName(SERIALIZED_NAME_STORAGE_ID) - private String storageId; - public static final String SERIALIZED_NAME_STORAGE_NAMESPACE = "storage_namespace"; @SerializedName(SERIALIZED_NAME_STORAGE_NAMESPACE) private String storageNamespace; @@ -142,27 +138,6 @@ public void setDefaultBranch(String defaultBranch) { } - public Repository storageId(String storageId) { - - this.storageId = storageId; - return this; - } - - /** - * Unique identifier of the underlying data store - * @return storageId - **/ - @javax.annotation.Nullable - public String getStorageId() { - return storageId; - } - - - public void setStorageId(String storageId) { - this.storageId = storageId; - } - - public Repository storageNamespace(String storageNamespace) { this.storageNamespace = storageNamespace; @@ -262,7 +237,6 @@ public boolean equals(Object o) { return Objects.equals(this.id, repository.id) && Objects.equals(this.creationDate, repository.creationDate) && Objects.equals(this.defaultBranch, repository.defaultBranch) && - Objects.equals(this.storageId, repository.storageId) && Objects.equals(this.storageNamespace, repository.storageNamespace) && Objects.equals(this.readOnly, repository.readOnly)&& Objects.equals(this.additionalProperties, repository.additionalProperties); @@ -270,7 +244,7 @@ public boolean equals(Object o) { @Override public int hashCode() { - return Objects.hash(id, creationDate, defaultBranch, storageId, storageNamespace, readOnly, additionalProperties); + return Objects.hash(id, creationDate, defaultBranch, storageNamespace, readOnly, additionalProperties); } @Override @@ -280,7 +254,6 @@ public String toString() { sb.append(" id: ").append(toIndentedString(id)).append("\n"); sb.append(" creationDate: ").append(toIndentedString(creationDate)).append("\n"); sb.append(" defaultBranch: ").append(toIndentedString(defaultBranch)).append("\n"); - sb.append(" storageId: ").append(toIndentedString(storageId)).append("\n"); sb.append(" storageNamespace: ").append(toIndentedString(storageNamespace)).append("\n"); sb.append(" readOnly: ").append(toIndentedString(readOnly)).append("\n"); sb.append(" additionalProperties: ").append(toIndentedString(additionalProperties)).append("\n"); @@ -309,7 +282,6 @@ private String toIndentedString(Object o) { openapiFields.add("id"); openapiFields.add("creation_date"); openapiFields.add("default_branch"); - openapiFields.add("storage_id"); openapiFields.add("storage_namespace"); openapiFields.add("read_only"); @@ -347,9 +319,6 @@ public static void validateJsonElement(JsonElement jsonElement) throws IOExcepti if (!jsonObj.get("default_branch").isJsonPrimitive()) { throw new IllegalArgumentException(String.format("Expected the field `default_branch` to be a primitive type in the JSON string but got `%s`", jsonObj.get("default_branch").toString())); } - if ((jsonObj.get("storage_id") != null && !jsonObj.get("storage_id").isJsonNull()) && !jsonObj.get("storage_id").isJsonPrimitive()) { - throw new IllegalArgumentException(String.format("Expected the field `storage_id` to be a primitive type in the JSON string but got `%s`", jsonObj.get("storage_id").toString())); - } if (!jsonObj.get("storage_namespace").isJsonPrimitive()) { throw new IllegalArgumentException(String.format("Expected the field `storage_namespace` to be a primitive type in the JSON string but got `%s`", jsonObj.get("storage_namespace").toString())); } diff --git a/clients/java/src/test/java/io/lakefs/clients/sdk/model/RepositoryTest.java b/clients/java/src/test/java/io/lakefs/clients/sdk/model/RepositoryTest.java index aebd28faca0..ba349e17a31 100644 --- a/clients/java/src/test/java/io/lakefs/clients/sdk/model/RepositoryTest.java +++ b/clients/java/src/test/java/io/lakefs/clients/sdk/model/RepositoryTest.java @@ -61,14 +61,6 @@ public void defaultBranchTest() { // TODO: test defaultBranch } - /** - * Test the property 'storageId' - */ - @Test - public void storageIdTest() { - // TODO: test storageId - } - /** * Test the property 'storageNamespace' */ diff --git a/clients/python/docs/Repository.md b/clients/python/docs/Repository.md index 34c8b4b83ff..9a26acf43dd 100644 --- a/clients/python/docs/Repository.md +++ b/clients/python/docs/Repository.md @@ -8,7 +8,6 @@ Name | Type | Description | Notes **id** | **str** | | **creation_date** | **int** | Unix Epoch in seconds | **default_branch** | **str** | | -**storage_id** | **str** | Unique identifier of the underlying data store | [optional] **storage_namespace** | **str** | Filesystem URI to store the underlying data in (e.g. \"s3://my-bucket/some/path/\") | **read_only** | **bool** | Whether the repository is a read-only repository- not relevant for bare repositories | [optional] diff --git a/clients/python/lakefs_sdk/models/repository.py b/clients/python/lakefs_sdk/models/repository.py index df34e6034ca..44bfd179541 100644 --- a/clients/python/lakefs_sdk/models/repository.py +++ b/clients/python/lakefs_sdk/models/repository.py @@ -32,10 +32,9 @@ class Repository(BaseModel): id: StrictStr = Field(...) creation_date: StrictInt = Field(..., description="Unix Epoch in seconds") default_branch: StrictStr = Field(...) - storage_id: Optional[StrictStr] = Field(None, description="Unique identifier of the underlying data store") storage_namespace: StrictStr = Field(..., description="Filesystem URI to store the underlying data in (e.g. \"s3://my-bucket/some/path/\")") read_only: Optional[StrictBool] = Field(None, description="Whether the repository is a read-only repository- not relevant for bare repositories") - __properties = ["id", "creation_date", "default_branch", "storage_id", "storage_namespace", "read_only"] + __properties = ["id", "creation_date", "default_branch", "storage_namespace", "read_only"] class Config: """Pydantic configuration""" @@ -76,7 +75,6 @@ def from_dict(cls, obj: dict) -> Repository: "id": obj.get("id"), "creation_date": obj.get("creation_date"), "default_branch": obj.get("default_branch"), - "storage_id": obj.get("storage_id"), "storage_namespace": obj.get("storage_namespace"), "read_only": obj.get("read_only") }) diff --git a/clients/python/test/test_repository.py b/clients/python/test/test_repository.py index 34fc696a290..7ba2d7937fa 100644 --- a/clients/python/test/test_repository.py +++ b/clients/python/test/test_repository.py @@ -42,7 +42,6 @@ def make_instance(self, include_optional): id = '', creation_date = 56, default_branch = '', - storage_id = '', storage_namespace = '', read_only = True ) diff --git a/clients/python/test/test_repository_list.py b/clients/python/test/test_repository_list.py index 6667a001ae7..72beb45a0b5 100644 --- a/clients/python/test/test_repository_list.py +++ b/clients/python/test/test_repository_list.py @@ -49,7 +49,6 @@ def make_instance(self, include_optional): id = '', creation_date = 56, default_branch = '', - storage_id = '', storage_namespace = '', read_only = True, ) ] @@ -66,7 +65,6 @@ def make_instance(self, include_optional): id = '', creation_date = 56, default_branch = '', - storage_id = '', storage_namespace = '', read_only = True, ) ], diff --git a/clients/rust/docs/Repository.md b/clients/rust/docs/Repository.md index 8ed0507d956..66325f4be96 100644 --- a/clients/rust/docs/Repository.md +++ b/clients/rust/docs/Repository.md @@ -7,7 +7,6 @@ Name | Type | Description | Notes **id** | **String** | | **creation_date** | **i64** | Unix Epoch in seconds | **default_branch** | **String** | | -**storage_id** | Option<**String**> | Unique identifier of the underlying data store | [optional] **storage_namespace** | **String** | Filesystem URI to store the underlying data in (e.g. \"s3://my-bucket/some/path/\") | **read_only** | Option<**bool**> | Whether the repository is a read-only repository- not relevant for bare repositories | [optional] diff --git a/clients/rust/src/models/repository.rs b/clients/rust/src/models/repository.rs index c1917fe1b4e..0c1eb05c539 100644 --- a/clients/rust/src/models/repository.rs +++ b/clients/rust/src/models/repository.rs @@ -19,9 +19,6 @@ pub struct Repository { pub creation_date: i64, #[serde(rename = "default_branch")] pub default_branch: String, - /// Unique identifier of the underlying data store - #[serde(rename = "storage_id", skip_serializing_if = "Option::is_none")] - pub storage_id: Option, /// Filesystem URI to store the underlying data in (e.g. \"s3://my-bucket/some/path/\") #[serde(rename = "storage_namespace")] pub storage_namespace: String, @@ -36,7 +33,6 @@ impl Repository { id, creation_date, default_branch, - storage_id: None, storage_namespace, read_only: None, } diff --git a/docs/assets/js/swagger.yml b/docs/assets/js/swagger.yml index 039303747f9..470f260b991 100644 --- a/docs/assets/js/swagger.yml +++ b/docs/assets/js/swagger.yml @@ -184,9 +184,6 @@ components: description: Unix Epoch in seconds default_branch: type: string - storage_id: - type: string - description: Unique identifier of the underlying data store storage_namespace: type: string description: Filesystem URI to store the underlying data in (e.g. "s3://my-bucket/some/path/") diff --git a/pkg/api/controller.go b/pkg/api/controller.go index 0cc8cd57947..1b584999770 100644 --- a/pkg/api/controller.go +++ b/pkg/api/controller.go @@ -1907,7 +1907,6 @@ func (c *Controller) ListRepositories(w http.ResponseWriter, r *http.Request, pa creationDate := repo.CreationDate.Unix() r := apigen.Repository{ Id: repo.Name, - StorageId: swag.String(repo.StorageID), StorageNamespace: repo.StorageNamespace, CreationDate: creationDate, DefaultBranch: repo.DefaultBranch, @@ -1977,8 +1976,6 @@ func (c *Controller) CreateRepository(w http.ResponseWriter, r *http.Request, bo defaultBranch = "main" } - storageID := swag.StringValue(body.StorageId) - if !swag.BoolValue(body.ReadOnly) { if err := c.ensureStorageNamespace(ctx, body.StorageNamespace); err != nil { var ( @@ -2013,7 +2010,7 @@ func (c *Controller) CreateRepository(w http.ResponseWriter, r *http.Request, bo if swag.BoolValue(params.Bare) { // create a bare repository. This is useful in conjunction with refs-restore to create a copy // of another repository by e.g. copying the _lakefs/ directory and restoring its refs - repo, err := c.Catalog.CreateBareRepository(ctx, body.Name, storageID, body.StorageNamespace, defaultBranch, swag.BoolValue(body.ReadOnly)) + repo, err := c.Catalog.CreateBareRepository(ctx, body.Name, "", body.StorageNamespace, defaultBranch, swag.BoolValue(body.ReadOnly)) if c.handleAPIError(ctx, w, r, err) { return } @@ -2021,14 +2018,13 @@ func (c *Controller) CreateRepository(w http.ResponseWriter, r *http.Request, bo CreationDate: repo.CreationDate.Unix(), DefaultBranch: repo.DefaultBranch, Id: repo.Name, - StorageId: swag.String(repo.StorageID), StorageNamespace: repo.StorageNamespace, } writeResponse(w, r, http.StatusCreated, response) return } - newRepo, err := c.Catalog.CreateRepository(ctx, body.Name, storageID, body.StorageNamespace, defaultBranch, swag.BoolValue(body.ReadOnly)) + newRepo, err := c.Catalog.CreateRepository(ctx, body.Name, "", body.StorageNamespace, defaultBranch, swag.BoolValue(body.ReadOnly)) if err != nil { c.handleAPIError(ctx, w, r, fmt.Errorf("error creating repository: %w", err)) return @@ -2059,7 +2055,6 @@ func (c *Controller) CreateRepository(w http.ResponseWriter, r *http.Request, bo CreationDate: newRepo.CreationDate.Unix(), DefaultBranch: newRepo.DefaultBranch, Id: newRepo.Name, - StorageId: swag.String(newRepo.StorageNamespace), StorageNamespace: newRepo.StorageNamespace, ReadOnly: swag.Bool(newRepo.ReadOnly), } @@ -2169,7 +2164,6 @@ func (c *Controller) GetRepository(w http.ResponseWriter, r *http.Request, repos CreationDate: repo.CreationDate.Unix(), DefaultBranch: repo.DefaultBranch, Id: repo.Name, - StorageId: swag.String(repo.StorageID), StorageNamespace: repo.StorageNamespace, ReadOnly: swag.Bool(repo.ReadOnly), } From b45d428797a6c449d5ae154c2df121cf7355f6f6 Mon Sep 17 00:00:00 2001 From: Itai Gilo Date: Wed, 15 Jan 2025 20:30:48 +0000 Subject: [PATCH 04/26] Add StorageID to Repo endpoints --- api/swagger.yml | 3 ++ clients/java/api/openapi.yaml | 6 ++++ clients/java/docs/Repository.md | 1 + .../lakefs/clients/sdk/model/Repository.java | 33 ++++++++++++++++++- .../clients/sdk/model/RepositoryTest.java | 8 +++++ clients/python/docs/Repository.md | 1 + .../python/lakefs_sdk/models/repository.py | 4 ++- clients/python/test/test_repository.py | 1 + clients/python/test/test_repository_list.py | 2 ++ clients/rust/docs/Repository.md | 1 + clients/rust/src/models/repository.rs | 4 +++ docs/assets/js/swagger.yml | 3 ++ pkg/api/controller.go | 10 ++++-- 13 files changed, 73 insertions(+), 4 deletions(-) diff --git a/api/swagger.yml b/api/swagger.yml index 470f260b991..039303747f9 100644 --- a/api/swagger.yml +++ b/api/swagger.yml @@ -184,6 +184,9 @@ components: description: Unix Epoch in seconds default_branch: type: string + storage_id: + type: string + description: Unique identifier of the underlying data store storage_namespace: type: string description: Filesystem URI to store the underlying data in (e.g. "s3://my-bucket/some/path/") diff --git a/clients/java/api/openapi.yaml b/clients/java/api/openapi.yaml index ed985e4b3ef..458f93d2741 100644 --- a/clients/java/api/openapi.yaml +++ b/clients/java/api/openapi.yaml @@ -7501,6 +7501,7 @@ components: Repository: example: read_only: true + storage_id: storage_id default_branch: default_branch id: id creation_date: 0 @@ -7514,6 +7515,9 @@ components: type: integer default_branch: type: string + storage_id: + description: Unique identifier of the underlying data store + type: string storage_namespace: description: Filesystem URI to store the underlying data in (e.g. "s3://my-bucket/some/path/") type: string @@ -7566,11 +7570,13 @@ components: results: 0 results: - read_only: true + storage_id: storage_id default_branch: default_branch id: id creation_date: 0 storage_namespace: storage_namespace - read_only: true + storage_id: storage_id default_branch: default_branch id: id creation_date: 0 diff --git a/clients/java/docs/Repository.md b/clients/java/docs/Repository.md index e5e9808dbf6..eb00c5451e9 100644 --- a/clients/java/docs/Repository.md +++ b/clients/java/docs/Repository.md @@ -10,6 +10,7 @@ |**id** | **String** | | | |**creationDate** | **Long** | Unix Epoch in seconds | | |**defaultBranch** | **String** | | | +|**storageId** | **String** | Unique identifier of the underlying data store | [optional] | |**storageNamespace** | **String** | Filesystem URI to store the underlying data in (e.g. \"s3://my-bucket/some/path/\") | | |**readOnly** | **Boolean** | Whether the repository is a read-only repository- not relevant for bare repositories | [optional] | diff --git a/clients/java/src/main/java/io/lakefs/clients/sdk/model/Repository.java b/clients/java/src/main/java/io/lakefs/clients/sdk/model/Repository.java index 4978119e72b..82f960d76c8 100644 --- a/clients/java/src/main/java/io/lakefs/clients/sdk/model/Repository.java +++ b/clients/java/src/main/java/io/lakefs/clients/sdk/model/Repository.java @@ -64,6 +64,10 @@ public class Repository { @SerializedName(SERIALIZED_NAME_DEFAULT_BRANCH) private String defaultBranch; + public static final String SERIALIZED_NAME_STORAGE_ID = "storage_id"; + @SerializedName(SERIALIZED_NAME_STORAGE_ID) + private String storageId; + public static final String SERIALIZED_NAME_STORAGE_NAMESPACE = "storage_namespace"; @SerializedName(SERIALIZED_NAME_STORAGE_NAMESPACE) private String storageNamespace; @@ -138,6 +142,27 @@ public void setDefaultBranch(String defaultBranch) { } + public Repository storageId(String storageId) { + + this.storageId = storageId; + return this; + } + + /** + * Unique identifier of the underlying data store + * @return storageId + **/ + @javax.annotation.Nullable + public String getStorageId() { + return storageId; + } + + + public void setStorageId(String storageId) { + this.storageId = storageId; + } + + public Repository storageNamespace(String storageNamespace) { this.storageNamespace = storageNamespace; @@ -237,6 +262,7 @@ public boolean equals(Object o) { return Objects.equals(this.id, repository.id) && Objects.equals(this.creationDate, repository.creationDate) && Objects.equals(this.defaultBranch, repository.defaultBranch) && + Objects.equals(this.storageId, repository.storageId) && Objects.equals(this.storageNamespace, repository.storageNamespace) && Objects.equals(this.readOnly, repository.readOnly)&& Objects.equals(this.additionalProperties, repository.additionalProperties); @@ -244,7 +270,7 @@ public boolean equals(Object o) { @Override public int hashCode() { - return Objects.hash(id, creationDate, defaultBranch, storageNamespace, readOnly, additionalProperties); + return Objects.hash(id, creationDate, defaultBranch, storageId, storageNamespace, readOnly, additionalProperties); } @Override @@ -254,6 +280,7 @@ public String toString() { sb.append(" id: ").append(toIndentedString(id)).append("\n"); sb.append(" creationDate: ").append(toIndentedString(creationDate)).append("\n"); sb.append(" defaultBranch: ").append(toIndentedString(defaultBranch)).append("\n"); + sb.append(" storageId: ").append(toIndentedString(storageId)).append("\n"); sb.append(" storageNamespace: ").append(toIndentedString(storageNamespace)).append("\n"); sb.append(" readOnly: ").append(toIndentedString(readOnly)).append("\n"); sb.append(" additionalProperties: ").append(toIndentedString(additionalProperties)).append("\n"); @@ -282,6 +309,7 @@ private String toIndentedString(Object o) { openapiFields.add("id"); openapiFields.add("creation_date"); openapiFields.add("default_branch"); + openapiFields.add("storage_id"); openapiFields.add("storage_namespace"); openapiFields.add("read_only"); @@ -319,6 +347,9 @@ public static void validateJsonElement(JsonElement jsonElement) throws IOExcepti if (!jsonObj.get("default_branch").isJsonPrimitive()) { throw new IllegalArgumentException(String.format("Expected the field `default_branch` to be a primitive type in the JSON string but got `%s`", jsonObj.get("default_branch").toString())); } + if ((jsonObj.get("storage_id") != null && !jsonObj.get("storage_id").isJsonNull()) && !jsonObj.get("storage_id").isJsonPrimitive()) { + throw new IllegalArgumentException(String.format("Expected the field `storage_id` to be a primitive type in the JSON string but got `%s`", jsonObj.get("storage_id").toString())); + } if (!jsonObj.get("storage_namespace").isJsonPrimitive()) { throw new IllegalArgumentException(String.format("Expected the field `storage_namespace` to be a primitive type in the JSON string but got `%s`", jsonObj.get("storage_namespace").toString())); } diff --git a/clients/java/src/test/java/io/lakefs/clients/sdk/model/RepositoryTest.java b/clients/java/src/test/java/io/lakefs/clients/sdk/model/RepositoryTest.java index ba349e17a31..aebd28faca0 100644 --- a/clients/java/src/test/java/io/lakefs/clients/sdk/model/RepositoryTest.java +++ b/clients/java/src/test/java/io/lakefs/clients/sdk/model/RepositoryTest.java @@ -61,6 +61,14 @@ public void defaultBranchTest() { // TODO: test defaultBranch } + /** + * Test the property 'storageId' + */ + @Test + public void storageIdTest() { + // TODO: test storageId + } + /** * Test the property 'storageNamespace' */ diff --git a/clients/python/docs/Repository.md b/clients/python/docs/Repository.md index 9a26acf43dd..34c8b4b83ff 100644 --- a/clients/python/docs/Repository.md +++ b/clients/python/docs/Repository.md @@ -8,6 +8,7 @@ Name | Type | Description | Notes **id** | **str** | | **creation_date** | **int** | Unix Epoch in seconds | **default_branch** | **str** | | +**storage_id** | **str** | Unique identifier of the underlying data store | [optional] **storage_namespace** | **str** | Filesystem URI to store the underlying data in (e.g. \"s3://my-bucket/some/path/\") | **read_only** | **bool** | Whether the repository is a read-only repository- not relevant for bare repositories | [optional] diff --git a/clients/python/lakefs_sdk/models/repository.py b/clients/python/lakefs_sdk/models/repository.py index 44bfd179541..df34e6034ca 100644 --- a/clients/python/lakefs_sdk/models/repository.py +++ b/clients/python/lakefs_sdk/models/repository.py @@ -32,9 +32,10 @@ class Repository(BaseModel): id: StrictStr = Field(...) creation_date: StrictInt = Field(..., description="Unix Epoch in seconds") default_branch: StrictStr = Field(...) + storage_id: Optional[StrictStr] = Field(None, description="Unique identifier of the underlying data store") storage_namespace: StrictStr = Field(..., description="Filesystem URI to store the underlying data in (e.g. \"s3://my-bucket/some/path/\")") read_only: Optional[StrictBool] = Field(None, description="Whether the repository is a read-only repository- not relevant for bare repositories") - __properties = ["id", "creation_date", "default_branch", "storage_namespace", "read_only"] + __properties = ["id", "creation_date", "default_branch", "storage_id", "storage_namespace", "read_only"] class Config: """Pydantic configuration""" @@ -75,6 +76,7 @@ def from_dict(cls, obj: dict) -> Repository: "id": obj.get("id"), "creation_date": obj.get("creation_date"), "default_branch": obj.get("default_branch"), + "storage_id": obj.get("storage_id"), "storage_namespace": obj.get("storage_namespace"), "read_only": obj.get("read_only") }) diff --git a/clients/python/test/test_repository.py b/clients/python/test/test_repository.py index 7ba2d7937fa..34fc696a290 100644 --- a/clients/python/test/test_repository.py +++ b/clients/python/test/test_repository.py @@ -42,6 +42,7 @@ def make_instance(self, include_optional): id = '', creation_date = 56, default_branch = '', + storage_id = '', storage_namespace = '', read_only = True ) diff --git a/clients/python/test/test_repository_list.py b/clients/python/test/test_repository_list.py index 72beb45a0b5..6667a001ae7 100644 --- a/clients/python/test/test_repository_list.py +++ b/clients/python/test/test_repository_list.py @@ -49,6 +49,7 @@ def make_instance(self, include_optional): id = '', creation_date = 56, default_branch = '', + storage_id = '', storage_namespace = '', read_only = True, ) ] @@ -65,6 +66,7 @@ def make_instance(self, include_optional): id = '', creation_date = 56, default_branch = '', + storage_id = '', storage_namespace = '', read_only = True, ) ], diff --git a/clients/rust/docs/Repository.md b/clients/rust/docs/Repository.md index 66325f4be96..8ed0507d956 100644 --- a/clients/rust/docs/Repository.md +++ b/clients/rust/docs/Repository.md @@ -7,6 +7,7 @@ Name | Type | Description | Notes **id** | **String** | | **creation_date** | **i64** | Unix Epoch in seconds | **default_branch** | **String** | | +**storage_id** | Option<**String**> | Unique identifier of the underlying data store | [optional] **storage_namespace** | **String** | Filesystem URI to store the underlying data in (e.g. \"s3://my-bucket/some/path/\") | **read_only** | Option<**bool**> | Whether the repository is a read-only repository- not relevant for bare repositories | [optional] diff --git a/clients/rust/src/models/repository.rs b/clients/rust/src/models/repository.rs index 0c1eb05c539..c1917fe1b4e 100644 --- a/clients/rust/src/models/repository.rs +++ b/clients/rust/src/models/repository.rs @@ -19,6 +19,9 @@ pub struct Repository { pub creation_date: i64, #[serde(rename = "default_branch")] pub default_branch: String, + /// Unique identifier of the underlying data store + #[serde(rename = "storage_id", skip_serializing_if = "Option::is_none")] + pub storage_id: Option, /// Filesystem URI to store the underlying data in (e.g. \"s3://my-bucket/some/path/\") #[serde(rename = "storage_namespace")] pub storage_namespace: String, @@ -33,6 +36,7 @@ impl Repository { id, creation_date, default_branch, + storage_id: None, storage_namespace, read_only: None, } diff --git a/docs/assets/js/swagger.yml b/docs/assets/js/swagger.yml index 470f260b991..039303747f9 100644 --- a/docs/assets/js/swagger.yml +++ b/docs/assets/js/swagger.yml @@ -184,6 +184,9 @@ components: description: Unix Epoch in seconds default_branch: type: string + storage_id: + type: string + description: Unique identifier of the underlying data store storage_namespace: type: string description: Filesystem URI to store the underlying data in (e.g. "s3://my-bucket/some/path/") diff --git a/pkg/api/controller.go b/pkg/api/controller.go index 1b584999770..0cc8cd57947 100644 --- a/pkg/api/controller.go +++ b/pkg/api/controller.go @@ -1907,6 +1907,7 @@ func (c *Controller) ListRepositories(w http.ResponseWriter, r *http.Request, pa creationDate := repo.CreationDate.Unix() r := apigen.Repository{ Id: repo.Name, + StorageId: swag.String(repo.StorageID), StorageNamespace: repo.StorageNamespace, CreationDate: creationDate, DefaultBranch: repo.DefaultBranch, @@ -1976,6 +1977,8 @@ func (c *Controller) CreateRepository(w http.ResponseWriter, r *http.Request, bo defaultBranch = "main" } + storageID := swag.StringValue(body.StorageId) + if !swag.BoolValue(body.ReadOnly) { if err := c.ensureStorageNamespace(ctx, body.StorageNamespace); err != nil { var ( @@ -2010,7 +2013,7 @@ func (c *Controller) CreateRepository(w http.ResponseWriter, r *http.Request, bo if swag.BoolValue(params.Bare) { // create a bare repository. This is useful in conjunction with refs-restore to create a copy // of another repository by e.g. copying the _lakefs/ directory and restoring its refs - repo, err := c.Catalog.CreateBareRepository(ctx, body.Name, "", body.StorageNamespace, defaultBranch, swag.BoolValue(body.ReadOnly)) + repo, err := c.Catalog.CreateBareRepository(ctx, body.Name, storageID, body.StorageNamespace, defaultBranch, swag.BoolValue(body.ReadOnly)) if c.handleAPIError(ctx, w, r, err) { return } @@ -2018,13 +2021,14 @@ func (c *Controller) CreateRepository(w http.ResponseWriter, r *http.Request, bo CreationDate: repo.CreationDate.Unix(), DefaultBranch: repo.DefaultBranch, Id: repo.Name, + StorageId: swag.String(repo.StorageID), StorageNamespace: repo.StorageNamespace, } writeResponse(w, r, http.StatusCreated, response) return } - newRepo, err := c.Catalog.CreateRepository(ctx, body.Name, "", body.StorageNamespace, defaultBranch, swag.BoolValue(body.ReadOnly)) + newRepo, err := c.Catalog.CreateRepository(ctx, body.Name, storageID, body.StorageNamespace, defaultBranch, swag.BoolValue(body.ReadOnly)) if err != nil { c.handleAPIError(ctx, w, r, fmt.Errorf("error creating repository: %w", err)) return @@ -2055,6 +2059,7 @@ func (c *Controller) CreateRepository(w http.ResponseWriter, r *http.Request, bo CreationDate: newRepo.CreationDate.Unix(), DefaultBranch: newRepo.DefaultBranch, Id: newRepo.Name, + StorageId: swag.String(newRepo.StorageNamespace), StorageNamespace: newRepo.StorageNamespace, ReadOnly: swag.Bool(newRepo.ReadOnly), } @@ -2164,6 +2169,7 @@ func (c *Controller) GetRepository(w http.ResponseWriter, r *http.Request, repos CreationDate: repo.CreationDate.Unix(), DefaultBranch: repo.DefaultBranch, Id: repo.Name, + StorageId: swag.String(repo.StorageID), StorageNamespace: repo.StorageNamespace, ReadOnly: swag.Bool(repo.ReadOnly), } From 02e4404f2304ee66aa40a7d669b55ebe89a7d4ee Mon Sep 17 00:00:00 2001 From: Itai Gilo Date: Wed, 15 Jan 2025 20:38:57 +0000 Subject: [PATCH 05/26] Almost empty commit --- pkg/gateway/testutil/gateway_setup.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/gateway/testutil/gateway_setup.go b/pkg/gateway/testutil/gateway_setup.go index 033e1414788..46afd53936f 100644 --- a/pkg/gateway/testutil/gateway_setup.go +++ b/pkg/gateway/testutil/gateway_setup.go @@ -60,7 +60,7 @@ func GetBasicHandler(t *testing.T, authService *FakeAuthService, repoName string storageNamespace = "replay" } - // TODO (gilo): test storageID here? + // TODO (gilo): test the storageID here? _, err = c.CreateRepository(ctx, repoName, "", storageNamespace, "main", false) testutil.Must(t, err) From 74e220269a43f5709becc54254183e90b9ff6ede Mon Sep 17 00:00:00 2001 From: Itai Gilo Date: Wed, 15 Jan 2025 20:39:28 +0000 Subject: [PATCH 06/26] Revert almso empty commit --- pkg/gateway/testutil/gateway_setup.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/gateway/testutil/gateway_setup.go b/pkg/gateway/testutil/gateway_setup.go index 46afd53936f..033e1414788 100644 --- a/pkg/gateway/testutil/gateway_setup.go +++ b/pkg/gateway/testutil/gateway_setup.go @@ -60,7 +60,7 @@ func GetBasicHandler(t *testing.T, authService *FakeAuthService, repoName string storageNamespace = "replay" } - // TODO (gilo): test the storageID here? + // TODO (gilo): test storageID here? _, err = c.CreateRepository(ctx, repoName, "", storageNamespace, "main", false) testutil.Must(t, err) From 222b126dbca6b93bc4782c43253060de1c91a2a7 Mon Sep 17 00:00:00 2001 From: Itai Gilo Date: Wed, 15 Jan 2025 20:49:56 +0000 Subject: [PATCH 07/26] Remove from API --- api/swagger.yml | 3 -- clients/java/api/openapi.yaml | 4 --- clients/java/docs/RepositoryCreation.md | 1 - .../clients/sdk/model/RepositoryCreation.java | 33 +------------------ .../sdk/model/RepositoryCreationTest.java | 8 ----- clients/python/docs/RepositoryCreation.md | 1 - .../lakefs_sdk/models/repository_creation.py | 4 +-- .../python/test/test_repository_creation.py | 1 - clients/rust/docs/RepositoryCreation.md | 1 - .../rust/src/models/repository_creation.rs | 4 --- docs/assets/js/swagger.yml | 3 -- 11 files changed, 2 insertions(+), 61 deletions(-) diff --git a/api/swagger.yml b/api/swagger.yml index 470f260b991..8bbd763c01f 100644 --- a/api/swagger.yml +++ b/api/swagger.yml @@ -264,9 +264,6 @@ components: name: type: string pattern: "^[a-z0-9][a-z0-9-]{2,62}$" - storage_id: - type: string - description: Unique identifier of the underlying data store storage_namespace: type: string description: 'Filesystem URI to store the underlying data in (e.g. "s3://my-bucket/some/path/")' diff --git a/clients/java/api/openapi.yaml b/clients/java/api/openapi.yaml index ed985e4b3ef..6e89ca447db 100644 --- a/clients/java/api/openapi.yaml +++ b/clients/java/api/openapi.yaml @@ -7619,7 +7619,6 @@ components: example: sample_data: true read_only: true - storage_id: storage_id name: name default_branch: main storage_namespace: s3://example-bucket/ @@ -7627,9 +7626,6 @@ components: name: pattern: "^[a-z0-9][a-z0-9-]{2,62}$" type: string - storage_id: - description: Unique identifier of the underlying data store - type: string storage_namespace: description: Filesystem URI to store the underlying data in (e.g. "s3://my-bucket/some/path/") example: s3://example-bucket/ diff --git a/clients/java/docs/RepositoryCreation.md b/clients/java/docs/RepositoryCreation.md index d104df63524..c44ad50dbf7 100644 --- a/clients/java/docs/RepositoryCreation.md +++ b/clients/java/docs/RepositoryCreation.md @@ -8,7 +8,6 @@ | Name | Type | Description | Notes | |------------ | ------------- | ------------- | -------------| |**name** | **String** | | | -|**storageId** | **String** | Unique identifier of the underlying data store | [optional] | |**storageNamespace** | **String** | Filesystem URI to store the underlying data in (e.g. \"s3://my-bucket/some/path/\") | | |**defaultBranch** | **String** | | [optional] | |**sampleData** | **Boolean** | | [optional] | diff --git a/clients/java/src/main/java/io/lakefs/clients/sdk/model/RepositoryCreation.java b/clients/java/src/main/java/io/lakefs/clients/sdk/model/RepositoryCreation.java index dbfa5f29e41..fdbf5b1e8ec 100644 --- a/clients/java/src/main/java/io/lakefs/clients/sdk/model/RepositoryCreation.java +++ b/clients/java/src/main/java/io/lakefs/clients/sdk/model/RepositoryCreation.java @@ -56,10 +56,6 @@ public class RepositoryCreation { @SerializedName(SERIALIZED_NAME_NAME) private String name; - public static final String SERIALIZED_NAME_STORAGE_ID = "storage_id"; - @SerializedName(SERIALIZED_NAME_STORAGE_ID) - private String storageId; - public static final String SERIALIZED_NAME_STORAGE_NAMESPACE = "storage_namespace"; @SerializedName(SERIALIZED_NAME_STORAGE_NAMESPACE) private String storageNamespace; @@ -100,27 +96,6 @@ public void setName(String name) { } - public RepositoryCreation storageId(String storageId) { - - this.storageId = storageId; - return this; - } - - /** - * Unique identifier of the underlying data store - * @return storageId - **/ - @javax.annotation.Nullable - public String getStorageId() { - return storageId; - } - - - public void setStorageId(String storageId) { - this.storageId = storageId; - } - - public RepositoryCreation storageNamespace(String storageNamespace) { this.storageNamespace = storageNamespace; @@ -260,7 +235,6 @@ public boolean equals(Object o) { } RepositoryCreation repositoryCreation = (RepositoryCreation) o; return Objects.equals(this.name, repositoryCreation.name) && - Objects.equals(this.storageId, repositoryCreation.storageId) && Objects.equals(this.storageNamespace, repositoryCreation.storageNamespace) && Objects.equals(this.defaultBranch, repositoryCreation.defaultBranch) && Objects.equals(this.sampleData, repositoryCreation.sampleData) && @@ -270,7 +244,7 @@ public boolean equals(Object o) { @Override public int hashCode() { - return Objects.hash(name, storageId, storageNamespace, defaultBranch, sampleData, readOnly, additionalProperties); + return Objects.hash(name, storageNamespace, defaultBranch, sampleData, readOnly, additionalProperties); } @Override @@ -278,7 +252,6 @@ public String toString() { StringBuilder sb = new StringBuilder(); sb.append("class RepositoryCreation {\n"); sb.append(" name: ").append(toIndentedString(name)).append("\n"); - sb.append(" storageId: ").append(toIndentedString(storageId)).append("\n"); sb.append(" storageNamespace: ").append(toIndentedString(storageNamespace)).append("\n"); sb.append(" defaultBranch: ").append(toIndentedString(defaultBranch)).append("\n"); sb.append(" sampleData: ").append(toIndentedString(sampleData)).append("\n"); @@ -307,7 +280,6 @@ private String toIndentedString(Object o) { // a set of all properties/fields (JSON key names) openapiFields = new HashSet(); openapiFields.add("name"); - openapiFields.add("storage_id"); openapiFields.add("storage_namespace"); openapiFields.add("default_branch"); openapiFields.add("sample_data"); @@ -342,9 +314,6 @@ public static void validateJsonElement(JsonElement jsonElement) throws IOExcepti if (!jsonObj.get("name").isJsonPrimitive()) { throw new IllegalArgumentException(String.format("Expected the field `name` to be a primitive type in the JSON string but got `%s`", jsonObj.get("name").toString())); } - if ((jsonObj.get("storage_id") != null && !jsonObj.get("storage_id").isJsonNull()) && !jsonObj.get("storage_id").isJsonPrimitive()) { - throw new IllegalArgumentException(String.format("Expected the field `storage_id` to be a primitive type in the JSON string but got `%s`", jsonObj.get("storage_id").toString())); - } if (!jsonObj.get("storage_namespace").isJsonPrimitive()) { throw new IllegalArgumentException(String.format("Expected the field `storage_namespace` to be a primitive type in the JSON string but got `%s`", jsonObj.get("storage_namespace").toString())); } diff --git a/clients/java/src/test/java/io/lakefs/clients/sdk/model/RepositoryCreationTest.java b/clients/java/src/test/java/io/lakefs/clients/sdk/model/RepositoryCreationTest.java index 40baad5ebc4..7fc4f4a7746 100644 --- a/clients/java/src/test/java/io/lakefs/clients/sdk/model/RepositoryCreationTest.java +++ b/clients/java/src/test/java/io/lakefs/clients/sdk/model/RepositoryCreationTest.java @@ -45,14 +45,6 @@ public void nameTest() { // TODO: test name } - /** - * Test the property 'storageId' - */ - @Test - public void storageIdTest() { - // TODO: test storageId - } - /** * Test the property 'storageNamespace' */ diff --git a/clients/python/docs/RepositoryCreation.md b/clients/python/docs/RepositoryCreation.md index dca25858a08..f63db7b4a2d 100644 --- a/clients/python/docs/RepositoryCreation.md +++ b/clients/python/docs/RepositoryCreation.md @@ -6,7 +6,6 @@ Name | Type | Description | Notes ------------ | ------------- | ------------- | ------------- **name** | **str** | | -**storage_id** | **str** | Unique identifier of the underlying data store | [optional] **storage_namespace** | **str** | Filesystem URI to store the underlying data in (e.g. \"s3://my-bucket/some/path/\") | **default_branch** | **str** | | [optional] **sample_data** | **bool** | | [optional] [default to False] diff --git a/clients/python/lakefs_sdk/models/repository_creation.py b/clients/python/lakefs_sdk/models/repository_creation.py index 88452c5edfe..c53ace2d59b 100644 --- a/clients/python/lakefs_sdk/models/repository_creation.py +++ b/clients/python/lakefs_sdk/models/repository_creation.py @@ -30,12 +30,11 @@ class RepositoryCreation(BaseModel): RepositoryCreation """ name: constr(strict=True) = Field(...) - storage_id: Optional[StrictStr] = Field(None, description="Unique identifier of the underlying data store") storage_namespace: constr(strict=True) = Field(..., description="Filesystem URI to store the underlying data in (e.g. \"s3://my-bucket/some/path/\")") default_branch: Optional[StrictStr] = None sample_data: Optional[StrictBool] = False read_only: Optional[StrictBool] = False - __properties = ["name", "storage_id", "storage_namespace", "default_branch", "sample_data", "read_only"] + __properties = ["name", "storage_namespace", "default_branch", "sample_data", "read_only"] @validator('name') def name_validate_regular_expression(cls, value): @@ -88,7 +87,6 @@ def from_dict(cls, obj: dict) -> RepositoryCreation: _obj = RepositoryCreation.parse_obj({ "name": obj.get("name"), - "storage_id": obj.get("storage_id"), "storage_namespace": obj.get("storage_namespace"), "default_branch": obj.get("default_branch"), "sample_data": obj.get("sample_data") if obj.get("sample_data") is not None else False, diff --git a/clients/python/test/test_repository_creation.py b/clients/python/test/test_repository_creation.py index 4d69f26d3be..731d0d188f4 100644 --- a/clients/python/test/test_repository_creation.py +++ b/clients/python/test/test_repository_creation.py @@ -40,7 +40,6 @@ def make_instance(self, include_optional): if include_optional : return RepositoryCreation( name = 'wr1c2v7s6djuy1zmeto', - storage_id = '', storage_namespace = 's3://example-bucket/', default_branch = 'main', sample_data = True, diff --git a/clients/rust/docs/RepositoryCreation.md b/clients/rust/docs/RepositoryCreation.md index feed234e0ed..e046f41463c 100644 --- a/clients/rust/docs/RepositoryCreation.md +++ b/clients/rust/docs/RepositoryCreation.md @@ -5,7 +5,6 @@ Name | Type | Description | Notes ------------ | ------------- | ------------- | ------------- **name** | **String** | | -**storage_id** | Option<**String**> | Unique identifier of the underlying data store | [optional] **storage_namespace** | **String** | Filesystem URI to store the underlying data in (e.g. \"s3://my-bucket/some/path/\") | **default_branch** | Option<**String**> | | [optional] **sample_data** | Option<**bool**> | | [optional][default to false] diff --git a/clients/rust/src/models/repository_creation.rs b/clients/rust/src/models/repository_creation.rs index 43a0b4c1396..fe5b8286445 100644 --- a/clients/rust/src/models/repository_creation.rs +++ b/clients/rust/src/models/repository_creation.rs @@ -14,9 +14,6 @@ use crate::models; pub struct RepositoryCreation { #[serde(rename = "name")] pub name: String, - /// Unique identifier of the underlying data store - #[serde(rename = "storage_id", skip_serializing_if = "Option::is_none")] - pub storage_id: Option, /// Filesystem URI to store the underlying data in (e.g. \"s3://my-bucket/some/path/\") #[serde(rename = "storage_namespace")] pub storage_namespace: String, @@ -32,7 +29,6 @@ impl RepositoryCreation { pub fn new(name: String, storage_namespace: String) -> RepositoryCreation { RepositoryCreation { name, - storage_id: None, storage_namespace, default_branch: None, sample_data: None, diff --git a/docs/assets/js/swagger.yml b/docs/assets/js/swagger.yml index 470f260b991..8bbd763c01f 100644 --- a/docs/assets/js/swagger.yml +++ b/docs/assets/js/swagger.yml @@ -264,9 +264,6 @@ components: name: type: string pattern: "^[a-z0-9][a-z0-9-]{2,62}$" - storage_id: - type: string - description: Unique identifier of the underlying data store storage_namespace: type: string description: 'Filesystem URI to store the underlying data in (e.g. "s3://my-bucket/some/path/")' From 65974c07744658a12bebf0f53e13ea32ebc2523c Mon Sep 17 00:00:00 2001 From: Itai Gilo Date: Wed, 15 Jan 2025 20:54:00 +0000 Subject: [PATCH 08/26] Add param to Creation --- api/swagger.yml | 3 ++ clients/java/api/openapi.yaml | 4 +++ clients/java/docs/RepositoryCreation.md | 1 + .../clients/sdk/model/RepositoryCreation.java | 33 ++++++++++++++++++- .../sdk/model/RepositoryCreationTest.java | 8 +++++ clients/python/docs/RepositoryCreation.md | 1 + .../lakefs_sdk/models/repository_creation.py | 4 ++- .../python/test/test_repository_creation.py | 1 + clients/rust/docs/RepositoryCreation.md | 1 + .../rust/src/models/repository_creation.rs | 4 +++ docs/assets/js/swagger.yml | 3 ++ 11 files changed, 61 insertions(+), 2 deletions(-) diff --git a/api/swagger.yml b/api/swagger.yml index 4232104d21a..039303747f9 100644 --- a/api/swagger.yml +++ b/api/swagger.yml @@ -267,6 +267,9 @@ components: name: type: string pattern: "^[a-z0-9][a-z0-9-]{2,62}$" + storage_id: + type: string + description: Unique identifier of the underlying data store storage_namespace: type: string description: 'Filesystem URI to store the underlying data in (e.g. "s3://my-bucket/some/path/")' diff --git a/clients/java/api/openapi.yaml b/clients/java/api/openapi.yaml index 5d80758310d..458f93d2741 100644 --- a/clients/java/api/openapi.yaml +++ b/clients/java/api/openapi.yaml @@ -7625,6 +7625,7 @@ components: example: sample_data: true read_only: true + storage_id: storage_id name: name default_branch: main storage_namespace: s3://example-bucket/ @@ -7632,6 +7633,9 @@ components: name: pattern: "^[a-z0-9][a-z0-9-]{2,62}$" type: string + storage_id: + description: Unique identifier of the underlying data store + type: string storage_namespace: description: Filesystem URI to store the underlying data in (e.g. "s3://my-bucket/some/path/") example: s3://example-bucket/ diff --git a/clients/java/docs/RepositoryCreation.md b/clients/java/docs/RepositoryCreation.md index c44ad50dbf7..d104df63524 100644 --- a/clients/java/docs/RepositoryCreation.md +++ b/clients/java/docs/RepositoryCreation.md @@ -8,6 +8,7 @@ | Name | Type | Description | Notes | |------------ | ------------- | ------------- | -------------| |**name** | **String** | | | +|**storageId** | **String** | Unique identifier of the underlying data store | [optional] | |**storageNamespace** | **String** | Filesystem URI to store the underlying data in (e.g. \"s3://my-bucket/some/path/\") | | |**defaultBranch** | **String** | | [optional] | |**sampleData** | **Boolean** | | [optional] | diff --git a/clients/java/src/main/java/io/lakefs/clients/sdk/model/RepositoryCreation.java b/clients/java/src/main/java/io/lakefs/clients/sdk/model/RepositoryCreation.java index fdbf5b1e8ec..dbfa5f29e41 100644 --- a/clients/java/src/main/java/io/lakefs/clients/sdk/model/RepositoryCreation.java +++ b/clients/java/src/main/java/io/lakefs/clients/sdk/model/RepositoryCreation.java @@ -56,6 +56,10 @@ public class RepositoryCreation { @SerializedName(SERIALIZED_NAME_NAME) private String name; + public static final String SERIALIZED_NAME_STORAGE_ID = "storage_id"; + @SerializedName(SERIALIZED_NAME_STORAGE_ID) + private String storageId; + public static final String SERIALIZED_NAME_STORAGE_NAMESPACE = "storage_namespace"; @SerializedName(SERIALIZED_NAME_STORAGE_NAMESPACE) private String storageNamespace; @@ -96,6 +100,27 @@ public void setName(String name) { } + public RepositoryCreation storageId(String storageId) { + + this.storageId = storageId; + return this; + } + + /** + * Unique identifier of the underlying data store + * @return storageId + **/ + @javax.annotation.Nullable + public String getStorageId() { + return storageId; + } + + + public void setStorageId(String storageId) { + this.storageId = storageId; + } + + public RepositoryCreation storageNamespace(String storageNamespace) { this.storageNamespace = storageNamespace; @@ -235,6 +260,7 @@ public boolean equals(Object o) { } RepositoryCreation repositoryCreation = (RepositoryCreation) o; return Objects.equals(this.name, repositoryCreation.name) && + Objects.equals(this.storageId, repositoryCreation.storageId) && Objects.equals(this.storageNamespace, repositoryCreation.storageNamespace) && Objects.equals(this.defaultBranch, repositoryCreation.defaultBranch) && Objects.equals(this.sampleData, repositoryCreation.sampleData) && @@ -244,7 +270,7 @@ public boolean equals(Object o) { @Override public int hashCode() { - return Objects.hash(name, storageNamespace, defaultBranch, sampleData, readOnly, additionalProperties); + return Objects.hash(name, storageId, storageNamespace, defaultBranch, sampleData, readOnly, additionalProperties); } @Override @@ -252,6 +278,7 @@ public String toString() { StringBuilder sb = new StringBuilder(); sb.append("class RepositoryCreation {\n"); sb.append(" name: ").append(toIndentedString(name)).append("\n"); + sb.append(" storageId: ").append(toIndentedString(storageId)).append("\n"); sb.append(" storageNamespace: ").append(toIndentedString(storageNamespace)).append("\n"); sb.append(" defaultBranch: ").append(toIndentedString(defaultBranch)).append("\n"); sb.append(" sampleData: ").append(toIndentedString(sampleData)).append("\n"); @@ -280,6 +307,7 @@ private String toIndentedString(Object o) { // a set of all properties/fields (JSON key names) openapiFields = new HashSet(); openapiFields.add("name"); + openapiFields.add("storage_id"); openapiFields.add("storage_namespace"); openapiFields.add("default_branch"); openapiFields.add("sample_data"); @@ -314,6 +342,9 @@ public static void validateJsonElement(JsonElement jsonElement) throws IOExcepti if (!jsonObj.get("name").isJsonPrimitive()) { throw new IllegalArgumentException(String.format("Expected the field `name` to be a primitive type in the JSON string but got `%s`", jsonObj.get("name").toString())); } + if ((jsonObj.get("storage_id") != null && !jsonObj.get("storage_id").isJsonNull()) && !jsonObj.get("storage_id").isJsonPrimitive()) { + throw new IllegalArgumentException(String.format("Expected the field `storage_id` to be a primitive type in the JSON string but got `%s`", jsonObj.get("storage_id").toString())); + } if (!jsonObj.get("storage_namespace").isJsonPrimitive()) { throw new IllegalArgumentException(String.format("Expected the field `storage_namespace` to be a primitive type in the JSON string but got `%s`", jsonObj.get("storage_namespace").toString())); } diff --git a/clients/java/src/test/java/io/lakefs/clients/sdk/model/RepositoryCreationTest.java b/clients/java/src/test/java/io/lakefs/clients/sdk/model/RepositoryCreationTest.java index 7fc4f4a7746..40baad5ebc4 100644 --- a/clients/java/src/test/java/io/lakefs/clients/sdk/model/RepositoryCreationTest.java +++ b/clients/java/src/test/java/io/lakefs/clients/sdk/model/RepositoryCreationTest.java @@ -45,6 +45,14 @@ public void nameTest() { // TODO: test name } + /** + * Test the property 'storageId' + */ + @Test + public void storageIdTest() { + // TODO: test storageId + } + /** * Test the property 'storageNamespace' */ diff --git a/clients/python/docs/RepositoryCreation.md b/clients/python/docs/RepositoryCreation.md index f63db7b4a2d..dca25858a08 100644 --- a/clients/python/docs/RepositoryCreation.md +++ b/clients/python/docs/RepositoryCreation.md @@ -6,6 +6,7 @@ Name | Type | Description | Notes ------------ | ------------- | ------------- | ------------- **name** | **str** | | +**storage_id** | **str** | Unique identifier of the underlying data store | [optional] **storage_namespace** | **str** | Filesystem URI to store the underlying data in (e.g. \"s3://my-bucket/some/path/\") | **default_branch** | **str** | | [optional] **sample_data** | **bool** | | [optional] [default to False] diff --git a/clients/python/lakefs_sdk/models/repository_creation.py b/clients/python/lakefs_sdk/models/repository_creation.py index c53ace2d59b..88452c5edfe 100644 --- a/clients/python/lakefs_sdk/models/repository_creation.py +++ b/clients/python/lakefs_sdk/models/repository_creation.py @@ -30,11 +30,12 @@ class RepositoryCreation(BaseModel): RepositoryCreation """ name: constr(strict=True) = Field(...) + storage_id: Optional[StrictStr] = Field(None, description="Unique identifier of the underlying data store") storage_namespace: constr(strict=True) = Field(..., description="Filesystem URI to store the underlying data in (e.g. \"s3://my-bucket/some/path/\")") default_branch: Optional[StrictStr] = None sample_data: Optional[StrictBool] = False read_only: Optional[StrictBool] = False - __properties = ["name", "storage_namespace", "default_branch", "sample_data", "read_only"] + __properties = ["name", "storage_id", "storage_namespace", "default_branch", "sample_data", "read_only"] @validator('name') def name_validate_regular_expression(cls, value): @@ -87,6 +88,7 @@ def from_dict(cls, obj: dict) -> RepositoryCreation: _obj = RepositoryCreation.parse_obj({ "name": obj.get("name"), + "storage_id": obj.get("storage_id"), "storage_namespace": obj.get("storage_namespace"), "default_branch": obj.get("default_branch"), "sample_data": obj.get("sample_data") if obj.get("sample_data") is not None else False, diff --git a/clients/python/test/test_repository_creation.py b/clients/python/test/test_repository_creation.py index 731d0d188f4..4d69f26d3be 100644 --- a/clients/python/test/test_repository_creation.py +++ b/clients/python/test/test_repository_creation.py @@ -40,6 +40,7 @@ def make_instance(self, include_optional): if include_optional : return RepositoryCreation( name = 'wr1c2v7s6djuy1zmeto', + storage_id = '', storage_namespace = 's3://example-bucket/', default_branch = 'main', sample_data = True, diff --git a/clients/rust/docs/RepositoryCreation.md b/clients/rust/docs/RepositoryCreation.md index e046f41463c..feed234e0ed 100644 --- a/clients/rust/docs/RepositoryCreation.md +++ b/clients/rust/docs/RepositoryCreation.md @@ -5,6 +5,7 @@ Name | Type | Description | Notes ------------ | ------------- | ------------- | ------------- **name** | **String** | | +**storage_id** | Option<**String**> | Unique identifier of the underlying data store | [optional] **storage_namespace** | **String** | Filesystem URI to store the underlying data in (e.g. \"s3://my-bucket/some/path/\") | **default_branch** | Option<**String**> | | [optional] **sample_data** | Option<**bool**> | | [optional][default to false] diff --git a/clients/rust/src/models/repository_creation.rs b/clients/rust/src/models/repository_creation.rs index fe5b8286445..43a0b4c1396 100644 --- a/clients/rust/src/models/repository_creation.rs +++ b/clients/rust/src/models/repository_creation.rs @@ -14,6 +14,9 @@ use crate::models; pub struct RepositoryCreation { #[serde(rename = "name")] pub name: String, + /// Unique identifier of the underlying data store + #[serde(rename = "storage_id", skip_serializing_if = "Option::is_none")] + pub storage_id: Option, /// Filesystem URI to store the underlying data in (e.g. \"s3://my-bucket/some/path/\") #[serde(rename = "storage_namespace")] pub storage_namespace: String, @@ -29,6 +32,7 @@ impl RepositoryCreation { pub fn new(name: String, storage_namespace: String) -> RepositoryCreation { RepositoryCreation { name, + storage_id: None, storage_namespace, default_branch: None, sample_data: None, diff --git a/docs/assets/js/swagger.yml b/docs/assets/js/swagger.yml index 4232104d21a..039303747f9 100644 --- a/docs/assets/js/swagger.yml +++ b/docs/assets/js/swagger.yml @@ -267,6 +267,9 @@ components: name: type: string pattern: "^[a-z0-9][a-z0-9-]{2,62}$" + storage_id: + type: string + description: Unique identifier of the underlying data store storage_namespace: type: string description: 'Filesystem URI to store the underlying data in (e.g. "s3://my-bucket/some/path/")' From af9476e7d2a805bdbe4df3ffc7788665ce00179a Mon Sep 17 00:00:00 2001 From: Itai Gilo Date: Thu, 16 Jan 2025 09:27:01 +0000 Subject: [PATCH 09/26] Fix PR comments --- pkg/catalog/catalog.go | 2 -- pkg/gateway/testutil/gateway_setup.go | 1 - pkg/graveler/validate.go | 10 ---------- 3 files changed, 13 deletions(-) diff --git a/pkg/catalog/catalog.go b/pkg/catalog/catalog.go index b0270124390..b632783e187 100644 --- a/pkg/catalog/catalog.go +++ b/pkg/catalog/catalog.go @@ -453,7 +453,6 @@ func (c *Catalog) CreateRepository(ctx context.Context, repository string, stora branchID := graveler.BranchID(branch) if err := validator.Validate([]validator.ValidateArg{ {Name: "name", Value: repositoryID, Fn: graveler.ValidateRepositoryID}, - {Name: "storageID", Value: storageIdentifier, Fn: graveler.ValidateStorageID}, {Name: "storageNamespace", Value: storageNS, Fn: graveler.ValidateStorageNamespace}, }); err != nil { return nil, err @@ -482,7 +481,6 @@ func (c *Catalog) CreateBareRepository(ctx context.Context, repository string, s branchID := graveler.BranchID(defaultBranchID) if err := validator.Validate([]validator.ValidateArg{ {Name: "name", Value: repositoryID, Fn: graveler.ValidateRepositoryID}, - {Name: "storageID", Value: storageIdentifier, Fn: graveler.ValidateStorageID}, {Name: "storageNamespace", Value: storageNS, Fn: graveler.ValidateStorageNamespace}, }); err != nil { return nil, err diff --git a/pkg/gateway/testutil/gateway_setup.go b/pkg/gateway/testutil/gateway_setup.go index 033e1414788..b2eebf2a811 100644 --- a/pkg/gateway/testutil/gateway_setup.go +++ b/pkg/gateway/testutil/gateway_setup.go @@ -60,7 +60,6 @@ func GetBasicHandler(t *testing.T, authService *FakeAuthService, repoName string storageNamespace = "replay" } - // TODO (gilo): test storageID here? _, err = c.CreateRepository(ctx, repoName, "", storageNamespace, "main", false) testutil.Must(t, err) diff --git a/pkg/graveler/validate.go b/pkg/graveler/validate.go index b02a04c65b0..71ccf860210 100644 --- a/pkg/graveler/validate.go +++ b/pkg/graveler/validate.go @@ -7,16 +7,6 @@ import ( "github.com/treeverse/lakefs/pkg/validator" ) -func ValidateStorageID(v interface{}) error { - _, ok := v.(StorageID) - if !ok { - panic(ErrInvalidType) - } - - // TODO (gilo): Any other validations? - return nil -} - func ValidateStorageNamespace(v interface{}) error { s, ok := v.(StorageNamespace) if !ok { From 4e8e423d22016d6cd689b5cdd199eef3e5ae4953 Mon Sep 17 00:00:00 2001 From: Itai Gilo Date: Thu, 16 Jan 2025 09:27:10 +0000 Subject: [PATCH 10/26] Fix tests --- pkg/api/controller_test.go | 2 +- pkg/catalog/catalog_test.go | 48 ++++++++++++++++++------------------- 2 files changed, 25 insertions(+), 25 deletions(-) diff --git a/pkg/api/controller_test.go b/pkg/api/controller_test.go index c09892fb6f1..f8b10b93738 100644 --- a/pkg/api/controller_test.go +++ b/pkg/api/controller_test.go @@ -101,7 +101,7 @@ func TestController_ListRepositoriesHandler(t *testing.T) { t.Run("list some repos", func(t *testing.T) { // write some repos ctx := context.Background() - _, err := deps.catalog.CreateRepository(ctx, "foo1", "storage", onBlock(deps, "foo1"), "main", false) + _, err := deps.catalog.CreateRepository(ctx, "foo1", "", onBlock(deps, "foo1"), "main", false) testutil.Must(t, err) _, err = deps.catalog.CreateRepository(ctx, "foo2", "storage", onBlock(deps, "foo1"), "main", false) testutil.Must(t, err) diff --git a/pkg/catalog/catalog_test.go b/pkg/catalog/catalog_test.go index 5ac6daa6ca1..9aad74cd31d 100644 --- a/pkg/catalog/catalog_test.go +++ b/pkg/catalog/catalog_test.go @@ -73,11 +73,11 @@ func TestCatalog_ListRepositories(t *testing.T) { now := time.Now() gravelerData := []*graveler.RepositoryRecord{ {RepositoryID: "re", Repository: &graveler.Repository{StorageID: "storage", StorageNamespace: "storageNS1", CreationDate: now, DefaultBranchID: "main1"}}, - {RepositoryID: "repo1", Repository: &graveler.Repository{StorageID: "storage", StorageNamespace: "storageNS2", CreationDate: now, DefaultBranchID: "main2"}}, - {RepositoryID: "repo2", Repository: &graveler.Repository{StorageID: "storage", StorageNamespace: "storageNS3", CreationDate: now, DefaultBranchID: "main3"}}, - {RepositoryID: "repo22", Repository: &graveler.Repository{StorageID: "storage", StorageNamespace: "storageNS4", CreationDate: now, DefaultBranchID: "main4"}}, - {RepositoryID: "repo23", Repository: &graveler.Repository{StorageID: "storage", StorageNamespace: "storageNS5", CreationDate: now, DefaultBranchID: "main5"}}, - {RepositoryID: "repo3", Repository: &graveler.Repository{StorageID: "storage", StorageNamespace: "storageNS6", CreationDate: now, DefaultBranchID: "main6"}}, + {RepositoryID: "repo1", Repository: &graveler.Repository{StorageID: "storage1", StorageNamespace: "storageNS2", CreationDate: now, DefaultBranchID: "main2"}}, + {RepositoryID: "repo2", Repository: &graveler.Repository{StorageID: "storage1", StorageNamespace: "storageNS3", CreationDate: now, DefaultBranchID: "main3"}}, + {RepositoryID: "repo22", Repository: &graveler.Repository{StorageID: "storage1", StorageNamespace: "storageNS4", CreationDate: now, DefaultBranchID: "main4"}}, + {RepositoryID: "repo23", Repository: &graveler.Repository{StorageID: "storage1", StorageNamespace: "storageNS5", CreationDate: now, DefaultBranchID: "main5"}}, + {RepositoryID: "repo3", Repository: &graveler.Repository{StorageID: "storage2", StorageNamespace: "storageNS6", CreationDate: now, DefaultBranchID: "main6"}}, } type args struct { limit int @@ -102,11 +102,11 @@ func TestCatalog_ListRepositories(t *testing.T) { }, want: []*catalog.Repository{ {Name: "re", StorageID: "storage", StorageNamespace: "storageNS1", DefaultBranch: "main1", CreationDate: now}, - {Name: "repo1", StorageID: "storage", StorageNamespace: "storageNS2", DefaultBranch: "main2", CreationDate: now}, - {Name: "repo2", StorageID: "storage", StorageNamespace: "storageNS3", DefaultBranch: "main3", CreationDate: now}, - {Name: "repo22", StorageID: "storage", StorageNamespace: "storageNS4", DefaultBranch: "main4", CreationDate: now}, - {Name: "repo23", StorageID: "storage", StorageNamespace: "storageNS5", DefaultBranch: "main5", CreationDate: now}, - {Name: "repo3", StorageID: "storage", StorageNamespace: "storageNS6", DefaultBranch: "main6", CreationDate: now}, + {Name: "repo1", StorageID: "storage1", StorageNamespace: "storageNS2", DefaultBranch: "main2", CreationDate: now}, + {Name: "repo2", StorageID: "storage1", StorageNamespace: "storageNS3", DefaultBranch: "main3", CreationDate: now}, + {Name: "repo22", StorageID: "storage1", StorageNamespace: "storageNS4", DefaultBranch: "main4", CreationDate: now}, + {Name: "repo23", StorageID: "storage1", StorageNamespace: "storageNS5", DefaultBranch: "main5", CreationDate: now}, + {Name: "repo3", StorageID: "storage2", StorageNamespace: "storageNS6", DefaultBranch: "main6", CreationDate: now}, }, wantHasMore: false, wantErr: false, @@ -134,7 +134,7 @@ func TestCatalog_ListRepositories(t *testing.T) { searchString: "", }, want: []*catalog.Repository{ - {Name: "repo1", StorageID: "storage", StorageNamespace: "storageNS2", DefaultBranch: "main2", CreationDate: now}, + {Name: "repo1", StorageID: "storage1", StorageNamespace: "storageNS2", DefaultBranch: "main2", CreationDate: now}, }, wantHasMore: true, wantErr: false, @@ -148,8 +148,8 @@ func TestCatalog_ListRepositories(t *testing.T) { searchString: "", }, want: []*catalog.Repository{ - {Name: "repo2", StorageID: "storage", StorageNamespace: "storageNS3", DefaultBranch: "main3", CreationDate: now}, - {Name: "repo22", StorageID: "storage", StorageNamespace: "storageNS4", DefaultBranch: "main4", CreationDate: now}, + {Name: "repo2", StorageID: "storage1", StorageNamespace: "storageNS3", DefaultBranch: "main3", CreationDate: now}, + {Name: "repo22", StorageID: "storage1", StorageNamespace: "storageNS4", DefaultBranch: "main4", CreationDate: now}, }, wantHasMore: true, wantErr: false, @@ -163,7 +163,7 @@ func TestCatalog_ListRepositories(t *testing.T) { searchString: "", }, want: []*catalog.Repository{ - {Name: "repo1", StorageID: "storage", StorageNamespace: "storageNS2", DefaultBranch: "main2", CreationDate: now}, + {Name: "repo1", StorageID: "storage1", StorageNamespace: "storageNS2", DefaultBranch: "main2", CreationDate: now}, }, wantHasMore: true, wantErr: false, @@ -177,8 +177,8 @@ func TestCatalog_ListRepositories(t *testing.T) { searchString: "", }, want: []*catalog.Repository{ - {Name: "repo23", StorageID: "storage", StorageNamespace: "storageNS5", DefaultBranch: "main5", CreationDate: now}, - {Name: "repo3", StorageID: "storage", StorageNamespace: "storageNS6", DefaultBranch: "main6", CreationDate: now}, + {Name: "repo23", StorageID: "storage1", StorageNamespace: "storageNS5", DefaultBranch: "main5", CreationDate: now}, + {Name: "repo3", StorageID: "storage2", StorageNamespace: "storageNS6", DefaultBranch: "main6", CreationDate: now}, }, wantHasMore: false, wantErr: false, @@ -192,9 +192,9 @@ func TestCatalog_ListRepositories(t *testing.T) { searchString: "o2", }, want: []*catalog.Repository{ - {Name: "repo2", StorageID: "storage", StorageNamespace: "storageNS3", DefaultBranch: "main3", CreationDate: now}, - {Name: "repo22", StorageID: "storage", StorageNamespace: "storageNS4", DefaultBranch: "main4", CreationDate: now}, - {Name: "repo23", StorageID: "storage", StorageNamespace: "storageNS5", DefaultBranch: "main5", CreationDate: now}, + {Name: "repo2", StorageID: "storage1", StorageNamespace: "storageNS3", DefaultBranch: "main3", CreationDate: now}, + {Name: "repo22", StorageID: "storage1", StorageNamespace: "storageNS4", DefaultBranch: "main4", CreationDate: now}, + {Name: "repo23", StorageID: "storage1", StorageNamespace: "storageNS5", DefaultBranch: "main5", CreationDate: now}, }, wantHasMore: false, wantErr: false, @@ -208,8 +208,8 @@ func TestCatalog_ListRepositories(t *testing.T) { searchString: "o2", }, want: []*catalog.Repository{ - {Name: "repo2", StorageID: "storage", StorageNamespace: "storageNS3", DefaultBranch: "main3", CreationDate: now}, - {Name: "repo22", StorageID: "storage", StorageNamespace: "storageNS4", DefaultBranch: "main4", CreationDate: now}, + {Name: "repo2", StorageID: "storage1", StorageNamespace: "storageNS3", DefaultBranch: "main3", CreationDate: now}, + {Name: "repo22", StorageID: "storage1", StorageNamespace: "storageNS4", DefaultBranch: "main4", CreationDate: now}, }, wantHasMore: true, wantErr: false, @@ -223,7 +223,7 @@ func TestCatalog_ListRepositories(t *testing.T) { searchString: "o2", }, want: []*catalog.Repository{ - {Name: "repo23", StorageID: "storage", StorageNamespace: "storageNS5", DefaultBranch: "main5", CreationDate: now}, + {Name: "repo23", StorageID: "storage1", StorageNamespace: "storageNS5", DefaultBranch: "main5", CreationDate: now}, }, wantHasMore: false, wantErr: false, @@ -237,8 +237,8 @@ func TestCatalog_ListRepositories(t *testing.T) { searchString: "o2", }, want: []*catalog.Repository{ - {Name: "repo22", StorageID: "storage", StorageNamespace: "storageNS4", DefaultBranch: "main4", CreationDate: now}, - {Name: "repo23", StorageID: "storage", StorageNamespace: "storageNS5", DefaultBranch: "main5", CreationDate: now}, + {Name: "repo22", StorageID: "storage1", StorageNamespace: "storageNS4", DefaultBranch: "main4", CreationDate: now}, + {Name: "repo23", StorageID: "storage1", StorageNamespace: "storageNS5", DefaultBranch: "main5", CreationDate: now}, }, wantHasMore: false, wantErr: false, From 478d49847deb48bff5cca2076a11242e8d6689bf Mon Sep 17 00:00:00 2001 From: Itai Gilo Date: Thu, 16 Jan 2025 09:37:29 +0000 Subject: [PATCH 11/26] Add basic unit-tests --- pkg/api/controller_test.go | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/pkg/api/controller_test.go b/pkg/api/controller_test.go index f8b10b93738..e2ef627da24 100644 --- a/pkg/api/controller_test.go +++ b/pkg/api/controller_test.go @@ -1015,6 +1015,7 @@ func TestController_CreateRepositoryHandler(t *testing.T) { resp, err := clt.CreateRepositoryWithResponse(ctx, &apigen.CreateRepositoryParams{}, apigen.CreateRepositoryJSONRequestBody{ DefaultBranch: apiutil.Ptr("main"), Name: repoName, + StorageId: swag.String("storage"), StorageNamespace: onBlock(deps, "foo-bucket-1"), }) verifyResponseOK(t, resp, err) @@ -1028,6 +1029,24 @@ func TestController_CreateRepositoryHandler(t *testing.T) { } }) + t.Run("create repo no StorageId success", func(t *testing.T) { + repoName := testUniqueRepoName() + resp, err := clt.CreateRepositoryWithResponse(ctx, &apigen.CreateRepositoryParams{}, apigen.CreateRepositoryJSONRequestBody{ + DefaultBranch: apiutil.Ptr("main"), + Name: repoName, + StorageNamespace: onBlock(deps, "foo-bucket-1-1"), + }) + verifyResponseOK(t, resp, err) + + response := resp.JSON201 + if response == nil { + t.Fatal("CreateRepository got bad response") + } + if response.Id != repoName { + t.Fatalf("CreateRepository id=%s, expected=%s", response.Id, repoName) + } + }) + t.Run("create bare repo success", func(t *testing.T) { repoName := testUniqueRepoName() bareRepo := true From 13a771e1102b01274153bf57c195383c4056029f Mon Sep 17 00:00:00 2001 From: Itai Gilo Date: Thu, 16 Jan 2025 14:48:23 +0000 Subject: [PATCH 12/26] Fix param --- pkg/api/controller.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/api/controller.go b/pkg/api/controller.go index 0cc8cd57947..b4e7a9867da 100644 --- a/pkg/api/controller.go +++ b/pkg/api/controller.go @@ -2059,7 +2059,7 @@ func (c *Controller) CreateRepository(w http.ResponseWriter, r *http.Request, bo CreationDate: newRepo.CreationDate.Unix(), DefaultBranch: newRepo.DefaultBranch, Id: newRepo.Name, - StorageId: swag.String(newRepo.StorageNamespace), + StorageId: swag.String(newRepo.StorageID), StorageNamespace: newRepo.StorageNamespace, ReadOnly: swag.Bool(newRepo.ReadOnly), } From 989a388bef86a2000b55b7782999b6c578e67e43 Mon Sep 17 00:00:00 2001 From: Itai Gilo Date: Fri, 17 Jan 2025 15:26:42 +0000 Subject: [PATCH 13/26] Update tests --- pkg/api/controller_test.go | 176 ++++++++++++++++++------------------ pkg/catalog/catalog_test.go | 6 +- 2 files changed, 91 insertions(+), 91 deletions(-) diff --git a/pkg/api/controller_test.go b/pkg/api/controller_test.go index f8b10b93738..5a8a085f530 100644 --- a/pkg/api/controller_test.go +++ b/pkg/api/controller_test.go @@ -103,9 +103,9 @@ func TestController_ListRepositoriesHandler(t *testing.T) { ctx := context.Background() _, err := deps.catalog.CreateRepository(ctx, "foo1", "", onBlock(deps, "foo1"), "main", false) testutil.Must(t, err) - _, err = deps.catalog.CreateRepository(ctx, "foo2", "storage", onBlock(deps, "foo1"), "main", false) + _, err = deps.catalog.CreateRepository(ctx, "foo2", "", onBlock(deps, "foo1"), "main", false) testutil.Must(t, err) - _, err = deps.catalog.CreateRepository(ctx, "foo3", "storage", onBlock(deps, "foo1"), "main", false) + _, err = deps.catalog.CreateRepository(ctx, "foo3", "", onBlock(deps, "foo1"), "main", false) testutil.Must(t, err) resp, err := clt.ListRepositoriesWithResponse(ctx, &apigen.ListRepositoriesParams{}) @@ -186,7 +186,7 @@ func TestController_GetRepoHandler(t *testing.T) { t.Run("get existing repo", func(t *testing.T) { const testBranchName = "non-default" - _, err := deps.catalog.CreateRepository(context.Background(), "foo1", "storage", onBlock(deps, "foo1"), testBranchName, false) + _, err := deps.catalog.CreateRepository(context.Background(), "foo1", "", onBlock(deps, "foo1"), testBranchName, false) testutil.Must(t, err) resp, err := clt.GetRepositoryWithResponse(ctx, "foo1") @@ -240,7 +240,7 @@ func TestController_LogCommitsMissingBranch(t *testing.T) { ctx := context.Background() repo := testUniqueRepoName() - _, err := deps.catalog.CreateRepository(ctx, repo, "storage", onBlock(deps, "ns1"), "main", false) + _, err := deps.catalog.CreateRepository(ctx, repo, "", onBlock(deps, "ns1"), "main", false) testutil.Must(t, err) resp, err := clt.LogCommitsWithResponse(ctx, repo, "otherbranch", &apigen.LogCommitsParams{}) @@ -297,7 +297,7 @@ func TestController_LogCommitsHandler(t *testing.T) { tt := ttt t.Run(tt.name, func(t *testing.T) { repo := testUniqueRepoName() - _, err := deps.catalog.CreateRepository(ctx, repo, "storage", onBlock(deps, repo), "main", false) + _, err := deps.catalog.CreateRepository(ctx, repo, "", onBlock(deps, repo), "main", false) testutil.Must(t, err) const prefix = "foo/bar" @@ -338,7 +338,7 @@ func TestController_LogCommitsParallelHandler(t *testing.T) { ctx := context.Background() repo := testUniqueRepoName() - _, err := deps.catalog.CreateRepository(ctx, repo, "storage", onBlock(deps, repo), "main", false) + _, err := deps.catalog.CreateRepository(ctx, repo, "", onBlock(deps, repo), "main", false) testutil.Must(t, err) commits := 100 @@ -386,7 +386,7 @@ func TestController_LogCommitsPredefinedData(t *testing.T) { // prepare test data repo := testUniqueRepoName() - _, err := deps.catalog.CreateRepository(ctx, repo, "storage", onBlock(deps, repo), "main", false) + _, err := deps.catalog.CreateRepository(ctx, repo, "", onBlock(deps, repo), "main", false) testutil.Must(t, err) const prefix = "foo/bar" const totalCommits = 10 @@ -580,7 +580,7 @@ func TestController_CommitsGetBranchCommitLogByPath(t *testing.T) { */ repo := testUniqueRepoName() - _, err := deps.catalog.CreateRepository(ctx, repo, "storage", onBlock(deps, "ns1"), "main", false) + _, err := deps.catalog.CreateRepository(ctx, repo, "", onBlock(deps, "ns1"), "main", false) testutil.Must(t, err) commitsMap := make(map[string]string) @@ -743,7 +743,7 @@ func TestController_GetCommitHandler(t *testing.T) { t.Run("get existing commit", func(t *testing.T) { ctx := context.Background() - _, err := deps.catalog.CreateRepository(ctx, "foo1", "storage", onBlock(deps, "foo1"), "main", false) + _, err := deps.catalog.CreateRepository(ctx, "foo1", "", onBlock(deps, "foo1"), "main", false) testutil.Must(t, err) testutil.MustDo(t, "create entry bar1", deps.catalog.CreateEntry(ctx, "foo1", "main", catalog.DBEntry{Path: "foo/bar1", PhysicalAddress: "bar1addr", CreationDate: time.Now(), Size: 1, Checksum: "cksum1"})) commit1, err := deps.catalog.Commit(ctx, "foo1", "main", "some message", DefaultUserID, nil, nil, nil, false) @@ -767,7 +767,7 @@ func TestController_GetCommitHandler(t *testing.T) { t.Run("branch commit", func(t *testing.T) { ctx := context.Background() repo := testUniqueRepoName() - _, err := deps.catalog.CreateRepository(ctx, repo, "storage", onBlock(deps, repo), "main", false) + _, err := deps.catalog.CreateRepository(ctx, repo, "", onBlock(deps, repo), "main", false) testutil.Must(t, err) testutil.MustDo(t, "create entry bar1", deps.catalog.CreateEntry(ctx, repo, "main", catalog.DBEntry{Path: "foo/bar1", PhysicalAddress: "bar1addr", CreationDate: time.Now(), Size: 1, Checksum: "cksum1"})) commit1, err := deps.catalog.Commit(ctx, repo, "main", "some message", DefaultUserID, nil, nil, nil, false) @@ -795,7 +795,7 @@ func TestController_GetCommitHandler(t *testing.T) { t.Run("tag commit", func(t *testing.T) { ctx := context.Background() repo := testUniqueRepoName() - _, err := deps.catalog.CreateRepository(ctx, repo, "storage", onBlock(deps, repo), "main", false) + _, err := deps.catalog.CreateRepository(ctx, repo, "", onBlock(deps, repo), "main", false) testutil.Must(t, err) testutil.MustDo(t, "create entry bar1", deps.catalog.CreateEntry(ctx, repo, "main", catalog.DBEntry{Path: "foo/bar1", PhysicalAddress: "bar1addr", CreationDate: time.Now(), Size: 1, Checksum: "cksum1"})) commit1, err := deps.catalog.Commit(ctx, repo, "main", "some message", DefaultUserID, nil, nil, nil, false) @@ -820,7 +820,7 @@ func TestController_GetCommitHandler(t *testing.T) { t.Run("initial commit", func(t *testing.T) { // validate a new repository's initial commit existence and structure ctx := context.Background() - _, err := deps.catalog.CreateRepository(ctx, "foo2", "storage", onBlock(deps, "foo2"), "main", false) + _, err := deps.catalog.CreateRepository(ctx, "foo2", "", onBlock(deps, "foo2"), "main", false) testutil.Must(t, err) resp, err := clt.GetCommitWithResponse(ctx, "foo2", "main") verifyResponseOK(t, resp, err) @@ -871,7 +871,7 @@ func TestController_CommitHandler(t *testing.T) { t.Run("commit success", func(t *testing.T) { repo := testUniqueRepoName() - _, err := deps.catalog.CreateRepository(ctx, repo, "storage", onBlock(deps, repo), "main", false) + _, err := deps.catalog.CreateRepository(ctx, repo, "", onBlock(deps, repo), "main", false) testutil.MustDo(t, fmt.Sprintf("create repo %s", repo), err) testutil.MustDo(t, fmt.Sprintf("commit bar on %s", repo), deps.catalog.CreateEntry(ctx, repo, "main", catalog.DBEntry{Path: "foo/bar", PhysicalAddress: "pa", CreationDate: time.Now(), Size: 666, Checksum: "cs", Metadata: nil})) resp, err := clt.CommitWithResponse(ctx, repo, "main", &apigen.CommitParams{}, apigen.CommitJSONRequestBody{ @@ -882,7 +882,7 @@ func TestController_CommitHandler(t *testing.T) { t.Run("commit success with source metarange", func(t *testing.T) { repo := testUniqueRepoName() - _, err := deps.catalog.CreateRepository(ctx, repo, "storage", onBlock(deps, repo), "main", false) + _, err := deps.catalog.CreateRepository(ctx, repo, "", onBlock(deps, repo), "main", false) testutil.MustDo(t, fmt.Sprintf("create repo %s", repo), err) _, err = deps.catalog.CreateBranch(ctx, repo, "foo-branch", "main") @@ -901,7 +901,7 @@ func TestController_CommitHandler(t *testing.T) { t.Run("commit failure with source metarange and dirty branch", func(t *testing.T) { repo := testUniqueRepoName() - _, err := deps.catalog.CreateRepository(ctx, repo, "storage", onBlock(deps, repo), "main", false) + _, err := deps.catalog.CreateRepository(ctx, repo, "", onBlock(deps, repo), "main", false) testutil.MustDo(t, fmt.Sprintf("create repo %s", repo), err) _, err = deps.catalog.CreateBranch(ctx, repo, "foo-branch", "main") @@ -926,7 +926,7 @@ func TestController_CommitHandler(t *testing.T) { t.Run("commit failure empty branch", func(t *testing.T) { repo := testUniqueRepoName() - _, err := deps.catalog.CreateRepository(ctx, repo, "storage", onBlock(deps, repo), "main", false) + _, err := deps.catalog.CreateRepository(ctx, repo, "", onBlock(deps, repo), "main", false) testutil.MustDo(t, fmt.Sprintf("create repo %s", repo), err) _, err = deps.catalog.CreateBranch(ctx, repo, "foo-branch", "main") @@ -944,7 +944,7 @@ func TestController_CommitHandler(t *testing.T) { t.Run("commit success - with creation date", func(t *testing.T) { repo := testUniqueRepoName() - _, err := deps.catalog.CreateRepository(ctx, repo, "storage", onBlock(deps, repo), "main", false) + _, err := deps.catalog.CreateRepository(ctx, repo, "", onBlock(deps, repo), "main", false) testutil.MustDo(t, fmt.Sprintf("create repo %s", repo), err) testutil.MustDo(t, fmt.Sprintf("commit bar on %s", repo), deps.catalog.CreateEntry(ctx, repo, "main", catalog.DBEntry{Path: "foo/bar", PhysicalAddress: "pa", CreationDate: time.Now(), Size: 666, Checksum: "cs", Metadata: nil})) date := int64(1642626109) @@ -960,7 +960,7 @@ func TestController_CommitHandler(t *testing.T) { t.Run("protected branch", func(t *testing.T) { repo := testUniqueRepoName() - _, err := deps.catalog.CreateRepository(ctx, repo, "storage", onBlock(deps, repo), "main", false) + _, err := deps.catalog.CreateRepository(ctx, repo, "", onBlock(deps, repo), "main", false) testutil.MustDo(t, "create repository", err) rules := map[string]*graveler.BranchProtectionBlockedActions{ "main": { @@ -985,7 +985,7 @@ func TestController_CommitHandler(t *testing.T) { }) t.Run("read only repo", func(t *testing.T) { repo := testUniqueRepoName() - _, err := deps.catalog.CreateRepository(ctx, repo, "storage", onBlock(deps, repo), "main", true) + _, err := deps.catalog.CreateRepository(ctx, repo, "", onBlock(deps, repo), "main", true) testutil.MustDo(t, "create repository", err) err = deps.catalog.CreateEntry(ctx, repo, "main", catalog.DBEntry{Path: "foo/bar", PhysicalAddress: "pa", CreationDate: time.Now(), Size: 666, Checksum: "cs", Metadata: nil}) require.Error(t, err, "read-only repository") @@ -1052,7 +1052,7 @@ func TestController_CreateRepositoryHandler(t *testing.T) { t.Run("create repo duplicate", func(t *testing.T) { repo := testUniqueRepoName() - _, err := deps.catalog.CreateRepository(ctx, repo, "storage", onBlock(deps, "foo1"), "main", false) + _, err := deps.catalog.CreateRepository(ctx, repo, "", onBlock(deps, "foo1"), "main", false) if err != nil { t.Fatal(err) } @@ -1153,7 +1153,7 @@ func TestController_DeleteRepositoryHandler(t *testing.T) { t.Run("delete repo success", func(t *testing.T) { repo := testUniqueRepoName() - _, err := deps.catalog.CreateRepository(ctx, repo, "storage", onBlock(deps, "foo1"), "main", false) + _, err := deps.catalog.CreateRepository(ctx, repo, "", onBlock(deps, "foo1"), "main", false) testutil.Must(t, err) resp, err := clt.DeleteRepositoryWithResponse(ctx, repo, &apigen.DeleteRepositoryParams{}) @@ -1179,7 +1179,7 @@ func TestController_DeleteRepositoryHandler(t *testing.T) { t.Run("delete repo doesnt delete other repos", func(t *testing.T) { names := []string{"rr0", "rr1", "rr11", "rr2"} for _, name := range names { - _, err := deps.catalog.CreateRepository(ctx, name, "storage", onBlock(deps, "foo1"), "main", false) + _, err := deps.catalog.CreateRepository(ctx, name, "", onBlock(deps, "foo1"), "main", false) testutil.Must(t, err) } @@ -1199,7 +1199,7 @@ func TestController_DeleteRepositoryHandler(t *testing.T) { t.Run("delete read-only repository", func(t *testing.T) { repo := testUniqueRepoName() - _, err := deps.catalog.CreateRepository(ctx, repo, "storage", onBlock(deps, "foo1"), "main", true) + _, err := deps.catalog.CreateRepository(ctx, repo, "", onBlock(deps, "foo1"), "main", true) testutil.Must(t, err) resp, err := clt.DeleteRepositoryWithResponse(ctx, repo, &apigen.DeleteRepositoryParams{}) @@ -1457,7 +1457,7 @@ func TestController_ListBranchesHandler(t *testing.T) { t.Run("list branches only default", func(t *testing.T) { ctx := context.Background() repo := testUniqueRepoName() - _, err := deps.catalog.CreateRepository(ctx, repo, "storage", onBlock(deps, "foo1"), "main", false) + _, err := deps.catalog.CreateRepository(ctx, repo, "", onBlock(deps, "foo1"), "main", false) testutil.Must(t, err) resp, err := clt.ListBranchesWithResponse(ctx, repo, &apigen.ListBranchesParams{ Amount: apiutil.Ptr(apigen.PaginationAmount(-1)), @@ -1474,7 +1474,7 @@ func TestController_ListBranchesHandler(t *testing.T) { t.Run("list branches pagination", func(t *testing.T) { ctx := context.Background() repo := testUniqueRepoName() - _, err := deps.catalog.CreateRepository(ctx, repo, "storage", onBlock(deps, "foo2"), "main", false) + _, err := deps.catalog.CreateRepository(ctx, repo, "", onBlock(deps, "foo2"), "main", false) testutil.Must(t, err) // create the first "dummy" commit on main so that we can create branches from it @@ -1544,7 +1544,7 @@ func TestController_ListTagsHandler(t *testing.T) { // setup test data repo := testUniqueRepoName() - _, err := deps.catalog.CreateRepository(ctx, repo, "storage", onBlock(deps, "foo1"), "main", false) + _, err := deps.catalog.CreateRepository(ctx, repo, "", onBlock(deps, "foo1"), "main", false) testutil.Must(t, err) testutil.Must(t, deps.catalog.CreateEntry(ctx, repo, "main", catalog.DBEntry{Path: "obj1"})) commitLog, err := deps.catalog.Commit(ctx, repo, "main", "first commit", "test", nil, nil, nil, false) @@ -1626,7 +1626,7 @@ func TestController_GetBranchHandler(t *testing.T) { const testBranch = "main" repo := testUniqueRepoName() - _, err := deps.catalog.CreateRepository(ctx, repo, "storage", onBlock(deps, "foo1"), testBranch, false) + _, err := deps.catalog.CreateRepository(ctx, repo, "", onBlock(deps, "foo1"), testBranch, false) testutil.Must(t, err) t.Run("get default branch", func(t *testing.T) { @@ -1670,7 +1670,7 @@ func TestController_BranchesDiffBranchHandler(t *testing.T) { ctx := context.Background() const testBranch = "main" repo := testUniqueRepoName() - _, err := deps.catalog.CreateRepository(ctx, repo, "storage", onBlock(deps, "foo1"), testBranch, false) + _, err := deps.catalog.CreateRepository(ctx, repo, "", onBlock(deps, "foo1"), testBranch, false) if err != nil { t.Fatal(err) } @@ -1722,7 +1722,7 @@ func TestController_CreateBranchHandler(t *testing.T) { t.Run(fmt.Sprintf("hidden=%v", hidden), func(t *testing.T) { t.Run("create branch and diff refs success", func(t *testing.T) { repo := testUniqueRepoName() - _, err := deps.catalog.CreateRepository(ctx, repo, "storage", onBlock(deps, "foo1"), "main", false) + _, err := deps.catalog.CreateRepository(ctx, repo, "", onBlock(deps, "foo1"), "main", false) testutil.Must(t, err) testutil.Must(t, deps.catalog.CreateEntry(ctx, repo, "main", catalog.DBEntry{Path: "a/b"})) _, err = deps.catalog.Commit(ctx, repo, "main", "first commit", "test", nil, nil, nil, false) @@ -1761,7 +1761,7 @@ func TestController_CreateBranchHandler(t *testing.T) { t.Run("create branch missing commit", func(t *testing.T) { repo := testUniqueRepoName() - _, err := deps.catalog.CreateRepository(ctx, repo, "storage", onBlock(deps, "foo1"), "main", false) + _, err := deps.catalog.CreateRepository(ctx, repo, "", onBlock(deps, "foo1"), "main", false) testutil.Must(t, err) resp, err := clt.CreateBranchWithResponse(ctx, repo, apigen.CreateBranchJSONRequestBody{ Name: "main3", @@ -1793,7 +1793,7 @@ func TestController_CreateBranchHandler(t *testing.T) { t.Run("create branch conflict with branch", func(t *testing.T) { repo := testUniqueRepoName() - _, err := deps.catalog.CreateRepository(ctx, repo, "storage", onBlock(deps, "foo1"), "main", false) + _, err := deps.catalog.CreateRepository(ctx, repo, "", onBlock(deps, "foo1"), "main", false) testutil.Must(t, err) resp, err := clt.CreateBranchWithResponse(ctx, repo, apigen.CreateBranchJSONRequestBody{ @@ -1811,7 +1811,7 @@ func TestController_CreateBranchHandler(t *testing.T) { t.Run("create branch conflict with tag", func(t *testing.T) { repo := testUniqueRepoName() - _, err := deps.catalog.CreateRepository(ctx, repo, "storage", onBlock(deps, "foo1"), "main", false) + _, err := deps.catalog.CreateRepository(ctx, repo, "", onBlock(deps, "foo1"), "main", false) testutil.Must(t, err) name := "tag123" @@ -1833,7 +1833,7 @@ func TestController_CreateBranchHandler(t *testing.T) { t.Run("create branch conflict with commit", func(t *testing.T) { repo := testUniqueRepoName() - _, err := deps.catalog.CreateRepository(ctx, repo, "storage", onBlock(deps, "foo1"), "main", false) + _, err := deps.catalog.CreateRepository(ctx, repo, "", onBlock(deps, "foo1"), "main", false) testutil.Must(t, err) log, err := deps.catalog.GetCommit(ctx, repo, "main") @@ -1854,7 +1854,7 @@ func TestController_CreateBranchHandler(t *testing.T) { t.Run("read-only repository", func(t *testing.T) { repo := testUniqueRepoName() - _, err := deps.catalog.CreateRepository(ctx, repo, "storage", onBlock(deps, "foo1"), "main", true) + _, err := deps.catalog.CreateRepository(ctx, repo, "", onBlock(deps, "foo1"), "main", true) testutil.Must(t, err) testutil.Must(t, deps.catalog.CreateEntry(ctx, repo, "main", catalog.DBEntry{Path: "a/b"}, graveler.WithForce(true))) _, err = deps.catalog.Commit(ctx, repo, "main", "first commit", "test", nil, nil, nil, false, graveler.WithForce(true)) @@ -1889,7 +1889,7 @@ func TestController_DiffRefsHandler(t *testing.T) { t.Run("diff prefix with and without delimiter", func(t *testing.T) { repoName := testUniqueRepoName() const newBranchName = "main2" - _, err := deps.catalog.CreateRepository(ctx, repoName, "storage", onBlock(deps, "foo1"), "main", false) + _, err := deps.catalog.CreateRepository(ctx, repoName, "", onBlock(deps, "foo1"), "main", false) testutil.Must(t, err) resp, err := clt.CreateBranchWithResponse(ctx, repoName, apigen.CreateBranchJSONRequestBody{ @@ -1975,7 +1975,7 @@ func TestController_UploadObjectHandler(t *testing.T) { clt, deps := setupClientWithAdmin(t) ctx := context.Background() - _, err := deps.catalog.CreateRepository(ctx, "my-new-repo", "storage", onBlock(deps, "foo1"), "main", false) + _, err := deps.catalog.CreateRepository(ctx, "my-new-repo", "", onBlock(deps, "foo1"), "main", false) testutil.Must(t, err) t.Run("upload object", func(t *testing.T) { @@ -2120,7 +2120,7 @@ func TestController_UploadObjectHandler(t *testing.T) { t.Run("read-only repository", func(t *testing.T) { repoName := "my-new-read-only-repo" - _, err := deps.catalog.CreateRepository(ctx, repoName, "storage", onBlock(deps, "foo2"), "main", true) + _, err := deps.catalog.CreateRepository(ctx, repoName, "", onBlock(deps, "foo2"), "main", true) testutil.Must(t, err) // write contentType, buf := writeMultipart("content", "bar", "hello world!") @@ -2151,7 +2151,7 @@ func TestController_DeleteBranchHandler(t *testing.T) { ctx := context.Background() t.Run("delete branch success", func(t *testing.T) { - _, err := deps.catalog.CreateRepository(ctx, "my-new-repo", "storage", onBlock(deps, "foo1"), "main", false) + _, err := deps.catalog.CreateRepository(ctx, "my-new-repo", "", onBlock(deps, "foo1"), "main", false) testutil.Must(t, err) testutil.Must(t, deps.catalog.CreateEntry(ctx, "my-new-repo", "main", catalog.DBEntry{Path: "a/b"})) _, err = deps.catalog.Commit(ctx, "my-new-repo", "main", "first commit", "test", nil, nil, nil, false) @@ -2172,7 +2172,7 @@ func TestController_DeleteBranchHandler(t *testing.T) { }) t.Run("delete default branch", func(t *testing.T) { - _, err := deps.catalog.CreateRepository(ctx, "my-new-repo2", "storage", onBlock(deps, "foo2"), "main", false) + _, err := deps.catalog.CreateRepository(ctx, "my-new-repo2", "", onBlock(deps, "foo2"), "main", false) testutil.Must(t, err) resp, err := clt.DeleteBranchWithResponse(ctx, "my-new-repo2", "main", &apigen.DeleteBranchParams{}) if err != nil { @@ -2195,7 +2195,7 @@ func TestController_DeleteBranchHandler(t *testing.T) { t.Run("read-only repository", func(t *testing.T) { repoName := "read-only-repo" - _, err := deps.catalog.CreateRepository(ctx, repoName, "storage", onBlock(deps, "foo1"), "main", true) + _, err := deps.catalog.CreateRepository(ctx, repoName, "", onBlock(deps, "foo1"), "main", true) testutil.Must(t, err) testutil.Must(t, deps.catalog.CreateEntry(ctx, repoName, "main", catalog.DBEntry{Path: "a/b"}, graveler.WithForce(true))) _, err = deps.catalog.Commit(ctx, repoName, "main", "first commit", "test", nil, nil, nil, false, graveler.WithForce(true)) @@ -2226,7 +2226,7 @@ func TestController_ObjectsStatObjectHandler(t *testing.T) { ctx := context.Background() repo := testUniqueRepoName() - _, err := deps.catalog.CreateRepository(ctx, repo, "storage", onBlock(deps, "some-bucket"), "main", false) + _, err := deps.catalog.CreateRepository(ctx, repo, "", onBlock(deps, "some-bucket"), "main", false) if err != nil { t.Fatal(err) } @@ -2323,7 +2323,7 @@ func TestController_UpdateObjectUserMetadataHander(t *testing.T) { ctx := context.Background() repo := testUniqueRepoName() - _, err := deps.catalog.CreateRepository(ctx, repo, "storage", onBlock(deps, "some-bucket"), "main", false) + _, err := deps.catalog.CreateRepository(ctx, repo, "", onBlock(deps, "some-bucket"), "main", false) if err != nil { t.Fatal(err) } @@ -2426,7 +2426,7 @@ func TestController_ObjectsListObjectsHandler(t *testing.T) { ctx := context.Background() repo := testUniqueRepoName() - _, err := deps.catalog.CreateRepository(ctx, repo, "storage", onBlock(deps, "bucket/prefix"), "main", false) + _, err := deps.catalog.CreateRepository(ctx, repo, "", onBlock(deps, "bucket/prefix"), "main", false) testutil.Must(t, err) dbEntries := []catalog.DBEntry{ { @@ -2521,7 +2521,7 @@ func TestController_ObjectsHeadObjectHandler(t *testing.T) { ctx := context.Background() repo := testUniqueRepoName() - _, err := deps.catalog.CreateRepository(ctx, repo, "storage", onBlock(deps, "ns1"), "main", false) + _, err := deps.catalog.CreateRepository(ctx, repo, "", onBlock(deps, "ns1"), "main", false) if err != nil { t.Fatal(err) } @@ -2597,7 +2597,7 @@ func TestController_ObjectsGetObjectHandler(t *testing.T) { ctx := context.Background() repo := testUniqueRepoName() - _, err := deps.catalog.CreateRepository(ctx, repo, "storage", onBlock(deps, "ns1"), "main", false) + _, err := deps.catalog.CreateRepository(ctx, repo, "", onBlock(deps, "ns1"), "main", false) if err != nil { t.Fatal(err) } @@ -2757,7 +2757,7 @@ func TestController_ObjectsUploadObjectHandler(t *testing.T) { ctx := context.Background() repo := testUniqueRepoName() - _, err := deps.catalog.CreateRepository(ctx, repo, "storage", onBlock(deps, "bucket/prefix"), "main", false) + _, err := deps.catalog.CreateRepository(ctx, repo, "", onBlock(deps, "bucket/prefix"), "main", false) if err != nil { t.Fatal(err) } @@ -2818,7 +2818,7 @@ func TestController_ObjectsUploadObjectHandler(t *testing.T) { t.Run("read-only repository", func(t *testing.T) { readOnlyRepo := testUniqueRepoName() path := "foo/bar" - _, err := deps.catalog.CreateRepository(ctx, readOnlyRepo, "storage", onBlock(deps, "bucket/prefix"), "main", true) + _, err := deps.catalog.CreateRepository(ctx, readOnlyRepo, "", onBlock(deps, "bucket/prefix"), "main", true) if err != nil { t.Fatal(err) } @@ -2891,7 +2891,7 @@ func TestController_ObjectsStageObjectHandler(t *testing.T) { ctx := context.Background() ns := onBlock(deps, "bucket/prefix") repo := testUniqueRepoName() - _, err := deps.catalog.CreateRepository(ctx, repo, "storage", ns, "main", false) + _, err := deps.catalog.CreateRepository(ctx, repo, "", ns, "main", false) if err != nil { t.Fatal(err) } @@ -2981,7 +2981,7 @@ func TestController_ObjectsStageObjectHandler(t *testing.T) { t.Run("read-only repository", func(t *testing.T) { readOnlyRepo := testUniqueRepoName() - _, err := deps.catalog.CreateRepository(ctx, readOnlyRepo, "storage", onBlock(deps, "bucket/prefix"), "main", true) + _, err := deps.catalog.CreateRepository(ctx, readOnlyRepo, "", onBlock(deps, "bucket/prefix"), "main", true) if err != nil { t.Fatal(err) } @@ -3077,7 +3077,7 @@ func TestController_ObjectsDeleteObjectHandler(t *testing.T) { repo := testUniqueRepoName() const branch = "main" - _, err := deps.catalog.CreateRepository(ctx, repo, "storage", onBlock(deps, "some-bucket/prefix"), branch, false) + _, err := deps.catalog.CreateRepository(ctx, repo, "", onBlock(deps, "some-bucket/prefix"), branch, false) if err != nil { t.Fatal(err) } @@ -3240,7 +3240,7 @@ func TestController_ObjectsDeleteObjectHandler(t *testing.T) { t.Run("read-only repository", func(t *testing.T) { readOnlyRepo := testUniqueRepoName() const branch = "main" - _, err := deps.catalog.CreateRepository(ctx, readOnlyRepo, "storage", onBlock(deps, "some-bucket/prefix2"), branch, true) + _, err := deps.catalog.CreateRepository(ctx, readOnlyRepo, "", onBlock(deps, "some-bucket/prefix2"), branch, true) if err != nil { t.Fatal(err) } @@ -3770,7 +3770,7 @@ func TestController_MergeIntoExplicitBranch(t *testing.T) { // setup env repo := testUniqueRepoName() - _, err := deps.catalog.CreateRepository(ctx, repo, "storage", onBlock(deps, repo), "main", false) + _, err := deps.catalog.CreateRepository(ctx, repo, "", onBlock(deps, repo), "main", false) testutil.Must(t, err) _, err = deps.catalog.CreateBranch(ctx, repo, "branch1", "main") testutil.Must(t, err) @@ -3812,7 +3812,7 @@ func TestController_MergeSquashing(t *testing.T) { // setup env repo := testUniqueRepoName() - _, err := deps.catalog.CreateRepository(ctx, repo, "storage", onBlock(deps, repo), "main", false) + _, err := deps.catalog.CreateRepository(ctx, repo, "", onBlock(deps, repo), "main", false) testutil.Must(t, err) base, err := deps.catalog.CreateBranch(ctx, repo, "branch", "main") testutil.Must(t, err) @@ -3882,7 +3882,7 @@ func TestController_MergeDirtyBranch(t *testing.T) { // setup env repo := testUniqueRepoName() - _, err := deps.catalog.CreateRepository(ctx, repo, "storage", onBlock(deps, repo), "main", false) + _, err := deps.catalog.CreateRepository(ctx, repo, "", onBlock(deps, repo), "main", false) testutil.Must(t, err) err = deps.catalog.CreateEntry(ctx, repo, "main", catalog.DBEntry{Path: "foo/bar1", PhysicalAddress: "bar1addr", CreationDate: time.Now(), Size: 1, Checksum: "cksum1"}) testutil.Must(t, err) @@ -3945,7 +3945,7 @@ func TestController_CreateTag(t *testing.T) { ctx := context.Background() // setup env repo := testUniqueRepoName() - _, err := deps.catalog.CreateRepository(ctx, repo, "storage", onBlock(deps, repo), "main", false) + _, err := deps.catalog.CreateRepository(ctx, repo, "", onBlock(deps, repo), "main", false) testutil.Must(t, err) testutil.MustDo(t, "create entry bar1", deps.catalog.CreateEntry(ctx, repo, "main", catalog.DBEntry{Path: "foo/bar1", PhysicalAddress: "bar1addr", CreationDate: time.Now(), Size: 1, Checksum: "cksum1"})) commit1, err := deps.catalog.Commit(ctx, repo, "main", "some message", DefaultUserID, nil, nil, nil, false) @@ -4055,7 +4055,7 @@ func TestController_CreateTag(t *testing.T) { t.Run("read-only repository", func(t *testing.T) { readOnlyRepo := testUniqueRepoName() - _, err := deps.catalog.CreateRepository(ctx, readOnlyRepo, "storage", onBlock(deps, readOnlyRepo), "main", true) + _, err := deps.catalog.CreateRepository(ctx, readOnlyRepo, "", onBlock(deps, readOnlyRepo), "main", true) testutil.Must(t, err) testutil.MustDo(t, "create entry bar1", deps.catalog.CreateEntry(ctx, readOnlyRepo, "main", catalog.DBEntry{Path: "foo/bar2", PhysicalAddress: "bar2addr", CreationDate: time.Now(), Size: 1, Checksum: "cksum1"}, graveler.WithForce(true))) commit1, err := deps.catalog.Commit(ctx, readOnlyRepo, "main", "some message", DefaultUserID, nil, nil, nil, false, graveler.WithForce(true)) @@ -4086,7 +4086,7 @@ func TestController_Revert(t *testing.T) { ctx := context.Background() // setup env repo := testUniqueRepoName() - _, err := deps.catalog.CreateRepository(ctx, repo, "storage", onBlock(deps, repo), "main", false) + _, err := deps.catalog.CreateRepository(ctx, repo, "", onBlock(deps, repo), "main", false) testutil.Must(t, err) testutil.MustDo(t, "create entry bar1", deps.catalog.CreateEntry(ctx, repo, "main", catalog.DBEntry{Path: "foo/bar1", PhysicalAddress: "bar1addr", CreationDate: time.Now(), Size: 1, Checksum: "cksum1"})) _, err = deps.catalog.Commit(ctx, repo, "main", "some message", DefaultUserID, nil, nil, nil, false) @@ -4135,7 +4135,7 @@ func TestController_Revert(t *testing.T) { t.Run("revert_no_parent", func(t *testing.T) { repo := testUniqueRepoName() // setup data - repo with one object committed - _, err := deps.catalog.CreateRepository(ctx, repo, "storage", onBlock(deps, repo), "main", false) + _, err := deps.catalog.CreateRepository(ctx, repo, "", onBlock(deps, repo), "main", false) testutil.Must(t, err) err = deps.catalog.CreateEntry(ctx, repo, "main", catalog.DBEntry{Path: "merge/foo/bar1", PhysicalAddress: "merge1bar1addr", CreationDate: time.Now(), Size: 1, Checksum: "cksum1"}) testutil.Must(t, err) @@ -4162,7 +4162,7 @@ func TestController_Revert(t *testing.T) { t.Run("read-only repository", func(t *testing.T) { readOnlyRepository := testUniqueRepoName() - _, err := deps.catalog.CreateRepository(ctx, readOnlyRepository, "storage", onBlock(deps, readOnlyRepository), "main", true) + _, err := deps.catalog.CreateRepository(ctx, readOnlyRepository, "", onBlock(deps, readOnlyRepository), "main", true) testutil.Must(t, err) testutil.MustDo(t, "create entry bar1", deps.catalog.CreateEntry(ctx, readOnlyRepository, "main", catalog.DBEntry{Path: "foo/bar2", PhysicalAddress: "bar2addr", CreationDate: time.Now(), Size: 1, Checksum: "cksum1"}, graveler.WithForce(true))) _, err = deps.catalog.Commit(ctx, readOnlyRepository, "main", "some message", DefaultUserID, nil, nil, nil, false, graveler.WithForce(true)) @@ -4182,7 +4182,7 @@ func TestController_RevertConflict(t *testing.T) { ctx := context.Background() // setup env repo := testUniqueRepoName() - _, err := deps.catalog.CreateRepository(ctx, repo, "storage", onBlock(deps, repo), "main", false) + _, err := deps.catalog.CreateRepository(ctx, repo, "", onBlock(deps, repo), "main", false) testutil.Must(t, err) testutil.MustDo(t, "create entry bar1", deps.catalog.CreateEntry(ctx, repo, "main", catalog.DBEntry{Path: "foo/bar1", PhysicalAddress: "bar1addr", CreationDate: time.Now(), Size: 1, Checksum: "cksum1"})) firstCommit, err := deps.catalog.Commit(ctx, repo, "main", "some message", DefaultUserID, nil, nil, nil, false) @@ -4203,7 +4203,7 @@ func TestController_CherryPick(t *testing.T) { ctx := context.Background() // setup env repo := testUniqueRepoName() - _, err := deps.catalog.CreateRepository(ctx, repo, "storage", onBlock(deps, repo), "main", false) + _, err := deps.catalog.CreateRepository(ctx, repo, "", onBlock(deps, repo), "main", false) testutil.Must(t, err) testutil.MustDo(t, "create entry bar1", deps.catalog.CreateEntry(ctx, repo, "main", catalog.DBEntry{Path: "foo/bar1", PhysicalAddress: "bar1addr", CreationDate: time.Now(), Size: 1, Checksum: "cksum1"})) _, err = deps.catalog.Commit(ctx, repo, "main", "message1", DefaultUserID, nil, nil, nil, false) @@ -4361,7 +4361,7 @@ func TestController_CherryPick(t *testing.T) { t.Run("read-only repository", func(t *testing.T) { readOnlyRepository := testUniqueRepoName() - _, err := deps.catalog.CreateRepository(ctx, readOnlyRepository, "storage", onBlock(deps, readOnlyRepository), "main", true) + _, err := deps.catalog.CreateRepository(ctx, readOnlyRepository, "", onBlock(deps, readOnlyRepository), "main", true) testutil.Must(t, err) for _, name := range []string{"branch1", "dest-branch1"} { _, err = deps.catalog.CreateBranch(ctx, readOnlyRepository, name, "main", graveler.WithForce(true)) @@ -4439,7 +4439,7 @@ func TestController_GetPhysicalAddress(t *testing.T) { t.Run("physical_address_format", func(t *testing.T) { repo := testUniqueRepoName() const ( - sid = "storage" + sid = "" ns = "s3://foo-bucket1" branch = "main" ) @@ -4554,7 +4554,7 @@ func TestController_PrepareGarbageCollectionUncommitted(t *testing.T) { t.Run("uncommitted_data", func(t *testing.T) { repo := testUniqueRepoName() - _, err := deps.catalog.CreateRepository(ctx, repo, "storage", onBlock(deps, repo), "main", false) + _, err := deps.catalog.CreateRepository(ctx, repo, "", onBlock(deps, repo), "main", false) testutil.Must(t, err) const items = 3 for i := 0; i < items; i++ { @@ -4567,7 +4567,7 @@ func TestController_PrepareGarbageCollectionUncommitted(t *testing.T) { t.Run("committed_data", func(t *testing.T) { repo := testUniqueRepoName() - _, err := deps.catalog.CreateRepository(ctx, repo, "storage", onBlock(deps, repo), "main", false) + _, err := deps.catalog.CreateRepository(ctx, repo, "", onBlock(deps, repo), "main", false) testutil.Must(t, err) const items = 3 for i := 0; i < items; i++ { @@ -4583,7 +4583,7 @@ func TestController_PrepareGarbageCollectionUncommitted(t *testing.T) { t.Run("uncommitted_copy", func(t *testing.T) { repo := testUniqueRepoName() - _, err := deps.catalog.CreateRepository(ctx, repo, "storage", onBlock(deps, repo), "main", false) + _, err := deps.catalog.CreateRepository(ctx, repo, "", onBlock(deps, repo), "main", false) testutil.Must(t, err) const items = 3 for i := 0; i < items; i++ { @@ -4603,7 +4603,7 @@ func TestController_PrepareGarbageCollectionUncommitted(t *testing.T) { t.Run("read_only_repo", func(t *testing.T) { repo := testUniqueRepoName() - _, err := deps.catalog.CreateRepository(ctx, repo, "storage", onBlock(deps, repo), "main", true) + _, err := deps.catalog.CreateRepository(ctx, repo, "", onBlock(deps, repo), "main", true) testutil.Must(t, err) resp, err := clt.PrepareGarbageCollectionUncommittedWithResponse(ctx, repo, apigen.PrepareGarbageCollectionUncommittedJSONRequestBody{}) if err != nil { @@ -4621,7 +4621,7 @@ func TestController_PrepareGarbageCollectionCommitted(t *testing.T) { t.Run("read_only_repo", func(t *testing.T) { repo := testUniqueRepoName() - _, err := deps.catalog.CreateRepository(ctx, repo, "storage", onBlock(deps, repo), "main", true) + _, err := deps.catalog.CreateRepository(ctx, repo, "", onBlock(deps, repo), "main", true) testutil.Must(t, err) resp, err := clt.PrepareGarbageCollectionCommitsWithResponse(ctx, repo) if err != nil { @@ -4644,7 +4644,7 @@ func TestController_ClientDisconnect(t *testing.T) { // setup repository ctx := context.Background() repo := testUniqueRepoName() - _, err := deps.catalog.CreateRepository(ctx, repo, "storage", onBlock(deps, repo), "main", false) + _, err := deps.catalog.CreateRepository(ctx, repo, "", onBlock(deps, repo), "main", false) testutil.Must(t, err) // prepare a client that will not wait for a response and timeout @@ -4924,7 +4924,7 @@ func TestController_CopyObjectHandler(t *testing.T) { ctx := context.Background() repo := testUniqueRepoName() - _, err := deps.catalog.CreateRepository(ctx, repo, "storage", onBlock(deps, "bucket/prefix"), "main", false) + _, err := deps.catalog.CreateRepository(ctx, repo, "", onBlock(deps, "bucket/prefix"), "main", false) require.NoError(t, err) _, err = deps.catalog.CreateBranch(ctx, repo, "alt", "main") require.NoError(t, err) @@ -5071,7 +5071,7 @@ func TestController_CopyObjectHandler(t *testing.T) { t.Run("read-only repository", func(t *testing.T) { readOnlyRepository := testUniqueRepoName() - _, err = deps.catalog.CreateRepository(ctx, readOnlyRepository, "storage", onBlock(deps, "bucket/prefix"), "main", true) + _, err = deps.catalog.CreateRepository(ctx, readOnlyRepository, "", onBlock(deps, "bucket/prefix"), "main", true) require.NoError(t, err) _, err = deps.catalog.CreateBranch(ctx, readOnlyRepository, "alt", "main", graveler.WithForce(true)) require.NoError(t, err) @@ -5146,7 +5146,7 @@ func TestController_LocalAdapter_StageObject(t *testing.T) { ctx := context.Background() repo := testUniqueRepoName() - _, err := deps.catalog.CreateRepository(ctx, repo, "storage", onBlock(deps, "bucket/prefix"), "main", false) + _, err := deps.catalog.CreateRepository(ctx, repo, "", onBlock(deps, "bucket/prefix"), "main", false) require.NoError(t, err) _, err = deps.catalog.CreateBranch(ctx, repo, "alt", "main") require.NoError(t, err) @@ -5168,7 +5168,7 @@ func TestController_BranchProtectionRules(t *testing.T) { t.Run("admin", func(t *testing.T) { currCtx := context.Background() repo := testUniqueRepoName() - _, err := deps.catalog.CreateRepository(currCtx, repo, "storage", onBlock(deps, repo), "main", false) + _, err := deps.catalog.CreateRepository(currCtx, repo, "", onBlock(deps, repo), "main", false) testutil.MustDo(t, "create repository", err) respPreflight, err := adminClt.CreateBranchProtectionRulePreflightWithResponse(currCtx, repo) @@ -5186,7 +5186,7 @@ func TestController_BranchProtectionRules(t *testing.T) { t.Run("read-only repo", func(t *testing.T) { currCtx := context.Background() repo := testUniqueRepoName() - _, err := deps.catalog.CreateRepository(currCtx, repo, "storage", onBlock(deps, repo), "main", true) + _, err := deps.catalog.CreateRepository(currCtx, repo, "", onBlock(deps, repo), "main", true) testutil.MustDo(t, "create repository", err) resp, err := adminClt.SetBranchProtectionRulesWithResponse(currCtx, repo, &apigen.SetBranchProtectionRulesParams{}, apigen.SetBranchProtectionRulesJSONRequestBody{}) @@ -5208,7 +5208,7 @@ func TestController_GarbageCollectionRules(t *testing.T) { t.Run("admin", func(t *testing.T) { currCtx := context.Background() repo := testUniqueRepoName() - _, err := deps.catalog.CreateRepository(currCtx, repo, "storage", onBlock(deps, repo), "main", false) + _, err := deps.catalog.CreateRepository(currCtx, repo, "", onBlock(deps, repo), "main", false) testutil.MustDo(t, "create repository", err) respPreflight, err := adminClt.SetGarbageCollectionRulesPreflightWithResponse(currCtx, repo) @@ -5226,7 +5226,7 @@ func TestController_GarbageCollectionRules(t *testing.T) { t.Run("read-only repo", func(t *testing.T) { currCtx := context.Background() repo := testUniqueRepoName() - _, err := deps.catalog.CreateRepository(currCtx, repo, "storage", onBlock(deps, repo), "main", true) + _, err := deps.catalog.CreateRepository(currCtx, repo, "", onBlock(deps, repo), "main", true) testutil.MustDo(t, "create repository", err) resp, err := adminClt.SetGCRulesWithResponse(currCtx, repo, apigen.SetGCRulesJSONRequestBody{ @@ -5250,7 +5250,7 @@ func TestController_DumpRestoreRepository(t *testing.T) { // setup repository with some commits repo := testUniqueRepoName() - _, err := deps.catalog.CreateRepository(ctx, repo, "storage", onBlock(deps, repo), "main", false) + _, err := deps.catalog.CreateRepository(ctx, repo, "", onBlock(deps, repo), "main", false) testutil.Must(t, err) const commits = 3 @@ -5313,7 +5313,7 @@ func TestController_DumpRestoreRepository(t *testing.T) { } newRepo := testUniqueRepoName() - _, err = deps.catalog.CreateBareRepository(ctx, newRepo, "storage", onBlock(deps, repo), "main", false) + _, err = deps.catalog.CreateBareRepository(ctx, newRepo, "", onBlock(deps, repo), "main", false) testutil.MustDo(t, "create bare repository", err) submitResponse, err := clt.RestoreSubmitWithResponse(ctx, newRepo, apigen.RestoreSubmitJSONRequestBody{ @@ -5338,7 +5338,7 @@ func TestController_DumpRestoreRepository(t *testing.T) { t.Run("restore_invalid_refs", func(t *testing.T) { // delete and recreate repository as bare for restore newRepo := testUniqueRepoName() - _, err = deps.catalog.CreateBareRepository(ctx, newRepo, "storage", onBlock(deps, repo), "main", false) + _, err = deps.catalog.CreateBareRepository(ctx, newRepo, "", onBlock(deps, repo), "main", false) testutil.MustDo(t, "create bare repository", err) submitResponse, err := clt.RestoreSubmitWithResponse(ctx, newRepo, apigen.RestoreSubmitJSONRequestBody{ @@ -5391,7 +5391,7 @@ func TestController_CreateCommitRecord(t *testing.T) { t.Run("create commit record", func(t *testing.T) { repo := testUniqueRepoName() - _, err := deps.catalog.CreateRepository(ctx, repo, "storage", onBlock(deps, repo), "main", false) + _, err := deps.catalog.CreateRepository(ctx, repo, "", onBlock(deps, repo), "main", false) testutil.Must(t, err) resp, err := clt.CreateCommitRecordWithResponse(ctx, repo, body) testutil.MustDo(t, "create commit record", err) @@ -5418,7 +5418,7 @@ func TestController_CreateCommitRecord(t *testing.T) { t.Run("create commit record with wrong commitID", func(t *testing.T) { repo := testUniqueRepoName() - _, err := deps.catalog.CreateRepository(ctx, repo, "storage", onBlock(deps, repo), "main", false) + _, err := deps.catalog.CreateRepository(ctx, repo, "", onBlock(deps, repo), "main", false) testutil.Must(t, err) bodyCpy := body bodyCpy.CommitId = "wrong" @@ -5431,7 +5431,7 @@ func TestController_CreateCommitRecord(t *testing.T) { t.Run("read only repository", func(t *testing.T) { repo := testUniqueRepoName() - _, err := deps.catalog.CreateRepository(ctx, repo, "storage", onBlock(deps, repo), "main", true) + _, err := deps.catalog.CreateRepository(ctx, repo, "", onBlock(deps, repo), "main", true) testutil.Must(t, err) resp, err := clt.CreateCommitRecordWithResponse(ctx, repo, body) testutil.Must(t, err) @@ -5448,7 +5448,7 @@ func TestController_CreateCommitRecord(t *testing.T) { t.Run("already existing commit", func(t *testing.T) { repo := testUniqueRepoName() - _, err := deps.catalog.CreateRepository(ctx, repo, "storage", onBlock(deps, repo), "main", false) + _, err := deps.catalog.CreateRepository(ctx, repo, "", onBlock(deps, repo), "main", false) testutil.Must(t, err) resp, err := clt.CreateCommitRecordWithResponse(ctx, repo, body) testutil.MustDo(t, "create commit record", err) @@ -5612,7 +5612,7 @@ func TestController_CreatePullRequest(t *testing.T) { clt, deps := setupClientWithAdmin(t) ctx := context.Background() repo := testUniqueRepoName() - _, err := deps.catalog.CreateRepository(ctx, repo, "storage", onBlock(deps, repo), "main", false) + _, err := deps.catalog.CreateRepository(ctx, repo, "", onBlock(deps, repo), "main", false) require.NoError(t, err) t.Run("invalid source", func(t *testing.T) { @@ -5717,7 +5717,7 @@ func TestController_GetPullRequest(t *testing.T) { clt, deps := setupClientWithAdmin(t) ctx := context.Background() repo := testUniqueRepoName() - _, err := deps.catalog.CreateRepository(ctx, repo, "storage", onBlock(deps, repo), "main", false) + _, err := deps.catalog.CreateRepository(ctx, repo, "", onBlock(deps, repo), "main", false) require.NoError(t, err) t.Run("invalid xid", func(t *testing.T) { @@ -5738,7 +5738,7 @@ func TestController_ListPullRequestsHandler(t *testing.T) { clt, deps := setupClientWithAdmin(t) ctx := context.Background() repo := testUniqueRepoName() - _, err := deps.catalog.CreateRepository(ctx, repo, "storage", onBlock(deps, "foo1"), "main", false) + _, err := deps.catalog.CreateRepository(ctx, repo, "", onBlock(deps, "foo1"), "main", false) require.NoError(t, err) t.Run("no pull requests", func(t *testing.T) { @@ -5873,7 +5873,7 @@ func TestController_UpdatePullRequest(t *testing.T) { clt, deps := setupClientWithAdmin(t) ctx := context.Background() repo := testUniqueRepoName() - _, err := deps.catalog.CreateRepository(ctx, repo, "storage", onBlock(deps, repo), "main", false) + _, err := deps.catalog.CreateRepository(ctx, repo, "", onBlock(deps, repo), "main", false) require.NoError(t, err) t.Run("invalid xid", func(t *testing.T) { @@ -6025,7 +6025,7 @@ func TestController_MergePullRequest(t *testing.T) { clt, deps := setupClientWithAdmin(t) ctx := context.Background() repo := testUniqueRepoName() - _, err := deps.catalog.CreateRepository(ctx, repo, "storage", onBlock(deps, repo), "main", false) + _, err := deps.catalog.CreateRepository(ctx, repo, "", onBlock(deps, repo), "main", false) require.NoError(t, err) t.Run("invalid xid", func(t *testing.T) { diff --git a/pkg/catalog/catalog_test.go b/pkg/catalog/catalog_test.go index 9aad74cd31d..1f6ea569874 100644 --- a/pkg/catalog/catalog_test.go +++ b/pkg/catalog/catalog_test.go @@ -77,7 +77,7 @@ func TestCatalog_ListRepositories(t *testing.T) { {RepositoryID: "repo2", Repository: &graveler.Repository{StorageID: "storage1", StorageNamespace: "storageNS3", CreationDate: now, DefaultBranchID: "main3"}}, {RepositoryID: "repo22", Repository: &graveler.Repository{StorageID: "storage1", StorageNamespace: "storageNS4", CreationDate: now, DefaultBranchID: "main4"}}, {RepositoryID: "repo23", Repository: &graveler.Repository{StorageID: "storage1", StorageNamespace: "storageNS5", CreationDate: now, DefaultBranchID: "main5"}}, - {RepositoryID: "repo3", Repository: &graveler.Repository{StorageID: "storage2", StorageNamespace: "storageNS6", CreationDate: now, DefaultBranchID: "main6"}}, + {RepositoryID: "repo3", Repository: &graveler.Repository{StorageID: "", StorageNamespace: "storageNS6", CreationDate: now, DefaultBranchID: "main6"}}, } type args struct { limit int @@ -106,7 +106,7 @@ func TestCatalog_ListRepositories(t *testing.T) { {Name: "repo2", StorageID: "storage1", StorageNamespace: "storageNS3", DefaultBranch: "main3", CreationDate: now}, {Name: "repo22", StorageID: "storage1", StorageNamespace: "storageNS4", DefaultBranch: "main4", CreationDate: now}, {Name: "repo23", StorageID: "storage1", StorageNamespace: "storageNS5", DefaultBranch: "main5", CreationDate: now}, - {Name: "repo3", StorageID: "storage2", StorageNamespace: "storageNS6", DefaultBranch: "main6", CreationDate: now}, + {Name: "repo3", StorageID: "", StorageNamespace: "storageNS6", DefaultBranch: "main6", CreationDate: now}, }, wantHasMore: false, wantErr: false, @@ -178,7 +178,7 @@ func TestCatalog_ListRepositories(t *testing.T) { }, want: []*catalog.Repository{ {Name: "repo23", StorageID: "storage1", StorageNamespace: "storageNS5", DefaultBranch: "main5", CreationDate: now}, - {Name: "repo3", StorageID: "storage2", StorageNamespace: "storageNS6", DefaultBranch: "main6", CreationDate: now}, + {Name: "repo3", StorageID: "", StorageNamespace: "storageNS6", DefaultBranch: "main6", CreationDate: now}, }, wantHasMore: false, wantErr: false, From 298bc0d36d613a1042654f40a0fd803c0ede89d3 Mon Sep 17 00:00:00 2001 From: Itai Gilo Date: Fri, 17 Jan 2025 16:01:31 +0000 Subject: [PATCH 14/26] Allow only empty StorageID --- pkg/catalog/catalog.go | 2 ++ pkg/catalog/catalog_test.go | 50 ++++++++++++++++++------------------- pkg/graveler/errors.go | 1 + pkg/graveler/validate.go | 13 ++++++++++ 4 files changed, 41 insertions(+), 25 deletions(-) diff --git a/pkg/catalog/catalog.go b/pkg/catalog/catalog.go index b632783e187..b0270124390 100644 --- a/pkg/catalog/catalog.go +++ b/pkg/catalog/catalog.go @@ -453,6 +453,7 @@ func (c *Catalog) CreateRepository(ctx context.Context, repository string, stora branchID := graveler.BranchID(branch) if err := validator.Validate([]validator.ValidateArg{ {Name: "name", Value: repositoryID, Fn: graveler.ValidateRepositoryID}, + {Name: "storageID", Value: storageIdentifier, Fn: graveler.ValidateStorageID}, {Name: "storageNamespace", Value: storageNS, Fn: graveler.ValidateStorageNamespace}, }); err != nil { return nil, err @@ -481,6 +482,7 @@ func (c *Catalog) CreateBareRepository(ctx context.Context, repository string, s branchID := graveler.BranchID(defaultBranchID) if err := validator.Validate([]validator.ValidateArg{ {Name: "name", Value: repositoryID, Fn: graveler.ValidateRepositoryID}, + {Name: "storageID", Value: storageIdentifier, Fn: graveler.ValidateStorageID}, {Name: "storageNamespace", Value: storageNS, Fn: graveler.ValidateStorageNamespace}, }); err != nil { return nil, err diff --git a/pkg/catalog/catalog_test.go b/pkg/catalog/catalog_test.go index 1f6ea569874..28d4ef9583c 100644 --- a/pkg/catalog/catalog_test.go +++ b/pkg/catalog/catalog_test.go @@ -72,11 +72,11 @@ func TestCatalog_ListRepositories(t *testing.T) { // prepare data tests now := time.Now() gravelerData := []*graveler.RepositoryRecord{ - {RepositoryID: "re", Repository: &graveler.Repository{StorageID: "storage", StorageNamespace: "storageNS1", CreationDate: now, DefaultBranchID: "main1"}}, - {RepositoryID: "repo1", Repository: &graveler.Repository{StorageID: "storage1", StorageNamespace: "storageNS2", CreationDate: now, DefaultBranchID: "main2"}}, - {RepositoryID: "repo2", Repository: &graveler.Repository{StorageID: "storage1", StorageNamespace: "storageNS3", CreationDate: now, DefaultBranchID: "main3"}}, - {RepositoryID: "repo22", Repository: &graveler.Repository{StorageID: "storage1", StorageNamespace: "storageNS4", CreationDate: now, DefaultBranchID: "main4"}}, - {RepositoryID: "repo23", Repository: &graveler.Repository{StorageID: "storage1", StorageNamespace: "storageNS5", CreationDate: now, DefaultBranchID: "main5"}}, + {RepositoryID: "re", Repository: &graveler.Repository{StorageID: "", StorageNamespace: "storageNS1", CreationDate: now, DefaultBranchID: "main1"}}, + {RepositoryID: "repo1", Repository: &graveler.Repository{StorageID: "", StorageNamespace: "storageNS2", CreationDate: now, DefaultBranchID: "main2"}}, + {RepositoryID: "repo2", Repository: &graveler.Repository{StorageID: "", StorageNamespace: "storageNS3", CreationDate: now, DefaultBranchID: "main3"}}, + {RepositoryID: "repo22", Repository: &graveler.Repository{StorageID: "", StorageNamespace: "storageNS4", CreationDate: now, DefaultBranchID: "main4"}}, + {RepositoryID: "repo23", Repository: &graveler.Repository{StorageID: "", StorageNamespace: "storageNS5", CreationDate: now, DefaultBranchID: "main5"}}, {RepositoryID: "repo3", Repository: &graveler.Repository{StorageID: "", StorageNamespace: "storageNS6", CreationDate: now, DefaultBranchID: "main6"}}, } type args struct { @@ -101,11 +101,11 @@ func TestCatalog_ListRepositories(t *testing.T) { searchString: "", }, want: []*catalog.Repository{ - {Name: "re", StorageID: "storage", StorageNamespace: "storageNS1", DefaultBranch: "main1", CreationDate: now}, - {Name: "repo1", StorageID: "storage1", StorageNamespace: "storageNS2", DefaultBranch: "main2", CreationDate: now}, - {Name: "repo2", StorageID: "storage1", StorageNamespace: "storageNS3", DefaultBranch: "main3", CreationDate: now}, - {Name: "repo22", StorageID: "storage1", StorageNamespace: "storageNS4", DefaultBranch: "main4", CreationDate: now}, - {Name: "repo23", StorageID: "storage1", StorageNamespace: "storageNS5", DefaultBranch: "main5", CreationDate: now}, + {Name: "re", StorageID: "", StorageNamespace: "storageNS1", DefaultBranch: "main1", CreationDate: now}, + {Name: "repo1", StorageID: "", StorageNamespace: "storageNS2", DefaultBranch: "main2", CreationDate: now}, + {Name: "repo2", StorageID: "", StorageNamespace: "storageNS3", DefaultBranch: "main3", CreationDate: now}, + {Name: "repo22", StorageID: "", StorageNamespace: "storageNS4", DefaultBranch: "main4", CreationDate: now}, + {Name: "repo23", StorageID: "", StorageNamespace: "storageNS5", DefaultBranch: "main5", CreationDate: now}, {Name: "repo3", StorageID: "", StorageNamespace: "storageNS6", DefaultBranch: "main6", CreationDate: now}, }, wantHasMore: false, @@ -120,7 +120,7 @@ func TestCatalog_ListRepositories(t *testing.T) { searchString: "", }, want: []*catalog.Repository{ - {Name: "re", StorageID: "storage", StorageNamespace: "storageNS1", DefaultBranch: "main1", CreationDate: now}, + {Name: "re", StorageID: "", StorageNamespace: "storageNS1", DefaultBranch: "main1", CreationDate: now}, }, wantHasMore: true, wantErr: false, @@ -134,7 +134,7 @@ func TestCatalog_ListRepositories(t *testing.T) { searchString: "", }, want: []*catalog.Repository{ - {Name: "repo1", StorageID: "storage1", StorageNamespace: "storageNS2", DefaultBranch: "main2", CreationDate: now}, + {Name: "repo1", StorageID: "", StorageNamespace: "storageNS2", DefaultBranch: "main2", CreationDate: now}, }, wantHasMore: true, wantErr: false, @@ -148,8 +148,8 @@ func TestCatalog_ListRepositories(t *testing.T) { searchString: "", }, want: []*catalog.Repository{ - {Name: "repo2", StorageID: "storage1", StorageNamespace: "storageNS3", DefaultBranch: "main3", CreationDate: now}, - {Name: "repo22", StorageID: "storage1", StorageNamespace: "storageNS4", DefaultBranch: "main4", CreationDate: now}, + {Name: "repo2", StorageID: "", StorageNamespace: "storageNS3", DefaultBranch: "main3", CreationDate: now}, + {Name: "repo22", StorageID: "", StorageNamespace: "storageNS4", DefaultBranch: "main4", CreationDate: now}, }, wantHasMore: true, wantErr: false, @@ -163,7 +163,7 @@ func TestCatalog_ListRepositories(t *testing.T) { searchString: "", }, want: []*catalog.Repository{ - {Name: "repo1", StorageID: "storage1", StorageNamespace: "storageNS2", DefaultBranch: "main2", CreationDate: now}, + {Name: "repo1", StorageID: "", StorageNamespace: "storageNS2", DefaultBranch: "main2", CreationDate: now}, }, wantHasMore: true, wantErr: false, @@ -177,7 +177,7 @@ func TestCatalog_ListRepositories(t *testing.T) { searchString: "", }, want: []*catalog.Repository{ - {Name: "repo23", StorageID: "storage1", StorageNamespace: "storageNS5", DefaultBranch: "main5", CreationDate: now}, + {Name: "repo23", StorageID: "", StorageNamespace: "storageNS5", DefaultBranch: "main5", CreationDate: now}, {Name: "repo3", StorageID: "", StorageNamespace: "storageNS6", DefaultBranch: "main6", CreationDate: now}, }, wantHasMore: false, @@ -192,9 +192,9 @@ func TestCatalog_ListRepositories(t *testing.T) { searchString: "o2", }, want: []*catalog.Repository{ - {Name: "repo2", StorageID: "storage1", StorageNamespace: "storageNS3", DefaultBranch: "main3", CreationDate: now}, - {Name: "repo22", StorageID: "storage1", StorageNamespace: "storageNS4", DefaultBranch: "main4", CreationDate: now}, - {Name: "repo23", StorageID: "storage1", StorageNamespace: "storageNS5", DefaultBranch: "main5", CreationDate: now}, + {Name: "repo2", StorageID: "", StorageNamespace: "storageNS3", DefaultBranch: "main3", CreationDate: now}, + {Name: "repo22", StorageID: "", StorageNamespace: "storageNS4", DefaultBranch: "main4", CreationDate: now}, + {Name: "repo23", StorageID: "", StorageNamespace: "storageNS5", DefaultBranch: "main5", CreationDate: now}, }, wantHasMore: false, wantErr: false, @@ -208,8 +208,8 @@ func TestCatalog_ListRepositories(t *testing.T) { searchString: "o2", }, want: []*catalog.Repository{ - {Name: "repo2", StorageID: "storage1", StorageNamespace: "storageNS3", DefaultBranch: "main3", CreationDate: now}, - {Name: "repo22", StorageID: "storage1", StorageNamespace: "storageNS4", DefaultBranch: "main4", CreationDate: now}, + {Name: "repo2", StorageID: "", StorageNamespace: "storageNS3", DefaultBranch: "main3", CreationDate: now}, + {Name: "repo22", StorageID: "", StorageNamespace: "storageNS4", DefaultBranch: "main4", CreationDate: now}, }, wantHasMore: true, wantErr: false, @@ -223,7 +223,7 @@ func TestCatalog_ListRepositories(t *testing.T) { searchString: "o2", }, want: []*catalog.Repository{ - {Name: "repo23", StorageID: "storage1", StorageNamespace: "storageNS5", DefaultBranch: "main5", CreationDate: now}, + {Name: "repo23", StorageID: "", StorageNamespace: "storageNS5", DefaultBranch: "main5", CreationDate: now}, }, wantHasMore: false, wantErr: false, @@ -237,8 +237,8 @@ func TestCatalog_ListRepositories(t *testing.T) { searchString: "o2", }, want: []*catalog.Repository{ - {Name: "repo22", StorageID: "storage1", StorageNamespace: "storageNS4", DefaultBranch: "main4", CreationDate: now}, - {Name: "repo23", StorageID: "storage1", StorageNamespace: "storageNS5", DefaultBranch: "main5", CreationDate: now}, + {Name: "repo22", StorageID: "", StorageNamespace: "storageNS4", DefaultBranch: "main4", CreationDate: now}, + {Name: "repo23", StorageID: "", StorageNamespace: "storageNS5", DefaultBranch: "main5", CreationDate: now}, }, wantHasMore: false, wantErr: false, @@ -871,7 +871,7 @@ func createPrepareUncommittedTestScenario(t *testing.T, repositoryID string, num repository := &graveler.RepositoryRecord{ RepositoryID: graveler.RepositoryID(repositoryID), Repository: &graveler.Repository{ - StorageID: "storage", + StorageID: "", StorageNamespace: graveler.StorageNamespace("mem://" + repositoryID), CreationDate: time.Now(), DefaultBranchID: "main", diff --git a/pkg/graveler/errors.go b/pkg/graveler/errors.go index 0fb6ebf5134..6a2e4f4f702 100644 --- a/pkg/graveler/errors.go +++ b/pkg/graveler/errors.go @@ -30,6 +30,7 @@ var ( ErrInvalidTagID = fmt.Errorf("tag id: %w", ErrInvalidValue) ErrInvalid = errors.New("validation error") ErrInvalidType = fmt.Errorf("invalid type: %w", ErrInvalid) + ErrInvalidStorageID = fmt.Errorf("storage id: %w", ErrInvalidValue) ErrInvalidRepositoryID = fmt.Errorf("repository id: %w", ErrInvalidValue) ErrRequiredValue = fmt.Errorf("required value: %w", ErrInvalid) ErrCommitNotFound = fmt.Errorf("commit %w", ErrNotFound) diff --git a/pkg/graveler/validate.go b/pkg/graveler/validate.go index 71ccf860210..d4ae86024bd 100644 --- a/pkg/graveler/validate.go +++ b/pkg/graveler/validate.go @@ -7,6 +7,19 @@ import ( "github.com/treeverse/lakefs/pkg/validator" ) +func ValidateStorageID(v interface{}) error { + s, ok := v.(StorageID) + if !ok { + panic(ErrInvalidType) + } + + // TODO (gilo): this should somehow be validated in the context of the block storage + if len(s) != 0 { + return ErrInvalidStorageID + } + return nil +} + func ValidateStorageNamespace(v interface{}) error { s, ok := v.(StorageNamespace) if !ok { From 299c29256a8f1f6daa819fc67e49374f4987944c Mon Sep 17 00:00:00 2001 From: Itai Gilo Date: Fri, 17 Jan 2025 16:41:32 +0000 Subject: [PATCH 15/26] Revert "Allow only empty StorageID" This reverts commit 298bc0d36d613a1042654f40a0fd803c0ede89d3. --- pkg/catalog/catalog.go | 2 -- pkg/catalog/catalog_test.go | 50 ++++++++++++++++++------------------- pkg/graveler/errors.go | 1 - pkg/graveler/validate.go | 13 ---------- 4 files changed, 25 insertions(+), 41 deletions(-) diff --git a/pkg/catalog/catalog.go b/pkg/catalog/catalog.go index b0270124390..b632783e187 100644 --- a/pkg/catalog/catalog.go +++ b/pkg/catalog/catalog.go @@ -453,7 +453,6 @@ func (c *Catalog) CreateRepository(ctx context.Context, repository string, stora branchID := graveler.BranchID(branch) if err := validator.Validate([]validator.ValidateArg{ {Name: "name", Value: repositoryID, Fn: graveler.ValidateRepositoryID}, - {Name: "storageID", Value: storageIdentifier, Fn: graveler.ValidateStorageID}, {Name: "storageNamespace", Value: storageNS, Fn: graveler.ValidateStorageNamespace}, }); err != nil { return nil, err @@ -482,7 +481,6 @@ func (c *Catalog) CreateBareRepository(ctx context.Context, repository string, s branchID := graveler.BranchID(defaultBranchID) if err := validator.Validate([]validator.ValidateArg{ {Name: "name", Value: repositoryID, Fn: graveler.ValidateRepositoryID}, - {Name: "storageID", Value: storageIdentifier, Fn: graveler.ValidateStorageID}, {Name: "storageNamespace", Value: storageNS, Fn: graveler.ValidateStorageNamespace}, }); err != nil { return nil, err diff --git a/pkg/catalog/catalog_test.go b/pkg/catalog/catalog_test.go index 28d4ef9583c..1f6ea569874 100644 --- a/pkg/catalog/catalog_test.go +++ b/pkg/catalog/catalog_test.go @@ -72,11 +72,11 @@ func TestCatalog_ListRepositories(t *testing.T) { // prepare data tests now := time.Now() gravelerData := []*graveler.RepositoryRecord{ - {RepositoryID: "re", Repository: &graveler.Repository{StorageID: "", StorageNamespace: "storageNS1", CreationDate: now, DefaultBranchID: "main1"}}, - {RepositoryID: "repo1", Repository: &graveler.Repository{StorageID: "", StorageNamespace: "storageNS2", CreationDate: now, DefaultBranchID: "main2"}}, - {RepositoryID: "repo2", Repository: &graveler.Repository{StorageID: "", StorageNamespace: "storageNS3", CreationDate: now, DefaultBranchID: "main3"}}, - {RepositoryID: "repo22", Repository: &graveler.Repository{StorageID: "", StorageNamespace: "storageNS4", CreationDate: now, DefaultBranchID: "main4"}}, - {RepositoryID: "repo23", Repository: &graveler.Repository{StorageID: "", StorageNamespace: "storageNS5", CreationDate: now, DefaultBranchID: "main5"}}, + {RepositoryID: "re", Repository: &graveler.Repository{StorageID: "storage", StorageNamespace: "storageNS1", CreationDate: now, DefaultBranchID: "main1"}}, + {RepositoryID: "repo1", Repository: &graveler.Repository{StorageID: "storage1", StorageNamespace: "storageNS2", CreationDate: now, DefaultBranchID: "main2"}}, + {RepositoryID: "repo2", Repository: &graveler.Repository{StorageID: "storage1", StorageNamespace: "storageNS3", CreationDate: now, DefaultBranchID: "main3"}}, + {RepositoryID: "repo22", Repository: &graveler.Repository{StorageID: "storage1", StorageNamespace: "storageNS4", CreationDate: now, DefaultBranchID: "main4"}}, + {RepositoryID: "repo23", Repository: &graveler.Repository{StorageID: "storage1", StorageNamespace: "storageNS5", CreationDate: now, DefaultBranchID: "main5"}}, {RepositoryID: "repo3", Repository: &graveler.Repository{StorageID: "", StorageNamespace: "storageNS6", CreationDate: now, DefaultBranchID: "main6"}}, } type args struct { @@ -101,11 +101,11 @@ func TestCatalog_ListRepositories(t *testing.T) { searchString: "", }, want: []*catalog.Repository{ - {Name: "re", StorageID: "", StorageNamespace: "storageNS1", DefaultBranch: "main1", CreationDate: now}, - {Name: "repo1", StorageID: "", StorageNamespace: "storageNS2", DefaultBranch: "main2", CreationDate: now}, - {Name: "repo2", StorageID: "", StorageNamespace: "storageNS3", DefaultBranch: "main3", CreationDate: now}, - {Name: "repo22", StorageID: "", StorageNamespace: "storageNS4", DefaultBranch: "main4", CreationDate: now}, - {Name: "repo23", StorageID: "", StorageNamespace: "storageNS5", DefaultBranch: "main5", CreationDate: now}, + {Name: "re", StorageID: "storage", StorageNamespace: "storageNS1", DefaultBranch: "main1", CreationDate: now}, + {Name: "repo1", StorageID: "storage1", StorageNamespace: "storageNS2", DefaultBranch: "main2", CreationDate: now}, + {Name: "repo2", StorageID: "storage1", StorageNamespace: "storageNS3", DefaultBranch: "main3", CreationDate: now}, + {Name: "repo22", StorageID: "storage1", StorageNamespace: "storageNS4", DefaultBranch: "main4", CreationDate: now}, + {Name: "repo23", StorageID: "storage1", StorageNamespace: "storageNS5", DefaultBranch: "main5", CreationDate: now}, {Name: "repo3", StorageID: "", StorageNamespace: "storageNS6", DefaultBranch: "main6", CreationDate: now}, }, wantHasMore: false, @@ -120,7 +120,7 @@ func TestCatalog_ListRepositories(t *testing.T) { searchString: "", }, want: []*catalog.Repository{ - {Name: "re", StorageID: "", StorageNamespace: "storageNS1", DefaultBranch: "main1", CreationDate: now}, + {Name: "re", StorageID: "storage", StorageNamespace: "storageNS1", DefaultBranch: "main1", CreationDate: now}, }, wantHasMore: true, wantErr: false, @@ -134,7 +134,7 @@ func TestCatalog_ListRepositories(t *testing.T) { searchString: "", }, want: []*catalog.Repository{ - {Name: "repo1", StorageID: "", StorageNamespace: "storageNS2", DefaultBranch: "main2", CreationDate: now}, + {Name: "repo1", StorageID: "storage1", StorageNamespace: "storageNS2", DefaultBranch: "main2", CreationDate: now}, }, wantHasMore: true, wantErr: false, @@ -148,8 +148,8 @@ func TestCatalog_ListRepositories(t *testing.T) { searchString: "", }, want: []*catalog.Repository{ - {Name: "repo2", StorageID: "", StorageNamespace: "storageNS3", DefaultBranch: "main3", CreationDate: now}, - {Name: "repo22", StorageID: "", StorageNamespace: "storageNS4", DefaultBranch: "main4", CreationDate: now}, + {Name: "repo2", StorageID: "storage1", StorageNamespace: "storageNS3", DefaultBranch: "main3", CreationDate: now}, + {Name: "repo22", StorageID: "storage1", StorageNamespace: "storageNS4", DefaultBranch: "main4", CreationDate: now}, }, wantHasMore: true, wantErr: false, @@ -163,7 +163,7 @@ func TestCatalog_ListRepositories(t *testing.T) { searchString: "", }, want: []*catalog.Repository{ - {Name: "repo1", StorageID: "", StorageNamespace: "storageNS2", DefaultBranch: "main2", CreationDate: now}, + {Name: "repo1", StorageID: "storage1", StorageNamespace: "storageNS2", DefaultBranch: "main2", CreationDate: now}, }, wantHasMore: true, wantErr: false, @@ -177,7 +177,7 @@ func TestCatalog_ListRepositories(t *testing.T) { searchString: "", }, want: []*catalog.Repository{ - {Name: "repo23", StorageID: "", StorageNamespace: "storageNS5", DefaultBranch: "main5", CreationDate: now}, + {Name: "repo23", StorageID: "storage1", StorageNamespace: "storageNS5", DefaultBranch: "main5", CreationDate: now}, {Name: "repo3", StorageID: "", StorageNamespace: "storageNS6", DefaultBranch: "main6", CreationDate: now}, }, wantHasMore: false, @@ -192,9 +192,9 @@ func TestCatalog_ListRepositories(t *testing.T) { searchString: "o2", }, want: []*catalog.Repository{ - {Name: "repo2", StorageID: "", StorageNamespace: "storageNS3", DefaultBranch: "main3", CreationDate: now}, - {Name: "repo22", StorageID: "", StorageNamespace: "storageNS4", DefaultBranch: "main4", CreationDate: now}, - {Name: "repo23", StorageID: "", StorageNamespace: "storageNS5", DefaultBranch: "main5", CreationDate: now}, + {Name: "repo2", StorageID: "storage1", StorageNamespace: "storageNS3", DefaultBranch: "main3", CreationDate: now}, + {Name: "repo22", StorageID: "storage1", StorageNamespace: "storageNS4", DefaultBranch: "main4", CreationDate: now}, + {Name: "repo23", StorageID: "storage1", StorageNamespace: "storageNS5", DefaultBranch: "main5", CreationDate: now}, }, wantHasMore: false, wantErr: false, @@ -208,8 +208,8 @@ func TestCatalog_ListRepositories(t *testing.T) { searchString: "o2", }, want: []*catalog.Repository{ - {Name: "repo2", StorageID: "", StorageNamespace: "storageNS3", DefaultBranch: "main3", CreationDate: now}, - {Name: "repo22", StorageID: "", StorageNamespace: "storageNS4", DefaultBranch: "main4", CreationDate: now}, + {Name: "repo2", StorageID: "storage1", StorageNamespace: "storageNS3", DefaultBranch: "main3", CreationDate: now}, + {Name: "repo22", StorageID: "storage1", StorageNamespace: "storageNS4", DefaultBranch: "main4", CreationDate: now}, }, wantHasMore: true, wantErr: false, @@ -223,7 +223,7 @@ func TestCatalog_ListRepositories(t *testing.T) { searchString: "o2", }, want: []*catalog.Repository{ - {Name: "repo23", StorageID: "", StorageNamespace: "storageNS5", DefaultBranch: "main5", CreationDate: now}, + {Name: "repo23", StorageID: "storage1", StorageNamespace: "storageNS5", DefaultBranch: "main5", CreationDate: now}, }, wantHasMore: false, wantErr: false, @@ -237,8 +237,8 @@ func TestCatalog_ListRepositories(t *testing.T) { searchString: "o2", }, want: []*catalog.Repository{ - {Name: "repo22", StorageID: "", StorageNamespace: "storageNS4", DefaultBranch: "main4", CreationDate: now}, - {Name: "repo23", StorageID: "", StorageNamespace: "storageNS5", DefaultBranch: "main5", CreationDate: now}, + {Name: "repo22", StorageID: "storage1", StorageNamespace: "storageNS4", DefaultBranch: "main4", CreationDate: now}, + {Name: "repo23", StorageID: "storage1", StorageNamespace: "storageNS5", DefaultBranch: "main5", CreationDate: now}, }, wantHasMore: false, wantErr: false, @@ -871,7 +871,7 @@ func createPrepareUncommittedTestScenario(t *testing.T, repositoryID string, num repository := &graveler.RepositoryRecord{ RepositoryID: graveler.RepositoryID(repositoryID), Repository: &graveler.Repository{ - StorageID: "", + StorageID: "storage", StorageNamespace: graveler.StorageNamespace("mem://" + repositoryID), CreationDate: time.Now(), DefaultBranchID: "main", diff --git a/pkg/graveler/errors.go b/pkg/graveler/errors.go index 6a2e4f4f702..0fb6ebf5134 100644 --- a/pkg/graveler/errors.go +++ b/pkg/graveler/errors.go @@ -30,7 +30,6 @@ var ( ErrInvalidTagID = fmt.Errorf("tag id: %w", ErrInvalidValue) ErrInvalid = errors.New("validation error") ErrInvalidType = fmt.Errorf("invalid type: %w", ErrInvalid) - ErrInvalidStorageID = fmt.Errorf("storage id: %w", ErrInvalidValue) ErrInvalidRepositoryID = fmt.Errorf("repository id: %w", ErrInvalidValue) ErrRequiredValue = fmt.Errorf("required value: %w", ErrInvalid) ErrCommitNotFound = fmt.Errorf("commit %w", ErrNotFound) diff --git a/pkg/graveler/validate.go b/pkg/graveler/validate.go index d4ae86024bd..71ccf860210 100644 --- a/pkg/graveler/validate.go +++ b/pkg/graveler/validate.go @@ -7,19 +7,6 @@ import ( "github.com/treeverse/lakefs/pkg/validator" ) -func ValidateStorageID(v interface{}) error { - s, ok := v.(StorageID) - if !ok { - panic(ErrInvalidType) - } - - // TODO (gilo): this should somehow be validated in the context of the block storage - if len(s) != 0 { - return ErrInvalidStorageID - } - return nil -} - func ValidateStorageNamespace(v interface{}) error { s, ok := v.(StorageNamespace) if !ok { From b81eff33d8a4c80db516ac945781a294d9c71434 Mon Sep 17 00:00:00 2001 From: Itai Gilo Date: Fri, 17 Jan 2025 16:52:10 +0000 Subject: [PATCH 16/26] Revert "Revert "Allow only empty StorageID"" This reverts commit 299c29256a8f1f6daa819fc67e49374f4987944c. --- pkg/catalog/catalog.go | 2 ++ pkg/catalog/catalog_test.go | 50 ++++++++++++++++++------------------- pkg/graveler/errors.go | 1 + pkg/graveler/validate.go | 13 ++++++++++ 4 files changed, 41 insertions(+), 25 deletions(-) diff --git a/pkg/catalog/catalog.go b/pkg/catalog/catalog.go index b632783e187..b0270124390 100644 --- a/pkg/catalog/catalog.go +++ b/pkg/catalog/catalog.go @@ -453,6 +453,7 @@ func (c *Catalog) CreateRepository(ctx context.Context, repository string, stora branchID := graveler.BranchID(branch) if err := validator.Validate([]validator.ValidateArg{ {Name: "name", Value: repositoryID, Fn: graveler.ValidateRepositoryID}, + {Name: "storageID", Value: storageIdentifier, Fn: graveler.ValidateStorageID}, {Name: "storageNamespace", Value: storageNS, Fn: graveler.ValidateStorageNamespace}, }); err != nil { return nil, err @@ -481,6 +482,7 @@ func (c *Catalog) CreateBareRepository(ctx context.Context, repository string, s branchID := graveler.BranchID(defaultBranchID) if err := validator.Validate([]validator.ValidateArg{ {Name: "name", Value: repositoryID, Fn: graveler.ValidateRepositoryID}, + {Name: "storageID", Value: storageIdentifier, Fn: graveler.ValidateStorageID}, {Name: "storageNamespace", Value: storageNS, Fn: graveler.ValidateStorageNamespace}, }); err != nil { return nil, err diff --git a/pkg/catalog/catalog_test.go b/pkg/catalog/catalog_test.go index 1f6ea569874..28d4ef9583c 100644 --- a/pkg/catalog/catalog_test.go +++ b/pkg/catalog/catalog_test.go @@ -72,11 +72,11 @@ func TestCatalog_ListRepositories(t *testing.T) { // prepare data tests now := time.Now() gravelerData := []*graveler.RepositoryRecord{ - {RepositoryID: "re", Repository: &graveler.Repository{StorageID: "storage", StorageNamespace: "storageNS1", CreationDate: now, DefaultBranchID: "main1"}}, - {RepositoryID: "repo1", Repository: &graveler.Repository{StorageID: "storage1", StorageNamespace: "storageNS2", CreationDate: now, DefaultBranchID: "main2"}}, - {RepositoryID: "repo2", Repository: &graveler.Repository{StorageID: "storage1", StorageNamespace: "storageNS3", CreationDate: now, DefaultBranchID: "main3"}}, - {RepositoryID: "repo22", Repository: &graveler.Repository{StorageID: "storage1", StorageNamespace: "storageNS4", CreationDate: now, DefaultBranchID: "main4"}}, - {RepositoryID: "repo23", Repository: &graveler.Repository{StorageID: "storage1", StorageNamespace: "storageNS5", CreationDate: now, DefaultBranchID: "main5"}}, + {RepositoryID: "re", Repository: &graveler.Repository{StorageID: "", StorageNamespace: "storageNS1", CreationDate: now, DefaultBranchID: "main1"}}, + {RepositoryID: "repo1", Repository: &graveler.Repository{StorageID: "", StorageNamespace: "storageNS2", CreationDate: now, DefaultBranchID: "main2"}}, + {RepositoryID: "repo2", Repository: &graveler.Repository{StorageID: "", StorageNamespace: "storageNS3", CreationDate: now, DefaultBranchID: "main3"}}, + {RepositoryID: "repo22", Repository: &graveler.Repository{StorageID: "", StorageNamespace: "storageNS4", CreationDate: now, DefaultBranchID: "main4"}}, + {RepositoryID: "repo23", Repository: &graveler.Repository{StorageID: "", StorageNamespace: "storageNS5", CreationDate: now, DefaultBranchID: "main5"}}, {RepositoryID: "repo3", Repository: &graveler.Repository{StorageID: "", StorageNamespace: "storageNS6", CreationDate: now, DefaultBranchID: "main6"}}, } type args struct { @@ -101,11 +101,11 @@ func TestCatalog_ListRepositories(t *testing.T) { searchString: "", }, want: []*catalog.Repository{ - {Name: "re", StorageID: "storage", StorageNamespace: "storageNS1", DefaultBranch: "main1", CreationDate: now}, - {Name: "repo1", StorageID: "storage1", StorageNamespace: "storageNS2", DefaultBranch: "main2", CreationDate: now}, - {Name: "repo2", StorageID: "storage1", StorageNamespace: "storageNS3", DefaultBranch: "main3", CreationDate: now}, - {Name: "repo22", StorageID: "storage1", StorageNamespace: "storageNS4", DefaultBranch: "main4", CreationDate: now}, - {Name: "repo23", StorageID: "storage1", StorageNamespace: "storageNS5", DefaultBranch: "main5", CreationDate: now}, + {Name: "re", StorageID: "", StorageNamespace: "storageNS1", DefaultBranch: "main1", CreationDate: now}, + {Name: "repo1", StorageID: "", StorageNamespace: "storageNS2", DefaultBranch: "main2", CreationDate: now}, + {Name: "repo2", StorageID: "", StorageNamespace: "storageNS3", DefaultBranch: "main3", CreationDate: now}, + {Name: "repo22", StorageID: "", StorageNamespace: "storageNS4", DefaultBranch: "main4", CreationDate: now}, + {Name: "repo23", StorageID: "", StorageNamespace: "storageNS5", DefaultBranch: "main5", CreationDate: now}, {Name: "repo3", StorageID: "", StorageNamespace: "storageNS6", DefaultBranch: "main6", CreationDate: now}, }, wantHasMore: false, @@ -120,7 +120,7 @@ func TestCatalog_ListRepositories(t *testing.T) { searchString: "", }, want: []*catalog.Repository{ - {Name: "re", StorageID: "storage", StorageNamespace: "storageNS1", DefaultBranch: "main1", CreationDate: now}, + {Name: "re", StorageID: "", StorageNamespace: "storageNS1", DefaultBranch: "main1", CreationDate: now}, }, wantHasMore: true, wantErr: false, @@ -134,7 +134,7 @@ func TestCatalog_ListRepositories(t *testing.T) { searchString: "", }, want: []*catalog.Repository{ - {Name: "repo1", StorageID: "storage1", StorageNamespace: "storageNS2", DefaultBranch: "main2", CreationDate: now}, + {Name: "repo1", StorageID: "", StorageNamespace: "storageNS2", DefaultBranch: "main2", CreationDate: now}, }, wantHasMore: true, wantErr: false, @@ -148,8 +148,8 @@ func TestCatalog_ListRepositories(t *testing.T) { searchString: "", }, want: []*catalog.Repository{ - {Name: "repo2", StorageID: "storage1", StorageNamespace: "storageNS3", DefaultBranch: "main3", CreationDate: now}, - {Name: "repo22", StorageID: "storage1", StorageNamespace: "storageNS4", DefaultBranch: "main4", CreationDate: now}, + {Name: "repo2", StorageID: "", StorageNamespace: "storageNS3", DefaultBranch: "main3", CreationDate: now}, + {Name: "repo22", StorageID: "", StorageNamespace: "storageNS4", DefaultBranch: "main4", CreationDate: now}, }, wantHasMore: true, wantErr: false, @@ -163,7 +163,7 @@ func TestCatalog_ListRepositories(t *testing.T) { searchString: "", }, want: []*catalog.Repository{ - {Name: "repo1", StorageID: "storage1", StorageNamespace: "storageNS2", DefaultBranch: "main2", CreationDate: now}, + {Name: "repo1", StorageID: "", StorageNamespace: "storageNS2", DefaultBranch: "main2", CreationDate: now}, }, wantHasMore: true, wantErr: false, @@ -177,7 +177,7 @@ func TestCatalog_ListRepositories(t *testing.T) { searchString: "", }, want: []*catalog.Repository{ - {Name: "repo23", StorageID: "storage1", StorageNamespace: "storageNS5", DefaultBranch: "main5", CreationDate: now}, + {Name: "repo23", StorageID: "", StorageNamespace: "storageNS5", DefaultBranch: "main5", CreationDate: now}, {Name: "repo3", StorageID: "", StorageNamespace: "storageNS6", DefaultBranch: "main6", CreationDate: now}, }, wantHasMore: false, @@ -192,9 +192,9 @@ func TestCatalog_ListRepositories(t *testing.T) { searchString: "o2", }, want: []*catalog.Repository{ - {Name: "repo2", StorageID: "storage1", StorageNamespace: "storageNS3", DefaultBranch: "main3", CreationDate: now}, - {Name: "repo22", StorageID: "storage1", StorageNamespace: "storageNS4", DefaultBranch: "main4", CreationDate: now}, - {Name: "repo23", StorageID: "storage1", StorageNamespace: "storageNS5", DefaultBranch: "main5", CreationDate: now}, + {Name: "repo2", StorageID: "", StorageNamespace: "storageNS3", DefaultBranch: "main3", CreationDate: now}, + {Name: "repo22", StorageID: "", StorageNamespace: "storageNS4", DefaultBranch: "main4", CreationDate: now}, + {Name: "repo23", StorageID: "", StorageNamespace: "storageNS5", DefaultBranch: "main5", CreationDate: now}, }, wantHasMore: false, wantErr: false, @@ -208,8 +208,8 @@ func TestCatalog_ListRepositories(t *testing.T) { searchString: "o2", }, want: []*catalog.Repository{ - {Name: "repo2", StorageID: "storage1", StorageNamespace: "storageNS3", DefaultBranch: "main3", CreationDate: now}, - {Name: "repo22", StorageID: "storage1", StorageNamespace: "storageNS4", DefaultBranch: "main4", CreationDate: now}, + {Name: "repo2", StorageID: "", StorageNamespace: "storageNS3", DefaultBranch: "main3", CreationDate: now}, + {Name: "repo22", StorageID: "", StorageNamespace: "storageNS4", DefaultBranch: "main4", CreationDate: now}, }, wantHasMore: true, wantErr: false, @@ -223,7 +223,7 @@ func TestCatalog_ListRepositories(t *testing.T) { searchString: "o2", }, want: []*catalog.Repository{ - {Name: "repo23", StorageID: "storage1", StorageNamespace: "storageNS5", DefaultBranch: "main5", CreationDate: now}, + {Name: "repo23", StorageID: "", StorageNamespace: "storageNS5", DefaultBranch: "main5", CreationDate: now}, }, wantHasMore: false, wantErr: false, @@ -237,8 +237,8 @@ func TestCatalog_ListRepositories(t *testing.T) { searchString: "o2", }, want: []*catalog.Repository{ - {Name: "repo22", StorageID: "storage1", StorageNamespace: "storageNS4", DefaultBranch: "main4", CreationDate: now}, - {Name: "repo23", StorageID: "storage1", StorageNamespace: "storageNS5", DefaultBranch: "main5", CreationDate: now}, + {Name: "repo22", StorageID: "", StorageNamespace: "storageNS4", DefaultBranch: "main4", CreationDate: now}, + {Name: "repo23", StorageID: "", StorageNamespace: "storageNS5", DefaultBranch: "main5", CreationDate: now}, }, wantHasMore: false, wantErr: false, @@ -871,7 +871,7 @@ func createPrepareUncommittedTestScenario(t *testing.T, repositoryID string, num repository := &graveler.RepositoryRecord{ RepositoryID: graveler.RepositoryID(repositoryID), Repository: &graveler.Repository{ - StorageID: "storage", + StorageID: "", StorageNamespace: graveler.StorageNamespace("mem://" + repositoryID), CreationDate: time.Now(), DefaultBranchID: "main", diff --git a/pkg/graveler/errors.go b/pkg/graveler/errors.go index 0fb6ebf5134..6a2e4f4f702 100644 --- a/pkg/graveler/errors.go +++ b/pkg/graveler/errors.go @@ -30,6 +30,7 @@ var ( ErrInvalidTagID = fmt.Errorf("tag id: %w", ErrInvalidValue) ErrInvalid = errors.New("validation error") ErrInvalidType = fmt.Errorf("invalid type: %w", ErrInvalid) + ErrInvalidStorageID = fmt.Errorf("storage id: %w", ErrInvalidValue) ErrInvalidRepositoryID = fmt.Errorf("repository id: %w", ErrInvalidValue) ErrRequiredValue = fmt.Errorf("required value: %w", ErrInvalid) ErrCommitNotFound = fmt.Errorf("commit %w", ErrNotFound) diff --git a/pkg/graveler/validate.go b/pkg/graveler/validate.go index 71ccf860210..d4ae86024bd 100644 --- a/pkg/graveler/validate.go +++ b/pkg/graveler/validate.go @@ -7,6 +7,19 @@ import ( "github.com/treeverse/lakefs/pkg/validator" ) +func ValidateStorageID(v interface{}) error { + s, ok := v.(StorageID) + if !ok { + panic(ErrInvalidType) + } + + // TODO (gilo): this should somehow be validated in the context of the block storage + if len(s) != 0 { + return ErrInvalidStorageID + } + return nil +} + func ValidateStorageNamespace(v interface{}) error { s, ok := v.(StorageNamespace) if !ok { From acb70e8bf04a4d71c75dbb2ba1418c76bc1f83df Mon Sep 17 00:00:00 2001 From: Itai Gilo Date: Fri, 17 Jan 2025 16:55:48 +0000 Subject: [PATCH 17/26] Change validation --- pkg/catalog/catalog.go | 10 ++++++++-- pkg/graveler/validate.go | 13 ------------- 2 files changed, 8 insertions(+), 15 deletions(-) diff --git a/pkg/catalog/catalog.go b/pkg/catalog/catalog.go index b0270124390..6121467c4ac 100644 --- a/pkg/catalog/catalog.go +++ b/pkg/catalog/catalog.go @@ -453,11 +453,14 @@ func (c *Catalog) CreateRepository(ctx context.Context, repository string, stora branchID := graveler.BranchID(branch) if err := validator.Validate([]validator.ValidateArg{ {Name: "name", Value: repositoryID, Fn: graveler.ValidateRepositoryID}, - {Name: "storageID", Value: storageIdentifier, Fn: graveler.ValidateStorageID}, {Name: "storageNamespace", Value: storageNS, Fn: graveler.ValidateStorageNamespace}, }); err != nil { return nil, err } + // TODO: this is a temporary validation. we should probably move this to the store level + if storageIdentifier != "" { + return nil, graveler.ErrInvalidStorageID + } repo, err := c.Store.CreateRepository(ctx, repositoryID, storageIdentifier, storageNS, branchID, readOnly) if err != nil { return nil, err @@ -482,11 +485,14 @@ func (c *Catalog) CreateBareRepository(ctx context.Context, repository string, s branchID := graveler.BranchID(defaultBranchID) if err := validator.Validate([]validator.ValidateArg{ {Name: "name", Value: repositoryID, Fn: graveler.ValidateRepositoryID}, - {Name: "storageID", Value: storageIdentifier, Fn: graveler.ValidateStorageID}, {Name: "storageNamespace", Value: storageNS, Fn: graveler.ValidateStorageNamespace}, }); err != nil { return nil, err } + // TODO: this is a temporary validation. we should probably move this to the store level + if storageIdentifier != "" { + return nil, graveler.ErrInvalidStorageID + } repo, err := c.Store.CreateBareRepository(ctx, repositoryID, storageIdentifier, storageNS, branchID, readOnly) if err != nil { return nil, err diff --git a/pkg/graveler/validate.go b/pkg/graveler/validate.go index d4ae86024bd..71ccf860210 100644 --- a/pkg/graveler/validate.go +++ b/pkg/graveler/validate.go @@ -7,19 +7,6 @@ import ( "github.com/treeverse/lakefs/pkg/validator" ) -func ValidateStorageID(v interface{}) error { - s, ok := v.(StorageID) - if !ok { - panic(ErrInvalidType) - } - - // TODO (gilo): this should somehow be validated in the context of the block storage - if len(s) != 0 { - return ErrInvalidStorageID - } - return nil -} - func ValidateStorageNamespace(v interface{}) error { s, ok := v.(StorageNamespace) if !ok { From 3dbd9d10eaa8291c43a215fc2afe91c0297ef9d3 Mon Sep 17 00:00:00 2001 From: Itai Gilo Date: Fri, 17 Jan 2025 16:56:33 +0000 Subject: [PATCH 18/26] Remove StorageID in a test --- pkg/catalog/catalog_test.go | 1 - 1 file changed, 1 deletion(-) diff --git a/pkg/catalog/catalog_test.go b/pkg/catalog/catalog_test.go index 28d4ef9583c..0a1679837aa 100644 --- a/pkg/catalog/catalog_test.go +++ b/pkg/catalog/catalog_test.go @@ -871,7 +871,6 @@ func createPrepareUncommittedTestScenario(t *testing.T, repositoryID string, num repository := &graveler.RepositoryRecord{ RepositoryID: graveler.RepositoryID(repositoryID), Repository: &graveler.Repository{ - StorageID: "", StorageNamespace: graveler.StorageNamespace("mem://" + repositoryID), CreationDate: time.Now(), DefaultBranchID: "main", From cecce8db25832115227fc47c0a1a511d5d4fed08 Mon Sep 17 00:00:00 2001 From: Itai Gilo Date: Fri, 17 Jan 2025 17:14:34 +0000 Subject: [PATCH 19/26] Update tests --- pkg/api/controller_test.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/pkg/api/controller_test.go b/pkg/api/controller_test.go index b2a47802516..c7e1302f936 100644 --- a/pkg/api/controller_test.go +++ b/pkg/api/controller_test.go @@ -1015,7 +1015,7 @@ func TestController_CreateRepositoryHandler(t *testing.T) { resp, err := clt.CreateRepositoryWithResponse(ctx, &apigen.CreateRepositoryParams{}, apigen.CreateRepositoryJSONRequestBody{ DefaultBranch: apiutil.Ptr("main"), Name: repoName, - StorageId: swag.String("storage"), + StorageId: swag.String(""), StorageNamespace: onBlock(deps, "foo-bucket-1"), }) verifyResponseOK(t, resp, err) @@ -3631,6 +3631,7 @@ func TestController_ListRepositoryRuns(t *testing.T) { resp, err := clt.CreateRepositoryWithResponse(ctx, &apigen.CreateRepositoryParams{}, apigen.CreateRepositoryJSONRequestBody{ DefaultBranch: apiutil.Ptr("main"), Name: repo, + StorageId: swag.String(""), StorageNamespace: "mem://repo9", }) verifyResponseOK(t, resp, err) From df0b2af9aaf775a615d29f0fdac8fb7f61949be4 Mon Sep 17 00:00:00 2001 From: Itai Gilo Date: Mon, 20 Jan 2025 16:23:37 +0000 Subject: [PATCH 20/26] Add StorageID to ObjectPointer inits --- modules/block/factory/go.work.sum | 639 ++++++++++++++++++ pkg/api/controller.go | 16 + pkg/block/adapter.go | 1 + pkg/block/blocktest/adapter.go | 4 + pkg/block/blocktest/basic_suite.go | 8 + pkg/block/blocktest/multipart_suite.go | 3 + pkg/block/local/adapter.go | 23 +- pkg/catalog/actions_output_writer.go | 1 + pkg/catalog/actions_source.go | 1 + pkg/catalog/catalog.go | 3 + pkg/catalog/catalog_test.go | 2 + pkg/gateway/operations/deleteobject.go | 1 + pkg/gateway/operations/getobject.go | 2 + pkg/gateway/operations/postobject.go | 2 + pkg/gateway/operations/putobject.go | 3 + .../retention/garbage_collection_manager.go | 4 + .../garbage_collection_manager_test.go | 1 + pkg/pyramid/tier_fs.go | 1 + pkg/upload/write_blob.go | 1 + 19 files changed, 713 insertions(+), 3 deletions(-) create mode 100644 modules/block/factory/go.work.sum diff --git a/modules/block/factory/go.work.sum b/modules/block/factory/go.work.sum new file mode 100644 index 00000000000..94085410544 --- /dev/null +++ b/modules/block/factory/go.work.sum @@ -0,0 +1,639 @@ +cloud.google.com/go/accessapproval v1.7.4 h1:ZvLvJ952zK8pFHINjpMBY5k7LTAp/6pBf50RDMRgBUI= +cloud.google.com/go/accessapproval v1.7.4/go.mod h1:/aTEh45LzplQgFYdQdwPMR9YdX0UlhBmvB84uAmQKUc= +cloud.google.com/go/accesscontextmanager v1.8.4 h1:Yo4g2XrBETBCqyWIibN3NHNPQKUfQqti0lI+70rubeE= +cloud.google.com/go/accesscontextmanager v1.8.4/go.mod h1:ParU+WbMpD34s5JFEnGAnPBYAgUHozaTmDJU7aCU9+M= +cloud.google.com/go/aiplatform v1.54.0 h1:wH7OYl9Vq/5tupok0BPTFY9xaTLb0GxkReHtB5PF7cI= +cloud.google.com/go/aiplatform v1.54.0/go.mod h1:pwZMGvqe0JRkI1GWSZCtnAfrR4K1bv65IHILGA//VEU= +cloud.google.com/go/analytics v0.21.6 h1:fnV7B8lqyEYxCU0LKk+vUL7mTlqRAq4uFlIthIdr/iA= +cloud.google.com/go/analytics v0.21.6/go.mod h1:eiROFQKosh4hMaNhF85Oc9WO97Cpa7RggD40e/RBy8w= +cloud.google.com/go/apigateway v1.6.4 h1:VVIxCtVerchHienSlaGzV6XJGtEM9828Erzyr3miUGs= +cloud.google.com/go/apigateway v1.6.4/go.mod h1:0EpJlVGH5HwAN4VF4Iec8TAzGN1aQgbxAWGJsnPCGGY= +cloud.google.com/go/apigeeconnect v1.6.4 h1:jSoGITWKgAj/ssVogNE9SdsTqcXnryPzsulENSRlusI= +cloud.google.com/go/apigeeconnect v1.6.4/go.mod h1:CapQCWZ8TCjnU0d7PobxhpOdVz/OVJ2Hr/Zcuu1xFx0= +cloud.google.com/go/apigeeregistry v0.8.2 h1:DSaD1iiqvELag+lV4VnnqUUFd8GXELu01tKVdWZrviE= +cloud.google.com/go/apigeeregistry v0.8.2/go.mod h1:h4v11TDGdeXJDJvImtgK2AFVvMIgGWjSb0HRnBSjcX8= +cloud.google.com/go/appengine v1.8.4 h1:Qub3fqR7iA1daJWdzjp/Q0Jz0fUG0JbMc7Ui4E9IX/E= +cloud.google.com/go/appengine v1.8.4/go.mod h1:TZ24v+wXBujtkK77CXCpjZbnuTvsFNT41MUaZ28D6vg= +cloud.google.com/go/area120 v0.8.4 h1:YnSO8m02pOIo6AEOgiOoUDVbw4pf+bg2KLHi4rky320= +cloud.google.com/go/area120 v0.8.4/go.mod h1:jfawXjxf29wyBXr48+W+GyX/f8fflxp642D/bb9v68M= +cloud.google.com/go/artifactregistry v1.14.6 h1:/hQaadYytMdA5zBh+RciIrXZQBWK4vN7EUsrQHG+/t8= +cloud.google.com/go/artifactregistry v1.14.6/go.mod h1:np9LSFotNWHcjnOgh8UVK0RFPCTUGbO0ve3384xyHfE= +cloud.google.com/go/asset v1.15.3 h1:uI8Bdm81s0esVWbWrTHcjFDFKNOa9aB7rI1vud1hO84= +cloud.google.com/go/asset v1.15.3/go.mod h1:yYLfUD4wL4X589A9tYrv4rFrba0QlDeag0CMcM5ggXU= +cloud.google.com/go/assuredworkloads v1.11.4 h1:FsLSkmYYeNuzDm8L4YPfLWV+lQaUrJmH5OuD37t1k20= +cloud.google.com/go/assuredworkloads v1.11.4/go.mod h1:4pwwGNwy1RP0m+y12ef3Q/8PaiWrIDQ6nD2E8kvWI9U= +cloud.google.com/go/automl v1.13.4 h1:i9tOKXX+1gE7+rHpWKjiuPfGBVIYoWvLNIGpWgPtF58= +cloud.google.com/go/automl v1.13.4/go.mod h1:ULqwX/OLZ4hBVfKQaMtxMSTlPx0GqGbWN8uA/1EqCP8= +cloud.google.com/go/baremetalsolution v1.2.3 h1:oQiFYYCe0vwp7J8ZmF6siVKEumWtiPFJMJcGuyDVRUk= +cloud.google.com/go/baremetalsolution v1.2.3/go.mod h1:/UAQ5xG3faDdy180rCUv47e0jvpp3BFxT+Cl0PFjw5g= +cloud.google.com/go/batch v1.6.3 h1:mPiIH20a5NU02rucbAmLeO4sLPO9hrTK0BLjdHyW8xw= +cloud.google.com/go/batch v1.6.3/go.mod h1:J64gD4vsNSA2O5TtDB5AAux3nJ9iV8U3ilg3JDBYejU= +cloud.google.com/go/beyondcorp v1.0.3 h1:VXf9SnrnSmj2BF2cHkoTHvOUp8gjsz1KJFOMW7czdsY= +cloud.google.com/go/beyondcorp v1.0.3/go.mod h1:HcBvnEd7eYr+HGDd5ZbuVmBYX019C6CEXBonXbCVwJo= +cloud.google.com/go/bigquery v1.57.1 h1:FiULdbbzUxWD0Y4ZGPSVCDLvqRSyCIO6zKV7E2nf5uA= +cloud.google.com/go/bigquery v1.57.1/go.mod h1:iYzC0tGVWt1jqSzBHqCr3lrRn0u13E8e+AqowBsDgug= +cloud.google.com/go/billing v1.17.4 h1:77/4kCqzH6Ou5CCDzNmqmboE+WvbwFBJmw1QZQz19AI= +cloud.google.com/go/billing v1.17.4/go.mod h1:5DOYQStCxquGprqfuid/7haD7th74kyMBHkjO/OvDtk= +cloud.google.com/go/binaryauthorization v1.7.3 h1:3R6WYn1JKIaVicBmo18jXubu7xh4mMkmbIgsTXk0cBA= +cloud.google.com/go/binaryauthorization v1.7.3/go.mod h1:VQ/nUGRKhrStlGr+8GMS8f6/vznYLkdK5vaKfdCIpvU= +cloud.google.com/go/certificatemanager v1.7.4 h1:5YMQ3Q+dqGpwUZ9X5sipsOQ1fLPsxod9HNq0+nrqc6I= +cloud.google.com/go/certificatemanager v1.7.4/go.mod h1:FHAylPe/6IIKuaRmHbjbdLhGhVQ+CWHSD5Jq0k4+cCE= +cloud.google.com/go/channel v1.17.3 h1:Rd4+fBrjiN6tZ4TR8R/38elkyEkz6oogGDr7jDyjmMY= +cloud.google.com/go/channel v1.17.3/go.mod h1:QcEBuZLGGrUMm7kNj9IbU1ZfmJq2apotsV83hbxX7eE= +cloud.google.com/go/cloudbuild v1.15.0 h1:9IHfEMWdCklJ1cwouoiQrnxmP0q3pH7JUt8Hqx4Qbck= +cloud.google.com/go/cloudbuild v1.15.0/go.mod h1:eIXYWmRt3UtggLnFGx4JvXcMj4kShhVzGndL1LwleEM= +cloud.google.com/go/clouddms v1.7.3 h1:xe/wJKz55VO1+L891a1EG9lVUgfHr9Ju/I3xh1nwF84= +cloud.google.com/go/clouddms v1.7.3/go.mod h1:fkN2HQQNUYInAU3NQ3vRLkV2iWs8lIdmBKOx4nrL6Hc= +cloud.google.com/go/cloudtasks v1.12.4 h1:5xXuFfAjg0Z5Wb81j2GAbB3e0bwroCeSF+5jBn/L650= +cloud.google.com/go/cloudtasks v1.12.4/go.mod h1:BEPu0Gtt2dU6FxZHNqqNdGqIG86qyWKBPGnsb7udGY0= +cloud.google.com/go/contactcenterinsights v1.12.0 h1:wP41IUA4ucMVooj/TP53jd7vbNjWrDkAPOeulVJGT5U= +cloud.google.com/go/contactcenterinsights v1.12.0/go.mod h1:HHX5wrz5LHVAwfI2smIotQG9x8Qd6gYilaHcLLLmNis= +cloud.google.com/go/container v1.28.0 h1:/o82CFWXIYnT9p/07SnRgybqL3Pmmu86jYIlzlJVUBY= +cloud.google.com/go/container v1.28.0/go.mod h1:b1A1gJeTBXVLQ6GGw9/9M4FG94BEGsqJ5+t4d/3N7O4= +cloud.google.com/go/containeranalysis v0.11.3 h1:5rhYLX+3a01drpREqBZVXR9YmWH45RnML++8NsCtuD8= +cloud.google.com/go/containeranalysis v0.11.3/go.mod h1:kMeST7yWFQMGjiG9K7Eov+fPNQcGhb8mXj/UcTiWw9U= +cloud.google.com/go/datacatalog v1.19.0 h1:rbYNmHwvAOOwnW2FPXYkaK3Mf1MmGqRzK0mMiIEyLdo= +cloud.google.com/go/datacatalog v1.19.0/go.mod h1:5FR6ZIF8RZrtml0VUao22FxhdjkoG+a0866rEnObryM= +cloud.google.com/go/dataflow v0.9.4 h1:7VmCNWcPJBS/srN2QnStTB6nu4Eb5TMcpkmtaPVhRt4= +cloud.google.com/go/dataflow v0.9.4/go.mod h1:4G8vAkHYCSzU8b/kmsoR2lWyHJD85oMJPHMtan40K8w= +cloud.google.com/go/dataform v0.9.1 h1:jV+EsDamGX6cE127+QAcCR/lergVeeZdEQ6DdrxW3sQ= +cloud.google.com/go/dataform v0.9.1/go.mod h1:pWTg+zGQ7i16pyn0bS1ruqIE91SdL2FDMvEYu/8oQxs= +cloud.google.com/go/datafusion v1.7.4 h1:Q90alBEYlMi66zL5gMSGQHfbZLB55mOAg03DhwTTfsk= +cloud.google.com/go/datafusion v1.7.4/go.mod h1:BBs78WTOLYkT4GVZIXQCZT3GFpkpDN4aBY4NDX/jVlM= +cloud.google.com/go/datalabeling v0.8.4 h1:zrq4uMmunf2KFDl/7dS6iCDBBAxBnKVDyw6+ajz3yu0= +cloud.google.com/go/datalabeling v0.8.4/go.mod h1:Z1z3E6LHtffBGrNUkKwbwbDxTiXEApLzIgmymj8A3S8= +cloud.google.com/go/dataplex v1.11.2 h1:AfFFR15Ifh4U+Me1IBztrSd5CrasTODzy3x8KtDyHdc= +cloud.google.com/go/dataplex v1.11.2/go.mod h1:mHJYQQ2VEJHsyoC0OdNyy988DvEbPhqFs5OOLffLX0c= +cloud.google.com/go/dataproc/v2 v2.3.0 h1:tTVP9tTxmc8fixxOd/8s6Q6Pz/+yzn7r7XdZHretQH0= +cloud.google.com/go/dataproc/v2 v2.3.0/go.mod h1:G5R6GBc9r36SXv/RtZIVfB8SipI+xVn0bX5SxUzVYbY= +cloud.google.com/go/dataqna v0.8.4 h1:NJnu1kAPamZDs/if3bJ3+Wb6tjADHKL83NUWsaIp2zg= +cloud.google.com/go/dataqna v0.8.4/go.mod h1:mySRKjKg5Lz784P6sCov3p1QD+RZQONRMRjzGNcFd0c= +cloud.google.com/go/datastore v1.15.0 h1:0P9WcsQeTWjuD1H14JIY7XQscIPQ4Laje8ti96IC5vg= +cloud.google.com/go/datastore v1.15.0/go.mod h1:GAeStMBIt9bPS7jMJA85kgkpsMkvseWWXiaHya9Jes8= +cloud.google.com/go/datastream v1.10.3 h1:Z2sKPIB7bT2kMW5Uhxy44ZgdJzxzE5uKjavoW+EuHEE= +cloud.google.com/go/datastream v1.10.3/go.mod h1:YR0USzgjhqA/Id0Ycu1VvZe8hEWwrkjuXrGbzeDOSEA= +cloud.google.com/go/deploy v1.15.0 h1:ZdmYzRMTGkVyP1nXEUat9FpbJGJemDcNcx82RSSOElc= +cloud.google.com/go/deploy v1.15.0/go.mod h1:e5XOUI5D+YGldyLNZ21wbp9S8otJbBE4i88PtO9x/2g= +cloud.google.com/go/dialogflow v1.44.3 h1:cK/f88KX+YVR4tLH4clMQlvrLWD2qmKJQziusjGPjmc= +cloud.google.com/go/dialogflow v1.44.3/go.mod h1:mHly4vU7cPXVweuB5R0zsYKPMzy240aQdAu06SqBbAQ= +cloud.google.com/go/dlp v1.11.1 h1:OFlXedmPP/5//X1hBEeq3D9kUVm9fb6ywYANlpv/EsQ= +cloud.google.com/go/dlp v1.11.1/go.mod h1:/PA2EnioBeXTL/0hInwgj0rfsQb3lpE3R8XUJxqUNKI= +cloud.google.com/go/documentai v1.23.5 h1:KAlzT+q8qvRxAmhsJUvLtfFHH0PNvz3M79H6CgVBKL8= +cloud.google.com/go/documentai v1.23.5/go.mod h1:ghzBsyVTiVdkfKaUCum/9bGBEyBjDO4GfooEcYKhN+g= +cloud.google.com/go/domains v0.9.4 h1:ua4GvsDztZ5F3xqjeLKVRDeOvJshf5QFgWGg1CKti3A= +cloud.google.com/go/domains v0.9.4/go.mod h1:27jmJGShuXYdUNjyDG0SodTfT5RwLi7xmH334Gvi3fY= +cloud.google.com/go/edgecontainer v1.1.4 h1:Szy3Q/N6bqgQGyxqjI+6xJZbmvPvnFHp3UZr95DKcQ0= +cloud.google.com/go/edgecontainer v1.1.4/go.mod h1:AvFdVuZuVGdgaE5YvlL1faAoa1ndRR/5XhXZvPBHbsE= +cloud.google.com/go/errorreporting v0.3.0 h1:kj1XEWMu8P0qlLhm3FwcaFsUvXChV/OraZwA70trRR0= +cloud.google.com/go/errorreporting v0.3.0/go.mod h1:xsP2yaAp+OAW4OIm60An2bbLpqIhKXdWR/tawvl7QzU= +cloud.google.com/go/essentialcontacts v1.6.5 h1:S2if6wkjR4JCEAfDtIiYtD+sTz/oXjh2NUG4cgT1y/Q= +cloud.google.com/go/essentialcontacts v1.6.5/go.mod h1:jjYbPzw0x+yglXC890l6ECJWdYeZ5dlYACTFL0U/VuM= +cloud.google.com/go/eventarc v1.13.3 h1:+pFmO4eu4dOVipSaFBLkmqrRYG94Xl/TQZFOeohkuqU= +cloud.google.com/go/eventarc v1.13.3/go.mod h1:RWH10IAZIRcj1s/vClXkBgMHwh59ts7hSWcqD3kaclg= +cloud.google.com/go/filestore v1.8.0 h1:/+wUEGwk3x3Kxomi2cP5dsR8+SIXxo7M0THDjreFSYo= +cloud.google.com/go/filestore v1.8.0/go.mod h1:S5JCxIbFjeBhWMTfIYH2Jx24J6BqjwpkkPl+nBA5DlI= +cloud.google.com/go/firestore v1.14.0 h1:8aLcKnMPoldYU3YHgu4t2exrKhLQkqaXAGqT0ljrFVw= +cloud.google.com/go/firestore v1.14.0/go.mod h1:96MVaHLsEhbvkBEdZgfN+AS/GIkco1LRpH9Xp9YZfzQ= +cloud.google.com/go/functions v1.15.4 h1:ZjdiV3MyumRM6++1Ixu6N0VV9LAGlCX4AhW6Yjr1t+U= +cloud.google.com/go/functions v1.15.4/go.mod h1:CAsTc3VlRMVvx+XqXxKqVevguqJpnVip4DdonFsX28I= +cloud.google.com/go/gkebackup v1.3.4 h1:KhnOrr9A1tXYIYeXKqCKbCI8TL2ZNGiD3dm+d7BDUBg= +cloud.google.com/go/gkebackup v1.3.4/go.mod h1:gLVlbM8h/nHIs09ns1qx3q3eaXcGSELgNu1DWXYz1HI= +cloud.google.com/go/gkeconnect v0.8.4 h1:1JLpZl31YhQDQeJ98tK6QiwTpgHFYRJwpntggpQQWis= +cloud.google.com/go/gkeconnect v0.8.4/go.mod h1:84hZz4UMlDCKl8ifVW8layK4WHlMAFeq8vbzjU0yJkw= +cloud.google.com/go/gkehub v0.14.4 h1:J5tYUtb3r0cl2mM7+YHvV32eL+uZQ7lONyUZnPikCEo= +cloud.google.com/go/gkehub v0.14.4/go.mod h1:Xispfu2MqnnFt8rV/2/3o73SK1snL8s9dYJ9G2oQMfc= +cloud.google.com/go/gkemulticloud v1.0.3 h1:NmJsNX9uQ2CT78957xnjXZb26TDIMvv+d5W2vVUt0Pg= +cloud.google.com/go/gkemulticloud v1.0.3/go.mod h1:7NpJBN94U6DY1xHIbsDqB2+TFZUfjLUKLjUX8NGLor0= +cloud.google.com/go/gsuiteaddons v1.6.4 h1:uuw2Xd37yHftViSI8J2hUcCS8S7SH3ZWH09sUDLW30Q= +cloud.google.com/go/gsuiteaddons v1.6.4/go.mod h1:rxtstw7Fx22uLOXBpsvb9DUbC+fiXs7rF4U29KHM/pE= +cloud.google.com/go/iap v1.9.3 h1:M4vDbQ4TLXdaljXVZSwW7XtxpwXUUarY2lIs66m0aCM= +cloud.google.com/go/iap v1.9.3/go.mod h1:DTdutSZBqkkOm2HEOTBzhZxh2mwwxshfD/h3yofAiCw= +cloud.google.com/go/ids v1.4.4 h1:VuFqv2ctf/A7AyKlNxVvlHTzjrEvumWaZflUzBPz/M4= +cloud.google.com/go/ids v1.4.4/go.mod h1:z+WUc2eEl6S/1aZWzwtVNWoSZslgzPxAboS0lZX0HjI= +cloud.google.com/go/iot v1.7.4 h1:m1WljtkZnvLTIRYW1YTOv5A6H1yKgLHR6nU7O8yf27w= +cloud.google.com/go/iot v1.7.4/go.mod h1:3TWqDVvsddYBG++nHSZmluoCAVGr1hAcabbWZNKEZLk= +cloud.google.com/go/kms v1.15.5 h1:pj1sRfut2eRbD9pFRjNnPNg/CzJPuQAzUujMIM1vVeM= +cloud.google.com/go/kms v1.15.5/go.mod h1:cU2H5jnp6G2TDpUGZyqTCoy1n16fbubHZjmVXSMtwDI= +cloud.google.com/go/language v1.12.2 h1:zg9uq2yS9PGIOdc0Kz/l+zMtOlxKWonZjjo5w5YPG2A= +cloud.google.com/go/language v1.12.2/go.mod h1:9idWapzr/JKXBBQ4lWqVX/hcadxB194ry20m/bTrhWc= +cloud.google.com/go/lifesciences v0.9.4 h1:rZEI/UxcxVKEzyoRS/kdJ1VoolNItRWjNN0Uk9tfexg= +cloud.google.com/go/lifesciences v0.9.4/go.mod h1:bhm64duKhMi7s9jR9WYJYvjAFJwRqNj+Nia7hF0Z7JA= +cloud.google.com/go/logging v1.8.1 h1:26skQWPeYhvIasWKm48+Eq7oUqdcdbwsCVwz5Ys0FvU= +cloud.google.com/go/logging v1.8.1/go.mod h1:TJjR+SimHwuC8MZ9cjByQulAMgni+RkXeI3wwctHJEI= +cloud.google.com/go/longrunning v0.5.4 h1:w8xEcbZodnA2BbW6sVirkkoC+1gP8wS57EUUgGS0GVg= +cloud.google.com/go/longrunning v0.5.4/go.mod h1:zqNVncI0BOP8ST6XQD1+VcvuShMmq7+xFSzOL++V0dI= +cloud.google.com/go/managedidentities v1.6.4 h1:SF/u1IJduMqQQdJA4MDyivlIQ4SrV5qAawkr/ZEREkY= +cloud.google.com/go/managedidentities v1.6.4/go.mod h1:WgyaECfHmF00t/1Uk8Oun3CQ2PGUtjc3e9Alh79wyiM= +cloud.google.com/go/maps v1.6.1 h1:2+eMp/1MvMPp5qrSOd3vtnLKa/pylt+krVRqET3jWsM= +cloud.google.com/go/maps v1.6.1/go.mod h1:4+buOHhYXFBp58Zj/K+Lc1rCmJssxxF4pJ5CJnhdz18= +cloud.google.com/go/mediatranslation v0.8.4 h1:VRCQfZB4s6jN0CSy7+cO3m4ewNwgVnaePanVCQh/9Z4= +cloud.google.com/go/mediatranslation v0.8.4/go.mod h1:9WstgtNVAdN53m6TQa5GjIjLqKQPXe74hwSCxUP6nj4= +cloud.google.com/go/memcache v1.10.4 h1:cdex/ayDd294XBj2cGeMe6Y+H1JvhN8y78B9UW7pxuQ= +cloud.google.com/go/memcache v1.10.4/go.mod h1:v/d8PuC8d1gD6Yn5+I3INzLR01IDn0N4Ym56RgikSI0= +cloud.google.com/go/metastore v1.13.3 h1:94l/Yxg9oBZjin2bzI79oK05feYefieDq0o5fjLSkC8= +cloud.google.com/go/metastore v1.13.3/go.mod h1:K+wdjXdtkdk7AQg4+sXS8bRrQa9gcOr+foOMF2tqINE= +cloud.google.com/go/monitoring v1.16.3 h1:mf2SN9qSoBtIgiMA4R/y4VADPWZA7VCNJA079qLaZQ8= +cloud.google.com/go/monitoring v1.16.3/go.mod h1:KwSsX5+8PnXv5NJnICZzW2R8pWTis8ypC4zmdRD63Tw= +cloud.google.com/go/networkconnectivity v1.14.3 h1:e9lUkCe2BexsqsUc2bjV8+gFBpQa54J+/F3qKVtW+wA= +cloud.google.com/go/networkconnectivity v1.14.3/go.mod h1:4aoeFdrJpYEXNvrnfyD5kIzs8YtHg945Og4koAjHQek= +cloud.google.com/go/networkmanagement v1.9.3 h1:HsQk4FNKJUX04k3OI6gUsoveiHMGvDRqlaFM2xGyvqU= +cloud.google.com/go/networkmanagement v1.9.3/go.mod h1:y7WMO1bRLaP5h3Obm4tey+NquUvB93Co1oh4wpL+XcU= +cloud.google.com/go/networksecurity v0.9.4 h1:947tNIPnj1bMGTIEBo3fc4QrrFKS5hh0bFVsHmFm4Vo= +cloud.google.com/go/networksecurity v0.9.4/go.mod h1:E9CeMZ2zDsNBkr8axKSYm8XyTqNhiCHf1JO/Vb8mD1w= +cloud.google.com/go/notebooks v1.11.2 h1:eTOTfNL1yM6L/PCtquJwjWg7ZZGR0URFaFgbs8kllbM= +cloud.google.com/go/notebooks v1.11.2/go.mod h1:z0tlHI/lREXC8BS2mIsUeR3agM1AkgLiS+Isov3SS70= +cloud.google.com/go/optimization v1.6.2 h1:iFsoexcp13cGT3k/Hv8PA5aK+FP7FnbhwDO9llnruas= +cloud.google.com/go/optimization v1.6.2/go.mod h1:mWNZ7B9/EyMCcwNl1frUGEuY6CPijSkz88Fz2vwKPOY= +cloud.google.com/go/orchestration v1.8.4 h1:kgwZ2f6qMMYIVBtUGGoU8yjYWwMTHDanLwM/CQCFaoQ= +cloud.google.com/go/orchestration v1.8.4/go.mod h1:d0lywZSVYtIoSZXb0iFjv9SaL13PGyVOKDxqGxEf/qI= +cloud.google.com/go/orgpolicy v1.11.4 h1:RWuXQDr9GDYhjmrredQJC7aY7cbyqP9ZuLbq5GJGves= +cloud.google.com/go/orgpolicy v1.11.4/go.mod h1:0+aNV/nrfoTQ4Mytv+Aw+stBDBjNf4d8fYRA9herfJI= +cloud.google.com/go/osconfig v1.12.4 h1:OrRCIYEAbrbXdhm13/JINn9pQchvTTIzgmOCA7uJw8I= +cloud.google.com/go/osconfig v1.12.4/go.mod h1:B1qEwJ/jzqSRslvdOCI8Kdnp0gSng0xW4LOnIebQomA= +cloud.google.com/go/oslogin v1.12.2 h1:NP/KgsD9+0r9hmHC5wKye0vJXVwdciv219DtYKYjgqE= +cloud.google.com/go/oslogin v1.12.2/go.mod h1:CQ3V8Jvw4Qo4WRhNPF0o+HAM4DiLuE27Ul9CX9g2QdY= +cloud.google.com/go/phishingprotection v0.8.4 h1:sPLUQkHq6b4AL0czSJZ0jd6vL55GSTHz2B3Md+TCZI0= +cloud.google.com/go/phishingprotection v0.8.4/go.mod h1:6b3kNPAc2AQ6jZfFHioZKg9MQNybDg4ixFd4RPZZ2nE= +cloud.google.com/go/policytroubleshooter v1.10.2 h1:sq+ScLP83d7GJy9+wpwYJVnY+q6xNTXwOdRIuYjvHT4= +cloud.google.com/go/policytroubleshooter v1.10.2/go.mod h1:m4uF3f6LseVEnMV6nknlN2vYGRb+75ylQwJdnOXfnv0= +cloud.google.com/go/privatecatalog v0.9.4 h1:Vo10IpWKbNvc/z/QZPVXgCiwfjpWoZ/wbgful4Uh/4E= +cloud.google.com/go/privatecatalog v0.9.4/go.mod h1:SOjm93f+5hp/U3PqMZAHTtBtluqLygrDrVO8X8tYtG0= +cloud.google.com/go/pubsub v1.33.0 h1:6SPCPvWav64tj0sVX/+npCBKhUi/UjJehy9op/V3p2g= +cloud.google.com/go/pubsub v1.33.0/go.mod h1:f+w71I33OMyxf9VpMVcZbnG5KSUkCOUHYpFd5U1GdRc= +cloud.google.com/go/pubsublite v1.8.1 h1:pX+idpWMIH30/K7c0epN6V703xpIcMXWRjKJsz0tYGY= +cloud.google.com/go/pubsublite v1.8.1/go.mod h1:fOLdU4f5xldK4RGJrBMm+J7zMWNj/k4PxwEZXy39QS0= +cloud.google.com/go/recaptchaenterprise/v2 v2.8.4 h1:KOlLHLv3h3HwcZAkx91ubM3Oztz3JtT3ZacAJhWDorQ= +cloud.google.com/go/recaptchaenterprise/v2 v2.8.4/go.mod h1:Dak54rw6lC2gBY8FBznpOCAR58wKf+R+ZSJRoeJok4w= +cloud.google.com/go/recommendationengine v0.8.4 h1:JRiwe4hvu3auuh2hujiTc2qNgPPfVp+Q8KOpsXlEzKQ= +cloud.google.com/go/recommendationengine v0.8.4/go.mod h1:GEteCf1PATl5v5ZsQ60sTClUE0phbWmo3rQ1Js8louU= +cloud.google.com/go/recommender v1.11.3 h1:VndmgyS/J3+izR8V8BHa7HV/uun8//ivQ3k5eVKKyyM= +cloud.google.com/go/recommender v1.11.3/go.mod h1:+FJosKKJSId1MBFeJ/TTyoGQZiEelQQIZMKYYD8ruK4= +cloud.google.com/go/redis v1.14.1 h1:J9cEHxG9YLmA9o4jTSvWt/RuVEn6MTrPlYSCRHujxDQ= +cloud.google.com/go/redis v1.14.1/go.mod h1:MbmBxN8bEnQI4doZPC1BzADU4HGocHBk2de3SbgOkqs= +cloud.google.com/go/resourcemanager v1.9.4 h1:JwZ7Ggle54XQ/FVYSBrMLOQIKoIT/uer8mmNvNLK51k= +cloud.google.com/go/resourcemanager v1.9.4/go.mod h1:N1dhP9RFvo3lUfwtfLWVxfUWq8+KUQ+XLlHLH3BoFJ0= +cloud.google.com/go/resourcesettings v1.6.4 h1:yTIL2CsZswmMfFyx2Ic77oLVzfBFoWBYgpkgiSPnC4Y= +cloud.google.com/go/resourcesettings v1.6.4/go.mod h1:pYTTkWdv2lmQcjsthbZLNBP4QW140cs7wqA3DuqErVI= +cloud.google.com/go/retail v1.14.4 h1:geqdX1FNqqL2p0ADXjPpw8lq986iv5GrVcieTYafuJQ= +cloud.google.com/go/retail v1.14.4/go.mod h1:l/N7cMtY78yRnJqp5JW8emy7MB1nz8E4t2yfOmklYfg= +cloud.google.com/go/run v1.3.3 h1:qdfZteAm+vgzN1iXzILo3nJFQbzziudkJrvd9wCf3FQ= +cloud.google.com/go/run v1.3.3/go.mod h1:WSM5pGyJ7cfYyYbONVQBN4buz42zFqwG67Q3ch07iK4= +cloud.google.com/go/scheduler v1.10.5 h1:eMEettHlFhG5pXsoHouIM5nRT+k+zU4+GUvRtnxhuVI= +cloud.google.com/go/scheduler v1.10.5/go.mod h1:MTuXcrJC9tqOHhixdbHDFSIuh7xZF2IysiINDuiq6NI= +cloud.google.com/go/secretmanager v1.11.4 h1:krnX9qpG2kR2fJ+u+uNyNo+ACVhplIAS4Pu7u+4gd+k= +cloud.google.com/go/secretmanager v1.11.4/go.mod h1:wreJlbS9Zdq21lMzWmJ0XhWW2ZxgPeahsqeV/vZoJ3w= +cloud.google.com/go/security v1.15.4 h1:sdnh4Islb1ljaNhpIXlIPgb3eYj70QWgPVDKOUYvzJc= +cloud.google.com/go/security v1.15.4/go.mod h1:oN7C2uIZKhxCLiAAijKUCuHLZbIt/ghYEo8MqwD/Ty4= +cloud.google.com/go/securitycenter v1.24.2 h1:qCEyXoJoxNKKA1bDywBjjqCB7ODXazzHnVWnG5Uqd1M= +cloud.google.com/go/securitycenter v1.24.2/go.mod h1:l1XejOngggzqwr4Fa2Cn+iWZGf+aBLTXtB/vXjy5vXM= +cloud.google.com/go/servicedirectory v1.11.3 h1:5niCMfkw+jifmFtbBrtRedbXkJm3fubSR/KHbxSJZVM= +cloud.google.com/go/servicedirectory v1.11.3/go.mod h1:LV+cHkomRLr67YoQy3Xq2tUXBGOs5z5bPofdq7qtiAw= +cloud.google.com/go/shell v1.7.4 h1:nurhlJcSVFZneoRZgkBEHumTYf/kFJptCK2eBUq/88M= +cloud.google.com/go/shell v1.7.4/go.mod h1:yLeXB8eKLxw0dpEmXQ/FjriYrBijNsONpwnWsdPqlKM= +cloud.google.com/go/spanner v1.53.0 h1:/NzWQJ1MEhdRcffiutRKbW/AIGVKhcTeivWTDjEyCCo= +cloud.google.com/go/spanner v1.53.0/go.mod h1:liG4iCeLqm5L3fFLU5whFITqP0e0orsAW1uUSrd4rws= +cloud.google.com/go/speech v1.21.0 h1:qkxNao58oF8ghAHE1Eghen7XepawYEN5zuZXYWaUTA4= +cloud.google.com/go/speech v1.21.0/go.mod h1:wwolycgONvfz2EDU8rKuHRW3+wc9ILPsAWoikBEWavY= +cloud.google.com/go/storagetransfer v1.10.3 h1:YM1dnj5gLjfL6aDldO2s4GeU8JoAvH1xyIwXre63KmI= +cloud.google.com/go/storagetransfer v1.10.3/go.mod h1:Up8LY2p6X68SZ+WToswpQbQHnJpOty/ACcMafuey8gc= +cloud.google.com/go/talent v1.6.5 h1:LnRJhhYkODDBoTwf6BeYkiJHFw9k+1mAFNyArwZUZAs= +cloud.google.com/go/talent v1.6.5/go.mod h1:Mf5cma696HmE+P2BWJ/ZwYqeJXEeU0UqjHFXVLadEDI= +cloud.google.com/go/texttospeech v1.7.4 h1:ahrzTgr7uAbvebuhkBAAVU6kRwVD0HWsmDsvMhtad5Q= +cloud.google.com/go/texttospeech v1.7.4/go.mod h1:vgv0002WvR4liGuSd5BJbWy4nDn5Ozco0uJymY5+U74= +cloud.google.com/go/tpu v1.6.4 h1:XIEH5c0WeYGaVy9H+UueiTaf3NI6XNdB4/v6TFQJxtE= +cloud.google.com/go/tpu v1.6.4/go.mod h1:NAm9q3Rq2wIlGnOhpYICNI7+bpBebMJbh0yyp3aNw1Y= +cloud.google.com/go/trace v1.10.4 h1:2qOAuAzNezwW3QN+t41BtkDJOG42HywL73q8x/f6fnM= +cloud.google.com/go/trace v1.10.4/go.mod h1:Nso99EDIK8Mj5/zmB+iGr9dosS/bzWCJ8wGmE6TXNWY= +cloud.google.com/go/translate v1.9.3 h1:t5WXTqlrk8VVJu/i3WrYQACjzYJiff5szARHiyqqPzI= +cloud.google.com/go/translate v1.9.3/go.mod h1:Kbq9RggWsbqZ9W5YpM94Q1Xv4dshw/gr/SHfsl5yCZ0= +cloud.google.com/go/video v1.20.3 h1:Xrpbm2S9UFQ1pZEeJt9Vqm5t2T/z9y/M3rNXhFoo8Is= +cloud.google.com/go/video v1.20.3/go.mod h1:TnH/mNZKVHeNtpamsSPygSR0iHtvrR/cW1/GDjN5+GU= +cloud.google.com/go/videointelligence v1.11.4 h1:YS4j7lY0zxYyneTFXjBJUj2r4CFe/UoIi/PJG0Zt/Rg= +cloud.google.com/go/videointelligence v1.11.4/go.mod h1:kPBMAYsTPFiQxMLmmjpcZUMklJp3nC9+ipJJtprccD8= +cloud.google.com/go/vision/v2 v2.7.5 h1:T/ujUghvEaTb+YnFY/jiYwVAkMbIC8EieK0CJo6B4vg= +cloud.google.com/go/vision/v2 v2.7.5/go.mod h1:GcviprJLFfK9OLf0z8Gm6lQb6ZFUulvpZws+mm6yPLM= +cloud.google.com/go/vmmigration v1.7.4 h1:qPNdab4aGgtaRX+51jCOtJxlJp6P26qua4o1xxUDjpc= +cloud.google.com/go/vmmigration v1.7.4/go.mod h1:yBXCmiLaB99hEl/G9ZooNx2GyzgsjKnw5fWcINRgD70= +cloud.google.com/go/vmwareengine v1.0.3 h1:WY526PqM6QNmFHSqe2sRfK6gRpzWjmL98UFkql2+JDM= +cloud.google.com/go/vmwareengine v1.0.3/go.mod h1:QSpdZ1stlbfKtyt6Iu19M6XRxjmXO+vb5a/R6Fvy2y4= +cloud.google.com/go/vpcaccess v1.7.4 h1:zbs3V+9ux45KYq8lxxn/wgXole6SlBHHKKyZhNJoS+8= +cloud.google.com/go/vpcaccess v1.7.4/go.mod h1:lA0KTvhtEOb/VOdnH/gwPuOzGgM+CWsmGu6bb4IoMKk= +cloud.google.com/go/webrisk v1.9.4 h1:iceR3k0BCRZgf2D/NiKviVMFfuNC9LmeNLtxUFRB/wI= +cloud.google.com/go/webrisk v1.9.4/go.mod h1:w7m4Ib4C+OseSr2GL66m0zMBywdrVNTDKsdEsfMl7X0= +cloud.google.com/go/websecurityscanner v1.6.4 h1:5Gp7h5j7jywxLUp6NTpjNPkgZb3ngl0tUSw6ICWvtJQ= +cloud.google.com/go/websecurityscanner v1.6.4/go.mod h1:mUiyMQ+dGpPPRkHgknIZeCzSHJ45+fY4F52nZFDHm2o= +cloud.google.com/go/workflows v1.12.3 h1:qocsqETmLAl34mSa01hKZjcqAvt699gaoFbooGGMvaM= +cloud.google.com/go/workflows v1.12.3/go.mod h1:fmOUeeqEwPzIU81foMjTRQIdwQHADi/vEr1cx9R1m5g= +contrib.go.opencensus.io/exporter/aws v0.0.0-20230502192102-15967c811cec h1:CSNP8nIEQt4sZEo2sGUiWSmVJ9c5QdyIQvwzZAsn+8Y= +contrib.go.opencensus.io/exporter/aws v0.0.0-20230502192102-15967c811cec/go.mod h1:uu1P0UCM/6RbsMrgPa98ll8ZcHM858i/AD06a9aLRCA= +contrib.go.opencensus.io/exporter/stackdriver v0.13.14 h1:zBakwHardp9Jcb8sQHcHpXy/0+JIb1M8KjigCJzx7+4= +contrib.go.opencensus.io/exporter/stackdriver v0.13.14/go.mod h1:5pSSGY0Bhuk7waTHuDf4aQ8D2DrhgETRo9fy6k3Xlzc= +contrib.go.opencensus.io/integrations/ocsql v0.1.7 h1:G3k7C0/W44zcqkpRSFyjU9f6HZkbwIrL//qqnlqWZ60= +dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9 h1:VpgP7xuJadIUuKccphEpTJnWhS2jkQyMt6Y7pJCD7fY= +gioui.org v0.0.0-20210308172011-57750fc8a0a6 h1:K72hopUosKG3ntOPNG4OzzbuhxGuVf06fa2la1/H/Ho= +github.com/AndreasBriese/bbloom v0.0.0-20190306092124-e2d15f34fcf9 h1:HD8gA2tkByhMAwYaFAX9w2l7vxvBQ5NMoxDrkhqhtn4= +github.com/Azure/azure-amqp-common-go/v3 v3.2.3 h1:uDF62mbd9bypXWi19V1bN5NZEO84JqgmI5G73ibAmrk= +github.com/Azure/azure-amqp-common-go/v3 v3.2.3/go.mod h1:7rPmbSfszeovxGfc5fSAXE4ehlXQZHpMja2OtxC2Tas= +github.com/Azure/azure-pipeline-go v0.2.3 h1:7U9HBg1JFK3jHl5qmo4CTZKFTVgMwdFHMVtCdfBE21U= +github.com/Azure/azure-sdk-for-go/sdk/keyvault/azkeys v0.10.0 h1:m/sWOGCREuSBqg2htVQTBY8nOZpyajYztF0vUvSZTuM= +github.com/Azure/azure-sdk-for-go/sdk/keyvault/azkeys v0.10.0/go.mod h1:Pu5Zksi2KrU7LPbZbNINx6fuVrUp/ffvpxdDj+i8LeE= +github.com/Azure/azure-sdk-for-go/sdk/keyvault/internal v0.7.1 h1:FbH3BbSb4bvGluTesZZ+ttN/MDsnMmQP36OSnDuSXqw= +github.com/Azure/azure-sdk-for-go/sdk/keyvault/internal v0.7.1/go.mod h1:9V2j0jn9jDEkCkv8w/bKTNppX/d0FVA1ud77xCIP4KA= +github.com/Azure/azure-sdk-for-go/sdk/messaging/azservicebus v1.5.0 h1:HKHkea1fdm18LT8VAxTVZgJpPsLgv+0NZhmtus1UqJQ= +github.com/Azure/azure-sdk-for-go/sdk/messaging/azservicebus v1.5.0/go.mod h1:4BbKA+mRmmTP8VaLfDPNF5nOdhRm5upG3AXVWfv1dxc= +github.com/Azure/azure-service-bus-go v0.11.5 h1:EVMicXGNrSX+rHRCBgm/TRQ4VUZ1m3yAYM/AB2R/SOs= +github.com/Azure/azure-storage-blob-go v0.14.0 h1:1BCg74AmVdYwO3dlKwtFU1V0wU2PZdREkXvAmZJRUlM= +github.com/Azure/go-amqp v1.0.2 h1:zHCHId+kKC7fO8IkwyZJnWMvtRXhYC0VJtD0GYkHc6M= +github.com/Azure/go-amqp v1.0.2/go.mod h1:vZAogwdrkbyK3Mla8m/CxSc/aKdnTZ4IbPxl51Y5WZE= +github.com/Azure/go-autorest/autorest v0.11.22 h1:bXiQwDjrRmBQOE67bwlvUKAC1EU1yZTPQ38c+bstZws= +github.com/Azure/go-autorest/autorest/adal v0.9.17 h1:esOPl2dhcz9P3jqBSJ8tPGEj2EqzPPT6zfyuloiogKY= +github.com/Azure/go-autorest/autorest/azure/auth v0.5.9 h1:Y2CgdzitFDsdMwYMzf9LIZWrrTFysqbRc7b94XVVJ78= +github.com/Azure/go-autorest/autorest/azure/cli v0.4.2 h1:dMOmEJfkLKW/7JsokJqkyoYSgmR08hi9KrhjZb+JALY= +github.com/Azure/go-autorest/autorest/date v0.3.0 h1:7gUk1U5M/CQbp9WoqinNzJar+8KY+LPI6wiWrP/myHw= +github.com/Azure/go-autorest/autorest/mocks v0.4.1 h1:K0laFcLE6VLTOwNgSxaGbUcLPuGXlNkbVvq4cW4nIHk= +github.com/Azure/go-autorest/autorest/validation v0.3.1 h1:AgyqjAd94fwNAoTjl/WQXg4VvFeRFpO+UhNyRXqF1ac= +github.com/Azure/go-autorest/logger v0.2.1 h1:IG7i4p/mDa2Ce4TRyAO8IHnVhAVF3RFU+ZtXWSmf4Tg= +github.com/Azure/go-autorest/tracing v0.6.0 h1:TYi4+3m5t6K48TGI9AUdb+IzbnSxvnvUMfuitfgcfuo= +github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802 h1:1BDTz0u9nC3//pOCMdNH+CiXJVYJh5UQNCOBG7jbELc= +github.com/CloudyKit/fastprinter v0.0.0-20200109182630-33d98a066a53 h1:sR+/8Yb4slttB4vD+b9btVEnWgL3Q00OBTzVT8B9C0c= +github.com/CloudyKit/jet v2.1.3-0.20180809161101-62edd43e4f88+incompatible h1:rZgFj+Gtf3NMi/U5FvCvhzaxzW/TaPYgUYx3bAPz9DE= +github.com/CloudyKit/jet/v3 v3.0.0 h1:1PwO5w5VCtlUUl+KTOBsTGZlhjWkcybsGaAau52tOy8= +github.com/CloudyKit/jet/v6 v6.1.0 h1:hvO96X345XagdH1fAoBjpBYG4a1ghhL/QzalkduPuXk= +github.com/CloudyKit/jet/v6 v6.1.0/go.mod h1:d3ypHeIRNo2+XyqnGA8s+aphtcVpjP5hPwP/Lzo7Ro4= +github.com/GoogleCloudPlatform/cloudsql-proxy v1.33.14 h1:9bRF9/edlX1kycHVm/icATaIWfVyHcUB9c68iWWeNok= +github.com/GoogleCloudPlatform/cloudsql-proxy v1.33.14/go.mod h1:vroGijye9h4A6kMWeCtk9/zIh5ebseV/JmbKJ0VL3w8= +github.com/HdrHistogram/hdrhistogram-go v1.1.2 h1:5IcZpTvzydCQeHzK4Ef/D5rrSqwxob0t8PQPMybUNFM= +github.com/HdrHistogram/hdrhistogram-go v1.1.2/go.mod h1:yDgFjdqOqDEKOvasDdhWNXYg9BVp4O+o5f6V/ehm6Oo= +github.com/Joker/hpp v1.0.0 h1:65+iuJYdRXv/XyN62C1uEmmOx3432rNG/rKlX6V7Kkc= +github.com/Joker/jade v1.0.1-0.20190614124447-d475f43051e7 h1:mreN1m/5VJ/Zc3b4pzj9qU6D9SRQ6Vm+3KfI328t3S8= +github.com/OneOfOne/xxhash v1.2.2 h1:KMrpdQIwFcEqXDklaen+P1axHaj9BSKzvpUUfnHldSE= +github.com/Shopify/goreferrer v0.0.0-20220729165902-8cddb4f5de06 h1:KkH3I3sJuOLP3TjA/dfr4NAY8bghDwnXiU7cTKxQqo0= +github.com/Shopify/goreferrer v0.0.0-20220729165902-8cddb4f5de06/go.mod h1:7erjKLwalezA0k99cWs5L11HWOAPNjdUZ6RxH1BXbbM= +github.com/ajg/form v1.5.1 h1:t9c7v8JUKu/XxOGBU0yjNpaMloxGEJhUkqFRq0ibGeU= +github.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af h1:wVe6/Ea46ZMeNkQjjBW6xcqyQA/j5e0D6GytH95g0gQ= +github.com/alecthomas/jsonschema v0.0.0-20220216202328-9eeeec9d044b h1:doCpXjVwui6HUN+xgNsNS3SZ0/jUZ68Eb+mJRNOZfog= +github.com/alecthomas/jsonschema v0.0.0-20220216202328-9eeeec9d044b/go.mod h1:/n6+1/DWPltRLWL/VKyUxg6tzsl5kHUCcraimt4vr60= +github.com/alecthomas/kingpin/v2 v2.3.2 h1:H0aULhgmSzN8xQ3nX1uxtdlTHYoPLu5AhHxWrKI6ocU= +github.com/alecthomas/kingpin/v2 v2.3.2/go.mod h1:0gyi0zQnjuFk8xrkNKamJoyUo382HRL7ATRpFZCw6tE= +github.com/alecthomas/units v0.0.0-20211218093645-b94a6e3cc137 h1:s6gZFSlWYmbqAuRjVTiNNhvNRfY2Wxp9nhfyel4rklc= +github.com/alecthomas/units v0.0.0-20211218093645-b94a6e3cc137/go.mod h1:OMCwj8VM1Kc9e19TLln2VL61YJF0x1XFtfdL4JdbSyE= +github.com/andybalholm/brotli v1.0.4 h1:V7DdXeJtZscaqfNuAdSRuRFzuiKlHSC/Zh3zl9qY3JY= +github.com/andybalholm/brotli v1.0.4/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= +github.com/antihax/optional v1.0.0 h1:xK2lYat7ZLaVVcIuj82J8kIro4V6kDe0AUDFboUCwcg= +github.com/araddon/dateparse v0.0.0-20210429162001-6b43995a97de h1:FxWPpzIjnTlhPwqqXc4/vE0f7GvRjuAsbW+HOIe8KnA= +github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6 h1:G1bPvciwNyF7IUmKXNt9Ak3m6u9DE1rF+RmtIkBpVdA= +github.com/armon/go-metrics v0.4.1 h1:hR91U9KYmb6bLBYLQjyM+3j+rcd/UhE+G78SFnF8gJA= +github.com/armon/go-metrics v0.4.1/go.mod h1:E6amYzXo6aW1tqzoZGT755KkbgrJsSdpwZ+3JqfkOG4= +github.com/aws/aws-sdk-go-v2/service/kms v1.26.3 h1:li5dFiK1tkAFXvOC9QPWAVWqTu8ZxpIR0KzKmof6TIE= +github.com/aws/aws-sdk-go-v2/service/kms v1.26.3/go.mod h1:N3++/sLV97B8Zliz7KRqNcojOX7iMBZWKiuit5FKtH0= +github.com/aws/aws-sdk-go-v2/service/secretsmanager v1.23.3 h1:NurfTBFmaehSiWMv5drydRWs3On0kwoBe1gWYFt+5ws= +github.com/aws/aws-sdk-go-v2/service/secretsmanager v1.23.3/go.mod h1:LDD9wCQ1tvjMIWEIFPvZ8JgJsEOjded+X5jav9tD/zg= +github.com/aws/aws-sdk-go-v2/service/sns v1.25.3 h1:6/Esm0BnUNrx+yy8AaslbaeJa8V40tTJ9N+tOihYWVo= +github.com/aws/aws-sdk-go-v2/service/sns v1.25.3/go.mod h1:GkPiLToDWySwNSsR4AVam/Sv8UAZuMlGe9dozvyRCPE= +github.com/aws/aws-sdk-go-v2/service/sqs v1.28.2 h1:MVg4eLi9uM1+YHYSfcCg1CR3mqtL6UJ9SF3VrMxKmUE= +github.com/aws/aws-sdk-go-v2/service/sqs v1.28.2/go.mod h1:7vHhhnzSGZcquR6+X7V+wDHdY8iOk5ge0z+FxoxkvJw= +github.com/aws/aws-sdk-go-v2/service/ssm v1.43.1 h1:QCZGFHZnzP0yRveI5X+5Cu54wdvpbgiuF3Qy3xBykyA= +github.com/aws/aws-sdk-go-v2/service/ssm v1.43.1/go.mod h1:Iw3+XCa7ARZWsPiV3Zozf5Hb3gD7pHDLKu9Xcc4iwDM= +github.com/aymerick/douceur v0.2.0 h1:Mv+mAeH1Q+n9Fr+oyamOlAkUNPWPlA8PPGR0QAaYuPk= +github.com/aymerick/douceur v0.2.0/go.mod h1:wlT5vV2O3h55X9m7iVYN0TBM0NH/MmbLnd30/FjWUq4= +github.com/aymerick/raymond v2.0.3-0.20180322193309-b565731e1464+incompatible h1:Ppm0npCCsmuR9oQaBtRuZcmILVE74aXE+AmrJj8L2ns= +github.com/boombuler/barcode v1.0.0 h1:s1TvRnXwL2xJRaccrdcBQMZxq6X7DvsMogtmJeHDdrc= +github.com/c2h5oh/datasize v0.0.0-20220606134207-859f65c6625b h1:6+ZFm0flnudZzdSE0JxlhR2hKnGPcNB35BjQf4RYQDY= +github.com/c2h5oh/datasize v0.0.0-20220606134207-859f65c6625b/go.mod h1:S/7n9copUssQ56c7aAgHqftWO4LTf4xY6CGWt8Bc+3M= +github.com/census-instrumentation/opencensus-proto v0.4.1 h1:iKLQ0xPNFxR/2hzXZMrBo8f1j86j5WHzznCCQxV/b8g= +github.com/census-instrumentation/opencensus-proto v0.4.1/go.mod h1:4T9NM4+4Vw91VeyqjLS6ao50K5bOcLKN6Q42XnYaRYw= +github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= +github.com/checkpoint-restore/go-criu/v5 v5.3.0 h1:wpFFOoomK3389ue2lAb0Boag6XPht5QYpipxmSNL4d8= +github.com/checkpoint-restore/go-criu/v5 v5.3.0/go.mod h1:E/eQpaFtUKGOOSEBZgmKAcn+zUUwWxqcaKZlF54wK8E= +github.com/cilium/ebpf v0.7.0 h1:1k/q3ATgxSXRdrmPfH8d7YK0GfqVsEKZAX9dQZvs56k= +github.com/cilium/ebpf v0.7.0/go.mod h1:/oI2+1shJiTGAMgl6/RgJr36Eo1jzrRcAWbcXO2usCA= +github.com/client9/misspell v0.3.4 h1:ta993UF76GwbvJcIo3Y68y/M3WxlpEHPWIGDkJYwzJI= +github.com/cncf/udpa/go v0.0.0-20220112060539-c52dc94e7fbe h1:QQ3GSy+MqSHxm/d8nCtnAiZdYFd45cYZPs8vOOIYKfk= +github.com/cncf/udpa/go v0.0.0-20220112060539-c52dc94e7fbe/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= +github.com/cncf/xds/go v0.0.0-20230607035331-e9ce68804cb4 h1:/inchEIKaYC1Akx+H+gqO04wryn5h75LSazbRlnya1k= +github.com/cncf/xds/go v0.0.0-20230607035331-e9ce68804cb4/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cockroachdb/apd v1.1.0 h1:3LFP3629v+1aKXU5Q37mxmRxX/pIu1nijXydLShEq5I= +github.com/cockroachdb/sentry-go v0.6.1-cockroachdb.2 h1:IKgmqgMQlVJIZj19CdocBeSfSaiCbEBZGKODaixqtHM= +github.com/codegangsta/inject v0.0.0-20150114235600-33e0aa1cb7c0 h1:sDMmm+q/3+BukdIpxwO365v/Rbspp2Nt5XntgQRXq8Q= +github.com/colinmarc/hdfs/v2 v2.1.1 h1:x0hw/m+o3UE20Scso/KCkvYNc9Di39TBlCfGMkJ1/a0= +github.com/containerd/console v1.0.3 h1:lIr7SlA5PxZyMV30bDW0MGbiOPXwc63yRuCP0ARubLw= +github.com/containerd/console v1.0.3/go.mod h1:7LqA/THxQ86k76b8c/EMSiaJ3h1eZkMkXar0TQ1gf3U= +github.com/coreos/etcd v3.3.10+incompatible h1:jFneRYjIvLMLhDLCzuTuU4rSJUjRplcJQ7pD7MnhC04= +github.com/coreos/go-etcd v2.0.0+incompatible h1:bXhRBIXoTm9BYHS3gE0TtQuyNZyeEMux2sDi4oo5YOo= +github.com/coreos/go-semver v0.3.0 h1:wkHLiw0WNATZnSG7epLsujiMCgPAc9xhjJ4tgnAxmfM= +github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= +github.com/coreos/go-systemd v0.0.0-20190719114852-fd7a80b32e1f h1:JOrtw2xFKzlg+cbHpyrpLDmnN1HqhBfnX7WDiW7eG2c= +github.com/coreos/go-systemd/v22 v22.3.2 h1:D9/bQk5vlXQFZ6Kwuu6zaiXJ9oTPe68++AzAJc1DzSI= +github.com/cpuguy83/go-md2man v1.0.10 h1:BSKMNlYxDvnunlTymqtgONjNnaRV1sTpcovwwjF22jk= +github.com/cpuguy83/go-md2man/v2 v2.0.2 h1:p1EgwI/C7NhT0JmVkwCD2ZBK8j4aeHQX2pMHHBfMQ6w= +github.com/cyberdelia/templates v0.0.0-20141128023046-ca7fffd4298c h1:/ovYnF02fwL0kvspmy9AuyKg1JhdTRUgPw4nUxd9oZM= +github.com/cyphar/filepath-securejoin v0.2.4 h1:Ugdm7cg7i6ZK6x3xDF1oEu1nfkyfH53EtKeQYTC3kyg= +github.com/cyphar/filepath-securejoin v0.2.4/go.mod h1:aPGpWjXOXUn2NCNjFvBE6aRxGGx79pTxQpKOJNYHHl4= +github.com/denisenkom/go-mssqldb v0.12.0 h1:VtrkII767ttSPNRfFekePK3sctr+joXgO58stqQbtUA= +github.com/devigned/tab v0.1.1 h1:3mD6Kb1mUOYeLpJvTVSDwSg5ZsfSxfvxGRTxRsJsITA= +github.com/dgraph-io/badger v1.6.0 h1:DshxFxZWXUcO0xX476VJC07Xsr6ZCBVRHKZ93Oh7Evo= +github.com/dgrijalva/jwt-go v3.2.0+incompatible h1:7qlOGliEKZXTDg6OTjfoBKDXWrumCAMpl/TFQ4/5kLM= +github.com/dgryski/go-lttb v0.0.0-20230207170358-f8fc36cdbff1 h1:dxwR3CStJdJamsIoMPCmxuIfBAPTgmzvFax+MvFav3M= +github.com/dgryski/go-lttb v0.0.0-20230207170358-f8fc36cdbff1/go.mod h1:UwftcHUI/qTYvLAxrWmANuRckf8+08O3C3hwStvkhDU= +github.com/dimchansky/utfbom v1.1.1 h1:vV6w1AhK4VMnhBno/TPVCoK9U/LP0PkLCS9tbxHdi/U= +github.com/dnaeon/go-vcr v1.2.0 h1:zHCHvJYTMh1N7xnV7zf1m1GPBF9Ad0Jk/whtQ1663qI= +github.com/eknkc/amber v0.0.0-20171010120322-cdade1c07385 h1:clC1lXBpe2kTj2VHdaIu9ajZQe4kcEY9j0NsnDDBZ3o= +github.com/envoyproxy/go-control-plane v0.11.1 h1:wSUXTlLfiAQRWs2F+p+EKOY9rUyis1MyGqJ2DIk5HpM= +github.com/envoyproxy/go-control-plane v0.11.1/go.mod h1:uhMcXKCQMEJHiAb0w+YGefQLaTEw+YhGluxZkrTmD0g= +github.com/envoyproxy/protoc-gen-validate v1.0.2 h1:QkIBuU5k+x7/QXPvPPnWXWlCdaBFApVqftFV6k087DA= +github.com/envoyproxy/protoc-gen-validate v1.0.2/go.mod h1:GpiZQP3dDbg4JouG/NNS7QWXpgx6x8QiMKdmN72jogE= +github.com/etcd-io/bbolt v1.3.3 h1:gSJmxrs37LgTqR/oyJBWok6k6SvXEUerFTbltIhXkBM= +github.com/fasthttp-contrib/websocket v0.0.0-20160511215533-1f3b11f56072 h1:DddqAaWDpywytcG8w/qoQ5sAN8X12d3Z3koB0C3Rxsc= +github.com/fatih/structs v1.1.0 h1:Q7juDM0QtcnhCpeyLGQKyg4TOIghuNXrkL32pHAUMxo= +github.com/felixge/fgprof v0.9.3 h1:VvyZxILNuCiUCSXtPtYmmtGvb65nqXh2QFWc0Wpf2/g= +github.com/felixge/fgprof v0.9.3/go.mod h1:RdbpDgzqYVh/T9fPELJyV7EYJuHB55UTEULNun8eiPw= +github.com/flosch/pongo2 v0.0.0-20190707114632-bbf5a6c351f4 h1:GY1+t5Dr9OKADM64SYnQjw/w99HMYvQ0A8/JoUkxVmc= +github.com/flosch/pongo2/v4 v4.0.2 h1:gv+5Pe3vaSVmiJvh/BZa82b7/00YUGm0PIyVVLop0Hw= +github.com/flosch/pongo2/v4 v4.0.2/go.mod h1:B5ObFANs/36VwxxlgKpdchIJHMvHB562PW+BWPhwZD8= +github.com/fogleman/gg v1.3.0 h1:/7zJX8F6AaYQc57WQCyN9cAIz+4bCJGO9B+dyW29am8= +github.com/form3tech-oss/jwt-go v3.2.2+incompatible h1:TcekIExNqud5crz4xD2pavyTgWiPvpYe4Xau31I0PRk= +github.com/fortytw2/leaktest v1.3.0 h1:u8491cBMTQ8ft8aeV+adlcytMZylmA5nnwwkRZjI8vw= +github.com/gavv/httpexpect v2.0.0+incompatible h1:1X9kcRshkSKEjNJJxX9Y9mQ5BRfbxU5kORdjhlA1yX8= +github.com/ghemawat/stream v0.0.0-20171120220530-696b145b53b9 h1:r5GgOLGbza2wVHRzK7aAj6lWZjfbAwiu/RDCVOKjRyM= +github.com/ghemawat/stream v0.0.0-20171120220530-696b145b53b9/go.mod h1:106OIgooyS7OzLDOpUGgm9fA3bQENb/cFSyyBmMoJDs= +github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE= +github.com/gin-gonic/gin v1.8.1 h1:4+fr/el88TOO3ewCmQr8cx/CtZ/umlIRIs5M4NTNjf8= +github.com/gin-gonic/gin v1.8.1/go.mod h1:ji8BvRH1azfM+SYow9zQ6SZMvR8qOMZHmsCuWR9tTTk= +github.com/go-check/check v0.0.0-20180628173108-788fd7840127 h1:0gkP6mzaMqkmpcJYCFOLkIBwI7xFExG03bbkOkCvUPI= +github.com/go-fonts/dejavu v0.1.0 h1:JSajPXURYqpr+Cu8U9bt8K+XcACIHWqWrvWCKyeFmVQ= +github.com/go-fonts/latin-modern v0.2.0 h1:5/Tv1Ek/QCr20C6ZOz15vw3g7GELYL98KWr8Hgo+3vk= +github.com/go-fonts/liberation v0.1.1 h1:wBrPaMkrXFBW3qXpXAjiKljdVUMxn9bX2ia3XjPHoik= +github.com/go-fonts/stix v0.1.0 h1:UlZlgrvvmT/58o573ot7NFw0vZasZ5I6bcIft/oMdgg= +github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1 h1:QbL/5oDUmRBzO9/Z7Seo6zf912W/a6Sr4Eu0G/3Jho0= +github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4 h1:WtGNWLvXpe6ZudgnXrq0barxBImvnnJoMEhXAzcbM0I= +github.com/go-ini/ini v1.25.4 h1:Mujh4R/dH6YL8bxuISne3xX2+qcQ9p0IxKAP6ExWoUo= +github.com/go-kit/log v0.2.1 h1:MRVx0/zhvdseW+Gza6N9rVzU/IVzaeE1SFI4raAhmBU= +github.com/go-kit/log v0.2.1/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0= +github.com/go-latex/latex v0.0.0-20210118124228-b3d85cf34e07 h1:OTlfMvwR1rLyf9goVmXfuS5AJn80+Vmj4rTf4n46SOs= +github.com/go-logfmt/logfmt v0.5.1 h1:otpy5pqBCBZ1ng9RQ0dPu4PN7ba75Y/aA+UpowDyNVA= +github.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= +github.com/go-martini/martini v0.0.0-20170121215854-22fa46961aab h1:xveKWz2iaueeTaUgdetzel+U7exyigDYBryyVfV/rZk= +github.com/go-playground/assert/v2 v2.0.1 h1:MsBgLAaY856+nPRTKrp3/OZK38U/wa0CcBYNjji3q3A= +github.com/go-playground/locales v0.14.0 h1:u50s323jtVGugKlcYeyzC0etD1HifMjqmJqb8WugfUU= +github.com/go-playground/locales v0.14.0/go.mod h1:sawfccIbzZTqEDETgFXqTho0QybSa7l++s0DH+LDiLs= +github.com/go-playground/universal-translator v0.18.0 h1:82dyy6p4OuJq4/CByFNOn/jYrnRPArHwAcmLoJZxyho= +github.com/go-playground/universal-translator v0.18.0/go.mod h1:UvRDBj+xPUEGrFYl+lu/H90nyDXpg0fqeB/AQUGNTVA= +github.com/go-playground/validator/v10 v10.11.1 h1:prmOlTVv+YjZjmRmNSF3VmspqJIxJWXmqUsHwfTRRkQ= +github.com/go-playground/validator/v10 v10.11.1/go.mod h1:i+3WkQ1FvaUjjxh1kSvIA4dMGDBiPU55YFDl0WbKdWU= +github.com/go-stack/stack v1.8.0 h1:5SgMzNM5HxrEjV0ww2lTmX6E2Izsfxas4+YHWRs3Lsk= +github.com/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee h1:s+21KNqlpePfkah2I+gwHF8xmJWRjooY+5248k6m4A0= +github.com/gobwas/pool v0.2.0 h1:QEmUOlnSjWtnpRGHF3SauEiOsy82Cup83Vf2LcMlnc8= +github.com/gobwas/ws v1.0.2 h1:CoAavW/wd/kulfZmSIBt6p24n4j7tHgNVCjsfHVNUbo= +github.com/goccy/go-json v0.9.11 h1:/pAaQDLHEoCq/5FFmSKBswWmK6H0e8g4159Kc/X/nqk= +github.com/goccy/go-json v0.9.11/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= +github.com/godbus/dbus/v5 v5.0.6 h1:mkgN1ofwASrYnJ5W6U/BxG15eXXXjirgZc7CLqkcaro= +github.com/godbus/dbus/v5 v5.0.6/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= +github.com/gofrs/uuid v4.0.0+incompatible h1:1SD/1F5pU8p29ybwgQSwpQk+mwdRrXCYuPhW6m+TnJw= +github.com/gogo/googleapis v1.4.1 h1:1Yx4Myt7BxzvUr5ldGSbwYiZG6t9wGBZ+8/fX3Wvtq0= +github.com/gogo/status v1.1.0 h1:+eIkrewn5q6b30y+g/BJINVVdi2xH7je5MPJ3ZPK3JA= +github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe h1:lXe2qZdvpiX5WZkZR4hgp4KJVfY3nMkvmwbVkpv1rVY= +github.com/golang-sql/sqlexp v0.0.0-20170517235910-f1bb20e5a188 h1:+eHOFJl1BaXrQxKX+T06f78590z4qA2ZzBTqahsKSE4= +github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 h1:DACJavvAHhabrF08vX0COfcOBJRhZ8lUbR+ZWIs0Y5g= +github.com/golangci/lint-1 v0.0.0-20181222135242-d2cdd8c08219 h1:utua3L2IbQJmauC5IXdEA547bcoU5dozgQAfc8Onsg4= +github.com/gomodule/redigo v1.7.1-0.20190724094224-574c33c3df38 h1:y0Wmhvml7cGnzPa9nocn/fMraMH/lMDdeG+rkx4VgYY= +github.com/google/btree v1.0.0 h1:0udJVsspx3VBr5FwtLhQQtuAsVc79tTq0ocGIPAU6qo= +github.com/google/go-pkcs11 v0.2.1-0.20230907215043-c6f79328ddf9 h1:OF1IPgv+F4NmqmJ98KTjdN97Vs1JxDPB3vbmYzV2dpk= +github.com/google/go-pkcs11 v0.2.1-0.20230907215043-c6f79328ddf9/go.mod h1:6eQoGcuNJpa7jnd5pMGdkSaQpNDYvPlXWMcjXXThLlY= +github.com/google/gofuzz v1.0.0 h1:A8PeW59pxE9IoFRqBp37U+mSNaQoZ46F1f0f863XSXw= +github.com/google/pprof v0.0.0-20211214055906-6f57359322fd h1:1FjCyPC+syAzJ5/2S8fqdZK1R22vvA0J7JZKcuOIQ7Y= +github.com/google/pprof v0.0.0-20211214055906-6f57359322fd/go.mod h1:KgnwoLYCZ8IQu3XUZ8Nc/bM9CCZFOyjUNOSygVozoDg= +github.com/google/renameio v0.1.0 h1:GOZbcHa3HfsPKPlmyPyN2KEohoMXOhdMbHrvbpl2QaA= +github.com/google/subcommands v1.0.1 h1:/eqq+otEXm5vhfBrbREPCSVQbvofip6kIz+mX5TUH7k= +github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8 h1:tlyzajkF3030q6M8SvmJSemC9DTHL/xaMa18b65+JM4= +github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8= +github.com/gorilla/css v1.0.0 h1:BQqNyPTi50JCFMTw/b67hByjMVXZRwGha6wxVGkeihY= +github.com/gorilla/css v1.0.0/go.mod h1:Dn721qIggHpt4+EFCcTLTU/vk5ySda2ReITrtgBl60c= +github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI= +github.com/gorilla/websocket v1.4.1 h1:q7AeDBpnBk8AogcD4DSag/Ukw/KV+YhzLj2bP5HvKCM= +github.com/grafana/regexp v0.0.0-20221122212121-6b5c0a4cb7fd h1:PpuIBO5P3e9hpqBD0O/HjhShYuM6XE0i/lbE6J94kww= +github.com/grafana/regexp v0.0.0-20221122212121-6b5c0a4cb7fd/go.mod h1:M5qHK+eWfAv8VR/265dIuEpL3fNfeC21tXXp9itM24A= +github.com/grpc-ecosystem/grpc-gateway v1.16.0 h1:gmcG1KaJ57LophUzW0Hy8NmPhnMZb4M0+kPpLofRdBo= +github.com/hanwen/go-fuse v1.0.0 h1:GxS9Zrn6c35/BnfiVsZVWmsG803xwE7eVRDvcf/BEVc= +github.com/hanwen/go-fuse/v2 v2.1.0 h1:+32ffteETaLYClUj0a3aHjZ1hOPxxaNEHiZiujuDaek= +github.com/hashicorp/consul/api v1.25.1 h1:CqrdhYzc8XZuPnhIYZWH45toM0LB9ZeYr/gvpLVI3PE= +github.com/hashicorp/consul/api v1.25.1/go.mod h1:iiLVwR/htV7mas/sy0O+XSuEnrdBUUydemjxcUrAt4g= +github.com/hashicorp/go-immutable-radix v1.3.1 h1:DKHmCUm2hRBK510BaiZlwvpD40f8bJFeZnpfm2KLowc= +github.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= +github.com/hashicorp/go-rootcerts v1.0.2 h1:jzhAVGtqPKbwpyCPELlgNWhE1znq+qwJtW5Oi2viEzc= +github.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8= +github.com/hashicorp/go-uuid v0.0.0-20180228145832-27454136f036 h1:d8T6WIONl4rMCPcQ/eY3uSz3+e4/GaoflKjXrWMex1U= +github.com/hashicorp/golang-lru v0.5.4 h1:YDjusn29QI/Das2iO9M0BHnIbxPeyuCHsjMW+lJfyTc= +github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= +github.com/hashicorp/serf v0.10.1 h1:Z1H2J60yRKvfDYAOZLd2MU0ND4AH/WDz7xYHDWQsIPY= +github.com/hashicorp/serf v0.10.1/go.mod h1:yL2t6BqATOLGc5HF7qbFkTfXoPIY0WZdWHfEvMqbG+4= +github.com/hpcloud/tail v1.0.0 h1:nfCOvKYfkgYP8hkirhJocXT2+zOD8yUNjXaWfTlyFKI= +github.com/hydrogen18/memlistener v0.0.0-20200120041712-dcc25e7acd91 h1:KyZDvZ/GGn+r+Y3DKZ7UOQ/TP4xV6HNkrwiVMB1GnNY= +github.com/iancoleman/orderedmap v0.3.0 h1:5cbR2grmZR/DiVt+VJopEhtVs9YGInGIxAoMJn+Ichc= +github.com/iancoleman/orderedmap v0.3.0/go.mod h1:XuLcCUkdL5owUCQeF2Ue9uuw1EptkJDkXXS7VoV7XGE= +github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639 h1:mV02weKRL81bEnm8A0HT1/CAelMQDBuQIfLw8n+d6xI= +github.com/imkira/go-interpol v1.1.0 h1:KIiKr0VSG2CUW1hl1jpiyuzuJeKUUpC8iM1AIE7N1Vk= +github.com/iris-contrib/blackfriday v2.0.0+incompatible h1:o5sHQHHm0ToHUlAJSTjW9UWicjJSDDauOOQ2AHuIVp4= +github.com/iris-contrib/go.uuid v2.0.0+incompatible h1:XZubAYg61/JwnJNbZilGjf3b3pB80+OQg2qf6c8BfWE= +github.com/iris-contrib/i18n v0.0.0-20171121225848-987a633949d0 h1:Kyp9KiXwsyZRTeoNjgVCrWks7D8ht9+kg6yCjh8K97o= +github.com/iris-contrib/jade v1.1.4 h1:WoYdfyJFfZIUgqNAeOyRfTNQZOksSlZ6+FnXR3AEpX0= +github.com/iris-contrib/jade v1.1.4/go.mod h1:EDqR+ur9piDl6DUgs6qRrlfzmlx/D5UybogqrXvJTBE= +github.com/iris-contrib/pongo2 v0.0.1 h1:zGP7pW51oi5eQZMIlGA3I+FHY9/HOQWDB+572yin0to= +github.com/iris-contrib/schema v0.0.6 h1:CPSBLyx2e91H2yJzPuhGuifVRnZBBJ3pCOMbOvPZaTw= +github.com/iris-contrib/schema v0.0.6/go.mod h1:iYszG0IOsuIsfzjymw1kMzTL8YQcCWlm65f3wX8J5iA= +github.com/jackc/chunkreader v1.0.0 h1:4s39bBR8ByfqH+DKm8rQA3E1LHZWB9XWcrz8fqaZbe0= +github.com/jackc/chunkreader/v2 v2.0.1 h1:i+RDz65UE+mmpjTfyz0MoVTnzeYxroil2G82ki7MGG8= +github.com/jackc/pgconn v1.11.0 h1:HiHArx4yFbwl91X3qqIHtUFoiIfLNJXCQRsnzkiwwaQ= +github.com/jackc/pgio v1.0.0 h1:g12B9UwVnzGhueNavwioyEEpAmqMe1E/BN9ES+8ovkE= +github.com/jackc/pgmock v0.0.0-20210724152146-4ad1a8207f65 h1:DadwsjnMwFjfWc9y5Wi/+Zz7xoE5ALHsRQlOctkOiHc= +github.com/jackc/pgproto3 v1.1.0 h1:FYYE4yRw+AgI8wXIinMlNjBbp/UitDJwfj5LqqewP1A= +github.com/jackc/pgproto3/v2 v2.2.0 h1:r7JypeP2D3onoQTCxWdTpCtJ4D+qpKr0TxvoyMhZ5ns= +github.com/jackc/pgtype v1.10.0 h1:ILnBWrRMSXGczYvmkYD6PsYyVFUNLTnIUJHHDLmqk38= +github.com/jackc/pgx/v4 v4.15.0 h1:B7dTkXsdILD3MF987WGGCcg+tvLW6bZJdEcqVFeU//w= +github.com/jackc/puddle v1.2.1 h1:gI8os0wpRXFd4FiAY2dWiqRK037tjj3t7rKFeO4X5iw= +github.com/jcmturner/gofork v0.0.0-20180107083740-2aebee971930 h1:v4CYlQ+HeysPHsr2QFiEO60gKqnvn1xwvuKhhAhuEkk= +github.com/joho/godotenv v1.3.0 h1:Zjp+RcGpHhGlrMbJzXTrZZPrWj+1vfm90La1wgB6Bhc= +github.com/jpillora/backoff v1.0.0 h1:uvFg412JmmHBHw7iwprIxkPMI+sGQ4kzOWsMeHnm2EA= +github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= +github.com/jstemmer/go-junit-report v0.9.1 h1:6QPYqodiu3GuPL+7mfx+NwDdp2eTkp9IfEUpgAwUN0o= +github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo= +github.com/juju/errors v0.0.0-20181118221551-089d3ea4e4d5 h1:rhqTjzJlm7EbkELJDKMTU7udov+Se0xZkWmugr6zGok= +github.com/juju/loggo v0.0.0-20180524022052-584905176618 h1:MK144iBQF9hTSwBW/9eJm034bVoG30IshVm688T2hi8= +github.com/juju/testing v0.0.0-20180920084828-472a3e8b2073 h1:WQM1NildKThwdP7qWrNAFGzp4ijNLw8RlgENkaI4MJs= +github.com/julienschmidt/httprouter v1.3.0 h1:U0609e9tgbseu3rBINet9P48AI/D3oJs4dN7jwJOQ1U= +github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= +github.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5 h1:PJr+ZMXIecYc1Ey2zucXdR73SMBtgjPgwa31099IMv0= +github.com/k0kubun/colorstring v0.0.0-20150214042306-9440f1994b88 h1:uC1QfSlInpQF+M0ao65imhwqKnz3Q2z/d8PWZRMQvDM= +github.com/k0kubun/go-ansi v0.0.0-20180517002512-3bf9e2903213 h1:qGQQKEcAR99REcMpsXCp3lJ03zYT1PkRd3kQGPn9GVg= +github.com/kataras/blocks v0.0.7 h1:cF3RDY/vxnSRezc7vLFlQFTYXG/yAr1o7WImJuZbzC4= +github.com/kataras/blocks v0.0.7/go.mod h1:UJIU97CluDo0f+zEjbnbkeMRlvYORtmc1304EeyXf4I= +github.com/kataras/golog v0.1.7 h1:0TY5tHn5L5DlRIikepcaRR/6oInIr9AiWsxzt0vvlBE= +github.com/kataras/golog v0.1.7/go.mod h1:jOSQ+C5fUqsNSwurB/oAHq1IFSb0KI3l6GMa7xB6dZA= +github.com/kataras/iris/v12 v12.2.0-beta5 h1:grB/oCf5baZhmYIeDMfgN3LYrtEcmK8pbxlRvEZ2pgw= +github.com/kataras/iris/v12 v12.2.0-beta5/go.mod h1:q26aoWJ0Knx/00iPKg5iizDK7oQQSPjbD8np0XDh6dc= +github.com/kataras/neffos v0.0.14 h1:pdJaTvUG3NQfeMbbVCI8JT2T5goPldyyfUB2PJfh1Bs= +github.com/kataras/pio v0.0.11 h1:kqreJ5KOEXGMwHAWHDwIl+mjfNCPhAwZPa8gK7MKlyw= +github.com/kataras/pio v0.0.11/go.mod h1:38hH6SWH6m4DKSYmRhlrCJ5WItwWgCVrTNU62XZyUvI= +github.com/kataras/sitemap v0.0.6 h1:w71CRMMKYMJh6LR2wTgnk5hSgjVNB9KL60n5e2KHvLY= +github.com/kataras/sitemap v0.0.6/go.mod h1:dW4dOCNs896OR1HmG+dMLdT7JjDk7mYBzoIRwuj5jA4= +github.com/kataras/tunnel v0.0.4 h1:sCAqWuJV7nPzGrlb0os3j49lk2JhILT0rID38NHNLpA= +github.com/kataras/tunnel v0.0.4/go.mod h1:9FkU4LaeifdMWqZu7o20ojmW4B7hdhv2CMLwfnHGpYw= +github.com/kisielk/errcheck v1.5.0 h1:e8esj/e4R+SAOwFwN+n3zr0nYeCyeweozKfO23MvHzY= +github.com/kisielk/gotool v1.0.0 h1:AV2c/EiW3KqPNT9ZKl07ehoAGi4C5/01Cfbblndcapg= +github.com/klauspost/cpuid v1.2.1 h1:vJi+O/nMdFt0vqm8NZBI6wzALWdA2X+egi0ogNyrC/w= +github.com/konsorten/go-windows-terminal-sequences v1.0.2 h1:DB17ag19krx9CFsz4o3enTrPXyIXCl+2iCXH/aMAp9s= +github.com/kr/fs v0.1.0 h1:Jskdu9ieNAYnjxsi0LbQp1ulIKZV1LAFgK1tWhpZgl8= +github.com/kr/pty v1.1.8 h1:AkaSdXYQOWeaO3neb8EM634ahkXXe3jYbVh/F9lq+GI= +github.com/leodido/go-urn v1.2.1 h1:BqpAaACuzVSgi/VLzGZIobT2z4v53pjosyNd9Yv6n/w= +github.com/leodido/go-urn v1.2.1/go.mod h1:zt4jvISO2HfUBqxjfIshjdMTYS56ZS/qv49ictyFfxY= +github.com/mailgun/raymond/v2 v2.0.46 h1:aOYHhvTpF5USySJ0o7cpPno/Uh2I5qg2115K25A+Ft4= +github.com/mailgun/raymond/v2 v2.0.46/go.mod h1:lsgvL50kgt1ylcFJYZiULi5fjPBkkhNfj4KA0W54Z18= +github.com/matoous/go-nanoid v1.5.0 h1:VRorl6uCngneC4oUQqOYtO3S0H5QKFtKuKycFG3euek= +github.com/matryer/moq v0.0.0-20190312154309-6cfb0558e1bd h1:HvFwW+cm9bCbZ/+vuGNq7CRWXql8c0y8nGeYpqmpvmk= +github.com/mattn/go-ieproxy v0.0.1 h1:qiyop7gCflfhwCzGyeT0gro3sF9AIg9HU98JORTkqfI= +github.com/mattn/goveralls v0.0.2 h1:7eJB6EqsPhRVxvwEXGnqdO2sJI0PTsrWoTMXEk9/OQc= +github.com/mediocregopher/mediocre-go-lib v0.0.0-20181029021733-cb65787f37ed h1:3dQJqqDouawQgl3gBE1PNHKFkJYGEuFb1DbSlaxdosE= +github.com/mediocregopher/radix/v3 v3.4.2 h1:galbPBjIwmyREgwGCfQEN4X8lxbJnKBYurgz+VfcStA= +github.com/microcosm-cc/bluemonday v1.0.21 h1:dNH3e4PSyE4vNX+KlRGHT5KrSvjeUkoNPwEORjffHJg= +github.com/microcosm-cc/bluemonday v1.0.21/go.mod h1:ytNkv4RrDrLJ2pqlsSI46O6IVXmZOBBD4SaJyDwwTkM= +github.com/miekg/dns v1.1.56 h1:5imZaSeoRNvpM9SzWNhEcP9QliKiz20/dA2QabIGVnE= +github.com/miekg/dns v1.1.56/go.mod h1:cRm6Oo2C8TY9ZS/TqsSrseAcncm74lfK5G+ikN2SWWY= +github.com/minio/highwayhash v1.0.2 h1:Aak5U0nElisjDCfPSG79Tgzkn2gl66NxOMspRrKnA/g= +github.com/minio/highwayhash v1.0.2/go.mod h1:BQskDq+xkJ12lmlUUi7U0M5Swg3EWR+dLTk+kldvVxY= +github.com/moby/sys/mountinfo v0.5.0 h1:2Ks8/r6lopsxWi9m58nlwjaeSzUX9iiL1vj5qB/9ObI= +github.com/moby/sys/mountinfo v0.5.0/go.mod h1:3bMD3Rg+zkqx8MRYPi7Pyb0Ie97QEBmdxbhnCLlSvSU= +github.com/modocache/gover v0.0.0-20171022184752-b58185e213c5 h1:8Q0qkMVC/MmWkpIdlvZgcv2o2jrlF6zqVOh7W5YHdMA= +github.com/montanaflynn/stats v0.7.0 h1:r3y12KyNxj/Sb/iOE46ws+3mS1+MZca1wlHQFPsY/JU= +github.com/montanaflynn/stats v0.7.0/go.mod h1:etXPPgVO6n31NxCd9KQUMvCM+ve0ruNzt6R8Bnaayow= +github.com/moul/http2curl v1.0.0 h1:dRMWoAtb+ePxMlLkrCbAqh4TlPHXvoGUSQ323/9Zahs= +github.com/mrunalp/fileutils v0.5.1 h1:F+S7ZlNKnrwHfSwdlgNSkKo67ReVf8o9fel6C3dkm/Q= +github.com/mrunalp/fileutils v0.5.1/go.mod h1:M1WthSahJixYnrXQl/DFQuteStB1weuxD2QJNHXfbSQ= +github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f h1:KUppIJq7/+SVif2QVs3tOP0zanoHgBEVAwHxUSIzRqU= +github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= +github.com/nats-io/jwt v0.3.0 h1:xdnzwFETV++jNc4W1mw//qFyJGb2ABOombmZJQS4+Qo= +github.com/nats-io/jwt/v2 v2.4.1 h1:Y35W1dgbbz2SQUYDPCaclXcuqleVmpbRa7646Jf2EX4= +github.com/nats-io/jwt/v2 v2.4.1/go.mod h1:24BeQtRwxRV8ruvC4CojXlx/WQ/VjuwlYiH+vu/+ibI= +github.com/nats-io/nats.go v1.30.2 h1:aloM0TGpPorZKQhbAkdCzYDj+ZmsJDyeo3Gkbr72NuY= +github.com/nats-io/nats.go v1.30.2/go.mod h1:dcfhUgmQNN4GJEfIb2f9R7Fow+gzBF4emzDHrVBd5qM= +github.com/nats-io/nkeys v0.4.5 h1:Zdz2BUlFm4fJlierwvGK+yl20IAKUm7eV6AAZXEhkPk= +github.com/nats-io/nkeys v0.4.5/go.mod h1:XUkxdLPTufzlihbamfzQ7mw/VGx6ObUs+0bN5sNvt64= +github.com/nats-io/nuid v1.0.1 h1:5iA8DT8V7q8WK2EScv2padNa/rTESc1KdnPw4TC2paw= +github.com/ncw/swift v1.0.52 h1:ACF3JufDGgeKp/9mrDgQlEgS8kRYC4XKcuzj/8EJjQU= +github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs= +github.com/nxadm/tail v1.4.4 h1:DQuhQpB1tVlglWS2hLQ5OV6B5r8aGxSrPc5Qo6uTN78= +github.com/onsi/ginkgo v1.13.0 h1:M76yO2HkZASFjXL0HSoZJ1AYEmQxNJmY41Jx1zNUq1Y= +github.com/onsi/gomega v1.10.1 h1:o0+MgICZLuZ7xjH7Vx6zS/zcu93/BEp1VwkIW1mEXCE= +github.com/opencontainers/runtime-spec v1.0.3-0.20210326190908-1c3f411f0417 h1:3snG66yBm59tKhhSPQrQ/0bCrv1LQbKt40LnUPiUxdc= +github.com/opencontainers/runtime-spec v1.0.3-0.20210326190908-1c3f411f0417/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= +github.com/opencontainers/selinux v1.10.0 h1:rAiKF8hTcgLI3w0DHm6i0ylVVcOrlgR1kK99DRLDhyU= +github.com/opencontainers/selinux v1.10.0/go.mod h1:2i0OySw99QjzBBQByd1Gr9gSjvuho1lHsJxIJ3gGbJI= +github.com/pborman/getopt v0.0.0-20180729010549-6fdd0a2c7117 h1:7822vZ646Atgxkp3tqrSufChvAAYgIy+iFEGpQntwlI= +github.com/pelletier/go-toml v1.2.0 h1:T5zMGML61Wp+FlcbWjRDT7yAxhJNAiPPLOFECq181zc= +github.com/phpdave11/gofpdf v1.4.2 h1:KPKiIbfwbvC/wOncwhrpRdXVj2CZTCFlw4wnoyjtHfQ= +github.com/phpdave11/gofpdi v1.0.12 h1:RZb9NG62cw/RW0rHAduVRo+98R8o/G1krcg2ns7DakQ= +github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e h1:aoZm08cpOy4WuID//EZDgcC4zIxODThtZNPirFr42+A= +github.com/pkg/profile v1.7.0 h1:hnbDkaNWPCLMO9wGLdBFTIZvzDrDfBM2072E1S9gJkA= +github.com/pkg/profile v1.7.0/go.mod h1:8Uer0jas47ZQMJ7VD+OHknK4YDY07LPUC6dEvqDjvNo= +github.com/pkg/sftp v1.13.1 h1:I2qBYMChEhIjOgazfJmV3/mZM256btk6wkCDRmW7JYs= +github.com/prometheus/prometheus v0.48.0 h1:yrBloImGQ7je4h8M10ujGh4R6oxYQJQKlMuETwNskGk= +github.com/prometheus/prometheus v0.48.0/go.mod h1:SRw624aMAxTfryAcP8rOjg4S/sHHaetx2lyJJ2nM83g= +github.com/rogpeppe/fastuuid v1.2.0 h1:Ppwyp6VYCF1nvBTXL3trRso7mXMlRrw9ooo375wvi2s= +github.com/rs/zerolog v1.15.0 h1:uPRuwkWF4J6fGsJ2R0Gn2jB1EQiav9k3S6CSdygQJXY= +github.com/russross/blackfriday v1.5.2 h1:HyvC0ARfnZBqnXwABFeSZHpKvJHJJfPz81GNueLj0oo= +github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= +github.com/ruudk/golang-pdf417 v0.0.0-20181029194003-1af4ab5afa58 h1:nlG4Wa5+minh3S9LVFtNoY+GVRiudA2e3EVfcCi3RCA= +github.com/ryanuber/columnize v2.1.0+incompatible h1:j1Wcmh8OrK4Q7GXY+V7SVSY8nUWQxHW5TkBe7YUl+2s= +github.com/sagikazarmark/crypt v0.15.0 h1:TQJg76CemcIdJyC9/dmNjU9OUyIFHyvE50Tpq1t1nqY= +github.com/sagikazarmark/crypt v0.15.0/go.mod h1:5rwNNax6Mlk9sZ40AcyVtiEw24Z4J04cfSioF2COKmc= +github.com/satori/go.uuid v1.2.0 h1:0uYX9dsZ2yD7q2RtLRtPSdGDWzjeM3TbMJP9utgA0ww= +github.com/schollz/closestmatch v2.1.0+incompatible h1:Uel2GXEpJqOWBrlyI+oY9LTiyyjYS17cCYRqP13/SHk= +github.com/sclevine/agouti v3.0.0+incompatible h1:8IBJS6PWz3uTlMP3YBIR5f+KAldcGuOeFkFbUWfBgK4= +github.com/scylladb/termtables v0.0.0-20191203121021-c4c0b6d42ff4 h1:8qmTC5ByIXO3GP/IzBkxcZ/99VITvnIETDhdFz/om7A= +github.com/seccomp/libseccomp-golang v0.9.2-0.20220502022130-f33da4d89646 h1:RpforrEYXWkmGwJHIGnLZ3tTWStkjVVstwzNGqxX2Ds= +github.com/seccomp/libseccomp-golang v0.9.2-0.20220502022130-f33da4d89646/go.mod h1:JA8cRccbGaA1s33RQf7Y1+q9gHmZX1yB/z9WDN1C6fg= +github.com/sergi/go-diff v1.1.0 h1:we8PVUC3FE2uYfodKH/nBHMSetSfHDR6scGdBi+erh0= +github.com/shurcooL/sanitized_anchor_name v1.0.0 h1:PdmoCO6wvbs+7yrJyMORt4/BmY5IYyJwS/kOiWx8mHo= +github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM= +github.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s= +github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72 h1:qLC7fQah7D6K1B0ujays3HV9gkFtllcxhzImRR7ArPQ= +github.com/spf13/jwalterweatherman v1.0.0 h1:XHEdyB+EcvlqZamSM4ZOMGlc93t6AcsBEu9Gc1vn7yk= +github.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635 h1:kdXcSzyDtseVEc4yCz2qF8ZrQvIDBJLl4S1c3GCXmoI= +github.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= +github.com/tdewolff/minify/v2 v2.12.4 h1:kejsHQMM17n6/gwdw53qsi6lg0TGddZADVyQOz1KMdE= +github.com/tdewolff/minify/v2 v2.12.4/go.mod h1:h+SRvSIX3kwgwTFOpSckvSxgax3uy8kZTSF1Ojrr3bk= +github.com/tdewolff/parse/v2 v2.6.4 h1:KCkDvNUMof10e3QExio9OPZJT8SbdKojLBumw8YZycQ= +github.com/tdewolff/parse/v2 v2.6.4/go.mod h1:woz0cgbLwFdtbjJu8PIKxhW05KplTFQkOdX78o+Jgrs= +github.com/tsenart/go-tsz v0.0.0-20180814235614-0bd30b3df1c3 h1:pcQGQzTwCg//7FgVywqge1sW9Yf8VMsMdG58MI5kd8s= +github.com/tsenart/go-tsz v0.0.0-20180814235614-0bd30b3df1c3/go.mod h1:SWZznP1z5Ki7hDT2ioqiFKEse8K9tU2OUvaRI0NeGQo= +github.com/ugorji/go v1.1.7 h1:/68gy2h+1mWMrwZFeD1kQialdSzAb432dtpeJ42ovdo= +github.com/ugorji/go/codec v1.2.7 h1:YPXUKf7fYbp/y8xloBqZOw2qaVggbfwMlI8WM3wZUJ0= +github.com/ugorji/go/codec v1.2.7/go.mod h1:WGN1fab3R1fzQlVQTkfxVtIBhWDRqOviHU95kRgeqEY= +github.com/urfave/cli v1.22.1 h1:+mkCCcOFKPnCmVYVcURKps1Xe+3zP90gSYGNfRkjoIY= +github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= +github.com/urfave/negroni v1.0.0 h1:kIimOitoypq34K7TG7DUaJ9kq/N4Ofuwi1sjz0KipXc= +github.com/valyala/fasthttp v1.40.0 h1:CRq/00MfruPGFLTQKY8b+8SfdK60TxNztjRMnH0t1Yc= +github.com/valyala/fasthttp v1.40.0/go.mod h1:t/G+3rLek+CyY9bnIE+YlMRddxVAAGjhxndDB4i4C0I= +github.com/valyala/tcplisten v0.0.0-20161114210144-ceec8f93295a h1:0R4NLDRDZX6JcmhJgXi5E4b8Wg84ihbmUKp/GvSPEzc= +github.com/vishvananda/netlink v1.1.0 h1:1iyaYNBLmP6L0220aDnYQpo1QEV4t4hJ+xEEhhJH8j0= +github.com/vishvananda/netlink v1.1.0/go.mod h1:cTgwzPIzzgDAYoQrMm0EdrjRUBkTqKYppBueQtXaqoE= +github.com/vishvananda/netns v0.0.0-20191106174202-0a2b9b5464df h1:OviZH7qLw/7ZovXvuNyL3XQl8UFofeikI1NW1Gypu7k= +github.com/vishvananda/netns v0.0.0-20191106174202-0a2b9b5464df/go.mod h1:JP3t17pCcGlemwknint6hfoeCVQrEMVwxRLRjXpq+BU= +github.com/vmihailenco/msgpack/v5 v5.3.5 h1:5gO0H1iULLWGhs2H5tbAHIZTV8/cYafcFOr9znI5mJU= +github.com/vmihailenco/msgpack/v5 v5.3.5/go.mod h1:7xyJ9e+0+9SaZT0Wt1RGleJXzli6Q/V5KbhBonMG9jc= +github.com/vmihailenco/tagparser/v2 v2.0.0 h1:y09buUbR+b5aycVFQs/g70pqKVZNBmxwAhO7/IwNM9g= +github.com/vmihailenco/tagparser/v2 v2.0.0/go.mod h1:Wri+At7QHww0WTrCBeu4J6bNtoV6mEfg5OIWRZA9qds= +github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77 h1:ESFSdwYZvkeru3RtdrYueztKhOBCSAAzS4Gf+k0tEow= +github.com/yalp/jsonpath v0.0.0-20180802001716-5cc68e5049a0 h1:6fRhSjgLCkTD3JnJxvaJ4Sj+TYblw757bqYgZaOq5ZY= +github.com/yosssi/ace v0.0.5 h1:tUkIP/BLdKqrlrPwcmH0shwEEhTRHoGnc1wFIWmaBUA= +github.com/yosssi/ace v0.0.5/go.mod h1:ALfIzm2vT7t5ZE7uoIZqF3TQ7SAOyupFZnkrF5id+K0= +github.com/yudai/gojsondiff v1.0.0 h1:27cbfqXLVEJ1o8I6v3y9lg8Ydm53EKqHXAOMxEGlCOA= +github.com/yudai/golcs v0.0.0-20170316035057-ecda9a501e82 h1:BHyfKlQyqbsFN5p3IfnEUduWvb9is428/nNb5L3U01M= +github.com/yudai/pp v2.0.1+incompatible h1:Q4//iY4pNF6yPLZIigmvcl7k/bPgrcTPIFIcmawg5bI= +github.com/yuin/goldmark v1.4.13 h1:fVcFKWvrslecOb/tg+Cc05dkeYx540o0FuFt3nUVDoE= +github.com/zenazn/goji v0.9.0 h1:RSQQAbXGArQ0dIDEq+PI6WqN6if+5KHu6x2Cx/GXLTQ= +go.etcd.io/etcd/api/v3 v3.5.9 h1:4wSsluwyTbGGmyjJktOf3wFQoTBIURXHnq9n/G/JQHs= +go.etcd.io/etcd/api/v3 v3.5.9/go.mod h1:uyAal843mC8uUVSLWz6eHa/d971iDGnCRpmKd2Z+X8k= +go.etcd.io/etcd/client/pkg/v3 v3.5.9 h1:oidDC4+YEuSIQbsR94rY9gur91UPL6DnxDCIYd2IGsE= +go.etcd.io/etcd/client/pkg/v3 v3.5.9/go.mod h1:y+CzeSmkMpWN2Jyu1npecjB9BBnABxGM4pN8cGuJeL4= +go.etcd.io/etcd/client/v2 v2.305.9 h1:YZ2OLi0OvR0H75AcgSUajjd5uqKDKocQUqROTG11jIo= +go.etcd.io/etcd/client/v2 v2.305.9/go.mod h1:0NBdNx9wbxtEQLwAQtrDHwx58m02vXpDcgSYI2seohQ= +go.etcd.io/etcd/client/v3 v3.5.9 h1:r5xghnU7CwbUxD/fbUtRyJGaYNfDun8sp/gTr1hew6E= +go.etcd.io/etcd/client/v3 v3.5.9/go.mod h1:i/Eo5LrZ5IKqpbtpPDuaUnDOUv471oDg8cjQaUr2MbA= +go.opentelemetry.io/proto/otlp v0.7.0 h1:rwOQPCuKAKmwGKq2aVNnYIibI6wnV7EvzgfTCzcdGg8= +go.uber.org/goleak v1.1.11 h1:wy28qYRKZgnJTxGxvye5/wgWr1EKjmUDGYox5mGlRlI= +go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee h1:0mgffUl7nfd+FpvXMVz4IDEaUSmT1ysygQC7qYo7sG4= +go.uber.org/zap v1.26.0 h1:sI7k6L95XOKS281NhVKOFCUNIvv9e0w4BF8N3u+tCRo= +go.uber.org/zap v1.26.0/go.mod h1:dtElttAiwGvoJ/vj4IwHBS/gXsEu/pZ50mUIRWuG0so= +golang.org/x/crypto v0.31.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk= +golang.org/x/image v0.0.0-20210216034530-4410531fe030 h1:lP9pYkih3DUSC641giIXa2XqfTIbbbRr0w2EOTA7wHA= +golang.org/x/lint v0.0.0-20210508222113-6edffad5e616 h1:VLliZ0d+/avPrXXH+OakdXhpJuEoBZuwh1m2j7U6Iug= +golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028 h1:4+4C/Iv2U4fMZBiMCc98MG1In4gJY5YRhtpDNeDeHWs= +golang.org/x/net v0.33.0/go.mod h1:HXLR5J+9DxmrqMwG9qjGCxZ+zKXxBru04zlTvWlWuN4= +golang.org/x/sync v0.10.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/telemetry v0.0.0-20240228155512-f48c80bd79b2 h1:IRJeR9r1pYWsHKTRe/IInb7lYvbBVIqOgsX/u0mbOWY= +golang.org/x/telemetry v0.0.0-20240228155512-f48c80bd79b2/go.mod h1:TeRTkGYfJXctD9OcfyVLyj2J3IxLnKwHJR8f4D8a3YE= +golang.org/x/term v0.27.0/go.mod h1:iMsnZpn0cago0GOrHO2+Y7u7JPn5AylBrcoWkElMTSM= +golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= +gonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0 h1:OE9mWmgKkjJyEmDAAtGMPjXu+YNeGvK9VTSHY6+Qihc= +gonum.org/v1/plot v0.9.0 h1:3sEo36Uopv1/SA/dMFFaxXoL5XyikJ9Sf2Vll/k6+2E= +google.golang.org/genproto/googleapis/bytestream v0.0.0-20231120223509-83a465c0220f h1:hL+1ptbhFoeL1HcROQ8OGXaqH0jYRRibgWQWco0/Ugc= +google.golang.org/genproto/googleapis/bytestream v0.0.0-20231120223509-83a465c0220f/go.mod h1:iIgEblxoG4klcXsG0d9cpoxJ4xndv6+1FkDROCHhPRI= +google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0 h1:M1YKkFIboKNieVO5DLUEVzQfGwJD30Nv2jfUgzb5UcE= +gopkg.in/errgo.v2 v2.1.0 h1:0vLT13EuvQ0hNvakwLuFZ/jYrLp5F3kcWHXdRggjCE8= +gopkg.in/fsnotify.v1 v1.4.7 h1:xOHLXZwVvI9hhs+cLKq5+I5onOuwQLhQwiu63xxlHs4= +gopkg.in/go-playground/assert.v1 v1.2.1 h1:xoYuJVE7KT85PYWrN730RguIQO0ePzVRfFMXadIrXTM= +gopkg.in/go-playground/validator.v8 v8.18.2 h1:lFB4DoMU6B626w8ny76MV7VX6W2VHct2GVOI3xgiMrQ= +gopkg.in/inconshreveable/log15.v2 v2.0.0-20180818164646-67afb5ed74ec h1:RlWgLqCMMIYYEVcAR5MDsuHlVkaIPDAF+5Dehzg8L5A= +gopkg.in/jcmturner/aescts.v1 v1.0.1 h1:cVVZBK2b1zY26haWB4vbBiZrfFQnfbTVrE3xZq6hrEw= +gopkg.in/jcmturner/dnsutils.v1 v1.0.1 h1:cIuC1OLRGZrld+16ZJvvZxVJeKPsvd5eUIvxfoN5hSM= +gopkg.in/jcmturner/goidentity.v3 v3.0.0 h1:1duIyWiTaYvVx3YX2CYtpJbUFd7/UuPYCfgXtQ3VTbI= +gopkg.in/jcmturner/gokrb5.v7 v7.3.0 h1:0709Jtq/6QXEuWRfAm260XqlpcwL1vxtO1tUE2qK8Z4= +gopkg.in/jcmturner/rpc.v1 v1.1.0 h1:QHIUxTX1ISuAv9dD2wJ9HWQVuWDX/Zc0PfeC2tjc4rU= +gopkg.in/mgo.v2 v2.0.0-20180705113604-9856a29383ce h1:xcEWjVhvbDy+nHP67nPDDpbYrY+ILlfndk4bRioVHaU= +gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= +honnef.co/go/tools v0.0.1-2020.1.4 h1:UoveltGrhghAA7ePc+e+QYDHXrBps2PqFZiHkGR/xK8= +nhooyr.io/websocket v1.8.7 h1:usjR2uOr/zjjkVMy0lW+PPohFok7PCow5sDjLgX4P4g= +rsc.io/binaryregexp v0.2.0 h1:HfqmD5MEmC0zvwBuF187nq9mdnXjXsSivRiXN7SmRkE= +rsc.io/pdf v0.1.1 h1:k1MczvYDUvJBe93bYd7wrZLLUEcLZAuF824/I4e5Xr4= +rsc.io/quote/v3 v3.1.0 h1:9JKUTTIUgS6kzR9mK1YuGKv6Nl+DijDNIc0ghT58FaY= +rsc.io/sampler v1.3.0 h1:7uVkIFmeBqHfdjD+gZwtXXI+RODJ2Wc4O7MPEh/QiW4= diff --git a/pkg/api/controller.go b/pkg/api/controller.go index b4e7a9867da..152c12185f2 100644 --- a/pkg/api/controller.go +++ b/pkg/api/controller.go @@ -216,6 +216,7 @@ func (c *Controller) CreatePresignMultipartUpload(w http.ResponseWriter, r *http // create a new multipart upload mpuResp, err := c.BlockAdapter.CreateMultiPartUpload(ctx, block.ObjectPointer{ + StorageID: repo.StorageID, StorageNamespace: repo.StorageNamespace, IdentifierType: block.IdentifierTypeRelative, Identifier: address, @@ -229,6 +230,7 @@ func (c *Controller) CreatePresignMultipartUpload(w http.ResponseWriter, r *http for i := 0; i < swag.IntValue(params.Parts); i++ { // generate a pre-signed PUT url for the given request preSignedURL, err := c.BlockAdapter.GetPresignUploadPartURL(ctx, block.ObjectPointer{ + StorageID: repo.StorageID, StorageNamespace: repo.StorageNamespace, Identifier: address, IdentifierType: block.IdentifierTypeRelative, @@ -300,6 +302,7 @@ func (c *Controller) AbortPresignMultipartUpload(w http.ResponseWriter, r *http. } if err := c.BlockAdapter.AbortMultiPartUpload(ctx, block.ObjectPointer{ + StorageID: repo.StorageID, StorageNamespace: repo.StorageNamespace, IdentifierType: block.IdentifierTypeRelative, Identifier: physicalAddress, @@ -372,6 +375,7 @@ func (c *Controller) CompletePresignMultipartUpload(w http.ResponseWriter, r *ht } mpuResp, err := c.BlockAdapter.CompleteMultiPartUpload(ctx, block.ObjectPointer{ + StorageID: repo.StorageID, StorageNamespace: repo.StorageNamespace, IdentifierType: block.IdentifierTypeRelative, Identifier: physicalAddress, @@ -702,6 +706,7 @@ func (c *Controller) GetPhysicalAddress(w http.ResponseWriter, r *http.Request, if swag.BoolValue(params.Presign) { // generate a pre-signed PUT url for the given request preSignedURL, expiry, err := c.BlockAdapter.GetPreSignedURL(ctx, block.ObjectPointer{ + StorageID: repo.StorageID, StorageNamespace: repo.StorageNamespace, Identifier: address, IdentifierType: block.IdentifierTypeRelative, @@ -2091,6 +2096,7 @@ func (c *Controller) ensureStorageNamespace(ctx context.Context, storageNamespac // this serves two purposes, first, we maintain safety check for older lakeFS version. // second, in scenarios where lakeFS shouldn't have access to the root namespace (i.e pre-sign URL only). if c.Config.Graveler.EnsureReadableRootNamespace { + // TODO (gilo): ObjectPointer init - add StorageID here rootObj := block.ObjectPointer{ StorageNamespace: storageNamespace, IdentifierType: block.IdentifierTypeRelative, @@ -2108,6 +2114,7 @@ func (c *Controller) ensureStorageNamespace(ctx context.Context, storageNamespac // check if the dummy file exists obj := block.ObjectPointer{ + // TODO (gilo): ObjectPointer init - add StorageID here StorageNamespace: storageNamespace, IdentifierType: block.IdentifierTypeRelative, Identifier: dummyKey, @@ -2558,6 +2565,7 @@ func (c *Controller) GetRunHookOutput(w http.ResponseWriter, r *http.Request, re logPath := taskResult.LogPath() reader, err := c.BlockAdapter.Get(ctx, block.ObjectPointer{ + StorageID: repo.StorageID, StorageNamespace: repo.StorageNamespace, IdentifierType: block.IdentifierTypeRelative, Identifier: logPath, @@ -3625,6 +3633,7 @@ func (c *Controller) PrepareGarbageCollectionCommits(w http.ResponseWriter, r *h if c.handleAPIError(ctx, w, r, err) { return } + // TODO (gilo): ObjectPointer init - add StorageID here presignedURL, _, err := c.BlockAdapter.GetPreSignedURL(ctx, block.ObjectPointer{ Identifier: gcRunMetadata.CommitsCSVLocation, IdentifierType: block.IdentifierTypeFull, @@ -3855,6 +3864,7 @@ func (c *Controller) DumpRefs(w http.ResponseWriter, r *http.Request, repository return } _, err = c.BlockAdapter.Put(ctx, block.ObjectPointer{ + StorageID: repo.StorageID, StorageNamespace: repo.StorageNamespace, IdentifierType: block.IdentifierTypeRelative, Identifier: fmt.Sprintf("%s/refs_manifest.json", c.Config.Committed.BlockStoragePrefix), @@ -4195,6 +4205,7 @@ func writeSymlink(ctx context.Context, repo *catalog.Repository, branch, path st address := fmt.Sprintf("%s/%s/%s/%s/symlink.txt", lakeFSPrefix, repo.Name, branch, path) data := strings.Join(addresses, "\n") _, err := adapter.Put(ctx, block.ObjectPointer{ + StorageID: repo.StorageID, StorageNamespace: repo.StorageNamespace, IdentifierType: block.IdentifierTypeRelative, Identifier: address, @@ -4402,6 +4413,7 @@ func (c *Controller) GetMetadataObject(w http.ResponseWriter, r *http.Request, r // if pre-sign, return a redirect pointer := block.ObjectPointer{ + StorageID: repo.StorageID, StorageNamespace: repo.StorageNamespace, IdentifierType: block.IdentifierTypeRelative, Identifier: objPath, @@ -4481,6 +4493,7 @@ func (c *Controller) GetObject(w http.ResponseWriter, r *http.Request, repositor // if pre-sign, return a redirect pointer := block.ObjectPointer{ + StorageID: repo.StorageID, StorageNamespace: repo.StorageNamespace, IdentifierType: entry.AddressType.ToIdentifierType(), Identifier: entry.PhysicalAddress, @@ -4627,6 +4640,7 @@ func (c *Controller) ListObjects(w http.ResponseWriter, r *http.Request, reposit if authResponse.Allowed { var expiry time.Time objStat.PhysicalAddress, expiry, err = c.BlockAdapter.GetPreSignedURL(ctx, block.ObjectPointer{ + StorageID: repo.StorageID, StorageNamespace: repo.StorageNamespace, IdentifierType: entry.AddressType.ToIdentifierType(), Identifier: entry.PhysicalAddress, @@ -4709,6 +4723,7 @@ func (c *Controller) StatObject(w http.ResponseWriter, r *http.Request, reposito } else if swag.BoolValue(params.Presign) { // need to pre-sign the physical address preSignedURL, expiry, err := c.BlockAdapter.GetPreSignedURL(ctx, block.ObjectPointer{ + StorageID: repo.StorageID, StorageNamespace: repo.StorageNamespace, IdentifierType: entry.AddressType.ToIdentifierType(), Identifier: entry.PhysicalAddress, @@ -4770,6 +4785,7 @@ func (c *Controller) GetUnderlyingProperties(w http.ResponseWriter, r *http.Requ // read object properties from underlying storage properties, err := c.BlockAdapter.GetProperties(ctx, block.ObjectPointer{ + StorageID: repo.StorageID, StorageNamespace: repo.StorageNamespace, IdentifierType: entry.AddressType.ToIdentifierType(), Identifier: entry.PhysicalAddress, diff --git a/pkg/block/adapter.go b/pkg/block/adapter.go index 77f82e6822b..2f0b0c6c26c 100644 --- a/pkg/block/adapter.go +++ b/pkg/block/adapter.go @@ -63,6 +63,7 @@ const DefaultPreSignExpiryDuration = 15 * time.Minute // ObjectPointer is a unique identifier of an object in the object // store: the store is a 1:1 mapping between pointers and objects. type ObjectPointer struct { + StorageID string StorageNamespace string Identifier string diff --git a/pkg/block/blocktest/adapter.go b/pkg/block/blocktest/adapter.go index 9db4c0f18a8..5fa7f8010de 100644 --- a/pkg/block/blocktest/adapter.go +++ b/pkg/block/blocktest/adapter.go @@ -39,6 +39,7 @@ func testAdapterGetRange(t *testing.T, adapter block.Adapter, storageNamespace s part1 := "this is the first part " part2 := "this is the last part" _, err := adapter.Put(ctx, block.ObjectPointer{ + StorageID: "", StorageNamespace: storageNamespace, Identifier: "test_file", IdentifierType: block.IdentifierTypeRelative, @@ -63,6 +64,7 @@ func testAdapterGetRange(t *testing.T, adapter block.Adapter, storageNamespace s for _, tt := range cases { t.Run(tt.name, func(t *testing.T) { reader, err := adapter.GetRange(ctx, block.ObjectPointer{ + StorageID: "", StorageNamespace: storageNamespace, Identifier: "test_file", IdentifierType: block.IdentifierTypeRelative, @@ -89,6 +91,7 @@ func testAdapterWalker(t *testing.T, adapter block.Adapter, storageNamespace str for i := 0; i < filesAndFolders; i++ { for j := 0; j < filesAndFolders; j++ { _, err := adapter.Put(ctx, block.ObjectPointer{ + StorageID: "", StorageNamespace: storageNamespace, Identifier: fmt.Sprintf("%s/folder_%d/test_file_%d", testPrefix, filesAndFolders-i-1, filesAndFolders-j-1), IdentifierType: block.IdentifierTypeRelative, @@ -98,6 +101,7 @@ func testAdapterWalker(t *testing.T, adapter block.Adapter, storageNamespace str } _, err := adapter.Put(ctx, block.ObjectPointer{ + StorageID: "", StorageNamespace: storageNamespace, Identifier: fmt.Sprintf("%s/folder_0.txt", testPrefix), IdentifierType: block.IdentifierTypeRelative, diff --git a/pkg/block/blocktest/basic_suite.go b/pkg/block/blocktest/basic_suite.go index e4541be51b2..f96d5efb98a 100644 --- a/pkg/block/blocktest/basic_suite.go +++ b/pkg/block/blocktest/basic_suite.go @@ -39,6 +39,7 @@ func testAdapterPutGet(t *testing.T, adapter block.Adapter, storageNamespace, ex for _, c := range cases { t.Run(c.name, func(t *testing.T) { obj := block.ObjectPointer{ + StorageID: "", StorageNamespace: storageNamespace, Identifier: c.path, IdentifierType: c.identifierType, @@ -64,11 +65,13 @@ func testAdapterCopy(t *testing.T, adapter block.Adapter, storageNamespace strin ctx := context.Background() contents := "foo bar baz quux" src := block.ObjectPointer{ + StorageID: "", StorageNamespace: storageNamespace, Identifier: "src", IdentifierType: block.IdentifierTypeRelative, } dst := block.ObjectPointer{ + StorageID: "", StorageNamespace: storageNamespace, Identifier: "export/to/dst", IdentifierType: block.IdentifierTypeRelative, @@ -130,6 +133,7 @@ func testAdapterRemove(t *testing.T, adapter block.Adapter, storageNamespace str envObjects = append(envObjects, tt.path) for _, p := range envObjects { obj := block.ObjectPointer{ + StorageID: "", StorageNamespace: storageNamespace, Identifier: tt.name + "/" + p, IdentifierType: block.IdentifierTypeRelative, @@ -140,6 +144,7 @@ func testAdapterRemove(t *testing.T, adapter block.Adapter, storageNamespace str // test Remove obj := block.ObjectPointer{ + StorageID: "", StorageNamespace: storageNamespace, Identifier: tt.name + "/" + tt.path, IdentifierType: block.IdentifierTypeRelative, @@ -165,6 +170,7 @@ func testAdapterExists(t *testing.T, adapter block.Adapter, storageNamespace str const contents = "exists" ctx := context.Background() _, err := adapter.Put(ctx, block.ObjectPointer{ + StorageID: "", StorageNamespace: storageNamespace, Identifier: contents, IdentifierType: block.IdentifierTypeRelative, @@ -172,6 +178,7 @@ func testAdapterExists(t *testing.T, adapter block.Adapter, storageNamespace str require.NoError(t, err) _, err = adapter.Put(ctx, block.ObjectPointer{ + StorageID: "", StorageNamespace: storageNamespace, Identifier: "nested/and/" + contents, IdentifierType: block.IdentifierTypeRelative, @@ -192,6 +199,7 @@ func testAdapterExists(t *testing.T, adapter block.Adapter, storageNamespace str for _, tt := range cases { t.Run(tt.name, func(t *testing.T) { ok, err := adapter.Exists(ctx, block.ObjectPointer{ + StorageID: "", StorageNamespace: storageNamespace, Identifier: tt.path, IdentifierType: block.IdentifierTypeRelative, diff --git a/pkg/block/blocktest/multipart_suite.go b/pkg/block/blocktest/multipart_suite.go index 2959a087fce..a8961bd95fb 100644 --- a/pkg/block/blocktest/multipart_suite.go +++ b/pkg/block/blocktest/multipart_suite.go @@ -41,6 +41,7 @@ func testAdapterMultipartUpload(t *testing.T, adapter block.Adapter, storageName t.Run(c.name, func(t *testing.T) { blockstoreType := adapter.BlockstoreType() obj := block.ObjectPointer{ + StorageID: "", StorageNamespace: storageNamespace, Identifier: c.path, IdentifierType: block.IdentifierTypeRelative, @@ -296,12 +297,14 @@ func requireEqualBigByteSlice(t *testing.T, exp, actual []byte) { func objPointers(storageNamespace string) (block.ObjectPointer, block.ObjectPointer) { var obj = block.ObjectPointer{ + StorageID: "", StorageNamespace: storageNamespace, Identifier: "abc", IdentifierType: block.IdentifierTypeRelative, } var objCopy = block.ObjectPointer{ + StorageID: "", StorageNamespace: storageNamespace, Identifier: "abcCopy", IdentifierType: block.IdentifierTypeRelative, diff --git a/pkg/block/local/adapter.go b/pkg/block/local/adapter.go index 0b6fb31dd54..909a4e3343f 100644 --- a/pkg/block/local/adapter.go +++ b/pkg/block/local/adapter.go @@ -246,7 +246,12 @@ func (l *Adapter) UploadCopyPart(ctx context.Context, sourceObj, destinationObj } md5Read := block.NewHashingReader(r, block.HashFunctionMD5) fName := uploadID + fmt.Sprintf("-%05d", partNumber) - _, err = l.Put(ctx, block.ObjectPointer{StorageNamespace: destinationObj.StorageNamespace, Identifier: fName}, -1, md5Read, block.PutOpts{}) + objectPointer := block.ObjectPointer{ + StorageID: destinationObj.StorageID, + StorageNamespace: destinationObj.StorageNamespace, + Identifier: fName, + } + _, err = l.Put(ctx, objectPointer, -1, md5Read, block.PutOpts{}) if err != nil { return nil, fmt.Errorf("copy put: %w", err) } @@ -266,7 +271,12 @@ func (l *Adapter) UploadCopyPartRange(ctx context.Context, sourceObj, destinatio } md5Read := block.NewHashingReader(r, block.HashFunctionMD5) fName := uploadID + fmt.Sprintf("-%05d", partNumber) - _, err = l.Put(ctx, block.ObjectPointer{StorageNamespace: destinationObj.StorageNamespace, Identifier: fName}, -1, md5Read, block.PutOpts{}) + objectPointer := block.ObjectPointer{ + StorageID: destinationObj.StorageID, + StorageNamespace: destinationObj.StorageNamespace, + Identifier: fName, + } + _, err = l.Put(ctx, objectPointer, -1, md5Read, block.PutOpts{}) if err != nil { return nil, fmt.Errorf("copy range put: %w", err) } @@ -398,7 +408,12 @@ func (l *Adapter) UploadPart(ctx context.Context, obj block.ObjectPointer, _ int } md5Read := block.NewHashingReader(reader, block.HashFunctionMD5) fName := uploadID + fmt.Sprintf("-%05d", partNumber) - _, err := l.Put(ctx, block.ObjectPointer{StorageNamespace: obj.StorageNamespace, Identifier: fName}, -1, md5Read, block.PutOpts{}) + objectPointer := block.ObjectPointer{ + StorageID: obj.StorageID, + StorageNamespace: obj.StorageNamespace, + Identifier: fName, + } + _, err := l.Put(ctx, objectPointer, -1, md5Read, block.PutOpts{}) etag := hex.EncodeToString(md5Read.Md5.Sum(nil)) return &block.UploadPartResponse{ ETag: etag, @@ -505,6 +520,7 @@ func (l *Adapter) removePartFiles(files []string) error { func (l *Adapter) getPartFiles(uploadID string, obj block.ObjectPointer) ([]string, error) { newObj := block.ObjectPointer{ + StorageID: obj.StorageID, StorageNamespace: obj.StorageNamespace, Identifier: uploadID, } @@ -544,6 +560,7 @@ func (l *Adapter) ResolveNamespace(storageNamespace, key string, identifierType } // Check if path allowed and return error if path is not allowed + // TODO (gilo): ObjectPointer init - add StorageID here _, err = l.extractParamsFromObj(block.ObjectPointer{ StorageNamespace: storageNamespace, Identifier: key, diff --git a/pkg/catalog/actions_output_writer.go b/pkg/catalog/actions_output_writer.go index e9fc56f44d9..7c3b96e0b56 100644 --- a/pkg/catalog/actions_output_writer.go +++ b/pkg/catalog/actions_output_writer.go @@ -18,6 +18,7 @@ func NewActionsOutputWriter(blockAdapter block.Adapter) *ActionsOutputWriter { } func (o *ActionsOutputWriter) OutputWrite(ctx context.Context, storageNamespace, name string, reader io.Reader, size int64) error { + // TODO (gilo): ObjectPointer init - add StorageID here _, err := o.adapter.Put(ctx, block.ObjectPointer{ StorageNamespace: storageNamespace, IdentifierType: block.IdentifierTypeRelative, diff --git a/pkg/catalog/actions_source.go b/pkg/catalog/actions_source.go index db0f59852d3..95a9f5e1912 100644 --- a/pkg/catalog/actions_source.go +++ b/pkg/catalog/actions_source.go @@ -93,6 +93,7 @@ func (s *ActionsSource) load(ctx context.Context, record graveler.HookRecord, na // get action address blockAdapter := s.catalog.BlockAdapter reader, err := blockAdapter.Get(ctx, block.ObjectPointer{ + StorageID: repo.StorageID, StorageNamespace: repo.StorageNamespace, IdentifierType: block.IdentifierTypeRelative, Identifier: ent.PhysicalAddress, diff --git a/pkg/catalog/catalog.go b/pkg/catalog/catalog.go index 1ebbb1521ee..940133c6cf1 100644 --- a/pkg/catalog/catalog.go +++ b/pkg/catalog/catalog.go @@ -2642,6 +2642,7 @@ func (c *Catalog) uploadFile(ctx context.Context, ns graveler.StorageNamespace, return "", err } obj := block.ObjectPointer{ + // TODO (gilo): ObjectPointer init - add StorageID here StorageNamespace: ns.String(), Identifier: identifier, IdentifierType: block.IdentifierTypeFull, @@ -2757,11 +2758,13 @@ func (c *Catalog) CopyEntry(ctx context.Context, srcRepository, srcRef, srcPath, } srcObject := block.ObjectPointer{ + StorageID: srcRepo.StorageID, StorageNamespace: srcRepo.StorageNamespace, IdentifierType: srcEntry.AddressType.ToIdentifierType(), Identifier: srcEntry.PhysicalAddress, } destObj := block.ObjectPointer{ + StorageID: destRepo.StorageID, StorageNamespace: destRepo.StorageNamespace, IdentifierType: dstEntry.AddressType.ToIdentifierType(), Identifier: dstEntry.PhysicalAddress, diff --git a/pkg/catalog/catalog_test.go b/pkg/catalog/catalog_test.go index 0a1679837aa..19c50981a24 100644 --- a/pkg/catalog/catalog_test.go +++ b/pkg/catalog/catalog_test.go @@ -907,9 +907,11 @@ func createPrepareUncommittedTestScenario(t *testing.T, repositoryID string, num } func readPhysicalAddressesFromParquetObject(t *testing.T, repositoryID string, ctx context.Context, c *catalog.Catalog, obj string) []string { + // TODO (gilo): test StorageID here? objReader, err := c.BlockAdapter.Get(ctx, block.ObjectPointer{ Identifier: obj, IdentifierType: block.IdentifierTypeFull, + StorageID: "", StorageNamespace: "mem://" + repositoryID, }) require.NoError(t, err) diff --git a/pkg/gateway/operations/deleteobject.go b/pkg/gateway/operations/deleteobject.go index c76a1519fc8..2e10099f65c 100644 --- a/pkg/gateway/operations/deleteobject.go +++ b/pkg/gateway/operations/deleteobject.go @@ -42,6 +42,7 @@ func (controller *DeleteObject) HandleAbortMultipartUpload(w http.ResponseWriter req = req.WithContext(logging.AddFields(ctx, logging.Fields{logging.UploadIDFieldKey: uploadID})) err = o.BlockStore.AbortMultiPartUpload(ctx, block.ObjectPointer{ + StorageID: o.Repository.StorageID, StorageNamespace: o.Repository.StorageNamespace, IdentifierType: block.IdentifierTypeRelative, Identifier: mpu.PhysicalAddress, diff --git a/pkg/gateway/operations/getobject.go b/pkg/gateway/operations/getobject.go index 22f054bccfc..54abc44978c 100644 --- a/pkg/gateway/operations/getobject.go +++ b/pkg/gateway/operations/getobject.go @@ -110,6 +110,7 @@ func (controller *GetObject) Handle(w http.ResponseWriter, req *http.Request, o contentLength := entry.Size contentRange := "" objectPointer := block.ObjectPointer{ + StorageID: o.Repository.StorageID, StorageNamespace: o.Repository.StorageNamespace, IdentifierType: entry.AddressType.ToIdentifierType(), Identifier: entry.PhysicalAddress, @@ -208,6 +209,7 @@ func handleListParts(w http.ResponseWriter, req *http.Request, o *PathOperation) } partsResp, err := o.BlockStore.ListParts(req.Context(), block.ObjectPointer{ + StorageID: o.Repository.StorageID, StorageNamespace: o.Repository.StorageNamespace, IdentifierType: block.IdentifierTypeRelative, Identifier: multiPart.PhysicalAddress, diff --git a/pkg/gateway/operations/postobject.go b/pkg/gateway/operations/postobject.go index d3cd11ab0f3..07038a4d4fc 100644 --- a/pkg/gateway/operations/postobject.go +++ b/pkg/gateway/operations/postobject.go @@ -54,6 +54,7 @@ func (controller *PostObject) HandleCreateMultipartUpload(w http.ResponseWriter, storageClass := StorageClassFromHeader(req.Header) opts := block.CreateMultiPartUploadOpts{StorageClass: storageClass} resp, err := o.BlockStore.CreateMultiPartUpload(req.Context(), block.ObjectPointer{ + StorageID: o.Repository.StorageID, StorageNamespace: o.Repository.StorageNamespace, IdentifierType: block.IdentifierTypeRelative, Identifier: address, @@ -130,6 +131,7 @@ func (controller *PostObject) HandleCompleteMultipartUpload(w http.ResponseWrite normalizeMultipartUploadCompletion(&multipartList) resp, err := o.BlockStore.CompleteMultiPartUpload(req.Context(), block.ObjectPointer{ + StorageID: o.Repository.StorageID, StorageNamespace: o.Repository.StorageNamespace, IdentifierType: block.IdentifierTypeRelative, Identifier: objName, diff --git a/pkg/gateway/operations/putobject.go b/pkg/gateway/operations/putobject.go index aeacec0442b..1fe099bc0fe 100644 --- a/pkg/gateway/operations/putobject.go +++ b/pkg/gateway/operations/putobject.go @@ -178,12 +178,14 @@ func handleUploadPart(w http.ResponseWriter, req *http.Request, o *PathOperation } src := block.ObjectPointer{ + StorageID: srcRepo.StorageID, StorageNamespace: srcRepo.StorageNamespace, IdentifierType: ent.AddressType.ToIdentifierType(), Identifier: ent.PhysicalAddress, } dst := block.ObjectPointer{ + StorageID: o.Repository.StorageID, StorageNamespace: o.Repository.StorageNamespace, IdentifierType: block.IdentifierTypeRelative, Identifier: multiPart.PhysicalAddress, @@ -225,6 +227,7 @@ func handleUploadPart(w http.ResponseWriter, req *http.Request, o *PathOperation byteSize := req.ContentLength resp, err := o.BlockStore.UploadPart(req.Context(), block.ObjectPointer{ + StorageID: o.Repository.StorageID, StorageNamespace: o.Repository.StorageNamespace, IdentifierType: block.IdentifierTypeRelative, Identifier: multiPart.PhysicalAddress, diff --git a/pkg/graveler/retention/garbage_collection_manager.go b/pkg/graveler/retention/garbage_collection_manager.go index 89ad027b4de..a7a98d4e3d9 100644 --- a/pkg/graveler/retention/garbage_collection_manager.go +++ b/pkg/graveler/retention/garbage_collection_manager.go @@ -82,6 +82,7 @@ func (m *GarbageCollectionManager) SaveGarbageCollectionUncommitted(ctx context. } location += filename _, err = m.blockAdapter.Put(ctx, block.ObjectPointer{ + // TODO (gilo): ObjectPointer init - add StorageID here? Identifier: location, IdentifierType: block.IdentifierTypeFull, }, stat.Size(), fd, block.PutOpts{}) @@ -116,6 +117,7 @@ func NewGarbageCollectionManager(blockAdapter block.Adapter, refManager graveler func (m *GarbageCollectionManager) GetRules(ctx context.Context, storageNamespace graveler.StorageNamespace) (*graveler.GarbageCollectionRules, error) { objectPointer := block.ObjectPointer{ + // TODO (gilo): ObjectPointer init - add StorageID here? StorageNamespace: string(storageNamespace), Identifier: fmt.Sprintf(configFileSuffixTemplate, m.committedBlockStoragePrefix), IdentifierType: block.IdentifierTypeRelative, @@ -152,6 +154,7 @@ func (m *GarbageCollectionManager) SaveRules(ctx context.Context, storageNamespa return err } _, err = m.blockAdapter.Put(ctx, block.ObjectPointer{ + // TODO (gilo): ObjectPointer init - add StorageID here? StorageNamespace: string(storageNamespace), Identifier: fmt.Sprintf(configFileSuffixTemplate, m.committedBlockStoragePrefix), IdentifierType: block.IdentifierTypeRelative, @@ -206,6 +209,7 @@ func (m *GarbageCollectionManager) SaveGarbageCollectionCommits(ctx context.Cont return "", err } _, err = m.blockAdapter.Put(ctx, block.ObjectPointer{ + // TODO (gilo): ObjectPointer init - add StorageID here? Identifier: csvLocation, IdentifierType: block.IdentifierTypeFull, }, int64(len(commitsStr)), strings.NewReader(commitsStr), block.PutOpts{}) diff --git a/pkg/graveler/retention/garbage_collection_manager_test.go b/pkg/graveler/retention/garbage_collection_manager_test.go index d620a3be2c7..181e348586a 100644 --- a/pkg/graveler/retention/garbage_collection_manager_test.go +++ b/pkg/graveler/retention/garbage_collection_manager_test.go @@ -70,6 +70,7 @@ func TestGarbageCollectionManager_SaveGarbageCollectionUncommitted(t *testing.T) err = gc.SaveGarbageCollectionUncommitted(ctx, &repositoryRec, filename, runID) require.NoError(t, err) reader, err := blockAdapter.Get(ctx, block.ObjectPointer{ + StorageID: "", StorageNamespace: "", Identifier: fmt.Sprintf("%s%s", location, filename), IdentifierType: block.IdentifierTypeFull, diff --git a/pkg/pyramid/tier_fs.go b/pkg/pyramid/tier_fs.go index 3c01d94ba38..b2c2bb7e96c 100644 --- a/pkg/pyramid/tier_fs.go +++ b/pkg/pyramid/tier_fs.go @@ -419,6 +419,7 @@ func (tfs *TierFS) newLocalFileRef(namespace, nsPath, filename string) localFile } func (tfs *TierFS) objPointer(namespace, filename string) block.ObjectPointer { + // TODO (gilo): ObjectPointer init - add StorageID here return block.ObjectPointer{ StorageNamespace: namespace, IdentifierType: block.IdentifierTypeRelative, diff --git a/pkg/upload/write_blob.go b/pkg/upload/write_blob.go index db0b594e3b0..cdfd3251b42 100644 --- a/pkg/upload/write_blob.go +++ b/pkg/upload/write_blob.go @@ -20,6 +20,7 @@ type Blob struct { func WriteBlob(ctx context.Context, adapter block.Adapter, bucketName, address string, body io.Reader, contentLength int64, opts block.PutOpts) (*Blob, error) { // handle the upload itself hashReader := block.NewHashingReader(body, block.HashFunctionMD5, block.HashFunctionSHA256) + // TODO (gilo): ObjectPointer init - add StorageID here res, err := adapter.Put(ctx, block.ObjectPointer{ StorageNamespace: bucketName, IdentifierType: block.IdentifierTypeRelative, From 920cd0f347bc9c80acbc75d8a27c39c832d1fe25 Mon Sep 17 00:00:00 2001 From: Itai Gilo Date: Mon, 20 Jan 2025 17:20:36 +0000 Subject: [PATCH 21/26] Add StorageID to WriteBlob --- pkg/api/controller.go | 28 ++++++++++++++++++++---- pkg/api/controller_test.go | 4 ++-- pkg/gateway/operations/putobject.go | 11 +++++++++- pkg/gateway/operations/putobject_test.go | 12 +++++----- pkg/samplerepo/samplecontent.go | 11 +++++++++- pkg/testutil/adapter.go | 10 ++++----- pkg/upload/write_blob.go | 6 ++--- 7 files changed, 60 insertions(+), 22 deletions(-) diff --git a/pkg/api/controller.go b/pkg/api/controller.go index 152c12185f2..5afe253b482 100644 --- a/pkg/api/controller.go +++ b/pkg/api/controller.go @@ -3214,12 +3214,23 @@ func (c *Controller) UploadObject(w http.ResponseWriter, r *http.Request, reposi return } + storageNamespace := repo.StorageNamespace + storageID := repo.StorageID + var blob *upload.Blob if mediaType != "multipart/form-data" { // handle non-multipart, direct content upload address := c.PathProvider.NewPath() - blob, err = upload.WriteBlob(ctx, c.BlockAdapter, repo.StorageNamespace, address, r.Body, r.ContentLength, - block.PutOpts{StorageClass: params.StorageClass}) + blob, err = upload.WriteBlob( + ctx, + c.BlockAdapter, + storageID, + storageNamespace, + address, + r.Body, + r.ContentLength, + block.PutOpts{StorageClass: params.StorageClass}, + ) if err != nil { writeError(w, r, http.StatusInternalServerError, err) return @@ -3248,7 +3259,16 @@ func (c *Controller) UploadObject(w http.ResponseWriter, r *http.Request, reposi if partName == "content" { // upload the first "content" and exit the loop address := c.PathProvider.NewPath() - blob, err = upload.WriteBlob(ctx, c.BlockAdapter, repo.StorageNamespace, address, part, -1, block.PutOpts{StorageClass: params.StorageClass}) + blob, err = upload.WriteBlob( + ctx, + c.BlockAdapter, + storageID, + storageNamespace, + address, + part, + -1, + block.PutOpts{StorageClass: params.StorageClass}, + ) if err != nil { _ = part.Close() writeError(w, r, http.StatusInternalServerError, err) @@ -3297,7 +3317,7 @@ func (c *Controller) UploadObject(w http.ResponseWriter, r *http.Request, reposi identifierType = block.IdentifierTypeRelative } - qk, err := c.BlockAdapter.ResolveNamespace(repo.StorageNamespace, blob.PhysicalAddress, identifierType) + qk, err := c.BlockAdapter.ResolveNamespace(storageNamespace, blob.PhysicalAddress, identifierType) if err != nil { writeError(w, r, http.StatusInternalServerError, err) return diff --git a/pkg/api/controller_test.go b/pkg/api/controller_test.go index c7e1302f936..595e3025bb3 100644 --- a/pkg/api/controller_test.go +++ b/pkg/api/controller_test.go @@ -2550,7 +2550,7 @@ func TestController_ObjectsHeadObjectHandler(t *testing.T) { buf := new(bytes.Buffer) buf.WriteString("this is file content made up of bytes") address := upload.DefaultPathProvider.NewPath() - blob, err := upload.WriteBlob(context.Background(), deps.blocks, onBlock(deps, "ns1"), address, buf, 37, block.PutOpts{StorageClass: &expensiveString}) + blob, err := upload.WriteBlob(context.Background(), deps.blocks, "", onBlock(deps, "ns1"), address, buf, 37, block.PutOpts{StorageClass: &expensiveString}) if err != nil { t.Fatal(err) } @@ -2626,7 +2626,7 @@ func TestController_ObjectsGetObjectHandler(t *testing.T) { buf := new(bytes.Buffer) buf.WriteString("this is file content made up of bytes") address := upload.DefaultPathProvider.NewPath() - blob, err := upload.WriteBlob(context.Background(), deps.blocks, onBlock(deps, "ns1"), address, buf, 37, block.PutOpts{StorageClass: &expensiveString}) + blob, err := upload.WriteBlob(context.Background(), deps.blocks, "", onBlock(deps, "ns1"), address, buf, 37, block.PutOpts{StorageClass: &expensiveString}) if err != nil { t.Fatal(err) } diff --git a/pkg/gateway/operations/putobject.go b/pkg/gateway/operations/putobject.go index 1fe099bc0fe..aa27b0a9436 100644 --- a/pkg/gateway/operations/putobject.go +++ b/pkg/gateway/operations/putobject.go @@ -319,7 +319,16 @@ func handlePut(w http.ResponseWriter, req *http.Request, o *PathOperation) { } } address := o.PathProvider.NewPath() - blob, err := upload.WriteBlob(req.Context(), o.BlockStore, o.Repository.StorageNamespace, address, req.Body, req.ContentLength, opts) + blob, err := upload.WriteBlob( + req.Context(), + o.BlockStore, + o.Repository.StorageID, + o.Repository.StorageNamespace, + address, + req.Body, + req.ContentLength, + opts, + ) if err != nil { o.Log(req).WithError(err).Error("could not write request body to block adapter") _ = o.EncodeError(w, req, err, gatewayErrors.Codes.ToAPIErr(gatewayErrors.ErrInternalError)) diff --git a/pkg/gateway/operations/putobject_test.go b/pkg/gateway/operations/putobject_test.go index 373d8d352ee..bc674c74c16 100644 --- a/pkg/gateway/operations/putobject_test.go +++ b/pkg/gateway/operations/putobject_test.go @@ -15,8 +15,8 @@ import ( ) const ( - bucketName = "test" - ObjectBlockSize = 1024 * 3 + storageNamespace = "test" + ObjectBlockSize = 1024 * 3 expensiveString = "EXPENSIVE" cheapString = "CHEAP" @@ -47,14 +47,14 @@ func TestWriteBlob(t *testing.T) { adapter := testutil.NewMockAdapter() opts := block.PutOpts{StorageClass: tc.storageClass} address := upload.DefaultPathProvider.NewPath() - blob, err := upload.WriteBlob(context.Background(), adapter, bucketName, address, reader, tc.size, opts) + blob, err := upload.WriteBlob(context.Background(), adapter, "", storageNamespace, address, reader, tc.size, opts) if err != nil { t.Fatal(err) } - // test bucketName - if adapter.LastBucket != bucketName && tc.size != 0 { - t.Fatalf("write to wrong bucket: expected:%s got:%s", bucketName, adapter.LastBucket) + // test storageNamespace + if adapter.LastStorageNamespace != storageNamespace && tc.size != 0 { + t.Fatalf("write to wrong storageNamespace: expected:%s got:%s", storageNamespace, adapter.LastStorageNamespace) } // test data size expectedSize := int64(len(data)) diff --git a/pkg/samplerepo/samplecontent.go b/pkg/samplerepo/samplecontent.go index b35a36cb21e..a7739a4b3ab 100644 --- a/pkg/samplerepo/samplecontent.go +++ b/pkg/samplerepo/samplecontent.go @@ -81,7 +81,16 @@ func PopulateSampleRepo(ctx context.Context, repo *catalog.Repository, cat *cata // write file to storage address := pathProvider.NewPath() - blob, err := upload.WriteBlob(ctx, blockAdapter, repo.StorageNamespace, address, contentReader, contentSize, block.PutOpts{}) + blob, err := upload.WriteBlob( + ctx, + blockAdapter, + repo.StorageID, + repo.StorageNamespace, + address, + contentReader, + contentSize, + block.PutOpts{}, + ) if err != nil { return err } diff --git a/pkg/testutil/adapter.go b/pkg/testutil/adapter.go index 80923afa4c9..fee186654bf 100644 --- a/pkg/testutil/adapter.go +++ b/pkg/testutil/adapter.go @@ -12,10 +12,10 @@ import ( ) type MockAdapter struct { - TotalSize int64 - Count int - LastBucket string - LastStorageClass *string + TotalSize int64 + Count int + LastStorageNamespace string + LastStorageClass *string blockstoreMetadata *block.BlockstoreMetadata namespaceRegion *string @@ -68,7 +68,7 @@ func (a *MockAdapter) Put(_ context.Context, obj block.ObjectPointer, _ int64, r } a.TotalSize += int64(len(data)) a.Count++ - a.LastBucket = obj.StorageNamespace + a.LastStorageNamespace = obj.StorageNamespace a.LastStorageClass = opts.StorageClass return &block.PutResponse{}, nil } diff --git a/pkg/upload/write_blob.go b/pkg/upload/write_blob.go index cdfd3251b42..2bd0aabb66b 100644 --- a/pkg/upload/write_blob.go +++ b/pkg/upload/write_blob.go @@ -17,12 +17,12 @@ type Blob struct { CreationDate time.Time } -func WriteBlob(ctx context.Context, adapter block.Adapter, bucketName, address string, body io.Reader, contentLength int64, opts block.PutOpts) (*Blob, error) { +func WriteBlob(ctx context.Context, adapter block.Adapter, storageID, storageNamespace, address string, body io.Reader, contentLength int64, opts block.PutOpts) (*Blob, error) { // handle the upload itself hashReader := block.NewHashingReader(body, block.HashFunctionMD5, block.HashFunctionSHA256) - // TODO (gilo): ObjectPointer init - add StorageID here res, err := adapter.Put(ctx, block.ObjectPointer{ - StorageNamespace: bucketName, + StorageID: storageID, + StorageNamespace: storageNamespace, IdentifierType: block.IdentifierTypeRelative, Identifier: address, }, contentLength, hashReader, opts) From 7386b7e9583d3cbbb46eaf4490bc3e487aa13112 Mon Sep 17 00:00:00 2001 From: Itai Gilo Date: Mon, 20 Jan 2025 17:24:48 +0000 Subject: [PATCH 22/26] Add StorageID to uploadFile --- pkg/catalog/catalog.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pkg/catalog/catalog.go b/pkg/catalog/catalog.go index 940133c6cf1..b1801c06e06 100644 --- a/pkg/catalog/catalog.go +++ b/pkg/catalog/catalog.go @@ -2630,7 +2630,7 @@ type UncommittedParquetObject struct { CreationDate int64 `parquet:"name=creation_date, type=INT64, convertedtype=INT_64"` } -func (c *Catalog) uploadFile(ctx context.Context, ns graveler.StorageNamespace, location string, fd *os.File, size int64) (string, error) { +func (c *Catalog) uploadFile(ctx context.Context, sid graveler.StorageID, ns graveler.StorageNamespace, location string, fd *os.File, size int64) (string, error) { _, err := fd.Seek(0, 0) if err != nil { return "", err @@ -2642,7 +2642,7 @@ func (c *Catalog) uploadFile(ctx context.Context, ns graveler.StorageNamespace, return "", err } obj := block.ObjectPointer{ - // TODO (gilo): ObjectPointer init - add StorageID here + StorageID: sid.String(), StorageNamespace: ns.String(), Identifier: identifier, IdentifierType: block.IdentifierTypeFull, @@ -2706,7 +2706,7 @@ func (c *Catalog) PrepareGCUncommitted(ctx context.Context, repositoryID string, return nil, err } - name, err = c.uploadFile(ctx, repository.StorageNamespace, uncommittedLocation, fd, uw.Size()) + name, err = c.uploadFile(ctx, repository.StorageID, repository.StorageNamespace, uncommittedLocation, fd, uw.Size()) if err != nil { return nil, err } From 6f8d83a1ab21f6b3d1abe4b8a00af4b5e9c99cb6 Mon Sep 17 00:00:00 2001 From: Itai Gilo Date: Mon, 20 Jan 2025 17:37:55 +0000 Subject: [PATCH 23/26] Add log fields --- pkg/block/s3/adapter.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/pkg/block/s3/adapter.go b/pkg/block/s3/adapter.go index 2f8ff3060c0..843a336161e 100644 --- a/pkg/block/s3/adapter.go +++ b/pkg/block/s3/adapter.go @@ -411,6 +411,7 @@ func (a *Adapter) GetPreSignedURL(ctx context.Context, obj block.ObjectPointer, log := a.log(ctx).WithFields(logging.Fields{ "operation": "GetPreSignedURL", + "sid": obj.StorageID, // TODO (gilo): is "sid" a good enough name? "namespace": obj.StorageNamespace, "identifier": obj.Identifier, "ttl": time.Until(expiry), @@ -466,6 +467,7 @@ func (a *Adapter) GetPresignUploadPartURL(ctx context.Context, obj block.ObjectP log := a.log(ctx).WithFields(logging.Fields{ "operation": "GetPresignUploadPartURL", + "sid": obj.StorageID, // TODO (gilo): is "sid" a good enough name? "namespace": obj.StorageNamespace, "identifier": obj.Identifier, }) From b361b34a1e551d047f4670d9703399f3e6636ad4 Mon Sep 17 00:00:00 2001 From: Itai Gilo Date: Mon, 20 Jan 2025 17:39:06 +0000 Subject: [PATCH 24/26] Add comments --- pkg/block/azure/adapter.go | 1 + pkg/graveler/retention/garbage_collection_manager.go | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/pkg/block/azure/adapter.go b/pkg/block/azure/adapter.go index 3c9a332d6e8..5accb3a4306 100644 --- a/pkg/block/azure/adapter.go +++ b/pkg/block/azure/adapter.go @@ -139,6 +139,7 @@ func ResolveBlobURLInfoFromURL(pathURL *url.URL) (BlobURLInfo, error) { func resolveBlobURLInfo(obj block.ObjectPointer) (BlobURLInfo, error) { key := obj.Identifier + // TODO (gilo): verify there's no need for StorageID here defaultNamespace := obj.StorageNamespace var qk BlobURLInfo // check if the key is fully qualified diff --git a/pkg/graveler/retention/garbage_collection_manager.go b/pkg/graveler/retention/garbage_collection_manager.go index a7a98d4e3d9..de7580f54d1 100644 --- a/pkg/graveler/retention/garbage_collection_manager.go +++ b/pkg/graveler/retention/garbage_collection_manager.go @@ -116,8 +116,8 @@ func NewGarbageCollectionManager(blockAdapter block.Adapter, refManager graveler } func (m *GarbageCollectionManager) GetRules(ctx context.Context, storageNamespace graveler.StorageNamespace) (*graveler.GarbageCollectionRules, error) { + // TODO (gilo): ObjectPointer init - add StorageID here? objectPointer := block.ObjectPointer{ - // TODO (gilo): ObjectPointer init - add StorageID here? StorageNamespace: string(storageNamespace), Identifier: fmt.Sprintf(configFileSuffixTemplate, m.committedBlockStoragePrefix), IdentifierType: block.IdentifierTypeRelative, @@ -153,8 +153,8 @@ func (m *GarbageCollectionManager) SaveRules(ctx context.Context, storageNamespa if err != nil { return err } + // TODO (gilo): ObjectPointer init - add StorageID here? _, err = m.blockAdapter.Put(ctx, block.ObjectPointer{ - // TODO (gilo): ObjectPointer init - add StorageID here? StorageNamespace: string(storageNamespace), Identifier: fmt.Sprintf(configFileSuffixTemplate, m.committedBlockStoragePrefix), IdentifierType: block.IdentifierTypeRelative, From a66dba058234a7474c83e957affec68bd67656b7 Mon Sep 17 00:00:00 2001 From: Itai Gilo Date: Tue, 21 Jan 2025 18:10:31 +0200 Subject: [PATCH 25/26] Remove go.work.sum --- modules/block/factory/go.work.sum | 639 ------------------------------ 1 file changed, 639 deletions(-) delete mode 100644 modules/block/factory/go.work.sum diff --git a/modules/block/factory/go.work.sum b/modules/block/factory/go.work.sum deleted file mode 100644 index 94085410544..00000000000 --- a/modules/block/factory/go.work.sum +++ /dev/null @@ -1,639 +0,0 @@ -cloud.google.com/go/accessapproval v1.7.4 h1:ZvLvJ952zK8pFHINjpMBY5k7LTAp/6pBf50RDMRgBUI= -cloud.google.com/go/accessapproval v1.7.4/go.mod h1:/aTEh45LzplQgFYdQdwPMR9YdX0UlhBmvB84uAmQKUc= -cloud.google.com/go/accesscontextmanager v1.8.4 h1:Yo4g2XrBETBCqyWIibN3NHNPQKUfQqti0lI+70rubeE= -cloud.google.com/go/accesscontextmanager v1.8.4/go.mod h1:ParU+WbMpD34s5JFEnGAnPBYAgUHozaTmDJU7aCU9+M= -cloud.google.com/go/aiplatform v1.54.0 h1:wH7OYl9Vq/5tupok0BPTFY9xaTLb0GxkReHtB5PF7cI= -cloud.google.com/go/aiplatform v1.54.0/go.mod h1:pwZMGvqe0JRkI1GWSZCtnAfrR4K1bv65IHILGA//VEU= -cloud.google.com/go/analytics v0.21.6 h1:fnV7B8lqyEYxCU0LKk+vUL7mTlqRAq4uFlIthIdr/iA= -cloud.google.com/go/analytics v0.21.6/go.mod h1:eiROFQKosh4hMaNhF85Oc9WO97Cpa7RggD40e/RBy8w= -cloud.google.com/go/apigateway v1.6.4 h1:VVIxCtVerchHienSlaGzV6XJGtEM9828Erzyr3miUGs= -cloud.google.com/go/apigateway v1.6.4/go.mod h1:0EpJlVGH5HwAN4VF4Iec8TAzGN1aQgbxAWGJsnPCGGY= -cloud.google.com/go/apigeeconnect v1.6.4 h1:jSoGITWKgAj/ssVogNE9SdsTqcXnryPzsulENSRlusI= -cloud.google.com/go/apigeeconnect v1.6.4/go.mod h1:CapQCWZ8TCjnU0d7PobxhpOdVz/OVJ2Hr/Zcuu1xFx0= -cloud.google.com/go/apigeeregistry v0.8.2 h1:DSaD1iiqvELag+lV4VnnqUUFd8GXELu01tKVdWZrviE= -cloud.google.com/go/apigeeregistry v0.8.2/go.mod h1:h4v11TDGdeXJDJvImtgK2AFVvMIgGWjSb0HRnBSjcX8= -cloud.google.com/go/appengine v1.8.4 h1:Qub3fqR7iA1daJWdzjp/Q0Jz0fUG0JbMc7Ui4E9IX/E= -cloud.google.com/go/appengine v1.8.4/go.mod h1:TZ24v+wXBujtkK77CXCpjZbnuTvsFNT41MUaZ28D6vg= -cloud.google.com/go/area120 v0.8.4 h1:YnSO8m02pOIo6AEOgiOoUDVbw4pf+bg2KLHi4rky320= -cloud.google.com/go/area120 v0.8.4/go.mod h1:jfawXjxf29wyBXr48+W+GyX/f8fflxp642D/bb9v68M= -cloud.google.com/go/artifactregistry v1.14.6 h1:/hQaadYytMdA5zBh+RciIrXZQBWK4vN7EUsrQHG+/t8= -cloud.google.com/go/artifactregistry v1.14.6/go.mod h1:np9LSFotNWHcjnOgh8UVK0RFPCTUGbO0ve3384xyHfE= -cloud.google.com/go/asset v1.15.3 h1:uI8Bdm81s0esVWbWrTHcjFDFKNOa9aB7rI1vud1hO84= -cloud.google.com/go/asset v1.15.3/go.mod h1:yYLfUD4wL4X589A9tYrv4rFrba0QlDeag0CMcM5ggXU= -cloud.google.com/go/assuredworkloads v1.11.4 h1:FsLSkmYYeNuzDm8L4YPfLWV+lQaUrJmH5OuD37t1k20= -cloud.google.com/go/assuredworkloads v1.11.4/go.mod h1:4pwwGNwy1RP0m+y12ef3Q/8PaiWrIDQ6nD2E8kvWI9U= -cloud.google.com/go/automl v1.13.4 h1:i9tOKXX+1gE7+rHpWKjiuPfGBVIYoWvLNIGpWgPtF58= -cloud.google.com/go/automl v1.13.4/go.mod h1:ULqwX/OLZ4hBVfKQaMtxMSTlPx0GqGbWN8uA/1EqCP8= -cloud.google.com/go/baremetalsolution v1.2.3 h1:oQiFYYCe0vwp7J8ZmF6siVKEumWtiPFJMJcGuyDVRUk= -cloud.google.com/go/baremetalsolution v1.2.3/go.mod h1:/UAQ5xG3faDdy180rCUv47e0jvpp3BFxT+Cl0PFjw5g= -cloud.google.com/go/batch v1.6.3 h1:mPiIH20a5NU02rucbAmLeO4sLPO9hrTK0BLjdHyW8xw= -cloud.google.com/go/batch v1.6.3/go.mod h1:J64gD4vsNSA2O5TtDB5AAux3nJ9iV8U3ilg3JDBYejU= -cloud.google.com/go/beyondcorp v1.0.3 h1:VXf9SnrnSmj2BF2cHkoTHvOUp8gjsz1KJFOMW7czdsY= -cloud.google.com/go/beyondcorp v1.0.3/go.mod h1:HcBvnEd7eYr+HGDd5ZbuVmBYX019C6CEXBonXbCVwJo= -cloud.google.com/go/bigquery v1.57.1 h1:FiULdbbzUxWD0Y4ZGPSVCDLvqRSyCIO6zKV7E2nf5uA= -cloud.google.com/go/bigquery v1.57.1/go.mod h1:iYzC0tGVWt1jqSzBHqCr3lrRn0u13E8e+AqowBsDgug= -cloud.google.com/go/billing v1.17.4 h1:77/4kCqzH6Ou5CCDzNmqmboE+WvbwFBJmw1QZQz19AI= -cloud.google.com/go/billing v1.17.4/go.mod h1:5DOYQStCxquGprqfuid/7haD7th74kyMBHkjO/OvDtk= -cloud.google.com/go/binaryauthorization v1.7.3 h1:3R6WYn1JKIaVicBmo18jXubu7xh4mMkmbIgsTXk0cBA= -cloud.google.com/go/binaryauthorization v1.7.3/go.mod h1:VQ/nUGRKhrStlGr+8GMS8f6/vznYLkdK5vaKfdCIpvU= -cloud.google.com/go/certificatemanager v1.7.4 h1:5YMQ3Q+dqGpwUZ9X5sipsOQ1fLPsxod9HNq0+nrqc6I= -cloud.google.com/go/certificatemanager v1.7.4/go.mod h1:FHAylPe/6IIKuaRmHbjbdLhGhVQ+CWHSD5Jq0k4+cCE= -cloud.google.com/go/channel v1.17.3 h1:Rd4+fBrjiN6tZ4TR8R/38elkyEkz6oogGDr7jDyjmMY= -cloud.google.com/go/channel v1.17.3/go.mod h1:QcEBuZLGGrUMm7kNj9IbU1ZfmJq2apotsV83hbxX7eE= -cloud.google.com/go/cloudbuild v1.15.0 h1:9IHfEMWdCklJ1cwouoiQrnxmP0q3pH7JUt8Hqx4Qbck= -cloud.google.com/go/cloudbuild v1.15.0/go.mod h1:eIXYWmRt3UtggLnFGx4JvXcMj4kShhVzGndL1LwleEM= -cloud.google.com/go/clouddms v1.7.3 h1:xe/wJKz55VO1+L891a1EG9lVUgfHr9Ju/I3xh1nwF84= -cloud.google.com/go/clouddms v1.7.3/go.mod h1:fkN2HQQNUYInAU3NQ3vRLkV2iWs8lIdmBKOx4nrL6Hc= -cloud.google.com/go/cloudtasks v1.12.4 h1:5xXuFfAjg0Z5Wb81j2GAbB3e0bwroCeSF+5jBn/L650= -cloud.google.com/go/cloudtasks v1.12.4/go.mod h1:BEPu0Gtt2dU6FxZHNqqNdGqIG86qyWKBPGnsb7udGY0= -cloud.google.com/go/contactcenterinsights v1.12.0 h1:wP41IUA4ucMVooj/TP53jd7vbNjWrDkAPOeulVJGT5U= -cloud.google.com/go/contactcenterinsights v1.12.0/go.mod h1:HHX5wrz5LHVAwfI2smIotQG9x8Qd6gYilaHcLLLmNis= -cloud.google.com/go/container v1.28.0 h1:/o82CFWXIYnT9p/07SnRgybqL3Pmmu86jYIlzlJVUBY= -cloud.google.com/go/container v1.28.0/go.mod h1:b1A1gJeTBXVLQ6GGw9/9M4FG94BEGsqJ5+t4d/3N7O4= -cloud.google.com/go/containeranalysis v0.11.3 h1:5rhYLX+3a01drpREqBZVXR9YmWH45RnML++8NsCtuD8= -cloud.google.com/go/containeranalysis v0.11.3/go.mod h1:kMeST7yWFQMGjiG9K7Eov+fPNQcGhb8mXj/UcTiWw9U= -cloud.google.com/go/datacatalog v1.19.0 h1:rbYNmHwvAOOwnW2FPXYkaK3Mf1MmGqRzK0mMiIEyLdo= -cloud.google.com/go/datacatalog v1.19.0/go.mod h1:5FR6ZIF8RZrtml0VUao22FxhdjkoG+a0866rEnObryM= -cloud.google.com/go/dataflow v0.9.4 h1:7VmCNWcPJBS/srN2QnStTB6nu4Eb5TMcpkmtaPVhRt4= -cloud.google.com/go/dataflow v0.9.4/go.mod h1:4G8vAkHYCSzU8b/kmsoR2lWyHJD85oMJPHMtan40K8w= -cloud.google.com/go/dataform v0.9.1 h1:jV+EsDamGX6cE127+QAcCR/lergVeeZdEQ6DdrxW3sQ= -cloud.google.com/go/dataform v0.9.1/go.mod h1:pWTg+zGQ7i16pyn0bS1ruqIE91SdL2FDMvEYu/8oQxs= -cloud.google.com/go/datafusion v1.7.4 h1:Q90alBEYlMi66zL5gMSGQHfbZLB55mOAg03DhwTTfsk= -cloud.google.com/go/datafusion v1.7.4/go.mod h1:BBs78WTOLYkT4GVZIXQCZT3GFpkpDN4aBY4NDX/jVlM= -cloud.google.com/go/datalabeling v0.8.4 h1:zrq4uMmunf2KFDl/7dS6iCDBBAxBnKVDyw6+ajz3yu0= -cloud.google.com/go/datalabeling v0.8.4/go.mod h1:Z1z3E6LHtffBGrNUkKwbwbDxTiXEApLzIgmymj8A3S8= -cloud.google.com/go/dataplex v1.11.2 h1:AfFFR15Ifh4U+Me1IBztrSd5CrasTODzy3x8KtDyHdc= -cloud.google.com/go/dataplex v1.11.2/go.mod h1:mHJYQQ2VEJHsyoC0OdNyy988DvEbPhqFs5OOLffLX0c= -cloud.google.com/go/dataproc/v2 v2.3.0 h1:tTVP9tTxmc8fixxOd/8s6Q6Pz/+yzn7r7XdZHretQH0= -cloud.google.com/go/dataproc/v2 v2.3.0/go.mod h1:G5R6GBc9r36SXv/RtZIVfB8SipI+xVn0bX5SxUzVYbY= -cloud.google.com/go/dataqna v0.8.4 h1:NJnu1kAPamZDs/if3bJ3+Wb6tjADHKL83NUWsaIp2zg= -cloud.google.com/go/dataqna v0.8.4/go.mod h1:mySRKjKg5Lz784P6sCov3p1QD+RZQONRMRjzGNcFd0c= -cloud.google.com/go/datastore v1.15.0 h1:0P9WcsQeTWjuD1H14JIY7XQscIPQ4Laje8ti96IC5vg= -cloud.google.com/go/datastore v1.15.0/go.mod h1:GAeStMBIt9bPS7jMJA85kgkpsMkvseWWXiaHya9Jes8= -cloud.google.com/go/datastream v1.10.3 h1:Z2sKPIB7bT2kMW5Uhxy44ZgdJzxzE5uKjavoW+EuHEE= -cloud.google.com/go/datastream v1.10.3/go.mod h1:YR0USzgjhqA/Id0Ycu1VvZe8hEWwrkjuXrGbzeDOSEA= -cloud.google.com/go/deploy v1.15.0 h1:ZdmYzRMTGkVyP1nXEUat9FpbJGJemDcNcx82RSSOElc= -cloud.google.com/go/deploy v1.15.0/go.mod h1:e5XOUI5D+YGldyLNZ21wbp9S8otJbBE4i88PtO9x/2g= -cloud.google.com/go/dialogflow v1.44.3 h1:cK/f88KX+YVR4tLH4clMQlvrLWD2qmKJQziusjGPjmc= -cloud.google.com/go/dialogflow v1.44.3/go.mod h1:mHly4vU7cPXVweuB5R0zsYKPMzy240aQdAu06SqBbAQ= -cloud.google.com/go/dlp v1.11.1 h1:OFlXedmPP/5//X1hBEeq3D9kUVm9fb6ywYANlpv/EsQ= -cloud.google.com/go/dlp v1.11.1/go.mod h1:/PA2EnioBeXTL/0hInwgj0rfsQb3lpE3R8XUJxqUNKI= -cloud.google.com/go/documentai v1.23.5 h1:KAlzT+q8qvRxAmhsJUvLtfFHH0PNvz3M79H6CgVBKL8= -cloud.google.com/go/documentai v1.23.5/go.mod h1:ghzBsyVTiVdkfKaUCum/9bGBEyBjDO4GfooEcYKhN+g= -cloud.google.com/go/domains v0.9.4 h1:ua4GvsDztZ5F3xqjeLKVRDeOvJshf5QFgWGg1CKti3A= -cloud.google.com/go/domains v0.9.4/go.mod h1:27jmJGShuXYdUNjyDG0SodTfT5RwLi7xmH334Gvi3fY= -cloud.google.com/go/edgecontainer v1.1.4 h1:Szy3Q/N6bqgQGyxqjI+6xJZbmvPvnFHp3UZr95DKcQ0= -cloud.google.com/go/edgecontainer v1.1.4/go.mod h1:AvFdVuZuVGdgaE5YvlL1faAoa1ndRR/5XhXZvPBHbsE= -cloud.google.com/go/errorreporting v0.3.0 h1:kj1XEWMu8P0qlLhm3FwcaFsUvXChV/OraZwA70trRR0= -cloud.google.com/go/errorreporting v0.3.0/go.mod h1:xsP2yaAp+OAW4OIm60An2bbLpqIhKXdWR/tawvl7QzU= -cloud.google.com/go/essentialcontacts v1.6.5 h1:S2if6wkjR4JCEAfDtIiYtD+sTz/oXjh2NUG4cgT1y/Q= -cloud.google.com/go/essentialcontacts v1.6.5/go.mod h1:jjYbPzw0x+yglXC890l6ECJWdYeZ5dlYACTFL0U/VuM= -cloud.google.com/go/eventarc v1.13.3 h1:+pFmO4eu4dOVipSaFBLkmqrRYG94Xl/TQZFOeohkuqU= -cloud.google.com/go/eventarc v1.13.3/go.mod h1:RWH10IAZIRcj1s/vClXkBgMHwh59ts7hSWcqD3kaclg= -cloud.google.com/go/filestore v1.8.0 h1:/+wUEGwk3x3Kxomi2cP5dsR8+SIXxo7M0THDjreFSYo= -cloud.google.com/go/filestore v1.8.0/go.mod h1:S5JCxIbFjeBhWMTfIYH2Jx24J6BqjwpkkPl+nBA5DlI= -cloud.google.com/go/firestore v1.14.0 h1:8aLcKnMPoldYU3YHgu4t2exrKhLQkqaXAGqT0ljrFVw= -cloud.google.com/go/firestore v1.14.0/go.mod h1:96MVaHLsEhbvkBEdZgfN+AS/GIkco1LRpH9Xp9YZfzQ= -cloud.google.com/go/functions v1.15.4 h1:ZjdiV3MyumRM6++1Ixu6N0VV9LAGlCX4AhW6Yjr1t+U= -cloud.google.com/go/functions v1.15.4/go.mod h1:CAsTc3VlRMVvx+XqXxKqVevguqJpnVip4DdonFsX28I= -cloud.google.com/go/gkebackup v1.3.4 h1:KhnOrr9A1tXYIYeXKqCKbCI8TL2ZNGiD3dm+d7BDUBg= -cloud.google.com/go/gkebackup v1.3.4/go.mod h1:gLVlbM8h/nHIs09ns1qx3q3eaXcGSELgNu1DWXYz1HI= -cloud.google.com/go/gkeconnect v0.8.4 h1:1JLpZl31YhQDQeJ98tK6QiwTpgHFYRJwpntggpQQWis= -cloud.google.com/go/gkeconnect v0.8.4/go.mod h1:84hZz4UMlDCKl8ifVW8layK4WHlMAFeq8vbzjU0yJkw= -cloud.google.com/go/gkehub v0.14.4 h1:J5tYUtb3r0cl2mM7+YHvV32eL+uZQ7lONyUZnPikCEo= -cloud.google.com/go/gkehub v0.14.4/go.mod h1:Xispfu2MqnnFt8rV/2/3o73SK1snL8s9dYJ9G2oQMfc= -cloud.google.com/go/gkemulticloud v1.0.3 h1:NmJsNX9uQ2CT78957xnjXZb26TDIMvv+d5W2vVUt0Pg= -cloud.google.com/go/gkemulticloud v1.0.3/go.mod h1:7NpJBN94U6DY1xHIbsDqB2+TFZUfjLUKLjUX8NGLor0= -cloud.google.com/go/gsuiteaddons v1.6.4 h1:uuw2Xd37yHftViSI8J2hUcCS8S7SH3ZWH09sUDLW30Q= -cloud.google.com/go/gsuiteaddons v1.6.4/go.mod h1:rxtstw7Fx22uLOXBpsvb9DUbC+fiXs7rF4U29KHM/pE= -cloud.google.com/go/iap v1.9.3 h1:M4vDbQ4TLXdaljXVZSwW7XtxpwXUUarY2lIs66m0aCM= -cloud.google.com/go/iap v1.9.3/go.mod h1:DTdutSZBqkkOm2HEOTBzhZxh2mwwxshfD/h3yofAiCw= -cloud.google.com/go/ids v1.4.4 h1:VuFqv2ctf/A7AyKlNxVvlHTzjrEvumWaZflUzBPz/M4= -cloud.google.com/go/ids v1.4.4/go.mod h1:z+WUc2eEl6S/1aZWzwtVNWoSZslgzPxAboS0lZX0HjI= -cloud.google.com/go/iot v1.7.4 h1:m1WljtkZnvLTIRYW1YTOv5A6H1yKgLHR6nU7O8yf27w= -cloud.google.com/go/iot v1.7.4/go.mod h1:3TWqDVvsddYBG++nHSZmluoCAVGr1hAcabbWZNKEZLk= -cloud.google.com/go/kms v1.15.5 h1:pj1sRfut2eRbD9pFRjNnPNg/CzJPuQAzUujMIM1vVeM= -cloud.google.com/go/kms v1.15.5/go.mod h1:cU2H5jnp6G2TDpUGZyqTCoy1n16fbubHZjmVXSMtwDI= -cloud.google.com/go/language v1.12.2 h1:zg9uq2yS9PGIOdc0Kz/l+zMtOlxKWonZjjo5w5YPG2A= -cloud.google.com/go/language v1.12.2/go.mod h1:9idWapzr/JKXBBQ4lWqVX/hcadxB194ry20m/bTrhWc= -cloud.google.com/go/lifesciences v0.9.4 h1:rZEI/UxcxVKEzyoRS/kdJ1VoolNItRWjNN0Uk9tfexg= -cloud.google.com/go/lifesciences v0.9.4/go.mod h1:bhm64duKhMi7s9jR9WYJYvjAFJwRqNj+Nia7hF0Z7JA= -cloud.google.com/go/logging v1.8.1 h1:26skQWPeYhvIasWKm48+Eq7oUqdcdbwsCVwz5Ys0FvU= -cloud.google.com/go/logging v1.8.1/go.mod h1:TJjR+SimHwuC8MZ9cjByQulAMgni+RkXeI3wwctHJEI= -cloud.google.com/go/longrunning v0.5.4 h1:w8xEcbZodnA2BbW6sVirkkoC+1gP8wS57EUUgGS0GVg= -cloud.google.com/go/longrunning v0.5.4/go.mod h1:zqNVncI0BOP8ST6XQD1+VcvuShMmq7+xFSzOL++V0dI= -cloud.google.com/go/managedidentities v1.6.4 h1:SF/u1IJduMqQQdJA4MDyivlIQ4SrV5qAawkr/ZEREkY= -cloud.google.com/go/managedidentities v1.6.4/go.mod h1:WgyaECfHmF00t/1Uk8Oun3CQ2PGUtjc3e9Alh79wyiM= -cloud.google.com/go/maps v1.6.1 h1:2+eMp/1MvMPp5qrSOd3vtnLKa/pylt+krVRqET3jWsM= -cloud.google.com/go/maps v1.6.1/go.mod h1:4+buOHhYXFBp58Zj/K+Lc1rCmJssxxF4pJ5CJnhdz18= -cloud.google.com/go/mediatranslation v0.8.4 h1:VRCQfZB4s6jN0CSy7+cO3m4ewNwgVnaePanVCQh/9Z4= -cloud.google.com/go/mediatranslation v0.8.4/go.mod h1:9WstgtNVAdN53m6TQa5GjIjLqKQPXe74hwSCxUP6nj4= -cloud.google.com/go/memcache v1.10.4 h1:cdex/ayDd294XBj2cGeMe6Y+H1JvhN8y78B9UW7pxuQ= -cloud.google.com/go/memcache v1.10.4/go.mod h1:v/d8PuC8d1gD6Yn5+I3INzLR01IDn0N4Ym56RgikSI0= -cloud.google.com/go/metastore v1.13.3 h1:94l/Yxg9oBZjin2bzI79oK05feYefieDq0o5fjLSkC8= -cloud.google.com/go/metastore v1.13.3/go.mod h1:K+wdjXdtkdk7AQg4+sXS8bRrQa9gcOr+foOMF2tqINE= -cloud.google.com/go/monitoring v1.16.3 h1:mf2SN9qSoBtIgiMA4R/y4VADPWZA7VCNJA079qLaZQ8= -cloud.google.com/go/monitoring v1.16.3/go.mod h1:KwSsX5+8PnXv5NJnICZzW2R8pWTis8ypC4zmdRD63Tw= -cloud.google.com/go/networkconnectivity v1.14.3 h1:e9lUkCe2BexsqsUc2bjV8+gFBpQa54J+/F3qKVtW+wA= -cloud.google.com/go/networkconnectivity v1.14.3/go.mod h1:4aoeFdrJpYEXNvrnfyD5kIzs8YtHg945Og4koAjHQek= -cloud.google.com/go/networkmanagement v1.9.3 h1:HsQk4FNKJUX04k3OI6gUsoveiHMGvDRqlaFM2xGyvqU= -cloud.google.com/go/networkmanagement v1.9.3/go.mod h1:y7WMO1bRLaP5h3Obm4tey+NquUvB93Co1oh4wpL+XcU= -cloud.google.com/go/networksecurity v0.9.4 h1:947tNIPnj1bMGTIEBo3fc4QrrFKS5hh0bFVsHmFm4Vo= -cloud.google.com/go/networksecurity v0.9.4/go.mod h1:E9CeMZ2zDsNBkr8axKSYm8XyTqNhiCHf1JO/Vb8mD1w= -cloud.google.com/go/notebooks v1.11.2 h1:eTOTfNL1yM6L/PCtquJwjWg7ZZGR0URFaFgbs8kllbM= -cloud.google.com/go/notebooks v1.11.2/go.mod h1:z0tlHI/lREXC8BS2mIsUeR3agM1AkgLiS+Isov3SS70= -cloud.google.com/go/optimization v1.6.2 h1:iFsoexcp13cGT3k/Hv8PA5aK+FP7FnbhwDO9llnruas= -cloud.google.com/go/optimization v1.6.2/go.mod h1:mWNZ7B9/EyMCcwNl1frUGEuY6CPijSkz88Fz2vwKPOY= -cloud.google.com/go/orchestration v1.8.4 h1:kgwZ2f6qMMYIVBtUGGoU8yjYWwMTHDanLwM/CQCFaoQ= -cloud.google.com/go/orchestration v1.8.4/go.mod h1:d0lywZSVYtIoSZXb0iFjv9SaL13PGyVOKDxqGxEf/qI= -cloud.google.com/go/orgpolicy v1.11.4 h1:RWuXQDr9GDYhjmrredQJC7aY7cbyqP9ZuLbq5GJGves= -cloud.google.com/go/orgpolicy v1.11.4/go.mod h1:0+aNV/nrfoTQ4Mytv+Aw+stBDBjNf4d8fYRA9herfJI= -cloud.google.com/go/osconfig v1.12.4 h1:OrRCIYEAbrbXdhm13/JINn9pQchvTTIzgmOCA7uJw8I= -cloud.google.com/go/osconfig v1.12.4/go.mod h1:B1qEwJ/jzqSRslvdOCI8Kdnp0gSng0xW4LOnIebQomA= -cloud.google.com/go/oslogin v1.12.2 h1:NP/KgsD9+0r9hmHC5wKye0vJXVwdciv219DtYKYjgqE= -cloud.google.com/go/oslogin v1.12.2/go.mod h1:CQ3V8Jvw4Qo4WRhNPF0o+HAM4DiLuE27Ul9CX9g2QdY= -cloud.google.com/go/phishingprotection v0.8.4 h1:sPLUQkHq6b4AL0czSJZ0jd6vL55GSTHz2B3Md+TCZI0= -cloud.google.com/go/phishingprotection v0.8.4/go.mod h1:6b3kNPAc2AQ6jZfFHioZKg9MQNybDg4ixFd4RPZZ2nE= -cloud.google.com/go/policytroubleshooter v1.10.2 h1:sq+ScLP83d7GJy9+wpwYJVnY+q6xNTXwOdRIuYjvHT4= -cloud.google.com/go/policytroubleshooter v1.10.2/go.mod h1:m4uF3f6LseVEnMV6nknlN2vYGRb+75ylQwJdnOXfnv0= -cloud.google.com/go/privatecatalog v0.9.4 h1:Vo10IpWKbNvc/z/QZPVXgCiwfjpWoZ/wbgful4Uh/4E= -cloud.google.com/go/privatecatalog v0.9.4/go.mod h1:SOjm93f+5hp/U3PqMZAHTtBtluqLygrDrVO8X8tYtG0= -cloud.google.com/go/pubsub v1.33.0 h1:6SPCPvWav64tj0sVX/+npCBKhUi/UjJehy9op/V3p2g= -cloud.google.com/go/pubsub v1.33.0/go.mod h1:f+w71I33OMyxf9VpMVcZbnG5KSUkCOUHYpFd5U1GdRc= -cloud.google.com/go/pubsublite v1.8.1 h1:pX+idpWMIH30/K7c0epN6V703xpIcMXWRjKJsz0tYGY= -cloud.google.com/go/pubsublite v1.8.1/go.mod h1:fOLdU4f5xldK4RGJrBMm+J7zMWNj/k4PxwEZXy39QS0= -cloud.google.com/go/recaptchaenterprise/v2 v2.8.4 h1:KOlLHLv3h3HwcZAkx91ubM3Oztz3JtT3ZacAJhWDorQ= -cloud.google.com/go/recaptchaenterprise/v2 v2.8.4/go.mod h1:Dak54rw6lC2gBY8FBznpOCAR58wKf+R+ZSJRoeJok4w= -cloud.google.com/go/recommendationengine v0.8.4 h1:JRiwe4hvu3auuh2hujiTc2qNgPPfVp+Q8KOpsXlEzKQ= -cloud.google.com/go/recommendationengine v0.8.4/go.mod h1:GEteCf1PATl5v5ZsQ60sTClUE0phbWmo3rQ1Js8louU= -cloud.google.com/go/recommender v1.11.3 h1:VndmgyS/J3+izR8V8BHa7HV/uun8//ivQ3k5eVKKyyM= -cloud.google.com/go/recommender v1.11.3/go.mod h1:+FJosKKJSId1MBFeJ/TTyoGQZiEelQQIZMKYYD8ruK4= -cloud.google.com/go/redis v1.14.1 h1:J9cEHxG9YLmA9o4jTSvWt/RuVEn6MTrPlYSCRHujxDQ= -cloud.google.com/go/redis v1.14.1/go.mod h1:MbmBxN8bEnQI4doZPC1BzADU4HGocHBk2de3SbgOkqs= -cloud.google.com/go/resourcemanager v1.9.4 h1:JwZ7Ggle54XQ/FVYSBrMLOQIKoIT/uer8mmNvNLK51k= -cloud.google.com/go/resourcemanager v1.9.4/go.mod h1:N1dhP9RFvo3lUfwtfLWVxfUWq8+KUQ+XLlHLH3BoFJ0= -cloud.google.com/go/resourcesettings v1.6.4 h1:yTIL2CsZswmMfFyx2Ic77oLVzfBFoWBYgpkgiSPnC4Y= -cloud.google.com/go/resourcesettings v1.6.4/go.mod h1:pYTTkWdv2lmQcjsthbZLNBP4QW140cs7wqA3DuqErVI= -cloud.google.com/go/retail v1.14.4 h1:geqdX1FNqqL2p0ADXjPpw8lq986iv5GrVcieTYafuJQ= -cloud.google.com/go/retail v1.14.4/go.mod h1:l/N7cMtY78yRnJqp5JW8emy7MB1nz8E4t2yfOmklYfg= -cloud.google.com/go/run v1.3.3 h1:qdfZteAm+vgzN1iXzILo3nJFQbzziudkJrvd9wCf3FQ= -cloud.google.com/go/run v1.3.3/go.mod h1:WSM5pGyJ7cfYyYbONVQBN4buz42zFqwG67Q3ch07iK4= -cloud.google.com/go/scheduler v1.10.5 h1:eMEettHlFhG5pXsoHouIM5nRT+k+zU4+GUvRtnxhuVI= -cloud.google.com/go/scheduler v1.10.5/go.mod h1:MTuXcrJC9tqOHhixdbHDFSIuh7xZF2IysiINDuiq6NI= -cloud.google.com/go/secretmanager v1.11.4 h1:krnX9qpG2kR2fJ+u+uNyNo+ACVhplIAS4Pu7u+4gd+k= -cloud.google.com/go/secretmanager v1.11.4/go.mod h1:wreJlbS9Zdq21lMzWmJ0XhWW2ZxgPeahsqeV/vZoJ3w= -cloud.google.com/go/security v1.15.4 h1:sdnh4Islb1ljaNhpIXlIPgb3eYj70QWgPVDKOUYvzJc= -cloud.google.com/go/security v1.15.4/go.mod h1:oN7C2uIZKhxCLiAAijKUCuHLZbIt/ghYEo8MqwD/Ty4= -cloud.google.com/go/securitycenter v1.24.2 h1:qCEyXoJoxNKKA1bDywBjjqCB7ODXazzHnVWnG5Uqd1M= -cloud.google.com/go/securitycenter v1.24.2/go.mod h1:l1XejOngggzqwr4Fa2Cn+iWZGf+aBLTXtB/vXjy5vXM= -cloud.google.com/go/servicedirectory v1.11.3 h1:5niCMfkw+jifmFtbBrtRedbXkJm3fubSR/KHbxSJZVM= -cloud.google.com/go/servicedirectory v1.11.3/go.mod h1:LV+cHkomRLr67YoQy3Xq2tUXBGOs5z5bPofdq7qtiAw= -cloud.google.com/go/shell v1.7.4 h1:nurhlJcSVFZneoRZgkBEHumTYf/kFJptCK2eBUq/88M= -cloud.google.com/go/shell v1.7.4/go.mod h1:yLeXB8eKLxw0dpEmXQ/FjriYrBijNsONpwnWsdPqlKM= -cloud.google.com/go/spanner v1.53.0 h1:/NzWQJ1MEhdRcffiutRKbW/AIGVKhcTeivWTDjEyCCo= -cloud.google.com/go/spanner v1.53.0/go.mod h1:liG4iCeLqm5L3fFLU5whFITqP0e0orsAW1uUSrd4rws= -cloud.google.com/go/speech v1.21.0 h1:qkxNao58oF8ghAHE1Eghen7XepawYEN5zuZXYWaUTA4= -cloud.google.com/go/speech v1.21.0/go.mod h1:wwolycgONvfz2EDU8rKuHRW3+wc9ILPsAWoikBEWavY= -cloud.google.com/go/storagetransfer v1.10.3 h1:YM1dnj5gLjfL6aDldO2s4GeU8JoAvH1xyIwXre63KmI= -cloud.google.com/go/storagetransfer v1.10.3/go.mod h1:Up8LY2p6X68SZ+WToswpQbQHnJpOty/ACcMafuey8gc= -cloud.google.com/go/talent v1.6.5 h1:LnRJhhYkODDBoTwf6BeYkiJHFw9k+1mAFNyArwZUZAs= -cloud.google.com/go/talent v1.6.5/go.mod h1:Mf5cma696HmE+P2BWJ/ZwYqeJXEeU0UqjHFXVLadEDI= -cloud.google.com/go/texttospeech v1.7.4 h1:ahrzTgr7uAbvebuhkBAAVU6kRwVD0HWsmDsvMhtad5Q= -cloud.google.com/go/texttospeech v1.7.4/go.mod h1:vgv0002WvR4liGuSd5BJbWy4nDn5Ozco0uJymY5+U74= -cloud.google.com/go/tpu v1.6.4 h1:XIEH5c0WeYGaVy9H+UueiTaf3NI6XNdB4/v6TFQJxtE= -cloud.google.com/go/tpu v1.6.4/go.mod h1:NAm9q3Rq2wIlGnOhpYICNI7+bpBebMJbh0yyp3aNw1Y= -cloud.google.com/go/trace v1.10.4 h1:2qOAuAzNezwW3QN+t41BtkDJOG42HywL73q8x/f6fnM= -cloud.google.com/go/trace v1.10.4/go.mod h1:Nso99EDIK8Mj5/zmB+iGr9dosS/bzWCJ8wGmE6TXNWY= -cloud.google.com/go/translate v1.9.3 h1:t5WXTqlrk8VVJu/i3WrYQACjzYJiff5szARHiyqqPzI= -cloud.google.com/go/translate v1.9.3/go.mod h1:Kbq9RggWsbqZ9W5YpM94Q1Xv4dshw/gr/SHfsl5yCZ0= -cloud.google.com/go/video v1.20.3 h1:Xrpbm2S9UFQ1pZEeJt9Vqm5t2T/z9y/M3rNXhFoo8Is= -cloud.google.com/go/video v1.20.3/go.mod h1:TnH/mNZKVHeNtpamsSPygSR0iHtvrR/cW1/GDjN5+GU= -cloud.google.com/go/videointelligence v1.11.4 h1:YS4j7lY0zxYyneTFXjBJUj2r4CFe/UoIi/PJG0Zt/Rg= -cloud.google.com/go/videointelligence v1.11.4/go.mod h1:kPBMAYsTPFiQxMLmmjpcZUMklJp3nC9+ipJJtprccD8= -cloud.google.com/go/vision/v2 v2.7.5 h1:T/ujUghvEaTb+YnFY/jiYwVAkMbIC8EieK0CJo6B4vg= -cloud.google.com/go/vision/v2 v2.7.5/go.mod h1:GcviprJLFfK9OLf0z8Gm6lQb6ZFUulvpZws+mm6yPLM= -cloud.google.com/go/vmmigration v1.7.4 h1:qPNdab4aGgtaRX+51jCOtJxlJp6P26qua4o1xxUDjpc= -cloud.google.com/go/vmmigration v1.7.4/go.mod h1:yBXCmiLaB99hEl/G9ZooNx2GyzgsjKnw5fWcINRgD70= -cloud.google.com/go/vmwareengine v1.0.3 h1:WY526PqM6QNmFHSqe2sRfK6gRpzWjmL98UFkql2+JDM= -cloud.google.com/go/vmwareengine v1.0.3/go.mod h1:QSpdZ1stlbfKtyt6Iu19M6XRxjmXO+vb5a/R6Fvy2y4= -cloud.google.com/go/vpcaccess v1.7.4 h1:zbs3V+9ux45KYq8lxxn/wgXole6SlBHHKKyZhNJoS+8= -cloud.google.com/go/vpcaccess v1.7.4/go.mod h1:lA0KTvhtEOb/VOdnH/gwPuOzGgM+CWsmGu6bb4IoMKk= -cloud.google.com/go/webrisk v1.9.4 h1:iceR3k0BCRZgf2D/NiKviVMFfuNC9LmeNLtxUFRB/wI= -cloud.google.com/go/webrisk v1.9.4/go.mod h1:w7m4Ib4C+OseSr2GL66m0zMBywdrVNTDKsdEsfMl7X0= -cloud.google.com/go/websecurityscanner v1.6.4 h1:5Gp7h5j7jywxLUp6NTpjNPkgZb3ngl0tUSw6ICWvtJQ= -cloud.google.com/go/websecurityscanner v1.6.4/go.mod h1:mUiyMQ+dGpPPRkHgknIZeCzSHJ45+fY4F52nZFDHm2o= -cloud.google.com/go/workflows v1.12.3 h1:qocsqETmLAl34mSa01hKZjcqAvt699gaoFbooGGMvaM= -cloud.google.com/go/workflows v1.12.3/go.mod h1:fmOUeeqEwPzIU81foMjTRQIdwQHADi/vEr1cx9R1m5g= -contrib.go.opencensus.io/exporter/aws v0.0.0-20230502192102-15967c811cec h1:CSNP8nIEQt4sZEo2sGUiWSmVJ9c5QdyIQvwzZAsn+8Y= -contrib.go.opencensus.io/exporter/aws v0.0.0-20230502192102-15967c811cec/go.mod h1:uu1P0UCM/6RbsMrgPa98ll8ZcHM858i/AD06a9aLRCA= -contrib.go.opencensus.io/exporter/stackdriver v0.13.14 h1:zBakwHardp9Jcb8sQHcHpXy/0+JIb1M8KjigCJzx7+4= -contrib.go.opencensus.io/exporter/stackdriver v0.13.14/go.mod h1:5pSSGY0Bhuk7waTHuDf4aQ8D2DrhgETRo9fy6k3Xlzc= -contrib.go.opencensus.io/integrations/ocsql v0.1.7 h1:G3k7C0/W44zcqkpRSFyjU9f6HZkbwIrL//qqnlqWZ60= -dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9 h1:VpgP7xuJadIUuKccphEpTJnWhS2jkQyMt6Y7pJCD7fY= -gioui.org v0.0.0-20210308172011-57750fc8a0a6 h1:K72hopUosKG3ntOPNG4OzzbuhxGuVf06fa2la1/H/Ho= -github.com/AndreasBriese/bbloom v0.0.0-20190306092124-e2d15f34fcf9 h1:HD8gA2tkByhMAwYaFAX9w2l7vxvBQ5NMoxDrkhqhtn4= -github.com/Azure/azure-amqp-common-go/v3 v3.2.3 h1:uDF62mbd9bypXWi19V1bN5NZEO84JqgmI5G73ibAmrk= -github.com/Azure/azure-amqp-common-go/v3 v3.2.3/go.mod h1:7rPmbSfszeovxGfc5fSAXE4ehlXQZHpMja2OtxC2Tas= -github.com/Azure/azure-pipeline-go v0.2.3 h1:7U9HBg1JFK3jHl5qmo4CTZKFTVgMwdFHMVtCdfBE21U= -github.com/Azure/azure-sdk-for-go/sdk/keyvault/azkeys v0.10.0 h1:m/sWOGCREuSBqg2htVQTBY8nOZpyajYztF0vUvSZTuM= -github.com/Azure/azure-sdk-for-go/sdk/keyvault/azkeys v0.10.0/go.mod h1:Pu5Zksi2KrU7LPbZbNINx6fuVrUp/ffvpxdDj+i8LeE= -github.com/Azure/azure-sdk-for-go/sdk/keyvault/internal v0.7.1 h1:FbH3BbSb4bvGluTesZZ+ttN/MDsnMmQP36OSnDuSXqw= -github.com/Azure/azure-sdk-for-go/sdk/keyvault/internal v0.7.1/go.mod h1:9V2j0jn9jDEkCkv8w/bKTNppX/d0FVA1ud77xCIP4KA= -github.com/Azure/azure-sdk-for-go/sdk/messaging/azservicebus v1.5.0 h1:HKHkea1fdm18LT8VAxTVZgJpPsLgv+0NZhmtus1UqJQ= -github.com/Azure/azure-sdk-for-go/sdk/messaging/azservicebus v1.5.0/go.mod h1:4BbKA+mRmmTP8VaLfDPNF5nOdhRm5upG3AXVWfv1dxc= -github.com/Azure/azure-service-bus-go v0.11.5 h1:EVMicXGNrSX+rHRCBgm/TRQ4VUZ1m3yAYM/AB2R/SOs= -github.com/Azure/azure-storage-blob-go v0.14.0 h1:1BCg74AmVdYwO3dlKwtFU1V0wU2PZdREkXvAmZJRUlM= -github.com/Azure/go-amqp v1.0.2 h1:zHCHId+kKC7fO8IkwyZJnWMvtRXhYC0VJtD0GYkHc6M= -github.com/Azure/go-amqp v1.0.2/go.mod h1:vZAogwdrkbyK3Mla8m/CxSc/aKdnTZ4IbPxl51Y5WZE= -github.com/Azure/go-autorest/autorest v0.11.22 h1:bXiQwDjrRmBQOE67bwlvUKAC1EU1yZTPQ38c+bstZws= -github.com/Azure/go-autorest/autorest/adal v0.9.17 h1:esOPl2dhcz9P3jqBSJ8tPGEj2EqzPPT6zfyuloiogKY= -github.com/Azure/go-autorest/autorest/azure/auth v0.5.9 h1:Y2CgdzitFDsdMwYMzf9LIZWrrTFysqbRc7b94XVVJ78= -github.com/Azure/go-autorest/autorest/azure/cli v0.4.2 h1:dMOmEJfkLKW/7JsokJqkyoYSgmR08hi9KrhjZb+JALY= -github.com/Azure/go-autorest/autorest/date v0.3.0 h1:7gUk1U5M/CQbp9WoqinNzJar+8KY+LPI6wiWrP/myHw= -github.com/Azure/go-autorest/autorest/mocks v0.4.1 h1:K0laFcLE6VLTOwNgSxaGbUcLPuGXlNkbVvq4cW4nIHk= -github.com/Azure/go-autorest/autorest/validation v0.3.1 h1:AgyqjAd94fwNAoTjl/WQXg4VvFeRFpO+UhNyRXqF1ac= -github.com/Azure/go-autorest/logger v0.2.1 h1:IG7i4p/mDa2Ce4TRyAO8IHnVhAVF3RFU+ZtXWSmf4Tg= -github.com/Azure/go-autorest/tracing v0.6.0 h1:TYi4+3m5t6K48TGI9AUdb+IzbnSxvnvUMfuitfgcfuo= -github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802 h1:1BDTz0u9nC3//pOCMdNH+CiXJVYJh5UQNCOBG7jbELc= -github.com/CloudyKit/fastprinter v0.0.0-20200109182630-33d98a066a53 h1:sR+/8Yb4slttB4vD+b9btVEnWgL3Q00OBTzVT8B9C0c= -github.com/CloudyKit/jet v2.1.3-0.20180809161101-62edd43e4f88+incompatible h1:rZgFj+Gtf3NMi/U5FvCvhzaxzW/TaPYgUYx3bAPz9DE= -github.com/CloudyKit/jet/v3 v3.0.0 h1:1PwO5w5VCtlUUl+KTOBsTGZlhjWkcybsGaAau52tOy8= -github.com/CloudyKit/jet/v6 v6.1.0 h1:hvO96X345XagdH1fAoBjpBYG4a1ghhL/QzalkduPuXk= -github.com/CloudyKit/jet/v6 v6.1.0/go.mod h1:d3ypHeIRNo2+XyqnGA8s+aphtcVpjP5hPwP/Lzo7Ro4= -github.com/GoogleCloudPlatform/cloudsql-proxy v1.33.14 h1:9bRF9/edlX1kycHVm/icATaIWfVyHcUB9c68iWWeNok= -github.com/GoogleCloudPlatform/cloudsql-proxy v1.33.14/go.mod h1:vroGijye9h4A6kMWeCtk9/zIh5ebseV/JmbKJ0VL3w8= -github.com/HdrHistogram/hdrhistogram-go v1.1.2 h1:5IcZpTvzydCQeHzK4Ef/D5rrSqwxob0t8PQPMybUNFM= -github.com/HdrHistogram/hdrhistogram-go v1.1.2/go.mod h1:yDgFjdqOqDEKOvasDdhWNXYg9BVp4O+o5f6V/ehm6Oo= -github.com/Joker/hpp v1.0.0 h1:65+iuJYdRXv/XyN62C1uEmmOx3432rNG/rKlX6V7Kkc= -github.com/Joker/jade v1.0.1-0.20190614124447-d475f43051e7 h1:mreN1m/5VJ/Zc3b4pzj9qU6D9SRQ6Vm+3KfI328t3S8= -github.com/OneOfOne/xxhash v1.2.2 h1:KMrpdQIwFcEqXDklaen+P1axHaj9BSKzvpUUfnHldSE= -github.com/Shopify/goreferrer v0.0.0-20220729165902-8cddb4f5de06 h1:KkH3I3sJuOLP3TjA/dfr4NAY8bghDwnXiU7cTKxQqo0= -github.com/Shopify/goreferrer v0.0.0-20220729165902-8cddb4f5de06/go.mod h1:7erjKLwalezA0k99cWs5L11HWOAPNjdUZ6RxH1BXbbM= -github.com/ajg/form v1.5.1 h1:t9c7v8JUKu/XxOGBU0yjNpaMloxGEJhUkqFRq0ibGeU= -github.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af h1:wVe6/Ea46ZMeNkQjjBW6xcqyQA/j5e0D6GytH95g0gQ= -github.com/alecthomas/jsonschema v0.0.0-20220216202328-9eeeec9d044b h1:doCpXjVwui6HUN+xgNsNS3SZ0/jUZ68Eb+mJRNOZfog= -github.com/alecthomas/jsonschema v0.0.0-20220216202328-9eeeec9d044b/go.mod h1:/n6+1/DWPltRLWL/VKyUxg6tzsl5kHUCcraimt4vr60= -github.com/alecthomas/kingpin/v2 v2.3.2 h1:H0aULhgmSzN8xQ3nX1uxtdlTHYoPLu5AhHxWrKI6ocU= -github.com/alecthomas/kingpin/v2 v2.3.2/go.mod h1:0gyi0zQnjuFk8xrkNKamJoyUo382HRL7ATRpFZCw6tE= -github.com/alecthomas/units v0.0.0-20211218093645-b94a6e3cc137 h1:s6gZFSlWYmbqAuRjVTiNNhvNRfY2Wxp9nhfyel4rklc= -github.com/alecthomas/units v0.0.0-20211218093645-b94a6e3cc137/go.mod h1:OMCwj8VM1Kc9e19TLln2VL61YJF0x1XFtfdL4JdbSyE= -github.com/andybalholm/brotli v1.0.4 h1:V7DdXeJtZscaqfNuAdSRuRFzuiKlHSC/Zh3zl9qY3JY= -github.com/andybalholm/brotli v1.0.4/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= -github.com/antihax/optional v1.0.0 h1:xK2lYat7ZLaVVcIuj82J8kIro4V6kDe0AUDFboUCwcg= -github.com/araddon/dateparse v0.0.0-20210429162001-6b43995a97de h1:FxWPpzIjnTlhPwqqXc4/vE0f7GvRjuAsbW+HOIe8KnA= -github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6 h1:G1bPvciwNyF7IUmKXNt9Ak3m6u9DE1rF+RmtIkBpVdA= -github.com/armon/go-metrics v0.4.1 h1:hR91U9KYmb6bLBYLQjyM+3j+rcd/UhE+G78SFnF8gJA= -github.com/armon/go-metrics v0.4.1/go.mod h1:E6amYzXo6aW1tqzoZGT755KkbgrJsSdpwZ+3JqfkOG4= -github.com/aws/aws-sdk-go-v2/service/kms v1.26.3 h1:li5dFiK1tkAFXvOC9QPWAVWqTu8ZxpIR0KzKmof6TIE= -github.com/aws/aws-sdk-go-v2/service/kms v1.26.3/go.mod h1:N3++/sLV97B8Zliz7KRqNcojOX7iMBZWKiuit5FKtH0= -github.com/aws/aws-sdk-go-v2/service/secretsmanager v1.23.3 h1:NurfTBFmaehSiWMv5drydRWs3On0kwoBe1gWYFt+5ws= -github.com/aws/aws-sdk-go-v2/service/secretsmanager v1.23.3/go.mod h1:LDD9wCQ1tvjMIWEIFPvZ8JgJsEOjded+X5jav9tD/zg= -github.com/aws/aws-sdk-go-v2/service/sns v1.25.3 h1:6/Esm0BnUNrx+yy8AaslbaeJa8V40tTJ9N+tOihYWVo= -github.com/aws/aws-sdk-go-v2/service/sns v1.25.3/go.mod h1:GkPiLToDWySwNSsR4AVam/Sv8UAZuMlGe9dozvyRCPE= -github.com/aws/aws-sdk-go-v2/service/sqs v1.28.2 h1:MVg4eLi9uM1+YHYSfcCg1CR3mqtL6UJ9SF3VrMxKmUE= -github.com/aws/aws-sdk-go-v2/service/sqs v1.28.2/go.mod h1:7vHhhnzSGZcquR6+X7V+wDHdY8iOk5ge0z+FxoxkvJw= -github.com/aws/aws-sdk-go-v2/service/ssm v1.43.1 h1:QCZGFHZnzP0yRveI5X+5Cu54wdvpbgiuF3Qy3xBykyA= -github.com/aws/aws-sdk-go-v2/service/ssm v1.43.1/go.mod h1:Iw3+XCa7ARZWsPiV3Zozf5Hb3gD7pHDLKu9Xcc4iwDM= -github.com/aymerick/douceur v0.2.0 h1:Mv+mAeH1Q+n9Fr+oyamOlAkUNPWPlA8PPGR0QAaYuPk= -github.com/aymerick/douceur v0.2.0/go.mod h1:wlT5vV2O3h55X9m7iVYN0TBM0NH/MmbLnd30/FjWUq4= -github.com/aymerick/raymond v2.0.3-0.20180322193309-b565731e1464+incompatible h1:Ppm0npCCsmuR9oQaBtRuZcmILVE74aXE+AmrJj8L2ns= -github.com/boombuler/barcode v1.0.0 h1:s1TvRnXwL2xJRaccrdcBQMZxq6X7DvsMogtmJeHDdrc= -github.com/c2h5oh/datasize v0.0.0-20220606134207-859f65c6625b h1:6+ZFm0flnudZzdSE0JxlhR2hKnGPcNB35BjQf4RYQDY= -github.com/c2h5oh/datasize v0.0.0-20220606134207-859f65c6625b/go.mod h1:S/7n9copUssQ56c7aAgHqftWO4LTf4xY6CGWt8Bc+3M= -github.com/census-instrumentation/opencensus-proto v0.4.1 h1:iKLQ0xPNFxR/2hzXZMrBo8f1j86j5WHzznCCQxV/b8g= -github.com/census-instrumentation/opencensus-proto v0.4.1/go.mod h1:4T9NM4+4Vw91VeyqjLS6ao50K5bOcLKN6Q42XnYaRYw= -github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= -github.com/checkpoint-restore/go-criu/v5 v5.3.0 h1:wpFFOoomK3389ue2lAb0Boag6XPht5QYpipxmSNL4d8= -github.com/checkpoint-restore/go-criu/v5 v5.3.0/go.mod h1:E/eQpaFtUKGOOSEBZgmKAcn+zUUwWxqcaKZlF54wK8E= -github.com/cilium/ebpf v0.7.0 h1:1k/q3ATgxSXRdrmPfH8d7YK0GfqVsEKZAX9dQZvs56k= -github.com/cilium/ebpf v0.7.0/go.mod h1:/oI2+1shJiTGAMgl6/RgJr36Eo1jzrRcAWbcXO2usCA= -github.com/client9/misspell v0.3.4 h1:ta993UF76GwbvJcIo3Y68y/M3WxlpEHPWIGDkJYwzJI= -github.com/cncf/udpa/go v0.0.0-20220112060539-c52dc94e7fbe h1:QQ3GSy+MqSHxm/d8nCtnAiZdYFd45cYZPs8vOOIYKfk= -github.com/cncf/udpa/go v0.0.0-20220112060539-c52dc94e7fbe/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= -github.com/cncf/xds/go v0.0.0-20230607035331-e9ce68804cb4 h1:/inchEIKaYC1Akx+H+gqO04wryn5h75LSazbRlnya1k= -github.com/cncf/xds/go v0.0.0-20230607035331-e9ce68804cb4/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cockroachdb/apd v1.1.0 h1:3LFP3629v+1aKXU5Q37mxmRxX/pIu1nijXydLShEq5I= -github.com/cockroachdb/sentry-go v0.6.1-cockroachdb.2 h1:IKgmqgMQlVJIZj19CdocBeSfSaiCbEBZGKODaixqtHM= -github.com/codegangsta/inject v0.0.0-20150114235600-33e0aa1cb7c0 h1:sDMmm+q/3+BukdIpxwO365v/Rbspp2Nt5XntgQRXq8Q= -github.com/colinmarc/hdfs/v2 v2.1.1 h1:x0hw/m+o3UE20Scso/KCkvYNc9Di39TBlCfGMkJ1/a0= -github.com/containerd/console v1.0.3 h1:lIr7SlA5PxZyMV30bDW0MGbiOPXwc63yRuCP0ARubLw= -github.com/containerd/console v1.0.3/go.mod h1:7LqA/THxQ86k76b8c/EMSiaJ3h1eZkMkXar0TQ1gf3U= -github.com/coreos/etcd v3.3.10+incompatible h1:jFneRYjIvLMLhDLCzuTuU4rSJUjRplcJQ7pD7MnhC04= -github.com/coreos/go-etcd v2.0.0+incompatible h1:bXhRBIXoTm9BYHS3gE0TtQuyNZyeEMux2sDi4oo5YOo= -github.com/coreos/go-semver v0.3.0 h1:wkHLiw0WNATZnSG7epLsujiMCgPAc9xhjJ4tgnAxmfM= -github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= -github.com/coreos/go-systemd v0.0.0-20190719114852-fd7a80b32e1f h1:JOrtw2xFKzlg+cbHpyrpLDmnN1HqhBfnX7WDiW7eG2c= -github.com/coreos/go-systemd/v22 v22.3.2 h1:D9/bQk5vlXQFZ6Kwuu6zaiXJ9oTPe68++AzAJc1DzSI= -github.com/cpuguy83/go-md2man v1.0.10 h1:BSKMNlYxDvnunlTymqtgONjNnaRV1sTpcovwwjF22jk= -github.com/cpuguy83/go-md2man/v2 v2.0.2 h1:p1EgwI/C7NhT0JmVkwCD2ZBK8j4aeHQX2pMHHBfMQ6w= -github.com/cyberdelia/templates v0.0.0-20141128023046-ca7fffd4298c h1:/ovYnF02fwL0kvspmy9AuyKg1JhdTRUgPw4nUxd9oZM= -github.com/cyphar/filepath-securejoin v0.2.4 h1:Ugdm7cg7i6ZK6x3xDF1oEu1nfkyfH53EtKeQYTC3kyg= -github.com/cyphar/filepath-securejoin v0.2.4/go.mod h1:aPGpWjXOXUn2NCNjFvBE6aRxGGx79pTxQpKOJNYHHl4= -github.com/denisenkom/go-mssqldb v0.12.0 h1:VtrkII767ttSPNRfFekePK3sctr+joXgO58stqQbtUA= -github.com/devigned/tab v0.1.1 h1:3mD6Kb1mUOYeLpJvTVSDwSg5ZsfSxfvxGRTxRsJsITA= -github.com/dgraph-io/badger v1.6.0 h1:DshxFxZWXUcO0xX476VJC07Xsr6ZCBVRHKZ93Oh7Evo= -github.com/dgrijalva/jwt-go v3.2.0+incompatible h1:7qlOGliEKZXTDg6OTjfoBKDXWrumCAMpl/TFQ4/5kLM= -github.com/dgryski/go-lttb v0.0.0-20230207170358-f8fc36cdbff1 h1:dxwR3CStJdJamsIoMPCmxuIfBAPTgmzvFax+MvFav3M= -github.com/dgryski/go-lttb v0.0.0-20230207170358-f8fc36cdbff1/go.mod h1:UwftcHUI/qTYvLAxrWmANuRckf8+08O3C3hwStvkhDU= -github.com/dimchansky/utfbom v1.1.1 h1:vV6w1AhK4VMnhBno/TPVCoK9U/LP0PkLCS9tbxHdi/U= -github.com/dnaeon/go-vcr v1.2.0 h1:zHCHvJYTMh1N7xnV7zf1m1GPBF9Ad0Jk/whtQ1663qI= -github.com/eknkc/amber v0.0.0-20171010120322-cdade1c07385 h1:clC1lXBpe2kTj2VHdaIu9ajZQe4kcEY9j0NsnDDBZ3o= -github.com/envoyproxy/go-control-plane v0.11.1 h1:wSUXTlLfiAQRWs2F+p+EKOY9rUyis1MyGqJ2DIk5HpM= -github.com/envoyproxy/go-control-plane v0.11.1/go.mod h1:uhMcXKCQMEJHiAb0w+YGefQLaTEw+YhGluxZkrTmD0g= -github.com/envoyproxy/protoc-gen-validate v1.0.2 h1:QkIBuU5k+x7/QXPvPPnWXWlCdaBFApVqftFV6k087DA= -github.com/envoyproxy/protoc-gen-validate v1.0.2/go.mod h1:GpiZQP3dDbg4JouG/NNS7QWXpgx6x8QiMKdmN72jogE= -github.com/etcd-io/bbolt v1.3.3 h1:gSJmxrs37LgTqR/oyJBWok6k6SvXEUerFTbltIhXkBM= -github.com/fasthttp-contrib/websocket v0.0.0-20160511215533-1f3b11f56072 h1:DddqAaWDpywytcG8w/qoQ5sAN8X12d3Z3koB0C3Rxsc= -github.com/fatih/structs v1.1.0 h1:Q7juDM0QtcnhCpeyLGQKyg4TOIghuNXrkL32pHAUMxo= -github.com/felixge/fgprof v0.9.3 h1:VvyZxILNuCiUCSXtPtYmmtGvb65nqXh2QFWc0Wpf2/g= -github.com/felixge/fgprof v0.9.3/go.mod h1:RdbpDgzqYVh/T9fPELJyV7EYJuHB55UTEULNun8eiPw= -github.com/flosch/pongo2 v0.0.0-20190707114632-bbf5a6c351f4 h1:GY1+t5Dr9OKADM64SYnQjw/w99HMYvQ0A8/JoUkxVmc= -github.com/flosch/pongo2/v4 v4.0.2 h1:gv+5Pe3vaSVmiJvh/BZa82b7/00YUGm0PIyVVLop0Hw= -github.com/flosch/pongo2/v4 v4.0.2/go.mod h1:B5ObFANs/36VwxxlgKpdchIJHMvHB562PW+BWPhwZD8= -github.com/fogleman/gg v1.3.0 h1:/7zJX8F6AaYQc57WQCyN9cAIz+4bCJGO9B+dyW29am8= -github.com/form3tech-oss/jwt-go v3.2.2+incompatible h1:TcekIExNqud5crz4xD2pavyTgWiPvpYe4Xau31I0PRk= -github.com/fortytw2/leaktest v1.3.0 h1:u8491cBMTQ8ft8aeV+adlcytMZylmA5nnwwkRZjI8vw= -github.com/gavv/httpexpect v2.0.0+incompatible h1:1X9kcRshkSKEjNJJxX9Y9mQ5BRfbxU5kORdjhlA1yX8= -github.com/ghemawat/stream v0.0.0-20171120220530-696b145b53b9 h1:r5GgOLGbza2wVHRzK7aAj6lWZjfbAwiu/RDCVOKjRyM= -github.com/ghemawat/stream v0.0.0-20171120220530-696b145b53b9/go.mod h1:106OIgooyS7OzLDOpUGgm9fA3bQENb/cFSyyBmMoJDs= -github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE= -github.com/gin-gonic/gin v1.8.1 h1:4+fr/el88TOO3ewCmQr8cx/CtZ/umlIRIs5M4NTNjf8= -github.com/gin-gonic/gin v1.8.1/go.mod h1:ji8BvRH1azfM+SYow9zQ6SZMvR8qOMZHmsCuWR9tTTk= -github.com/go-check/check v0.0.0-20180628173108-788fd7840127 h1:0gkP6mzaMqkmpcJYCFOLkIBwI7xFExG03bbkOkCvUPI= -github.com/go-fonts/dejavu v0.1.0 h1:JSajPXURYqpr+Cu8U9bt8K+XcACIHWqWrvWCKyeFmVQ= -github.com/go-fonts/latin-modern v0.2.0 h1:5/Tv1Ek/QCr20C6ZOz15vw3g7GELYL98KWr8Hgo+3vk= -github.com/go-fonts/liberation v0.1.1 h1:wBrPaMkrXFBW3qXpXAjiKljdVUMxn9bX2ia3XjPHoik= -github.com/go-fonts/stix v0.1.0 h1:UlZlgrvvmT/58o573ot7NFw0vZasZ5I6bcIft/oMdgg= -github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1 h1:QbL/5oDUmRBzO9/Z7Seo6zf912W/a6Sr4Eu0G/3Jho0= -github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4 h1:WtGNWLvXpe6ZudgnXrq0barxBImvnnJoMEhXAzcbM0I= -github.com/go-ini/ini v1.25.4 h1:Mujh4R/dH6YL8bxuISne3xX2+qcQ9p0IxKAP6ExWoUo= -github.com/go-kit/log v0.2.1 h1:MRVx0/zhvdseW+Gza6N9rVzU/IVzaeE1SFI4raAhmBU= -github.com/go-kit/log v0.2.1/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0= -github.com/go-latex/latex v0.0.0-20210118124228-b3d85cf34e07 h1:OTlfMvwR1rLyf9goVmXfuS5AJn80+Vmj4rTf4n46SOs= -github.com/go-logfmt/logfmt v0.5.1 h1:otpy5pqBCBZ1ng9RQ0dPu4PN7ba75Y/aA+UpowDyNVA= -github.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= -github.com/go-martini/martini v0.0.0-20170121215854-22fa46961aab h1:xveKWz2iaueeTaUgdetzel+U7exyigDYBryyVfV/rZk= -github.com/go-playground/assert/v2 v2.0.1 h1:MsBgLAaY856+nPRTKrp3/OZK38U/wa0CcBYNjji3q3A= -github.com/go-playground/locales v0.14.0 h1:u50s323jtVGugKlcYeyzC0etD1HifMjqmJqb8WugfUU= -github.com/go-playground/locales v0.14.0/go.mod h1:sawfccIbzZTqEDETgFXqTho0QybSa7l++s0DH+LDiLs= -github.com/go-playground/universal-translator v0.18.0 h1:82dyy6p4OuJq4/CByFNOn/jYrnRPArHwAcmLoJZxyho= -github.com/go-playground/universal-translator v0.18.0/go.mod h1:UvRDBj+xPUEGrFYl+lu/H90nyDXpg0fqeB/AQUGNTVA= -github.com/go-playground/validator/v10 v10.11.1 h1:prmOlTVv+YjZjmRmNSF3VmspqJIxJWXmqUsHwfTRRkQ= -github.com/go-playground/validator/v10 v10.11.1/go.mod h1:i+3WkQ1FvaUjjxh1kSvIA4dMGDBiPU55YFDl0WbKdWU= -github.com/go-stack/stack v1.8.0 h1:5SgMzNM5HxrEjV0ww2lTmX6E2Izsfxas4+YHWRs3Lsk= -github.com/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee h1:s+21KNqlpePfkah2I+gwHF8xmJWRjooY+5248k6m4A0= -github.com/gobwas/pool v0.2.0 h1:QEmUOlnSjWtnpRGHF3SauEiOsy82Cup83Vf2LcMlnc8= -github.com/gobwas/ws v1.0.2 h1:CoAavW/wd/kulfZmSIBt6p24n4j7tHgNVCjsfHVNUbo= -github.com/goccy/go-json v0.9.11 h1:/pAaQDLHEoCq/5FFmSKBswWmK6H0e8g4159Kc/X/nqk= -github.com/goccy/go-json v0.9.11/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= -github.com/godbus/dbus/v5 v5.0.6 h1:mkgN1ofwASrYnJ5W6U/BxG15eXXXjirgZc7CLqkcaro= -github.com/godbus/dbus/v5 v5.0.6/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= -github.com/gofrs/uuid v4.0.0+incompatible h1:1SD/1F5pU8p29ybwgQSwpQk+mwdRrXCYuPhW6m+TnJw= -github.com/gogo/googleapis v1.4.1 h1:1Yx4Myt7BxzvUr5ldGSbwYiZG6t9wGBZ+8/fX3Wvtq0= -github.com/gogo/status v1.1.0 h1:+eIkrewn5q6b30y+g/BJINVVdi2xH7je5MPJ3ZPK3JA= -github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe h1:lXe2qZdvpiX5WZkZR4hgp4KJVfY3nMkvmwbVkpv1rVY= -github.com/golang-sql/sqlexp v0.0.0-20170517235910-f1bb20e5a188 h1:+eHOFJl1BaXrQxKX+T06f78590z4qA2ZzBTqahsKSE4= -github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 h1:DACJavvAHhabrF08vX0COfcOBJRhZ8lUbR+ZWIs0Y5g= -github.com/golangci/lint-1 v0.0.0-20181222135242-d2cdd8c08219 h1:utua3L2IbQJmauC5IXdEA547bcoU5dozgQAfc8Onsg4= -github.com/gomodule/redigo v1.7.1-0.20190724094224-574c33c3df38 h1:y0Wmhvml7cGnzPa9nocn/fMraMH/lMDdeG+rkx4VgYY= -github.com/google/btree v1.0.0 h1:0udJVsspx3VBr5FwtLhQQtuAsVc79tTq0ocGIPAU6qo= -github.com/google/go-pkcs11 v0.2.1-0.20230907215043-c6f79328ddf9 h1:OF1IPgv+F4NmqmJ98KTjdN97Vs1JxDPB3vbmYzV2dpk= -github.com/google/go-pkcs11 v0.2.1-0.20230907215043-c6f79328ddf9/go.mod h1:6eQoGcuNJpa7jnd5pMGdkSaQpNDYvPlXWMcjXXThLlY= -github.com/google/gofuzz v1.0.0 h1:A8PeW59pxE9IoFRqBp37U+mSNaQoZ46F1f0f863XSXw= -github.com/google/pprof v0.0.0-20211214055906-6f57359322fd h1:1FjCyPC+syAzJ5/2S8fqdZK1R22vvA0J7JZKcuOIQ7Y= -github.com/google/pprof v0.0.0-20211214055906-6f57359322fd/go.mod h1:KgnwoLYCZ8IQu3XUZ8Nc/bM9CCZFOyjUNOSygVozoDg= -github.com/google/renameio v0.1.0 h1:GOZbcHa3HfsPKPlmyPyN2KEohoMXOhdMbHrvbpl2QaA= -github.com/google/subcommands v1.0.1 h1:/eqq+otEXm5vhfBrbREPCSVQbvofip6kIz+mX5TUH7k= -github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8 h1:tlyzajkF3030q6M8SvmJSemC9DTHL/xaMa18b65+JM4= -github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8= -github.com/gorilla/css v1.0.0 h1:BQqNyPTi50JCFMTw/b67hByjMVXZRwGha6wxVGkeihY= -github.com/gorilla/css v1.0.0/go.mod h1:Dn721qIggHpt4+EFCcTLTU/vk5ySda2ReITrtgBl60c= -github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI= -github.com/gorilla/websocket v1.4.1 h1:q7AeDBpnBk8AogcD4DSag/Ukw/KV+YhzLj2bP5HvKCM= -github.com/grafana/regexp v0.0.0-20221122212121-6b5c0a4cb7fd h1:PpuIBO5P3e9hpqBD0O/HjhShYuM6XE0i/lbE6J94kww= -github.com/grafana/regexp v0.0.0-20221122212121-6b5c0a4cb7fd/go.mod h1:M5qHK+eWfAv8VR/265dIuEpL3fNfeC21tXXp9itM24A= -github.com/grpc-ecosystem/grpc-gateway v1.16.0 h1:gmcG1KaJ57LophUzW0Hy8NmPhnMZb4M0+kPpLofRdBo= -github.com/hanwen/go-fuse v1.0.0 h1:GxS9Zrn6c35/BnfiVsZVWmsG803xwE7eVRDvcf/BEVc= -github.com/hanwen/go-fuse/v2 v2.1.0 h1:+32ffteETaLYClUj0a3aHjZ1hOPxxaNEHiZiujuDaek= -github.com/hashicorp/consul/api v1.25.1 h1:CqrdhYzc8XZuPnhIYZWH45toM0LB9ZeYr/gvpLVI3PE= -github.com/hashicorp/consul/api v1.25.1/go.mod h1:iiLVwR/htV7mas/sy0O+XSuEnrdBUUydemjxcUrAt4g= -github.com/hashicorp/go-immutable-radix v1.3.1 h1:DKHmCUm2hRBK510BaiZlwvpD40f8bJFeZnpfm2KLowc= -github.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= -github.com/hashicorp/go-rootcerts v1.0.2 h1:jzhAVGtqPKbwpyCPELlgNWhE1znq+qwJtW5Oi2viEzc= -github.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8= -github.com/hashicorp/go-uuid v0.0.0-20180228145832-27454136f036 h1:d8T6WIONl4rMCPcQ/eY3uSz3+e4/GaoflKjXrWMex1U= -github.com/hashicorp/golang-lru v0.5.4 h1:YDjusn29QI/Das2iO9M0BHnIbxPeyuCHsjMW+lJfyTc= -github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= -github.com/hashicorp/serf v0.10.1 h1:Z1H2J60yRKvfDYAOZLd2MU0ND4AH/WDz7xYHDWQsIPY= -github.com/hashicorp/serf v0.10.1/go.mod h1:yL2t6BqATOLGc5HF7qbFkTfXoPIY0WZdWHfEvMqbG+4= -github.com/hpcloud/tail v1.0.0 h1:nfCOvKYfkgYP8hkirhJocXT2+zOD8yUNjXaWfTlyFKI= -github.com/hydrogen18/memlistener v0.0.0-20200120041712-dcc25e7acd91 h1:KyZDvZ/GGn+r+Y3DKZ7UOQ/TP4xV6HNkrwiVMB1GnNY= -github.com/iancoleman/orderedmap v0.3.0 h1:5cbR2grmZR/DiVt+VJopEhtVs9YGInGIxAoMJn+Ichc= -github.com/iancoleman/orderedmap v0.3.0/go.mod h1:XuLcCUkdL5owUCQeF2Ue9uuw1EptkJDkXXS7VoV7XGE= -github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639 h1:mV02weKRL81bEnm8A0HT1/CAelMQDBuQIfLw8n+d6xI= -github.com/imkira/go-interpol v1.1.0 h1:KIiKr0VSG2CUW1hl1jpiyuzuJeKUUpC8iM1AIE7N1Vk= -github.com/iris-contrib/blackfriday v2.0.0+incompatible h1:o5sHQHHm0ToHUlAJSTjW9UWicjJSDDauOOQ2AHuIVp4= -github.com/iris-contrib/go.uuid v2.0.0+incompatible h1:XZubAYg61/JwnJNbZilGjf3b3pB80+OQg2qf6c8BfWE= -github.com/iris-contrib/i18n v0.0.0-20171121225848-987a633949d0 h1:Kyp9KiXwsyZRTeoNjgVCrWks7D8ht9+kg6yCjh8K97o= -github.com/iris-contrib/jade v1.1.4 h1:WoYdfyJFfZIUgqNAeOyRfTNQZOksSlZ6+FnXR3AEpX0= -github.com/iris-contrib/jade v1.1.4/go.mod h1:EDqR+ur9piDl6DUgs6qRrlfzmlx/D5UybogqrXvJTBE= -github.com/iris-contrib/pongo2 v0.0.1 h1:zGP7pW51oi5eQZMIlGA3I+FHY9/HOQWDB+572yin0to= -github.com/iris-contrib/schema v0.0.6 h1:CPSBLyx2e91H2yJzPuhGuifVRnZBBJ3pCOMbOvPZaTw= -github.com/iris-contrib/schema v0.0.6/go.mod h1:iYszG0IOsuIsfzjymw1kMzTL8YQcCWlm65f3wX8J5iA= -github.com/jackc/chunkreader v1.0.0 h1:4s39bBR8ByfqH+DKm8rQA3E1LHZWB9XWcrz8fqaZbe0= -github.com/jackc/chunkreader/v2 v2.0.1 h1:i+RDz65UE+mmpjTfyz0MoVTnzeYxroil2G82ki7MGG8= -github.com/jackc/pgconn v1.11.0 h1:HiHArx4yFbwl91X3qqIHtUFoiIfLNJXCQRsnzkiwwaQ= -github.com/jackc/pgio v1.0.0 h1:g12B9UwVnzGhueNavwioyEEpAmqMe1E/BN9ES+8ovkE= -github.com/jackc/pgmock v0.0.0-20210724152146-4ad1a8207f65 h1:DadwsjnMwFjfWc9y5Wi/+Zz7xoE5ALHsRQlOctkOiHc= -github.com/jackc/pgproto3 v1.1.0 h1:FYYE4yRw+AgI8wXIinMlNjBbp/UitDJwfj5LqqewP1A= -github.com/jackc/pgproto3/v2 v2.2.0 h1:r7JypeP2D3onoQTCxWdTpCtJ4D+qpKr0TxvoyMhZ5ns= -github.com/jackc/pgtype v1.10.0 h1:ILnBWrRMSXGczYvmkYD6PsYyVFUNLTnIUJHHDLmqk38= -github.com/jackc/pgx/v4 v4.15.0 h1:B7dTkXsdILD3MF987WGGCcg+tvLW6bZJdEcqVFeU//w= -github.com/jackc/puddle v1.2.1 h1:gI8os0wpRXFd4FiAY2dWiqRK037tjj3t7rKFeO4X5iw= -github.com/jcmturner/gofork v0.0.0-20180107083740-2aebee971930 h1:v4CYlQ+HeysPHsr2QFiEO60gKqnvn1xwvuKhhAhuEkk= -github.com/joho/godotenv v1.3.0 h1:Zjp+RcGpHhGlrMbJzXTrZZPrWj+1vfm90La1wgB6Bhc= -github.com/jpillora/backoff v1.0.0 h1:uvFg412JmmHBHw7iwprIxkPMI+sGQ4kzOWsMeHnm2EA= -github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= -github.com/jstemmer/go-junit-report v0.9.1 h1:6QPYqodiu3GuPL+7mfx+NwDdp2eTkp9IfEUpgAwUN0o= -github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo= -github.com/juju/errors v0.0.0-20181118221551-089d3ea4e4d5 h1:rhqTjzJlm7EbkELJDKMTU7udov+Se0xZkWmugr6zGok= -github.com/juju/loggo v0.0.0-20180524022052-584905176618 h1:MK144iBQF9hTSwBW/9eJm034bVoG30IshVm688T2hi8= -github.com/juju/testing v0.0.0-20180920084828-472a3e8b2073 h1:WQM1NildKThwdP7qWrNAFGzp4ijNLw8RlgENkaI4MJs= -github.com/julienschmidt/httprouter v1.3.0 h1:U0609e9tgbseu3rBINet9P48AI/D3oJs4dN7jwJOQ1U= -github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= -github.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5 h1:PJr+ZMXIecYc1Ey2zucXdR73SMBtgjPgwa31099IMv0= -github.com/k0kubun/colorstring v0.0.0-20150214042306-9440f1994b88 h1:uC1QfSlInpQF+M0ao65imhwqKnz3Q2z/d8PWZRMQvDM= -github.com/k0kubun/go-ansi v0.0.0-20180517002512-3bf9e2903213 h1:qGQQKEcAR99REcMpsXCp3lJ03zYT1PkRd3kQGPn9GVg= -github.com/kataras/blocks v0.0.7 h1:cF3RDY/vxnSRezc7vLFlQFTYXG/yAr1o7WImJuZbzC4= -github.com/kataras/blocks v0.0.7/go.mod h1:UJIU97CluDo0f+zEjbnbkeMRlvYORtmc1304EeyXf4I= -github.com/kataras/golog v0.1.7 h1:0TY5tHn5L5DlRIikepcaRR/6oInIr9AiWsxzt0vvlBE= -github.com/kataras/golog v0.1.7/go.mod h1:jOSQ+C5fUqsNSwurB/oAHq1IFSb0KI3l6GMa7xB6dZA= -github.com/kataras/iris/v12 v12.2.0-beta5 h1:grB/oCf5baZhmYIeDMfgN3LYrtEcmK8pbxlRvEZ2pgw= -github.com/kataras/iris/v12 v12.2.0-beta5/go.mod h1:q26aoWJ0Knx/00iPKg5iizDK7oQQSPjbD8np0XDh6dc= -github.com/kataras/neffos v0.0.14 h1:pdJaTvUG3NQfeMbbVCI8JT2T5goPldyyfUB2PJfh1Bs= -github.com/kataras/pio v0.0.11 h1:kqreJ5KOEXGMwHAWHDwIl+mjfNCPhAwZPa8gK7MKlyw= -github.com/kataras/pio v0.0.11/go.mod h1:38hH6SWH6m4DKSYmRhlrCJ5WItwWgCVrTNU62XZyUvI= -github.com/kataras/sitemap v0.0.6 h1:w71CRMMKYMJh6LR2wTgnk5hSgjVNB9KL60n5e2KHvLY= -github.com/kataras/sitemap v0.0.6/go.mod h1:dW4dOCNs896OR1HmG+dMLdT7JjDk7mYBzoIRwuj5jA4= -github.com/kataras/tunnel v0.0.4 h1:sCAqWuJV7nPzGrlb0os3j49lk2JhILT0rID38NHNLpA= -github.com/kataras/tunnel v0.0.4/go.mod h1:9FkU4LaeifdMWqZu7o20ojmW4B7hdhv2CMLwfnHGpYw= -github.com/kisielk/errcheck v1.5.0 h1:e8esj/e4R+SAOwFwN+n3zr0nYeCyeweozKfO23MvHzY= -github.com/kisielk/gotool v1.0.0 h1:AV2c/EiW3KqPNT9ZKl07ehoAGi4C5/01Cfbblndcapg= -github.com/klauspost/cpuid v1.2.1 h1:vJi+O/nMdFt0vqm8NZBI6wzALWdA2X+egi0ogNyrC/w= -github.com/konsorten/go-windows-terminal-sequences v1.0.2 h1:DB17ag19krx9CFsz4o3enTrPXyIXCl+2iCXH/aMAp9s= -github.com/kr/fs v0.1.0 h1:Jskdu9ieNAYnjxsi0LbQp1ulIKZV1LAFgK1tWhpZgl8= -github.com/kr/pty v1.1.8 h1:AkaSdXYQOWeaO3neb8EM634ahkXXe3jYbVh/F9lq+GI= -github.com/leodido/go-urn v1.2.1 h1:BqpAaACuzVSgi/VLzGZIobT2z4v53pjosyNd9Yv6n/w= -github.com/leodido/go-urn v1.2.1/go.mod h1:zt4jvISO2HfUBqxjfIshjdMTYS56ZS/qv49ictyFfxY= -github.com/mailgun/raymond/v2 v2.0.46 h1:aOYHhvTpF5USySJ0o7cpPno/Uh2I5qg2115K25A+Ft4= -github.com/mailgun/raymond/v2 v2.0.46/go.mod h1:lsgvL50kgt1ylcFJYZiULi5fjPBkkhNfj4KA0W54Z18= -github.com/matoous/go-nanoid v1.5.0 h1:VRorl6uCngneC4oUQqOYtO3S0H5QKFtKuKycFG3euek= -github.com/matryer/moq v0.0.0-20190312154309-6cfb0558e1bd h1:HvFwW+cm9bCbZ/+vuGNq7CRWXql8c0y8nGeYpqmpvmk= -github.com/mattn/go-ieproxy v0.0.1 h1:qiyop7gCflfhwCzGyeT0gro3sF9AIg9HU98JORTkqfI= -github.com/mattn/goveralls v0.0.2 h1:7eJB6EqsPhRVxvwEXGnqdO2sJI0PTsrWoTMXEk9/OQc= -github.com/mediocregopher/mediocre-go-lib v0.0.0-20181029021733-cb65787f37ed h1:3dQJqqDouawQgl3gBE1PNHKFkJYGEuFb1DbSlaxdosE= -github.com/mediocregopher/radix/v3 v3.4.2 h1:galbPBjIwmyREgwGCfQEN4X8lxbJnKBYurgz+VfcStA= -github.com/microcosm-cc/bluemonday v1.0.21 h1:dNH3e4PSyE4vNX+KlRGHT5KrSvjeUkoNPwEORjffHJg= -github.com/microcosm-cc/bluemonday v1.0.21/go.mod h1:ytNkv4RrDrLJ2pqlsSI46O6IVXmZOBBD4SaJyDwwTkM= -github.com/miekg/dns v1.1.56 h1:5imZaSeoRNvpM9SzWNhEcP9QliKiz20/dA2QabIGVnE= -github.com/miekg/dns v1.1.56/go.mod h1:cRm6Oo2C8TY9ZS/TqsSrseAcncm74lfK5G+ikN2SWWY= -github.com/minio/highwayhash v1.0.2 h1:Aak5U0nElisjDCfPSG79Tgzkn2gl66NxOMspRrKnA/g= -github.com/minio/highwayhash v1.0.2/go.mod h1:BQskDq+xkJ12lmlUUi7U0M5Swg3EWR+dLTk+kldvVxY= -github.com/moby/sys/mountinfo v0.5.0 h1:2Ks8/r6lopsxWi9m58nlwjaeSzUX9iiL1vj5qB/9ObI= -github.com/moby/sys/mountinfo v0.5.0/go.mod h1:3bMD3Rg+zkqx8MRYPi7Pyb0Ie97QEBmdxbhnCLlSvSU= -github.com/modocache/gover v0.0.0-20171022184752-b58185e213c5 h1:8Q0qkMVC/MmWkpIdlvZgcv2o2jrlF6zqVOh7W5YHdMA= -github.com/montanaflynn/stats v0.7.0 h1:r3y12KyNxj/Sb/iOE46ws+3mS1+MZca1wlHQFPsY/JU= -github.com/montanaflynn/stats v0.7.0/go.mod h1:etXPPgVO6n31NxCd9KQUMvCM+ve0ruNzt6R8Bnaayow= -github.com/moul/http2curl v1.0.0 h1:dRMWoAtb+ePxMlLkrCbAqh4TlPHXvoGUSQ323/9Zahs= -github.com/mrunalp/fileutils v0.5.1 h1:F+S7ZlNKnrwHfSwdlgNSkKo67ReVf8o9fel6C3dkm/Q= -github.com/mrunalp/fileutils v0.5.1/go.mod h1:M1WthSahJixYnrXQl/DFQuteStB1weuxD2QJNHXfbSQ= -github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f h1:KUppIJq7/+SVif2QVs3tOP0zanoHgBEVAwHxUSIzRqU= -github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= -github.com/nats-io/jwt v0.3.0 h1:xdnzwFETV++jNc4W1mw//qFyJGb2ABOombmZJQS4+Qo= -github.com/nats-io/jwt/v2 v2.4.1 h1:Y35W1dgbbz2SQUYDPCaclXcuqleVmpbRa7646Jf2EX4= -github.com/nats-io/jwt/v2 v2.4.1/go.mod h1:24BeQtRwxRV8ruvC4CojXlx/WQ/VjuwlYiH+vu/+ibI= -github.com/nats-io/nats.go v1.30.2 h1:aloM0TGpPorZKQhbAkdCzYDj+ZmsJDyeo3Gkbr72NuY= -github.com/nats-io/nats.go v1.30.2/go.mod h1:dcfhUgmQNN4GJEfIb2f9R7Fow+gzBF4emzDHrVBd5qM= -github.com/nats-io/nkeys v0.4.5 h1:Zdz2BUlFm4fJlierwvGK+yl20IAKUm7eV6AAZXEhkPk= -github.com/nats-io/nkeys v0.4.5/go.mod h1:XUkxdLPTufzlihbamfzQ7mw/VGx6ObUs+0bN5sNvt64= -github.com/nats-io/nuid v1.0.1 h1:5iA8DT8V7q8WK2EScv2padNa/rTESc1KdnPw4TC2paw= -github.com/ncw/swift v1.0.52 h1:ACF3JufDGgeKp/9mrDgQlEgS8kRYC4XKcuzj/8EJjQU= -github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs= -github.com/nxadm/tail v1.4.4 h1:DQuhQpB1tVlglWS2hLQ5OV6B5r8aGxSrPc5Qo6uTN78= -github.com/onsi/ginkgo v1.13.0 h1:M76yO2HkZASFjXL0HSoZJ1AYEmQxNJmY41Jx1zNUq1Y= -github.com/onsi/gomega v1.10.1 h1:o0+MgICZLuZ7xjH7Vx6zS/zcu93/BEp1VwkIW1mEXCE= -github.com/opencontainers/runtime-spec v1.0.3-0.20210326190908-1c3f411f0417 h1:3snG66yBm59tKhhSPQrQ/0bCrv1LQbKt40LnUPiUxdc= -github.com/opencontainers/runtime-spec v1.0.3-0.20210326190908-1c3f411f0417/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= -github.com/opencontainers/selinux v1.10.0 h1:rAiKF8hTcgLI3w0DHm6i0ylVVcOrlgR1kK99DRLDhyU= -github.com/opencontainers/selinux v1.10.0/go.mod h1:2i0OySw99QjzBBQByd1Gr9gSjvuho1lHsJxIJ3gGbJI= -github.com/pborman/getopt v0.0.0-20180729010549-6fdd0a2c7117 h1:7822vZ646Atgxkp3tqrSufChvAAYgIy+iFEGpQntwlI= -github.com/pelletier/go-toml v1.2.0 h1:T5zMGML61Wp+FlcbWjRDT7yAxhJNAiPPLOFECq181zc= -github.com/phpdave11/gofpdf v1.4.2 h1:KPKiIbfwbvC/wOncwhrpRdXVj2CZTCFlw4wnoyjtHfQ= -github.com/phpdave11/gofpdi v1.0.12 h1:RZb9NG62cw/RW0rHAduVRo+98R8o/G1krcg2ns7DakQ= -github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e h1:aoZm08cpOy4WuID//EZDgcC4zIxODThtZNPirFr42+A= -github.com/pkg/profile v1.7.0 h1:hnbDkaNWPCLMO9wGLdBFTIZvzDrDfBM2072E1S9gJkA= -github.com/pkg/profile v1.7.0/go.mod h1:8Uer0jas47ZQMJ7VD+OHknK4YDY07LPUC6dEvqDjvNo= -github.com/pkg/sftp v1.13.1 h1:I2qBYMChEhIjOgazfJmV3/mZM256btk6wkCDRmW7JYs= -github.com/prometheus/prometheus v0.48.0 h1:yrBloImGQ7je4h8M10ujGh4R6oxYQJQKlMuETwNskGk= -github.com/prometheus/prometheus v0.48.0/go.mod h1:SRw624aMAxTfryAcP8rOjg4S/sHHaetx2lyJJ2nM83g= -github.com/rogpeppe/fastuuid v1.2.0 h1:Ppwyp6VYCF1nvBTXL3trRso7mXMlRrw9ooo375wvi2s= -github.com/rs/zerolog v1.15.0 h1:uPRuwkWF4J6fGsJ2R0Gn2jB1EQiav9k3S6CSdygQJXY= -github.com/russross/blackfriday v1.5.2 h1:HyvC0ARfnZBqnXwABFeSZHpKvJHJJfPz81GNueLj0oo= -github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= -github.com/ruudk/golang-pdf417 v0.0.0-20181029194003-1af4ab5afa58 h1:nlG4Wa5+minh3S9LVFtNoY+GVRiudA2e3EVfcCi3RCA= -github.com/ryanuber/columnize v2.1.0+incompatible h1:j1Wcmh8OrK4Q7GXY+V7SVSY8nUWQxHW5TkBe7YUl+2s= -github.com/sagikazarmark/crypt v0.15.0 h1:TQJg76CemcIdJyC9/dmNjU9OUyIFHyvE50Tpq1t1nqY= -github.com/sagikazarmark/crypt v0.15.0/go.mod h1:5rwNNax6Mlk9sZ40AcyVtiEw24Z4J04cfSioF2COKmc= -github.com/satori/go.uuid v1.2.0 h1:0uYX9dsZ2yD7q2RtLRtPSdGDWzjeM3TbMJP9utgA0ww= -github.com/schollz/closestmatch v2.1.0+incompatible h1:Uel2GXEpJqOWBrlyI+oY9LTiyyjYS17cCYRqP13/SHk= -github.com/sclevine/agouti v3.0.0+incompatible h1:8IBJS6PWz3uTlMP3YBIR5f+KAldcGuOeFkFbUWfBgK4= -github.com/scylladb/termtables v0.0.0-20191203121021-c4c0b6d42ff4 h1:8qmTC5ByIXO3GP/IzBkxcZ/99VITvnIETDhdFz/om7A= -github.com/seccomp/libseccomp-golang v0.9.2-0.20220502022130-f33da4d89646 h1:RpforrEYXWkmGwJHIGnLZ3tTWStkjVVstwzNGqxX2Ds= -github.com/seccomp/libseccomp-golang v0.9.2-0.20220502022130-f33da4d89646/go.mod h1:JA8cRccbGaA1s33RQf7Y1+q9gHmZX1yB/z9WDN1C6fg= -github.com/sergi/go-diff v1.1.0 h1:we8PVUC3FE2uYfodKH/nBHMSetSfHDR6scGdBi+erh0= -github.com/shurcooL/sanitized_anchor_name v1.0.0 h1:PdmoCO6wvbs+7yrJyMORt4/BmY5IYyJwS/kOiWx8mHo= -github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM= -github.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s= -github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72 h1:qLC7fQah7D6K1B0ujays3HV9gkFtllcxhzImRR7ArPQ= -github.com/spf13/jwalterweatherman v1.0.0 h1:XHEdyB+EcvlqZamSM4ZOMGlc93t6AcsBEu9Gc1vn7yk= -github.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635 h1:kdXcSzyDtseVEc4yCz2qF8ZrQvIDBJLl4S1c3GCXmoI= -github.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= -github.com/tdewolff/minify/v2 v2.12.4 h1:kejsHQMM17n6/gwdw53qsi6lg0TGddZADVyQOz1KMdE= -github.com/tdewolff/minify/v2 v2.12.4/go.mod h1:h+SRvSIX3kwgwTFOpSckvSxgax3uy8kZTSF1Ojrr3bk= -github.com/tdewolff/parse/v2 v2.6.4 h1:KCkDvNUMof10e3QExio9OPZJT8SbdKojLBumw8YZycQ= -github.com/tdewolff/parse/v2 v2.6.4/go.mod h1:woz0cgbLwFdtbjJu8PIKxhW05KplTFQkOdX78o+Jgrs= -github.com/tsenart/go-tsz v0.0.0-20180814235614-0bd30b3df1c3 h1:pcQGQzTwCg//7FgVywqge1sW9Yf8VMsMdG58MI5kd8s= -github.com/tsenart/go-tsz v0.0.0-20180814235614-0bd30b3df1c3/go.mod h1:SWZznP1z5Ki7hDT2ioqiFKEse8K9tU2OUvaRI0NeGQo= -github.com/ugorji/go v1.1.7 h1:/68gy2h+1mWMrwZFeD1kQialdSzAb432dtpeJ42ovdo= -github.com/ugorji/go/codec v1.2.7 h1:YPXUKf7fYbp/y8xloBqZOw2qaVggbfwMlI8WM3wZUJ0= -github.com/ugorji/go/codec v1.2.7/go.mod h1:WGN1fab3R1fzQlVQTkfxVtIBhWDRqOviHU95kRgeqEY= -github.com/urfave/cli v1.22.1 h1:+mkCCcOFKPnCmVYVcURKps1Xe+3zP90gSYGNfRkjoIY= -github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= -github.com/urfave/negroni v1.0.0 h1:kIimOitoypq34K7TG7DUaJ9kq/N4Ofuwi1sjz0KipXc= -github.com/valyala/fasthttp v1.40.0 h1:CRq/00MfruPGFLTQKY8b+8SfdK60TxNztjRMnH0t1Yc= -github.com/valyala/fasthttp v1.40.0/go.mod h1:t/G+3rLek+CyY9bnIE+YlMRddxVAAGjhxndDB4i4C0I= -github.com/valyala/tcplisten v0.0.0-20161114210144-ceec8f93295a h1:0R4NLDRDZX6JcmhJgXi5E4b8Wg84ihbmUKp/GvSPEzc= -github.com/vishvananda/netlink v1.1.0 h1:1iyaYNBLmP6L0220aDnYQpo1QEV4t4hJ+xEEhhJH8j0= -github.com/vishvananda/netlink v1.1.0/go.mod h1:cTgwzPIzzgDAYoQrMm0EdrjRUBkTqKYppBueQtXaqoE= -github.com/vishvananda/netns v0.0.0-20191106174202-0a2b9b5464df h1:OviZH7qLw/7ZovXvuNyL3XQl8UFofeikI1NW1Gypu7k= -github.com/vishvananda/netns v0.0.0-20191106174202-0a2b9b5464df/go.mod h1:JP3t17pCcGlemwknint6hfoeCVQrEMVwxRLRjXpq+BU= -github.com/vmihailenco/msgpack/v5 v5.3.5 h1:5gO0H1iULLWGhs2H5tbAHIZTV8/cYafcFOr9znI5mJU= -github.com/vmihailenco/msgpack/v5 v5.3.5/go.mod h1:7xyJ9e+0+9SaZT0Wt1RGleJXzli6Q/V5KbhBonMG9jc= -github.com/vmihailenco/tagparser/v2 v2.0.0 h1:y09buUbR+b5aycVFQs/g70pqKVZNBmxwAhO7/IwNM9g= -github.com/vmihailenco/tagparser/v2 v2.0.0/go.mod h1:Wri+At7QHww0WTrCBeu4J6bNtoV6mEfg5OIWRZA9qds= -github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77 h1:ESFSdwYZvkeru3RtdrYueztKhOBCSAAzS4Gf+k0tEow= -github.com/yalp/jsonpath v0.0.0-20180802001716-5cc68e5049a0 h1:6fRhSjgLCkTD3JnJxvaJ4Sj+TYblw757bqYgZaOq5ZY= -github.com/yosssi/ace v0.0.5 h1:tUkIP/BLdKqrlrPwcmH0shwEEhTRHoGnc1wFIWmaBUA= -github.com/yosssi/ace v0.0.5/go.mod h1:ALfIzm2vT7t5ZE7uoIZqF3TQ7SAOyupFZnkrF5id+K0= -github.com/yudai/gojsondiff v1.0.0 h1:27cbfqXLVEJ1o8I6v3y9lg8Ydm53EKqHXAOMxEGlCOA= -github.com/yudai/golcs v0.0.0-20170316035057-ecda9a501e82 h1:BHyfKlQyqbsFN5p3IfnEUduWvb9is428/nNb5L3U01M= -github.com/yudai/pp v2.0.1+incompatible h1:Q4//iY4pNF6yPLZIigmvcl7k/bPgrcTPIFIcmawg5bI= -github.com/yuin/goldmark v1.4.13 h1:fVcFKWvrslecOb/tg+Cc05dkeYx540o0FuFt3nUVDoE= -github.com/zenazn/goji v0.9.0 h1:RSQQAbXGArQ0dIDEq+PI6WqN6if+5KHu6x2Cx/GXLTQ= -go.etcd.io/etcd/api/v3 v3.5.9 h1:4wSsluwyTbGGmyjJktOf3wFQoTBIURXHnq9n/G/JQHs= -go.etcd.io/etcd/api/v3 v3.5.9/go.mod h1:uyAal843mC8uUVSLWz6eHa/d971iDGnCRpmKd2Z+X8k= -go.etcd.io/etcd/client/pkg/v3 v3.5.9 h1:oidDC4+YEuSIQbsR94rY9gur91UPL6DnxDCIYd2IGsE= -go.etcd.io/etcd/client/pkg/v3 v3.5.9/go.mod h1:y+CzeSmkMpWN2Jyu1npecjB9BBnABxGM4pN8cGuJeL4= -go.etcd.io/etcd/client/v2 v2.305.9 h1:YZ2OLi0OvR0H75AcgSUajjd5uqKDKocQUqROTG11jIo= -go.etcd.io/etcd/client/v2 v2.305.9/go.mod h1:0NBdNx9wbxtEQLwAQtrDHwx58m02vXpDcgSYI2seohQ= -go.etcd.io/etcd/client/v3 v3.5.9 h1:r5xghnU7CwbUxD/fbUtRyJGaYNfDun8sp/gTr1hew6E= -go.etcd.io/etcd/client/v3 v3.5.9/go.mod h1:i/Eo5LrZ5IKqpbtpPDuaUnDOUv471oDg8cjQaUr2MbA= -go.opentelemetry.io/proto/otlp v0.7.0 h1:rwOQPCuKAKmwGKq2aVNnYIibI6wnV7EvzgfTCzcdGg8= -go.uber.org/goleak v1.1.11 h1:wy28qYRKZgnJTxGxvye5/wgWr1EKjmUDGYox5mGlRlI= -go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee h1:0mgffUl7nfd+FpvXMVz4IDEaUSmT1ysygQC7qYo7sG4= -go.uber.org/zap v1.26.0 h1:sI7k6L95XOKS281NhVKOFCUNIvv9e0w4BF8N3u+tCRo= -go.uber.org/zap v1.26.0/go.mod h1:dtElttAiwGvoJ/vj4IwHBS/gXsEu/pZ50mUIRWuG0so= -golang.org/x/crypto v0.31.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk= -golang.org/x/image v0.0.0-20210216034530-4410531fe030 h1:lP9pYkih3DUSC641giIXa2XqfTIbbbRr0w2EOTA7wHA= -golang.org/x/lint v0.0.0-20210508222113-6edffad5e616 h1:VLliZ0d+/avPrXXH+OakdXhpJuEoBZuwh1m2j7U6Iug= -golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028 h1:4+4C/Iv2U4fMZBiMCc98MG1In4gJY5YRhtpDNeDeHWs= -golang.org/x/net v0.33.0/go.mod h1:HXLR5J+9DxmrqMwG9qjGCxZ+zKXxBru04zlTvWlWuN4= -golang.org/x/sync v0.10.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= -golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/telemetry v0.0.0-20240228155512-f48c80bd79b2 h1:IRJeR9r1pYWsHKTRe/IInb7lYvbBVIqOgsX/u0mbOWY= -golang.org/x/telemetry v0.0.0-20240228155512-f48c80bd79b2/go.mod h1:TeRTkGYfJXctD9OcfyVLyj2J3IxLnKwHJR8f4D8a3YE= -golang.org/x/term v0.27.0/go.mod h1:iMsnZpn0cago0GOrHO2+Y7u7JPn5AylBrcoWkElMTSM= -golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= -gonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0 h1:OE9mWmgKkjJyEmDAAtGMPjXu+YNeGvK9VTSHY6+Qihc= -gonum.org/v1/plot v0.9.0 h1:3sEo36Uopv1/SA/dMFFaxXoL5XyikJ9Sf2Vll/k6+2E= -google.golang.org/genproto/googleapis/bytestream v0.0.0-20231120223509-83a465c0220f h1:hL+1ptbhFoeL1HcROQ8OGXaqH0jYRRibgWQWco0/Ugc= -google.golang.org/genproto/googleapis/bytestream v0.0.0-20231120223509-83a465c0220f/go.mod h1:iIgEblxoG4klcXsG0d9cpoxJ4xndv6+1FkDROCHhPRI= -google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0 h1:M1YKkFIboKNieVO5DLUEVzQfGwJD30Nv2jfUgzb5UcE= -gopkg.in/errgo.v2 v2.1.0 h1:0vLT13EuvQ0hNvakwLuFZ/jYrLp5F3kcWHXdRggjCE8= -gopkg.in/fsnotify.v1 v1.4.7 h1:xOHLXZwVvI9hhs+cLKq5+I5onOuwQLhQwiu63xxlHs4= -gopkg.in/go-playground/assert.v1 v1.2.1 h1:xoYuJVE7KT85PYWrN730RguIQO0ePzVRfFMXadIrXTM= -gopkg.in/go-playground/validator.v8 v8.18.2 h1:lFB4DoMU6B626w8ny76MV7VX6W2VHct2GVOI3xgiMrQ= -gopkg.in/inconshreveable/log15.v2 v2.0.0-20180818164646-67afb5ed74ec h1:RlWgLqCMMIYYEVcAR5MDsuHlVkaIPDAF+5Dehzg8L5A= -gopkg.in/jcmturner/aescts.v1 v1.0.1 h1:cVVZBK2b1zY26haWB4vbBiZrfFQnfbTVrE3xZq6hrEw= -gopkg.in/jcmturner/dnsutils.v1 v1.0.1 h1:cIuC1OLRGZrld+16ZJvvZxVJeKPsvd5eUIvxfoN5hSM= -gopkg.in/jcmturner/goidentity.v3 v3.0.0 h1:1duIyWiTaYvVx3YX2CYtpJbUFd7/UuPYCfgXtQ3VTbI= -gopkg.in/jcmturner/gokrb5.v7 v7.3.0 h1:0709Jtq/6QXEuWRfAm260XqlpcwL1vxtO1tUE2qK8Z4= -gopkg.in/jcmturner/rpc.v1 v1.1.0 h1:QHIUxTX1ISuAv9dD2wJ9HWQVuWDX/Zc0PfeC2tjc4rU= -gopkg.in/mgo.v2 v2.0.0-20180705113604-9856a29383ce h1:xcEWjVhvbDy+nHP67nPDDpbYrY+ILlfndk4bRioVHaU= -gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= -honnef.co/go/tools v0.0.1-2020.1.4 h1:UoveltGrhghAA7ePc+e+QYDHXrBps2PqFZiHkGR/xK8= -nhooyr.io/websocket v1.8.7 h1:usjR2uOr/zjjkVMy0lW+PPohFok7PCow5sDjLgX4P4g= -rsc.io/binaryregexp v0.2.0 h1:HfqmD5MEmC0zvwBuF187nq9mdnXjXsSivRiXN7SmRkE= -rsc.io/pdf v0.1.1 h1:k1MczvYDUvJBe93bYd7wrZLLUEcLZAuF824/I4e5Xr4= -rsc.io/quote/v3 v3.1.0 h1:9JKUTTIUgS6kzR9mK1YuGKv6Nl+DijDNIc0ghT58FaY= -rsc.io/sampler v1.3.0 h1:7uVkIFmeBqHfdjD+gZwtXXI+RODJ2Wc4O7MPEh/QiW4= From 789033d5f536dd94cfa76863cb16f0f0cf88bef5 Mon Sep 17 00:00:00 2001 From: Itai Gilo Date: Wed, 22 Jan 2025 11:37:09 +0200 Subject: [PATCH 26/26] Fix PR comments --- pkg/api/controller.go | 41 +++++++++--------------- pkg/api/controller_test.go | 18 ++++++++--- pkg/block/azure/adapter.go | 2 +- pkg/block/s3/adapter.go | 4 +-- pkg/catalog/catalog.go | 8 ++--- pkg/catalog/catalog_test.go | 7 ++-- pkg/gateway/operations/putobject.go | 18 ++++------- pkg/gateway/operations/putobject_test.go | 9 ++++-- pkg/samplerepo/samplecontent.go | 18 ++++------- pkg/upload/write_blob.go | 11 ++----- 10 files changed, 64 insertions(+), 72 deletions(-) diff --git a/pkg/api/controller.go b/pkg/api/controller.go index 5afe253b482..b9722dc4e7c 100644 --- a/pkg/api/controller.go +++ b/pkg/api/controller.go @@ -3213,24 +3213,19 @@ func (c *Controller) UploadObject(w http.ResponseWriter, r *http.Request, reposi writeError(w, r, http.StatusInternalServerError, err) return } - - storageNamespace := repo.StorageNamespace - storageID := repo.StorageID + opts := block.PutOpts{StorageClass: params.StorageClass} var blob *upload.Blob if mediaType != "multipart/form-data" { // handle non-multipart, direct content upload address := c.PathProvider.NewPath() - blob, err = upload.WriteBlob( - ctx, - c.BlockAdapter, - storageID, - storageNamespace, - address, - r.Body, - r.ContentLength, - block.PutOpts{StorageClass: params.StorageClass}, - ) + objectPointer := block.ObjectPointer{ + StorageID: repo.StorageID, + StorageNamespace: repo.StorageNamespace, + IdentifierType: block.IdentifierTypeRelative, + Identifier: address, + } + blob, err = upload.WriteBlob(ctx, c.BlockAdapter, objectPointer, r.Body, r.ContentLength, opts) if err != nil { writeError(w, r, http.StatusInternalServerError, err) return @@ -3258,17 +3253,13 @@ func (c *Controller) UploadObject(w http.ResponseWriter, r *http.Request, reposi partName := part.FormName() if partName == "content" { // upload the first "content" and exit the loop - address := c.PathProvider.NewPath() - blob, err = upload.WriteBlob( - ctx, - c.BlockAdapter, - storageID, - storageNamespace, - address, - part, - -1, - block.PutOpts{StorageClass: params.StorageClass}, - ) + objectPointer := block.ObjectPointer{ + StorageID: repo.StorageID, + StorageNamespace: repo.StorageNamespace, + IdentifierType: block.IdentifierTypeRelative, + Identifier: c.PathProvider.NewPath(), + } + blob, err = upload.WriteBlob(ctx, c.BlockAdapter, objectPointer, part, -1, opts) if err != nil { _ = part.Close() writeError(w, r, http.StatusInternalServerError, err) @@ -3317,7 +3308,7 @@ func (c *Controller) UploadObject(w http.ResponseWriter, r *http.Request, reposi identifierType = block.IdentifierTypeRelative } - qk, err := c.BlockAdapter.ResolveNamespace(storageNamespace, blob.PhysicalAddress, identifierType) + qk, err := c.BlockAdapter.ResolveNamespace(repo.StorageNamespace, blob.PhysicalAddress, identifierType) if err != nil { writeError(w, r, http.StatusInternalServerError, err) return diff --git a/pkg/api/controller_test.go b/pkg/api/controller_test.go index 595e3025bb3..5169e3fbbc6 100644 --- a/pkg/api/controller_test.go +++ b/pkg/api/controller_test.go @@ -2549,8 +2549,13 @@ func TestController_ObjectsHeadObjectHandler(t *testing.T) { buf := new(bytes.Buffer) buf.WriteString("this is file content made up of bytes") - address := upload.DefaultPathProvider.NewPath() - blob, err := upload.WriteBlob(context.Background(), deps.blocks, "", onBlock(deps, "ns1"), address, buf, 37, block.PutOpts{StorageClass: &expensiveString}) + objectPointer := block.ObjectPointer{ + StorageID: "", + StorageNamespace: onBlock(deps, "ns1"), + IdentifierType: block.IdentifierTypeRelative, + Identifier: upload.DefaultPathProvider.NewPath(), + } + blob, err := upload.WriteBlob(context.Background(), deps.blocks, objectPointer, buf, 37, block.PutOpts{StorageClass: &expensiveString}) if err != nil { t.Fatal(err) } @@ -2625,8 +2630,13 @@ func TestController_ObjectsGetObjectHandler(t *testing.T) { buf := new(bytes.Buffer) buf.WriteString("this is file content made up of bytes") - address := upload.DefaultPathProvider.NewPath() - blob, err := upload.WriteBlob(context.Background(), deps.blocks, "", onBlock(deps, "ns1"), address, buf, 37, block.PutOpts{StorageClass: &expensiveString}) + objectPointer := block.ObjectPointer{ + StorageID: "", + StorageNamespace: onBlock(deps, "ns1"), + IdentifierType: block.IdentifierTypeRelative, + Identifier: upload.DefaultPathProvider.NewPath(), + } + blob, err := upload.WriteBlob(context.Background(), deps.blocks, objectPointer, buf, 37, block.PutOpts{StorageClass: &expensiveString}) if err != nil { t.Fatal(err) } diff --git a/pkg/block/azure/adapter.go b/pkg/block/azure/adapter.go index 5accb3a4306..09544f48934 100644 --- a/pkg/block/azure/adapter.go +++ b/pkg/block/azure/adapter.go @@ -139,7 +139,7 @@ func ResolveBlobURLInfoFromURL(pathURL *url.URL) (BlobURLInfo, error) { func resolveBlobURLInfo(obj block.ObjectPointer) (BlobURLInfo, error) { key := obj.Identifier - // TODO (gilo): verify there's no need for StorageID here + // we're in the context of a specific storage here, so there's no need for StorageID. defaultNamespace := obj.StorageNamespace var qk BlobURLInfo // check if the key is fully qualified diff --git a/pkg/block/s3/adapter.go b/pkg/block/s3/adapter.go index 843a336161e..d52e2b07d91 100644 --- a/pkg/block/s3/adapter.go +++ b/pkg/block/s3/adapter.go @@ -411,7 +411,7 @@ func (a *Adapter) GetPreSignedURL(ctx context.Context, obj block.ObjectPointer, log := a.log(ctx).WithFields(logging.Fields{ "operation": "GetPreSignedURL", - "sid": obj.StorageID, // TODO (gilo): is "sid" a good enough name? + "storage_id": obj.StorageID, "namespace": obj.StorageNamespace, "identifier": obj.Identifier, "ttl": time.Until(expiry), @@ -467,7 +467,7 @@ func (a *Adapter) GetPresignUploadPartURL(ctx context.Context, obj block.ObjectP log := a.log(ctx).WithFields(logging.Fields{ "operation": "GetPresignUploadPartURL", - "sid": obj.StorageID, // TODO (gilo): is "sid" a good enough name? + "storage_id": obj.StorageID, "namespace": obj.StorageNamespace, "identifier": obj.Identifier, }) diff --git a/pkg/catalog/catalog.go b/pkg/catalog/catalog.go index b1801c06e06..b4c489125d4 100644 --- a/pkg/catalog/catalog.go +++ b/pkg/catalog/catalog.go @@ -2630,7 +2630,7 @@ type UncommittedParquetObject struct { CreationDate int64 `parquet:"name=creation_date, type=INT64, convertedtype=INT_64"` } -func (c *Catalog) uploadFile(ctx context.Context, sid graveler.StorageID, ns graveler.StorageNamespace, location string, fd *os.File, size int64) (string, error) { +func (c *Catalog) uploadFile(ctx context.Context, repo *graveler.RepositoryRecord, location string, fd *os.File, size int64) (string, error) { _, err := fd.Seek(0, 0) if err != nil { return "", err @@ -2642,8 +2642,8 @@ func (c *Catalog) uploadFile(ctx context.Context, sid graveler.StorageID, ns gra return "", err } obj := block.ObjectPointer{ - StorageID: sid.String(), - StorageNamespace: ns.String(), + StorageID: repo.StorageID.String(), + StorageNamespace: repo.StorageNamespace.String(), Identifier: identifier, IdentifierType: block.IdentifierTypeFull, } @@ -2706,7 +2706,7 @@ func (c *Catalog) PrepareGCUncommitted(ctx context.Context, repositoryID string, return nil, err } - name, err = c.uploadFile(ctx, repository.StorageID, repository.StorageNamespace, uncommittedLocation, fd, uw.Size()) + name, err = c.uploadFile(ctx, repository, uncommittedLocation, fd, uw.Size()) if err != nil { return nil, err } diff --git a/pkg/catalog/catalog_test.go b/pkg/catalog/catalog_test.go index 19c50981a24..8c786bb9396 100644 --- a/pkg/catalog/catalog_test.go +++ b/pkg/catalog/catalog_test.go @@ -907,11 +907,10 @@ func createPrepareUncommittedTestScenario(t *testing.T, repositoryID string, num } func readPhysicalAddressesFromParquetObject(t *testing.T, repositoryID string, ctx context.Context, c *catalog.Catalog, obj string) []string { - // TODO (gilo): test StorageID here? objReader, err := c.BlockAdapter.Get(ctx, block.ObjectPointer{ - Identifier: obj, - IdentifierType: block.IdentifierTypeFull, - StorageID: "", + Identifier: obj, + IdentifierType: block.IdentifierTypeFull, + // in the context of an adapter here, so no need to specify StorageID. StorageNamespace: "mem://" + repositoryID, }) require.NoError(t, err) diff --git a/pkg/gateway/operations/putobject.go b/pkg/gateway/operations/putobject.go index aa27b0a9436..4206544b5d7 100644 --- a/pkg/gateway/operations/putobject.go +++ b/pkg/gateway/operations/putobject.go @@ -318,17 +318,13 @@ func handlePut(w http.ResponseWriter, req *http.Request, o *PathOperation) { return } } - address := o.PathProvider.NewPath() - blob, err := upload.WriteBlob( - req.Context(), - o.BlockStore, - o.Repository.StorageID, - o.Repository.StorageNamespace, - address, - req.Body, - req.ContentLength, - opts, - ) + objectPointer := block.ObjectPointer{ + StorageID: o.Repository.StorageID, + StorageNamespace: o.Repository.StorageNamespace, + IdentifierType: block.IdentifierTypeRelative, + Identifier: o.PathProvider.NewPath(), + } + blob, err := upload.WriteBlob(req.Context(), o.BlockStore, objectPointer, req.Body, req.ContentLength, opts) if err != nil { o.Log(req).WithError(err).Error("could not write request body to block adapter") _ = o.EncodeError(w, req, err, gatewayErrors.Codes.ToAPIErr(gatewayErrors.ErrInternalError)) diff --git a/pkg/gateway/operations/putobject_test.go b/pkg/gateway/operations/putobject_test.go index bc674c74c16..69feef1a94f 100644 --- a/pkg/gateway/operations/putobject_test.go +++ b/pkg/gateway/operations/putobject_test.go @@ -45,9 +45,14 @@ func TestWriteBlob(t *testing.T) { } reader := bytes.NewReader(data) adapter := testutil.NewMockAdapter() + objectPointer := block.ObjectPointer{ + StorageID: "", + StorageNamespace: storageNamespace, + IdentifierType: block.IdentifierTypeRelative, + Identifier: upload.DefaultPathProvider.NewPath(), + } opts := block.PutOpts{StorageClass: tc.storageClass} - address := upload.DefaultPathProvider.NewPath() - blob, err := upload.WriteBlob(context.Background(), adapter, "", storageNamespace, address, reader, tc.size, opts) + blob, err := upload.WriteBlob(context.Background(), adapter, objectPointer, reader, tc.size, opts) if err != nil { t.Fatal(err) } diff --git a/pkg/samplerepo/samplecontent.go b/pkg/samplerepo/samplecontent.go index a7739a4b3ab..56786c24dfb 100644 --- a/pkg/samplerepo/samplecontent.go +++ b/pkg/samplerepo/samplecontent.go @@ -80,17 +80,13 @@ func PopulateSampleRepo(ctx context.Context, repo *catalog.Repository, cat *cata } // write file to storage - address := pathProvider.NewPath() - blob, err := upload.WriteBlob( - ctx, - blockAdapter, - repo.StorageID, - repo.StorageNamespace, - address, - contentReader, - contentSize, - block.PutOpts{}, - ) + objectPointer := block.ObjectPointer{ + StorageID: repo.StorageID, + StorageNamespace: repo.StorageNamespace, + IdentifierType: block.IdentifierTypeRelative, + Identifier: pathProvider.NewPath(), + } + blob, err := upload.WriteBlob(ctx, blockAdapter, objectPointer, contentReader, contentSize, block.PutOpts{}) if err != nil { return err } diff --git a/pkg/upload/write_blob.go b/pkg/upload/write_blob.go index 2bd0aabb66b..02182ea5dab 100644 --- a/pkg/upload/write_blob.go +++ b/pkg/upload/write_blob.go @@ -17,21 +17,16 @@ type Blob struct { CreationDate time.Time } -func WriteBlob(ctx context.Context, adapter block.Adapter, storageID, storageNamespace, address string, body io.Reader, contentLength int64, opts block.PutOpts) (*Blob, error) { +func WriteBlob(ctx context.Context, adapter block.Adapter, objectPointer block.ObjectPointer, body io.Reader, contentLength int64, opts block.PutOpts) (*Blob, error) { // handle the upload itself hashReader := block.NewHashingReader(body, block.HashFunctionMD5, block.HashFunctionSHA256) - res, err := adapter.Put(ctx, block.ObjectPointer{ - StorageID: storageID, - StorageNamespace: storageNamespace, - IdentifierType: block.IdentifierTypeRelative, - Identifier: address, - }, contentLength, hashReader, opts) + res, err := adapter.Put(ctx, objectPointer, contentLength, hashReader, opts) if err != nil { return nil, err } checksum := hex.EncodeToString(hashReader.Md5.Sum(nil)) return &Blob{ - PhysicalAddress: address, + PhysicalAddress: objectPointer.Identifier, RelativePath: true, Checksum: checksum, Size: hashReader.CopiedSize,