Example #1
0
    def _get_consumes(self, component_name, components, components_by_mnemonic, cp):

        result = {}

        component = components[component_name]
        for consume in component.get('consumes-services', []):
            consume_name = "consumes_%s" % consume['service-name'].replace('-', '_')
            result[consume_name] = {}
            consumes = result[consume_name]

            if 'relationship-vars' in consume:
                consumes['vars'] = {}
                for var in consume['relationship-vars']:
                    payload = var['properties'] if 'properties' in var else None
                    value = HlmVariable.generate_value(
                        self._instructions, self._models,
                        self._controllers, var['name'], var['value'],
                        payload=payload)
                    consumes['vars'][var['name']] = value

            consumed_component_name = components_by_mnemonic[consume['service-name']]['name']
            consumed_component = components[consumed_component_name]

            consumes['name'] = consumed_component_name

            ep = self._get_endpoint(consumed_component_name, cp)

            if not ep:
                # Some consumes relationships are optional.
                if consume.get('optional', False):
                    continue

                msg = ("%s expects to consume %s, but %s "
                       "doesn't have an internal endpoint." %
                       (component_name, consumed_component_name,
                        consumed_component_name))
                self.add_error(msg)
                continue

            for role, role_data in ep.iteritems():

                # Never give a public endpoint to a consumer
                if role == 'public':
                    continue

                # CP used 'private' as the name for  internal endpoints
                # in the playbooks so we have to stick with that
                if role == 'internal':
                    role_name = 'private'
                else:
                    role_name = role

                for data in role_data:
                    if 'address' in data.get('access', {}):

                        if ('consumes-vips' in consume
                                and role not in consume['consumes-vips']):
                            continue

                        if data['access']['use-tls']:
                            protocol = component.get('tls_protocol', 'https')
                        else:
                            protocol = component.get('nontls_protocol', 'http')
                        url = "%s://%s:%s" % (protocol,
                                              data['access']['hostname'],
                                              data['access']['port'])
                        if 'vips' not in consumes:
                            consumes['vips'] = {}
                        if role_name not in consumes['vips']:
                            consumes['vips'][role_name] = []

                        consumes['vips'][role_name].append({'ip_address': data['access']['address'],
                                                            'network': data['access']['network'],
                                                            'host': data['access']['hostname'],
                                                            'port': data['access']['port'],
                                                            'protocol': protocol,
                                                            'url': url,
                                                            'use_tls': data['access']['use-tls']})
                for data in role_data:
                    if 'members' in data.get('access', {}):

                        if ('consumes-members' in consume
                                and role not in consume['consumes-members']):
                            continue

                        if 'members' not in consumes:
                            consumes['members'] = {}
                        if 'role_name' not in consumes['members']:
                            consumes['members'][role_name] = []
                        for member in data['access']['members']:
                            consumes['members'][role_name].append({'host': member['hostname'],
                                                                   'ip_address': member['ip_address'],
                                                                   'network': member['network'],
                                                                   'port': data['access']['port'],
                                                                   'use_tls': data['access']['use-tls']})

            # TODO: Remove once all playbooks have switched to using
            #      internal vips insterad of public
            # Hack needed to keep compatiblity with 1.0  playbooks
            # which consumed public endpoints
            if consumed_component.get('publish-internal-as-public', False):
                if 'vips' in consumes and 'private' in consumes['vips']:
                    consumes['vips']['public'] = \
                        deepcopy(consumes['vips']['private'])
                if 'members' in consumes and 'private' in consumes['members']:
                    consumes['members']['public'] = \
                        deepcopy(consumes['members']['private'])

        return result
