Fix for #662: avoid unnecessary builds (#866)

This commit is contained in:
smruthi2187
2018-08-17 13:53:37 +08:00
committed by Ta-Ching Chen
parent 9d7355cbaa
commit ad28922871
2 changed files with 42 additions and 6 deletions
+16 -2
View File
@@ -394,6 +394,17 @@ func fnUpdate(c *cli.Context) error {
envName := c.String("env") envName := c.String("env")
envNamespace := c.String("envNamespace") envNamespace := c.String("envNamespace")
// if the new env specified is the same as the old one, no need to update package
// same is true for all update parameters, but, for now, we dont check all of them - because, its ok to
// re-write the object with same old values, we just end up getting a new resource version for the object.
if len(envName) > 0 && envName == function.Spec.Environment.Name {
envName = ""
}
if envNamespace == function.Spec.Environment.Namespace {
envNamespace = ""
}
deployArchiveName := c.String("code") deployArchiveName := c.String("code")
if len(deployArchiveName) == 0 { if len(deployArchiveName) == 0 {
deployArchiveName = c.String("deploy") deployArchiveName = c.String("deploy")
@@ -455,6 +466,9 @@ func fnUpdate(c *cli.Context) error {
if len(envName) > 0 { if len(envName) > 0 {
function.Spec.Environment.Name = envName function.Spec.Environment.Name = envName
}
if len(envNamespace) > 0 {
function.Spec.Environment.Namespace = envNamespace function.Spec.Environment.Namespace = envNamespace
} }
@@ -473,7 +487,7 @@ func fnUpdate(c *cli.Context) error {
pkgMetadata := &pkg.Metadata pkgMetadata := &pkg.Metadata
if len(deployArchiveName) != 0 || len(srcArchiveName) != 0 || len(buildcmd) != 0 || len(envName) != 0 { if len(deployArchiveName) != 0 || len(srcArchiveName) != 0 || len(buildcmd) != 0 || len(envName) != 0 || len(envNamespace) != 0 {
fnList, err := getFunctionsByPackage(client, pkg.Metadata.Name, pkg.Metadata.Namespace) fnList, err := getFunctionsByPackage(client, pkg.Metadata.Name, pkg.Metadata.Namespace)
checkErr(err, "get function list") checkErr(err, "get function list")
@@ -481,7 +495,7 @@ func fnUpdate(c *cli.Context) error {
log.Fatal("Package is used by multiple functions, use --force to force update") log.Fatal("Package is used by multiple functions, use --force to force update")
} }
pkgMetadata = updatePackage(client, pkg, envName, envNamespace, srcArchiveName, deployArchiveName, buildcmd, false) pkgMetadata, err = updatePackage(client, pkg, envName, envNamespace, srcArchiveName, deployArchiveName, buildcmd, false)
checkErr(err, fmt.Sprintf("update package '%v'", pkgName)) checkErr(err, fmt.Sprintf("update package '%v'", pkgName))
fmt.Printf("package '%v' updated\n", pkgMetadata.GetName()) fmt.Printf("package '%v' updated\n", pkgMetadata.GetName())
+26 -4
View File
@@ -117,6 +117,17 @@ func pkgUpdate(c *cli.Context) error {
}) })
checkErr(err, "get package") checkErr(err, "get package")
// if the new env specified is the same as the old one, no need to update package
// same is true for all update parameters, but, for now, we dont check all of them - because, its ok to
// re-write the object with same old values, we just end up getting a new resource version for the object.
if len(envName) > 0 && envName == pkg.Spec.Environment.Name {
envName = ""
}
if envNamespace == pkg.Spec.Environment.Namespace {
envNamespace = ""
}
fnList, err := getFunctionsByPackage(client, pkg.Metadata.Name, pkg.Metadata.Namespace) fnList, err := getFunctionsByPackage(client, pkg.Metadata.Name, pkg.Metadata.Namespace)
checkErr(err, "get function list") checkErr(err, "get function list")
@@ -124,8 +135,11 @@ func pkgUpdate(c *cli.Context) error {
log.Fatal("Package is used by multiple functions, use --force to force update") log.Fatal("Package is used by multiple functions, use --force to force update")
} }
newPkgMeta := updatePackage(client, pkg, newPkgMeta, err := updatePackage(client, pkg,
envName, envNamespace, srcArchiveName, deployArchiveName, buildcmd, false) envName, envNamespace, srcArchiveName, deployArchiveName, buildcmd, false)
if err != nil {
checkErr(err, "update package")
}
// update resource version of package reference of functions that shared the same package // update resource version of package reference of functions that shared the same package
for _, fn := range fnList { for _, fn := range fnList {
@@ -140,13 +154,17 @@ func pkgUpdate(c *cli.Context) error {
} }
func updatePackage(client *client.Client, pkg *crd.Package, envName, envNamespace, func updatePackage(client *client.Client, pkg *crd.Package, envName, envNamespace,
srcArchiveName, deployArchiveName, buildcmd string, forceRebuild bool) *metav1.ObjectMeta { srcArchiveName, deployArchiveName, buildcmd string, forceRebuild bool) (*metav1.ObjectMeta, error) {
var srcArchiveMetadata, deployArchiveMetadata *fission.Archive var srcArchiveMetadata, deployArchiveMetadata *fission.Archive
needToBuild := false needToBuild := false
if len(envName) > 0 { if len(envName) > 0 {
pkg.Spec.Environment.Name = envName pkg.Spec.Environment.Name = envName
needToBuild = true
}
if len(envNamespace) > 0 {
pkg.Spec.Environment.Namespace = envNamespace pkg.Spec.Environment.Namespace = envNamespace
needToBuild = true needToBuild = true
} }
@@ -165,6 +183,9 @@ func updatePackage(client *client.Client, pkg *crd.Package, envName, envNamespac
if len(deployArchiveName) > 0 { if len(deployArchiveName) > 0 {
deployArchiveMetadata = createArchive(client, deployArchiveName, "") deployArchiveMetadata = createArchive(client, deployArchiveName, "")
pkg.Spec.Deployment = *deployArchiveMetadata pkg.Spec.Deployment = *deployArchiveMetadata
// Users may update the env, envNS and deploy archive at the same time,
// but without the source archive. In this case, we should set needToBuild to false
needToBuild = false
} }
// Set package as pending status when needToBuild is true // Set package as pending status when needToBuild is true
@@ -178,7 +199,7 @@ func updatePackage(client *client.Client, pkg *crd.Package, envName, envNamespac
newPkgMeta, err := client.PackageUpdate(pkg) newPkgMeta, err := client.PackageUpdate(pkg)
checkErr(err, "update package") checkErr(err, "update package")
return newPkgMeta return newPkgMeta, err
} }
func pkgSourceGet(c *cli.Context) error { func pkgSourceGet(c *cli.Context) error {
@@ -408,7 +429,8 @@ func pkgRebuild(c *cli.Context) error {
pkg.Metadata.Name, fission.BuildStatusFailed)) pkg.Metadata.Name, fission.BuildStatusFailed))
} }
updatePackage(client, pkg, "", "", "", "", "", true) _, err = updatePackage(client, pkg, "", "", "", "", "", true)
checkErr(err, "update package")
fmt.Printf("Retrying build for pkg %v. Use \"fission pkg info --name %v\" to view status.\n", pkg.Metadata.Name, pkg.Metadata.Name) fmt.Printf("Retrying build for pkg %v. Use \"fission pkg info --name %v\" to view status.\n", pkg.Metadata.Name, pkg.Metadata.Name)