summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEndi S. Dewata <edewata@redhat.com>2011-04-11 20:22:38 -0500
committerAdam Young <ayoung@redhat.com>2011-04-18 11:11:57 -0400
commit8f9ddb058f922fbd33c4d15986eeb1f5be521cc5 (patch)
treebcdf559fcc10caa18195142f70986bf47a317e65
parent740416c8fbe436a584e93f4c6486feca2e077f24 (diff)
downloadfreeipa-8f9ddb058f922fbd33c4d15986eeb1f5be521cc5.tar.gz
freeipa-8f9ddb058f922fbd33c4d15986eeb1f5be521cc5.tar.xz
freeipa-8f9ddb058f922fbd33c4d15986eeb1f5be521cc5.zip
Entitlement import.
The entitlement facet will invoke entitle_status to check the entitlement status and show the appropriate buttons. If it's unregistered it will show Register and Import button. If it's registered it will show the Consume button only. If it's imported it will show the Import button only. The Import button will open a dialog box for importing entitlement certificate. Ticket #277
-rw-r--r--install/ui/entitle.js278
-rw-r--r--install/ui/ipa.css4
-rw-r--r--install/ui/test/data/entitle_import.json12
-rw-r--r--install/ui/test/data/entitle_status_offline.json12
-rw-r--r--install/ui/test/data/entitle_status_online.json12
-rw-r--r--install/ui/test/data/entitle_status_unregistered.json (renamed from install/ui/test/data/entitle_get_unregistered.json)2
6 files changed, 292 insertions, 28 deletions
diff --git a/install/ui/entitle.js b/install/ui/entitle.js
index 6c2c8727..4c9cd13c 100644
--- a/install/ui/entitle.js
+++ b/install/ui/entitle.js
@@ -26,7 +26,8 @@
IPA.entitle = {};
IPA.entitle.unregistered = 'unregistered';
-IPA.entitle.registered = 'registered';
+IPA.entitle.online = 'online';
+IPA.entitle.offline = 'offline';
IPA.entity_factories.entitle = function() {
@@ -69,9 +70,9 @@ IPA.entity_factories.entitle = function() {
}).
standard_association_facets().
dialog({
- factory: IPA.entitle.register_dialog,
- name: 'register',
- title: 'Register Entitlements',
+ factory: IPA.entitle.register_online_dialog,
+ name: 'online_registration',
+ title: 'Registration',
fields: [
{
name: 'username',
@@ -87,9 +88,23 @@ IPA.entity_factories.entitle = function() {
]
}).
dialog({
+ factory: IPA.entitle.register_offline_dialog,
+ name: 'offline_registration',
+ title: 'Import Certificate',
+ message: 'Enter the Base64-encoded entitlement certificate below:',
+ label: 'Import',
+ fields: [
+ {
+ name: 'certificate',
+ label: 'Certificate',
+ undo: false
+ }
+ ]
+ }).
+ dialog({
factory: IPA.entitle.consume_dialog,
name: 'consume',
- title: 'Consume Entitlements',
+ title: 'Consume Entitlement',
fields: [
{
name: 'quantity',
@@ -97,6 +112,20 @@ IPA.entity_factories.entitle = function() {
undo: false
}
]
+ }).
+ dialog({
+ factory: IPA.entitle.import_dialog,
+ name: 'import',
+ title: 'Import Certificate',
+ message: 'Enter the Base64-encoded entitlement certificate below:',
+ label: 'Import',
+ fields: [
+ {
+ name: 'certificate',
+ label: 'Certificate',
+ undo: false
+ }
+ ]
});
return builder.build();
@@ -108,18 +137,44 @@ IPA.entitle.entity = function(spec) {
var that = IPA.entity(spec);
- that.get_certificates = function(on_success, on_error) {
+ that.status = IPA.entitle.unregistered;
+
+ that.get_status = function(on_success, on_error) {
var command = IPA.command({
- name: 'entitle_get' + (that.status == IPA.entitle.registered ? '' : '_unregistered'),
+ name: 'entitle_status_'+that.status,
entity: 'entitle',
- method: 'get',
+ method: 'status',
on_success: function(data, text_status, xhr) {
- that.status = IPA.entitle.registered;
+ if (data.result.result.uuid == 'IMPORTED') {
+ that.status = IPA.entitle.offline;
+ } else {
+ that.status = IPA.entitle.online;
+ }
+
if (on_success) {
on_success.call(this, data, text_status, xhr);
}
},
+ on_error: function(xhr, text_status, error_thrown) {
+ that.status = IPA.entitle.unregistered;
+
+ if (on_error) {
+ on_error.call(this, xhr, text_status, error_thrown);
+ }
+ },
+ retry: false
+ });
+
+ command.execute();
+ };
+
+ that.get_certificates = function(on_success, on_error) {
+
+ var command = IPA.command({
+ entity: 'entitle',
+ method: 'get',
+ on_success: on_success,
on_error: on_error,
retry: false
});
@@ -127,7 +182,7 @@ IPA.entitle.entity = function(spec) {
command.execute();
};
- that.register = function(username, password, on_success, on_error) {
+ that.register_online = function(username, password, on_success, on_error) {
var command = IPA.command({
entity: 'entitle',
@@ -135,7 +190,25 @@ IPA.entitle.entity = function(spec) {
args: [ username ],
options: { password: password },
on_success: function(data, text_status, xhr) {
- that.status = IPA.entitle.registered;
+ that.status = IPA.entitle.online;
+ if (on_success) {
+ on_success.call(this, data, text_status, xhr);
+ }
+ },
+ on_error: on_error
+ });
+
+ command.execute();
+ };
+
+ that.register_offline = function(certificate, on_success, on_error) {
+
+ var command = IPA.command({
+ entity: 'entitle',
+ method: 'import',
+ args: [ certificate ],
+ on_success: function(data, text_status, xhr) {
+ that.status = IPA.entitle.offline;
if (on_success) {
on_success.call(this, data, text_status, xhr);
}
@@ -159,6 +232,19 @@ IPA.entitle.entity = function(spec) {
command.execute();
};
+ that.import_certificate = function(certificate, on_success, on_error) {
+
+ var command = IPA.command({
+ entity: 'entitle',
+ method: 'import',
+ args: [ certificate ],
+ on_success: on_success,
+ on_error: on_error
+ });
+
+ command.execute();
+ };
+
return that;
};
@@ -178,17 +264,37 @@ IPA.entitle.search_facet = function(spec) {
'class': 'search-buttons'
}).appendTo(li);
+ that.register_buttons = $('<span/>', {
+ style: 'display: none;'
+ }).appendTo(buttons);
+
$('<input/>', {
type: 'button',
- name: 'register',
+ name: 'register_online',
value: 'Register'
+ }).appendTo(that.register_buttons);
+
+ $('<input/>', {
+ type: 'button',
+ name: 'register_offline',
+ value: 'Import'
+ }).appendTo(that.register_buttons);
+
+ that.consume_buttons = $('<span/>', {
+ style: 'display: none;'
}).appendTo(buttons);
$('<input/>', {
type: 'button',
name: 'consume',
value: 'Consume'
- }).appendTo(buttons);
+ }).appendTo(that.consume_buttons);
+
+ $('<input/>', {
+ type: 'button',
+ name: 'import',
+ value: 'Import'
+ }).appendTo(that.consume_buttons);
};
that.setup = function(container) {
@@ -197,17 +303,27 @@ IPA.entitle.search_facet = function(spec) {
var action_panel = that.get_action_panel();
- var button = $('input[name=register]', action_panel);
- that.register_button = IPA.action_button({
+ var button = $('input[name=register_online]', action_panel);
+ that.register_online_button = IPA.action_button({
label: 'Register',
icon: 'ui-icon-plus',
click: function() {
- var dialog = that.entity.get_dialog('register');
+ var dialog = that.entity.get_dialog('online_registration');
dialog.open(that.container);
}
});
- that.register_button.css('display', 'none');
- button.replaceWith(that.register_button);
+ button.replaceWith(that.register_online_button);
+
+ button = $('input[name=register_offline]', action_panel);
+ that.register_offline_button = IPA.action_button({
+ label: 'Import',
+ icon: 'ui-icon-plus',
+ click: function() {
+ var dialog = that.entity.get_dialog('offline_registration');
+ dialog.open(that.container);
+ }
+ });
+ button.replaceWith(that.register_offline_button);
button = $('input[name=consume]', action_panel);
that.consume_button = IPA.action_button({
@@ -219,16 +335,35 @@ IPA.entitle.search_facet = function(spec) {
dialog.open(that.container);
}
});
- that.consume_button.css('display', 'none');
button.replaceWith(that.consume_button);
+
+ button = $('input[name=import]', action_panel);
+ that.import_button = IPA.action_button({
+ label: 'Import',
+ icon: 'ui-icon-plus',
+ style: 'display: none;',
+ click: function() {
+ var dialog = that.entity.get_dialog('import');
+ dialog.open(that.container);
+ }
+ });
+ button.replaceWith(that.import_button);
};
that.refresh = function() {
function on_success(data, text_status, xhr) {
- that.register_button.css('display', 'none');
- that.consume_button.css('display', 'inline');
+ that.register_buttons.css('display', 'none');
+ that.consume_buttons.css('display', 'inline');
+
+ if (that.entity.status == IPA.entitle.online) {
+ that.consume_button.css('display', 'inline');
+ that.import_button.css('display', 'none');
+ } else {
+ that.consume_button.css('display', 'none');
+ that.import_button.css('display', 'inlnie');
+ }
that.table.empty();
@@ -250,22 +385,63 @@ IPA.entitle.search_facet = function(spec) {
function on_error(xhr, text_status, error_thrown) {
- that.register_button.css('display', 'inline');
- that.consume_button.css('display', 'none');
+ that.register_buttons.css('display', 'inline');
+ that.consume_buttons.css('display', 'none');
var summary = $('span[name=summary]', that.table.tfoot).empty();
summary.append(error_thrown.message);
}
- that.entity.get_certificates(
- on_success,
+ that.entity.get_status(
+ function(data, text_status, xhr) {
+ that.entity.get_certificates(
+ on_success,
+ on_error);
+ },
on_error);
};
return that;
};
-IPA.entitle.register_dialog = function(spec) {
+IPA.entitle.certificate_dialog = function(spec) {
+
+ spec = spec || {};
+
+ var that = IPA.dialog(spec);
+
+ that.width = spec.width || 500;
+ that.height = spec.height || 400;
+ that.message = spec.message;
+ that.label = spec.label;
+
+ that.get_certificate = function() {
+ var certificate = that.textarea.val();
+ return IPA.cert.BEGIN_CERTIFICATE+'\n'+
+ $.trim(certificate)+'\n'+
+ IPA.cert.END_CERTIFICATE+'\n';
+ };
+
+ that.create = function() {
+ that.container.append(that.message);
+ that.container.append('<br/>');
+ that.container.append('<br/>');
+
+ that.container.append(IPA.cert.BEGIN_CERTIFICATE);
+ that.container.append('<br/>');
+
+ that.textarea = $('<textarea/>', {
+ style: 'width: 100%; height: 225px;'
+ }).appendTo(that.container);
+
+ that.container.append('<br/>');
+ that.container.append(IPA.cert.END_CERTIFICATE);
+ };
+
+ return that;
+};
+
+IPA.entitle.register_online_dialog = function(spec) {
spec = spec || {};
@@ -275,7 +451,7 @@ IPA.entitle.register_dialog = function(spec) {
var record = {};
that.save(record);
- that.entity.register(
+ that.entity.register_online(
record.username,
record.password,
function() {
@@ -293,6 +469,30 @@ IPA.entitle.register_dialog = function(spec) {
return that;
};
+IPA.entitle.register_offline_dialog = function(spec) {
+
+ spec = spec || {};
+
+ var that = IPA.entitle.certificate_dialog(spec);
+
+ that.add_button(that.label, function() {
+ that.entity.register_offline(
+ that.get_certificate(),
+ function() {
+ var facet = that.entity.get_facet('search');
+ facet.refresh();
+ that.close();
+ }
+ );
+ });
+
+ that.add_button(IPA.messages.buttons.cancel, function() {
+ that.close();
+ });
+
+ return that;
+};
+
IPA.entitle.consume_dialog = function(spec) {
spec = spec || {};
@@ -319,3 +519,27 @@ IPA.entitle.consume_dialog = function(spec) {
return that;
};
+
+IPA.entitle.import_dialog = function(spec) {
+
+ spec = spec || {};
+
+ var that = IPA.entitle.certificate_dialog(spec);
+
+ that.add_button(that.label, function() {
+ that.entity.import_certificate(
+ that.get_certificate(),
+ function() {
+ var facet = that.entity.get_facet('search');
+ facet.refresh();
+ that.close();
+ }
+ );
+ });
+
+ that.add_button(IPA.messages.buttons.cancel, function() {
+ that.close();
+ });
+
+ return that;
+}; \ No newline at end of file
diff --git a/install/ui/ipa.css b/install/ui/ipa.css
index 4fe04013..2b205e92 100644
--- a/install/ui/ipa.css
+++ b/install/ui/ipa.css
@@ -479,6 +479,10 @@ span.ui-icon-search {
margin-left: 1em !important;
}
+[title="Import"] {
+ margin-left: 1em !important;
+}
+
[title="mail"] {
margin-top: 0em !important;
}
diff --git a/install/ui/test/data/entitle_import.json b/install/ui/test/data/entitle_import.json
new file mode 100644
index 00000000..f6dc905b
--- /dev/null
+++ b/install/ui/test/data/entitle_import.json
@@ -0,0 +1,12 @@
+{
+ "error": null,
+ "id": null,
+ "result": {
+ "result": {
+ "consumed": 1,
+ "product": "Multiplier Product Client Pack (50)",
+ "quantity": 1,
+ "uuid": "IMPORTED"
+ }
+ }
+}
diff --git a/install/ui/test/data/entitle_status_offline.json b/install/ui/test/data/entitle_status_offline.json
new file mode 100644
index 00000000..44fe79e1
--- /dev/null
+++ b/install/ui/test/data/entitle_status_offline.json
@@ -0,0 +1,12 @@
+{
+ "error": null,
+ "id": 0,
+ "result": {
+ "result": {
+ "consumed": 2,
+ "product": "MKT-multiplier-client-50",
+ "quantity": 250,
+ "uuid": "IMPORTED"
+ }
+ }
+}
diff --git a/install/ui/test/data/entitle_status_online.json b/install/ui/test/data/entitle_status_online.json
new file mode 100644
index 00000000..1cfdfe64
--- /dev/null
+++ b/install/ui/test/data/entitle_status_online.json
@@ -0,0 +1,12 @@
+{
+ "error": null,
+ "id": 0,
+ "result": {
+ "result": {
+ "consumed": 2,
+ "product": "MKT-multiplier-client-50",
+ "quantity": 250,
+ "uuid": "a3865364-33cc-4ce3-b000-0f08498cc085"
+ }
+ }
+}
diff --git a/install/ui/test/data/entitle_get_unregistered.json b/install/ui/test/data/entitle_status_unregistered.json
index 47dce1f1..8a691ada 100644
--- a/install/ui/test/data/entitle_get_unregistered.json
+++ b/install/ui/test/data/entitle_status_unregistered.json
@@ -8,4 +8,4 @@
},
"id": 0,
"result": null
-} \ No newline at end of file
+}