Mulai

Mulai

Siapa yang harus membaca panduan ini?

Panduan ini untuk pengembang perangkat lunak berpengalaman yang ingin mengerahkan aplikasi ke awan OpenStack.

Jika Anda sudah familiar dengan OpenStack namun belum membuat aplikasi cloud secara umum atau aplikasi OpenStack pada khususnya, bagian ini mengajarkan Anda bagaimana memprogram dengan komponen OpenStack.

Apa yang akan kamu pelajari

Menerapkan aplikasi di lingkungan awan bisa sangat berbeda dengan menerapkannya di lingkungan TI tradisional. Panduan ini mengajarkan Anda cara menerapkan aplikasi pada OpenStack dan beberapa praktik terbaik untuk pengembangan aplikasi awan.

Gambaran umum

Tutorial ini menunjukkan dua aplikasi. Aplikasi pertama adalah generator fraktal sederhana yang menggunakan persamaan matematis untuk menghasilkan keindahan fractal images. Kami menunjukkan aplikasi ini secara keseluruhan sehingga Anda bisa membandingkannya dengan aplikasi kedua yang lebih kuat.

Aplikasi kedua adalah aplikasi OpenStack yang memungkinkan Anda untuk:

  • Buat dan hapus sumber daya komputasi. Sumber daya ini adalah instance mesin virtual tempat aplikasi Fractals berjalan.

  • Buat keputusan arsitektur cloud-related seperti mengubah fraction menjadi layanan micro-service dan memodulasinya.

  • Skala sumber daya yang tersedia naik dan turun.

  • Gunakan penyimpanan Object dan Block untuk file dan database persistence.

  • Gunakan layanan Orchestration untuk menyesuaikan diri secara otomatis dengan lingkungan.

  • Sesuaikan jaringan untuk kinerja dan segregasi yang lebih baik.

  • Jelajahi dan terapkan fitur awan OpenStack yang canggih.

Pilih SDK OpenStack Anda

Siapapun dengan latar belakang pemrograman dapat dengan mudah membaca kode dalam panduan ini. Meskipun panduan ini berfokus pada SDK tertentu, Anda dapat menggunakan bahasa dan toolkit lain dengan awan OpenStack:

OpenStack SDKs

Bahasa

Nama

Deskripsi

URL

Python

OpenStack SDK

Perpustakaan berbasis Python yang resmi untuk OpenStack.

https://docs.openstack.org/openstacksdk/latest/

Python

Libcloud

Perpustakaan berbasis Python yang dikelola Apache Foundation. Gunakan untuk bekerja dengan beberapa jenis awan.

https://libcloud.readthedocs.org/en/latest/compute/drivers/openstack.html

Python

Shade

Perpustakaan berbasis Python yang dikembangkan oleh tim OpenStack Infra. Gunakan untuk mengoperasikan beberapa awan OpenStack.

https://docs.openstack.org/infra/shade/

Java

jClouds

Perpustakaan berbasis Java yang dikelola Apache Foundation. Gunakan untuk bekerja dengan beberapa jenis awan.

https://jclouds.apache.org/guides/openstack/

Ruby

fog

SDK berbasis Ruby. Gunakan untuk bekerja dengan beberapa awan.

https://github.com/fog/fog-openstack/blob/master/docs/getting_started.md

node.js

pkgcloud

SDK berbasis Node.js. Gunakan bekerja dengan banyak awan.

https://github.com/pkgcloud/pkgcloud/tree/master/docs/providers/openstack

PHP

php-opencloud

Sebuah perpustakaan berbasis PHP. Gunakan untuk menulis kode PHP yang bekerja dengan awan OpenStack.

http://php-opencloud.readthedocs.org/en/latest/getting-started-with-openstack.html

.NET Framework

OpenStack SDK untuk Microsoft .NET

Perpustakaan berbasis .NET. Gunakan untuk menulis kode C ++ atau C # untuk aplikasi Microsoft.

