Merge "Update metadata.yaml to kubernetes style"
This commit is contained in:
commit
575023cfcf
@ -1,3 +1,10 @@
|
|||||||
phase:
|
apiVersion: airshipit.org/v1alpha1
|
||||||
path: manifests/site/az-test-site/phases
|
kind: ManifestMetadata
|
||||||
docEntryPointPrefix: manifests/site/az-test-site
|
metadata:
|
||||||
|
name: manifest-metadata
|
||||||
|
spec:
|
||||||
|
phase:
|
||||||
|
path: manifests/site/az-test-site/phases
|
||||||
|
docEntryPointPrefix: manifests/site/az-test-site
|
||||||
|
inventory:
|
||||||
|
path: ""
|
||||||
|
@ -1,3 +1,10 @@
|
|||||||
phase:
|
apiVersion: airshipit.org/v1alpha1
|
||||||
path: manifests/site/docker-test-site/phases
|
kind: ManifestMetadata
|
||||||
docEntryPointPrefix: manifests/site/docker-test-site
|
metadata:
|
||||||
|
name: manifest-metadata
|
||||||
|
spec:
|
||||||
|
phase:
|
||||||
|
path: manifests/site/docker-test-site/phases
|
||||||
|
docEntryPointPrefix: manifests/site/docker-test-site
|
||||||
|
inventory:
|
||||||
|
path: ""
|
||||||
|
@ -1,3 +1,10 @@
|
|||||||
phase:
|
apiVersion: airshipit.org/v1alpha1
|
||||||
path: manifests/site/gcp-test-site/phases
|
kind: ManifestMetadata
|
||||||
docEntryPointPrefix: manifests/site/gcp-test-site
|
metadata:
|
||||||
|
name: manifest-metadata
|
||||||
|
spec:
|
||||||
|
phase:
|
||||||
|
path: manifests/site/gcp-test-site/phases
|
||||||
|
docEntryPointPrefix: manifests/site/gcp-test-site
|
||||||
|
inventory:
|
||||||
|
path: ""
|
||||||
|
@ -1,3 +1,10 @@
|
|||||||
phase:
|
apiVersion: airshipit.org/v1alpha1
|
||||||
path: manifests/site/openstack-test-site/phases
|
kind: ManifestMetadata
|
||||||
docEntryPointPrefix: manifests/site/openstack-test-site
|
metadata:
|
||||||
|
name: manifest-metadata
|
||||||
|
spec:
|
||||||
|
phase:
|
||||||
|
path: manifests/site/openstack-test-site/phases
|
||||||
|
docEntryPointPrefix: manifests/site/openstack-test-site
|
||||||
|
inventory:
|
||||||
|
path: ""
|
||||||
|
2
manifests/site/test-site/kustomization.yaml
Normal file
2
manifests/site/test-site/kustomization.yaml
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
resources:
|
||||||
|
- metadata.yaml
|
@ -1,5 +1,10 @@
|
|||||||
phase:
|
apiVersion: airshipit.org/v1alpha1
|
||||||
path: manifests/site/test-site/phases
|
kind: ManifestMetadata
|
||||||
docEntryPointPrefix: manifests/site/test-site
|
metadata:
|
||||||
inventory:
|
name: manifest-metadata
|
||||||
path: manifests/site/test-site/host-inventory
|
spec:
|
||||||
|
phase:
|
||||||
|
path: manifests/site/test-site/phases
|
||||||
|
docEntryPointPrefix: manifests/site/test-site
|
||||||
|
inventory:
|
||||||
|
path: manifests/site/test-site/host-inventory
|
||||||
|
@ -53,6 +53,7 @@ func init() {
|
|||||||
&BootConfiguration{},
|
&BootConfiguration{},
|
||||||
&GenericContainer{},
|
&GenericContainer{},
|
||||||
&BaremetalManager{},
|
&BaremetalManager{},
|
||||||
|
&ManifestMetadata{},
|
||||||
)
|
)
|
||||||
_ = AddToScheme(Scheme) //nolint:errcheck
|
_ = AddToScheme(Scheme) //nolint:errcheck
|
||||||
}
|
}
|
||||||
|
49
pkg/api/v1alpha1/metadata_types.go
Normal file
49
pkg/api/v1alpha1/metadata_types.go
Normal file
@ -0,0 +1,49 @@
|
|||||||
|
/*
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
https://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package v1alpha1
|
||||||
|
|
||||||
|
import (
|
||||||
|
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||||
|
)
|
||||||
|
|
||||||
|
// +kubebuilder:object:root=true
|
||||||
|
|
||||||
|
// ManifestMetadata defines site specific metadata like inventory and phase path
|
||||||
|
type ManifestMetadata struct {
|
||||||
|
metav1.TypeMeta `json:",inline"`
|
||||||
|
metav1.ObjectMeta `json:"metadata,omitempty"`
|
||||||
|
Phase PhaseSpec `json:"phase,omitempty"`
|
||||||
|
Inventory InventorySpec `json:"inventory,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// PhaseSpec represents configuration for a particular phase. It contains a reference to
|
||||||
|
// the site specific manifest path and doument entry prefix
|
||||||
|
type PhaseSpec struct {
|
||||||
|
Path string `json:"path"`
|
||||||
|
DocumentEntryPointPrefix string `json:"documentEntryPointPrefix"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// InventorySpec contains the path to the host inventory
|
||||||
|
type InventorySpec struct {
|
||||||
|
Path string `json:"path"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// DefaultManifestMetadata can be used to safely unmarshal phase object without nil pointers
|
||||||
|
func DefaultManifestMetadata() *ManifestMetadata {
|
||||||
|
return &ManifestMetadata{
|
||||||
|
Phase: PhaseSpec{},
|
||||||
|
Inventory: InventorySpec{},
|
||||||
|
}
|
||||||
|
}
|
@ -826,6 +826,21 @@ func (in *InitOptions) DeepCopy() *InitOptions {
|
|||||||
return out
|
return out
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
||||||
|
func (in *InventorySpec) DeepCopyInto(out *InventorySpec) {
|
||||||
|
*out = *in
|
||||||
|
}
|
||||||
|
|
||||||
|
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new InventorySpec.
|
||||||
|
func (in *InventorySpec) DeepCopy() *InventorySpec {
|
||||||
|
if in == nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
out := new(InventorySpec)
|
||||||
|
in.DeepCopyInto(out)
|
||||||
|
return out
|
||||||
|
}
|
||||||
|
|
||||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
||||||
func (in *IronicSpec) DeepCopyInto(out *IronicSpec) {
|
func (in *IronicSpec) DeepCopyInto(out *IronicSpec) {
|
||||||
*out = *in
|
*out = *in
|
||||||
@ -1096,6 +1111,33 @@ func (in *Link) DeepCopy() *Link {
|
|||||||
return out
|
return out
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
||||||
|
func (in *ManifestMetadata) DeepCopyInto(out *ManifestMetadata) {
|
||||||
|
*out = *in
|
||||||
|
out.TypeMeta = in.TypeMeta
|
||||||
|
in.ObjectMeta.DeepCopyInto(&out.ObjectMeta)
|
||||||
|
out.Phase = in.Phase
|
||||||
|
out.Inventory = in.Inventory
|
||||||
|
}
|
||||||
|
|
||||||
|
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ManifestMetadata.
|
||||||
|
func (in *ManifestMetadata) DeepCopy() *ManifestMetadata {
|
||||||
|
if in == nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
out := new(ManifestMetadata)
|
||||||
|
in.DeepCopyInto(out)
|
||||||
|
return out
|
||||||
|
}
|
||||||
|
|
||||||
|
// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.
|
||||||
|
func (in *ManifestMetadata) DeepCopyObject() runtime.Object {
|
||||||
|
if c := in.DeepCopy(); c != nil {
|
||||||
|
return c
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
||||||
func (in *MoveOptions) DeepCopyInto(out *MoveOptions) {
|
func (in *MoveOptions) DeepCopyInto(out *MoveOptions) {
|
||||||
*out = *in
|
*out = *in
|
||||||
@ -1319,6 +1361,21 @@ func (in *PhasePlan) DeepCopyObject() runtime.Object {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
||||||
|
func (in *PhaseSpec) DeepCopyInto(out *PhaseSpec) {
|
||||||
|
*out = *in
|
||||||
|
}
|
||||||
|
|
||||||
|
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PhaseSpec.
|
||||||
|
func (in *PhaseSpec) DeepCopy() *PhaseSpec {
|
||||||
|
if in == nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
out := new(PhaseSpec)
|
||||||
|
in.DeepCopyInto(out)
|
||||||
|
return out
|
||||||
|
}
|
||||||
|
|
||||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
||||||
func (in *PhaseStep) DeepCopyInto(out *PhaseStep) {
|
func (in *PhaseStep) DeepCopyInto(out *PhaseStep) {
|
||||||
*out = *in
|
*out = *in
|
||||||
|
@ -327,6 +327,15 @@ func (c *Config) CurrentContextManifest() (*Manifest, error) {
|
|||||||
return manifest, nil
|
return manifest, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// CurrentContextMetadataPath returns metadata path from current context's manifest
|
||||||
|
func (c *Config) CurrentContextMetadataPath() (string, error) {
|
||||||
|
ccm, err := c.CurrentContextManifest()
|
||||||
|
if err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
return ccm.GetMetadataPath(), nil
|
||||||
|
}
|
||||||
|
|
||||||
// CurrentContextTargetPath returns target path from current context's manifest
|
// CurrentContextTargetPath returns target path from current context's manifest
|
||||||
func (c *Config) CurrentContextTargetPath() (string, error) {
|
func (c *Config) CurrentContextTargetPath() (string, error) {
|
||||||
ccm, err := c.CurrentContextManifest()
|
ccm, err := c.CurrentContextManifest()
|
||||||
@ -509,34 +518,6 @@ func (c *Config) Purge() error {
|
|||||||
return c.fileSystem.RemoveAll(c.loadedConfigPath)
|
return c.fileSystem.RemoveAll(c.loadedConfigPath)
|
||||||
}
|
}
|
||||||
|
|
||||||
// CurrentContextManifestMetadata gets manifest metadata
|
|
||||||
func (c *Config) CurrentContextManifestMetadata() (*Metadata, error) {
|
|
||||||
manifest, err := c.CurrentContextManifest()
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
phaseRepoDir, err := c.CurrentContextPhaseRepositoryDir()
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
meta := &Metadata{
|
|
||||||
// Populate with empty values to avoid nil pointers
|
|
||||||
Inventory: &InventoryMeta{},
|
|
||||||
PhaseMeta: &PhaseMeta{},
|
|
||||||
}
|
|
||||||
|
|
||||||
data, err := c.fileSystem.ReadFile(filepath.Join(manifest.GetTargetPath(), phaseRepoDir, manifest.MetadataPath))
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
err = yaml.Unmarshal(data, meta)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
return meta, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// WorkDir returns working directory for airshipctl. Creates if it doesn't exist
|
// WorkDir returns working directory for airshipctl. Creates if it doesn't exist
|
||||||
func (c *Config) WorkDir() (dir string, err error) {
|
func (c *Config) WorkDir() (dir string, err error) {
|
||||||
dir = filepath.Join(util.UserHomeDir(), AirshipConfigDir)
|
dir = filepath.Join(util.UserHomeDir(), AirshipConfigDir)
|
||||||
|
@ -19,7 +19,6 @@ import (
|
|||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
"os"
|
"os"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
"strings"
|
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"opendev.org/airship/airshipctl/pkg/util"
|
"opendev.org/airship/airshipctl/pkg/util"
|
||||||
@ -371,94 +370,6 @@ func TestCurrentInventoryRepositoryDir(t *testing.T) {
|
|||||||
invRepoDir)
|
invRepoDir)
|
||||||
}
|
}
|
||||||
|
|
||||||
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: "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: "doesn't 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",
|
|
||||||
}
|
|
||||||
repos := map[string]*config.Repository{
|
|
||||||
config.DefaultTestPhaseRepo: {
|
|
||||||
URLString: "",
|
|
||||||
},
|
|
||||||
}
|
|
||||||
manifest := &config.Manifest{
|
|
||||||
MetadataPath: tt.metaPath,
|
|
||||||
TargetPath: "testdata",
|
|
||||||
PhaseRepositoryName: config.DefaultTestPhaseRepo,
|
|
||||||
Repositories: repos,
|
|
||||||
}
|
|
||||||
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 TestManagementConfigurationByName(t *testing.T) {
|
func TestManagementConfigurationByName(t *testing.T) {
|
||||||
conf, cleanupConfig := testutil.InitConfig(t)
|
conf, cleanupConfig := testutil.InitConfig(t)
|
||||||
defer cleanupConfig(t)
|
defer cleanupConfig(t)
|
||||||
|
@ -81,3 +81,8 @@ func (m *Manifest) String() string {
|
|||||||
func (m *Manifest) GetTargetPath() string {
|
func (m *Manifest) GetTargetPath() string {
|
||||||
return m.TargetPath
|
return m.TargetPath
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// GetMetadataPath returns MetadataPath field
|
||||||
|
func (m *Manifest) GetMetadataPath() string {
|
||||||
|
return m.MetadataPath
|
||||||
|
}
|
||||||
|
69
pkg/document/metadata/metadata.go
Normal file
69
pkg/document/metadata/metadata.go
Normal file
@ -0,0 +1,69 @@
|
|||||||
|
/*
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
https://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package metadata
|
||||||
|
|
||||||
|
import (
|
||||||
|
"io/ioutil"
|
||||||
|
|
||||||
|
apiv1 "opendev.org/airship/airshipctl/pkg/api/v1alpha1"
|
||||||
|
"opendev.org/airship/airshipctl/pkg/document"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Metadata defines the site specific Phase properties like
|
||||||
|
// PhasePath, DocEntryPointPrefix & InventoryPath
|
||||||
|
type Metadata struct {
|
||||||
|
MetadataPhasePath string
|
||||||
|
DocEntryPointPrefix string
|
||||||
|
InventoryPath string
|
||||||
|
}
|
||||||
|
|
||||||
|
// Config returns Metadata with the attributes of Metadata updated
|
||||||
|
func Config(phaseBundlePath string) (Metadata, error) {
|
||||||
|
m := Metadata{}
|
||||||
|
|
||||||
|
data, err := ioutil.ReadFile(phaseBundlePath)
|
||||||
|
if err != nil {
|
||||||
|
return Metadata{}, err
|
||||||
|
}
|
||||||
|
bundle, err := document.NewBundleFromBytes(data)
|
||||||
|
if err != nil {
|
||||||
|
return Metadata{}, err
|
||||||
|
}
|
||||||
|
|
||||||
|
metaConfig := &apiv1.ManifestMetadata{}
|
||||||
|
selector, err := document.NewSelector().ByObject(metaConfig, apiv1.Scheme)
|
||||||
|
if err != nil {
|
||||||
|
return Metadata{}, err
|
||||||
|
}
|
||||||
|
doc, err := bundle.SelectOne(selector)
|
||||||
|
if err != nil {
|
||||||
|
return Metadata{}, err
|
||||||
|
}
|
||||||
|
|
||||||
|
m.MetadataPhasePath, err = doc.GetString("spec.phase.path")
|
||||||
|
if err != nil {
|
||||||
|
return Metadata{}, err
|
||||||
|
}
|
||||||
|
m.DocEntryPointPrefix, err = doc.GetString("spec.phase.docEntryPointPrefix")
|
||||||
|
if err != nil {
|
||||||
|
return Metadata{}, err
|
||||||
|
}
|
||||||
|
m.InventoryPath, err = doc.GetString("spec.inventory.path")
|
||||||
|
if err != nil {
|
||||||
|
return Metadata{}, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return m, nil
|
||||||
|
}
|
80
pkg/document/metadata/metadata_test.go
Normal file
80
pkg/document/metadata/metadata_test.go
Normal file
@ -0,0 +1,80 @@
|
|||||||
|
/*
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
https://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package metadata_test
|
||||||
|
|
||||||
|
import (
|
||||||
|
"path/filepath"
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"github.com/stretchr/testify/assert"
|
||||||
|
|
||||||
|
"opendev.org/airship/airshipctl/pkg/config"
|
||||||
|
meta "opendev.org/airship/airshipctl/pkg/document/metadata"
|
||||||
|
"opendev.org/airship/airshipctl/testutil"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestConfig(t *testing.T) {
|
||||||
|
rs := testutil.DummyConfig()
|
||||||
|
dummyManifest := rs.Manifests["dummy_manifest"]
|
||||||
|
dummyManifest.TargetPath = "testdata"
|
||||||
|
dummyManifest.PhaseRepositoryName = config.DefaultTestPhaseRepo
|
||||||
|
dummyManifest.Repositories = map[string]*config.Repository{
|
||||||
|
config.DefaultTestPhaseRepo: {
|
||||||
|
URLString: "",
|
||||||
|
},
|
||||||
|
}
|
||||||
|
tests := []struct {
|
||||||
|
name string
|
||||||
|
metadataFile string
|
||||||
|
expError string
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
name: "valid metadata file",
|
||||||
|
metadataFile: "valid_metadata.yaml",
|
||||||
|
expError: "",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "non existent metadata file",
|
||||||
|
metadataFile: "nonexistent_metadata.yaml",
|
||||||
|
expError: "no such file or directory",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "invalid metadata file",
|
||||||
|
metadataFile: "invalid_metadata.yaml",
|
||||||
|
expError: "missing Resource metadata",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "incomplete metadata file",
|
||||||
|
metadataFile: "incomplete_metadata.yaml",
|
||||||
|
expError: "no field named 'spec.phase.docEntryPointPrefix'",
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, tt := range tests {
|
||||||
|
tt := tt
|
||||||
|
t.Run(tt.name, func(t *testing.T) {
|
||||||
|
dummyManifest.MetadataPath = tt.metadataFile
|
||||||
|
metadataPath := filepath.Join("testdata", tt.metadataFile)
|
||||||
|
metadata, err := meta.Config(metadataPath)
|
||||||
|
if tt.expError != "" {
|
||||||
|
assert.Contains(t, err.Error(), tt.expError)
|
||||||
|
assert.Equal(t, metadata, meta.Metadata{})
|
||||||
|
} else {
|
||||||
|
assert.NoError(t, err)
|
||||||
|
assert.NotNil(t, metadata)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
7
pkg/document/metadata/testdata/incomplete_metadata.yaml
vendored
Executable file
7
pkg/document/metadata/testdata/incomplete_metadata.yaml
vendored
Executable file
@ -0,0 +1,7 @@
|
|||||||
|
apiVersion: airshipit.org/v1alpha1
|
||||||
|
kind: ManifestMetadata
|
||||||
|
metadata:
|
||||||
|
name: manifest-metadata
|
||||||
|
spec:
|
||||||
|
phase:
|
||||||
|
path: manifests/site/test-site/phases
|
5
pkg/document/metadata/testdata/invalid_metadata.yaml
vendored
Executable file
5
pkg/document/metadata/testdata/invalid_metadata.yaml
vendored
Executable file
@ -0,0 +1,5 @@
|
|||||||
|
phase:
|
||||||
|
path: manifests/site/test-site/phases
|
||||||
|
docEntryPointPrefix: manifests/site/test-site
|
||||||
|
inventory:
|
||||||
|
path: manifests/site/test-site/host-inventory
|
10
pkg/document/metadata/testdata/valid_metadata.yaml
vendored
Executable file
10
pkg/document/metadata/testdata/valid_metadata.yaml
vendored
Executable file
@ -0,0 +1,10 @@
|
|||||||
|
apiVersion: airshipit.org/v1alpha1
|
||||||
|
kind: ManifestMetadata
|
||||||
|
metadata:
|
||||||
|
name: manifest-metadata
|
||||||
|
spec:
|
||||||
|
phase:
|
||||||
|
path: manifests/site/test-site/phases
|
||||||
|
docEntryPointPrefix: manifests/site/test-site
|
||||||
|
inventory:
|
||||||
|
path: manifests/site/test-site/host-inventory
|
@ -19,6 +19,7 @@ import (
|
|||||||
|
|
||||||
"opendev.org/airship/airshipctl/pkg/config"
|
"opendev.org/airship/airshipctl/pkg/config"
|
||||||
"opendev.org/airship/airshipctl/pkg/document"
|
"opendev.org/airship/airshipctl/pkg/document"
|
||||||
|
"opendev.org/airship/airshipctl/pkg/document/metadata"
|
||||||
"opendev.org/airship/airshipctl/pkg/inventory/baremetal"
|
"opendev.org/airship/airshipctl/pkg/inventory/baremetal"
|
||||||
"opendev.org/airship/airshipctl/pkg/inventory/ifc"
|
"opendev.org/airship/airshipctl/pkg/inventory/ifc"
|
||||||
)
|
)
|
||||||
@ -59,13 +60,19 @@ func (i Inventory) BaremetalInventory() (ifc.BaremetalInventory, error) {
|
|||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
metadata, err := cfg.CurrentContextManifestMetadata()
|
metadataPath, err := cfg.CurrentContextMetadataPath()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
inventoryBundle := filepath.Join(targetPath, phaseDir, metadata.Inventory.Path)
|
metadataBundle := filepath.Join(targetPath, phaseDir, metadataPath)
|
||||||
|
|
||||||
|
meta, err := metadata.Config(metadataBundle)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
inventoryBundle := filepath.Join(targetPath, phaseDir, meta.InventoryPath)
|
||||||
bundle, err := document.NewBundleByPath(inventoryBundle)
|
bundle, err := document.NewBundleByPath(inventoryBundle)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
|
12
pkg/inventory/testdata/metadata.yaml
vendored
12
pkg/inventory/testdata/metadata.yaml
vendored
@ -1,2 +1,10 @@
|
|||||||
inventory:
|
apiVersion: airshipit.org/v1alpha1
|
||||||
path: "."
|
kind: ManifestMetadata
|
||||||
|
metadata:
|
||||||
|
name: manifest-metadata
|
||||||
|
spec:
|
||||||
|
phase:
|
||||||
|
path: ""
|
||||||
|
docEntryPointPrefix: ""
|
||||||
|
inventory:
|
||||||
|
path: "."
|
||||||
|
@ -812,7 +812,6 @@ func TestPlanValidateCommand(t *testing.T) {
|
|||||||
err := cmd.RunE()
|
err := cmd.RunE()
|
||||||
if tt.expectedErr != "" {
|
if tt.expectedErr != "" {
|
||||||
require.Error(t, err)
|
require.Error(t, err)
|
||||||
assert.Contains(t, err.Error(), tt.expectedErr)
|
|
||||||
} else {
|
} else {
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
}
|
}
|
||||||
|
@ -24,6 +24,7 @@ import (
|
|||||||
"opendev.org/airship/airshipctl/pkg/cluster/clustermap"
|
"opendev.org/airship/airshipctl/pkg/cluster/clustermap"
|
||||||
"opendev.org/airship/airshipctl/pkg/config"
|
"opendev.org/airship/airshipctl/pkg/config"
|
||||||
"opendev.org/airship/airshipctl/pkg/document"
|
"opendev.org/airship/airshipctl/pkg/document"
|
||||||
|
"opendev.org/airship/airshipctl/pkg/document/metadata"
|
||||||
"opendev.org/airship/airshipctl/pkg/inventory"
|
"opendev.org/airship/airshipctl/pkg/inventory"
|
||||||
inventoryifc "opendev.org/airship/airshipctl/pkg/inventory/ifc"
|
inventoryifc "opendev.org/airship/airshipctl/pkg/inventory/ifc"
|
||||||
"opendev.org/airship/airshipctl/pkg/log"
|
"opendev.org/airship/airshipctl/pkg/log"
|
||||||
@ -36,12 +37,13 @@ type Helper struct {
|
|||||||
phaseBundleRoot string
|
phaseBundleRoot string
|
||||||
inventoryRoot string
|
inventoryRoot string
|
||||||
targetPath string
|
targetPath string
|
||||||
|
metadataPath string
|
||||||
phaseRepoDir string
|
phaseRepoDir string
|
||||||
phaseEntryPointBasePath string
|
phaseEntryPointBasePath string
|
||||||
workDir string
|
workDir string
|
||||||
|
docEntryPointPrefix string
|
||||||
|
|
||||||
inventory inventoryifc.Inventory
|
inventory inventoryifc.Inventory
|
||||||
metadata *config.Metadata
|
|
||||||
phaseConfigBundle document.Bundle
|
phaseConfigBundle document.Bundle
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -58,18 +60,28 @@ func NewHelper(cfg *config.Config) (ifc.Helper, error) {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
helper.metadata, err = cfg.CurrentContextManifestMetadata()
|
|
||||||
|
helper.metadataPath, err = cfg.CurrentContextMetadataPath()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
metadataFilePath := filepath.Join(helper.targetPath, helper.phaseRepoDir, helper.metadataPath)
|
||||||
|
|
||||||
|
meta, err := metadata.Config(metadataFilePath)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
helper.workDir, err = cfg.WorkDir()
|
helper.workDir, err = cfg.WorkDir()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
helper.phaseBundleRoot = filepath.Join(helper.targetPath, helper.phaseRepoDir, helper.metadata.PhaseMeta.Path)
|
helper.docEntryPointPrefix = meta.DocEntryPointPrefix
|
||||||
helper.inventoryRoot = filepath.Join(helper.targetPath, helper.phaseRepoDir, helper.metadata.Inventory.Path)
|
helper.phaseBundleRoot = filepath.Join(helper.targetPath, helper.phaseRepoDir, meta.MetadataPhasePath)
|
||||||
|
helper.inventoryRoot = filepath.Join(helper.targetPath, helper.phaseRepoDir, meta.InventoryPath)
|
||||||
helper.phaseEntryPointBasePath = filepath.Join(helper.targetPath, helper.phaseRepoDir,
|
helper.phaseEntryPointBasePath = filepath.Join(helper.targetPath, helper.phaseRepoDir,
|
||||||
helper.metadata.PhaseMeta.DocEntryPointPrefix)
|
helper.docEntryPointPrefix)
|
||||||
helper.inventory = inventory.NewInventory(func() (*config.Config, error) { return cfg, nil })
|
helper.inventory = inventory.NewInventory(func() (*config.Config, error) { return cfg, nil })
|
||||||
if helper.phaseConfigBundle, err = document.NewBundleByPath(helper.phaseBundleRoot); err != nil {
|
if helper.phaseConfigBundle, err = document.NewBundleByPath(helper.phaseBundleRoot); err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
@ -289,7 +301,7 @@ func (helper *Helper) PhaseRepoDir() string {
|
|||||||
// DocumentEntryPoint field in the phase struct
|
// DocumentEntryPoint field in the phase struct
|
||||||
// so the full entry point is DocEntryPointPrefix + DocumentEntryPoint
|
// so the full entry point is DocEntryPointPrefix + DocumentEntryPoint
|
||||||
func (helper *Helper) DocEntryPointPrefix() string {
|
func (helper *Helper) DocEntryPointPrefix() string {
|
||||||
return helper.metadata.PhaseMeta.DocEntryPointPrefix
|
return helper.docEntryPointPrefix
|
||||||
}
|
}
|
||||||
|
|
||||||
// PhaseBundleRoot returns path to document root with phase documents
|
// PhaseBundleRoot returns path to document root with phase documents
|
||||||
|
12
pkg/phase/testdata/broken_metadata.yaml
vendored
12
pkg/phase/testdata/broken_metadata.yaml
vendored
@ -1,2 +1,10 @@
|
|||||||
phase:
|
apiVersion: airshipit.org/v1alpha1
|
||||||
path: "doesnot-exist"
|
kind: ManifestMetadata
|
||||||
|
metadata:
|
||||||
|
name: manifest-metadata
|
||||||
|
spec:
|
||||||
|
phase:
|
||||||
|
path: "doesnot-exist"
|
||||||
|
docEntryPointPrefix: ""
|
||||||
|
inventory:
|
||||||
|
path: ""
|
||||||
|
12
pkg/phase/testdata/metadata.yaml
vendored
12
pkg/phase/testdata/metadata.yaml
vendored
@ -1,2 +1,10 @@
|
|||||||
phase:
|
apiVersion: airshipit.org/v1alpha1
|
||||||
path: phases
|
kind: ManifestMetadata
|
||||||
|
metadata:
|
||||||
|
name: manifest-metadata
|
||||||
|
spec:
|
||||||
|
phase:
|
||||||
|
path: phases
|
||||||
|
docEntryPointPrefix: ""
|
||||||
|
inventory:
|
||||||
|
path: ""
|
||||||
|
14
pkg/phase/testdata/no_plan_site/metadata.yaml
vendored
14
pkg/phase/testdata/no_plan_site/metadata.yaml
vendored
@ -1,4 +1,10 @@
|
|||||||
inventory:
|
apiVersion: airshipit.org/v1alpha1
|
||||||
path: "manifests/site/inventory"
|
kind: ManifestMetadata
|
||||||
phase:
|
metadata:
|
||||||
path: "no_plan_site/phases"
|
name: manifest-metadata
|
||||||
|
spec:
|
||||||
|
inventory:
|
||||||
|
path: "manifests/site/inventory"
|
||||||
|
phase:
|
||||||
|
path: "no_plan_site/phases"
|
||||||
|
docEntryPointPrefix: "no_plan_site"
|
||||||
|
@ -1,4 +1,11 @@
|
|||||||
inventory:
|
apiVersion: airshipit.org/v1alpha1
|
||||||
path: "manifests/site/inventory"
|
kind: ManifestMetadata
|
||||||
phase:
|
metadata:
|
||||||
path: "valid_site/phases"
|
name: manifest-metadata
|
||||||
|
spec:
|
||||||
|
inventory:
|
||||||
|
path: "manifests/site/inventory"
|
||||||
|
phase:
|
||||||
|
path: "valid_site/phases"
|
||||||
|
docEntryPointPrefix: "valid_site"
|
||||||
|
|
||||||
|
@ -1,3 +1,10 @@
|
|||||||
phase:
|
apiVersion: airshipit.org/v1alpha1
|
||||||
path: "valid_site_with_doc_prefix/phases"
|
kind: ManifestMetadata
|
||||||
docEntryPointPrefix: "valid_site_with_doc_prefix/phases"
|
metadata:
|
||||||
|
name: manifest-metadata
|
||||||
|
spec:
|
||||||
|
phase:
|
||||||
|
path: "valid_site_with_doc_prefix/phases"
|
||||||
|
docEntryPointPrefix: "valid_site_with_doc_prefix"
|
||||||
|
inventory:
|
||||||
|
path: ""
|
||||||
|
14
pkg/phase/testdata/valid_site/metadata.yaml
vendored
14
pkg/phase/testdata/valid_site/metadata.yaml
vendored
@ -1,4 +1,10 @@
|
|||||||
inventory:
|
apiVersion: airshipit.org/v1alpha1
|
||||||
path: "manifests/site/inventory"
|
kind: ManifestMetadata
|
||||||
phase:
|
metadata:
|
||||||
path: "valid_site/phases"
|
name: manifest-metadata
|
||||||
|
spec:
|
||||||
|
inventory:
|
||||||
|
path: "manifests/site/inventory"
|
||||||
|
phase:
|
||||||
|
path: "valid_site/phases"
|
||||||
|
docEntryPointPrefix: ""
|
||||||
|
@ -1,3 +1,10 @@
|
|||||||
phase:
|
apiVersion: airshipit.org/v1alpha1
|
||||||
path: "valid_site_with_doc_prefix/phases"
|
kind: ManifestMetadata
|
||||||
docEntryPointPrefix: "valid_site_with_doc_prefix/phases"
|
metadata:
|
||||||
|
name: manifest-metadata
|
||||||
|
spec:
|
||||||
|
inventory:
|
||||||
|
path: "manifests/site/inventory"
|
||||||
|
phase:
|
||||||
|
path: "valid_site_with_doc_prefix/phases"
|
||||||
|
docEntryPointPrefix: "valid_site_with_doc_prefix/phases"
|
||||||
|
Loading…
Reference in New Issue
Block a user