purest 0.1.0 → 1.0.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: '0061492805748e646a06d9f5077446336d985ea40ff8ed76a3f9a5d8b60ff74d'
4
- data.tar.gz: f58236ea14ff460b5698f0f348540c8c7fe87db762200fd37e8cb7ccfea3f505
3
+ metadata.gz: ab3ac73c9fc141dddadde6ec8435dcad4f40ff1011badec4ecdad573f0f2c166
4
+ data.tar.gz: b82e8f475af0b06238acd863ace402d9503acfb1d1d07f3e777a777934cafba9
5
5
  SHA512:
6
- metadata.gz: e51d88129e1f4807334c14ee3f9787e79bbcce33254dc83fa21450d63d67f1cdf3a687b84210df13b5eb5fad51ee5d30de71a2149e7e59672243036e287f0cea
7
- data.tar.gz: c5f9532c491299d10b1c8e7add8bcefe1905534ca6496f84a5cf7ac5450726e2175d7fa6bdf8530e6da5cf761e61447273c623b8562c09313546a5817314dcac
6
+ metadata.gz: ae3956cd6d9e11df30da2a7988fe5c4dbad2e91afff3913610d14775af84baef36104d327caf75cd4eb541d310554758d10389cf80e0b6740ec1f1e3d134e776
7
+ data.tar.gz: a21f3ca95452314c9e3ceeb283979a0903c8471a4fc468fdb69d9f2a91e3cffdecec42954de4dd4f114dee00eca5ae9540d8b84bf8b6af6393dd4f4b1efced7d
data/README.md CHANGED
@@ -9,7 +9,7 @@ This started as sort of a labor of love/learning exercise, and sort of blossomed
9
9
 
10
10
  2) I am not affiliated with Pure Storage, beyond the fact that my company uses their product.
11
11
 
12
- 3) This isn't done. What I think of as the 'core' functionality is there- you can manipulate volumes, hosts, and host groups, along with the array itself. I still need to add in classes for ProtectionGroups, Alerts/Messages, SNMP Manager Connections, SSL, Network Interfaces, Hardware, Apps, and Users.
12
+ 3) While all of the classes exist, currently only up to API version 1.11 is supported.
13
13
 
14
14
  ## Requirements
15
15
 
@@ -34,8 +34,10 @@ end
34
34
  ```
35
35
 
36
36
  ## API options
37
- The various class methods of this gem turn the provided options into HTTP parameters, and are
38
- named accordingly. For instance, ```Purest::Volume.get({:snap => true})``` translates
37
+ First: Authentication and session management is handled behind the scenes, you just need to supply your username/password in the configuration block (as shown in the example above). That's it.
38
+
39
+ Second: The various class methods of this gem turn the provided options into HTTP parameters, and are
40
+ named accordingly. For instance, ```Purest::Volume.get({:snap: true})``` translates
39
41
  to http://purehost.yourdomain.com/api/1.11/volume?snap=true. For a full list
40
42
  of options for a given class, Pure provides good documentation at:
41
43
  https://purehost.yourdomain.com/static/0/help/rest/.
@@ -43,79 +45,122 @@ https://purehost.yourdomain.com/static/0/help/rest/.
43
45
  Below I'll provide a large group of examples, but I won't be detailing every single method call with all of its possible options, for that I will again refer you to Pure's REST API docs.
44
46
 
45
47
  # Examples
46
- ## Volumes
47
- Getting volumes:
48
+
49
+ ## Alerts
50
+ Get information about alerts/alerting
48
51
  ```ruby
49
- # Get the full list of volumes
50
- Purest::Volume.get
52
+ # List email recipients
53
+ Purest::Alerts.get
51
54
 
52
- # Get a single volume
53
- Purest::Volume.get(:name => 'volume1')
55
+ # List information about a specific email recipient
56
+ Purest::Alerts.get(name: 'email@example.com')
57
+ ```
54
58
 
55
- # Get monitoring information about a volume
56
- Purest::Volume.get(:name => 'volume1', :action => 'monitor')
59
+ Designate an email address to receive alerts
60
+ ```ruby
61
+ Purest::Alerts.create(name: 'new-user@example.com')
62
+ ```
57
63
 
58
- # Get multiple volumes
59
- Purest::Volume.get(:names => ['volume1', 'volume2'])
64
+ Updating/performing alert actions
65
+ ```ruby
66
+ # Send a test alert
67
+ Purest::Alerts.update(action: 'test')
60
68
 
