Add workaround for horizon image upload issue 97/50897/4
authorHarry Huang <huangxiangyu5@huawei.com>
Mon, 22 Jan 2018 04:12:08 +0000 (12:12 +0800)
committerHarry Huang <huangxiangyu5@huawei.com>
Wed, 7 Feb 2018 02:41:57 +0000 (10:41 +0800)
JIRA: COMPASS-573

1. With HORIZON_IMAGES_UPLOAD_MODE set to direct
Horizon provides the endpoint for Glance based on
OPENSTACK_ENDPOINT_TYPE. If OPENSTACK_ENDPOINT_TYPE
is set to internalURL any browser outside the internal
network is unable to upload image. Add ansible task to
set HORIZON_IMAGES_UPLOAD_MODE to legacy as a workaround.

2. Add ansible lookup plugin to get openstack release

3. set openstack_release into group_vars/all in config-osa
to make this variable readable for other tasks

Change-Id: I9ef358e1f4acb0c329a032e18359de12284f3b56
Signed-off-by: Harry Huang <huangxiangyu5@huawei.com>
deploy/adapters/ansible/roles/config-osa/tasks/main.yml
deploy/adapters/ansible/roles/config-osa/tasks/set_openstack_release.yml [new file with mode: 0644]
deploy/adapters/ansible/roles/config-osa/vars/main.yml
deploy/adapters/ansible/roles/post-openstack/tasks/main.yml
deploy/ansible_plugins/lookup/yamlfile.py [new file with mode: 0644]
deploy/compass_conf/templates/ansible_installer/openstack_pike/ansible_cfg/HA-ansible-multinodes.tmpl

index 74d930e..5f4f2fb 100755 (executable)
   copy:
     src: redhat-7.yml
     dest: /etc/ansible/roles/os_tacker/vars/redhat-7.yml
+
+- include: set_openstack_release.yml
diff --git a/deploy/adapters/ansible/roles/config-osa/tasks/set_openstack_release.yml b/deploy/adapters/ansible/roles/config-osa/tasks/set_openstack_release.yml
new file mode 100644 (file)
index 0000000..c886eab
--- /dev/null
@@ -0,0 +1,15 @@
+############################################################################
+# 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
+##############################################################################
+---
+- name: set openstack release
+  lineinfile:
+    dest: "{{ run_dir }}/group_vars/all"
+    line: "openstack_release: {{ openstack_release }}"
+
+- meta: refresh_inventory
index 0b3b0c1..65f67c1 100644 (file)
@@ -11,3 +11,6 @@ LOCAL_REPOSITORY_IP: "192.168.137.222"
 ceph_host: "{{ hostvars[inventory_hostname]['groups']['ceph_osd'][0] }}"
 repo_dest_path: "/var/www/repo/os-releases/15.1.4/ubuntu-16.04-x86_64/"
 networking_sfc_version: 4.0.0
+# yamllint disable rule:line-length
+openstack_release: "{{ lookup('yamlfile', '/opt/openstack-ansible/group_vars/all/all.yml key=openstack_release') }}"
+# yamllint enable rule:line-length
index fb0dc67..d558239 100644 (file)
     flat: "yes"
   when:
     - inventory_hostname == groups['network_hosts'][0]
+
+# yamllint disable rule:line-length
+- name: fix horizon upload image issue
+  lineinfile:
+    dest: "/openstack/venvs/horizon-{{ openstack_release }}/lib/python2.7/site-packages/openstack_dashboard/local/local_settings.py"
+    regexp: "^HORIZON_IMAGES_UPLOAD_MODE"
+    line: "HORIZON_IMAGES_UPLOAD_MODE = 'legacy'"
+  when:
+    - inventory_hostname in groups['dashboard_containers']
+# yamllint enable rule:line-length
+
+- name: restart apache2
+  service:
+    name: apache2
+    state: restarted
+  when:
+    - inventory_hostname in groups['dashboard_containers']
diff --git a/deploy/ansible_plugins/lookup/yamlfile.py b/deploy/ansible_plugins/lookup/yamlfile.py
new file mode 100644 (file)
index 0000000..c915adc
--- /dev/null
@@ -0,0 +1,55 @@
+#!/bin/venv python
+
+import yaml
+import sys
+
+compass_bin = "/opt/compass/bin"
+sys.path.append(compass_bin)
+import switch_virtualenv  # noqa: F401
+
+from ansible.errors import AnsibleError  # noqa: E402
+from ansible.plugins.lookup import LookupBase  # noqa: E402
+
+
+class LookupModule(LookupBase):
+
+    def read_yaml(self, yaml_path, key, default=None):
+        if not key:
+            return None
+
+        with open(yaml_path) as fd:
+            yaml_data = yaml.safe_load(fd)
+
+        if key in yaml_data:
+            return yaml_data[key]
+        else:
+            return default
+
+    def run(self, terms, variables=None, **kwargs):
+        res = []
+        if not isinstance(terms, list):
+            terms = [terms]
+
+        for term in terms:
+            params = term.split()
+            yaml_path = params[0]
+
+            param_dict = {
+                'key': None,
+                'default': None
+            }
+
+            try:
+                for param in params[1:]:
+                    key, value = param.split('=')
+                    assert(key in param_dict)
+                    param_dict[key] = value
+            except (AttributeError, AssertionError), e:
+                raise AnsibleError(e)
+
+            data = self.read_yaml(yaml_path,
+                                  param_dict['key'],
+                                  param_dict['default'])
+            res.append(data)
+
+        return res
index 1d0d647..6fdb6b1 100755 (executable)
@@ -4,6 +4,7 @@ log_path = /var/ansible/run/openstack_pike-$cluster_name/ansible.log
 host_key_checking = False
 callback_whitelist = playbook_done, status_callback
 callback_plugins = /opt/ansible_plugins/callback
+lookup_plugins = /opt/ansible_plugins/lookup
 forks=100
 
 [ssh_connection]