-
Notifications
You must be signed in to change notification settings - Fork 594
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
Add support for volume mounts #4673
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -13,6 +13,8 @@ import ( | |
"github.com/pkg/errors" | ||
) | ||
|
||
const SupportedVolumeName = "volume" | ||
|
||
// StepData defines the metadata for a step, like step descriptions, parameters, ... | ||
type StepData struct { | ||
Metadata StepMetadata `json:"metadata"` | ||
|
@@ -105,25 +107,25 @@ type StepOutputs struct { | |
// Container defines an execution container | ||
type Container struct { | ||
//ToDo: check dockerOptions, dockerVolumeBind, containerPortMappings, sidecarOptions, sidecarVolumeBind | ||
Command []string `json:"command"` | ||
EnvVars []EnvVar `json:"env"` | ||
Image string `json:"image"` | ||
ImagePullPolicy string `json:"imagePullPolicy"` | ||
Name string `json:"name"` | ||
ReadyCommand string `json:"readyCommand"` | ||
Shell string `json:"shell"` | ||
WorkingDir string `json:"workingDir"` | ||
Conditions []Condition `json:"conditions,omitempty"` | ||
Options []Option `json:"options,omitempty"` | ||
//VolumeMounts []VolumeMount `json:"volumeMounts,omitempty"` | ||
Command []string `json:"command"` | ||
EnvVars []EnvVar `json:"env"` | ||
Image string `json:"image"` | ||
ImagePullPolicy string `json:"imagePullPolicy"` | ||
Name string `json:"name"` | ||
ReadyCommand string `json:"readyCommand"` | ||
Shell string `json:"shell"` | ||
WorkingDir string `json:"workingDir"` | ||
Conditions []Condition `json:"conditions,omitempty"` | ||
Options []Option `json:"options,omitempty"` | ||
VolumeMounts []VolumeMount `json:"volumeMounts,omitempty"` | ||
} | ||
|
||
// ToDo: Add the missing Volumes part to enable the volume mount completely | ||
// VolumeMount defines a mount path | ||
// type VolumeMount struct { | ||
// MountPath string `json:"mountPath"` | ||
// Name string `json:"name"` | ||
//} | ||
type VolumeMount struct { | ||
Name string `json:"name"` | ||
MountPath string `json:"mountPath"` | ||
} | ||
|
||
// Option defines an docker option | ||
type Option struct { | ||
|
@@ -385,7 +387,7 @@ func (container *Container) commonConfiguration(keyPrefix string, config *map[st | |
} | ||
putStringIfNotEmpty(*config, keyPrefix+"Workspace", container.WorkingDir) | ||
putSliceIfNotEmpty(*config, keyPrefix+"Options", OptionsAsStringSlice(container.Options)) | ||
//putSliceIfNotEmpty(*config, keyPrefix+"VolumeBind", volumeMountsAsStringSlice(container.VolumeMounts)) | ||
putSliceIfNotEmpty(*config, keyPrefix+"VolumeBind", volumeMountsAsStringSlice(container.VolumeMounts)) | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Can't we put it into the |
||
|
||
} | ||
|
||
|
@@ -518,11 +520,14 @@ func ResolveMetadata(gitHubTokens map[string]string, metaDataResolver func() map | |
return metadata, nil | ||
} | ||
|
||
//ToDo: Enable this when the Volumes part is also implemented | ||
//func volumeMountsAsStringSlice(volumeMounts []VolumeMount) []string { | ||
// e := []string{} | ||
// for _, v := range volumeMounts { | ||
// e = append(e, fmt.Sprintf("%v:%v", v.Name, v.MountPath)) | ||
// } | ||
// return e | ||
//} | ||
func volumeMountsAsStringSlice(volumeMounts []VolumeMount) []string { | ||
c0d1ngm0nk3y marked this conversation as resolved.
Show resolved
Hide resolved
|
||
e := []string{} | ||
for _, v := range volumeMounts { | ||
if v.Name != SupportedVolumeName { | ||
log.Entry().Warningf("Unsupported volume name: %q, only %q is supported", v.Name, SupportedVolumeName) | ||
continue | ||
} | ||
e = append(e, fmt.Sprintf("%v:%v", v.Name, v.MountPath)) | ||
} | ||
return e | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -183,6 +183,7 @@ void call(Map parameters = [:], body) { | |
} | ||
|
||
def securityContext = securityContextFromOptions(config.dockerOptions) | ||
def containerMountPath = containerMountPathFromVolumeBind(config.dockerVolumeBind) | ||
if (env.POD_NAME && isContainerDefined(config)) { | ||
container(getContainerDefined(config)) { | ||
withEnv(dockerEnvVars) { | ||
|
@@ -208,6 +209,7 @@ void call(Map parameters = [:], body) { | |
stashContent: config.stashContent, | ||
stashNoDefaultExcludes: config.stashNoDefaultExcludes, | ||
securityContext: securityContext, | ||
containerMountPath: containerMountPath, | ||
] | ||
|
||
if (config.sidecarImage) { | ||
|
@@ -379,6 +381,17 @@ def securityContextFromOptions(dockerOptions) { | |
return securityContext | ||
} | ||
|
||
/* | ||
* Picks the first volumeBind option and translates it into containerMountPath, currently only one fix volume is supported | ||
*/ | ||
@NonCPS | ||
def containerMountPathFromVolumeBind(dockerVolumeBind) { | ||
if (dockerVolumeBind) { | ||
return dockerVolumeBind[0].split(":")[1] | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Are you sure all customers will use There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Also why only the first volume get's translated? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
It is There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Do you mean this? This ist actually a There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. As part of the JaaS setup within SAP, we do not permit the use of hostPath volumes. This practice aligns with security best practices, especially in a shared cluster environment. The proposed change would have an impact on our internal customers There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. @basava12345 , @c0d1ngm0nk3y , the code only talks about the volume mounts in the main app container running in the pod and this functionality is unchanged, if i understand correctly the change can allow any path to be mounted in the side care container ?. Since the environment is shared does that allow me to bring a path from any other project into my running pod with the side car container or is it a named volume that already exists which i want to mount at a specefic path in my container ? if its an already existing volume who creates it ? maybe i missing something here and so want to be sure, There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Yes, the path in the container can be anything, but that is only the path within the container. WHAT to mount is hardcoded (here: "volume").
I don't se how...
Yes. In case of Kubernetes, it is a
Hopefully, the orchestrator specific code. Or
I am not 100% sure that we are talking about the same thing, similar to this comment. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I think, I now got your point. On Kubernetes, it is clear that an empty dir is mounted. But we will check what happens for ADO and GHA. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. i think it will confusing for users with the current paramter. if someone called we have a clean parameter in
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. To summarise the meeting we had: We will stick to |
||
} | ||
return "" | ||
} | ||
|
||
boolean isContainerDefined(config) { | ||
Map containerMap = ContainerMap.instance.getMap() | ||
|
||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Maybe we should not go for "VolumeMounts []VolumeMounts", but for "MountPath string". That is what we do for kubernetes anyway (ignoring the name and take the first one). So the docker arguments would be in synch. The user could configure the
mountPath
of an empty and shared volume. WDYT?There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Well, maybe it DOES make sense to keep the API generic to be able to easily extend the capabilities later.