From 3e75ab6f1480659d6e12ddbfe3ae86fe2622d6d8 Mon Sep 17 00:00:00 2001 From: Harry Huang Date: Thu, 18 Jan 2018 20:43:47 +0800 Subject: Add scripts to setup ONAP on OpenStack JIRA: Auto-5 Setup ONAP environment on OpenStack. Develop Using Python considering its proved performence within OPNFV testing project, and with its rich library we can operate REST calls and json parsing in a more elegant way, also others can reuse the existing module to develop use cases and test cases. Main workflow: 1. prepare OpenStack to launch ONAP (images, security rules, keypair, etc) 2. launch ONAP stack Change-Id: Id99affccbcaa86be134a535f89b26c54ad137e21 Signed-off-by: Harry Huang --- setup/onap_on_openstack/__init__.py | 0 setup/onap_on_openstack/config.yml | 64 ++++++++++++ setup/onap_on_openstack/launch_onap.py | 39 ++++++++ setup/onap_on_openstack/onap_os_builder.py | 151 +++++++++++++++++++++++++++++ 4 files changed, 254 insertions(+) create mode 100644 setup/onap_on_openstack/__init__.py create mode 100644 setup/onap_on_openstack/config.yml create mode 100644 setup/onap_on_openstack/launch_onap.py create mode 100644 setup/onap_on_openstack/onap_os_builder.py (limited to 'setup') diff --git a/setup/onap_on_openstack/__init__.py b/setup/onap_on_openstack/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/setup/onap_on_openstack/config.yml b/setup/onap_on_openstack/config.yml new file mode 100644 index 0000000..88c5db1 --- /dev/null +++ b/setup/onap_on_openstack/config.yml @@ -0,0 +1,64 @@ +--- + +onap_stack_name: onap + +onap_demo_git: + repo: https://gerrit.onap.org/r/demo + branch: amsterdam + heat_template: heat/ONAP/onap_openstack.yaml + heat_env: heat/ONAP/onap_openstack.env + +onap_vm_images: + ubuntu_1404_image: + name: Ubuntu_14.04_trusty + url: https://cloud-images.ubuntu.com/trusty/current/trusty-server-cloudimg-amd64-disk1.img + ubuntu_1604_image: + name: Ubuntu_16.04_xenial + url: https://cloud-images.ubuntu.com/xenial/current/xenial-server-cloudimg-amd64-disk1.img + dcae_centos_7_image: + name: Centos_7 + url: https://cloud.centos.org/centos/7/images/CentOS-7-x86_64-GenericCloud-1711.qcow2 + +onap_secgroup_rules: + - protocol: tcp + direction: ingress + port_range_min: 1 + port_range_max: 65535 + + - protocol: icmp + direction: ingress + port_range_min: + port_range_max: + +onap_quota: + instances: 100 + cores: 100 + ram: 204800 + +onap_keypair: + name: onap_key + pubkey_path: ~/.ssh/id_rsa.pub + +onap_user_config: + public_net_name: ext-net + flavor_small: m1.small + flavor_medium: m1.medium + flavor_large: m1.large + flavor_xlarge: m1.xlarge + flavor_xxlarge: m1.xlarge + openstack_tenant_name: admin + openstack_username: admin + openstack_api_key: 49ef27251b38c5124378010e7be8758eb + horizon_url: https://192.168.22.222:80 + keystone_url: https://192.168.22.222:5000 + dns_list: ["8.8.8.8"] + external_dns: 8.8.8.8 + dns_forwarder: 192.168.22.222 + dnsaas_config_enabled: true + dnsaas_region: RegionOne + dnsaas_keystone_url: https://192.168.22.222:5000 + dnsaas_tenant_name: service + dnsaas_username: designate + dnsaas_password: 853ff4c5315221ce5a042954eac38ea6692092a33c + dcae_keystone_url: https://192.168.22.222:5000 + dcae_domain: dcaeg2.onap.org diff --git a/setup/onap_on_openstack/launch_onap.py b/setup/onap_on_openstack/launch_onap.py new file mode 100644 index 0000000..948adfc --- /dev/null +++ b/setup/onap_on_openstack/launch_onap.py @@ -0,0 +1,39 @@ +#!/usr/bin/env python +######################################################################## +# Copyright (c) 2018 Huawei Technologies Co.,Ltd and others. +# +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +######################################################################## + +"""Launch ONAP on OpenStack""" + +import argparse +from onap_os_builder import ONAP_os_builder + +__author__ = "Harry Huang " + + +def read_cli_args(): + parser = argparse.ArgumentParser() + parser.add_argument('--config', '-c', + dest = 'config', + action = 'store', + default = './config.yml', + help = 'config file') + return parser.parse_args() + + +if __name__ == '__main__': + args = read_cli_args() + config = args.config + onap_builder = ONAP_os_builder(config) + onap_builder.clone_demo_code() + onap_builder.create_onap_vm_images() + onap_builder.create_onap_secgroup_rules() + onap_builder.set_quota() + onap_builder.create_onap_key() + onap_builder.set_onap_stack_params() + onap_builder.create_onap_stack() diff --git a/setup/onap_on_openstack/onap_os_builder.py b/setup/onap_on_openstack/onap_os_builder.py new file mode 100644 index 0000000..b6c5608 --- /dev/null +++ b/setup/onap_on_openstack/onap_os_builder.py @@ -0,0 +1,151 @@ +#!/usr/bin/env python +######################################################################## +# Copyright (c) 2018 Huawei Technologies Co.,Ltd and others. +# +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +######################################################################## + +"""ONAP builder for OpenStack""" + +import os +import sys + +import auto.util.openstack_lib as os_lib +import auto.util.util as util +from auto.util.yaml_type import literal_unicode + +__author__ = "Harry Huang " + + +class ONAP_os_builder(object): + """Prepare the OpenStack environment and launch ONAP stack""" + def __init__(self, config_file): + + self.config = util.read_yaml(config_file) + self.stack_name = self.config['onap_stack_name'] + self.demo_git = self.config['onap_demo_git'] + self.vm_images = self.config['onap_vm_images'] + self.secgroup_rules = self.config['onap_secgroup_rules'] + self.quota = self.config['onap_quota'] + self.keypair = self.config['onap_keypair'] + self.user_config = self.config['onap_user_config'] + + self.creds = os_lib.get_credentials() + self.keystone_client = os_lib.get_keystone_client(self.creds) + self.glance_client = os_lib.get_glance_client(self.creds) + self.neutron_client = os_lib.get_neutron_client(self.creds) + self.nova_client = os_lib.get_nova_client(self.creds) + self.heat_client = os_lib.get_heat_client(self.creds) + + self.auto_dir = os.getenv('AUTO_DIR') + self.work_dir = os.path.join(self.auto_dir, "work") + self.demo_repo_dir = os.path.join(self.work_dir, "demo") + self.heat_template = os.path.join(self.demo_repo_dir, + self.demo_git['heat_template']) + self.heat_env = os.path.join(self.demo_repo_dir, + self.demo_git['heat_env']) + self.image_dir = os.path.join(self.work_dir, "images") + self.keypair_dir = os.path.join(self.work_dir, "keypair") + util.mkdir(self.work_dir) + + + def clone_demo_code(self): + util.git_clone(self.demo_git['repo'], self.demo_git['branch'], + self.demo_repo_dir) + + + def prepare_images(self): + util.mkdir(self.image_dir) + for _, image_info in self.vm_images.items(): + image_path = os.path.join(self.image_dir, image_info['name']) + util.download(image_info['url'], image_path) + + + def create_onap_vm_images(self): + self.prepare_images() + for _, image_info in self.vm_images.items(): + image_path = os.path.join(self.image_dir, image_info['name']) + os_lib.create_image(self.glance_client, + image_info['name'], + image_path) + + + def create_onap_secgroup_rules(self): + project_name = os_lib.get_project_name(self.creds) + project_id = os_lib.get_project_id(self.keystone_client, project_name) + secgroup_id = os_lib.get_security_group_id(self.neutron_client, + "default", project_id) + for secgroup_rule in self.secgroup_rules: + os_lib.create_secgroup_rule(self.neutron_client, secgroup_id, + secgroup_rule['protocol'], + secgroup_rule['direction'], + secgroup_rule['port_range_min'], + secgroup_rule['port_range_max']) + + + def set_quota(self): + project_name = os_lib.get_project_name(self.creds) + project_id = os_lib.get_project_id(self.keystone_client, project_name) + os_lib.update_compute_quota(self.nova_client, project_id, self.quota) + + + def create_onap_key(self): + os_lib.create_keypair(self.nova_client, self.keypair['name'], + self.keypair['pubkey_path']) + + + def set_onap_stack_params(self): + stack_config = util.read_yaml(self.heat_env)['parameters'] + + user_config = self.user_config + user_config.update({'ubuntu_1404_image': + self.vm_images['ubuntu_1404_image']['name']}) + user_config.update({'ubuntu_1604_image': + self.vm_images['ubuntu_1604_image']['name']}) + user_config.update({'dcae_centos_7_image': + self.vm_images['dcae_centos_7_image']['name']}) + + pubkey_data = util.read_file(self.keypair['pubkey_path']).strip('\n') + user_config.update({'key_name': self.keypair['name']}) + user_config.update({'pub_key': literal_unicode(pubkey_data)}) + + util.mkdir(self.keypair_dir) + prikey_path = os.path.join(self.keypair_dir, 'private.key') + pubkey_path = os.path.join(self.keypair_dir, 'public.key') + if not os.path.isfile(prikey_path) or not os.path.isfile(pubkey_path): + util.create_keypair(prikey_path, pubkey_path) + + dcae_prikey_data = util.read_file(prikey_path).strip('\n') + dcae_pubkey_data = util.read_file(pubkey_path).strip('\n') + user_config.update({'dcae_public_key': + literal_unicode(dcae_prikey_data)}) + user_config.update({'dcae_private_key': + literal_unicode(dcae_pubkey_data)}) + + public_net_id = os_lib.get_network_id( + self.neutron_client, + user_config['public_net_name'] + ) + user_config.update({'public_net_id': public_net_id}) + project_id = os_lib.get_project_id( + self.keystone_client, + user_config['openstack_tenant_name'] + ) + user_config.update({'openstack_tenant_id': project_id}) + + for key, value in user_config.items(): + stack_config[key] = value + heat_env_data = {'parameters': stack_config} + util.write_yaml(heat_env_data, self.heat_env) + + + def create_onap_stack(self): + stack_args = {} + stack_args['stack_name'] = self.stack_name + stack_args['template'] = util.read_file(self.heat_template) + stack_args['parameters'] = util.read_yaml(self.heat_env)['parameters'] + self.heat_client.stacks.create(**stack_args) + -- cgit 1.2.3-korg