bosh_cli_plugin_consul 0.1.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.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 42103263896620cf47360b7b8d04ce61fa4e7ef6
4
+ data.tar.gz: 9d5dae269c4ac44c5f85edef7168117d668b1fb2
5
+ SHA512:
6
+ metadata.gz: f841187931b50cc360de71ddccb606d28ad10bd959bf5c4634a71e4895162be883d66670c6c970bb8ca031e78d07629dcd3c096676d0afbc323e54d46df7d75f
7
+ data.tar.gz: bb806d0a74e4ac5fac650c080b45bec9594b2a61f1601d16274aac48730f55c9ee872afc3ee2e9ddca86e050041abbf024c14b1de9fa47bb1280affb45cea780
@@ -0,0 +1,22 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
18
+ *.bundle
19
+ *.so
20
+ *.o
21
+ *.a
22
+ mkmf.log
data/.rspec ADDED
@@ -0,0 +1,3 @@
1
+ --format progress
2
+ --color
3
+ --require spec_helper
@@ -0,0 +1,12 @@
1
+ ChangeLog
2
+ =========
3
+
4
+ v1
5
+ --
6
+
7
+ - initial release
8
+
9
+ Commands:
10
+
11
+ - target consul - setup by picking a deployment using consul
12
+ - consul services - show advertised services
data/Gemfile ADDED
@@ -0,0 +1,8 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in bosh_cli_plugin_consul.gemspec
4
+ gemspec
5
+
6
+ group :development do
7
+ gem "guard-rspec"
8
+ end
@@ -0,0 +1,5 @@
1
+ guard :rspec do
2
+ watch(%r{^spec/.+_spec\.rb$})
3
+ watch(%r{^lib/bosh/consul/(.+)\.rb$}) { |m| "spec/#{m[1]}_spec.rb" }
4
+ watch('spec/spec_helper.rb') { "spec" }
5
+ end
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2014 Dr Nic Williams
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,75 @@
1
+ BOSH CLI plugin for Consul
2
+ ==========================
3
+
4
+ If you're using consul within your BOSH deployments (such as [redis-boshrelease](https://github.com/cloudfoundry-community/redis-boshrelease#consul-service-advertisement)), or running a cluster of consul servers ([consul-boshrelease](https://github.com/cloudfoundry-community/consul-boshrelease)), this BOSH CLI plugin is a very handy ops tool.
5
+
6
+ Installation
7
+ ------------
8
+
9
+ Install via RubyGems:
10
+
11
+ ```
12
+ $ gem install bosh_cli_plugin_consul
13
+ ```
14
+
15
+ Usage
16
+ -----
17
+
18
+ To see the list of commands: `bosh consul`
19
+
20
+ To use the CLI plugin, first target the consul cluster (`bosh target consul`).
21
+
22
+ ### Target consul
23
+
24
+ The CLI can discover the consul cluster from any BOSH deployment using consul. The consul cluster does not even have to be managed by BOSH.
25
+
26
+ ```
27
+ $ bosh target consul
28
+ 1. consul-warden
29
+ 2. redis-warden
30
+ Choose a deployment: 2
31
+ Fetching consul cluster info from deployment 'redis-warden'...
32
+
33
+ Current consul cluster from deployment 'redis-warden' OK
34
+ Leader 10.244.4.6
35
+ Peers 10.244.4.14, 10.244.4.6, 10.244.4.10
36
+ ```
37
+
38
+ ### View services
39
+
40
+ ```
41
+ $ bosh consul services
42
+ +--------------+--------------+-------------+------+--------+
43
+ | name | service id | ip | port | tags |
44
+ +--------------+--------------+-------------+------+--------+
45
+ | consul | consul | 10.244.4.6 | 8300 | |
46
+ | | | 10.244.4.10 | 8300 | |
47
+ | | | 10.244.4.14 | 8300 | |
48
+ +--------------+--------------+-------------+------+--------+
49
+ | redis-warden | redis-warden | 10.244.2.6 | 6379 | master |
50
+ | | | 10.244.2.14 | 6379 | slave |
51
+ | | | 10.244.2.10 | 6379 | slave |
52
+ +--------------+--------------+-------------+------+--------+
53
+
54
+ $ bosh consul services --dns
55
+ +--------------+--------------+-------------+------+--------+-----------------------------------------------------------------+
56
+ | name | service id | ip | port | tags | dns |
57
+ +--------------+--------------+-------------+------+--------+-----------------------------------------------------------------+
58
+ | consul | consul | 10.244.4.6 | 8300 | | consul.service.consul |
59
+ | | | 10.244.4.10 | 8300 | | consul.service.consul |
60
+ | | | 10.244.4.14 | 8300 | | consul.service.consul |
61
+ +--------------+--------------+-------------+------+--------+-----------------------------------------------------------------+
62
+ | redis-warden | redis-warden | 10.244.2.6 | 6379 | master | redis-warden.service.consul, master.redis-warden.service.consul |
63
+ | | | 10.244.2.14 | 6379 | slave | redis-warden.service.consul, slave.redis-warden.service.consul |
64
+ | | | 10.244.2.10 | 6379 | slave | redis-warden.service.consul, slave.redis-warden.service.consul |
65
+ +--------------+--------------+-------------+------+--------+-----------------------------------------------------------------+
66
+ ```
67
+
68
+ Contributing
69
+ ------------
70
+
71
+ 1. Fork it ( https://github.com/[my-github-username]/bosh_cli_plugin_consul/fork )
72
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
73
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
74
+ 4. Push to the branch (`git push origin my-new-feature`)
75
+ 5. Create a new Pull Request
@@ -0,0 +1,2 @@
1
+ require "bundler/gem_tasks"
2
+
@@ -0,0 +1,28 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'bosh_cli_plugin_consul/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "bosh_cli_plugin_consul"
8
+ spec.version = BoshCliPluginConsul::VERSION
9
+ spec.authors = ["Dr Nic Williams"]
10
+ spec.email = ["drnicwilliams@gmail.com"]
11
+ spec.summary = %q{BOSH CLI plugin for access, visibility and status of deployments using Consul}
12
+ spec.description = %q{BOSH CLI plugin for access, visibility and status of deployments using Consul}
13
+ spec.homepage = ""
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
+
21
+ spec.add_dependency "bosh_cli"
22
+ spec.add_dependency "rest-client"
23
+
24
+ spec.add_development_dependency "bundler", "~> 1.6"
25
+ spec.add_development_dependency "rake"
26
+ spec.add_development_dependency "rspec"
27
+ spec.add_development_dependency "rspec-fire"
28
+ end
@@ -0,0 +1,150 @@
1
+ $:.unshift(File.expand_path("../../../..", __FILE__))
2
+
3
+ module Bosh::Cli::Command
4
+ class ConsulCommands < Base
5
+ include Bosh::Cli::Validation
6
+
7
+ DEFAULT_CONFIG_PATH = File.expand_path('~/.bosh_consul_config')
8
+
9
+ def initialize(runner)
10
+ super(runner)
11
+ # options[:config] ||= DEFAULT_CONFIG_PATH # hijack Cli::Config
12
+ end
13
+
14
+ usage "consul"
15
+ desc "show consul commands"
16
+ def consul_help
17
+ say("bosh consul commands:")
18
+ nl
19
+ cmds = Bosh::Cli::Config.commands.values.find_all {|c|
20
+ c.usage =~ /consul/
21
+ }
22
+ Bosh::Cli::Command::Help.list_commands(cmds)
23
+ end
24
+
25
+
26
+ usage "target consul"
27
+ desc "target a consul cluster"
28
+ def target_consul(deployment_name=nil)
29
+ require "bosh/consul"
30
+
31
+ unless deployment_name
32
+ deployment_name = prompt_for_deployment
33
+ end
34
+
35
+ say "Fetching consul cluster info from deployment '#{deployment_name}'..."
36
+ cluster = Bosh::Consul::Models::Cluster.new(director)
37
+ cluster.load_from_deployment_name(deployment_name)
38
+ step("Current consul cluster from deployment '#{deployment_name}'", "Cannot find consul cluster '#{deployment_name}'", :fatal) do
39
+ cluster.valid?
40
+ end
41
+ show_cluster(cluster)
42
+
43
+ consul_config = config.read("consul") || {}
44
+ consul_config[target] = { "leader" => cluster.leader, "peers" => cluster.peers, "domain" => cluster.domain }
45
+ config.write_global("consul", consul_config)
46
+ config.save
47
+
48
+ rescue Bosh::Cli::ValidationHalted
49
+ err errors.first
50
+ # rescue => e
51
+ # puts e.message
52
+ end
53
+
54
+ usage "consul status"
55
+ desc "display status of target consul cluster"
56
+ def display_status
57
+ require "bosh/consul"
58
+
59
+ verify_target_consul_config
60
+ cluster = load_cluster
61
+ show_cluster(cluster)
62
+ end
63
+
64
+ usage "consul services"
65
+ desc "display services advertises on consul"
66
+ option "--dns", "show dns hostnames"
67
+ def display_services
68
+ require "bosh/consul"
69
+ show_dns = options[:dns]
70
+
71
+ cluster = load_cluster
72
+ domain = cluster.domain
73
+
74
+ services = Bosh::Consul::Models::Services.new
75
+ require "pp"
76
+ items = services.load_from_ip(cluster.leader)
77
+
78
+ previous_name = nil
79
+ view = table(items) do |t|
80
+ t.headings = ["name", "service id", "ip", "port", "tags"]
81
+ t.headings << "dns" if show_dns
82
+ items.each do |item|
83
+ same_as_previous = (previous_name == item["ServiceName"])
84
+ if previous_name && !same_as_previous
85
+ t.add_separator
86
+ end
87
+
88
+ tags = item["ServiceTags"] || []
89
+ if show_dns
90
+ dns = ["#{item["ServiceName"]}.service.#{domain}"]
91
+ tags.each do |tag|
92
+ dns << "#{tag}.#{item["ServiceName"]}.service.#{domain}"
93
+ end
94
+ end
95
+
96
+ row = [
97
+ same_as_previous ? "" : item["ServiceName"],
98
+ same_as_previous ? "" : item["ServiceID"],
99
+ item["Address"],
100
+ item["ServicePort"],
101
+ tags.join(", ")
102
+ ]
103
+ row << dns.join(", ") if show_dns
104
+ t << row
105
+
106
+ previous_name = item["ServiceName"]
107
+ end
108
+ end
109
+ say(view)
110
+
111
+ end
112
+
113
+ private
114
+ def prompt_for_deployment
115
+ names = director.list_deployments.map { |deployment| deployment["name"] }
116
+ return names.first if names.size == 1
117
+
118
+ choose do |menu|
119
+ menu.prompt = 'Choose a deployment: '
120
+ names.each do |name|
121
+ menu.choice(name) { name }
122
+ end
123
+ end
124
+ end
125
+
126
+ def show_cluster(cluster)
127
+ say('Leader'.ljust(10) + cluster.leader)
128
+ say('Peers'.ljust(10) + cluster.peers.join(", "))
129
+ end
130
+
131
+ # loads consul configuration for the target director
132
+ def target_consul_config
133
+ consul_config = config.read("consul") || {}
134
+ consul_config[target]
135
+ end
136
+
137
+ def verify_target_consul_config
138
+ unless target_consul_config
139
+ err "First target a consul deployment with 'bosh target consul'"
140
+ end
141
+ end
142
+
143
+ def load_cluster
144
+ leader_ip = target_consul_config["leader"]
145
+ cluster = Bosh::Consul::Models::Cluster.new(director)
146
+ cluster.load_from_agent(leader_ip)
147
+ cluster
148
+ end
149
+ end
150
+ end
@@ -0,0 +1,6 @@
1
+ module Bosh
2
+ module Consul
3
+ end
4
+ end
5
+
6
+ require "bosh/consul/models"
@@ -0,0 +1,8 @@
1
+ module Bosh::Consul
2
+ module Models
3
+ end
4
+ end
5
+
6
+ require "rest_client"
7
+ require "bosh/consul/models/cluster"
8
+ require "bosh/consul/models/services"
@@ -0,0 +1,54 @@
1
+ class Bosh::Consul::Models::Cluster
2
+ attr_reader :director_client
3
+ attr_reader :leader, :peers, :domain
4
+
5
+ def initialize(director_client)
6
+ @director_client = director_client
7
+
8
+ # FIXME: waiting on an API endpoint to discover the domain
9
+ @domain = "consul"
10
+ end
11
+
12
+ # A [re-]initialization method to get IPs for a cluster
13
+ def load_from_deployment_name(deployment_name)
14
+ @leader = @peers = nil
15
+
16
+ # fetch_vm_state raises error if name invalid
17
+ vms = director_client.fetch_vm_state(deployment_name)
18
+ deployment_ips = vms.map {|vm| vm["ips"].first }
19
+ discover_from_ips(deployment_ips)
20
+ end
21
+
22
+ def load_from_agent(leader_ip)
23
+ @leader = @peers = nil
24
+ discover_from_ips([leader_ip])
25
+ end
26
+
27
+ # Discover the consul cluster from the IPs of servers or clients to the cluster
28
+ # Setups up @leader & @peers IP addresses
29
+ def discover_from_ips(ips)
30
+ ip = ips.first
31
+ if @leader = get(ip, "/v1/status/leader")
32
+ @leader =~ /"(.*):(\d+)"/
33
+ @leader, @cluster_port = $1, $2
34
+ @peers = JSON.parse(get(ip, "/v1/status/peers"))
35
+ @peers.map! do |peer|
36
+ peer =~ /(.*):(\d+)/
37
+ $1
38
+ end
39
+ end
40
+ end
41
+
42
+ def valid?
43
+ @leader
44
+ end
45
+
46
+ private
47
+ def get(ip, path)
48
+ consul_api(ip)[path].get
49
+ end
50
+
51
+ def consul_api(ip)
52
+ RestClient::Resource.new("http://#{ip}:8500")
53
+ end
54
+ end
@@ -0,0 +1,20 @@
1
+ class Bosh::Consul::Models::Services
2
+ def load_from_ip(ip)
3
+ nodes = []
4
+ services = JSON.parse(get(ip, "/v1/catalog/services"))
5
+ services.each do |name, tags|
6
+ service_nodes = JSON.parse(get(ip, "/v1/catalog/service/#{name}"))
7
+ nodes.push(*service_nodes)
8
+ end
9
+ nodes
10
+ end
11
+
12
+ private
13
+ def get(ip, path)
14
+ consul_api(ip)[path].get
15
+ end
16
+
17
+ def consul_api(ip)
18
+ RestClient::Resource.new("http://#{ip}:8500")
19
+ end
20
+ end
@@ -0,0 +1,5 @@
1
+ require "bosh_cli_plugin_consul/version"
2
+
3
+ module BoshCliPluginConsul
4
+ # Your code goes here...
5
+ end
@@ -0,0 +1,3 @@
1
+ module BoshCliPluginConsul
2
+ VERSION = "0.1.0"
3
+ end
@@ -0,0 +1,34 @@
1
+ describe Bosh::Consul::Models::Cluster do
2
+ let(:director) { double("Bosh::Cli::Client::Director") }
3
+
4
+ subject { Bosh::Consul::Models::Cluster.new(director) }
5
+
6
+ it "initially does not represent a cluster" do
7
+ expect(subject.valid?).to be_false
8
+ end
9
+
10
+ it "can load consul cluster IPs from any deployment" do
11
+ expect(director).to receive(:fetch_vm_state).and_return([{"ips" => ["10.244.4.2"]}, {"ips" => ["10.244.4.6"]}])
12
+ expect(subject).to receive(:discover_from_ips).with(["10.244.4.2", "10.244.4.6"])
13
+ subject.load_from_deployment_name("foobar")
14
+ end
15
+
16
+ it "can load cluster from single IP of consul server or agent" do
17
+ expect(subject).to receive(:discover_from_ips).with(["10.244.4.2"])
18
+ subject.load_from_agent("10.244.4.2")
19
+ end
20
+
21
+ context "from any agent" do
22
+ let(:target_ip) { "10.244.10.10" }
23
+ let(:api) { RestClient::Resource.new("http://#{target_ip}:8500") }
24
+
25
+ it "can discover the leader & peers" do
26
+ expect(subject).to receive(:get).with("10.244.10.10", "/v1/status/leader").and_return('"10.244.4.2:8300"\n')
27
+ expect(subject).to receive(:get).with("10.244.10.10", "/v1/status/peers").and_return('["10.244.4.2:8300", "10.244.4.6:8300"]')
28
+ subject.discover_from_ips(["10.244.10.10"])
29
+ expect(subject.leader).to eq "10.244.4.2"
30
+ expect(subject.peers).to eq ["10.244.4.2", "10.244.4.6"]
31
+ end
32
+ end
33
+
34
+ end
@@ -0,0 +1,11 @@
1
+ describe Bosh::Consul::Models::Services do
2
+ subject { Bosh::Consul::Models::Services.new }
3
+
4
+ it "fetches services" do
5
+ expect(subject).to receive(:get).with("10.244.4.2", "/v1/catalog/services").and_return('{"consul":[],"redis-warden":["master", "slave"]}')
6
+ expect(subject).to receive(:get).with("10.244.4.2", "/v1/catalog/service/consul").and_return('[{"Node":"consul-warden-consul_server_z1-0","Address":"10.244.4.6","ServiceID":"consul","ServiceName":"consul","ServiceTags":null,"ServicePort":8300},{"Node":"consul-warden-consul_server_z1-1","Address":"10.244.4.10","ServiceID":"consul","ServiceName":"consul","ServiceTags":null,"ServicePort":8300},{"Node":"consul-warden-consul_server_z1-2","Address":"10.244.4.14","ServiceID":"consul","ServiceName":"consul","ServiceTags":null,"ServicePort":8300}]')
7
+ expect(subject).to receive(:get).with("10.244.4.2", "/v1/catalog/service/redis-warden").and_return('[{"Node":"redis-warden-redis_leader_z1-0","Address":"10.244.2.6","ServiceID":"redis-warden","ServiceName":"redis-warden","ServiceTags":["master"],"ServicePort":6379},{"Node":"redis-warden-redis_z1-1","Address":"10.244.2.14","ServiceID":"redis-warden","ServiceName":"redis-warden","ServiceTags":["slave"],"ServicePort":6379},{"Node":"redis-warden-redis_z1-0","Address":"10.244.2.10","ServiceID":"redis-warden","ServiceName":"redis-warden","ServiceTags":["slave"],"ServicePort":6379}]')
8
+
9
+ subject.load_from_ip("10.244.4.2")
10
+ end
11
+ end
@@ -0,0 +1,59 @@
1
+ # Copyright (c) 2012-2013 Stark & Wayne, LLC
2
+
3
+ ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../Gemfile", __FILE__)
4
+
5
+ require "rubygems"
6
+ require "bundler"
7
+ Bundler.setup(:default, :test)
8
+
9
+ $:.unshift(File.expand_path("../../lib", __FILE__))
10
+
11
+ require "rspec/core"
12
+ require 'rspec/fire'
13
+
14
+ # for the #sh helper
15
+ require "rake"
16
+ require "rake/file_utils"
17
+
18
+ # bosh_cli
19
+ require "cli"
20
+
21
+ require "bosh/consul"
22
+
23
+ RSpec.configure do |config|
24
+ config.include(RSpec::Fire)
25
+ end
26
+
27
+ # load all files in spec/support/* (but not lower down)
28
+ Dir[File.dirname(__FILE__) + '/support/*'].each do |path|
29
+ require path unless File.directory?(path)
30
+ end
31
+
32
+ def spec_fixture(filename)
33
+ File.expand_path("../fixtures/#{filename}", __FILE__)
34
+ end
35
+
36
+ def setup_home_dir
37
+ home_dir = File.expand_path("../../tmp/home", __FILE__)
38
+ FileUtils.rm_rf(home_dir)
39
+ FileUtils.mkdir_p(home_dir)
40
+ ENV['HOME'] = home_dir
41
+ end
42
+
43
+ # returns the file path to a file
44
+ # in the fake $HOME folder
45
+ def home_file(*path)
46
+ File.join(ENV['HOME'], *path)
47
+ end
48
+
49
+ def in_home_dir(&block)
50
+ FileUtils.chdir(home_file, &block)
51
+ end
52
+
53
+ def get_tmp_file_path(content)
54
+ tmp_file = File.open(File.join(Dir.mktmpdir, "tmp"), "w")
55
+ tmp_file.write(content)
56
+ tmp_file.close
57
+
58
+ tmp_file.path
59
+ end
metadata ADDED
@@ -0,0 +1,151 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: bosh_cli_plugin_consul
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Dr Nic Williams
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2015-01-19 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bosh_cli
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rest-client
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: bundler
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '1.6'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '1.6'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rake
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: rspec
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: rspec-fire
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ description: BOSH CLI plugin for access, visibility and status of deployments using
98
+ Consul
99
+ email:
100
+ - drnicwilliams@gmail.com
101
+ executables: []
102
+ extensions: []
103
+ extra_rdoc_files: []
104
+ files:
105
+ - ".gitignore"
106
+ - ".rspec"
107
+ - ChangeLog.md
108
+ - Gemfile
109
+ - Guardfile
110
+ - LICENSE.txt
111
+ - README.md
112
+ - Rakefile
113
+ - bosh_cli_plugin_consul.gemspec
114
+ - lib/bosh/cli/commands/consul_commands.rb
115
+ - lib/bosh/consul.rb
116
+ - lib/bosh/consul/models.rb
117
+ - lib/bosh/consul/models/cluster.rb
118
+ - lib/bosh/consul/models/services.rb
119
+ - lib/bosh_cli_plugin_consul.rb
120
+ - lib/bosh_cli_plugin_consul/version.rb
121
+ - spec/models/cluster_spec.rb
122
+ - spec/models/services_spec.rb
123
+ - spec/spec_helper.rb
124
+ homepage: ''
125
+ licenses:
126
+ - MIT
127
+ metadata: {}
128
+ post_install_message:
129
+ rdoc_options: []
130
+ require_paths:
131
+ - lib
132
+ required_ruby_version: !ruby/object:Gem::Requirement
133
+ requirements:
134
+ - - ">="
135
+ - !ruby/object:Gem::Version
136
+ version: '0'
137
+ required_rubygems_version: !ruby/object:Gem::Requirement
138
+ requirements:
139
+ - - ">="
140
+ - !ruby/object:Gem::Version
141
+ version: '0'
142
+ requirements: []
143
+ rubyforge_project:
144
+ rubygems_version: 2.4.3
145
+ signing_key:
146
+ specification_version: 4
147
+ summary: BOSH CLI plugin for access, visibility and status of deployments using Consul
148
+ test_files:
149
+ - spec/models/cluster_spec.rb
150
+ - spec/models/services_spec.rb
151
+ - spec/spec_helper.rb