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
делает:
- Это делает запрос get к ресурсу, получая некоторый объект JSON
- Затем он отправляет запрос на ресурс с измененным объектом 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()