smartdc 0.4.0 → 1.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (100) hide show
  1. data/.document +0 -1
  2. data/.travis.yml +5 -0
  3. data/Gemfile +7 -10
  4. data/README.md +42 -69
  5. data/Rakefile +47 -0
  6. data/VERSION +1 -1
  7. data/bin/sdc +327 -0
  8. data/lib/cli_helper.rb +131 -8
  9. data/lib/configure.rb +73 -0
  10. data/lib/smartdc.rb +16 -1
  11. data/lib/smartdc/api/analytics.rb +29 -7
  12. data/lib/smartdc/api/analytics/heatmap.rb +20 -0
  13. data/lib/smartdc/api/datacenters.rb +6 -7
  14. data/lib/smartdc/api/datasets.rb +6 -7
  15. data/lib/smartdc/api/keys.rb +10 -11
  16. data/lib/smartdc/api/machine/metadata.rb +9 -15
  17. data/lib/smartdc/api/machine/snapshots.rb +16 -16
  18. data/lib/smartdc/api/machine/tags.rb +11 -12
  19. data/lib/smartdc/api/machines.rb +23 -23
  20. data/lib/smartdc/api/packages.rb +7 -8
  21. data/lib/smartdc/client.rb +14 -18
  22. data/lib/smartdc/request.rb +41 -51
  23. data/lib/smartdc/response.rb +24 -0
  24. data/lib/smartdc/response/raise_error.rb +1 -1
  25. data/smartdc.gemspec +51 -90
  26. data/spec/fixtures/analytics.json +26 -0
  27. data/spec/fixtures/datacenter.json +4 -0
  28. data/spec/fixtures/datacenters.json +3 -0
  29. data/spec/fixtures/datasets.json +38 -0
  30. data/spec/fixtures/keys.json +14 -0
  31. data/spec/fixtures/machines.json +36 -0
  32. data/spec/fixtures/packages.json +18 -0
  33. data/spec/fixtures/snapshots.json +8 -0
  34. data/spec/fixtures/tag.json +3 -0
  35. data/spec/spec_helper.rb +3 -12
  36. data/spec/unit/smartdc/api/analytics_spec.rb +53 -0
  37. data/spec/unit/smartdc/api/datacenters_spec.rb +31 -0
  38. data/spec/unit/smartdc/api/datasets_spec.rb +31 -0
  39. data/spec/unit/smartdc/api/keys_spec.rb +53 -0
  40. data/spec/unit/smartdc/api/machine/metadata_spec.rb +42 -0
  41. data/spec/unit/smartdc/api/machine/snapshots_spec.rb +132 -0
  42. data/spec/unit/smartdc/api/machine/tags_spec.rb +53 -0
  43. data/spec/unit/smartdc/api/machines_spec.rb +53 -0
  44. data/spec/unit/smartdc/api/packages_spec.rb +31 -0
  45. data/spec/{smartdc → unit/smartdc}/client_spec.rb +0 -6
  46. data/spec/{smartdc_spec.rb → unit/smartdc_spec.rb} +1 -1
  47. metadata +72 -140
  48. data/LICENSE.md +0 -20
  49. data/bin/sdc-addmachinemetadata +0 -29
  50. data/bin/sdc-addmachinetag +0 -29
  51. data/bin/sdc-createinstrumentation +0 -27
  52. data/bin/sdc-createkey +0 -32
  53. data/bin/sdc-createmachine +0 -39
  54. data/bin/sdc-createmachinesnapshot +0 -27
  55. data/bin/sdc-deleteinstrumentation +0 -12
  56. data/bin/sdc-deletekey +0 -12
  57. data/bin/sdc-deletemachine +0 -12
  58. data/bin/sdc-deletemachinemetadata +0 -29
  59. data/bin/sdc-deletemachinesnapshot +0 -29
  60. data/bin/sdc-deletemachinetag +0 -29
  61. data/bin/sdc-describeanalytics +0 -10
  62. data/bin/sdc-getdatacenter +0 -10
  63. data/bin/sdc-getdataset +0 -10
  64. data/bin/sdc-getinstrumentation +0 -31
  65. data/bin/sdc-getkey +0 -10
  66. data/bin/sdc-getmachine +0 -12
  67. data/bin/sdc-getmachinemetadata +0 -12
  68. data/bin/sdc-getmachinesnapshot +0 -27
  69. data/bin/sdc-getmachinetag +0 -27
  70. data/bin/sdc-getpackage +0 -10
  71. data/bin/sdc-listdatacenters +0 -10
  72. data/bin/sdc-listdatasets +0 -10
  73. data/bin/sdc-listinstrumentations +0 -10
  74. data/bin/sdc-listkeys +0 -10
  75. data/bin/sdc-listmachines +0 -10
  76. data/bin/sdc-listmachinesnapshots +0 -10
  77. data/bin/sdc-listmachinetags +0 -10
  78. data/bin/sdc-listpackages +0 -10
  79. data/bin/sdc-rebootmachine +0 -12
  80. data/bin/sdc-resizemachine +0 -34
  81. data/bin/sdc-setup +0 -67
  82. data/bin/sdc-startmachine +0 -12
  83. data/bin/sdc-startmachinefromsnapshot +0 -29
  84. data/bin/sdc-stopmachine +0 -12
  85. data/config/fixtures/instrumentation.json +0 -4
  86. data/config/fixtures/key.json +0 -4
  87. data/config/fixtures/tag.json +0 -3
  88. data/lib/smartdc/api/analytics/instrumentations.rb +0 -44
  89. data/lib/smartdc/response/mashify.rb +0 -29
  90. data/lib/smartdc/response/parse_json.rb +0 -26
  91. data/spec/smartdc/api/analytics_spec.rb +0 -32
  92. data/spec/smartdc/api/datacenters_spec.rb +0 -16
  93. data/spec/smartdc/api/datasets_spec.rb +0 -16
  94. data/spec/smartdc/api/keys_spec.rb +0 -32
  95. data/spec/smartdc/api/machine/metadata_spec.rb +0 -59
  96. data/spec/smartdc/api/machine/snapshots_spec.rb +0 -70
  97. data/spec/smartdc/api/machine/tags_spec.rb +0 -65
  98. data/spec/smartdc/api/machines_spec.rb +0 -92
  99. data/spec/smartdc/api/packages_spec.rb +0 -16
  100. data/spec/smartdc/request_spec.rb +0 -12
data/lib/cli_helper.rb CHANGED
@@ -1,12 +1,135 @@
1
- require 'pp'
2
- require "optparse"
1
+ require 'thor'
2
+ require 'thor/group'
3
+ require 'terminal-table'
3
4
  require 'smartdc'
5
+ require 'configure'
6
+ include Configure
4
7
 
5
- def fixture(name, path='config/fixtures')
6
- json = File.read(File.join(File.dirname(__FILE__), '..', path, "/#{name}.json"))
7
- MultiJson.decode(json)
8
+ def config(options={})
9
+ cfg = Configure.read
10
+
11
+ if !options.empty?
12
+ options.each do |key, value|
13
+ cfg[key.to_sym] = value
14
+ end
15
+ end
16
+
17
+ cfg
18
+ end
19
+
20
+ def sdc(options)
21
+ Smartdc.new(options)
22
+ end
23
+
24
+ def opt(argument, options={})
25
+ opts = {}
26
+ opts = opts.merge(options)
27
+ opts['raw'] = true if argument.include?('--raw') or argument.include?('-r')
28
+ opts['debug'] = true if argument.include?('--debug') or argument.include?('-d')
29
+ opts
30
+ end
31
+
32
+ def output(response, options={})
33
+ if options['raw']
34
+ puts response.body
35
+ else
36
+ if response.status < 300
37
+ if options[:table]
38
+ case options[:table]
39
+ when :h
40
+ puts horizontal(response.content, options)
41
+ when :v
42
+ puts vertical(response.content, options)
43
+ end
44
+ else
45
+ if options[:message]
46
+ puts options[:message]
47
+ else
48
+ puts response.content[options[:only].to_s]
49
+ end
50
+ end
51
+ else
52
+ puts vertical(response.content)
53
+ end
54
+ end
55
+ end
56
+
57
+ def horizontal(content, options={})
58
+ if content.empty?
59
+ nil
60
+ else
61
+ options[:include] ||= []
62
+ options[:exclude] ||= []
63
+ rows = []
64
+ headings = nil
65
+
66
+ content.each do |row|
67
+ options[:exclude].each do |col|
68
+ row.delete(col.to_s)
69
+ end
70
+
71
+ if !options[:include].empty?
72
+ cols = {}
73
+ options[:include].each do |col|
74
+ cols[col.to_s] = row[col.to_s] if row.key?(col.to_s)
75
+ end
76
+ row = cols
77
+ end
78
+
79
+ rows << row.values
80
+ headings = row.keys if headings.nil?
81
+ end
82
+
83
+ Terminal::Table.new :headings => headings, :rows => rows
84
+ end
85
+ end
86
+
87
+ def vertical(content, options={})
88
+ if content.empty?
89
+ nil
90
+ else
91
+ options[:exclude] ||= []
92
+
93
+ options[:exclude].each do |col|
94
+ content.delete(col.to_s)
95
+ end
96
+
97
+ rows = []
98
+ content.to_a.each do |row|
99
+ rows << row
100
+ end
101
+
102
+ Terminal::Table.new :headings => ['key','value'], :rows => rows
103
+ end
8
104
  end
