vagrant-gpii-ci 0.0.1 → 0.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (48) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +44 -62
  3. data/gpii-ci.yml.template +44 -0
  4. data/lib/vagrant-gpii-ci/action/build_vagrantfile.rb +160 -0
  5. data/lib/vagrant-gpii-ci/action/init_environment.rb +7 -8
  6. data/lib/vagrant-gpii-ci/action/update_hosts.rb +138 -0
  7. data/lib/vagrant-gpii-ci/action.rb +8 -101
  8. data/lib/vagrant-gpii-ci/command/base.rb +1 -1
  9. data/lib/vagrant-gpii-ci/command/ci.rb +66 -0
  10. data/lib/vagrant-gpii-ci/command/init.rb +2 -2
  11. data/lib/vagrant-gpii-ci/command/test.rb +55 -47
  12. data/lib/vagrant-gpii-ci/plugin.rb +19 -16
  13. data/lib/vagrant-gpii-ci/version.rb +2 -2
  14. data/lib/vagrant-gpii-ci.rb +16 -3
  15. data/samples/gpii-linux/.gpii-ci.yml +25 -0
  16. data/samples/gpii-nexus/.gpii-ci.yml +26 -0
  17. data/samples/gpii-universal/.gpii-ci.yml +32 -0
  18. data/samples/gpii-windows/.gpii-ci.yml +33 -0
  19. data/spec/spec_helper.rb +4 -1
  20. data/spec/vagrant/gpiici_spec.rb +12 -0
  21. data/{vagrant-cienv.gemspec → vagrant-gpiici.gemspec} +3 -3
  22. metadata +15 -32
  23. data/lib/envs/default.json +0 -20
  24. data/lib/envs/linux-desktop.json +0 -22
  25. data/lib/envs/production.yml +0 -33
  26. data/lib/provisioning/base-playbook.yml +0 -16
  27. data/lib/provisioning/couchdb-playbook.yml +0 -11
  28. data/lib/provisioning/couchdb-requirements.yml +0 -5
  29. data/lib/provisioning/couchdb-vagrant-vars.yml +0 -1
  30. data/lib/provisioning/gpii-linux-playbook.yml +0 -11
  31. data/lib/provisioning/gpii-linux-requirements.yml +0 -6
  32. data/lib/provisioning/gpii-linux-vagrant-vars.yml +0 -23
  33. data/lib/provisioning/nodejs-playbook.yml +0 -12
  34. data/lib/provisioning/nodejs-requirements.yml +0 -7
  35. data/lib/provisioning/nodejs-vagrant-vars.yml +0 -11
  36. data/lib/provisioning/preferences-playbook.yml +0 -13
  37. data/lib/provisioning/preferences-requirements.yml +0 -9
  38. data/lib/provisioning/preferences-vagrant-vars.yml +0 -5
  39. data/lib/vagrant-gpii-ci/config/config_folders.rb +0 -17
  40. data/lib/vagrant-gpii-ci/config/config_network.rb +0 -69
  41. data/lib/vagrant-gpii-ci/config/config_provider.rb +0 -40
  42. data/lib/vagrant-gpii-ci/config/config_provision.rb +0 -50
  43. data/qi.yml.template +0 -56
  44. data/samples/gpii-linux/.qi.yml +0 -22
  45. data/samples/gpii-linux-production/.qi.yml +0 -41
  46. data/samples/gpii-nexus/.qi.yml +0 -24
  47. data/samples/gpii-universal/.qi.yml +0 -27
  48. data/spec/vagrant/cienv_spec.rb +0 -11
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: f84a3bc955514289f984de6bd5b4b18f42e31ca6
4
- data.tar.gz: a794a423590916f864c43d5b870a5c2438f45e3e
3
+ metadata.gz: 34f333fe7dab9d5a9d7cce696ee92c0393b9edd1
4
+ data.tar.gz: 5a57b071b54babf95d35a9783b270c0ebcaee40d
5
5
  SHA512:
