Database Upgrade - Odoo 11.0

Введение

В этом документе описан 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
Результат
Результат запроса
Тип результата
JSON dictionary

Метод 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

Загружает дамп базы данных

Параметры
  • key (str) – (обязательный параметр) ваш личный ключ
  • request (str) – (обязательный параметр) ваш id запроса
Результат
Результат запроса
Тип результата
JSON dictionary

Идентификатор запроса и закрытый ключ получают с помощью метод 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-сервер

Параметры
  • key (str) – (обязательный параметр) ваш личный ключ
  • request (str) – (обязательный параметр) ваш id запроса
  • ssh_keys (str) – (обязательный параметр) путь к файлу, в котором перечислены открытые ключи ssh, которые вы хотели бы использовать
Результат
Результат запроса
Тип результата
JSON dictionary

Идентификатор запроса и закрытый ключ получают с помощью метод 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

Обработка дампа базы данных

Параметры
  • key (str) – (обязательный параметр) ваш личный ключ
  • request (str) – (обязательный параметр) ваш id запроса
Результат
Результат запроса
Тип результата
JSON dictionary

Идентификатор запроса и закрытый ключ получают с помощью метод 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

Запросить статус запроса на обновление базы данных

Параметры
  • key (str) – (обязательный параметр) ваш личный ключ
  • request (str) – (обязательный параметр) ваш id запроса
Результат
Результат запроса
Тип результата
JSON dictionary

Идентификатор запроса и закрытый ключ получают с помощью метод 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