9
105
 
10
- def client
11
- @client ||= Smartdc.new(fixture('config', 'config'))
12
- end
106
+ def describe(name, content, options)
107
+ if options['all'] or options['output'] == name
108
+ options[:exclude] ||= []
109
+ rows = []
110
+
111
+ content[name].each do |row|
112
+ cols = []
113
+ if options[:cols] == :all
114
+ options[:exclude].each do |col|
115
+ row.delete(col.to_s)
116
+ end
117
+ cols = row.values
118
+ else
119
+ options[:cols].each do |col|
120
+ if col == 'key'
121
+ cols << row[0]
122
+ else
123
+ cols << row[1][col]
124
+ end
125
+ end
126
+ end
127
+ rows << cols
128
+ end
129
+
130
+ title = options['all'] ? name : nil
131
+ headings = options[:cols] == :all ? content[name][0].keys : options[:cols]
132
+ puts Terminal::Table.new :title => title, :headings => headings, :rows => rows
133
+ puts if options['all']
134
+ end
135
+ end
data/lib/configure.rb ADDED
@@ -0,0 +1,73 @@
1
+ module Configure
2
+ def self.read()
3
+ begin
4
+ config = {}
5
+ File.open(path, 'r') do |file|
6
+ file.each do |row|
7
+ row.chomp!
8
+ cols = row.split(/\s+=\s+/)
9
+ config[cols[0].to_sym] = cols[1]
10
+ end
11
+ end
12
+ rescue
13
+ config = {}
14
+ ensure
15
+ return config
16
+ end
17
+ end
18
+
19
+ def self.write(config)
20
+ File.open(path, 'w') do |file|
21
+ config.each do |key, value|
22
+ file.puts "#{key} = #{value}"
23
+ end
24
+ end
25
+ end
26
+
27
+ def self.make
28
+ config = self.read
29
+
30
+ puts
31
+ config[:hostname] ||= 'api.example.com'
32
+ print "Hostname (#{config[:hostname]}): "
33
+ stdin = STDIN.gets.chomp.to_s
34
+ config[:hostname] = stdin if !stdin.empty?
35
+
36
+ config[:username] ||= ENV['USER']
37
+ print "Username (#{config[:username]}): "
38
+ stdin = STDIN.gets.chomp.to_s
39
+ config[:username] = stdin if !stdin.empty?
40
+
41
+ config[:password] ||= ''
42
+ print "Password: "
43
+ stdin = STDIN.gets.chomp.to_s
44
+ config[:password] = stdin if !stdin.empty?
45
+
46
+ config[:version] ||= '~6.5 '
47
+ print "Version (#{config[:version]}): "
48
+ stdin = STDIN.gets.chomp.to_s
49
+ config[:version] = stdin if !stdin.empty?
50
+
51
+ puts
52
+ puts "New settings:"
53
+ puts "Hostname: #{config[:hostname]}"
54
+ puts "Username: #{config[:username]}"
55
+ puts "Password:"
56
+ puts "Version: #{config[:version]}"
57
+ puts
58
+
59
+ self.write config
60
+ end
61
+
62
+ private
63
+
64
+ def path
65
+ config = '.sdccfg'
66
+ file = File.join(File.dirname(__FILE__), '..', config)
67
+ if File.exist?(file)
68
+ file
69
+ else
70
+ File.join(ENV["HOME"], config)
71
+ end
72
+ end
73
+ end
data/lib/smartdc.rb CHANGED
@@ -1,9 +1,24 @@
1
+ require 'pp'
1
2
  require 'smartdc/client'
