Convert JSON generations from bash to python
authorRyan Hallisey <rhallise@redhat.com>
Thu, 3 Dec 2015 18:54:30 +0000 (18:54 +0000)
committerRyan Hallisey <rhallise@redhat.com>
Thu, 17 Dec 2015 20:55:15 +0000 (20:55 +0000)
Python script in the heat template will handle JSON generation
for the containers.

Change-Id: I296fd4a4948f3f937e3a108bc926af6415b350c4

docker/compute-post.yaml
docker/generate_json_config.sh [deleted file]

index a6607fd..8f786f7 100644 (file)
@@ -1,5 +1,4 @@
-heat_template_version: 2015-04-30
-
+heat_template_version: 2015-10-15
 description: >
   OpenStack compute node post deployment for Docker.
 
@@ -26,6 +25,26 @@ parameters:
     type: string
   DockerOpenvswitchDBImage:
     type: string
+  LibvirtConfig:
+    type: string
+    default: "/etc/libvirt/libvirtd.conf"
+  NovaConfig:
+    type: string
+    default: "/etc/nova/nova.conf"
+  NeutronOpenvswitchAgentConfig:
+    type: string
+    default: "/etc/neutron/neutron.conf,/etc/neutron/plugins/ml2/ml2_conf.ini"
+  NeutronAgentConfig:
+    type: string
+    default: "/etc/neutron/neutron.conf,/etc/neutron/plugins/openvswitch/ovs_neutron_plugin.ini"
+  NeutronAgentPluginVolume:
+    type: string
+    description: The neutron agent plugin to mount into the neutron-agents container
+    default: "/var/lib/etc-data/neutron/plugins/ml2/openvswitch_agent.ini:/var/lib/kolla/config_files/ovs_neutron_plugin.ini:ro"
+  NeutronAgentOvsVolume:
+    type: string
+    description: The neutron agent ovs agents to mount into the neutron-agents container
+    default: " "
 
 resources:
 
@@ -74,9 +93,70 @@ resources:
     type: OS::Heat::SoftwareConfig
     properties:
       group: script
-      outputs:
-      - name: result
-      config: {get_file: ./generate_json_config.sh}
+      inputs:
+      - name: libvirt_config
+      - name: nova_config
+      - name: neutron_openvswitch_agent_config
+      - name: neutron_agent_config
+      config: |
+        #!/bin/python
+        import json
+        import os
+
+        data = {}
+        file_perms = '600'
+        libvirt_perms = '644'
+
+        libvirt_config = os.getenv('libvirt_config').split(',')
+        nova_config = os.getenv('nova_config').split(',')
+        neutron_openvswitch_agent_config = os.getenv('neutron_openvswitch_agent_config').split(',')
+        neutron_agent_config = os.getenv('neutron_agent_config').split(',')
+
+        # Command, Config_files, Owner, Perms
+        services = {'nova-libvirt': ['/usr/sbin/libvirtd', libvirt_config, 'root', libvirt_perms],
+                    'nova-compute': ['/usr/bin/nova-compute', nova_config, 'nova', file_perms],
+                    'neutron-openvswitch-agent': ['/usr/bin/neutron-openvswitch-agent', neutron_openvswitch_agent_config, 'neutron', file_perms],
+                    'neutron-agent': ['/usr/bin/neutron-openvswitch-agent', neutron_agent_config, 'neutron', file_perms],
+                    'ovs-vswitchd': ['/usr/sbin/ovs-vswitchd unix:/run/openvswitch/db.sock -vconsole:emer -vsyslog:err -vfile:info --mlockall --log-file=/var/log/openvswitch/ovs-vswitchd.log'],
+                    'ovsdb-server': ['/usr/sbin/ovsdb-server /etc/openvswitch/conf.db -vconsole:emer -vsyslog:err -vfile:info --remote=punix:/run/openvswitch/db.sock --log-file=/var/log/openvswitch/ovsdb-server.log']
+                   }
+
+
+        def build_config_files(config, owner, perms):
+            config_source = '/var/lib/kolla/config_files/'
+            config_files_dict = {}
+            source = os.path.basename(config)
+            dest = config
+            config_files_dict.update({'source': config_source + source,
+                                      'dest': dest,
+                                      'owner': owner,
+                                      'perm': perms})
+            return config_files_dict
+
+
+        for service in services:
+            if service != 'ovs-vswitchd' and service != 'ovsdb-server':
+                command = services.get(service)[0]
+                config_files = services.get(service)[1]
+                owner = services.get(service)[2]
+                perms = services.get(service)[3]
+                config_files_list = []
+                for config_file in config_files:
+                    if service == 'nova-libvirt':
+                        command = command + ' --config ' + config_file
+                    else:
+                        command = command + ' --config-file ' + config_file
+                    data['command'] = command
+                    config_files_dict = build_config_files(config_file, owner, perms)
+                    config_files_list.append(config_files_dict)
+                data['config_files'] = config_files_list
+            else:
+                data['command'] = services.get(service)[0]
+                data['config_files'] = []
+
+            json_config_dir = '/var/lib/etc-data/json-config/'
+            with open(json_config_dir + service + '.json', 'w') as json_file:
+                json.dump(data, json_file, sort_keys=True, indent=4, separators=(',', ': '))
 
   CopyJsonDeployment:
     type: OS::Heat::SoftwareDeployments
