[PATCH] [Wok] Fixes loading message position inside panel-groups
by sguimaraes943@gmail.com
From: Samuel Guimarães <sguimaraes943(a)gmail.com>
This patch fixes a minor issue with the "Loading..." backdrop mask covering panel titles in Ginger
Samuel Guimarães (1):
Fixes loading message position inside panel-groups
ui/css/src/wok.scss | 4 ++++
ui/css/wok.css | 4 ++++
2 files changed, 8 insertions(+)
--
1.9.3
8 years, 4 months
[PATCHv3] [Kimchi] Add UI netboot support for adding templates; add loading icon when switching back to image src
by Socorro Stoppler
v3:
Addressed the issue pointed out by Aline regarding the loading icon
not going away even after the list of isos have finished loading
when switching to the image template radio button.
Also fixed the double scrollbars in the panel that Samuel pointed
out.
v2:
Add loading icon when switching back to image src radio button
per feedback from pvital
v1:
Add UI netboot support for adding templates
Signed-off-by: Socorro Stoppler <socorro(a)linux.vnet.ibm.com>
---
ui/css/kimchi.css | 5 +++
ui/css/src/modules/_templates.scss | 4 ++
ui/js/src/kimchi.template_add_main.js | 78 +++++++++++++++++++++++++++++++----
ui/pages/template-add.html.tmpl | 45 +++++++++++++-------
4 files changed, 107 insertions(+), 25 deletions(-)
diff --git a/ui/css/kimchi.css b/ui/css/kimchi.css
index 261d203..34347c2 100644
--- a/ui/css/kimchi.css
+++ b/ui/css/kimchi.css
@@ -1730,6 +1730,11 @@ body.wok-gallery {
display: none;
}
+#template-add-window #loading-isos {
+ top: 0 !important;
+ z-index: 4 !important;
+}
+
/* VM List View classes*/
#templates-root-container .grid-control input[type="text"] {
height: 38px;
diff --git a/ui/css/src/modules/_templates.scss b/ui/css/src/modules/_templates.scss
index 2f58385..d8f3da8 100644
--- a/ui/css/src/modules/_templates.scss
+++ b/ui/css/src/modules/_templates.scss
@@ -270,6 +270,10 @@
.tooltip-arrow {
display: none;
}
+ #loading-isos {
+ top: 0 !important;
+ z-index: 4 !important;
+ }
}
diff --git a/ui/js/src/kimchi.template_add_main.js b/ui/js/src/kimchi.template_add_main.js
index 7bdfc51..341bab3 100644
--- a/ui/js/src/kimchi.template_add_main.js
+++ b/ui/js/src/kimchi.template_add_main.js
@@ -17,7 +17,8 @@
*/
kimchi.template_add_main = function() {
"use strict";
- $('#loading-isos').removeClass('hidden');
+ var currentPage = 'iso-local-box';
+ $('#loading-isos').fadeIn(100, function() {});
kimchi.deepScanHandler = null;
var isos = [];
var local_isos = [];
@@ -54,6 +55,7 @@ kimchi.template_add_main = function() {
$('#local-iso-field').hide();
$('#select-all-local-iso').prop('checked', false);
$('#btn-template-local-iso-create').attr('disabled', 'disabled');
+ $('#btn-template-netboot-create').attr('disabled', 'disabled');
$('#iso-search').hide();
$('#iso-more').hide();
$('#iso-search-loading').hide();
@@ -65,6 +67,7 @@ kimchi.template_add_main = function() {
$('#iso-url').val(''); // 4 - Remote folder path text
$('#btn-template-file-create').attr('disabled', 'disabled').css('display', 'inline-block'); // 1 - Folder path
$('#btn-template-local-iso-create').attr('disabled', 'disabled').css('display', 'none'); // 2 - Selected ISOs
+ $('#btn-template-netboot-create').attr('disabled', 'disabled').css('display', 'none'); // 3 - Netboot
$('#select-all-local-iso, #select-all-remote-iso').prop('checked', false); // False to all select-all checkboxes
$('#list-local-iso [type="checkbox"], #list-remote-iso [type="checkbox"]').prop('checked', false); // False to all list checkboxes
};
@@ -107,6 +110,7 @@ kimchi.template_add_main = function() {
$('#iso-url').val('');
$('#btn-template-file-create').attr('disabled', 'disabled').css('display', 'inline-block');
$('#btn-template-local-iso-create').attr('disabled', 'disabled').css('display', 'none'); // 2 - Selected ISOs
+ $('#btn-template-netboot-create').attr('disabled', 'disabled').css('display', 'none'); // 3 - Netboot
$('#select-all-local-iso, #select-all-remote-iso').prop('checked', false); // False to all select-all checkboxes
$('#list-local-iso [type="checkbox"], #list-remote-iso [type="checkbox"]').prop('checked', false); // False to all list checkboxes
};
@@ -125,6 +129,7 @@ kimchi.template_add_main = function() {
} else {
$('#btn-template-file-create').attr('disabled', 'disabled');
}
+ $('#btn-template-netboot-create').attr('disabled', 'disabled').css('display', 'none'); // 3 - Netboot
});
initLocalIsoField();
@@ -144,9 +149,7 @@ kimchi.template_add_main = function() {
});
}, function(err) {
wok.message.error(err.responseJSON.reason, '#local-iso-error-container');
- $('#loading-isos').fadeOut(300, function() {
- $('#loading-isos').addClass('hidden');
- });
+ $('#loading-isos').fadeOut(300, function() {});
});
$('#template-add-window .modal-body .template-pager').animate({
@@ -232,12 +235,11 @@ kimchi.template_add_main = function() {
$('#iso-file').parent().removeClass('has-error');
$('#btn-template-file-create').attr('disabled', 'disabled').css('display', 'none'); // 1 - Folder path
-
$('#btn-template-local-iso-create').removeAttr('disabled').css('display', 'inline-block'); // 2 - Selected ISOs
-
} else {
$('#btn-template-local-iso-create').attr('disabled', 'disabled');
}
+ $('#btn-template-netboot-create').attr('disabled', 'disabled').css('display', 'none'); // 3 - Netboot
});
$('#list-local-iso').on('click', '[type="checkbox"]', function() {
@@ -248,6 +250,7 @@ kimchi.template_add_main = function() {
$('#btn-template-file-create').attr('disabled', 'disabled').css('display', 'none'); // 1 - Folder path
$('#btn-template-local-iso-create').attr('disabled', 'disabled').css('display', 'inline-block'); // 2 - Selected ISOs
+ $('#btn-template-netboot-create').attr('disabled', 'disabled').css('display', 'none'); // 3 - Netboot
if (checkedLength) {
$('#btn-template-local-iso-create').removeAttr('disabled');
@@ -260,6 +263,16 @@ kimchi.template_add_main = function() {
}
});
+ $('#btn-template-netboot-create').click(function() {
+ var data = {
+ "source_media": {"type": "netboot"}
+ };
+ addTemplate(data, function() {
+ $('#btn-template-netboot-create').text(i18n['KCHAPI6005M']);
+ $('#btn-template-netboot-create').prop('disabled', false);
+ });
+ });
+
$('#btn-template-local-iso-create').click(function() {
$('input', '#iso-file-box').prop('disabled', true);
$('#btn-template-local-iso-create').text(i18n['KCHAPI6008M']);
@@ -309,11 +322,9 @@ kimchi.template_add_main = function() {
$('#iso-url').val('');
$('#btn-template-file-create').attr('disabled', 'disabled').css('display', 'none'); // 1 - Folder path
-
$('#btn-template-local-iso-create').attr('disabled', 'disabled').css('display', 'none'); // 2 - Selected ISOs
-
+ $('#btn-template-netboot-create').attr('disabled', 'disabled').css('display', 'none'); // 3 - Netboot
$('#select-all-local-iso, #select-all-remote-iso').prop('checked', false); // False to all select-all checkboxes
-
$('#list-local-iso [type="checkbox"], #list-remote-iso [type="checkbox"]').prop('checked', false); // False to all list checkboxes
};
@@ -350,6 +361,55 @@ kimchi.template_add_main = function() {
$('input#iso-url').parent().toggleClass('has-error', !isValid);
}, 0);
});
+
+ $('#image-src').change(function() {
+ if (this.checked) {
+ if (currentPage === 'netboot-path') {
+ kimchi.switchPage(currentPage, 'iso-local-box', 'right');
+ }
+ currentPage = 'iso-local-box';
+ $('#template-add-window .modal-body .template-pager').animate({
+ height: "700px"
+ }, 400);
+ initLocalIsoField();
+ initIsoFileField();
+ $('#loading-isos').fadeIn(100, function() {});
+ kimchi.listIsos(function(local_isos) { //local ISOs
+ kimchi.listDistros(function(remote_isos) { //remote ISOs
+
+ isos = local_isos.concat(remote_isos); //all isos
+ if (isos && isos.length) {
+ showLocalIsoField(isos);
+ $('#iso-more').show();
+ } else {
+ $('#iso-search').show();
+ }
+ $('#loading-isos').fadeOut(100, function() {});
+ });
+ }, function(err) {
+ wok.message.error(err.responseJSON.reason, '#local-iso-error-container');
+ $('#loading-isos').fadeOut(300, function() {});
+ });
+ setupFilters();
+ enabledRemoteIso();
+ }
+ });
+
+ $('#netboot-src').change(function() {
+ if (this.checked) {
+ if (currentPage === 'iso-local-box') {
+ kimchi.switchPage(currentPage, 'netboot-path', 'left');
+ }
+ currentPage = 'netboot-path';
+ $('#template-add-window .modal-body .template-pager').animate({
+ height: "300px"
+ }, 400);
+ $('#btn-template-file-create').attr('disabled', 'disabled').css('display', 'none'); // 1 - Folder path
+ $('#btn-template-local-iso-create').attr('disabled', 'disabled').css('display', 'none'); // 2 - Selected ISOs
+ $('#btn-template-netboot-create').removeAttr('disabled').css('display', 'inline-block'); // 3 - Netboot
+ }
+ });
+
//do create
var addTemplate = function(data, callback) {
kimchi.createTemplate(data, function() {
diff --git a/ui/pages/template-add.html.tmpl b/ui/pages/template-add.html.tmpl
index 5584f00..d4c7216 100644
--- a/ui/pages/template-add.html.tmpl
+++ b/ui/pages/template-add.html.tmpl
@@ -30,18 +30,17 @@
<div class="modal-body">
<div class="template-modal-container">
<div id="alert-modal-container"></div>
+ <div>
+ <h5>$_("Where is the source media for this template? ")</h5>
+ <input type="radio" checked="checked" name="iso-source" id="image-src" value="image-src" class="wok-radio">
+ <label for="image-src">$_("Image Template")</label>
+ <input type="radio" name="iso-source" id="netboot-src" value="netboot-src" class="wok-radio">
+ <label for="netboot-src">$_("Netboot Template")</label>
+ </div>
</div>
<div class="template-pager">
<div class="page-list">
<div class="page" id="iso-local-box">
- <div id="loading-isos">
- <div class="wok-mask-loader-container">
- <div class="wok-mask-loading">
- <div class="wok-mask-loading-icon"></div>
- <div class="wok-mask-loading-text">$_("Loading...")</div>
- </div>
- </div>
- </div>
<!-- 1-1-2 -->
<div id="iso-file-field">
<div id="iso-file-box" class="custom-iso-field">
@@ -104,16 +103,30 @@
</div>
</div>
</div>
- </div>
- </div>
- <div class="modal-footer">
- <button class="btn btn-default" id="btn-template-file-create" disabled="disabled">$_("Create")</button>
- <button class="btn btn-default" id="btn-template-local-iso-create" disabled="disabled">$_("Create")</button>
- <button class="btn btn-default" data-dismiss="modal" type="button">$_("Cancel")</button>
- </div>
-</div>
+ <div class="page" id="netboot-path">
+ </div>
+ </div>
+ <div id="loading-isos">
+ <div class="wok-mask-loader-container">
+ <div class="wok-mask-loading">
+ <div class="wok-mask-loading-icon"></div>
+ <div class="wok-mask-loading-text">$_("Loading...")</div>
+ </div>
+ </div>
+ </div>
+ </div>
+ <div class="modal-footer">
+ <button class="btn btn-default" id="btn-template-file-create" disabled="disabled">$_("Create")</button>
+ <button class="btn btn-default" id="btn-template-local-iso-create" disabled="disabled">$_("Create")</button>
+ <button class="btn btn-default" id="btn-template-netboot-create" disabled="disabled">$_("Create")</button>
+ <button class="btn btn-default" data-dismiss="modal" type="button">$_("Cancel")</button>
+ </div>
+ </div>
<script>
kimchi.template_add_main();
</script>
+
+
+</div>
</body>
</html>
--
2.5.0
8 years, 4 months
[PATCH] [Kimchi] Show error message for untracked and failed cloning tasks
by Lucio Correia
When the asynchronous task for the cloning of a guest fails
too early, the task is not tracked by listVmsAuto(), which
does it only for 'running' tasks. Consequently, the error
message is not showed to the user.
Signed-off-by: Lucio Correia <luciojhc(a)linux.vnet.ibm.com>
---
ui/js/src/kimchi.guest_main.js | 15 ++++++++++++++-
1 file changed, 14 insertions(+), 1 deletion(-)
diff --git a/ui/js/src/kimchi.guest_main.js b/ui/js/src/kimchi.guest_main.js
index 8e12fb2..0e11aa1 100644
--- a/ui/js/src/kimchi.guest_main.js
+++ b/ui/js/src/kimchi.guest_main.js
@@ -360,6 +360,17 @@ kimchi.listVmsAuto = function() {
return guests;
};
+ var trackFailedCloningGuests = function() {
+ kimchi.getTasksByFilter('status=failed&target_uri=' + encodeURIComponent('^/plugins/kimchi/vms/.+/clone'), function(tasks) {
+ for (var i = 0; i < tasks.length; i++) {
+ if (kimchi.trackingTasks.indexOf(tasks[i].id) == -1)
+ kimchi.trackTask(tasks[i].id, null, function(err) {
+ wok.message.error(err.message);
+ }, null);
+ }
+ }, null, true);
+ };
+
var getMigratingGuests = function() {
var guests = [];
kimchi.getTasksByFilter('status=running&target_uri=' + encodeURIComponent('^/plugins/kimchi/vms/.+/migrate'), function(tasks) {
@@ -381,7 +392,9 @@ kimchi.listVmsAuto = function() {
kimchi.listVMs(function(result, textStatus, jqXHR) {
if (result && textStatus == "success") {
-
+ // Some clone tasks may fail before being tracked. Show
+ // error message for them.
+ trackFailedCloningGuests();
var migrated = getMigratingGuests();
for (i = migrated.length - 1; i >= 0; i--) {
for (j = result.length - 1; j >= 0; j--) {
--
1.9.1
8 years, 4 months
[PATCH] [Wok] Issue 136: Changes for User Log UI
by sguimaraes943@gmail.com
From: Samuel Guimarães <sguimaraes943(a)gmail.com>
This patch fixes a minor issue with date not being properly converted and adds ip address and timezone columns to User Activity Log table. IT also removes the "search by time" field from the advanced search and replaces it with "search by user IP address".
Samuel Guimarães (1):
Issue 136: Changes for User Log UI
ui/js/src/wok.utils.js | 4 ++--
ui/js/wok.user-log.js | 8 ++++++++
ui/pages/i18n.json.tmpl | 2 ++
ui/pages/tabs/settings-search.html.tmpl | 14 +++++++-------
4 files changed, 19 insertions(+), 9 deletions(-)
--
1.9.3
8 years, 4 months
[PATCH] [Wok 0/2] Loading mask position and "progress" mouse cursor
by sguimaraes943@gmail.com
From: Samuel Guimarães <sguimaraes943(a)gmail.com>
This patchset contains "Fixes loading message position inside panel-groups" v2 (rebased) and the CSS class to change mouse cursor when tasks are in progress (still requires individual patches for each plugin).
Samuel Guimarães (2):
Fixes loading message position inside panel-groups
Added cursor for tasks in progress
ui/css/src/wok.scss | 20 ++++++++++++++++++++
ui/css/wok.css | 20 ++++++++++++++++++++
2 files changed, 40 insertions(+)
--
1.9.3
8 years, 4 months
[PATCH v2][Kimchi 0/2] Issue #467: Feature: Show boot menu for a guest
by Ramon Medeiros
based on "Make Kimchi able to change guest's boot order"
Changes:
v2:
pep8 fixes
Ramon Medeiros (2):
Allow guest to enable bootmenu on startup
Add test to verify bootmenu and update old tests
API.json | 5 +++++
docs/API.md | 1 +
i18n.py | 1 +
model/vms.py | 30 +++++++++++++++++++++---------
tests/test_mockmodel.py | 2 +-
tests/test_model.py | 8 +++++++-
xmlutils/bootorder.py | 4 ++++
7 files changed, 40 insertions(+), 11 deletions(-)
--
2.5.5
8 years, 4 months
[PATCH] [Kimchi] Handle libvirt events for device attachment/detachment
by Jose Ricardo Ziviani
- kimchi will only finish the device attachment/detachment after
receiving the appropriate event from libvirt.
Signed-off-by: Jose Ricardo Ziviani <joserz(a)linux.vnet.ibm.com>
---
model/libvirtevents.py | 48 ++++++++++++++++++++++++++++++++++++++++
model/vmhostdevs.py | 60 +++++++++++++++++++++++++++++++++++++++++---------
2 files changed, 98 insertions(+), 10 deletions(-)
diff --git a/model/libvirtevents.py b/model/libvirtevents.py
index dfd22c6..0f3bfd5 100644
--- a/model/libvirtevents.py
+++ b/model/libvirtevents.py
@@ -89,3 +89,51 @@ class LibvirtEvents(object):
else:
reason = e.message
wok_log.error("Register of ENOSPC event failed: %s" % reason)
+
+ def registerAttachDevicesEvent(self, conn, cb, arg):
+ """
+ register libvirt event to listen to devices attachment
+ """
+ try:
+ return conn.get().domainEventRegisterAny(
+ None,
+ libvirt.VIR_DOMAIN_EVENT_ID_DEVICE_ADDED,
+ cb,
+ arg)
+
+ except libvirt.libvirtError as e:
+ wok_log.error("register attach event failed: %s" % e.message)
+
+ def registerDetachDevicesEvent(self, conn, cb, arg):
+ """
+ register libvirt event to listen to devices detachment
+ """
+ try:
+ return conn.get().domainEventRegisterAny(
+ None,
+ libvirt.VIR_DOMAIN_EVENT_ID_DEVICE_REMOVED,
+ cb,
+ arg)
+
+ except libvirt.libvirtError as e:
+ wok_log.error("register detach event failed: %s" % e.message)
+
+ def deregisterAttachDevicesEvent(self, conn, id):
+ """
+ deregister libvirt event to listen to devices attachment
+ """
+ try:
+ conn.get().domainEventDeregisterAny(id)
+
+ except libvirt.libvirtError as e:
+ wok_log.error("deregister attach event failed: %s" % e.message)
+
+ def deregisterDetachDevicesEvent(self, conn, id):
+ """
+ deregister libvirt event to listen to devices detachment
+ """
+ try:
+ conn.get().domainEventDeregisterAny(id)
+
+ except libvirt.libvirtError as e:
+ wok_log.error("deregister detach event failed: %s" % e.message)
diff --git a/model/vmhostdevs.py b/model/vmhostdevs.py
index 2130ac4..676e40a 100644
--- a/model/vmhostdevs.py
+++ b/model/vmhostdevs.py
@@ -47,8 +47,10 @@ class VMHostDevsModel(object):
def __init__(self, **kargs):
self.conn = kargs['conn']
self.objstore = kargs['objstore']
+ self.events = kargs['eventsloop']
self.caps = CapabilitiesModel(**kargs)
self.task = TaskModel(**kargs)
+ self._eid = None
def get_list(self, vmid):
dom = VMModel.get_vm(vmid, self.conn)
@@ -67,6 +69,17 @@ class VMHostDevsModel(object):
if dev_name not in eligible_dev_names:
raise InvalidParameter('KCHVMHDEV0002E', {'dev_name': dev_name})
+ def _event_devices(self, conn, dom, alias, opaque):
+ """
+ Callback to handle add/remove devices event
+ """
+ if self._eid is None:
+ wok_log.error("callbackID cannot be None")
+ return
+
+ wok_log.info("Device %s added successfuly" % alias)
+ opaque('OK', True)
+
def create(self, vmid, params):
dev_name = params['name']
self._passthrough_device_validate(dev_name)
@@ -224,6 +237,12 @@ class VMHostDevsModel(object):
raise InvalidOperation('KCHVMHDEV0006E',
{'name': dev_info['name']})
+ if self._eid is None:
+ self._eid = self.events.registerAttachDevicesEvent(
+ self.conn,
+ self._event_devices,
+ cb)
+
# all devices in the group that is going to be attached to the vm
# must be detached from the host first
with RollbackContext() as rollback:
@@ -273,7 +292,6 @@ class VMHostDevsModel(object):
rollback.prependDefer(dom.detachDeviceFlags, xmlstr,
device_flags)
rollback.commitAll()
- cb('OK', True)
return
for pci_info in pci_infos:
@@ -294,8 +312,6 @@ class VMHostDevsModel(object):
xmlstr, device_flags)
rollback.commitAll()
- cb('OK', True)
-
def _count_3D_devices_attached(self, dom):
counter = 0
root = objectify.fromstring(dom.XMLDesc(0))
@@ -407,6 +423,12 @@ class VMHostDevsModel(object):
dev_info = params['dev_info']
dom = VMModel.get_vm(vmid, self.conn)
+ if self._eid is None:
+ self._eid = self.events.registerAttachDevicesEvent(
+ self.conn,
+ self._event_devices,
+ cb)
+
with RollbackContext() as rollback:
cb('Reading source device XML')
xmlstr = self._get_scsi_device_xml(dev_info)
@@ -421,8 +443,6 @@ class VMHostDevsModel(object):
rollback.prependDefer(dom.detachDeviceFlags, xmlstr, device_flags)
rollback.commitAll()
- cb('OK', True)
-
def _get_usb_device_xml(self, dev_info):
source = E.source(
E.vendor(id=dev_info['vendor']['id']),
@@ -440,6 +460,12 @@ class VMHostDevsModel(object):
dev_info = params['dev_info']
dom = VMModel.get_vm(vmid, self.conn)
+ if self._eid is None:
+ self._eid = self.events.registerAttachDevicesEvent(
+ self.conn,
+ self._event_devices,
+ cb)
+
with RollbackContext() as rollback:
cb('Reading source device XML')
xmlstr = self._get_usb_device_xml(dev_info)
@@ -454,14 +480,14 @@ class VMHostDevsModel(object):
rollback.prependDefer(dom.detachDeviceFlags, xmlstr, device_flags)
rollback.commitAll()
- cb('OK', True)
-
class VMHostDevModel(object):
def __init__(self, **kargs):
self.conn = kargs['conn']
self.objstore = kargs['objstore']
+ self.events = kargs['eventsloop']
self.task = TaskModel(**kargs)
+ self._eid = None
def lookup(self, vmid, dev_name):
dom = VMModel.get_vm(vmid, self.conn)
@@ -509,6 +535,17 @@ class VMHostDevModel(object):
task_params)
return self.task.lookup(taskid)
+ def _event_devices(self, conn, dom, alias, opaque):
+ """
+ Callback to handle add/remove devices event
+ """
+ if self._eid is None:
+ wok_log.error("callbackID cannot be None")
+ return
+
+ wok_log.info("Device %s removed successfuly" % alias)
+ opaque('OK', True)
+
def _detach_device(self, cb, params):
cb('Detaching device.')
vmid = params['vmid']
@@ -526,12 +563,17 @@ class VMHostDevModel(object):
raise InvalidOperation('KCHVMHDEV0006E',
{'name': dev_info['name']})
+ if self._eid is None:
+ self._eid = self.events.registerDetachDevicesEvent(
+ self.conn,
+ self._event_devices,
+ cb)
+
if self._hotunplug_multifunction_pci(dom, hostdev, dev_name):
if is_3D_device:
cb('Updating MMIO from VM...')
devsmodel = VMHostDevsModel(conn=self.conn)
devsmodel.update_mmio_guest(vmid, False)
- cb('OK', True)
return
for e in hostdev:
@@ -552,8 +594,6 @@ class VMHostDevModel(object):
raise NotFoundError('KCHVMHDEV0001E',
{'vmid': vmid, 'dev_name': dev_name})
- cb('OK', True)
-
def _get_devices_same_addr(self, hostdev, domain, bus, slot):
devices = []
for device in hostdev:
--
2.7.4
8 years, 4 months
Re: [Kimchi-devel] [PATCH V2][Wok 03/12] FVT: Lists all dependecies for fvt testcases.
by Aline Manera
On 05/30/2016 04:10 AM, archus(a)linux.vnet.ibm.com wrote:
> From: Archana Singh <archus(a)linux.vnet.ibm.com>
>
> All the dependecies to be installed which is required by fvt
> testcases should be added here.
>
> Signed-off-by: Archana Singh <archus(a)linux.vnet.ibm.com>
> ---
> tests/fvt/requirements.txt | 23 +++++++++++++++++++++++
> 1 file changed, 23 insertions(+)
> create mode 100644 tests/fvt/requirements.txt
>
> diff --git a/tests/fvt/requirements.txt b/tests/fvt/requirements.txt
> new file mode 100644
> index 0000000..9941793
> --- /dev/null
> +++ b/tests/fvt/requirements.txt
> @@ -0,0 +1,23 @@
> +# This requirements file lists all dependecies for fvt testcases.
> +# Run 'pip install -r requirements.txt' to install these dependencies
> +#
> +# Project Wok
> +#
> +# Copyright IBM Corp, 2016
> +#
> +# This library is free software; you can redistribute it and/or
> +# modify it under the terms of the GNU Lesser General Public
> +# License as published by the Free Software Foundation; either
> +# version 2.1 of the License, or (at your option) any later version.
> +#
> +# This library is distributed in the hope that it will be useful,
> +# but WITHOUT ANY WARRANTY; without even the implied warranty of
> +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
> +# Lesser General Public License for more details.
> +#
> +# You should have received a copy of the GNU Lesser General Public
> +# License along with this library; if not, write to the Free Software
> +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301USA
> +
> +jsonschema
> +requests
I am almost sure that there is RPM/DEB packages for those python modules
so we don't need to use pip.
Or any special reason to prefer pip?
8 years, 4 months