mirror of https://github.com/go-gitea/gitea
Fix all possible setting error related storages and added some tests (#23911)
Follow up #22405 Fix #20703 This PR rewrites storage configuration read sequences with some breaks and tests. It becomes more strict than before and also fixed some inherit problems. - Move storage's MinioConfig struct into setting, so after the configuration loading, the values will be stored into the struct but not still on some section. - All storages configurations should be stored on one section, configuration items cannot be overrided by multiple sections. The prioioty of configuration is `[attachment]` > `[storage.attachments]` | `[storage.customized]` > `[storage]` > `default` - For extra override configuration items, currently are `SERVE_DIRECT`, `MINIO_BASE_PATH`, `MINIO_BUCKET`, which could be configured in another section. The prioioty of the override configuration is `[attachment]` > `[storage.attachments]` > `default`. - Add more tests for storages configurations. - Update the storage documentations. --------- Co-authored-by: wxiaoguang <wxiaoguang@gmail.com>pull/25243/head^2
parent
dc0a7168f1
commit
d6dd6d641b
@ -0,0 +1,97 @@ |
||||
// Copyright 2023 The Gitea Authors. All rights reserved.
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
package setting |
||||
|
||||
import ( |
||||
"path/filepath" |
||||
"testing" |
||||
|
||||
"github.com/stretchr/testify/assert" |
||||
) |
||||
|
||||
func Test_getStorageInheritNameSectionTypeForActions(t *testing.T) { |
||||
iniStr := ` |
||||
[storage] |
||||
STORAGE_TYPE = minio |
||||
` |
||||
cfg, err := NewConfigProviderFromData(iniStr) |
||||
assert.NoError(t, err) |
||||
assert.NoError(t, loadActionsFrom(cfg)) |
||||
|
||||
assert.EqualValues(t, "minio", Actions.LogStorage.Type) |
||||
assert.EqualValues(t, "actions_log/", Actions.LogStorage.MinioConfig.BasePath) |
||||
assert.EqualValues(t, "minio", Actions.ArtifactStorage.Type) |
||||
assert.EqualValues(t, "actions_artifacts/", Actions.ArtifactStorage.MinioConfig.BasePath) |
||||
|
||||
iniStr = ` |
||||
[storage.actions_log] |
||||
STORAGE_TYPE = minio |
||||
` |
||||
cfg, err = NewConfigProviderFromData(iniStr) |
||||
assert.NoError(t, err) |
||||
assert.NoError(t, loadActionsFrom(cfg)) |
||||
|
||||
assert.EqualValues(t, "minio", Actions.LogStorage.Type) |
||||
assert.EqualValues(t, "actions_log/", Actions.LogStorage.MinioConfig.BasePath) |
||||
assert.EqualValues(t, "local", Actions.ArtifactStorage.Type) |
||||
assert.EqualValues(t, "actions_artifacts", filepath.Base(Actions.ArtifactStorage.Path)) |
||||
|
||||
iniStr = ` |
||||
[storage.actions_log] |
||||
STORAGE_TYPE = my_storage |
||||
|
||||
[storage.my_storage] |
||||
STORAGE_TYPE = minio |
||||
` |
||||
cfg, err = NewConfigProviderFromData(iniStr) |
||||
assert.NoError(t, err) |
||||
assert.NoError(t, loadActionsFrom(cfg)) |
||||
|
||||
assert.EqualValues(t, "minio", Actions.LogStorage.Type) |
||||
assert.EqualValues(t, "actions_log/", Actions.LogStorage.MinioConfig.BasePath) |
||||
assert.EqualValues(t, "local", Actions.ArtifactStorage.Type) |
||||
assert.EqualValues(t, "actions_artifacts", filepath.Base(Actions.ArtifactStorage.Path)) |
||||
|
||||
iniStr = ` |
||||
[storage.actions_artifacts] |
||||
STORAGE_TYPE = my_storage |
||||
|
||||
[storage.my_storage] |
||||
STORAGE_TYPE = minio |
||||
` |
||||
cfg, err = NewConfigProviderFromData(iniStr) |
||||
assert.NoError(t, err) |
||||
assert.NoError(t, loadActionsFrom(cfg)) |
||||
|
||||
assert.EqualValues(t, "local", Actions.LogStorage.Type) |
||||
assert.EqualValues(t, "actions_log", filepath.Base(Actions.LogStorage.Path)) |
||||
assert.EqualValues(t, "minio", Actions.ArtifactStorage.Type) |
||||
assert.EqualValues(t, "actions_artifacts/", Actions.ArtifactStorage.MinioConfig.BasePath) |
||||
|
||||
iniStr = ` |
||||
[storage.actions_artifacts] |
||||
STORAGE_TYPE = my_storage |
||||
|
||||
[storage.my_storage] |
||||
STORAGE_TYPE = minio |
||||
` |
||||
cfg, err = NewConfigProviderFromData(iniStr) |
||||
assert.NoError(t, err) |
||||
assert.NoError(t, loadActionsFrom(cfg)) |
||||
|
||||
assert.EqualValues(t, "local", Actions.LogStorage.Type) |
||||
assert.EqualValues(t, "actions_log", filepath.Base(Actions.LogStorage.Path)) |
||||
assert.EqualValues(t, "minio", Actions.ArtifactStorage.Type) |
||||
assert.EqualValues(t, "actions_artifacts/", Actions.ArtifactStorage.MinioConfig.BasePath) |
||||
|
||||
iniStr = `` |
||||
cfg, err = NewConfigProviderFromData(iniStr) |
||||
assert.NoError(t, err) |
||||
assert.NoError(t, loadActionsFrom(cfg)) |
||||
|
||||
assert.EqualValues(t, "local", Actions.LogStorage.Type) |
||||
assert.EqualValues(t, "actions_log", filepath.Base(Actions.LogStorage.Path)) |
||||
assert.EqualValues(t, "local", Actions.ArtifactStorage.Type) |
||||
assert.EqualValues(t, "actions_artifacts", filepath.Base(Actions.ArtifactStorage.Path)) |
||||
} |
@ -0,0 +1,133 @@ |
||||
// Copyright 2023 The Gitea Authors. All rights reserved.
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
package setting |
||||
|
||||
import ( |
||||
"testing" |
||||
|
||||
"github.com/stretchr/testify/assert" |
||||
) |
||||
|
||||
func Test_getStorageCustomType(t *testing.T) { |
||||
iniStr := ` |
||||
[attachment] |
||||
STORAGE_TYPE = my_minio |
||||
MINIO_BUCKET = gitea-attachment |
||||
|
||||
[storage.my_minio] |
||||
STORAGE_TYPE = minio |
||||
MINIO_ENDPOINT = my_minio:9000 |
||||
` |
||||
cfg, err := NewConfigProviderFromData(iniStr) |
||||
assert.NoError(t, err) |
||||
|
||||
assert.NoError(t, loadAttachmentFrom(cfg)) |
||||
|
||||
assert.EqualValues(t, "minio", Attachment.Storage.Type) |
||||
assert.EqualValues(t, "my_minio:9000", Attachment.Storage.MinioConfig.Endpoint) |
||||
assert.EqualValues(t, "gitea-attachment", Attachment.Storage.MinioConfig.Bucket) |
||||
assert.EqualValues(t, "attachments/", Attachment.Storage.MinioConfig.BasePath) |
||||
} |
||||
|
||||
func Test_getStorageTypeSectionOverridesStorageSection(t *testing.T) { |
||||
iniStr := ` |
||||
[attachment] |
||||
STORAGE_TYPE = minio |
||||
|
||||
[storage.minio] |
||||
MINIO_BUCKET = gitea-minio |
||||
|
||||
[storage] |
||||
MINIO_BUCKET = gitea |
||||
` |
||||
cfg, err := NewConfigProviderFromData(iniStr) |
||||
assert.NoError(t, err) |
||||
|
||||
assert.NoError(t, loadAttachmentFrom(cfg)) |
||||
|
||||
assert.EqualValues(t, "minio", Attachment.Storage.Type) |
||||
assert.EqualValues(t, "gitea-minio", Attachment.Storage.MinioConfig.Bucket) |
||||
assert.EqualValues(t, "attachments/", Attachment.Storage.MinioConfig.BasePath) |
||||
} |
||||
|
||||
func Test_getStorageSpecificOverridesStorage(t *testing.T) { |
||||
iniStr := ` |
||||
[attachment] |
||||
STORAGE_TYPE = minio |
||||
MINIO_BUCKET = gitea-attachment |
||||
|
||||
[storage.attachments] |
||||
MINIO_BUCKET = gitea |
||||
|
||||
[storage] |
||||
STORAGE_TYPE = local |
||||
` |
||||
cfg, err := NewConfigProviderFromData(iniStr) |
||||
assert.NoError(t, err) |
||||
|
||||
assert.NoError(t, loadAttachmentFrom(cfg)) |
||||
|
||||
assert.EqualValues(t, "minio", Attachment.Storage.Type) |
||||
assert.EqualValues(t, "gitea-attachment", Attachment.Storage.MinioConfig.Bucket) |
||||
assert.EqualValues(t, "attachments/", Attachment.Storage.MinioConfig.BasePath) |
||||
} |
||||
|
||||
func Test_getStorageGetDefaults(t *testing.T) { |
||||
cfg, err := NewConfigProviderFromData("") |
||||
assert.NoError(t, err) |
||||
|
||||
assert.NoError(t, loadAttachmentFrom(cfg)) |
||||
|
||||
// default storage is local, so bucket is empty
|
||||
assert.EqualValues(t, "", Attachment.Storage.MinioConfig.Bucket) |
||||
} |
||||
|
||||
func Test_getStorageInheritNameSectionType(t *testing.T) { |
||||
iniStr := ` |
||||
[storage.attachments] |
||||
STORAGE_TYPE = minio |
||||
` |
||||
cfg, err := NewConfigProviderFromData(iniStr) |
||||
assert.NoError(t, err) |
||||
|
||||
assert.NoError(t, loadAttachmentFrom(cfg)) |
||||
|
||||
assert.EqualValues(t, "minio", Attachment.Storage.Type) |
||||
} |
||||
|
||||
func Test_AttachmentStorage(t *testing.T) { |
||||
iniStr := ` |
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
||||
[storage] |
||||
STORAGE_TYPE = minio |
||||
MINIO_ENDPOINT = s3.my-domain.net |
||||
MINIO_BUCKET = gitea |
||||
MINIO_LOCATION = homenet |
||||
MINIO_USE_SSL = true |
||||
MINIO_ACCESS_KEY_ID = correct_key |
||||
MINIO_SECRET_ACCESS_KEY = correct_key |
||||
` |
||||
cfg, err := NewConfigProviderFromData(iniStr) |
||||
assert.NoError(t, err) |
||||
|
||||
assert.NoError(t, loadAttachmentFrom(cfg)) |
||||
storage := Attachment.Storage |
||||
|
||||
assert.EqualValues(t, "minio", storage.Type) |
||||
assert.EqualValues(t, "gitea", storage.MinioConfig.Bucket) |
||||
} |
||||
|
||||
func Test_AttachmentStorage1(t *testing.T) { |
||||
iniStr := ` |
||||
[storage] |
||||
STORAGE_TYPE = minio |
||||
` |
||||
cfg, err := NewConfigProviderFromData(iniStr) |
||||
assert.NoError(t, err) |
||||
|
||||
assert.NoError(t, loadAttachmentFrom(cfg)) |
||||
assert.EqualValues(t, "minio", Attachment.Storage.Type) |
||||
assert.EqualValues(t, "gitea", Attachment.Storage.MinioConfig.Bucket) |
||||
assert.EqualValues(t, "attachments/", Attachment.Storage.MinioConfig.BasePath) |
||||
} |
@ -0,0 +1,77 @@ |
||||
// Copyright 2023 The Gitea Authors. All rights reserved.
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
package setting |
||||
|
||||
import ( |
||||
"testing" |
||||
|
||||
"github.com/stretchr/testify/assert" |
||||
) |
||||
|
||||
func Test_getStorageInheritNameSectionTypeForLFS(t *testing.T) { |
||||
iniStr := ` |
||||
[storage] |
||||
STORAGE_TYPE = minio |
||||
` |
||||
cfg, err := NewConfigProviderFromData(iniStr) |
||||
assert.NoError(t, err) |
||||
assert.NoError(t, loadLFSFrom(cfg)) |
||||
|
||||
assert.EqualValues(t, "minio", LFS.Storage.Type) |
||||
assert.EqualValues(t, "lfs/", LFS.Storage.MinioConfig.BasePath) |
||||
|
||||
iniStr = ` |
||||
[storage.lfs] |
||||
STORAGE_TYPE = minio |
||||
` |
||||
cfg, err = NewConfigProviderFromData(iniStr) |
||||
assert.NoError(t, err) |
||||
assert.NoError(t, loadLFSFrom(cfg)) |
||||
|
||||
assert.EqualValues(t, "minio", LFS.Storage.Type) |
||||
assert.EqualValues(t, "lfs/", LFS.Storage.MinioConfig.BasePath) |
||||
|
||||
iniStr = ` |
||||
[lfs] |
||||
STORAGE_TYPE = my_minio |
||||
|
||||
[storage.my_minio] |
||||
STORAGE_TYPE = minio |
||||
` |
||||
cfg, err = NewConfigProviderFromData(iniStr) |
||||
assert.NoError(t, err) |
||||
assert.NoError(t, loadLFSFrom(cfg)) |
||||
|
||||
assert.EqualValues(t, "minio", LFS.Storage.Type) |
||||
assert.EqualValues(t, "lfs/", LFS.Storage.MinioConfig.BasePath) |
||||
|
||||
iniStr = ` |
||||
[lfs] |
||||
STORAGE_TYPE = my_minio |
||||
MINIO_BASE_PATH = my_lfs/ |
||||
|
||||
[storage.my_minio] |
||||
STORAGE_TYPE = minio |
||||
` |
||||
cfg, err = NewConfigProviderFromData(iniStr) |
||||
assert.NoError(t, err) |
||||
assert.NoError(t, loadLFSFrom(cfg)) |
||||
|
||||
assert.EqualValues(t, "minio", LFS.Storage.Type) |
||||
assert.EqualValues(t, "my_lfs/", LFS.Storage.MinioConfig.BasePath) |
||||
} |
||||
|
||||
func Test_LFSStorage1(t *testing.T) { |
||||
iniStr := ` |
||||
[storage] |
||||
STORAGE_TYPE = minio |
||||
` |
||||
cfg, err := NewConfigProviderFromData(iniStr) |
||||
assert.NoError(t, err) |
||||
|
||||
assert.NoError(t, loadLFSFrom(cfg)) |
||||
assert.EqualValues(t, "minio", LFS.Storage.Type) |
||||
assert.EqualValues(t, "gitea", LFS.Storage.MinioConfig.Bucket) |
||||
assert.EqualValues(t, "lfs/", LFS.Storage.MinioConfig.BasePath) |
||||
} |
@ -0,0 +1,25 @@ |
||||
// Copyright 2023 The Gitea Authors. All rights reserved.
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
package setting |
||||
|
||||
import "fmt" |
||||
|
||||
var RepoArchive = struct { |
||||
Storage *Storage |
||||
}{} |
||||
|
||||
func loadRepoArchiveFrom(rootCfg ConfigProvider) (err error) { |
||||
sec, _ := rootCfg.GetSection("repo-archive") |
||||
if sec == nil { |
||||
RepoArchive.Storage, err = getStorage(rootCfg, "repo-archive", "", nil) |
||||
return err |
||||
} |
||||
|
||||
if err := sec.MapTo(&RepoArchive); err != nil { |
||||
return fmt.Errorf("mapto repoarchive failed: %v", err) |
||||
} |
||||
|
||||
RepoArchive.Storage, err = getStorage(rootCfg, "repo-archive", "", sec) |
||||
return err |
||||
} |
@ -0,0 +1,111 @@ |
||||
// Copyright 2023 The Gitea Authors. All rights reserved.
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
package setting |
||||
|
||||
import ( |
||||
"testing" |
||||
|
||||
"github.com/stretchr/testify/assert" |
||||
) |
||||
|
||||
func Test_getStorageInheritNameSectionTypeForRepoArchive(t *testing.T) { |
||||
// packages storage inherits from storage if nothing configured
|
||||
iniStr := ` |
||||
[storage] |
||||
STORAGE_TYPE = minio |
||||
` |
||||
cfg, err := NewConfigProviderFromData(iniStr) |
||||
assert.NoError(t, err) |
||||
assert.NoError(t, loadRepoArchiveFrom(cfg)) |
||||
|
||||
assert.EqualValues(t, "minio", RepoArchive.Storage.Type) |
||||
assert.EqualValues(t, "repo-archive/", RepoArchive.Storage.MinioConfig.BasePath) |
||||
|
||||
// we can also configure packages storage directly
|
||||
iniStr = ` |
||||
[storage.repo-archive] |
||||
STORAGE_TYPE = minio |
||||
` |
||||
cfg, err = NewConfigProviderFromData(iniStr) |
||||
assert.NoError(t, err) |
||||
assert.NoError(t, loadRepoArchiveFrom(cfg)) |
||||
|
||||
assert.EqualValues(t, "minio", RepoArchive.Storage.Type) |
||||
assert.EqualValues(t, "repo-archive/", RepoArchive.Storage.MinioConfig.BasePath) |
||||
|
||||
// or we can indicate the storage type in the packages section
|
||||
iniStr = ` |
||||
[repo-archive] |
||||
STORAGE_TYPE = my_minio |
||||
|
||||
[storage.my_minio] |
||||
STORAGE_TYPE = minio |
||||
` |
||||
cfg, err = NewConfigProviderFromData(iniStr) |
||||
assert.NoError(t, err) |
||||
assert.NoError(t, loadRepoArchiveFrom(cfg)) |
||||
|
||||
assert.EqualValues(t, "minio", RepoArchive.Storage.Type) |
||||
assert.EqualValues(t, "repo-archive/", RepoArchive.Storage.MinioConfig.BasePath) |
||||
|
||||
// or we can indicate the storage type and minio base path in the packages section
|
||||
iniStr = ` |
||||
[repo-archive] |
||||
STORAGE_TYPE = my_minio |
||||
MINIO_BASE_PATH = my_archive/ |
||||
|
||||
[storage.my_minio] |
||||
STORAGE_TYPE = minio |
||||
` |
||||
cfg, err = NewConfigProviderFromData(iniStr) |
||||
assert.NoError(t, err) |
||||
assert.NoError(t, loadRepoArchiveFrom(cfg)) |
||||
|
||||
assert.EqualValues(t, "minio", RepoArchive.Storage.Type) |
||||
assert.EqualValues(t, "my_archive/", RepoArchive.Storage.MinioConfig.BasePath) |
||||
} |
||||
|
||||
func Test_RepoArchiveStorage(t *testing.T) { |
||||
iniStr := ` |
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
||||
[storage] |
||||
STORAGE_TYPE = minio |
||||
MINIO_ENDPOINT = s3.my-domain.net |
||||
MINIO_BUCKET = gitea |
||||
MINIO_LOCATION = homenet |
||||
MINIO_USE_SSL = true |
||||
MINIO_ACCESS_KEY_ID = correct_key |
||||
MINIO_SECRET_ACCESS_KEY = correct_key |
||||
` |
||||
cfg, err := NewConfigProviderFromData(iniStr) |
||||
assert.NoError(t, err) |
||||
|
||||
assert.NoError(t, loadRepoArchiveFrom(cfg)) |
||||
storage := RepoArchive.Storage |
||||
|
||||
assert.EqualValues(t, "minio", storage.Type) |
||||
assert.EqualValues(t, "gitea", storage.MinioConfig.Bucket) |
||||
|
||||
iniStr = ` |
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
||||
[storage.repo-archive] |
||||
STORAGE_TYPE = s3 |
||||
[storage.s3] |
||||
STORAGE_TYPE = minio |
||||
MINIO_ENDPOINT = s3.my-domain.net |
||||
MINIO_BUCKET = gitea |
||||
MINIO_LOCATION = homenet |
||||
MINIO_USE_SSL = true |
||||
MINIO_ACCESS_KEY_ID = correct_key |
||||
MINIO_SECRET_ACCESS_KEY = correct_key |
||||
` |
||||
cfg, err = NewConfigProviderFromData(iniStr) |
||||
assert.NoError(t, err) |
||||
|
||||
assert.NoError(t, loadRepoArchiveFrom(cfg)) |
||||
storage = RepoArchive.Storage |
||||
|
||||
assert.EqualValues(t, "minio", storage.Type) |
||||
assert.EqualValues(t, "gitea", storage.MinioConfig.Bucket) |
||||
} |
Loading…
Reference in new issue