https://www.nuget.org/packages/openstack.net

Go

gophercloud

SDK berbasis go. Gunakan untuk menulis kode Golang yang bekerja dengan awan OpenStack.

http://gophercloud.io/

Untuk daftar SDK yang tersedia, lihat Software Development Kits.

Versi lain dari panduan ini menunjukkan cara menggunakan SDK dan bahasa lainnya untuk menyelesaikan tugas ini. Jika Anda adalah pengembang untuk toolkit lain yang ingin disertakan dalam panduan ini, jangan ragu untuk mengirimkan cuplikan kode. Untuk informasi lebih lanjut, hubungi anggota OpenStack Documentation team.

Apa yang kau butuhkan

Kami berasumsi bahwa Anda sudah dapat mengakses awan OpenStack. Anda harus memiliki sebuah proyek, juga dikenal sebagai tenant (penyewa), dengan kuota minimal enam instance. Karena aplikasi Fractals berjalan di distribusi berbasis Ubuntu, Debian, Fedora, dan openSUSE, Anda harus membuat instance yang menggunakan salah satu dari sistem operasi ini.

Untuk berinteraksi dengan awan, Anda juga harus memiliki

libcloud 0.15.1 or higher installed.

Dapatkan informasi berikut dari penyedia awan Anda:

  • auth URL

  • user name

  • password

  • ID atau nama proyek (proyek juga dikenal sebagai tenant/penyewa)

  • cloud region

Anda juga bisa mendownload file RC OpenStack dari dashboard Horizon OpenStack. Masuk ke dasbor dan klik Project->Access & Security->API Access->Download OpenStack RC file. Jika Anda menggunakan metode ini, perhatikan bahwa "URL auth" tidak termasuk jalurnya. Misalnya, jika file openrc.sh Anda menunjukkan:

export OS_AUTH_URL=http://controller:5000/v2.0

URL auth sebenarnya adalah:

http://controller:5000

Bagaimana Anda berinteraksi dengan OpenStack

Dalam tutorial ini, Anda berinteraksi dengan awan OpenStack Anda melalui SDK yang Anda pilih di "Choose your OpenStack SDK." Panduan ini mengasumsikan bahwa Anda tahu cara menjalankan code snippet (cuplikan kode) dalam bahasa pilihan Anda.

Untuk mencobanya, tambahkan kode berikut ke skrip Python (atau gunakan shell Python interaktif) dengan memanggil python -i.

from libcloud.compute.types import Provider
from libcloud.compute.providers import get_driver

auth_username = 'your_auth_username'
auth_password = 'your_auth_password'
auth_url = 'http://controller:5000'
project_name = 'your_project_name_or_id'
region_name = 'your_region_name'

provider = get_driver(Provider.OPENSTACK)
conn = provider(auth_username,
                auth_password,
                ex_force_auth_url=auth_url,
                ex_force_auth_version='2.0_password',
                ex_tenant_name=project_name,
                ex_force_service_region=region_name)

Catatan

Karena tutorialnya menggunakan kembali obyek conn, pastikan selalu ada yang berguna.

Catatan

Jika Anda menerima pengecualian libcloud.common.types.InvalidCredsError: 'Invalid credentials with the provider' saat menjalankan salah satu panggilan API ini, periksa kembali kredensial Anda.

Catatan

Jika penyedia Anda tidak mendukung region (daerah), cobalah string kosong ('') untuk region_name.

Flavor dan image

Untuk menjalankan aplikasi Anda, Anda harus meluncurkan sebuah instance. Contoh ini berfungsi sebagai mesin virtual.

Untuk meluncurkan sebuah instance, Anda memilih flavor dan image. Flavor mewakili ukuran instance, termasuk jumlah CPU dan jumlah RAM dan ruang disk. Image adalah instalasi OS yang disiapkan dari mana Anda mengkloning instance Anda. Saat Anda melakukan booting di awan publik, flavor yang lebih besar bisa lebih mahal daripada yang lebih kecil dari segi sumber daya dan biaya moneter.

