[

четверг, 15 мая 2014 г.

Hibernate Exceptions In Grails Domain Event


По неосторожности можно наткнуться на

ERROR hibernate.AssertionFailure  - an assertion failure occured (this may indicate a bug in Hibernate, but is more likely due to unsafe use of the session) Message: null id in Domain entry (don't flush the Session after an exception occurs)

пытаясь изменить свойства домена, например, в событии beforeInsert.

Простой пример:
def beforeInsert() {
    someField = fieldModificationService.modify(someField)
}

Если Hibernate сам управляет сохранением данных в базе, а по умолчанию это так, то тут может произойти flush, что в контексте события домена запрещено.

Чтобы этого не происходило можно обернуть сервис в @Transactional(readOnly = true):
@Transactional(readOnly = true)
class FieldModificationService {
    def grailsApplication
    ...
}

воскресенье, 27 апреля 2014 г.

Not In Groovy

5ти минутный ступор: в Groovy есть оператор in, но не not in... Python портит людей.

понедельник, 9 сентября 2013 г.

Как вызвать интерактивную консоль python из кода

bpdb

import bpdb; bpdb.set_trace()

На экране появится приглашение bpdb
Django version 1.5.2, using settings 'my_project.settings'
Development server is running at http://127.0.0.1:8000/
Quit the server with CONTROL-C.
> /path/to/my_project/app/views.py(224)visit_update()
-> return HttpResponse(json.dumps("TODO:"), content_type="application/json")
Use "B" to enter bpython, Ctrl-d to exit it.
(BPdb)

NB: bpython не работает, но по идее это должно быть так:
import bpython; bpython.embed()

IPython

import IPython; IPython.embed()

Python code (last resort)

import code; code.InteractiveConsole(locals = locals()).interact()

воскресенье, 11 августа 2013 г.

Установка virtualenv под Windows

Устанавливаем Python

Скачиваем MSI файл от сюда http://python.org/download/

Устанавливаем setuptools (нужны для установки pip)

Скачиваем специальный скрипт с https://bitbucket.org/pypa/setuptools/raw/bootstrap/ez_setup.py и запускаем

C:\> C:/Python27/python.exe C:/path/to/ez_setup.py

Устанавливаем pip

Скачиваем дистрибьютив с https://pypi.python.org/pypi/pip, распаковываем и запускаем установку

C:\> C:/Python27/python.exe C:/path/to/pip-distrib/setup.py install

Устанавливаем virtualenv

C:\> C:/Python27/Scripts/pip.exe install virtualenv

Проверяем virtualenv

C:\>mkdir tmp

C:\>cd tmp

C:\tmp>C:\Python27\Scripts\virtualenv.exe test
New python executable in test\Scripts\python.exe
Installing Setuptools...........................................................
................................................................................
................................................................................
.......................done.
Installing Pip..................................................................
................................................................................
................................................................................
................................................................................
.....................done.

C:\tmp>cd test

C:\tmp\test>Scripts\activate.bat
(test) C:\tmp\test>

суббота, 10 августа 2013 г.

четверг, 21 февраля 2013 г.

Музыка по дням недели

Пн - Radiohead, Gorillaz
Вт - Radiohead, Gorillaz, Depeche Mode
Ср - Depeche Mode, Muse
Чт - Metallica, Rammstein, etc...
Пт - Группировка Ленинград.

воскресенье, 3 февраля 2013 г.

Конвертация физического linux сервера в виртуальную машину XCP (XenServer)

Описанные действия производились с физическим серверов на Debian Squeeze 32, а перенос осуществлялся на виртуальную машину под XCP 1.6 (соответствует XenServer 6.1).

К сожалению из этой версии установочного диска выпилили утилиту для автоматической конвертации физического сервера в виртуальны (p2v) для linux.

Общий план действий такой:
  1. Получим образ диска сервера
  2. Создадим HVM машину
  3. Перенесем образ диска физического сервера на диск виртуального
  4. Переделаем HVM машину в PVM
Ничего сложного:)

Получение образа диска физического сервера

Выключаем сервер и грузимся с live cd. Я использовал установочный диск Ubuntu Desktop.

Далее надо куда-то сохранить наш образ. Я воспользовался внешним хранилищем, подключаемым по USB. Не самый быстрый вариант, но ~20-30 Мб/с будет.

Итак, диск для клонирования /dev/sdb. Клонировать будем в /dev/sdc1. Команды:
# mount /dev/sdc1 /mnt/
# dd if=/dev/sdb of=/mnt/linux_system_disk bs=512K
Копироваться будет долго, никакой диагностики на экране не будет, чтобы ее увидеть нужно дать сигнал USR1 процессу dd (kill -USR1 <pid>).

Как скопируется сервер можно перезапустить в штатном режиме, если это, конечно, надо.

Запишем размер полученного образа (диск на создаваемой виртуалке должен быть не меньше этого размера):
# ls -l /mnt/
-r-------- 1 root root 159988580352 Янв 24 04:58 linux_system_disk

Создание HVM машины

Сделаем копию шаблона для установки Debian Squeeze 32 bit, но на HVM машину. Найдем шаблон для Debian Squeeze 32 bit:

# xe template-list | grep -B1 "Debian Squeeze 6.0 (32-bit)"
uuid ( RO)                : 8aac6fb4-bed6-99c9-6b17-5aebbdb5fb25
          name-label ( RW): Debian Squeeze 6.0 (32-bit)

Клонируем шаблон и правим параметры:
# xe vm-clone uuid=8aac6fb4-bed6-99c9-6b17-5aebbdb5fb25 new-name-label="Debian Squeeze 6.0 (32-bit)"
419070db-67c0-9f13-6259-ce2039142ddf
# xe template-param-set  PV-args="" uuid=419070db-67c0-9f13-6259-ce2039142ddf
# xe template-param-set  PV-bootloader="" uuid=419070db-67c0-9f13-6259-ce2039142ddf
# xe template-param-set  HVM-boot-policy="BIOS order" uuid=419070db-67c0-9f13-6259-ce2039142ddf
# xe template-param-set  HVM-boot-params:order="dc" uuid=419070db-67c0-9f13-6259-ce2039142ddf
# xe template-param-set other-config:disks='<provision><disk device="0" size="159988580352" sr="" bootable="true" type="system"/></provision>' uuid=419070db-67c0-9f13-6259-ce2039142ddf

Шаблон готов. Из него можно создать машину и загрузиться с помощью live cd.

Добавим Ubuntu Desktop 12.10 install cd в список VDI хост машины.

# mkdir -p /var/opt/xen/iso_import/ubuntu
# mv ubuntu-12.10-desktop-i386.iso /var/opt/xen/iso_import/ubuntu/
# xe sr-create name-label=ubuntu type=iso device-config:location=/var/opt/xen/iso_import/ubuntu device-config:legacy_mode=true content-type=iso

Проверим нашелся ли диск с Ubuntu:
# xe vdi-list 
uuid ( RO)                : f0dada79-eb6e-4eea-8198-a181e6390bca
          name-label ( RW): ubuntu-12.10-desktop-i386.iso
    name-description ( RW): 
             sr-uuid ( RO): 8270e933-c298-c925-599b-e87951fac965
        virtual-size ( RO): 789884928
            sharable ( RO): false
           read-only ( RO): true

Теперь можно создать виртуальную машину, добавить ей сетевой интерфейс (пусть на нем будет DHCP, да и с доступом к интернету), "вставить" Ubuntu CD в данную виртуальную машину и запуститься без установки.

# xe vm-install template="Debian Squeeze 6.0 (32-bit) HVM" new-name-label="Sample P2V"
b724c232-af4b-806d-cc35-efa273015248
# xe vm-cd-add vm=b724c232-af4b-806d-cc35-efa273015248 cd-name=ubuntu-12.10-desktop-i386.iso device=3
# xe vbd-list vm-uuid=b724c232-af4b-806d-cc35-efa273015248 type=CD params=uuid
uuid ( RO)    : 38798b08-2cf5-3816-3f40-3c73ef456b62
# xe vbd-param-set uuid=38798b08-2cf5-3816-3f40-3c73ef456b62 bootable=true
# xe network-list 
uuid ( RO)                : 5c2bb576-7836-70e9-f08f-2f0e172075ea
          name-label ( RW): Pool-wide network associated with eth0
    name-description ( RW): 
              bridge ( RO): xenbr0

# xe vif-create network-uuid=5c2bb576-7836-70e9-f08f-2f0e172075ea vm-uuid=b724c232-af4b-806d-cc35-efa273015248 device=4
17865728-5c69-b2a9-8bf7-75cd7add4550

# xe vm-start uuid=b724c232-af4b-806d-cc35-efa273015248

Машина запущена, теперь надо подключиться к ней по VNC и записать образ.

Перенос образа на виртуальную машину

Если это первая виртуальная машина, то ее VNC слушает на 5901 порту, но порт этот закрыт iptables. Чтобы подключиться я предпочитаю старый трюк с пробросом портов через ssh:

$ ssh -L 127.0.0.1:5901:0.0.0.0:5901 <xcp_host_name_or_ip>
$ vncviewer 127.0.0.1:5901

Должно открыться окно терминала. Но! оно может/будет закрываться при изменении разрешения в процессе загрузки VM, это нормально, запустите viewer заново.

Виртуальная машина загрузилась. Теперь вставляем USB хранилище в хост машину и монтируем, например, в /mnt/.

Считая, что Ubuntu в VM имеет доступ к интернету, ставим sshfs и монтируем /mnt/ из хост машины в /mnt/ виртуалки:

$ sudo apt-get install sshfs
$ sshfs <xcp_host_name_or_ip>:/mnt/ /mnt/

Перенесем образ диска физического сервера (/mnt/linux_system_disk в виртуальной машине) на диск виртуальной машины (/dev/xvda). В этом нам поможет все тотже dd:
# dd if=/mnt/linux_system_disk of=/dev/xvda bs=512K

Ждем...

Когда образ будет перенесем, можно перезагрузить (в HVM режиме) виртуальную машину уже с диска физического сервера:
# init 6

Преобразование HVM машины в PVM

После того как виртуальная машина стартовала, ее надо переделать в PV. Для этого сначала поставим ядро с поддержкой xen domU, а затем поправим параметры VM.

Установка ядра с поддержкой domU (внутри VM):
apt-get install linux-image-2.6.32-5-xen-686

NB! Если вы не используете UUID в fstab, то в данный момент необходимо поменять sd*/hd* на vxd*.

Выключаем VM.

Правим параметры загрузки VM:
# xe vm-param-set uuid=b724c232-af4b-806d-cc35-efa273015248 HVM-boot-policy=""
# xe vm-param-set uuid=b724c232-af4b-806d-cc35-efa273015248 HVM-boot-params:=""
# xe vm-param-set uuid=b724c232-af4b-806d-cc35-efa273015248 PV-args="-- quiet console=hvc0"
# xe vm-param-set uuid=b724c232-af4b-806d-cc35-efa273015248 PV-bootloader="pygrub"

Все. Можно снова загружать VM (уже PVM).