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
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