implement RawConfigFileProvider

This commit is contained in:
Jingfang Liu 2019-05-20 15:31:08 -07:00 committed by jingfangliu
parent 26b23e9eec
commit c98b06a9ff
5 changed files with 162 additions and 17 deletions

View File

@ -18,21 +18,20 @@ import (
"io/ioutil"
"os"
"path/filepath"
"sigs.k8s.io/kustomize/pkg/inventory"
"strings"
"sigs.k8s.io/kustomize/pkg/ifc"
"sigs.k8s.io/yaml"
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
"sigs.k8s.io/cli-experimental/internal/pkg/clik8s"
"sigs.k8s.io/kustomize/pkg/fs"
"sigs.k8s.io/kustomize/pkg/ifc"
"sigs.k8s.io/kustomize/pkg/ifc/transformer"
"sigs.k8s.io/kustomize/pkg/inventory"
"sigs.k8s.io/kustomize/pkg/loader"
"sigs.k8s.io/kustomize/pkg/plugins"
"sigs.k8s.io/kustomize/pkg/resmap"
"sigs.k8s.io/kustomize/pkg/target"
"sigs.k8s.io/kustomize/pkg/types"
"sigs.k8s.io/yaml"
)
// ConfigProvider provides runtime.Objects for a path
@ -135,29 +134,51 @@ func (p *RawConfigFileProvider) IsSupported(path string) bool {
}
// GetConfig returns the resource configs
func (p *RawConfigFileProvider) GetConfig(path string) ([]*unstructured.Unstructured, error) {
// from a directory or a file containing raw Kubernetes resource configurations
func (p *RawConfigFileProvider) GetConfig(root string) ([]*unstructured.Unstructured, error) {
var values clik8s.ResourceConfigs
b, err := ioutil.ReadFile(path)
err := filepath.Walk(root, func(path string, fi os.FileInfo, err error) error {
if err != nil {
return nil, err
return err
}
if fi.IsDir() {
return nil
}
b, err := ioutil.ReadFile(path)
if err != nil {
return err
}
objs := strings.Split(string(b), "---")
for _, o := range objs {
body := map[string]interface{}{}
if err := yaml.Unmarshal([]byte(o), &body); err != nil {
return nil, err
return err
}
values = append(values, &unstructured.Unstructured{Object: body})
}
return nil
})
if err != nil {
return nil, err
}
return values, nil
}
// GetPruneConfig returns the resource configs
// from a directory or a file containing raw Kubernetes resource configurations
// The resource used for prune is get by checking the presence of the inventory annotation
func (p *RawConfigFileProvider) GetPruneConfig(path string) (*unstructured.Unstructured, error) {
return nil, nil
resources, err := p.GetConfig(path)
if err != nil {
return nil, err
}
return GetPruneResources(resources)
}
// RawConfigHTTPProvider provides configs from HTTP urls

View File

@ -67,6 +67,115 @@ func TestKustomizeProvider2(t *testing.T) {
assert.Equal(t, len(inv.Current), 1)
}
/*
setupRawConfigFiles provides a directory with Kubernetes resources
that can be used as input to test RawConfigFileProvider.
The directory created is
f
service.yaml
subdir1
   service.yaml
subdir2
service.yaml
*/
func setupRawConfigFiles(t *testing.T) (string, string) {
f, err := ioutil.TempDir("/tmp", "TestConfigProvider")
assert.NoError(t, err)
err = ioutil.WriteFile(filepath.Join(f, "service.yaml"), []byte(`
apiVersion: v1
kind: Service
metadata:
name: service-a
spec:
selector:
app: MyApp
ports:
- protocol: TCP
port: 80
targetPort: 9376
`), 0644)
assert.NoError(t, err)
subdir1, err := ioutil.TempDir(f, "subdir")
assert.NoError(t, err)
subdir2, err := ioutil.TempDir(f, "subdir")
assert.NoError(t, err)
err = ioutil.WriteFile(filepath.Join(subdir1, "service.yaml"), []byte(`
apiVersion: v1
kind: Service
metadata:
name: service-b
annotations:
kustomize.config.k8s.io/Inventory: ""
kustomize.config.k8s.io/InventoryHash: 8mk644dhch
spec:
selector:
app: MyApp
ports:
- protocol: TCP
port: 80
targetPort: 9376
---
apiVersion: v1
kind: ConfigMap
metadata:
name: cm
`), 0644)
assert.NoError(t, err)
err = ioutil.WriteFile(filepath.Join(subdir2, "service.yaml"), []byte(`
apiVersion: v1
kind: Service
metadata:
name: service-c
spec:
selector:
app: MyApp
ports:
- protocol: TCP
port: 80
targetPort: 9376
`), 0644)
assert.NoError(t, err)
return f, subdir1
}
func TestRawConfigFileProvider(t *testing.T) {
f, subdir := setupRawConfigFiles(t)
defer os.RemoveAll(f)
cp := wiretest.InitializeRawConfigProvider()
b := cp.IsSupported(f)
assert.Equal(t, b, true)
resources, err := cp.GetConfig(f)
assert.NoError(t, err)
assert.Equal(t, len(resources), 4)
resources, err = cp.GetConfig(filepath.Join(f, "service.yaml"))
assert.NoError(t, err)
assert.Equal(t, len(resources), 1)
resource, err := cp.GetPruneConfig(f)
assert.NoError(t, err)
assert.NotNil(t, resource)
resource, err = cp.GetPruneConfig(filepath.Join(f, "service.yaml"))
assert.NoError(t, err)
assert.Nil(t, resource)
b = cp.IsSupported(subdir)
resources, err = cp.GetConfig(subdir)
assert.NoError(t, err)
assert.Equal(t, len(resources), 2)
resources, err = cp.GetConfig(filepath.Join(subdir, "service.yaml"))
assert.NoError(t, err)
assert.Equal(t, len(resources), 2)
resource, err = cp.GetPruneConfig(subdir)
assert.NoError(t, err)
assert.NotNil(t, resource)
resource, err = cp.GetPruneConfig(filepath.Join(subdir, "service.yaml"))
assert.NoError(t, err)
assert.NotNil(t, resource)
}
func setupKustomizeWithoutInventory(t *testing.T) string {
f, err := ioutil.TempDir("/tmp", "TestApply")
assert.NoError(t, err)

View File

@ -43,6 +43,12 @@ var ConfigProviderSet = wire.NewSet(
NewResourcePruneConfig,
)
// RawConfigProviderSet defines dependencies for initializing a RawConfigFileProvider
var RawConfigProviderSet = wire.NewSet(
wire.Struct(new(resourceconfig.RawConfigFileProvider), "*"),
wire.Bind(new(resourceconfig.ConfigProvider), new(*resourceconfig.RawConfigFileProvider)),
)
// NewPluginConfig returns a new PluginConfig
func NewPluginConfig() *types.PluginConfig {
pc := plugin.DefaultPluginConfig()

View File

@ -67,6 +67,10 @@ func InitializConfigProvider() resourceconfig.ConfigProvider {
panic(wire.Build(wireconfig.ConfigProviderSet))
}
func InitializeRawConfigProvider() resourceconfig.ConfigProvider {
panic(wire.Build(wireconfig.RawConfigProviderSet))
}
func InitializeKustomization() ([]string, func(), error) {
f1, err := ioutil.TempDir("/tmp", "TestApply")
if err != nil {

View File

@ -248,6 +248,11 @@ func InitializConfigProvider() resourceconfig.ConfigProvider {
return kustomizeProvider
}
func InitializeRawConfigProvider() resourceconfig.ConfigProvider {
rawConfigFileProvider := &resourceconfig.RawConfigFileProvider{}
return rawConfigFileProvider
}
// wire.go:
func InitializeKustomization() ([]string, func(), error) {