2
3
  require 'smartdc/request'
4
+ require 'smartdc/response'
3
5
  require 'smartdc/error'
4
6
 
5
7
  module Smartdc
6
8
  def self.new(options={})
7
9
  Smartdc::Client.new(options)
8
10
  end
9
- end
11
+
12
+ def self.config=(options={})
13
+ @cli = Smartdc::Client.new(options)
14
+ @config = options
15
+ end
16
+
17
+ def self.config
18
+ @config
19
+ end
20
+
21
+ def self.cli
22
+ @cli
23
+ end
24
+ end
@@ -1,21 +1,43 @@
1
- require 'smartdc/api/analytics/instrumentations'
1
+ require 'smartdc/api/analytics/heatmap'
2
2
 
3
3
  module Smartdc
4
4
  module Api
5
5
  class Analytics
6
- attr_reader :request, :id
6
+ attr_reader :request
7
7
 
8
- def initialize(request, id=nil)
9
- @request = request
10
- @id = id
8
+ def initialize(options)
9
+ @request = Smartdc::Request.new(options)
11
10
  end
12
11
 
13
12
  def describe
14
13
  request.get('my/analytics')
15
14
  end
16
15
 
17
- def instrumentations(_id=nil)
18
- Smartdc::Api::Analytics::Instrumentations.new(request, _id)
16
+ def create(raw={})
17
+ request.post('my/analytics/instrumentations/', raw)
18
+ end
19
+
20
+ def read(id)
21
+ raise ArgumentError unless id
22
+ request.get('my/analytics/instrumentations/' + id.to_s)
23
+ end
24
+
25
+ def all(query={})
26
+ request.get('my/analytics/instrumentations', query)
27
+ end
28
+
29
+ def destroy(id)
30
+ request.del('my/analytics/instrumentations/' + id.to_s)
31
+ end
32
+
33
+ def value(id)
34
+ raise ArgumentError unless id
35
+ request.get('my/analytics/instrumentations/' + id.to_s + '/value/raw')
36
+ end
37
+
38
+ def heatmap(id)
39
+ raise ArgumentError unless id
40
+ Smartdc::Api::Analytics::Heatmap.new(request, id)
19
41
  end
20
42
  end
21
43
  end
@@ -0,0 +1,20 @@
1
+ module Smartdc::Api
2
+ class Analytics
3
+ class Heatmap
4
+ attr_reader :request, :id
5
+
6
+ def initialize(request, id)
7
+ @request = request
8
+ @id = id
9
+ end
10
+
11
+ def image(query={})
12
+ request.get('my/analytics/instrumentations/' + @id.to_s + '/value/heatmap/image', query)
13
+ end
14
+
15
+ def details(query={})
16
+ request.get('my/analytics/instrumentations/' + @id.to_s + '/value/heatmap/details', query)
17
+ end
18
+ end
19
+ end
20
+ end
@@ -1,20 +1,19 @@
1
1
  module Smartdc