61
- # Get a list of snapshots
62
- Purest::Volume.get(:snap => true)
69
+ # Turn off alert sending for new-user@example.com
70
+ Purest::Alerts.update(name: 'new-user@example.com', enabled: false)
71
+ ```
63
72
 
64
- # Get a single snapshot
65
- Purest::Volume.get(:name => 'volume1', :snap => true)
73
+ Deleting an email address from list of addresses that receive alerts
74
+ ```ruby
75
+ Purest::Alerts.delete(name: 'new-user@example.com')
76
+ ```
66
77
 
67
- # Get multiple snapshots
68
- Purest::Volume.get(:names => ['volume1', 'volume2'], :snap => true)
78
+ ## App
79
+ ```ruby
80
+ # Teeny tiny class, can get apps or get apps and initiators
81
+ Purest::App.get
82
+ Purest::App.get(initiators: true)
83
+ ```
69
84
 
70
- # List block differences for the specified snapshot
71
- Purest::Volume.get(:name => 'volume1.snap', :show_diff => true, :block_size => 512, :length => '2G')
85
+ ## Cert
86
+ List certificate attributes or export a certificate
87
+ ```ruby
88
+ # Get certificate attributes
89
+ Purest::Cert.get
72
90
 
73
- # List shared connections for a specified volume
74
- Purest::Volume.get(:name => 'volume1', :show_hgroup => true)
91
+ # Export current certificate
92
+ Purest::Cert.get(certificate: true)
75
93
 
76
- # List private connections for a specified volume
77
- Purest::Volume.get(:name => 'volume1', :show_host => true)
78
- ```
94
+ # Export current intermediate certificate
95
+ Purest::Cert.get(intermediate_certificate: true)
79
96
 
80
- Creating volumes:
97
+ # Get a CSR with current certificate attributes
98
+ Purest::Cert.get(csr: true)
81
99
 
100
+ # Get a CSR with current certificate attributes, but change the CN
101
+ Purest::Cert.get(csr: true, common_name: 'host.example.com')
102
+ ```
103
+
104
+ Create self signed certificate, or import one. If you're wondering why this
105
+ is an update action and not a create action, I believe it comes down to the fact
106
+ that the Pure Array already has a self signed cert from the get go so we're just updating in place.
82
107
  ```ruby
83
- # Creating a new volume
84
- Purest::Volume.create(:name => 'volume', :size => '10G')
108
+ # Create a self signed certificate, using existing attributes
109
+ Purest::Cert.update(self_signed: true)
85
110
 
86
- # Creating a new volume by copying another
87
- Purest::Volume.create(:name => 'volume, ':source => 'other_vol')
111
+ # Create a self signed cert, using all existing attributes except the state
112
+ Purest::Cert.update(self_signed: true, state: 'FL')
88
113
 
89
- # Overwriting a volume by copying another
90
- Purest::Volume.create(:name => 'volume', :source => 'other_vol', :overwrite => true)
114
+ # Import a cert signed by a CA
115
+ Purest::Cert.update(certificate: 'your_huge_certificate_string')
116
+ ```
91
117
 
92
- # Add a volume to a protection group
93
- Purest::Volume.create(:name => 'volume', :pgroup => 'protection-group')
118
+ ## Directory Service
119
+ Get information about directory service
120
+ ```ruby
121
+ Purest::DirectoryService.get
94
122
  ```
95
123
 
96
- Updating volumes
124
+ Update information about a directory service
97
125
  ```ruby
98
- # Growing a volume
99
- Purest::Volume.update(:name => 'volume', :size => "15G")
126
+ Purest::DirectoryService.update(bind_password: 'superpassword')
127
+ ```
100
128
 
101
- # Truncate (shrink) a volume
102
- Purest::Volume.update(:name => 'volume', :size => "10G", :truncate => true)
129
+ ## DNS
130
+ Listing DNS attributes
131
+ ```ruby
132
+ Purest::DNS.get
133
+ ```
103
134
 
