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