From 1eb57600185f96e61d0894148a5f50870173c7cd Mon Sep 17 00:00:00 2001 From: Pavel Vomacka Date: Thu, 2 Jun 2016 13:10:07 +0200 Subject: [PATCH] Add server roles on topology page Adds new tab on topology page which shows server roles. Also extends server details page and server config page (setting of ca renewal server). https://fedorahosted.org/freeipa/ticket/5906 Reviewed-By: Petr Vobornik --- .../ui/src/freeipa/navigation/menu_spec.js | 5 + install/ui/src/freeipa/serverconfig.js | 7 + install/ui/src/freeipa/topology.js | 129 ++++++++++++++++++ install/ui/test/data/ipa_init.json | 4 + ipaserver/plugins/internal.py | 4 + 5 files changed, 149 insertions(+) diff --git a/install/ui/src/freeipa/navigation/menu_spec.js b/install/ui/src/freeipa/navigation/menu_spec.js index 0afc7dace..442e7c771 100644 --- a/install/ui/src/freeipa/navigation/menu_spec.js +++ b/install/ui/src/freeipa/navigation/menu_spec.js @@ -220,6 +220,11 @@ var nav = {}; facet: 'search', hidden: true }, + { + entity: 'server_role', + facet: 'search', + hidden: true + }, { entity: 'domainlevel', facet: 'details', diff --git a/install/ui/src/freeipa/serverconfig.js b/install/ui/src/freeipa/serverconfig.js index 70bb9574b..2bc4e88b0 100644 --- a/install/ui/src/freeipa/serverconfig.js +++ b/install/ui/src/freeipa/serverconfig.js @@ -95,6 +95,13 @@ return { { $type: 'multivalued', name: 'ipauserobjectclasses' + }, + { + $type: 'entity_select', + name: 'ca_renewal_master_server', + other_entity: 'server', + other_field: 'cn', + flags: ['w_if_no_aci'] } ] }, diff --git a/install/ui/src/freeipa/topology.js b/install/ui/src/freeipa/topology.js index 290dc3825..139f95625 100644 --- a/install/ui/src/freeipa/topology.js +++ b/install/ui/src/freeipa/topology.js @@ -50,6 +50,7 @@ var topology = IPA.topology = { facets: { suffix_search: 'topologysuffix_search', server_search: 'server_search', + server_role_search: 'server_role_search', domainlevel: 'domainlevel_details', topologygraph: 'topology-graph', location_search: 'location_search' @@ -240,6 +241,14 @@ return { { name: 'ipalocationweight', placeholder: '100' + }, + { + $type: 'association_table', + other_entity: 'server_role', + name: 'enabled_role_servrole', + footer: false, + read_only: true, + selectable: false } ] } @@ -248,6 +257,55 @@ return { ] };}; + +var make_serverroles_spec = function() { +return { + name: 'server_role', + facet_groups: [ 'role_servers' ], + facets: [ + { + $factory: topology.serverroles_search_facet, + $type: 'search', + primary_key_name: 'role_servrole', + search_all_entries: true, + disable_search_field: true, + no_update: true, + selectable: false, + disable_facet_tabs: false, + tabs_in_sidebar: true, + tab_label: '@i18n:objects.server_role.label', + label: '@i18n:objects.server_role.label', + facet_groups: [topology.search_facet_group], + facet_group: 'search', + columns: [ + 'role_servrole', + 'status' + ] + }, + { + $factory: topology.serverroles_nested_search_facet, + $type: 'nested_search', + primary_key_name: 'server_server', + search_all_entries: true, + disable_search_field: true, + no_update: true, + selectable: false, + nested_entity: 'server_role', + facet_group: 'role_servers', + label: '@i18n:objects.server_role.label_singular', + columns: [ + { + name: 'server_server', + target_entity: 'server', + target_facet: 'details', + link: true + }, + 'status' + ] + } + ] +};}; + var make_domainlevel_spec = function() { return { name: 'domainlevel', @@ -399,6 +457,69 @@ topology.location_adapter = declare([mod_field.Adapter], { } }); +topology.serverroles_search_facet = function(spec) { + + spec = spec || {}; + + var that = IPA.search_facet(spec); + + that.filter_records = function(records_map, pkey, record) { + + var stored_record = records_map.get(pkey); + if (!stored_record) return true; + + // set priority to all possible values. Value with higher priority + // will overwrite a value with lower prio. + var priority_map = { + absent: 0, + configured: 1, + enabled: 2 + }; + + var priority_old = priority_map[stored_record.status]; + var priority_new = priority_map[record.status]; + return priority_new >= priority_old; + }; + + that.get_refresh_command_args = function() { + // We need to call find command with no argument. + return; + }; + + return that; +}; + +topology.serverroles_nested_search_facet = function(spec) { + + spec = spec || {}; + spec.disable_facet_tabs = true; + + var that = IPA.nested_search_facet(spec); + + that.get_refresh_command_args = function() { + // We need to call find command with no argument. + return; + }; + + that.get_refresh_command_options = function() { + return { 'role_servrole': that.get_pkey() }; + }; + + that.on_column_link_click = function(value, entity) { + var pkeys = [value]; + + navigation.show_entity('server', that.details_facet_name, pkeys); + return false; + }; + + that.filter_records = function(records_map, pkey, record) { + // Return false when the status is 'absent' + return record.status !== 'absent'; + }; + + return that; +}; + topology.location_server_adder_dialog = function(spec) { spec = spec || {}; @@ -1204,6 +1325,13 @@ topology.segment_spec = make_segment_spec(); */ topology.server_spec = make_server_spec(); +/** + * IPA server roles entity specification object + * @member topology + */ +topology.serverroles_spec = make_serverroles_spec(); + + /** * Domain Level entity specification object * @member topology @@ -1225,6 +1353,7 @@ topology.register = function() { e.register({type: 'topologysuffix', spec: topology.suffix_spec}); e.register({type: 'topologysegment', spec: topology.segment_spec}); e.register({type: 'server', spec: topology.server_spec}); + e.register({type: 'server_role', spec: topology.serverroles_spec}); e.register({type: 'domainlevel', spec: topology.domainlevel_spec}); e.register({type: 'location', spec: topology.location_spec}); diff --git a/install/ui/test/data/ipa_init.json b/install/ui/test/data/ipa_init.json index 4ccf49f88..52031040b 100644 --- a/install/ui/test/data/ipa_init.json +++ b/install/ui/test/data/ipa_init.json @@ -521,6 +521,10 @@ "specified_users": "Specified Users and Groups", "user": "User" }, + "server_role": { + "label": "Server Roles", + "label_singular": "Server Role", + }, "service": { "auth_indicators": "Authentication indicators", "auth_indicator": "Authentication indicator", diff --git a/ipaserver/plugins/internal.py b/ipaserver/plugins/internal.py index c44c260f5..82d0b2398 100644 --- a/ipaserver/plugins/internal.py +++ b/ipaserver/plugins/internal.py @@ -660,6 +660,10 @@ class i18n_messages(Command): "specified_users": _("Specified Users and Groups"), "user": _("User"), }, + "server_role": { + "label": _("Server Roles"), + "label_singular": _("Server Role"), + }, "service": { "auth_indicators": _("Authentication indicators"), "auth_indicator": _("Authentication indicator"),