[PATCH] UI: template edit page support scsi lun
by shaohef@linux.vnet.ibm.com
From: ShaoHe Feng <shaohef(a)linux.vnet.ibm.com>
User can choose a volume of scsi/iscsi pool from the template edit page.
Signed-off-by: ShaoHe Feng <shaohef(a)linux.vnet.ibm.com>
---
ui/js/src/kimchi.template_edit_main.js | 38 +++++++++++++++++++++++++++++-----
1 file changed, 33 insertions(+), 5 deletions(-)
diff --git a/ui/js/src/kimchi.template_edit_main.js b/ui/js/src/kimchi.template_edit_main.js
index 58f4506..b7d6cb6 100644
--- a/ui/js/src/kimchi.template_edit_main.js
+++ b/ui/js/src/kimchi.template_edit_main.js
@@ -32,19 +32,39 @@ kimchi.template_edit_main = function() {
$('input[name="disks"]').val(disks[0].size);
var options = [{label: 'VNC', value: 'vnc'}, {label: 'Spice', value: 'spice'}];
kimchi.select('template-edit-graphics-list', options);
+ var scsipools = {};
kimchi.listStoragePools(function(result) {
var options = [];
if (result && result.length) {
$.each(result, function(index, storagePool) {
if ((storagePool.state=="active") && (storagePool.type !== 'kimchi-iso')) {
- options.push({
- label: storagePool.name,
- value: '/storagepools/' + storagePool.name
- });
+ if ((storagePool.type == 'iscsi') || (storagePool.type == 'scsi')){
+ scsipools[storagePool.name] = [];
+ kimchi.listStorageVolumes(storagePool.name, function(result) {
+ if (result && result.length) {
+ $.each(result, function(index, storageVolume) {
+ options.push({
+ label: storagePool.name + '/' + storageVolume.name,
+ value: '/storagepools/' + storagePool.name + '/' + storageVolume.name
+ });
+ scsipools[storagePool.name].push(storageVolume)
+ });
+ }
+ kimchi.select('template-edit-storagePool-list', options);
+ });
+ }
+ else {
+ options.push({
+ label: storagePool.name,
+ value: '/storagepools/' + storagePool.name
+ });
+ }
}
});
}
- kimchi.select('template-edit-storagePool-list', options);
+ if ($.isEmptyObject(scsipools)) {
+ kimchi.select('template-edit-storagePool-list', options);
+ }
});
kimchi.listNetworks(function(result) {
if(result && result.length > 0) {
@@ -91,6 +111,14 @@ kimchi.template_edit_main = function() {
});
data['memory'] = Number(data['memory']);
data['cpus'] = Number(data['cpus']);
+ storagepool = data['storagepool'];
+ storageArray = storagepool.split("/");
+ if (storageArray.length > 3){
+ /* Support only 1 disk at this moment */
+ delete data["disks"][0].size;
+ data["disks"][0].volume = storageArray.pop();
+ data['storagepool'] = storageArray.join("/");
+ }
var networks = templateEditForm.serializeObject().networks;
if (networks instanceof Array) {
data.networks = networks;
--
1.8.5.3
10 years, 9 months
[PATCH] Help for scsi fibre channel
by Kersten Richter
Added help for scsi fibre channel on storage page.
Signed-off-by: Kersten Richter <kersten(a)us.ibm.com>
---
ui/pages/help/storage.dita | 10 +++++++---
1 files changed, 7 insertions(+), 3 deletions(-)
diff --git a/ui/pages/help/storage.dita b/ui/pages/help/storage.dita
index 97ee0cc..284eabb 100644
--- a/ui/pages/help/storage.dita
+++ b/ui/pages/help/storage.dita
@@ -65,7 +65,7 @@ the following:<dl><dlentry>
<li>In the <uicontrol>Storage pool name</uicontrol> field, type the
name to be used to identify the storage pool.</li>
<li>In the <uicontrol>Storage pool type</uicontrol> list, select the
-type: <dl rev="rev1"><dlentry>
+type: <dl><dlentry>
<dt><uicontrol>DIR</uicontrol></dt>
<dd>Specifies a directory pool. When selecting <uicontrol>DIR</uicontrol>,
type the <uicontrol>Storage path</uicontrol> (file path to the storage
@@ -85,10 +85,14 @@ the iSCSI server. You can optionally select to add iSCSI authentication.</dd>
<dt><uicontrol>Logical</uicontrol></dt>
<dd>Specifies a logical volume storage pool. Select the location to
the device in <uicontrol>Device path</uicontrol>.</dd>
-</dlentry></dl><?Pub Caret 591?></li>
+</dlentry><dlentry>
+<dt><uicontrol>SCSI Fibre Channel</uicontrol></dt>
+<dd>Specifies a pool based on an SCSI Fibre Channel. Select which
+SCSI adapter to use.</dd>
+</dlentry></dl><?Pub Caret 0?></li>
<li>Click <uicontrol>Create</uicontrol>.</li>
</ol> </p>
</csbody>
</cshelp>
</cshelp>
-<?Pub *0000003764?>
+<?Pub *0000003914?>
--
1.7.1
10 years, 9 months
[V2 0/2] Fibre Channel SCSI Storage Pool UI
by huoyuxin@linux.vnet.ibm.com
From: Yu Xin Huo <huoyuxin(a)linux.vnet.ibm.com>
V1 - V2: Address comments of Message Id, menu width
Yu Xin Huo (2):
Fibre Channel SCSI Storage Pool UI
Add translation for FC SCSI Storage Pool
po/en_US.po | 6 +++++
po/kimchi.pot | 6 +++++
po/pt_BR.po | 6 +++++
po/zh_CN.po | 6 +++++
ui/css/theme-default/storage.css | 2 +-
ui/js/src/kimchi.api.js | 14 +++++++++++++
ui/js/src/kimchi.storagepool_add_main.js | 31 ++++++++++++++++++++++++++++-
ui/pages/i18n.html.tmpl | 2 +-
ui/pages/storagepool-add.html.tmpl | 12 +++++++++++
9 files changed, 81 insertions(+), 4 deletions(-)
10 years, 9 months
[PATCH] Fix for repositories help
by Kersten Richter
Edited file host.dita
Signed-off-by: Kersten Richter <kersten(a)us.ibm.com>
---
ui/pages/help/host.dita | 15 ++++++++++-----
1 files changed, 10 insertions(+), 5 deletions(-)
diff --git a/ui/pages/help/host.dita b/ui/pages/help/host.dita
index 9f42575..cd693b3 100644
--- a/ui/pages/help/host.dita
+++ b/ui/pages/help/host.dita
@@ -43,9 +43,14 @@ All</uicontrol>. You cannot select individual packages for updates.</dd>
<dd>This section displays repositories that are associated with the
host system. You can add, enable, edit, or remove repositories. Adding
a repository associates it with the host system while enabling a repository
-allows the host to access it. You can add <filepath>yum</filepath> repositories
-and <filepath>deb</filepath> repositories. You may not be able to
-add a <uicontrol>GPG Check</uicontrol> to all types of repositories.</dd>
+allows the host to access it. If your system is Red Hat Enterprise
+Linux or Fedora, you can add <filepath>yum</filepath> repositories.
+If your system is Ubuntu or Debian, then add <filepath>deb</filepath> repositories.<p>If
+you are working with yum repositories, you can add a GPG check to
+verify that a package from this repository have not been corrupted.
+Select a repository and then <uicontrol>Edit</uicontrol>. Select <uicontrol>Yes</uicontrol> to
+enable GPG Check and then enter a URL to the GPG key file for the
+repository.</p><?Pub Caret 156?></dd>
</dlentry><dlentry>
<dt>Debug reports</dt>
<dd>This section displays debug reports, including name and file path.
@@ -58,8 +63,8 @@ configuration and diagnostic information, such as the running kernel
version, loaded modules, and system and service configuration files.
The command also runs external programs to collect further information
and stores this output in the resulting archive.</p> </dd>
-</dlentry></dl><?Pub Caret 901?></p>
+</dlentry></dl></p>
</csbody>
<?tm 1392659967 1?>
</cshelp>
-<?Pub *0000003172?>
+<?Pub *0000003492?>
--
1.7.1
10 years, 9 months
[PATCH] Added help for repositories
by Kersten Richter
Added help for yum and deb repositories to the host.dita file.
Signed-off-by: Kersten Richter <kersten(a)us.ibm.com>
---
ui/pages/help/host.dita | 12 ++++++++++--
1 files changed, 10 insertions(+), 2 deletions(-)
diff --git a/ui/pages/help/host.dita b/ui/pages/help/host.dita
index 1b60b27..9f42575 100644
--- a/ui/pages/help/host.dita
+++ b/ui/pages/help/host.dita
@@ -39,6 +39,14 @@ have updates available, including package name, version, architecture,
and repository. You can update all of the packages listed by selecting <uicontrol>Update
All</uicontrol>. You cannot select individual packages for updates.</dd>
</dlentry><dlentry>
+<dt>Repositories</dt>
+<dd>This section displays repositories that are associated with the
+host system. You can add, enable, edit, or remove repositories. Adding
+a repository associates it with the host system while enabling a repository
+allows the host to access it. You can add <filepath>yum</filepath> repositories
+and <filepath>deb</filepath> repositories. You may not be able to
+add a <uicontrol>GPG Check</uicontrol> to all types of repositories.</dd>
+</dlentry><dlentry>
<dt>Debug reports</dt>
<dd>This section displays debug reports, including name and file path.
You can select from options to generate a new report, or rename, remove,
@@ -50,8 +58,8 @@ configuration and diagnostic information, such as the running kernel
version, loaded modules, and system and service configuration files.
The command also runs external programs to collect further information
and stores this output in the resulting archive.</p> </dd>
-</dlentry></dl><?Pub Caret 693?></p>
+</dlentry></dl><?Pub Caret 901?></p>
</csbody>
<?tm 1392659967 1?>
</cshelp>
-<?Pub *0000002695?>
+<?Pub *0000003172?>
--
1.7.1
10 years, 9 months
[PATCH 0/7] Updates to Manage Repositories
by Adam King
This series updates HLWs original set to work with the new repo management
posted by Aline. It also depends on [PATCH] bug fix: Allow user specifies the repository name when adding a new YUM repo
Adam King (2):
Update form.serializeObject method to handle deep object serialization
Update grid widget to populate fields from deeply nested objects
Hongliang Wang (5):
Repository Management - Add i18n Strings
Repository Management - Add API Support
Repository Management - Add Repository Support
Repository Management - Edit Repository Support
Repository Management - Integrate into Host Tab
po/POTFILES.in | 2 +
ui/css/theme-default/host.css | 8 ++
ui/css/theme-default/repository-add.css | 39 +++++++
ui/css/theme-default/repository-edit.css | 87 +++++++++++++++
ui/js/src/kimchi.api.js | 76 ++++++++++++-
ui/js/src/kimchi.form.js | 66 +++++++++--
ui/js/src/kimchi.grid.js | 22 +++-
ui/js/src/kimchi.host.js | 181 +++++++++++++++++++++++++++++++
ui/js/src/kimchi.repository_add_main.js | 91 ++++++++++++++++
ui/js/src/kimchi.repository_edit_main.js | 94 ++++++++++++++++
ui/pages/i18n.html.tmpl | 19 ++++
ui/pages/repository-add.html.tmpl | 108 ++++++++++++++++++
ui/pages/repository-edit.html.tmpl | 115 ++++++++++++++++++++
ui/pages/tabs/host.html.tmpl | 13 +++
14 files changed, 905 insertions(+), 16 deletions(-)
create mode 100644 ui/css/theme-default/repository-add.css
create mode 100644 ui/css/theme-default/repository-edit.css
create mode 100644 ui/js/src/kimchi.repository_add_main.js
create mode 100644 ui/js/src/kimchi.repository_edit_main.js
create mode 100644 ui/pages/repository-add.html.tmpl
create mode 100644 ui/pages/repository-edit.html.tmpl
--
1.8.1.4
10 years, 9 months
[PATCH] Template: Check if the host supports Spice
by zhshzhou@linux.vnet.ibm.com
From: Zhou Zheng Sheng <zhshzhou(a)linux.vnet.ibm.com>
On some architecture of hosts, such as ppc64 hosts, QEMU is not compiled
with Spice. So we'd like to disable Spice on these hosts. Unfortunately
even QEMU is not compiled with Spice, 'qemu --help' still prints Spice
related help. In this patch we use ldd to determine if QEMU is linked to
libspice-server.so, and provide this information through the
/config/capabilities URI. The front-end code then checks the capabilities
and add or remove Spice from the graphic options respectively.
Signed-off-by: Zhou Zheng Sheng <zhshzhou(a)linux.vnet.ibm.com>
---
docs/API.md | 1 +
src/kimchi/config.py.in | 10 +++++++---
src/kimchi/mockmodel.py | 1 +
src/kimchi/model/config.py | 15 ++++++++++++++-
tests/test_rest.py | 1 +
ui/js/src/kimchi.api.js | 6 ++++--
ui/js/src/kimchi.template_edit_main.js | 13 +++++++++++--
7 files changed, 39 insertions(+), 8 deletions(-)
diff --git a/docs/API.md b/docs/API.md
index a380558..3711fbe 100644
--- a/docs/API.md
+++ b/docs/API.md
@@ -573,6 +573,7 @@ creation.
* **GET**: Retrieve capabilities information
* libvirt_stream_protocols: list of which network protocols are accepted
for iso streaming by libvirt
+ * qemu_spice: True, if QEMU supports Spice; False, otherwise
* qemu_stream: True, if QEMU supports ISO streaming; False, otherwise
* screenshot: True, if libvirt stream functionality can create screenshot
file without problems; False, otherwise or None if the functionality was
diff --git a/src/kimchi/config.py.in b/src/kimchi/config.py.in
index cf8497a..d15a6b5 100644
--- a/src/kimchi/config.py.in
+++ b/src/kimchi/config.py.in
@@ -54,15 +54,19 @@ def get_debugreports_path():
return os.path.join(paths.state_dir, 'debugreports')
-def find_qemu_binary():
+def find_qemu_binary(find_emulator=False):
try:
connect = libvirt.open('qemu:///system')
except Exception, e:
raise Exception("Unable to get qemu binary location: %s" % e)
try:
xml = connect.getCapabilities()
- expr = "/capabilities/guest/arch[@name='%s']\
- /domain[@type='kvm']/emulator" % platform.machine()
+ if find_emulator:
+ expr = "/capabilities/guest/arch[@name='%s']\
+ /emulator" % platform.machine()
+ else:
+ expr = "/capabilities/guest/arch[@name='%s']\
+ /domain[@type='kvm']/emulator" % platform.machine()
res = xpath_get_text(xml, expr)
location = res[0]
except Exception, e:
diff --git a/src/kimchi/mockmodel.py b/src/kimchi/mockmodel.py
index faf1049..7b567cb 100644
--- a/src/kimchi/mockmodel.py
+++ b/src/kimchi/mockmodel.py
@@ -65,6 +65,7 @@ class MockModel(object):
def capabilities_lookup(self, *ident):
return {'libvirt_stream_protocols':
['http', 'https', 'ftp', 'ftps', 'tftp'],
+ 'qemu_spice': True,
'qemu_stream': True,
'screenshot': True,
'system_report_tool': True,
diff --git a/src/kimchi/model/config.py b/src/kimchi/model/config.py
index a6a25e4..7f553ea 100644
--- a/src/kimchi/model/config.py
+++ b/src/kimchi/model/config.py
@@ -23,6 +23,7 @@ import cherrypy
from kimchi.basemodel import Singleton
from kimchi.config import config as kconfig
+from kimchi.config import find_qemu_binary
from kimchi.distroloader import DistroLoader
from kimchi.exception import NotFoundError
from kimchi.featuretests import FeatureTests
@@ -30,7 +31,7 @@ from kimchi.model.debugreports import DebugReportsModel
from kimchi.repositories import Repositories
from kimchi.screenshot import VMScreenshot
from kimchi.swupdate import SoftwareUpdate
-from kimchi.utils import check_url_path, kimchi_log
+from kimchi.utils import check_url_path, kimchi_log, run_command
class ConfigModel(object):
@@ -72,6 +73,17 @@ class CapabilitiesModel(object):
kimchi_log.info("*** Feature tests completed ***")
_set_capabilities.priority = 90
+ def _qemu_support_spice(self):
+ qemu_path = find_qemu_binary(find_emulator=True)
+ out, err, rc = run_command(['ldd', qemu_path])
+ if rc != 0:
+ kimchi_log.error('Failed to find qemu binary dependencies: %s', err)
+ return False
+ for line in out.split('\n'):
+ if line.lstrip().startswith('libspice-server.so'):
+ return True
+ return False
+
def lookup(self, *ident):
report_tool = DebugReportsModel.get_system_report_tool()
try:
@@ -89,6 +101,7 @@ class CapabilitiesModel(object):
repo_mngt_tool = repo._pkg_mnger.TYPE
return {'libvirt_stream_protocols': self.libvirt_stream_protocols,
+ 'qemu_spice': self._qemu_support_spice(),
'qemu_stream': self.qemu_stream,
'screenshot': VMScreenshot.get_stream_test_result(),
'system_report_tool': bool(report_tool),
diff --git a/tests/test_rest.py b/tests/test_rest.py
index 3f2e449..ca4eeed 100644
--- a/tests/test_rest.py
+++ b/tests/test_rest.py
@@ -1346,6 +1346,7 @@ class RestTests(unittest.TestCase):
conf = json.loads(resp)
self.assertIn('libvirt_stream_protocols', conf)
self.assertIn('qemu_stream', conf)
+ self.assertIn('qemu_spice', conf)
self.assertIn('screenshot', conf)
self.assertIn('system_report_tool', conf)
self.assertIn('update_tool', conf)
diff --git a/ui/js/src/kimchi.api.js b/ui/js/src/kimchi.api.js
index 4310435..075b9d0 100644
--- a/ui/js/src/kimchi.api.js
+++ b/ui/js/src/kimchi.api.js
@@ -49,14 +49,16 @@ var kimchi = {
* Get host capabilities
* suc: callback if succeed err: callback if failed
*/
- getCapabilities : function(suc, err) {
+ getCapabilities : function(suc, err, done) {
+ done = typeof done !== 'undefined' ? done: function(){};
kimchi.requestJSON({
url : "/config/capabilities",
type : "GET",
contentType : "application/json",
dataType : "json",
success: suc,
- error: err
+ error: err,
+ complete: done
});
},
diff --git a/ui/js/src/kimchi.template_edit_main.js b/ui/js/src/kimchi.template_edit_main.js
index 58f4506..9c429c4 100644
--- a/ui/js/src/kimchi.template_edit_main.js
+++ b/ui/js/src/kimchi.template_edit_main.js
@@ -30,8 +30,17 @@ kimchi.template_edit_main = function() {
}
var disks = template.disks;
$('input[name="disks"]').val(disks[0].size);
- var options = [{label: 'VNC', value: 'vnc'}, {label: 'Spice', value: 'spice'}];
- kimchi.select('template-edit-graphics-list', options);
+
+ var options = [{label: 'VNC', value: 'vnc'}];
+ kimchi.getCapabilities(function(result) {
+ if (result.qemu_spice == true) {
+ options.push({label: 'Spice', value: 'spice'})
+ }
+ }, function() {
+ }, function(){
+ kimchi.select('template-edit-graphics-list', options);
+ });
+
kimchi.listStoragePools(function(result) {
var options = [];
if (result && result.length) {
--
1.8.5.3
10 years, 9 months
[PATCH] Logical Storage Pool: Detect and Enumerate Multipath Block Devices
by zhshzhou@linux.vnet.ibm.com
From: Zhou Zheng Sheng <zhshzhou(a)linux.vnet.ibm.com>
When creating a logical storage pool Kimci ignores multipath block
devices. This is on purpose because at the time the kimchi.disks was
implemented, there was not enough time to test every kind of devices.
This patch adds the missing support for multipath block devices. After
this patch, the kimchi.disks will include multipath devices in the
available partition list. The front-end code is also changed
accordingly.
Signed-off-by: Zhou Zheng Sheng <zhshzhou(a)linux.vnet.ibm.com>
---
src/kimchi/disks.py | 20 +++++++++++++++++++-
ui/js/src/kimchi.storagepool_add_main.js | 3 ++-
2 files changed, 21 insertions(+), 2 deletions(-)
diff --git a/src/kimchi/disks.py b/src/kimchi/disks.py
index ce0c5bb..6817ab4 100644
--- a/src/kimchi/disks.py
+++ b/src/kimchi/disks.py
@@ -17,6 +17,7 @@
# License along with this library; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+import errno
import re
import subprocess
@@ -27,8 +28,25 @@ from kimchi.exception import OperationFailed
from kimchi.utils import kimchi_log
+def _get_friendly_dm_path(maj_min):
+ """ Returns user friendly dm path given the device number 'major:min' """
+ dm_name = "/sys/dev/block/%s/dm/name" % maj_min
+ try:
+ with open(dm_name) as dm_f:
+ content = dm_f.read().rstrip('\n')
+ except IOError as e:
+ if not e.errno == errno.ENOENT:
+ raise
+ return None
+ return "/dev/mapper/" + content
+
+
def _get_dev_node_path(maj_min):
""" Returns device node path given the device number 'major:min' """
+ dm_path = _get_friendly_dm_path(maj_min)
+ if dm_path is not None:
+ return dm_path
+
uevent = "/sys/dev/block/%s/uevent" % maj_min
with open(uevent) as ueventf:
content = ueventf.read()
@@ -137,7 +155,7 @@ def get_partitions_names():
# leaf means a partition, a disk has no partition, or a disk not held
# by any multipath device. Physical volume belongs to no volume group
# is also listed. Extended partitions should not be listed.
- if not (dev['type'] in ['part', 'disk'] and
+ if not (dev['type'] in ['part', 'disk', 'mpath'] and
dev['fstype'] in ['', 'LVM2_member'] and
dev['mountpoint'] == "" and
_get_vgname(devNodePath) == "" and
diff --git a/ui/js/src/kimchi.storagepool_add_main.js b/ui/js/src/kimchi.storagepool_add_main.js
index 10833be..f3b85d2 100644
--- a/ui/js/src/kimchi.storagepool_add_main.js
+++ b/ui/js/src/kimchi.storagepool_add_main.js
@@ -28,7 +28,8 @@ kimchi.initStorageAddPage = function() {
var deviceHtml = $('#partitionTmpl').html();
var listHtml = '';
$.each(data, function(index, value) {
- if (value.type === 'part' || value.type === 'disk') {
+ valid_types = {part: 'part', disk: 'disk', mpath: 'mpath'};
+ if (value.type in valid_types) {
listHtml += kimchi.template(deviceHtml, value);
}
});
--
1.8.5.3
10 years, 9 months
[PATCH V2 ] Adds 'in_use' info to API.md
by Rodrigo Trujillo
The network lookup function returns the new field "in_use". API.md was
not updated properly. This patch fixes this.
Signed-off-by: Rodrigo Trujillo <rodrigo.trujillo(a)linux.vnet.ibm.com>
---
docs/API.md | 1 +
1 file changed, 1 insertion(+)
diff --git a/docs/API.md b/docs/API.md
index b8f941a..a9ac15b 100644
--- a/docs/API.md
+++ b/docs/API.md
@@ -485,6 +485,7 @@ A interface represents available interface on host.
* active: The Network is ready for use
* inactive: The Network is not available
* autostart: Network autostart onboot
+ * in_use: Indicates ('true') if some guest is attached to this network and 'false' otherwise.
* vms: all vms attached to this network
* subnet: Network segment in slash-separated format with ip address and prefix
* dhcp: DHCP services on the virtual network is enabled.
--
1.8.5.3
10 years, 9 months
[PATCH 1/2] Bug fix: specify the class attribute when change pool state dot.
by shaohef@linux.vnet.ibm.com
From: ShaoHe Feng <shaohef(a)linux.vnet.ibm.com>
After we list the storage pools, it will change other element with the
same class attribute in other page.
Signed-off-by: ShaoHe Feng <shaohef(a)linux.vnet.ibm.com>
Signed-off-by: Hongliang Wang <hlwang(a)linux.vnet.ibm.com>
---
ui/js/src/kimchi.storage_main.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/ui/js/src/kimchi.storage_main.js b/ui/js/src/kimchi.storage_main.js
index c2c721d..6052510 100644
--- a/ui/js/src/kimchi.storage_main.js
+++ b/ui/js/src/kimchi.storage_main.js
@@ -49,7 +49,7 @@ kimchi.storageBindClick = function() {
}
});
- $('.active').each(function(index) {
+ $('.list-storage .storage-state .active').each(function(index) {
if ('active' === $(this).data('state')) {
$(this).show();
} else {
--
1.8.5.3
10 years, 9 months