onering-client 0.0.4

Sign up to get free protection for your applications and to get access to all the features.
@@ -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: