[PATCH 0/2] PCI Passthrough: Add device to VM
by huoyuxin@linux.vnet.ibm.com
From: Yu Xin Huo <huoyuxin(a)linux.vnet.ibm.com>
Yu Xin Huo (2):
Passthrough: Add PCI Devices to VM
update po files
po/en_US.po | 15 ++++++
po/kimchi.pot | 15 ++++++
po/pt_BR.po | 15 ++++++
po/zh_CN.po | 15 ++++++
ui/css/theme-default/guest-edit.css | 86 ++++++++++++++++++++++++++++++++++-
ui/js/src/kimchi.api.js | 55 ++++++++++++++++++++++
ui/js/src/kimchi.guest_edit_main.js | 66 +++++++++++++++++++++++++++
ui/pages/guest-edit.html.tmpl | 28 +++++++++++
8 files changed, 293 insertions(+), 2 deletions(-)
10 years, 2 months
[PATCH 0/2 V2] Delete imported novnc code
by Aline Manera
If you don't get the second patch "Delete imported novnc code" by ML.
Please, check my upstream branch:
Repository: https://github.com/alinefm/kimchi/
Branch: alinefm/remove-novnc
V1 -> V2:
- Fix rpm build
- Rebase
Aline Manera (2):
Add novnc as Kimchi dependency
Delete imported novnc code
Makefile.am | 8 +-
configure.ac | 17 -
contrib/DEBIAN/control.in | 1 +
contrib/kimchi.spec.fedora.in | 17 +-
contrib/kimchi.spec.suse.in | 17 +-
docs/README.md | 7 +-
src/kimchi/Makefile.am | 1 +
src/kimchi/config.py.in | 5 +-
tests/Makefile.am | 1 +
tests/test_config.py.in | 5 +-
ui/css/Makefile.am | 6 +-
ui/css/fonts/Makefile.am | 18 -
ui/css/fonts/novnc/Makefile.am | 20 -
ui/css/fonts/novnc/Orbitron700.ttf | Bin 38580 -> 0 bytes
ui/css/fonts/novnc/Orbitron700.woff | Bin 17472 -> 0 bytes
ui/css/novnc/Makefile.am | 20 -
ui/css/novnc/base.css | 405 ------
ui/js/Makefile.am | 2 +-
ui/js/novnc/Makefile.am | 22 -
ui/js/novnc/base64.js | 115 --
ui/js/novnc/des.js | 273 ----
ui/js/novnc/display.js | 770 -----------
ui/js/novnc/input.js | 1946 ---------------------------
ui/js/novnc/jsunzip.js | 676 ----------
ui/js/novnc/main.js | 103 --
ui/js/novnc/rfb.js | 1866 -------------------------
ui/js/novnc/util.js | 381 ------
ui/js/novnc/web-socket-js/Makefile.am | 24 -
ui/js/novnc/web-socket-js/README.txt | 109 --
ui/js/novnc/web-socket-js/WebSocketMain.swf | Bin 177114 -> 0 bytes
ui/js/novnc/web-socket-js/swfobject.js | 4 -
ui/js/novnc/web-socket-js/web_socket.js | 391 ------
ui/js/novnc/websock.js | 422 ------
ui/js/novnc/webutil.js | 216 ---
ui/js/src/kimchi.api.js | 3 +-
ui/pages/vnc_auto.html.tmpl | 44 -
ui/pages/websockify/console.html | 2 +-
37 files changed, 23 insertions(+), 7894 deletions(-)
delete mode 100644 ui/css/fonts/Makefile.am
delete mode 100644 ui/css/fonts/novnc/Makefile.am
delete mode 100644 ui/css/fonts/novnc/Orbitron700.ttf
delete mode 100644 ui/css/fonts/novnc/Orbitron700.woff
delete mode 100644 ui/css/novnc/Makefile.am
delete mode 100644 ui/css/novnc/base.css
delete mode 100644 ui/js/novnc/Makefile.am
delete mode 100644 ui/js/novnc/base64.js
delete mode 100644 ui/js/novnc/des.js
delete mode 100644 ui/js/novnc/display.js
delete mode 100644 ui/js/novnc/input.js
delete mode 100755 ui/js/novnc/jsunzip.js
delete mode 100644 ui/js/novnc/main.js
delete mode 100644 ui/js/novnc/rfb.js
delete mode 100644 ui/js/novnc/util.js
delete mode 100644 ui/js/novnc/web-socket-js/Makefile.am
delete mode 100644 ui/js/novnc/web-socket-js/README.txt
delete mode 100644 ui/js/novnc/web-socket-js/WebSocketMain.swf
delete mode 100644 ui/js/novnc/web-socket-js/swfobject.js
delete mode 100644 ui/js/novnc/web-socket-js/web_socket.js
delete mode 100644 ui/js/novnc/websock.js
delete mode 100644 ui/js/novnc/webutil.js
delete mode 100644 ui/pages/vnc_auto.html.tmpl
--
1.9.3
10 years, 2 months
[PATCH] Bugfix#414: Cannot login by clicking on the login button
by Wen Wang
From: Wen Wang <wenwang(a)linux.vnet.ibm.com>
This patch fixes the bug that without moving the mouse, user cannot log
in kimchi by clicking on "Log in" button in Chrome as well as Opera.
Signed-off-by: Wen Wang <wenwang(a)linux.vnet.ibm.com>
---
ui/js/src/kimchi.login.js | 2 +-
1 files changed, 1 insertions(+), 1 deletions(-)
diff --git a/ui/js/src/kimchi.login.js b/ui/js/src/kimchi.login.js
index cacfa65..19b8691 100644
--- a/ui/js/src/kimchi.login.js
+++ b/ui/js/src/kimchi.login.js
@@ -68,5 +68,5 @@ kimchi.login_main = function() {
return false;
};
- $('#form-login').on('submit', login);
+ $('#btn-login').bind('click', login);
};
--
1.7.1
10 years, 2 months
[PATCH] Enable remote libvirtds v2
by bbaude@redhat.com
From: Brent Baude <bbaude(a)redhat.com>
v2 patch to remove static qemu assignments which will allow
a remote livirtd
---
src/kimchi/config.py.in | 2 +-
src/kimchi/featuretests.py | 8 ++++----
src/kimchi/kvmusertests.py | 2 +-
src/kimchi/model/libvirtconnection.py | 20 +++++++++++++++++---
src/kimchi/model/model.py | 5 +++--
src/kimchi/model/networks.py | 2 +-
tests/test_model.py | 16 ++++++++--------
7 files changed, 35 insertions(+), 20 deletions(-)
diff --git a/src/kimchi/config.py.in b/src/kimchi/config.py.in
index 91e5f48..6e24d11 100644
--- a/src/kimchi/config.py.in
+++ b/src/kimchi/config.py.in
@@ -62,7 +62,7 @@ def get_version():
def find_qemu_binary(find_emulator=False):
try:
- connect = libvirt.open('qemu:///system')
+ connect = libvirt.open(None)
except Exception, e:
raise Exception("Unable to get qemu binary location: %s" % e)
try:
diff --git a/src/kimchi/featuretests.py b/src/kimchi/featuretests.py
index 8964098..b7b482a 100644
--- a/src/kimchi/featuretests.py
+++ b/src/kimchi/featuretests.py
@@ -104,7 +104,7 @@ class FeatureTests(object):
conn = None
try:
FeatureTests.disable_screen_error_logging()
- conn = libvirt.open('qemu:///system')
+ conn = libvirt.open(None)
dom = conn.defineXML(xml)
dom.undefine()
return True
@@ -122,7 +122,7 @@ class FeatureTests(object):
xml = ET.tostring(obj)
return xml
try:
- conn = libvirt.open('qemu:///system')
+ conn = libvirt.open(None)
FeatureTests.disable_screen_error_logging()
conn.findStoragePoolSources('netfs', _get_xml(), 0)
except libvirt.libvirtError as e:
@@ -174,7 +174,7 @@ class FeatureTests(object):
def libvirt_support_fc_host():
try:
FeatureTests.disable_screen_error_logging()
- conn = libvirt.open('qemu:///system')
+ conn = libvirt.open(None)
pool = None
pool = conn.storagePoolDefineXML(SCSI_FC_XML, 0)
except libvirt.libvirtError as e:
@@ -194,7 +194,7 @@ class FeatureTests(object):
with RollbackContext() as rollback:
FeatureTests.disable_screen_error_logging()
rollback.prependDefer(FeatureTests.enable_screen_error_logging)
- conn = libvirt.open('qemu:///system')
+ conn = libvirt.open(None)
rollback.prependDefer(conn.close)
dom = conn.defineXML(SIMPLE_VM_XML)
rollback.prependDefer(dom.undefine)
diff --git a/src/kimchi/kvmusertests.py b/src/kimchi/kvmusertests.py
index 1ac2beb..2326727 100644
--- a/src/kimchi/kvmusertests.py
+++ b/src/kimchi/kvmusertests.py
@@ -49,7 +49,7 @@ class UserTests(object):
xml = cls.SIMPLE_VM_XML % (vm_name, vm_uuid)
with RollbackContext() as rollback:
- conn = libvirt.open('qemu:///system')
+ conn = libvirt.open(None)
rollback.prependDefer(conn.close)
dom = conn.defineXML(xml)
rollback.prependDefer(dom.undefine)
diff --git a/src/kimchi/model/libvirtconnection.py b/src/kimchi/model/libvirtconnection.py
index 80348a3..4fd2393 100644
--- a/src/kimchi/model/libvirtconnection.py
+++ b/src/kimchi/model/libvirtconnection.py
@@ -93,10 +93,13 @@ class LibvirtConnection(object):
except libvirt.libvirtError:
kimchi_log.error('Unable to connect to libvirt.')
if not retries:
- err = 'Libvirt is not available, exiting.'
- kimchi_log.error(err)
+ kimchi_log.error("Unable to establish connection "
+ "with libvirt. Please check "
+ "your libvirt URI which is often "
+ "defined in "
+ "/etc/libvirt/libvirt.conf")
cherrypy.engine.stop()
- raise
+ exit(1)
time.sleep(2)
for name in dir(libvirt.virConnect):
@@ -117,3 +120,14 @@ class LibvirtConnection(object):
# However the values need to be considered wisely to not affect
# hosts which are hosting a lot of virtual machines
return conn
+
+ def isQemuURI(self):
+ """
+ This method will return True or Value when the system libvirt
+ URI is a qemu based URI. For example:
+ qemu:///system or qemu+tcp://someipaddress/system
+ """
+ if self.get().getURI().startswith('qemu'):
+ return True
+ else:
+ return False
diff --git a/src/kimchi/model/model.py b/src/kimchi/model/model.py
index ac70852..566be66 100644
--- a/src/kimchi/model/model.py
+++ b/src/kimchi/model/model.py
@@ -38,12 +38,13 @@ DEFAULT_POOLS = {'default': {'path': '/var/lib/libvirt/images'},
class Model(BaseModel):
- def __init__(self, libvirt_uri='qemu:///system', objstore_loc=None):
+ def __init__(self, libvirt_uri=None, objstore_loc=None):
+
self.objstore = ObjectStore(objstore_loc)
self.conn = LibvirtConnection(libvirt_uri)
kargs = {'objstore': self.objstore, 'conn': self.conn}
- if 'qemu:///' in libvirt_uri:
+ if self.conn.isQemuURI():
for pool_name, pool_arg in DEFAULT_POOLS.iteritems():
self._default_pool_check(pool_name, pool_arg)
diff --git a/src/kimchi/model/networks.py b/src/kimchi/model/networks.py
index 0ea9449..43f9d50 100644
--- a/src/kimchi/model/networks.py
+++ b/src/kimchi/model/networks.py
@@ -41,7 +41,7 @@ KIMCHI_BRIDGE_PREFIX = 'kb'
class NetworksModel(object):
def __init__(self, **kargs):
self.conn = kargs['conn']
- if 'qemu:///' in self.conn.get().getURI():
+ if self.conn.isQemuURI():
self._default_network_check()
def _default_network_check(self):
diff --git a/tests/test_model.py b/tests/test_model.py
index 1f2e79c..3bb090e 100644
--- a/tests/test_model.py
+++ b/tests/test_model.py
@@ -457,7 +457,7 @@ class ModelTests(unittest.TestCase):
@unittest.skipUnless(utils.running_as_root(), 'Must be run as root')
def test_storagepool(self):
- inst = model.Model('qemu:///system', self.tmp_store)
+ inst = model.Model(None, self.tmp_store)
poolDefs = [
{'type': 'dir',
@@ -524,7 +524,7 @@ class ModelTests(unittest.TestCase):
@unittest.skipUnless(utils.running_as_root(), 'Must be run as root')
def test_storagevolume(self):
- inst = model.Model('qemu:///system', self.tmp_store)
+ inst = model.Model(None, self.tmp_store)
with RollbackContext() as rollback:
path = '/tmp/kimchi-images'
@@ -742,7 +742,7 @@ class ModelTests(unittest.TestCase):
@unittest.skipUnless(utils.running_as_root(), 'Must be run as root')
def test_template_clone(self):
- inst = model.Model('qemu:///system',
+ inst = model.Model(None,
objstore_loc=self.tmp_store)
with RollbackContext() as rollback:
orig_params = {'name': 'test-template', 'memory': 1024,
@@ -761,7 +761,7 @@ class ModelTests(unittest.TestCase):
@unittest.skipUnless(utils.running_as_root(), 'Must be run as root')
def test_template_update(self):
- inst = model.Model('qemu:///system',
+ inst = model.Model(None,
objstore_loc=self.tmp_store)
with RollbackContext() as rollback:
net_name = 'test-network'
@@ -801,7 +801,7 @@ class ModelTests(unittest.TestCase):
'new-test', params)
def test_vm_edit(self):
- inst = model.Model('qemu:///system',
+ inst = model.Model(None,
objstore_loc=self.tmp_store)
orig_params = {'name': 'test', 'memory': '1024', 'cpus': '1',
@@ -914,7 +914,7 @@ class ModelTests(unittest.TestCase):
@unittest.skipUnless(utils.running_as_root(), 'Must be run as root')
def test_network(self):
- inst = model.Model('qemu:///system', self.tmp_store)
+ inst = model.Model(None, self.tmp_store)
with RollbackContext() as rollback:
@@ -1240,7 +1240,7 @@ class ModelTests(unittest.TestCase):
@unittest.skipUnless(utils.running_as_root(), 'Must be run as root')
def test_get_hostinfo(self):
- inst = model.Model('qemu:///system',
+ inst = model.Model(None,
objstore_loc=self.tmp_store)
info = inst.host_lookup()
distro, version, codename = platform.linux_distribution()
@@ -1279,7 +1279,7 @@ class ModelTests(unittest.TestCase):
@unittest.skipUnless(utils.running_as_root(), 'Must be run as root')
def test_deep_scan(self):
- inst = model.Model('qemu:///system',
+ inst = model.Model(None,
objstore_loc=self.tmp_store)
with RollbackContext() as rollback:
path = '/tmp/kimchi-images/tmpdir'
--
1.9.3
10 years, 2 months
Error in the log when using VMs not created by kimchi
by Wen Wang
Hi all,
When kimchi deal with VMs that are not created by kimchi or build before
we introducing "metadata", an error "metadata not found: Requested
metadata element is not present" will continuously appear in the log, I
have one suggestion from the feedback that is it possible to have this
part removed? I mean the error message. One proper suggestion is
:"Whichever function is causing that can be redirected to device called
/dev/null so that it won't come to /var/log/messages".
Best Regards
Wang Wen
10 years, 2 months
[PATCH v11 0/6] Host Device Passthrough
by Zhou Zheng Sheng
Hi all,
Host device passthrough is to directly assign host device to guest
exclusively, so there is no virtualization overhead, and it improves
guest performance greatly. It's useful if you have a server with lots
of PCIe slots and cards.
This v11 patch series improve disto compatibility and device filtering.
Firstly, the patches adapt to Ubuntu 14.04, RHEL 6.5, RHEL 7, Fedora 20
and Fedora 19. It just relies on libvirt node-device API, kernel vfio
framework and /sys/kernel/iommu_group. So any distribution providing
these features should work. On old distributions like RHEL 6.5, they
are shipped with 2.6.X kernel which do not support vfio and sysfs iommu
group. We also try to be compatible, but as far as we tested, the PCI
passthrough feature using the traditional pci-stub + kvm approach is
buggy and not mature. So in this patch series, the back-end provides a
capability in /config/capabilities for the front-end to check, and then
freezes PCI passthrough web UI in this case. Didn't test on SuSe, just
because the author could not find a physical SuSe server. The patches
should work on SuSe as long as it provides the dependencies.
Secondly, there is 2 changes in PCI device filtering. Previously, we
only allowed to assign the "leaf" devices to guest. For example,
instead of assigning a USB controller, we assign the connected USB
device. We also made a PCI device whitelist according to the class
code. After some tests, we find that it's hardly useful if we only
allow "leaf" device, because in many cases the user wants to assign a
parent device. For example, the user may want to assign an HBA card to
guest, while there are many children LUNs under this card. The PCI
device code is also not a good way for checking if a device is suitable
to be passed through. There are too many vendors and devices, you'll
always find some "good" devices are out of the whitelist, and if we
grant the relared class code, it'll introduce "bad" devices.
So in this patch we just filter out video cards and PCI bridges. They
are not for passthrough absolutely. We also allow to passthrough a
parent device. The back-end provides API to check the affected devices
if you passthrough a particular one. The affected devices are the
devices in the same iommu group and their children devices.
As regard to the front-end, we only implemented PCI device passthrough,
PCI devices are the mostly useful and interesting devices to passthrough.
The back-end actually supports passing through LUNs and USB devices.
To test the patches, firstly reboot your host os, enable vt-d in BIOS.
Before loading Linux kernel, append "intel_iommu=on" to kernel
arguments. If you want to make it persistent, edit "grub.conf" and
append it. Then just apply the patch, start Kimchi daemon, edit a
shutdown guest, you'll see "Host PCI Device" tab. In the listing,
select "To Add", then click "+" besides one of the device. You'll find
PCI devices in the same group are also added. Then close the dialogue
and start the guest. In guest OS, "lspci" can show you the passthrough
devices.
In future, we plan to add more helpful information to assist user. For
example, when the user selects an NIC card, the front-end shows the
configured IP address. When the user selects an HBA card, the front-end
shows the related block devices such as sda sdb ... So the user can
avoid assigning a device in use by the host.
Yu Xin Huo (1):
Host device passthrough (Front-end): Add PCI Devices to VM
Zhou Zheng Sheng (5):
Host device passthrough: List all types of host devices
Host device passthrough: List eligible device to passthrough
Host device passthrough: Directly assign and dissmis host device from
VM
Host device passthrough: List VMs that are holding a host device
Host device passthrough: Add unit tests and documents
docs/API.md | 66 ++++++-
src/kimchi/API.json | 31 +++
src/kimchi/control/host.py | 7 +
src/kimchi/control/vm/hostdevs.py | 44 +++++
src/kimchi/featuretests.py | 10 +-
src/kimchi/i18n.py | 8 +
src/kimchi/mockmodel.py | 127 +++++++++++-
src/kimchi/model/config.py | 6 +-
src/kimchi/model/host.py | 48 +++--
src/kimchi/model/hostdev.py | 351 +++++++++++++++++++++++++++++++++
src/kimchi/model/libvirtstoragepool.py | 18 +-
src/kimchi/model/vmhostdevs.py | 324 ++++++++++++++++++++++++++++++
src/kimchi/rollbackcontext.py | 3 +
src/kimchi/xmlutils.py | 26 ++-
tests/test_model.py | 31 +++
tests/test_rest.py | 12 +-
tests/test_storagepool.py | 7 +-
ui/css/theme-default/guest-edit.css | 86 +++++++-
ui/js/src/kimchi.api.js | 55 ++++++
ui/js/src/kimchi.guest_edit_main.js | 81 ++++++++
ui/pages/guest-edit.html.tmpl | 28 +++
21 files changed, 1312 insertions(+), 57 deletions(-)
create mode 100644 src/kimchi/control/vm/hostdevs.py
create mode 100644 src/kimchi/model/hostdev.py
create mode 100644 src/kimchi/model/vmhostdevs.py
--
1.9.3
10 years, 2 months
[PATCHv5 0/2] Repository related fixes
by lvroyce@linux.vnet.ibm.com
From: Royce Lv <lvroyce(a)linux.vnet.ibm.com>
v3>v5,
fixed style error.
Royce Lv (2):
Fix: Avoid passing unexpected config params to repository manager
Fix: Add rollback to update repository
src/kimchi/API.json | 2 +-
src/kimchi/i18n.py | 1 +
src/kimchi/repositories.py | 40 +++++++++++++++++++++++++---------------
tests/test_model.py | 10 ++++++++--
4 files changed, 35 insertions(+), 18 deletions(-)
--
1.8.3.2
10 years, 2 months
[PATCH] Bug 440 Fix
by huoyuxin@linux.vnet.ibm.com
From: Yu Xin Huo <huoyuxin(a)linux.vnet.ibm.com>
2 Issues:
1. In menu widget, it handle the passin params incorrectly.
2. Filter out storage pools without any available volume.
Signed-off-by: Yu Xin Huo <huoyuxin(a)linux.vnet.ibm.com>
---
ui/js/src/kimchi.guest_storage_add.main.js | 2 +-
ui/js/widgets/select-menu.js | 6 +++---
2 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/ui/js/src/kimchi.guest_storage_add.main.js b/ui/js/src/kimchi.guest_storage_add.main.js
index a8c5acb..6e01d3e 100644
--- a/ui/js/src/kimchi.guest_storage_add.main.js
+++ b/ui/js/src/kimchi.guest_storage_add.main.js
@@ -61,7 +61,7 @@ kimchi.guest_storage_add_main = function() {
var options = [];
if (result && result.length) {
$.each(result, function(index, storagePool) {
- if ((storagePool.state=="active") && (storagePool.type !== 'kimchi-iso')) {
+ if ((storagePool.state=="active") && (storagePool.type !== 'kimchi-iso') && storagePool.nr_volumes) {
options.push({
label: storagePool.name,
value: storagePool.name
diff --git a/ui/js/widgets/select-menu.js b/ui/js/widgets/select-menu.js
index ad53200..c4b0209 100644
--- a/ui/js/widgets/select-menu.js
+++ b/ui/js/widgets/select-menu.js
@@ -36,8 +36,10 @@
var selectedClass = 'active';
var itemTag = 'li';
var item;
+ that.listControl.find('li').remove();
+ that.label.text("");
+ that.target.val("");
if (options.length > 0) {
- that.listControl.find('li').remove();
$.each(options, function(index, option) {
item = $('<' + itemTag + '>' + option.label +'</' + itemTag + '>');
item.data('value', option.value);
@@ -58,8 +60,6 @@
that.target.change();
}
});
- } else {
- kimchi.message.error.code('KCHAPI6006E');
}
},
--
1.7.1
10 years, 2 months
[PATCH 0/2] Delete imported websockify code
by Aline Manera
Aline Manera (2):
Add websockify as Kimchi dependency
Delete imported websockify code
contrib/DEBIAN/control.in | 1 +
contrib/kimchi.spec.fedora.in | 1 +
contrib/kimchi.spec.suse.in | 1 +
docs/README.md | 7 +-
src/kimchi/server.py | 2 +-
src/kimchi/vnc.py | 22 +-
src/kimchi/websocket.py | 982 ------------------------------------------
src/kimchi/websockify.py | 393 -----------------
8 files changed, 22 insertions(+), 1387 deletions(-)
delete mode 100644 src/kimchi/websocket.py
delete mode 100755 src/kimchi/websockify.py
--
1.9.3
10 years, 2 months
[PATCH] bug fix: Redirect user to the URL accessed prior to login
by Aline Manera
When a non-logged user tries to access a guest console:
https://localhost:8001/vnc_auto.html?port=64667&path=?token=dWJ1bnR1MTQuM...
He/she will be asked to login and then he/she must be redirected back to the
same URL accessed prior to login (ie, the guest console).
To do that, we use the "next" query parameter. But commit 22eba438 wrongly
overrided this logic by only querying the last tab visited which was
redirecting user to the Kimchi main page instead of the guest console.
Fix it.
Signed-off-by: Aline Manera <alinefm(a)linux.vnet.ibm.com>
---
ui/js/src/kimchi.login.js | 1 -
1 file changed, 1 deletion(-)
diff --git a/ui/js/src/kimchi.login.js b/ui/js/src/kimchi.login.js
index f9c9af0..cacfa65 100644
--- a/ui/js/src/kimchi.login.js
+++ b/ui/js/src/kimchi.login.js
@@ -56,7 +56,6 @@ kimchi.login_main = function() {
var lastPage = kimchi.cookie.get('lastPage');
var next_url = lastPage ? lastPage.replace(/\"/g,'') : "/";
}
- var next_url = lastPage ? lastPage.replace(/\"/g,'') : "/";
kimchi.cookie.set('roles',JSON.stringify(data.roles));
window.location.replace(next_url)
}, function() {
--
1.9.3
10 years, 2 months