Untuk daftar image yang tersedia di awan Anda, jalankan beberapa panggilan API:

images = conn.list_images()
for image in images:
    print(image)

Kode ini menghasilkan output seperti ini:

<NodeImage: id=2cccbea0-cea9-4f86-a3ed-065c652adda5, name=ubuntu-14.04, driver=OpenStack  ...>
<NodeImage: id=f2a8dadc-7c7b-498f-996a-b5272c715e55, name=cirros-0.3.3-x86_64, driver=OpenStack  ...>

Anda juga bisa mendapatkan informasi tentang flavor yang tersedia:

flavors = conn.list_sizes()
for flavor in flavors:
    print(flavor)

Kode ini menghasilkan output seperti ini:

<OpenStackNodeSize: id=1, name=m1.tiny, ram=512, disk=1, bandwidth=None, price=0.0, driver=OpenStack, vcpus=1,  ...>
<OpenStackNodeSize: id=2, name=m1.small, ram=2048, disk=20, bandwidth=None, price=0.0, driver=OpenStack, vcpus=1,  ...>
<OpenStackNodeSize: id=3, name=m1.medium, ram=4096, disk=40, bandwidth=None, price=0.0, driver=OpenStack, vcpus=2,  ...>
<OpenStackNodeSize: id=4, name=m1.large, ram=8192, disk=80, bandwidth=None, price=0.0, driver=OpenStack, vcpus=4,  ...>
<OpenStackNodeSize: id=5, name=m1.xlarge, ram=16384, disk=160, bandwidth=None, price=0.0, driver=OpenStack, vcpus=8,  ...>

Flavor dan image Anda akan berbeda, tentu saja.

Pilih flavor dan image untuk instance Anda. Anda memerlukan RAM 1GB, 1 CPU, dan disk 1GB. Contoh ini menggunakan image Ubuntu dengan sedikit flavor, yang merupakan pilihan yang aman. Di bagian tutorial berikutnya dalam panduan ini, Anda harus mengubah ID image dan flavor agar sesuai dengan image dan flavor yang Anda pilih.

Jika image yang Anda inginkan tidak tersedia di awan Anda, biasanya Anda dapat mengunggahnya berdasarkan setelan kebijakan awan Anda. Untuk informasi tentang cara mengunggah image, lihat obtaining images.

Tetapkan variabel image dan ukuran ke nilai yang sesuai untuk awan Anda. Kami akan menggunakan variabel-variabel ini di bagian selanjutnya.

Pertama, beritahu koneksi untuk mendapatkan image tertentu dengan menggunakan ID image yang Anda pilih di bagian sebelumnya:

image_id = '2cccbea0-cea9-4f86-a3ed-065c652adda5'
image = conn.get_image(image_id)
print(image)

Kode ini menghasilkan output seperti ini:

<NodeImage: id=2cccbea0-cea9-4f86-a3ed-065c652adda5, name=ubuntu-14.04, driver=OpenStack  ...>

Selanjutnya, beritahu script yang flavor ingin Anda gunakan:

flavor_id = '2'
flavor = conn.ex_get_size(flavor_id)
print(flavor)

Kode ini menghasilkan output seperti ini:

<OpenStackNodeSize: id=2, name=m1.small, ram=2048, disk=20, bandwidth=None, price=0.0, driver=OpenStack, vcpus=1,  ...>

Sekarang, Anda bisa meluncurkan instance.

Luncurkan sebuah instance

Gunakan flavor dan image pilihan Anda untuk membuat sebuah instance.

Catatan

Contoh pembuatan instance berikut mengasumsikan bahwa Anda memiliki jaringan single-tenant. Jika Anda menerima kesalahan'Exception: 400 Bad Request Multiple possible networks found, use a Network ID to be more specific', Anda memiliki beberapa jaringan multiple-tenant. Anda harus menambahkan parameter networks ke panggilan yang membuat server. Lihat Appendix untuk rinciannya.

