in submarine-server/server-submitter/submitter-k8s/src/main/java/org/apache/submarine/server/submitter/k8s/parser/NotebookSpecParser.java [69:201]
private static V1PodTemplateSpec parseTemplateSpec(NotebookSpec notebookSpec, String notebookName) {
NotebookPodSpec notebookPodSpec = notebookSpec.getSpec();
V1PodTemplateSpec podTemplateSpec = new V1PodTemplateSpec();
V1PodSpec podSpec = new V1PodSpec();
// Set container
List<V1Container> containers = new ArrayList<>();
V1Container container = new V1Container();
container.setName(notebookName);
// Environment variables
if (notebookPodSpec.getEnvVars() != null) {
container.setEnv(parseEnvVars(notebookPodSpec));
}
// Add submarine server DNS name and port into notebook pod
V1EnvVar submarineServerDNSEnv = new V1EnvVar();
submarineServerDNSEnv.setName("SUBMARINE_SERVER_DNS_NAME");
submarineServerDNSEnv.setValue(System.getenv("SUBMARINE_SERVER_DNS_NAME"));
container.addEnvItem(submarineServerDNSEnv);
V1EnvVar submarineServerPortEnv = new V1EnvVar();
submarineServerPortEnv.setName("SUBMARINE_SERVER_PORT");
submarineServerPortEnv.setValue(System.getenv("SUBMARINE_SERVER_PORT"));
container.addEnvItem(submarineServerPortEnv);
// Environment
if (getEnvironment(notebookSpec) != null && getEnvironment(notebookSpec).getEnvironmentSpec() != null) {
EnvironmentSpec environmentSpec = getEnvironment(notebookSpec).getEnvironmentSpec();
String baseImage = environmentSpec.getDockerImage();
KernelSpec kernel = environmentSpec.getKernelSpec();
container.setImage(baseImage);
String condaVersionValidationCommand = generateCondaVersionValidateCommand();
StringBuffer installCommand = new StringBuffer();
installCommand.append(condaVersionValidationCommand);
// If conda dependencies isn't empty
if (kernel.getCondaDependencies().size() > 0) {
installCommand.append(" && conda install -y");
for (String channel : kernel.getChannels()) {
installCommand.append(" ");
installCommand.append("-c");
installCommand.append(" ");
installCommand.append(channel);
}
for (String dependency : kernel.getCondaDependencies()) {
installCommand.append(" ");
installCommand.append(dependency);
}
}
// If pip dependencies isn't empty
if (kernel.getPipDependencies().size() > 0) {
installCommand.append(" && pip install");
for (String dependency : kernel.getPipDependencies()) {
installCommand.append(" ");
installCommand.append(dependency);
}
}
V1EnvVar installCommandEnv = new V1EnvVar();
installCommandEnv.setName("INSTALL_ENVIRONMENT_COMMAND");
installCommandEnv.setValue(installCommand.toString());
container.addEnvItem(installCommandEnv);
}
// Resources
if (notebookPodSpec.getResources() != null) {
V1ResourceRequirements resources = new V1ResourceRequirements();
resources.setLimits(parseResources(notebookPodSpec));
container.setResources(resources);
}
// Volume spec
List<V1VolumeMount> volumeMountList = new ArrayList<>();
// workspace path
V1VolumeMount workspace = new V1VolumeMount();
workspace.setMountPath(DEFAULT_WORKSPACE_MOUNT_PATH);
workspace.setName("workspace");
volumeMountList.add(workspace);
// user setting path
V1VolumeMount userSetting = new V1VolumeMount();
userSetting.setMountPath(DEFAULT_USER_SET_MOUNT_PATH);
userSetting.setName("user-setting");
volumeMountList.add(userSetting);
// create volume object for persistent volume
List<V1Volume> volumeList = new ArrayList<>();
// workspace
V1Volume workspaceVolume = new V1Volume();
workspaceVolume.setName("workspace");
V1PersistentVolumeClaimVolumeSource workspacePvc = new V1PersistentVolumeClaimVolumeSource();
workspacePvc.setClaimName(String.format("%s-%s", NotebookUtils.PVC_PREFIX, notebookName));
workspaceVolume.setPersistentVolumeClaim(workspacePvc);
volumeList.add(workspaceVolume);
// user setting
V1Volume userVolume = new V1Volume();
userVolume.setName("user-setting");
V1PersistentVolumeClaimVolumeSource userPvc = new V1PersistentVolumeClaimVolumeSource();
userPvc.setClaimName(String.format("%s-user-%s", NotebookUtils.PVC_PREFIX, notebookName));
userVolume.setPersistentVolumeClaim(userPvc);
volumeList.add(userVolume);
// add overwrite.json configmap
String overwriteJson = conf.getString(
SubmarineConfVars.ConfVars.SUBMARINE_NOTEBOOK_DEFAULT_OVERWRITE_JSON);
if (StringUtils.isNotBlank(overwriteJson)) {
// Volume Mount
V1VolumeMount overwriteVm = new V1VolumeMount();
overwriteVm.setMountPath(String.format("%s/%s", DEFAULT_APPLICATION_SETTING_PATH,
NotebookUtils.DEFAULT_OVERWRITE_FILE_NAME));
overwriteVm.setSubPath(NotebookUtils.DEFAULT_OVERWRITE_FILE_NAME);
overwriteVm.setName("overwrite-config");
volumeMountList.add(overwriteVm);
// Volume
V1Volume overwriteVolume = new V1Volume();
overwriteVolume.setName("overwrite-config");
V1ConfigMapVolumeSource overwriteCm = new V1ConfigMapVolumeSource();
overwriteCm.setName(String.format("%s-%s", NotebookUtils.OVERWRITE_PREFIX, notebookName));
overwriteVolume.setConfigMap(overwriteCm);
volumeList.add(overwriteVolume);
}
// add volume mounts and volumes
container.setVolumeMounts(volumeMountList);
containers.add(container);
podSpec.setContainers(containers);
podSpec.setVolumes(volumeList);
podSpec.setTerminationGracePeriodSeconds(120L);
podTemplateSpec.setSpec(podSpec);
return podTemplateSpec;
}