ninech/netbox-client-ruby

View on GitHub
README.md

Summary

Maintainability
Test Coverage
# NetboxClientRuby

[![Build Status](https://travis-ci.org/ninech/netbox-client-ruby.svg?branch=master)](https://travis-ci.org/ninech/netbox-client-ruby)
[![Gem Version](https://badge.fury.io/rb/netbox-client-ruby.svg)](https://badge.fury.io/rb/netbox-client-ruby)
[![Code Climate](https://codeclimate.com/github/ninech/netbox-client-ruby/badges/gpa.svg)](https://codeclimate.com/github/ninech/netbox-client-ruby)

This is a gem to pragmatically access your [Netbox instance](https://github.com/digitalocean/netbox)
via it's API from Ruby. This gem is currently only compatible with Netbox v2.4 or newer.

## Installation

Add this line to your application's Gemfile:

```ruby
gem 'netbox-client-ruby'
```

If your application already uses Faraday 0.x or 1.x and you cannot otherwise upgrade to Faraday 2, you must also add this line to your application's Gemfile:

```ruby
gem 'faraday_middleware' # remove when upgrading to Faraday 2+
```

And then execute:

    $ bundle

Or install it manually:

    $ gem install netbox-client-ruby

## Usage

### Configuration

Put this somewhere, where it runs, before any call to anything else of Netbox.
If you are using Rails, then this would probably be somewhere underneath /config.

```ruby
require 'netbox-client-ruby'
NetboxClientRuby.configure do |config|
  config.netbox.auth.token = 'YOUR_API_TOKEN'
  config.netbox.api_base_url = 'http://netbox.local/api/'

  # these are optional:
  config.netbox.auth.rsa_private_key.path = '~/.ssh/netbox_rsa'
  config.netbox.auth.rsa_private_key.password = ''
  config.netbox.pagination.default_limit = 50
  config.faraday.adapter = Faraday.default_adapter
  config.faraday.request_options = { open_timeout: 1, timeout: 5 }
  config.faraday.logger = :logger # built-in options: :logger, :detailed_logger; default: nil
end
```

### Structure

The methods are aligned with the API as it is defined in Netbox.
You can explore the API endpoints in your browser by opening the API endpoint. Usually that's `http://YOUR_NETBOX/api/`.

So if the URL is `/api/dcim/sites.json`, then the corresponding Ruby code would be `NetboxClientRuby.dcim.sites`.

### Examples

```ruby
# configuration
NetboxClientRuby.configure do |c|
  c.netbox.auth.token = '2e35594ec8710e9922d14365a1ea66f27ea69450'
  c.netbox.api_base_url = 'http://netbox.local/api/'
  c.netbox.auth.rsa_private_key.path = '~/.ssh/netbox_rsa'
end

# get all sites
sites = NetboxClientRuby.dcim.sites
puts "There are #{sites.total} sites in your Netbox instance."

# get the first site of the result set
first_site = sites.first
puts "The first site is called #{first_site.name}."

# filter devices by site
# Note that Netbox filters by *slug*
devices_of_site = NetboxClientRuby.dcim.devices.filter(site: first_site.slug)
puts "#{devices_of_site.total} devices belong to the site. #{devices_of_site}.length devices have been fetched."

# Finds a specific device
NetboxClientRuby.dcim.devices.find_by(name: 'my-device', other_field: 'other-value')

# Finds a specific device with a certain custom field
NetboxClientRuby.dcim.devices.find_by(cf_custom_url: 'https://google.com')

# Or a mix of regular and custom fields
NetboxClientRuby.dcim.devices.find_by(name: 'my-device', cf_custom_field: 'custom-value')

# get a site by id
s = NetboxClientRuby.dcim.site(1)

# update a site
s.update(name: 'Zurich', slug: 'zrh')

# update a site (alternative)
s.name = 'Amsterdam'
s.slug = 'ams'
s.save

# create a site
new_s = NetboxClientRuby::DCIM::Site.new
new_s.name = 'Berlin'
new_s.slug = 'ber'
new_s.save

# create a site (alternative)
new_s = NetboxClientRuby::DCIM::Site
          .new(name: 'Berlin', slug: 'ber')
          .save

# delete a site
s = NetboxClientRuby.dcim.site(1)
s.delete

# working with secrets
secrets = NetboxClientRuby.secrets.secrets
puts "#{secrets.total} secrets are in your Netbox."
secrets[0].plaintext # => nil, because you have not yet defined a session_key
NetboxClientRuby.secrets.get_session_key # now get a session_key
secrets = NetboxClientRuby.secrets.secrets # you must reload the data from the server
secrets[0].plaintext # => 'super secret password'

# optionally, you can persist the session_key:
session_key = NetboxClientRuby.secrets.get_session_key.session_key
FILE_NAME = File.expand_path('~/.netbox_session_key').freeze
File.write(FILE_NAME, session_key)

# later on, you can restore the persisted session_key:
persisted_session_key = File.read(FILE_NAME)
NetboxClientRuby.secrets.session_key = persisted_session_key
```

## Available Objects

Not all objects which the Netbox API exposes are currently implemented. Implementing new objects
[is trivial](https://github.com/ninech/netbox-client-ruby/commit/e3cee19d21a8a6ce480d7c03d23d7c3fbc92417a), though.

* Circuits:
  * Circuits: `NetboxClientRuby.circuits.circuits`
  * Circuit Types: `NetboxClientRuby.circuits.circuit_types`
  * Circuit Terminations: `NetboxClientRuby.circuits.circuit_terminations`
  * Providers: `NetboxClientRuby.circuits.providers`
* DCIM:
  * Console Connections: `NetboxClientRuby.dcim.console_connections`
  * Console Ports: `NetboxClientRuby.dcim.console_ports`
  * Console Server Ports: `NetboxClientRuby.dcim.console_server_ports`
  * Devices: `NetboxClientRuby.dcim.devices`
  * Device Roles: `NetboxClientRuby.dcim.device_roles`
  * Device Types: `NetboxClientRuby.dcim.device_types`
  * Interfaces: `NetboxClientRuby.dcim.interfaces`
  * Interface Connections: `NetboxClientRuby.dcim.interface_connections`
  * Manufacturers: `NetboxClientRuby.dcim.manufacturers`
  * Platforms: `NetboxClientRuby.dcim.platforms`
  * Power Connections: `NetboxClientRuby.dcim.power_connections`
  * Power Outlets: `NetboxClientRuby.dcim.power_outlets`
  * Power Ports: `NetboxClientRuby.dcim.power_ports`
  * Racks: `NetboxClientRuby.dcim.racks`
  * Rack Groups: `NetboxClientRuby.dcim.rack_groups`
  * Rack Roles: `NetboxClientRuby.dcim.rack_roles`
  * Rack Reservations: `NetboxClientRuby.dcim.rack_reservations`
  * Regions: `NetboxClientRuby.dcim.regions`
  * Sites: `NetboxClientRuby.dcim.sites`
  * Virtual Chassis: `NetboxClientRuby.dcim.virtual_chassis_list`
    (⚠️ Exception: The access is different and the class is called `VirtualChassisList` because the plural and singular
    names are the same and this poses a conflict.)
* Extras:
  * Config Contexts: `NetboxClientRuby.extras.config_contexts`
  * Journal Entries: `NetboxClientRuby.extras.journal_entries`
  * Tags: `NetboxClientRuby.extras.tags`
* IPAM:
  * Aggregates: `NetboxClientRuby.ipam.aggregates`
  * IP Addresses: `NetboxClientRuby.ipam.ip_addresses`
  * IP Ranges: `NetboxClientRuby.ipam.ip_ranges`
  * Prefixes: `NetboxClientRuby.ipam.prefixes`
  * RIRs: `NetboxClientRuby.ipam.rirs`
  * Roles: `NetboxClientRuby.ipam.roles`
  * Services: `NetboxClientRuby.ipam.services`
  * VLANs: `NetboxClientRuby.ipam.vlans`
  * VLAN Groups: `NetboxClientRuby.ipam.vlan_groups`
  * VRFs: `NetboxClientRuby.ipam.vrfs`
* Secrets:
  * Secrets: `NetboxClientRuby.secrets.secrets`
  * Secret Roles: `NetboxClientRuby.secrets.secret_roles`
  * generate-rsa-key-pair: `NetboxClientRuby.secrets.generate_rsa_key_pair`
  * get-session-key: `NetboxClientRuby.secrets.get_session_key`
* Tenancy:
  * Tenant: `NetboxClientRuby.tenancy.tenants`
  * Tenant Groups: `NetboxClientRuby.tenancy.tenant_groups`
* Virtualization:
  * Cluster Types: `NetboxClientRuby.virtualization.cluster_types`
  * Cluster Groups: `NetboxClientRuby.virtualization.cluster_groups`
  * Clusters: `NetboxClientRuby.virtualization.clusters`
  * Virtual Machines: `NetboxClientRuby.virtualization.virtual_machines`
  * Interfaces: `NetboxClientRuby.virtualization.interfaces`

If you can't find the object you need, also check
[the source code](https://github.com/ninech/netbox-client-ruby/tree/master/lib/netbox_client_ruby/api)
if it was added in the meantime without the list above having been updated.

## Development

After checking out the repo, run `bin/setup` to install dependencies.
Then, run `rake spec` to run the tests.

To install this gem onto your local machine, run `bundle exec rake install`.

To experiment interactively, fire up the Netbox Docker container by running `docker-compose up -d`.
Then, run `bin/console` for an interactive prompt that will allow you to experiment against your local Netbox.

### Load Development Data

To simplify development, e.g. via the `bin/console` described above, there is a very complete sample set of Netbox data readily available.
You can use it to query almost every object and relation in Netbox.

```bash
docker exec -i netbox-client-ruby_postgres_1 psql -U postgres < dump.sql
```

### Dump Development from Database

Should you want to export the current set of data, use the command below.

```bash
docker-compose exec postgres pg_dump -U netbox --exclude-table-data=extras_objectchange -Cc netbox > dump.sql
```

(Remove `--exclude-table-data=extras_objectchange` from the command if you want to retain the history!)

## Contributing

Bug reports and pull requests are very welcome [on GitHub](https://github.com/ninech/netbox-client-ruby).

Before opening a PR, please

* extend the existing specs
* run rspec
* run rubocop and fix your warnings
* check if this README.md file needs adjustments

## License

The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).

## About

This gem is currently maintained and funded by [nine](https://nine.ch).

[![logo of the company 'nine'](https://logo.apps.at-nine.ch/Dmqied_eSaoBMQwk3vVgn4UIgDo=/trim/500x0/logo_claim.png)](https://www.nine.ch)