[beta] add a public api proxy for orange pod1 67/19067/1
authorDavid Blaisonneau <david.blaisonneau@orange.com>
Fri, 19 Aug 2016 15:13:29 +0000 (17:13 +0200)
committerDavid Blaisonneau <david.blaisonneau@orange.com>
Fri, 19 Aug 2016 15:14:48 +0000 (17:14 +0200)
Change-Id: I173b545a2b3bdc7ff948f37820fc2cfb62d5ca6d
Signed-off-by: David Blaisonneau <david.blaisonneau@orange.com>
ci/config_tpl/public-api-proxy.yaml [new file with mode: 0644]
ci/deploy.sh
ci/genPublicAPIProxyBundle.py [new file with mode: 0644]
ci/nosdn/fetch-charms.sh
labconfig/orange/pod1/labconfig.yaml

diff --git a/ci/config_tpl/public-api-proxy.yaml b/ci/config_tpl/public-api-proxy.yaml
new file mode 100644 (file)
index 0000000..726945f
--- /dev/null
@@ -0,0 +1,13 @@
+haproxy:
+  charm: "local:{{ opnfv.distro }}/haproxy"
+  num_units: 1
+  options:
+    services: |-
+{% for service in public_api_services.values() %}
+      - service_name: {{ service.name }}
+        service_host: {{ public_api_ip }}
+        service_port: {{ service.port }}
+        servers: [[{{ service.name }},{{ service.ip }},{{ service.port }}]]
+{% endfor %}
+  to:
+    - "nodes=0"
index 2e57589..b69b5ba 100755 (executable)
@@ -23,13 +23,13 @@ read_config() {
 }
 
 usage() { echo "Usage: $0 [-s <nosdn|odl|opencontrail>]
-                         [-t <nonha|ha|tip>] 
+                         [-t <nonha|ha|tip>]
                          [-o <juno|liberty>]
                          [-l <default|intelpod5>]
                          [-f <ipv6,dpdk,lxd,dvr>]
                          [-d <trusty|xenial>]
                          [-a <amd64>]
-                         [-r <a|b>]" 1>&2 exit 1; } 
+                         [-r <a|b>]" 1>&2 exit 1; }
 
 while getopts ":s:t:o:l:h:r:f:d:a:" opt; do
     case "${opt}" in
@@ -161,6 +161,18 @@ echo "...... deployment started ......"
 deploy
 
 check_status
+
+echo "...... deploy public api proxy ......"
+
+if [ "$opnfvlab" == "orangepod1" ] && [ "$opnfvsdn" == "nosdn" ]; then # only for first test phase
+    PUB_API_NET=$(grep floating-ip-range ./labconfig.yaml |cut -d/ -f2)
+    PUB_API_IP=$(grep public-api-ip ./labconfig.yaml |cut -d: -f2)
+    juju run --unit nodes/0 "sudo ip a a ${PUB_API_IP}/${PUB_API_NET} dev br-ex"
+    juju run --unit nodes/0 "sudo ip l set dev br-ex up"
+    python genPublicAPIProxyBundle.py -l labconfig.yaml > haproxy.bundle.yaml
+    juju-deployer -vW -d -t 7200 -r 5 -c haproxy.bundle.yaml haproxy
+fi
+
 echo "...... deployment finished  ......."
 
 ./openstack.sh "$opnfvsdn" || true
diff --git a/ci/genPublicAPIProxyBundle.py b/ci/genPublicAPIProxyBundle.py
new file mode 100644 (file)
index 0000000..87acee2
--- /dev/null
@@ -0,0 +1,111 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+
+"""
+This script generates a bundle config for the haproxy managing public apis
+
+Parameters:
+ -l, --lab      : lab config file
+"""
+
+from jinja2 import Environment, FileSystemLoader
+from keystoneauth1.identity import v2
+from keystoneauth1 import session
+from keystoneclient.v2_0 import client
+from optparse import OptionParser
+
+import os
+import yaml
+
+#
+# Parse parameters
+#
+
+parser = OptionParser()
+parser.add_option("-l", "--lab", dest="lab", help="lab config file")
+(options, args) = parser.parse_args()
+labconfig_file = options.lab
+
+#
+# Set Path and configs path
+#
+
+# Capture our current directory
+TPL_DIR = os.path.dirname(os.path.abspath(__file__))+'/config_tpl'
+
+#
+# Local Functions
+#
+
+
+def load_yaml(filepath):
+    """Load YAML file"""
+    with open(filepath, 'r') as stream:
+        try:
+            return yaml.load(stream)
+        except yaml.YAMLError as exc:
+            print(exc)
+
+#
+# Config import
+#
+
+# Load scenario Config
+config = load_yaml(labconfig_file)
+
+# Add public api ip to config
+if 'public_api_ip' in config['lab']['racks'][0]:
+    config['public_api_ip'] = config['lab']['racks'][0]['public_api_ip']
+else:
+    first_public_ip = config['lab']['racks'][0][
+                        'floating-ip-range'].split(',')[0]
+    # managing ipv6 and ipv4 format
+    sep = ':' if ':' in first_public_ip else '.'
+    api_ip = first_public_ip.split(sep)
+    api_ip[-1] = str(int(api_ip[-1])-1)
+    config['public_api_ip'] = sep.join(api_ip)
+
+# get endpoint list from keystone
+username = os.environ['OS_USERNAME']
+password = os.environ['OS_PASSWORD']
+tenant_name = os.environ['OS_TENANT_NAME']
+auth_url = os.environ['OS_AUTH_URL']
+auth = v2.Password(username=username,
+                   password=password,
+                   tenant_name=tenant_name,
+                   auth_url=auth_url)
+sess = session.Session(auth=auth)
+keystone = client.Client(session=sess)
+services = keystone.services.list()
+endpoints = keystone.endpoints.list()
+srv = dict()
+for service in services:
+    if service.name != 'cinderv2':
+        srv[service.id] = {'name': service.name}
+for endpoint in endpoints:
+    if endpoint.service_id in srv.keys():
+        internal = endpoint.internalurl.split('/')[2].split(':')
+        srv[endpoint.service_id]['ip'] = ':'.join(internal[:-1])
+        srv[endpoint.service_id]['port'] = internal[-1]
+config['public_api_services'] = srv
+
+#
+# Transform template to deployconfig.yaml according to config
+#
+
+# Create the jinja2 environment.
+env = Environment(loader=FileSystemLoader(TPL_DIR),
+                  trim_blocks=True)
+template = env.get_template('public-api-proxy.yaml')
+
+# Render the template
+output = template.render(**config)
+
+# Check output syntax
+try:
+    yaml.load(output)
+except yaml.YAMLError as exc:
+    print(exc)
+
+# print output
+print(output)
index da7963f..05fa705 100755 (executable)
@@ -41,6 +41,7 @@ git clone -b stable/16.07 https://github.com/openstack/charm-rabbitmq-server.git
 git clone -b stable/16.07 https://github.com/openstack/charm-heat.git $distro/heat
 git clone -b stable/16.07 https://github.com/openstack/charm-lxd.git xenial/lxd
 
+charm pull cs:~free.ekanayaka/xenial/haproxy-1 $distro/haproxy
 #charm pull cs:~openstack-charmers-next/hacluster $distro/hacluster
 #charm pull cs:~openstack-charmers-next/ceilometer $distro/ceilometer
 #charm pull cs:~openstack-charmers-next/ceilometer-agent $distro/ceilometer-agent
@@ -61,4 +62,3 @@ git clone -b stable/16.07 https://github.com/openstack/charm-lxd.git xenial/lxd
 #charm pull cs:~openstack-charmers-next/rabbitmq-server $distro/rabbitmq-server
 #charm pull cs:~openstack-charmers-next/heat $distro/heat
 #charm pull cs:~openstack-charmers-next/lxd xenial/lxd
-
index 08e1735..c4a64ff 100644 (file)
@@ -94,6 +94,7 @@ lab:
         user: Administrator
         pass: pod1Admin
     floating-ip-range: 10.0.2.5,10.0.2.254,10.0.2.1,10.0.2.0/24
+    public-api-ip: 10.0.2.4
     ext-port: "eth1"
     dns: 192.168.1.1
     osdomainname: pod1.opnfv.fr