rancher-metadata 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: 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
@@ -0,0 +1,13 @@
1
+ #
2
+ # version.rb
3
+ #
4
+ # Author: Matteo Cerutti <matteo.cerutti@swisscom.com>
5
+ #
6
+
7
+ module RancherMetadata
8
+ VERSION = "0.0.1"
9
+
10
+ def self.version
11
+ VERSION
12
+ end
13
+ 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: []