Change kolla_config from required to optional in pep8.
[apex-tripleo-heat-templates.git] / tools / yaml-validate.py
index 1d0dba0..5ff6f13 100755 (executable)
@@ -23,6 +23,14 @@ envs_containing_endpoint_map = ['tls-endpoints-public-dns.yaml',
                                 'tls-endpoints-public-ip.yaml',
                                 'tls-everywhere-endpoints-dns.yaml']
 ENDPOINT_MAP_FILE = 'endpoint_map.yaml'
+REQUIRED_DOCKER_SECTIONS = ['service_name', 'docker_config', 'puppet_config',
+                            'config_settings', 'step_config']
+OPTIONAL_DOCKER_SECTIONS = ['docker_puppet_tasks', 'upgrade_tasks',
+                            'service_config_settings', 'host_prep_tasks',
+                            'metadata_settings', 'kolla_config']
+DOCKER_PUPPET_CONFIG_SECTIONS = ['config_volume', 'puppet_tags', 'step_config',
+                                 'config_image']
+
 
 def exit_usage():
     print('Usage %s <yaml file or directory>' % sys.argv[0])
@@ -54,6 +62,22 @@ def validate_endpoint_map(base_map, env_map):
     return sorted(base_map.keys()) == sorted(env_map.keys())
 
 
+def validate_hci_compute_services_default(env_filename, env_tpl):
+    env_services_list = env_tpl['parameter_defaults']['ComputeServices']
+    env_services_list.remove('OS::TripleO::Services::CephOSD')
+    roles_filename = os.path.join(os.path.dirname(env_filename),
+                                  '../roles_data.yaml')
+    roles_tpl = yaml.load(open(roles_filename).read())
+    for role in roles_tpl:
+        if role['name'] == 'Compute':
+            roles_services_list = role['ServicesDefault']
+            if sorted(env_services_list) != sorted(roles_services_list):
+                print('ERROR: ComputeServices in %s is different '
+                      'from ServicesDefault in roles_data.yaml' % env_filename)
+                return 1
+    return 0
+
+
 def validate_mysql_connection(settings):
     no_op = lambda *args: False
     error_status = [0]
@@ -94,6 +118,55 @@ def validate_mysql_connection(settings):
     return error_status[0]
 
 
+def validate_docker_service(filename, tpl):
+    if 'outputs' in tpl and 'role_data' in tpl['outputs']:
+        if 'value' not in tpl['outputs']['role_data']:
+            print('ERROR: invalid role_data for filename: %s'
+                  % filename)
+            return 1
+        role_data = tpl['outputs']['role_data']['value']
+
+        for section_name in REQUIRED_DOCKER_SECTIONS:
+            if section_name not in role_data:
+                print('ERROR: %s is required in role_data for %s.'
+                      % (section_name, filename))
+                return 1
+
+        for section_name in role_data.keys():
+            if section_name in REQUIRED_DOCKER_SECTIONS:
+                continue
+            else:
+                if section_name in OPTIONAL_DOCKER_SECTIONS:
+                    continue
+                else:
+                    print('ERROR: %s is extra in role_data for %s.'
+                          % (section_name, filename))
+                    return 1
+
+        if 'puppet_config' in role_data:
+            puppet_config = role_data['puppet_config']
+            for key in puppet_config:
+                if key in DOCKER_PUPPET_CONFIG_SECTIONS:
+                    continue
+                else:
+                  print('ERROR: %s should not be in puppet_config section.'
+                        % key)
+                  return 1
+            for key in DOCKER_PUPPET_CONFIG_SECTIONS:
+              if key not in puppet_config:
+                  print('ERROR: %s is required in puppet_config for %s.'
+                        % (key, filename))
+                  return 1
+
+    if 'parameters' in tpl:
+        for param in required_params:
+            if param not in tpl['parameters']:
+                print('ERROR: parameter %s is required for %s.'
+                      % (param, filename))
+                return 1
+    return 0
+
+
 def validate_service(filename, tpl):
     if 'outputs' in tpl and 'role_data' in tpl['outputs']:
         if 'value' not in tpl['outputs']['role_data']:
@@ -143,6 +216,13 @@ def validate(filename):
                 filename != './puppet/services/services.yaml'):
             retval = validate_service(filename, tpl)
 
+        if (filename.startswith('./docker/services/') and
+                filename != './docker/services/services.yaml'):
+            retval = validate_docker_service(filename, tpl)
+
+        if filename.endswith('hyperconverged-ceph.yaml'):
+            retval = validate_hci_compute_services_default(filename, tpl)
+
     except Exception:
         print(traceback.format_exc())
         return 1