OpenShift REST API для масштабирования, недопустимые символы, ищущие начало значения

Я пытаюсь масштабировать свои развертывания, используя openshift rest api, но я сталкиваюсь с ошибкой "недопустимый символ ищет начало значения". Я могу получить подробную информацию о конфигурации развертывания, но меня беспокоит запрос на исправление. Из документов я пробовал Content-Type как показано ниже 3, но ничего не работает:

  • применение / JSON-патч + JSON
  • Приложение / слияния-патч + JSON
  • Применение / стратегическое слияние-патч + JSON

Вот мой код:

data = {'spec':{'replicas':2}}
headers = {"Authorization": token, "Content-Type": "application/json-patch+json"}
def updateReplicas():
   url = root + "namespaces" + namespace + "deploymentconfigs" + dc + "scale"  
   resp = requests.patch(url, headers=headers, data=data, verify=False)
   print(resp.content)

Спасибо.

1 ответ

Решение

Хорошо, я выяснил проблему. Сначала глупо, данные должны быть в одинарных кавычках data = '{'spec':{'replicas':2}}'.

Затем нам нужно немного больше информации в наших данных, которая в итоге выглядит следующим образом:

data = '{"kind": "Scale", "apiVersion": "extensions / v1beta1", "metadata": {"name": "deploy_name","namespace":"namespace_name"},"spec":{" реплики ":1}}"

Спасибо за ваше время.

У меня был такой же вариант использования и намек на @GrahamDumpleton для запуска oc с --loglevel 9 было очень полезно. Это то, что oc scale делает:

  1. Это делает запрос get к ресурсу, получая некоторый объект JSON
  2. Затем он отправляет запрос на ресурс с измененным объектом JSON (количество измененных реплик) в качестве полезной нагрузки.

Если вы делаете это, вам не нужно беспокоиться о настройке apiVersionВы просто повторно используете то, что получаете в первую очередь.

Вот небольшой скрипт на python, который следует этому подходу:

"""
Login into your project first `oc login` and `oc project <your-project>` before running this script.

Usage:
    pip install requests
    python scale_pods.py --deployment-name <your-deployment> --nof-replicas <number>

"""
import argparse
import requests
from subprocess import check_output
import warnings
warnings.filterwarnings("ignore")  # ignore insecure request warnings


def byte_to_str(bs):
    return bs.decode("utf-8").strip()


def get_endpoint():
    byte_str = check_output("echo $(oc config current-context | cut -d/ -f2 | tr - .)", shell=True)
    return byte_to_str(byte_str)


def get_namespace():
    byte_str = check_output("echo $(oc config current-context | cut -d/ -f1)", shell=True)
    return byte_to_str(byte_str)


def get_token():
    byte_str = check_output("echo $(oc whoami -t)", shell=True)
    return byte_to_str(byte_str)


def scale_pods(deployment_name, nof_replicas):
    url = "https://{endpoint}/apis/apps.openshift.io/v1/namespaces/{namespace}/deploymentconfigs/{deplyoment_name}/scale".format(
        endpoint=get_endpoint(),
        namespace=get_namespace(),
        deplyoment_name=deployment_name
    )
    headers = {
        "Authorization": "Bearer %s" % get_token()
    }
    get_response = requests.get(url, headers=headers, verify=False)

    data = get_response.json()
    data["spec"]["replicas"] = nof_replicas
    print(data)

    response_put = requests.put(url, headers=headers, json=data, verify=False)
    print(response_put.status_code)


def main():
    parser = argparse.ArgumentParser()
    parser.add_argument("--deployment-name", type=str, required=True, help="deployment name")
    parser.add_argument("--nof-replicas", type=int, required=True, help="nof replicas")
    args = parser.parse_args()
    scale_pods(args.deployment_name, args.nof_replicas)


if __name__ == "__main__":
    main()
Другие вопросы по тегам