name: model_upload
description: |
    Uploads a model and returns a Model representing the uploaded Model resource.
    For more details, see https://cloud.google.com/vertex-ai/docs/reference/rest/v1/projects.locations.models/upload.

    Args:
        project (str):
            Required. Project to upload this model to.
        location (Optional[str]):
            Optional location to upload this model to. If not set,
            default to us-central1.
        display_name (str):
            Required. The display name of the Model. The name can be up to 128
            characters long and can be consist of any UTF-8 characters.
        description (Optional[str]):
            The description of the model.
        unmanaged_container_model (Optional[google.UnmanagedContainerModel]):
            Optional. The unmanaged container model to be uploaded.

            The model can be passed from an upstream step, or imported via an importer node.
            ```
              from kfp.v2.components import importer_node
              from google_cloud_pipeline_components.types import artifact_types

              importer_spec = importer_node.importer(
                artifact_uri='gs://managed-pipeline-gcpc-e2e-test/automl-tabular/model',
                artifact_class=artifact_types.UnmanagedContainerModel,
                metadata={
                    'containerSpec': {
                        'imageUri':
                            'us-docker.pkg.dev/vertex-ai/automl-tabular/prediction-server:prod'
                    }
                })
            ```
        explanation_metadata (Optional[dict]):
            Metadata describing the Model's input and output for explanation.
            Both `explanation_metadata` and `explanation_parameters` must be
            passed together when used.

            For more details, see https://cloud.google.com/vertex-ai/docs/reference/rest/v1/ExplanationSpec#explanationmetadata.
        explanation_parameters (Optional[dict]):
            Parameters to configure explaining for Model's predictions.

            For more details, see https://cloud.google.com/vertex-ai/docs/reference/rest/v1/ExplanationSpec#explanationmetadata.
        encryption_spec_key_name (Optional[str]):
            Customer-managed encryption key spec for a Model.
            If set, this Model and all sub-resources of this Model will
            be secured by this key.

            Has the form:
            ``projects/my-project/locations/my-location/keyRings/my-kr/cryptoKeys/my-key``.
            The key needs to be in the same region as where the compute
            resource is created.
        labels (Optional[dict]):
            The labels with user-defined metadata to organize your model.

            Label keys and values can be no longer than
            64 characters (Unicode codepoints), can only contain lowercase
            letters, numeric characters, underscores and dashes.
            International characters are allowed.

            See https://goo.gl/xmQnxf for more information and examples of labels.
    Returns:
        model (google.VertexModel):
            Artifact tracking the created model.
        gcp_resources (str):
            Serialized gcp_resources proto tracking the upload model's long running operation.

            For more details, see https://github.com/kubeflow/pipelines/blob/master/components/google-cloud/google_cloud_pipeline_components/proto/README.md.
inputs:
- {name: project, type: String}
- {name: location, type: String, default: "us-central1"}
- {name: display_name, type: String}
- {name: description, type: String, optional: true, default: ''}
- {name: unmanaged_container_model, type: google.UnmanagedContainerModel, optional: true}
- {name: explanation_metadata, type: JsonObject, optional: true, default: '{}'}
- {name: explanation_parameters, type: JsonObject, optional: true, default: '{}'}
- {name: encryption_spec_key_name, type: String, optional: true, default: ''}
- {name: labels, type: JsonObject, optional: true, default: '{}'}
outputs:
- {name: model, type: google.VertexModel}
- {name: gcp_resources, type: String}
implementation:
  container:
    image: gcr.io/ml-pipeline/google-cloud-pipeline-components:1.10.13
    command: [python3, -u, -m, google_cloud_pipeline_components.container.v1.gcp_launcher.launcher]
    args: [
      --type, UploadModel,
      --payload,
      concat: [
          '{',
          '"display_name": "', {inputValue: display_name}, '"',
          ', "description": "', {inputValue: description}, '"',
          ', "explanation_spec": {',
          '"parameters": ', {inputValue: explanation_parameters},
          ', "metadata": ', {inputValue: explanation_metadata},
          '}',
          ', "encryption_spec": {"kms_key_name":"', {inputValue: encryption_spec_key_name}, '"}',
          ', "labels": ', {inputValue: labels},
          '}'
      ],
      --project, {inputValue: project},
      --location, {inputValue: location},
      --gcp_resources, {outputPath: gcp_resources},
      --executor_input, "{{$}}",
    ]
