private static V1PodTemplateSpec parseTemplateSpec()

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