6
- metadata.gz: 164d38c4cc0b4d7c92f3dde9180cf06dba4fba575a188cb1b1a13cf84457988e63cc940116793bd58c2f690da87e8b03674a2c82e85cbcb191fc9331ee326bf8
7
- data.tar.gz: 529c4a02a5f24b8fb52f68f0dffdabcf26c81493aab6b5fba9f5c458cc8be04145bb4a1b6dbce8fc0dd8f69310537571d8d8a9c94cd8e6b00883606cf062139c
6
+ metadata.gz: 805f875edb7a29b3c945932e0b4231faafa3a50db67b60fce0f6acee146666fad1ece7f96343bfba2fc041356def697e9d32dae748663e31b6d24c1ebe16ef2f
7
+ data.tar.gz: 6c7d40583bff99bbde2f97241987df40836005fc090730ab9a6db63b2cc98097db69a522c587f73cbf01df0d12dca64dc280d833f50bd1955a2252ea305100e0
data/README.md CHANGED
@@ -1,94 +1,76 @@
1
- Vagrant-vmenv
1
+ Vagrant-GPII-CI
2
2
  =============
3
3
 
4
- Vagrant-vmenv is a npm module that is used to extend the behavior of a
5
- Vagrantfile. It uses virtual machine definitions to spin up complete
4
+ Vagrant-GPII-CI is a vagrant plugin that is used to simplify the configuration stored in a Vagrantfile. It uses virtual machine definitions to spin up complete
6
5
  enviroments where you can run tests or run your code.
7
6
 
8
7
  Installation
9
8
  ------------
10
9
 
11
10
  ```
12
- npm install -g http://github.com/amatas/vagrant-vmenv
13
- cp node_modules/vagrant-vmenv/Vagrantfile.template Vagrantfile
14
- cp node_modules/vagrant-vmenv/qi.yml.template .qi.yml
11
+ vagrant plugin install vagrant-gpii-ci
15
12
  ```
16
13
 
17
- The Vagrantfile acts as a pointer to the module, it shouldn't be modified. If
18
- you want to make a change at the environment level do so in the [environment
19
- configuration file](envs/), and if you want to configure how the applications
20
- are deployed and tested do so in the [.qi.yml](qi.yml.template) file of your
21
- repository.
22
-
23
14
  Working with vms
24
15
  ----------------
25
16
 
17
+ No Vagrantfile is required if a file [.gpii-ci.yml](gpii-ci.yml.template) is found in the root of the repository.
18
+
19
+ The name of the file can be override using the environment variable `VAGRANT_CI_FILE`.
20
+
26
21
  Commands:
27
22
 
28
- * `vagrant up` to spin up the [environment](envs/) defined in the .qi.yml file.
29
- * `vagrant destroy` to stop and destroy the vm.
30
- * `vagrant halt` to shutdown the vm without destroy it.
23
+ * `vagrant up [vm]` to spin up the defined in the .ci_env variable of the [.gpii-ci.yml](gpii-ci.yml.template) file.
24
+ * `vagrant destroy [vm]` to stop and destroy the vm.
25
+ * `vagrant reload [vm]` to stop and destroy the vm.
26
+ * `vagrant halt [vm]` to shutdown the vm without destroy it.
27
+ * `vagrant ci test [vm]` to run all the stages defined in the selected vm
28
+
31
29
 
32
30
  Note:
33
31
 
34
- * `vagrant up` will exec the commands listed in the *setup* variable of each
35
- application listed in the .qi.yml file.
36
- * `vagrant provision` will exec the commands listed in the *test_cmds* variable
37
- of each application listed in the .qi.yml file.
32
+ * The `vm` parameter is not necessary in environments with only one VM defined.
38
33
 
39
- Networking
40
- ----------
34
+ Sample:
41
35
 
42
- A VM can have multiple virtual NICs. Two types are avilable for each NIC: public
43
- and private. The public NICs will be attached to the host's physical network,
44
- the private NICs will be attached to a private network only visible between the
45
- other VMs and the host. The IP address of a private network can be customized in
46
- the definition of the VM. An example of the network definition of a VM can be:
47
36
 
