onering-client 0.0.4

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,35 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ #onering
4
+ # list [options] field [key:value ..]
5
+ # search [options] [key:value .. ]
6
+ # provision [options] [key:value .. ] [pxe profile | ]
7
+
8
+
9
+ require 'rubygems'
10
+ require 'json'
11
+ require 'subcommander'
12
+ require 'onering'
13
+
14
+ Onering::API::Device.connect
15
+
16
+ action = ARGV.shift
17
+
18
+ case (action && action.to_sym)
19
+ when :ls, :list
20
+ Onering::API::Device.list(ARGV.shift, (ARGV.empty? ? {} : {
21
+ :filter => ARGV
22
+ }))
23
+ when :s, :search
24
+ Onering::API::Device.find(ARGV)
25
+
26
+ when :save
27
+ data = (STDIN.tty? && ARGV.length > 1 ? File.read(File.expand_path(ARGV.last)) : STDIN.read)
28
+
29
+ if data
30
+ data = JSON.load(data)
31
+ Onering::API::Device.save(ARGV.first, data)
32
+ end
33
+ else
34
+ STDERR.puts "Usage: onering [subcommand] [options]"
35
+ end
@@ -0,0 +1,3 @@
1
+ $: << File.expand_path(File.dirname(__FILE__))
2
+ require 'onering/api'
3
+ require 'onering/plugins/devices'
@@ -0,0 +1,90 @@
1
+ require 'net/http'
2
+ require 'uri'
3
+ require 'json'
4
+ require 'yaml'
5
+
6
+ module Onering
7
+ module API
8
+ module Errors
9
+ class NotConnected < Exception; end
10
+ class ClientError < Exception; end
11
+ end
12
+
13
+ class Base
14
+ class<<self
15
+ DEFAULT_URI="http://onering/api"
16
+ DEFAULT_OPTIONS={}
17
+
18
+ def connect(host=nil)
19
+ if host.is_a?(URI)
20
+ @_uri = host
21
+ elsif host.is_a?(String)
22
+ @_uri = URI.parse(host)
23
+ else
24
+ @_uri = URI.parse(DEFAULT_URI)
25
+ end
26
+
27
+
28
+ if @_uri
29
+ @_http = Net::HTTP.new(@_uri.host, @_uri.port)
30
+ end
31
+ end
32
+
33
+ def request(endpoint, options={})
34
+ options = DEFAULT_OPTIONS.merge(options)
35
+ request = nil
36
+
37
+ qs = options[:fields].collect{|k,v| "#{k}=#{v}" }.join("&") if options[:fields]
38
+ qs = nil if qs and qs.empty?
39
+ endpoint = [endpoint, qs].compact.join('?')
40
+ uri = URI.parse("#{@_uri.to_s}/#{endpoint}")
41
+
42
+ raise Errors::NotConnected unless @_http
43
+
44
+ case options[:method]
45
+ when :post
46
+ request = Net::HTTP::Post.new(uri.request_uri)
47
+ request.body = JSON.dump(options[:data]) if options[:data]
48
+
49
+ when :delete
50
+ request = Net::HTTP::Delete.new(uri.request_uri)
51
+
52
+ else
53
+ request = Net::HTTP::Get.new(uri.request_uri)
54
+
55
+ end
56
+
57
+ response = @_http.request(request)
58
+
59
+ if response.code.to_i >= 400
60
+ rv = JSON.load(response.body)
61
+
62
+ if rv['errors']
63
+ msg = "#{rv['errors']['type']}: #{rv['errors']['message']}"
64
+ end
65
+
66
+ raise ClientError.new(msg)
67
+ else
68
+ rv = JSON.load(response.body)
69
+ end
70
+
71
+ rv
72
+ end
73
+
74
+ def make_filter(filter)
75
+ filter = filter.collect{|k,v| "#{k}/#{v}" } if filter.is_a?(Hash)
76
+ filter = filter.collect{|i| i.sub(':','/') }.join("/") if filter.is_a?(Array)
77
+ filter
78
+ end
79
+
80
+ def echo(obj)
81
+ if obj.is_a?(Array)
82
+ obj.each do |i|
83
+ puts i
84
+ end
85
+ end
86
+ end
87
+ end
88
+ end
89
+ end
90
+ end
@@ -0,0 +1,43 @@
1
+
2
+ module Onering
3
+ module API
4
+ class Devices < Base
5
+ class<<self
6
+ def connect(host=nil)
7
+ super(host)
8
+ end
9
+
10
+ def list(field, options={
11
+ :unique => true,
12
+ :sort => true,
13
+ :filter => nil
14
+ })
15
+ qs = {
16
+ :q => make_filter(options[:filter])
17
+ } if options[:filter]
18
+
19
+ rv = request("devices/list/#{field}", {
20
+ :fields => qs
21
+ })
22
+
23
+ rv = rv.uniq if options[:unique]
24
+ rv = rv.sort if options[:sort]
25
+
26
+ rv
27
+ end
28
+
29
+ def find(filter, options={})
30
+ rv = request("devices/find/#{make_filter(filter)}")
31
+ rv
32
+ end
33
+
34
+ def save(id, data)
35
+ request("devices/#{id}", {
36
+ :method => :post,
37
+ :data => data
38
+ })
39
+ end
40
+ end
41
+ end
42
+ end
43
+ end
metadata ADDED
@@ -0,0 +1,69 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: onering-client
3
+ version: !ruby/object:Gem::Version
4
+ hash: 23
5
+ prerelease:
6
+ segments:
7
+ - 0
8
+ - 0
9
+ - 4
10
+ version: 0.0.4
11
+ platform: ruby
12
+ authors:
13
+ - Gary Hetzel
14
+ autorequire:
15
+ bindir: bin
16
+ cert_chain: []
17
+
18
+ date: 2013-01-29 00:00:00 Z
19
+ dependencies: []
20
+
21
+ description: A Ruby wrapper for Onering
22
+ email: ghetzel@outbrain.com
23
+ executables: []
24
+
25
+ extensions: []
26
+
27
+ extra_rdoc_files: []
28
+
29
+ files:
30
+ - lib/onering.rb
31
+ - lib/onering/api.rb
32
+ - lib/onering/plugins/devices.rb
33
+ - bin/onering
34
+ homepage: https://github.com/outbrain/onering-ruby
35
+ licenses: []
36
+
37
+ post_install_message:
38
+ rdoc_options: []
39
+
40
+ require_paths:
41
+ - lib
42
+ required_ruby_version: !ruby/object:Gem::Requirement
43
+ none: false
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ hash: 3
48
+ segments:
49
+ - 0
50
+ version: "0"
51
+ required_rubygems_version: !ruby/object:Gem::Requirement
52
+ none: false
53
+ requirements:
54
+ - - ">="
55
+ - !ruby/object:Gem::Version
56
+ hash: 3
57
+ segments:
58
+ - 0
59
+ version: "0"
60
+ requirements: []
61
+
62
+ rubyforge_project:
63
+ rubygems_version: 1.8.15
64
+ signing_key:
65
+ specification_version: 3
66
+ summary: Onering client API
67
+ test_files: []
68
+
69
+ has_rdoc: