2012-07-09 12:15:40 -04:00
|
|
|
![fog](http://geemus.s3.amazonaws.com/fog.png)
|
2009-05-18 03:13:06 -04:00
|
|
|
|
2012-11-30 13:18:14 -05:00
|
|
|
fog is the Ruby cloud services library, top to bottom:
|
2010-11-01 02:25:00 -04:00
|
|
|
|
2010-09-07 13:51:26 -04:00
|
|
|
* Collections provide a simplified interface, making clouds easier to work with and switch between.
|
2010-03-23 01:32:01 -04:00
|
|
|
* Requests allow power users to get the most out of the features of each individual cloud.
|
|
|
|
* Mocks make testing and integrating a breeze.
|
2009-09-15 00:32:02 -04:00
|
|
|
|
2012-08-16 16:11:02 -04:00
|
|
|
[![Build Status](https://secure.travis-ci.org/fog/fog.png?branch=master)](http://travis-ci.org/fog/fog)
|
2012-11-13 12:44:01 -05:00
|
|
|
[![Code Climate](https://codeclimate.com/badge.png)](https://codeclimate.com/github/fog/fog)
|
2012-12-13 18:51:43 -05:00
|
|
|
[![Gem Version](https://fury-badge.herokuapp.com/rb/fog.png)](http://badge.fury.io/rb/fog)
|
2012-12-19 16:01:49 -05:00
|
|
|
[![Dependency Status](https://gemnasium.com/fog/fog.png)](https://gemnasium.com/fog/fog)
|
2012-08-16 16:11:02 -04:00
|
|
|
|
2012-07-09 12:15:40 -04:00
|
|
|
## Getting Started
|
2009-09-15 00:32:02 -04:00
|
|
|
|
2012-07-09 12:15:40 -04:00
|
|
|
sudo gem install fog
|
2010-01-15 00:31:19 -05:00
|
|
|
|
2012-07-09 12:15:40 -04:00
|
|
|
Now type `fog` to try stuff, confident that fog will let you know what to do.
|
|
|
|
Here is an example of wading through server creation for Amazon Elastic Compute Cloud:
|
2010-01-15 00:31:19 -05:00
|
|
|
|
2012-12-23 03:14:48 -05:00
|
|
|
```ruby
|
|
|
|
server = Compute[:aws].servers.create
|
|
|
|
# => ArgumentError: image_id is required for this operation
|
2010-11-09 19:09:46 -05:00
|
|
|
|
2012-12-23 03:14:48 -05:00
|
|
|
server = Compute[:aws].servers.create(:image_id => 'ami-5ee70037')
|
|
|
|
# => <Fog::AWS::EC2::Server [...]>
|
2010-11-09 19:09:46 -05:00
|
|
|
|
2012-12-23 03:14:48 -05:00
|
|
|
server.destroy # cleanup after yourself or regret it, trust me
|
|
|
|
# => true
|
|
|
|
```
|
2010-01-15 00:31:19 -05:00
|
|
|
|
2012-07-09 12:15:40 -04:00
|
|
|
## Collections
|
2010-01-15 00:31:19 -05:00
|
|
|
|
2010-12-13 17:32:25 -05:00
|
|
|
A high level interface to each cloud is provided through collections, such as `images` and `servers`.
|
2012-07-09 12:15:40 -04:00
|
|
|
You can see a list of available collections by calling `collections` on the connection object.
|
|
|
|
You can try it out using the `fog` command:
|
2010-11-01 02:25:00 -04:00
|
|
|
|
2012-12-23 03:14:48 -05:00
|
|
|
```ruby
|
|
|
|
Compute[:aws].collections
|
|
|
|
# => [:addresses, :directories, ..., :volumes, :zones]
|
|
|
|
```
|
2010-01-15 00:33:48 -05:00
|
|
|
|
2011-01-04 18:23:21 -05:00
|
|
|
Some collections are available across multiple providers:
|
|
|
|
|
2012-07-09 12:15:40 -04:00
|
|
|
* compute providers have `flavors`, `images` and `servers`
|
|
|
|
* dns providers have `zones` and `records`
|
|
|
|
* storage providers have `directories` and `files`
|
2010-11-01 02:25:00 -04:00
|
|
|
|
2010-12-13 17:32:25 -05:00
|
|
|
Collections share basic CRUD type operations, such as:
|
2012-07-09 12:15:40 -04:00
|
|
|
|
|
|
|
* `all` - fetch every object of that type from the provider.
|
|
|
|
* `create` - initialize a new record locally and a remote resource with the provider.
|
|
|
|
* `get` - fetch a single object by it's identity from the provider.
|
|
|
|
* `new` - initialize a new record locally, but do not create a remote resource with the provider.
|
2010-01-15 00:33:48 -05:00
|
|
|
|
2010-06-13 21:10:32 -04:00
|
|
|
As an example, we'll try initializing and persisting a Rackspace Cloud server:
|
2009-09-15 00:32:02 -04:00
|
|
|
|
2012-12-23 03:14:48 -05:00
|
|
|
```ruby
|
|
|
|
require 'fog'
|
2009-09-15 00:32:02 -04:00
|
|
|
|
2012-12-23 03:14:48 -05:00
|
|
|
compute = Fog::Compute.new(
|
|
|
|
:provider => 'Rackspace',
|
|
|
|
:rackspace_api_key => key,
|
|
|
|
:rackspace_username => username
|
|
|
|
)
|
2010-01-15 00:19:48 -05:00
|
|
|
|
2012-12-23 03:14:48 -05:00
|
|
|
# boot a gentoo server (flavor 1 = 256, image 3 = gentoo 2008.0)
|
|
|
|
server = compute.servers.create(:flavor_id => 1, :image_id => 3, :name => 'my_server')
|
|
|
|
server.wait_for { ready? } # give server time to boot
|
2010-01-15 00:19:48 -05:00
|
|
|
|
2012-12-23 03:14:48 -05:00
|
|
|
# DO STUFF
|
2010-01-15 00:19:48 -05:00
|
|
|
|
2012-12-23 03:14:48 -05:00
|
|
|
server.destroy # cleanup after yourself or regret it, trust me
|
|
|
|
```
|
2010-01-15 00:19:48 -05:00
|
|
|
|
2012-07-09 12:15:40 -04:00
|
|
|
## Models
|
2010-01-15 00:19:48 -05:00
|
|
|
|
2010-12-13 17:32:25 -05:00
|
|
|
Many of the collection methods return individual objects, which also provide common methods:
|
2010-03-23 01:32:01 -04:00
|
|
|
|
2012-07-09 12:15:40 -04:00
|
|
|
* `destroy` - will destroy the persisted object from the provider
|
|
|
|
* `save` - persist the object to the provider
|
|
|
|
* `wait_for` - takes a block and waits for either the block to return true for the object or for a timeout (defaults to 10 minutes)
|
|
|
|
|
|
|
|
## Mocks
|
2009-09-15 00:32:02 -04:00
|
|
|
|
2010-12-13 17:32:25 -05:00
|
|
|
As you might imagine, testing code using Fog can be slow and expensive, constantly turning on and and shutting down instances.
|
|
|
|
Mocking allows skipping this overhead by providing an in memory representation resources as you make requests.
|
|
|
|
Enabling mocking easy to use, before you run other commands, simply run:
|
2010-03-23 01:32:01 -04:00
|
|
|
|
2012-12-23 03:14:48 -05:00
|
|
|
```ruby
|
|
|
|
Fog.mock!
|
|
|
|
```
|
2010-03-23 01:32:01 -04:00
|
|
|
|
2012-07-09 12:15:40 -04:00
|
|
|
Then proceed as usual, if you run into unimplemented mocks, fog will raise an error and as always contributions are welcome!
|
2010-03-23 01:32:01 -04:00
|
|
|
|
2012-07-09 12:15:40 -04:00
|
|
|
## Requests
|
2010-03-23 01:32:01 -04:00
|
|
|
|
|
|
|
Requests allow you to dive deeper when the models just can't cut it.
|
2012-07-09 12:15:40 -04:00
|
|
|
You can see a list of available requests by calling `#requests` on the connection object.
|
2010-12-13 17:32:25 -05:00
|
|
|
|
|
|
|
For instance, ec2 provides methods related to reserved instances that don't have any models (yet). Here is how you can lookup your reserved instances:
|
2010-03-23 01:32:01 -04:00
|
|
|
|
2012-07-09 12:15:40 -04:00
|
|
|
$ fog
|
|
|
|
>> Compute[:aws].describe_reserved_instances
|
|
|
|
#<Excon::Response [...]>
|
2009-09-15 00:32:02 -04:00
|
|
|
|
2012-07-09 12:15:40 -04:00
|
|
|
It will return an [excon](http://github.com/geemus/excon) response, which has `body`, `headers` and `status`. Both return nice hashes.
|
2009-09-15 00:32:02 -04:00
|
|
|
|
2012-07-09 12:15:40 -04:00
|
|
|
## Go forth and conquer
|
2009-09-15 00:32:02 -04:00
|
|
|
|
2012-07-09 12:15:40 -04:00
|
|
|
Play around and use the console to explore or check out [fog.io](http://fog.io) for more details and examples.
|
|
|
|
Once you are ready to start scripting fog, here is a quick hint on how to make connections without the command line thing to help you.
|
2010-11-17 14:40:38 -05:00
|
|
|
|
2012-12-23 03:14:48 -05:00
|
|
|
```ruby
|
|
|
|
# create a compute connection
|
|
|
|
compute = Fog::Compute.new(:provider => 'AWS', :aws_access_key_id => ACCESS_KEY_ID, :aws_secret_access_key => SECRET_ACCESS_KEY)
|
|
|
|
# compute operations go here
|
2010-11-17 14:40:38 -05:00
|
|
|
|
2012-12-23 03:14:48 -05:00
|
|
|
# create a storage connection
|
|
|
|
storage = Fog::Storage.new(:provider => 'AWS', :aws_access_key_id => ACCESS_KEY_ID, :aws_secret_access_key => SECRET_ACCESS_KEY)
|
|
|
|
# storage operations go here
|
|
|
|
```
|
2010-11-17 14:40:38 -05:00
|
|
|
|
|
|
|
geemus says: "That should give you everything you need to get started, but let me know if there is anything I can do to help!"
|
2009-09-15 00:32:02 -04:00
|
|
|
|
2012-07-09 12:15:40 -04:00
|
|
|
## Contributing
|
2011-02-09 17:54:56 -05:00
|
|
|
|
2012-11-14 18:58:21 -05:00
|
|
|
* Find something you would like to work on.
|
|
|
|
* Look for anything you can help with in the [issue tracker](https://github.com/fog/fog/issues).
|
|
|
|
* Look at the [code quality metrics](https://codeclimate.com/github/fog/fog) for anything you can help clean up.
|
|
|
|
* Or anything else!
|
2011-02-09 17:54:56 -05:00
|
|
|
* Fork the project and do your work in a topic branch.
|
2012-11-14 18:58:21 -05:00
|
|
|
* Make sure your changes will work on both Ruby 1.8.7 and Ruby 1.9
|
|
|
|
* Add a config at `tests/.fog` for the component you want to test.
|
2011-02-09 17:54:56 -05:00
|
|
|
* Add shindo tests to prove your code works and run all the tests using `bundle exec rake`.
|
2012-11-14 18:58:21 -05:00
|
|
|
* Rebase your branch against `fog/fog` to make sure everything is up to date.
|
2011-02-09 17:54:56 -05:00
|
|
|
* Commit your changes and send a pull request.
|
|
|
|
|
2012-07-09 12:15:40 -04:00
|
|
|
## Additional Resources
|
2009-09-15 00:32:02 -04:00
|
|
|
|
2012-07-09 12:15:40 -04:00
|
|
|
[fog.io](http://fog.io)
|
2009-09-15 00:32:02 -04:00
|
|
|
|
2012-07-09 12:15:40 -04:00
|
|
|
## Copyright
|
2009-05-18 03:13:06 -04:00
|
|
|
|
2009-09-15 00:36:20 -04:00
|
|
|
(The MIT License)
|
|
|
|
|
2012-07-09 12:15:40 -04:00
|
|
|
Copyright (c) 2010 [geemus (Wesley Beary)](http://github.com/geemus)
|
2009-09-15 00:36:20 -04:00
|
|
|
|
|
|
|
Permission is hereby granted, free of charge, to any person obtaining
|
|
|
|
a copy of this software and associated documentation files (the
|
|
|
|
"Software"), to deal in the Software without restriction, including
|
|
|
|
without limitation the rights to use, copy, modify, merge, publish,
|
|
|
|
distribute, sublicense, and/or sell copies of the Software, and to
|
|
|
|
permit persons to whom the Software is furnished to do so, subject to
|
|
|
|
the following conditions:
|
|
|
|
|
|
|
|
The above copyright notice and this permission notice shall be
|
|
|
|
included in all copies or substantial portions of the Software.
|
|
|
|
|
|
|
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
|
|
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
|
|
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
|
|
|
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
|
|
|
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
|
|
|
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
|
|
|
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|