2
2
  module Api
3
3
  class Datacenters
4
- attr_reader :request, :id
4
+ attr_reader :request
5
5
 
6
- def initialize(request, id=nil)
7
- @request = request
8
- @id = id
6
+ def initialize(options)
7
+ @request = Smartdc::Request.new(options)
9
8
  end
10
9
 
11
- def read
10
+ def read(id)
12
11
  raise ArgumentError unless id
13
12
  request.get('my/datacenters/' + id.to_s)
14
13
  end
15
14
 
16
- def find(params={})
17
- request.get('my/datacenters', params)
15
+ def all(query={})
16
+ request.get('my/datacenters', query)
18
17
  end
19
18
  end
20
19
  end
@@ -1,20 +1,19 @@
1
1
  module Smartdc
2
2
  module Api
3
3
  class Datasets
4
- attr_reader :request, :id
4
+ attr_reader :request
5
5
 
6
- def initialize(request, id=nil)
7
- @request = request
8
- @id = id
6
+ def initialize(options)
7
+ @request = Smartdc::Request.new(options)
9
8
  end
10
9
 
11
- def read
10
+ def read(id)
12
11
  raise ArgumentError unless id
13
12
  request.get('my/datasets/' + id.to_s)
14
13
  end
15
14
 
16
- def find(params={})
17
- request.get('my/datasets', params)
15
+ def all(query={})
16
+ request.get('my/datasets', query)
18
17
  end
19
18
  end
20
19
  end
@@ -1,29 +1,28 @@
1
1
  module Smartdc
2
2
  module Api
3
3
  class Keys
4
- attr_reader :request, :id
4
+ attr_reader :request
5
5
 
6
- def initialize(request, id=nil)
7
- @request = request
8
- @id = id
6
+ def initialize(options)
7
+ @request = Smartdc::Request.new(options)
9
8
  end
10
9
 
11
- def create(params={})
12
- request.post('my/keys/', params)
10
+ def create(raw={})
11
+ request.post('my/keys/', raw)
13
12
  end
14
13
 
15
- def read
14
+ def read(id)
16
15
  raise ArgumentError unless id
17
16
  request.get('my/keys/' + id.to_s)
18
17
  end
19
18
 
20
- def find(params={})
21
- request.get('my/keys', params)
19
+ def all(query={})
20
+ request.get('my/keys', query)
22
21
  end
23
22
 
24
- def delete
23
+ def destroy(id)
25
24
  raise ArgumentError unless id
26
- request.delete('my/keys/' + id.to_s)
25
+ request.del('my/keys/' + id.to_s)
27
26
  end
28
27
  end
29
28
  end
@@ -1,29 +1,23 @@
1
1
  module Smartdc::Api
2
2
  module Machine
3
3
  class Metadata
4
- attr_reader :request, :id
4
+ attr_reader :request
5
5
 
6
- def initialize(request, id1, id)
7
- @request = request
8
- @id1 = id1
6
+ def initialize(id, options)
9
7
  @id = id
8
+ @request = Smartdc::Request.new(options)
10
9
  end
11
10
 
12
- def create(params={})
13
- request.post('my/machines/' + @id1.to_s + '/metadata/', params)
14
- end
15
-
16
- def read
17
- raise ArgumentError unless id
18
- request.get('my/machines/' + @id1.to_s + '/metadata/' + id.to_s)
11
+ def create(raw={})
12
+ request.post('my/machines/' + @id.to_s + '/metadata/', raw)
19
13
  end
20
14
 
21
- def find(params={})
22
- request.get('my/machines/' + @id1.to_s + '/metadata', params)
15
+ def read(query={})
16
+ request.get('my/machines/' + @id.to_s + '/metadata', query)
23
17
  end
24
18
 
25
- def delete
26
- request.delete('my/machines/' + @id1.to_s + '/metadata/' + id.to_s)
19
+ def destroy(id=nil)
20
+ request.del('my/machines/' + @id.to_s + '/metadata/' + id.to_s)
27
21
  end
28
22
  end
29
23
  end