comfy 0.2.0
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.
- checksums.yaml +7 -0
- data/.gitignore +11 -0
- data/.rspec +2 -0
- data/.travis.yml +46 -0
- data/Gemfile +4 -0
- data/LICENSE +13 -0
- data/README.md +131 -0
- data/Rakefile +18 -0
- data/bin/comfy +4 -0
- data/comfy.gemspec +36 -0
- data/config/comfy.yml +20 -0
- data/lib/comfy/command_executioner.rb +225 -0
- data/lib/comfy/creator.rb +200 -0
- data/lib/comfy/errors/invalid_distribution_version_error.rb +1 -0
- data/lib/comfy/errors/no_such_distribution_version_error.rb +1 -0
- data/lib/comfy/errors/packer_error.rb +1 -0
- data/lib/comfy/errors/packer_execution_error.rb +1 -0
- data/lib/comfy/errors/packer_validation_error.rb +1 -0
- data/lib/comfy/errors.rb +4 -0
- data/lib/comfy/extensions/yell.rb +8 -0
- data/lib/comfy/settings.rb +15 -0
- data/lib/comfy/templater.rb +62 -0
- data/lib/comfy/version.rb +3 -0
- data/lib/comfy.rb +18 -0
- data/lib/templates/centos/centos.cfg.erb +47 -0
- data/lib/templates/centos/centos.description +20 -0
- data/lib/templates/centos/files/10-ipv6.conf +5 -0
- data/lib/templates/centos/files/check-mk-agent-meta-checks-2.0-1.noarch.rpm +0 -0
- data/lib/templates/centos/files/check-mk-agent-meta-key-1.0-1.noarch.rpm +0 -0
- data/lib/templates/centos/files/cloud.cfg +101 -0
- data/lib/templates/centos/files/fail2ban.local +3 -0
- data/lib/templates/centos/files/getty@ttyS0.service +47 -0
- data/lib/templates/centos/files/grub +11 -0
- data/lib/templates/centos/files/iptables-multiport.local +6 -0
- data/lib/templates/centos/files/jail.local +17 -0
- data/lib/templates/centos/files/krb5.conf +181 -0
- data/lib/templates/centos/files/ntp.conf +61 -0
- data/lib/templates/centos/files/pakiti-2.1.5-1.noarch.rpm +0 -0
- data/lib/templates/centos/files/sshd_config +152 -0
- data/lib/templates/centos/files/xen-domU.conf +1 -0
- data/lib/templates/centos/scripts/init.sh +83 -0
- data/lib/templates/debian/debian.cfg.erb +80 -0
- data/lib/templates/debian/debian.description +28 -0
- data/lib/templates/debian/files/.bashrc +112 -0
- data/lib/templates/debian/files/.gitconfig +7 -0
- data/lib/templates/debian/files/10-ipv6.conf +5 -0
- data/lib/templates/debian/files/DEPOT-GPG-KEY.cfg +32 -0
- data/lib/templates/debian/files/RPM-GPG-KEY-CERIT-SC.cfg +30 -0
- data/lib/templates/debian/files/backports.list +2 -0
- data/lib/templates/debian/files/cerit-cloudinit.list +2 -0
- data/lib/templates/debian/files/cloud.cfg +102 -0
- data/lib/templates/debian/files/depot.list +4 -0
- data/lib/templates/debian/files/depot_all.pref +6 -0
- data/lib/templates/debian/files/depot_check_mk.pref +5 -0
- data/lib/templates/debian/files/fail2ban.local +3 -0
- data/lib/templates/debian/files/getty@ttyS0.service +47 -0
- data/lib/templates/debian/files/grub +34 -0
- data/lib/templates/debian/files/inittab +69 -0
- data/lib/templates/debian/files/interfaces +15 -0
- data/lib/templates/debian/files/iptables-multiport.local +6 -0
- data/lib/templates/debian/files/jail.local +17 -0
- data/lib/templates/debian/files/krb5.conf +181 -0
- data/lib/templates/debian/files/meta-misc.list +2 -0
- data/lib/templates/debian/files/modules +15 -0
- data/lib/templates/debian/files/ntp.conf +61 -0
- data/lib/templates/debian/files/pakiti_2.1.5-2_all.deb +0 -0
- data/lib/templates/debian/files/sshd_config +131 -0
- data/lib/templates/debian/scripts/debian_cloud_script.sh +80 -0
- data/lib/templates/docker/docker.cfg.erb +87 -0
- data/lib/templates/docker/docker.description +21 -0
- data/lib/templates/docker/files/10-ipv6.conf +5 -0
- data/lib/templates/docker/files/DEPOT-GPG-KEY.cfg +32 -0
- data/lib/templates/docker/files/RPM-GPG-KEY-CERIT-SC.cfg +30 -0
- data/lib/templates/docker/files/cloud.cfg +109 -0
- data/lib/templates/docker/files/depot.list +4 -0
- data/lib/templates/docker/files/depot_all.pref +6 -0
- data/lib/templates/docker/files/depot_check_mk.pref +5 -0
- data/lib/templates/docker/files/docker.list +1 -0
- data/lib/templates/docker/files/fail2ban.local +3 -0
- data/lib/templates/docker/files/grub +34 -0
- data/lib/templates/docker/files/interfaces +15 -0
- data/lib/templates/docker/files/iptables-multiport.local +6 -0
- data/lib/templates/docker/files/jail.local +17 -0
- data/lib/templates/docker/files/krb5.conf +181 -0
- data/lib/templates/docker/files/meta-misc.list +2 -0
- data/lib/templates/docker/files/modules +15 -0
- data/lib/templates/docker/files/ntp.conf +61 -0
- data/lib/templates/docker/files/pakiti_2.1.5-2_all.deb +0 -0
- data/lib/templates/docker/files/sshd_config +131 -0
- data/lib/templates/docker/files/ttyS0.conf +11 -0
- data/lib/templates/docker/scripts/init.sh +65 -0
- data/lib/templates/packer.erb +93 -0
- data/lib/templates/scientificlinux/files/10-ipv6.conf +5 -0
- data/lib/templates/scientificlinux/files/check-mk-agent-meta-checks-2.0-1.noarch.rpm +0 -0
- data/lib/templates/scientificlinux/files/check-mk-agent-meta-key-1.0-1.noarch.rpm +0 -0
- data/lib/templates/scientificlinux/files/cloud.cfg +101 -0
- data/lib/templates/scientificlinux/files/fail2ban.local +3 -0
- data/lib/templates/scientificlinux/files/getty@ttyS0.service +47 -0
- data/lib/templates/scientificlinux/files/grub +10 -0
- data/lib/templates/scientificlinux/files/iptables-multiport.local +6 -0
- data/lib/templates/scientificlinux/files/jail.local +17 -0
- data/lib/templates/scientificlinux/files/krb5.conf +181 -0
- data/lib/templates/scientificlinux/files/ntp.conf +61 -0
- data/lib/templates/scientificlinux/files/pakiti-2.1.5-1.noarch.rpm +0 -0
- data/lib/templates/scientificlinux/files/sshd_config +150 -0
- data/lib/templates/scientificlinux/files/xen-domU.conf +1 -0
- data/lib/templates/scientificlinux/scientificlinux.cfg.erb +57 -0
- data/lib/templates/scientificlinux/scientificlinux.description +19 -0
- data/lib/templates/scientificlinux/scripts/init.sh +92 -0
- data/lib/templates/ubuntu/files/10-ipv6.conf +5 -0
- data/lib/templates/ubuntu/files/DEPOT-GPG-KEY.cfg +32 -0
- data/lib/templates/ubuntu/files/RPM-GPG-KEY-CERIT-SC.cfg +30 -0
- data/lib/templates/ubuntu/files/cloud.cfg +109 -0
- data/lib/templates/ubuntu/files/depot.list +4 -0
- data/lib/templates/ubuntu/files/depot_all.pref +6 -0
- data/lib/templates/ubuntu/files/depot_check_mk.pref +5 -0
- data/lib/templates/ubuntu/files/fail2ban.local +3 -0
- data/lib/templates/ubuntu/files/grub +34 -0
- data/lib/templates/ubuntu/files/interfaces +15 -0
- data/lib/templates/ubuntu/files/iptables-multiport.local +6 -0
- data/lib/templates/ubuntu/files/jail.local +17 -0
- data/lib/templates/ubuntu/files/krb5.conf +181 -0
- data/lib/templates/ubuntu/files/meta-misc.list +2 -0
- data/lib/templates/ubuntu/files/modules +15 -0
- data/lib/templates/ubuntu/files/ntp.conf +61 -0
- data/lib/templates/ubuntu/files/pakiti_2.1.5-2_all.deb +0 -0
- data/lib/templates/ubuntu/files/sshd_config +131 -0
- data/lib/templates/ubuntu/files/ttyS0.conf +11 -0
- data/lib/templates/ubuntu/scripts/init.sh +54 -0
- data/lib/templates/ubuntu/ubuntu.cfg.erb +87 -0
- data/lib/templates/ubuntu/ubuntu.description +21 -0
- data/schema/distribution_descriptor.schema +241 -0
- metadata +374 -0
checksums.yaml
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
---
|
|
2
|
+
SHA1:
|
|
3
|
+
metadata.gz: 1a00d600ac242d01ee397d5e77b0740cc3a9361b
|
|
4
|
+
data.tar.gz: 21f394dae54301c46756ca44e45f68fb02713ab0
|
|
5
|
+
SHA512:
|
|
6
|
+
metadata.gz: d45c8ea2ba75e6801a0dfc4f8487976ad34c04508d73ff479d7cd823697d84d48d647c6e501527c2e5911f44d8ff4b634bbb0122219264599022a4a142ad19d3
|
|
7
|
+
data.tar.gz: 4b0bf525e8079fff89367ea160c09cb26ea9451b1c2fee1ac1e9723a30594059ff84d45c96535b4a79083331285c398ac849ef8602c7b188209371c230ae5307
|
data/.gitignore
ADDED
data/.rspec
ADDED
data/.travis.yml
ADDED
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
language: ruby
|
|
2
|
+
|
|
3
|
+
rvm:
|
|
4
|
+
- 1.9.3
|
|
5
|
+
- 2.0.0
|
|
6
|
+
- 2.1
|
|
7
|
+
- 2.2.1
|
|
8
|
+
- ruby-head
|
|
9
|
+
- jruby-19mode
|
|
10
|
+
- jruby-head
|
|
11
|
+
|
|
12
|
+
jdk:
|
|
13
|
+
- openjdk7
|
|
14
|
+
- oraclejdk7
|
|
15
|
+
- openjdk6
|
|
16
|
+
|
|
17
|
+
matrix:
|
|
18
|
+
allow_failures:
|
|
19
|
+
- rvm: ruby-head
|
|
20
|
+
- rvm: jruby-head
|
|
21
|
+
exclude:
|
|
22
|
+
- rvm: 1.9.3
|
|
23
|
+
jdk: openjdk7
|
|
24
|
+
- rvm: 1.9.3
|
|
25
|
+
jdk: oraclejdk7
|
|
26
|
+
- rvm: 2.0.0
|
|
27
|
+
jdk: openjdk7
|
|
28
|
+
- rvm: 2.0.0
|
|
29
|
+
jdk: oraclejdk7
|
|
30
|
+
- rvm: 2.1
|
|
31
|
+
jdk: openjdk7
|
|
32
|
+
- rvm: 2.1
|
|
33
|
+
jdk: oraclejdk7
|
|
34
|
+
- rvm: 2.2.1
|
|
35
|
+
jdk: openjdk7
|
|
36
|
+
- rvm: 2.2.1
|
|
37
|
+
jdk: oraclejdk7
|
|
38
|
+
- rvm: ruby-head
|
|
39
|
+
jdk: openjdk7
|
|
40
|
+
- rvm: ruby-head
|
|
41
|
+
jdk: oraclejdk7
|
|
42
|
+
fast_finish: true
|
|
43
|
+
|
|
44
|
+
branches:
|
|
45
|
+
only:
|
|
46
|
+
- master
|
data/Gemfile
ADDED
data/LICENSE
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
Copyright 2015 Michal Kimle and Lubomir Kosaristan
|
|
2
|
+
|
|
3
|
+
Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
you may not use this file except in compliance with the License.
|
|
5
|
+
You may obtain a copy of the License at
|
|
6
|
+
|
|
7
|
+
http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
|
|
9
|
+
Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
distributed under the License is distributed on an "AS IS" BASIS,
|
|
11
|
+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
See the License for the specific language governing permissions and
|
|
13
|
+
limitations under the License.
|
data/README.md
ADDED
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
# COMFY - ClOud iMage FactorY
|
|
2
|
+
COMFY is a tool for building virtual machine images from scratch.
|
|
3
|
+
|
|
4
|
+
[](http://travis-ci.org/CESNET/comfy)
|
|
5
|
+
[](https://gemnasium.com/CESNET/comfy)
|
|
6
|
+
[](https://badge.fury.io/rb/comfy)
|
|
7
|
+
[](https://codeclimate.com/github/CESNET/comfy)
|
|
8
|
+
|
|
9
|
+
##Requirements
|
|
10
|
+
* Ruby >= 1.9.3
|
|
11
|
+
* Rubygems
|
|
12
|
+
* [Packer] >= 0.8.6 (https://www.packer.io/) (used for the image creation process)
|
|
13
|
+
* VirtualBox (if you want to create `ova` images)
|
|
14
|
+
* QEMU/KVM (if you want to create `qcow2` images)
|
|
15
|
+
|
|
16
|
+
## Installation
|
|
17
|
+
**Unfortunately, neither gem nor packages are available for COMFY right now. To try COMFY, please use the [From source](#from-source-dev) guide below.**
|
|
18
|
+
|
|
19
|
+
###From source (dev)
|
|
20
|
+
**Installation from source should never be your first choice! Especially, if you are not
|
|
21
|
+
familiar with RVM, Bundler, Rake and other dev tools for Ruby!**
|
|
22
|
+
|
|
23
|
+
**However, if you wish to contribute to our project, this is the right way to start.**
|
|
24
|
+
|
|
25
|
+
To build and install the bleeding edge version from master
|
|
26
|
+
|
|
27
|
+
```bash
|
|
28
|
+
git clone git://github.com/CESNET/comfy.git
|
|
29
|
+
cd comfy
|
|
30
|
+
gem install bundler
|
|
31
|
+
bundle install
|
|
32
|
+
bundle exec rake spec
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
##Configuration
|
|
36
|
+
###Create a configuration file for COMFY
|
|
37
|
+
Configuration file can be read by COMFY from these
|
|
38
|
+
three locations:
|
|
39
|
+
|
|
40
|
+
* `~/.comfy/comfy.yml`
|
|
41
|
+
* `/etc/comfy/comfy.yml`
|
|
42
|
+
* `PATH_TO_GEM_DIR/config/comfy.yml`
|
|
43
|
+
|
|
44
|
+
The example configuration file can be found at the last location
|
|
45
|
+
`PATH_TO_GEM_DIR/config/comfy.yml`. When editing a configuration
|
|
46
|
+
file you have to follow the division into three environments: `production`,
|
|
47
|
+
`development` and `test`. All the configuration options are described
|
|
48
|
+
in the example configuration file.
|
|
49
|
+
|
|
50
|
+
##Usage
|
|
51
|
+
COMFY is run with executable `comfy`. For further assistance run `comfy help`:
|
|
52
|
+
```bash
|
|
53
|
+
$ comfy help
|
|
54
|
+
|
|
55
|
+
Commands:
|
|
56
|
+
comfy DISTRIBUTION # Builds VM with selected distribution
|
|
57
|
+
comfy <DISTRIBUTION>-versions # Lists available versions for selected destribution
|
|
58
|
+
comfy clean-cache -c, --cache-dir=CACHE-DIR # Cleans packer's cache containing distributions' installation media
|
|
59
|
+
comfy distributions # Lists all available distributions and their versions
|
|
60
|
+
comfy export -d, --destination=DESTINATION # Exports files for building virtual machines. Helps with the customization of the build process.
|
|
61
|
+
comfy help [COMMAND] # Describe available commands or one specific command
|
|
62
|
+
comfy version # Prints COMFY's version
|
|
63
|
+
|
|
64
|
+
Options:
|
|
65
|
+
--logging-level=LOGGING-LEVEL
|
|
66
|
+
# Possible values: DEBUG, INFO, WARN, ERROR, FATAL, UNKNOWN
|
|
67
|
+
[--logging-file=LOGGING-FILE] # File to write log to
|
|
68
|
+
[--debug], [--no-debug] # Runs COMFY in debug mode
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
Building process of selected VM can be customized. To list all the options for one of the distributions run `comfy help DISTRIBUTION`:
|
|
72
|
+
```bash
|
|
73
|
+
$ comfy help ubuntu
|
|
74
|
+
|
|
75
|
+
Usage:
|
|
76
|
+
comfy ubuntu -c, --cache-dir=CACHE-DIR -f, --formats=one two three -o, --output-dir=OUTPUT-DIR -s, --size=N -v, --version=VERSION
|
|
77
|
+
|
|
78
|
+
Options:
|
|
79
|
+
-v, --version=VERSION # Version of distribution to build
|
|
80
|
+
-f, --formats=one two three # Output format of the virtual machine image (qemu - qcow2, virtualbox - ova)
|
|
81
|
+
# Possible values: qemu, virtualbox
|
|
82
|
+
-s, --size=N # Disk size for created virtual machines (in MB)
|
|
83
|
+
-o, --output-dir=OUTPUT-DIR # Directory to which COMFY will produce virtual machine files
|
|
84
|
+
-c, --cache-dir=CACHE-DIR # Directory for packer's cache e.g. distribution installation images
|
|
85
|
+
-g, [--groups=one two three] # Groups VM belongs to. For automatic processing purposes
|
|
86
|
+
-i, [--identifier=IDENTIFIER] # VM identifier. For automatic processing purposes
|
|
87
|
+
-d, [--description], [--no-description] # Generates VM description file. For automatic processing purposes
|
|
88
|
+
-t, [--template-dir=TEMPLATE-DIR] # Directory COMFY uses templates from to build a VM
|
|
89
|
+
--logging-level=LOGGING-LEVEL
|
|
90
|
+
# Possible values: DEBUG, INFO, WARN, ERROR, FATAL, UNKNOWN
|
|
91
|
+
[--logging-file=LOGGING-FILE] # File to write log to
|
|
92
|
+
[--debug], [--no-debug] # Runs COMFY in debug mode
|
|
93
|
+
|
|
94
|
+
Builds VM with distribution Ubuntu
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
COMFY currently supports building of these distributions:
|
|
98
|
+
* CentOS 7.1.1503
|
|
99
|
+
* Debian 7.9.0
|
|
100
|
+
* Debian 8.2.0
|
|
101
|
+
* ScientificLinux 7.1
|
|
102
|
+
* Ubuntu 14.04
|
|
103
|
+
|
|
104
|
+
##Example
|
|
105
|
+
To start a building process for example for debian simply run:
|
|
106
|
+
```bash
|
|
107
|
+
$ comfy debian
|
|
108
|
+
```
|
|
109
|
+
When not specified, COMFY will build the newest version of selected distribution. If you want to select a specific version run:
|
|
110
|
+
```bash
|
|
111
|
+
$ comfy debian -v 7.9.0
|
|
112
|
+
```
|
|
113
|
+
COMFY uses by default a QEMU supervisor for image creation. If you want to use VirtualBox you can do it with:
|
|
114
|
+
```bash
|
|
115
|
+
$ comfy debian -f virtualbox
|
|
116
|
+
```
|
|
117
|
+
Or if you want to use both:
|
|
118
|
+
```bash
|
|
119
|
+
$ comfy debian -f qemu virtualbox
|
|
120
|
+
```
|
|
121
|
+
This will create virtual machine images in both `qcow2` and `ovf` formats. Since QEMU and VirtualBox can't run simultaneously, images are created in two sequential runs.
|
|
122
|
+
|
|
123
|
+
##Continuous integration
|
|
124
|
+
[Continuous integration for COMFY by Travis-CI](http://travis-ci.org/CESNET/comfy/)
|
|
125
|
+
|
|
126
|
+
## Contributing
|
|
127
|
+
1. Fork it ( https://github.com/CESNET/comfy/fork )
|
|
128
|
+
2. Create your feature branch (`git checkout -b my-new-feature`)
|
|
129
|
+
3. Commit your changes (`git commit -am 'Add some feature'`)
|
|
130
|
+
4. Push to the branch (`git push origin my-new-feature`)
|
|
131
|
+
5. Create a new Pull Request
|
data/Rakefile
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
require 'bundler/gem_tasks'
|
|
2
|
+
require 'rubygems/tasks'
|
|
3
|
+
|
|
4
|
+
task default: 'test'
|
|
5
|
+
|
|
6
|
+
desc 'Run all tests; includes rspec and coverage reports'
|
|
7
|
+
task test: 'rcov:rspec'
|
|
8
|
+
|
|
9
|
+
desc 'Run all tests; includes rspec and coverage reports'
|
|
10
|
+
task spec: 'test'
|
|
11
|
+
|
|
12
|
+
Gem::Tasks.new(build: { tar: true, zip: true }, sign: { checksum: true, pgp: false })
|
|
13
|
+
|
|
14
|
+
namespace :rcov do
|
|
15
|
+
require 'rspec/core/rake_task'
|
|
16
|
+
|
|
17
|
+
RSpec::Core::RakeTask.new(:rspec)
|
|
18
|
+
end
|
data/bin/comfy
ADDED
data/comfy.gemspec
ADDED
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
# coding: utf-8
|
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
|
4
|
+
require 'comfy/version'
|
|
5
|
+
|
|
6
|
+
Gem::Specification.new do |spec|
|
|
7
|
+
spec.name = 'comfy'
|
|
8
|
+
spec.version = Comfy::VERSION
|
|
9
|
+
spec.authors = ['Michal Kimle', 'Ľubomír Košarišťan']
|
|
10
|
+
spec.email = ['kimle.michal@gmail.com', 'kosoburak@gmail.com']
|
|
11
|
+
|
|
12
|
+
spec.summary = 'Tool for building virtual machine images from scratch.'
|
|
13
|
+
spec.description = 'Tool for building virtual machine images from scratch.'
|
|
14
|
+
spec.homepage = 'https://github.com/Misenko/comfy'
|
|
15
|
+
spec.license = 'Apache License 2.0'
|
|
16
|
+
|
|
17
|
+
spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
|
|
18
|
+
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
|
19
|
+
spec.require_paths = ['lib']
|
|
20
|
+
|
|
21
|
+
spec.add_development_dependency 'bundler', '~> 1.7'
|
|
22
|
+
spec.add_development_dependency 'rake', '~> 10.0'
|
|
23
|
+
spec.add_development_dependency 'rspec', '~> 3.0.0'
|
|
24
|
+
spec.add_development_dependency 'simplecov', '~> 0.9.0'
|
|
25
|
+
spec.add_development_dependency 'rubygems-tasks', '~> 0.2.4'
|
|
26
|
+
spec.add_development_dependency 'rubocop', '~> 0.32'
|
|
27
|
+
|
|
28
|
+
spec.add_runtime_dependency 'syslogger', '~> 1.6.0'
|
|
29
|
+
spec.add_runtime_dependency 'settingslogic', '~> 2.0.9'
|
|
30
|
+
spec.add_runtime_dependency 'mixlib-shellout', '~> 2.0.1'
|
|
31
|
+
spec.add_runtime_dependency 'json-schema', '~> 2.5'
|
|
32
|
+
spec.add_runtime_dependency 'activesupport', '~> 4.2'
|
|
33
|
+
spec.add_runtime_dependency 'cloud-appliance-descriptor', '~> 0.2'
|
|
34
|
+
spec.add_runtime_dependency 'thor', '~> 0.19'
|
|
35
|
+
spec.add_runtime_dependency 'yell', '~> 2.0'
|
|
36
|
+
end
|
data/config/comfy.yml
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
---
|
|
2
|
+
production:
|
|
3
|
+
output-dir: /opt/comfy/virtualmachines/ # Directory to which COMFY will produce virtual machine files
|
|
4
|
+
cache-dir: /opt/comfy/packer_cache/ # Directory for packer's cache e.g. distribution installation images
|
|
5
|
+
#template-dir: /opt/comfy/templates/ # When used COMFY uses templates from this directory to create virtual machines
|
|
6
|
+
formats:
|
|
7
|
+
- qemu
|
|
8
|
+
size: 10000
|
|
9
|
+
description: true
|
|
10
|
+
groups: # groups VM belongs to, used when creating cloud-appliance-descriptor
|
|
11
|
+
- comfy
|
|
12
|
+
# $t - timestamp
|
|
13
|
+
# $v - distribution version, consisting of major, minor, and patch version if possible
|
|
14
|
+
# $n - distribution name
|
|
15
|
+
# $g - groups the VM belongs to, separated by commas
|
|
16
|
+
identifier: METACLOUD-$n-$v # vm identifier, used in multiple places
|
|
17
|
+
logging:
|
|
18
|
+
level: ERROR
|
|
19
|
+
file: /var/log/comfy/comfy.log # File to write log to
|
|
20
|
+
debug: false
|
|
@@ -0,0 +1,225 @@
|
|
|
1
|
+
require 'thor'
|
|
2
|
+
require 'yell'
|
|
3
|
+
require 'json-schema'
|
|
4
|
+
require 'fileutils'
|
|
5
|
+
|
|
6
|
+
class Comfy::CommandExecutioner < Thor
|
|
7
|
+
class << self
|
|
8
|
+
|
|
9
|
+
# Method listing available distributions from template directory.
|
|
10
|
+
#
|
|
11
|
+
# @return [Hash] distributions structure containing info about them
|
|
12
|
+
def available_distributions
|
|
13
|
+
dir = Comfy::TEMPLATE_DIR
|
|
14
|
+
return {} unless File.exist? dir
|
|
15
|
+
|
|
16
|
+
description_files = Dir.glob(File.join(dir, '*', '*.description')).sort
|
|
17
|
+
distributions = {}
|
|
18
|
+
description_files.each do |description_file|
|
|
19
|
+
unless JSON::Validator.validate(Comfy::DESCRIPTION_SCHEMA_FILE, description_file)
|
|
20
|
+
puts "Invalid distribution description #{description_file.inspect}, skipping."
|
|
21
|
+
next
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
description = File.read(description_file)
|
|
25
|
+
json = JSON.parse(description)
|
|
26
|
+
name = json['name']
|
|
27
|
+
distributions[name] = []
|
|
28
|
+
json['versions'].each do |version|
|
|
29
|
+
version_string = []
|
|
30
|
+
version_string << version['major_version']
|
|
31
|
+
version_string << version['minor_version']
|
|
32
|
+
version_string << version['patch_version']
|
|
33
|
+
|
|
34
|
+
distributions[name] << version_string.compact.join('.')
|
|
35
|
+
distributions[name].sort!
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
distributions
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
class_option :"logging-level",
|
|
44
|
+
:required => true,
|
|
45
|
+
:default => Comfy::Settings['logging']['level'],
|
|
46
|
+
:type => :string,
|
|
47
|
+
:enum => Yell::Severities
|
|
48
|
+
class_option :"logging-file",
|
|
49
|
+
:default => Comfy::Settings['logging']['file'],
|
|
50
|
+
:type => :string,
|
|
51
|
+
:desc => 'File to write log to'
|
|
52
|
+
class_option :debug,
|
|
53
|
+
:default => Comfy::Settings['debug'],
|
|
54
|
+
:type => :boolean,
|
|
55
|
+
:desc => 'Runs COMFY in debug mode'
|
|
56
|
+
|
|
57
|
+
desc 'version', 'Prints COMFY\'s version'
|
|
58
|
+
def version
|
|
59
|
+
$stdout.puts Comfy::VERSION
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
desc 'distributions', 'Lists all available distributions and their versions'
|
|
63
|
+
def distributions
|
|
64
|
+
self.class.available_distributions.each do |distribution, versions|
|
|
65
|
+
versions.each { |version| $stdout.puts "#{distribution} #{version}" }
|
|
66
|
+
end
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
method_option :destination,
|
|
70
|
+
type: :string,
|
|
71
|
+
required: true,
|
|
72
|
+
aliases: '-d',
|
|
73
|
+
desc: 'Destination of exported files'
|
|
74
|
+
desc 'export', 'Exports files for building virtual machines. Helps with the customization of the build process.'
|
|
75
|
+
def export
|
|
76
|
+
dir = options['destination']
|
|
77
|
+
FileUtils.mkdir_p dir unless File.exist?(dir) && File.directory?(dir)
|
|
78
|
+
|
|
79
|
+
FileUtils.cp_r(File.join(Comfy::Settings['template-dir'], '.'), dir)
|
|
80
|
+
$stdout.puts 'Template files copied successfully.'
|
|
81
|
+
$stdout.puts "In order to use the new template directory change setting 'vm_templates_dir' in your configuration file to:"
|
|
82
|
+
$stdout.puts "template-dir: #{dir}"
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
method_option :"cache-dir",
|
|
86
|
+
type: :string,
|
|
87
|
+
required: true,
|
|
88
|
+
default: Comfy::Settings['cache-dir'],
|
|
89
|
+
aliases: '-c',
|
|
90
|
+
desc: 'Directory for packer\'s cache e.g. distribution installation images'
|
|
91
|
+
desc 'clean-cache', 'Cleans packer\'s cache containing distributions\' installation media'
|
|
92
|
+
def clean_cache
|
|
93
|
+
dir = options['cache-dir']
|
|
94
|
+
FileUtils.rm_r Dir.glob(File.join(dir, '*'))
|
|
95
|
+
puts 'Cache cleaned successfully.'
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
available_distributions.each do |name, versions|
|
|
99
|
+
plain_name = name.downcase
|
|
100
|
+
method_option :version,
|
|
101
|
+
type: :string,
|
|
102
|
+
aliases: '-v',
|
|
103
|
+
default: versions.first,
|
|
104
|
+
required: true,
|
|
105
|
+
desc: 'Version of distribution to build'
|
|
106
|
+
method_option :formats,
|
|
107
|
+
type: :array,
|
|
108
|
+
aliases: '-f',
|
|
109
|
+
default: Comfy::Settings['formats'],
|
|
110
|
+
enum: ['qemu', 'virtualbox'],
|
|
111
|
+
required: true,
|
|
112
|
+
desc: 'Output format of the virtual machine image (qemu - qcow2, virtualbox - ova)'
|
|
113
|
+
method_option :size,
|
|
114
|
+
type: :numeric,
|
|
115
|
+
aliases: '-s',
|
|
116
|
+
default: Comfy::Settings['size'],
|
|
117
|
+
required: true,
|
|
118
|
+
desc: 'Disk size for created virtual machines (in MB)'
|
|
119
|
+
method_option :"output-dir",
|
|
120
|
+
type: :string,
|
|
121
|
+
required: true,
|
|
122
|
+
default: Comfy::Settings['output-dir'],
|
|
123
|
+
aliases: '-o',
|
|
124
|
+
desc: 'Directory to which COMFY will produce virtual machine files'
|
|
125
|
+
method_option :"cache-dir",
|
|
126
|
+
type: :string,
|
|
127
|
+
required: true,
|
|
128
|
+
default: Comfy::Settings['cache-dir'],
|
|
129
|
+
aliases: '-c',
|
|
130
|
+
desc: 'Directory for packer\'s cache e.g. distribution installation images'
|
|
131
|
+
method_option :groups,
|
|
132
|
+
type: :array,
|
|
133
|
+
aliases: '-g',
|
|
134
|
+
default: Comfy::Settings['groups'],
|
|
135
|
+
desc: 'Groups VM belongs to. For automatic processing purposes'
|
|
136
|
+
method_option :identifier,
|
|
137
|
+
type: :string,
|
|
138
|
+
aliases: '-i',
|
|
139
|
+
default: Comfy::Settings['identifier'],
|
|
140
|
+
desc: 'VM identifier. For automatic processing purposes'
|
|
141
|
+
method_option :description,
|
|
142
|
+
type: :boolean,
|
|
143
|
+
aliases: '-d',
|
|
144
|
+
default: Comfy::Settings['description'],
|
|
145
|
+
desc: 'Generates VM description file. For automatic processing purposes'
|
|
146
|
+
method_option :'template-dir',
|
|
147
|
+
type: :string,
|
|
148
|
+
aliases: '-t',
|
|
149
|
+
default: Comfy::TEMPLATE_DIR,
|
|
150
|
+
desc: 'Directory COMFY uses templates from to build a VM'
|
|
151
|
+
|
|
152
|
+
class_eval %Q^
|
|
153
|
+
desc '#{plain_name}', 'Builds VM with distribution #{name}'
|
|
154
|
+
def #{plain_name}
|
|
155
|
+
start('#{plain_name}', options)
|
|
156
|
+
end
|
|
157
|
+
|
|
158
|
+
desc '#{plain_name}-versions', 'Lists all available versions of #{name}'
|
|
159
|
+
def #{plain_name}_versions
|
|
160
|
+
#{versions}.each { |version| $stdout.puts version }
|
|
161
|
+
end
|
|
162
|
+
^
|
|
163
|
+
end
|
|
164
|
+
|
|
165
|
+
private
|
|
166
|
+
|
|
167
|
+
def start(distribution_name, options)
|
|
168
|
+
parameters = options.to_hash.deep_symbolize_keys
|
|
169
|
+
parameters[:distribution] = distribution_name
|
|
170
|
+
parameters[:headless] = !parameters[:debug]
|
|
171
|
+
ENV['PACKER_CACHE_DIR'] = parameters[:'cache-dir']
|
|
172
|
+
|
|
173
|
+
init_log parameters
|
|
174
|
+
check_distribution_files distribution_name
|
|
175
|
+
|
|
176
|
+
logger.debug "Parameters: #{parameters}"
|
|
177
|
+
|
|
178
|
+
begin
|
|
179
|
+
creator = Comfy::Creator.new(parameters)
|
|
180
|
+
creator.create
|
|
181
|
+
ensure
|
|
182
|
+
creator.clean
|
|
183
|
+
end
|
|
184
|
+
end
|
|
185
|
+
|
|
186
|
+
# Inits logging according to the settings
|
|
187
|
+
#
|
|
188
|
+
# @param [Hash] parameters
|
|
189
|
+
# @option parameters [String] logging-level
|
|
190
|
+
# @option parameters [String] logging-file file to log to
|
|
191
|
+
# @option parameters [TrueClass, FalseClass] debug debug mode
|
|
192
|
+
# @return [Type] description of returned object
|
|
193
|
+
def init_log(parameters)
|
|
194
|
+
if parameters[:debug]
|
|
195
|
+
parameters[:'logging-level'] = 'DEBUG'
|
|
196
|
+
ENV['PACKER_LOG'] = '1'
|
|
197
|
+
end
|
|
198
|
+
|
|
199
|
+
Yell.new :stdout, :name => Object, :level => parameters[:'logging-level'].downcase, :format => Yell::DefaultFormat
|
|
200
|
+
Object.send :include, Yell::Loggable
|
|
201
|
+
|
|
202
|
+
if parameters[:'logging-file']
|
|
203
|
+
unless (File.exist?(parameters[:'logging-file']) && File.writable?(parameters[:'logging-file'])) || (File.writable?(File.dirname(parameters[:'logging-file'])))
|
|
204
|
+
logger.error "File #{parameters[:'logging-file']} isn't writable"
|
|
205
|
+
return
|
|
206
|
+
end
|
|
207
|
+
|
|
208
|
+
logger.adapter :file, parameters[:'logging-file']
|
|
209
|
+
end
|
|
210
|
+
end
|
|
211
|
+
|
|
212
|
+
def check_distribution_files(distribution_name)
|
|
213
|
+
distribution_cfg = File.join(Comfy::TEMPLATE_DIR, distribution_name, "#{distribution_name}.cfg.erb")
|
|
214
|
+
unless File.exist?(distribution_cfg)
|
|
215
|
+
logger.error "Missing distribution configuration #{distribution_cfg.inspect}, cannot build VM"
|
|
216
|
+
exit
|
|
217
|
+
end
|
|
218
|
+
|
|
219
|
+
distribution_desc = File.join(Comfy::TEMPLATE_DIR, distribution_name, "#{distribution_name}.description")
|
|
220
|
+
unless File.exist?(distribution_desc)
|
|
221
|
+
logger.error "Missing distribution description #{distribution_desc.inspect}, cannot build VM"
|
|
222
|
+
exit
|
|
223
|
+
end
|
|
224
|
+
end
|
|
225
|
+
end
|