aboutsummaryrefslogtreecommitdiffstats
path: root/setup
diff options
context:
space:
mode:
authorHarry Huang <huangxiangyu5@huawei.com>2018-01-18 20:43:47 +0800
committerHarry Huang <huangxiangyu5@huawei.com>2018-03-07 15:42:08 +0800
commit3e75ab6f1480659d6e12ddbfe3ae86fe2622d6d8 (patch)
tree2d5a17c1e73ba7def1f72c55a644b17cec80e90a /setup
parent3d636def30cd293231e84a7f2ecf7db2dfad334d (diff)
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 <huangxiangyu5@huawei.com>
Diffstat (limited to 'setup')
-rw-r--r--setup/onap_on_openstack/__init__.py0
-rw-r--r--setup/onap_on_openstack/config.yml64
-rw-r--r--setup/onap_on_openstack/launch_onap.py39
-rw-r--r--setup/onap_on_openstack/onap_os_builder.py151
4 files changed, 254 insertions, 0 deletions
diff --git a/setup/onap_on_openstack/__init__.py b/setup/onap_on_openstack/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/setup/onap_on_openstack/__init__.py
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 <huangxiangyu5@huawei.com>"
+
+
+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 <huangxiangyu5@huawei.com>"
+
+
+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)
+