Skip to content
This repository was archived by the owner on Jul 24, 2024. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion qiskit_ibm/api/clients/runtime.py
Original file line number Diff line number Diff line change
Expand Up @@ -158,7 +158,7 @@ def program_update(self, program_id: str, program_data: str) -> None:

Args:
program_id: Program ID.
program_data: Program data.
program_data: Program data (base64 encoded).
"""
self.api.program(program_id).update(program_data)

Expand Down
4 changes: 2 additions & 2 deletions qiskit_ibm/api/rest/runtime.py
Original file line number Diff line number Diff line change
Expand Up @@ -238,11 +238,11 @@ def update(self, program_data: str) -> None:
"""Update a program.

Args:
program_data: Program data.
program_data: Program data (base64 encoded).
"""
url = self.get_url("data")
self.session.put(url, data=program_data,
headers={'Content-Type': 'text/plain'})
headers={'Content-Type': 'application/octet-stream'})


class ProgramJob(RestAdapterBase):
Expand Down
17 changes: 13 additions & 4 deletions qiskit_ibm/runtime/ibm_runtime_service.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,6 @@

"""Qiskit runtime service."""

import base64
import logging
from typing import Dict, Callable, Optional, Union, List, Any, Type
import json
Expand All @@ -24,7 +23,7 @@

from .runtime_job import RuntimeJob
from .runtime_program import RuntimeProgram, ProgramParameter, ProgramResult, ParameterNamespace
from .utils import RuntimeEncoder, RuntimeDecoder
from .utils import RuntimeEncoder, RuntimeDecoder, to_base64_string
from .exceptions import (QiskitRuntimeError, RuntimeDuplicateProgramError, RuntimeProgramNotFound,
RuntimeJobNotFound)
from .program.result_decoder import ResultDecoder
Expand Down Expand Up @@ -339,7 +338,7 @@ def upload_program(
data = file.read()

try:
program_data = base64.b64encode(data.encode('utf-8')).decode('utf-8')
program_data = to_base64_string(data)
response = self._api_client.program_create(program_data=program_data,
**program_metadata)
except RequestsApiError as ex:
Expand Down Expand Up @@ -412,12 +411,22 @@ def update_program(
Args:
program_id: Program ID.
data: Program data or path of the file containing program data to upload.

Raises:
RuntimeProgramNotFound: If the program doesn't exist.
QiskitRuntimeError: If the request failed.
"""
if "def main(" not in data:
# This is the program file
with open(data, "r") as file:
data = file.read()
self._api_client.program_update(program_id, data)
try:
program_data = to_base64_string(data)
self._api_client.program_update(program_id, program_data)
except RequestsApiError as ex:
if ex.status_code == 404:
raise RuntimeProgramNotFound(f"Program not found: {ex.message}") from None
raise QiskitRuntimeError(f"Failed to update program: {ex}") from None

def delete_program(self, program_id: str) -> None:
"""Delete a runtime program.
Expand Down
12 changes: 12 additions & 0 deletions qiskit_ibm/runtime/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,18 @@
from qiskit.result import Result


def to_base64_string(data: str) -> str:
"""Convert string to base64 string.

Args:
data: string to convert

Returns:
data as base64 string
"""
return base64.b64encode(data.encode('utf-8')).decode('utf-8')


def _serialize_and_encode(
data: Any,
serializer: Callable,
Expand Down