diff --git a/fission/function.go b/fission/function.go index 4d4c351c..22f5d03f 100644 --- a/fission/function.go +++ b/fission/function.go @@ -481,7 +481,7 @@ func fnUpdate(c *cli.Context) error { log.Fatal("Package is used by multiple functions, use --force to force update") } - pkgMetadata = updatePackage(client, pkg, envName, envNamespace, srcArchiveName, deployArchiveName, buildcmd) + pkgMetadata = updatePackage(client, pkg, envName, envNamespace, srcArchiveName, deployArchiveName, buildcmd, false) checkErr(err, fmt.Sprintf("update package '%v'", pkgName)) fmt.Printf("package '%v' updated\n", pkgMetadata.GetName()) diff --git a/fission/main.go b/fission/main.go index d9fffa0a..02bc40bf 100644 --- a/fission/main.go +++ b/fission/main.go @@ -241,6 +241,7 @@ func main() { pkgSubCommands := []cli.Command{ {Name: "create", Usage: "Create new package", Flags: []cli.Flag{pkgNamespaceFlag, pkgEnvironmentFlag, envNamespaceFlag, pkgSrcArchiveFlag, pkgDeployArchiveFlag, pkgBuildCmdFlag}, Action: pkgCreate}, {Name: "update", Usage: "Update package", Flags: []cli.Flag{pkgNameFlag, pkgNamespaceFlag, pkgEnvironmentFlag, envNamespaceFlag, pkgSrcArchiveFlag, pkgDeployArchiveFlag, pkgBuildCmdFlag, pkgForceFlag}, Action: pkgUpdate}, + {Name: "rebuild", Usage: "Rebuild a failed package", Flags: []cli.Flag{pkgNameFlag, pkgNamespaceFlag}, Action: pkgRebuild}, {Name: "getsrc", Usage: "Get source archive content", Flags: []cli.Flag{pkgNameFlag, pkgNamespaceFlag, pkgOutputFlag}, Action: pkgSourceGet}, {Name: "getdeploy", Usage: "Get deployment archive content", Flags: []cli.Flag{pkgNameFlag, pkgNamespaceFlag, pkgOutputFlag}, Action: pkgDeployGet}, {Name: "info", Usage: "Show package information", Flags: []cli.Flag{pkgNameFlag, pkgNamespaceFlag}, Action: pkgInfo}, diff --git a/fission/package.go b/fission/package.go index 2503519a..2ef333df 100644 --- a/fission/package.go +++ b/fission/package.go @@ -125,7 +125,7 @@ func pkgUpdate(c *cli.Context) error { } newPkgMeta := updatePackage(client, pkg, - envName, envNamespace, srcArchiveName, deployArchiveName, buildcmd) + envName, envNamespace, srcArchiveName, deployArchiveName, buildcmd, false) // update resource version of package reference of functions that shared the same package for _, fn := range fnList { @@ -140,7 +140,7 @@ func pkgUpdate(c *cli.Context) error { } func updatePackage(client *client.Client, pkg *crd.Package, envName, envNamespace, - srcArchiveName, deployArchiveName, buildcmd string) *metav1.ObjectMeta { + srcArchiveName, deployArchiveName, buildcmd string, forceRebuild bool) *metav1.ObjectMeta { var srcArchiveMetadata, deployArchiveMetadata *fission.Archive needToBuild := false @@ -168,7 +168,7 @@ func updatePackage(client *client.Client, pkg *crd.Package, envName, envNamespac } // Set package as pending status when needToBuild is true - if needToBuild { + if needToBuild || forceRebuild { // change into pending state to trigger package build pkg.Status = fission.PackageStatus{ BuildStatus: fission.BuildStatusPending, @@ -387,3 +387,30 @@ func pkgDelete(c *cli.Context) error { return nil } + +func pkgRebuild(c *cli.Context) error { + client := getClient(c.GlobalString("server")) + + pkgName := c.String("name") + if len(pkgName) == 0 { + log.Fatal("Need name of package, use --name") + } + pkgNamespace := c.String("pkgNamespace") + + pkg, err := client.PackageGet(&metav1.ObjectMeta{ + Name: pkgName, + Namespace: pkgNamespace, + }) + checkErr(err, "find package") + + if pkg.Status.BuildStatus != fission.BuildStatusFailed { + log.Fatal(fmt.Sprintf("Package %v is not in %v state.", + pkg.Metadata.Name, fission.BuildStatusFailed)) + } + + updatePackage(client, pkg, "", "", "", "", "", true) + + fmt.Printf("Retrying build for pkg %v. Use \"fission pkg info --name %v\" to view status.\n", pkg.Metadata.Name, pkg.Metadata.Name) + + return nil +}