Add repository metadata

This commit adds repository metadata object and method to load it
from manifests.

Metadata is to be changed and extended in the future, when phases
start to be implemented.

Change-Id: Idc9374220f62df8b1a80c276278361efa4503e12
Relates-To: #263
Relates-To: #255
Relates-To: #240
This commit is contained in:
Kostiantyn Kalynovskyi 2020-06-25 22:33:22 -05:00
parent 901c314f02
commit 852b0ad29e
10 changed files with 130 additions and 0 deletions

@ -1,11 +1,14 @@
metadataPath: ""
primaryRepositoryName: bar_primary_repo
subPath: ""
targetPath: bar_target_path
metadataPath: ""
primaryRepositoryName: baz_primary_repo
subPath: ""
targetPath: baz_target_path
metadataPath: ""
primaryRepositoryName: foo_primary_repo
subPath: ""
targetPath: foo_target_path

@ -1,3 +1,4 @@
metadataPath: ""
primaryRepositoryName: foo_primary_repo
subPath: ""
targetPath: foo_target_path

@ -1079,6 +1079,20 @@ func (c *Config) Purge() error {
return os.Remove(c.loadedConfigPath)
}
// CurrentContextManifestMetadata gets manifest metadata
func (c *Config) CurrentContextManifestMetadata() (*Metadata, error) {
manifest, err := c.CurrentContextManifest()
if err != nil {
return nil, err
}
meta := &Metadata{}
err = util.ReadYAMLFile(manifest.MetadataPath, meta)
if err != nil {
return nil, err
}
return meta, nil
}
// DecodeAuthInfo returns authInfo with credentials decoded
func DecodeAuthInfo(authinfo *clientcmdapi.AuthInfo) (*clientcmdapi.AuthInfo, error) {
password := authinfo.Password

@ -21,6 +21,7 @@ import (
"io/ioutil"
"os"
"path/filepath"
"strings"
"testing"
"github.com/stretchr/testify/assert"
@ -551,6 +552,87 @@ func TestCurrentContextClusterName(t *testing.T) {
assert.Equal(t, expectedClusterName, actualClusterName)
}
func TestCurrentContextManifestMetadata(t *testing.T) {
expectedMeta := &config.Metadata{
Inventory: &config.InventoryMeta{
Path: "manifests/site/inventory",
},
PhaseMeta: &config.PhaseMeta{
Path: "manifests/site/phases",
},
}
conf, cleanup := testutil.InitConfig(t)
defer cleanup(t)
tests := []struct {
name string
metaPath string
currentContext string
expectErr bool
errorChecker func(error) bool
meta *config.Metadata
}{
{
name: "default metadata",
metaPath: "testdata/metadata.yaml",
expectErr: false,
currentContext: "testContext",
meta: &config.Metadata{
Inventory: &config.InventoryMeta{
Path: "manifests/site/inventory",
},
PhaseMeta: &config.PhaseMeta{
Path: "manifests/site/phases",
},
},
},
{
name: "no such file or directory",
metaPath: "does not exist",
currentContext: "testContext",
expectErr: true,
errorChecker: os.IsNotExist,
},
{
name: "missing context",
currentContext: "doesn't exist",
expectErr: true,
errorChecker: func(err error) bool {
return strings.Contains(err.Error(), "Missing configuration")
},
},
}
for _, tt := range tests {
tt := tt
t.Run(tt.name, func(t *testing.T) {
context := &config.Context{
Manifest: "testManifest",
}
manifest := &config.Manifest{
MetadataPath: tt.metaPath,
TargetPath: ".",
}
conf.Manifests = map[string]*config.Manifest{
"testManifest": manifest,
}
conf.Contexts = map[string]*config.Context{
"testContext": context,
}
conf.CurrentContext = tt.currentContext
meta, err := conf.CurrentContextManifestMetadata()
if tt.expectErr {
t.Logf("error is %v", err)
require.Error(t, err)
require.NotNil(t, tt.errorChecker)
assert.True(t, tt.errorChecker(err))
} else {
require.NoError(t, err)
require.NotNil(t, meta)
assert.Equal(t, expectedMeta, meta)
}
})
}
}
func TestNewClusterComplexNameFromKubeClusterName(t *testing.T) {
tests := []struct {
name string

@ -74,4 +74,6 @@ const (
DefaultTargetPath = "/tmp/default"
// DefaultSubPath holds default sub path
DefaultSubPath = "manifest/default"
// DefaultManifestMetadataFile default path to manifest metadata file
DefaultManifestMetadataFile = "manifests/site/test-site/metadata.yaml"
)

@ -35,6 +35,8 @@ type Manifest struct {
// you would expect that at treasuremap/manifests you would have ephemeral/initinfra and
// ephemera/target directories, containing kustomize.yaml.
SubPath string `json:"subPath"`
// MetadataPath path to a metadata file relative to TargetPath
MetadataPath string `json:"metadataPath"`
}
// Repository is a tuple that holds the information for the remote sources of manifest yaml documents.
@ -84,6 +86,25 @@ type RepoCheckout struct {
ForceCheckout bool `json:"force"`
}
// Metadata holds entrypoints for phases, inventory and clusterctl
type Metadata struct {
Inventory *InventoryMeta `json:"inventory,omitempty"`
PhaseMeta *PhaseMeta `json:"phase,omitempty"`
}
// InventoryMeta holds inventory metadata, this is to be extended in the future
// when we have more information how to handle non-baremetal inventories
// path is a kustomize entrypoint against which we will build bundle containing bmh hosts
type InventoryMeta struct {
Path string `json:"path,omitempty"`
}
// PhaseMeta holds phase metadata, right now it is only path, but maybe extended further
// path is a kustomize entrypoint against which we will build bundle with phase objects
type PhaseMeta struct {
Path string `json:"path,omitempty"`
}
// Manifest functions
func (m *Manifest) String() string {
yamlData, err := yaml.Marshal(&m)

@ -32,6 +32,7 @@ managementConfiguration:
type: redfish
manifests:
dummy_manifest:
metadataPath: manifests/site/test-site/metadata.yaml
primaryRepositoryName: primary
repositories:
primary:

@ -1,3 +1,4 @@
metadataPath: manifests/site/test-site/metadata.yaml
primaryRepositoryName: primary
repositories:
primary:

4
pkg/config/testdata/metadata.yaml vendored Normal file

@ -0,0 +1,4 @@
inventory:
path: "manifests/site/inventory"
phase:
path: "manifests/site/phases"

@ -93,6 +93,7 @@ func NewManifest() *Manifest {
TargetPath: DefaultTargetPath,
SubPath: DefaultSubPath,
Repositories: map[string]*Repository{DefaultTestPrimaryRepo: NewRepository()},
MetadataPath: DefaultManifestMetadataFile,
}
}