48
37
  ```
49
- networks:
50
- privatenet:
51
- type: private
52
- ip: 192.168.45.22
53
- publicnet:
54
- type: public
38
+ .ci_env:
39
+ default: &default
40
+ cpu: 2 # number of cpus
41
+ memory: 2048 # amount of RAM memory
42
+ clone: true # use the linked_clone Vagrant feature
43
+ autostart: false # only start a VM when it's specfied in the command line
44
+ vms:
45
+ windows10: # name of the VM
46
+ <<: *default # referece of the common part
47
+ 3d: true # enable 3D acceleration
48
+ sound: true # add a sound card to the VM
49
+ box: inclusivedesign/windows10-eval
50
+ windows81: # name of the VM
51
+ <<: *default # referece of the common part
52
+ box: inclusivedesign/windows81-eval-x64
53
+ windows7: # name of the VM
54
+ <<: *default # referece of the common part
55
+ box: inclusivedesign/windows7-eval-x64
55
56
  ```
56
57
 
57
- If an environment has multiple VMs definitions with several NICs the *hosts*
58
- file of each VM will list all the IP address of each VM plus the name of the VM,
59
- this is very useful to point services between the VMs.
60
-
61
- Forwarded ports
62
- ---------------
58
+ Networking
59
+ ----------
63
60
 
64
- The port forwarding is configured in the VMs definition. The `guest_port`
65
- variable is the source port to be mapped to the `host_port` variable. The
66
- `guest_port` must be set in each port forward block, `host_port` and protocol are
67
- optionals.
61
+ All the VMs have access to Internet using the gateway of the host through a NAT interface.
68
62
 
69
- ```
70
- ports:
71
- - guest_port: 8080
72
- host_port: 8888
73
- protocol: tcp
74
- - guest_port: 8181
75
- host_port: 9999
76
- - guest_port:8081
77
- ```
63
+ In the case of multi VM environments, a additional NIC card is create in each VM with a private IP of a private network that all the VMs share. The IP range of this network is 192.168.50.0/24. The IP address are assigned to each VM starting by 10.
78
64
 
79
- Shared folders
80
- --------------
65
+ Mapped ports
66
+ ---------------
81
67
 
82
- Each application can use a shared folder. If the *folder* variable of the
83
- application has a *src* key, Vagrant will map the path set in the src folder of
84
- the host to the path set in the *dest* variable in the VM.
68
+ The port mapping is configured in the VMs definition. The `mapped_ports`
69
+ variable is a list of ports that will be mapped from the VM to the host.
85
70
 
86
71
  ```
87
- folder:
88
- src: "."
89
- dest: "/app/universal"
72
+ mapped_ports:
73
+ - 8080
74
+ - 8181
90
75
  ```
91
76
 
