diff --git a/app/models/ems_event/automate.rb b/app/models/ems_event/automate.rb index 95f0a23609f..b5ee866b121 100644 --- a/app/models/ems_event/automate.rb +++ b/app/models/ems_event/automate.rb @@ -12,6 +12,18 @@ def refresh(*targets, sync) EmsRefresh.queue_refresh(refresh_targets, nil, sync) end + def refresh_new_target + ems = ext_management_system + if ems.supports_refresh_new_target? + ep_class = ems.class::EventParser + target_hash = ep_class.parse_new_target(full_data, message, ems) + + EmsRefresh.queue_refresh_new_target(target_hash, ems) + else + EmsRefresh.queue_refresh(ems) + end + end + def policy(target_str, policy_event, param = nil) _log.debug("ems: [#{ems_id}]") return if ems_id.nil? diff --git a/app/models/ems_refresh.rb b/app/models/ems_refresh.rb index 13261e9e42f..fdb424bca62 100644 --- a/app/models/ems_refresh.rb +++ b/app/models/ems_refresh.rb @@ -57,6 +57,19 @@ def self.queue_refresh(target, id = nil, sync = false) end end + def self.queue_refresh_new_target(target_hash, ems) + MiqQueue.put( + :queue_name => MiqEmsRefreshWorker.queue_name_for_ems(ems), + :class_name => name, + :method_name => 'refresh_new_target', + :role => "ems_inventory", + :zone => ems.my_zone, + :args => [target_hash, ems.id], + :msg_timeout => queue_timeout, + :task_id => nil + ) + end + def self.refresh(target, id = nil) EmsRefresh.init_console if defined?(Rails::Console) @@ -79,6 +92,18 @@ def self.refresh(target, id = nil) end end + def self.refresh_new_target(target_hash, ems_id) + ems = ExtManagementSystem.find(ems_id) + + target = save_new_target(target_hash) + if target.nil? + _log.warn "Unknown target for event data: #{target_hash}." + return + end + + ems.refresher.refresh(get_ar_objects(target)) + end + def self.get_ar_objects(target, single_id = nil) # Handle targets passed as a single class/id pair, an array of class/id pairs, an array of references target = [[target, single_id]] unless single_id.nil? diff --git a/app/models/ems_refresh/save_inventory.rb b/app/models/ems_refresh/save_inventory.rb index 2bdfb41c0c3..9c3fa3aa281 100644 --- a/app/models/ems_refresh/save_inventory.rb +++ b/app/models/ems_refresh/save_inventory.rb @@ -309,4 +309,32 @@ def save_snapshots_inventory(vm, hashes) def save_event_logs_inventory(os, hashes) save_inventory_multi(os.event_logs, hashes, :use_association, [:uid]) end + + def save_new_target(target_hash) + unless target_hash[:vm].nil? + vm_hash = target_hash[:vm] + existing_vm = VmOrTemplate.find_by(:ems_ref => vm_hash[:ems_ref], :ems_id => target_hash[:ems_id]) + unless existing_vm.nil? + return existing_vm + end + + ems = ExtManagementSystem.find_by_id(target_hash[:ems_id]) + old_cluster = get_cluster(ems, target_hash[:cluster], target_hash[:resource_pools], target_hash[:folders]) + + vm_hash[:ems_cluster_id] = old_cluster[:id] + + new_vm = ems.vms_and_templates.create!(vm_hash) + + dc = old_cluster.parent_datacenter + vm_folder = dc.children.select { |folder| folder.name == "vm" }[0] + vm_folder.add_vm(new_vm) + vm_folder.save! + + resource_pool = old_cluster.children.first + resource_pool.add_vm(new_vm) + resource_pool.save! + + new_vm + end + end end diff --git a/app/models/ems_refresh/save_inventory_helper.rb b/app/models/ems_refresh/save_inventory_helper.rb index af3de072374..aea059b855f 100644 --- a/app/models/ems_refresh/save_inventory_helper.rb +++ b/app/models/ems_refresh/save_inventory_helper.rb @@ -149,4 +149,22 @@ def relation_values(association, target) top_level && (target == true || target.nil? || parent == target) ? :use_association : [] end + + def get_cluster(ems, cluster_hash, rp_hash, dc_hash) + cluster = EmsCluster.find_by(:ems_ref => cluster_hash[:ems_ref], :ems_id => ems.id) + if cluster.nil? + rp = ems.resource_pools.create!(rp_hash) + + cluster = ems.clusters.create!(cluster_hash) + + cluster.add_resource_pool(rp) + cluster.save! + + dc = Datacenter.find_by(:ems_ref => dc_hash[:ems_ref], :ems_id => ems.id) + dc.add_cluster(cluster) + dc.save! + end + + cluster + end end diff --git a/app/models/manageiq/providers/redhat/infra_manager.rb b/app/models/manageiq/providers/redhat/infra_manager.rb index bdd5197b382..a1824dae578 100644 --- a/app/models/manageiq/providers/redhat/infra_manager.rb +++ b/app/models/manageiq/providers/redhat/infra_manager.rb @@ -16,6 +16,7 @@ class ManageIQ::Providers::Redhat::InfraManager < ManageIQ::Providers::InfraMana include_concern :ApiIntegration supports :provisioning + supports :refresh_new_target def self.ems_type @ems_type ||= "rhevm".freeze diff --git a/app/models/manageiq/providers/redhat/infra_manager/event_parser.rb b/app/models/manageiq/providers/redhat/infra_manager/event_parser.rb index 2128c23581a..0c4e0b047e7 100644 --- a/app/models/manageiq/providers/redhat/infra_manager/event_parser.rb +++ b/app/models/manageiq/providers/redhat/infra_manager/event_parser.rb @@ -58,4 +58,49 @@ def self.ems_ref_from_object_in_event(data) return nil unless data.respond_to?(:[]) ManageIQ::Providers::Redhat::InfraManager.make_ems_ref(data[:href]) end + + def self.parse_new_target(full_data, message, ems) + cluster = full_data[:cluster] + cluster_ref = ManageIQ::Providers::Redhat::InfraManager.make_ems_ref(cluster[:href]) + + cluster_name = ems.with_provider_connection do |rhevm| + Ovirt::Cluster.find_by_href(rhevm, cluster_ref).try(:[], :name) + end + + { + :ems_id => ems.id, + :vm => parse_new_vm(full_data[:vm], message), + :cluster => parse_new_cluster(cluster_ref, cluster[:id], cluster_name), + :resource_pools => parse_new_rp(cluster[:id], cluster_name), + :folders => parse_new_dc(full_data[:data_center]) + } + end + + def self.parse_new_vm(vm, message) + ems_ref = ManageIQ::Providers::Redhat::InfraManager.make_ems_ref(vm[:href]) + + ManageIQ::Providers::Redhat::InfraManager::RefreshParser.create_vm_hash( + ems_ref.include?('/templates/'), ems_ref, vm[:id], message.split(/\s/)[1]) + end + + def self.parse_new_cluster(cluster_ref, cluster_id, cluster_name) + { + :ems_ref => cluster_ref, + :ems_ref_obj => cluster_ref, + :uid_ems => cluster_id, + :name => cluster_name + } + end + + def self.parse_new_rp(cluster_id, cluster_name) + { + :name => "Default for Cluster #{cluster_name}", + :uid_ems => "#{cluster_id}_respool", + :is_default => true, + } + end + + def self.parse_new_dc(dc) + {:ems_ref => ManageIQ::Providers::Redhat::InfraManager.make_ems_ref(dc[:href])} + end end diff --git a/app/models/manageiq/providers/redhat/infra_manager/refresh_parser.rb b/app/models/manageiq/providers/redhat/infra_manager/refresh_parser.rb index f089090a430..8ec78935087 100644 --- a/app/models/manageiq/providers/redhat/infra_manager/refresh_parser.rb +++ b/app/models/manageiq/providers/redhat/infra_manager/refresh_parser.rb @@ -401,19 +401,13 @@ def self.vm_inv_to_hashes(inv, _storage_inv, storage_uids, cluster_uids, host_ui ems_ref = ManageIQ::Providers::Redhat::InfraManager.make_ems_ref(vm_inv[:href]) - new_result = { - :type => template ? "ManageIQ::Providers::Redhat::InfraManager::Template" : "ManageIQ::Providers::Redhat::InfraManager::Vm", - :ems_ref => ems_ref, - :ems_ref_obj => ems_ref, - :uid_ems => vm_inv[:id], + new_result = create_vm_hash(template, ems_ref, vm_inv[:id], URI.decode(vm_inv[:name])) + + additional = { :memory_reserve => vm_memory_reserve(vm_inv), - :name => URI.decode(vm_inv[:name]), - :vendor => "redhat", :raw_power_state => raw_power_state, - :location => "#{vm_inv[:id]}.ovf", :boot_time => boot_time, :connection_state => 'connected', - :template => template, :host => host, :ems_cluster => ems_cluster, :storages => storages, @@ -423,6 +417,7 @@ def self.vm_inv_to_hashes(inv, _storage_inv, storage_uids, cluster_uids, host_ui :custom_attributes => vm_inv_to_custom_attribute_hashes(vm_inv), :snapshots => vm_inv_to_snapshot_hashes(vm_inv), } + new_result.merge!(additional) # Attach to the cluster's default resource pool ems_cluster[:ems_children][:resource_pools].first[:ems_children][:vms] << new_result if ems_cluster && !template @@ -433,6 +428,19 @@ def self.vm_inv_to_hashes(inv, _storage_inv, storage_uids, cluster_uids, host_ui return result, result_uids end + def self.create_vm_hash(template, ems_ref, vm_id, name) + { + :type => template ? "ManageIQ::Providers::Redhat::InfraManager::Template" : "ManageIQ::Providers::Redhat::InfraManager::Vm", + :ems_ref => ems_ref, + :ems_ref_obj => ems_ref, + :uid_ems => vm_id, + :vendor => "redhat", + :name => name, + :location => "#{vm_id}.ovf", + :template => template, + } + end + def self.vm_inv_to_hardware_hash(inv) return nil if inv.nil? diff --git a/app/models/manageiq/providers/redhat/infra_manager/refresher.rb b/app/models/manageiq/providers/redhat/infra_manager/refresher.rb index a08d8c19463..4b8fcec6a89 100644 --- a/app/models/manageiq/providers/redhat/infra_manager/refresher.rb +++ b/app/models/manageiq/providers/redhat/infra_manager/refresher.rb @@ -36,7 +36,7 @@ def collect_inventory_for_targets(ems, targets) :data_center => target.parent_datacenter.ems_ref, :vm => vm, :template => "/api/templates?search=vm.id=#{vm_id}", - :storage => target.storages.map(&:ems_ref) + :storage => target.storages.empty? ? {:storagedomains => "storage_domain"} : target.storages.map(&:ems_ref) }, :secondary => { :vm => [:disks, :snapshots, :nics], diff --git a/app/models/mixins/supports_feature_mixin.rb b/app/models/mixins/supports_feature_mixin.rb index 43912273338..d19e96d6965 100644 --- a/app/models/mixins/supports_feature_mixin.rb +++ b/app/models/mixins/supports_feature_mixin.rb @@ -76,6 +76,7 @@ module SupportsFeatureMixin :provisioning => 'Provisioning', :reboot_guest => 'Reboot Guest Operation', :reconfigure => 'Reconfiguration', + :refresh_new_target => 'Refresh non-existing record', :regions => 'Regions of a Provider', :resize => 'Resizing', :retire => 'Retirement', diff --git a/db/fixtures/ae_datastore/ManageIQ/System/Event/EmsEvent/RHEVM.class/user_add_vm.yaml b/db/fixtures/ae_datastore/ManageIQ/System/Event/EmsEvent/RHEVM.class/user_add_vm.yaml index 446f0bbf1ea..4995510aa9b 100644 --- a/db/fixtures/ae_datastore/ManageIQ/System/Event/EmsEvent/RHEVM.class/user_add_vm.yaml +++ b/db/fixtures/ae_datastore/ManageIQ/System/Event/EmsEvent/RHEVM.class/user_add_vm.yaml @@ -9,4 +9,4 @@ object: description: fields: - rel5: - value: "/System/event_handlers/event_action_refresh?target=src_ems_cluster" + value: "/System/event_handlers/event_action_refresh_new_target?target=src_vm" diff --git a/db/fixtures/ae_datastore/ManageIQ/System/Event/EmsEvent/RHEVM.class/user_add_vm_finished_success.yaml b/db/fixtures/ae_datastore/ManageIQ/System/Event/EmsEvent/RHEVM.class/user_add_vm_finished_success.yaml index 4284dddce3e..ac34ae40988 100644 --- a/db/fixtures/ae_datastore/ManageIQ/System/Event/EmsEvent/RHEVM.class/user_add_vm_finished_success.yaml +++ b/db/fixtures/ae_datastore/ManageIQ/System/Event/EmsEvent/RHEVM.class/user_add_vm_finished_success.yaml @@ -9,4 +9,4 @@ object: description: fields: - rel4: - value: "/System/event_handlers/event_action_refresh?target=ems" + value: "/System/event_handlers/event_action_refresh_new_target?target=src_vm" diff --git a/db/fixtures/ae_datastore/ManageIQ/System/event_handlers.class/__methods__/event_action_refresh_new_target.yaml b/db/fixtures/ae_datastore/ManageIQ/System/event_handlers.class/__methods__/event_action_refresh_new_target.yaml new file mode 100644 index 00000000000..0dee5080df9 --- /dev/null +++ b/db/fixtures/ae_datastore/ManageIQ/System/event_handlers.class/__methods__/event_action_refresh_new_target.yaml @@ -0,0 +1,32 @@ +--- +object_type: method +version: 1.0 +object: + attributes: + name: event_action_refresh_new_target + display_name: + description: + scope: instance + language: ruby + location: builtin + inputs: + - field: + aetype: + name: target + display_name: + datatype: string + priority: 1 + owner: + default_value: + substitute: true + message: create + visibility: + collect: + scope: + description: + condition: + on_entry: + on_exit: + on_error: + max_retries: + max_time: diff --git a/db/fixtures/ae_datastore/ManageIQ/System/event_handlers.class/event_action_refresh_new_target.yaml b/db/fixtures/ae_datastore/ManageIQ/System/event_handlers.class/event_action_refresh_new_target.yaml new file mode 100644 index 00000000000..1fe146fcff0 --- /dev/null +++ b/db/fixtures/ae_datastore/ManageIQ/System/event_handlers.class/event_action_refresh_new_target.yaml @@ -0,0 +1,12 @@ +--- +object_type: instance +version: 1.0 +object: + attributes: + display_name: + name: event_action_refresh_new_target + inherits: + description: + fields: + - meth1: + value: event_action_refresh_new_target diff --git a/lib/miq_automation_engine/engine/miq_ae_builtin_method.rb b/lib/miq_automation_engine/engine/miq_ae_builtin_method.rb index 918ba051b22..a8cc8e47019 100644 --- a/lib/miq_automation_engine/engine/miq_ae_builtin_method.rb +++ b/lib/miq_automation_engine/engine/miq_ae_builtin_method.rb @@ -114,6 +114,10 @@ def self.miq_event_action_refresh_sync(obj, inputs) event_object_from_workspace(obj).refresh(inputs['target'], true) end + def self.miq_event_action_refresh_new_target(obj, _inputs) + event_object_from_workspace(obj).refresh_new_target + end + def self.miq_event_action_policy(obj, inputs) event_object_from_workspace(obj).policy(inputs['target'], inputs['policy_event'], inputs['param']) end diff --git a/lib/miq_automation_engine/service_models/miq_ae_service_ems_event.rb b/lib/miq_automation_engine/service_models/miq_ae_service_ems_event.rb index fa2630ee29a..00bf6afcf9a 100644 --- a/lib/miq_automation_engine/service_models/miq_ae_service_ems_event.rb +++ b/lib/miq_automation_engine/service_models/miq_ae_service_ems_event.rb @@ -4,6 +4,10 @@ def refresh(*targets, sync) ar_method { @object.refresh(*targets, sync) } unless targets.blank? end + def refresh_new_target + ar_method { @object.refresh_new_target } + end + def policy(target_str, policy_event, param) ar_method { @object.policy(target_str, policy_event, param) } end diff --git a/spec/models/manageiq/providers/redhat/infra_manager/refresher_target_vm_spec.rb b/spec/models/manageiq/providers/redhat/infra_manager/refresher_target_vm_spec.rb index 043b9e11b8f..a93d8bf434c 100644 --- a/spec/models/manageiq/providers/redhat/infra_manager/refresher_target_vm_spec.rb +++ b/spec/models/manageiq/providers/redhat/infra_manager/refresher_target_vm_spec.rb @@ -54,6 +54,29 @@ assert_storage(storage, vm) end + it "should refresh new vm" do + vm = FactoryGirl.create(:vm_redhat, + :ext_management_system => @ems, + :uid_ems => "4f6dd4c3-5241-494f-8afc-f1c67254bf77", + :ems_cluster => @cluster, + :ems_ref => "/api/vms/4f6dd4c3-5241-494f-8afc-f1c67254bf77") + vm.with_relationship_type("ems_metadata") { vm.parent = @rp } + + VCR.use_cassette("#{described_class.name.underscore}_target_new_vm") do + EmsRefresh.refresh(vm) + end + + assert_table_counts + + storage = Storage.find_by(:ems_ref => "/api/storagedomains/ee745353-c069-4de8-8d76-ec2e155e2ca0") + assert_vm(vm, storage) + + hardware = Hardware.find_by(:vm_or_template_id => vm.id) + assert_vm_rels(vm, hardware, storage) + assert_cluster + assert_storage(storage, vm) + end + def assert_table_counts expect(ExtManagementSystem.count).to eq(1) expect(EmsCluster.count).to eq(1) diff --git a/spec/vcr_cassettes/manageiq/providers/redhat/infra_manager/refresher_target_new_vm.yml b/spec/vcr_cassettes/manageiq/providers/redhat/infra_manager/refresher_target_new_vm.yml new file mode 100644 index 00000000000..1fcb74989ab --- /dev/null +++ b/spec/vcr_cassettes/manageiq/providers/redhat/infra_manager/refresher_target_new_vm.yml @@ -0,0 +1,1075 @@ +--- +http_interactions: +- request: + method: get + uri: https://192.168.1.31:8443/api + body: + encoding: US-ASCII + string: '' + headers: + Accept: + - "*/*" + Accept-Encoding: + - gzip, deflate + User-Agent: + - rest-client/2.0.0 (linux-gnu x86_64) ruby/2.3.0p0 + response: + status: + code: 401 + message: Unauthorized + headers: + Connection: + - keep-alive + Www-Authenticate: + - Basic realm="ENGINE" + Content-Type: + - text/html;charset=UTF-8 + Content-Length: + - '71' + Date: + - Mon, 22 Aug 2016 09:57:57 GMT + body: + encoding: UTF-8 + string: "ErrorUnauthorized" + http_version: + recorded_at: Mon, 22 Aug 2016 09:57:56 GMT +- request: + method: get + uri: https://admin%40internal:engine@192.168.1.31:8443/api + body: + encoding: US-ASCII + string: '' + headers: + Accept: + - "*/*" + Accept-Encoding: + - gzip, deflate + User-Agent: + - rest-client/2.0.0 (linux-gnu x86_64) ruby/2.3.0p0 + Version: + - '3' + Prefer: + - persistent-auth + response: + status: + code: 200 + message: OK + headers: + Connection: + - keep-alive + Set-Cookie: + - JSESSIONID=mwYV3UE_RAAqoOx7HlfOE7hlM5EH_cIfuOhEqiZf.f18; path=/api; HttpOnly + Content-Type: + - application/xml + Content-Length: + - '3745' + Jsessionid: + - mwYV3UE_RAAqoOx7HlfOE7hlM5EH_cIfuOhEqiZf + Link: + - "; rel=capabilities,; + rel=clusters,; rel=clusters/search,; + rel=datacenters,; + rel=datacenters/search,; rel=events,; + rel=events/search,; rel=hosts,; + rel=hosts/search,; rel=networks,; + rel=networks/search,; rel=roles,; + rel=storagedomains,; + rel=storagedomains/search,; rel=tags,; + rel=bookmarks,; rel=icons,; + rel=templates,; rel=templates/search,; + rel=instancetypes,; + rel=instancetypes/search,; rel=users,; + rel=users/search,; rel=groups,; + rel=groups/search,; rel=domains,; + rel=vmpools,; rel=vmpools/search,; + rel=vms,; rel=vms/search,; + rel=disks,; rel=disks/search,; + rel=jobs,; rel=storageconnections,; + rel=vnicprofiles,; rel=diskprofiles,; + rel=cpuprofiles,; rel=schedulingpolicyunits,; + rel=schedulingpolicies,; rel=permissions,; + rel=macpools,; rel=operatingsystems,; + rel=externalhostproviders,; + rel=openstackimageproviders,; + rel=openstackvolumeproviders,; + rel=openstacknetworkproviders,; + rel=katelloerrata" + Date: + - Mon, 22 Aug 2016 09:57:57 GMT + body: + encoding: ASCII-8BIT + string: | + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + oVirt Engine + ovirt.org + + 3.6.7_master + + + + 4 + 0 + + + 1 + 1 + + + 1 + 1 + + + 2 + 1 + + + + + http_version: + recorded_at: Mon, 22 Aug 2016 09:57:56 GMT +- request: + method: get + uri: https://192.168.1.31:8443/api/clusters/00000002-0002-0002-0002-0000000001e9 + body: + encoding: US-ASCII + string: '' + headers: + Accept: + - "*/*" + Accept-Encoding: + - gzip, deflate + User-Agent: + - rest-client/2.0.0 (linux-gnu x86_64) ruby/2.3.0p0 + Version: + - '3' + Prefer: + - persistent-auth + Cookie: + - JSESSIONID=mwYV3UE_RAAqoOx7HlfOE7hlM5EH_cIfuOhEqiZf.f18 + response: + status: + code: 200 + message: OK + headers: + Connection: + - keep-alive + Content-Type: + - application/xml + Content-Length: + - '2810' + Jsessionid: + - mwYV3UE_RAAqoOx7HlfOE7hlM5EH_cIfuOhEqiZf + Date: + - Mon, 22 Aug 2016 09:57:58 GMT + body: + encoding: ASCII-8BIT + string: | + + + + + + Default + The default server cluster + + + + + + + + X86_64 + + + + + + true + + + + none + none + + + + migrate + + true + false + false + false + false + false + false + false + false + + true + true + + + RANDOM assert_table_counts + + + true + + false + + + false + 50 + + + + inherit + inherit + + + http_version: + recorded_at: Mon, 22 Aug 2016 09:57:57 GMT +- request: + method: get + uri: https://192.168.1.31:8443/api/datacenters/00000001-0001-0001-0001-0000000002c0 + body: + encoding: US-ASCII + string: '' + headers: + Accept: + - "*/*" + Accept-Encoding: + - gzip, deflate + User-Agent: + - rest-client/2.0.0 (linux-gnu x86_64) ruby/2.3.0p0 + Version: + - '3' + Prefer: + - persistent-auth + Cookie: + - JSESSIONID=mwYV3UE_RAAqoOx7HlfOE7hlM5EH_cIfuOhEqiZf.f18 + response: + status: + code: 200 + message: OK + headers: + Connection: + - keep-alive + Content-Type: + - application/xml + Content-Length: + - '1354' + Jsessionid: + - mwYV3UE_RAAqoOx7HlfOE7hlM5EH_cIfuOhEqiZf + Date: + - Mon, 22 Aug 2016 09:57:58 GMT + body: + encoding: ASCII-8BIT + string: | + + + Default + The default Data Center + + + + + + + + false + v3 + + + + + + up + + + disabled + + http_version: + recorded_at: Mon, 22 Aug 2016 09:57:57 GMT +- request: + method: get + uri: https://192.168.1.31:8443/api/vms/4f6dd4c3-5241-494f-8afc-f1c67254bf77 + body: + encoding: US-ASCII + string: '' + headers: + Accept: + - "*/*" + Accept-Encoding: + - gzip, deflate + User-Agent: + - rest-client/2.0.0 (linux-gnu x86_64) ruby/2.3.0p0 + Version: + - '3' + Prefer: + - persistent-auth + Cookie: + - JSESSIONID=mwYV3UE_RAAqoOx7HlfOE7hlM5EH_cIfuOhEqiZf.f18 + response: + status: + code: 200 + message: OK + headers: + Connection: + - keep-alive + Content-Type: + - application/xml + Content-Length: + - '6098' + Jsessionid: + - mwYV3UE_RAAqoOx7HlfOE7hlM5EH_cIfuOhEqiZf + Date: + - Mon, 22 Aug 2016 09:57:58 GMT + body: + encoding: ASCII-8BIT + string: | + + + + + + + + + + + + + + + + + + + + + + + + + 123 + + + + + + + + + + + + + + + + desktop + + down + + 1073741824 + + + X86_64 + + 0 + + + false + + + + + + + 2016-07-05T16:41:35.374+02:00 + ovirt + false + false + + false + 1 + + + spice + 1 + false + false + false + true + true + LOCK_SCREEN + + + + + + + Etc/GMT + + false + + -1 + false + + + inherit + inherit + + + 0 + + + Etc/GMT + + + + + 1073741824 + false + +