104
- # Rename a volume
105
- Purest::Volume.update(:name => 'volume', :new_name => 'volume_renamed')
135
+ Updating DNS attributes
136
+ ```ruby
137
+ Purest::DNS.update(nameservers: ['newdns1', 'newdns2'])
106
138
  ```
107
139
 
108
- Deleting volumes
140
+ ## Drive information
141
+ List flash modules, NVRAM modules, and their attributes
142
+ ```ruby
143
+ Purest::Drive.get
109
144
 
145
+ Purest::Drive.get(name: 'SH0.BAY0')
146
+ ```
147
+
148
+ ## Hardware
149
+ List hardware components
110
150
  ```ruby
111
- # Delete a volume
112
- Purest::Volume.delete(:name => 'volume_to_delete')
151
+ Purest::Hardware.get
113
152
 
114
- # Eradicating a volume
115
- Purest::Volume.delete(:name => 'volume_to_delete', :eradicate => true)
153
+ # List a specific hardware component's attributes
154
+ Purest::Hardware.get(name: 'SH0.BAY0')
155
+ ```
116
156
 
117
- # Deleting a volume from a protection group
118
- Purest::Volume.delete(:name => 'volume', :pgroup => 'pgroup1')
157
+ Control visual identification of specified components
158
+ ```ruby
159
+ # Turn the lights on
160
+ Purest::Hardware.update(name: 'SH0.BAY0', identify: on)
161
+
162
+ # Turn the lights off :(
163
+ Purest::Hardware.update(name: 'SH0.BAY0', identify: off)
119
164
  ```
120
165
 
121
166
  ## Hosts
@@ -125,52 +170,151 @@ Getting hosts:
125
170
  Purest::Host.get
126
171
 
127
172
  # Get a list of hosts with performance data
128
- Purest::Host.get(:action => 'monitor')
173
+ Purest::Host.get(action: 'monitor')
129
174
 
130
175
  # Get a single host on an array
131
- Purest::Host.get(:name => 'host123')
176
+ Purest::Host.get(name: 'host123')
132
177
 
133
178
  # Get a list of hosts, by name, on an array
134
- Purest::Host.get(:names => ['host123', 'host456'])
179
+ Purest::Host.get(names: ['host123', 'host456'])
180
+
181
+ # Get volumes associated with specific host
182
+ Purest::Host.get(name: 'hgroup1', show_volume: true)
135
183
  ```
136
184
 
137
185
  Creating hosts:
138
186
  ```ruby
139
187
  # Create a host
140
- Purest::Host.create({:name => 'host123'})
188
+ Purest::Host.create(name: 'host123')
141
189
 
142
190
  # Create a host and set ISCSI IQNs
143
- Purest::Host.create(:name => 'host123', :iqnlist => ['iqnstuff-1', 'iqnstuff-2'])
191
+ Purest::Host.create(name: 'host123', iqnlist: ['iqnstuff-1', 'iqnstuff-2'])
144
192
 
145
193
  # Add a host to a protection group
146
- Purest::Host.create(:name => 'host123', :protection_group => 'pgroup123')
194
+ Purest::Host.create(name: 'host123', protection_group: 'pgroup123')
147
195
 
148
196
  # Connect a volume to a host
149
- Purest::Host.create(:name => 'host123', :volume => 'volume123')
197
+ Purest::Host.create(name: 'host123', volume: 'volume123')
150
198
  ```
151
199
 
152
200
  Updating hosts:
153
201
  ```ruby
154
202
  # Rename a host
155
- Purest::Host.update(:name => 'host123', :new_name => 'host456')
203
+ Purest::Host.update(name: 'host123', new_name: 'host456')
156
204
 
157
205
  # Set the host username/password for CHAP
158
- Purest::Host.update(:name => 'host123', :host_user => 'username', :host_password => 'supersecretpassword')
206
+ Purest::Host.update(name: 'host123', host_user: 'username', host_password: 'supersecretpassword')
159
207
  ```
160
208
 
161
209
  Deleting hosts:
162
210
  ```ruby
163
211
  # Delete a host
164
- Purest::Host.delete(:name => 'host123')
212
+ Purest::Host.delete(name: 'host123')
165
213
 
166
214
  # Remove a host from a protection group
167
- Purest::Host.delete(:name => 'host123', :protection_group => 'pgroup123')
215
+ Purest::Host.delete(name: 'host123', protection_group: 'pgroup123')
168
216
 
