def init_dev_from_xml_config(db,tree,clear_servers): """ Loop over xml config and initialize devices """ registered_servers= [] ## Traverse the XML document for cs_node in tree.iter('ControlSystem'): ## Get domain name domain_name_node = cs_node.find('./domain_name') if domain_name_node is None : errMsg= "Cannot find 'domain_name' in configuration file (missing?)!" #logging.error(errMsg) raise Exception(errMsg) domain_name_node.text = domain_name_node.text.strip() if domain_name_node.tail is not None : domain_name_node.tail = domain_name_node.tail.strip() domain_name= domain_name_node.text if domain_name is '' : errMsg= "Empty domain name found in config file (check config)!" #logging.error(errMsg) raise Exception(errMsg) #logging.info("Domain name: %s",str(domain_name)) ## Get host name host_name_node = cs_node.find('./host_name') if host_name_node is None : errMsg= "Cannot find 'host_name' in configuration file (missing?)!" #logging.error(errMsg) raise Exception(errMsg) host_name_node.text = host_name_node.text.strip() if host_name_node.tail is not None : host_name_node.tail = host_name_node.tail.strip() host_name= host_name_node.text if host_name is '' : errMsg= "Empty host name found in config file (check config)!" #logging.error(errMsg) raise Exception(errMsg) logging.info("Host name: %s",str(host_name)) ## Get device servers servers_node= cs_node.find('./device_servers') if servers_node is None : errMsg= "Cannot find 'device_servers' in configuration file (missing?)!" #logging.error(errMsg) raise Exception(errMsg) ## Iterate over device servers found for server_node in servers_node.iter('server'): ## Get server name & instance if 'name' not in server_node.attrib or 'instance' not in server_node.attrib: errMsg= "Cannot find 'name' and/or 'instance' attr in server element!" #logging.error(errMsg) raise Exception(errMsg) server_name= server_node.attrib.get('name').strip() server_id= server_node.attrib.get('instance').strip() server_full_name= server_name + "/" + server_id server_info= ServerInfo(server_name,server_id) ## Get server info (optional) if 'startup_level' in server_node.attrib : startup_level= server_node.attrib.get('startup_level') else : startup_level= 1 if 'astor_controlled' in server_node.attrib : astor_controlled= server_node.attrib.get('astor_controlled') else : astor_controlled= 0 #logging.debug("Server info: Host=%s, StartupLevel=%d, AstorControlled=%s",str(host_name),str(startup_level),str(astor_controlled)) ## Check if server is already present if has_server(db,server_full_name): #logging.info('Server %s is already present in TangoDB',server_full_name) if clear_servers: #logging.info('Deleting server %s from TangoDB',server_full_name) try: db.delete_server(server_full_name) except PyTango.DevFailed as df: #logging.error("Failed to delete server %s from DB!",server_full_name) raise #logging.info("Configuring device server %s [instance %s]",server_name,server_id) ## Iterate over classes for class_node in server_node.iter('class'): ## Get class name if 'name' not in class_node.attrib : errMsg= "Cannot find 'name' attr in class element!" #logging.error(errMsg) raise Exception(errMsg) class_name= class_node.attrib.get('name').strip() ## Iterate over devices for device_node in class_node.iter('device'): ## Get device domain name (if not present use main domain property) if 'domain' not in device_node.attrib : #logging.debug("No 'domain' attr present in class element, using main domain name property...") device_domain= domain_name else : device_domain= device_node.attrib.get('domain').strip() ## Get device name if 'name' not in device_node.attrib : errMsg= "Cannot find 'name' attr in class element!" #logging.error(errMsg) raise Exception(errMsg) device_name= device_node.attrib.get('name').strip() ## Get device family name if 'family' not in device_node.attrib : errMsg= "Cannot find 'family' attr in class element!" #logging.error(errMsg) raise Exception(errMsg) device_family= device_node.attrib.get('family').strip() ## Get device alias if 'alias' in device_node.attrib and device_node.attrib.get('alias') is not '': has_device_alias= True device_alias= device_node.attrib.get('alias').strip() else : has_device_alias= False device_alias= '' device_full_name= device_domain + str('/') + device_family + str('/') + device_name server_info.add_device(device_full_name) #logging.info("Registering device server %s [instance %s, class %s]: device_full_name=%s [alias=%s]",server_name,server_id,class_name,device_full_name,device_alias) ## Check if device is already registered in DB hasDevice= has_device(db,server_full_name,class_name,device_full_name) try: register_device(db,server_full_name,class_name,device_full_name,device_alias) except PyTango.DevFailed as df: errMsg= "Failed to registed device " + device_full_name + " in DB (err=" + str(df) + ")" raise Exception(errMsg) ## Configure device properties try: configure_device_properties(db,device_node,device_full_name) except: raise ## Get device configuration node #device_configuration_node= device_node.find('./DeviceConfiguration') #if device_configuration_node is None : # errMsg= "Cannot find 'DeviceConfiguration' node in configuration file (missing?)!" # raise Exception(errMsg) ## Get device properties #device_properties_node= device_configuration_node.find('./DeviceProperties') #if device_properties_node is None : # continue ## Iterate over device properties and create dictionary #device_properties = [] #device_property_dict = {} #for dev_prop_node in device_properties_node.findall('DeviceProperty') : ## Get prop name #if 'name' not in dev_prop_node.attrib : #errMsg= "Cannot find 'name' attr in device_property element!" #logging.error(errMsg) #raise Exception(errMsg) #dev_prop_name= dev_prop_node.attrib.get('name').strip() ## Get prop value(s) #device_property_dict = {} #device_property_dict['name']= dev_prop_name #nvalues= len(dev_prop_node.xpath(".//Value")) #if nvalues==1 : #dev_prop_value_node= dev_prop_node.find('./Value') #dev_prop_value_node.text = dev_prop_value_node.text.strip() #if dev_prop_value_node.tail is not None : #dev_prop_value_node.tail = dev_prop_value_node.tail.strip() #dev_prop_value= dev_prop_value_node.text #device_prop_values= dev_prop_value #else : #device_prop_values= [] #for dev_prop_value_node in dev_prop_node.findall('./Value') : #dev_prop_value_node.text = dev_prop_value_node.text.strip() #if dev_prop_value_node.tail is not None : #dev_prop_value_node.tail = dev_prop_value_node.tail.strip() #dev_prop_value= dev_prop_value_node.text #device_prop_values.append(dev_prop_value) #logging.info("Processing dev prop %s : value %s",dev_prop_name,str(dev_prop_value)) #if not device_prop_values : #errMsg= "Empty list of property values!" #logging.error(errMsg) #raise Exception(errMsg) ## Fill dev prop value key #device_property_dict['value']= device_prop_values ## Append dictionary to list #device_properties.append(device_property_dict) #print(device_property_dict) ## End loop device properties #print(device_properties) #if device_properties : #if init_device_properties(db,device_full_name,convert(device_properties)) != 0 : #errMsg= "Failed to initialize dev properties of device " + device_full_name + "!" #logging.error(errMsg) #raise Exception(errMsg) #else : #errMsg= "Empty device property list detected, check!" #logging.warn(errMsg) #raise Exception(errMsg) ## Put server info in DB (startup level, etc) serv_info= PyTango.DbServerInfo() serv_info.name= str(server_full_name) serv_info.host= str(host_name) serv_info.mode= int(astor_controlled=='true') serv_info.level= int(startup_level) try : db.put_server_info(serv_info) except PyTango.DevFailed as df: print(str(df)) errMsg= "Failed to put server info in TangoDB (TangoDB off or invalid syntax?)!" #logging.error(errMsg) raise Exception(errMsg) ## If registration is completed with success add server_info to list registered_servers.append(server_info) #logging.info("End config file processing") return registered_servers
def init_dev_from_xml_config(tree,clear_servers): """ Loop over xml config and initialize devices """ registered_servers= [] ## Initialize TangoDB try : db= PyTango.Database() except PyTango.DevFailed as df: print(str(df)) errMsg= "Failed to get access to TangoDB (did you forget to start Tango?)!" logging.error(errMsg) #return 1 raise Exception(errMsg) ## Traverse the XML document for cs_node in tree.iter('ControlSystem'): ## Get domain name domain_name_node = cs_node.find('./domain_name') if domain_name_node is None : errMsg= "Cannot find 'domain_name' in configuration file (missing?)!" logging.error(errMsg) #return 1 raise Exception(errMsg) domain_name_node.text = domain_name_node.text.strip() if domain_name_node.tail is not None : domain_name_node.tail = domain_name_node.tail.strip() domain_name= domain_name_node.text if domain_name is '' : errMsg= "Empty domain name found in config file (check config)!" logging.error(errMsg) #return 1 raise Exception(errMsg) logging.info("Domain name: %s",str(domain_name)) ## Get host name host_name_node = cs_node.find('./host_name') if host_name_node is None : errMsg= "Cannot find 'host_name' in configuration file (missing?)!" logging.error(errMsg) #return 1 raise Exception(errMsg) host_name_node.text = host_name_node.text.strip() if host_name_node.tail is not None : host_name_node.tail = host_name_node.tail.strip() host_name= host_name_node.text if host_name is '' : errMsg= "Empty host name found in config file (check config)!" logging.error(errMsg) #return 1 raise Exception(errMsg) logging.info("Host name: %s",str(host_name)) ## Get device servers servers_node= cs_node.find('./device_servers') if servers_node is None : errMsg= "Cannot find 'device_servers' in configuration file (missing?)!" logging.error(errMsg) raise Exception(errMsg) #return 1 ## Iterate over device servers found for server_node in servers_node.iter('server'): ## Get server name & instance if 'name' not in server_node.attrib or 'instance' not in server_node.attrib: errMsg= "Cannot find 'name' and/or 'instance' attr in server element!" logging.error(errMsg) raise Exception(errMsg) #return 1 server_name= server_node.attrib.get('name').strip() server_id= server_node.attrib.get('instance').strip() server_full_name= server_name + "/" + server_id server_info= ServerInfo(server_name,server_id) ## Get server info (optional) if 'startup_level' in server_node.attrib : startup_level= server_node.attrib.get('startup_level') else : startup_level= 1 if 'astor_controlled' in server_node.attrib : astor_controlled= server_node.attrib.get('astor_controlled') else : astor_controlled= 0 logging.debug("Server info: Host=%s, StartupLevel=%d, AstorControlled=%s",str(host_name),str(startup_level),str(astor_controlled)) ## Check if server is already present if has_server(db,server_full_name): logging.info('Server %s is already present in TangoDB',server_full_name) if clear_servers: logging.info('Deleting server %s from TangoDB',server_full_name) try: db.delete_server(server_full_name) except PyTango.DevFailed as df: #print(str(df)) logging.error("Failed to delete server %s from DB!",server_full_name) #return 1 raise logging.info("Configuring device server %s [instance %s]",server_name,server_id) ## Iterate over classes for class_node in server_node.iter('class'): ## Get class name if 'name' not in class_node.attrib : errMsg= "Cannot find 'name' attr in class element!" logging.error(errMsg) #return 1 raise Exception(errMsg) class_name= class_node.attrib.get('name').strip() ## Iterate over devices for device_node in class_node.iter('device'): ## Get device domain name (if not present use main domain property) if 'domain' not in device_node.attrib : logging.debug("No 'domain' attr present in class element, using main domain name property...") device_domain= domain_name else : device_domain= device_node.attrib.get('domain').strip() ## Get device name if 'name' not in device_node.attrib : errMsg= "Cannot find 'name' attr in class element!" logging.error(errMsg) #return 1 raise Exception(errMsg) device_name= device_node.attrib.get('name').strip() ## Get device family name if 'family' not in device_node.attrib : errMsg= "Cannot find 'family' attr in class element!" logging.error(errMsg) #return 1 raise Exception(errMsg) device_family= device_node.attrib.get('family').strip() ## Get device alias if 'alias' in device_node.attrib and device_node.attrib.get('alias') is not '': has_device_alias= True device_alias= device_node.attrib.get('alias').strip() else : has_device_alias= False device_alias= '' device_full_name= device_domain + str('/') + device_family + str('/') + device_name server_info.add_device(device_full_name) logging.info("Registering device server %s [instance %s, class %s]: device_full_name=%s [alias=%s]",server_name,server_id,class_name,device_full_name,device_alias) ## Check if device is already registered in DB hasDevice= has_device(db,server_full_name,class_name,device_full_name) if hasDevice : logging.info("Device %s is already registered in DB...",device_full_name) ## db.delete_device(device_full_name) else : logging.info("Device %s is not present in DB, registering it...",device_full_name) if register_device(db,server_full_name,class_name,device_full_name,device_alias) != 0 : errMsg= "Failed to registed device " + device_full_name + " in DB!" logging.error(errMsg) #return 1 raise Exception(errMsg) ## Get device configuration node device_configuration_node= device_node.find('./DeviceConfiguration') if device_configuration_node is None : errMsg= "Cannot find 'DeviceConfiguration' node in configuration file (missing?)!" logging.error(errMsg) #return 1 raise Exception(errMsg) ## Get device properties device_properties_node= device_configuration_node.find('./DeviceProperties') if device_properties_node is None : logging.warn("Cannot find 'DeviceProperties' node in configuration file...nothing to be configured!") #return 0 continue ## Iterate over device properties and create dictionary device_properties = [] #device_property_dict = {} for dev_prop_node in device_properties_node.findall('DeviceProperty') : ## Get prop name if 'name' not in dev_prop_node.attrib : errMsg= "Cannot find 'name' attr in device_property element!" logging.error(errMsg) #return 1 raise Exception(errMsg) dev_prop_name= dev_prop_node.attrib.get('name').strip() ## Get prop value(s) device_property_dict = {} device_property_dict['name']= dev_prop_name nvalues= len(dev_prop_node.xpath(".//Value")) if nvalues==1 : dev_prop_value_node= dev_prop_node.find('./Value') dev_prop_value_node.text = dev_prop_value_node.text.strip() if dev_prop_value_node.tail is not None : dev_prop_value_node.tail = dev_prop_value_node.tail.strip() dev_prop_value= dev_prop_value_node.text device_prop_values= dev_prop_value else : device_prop_values= [] for dev_prop_value_node in dev_prop_node.findall('./Value') : dev_prop_value_node.text = dev_prop_value_node.text.strip() if dev_prop_value_node.tail is not None : dev_prop_value_node.tail = dev_prop_value_node.tail.strip() dev_prop_value= dev_prop_value_node.text device_prop_values.append(dev_prop_value) logging.info("Processing dev prop %s : value %s",dev_prop_name,str(dev_prop_value)) #if dev_prop_name in device_property_dict: # append the new number to the existing array at this slot #device_property_dict[dev_prop_name].append(dev_prop_value) # device_prop_values.append(dev_prop_value) #else: # if nvalues == 1: # logging.info("Single dev prop value") #device_property_dict[dev_prop_name] = dev_prop_value # device_prop_values= dev_prop_value # else : # create a new array in this slot #device_property_dict[dev_prop_name] = [dev_prop_value] # device_prop_values.append(dev_prop_value) if not device_prop_values : errMsg= "Empty list of property values!" logging.error(errMsg) #return 1 raise Exception(errMsg) ## Fill dev prop value key device_property_dict['value']= device_prop_values ## Append dictionary to list device_properties.append(device_property_dict) print(device_property_dict) ## End loop device properties print(device_properties) if device_properties : if init_device_properties(db,device_full_name,convert(device_properties)) != 0 : errMsg= "Failed to initialize dev properties of device " + device_full_name + "!" logging.error(errMsg) #return 1 raise Exception(errMsg) else : errMsg= "Empty device property list detected, check!" logging.warn(errMsg) #return 1 raise Exception(errMsg) ## Put server info in DB (startup level, etc) serv_info= PyTango.DbServerInfo() serv_info.name= str(server_full_name) serv_info.host= str(host_name) serv_info.mode= int(astor_controlled=='true') serv_info.level= int(startup_level) try : db.put_server_info(serv_info) except PyTango.DevFailed as df: print(str(df)) errMsg= "Failed to put server info in TangoDB (TangoDB off or invalid syntax?)!" logging.error(errMsg) #return 1 raise Exception(errMsg) ## If registration is completed with success add server_info to list registered_servers.append(server_info) ## Start the server process #logging.info("Starting server %s process...",server_name) #server_verbosity= 1 #[start_status,pe]= start_server_process(db,server_name,server_id,server_verbosity) #if start_status != 0 : # logging.error("Failed to start server %s ",server_name) #server_threads.append(pe.t) ## Wait until device server has completed startup (e.g. they should be in ON State) #final_state= tango._tango.DevState.ON #startup_timeout= 10 # in seconds #sleep_time= 2 # in seconds #startup_reached_status= wait_server_startup(db,server_full_name,final_state,startup_timeout,sleep_time) #if startup_reached_status !=0 : # logging.error("Server %s did not startup within the assumed timeout!",server_full_name) ## Joining device server thread? logging.info("End config file processing") #return 0 return registered_servers