function:
based on response of boot.libvirt generate a domain.xml
refer-to:
commit 457644c0486e0786ed8b563c6e4928445eea0207
if you want to test with your domain.xml, define vt field in job.yaml
vt:
domain: xxx/xxx.xml
if not will use default options to generate a domain.xml
TODO:
support combined templates
---
providers/lib/action.rb | 75 +++++++++++++++++++++++++++++++++++++++++
providers/lib/domain.rb | 75 +++++++++++++++++++++++++++++++++++++++++
2 files changed, 150 insertions(+)
create mode 100644 providers/lib/action.rb
create mode 100644 providers/lib/domain.rb
diff --git a/providers/lib/action.rb b/providers/lib/action.rb
new file mode 100644
index 0000000..526d84d
--- /dev/null
+++ b/providers/lib/action.rb
@@ -0,0 +1,75 @@
+# SPDX-License-Identifier: MulanPSL-2.0+
+# Copyright (c) 2020 Huawei Technologies Co., Ltd. All rights reserved.
+# frozen_string_literal: true
+
+# expand each element of the domain.xml
+module Action
+ TEMPLATE_DIR = "#{ENV['CCI_SRC']}/providers/libvirt/templates"
+ def expand_erb(file)
+ @context.expand_erb(File.read(file))
+ end
+
+ def domain
+ @doc = Nokogiri::XML(expand_erb(@domain_option))
+ end
+
+ def name
+ @doc.xpath('//domain/name').remove
+ @doc.root.add_child expand_erb("#{TEMPLATE_DIR}/name.xml")
+ end
+
+ def os
+ @doc.xpath('//domain/os').remove
+ @doc.root.add_child expand_erb("#{TEMPLATE_DIR}/os.xml")
+ end
+
+ def emulator
+ @doc.xpath('//domain/devices/emulator').remove
+ @doc.xpath('//domain/devices')[0].add_child expand_erb("#{TEMPLATE_DIR}/emulator.xml")
+ end
+
+ def cpu
+ @doc.root.add_child expand_erb("#{TEMPLATE_DIR}/cpu.xml")
+ end
+
+ def memory
+ @doc.xpath('//domain/memory').remove
+ @doc.xpath('//domain/currentMemory').remove
+ @doc.xpath('//domain/maxMemory').remove
+ @doc.root.add_child expand_erb("#{TEMPLATE_DIR}/memory.xml")
+ end
+
+ def devices
+ @doc.root.add_child expand_erb("#{TEMPLATE_DIR}/devices.xml")
+ end
+
+ def disk
+ @context.info['disk'] ||= nil
+ @doc.xpath('//domain/devices')[0].add_child expand_erb("#{TEMPLATE_DIR}/disk.xml")
+ end
+
+ def serial
+ @doc.xpath('//domain/devices/serial').remove
+ @doc.xpath('//domain/devices')[0].add_child expand_erb("#{TEMPLATE_DIR}/serial.xml")
+ end
+
+ def interface
+ @doc.xpath('//domain/devices/interface').remove
+ @doc.xpath('//domain/devices')[0].add_child expand_erb("#{TEMPLATE_DIR}/interface.xml")
+ end
+
+ def active
+ @doc.xpath('//domain/on_poweroff').remove
+ @doc.xpath('//domain/on_reboot').remove
+ @doc.xpath('//domain/on_crash').remove
+ @doc.root.add_child expand_erb("#{TEMPLATE_DIR}/active.xml")
+ end
+
+ def clock
+ @doc.root.add_child expand_erb("#{TEMPLATE_DIR}/clock.xml")
+ end
+
+ def seclabel
+ @doc.root.add_child expand_erb("#{TEMPLATE_DIR}/seclabel.xml")
+ end
+end
diff --git a/providers/lib/domain.rb b/providers/lib/domain.rb
new file mode 100644
index 0000000..8df9c06
--- /dev/null
+++ b/providers/lib/domain.rb
@@ -0,0 +1,75 @@
+# SPDX-License-Identifier: MulanPSL-2.0+
+# Copyright (c) 2020 Huawei Technologies Co., Ltd. All rights reserved.
+# frozen_string_literal: true
+
+require 'json'
+require 'set'
+require 'nokogiri'
+require 'yaml'
+require_relative 'action'
+require_relative "#{ENV['LKP_SRC']}/lib/hashugar"
+
+# generate a domain.xml
+class Domain
+ include Action
+
+ TEMPLATE_DIR = "#{ENV['CCI_SRC']}/providers/libvirt/templates"
+ OPTION_FILE = "#{TEMPLATE_DIR}/options.yaml"
+ def initialize(context, logger)
+ @doc = nil
+ @context = context
+ @logger = logger
+ @options = Hashugar.new(YAML.safe_load(File.read(OPTION_FILE)))
+ end
+
+ def generate
+ domain_option
+ if user_domain?
+ default_option
+ return
+ end
+ replaceable_option
+ default_option
+ end
+
+ def save_to(filename)
+ File.open(filename, 'w') do |f|
+ f.puts @doc.to_xml
+ end
+ File.realpath(filename)
+ end
+
+ private
+
+ def user_domain?
+ @context.info['vt'].key?('domain')
+ end
+
+ def load_xml_file(filepath)
+ host = @context.info['SRV_HTTP_HOST']
+ port = @context.info['SRV_HTTP_PORT']
+ system "wget --timestamping --progress=bar:force http://#{host}:#{port}/cci/libvirt-xml/#{filepath}"
+ %x(basename #{filepath}).chomp
+ end
+
+ def domain_option
+ @domain_option = "#{TEMPLATE_DIR}/#{(a)options.domain}.xml"
+ if user_domain?
+ @domain_option = load_xml_file((a)context.info['vt']['domain'])
+ end
+ @logger.info("Domain option: #{@domain_option}")
+ domain
+ end
+
+ def default_option
+ @options.default.each do |one|
+ instance_eval one
+ end
+ end
+
+ def replaceable_option
+ @options.replaceable.each do |one|
+ instance_eval one
+ end
+ end
+end
--
2.23.0