fog-openstack 0.1.2 → 0.1.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/fog-openstack.gemspec +1 -1
- data/lib/fog/openstack.rb +46 -33
- data/lib/fog/openstack/docs/compute.md +2 -3
- data/lib/fog/openstack/docs/getting_started.md +5 -5
- data/lib/fog/openstack/docs/introspection.md +251 -0
- data/lib/fog/openstack/docs/metering.md +15 -1
- data/lib/fog/openstack/docs/planning.md +2 -2
- data/lib/fog/openstack/docs/storage.md +3 -4
- data/lib/fog/openstack/examples/compute/basics.rb +1 -1
- data/lib/fog/openstack/examples/compute/block_device_mapping_v2.rb +1 -3
- data/lib/fog/openstack/examples/identity/basics.rb +6 -7
- data/lib/fog/openstack/examples/image/upload-test-image.rb +5 -8
- data/lib/fog/openstack/examples/introspection/basics.rb +75 -0
- data/lib/fog/openstack/examples/planning/basics.rb +1 -1
- data/lib/fog/openstack/examples/storage/set-account-quota.rb +7 -9
- data/lib/fog/openstack/identity.rb +99 -5
- data/lib/fog/openstack/identity_v2.rb +4 -23
- data/lib/fog/openstack/identity_v3.rb +10 -22
- data/lib/fog/openstack/introspection.rb +133 -0
- data/lib/fog/openstack/models/introspection/rules.rb +29 -0
- data/lib/fog/openstack/models/introspection/rules_collection.rb +32 -0
- data/lib/fog/openstack/models/metering/events.rb +2 -2
- data/lib/fog/openstack/models/network/floating_ip.rb +24 -3
- data/lib/fog/openstack/network.rb +1 -0
- data/lib/fog/openstack/requests/compute/get_volume_details.rb +4 -0
- data/lib/fog/openstack/requests/introspection/abort_introspection.rb +25 -0
- data/lib/fog/openstack/requests/introspection/create_introspection.rb +35 -0
- data/lib/fog/openstack/requests/introspection/create_rules.rb +37 -0
- data/lib/fog/openstack/requests/introspection/delete_rules.rb +23 -0
- data/lib/fog/openstack/requests/introspection/delete_rules_all.rb +23 -0
- data/lib/fog/openstack/requests/introspection/get_introspection.rb +24 -0
- data/lib/fog/openstack/requests/introspection/get_introspection_details.rb +24 -0
- data/lib/fog/openstack/requests/introspection/get_rules.rb +24 -0
- data/lib/fog/openstack/requests/introspection/list_rules.rb +24 -0
- data/lib/fog/openstack/version.rb +1 -1
- data/tests/fixtures/introspection.yaml +287 -0
- data/tests/openstack/identity_version_tests.rb +25 -0
- data/tests/openstack/models/network/floating_ip_tests.rb +14 -1
- data/tests/openstack/requests/introspection/introspection_tests.rb +297 -0
- data/tests/openstack/requests/introspection/rules_tests.rb +46 -0
- metadata +22 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9a3a52ccf8ef9aec1efe22b6cee7d6cfa6ca1a28
|
4
|
+
data.tar.gz: 29297c4505150b3a29f696dfd31620369b8d6544
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ca9f9563a28b33ed86c16ff22c7c37be97a63c67898c408918b2f054478304252628d10260174e8a786d56d65773c2e2d2e622b49e4c93b1477e59eb4f4dff59
|
7
|
+
data.tar.gz: eedee34b9856b255b2996071a6f8d907221d135d44ecec5b46f5c18593dc4300f5bb02d5f805e7c1e8e9e3fcd90550efd2a5426ed22e87103d406770a061471c
|
data/fog-openstack.gemspec
CHANGED
@@ -19,7 +19,7 @@ Gem::Specification.new do |spec|
|
|
19
19
|
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
20
20
|
spec.require_paths = ["lib"]
|
21
21
|
|
22
|
-
spec.add_dependency 'fog-core', '>= 1.
|
22
|
+
spec.add_dependency 'fog-core', '>= 1.37'
|
23
23
|
spec.add_dependency 'fog-json', '>= 1.0'
|
24
24
|
spec.add_dependency 'fog-xml', '>= 0.1'
|
25
25
|
spec.add_dependency 'ipaddress', '>= 0.8'
|
data/lib/fog/openstack.rb
CHANGED
@@ -9,42 +9,54 @@ require 'fog/openstack/errors'
|
|
9
9
|
require 'fog/openstack/compute'
|
10
10
|
require 'fog/openstack/identity_v2'
|
11
11
|
require 'fog/openstack/identity_v3'
|
12
|
-
require 'fog/openstack/image'
|
13
12
|
require 'fog/openstack/image_v1'
|
14
13
|
require 'fog/openstack/image_v2'
|
15
|
-
require 'fog/openstack/metering'
|
16
|
-
require 'fog/openstack/network'
|
17
|
-
require 'fog/openstack/orchestration'
|
18
14
|
require 'fog/openstack/storage'
|
19
|
-
require 'fog/openstack/volume'
|
20
15
|
require 'fog/openstack/volume_v1'
|
21
16
|
require 'fog/openstack/volume_v2'
|
22
|
-
require 'fog/openstack/baremetal'
|
23
17
|
require 'fog/openstack/planning'
|
24
18
|
|
25
19
|
module Fog
|
20
|
+
module Compute
|
21
|
+
autoload :OpenStack, File.expand_path('../openstack/compute', __FILE__)
|
22
|
+
end
|
23
|
+
|
24
|
+
module Identity
|
25
|
+
autoload :OpenStack, File.expand_path('../openstack/identity', __FILE__)
|
26
|
+
end
|
27
|
+
|
28
|
+
module Image
|
29
|
+
autoload :OpenStack, File.expand_path('../openstack/image', __FILE__)
|
30
|
+
end
|
31
|
+
|
32
|
+
module Metering
|
33
|
+
autoload :OpenStack, File.expand_path('../openstack/metering', __FILE__)
|
34
|
+
end
|
35
|
+
|
36
|
+
module Network
|
37
|
+
autoload :OpenStack, File.expand_path('../openstack/network', __FILE__)
|
38
|
+
end
|
39
|
+
|
40
|
+
module Orchestration
|
41
|
+
autoload :OpenStack, File.expand_path('../openstack/orchestration', __FILE__)
|
42
|
+
end
|
43
|
+
|
44
|
+
module Volume
|
45
|
+
autoload :OpenStack, File.expand_path('../openstack/volume', __FILE__)
|
46
|
+
end
|
47
|
+
|
48
|
+
module Baremetal
|
49
|
+
autoload :OpenStack, File.expand_path('../openstack/baremetal', __FILE__)
|
50
|
+
end
|
51
|
+
|
52
|
+
module Introspection
|
53
|
+
autoload :OpenStack, File.expand_path('../openstack/introspection', __FILE__)
|
54
|
+
end
|
55
|
+
|
26
56
|
module OpenStack
|
27
57
|
extend Fog::Provider
|
28
58
|
|
29
|
-
|
30
|
-
require 'fog/openstack/image_v1'
|
31
|
-
require 'fog/openstack/storage'
|
32
|
-
require 'fog/openstack/volume_v1'
|
33
|
-
require 'fog/openstack/volume_v2'
|
34
|
-
require 'fog/openstack/planning'
|
35
|
-
|
36
|
-
autoload :Compute, File.expand_path('../openstack/compute', __FILE__)
|
37
|
-
autoload :IdentityV2, File.expand_path('../openstack/identity_v2', __FILE__)
|
38
|
-
autoload :IdentityV3, File.expand_path('../openstack/identity_v3', __FILE__)
|
39
|
-
autoload :Image, File.expand_path('../openstack/image', __FILE__)
|
40
|
-
autoload :ImageV2, File.expand_path('../openstack/image_v2', __FILE__)
|
41
|
-
autoload :Metering, File.expand_path('../openstack/metering', __FILE__)
|
42
|
-
autoload :Network, File.expand_path('../openstack/network', __FILE__)
|
43
|
-
autoload :Orchestration, File.expand_path('../openstack/orchestration', __FILE__)
|
44
|
-
autoload :Volume, File.expand_path('../openstack/volume', __FILE__)
|
45
|
-
autoload :Baremetal, File.expand_path('../openstack/baremetal', __FILE__)
|
46
|
-
|
47
|
-
service(:compute , 'Compute')
|
59
|
+
service(:compute, 'Compute')
|
48
60
|
service(:image, 'Image')
|
49
61
|
service(:identity, 'Identity')
|
50
62
|
service(:network, 'Network')
|
@@ -54,6 +66,7 @@ module Fog
|
|
54
66
|
service(:orchestration, 'Orchestration')
|
55
67
|
service(:baremetal, 'Baremetal')
|
56
68
|
service(:planning, 'Planning')
|
69
|
+
service(:introspection, 'Introspection')
|
57
70
|
|
58
71
|
@@token_cache = {}
|
59
72
|
|
@@ -137,14 +150,6 @@ module Fog
|
|
137
150
|
|
138
151
|
end
|
139
152
|
|
140
|
-
service['endpoints'] = service['endpoints'].select do |endpoint|
|
141
|
-
endpoint['region'] == openstack_region
|
142
|
-
end if openstack_region
|
143
|
-
|
144
|
-
if service['endpoints'].empty?
|
145
|
-
raise Fog::Errors::NotFound.new("No endpoints available for region '#{openstack_region}'")
|
146
|
-
end if openstack_region
|
147
|
-
|
148
153
|
unless service
|
149
154
|
available = body['access']['serviceCatalog'].map { |endpoint|
|
150
155
|
endpoint['type']
|
@@ -157,6 +162,14 @@ module Fog
|
|
157
162
|
raise Fog::Errors::NotFound, message
|
158
163
|
end
|
159
164
|
|
165
|
+
service['endpoints'] = service['endpoints'].select do |endpoint|
|
166
|
+
endpoint['region'] == openstack_region
|
167
|
+
end if openstack_region
|
168
|
+
|
169
|
+
if service['endpoints'].empty?
|
170
|
+
raise Fog::Errors::NotFound.new("No endpoints available for region '#{openstack_region}'")
|
171
|
+
end if openstack_region
|
172
|
+
|
160
173
|
regions = service["endpoints"].map{ |e| e['region'] }.uniq
|
161
174
|
if regions.count > 1
|
162
175
|
raise Fog::Errors::NotFound.new("Multiple regions available choose one of these '#{regions.join(',')}'")
|
@@ -10,14 +10,13 @@ Start by executing the following command:
|
|
10
10
|
|
11
11
|
Once `irb` has launched you need to require the Fog library by executing:
|
12
12
|
|
13
|
-
require 'fog'
|
13
|
+
require 'fog/openstack'
|
14
14
|
|
15
15
|
## Create Service
|
16
16
|
|
17
17
|
Next, create a connection to the Compute Service:
|
18
18
|
|
19
|
-
service = Fog::Compute.new({
|
20
|
-
:provider => 'openstack', # OpenStack Fog provider
|
19
|
+
service = Fog::Compute::OpenStack.new({
|
21
20
|
:openstack_auth_url => 'http://KEYSTONE_HOST:KEYSTONE_PORT/v2.0/tokens', # OpenStack Keystone endpoint
|
22
21
|
:openstack_username => OPEN_STACK_USER, # Your OpenStack Username
|
23
22
|
:openstack_tenant => OPEN_STACK_TENANT, # Your tenant id
|
@@ -20,16 +20,16 @@ Bundler helps manage gem dependencies and is recommended for new projects. For m
|
|
20
20
|
|
21
21
|
## Installation
|
22
22
|
|
23
|
-
To install Fog via RubyGems run the following command:
|
23
|
+
To install Fog-Openstack via RubyGems run the following command:
|
24
24
|
|
25
|
-
$ gem install fog
|
25
|
+
$ gem install fog-openstack
|
26
26
|
|
27
27
|
To install Fog via Bundler add `gem 'fog'` to your `Gemfile`. This is a sample `Gemfile` to install Fog:
|
28
28
|
|
29
29
|
```ruby
|
30
30
|
source 'https://rubygems.org'
|
31
31
|
|
32
|
-
gem 'fog'
|
32
|
+
gem 'fog-openstack'
|
33
33
|
```
|
34
34
|
|
35
35
|
After creating your `Gemfile` execute the following command to install the libraries:
|
@@ -50,13 +50,13 @@ If using Ruby 1.8.x execute the following command:
|
|
50
50
|
|
51
51
|
```ruby
|
52
52
|
require 'rubygems'
|
53
|
-
require 'fog'
|
53
|
+
require 'fog/openstack'
|
54
54
|
```
|
55
55
|
|
56
56
|
If using Ruby 1.9.x execute the following command:
|
57
57
|
|
58
58
|
```ruby
|
59
|
-
require 'fog'
|
59
|
+
require 'fog/openstack'
|
60
60
|
```
|
61
61
|
|
62
62
|
You should now be able to execute the following command to see a list of services Fog provides for the Rackspace Open Cloud:
|
@@ -0,0 +1,251 @@
|
|
1
|
+
# Introspection
|
2
|
+
|
3
|
+
This document explains how to get started using introspection with
|
4
|
+
fog-openstack.
|
5
|
+
|
6
|
+
Please also refer to the
|
7
|
+
[Getting Started with Fog and the OpenStack](getting_started.md) document.
|
8
|
+
|
9
|
+
Introspection service is implemented by the OpenStack ironic-inspector project.
|
10
|
+
Introspection is strongly related to the Baremetal service (Ironic project).
|
11
|
+
Effectively, Instrospection communicates and operates on nodes defined by the
|
12
|
+
Baremetal layer (Ironic).
|
13
|
+
|
14
|
+
# OpenStack setup
|
15
|
+
|
16
|
+
## The catalog
|
17
|
+
For the fog-openstack's introspection service to work, the corresponding
|
18
|
+
service must be defined in the OpenStack catalog.
|
19
|
+
|
20
|
+
```bash
|
21
|
+
openstack catalog show inspector
|
22
|
+
+-----------+-----------------------------------------+
|
23
|
+
| Field | Value |
|
24
|
+
+-----------+-----------------------------------------+
|
25
|
+
| endpoints | regionOne |
|
26
|
+
| | publicURL: http://192.0.2.1:5050/v1 |
|
27
|
+
| | internalURL: http://192.0.2.1:5050/v1 |
|
28
|
+
| | adminURL: http://192.0.2.1:5050/v1 |
|
29
|
+
| | |
|
30
|
+
| name | inspector |
|
31
|
+
| type | introspection |
|
32
|
+
+-----------+-----------------------------------------+
|
33
|
+
```
|
34
|
+
|
35
|
+
Depending on the OpenStack release, the introspection service might be installed
|
36
|
+
but not defined yet in the catalog. In such case, you must add the service and
|
37
|
+
corresponding endpoints to create the catalog entry:
|
38
|
+
|
39
|
+
```bash
|
40
|
+
source ./stackrc
|
41
|
+
openstack service create --name inspector --description "OpenStack Introspection" introspection
|
42
|
+
openstack endpoint create --region regionOne inspector --publicurl http://example.com:5050/v1 --internalurl http://example.com:5050/v1 --adminurl http://example.com:5050/v1
|
43
|
+
```
|
44
|
+
|
45
|
+
## The introspection timeout
|
46
|
+
The default timeout value after which introspection is considered failed is set
|
47
|
+
by an 1 hour (3600 s) default. Although in production environment, baremetal
|
48
|
+
introspection requires time, testing in virtual environment doesn't, this is why
|
49
|
+
if you are in the latter case the timeout value can be reduced for speeding
|
50
|
+
results:
|
51
|
+
|
52
|
+
```bash
|
53
|
+
sudo openstack-config --set /etc/ironic-inspector/inspector.conf DEFAULT timeout 300
|
54
|
+
```
|
55
|
+
|
56
|
+
# Work flow
|
57
|
+
Assuming Baremetal nodes have been defined (imported), a usual work-flow might
|
58
|
+
consist of:
|
59
|
+
* Start introspection
|
60
|
+
* Check introspection status or abort introspection
|
61
|
+
* Retrieve introspection data
|
62
|
+
* optionally, pre-defined DSL based rules can be defined and applied during
|
63
|
+
introspection.
|
64
|
+
|
65
|
+
For more details about this process please refer to
|
66
|
+
http://docs.openstack.org/developer/ironic-inspector/workflow.html
|
67
|
+
|
68
|
+
|
69
|
+
Using 'irb', we start with authentication:
|
70
|
+
|
71
|
+
```ruby
|
72
|
+
@user = "admin"
|
73
|
+
@project = "admin"
|
74
|
+
@password = "secret"
|
75
|
+
@base_url = "http://keystone.example.com:5000/v3/auth/tokens"
|
76
|
+
|
77
|
+
require 'rubygems'
|
78
|
+
require 'fog/openstack'
|
79
|
+
|
80
|
+
@connection_params = {
|
81
|
+
:openstack_auth_url => @base_url,
|
82
|
+
:openstack_username => @user,
|
83
|
+
:openstack_api_key => @password,
|
84
|
+
:openstack_project_name => @project,
|
85
|
+
:openstack_domain_id => "default"
|
86
|
+
}
|
87
|
+
```
|
88
|
+
## Baremetal node introspection
|
89
|
+
|
90
|
+
### Baremetal nodes
|
91
|
+
|
92
|
+
Find the available Baremetal nodes.
|
93
|
+
|
94
|
+
```ruby
|
95
|
+
iron = Fog::Baremetal::OpenStack.new(@connection_params)
|
96
|
+
|
97
|
+
nodes = iron.node_list
|
98
|
+
```
|
99
|
+
|
100
|
+
### Start introspection
|
101
|
+
|
102
|
+
Let's start introspection using the first available node.
|
103
|
+
|
104
|
+
Note: To be introspected, a node must be in "manage" state. If needed, use Baremetal Service
|
105
|
+
to change the state with set_node_provision_state.
|
106
|
+
|
107
|
+
For more information, please refer to
|
108
|
+
http://docs.openstack.org/developer/ironic/deploy/install-guide.html#hardware-inspection
|
109
|
+
|
110
|
+
```ruby
|
111
|
+
node_id = nodes.body["nodes"][0]["uuid"]
|
112
|
+
inspector = Fog::Introspection::OpenStack.new(@connection_params)
|
113
|
+
|
114
|
+
introspection1 = inspector.create_introspection(node_id)
|
115
|
+
```
|
116
|
+
If everything went well the status returned by the request must be 202 which
|
117
|
+
means accepted:
|
118
|
+
```ruby
|
119
|
+
introspection1.status
|
120
|
+
=> 202
|
121
|
+
```
|
122
|
+
|
123
|
+
### Check introspection status
|
124
|
+
|
125
|
+
To check the status of the introspection:
|
126
|
+
```ruby
|
127
|
+
inspector.get_introspection(node_id)
|
128
|
+
```
|
129
|
+
|
130
|
+
The body returned has 2 fields:
|
131
|
+
* finished: A boolean, set to true if introspection process is finished
|
132
|
+
* error: A null string unless an error occurred or the process was canceled by
|
133
|
+
the operator (in case introspection was aborted)
|
134
|
+
|
135
|
+
### Abort an ongoing introspection
|
136
|
+
|
137
|
+
To abort a node introspection:
|
138
|
+
```ruby
|
139
|
+
inspector.abort_introspection(node_id)
|
140
|
+
```
|
141
|
+
|
142
|
+
### Retrieve introspected data
|
143
|
+
|
144
|
+
```ruby
|
145
|
+
inspector.get_introspection_details(node_id)
|
146
|
+
```
|
147
|
+
The response body will provide a *very* long list of information about the node.
|
148
|
+
|
149
|
+
## DSL rules
|
150
|
+
|
151
|
+
### Create rules
|
152
|
+
|
153
|
+
```ruby
|
154
|
+
rule_set1 = {
|
155
|
+
"description" => "Successful Rule",
|
156
|
+
"actions" => [
|
157
|
+
{
|
158
|
+
"action" => "set-attribute",
|
159
|
+
"path" => "/extra/rule_success",
|
160
|
+
"value" => "yes"
|
161
|
+
}
|
162
|
+
],
|
163
|
+
"conditions" => [
|
164
|
+
{
|
165
|
+
"field" => "memory_mb",
|
166
|
+
"op" => "ge",
|
167
|
+
"value" => 256
|
168
|
+
},
|
169
|
+
{
|
170
|
+
"field" => "local_gb",
|
171
|
+
"op" => "ge",
|
172
|
+
"value" => 1
|
173
|
+
}
|
174
|
+
]
|
175
|
+
}
|
176
|
+
|
177
|
+
rule_set2 = {
|
178
|
+
"description" => "Failing Rule",
|
179
|
+
"actions" => [
|
180
|
+
{
|
181
|
+
"action" => "set-attribute",
|
182
|
+
"path" => "/extra/rule_success",
|
183
|
+
"value" => "no"
|
184
|
+
},
|
185
|
+
{
|
186
|
+
"action" => "fail",
|
187
|
+
"message" => "This rule should not have run"
|
188
|
+
}
|
189
|
+
],
|
190
|
+
"conditions" => [
|
191
|
+
{
|
192
|
+
"field" => "memory_mb",
|
193
|
+
"op" => "lt",
|
194
|
+
"value" => 42
|
195
|
+
},
|
196
|
+
{
|
197
|
+
"field" => "local_gb",
|
198
|
+
"op" => "eq",
|
199
|
+
"value" => 0
|
200
|
+
}
|
201
|
+
],
|
202
|
+
}
|
203
|
+
|
204
|
+
inspector.create_rules(rule_set1)
|
205
|
+
inspector.create_rules(rule_set2)
|
206
|
+
```
|
207
|
+
|
208
|
+
### List all rules
|
209
|
+
|
210
|
+
```ruby
|
211
|
+
inspector.list_rules.body
|
212
|
+
=> {"rules"=>
|
213
|
+
[{"description"=>"Successful Rule",
|
214
|
+
"links"=>[{"href"=>"/v1/rules/4bf1bf40-d30f-4f31-a970-f0290d7e751b", "rel"=>"self"}],
|
215
|
+
"uuid"=>"4bf1bf40-d30f-4f31-a970-f0290d7e751b"},
|
216
|
+
{"description"=>"Failing Rule",
|
217
|
+
"links"=>[{"href"=>"/v1/rules/0d6e6687-3f69-4c14-8cab-ea6ada78036f", "rel"=>"self"}],
|
218
|
+
"uuid"=>"0d6e6687-3f69-4c14-8cab-ea6ada78036f"}]}
|
219
|
+
```
|
220
|
+
|
221
|
+
### Show rules details
|
222
|
+
|
223
|
+
```ruby
|
224
|
+
inspector.get_rules('0d6e6687-3f69-4c14-8cab-ea6ada78036f').body
|
225
|
+
=> {"actions"=>
|
226
|
+
[{"action"=>"set-attribute", "path"=>"/extra/rule_success", "value"=>"no"},
|
227
|
+
{"action"=>"fail", "message"=>"This rule should not have run"}],
|
228
|
+
"conditions"=>[{"field"=>"memory_mb", "op"=>"lt", "value"=>42}, {"field"=>"local_gb", "op"=>"eq", "value"=>0}],
|
229
|
+
"description"=>"Failing Rule",
|
230
|
+
"links"=>[{"href"=>"/v1/rules/0d6e6687-3f69-4c14-8cab-ea6ada78036f", "rel"=>"self"}],
|
231
|
+
"uuid"=>"0d6e6687-3f69-4c14-8cab-ea6ada78036f"}
|
232
|
+
```
|
233
|
+
|
234
|
+
### Delete a specific rules set
|
235
|
+
|
236
|
+
```ruby
|
237
|
+
inspector.delete_rules'0d6e6687-3f69-4c14-8cab-ea6ada78036f')
|
238
|
+
inspector.list_rules.body
|
239
|
+
=> {"rules"=>
|
240
|
+
[{"description"=>"Successful Rule",
|
241
|
+
"links"=>[{"href"=>"/v1/rules/4bf1bf40-d30f-4f31-a970-f0290d7e751b", "rel"=>"self"}],
|
242
|
+
"uuid"=>"4bf1bf40-d30f-4f31-a970-f0290d7e751b"}]}
|
243
|
+
```
|
244
|
+
|
245
|
+
### Destroys all rules
|
246
|
+
|
247
|
+
```ruby
|
248
|
+
inspector.delete_rules_all
|
249
|
+
inspector.list_rules.body
|
250
|
+
=> {"rules"=>[]}
|
251
|
+
```
|
@@ -20,9 +20,23 @@ service = Fog::Metering::OpenStack.new({
|
|
20
20
|
|
21
21
|
## Events
|
22
22
|
|
23
|
-
* `service.events`: Return a list of events.
|
23
|
+
* `service.events([<query_filter>])`: Return a list of events.
|
24
24
|
* `service.events.find_by_id(<message_id>)`: Return the event matching message_id, or nil if no such event exists.
|
25
25
|
|
26
|
+
### Filter events example
|
27
|
+
|
28
|
+
Return events newer than 2016-03-17T09:59:44.606000.
|
29
|
+
|
30
|
+
```ruby
|
31
|
+
query_filter = [{
|
32
|
+
'field' => 'start_timestamp',
|
33
|
+
'op' => 'gt',
|
34
|
+
'value' => '2016-03-17T09:59:44.606000'
|
35
|
+
}]
|
36
|
+
|
37
|
+
service.events(query_filter)
|
38
|
+
```
|
39
|
+
|
26
40
|
## Resources
|
27
41
|
|
28
42
|
* `service.resources`: Return a list of resources.
|