Microservice Manifest

The full manifest of the UCS microservice is below:

type: msapplication
specVersion: 2.0.0
name: ucf.svc.ia-animation-graph-microservice
displayName: "Animation Graph Microservice"
chartName: ia-animation-graph-microservice
description: "Animation Graph Microservice"
version: 1.0.1
tags: []
keywords: []
eula: ""
nSpectId: NSPECT-RDWK-7253

publish: false

egress-endpoints: []

ingress-endpoints:
  - name: anim-server
    description: "Animation data gRPC server"
    protocol: TCP
    scheme: grpc
    mandatory: True
    data-flow: in-out
  - name: http-api
    description: "HTTP API"
    protocol: TCP
    scheme: http
    mandatory: True
    data-flow: in

params:
  debug:
  #> description: Debug 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
    logEachSentAnimationDataMessage: false
    #> description: Log each animation data message that is sent on the grpc stream.
    #> type: boolean
    logFrameInterval: 30
    #> description: Enable debug output of each x-th frame.
    #> type: integer
  httpServer:
  #> description: HTTP API server configuration
  #> type: object
    port: 8020
    #> description: The port where the http API server is served.
    #> type: integer
  animationServer:
  #> description: GRPC server for pulling and pushing animation data
  #> type: object
    port: 51000
    #> description: The port where the animation data server is served.
    #> type: integer
    maxStreamCapacity: 3
    #> description: The max number of parallel streams, that are supported for each instance of the microservice.
    #> type: integer
  animationSource:
  #> description: GRPC animation source
  #> type: object
    bufferSize: 0.1
    #> type: number
    #> description: The buffer size of animation data input stream in seconds.
  animationOutput:
  #> description: GRPC animation output
  #> type: object
    frameRate: 30.0
    #> description: The frames per second rate at which the data is sampled and streamed.
    #> type: number
  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
  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
  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: "4Gi"
    #> 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: 8
    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: []
    testerPods: # At least one tester pod is required
      - name: animation-graph-deployment # Name of the test pod
        startSignature: "SETTINGS" # Signature to look for in the logs indicating start of tests. Regex is accepted
        endSignature: "Animation graph microservice readiness probe: OK" # Signature to look for in the logs indicating end of tests. Regex is accepted
        errorSignatures: # Signatures that indicate test failures.  Regex is accepted
          - "UCF_MS_VALIDATION_RESULT: Fail"

---
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: IAAGMS_HTTP_SERVER_PORT
          value: "(($params.httpServer.port))"
        - name: IAAGMS_KIT_PRINT_SETTINGS
          value: "(($params.kit.printSettings))"
        - name: IAAGMS_ANIMATION_SERVER_PORT
          value: "(($params.animationServer.port))"
        - name: IAAGMS_ANIMATION_SERVER_MAX_STREAM_CAPACITY
          value: "(($params.animationServer.maxStreamCapacity))"
        - name: IAAGMS_ANIMATION_SOURCE_BUFFER_SIZE
          value: "(($params.animationSource.bufferSize))"
        - name: IAAGMS_ANIMATION_OUTPUT_FRAME_RATE
          value: "(($params.animationOutput.frameRate))"
        - name: IAAGMS_DEBUG_LOG_ENABLED
          value: "(($params.debug.logEnabled))"
        - name: IAAGMS_DEBUG_LOG_EACH_RECEIVED_ANIMATION_DATA_MESSAGE
          value: "(($params.debug.logEachReceivedAnimationDataMessage))"
        - name: IAAGMS_DEBUG_LOG_EACH_SENT_ANIMATION_DATA_MESSAGE
          value: "(($params.debug.logEachSentAnimationDataMessage))"
        - name: IAAGMS_DEBUG_LOG_FRAME_INTERVAL
          value: "(($params.debug.logFrameInterval))"
        - name: IAAGMS_SCENE_DIRECTORY
          value: "/home/ace/asset"
        - name: IAAGMS_SCENE_FILENAME
          value: "(($params.scene.filename))"
          # 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-animation-graph-microservice
        tag: 1.0.1
        pullPolicy: IfNotPresent
      command: [
        "bash",
        "/opt/scripts/startup.sh",
        "--/app/printConfig=$(IAAGMS_KIT_PRINT_SETTINGS)",
        "--/exts/omni.services.transport.server.http/port=$(IAAGMS_HTTP_SERVER_PORT)",
        "$params.kit.settings",
      ]
      livenessProbe:
        httpGet:
          path: /liveness
          port: $params.httpServer.port
        initialDelaySeconds: 20
        periodSeconds: 5
        timeoutSeconds: 300
      readinessProbe:
        httpGet:
          path: /readiness
          port: $params.httpServer.port
        initialDelaySeconds: 20
        periodSeconds: 5
        timeoutSeconds: 300
      ports:
        - containerPort: $params.animationServer.port
          name: anim-server
          protocol: TCP
        - containerPort: $params.httpServer.port
          name: http-api
          protocol: TCP
      resources:
        requests:
          memory: $params.deployment.memoryRequest
        limits:
          memory: $params.deployment.memoryLimit


  - name: restartPolicy
    type: ucf.k8s.restartPolicy
    parameters:
      policy: Always # Always / OnFailure / Never

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

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

  - name: asset-volume
    type: ucf.k8s.volume
    parameters:
      persistentVolumeClaim:
        claimName: ia-animation-graph-microservice-assets

  - 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: assets-volume-mount
    type: ucf.appspec.defaultVolumeMount
    parameters:
      name: asset-volume
      mountPath: /home/ace/asset
      #externalTrafficPolicy: # Cluster / Local. Allowed when service type is NodePort or LoadBalancer