Guide: OpenStack Python SDK – Basic Usage: Difference between revisions
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 | ||
== 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)