Skip to content

Commit

Permalink
Support resource requests for staging jobs (#2384)
Browse files Browse the repository at this point in the history
* feat: take and handle resource requests for staging jobs.

* import chart work on resource requests
  • Loading branch information
andreas-kupries committed Jun 19, 2023
1 parent f24bc22 commit 957319b
Show file tree
Hide file tree
Showing 3 changed files with 65 additions and 3 deletions.
2 changes: 1 addition & 1 deletion helm-charts
35 changes: 33 additions & 2 deletions internal/api/v1/application/stage.go
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,8 @@ type stageParam struct {
DownloadImage string
UnpackImage string
ServiceAccountName string
CPURequest string
MemoryRequest string
Environment models.EnvVariableList
Owner metav1.OwnerReference
RegistryURL string
Expand Down Expand Up @@ -220,13 +222,17 @@ func Stage(c *gin.Context) apierror.APIErrors {
}

serviceAccountName := viper.GetString("staging-service-account-name")
cpuRequest := viper.GetString("staging-resource-cpu")
memoryRequest := viper.GetString("staging-resource-memory")

params := stageParam{
AppRef: req.App,
BuilderImage: builderImage,
DownloadImage: downloadImage,
UnpackImage: unpackImage,
ServiceAccountName: serviceAccountName,
CPURequest: cpuRequest,
MemoryRequest: memoryRequest,
BlobUID: blobUID,
Environment: environment.List(),
Owner: owner,
Expand Down Expand Up @@ -365,7 +371,6 @@ func newJobRun(app stageParam) (*batchv1.Job, *corev1.Secret) {
previous.Stage = models.NewStage(app.PreviousStageID)

// TODO: Simplify env setup -- https://github.com/epinio/epinio/issues/1176

// Note: `source` is required because the mounted files are not executable.

// runtime: AWSCLIImage
Expand All @@ -385,7 +390,6 @@ func newJobRun(app stageParam) (*batchv1.Job, *corev1.Secret) {
protocol = "https"
}
stageEnv = appendEnvVar(stageEnv, "PROTOCOL", protocol)

stageEnv = appendEnvVar(stageEnv, "ENDPOINT", app.S3ConnectionDetails.Endpoint)
stageEnv = appendEnvVar(stageEnv, "BUCKET", app.S3ConnectionDetails.Bucket)
stageEnv = appendEnvVar(stageEnv, "BLOBID", app.BlobUID)
Expand Down Expand Up @@ -606,9 +610,36 @@ func newJobRun(app stageParam) (*batchv1.Job, *corev1.Secret) {
},
}

addResourceRequests(job, app)
return job, jobenv
}

func addResourceRequests(job *batchv1.Job, app stageParam) {
cpu := app.CPURequest
memory := app.MemoryRequest

if cpu == "" && memory == "" {
return
}

rr := corev1.ResourceRequirements{
Requests: corev1.ResourceList{},
}

// NOTE: Using `MustParse` is ok here, despite panicking on bad values. The server startup
// code (See internal.cli/server.go, CmdServer.RunE) already verified that any non-empty
// values are valid. Invalid values cause the server to not start.

if cpu != "" {
rr.Requests[corev1.ResourceCPU] = resource.MustParse(cpu)
}
if memory != "" {
rr.Requests[corev1.ResourceMemory] = resource.MustParse(memory)
}

job.Spec.Template.Spec.Containers[0].Resources = rr
}

func getRegistryURL(ctx context.Context, cluster *kubernetes.Cluster) (string, error) {
cd, err := registry.GetConnectionDetails(ctx, cluster, helmchart.Namespace(), registry.CredentialsSecretName)
if err != nil {
Expand Down
31 changes: 31 additions & 0 deletions internal/cli/server.go
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,8 @@ import (
"github.com/epinio/epinio/internal/upgraderesponder"
"github.com/epinio/epinio/internal/version"
"github.com/gin-gonic/gin"

"k8s.io/apimachinery/pkg/api/resource"
"k8s.io/client-go/rest"

"github.com/pkg/errors"
Expand Down Expand Up @@ -106,6 +108,18 @@ func init() {
err = viper.BindEnv("staging-service-account-name", "STAGING_SERVICE_ACCOUNT_NAME")
checkErr(err)

flags.String("staging-resource-cpu", "", "(STAGING_RESOURCE_CPU)")
err = viper.BindPFlag("staging-resource-cpu", flags.Lookup("staging-resource-cpu"))
checkErr(err)
err = viper.BindEnv("staging-resource-cpu", "STAGING_RESOURCE_CPU")
checkErr(err)

flags.String("staging-resource-memory", "", "(STAGING_RESOURCE_MEMORY)")
err = viper.BindPFlag("staging-resource-memory", flags.Lookup("staging-resource-memory"))
checkErr(err)
err = viper.BindEnv("staging-resource-memory", "STAGING_RESOURCE_MEMORY")
checkErr(err)

flags.String("upgrade-responder-address", upgraderesponder.UpgradeResponderAddress, "(UPGRADE_RESPONDER_ADDRESS) Disable tracking of the running Epinio and Kubernetes versions")
err = viper.BindPFlag("upgrade-responder-address", flags.Lookup("upgrade-responder-address"))
checkErr(err)
Expand Down Expand Up @@ -139,6 +153,23 @@ var CmdServer = &cobra.Command{
cmd.SilenceUsage = true
logger := tracelog.NewLogger().WithName("EpinioServer")

// Validate resource requests for staging job here, on server startup, to reject bad values immediately.

cpuRequest := viper.GetString("staging-resource-cpu")
if cpuRequest != "" {
_, err := resource.ParseQuantity(cpuRequest)
if err != nil {
return errors.Wrap(err, "bad cpu request for staging job")
}
}
memoryRequest := viper.GetString("staging-resource-memory")
if memoryRequest != "" {
_, err := resource.ParseQuantity(memoryRequest)
if err != nil {
return errors.Wrap(err, "bad memory request for staging job")
}
}

handler, err := server.NewHandler(logger)
if err != nil {
return errors.Wrap(err, "error creating handler")
Expand Down

0 comments on commit 957319b

Please sign in to comment.