diff --git a/pkg/fission-cli/cmd/environment/create.go b/pkg/fission-cli/cmd/environment/create.go index e0e38176..4d99e4d0 100644 --- a/pkg/fission-cli/cmd/environment/create.go +++ b/pkg/fission-cli/cmd/environment/create.go @@ -100,7 +100,7 @@ func (opts *CreateSubCommand) run(input cli.Input) (err error) { } specFile := fmt.Sprintf("env-%v.yaml", m.Name) - err = spec.SpecSave(*opts.env, specFile) + err = spec.SpecSave(*opts.env, specFile, false) if err != nil { return errors.Wrap(err, "error saving environment spec") } diff --git a/pkg/fission-cli/cmd/environment/update.go b/pkg/fission-cli/cmd/environment/update.go index ea89791a..5c1bbb6c 100644 --- a/pkg/fission-cli/cmd/environment/update.go +++ b/pkg/fission-cli/cmd/environment/update.go @@ -29,6 +29,7 @@ import ( fv1 "github.com/fission/fission/pkg/apis/core/v1" "github.com/fission/fission/pkg/fission-cli/cliwrapper/cli" "github.com/fission/fission/pkg/fission-cli/cmd" + "github.com/fission/fission/pkg/fission-cli/cmd/spec" "github.com/fission/fission/pkg/fission-cli/console" flagkey "github.com/fission/fission/pkg/fission-cli/flag/key" "github.com/fission/fission/pkg/fission-cli/util" @@ -78,7 +79,20 @@ func (opts *UpdateSubCommand) complete(input cli.Input) (err error) { } func (opts *UpdateSubCommand) run(input cli.Input) error { + m := opts.env.ObjectMeta + if input.Bool(flagkey.SpecSave) { + err := opts.env.Validate() + if err != nil { + return fv1.AggregateValidationErrors("Environment", err) + } + specFile := fmt.Sprintf("env-%s.yaml", m.Name) + err = spec.SpecSave(*opts.env, specFile, true) + if err != nil { + return errors.Wrap(err, "error saving environment spec") + } + return nil + } enew, err := opts.Client().FissionClientSet.CoreV1().Environments(opts.env.ObjectMeta.Namespace).Update(input.Context(), opts.env, metav1.UpdateOptions{}) if err != nil { return errors.Wrap(err, "error updating environment") diff --git a/pkg/fission-cli/cmd/function/create.go b/pkg/fission-cli/cmd/function/create.go index 0b6e3e5d..0c98471d 100644 --- a/pkg/fission-cli/cmd/function/create.go +++ b/pkg/fission-cli/cmd/function/create.go @@ -363,7 +363,7 @@ func (opts *CreateSubCommand) run(input cli.Input) error { } if input.Bool(flagkey.SpecSave) { - err := spec.SpecSave(*opts.function, opts.specFile) + err := spec.SpecSave(*opts.function, opts.specFile, false) if err != nil { return errors.Wrap(err, "error saving function spec") } diff --git a/pkg/fission-cli/cmd/function/run_container.go b/pkg/fission-cli/cmd/function/run_container.go index 7b46dc63..60b02d5c 100644 --- a/pkg/fission-cli/cmd/function/run_container.go +++ b/pkg/fission-cli/cmd/function/run_container.go @@ -226,7 +226,7 @@ func (opts *RunContainerSubCommand) run(input cli.Input) error { } if input.Bool(flagkey.SpecSave) { - err := spec.SpecSave(*opts.function, opts.specFile) + err := spec.SpecSave(*opts.function, opts.specFile, false) if err != nil { return errors.Wrap(err, "error saving function spec") } diff --git a/pkg/fission-cli/cmd/function/update.go b/pkg/fission-cli/cmd/function/update.go index e39aefce..14704db0 100644 --- a/pkg/fission-cli/cmd/function/update.go +++ b/pkg/fission-cli/cmd/function/update.go @@ -27,6 +27,7 @@ import ( "github.com/fission/fission/pkg/fission-cli/cliwrapper/cli" "github.com/fission/fission/pkg/fission-cli/cmd" _package "github.com/fission/fission/pkg/fission-cli/cmd/package" + "github.com/fission/fission/pkg/fission-cli/cmd/spec" "github.com/fission/fission/pkg/fission-cli/console" flagkey "github.com/fission/fission/pkg/fission-cli/flag/key" "github.com/fission/fission/pkg/fission-cli/util" @@ -35,6 +36,7 @@ import ( type UpdateSubCommand struct { cmd.CommandActioner function *fv1.Function + specFile string } func Update(input cli.Input) error { @@ -55,6 +57,9 @@ func (opts *UpdateSubCommand) complete(input cli.Input) error { if err != nil { return errors.Wrap(err, "error in updating function ") } + if input.Bool(flagkey.SpecSave) { + opts.specFile = fmt.Sprintf("function-%s.yaml", fnName) + } function, err := opts.Client().FissionClientSet.CoreV1().Functions(fnNamespace).Get(input.Context(), input.String(flagkey.FnName), metav1.GetOptions{}) if err != nil { @@ -193,7 +198,7 @@ func (opts *UpdateSubCommand) complete(input cli.Input) error { return errors.Errorf("Package is used by multiple functions, use --%v to force update", flagkey.PkgForce) } - newPkgMeta, err := _package.UpdatePackage(input, opts.Client(), pkg) + newPkgMeta, err := _package.UpdatePackage(input, opts.Client(), opts.specFile, pkg) if err != nil { return errors.Wrap(err, fmt.Sprintf("error updating package '%v'", pkgName)) } @@ -243,6 +248,17 @@ func (opts *UpdateSubCommand) complete(input cli.Input) error { } func (opts *UpdateSubCommand) run(input cli.Input) error { + if input.Bool(flagkey.SpecSave) { + err := opts.function.Validate() + if err != nil { + return fv1.AggregateValidationErrors("Function", err) + } + err = spec.SpecSave(*opts.function, opts.specFile, false) + if err != nil { + return errors.Wrap(err, "error saving function spec") + } + return nil + } _, err := opts.Client().FissionClientSet.CoreV1().Functions(opts.function.Namespace).Update(input.Context(), opts.function, metav1.UpdateOptions{}) if err != nil { return errors.Wrap(err, "error updating function") diff --git a/pkg/fission-cli/cmd/httptrigger/create.go b/pkg/fission-cli/cmd/httptrigger/create.go index 235d8899..dac0e48f 100644 --- a/pkg/fission-cli/cmd/httptrigger/create.go +++ b/pkg/fission-cli/cmd/httptrigger/create.go @@ -219,7 +219,7 @@ func (opts *CreateSubCommand) run(input cli.Input) error { if input.Bool(flagkey.SpecSave) { specFile := fmt.Sprintf("route-%v.yaml", opts.trigger.ObjectMeta.Name) - err := spec.SpecSave(*opts.trigger, specFile) + err := spec.SpecSave(*opts.trigger, specFile, false) if err != nil { return errors.Wrap(err, "error saving HTTP trigger spec") } diff --git a/pkg/fission-cli/cmd/httptrigger/update.go b/pkg/fission-cli/cmd/httptrigger/update.go index b1357c79..275de994 100644 --- a/pkg/fission-cli/cmd/httptrigger/update.go +++ b/pkg/fission-cli/cmd/httptrigger/update.go @@ -26,6 +26,7 @@ import ( fv1 "github.com/fission/fission/pkg/apis/core/v1" "github.com/fission/fission/pkg/fission-cli/cliwrapper/cli" "github.com/fission/fission/pkg/fission-cli/cmd" + "github.com/fission/fission/pkg/fission-cli/cmd/spec" "github.com/fission/fission/pkg/fission-cli/console" flagkey "github.com/fission/fission/pkg/fission-cli/flag/key" "github.com/fission/fission/pkg/fission-cli/util" @@ -148,7 +149,18 @@ func (opts *UpdateSubCommand) complete(input cli.Input) (err error) { } func (opts *UpdateSubCommand) run(input cli.Input) error { - + if input.Bool(flagkey.SpecSave) { + err := opts.trigger.Validate() + if err != nil { + return fv1.AggregateValidationErrors("HTTPTrigger", err) + } + specFile := fmt.Sprintf("route-%s.yaml", opts.trigger.ObjectMeta.Name) + err = spec.SpecSave(*opts.trigger, specFile, true) + if err != nil { + return errors.Wrap(err, "error saving HTTP trigger spec") + } + return nil + } err := util.CheckHTTPTriggerDuplicates(input.Context(), opts.Client(), opts.trigger) if err != nil { return errors.Wrap(err, "Error while creating HTTP Trigger") diff --git a/pkg/fission-cli/cmd/kubewatch/create.go b/pkg/fission-cli/cmd/kubewatch/create.go index 0ba2c66a..18e7e3d4 100644 --- a/pkg/fission-cli/cmd/kubewatch/create.go +++ b/pkg/fission-cli/cmd/kubewatch/create.go @@ -119,7 +119,7 @@ func (opts *CreateSubCommand) run(input cli.Input) error { if input.Bool(flagkey.SpecSave) { specFile := fmt.Sprintf("kubewatch-%v.yaml", opts.watcher.ObjectMeta.Name) - err := spec.SpecSave(*opts.watcher, specFile) + err := spec.SpecSave(*opts.watcher, specFile, false) if err != nil { return errors.Wrap(err, "error saving kubewatch spec") } diff --git a/pkg/fission-cli/cmd/mqtrigger/create.go b/pkg/fission-cli/cmd/mqtrigger/create.go index 893fe870..b799deab 100644 --- a/pkg/fission-cli/cmd/mqtrigger/create.go +++ b/pkg/fission-cli/cmd/mqtrigger/create.go @@ -203,7 +203,7 @@ func (opts *CreateSubCommand) run(input cli.Input) error { if input.Bool(flagkey.SpecSave) { specFile := fmt.Sprintf("mqtrigger-%v.yaml", opts.trigger.ObjectMeta.Name) - err := spec.SpecSave(*opts.trigger, specFile) + err := spec.SpecSave(*opts.trigger, specFile, false) if err != nil { return errors.Wrap(err, "error saving message queue trigger spec") } diff --git a/pkg/fission-cli/cmd/mqtrigger/update.go b/pkg/fission-cli/cmd/mqtrigger/update.go index 7c716041..14dbe8e8 100644 --- a/pkg/fission-cli/cmd/mqtrigger/update.go +++ b/pkg/fission-cli/cmd/mqtrigger/update.go @@ -25,6 +25,7 @@ import ( fv1 "github.com/fission/fission/pkg/apis/core/v1" "github.com/fission/fission/pkg/fission-cli/cliwrapper/cli" "github.com/fission/fission/pkg/fission-cli/cmd" + "github.com/fission/fission/pkg/fission-cli/cmd/spec" "github.com/fission/fission/pkg/fission-cli/console" flagkey "github.com/fission/fission/pkg/fission-cli/flag/key" "github.com/fission/fission/pkg/fission-cli/util" @@ -148,6 +149,18 @@ func (opts *UpdateSubCommand) complete(input cli.Input) (err error) { } func (opts *UpdateSubCommand) run(input cli.Input) error { + if input.Bool(flagkey.SpecSave) { + err := opts.trigger.Validate() + if err != nil { + return fv1.AggregateValidationErrors("MessageQueueTrigger", err) + } + specFile := fmt.Sprintf("mqtrigger-%s.yaml", opts.trigger.ObjectMeta.Name) + err = spec.SpecSave(*opts.trigger, specFile, true) + if err != nil { + return errors.Wrap(err, "error saving message queue trigger spec") + } + return nil + } _, err := opts.Client().FissionClientSet.CoreV1().MessageQueueTriggers(opts.trigger.ObjectMeta.Namespace).Update(input.Context(), opts.trigger, metav1.UpdateOptions{}) if err != nil { return errors.Wrap(err, "error updating message queue trigger") diff --git a/pkg/fission-cli/cmd/package/create.go b/pkg/fission-cli/cmd/package/create.go index 23923a32..ffcde178 100644 --- a/pkg/fission-cli/cmd/package/create.go +++ b/pkg/fission-cli/cmd/package/create.go @@ -216,7 +216,7 @@ func CreatePackage(input cli.Input, client cmd.Client, pkgName string, pkgNamesp return &pkg.ObjectMeta, nil } - err = spec.SpecSave(*pkg, specFile) + err = spec.SpecSave(*pkg, specFile, false) if err != nil { return nil, errors.Wrap(err, "error saving package spec") } diff --git a/pkg/fission-cli/cmd/package/package.go b/pkg/fission-cli/cmd/package/package.go index 5f1d7101..1e238b1a 100644 --- a/pkg/fission-cli/cmd/package/package.go +++ b/pkg/fission-cli/cmd/package/package.go @@ -174,7 +174,7 @@ func CreateArchive(client cmd.Client, input cli.Input, includeFiles []string, no aus.Name = oldAus.Name } else { // save the uploadspec - err := spec.SpecSave(*aus, specFile) + err := spec.SpecSave(*aus, specFile, false) if err != nil { return nil, errors.Wrap(err, "error saving archive spec") } diff --git a/pkg/fission-cli/cmd/package/update.go b/pkg/fission-cli/cmd/package/update.go index faed8dae..e10ce88e 100644 --- a/pkg/fission-cli/cmd/package/update.go +++ b/pkg/fission-cli/cmd/package/update.go @@ -28,7 +28,9 @@ import ( fv1 "github.com/fission/fission/pkg/apis/core/v1" "github.com/fission/fission/pkg/fission-cli/cliwrapper/cli" "github.com/fission/fission/pkg/fission-cli/cmd" + "github.com/fission/fission/pkg/fission-cli/cmd/spec" flagkey "github.com/fission/fission/pkg/fission-cli/flag/key" + "github.com/fission/fission/pkg/fission-cli/util" ) type UpdateSubCommand struct { @@ -61,6 +63,7 @@ func (opts *UpdateSubCommand) complete(input cli.Input) (err error) { } func (opts *UpdateSubCommand) run(input cli.Input) error { + pkgName := input.String(flagkey.PkgName) pkg, err := opts.Client().FissionClientSet.CoreV1().Packages(opts.pkgNamespace).Get(input.Context(), opts.pkgName, metav1.GetOptions{}) if err != nil { return err @@ -79,8 +82,8 @@ func (opts *UpdateSubCommand) run(input cli.Input) error { if !forceUpdate && len(fnList) > 1 { return errors.Errorf("package is used by multiple functions, use --%v to force update", flagkey.PkgForce) } - - newPkgMeta, err := UpdatePackage(input, opts.Client(), pkg) + specFile := fmt.Sprintf("package-%s.yaml", pkgName) + newPkgMeta, err := UpdatePackage(input, opts.Client(), specFile, pkg) if err != nil { return errors.Wrap(err, "error updating package") } @@ -95,7 +98,7 @@ func (opts *UpdateSubCommand) run(input cli.Input) error { return nil } -func UpdatePackage(input cli.Input, client cmd.Client, pkg *fv1.Package) (*metav1.ObjectMeta, error) { +func UpdatePackage(input cli.Input, client cmd.Client, specFile string, pkg *fv1.Package) (*metav1.ObjectMeta, error) { envName := input.String(flagkey.PkgEnvironment) srcArchiveFiles := input.StringSlice(flagkey.PkgSrcArchive) deployArchiveFiles := input.StringSlice(flagkey.PkgDeployArchive) @@ -174,6 +177,27 @@ func UpdatePackage(input cli.Input, client cmd.Client, pkg *fv1.Package) (*metav } } + if input.Bool(flagkey.SpecSave) { + // if a package with the same spec exists, don't create a new spec file + fr, err := spec.ReadSpecs(util.GetSpecDir(input), util.GetSpecIgnore(input), false) + if err != nil { + return nil, errors.Wrap(err, "error reading specs") + } + + obj := fr.SpecExists(pkg, true, true) + if obj != nil { + pkg := obj.(*fv1.Package) + fmt.Printf("Re-using previously created package %s\n", pkg.ObjectMeta.Name) + return &pkg.ObjectMeta, nil + } + + err = spec.SpecSave(*pkg, specFile, true) + if err != nil { + return nil, errors.Wrap(err, "error saving package spec") + } + return &pkg.ObjectMeta, nil + } + newPkgMeta, err := client.FissionClientSet.CoreV1().Packages(pkg.ObjectMeta.Namespace).Update(input.Context(), pkg, metav1.UpdateOptions{}) if err != nil { return nil, errors.Wrap(err, "update package") diff --git a/pkg/fission-cli/cmd/spec/spec.go b/pkg/fission-cli/cmd/spec/spec.go index e3fe0766..cfe83c13 100644 --- a/pkg/fission-cli/cmd/spec/spec.go +++ b/pkg/fission-cli/cmd/spec/spec.go @@ -127,7 +127,7 @@ func MapKey(m *metav1.ObjectMeta) string { } // save saves object encoded value to spec file under given spec directory -func save(data []byte, specDir string, specFile string) error { +func save(data []byte, specDir string, specFile string, truncate bool) error { // verify if _, err := os.Stat(filepath.Join(specDir, "fission-deployment-config.yaml")); os.IsNotExist(err) { return errors.Wrap(err, "Couldn't find specs, run `fission spec init` first") @@ -137,6 +137,9 @@ func save(data []byte, specDir string, specFile string) error { // check if the file is new newFile := false if _, err := os.Stat(filename); os.IsNotExist(err) { + if truncate { + return errors.Errorf("spec file does not exists") + } newFile = true } @@ -147,11 +150,19 @@ func save(data []byte, specDir string, specFile string) error { } defer f.Close() - // if we're appending, add a yaml document separator - if !newFile { - _, err = f.Write([]byte("\n---\n")) + if truncate { + err = f.Truncate(0) if err != nil { - return errors.Wrap(err, "couldn't write to spec file") + return errors.Wrap(err, "couldn't truncate the spec file") + } + + } else { + // if we're appending, add a yaml document separator + if !newFile { + _, err = f.Write([]byte("\n---\n")) + if err != nil { + return errors.Wrap(err, "couldn't write to spec file") + } } } @@ -164,7 +175,7 @@ func save(data []byte, specDir string, specFile string) error { } // called from `fission * create --spec` -func SpecSave(resource interface{}, specFile string) error { +func SpecSave(resource interface{}, specFile string, update bool) error { var specDir = "specs" meta, kind, data, err := crdToYaml(resource) @@ -186,7 +197,11 @@ func SpecSave(resource interface{}, specFile string) error { return errors.Errorf("same name resource (%v) already exists in namespace (%v)", meta.Name, meta.Namespace) } - err = save(data, specDir, specFile) + truncate := false + if update { + truncate = true + } + err = save(data, specDir, specFile, truncate) if err != nil { return err } diff --git a/pkg/fission-cli/cmd/timetrigger/create.go b/pkg/fission-cli/cmd/timetrigger/create.go index 22c45c6a..fd3dbefc 100644 --- a/pkg/fission-cli/cmd/timetrigger/create.go +++ b/pkg/fission-cli/cmd/timetrigger/create.go @@ -135,7 +135,7 @@ func (opts *CreateSubCommand) run(input cli.Input) error { if input.Bool(flagkey.SpecSave) { specFile := fmt.Sprintf("timetrigger-%v.yaml", opts.trigger.ObjectMeta.Name) - err := spec.SpecSave(*opts.trigger, specFile) + err := spec.SpecSave(*opts.trigger, specFile, false) if err != nil { return errors.Wrap(err, "error saving time trigger spec") } diff --git a/pkg/fission-cli/cmd/timetrigger/update.go b/pkg/fission-cli/cmd/timetrigger/update.go index d2f0832d..ab9300cf 100644 --- a/pkg/fission-cli/cmd/timetrigger/update.go +++ b/pkg/fission-cli/cmd/timetrigger/update.go @@ -25,6 +25,7 @@ import ( fv1 "github.com/fission/fission/pkg/apis/core/v1" "github.com/fission/fission/pkg/fission-cli/cliwrapper/cli" "github.com/fission/fission/pkg/fission-cli/cmd" + "github.com/fission/fission/pkg/fission-cli/cmd/spec" "github.com/fission/fission/pkg/fission-cli/console" flagkey "github.com/fission/fission/pkg/fission-cli/flag/key" "github.com/fission/fission/pkg/fission-cli/util" @@ -86,6 +87,18 @@ func (opts *UpdateSubCommand) complete(input cli.Input) error { } func (opts *UpdateSubCommand) run(input cli.Input) error { + if input.Bool(flagkey.SpecSave) { + err := opts.trigger.Validate() + if err != nil { + return fv1.AggregateValidationErrors("TimeTrigger", err) + } + specFile := fmt.Sprintf("timetrigger-%s.yaml", opts.trigger.ObjectMeta.Name) + err = spec.SpecSave(*opts.trigger, specFile, true) + if err != nil { + return errors.Wrap(err, "error saving time trigger spec") + } + return nil + } _, err := opts.Client().FissionClientSet.CoreV1().TimeTriggers(opts.trigger.ObjectMeta.Namespace).Update(input.Context(), opts.trigger, metav1.UpdateOptions{}) if err != nil { return errors.Wrap(err, "error updating Time trigger")