mirror of
https://github.com/kubernetes-sigs/kustomize.git
synced 2026-06-10 16:42:51 +00:00
Refactor openAPI
Refactor global openapi
This commit is contained in:
@@ -65,17 +65,17 @@ func TestDeleterCreator_Delete(t *testing.T) {
|
||||
t.FailNow()
|
||||
}
|
||||
|
||||
sc, err := openapi.SchemaFromFile(openAPI.Name())
|
||||
if !assert.NoError(t, err) {
|
||||
t.FailNow()
|
||||
}
|
||||
// add a delete creator
|
||||
dc := DeleterCreator{
|
||||
Name: "image",
|
||||
DefinitionPrefix: fieldmeta.SetterDefinitionPrefix,
|
||||
SettersSchema: sc,
|
||||
}
|
||||
|
||||
clean, err := openapi.AddSchemaFromFile(openAPI.Name())
|
||||
if !assert.NoError(t, err) {
|
||||
t.FailNow()
|
||||
}
|
||||
defer clean()
|
||||
dc.OpenAPIPath = openAPI.Name()
|
||||
dc.ResourcesPath = resource.Name()
|
||||
|
||||
|
||||
@@ -4,8 +4,8 @@
|
||||
package settersutil
|
||||
|
||||
import (
|
||||
"github.com/go-openapi/spec"
|
||||
"sigs.k8s.io/kustomize/kyaml/kio"
|
||||
"sigs.k8s.io/kustomize/kyaml/openapi"
|
||||
"sigs.k8s.io/kustomize/kyaml/setters2"
|
||||
)
|
||||
|
||||
@@ -27,6 +27,8 @@ type DeleterCreator struct {
|
||||
|
||||
// Path to resources folder
|
||||
ResourcesPath string
|
||||
|
||||
SettersSchema *spec.Schema
|
||||
}
|
||||
|
||||
func (d DeleterCreator) Delete() error {
|
||||
@@ -38,13 +40,6 @@ func (d DeleterCreator) Delete() error {
|
||||
return err
|
||||
}
|
||||
|
||||
// Load the updated definitions
|
||||
clean, err := openapi.AddSchemaFromFile(d.OpenAPIPath)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
defer clean()
|
||||
|
||||
// Update the resources with the deleter reference
|
||||
inout := &kio.LocalPackageReadWriter{PackagePath: d.ResourcesPath, PackageFileName: d.OpenAPIFileName}
|
||||
return kio.Pipeline{
|
||||
@@ -53,6 +48,7 @@ func (d DeleterCreator) Delete() error {
|
||||
&setters2.Delete{
|
||||
Name: d.Name,
|
||||
DefinitionPrefix: d.DefinitionPrefix,
|
||||
SettersSchema: d.SettersSchema,
|
||||
})},
|
||||
Outputs: []kio.Writer{inout},
|
||||
}.Execute()
|
||||
|
||||
@@ -6,8 +6,8 @@ package settersutil
|
||||
import (
|
||||
"io/ioutil"
|
||||
"os"
|
||||
"path/filepath"
|
||||
|
||||
"github.com/go-openapi/spec"
|
||||
"sigs.k8s.io/kustomize/kyaml/kio"
|
||||
"sigs.k8s.io/kustomize/kyaml/openapi"
|
||||
"sigs.k8s.io/kustomize/kyaml/setters2"
|
||||
@@ -40,6 +40,8 @@ type FieldSetter struct {
|
||||
RecurseSubPackages bool
|
||||
|
||||
IsSet bool
|
||||
|
||||
SettersSchema *spec.Schema
|
||||
}
|
||||
|
||||
func (fs *FieldSetter) Filter(input []*yaml.RNode) ([]*yaml.RNode, error) {
|
||||
@@ -79,17 +81,17 @@ func (fs FieldSetter) Set() (int, error) {
|
||||
}
|
||||
|
||||
// Load the updated definitions
|
||||
clean, err := openapi.AddSchemaFromFile(fs.OpenAPIPath)
|
||||
sc, err := openapi.SchemaFromFile(fs.OpenAPIPath)
|
||||
if err != nil {
|
||||
return 0, err
|
||||
}
|
||||
defer clean()
|
||||
fs.SettersSchema = sc
|
||||
|
||||
// Update the resources with the new value
|
||||
// Set NoDeleteFiles to true as SetAll will return only the nodes of files which should be updated and
|
||||
// hence, rest of the files should not be deleted
|
||||
inout := &kio.LocalPackageReadWriter{PackagePath: fs.ResourcesPath, NoDeleteFiles: true, PackageFileName: fs.OpenAPIFileName}
|
||||
s := &setters2.Set{Name: fs.Name}
|
||||
s := &setters2.Set{Name: fs.Name, SettersSchema: sc}
|
||||
err = kio.Pipeline{
|
||||
Inputs: []kio.Reader{inout},
|
||||
Filters: []kio.Filter{setters2.SetAll(s)},
|
||||
@@ -109,20 +111,12 @@ func (fs FieldSetter) Set() (int, error) {
|
||||
// file and sets all values for the resource configs in the provided destination directories.
|
||||
// If syncOpenAPI is true, the openAPI files in destination directories are also
|
||||
// updated with the setter values in the input openAPI file
|
||||
func SetAllSetterDefinitions(syncOpenAPI bool, openAPIPath string, dirs ...string) error {
|
||||
clean, err := openapi.AddSchemaFromFile(openAPIPath)
|
||||
func SetAllSetterDefinitions(openAPIPath string, dirs ...string) error {
|
||||
sc, err := openapi.SchemaFromFile(openAPIPath)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
defer clean()
|
||||
for _, destDir := range dirs {
|
||||
if syncOpenAPI {
|
||||
openAPIFileName := filepath.Base(openAPIPath)
|
||||
err := syncOpenAPIValuesWithSchema(filepath.Join(destDir, openAPIFileName))
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
rw := &kio.LocalPackageReadWriter{
|
||||
PackagePath: destDir,
|
||||
// set output won't include resources from files which
|
||||
@@ -134,7 +128,7 @@ func SetAllSetterDefinitions(syncOpenAPI bool, openAPIPath string, dirs ...strin
|
||||
err := kio.Pipeline{
|
||||
Inputs: []kio.Reader{rw},
|
||||
// Set all of the setters
|
||||
Filters: []kio.Filter{setters2.SetAll(&setters2.Set{SetAll: true})},
|
||||
Filters: []kio.Filter{setters2.SetAll(&setters2.Set{SetAll: true, SettersSchema: sc})},
|
||||
Outputs: []kio.Writer{rw},
|
||||
}.Execute()
|
||||
if err != nil {
|
||||
@@ -143,31 +137,3 @@ func SetAllSetterDefinitions(syncOpenAPI bool, openAPIPath string, dirs ...strin
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// syncOpenAPIValuesWithSchema syncs the setter values in global openAPI schema
|
||||
// with the ones in openAPIPath and writes them back
|
||||
func syncOpenAPIValuesWithSchema(openAPIPath string) error {
|
||||
refs, err := openapi.DefinitionRefs(openAPIPath)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
for _, ref := range refs {
|
||||
sch := openapi.Schema().Definitions[ref]
|
||||
cliExt, err := setters2.GetExtFromSchema(&sch)
|
||||
if cliExt == nil || cliExt.Setter == nil || err != nil {
|
||||
// if the ref doesn't exist in global schema or if it is not a setter
|
||||
// continue, as there might be setters which are not present global schema
|
||||
continue
|
||||
}
|
||||
soa := setters2.SetOpenAPI{
|
||||
Name: cliExt.Setter.Name,
|
||||
Value: cliExt.Setter.Value,
|
||||
ListValues: cliExt.Setter.ListValues,
|
||||
IsSet: true,
|
||||
}
|
||||
if err := soa.UpdateFile(openAPIPath); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
@@ -20,72 +20,9 @@ func TestSetAllSetterDefinitions(t *testing.T) {
|
||||
destOpenAPI string
|
||||
expectedDestFile string
|
||||
expectedDestOpenAPIFile string
|
||||
syncSchema bool
|
||||
}{
|
||||
{
|
||||
name: "set definitions with syncSchema",
|
||||
syncSchema: true,
|
||||
srcOpenAPIFile: `openAPI:
|
||||
definitions:
|
||||
io.k8s.cli.setters.namespace:
|
||||
x-k8s-cli:
|
||||
setter:
|
||||
name: namespace
|
||||
value: "project-namespace"
|
||||
io.k8s.cli.setters.replicas:
|
||||
x-k8s-cli:
|
||||
setter:
|
||||
name: replicas
|
||||
value: "4"`,
|
||||
|
||||
destFile: `apiVersion: apps/v1
|
||||
kind: Deployment
|
||||
metadata:
|
||||
name: nginx-deployment
|
||||
namespace: some-other-namespace # {"$ref": "#/definitions/io.k8s.cli.setters.namespace"}
|
||||
spec:
|
||||
replicas: 3 # {"$ref": "#/definitions/io.k8s.cli.setters.replicas-new"}`,
|
||||
|
||||
destOpenAPI: `openAPI:
|
||||
definitions:
|
||||
io.k8s.cli.setters.namespace:
|
||||
x-k8s-cli:
|
||||
setter:
|
||||
name: namespace
|
||||
value: "some-other-namespace"
|
||||
io.k8s.cli.setters.replicas-new:
|
||||
x-k8s-cli:
|
||||
setter:
|
||||
name: replicas-new
|
||||
value: "3"`,
|
||||
|
||||
expectedDestFile: `apiVersion: apps/v1
|
||||
kind: Deployment
|
||||
metadata:
|
||||
name: nginx-deployment
|
||||
namespace: project-namespace # {"$ref": "#/definitions/io.k8s.cli.setters.namespace"}
|
||||
spec:
|
||||
replicas: 3 # {"$ref": "#/definitions/io.k8s.cli.setters.replicas-new"}
|
||||
`,
|
||||
|
||||
expectedDestOpenAPIFile: `openAPI:
|
||||
definitions:
|
||||
io.k8s.cli.setters.namespace:
|
||||
x-k8s-cli:
|
||||
setter:
|
||||
name: namespace
|
||||
value: "project-namespace"
|
||||
isSet: true
|
||||
io.k8s.cli.setters.replicas-new:
|
||||
x-k8s-cli:
|
||||
setter:
|
||||
name: replicas-new
|
||||
value: "3"
|
||||
`,
|
||||
},
|
||||
{
|
||||
name: "set values only to resources and not the openAPI",
|
||||
syncSchema: false,
|
||||
name: "set values only to resources and not the openAPI",
|
||||
srcOpenAPIFile: `openAPI:
|
||||
definitions:
|
||||
io.k8s.cli.setters.namespace:
|
||||
@@ -172,7 +109,7 @@ spec:
|
||||
t.FailNow()
|
||||
}
|
||||
|
||||
err = SetAllSetterDefinitions(test.syncSchema, filepath.Join(srcDir, "Krmfile"), destDir)
|
||||
err = SetAllSetterDefinitions(filepath.Join(srcDir, "Krmfile"), destDir)
|
||||
if !assert.NoError(t, err) {
|
||||
t.FailNow()
|
||||
}
|
||||
|
||||
@@ -56,6 +56,8 @@ type SetterCreator struct {
|
||||
|
||||
// Path to resources folder
|
||||
ResourcesPath string
|
||||
|
||||
SettersSchema *spec.Schema
|
||||
}
|
||||
|
||||
func (c *SetterCreator) Filter(input []*yaml.RNode) ([]*yaml.RNode, error) {
|
||||
@@ -75,10 +77,11 @@ func (c SetterCreator) Create() error {
|
||||
// Update the resources with the setter reference
|
||||
inout := &kio.LocalPackageReadWriter{PackagePath: c.ResourcesPath}
|
||||
a := &setters2.Add{
|
||||
FieldName: c.FieldName,
|
||||
FieldValue: c.FieldValue,
|
||||
Ref: fieldmeta.DefinitionsPrefix + fieldmeta.SetterDefinitionPrefix + c.Name,
|
||||
Type: c.Type,
|
||||
FieldName: c.FieldName,
|
||||
FieldValue: c.FieldValue,
|
||||
Ref: fieldmeta.DefinitionsPrefix + fieldmeta.SetterDefinitionPrefix + c.Name,
|
||||
Type: c.Type,
|
||||
SettersSchema: c.SettersSchema,
|
||||
}
|
||||
err = kio.Pipeline{
|
||||
Inputs: []kio.Reader{inout},
|
||||
@@ -103,11 +106,11 @@ func (c SetterCreator) Create() error {
|
||||
}
|
||||
|
||||
// Load the updated definitions
|
||||
clean, err := openapi.AddSchemaFromFile(c.OpenAPIPath)
|
||||
sc, err := openapi.SchemaFromFile(c.OpenAPIPath)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
defer clean()
|
||||
c.SettersSchema = sc
|
||||
// if the setter is of array type write the derived list values back to
|
||||
// openAPI definitions
|
||||
if len(a.ListValues) > 0 {
|
||||
@@ -183,7 +186,7 @@ func (c SetterCreator) validateSetterInfo() error {
|
||||
return err
|
||||
}
|
||||
|
||||
subst, _ := openapi.Resolve(&ref)
|
||||
subst, _ := openapi.Resolve(&ref, c.SettersSchema)
|
||||
// if substitution already exists with the input setter name, throw error
|
||||
if subst != nil {
|
||||
return errors.Errorf("substitution with name %q already exists, "+
|
||||
@@ -196,7 +199,7 @@ func (c SetterCreator) validateSetterInfo() error {
|
||||
return err
|
||||
}
|
||||
|
||||
setter, _ := openapi.Resolve(&ref)
|
||||
setter, _ := openapi.Resolve(&ref, c.SettersSchema)
|
||||
// if setter already exists with the input setter name, throw error
|
||||
if setter != nil {
|
||||
return errors.Errorf("setter with name %q already exists, "+
|
||||
|
||||
@@ -53,6 +53,8 @@ type SubstitutionCreator struct {
|
||||
|
||||
// Path to resources folder
|
||||
ResourcesPath string
|
||||
|
||||
SettersSchema *spec.Schema
|
||||
}
|
||||
|
||||
func (c *SubstitutionCreator) Filter(input []*yaml.RNode) ([]*yaml.RNode, error) {
|
||||
@@ -64,7 +66,7 @@ func (c SubstitutionCreator) Create() error {
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
values, err := markersAndRefs(c.Name, c.Pattern)
|
||||
values, err := c.markersAndRefs(c.Name, c.Pattern)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
@@ -93,11 +95,11 @@ func (c SubstitutionCreator) Create() error {
|
||||
}
|
||||
|
||||
// Load the updated definitions
|
||||
clean, err := openapi.AddSchemaFromFile(c.OpenAPIPath)
|
||||
sc, err := openapi.SchemaFromFile(c.OpenAPIPath)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
defer clean()
|
||||
c.SettersSchema = sc
|
||||
|
||||
visited := sets.String{}
|
||||
ref, err := spec.NewRef(fieldmeta.DefinitionsPrefix + fieldmeta.SubstitutionDefinitionPrefix + c.Name)
|
||||
@@ -105,7 +107,7 @@ func (c SubstitutionCreator) Create() error {
|
||||
return err
|
||||
}
|
||||
|
||||
schema, err := openapi.Resolve(&ref)
|
||||
schema, err := openapi.Resolve(&ref, c.SettersSchema)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
@@ -121,14 +123,14 @@ func (c SubstitutionCreator) Create() error {
|
||||
}
|
||||
|
||||
// Load the updated definitions after setters are created
|
||||
clean, err = openapi.AddSchemaFromFile(c.OpenAPIPath)
|
||||
sc, err = openapi.SchemaFromFile(c.OpenAPIPath)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
defer clean()
|
||||
c.SettersSchema = sc
|
||||
|
||||
// revert openAPI file if there are cycles detected in created input substitution
|
||||
if err := checkForCycles(ext, visited); err != nil {
|
||||
if err := c.checkForCycles(ext, visited); err != nil {
|
||||
if writeErr := ioutil.WriteFile(c.OpenAPIPath, curOpenAPI, stat.Mode().Perm()); writeErr != nil {
|
||||
return writeErr
|
||||
}
|
||||
@@ -136,9 +138,10 @@ func (c SubstitutionCreator) Create() error {
|
||||
}
|
||||
|
||||
a := &setters2.Add{
|
||||
FieldName: c.FieldName,
|
||||
FieldValue: c.FieldValue,
|
||||
Ref: fieldmeta.DefinitionsPrefix + fieldmeta.SubstitutionDefinitionPrefix + c.Name,
|
||||
FieldName: c.FieldName,
|
||||
FieldValue: c.FieldValue,
|
||||
Ref: fieldmeta.DefinitionsPrefix + fieldmeta.SubstitutionDefinitionPrefix + c.Name,
|
||||
SettersSchema: c.SettersSchema,
|
||||
}
|
||||
|
||||
// Update the resources with the substitution reference
|
||||
@@ -158,7 +161,7 @@ func (c SubstitutionCreator) Create() error {
|
||||
|
||||
// createMarkersAndRefs takes the input pattern, creates setter/substitution markers
|
||||
// and corresponding openAPI refs
|
||||
func markersAndRefs(substName, pattern string) ([]setters2.Value, error) {
|
||||
func (c *SubstitutionCreator) markersAndRefs(substName, pattern string) ([]setters2.Value, error) {
|
||||
var values []setters2.Value
|
||||
// extract setter name tokens from pattern enclosed in ${}
|
||||
re := regexp.MustCompile(`\$\{([^}]*)\}`)
|
||||
@@ -180,7 +183,7 @@ func markersAndRefs(substName, pattern string) ([]setters2.Value, error) {
|
||||
}
|
||||
|
||||
var markerRef string
|
||||
subst, _ := openapi.Resolve(&ref)
|
||||
subst, _ := openapi.Resolve(&ref, c.SettersSchema)
|
||||
// check if the substitution exists with the marker name or fall back to creating setter
|
||||
// ref with the name
|
||||
if subst != nil {
|
||||
@@ -246,7 +249,7 @@ func (c SubstitutionCreator) CreateSettersForSubstitution(openAPIPath string) er
|
||||
return nil
|
||||
}
|
||||
|
||||
func checkForCycles(ext *setters2.CliExtension, visited sets.String) error {
|
||||
func (c SubstitutionCreator) checkForCycles(ext *setters2.CliExtension, visited sets.String) error {
|
||||
// check if the substitution has already been visited and throw error as cycles
|
||||
// are not allowed in nested substitutions
|
||||
if visited.Has(ext.Substitution.Name) {
|
||||
@@ -268,7 +271,7 @@ func checkForCycles(ext *setters2.CliExtension, visited sets.String) error {
|
||||
if err != nil {
|
||||
return errors.Wrap(err)
|
||||
}
|
||||
def, err := openapi.Resolve(&ref) // resolve the def to its openAPI def
|
||||
def, err := openapi.Resolve(&ref, c.SettersSchema) // resolve the def to its openAPI def
|
||||
if err != nil {
|
||||
return errors.Wrap(err)
|
||||
}
|
||||
@@ -279,7 +282,7 @@ func checkForCycles(ext *setters2.CliExtension, visited sets.String) error {
|
||||
|
||||
if defExt.Substitution != nil {
|
||||
// parse recursively if it reference is substitution
|
||||
err := checkForCycles(defExt, visited)
|
||||
err := c.checkForCycles(defExt, visited)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
@@ -440,7 +443,7 @@ func (c SubstitutionCreator) validateSubstitutionInfo() error {
|
||||
return err
|
||||
}
|
||||
|
||||
subst, _ := openapi.Resolve(&ref)
|
||||
subst, _ := openapi.Resolve(&ref, c.SettersSchema)
|
||||
// if substitution already exists with the input substitution name, throw error
|
||||
if subst != nil {
|
||||
return errors.Errorf("substitution with name %q already exists", c.Name)
|
||||
@@ -452,7 +455,7 @@ func (c SubstitutionCreator) validateSubstitutionInfo() error {
|
||||
return err
|
||||
}
|
||||
|
||||
setter, _ := openapi.Resolve(&ref)
|
||||
setter, _ := openapi.Resolve(&ref, c.SettersSchema)
|
||||
// if setter already exists with input substitution name, throw error
|
||||
if setter != nil {
|
||||
return errors.Errorf(fmt.Sprintf("setter with name %q already exists, "+
|
||||
|
||||
Reference in New Issue
Block a user