Microservice Manifest

The full manifest of the UCS microservice is below:

type: msapplication
specVersion: 2.0.0
name: ucf.svc.ia-omniverse-renderer-microservice
displayName: Omniverse Renderer Microservice
chartName: ia-omniverse-renderer-microservice
description: Omniverse Renderer Microservice
version: 1.0.1
tags: []
keywords: []
eula: ""
nSpectId: NSPECT-RDWK-7253

publish: false

egress-endpoints:
  - name: stream-output
    description: "Sending video and audio as RTP over UDP stream"
    protocol: UDP
    scheme: none
    mandatory: False
    data-flow: out
  - name: rtp-negot
    description: "RTP over UDP port negotiation for Livestream"
    protocol: TCP
    scheme: grpc
    mandatory: False
    data-flow: in-out
  - name: anim-source
    description: "Animation data input gRPC stream"
    protocol: TCP
    scheme: grpc
    mandatory: False
    data-flow: in

ingress-endpoints:
  - name: http-api
    description: "HTTP API"
    protocol: TCP
    scheme: http
    mandatory: True
    data-flow: in

params:
  debug:
  #> description: General configuration
  #> type: object
    logEnabled: true
    #> description: Enable debug logs.
    #> type: boolean
    logEachReceivedAnimationDataMessage: false
    #> description: Log each animation data message that is received on the grpc stream.
    #> type: boolean
    logFrameInterval: 30
    #> description: Enable debug output of each x-th frame.
    #> type: integer
    showWheel: false
    #> description: Show debug wheel in rendered video stream.
    #> type: boolean
  httpServer:
  #> description: HTTP API server configuration
  #> type: object
    port: 8021
    #> description: The port where the http API server is served.
    #> type: integer
  scene:
  #> description: USD scene asset configuration.
  #> type: object
    filename: "Avatar_Scene.usda"
    #> description: The name of the USD asset (e.g. `Avatar_Scene.usda`). This can be a .usda or a .usd file.
    #> type: string
    sceneValidationMode: "DEFAULT_SCENE_VALIDATION"
    #> description: The scene validation to be performed. Possible values are NO_SCENE_VALIDATION, GENERIC_SCENE_VALIDATION, DEFAULT_SCENE_VALIDATION
    #> type: string
    #> enum_values: NO_SCENE_VALIDATION, GENERIC_SCENE_VALIDATION, DEFAULT_SCENE_VALIDATION
  resourceDownload:
  #> description: Parameters for the resource download init container to specify how and where the USD resources are downloaded.
  #> type: object
    remoteResourcePath: ""
    #> description: The remote resource path with the USD scene assets. Will be provided as "REMOTE_RESOURCE_PATH" env variable to the resource download init container. E.g. for NGC resources looks like "<NGC_ORG>/<NGC_TEAM>/<NGC_RESOURCE_NAME>:<NGC_RESOURCE_VERSION>".
    #> type: string
    secretName: ""
    #> description: Name of the secret, that will be mounted into the resource download init container to provide credentials. E.g. for NGC the "NGC_CLI_API_KEY".
    #> type: string
    image: ""
    #> description: Name of the image for the resource download init container. E.g. "nvcr.io/eevaigoeixww/staging/ngc-resource-downloader:0.0.2"
    #> type: string
    persistentVolumeSize: "5000Mi"
    #> description: The size of the volume required to store the USD scene and all its dependencies.
    #> type: string
  animationSource:
  #> description: GRPC animation source.
  #> type: object
    bufferSize: 0.1
    #> description: The buffer size in seconds to delay rendering.
    #> type: number
  livestream:
  #> description: Kit Livestream related parameters.
  #> type: object
    rtpNegotiationHostMockingEnabled: false
    #> description: Start a mock server to stream to the configured host and ports without RTP negotiation.
    #> type: boolean
    host: "localhost"
    #> description: The host or ip where to directly send the Livestream to.
    #> type: string
    videoPort: 9020
    #> description: The video port where to directly send the Livestream to.
    #> type: integer
    videoBitRate: 32777216
    #> description: The video bit rate in bits per second used for the Livestream RTP video stream.
    #> type: integer
    videoIframeInterval: 30
    #> description: The video iframe interval used for the Livestream RTP video stream.
    #> type: integer
    videoFrameRate: 30
    #> description: The video frame rate in frames per second used for the Livestream RTP video stream.
    #> type: integer
    audioPort: 9021
    #> description: The audio port where to directly send the Livestream to.
    #> type: integer
    audioDelay: 0.0
    #> description: Shifts the audio RTP stream relative to the video RTP stream. Only positive value in seconds are supported. Audio is delayed relative to the video.
    #> type: number
  window:
  #> description: Rendering window parameters.
  #> type: object
    width: 1280
    #> description: The rendered video width.
    #> type: integer
    height: 720
    #> description: The rendered video height.
    #> type: integer
  kit:
  #> description: Omniverse Kit related parameters.
  #> type: object
    settings: ""
    #> description: Additional Kit settings passed at startup (e.g. '--/app/my/setting=42 --/app/my/other/setting=true').
    #> type: string
    printSettings: false
    #> description: Print Kit settings on startup.
    #> type: boolean
  deployment:
  #> description: Kubernetes deployment related parameters.
  #> type: object
    memoryRequest: "1Gi"
    #> description: Resource memory request for container.
    #> type: string
    memoryLimit: "32Gi"
    #> description: Resource memory limit for container.
    #> type: string
    gpuDisableAlloc: false
    #> description: When set to true, the GPU allocation is switched from hardcoded to dynamic.
    #> type: boolean