169
217
  # Remove the connection between a host and a volume
170
- Purest::Host.delete(:name => 'host123', :volume => 'volume123')
218
+ Purest::Host.delete(name: 'host123', volume: 'volume123')
219
+ ```
220
+
221
+ ## Host Groups
222
+ Getting information about host groups
223
+ ```ruby
224
+ # Get a list of host groups
225
+ Purest::HostGroup.get
226
+
227
+ # Get a single host group
228
+ Purest::HostGroup.get(name: 'hgroup1')
229
+
230
+ # Get a list of host groups, with monitoring information
231
+ Purest::HostGroup.get(names: ['hgroup1', 'hgroup2'], action: 'monitor')
232
+
233
+ # Get a list of volumes associated with a specified host
234
+ Purest::HostGroup.get(name: 'hgroup1', show_volume: true)
235
+ ```
236
+
237
+ Creating host groups
238
+ ```ruby
239
+ # Create a host group with a specified name
240
+ Purest::HostGroup.create(name: 'hgroup1')
241
+
242
+ # Create a host group and supply its host members
243
+ Purest::HostGroup.create(name: 'hgroup1', hostlist: ['host1', 'host2'])
244
+
245
+ # Add a host group to a protection group
246
+ Purest::HostGroup.create(name: 'hgroup1', protection_group: 'pgroup1')
247
+
248
+ # Connect a volume to all hosts in a specified host group
249
+ Purest::HostGroup.create(name: 'hgroup1', volume: 'v3')
171
250
  ```
172
251
 
173
- # Physical Arrays
252
+ Updating host groups
253
+ ```ruby
254
+ # Renaming a host group
255
+ Purest::HostGroup.update(name: 'hgroup1', new_name: 'hgroup1-renamed')
256
+
257
+ # Replace the list of member hosts
258
+ Purest::HostGroup.update(name: 'hgroup1', hostlist: ['host1', 'host2'])
259
+
260
+ # Add a list of hosts to existing host list
261
+ Purest::HostGroup.update(name: 'hgroup1', addhostlist: ['host3', 'host4'])
262
+
263
+ # Remove a list of hosts from a host list
264
+ Purest::HostGroup.update(name: 'hgroup1', remhostlist: ['host1'])
265
+ ```
266
+
267
+ Deleting host groups
268
+ ```ruby
269
+ # Delete a host group
270
+ Purest::HostGroup.delete(name: 'hgroup1')
271
+
272
+ # Remove a host group member from a protection group
273
+ Purest::HostGroup.delete(name: 'hgroup1', protection_group: 'pgroup1')
274
+
275
+ # Break the connection between a host group and a volume
276
+ Purest::HostGroup.delete(name: 'hgroup1', volume: 'volume1')
277
+ ```
278
+
279
+ ## Messages
280
+ List alert events, audit records, etc
281
+ ```ruby
282
+ Purest::Messages.get
283
+ ```
284
+
285
+ Flag/unflag a message
286
+ ```ruby
287
+ Purest::Messages.update(id: 2, flagged: true)
288
+ ```
289
+
290
+ ## Network
291
+ List network interfaces
292
+ ```ruby
293
+ # Get network interfaces and their statuses
294
+ Purest::Network.get
295
+
296
+ # Get attributes about a specific network component
297
+ Purest::Network.get(name: 'ct0.eth0')
298
+ ```
299
+
300
+ Create a VLAN interface
301
+ ```ruby
302
+ # Create a vlan with a specified subnet
303
+ Purest::Network.create(subnet: 'subnet10')
304
+ ```
305
+
306
+ Perform network interface actions or update attributes
307
+ ```ruby
308
+ # Set MTU
309
+ Purest::Network.update(mtu: 2000)
310
+ ```
311
+
312
+ Delete a VLAN interface
313
+ ```ruby
314
+ Purest::Network.delete(name: 'ct0.eth0')
315
+ ```
316
+
317
+ ## Physical Arrays
174
318
 
175
319
  List the attributes on an array:
176
320
  ```ruby
@@ -178,83 +322,240 @@ List the attributes on an array:
178
322
  Purest::PhysicalArray.get
179
323
 
180
324
  # List connected arrays