92
- More samples definitions can be found either in the [envs](envs) directory or in
93
- the [qi.yml.template](qi.yml.template).
94
-
@@ -0,0 +1,44 @@
1
+ ---
2
+
3
+ # The variables that start with a dot "." are ignored by gitlab-ci,
4
+ # but they are used by the vagrant-gpii-ci plugin
5
+ #
6
+ # .ci_env variable defines the settings of each VM. The common variables are in
7
+ # the section 'default' which will be reference later in each VM definition.
8
+
9
+ .ci_env:
10
+ default: &default
11
+ cpu: 2 # number of cpus
12
+ memory: 2048 # amount of RAM memory
13
+ clone: true # use the linked_clone Vagrant feature
14
+ autostart: false # only start the VM specfied in the command line
15
+ vms:
16
+ windows10: # name of the VM
17
+ <<: *default # referece of the common part
18
+ box: inclusivedesign/windows10-eval
19
+ windows81: # name of the VM
20
+ <<: *default # referece of the common part
21
+ box: inclusivedesign/windows81-eval-x64
22
+ windows7: # name of the VM
23
+ <<: *default # referece of the common part
24
+ box: inclusivedesign/windows7-eval-x64
25
+
26
+ stages: # Stages to perform when 'ci test' command is invoked
27
+ - setup # name of the first stage to execute
28
+ - test # name of the second stage to execute
29
+
30
+ setup_job:
31
+ stage: setup # name of the stage
32
+ script: # Only one multiline script to execute
33
+ - |
34
+ choco upgrade firefox googlechrome -y
35
+ $moduleLocation = Join-Path $env:SystemDrive "vagrant/provisioning/Provisioning.psm1"
36
+ $destinationDir = Join-Path $env:SystemDrive "tmp"
37
+ cp $moduleLocation $destinationDir
38
+ test_job:
39
+ stage: test # name of the stage
40
+ script: # One line per command to execute
41
+ - provisioning/Chocolatey.ps1
42
+ - provisioning/Npm.ps1
43
+ - provisioning/Build.ps1
44
+ - provisioning/Installer.ps1
@@ -0,0 +1,160 @@
1
+ require 'yaml'
2
+
3
+ module VagrantPlugins
4
+ module GPIICi
5
+ module Action
6
+ class BuildVagrantfile
7
+
8
+ def initialize(app, env)
9
+ @app = app
10
+ end
11
+
12
+ def call(env)
13
+ @env = env
14
+
15
+ # The file .gpii-ci.yml can be override using this environment variable
16
+ ci_file ||= ENV["VAGRANT_CI_FILE"] if ENV.key?("VAGRANT_CI_FILE")
17
+ ci_file ||= ".gpii-ci.yml"
18
+
19
+ # Only if the ci_file is found the plugin will run
20
+ if File.exist?(project_home(@env).join(ci_file))
21
+
22
+ environment = @env[:env]
23
+ ci_definition = get_ci_definition (ci_file)
24
+ environment.instance_variable_set(:@ci_tests, get_ci_tests(ci_definition))
25
+ vagrantfile_proc = Proc.new do
26
+ Vagrant.configure(2) do |config|
27
+ build_vms_config(config, get_ci_environment(ci_definition))
28
+ end
29
+ end
30
+
31
+ # The Environment instance has been instantiated without a Vagrantfile
32
+ # that means that we need to store some internal variables and
33
+ # instantiate again the Vagrantfile instance with our previous code.
34
+ environment.instance_variable_set(:@root_path, project_home(@env))
35
+ environment.instance_variable_set(:@local_data_path, vagrant_home(@env))
36
+ # the cienv code will be the first item to check in the list of
37
+ # Vagrantfile sources
38
+ config_loader = environment.config_loader
39
+ config_loader.set(:cienv, vagrantfile_proc.call)
40
+ environment.instance_variable_set(:@vagrantfile, Vagrant::Vagrantfile.new(config_loader, [:cienv, :home, :root]))
41
+
42
+ end
43
+ @app.call(env)
44
+ end
45
+
46
+ def vagrant_home(env)
47
+ project_home(env).join(Vagrant::Environment::DEFAULT_LOCAL_DATA)
48
+ end
49
+
50
+ def project_home(env)
51
+ environment = env[:env]
52
+ environment.instance_variable_get(:@cwd)
53
+ end
54
+
55
+ def get_ci_tests(definition)
56
+ ci_tests = {}
57
+ definition[".ci_env"]["vms"].each do | vmname, vmdetails |
58
+
59
+ ci_tests["#{vmname}"] = {}
60
+ ci_tests["#{vmname}"]["shell"] = {}
61
+ definition["stages"].each do |stage|
62
+ definition.each do |stagename, stagecontent|
63
+ # Ignore the statements that start with a dot
64
+ next if stagename.start_with?(".") or stagename.eql?("stages") or not stagecontent["stage"].eql?(stage)
65
+ # Build the hash of tests for each VM
66
+ if stagecontent.include?("stage")
67
+ if vmdetails.include?("tags") and stagecontent.include?("tags")
68
+ ci_tests["#{vmname}"]["shell"][stagecontent["stage"]] = stagecontent["script"] \
69
+ if not (stagecontent["tags"] & vmdetails["tags"]).empty?
70
+ elsif not stagecontent.include?("tags")
71
+ ci_tests["#{vmname}"]["shell"][stagecontent["stage"]] = stagecontent["script"]
72
+ else
73
+ next
74
+ end
75
+ end
76
+ end
77
+ end
78
+ end
79
+ ci_tests
80
+ end
81
+
82
+ def get_ci_definition(definition_file)
83
+ # load the definition file
84
+ ci_file = File.expand_path(project_home(@env).join(definition_file))
85
+ @ci_definition = YAML.load(File.read(ci_file))
86
+ end
87
+
88
+ # In the case of a multiVM environment, we need to connect the VMs using
89
+ # a private network
90
+ def inject_private_network_config(ci_environment_vms)
91
+ return ci_environment_vms if ci_environment_vms.count() == 1
92
+ int_id = 10
93
+ ci_environment_vms.each do |vm,config|
94
+ ci_environment_vms[vm]["private_ip"] = "192.168.50." + int_id.to_s
95
+ int_id += 1
96
+ end
97
+ ci_environment_vms
98
+ end
99
+ def get_ci_environment(definition)
100
+ ci_environment_vms = inject_private_network_config(definition[".ci_env"]["vms"])
101
+ #TODO: load additional yaml files to extend the definition of the vms
102
+ end
103
+
104
+ # Setup the provider using the definition of each VM.
105
+ def set_provider_config(vm_instance, ci_vm_definition)
106
+
107
+ vm_instance.vm.provider :virtualbox do |vm|
108
+
109
+ vm.linked_clone = ci_vm_definition["clone"] || false
110
+
111
+ vm.customize ["modifyvm", :id, "--memory", ci_vm_definition["memory"] ]
112
+ vm.customize ["modifyvm", :id, "--cpus", ci_vm_definition["cpu"] ]
113
+
114
+ if ci_vm_definition["3d"] == true then
115
+ vm.customize ["modifyvm", :id, "--vram", "128"]
116
+ vm.customize ["modifyvm", :id, "--accelerate3d", "on"]
117
+ end
118
+
119
+ if ci_vm_definition["sound"] == true then
120
+ vm.customize ["modifyvm", :id, "--audio", "null", "--audiocontroller", "hda"]
121
+ end
122
+
123
+ vm.customize ["modifyvm", :id, "--ioapic", "on"]
124
+ vm.customize ["setextradata", "global", "GUI/SuppressMessages", "all"]
125
+
126
+ vm.gui = ci_vm_definition["gui"] || true
127
+ end
128
+
129
+ vm_instance.vm.box = ci_vm_definition["box"]
130
+
131
+ end
132
+
133
+ def set_network_config(vm_instance, ci_vm_definition)
134
+ vm_instance.vm.network :private_network, ip: ci_vm_definition["private_ip"] if ci_vm_definition["private_ip"]
135
+ ci_vm_definition["mapped_ports"].each do |port|
136
+ vm_instance.vm.network "forwarded_port",
137
+ guest: port,
138
+ host: port,
139
+ protocol: "tcp",
140
+ auto_correct: true
141
+ end if ci_vm_definition["mapped_ports"]
142
+ end
143
+
144
+ def build_vms_config(vagrant_config, ci_environment_vms)
145
+ ci_environment_vms.each do |ci_vm_id, ci_vm_definition|
146
+
147
+ ci_autostart = true
148
+ ci_autostart = ci_vm_definition["autostart"] if ci_vm_definition.key?("autostart")
149
+
150
+ vagrant_config.vm.define ci_vm_id, autostart: ci_autostart do |vm_instance|
151
+ vm_instance.vm.hostname = ci_vm_id
152
+ set_provider_config(vm_instance, ci_vm_definition)
153
+ set_network_config(vm_instance, ci_vm_definition)
154
+ end
155
+ end
156
+ end
157
+ end
158
+ end
159
+ end
160
+ end
@@ -1,20 +1,19 @@
1
1
  require "log4r"