tests:
  - name: dummy
    app: tests/dev/dummy_test.yaml
    params: tests/dev/params1.yaml
    ciTrigger: true
    timeout: 20
    duration: 6
    installPreReqs: true # Whether to install foundational services
    namespace: default # Kubernetes namespace
    gpuNodeLabels: ""
    watchAllPods: true # OR set to false and set list of pods to watch below
    watchPods:
      - renderer-deployment
    testerPods: # At least one tester pod is required
      - name: renderer-deployment # Name of the test pod
        startSignature: "SETTINGS" # Signature to look for in the logs indicating start of tests. Regex is accepted
        endSignature: "SCENE LOADED" # Signature to look for in the logs indicating end of tests. Regex is accepted
        errorSignatures: # Signatures that indicate test failures.  Regex is accepted
          - "cmkacuoqqqopsvjsdnwertsunfwevosekj3823nfwe8sfduhj3289gr87hn3298bhs87y32ni9uubv8y432bngre8u"

---
spec:
  - name: deployment
    type: ucf.k8s.app.deployment
    parameters:
      apptype: statefull
      statefulSetServiceName: service
      extraSpecs:
        podManagementPolicy: Parallel

  - name: init
    type: ucf.k8s.initcontainer
    parameters:
      image: "(($params.resourceDownload.image))"
      imagePullPolicy: IfNotPresent
      env:
        - name: REMOTE_RESOURCE_PATH
          value: "(($params.resourceDownload.remoteResourcePath))"
        - name: DESTINATION_RESOURCE_PATH
          value: "/home/ace/asset"
      envFrom:
        - secretRef:
            name: "(($params.resourceDownload.secretName))"
      command: ["/bin/bash", "download_resource.sh"]

  - name: ms
    type: ucf.k8s.container
    parameters:
      env:
        - name: IAORMS_DEBUG_LOG_ENABLED
          value: "(($params.debug.logEnabled))"
        - name: IAORMS_DEBUG_LOG_EACH_RECEIVED_ANIMATION_DATA_MESSAGE
          value: "(($params.debug.logEachReceivedAnimationDataMessage))"
        - name: IAORMS_DEBUG_LOG_FRAME_INTERVAL
          value: "(($params.debug.logFrameInterval))"
        - name: IAORMS_DEBUG_SHOW_WHEEL
          value: "(($params.debug.showWheel))"
        - name: IAORMS_HTTP_SERVER_PORT
          value: "(($params.httpServer.port))"
        - name: IAORMS_SCENE_FILENAME
          value: "(($params.scene.filename))"
        - name: IAORMS_SCENE_DIRECTORY
          value: "/home/ace/asset"
        - name: IAORMS_SCENE_VALIDATION_MODE
          value: "(($params.scene.sceneValidationMode))"
        - name: IAORMS_ANIMATION_SOURCE_BUFFER_SIZE
          value: "(($params.animationSource.bufferSize))"
        - name: IAORMS_RTP_NEGOTIATION_HOST_MOCKING_ENABLED
          value: "(($params.livestream.rtpNegotiationHostMockingEnabled))"
        - name: IAORMS_LIVESTREAM_HOST
          value: "(($params.livestream.host))"
        - name: IAORMS_LIVESTREAM_VIDEO_PORT
          value: "(($params.livestream.videoPort))"
        - name: IAORMS_LIVESTREAM_VIDEO_BIT_RATE
          value: "(($params.livestream.videoBitRate))"
        - name: IAORMS_LIVESTREAM_VIDEO_IFRAME_INTERVAL
          value: "(($params.livestream.videoIframeInterval))"
        - name: IAORMS_LIVESTREAM_VIDEO_FRAME_RATE
          value: "(($params.livestream.videoFrameRate))"
        - name: IAORMS_LIVESTREAM_AUDIO_PORT
          value: "(($params.livestream.audioPort))"
        - name: IAORMS_LIVESTREAM_AUDIO_DELAY
          value: "(($params.livestream.audioDelay))"
        - name: IAORMS_WINDOW_WIDTH
          value: "(($params.window.width))"
        - name: IAORMS_WINDOW_HEIGHT
          value: "(($params.window.height))"
        - name: IAORMS_KIT_PRINT_SETTINGS
          value: "(($params.kit.printSettings))"
        - name: IAORMS_ANIMATION_SOURCE_HOST
          value: "$egress.anim-source.address"
        - name: IAORMS_ANIMATION_SOURCE_PORT
          value: "$egress.anim-source.port"
        - name: IAORMS_RTP_NEGOTIATION_HOST
          value: "$egress.rtp-negot.address"
        - name: IAORMS_RTP_NEGOTIATION_PORT
          value: "$egress.rtp-negot.port"
          # https://jirasw.nvidia.com/browse/TOK-2549
        - name: CUDA_DISABLE_CONTROL
          value: "1"
        - name: GPU_DISABLE_ALLOC
          value: "(($params.deployment.gpuDisableAlloc))"
      image:
        repository: nvcr.io/eevaigoeixww/staging/ia-omniverse-renderer-microservice
        tag: 1.0.1
        pullPolicy: IfNotPresent
      command: [
        "bash",
        "/opt/scripts/startup.sh",
        "--/exts/omni.services.transport.server.http/port=$(IAORMS_HTTP_SERVER_PORT)",
        "--/app/printConfig=$(IAORMS_KIT_PRINT_SETTINGS)",
        "--/app/window/width=$(IAORMS_WINDOW_WIDTH)",
        "--/app/window/height=$(IAORMS_WINDOW_HEIGHT)",
        "$params.kit.settings",
      ]
      livenessProbe:
        httpGet:
          path: /liveness
          port: $params.httpServer.port
        initialDelaySeconds: 60
        periodSeconds: 20
        timeoutSeconds: 300
      readinessProbe:
        httpGet:
          path: /readiness
          port: $params.httpServer.port
        initialDelaySeconds: 20
        periodSeconds: 5
        timeoutSeconds: 300
      ports:
        - containerPort: $params.httpServer.port
          protocol: TCP
          name: http-api
      volumeMounts:
        - name: cache-volume
          mountPath: /home/ace/.cache/ov
      resources:
        requests:
          memory: $params.deployment.memoryRequest
        limits:
          memory: $params.deployment.memoryLimit

  - name: restartPolicy
    type: ucf.k8s.restartPolicy
    parameters:
      policy: Always

  - name: podSecurityContext
    type: ucf.k8s.podSecurityContext
    parameters:
      runAsGroup: 1000
      runAsUser: 1000

  - name: service
    type: ucf.k8s.service
    parameters:
      ports:
        - port: $params.httpServer.port
          protocol: TCP
          name: http-api

  - name: assets
    type: ucf.k8s.pvc
    parameters:
      annotations:
        helm.sh/resource-policy: "keep"
      spec:
        storageClassName: mdx-local-path
        accessModes: [ReadWriteOnce]
        resources:
          requests:
            storage: $params.resourceDownload.persistentVolumeSize

  - name: asset-volume
    type: ucf.k8s.volume
    parameters:
      persistentVolumeClaim:
        claimName: ia-omniverse-renderer-microservice-assets

  - name: default-assets-volume
    type: ucf.appspec.defaultVolumeMount
    parameters:
      name: asset-volume
      mountPath: /home/ace/asset
      #externalTrafficPolicy: # Cluster / Local. Allowed when service type is NodePort or LoadBalancer

  - name: cache
    type: ucf.k8s.pvc
    parameters:
      annotations:
        helm.sh/resource-policy: "keep"
      spec:
        storageClassName: mdx-local-path
        accessModes: [ReadWriteOnce]
        resources:
          requests:
            storage: 2Gi

  - name: cache-volume
    type: ucf.k8s.volume
    parameters:
      persistentVolumeClaim:
        claimName: ia-omniverse-renderer-microservice-cache