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
Exemple #2
0
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