open-dock 0.0.10

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.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 8ce090366c643fc9d48113fbeb6a1e95b8b4189e
4
+ data.tar.gz: 343c0491c26a1a049b592c3d10342715da1163cc
5
+ SHA512:
6
+ metadata.gz: 38b03e75289cdeab1bab570e05dcd8711694b9d9e1695bc0a44ba1c345bca32fb51e6fdd4fa97e2b7bec3a45d460082906a0450e7d2974a7a7390c7ecfba56d3
7
+ data.tar.gz: eba86bd3992dbe5f3347481623ceda37fff8997a5f3cdd6058b7ca7308274eaec8d3371f88e6947c181949a11c1ac1f27b420bc2b972e9e535cbb074367526cf
@@ -0,0 +1,16 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /Gemfile.lock
4
+ /_yardoc/
5
+ /coverage/
6
+ /doc/
7
+ /pkg/
8
+ /spec/reports/
9
+ /tmp/
10
+ *.bundle
11
+ *.so
12
+ *.o
13
+ *.a
14
+ mkmf.log
15
+ .idea
16
+ *.gem
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in prun_ops.gemspec
4
+ gemspec
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2014 Juan Lebrijo
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,163 @@
1
+ # Open Dock
2
+
3
+ Covers Provision and Configuration Operations for complex server clouds:
4
+
5
+ 1. PROVISION: Create hosts from all possible cloud providers (i.e.: DigitalOcean, GCloud, Rackspace, Linode ...).
6
+ 1. WIRING: Ship those hosts with Docker containers.
7
+ 1. CONFIGURATION: Build Chef cookbooks and configure/re-configure your servers.
8
+
9
+ ## Installation
10
+
11
+ Add this line to your application's Gemfile:
12
+
13
+ ```ruby
14
+ gem 'open-dock'
15
+ ```
16
+
17
+ And then execute:
18
+
19
+ $ bundle
20
+
21
+ Or install it yourself as:
22
+
23
+ $ gem install open-dock
24
+
25
+
26
+ ## Usage: Provision with OPS command
27
+
28
+ OPS command is focused to cover first Provision configurations for a the Operations of your infrastructure.
29
+
30
+ You can create an infrastructure project (like me [/ops](https://github.com/jlebrijo/ops))
31
+
32
+ ```
33
+ mkdir ops && cd ops
34
+ rbenv local 2.1.2
35
+ git init
36
+ ```
37
+
38
+ Create a Gemfile:
39
+
40
+ ```
41
+ source 'https://rubygems.org'
42
+
43
+ gem 'open-dock'
44
+
45
+ # OPTIONAL: Add next gems if you want to integrate with Chef as Configuration management tecnology
46
+ gem 'knife-solo'
47
+ gem 'librarian-chef'
48
+ gem 'foodcritic'
49
+ ```
50
+
51
+ And: `bundle install`
52
+
53
+ To avoid `bundle exec` repfix: `bundle install --binstubs .bundle/bin`
54
+
55
+ Or integrate it within your Chef infrastructure project. Just add the gem to your Gemfile.
56
+
57
+ ### Folder Structure
58
+
59
+ TODO: `ops init` to create this structure
60
+
61
+ Structure:
62
+
63
+ ```
64
+ ops
65
+ providers
66
+ digitalocean.yml
67
+ hosts
68
+ example.com.yml
69
+ containers
70
+ example.com.yml
71
+ ```
72
+
73
+ #### Provider file syntax
74
+
75
+ TODO: Create more providers (aws, linode, gcloud, ...)
76
+
77
+ For a Digital Ocean provider create a file (ops/providers/digitalocean.yml) with your account API key:
78
+
79
+ ```yml
80
+ token: a206ae60dda6bxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxcf0cbf41
81
+ ```
82
+
83
+ #### Host file syntax
84
+
85
+ For a Digital Ocean host we can make the following file (ops/hosts/example.com.yml):
86
+
87
+ ```yml
88
+ user: core # User to connect the host
89
+ # Values to configure DigitalOcean machine
90
+ size: 1gb
91
+ region: ams3
92
+ image: coreos-stable
93
+ ssh_keys:
94
+ - e7:51:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:88:57
95
+ ```
96
+
97
+ And create the host: `ops create host example.com`
98
+
99
+ ### Containers file syntax
100
+
101
+ In this file we can configure all containers to run in the host provided in the name:
102
+
103
+ ```yml
104
+ www:
105
+ image: jlebrijo/prun
106
+ ports:
107
+ - '2222:22'
108
+ - '80:80'
109
+ # command: /bin/bash
110
+
111
+ # OPTIONS: use the long name of the options, 'detach' instead of '-d'
112
+ detach: true
113
+ # interactive: true
114
+ # memory: 8g
115
+ # cpuset: 0-7
116
+
117
+ # POST-CONDITIONS: execute after build the container:
118
+ post-conditions:
119
+ - sshpass -p 'J3mw?$_6' ssh-copy-id -o 'StrictHostKeyChecking no' -i ~/.ssh/id_rsa.pub root@lebrijo.com -p 2222
120
+ - ssh root@lebrijo.com -p 2222 "echo 'root:K8rt$_?1' | chpasswd"
121
+
122
+ # here you can create other containers
123
+ # db:
124
+ # image: ubuntu/postgresql
125
+ ```
126
+
127
+ Create containers at host: `ops ship host example.com`
128
+
129
+ ### Commands
130
+
131
+ Create/delete domain names, create/delete hosts and ship/unship hosts:
132
+
133
+ * `ops create host HOST_NAME` create the host defined by the name of the file in the 'ops/hosts' folder.
134
+ * `ops delete host HOST_NAME`
135
+ * `ops create domain DOMAIN_NAME [IP_ADDRESS]` create a domain to be managed by DigitalOcean.
136
+ * `ops delete domain DOMAIN_NAME [IP_ADDRESS]`
137
+ * `ops ship host HOST_NAME` run the containers in the host.
138
+ * `ops unship host HOST_NAME`
139
+
140
+ ### TODO: Configuration with Chef
141
+
142
+ Configuration with chef commands
143
+
144
+ * `ops configure host HOST_NAME`: configure with chef all containers in host. Here you need to install knife-solo gem.
145
+ * knife solo cook [container_user]@[container_dns_name] -p [container_ssh_port]
146
+
147
+ ## Contributing
148
+
149
+ 1. Fork it ( https://github.com/[my-github-username]/open-dock/fork )
150
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
151
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
152
+ 4. Push to the branch (`git push origin my-new-feature`)
153
+ 5. Create a new Pull Request
154
+
155
+ ## License
156
+
157
+ [MIT License](http://opensource.org/licenses/MIT). Made by [Lebrijo.com](http://lebrijo.com)
158
+
159
+ ## Release notes
160
+
161
+ ### v0.0.10
162
+
163
+ * First publication: split 'open-dock' gem from 'prun-ops' gem
@@ -0,0 +1,2 @@
1
+ require "bundler/gem_tasks"
2
+
data/bin/ops ADDED
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'open-dock/ops'
@@ -0,0 +1,5 @@
1
+ require "open-dock/version"
2
+
3
+ module OpenDock
4
+ require 'open-dock/railitie' if defined?(Rails)
5
+ end
@@ -0,0 +1,17 @@
1
+ module Ops
2
+ DIR = "ops"
3
+ HOSTS_DIR = "#{DIR}/hosts"
4
+ CONTAINERS_DIR = "#{DIR}/containers"
5
+ PROVIDERS_DIR = "#{DIR}/providers"
6
+
7
+
8
+ def self.get_user_for(host_name)
9
+ host_file = "#{HOSTS_DIR}/#{host_name}.yml"
10
+ begin
11
+ params = YAML.load_file host_file
12
+ params["user"]
13
+ rescue
14
+ raise "Please, create '#{host_file}' configuring your host"
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,16 @@
1
+ command :'create domain' do |c|
2
+ c.summary = 'Create a domain in your DigitalOcean account'
3
+ c.syntax = 'ops create domain [domain name] [ip address]'
4
+ c.description = "Create the domain with #{DigitalOcean::CONFIG_FILE} credentials"
5
+ c.example 'Create the domain example.com in your DigitalOcean console', 'ops create domain example.com'
6
+ c.action do |args, options|
7
+ ip = (args[1].nil?)? '1.1.1.1':args[1]
8
+ domain = DropletKit::Domain.new(ip_address: ip, name: args[0])
9
+ resp = DigitalOcean::client.domains.create domain
10
+ if domain == resp
11
+ say "Domain #{resp.name} succesfully created!"
12
+ else
13
+ raise resp
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,17 @@
1
+ command :'create host' do |c|
2
+ c.summary = 'Create a droplet/host in your DO account'
3
+ c.syntax = 'ops create host [DNS_name]'
4
+ c.description = "Creates the host described in the file #{Ops::HOSTS_DIR}/[DNS_name].yml"
5
+ c.example "Create the host example.com in your DigitalOcean console. This is described in '#{Ops::HOSTS_DIR}/example.com.yml' like:\n # size: 512mb\n # region: ams1\n # image: coreos-stable\n # ssh_keys:\n # - e7:51:47:bc:7f:dc:2f:3c:56:65:28:e1:10:9c:88:57 xx:xx:xx:xx:xx:xx:xx", 'ops create host example.com'
6
+ c.action do |args, options|
7
+ droplet = DigitalOcean::build_droplet args[0]
8
+ cli = DigitalOcean::client
9
+ resp = cli.droplets.create droplet
10
+ if resp == droplet
11
+ ip = cli.find_droplet_by_name(args[0]).networks["v4"].first.ip_address
12
+ say "Droplet #{args[0]} (IP: #{ip}) succesfully created!"
13
+ else
14
+ raise resp
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,14 @@
1
+ command :'delete domain' do |c|
2
+ c.summary = 'Delete a domain in your DigitalOcean account'
3
+ c.syntax = 'ops delete domain [domain name]'
4
+ c.description = "Delete the domain with #{DigitalOcean::CONFIG_FILE} credentials"
5
+ c.example 'Delete the domain example.com in your DigitalOcean console', 'ops delete domain example.com'
6
+ c.action do |args, options|
7
+ resp = DigitalOcean::client.domains.delete name: args[0]
8
+ if resp.is_a?(TrueClass)
9
+ say "Domain #{args[0]} succesfully deleted!"
10
+ else
11
+ raise resp
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,16 @@
1
+ command :'delete host' do |c|
2
+ c.summary = 'Delete a host in your DigitalOcean account'
3
+ c.syntax = 'ops delete host [DNS_name]'
4
+ c.description = "Delete the host, based on DNS_name, which (not need but) should be described in its #{Ops::HOSTS_DIR}/[DNS_name].yml file "
5
+ c.example 'Delete the host example.com in your DigitalOcean console', 'ops delete host example.com'
6
+ c.action do |args, options|
7
+ cli = DigitalOcean::client
8
+ id = cli.find_droplet_by_name(args[0]).id
9
+ resp = cli.droplets.delete id: id
10
+ if resp.is_a?(TrueClass)
11
+ say "Droplet #{args[0]} succesfully deleted!"
12
+ else
13
+ raise resp
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,16 @@
1
+ command :'exec host' do |c|
2
+ c.summary = 'Execute a command in host'
3
+ c.description = "Execute a command in host defined by DNS_name"
4
+ c.syntax = 'ops exec host [host_name] "[command]"'
5
+ c.example "", "ops exec host example.com 'docker ps -a'"
6
+ c.action do |args, options|
7
+ host = args[0]
8
+ user = Ops::get_user_for(host)
9
+
10
+ Net::SSH.start(host, user) do |ssh|
11
+ Docker::containers_for(host).each do |container_name, config|
12
+ ssh.exec args[1]
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,29 @@
1
+ command :list do |c|
2
+ c.summary = 'List all droplet creation parameters'
3
+ c.syntax = 'ops list'
4
+ c.description = "This shows a list in the format '- [id] => [description]'. Use [id] values to create your host file in #{Ops::DIR}/hosts/[dns_name].yml "
5
+ c.action do |args, options|
6
+ cli = DigitalOcean::client
7
+ say "\nDESCRIPTION: #{c.description}\n"
8
+
9
+ say "\nSizes:"
10
+ cli.sizes.all.each do |i|
11
+ say " - #{i.slug.ljust(6)} => $#{i.price_monthly}/mo"
12
+ end
13
+
14
+ say "\nRegions:"
15
+ cli.regions.all.each do |i|
16
+ say " - #{i.slug.ljust(6)} => #{i.name}"
17
+ end
18
+
19
+ say "\nImages:"
20
+ cli.images.all.each do |i|
21
+ say " - #{i.slug.ljust(20)} => #{i.distribution} #{i.name}" unless i.slug.nil?
22
+ end
23
+
24
+ say "\nSSH Keys:"
25
+ cli.ssh_keys.all.each do |i|
26
+ say " - #{i.fingerprint} => #{i.name}"
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,11 @@
1
+ command :'provision host' do |c|
2
+ c.summary = 'Create and ship the host based on config files'
3
+ c.syntax = 'ops provision host [host_name]'
4
+ c.description = "Agregate both commands Create and Ship host"
5
+ c.example "Creates and ships example.com host", 'ops provisiion host example.com'
6
+ c.action do |args, options|
7
+ system "#{program :name} create host #{args.join(" ")}"
8
+ sleep 15
9
+ system "#{program :name} ship host #{args.join(" ")}"
10
+ end
11
+ end
@@ -0,0 +1,26 @@
1
+ command :'ship host' do |c|
2
+ c.summary = 'Create Docker containers defined in ops/containers/[host_name].yml'
3
+ c.syntax = 'ops ship host [host_name]'
4
+ c.description = "Create all docker containers described in #{Ops::CONTAINERS_DIR}/[host_name].yml"
5
+ c.example "Create a container called 'www' in the host example.com. This is described in '#{Ops::CONTAINERS_DIR}/example.com.yml' like:\n # www:\n # detach: true\n # image: jlebrijo/prun\n # ports:\n # - '2222:22'\n # - '80:80'", 'ops ship host example.com'
6
+ c.action do |args, options|
7
+ host = args[0]
8
+ user = Ops::get_user_for(host)
9
+
10
+ Docker::containers_for(host).each do |container_name, config|
11
+ ports = config["ports"].map{|port| "-p #{port}"}.join(" ")
12
+ options = []
13
+ config.reject{|k| Docker::SPECIAL_OPTS.include? k}.each do |option, value|
14
+ options << "--#{option}=#{value}"
15
+ end
16
+ say "Container '#{container_name}' loading on #{host}, please wait ....\n"
17
+ Net::SSH.start(host, user) do |ssh|
18
+ command = "docker run #{options.join(" ")} --name #{container_name} #{ports} #{config["image"]} #{config["command"]}"
19
+ say "Docker CMD: #{command}\n"
20
+ ssh.exec command
21
+ end
22
+ sleep 5
23
+ config["post-conditions"].each { |c| system c }
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,16 @@
1
+ command :'unship host' do |c|
2
+ c.summary = 'Removes all Docker containers defined for the host in '#{Ops::CONTAINERS_DIR}/[host_name].yml'
3
+ c.syntax = 'ops ship host [host_name]'
4
+ c.description = "Removes all Docker containers defined for the host in '#{Ops::CONTAINERS_DIR}/[host_name].yml"
5
+ c.example "", 'ops unship host example.com'
6
+ c.action do |args, options|
7
+ host = args[0]
8
+ user = Ops::get_user_for(host)
9
+
10
+ Net::SSH.start(host, user) do |ssh|
11
+ Docker::containers_for(host).each do |container_name, config|
12
+ ssh.exec "docker rm -f #{container_name}"
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,33 @@
1
+ require 'droplet_kit'
2
+ require 'yaml'
3
+
4
+ module DigitalOcean
5
+ CONFIG_FILE = "#{Ops::PROVIDERS_DIR}/digitalocean.yml"
6
+
7
+ def self.client
8
+ begin
9
+ config = YAML.load_file CONFIG_FILE
10
+ rescue
11
+ raise "Please, create '#{CONFIG_FILE}' file with token value"
12
+ end
13
+ DropletKit::Client.new(access_token: config["token"])
14
+ end
15
+
16
+ def self.build_droplet(host_name)
17
+ begin
18
+ params = YAML.load_file "#{Ops::DIR}/hosts/#{host_name}.yml"
19
+ params["name"]= host_name
20
+ rescue
21
+ raise "Please, create '#{CONFIG_FILE}' file with token value"
22
+ end
23
+ DropletKit::Droplet.new params
24
+ end
25
+ end
26
+
27
+ module DropletKit
28
+ class Client
29
+ def find_droplet_by_name(host_name)
30
+ self.droplets.all.find{|d| d.name == host_name}
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,16 @@
1
+ require 'droplet_kit'
2
+ require 'yaml'
3
+
4
+ module Docker
5
+ SPECIAL_OPTS = ["image", "ports", "command", "post-conditions"]
6
+
7
+ def self.containers_for(host_name)
8
+ config_file = "#{Ops::CONTAINERS_DIR}/#{host_name}.yml"
9
+ begin
10
+ config = YAML.load_file config_file
11
+ rescue
12
+ raise "Please, create '#{config_file}' file with all containers configured"
13
+ end
14
+ end
15
+
16
+ end
@@ -0,0 +1,14 @@
1
+ require 'rubygems'
2
+ require 'commander/import'
3
+ require 'net/ssh'
4
+ require 'open-dock/base'
5
+ require 'open-dock/digitalocean'
6
+ require 'open-dock/docker'
7
+ require 'open-dock/version'
8
+
9
+ program :name, 'ops'
10
+ program :version, OpenDock::VERSION
11
+ program :description, 'Encapsulates Operations commands for complex server clouds: Provision and Configuration from all possible providers such as DigitalOcean, Google Cloud, Rackspace, Linode,...'
12
+ program :help_formatter, :compact
13
+
14
+ Dir.glob("#{File.dirname(__FILE__)}/commands/*.rb").each { |r| load r }
@@ -0,0 +1,3 @@
1
+ module OpenDock
2
+ VERSION = "0.0.10"
3
+ end
File without changes
@@ -0,0 +1,27 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'open-dock/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "open-dock"
8
+ spec.version = OpenDock::VERSION
9
+ spec.authors = ["Juan Lebrijo"]
10
+ spec.email = ["juan@lebrijo.com"]
11
+ spec.summary = %q{Encapsulates Provision and Configuration Operations commands needed for complex server clouds.}
12
+ spec.description = %q{Encapsulates Operations commands for complex server clouds: Provision and Configuration from all possible providers such as DigitalOcean, Google Cloud, Rackspace, Linode,...}
13
+ spec.homepage = "http://github.com/jlebrijo/open-dock"
14
+ spec.license = "MIT"
15
+
16
+ spec.files = `git ls-files -z`.split("\x0")
17
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
+ spec.require_paths = ["lib"]
20
+ spec.executables = ['ops']
21
+
22
+ spec.add_development_dependency "bundler", "~> 1.6"
23
+ spec.add_development_dependency "rake", "~> 10.0"
24
+
25
+ spec.add_runtime_dependency "commander"
26
+ spec.add_runtime_dependency "droplet_kit"
27
+ end
metadata ADDED
@@ -0,0 +1,127 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: open-dock
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.10
5
+ platform: ruby
6
+ authors:
7
+ - Juan Lebrijo
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2014-11-16 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.6'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.6'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '10.0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '10.0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: commander
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: droplet_kit
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ description: 'Encapsulates Operations commands for complex server clouds: Provision
70
+ and Configuration from all possible providers such as DigitalOcean, Google Cloud,
71
+ Rackspace, Linode,...'
72
+ email:
73
+ - juan@lebrijo.com
74
+ executables:
75
+ - ops
76
+ extensions: []
77
+ extra_rdoc_files: []
78
+ files:
79
+ - ".gitignore"
80
+ - Gemfile
81
+ - LICENSE.txt
82
+ - README.md
83
+ - Rakefile
84
+ - bin/ops
85
+ - lib/open-dock.rb
86
+ - lib/open-dock/base.rb
87
+ - lib/open-dock/commands/create_domain.rb
88
+ - lib/open-dock/commands/create_host.rb
89
+ - lib/open-dock/commands/delete_domain.rb
90
+ - lib/open-dock/commands/delete_host.rb
91
+ - lib/open-dock/commands/exec_host.rb
92
+ - lib/open-dock/commands/list.rb
93
+ - lib/open-dock/commands/provision_host.rb
94
+ - lib/open-dock/commands/ship_host.rb
95
+ - lib/open-dock/commands/unship_host.rb
96
+ - lib/open-dock/digitalocean.rb
97
+ - lib/open-dock/docker.rb
98
+ - lib/open-dock/ops.rb
99
+ - lib/open-dock/version.rb
100
+ - lib/tasks/.gitkeep
101
+ - open-dock.gemspec
102
+ homepage: http://github.com/jlebrijo/open-dock
103
+ licenses:
104
+ - MIT
105
+ metadata: {}
106
+ post_install_message:
107
+ rdoc_options: []
108
+ require_paths:
109
+ - lib
110
+ required_ruby_version: !ruby/object:Gem::Requirement
111
+ requirements:
112
+ - - ">="
113
+ - !ruby/object:Gem::Version
114
+ version: '0'
115
+ required_rubygems_version: !ruby/object:Gem::Requirement
116
+ requirements:
117
+ - - ">="
118
+ - !ruby/object:Gem::Version
119
+ version: '0'
120
+ requirements: []
121
+ rubyforge_project:
122
+ rubygems_version: 2.4.2
123
+ signing_key:
124
+ specification_version: 4
125
+ summary: Encapsulates Provision and Configuration Operations commands needed for complex
126
+ server clouds.
127
+ test_files: []