dployr 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: b382202193f87d485df3e630d80d00fe16757356
4
+ data.tar.gz: 84199d78c073963b72f65d641442bbf32e2cdf2c
5
+ SHA512:
6
+ metadata.gz: 7fe63977dac1afc5eaa20966a9500dee3c25af05ddbce63f9056d7376779f9b3a72ab2f72db8d190e5c62b486d0af13ac09e7f78890c8c3fc51cea0bf750ab28
7
+ data.tar.gz: 67406e12e53495591bb9e83066519adaf7d9a66c208e6d79c3e2b9a9bc1c324461f382bb664a9e76d90c57378525d6dc0ef145f1376e0222ba3a953b003bd5cb
data/.editorconfig ADDED
@@ -0,0 +1,9 @@
1
+ root = true
2
+
3
+ [*]
4
+ charset = utf-8
5
+ indent_style = space
6
+ indent_size = 2
7
+ end_of_line = lf
8
+ trim_trailing_whitespace = true
9
+ insert_final_newline = true
data/.gitignore ADDED
@@ -0,0 +1,7 @@
1
+ *.gem
2
+ .bundle
3
+ Gemfile.lock
4
+ pkg/*
5
+ .rvmrc
6
+ .ruby-version
7
+ coverage/*
data/.travis.yml ADDED
@@ -0,0 +1,7 @@
1
+ language: ruby
2
+ before_install:
3
+ gem update --system
4
+ rvm:
5
+ - 1.9.3
6
+ - 2.0.0
7
+ - 2.1.1
data/Gemfile ADDED
@@ -0,0 +1,3 @@
1
+ source "http://rubygems.org"
2
+
3
+ gemspec
data/LICENSE ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) Innotech and contributors
2
+
3
+ Permission is hereby granted, free of charge, to any person
4
+ obtaining a copy of this software and associated documentation
5
+ files (the "Software"), to deal in the Software without
6
+ restriction, including without limitation the rights to use,
7
+ copy, modify, merge, publish, distribute, sublicense, and/or sell
8
+ copies of the Software, and to permit persons to whom the
9
+ Software is furnished to do so, subject to the following
10
+ conditions:
11
+
12
+ The above copyright notice and this permission notice shall be
13
+ included in all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
16
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
17
+ OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
18
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
19
+ HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
20
+ WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
21
+ FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
22
+ OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,294 @@
1
+ # dployr [![Build Status](https://secure.travis-ci.org/innotech/dployr.svg?branch=master)][travis] [![Dependency Status](https://gemnasium.com/innotech/dployr.svg)][gemnasium] [![Gem](https://badge.fury.io/rb/dployr.svg)][gem]
2
+
3
+ > Multicloud management and deployment made simple
4
+
5
+ > **Spoiler! Alpha project. Funny work in progress**
6
+
7
+ <table>
8
+ <tr>
9
+ <td><b>Version</b></td><td>alpha</td>
10
+ </tr>
11
+ <tr>
12
+ <td><b>Stage</b></td><td>WIP</td>
13
+ </tr>
14
+ </table>
15
+
16
+ ## About
17
+
18
+ **Dployr** is a Ruby utility that simplifies cloud management
19
+ and deployment across different providers
20
+
21
+ You can configure your infraestructure and deployment from a simple configuration file which support built-in
22
+ rich features like templating and inheritance
23
+
24
+ Dployr only works in Ruby >= `1.9.x`
25
+
26
+ ## Installation
27
+
28
+ ```bash
29
+ $ gem install dployr
30
+ ```
31
+
32
+ Or add it as dependency in your `Gemfile` or `.gemspec` file
33
+ ```ruby
34
+ # gemspec
35
+ spec.add_dependency 'dployr', '>= 0.0.1'
36
+ # Gemfile
37
+ gem 'dployr', '>= 0.0.1'
38
+ ```
39
+
40
+ ## Usage
41
+
42
+ ### Command-line interface
43
+
44
+ ```
45
+ Usage: dployr <command> [options]
46
+
47
+ Commands
48
+
49
+ up start instances
50
+ halt stop instances
51
+ status retrieve the instances status
52
+ test run remote test in instances
53
+ deploy start, provision and test running instances
54
+ provision instance provisioning
55
+ config generate configuration in YAML format
56
+ init create a sample Dployrfile
57
+
58
+ Options
59
+
60
+ -e, --environment ENV environment to pass to the instances
61
+ -n, --name NAME template name identifier to load
62
+ -a, --attributes ATTRS aditional attributes to pass to the configuration in matrix query format
63
+ -p, --provider provider to use (allow multiple values comma-separated)
64
+ -r, --region region to use (allow multiple values comma-separated)
65
+ -h, --help help
66
+
67
+ ```
68
+
69
+ ### Programmatic API
70
+
71
+ ```ruby
72
+ Dployr::configure do |dployr|
73
+
74
+ dployr.config.add_instance({
75
+ attributes: {
76
+ name: "example",
77
+ instance_type: "m1.small",
78
+ version: "${VERSION}"
79
+ },
80
+ scripts: [
81
+ { path: "configure.sh" }
82
+ ],
83
+ providers: {
84
+ aws: {
85
+ attributes: {
86
+ network_id: "be457fca",
87
+ instance_type: "m1.small",
88
+ "type-%{name}" => "small"
89
+ },
90
+ regions: {
91
+ "eu-west-1a" => {
92
+ attributes: {
93
+ keypair: "vagrant-aws-ireland"
94
+ },
95
+ scripts: [
96
+ { path: "router.sh", args: ["%{name}", "${region}", "${provider}"] }
97
+ ]
98
+ }
99
+ }
100
+ }
101
+ }
102
+ })
103
+
104
+ end
105
+ ```
106
+
107
+ ## Features
108
+
109
+ `To do! but all will be cool :)`
110
+
111
+ ## Configuration file
112
+
113
+ Configuration file must be called `Dployrfile`. It can be also a standard Ruby file
114
+ or a YAML file (adding the `.yml` or `.yaml` extension)
115
+
116
+ #### Data schema
117
+
118
+ Each configuration level supports the followings members:
119
+
120
+ - **attributes** `Object`
121
+ - **scripts** `Array`
122
+ - **providers** `Object`
123
+ - **authentication** `Object`
124
+ - **extends** `String|Array` Allows to inherits the current config object from others
125
+
126
+ #### Templating
127
+
128
+ Dployr allows templating features inside configuration values, in order
129
+ to provide an easy and clean way to dynamically replace values and self-referenced variables
130
+ inside the same configuration
131
+
132
+ Supported template values notations
133
+
134
+ ##### Attributes
135
+
136
+ Attribute values are available to be referenciable from any part of the config document
137
+
138
+ Notation: `%{attribute-name}`
139
+
140
+ ##### Iteration context variables
141
+
142
+ You can reference to the current `provider` or `region` of the current iteration context
143
+
144
+ Notation: `${region}`
145
+
146
+ ##### Environment variables
147
+
148
+ Notation: `${HOME}`
149
+
150
+ #### Example
151
+
152
+ Featured example configuration file (YAML)
153
+ ```yaml
154
+ ---
155
+ default:
156
+ attributes:
157
+ name: "default"
158
+ prefix: dev
159
+ private_key_path: ~/pems/private.pem
160
+ authentication:
161
+ private_key_path: ~/.ssh/id_rsa
162
+ public_key_path: ~/.ssh/id_rsa.pub
163
+ username: ubuntu
164
+ providers:
165
+ aws:
166
+ attributes:
167
+ instance_type: m1.small
168
+ regions:
169
+ eu-west-1a:
170
+ attributes:
171
+ ami: ami-f5ca3682
172
+ keypair: vagrant-aws-ireland
173
+ security_groups:
174
+ - sg-576c7635
175
+ - sg-1e648a7b
176
+ subnet_id: subnet-be457fca
177
+ us-west-2b:
178
+ attributes:
179
+ ami: ami-c66608f6
180
+ keypair: vagrant-aws-oregon
181
+ security_groups:
182
+ - sg-88283cea
183
+ - sg-f233ca97
184
+ subnet_id: subnet-ef757e8d
185
+ gce:
186
+ attributes:
187
+ client_email: sample@mail.com
188
+ instance_type: m1.small
189
+ key_location: ~/pems/privatekey.p12
190
+ project_id: innotechapp
191
+ regions:
192
+ europe-west1-a:
193
+ attributes:
194
+ ami: centos-base-v5
195
+ instance_type: n1-standard-1
196
+ network: liberty-gce
197
+ scripts:
198
+ -
199
+ path: ./scripts/routes_allregions.sh
200
+ -
201
+ args: "%{name}"
202
+ path: ./scripts/updatedns.sh
203
+
204
+
205
+ custom:
206
+ name: 1
207
+ web-server:
208
+ attributes:
209
+ prefix: zeus-dev
210
+ authentication:
211
+ private_key_path: ~/.ssh/id_rsa
212
+ public_key_path: ~/.ssh/id_rsa.pub
213
+ username: ubuntu
214
+ providers:
215
+ aws:
216
+ regions:
217
+ attributes:
218
+ instance_type: m1.medium
219
+ gce:
220
+ attributes:
221
+ instance_type: m1.large
222
+ scripts:
223
+ -
224
+ args:
225
+ - "%{name}"
226
+ - "%{type}"
227
+ - "%{domain}"
228
+ path: ./scripts/configure.sh
229
+ -
230
+ args:
231
+ - "%{hydra}"
232
+ path: ./scripts/configureListener.sh
233
+ -
234
+ args:
235
+ - "%{$provider}-%{region}"
236
+ - "%{type}"
237
+ path: ./scripts/hydraProbe.sh
238
+
239
+ ```
240
+
241
+ ## Contributing
242
+
243
+ Feel free to report any issue you experiment via Github issues.
244
+ PR are also too much appreciated
245
+
246
+ Only PR which follows the [Ruby coding style][ruby-guide] guide will be accepted.
247
+ Aditionally, you must cover with test any new feature or refactor you do
248
+
249
+ We try to follow the [best RSpec][rspec-best] conventions in our tests
250
+
251
+ ### Development
252
+
253
+ Only Ruby and Ruby gems are required for development.
254
+ To run the development rake tasks, you also need to have `bundler` installed.
255
+
256
+ Clone/fork this repository
257
+ ```
258
+ $ git clone git@github.com:innotech/dployr.git && cd dployr
259
+ ```
260
+
261
+ Install dependencies
262
+ ```
263
+ $ bundle install
264
+ ```
265
+
266
+ Before you push any changes, run test specs
267
+ ```
268
+ $ rake test
269
+ ```
270
+
271
+ To build a new version of the gem:
272
+ ```
273
+ $ rake build
274
+ ````
275
+
276
+ To publish the new version to Rubygems:
277
+ ```
278
+ $ rake release
279
+ ```
280
+
281
+ ## Contributors
282
+
283
+ - [Tomas Aparicio](https://github.com/h2non)
284
+ - [Germán Ramos](https://github.com/germanramos)
285
+
286
+ ## License
287
+
288
+ [MIT](http://opensource.org/licenses/MIT) © Innotech and contributors
289
+
290
+ [travis]: http://travis-ci.org/innotech/dployr
291
+ [gemnasium]: https://gemnasium.com/innotech/dployr
292
+ [gem]: http://rubygems.org/gems/dployr
293
+ [ruby-guide]: https://github.com/bbatsov/ruby-style-guide
294
+ [rspec-test]: http://betterspecs.org/
data/Rakefile ADDED
@@ -0,0 +1,11 @@
1
+ require "rspec/core/rake_task"
2
+ require "bundler/gem_tasks"
3
+
4
+ desc "Run specs"
5
+ RSpec::Core::RakeTask.new do |t|
6
+ t.verbose = false
7
+ t.rspec_opts = '--color --order defined --format documentation' # --fail-fast
8
+ end
9
+
10
+ task :test => :spec
11
+ task :default => :spec
data/bin/dployr ADDED
@@ -0,0 +1,4 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ $LOAD_PATH.push File.expand_path("../../lib", __FILE__)
4
+ require 'dployr/cli/cli'
data/dployr.gemspec ADDED
@@ -0,0 +1,33 @@
1
+ $:.push File.expand_path("../lib", __FILE__)
2
+ require 'dployr/version'
3
+
4
+ Gem::Specification.new do |s|
5
+ s.name = "dployr"
6
+ s.version = Dployr::VERSION
7
+ s.summary = "Multicloud management and deployment with asteroids made simple"
8
+ s.description = "Multicloud management and deployment with asteroids made simple with a rich programmatic API and featured CLI"
9
+ s.authors = ["Tomas Aparicio"]
10
+ s.email = ["nerds@innotechapp.com"]
11
+ s.homepage = "https://github.com/innotech/dployr"
12
+ s.license = "MIT"
13
+ s.rubyforge_project = "dployr"
14
+
15
+ s.bindir = "bin"
16
+ s.require_paths = ["lib"]
17
+ s.executables = ["dployr"]
18
+
19
+ s.rdoc_options = ["--charset=UTF-8"]
20
+ s.extra_rdoc_files = %w[README.md]
21
+
22
+ s.add_dependency "fog", "~> 1.21"
23
+ s.add_dependency "deep_merge", "~> 1.0"
24
+
25
+ s.add_development_dependency "rake", "~> 10"
26
+ s.add_development_dependency "rspec", "~> 2"
27
+
28
+ s.required_ruby_version = ">= 1.9.3"
29
+
30
+ s.files = `git ls-files`.split("\n")
31
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
32
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
33
+ end
@@ -0,0 +1,77 @@
1
+ require 'optparse'
2
+ require 'dployr'
3
+ require 'dployr/version'
4
+ require 'dployr/cli/commands'
5
+
6
+ command = ARGV[0]
7
+ options = {}
8
+
9
+ opt_parser = OptionParser.new do |opt|
10
+ opt.banner = " Usage: dployr <command> [options]"
11
+ opt.separator ""
12
+ opt.separator " Commands"
13
+ opt.separator ""
14
+ opt.separator " up start instances"
15
+ opt.separator " halt stop instances"
16
+ opt.separator " destroy destroy instances"
17
+ opt.separator " status retrieve the instances status"
18
+ opt.separator " test run remote test in instances"
19
+ opt.separator " deploy start, provision and test running instances"
20
+ opt.separator " provision instance provisioning"
21
+ opt.separator " config generate configuration in YAML format"
22
+ opt.separator " init create a sample Dployrfile"
23
+ opt.separator ""
24
+ opt.separator " Options"
25
+ opt.separator ""
26
+
27
+ opt.on("-e", "--environment ENV", "environment to pass to the instances") do |v|
28
+ options[:environment] = v
29
+ end
30
+
31
+ opt.on("-n", "--name NAME", "template name identifier to load") do |v|
32
+ options[:name] = v
33
+ end
34
+
35
+ opt.on("-a", "--attributes ATTRS", "aditional attributes to pass to the configuration in matrix query format") do |v|
36
+ options[:attributes] = v
37
+ end
38
+
39
+ opt.on("-p", "--provider", "provider to use (allow multiple values comma-separated)") do |v|
40
+ options[:provider] = v
41
+ end
42
+
43
+ opt.on("-r", "--region", "region to use (allow multiple values comma-separated)") do |v|
44
+ options[:provider] = v
45
+ end
46
+
47
+ opt.on("-v", "-V", "--version", "version") do
48
+ puts Dployr::VERSION
49
+ end
50
+
51
+ opt.on("-h", "--help", "help") do
52
+ puts opt_parser
53
+ end
54
+
55
+ opt.separator ""
56
+ end
57
+
58
+ opt_parser.parse!
59
+
60
+ case command
61
+ when "up"
62
+ puts "Command currently not available"
63
+ when "halt"
64
+ puts "Command currently not available"
65
+ when "status"
66
+ puts "Command currently not available"
67
+ when "provision"
68
+ puts "Command currently not available"
69
+ when "test"
70
+ puts "Command currently not available"
71
+ when "deploy"
72
+ puts "Command currently not available"
73
+ when "config"
74
+ Dployr::CLI::Config.new options
75
+ when "init"
76
+ Dployr::Config::Create.write_file
77
+ end
@@ -0,0 +1,66 @@
1
+ require 'logger'
2
+ require 'dployr'
3
+ require 'dployr/utils'
4
+
5
+ module Dployr
6
+ module CLI
7
+ class Config
8
+
9
+ include Dployr::Utils
10
+
11
+ def initialize(options)
12
+ @options = options
13
+ @name = options[:name]
14
+ @log = Logger.new STDOUT
15
+ @attributes = parse_attributes @options[:attributes]
16
+
17
+ begin
18
+ create
19
+ render_file
20
+ rescue Exception => e
21
+ @log.error e
22
+ Process.exit! false
23
+ end
24
+ end
25
+
26
+ def create
27
+ begin
28
+ @dployr = Dployr::Init.new @attributes
29
+ rescue Exception => e
30
+ raise "Cannot load the config: #{e}"
31
+ end
32
+ end
33
+
34
+ def render_file
35
+ raise "Dployrfile was not found" if @dployr.file_path.nil?
36
+ raise "Configuration is missing" unless @dployr.config.exists?
37
+ begin
38
+ if @name
39
+ config = @dployr.config.get_config @name, @attributes
40
+ else
41
+ puts @attributes
42
+ config = @dployr.config.get_config_all @attributes
43
+ end
44
+ unless config.nil?
45
+ puts config.to_yaml
46
+ else
47
+ @log.info "Missing configuration data"
48
+ end
49
+ rescue Exception => e
50
+ raise "Cannot generate the config: #{e}"
51
+ end
52
+ end
53
+
54
+ def parse_attributes(attributes)
55
+ if attributes.is_a? String
56
+ if @options[:attributes][0] == '-'
57
+ parse_flags attributes
58
+ else
59
+ parse_matrix attributes
60
+ end
61
+ end
62
+ end
63
+
64
+ end
65
+ end
66
+ end
@@ -0,0 +1 @@
1
+ require 'dployr/cli/commands/config'
@@ -0,0 +1,28 @@
1
+ require 'fog'
2
+
3
+ module Dployr
4
+ module Compute
5
+ class Client
6
+
7
+ attr_reader :client
8
+
9
+ DEFAULT = {
10
+ provider: 'AWS'
11
+ }
12
+
13
+ def initialize(options)
14
+ @options = options
15
+ @client = Fog::Compute.new DEFAULT.merge options
16
+ end
17
+
18
+ def servers
19
+ @client.servers
20
+ end
21
+
22
+ def create_server(options)
23
+ @client.servers.create options
24
+ end
25
+
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,10 @@
1
+ module Dployr
2
+ module Config
3
+ module Constants
4
+
5
+ FILENAME = "Dployrfile"
6
+ EXTENSIONS = ['rb', 'yml', 'yaml']
7
+
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,54 @@
1
+ module Dployr
2
+ module Config
3
+ module Create
4
+
5
+ FILENAME = 'Dployrfile'
6
+
7
+ RB_CONTENT = <<-EOS
8
+ Dployr::configure do |dployr|
9
+ dployr.config.set_default({
10
+ attributes: {
11
+ instance_type: "m1.medium"
12
+ }
13
+ })
14
+
15
+ dployr.config.add_instance('name', {
16
+ scripts: [
17
+ { path: 'path/to/script.sh' }
18
+ ]
19
+ })
20
+ end
21
+ EOS
22
+
23
+ YAML_CONTENT = <<-EOS
24
+ default:
25
+ attributes:
26
+ instance_type: m1.medium
27
+ instance:
28
+ attributes:
29
+ name: my_instance
30
+ scripts:
31
+ -
32
+ path: path/to/script.sh
33
+ EOS
34
+
35
+ module_function
36
+
37
+ def write_file(dir = Dir.pwd, type = 'rb')
38
+ yaml = type == 'yaml'
39
+ file_name = FILENAME
40
+ file_name += ".yaml" if yaml
41
+ content = yaml ? YAML_CONTENT : RB_CONTENT
42
+ begin
43
+ file = File.open "#{dir}/#{FILENAME}", "w"
44
+ file.write content
45
+ rescue IOError => e
46
+ raise e
47
+ ensure
48
+ file.close unless file == nil
49
+ end
50
+ end
51
+
52
+ end
53
+ end
54
+ end
@@ -0,0 +1,36 @@
1
+ require 'yaml'
2
+ require 'dployr/config/constants'
3
+
4
+ module Dployr
5
+ module Config
6
+ module FileUtils
7
+
8
+ include Dployr::Config::Constants
9
+
10
+ module_function
11
+
12
+ def yaml_file?(str)
13
+ !(str =~ /\.y[a]?ml$/).nil?
14
+ end
15
+
16
+ def read_yaml(file_path)
17
+ YAML.load_file file_path
18
+ end
19
+
20
+ def discover(dir = Dir.pwd)
21
+ [nil].concat(EXTENSIONS).each do |ext|
22
+ (0..5).each do |n|
23
+ file_name = FILENAME
24
+ file_name += ".#{ext}" if ext
25
+ file_path = File.join dir, ('../' * n), file_name
26
+ if File.exists? file_path
27
+ return File.expand_path file_path, dir
28
+ end
29
+ end
30
+ end
31
+ nil
32
+ end
33
+
34
+ end
35
+ end
36
+ end