def post_callback(self, ldap, dn, entry_attrs, *keys, **options): assert isinstance(dn, DN) self.obj.get_enabled_roles(entry_attrs) if 'ipalocation_location' in options: ipalocation = entry_attrs.get('ipalocation') if ipalocation: ipalocation = ipalocation[0]['idnsname'] else: ipalocation = u'' try: self.api.Command.dnsserver_mod( keys[0], setattr=[ u'idnsSubstitutionVariable;ipalocation={loc}'.format( loc=ipalocation) ]) except errors.EmptyModlist: pass except errors.NotFound: # server is not DNS server pass if 'ipalocation_location' or 'ipaserviceweight' in options: self.add_message( messages.ServiceRestartRequired( service=services.service('named', api).systemd_name, server=keys[0], )) result = self.api.Command.dns_update_system_records() if not result.get('value'): self.add_message(messages.AutomaticDNSRecordsUpdateFailed()) self.obj.convert_location(entry_attrs, **options) ipalocation = entry_attrs.get('ipalocation_location', [None])[0] if ipalocation: servers_in_loc = self.api.Command.server_find( in_location=ipalocation, no_members=False)['result'] dns_server_in_loc = False for server in servers_in_loc: if 'DNS server' in server.get('enabled_role_servrole', ()): dns_server_in_loc = True break if not dns_server_in_loc: self.add_message( messages.LocationWithoutDNSServer(location=ipalocation)) return dn
def execute(self, *keys, **options): result = super(location_show, self).execute(*keys, **options) servers_additional_info = {} if not options.get('raw'): servers_name = [] dns_servers = [] weight_sum = 0 servers = self.api.Command.server_find(in_location=keys[0], no_members=False)['result'] for server in servers: s_name = server['cn'][0] servers_name.append(s_name) weight = int(server.get('ipaserviceweight', [100])[0]) weight_sum += weight servers_additional_info[s_name] = { 'cn': server['cn'], 'ipaserviceweight': server.get('ipaserviceweight', [u'100']), } s_roles = server.get('enabled_role_servrole', ()) if s_roles: servers_additional_info[s_name][ 'enabled_role_servrole'] = s_roles if 'DNS server' in s_roles: dns_servers.append(s_name) for server in servers_additional_info.values(): server['service_relative_weight'] = [ u'{:.1f}%'.format( int(server['ipaserviceweight'][0]) * 100.0 / weight_sum) ] if servers_name: result['result']['servers_server'] = servers_name if dns_servers: result['result']['dns_server'] = dns_servers if not dns_servers and servers_additional_info: self.add_message( messages.LocationWithoutDNSServer(location=keys[0])) result['servers'] = servers_additional_info return result
def execute(self, *keys, **options): result = super(location_show, self).execute(*keys, **options) servers_additional_info = {} if not options.get('raw'): servers_name = [] dns_servers = [] weight_sum = 0 servers = self.api.Command.server_find(in_location=keys[0], no_members=False)['result'] for server in servers: s_name = server['cn'][0] servers_name.append(s_name) weight = int(server.get('ipaserviceweight', [100])[0]) weight_sum += weight servers_additional_info[s_name] = { 'cn': server['cn'], 'ipaserviceweight': server.get('ipaserviceweight', [u'100']), } s_roles = server.get('enabled_role_servrole', ()) if s_roles: servers_additional_info[s_name][ 'enabled_role_servrole'] = s_roles if 'DNS server' in s_roles: dns_servers.append(s_name) # 1. If all masters have weight == 0 then all are equally # weighted. # 2. If any masters have weight == 0 then they have an # extremely small chance of being chosen, percentage is # 0.1. # 3. Otherwise it's percentage change is based on the sum of # the weights of non-zero masters. dividend = 100.0 if weight_sum != 0: for server in servers_additional_info.values(): if int(server['ipaserviceweight'][0]) == 0: dividend = dividend - 0.1 for server in servers_additional_info.values(): if weight_sum == 0: val = 100 / len(servers) elif int(server['ipaserviceweight'][0]) == 0: val = 0.1 else: val = (int(server['ipaserviceweight'][0]) * dividend / weight_sum) server['service_relative_weight'] = [u'{:.1f}%'.format(val)] if servers_name: result['result']['servers_server'] = servers_name if dns_servers: result['result']['dns_server'] = dns_servers if not dns_servers and servers_additional_info: self.add_message( messages.LocationWithoutDNSServer(location=keys[0])) result['servers'] = servers_additional_info return result