@@ -84,6 +164,11 @@ resources:
     properties:
       config: {get_resource: CopyJsonConfig}
       servers:  {get_param: servers}
+      input_values:
+        libvirt_config: {get_param: LibvirtConfig}
+        nova_config: {get_param: NovaConfig}
+        neutron_openvswitch_agent_config: {get_param: NeutronOpenvswitchAgentConfig}
+        neutron_agent_config: {get_param: NeutronAgentConfig}
 
   NovaComputeContainersDeploymentOVS:
     type: OS::Heat::StructuredDeployments
@@ -118,12 +203,12 @@ resources:
             list_join:
             - '/'
             - [ {get_param: DockerNamespace}, {get_param: DockerOpenvswitchDBImage} ]
-          container_name: ovs-db-server
+          container_name: ovsdb-server
           net: host
           restart: always
           volumes:
            - /run:/run
-           - /var/lib/etc-data/json-config/ovs-dbserver.json:/var/lib/kolla/config_files/config.json
+           - /var/lib/etc-data/json-config/ovsdb-server.json:/var/lib/kolla/config_files/config.json
           environment:
            - KOLLA_CONFIG_STRATEGY=COPY_ALWAYS
 
@@ -234,11 +319,15 @@ resources:
           privileged: true
           restart: always
           volumes:
-           - /run:/run
-           - /lib/modules:/lib/modules:ro
-           - /var/lib/etc-data/json-config/neutron-agent.json:/var/lib/kolla/config_files/config.json
-           - /var/lib/etc-data/neutron/plugins/ml2/openvswitch_agent.ini:/var/lib/kolla/config_files/ovs_neutron_plugin.ini:ro
-           - /var/lib/etc-data/neutron/neutron.conf:/var/lib/kolla/config_files/neutron.conf:ro
+            str_split:
+              - ","
+              - list_join:
+                 - ","
+                 - [ "/run:/run", "/lib/modules:/lib/modules:ro",
+                     "/var/lib/etc-data/json-config/neutron-agent.json:/var/lib/kolla/config_files/config.json",
+                     "/var/lib/etc-data/neutron/neutron.conf:/var/lib/kolla/config_files/neutron.conf:ro",
+                     {get_param: NeutronAgentPluginVolume},
+                     {get_param: NeutronAgentOvsVolume} ]
           environment:
            - KOLLA_CONFIG_STRATEGY=COPY_ALWAYS
           volumes_from:
diff --git a/docker/generate_json_config.sh b/docker/generate_json_config.sh
deleted file mode 100644 (file)
index 5cf4922..0000000
+++ /dev/null
@@ -1,96 +0,0 @@
-#!/bin/bash
-
-KOLLA_DEST=/var/lib/kolla/config_files
-JSON_DEST=/var/lib/etc-data/json-config
-
-# For more config file generation, simply define a new SERVICE_DATA_
-# prefixed variable. The command string is quoted to include config-file
-# arguments. Note that the variable name following SERVICE_DATA_ will be
-# the filename the JSON config is written to.
-
-# [EXAMPLE]: SERVICE_DATA_<SERVICE_NAME>=(<command> <source> <dest> <owner> <perms>)
-
-SERVICE_DATA_NOVA_LIBVIRT=("/usr/sbin/libvirtd" libvirtd.conf /etc/libvirt/libvirtd.conf root 0644)
-SERVICE_DATA_NOVA_COMPUTE=("/usr/bin/nova-compute" nova.conf /etc/nova/nova.conf nova 0600)
-SERVICE_DATA_NEUTRON_OPENVSWITCH_AGENT=("/usr/bin/neutron-openvswitch-agent --config-file /etc/neutron/neutron.conf --config-file /etc/neutron/plugins/ml2/ml2_conf.ini" neutron.conf /etc/neutron/neutron.conf neutron 0600 ml2_conf.ini /etc/neutron/plugins/ml2/ml2_conf.ini neutron 0600)
-SERVICE_DATA_NEUTRON_AGENT=("/usr/bin/neutron-openvswitch-agent --config-file /usr/share/neutron/neutron-dist.conf --config-file /etc/neutron/neutron.conf --config-file /etc/neutron/plugins/openvswitch/ovs_neutron_plugin.ini" neutron.conf /etc/neutron/neutron.conf neutron 0600 ovs_neutron_plugin.ini /etc/neutron/plugins/openvswitch/ovs_neutron_plugin.ini neutron 0600)
-SERVICE_DATA_OVS_VSWITCHD=("/usr/sbin/ovs-vswitchd unix:/run/openvswitch/db.sock -vconsole:emer -vsyslog:err -vfile:info --mlockall --log-file=/var/log/openvswitch/ovs-vswitchd.log")
-SERVICE_DATA_OVS_DBSERVER=("/usr/sbin/ovsdb-server /etc/openvswitch/conf.db -vconsole:emer -vsyslog:err -vfile:info --remote=punix:/run/openvswitch/db.sock --log-file=/var/log/openvswitch/ovsdb-server.log")
-
-function create_json_header() {
-    local command=$1
-
-    echo "\
-{
-    \"command\": \"${command[@]}\","
-
-}
-
-function create_config_file_header() {
-    echo "    \"config_files\": ["
-}
-
-function create_config_file_block() {
-    local source=$KOLLA_DEST/$1
-    local dest=$2
-    local owner=$3
-    local perm=$4
-
-    printf "\
-\t{
-\t    \"source\": \"$source\",
-\t    \"dest\": \"$dest\",
-\t    \"owner\": \"$owner\",
-\t    \"perm\": \"$perm\"
-\t}"
-}
-
-function add_trailing_comma() {
-    printf ", \n"
-}
-
-function create_config_file_trailer() {
-    echo -e "\n    ]"
-}
-
-function create_json_trailer() {
-    echo "}"
-}
-
-function create_json_data() {
-    local config_data=$1
-    shift
-
-    create_json_header "$config_data"
-    create_config_file_header
-    while [ "$1" ]; do
-        create_config_file_block "$@"
-        shift 4
-        if [ "$1" ]; then
-            add_trailing_comma
-        fi
-    done
-    create_config_file_trailer
-    create_json_trailer
-}
-
-function write_json_data() {
-
-    local name=$1[@]
-    local service_data=("${!name}")
-
-    local service_name=${1#SERVICE_DATA_} # chop SERVICE_DATA_ prefix
-    service_name=${service_name//_/-}     # switch underscore to dash
-    service_name=${service_name,,}        # change to lowercase
-
-    echo "Creating JSON file ${service_name}"
-    create_json_data "${service_data[@]}" > "$JSON_DEST/$service_name.json"
-}
-
-function process_configs() {
-    for service in ${!SERVICE_DATA_*}; do
-        write_json_data "${service}"
-    done
-}
-
-process_configs