Update Fn: Executor New Deployment (#504)
Enables updating functions of executor type new deployment and switching between executor types for a function.
This commit is contained in:
+39
-33
@@ -63,7 +63,7 @@ func envCreate(c *cli.Context) error {
|
||||
}
|
||||
}
|
||||
|
||||
resourceReq := getResourceReq(c.Int("mincpu"), c.Int("maxcpu"), c.Int("minmemory"), c.Int("maxmemory"))
|
||||
resourceReq := getResourceReq(c)
|
||||
|
||||
// Environment API interface version is not specified and
|
||||
// builder image is empty, set default interface version
|
||||
@@ -210,48 +210,54 @@ func envList(c *cli.Context) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func getResourceReq(mincpu int, maxcpu int, minmem int, maxmem int) v1.ResourceRequirements {
|
||||
func getResourceReq(c *cli.Context) v1.ResourceRequirements {
|
||||
if c.IsSet("mincpu") || c.IsSet("maxcpu") || c.IsSet("minmemory") || c.IsSet("maxmemory") {
|
||||
mincpu := c.Int("mincpu")
|
||||
maxcpu := c.Int("maxcpu")
|
||||
minmem := c.Int("minmemory")
|
||||
maxmem := c.Int("maxmemory")
|
||||
|
||||
requestResources := make(map[v1.ResourceName]resource.Quantity)
|
||||
requestResources := make(map[v1.ResourceName]resource.Quantity)
|
||||
|
||||
if mincpu != 0 {
|
||||
cpuRequest, err := resource.ParseQuantity(strconv.Itoa(mincpu) + "m")
|
||||
if err != nil {
|
||||
fatal("Failed to parse mincpu")
|
||||
if mincpu != 0 {
|
||||
cpuRequest, err := resource.ParseQuantity(strconv.Itoa(mincpu) + "m")
|
||||
if err != nil {
|
||||
fatal("Failed to parse mincpu")
|
||||
}
|
||||
requestResources[v1.ResourceCPU] = cpuRequest
|
||||
}
|
||||
requestResources[v1.ResourceCPU] = cpuRequest
|
||||
}
|
||||
|
||||
if minmem != 0 {
|
||||
memRequest, err := resource.ParseQuantity(strconv.Itoa(minmem) + "Mi")
|
||||
if err != nil {
|
||||
fatal("Failed to parse minmemory")
|
||||
if minmem != 0 {
|
||||
memRequest, err := resource.ParseQuantity(strconv.Itoa(minmem) + "Mi")
|
||||
if err != nil {
|
||||
fatal("Failed to parse minmemory")
|
||||
}
|
||||
requestResources[v1.ResourceMemory] = memRequest
|
||||
}
|
||||
requestResources[v1.ResourceMemory] = memRequest
|
||||
}
|
||||
|
||||
limitResources := make(map[v1.ResourceName]resource.Quantity)
|
||||
limitResources := make(map[v1.ResourceName]resource.Quantity)
|
||||
|
||||
if maxcpu != 0 {
|
||||
cpuLimit, err := resource.ParseQuantity(strconv.Itoa(maxcpu) + "m")
|
||||
if err != nil {
|
||||
fatal("Failed to parse maxcpu")
|
||||
if maxcpu != 0 {
|
||||
cpuLimit, err := resource.ParseQuantity(strconv.Itoa(maxcpu) + "m")
|
||||
if err != nil {
|
||||
fatal("Failed to parse maxcpu")
|
||||
}
|
||||
limitResources[v1.ResourceCPU] = cpuLimit
|
||||
}
|
||||
limitResources[v1.ResourceCPU] = cpuLimit
|
||||
}
|
||||
|
||||
if maxmem != 0 {
|
||||
memLimit, err := resource.ParseQuantity(strconv.Itoa(maxmem) + "Mi")
|
||||
if err != nil {
|
||||
fatal("Failed to parse maxmemory")
|
||||
if maxmem != 0 {
|
||||
memLimit, err := resource.ParseQuantity(strconv.Itoa(maxmem) + "Mi")
|
||||
if err != nil {
|
||||
fatal("Failed to parse maxmemory")
|
||||
}
|
||||
limitResources[v1.ResourceMemory] = memLimit
|
||||
}
|
||||
limitResources[v1.ResourceMemory] = memLimit
|
||||
}
|
||||
|
||||
resources := v1.ResourceRequirements{
|
||||
Requests: requestResources,
|
||||
Limits: limitResources,
|
||||
resources := v1.ResourceRequirements{
|
||||
Requests: requestResources,
|
||||
Limits: limitResources,
|
||||
}
|
||||
return resources
|
||||
}
|
||||
|
||||
return resources
|
||||
return v1.ResourceRequirements{}
|
||||
}
|
||||
|
||||
+64
-13
@@ -101,6 +101,19 @@ func getInvokeStrategy(minScale int, maxScale int, executorType string, targetcp
|
||||
return strategy
|
||||
}
|
||||
|
||||
func getTargetCPU(c *cli.Context) int {
|
||||
var targetCPU int
|
||||
if c.IsSet("targetcpu") {
|
||||
targetCPU = c.Int("targetcpu")
|
||||
if targetCPU <= 0 || targetCPU > 100 {
|
||||
fatal("TargetCPU must be a value between 1 - 100")
|
||||
}
|
||||
} else {
|
||||
targetCPU = 80
|
||||
}
|
||||
return targetCPU
|
||||
}
|
||||
|
||||
func fnCreate(c *cli.Context) error {
|
||||
client := getClient(c.GlobalString("server"))
|
||||
|
||||
@@ -186,21 +199,13 @@ func fnCreate(c *cli.Context) error {
|
||||
pkgMetadata = createPackage(client, envName, srcArchiveName, deployArchiveName, buildcmd, specFile)
|
||||
}
|
||||
|
||||
//TODO Warn user about resources at fn level overriding the env resources
|
||||
resourceReq := getResourceReq(c.Int("mincpu"), c.Int("maxcpu"), c.Int("minmemory"), c.Int("maxmemory"))
|
||||
|
||||
var targetCPU int
|
||||
if c.IsSet("targetcpu") {
|
||||
targetCPU = c.Int("targetcpu")
|
||||
if targetCPU <= 0 || targetCPU > 100 {
|
||||
fatal("TargetCPU must be a value between 1 - 100")
|
||||
}
|
||||
} else {
|
||||
targetCPU = 80
|
||||
invokeStrategy := getInvokeStrategy(c.Int("minscale"), c.Int("maxscale"), c.String("executortype"), getTargetCPU(c))
|
||||
resourceReq := getResourceReq(c)
|
||||
if (c.IsSet("mincpu") || c.IsSet("maxcpu") || c.IsSet("minmemory") || c.IsSet("maxmemory")) &&
|
||||
invokeStrategy.ExecutionStrategy.ExecutorType == fission.ExecutorTypePoolmgr {
|
||||
warn("CPU/Memory specified for function with pool manager executor will be ignored in favor of resources specified at environment")
|
||||
}
|
||||
|
||||
invokeStrategy := getInvokeStrategy(c.Int("minscale"), c.Int("maxscale"), c.String("executortype"), targetCPU)
|
||||
|
||||
var secrets []fission.SecretReference
|
||||
var cfgmaps []fission.ConfigMapReference
|
||||
|
||||
@@ -466,6 +471,52 @@ func fnUpdate(c *cli.Context) error {
|
||||
ResourceVersion: pkgMetadata.ResourceVersion,
|
||||
}
|
||||
|
||||
function.Spec.Resources = getResourceReq(c)
|
||||
|
||||
function.Spec.InvokeStrategy.ExecutionStrategy.TargetCPUPercent = getTargetCPU(c)
|
||||
|
||||
if c.IsSet("minscale") {
|
||||
minscale := c.Int("minscale")
|
||||
maxscale := c.Int("maxscale")
|
||||
if c.IsSet("maxscale") && minscale > c.Int("maxscale") {
|
||||
fatal(fmt.Sprintf("Minscale's value %v can not be greater than maxscale value %v", minscale, maxscale))
|
||||
}
|
||||
if function.Spec.InvokeStrategy.ExecutionStrategy.ExecutorType != fission.ExecutorTypePoolmgr &&
|
||||
minscale > function.Spec.InvokeStrategy.ExecutionStrategy.MaxScale {
|
||||
fatal(fmt.Sprintf("Minscale provided: %v can not be greater than maxscale of existing function: %v", minscale,
|
||||
function.Spec.InvokeStrategy.ExecutionStrategy.MaxScale))
|
||||
}
|
||||
function.Spec.InvokeStrategy.ExecutionStrategy.MinScale = minscale
|
||||
}
|
||||
|
||||
if c.IsSet("maxscale") {
|
||||
maxscale := c.Int("maxscale")
|
||||
if maxscale < function.Spec.InvokeStrategy.ExecutionStrategy.MinScale {
|
||||
fatal(fmt.Sprintf("Function's minscale: %v can not be greater than maxscale provided: %v",
|
||||
function.Spec.InvokeStrategy.ExecutionStrategy.MinScale, maxscale))
|
||||
}
|
||||
function.Spec.InvokeStrategy.ExecutionStrategy.MaxScale = maxscale
|
||||
}
|
||||
|
||||
if c.String("executortype") != "" {
|
||||
var fnExecutor fission.ExecutorType
|
||||
switch c.String("executortype") {
|
||||
case "":
|
||||
fnExecutor = fission.ExecutorTypePoolmgr
|
||||
case fission.ExecutorTypePoolmgr:
|
||||
fnExecutor = fission.ExecutorTypePoolmgr
|
||||
case fission.ExecutorTypeNewdeploy:
|
||||
fnExecutor = fission.ExecutorTypeNewdeploy
|
||||
default:
|
||||
fatal("Executor type must be one of 'poolmgr' or 'newdeploy', defaults to 'poolmgr'")
|
||||
}
|
||||
if c.IsSet("mincpu") || c.IsSet("maxcpu") || c.IsSet("minmemory") || c.IsSet("maxmemory") &&
|
||||
fnExecutor == fission.ExecutorTypePoolmgr {
|
||||
warn("CPU/Memory specified for function with pool manager executor will be ignored in favor of resources specified at environment")
|
||||
}
|
||||
function.Spec.InvokeStrategy.ExecutionStrategy.ExecutorType = fnExecutor
|
||||
}
|
||||
|
||||
_, err = client.FunctionUpdate(function)
|
||||
checkErr(err, "update function")
|
||||
|
||||
|
||||
+2
-2
@@ -57,7 +57,7 @@ func main() {
|
||||
maxCpu := cli.StringFlag{Name: "maxcpu", Usage: "Maximum CPU to be assigned to pod (In millicore, minimum 1)"}
|
||||
minMem := cli.StringFlag{Name: "minmemory", Usage: "Minimum memory to be assigned to pod (In megabyte)"}
|
||||
maxMem := cli.StringFlag{Name: "maxmemory", Usage: "Maximum memory to be assigned to pod (In megabyte)"}
|
||||
minScale := cli.StringFlag{Name: "minscale", Usage: "Minmum number of pods (Uses resource inputs to configure HPA)"}
|
||||
minScale := cli.StringFlag{Name: "minscale", Usage: "Minimum number of pods (Uses resource inputs to configure HPA)"}
|
||||
maxScale := cli.StringFlag{Name: "maxscale", Usage: "Maximum number of pods (Uses resource inputs to configure HPA)"}
|
||||
targetcpu := cli.StringFlag{Name: "targetcpu", Usage: "Target average CPU across pods for scaling (In percentage, defaults to 80)"}
|
||||
|
||||
@@ -90,7 +90,7 @@ func main() {
|
||||
{Name: "create", Usage: "Create new function (and optionally, an HTTP route to it)", Flags: []cli.Flag{fnNameFlag, fnEnvNameFlag, fnSpecSaveFlag, fnCodeFlag, fnPackageFlag, fnSrcArchiveFlag, fnDeployArchiveFlag, fnEntryPointFlag, fnBuildCmdFlag, fnPkgNameFlag, htUrlFlag, htMethodFlag, minCpu, maxCpu, minMem, maxMem, minScale, maxScale, fnExecutorTypeFlag, targetcpu, fnCfgMapFlag, fnSecretFlag, fnSecretnsFlag, fnCfgMapnsFlag}, Action: fnCreate},
|
||||
{Name: "get", Usage: "Get function source code", Flags: []cli.Flag{fnNameFlag}, Action: fnGet},
|
||||
{Name: "getmeta", Usage: "Get function metadata", Flags: []cli.Flag{fnNameFlag}, Action: fnGetMeta},
|
||||
{Name: "update", Usage: "Update function source code", Flags: []cli.Flag{fnNameFlag, fnEnvNameFlag, fnCodeFlag, fnPackageFlag, fnSrcArchiveFlag, fnDeployArchiveFlag, fnEntryPointFlag, fnPkgNameFlag, fnBuildCmdFlag, fnForceFlag, minCpu, maxCpu, minMem, maxMem, minScale, maxScale, fnExecutorTypeFlag, targetcpu, fnCfgMapFlag, fnSecretFlag, fnSecretnsFlag, fnCfgMapnsFlag}, Action: fnUpdate},
|
||||
{Name: "update", Usage: "Update function source code", Flags: []cli.Flag{fnNameFlag, fnEnvNameFlag, fnCodeFlag, fnPackageFlag, fnSrcArchiveFlag, fnDeployArchiveFlag, fnEntryPointFlag, fnPkgNameFlag, fnBuildCmdFlag, fnForceFlag, minCpu, maxCpu, minMem, maxMem, minScale, maxScale, fnExecutorTypeFlag, targetcpu}, Action: fnUpdate},
|
||||
{Name: "delete", Usage: "Delete function", Flags: []cli.Flag{fnNameFlag}, Action: fnDelete},
|
||||
{Name: "list", Usage: "List all functions", Flags: []cli.Flag{}, Action: fnList},
|
||||
{Name: "logs", Usage: "Display function logs", Flags: []cli.Flag{fnNameFlag, fnPodFlag, fnFollowFlag, fnDetailFlag, fnLogDBTypeFlag, fnLogCountFlag}, Action: fnLogs},
|
||||
|
||||
Reference in New Issue
Block a user