open-dock 0.0.10

Sign up to get free protection for your applications and to get access to all the features.
@@ -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: []