Add --dry option to view the generated spec without saving (#1504)

This commit is contained in:
Ta-Ching Chen
2020-01-24 20:43:42 +08:00
committed by GitHub
parent 2338fbb06f
commit 520cc0e130
19 changed files with 128 additions and 65 deletions
+47 -27
View File
@@ -164,13 +164,54 @@ func save(data []byte, specDir string, specFile string) error {
// called from `fission * create --spec`
func SpecSave(resource interface{}, specFile string) error {
var meta metav1.ObjectMeta
var kind string
var specDir = "specs"
meta, kind, data, err := crdToYaml(resource)
if err != nil {
return err
}
fr, err := ReadSpecs(specDir)
if err != nil {
return errors.Wrap(err, fmt.Sprintf("error reading spec in '%v'", specDir))
}
exists, err := fr.ExistsInSpecs(resource)
if err != nil {
return err
}
if exists {
return errors.Errorf("same name resource (%v) already exists in namespace (%v)", meta.Name, meta.Namespace)
}
err = save(data, specDir, specFile)
if err != nil {
return err
}
console.Info(fmt.Sprintf("Saving %v '%v/%v' to '%v/%v'",
kind, meta.Namespace, meta.Name, specDir, specFile))
return nil
}
func SpecDry(resource interface{}) error {
_, _, data, err := crdToYaml(resource)
if err != nil {
return err
}
fmt.Println(string(data))
return nil
}
func crdToYaml(resource interface{}) (metav1.ObjectMeta, string, []byte, error) {
// make sure we're writing a known type
var meta metav1.ObjectMeta
var kind string
var data []byte
var err error
switch typedres := resource.(type) {
case types.ArchiveUploadSpec:
typedres.Kind = "ArchiveUploadSpec"
@@ -222,35 +263,14 @@ func SpecSave(resource interface{}, specFile string) error {
kind = typedres.TypeMeta.Kind
data, err = yaml.Marshal(typedres)
default:
return fmt.Errorf("can't save resource %#v", resource)
err = errors.Errorf("unknown object type '%v'", typedres)
}
if err != nil {
return errors.Wrap(err, "Couldn't marshal YAML")
return metav1.ObjectMeta{}, "", nil, errors.Wrap(err, "couldn't marshal YAML")
}
fr, err := ReadSpecs(specDir)
if err != nil {
return errors.Wrap(err, fmt.Sprintf("error reading spec in '%v'", specDir))
}
exists, err := fr.ExistsInSpecs(resource)
if err != nil {
return err
}
if exists {
return errors.Errorf("same name resource (%v) already exists in namespace (%v)", meta.Name, meta.Namespace)
}
err = save(data, specDir, specFile)
if err != nil {
return err
}
console.Info(fmt.Sprintf("Saving %v '%v/%v' to '%v/%v'",
kind, meta.Namespace, meta.Name, specDir, specFile))
return nil
return meta, kind, data, nil
}
// validateFunctionReference checks a function reference