181
- Purest::PhysicalArray.get(:connection => true)
325
+ Purest::PhysicalArray.get(connection: true)
182
326
  ```
183
327
 
184
328
  Create a connection between two arrays:
185
329
  ```ruby
186
- Purest::PhysicalArray.create(:connection_key => '<key>', :management_address => 'hostname', :type => ['replication'])
330
+ Purest::PhysicalArray.create(connection_key: '<key>', management_address: 'hostname', type: ['replication'])
187
331
  ```
188
332
 
189
333
  Update the attributes on an array:
190
334
  ```ruby
191
335
  # rename an array
192
- Purest::PhysicalArray.update(:new_name => 'new_name')
336
+ Purest::PhysicalArray.update(new_name: 'new_name')
193
337
  ```
194
338
 
195
339
  Disconnect the current array from a specified array:
196
340
  ```ruby
197
341
  # Given that your pure is purehost.yourdomain.com, as defined in the config block above
198
342
  # Disconnect purehost2.yourdomain.com from yours
199
- Purest::PhysicalArray.delete(:name => 'purehost2.yourdomain.com')
343
+ Purest::PhysicalArray.delete(name: 'purehost2.yourdomain.com')
200
344
  ```
201
345
 
202
- # Host Groups
203
- Getting information about host groups
346
+ ## Port
347
+ Getting information about ports, 'cause that's all you get to do
204
348
  ```ruby
205
- # Get a list of host groups
206
- Purest::HostGroup.get
349
+ # Get port information
350
+ Purest::Port.get
207
351
 
208
- # Get a single host group
209
- Purest::HostGroup.get(:name => 'hgroup1')
352
+ # Get port information + initiator information = winning
353
+ Purest::Port.get(initiators: true)
354
+ ```
210
355
 
211
- # Get a list of host groups, with monitoring information
212
- Purest::HostGroup.get(:names => ['hgroup1', 'hgroup2'], :action => 'monitor')
356
+ ## Protection Groups
357
+ Getting information about protection groups
358
+ ```ruby
359
+ # Get a list of protection groups
360
+ Purest::ProtectionGroup.get
213
361
 
214
- # Get a list of volumes associated with a specified host
215
- Purest::HostGroup.get(:name => 'hgroup1', :show_volumes => true)
362
+ # Get a list of protection groups pending deletion
363
+ Purest::ProtectionGroup.get(pending: true)
216
364
  ```
217
365
 
218
- Creating host groups
366
+ Creating protection groups
219
367
  ```ruby
220
- # Create a host group with a specified name
221
- Purest::HostGroup.create(:name => 'hgroup1')
368
+ # Create a protection group
369
+ Purest::ProtectionGroup.create(name: 'pgroup1')
222
370
 
223
- # Create a host group and supply its host members
224
- Purest::HostGroup.create(:name => 'hgroup1', :hostlist => ['host1', 'host2'])
371
+ # Create a protection group with a host list
372
+ Purest::ProtectionGroup.create(name: 'pgroup1', hostlist: ['host1', 'host2'])
373
+ ```
225
374
 
226
- # Add a host group to a protection group
227
- Purest::HostGroup.create(:name => 'hgroup1', :protection_group => 'pgroup1')
375
+ Updating protection groups
376
+ ```ruby
377
+ # Renaming a protection group
378
+ Purest::ProtectionGroup.update(name: 'pgroup1', new_name: 'pgroup1-renamed')
228
379
 
229
- # Connect a volume to all hosts in a specified host group
230
- Purest::HostGroup.create(:name => 'hgroup1', :volume => 'v3')
380
+ # Add a list of hosts to an existing protection group's host list
381
+ Purest::ProtectionGroup.update(name: 'pgroup1', addhostlist: ['host3', 'host4'])
231
382
  ```
232
383
 
233
- Updating host groups
384
+ Deleting a protection group
234
385
  ```ruby
235
- # Renaming a host group
236
- Purest::HostGroup.update(:name => 'hgroup1', :new_name => 'hgroup1-renamed')
386
+ # Delete it, but allow for it to remain during the 24 hour grace period
387
+ Purest::ProtectionGroup.delete(name: 'pgroup1')
237
388
 
