Merge "Implement kustomize sink in generic container executor"
This commit is contained in:
commit
2e66fc59f6
@ -54,7 +54,7 @@ metadata:
|
|||||||
name: generic-container
|
name: generic-container
|
||||||
labels:
|
labels:
|
||||||
airshipit.org/deploy-k8s: "false"
|
airshipit.org/deploy-k8s: "false"
|
||||||
outputToStdout: true
|
kustomizeSinkOutputDir: ""
|
||||||
spec:
|
spec:
|
||||||
container:
|
container:
|
||||||
image: quay.io/sample/image:v0.0.1
|
image: quay.io/sample/image:v0.0.1
|
||||||
|
@ -25,8 +25,10 @@ import (
|
|||||||
type GenericContainer struct {
|
type GenericContainer struct {
|
||||||
metav1.TypeMeta `json:",inline"`
|
metav1.TypeMeta `json:",inline"`
|
||||||
metav1.ObjectMeta `json:"metadata,omitempty"`
|
metav1.ObjectMeta `json:"metadata,omitempty"`
|
||||||
// If set to will print output of RunFns to Stdout
|
// Executor will write output using kustomize sink if this parameter is specified.
|
||||||
PrintOutput bool `json:"printOutput,omitempty"`
|
// Else it will write output to STDOUT.
|
||||||
|
// This path relative to current site root.
|
||||||
|
KustomizeSinkOutputDir string `json:"kustomizeSinkOutputDir,omitempty"`
|
||||||
// Settings for for a container
|
// Settings for for a container
|
||||||
Spec runtimeutil.FunctionSpec `json:"spec,omitempty"`
|
Spec runtimeutil.FunctionSpec `json:"spec,omitempty"`
|
||||||
// Config for the RunFns function in a custom format
|
// Config for the RunFns function in a custom format
|
||||||
|
@ -22,6 +22,7 @@ import (
|
|||||||
"path/filepath"
|
"path/filepath"
|
||||||
|
|
||||||
"sigs.k8s.io/kustomize/kyaml/fn/runtime/runtimeutil"
|
"sigs.k8s.io/kustomize/kyaml/fn/runtime/runtimeutil"
|
||||||
|
"sigs.k8s.io/kustomize/kyaml/kio"
|
||||||
"sigs.k8s.io/kustomize/kyaml/runfn"
|
"sigs.k8s.io/kustomize/kyaml/runfn"
|
||||||
kyaml "sigs.k8s.io/kustomize/kyaml/yaml"
|
kyaml "sigs.k8s.io/kustomize/kyaml/yaml"
|
||||||
"sigs.k8s.io/yaml"
|
"sigs.k8s.io/yaml"
|
||||||
@ -37,12 +38,13 @@ var _ ifc.Executor = &ContainerExecutor{}
|
|||||||
|
|
||||||
// ContainerExecutor contains resources for generic container executor
|
// ContainerExecutor contains resources for generic container executor
|
||||||
type ContainerExecutor struct {
|
type ContainerExecutor struct {
|
||||||
ExecutorBundle document.Bundle
|
PhaseEntryPointBasePath string
|
||||||
ExecutorDocument document.Document
|
ExecutorBundle document.Bundle
|
||||||
|
ExecutorDocument document.Document
|
||||||
|
|
||||||
ContConf *v1alpha1.GenericContainer
|
ContConf *v1alpha1.GenericContainer
|
||||||
RunFns runfn.RunFns
|
RunFns runfn.RunFns
|
||||||
targetPath string
|
TargetPath string
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewContainerExecutor creates instance of phase executor
|
// NewContainerExecutor creates instance of phase executor
|
||||||
@ -61,14 +63,15 @@ func NewContainerExecutor(cfg ifc.ExecutorConfig) (ifc.Executor, error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
return &ContainerExecutor{
|
return &ContainerExecutor{
|
||||||
ExecutorBundle: bundle,
|
PhaseEntryPointBasePath: cfg.Helper.PhaseEntryPointBasePath(),
|
||||||
ExecutorDocument: cfg.ExecutorDocument,
|
ExecutorBundle: bundle,
|
||||||
|
ExecutorDocument: cfg.ExecutorDocument,
|
||||||
|
|
||||||
ContConf: apiObj,
|
ContConf: apiObj,
|
||||||
RunFns: runfn.RunFns{
|
RunFns: runfn.RunFns{
|
||||||
Functions: []*kyaml.RNode{},
|
Functions: []*kyaml.RNode{},
|
||||||
},
|
},
|
||||||
targetPath: cfg.Helper.TargetPath(),
|
TargetPath: cfg.Helper.TargetPath(),
|
||||||
}, nil
|
}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -102,7 +105,11 @@ func (c *ContainerExecutor) Run(evtCh chan events.Event, opts ifc.RunOptions) {
|
|||||||
|
|
||||||
c.SetMounts()
|
c.SetMounts()
|
||||||
|
|
||||||
if c.ContConf.PrintOutput {
|
var fnsOutputBuffer bytes.Buffer
|
||||||
|
|
||||||
|
if c.ContConf.KustomizeSinkOutputDir != "" {
|
||||||
|
c.RunFns.Output = &fnsOutputBuffer
|
||||||
|
} else {
|
||||||
c.RunFns.Output = os.Stdout
|
c.RunFns.Output = os.Stdout
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -111,6 +118,13 @@ func (c *ContainerExecutor) Run(evtCh chan events.Event, opts ifc.RunOptions) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if c.ContConf.KustomizeSinkOutputDir != "" {
|
||||||
|
if err := c.WriteKustomizeSink(&fnsOutputBuffer); err != nil {
|
||||||
|
handleError(evtCh, err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
evtCh <- events.NewEvent().WithGenericContainerEvent(events.GenericContainerEvent{
|
evtCh <- events.NewEvent().WithGenericContainerEvent(events.GenericContainerEvent{
|
||||||
Operation: events.GenericContainerStop,
|
Operation: events.GenericContainerStop,
|
||||||
Message: "execution of the generic container finished",
|
Message: "execution of the generic container finished",
|
||||||
@ -159,11 +173,21 @@ func (c *ContainerExecutor) SetMounts() {
|
|||||||
}
|
}
|
||||||
storageMounts := c.ContConf.Spec.Container.StorageMounts
|
storageMounts := c.ContConf.Spec.Container.StorageMounts
|
||||||
for i, mount := range storageMounts {
|
for i, mount := range storageMounts {
|
||||||
storageMounts[i].Src = filepath.Join(c.targetPath, mount.Src)
|
storageMounts[i].Src = filepath.Join(c.TargetPath, mount.Src)
|
||||||
}
|
}
|
||||||
c.RunFns.StorageMounts = storageMounts
|
c.RunFns.StorageMounts = storageMounts
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// WriteKustomizeSink writes output to kustomize sink
|
||||||
|
func (c *ContainerExecutor) WriteKustomizeSink(fnsOutputBuffer *bytes.Buffer) error {
|
||||||
|
outputDirPath := filepath.Join(c.PhaseEntryPointBasePath, c.ContConf.KustomizeSinkOutputDir)
|
||||||
|
sinkOutputs := []kio.Writer{&kio.LocalPackageWriter{PackagePath: outputDirPath}}
|
||||||
|
err := kio.Pipeline{
|
||||||
|
Inputs: []kio.Reader{&kio.ByteReader{Reader: fnsOutputBuffer}},
|
||||||
|
Outputs: sinkOutputs}.Execute()
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
// Validate executor configuration and documents
|
// Validate executor configuration and documents
|
||||||
func (c *ContainerExecutor) Validate() error {
|
func (c *ContainerExecutor) Validate() error {
|
||||||
return errors.ErrNotImplemented{}
|
return errors.ErrNotImplemented{}
|
||||||
|
@ -219,3 +219,73 @@ func TestPrepareFunctions(t *testing.T) {
|
|||||||
|
|
||||||
assert.Equal(t, transformedFunction, strFuncs)
|
assert.Equal(t, transformedFunction, strFuncs)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestSetMounts(t *testing.T) {
|
||||||
|
testCases := []struct {
|
||||||
|
name string
|
||||||
|
targetPath string
|
||||||
|
in []runtimeutil.StorageMount
|
||||||
|
expectedOut []runtimeutil.StorageMount
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
name: "Empty TargetPath and mounts",
|
||||||
|
targetPath: "",
|
||||||
|
in: nil,
|
||||||
|
expectedOut: nil,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "Empty TargetPath with Src and DstPath",
|
||||||
|
targetPath: "",
|
||||||
|
in: []runtimeutil.StorageMount{
|
||||||
|
{
|
||||||
|
MountType: "bind",
|
||||||
|
Src: "src",
|
||||||
|
DstPath: "dst",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
expectedOut: []runtimeutil.StorageMount{
|
||||||
|
{
|
||||||
|
MountType: "bind",
|
||||||
|
Src: "src",
|
||||||
|
DstPath: "dst",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "Not empty TargetPath with Src and DstPath",
|
||||||
|
targetPath: "target_path",
|
||||||
|
in: []runtimeutil.StorageMount{
|
||||||
|
{
|
||||||
|
MountType: "bind",
|
||||||
|
Src: "src",
|
||||||
|
DstPath: "dst",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
expectedOut: []runtimeutil.StorageMount{
|
||||||
|
{
|
||||||
|
MountType: "bind",
|
||||||
|
Src: "target_path/src",
|
||||||
|
DstPath: "dst",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, test := range testCases {
|
||||||
|
tt := test
|
||||||
|
t.Run(tt.name, func(t *testing.T) {
|
||||||
|
c := executors.ContainerExecutor{
|
||||||
|
ContConf: &v1alpha1.GenericContainer{
|
||||||
|
Spec: runtimeutil.FunctionSpec{
|
||||||
|
Container: runtimeutil.ContainerSpec{
|
||||||
|
StorageMounts: tt.in,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
TargetPath: tt.targetPath,
|
||||||
|
}
|
||||||
|
c.SetMounts()
|
||||||
|
assert.Equal(t, c.RunFns.StorageMounts, tt.expectedOut)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user