rancher-metadata 0.0.1
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.
- checksums.yaml +7 -0
- data/LICENSE +12 -0
- data/README.md +34 -0
- data/lib/rancher-metadata/api.rb +234 -0
- data/lib/rancher-metadata/version.rb +13 -0
- metadata +61 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 5bbcc6e8972b636c44d6158ec95ee74fb5b49fd2
|
4
|
+
data.tar.gz: 19e7ef0e862aa87b536740bcb5e8e5a17bbc0eda
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 848d05a251829b4d98e4eea561e5858af3234bef82e211f82e898f30707c77a7517067e3087d16781636e0054b138c56a284467f4a8291d4d99e9d724719fc4c
|
7
|
+
data.tar.gz: 39c747044823478995997d8ef4112b6a063c70d6b6f38d14e9174e41b675d78d5460650a727f6cd1030e338e4ece05af2a523a57535feba4ee384f2b468126df
|
data/LICENSE
ADDED
@@ -0,0 +1,12 @@
|
|
1
|
+
Copyright 2016 Matteo Cerutti
|
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
|
+
http://www.apache.org/licenses/LICENSE-2.0
|
7
|
+
|
8
|
+
Unless required by applicable law or agreed to in writing, software
|
9
|
+
distributed under the License is distributed on an "AS IS" BASIS,
|
10
|
+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
11
|
+
See the License for the specific language governing permissions and
|
12
|
+
limitations under the License.
|
data/README.md
ADDED
@@ -0,0 +1,34 @@
|
|
1
|
+
# Ruby library for Rancher Metadata API
|
2
|
+
This is a simple Ruby library that allows to interact with the Rancher Metadata REST API.
|
3
|
+
|
4
|
+
Pull requests to add additional API features (as documented at http://docs.rancher.com/rancher/metadata-service/) are very welcome. I only implemented what I needed.
|
5
|
+
|
6
|
+
## Install
|
7
|
+
To install it simply issue the following command:
|
8
|
+
|
9
|
+
```
|
10
|
+
gem install rancher-metadata
|
11
|
+
```
|
12
|
+
|
13
|
+
## Usage
|
14
|
+
```
|
15
|
+
require 'rancher-metadata'
|
16
|
+
api = RancherMetadata::API.new({:api_url => "http://rancher-metadata/2015-07-25"})
|
17
|
+
|
18
|
+
puts("Container ID: #{api.get_container_id}")
|
19
|
+
puts("Container Service ID: #{api.get_container_service_id}")
|
20
|
+
puts("Container IP: #{api.get_container_ip}")
|
21
|
+
puts("Container Name: #{api.get_container_name}")
|
22
|
+
puts("Container Service Name: #{api.get_container_service_name}")
|
23
|
+
puts("Container Hostname: #{api.get_container_hostname}")
|
24
|
+
|
25
|
+
api.wait_service_containers() do |container|
|
26
|
+
puts("Container #{container} is up (IP: #{api.get_container_ip(container)}, Index: #{api.get_container_id})")
|
27
|
+
end
|
28
|
+
|
29
|
+
metadata = api.get_service_metadata()
|
30
|
+
puts(metadata.inspect)
|
31
|
+
```
|
32
|
+
|
33
|
+
## Contact
|
34
|
+
Matteo Cerutti - matteo.cerutti@hotmail.co.uk
|
@@ -0,0 +1,234 @@
|
|
1
|
+
#
|
2
|
+
# api.rb
|
3
|
+
#
|
4
|
+
# Author: Matteo Cerutti <matteo.cerutti@swisscom.com>
|
5
|
+
#
|
6
|
+
|
7
|
+
require 'net/http'
|
8
|
+
require 'json'
|
9
|
+
|
10
|
+
module RancherMetadata
|
11
|
+
class API
|
12
|
+
attr_reader :config
|
13
|
+
|
14
|
+
def initialize(config)
|
15
|
+
defaults = {
|
16
|
+
:api_url => ["http://rancher-metadata/2015-07-25"],
|
17
|
+
:max_attempts => 3
|
18
|
+
}
|
19
|
+
|
20
|
+
config[:api_url] = [ config[:api_url] ] unless config[:api_url].is_a?(Array) if config.has_key?(:api_url)
|
21
|
+
|
22
|
+
@config = defaults.merge(config)
|
23
|
+
end
|
24
|
+
|
25
|
+
def is_error?(data)
|
26
|
+
( data.is_a?(Hash) and data.has_key?('code') and data['code'] == 404 ) ? true : false
|
27
|
+
end
|
28
|
+
|
29
|
+
def api_get(query)
|
30
|
+
success = true
|
31
|
+
attempts = 1
|
32
|
+
data = nil
|
33
|
+
|
34
|
+
self.config[:max_attempts].times.each do |i|
|
35
|
+
self.config[:api_url].each do |api_url|
|
36
|
+
begin
|
37
|
+
uri = URI.parse("#{api_url}#{query}")
|
38
|
+
req = Net::HTTP::Get.new(uri.path, {'Content-Type' => 'application/json', 'Accept' => 'application/json'})
|
39
|
+
resp = Net::HTTP.new(uri.host, uri.port).request(req)
|
40
|
+
begin
|
41
|
+
data = JSON.parse(resp.body)
|
42
|
+
rescue JSON::ParserError
|
43
|
+
data = resp.body
|
44
|
+
end
|
45
|
+
|
46
|
+
success = true
|
47
|
+
|
48
|
+
break
|
49
|
+
rescue
|
50
|
+
raise("Failed to query Rancher Metadata API on #{api_url} - Caught exception (#{$!})")
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
i += 1
|
55
|
+
end
|
56
|
+
|
57
|
+
raise("Failed to query Rancher Metadata API (#{attempts} out of #{self.config[:max_attempts]} failed)") unless success
|
58
|
+
|
59
|
+
is_error?(data) ? nil : data
|
60
|
+
end
|
61
|
+
|
62
|
+
def get_services
|
63
|
+
self.api_get("/services")
|
64
|
+
end
|
65
|
+
|
66
|
+
def get_service(service = {})
|
67
|
+
if service.empty?
|
68
|
+
return self.api_get("/self/service")
|
69
|
+
else
|
70
|
+
raise("Missing rancher service name") unless service.has_key?(:service_name)
|
71
|
+
|
72
|
+
unless service.has_key?(:stack_name)
|
73
|
+
return self.api_get("/services/#{service[:service_name]}")
|
74
|
+
else
|
75
|
+
self.get_services().each do |s|
|
76
|
+
return s if s['stack_name'] == service[:stack_name] and s['name'] == service[:service_name]
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
def get_service_field(field, service = {})
|
83
|
+
if service.empty?
|
84
|
+
return self.api_get("/self/service/#{field}")
|
85
|
+
else
|
86
|
+
raise("Missing rancher service name") unless service.has_key?(:service_name)
|
87
|
+
|
88
|
+
unless service.has_key?(:stack_name)
|
89
|
+
return self.api_get("/services/#{service[:service_name]}/#{field}")
|
90
|
+
else
|
91
|
+
s = self.get_service(service)
|
92
|
+
if s.has_key?(field)
|
93
|
+
return s[field]
|
94
|
+
else
|
95
|
+
return nil
|
96
|
+
end
|
97
|
+
end
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
101
|
+
def get_service_scale_size(service = {})
|
102
|
+
self.get_service_field("scale", service).to_i
|
103
|
+
end
|
104
|
+
|
105
|
+
def get_service_containers(service = {})
|
106
|
+
self.get_service_field("containers", service)
|
107
|
+
end
|
108
|
+
|
109
|
+
def get_service_metadata(service = {})
|
110
|
+
self.get_service_field("metadata", service)
|
111
|
+
end
|
112
|
+
|
113
|
+
def get_service_links(service = {})
|
114
|
+
self.get_service_field("links", service)
|
115
|
+
end
|
116
|
+
|
117
|
+
def wait_service_containers(service = {})
|
118
|
+
scale = self.get_service_scale_size(service)
|
119
|
+
|
120
|
+
containers = []
|
121
|
+
|
122
|
+
loop do
|
123
|
+
c = self.get_service_containers(service)
|
124
|
+
|
125
|
+
(c - containers).each do |n|
|
126
|
+
yield(n)
|
127
|
+
end
|
128
|
+
|
129
|
+
containers = c
|
130
|
+
|
131
|
+
break if containers.size >= scale
|
132
|
+
|
133
|
+
sleep(0.5)
|
134
|
+
end
|
135
|
+
end
|
136
|
+
|
137
|
+
def get_stacks
|
138
|
+
self.api_get("/stacks")
|
139
|
+
end
|
140
|
+
|
141
|
+
def get_stack(stack_name = nil)
|
142
|
+
stack_name ? self.api_get("/stacks/#{stack_name}") : self.api_get("/self/stack")
|
143
|
+
end
|
144
|
+
|
145
|
+
def get_containers
|
146
|
+
self.api_get("/containers")
|
147
|
+
end
|
148
|
+
|
149
|
+
def get_container(container_name = nil)
|
150
|
+
container_name ? self.api_get("/containers/#{container_name}") : self.api_get("/self/container")
|
151
|
+
end
|
152
|
+
|
153
|
+
def get_container_field(field, container_name = nil)
|
154
|
+
container_name ? self.api_get("/containers/#{container_name}/#{field}") : self.api_get("/self/container/#{field}")
|
155
|
+
end
|
156
|
+
|
157
|
+
def get_container_id(container_name = nil)
|
158
|
+
i = self.get_container_field("create_index", container_name)
|
159
|
+
i ? i.to_i : nil
|
160
|
+
end
|
161
|
+
|
162
|
+
def get_container_ip(container_name = nil)
|
163
|
+
if container_name
|
164
|
+
if self.is_network_managed?
|
165
|
+
self.api_get("/self/container/primary_ip")
|
166
|
+
else
|
167
|
+
self.get_host_ip
|
168
|
+
end
|
169
|
+
else
|
170
|
+
self.api_get("/containers/#{container_name}/primary_ip")
|
171
|
+
end
|
172
|
+
end
|
173
|
+
|
174
|
+
def get_container_name(container_name = nil)
|
175
|
+
self.get_container_field("name", container_name)
|
176
|
+
end
|
177
|
+
|
178
|
+
def get_container_service_name(container_name = nil)
|
179
|
+
self.get_container_field("service_name", container_name)
|
180
|
+
end
|
181
|
+
|
182
|
+
def get_container_stack_name(container_name = nil)
|
183
|
+
self.get_container_field("stack_name", container_name)
|
184
|
+
end
|
185
|
+
|
186
|
+
def get_container_hostname(container_name = nil)
|
187
|
+
self.get_container_field("hostname", container_name)
|
188
|
+
end
|
189
|
+
|
190
|
+
def get_container_service_id(container_name = nil)
|
191
|
+
index = nil
|
192
|
+
|
193
|
+
service_suffix = self.get_container_field("service_suffix", container_name)
|
194
|
+
|
195
|
+
if service_suffix.nil?
|
196
|
+
if (i = self.get_container_name(container_name)[/(\d+)$/, 1])
|
197
|
+
index = i.to_i
|
198
|
+
end
|
199
|
+
else
|
200
|
+
index = service_suffix.to_i
|
201
|
+
end
|
202
|
+
|
203
|
+
index
|
204
|
+
end
|
205
|
+
|
206
|
+
def get_container_host_uuid(container_name = nil)
|
207
|
+
self.get_container_field("host_uuid", container_name)
|
208
|
+
end
|
209
|
+
|
210
|
+
def is_network_managed?
|
211
|
+
self.get_container_id ? true : false
|
212
|
+
end
|
213
|
+
|
214
|
+
def get_host(host_name = nil)
|
215
|
+
host_name ? self.api_get("/hosts/#{host_name}") : self.api_get("/self/host")
|
216
|
+
end
|
217
|
+
|
218
|
+
def get_host_field(field, host_name = nil)
|
219
|
+
host_name ? self.api_get("/hosts/#{host_name}/#{field}") : self.api_get("/self/host/#{field}")
|
220
|
+
end
|
221
|
+
|
222
|
+
def get_host_ip(host_name = nil)
|
223
|
+
self.get_host_field("agent_ip", host_name)
|
224
|
+
end
|
225
|
+
|
226
|
+
def get_host_uuid(host_name = nil)
|
227
|
+
self.get_host_field("uuid", host_name)
|
228
|
+
end
|
229
|
+
|
230
|
+
def get_host_name(host_name = nil)
|
231
|
+
self.get_host_field("name", host_name)
|
232
|
+
end
|
233
|
+
end
|
234
|
+
end
|
metadata
ADDED
@@ -0,0 +1,61 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: rancher-metadata
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Matteo Cerutti
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2016-01-25 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: json
|
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
|
+
description: Ruby library for Rancher Metadata API
|
28
|
+
email: "<matteo.cerutti@hotmail.co.uk>"
|
29
|
+
executables: []
|
30
|
+
extensions: []
|
31
|
+
extra_rdoc_files: []
|
32
|
+
files:
|
33
|
+
- LICENSE
|
34
|
+
- README.md
|
35
|
+
- lib/rancher-metadata/api.rb
|
36
|
+
- lib/rancher-metadata/version.rb
|
37
|
+
homepage: https://github.com/m4ce/ruby-rancher_metadata
|
38
|
+
licenses:
|
39
|
+
- Apache 2.0
|
40
|
+
metadata: {}
|
41
|
+
post_install_message:
|
42
|
+
rdoc_options: []
|
43
|
+
require_paths:
|
44
|
+
- lib
|
45
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
46
|
+
requirements:
|
47
|
+
- - ">="
|
48
|
+
- !ruby/object:Gem::Version
|
49
|
+
version: '0'
|
50
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
requirements: []
|
56
|
+
rubyforge_project:
|
57
|
+
rubygems_version: 2.4.5.1
|
58
|
+
signing_key:
|
59
|
+
specification_version: 4
|
60
|
+
summary: Ruby library that allows to interact with the Rancher Metadata REST API
|
61
|
+
test_files: []
|