'Add zone configuration.
This method will add the zone configuration passed by user.
:param zones: Zone names mapped to members and VSANs
Zone members are colon separated but case-insensitive
.. code-block:: python
{   zonename1:[zonememeber1,zonemember2,...],
zonename2:[zonemember1, zonemember2,...]...}
e.g:
\'openstack50060b0000c26604201900051ee8e329\':
[\'50:06:0b:00:00:c2:66:04\', \'20:19:00:05:1e:e8:e3:29\']
:param activate: True will activate the zone config.
:param fabric_vsan:
:param active_zone_set: Active zone set dict retrieved from
get_active_zone_set method
:param zone_status: Status of the zone
:raises CiscoZoningCliException:'

def add_zones(self, zones, activate, fabric_vsan, active_zone_set, zone_status):

    LOG.debug('Add    Zones    -    Zones    passed:    %s', zones)
    LOG.debug('Active    zone    set:    %s', active_zone_set)
    zone_list = active_zone_set[ZoneConstant.CFG_ZONES]
    LOG.debug('zone    list:    %s', zone_list)
    LOG.debug('zone    status:    %s', zone_status)
    cfg_name = active_zone_set[ZoneConstant.ACTIVE_ZONE_CONFIG]
    zone_cmds = [['conf'], ['zoneset', 'name', cfg_name, 'vsan', fabric_vsan]]
    for zone in zones.keys():
        zone_cmds.append(['zone', 'name', zone])
        for member in zones[zone]:
            zone_cmds.append(['member', 'pwwn', member])
    zone_cmds.append(['end'])
    try:
        LOG.debug('Add    zones:    Config    cmd    to    run:    %s', zone_cmds)
        self._ssh_execute(zone_cmds, True, 1)
        if activate:
            self.activate_zoneset(cfg_name, fabric_vsan, zone_status)
        self._cfg_save()
    except Exception as e:
        msg = (_('Creating    and    activating    zone    set    failed:    (Zone    set=%(zoneset)s    error=%(err)s).') % {'zoneset': cfg_name, 'err': six.text_type(e)})
        LOG.error(msg)
        raise exception.CiscoZoningCliException(reason=msg)