Buat instance.

Catatan

SDK Anda mungkin memanggil instance 'node' atau 'server'.

instance_name = 'testing'
testing_instance = conn.create_node(name=instance_name, image=image, size=flavor)
print(testing_instance)

Kode ini menghasilkan output seperti ini:

<Node: uuid=1242d56cac5bcd4c110c60d57ccdbff086515133, name=testing, state=PENDING, public_ips=[], private_ips=[], provider=OpenStack ...>

Jika Anda mendaftar instance yang ada:

instances = conn.list_nodes()
for instance in instances:
    print(instance)

Instance baru muncul.

<Node: uuid=1242d56cac5bcd4c110c60d57ccdbff086515133, name=testing, state=RUNNING, public_ips=[], private_ips=[], provider=OpenStack ...>

Sebelum melanjutkan, Anda harus melakukan satu hal lagi.

Hancurkan instance

Sumber daya awan, seperti instance yang tidak Anda gunakan lagi, bisa menghabiskan biaya. Untuk menghindari biaya tak terduga, hancurkan sumber daya awan.

conn.destroy_node(testing_instance)

Jika Anda mendaftar instance lagi, instance menghilang.

Biarkan shell Anda terbuka untuk menggunakannya pengerahan instance lain di bagian ini.

Terapkan aplikasi ke instance baru

Sekarang setelah Anda tahu cara membuat dan menghapus instance, Anda dapat menerapkan contoh aplikasi tersebut. Instance yang Anda buat untuk aplikasi ini mirip dengan instance pertama yang Anda buat, tapi kali ini, kami memperkenalkan beberapa konsep tambahan.

Catatan

Konektivitas internet dari instance awan Anda diperlukan untuk mendownload aplikasi.

Saat Anda membuat sebuah instance untuk aplikasi ini, Anda ingin memberikan sedikit informasi lebih banyak daripada yang Anda berikan pada instance kosong yang baru saja Anda buat dan hapus. Kami akan membahas lebih terperinci di bagian selanjutnya, tapi untuk saat ini, cukup buat sumber daya berikut sehingga Anda bisa memberi mereka instance:

  • Pasangan kunci Untuk mengakses instance Anda, Anda harus mengimpor kunci publik SSH ke OpenStack untuk membuat pasangan kunci. OpenStack menginstal pasangan kunci ini pada instance baru. Biasanya, kunci publik Anda ditulis ke .ssh/id_rsa.pub. Jika Anda tidak memiliki file kunci publik SSH, ikuti these instructions sebelumnya. Kami akan membahas instruksi ini secara mendalam Pengantar arsitektur aplikasi fraktal.

Pada contoh berikut, mengatur pub_key_file ke lokasi file kunci SSH publik Anda.

Catatan

Jika Anda melihat IOError, Anda mungkin perlu mengubahnya ~/.ssh/ ke /home/{USERNAME}/.ssh/, menggunakan jalur absolut.

print('Checking for existing SSH key pair...')
keypair_name = 'demokey'
pub_key_file = '~/.ssh/id_rsa.pub'
keypair_exists = False
for keypair in conn.list_key_pairs():
    if keypair.name == keypair_name:
        keypair_exists = True

if keypair_exists:
    print('Keypair ' + keypair_name + ' already exists. Skipping import.')
else:
    print('adding keypair...')
    conn.import_key_pair_from_file(keypair_name, pub_key_file)

for keypair in conn.list_key_pairs():
    print(keypair)

<KeyPair name=demokey fingerprint=aa:bb:cc... driver=OpenStack>
  • Akses jaringan. Secara default, OpenStack menyaring semua lalu lintas. Anda harus membuat grup keamanan dan menerapkannya pada instance Anda. Grup keamanan mengizinkan akses HTTP dan SSH. Kami akan membahas lebih rinci Pengantar arsitektur aplikasi fraktal.