238
- # Replace the list of member hosts
239
- Purest::HostGroup.update(:name => 'hgroup1', :hostlist => ['host1', 'host2'])
389
+ # Delete it, with extreme prejudice
390
+ Purest::ProtectionGroup.delete(name: 'pgroup1', eradicate: true)
391
+ ```
240
392
 
241
- # Add a list of hosts to existing host list
242
- Purest::HostGroup.update(:name => 'hgroup1', :addhostlist => ['host3', 'host4'])
393
+ ## SNMP
394
+ Getting SNMP information
395
+ ```ruby
396
+ # Get a list of SNMP managers
397
+ Purest::SNMP.get
243
398
 
244
- # Remove a list of hosts from a host list
245
- Purest::HostGroup.update(:name => 'hgroup1', :remhostlist => ['host1'])
399
+ # List SNMP v3 engine ID
400
+ Purest::SNMP.get(engine_id: true)
246
401
  ```
247
402
 
248
- Deleting host groups
403
+ Creating an SNMP manager
249
404
  ```ruby
250
- # Delete a host group
251
- Purest::HostGroup.delete(:name => 'hgroup1')
405
+ # Create an SNMP manager
406
+ Purest::SNMP.create(name: 'snmp-manager1', host: 'snmp.yourdomain.com')
252
407
 
253
- # Remove a host group member from a protection group
254
- Purest::HostGroup.delete(:name => 'hgroup1', :protection_group => 'pgroup1')
408
+ # Create an SNMP manager pointed at an IPv4 address with a custom port
409
+ Purest::SNMP.create(name: 'snmp-manager1', host: '111.11.11.111:222')
255
410
 