2
2
 
3
3
  module VagrantPlugins
4
- module Cienv
5
- module Action
6
-
7
- # This action sets up the QI QI environment
8
- class InitEnvironment
4
+ module GPIICi
5
+ module Command
6
+ # This action sets up the GPII CI environment
7
+ class InitEnvironment < Vagrant.plugin("2", :command)
9
8
 
10
9
  def initialize(app, env)
11
10
  @app = app
12
- @logger = Log4r::Logger.new("vagrant_qi::action::init_environment")
11
+ @logger = Log4r::Logger.new("VagrantPlugins::GPIICi::action::init_environment")
13
12
  end
14
13
 
15
14
  def call(env)
16
- puts "i am inside class InitEnvironment"
17
- @logger.info('i am inside class InitEnvironment - call()')
15
+ @logger.info('This call does nothing yet')
16
+ #TODO: Create a .qi.yml file based on a template
18
17
  @app.call(env)
19
18
  end
20
19
 
@@ -0,0 +1,138 @@
1
+ module VagrantPlugins
2
+ module GPIICi
3
+ module Action
4
+ class UpdateHosts
5
+
6
+ def initialize(app, env)
7
+ @global_env = global_env
8
+ @config = Util.get_config(@global_env)
9
+ @provider = provider
10
+ @logger = Log4r::Logger.new('vagrant::hostmanager::updater')
11
+ @logger.debug("init updater")
12
+ end
13
+
14
+ def update_guest(machine)
15
+ return unless machine.communicate.ready?
16
+
17
+ if machine.config.vm.communicator == :winrm
18
+ windir = ""
19
+ machine.communicate.execute("echo %SYSTEMROOT%", {:shell => :cmd}) do |type, contents|
20
+ windir << contents.gsub("\r\n", '') if type == :stdout
21
+ end
22
+ realhostfile = "#{windir}\\System32\\drivers\\etc\\hosts.tmp"
23
+ else
24
+ realhostfile = '/tmp/hosts'
25
+ end
26
+ # download and modify file with Vagrant-managed entries
27
+ file = @global_env.tmp_path.join("hosts.#{machine.name}")
28
+ machine.communicate.download(realhostfile, file)
29
+
30
+ @logger.debug("file is: #{file.to_s}")
31
+ @logger.debug("class of file is: #{file.class}")
32
+
33
+ if update_file(file, machine, false)
34
+ if windir
35
+ machine.communicate.sudo("mv -force /tmp/hosts/hosts.#{machine.name} #{realhostfile}")
36
+ else
37
+ machine.communicate.sudo("cat /tmp/hosts >> #{realhostfile}")
38
+ end
39
+ end
40
+
41
+ end
42
+
43
+ private
44
+
45
+ def update_file(file, resolving_machine = nil, include_id = true)
46
+ file = Pathname.new(file)
47
+ old_file_content = file.read
48
+ new_file_content = update_content(old_file_content, resolving_machine, include_id)
49
+ file.open('wb') { |io| io.write(new_file_content) }
50
+ old_file_content != new_file_content
51
+ end
52
+
53
+ def update_content(file_content, resolving_machine, include_id)
54
+ id = include_id ? " id: #{read_or_create_id}" : ""
55
+ header = "## vagrant-hostmanager-start#{id}\n"
56
+ footer = "## vagrant-hostmanager-end\n"
57
+ body = get_machines
58
+ .map { |machine| get_hosts_file_entry(machine, resolving_machine) }
59
+ .join
60
+ get_new_content(header, footer, body, file_content)
61
+ end
62
+
63
+ def get_hosts_file_entry(machine, resolving_machine)
64
+ ip = get_ip_address(machine, resolving_machine)
65
+ host = machine.config.vm.hostname || machine.name
66
+ aliases = machine.config.hostmanager.aliases
67
+ if ip != nil
68
+ "#{ip}\t#{host}\n" + aliases.map{|a| "#{ip}\t#{a}"}.join("\n") + "\n"
69
+ end
70
+ end
71
+
72
+ def get_ip_address(machine, resolving_machine)
73
+ custom_ip_resolver = machine.config.hostmanager.ip_resolver
74
+ if custom_ip_resolver
75
+ custom_ip_resolver.call(machine, resolving_machine)
76
+ else
77
+ ip = nil
78
+ if machine.config.hostmanager.ignore_private_ip != true
79
+ machine.config.vm.networks.each do |network|
80
+ key, options = network[0], network[1]
81
+ ip = options[:ip] if key == :private_network
82
+ break if ip
83
+ end
84
+ end
85
+ ip || (machine.ssh_info ? machine.ssh_info[:host] : nil)
86
+ end
87
+ end
88
+
89
+ def get_machines
90
+ if @config.hostmanager.include_offline?
91
+ machines = @global_env.machine_names
92
+ else
93
+ machines = @global_env.active_machines
94
+ .select { |name, provider| provider == @provider }
95
+ .collect { |name, provider| name }
96
+ end
97
+ # Collect only machines that exist for the current provider
98
+ machines.collect do |name|
99
+ begin
100
+ machine = @global_env.machine(name, @provider)
101
+ rescue Vagrant::Errors::MachineNotFound
102
+ # ignore
103
+ end
104
+ machine
105
+ end
106
+ .reject(&:nil?)
107
+ end
108
+
109
+ def get_new_content(header, footer, body, old_content)
110
+ if body.empty?
111
+ block = "\n"
112
+ else
113
+ block = "\n\n" + header + body + footer + "\n"
114
+ end
115
+ # Pattern for finding existing block
116
+ header_pattern = Regexp.quote(header)
117
+ footer_pattern = Regexp.quote(footer)
118
+ pattern = Regexp.new("\n*#{header_pattern}.*?#{footer_pattern}\n*", Regexp::MULTILINE)
119
+ # Replace existing block or append
120
+ old_content.match(pattern) ? old_content.sub(pattern, block) : old_content.rstrip + block
121
+ end
122
+
123
+ def read_or_create_id
124
+ file = Pathname.new("#{@global_env.local_data_path}/hostmanager/id")
125
+ if (file.file?)
126
+ id = file.read.strip
127
+ else
128
+ id = SecureRandom.uuid
129
+ file.dirname.mkpath
130
+ file.open('w') { |io| io.write(id) }
131
+ end
132
+ id
133
+ end
134
+ end
135
+ end
136
+ end
137
+ end
138
+
@@ -1,11 +1,8 @@
1
1
  require "pathname"
