7a6da6a936
Update URLs for recent OpenDev change. Change-Id: I0f7e48f054da0eeb12593c5756e5f5f47a577f4f
189 lines
5.6 KiB
Python
189 lines
5.6 KiB
Python
# step-1
|
|
import base64
|
|
from os.path import expanduser
|
|
|
|
from openstack import connection
|
|
from openstack import exceptions
|
|
|
|
auth_username = 'your_auth_username'
|
|
auth_password = 'your_auth_password'
|
|
auth_url = 'http://controller:5000/v2.0'
|
|
project_name = 'your_project_name_or_id'
|
|
region_name = 'your_region_name'
|
|
|
|
conn = connection.Connection(auth_url=auth_url,
|
|
project_name=project_name,
|
|
username=auth_username,
|
|
password=auth_password,
|
|
region=region_name)
|
|
|
|
# step-2
|
|
images = conn.image.images()
|
|
for image in images:
|
|
print(image)
|
|
|
|
# step-3
|
|
flavors = conn.compute.flavors()
|
|
for flavor in flavors:
|
|
print(flavor)
|
|
|
|
# step-4
|
|
image_id = 'cb6b7936-d2c5-4901-8678-c88b3a6ed84c'
|
|
image = conn.compute.get_image(image_id)
|
|
print(image)
|
|
|
|
# step-5
|
|
flavor_id = '2'
|
|
flavor = conn.compute.get_flavor(flavor_id)
|
|
print(flavor)
|
|
|
|
# step-6
|
|
instance_name = 'testing'
|
|
image_args = {
|
|
'name': instance_name,
|
|
'imageRef': image,
|
|
'flavorRef': flavor
|
|
}
|
|
|
|
testing_instance = conn.compute.create_server(**image_args)
|
|
print(testing_instance)
|
|
|
|
# step-7
|
|
instances = conn.compute.servers()
|
|
for instance in instances:
|
|
print(instance)
|
|
|
|
# step-8
|
|
conn.compute.delete_server(testing_instance)
|
|
|
|
# step-9
|
|
print('Checking for existing SSH key pair...')
|
|
keypair_name = 'demokey'
|
|
keypair_exists = False
|
|
for keypair in conn.compute.keypairs():
|
|
if keypair.name == keypair_name:
|
|
keypair_exists = True
|
|
|
|
if keypair_exists:
|
|
print('Keypair ' + keypair_name + ' already exists. Skipping import.')
|
|
else:
|
|
print('adding keypair...')
|
|
pub_key_file = open(expanduser('~/.ssh/id_rsa.pub')).read()
|
|
keypair_args = {
|
|
"name": keypair_name,
|
|
"public_key": pub_key_file
|
|
}
|
|
conn.compute.create_keypair(**keypair_args)
|
|
|
|
for keypair in conn.compute.keypairs():
|
|
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.network.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:
|
|
security_group_args = {
|
|
'name' : security_group_name,
|
|
'description': 'network access for all-in-one application.'
|
|
}
|
|
all_in_one_security_group = conn.network.create_security_group(**security_group_args)
|
|
|
|
security_rule_args = {
|
|
'security_group_id': all_in_one_security_group,
|
|
'direction': 'ingress',
|
|
'protocol': 'tcp',
|
|
'port_range_min': '80',
|
|
'port_range_max': '80'
|
|
}
|
|
conn.network.create_security_group_rule(**security_rule_args)
|
|
|
|
security_rule_args['port_range_min'] = '22'
|
|
security_rule_args['port_range_max'] = '22'
|
|
conn.network.create_security_group_rule(**security_rule_args)
|
|
|
|
for security_group in conn.network.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
|
|
'''
|
|
userdata_b64str = base64.b64encode(userdata)
|
|
|
|
# step-12
|
|
print('Checking for existing instance...')
|
|
instance_name = 'all-in-one'
|
|
instance_exists = False
|
|
for instance in conn.compute.servers():
|
|
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_args = {
|
|
'name': instance_name,
|
|
'imageRef': image,
|
|
'flavorRef': flavor,
|
|
'key_name': keypair_name,
|
|
'user_data': userdata_b64str,
|
|
'security_groups': [{'name': all_in_one_security_group.name}]
|
|
}
|
|
|
|
testing_instance = conn.compute.create_server(**testing_instance_args)
|
|
conn.compute.wait_for_server(testing_instance)
|
|
|
|
for instance in conn.compute.servers():
|
|
print(instance)
|
|
|
|
# step-13
|
|
print('Checking if Floating IP is already assigned to testing_instance...')
|
|
testing_instance_floating_ip = None
|
|
for values in testing_instance.addresses.values():
|
|
for address in values:
|
|
if address['OS-EXT-IPS:type'] == 'floating':
|
|
testing_instance_floating_ip = conn.network.find_ip(address['addr'])
|
|
|
|
unused_floating_ip = None
|
|
if not testing_instance_floating_ip:
|
|
print('Checking for unused Floating IP...')
|
|
for floating_ip in conn.network.ips():
|
|
if not floating_ip.fixed_ip_address:
|
|
unused_floating_ip = floating_ip
|
|
break
|
|
|
|
if not testing_instance_floating_ip and not unused_floating_ip:
|
|
print('No free unused Floating IPs. Allocating new Floating IP...')
|
|
public_network_id = conn.network.find_network('public').id
|
|
try:
|
|
unused_floating_ip = conn.network.create_ip(floating_network_id=public_network_id)
|
|
unused_floating_ip = conn.network.get_ip(unused_floating_ip)
|
|
print(unused_floating_ip)
|
|
except exceptions.HttpException as e:
|
|
print(e)
|
|
|
|
# step-14
|
|
if testing_instance_floating_ip:
|
|
print('Instance ' + testing_instance.name + ' already has a public ip. Skipping attachment.')
|
|
else:
|
|
for port in conn.network.ports():
|
|
if port.device_id == testing_instance.id:
|
|
testing_instance_port = port
|
|
|
|
testing_instance_floating_ip = unused_floating_ip
|
|
conn.network.add_ip_to_port(testing_instance_port, testing_instance_floating_ip)
|
|
|
|
# step-15
|
|
print('The Fractals app will be deployed to http://%s' % testing_instance_floating_ip.floating_ip_address)
|