diff options
author | Petr Vobornik <pvoborni@redhat.com> | 2012-03-22 17:31:48 +0100 |
---|---|---|
committer | Petr Vobornik <pvoborni@redhat.com> | 2012-03-29 13:39:53 +0200 |
commit | 18a6ab356a159a88c5aab014f344eb14a9d38c81 (patch) | |
tree | 2bfa238383478b44615542e508b776065366a13e | |
parent | bbe672a2aea1651a4a0eeca20b8339f0799f3431 (diff) | |
download | freeipa-18a6ab356a159a88c5aab014f344eb14a9d38c81.tar.gz freeipa-18a6ab356a159a88c5aab014f344eb14a9d38c81.tar.xz freeipa-18a6ab356a159a88c5aab014f344eb14a9d38c81.zip |
Inter-facet expiration
Problem:
When some facet perform action which modifies data, some other facet may become expired.
Example: User modifies group's description. Now group search facet contains old data and has to be refreshed.
Solution:
New event was added to facet: on_update. It should be executed when facet performs action which modifies data ie: details facet update or add entry to dnsrecord.
Then entity policies were introduced. Entity policies are a objects which are stored in entity.policies. They have similar function as facet_policies - performing communications and other functionality between facets. This way facets don't have to contain such logic and thus they aren't dependant on each other.
This patch adds IPA.facet_update_policy, IPA.adder_facet_update_policy, IPA.search_facet_update_policy, IPA.details_facet_update_policy.
IPA.facet_update_policy: On facets_created it bind itself to [current entity].[source facet].[event]. Default event is on_update. When the event is executed it sets expiration flag to [dest entity].[dest facet].
IPA.search_facet_update_policy: IPA.facet_update_policy where source facet = search, dest facet = details, dest entity = current entity. Its a default policy for updatein changes from search facet to details facet. Right now it isn't needed but it will be needed when action lists come to play.
IPA.details_facet_update_policy: same as IPA.search_facet_update_policy just reversed. Very important.
IPA.adder_facet_update_policy: similar functionality, just source of the event is dialog. Default event is added (new event in entity_adder_dialog).
Entity policies should be specified in entity's spec object. If none are specified a default ones are used. Default policies are: IPA.search_facet_update_policy and IPA.details_facet_update_policy.
https://fedorahosted.org/freeipa/ticket/2075
-rw-r--r-- | install/ui/add.js | 4 | ||||
-rw-r--r-- | install/ui/automember.js | 13 | ||||
-rw-r--r-- | install/ui/automount.js | 10 | ||||
-rw-r--r-- | install/ui/details.js | 1 | ||||
-rw-r--r-- | install/ui/dns.js | 21 | ||||
-rw-r--r-- | install/ui/entity.js | 151 | ||||
-rw-r--r-- | install/ui/facet.js | 1 | ||||
-rw-r--r-- | install/ui/hbac.js | 1 | ||||
-rw-r--r-- | install/ui/selinux.js | 1 | ||||
-rw-r--r-- | install/ui/sudo.js | 1 |
10 files changed, 204 insertions, 0 deletions
diff --git a/install/ui/add.js b/install/ui/add.js index 671d3f1fc..a9969a5cb 100644 --- a/install/ui/add.js +++ b/install/ui/add.js @@ -33,6 +33,7 @@ IPA.entity_adder_dialog = function(spec) { that.on_error = spec.on_error ; that.retry = typeof spec.retry !== 'undefined' ? spec.retry : true; that.command = null; + that.added = IPA.observer(); that.show_edit_page = spec.show_edit_page || show_edit_page; @@ -44,6 +45,7 @@ IPA.entity_adder_dialog = function(spec) { that.hide_message(); that.add( function(data, text_status, xhr) { + that.added.notify(); var facet = IPA.current_entity.get_facet(); facet.refresh(); that.close(); @@ -59,6 +61,7 @@ IPA.entity_adder_dialog = function(spec) { that.hide_message(); that.add( function(data, text_status, xhr) { + that.added.notify(); var label = that.entity.metadata.label_singular; var message = IPA.messages.dialogs.add_confirmation; message = message.replace('${entity}', label); @@ -79,6 +82,7 @@ IPA.entity_adder_dialog = function(spec) { that.hide_message(); that.add( function(data, text_status, xhr) { + that.added.notify(); that.close(); var result = data.result.result; that.show_edit_page(that.entity, result); diff --git a/install/ui/automember.js b/install/ui/automember.js index a9812a71f..df285973d 100644 --- a/install/ui/automember.js +++ b/install/ui/automember.js @@ -33,6 +33,19 @@ IPA.automember.entity = function(spec) { IPA.metadata.objects.automember.takes_params.push(pkey_attr); IPA.metadata.objects.automember.primary_key = pkey_attr.name; + spec = spec || {}; + + spec.policies = spec.policies || [ + IPA.facet_update_policy({ + source_facet: 'usergrouprule', + dest_facet: 'searchgroup' + }), + IPA.facet_update_policy({ + source_facet: 'hostgrouprule', + dest_facet: 'searchhostgroup' + }) + ]; + var that = IPA.entity(spec); that.init = function() { diff --git a/install/ui/automount.js b/install/ui/automount.js index 80f5e1438..db5e403ca 100644 --- a/install/ui/automount.js +++ b/install/ui/automount.js @@ -153,6 +153,16 @@ IPA.automount.map_entity = function(spec) { IPA.automount.key_entity = function(spec) { + spec = spec || {}; + + spec.policies = spec.policies || [ + IPA.facet_update_policy({ + source_facet: 'details', + dest_entity: 'automountmap', + dest_facet: 'keys' + }) + ]; + var that = IPA.entity(spec); that.init = function() { diff --git a/install/ui/details.js b/install/ui/details.js index f7e95ebfe..31325813b 100644 --- a/install/ui/details.js +++ b/install/ui/details.js @@ -535,6 +535,7 @@ IPA.details_facet = function(spec) { that.update_on_success = function(data, text_status, xhr) { that.load(data); + that.on_update.notify(); }; that.update_on_error = function(xhr, text_status, error_thrown) { diff --git a/install/ui/dns.js b/install/ui/dns.js index 33b21e4cf..6a684b9ea 100644 --- a/install/ui/dns.js +++ b/install/ui/dns.js @@ -262,6 +262,7 @@ IPA.dnszone_details_facet = function(spec) { that.update_on_success = function(data, text_status, xhr) { that.refresh(); + that.on_update.notify(); }; that.update_on_error = function(xhr, text_status, error_thrown) { @@ -914,6 +915,17 @@ IPA.dns.get_record_type = function(type_name) { IPA.dns.record_entity = function(spec) { + spec = spec || {}; + + spec.policies = spec.policies || [ + IPA.facet_update_policy({ + source_facet: 'details', + dest_entity: 'dnszone', + dest_facet: 'records' + }), + IPA.adder_facet_update_policy() + ]; + var that = IPA.entity(spec); that.init = function() { @@ -1599,6 +1611,7 @@ IPA.dns.record_type_table_widget = function(spec) { function(data) { that.reload_facet(data); dialog.close(); + that.notify_facet_update(); }, function() { that.refresh_facet(); @@ -1670,6 +1683,7 @@ IPA.dns.record_type_table_widget = function(spec) { that.refresh_facet(); } dialog.close(); + that.notify_facet_update(); }, dialog.on_error); } @@ -1693,6 +1707,7 @@ IPA.dns.record_type_table_widget = function(spec) { that.refresh_facet(); } dialog.reset(); + that.notify_facet_update(); }, dialog.on_error); } @@ -1784,6 +1799,7 @@ IPA.dns.record_type_table_widget = function(spec) { command.on_success = function(data) { that.reload_facet(data); dialog.close(); + that.notify_facet_update(); }; command.on_error = function() { that.refresh_facet(); @@ -1825,6 +1841,11 @@ IPA.dns.record_type_table_widget = function(spec) { facet.refresh(); }; + that.notify_facet_update = function() { + var facet = IPA.current_entity.get_facet(); + facet.on_update.notify(); + }; + that.update = function(values) { that.idnsname = values.idnsname; diff --git a/install/ui/entity.js b/install/ui/entity.js index 6b2be9e66..49f30b0b2 100644 --- a/install/ui/entity.js +++ b/install/ui/entity.js @@ -31,6 +31,11 @@ IPA.entity = function(spec) { spec = spec || {}; + spec.policies = spec.policies || [ + IPA.search_facet_update_policy(), + IPA.details_facet_update_policy() + ]; + var that = {}; that.name = spec.name; @@ -43,6 +48,11 @@ IPA.entity = function(spec) { that.dialog_specs = spec.dialogs || []; that.dialogs_created = false; + that.policies = IPA.entity_policies({ + entity: that, + policies: spec.policies + }); + that.facets = $.ordered_map(); that.facet_groups = $.ordered_map(); that.facet_specs = spec.facets || []; @@ -116,6 +126,7 @@ IPA.entity = function(spec) { var builder = IPA.facet_builder(that); builder.build_facets(); that.facets_created = true; + that.policies.facets_created(); } if (name === undefined) { @@ -568,4 +579,144 @@ IPA.dialog_builder = function(entity) { }; return that; +}; + +IPA.entity_policy = function(spec) { + + spec = spec || {}; + + var that = {}; + + that.entity = spec.entity; + + that.facets_created = function() { + }; + + return that; +}; + +IPA.entity_policies = function(spec) { + + var that = {}; + + that.entity = spec.entity; + that.policies = []; + + that.add_policy = function(policy) { + + policy.entity = that.entity; + that.policies.push(policy); + }; + + that.add_policies = function(policies) { + + if (!policies) return; + + for (var i=0; i<policies.length; i++) { + that.add_policy(policies[i]); + } + }; + + that.facets_created = function() { + + for (var i=0; i<that.policies.length; i++) { + that.policies[i].facets_created(); + } + }; + + that.add_policies(spec.policies); + + return that; +}; + +IPA.facet_update_policy = function(spec) { + + spec = spec || {}; + + var that = IPA.entity_policy(); + + that.event = spec.event || 'on_update'; + that.source_facet_name = spec.source_facet; + that.dest_facet_name = spec.dest_facet; + that.dest_entity_name = spec.dest_entity; + + that.facets_created = function() { + + that.source_facet = that.entity.get_facet(that.source_facet_name); + var dest_entity = that.entity; + if (that.dest_entity_name) { + dest_entity = IPA.get_entity(that.dest_entity_name); + if (!dest_entity) return; + } + that.dest_facet = dest_entity.get_facet(that.dest_facet_name); + + if (!that.source_facet || !that.dest_facet) return; + + var event = that.source_facet[that.event]; + if (!event && !event.attach) return; + + event.attach(that.set_expired_flag); + }; + + that.set_expired_flag = function() { + + that.dest_facet.set_expired_flag(); + }; + + return that; +}; + +IPA.adder_facet_update_policy = function(spec) { + + spec = spec || {}; + + var that = IPA.entity_policy(); + + that.event = spec.event || 'added'; + that.dialog_name = spec.dialog_name || 'add'; + that.dest_facet_name = spec.dest_facet || 'details'; + that.dest_entity_name = spec.dest_entity; + + that.facets_created = function() { + + that.dialog = that.entity.get_dialog(that.dialog_name); + var dest_entity = that.entity; + if (that.dest_entity_name) { + dest_entity = IPA.get_entity(that.dest_entity_name); + if (!dest_entity) return; + } + that.dest_facet = dest_entity.get_facet(that.dest_facet_name); + + if (!that.dialog || !that.dest_facet) return; + + var event = that.dialog[that.event]; + if (!event && !event.attach) return; + + event.attach(that.set_expired_flag); + }; + + that.set_expired_flag = function() { + + that.dest_facet.set_expired_flag(); + }; + + return that; +}; + +IPA.search_facet_update_policy = function(spec) { + + spec = spec || {}; + spec.source_facet = 'search'; + spec.dest_facet = 'details'; + + return IPA.facet_update_policy(spec); +}; + +IPA.details_facet_update_policy = function(spec) { + + spec = spec || {}; + spec.source_facet = 'details'; + spec.dest_facet = 'search'; + + return IPA.facet_update_policy(spec); };
\ No newline at end of file diff --git a/install/ui/facet.js b/install/ui/facet.js index a38bcddfa..01e8a935f 100644 --- a/install/ui/facet.js +++ b/install/ui/facet.js @@ -48,6 +48,7 @@ IPA.facet = function(spec) { that.expired_flag = true; that.last_updated = null; that.expire_timeout = spec.expire_timeout || 600; //[seconds] + that.on_update = IPA.observer(); that.dialogs = $.ordered_map(); diff --git a/install/ui/hbac.js b/install/ui/hbac.js index 6bd63d4ec..007654dca 100644 --- a/install/ui/hbac.js +++ b/install/ui/hbac.js @@ -518,6 +518,7 @@ IPA.hbacrule_details_facet = function(spec) { that.update_on_success = function(data, text_status, xhr) { that.refresh(); + that.on_update.notify(); }; that.update_on_error = function(xhr, text_status, error_thrown) { diff --git a/install/ui/selinux.js b/install/ui/selinux.js index 8f800d7de..ddc8beebc 100644 --- a/install/ui/selinux.js +++ b/install/ui/selinux.js @@ -282,6 +282,7 @@ IPA.selinux_details_facet = function(spec) { that.update_on_success = function(data, text_status, xhr) { that.refresh(); + that.on_update.notify(); }; that.update_on_error = function(xhr, text_status, error_thrown) { diff --git a/install/ui/sudo.js b/install/ui/sudo.js index e343d6a4c..4fdcc52d1 100644 --- a/install/ui/sudo.js +++ b/install/ui/sudo.js @@ -633,6 +633,7 @@ IPA.sudorule_details_facet = function(spec) { that.update_on_success = function(data, text_status, xhr) { that.refresh(); + that.on_update.notify(); }; that.update_on_error = function(xhr, text_status, error_thrown) { |