diff --git a/pkg/apis/fission.io/v1/types.go b/pkg/apis/fission.io/v1/types.go index 6376e98e0a..a86a1389ed 100644 --- a/pkg/apis/fission.io/v1/types.go +++ b/pkg/apis/fission.io/v1/types.go @@ -17,6 +17,8 @@ limitations under the License. package v1 import ( + "time" + apiv1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" ) @@ -280,6 +282,9 @@ type ( // BuildLog stores build log during the compilation. BuildLog string `json:"buildlog,omitempty"` // output of the build (errors etc) + + // LastUpdateTimestamp will store the timestamp the package was last updated + LastUpdateTimestamp time.Time `json:"lastUpdateTimestamp,omitempty"` } // PackageRef is a reference to the package. diff --git a/pkg/buildermgr/common.go b/pkg/buildermgr/common.go index 8d16dcd990..32bbc0aee2 100644 --- a/pkg/buildermgr/common.go +++ b/pkg/buildermgr/common.go @@ -21,6 +21,7 @@ import ( "fmt" "net/http" "strings" + "time" "github.com/dchest/uniuri" "github.com/pkg/errors" @@ -124,8 +125,9 @@ func updatePackage(logger *zap.Logger, fissionClient *crd.FissionClient, uploadResp *types.ArchiveUploadResponse) (*fv1.Package, error) { pkg.Status = fv1.PackageStatus{ - BuildStatus: status, - BuildLog: buildLogs, + BuildStatus: status, + BuildLog: buildLogs, + LastUpdateTimestamp: time.Now().UTC(), } if uploadResp != nil { diff --git a/pkg/fission-cli/package.go b/pkg/fission-cli/package.go index 4677f413a7..4894c1c5f8 100644 --- a/pkg/fission-cli/package.go +++ b/pkg/fission-cli/package.go @@ -29,8 +29,10 @@ import ( "os" "path" "path/filepath" + "sort" "strings" "text/tabwriter" + "time" "github.com/dchest/uniuri" "github.com/fission/fission/pkg/utils" @@ -209,7 +211,8 @@ func updatePackage(client *client.Client, pkg *fv1.Package, envName, envNamespac if needToBuild || forceRebuild { // change into pending state to trigger package build pkg.Status = fv1.PackageStatus{ - BuildStatus: fv1.BuildStatusPending, + BuildStatus: fv1.BuildStatusPending, + LastUpdateTimestamp: time.Now().UTC(), } } @@ -331,20 +334,25 @@ func pkgList(c *cli.Context) error { return err } + // sort the package list by lastUpdatedTimestamp + sort.Slice(pkgList, func(i, j int) bool { + return pkgList[i].Status.LastUpdateTimestamp.After(pkgList[j].Status.LastUpdateTimestamp) + }) + w := tabwriter.NewWriter(os.Stdout, 0, 0, 1, ' ', 0) - fmt.Fprintf(w, "%v\t%v\t%v\n", "NAME", "BUILD_STATUS", "ENV") + fmt.Fprintf(w, "%v\t%v\t%v\t%v\n", "NAME", "BUILD_STATUS", "ENV", "LASTUPDATEDAT") if listOrphans { for _, pkg := range pkgList { fnList, err := getFunctionsByPackage(client, pkg.Metadata.Name, pkg.Metadata.Namespace) util.CheckErr(err, fmt.Sprintf("get functions sharing package %s", pkg.Metadata.Name)) if len(fnList) == 0 { - fmt.Fprintf(w, "%v\t%v\t%v\n", pkg.Metadata.Name, pkg.Status.BuildStatus, pkg.Spec.Environment.Name) + fmt.Fprintf(w, "%v\t%v\t%v\t%v\n", pkg.Metadata.Name, pkg.Status.BuildStatus, pkg.Spec.Environment.Name, pkg.Status.LastUpdateTimestamp.Format(time.RFC3339)) } } } else { for _, pkg := range pkgList { - fmt.Fprintf(w, "%v\t%v\t%v\n", pkg.Metadata.Name, - pkg.Status.BuildStatus, pkg.Spec.Environment.Name) + fmt.Fprintf(w, "%v\t%v\t%v\t%v\n", pkg.Metadata.Name, + pkg.Status.BuildStatus, pkg.Spec.Environment.Name, pkg.Status.LastUpdateTimestamp.Format(time.RFC3339)) } } @@ -621,12 +629,13 @@ func createPackage(c *cli.Context, client *client.Client, pkgNamespace string, e }, Spec: pkgSpec, Status: fv1.PackageStatus{ - BuildStatus: pkgStatus, + BuildStatus: pkgStatus, + LastUpdateTimestamp: time.Now().UTC(), }, } if len(specFile) > 0 { - // if a package sith the same spec exists, don't create a new spec file + // if a package with the same spec exists, don't create a new spec file fr, err := readSpecs(cmdutils.GetSpecDir(urfavecli.Parse(c))) util.CheckErr(err, "read specs") if m := fr.SpecExists(pkg, false, true); m != nil {