7 changed files with 412 additions and 232 deletions
-
47CloudComp-openrc
-
70demo1_getting_started.py
-
131demo2_instance_with_init_script.py
-
152demo3_microservice.py
-
97destroy-all-demo-instances.py
-
126destroy_all_demo_instances.py
-
21root-ca.crt
@ -0,0 +1,47 @@ |
|||
#!/usr/bin/env bash |
|||
# To use an OpenStack cloud you need to authenticate against the Identity |
|||
# service named keystone, which returns a **Token** and **Service Catalog**. |
|||
# The catalog contains the endpoints for all services the user/tenant has |
|||
# access to - such as Compute, Image Service, Identity, Object Storage, Block |
|||
# Storage, and Networking (code-named nova, glance, keystone, swift, |
|||
# cinder, and neutron). |
|||
|
|||
# unset all OPENSTACK ENV VARS |
|||
unset $(env | grep OS_ | cut -d "=" -f 1) |
|||
|
|||
export OS_CACERT=./root-ca.crt |
|||
export GROUP_NUMBER=0 |
|||
|
|||
# |
|||
# *NOTE*: Using the 3 *Identity API* does not necessarily mean any other |
|||
# OpenStack API is version 3. For example, your cloud provider may implement |
|||
# Image API v1.1, Block Storage API v2, and Compute API v2.0. OS_AUTH_URL is |
|||
# only for the Identity API served through keystone. |
|||
export OS_AUTH_URL=https://10.32.4.182:5000/v3 |
|||
# With the addition of Keystone we have standardized on the term **project** |
|||
# as the entity that owns the resources. |
|||
#export OS_PROJECT_ID=bba62cf6bf0b447491829d207e1b05f9 |
|||
export OS_PROJECT_NAME="CloudComp$GROUP_NUMBER" |
|||
unset OS_DOMAIN_NAME |
|||
export OS_USER_DOMAIN_NAME="Default" |
|||
if [ -z "$OS_USER_DOMAIN_NAME" ]; then unset OS_USER_DOMAIN_NAME; fi |
|||
export OS_PROJECT_DOMAIN_ID="default" |
|||
if [ -z "$OS_PROJECT_DOMAIN_ID" ]; then unset OS_PROJECT_DOMAIN_ID; fi |
|||
# unset v2.0 items in case set |
|||
unset OS_TENANT_ID |
|||
unset OS_TENANT_NAME |
|||
# In addition to the owning entity (tenant), OpenStack stores the entity |
|||
# performing the action as the **user**. |
|||
export OS_USERNAME="CloudComp$GROUP_NUMBER" |
|||
# With Keystone you pass the keystone password. |
|||
#echo "Please enter your OpenStack Password for project $OS_PROJECT_NAME as user $OS_USERNAME: " |
|||
#read -sr OS_PASSWORD_INPUT |
|||
#export OS_PASSWORD=$OS_PASSWORD_INPUT |
|||
export OS_PASSWORD="demo" |
|||
# If your configuration has multiple regions, we set that information here. |
|||
# OS_REGION_NAME is optional and only valid in certain environments. |
|||
export OS_REGION_NAME="RegionOne" |
|||
# Don't leave a blank variable, unset it if it was empty |
|||
if [ -z "$OS_REGION_NAME" ]; then unset OS_REGION_NAME; fi |
|||
export OS_INTERFACE=public |
|||
export OS_IDENTITY_API_VERSION=3 |
@ -1,97 +0,0 @@ |
|||
# import getpass |
|||
# import os |
|||
# import libcloud.security |
|||
|
|||
import time |
|||
from libcloud.compute.providers import get_driver |
|||
from libcloud.compute.types import Provider |
|||
|
|||
# reqs: |
|||
# services: nova, glance, neutron |
|||
# resources: 2 instances (m1.small), 2 floating ips (1 keypair, 2 security groups) |
|||
|
|||
# Please use 1-29 for X in the following variable to specify your group number. (will be used for the username, |
|||
# project etc., as coordinated in the lab sessions) |
|||
|
|||
group_number = X |
|||
|
|||
|
|||
# web service endpoint of the private cloud infrastructure |
|||
auth_url = 'https://private-cloud.informatik.hs-fulda.de:5000' |
|||
# your username in OpenStack |
|||
auth_username = 'CloudComp' + str(group_number) |
|||
# your project in OpenStack |
|||
project_name = 'CloudComp' + str(group_number) |
|||
|
|||
|
|||
# default region |
|||
region_name = 'RegionOne' |
|||
# domain to use, "default" for local accounts, "hsfulda" for RZ LDAP, e.g., using fdaiXXXX as auth_username |
|||
domain_name = "default" |
|||
|
|||
|
|||
def main(): |
|||
########################################################################### |
|||
# |
|||
# get credentials |
|||
# |
|||
########################################################################### |
|||
|
|||
# if "OS_PASSWORD" in os.environ: |
|||
# auth_password = os.environ["OS_PASSWORD"] |
|||
# else: |
|||
# auth_password = getpass.getpass("Enter your OpenStack password:") |
|||
auth_password = "demo" |
|||
|
|||
########################################################################### |
|||
# |
|||
# create connection |
|||
# |
|||
########################################################################### |
|||
|
|||
# libcloud.security.VERIFY_SSL_CERT = False |
|||
|
|||
provider = get_driver(Provider.OPENSTACK) |
|||
conn = provider(auth_username, |
|||
auth_password, |
|||
ex_force_auth_url=auth_url, |
|||
ex_force_auth_version='3.x_password', |
|||
ex_tenant_name=project_name, |
|||
ex_force_service_region=region_name, |
|||
ex_domain_name=domain_name) |
|||
|
|||
########################################################################### |
|||
# |
|||
# clean up resources from previous demos |
|||
# |
|||
########################################################################### |
|||
|
|||
# destroy running demo instances |
|||
for instance in conn.list_nodes(): |
|||
if instance.name in ['all-in-one', 'app-worker-1', 'app-worker-2', 'app-worker-3', 'app-controller', |
|||
'app-services', 'app-api-1', 'app-api-2']: |
|||
print(('Destroying Instance: %s' % instance.name)) |
|||
conn.destroy_node(instance) |
|||
|
|||
# wait until all nodes are destroyed to be able to remove depended security groups |
|||
nodes_still_running = True |
|||
while nodes_still_running: |
|||
nodes_still_running = False |
|||
time.sleep(3) |
|||
instances = conn.list_nodes() |
|||
for instance in instances: |
|||
# if we see any demo instances still running continue to wait for them to stop |
|||
if instance.name in ['all-in-one', 'app-worker-1', 'app-worker-2', 'app-worker-3', 'app-controller', |
|||
'app-services', 'app-api-1', 'app-api-2']: |
|||
nodes_still_running = True |
|||
print('There are still instances running, waiting for them to be destroyed...') |
|||
|
|||
# delete security groups |
|||
for group in conn.ex_list_security_groups(): |
|||
if group.name in ['control', 'worker', 'api', 'services']: |
|||
print(('Deleting security group: %s' % group.name)) |
|||
conn.ex_delete_security_group(group) |
|||
|
|||
|
|||
if __name__ == '__main__': |
|||
main() |
@ -0,0 +1,126 @@ |
|||
"""Example for Cloud Computing Course Master AI / GSD""" |
|||
|
|||
|
|||
# This script demonstrates how to use libcloud to cleanup all instances used in the demos |
|||
# for our OpenStack private cloud environment. |
|||
|
|||
# import getpass |
|||
import os |
|||
import sys |
|||
|
|||
import time |
|||
from libcloud.compute.providers import get_driver |
|||
from libcloud.compute.types import Provider |
|||
|
|||
# For our new Charmed OpenStack private cloud, we need to specify the path to the |
|||
# root CA certificate |
|||
import libcloud.security |
|||
libcloud.security.CA_CERTS_PATH = ['./root-ca.crt'] |
|||
# Disable SSL certificate verification (not recommended for production) |
|||
# libcloud.security.VERIFY_SSL_CERT = False |
|||
|
|||
# Please use 1-29 for X in the following variable to specify your group number. |
|||
# (will be used for the username, project etc., as coordinated in the lab sessions) |
|||
|
|||
group_number = os.environ.get('GROUP_NUMBER') |
|||
if group_number is None: |
|||
sys.exit('Please set the GROUP_NUMBER environment variable to your group number,\n' |
|||
'e.g., on Windows:\n' |
|||
' "$env:GROUP_NUMBER=0" or "set GROUP_NUMBER=0"\n' |
|||
'or on Linux/MacOS:\n' |
|||
' "export GROUP_NUMBER=0" or "set GROUP_NUMBER=0"') |
|||
|
|||
|
|||
############################################################################################### |
|||
# |
|||
# no changes necessary below this line in this example |
|||
# |
|||
############################################################################################### |
|||
|
|||
# web service endpoint of the private cloud infrastructure |
|||
# auth_url = 'https://private-cloud.informatik.hs-fulda.de:5000' |
|||
AUTH_URL = 'https://10.32.4.182:5000' |
|||
# auth_url = 'https://private-cloud2.informatik.hs-fulda.de:5000' |
|||
# your username in OpenStack |
|||
AUTH_USERNAME = 'CloudComp' + str(group_number) |
|||
# your project in OpenStack |
|||
PROJECT_NAME = 'CloudComp' + str(group_number) |
|||
# A network in the project the started instance will be attached to |
|||
PROJET_NETWORK = 'CloudComp' + str(group_number) + '-net' |
|||
|
|||
# The image to look for and use for the started instance |
|||
# ubuntu_image_name = "Ubuntu 18.04 - Bionic Beaver - 64-bit - Cloud Based Image" |
|||
UBUNTU_IMAGE_NAME = "auto-sync/ubuntu-jammy-22.04-amd64-server-20240319-disk1.img" |
|||
|
|||
# default region |
|||
REGION_NAME = 'RegionOne' |
|||
# domain to use, "default" for local accounts, formerly "hsfulda" for LDAP accounts etc. |
|||
# domain_name = "default" |
|||
|
|||
|
|||
def main(): # noqa: C901 pylint: disable=too-many-branches,too-many-statements,too-many-locals,missing-function-docstring |
|||
########################################################################### |
|||
# |
|||
# get credentials |
|||
# |
|||
########################################################################### |
|||
|
|||
# if "OS_PASSWORD" in os.environ: |
|||
# auth_password = os.environ["OS_PASSWORD"] |
|||
# else: |
|||
# auth_password = getpass.getpass("Enter your OpenStack password:") |
|||
auth_password = "demo" |
|||
|
|||
########################################################################### |
|||
# |
|||
# create connection |
|||
# |
|||
########################################################################### |
|||
|
|||
# libcloud.security.VERIFY_SSL_CERT = False |
|||
|
|||
provider = get_driver(Provider.OPENSTACK) |
|||
conn = provider(AUTH_USERNAME, |
|||
auth_password, |
|||
ex_force_auth_url=AUTH_URL, |
|||
ex_force_auth_version='3.x_password', |
|||
ex_tenant_name=PROJECT_NAME, |
|||
ex_force_service_region=REGION_NAME) |
|||
# ex_domain_name=domain_name) |
|||
|
|||
########################################################################### |
|||
# |
|||
# clean up resources from previous demos |
|||
# |
|||
########################################################################### |
|||
|
|||
# destroy running demo instances |
|||
for instance in conn.list_nodes(): |
|||
if instance.name in ['all-in-one', 'app-worker-1', 'app-worker-2', 'app-worker-3', |
|||
'app-controller', |
|||
'app-services', 'app-api-1', 'app-api-2']: |
|||
print(f'Destroying Instance: {instance.name}') |
|||
conn.destroy_node(instance) |
|||
|
|||
# wait until all nodes are destroyed to be able to remove depended security groups |
|||
nodes_still_running = True |
|||
while nodes_still_running: |
|||
nodes_still_running = False |
|||
time.sleep(3) |
|||
instances = conn.list_nodes() |
|||
for instance in instances: |
|||
# if we see any demo instances still running continue to wait for them to stop |
|||
if instance.name in ['all-in-one', 'app-worker-1', 'app-worker-2', 'app-worker-3', |
|||
'app-controller', 'app-services', 'app-api-1', 'app-api-2']: |
|||
nodes_still_running = True |
|||
print('There are still instances running, waiting for them to be destroyed...') |
|||
|
|||
# delete security groups |
|||
for group in conn.ex_list_security_groups(): |
|||
if group.name in ['control', 'worker', 'api', 'services']: |
|||
print(f'Deleting security group: {group.name}') |
|||
conn.ex_delete_security_group(group) |
|||
|
|||
|
|||
if __name__ == '__main__': |
|||
main() |
@ -0,0 +1,21 @@ |
|||
-----BEGIN CERTIFICATE----- |
|||
MIIDazCCAlOgAwIBAgIUEQjSqiZ86fhawQU09G8hn3i9dIwwDQYJKoZIhvcNAQEL |
|||
BQAwPTE7MDkGA1UEAxMyVmF1bHQgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkg |
|||
KGNoYXJtLXBraS1sb2NhbCkwHhcNMjQwMzI1MTMxNDU0WhcNMzQwMzIzMTIxNTIz |
|||
WjA9MTswOQYDVQQDEzJWYXVsdCBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAo |
|||
Y2hhcm0tcGtpLWxvY2FsKTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB |
|||
ALcax5l2zU1ELCtF/k6yq3HUv7gFq6f/sl8rX0VRhzZyEy4hcMgRSZDAM14viTVZ |
|||
8d7+ptY3+GwuLSpEY2UUlX5kJSDb4pUNRXDhxzRatbByG8pr5FQE8pX9W7y4C0TU |
|||
3PQA4uIjAsPFKayFxXjJjOQN0HX3K6MCQz/BTV81U3fmdFrKma3x/PXyUYndjQH6 |
|||
zlIiQSdYh7FMTbS2FlpvwWbT9zKOpp+2M0odI8Y8fjCSUdSdKDFhVu02zQTq6/h0 |
|||
Q1/sNHz2IP9F83sNW+ro0bvv5CJ2iCyAk/RiFoB+RoSO6HncOtYHxa/guwTy4eHh |
|||
VQVJXkEI2PutCw6S3lWqLEcCAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgEGMA8GA1Ud |
|||
EwEB/wQFMAMBAf8wHQYDVR0OBBYEFDKQHfpVHJgge6RRC5uDwMByLbV3MB8GA1Ud |
|||
IwQYMBaAFDKQHfpVHJgge6RRC5uDwMByLbV3MA0GCSqGSIb3DQEBCwUAA4IBAQCa |
|||
ajIRi/+7Yy7l46yFURLyELMWayRpdx2KCxIuAiSkTlNSVOPCmwZvgnYLPVffXWpt |
|||
IXJGQk//9+5q18LiZat5MbvUU3ffLc/ZCxIeQiWNuYKziLYNFHmpfMvxNxzAJ6Pi |
|||
2fj5ZP/cA4Vie3M1iHfdSXmYPvyw76i9/sA2+F7Wy8fzK53S1OaMaeADNGljHTaW |
|||
ovRxreLKJZybqe/YWlcEiP4dC4VMHLl+H5RmZ5ojrRiy1c3uUssNnIJU+ilkY8TP |
|||
0VV17+wQBaJbbp4jh8acwvOJbN8Y1EHQWhxkEf3PfjJRv+b1NI/Iai27DfYto7Dm |
|||
rZvaFnAMCcyFXyJv3WdJ |
|||
-----END CERTIFICATE----- |
Write
Preview
Loading…
Cancel
Save
Reference in new issue