Skip to content
Snippets Groups Projects
Select Git revision
  • 3cb067e9fda8b3e244f228f2823a2182255821a9
  • main default protected
2 results

train_model.py

Blame
  • demo2-instance-with-init-script.py 9.04 KiB
    # import getpass
    # import os
    
    from libcloud.compute.providers import get_driver
    from libcloud.compute.types import Provider
    
    # 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)
    # A network in the project the started instance will be attached to
    project_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 = "Ubuntu 20.04 - Focal Fossa - 64-bit - Cloud Based Image"
    
    # The public key to be used for SSH connection, please make sure, that you have the corresponding private key
    #
    # id_rsa.pub should look like this (standard sshd pubkey format):
    # ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAw+J...F3w2mleybgT1w== user@HOSTNAME
    
    #keypair_name = 'CloudComp30-keypair'
    keypair_name = "srieger-pub"
    pub_key_file = '~/.ssh/id_rsa.pub'
    
    flavor_name = 'm1.small'
    
    
    # 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
        #
        ###########################################################################
    
        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)
    
        ###########################################################################
        #
        # get image, flavor, network for instance creation
        #
        ###########################################################################
        images = conn.list_images()
        image = ''
        for img in images:
            if img.name == ubuntu_image_name:
                image = img
    
        flavors = conn.list_sizes()
        flavor = ''
        for flav in flavors:
            if flav.name == flavor_name:
                flavor = conn.ex_get_size(flav.id)
    
        networks = conn.ex_list_networks()
        network = ''
        for net in networks:
            if net.name == project_network:
                network = net
    
        ###########################################################################
        #
        # create keypair dependency
        #
        ###########################################################################
    
        print('Checking for existing SSH key pair...')
        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)
    
        ###########################################################################
        #
        # create security group dependency
        #
        ###########################################################################
    
        print('Checking for existing security group...')
        security_group_name = 'all-in-one'
        security_group_exists = False
        all_in_one_security_group = ''
        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)
    
        ###########################################################################
        #
        # create all-in-one instance
        #
        ###########################################################################
    
        #hsfd_faafo_cloud_init_script = 'https://gogs.informatik.hs-fulda.de/srieger/cloud-computing-msc-ai-examples/raw/master/faafo/contrib/install.sh'
        # testing / faafo dev branch:
        hsfd_faafo_cloud_init_script = 'https://gogs.informatik.hs-fulda.de/srieger/cloud-computing-msc-ai-examples/raw/branch/dev_faafo/faafo/contrib/install.sh'
    
        userdata = '''#!/usr/bin/env bash
        curl -L -s ''' + hsfd_faafo_cloud_init_script + ''' | bash -s -- \
            -i faafo -i messaging -r api -r worker -r demo
        '''
    
        print('Checking for existing instance...')
        instance_name = 'all-in-one'
        instance_exists = False
        testing_instance = ''
        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.'))
            exit()
        else:
            print('Starting new all-in-one instance and wait until it is running...')
            testing_instance = conn.create_node(name=instance_name,
                                                image=image,
                                                size=flavor,
                                                networks=[network],
                                                ex_keyname=keypair_name,
                                                ex_userdata=userdata,
                                                ex_security_groups=[all_in_one_security_group])
            conn.wait_until_running(nodes=[testing_instance], timeout=120, ssh_interface='private_ips')
    
        ###########################################################################
        #
        # assign all-in-one instance floating ip
        #
        ###########################################################################
    
        private_ip = None
        if len(testing_instance.private_ips):
            private_ip = testing_instance.private_ips[0]
            print(('Private IP found: {}'.format(private_ip)))
    
        public_ip = None
        if len(testing_instance.public_ips):
            public_ip = testing_instance.public_ips[0]
            print(('Public IP found: {}'.format(public_ip)))
    
        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()
    
        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)
    
        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('\n')
        print(('The Fractals app will be deployed to http://{}\n'.format(actual_ip_address)))
    
        print('You can use ssh to login to the instance using your private key. Default user name for official Ubuntu\n'
              'Cloud Images is: ubuntu, so you can use, e.g.: "ssh -i ~/.ssh/id_rsa ubuntu@<floating-ip>" if your private\n'
              'key is in the default location.\n\n'
              'After login, you can list or "ssh ubuntu@<floating-ip>" available fractals using "faafo list". To request\n'
              'the generation of new fractals, you can use "faafo create".\n\n'
              'You can also see other options to use the faafo example cloud service using "faafo -h".\n\n'
              'If you cannot start faafo command and/or do not see the webpage, you can check the Instance Console Log of\n'
              'the instance, e.g., in OpenStack web interface.')
    
    
    if __name__ == '__main__':
        main()