Example #2
0
    def _build_service_vars(self, group_vars, cp, cp_prefix, cluster_prefix,
                            component_list, cluster_servers, components,
                            components_by_mnemonic):

        for component_name in component_list:
            if component_name in cp['components']:

                component = components[component_name]
                name = component['mnemonic'].replace('-', '_')
                group_vars[name] = {}
                component_group_vars = group_vars[name]

                # Add endpoints for this component
                if component_name in cp['advertises']:
                    vips = cp['advertises'].get(component_name, {})
                    advertises = {'vips': {}}
                    for keystone_data in ['keystone-service-name',
                                          'keystone-service-type']:
                        if keystone_data in component:
                            # NOTE(kuvaja): As Ansible does not allow '-'
                            # character in the variable names, we need to
                            # twiggle around a bit here.
                            advertises[keystone_data.replace('-', '_')] = \
                                component[keystone_data]

                    component_group_vars['advertises'] = advertises
                    for role in ['admin', 'internal', 'public']:
                        if role in vips:
                            for region in cp['region-list']:
                                vip = {'host': vips[role]['hostname'],
                                       'ip_address': vips[role]['ip_address'],
                                       'port': vips[role]['port'],
                                       'protocol': vips[role]['protocol'],
                                       'url': vips[role]['url'],
                                       'region_name': region}
                                if role == 'internal':
                                    role_name = 'private'
                                else:
                                    role_name = role

                                if role_name not in advertises['vips']:
                                    advertises['vips'][role_name] = []
                                advertises['vips'][role_name].append(vip)

                # Add the details of all components we consume
                component_group_vars.update(cp['components'][component_name].get('consumes', {}))

                # Add members if advertised.  Note that CP1.0 does this
                # on a specific network, but we just have one internal
                # endpoint for each component
                if 'advertise-member-list-on' in component:
                    member_data = cp['members'][component_name]
                    component_group_vars['members'] = {}
                    for role, ports in member_data['ports'].iteritems():

                        if role == 'internal':
                            role_name = 'private'
                        else:
                            role_name = role

                        component_group_vars['members'][role_name] = []
                        members = component_group_vars['members'][role_name]
                        for port in ports:
                            for host_data in member_data['hosts']:
                                members.append({'host': host_data['hostname'],
                                                'member_id': host_data['member_id'],
                                                'port': port})

                    # TODO: Remove once all playbooks have switched to using
                    #      internal vip for mysql and rabbit
                    # Hack needed to keep compatiblity with 1.0
                    # which declared an internal endpoint as public
                    if components[component_name].get(
                            'publish-internal-as-public', False):
                        component_group_vars['members']['public'] = \
                            deepcopy(component_group_vars['members']['private'])

                # Add details of any component we provide a proxy for
                lb_components = cp['load-balancers'].get(component_name, {})
                for lb_component_name, lb_data in lb_components.iteritems():
                    if 'has_proxy' not in component_group_vars:
                        component_group_vars['has_proxy'] = {}
                    proxied_component = components[lb_component_name]['mnemonic'].replace('-', '_')
                    component_group_vars['has_proxy'][proxied_component] = {
                        'networks': [],
                        'servers': [],
                        'initiate_tls': lb_data['host-tls'],
                        'vars': {}}
                    for host_data in lb_data['hosts']:
                        component_group_vars['has_proxy'][proxied_component]['servers'].append(
                            host_data['hostname'])

                    for net_data in lb_data['networks']:
                        proxy_data = {'ports': [net_data['vip-port']],
                                      'server_ports': [net_data['host-port']],
                                      'vip': net_data['hostname'],
                                      'ip_address': net_data['ip-address'],
                                      'terminate_tls': net_data['vip-tls']}

                        if 'vip-options' in net_data:
                            proxy_data['vip_options'] = net_data['vip-options']

                        if 'vip-check' in net_data:
                            proxy_data['vip_check'] = net_data['vip-check']

                        if 'vip-backup-mode' in net_data:
                            proxy_data['vip_backup_mode'] = net_data['vip-backup-mode']

                        if 'cert-file' in net_data:
                            proxy_data['cert_file'] = net_data['cert-file']

                        component_group_vars['has_proxy'][proxied_component]['networks'].append(proxy_data)

                # Add details of contained services
                for contains_name, contains_data in component.get('contains', {}).iteritems():
                    rel_name = "%s_has_container" % contains_data['name']
                    component_group_vars[rel_name] = {'members': {},
                                                      'vips': {}
                                                      }
                    for var in contains_data.get('relationship-vars', []):
                        if 'vars' not in component_group_vars[rel_name]:
                            component_group_vars[rel_name]['vars'] = {}
                        payload = var['properties'] if 'properties' in var else None
                        value = HlmVariable.generate_value(
                            self._instructions, self._models,
                            self._controllers, var['name'], var['value'],
                            payload=payload)
                        component_group_vars[rel_name]['vars'][var['name']] = value

                    vip_data = []
                    for net, vips in cp['vip_networks'].iteritems():
                        for vip in vips:
                            if vip['component-name'] == contains_name:
                                vip_data.append(vip)
                    for vip in vip_data:
                        for role in vip['roles']:
                            if role == 'internal':
                                role = 'private'
                            component_group_vars[rel_name]['members'][role] = []
                            component_group_vars[rel_name]['vips'][role] = []

                            for host_data in vip['hosts']:
                                component_group_vars[rel_name]['members'][role].append(
                                    {'host': host_data['hostname'],
                                     'port': vip['host-port']
                                     })

                            component_group_vars[rel_name]['vips'][role].append(
                                {'vip': vip['hostname'],
                                 'port': vip['host-port']
                                 })
                # Add Log info
                if 'produces-log-files' in component:
                    component_group_vars['produces_log_files'] = {'vars': {}}
                    component_log_info = component_group_vars['produces_log_files']

                    for log_info in component['produces-log-files']:
                        for var in log_info['relationship-vars']:
                            component_log_info['vars'][var['name']] = []
                            for val in var['value']:
                                for k, v in val.iteritems():
                                    component_log_info['vars'][var['name']].append({k: v})

                # Print out any config set - Not sure if we need this with our config
                # approach ?
                config_set = component.get('config-set', [])
                for config in config_set:
                    if 'ansible-vars' in config:
                        if 'vars' not in component_group_vars:
                            component_group_vars['vars'] = {}
                        for var in config['ansible-vars']:
                            payload = var['properties'] if 'properties' in var else None
                            value = HlmVariable.generate_value(
                                self._instructions, self._models,
                                self._controllers, var['name'], var['value'],
                                payload=payload)
                            component_group_vars['vars'][var['name']] = value