Enabling multi-tenancy for fission objects. (#655)
This feature allows creation of fission objects in different namespaces, in addition to retaining the existing behavior of creating fission objects in default namespace if user doesnt provide one. It also removes cluster admin roles for fission-fetcher and fission-builder Service Accounts and grants them only those privileges that they need.
This commit is contained in:
+32
-23
@@ -33,8 +33,8 @@ import (
|
||||
"github.com/fission/fission/crd"
|
||||
)
|
||||
|
||||
func getFunctionsByPackage(client *client.Client, pkgName string) ([]crd.Function, error) {
|
||||
fnList, err := client.FunctionList()
|
||||
func getFunctionsByPackage(client *client.Client, pkgName, pkgNamespace string) ([]crd.Function, error) {
|
||||
fnList, err := client.FunctionList(pkgNamespace)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -65,11 +65,12 @@ func downloadStoragesvcURL(client *client.Client, fileUrl string) io.ReadCloser
|
||||
func pkgCreate(c *cli.Context) error {
|
||||
client := getClient(c.GlobalString("server"))
|
||||
|
||||
pkgNamespace := c.String("pkgNamespace")
|
||||
envName := c.String("env")
|
||||
if len(envName) == 0 {
|
||||
fatal("Need --env argument.")
|
||||
}
|
||||
|
||||
envNamespace := c.String("envNamespace")
|
||||
srcArchiveName := c.String("src")
|
||||
deployArchiveName := c.String("deploy")
|
||||
buildcmd := c.String("buildcmd")
|
||||
@@ -78,7 +79,7 @@ func pkgCreate(c *cli.Context) error {
|
||||
fatal("Need --src to specify source archive, or use --deploy to specify deployment archive.")
|
||||
}
|
||||
|
||||
meta := createPackage(client, envName, srcArchiveName, deployArchiveName, buildcmd, "")
|
||||
meta := createPackage(client, pkgNamespace, envName, envNamespace, srcArchiveName, deployArchiveName, buildcmd, "")
|
||||
fmt.Printf("Package '%v' created\n", meta.GetName())
|
||||
|
||||
return nil
|
||||
@@ -91,9 +92,11 @@ func pkgUpdate(c *cli.Context) error {
|
||||
if len(pkgName) == 0 {
|
||||
fatal("Need --name argument.")
|
||||
}
|
||||
pkgNamespace := c.String("pkgNamespace")
|
||||
|
||||
force := c.Bool("f")
|
||||
envName := c.String("env")
|
||||
envNamespace := c.String("envNamespace")
|
||||
srcArchiveName := c.String("src")
|
||||
deployArchiveName := c.String("deploy")
|
||||
buildcmd := c.String("buildcmd")
|
||||
@@ -108,12 +111,12 @@ func pkgUpdate(c *cli.Context) error {
|
||||
}
|
||||
|
||||
pkg, err := client.PackageGet(&metav1.ObjectMeta{
|
||||
Namespace: metav1.NamespaceDefault,
|
||||
Namespace: pkgNamespace,
|
||||
Name: pkgName,
|
||||
})
|
||||
checkErr(err, "get package")
|
||||
|
||||
fnList, err := getFunctionsByPackage(client, pkg.Metadata.Name)
|
||||
fnList, err := getFunctionsByPackage(client, pkg.Metadata.Name, pkg.Metadata.Namespace)
|
||||
checkErr(err, "get function list")
|
||||
|
||||
if !force && len(fnList) > 1 {
|
||||
@@ -121,7 +124,7 @@ func pkgUpdate(c *cli.Context) error {
|
||||
}
|
||||
|
||||
newPkgMeta := updatePackage(client, pkg,
|
||||
envName, srcArchiveName, deployArchiveName, buildcmd)
|
||||
envName, envNamespace, srcArchiveName, deployArchiveName, buildcmd)
|
||||
|
||||
// update resource version of package reference of functions that shared the same package
|
||||
for _, fn := range fnList {
|
||||
@@ -135,7 +138,7 @@ func pkgUpdate(c *cli.Context) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func updatePackage(client *client.Client, pkg *crd.Package, envName,
|
||||
func updatePackage(client *client.Client, pkg *crd.Package, envName, envNamespace,
|
||||
srcArchiveName, deployArchiveName, buildcmd string) *metav1.ObjectMeta {
|
||||
|
||||
var srcArchiveMetadata, deployArchiveMetadata *fission.Archive
|
||||
@@ -143,6 +146,7 @@ func updatePackage(client *client.Client, pkg *crd.Package, envName,
|
||||
|
||||
if len(envName) > 0 {
|
||||
pkg.Spec.Environment.Name = envName
|
||||
pkg.Spec.Environment.Namespace = envNamespace
|
||||
needToBuild = true
|
||||
}
|
||||
|
||||
@@ -183,11 +187,12 @@ func pkgSourceGet(c *cli.Context) error {
|
||||
if len(pkgName) == 0 {
|
||||
fatal("Need name of package, use --name")
|
||||
}
|
||||
pkgNamespace := c.String("pkgNamespace")
|
||||
|
||||
output := c.String("output")
|
||||
|
||||
pkg, err := client.PackageGet(&metav1.ObjectMeta{
|
||||
Namespace: metav1.NamespaceDefault,
|
||||
Namespace: pkgNamespace,
|
||||
Name: pkgName,
|
||||
})
|
||||
if err != nil {
|
||||
@@ -219,11 +224,12 @@ func pkgDeployGet(c *cli.Context) error {
|
||||
if len(pkgName) == 0 {
|
||||
fatal("Need name of package, use --name")
|
||||
}
|
||||
pkgNamespace := c.String("pkgNamespace")
|
||||
|
||||
output := c.String("output")
|
||||
|
||||
pkg, err := client.PackageGet(&metav1.ObjectMeta{
|
||||
Namespace: metav1.NamespaceDefault,
|
||||
Namespace: pkgNamespace,
|
||||
Name: pkgName,
|
||||
})
|
||||
if err != nil {
|
||||
@@ -255,9 +261,10 @@ func pkgInfo(c *cli.Context) error {
|
||||
if len(pkgName) == 0 {
|
||||
fatal("Need name of package, use --name")
|
||||
}
|
||||
pkgNamespace := c.String("pkgNamespace")
|
||||
|
||||
pkg, err := client.PackageGet(&metav1.ObjectMeta{
|
||||
Namespace: metav1.NamespaceDefault,
|
||||
Namespace: pkgNamespace,
|
||||
Name: pkgName,
|
||||
})
|
||||
if err != nil {
|
||||
@@ -278,8 +285,9 @@ func pkgList(c *cli.Context) error {
|
||||
client := getClient(c.GlobalString("server"))
|
||||
// option for the user to list all orphan packages (not referenced by any function)
|
||||
listOrphans := c.Bool("orphan")
|
||||
pkgNamespace := c.String("pkgNamespace")
|
||||
|
||||
pkgList, err := client.PackageList()
|
||||
pkgList, err := client.PackageList(pkgNamespace)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
@@ -288,7 +296,7 @@ func pkgList(c *cli.Context) error {
|
||||
fmt.Fprintf(w, "%v\t%v\t%v\n", "NAME", "BUILD_STATUS", "ENV")
|
||||
if listOrphans {
|
||||
for _, pkg := range pkgList {
|
||||
fnList, err := getFunctionsByPackage(client, pkg.Metadata.Name)
|
||||
fnList, err := getFunctionsByPackage(client, pkg.Metadata.Name, pkg.Metadata.Namespace)
|
||||
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)
|
||||
@@ -306,18 +314,18 @@ func pkgList(c *cli.Context) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func deleteOrphanPkgs(client *client.Client) error {
|
||||
pkgList, err := client.PackageList()
|
||||
func deleteOrphanPkgs(client *client.Client, pkgNamespace string) error {
|
||||
pkgList, err := client.PackageList(pkgNamespace)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
// range through all packages and find out the ones not referenced by any function
|
||||
for _, pkg := range pkgList {
|
||||
fnList, err := getFunctionsByPackage(client, pkg.Metadata.Name)
|
||||
fnList, err := getFunctionsByPackage(client, pkg.Metadata.Name, pkgNamespace)
|
||||
checkErr(err, fmt.Sprintf("get functions sharing package %s", pkg.Metadata.Name))
|
||||
if len(fnList) == 0 {
|
||||
err = deletePackage(client, pkg.Metadata.Name)
|
||||
err = deletePackage(client, pkg.Metadata.Name, pkgNamespace)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
@@ -326,9 +334,9 @@ func deleteOrphanPkgs(client *client.Client) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func deletePackage(client *client.Client, pkgName string) error {
|
||||
func deletePackage(client *client.Client, pkgName string, pkgNamespace string) error {
|
||||
return client.PackageDelete(&metav1.ObjectMeta{
|
||||
Namespace: metav1.NamespaceDefault,
|
||||
Namespace: pkgNamespace,
|
||||
Name: pkgName,
|
||||
})
|
||||
}
|
||||
@@ -337,6 +345,7 @@ func pkgDelete(c *cli.Context) error {
|
||||
client := getClient(c.GlobalString("server"))
|
||||
|
||||
pkgName := c.String("name")
|
||||
pkgNamespace := c.String("pkgNamespace")
|
||||
deleteOrphans := c.Bool("orphan")
|
||||
|
||||
if len(pkgName) == 0 && !deleteOrphans {
|
||||
@@ -352,25 +361,25 @@ func pkgDelete(c *cli.Context) error {
|
||||
force := c.Bool("f")
|
||||
|
||||
_, err := client.PackageGet(&metav1.ObjectMeta{
|
||||
Namespace: metav1.NamespaceDefault,
|
||||
Namespace: pkgNamespace,
|
||||
Name: pkgName,
|
||||
})
|
||||
checkErr(err, "find package")
|
||||
|
||||
fnList, err := getFunctionsByPackage(client, pkgName)
|
||||
fnList, err := getFunctionsByPackage(client, pkgName, pkgNamespace)
|
||||
|
||||
if !force && len(fnList) > 0 {
|
||||
fatal("Package is used by at least one function, use -f to force delete")
|
||||
}
|
||||
|
||||
err = deletePackage(client, pkgName)
|
||||
err = deletePackage(client, pkgName, pkgNamespace)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
fmt.Printf("Package '%v' deleted\n", pkgName)
|
||||
} else {
|
||||
err := deleteOrphanPkgs(client)
|
||||
err := deleteOrphanPkgs(client, pkgNamespace)
|
||||
checkErr(err, "error deleting orphan packages")
|
||||
fmt.Println("Orphan packages deleted")
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user