comfy 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|
+
[![Build Status](https://secure.travis-ci.org/CESNET/comfy.png)](http://travis-ci.org/CESNET/comfy)
|
5
|
+
[![Dependency Status](https://gemnasium.com/CESNET/comfy.png)](https://gemnasium.com/CESNET/comfy)
|
6
|
+
[![Gem Version](https://fury-badge.herokuapp.com/rb/comfy.png)](https://badge.fury.io/rb/comfy)
|
7
|
+
[![Code Climate](https://codeclimate.com/github/CESNET/comfy.png)](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
|