mirror of https://github.com/fluxcd/cli-utils.git
namespaced kpt live init
This commit is contained in:
parent
7d237621fd
commit
a6f98bc844
|
|
@ -25,5 +25,6 @@ func NewCmdInit(ioStreams genericclioptions.IOStreams) *cobra.Command {
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
cmd.Flags().StringVarP(&io.InventoryID, "inventory-id", "i", "", "Identifier for group of applied resources. Must be composed of valid label characters.")
|
cmd.Flags().StringVarP(&io.InventoryID, "inventory-id", "i", "", "Identifier for group of applied resources. Must be composed of valid label characters.")
|
||||||
|
cmd.Flags().StringVarP(&io.Namespace, "inventory-namespace", "", "", "namespace for the resources to be initialized")
|
||||||
return cmd
|
return cmd
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -11,11 +11,11 @@ import (
|
||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
"github.com/go-errors/errors"
|
||||||
|
"github.com/google/uuid"
|
||||||
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||||
"k8s.io/cli-runtime/pkg/genericclioptions"
|
"k8s.io/cli-runtime/pkg/genericclioptions"
|
||||||
"sigs.k8s.io/kustomize/kyaml/kio"
|
"sigs.k8s.io/kustomize/kyaml/kio"
|
||||||
|
|
||||||
"github.com/google/uuid"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
const manifestFilename = "inventory-template.yaml"
|
const manifestFilename = "inventory-template.yaml"
|
||||||
|
|
@ -142,19 +142,25 @@ func calcPackageNamespace(packageDir string) (string, error) {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", err
|
return "", err
|
||||||
}
|
}
|
||||||
// Return the first non-empty namespace found. Cluster-scoped
|
// Return the non-empty unique namespace if found. Cluster-scoped
|
||||||
// resources do not have namespace set.
|
// resources do not have namespace set.
|
||||||
|
currentNamespace := metav1.NamespaceDefault
|
||||||
for _, node := range nodes {
|
for _, node := range nodes {
|
||||||
rm, err := node.GetMeta()
|
rm, err := node.GetMeta()
|
||||||
if err != nil {
|
if err != nil || len(rm.ObjectMeta.Namespace) == 0 {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
if len(rm.ObjectMeta.Namespace) > 0 {
|
if currentNamespace == metav1.NamespaceDefault {
|
||||||
return rm.ObjectMeta.Namespace, nil
|
currentNamespace = rm.ObjectMeta.Namespace
|
||||||
|
}
|
||||||
|
if currentNamespace != rm.ObjectMeta.Namespace {
|
||||||
|
return "", errors.Errorf(
|
||||||
|
"resources belong to different namespaces, a namespace is required to create the resource " +
|
||||||
|
"used for keeping track of past apply operations. Please specify ---inv-namespace.")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// Return the default namespace if none found.
|
// Return the default namespace if none found.
|
||||||
return metav1.NamespaceDefault, nil
|
return currentNamespace, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// defaultInventoryID returns a UUID string as a default unique
|
// defaultInventoryID returns a UUID string as a default unique
|
||||||
|
|
|
||||||
|
|
@ -5,16 +5,66 @@ package config
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"io/ioutil"
|
||||||
|
"os"
|
||||||
|
"path/filepath"
|
||||||
"regexp"
|
"regexp"
|
||||||
"strings"
|
"strings"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
|
"github.com/stretchr/testify/assert"
|
||||||
"k8s.io/cli-runtime/pkg/genericclioptions"
|
"k8s.io/cli-runtime/pkg/genericclioptions"
|
||||||
)
|
)
|
||||||
|
|
||||||
var ioStreams = genericclioptions.IOStreams{}
|
var ioStreams = genericclioptions.IOStreams{}
|
||||||
|
|
||||||
|
// writeFile writes a file under the test directory
|
||||||
|
func writeFile(t *testing.T, path string, value []byte) {
|
||||||
|
err := ioutil.WriteFile(path, value, 0600)
|
||||||
|
if !assert.NoError(t, err) {
|
||||||
|
assert.FailNow(t, err.Error())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var readFileA = []byte(`
|
||||||
|
apiVersion: v1
|
||||||
|
kind: Pod
|
||||||
|
metadata:
|
||||||
|
name: objA
|
||||||
|
namespace: namespaceA
|
||||||
|
`)
|
||||||
|
|
||||||
|
var readFileB = []byte(`
|
||||||
|
apiVersion: v1
|
||||||
|
kind: Pod
|
||||||
|
metadata:
|
||||||
|
name: objB
|
||||||
|
namespace: namespaceB
|
||||||
|
`)
|
||||||
|
|
||||||
|
var readFileC = []byte(`
|
||||||
|
apiVersion: v1
|
||||||
|
kind: Pod
|
||||||
|
metadata:
|
||||||
|
name: objC
|
||||||
|
`)
|
||||||
|
|
||||||
func TestComplete(t *testing.T) {
|
func TestComplete(t *testing.T) {
|
||||||
|
d1, err := ioutil.TempDir("", "test-dir")
|
||||||
|
if !assert.NoError(t, err) {
|
||||||
|
assert.FailNow(t, err.Error())
|
||||||
|
}
|
||||||
|
defer os.RemoveAll(d1)
|
||||||
|
d2, err := ioutil.TempDir("", "test-dir")
|
||||||
|
if !assert.NoError(t, err) {
|
||||||
|
assert.FailNow(t, err.Error())
|
||||||
|
}
|
||||||
|
defer os.RemoveAll(d2)
|
||||||
|
|
||||||
|
writeFile(t, filepath.Join(d1, "a_test.yaml"), readFileA)
|
||||||
|
writeFile(t, filepath.Join(d1, "b_test.yaml"), readFileB)
|
||||||
|
writeFile(t, filepath.Join(d2, "b_test.yaml"), readFileC)
|
||||||
|
|
||||||
tests := map[string]struct {
|
tests := map[string]struct {
|
||||||
args []string
|
args []string
|
||||||
isError bool
|
isError bool
|
||||||
|
|
@ -31,8 +81,15 @@ func TestComplete(t *testing.T) {
|
||||||
args: []string{"foo"},
|
args: []string{"foo"},
|
||||||
isError: true,
|
isError: true,
|
||||||
},
|
},
|
||||||
|
"More than one namespace should fail": {
|
||||||
|
args: []string{d1},
|
||||||
|
isError: true,
|
||||||
|
},
|
||||||
|
"No namespace set is fine": {
|
||||||
|
args: []string{d2},
|
||||||
|
isError: false,
|
||||||
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
for name, tc := range tests {
|
for name, tc := range tests {
|
||||||
t.Run(name, func(t *testing.T) {
|
t.Run(name, func(t *testing.T) {
|
||||||
io := NewInitOptions(ioStreams)
|
io := NewInitOptions(ioStreams)
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue