Guide: OpenStack Python SDK – Basic Usage: Difference between revisions

From bwCloud-OS
Jump to navigation Jump to search
No edit summary
No edit summary
Line 17: Line 17:
* source an OpenRC file, or
* source an OpenRC file, or
* use a clouds.yaml file
* use a clouds.yaml file
Example (clouds.yaml):<pre>
clouds:
  openstack:
    auth:
      auth_url: https://your-auth-url:5000/v3
      application_credential_id: "YOUR_ID"
      application_credential_secret: "YOUR_SECRET"
    region_name: "RegionOne"
    interface: "public"
    identity_api_version: 3
    auth_type: "v3applicationcredential"
</pre>


== Basic Connection ==
== Basic Connection ==
Line 41: Line 28:


=== Instances ===
=== Instances ===
List instances:<pre>
List instances:
 
<pre>
for server in conn.compute.servers():
for server in conn.compute.servers():
     print(server.name, server.status)
     print(server.name, server.status)
</pre>Create an instance:<pre>
</pre>
 
Create an instance:
<pre>
image = conn.compute.find_image("ubuntu-24.04")
image = conn.compute.find_image("ubuntu-24.04")
flavor = conn.compute.find_flavor("p1.tiny")
flavor = conn.compute.find_flavor("p1.tiny")
network = conn.network.find_network("myNet")
network = conn.network.find_network("myNet")
server = conn.compute.create_server(
server = conn.compute.create_server(
     name="myVM",
     name="myVM",
Line 56: Line 47:
     key_name="myKey"
     key_name="myKey"
)
)
server = conn.compute.wait_for_server(server)
server = conn.compute.wait_for_server(server)
print("Created:", server.name)
print("Created:", server.name)
</pre>Delete an instance:<pre>
</pre>
 
Delete an instance:
 
<pre>
server = conn.compute.find_server("myVM")
server = conn.compute.find_server("myVM")
conn.compute.delete_server(server.id)
conn.compute.delete_server(server.id)
Line 65: Line 59:


=== Images ===
=== Images ===
List images:<pre>
List images:
 
<pre>
for image in conn.compute.images():
for image in conn.compute.images():
     print(image.name)
     print(image.name)
</pre>
</pre>


== Storage ==
== Storage ==


=== Volumes ===
=== Volumes ===
List volumes:<pre>
 
List volumes:
 
<pre>
for vol in conn.block_storage.volumes():
for vol in conn.block_storage.volumes():
     print(vol.name, vol.size)
     print(vol.name, vol.size)
</pre>Create a volume:<pre>
</pre>
 
Create a volume:
 
<pre>
volume = conn.block_storage.create_volume(
volume = conn.block_storage.create_volume(
     name="myVolume",
     name="myVolume",
     size=10
     size=10
)
)
</pre>Delete a volume:<pre>
</pre>
 
Delete a volume:
 
<pre>
volume = conn.block_storage.find_volume("myVolume")
volume = conn.block_storage.find_volume("myVolume")
conn.block_storage.delete_volume(volume.id)
conn.block_storage.delete_volume(volume.id)
Line 87: Line 95:


=== Volume Management for Instances ===
=== Volume Management for Instances ===
Attach a volume to an instance:<pre>
 
Attach a volume to an instance:
 
<pre>
server = conn.compute.find_server("myVM")
server = conn.compute.find_server("myVM")
volume = conn.block_storage.find_volume("myVolume")
volume = conn.block_storage.find_volume("myVolume")
conn.compute.create_volume_attachment(
conn.compute.create_volume_attachment(
     server,
     server,
     volumeId=volume.id
     volumeId=volume.id
)
)
</pre>Detach a volume:<pre>
</pre>
 
Detach a volume:
 
<pre>
attachments = conn.compute.volume_attachments(server)
attachments = conn.compute.volume_attachments(server)
for att in attachments:
for att in attachments:
Line 105: Line 119:


=== Networks ===
=== Networks ===
List networks:<pre>
List networks:
 
<pre>
for net in conn.network.networks():
for net in conn.network.networks():
     print(net.name)
     print(net.name)
</pre>Create a network:<pre>
</pre>
 
Create a network:
 
<pre>
network = conn.network.create_network(name="myNet")
network = conn.network.create_network(name="myNet")
</pre>Delete a network:<pre>
</pre>
 
Delete a network:
 
<pre>
network = conn.network.find_network("myNet")
network = conn.network.find_network("myNet")
conn.network.delete_network(network.id)
conn.network.delete_network(network.id)
Line 116: Line 140:


=== Floating IPs ===
=== Floating IPs ===
Create a floating IP:<pre>
 
Create a floating IP:
 
<pre>
fip = conn.network.create_ip(floating_network_id="provider_default_net")
fip = conn.network.create_ip(floating_network_id="provider_default_net")
print(fip.floating_ip_address)
print(fip.floating_ip_address)
</pre>Associate a floating IP with an instance:<pre>
</pre>
 
Associate a floating IP with an instance:
 
<pre>
server = conn.compute.find_server("myVM")
server = conn.compute.find_server("myVM")
conn.compute.add_floating_ip_to_server(server, fip.floating_ip_address)
conn.compute.add_floating_ip_to_server(server, fip.floating_ip_address)
</pre>Disassociate a floating IP:<pre>
</pre>
 
Disassociate a floating IP:
 
<pre>
conn.compute.remove_floating_ip_from_server(server, fip.floating_ip_address)
conn.compute.remove_floating_ip_from_server(server, fip.floating_ip_address)
</pre>Delete a floating IP:<pre>
</pre>
 
Delete a floating IP:
 
<pre>
conn.network.delete_ip(fip.id)
conn.network.delete_ip(fip.id)
</pre>
</pre>


=== Security Groups ===
=== Security Groups ===
List security groups:<pre>
 
List security groups:
 
<pre>
for sg in conn.network.security_groups():
for sg in conn.network.security_groups():
     print(sg.name)
     print(sg.name)
</pre>Create a security group:<pre>
</pre>
 
Create a security group:
 
<pre>
sg = conn.network.create_security_group(name="mySecGroup")
sg = conn.network.create_security_group(name="mySecGroup")
</pre>Add a rule (HTTP):<pre>
</pre>
 
Add a rule (HTTP):
 
<pre>
conn.network.create_security_group_rule(
conn.network.create_security_group_rule(
     security_group_id=sg.id,
     security_group_id=sg.id,
Line 142: Line 193:
     direction="ingress"
     direction="ingress"
)
)
</pre>Assign security group to an instance:<pre>
</pre>
 
Assign security group to an instance:
 
<pre>
server = conn.compute.find_server("myVM")
server = conn.compute.find_server("myVM")
conn.compute.add_security_group_to_server(server, sg.name)
conn.compute.add_security_group_to_server(server, sg.name)
</pre>Remove a security group from an instance:<pre>
</pre>
 
Remove a security group from an instance:
 
<pre>
conn.compute.remove_security_group_from_server(server, sg.name)
conn.compute.remove_security_group_from_server(server, sg.name)
</pre>Delete a security group:<pre>
</pre>
 
Delete a security group:
 
<pre>
conn.network.delete_security_group(sg.id)
conn.network.delete_security_group(sg.id)
</pre>
</pre>

Revision as of 21:49, 25 April 2026

This guide provides a quick introduction to managing your bwCloud-OS resources using the OpenStack Python SDK. It covers basic authentication and common operations for compute, storage, and networking.


Prerequisites

Install the OpenStack SDK (Ubuntu example):

sudo apt update
sudo apt install python3-openstacksdk -y

Alternatively (if not available via apt), you can install it via pip:

pip install openstacksdk

Authentication

The SDK uses the same configuration as the OpenStack CLI.

You can either:

  • source an OpenRC file, or
  • use a clouds.yaml file

Basic Connection

Create a connection in Python:

import openstack

conn = openstack.connect(cloud="openstack")

Compute

Instances

List instances:

for server in conn.compute.servers():
    print(server.name, server.status)

Create an instance:

image = conn.compute.find_image("ubuntu-24.04")
flavor = conn.compute.find_flavor("p1.tiny")
network = conn.network.find_network("myNet")
server = conn.compute.create_server(
    name="myVM",
    image_id=image.id,
    flavor_id=flavor.id,
    networks=[{"uuid": network.id}],
    key_name="myKey"
)
server = conn.compute.wait_for_server(server)
print("Created:", server.name)

Delete an instance:

server = conn.compute.find_server("myVM")
conn.compute.delete_server(server.id)

Images

List images:

for image in conn.compute.images():
    print(image.name)


Storage

Volumes

List volumes:

for vol in conn.block_storage.volumes():
    print(vol.name, vol.size)

Create a volume:

volume = conn.block_storage.create_volume(
    name="myVolume",
    size=10
)

Delete a volume:

volume = conn.block_storage.find_volume("myVolume")
conn.block_storage.delete_volume(volume.id)

Volume Management for Instances

Attach a volume to an instance:

server = conn.compute.find_server("myVM")
volume = conn.block_storage.find_volume("myVolume")
conn.compute.create_volume_attachment(
    server,
    volumeId=volume.id
)

Detach a volume:

attachments = conn.compute.volume_attachments(server)
for att in attachments:
    if att.volume_id == volume.id:
        conn.compute.delete_volume_attachment(att.id, server)

Networking

Networks

List networks:

for net in conn.network.networks():
    print(net.name)

Create a network:

network = conn.network.create_network(name="myNet")

Delete a network:

network = conn.network.find_network("myNet")
conn.network.delete_network(network.id)

Floating IPs

Create a floating IP:

fip = conn.network.create_ip(floating_network_id="provider_default_net")
print(fip.floating_ip_address)

Associate a floating IP with an instance:

server = conn.compute.find_server("myVM")
conn.compute.add_floating_ip_to_server(server, fip.floating_ip_address)

Disassociate a floating IP:

conn.compute.remove_floating_ip_from_server(server, fip.floating_ip_address)

Delete a floating IP:

conn.network.delete_ip(fip.id)


Security Groups

List security groups:

for sg in conn.network.security_groups():
    print(sg.name)

Create a security group:

sg = conn.network.create_security_group(name="mySecGroup")

Add a rule (HTTP):

conn.network.create_security_group_rule(
    security_group_id=sg.id,
    protocol="tcp",
    port_range_min=80,
    port_range_max=80,
    direction="ingress"
)

Assign security group to an instance:

server = conn.compute.find_server("myVM")
conn.compute.add_security_group_to_server(server, sg.name)

Remove a security group from an instance:

conn.compute.remove_security_group_from_server(server, sg.name)

Delete a security group:

conn.network.delete_security_group(sg.id)