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 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: []