256
- # Break the connection between a host group and a volume
257
- Purest::HostGroup.delete(:name => 'hgroup1', :volume => 'volume1')
411
+ # For those brave few; the strong souls using IPv6 with a custom port
412
+ Purest::SNMP.create(:name: 'snmp-manager1', :host: '[2001:db8:0:1]:222')
413
+ ```
414
+
415
+ Updating an existing SNMP manager
416
+ ```ruby
417
+ # Renaming an SNMP manager
418
+ Purest::SNMP.update(name: 'snmp-manager1', new_name: 'snmp-manager-renamed')
419
+
420
+ # For those not so brave; the weak souls who give up using IPv6 with a custom port
421
+ Purest::SNMP.update(name: 'snmp-manager1', host: '111.11.11.111:222')
422
+ ```
423
+
424
+ Deleting an SNMP manager
425
+ ```ruby
426
+ # Delete an SNMP manager
427
+ Purest::SNMP.delete(name: 'snmp-manager1')
428
+ ```
429
+
430
+ ## Subnet
431
+ Getting information about subnets
432
+ ```ruby
433
+ Purest::Subnet.get
434
+
435
+ # Specify a subnet
436
+ Purest::Subnet.get(name: 'subnet10')
437
+ ```
438
+
439
+ Creating a subnet
440
+ ```ruby
441
+ Purest::Subnet.create(name: 'subnet20', gateway: '11.11.11.1')
442
+ ```
443
+
444
+ Updating a subnet
445
+ ```ruby
446
+ # Rename a subnet
447
+ Purest::Subnet.update(name: 'subnet20', new_name: 'subnet21')
448
+ ```
449
+
450
+ Deleting a subnet
451
+ ```ruby
452
+ Purest::Subnet.delete(name: 'subnet21')
453
+ ```
454
+
455
+ ## Users
456
+ Getting information about users
457
+ ```ruby
458
+ Purest::Users.get
459
+
460
+ # Specific user information
461
+ Purest::Users.get(name: 'paxton.fettle')
462
+
463
+ # List the API token of a given user
464
+ Purest::Users.get(name: 'paxton.fettle', api_token: true)
465
+ ```
466
+
467
+ Create an API token for an existing user
468
+ ```ruby
469
+ Purest::Users.create(name: 'paxton.fettle')
470
+ ```
471
+
472
+ Updating user related stuff
473
+ ```ruby
474
+ # Clear all user permission cache entries
475
+ Purest::Users.update(clear: true)
476
+
477
+ # Update a specific user's public key
478
+ Purest::Users.update(name: 'paxton.fettle', publickey: 'hugepublickeystring')
479
+ ```
480
+
481
+ Delete API token for a user
482
+ ```ruby
483
+ Purest::Users.delete(name: 'paxton.fettle')
484
+ ```
485
+
486
+ ## Volumes
487
+ Getting volumes:
488
+ ```ruby
489
+ # Get the full list of volumes
490
+ Purest::Volume.get
491
+
492
+ # Get a single volume
493
+ Purest::Volume.get(name: 'volume1')
494
+
495
+ # Get monitoring information about a volume
496
+ Purest::Volume.get(name: 'volume1', action: 'monitor')
497
+
498
+ # Get multiple volumes
499
+ Purest::Volume.get(names: ['volume1', 'volume2'])
500
+
501
+ # Get a list of snapshots
502
+ Purest::Volume.get(snap: true)
503
+
504
+ # Get a single snapshot
505
+ Purest::Volume.get(name: 'volume1', snap: true)
506
+
507
+ # Get multiple snapshots
508
+ Purest::Volume.get(names: ['volume1', 'volume2'], snap: true)
509
+
510
+ # List block differences for the specified snapshot
511
+ Purest::Volume.get(name: 'volume1.snap', show_diff: true, block_size: 512, length: '2G')
512
+
513
+ # List shared connections for a specified volume
514
+ Purest::Volume.get(name: 'volume1', show_hgroup: true)
515
+
516
+ # List private connections for a specified volume
517
+ Purest::Volume.get(:name: 'volume1', :show_host: true)
518
+ ```
519
+
520
+ Creating volumes:
521
+
522
+ ```ruby
523
+ # Creating a new volume
524
+ Purest::Volume.create(name: 'volume', size: '10G')
525
+
526
+ # Creating a new volume by copying another
527
+ Purest::Volume.create(name: 'volume', source: 'other_vol')
528
+
529
+ # Overwriting a volume by copying another
530
+ Purest::Volume.create(name: 'volume', source: 'other_vol', overwrite: true)
531
+
532
+ # Add a volume to a protection group
533
+ Purest::Volume.create(name: 'volume', protection_group: 'protection-group')
534
+ ```
535
+
536
+ Updating volumes
537
+ ```ruby
538
+ # Growing a volume
539
+ Purest::Volume.update(name: 'volume', size: "15G")
540
+
541
+ # Truncate (shrink) a volume
542
+ Purest::Volume.update(name: 'volume', size: "10G", truncate: true)
543
+
544
+ # Rename a volume
545
+ Purest::Volume.update(name: 'volume', new_name: 'volume_renamed')
546
+ ```
547
+
548
+ Deleting volumes
549
+
550
+ ```ruby
551
+ # Delete a volume
552
+ Purest::Volume.delete(name: 'volume_to_delete')
553
+
554
+ # Eradicating a volume
555
+ Purest::Volume.delete(name: 'volume_to_delete', eradicate: true)
556
+
557
+ # Deleting a volume from a protection group
558
+ Purest::Volume.delete(name: 'volume', protection_group: 'pgroup1')
258
559
  ```
259
560
 
260
561
  # Specs
@@ -274,11 +575,20 @@ password: 'api-password'
274
575
  url: 'https://yoursuperawesomepurehost.com'
275
576
  ```
276
577
 
277
- Execute integration tests:
578
+ There are a few ways you can execute the integration tests:
278
579
  ```
580
+ # This will execute against the latest API version the gem is aware of, right now that is 1.11
279
581
  rspec -t integration
582
+
583
+ # This will execute against a specific version
584
+ API_VERSION=1.10 rspec -t integration
585
+
586
+ # This will execute against all specified versions
587
+ API_VERSION=1.1,1.2,1.5 rspec -t integration
588
+
589
+ # And finally, if you wish to execute integration tests against every version
590
+ ALL_VERSIONS=true rspec -t integration
280
591
  ```
281
592
 
282
- By default, this will run against version 1.1 to 1.11 of the API. This is useful for ensuring functionality added/subtracted to this project is programmatically tested against all versions of the API. I mostly did this as an exercise, that being said I think it provides a lot of usefulness and if it can be improved let me know (or submit a PR).
283
593
 
284
- It is worth mentioning, this generates a fair bit of work for your Pure array so...you've been warned.
594
+ It is worth mentioning, this generates a fair bit of work for your Pure array so...you've been warned. All of that being said, the integration testing is somewhat sparse at the moment