print('Checking for existing security group...')
security_group_name = 'all-in-one'
security_group_exists = False
for security_group in conn.ex_list_security_groups():
    if security_group.name == security_group_name:
        all_in_one_security_group = security_group
        security_group_exists = True

if security_group_exists:
    print('Security Group ' + all_in_one_security_group.name + ' already exists. Skipping creation.')
else:
    all_in_one_security_group = conn.ex_create_security_group(security_group_name, 'network access for all-in-one application.')
    conn.ex_create_security_group_rule(all_in_one_security_group, 'TCP', 80, 80)
    conn.ex_create_security_group_rule(all_in_one_security_group, 'TCP', 22, 22)

for security_group in conn.ex_list_security_groups():
    print(security_group)

  • Userdata (dara pengguna). Selama pembuatan instance, Anda dapat menyediakan userdata ke OpenStack untuk mengonfigurasi instance setelah booting. Layanan cloud-init menerapkan data pengguna ke sebuah instance. Anda harus melakukan pra-instal layanan cloud-init pada image yang Anda pilih. Kami akan membahas lebih rinci Pengantar arsitektur aplikasi fraktal.

userdata = '''#!/usr/bin/env bash
curl -L -s https://opendev.org/openstack/faafo/raw/contrib/install.sh | bash -s -- \
    -i faafo -i messaging -r api -r worker -r demo
'''

Sekarang, Anda bisa boot dan mengkonfigurasi instance.

Boot dan konfigurasikan sebuah instance

Gunakan image, flavor, key pair, dan userdata untuk membuat sebuah instance. Setelah Anda meminta instance, tunggulah untuk membangunnya.

print('Checking for existing instance...')
instance_name = 'all-in-one'
instance_exists = False
for instance in conn.list_nodes():
    if instance.name == instance_name:
        testing_instance = instance
        instance_exists = True

if instance_exists:
    print('Instance ' + testing_instance.name + ' already exists. Skipping creation.')
else:
    testing_instance = conn.create_node(name=instance_name,
                                        image=image,
                                        size=flavor,
                                        ex_keyname=keypair_name,
                                        ex_userdata=userdata,
                                        ex_security_groups=[all_in_one_security_group])
    conn.wait_until_running([testing_instance])

for instance in conn.list_nodes():
    print(instance)

Ketika instance boot, nilai variabel ex_userdata menginstruksikan instance untuk menerapkan aplikasi Fractals.

Mengaitkan IP terapung untuk konektivitas eksternal

Kami meliput networking secara rinci di Jaringan.

Untuk melihat aplikasi berjalan, Anda harus tahu di mana mencarinya. Secara default, instance Anda memiliki akses jaringan keluar. Untuk membuat instance Anda dapat dijangkau dari Internet, Anda memerlukan alamat IP. Secara default dalam beberapa kasus, instance Anda tersedia dengan alamat IP yang dapat digunakan secara publik. Dalam kasus ini, Anda melihat alamat IP yang tercantum di bawah public_ips atau` private_ips` saat Anda mencantumkan instance. Jika tidak, Anda harus membuat dan menghubungkan alamat IP mengambang ke instance Anda.

Untuk melihat apakah alamat IP private diberikan ke instance Anda:

private_ip = None
if len(testing_instance.private_ips):
    private_ip = testing_instance.private_ips[0]
    print('Private IP found: {}'.format(private_ip))

Jika IP private diberikan, pengguna dapat menggunakan alamat ini untuk mengakses instance pada beberapa awan OpenStack.

Untuk menentukan apakah alamat IP publik diberikan pada instance Anda:

public_ip = None
if len(testing_instance.public_ips):
    public_ip = testing_instance.public_ips[0]
    print('Public IP found: {}'.format(public_ip))

Jika IP publik diberikan, pengguna dapat menggunakan alamat ini untuk mengakses instance tersebut.

Untuk membuat alamat IP mengambang untuk digunakan dengan instance Anda:

Gunakan ex_list_floating_ip_pools() dan pilih kolam floating IP address pertama. Alokasikan kolam ini ke proyek Anda dan gunakan untuk mendapatkan floating IP address.

print('Checking for unused Floating IP...')
unused_floating_ip = None
for floating_ip in conn.ex_list_floating_ips():
    if not floating_ip.node_id:
        unused_floating_ip = floating_ip
        break

if not unused_floating_ip and len(conn.ex_list_floating_ip_pools()):
    pool = conn.ex_list_floating_ip_pools()[0]
    print('Allocating new Floating IP from pool: {}'.format(pool))
    unused_floating_ip = pool.create_floating_ip()

Kode ini mengembalikan floating IP address:

<OpenStack_1_1_FloatingIpAddress: id=4536ed1e-4374-4d7f-b02c-c3be2cb09b67, ip_addr=203.0.113.101, pool=<OpenStack_1_1_FloatingIpPool: name=floating001>, driver=<libcloud.compute.drivers.openstack.OpenStack_1_1_NodeDriver object at 0x1310b50>>

Attach the floating IP address to the instance:
if public_ip:
    print('Instance ' + testing_instance.name + ' already has a public ip. Skipping attachment.')
elif unused_floating_ip:
    conn.ex_attach_floating_ip_to_node(testing_instance, unused_floating_ip)

Jalankan skrip untuk memulai pengerahan.

Akses aplikasi

Menyebarkan data dan konfigurasi aplikasi ke instance bisa memakan waktu lama. Pertimbangkan menikmati secangkir kopi sambil menunggu. Setelah aplikasi menyebar, Anda dapat menggunakan browser pilihan Anda untuk mengunjungi antarmuka grafis yang mempesona di link berikut.

actual_ip_address = None
if public_ip:
    actual_ip_address = public_ip
elif unused_floating_ip:
    actual_ip_address = unused_floating_ip.ip_address
elif private_ip:
    actual_ip_address = private_ip

print('The Fractals app will be deployed to http://{}'.format(actual_ip_address))

Catatan

Jika Anda tidak menggunakan alamat IP mengambang, ganti alamat IP lain, jika sesuai.

screenshot of the webinterface

Langkah selanjutnya

Jangan khawatir jika konsep ini belum sepenuhnya jelas. Dalam Pengantar arsitektur aplikasi fraktal, kami mengeksplorasi konsep ini secara lebih rinci.

Sampel kode lengkap

File berikut berisi semua kode dari bagian tutorial ini. Sampel kode komprehensif ini memungkinkan Anda melihat dan menjalankan kode sebagai satu skrip.

Sebelum menjalankan skrip ini, konfirmasikan bahwa Anda telah menyetel informasi autentikasi, flavor ID, dan image ID.

# step-1
from libcloud.compute.types import Provider
from libcloud.compute.providers import get_driver

auth_username = 'your_auth_username'
auth_password = 'your_auth_password'
auth_url = 'http://controller:5000'
project_name = 'your_project_name_or_id'
region_name = 'your_region_name'

provider = get_driver(Provider.OPENSTACK)
conn = provider(auth_username,
                auth_password,
                ex_force_auth_url=auth_url,
                ex_force_auth_version='2.0_password',
                ex_tenant_name=project_name,
                ex_force_service_region=region_name)

# step-2
images = conn.list_images()
for image in images:
    print(image)

# step-3
flavors = conn.list_sizes()
for flavor in flavors:
    print(flavor)

# step-4
image_id = '2cccbea0-cea9-4f86-a3ed-065c652adda5'
image = conn.get_image(image_id)
print(image)

# step-5
flavor_id = '2'
flavor = conn.ex_get_size(flavor_id)
print(flavor)

# step-6
instance_name = 'testing'
testing_instance = conn.create_node(name=instance_name, image=image, size=flavor)
print(testing_instance)

# step-7
instances = conn.list_nodes()
for instance in instances:
    print(instance)

# step-8
conn.destroy_node(testing_instance)

# step-9
print('Checking for existing SSH key pair...')
keypair_name = 'demokey'
pub_key_file = '~/.ssh/id_rsa.pub'
keypair_exists = False
for keypair in conn.list_key_pairs():
    if keypair.name == keypair_name:
        keypair_exists = True

if keypair_exists:
    print('Keypair ' + keypair_name + ' already exists. Skipping import.')
else:
    print('adding keypair...')
    conn.import_key_pair_from_file(keypair_name, pub_key_file)

for keypair in conn.list_key_pairs():
    print(keypair)

# step-10
print('Checking for existing security group...')
security_group_name = 'all-in-one'
security_group_exists = False
for security_group in conn.ex_list_security_groups():
    if security_group.name == security_group_name:
        all_in_one_security_group = security_group
        security_group_exists = True

if security_group_exists:
    print('Security Group ' + all_in_one_security_group.name + ' already exists. Skipping creation.')
else:
    all_in_one_security_group = conn.ex_create_security_group(security_group_name, 'network access for all-in-one application.')
    conn.ex_create_security_group_rule(all_in_one_security_group, 'TCP', 80, 80)
    conn.ex_create_security_group_rule(all_in_one_security_group, 'TCP', 22, 22)

for security_group in conn.ex_list_security_groups():
    print(security_group)

# step-11
userdata = '''#!/usr/bin/env bash
curl -L -s https://opendev.org/openstack/faafo/raw/contrib/install.sh | bash -s -- \
    -i faafo -i messaging -r api -r worker -r demo
'''

# step-12
print('Checking for existing instance...')
instance_name = 'all-in-one'
instance_exists = False
for instance in conn.list_nodes():
    if instance.name == instance_name:
        testing_instance = instance
        instance_exists = True

if instance_exists:
    print('Instance ' + testing_instance.name + ' already exists. Skipping creation.')
else:
    testing_instance = conn.create_node(name=instance_name,
                                        image=image,
                                        size=flavor,
                                        ex_keyname=keypair_name,
                                        ex_userdata=userdata,
                                        ex_security_groups=[all_in_one_security_group])
    conn.wait_until_running([testing_instance])

for instance in conn.list_nodes():
    print(instance)

# step-13
private_ip = None
if len(testing_instance.private_ips):
    private_ip = testing_instance.private_ips[0]
    print('Private IP found: {}'.format(private_ip))

# step-14
public_ip = None
if len(testing_instance.public_ips):
    public_ip = testing_instance.public_ips[0]
    print('Public IP found: {}'.format(public_ip))

# step-15
print('Checking for unused Floating IP...')
unused_floating_ip = None
for floating_ip in conn.ex_list_floating_ips():
    if not floating_ip.node_id:
        unused_floating_ip = floating_ip
        break

if not unused_floating_ip and len(conn.ex_list_floating_ip_pools()):
    pool = conn.ex_list_floating_ip_pools()[0]
    print('Allocating new Floating IP from pool: {}'.format(pool))
    unused_floating_ip = pool.create_floating_ip()

# step-16
if public_ip:
    print('Instance ' + testing_instance.name + ' already has a public ip. Skipping attachment.')
elif unused_floating_ip:
    conn.ex_attach_floating_ip_to_node(testing_instance, unused_floating_ip)

# step-17
actual_ip_address = None
if public_ip:
    actual_ip_address = public_ip
elif unused_floating_ip:
    actual_ip_address = unused_floating_ip.ip_address
elif private_ip:
    actual_ip_address = private_ip

print('The Fractals app will be deployed to http://{}'.format(actual_ip_address))
Creative Commons Attribution 3.0 License

Except where otherwise noted, this document is licensed under Creative Commons Attribution 3.0 License. See all OpenStack Legal Documents.