From fe8c86feb85b4dc3a021cae67e2af60ddc469e6f Mon Sep 17 00:00:00 2001 From: Kostiantyn Kalynovskyi Date: Fri, 22 Jan 2021 22:26:37 +0000 Subject: [PATCH] Add InventoryRepoName field to config If inventory repo name is not specified, phaseRepoDir will be used Change-Id: Iea3eca5d7ca14c549696b7214c8d4b07ef3e5bf4 --- .../get-all-manifests.golden | 3 ++ .../get-manifest.golden | 1 + pkg/config/config.go | 20 +++++++++++- pkg/config/config_test.go | 32 ++++++++++++++++++- pkg/config/errors.go | 3 +- pkg/config/manifest.go | 4 +++ pkg/config/testdata/config-string.yaml | 1 + pkg/config/testdata/manifest-string.yaml | 1 + pkg/config/utils.go | 16 ++++++---- pkg/inventory/inventory.go | 2 +- pkg/inventory/inventory_test.go | 3 +- testutil/testconfig.go | 1 + 12 files changed, 75 insertions(+), 12 deletions(-) diff --git a/cmd/config/testdata/TestGetManifestConfigCmdGoldenOutput/get-all-manifests.golden b/cmd/config/testdata/TestGetManifestConfigCmdGoldenOutput/get-all-manifests.golden index 4529fd5ed..8de29e306 100644 --- a/cmd/config/testdata/TestGetManifestConfigCmdGoldenOutput/get-all-manifests.golden +++ b/cmd/config/testdata/TestGetManifestConfigCmdGoldenOutput/get-all-manifests.golden @@ -1,11 +1,14 @@ +inventoryRepositoryName: "" metadataPath: "" phaseRepositoryName: bar_phase_repo targetPath: bar_target_path +inventoryRepositoryName: "" metadataPath: "" phaseRepositoryName: baz_phase_repo targetPath: baz_target_path +inventoryRepositoryName: "" metadataPath: "" phaseRepositoryName: foo_phase_repo targetPath: foo_target_path diff --git a/cmd/config/testdata/TestGetManifestConfigCmdGoldenOutput/get-manifest.golden b/cmd/config/testdata/TestGetManifestConfigCmdGoldenOutput/get-manifest.golden index c4d16b089..43170e7db 100644 --- a/cmd/config/testdata/TestGetManifestConfigCmdGoldenOutput/get-manifest.golden +++ b/cmd/config/testdata/TestGetManifestConfigCmdGoldenOutput/get-manifest.golden @@ -1,3 +1,4 @@ +inventoryRepositoryName: "" metadataPath: "" phaseRepositoryName: foo_phase_repo targetPath: foo_target_path diff --git a/pkg/config/config.go b/pkg/config/config.go index eb07f4872..0cdf3fa47 100644 --- a/pkg/config/config.go +++ b/pkg/config/config.go @@ -348,7 +348,25 @@ func (c *Config) CurrentContextPhaseRepositoryDir() (string, error) { } repo, exist := ccm.Repositories[ccm.PhaseRepositoryName] if !exist { - return "", ErrMissingRepositoryName{} + return "", ErrMissingRepositoryName{RepoType: "phase"} + } + return util.GitDirNameFromURL(repo.URL()), nil +} + +// CurrentContextInventoryRepositoryName returns phase inventory directory from current context's manifest +// if it is not defined PhaseRepositoryName will be used instead +func (c *Config) CurrentContextInventoryRepositoryName() (string, error) { + ccm, err := c.CurrentContextManifest() + if err != nil { + return "", err + } + repoName := ccm.InventoryRepositoryName + if repoName == "" { + repoName = ccm.PhaseRepositoryName + } + repo, exist := ccm.Repositories[repoName] + if !exist { + return "", ErrMissingRepositoryName{RepoType: "inventory"} } return util.GitDirNameFromURL(repo.URL()), nil } diff --git a/pkg/config/config_test.go b/pkg/config/config_test.go index 97711f000..105eb7c4a 100644 --- a/pkg/config/config_test.go +++ b/pkg/config/config_test.go @@ -336,10 +336,40 @@ func TestCurrentPhaseRepositoryDir(t *testing.T) { conf.Manifests[defaultString].PhaseRepositoryName = "nonexisting" phaseRepoDir, err = conf.CurrentContextPhaseRepositoryDir() require.Error(t, err) - assert.Equal(t, config.ErrMissingRepositoryName{}, err) + assert.Equal(t, config.ErrMissingRepositoryName{RepoType: "phase"}, err) assert.Equal(t, "", phaseRepoDir) } +func TestCurrentInventoryRepositoryDir(t *testing.T) { + conf, cleanup := testutil.InitConfig(t) + defer cleanup(t) + + conf.CurrentContext = currentContextName + conf.Contexts[currentContextName].Manifest = defaultString + + invRepoDir, err := conf.CurrentContextInventoryRepositoryName() + require.NoError(t, err) + assert.Equal(t, util.GitDirNameFromURL( + conf.Manifests[defaultString].Repositories[conf.Manifests[defaultString].PhaseRepositoryName].URL()), + invRepoDir) + + conf.Manifests[defaultString].InventoryRepositoryName = "nonexisting" + invRepoDir, err = conf.CurrentContextInventoryRepositoryName() + require.Error(t, err) + assert.Equal(t, config.ErrMissingRepositoryName{RepoType: "inventory"}, err) + assert.Equal(t, "", invRepoDir) + + invRepoName := "inv-repo" + invRepoURL := "/my-repository" + conf.Manifests[defaultString].Repositories[invRepoName] = &config.Repository{URLString: invRepoURL} + conf.Manifests[defaultString].InventoryRepositoryName = invRepoName + invRepoDir, err = conf.CurrentContextInventoryRepositoryName() + require.NoError(t, err) + assert.Equal(t, util.GitDirNameFromURL( + conf.Manifests[defaultString].Repositories[conf.Manifests[defaultString].InventoryRepositoryName].URL()), + invRepoDir) +} + func TestCurrentContextManifestMetadata(t *testing.T) { expectedMeta := &config.Metadata{ Inventory: &config.InventoryMeta{ diff --git a/pkg/config/errors.go b/pkg/config/errors.go index 1b63a6cc4..90cf9098c 100644 --- a/pkg/config/errors.go +++ b/pkg/config/errors.go @@ -83,10 +83,11 @@ func (e ErrRepositoryNotFound) Error() string { // ErrMissingRepositoryName is returned if repository name is empty // when using in set-manifest type ErrMissingRepositoryName struct { + RepoType string } func (e ErrMissingRepositoryName) Error() string { - return "Missing repository name." + return fmt.Sprintf("Missing '%s' repository name.", e.RepoType) } // ErrMissingRepoURL is returned if repository is empty diff --git a/pkg/config/manifest.go b/pkg/config/manifest.go index 728d9cfa8..20978d452 100644 --- a/pkg/config/manifest.go +++ b/pkg/config/manifest.go @@ -22,6 +22,10 @@ type Manifest struct { // PhaseRepositoryName is a name of the repo, that contains site/ directory // and is a starting point for building document bundle PhaseRepositoryName string `json:"phaseRepositoryName"` + // InventoryRepositoryName is a name of the repo contains inventory objects + // to be used mostly with baremetal deployments + // If not defined PhaseRepositoryName will be used to locate inventory + InventoryRepositoryName string `json:"inventoryRepositoryName"` // ExtraRepositories is the map of extra repositories addressable by a name Repositories map[string]*Repository `json:"repositories,omitempty"` // TargetPath Local Target path for working or home directory for all Manifest Cloned/Returned/Generated diff --git a/pkg/config/testdata/config-string.yaml b/pkg/config/testdata/config-string.yaml index c8eebdf41..f4151c19c 100644 --- a/pkg/config/testdata/config-string.yaml +++ b/pkg/config/testdata/config-string.yaml @@ -17,6 +17,7 @@ managementConfiguration: type: redfish manifests: dummy_manifest: + inventoryRepositoryName: primary metadataPath: metadata.yaml phaseRepositoryName: primary repositories: diff --git a/pkg/config/testdata/manifest-string.yaml b/pkg/config/testdata/manifest-string.yaml index cb67f9432..7aa0cc9c0 100644 --- a/pkg/config/testdata/manifest-string.yaml +++ b/pkg/config/testdata/manifest-string.yaml @@ -1,3 +1,4 @@ +inventoryRepositoryName: primary metadataPath: metadata.yaml phaseRepositoryName: primary repositories: diff --git a/pkg/config/utils.go b/pkg/config/utils.go index 7a180cd91..b444a99aa 100644 --- a/pkg/config/utils.go +++ b/pkg/config/utils.go @@ -49,9 +49,10 @@ func NewConfig() *Config { }, }, }, - TargetPath: "/tmp/" + AirshipDefaultManifest, - PhaseRepositoryName: DefaultTestPhaseRepo, - MetadataPath: DefaultManifestMetadataFile, + TargetPath: "/tmp/" + AirshipDefaultManifest, + PhaseRepositoryName: DefaultTestPhaseRepo, + InventoryRepositoryName: DefaultTestPhaseRepo, + MetadataPath: DefaultManifestMetadataFile, }, }, } @@ -88,10 +89,11 @@ func NewContext() *Context { // object with non-nil maps func NewManifest() *Manifest { return &Manifest{ - PhaseRepositoryName: DefaultTestPhaseRepo, - TargetPath: DefaultTargetPath, - Repositories: map[string]*Repository{DefaultTestPhaseRepo: NewRepository()}, - MetadataPath: DefaultManifestMetadataFile, + InventoryRepositoryName: DefaultTestPhaseRepo, + PhaseRepositoryName: DefaultTestPhaseRepo, + TargetPath: DefaultTargetPath, + Repositories: map[string]*Repository{DefaultTestPhaseRepo: NewRepository()}, + MetadataPath: DefaultManifestMetadataFile, } } diff --git a/pkg/inventory/inventory.go b/pkg/inventory/inventory.go index 10fe79fe9..a655e8c16 100644 --- a/pkg/inventory/inventory.go +++ b/pkg/inventory/inventory.go @@ -54,7 +54,7 @@ func (i Invetnory) BaremetalInventory() (ifc.BaremetalInventory, error) { return nil, err } - phaseDir, err := cfg.CurrentContextPhaseRepositoryDir() + phaseDir, err := cfg.CurrentContextInventoryRepositoryName() if err != nil { return nil, err } diff --git a/pkg/inventory/inventory_test.go b/pkg/inventory/inventory_test.go index d3c3dcdd0..2914dea0e 100644 --- a/pkg/inventory/inventory_test.go +++ b/pkg/inventory/inventory_test.go @@ -69,6 +69,7 @@ func TestBaremetalInventory(t *testing.T) { require.NoError(t, err) manifest.MetadataPath = "metadata.yaml" manifest.PhaseRepositoryName = "testdata" + manifest.InventoryRepositoryName = "testdata" manifest.Repositories["testdata"] = &config.Repository{ URLString: "/myrepo/testdata", } @@ -87,7 +88,7 @@ func TestBaremetalInventory(t *testing.T) { require.Error(t, err) assert.Contains(t, err.Error(), tt.errString) } else { - require.NoError(t, err) + assert.NoError(t, err) assert.NotNil(t, bmhInv) } }) diff --git a/testutil/testconfig.go b/testutil/testconfig.go index fdd7eb3aa..b9c14e38d 100644 --- a/testutil/testconfig.go +++ b/testutil/testconfig.go @@ -69,6 +69,7 @@ func DummyManifest() *config.Manifest { // Repositories is the map of repository addressable by a name m.Repositories = map[string]*config.Repository{"primary": DummyRepository()} m.PhaseRepositoryName = "primary" + m.InventoryRepositoryName = "primary" m.MetadataPath = "metadata.yaml" m.TargetPath = "/var/tmp/" return m