Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Added support for resources request in staging jobs #2384

Merged
merged 2 commits into from
Jun 19, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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 @@
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 @@
}

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 @@
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 @@
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 @@
},
}

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)
}

Check warning on line 638 in internal/api/v1/application/stage.go

View check run for this annotation

Codecov / codecov/patch

internal/api/v1/application/stage.go#L625-L638

Added lines #L625 - L638 were not covered by tests

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

Check warning on line 640 in internal/api/v1/application/stage.go

View check run for this annotation

Codecov / codecov/patch

internal/api/v1/application/stage.go#L640

Added line #L640 was not covered by tests
}

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 @@
"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 @@
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 @@
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")
}

Check warning on line 163 in internal/cli/server.go

View check run for this annotation

Codecov / codecov/patch

internal/cli/server.go#L160-L163

Added lines #L160 - L163 were not covered by tests
}
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")
}

Check warning on line 170 in internal/cli/server.go

View check run for this annotation

Codecov / codecov/patch

internal/cli/server.go#L167-L170

Added lines #L167 - L170 were not covered by tests
}

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