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