All Downloads are FREE. Search and download functionalities are using the official Maven repository.

pl.touk.nussknacker.k8s.manager.service.ServicePreparer.scala Maven / Gradle / Ivy

package pl.touk.nussknacker.k8s.manager.service

import pl.touk.nussknacker.engine.api.{LiteStreamMetaData, MetaData, ProcessVersion, RequestResponseMetaData}
import pl.touk.nussknacker.k8s.manager.K8sDeploymentManager._
import pl.touk.nussknacker.k8s.manager.K8sDeploymentManagerConfig
import pl.touk.nussknacker.k8s.manager.K8sUtils.sanitizeObjectName
import pl.touk.nussknacker.k8s.manager.RequestResponseSlugUtils.determineSlug
import pl.touk.nussknacker.k8s.manager.service.ServicePreparer.{runtimePodTargetPort, serviceName}
import skuber.Service.Port
import skuber.{ObjectMeta, Service}

class ServicePreparer(config: K8sDeploymentManagerConfig) {

  def prepare(processVersion: ProcessVersion, metaData: MetaData): Option[Service] = {
    metaData.typeSpecificData match {
      case _: LiteStreamMetaData =>
        None
      case rrMetaData: RequestResponseMetaData =>
        Some(prepareRequestResponseService(processVersion, rrMetaData))
      case other =>
        throw new IllegalArgumentException("Not supported scenario meta data type: " + other)
    }
  }

  private def prepareRequestResponseService(
      processVersion: ProcessVersion,
      rrMetaData: RequestResponseMetaData
  ): Service = {
    val objectName = serviceName(
      config.nussknackerInstanceName,
      determineSlug(processVersion.processName, rrMetaData, config.nussknackerInstanceName)
    )
    val annotations = versionAnnotationForScenario(processVersion)
    val labels      = labelsForScenario(processVersion, config.nussknackerInstanceName)
    val selectors = Map(
      // here we use id to avoid sanitization problems
      scenarioIdLabel -> processVersion.processId.value.toString
    ) ++ config.nussknackerInstanceName.map(nussknackerInstanceNameLabel -> _)

    Service(
      metadata = ObjectMeta(name = objectName, labels = labels, annotations = annotations),
      spec = Some(
        Service.Spec(
          selector = selectors,
          ports = List(Port(port = config.servicePort, targetPort = Some(Left(runtimePodTargetPort))))
        )
      )
    )
  }

}

object ServicePreparer {
  // see http.port in runtimes image's application.conf
  val runtimePodTargetPort = 8080

  private[manager] def serviceName(nussknackerInstanceName: Option[String], slug: String): String =
    sanitizeObjectName(serviceNameWithoutSanitization(nussknackerInstanceName, slug))

  private[manager] def serviceNameWithoutSanitization(nussknackerInstanceName: Option[String], slug: String): String =
    objectNamePrefixedWithNussknackerInstanceNameWithoutSanitization(nussknackerInstanceName, slug)

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy