Parse set speed event groups

Adds the groups for a set speed event for each zone listed within the
event. The groups are for maintaining a cached property value.

Change-Id: I2de9cf62215f9861e8ea2e6807df11e6a04638fb
Signed-off-by: Matthew Barth <msbarth@us.ibm.com>
diff --git a/configure.ac b/configure.ac
index e698150..4958bc2 100644
--- a/configure.ac
+++ b/configure.ac
@@ -96,6 +96,12 @@
        AC_DEFINE_UNQUOTED([FAN_ZONE_YAML_FILE], ["$FAN_ZONE_YAML_FILE"],
                           [The fan zone definition file to use])
 
+      AC_ARG_VAR(ZONE_EVENTS_YAML_FILE,
+                 [The zone events definition file to use])
+      AS_IF([test "x$ZONE_EVENTS_YAML_FILE" != "x"], [
+          AC_SUBST([ZONE_EVENTS_ARG], ["-e ${ZONE_EVENTS_YAML_FILE}"])
+      ])
+
        AC_ARG_VAR(FAN_ZONE_OUTPUT_DIR,
                   [The output directory for the generated fan zone data file])
        AS_IF([test "x$FAN_ZONE_OUTPUT_DIR" == "x"],
@@ -107,6 +113,7 @@
                 [$PYTHON ${srcdir}/control/gen-fan-zone-defs.py \
                          -f $FAN_DEF_YAML_FILE \
                          -z $FAN_ZONE_YAML_FILE \
+                         $ZONE_EVENTS_ARG \
                          -o $FAN_ZONE_OUTPUT_DIR])
        AC_CONFIG_FILES([control/Makefile])
 ])
diff --git a/control/gen-fan-zone-defs.py b/control/gen-fan-zone-defs.py
index 04f206f..221b322 100755
--- a/control/gen-fan-zone-defs.py
+++ b/control/gen-fan-zone-defs.py
@@ -37,6 +37,20 @@
                                          }
                                      },
                                      %endfor
+                                 },
+                                 std::vector<SetSpeedEvent>{
+                                 %for event in zone['events']:
+                                    SetSpeedEvent{
+                                        Group{
+                                        %for member in event['group']:
+                                        {
+                                            "${member['name']}",
+                                            {"${member['interface']}",
+                                             "${member['property']}"}
+                                        },
+                                        %endfor
+                                    },
+                                 %endfor
                                  }
                   },
               %endfor
@@ -47,6 +61,37 @@
 '''
 
 
+def getEventsInZone(zone_num, events_data):
+    """
+    Constructs the event entries defined for each zone using the events yaml
+    provided.
+    """
+    events = []
+    if 'events' in events_data:
+        for e in events_data['events']:
+            for z in e['zone_conditions']:
+                if zone_num not in z['zones']:
+                    continue
+
+            event = {}
+            # Add set speed event group
+            group = []
+            groups = next(g for g in events_data['groups']
+                          if g['name'] == e['group'])
+            for member in groups['members']:
+                members = {}
+                members['name'] = ("/xyz/openbmc_project/" +
+                                   groups['type'] +
+                                   member)
+                members['interface'] = e['interface']
+                members['property'] = e['property']['name']
+                group.append(members)
+            event['group'] = group
+            events.append(event)
+
+    return events
+
+
 def getFansInZone(zone_num, profiles, fan_data):
     """
     Parses the fan definition YAML files to find the fans
@@ -78,7 +123,7 @@
     return fans
 
 
-def buildZoneData(zone_data, fan_data):
+def buildZoneData(zone_data, fan_data, events_data):
     """
     Combines the zone definition YAML and fan
     definition YAML to create a data structure defining
@@ -115,11 +160,13 @@
                 profiles = z['cooling_profiles']
 
             fans = getFansInZone(z['zone'], profiles, fan_data)
+            events = getEventsInZone(z['zone'], events_data)
 
             if len(fans) == 0:
                 sys.exit("Didn't find any fans in zone " + str(zone['num']))
 
             zone['fans'] = fans
+            zone['events'] = events
             zones.append(zone)
 
         zone_group['zones'] = zones
@@ -138,6 +185,8 @@
     parser.add_argument('-f', '--fan_yaml', dest='fan_yaml',
                         default="example/fans.yaml",
                         help='fan definitional yaml')
+    parser.add_argument('-e', '--events_yaml', dest='events_yaml',
+                        help='events to set speeds yaml')
     parser.add_argument('-o', '--output_dir', dest='output_dir',
                         default=".",
                         help='output directory')
@@ -153,8 +202,13 @@
     with open(args.fan_yaml, 'r') as fan_input:
         fan_data = yaml.safe_load(fan_input) or {}
 
+    events_data = {}
+    if args.events_yaml:
+        with open(args.events_yaml, 'r') as events_input:
+            events_data = yaml.safe_load(events_input) or {}
+
     zone_config = buildZoneData(zone_data.get('zone_configuration', {}),
-                                fan_data)
+                                fan_data, events_data)
 
     manager_config = zone_data.get('manager_configuration', {})