Введение
В этом документе описан API, используемый для обновления базы данных Odoo до более высокой версии.
Он позволяет обновить базу данных без повторной отправки html-формы на https://upgrade.odoo.com Хотя база данных будет следовать тому же процессу, который описан в этой форме.
Требуемые шаги:
Методы
Создание запроса на обновление базы данных
Это действие создает запрос базы данных со следующей информацией:
- Ссылка на ваш контракт
- Ваш адрес электронной почты:
- Целевую версию (версию Odoo, до которой вы хотите обновить)
- Цель вашего запроса (для теста или реальная эксплуатация)
- Имя дампа базы данных (обязательное, но чисто для информации)
- необязательный параметр - часовой пояс сервера (для версии Odoo <6.1)
Метод create
https://upgrade.odoo.com/database/v1/create
Создает запрос на обновление базы данных
- contract (
str
) – (обязательный параметр) ссылка на ваш контракт enterprise версии - email (
str
) – (обязательный параметр) ваш адрес электронной почты - target (
str
) – (required) the Odoo version you want to upgrade to. Valid choices: 6.0, 6.1, 7.0, 8.0 - aim (
str
) – (обязательный параметр) цель вашего запроса обновления базы данных . Доступные значения: тест, реальная эксплуатация. - filename (
str
) – (обязательный параметр) имя дампа базы данных , носит информационный характер - timezone (
str
) – (необязательный параметр) часовой пояс, используемый вашим сервером. Только для версии Odoo <6.1
Метод create возвращает словарь JSON, содержащий следующие ключи:
failures
Список ошибок.
Список словарей, каждый из которых содержит информацию об одной конкретной ошибке. Каждый словарь может содержать различные ключи в зависимости от типа ошибки, но вы всегда получите ключи reason
и message
:
reason
: тип ошибкиmessage
: понятное человеку сообщение
Некоторые возможные ключи:
code
: ошибочное значениеvalue
: ошибочное значениеexpected
: список допустимых значений
См. Пример вывода.
- JSON
{
"failures": [
{
"expected": [
"6.0",
"6.1",
"7.0",
"8.0",
],
"message": "Invalid value \"5.0\"",
"reason": "TARGET:INVALID",
"value": "5.0"
},
{
"code": "M123456-abcxyz",
"message": "Can not find contract M123456-abcxyz",
"reason": "CONTRACT:NOT_FOUND"
}
]
}
request
Если вызов метода create будет успешным, значение, связанное с ключом request, будет словарем, содержащим различную информацию о созданном запросе:
Наиболее важные ключи:
id
: id запросаkey
: ваш личный ключ для этого запроса
Эти 2 значения будут запрошены другими методами (upload, process и status)
Другие ключи будут объяснены в разделе, описывающем status method.
Пример скрипта
Вот два примера создания запроса на обновление базы данных с использованием:
- one in the python programming language using the pycurl library
- one in the bash programming language using curl (tool for transfering data using http) and jq (JSON processor):
- Python
- Bash
from urllib import urlencode
from io import BytesIO
import pycurl
import json
CREATE_URL = "https://upgrade.odoo.com/database/v1/create"
CONTRACT = "M123456-abcdef"
AIM = "test"
TARGET = "8.0"
EMAIL = "john.doe@example.com"
FILENAME = "db_name.dump"
fields = dict([
('aim', AIM),
('email', EMAIL),
('filename', DB_SOURCE),
('contract', CONTRACT),
('target', TARGET),
])
postfields = urlencode(fields)
c = pycurl.Curl()
c.setopt(pycurl.URL, CREATE_URL)
c.setopt(c.POSTFIELDS, postfields)
data = BytesIO()
c.setopt(c.WRITEFUNCTION, data.write)
c.perform()
# transform output into a dict:
response = json.loads(data.getvalue())
# get http status:
http_code = c.getinfo(pycurl.HTTP_CODE)
c.close()
CONTRACT=M123456-abcdef
AIM=test
TARGET=8.0
EMAIL=john.doe@example.com
FILENAME=db_name.dump
CREATE_URL="https://upgrade.odoo.com/database/v1/create"
URL_PARAMS="contract=${CONTRACT}&aim=${AIM}&target=${TARGET}&email=${EMAIL}&filename=${FILENAME}"
curl -sS "${CREATE_URL}?${URL_PARAMS}" > create_result.json
# check for failures
failures=$(cat create_result.json | jq -r '.failures[]')
if [ "$failures" != "" ]; then
echo $failures | jq -r '.'
exit 1
fi
Загрузка дампа базы данных
Существует два метода загрузки дампа базы данных:
- метод
upload
с использованием протокола HTTPS - метод `` request_sftp_access`` с использованием протокола SFTP
Метод `` upload``
Это самый простой и самый правильный способ загрузки дампа базы данных. Он использует протокол HTTPS.
https://upgrade.odoo.com/database/v1/upload
Загружает дамп базы данных
Идентификатор запроса и закрытый ключ получают с помощью метод create
Результатом является словарь JSON, содержащий список failures
, который должен быть пустым, если все прошло нормально.
- Python
- Bash
import os
import pycurl
from urllib import urlencode
UPLOAD_URL = "https://upgrade.odoo.com/database/v1/upload"
DUMPFILE = "openchs.70.cdump"
fields = dict([
('request', '10534'),
('key', 'Aw7pItGVKFuZ_FOR3U8VFQ=='),
])
headers = {"Content-Type": "application/octet-stream"}
postfields = urlencode(fields)
c = pycurl.Curl()
c.setopt(pycurl.URL, UPLOAD_URL+"?"+postfields)
c.setopt(pycurl.POST, 1)
filesize = os.path.getsize(DUMPFILE)
c.setopt(pycurl.POSTFIELDSIZE, filesize)
fp = open(DUMPFILE, 'rb')
c.setopt(pycurl.READFUNCTION, fp.read)
c.setopt(
pycurl.HTTPHEADER,
['%s: %s' % (k, headers[k]) for k in headers])
c.perform()
c.close()
UPLOAD_URL="https://upgrade.odoo.com/database/v1/upload"
DUMPFILE="openchs.70.cdump"
KEY="Aw7pItGVKFuZ_FOR3U8VFQ=="
REQUEST_ID="10534"
URL_PARAMS="key=${KEY}&request=${REQUEST_ID}"
HEADER="Content-Type: application/octet-stream"
curl -H $HEADER --data-binary "@${DUMPFILE}" "${UPLOAD_URL}?${URL_PARAMS}"
Метод request_sftp_access
Этот метод рекомендуется для больших дампов базы данных. Он использует протокол SFTP и поддерживает возобновление.
Он создаст временный SFTP-сервер, к которому вы можете подключиться, и позволит вам загружать дамп базы данных с помощью SFTP-клиента.
https://upgrade.odoo.com/database/v1/request_sftp_access
Создает SFTP-сервер
Идентификатор запроса и закрытый ключ получают с помощью метод create
Файл с открытыми ключами ssh должен быть примерно похож на стандартный файл authorized_keys
. Этот файл должен содержать только открытые ключи, пустые строки или комментарии (строки, начинающиеся с символа #
),
Ваш запрос на обновление базы данных должен находиться в состоянии draft
.
Метод request_sftp_access
возвращает словарь JSON, содержащий следующие ключи:
- Python
- Bash
import os
import pycurl
from urllib import urlencode
UPLOAD_URL = "https://upgrade.odoo.com/database/v1/request_sftp_access"
SSH_KEYS="/path/to/your/authorized_keys"
fields = dict([
('request', '10534'),
('key', 'Aw7pItGVKFuZ_FOR3U8VFQ=='),
])
postfields = urlencode(fields)
c = pycurl.Curl()
c.setopt(pycurl.URL, UPLOAD_URL+"?"+postfields)
c.setopt(pycurl.POST, 1)
c.setopt(c.HTTPPOST,[("ssh_keys",
(c.FORM_FILE, SSH_KEYS,
c.FORM_CONTENTTYPE, "text/plain"))
])
c.perform()
c.close()
REQUEST_SFTP_ACCESS_URL="https://upgrade.odoo.com/database/v1/request_sftp_access"
SSH_KEYS=/path/to/your/authorized_keys
KEY="Aw7pItGVKFuZ_FOR3U8VFQ=="
REQUEST_ID="10534"
URL_PARAMS="key=${KEY}&request=${REQUEST_ID}"
curl -sS "${REQUEST_SFTP_ACCESS_URL}?${URL_PARAMS}" -F ssh_keys=@${SSH_KEYS} > request_sftp_result.json
# check for failures
failures=$(cat request_sftp_result.json | jq -r '.failures[]')
if [ "$failures" != "" ]; then
echo $failures | jq -r '.'
exit 1
fi
failures
Список ошибок. Смотрите failures для объяснения словаря JSON, возвращенного в случае сбоя.
request
Если вызов выполнен успешно, значение, связанное с ключом request, будет словарем, содержащим параметры подключения SFTP:
hostname
: адрес хоста для соединенияsftp_port
: порт для подключенияsftp_user
: пользователь SFTP, который будет использоваться для подключенияshared_file
: имя файла, которое вы должны использовать (идентичное значениюfilename
, которое вы использовали при создании запроса в метод create).)request_id
: соответствующий id запроса обновления (только информативный, не требуемый для подключения)sample_command
: пример команды с использованием клиента sftp
Обычно вы можете подключиться с использованием команды sample как есть.
У вас будет доступ только к shared_file
. Никакие другие файлы не будут доступны, и вы не сможете создавать новые файлы в общей среде на сервере SFTP.
Использование клиента sftp
После успешного подключения с использованием SFTP-клиента вы можете загрузить дамп базы данных. Ниже приведен пример сеанса с использованием клиента sftp:
$ sftp -P 2200 user_10534@upgrade.odoo.com
Connected to upgrade.odoo.com.
sftp> put /path/to/openchs.70.cdump openchs.70.cdump
Uploading /path/to/openchs.70.cdump to /openchs.70.cdump
sftp> ls -l openchs.70.cdump
-rw-rw-rw- 0 0 0 849920 Aug 30 15:58 openchs.70.cdump
Если ваше соединение прервано, вы можете продолжить передачу файла, используя ключ командной строки -a
:
sftp> put -a /path/to/openchs.70.cdump openchs.70.cdump
Resuming upload of /path/to/openchs.70.cdump to /openchs.70.cdump
Если вы не хотите вводить команду вручную и вам необходимо автоматизировать обновление базы данных с помощью скрипта, вы можете использовать пакетный файл или передать команды в sftp:
echo "put /path/to/openchs.70.cdump openchs.70.cdump" | sftp -b - -P 2200 user_10534@upgrade.odoo.com
Параметр -b
принимает имя файла. Если имя файла -
, оно читает команды со стандартного ввода.
Запрос на обработку вашего запроса
Это действие просит платформу обновления обработать дамп базы данных.
Метод process
https://upgrade.odoo.com/database/v1/process
Обработка дампа базы данных
Идентификатор запроса и закрытый ключ получают с помощью метод create
Результатом является словарь JSON, содержащий список failures
, который должен быть пустым, если все прошло нормально.
- Python
- Bash
from urllib import urlencode
from io import BytesIO
import pycurl
import json
PROCESS_URL = "https://upgrade.odoo.com/database/v1/process"
fields = dict([
('request', '10534'),
('key', 'Aw7pItGVKFuZ_FOR3U8VFQ=='),
])
postfields = urlencode(fields)
c = pycurl.Curl()
c.setopt(pycurl.URL, PROCESS_URL)
c.setopt(c.POSTFIELDS, postfields)
data = BytesIO()
c.setopt(c.WRITEFUNCTION, data.write)
c.perform()
# transform output into a dict:
response = json.loads(data.getvalue())
# get http status:
http_code = c.getinfo(pycurl.HTTP_CODE)
c.close()
PROCESS_URL="https://upgrade.odoo.com/database/v1/process"
KEY="Aw7pItGVKFuZ_FOR3U8VFQ=="
REQUEST_ID="10534"
URL_PARAMS="key=${KEY}&request=${REQUEST_ID}"
curl -sS "${PROCESS_URL}?${URL_PARAMS}"
Получение статуса запроса
Это действие запрашивает статус вашего запроса на обновление базы данных.
Метод status
https://upgrade.odoo.com/database/v1/status
Запросить статус запроса на обновление базы данных
Идентификатор запроса и закрытый ключ получают с помощью метод create
Результатом является словарь JSON, содержащий различную информацию о вашем запросе на обновление базы данных.
- Python
- Bash
from urllib import urlencode
from io import BytesIO
import pycurl
import json
STATUS_URL = "https://upgrade.odoo.com/database/v1/status"
fields = dict([
('request', '10534'),
('key', 'Aw7pItGVKFuZ_FOR3U8VFQ=='),
])
postfields = urlencode(fields)
c = pycurl.Curl()
c.setopt(pycurl.URL, PROCESS_URL)
c.setopt(c.POSTFIELDS, postfields)
data = BytesIO()
c.setopt(c.WRITEFUNCTION, data.write)
c.perform()
# transform output into a dict:
response = json.loads(data.getvalue())
c.close()
STATUS_URL="https://upgrade.odoo.com/database/v1/status"
KEY="Aw7pItGVKFuZ_FOR3U8VFQ=="
REQUEST_ID="10534"
URL_PARAMS="key=${KEY}&request=${REQUEST_ID}"
curl -sS "${STATUS_URL}?${URL_PARAMS}"
Пример вывода
Ключ request
содержит различную полезную информацию о вашем запросе:
id
- ID запроса
key
- Ваш личный ключ
email
- Адрес электронной почты, который вы указали при создании запроса
target
- Целевая версия Odoo, которую вы указали при создании запроса
aim
- Цель (тест, реальное использование) запроса на обновление базы данных, которую вы указали при создании запроса
filename
- Имя файла, которое вы указали при создании запроса
timezone
- Часовой пояс, который вы указали при создании запроса
state
- Состояние вашего запроса
issue_stage
- Этап ишью, которую мы создали на главном сервере Odoo
issue
- id ишью, которую мы создали на главном сервере Odoo
status_url
- URL-адрес для доступа к html-странице запроса на обновление базы данных
notes_url
- URL-адрес для получения заметок об обновлении базы данных
original_sql_url
- URL-адрес, используемый для получения загруженной (не обновленной) базы данных в виде потока SQL
original_dump_url
- URL-адрес, используемый для получения загруженной (не обновленной) базы данных в виде файла архива
upgraded_sql_url
- URL-адрес, используемый для получения обновленной базы данных в виде потока SQL
upgraded_dump_url
- URL-адрес, используемый для получения обновленной базы данных в виде файла архива
modules_url
- URL-адрес, используемый для получения кастомных модулей
filesize
- Размер файла загруженной базы данных
database_uuid
- Уникальный идентификатор вашей базы данных
created_at
- Дата создания запроса
estimated_time
- Оценка времени, необходимого для обновления базы данных
processed_at
- Время начала обновления базы данных
elapsed
- Время, необходимое для обновления базы данных
filestore
- Ваши вложения были преобразованы в файл-архив
customer_message
- Важное сообщение, связанное с вашим запросом
database_version
- предполагаемая версия Одо вашей загруженной (не обновленной) базы данных
postgresql
- предполагаемая версия Postgresql загруженной (не обновленной) базы данных
compressions
- Методы сжатия, используемые вашей загруженной базой данных
- JSON
{
"failures": [],
"request": {
"id": 10534,
"key": "Aw7pItGVKFuZ_FOR3U8VFQ==",
"email": "john.doe@example.com",
"target": "8.0",
"aim": "test",
"filename": "db_name.dump",
"timezone": null,
"state": "draft",
"issue_stage": "new",
"issue": 648398,
"status_url": "https://upgrade.odoo.com/database/eu1/10534/Aw7pItGVKFuZ_FOR3U8VFQ==/status",
"notes_url": "https://upgrade.odoo.com/database/eu1/10534/Aw7pItGVKFuZ_FOR3U8VFQ==/upgraded/notes",
"original_sql_url": "https://upgrade.odoo.com/database/eu1/10534/Aw7pItGVKFuZ_FOR3U8VFQ==/original/sql",
"original_dump_url": "https://upgrade.odoo.com/database/eu1/10534/Aw7pItGVKFuZ_FOR3U8VFQ==/original/archive",
"upgraded_sql_url": "https://upgrade.odoo.com/database/eu1/10534/Aw7pItGVKFuZ_FOR3U8VFQ==/upgraded/sql",
"upgraded_dump_url": "https://upgrade.odoo.com/database/eu1/10534/Aw7pItGVKFuZ_FOR3U8VFQ==/upgraded/archive",
"modules_url": "https://upgrade.odoo.com/database/eu1/10534/Aw7pItGVKFuZ_FOR3U8VFQ==/modules/archive",
"filesize": "912.99 Kb",
"database_uuid": null,
"created_at": "2015-09-09 07:13:49",
"estimated_time": null,
"processed_at": null,
"elapsed": "00:00",
"filestore": false,
"customer_message": null,
"database_version": null,
"postgresql": "9.4",
"compressions": [
"pgdmp_custom",
"sql"
]
}
}
Загрузка дампа базы данных
Помимо загрузки перенесенной базы данных с использованием URL-адреса, предоставленного с помощью status method, вы также можете использовать протокол SFTP, как описано в методе request_sftp_access method
Разница заключается в том, что вы сможете загружать только перенесенную базу данных. Загрузка не будет возможна.
Запрос на обновление базы данных должен находиться в состоянии done
.
После успешного подключения с использованием SFTP-клиента вы можете загрузить дамп базы данных. Ниже приведен пример сеанса с использованием клиента sftp:
$ sftp -P 2200 user_10534@upgrade.odoo.com
Connected to upgrade.odoo.com.
sftp> get upgraded_openchs.70.cdump /path/to/upgraded_openchs.70.cdump
Downloading /upgraded_openchs.70.cdump to /path/to/upgraded_openchs.70.cdump