2
- require 'json'
3
- require 'yaml'
4
-
5
2
  require "vagrant/action/builder"
6
3
 
7
4
  module VagrantPlugins
8
- module Cienv
5
+ module GPIICi
9
6
  module Action
10
7
  # Include the built-in modules so we can use them as top-level things.
11
8
  include Vagrant::Action::Builtin
@@ -16,107 +13,17 @@ module VagrantPlugins
16
13
  end
17
14
  end
18
15
 
16
+ def self.build_vagrantfile
17
+ Vagrant::Action::Builder.new.tap do |b|
18
+ b.use BuildVagrantfile
19
+ end
20
+ end
21
+
19
22
  # The autoload farm
20
23
  action_root = Pathname.new(File.expand_path("../action", __FILE__))
21
24
  autoload :InitEnvironment, action_root.join("init_environment")
25
+ autoload :BuildVagrantfile, action_root.join("build_vagrantfile")
22
26
 
23
- class BuildVagrantfile
24
-
25
- def gem_path
26
- Pathname.new(File.dirname __dir__)
27
- end
28
-
29
- def project_home
30
- environment = @env[:env]
31
- environment.instance_variable_get(:@cwd)
32
- end
33
-
34
- def vagrant_home
35
- project_home.join(Vagrant::Environment::DEFAULT_LOCAL_DATA)
36
- end
37
-
38
- def initialize(app, env)
39
- @app = app
40
- @env = env
41
- environment = @env[:env]
42
-
43
- # Only make all the magic if the .qi.yml definition file is found
44
- return if !File.exist?(project_home.join(".qi.yml"))
45
-
46
- require_relative "config/config_provider.rb"
47
- require_relative "config/config_provision.rb"
48
- require_relative "config/config_network.rb"
49
- require_relative "config/config_folders.rb"
50
-
51
- # $vagrant_vmenv_path = vagrant_home.to_s + "/provision-ci/"
52
-
53
- # load the .qi.yml file
54
- qi_file = File.expand_path (project_home.join(".qi.yml"))
55
- qi_definition = YAML.load(File.read(qi_file))
56
-
57
- # Copy enviroments and playbooks to home dir if needed
58
- FileUtils.mkdir(vagrant_home) if !File.exist?(vagrant_home)
59
- FileUtils.mkdir(vagrant_home.join('provision-ci')) if !File.exist?(vagrant_home.join('provision-ci'))
60
- FileUtils.cp_r(gem_path.join('envs'), vagrant_home.join('provision-ci/envs')) if !File.exist?(vagrant_home.join('provision-ci/envs'))
61
- FileUtils.cp_r(gem_path.join('provisioning'), vagrant_home.join('provision-ci/provisioning')) if !File.exist?(vagrant_home.join('provision-ci/provisioning'))
62
-
63
- # load the environment based on "env_runtime" variable of .qi.yml
64
- vagrant_env = qi_definition["env_runtime"] || "default"
65
- environment_file = File.expand_path(vagrant_home.to_s + "/provision-ci/envs", File.dirname(__FILE__)) +
66
- File::SEPARATOR + vagrant_env
67
- if File.exists?(environment_file + ".json")
68
- environment_ci = JSON.parse(File.read(environment_file + ".json"))
69
- elsif File.exists?(environment_file + ".yml")
70
- environment_ci = YAML.load(File.read(environment_file + ".yml"))
71
- else
72
- raise "Environment_ci config file not found, see envs directory\n #{environment_file}"
73
- end
74
-
75
- # build the host list of the VMs used, very useful to allow the communication
76
- # between them based on the hostname and IP stored in the hosts file
77
- build_hosts_list(environment_ci["vms"])
78
-
79
- vagrantfile_proc = Proc.new do
80
- Vagrant.configure(2) do |config|
81
-
82
- environment_ci["vms"].each do |vm_id, vm_config|
83
-
84
- config.vm.define vm_id, autostart: vm_config["autostart"] do |instance|
85
-
86
- # Ansible handles this task better than Vagrant
87
- #instance.vm.hostname = vm_id
88
-
89
- config_provider(instance, vm_config, environment_ci["global"])
90
-
91
- config_provision(instance, vm_config, vm_id, qi_definition["apps"], vagrant_home.join('provision-ci').to_s)
92
-
93
- config_network(instance, vm_config)
94
-
95
- config_folders(instance, vm_id, qi_definition["apps"], vagrant_home.join('provision-ci').to_s)
96
-
97
- end
98
- end
99
- end
100
- end
101
-
102
- # The Environment instance has been instantiated without a Vagrantfile
103
- # that means that we need to store some internal variables and
104
- # instantiate again the Vagrantfile instance with our previous code.
105
-
106
- environment.instance_variable_set(:@root_path, project_home)
107
- environment.instance_variable_set(:@local_data_path, vagrant_home)
108
-
109
- # the cienv code will be the first item to check in the list of
110
- # Vagrantfile sources
111
- config_loader = environment.config_loader
112
- config_loader.set(:cienv, vagrantfile_proc.call)
113
- environment.instance_variable_set(:@vagrantfile, Vagrant::Vagrantfile.new(config_loader, [:cienv, :home, :root]))
114
-
115
- end
116
- def call(env)
117
- @app.call(env)
118
- end
119
- end
120
27
  end
121
28
  end
122
29
  end
@@ -1,7 +1,7 @@
1
1
  require "vagrant/plugin/state_file"
2
2
 
3
3
  module VagrantPlugins
4
- module Cienv
4
+ module GPIICi
5
5
  module Command
6
6
  class Base < Vagrant.plugin("2", :command)
7
7
  # This is a helper for executing an action sequence with the proper