smartdc 1.0.1 → 1.1.1

Sign up to get free protection for your applications and to get access to all the features.
data/README.md CHANGED
@@ -1,16 +1,29 @@
1
1
  smartdc
2
2
  =======
3
3
 
4
+ ```
5
+ .
6
+ |
7
+ .-. .--. .-.| .-.
8
+ : + : `--.( | (
9
+ `-' `--' `-'`- `-'
10
+
11
+ ```
12
+
4
13
  smartdc is Joyent's [SmartDataCenter](http://www.joyent.com/software/smartdatacenter) client and SmartDataCenter Command Line Interface.
5
14
  [Joyent CloudAPI Documentation](http://apidocs.joyent.com/sdcapidoc/cloudapi/).
6
15
 
16
+
7
17
  ## Features
18
+
8
19
  * Response content is Hash.
9
20
  * Debug output Request and Response.
10
21
  * Output style is Table or JSON.
11
22
  * CLI is sub command style.
12
23
 
24
+
13
25
  ## Installation
26
+
14
27
  ```
15
28
  gem install smartdc
16
29
  ```
@@ -18,17 +31,38 @@ gem install smartdc
18
31
  ## Usage
19
32
 
20
33
  ### CLI
34
+ Invoke interactive configuration.
35
+
21
36
  ```
22
37
  $ sdc init
23
- $ sdc key add key_name ~/.ssh/id_rsa.pub
24
38
  $ sdc dataset ls
25
39
  $ sdc package ls
26
- $ sdc machine add -e DATASET_URN -p PACKAGE_NAME
40
+ $ sdc machine add NAME -e DATASET_URN -p PACKAGE_NAME
27
41
  $ sdc machine ls
42
+ ```
43
+
44
+
45
+ #### Output JSON
46
+ JSON is set to body of response.
47
+
48
+ ```
28
49
  $ sdc machine ls --raw
29
50
  ```
30
51
 
52
+
53
+ #### Machine use
54
+ Set to config the Machine uuid.
55
+
56
+ ```
57
+ $ sdc machine ls
58
+ $ sdc machine get UUID
59
+ $ sdc machine use UUID
60
+ $ sdc machine get
61
+ ```
62
+
63
+
31
64
  ### Program
65
+ Hash is set to content of response.
32
66
 
33
67
  ```
34
68
  require 'smartdc'
@@ -48,7 +82,9 @@ client.machines.all.content.each do |machine|
48
82
  end
49
83
  ```
50
84
 
85
+
51
86
  ## Tests
87
+
52
88
  ```
53
89
  $ rake spec
54
90
  ```
@@ -57,4 +93,5 @@ $ rake spec
57
93
 
58
94
 
59
95
  ## License
96
+
60
97
  * MIT
data/VERSION CHANGED
@@ -1 +1 @@
1
- 1.0.1
1
+ 1.1.1
data/bin/sdc CHANGED
@@ -8,6 +8,15 @@ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
8
8
  require 'cli_helper'
9
9
 
10
10
  module CLI
11
+ def self.ip(uuid)
12
+ res = sdc(config).machines.read(uuid)
13
+ if res.status == 200
14
+ res.content['primaryIp']
15
+ else
16
+ uuid
17
+ end
18
+ end
19
+
11
20
  class Base < Thor
12
21
  class_option :debug, type: :boolean, aliases: '-d', desc: 'Debug output'
13
22
  class_option :raw, type: :boolean, aliases: '-r', desc: 'Raw response body'
@@ -33,7 +42,7 @@ module CLI
33
42
 
34
43
  desc 'del [NAME]', 'Deletes an SSH key by name.'
35
44
  def del(name)
36
- output sdc(config(options)).keys.destroy(name), {message: "Key #{name} deleted"}.merge(options)
45
+ output sdc(config(options)).keys.destroy(name), {message: "Key #{name} deleted."}.merge(options)
37
46
  end
38
47
  end
39
48
 
@@ -89,8 +98,8 @@ module CLI
89
98
  output sdc(config(opt(ARGV, options))).machines.tags(uuid).read(key), {'raw' => true}.merge(opt(ARGV, options))
90
99
  end
91
100
 
92
- desc 'add [KEY] [VALUE]', 'Allows you to add additional tags, other than those set at provisioning time.'
93
- def add(key, value)
101
+ desc 'set [KEY] [VALUE]', 'Allows you to set the tags for a given machine.'
102
+ def set(key, value)
94
103
  uuid = options.uuid.nil? ? config[:use_machine] : options.uuid
95
104
  output sdc(config(opt(ARGV, options))).machines.tags(uuid).create({key => value}), {table: :v}.merge(opt(ARGV, options))
96
105
  end
@@ -101,28 +110,38 @@ module CLI
101
110
  uuid = options.uuid.nil? ? config[:use_machine] : options.uuid
102
111
  if key.nil?
103
112
  if options.all
104
- msg = "Machine #{uuid} all tags deleted"
113
+ msg = "Machine #{CLI.ip(uuid)} all tags deleted."
105
114
  output sdc(config(opt(ARGV, options))).machines.tags(uuid).destroy, {message: msg}.merge(opt(ARGV, options))
106
115
  end
107
116
  else
108
- msg = "Machine #{uuid} tag #{key} deleted"
117
+ msg = "Machine #{CLI.ip(uuid)} tag #{key} deleted."
109
118
  output sdc(config(opt(ARGV, options))).machines.tags(uuid).destroy(key), {message: msg}.merge(opt(ARGV, options))
110
119
  end
111
120
  end
112
121
  end
113
122
 
114
- class Metadata < CLI::Base
123
+ class Meta < CLI::Base
115
124
  class_option :uuid, type: :string, aliases: '-u', desc: 'Machine uuid'
116
125
 
117
126
  desc 'ls', 'Returns the complete set of metadata associated with this machine.'
127
+ method_option :credentials, type: :boolean, aliases: '-c', desc: 'Only output the machine credentials.'
118
128
  def ls
119
129
  uuid = options.uuid.nil? ? config[:use_machine] : options.uuid
120
- output sdc(config(opt(ARGV, options))).machines.metadata(uuid).read, {table: :v}.merge(opt(ARGV, options))
130
+ res = sdc(config(opt(ARGV, options))).machines.metadata(uuid).read(options)
131
+ res.content = res.content['credentials'].to_json if options.credentials
132
+ output res, {table: :v}.merge(opt(ARGV, options))
133
+ end
134
+
135
+ desc 'set [KEY] [VALUE]', 'Allows you to set the metadata for a given machine.'
136
+ def set(key, value)
137
+ uuid = options.uuid.nil? ? config[:use_machine] : options.uuid
138
+ output sdc(config(opt(ARGV, options))).machines.metadata(uuid).create({key => value}), {table: :v}.merge(opt(ARGV, options))
121
139
  end
122
140
 
123
- desc 'add [KEY] [VALUE]', 'Allows you to update the metadata for a given machine.'
124
- def add(key, value)
141
+ desc 'push [KEY] [FILE]', 'Push the metadata from file. (user-script or user-data)'
142
+ def push(key, file)
125
143
  uuid = options.uuid.nil? ? config[:use_machine] : options.uuid
144
+ value = File.read(file)
126
145
  output sdc(config(opt(ARGV, options))).machines.metadata(uuid).create({key => value}), {table: :v}.merge(opt(ARGV, options))
127
146
  end
128
147
 
@@ -132,11 +151,11 @@ module CLI
132
151
  uuid = options.uuid.nil? ? config[:use_machine] : options.uuid
133
152
  if key.nil?
134
153
  if options.all
135
- msg = "Machine #{uuid} all metadata deleted"
154
+ msg = "Machine #{CLI.ip(uuid)} all metadata deleted."
136
155
  output sdc(config(opt(ARGV, options))).machines.metadata(uuid).destroy, {message: msg}.merge(opt(ARGV, options))
137
156
  end
138
157
  else
139
- msg = "Machine #{uuid} metadata #{key} deleted"
158
+ msg = "Machine #{CLI.ip(uuid)} metadata #{key} deleted."
140
159
  output sdc(config(opt(ARGV, options))).machines.metadata(uuid).destroy(key), {message: msg}.merge(opt(ARGV, options))
141
160
  end
142
161
  end
@@ -166,14 +185,14 @@ module CLI
166
185
  desc 'del [NAME]', 'Deletes the specified snapshot of a machine.'
167
186
  def del(name)
168
187
  uuid = options.uuid.nil? ? config[:use_machine] : options.uuid
169
- msg = "Machine #{uuid} snapshots #{options[:name]} deleted"
188
+ msg = "Machine #{CLI.ip(uuid)} snapshots #{name} deleted."
170
189
  output sdc(config(opt(ARGV, options))).machines.snapshots(uuid).destroy(name), {message: msg}.merge(opt(ARGV, options))
171
190
  end
172
191
 
173
192
  desc 'start [NAME]', 'Starts a stopped machine from the referenced snapshot.'
174
193
  def start(name)
175
194
  uuid = options.uuid.nil? ? config[:use_machine] : options.uuid
176
- msg = "Machine #{uuid} snapshots #{options[:key]} started"
195
+ msg = "Machine #{CLI.ip(uuid)} snapshots #{name} started."
177
196
  output sdc(config(opt(ARGV, options))).machines.snapshots(uuid).start(name), {message: msg}.merge(opt(ARGV, options))
178
197
  end
179
198
  end
@@ -183,7 +202,7 @@ module CLI
183
202
  method_option :type, type: :string, aliases: '-t', desc: 'virtualmachine or smartmachine'
184
203
  method_option :state, type: :string, aliases: '-s', desc: 'running or stopped'
185
204
  def ls
186
- include = [:id, :name, :dataset, :state]
205
+ include = [:id, :dataset, :primaryIp, :state]
187
206
  output sdc(config(options)).machines.all(options), {table: :h, include: include}.merge(options)
188
207
  end
189
208
 
@@ -203,32 +222,46 @@ module CLI
203
222
  desc 'del [UUID]', 'Allows you to completely destroy a machine.'
204
223
  def del(uuid=nil)
205
224
  uuid ||= config[:use_machine]
206
- output sdc(config(options)).machines.destroy(uuid), {message: "Machine #{uuid} deleted"}.merge(options)
225
+ output sdc(config(options)).machines.destroy(uuid), {message: "Machine #{CLI.ip(uuid)} deleted."}.merge(options)
207
226
  end
208
227
 
209
228
  desc 'stop [UUID]', 'Allows you to shut down a machine.'
229
+ method_option :all, type: :boolean, desc: 'All machine stop.'
210
230
  def stop(uuid=nil)
211
- uuid ||= config[:use_machine]
212
- output sdc(config(options)).machines.stop(uuid), {message: "Machine #{uuid} stoped"}.merge(options)
231
+ if options.all
232
+ sdc(config(options)).machines.all({state: 'running'}).content.each do |machine|
233
+ output sdc(config(options)).machines.stop(machine['id']), {message: "Machine #{machine['primaryIp']} stoped."}.merge(options)
234
+ end
235
+ else
236
+ uuid ||= config[:use_machine]
237
+ output sdc(config(options)).machines.stop(uuid), {message: "Machine #{CLI.ip(uuid)} stoped."}.merge(options)
238
+ end
213
239
  end
214
240
 
215
241
  desc 'start [UUID]', 'Allows you to boot up a machine.'
242
+ method_option :all, type: :boolean, desc: 'All machine start.'
216
243
  def start(uuid=nil)
217
- uuid ||= config[:use_machine]
218
- output sdc(config(options)).machines.start(uuid), {message: "Machine #{uuid} started"}.merge(options)
244
+ if options.all
245
+ sdc(config(options)).machines.all({state: 'stopped'}).content.each do |machine|
246
+ output sdc(config(options)).machines.start(machine['id']), {message: "Machine #{machine['primaryIp']} started."}.merge(options)
247
+ end
248
+ else
249
+ uuid ||= config[:use_machine]
250
+ output sdc(config(options)).machines.start(uuid), {message: "Machine #{CLI.ip(uuid)} started."}.merge(options)
251
+ end
219
252
  end
220
253
 
221
254
  desc 'reboot [UUID]', 'Allows you to reboot a machine.'
222
255
  def reboot(uuid=nil)
223
256
  uuid ||= config[:use_machine]
224
- output sdc(config(options)).machines.reboot(uuid), {message: "Machine #{uuid} reboot"}.merge(options)
257
+ output sdc(config(options)).machines.reboot(uuid), {message: "Machine #{CLI.ip(uuid)} reboot."}.merge(options)
225
258
  end
226
259
 
227
260
  desc 'resize [UUID]', 'Allows you to resize a SmartMachine.'
228
261
  method_option :package, type: :string, aliases: '-p', desc: 'Use a package name returned from ListPackages'
229
262
  def resize(uuid=nil)
230
263
  uuid ||= config[:use_machine]
231
- output sdc(config(options)).machines.resize(uuid, {}.merge(options)), {message: "Machine #{uuid} resize"}.merge(options)
264
+ output sdc(config(options)).machines.resize(uuid, {}.merge(options)), {message: "Machine #{CLI.ip(uuid)} resize."}.merge(options)
232
265
  end
233
266
 
234
267
  desc 'use [UUID]', 'Use machine.'
@@ -243,7 +276,7 @@ module CLI
243
276
  end
244
277
 
245
278
  register(Tag, 'tag', 'tag [COMMAND]', 'Machine tag')
246
- register(Metadata, 'metadata', 'metadata [COMMAND]', 'Machine metadata')
279
+ register(Meta, 'meta', 'meta [COMMAND]', 'Machine metadata')
247
280
  register(Snapshot, 'snapshot', 'snapshot [COMMAND]', 'Machine snapshot')
248
281
  end
249
282
 
@@ -271,7 +304,7 @@ module CLI
271
304
  end
272
305
 
273
306
  desc 'get [ID]', 'Retrieves the configuration for an instrumentation.'
274
- method_option :value, type: :boolean, aliases: '-v', desc: 'All metadata.'
307
+ method_option :value, type: :boolean, aliases: '-v', desc: 'Analytic value.'
275
308
  def get(id)
276
309
  if options[:value]
277
310
  output sdc(config(options)).analytics.value(id), {table: :v}.merge(options)
@@ -311,8 +344,31 @@ module CLI
311
344
  class Main < Thor
312
345
  desc 'init', 'Sets up an account on a datacenter for use with this CLI.'
313
346
  def init
314
- Configure.make
315
- puts sdc(config).datacenters.all.status == 200 ? 'Successful configuration.' : 'Failed Configuration.'
347
+ message = ['Successful configuration.', 'Failed Configuration.']
348
+ state = 0
349
+
350
+ Configure.init
351
+ res = sdc(config).keys.all
352
+ if res.status == 200
353
+ rsa_path = Configure.key(res.content)
354
+ config = Configure.read
355
+ if rsa_path
356
+ raw = {name: config[:use_key], key: File.read(rsa_path)}
357
+ res = sdc(config).keys.create(raw)
358
+ state = 1 if res.status != 201
359
+ config.delete(:password)
360
+ else
361
+ config.delete(:password)
362
+ res = sdc(config).keys.read(config[:use_key])
363
+ state = 1 if res.status != 200
364
+ end
365
+ Configure.write config
366
+ else
367
+ state = 1
368
+ end
369
+
370
+ msg = res.content['message'] + '.' if state == 1
371
+ puts "#{message[state]} #{msg}"
316
372
  end
317
373
 
318
374
  register(Key, 'key', 'key [COMMAND]', 'SSH key')
data/lib/cli_helper.rb CHANGED
@@ -55,52 +55,43 @@ def output(response, options={})
55
55
  end
56
56
 
57
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
58
+ options[:include] ||= []
59
+ options[:exclude] ||= []
60
+ rows = []
61
+ headings = nil
62
+
63
+ content.each do |row|
64
+ options[:exclude].each do |col|
65
+ row.delete(col.to_s)
66
+ end
70
67
 
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
68
+ if !options[:include].empty?
69
+ cols = {}
70
+ options[:include].each do |col|
71
+ cols[col.to_s] = row[col.to_s] if row.key?(col.to_s)
77
72
  end
78
-
79
- rows << row.values
80
- headings = row.keys if headings.nil?
73
+ row = cols
81
74
  end
82
75
 
83
- Terminal::Table.new :headings => headings, :rows => rows
76
+ rows << row.values
77
+ headings = row.keys if headings.nil?
84
78
  end
79
+
80
+ Terminal::Table.new :headings => headings, :rows => rows if !content.empty?
85
81
  end
86
82
 
87
83
  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
84
+ options[:exclude] ||= []
85
+ options[:exclude].each do |col|
86
+ content.delete(col.to_s)
87
+ end
96
88
 
97
- rows = []
98
- content.to_a.each do |row|
99
- rows << row
100
- end
101
-
102
- Terminal::Table.new :headings => ['key','value'], :rows => rows
89
+ rows = []
90
+ content.to_a.each do |row|
91
+ rows << row
103
92
  end
93
+
94
+ Terminal::Table.new :headings => ['key','value'], :rows => rows if !content.empty?
104
95
  end
105
96
 
106
97
  def describe(name, content, options)
data/lib/configure.rb CHANGED
@@ -24,10 +24,21 @@ module Configure
24
24
  end
25
25
  end
26
26
 
27
- def self.make
27
+ def self.init
28
28
  config = self.read
29
29
 
30
- puts
30
+ output = <<EOS
31
+ .
32
+ |
33
+ .-. .--. .-.| .-.
34
+ : + : `--.( | (
35
+ `-' `--' `-'`- `-'
36
+ Smart Data Center Command Line Interface
37
+ http://apidocs.joyent.com/sdcapidoc/cloudapi/
38
+
39
+ EOS
40
+ puts output
41
+
31
42
  config[:hostname] ||= 'api.example.com'
32
43
  print "Hostname (#{config[:hostname]}): "
33
44
  stdin = STDIN.gets.chomp.to_s
@@ -59,6 +70,47 @@ module Configure
59
70
  self.write config
60
71
  end
61
72
 
73
+ def self.key(keys)
74
+ config = self.read
75
+ use_key = 0
76
+ rsa_path = nil
77
+
78
+ puts "SSH Key Settings:"
79
+ keys.each_with_index do |key, i|
80
+ puts "#{i+1}) #{key['name']}"
81
+ end
82
+
83
+ if !keys.empty?
84
+ puts "0) Add new key"
85
+ print "Select SSH key: "
86
+ stdin = STDIN.gets.chomp.to_s
87
+ use_key = stdin.to_i if !stdin.empty?
88
+ end
89
+
90
+ if use_key > 0
91
+ config[:use_key] = keys[use_key-1]['name']
92
+ else
93
+ config[:use_key] ||= 'id_rsa'
94
+ print "Key name (#{config[:use_key]}): "
95
+ stdin = STDIN.gets.chomp.to_s
96
+ config[:use_key] = stdin if !stdin.empty?
97
+
98
+ rsa_path = File.join(ENV["HOME"], '/.ssh/id_rsa.pub')
99
+ print "Public key path (#{rsa_path}): "
100
+ stdin = STDIN.gets.chomp.to_s
101
+ rsa_path = stdin if !stdin.empty?
102
+ end
103
+
104
+ config[:rsa_path] ||= File.join(ENV["HOME"], '/.ssh/id_rsa')
105
+ print "Private key path (#{config[:rsa_path]}): "
106
+ stdin = STDIN.gets.chomp.to_s
107
+ config[:rsa_path] = stdin if !stdin.empty?
108
+ puts
109
+
110
+ self.write config
111
+ rsa_path
112
+ end
113
+
62
114
  private
63
115
 
64
116
  def path
@@ -0,0 +1,12 @@
1
+ require 'openssl'
2
+
3
+ module Smartdc
4
+ module Auth
5
+ def self.sign(request={}, options={})
6
+ rsa = OpenSSL::PKey::RSA.new File.read options[:rsa_path]
7
+ sha256 = OpenSSL::Digest::SHA256.new
8
+ raw = [rsa.sign(sha256, request[:headers][:date])].pack('m').delete("\r\n")
9
+ "Signature keyId=\"/#{options[:username]}/keys/#{options[:use_key]}\",algorithm=\"rsa-sha256\" #{raw}"
10
+ end
11
+ end
12
+ end
@@ -1,6 +1,7 @@
1
1
  require 'json'
2
2
  require 'faraday'
3
- require 'smartdc/response/raise_error'
3
+ require 'smartdc/auth'
4
+ #require 'smartdc/response/raise_error'
4
5
 
5
6
  module Smartdc
6
7
  class Request
@@ -25,6 +26,7 @@ module Smartdc
25
26
  end
26
27
 
27
28
  def request(method, path, query={}, raw={})
29
+ path = path.gsub(/^my/, @options[:username])
28
30
  res = connection.send(method) do |req|
29
31
  case method
30
32
  when :get
@@ -63,16 +65,19 @@ module Smartdc
63
65
  :url => 'https://' + @options[:hostname],
64
66
  :ssl => {:verify => false},
65
67
  :headers => {
66
- 'Content-Type'=>'application/json',
67
- 'X-Api-Version' => @options[:version]
68
+ :date => Time.now.gmtime.to_s,
69
+ 'content-type'=>'application/json',
70
+ 'x-api-version' => @options[:version]
68
71
  }
69
72
  }
70
73
 
74
+ options[:headers][:authorization] = Smartdc::Auth::sign(options, @options) if @options[:rsa_path] && !@options[:password]
75
+
71
76
  Faraday.new(options) do |builder|
72
- builder.request :basic_auth, @options[:username], @options[:password]
77
+ builder.request :basic_auth, @options[:username], @options[:password] if @options[:password]
73
78
  # builder.use Smartdc::Response::RaiseError
74
79
  builder.adapter Faraday.default_adapter
75
80
  end
76
81
  end
77
82
  end
78
- end
83
+ end
@@ -1,23 +1,24 @@
1
1
  module Smartdc
2
2
  class Response
3
- attr_reader :status, :headers, :body
3
+ attr_reader :status, :headers, :body, :content
4
4
 
5
5
  def initialize(response)
6
6
  @status = response.status
7
7
  @headers = response.headers
8
8
  @body = response.body
9
+ self.content = @body
9
10
  end
10
11
 
11
- def content
12
- case @body
12
+ def content=raw
13
+ case raw
13
14
  when nil, ''
14
- nil
15
+ @content = nil
15
16
  when 'true'
16
- true
17
+ @content = true
17
18
  when 'false'
18
- false
19
+ @content = false
19
20
  else
20
- JSON.parse(@body)
21
+ @content = JSON.parse(raw)
21
22
  end
22
23
  end
23
24
  end
data/smartdc.gemspec CHANGED
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = "smartdc"
8
- s.version = "1.0.1"
8
+ s.version = "1.1.1"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["ogom"]
12
- s.date = "2012-12-16"
12
+ s.date = "2012-12-23"
13
13
  s.description = "SmartDataCenter client and SmartDataCenter Command Line Interface."
14
14
  s.email = "ogom@hotmail.co.jp"
15
15
  s.executables = ["sdc"]
@@ -37,6 +37,7 @@ Gem::Specification.new do |s|
37
37
  "lib/smartdc/api/machine/tags.rb",
38
38
  "lib/smartdc/api/machines.rb",
39
39
  "lib/smartdc/api/packages.rb",
40
+ "lib/smartdc/auth.rb",
40
41
  "lib/smartdc/client.rb",
41
42
  "lib/smartdc/error.rb",
42
43
  "lib/smartdc/request.rb",
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: smartdc
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.1
4
+ version: 1.1.1
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-12-16 00:00:00.000000000 Z
12
+ date: 2012-12-23 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: faraday
@@ -135,6 +135,7 @@ files:
135
135
  - lib/smartdc/api/machine/tags.rb
136
136
  - lib/smartdc/api/machines.rb
137
137
  - lib/smartdc/api/packages.rb
138
+ - lib/smartdc/auth.rb
138
139
  - lib/smartdc/client.rb
139
140
  - lib/smartdc/error.rb
140
141
  - lib/smartdc/request.rb
@@ -177,7 +178,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
177
178
  version: '0'
178
179
  segments:
179
180
  - 0
180
- hash: -3018539287908921547
181
+ hash: -4139368408175416003
181
182
  required_rubygems_version: !ruby/object:Gem::Requirement
182
183
  none: false
183
184
  requirements: