
This PS has a function which constructs a collection of Metal3 BareMetalHost resources, along with associated configuration Secrets. It solves for a couple of things: 1. pulling the nitty gritty details for generating BMH into one reusable place, 2. allowing the site-specific details to be filled in via catalogues of values This function leverages a couple of different plugins in sequence: The airshipctl Replacement plugin, which pulls the site-specific data from the catalogue documents into a Templater plugin configuration; and then the airshipctl Templater plugin, which generates a variable number of BMHs in a data-driven fashion. More details can be found in the README.md in this patchset. Closes: #245 Change-Id: I3ddbd36dc53ea6afbd633098c985f4b28bcbb793
132 lines
2.5 KiB
Go
132 lines
2.5 KiB
Go
/*
|
|
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_test
|
|
|
|
import (
|
|
"bytes"
|
|
"testing"
|
|
|
|
"github.com/stretchr/testify/assert"
|
|
"github.com/stretchr/testify/require"
|
|
|
|
tmplv1alpha1 "opendev.org/airship/airshipctl/pkg/document/plugin/templater/v1alpha1"
|
|
)
|
|
|
|
func TestMalformedConfig(t *testing.T) {
|
|
_, err := tmplv1alpha1.New(nil, []byte("--"))
|
|
assert.Error(t, err)
|
|
}
|
|
|
|
func TestTemplater(t *testing.T) {
|
|
testCases := []struct {
|
|
cfg string
|
|
expectedOut string
|
|
expectedErr string
|
|
}{
|
|
{
|
|
cfg: `
|
|
apiVersion: airshipit.org/v1alpha1
|
|
kind: Templater
|
|
metadata:
|
|
name: notImportantHere
|
|
values:
|
|
hosts:
|
|
- macAddress: 00:aa:bb:cc:dd
|
|
name: node-1
|
|
- macAddress: 00:aa:bb:cc:ee
|
|
name: node-2
|
|
template: |
|
|
{{ range .hosts -}}
|
|
---
|
|
apiVersion: metal3.io/v1alpha1
|
|
kind: BareMetalHost
|
|
metadata:
|
|
name: {{ .name }}
|
|
spec:
|
|
bootMACAddress: {{ .macAddress }}
|
|
{{ end -}}`,
|
|
expectedOut: `---
|
|
apiVersion: metal3.io/v1alpha1
|
|
kind: BareMetalHost
|
|
metadata:
|
|
name: node-1
|
|
spec:
|
|
bootMACAddress: 00:aa:bb:cc:dd
|
|
---
|
|
apiVersion: metal3.io/v1alpha1
|
|
kind: BareMetalHost
|
|
metadata:
|
|
name: node-2
|
|
spec:
|
|
bootMACAddress: 00:aa:bb:cc:ee
|
|
`,
|
|
},
|
|
{
|
|
cfg: `
|
|
apiVersion: airshipit.org/v1alpha1
|
|
kind: Templater
|
|
metadata:
|
|
name: notImportantHere
|
|
values:
|
|
test:
|
|
of:
|
|
- toYaml
|
|
template: |
|
|
{{ toYaml . -}}
|
|
`,
|
|
expectedOut: `test:
|
|
of:
|
|
- toYaml
|
|
`,
|
|
},
|
|
{
|
|
cfg: `
|
|
apiVersion: airshipit.org/v1alpha1
|
|
kind: Templater
|
|
metadata:
|
|
name: notImportantHere
|
|
values:
|
|
test:
|
|
of:
|
|
- badToYamlInput
|
|
template: |
|
|
{{ toYaml ignorethisbadinput -}}
|
|
`,
|
|
expectedOut: ``,
|
|
},
|
|
{
|
|
cfg: `
|
|
apiVersion: airshipit.org/v1alpha1
|
|
kind: Templater
|
|
metadata:
|
|
name: notImportantHere
|
|
template: |
|
|
{{ end }`,
|
|
expectedErr: "template: tmpl:1: unexpected \"}\" in end",
|
|
},
|
|
}
|
|
|
|
for _, tc := range testCases {
|
|
plugin, err := tmplv1alpha1.New(nil, []byte(tc.cfg))
|
|
require.NoError(t, err)
|
|
buf := &bytes.Buffer{}
|
|
err = plugin.Run(nil, buf)
|
|
if tc.expectedErr != "" {
|
|
assert.EqualError(t, err, tc.expectedErr)
|
|
}
|
|
assert.Equal(t, tc.expectedOut, buf.String())
|
|
}
|
|
}
|