5 releases (3 breaking)

0.4.0 Apr 5, 2024
0.3.0 Mar 15, 2024
0.2.0 Feb 23, 2024
0.1.1 Feb 16, 2024
0.1.0 Feb 13, 2024

#2 in #open-stack

Download history 153/week @ 2024-02-11 193/week @ 2024-02-18 96/week @ 2024-02-25 24/week @ 2024-03-03 115/week @ 2024-03-10 34/week @ 2024-03-17 1/week @ 2024-03-24 108/week @ 2024-03-31 31/week @ 2024-04-07 3/week @ 2024-04-14

152 downloads per month
Used in openstack_cli

Apache-2.0

5.5MB
118K SLoC

OpenStack API bindings (SDK)

Every platform API requires SDK bindings to various programming languages. OpenStack API bindings for Rust are not an exception. The OpenStack comes with openstack_sdk crate providing an SDK with both synchronous and asynchronous interfaces.

API bindings are generated from the OpenAPI specs of corresponding services. That means that those are only wrapping the API and usually not providing additional convenience features.

Features

  • Sync and Async interface
  • Query, Find and Pagination interfaces implementing basic functionality
  • RawQuery interface providing more control over the API invocation with upload and download capabilities.
  • Every combination of URL + http method + body schema is represented by a dedicated module

Structure

Every single API call is represented by a dedicated module with a structure implementing REST Endpoint interface. That means that a GET operation is a dedicated implementation compared to a POST operation. Like described in the Structure document every RPC-like action and every microversion is implemented with a single module.

Using

The simplest example demonstrating how to list compute flavors:

use openstack_sdk::api::{paged, Pagination, QueryAsync};
use openstack_sdk::{AsyncOpenStack, config::ConfigFile, OpenStackError};
use openstack_sdk::types::ServiceType;
use openstack_sdk::api::compute::v2::flavor::list;

async fn list_flavors() -> Result<(), OpenStackError> {
    // Get the builder for the listing Flavors Endpoint
    let mut ep_builder = list::Request::builder();
    // Set the `min_disk` query param
    ep_builder.min_disk("15");
    let ep = ep_builder.build().unwrap();

    let cfg = ConfigFile::new().unwrap();
    // Get connection config from clouds.yaml/secure.yaml
    let profile = cfg.get_cloud_config("devstack".to_string()).unwrap().unwrap();
    // Establish connection
    let mut session = AsyncOpenStack::new(&profile).await?;

    // Invoke service discovery when desired.
    session.discover_service_endpoint(&ServiceType::Compute).await?;

    // Execute the call with pagination limiting maximum amount of entries to 1000
    let data: Vec<serde_json::Value> = paged(ep, Pagination::Limit(1000))
        .query_async(&session)
        .await.unwrap();

    println!("Data = {:?}", data);
    Ok(())
}

Documentation

Crate documentation is published here

Project documentation is available here

Dependencies

~12–24MB
~374K SLoC